IMD 1.17: 11/11/2014 11:52:11 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 23 OF 30  SR23q82VKXSVRDOS 0420§j-*’NOTTHESAMELENGTH'MESSAGETOCONTINUETOBEPRINTED,EVEN**’WHENTHERECORDSWEREOFTHESAMELENGTH*9*’TWOADDITIONALCHECKS,ONEFORNULLINPUTANDONEFORA7*’COMMAASTHEFIRSTCHARACTEROFTHEOUTPUTFIELDWERE*’ADDED.*9*’TWOENHANCEMENTSWEREADDED.ONEALLOWSWILDCARDCOPIES8*’TOASINGLEFILE.WHENAWILDCARDISSPECIFIEDINTHE6*’INPUTFIELD,ALLOFTHEFILESMATCHINGTHATWILDCARD7*’(ORALLTHEFILESSELECTED,IFTHATOPTIONISCHOSEN)8*’WILLBECONCATENATEDINTOONE.INCOMPATIBLETYPESWILL<*’PRODUCEERRORMESSAGES.THESECONDENHANCEMENTISSIMILAR,C(B0d8`@UHWPFX<`chgpWx>€Iˆ9+˜B 6¨E°:¸5À;ÈQÐDØ=à>è<ð5ø<DQ 9*’BUTINTHISCASETHEMULTIPLEINPUTFILESARESEPARATED6*’WITHA'/'.THEFILENAMESWILLBEOUTPUTASTHEYARE *’COPIED.*4*’THEVERSIONNUMBERISNOWPRINTEDATTHEBEGINNING*4*’THECHECKFOROPTIONSISNOWDONEBEFORETHECHECK4*’FORNULLFIELDSSOTHATA'COPY;H'WILLPRODUCEA*’HELPLISTING**ˆREVISIONCODE‡0203844**7*’IFTHEREISANSPRFORTHISPROBLEMIDON'TKNOWWHAT.*’THENUMBERISBUTTHEPROBLEMISASFOLLOWS:!*’=COPYJUNK.CF,JUNK.XX,JUNK.YY;B:*’THEABOVECOMMANDLINEWOULDNOTWORKIFTHELIST/DEVICE'*’PORTIONOFTHECOMMANDLINEWASFIXED *’ITDOESNOW**ˆREVISIONCODE‡1019834*4*’SPR669fixed.‚AproblemoccurredusingCOPYX,Y;B3*’whenthedatablockofXwasgreaterthan13,the0*’defaultsizeforverify.‚Thisprogramwillnow6*’getasegmentthesizeofthedatablockasfoundin/*’theparametertableaftertheassignismade.**ˆREVISIONCODE‡1005834*6*’'V=x'ADDED,WHERExREPRESENTSTHEMAX#OFVERIFY8*’ERRORSTOBEDISPLAYED.COPYTERMINATESWITHAWARNING"*’IFANYVERIFYERRORSWEREFOUND.**ˆREVISIONCODE‡0920834*3*’CONTAINSNEW'U'OPTION,WHICHENABLESTHEUSEOF.*’THEUSERNUMBEROFTHEINPUTFORTHEOUTPUT.**ˆREVISIONCODE‡0823834*.*’CORRECTEDPROBLEMOFONLYTHE1STDIFFERENCE/*’BIENGPRINTEDPER13SECTORBUFFERINSTEADOF5*’1STDIFFERNCEPER1SECTOROFTHE13SECTORBUFFER.**’THISOCCUREDIFTHE'T'OPTIONWASUSED.**ˆREVISIONCODE‡0601834*$*’CONTAINSCODETOENABLE'C'OPTION**ˆREVISIONCODE‡0428834*+*’CONTAINSCODETODORECORDI/OFORAPPEND$*•IFFILESHAVEDIFFERENTBLOCKSIZE***ˆREVISIONCODE‡1006813* *’CONTAINSERRORMESSAGEHANDLER$*’CONTAINSPOSITIONINDEPENDENTCODE-*’CONTAINSCURRENTREVISIONCODEMODIFICATION5*’CONTAINSTERMINATIONLOGICFORUSEWITHCHAINFILES1*’CONTAINSCOMMONSUBROUTINESPULLEDFROMLIBRARY*’USESTHE'SBARG'ROUTINE3*’CONTAINSTHEADDEDCHARACTERSPACEFOR'SBARG'TO*œPLACEA'CR'"*’CONTAINSNEW'T'AND'P'OPTIONS$*’WILLAPPENDTOANON-EXISTENTFILE*’RETRYLOGICWASREMOVED:*’GIVESNOTIFICATIONOFCOPY/VERIFYSTATUSUPONCOMPLETION *œOFREQUEST9*’WHENVERIFYDIFFERENCESAREDISPLAYEDTHERECORDNUMBER'*œWILLBESHOWNINDECIMALATALLTIMES***ˆREVISIONCODE‡1028813*:*’INCREASEDSTACKSIZETOACCOMODATESBARGIFACHAINFILE0*’FIXPROBLEMOFCOPYINGTOTHEDEFAULTTERMINAL***ˆREVISIONCODE‡1029813*%*’CORRECTERRORWITHCOPYERRORCOUNT********ˆREVISIONCODE‡1103813*2*’REWORKCOPY/VERIFYOUTPUTWHENREQUESTCOMPLETED:*’SHOWRECORDNUMBERSINHEXASCIIIFCONTIGIOUSFILETYPE*******ˆREVISIONCODE‡1202813*)*’CORRECTPROBLEM…,T.SA…NEWERRORMESSAGE(*’CORRECTPROBLEM…*.TES*.*,*.TES*.*,FIX:*°ELEMINATELOOP*’CORRECTPROBLEM…X.SA,Y.SA;Q*°WHEREQISANINVALIDOPTION9*’CORRECTPROBLEM…ADJUSTEDSBARGINPUTBUFFERSTOMINIMUM**¦OF5CHARACTERSPLUSADEADBYTEFORTHE*¦CARRIAGERETURN6*’CORRECTPROBLEM…FORCEUSERTOSPECIFY'A'OR'S'FOR*¦ALLORSELECT**’CORRECTPROBLEM…CLEANEDUPTHEHELPMASK*******ˆINCLUDEFILES***ˆINCLUDE9995.&.FME.EQ*ˆINCLUDE9995.&.IOE.EQ*ˆINCLUDE9995.&.TR1.EQ**ŠNOLISTŠINCLUDE9995.&.FME.EQŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.TR1.EQŠLIST**ŠPAGE<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************!*ˆ***†COPY‚COMMANDƒ*******ˆ***‰DATAƒSEGMENT„*******=****************************************************************ˆ****‚EQUATEAREA‚******* BEGDATAƒEQU„0(STKLEN„EQU„25‘STACKLENGTHINLONGWORDS)BUFSIZEƒEQU„160INPUTCOMMANDBUFFERSIZE DSKLUI„EQU„1(DSKLUO„EQU„2’DISKLOGUNITASSIGNOUTPUT!LISTLU„EQU„3’LISTINGLOGICALUNIT"DIRLU…EQU„4’LOGUNITFORDIRECTORY LU6‡EQU„6SECLEN„EQU„256SECTORLENGTHHSECLENƒEQU„$100SECTORLENGTH CRˆEQU„$0D LFˆEQU„$0A*ŠPAGE ŠOFFSET0 **ˆDUMMYDATASEGMENT*3******************************************************ˆBUFFERAREATOREADCONTIGUOUGFILEINTO*3****************************************************ŠPAGE ŠSECTION0!ŠXREFƒEDITFILE,PARSE,OPTION,SBARG**ˆ****‚MACROAREA‚*********ˆNEXTWORDBOUNDRYMACRO**ŠPAGE2*******************************************************„DATASEGMENT(DSEG)ƒ****1**************************************************** PBA‡EQU„**;**************************************************************ˆ***ƒDATAAREA‚******:************************************************************ REV_CODE:ŠDC.Bƒ'1220844'&*œWHEREREV_CODEISDEFINEDASFOLLOWS *œMMDDYYXZ*3*œMMDDYY=MONTHDAYYEAROFLASTASSEMBLYORPATCH*œX†=REVISIONTYPECODE*¦SPACE=CLEANASSEMBLY *¦P…=PATCHED*¦C…=CUSTOMIZEDPATCHED**#*œZ†=VERSADOSMAJORREVISIONFIELD* ŠDS.LƒSTKLEN PROGSTKƒEQU„**ŠDC.Lƒ0ŠDS.Wƒ08*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFINISTHEAREATHECOMMANDLINEIS.*ˆ***ƒREADINTOWHENTHISPROGRAMISCALLEDIN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++**BUFFIN„COMLINEBUFSIZE‹***‚INPUTBUFFER‚***-**********************************************5******************************************************+*ˆ**‚IOSPARAMETERTABLEFORDISKREADS‚***6*ˆ**‚REFERTOIOSEQUATESUNDERIOSPARAMETERBLOCK‚***5******************************************************ŠDS.Wƒ0/ŠIOS.DSKRIOREAD,IOPWAT+IOPREC,DSKLUI,0,0,0,0,0$************************************%*ˆIOSPARAMENTERTABLEFORDISKWRITE*$*************************************(ŠIOS.DSKWIOWRIT,IOPREC,DSKLUO,0,0,0,0,0ŠDS.Wƒ0*1*ˆHOLDAREAFORIOSTABLESFORBOPTUSINGFAMILY HOLDPTFƒDS.Lƒ2’HOLDAREAFORFMSHOLDPTIƒDS.Bƒ56HOLDPTEƒEQU„*-13*****************************************************ŒIOSPARAMETERTABLE(*ˆSETUPIOS(ERR0R-LOG)‚PARAMETERBLOCK*3****************************************************7ŠIOS.OUT6IIOWRIT,IOPASC+IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0**ŠDS.Wƒ0**ˆGETSEGMENTPARAMETERBLOCK* BUFPAR„EQU„*ŠDC.Lƒ0,0TASK(0=SELF)ŠDC.Wƒ$2000ŽOPTIONS0*œRMS68KSUPPLIESLOGICALADDRESSEQUALPHYSICAL *œADDRESSŠDC.Wƒ0’(RAMSEGMENT)ŠDC.Lƒ'BUFR'NAMEOFSEGŠDC.Lƒ0’STARTOFBUFFER'BUFLEN„DC.Lƒ0’lengthofbuffer‘10/19/83**ˆSETUPIOSFORLISTINGLU3*6ŠIOS.OUT3IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU,0,0,0,0,0ŠDS.Wƒ0ŠPAGE"***********************************8*ˆFHSPARAMETERTABLEFORCHANGELOGICALUNITASSIGNMENT5*ˆCHANGEISFROM6TO3-SENDSOURCEISLUAINMASK*ˆANDRECEIVEISLUBINMASK4*ˆLU3ISUSEDF0RLISTINGANDLU6FORERR0R/LOGGING**3*ˆPARAMETERTABLEFORCHANGLOGICALUNITASSIGNMENT,*ˆISDIFFERENTFROMSTANDARTPARAMETERTABLE*%************************************** LU3AFHSƒEQU„*'ŠDC.WƒFHCHLUCOMMAND(CHANGELUASSIGN)&ŠDC.WƒFOPKEP+FOPSLU†OPTIONKEEPASSIGNŠDC.Bƒ0’STATUSŠDC.BƒLDFLUNSENDLUNUMBERŠDC.BƒLISTLURECEIVELUNUMŠDC.Bƒ0’RESERVED&ŠDC.Lƒ0’TASK-ID(0MEANSUSEYOURSELF)(ŠDC.Lƒ0’SESSION#(0MEANSUSEYOURSELF)*ŠDS.Wƒ0* *ˆSETLU2=LU6IFOUTPUT#ONLY* LU2AFHSƒEQU„*'ŠDC.WƒFHCHLUCOMMAND(CHANGELUASSIGN)&ŠDC.WƒFOPKEP+FOPSLU†OPTIONKEEPASSIGNŠDC.Bƒ0’STATUSŠDC.BƒLDFLUNSENDLUNUMBERŠDC.BƒDSKLUORECEIVELUNUMŠDC.Bƒ0’RESERVED&ŠDC.Lƒ0’TASK-ID(0MEANSUSEYOURSELF)(ŠDC.Lƒ0’SESSION#(0MEANSUSEYOURSELF)*ŠDS.Wƒ0***,*********************************************&*ˆPARAMETERBLOCKFOR‚INPUT(TERMINAL)*,*********************************************'ŠIOS.OUTINIOREAD,IOPFOR,CDFLUN,,,0,0,2*ŠDS.Wƒ0%ŠIOS.DNRIOREAD,IOPFOR,CDFLUN,,,0,0,2*ŠDS.Wƒ0)******************************************?*ˆLU3FHSISPARMTABLEFORLU3WHICHISUSEDFOROUTPUTLISTING*********************************************#*ˆFHS.LU3FHCLOS,0,LISTLU,0,0,0,0,0 &ŠFHS.LU3FHASGN,FOPEW,LISTLU,0,0,0,0,0 ŠDC.Lƒ0,0,0*ŠDS.Wƒ0*;************************************************************:*ˆ***DSKFHSISTHEPARAMETERTABLEFORTHEFHSINPUTFILE*;***********************************************************INFHS…DC.WƒFHASGNCOMMANDŠDC.WƒFOPPRŽOPTIONSPUBLICREADŠDC.Bƒ0’STATUS ŠDC.BƒDSKLUILOGICALUNITNUMBER INVOL…DC.Lƒ$20202020ŠVOLUMENAMEINUSN…DC.Wƒ0’USERNUMBER!INCAT…DC.Lƒ$20202020ŠCATALOGNAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILENAMEŠDC.Lƒ$20202020ŠDC.Wƒ$2020ŽEXTENSIONINFHSR„DC.Wƒ0’RESERVEDŠDC.Bƒ0’WRITEPROTECTCODEŠDC.Bƒ0’READPROTECTCODEŠDC.Wƒ0’LOGICALRCORDLENGTH5INSEC…DC.Lƒ0’CONTIGUOUSFILESIZE/DIRENTRYPOINTER6*ˆFOLLOWINGFHSPARAMENTERSFORSHAREDSEGMENTREQUEST(ŠDC.Lƒ0’SEGMENTSTARTINGLOGICALADDRESS$ŠDC.Lƒ0’SEGMENTENDINGLOGICALADDR.3ŠDC.Lƒ0’LENGTHOFPARMBLOCKFORSHAREDSEGREQUESTŠDS.Wƒ0***%*ˆFHSPARAMETERBLOCKFORDISKOUTPUT* OUTFHS„EQU„*ŠDC.WƒFHASGNCOMMAND ŠDC.WƒFOPPWŽOPTIONS-PUBLICWRITEŠDC.Bƒ0’STATUSŠDC.BƒDSKLUOLOGICALUNITNUM!OUTVOL„DC.Lƒ$20202020ŠVOLUMENAMEŠDC.Wƒ0’USERNUMOUTCAT„DC.Lƒ$20202020ŠCATNAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILENAMEŠDC.Lƒ$20202020 ŠDC.Wƒ$2020ŠDC.Wƒ0ŠDC.Bƒ0’WRITEPROTCODEŠDC.Bƒ0ŠDC.Wƒ0ŠDC.Lƒ0’CONTFILESIZE ŠDC.Lƒ0,0,0ŽCONTIGIOUSFILEINFOŠDS.Wƒ0*"*VOLUMEASSIGNMENTFORFAMILYAND**ˆPARAMETERBLOCKFORFETCHDIRECTORYCALL DIRFHS„EQU„*ŠDC.WƒFHFDENCMDŠDC.WƒFOPPRŽOPTIONSŠDC.Bƒ0’STATUSŠDC.BƒDIRLUŽLOGUNITDIRFHSVƒDC.Lƒ$20202020ŠVOLŠDC.Wƒ-2‘USERNUMDIRCAT„DC.Lƒ'„'CATALOGUE ŠDC.Lƒ'„'ŠDC.Lƒ'„'FILE ŠDC.Lƒ'„'DIRFHSEƒDC.Wƒ'‚'EXTŠDC.Wƒ0ŠDC.Bƒ0ŠDC.Bƒ0ŠDC.Wƒ0ŠDC.Lƒ0’DIRADDRPARM*ŠDS.Wƒ0&*ˆDIRECTORYENTRY(DIR)DATASTRUCTURE'*ˆTHEDIRENTRYISREADINTOTHISBLOCK*DIRBLK„DS.BƒFDLEN*ˆDS.W0;************************************************************(*ˆPARAMETERBLOCKTOASSIGNINPUTVOLUME*DIRVOL„DC.WƒFHASGNCOMMANDŠDC.WƒFOPPRŽOPTIONSPUBLICREADŠDC.Bƒ0’STATUSŠDC.BƒDIRLUŽLOGICALUNITNUMBERŠDC.Lƒ$20202020ŠVOLUMENAMEŠDC.Wƒ0’USERNUMBERŠDC.Lƒ$20202020ŠCATNAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILENAMEŠDC.Lƒ$20202020 ŠDC.Wƒ$2020ŠDS.Lƒ3(ŠDC.Lƒ0’SEGMENTSTARTINGLOGICALADDRESS$ŠDC.Lƒ0’SEGMENTENDINGLOGICALADDR.3ŠDC.Lƒ0’LENGTHOFPARMBLOCKFORSHAREDSEGREQUESTŠDS.Wƒ0**'HOLDFUSN‚DC.Wƒ0’FAMILYUSERNUMBERMASK*’HOLDMASKOUTPUTFORFAMILYHOLDFAMƒDC.Lƒ'„'CAT ŠDC.Lƒ'„'ŠDC.Lƒ'„'FILE ŠDC.Lƒ'„' ŠDC.Lƒ'‚'EXŠDS.Wƒ08**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAMƒDC.Lƒ0’SAVETASKNAMESESNUM„DC.Lƒ0’SAVESESSIONNUM#VOLNAM„DC.Lƒ0’SAVEVOLDEFAULTNAMEŠDC.Wƒ0’TOPHALFOFD3"USERNUMƒDC.Wƒ0’DEFAULTUSERNUMBER*CATNAM„DC.Lƒ0,0SAVEDEFAULTCATAGORYNAMEŠDS.Lƒ3’REGD6D7&A0&TIDLOGON‚DC.Lƒ0’TERMIDATLOGONTIMEŠDC.Wƒ0’TOPHALFOFA2"LUSERNUM‚DC.Wƒ0’LOGONUSERNUMBERŠDS.Lƒ8’SAVEOTHERSREGISTERS-PROTIN„DC.Wƒ0’SAVEINPUTPROTCODEFORFAMILY$PROTOUTƒDC.Wƒ0’SAVEOUTPUTPROTCODEOFLAG…DC.Lƒ0’MOREOUTPUTFLAG DNRR†DC.Bƒ'‚'NOTREADYRESPONSEDEVFLAGƒDC.Bƒ0’DEVICEFLAG!FLAGA…DC.Bƒ0’OPTIONAAPPENDFILEEXFLAG„DC.Bƒ0’ENDOFINPUTFLAG"NCFLAG„DC.Bƒ0’CONTIGUOUSFILEFLAG!FAMIFLAG‚DC.Bƒ0’FAMILYFLAGINPUT"FAMOFLAG‚DC.Bƒ0’FAMILYFLAGOUTPUT#ERFLAG„DC.Bƒ0’ERRORFLAGFORFAMILY0QFLAG…DC.Bƒ0’SETWHENFAMILYCOPYABORTEDWITHQ*£***080684***4FAMAPEND‚DC.Bƒ0’WILDCARDAPPENDFLAG***080684***3REREAD„DC.Bƒ0’FLAGFORREREADAFTERBUFFEROVERFLOW!*£ADDED080684TOCORRECTSPR1035*ŠDS.Wƒ0*0SAVOADDƒDC.Lƒ0’1STTIMEFLAGFORPRTDETAILLINE'FORMFEED‚DC.Bƒ$0CTOPOFPAGECHARACTER!ODEV†DC.Bƒ0’OUTPUTISDEVICEFLAG IDEV†DC.Bƒ0’INPUTISDEVICEFLAG%ISDEV…DC.Bƒ0’INPUTOROUTPUTWSADEVFLAGY…DC.Bƒ0’BYPASSFLAG,FLAGN…DC.Bƒ0’DUPFILEDONOTOVERDELETEOLDFLAGV…DC.Bƒ0’VERIFYFLAGFLAGB…DC.Bƒ0’COPY&VERIFYFLAG 'FLAGC…DC.Bƒ0’MAINTAINCATALOGNAMEFLAG&FLAGU…DC.Bƒ0’MAINTAINUSERNUMBERFLAG/CHGEND„DC.Bƒ0’ENDOFRECORDSNOTSAMEINVERIFY-NOTEND„DC.Bƒ1’ENDFLAGNOTATEND=1END=0SEL‡DC.Bƒ0’SELECTINDICATOR2V_EQUALƒDC.Bƒ0’"="INOPTIONSFIELDAFTER"V"FLAG5OV_VALUE‚DC.Bƒ0’ORIGVALUEAFTER'V='INOPTIONFIELD,V_VALUEƒDC.Wƒ0’DECREMENTEDVALUEOFOV_VALUE*)BUFCE…DS.Lƒ1’#sectors*256-1Ž10/19/83 BUFNUM„DS.Lƒ1’BUFCE+1˜10/19/834BUFNUMEƒDS.Lƒ1’#sectorsinfiledatablock…10/19/830BUFSIZ„DS.Lƒ1’sizeofarea1+area2+ˆ10/19/83&*£8bytesbetweenthe2areas†10/19/831BUFVER„DS.Lƒ1’BUFNUM+8‚startofarea2†10/19/835BUFEND„DS.Lƒ1’endofarea2,lastbyteofitƒ10/19/83FILEUNACCOUNTEDFOR*¦1-->FILEƒACCOUNTEDFOR**ž1‡0-->MODECOPY*¦1-->MODEVERIFY*!*ž2‡0-->'T'OPTIONNOTSELECTED*¦1-->'T'OPTION…SELECTED*!*ž3‡0-->'P'OPTIONNOTSELECTED*¦1-->'P'OPTION…SELECTED*+*ž4‡0-->FILETYPEISNOTINDEXSEQUENTIAL%*¦1-->FILETYPEIS…INDEXSEQUENTIAL*-*12‡0-->DONOTDISPLAY#FILEVERIFYERRORS#*¦1-->ˆDISPLAY#FILEVERIFYERRORS*,*13‡0-->DONOTDISPLAYNBRFILESVERIFIED"*¦1-->ˆDISPLAYNBRFILESVERIFIED*+*14‡0-->DONOTDISPLAY#FILECOPYERRORS!*¦1-->ˆDISPLAY#FILECOPYERRORS***15‡0-->DONOTDISPLAYNBRFILESCOPIED *¦1-->ˆDISPLAYNBRFILESCOPIED GSEG_ADR:ŠDC.Lƒ0*œADDROFGETSEGMENTŠDS.Wƒ0ŠPAGE***’ERRORMESSAGEPARAMETERBLOCK**EM_PBLK: EM_DO:„DC.Lƒ0"*œD0-IOS/FHSRETURNERRORSTATUS*œ(ERRORMSGKEYVALUE) EM_A0:„DC.Lƒ0"*œA0-ADDROFI/OPARAMETERBLOCKEM_OPT:ƒDC.Bƒ0*œOPTIONSFLAG*œBIT‡MEANINGIFSET*0ˆQUERYRESPONSEDESIREDEM_TLUN:‚DC.Bƒ0*œUSERTERMINALLUN-(LDFLUN)EM_QRC:ƒDC.Bƒ0*œQUERYRETURNCHARACTEREM_KLUN:‚DC.Bƒ0*œUSERKEYBOARDLUN-(CDFLUN)EM_SPA:ƒDC.Lƒ0'*œSTARTADDRESSFORUSERTEXTPLUGPOOLEM_EPA:ƒDC.Lƒ0%*œENDƒADDRESSFORUSERTEXTPLUGPOOL ENDDATAƒEQU„*****O*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*8*ˆINASMUCHASPOSSIBLEREGISTERA6WILLBEUSEDASTHE%*ˆPROGRAMBASEADDRESS(PBA)REGISTER*O*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ŠPAGE ŠSECTION0 BEGPROCƒEQU„**<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<***************************************************************ŽCOPYCOMMAND-*ˆ***‚PROCEDURESECTIONFORCOPYCOMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************ŠLEA„PBA(PC),A7*œA7=PBA*&***************************************.*ˆ**ƒSAVEDEFAULTVALUEPASSEDFROMSYSTEM****'*****************************************$ŠMOVEM.LD0-D7/A0-A7,STSKNAM-PBA(A7)*œSAVETASKINPUTDATA*+*ˆD0TOSTSKNAM=TASKNAMETHATSTARTEDME*ˆD1TOSESNUM‚=SESSIONNUM$*ˆD2TOVOLNAM‚=DEFAULTVOLUMENAME*ˆD3TOUSERNUM=USERNUMBER*ˆD4TOCATNAM‚=CATALOGUENAME*ˆD5TOCATNAM+4**ˆD6‹=‚LENGTHOFCOMMANDLINE)*ˆD7=BITMASKOFLOGICALUNITSASSIGNED*ˆA0=YOURTASKNAME*ˆA1=TERMINALID*ˆA2=ACTUALUSERNUMBER(*ˆA3=SYSTEMVOLUMEDEFAULE(ALLSPACES)*ˆA4=SYSTEMUSERNUMBER*ˆA5=SYSTEMCATALOGUE*ˆA6=SYSTEMCATPART2**ŠPAGE ŠMOVE.LA7,A6ŠLEA„PROGSTK(PC),A7*œA6=PBA*œA7=STACKADDRESSŠLEA„MSGANS(PC),A0 "ŠMOVE.LA0,OUTINIOS-PBA+IOSSAD(A6)ŠADD.L‚#MSGANSSZ,A0"ŠMOVE.LA0,OUTINIOS-PBA+IOSEAD(A6)4*œSETIOSSTARTANDENDADDRESSESINPARAMETERBLOCKŠLEA„DNRR(PC),A0 ŠMOVE.LA0,DNRIOS-PBA+IOSSAD(A6) ŠADD.L‚#1,A0 ŠMOVE.LA0,DNRIOS-PBA+IOSEAD(A6)4*œSETIOSSTARTANDENDADDRESSESINPARAMETERBLOCKŠLEA„DIRBLK(PC),A0 ŠMOVE.LA0,DIRFHS-PBA+FHSSIZ(A6)'*œSETFHSFETCHDIRECTORYENTRYADDRESSŠPAGE)ŠMOVE.LREV_CODE-PBA(A6),QUESTM10-PBA(A6)-ŠMOVE.LREV_CODE+4-PBA(A6),QUESTM10+4-PBA(A6)!*œMOVEREVISIONNBRTOHELPPANEL#ŠLEAREV_CODE(PC),A2„***080684***"ŠLEAREV_NBR(PC),A3…***080684***4ŠMOVE.L#8,D1‡***080684***‚#OFCHARACTERSTOMOVEDREV_MOVE‚MOVE.B(A2)+,(A3)+***080684***‚MOVEREV#TOINITIALMSG-ŠSUBQ.L#1,D1‡***080684***‚DECREMENTLENGTH4ŠBNEREV_MOVE‡***080684***‚MOVERESTOFREVISION#"ŠLEAREV_MSG(PC),A3Œ***080684***>ŠMOVE.LA3,OUT6IIOS+IOSSAD-PBA(A6)STARTOFMSG***080684***#ŠLEAREV_MSGE(PC),A3‹***080684***<ŠMOVE.LA3,OUT6IIOS+IOSEAD-PBA(A6)ENDOFMSGƒ***080684***2ŠIOSCALLOUT6IIOS(PC)‡PRINTTHEMSG***080684***ŠCLR.L‚FCC-PBA(A6)ŠCLR.L‚FCE-PBA(A6)*œCLEARCOUNTERS*¦FILESCOPIED*¦FILESVERIFIED*¦FILESCOPIEDWITHERRORS*¦FILESVERIFIEDWITHERRORSŠCLR.W‚COPY_FLG-PBA(A6)*œCLEARGENERALCOPYFLAGŠPAGE****„DRIVER‚BLOCK„****** ŠBNE„IOERPRT*œJMPIFGETSEGMENTERRORŠMOVE.LA0,GSEG_ADR-PBA(A6)*œSAVEADDROFSEGMENT#************************************&*‰*****CALLCOMMANDPARSEROUTINE‚****#***********************************CDOBUFF„MOVE.LD6,LENLEFT-PBA(A6)SAVELENGTHOFLINE***080684******‘FOLLOWINGBLOCKRELOCATED***080684****5*ˆASSIGNMENTOFSEND&RECEIVELU'SISDONEBYSYSTEM"*’IFTHEYGOTOTERMINALLU5&LU6 ŠBTSTƒ#3,D7ŽLU3ALREADYASSIGNED)ŠBNE.S‚DOBUFF3ŒYES‚CHANGED***080684***"ŠBSR„SETLU3ASSIGNLU3TOTERMINAL*'*‘ENDOFRELOCATEDBLOCK***080684****EDOBUFF3ƒLEA„BUFFIN(PC),A0ƒSAVEBUFFERSTARTADDR‚MOVED***080684***‚BUFNUME-PBA(A6)ƒTHEN.S“10/19/83!*£iscurrsegbigenough‹10/19/83(ŠRTS—currentbigenough,return‡10/19/83ŠENDI–. 10/19/83GETSEG1ƒEQU„*’. 10/19/839ŠMOVE.LD0,BUFNUME-PBA(A6)savethe#ofsectorsŒ10/19/830ŠMULSƒ#256,D0Œcalcthe#bytesrequiredˆ10/19/838ŠMOVE.LD0,BUFNUM-PBA(A6)‚1stbyteafterarea1Œ10/19/83"ŠSUB„#1,D0Žsizeofarea1“10/19/83/ŠMOVE.LD0,BUFCE-PBA(A6)ƒsavethesize”10/19/832ŠADD„#9,D0Žstartofarea2,leave8bytesƒ10/19/83*ŠMOVE.LD0,BUFVER-PBA(A6)‚saveitš10/19/83.ŠADD.L‚BUFCE-PBA(A6),D0ƒendofarea2”10/19/83:ŠMOVE.LD0,BUFSIZ-PBA(A6)‚totalbufsizerequiredŠ10/19/83;ŠMOVE.LD0,BUFLEN-PBA(A6)‚savebufsizforgetseq‰10/19/839ŠERQ.DESEGBUFPAR(PC)†deallocatecurrentsegment‡10/19/83-ŠERQ.GTSEGBUFPAR(PC)†requestmemory“10/19/83ŠBNE„IOERPRTŒerror?›10/19/83,ŠMOVE.LA0,GSEG_ADR-PBA(A6)saveit™10/19/83ŠRTS—. 10/19/83ŠPAGE/************************************************)*ˆ***‚SETUPFHSPARMBLOCKFORINPUT****7*ˆTHISROUTINEWILLINITIALIZETHEINPUTFILEPARAMETER*/************************************************INITIN: ŠMOVE.LA6,A0*œA0=PBA(ŠLEA„INFHS(PC),A6‹ADDROFFHSPARMBLOCK!ŠBSR„INITDSKŒGOTOINITDISKSUBR*&****************************************ˆ**ƒCALLEDITFILEROUTINE***ˆA0=INPUTCOMMANDSTART*ˆA6=ADDROFPARMBLOCK*&***************************************CŠTST.B‚MULTIN-PBA(A0)CHECKFORMULTIPLEINPUTFILES***080684***>ŠBEQ.S‚INITIN2ˆNO,USEBUFFINFORSTARTADDRESS***080684***EŠMOVE.LNEXTIN-PBA(A0),A0GETADDRESSOFNEXTFILESPEC‚***080684***ŠBRA.S‚INITIN3Œ***080684***INITIN2ƒEQU„*’***080684***)ŠLEA„BUFFIN(PC),A0ŠA0=ADDROFINPUTFIELD INITIN3ƒEQU„*0ŠMOVEA.LA0,A4SAVESTARTOFLINE***080684***!ŠBSR„EDITFILE‹MAKEEDITFILECALLŠBMI„INVALERR‹ERR0R9ŠMOVEA.LA0,A5COMPUTELASTCHARACTEROFFIELD***080684*œ***080684***ŠSUBA.L#2,A5Ž***080684****ŠBTSTƒ#0,D0ŽCHECKFORMULTIPLEINPUTFILES/ŠBEQ.S‚INITIN4ŒSINGLEINPUTFILE***080684***3ŠMOVE.LA6,-(A7)‹SAVEA6TEMPORARILY***080684****ŠLEA„PBA(PC),A6RESTOREPBA***080684***4ŠBTSTƒ#1,D0ŽCHECKFORDEVICEASINPUT***080684***7ŠBNE.SINITERŽYES-TERMINATEWITHERROR***080684***2ŠTST.B‚FLAGV-PBA(A6)†VERIFYOPTION?***080684***0ŠBNE.S‚INITERYES-INVALIDERROR***080684***6ŠTST.B‚FLAGB-PBA(A6)†COPYWITHVERIFY?‚***080684***$ŠBNE.S‚INITERINVALID***080684***:ŠTST.B‚FLAGC-PBA(A6)†RETAININPUTCATALOG?***080684***$ŠBNE.S‚INITERINVALID***080684***.ŠTST.B‚FLAGN-PBA(A6)†NOPTION?***080684***$ŠBNE.S‚INITERINVALID***080684***>ŠTST.B‚FLAGU-PBA(A6)†RETAININPUTUSERNUMBER?***080684***$ŠBNE.S‚INITERINVALID***080684***3ŠTST.B‚FLAGV-PBA(A6)†VERIFYOPTION?***080684***+ŠBEQ.S‚INITIN8ŒNO-CONTINUEƒ***080684***1INITER„MOVEA.L(A7)+,A6ŠRESTOREA6***080684***&ŠBRA„INVALERR‹TERMINATE‚***080684***JINITIN8ƒST.BƒMULTIN-PBA(A6)‚SETADDITIONALINPUTFILESFLAG***080684***>ŠST.BƒMULTIN2-PBA(A6)SETMULTIPLEENTRIESFLAG***080684***EŠBSETW‚#15,COPY_FLG-PBA(A6)SETFLAGTOPRINT#OFFILES***080684*DŠMOVE.LA0,NEXTIN-PBA(A6)‚SAVESTARTOFNEXTFILESPEC***080684***0ŠSUBA.LA4,A0COMPUTELENGTHLOST***080684***ŠMOVE.LA0,D1Ž***080684***EŠSUB.L‚D1,LENLEFT-PBA(A6)ANDSUBTRACTFROMLENGTHCOUNTER***080684+ŠMOVEA.L(A7)+,A6ŠRESTOREA6***080684***4ŠBRA.SINITIN6SKIPRESETTINGOFFLAG***080684***INITIN4ƒEQU„*’***080684***ŠMOVE.LA6,A0Ž***080684***(*£***080684***A0=ADDRINPUTFHSBLOCK%ŠLEAPBA(PC),A6***080684***A6=PBA>ŠSF.BMULTIN-PBA(A6)‰RESETMULTIPLEINPUTSFLAG***080684*** ŠBRA.SINITIN7***080684***INITIN6ƒEQU„*’***080684*** ŠMOVE.LA6,A0#*œA0=ADDRINPUTFHSPARAMETERBLOCKŠLEA„PBA(PC),A6*œA6=PBAINITIN7ƒEQU„*’***080684***6ŠMOVE.LD0,EDITSTAT-PBA(A6)SAVESTATUS***080684***9ŠBSR„CONVMASK„CONVERTWILDCARDMASKTOADISPLAYABLEFORM@ŠMOVE.WINFHS-PBA+FHSWCD(A6),PROTIN-PBA(A6)SAVEINPUTPROTCODEŠTST.B‚FLAGV-PBA(A6)"ŠBEQ.S‚IN1JMPIFNOVERIFYOPTION ŠBTSTƒ#1,D0=ŠBNE„INVALERR‡JMPBECAUSEINPUTFORVERIFYOPTIONISADEVICE ŠBTSTƒ#7,D04ŠBNE.S‚INFAMŽJMPIFFAMILYTYPEOPERATIONFORVERIFYŠBRA.S‚INITEXEXITIN1‡BTSTƒ#1,D05ŠBEQ.S‚INITIN1ŒJMPIFANINPUTFILEWASSPECIFIEDFOR*œOPERATIONREQUESTED9ŠMOVE.B#1,IDEV-PBA(A6)„SETFLAG-INPUTDEVICESPECIFIEDCŠMOVE.B#1,ISDEV-PBA(A6)ƒSETFLAG-INPUTOROUTPUTWASSPECIFIEDA*¤DEVICEŠBTSTƒ#14,D0NULLVOLŠBEQ.S‚INITIN1ŒNO3ŠMOVE.LTIDLOGON-PBA(A6),FHSVOL(A0)GETTERMINALIDINITIN1ƒBTSTƒ#7,D0)ŠBNE.S‚INFAMŽJMPIFFAMILYTYPEOPERATION ŠMOVE.W#FOPPR+FOPBEG,FHSOPT(A0)*œOPTIONSREQUESTED*¦EXCLUSIVER/W*¦POSITIONATBEGINNINGOFFILE*2***************************************************ŠASSIGNDISKINPUTVOL‚***5*ˆCOMMAND,VOLNAMEANDLU#ARESETUPINPARMBLOCK3****************************************************)ŠMOVE.W#FHASGN,FHSCMD(A0)ASSIGNCOMMANDŠFHSCALLINFHS(PC)'*Š**‚RETURNFROMFILEHANDLERSYSTEM**ŠBEQ.S‚INITEXNOERRORINITIN5: ŠBSR„ERR_0130*œHSKPCOPYFUNCTION ŠBSR„ERR_0100*œADJUSTCOPYCOUNTŠBRA„IOERPRTŒOTHERTYPEERRORINFAM…BTSTƒ#6,D0Ž*INVOLFIELDŠBNE„INVALERR‹ERROR*“***080684***:*‰TST.B‚FLAGA-PBA(A6)†THESETWOLINESHAVEBEENELIMINATED6*‰BNE„INVALERR‹TOALLOWFORTHEWILDCARDAPPENDOPTION*“***080684***ŠMOVE.BD0,FAMIFLAG-PBA(A6)0*œSAVEFAMILYSTATUSFORINPUTFIELDASRETURNED*œFROMEDITFILEROUTINE INITEX„RTS**ˆINPUT-A0=PBA*-*ˆSUBROUTINETOINITPARMWITHDEFAULTVALUES* INITDSKƒEQU„*-ŠMOVE.LVOLNAM-PBA(A0),FHSVOL(A6)VOLUMENAME4ŠMOVE.WUSERNUM-PBA(A0),FHSUSN(A6)USELOGONUSER#+ŠMOVE.LCATNAM-PBA(A0),FHSCLG(A6)CATALOGUE%ŠMOVE.LCATNAM+4-PBA(A0),FHSCLG+4(A6)'ŠMOVE.L#'„',FHSFIL(A6)BLANKFILENAMEŠMOVE.L#'„',FHSFIL+4(A6),ŠMOVE.W#'‚',FHSEXT(A6)ƒBLANKEXTENSIONNAME ŠRTS—.RETURN*0*************************************************8*‰ROUTINETOCONVERTWILDCARDMASKTOADISPLAYABLEFORM**‰ADDED***080684****3*‰ONENTRY:A4POINTSTOBEGINNINGOFUNEDITEDMASK#*“A5POINTSTOENDOFUNEDITEDMASK*7*EXIT:MASKDISPLAYABLEVIAMOVMSGROUTINESTARTINGAT *“VOLMASK*1CONVMASKMOVEM.LD0/A0/A3-A6,-(A7)‚SAVEREGISTERS‰LEAPBA(PC),A6ŽSETUPPBA%‰MOVE.L#6,D0Œ#OFLONGWORDSTOCLEAR!‰LEAVOLMASK(PC),A0ŠAREATOCLEAR-CONVMAS1MOVE.L#'„',(A0)+„BLANKOUTFILESPEC‰SUBQ.L#1,D0ŒDECREMENTCOUNT ‰BNECONVMAS1ŒBLANKOUTTHEREST3‰MOVE.LEDITSTAT-PBA(A6),D0RESTOREEDITFILESTATUS)‰LEAINFHS(PC),A0ŒLOCATIONOFEDITEDMASK;‰LEAEXTMASK+2(PC),A3ˆLOCATIONOFLASTCHARACTERINMASK+1‰ADDA#1,A5ŽPOINTTOEND+1:CONVEXT‚CMP.B#'.',-1(A5)‡CHECKFORENDOFFILENAMEFIELD#‰BEQ.SCONVFILEŠGOCONVERTFILENAME+‰BTST#10,D0CHECKFORNULLEXTENSIONFIELD)‰BNE.SCONVFIL2ŠGOTOFILENAMECONVERSION"‰MOVE.B-(A5),-(A3)†MOVECHARACTER ‰CMP.LA4,A5CHECKFORBEGINNING$‰BEQ.SCONVDONEŠTERMINATECONVERSION+‰BRACONVEXTCONVERTREMAINDEROFEXTENSION/CONVFILESUBA#1,A5ŽPOINTA5TOENDOFFILENAME3CONVFIL2LEAEXTMASK(PC),A3ŠENDOFFILENAMEMASK+1‰BSR.SMOVFIELDŠMOVETHEFILE"‰CMP.LA4,A5CHECKFORENDOFMASK$‰BEQ.SCONVDONEŠTERMINATECONVERSION ‰SUBA#1,A5ŽPOINTA5PASTPERIOD.CONVCAT‚LEAFILEMASK(PC),A3‰ENDOFCATALOG+1!‰BSR.SMOVFIELDŠMOVECATALOGNAME>CONVDONE MOVE.L FHSVOL(A0),VOLMASK-PBA(A6) MOVE VOLUME TO MASK5‰MOVE.WFHSUSN(A0),USNMASK-PBA(A6)PUTUSER#INMASK%‰BTST#4,D0ŽCHECKFORWILCARDCATALOG‰BNE.SCONVDON2/‰MOVE.LFHSCLG(A0),CATMASK-PBA(A6)MOVECATALOG&‰MOVE.LFHSCLG+4(A0),CATMASK+4-PBA(A6)+CONVDON2BTST#3,D0ŽCHECKFORWILDCARDFILE ‰BNE.SCONVDON31‰MOVE.LFHSFIL(A0),FILEMASK-PBA(A6)MOVEFILENAME'‰MOVE.LFHSFIL+4(A0),FILEMASK+4-PBA(A6)0CONVDON3BTST#2,D0ŽCHECKFORWILDCARDEXTENSION‰BNE.SCONVDON41‰MOVE.BFHSEXT(A0),EXTMASK-PBA(A6)MOVEEXTENSION4CONVDON4MOVEM.L(A7)+,D0/A0/A3-A6‹RESTOREREGISTERS‰RTS****************************†***080684***C*‚THISROUTINEWILLMOVECHARACTERSFROMTHELOCATIONPOINTEDTOBYC*‚A5TOTHELOCATIONPOINTEDTOBYA3UNTILITENCOUNTERSAPERIOD.****************************†***080684***:MOVFIELDCMP.B#'.',-1(A5)‡CHECKFORENDOFPREVIOUSFIELD‰BEQ.SMOVEXIT‹RETURNTOCALLER&‰MOVE.B-(A5),-(A3)†MOVETHECHARACTER.‰CMP.LA4,A5CHECKFORBEGINNINGOFUSERINPUT$‰BNEMOVFIELDŒCONTINUEWITHTHEMOVE MOVEXIT‚RTS ŠPAGE-**********************************************.*ˆROUTINETOASSIGNLOGICALUNIT3TOTERMINAL+*ˆBYSETTINGITUPTHESAMEASLU6WHICHIS"*ˆALREADYASSIGNEDTOTHETERMINAL*.*********************************************** SETLU3„EQU„*ŠLEA„LU3AFHS(PC),A0ŠTRAPƒ#3ŠBNE„ERCALL6ŒBAD ŠRTS—.RETURN*ŠPAGE1****************************************************ˆROUTINETOPERFORMOUTPUTINITIALIZATION*1************************************************** INITOUTƒEQU„**#*ˆLOGICIFINPUTFIELDWASADEVICE*ŠLEA„PBA(PC),A0*œA0=PBA'ŠLEA„INFHS(PC),A5‹INPUTPARMBLOCKADDRŠLEA„OUTFHS(PC),A6ŠOUTPUTPARMŠTST.B‚IDEV-PBA(A0)/ŠBEQ.S‚OUTAJMPIFINPUTFIELDSPECIFIEDAFILE(*œFALLTHRU-->INPUTFIELDWASADEVICE%ŠBSR„INITDSKŒINITOUTPUTWITHDEFAULT ŠCLR.W‚FHSLRL(A6)‰LOGRECLENGTHŠCLR.L‚FHSSIZ(A6)‰FILESIZE-ŠOR.Wƒ#FOPSEQ,FHSOPT(A6)SEQUENTIALFILETYPE** ŠBRA.S‚OUTB OUTA†EQU„**!*ˆLOGICIFINPUTFIELDWASAFILE*(ŠMOVE.LVOLNAM-PBA(A0),FHSVOL(A6)VOLUME)ŠMOVE.WUSERNUM-PBA(A0),FHSUSN(A6)USER#+ŠMOVE.LCATNAM-PBA(A0),FHSCLG(A6)CATALOGUE%ŠMOVE.LCATNAM+4-PBA(A0),FHSCLG+4(A6)#ŠTST.B‚FLAGC-PBA(A0)†CHECK'C'FLAGŠBEQ.S‚OUTA0ŽBRANCHIFNOTSET@ŠMOVE.LINCAT-PBA(A0),FHSCLG(A6)CARRYOVERCATANAMEFROMINPUT$ŠMOVE.LINCAT+4-PBA(A0),FHSCLG+4(A6)(OUTA0…TST.B‚FLAGU-PBA(A0)†CHECK'U'FLAGŠBEQ.S‚OUTA1ŽBRANCHIFNOTSET?ŠMOVE.WINUSN-PBA(A0),FHSUSN(A6)CARRYOVERUSERNBRFROMINPUTOUTA1…BTSTƒ#7,FAMIFLAG-PBA(A0)1ŠBNE.S‚OUTBJMPIFFAMILYSPECIFIEDININPUTFILE'ŠMOVE.LFHSFIL(A5),FHSFIL(A6)FILENAME!ŠMOVE.LFHSFIL+4(A5),FHSFIL+4(A6)1ŠMOVE.WFHSEXT(A5),FHSEXT(A6)GETINPUTEXTENSION9ŠMOVE.WFHSWCD(A5),FHSWCD(A6)WRITE&READPASSWORDCODES,ŠMOVE.WFHSLRL(A5),FHSLRL(A6)LOGRECLENGTH'ŠMOVE.LFHSSIZ(A5),FHSSIZ(A6)FILESIZE7ŠMOVE.BFHSOPT(A5),FHSOPT(A6)MOVEHIGHBYTEOFOPTIONS**4*****************************************************ˆCALLEDITFILEROUTINE*ˆA0HASADDROFSTARTOFSCAN*ˆA6HASADDROFFHSPARMBLOCK*4*****************************************************)OUTB†MOVE.LSAVOADD-PBA(A0),A0SCANSTART/************************************************'*ˆCALLTOEDITFILETOSETUPPARMBLOCK*1************************************************** ŠBSR„EDITFILE,*œINITIALIZEPARAMETERBLOCKFOROUTPUTFILEŠBMI„INVALERR‹YESŠLEA„PBA(PC),A6*œA6=PBAŠBTSTƒ#0,D0ŽISTHEREMORE ŠBNE„INVALERR,*œJMPIFUSERSPECIFIEDALISTINGFILEUSING*œTHEOLDDELIMITEROF'/'ŠCMP.B‚#',',-1(A0) ŠBNE.S‚OUT1,*œJMPIFTHEREISNOTALISTFIELDSPECIFIED%ŠMOVE.LA0,OFLAG-PBA(A6)ƒSAVEPOINTEROUT1:ŠLEA„OUTFHS(PC),A0$*œA0=ADDROUTPUTFHSPARAMETERBLOCK ŠBTSTƒ#7,D03ŠBNE„OUTFAMJMPIFFAMILYSPECIFIEDINOUTPUTFIELDDŠTST.BMULTIN2-PBA(A6)CHECKFORMULTIPLEINPUTFILES***080684***4ŠBEQ.SOUT1B‹NO-PROCEEDASNORMALLY***080684***>ŠLEAVOLMASK(PC),A0ˆPOINTA0TOINPUTFILENAME***080684***<ŠBSRNAMEOUT‹PRINTSOURCEANDDESTINATIONNAMES***080684*DŠLEAOUTFHS(PC),A0ƒRESTOREOUTPUTPARAMETERBLOCKADDRESS***080684OUT1B…EQU*‘***080684***:************************ 080684 ***************************>*‰THEFOLLOWINGCODEWASADDEDFORTHEWILDCARDAPPENDOPTION* AŠTST.B‚FAMIFLAG-PBA(A6)ƒCHECKFORFAMILYSPECIFIEDININPUTFIELD"ŠBEQ.S‚NOFAMŽNOFAMILIESSPECIFIED=ŠTST.B‚FLAGN-PBA(A6)†SINCETHISISANIMPLIEDAOPTION,CHECK2ŠBNE„INVALERR‹FOROPTIONSTHATWOULDCONFLICTWITH ŠTST.B‚FLAGV-PBA(A6)†ANAOPTION ŠBNE„INVALERRŠTST.B‚FLAGB-PBA(A6) ŠBNE„INVALERR:ŠTST.B‚FLAGC-PBA(A6)†ALSODISALLOWCANDUOPTIONSBECAUSE-ŠBNE„INVALERR‹WEARECOPYINGTOASINGLEFILEŠTST.B‚FLAGU-PBA(A6) ŠBNE„INVALERR#ŠBTST#1,D0CHECKFOROUTPUTDEVICE ŠBNE.S‚NOFAM2ŠMOVE.B#1,FAMAPEND-PBA(A6)SETFAMILYAPPENDFLAGFŠMOVE.WOUTFHS-PBA+FHSWCD(A6),PROTOUT-PBA(A6)SAVEOUTPUTPROTECTCODEFŠMOVE.LINVOL-PBA(A6),DIRVOL-PBA+FHSVOL(A6)VOLNAMEFORVOLASSIGNMENT0ŠFHSCALLDIRVOL(PC)ASSIGNVOLUMEFORINPUTFILEŠBNEIOERPRT†ERROR,ŠLEAINFHS+FHSVOL(PC),A1INPUTMASKLOCATION1ŠLEADIRFHS+FHSVOL(PC),A4DIRECTORYMASKLOCATIONŠMOVE.L(A1)+,(A4)+MOVEVOLUME$ŠMOVE.W(A1)+,(A4)+MOVEUSERNUMBER%ŠMOVE.L#9,D0NUMBEROFWORDSTOMOVE1ŠLEAOUTFHS+FHSCLG(PC),A0OUTPUTCATALOGLOCATION$ŠLEAHOLDFAM(PC),A5‡STORAGELOCATIONKMOVEIN„MOVE.W(A1)+,(A4)+‚MOVEINPUTINFORMATIONTODIRECTORYREQUESTBLOCK<ŠMOVE.W(A0)+,(A5)+‚MOVEOUTPUTINFORMATIONTOSTORAGEBLOCK/ŠSUBQ.L#1,D0ˆDECREMENTNUMBEROFWORDSTOMOVEŠBNEMOVEINŠMOVESOMEMOREDŠMOVE.WDIRFHS-PBA+FHSUSN(A6),HOLDFUSN-PBA(A6)SAVEDIRECTORYUSER# .ŠRTS—WE'RENOTREADYTOASSIGNTHEOUTPUTFILE*£YET,SORETURN*:************************ 080684 **************************4NOFAM…TST.B‚FLAGV-PBA(A6)†LABELADDED***080684***#ŠBNE„OUTEXITŒJMPIFVERIFYFLAGSET7ŠLEA„INFHS(PC),A5‹RESETPOINTER(EDITFILEDESTROYEDIT) ŠBTSTƒ#1,D04ŠBNE.S‚OUTB1ŽJMPIFDEVICESPECIFIEDINOUTPUTFIELD ŠBRA.S‚OUTC OUTB1…EQU„*+ŠMOVE.B#1,ODEV-PBA(A6)„SETOUTPUTDEVFLAGŠMOVE.B#1,ISDEV-PBA(A6)'ŠMOVE.W#FHASGN,(A0)‡SETASSIGNCOMMAND*‰WASOUTPUTTOTERMINALŠBTSTƒ#14,D0BITONŠBEQ.S‚OUTCNO8ŠMOVE.LTIDLOGON-PBA(A6),FHSVOL(A0)LOGONTERMIDTOVOL* OUTC†EQU„*ŠTST.B‚ODEV-PBA(A6)/ŠBNE‚OUTT4ŽJMPIFDEVSPECIFIEDINOUTPUTFIELD!*¡CHANGEDTOBNE.L***080684*****ˆOUTPUTFIELDSPECIFIEDAFILE*ŠTST.B‚IDEV-PBA(A6)5ŠBNE.S‚ALLOCOUT‹JMPIFINPUTFIELDSPECIFIEDADEVICE#*œANDOUTPUTFIELDSPECIFIEDAFILEŠTST.B‚FLAGA-PBA(A6)@ŠBNE.S‚OUTT11†JMPIFAPPENDOPTIONSET-RECORDI/OWILLBEDONE>8,FHSOPT(A5) ŠBEQ„ERRFIL*œJMPIFINPUTCONTIGIOUSŠCMP.B‚#FOPCON>>8,FHSOPT(A0) ŠBEQ„ERRFIL*œJMPIFOUTPUTFILECONTIGIOUSŠMOVE.WFHSLRL(A5),D0ŠCMP.W‚FHSLRL(A0),D0:ŠBNE„ERRFILŠJMPIFLOGICALRECORDLENGTHSARENOTTHESAMEŠMOVE.WFHSSIZ+2(A5),D0ŠCMP.W‚FHSSIZ+2(A0),D0 ŠBNE.S‚RECIO,*œBRANCHIFDBSIZEAND/ORFABSIZENOTSAMEŠMOVE.WFHSSIZ(A5),D0ŠCMP.W‚FHSSIZ(A0),D0 ŠBEQ„OUTEXIT'***************************************2*ˆDORECORDI/OSINCEDATABLOCKFABNOTSAMESIZE'***************************************RECIO:&ŠMOVE.W#IOPREC,DSKRIOS-PBA+IOSOPT(A6)&ŠMOVE.W#IOPREC,DSKWIOS-PBA+IOSOPT(A6) ŠBRA„OUTEXIT'****************************************ˆTESTFORFAMILYCONDITIONS'***************************************3*ANYFIELDWITHAN*INTHEOUTPUTFIELDMUSTHAVE*AN*INTHEINPUTFIELD,*’AN*INTHEFILEOREXTENSIONFIELDOFTHE)*’OUTPUTREQUIRESAN*INTHEINPUTFIELD OUTFAM„EQU„*;ŠTST.BFLAGA-PBA(A6)CHECKFORAPPENDOPTION***080684***BŠBNEINVALERRAPPENDOPTIONWITHFAMILYFORBOTHFIELDSISILLEGAL*¥***080684***FŠMOVE.WOUTFHS-PBA+FHSWCD(A6),PROTOUT-PBA(A6)SAVEOUTPUTPROTECTCODE ŠMOVE.BFAMIFLAG-PBA(A6),D1,*œD1=EDITFILESTATUSRETURNEDFORINPUTFILE ŠBTSTƒ#6,D05ŠBNE.S‚FAMERŽJMPIFFAMILYINDICATIONINVOLUMEFIELDŠMOVE.BD0,FAMOFLAG-PBA(A6)-*œD0=EDITFILESTATUSRETURNEDFOROUTPUTFILEEŠMOVE.LINVOL-PBA(A6),DIRVOL-PBA+FHSVOL(A6)VOLNAMFORVOLASSIGNMENT/ŠFHSCALLDIRVOL(PC)ˆASSGNVOLUMEFORINPUTFILEŠBNE„IOERPRTŒERROR;ŠMOVE.LINFHS-PBA+FHSVOL(A6),DIRFHS-PBA+FHSVOL(A6)SAVEVOLŠMOVE.BFAMOFLAG-PBA(A6),D0-*œD0=EDITFILESTATUSRETURNEDFOROUTPUTFILE ŠBTSTƒ#5,D0 ŠBNE.S‚X00100'*œJMPIF'*'INUSERNBROFOUTPUTFILE*'*ˆOUTPUTFILEHASNO'*'INUSERNUMBER* ŠBTSTƒ#5,D1 ŠBNE.S‚FAMER)*œJMPIF'*'INUSERNUMBEROFINPUTFILE2ŠMOVE.WINFHS-PBA+FHSUSN(A6),DIRFHS-PBA+FHSUSN(A6)0*œSETUSERNBRINDIRECTORYCALLPARAMETERBLOCK*œEQUALTOINPUTUSERNUMBER ŠBRA.S‚OUTF1X00100:*$*ˆOUTPUTFILEHAS'*'INUSERNUMBER* ŠBTSTƒ#5,D1 ŠBEQ.S‚FAMER-*œJMPIFINPUTFILEHASNO'*'INUSERNUMBER3OUTF1…MOVE.WDIRFHS-PBA+FHSUSN(A6),HOLDFUSN-PBA(A6)0*œUSERNBRINDIRECTROYPARAMETERBLOCKISSAVED3ŠLEA„INFHS+FHSCLG(PC),A5„A5=ADDRINPUT‚FILECATALOG5ŠLEA„OUTFHS+FHSCLG(PC),A4ƒA4=ADDROUTPUTFILECATALOGŠLEA„HOLDFAM(PC),A0"ŠLEA„DIRCAT(PC),A1ŠA1=ADDRMOVETOŠMOVE.B#18,D0COUNTOUTFLOPƒCMP.B‚#'*',(A5))ŠBNE.S‚OUTF3ŽJMPIFSOURCEBYTENOT='*' *’SOURCEIS*ŠCMP.B‚#'*',(A4);ŠBNE.S‚FAMER‹JMPIFCORRESPONDINGDESINATIONBYTENOT='*'1OUTF2…MOVE.B(A4)+,(A0)+ˆSAVEDESTINATIONASMASK,ŠMOVE.B(A5)+,(A1)+ˆSAVESOURCEINDIRTABLEŠSUB.B‚#1,D0ŽDONEŠBNE„OUTFLOPŒNOŠBRA.S‚OUTEXITŒEXIT*’SOURCEWASNOT*OUTF3…CMP.B‚#'*',(A4)<ŠBNE.S‚OUTF2ŠJMPIFCORRESPONDINGDESTINATIONBYTENOT='*'&FAMER…BRA„INVALERR‹GOTOERRORROUTINE OUTEXITƒEQU„*ŠRTS&************** 080684 *****************<*„THISROUTINEWILLOUTPUTTHENAMESOFTHEINPUTANDOUTPUTC*„FILESCURRENTLYBEINGUSEDWHILEINTHEMULTIPLEINPUTFILEMODE.*C*„ALLREGISTERSARESAVED.A6SHOULDCONTAINTHEPBAUPONENTRYAND(*„A0SHOULDPOINTTOTHEINPUTFILENAME.*&*************** 080684 ***************CNAMEOUT MOVEM.L A0/A4/A5/D0,-(A7) SAVE REGISTERS WHICH WILL BE USED)ˆMOVE.LA0,A4‰SAVEINPUTFILENAMEADDRESS(ˆTST.BFLAGA-PBA(A6)‚CHECKFORAPPENDINGˆBEQ.SNAMEOUT2‡NOAPPENDING6ˆLEAAPPNDMSG(PC),A0†BEGINNINGOF"APPENDING"MESSAGE!ˆMOVE.LA0,OUT3IOS+IOSSAD-PBA(A6)+ˆLEACOPOKA(PC),A5ˆPLACEFORFILENAMETOGOˆBRA.SNAMEOUT32NAMEOUT2LEACOPMSG(PC),A0‡'COPYINGFROM'MESSAGE!‰MOVE.LA0,OUT3IOS+IOSSAD-PBA(A6)(‰LEACOPOUT(PC),A5‡BEGINNINGOFFILENAME$NAMEOUT3BSRMOVMSGŠCONVERTTOASCII&‰MOVEA.LA5,A4‡DESTINATIONOFFILESPEC(‰BSRMOVMSG10ˆMOVEITANDSPACECOMPRESS$‰LEATOMSG(PC),A0ˆLOCATIONOF'TO'5‰MOVE.B(A0)+,(A4)+‚MOVETHEMESSAGEABYTEATATIME‰MOVE.B(A0)+,(A4)+‰MOVE.B(A0)+,(A4)+‰MOVE.B(A0)+,(A4)+‰MOVEA.LA4,A5‡SAVELOCATION5‰LEAOUTFHS+FHSVOL(PC),A4LOCATIONOFOUTPUTFILESPEC‰BSRMOVMSG‹CONVERTIT9‰MOVEA.LA5,A4ˆRESTORENEXTAVAILABLEPOSITIONINMESSAGE‰BSRMOVMSG10‰MOVETHEFILESPECC‰MOVE.LA4,OUT3IOS+IOSEAD-PBA(A6)STOREENDOFMESSAGEINIOSBLOCK&‰IOSCALLOUT3IOS(PC)‚PRINTTHEMESSAGE*‰BNEIOERPRTŠABORTIFERRORISENCOUNTERED0‰MOVE.LA0,OUT3IOS+IOSEAD-PBA(A6)ENDOFMESSAGE&‰IOSCALLOUT3IOS(PC)PRINTTHEMESSAGE,‰MOVEM.L(A7)+,A0/A4/A5/D0RESTOREREGISTERS‰RTSŠPAGE0*************************************************ˆFAMILYPROCESSINGFORCOPY0*************************************************FAMILYES‚EQU„*ŠTST.B‚ISDEV-PBA(A6)†DEVICEŠBNE„INVALERR‹YES$************************************ *ˆSELECTMSG$************************************ŠLEA„COPAM(PC),A3ŠLEA„COPAME(PC),A4 ŠBSR„PRTLU6IŠIOSCALLOUTINIOS(PC) ŠBNE„IOERPRT*œJMPIFREADERROR ŠBSR„SBARG&*œLOWERCASETOUPPERCASEIFNECESSARY ŠBNE„IOERPRT*œJMPIFSBARGERRORŠCMP.B‚#'S',MSGANS-PBA(A6)ŠBNE.S‚FAMILY10&*œJMPIF'SELECT'OPTIONNOTREQUESTED5ŠMOVE.BMSGANS-PBA(A6),SEL-PBA(A6)SAVESELECTOPTIONŠBRA.S‚FAMILY20*œCONTINUEPROCESSING FAMILY10: ŠCMP.B‚#'A',MSGANS-PBA(A6)ŠBNE.S‚FAMILYES*œJMPIF'ALL'NOTREQUESTED FAMILY20:ŠBCLRW‚#4,COPY_FLG-PBA(A6)0*œRESETFILETYPETOOTHERTHANINDEX‚SEQUENTIAL ŠBSR„ERR_0130 *œHSKPFLAGS)******************************************ˆGETFILEFROMDIRECTORY)*****************************************"ŠFHSCALLDIRFHS(PC)ˆDIRECTORYCALLŠBEQ.S‚PROCDIRŠCMP.B‚#FSTAEOD,D0&ŠBEQ„FAMILYEX‹JMPIFEOFFORDIRECTORYŠBRA„IOERPRTŒERRORPROCDIRƒLEA„INFHS+FHSUSN(PC),A1*œA1=ADDRINPUTUSERNUMBERŠLEA„DIRBLK+FDUSN(PC),A0*œA0=ADDRDIRECTORYUSERNUMBERŠMOVE.W(A0)+,(A1)+ˆUSERNUMBERŠMOVE.L(A0)+,(A1)+ˆCATŠMOVE.L(A0)+,(A1)+ŠMOVE.L(A0)+,(A1)+ˆFILEŠMOVE.L(A0)+,(A1)+ŠMOVE.W(A0),(A1)ŠEXT4ŠMOVE.WPROTIN-PBA(A6),INFHS-PBA+FHSWCD(A6)PASSWORDŠMOVE.W#FHASGN,INFHS-PBA(A6)*œFHSCOMMAND=ASSIGN* *’DOOUTPUT*ŠCMP.W‚#-2,HOLDFUSN-PBA(A6)0ŠBNE.S‚FAM2JMPIFUSERNUMBEROTHERTHANFAMILY@ŠTST.B‚FAMAPEND-PBA(A6)ƒCHECKFORWILDCARDAPPEND***080684***3ŠBNE.S‚FAM2DON'TCHANGEUSERNUMBER‚***080684***2ŠMOVE.WINFHS-PBA+FHSUSN(A6),OUTFHS-PBA+FHSUSN(A6)#*œSETOUTPUTFHSUSERNBRTOFAMILY2FAM2†LEA„HOLDFAM(PC),A0‰A0=MASTEROUTPUTFILENAME>ŠLEA„INFHS+FHSCLG(PC),A1„A1=ADDRINPUTPARAMTERBLOCK(FAMILY)@ŠLEA„OUTFHS+FHSCLG(PC),A2ƒA2=ADDROUTPUTFILEPARAMERBLOCKMOVEŠMOVE.B#18,D0INITCOUNTERFAMLOP„CMP.B‚#'*',(A0).ŠBNE.S‚FAM3AŽJMPIFNOTAFAMILYINDICATOR'*'"ŠMOVE.B(A1)+,(A2)+ˆGETFROMINPUTŠADD.L‚#1,A0ŽREPOSITIONMASKFAM3†SUB.B‚#1,D0ŽCKFORENDŠBNE„FAMLOPNOŠBRA.S‚FAMNXTDONE&FAM3A…MOVE.B(A0)+,(A2)+ˆGETFROMMASKŠADD.L‚#1,A1ŽREPOSITIONINPUT ŠBRA„FAM3FAMNXT„LEA„OUTVOL(PC),A4ŠTST.B‚SEL-PBA(A6)8ŠBEQ.S‚FAM3BŽJMPIFALLFILESWERESELECTEDTOBECOPIED=ŠTST.B‚FAMAPEND-PBA(A6)ƒIMPLIEDAPPENDOPTION?†***080684***9ŠBEQ.S‚FAMNXT1ŒJMPIFAPPENDNOTSPECIFIED***080684***7ŠLEA„INVOL(PC),A4‹INPUTFILENAMEWILLGOOUT‚***0806847ŠTST.B‚FLAGA-PBA(A6)†TRUEAPPENDOPTION?‰***080684***9ŠBEQ.S‚FAMNXT1ŒNO-USEOKTOCOPYMESSAGE***080684***.ŠBSR„MOVMSGCONVERTITTOASCII‰***080684***ŠLEA„COPOKA2(PC),A4¥***0806849ŠBSR„MOVMSG10ŠMOVEFILENAMETOCORRECTMSG***080684***8ŠLEA„OKTOAPND(PC),A3ˆ'OKTOAPPEND?'MESSAGE„***080684.ŠBRA.S‚FAMNXT2‹ASKTHEQUESTION***080684***BFAMNXT1ƒBSR„MOVMSG†SETUPFILENAMEMSG‚***080684***LABELADDED***‚PRINTOKTOCOPYMSG**ŠLEA„COPOKF(PC),A4 ŠBSR„MOVMSG10.*œMOVEFILENAMETOCORRECTMESSAGETODISPLAYŠLEA„COPOK(PC),A3.FAMNXT2ƒBSR„PRTLU6I‹LABELADDED***080684***ŠIOSCALLOUTINIOS(PC) ŠBNE„IOERPRT*œJMPIFREADERROR ŠBSR„SBARG%*œLOWERCASETOUPPERCASEIFNECESSARY ŠBNE„IOERPRT*œJMPIFSBARGERRORŠCMP.B‚#'Q',MSGANS-PBA(A6)'ŠBNE.S‚FAM3HŽCHECKFORY***080684***?ŠST.BƒQFLAG-PBA(A6)†TERMINATEMULTIPLEFILECOPY***080684***.ŠBRA„DOCOPY10‹TERMINATEPROGRAMINNORMALMODEFAM3H…EQU„*’***080684***ŠCMP.B‚#'Y',MSGANS-PBA(A6)ŠBEQ.S‚FAM3BŽCONTINUEŠBRA„FAMILY20‹GETNEXTFAM3B…TST.B‚FLAGV-PBA(A6)"ŠBNE„FAMVERJMPIFVERIFYFLAGSET?ŠTST.B‚FAMAPEND-PBA(A6)ƒCHECKFORWILDCARDAPPEND***080684***0ŠBEQ.S‚FAM3CŽPRINTNORMALMESSAGE„***080684***9ŠTST.B‚FLAGA-PBA(A6)†CHECKFORTRUEAPPENDƒ***080684***ŠBNE.S‚FAM3G¦***080684***8ŠLEA„INVOL(PC),A0„POINTTOINPUTFILENAMEˆ***080684***8ŠBSR„NAMEOUT…PRINTINPUTANDOUTPUTNAMESƒ***080684***.ŠBRA.S‚INASSIGN„GOASSIGNINPUT***080684***9FAM3G…LEA„INVOL(PC),A4‹USEINPUTFILENAME…***080684***+ŠBSR„MOVMSGCONVERTTOASCIIˆ***080684***5ŠLEA„COPOKA(PC),A4Š'APPENDING'MESSAGE…***080684***1ŠBSR„MOVMSG10‹MOVEFILENAMETOMSG„***080684***4ŠLEA„APPNDMSG(PC),A3ˆSTARTOFMESSAGEˆ***080684***$ŠBRA.S‚FAM3EŽPRINTIT***080684***FAM3C…LEA„OUTVOL(PC),A4 ŠBSR„MOVMSGSETUPFILENAMEMSG%FAM3F…LEA„COPOKB(PC),A3ŠPRTFILENAMEFAM3E…BSR„PRTLU37********************************************************’ASSIGNINPUT7*******************************************************INASSIGN‚EQU…*‘***080684***ŠFHSCALLINFHS(PC))ŠBEQ.S‚FAM3DŽJMPIFGOODINPUTASSIGNMENT ŠBSR„IOERPRTR *œDISPLAYASSIGNMENTERROR ŠBSR„ERR_0100*œADJUSTCOPYCOUNTŠBRA.S‚FAMBADC/FAMBAD„BSR„MOVMSGPRTFILENAMEPARTOFMESSAGEŠLEA„COPOKB(PC),A3*ŽENDISALREADYSETUP ŠBSR„PRTLU3FAMBADCƒBSR„FAMRESTŒCLOSEŠBRA„FAMILY20‹GETNEXT*FAM3D…LEA„INFHS(PC),A5ŠLEA„OUTFHS(PC),A0>ŠMOVE.WPROTOUT-PBA(A6),FHSWCD(A0)WRITE&READPASSWORDCODES,ŠMOVE.WFHSLRL(A5),FHSLRL(A0)LOGRECLENGTH'ŠMOVE.LFHSSIZ(A5),FHSSIZ(A0)FILESIZE7ŠMOVE.BFHSOPT(A5),FHSOPT(A0)MOVEHIGHBYTEOFOPTIONSŠCLR.B‚ERFLAG-PBA(A6)ŠMOVE.W#FHASGN,OUTFHS-PBA(A6)2***************************************************’GOASSIGNOUTPUT2**************************************************;ŠTST.B‚FLAGA-PBA(A6)†CHECKFORAPPENDOPTION***080684***3ŠBEQ.S‚NOOPTANO-PROCEEDASBEFORE‚***080684***7ŠBSR„OUTT11ASSIGNOUTPUTWITHRECORDIO***080684***3ŠBRA.S‚OPTASKIPOVEROLDASSIGNMENT***080684***;NOOPTA„BSR„OUTFSŽASSIGNOUTPUT‚-LABELADDED***080684***,OPTA†BSR„GETSEGgetsegifrequiredŽ10/19/83*£LABELADDED***080684***ŠLEA„PBA(PC),A6*œA6=PBAŠTST.B‚ERFLAG-PBA(A6)…ERRORŠBEQ.S‚FAM6NO)ŠCMP.B‚#2,ERFLAG-PBA(A6)‚BYPASSCONDITIONŠBEQ„FAMBADCŒYESŠLEA„OUTVOL(PC),A4 ŠBRA„FAMBAD*.FAMVER„MOVE.WOV_VALUE-PBA(A6),V_VALUE-PBA(A6)**£Startwiththeoriginalvalueofxin..+*£'V=x'ofoptionfieldeverytimeanew.."*£familymemberisbiengverified.ŠBSR„VERIFYIT‹Gotoverify.*FAM5A…BSR„FAMRESTŒWRAPUPŠTST.B‚FLAGV-PBA(A6)†VERIFYŠBNE„FAMILY20‹YES!*‹RESETAFTERVERIFY‚FORBOPTION%ŠLEA„HOLDPTI(PC),A0‰A0=ADDRMOVEFROM#ŠLEA„DSKRIOS(PC),A1‰A1=ADDRMOVETO/ŠLEA„HOLDPTE(PC),A2‰A2=MOVETERMINATIONADDRESS4FAML†MOVE.L(A0)+,(A1)+ˆRESTORER/WPARAMETERBLOCKSŠCMP.L‚A0,A2ŽATEND ŠBCC„FAMLNO%ŠMOVE.LHOLDPTF-PBA(A6),INFHS-PBA(A6)(ŠMOVE.LHOLDPTF+4-PBA(A6),OUTFHS-PBA(A6)ŠBRA„FAMILY20‹GETNEXT9FAM6†BSR„COPYITCOPYFILE***080684***CHANGEDTOBSR.L@ŠTST.B‚FAMAPEND-PBA(A6)ƒCHECKFORWILDCARDAPPEND***080684***3ŠBEQ.S‚FAM6BŽDON'TCHANGEOPTAFLAGƒ***080684***DŠMOVE.B#1,FLAGA-PBA(A6)ƒDOOPTIONACOPYFROMNOWON***080684***FAM6B…EQU„*’***080684***ŠTST.B‚EXFLAG-PBA(A6)#ŠBNE.S‚FAM6AŽJMP‚IFSUCCESSFULCOPYŠMOVE.B#'',TERMMSGF-PBA(A6) ŠBSR„TERMERR ŠBRA.S‚FAM5AFAM6A…BSR.S‚FAMRESTŒWRAPUP%ŠTST.B‚FLAGB-PBA(A6)†COPYWITHVERIFYŠBEQ„FAMILY20‹NO*’SAVEPARTABLEBEFORVERIFY%ŠLEA„DSKRIOS(PC),A0‰A0=ADDRMOVEFROM#ŠLEA„HOLDPTI(PC),A1‰A1=ADDRMOVETO/ŠLEA„HOLDPTE(PC),A2‰A2=MOVETERMINATIONADDRESSFAML1…MOVE.L(A0)+,(A1)+ŠCMP.L‚A1,A2ŽATEND ŠBCC„FAML1ŽNO2ŠMOVE.LINFHS-PBA(A6),HOLDPTF-PBA(A6)SAVESETTING(ŠMOVE.LOUTFHS-PBA(A6),HOLDPTF+4-PBA(A6)ŠBRA„FAMVERGOVERIFYIT *!FAMILYEX‚RTS—>‰RETURNFROMFAMILY**-*ˆCLOSEINPUT&OUTPUTWITHOUTERRORCHECKING*;CLOSNECƒMOVE.W#FHCLOS,OUTFHS-PBA(A6)CLOSECOMMANDTOPARMŠFHSCALLOUTFHS(PC)ŠMOVE.W#FHCLOS,INFHS-PBA(A6)ŠFHSCALLINFHS(PC)ŠCLR.B‚ERFLAG-PBA(A6)…RESETŠCLR.B‚NCFLAG-PBA(A6)ŠRTS**ˆRESETAFTERFAMILYPASS(FAMRESTƒBSR„CLOSNECŒCLOSEINPUT&OUTPUTŠCLR.B‚EXFLAG-PBA(A6)ŠCLR.B‚CHGEND-PBA(A6)=ŠCLR.B‚REREAD-PBA(A6)…CLEARREREADAFTERBUFFEROVERFLOWFLAG!*£ADDED080684TOCORRECTSPR1035ŠMOVE.B#1,NOTEND-PBA(A6) ŠRTS—.RETURN2***************************************************7*‰ROUTINETOCLOSEDIRECTORYLUN-ADDED***080684****2**************************************************3CLOSDIRƒMOVE.W#FHCLOS,DIRFHS-PBA(A6)CLOSECOMMAND'ŠFHSCALLDIRFHS(PC)ŒCLOSEDIRECTORYLUN/ŠMOVE.W#FHFDEN,DIRFHS-PBA(A6)ORIGINALCOMMANDŠRTSŠPAGE2***************************************************+*ˆROUTINETOPERFORMCOPYOFREQUESTEDFILE*2***************************************************COPYIT:8ŠLEA„DSKWIOS(PC),A4‰A4=PARAMETERBLOCKADDRESSFORWRITE7ŠLEA„DSKRIOS(PC),A3‰A3=PARAMETERBLOCKADDRESSFORREADŠTST.B‚ISDEV-PBA(A6)8ŠBNE.S‚IOSCONTŒJMPIFINPUTOROUTPUTFEILDWASADEVICEŠTST.B‚FLAGA-PBA(A6).ŠBNE.S‚COPYIT1ŒJMPIF'APPEND'OPTIONSELECTEDŠBTSTW‚#3,COPY_FLG-PBA(A6)ŠBEQ.S‚COPYIT2 *œJMPIFOTHERTHAN'P'OPTIONŠBTSTW‚#4,COPY_FLG-PBA(A6)ŠBEQ.S‚COPYIT2**œJMPIF'P'OPTIONSELECTEDBUTFILETYPE*œISNOTINDEXSEQUENTIALCOPYIT1:*+*ˆRECORDI/OCANNOTUSESHAREDSEGMENTAREA5*ˆMAKENECESSARYALTERATIONSTOACCOMODATERECORDI/O**$*ˆSETUPTORETRIEVEKEYWITHRECORD*ŠOR.Wƒ#IOPRTK,IOSOPT(A3)ŠOR.Wƒ#IOPRTK,IOSOPT(A4)%*œSETOPTION=RETURNKEYWITHRECORDŠBRA.S‚IOSCONT COPYIT2ƒEQU„**ŠTST.B‚NCFLAG-PBA(A6)%ŠBEQ.S‚IOSCONTŒJMPIFCONTIGIOUSFILE*********************************************ˆPROCNONCONTIGUOUS*********************************************%ŠLEA„OUTFHS(PC),A0ŠINITFHSPARBLOCKŠMOVE.LFHSSAD(A0),D0!*œD0=SHAREDSEGMENTSTARTADDRESSŠMOVE.LD0,IOSSAD(A3)ŠMOVE.LD0,IOSSAD(A4)"*œSETSTARTADDRESSFORREAD/WRITEŠMOVE.LFHSEAD(A0),D0*œD0=SHAREDSEGMENTENDADDRESSŠMOVE.LD0,IOSEAD(A3) *œSETENDADDRESSFORREAD/WRITEŠBRA.S‚IOSREAD*(******************************************ˆPROCESSCONTIGUOUSFILE*-*ˆRECORDFILEI/OALSOREQUIRESSHAREDBUFFER(***************************************** IOSCONTƒEQU„**$ŠMOVE.LGSEG_ADR-PBA(A6),A0 12/17/84*œA0=ADDRESSOFGETSEGMENT)ŠMOVE.LA0,IOSSAD(A3)†STARTADDRTOINPUTŠMOVE.LA0,IOSSAD(A4)†TOOUTPUT3ŠADD.L‚BUFCE-PBA(A6),A0ƒaddinendaddressŽ10/19/83*œA0=ENDADDRESS*ŠMOVE.LA0,IOSEAD(A3)†ENDINGADDRTOINPUT* IOSREADƒEQU„***%***************************************ˆDOREADOFINPUTFILE*%**************************************ŠIOSCALLDSKRIOS(PC)ŠBEQ.S‚IOSWSETŒJMPIFGOODREAD-*********************************************!*ˆCHECKFORENDOFFILECONDITION-*********************************************ŠCMP.B‚#ISTAEOF,D0ŠBEQ.S‚IOSENDJMPIFEOF ŠBSR„ERR_0100 *œADJUSTFILECOPIEDERRORCOUNT ŠBRA„IOERPRT *œREADERROR-TERMINATEPROGRAM$*************************************ˆSETUPFORWRITEFILE$************************************* IOSWSETƒEQU„*8ŠLEA„DSKRIOS(PC),A3‰A3=ADDRINPUTPARAMETERBLOCK-READ9ŠLEA„DSKWIOS(PC),A4‰A4=ADDRINPUTPARAMETERBLOCK-WRITE,ŠMOVE.LIOSSAD(A3),A0†A0=ADDROFRECORDREADŠTST.L‚IOSLEN(A3),ŠBNE.S‚IOSW2ŽJMPIFDATATRANSFERREDONREADCŠMOVE.B#'',(A0)„MOVEBLANKTOBUFF-WE'LLFORCEOUTPUTOF1BYTE ŠBRA.S‚IOSW3$IOSW2…ADD.L‚IOSLEN(A3),A0†ADDLENGTHŠSUB.L‚#1,A0ŽADJUSTENDADDR*IOSW3…MOVE.LA0,IOSEAD(A4)†ENDBUFFERADDR**ˆDOWRITETOOUTPUTFILE*IOSWRITE‚EQU„*ŠIOSCALLDSKWIOS(PC)7ŠBEQ„IOSREADŒJMPIFGOODWRITESOR/WLOOPCANCONTINUE ŠBSR„ERR_0100 *œADJUSTFILECOPIEDERRORCOUNT ŠBRA„IOERPRT*œJMPIFWRITEERROR IOSEND„EQU„*&ŠMOVE.B#1,EXFLAG-PBA(A6)‚SETENDFLAG*ŠADD.W‚#1,FCC-PBA(A6)*œADJUSTNBRFILESCOPIEDCOUNT@ŠTST.BMULTIN2-PBA(A6)„CHECKFORMULTIPLEENTRIES***080684***ŠBEQ.SIOSEND2Œ***080684***9ŠST.BFLAGA-PBA(A6)‡USEAPPENDFROMNOWON***080684*** IOSEND2ƒRTSŠPAGE%**************************************;*ˆROUTINETODIRECTOUTPUTTOSOMETHINGOTHERTHANTERMINAL*&**************************************9********************************************************** NEWOUT„EQU„*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º02/03/84%‰MOVE.Wƒ#FHCLOS,LU3FHS+FHSCMD-PBA(A6)*œSETCODE/CMDFORCLOSE *º02/03/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*%ŠFHSCALLLU3FHS(PC)ˆCLOSEPREVASSIGN ŠBNE„IOERPRTŠLEA„PBA(PC),A0*œA0=PBA,ŠLEA„LU3FHS(PC),A6ŠLU3PARMTABLEADDRTOA6@ŠMOVE.B#0,FHSWCD(A6)†LOADWRITEPASSWORD(USERCANALWAYSWRITE?ŠMOVE.B#$FF,FHSRCD(A6)„LOADREADPASSWORD(ONLYUSERCANREAD)3ŠMOVE.WUSERNUM-PBA(A0),FHSUSN(A6)DEFAULTUSERNUM-ŠMOVE.LVOLNAM-PBA(A0),FHSVOL(A6)VOLUMENAME*ŠMOVE.LCATNAM-PBA(A0),FHSCLG(A6)CATNAME)ŠMOVE.LCATNAM+4-PBA(A0),FHSCLG+4(A6)CAT*ŠMOVE.W#'LS',FHSEXT(A6)ƒDEFAULTEXTISSA5ŠMOVE.LOFLAG-PBA(A0),A0ƒOFLAGHADADDROFSCANSTART*)******************************************  ' =S!L)Y1G9CADIZQAY>aLi`qByYZ‰P‘&*ˆSETUPA0WITHADDROFSTARTOFSCAN'*ˆSETUPA6WITHADDROFFHSPARMBLOCK*‰CALLEDITFILEROUTINE****)****************************************** ŠBSR„EDITFILEŠTST.L‚D0‘CKFORERR0R ŠBMI„INVALERRŠLEA„PBA(PC),A6ŠLEA„LU3FHS(PC),A0*œA6=PBA$*œA0=LU3FHSPARAMETERBLOCKADDRESS ŠBTSTƒ#1,D06ŠBNE.S‚LU3ASSJMPIFLISTFIELDHASADEVICESPECIFIED ŠTST.B‚D04ŠBNE„INVALERR‹JMPIFFAMILYINDICATEDFORLISTFIELD ŠBRA.S‚NOTDEV)******************************************'*ˆ****ƒASSSIGNLOGICALUNIT3(LISTING)*'**************************************** LU3ASS„EQU„*-ŠMOVE.W#FHASGN,FHSCMD(A0)SETASSIGNCOMMAND4ŠMOVE.W#FOPPW,FHSOPT(A0)‚SETEXCLUSIVEWRITEOPTION ŠFHSCALL(A0)!*ˆ*****ƒRETURNFROMFHSCALL‚****ŠBNE„IOERPRTŒERR0R!NEWOUTEƒRTS—.RETURNFROMROUTINE***)******************************************"*ˆ**‚OUTPUTISAFILENOTADEVICE.*ˆ**‚A6CONTAINSADDROFOUTPUTFHSPARMBLOCK*)****************************************** NOTDEV„EQU„**3ŠMOVE.W#FHALLO+FHASGN,FHSCMD(A0)SETALLOC&ASSIGN**'ŠMOVE.W#FOPPW+FOPEND+FOPSEQ,FHSOPT(A0)*œOPTIONSINCLUDE *¦PUBLICREAD*¦POSITIONATENDOFFILE*¦SEQUENTIALFILE+ŠCLR.W‚FHSLRL(A0)‰SETLOGICRECLENGTHTO0"ŠCLR.L‚FHSSIZ(A0)‰SIZECODE=ZERO* NOTDEV10:ŠFHSCALL(A0)ŽMAKEFHSCALLŠBEQ„NEWOUTEŒGOODŠCMP.B‚#5,D0ŽDUPFILEŠBNE„ERCALL6ŒERROR&ŠMOVE.W#FHASGN,(A0)‡SETCMDTOASSIGNŠBRA.S‚NOTDEV10 *œTRYTOASSIGN--ASFILEEXISTŠPAGE?****************************************************************ˆ****ƒOPTIONSROUTINECALL‚****4*ˆTHISROUTINEWILLCKINPUTTODETERMINEIFOPTIONS+*ˆHAVEBEENREQUESTED.OPTIONFLAGSARESET!*ˆA2=ADDRSTARTOFOPTIONFIELD*INCOMMANDLINE*?****************************************************************CKFOROPT‚EQU„*ŠCMP.L‚#0,A2ŽANYOPTIONSŠBEQ„ENDOPTNO*OPTOPT„BSR„OPTION*£D0=RETURNEDSTATUS*£D1=OPTIONCHARACTER*"***********************************@*‰**BIT6IND0SETMEANSTHECARRAGERETURNISTHENEXTCHAR**"***********************************#ŠBTSTƒ#6,D0ŽCKFORCARRRETURNFLAG%ŠBNE„ENDOPTJMPIFALLOPTIONSEDITED'OPTERCKƒBTSTƒ#7,D0ŽCKFORERR0RBITSET*ŠBNE„INVALERR‹FOUNDINVALIDFLAGCONDITION*+********************************************,*‰***CKFORY(DONOTREQUESTOK)OPTION***,*********************************************ŠCMP.B‚#'Y',D1ŒISYOPTIONREQŠBNE.S‚OPTNCKNOŠTST.B‚FLAGN-PBA(A6)†NOPTSET)ŠBNE„OPTER20ŒJMPIFOPTIONCONFLICT(Y,N)"ŠMOVE.B#1,FLAGY-PBA(A6)ƒSETYOPTŠBRA„OPTOPTGETNEXT*,*********************************************#*ˆCKFORN(DONOTOVERWRITEOPTION*,********************************************OPTNCK„CMP.B‚#'N',D1ŠBNE.S‚OPTACKNO ŠTST.B‚FLAGA-PBA(A6)†APPOPTSET)ŠBNE„OPTER20ŒJMPIFOPTIONCONFLICT(A,N)ŠTST.B‚FLAGY-PBA(A6)†YOPT)ŠBNE„OPTER20ŒJMPIFOPTIONCONFLICT(N,Y)ŠMOVE.B#1,FLAGN-PBA(A6) ŠBRA„OPTOPTŠPAGE.***********************************************(*ˆCKFORA(APPEND1STTOSECOND)OPTION*.**********************************************OPTACK„CMP.B‚#'A',D1!ŠBNE.S‚OPTBJMPIFNOT'A'OPTION*ŠTST.B‚FLAGN-PBA(A6))ŠBNE„OPTER20ŒJMPIFOPTIONCONFLICT(A,N)ŠTST.B‚FLAGV-PBA(A6))ŠBNE„OPTER20ŒJMPIFOPTIONCONFLICT(A,V)*ŠTST.B‚FLAGB-PBA(A6))ŠBNE„OPTER20ŒJMPIFOPTIONCONFLICT(A,B)*(ŠMOVE.B#1,FLAGA-PBA(A6)ƒSETOPTIONFLAG ŠBRA„OPTOPT-**********************************************!*‰CKFORB(COPY&VERIFY)OPTION*-*********************************************OPTB†CMP.B‚#'B',D1!ŠBNE.S‚OPTVJMPIFNOT'B'OPTION*ŠTST.B‚FLAGV-PBA(A6)+ŠBNE.S‚OPTER20ŒJMPIFOPTIONCONFLICT(B,V)*ŠTST.B‚FLAGA-PBA(A6)+ŠBNE.S‚OPTER20ŒJMPIFOPTIONCONFL  ICT(B,A)*!ŠMOVE.B#1,FLAGB-PBA(A6)ƒSETFLAG ŠBRA„OPTOPT-***********************************************‰CKFORV(VERIFYONLY)OPTION*-*********************************************OPTV†CMP.B‚#'V',D1!ŠBNE.S‚OPTTJMPIFNOT'V'OPTION*+ŠBTSTƒ#4,D0ŽIstherean"="afterthe"V"?ŠBEQ.S‚NOEQUALŒBranchifno.<ŠMOVE.B#1,V_EQUAL-PBA(A6)Setthe"="foundafter"V"flag.:ŠMOVE.WD3,V_VALUE-PBA(A6)Savebinaryofvalueafter"=".ŠMOVE.WD3,OV_VALUE-PBA(A6) NOEQUALƒEQU„*ŠTST.B‚FLAGA-PBA(A6)+ŠBNE.S‚OPTER20ŒJMPIFOPTIONCONFLICT(A,V)*ŠTST.B‚FLAGB-PBA(A6)+ŠBNE.S‚OPTER20ŒJMPIFOPTIONCONFLICT(V,B)*ŠBTSTW‚#3,COPY_FLG-PBA(A6)+ŠBNE.S‚OPTER20ŒJMPIFOPTIONCONFLICT(V,P)*ŠMOVE.B#1,FLAGV-PBA(A6) ŠBRA„OPTOPTŠPAGEOPTER:ŠMOVE.L#EM_NVO,D0)*£D0=KEYVALUEFORINVALIDOPTIONMESSAGE ŠBSR„IOERPRTR*£OUTPUTTHEMESSAGEŠLEA„QUESTM(PC),A3ŠLEA„QUESTME(PC),A4ŠBSR.S‚OPTER99*£OUTPUTHELPMASK ŠBRA„TERMINAT**ENDOPT:ŠBTSTW‚#2,COPY_FLG-PBA(A6).ŠBEQ.S‚T_OPT_CK‹JMPIF'T'OPTIONNOTSELECTEDŠTST.B‚FLAGV-PBA(A6)/ŠBEQ.S‚OPTER20ŒJMPIF'T'OPTIONSELECTED.....*£BUT'V'OPTIONNOT T_OPT_CK:ŠRTS—RETURNFROMROUTINE*OPTER20:ŠMOVE.L#EM_OPTCF,D0**£D0=KEYVALUEFOROPTIONCONFLICTMESSAGE ŠBRA„IOERPRT *£DISPLAYERRORMESSAGEANDEXITOPTER99:%ŠORI.W‚#IOPIMG,OUT3IOS-PBA+IOSOPT(A6)*£SETOPTIONSFORIMAGEFORMAT ŠBSR„PRTLU3*£OUTPUTMESSAGE,ŠANDI.W#$FFFF-IOPIMG,OUT3IOS-PBA+IOSOPT(A6)*£REMOVEIMAGEFORMATREQUESTŠRTSOPTT:ŠCMP.B‚#'T',D1 ŠBNE.S‚OPTP*£JMPIFNOT'T'OPTIONŠBSETW‚#2,COPY_FLG-PBA(A6) *£SETFLAG-'T'OPTIONSELECTED ŠBRA„OPTOPT*£LOOKFORANOTHEROPTIONOPTP:ŠCMP.B‚#'P',D1 ŠBNE.S‚OPTU*£JMPIFNOT'P'OPTIONŠTST.B‚FLAGV-PBA(A6)ŠBNE.S‚OPTER20*£JMPIFOPTIONCONFLICT(P,V)ŠBSETW‚#3,COPY_FLG-PBA(A6)!*£SETFLAG--'P'OPTIONSELECTED ŠBRA„OPTOPT*£LOOKFORANOTHEROPTION*OPTU:ŠCMP.B‚#'U',D1%ŠBNE.S‚OPTCBranchifnot'U'option.8ŠMOVE.B#1,FLAGU-PBA(A6)ƒSetflag-'U'optionselected.'ŠBRA„OPTOPTGolookforanotheroption.*OPTC:ŠCMP.B‚#'C',D1 ŠBNE.S‚OPTERŠMOVE.B#1,FLAGC-PBA(A6) ŠBRA„OPTOPTŠPAGE*4******************************************************ˆROUTINETOSPACECOMPRESS&*ŠA0CONTAINSTHESENDINGLINEADDRESS(*ŠA4CONTAINSTHERECEIVINGLINEADDRESS,*ŠD1CONTAINSTHELENGTHOFTHESENDINGLINE*5******************************************************"SPCOMP„CMP.B‚#'',(A0)ŠISITBLANKŠBEQ.S‚BLD3YES&ŠMOVE.B(A0)+,(A4)+ˆMOVETOPRINTLINE"BLDECK„SUB.W‚#1,D1ŽISTHISTHEENDŠBHI„SPCOMPNO"ŠMOVE.B#'',(A4)ŠPUTBLANKATEND ŠRTS—RETURN*!BLD3†ADD.W‚#1,A0ŽINCADDROFSEND ŠBRA„BLDECK**ŠPAGE5******************************************************ˆROUTINETOVERIFYAFILE* VERIFYIT:,*‰BTSTƒ#4,D0ŽIstherean"="afterthe"V"?*‰BEQ.S‚NOEQUAL1‹Branchifno.=*‰MOVE.B#1,V_EQUAL-PBA(A6)Setthe"="foundafter"V"flag.;*‰MOVE.WD3,V_VALUE-PBA(A6)Savebinaryofvalueafter"=".*‚NOEQUAL1‚EQU„*$ŠMOVE.LGSEG_ADR-PBA(A6),A3¡12/17/84*œA3=ADDROFGETSEGMENTŠCLR.L‚D0²10/19/83:ŠMOVE.LBUFNUME-PBA(A6),D0get#sectorsinblock‹10/19/83<ŠADDA.LBUFNUM-PBA(A6),A3‚1stbyteatendofarea1ˆ10/19/830ŠMOVE.LD0,(A3)ŒinitializerecordcountŠ10/19/83*ŠBCLRW‚#0,COPY_FLG-PBA(A6)!*œINITIALIZEUNACCOUNTEDFORFLAGŠBSETW‚#1,COPY_FLG-PBA(A6)*œSETFLAG-VERIFYMODEŠTST.B‚FLAGA-PBA(A6) ŠBNE.S‚VER1ŠMOVE.WCOPY_FLG-PBA(A6),D0ŠAND.W‚#$0018,D0"*œISOLATE'P'OPTIONANDFILETYPEŠCMP.W‚#$0018,D0 ŠBEQ.S‚VER1*œJMPIF'A'OPTIONSELECTED2*œJMPIF'P'OPTIONSELECTEDANDFILETYPE=NDXSEQ *œVERIFYMODEMUSTBERECORDI/OŠTST.B‚FLAGB-PBA(A6) ŠBNE.S‚VER12*œJMPIF'B'OPTION$*œWHATEVERI/OCOPYPERFORMEDUNDER%*œVERIFYWILLBEPERFORMEDUNDERSAME*œ(BLOCKORRECORD)VER1:4ŠMOVE.W#IOPWAT+IOPREC+IOPRTK,DSKRIOS-PBA+IOSOPT(A6)4ŠMOVE.W#IOPWAT+IOPREC+IOPRTK,DSKWIOS-PBA+IOSOPT(A6)*œSETR/WOPTIONS*¦WAIT*¦RECORDACCESS*¦RETURNKEYW  ITHRECORDVER12…LEA„VERMSG(PC),A3ŠLEA„VERMSGE(PC),A4 ŠBSR„PRTLU3*œOUTPUT'STARTVERIFY'MESSAGEŠMOVE.W#FHASGN,INFHS-PBA(A6)ŠMOVE.W#FHASGN,OUTFHS-PBA(A6)*œFHSCOMMAND=ASSIGN#ŠMOVE.W#FOPPR,INFHS+FHSOPT-PBA(A6)$ŠMOVE.W#FOPPR,OUTFHS+FHSOPT-PBA(A6) *œFHSOPTION *¦PUBLICREADŠMOVE.W#IOREAD,DSKWIOS-PBA(A6)*œIOSCOMMAND=READŠMOVE.LGSEG_ADR-PBA(A6),A4 ŠMOVE.LA4,A3*œA3=A4=GETSEGMENTADDRESS!ŠMOVE.LA4,DSKRIOS-PBA+IOSSAD(A6)%*œSETSTARTADDRESSFORVERIFYFILE14ŠADD.L‚BUFCE-PBA(A6),A4ƒ#sectorsinarea1Ž10/19/83!ŠMOVE.LA4,DSKRIOS-PBA+IOSEAD(A6)#*œSETENDADDRESSFORVERIFYFILE16ŠADD.L‚BUFVER-PBA(A6),A3‚startofarea2addr10/19/83!ŠMOVE.LA3,DSKWIOS-PBA+IOSSAD(A6)(*œA3=SETSTARTADDRESSFORVERIFYFILE23ŠADD.L‚BUFCE-PBA(A6),A3ƒaddsizeofarea110/19/83!ŠMOVE.LA3,DSKWIOS-PBA+IOSEAD(A6)#*œSETENDADDRESSFORVERIFYFILE2"ŠMOVE.B#'1',VFILMN-PBA(A6)FILE1ŠLEA„INVOL(PC),A4 ŠBSR„MOVMSGŠLEA„VFILM(PC),A3*œA3=MSGSTARTADDRESSŠBSR„PRTLU3PRTRESTOFMSG&*œOUTPUTFILE1PARTOFVERIFYMESSAGEŠFHSCALLINFHS(PC)‰ASSIGNDSK1 ŠBEQ.S‚VER2%*œJMPIFFILE1ASSIGNEDSUCCESSFULLYVERER: ŠBSR„ERR_0100 *œADJUSTFILEVERIFYERRORCOUNTŠTST.B‚FAMIFLAG-PBA(A6)0ŠBEQ„IOERPRTŒJMPIFOTHERTHANFAMILYPROCESSING ŠBSR„IOERPRTR ŠRTS—RETURNTOFAMILYPROCESSINGVER2:ŠCLR.B‚NCFLAG-PBA(A6)!*œSETFLAG-CONTIGIOUSFILETYPEŠMOVE.WINFHS-PBA+FHSOPT(A6),D0ŠAND.W‚#FFTBIT,D0ŠBEQ.S‚CONTIG_X*œJMPIFCONTIGIOUSFILEŠMOVE.LGSEG_ADR-PBA(A6),A4*œA4=ADDROFGETSEGMENT8ŠADDA.LBUFNUM-PBA(A6),A4‚1stbyteafterarea1Œ10/19/83ŠMOVE.L#1,(A4)+*œSETSECTORCOUNTFORNON-CONTIGIOUSFILESŠMOVE.B#1,NCFLAG-PBA(A6)%*œSETFLAG-NONCONTIGIOUSFILETYPE CONTIG_X:"ŠMOVE.B#'2',VFILMN-PBA(A6)FILE2ŠLEA„OUTVOL(PC),A4 ŠBSR„MOVMSGŠLEA„VFILM(PC),A3*œA3=MSGSTARTADDRESS ŠBSR„PRTLU3&*œOUTPUTFILE2PARTOFVERIFYMESSAGEŠFHSCALLOUTFHS(PC)ˆASSIGNDSK2)ŠBNE„VERERŽJMPIFASSIGNERRORFORFILE2ŠCLR.L‚D4‘INITRECORDCOUNTERŠBRA.S‚VREAD10ŒBYPASS1STTIME* VREAD1„EQU„*EŠCLR.BCHGEND-PBA(A6)CLEARDIFFERENTRECORDLENGTHFLAG***080684***ŠMOVE.LGSEG_ADR-PBA(A6),A4*œA4=GETSEGMENTADDR@ŠADDA.LBUFNUM-PBA(A6),A4‚1stbyteafteraddrofarea1„10/19/83/ŠADD.L‚(A4),D4ŒADJUSTTHERECORDCOUNTŠ10/19/83VREAD10ƒCLR.L‚D5‘INITOFFSET8ŠMOVE.LGSEG_ADR-PBA(A6),A4A4=BUFFERADDRESSFORFILE1 ŠMOVE.LA4,A5?ŠADDA.LBUFVER-PBA(A6),A5‚A5=BUFFERADDRESSFORFILE2…10/19/83*4**************************************************** *ˆREADDISK14***************************************************** VREAD1AƒEQU„*ŠIOSCALLDSKRIOS(PC)‡READDSK1ŠBEQ.S‚VREAD2GOODREADŠCMP.B‚#ISTAEOF,D0ˆENDOFFILEŠBEQ„VEND1ŽYES9ŠBRA‚IOERCHKŠCHECKFORBUFFEROVERFLOWBEFORETERMINATING$*œMODIFIED080684TOCORRECTSPR1035#*********************************** *ˆREADDISK2!********************************** VREAD2„EQU„* ŠIOSCALLDSKWIOS(PC)‡READDISK2 ŠBEQ.S‚VCMPSŠCMP.B‚#ISTAEOF,D0ˆENDOFFILE ŠBEQ.S‚VEND29ŠBRA„IOERCHKŠCHECKFORBUFFEROVERFLOWBEFORETERMINATING$*£MODIFIED080684TOCORRECTSPR1035 VCMPS…EQU„*$ŠTST.B‚NOTEND-PBA(A6)…ENDSWITCHSETŠBNE.S‚VCMPSOKŒNOBŠMOVE.B#'2',TERMMSGF-PBA(A6)EOFREACHEDONFILE1BUTNOTFILE2ŠBRA„TERMERRŒERROR* VCMPSOKƒEQU„*>ŠMOVE.LDSKRIOS-PBA+IOSLEN(A6),D6D6=NBRBYTESREADFORFILE1>ŠMOVE.LDSKWIOS-PBA+IOSLEN(A6),D7D7=NBRBYTESREADFORFILE2 ŠCMP.L‚D6,D7.ŠBEQ.S‚VCMPLOOP‹JMPIFRECORDLENGTHSARESAME?ŠMOVE.B#1,CHGEND-PBA(A6)‚SETFLAGRECORDLENGTHSAREDIFFERENT*VCMPLOOP‚EQU„*!ŠCMPM.B(A4)+,(A5)+ˆCOMPAREBYTESŠBNE.S‚VPRTNOTEQUAL* *ˆADDOFFSET VCMPOS„EQU„*ŠSUB.L‚#1,D6ŽREDUCESIZEŠBNE„VCMPLOOP‹NOTATEND/************************************************ˆATENDOFDATAINBUFFER/************************************************&ŠTST.B‚CHGEND-PBA(A6)…LENGTHSTHESAMEŠBEQ„VREAD1YES*(*****************************************ˆPUTOUTLENGTH  ERRORMSG&**************************************%ŠMOVE.LD4,D0ŽRECORD#FORCONVERSIONŠMOVE.L#5,D1ŽSIZEŠLEA„ENDRN(PC),A0‹RECAREAŠTST.B‚NCFLAG-PBA(A6) ŠBNE.S‚V_0100*œJMPIFNON-CONTIGIOUSFILEŠMOVE.B#'$',-1(A0)*œFORCEHEXINDIATOR ŠBSR„BINHEX*œCONVERTTOHEXASCII ŠBRA.S‚V_0200V_0100: ŠBSR„BINDECFJ*œCONVERTTODECIMALASCIIV_0200:ŠLEA„ENDNSM(PC),A0!ŠMOVE.LA0,OUT3IOS-PBA+IOSSAD(A6)ŠLEA„ENDNSME(PC),A0!ŠMOVE.LA0,OUT3IOS-PBA+IOSEAD(A6)ŠIOSCALLOUT3IOS(PC)ŠBNE„IOERPRTŒERROR ŠBRA„VREAD1* VEND1…EQU„*4ŠCLR.B‚NOTEND-PBA(A6)…SETFLAG-EOFFOUNDOFFILE1 ŠBRA„VREAD2GOFORENDONFILE2* VEND2…EQU„*ŠTST.B‚NOTEND-PBA(A6),ŠBEQ.S‚FVC_0100‹JMPIFBOTHFILESAREATEOFEŠMOVE.B#'1',TERMMSGF-PBA(A6)EOFREACHEDONFILE2BUTNOTONFILE1 ŠBRA„TERMERR*VEREXIT:ŠRTS—EXITVERIFYROUTINE* FVC_0100:ŠADD.W‚#1,FCV-PBA(A6)*œADJUSTNBROFFILESVERIFIEDŠBRA.S‚VEREXIT*œEXITVPRT: ŠBSR„ERR_0100 *œADJUSTFILEVERIFYERRORCOUNTŠTST.B‚FAMIFLAG-PBA(A6) ŠBNE„FVP_0100!*œJMPIFFAMILYVERIFYPROCESSING)******************************************ˆMOVEOFFSETTOMSG(*****************************************-VPRT1…MOVE.LDSKRIOS-PBA+IOSLEN(A6),D5LENGTHŠSUB.L‚D6,D5ŽPOSFROMEND ŠCLR.L‚D0ŠMOVE.BD5,D0ŽGETOFFSET ŠMOVE.L#2,D1ŠLEA„VM21(PC),A0ŠBSR„BINHEXGOCONVERT*"***********************************ˆCONVERTSECTOR#&PRINT#************************************* ŠMOVE.LD5,D0ŠLSR.L‚#8,D0ŽGETPASTOFFSET ŠADD.L‚D4,D0ŽADDSECTORCNTBASE ŠMOVE.L#5,D1ŠLEA„VMS(PC),A0ŠTST.B‚NCFLAG-PBA(A6) ŠBNE.S‚VPRT2!*œJMPIFNON-CONTIGIOUSTYPEFILEŠMOVE.B#'$',-1(A0)*œFORCEHEXINDICATOR ŠBSR„BINHEX*œCONVERTTOHEXASCII ŠBRA.S‚VPRT3VPRT2:&ŠBSR„BINDECFJ‹CONVERTTODECIMALASCII*)***************************************** *ˆCONVERTDSK0BYTEFORPRINTING)******************************************VPRT3:ŠCLR.L‚D0‘INITŠMOVE.B-(A4),D0‹GETDK0BYTEŠMOVE.LD0,D1ŽINIT"ŠBSR„ASCCKŽGOTOCKPRINTRANGERT/ŠMOVE.BD1,VMO11-PBA(A6)ƒMOVEASCIICHARTOMSGŠASR.B‚#4,D0ŽTOP4BITSŠLEA„VMO1(PC),A0ŒRECADDRŠMOVE.L#1,D1ŽSIZEŠBSR„BINHEXGOCONVERT*ŠMOVE.B(A4),D0ŠAND.B‚#$F,D0LOW4BITSŠLEA„VMO1+1(PC),A0ŠADDRTORECŠMOVE.L#1,D1ŽSAZE ŠBSR„BINHEXŠADD.L‚#1,A4ŽRESETLOCATION*&***************************************ˆCONVERTDSK1FORPRINTING&****************************************ŠMOVE.B-(A5),D0ŠMOVE.LD0,D1ŽINIT"ŠBSR„ASCCKŽGOTOASCIICKPRINTRT1ŠMOVE.BD1,VMO21-PBA(A6)ƒMOVEASCIICHAR2TOMSGŠASR.B‚#4,D0ŽHI4BITSŠLEA„VMO2(PC),A0ŒADDRŠMOVE.L#1,D1ŽSIZE ŠBSR„BINHEX*ŠMOVE.B(A5),D0ŠADD.L‚#1,A5ŽRESETLOCATIONŠAND.B‚#$F,D0LOW4BITESŠLEA„VMO2+1(PC),A0 ŠMOVE.L#1,D1 ŠBSR„BINHEX******************************ˆPRINTDIFFERENCE****************************ŠLEA„VM1(PC),A0+ŠMOVE.LA0,OUT3IOS-PBA+IOSSAD(A6)MSGSTARTŠLEA„VM2E(PC),A0!ŠMOVE.LA0,OUT3IOS-PBA+IOSEAD(A6)ŠIOSCALLOUT3IOS(PC) ŠBNE„IOERPRTŠTST.B‚V_EQUAL-PBA(A6)ˆ"V="? ŠBEQ.S‚CNTNUE*AŠMOVE.WV_VALUE-PBA(A6),D3…Thevalueofxin"V=x"isdecremented2ŠSUB.L‚#1,D3’oneveryoccuranceofadifference...4ŠBNE.S‚LIMITOUTThislimitsthe"V"optiontox....*§differences.2ŠBSR„ERR_0100Adjustfileverifyerrorcountand../ŠBRA„FVC_0100#offilesverified,thenreturn.*"LIMITOUT‚MOVE.WD3,V_VALUE-PBA(A6)* CNTNUE„BTSTW‚#2,COPY_FLG-PBA(A6) ŠBNE.S‚VRSEC1*£JMPIF'T'OPTIONSELECTED2ŠBRA„VCMPOSCONTINUECOMPARISONIFMORETOCOMPARE*F**********************************************************************>*ˆROUTINETOSELECT1DIFFERENCE/256BYTESWHEN'T'OPTIONSETF********************************************************************** *ˆ08/23/83‚RJ<*ˆThepointatwhichthedifferenceisfoundisevaluatedto=*ˆdetermineinwhich256byteblockofthedatabufferitwas=*ˆlocated.Theaddresspointersarethensettothebeginning=*ˆofthenext256byteblock.(ThisalgorithmdependsonA4's>*ˆcomparisonbufferbieng  basedonaneven$100byteboundary.9*ˆNosuchrestrictionappliestoA5'scomparisonbuffer.)*1VRSEC1„MOVE.LA4,D7ŽSaveoldcomparisonpointer..ŠMOVE.LD7,-(A7)‹onthestack.'ŠADD.L‚#$FF,D7ŒComputeamounttoadd...5ŠAND.L‚#$FFFFFF00,D7†inordertoariveatthenext...7ŠSUB.L‚(A7)+,D7‹$100byteboundary.(reclength=$100)%ŠADD.L‚D7,A4ŽBumpbothpointersto...%ŠADD.L‚D7,A5Žnext$100byteboundary.*#ŠSUB.L‚#1,D6ŽAdjustbytecounter...(ŠAND.L‚#$FFFFFF00,D6†downwardtonext...#ŠADD.L‚#1,D6Žmultipleof$100bytes ŠBRA„VCMPOS*>**************************************************************7*ˆROUTINETOCKASCIIPRINTRNAGE&BLANKNONPRINTABLE>***************************************************************#ASCCK…CMP.B‚#$20,D1ŒLESSTHANBLANKŠBCS.S‚ASCSPŽYESŠCMP.B‚#$7F,D1ŒGRTHAN7F(DEL)ŠBLS.S‚ASCEXŽNOASCSP…MOVE.B#'',D1ASCEX…RTS—.RETURN******* FVP_0100:ŠTST.B‚FLAGV-PBA(A6) ŠBNE„VPRT1*œJMPIFVERIFYONLYOPTIONŠLEA„NVERM(PC),A3ŠLEA„NVERME(PC),A4*œA3=MESSAGESTARTADDR*œA4=MESSAGEENDƒADDR ŠBSR„OPTER99*œOUTPUTMESSAGEŠRTS*8********************************************************>*‰ROUTINETOCHECKFORIOSBUFFEROVERFLOWERRORANDRETRYI/O*‰IFNOTALREADYDONESO7********************************************************@*‰ADDED080684TOCORRECTSPR1035.THISROUTINERETRIESANYREADA*‰WHICHHASGENERATEDANIOSBUFFEROVERFLOWERROR.ITRETRIESIT?*‰BYPERFORMINGTHEREADINBINARYFORMATTEDMODEASOPPOSEDTO?*‰ASCIIFORMATTEDMODE.THISELIMINATESANYERRORSCAUSEDBYAN>*‰EXPANDEDASCIIRECORDOFLENGTH>256BYTES.ITWILLTHENBE=*‰ASSUMEDTHATTHEFILEISNON-ASCII,ANDTHEREMAININGREADS-*‰WILLBEPERFORMEDINBINARYFORMATTEDMODE.*IOERCHK: EQU *+ŠCMP.W#ISTABO,D0ƒCHECKFORBUFFEROVERFLOW"ŠBNE.SCHKEXIT‡NO-TERMINATETASK/ŠTST.BREREAD-PBA(A6)CHECKFORPREVIOUSREREAD<ŠBNE.SCHKEXIT‡REREADHASALREADYBEENPERFORMED-TERMINATEHƒOR.W#IOPBIN+IOPCUR,DSKRIOS-PBA+IOSOPT(A6)STARTREADINGINBINARYMODE>ƒOR.W#IOPBIN,DSKWIOS-PBA+IOSOPT(A6)ANDREREADCURRENTRECORDCŠMOVE.B#1,REREAD-PBA(A6)SETFLAGTOINDICATEREREADHASBEENDONE#ŠMOVE.LA0,-(A7)SAVEOLDIOSBLOCKŠIOSCALLDSKRIOS(PC):ŠBNE.SCHKEXITWEKNOWITISN'TANENDOFFILE,BECAUSEWE/* COULDN'TGETHEREIFITWAS,SOTERMINATETHE* TASK>ŠAND.W#$FFFF-IOPRAN,DSKRIOS-PBA+IOSOPT(A6)RESETTOREADNEXT'ŠMOVEA.L(A7)+,A0RESTOREOLDIOSBLOCK7ŠCMP.B#1,IOSLUN(A0)CHECKFORERRORONFIRSTFILEONLY.ŠBEQVREAD2YES-PROCESSSECONDFILENORMALLYHƒOR.W#IOPCUR,DSKWIOS-PBA+IOSOPT(A6)REREADCURRENTRECORDFROM2NDFILEŠIOSCALLDSKWIOS(PC)%ŠBNE.SCHKEXITERROR-TERMINATETASKEŠAND.W#$FFFF-IOPRAN,DSKWIOS-PBA+IOSOPT(A6)RESETTOREADNEXTRECORDŠBRAVCMPSNOWDOTHECOMPARE+CHKEXITƒBRAIOERPRT‚PRINTTHEERRORMESSAGE ŠPAGE**ˆMOVEFILENAMETOWORKAREA*"MOVMSG„MOVE.L(A4)+,VOLPRT-PBA(A6)*œMOVEVOLUMEFIELDŠLEA„L1USN(PC),A0 ŠCLR.L‚D0ŠMOVE.W(A4)+,D0ŠMOVE.L#4,D1ŽSIZE9ŠCMP.W#-2,D0ŽCHECKFORWILDCARDUSERNUMBER***080684*3ŠBEQ.S‚MOVMSG20‹SKIPOVERCONVERSION„***080684***"ŠBSR„BINDECFJ‹CONVTOASCIIUSER#*œMOVEUSERNUMBERFIELDŠBRA.S‚MOVMSG30„***080684***KMOVMSG20‚MOVE.B#'*',0(A0)‚PUTASTERISKINUSERNUMBERFIELD***080684***MOVMSG30‚EQU„*‹***080684***.ŠMOVE.L(A4)+,L1CAT-PBA(A6)MOVECATALOGFIELDŠMOVE.L(A4)+,L1CAT+4-PBA(A6)+ŠMOVE.L(A4)+,L1FIL-PBA(A6)MOVEFILEFIELDŠMOVE.L(A4)+,L1FIL+4-PBA(A6))ŠMOVE.W(A4),L1EXT-PBA(A6)MOVEEXTFIELD*ŠLEA„COPOKB(PC),A4 MOVMSG10:1*œSECONDARYRTNEENTRYPOINTWHEREREGA4ALREADY *œESTABLISHEDŠLEA„DIRMSG(PC),A0ŠMOVEƒ#DIRMSGE-DIRMSG,D1SIZE ŠBSR„SPCOMP**œSPACECOMPRESSFULLYQUALIFIEDFILENAMEŠRTS*PRTLU6I:ŠLEA„PBA(PC),A0*œA0=PBA"ŠMOVE.LA3,OUT6IIOS-PBA+IOSSAD(A0)"ŠMOVE.LA4,OUT6IIOS-PBA+IOSEAD(A0)ŠIOSCALLOUT6IIOS(PC) ŠBNE„IOERPRT ŠRTS—.RETURN*’PRINTTOLU3FORMATTEDFORMATPRTLU3:ŠLEA„PBA(PC),A0!ŠMOVE.LA3,OUT3IOS-PBA+I  OSSAD(A6)!ŠMOVE.LA4,OUT3IOS-PBA+IOSEAD(A6)ŠIOSCALLOUT3IOS(PC) ŠBNE„C_TERMŠRTS* ERRFIL„EQU„*ŠLEA„ATTMSG(PC),A3ŠLEA„ATTMSGE(PC),A4* ŠBRA.S‚ERCALL*****ƒTERMERRISINDRIVERBLOCKNEAR(DOCOPY)*TERMERR:ŠBSR.S‚ERR_0100 *œADJUSTCOPY-VERIFYERRORCOUNTŠLEA„TERMMSG(PC),A3‰MSGSTARTŠLEA„TERMMSGE(PC),A4ˆEND ŠBSR„PRTLU3ŠRTS*:*ˆERRORSAMEMEANSINPUTFILE&OUTPUTFILEHAVESAMENAME ERRSAM„EQU„*ŠLEA„ERRSAMM(PC),A3ŠLEA„ERRSAMME(PC),A4 ŠBTSTƒ#7,FAMOFLAG-PBA(A6)FAMILYŠBEQ.S‚ERCALLNO ŠBSR„PRTLU3ŠMOVE.B#2,ERFLAG-PBA(A6) ŠRTS—.‰RETURN** IOERPRTR:ŠMOVE.L#LISTLU,D1*œD1=LUNOUTPUTMSGTO ŠBSR„C_EM_PGM*œOUTPUTERRORMESSAGEŠRTS*2**************************************************&*ˆ**‚ROUTINETOPRINTERR0RMESSAGE‚***3**************************************************** ERCALL„EQU„* ŠBSR„PRTLU3ŠBRA.S‚TERMINAT**!ERCALL6ƒEQU„*’CALLUSINGTERMINALŠMOVE.L#LDFLUN,D1*œD1=LUNOUTPUTMSGTO ŠBSR„C_EM_PGM*œOUTPUTMESSAGEŠBRA.S‚TERMINAT**0*ˆADJUSTCOPY-VERIFYERRORCOUNTSIFNECESSARY* ERR_0100:ŠBSETW‚#0,COPY_FLG-PBA(A6)*œSETFILEACCOUNTEDFORFLAGŠBNE.S‚ERR_0120*œJMPIFFILEACCOUNTEDFORŠBTSTW‚#1,COPY_FLG-PBA(A6)ŠBEQ.S‚ERR_0110*œJMPIFCOPYMODEŠADD.W‚#1,FVE-PBA(A6)*œADJUSTVERIFYERRORCOUNTŠRTS* ERR_0110:ŠADD.W‚#1,FCE-PBA(A6)*œADJUSTCOPYERRORCOUNT ERR_0120:ŠRTS ERR_0130:ŠBCLRW‚#0,COPY_FLG-PBA(A6)!*œINITIALIZEUNACCOUNTEDFORFLAGŠBCLRW‚#1,COPY_FLG-PBA(A6)*œSETFLAG-COPYMODEŠRTSŠPAGE INVALERR:8ŠCLR.B‚FAMIFLAG-PBA(A6)RESETFAMILYFLAG***080684***ŠMOVE.L#EM_NVE,D0'*œD0=KEYVALUEFORINVALIDENTRYMESSAGEIOERPRT:ŠBSR.S‚IOERPRTRŠPAGE**2*ˆALLUTILITIESWILLTERMINATEBYCALLINGƒERQ.TERM:*ˆHOWEVER-ANINDICATIONASTOWHETHERTHEREWASANERROR5*ˆWHICHMIGHTCAUSECHAINPROCESSINGTOABORTMUSTBE9*ˆSPECIFIEDATTHETIMEOFTHETERMINATION.THEFOLLOWING8*ˆWILLDEFINETHETYPEOFTERMINATIONTHATARECURRENTLY *ˆPOSSIBLE:*8*’NORMALTERMINATION‚-IMPLIESTHATUTILITYSUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM#0,#0**:*’ERRORTERMINATIONƒ-IMPLIESTHATUTILITYTERMINATEDWITH *¨ANERROR**¦ERQ.TERM#0,#$C000*<*’WARNINGTERMINATION-IMPLIESTHATUTILITYTERMINATEDWITH*¨AWARNING(ie.ASSEMBLY)**¦ERQ.TERM#0,#$1000*L********PBA-ISTHEPROGRAMBASEADDRESS‚--THISMAYBEANYSYMBOLTHEUSER *®WOULDLIKE-PBAHASBEENUSED*®HERE**** TERMINAT:ŠLEA„PBA(PC),A6>ŠTST.B‚MULTIN-PBA(A6)„CHECKFORMULTIPLEINPUTS***080684***6ŠBEQ.S‚TERMIN2‹PROCEEDWITHTERMINATION‚***080684***6ŠTST.B‚TERM_FLG-PBA(A6)‚CHECKFORERROR‹***080684***4ŠBNE.S‚TERMIN2‹USENORMALTERMINATION„***080684***;ŠTST.B‚QFLAG-PBA(A6)…QUITFROMFAMILYCOPY?ƒ***080684***4ŠBNE.S‚TERMIN2‹USENORMALTERMINATION„***080684***'ŠBSRCLOSNECŽCLOSEFILES***080684***)ŠBSRCLOSDIRŽCLOSEDIRLUN***080684***DŠMOVE.LNEXTIN-PBA(A6),A0RESTOREADDRESSOFFILESPEC***080684***=ŠMOVE.LLENLEFT-PBA(A6),D6RESTORELINELENGTHˆ***080684***7ŠSF.BƒFAMIFLAG-PBA(A6)ƒRESETFAMILYFLAGŠ***080684***%ŠSF.BƒFAMOFLAG-PBA(A6)ž***080684***4ŠSF.BƒIDEV-PBA(A6)‡RESETDEVICEFLAGS‰***080684***!ŠSF.BƒODEV-PBA(A6)¢***080684***"ŠSF.BƒISDEV-PBA(A6)¡***080684***$ŠSF.BƒDEVFLAG-PBA(A6)Ÿ***080684***;ŠSF.BƒFAMAPEND-PBA(A6)‚RESETWILDCARDAPPEND‡***080684***7ŠBRA„DOBUFF2‹PROCESSTHENEXTINPUTFILE***080684***TERMIN2ƒEQU„*‘***080684***ŠLEA„FCC(PC),A1ŠLEA„X10200(PC),A0 ŠBSR„C_COUNTS*œCONVERTFILESCOPIEDCOUNTŠLEA„FCV(PC),A1ŠLEA„X11200(PC),A0 ŠBSR„C_COUNTS*œCONVERTFILESVERIFIEDCOUNTŠLEA„FCE(PC),A1ŠLEA„X10500(PC),A0 ŠBSR„C_COUNTS*œCONVERTFILESCOPIEDERRORŠLEA„FVE(PC),A1ŠLEA„X11500(PC),A0 ŠBSR„C_COUNTS*œCONVERTFILESVERIFIEDERROR+*œCONVERTNBRFILESCOPIEDTODECIMALASCII*œA0=ADDRSTORECONVERISON*œD1=NBRBYTESTOCONVERT*œD0=VALUETOCONVERT ŠTST.B‚FLAGV-PBA(A6)ŠBNE.S‚TRM_0300*œJMPIFVERIFY  ONLYMODEŠTST.B‚FAMIFLAG-PBA(A6)ŠBEQ.S‚TRM_0100*œJMPIFOTHERTHANFAMILYMODEŠBSETW‚#15,COPY_FLG-PBA(A6)$*œSETFLAG-DISLAYNBRFILESCOPIED TRM_0100:ŠTST.W‚FCE-PBA(A6)ŠBEQ.S‚TRM_0200*œJMPIFNOCOPYERRORSŠBSETW‚#14,COPY_FLG-PBA(A6) *œSETFLAG-DISPLAYCOPYERRORS TRM_0200:ŠTST.B‚FLAGB-PBA(A6)ŠBEQ.S‚TRM_0500*œJMPIFCOPYONLYMODE TRM_0300:ŠTST.B‚FAMIFLAG-PBA(A6)ŠBEQ.S‚TRM_0400*œJMPIFOTHERTHANFAMILYMODEŠBSETW‚#13,COPY_FLG-PBA(A6)'*œSETFLAG-DISPLAYNBRFILESVERIFIED TRM_0400:ŠTST.W‚FVE-PBA(A6)ŠBEQ.S‚TRM_0500#*œJMPIFREADYTOPRINTVERIFYINFOŠBSETW‚#12,COPY_FLG-PBA(A6) TRM_0500:ŠMOVE.WCOPY_FLG-PBA(A6),D6ŠAND.W‚#$F000,D6'*œD6=ISOLATEDCOPY/VERIFYDISPLAYFLAGS ŠBEQ.S‚C_TERM*œJMPIFNOTHINGTODISPLAY ŠMOVE.WD6,D0ŠAND.W‚#$C000,D0 *œD0=ISOLATEDCOPYDISPLAYFLAGSŠBEQ.S‚TRM_0800 *œJMPIFNOCOPYINFOTODISPLAY ŠLSL.W‚#1,D0ŠBCS.S‚TRM_0600)*œJMPIFNBRFILESCOPIEDTOBEDISPLAYEDŠMOVE.B#X10300,D0*œD0.B=NBRBYTESTOZEROFILLŠLEA„X10000(PC),A3*œA3=ADDRSTARTZEROFILL ŠBSR.S‚Z_FILL*œZEROFILLSPECIFIEDADDRESSŠBRA.S‚TRM_0700 TRM_0600: ŠLSL.W‚#1,D0ŠBCS.S‚TRM_0700&*œJMPIFREADYTODISPLAYCOPIEDINFORŠMOVE.B#X10600,D0*œD0.B=NBRBYTESTOZEROFILLŠLEA„X10400(PC),A3*œA3=ADDRTOSTARTZEROFILL ŠBSR.S‚Z_FILL TRM_0700:ŠLEA„X10000(PC),A3ŠLEA„X10700(PC),A4*œA3=MESSAGESTARTADDR*œA4=MESSAGEENDƒADDR ŠBSR„PRTLU3*œOUTPUTCOPYINFOMESSAGE TRM_0800: ŠLSL.W‚#2,D6 ŠBEQ.S‚C_TERM"*œJMPIFNOVERIFYINFOTODISPLAY ŠLSL.W‚#1,D6ŠBCS.S‚TRM_0900+*œJMPIFNBRFILESVERIFIEDTOBEDISPLAYEDŠMOVE.B#X11300,D0*œD0.B=NBRBYTESTOZEROFILLŠLEA„X11000(PC),A3*œA3=STARTADDRTOZEROFILL ŠBSR.S‚Z_FILL*œZEROFILLATSPECIFIEDADDRŠBRA.S‚TRM_1000 TRM_0900: ŠLSL.W‚#1,D6ŠBCS.S‚TRM_1000%*œJMPIFREADYTODISPLAYVERIFYINFOŠMOVE.B#X11600,D0 *œD0.B=NBROFBYTESTOZEROFILLŠLEA„X11400(PC),A3*œA3=ADDRSTARTZEROFILL ŠBSR.S‚Z_FILL*œZEROFILLATSPECIFIEDADDR TRM_1000:ŠLEA„X11000(PC),A3ŠLEA„X11700(PC),A4*œA3=MESSAGESTARTADDR*œA4=MESSAGEENDƒADDR ŠBSR„PRTLU3*œOUTPUTVERIFYINFO‚MESSAGEC_TERM:ŠERQ.TERM#0,TERM_FLG-PBA(A6) TERM_FLG:ŠDC.Wƒ0’TERMINATIONFLAG0*œWILLCONTAINTHEAPPROPRIATETERMINATIONVALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*O*------------------------------------------------------------------------------* C_COUNTS: ŠCLR.L‚D0ŠMOVE.W(A1),D0*œD0=VALUETOCONVERT ŠMOVE.L#4,D1 *œD4=NBROFPOSITIONSTOCONVERT ŠBSR„BINDECFJ*œPERFORMCONVERSIONŠRTS*O*------------------------------------------------------------------------------*Z_FILL:ŠMOVE.B#$0,(A3)+ ŠSUB.B‚#1,D0 ŠBNE.S‚Z_FILL$*œCHARACATERFILLSPECIFIEDLOCATIONŠRTSŠPAGE***’ERRORMESSAGECALLINGROUTINE**ˆCALL†BSR‡C_EM_PGM**ˆINPUT!*’D0=ASRETURNEDFROMTRAPCALL,*’D1=USERLOGICALUNITNUMBERTOOUTPUTTO!*’A0=ASRETURNEDFROMTRAPCALL**ˆOUTPUT*’NOREGISTERPRESERVATION* EM_XCEPT:ŠDC.Wƒ$0000ŽTABLETERMINATOR2*œTHISTABLEISUSEDTODEFINEEXCEPTIONSTOERROR.*œMESSAGESTHATSHOULDNOTCAUSEATERMINATION*œVIATHEERRORCONDITION* C_EM_PGM:ŠLEA„PBA(PC),A6*œA6=PROGRAMBASEADDRESSŠMOVEM.LD0/A0,EM_PBLK-PBA(A6)+*œSAVED0ANDA0INERRORMSGPARAMETERBLKŠAND.L‚#$00FF,D0*œISOLATEERRORSTATUSRETURNŠLEA„EM_XCEPT(PC),A00*œA0=ADDROFTBLCONTAININGERRORMSGCODESTHAT-*ŸWILLNOTBECONSIDEREDASERRORTERMINATION *ŸCONDITIONS CEMP0100: ŠTST.W‚(A0)ŠBEQ.S‚CEMP0200 *œJMPIFTABLEHASBEENEXAMINEDŠCMP.W‚(A0)+,D0ŠBEQ.S‚CEMP0300'*œJMPIFERRORCODERETURNISONEWHICH/*œWILLRESULTINBEINGANEXCEPTION-THISCASE**œWILLNOTBECONSIDEREDFORANERRORTYPE *œTERMINATIONŠBRA.S‚CEMP0100 *œREPEATLOOP CEMP0200:ŠMOVE.W#$C000,TERM_FLG-PBA(A6),*œSETFLAGTOTERMINATEWITHERRORCONDITION CEMP0300:ŠLEA„EM_PBLK(PC),A0&*œA0=ADDRUSERERRORMSGPARAMETERBLKŠMOVE.  BD1,EM_TLUN-EM_PBLK(A0)*œSETTHEUSERLUNTOOUTPUTTO ŠMOVE.L#2,D0*œERRORMSGPRGMINPUTRQMNTŠTRAPƒ#4$*œISSUEREQUESTTOERRORMSGHANDLERŠRTS **ŠPAGE.***********************************************%*ˆCONVERTBINARYTOHEXASCIIROUTINE*(*ˆRIGHTJUSTIFY&BLANKFILLONTHELEFT,*ˆTHELEASTSIGNIFICANTDIGITISNOTBLANKED* *ˆD0=HEXVALUETOBECONVERTED *ˆD1=LENGTHOFRECEIVINGFIELD7*ˆA0=ADDRESSOFLEFTMOSTPOSITIONOFRECEIVINGFIELD*.***********************************************(BINASC„DC.Bƒ'0123456789ABCDEF'HEXTABLE* BINHEX„EQU„*ŠLEA„BINASC(PC),A1ŠINITADDRŠLEA„0(A0,D1),A2ˆENDLOCATION*BINLOP„MOVE.BD0,D3ŽGETBYTE%ŠASR.L‚#4,D0ŽSHIFTOFFLASTHEXVALUE!ŠAND.L‚#$F,D3MASKOFFOTHERBITS2ŠMOVE.B0(A1,D3),-(A2)…MOVEFROMTABLETORECAREAŠCMP.L‚A2,A0ŽAREWEDONEŠBLT„BINLOPNO*ŠCMP.W‚#1,D1ŽONLY1CHARŠBEQ.S‚BINOUTYES**ˆDOZEROSUPPRESSION*ŠLEA„0(A0,D1),A2ˆINITENDLOCŠSUB.L‚#1,A2ŽFIXENDLOC!BINSP…CMP.B‚#'0',(A0)ŠASCIIZERO?ŠBNE.S‚BINOUTNOGETOUT%ŠMOVE.B#'',(A0)+‰REPLACEWITHBLANKŠCMP.L‚A0,A2ŽAREWEDONE ŠBGT„BINSPŽNO**BINOUT„RTS—.RETURN*ŠPAGE*-*********************************************+*‚32BITBINARYTODECIMALASCIISUBROUTINE-**********************************************,*‚CONVERTSBINARYIND0ANDPUTSASCIIDIGIT(*…CHARACTERSATADDRESSSPECIFIEDINA0.(*…LEADINGZEROSARECONVERTEDTOSPACES.+*…THEFIELDLENGTH(NO.CHARS)ISSPECIFIED *…IND1INTHECALLINGSEQUENCE.**‚CALLINGSEQUENCE:!*…MOVE.L,D0*…MOVE.L,D11*…MOVE.L,A0*…BSRBINDECFJ* *‚RETURNS:*…D0=0=>GOODCONVERSION**‚REGSUSED:‚01234567 *ŠDƒ****ŠAƒ*****7TENS†DC.Lƒ10000000,1000000,100000,10000,1000,100,10,1,0**$BINDECFJ‚MOVE.L#8,D2ŽMAXNO.DIGITSŠSUB.L‚D1,D2ŽNO.DIGITSTOSKIP!ŠBMI.S‚BINDECF5‹BRANCHERROREXITŠLSL.L‚#2,D2ŽDOUBLEWORDLENGTHŠLEA„TENS(PC),A1ŒSTARTOFTABLE"ŠADD.L‚D2,A1ŽADJUSTFORDIFFERENCE&ŠMOVE.W#'‚',D2‹INITIALIZEACCUMULATOR%BINDECF1‚SUB.L‚(A1),D0ŒSUBTRACT10**NŠBCS.S‚BINDECF2‹BRANCHTOOBIG*ŠADD.W‚#1,D2ŽINCREMENTCURRENTDIGITCOUNTŠBRA„BINDECF1‹CONTINUE)BINDECF2‚ADD.L‚(A1)+,D0‹RESTORE,ADVPNTRŠTST.L‚(A1)TESTDONEŠBEQ.S‚BINDECF4‹BRANCHDONE ŠCMP.W‚#'‚',D2‹LEADINGZEROTEST!ŠBEQ.S‚BINDECF3‹BRANCHSTILLZERO#ŠADD.B‚#$10,D2ŒBRINGTOASCIIDIGIT%BINDECF3‚MOVE.BD2,(A0)+‹DEPOSITCHARŠLSL„#8,D2ŽSAVECHARDEPOSITED#ŠMOVE.B#$20,D2ŒRESTORELSTOSPACEŠBRA„BINDECF1‹CONTINUE4BINDECF4‚ADD.B‚#$10,D2ŒLASTONEBECOMESDIGITALWAYS"ŠMOVE.BD2,(A0)+‹DEPOSITLASTCHAR'ŠTST.L‚D0‘SETCONDITIONCODE,0IFGOOD BINDECF5‚RTS*ŠPAGEPROG_SZE‚EQU„*-PBA ŠEND„BEGPROCéééé  é=/* =/*†CREF.LF=/*%=/* Link chain file to create CREF.LO=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to CREF.LL=/*=/IFC \1 ƒ=ARGCREF.LL=/ENDIF=/*=LINK ,CREF.LO,\1;HAMIXS ATTRIBUTES P INPUT CREF.ROLIB CREF.ILIB.ROLIB 0.&.PDOLRLIB.ROLIB 0.&.PASVMDOS.ROEND=/*=ENDéééééé™=/* =/*†CREF.PF=/*&=/* Chain file to compile CREF utility=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to CREF.LS=/*=/IFC \1 ƒ=ARGCREF.LS=/ENDIF=/* =PASCAL CREF.SA,CREF.PC,TEMP1.LS=/*{ Included files are:=/*ƒ--none--=/*}=PASCAL2 CREF.PC,CREF.RO=/*=COPY TEMP1.LS,TEMP2.LS;Y=/*'=ASM CREF.ILIB.SA,CREF.ILIB.RO,TEMP1.LS=/*{ Included files are:=/*ƒ9995.&.FIO.EQ=/*}=/*=COPY TEMP1.LS,TEMP2.LS;A=COPY TEMP2.LS,\1;Y =DEL TEMP1.LS =DEL TEMP2.LS=/*=ENDééé  éé¢/PROGRAM cref(output,symnames,filenames,outfil);L{**************************************************************************}{S.Ball-March1983¶}6{Thisprogramwillprintacross-referencelisting:—}#{=crefP1,P2,P3;K,Z=??,L,M='x-y'ª}{Ê} {ƒWhereÂ}>{‰P1isafilecontainingsymbolnames(maxlengthifstring‡}{Œlengthdefinedinsymtype).£}{Ê}?{‰P2isafilecontainingalistoffilenames(maxlengthis†}%{Œstringlengthdefinedinstrtype.}{Ê}&{‰P3islistingfileordevicename.Ÿ}{Ê}<{‰Option'K'isusedtocausethecrefprogramtofindthe‰}<{‹occurranceofastringwhetheritisupperorlowercase‡}<{‹letters.‚Ifoption'K'isnotincluded,crefwillsearch†}6{‹forthestringasitwasenteredintotheP1file.}{Ê}@{‰Option'L'willcausethelineimagewhereamatchwasfound…}?{‹tobeprintedalongwiththelinenumberofthelineinthe„}={‹file.‚Ifoption'L'isnotincluded,onlythelinenumber…}{‹willbedisplayed.­}{Ê}>{‰Option'M=x-y'allowsonetodefineleftandrightmargins‡};{‹(horizontalrange)withinthesourcefile.‚Herexwould‡};{‹beanintegerspecifyingtheleftmarginandywouldbeˆ}:{‹anintegerspecifyingtherightmargin.‚XREFwillonlyˆ}>{‹searchwithintheboundariesforamatch.‚Ifnotspecified„}<{‹thedefaultvalueforxis1andthedefaultvaluefory‡} {‹is80.¹}{Ê} {ƒExample:¿}!{ŒP1maycontainthefollowing:¡} {‘'DOG'´} {‘'CAT'´} {‘/HORSE'S/°} {‘'PIG'´}<{ŒNote:Onlyonesymbolnameperline.‚Symboldelimeteris…}4{”thefirstnon-blankcharacterfoundontheline.†}{Ê}!{ŒP2maycontainthefollowing:¡} {’ZIP.SA²} {’ZAPPER.CF¯} {’FARM.LS±}:{ŒNote:Thefilenamesmustbeonetoalineandmustbeˆ}{”theonlythingontheline.›}{Ê}.{ŒP3maycontain#PRorCROSS.LSforexample”}{Ê}F{Becausethecrossreferencelistismaintainedentirelyinmemory,‡}E{ƒa'Z='optionmayneedtobespecifiedifthesymbolorfilelist†}{ƒisverylarge.¹}{Ê}«7´e¼fÄiÌcÔkÜL{--------------------------------------------------------------------------}{Ê}1{$S=51200ŒSetthesizeofthestackheapto50K‘}{Ê}L{**************************************************************************} $CONSTlinemax…=‚60;Œ{linesperpage})†linesize„=‚80;Œ{linesizeincharacters} TYPE‚strtype…=‚STRING[30];†symtype…=‚STRING[10];†str80‡=‚STRING[linesize];†integer2„=-32768..32767;6†options…=ARRAY['A'..'Z']OFinteger2;ƒ{optionarray} †lrecˆ=‚RECORD˜lnum…:‚integer;˜lptr…:‚^lrec;•END; †frecˆ=‚RECORD˜fil†:‚strtype;˜fptr…:‚^frec;˜lptr…:‚^lrec;•END; †srecˆ=‚RECORD˜sym†:‚symtype;˜ref†:‚boolean;˜sptr…:‚^srec;˜fptr…:‚^frec;•END; †symrec†=‚RECORD˜sym†:‚symtype;˜ptr†:‚^symrec;•END; †filrec†=‚RECORD˜fil†:‚strtype;˜ptr†:‚^filrec;•END; †symptr†=‚^symrec;†filptr†=‚^filrec; VARƒfilenamesƒ:‚text;†symnames„:‚text;†outfil†:‚text;†fname‡:‚strtype;†shead‡:‚^srec;†fhead‡:‚^frec;†frefhead„:‚fi lptr;†linecnt…:‚integer;†optsˆ:‚options; †c,c2ˆ:‚char;†leftˆ:‚integer;†right‡:‚integer;†cline‡:‚str80; †i‹:‚integer; 0PROCEDURE p$options(VAR opts: options); FORWARD; 0PROCEDURE p$setdiag(diagreg: integer2); FORWARD; 4PROCEDURE i$pos(rec: integer; var f: text); FORWARD; #FUNCTION p$comline: str80; FORWARD; *FUNCTION upper1(stringbuff: str80): str80; VAR ƒi…:integer;ƒLtoU‚:integer; BEGINLtoU := ord('A') - ord('a');#FOR i := 1 to length(stringbuff) DO5ƒIF(stringbuff[i]>='a')and(stringbuff[i]<='z')ƒTHEN1†stringbuff[i]:=chr(ord(stringbuff[i])+LtoU);ƒupper1:=stringbuff;END; .FUNCTION upper2(symbolbuff: symtype): symtype; VAR ƒi…:integer;ƒLtoU‚:integer; BEGINLtoU := ord('A') - ord('a');#FOR i := 1 to length(symbolbuff) DO5ƒIF(symbolbuff[i]>='a')and(symbolbuff[i]<='z')ƒTHEN1†symbolbuff[i]:=chr(ord(symbolbuff[i])+LtoU);ƒupper2:=symbolbuff;END; PROCEDURE breakcheck;ƒBEGINƒlinecnt:=linecnt+1;ƒIFlinecnt>linemaxƒTHEN†BEGIN†page(outfil);†writeln(outfil);†writeln(outfil);†linecnt:=2;†END;ƒEND; PROCEDURE getsym(VAR s:symtype);ƒBEGIN ƒc:='';,ƒWHILE(NOTeoln(symnames))AND(c='')DO*†read(symnames,c);™{findsymboldelimeter} ƒs:='';/ƒread(symnames,c2);›{firstcharacterofsymbol}ƒWHILEc<>c2DO†BEGIN,†s:=concat(s,c2);˜{tasknewsymboltoend}†read(symnames,c2)†ENDƒEND;{getsym} 3FUNCTION deconv(VAR i:integer; str:str80): integer;ƒVARƒj:integer; ‰q:boolean;ƒBEGINƒj:=0; ƒq:=false;ƒWHILENOTqDO†BEGIN†q:=i=length(str)+1; †IFNOTq†THEN‰BEGIN!‰q:=NOT(str[i]IN['0'..'9']); ‰IFNOTq‰THEN&Œj:=(10*j)+ord(str[i])-ord('0');‰END; †i:=i+1;†END; ƒdeconv:=j;ƒEND; PROCEDURE initialize; VARƒtptr…:‚^srec;†pptr…:‚^srec; ƒBEGIN{initialize}ƒp$setdiag(0);ƒp$options(opts);ƒreset(filenames);ƒreset(symnames);ƒlinecnt:=linemax;ƒrewrite(outfil); ƒleft:=1;ƒright:=linesize;ƒcline:=p$comline;4ƒwriteln(outfil,'Commandline=',cline);breakcheck;ƒi:=pos(cline,'M='''); ƒIFi<>0ƒTHEN†BEGIN †i:=i+3;†left:=deconv(i,cline);†right:=deconv(i,cline);†END;ƒshead:=nil;ƒfhead:=nil; ƒtptr‚:=nil;ƒfrefhead:=nil;ƒifnoteof(symnames)ƒthen†BEGIN'†writeln(output,'processingsymbols:');2†writeln(outfil,'processingsymbols:');breakcheck;†writeln(output);†writeln(outfil);breakcheck; †new(shead);†getsym(shead^.sym);†readln(symnames);†writeln(output,shead^.sym);'†writeln(outfil,shead^.sym);breakcheck;†shead^.ref:=false;†shead^.sptr:=nil;†shead^.fptr:=nil;†pptr:=shead;†END;ƒWHILENOTeof(symnames)DO†BEGIN †new(tptr);+†getsym(tptr^.sym);’{fillinsymbolname}†readln(symnames);†writeln(output,tptr^.sym);&†writeln(outfil,tptr^.sym);breakcheck;.†pptr^.sptr:=tptr;‘{linkintosymbollist}†tptr^.ref‚:=false;†tptr^.fptr:=nil;†tptr^.sptr:=nil;†pptr:=tptr;†END;ƒEND;‚{initialize}  !PROCEDURE process(fname:strtype); VARƒfil†:‚text;4†strbuff‚:‚STRING[132];†{forreadinglinefromfile}†psptr„:‚^srec;†pfptr„:‚^frec;†ofptr„:‚^frec;†plptr„:‚^lrec;†olptr„:‚^lrec;$†lcnt…:‚integer;Š{filelinecounter}†spos…:‚integer;†q2‡:‚boolean; 6ƒPROCEDUREinsert(VARsym:symtype;VARhead:symptr);ƒVARƒptr1:symptr;ƒBEGIN{insert}ƒIFhead=nilƒTHEN†BEGIN †new(head);†head^.ptr:=nil;†head^.sym:=sym;†ENDƒELSE†BEGIN†ptr1:=head;†WHILEptr1^.ptr<>nilDO‰ptr1:=ptr1^.ptr;†new(ptr1^.ptr);†ptr1^.ptr^.ptr:=nil;†ptr1^.ptr^.sym:=sym;†END;ƒEND;{insert} 7ƒPROCEDUREinsertf(VARfym:strtype;VARhead:filptr);ƒVARƒptr1:filptr;ƒBEGIN{insertf}ƒIFhead=nilƒTHEN†BEGIN †new(head);†head^.ptr:=nil;†head^.fil:=fym;†ENDƒELSE†BEGIN†ptr1:=head;†WHILEptr1^.ptr<>nilDO‰ptr1:=ptr1^.ptr;†new(ptr1^.ptr);†ptr1^.ptr^. ptr:=nil;†ptr1^.ptr^.fil:=fym;†END;ƒEND;{insertf} ƒBEGIN{process}+ƒwriteln(output,'Processingfile:‚',fname);6ƒwriteln(outfil,'Processingfile:‚',fname);breakcheck;ƒreset(fil,fname); ƒlcnt:=0;ƒWHILENOTeof(fil)DO†BEGIN†readln(fil,strbuff);,†strbuff:=‚copy(strbuff,left,right-left+1); †strbuff:=concat(strbuff,'');†lcnt:=lcnt+1;†psptr:=shead;†pfptr:=psptr^.fptr;†{checklineforsymbol}†WHILEpsptr<>nilDO‰BEGIN‰IFopts['K']<>0‰THEN0Œspos:=pos(upper1(strbuff),upper2(psptr^.sym))‰ELSE!Œspos:=pos(strbuff,psptr^.sym); ‰IFspos<>0‰THENŒBEGIN{foundamatch}Œinsertf(fname,frefhead);)Œwriteln(output,'ˆ','found',psptr^.sym);Œpsptr^.ref:=true;Œofptr:=pfptr; Œq2:=false;ŒWHILENOTq2DOBEGINq2:=pfptr=nil; IFNOTq2THEN’BEGIN’ofptr:=pfptr;’q2:=pfptr^.fil=fname; ’IFNOTq2’THEN1•pfptr:=pfptr^.fptr;ƒ{linktonextfilename}’END; END;{WHILE}ŒIFpfptr=nilŒTHENBEGIN new(pfptr);1pfptr^.fil:=fname;Š{newfilenameinsertion}pfptr^.fptr:=nil;pfptr^.lptr:=nil;IFofptr=nilTHEN4’psptr^.fptr:=pfptr‡{linkfilerecordontolist}ELSE’ofptr^.fptr:=pfptr; END;{THEN}ŒIFpfptr^.lptr=nilŒTHENBEGIN0new(pfptr^.lptr);{linkonfirstlinenumber}pfptr^.lptr^.lptr:=nil;pfptr^.lptr^.lnum:=lcnt;ENDŒELSEBEGIN6plptr:=pfptr^.lptr;‰{findplacetolinklinenbr}WHILEplptr<>nilDO’BEGIN’olptr:=plptr;’plptr:=plptr^.lptr;’END;+new(plptr);“{linkonnon-firstlinenbr}plptr^.lptr:=nil;plptr^.lnum:=lcnt;olptr^.lptr:=plptr;END;{ELSE} ŒEND;{THEN}‰psptr:=psptr^.sptr;‰pfptr:=psptr^.fptr; ‰END;{WHILE} †END;{WHILE} ƒEND;{process}  PROCEDURE list; nil†THEN‰BEGIN‰reset(fil,lfptr^.fil); ‰rec:=0;‰WHILEllptr<>nilDOŒBEGINŒIFllptr^.lnum-2<0ŒTHEN(reset(fil)‘{1strecordiswhatwewant}ŒELSE7i$pos(llptr^.lnum-2,fil);‚{wewantotherthan1strec}Œreadln(fil,buff);Œrec:=llptr^.lnum-1;&Œwriteln(outfil,'œ',rec+1:5,'!',buff); Œbreakcheck;Œllptr:=llptr^.lptr;ŒEND; ‰END;{THEN}†END;{lprocess}  ƒBEGIN{list}ƒwriteln(output);2ƒwriteln(output,'Crossreferencebeingproduced');#ƒlspace:=(colcnt-26)DIV(lsize);ƒlinecnt:=linemax+1; ƒbreakcheck;=ƒwriteln(outfil,'symbolˆ','fileŠ','linenumbers');breakcheck;ƒlsptr:=shead;ƒWHILElsptr<>nilDO†BEGIN†writeln(outfil);breakcheck;A†writeln(outfil,'‚',lsptr^.sym);breakcheck;„{writesymbolname}†lfptr:=lsptr^.fptr;†WHILElfptr<>nilDO‰BEGIN7‰writeln(outfil,'Ž',lfptr^.fil);breakcheck;{filename}‰llptr:=lfptr^.lptr;‰IFopts['L']=0‰THEN ŒBEGIN™{'L'optionNOTselected}ŒWHILEllptr<>nilDOBEGINwrite(outfil,'œ');i:=1;)WHILE(i<=lsize)AND(llptr<>nil)DO’BEGIN’IFllptr<>nil’THEN•BEGIN"•write(outfil,llptr^.lnum:lspace);•llptr:=llptr^.lptr; •i:=i+1; •END;{THEN}’END;{WHILEi<=lsize}’writeln(outfil);breakcheck;END‚{WHILEllprt<>nil} ŒEND{THEN}‰ELSE Œlprocess;•{'L'optionselected}‰lfptr:=lfptr^.fptr;‰END;{WHILElfptr<>nil}†lsptr:=lsptr^.sptr;†END;{WHILElfstr<>nil}ƒwriteln(outfil);breakcheck; ƒq:=false;ƒlsptr:=shead;ƒWHILElsptr<>nilDO†BEGIN†IFNOTlsptr^.ref†THEN‰BEGIN ‰IFNOTq‰THENŒBEGIN Œq:=true;:Œwriteln(outfil,'Non-referencedsymbolsare:');breakcheck;Œwriteln(outfil);breakcheck;Œp$setdiag(16#1000+1);ŒEND;'‰writeln(outfil,lsptr^.sym);breakcheck;‰END;†lsptr:=lsptr^.spt r;†END; ƒIFNOTqƒTHEN:†writeln(outfil,'Allsymbolswerereferenced');breakcheck;ƒwriteln(outfil);breakcheck;ƒreset(filenames); ƒq2:=false;ƒreadln(filenames,tsym); ƒq3:=false;ƒWHILENOTq3DO†BEGIN†q3:=eof(filenames);†symp:=frefhead; †q:=false;†WHILENOTqDO‰BEGIN‰IFsymp=nil‰THENŒBEGIN Œq:=true; ŒIFNOTq2ŒTHENBEGIN q2:=true;8writeln(outfil,'Non-referencedfilesare:');breakcheck;writeln(outfil);breakcheck;p$setdiag(16#1000+1);END;!Œwriteln(outfil,tsym);breakcheck;ŒEND‰ELSEŒIFsymp^.fil=tsymŒTHEN q:=trueŒELSEsymp:=symp^.ptr‰END; †IFNOTq3†THEN‰readln(filenames,tsym);†END; ƒIFnotq2ƒTHEN8†writeln(outfil,'Allfileswerereferenced');breakcheck; ƒEND;{list}  BEGIN {main} initialize;WHILE NOT eof(filenames) DOƒBEGINƒreadln(filenames,fname);ƒi:=1;ƒWHILEi<=length(fname)DO†IFfname[i]=''THEN‰fname:=delete(fname,i,1)†ELSE ‰i:=i+1;†IFfname<>''THEN‰process(fname);ƒEND;list;END.ééééééé†PAGE***…CRTEDITDATASECTION* SECTION 0*DATASG EQU * START OF DATA SEGMENT/SECTION*'*‚RESERVEMEMORYFORUNINITIALIZEDDATA*$DC.B'0222854'„RevisionIdentifier DS.B DATASGL-8**,*‚SETINITIALIZEDDATATHEWAYITWASMAPPED* *‚SRCDBS:‚DC.L0* *‚LRECRD: DC.L 0* *‚STKPTR: DC.L 0* *‚EXBSEG:DC.L0†TASKNAME DC.L 0 SESSION DC.W $2000 DC.W 0 DC.L 'EXBS' SEGMENT NAME DC.L 0 LOGICAL ADDRESS DC.L 0 LENGTH/END* *‚EDTFHS:B*‚ALLOCATE/ASSIGN/CLOSESCRATCHFILEPARAMETERBLOCKFORFHSCALLS*‡DC.L0FHSCMD,FHSOPT DC.B 0 STATUS DC.B 0 LUN2†DC.L'„'TEMPORARYFILEVOLUME(TEMPORARYVOLUME) DC.W -1 USER NUMBERDC.L'„'CATALOG DC.L'„'DC.L'&ƒ'TEMPORARYFILENAME DC.L'„'DC.W'‚'EXTENSIONDC.W‚0RESERVED DC.W 0 WRITE/READ CODE) DC.W VRLFIL VRL FILE (RECORD LENGTH = 0) DC.B 0 RESERVED†DC.BKEYSIZKEYSIZE!DC.WDEFSIZ‚FAB,DATABLOCKSIZE1‡DC.LFMSDBASTARTOFSHAREDDATABUFFER(FMSDBS)% ‡DC.L0ENDOFSHAREDBUFFER(FMSDBE) DC.L 1 SEGMENT NAME PAGE*!FMSPKT‚DS.B‚22†FMSCOMMANDPACKET)FMSFILES‚DS.B‚52„FMSQUALIFIEDFILENAMES$FMSOPT„DC.B‚0…FMSOUTPUTFILEOPTION*+*FMSOTRTN‚CONTAINSOPTIONBITMAPFOROPEN**‚FMSOPTISAVAILABLEFORFUTUREADDITIONS.*‚BITMAPASFOLLOWS:$1=DEFAULTRECORDFORMAT*–$2=SEQUENTIALFORMAT*–$4=INDEXEDFORMAT,*–$8=KOPTION,NOCHANGESALLOWEDTOTHEFILE*–$10=NOLINENUMBERS/*„$11=DEFAULT,NOLINE#'S,DEFAULTRECORDFORMAT*5FMSOTRTN‚DC.B$11„FMSOUTPUTFILERETURN(NEWOROLD)ŠDS.W‚1…NOTUSEDNOW**"INBUF‚DS.B‚CRTLEN‚CRTINPUTBUFFER4FMSDATAEQU‚INBUF+CRTDATA…ADDRESSOFFMSDATARECORD$OUTBUF‚COMLINE‚250ƒCRTOUTPUTBUFFER1CMDBUF‚EQUƒOUTBUF…INPUTCOMMANDBUFFERFORLOADER)PROCBUFDS.B$60‰PROCEEDI/OINPUTBUFFER.CRTLNG‚DC.L‚0ŠLENGTHOFPACKET-RETURNEDBYIOS>CHKPCTDC.W0‹COUNT#OFFILEUPDATESFOROCCAS.CHECKPOINTING*CRFLAGDC.B0‹FLAGSUSEDBYCRTLSANDPAGETRUN DC.B 0 TRUNCATE FLAG*äUíGõIýMA CV9%<->5V=-*ˆBITFLAGSFORCRFLAG(CARRIAGERETURNFLAG)FIXSF EQU 1 FIX SCREEN FLAG BIT"REPF EQU 2 REPLACE RECORD FLAG BITINSF EQU 3 INSERT FLAG BIT#CRF EQU 4 DOING PROCEED IO FLAG BIT&FILEF EQU 5 DOING FILE UPDATE FLAG BIT%BLKF EQU 6 INSERT BLANK LINE FLAG BIT PAGE'CRTIOP EQU * PROCEED IO PARAMETER BLOCK DC.W IOOWIN OUTPUT WITH INPUT7 DC.W IOPPRO+IOPIMG+IOPINM+IOPNEC+IOPBRK+IOPCAD OPTIONS DC.B 0,CRTLUN,0,0 DC.L 0,0,0,$60 DC.L 0 IO COMPLETION ADDRESS#* READ EVENT RECEIVING AREA ADDRESS(IOPEVNT DC.L 0,0,0 RECEIVING AREA 011885*#CRTIOS‚EQU‚*…CRTIOSPARAMETERBLOCK ˆDC.W‚0,0ˆDC.B‚0,CRTLUN,0,0ˆDC.L‚0,0,0,0,0,03EDITVOLN‚DC.L‚0„VOLUMENAME„INITIALREGISTERVALUES3EDITUSER‚DC.W‚0†USERNUMBER‚INITIALREGISTERVALUES2EDTCAT‚DC.L‚0‡CATALOGNAME‚INITIALREGISTERVALUES3EDTCAT1DC.L‚0‡CATALOGNAME‚INITIALREGISTERVALUES3EDITLUNƒDC.L‚0…LUNFROMSCT‚INITIALREGISTERVALUES*IMESS1‚DC.B‚'VERSAdosEDITOR‚RELEASE‚4.40'IMESS1E‚EQU‚*-1‡DS0-IMESS2‚DC.B‚'Copyright1984byMotorolaInc.'IMESS2E‚EQU‚*-1‡DS0MESSDON‚DC.B‚'EDITDONE'MESSDONE‚EQU‚*-1‡DS0$OUT23‚DC.B‚WRTABS,STRT,LINE23,POSONE'‡DC.B‚'F1…LINE…F3‡F4‡F5‡F6†F7'011985‡DC.B‚'†F11‡F12'‡DC.B‚ENDOD,0,0‡DS0$OUT24‚DC.B‚WRTABS,STRT,LINE24,POSONE‡DC.B‚'MODEŒPAGE^„PAGE'3‡DC.B‚$76,'„LINE^„LINE',$76,'„DUP„SETTABƒDELTAB'‡DC.B‚ENDOD,0,0‡DS0 OUTVOLƒDC.L0OUTUSER‚DC.W0 OUTCAT‚DC.L0OUTCAT1 DC.L 0OUTNAME‚DC.L0OUTNAME1 DC.L 0 OUTEXT‚DC.W0,ACSMESS‚DC.B‚'ERROR-RETRIEVEATTRIBUTES‚D0='ACSMESSC‚DC.L'„','„'ACSMESSE‚EQU‚*-1!IOSMESS‚DC.B‚'ERROR-IOSCALLƒD0='IOSMESSCDC.L'„','„'IOSMESSE‚EQU‚*-1'RECTOOL DC.B 'RE-INPUT-RECORD TOO LONG'RECTOOLE EQU *-1IOSOUT‚EQU‚*ˆIOSPARAMTERBLOCK†DC.W‚2,0‡WRITEREQUEST,ASCII†DC.B0 IOLUNDC.B‚CRTLUN,0,0„STATUS,LUN†DC.L‚0#IOSTART‚DC.L‚0ŠBUFFERSTARTADDRESS!IOEND‚DC.L‚0,0ŠBUFFERENDADDRESS…DC.L‚0ŽCOMPLETIONADDRESS PAGE3****************************************************-*„TERMTBL‚TERMINATINGCODESRETURNEDBYCRTIN#*ŒDEFINESSCREENACTIONTOBETAKEN*„ENTRYSTRUCTURE: *ŠDC.W‚CODE2*ŠDC.W‚OFFSETINTOTHEBRANCHTABLEFORTHEACTION* *„TERMTBLL:#BYTESOFEACHENTRY*7********************************************************)TERMTBL‚EQU‚*‡TERMINATINGCHARACTERTABLETINSLIN‚DC.W‚$D6ƒINSERTLINE‰DC.W‚0†INSLINTDELINE‚DC.W‚$D7ƒDELETELINE‰DC.W‚1…DELINE‰DC.W‚$0B‚CURSORUPONELINE‰DC.W‚2„UPAROW‰DC.W‚$C2„CURSORDOWNONELINE‰DC.W‚3„DNAROW"‰DC.W‚$DFƒCRTLINESEND-SUBFORCR ‰DC.W‚4„CRTLS‰DC.W‚$0ALINEFEED‰DC.W‚5„DNAROW)‰DC.W‚$A0…REVERSEEDITMODEPAGE<>COMMAND ‰DC.W‚6„FKEY1&‰DC.W‚$A2…SCROLLSCREENFORWARD1PAGE ‰DC.W‚7„FKEY3#‰DC.W‚$A3„SCROLLSCREENBACK1PAGE ‰DC.W‚8…FKEY4& ‰DC.W‚$A4ƒSCROLLSCREENFORWARD1LINE ‰DC.W‚9…FKEY5#‰DC.W‚$A5„SCROLLSCREENBACK1LINE‰DC.W‚10„FKEY6‰DC.W‚$C1ˆCURSORUP1LINE‰DC.W‚2…UPAROW‰DC.W‚$C0ˆHOMECURSOR ‰DC.W‚11‰HOME‰DC.W‚$D8‚HOMECURSOR ‰DC.W‚11ƒHOME‰DC.W‚$D9…SENDPAGECODE3‰DC.W‚12„PAGE-CARRIAGERETURNATENDOFSCREENPAGE‰DC.W‚$AA…SETTABSTOP‰DC.W‚13…FKEY11‰DC.W‚$AB…DELETETABSTOP‰DC.W‚14‡FKEY12TERMTBLE‚EQU‚*„ENDOFTABLE4TERMTBLL‚EQU‚4ƒNO.OFBYTESOFEACHTERMTABLEENTRYˆPAGE9**********************************************************'*…CMDTBL1‚TABLEOF1CHARACTERCOMMANDS(*ŽRECOGNIZEDDURINGCOMMANDMODEEDITING**„ENTRYSTRUCTURE:*ŽDC.W‚VALIDCOMMAND-UPPERCASE*ŽDC.W‚VALIDCOMMAND-LOWERCASE'*ŽDC.W‚COMMANDOFFSETINTOBRANCHTABLE$*„CMDTBL1L:#BYTESFOREACHENTRY(6);*********************************************************** CMDTBL1‚EQU‚*‰DC.W‚'C','c',2ƒCHANGE‰DC.W‚'D','d',5ƒDOWN‰DC.W‚'F','f',9ƒFIND‰DC.W'I','i',10ƒINSERT‰DC.W'L','l',12ƒLIST'‰DC.W'Q','q',16ƒQUITƒ<<<<>>>>‰DC.W‚'R','r',17‚RANGE‰DC.W‚'U','u',23‚UP‰DC.W'V','v',20ƒVERIFY‰DC.W‚'X','x',22‚XTRACTCMDTBL1E‚EQU‚* CMDTBL1L‚EQU‚6…#BYTESPERENTRY PAGE;************************************************************'*ƒCMDTBL4‚TABLEOF4CHARACTERCOMMANDS(*ŒRECOGNIZEDDURINGCOMMANDMODEEDITING*ƒENTRYSTRUCTURE:*‰DC.L‚VALIDCOMMAND-UPPERCASE*‰DC.L‚VALIDCOMMAND-LOWERCASE/*‰DC.W‚COMMANDROUTINEOFFSETINTOBRANCHTABLE *ƒCMDBL4L:#BYTESPERENTRY(10)<************************************************************ CMDTBL4‚EQU‚*‰DC.L‚'ADUP','adup'ˆADUPLCT‰DC.W‚0”ADUPLCT‰DC.L‚'AMOV','amov'ˆAMOVE ‰DC.W‚1”AMOVE‰DC.L‚'CHAN','chan'ˆCHANGE‰DC.W‚2”CHANGE‰DC.L‚'COLM','colm'ˆCOLM ‰DC.W‚3”COLM‰DC.L‚'DELE','dele'ˆDELETE‰DC.W‚4”DELETE‰DC.L‚'DOWN','down'ˆDOWN ‰DC.W‚5”DOWN‰DC.L‚'DTAB','dtab'ˆDTAB ‰DC.W‚6”DTAB‰DC.L‚'DUPL','dupl'ˆDUPLCT‰DC.W‚7”DUPLCT‰DC.L‚'EXTE','exte'ˆEXTEND‰DC.W‚8”EXTEND‰DC.L‚'FIND','find'ˆFIND ‰DC.W‚9”FIND‰DC.L‚'INSE','inse'ˆINSERT‰DC.W‚10“INSERT‰DC.L‚'LINE','line'ˆLINEC‰DC.Wƒ11’LINEC‰DC.L‚'LIST','list'ˆLIST ‰DC.W‚12“LIST‰DC.L‚'MERG','merg'ˆMERGE‰DC.W‚13“MERGE‰DC.L‚'MOVE','move'ˆMOVE ‰DC.W‚14“MOVE‰DC.L‚'PRIN','prin'ˆPRINT‰DC.W‚15“PRINT‰DC.L‚'QUIT','quit'ˆQUIT ‰DC.W‚16“QUIT‰DC.L‚'RANG','rang'ˆRANGE‰DC.W‚17“RANGE‰DC.L‚'SAVE','save'ˆSAVE ‰DC.Wƒ18’SAVE‰DC.L‚'STAB','stab'ˆSTAB ‰DC.Wƒ19’STAB‰DC.L‚'VERI','veri'ˆVERIFY‰DC.Wƒ20’VERIFY‰DC.Bƒ0,'TAB',0,'tab'…TAB ‰DC.Wƒ21’TAB‰DC.Bƒ0,'DEL',0,'del'…DELETE‰DC.W‚4”DELETE‰DC.L‚'XTRA','xtra'ˆXTRACT‰DC.Wƒ22’XTRACT‰DC.Bƒ0,'DUP',0,'dup'…DUPLCT‰DC.Wƒ7“DUPLCT‰DC.W0,'EX',0,'ex'‰EXTEND‰DC.Wƒ8“EXTEND‰DC.W0,'UP',0,'up'‰UP ‰DC.W‚23“UPCMDTBL4E‚EQU‚*CMDTBL4L‚EQU‚10 PAGE9**********************************************************COMMAND DATA AREA<*EACH COMMAND LIST ENTRY IS MADE UP OF 2 BYTES. THE 1ST BYTE:*IS EITHER A CHARACTER USED AS A COMMAND LINE DELIMITER OR4*AS AN OFFSET TO BE USED THRU A TABLE TO JUMP TO THED*REQUIRED ROUTINE TO PROCESS THAT LIST ENTRY. THE 2ND BYTE IS A MASK%*TO BE USED FOR FLAG BITS AS FOLLOWS: *‚BIT0:SETFLAG1IFFIELDEXITS*‚BIT1:FIELDREQUIRED#*‚BIT2:FIELDREQUIREDIFFLAG1SET,*‚BIT3:NUMBERRESULTSAVED=4BYTES=BIT3ON&*ˆNUMBERRESULTSAVED=1BYTE=BIT3OFF*‚BIT4:2FIELDSINLISTPB*.*EQUATES FOR MASK BYTE(2ND BYTE IN LIST ENTRY)*NOFLG‚EQU‚0ƒNOFLAGSSET$SF1„EQU‚1ƒSETFLAG1IFFIELDPRESENTREQD EQU 2 FIELD REQUIRED%IF1 EQU 4 FIELD REQUIRED IF FLAG1 SET%LONG EQU 8 FIELD IN LISTPB IS 4 BYTES,TWO EQU 16 2 FIELDS OF SAME LENGTH IN LISTPB*$*EQUATES FOR COMMAND LIST JUMP TABLE*END EQU 0 END OF LISTSND EQU 1 STRING,NO DELIMITERSNDN EQU 2 NUMBER DASH NUMBERCHAR EQU 3 CHARACTERCNT EQU 4 COUNT SWD EQU 5 STRING WITH DELIMITERSFN EQU 6 FILE NAMENCN EQU 7 NUMBER COMMA NUMBER*8LISTPBDS.L10‚LISTPARAMETERBLOCK,USEDBYALLCOMMANDSA* QUIT LIST PARAMETE R BLOCK STRUCTURE(HI ORDER BIT=1=ENTRY FOUND)*†DS.B1ABORTCHARCTER**QUITL‚DC.BCHAR,NOFLGABORTCHARACTER('A')‡DC.BEND,NOFLGENDOFLIST*$*FIND LIST PARAMETER BLOCK STRUCTURE*(HI ORDER BIT=1=ENTRY FOUND)*DS.L1ƒ1STVERTICALRANGE**DS.L1ƒ2NDVERTICALRANGE *DS.L1ƒ1STHORIZONTALRANGE** *DS.L1ƒ2NDHORIZONTALRANGE***DS.B1ƒTRANSPARENTCHARACTER)*DS.B1ƒCOUNTOR$FFIFINPUTWASA(ALL)"*DS.L1ƒSTARTADDRESSOFSTRING1 *DS.L1ƒENDADDRESSOFSTRING2/*DS.L1ƒCOUNTOR$FFFFFFFFIFINPUTWASA(ALL)*‡*IF'*'FOUND,BIT30=1*†**IF'F'FOUND,BIT30=1*#FINDL DC.B NDN,NOFLG VERTICAL RANGE- DC.B ':',TWO+LONG HORIZONTAL RANGE DELIMITER DC.B NDN,REQD HORIZONTAL RANGE* DC.B ',',NOFLG TRANSPARENT CHAR DELIMITER DC.B CHAR,REQD TRANSPARENT CHAR DC.B ';',NOFLG COUNT DELIMITER+ DC.B CNT,REQD COUNT(OCCURANCE) OR 'A'(ALL)& DC.B SWD,NOFLG STRING WITH DELIMITERS, DC.B CNT,LONG COUNT(REPITITION) OR 'A'(ALL) DC.B END,NOFLG END OF LIST*<* CHANGE LIST PARA BLOCK STRUCTURE(HI-ORDER BIT=ENTRY FOUND)**‚DS.L‚1ƒ1STVERTICALRANGEƒ**‚DS.L‚1ƒ2NDVERTICALRANGE *‚DS.L‚1ƒ1STHORIZONTALRANGE** *‚DS.L‚1ƒ2NDHORIZONTALRANGE***‚DS.B‚1ƒTRANSPARENTCHARACTER*‚DS.B‚1ƒCOUNTOR$FFIF'ALL'"*‚DS.L‚1ƒSTARTADDRESSOFSTRING1 *‚DS.L‚1ƒENDADDRESSOFSTRING1"*‚DS.L‚1ƒSTARTADDRESSOFSTRING2 *‚DS.L‚1ƒENDADDRESSOFSTRING2$*‚DS.L‚1ƒCOUNTOR$FFFFFFFFIF'ALL'6*ˆ*ƒIF'*'FOUNDBIT30WILLBE=1ANDALLOTHERBITS=04*ŒIFMINUSSIGNFOUNDBIT30=1ANDAPOSITIVENUMBER*ŒINOTHERBITS@*‡**ƒIFAN'F'FOUNDBIT30=1ANDANUMBERINTHELOWORDERBITS*"CHGL‚DC.B‚NDN,NOFLG…VERTICALRANGE-†DC.B‚':',TWO+LONG‚HORIZONTALRANGEDELIMITER†DC.B‚NDN,REQD†HORIZONTALRANGE*†DC.B‚',',NOFLG…TRANSPARENTCHARDELIMITER)†DC.B‚CHAR,REQD+SF1‚TRANSPARENTCHARACTER†DC.B‚';',NOFLG†COUNTDELIMITER/†DC.B‚CNT,REQD+SF1ƒCOUNT(OCCURENCE)OR'A'(ALL)$†DC.B‚SWD,IF1ˆSTRINGWITHDELIMITERS&†DC.B‚SWD,NOFLG†STRINGWITHDELIMITERS,†DC.B‚CNT,LONG‡COUNT(REPETITION)OR'A'(ALL)†DC.B‚END,NOFLG†ENDOFLIST*'*ƒDELETELISTPARAMETERBLOCKSTRUCTURE*ƒSAMERULESASFINDANDCHANGE**‚DS.L‚11STVERTICALRANGE*‚DS.L‚12NDVERTICALRANGE*‚DS.L‚11STHORIZONTALRANGE*‚DS.L‚12NDHORIZONTALRANGE*"DELL‚DC.B‚NDN,NOFLG‚VERTICALRANGE-†DC.B‚':',TWO+LONG‚HORIZONTALRANGEDELIMITER†DC.B‚NDN,REQD…HORIZONTALRANGE†DC.B‚END,NOFLG„ENDOFLIST*'*‚EXTENDLISTPARAMETERBLOCKSTRUCTURE*‚SAMERULESASFINDANDCHANGE**‚DS.L‚1‚1STVERTICALRANGE*‚DS.L‚1‚2NDVERTICALRANGE *‚DS.L‚1‚STARTADDRESSOFSTRING*‚DS.L‚1‚ENDADDRESSOFSTRING*#EXTNL‚DC.B‚NDN,NOFLG‚VERTICALRANGE%‡DC.B‚SWD,REQD‚STRINGWITHDELIMITERS‡DC.B‚END,NOFLG‚ENDOFLIST*&*‚RANGELISTPARAMETERBLOCKSTRUCTURE*‚SAMERULESASFINDANDCHANGE**‚DS.L‚1‚1STVERTICALRANGE*‚DS.L‚1‚2NDVERTICALRANGE*‚DS.L‚1‚1STHORIZONTALRANGE*‚DS.L‚1‚2NDHORIZONTALRANGE*RANGL‚EQUƒDELL*†DC.B‚NDN,NOFLG‚VERTICALRANGE.*†DC.B‚':',TWO+LONG‚HORIZONTALRANGEDELIMITER *†DC.B‚NDN,REQD‚HORIZONTALRANGE*†DC.B‚END,NOFLGƒENDOFLIST*$*‚TABLISTPARAMETERBLOCKSTRUCTURE*!*„DS.B20„TABSTOPCOLUMNS,20MAX-*„DS.B1…TABSTOPCHARACTERA-C-F-PTABSTOPS*$TABL‚DC.B‚NCN,NOFLG„TABSTOPS,20MAX*†DC.B‚CHAR,NOFLGƒTABSTOPCHARACTER,1BYTE†DC.B‚END,NOFLG„ENDOFLIST***‚DUPLICATELISTPARAMETERBLOCKSTRUCTURE**‚DS.L11STVERTICALRANGE*‚DS.L12NDVERTICALRANGE*"DUPL‚DC.B‚NDN,NOFLG‚VERTICALRANGE†DC.BEND,NOFLGƒENDOFLIST*&*‚MERGELISTPARAMETERBLOCKSTRUCTURE**‚DC.L‚11STVERTICALRANGE*‚DC.L‚12NDVERTICALRANGE"*‚DC.L‚1STARTADDRESSOFFILENAME *‚DC.L‚1ENDADDRESSOFFILENAME*#MERGLDC.B‚NDN,NOFLGVERTICALRANGE†DC.BFN,REQDFILENAME†DC.BEND,NOFLGENDOFLIST*%*‚MOVELISTPARAMETERBLOCKSTRUCTURE**‚DS.L11STVERTICALRANGE*‚DS.L12NDVERTICALRANGE*MOVEL‚EQU‚DUPL*…DC.BNDN,NOFLGVERTICALRANGE*…DC.BEND,NOFLGENDOFLIST*&*‚PRINTLISTPARAMETERBLOCKSTRUCTURE **‚DS.L11STVERTICALRANGE*‚DS.L12NDVERTICALRANGE%*‚DS.L1STARTADDRESSOFDEVICENAME#*‚DS.L1ENDADDRESSOFDEVICENAME*‚DS.B1SPACINGCHARACTER*#PRNTL DC.B NDN,NOFLG VERTICAL RANGE,†DC.B'#',TWO+LONGDEVICEMNEMONICDELIMITER†DC.BSND,REQD‚DEVICENAME)†DC.BCHAR,NOFLGSPACINGCHAR('D'OR'T')†DC.BEND,NOFLG‚ENDOFLIST*%*‚SAVELISTPARAMETERBLOCKSTRUCTURE**‚DS.L11STVERTICALRANGE*‚DS.L12NDVERTICALRANGE"*‚DS.L1STARTADDRESSOFFILENAME *‚DS.L1ENDADDRESSOFFILENAME*SAVELEQU‚MERGL*…DC.BNDN,NOFLGVERTICALRANGE*…DC.BFN,REQDFILENAME*…DC.BEND,NOFLGENDOFLIST*(*‚EXTRACTLISTPARAMETERBLOCKSTRUCTURE*(*‚DS.B1DELETEEXTRACTBUFFERCHARACTER*EXTRLEQU‚QUITL1*…DC.BCHAR,NOFLGDELETEEXTRACTBUFFERCHAR('A')*…DC.BEND,NOFLGENDOFLIST*'*‚INSERTLISTPARAMETERBLOCKSTRUCTURE*‰SCROLLMODEONLY**ƒDC.L1COUNT* INSL‚DC.BCNT,LONGCOUNT(OFFSET)†DC.BEND,NOFLGENDOFLIST* *‚LISTPARAMETERBLOCKSTRUCTURE*‡SCROLLMODEONLY**‚DS.L11STVERTICALRANGE*‚DS.L12NDVERTICALRANGE*LISTL EQU DUPL*…DC.BNDN,NOFLGVERTICALRANGE*…DC.BEND,NOFLGENDOFLIST*'*‚VERIFYLISTPARAMETERBLOCKSTRUCTURE*‰SCROLLMODEONLY* *‚DS.L1STARTADDRESSOFSTRING*‚DS.L1ENDADDRESSOFSTRING*,VERL DC.B SND,NOFLG STRING NO DELIMITER(OFF)…DC.BEND,NOFLGENDOFLIST4*‚UPANDDOWNCOMMANDLISTPARAMETERBLOCKSTRUCTURE*ŠSCROLLMODEONLY**‚DS.L1COUNT(OFFSET)*UPDNL EQU INSL*…DC.BCNT,LONG4BYTENUMBER*…DC.BEND,NOFLG*4*LIST TABLE FOR PROCESS LIST PARAMETER BLOCK ENTRIES*LISTABLE EQU *+DC.W1‚PROCSND-PROCESSSTRINGNODELIMITER*DC.W2‚PROCNDN-PROCESSNUMBERDASHNUMBER!DC.W3‚PROCHAR-PROCESSCHARACTERDC.W4‚PROCNT-PROCESSCOUNT-DC.W5‚PROCSWD-PROCESSSTRINGWITHDELIMITERDC.W6‚PROCFN-PROCESSFILENAME+DC.W7‚PROCNCN-PROCESSNUMBERCOMMANUMBER LISTBLND EQU * END OF LIST TABLE#LISTBLNG EQU 2 # OF BYTES PER ENTRY FLAG1 DC.B 0NEGFLAG DC.B 0TABFLAG DC.B 0 PAGETABCNTDC.B0ƒ#TABSSETTABCNT1 DC.B 08SHRDEL DC.B 0 SHARE DELIMITER FLAG,1=SHARE,0=DON'T SHAREBRANGSWDC.B0RANGESWITCH‚-1=HAVESAVEDRANGESFROMRANGECOMMAND'LINE‚DC.B‚0‡LASTCRTSCREENLINENUMBER-SVCHGDS.W19ƒSAVECHANGECOMMANDPARA.BLOCK"SVREC DC.L 0 LAST RECORD # CHANGED;SVRANG DS.L 4 SAVED DEFAULT RANGE VALUES FROM RANGE COMMAND-SVRECNT EQU OUTCAT SAVED RECORD NUMBER-CHANGE*SVRECN‚EQUOUTCAT+4‚SAVED#RECORDS-CHANGE#FINDSTGEQUOUT23…SAVEDFINDSTRING SVTABS‚EQUIMESS2„SAVETABSTOPS%CHGSTG‚EQUOUT24ƒSAVEDCHANGESTRINGS#EXTNDSTG‚DS.B‚80‚SAVEEXTENDSTRING6SVLINE‚EQUOUTVOL‚ORIGINALFILELINEFORCHANGECOMMAND3SVCNT‚DC.B0„SAVECOUNTFIELDFORHORIZONTALRANGESCNTHR‚DC.B0ƒSAVECOUNTFIELD*RECHR‚DC.L0‚SAVERECFORHORIZONTALRANGE7RECNHR‚EQUOUTUSERƒSAVE#RECORDSFORHORIZONTALRANGESSVLNG‚DC.B0‚STRINGLENGTHBRKFLG‚DC.B‚0‚BREAKFLAG'NOHR‚DC.B0NOHORIZONTALRANGESWANTED@MSLUNDC.B0„LUNFORMERGEANDSAVECOMMANDS,-1=NOLUNAVAILABLE3*‚HIGH-ORDERBITOFSVEXTON=HAVEANEXTRACTBUFFER=SVEXT‚EQUOUTNAMEƒRECORD#FOREXTRACT,#RECORDSDFOREXTRACT7VERFLG DC.B 0 VERIFY FLAG FF=DISABLE 0=ENABLE (DEFAULT)2SCROLL DC.B 0 FF=IN SCROLL MODE,0=IN CRT PAGE MODE1CHAIN DC.B 0 FF=IN CHAIN MODE 0=NOT IN CHAIN MODE9SVMULFSWDC.B0ƒSAVEMULTIPLEFINDSWITCH,USEDFORBREAKSASQPB DC.L 0,0 ASQ PARA BLOCK3†DC.B5,12„011885‚NEEDLONGERMSGLENGTHFORVME120†DC.L80 †DC.L0,07ATTEVNT EQU ASQPB BREAK EVENT-LENGTH+CODE,DEVICE,STATUSOPTTBL‚DC.B'KLSIAFCPE'ˆPAGE*6*†SCREENMESSAGESFORLINE21USINGSUBROUTINEWRTMESS*OUTERR‚DC.B‚'WHAT?'SNF…DC.B‚'STRINGNOTFOUND'#LISTERR DC.B 'INTERNAL LIST ERROR 'DELNO‚DC.B‚'ŒLINESDELETED'BRKMESS DC.B 'BREAK WAS INPUT 'NOASQDC.B'ASQERROR‚D0='NOASQCDC.B'ˆ'NOASQE EQU *-1%NOBRK DC.B 'CANNOT HANDLE BREAKS D0='NOBRKCDC.B'ˆ'NOBRKE EQU *-1*BRKABT‚DC.B‚'COMMANDABORTEDBYBREAKKEY'LINUM DC.B 'CURRENT LINE IS 'LINUMFDC.B'ˆ'%MESSNR  DC.B 'DEVICE NOT READY' 012184MESSDB DC.B 'DEVICE BUSY '!NOFILE DC.B 'FILE DOESN''T EXIST'ERRMESS DC.B 'ERROR D0= ',ERRMESSCDC.B'ˆ'ƒD0CODE,FMSERROR(GENERAL)%NOMRG DC.B 'ERROR-MERGE NOT EXECUTED'+NOLUN DC.B 'LUN NOT AVAILABLE-NOT EXECUTED'$BUFDEL DC.B 'EXTRACT BUFFER DELETED'*NOBUF DC.B 'EXTRACT BUFFER DOESN''T EXIST'%DATAORM DC.B 'DATA OVERRUN I/O ERROR'FRMER‚DC.B'I/OFRAMINGERROR'!TRUNMSG DC.B 'TRUNCATED RECORDS 'TRUNMSGE EQU *-1-NOREC‚DC.B'INVALIDCOMMAND-NOFILERECORDS'LASTMSGDC.B'‰ISLASTLINE'(TABMSG‚DC.B'MAXIMUM#OFTABSSET(20)'&OPTMSG DC.B 'INVALID OPTION SPECIFIED'OPTMSGE EQU *-1+TERMCHN DC.B 'SYNTAX ERROR-EDIT TERMINATED'TERMCHNE EQU *-11INVCHAR DC.B 'INVALID CHARACTER RECEIVED-REINPUT' PAGE(EMTYFILE‚DC.B‚0†EMPTYFILEFLAG,-1=EMPTY*FSTSW‚DC.B‚1‰FIRSTTIMETOOLDFILESWITCH"SAVED0‚DC.W‚0‰SAVED0FORMESSAGES/TRANS‚DC.B‚0ˆSAVETRANSPARENTCHARACTERFORFMSCOUNT‚DC.B‚0ˆSAVECOUNTFORFMS+REC‚DC.L„0ˆSAVESTARTLOGICALREC#FORFMS5RECN‚EQUOUTEXT†SAVENUMBEROFRECSTOSEARCHFORFMS%RADR‚DC.L‚0‰POINTERTOSTRINGFORFMS"REP‚DC.L‚0ŠREPETITIONFIELD-1=ALL+SVFIND‚EQUIMESS1„SAVEFINDPARAMETERBLOCK FINDSW‚DC.W‚0‡FINDSTRINGSWITCH!SAVEP‚DC.B‚$20†SAVEPROMPTLINE#"MULFSW‚DC.B‚0‡MULTIPLEFINDSWITCH6FILEOPT‚DC.B‚0†FILEOPTIONFLAG‚1=SEQORINDEXEDINPUT'SAVSW‚DC.B‚0‰SAVEFILESWITCHFORCLOSE*"BLANKS‚DC.L‚$20202020…ASCIIBLANKSCURCMD‚DC.B‚0…CURRENTCOMMAND&SAVDEL DC.B 0 SAVE 1ST DELIMITER FOUNDDDISABLE‚DC.B‚0,0,$D8,$D2,$8F,0,0„CLEARSCREEN,ENABLEKB,DISABLEEDITSAVECHG‚DC.B‚0–SAVECRTCHGFLAGAENABLE‚DC.B‚0,0,$8E,$A6,$D8,$90,0,0ƒENABLEEDITMODE,DUP=F7,CLEAR&MAXLINE‚DC.L‚0†NUMBEROFLINESINFILE(FILELINE‚DC.L‚0…CURRENTFILELINENUMBER8TOPLINE‚DC.L‚0†CURRENTFILELINENUMBERATTOPOFSCREEN%FILETYPE‚DC.B‚0…FILETYPE0=OLD‚1=NEW1CURMODE‚DC.B‚0†CURRENTMODE0=COMMAND‚1=PAGEEDITKBON…EQU…$D2‘ENABLEKEYBOARDKBOFF„EQU…$D3‘DISABLEKEYBOARDEMON…EQU…$8E‘ENABLEEDITMODEEMOFF„EQU…$8F‘DISABLEEDITMODEDUP†EQU…$A6‘F7=DUPLICATEKEY"RTNCMDƒEQU…$90‘RETURNCOMMANDMODE=SET†DC.B„EMON,DUP,KBON,RTNCMD,0,0,0,0‚SETINPUTCONTROLBYTESSETENDƒEQU…*-1‘LENGTH!LTRANSƒDC.Bƒ$8D,0‰RETRANSMITCODELTRANSE‚EQU‚*-1LENGTH$SCPTDC.B'E>'ŒSCROLLCOMMANDPROMPT SCPTE EQU *-12INSPTƒDC.B'>',0ˆINSERTCOMMANDPROMPT,SCROLLMODEINSPTE EQU *-13TABPRMTDC.B'?'ˆSTABANDDTABPROMPT-SCROLLMODETABPRMTE EQU *-1ˆDC.B0ŒTOBEEVEN PAGE****************************** FMS ROUTINE DATA AREA*****************************FMSTABLE EQU *‡DC.W1„FMSOPN-OPENCOMMAND‡DC.W2„FMSVCL-CLOSECOMMAND†DC.W3…FMSRD-READCOMMAND†DC.W4…FMSDEL-DELETECOMMAND%‡DC.W5„FMSIRP-INSERT&REPLACECOMMAND%‡DC.W6„FMSIRP-INSERT&REPLACECOMMAND(ˆDC.W7ƒFMSRCH-SEARCHFORSTRINGCOMMANDˆDC.W8ƒFMSPRNT-PRINTCOMMANDƒDC.W‚9‡FMSSAV-SAVECOMMANDDC.W10‰FMSMRG-MERGECOMMANDDC.W11‰FMSMOV-MOVECOMMANDDC.W12‰FMSEXT-EXTRACTCOMMAND.DC.W13‰FMSDEXT-DELETEEXTRACTBUFFERCOMMAND#DC.W14‰FMSCKPT-CHECKPOINTCOMMANDFMSTBLND EQU *FMSTBLNG EQU 2*3SAVOTADD DC.L 0 ADDR OF OUTPUT FILENAME IN CMD LINE+SAVOPTAD DC.L 0 ADDR OF OPTIONS IN CMD LINE*(FMSG10 DC.B 'ILLEGAL FMS COMMAND CODE X'FMSGE10 EQU *-1 FMSG20 DC.B 'COMMAND LINE ERROR'FMSGE20 EQU *-1$FMSG30 DC.B 'ILLEGAL INPUT FILENAME' ‡DC.B'D0='FMSG30CDC.B'ˆ'FMSGE30 EQU *-1&FMSG40 DC.B 'ILLEGAL OUTPUT FILENAME ' ‡DC.B'D0='FMSG40CDC.B'ˆ'FMSGE40 EQU *-1FMSG50 DC.B 'OPEN ERROR' ‡DC.B'D0='FMSG50CDC.B'ˆ'FMSGE50 EQU *-1*FMSG55 DC.B 'INVALID KEYSIZE-OUTPUT FILE 'FMSGE55 EQU *-1FMSG60 DC.B 'CLOSE ERROR ' ‡DC.B'D0='FMSG60CDC.B'ˆ'FMSGE60 EQU *-1‡DC.B'‚NEWEXTENSION='FMSG60EDC.B'ˆ'FMSG60N EQU *-1&FMSG62 DC.B 'INSUFFICIENT DISK SPACE 'FMSGE62 EQU *-1*FMSG63 DC.B 'INSUFFICIENT DIRECTORY SPACE'FMSGE63 EQU *-1FMSG70 DC.B 'READ ERROR' ‡DC.B'D0='FMSG70CDC.B'ˆ'FMSGE70 EQU *-1FMSG80 DC.B 'DELETE ERROR' ‡DC.B‚'D0='FMSG80CDC.B'ˆ'FMSGE80 EQU *-1FMSG90 DC.B 'REPLA CE ERROR ' ‡DC.B'D0='FMSG90CDC.B'ˆ'FMSGE90 EQU *-1FMSG91 DC.B 'INSERT ERROR' ‡DC.B'D0='FMSG91CDC.B'ˆ'FMSGE91 EQU *-1,FMSG95 DC.B '2 LOGICAL UNITS NOT AVAILABLE 'FMSGE95 EQU *-1!FMSG100 DC.B 'RECORD NOT ON FILE'%FMSG200 DC.B 'BOF OR EOF ENCOUNTERED'+FMSG250‚DC.B‚'SEARCHFORSTRINGERRORD0='FMSG250C‚DC.B‚'ˆ'FMSGE250‚EQU‚*-1/FMSG300‚DC.B'OUTPUTFILEEXISTS-SAVENOTDONE'+FMSG360 DC.B 'SAVE ERROR-FILE NOT CREATED '/FMSG380 DC.B 'NO DATA MOVED TO EXTRACT BUFFER '#FMSG400 DC.B 'ERROR-SAVE NOT DONE 'FMSG410 DC.B 'ERROR-D0= 'FMSG410CDC.B'ˆ'FMSG410EDC.B'ˆ' ‰DC.B'=EXT'/FMSG620 DC.B 'INVALID OPTION WITH NEW FILENAME'FMSGE620 EQU *-1FMSG640 DC.B 'USING K OPTION'/FMSG650 DC.B 'NO RECORDS INSERTED-BUFFER FULL ')FMSG660DC.B'‰RECORDSSAVED-BUFFERFULL'*INFHS DC.W 0,0,0 DC.L 0 DC.W 0 DC.L $20202020 DC.L $20202020 DC.L $20202020 DC.L $20202020 DC.W $2020 DC.W 0,0,0 DC.L 0CRTFHS‚EQU‚INFHSOUTFHS DC.W 0,0,0 DC.L 0 DC.W 0 DC.L 0,0,0,0 DC.W 0,0,0,0 DC.L 0*2EDITBUF‚DS.B‚EDITLNG…BUFFERFOR1RECORDFROMFILE'EDITBUFE‚EQU‚*„ENDOF1RECORD‚BUFFER+1* DS0ƒ011985: DS.B 100 SOME FREE SPACE IN CASE EDITBUF OVERFLOWS 011985LCURMSG DC.B WRTABS,STRT,LINE24,POS5 MSG BUFFER FOR CURSOR SPN DISPLAY 011985=CURPSNA DS.B 8 AREA FOR ACTUAL CURSOR POSITION (ASCII) 011985CURMSGE DC.B ENDOD*,CURMSGL EQU *-CURMSG LENGTH OF CURSOR 011985*+PATCHDS.B200‚PATCHAREA‚<<<<<>>>>>*SPAREDC.Bƒ0ƒSPAREBYTE*TERMINALEQU3011185*/IOSPBEQU*‚PARMBLKFORCNFGSTATUSREQ‚011185†DC.L0,0,0,0™011185†DC.L0,0,0,0™011185†DC.L0,0,0,0™011185*$IOCB‚EQU*‚CONFIGURATIONIOCB‚011185†DC.L0,0,0,0,0011185†DC.L0,0,0,0,0011185†DC.L0,0,0,0,0011185†DC.L0,0,0,0,0011185†DC.L0,0,0,0,0011185†DC.L0,0,0,0,0011185*8CMDARGAD DC.L 0 ADDR OF START OF ARG FOR CMD LINE 011685*„DS.B‚200ƒSTACKAREA STACK‚EQU‚*ééééé†PAGE †SECTIONƒ8†OPT‚FRS,PCS,MEX,NOCL,A†XREFƒPARSE,EDITFILE †LLEN120;************************************************************$*†COPYRIGHTED1982BYMOTOROLA,INC.*†M68000CRTEDITOR *†CRTE11.SA*†REV.A0.50‚11-21-79‚(C313),*†REV.A1.00ƒ2-13-80‚(C313)ONERECORDREADS*†REV.A1.00‚RELEASED3/7/804*†REV.‚1.00‚COMMANDSFINDANDCHANGERELEASED5/1/80-*†REV‚A1.10‚RESTOFCOMMANDSRELEASED6/30/80(*†REV‚A1.20‚SCROLLMODERELEASED‚7/11/80)*†REV‚A1.31‚FORVERSAdosRELEASE2.14/81>*†REV‚A2.00‚AFTERVERSAdosREL2.1ADDINGUP&DOWN,TABTHINGS*†REV‚A2.00‚5/21/81@*†REV‚B2.00‚ADUP,AMOVE,TESTFORTERMINALTYPE,SCREENI/O=1WRITE*†REV‚B2.00‚7/15/81(*†REV‚C2.00‚9/30/81POSITIONINDEPENDENT3*†REVƒ3.00‚11/25/81EDITORFORVERSA dos3.0RELEASE6*†REVƒ4.00‚8/26/82EDITORFOROEM-VERSAdosRELEASE4.08*’<>*†REVƒ4.30‚01/27/83‚PSGILMOUR:'*’1.Allow'.'inadditionto'*'asin*˜DUP*-3ƒandƒDUP.-3,*•PeriodisanunshiftedkeyontheEXORterm-*•andtheVME/10keyboardsandisalsointhe*•samekeyboardlocation!0*’2.Added'Q'and'q'aliasforQUITcommandto3*•matchsyntaxforothercommands(DUMP,PATCH,etc.)3*’3.Addedpatchareajustbeforethestackareain*•thedatasection.1*’4.Changedcopyrightmessagetothenewformat.*ˆREV‚4.4‚12/19/84=*’TheEDITORwascheckedandfoundtobepostionindependent.>*ˆREV‚4.4‚010285StoppedEDITORfromcrashingwhenF*-1used.E*ˆREV‚4.4‚010385StoppedEDITORfromcrashingwhentheEXTENDcommand%*’isusedonafullrecord.SPR1147.C*ˆREV‚4.4‚010485FixedEDITORsothatafteranunsuccessfulattempt:*’tochangeanonexistentstring,theLINEcommandoutputs5*’thecorrectlinenumber.‚SPR1071(deleted2lines)D*ˆREV‚4.4‚010785FixedEDITORsothathorizontalrangesearchworks.%*’Deleted1lineinCKHR10.‚SPR1075.>*ˆREV‚4.4‚011085EDITORwouldnotrunon4.4releasebecausea8*’previouslyuncheckedbitwhichwassetisnowchecked.>E0NV^2f0n4v9~4†3Ž8–3ž1¦3®5¶8¾6Æ3Î9Ö6Þ>æ2î3ö4þ447=6&8.-*’Repairedthebit.C*ˆREV‚4.4‚011185FixedEDITORsothatifaportisconfiguredfora8*’foreignterminal,theEDITORautomaticallycomesupin*’inscrollmode.A*ˆREV‚4.4‚011685FixedEDITORsothatitcanMERGEafilewithno*’volumenamegiven.C*ˆREV‚4.4‚011785FixedEDITORsothatitdoesnotabortwithatask>*’dumprequestwhilelockingthekeyboardifausermistakenly *’typesinCnwithoutastring.F*ˆREV‚4.4‚011885GaveEDITORalongereventreceivingareaandmessage%*’lengthforrunningonVERSAdos4.4.C*ˆREV‚4.4‚011985Addedcode(CURPSNroutine)todisplaycursorline:*’positiononLine24ofscreenbetweenF1andF2banners.:*’Positionisautomaticallyupdatedascursorvirtualline*’positioninfilechanges.F*ˆREV‚4.4‚012085FixedMERGEandSAVEcommandstobeacceptedinlower;*’casebyconvertingalllowercasefilenamestouppercase<*’filenames.‚The"merge"and"save"commandswerealreadyin>*’thejumptablesanditwasthelowercasefilenamewhichwas*’causingtheproblem.A*ˆREV‚4.4‚012185SPR#1148MisspellinginDEVICENOTREADYmessage *’corrected.?*ˆREV‚4.4‚012885AR#161CorrectedthehextoASCIIroutinethat8*’convertsthelinenumberforoutput.‚Hadtorevisethe7*’codethatputsoutthefilenameatthebottomofthe9*’screenalso,duetoexpandingtheoutputbufferforthe8*’largerASCIInumbertobedisplayed.‚Hadtorevisethe5*’routinethatalsoputsoutthelinenumberwiththe*’LINEcommand.ééA*ˆREV‚4.4‚022285Previouschangecausedtwoproblems:Usernumber<*’0wasnotdisplayedinthefilenameonline21ofscreen;<*’miscellaneousmessagesoutputtinglinenumbershadgarbage:*’inthemduetoCNVTHAwasdepositting10charactersinto.*’outputfieldinsteadof8.(8isbigenough)*:*†THISISTHEMAINBODYOFTHEEDITOR.ITDOESTHEINITIAL9*†SETUPOFFILESANDTHESCREEN.ITTHENWAITSFORINPUT<*†ANDPARSESITWHENATERMINATINGCHARACTERHASBEENTYPED.*B*…*****‚NOTE:BASEA DDRESSOFTHEDATASEGMENTISKEPTINA5******=*************************************************************$EDITSTRT‚EQU‚*†STARTOFEDITPROGRAM7‰LEAGTADRPB(PC),A0‚GETADDRESSPARAMETERBLOCKADDRESS6‰MOVE.L#RCVSA,D0„RECEIVESEGMENTATTRIBUTESDIRECTIVE!‰TRAP#1CALLEXECTOGETADDRESSéééé%‰BEQ.SEDIT00ˆBRANCHIFAGOODRETURN%‰ERQ.TERM‚#0,#$C000‚ERRORTERMINATIONGTADRPB‚DC.L‚0,0‹TASK,SESSION/‰DC.W‚$2000,0‡RETURNPHYSICALADDRESS,NOBUFFER‰DC.L‚'EDTD'ˆSEGMENTNAME1‰DC.L‚0,0,0‰NOLOGICALADDRESSORBUFFERSUPPLIED4EDIT00ƒMOVE.LA0,A5ˆPHYSICALADDRESSOFDATASEGMENT5‰LEA‚STACK-DATASG(A5),A7ƒSET-UPPOINTERTOSTACKAREA*#*†SAVEREGISTERSPASSEDATSTART-UP**ƒMOVE.L‚D2,EDITVOLN-DATASG(A5)‚VOLUMENAME*†MOVE.W‚D3,EDITUSER-DATASG(A5)„USERNUMBER)†MOVE.L‚D4,EDTCAT-DATASG(A5)‚CATALOGNAME2†MOVE.L‚D5,EDTCAT1-DATASG(A5)‚RESTOFCATALOGNAME6†MOVE.L‚D7,EDITLUN-DATASG(A5)…LOGICALUNITNUMBERMASK(CLR.BCHAIN-DATASG(A5)‘CLEARCHAINFLAG/CLR.BSCROLL-DATASG(A5)‘CLEARSCROLLMODEFLAG*3*ˆSET-UPSOMEINITIALADDRESSESINTHEDATASEGMENT*=‰LEACRTIOP-DATASG(A5),A0„PROCEEDI/OPARAMETERBLOCKADDRESS.‰LEA‚PROCBUF-DATASG(A5),A1‚INPUTBUFFERADRESS‰MOVE.LA1,IOSRRN(A0)ŠSTOREIT4‰LEAEDITBUF-DATASG(A5),A1„GETOUTPUTBUFFERADDRESS‰MOVE.LA1,IOSSAD(A0)ŠSTOREIT/‰LEAƒCRTN(PC),A1PROCEEDI/OCOMPLETIONADDRESS‰MOVE.LA1,IOSCAD(A0)ŠSTOREIT<‰LEAIOSOUT-DATASG(A5),A0†GETI/OOUTPUTPARAMETERBLOCKADR+‰LEAMESSOUTR(PC),A1‹GETCOMPLETIONADDRESS‰MOVE.LA1,IOSCAD(A0)ŠSTOREIT8‰LEAASQPB-DATASG(A5),A0‡GETASQPARAMETERBLOCKADDRESS!‰LEABRKSR(PC),A1ŽGETASRADDRESS‰MOVE.LA1,14(A0)ŽSTOREIT**‰CHECKFORCHAINMODE*ŠBTST#0,D7INCHAINMODE?)ŠBNE.SEDIT01BRANCHIFNOTINCHAINMODE=ŠMOVE.B#-1,SCROLL-DATASG(A5)INCHAINMODE,FORCESCROLLMODE4ŠMOVE.B#-1,CHAIN-DATASG(A5)ALSOSETTHECHAINFLAG=ŠMOVE.B#LDFLUN,IOLUN-DATASG(A5)USELUN6FORALLSCREENI/O-ŠCLR.BBRKFLG-DATASG(A5)‰CLEARTHEBREAKFLAG>EDIT01„LEACMDBUF-DATASG(A5),A0„GETINPUTCOMMANDLINEADDRESS BSR PARSE PARSE IT TST.L D0 CHECK RETURN BMI.S EDIT38 BRANCH IF AN ERROR:MOVE.LA1,SAVOTADD-DATASG(A5)‰SAVEPOINTERTOOUTPUTFILE6MOVE.LA2,SAVOPTAD-DATASG(A5)‰SAVEPOINTERTOOPTIONS-TST.LSAVOPTAD-DATASG(A5)ANYOPTIONSINPUT?< BEQ.S EDIT08 BRANCH IF NO,CRTMODE EDITING-SEE IF CHAIN MODEŠPAGE**‰CHECKFORVALIDOPTIONS*(ŠMOVE.LA2,D2SAVEOPTIONSSTARTADDRESS7CK20†LEAOPTTBL-DATASG(A5),A1GETOPTIONSTABLEADDRESS%ŠMOVE.L#9,D3NUMBEROFVALIDOPTIONS$ŠMOVE.B(A2)+,D1GETANINPUTOPTION&ŠCMPA.L‚A0,A2ATENDOFINPUTOPTIONS?ŠBGE.SƒCK30‚BRANCHIFATEND)CK10†CMP.B(A1)+,D1SEEIFAVALIDOPTIONŠBEQ.SCK20BRANCHIFVALIDŠSUB.L#1,D3DECREMENTCOUNTER#ŠBNE.SCK10BRANCHIFMORETOCHECK?ŠLEAOPTMSG- DATASG(A5),A4INVALIDOPTIONSPECIFED-STARTADDRESS1ŠLEAOPTMSGE-DATASG(A5),A6ENDADDRESSOFMESSAGE/ŠBRAEDITSMSGGOOUTPUTMESSAGEANDEXITEDITOR/CK30†MOVE.LD2,A2RESTOREINPUTOPTIONSADDRESS* MOVE.L #4,D0 COUNTER FOR CHECKING OPTIONS+EDIT05 CMP.B #'L',(A2)+ SCROLL MODE OPTION?* BEQ.S EDIT06 BRANCH IF SCROLL MODE OPTION SUB.L #1,D0 DECREMENT COUNTER- BNE.S EDIT05 BRANCH IF MORE OPTIONS TO CHECK8 BRA.S EDIT08 NOT SCROLL MODE,CRT MODE-SEE IF CHAIN MODEBEDIT38 LEA FMSG20-DATASG(A5),A4 COMMAND LINE ERROR MESSAGE ADDRESS.ŠLEAFMSGE20-DATASG(A5),A6ENDMESSAGEADDRESS/ŠBRAEDITSMSGGOOUTPUTMESSAGEANDEXITEDITORAEDIT39 LEA ACSMESS-DATASG(A5),A4 ERROR IN RETEIVE ATTRIBUTES CALL2ŠLEAACSMESSE-DATASG(A5),A6ENDADDRESSOFMESSAGE3ŠLEAACSMESSC-DATASG(A5),A3ADDRESSFORD0CONTENTS"ŠBSRGETERRGOCONVERTANDSAVED00ŠBRAEDITSMSGGOOUTPUTMESSAGEANDEXITMESSAGE*!*‚SEEIFUSINGANONEXORTERM-155*,EDIT08 TST.B CHAIN-DATASG(A5) IN CHAIN MODE?<ŠBMIEDIT10BRANCHIFINCHAINMODE,DON'TCAREWHATTERMINAL:‡LEAIOSPB-DATASG(A5),A0GETPBFORCNFGSTATURREQ0111856 MOVE.W #IOSTAT,IOSFCT(A0) CNFG STATUS REQ CODE 011185$ MOVE.W #0,IOSOPT(A0) OPTIONS 011185/ MOVE.B #CRTLUN,IOSLUN(A0) SET FOR LUN 5 011185 MOVE.L A1,-(A7) SAVE R1 011185, LEA IOCB-DATASG(A5),A1 GET IOCB ADDR 0111854 MOVE.L A1,IOSDBP(A0) INSTALL IOCB ADDR IN PB 011185" MOVE.L (A7)+,A1 RESTORE A1 011185 TRAP #2 CNFG STAT REQ 011185BNEƒEDIT39ERRORRETURN8 LEA IOCB-DATASG(A5),A0 GET ADDR WHERE CB INFO IS 0111858 CMP.B #TERMINAL,IOSDTP(A0) IS DEVICE A TERMINAL? 011185# BNE.S EDIT06 NOT A TERMINAL 011185+ TST.B IOSTCD(A0) IS TERMINAL A 155? 011185 BEQ.S EDIT09 BRANCH IF A 155?EDIT06 MOVE.B #-1,SCROLL-DATASG(A5) NOT A 155,FORCE SCROLL MODEŠPAGE**‚SETSOFTWAREPRIORITY*7EDIT09„LEAASQPB-DATASG(A5),A0USETHISPARAMETERBLOCK,ŠMOVE.L#24,D0SETPRIORITYDIRECTIVENUMBER*ŠMOVE.LA0,A1SAVEPARAMETERBLOCKADDRESS*ŠMOVE.B#$FF,8(A0)SETTOHIGHESTPRIORITYŠTRAP#1DOIT!ŠBEQ.SEDIT07BRANCHIFITWORKED)ŠMOVE.LA0,D0GETRETURNEDLIMITPRIORITY-ŠMOVE.LA1,A0RESTOREPARAMETERBLOCKADDRESS&ŠMOVE.BD0,8(A0)SETTOLIMITPRIORITY,ŠMOVE.L#24,D0SETPRIORITYDIRECTIVENUMBERŠTRAP#1TRYAGAIN3EDIT07 MOVE.L A1,A0 RESTORE PARAMETER BLOCK ADDRESS1ŠMOVE.B#5,8(A0)RESTOREENTRYFORGETASQ011085**‚SET-UPBREAKSTUFFHERE* MOVE.L #$1F,D0 GET ASQ CODE TRAP #1 DO IT BEQ.S EDIT50 GOOD RETURN8 LEA NOASQ-DATASG(A5),A4 SET UP FOR NO ASQ ERROR MESSAGE0 LEA NOASQE-DATASG(A5),A6 END ADDRESS OF MESSAGE/ LEA NOASQC-DATASG(A5),A3 ADDRESS OF ERROR CODE BSR GETERR CONVERT D0 TO ASCII% BRA EDITSMSG OOTPUT MESSAGE AND TERM3EDIT50CLR.BBRKFLG-DATASG(A5)ƒCLEARTHEBREAKFLAGC LEA IOSOUT-DATASG(A5),A0 PARA BLOCK ADDRESS TO USE TO CLAIM BREAKS( MOVE.W IOSOPT(A0),D5 SAVE THESE OPTIONS* MOVE.W IOSFCT(A0),D4 SAVE THESE FUNCTIONS2 MOVE.L IOSCAD(A0),D7 SAVE THIS COMPLETION ADDRESS2 MOVE.W #IOPCAD,IOSOPT(A0) SET FOR SERVICE ADDRESS' MOVE.W #IOBRKS,IOSFCT(A0) CLAIM BREAKS3 LEA BRKSR(PC),A4 GET BREAK SERVICE ROUTINE ADDRESS+ MOVE.L A4,IOSCAD(A0) BREAK SERVICE ADDRESS TRAP #2 DO IT0 MOVE.L D7,IOSCAD(A0) RESTORE COMPLETION ADDRESS& MOVE.W D4,IOSFCT(A0) RESTORE FUNCTION% MOVE.W D5,IOSOPT(A0) RESTORE OPTIONS TST.B D0 GOOD RETURN? BEQ.S EDIT10 BRANCH IF GOOD3 LEA NOBRK-DATASG(A5),A4 CAN'T CLAIM BREAKS MESSAGE0 LEA NOBRKE-DATASG(A5),A6 END ADDRESS OF MESSAGE3 LEA NOBRKC-DATASG(A5),A3 ADDRESS FOR D0 IN MESSAGE BSR GETERR CONVERT D0 TO ASCII BSR MESSOUT OUTPUT THE MESSAGE*)*„OUTPUTINITIALEDITORMESSAGETOSCREEN*8EDIT10ƒLEA‚IMESS1-DATASG(A5),A4…STARTADDRESSOFMESSAGE1…LEA‚IMESS1E-DATASG(A5),A6…ENDADDRESSOFMESSAGE)†BSR‚MESSOUTŽOUTPUTFIRSTLINEOFMESSAGE?†LEA‚IMESS2-DATASG(A5),A4ˆSTARTADDRESSOFNEXTLINEOFMESSAGE&†LEA‚IMESS2E-DATASG(A5),A6‡ENDADDRESS*†BSR‚MESSOUT‹OUTPUTSECONDLINEOFMESSAGE PAGE*1*†INITIALIZEVARIABLESANDHAVEFMSOPENTHEFILE**†CLR.BTRUN-DATASG (A5)CLEARTRUNCATEFLAG3†CLR.B‚EMTYFILE-DATASG(A5)‚TURNOFFEMPTYFILEFLAG8†CLR.L‚FILELINE-DATASG(A5)‚CURRENTRECORDNUMBERONDISK=†CLR.L‚TOPLINE-DATASG(A5)‚CURRENTRECORDNUMBERTOPOFSCREEN*†CLR.B‚CURMODE-DATASG(A5)‚SETCOMMANDMODE5†CLR.W‚CHKPCT-DATASG(A5)‚CLEARTHECHECKPOINTCOUNTER7†LEA‚FMSPKT-DATASG(A5),A0…ADDRESSOFFMSCOMMANDPACKET-†MOVE.B‚#OPENCMD,FMSCMD(A0)…OPENFILECOMMAND&†CLR.BFMSBRK(A0)CLEARFMSBREAKFLAG†BSR‚FMS”GOOPENTHEFILE*†TST.BƒFILETYPE-DATASG(A5)SEEIFNEWFILE †BNE.S‚EDIT11BRANCHIFNEWFILE4†TST.LƒMAXLINE-DATASG(A5)‚SEEIFEMPTY,-1=EMPTYFILE!†BPL.S‚EDIT15BRANCHIFNOTEMPTY*$*…HEREIFNEWFILEOROLDEMPTYFILE*=EDIT11ƒMOVE.B‚#-1,EMTYFILE-DATASG(A5)TURNONEMPTYFILEFLAG)‰CLR.B‚FSTSW-DATASG(A5)FIRSTTIMESWITCH+‰MOVE.B‚#1,CURMODE-DATASG(A5)‚SETPAGEMODE*3*„FIRSTFILERECORDNUMBERISZEROOFEXISTINGFILE* EDIT15‚EQU‚*( TST.B SCROLL-DATASG(A5) IN SCROLL MODE?% BMI EDIT100 BRANCH IF IN SCROLL MODE PAGE*0*†RESETSCREENANDSETUPCRTIOSPARAMETERBLACK&*†ANDRECORDNUMBERSFORSUBSEQUENTIO*1‡CRT.OUT‚CRTIOS,ENABLE,#6†SETSCREENTOEDITMODEˆBEQ.S‚EDIT20‡BRANCHIFOK/EDITERROR‚LEASTACK-DATASG(A5),A7RESTORESTACK‹CMP.B#$C6,D0BREAKCONDITION?‰BEQ‚BREAKBRANCHIFYES‰CMP.B#ISTADO,D0DATAOVERRUN?‰BEQDATAORBRANCHIFYES‰CMP.B#$E8,D0FRAMINGERROR?‰BEQDATAORBRANCHIFYES:‰LEA‚IOSMESS-DATASG(A5),A4„SETUPFOROUTPUTERRORMESSAGE2‰LEA‚IOSMESSE-DATASG(A5),A6ƒENDADDRESSOFMESSAGE1‰LEA‚IOSMESSC-DATASG(A5),A3ƒADDRESSOFERRORCODE‰BSR‚GETERRˆPUTD0INMESSAGE$‰BRA‚EDITSAV‡OUTPUTMESSAGEANDTERM PAGE*G*‡SETSCREENPROTECTIONFIELDSANDWRITE1ST20LINESOFFILETOSCREEN*=EDIT20‚MOVE.B‚#LINE20,D0„LINE20CODEFORBOTTOMLINEDISPLAY1‡BSR‚SETPROPŠSETSCREENPROTECTION-PAGEEDITMODE*‡CRT.OUT‚CRTIOS,OUT23,#80…OUTPUTFKEYLINE(‡BNE‚EDITERRORBRANCHIFANOUTPUTERROR*‡CRT.OUT‚CRTIOS,OUT24,#82…OUTPUTFKEYUSES(‡BNE‚EDITERRORBRANCHIFANOUTPUTERROR(†BSRCLRCOL1‡GOCLEARALLLINES,COLUMN1**…BUILDOUTPUTFILENAMEBUFFER*:†LEAOUT24-DATASG(A5),A2‡USETHISSPACE,WON'TUSEITAGAIN$†ADD.L#2,A2ˆBUMPPASTPARTWILLUSE(†MOVE.B#LINE21,(A2)+OUTPUTLINENUMBER'†MOVE.B#$4E,(A2)+…OUTPUTCOLUMNNUMBER(†MOVE.L#14,D7ˆCOUNTTHEBYTESOFOUTPUT+†MOVE.LOUTVOL-DATASG(A5),(A2)+‚VOLUMENAME†MOVE.B#':',(A2)+„DELIMITER?†LEAOUTBUF-DATASG(A5),A3ˆUSEOUTBUFFORCONVERTINGUSERNUMBER-†MOVE.WOUTUSER-DATASG(A5),D0GETUSERNUMBER†BSRCNVTHAˆCONVERTTOASCIIF†LEA(OUTBUF+4)-DATASG(A5),A3ƒGETCONVERTEDUSERNUMBERADDRESS022285†MOVE.L#4,D6†NUMBEROFBYTES4EDITB10‚MOVE.B(A3)+,(A2)+MOVETOTHEOUTPUTBUFFER†SUB.L#1,D6DECRMENTCOUNTER†BNE.SEDITB10BRANCHTILMOVED†MOVE.B#'.',(A2)+DELIMITER-†MOVE.LOUTCAT-DATASG(A5),D6GETCATALOGNAME†CMP.L#'„',D6ƒISITBLANK?(†BEQ.SEDITB20BRANCHIFBLANK,IGNOREIT"†MOVE.LD6,(A2)+NOTBLANK,SAVEIT9†MOVE.LOUTCAT1-DATASG(A5),(A2)+ANDRESTOFCATALOGNAME†ADD.L#8,D7COUNTTHEBYTES#EDITB20 MOVE.B #'.',(A2)+ DELIMITER†MOVE.L#8,D6FILENAMELENGTH+†LEAOUTNAME-DATASG(A5),A3FILENAMEADDRESS4EDITB30 MOVE.B (A3)+,(A2)+ FILENAME TO OUTPUT BUFFER†SUB.L#1,D6DECREMENTCOUNTER†BNE.SEDITB30BRANCHTILMOVED†ADD.L#13,D7ADDINTHEBYTES†MOVE.B#'.',(A2)+DELIMITER)†MOVE.WOUTEXT-DATASG(A5),(A2)+‚EXTENSION$†MOVE.B#ENDOD,(A2)ƒENDOFDATACODE6†CRT.OUT‚CRTIOS,OUT24,D7‚GOOUTPUTFILENAMETOSCREEN%†BNEEDITERROR‡BRANCHIFANI/OERROR,†TST.B‚EMTYFILE-DATASG(A5)‚SEEIFEMPTYFILE1†BMI.S‚EDIT21ˆBRANCHIFEMPTY-SCREENISCLEARNOW#‰BSR‚WRTSCRN‰GOWRITEENTIRESCREEN+ˆBSR‚HOMECUR‹GOPUTCURSORATHOMEPOSITION;EDIT21‚BSR‚SETABS‰SETDEFAULTTABSFROMCOMMANDLINE,IFANY,ˆTST.BTRUN-DATASG(A5)‚TRUNCATINGTHISFILE?…BEQ.SEDIT22BRANCHIFNO6 LEA TRUNMSG-DATASG(A5),A0 TRUNCATING,GO TELL THE USER MOVE.L #18,D0 MESSAGE LENGTH BSR WRTMESS TELL HER6EDIT22‚CLR.B‚SAVECHG-DATASG(A5)‚CLEARSAVECHANGEFLAG:†TST.B‚CURMODE-DATASG(A5)„CHECKFORMODE-PAGEORCOMMAND#†BNE.S‚EDI T1ŠBRANCHIFINPAGEMODE(†BSR„SETPROCˆSETCOMMANDPROTECTIONMODE!†MOVE.B#CLRSCRN,D0CLEARLINE22†BSR‚SEND1‚GODOIT PAGE*'*…PAGEEDITMODE-READINPUTFROMSCREEN*0EDIT1 MOVE.B #POSONE,D0 SCREEN LINE # FOR PROMPT…BSRPUTPPOSITIONPROMPTEEDIT2 BSR CURPSN UPDATE CURRENT CURSOR LINE POSITION ON SCREEN 011985#†CRT.IN‚CRTIOS,INBUF,#$60…READLINE EDIT6BNE‚EDITERRORERRORRETURN.†TST.BBRKFLG-DATASG(A5)‡RETURNAFTERABREAK?,†BNE‚BREAK„BRANCHIFYES,GOTOBREAKROUTINE:†MOVE.L‚D1,CRTLNG-DATASG(A5)‚SAVERETURNEDLENGTHOFINPUT†BSR‚CRTMODEˆGOHANDLEINPUT$†TST.BEMTYFILE-DATASG(A5)ƒNEWFILE?!†BNE.SEDIT7BRANCHIFANEWFILE3†MOVE.LMAXLINE-DATASG(A5),D1GET#RECORDSINFILE?†CMP.LFILELINE-DATASG(A5),D1ƒSEEIFCURRENTRECBEYONDMAXREC!†BGE.SEDIT7BRANCHIFNOTBEYOND=†MOVE.LMAXLINE-DATASG(A5),FILELINE-DATASG(A5)FORCEEQUALITY0EDIT7TST.BBRKFLG-DATASG(A5)„WASABREAKINPUT?†BNEBREAKŠBRANCHIFYES5EDIT5LEA‚INBUF-DATASG(A5),A1‡ADDRESSOFINPUTBUFFER7EDIT4CLR.B‚CRTERM(A1)†CLEARLASTTERMINATINGCHARACTER/†CLR.W‚(A1)CLEARFIRST2BYTESOFINPUTBUFFER:†CLR.B‚SAVECHG-DATASG(A5)„CLEARCHANGEFLAGFORNEXTINPUT*†TST.BCURMODE-DATASG(A5)…INCOMMANDMODE?†BNE.SEDIT2BRANCHIFNO+†MOVE.B#CLRSCRN,D0CLEARLINE22OFSCREEN†BSRSEND1DOIT"†BRA„EDIT2‹GODOITALLOVERAGAIN†PAGE**‡ENDOFEDITSESSION*EDITSAV‚LEA‚FMSPKT-DATASG(A5),A0…ADDRESSOFFMSCOMMANDPACKET)†MOVE.B‚#CLOSCMD,FMSCMD(A0)„CLOSECOMMAND†BSR‚FMS“CLOSETHEFILE0EDITDISA TST.B SCROLL-DATASG(A5) IN SCROLL MODE?(‰BMI.SEDITSMSGBRANCHIFINSCROLLMODE0ŠCLR.LSAVOPTAD-DATASG(A5)‚CLEARANYSETOPTIONS*ŠMOVEM.LA4-A6,-(A7)…SAVEMESSAGEPOINTERS!ŠBSRSETABSGORESETDEFAULTTABS-ŠMOVEM.L(A7)+,A4-A6RESTOREMESSAGEPOINTERS%ŠBSRCLRP“RESETCOL1TOFULLDISPLAY,ŠCRT.OUT‚CRTIOS,DISABLE,#5†DISABLEEDITMODE#EDITSMSG‚BSR‚MESSOUTOUTPUTMESSAGE EDITERM‚ERQ.TERM#0,#0‡TERMINATE PAGE**‚MAINPORTIONOFSCROLLMODE* EDIT100 EQU * BSR SETABS SET INITIAL TABS"TST.BTRUN-DATASG(A5)‡TRUNCATING? BEQ.S EDIT105 BRANCH IF NO, LEA TRUNMSG-DATASG(A5),A4 YES,TELL THE USER* LEA TRUNMSGE-DATASG(A5),A6 END OF MESSAGE$ BSR.S MESSOUT GO OUTPUT THE MESSAGECEDIT105‚CLR.BCURMODE-DATASG(A5)ƒSCROLLMODEALWAYSINCOMMANDMODE$TST.BEMTYFILE-DATASG(A5)ŠNEWFILE? BMI.S EDIT120 BRANCH IF NEW-EDIT110 CRT.IN CRTIOS,INBUF,#CRTLEN GET INPUT BNE EDITERROR ERROR RETURN.TST.BBRKFLG-DATASG(A5)ˆRETURNAFTERABREAK? BNE BREAK BRANCH IF YES2MOVE.LD1,CRTLNG-DATASG(A5)„RETURNEDINPUTLENGTH-CMP.L#RECLNG,CRTLNG-DATASG(A5)ƒCAN'TBE>79 BGT.S EDIT125 BRANCH IF GREATER" BSR SCROLMOD GO HANDLE THIS INPUT.TST.LMAXLINE-DATASG(A5)‰ANYRECORDSINFILE?- BMI.S EDIT120 BRANCH IF NO,GO TO INSERT MODE2EDIT115TST.BBRKFLG-DATASG(A5)‚WASABREAKINPUT? BNE BREAK BRANCH IF YES BRA EDIT110 GET NEXT INPUT%EDIT120 BSR INSRT50 GO TO INSERT MODE& BRA EDIT115 GET SET UP FOR NEXT INPUT9EDIT125 LEA RECTOOL-DATASG(A5),A4 RECORD TOO LONG MESSAGE1 LEA RECTOOLE-DATASG(A5),A6 END ADDRESS OF RECORD! BSR.S MESSOUT OUTPUT THE MESSAGE BRA EDIT115 GET NEXT INPUT†PAGE>***************************************************************#*†MESSOUT‚MESSAGEOUTPUTSUBROUTINE#*OUTPUTALINETOSCREENUSINGIOS$*†ENTRY:‚A4=STARTADDRESSOFMESSAGE*ŽA6=ENDADDRESSOFMESSAGE*%*†EXIT:ƒA0=ADDRESSOFIOSPARA.BLOCK**†GOODRETURN:BACKTOCALLER*!*†ERRORRETURN:EDITERRORROUTINE*?**************************************************************** MESSOUT‚EQU‚*B‰MOVE.L‚A4,IOSTART-DATASG(A5)‚STARTMESSAGEADDRESSTOPARA.BLOCK>‰MOVE.L‚A6,IOEND-DATASG(A5)‚ENDMESSAGEADDRESSTOPARA.BLOCK'‰MOVE.W‚#2,IOSOUT-DATASG(A5)‚WRITECODE1‰LEA†IOSOUT-DATASG(A5),A0†PARAMETERBLOCKADDRESS‰TRAP#2“OUTPUTTHEMESSAGE'MESSOUTR‚BNE‚EDITERM‰BRANCHIFANERROR‰RTS•RETURNIFGOOD‡PAGE?******************** *******************************************7*„SUBROUTINECRTMODE---READINPUTTERMINATINGCHARACTER4*„RETURNEDFROMCRT.IN‚ANDDETERMINEOPERATIONMODE.;*„CONTROLISRETURNEDTOTHEEDITORBECAUSEOFINSERTLINE,0*„DELETELINE,UPARROW,DOWNARROW,LF-CR,&FKEYS.:*„CRTCHGIS$FFIFNOCHANGETOCURRENTLINE.THISROUTINE:*„CHANGESCRTCHGTO00IFITIS$FF,OTHERWISEDOESNOTHING *„TOCRTCHG./*†SOMEMODESGOTOREADCMDIFWEAREINCOMMAND**†MODEEDITINGINSTEADOFINPAGEEDITING./*†ALLPAGEEDITINGMODESDOFILECHANGESBEFORE *†CHANGINGTHESCREEN,IFNEEDED.*!*…ENTRY:INBUFCONTAINSCRTPACKET*‹CURMODE:1=PAGEMODE*“0=COMMANDMODE1*…EXIT:TOEACHOPERATIONMODE,A1=ADDRESSOFINBUF%*…ERROREXIT:IOSERROR-EDITERROR,EXIT*…REGISTERSUSED:ALL*…TABLESUSED:TERMTBL=************************************************************* CRTMODE†EQU‚*3ŠTST.BMULFSW-DATASG(A5)‰DIDWELEAVESCREENFUNNY?‰BEQ.SCRTMODE5BRANCHIFNO/‰MOVE.B#LINE20,D0‚SETSCREENLINE20TOBOTTOM‰BSR‚SETPROPƒGOSETPAGEMODE&‰BSRWRTSCRN…REOUTPUTSCREENCORRECTLY%‰MOVE.B#POSONE,D0ƒSCREENLINENUMBER‰BSR‚PUTPPOSITIONPROMPT'‰BSR‚SETPROC‚PUTBACKINTOCOMMANDMODE?‰CLR.BMULFSW-DATASG(A5)…TURNOFFMULTIPLESCREENOUTPUTSWITCH8CRTMODE5LEA‚INBUF-DATASG(A5),A1…ADDRESSOFINPUTBUFFER.‰CMP.W‚#$DDFF,(A1)ƒFIRST2BYTESMUSTBE$DDFF1‰BNECRTMODER‰BRANCHIFNOT,ERRORININPUTBUFFER'‰TST.B‚CRTCHG(A1)„SEEIFNOCHANGE($FF)"‰BPL.S‚CRTMODE4†BRANCHIFACHANGE<‰MOVE.B‚#0,CRTCHG(A1)‚REPLACE$FFWITH00FORNOCHANGEFLAG:CRTMODE4TST.B‚CURMODE-DATASG(A5)„SEEWHICHMODEWEAREIN(†BNE.S‚CRTMODE3ŠBRANCHIFPAGEEDITMODE6†MOVE.B‚CRTCHG(A1),SAVECHG-DATASG(A5)ˆSAVECHANGEFLAG&†CLR.B‚CRTCHG(A1)„TURN-OFFCHANGEFLAG7†MOVE.BSAVEP-DATASG(A5),CRTLINE(A1)USELASTTIMELINECRTMODE3‚CLR.LD0CLEARFORUSE4‚MOVE.B‚CRTERM(A1),D0ƒRETURNEDTERMINATINGCHARACTER=‹LEA‚TERMTBL-DATASG(A5),A0…ADDRESSOFVALIDTERMCHARS.TABLE4‰LEATERMTBLE-DATASG(A5),A2†ENDADDRESSOFTHETABLE'CRTMODE1…CMP.W‚(A0),D0ˆLOOKFORAMATCH!‹BEQ.S‚CRTMODE2ŠBRANCHIFAMATCH&ŠADD.L‚#TERMTBLL,A0„BUMPTONEXTENTRY‹CMP.L‚A2,A0ŠSEEIFPASTTABLE(ˆBLT.S‚CRTMODE1ŠBRANCHIFNOTPASTTABLE1‹BRA.SCRTMODER‰BRANCHTOERROR-NOTAVALIDCHAR.;CRTMODE2‚MOVE.W‚2(A0),D0…OFFSETOFADDRESSOFROUTINETODO‰LSL.L#2,D0‹MULTIPLYBYFOUR'‰LEABRATBL(PC),A0…BRANCHTABLEADDRESSˆJMP‚(A0,D0)ŽGOTHERE PAGE*%*ˆINVALIDTERMINATINGCHARACTERFOUND*(CRTMODER‚EQU‚*ERROR-DIDN'TFINDAMATCH1ŠTST.BCURMODE-DATASG(A5)SEEWHATMODEWEAREIN&ŠBNE.SCRTMODE7‡BRANCHIFINPAGEMODE2ŠLEAOUTERR-DATASG(A5),A0‚INCOMMANDMODE,ASKWHATŠMOVE.L#6,D0‡MESSAGELENGTH"‰BSRWRTMESS‰GOOUTPUTTHEMESSAGE&CRTMODE6ADD.L#4,A7‰RESTORETHESTACK‰BRAEDIT5‹GOGETNEXTINPUT@CRTMODE7 LEA INVCHAR-DATASG(A5),A0 INVALID INPUT MESSAGE ADDRESS‰MOVE.L#34,D0‡MESSAGELENGTH$‰BSRWRTMESS‰GOOUTPUTERRORMESSAGE+‰TST.LMAXLINE-DATASG(A5)ANYFILERECORDS?*‰BPL.SCRTMODE8†BRANCHIFYES,FILERECORDS8‰MOVE.B#CLRSCRN,D0‚NORECORDS,MAKESURESCREENISEMPTY‰BSRSEND1‹GOCLEARTHESCREEN3‰MOVE.B#POSONE,SAVEP-DATASG(A5)FORCESREENLINE1‰BRA.SCRTMODE9†CONTINUE2CRTMODE8BSRWRTSCRN‰RE-OUTPUTSCREENASIKNOWIT7CRTMODE9 LEA OUTBUF-DATASG(A5),A3 OUTPUT BUFFER ADDRESS&‰MOVE.B#LOADCUR,(A3)+LOADTHECURSOR1‰MOVE.BSAVEP-DATASG(A5),(A3)+TOLASTKNOWNLINE ‰MOVE.B#COLTWO,(A3)+COLUMNTWO!‰BSRDOOUT‹GOPOSITIONTHECURSOR‰BRACRTMODE6ˆANDRETURN*;*ˆBRANCHTABLEOFVALIDROUTINESFORTERMINATINGCHARACTERS* BRATBLƒEQUƒ*‰BRAINSLINŠINSERTLINE‰BRADELINEŠDELETELINE‰BRAUPAROWŠUPARROW‰BRADNAROWŠDOWNARROW‰BRACRTLS‹CARRIAGERETURN ‰BRADNAROWŠDOWNARROW-LINEFEED(‰BRAFKEY1‹FUNCTIONKEY1-REVERSEMODE3‰BRAFKEY3‹FUNCTIONKEY3-SCROLLFORWARDONEPAGE4‰BRAFKEY4‹FUNCTIONKEY4-SCROLLBACKWARDONEPAGE3‰BRAFKEY5‹FUNCTIONKEY5-SCROLLFORWARDONELINE4‰BRAFKEY6‹FUNCTIONKEY6-SCROLLBACKWARDONELINE$‰BRAHOMEŒHO MEKEY-HOMETHECURSOR1‰BRAPAGEŒPAGE-CARRIAGERETURNATENDOFSCREEN*‰BRAFKEY11ŠFUNCTIONKEY11-SETTABSTOP-‰BRAFKEY12ŠFUNCTIONKEY12-DELETETABSTOP PAGE5******************************************************-*‚SCROLMODESCROLLMODE-SETCARRIAGERETURN%*ŒTOENDOFDATASOALLCOMMANDSWILL1*ŒWORK.IFINCHAINMODE,ACARRIAGERETURNISNOT1*ŒINTHEINPUTBUFFER,SOONEISPUTATTHEENDOF5*ŒTHEINPUTBUFFER.ALSO,THECOMMANDISOUTPUTTOTHE!*ŒSCREEN(TERMINAL)INCHAINMODE.*6******************************************************SCROLMOD EQU *8 LEA FMSDATA-DATASG(A5),A1 START ADDRESS OF INPUT BUFFER MOVE.L A1,A2 SAVE IT) ADD.L CRTLNG-DATASG(A5),A2 ADD IN LENGTH! CMP.B #$0D,(A2) CARRIAGE RETURN?. BNE.S SCROLM20 BRANCH IF NO,SEE IF CHAIN MODE4SCROLM10‚MOVE.B#ENDOD,(A2)MAKEITENDOFDATACODEB LEA INBUF-DATASG(A5),A1 POINT TO START OF INPUT,LIKE IN PAGE MODE@ ADD.L #7,CRTLNG-DATASG(A5) MAKE LENGTH LOOK LIKE PAGE MODE ALSO BRA READCMD GO PARSE THE INPUT.SCROLM20 TST.B CHAIN-DATASG(A5) IN CHAIN MODE?' BMI.S SCROLM30 BRANCH IF IN CHAIN MODE5 LEA OUTERR-DATASG(A5),A0 NOT IN CHAIN,ERROR IF NO CR MOVE.L #6,D0 MESSAGE LENGTH BSR WRTMESS OUTPUT 'WHAT?' RTS RETURN FOR NEXT INPUT/SCROLM30 MOVE.L A1,A4 GET START OF INPUT BUFFER% MOVE.L A2,A6 GET END OF INPUT BUFFER! SUB.L #1,A6 ACTUAL END OF BUFFER. BSR MESSOUT OUTPUT THE INPUT BUFFER TO SCREEN; BRA SCROLM10 CONTINUE WITH SCROLL MODE UNDER CHAIN COMMANDŠPAGE@*****************************************************************@*†UPARROW‚MOVECURSORANDPROMPTUP1LINEWITHPAGEWRAPAROUND*†REV1.00‚12-3-79‚(C313)*†REV2.00‚7-15-81‚(C313)*†ENTRY:A1=INPUTBUFFERADDRESS'*†USES:A3=SCREENOUTPUTBUFFERADDRESS *†EXIT:THRUDELETELINEROUTINE *†CALLS:CKREADTESTOLD1‚EOFMSG3*Œ01234567 *†REGS:D‚* *‹A‚Pƒ*ƒP?***************************************************************2UPAROW„EQU‚*ŽCURSORUP1LINE-WITHPAGEWRAPAROUND6‰LEAOUTBUF-DATASG(A5),A3‚SCREENOUTPUTBUFFERADDRESS*‰TST.BCURMODE-DATASG(A5)‚INCOMMANDMODE?-‰BNE.SUPAROW10BRANCHIFNOTINCOMMANDMODE7‰SUB.B#1,CRTLINE(A1)COMMANDMODE,ADJUSTSCREENLINE#+‰CMP.B#POSONE,CRTLINE(A1)PAGEWRAPAROUND?‰BGE.SUPAROW10BRANCHIFNO>‰MOVE.B#LINE20,CRTLINE(A1)PAGEWRAPAROUND,SETTOLASTLINE#)UPAROW10 TST.B CRTCHG(A1) A CHANGE TO DO?(‰BEQ.SUPAROW30BRANCHIFNOFILECHANGE-‰MOVE.B#1,FSTSW-DATASG(A5)ƒTURNOFFNEWFLAG‰BSRCKREADUPDATETHEFILE2UPAROW20 BSR.S TESTOLD1 TURN OFF REST OF NEW FLAGS‰CLR.LD1CLEARFORUSE-‰MOVE.BCRTLINE(A1),D1GETSCREENLINENUMBER"‰CMP.B#LINE20,D1PAGEWRAPAROUND?-‰BEQ.SUPAROW50BRANCHIFYES,PAGEWRAPAROUND$‰SUB.B#POSONE,D1STRIPASCIIOFFSETE‰MOVE.LTOPLINE-DATASG(A5),FILELINE-DATASG(A5)DETERMINENEWRECORD#3‰ADD.LD1,FILELINE-DATASG(A5)„CURRENTRECORDNUMBER"‰BRADELINE15GODOALLTHEOUTPUT**ˆSEEIFANYRECORDS*-UPAROW30TST.LMAXLINE-DATASG(A5)„ANYRECORD?$‰BMI.SUPAROW40BRANCHIFNORECORDS:‰MOVE.B#1,FSTSW-DATASG(A5)‚HAVERECORDS,TURNOFFNEWFLAG%‰BRAUPAROW20ANDCONTINUEPROCESSINGAUPAROW40 MOVE.B #LOADCUR,(A3)+ REPOSITION CURSOR TO TOP OF SCREEN ‰MOVE.B#POSONE,(A3)+FIRSTLINE"‰MOVE.B#COLTWO,(A3)+FIRSTCOLUMN‰BRADOOUTGODOALLTHEOUTPUT**ˆPAGEWRAPAROUND*CUPAROW50‚ADD.L#WRAPKEY,FILELINE-DATASG(A5)‚UPDATECURRENTRECORD#!‰BSREOFM40‚GOSEEIFENDOFFILE2‰BRADELINE15GOPOSITIONPROMPTANDDOTHEOUTPUT‡PAGE*A******************************************************************:*†TESTFOROLDORNEWEMPTYFILEANDSETFLAGSACCORDINGLY**†REV1.00‚01-24-80‚(C313)*†ENTRY:D1.B=#REPLCMD *†ALTERNATEENTRYPOINT:TESTOLD1*†EXIT:RETURNSTOCALLER**†USES:01234567*ˆD…R…**ˆAP*A****************************************************************** TESTOLD‚EQU„*<‰TST.B‚EMTYFILE-DATASG(A5)†ISTHISANOLDORNEWEMPTYFILE?*‰BNE.STESTOLD1‹YES,GORESETTONOTEMPTY8‰MOVE.L‚MAXLIN E-DATASG(A5),D4‡GET#LASTLOGRECINFILE>‰CMP.LƒFILELINE-DATASG(A5),D4†AREWEPASTTHEENDOFTHEFILE?'‰BLT.SƒTESTOLD2‰YES,GOSETINSERTCODE‰RTS•GORETURNTOCALLER:TESTOLD1CLR.B‚EMTYFILE-DATASG(A5)…RESETFILETONOTEMPTY1‰CLR.B‚FILETYPE-DATASG(A5)…RESETFILETOOLDTYPE*‰TST.B‚FSTSW-DATASG(A5)ˆFIRSTTIMETOOLD?‰BNE.S‚TESTOLD2ŠBRANCHIFNO5‰MOVE.B‚#1,FSTSW-DATASG(A5)„TURNONFIRSTTIMESWITCH?‰SUB.L‚#1,FILELINE-DATASG(A5)‚MAKEFILELINEMATCHOLDFILETYPE3TESTOLD2MOVE.B#INSRTCMD,D1†SETINSERTFMSCOMMAND‰RTS•RETURNTOCALLER‡PAGEA******************************************************************E*…DOWNARROW-MOVECURSORANDPROMPTDOWN1LINEWITHPAGEWRAPAROUND*…REV1.00‚12-3-79‚(C313)*…REV2.00‚7-15-81‚(C313)*…ENTRY:A1=INPUTBUFFERADDRESS'*…USES:A3=SCREENOUTPUTBUFFERADDRESS *…EXIT:THRUDELETELINEROUTINE*…CALLS:CKREADTESTOLD1*Œ01234567 *…REGS:D‚* *‹A‚Pƒ*ƒPB*******************************************************************DNAROWƒEQU‚*CURSORDOWN1LINE6ˆLEAOUTBUF-DATASG(A5),A3SCREENOUTPUTBUFFERADDRESS*ˆTST.BCURMODE-DATASG(A5)„INCOMMANDMODE?ˆBNE.SDNAROW10BRANCHIFNO&ˆADD.B#1,CRTLINE(A1)‚INCREMENTLINE#+ˆCMP.B#LINE20,CRTLINE(A1)PAGEWRAPAROUND?ˆBLE.SDNAROW10BRANCHIFNO,OK0ˆMOVE.B#POSONE,CRTLINE(A1)FORCESCREENLINE#1/DNAROW10TST.B‚CRTCHG(A1)„SEEIFACHANGETODO)ˆBEQ.SƒDNAROW20ˆBRANCHIFNOCHANGETODO/ˆMOVE.B#1,FSTSW-DATASG(A5)ƒTURNOFFFIRSTFLAG,ˆBSR„CKREAD‰GOINSERTORREPLACETHISRECORD.DNAROW20TST.LMAXLINE-DATASG(A5)‚ANYRECORDS?2‡BMI„UPAROW40‚BRANCHIFNO,RESETCURSORANDPROMPT ‰BSR‚TESTOLD1‰TURNOFFNEWFLAGS0‰MOVE.B‚SAVEP-DATASG(A5),D1†GETLASTLINENUMBER6‡CMP.B‚CRTLINE(A1),D1ƒSEEIFPAGEWRAPAROUNDTHISTIME)†BGT.S‚DNAROW30…BRANCHIFPAGEWRAPAROUNDF‰ADD.L‚#1,FILELINE-DATASG(A5)NOTPAGEWRAPAROUND-UPDATECURRENTREC#8†MOVE.LFILELINE-DATASG(A5),D1GETCURRENTRECORDNUMBER)‰CMP.LMAXLINE-DATASG(A5),D1BEYONDFILE?%‰BLE.SDNAROW40BRANCHIFWITHINFILE*6*ˆBEYONDFILEORPAGEWRAPAROUND-MOVETOTOPOFSCREEN*KDNAROW30 MOVE.L TOPLINE-DATASG(A5),FILELINE-DATASG(A5) SET CURRENT RECORD #.‰MOVE.B#POSONE,CRTLINE(A1)SCREENLINENUMBER/DNAROW40 MOVE.B #LOADCUR,(A3)+ LOAD CURSOR CODE,‰MOVE.BCRTLINE(A1),(A3)+SCREENLINENUMBER&‰MOVE.BCRTCOL(A1),(A3)+COLUMNNUMBER‰BRADELINE15GODOTHEOUTPUT†PAGEB******************************************************************* *…HOMECURSOR**…REV1.00‚12-3-79‚(C313)*…REV2.00‚7-15-81‚(C313)*…ENTRY:A1=INPUTBUFFERADDRESS'*…USES:A3=SCREENOUTPUTBUFFERADDRESS *…EXIT:THRUDELETELINEROUTINE*…CALLS:CKREADTESTOLD1*Œ01234567 *…REGS:D *‹A‚Pƒ*ƒPA****************************************************************** HOME‚EQU‚*/†LEAOUTBUF-DATASG(A5),A3OUTPUTBUFFERADDRESS-†TST.B‚CRTCHG(A1)…SEEIFACHANGETODOFIRST!†BEQ.S‚HOME10‰BRANCHIFNOCHANGE,†BSR‚CKREAD‰GOINSERTORREPLACETHISRECORD,HOME10TST.LMAXLINE-DATASG(A5)ƒANYRECORDS?!‡BMIUPAROW40‡BRANCHIFNORECORD(‡BSRTESTOLD1‡TURNOFFRESTOFNEWFLAGS=‡MOVE.LTOPLINE-DATASG(A5),FILELINE-DATASG(A5)CURRENTRECORD‡BRADELINE15†GODOTHEOUTPUT‡PAGE>****************************************************************†FKEY1‚GOTOCOMMANDMODEIFINPAGEMODE$*GOTOPAGEMODEIFINCOMMANDMODE-*DON'TALLOWPAGEMODEIFUSINGTHEKOPTION/*KOPTIONFORLOOKINGATFILESONLY,NOCHANGES*†REV1.00‚12-3-79‚(C313)*†REV2.00‚3/27/80(313)*†REV3.00‚7-15-81(313)*†ENTRY:A1=INPUTBUFFERADDRESS'*†USES:A3=SCREENOUTPUTBUFFERADDRESS4*†CALLS:WRTMESS‚CLRMSG‚CKREAD‚SETPP3‚TESTOLD1SETCP3=*************************************************************FKEY1…EQU„*ŒCHANGEMODE)‡TST.BFILEOPT-DATASG(A5)‡USINGKOPTION?‡BEQ.SF100ƒBRANCHIFNO3‡LEAFMSG640-DATASG(A5),A0YES,K:DON'TCHANGEMODES‡MOVE.L#14,D0MESSAGELENGTH+‡BSRWRTMESSOUTPUTTHEMESSAGETOTHEUSER ‡RTSRETURN:F100ƒLEAOUTBUF-DATASG(A5),A3SCREENOUTPUTBUFF ERADDRESS‡BSRCLRMSG…CLEARANYMESSAGE$‡TST.BCRTCHG(A1)FILEUPDATETODO?‡BEQ.SF110BRANCHIFNO)ˆMOVE.B‚#1,FSTSW-DATASG(A5)‚TURNOFFFLAG,ˆBSRƒCKREAD‡GOINSERTORREPLACETHISRECORD.F110„TST.BCURMODE-DATASG(A5)‚INCOMMANDMODE?ˆBEQ.SF140„BRANCHIFYES**ˆSETTOCOMMANDMODE*'ˆBSRSETCP3‚SETCOMMANDMODEPROTECTION3ˆCLR.BCURMODE-DATASG(A5)ƒTURNONCOMMANDMODEFLAG&ˆTST.LMAXLINE-DATASG(A5)„ANYRECORDS?7ˆBMI.SF130ƒBRANCHIFNORECORDS,DON'TCHANGEANYTHING*ˆTST.BCRTCHG(A1)WASTHEREAFILECHANGE?(ˆBNE.SF115BRANCHIFYES,AFILECHANGE$ˆTST.BEMTYFILE-DATASG(A5)OLDFILE?#ˆBEQ.SF115BRANCHIFYES,OLDFILE;ˆMOVE.B#WRTABS,(A3)+PROMPTISONWRONGLINE,MUSTMOVEIT!ˆMOVE.B#STRT,(A3)+STARTOFDATA-ˆMOVE.BCRTLINE(A1),(A3)+CURRENTLINENUMBER ˆMOVE.B#POSONE,(A3)+COLUMNONE!ˆMOVE.B#BLANK,(A3)+BLANKITOUT ˆMOVE.B#ENDOD,(A3)+ENDOFDATA$ˆMOVE.B#WRTABS,(A3)+WRITEABSOLUTE!ˆMOVE.B#STRT,(A3)+STARTOFDATA2ˆMOVE.BSAVEP-DATASG(A5),(A3)+CORRECTLINENUMBER ˆMOVE.B#POSONE,(A3)+COLUMNONEˆMOVE.B#PROMPT,(A3)+PROMPT ˆMOVE.B#ENDOD,(A3)+ENDOFDATA6ˆMOVE.BSAVEP-DATASG(A5),CRTLINE(A1)RESETLINENUMBER"F115„BSRTESTOLD1FIXUPALLFLAGS6ˆTST.LFILELINE-DATASG(A5)„SEEIFFILELINEISNEGATIVE ˆBPL.SF120ƒBRANCHIFNOTNEG,OK-ˆCLR.LFILELINE-DATASG(A5)†FORCEFIRSTRECORD-F120ƒMOVE.LMAXLINE-DATASG(A5),D1GETMAXLINE9‡CMP.LFILELINE-DATASG(A5),D1SEEIFFILELINEBEYONDFILE ‡BGE.SF130ƒBRANCHIFNOTBEYONDD‡MOVE.LMAXLINE-DATASG(A5),FILELINE-DATASG(A5)…RESETFILELINETOEND*F130ƒBRADOOUTGODOTHEOUTPUTANDRETURN**ˆSETTOPAGEMODE*+F140ƒBSRSETPP3„GOSETPAGEMODEPROTECTION'‡MOVE.B#LOADCUR,(A3)+LOADCURSORCODE%‡MOVE.BSAVEP-DATASG(A5),(A3)+‚LINE##‡MOVE.B#COLTWO,(A3)+COLUMNNUMBER,‡MOVE.B#1,CURMODE-DATASG(A5)‚PAGEMODEFLAG‡BRAF130GODOTHEOUTPUTˆPAGEB*******************************************************************&*…FKEY3…SCROLLSCREENFORWARDONEPAGE*…REV1.00‚12-3-79‚(C313)*…REV2.00‚7-15-81‚(C313)*…ENTRY:A1=INPUTBUFFERADDRESS'*…USES:A3=SCREENOUTPUTBUFFERADDRESS *…EXIT:THRUDELETELINEROUTINE'*…CALLS:FKEYSTUPTESTOLD1EOFMSG3DOOUT*‹01234567 *…REGS:D„* *ŠA‚Pƒ*ƒPA*****************************************************************-FKEY3„EQU‚*ŽSCROLLSCREENFORWARD1PAGE‚(A2)$‰BSR‚FKEYSTUPƒGODOCOMMONFUNCTIONS&‡TST.LMAXLINE-DATASG(A5)…ANYRECORDS? ˆBMI.SF330ƒBRANCHIFNORECORDS ‰BSR‚TESTOLD1‡TURNOFFNEWFLAGS7‰ADD.L‚#FULSCRN,TOPLINE-DATASG(A5)„POINTTONEWTOPLINE7‰MOVE.LTOPLINE-DATASG(A5),D2GETNEWTOPRECORDNUMBER)‰CMP.L‚MAXLINE-DATASG(A5),D2†WITHINFILE?‰BLE.S‚F335ŒBRANCHIFWITHIN<‰SUB.L‚#FULSCRN,TOPLINE-DATASG(A5)…RESETTOPLINETOORIGINAL%F320„BSREOFMSG3’GOBUILDEOFMESSAGE"ˆBRADELINE10†GODOALLTHEOUTPUT*!*ˆNORECORDS-IGNORETHISFUNCTION*3F330„MOVE.B#POSONE,CRTLINE(A1)FORCESCREENLINE1ˆBRADELINE10GODOTHEOUTPUT**ˆWITHINTHEFILE-DOTHESCROLL*DF335„ADD.L#FULSCRN,FILELINE-DATASG(A5)„UPDATECURRENTRECORDNUMBER-F340„BSRDOOUT„GOOUTPUTWHATEVERWENOWHAVE#F350…BSRWRTSCRNGOOUTPUTTHEPAGE/†LEA‚OUTBUF-DATASG(A5),A3„OUTPUTBUFFERADDRESS"†MOVE.B#LOADCUR,(A3)+LOADCURSOR,†MOVE.B‚CRTLINE(A1),(A3)+‚SCREENLINENUMBER(†MOVE.B‚#COLTWO,(A3)+ƒSETFOR1STCOLUMN%†BRAF320GOSEEIFEOFANDDOOUTPUT†PAGEB******************************************************************!*†FKEY4‚SCROLLSCREENBACK1PAGE*†REV1.00‚12-3-79‚(C313)*†REV2.00‚7-15-81‚(C313)*†ENTRY:A1=INPUTBUFFERADDRESS'*†USES:A3=SCREENOUTPUTBUFFERADDRESS *†EXIT:THRUDELETELINEROUTINE*†CALLS:FKEYSTUPTESTOLD1*Œ01234567 *†REGS:D* *‹A‚Pƒ*ƒP=**************************************************************FKEY4…EQU„*ŽSCROLLSCREENBACK1PAGEƒ(A3)!‰BSR‚FKEYSTUP‰GODOCOMMONSETUP&‡TST.LMAXLINE-DATASG(A5)„ANYRECORDS?‡BMIF330ƒBRANCHINNORECORDS ˆBSR‚TESTOLD1ŠTURNOFFNEWFLAGS6ˆTST.LTOPLINE-DATASG(A5)SEEIFALREADYATFIRST LINE!ˆBEQ„F320‹BRANCHIFINFIRSTLINE4ˆSUB.L‚#FULSCRN,TOPLINE-DATASG(A5)UPDATETOPRECORD9†SUB.L‚#FULSCRN,FILELINE-DATASG(A5)‚UPDATECURRENTRECORD,‡TST.LTOPLINE-DATASG(A5)ŒSEEIFWITHINFILE/‡BGE‚F340ŒBRANCHIFWITHINFILE-WRITETOSCREEN<‡CLR.L‚TOPLINE-DATASG(A5)„WRITETOSCREENSTARTINGATLINE1"‡CLR.L‚D0ŽCLEARFORBYTEOPERATION-‡MOVE.B‚CRTLINE(A1),D0…GETCURSORLINENUMBER‡SUB.B‚#POSONE,D0ŠSTRIPASCII8‡MOVE.L‚D0,FILELINE-DATASG(A5)†UPDATEDISKRECORDNUMBER†BRAƒF340GOWRITESCREEN†PAGEB*******************************************************************$*†FKEY5‚SCROLLSCREENFORWARD1LINE**†REV‚1.00‚12-3-79‚(C313)*†REV‚2.00‚7-15-81‚(C313)*†ENTRY:A1=INPUTBUFFERADDRESS'*†USES:A3=SCREENOUTPUTBUFFERADDRESS *†EXIT:THRUDELETELINEROUTINE)*†CALLS:FKEYSTUPTESTOLD1EOFMSG3CKREAD1*Œ01234567*†REGS:D**ƒ*…* *‹A‚Pƒ*ƒPA*****************************************************************-FKEY5„EQU„*ŒSCROLLSCREENFORWARD1LINE‚(A4) ‰BSR‚FKEYSTUP…GODOCOMMONSETUP&‡TST.LMAXLINE-DATASG(A5)ˆANYRECORDS? ‡BMI.SF520ƒBRANCHIFNORECORDS ˆBSR‚TESTOLD1‡TURNOFFNEWFLAGS2ˆADD.L‚#1,TOPLINE-DATASG(A5)†POINTTONEWTOPLLINE5ˆADD.L‚#1,FILELINE-DATASG(A5)†POINTTOCURRENTRECORD5ˆMOVE.L‚MAXLINE-DATASG(A5),D0‡GETMAXNUMBEROFLINES7ˆMOVE.L‚TOPLINE-DATASG(A5),D1‡GETTOPLINERECORDNUMBER0ˆADD.L‚#WRAPVAL,D1ˆNEWBOTTOMLINERECORDNUMBER&ˆCMP.L‚D1,D0SEEIFBOTTOMBEYONDFILE!ˆBGE.S‚F530BRANCHIFWITHINFILE*.*ˆBEYONDFILE-CANNOTSCROLL-RESETALLPOINTERS*,ˆSUB.L‚#1,TOPLINE-DATASG(A5)‚RESTORETOPLINE;ˆSUB.L‚#1,FILELINE-DATASG(A5)ƒRESTORECURRENTRECORDNUMBER!ˆBSRƒEOFMSG3ŽGOBUILDEOFMESSAGEˆBRADELINE10ŽGODOTHEOUTPUT**ˆNOFILERECORDS*5F520„MOVE.B#POSONE,CRTLINE(A1)‚FORCESCREENLINEONEˆBRADELINE10’GODOTHEOUTPUT**ˆWITHINTHEFILE*&F530 MOVE.B #LOADCUR,(A3)+ LOAD CURSOR MOVE.B #POSONE,(A3)+ TO TOP% MOVE.B #COLTWO,(A3)+ TO FIRST COLUMN& MOVE.B #DELLINE,(A3)+ DELETE TOP LINE3 MOVE.L TOPLINE-DATASG(A5),D1 GET TOP RECORD NUMBER0 ADD.L #WRAPVAL,D1 POINT TO BOTTOM RECORD NUMBER MOVE.L #1,D6 READ 1 RECORD" BSR CKREAD1 GO READ BOTTOM RECORD TST.L D1 GOT IT?# BMI EDIT3 BRANCH IF NO,FATAL ERROR+ MOVE.B #LINE20,D3 SET FOR BOTTOM LINE CODE, BRA DELINE60 GO BUILD REST OF OUTPUT BUFFERˆPAGE<*************************************************************!*†FKEY6‚SCROLLSCREENBACK1LINE*†REV‚1.00‚12-3-79‚(C313)*†REV‚2.00‚7-15-81‚(C313)*†ENTRY:A1=INPUTBUFFERADDRESS'*†USES:A3=SCREENOUTPUTBUFFERADDRESS(*†CALLS:FKEYSTUPTESOLD1EOFMSG3CKREAD1 *†EXIT:THRUDELETELINEROUTINE*Œ01234567*†REGS:D‚*ƒ*…* *‹A‚Pƒ*ƒ*D*********************************************************************FKEY6„EQUƒ*‰SCROLLSCREENBACK1LINE‚(A5) ˆBSRFKEYSTUP†GODOCOMMONSETUP&‡TST.LMAXLINE-DATASG(A5)…ANYRECORDS?‡BMIƒF520BRANCHIFNORECORDS ˆBSR‚TESTOLD1†TURNOFFNEWFLAGS1ˆSUB.L‚#1,TOPLINE-DATASG(A5)ƒPOINTTONEWTOPLINE6ˆSUB.L‚#1,FILELINE-DATASG(A5)ƒPOINTTONEWDISKRECORD,ˆTST.L‚TOPLINE-DATASG(A5)SEEIFBEYONDFILE!ˆBGE.S‚F620’BRANCHIFWITHINFILE*.*†HEREIFCAN'TSCROLLDOWN1LINE-BEYONDFILE*,‡ADD.L‚#1,TOPLINE-DATASG(A5)…RESTORETOPLINE8‡ADD.L‚#1,FILELINE-DATASG(A5)†RESTOREDISKRECORDNUMBER!‡BSREOFMSG3’GO‚BUILDEOFMESSAGE"‰BRADELINE10ƒGODORESTOFOUTPUT**ˆWITHINTHEFILE*&F620„MOVE.B#LOADCUR,(A3)+LOADCURSOR"ˆMOVE.B‚#LINE20,(A3)+‚LINE20CODE#ˆMOVE.B‚#COLTWO,(A3)+‚COLUMN2CODE'ˆMOVE.B‚#DELLINE,(A3)+DELETELASTLINE"ˆMOVE.B‚#LOADCUR,(A3)+LOADCURSORˆMOVE.B‚#POSONE,(A3)+LINE1ˆMOVE.B‚#COLTWO,(A3)+COLUMN2'ˆMOVE.B‚#INSRTLN,(A3)+INSERTLINECODE+ˆMOVE.LTOPLINE-DATASG(A5),D1READTOPLINEˆMOVE.L#1,D6READ1RECORDˆBSRCKREAD1GOREADTHERECORD‡TST.L‚D1SEEIFDIDREAD#‡BMIƒEDIT3BRANCHIFNO,FATALERROR$†MOVE.B‚#POSONE,D3†CODEFORTOPLINE†BRADELINE60ŒGODOTHEOUTPUT†PAGEA******************************************************************0*‚ FKEY11‚SETTABSTOPINCURRENTCOLUMNPOSITION4*ŠDELETESTHEDEFAULTTABSTOPSOFEVERY10THCOLUMN-*ŠUSESTABCOMMANDCODETODOTHETABSETTING*‚REV.1.00‚5/11/81‚(C313)!*‚ENTRY:A1=COMMANDPACKETADDRESS*‚EXIT:THRUDOOUTROUTINE"*‚CALLS:CKREAD‚TAB00‚DOOUT‚WRTMESS*A***************************************************************** FKEY11 EQU **TST.BCURMODE-DATASG(A5)„INCOMMANDMODE?, BEQ.S FKEY11A BRANCH IF YES,NO FILE CHANGES& TST.B CRTCHG(A1) A FILE CHANGE TO DO?- BEQ.S FKEY11A BRANCH IF NO FILE CHANGE TO DO-MOVE.B#1,FSTSW-DATASG(A5)‚TURNOFFNEWFLAG, BSR CKREAD GO INSERT OR REPLACE THIS RECORD1FKEY11ACMP.B#20,TABCNT-DATASG(A5)„ATMAXCOUNT?$ BGE.S FKEY11D BRANCH IF REACHED MAX CLR.L D0 CLEAR FOR USE4 MOVE.B CRTCOL(A1),D0 GET COLUMN NUMBER FOR TAB STOP5 LEA LISTPB-DATASG(A5),A4 SET-UP AS IF IN TAB COMMAND MOVE.L #10,D1 BUFFER LENGTH4FKEY11B CLR.L (A4)+ MUST FIRST CLEAR OUT THIS BUFFER SUB.L #1,D1 DECREMENT COUNTER! BNE.S FKEY11B BRANCH TIL CLEARED0 LEA LISTPB-DATASG(A5),A4 RESTORE BUFFER ADDRESS6 SUB.B #$20,D0 STRIP THE OFFSET FROM THE COLUMN NUMBER4 MOVE.B D0,(A4) SAEV THE COLUMN NUMBER IN THE BUFFER' ORI.B #$80,(A4) TURN ON THE FOUND FLAG2 MOVE.B CRTLINE(A1),-(A7) SAVE CURRENT LINE NUMBER3MOVE.BCRTCOL(A1),-(A7)‚SAVECURRENTCOLUMNNUMBER? BSR TAB00 GO USE THE TAB COMMAND TO SET AND SAVE THIS TAB STOP& MOVE.B (A7)+,D1 RESTORE COLUMN NUMBER$ MOVE.B (A7)+,D0 RESTORE LINE NUMBER*TST.BCURMODE-DATASG(A5)‚INCOMMANDMODE? BEQ.S FKEY11C BRANCH IF YES6FKEY11E LEA OUTBUF-DATASG(A5),A3 OUTPUT BUFFER ADDRESS' MOVE.B #LOADCUR,(A3)+ LOAD CURCOR CODE MOVE.B D0,(A3)+ LINE # MOVE.B D1,(A3)+ COLUMN #.BRA‚DOOUTGOREPOSITIONTHECURSORANDRETURN=FKEY11D LEA TABMSG-DATASG(A5),A0 OUTPUT REACHED MAX # OF TABS MOVE.L #26,D0 MESSAGE LENGTH" BSR WRTMESS GO OUTPUT THE MESSAGEFKEY11C RTS RETURN PAGEA*****************************************************************2*‚FKEY12‚DELETEATABSTOPFROMTHECURRENTCOLUMN*‚REV.1.00‚5/11/81‚(C313)!*‚ENTRY:A1=COMMANDPACKETADDRESS/*‚EXIT:THRUDOOUTROUTINE‚ERROREXIT:EDITERROR*‚CALLS:CKREADA*****************************************************************0FKEY12TST.BCURMODE-DATASG(A5)…INCOMMANDMODE?, BEQ.S FKEY12A BRANCH IF YES,NO FILE CHANGES( TST.B CRTCHG(A1) ANY FILE CHANGE TO DO? BEQ.S FKEY12A BRANCH IF NO- MOVE.B #1,FSTSW-DATASG(A5) TURN OFF NEW FLAG, BSR CKREAD GO INSERT OR REPLACE THIS RECORDFKEY12A CLR.L D0 CLEAR FOR USE'TST.BTABCNT-DATASG(A5)ƒANYTODELETE?% BLE.S FKEY12E BRANCH IF NO,IGNORE IT/ MOVE.B CRTCOL(A1),D0 GET CURRENT COLUMN NUMBER SUB.B #$20,D0 STRIP THE OFFSET% MOVE.L D0,D4 SAVE THIS COLUMN NUMBER MOVE.L D4,D5 AND SAVE AGAINN LEA OUTBUF-DATASG(A5),A2 OUTPUT BUFFER ADDRESS,USE FOR DELETING THIS TAB STOP$ MOVE.B #STABS,(A2)+ TAB ACTION CODE3FKEY12B MOVE.B #BLANK,(A2)+ BLANKS TO OUTPUT BUFFER SUB.L #1,D0 DECREMENT COUNTER/ BNE.S FKEY12B BLANKS TIL REACHED COLUMN NUMBER+ MOVE.B #CANCELT,(A2)+ CANCEL TAB STOP CODE( MOVE.B #LF1,(A2)+ TAB ACTION TERMINATOR! ADD.L #3,D4 OUTPUT BUFFER LENGTH1 CRT.OUT CRTIOS,OUTBUF,D4 OUTPUT THE TAB DELETION% BNE EDITERROR BRANCH IF AN I/O ERROR***ˆFINDTHETABSTOPINTHESAVEDTABTABLE*; MOVE.B TABCNT-DATASG(A5),D1 GET CURRENT NUMBER OF TAB STOP+ LEA SVTABS-DATASG(A5),A2 TAB TABLE ADDRESS&FKEY12C MOVE.B (A2)+,D0 GET A TAB STOP CMP.B D0,D5 SAME AS THIS ONE? BEQ.S FKEY12D BRANCH IF YES SUB.B #1,D1 DECREMENT COUNTER$ BNE.S FKEY12C SEARCH COMPLETE TABLE;BRA.S‚FKEY12E„IGNOREIFNOTFOUND,GOREPOSITIONTHECURSOR**ˆFOUNDTHETABSTOPTODELETE*0FKEY12D MOVE.B (A2),-1(A2) MOVE THE TAB STOPS UP ADD.L #1,A2 BUMP THE ADDRESS" SUB.B #1,D1 DECREMENT THE COUNTER' BNE.S FKEY12D BRANCH TIL ALL ARE MOVED$ CLR.B -1(A2) CLEAR OUT THE LAST ONE?SUB.B#1,TABCNT-DATASG(A5)…UPDATENUMBEROFTABSCURRENTLYSET1FKEY12E TST.B CURMODE-DATASG(A5) IN COMMAND MODE?ˆBEQ.SFKEY12FBRANCHIFYES.ˆMOVE.BCRTLINE(A1),D0GETCURRENTLINENUMBER/ MOVE.B CRTCOL (A1),D1 GET CURRENT COLUMN NUMBER0 BRA FKEY11E GO REPOSITION THE CURSOR AND RETURN)FKEY12FƒRTSRETURN,DONEWITHTABDELETION PAGEC*******************************************************************(*„INSERTLINEƒMOVEALLLINESDOWN1LINE*’FROMFILELINETOEND+1*’BLANKLINETOCURRENTLINE*†REV1.00‚12-3-79‚(C313)*†REV2.00‚3/31/81‚(C313)*†CALLS:CKREAD‚TESTOLD1‚UPDATE*†EXITS:READCMD*ŒMAINPROGRAM*C******************************************************************* INSLINƒEQUƒ*0‡TST.B‚CURMODE-DATASG(A5)‡SEEIFINCOMMANDMODE/ˆBEQ‚READCMD†INCOMMANDMODE-IGNOREINSERTLINE-‰TST.B‚CRTCHG(A1)„SEEIFACHANGETODOFIRST"‰BEQ.S‚INSLIN2‡BRANCHIFNOCHANGE$‰TST.BEMTYFILE-DATASG(A5)…OLDFILE? ‰BEQ.SINSLIN1‡BRANCHIFYES,OLD1‰MOVE.B#INSRTCMD,D1‚SETUPFORINSETONNEWFILE=‰ADD.L#1,MAXLINE-DATASG(A5)ƒUPDATENUMBEROFRECORDSINFILE!‰BSRUPDATEŠGOINSERTTHISRECORD2‰ADD.L#1,FILELINE-DATASG(A5)ƒPOINTTOTHISRECORD%‰BRA.SINSLIN2‡GOCONTINUEPROCESSING0INSLIN1‚MOVE.B‚#1,FSTSW-DATASG(A5)TURNOFFFLAG,‰BSR„CKREADˆGOINSERTORREPLACETHISRECORD-INSLIN2TST.LMAXLINE-DATASG(A5)ƒANYRECORDS?.‰BMI.SINSLIN3BRANCHIFNO,IGNORETHISINSERT ‰BSR‚TESTOLD1‡TURNOFFNEWFLAGS0‰MOVE.L‚#7,CRTLNG-DATASG(A5)…CODEFORBLANKLINE+‰MOVE.B‚#INSRTCMD,D1†INSERTCOMMANDFORFMS*‰BSR„UPDATE‹GOUPDATEDISKFILEANDSCREEN5‰ADD.L‚#1,MAXLINE-DATASG(A5)ƒUPDATE#OFDISKRECORDSINSLIN3‚RTS™RETURN‰PAGEC********************************************************************/*…DELETELINE…DELETECURRENTLINEANDMOVEREST*•OFLINESUPONELINE*†REV‚1.00‚12-3-79‚(C313)*†REV‚2.00‚7-15-81‚(C313*†ENTRY:A1=INPUTBUFFERADDRESS*†USES:A3=OUTPUTBUFFEADDRESS*†EXIT:READCMD‚DOOUT<*†NOTE:MOSTFUNCTIONKEYSANDCURSORMOVEMENTFKEYSUSETHIS7*‹ROUTINETOBUILDPARTSOFTHIEROUTPUTBUFFER,DOTHE-*‹OUTPUT,ANDRETURN‚TOTHEMAINPARTOFEDIT.5*‹ALLTHESCREENOUTPUTISBUILTWHILEPROCESSINGAND.*‹THEOUTPUTISDONEATTHEENDOFPROCESSING.*†CALLS:FMSSETCP3CKREAD1*Œ01234567*†REGS:D****…* *‹A*P**ƒPD******************************************************************** DELINEƒEQUƒ*0‡TST.B‚CURMODE-DATASG(A5)‚SEEIFINCOMMANDMODE6†BEQ‚READCMD„BRANCHIFCOMMANDMODE-IGNOREDELETELINE&†TST.LMAXLINE-DATASG(A5)‚ANYRECORDS?6†BMI‚DELINE90BRANCHIFNORECORDS,IGNORETHISCOMMAND$†TST.B‚EMTYFILE-DATASG(A5)NEWFILE?9†BNE„DELINE95ƒBRANCHIFNEW,GOMOVETHECURSORANDPROMPT6†LEAOUTBUF-DATASG(A5),A3SCREENOUTPUTBUFFERADDRESS6‰MOVE.B‚#0,CRTCHG(A1)„IGNORECHANGE-DELETINGTHISLINE7‰LEA‚FMSPKT-DATASG(A5),A0ˆADDRESSOFFMSCOMMANDPACKET0‰MOVE.B‚#DELCMD,FMSCMD(A0)„DELETERECORDCOMMAND‰MOVE.L#1,D6‘DELETE1RECORD#‰BSR‚FMS•DELETETHISRECORDONDISK‰TST.L‚D0”RECORDFOUND?(‰BNE‚F350”BRANCHIFNO,GOREWRITESCREEN4‰TST.L‚MAXLINE-DATASG(A5)„SEEIFDELETEDONLYRECORD‰BEQ„DELINE80ŽBRANCHIFYES2‰SUB.L‚#1,MAXLINE-DATASG(A5)UPDATE#DISKRECORDS**†SEEIFDELETEDLASTRECORD*,ˆMOVE.B‚CRTLINE(A1),D0CURRENTCURSORLINE#$ˆSUB.B#POSONE,D0‚STRIPASCIIOFFSET2ˆADD.LTOPLINE-DATASG(A5),D0CURRENTRECORDNUMBER3ˆSUB.LMAXLINE-DATASG(A5),D0‚SEEIFWITHINTHEFILE'ˆBLEƒDELINE50BRANCHIFWITHINTHEFILE.ˆSUB.BD0,CRTLINE(A1)RESETSCREENLINENUMBER;ˆMOVE.LMAXLINE-DATASG(A5),D1SEEIFANYTHINGONTHESCREEN0ˆCMP.LTOPLINE-DATASG(A5),D1†SEEIF>THANTOP#/ˆBLT.SDELINE30BRANCHIFNOTHINGONTHESCREEN*!*ˆRESETTHECURSORANDTHEPROMPT**DELINE00 MOVE.B #LOADCUR,(A3)+ LOAD CURSOR …MOVE.BCRTLINE(A1),(A3)+‚LINE#!…MOVE.BCRTCOL(A1),(A3)+COLUMN#/DELINE10TST.BCURMODE-DATASG(A5)†INPAGEMODE?&…BNE.SDELINE15BRANCHIFINPAGEMODE"…BSRSETCP3SETCOMMANDPROTECTION1DELINE15 MOVE.B #WRTABS,(A3)+ WRITE ABSOLUTE CODE&…MOVE.B‚#STRT,(A3)+‚STARTOFDATACODE0…MOVE.B‚SAVEP-DATASG(A5),(A3)+‚OLDPROMPTLINE#…MOVE.B‚#POSONE,(A3)+COLUMN#-…MOVE.B‚#BLANK,(A3)+‚BLANKOUTTHEOLDPROMPT%…MOVE.B‚#ENDOD,(A3)+‚ENDOFDATACODE$…MOVE.B‚#WRTABS,(A3)+WRITEABSOLUTE&…MOVE.B‚#STRT, (A3)+STARTOFDATACODE8…MOVE.B‚CRTLINE(A1),(A3)+CURRENTLINENUMBERFORPROMPT…MOVE.B‚#POSONE,(A3)+COLUMN1#…MOVE.B‚#PROMPT,(A3)+PROMPTSYMBOL%…MOVE.B‚#ENDOD,(A3)+ENDOFDATACODE4…MOVE.BCRTLINE(A1),SAVEP-DATASG(A5)ƒSAVENEWLINE#:…BRADOOUTƒGODOTHESCREENOUTPUTANDRETURNTOMAINPART*/*ˆSCREENISEMPTY-PUTLASTRECORDONTHESCEEEN*HDELINE30 MOVE.L MAXLINE-DATASG(A5),TOPLINE-DATASG(A5) LAST RECORD NUMBER=…MOVE.LMAXLINE-DATASG(A5),FILELINE-DATASG(A5)‚CURRENTRECORD.…MOVE.B‚#POSONE,CRTLINE(A1)SCREENLINENUMBER…MOVE.L‚#1,D6READ1RECORD…BSRCKREAD1‡GOREADTHERECORD…TST.LD1GOTIT?+DELINE40 BMI EDIT3 BRANCH IF NO,FATAL ERROR(…MOVE.BCRTLINE(A1),D3GETSCREENLINE#'…BRA.SDELINE60GOSETUPRESTOFOUTPUT*#*ˆWRITENEWLASTLINETOTHESCREEN*.DELINE50 MOVE.L #WRAPVAL,D1 SCREEN LINE OFFSET2…ADD.LTOPLINE-DATASG(A5),D1RECORDNUMBERTOREAD…MOVE.L#1,D6READ1RECORD…BSRCKREAD1GOREADIT…TST.LD1GOTIT?1…BMI.SDELINE75BRANCHIFNO,GOREPOSITIONCURSOR+…MOVE.B#POSONE,D3FIRSTSCREENLINENUMBER$…ADD.B#WRAPVAL,D3ADDINTHEOFFSET1DELINE60 LEA EDITBUF-DATASG(A5),A2 RECORD ADDRESS'…MOVE.B#LOADCUR,(A3)+LOADCURSORCODE#…MOVE.BD3,(A3)+SCREENLINENUMBER…MOVE.B#COLTWO,(A3)+CLOUMN2 …MOVE.L#RECLNG,D2RECORDLENGTH3DELINE70 MOVE.B (A2)+,(A3)+ RECORD TO OUTPUT BUFFER…SUB.L#1,D2DECREMENTCOUNTER8…BNE.SDELINE70BRANCHTILRECORDMOVEDTOOUTPUTBUFFER*DELINE75 BRA DELINE00 GO FINISH THE OUTPUT**†NOMORERECORDSINTHEFILE*;DELINE80ƒCLR.L‚FILELINE-DATASG(A5)„SETRECORDNUMBERTONEW4ˆCLR.L‚TOPLINE-DATASG(A5)„SETTOPSCREENLINETONEW<ˆMOVE.B‚#-1,EMTYFILE-DATASG(A5)„SETFILETONEWOROLDEMPTY.ˆMOVE.B‚#1,FILETYPE-DATASG(A5)†SETFILETONEW.ˆMOVE.L‚#-1,MAXLINE-DATASG(A5)†RESETMAXCOUNT/ˆCLR.B‚FSTSW-DATASG(A5)‡RESETFIRSTTIMESWITCHDELINE90RTS†RETURN*7*‡NEWFILE-MOVETHECURSORANDTHEPROMPTUPONELINE*7DELINE95‚LEAOUTBUF-DATASG(A5),A3OUTPUTBUFFERADDRESS'ŠSUB.B#1,CRTLINE(A1)POINTUPONELINE%ŠBSRTESTOLDGOSETFLAGSTOOLDFILE+ŠBRADELINE00GOMOVETHECURSORANDPROMPT‰PAGE>**************************************************************"*ˆFKEYSTPCOMMONFUNCTONKEYSETUP#*ˆLOADSOUTPUTBUFFERADDRESSTOA3!*ˆBUILDSMESSAGECLEARONLINE21"*ˆBUILDSPAGEPROTECTIONIFNEEDED*ˆUPDATESFILEIFNEEDED*ˆENTRY:A1=INPUTBUFFERADDRESS*ˆEXIT:A1=INPUTBUFFERADDRESS"*ŽA3=CURRENTOUTPUTBUFFERADDRESS*ˆCALLS:CLRMSG‚SETPP3‚CKREAD*Ž01234567*ˆREGS:D *A‚PƒRƒP>**************************************************************FKEYSTUP EQU */‰LEAOUTBUF-DATASG(A5),A3‚OUTPUTBUFFERADDRESS‰BSRƒCLRMSG…BUILDMESSAGECLEAR'‰TST.BCURMODE-DATASG(A5)ƒINPAGEMODE?$‰BNE.SFKEY10ƒBRANCHIFINPAGEMODE;‰BSR.SSETPP3…INCOMMANDMODE,MUSTSETPAGEMODEPROTECTION,FKEY10ƒTST.BCRTCHG(A1)AFILECHANGETODO?!‰BEQ.SFKEY30BRANCHIFNOCHANGE7‰MOVE.B#1,FSTSW-DATASG(A5)ACHANGE,TURNOFFNEWFLAG‰BSRCKREADˆGOUPDATETHEFILEFKEY20ƒRTS‘RETURN1FKEY30ƒTST.LMAXLINE-DATASG(A5)ANYFILERECORDS?(ˆBMIFKEY20BRANCHIFNO,NOFILERECORDS;ˆMOVE.B#1,FSTSW-DATASG(A5)HAVERECORDS,TURNOFFNEWFLAGˆBRAFKEY20ANDRETURNˆPAGE>***************************************************************0*ˆSETPP3‚BUILDPAGEPROTECTIONCODESINTOBUFFER*ˆPOINTEDTOBYA3.*>**************************************************************,SETPP3‚MOVE.B#TOPDIS,(A3)+TOPDISPLAYCODEˆMOVE.B#POSONE,(A3)+LINE1)ˆMOVE.B#BOTDIS,(A3)+BOTTOMDISPLAYCODEˆMOVE.B#LINE20,(A3)+LINE20(ˆMOVE.B#LEFTDIS,(A3)+LEFTDISPLAYCODEˆMOVE.B#COLTWO,(A3)+COLUMN2 ˆRTSˆRETURN***>***************************************************************3*ˆSETCP3‚BUILDCOMMANDPROTECTIONCODESINTOBUFFER*ˆPOINTEDTOBYA3.*>**************************************************************/SETCP3ƒMOVE.B#BOTDIS,(A3)+BOTTOMDISPLAYCODE‰MOVE.B#LINE22,(A3)+LINE22&‰MOVE.B#TOPDIS,(A3)+TOPDISPLAYCODE ‰MOVE.B#LINE22,(A3)+LINE22(‰MOVE.B#LEFTDIS,(A3)+LEFTDISPLAYCODE‰MOVE.B#COLTWO,(A3)+COLUMN2)‰MOVE.B#WRTABS,(A3)+WRITEABSOLUTECODE&‰MOVE.B#STRT,(A3)+STARTOFDATACODE‰MOVE.B#LINE22,(A3)+LINE22‰MOVE.B#POSONE,(A3)+COLUMN1#‰MOVE.B#PROMPT,(A3)+PROMPTSYMBOL%‰MOVE.B#ENDOD,(A3)+ENDOFDATACODE'‰MOVE.B#LOADCUR,(A3)+LOADCURSORCODE‰MOVE.B#LINE22,(A3)+LINE22‰MOVE.B#COLTWO,(A3)+COLUMN2 ‰RTSRETURN‰PAGE?****************************************************************%*ˆCLRMSG‚CLEARANYMESSAGEONLINE215*ˆBUILDSTHEOUTPUTINTOTHEBUFFERPOINTEDTOBYA3.*?***************************************************************/CLRMSG MOVE.B #WRTABS,(A3)+ WRITE ABSOLUTE CODE&‰MOVE.B#STRT,(A3)+STARTOFDATACODE‰MOVE.B#LINE21,(A3)+LINE21‰MOVE.B#POSONE,(A3)+‚COLUMN1"‰MOVE.L#34,D0MESSAGELINELENGTH.CLRMSG10 MOVE.B #BLANK,(A3)+ BLANK TO THE LINE‰SUB.L#1,D0DECREMENTCOUNTER"‰BNE.SCLRMSG10BRANCHTILBLANKED%‰MOVE.B#ENDOD,(A3)+ENDOFDATACODE‰RTS‰PAGE@*****************************************************************6*ˆEOFMSG3BUILDENDOFFILEMESSAGEINTOOUTPUTBUFFER9*ˆANDREPOSITIONCURSORIFEITHERLASTLINEORFIRSTLINE*ˆOFFILEISONTHESCREEN. *ˆENTRY:A3=OUTPUTBUFFERADDRESS*Ž01234567 *ˆREGS:D** *A‚PƒR*P*?***************************************************************0EOFMSG3TST.LTOPLINE-DATASG(A5)‰ATTOPOFFILE?‰BEQ.SEOFM10BRANCHIFYES3‰MOVE.LTOPLINE-DATASG(A5),D0GETTOPRECORDNUMBER,‰ADD.L#FULSCRN,D0ADDINFULLSCREENOFFSET/‰CMP.LMAXLINE-DATASG(A5),D0SEEIFWITHINFILE$‰BLE.SEOFMRTSBRANCHIFWITHINFILE**ˆBUILDTHEOUTPUTMESSAGE*0EOFM10 LEA FMSG200-DATASG(A5),A4 MESSAGE ADDRESS‰MOVE.L#22,D0MESSAGELENGTH)‰MOVE.B#WRTABS,(A3)+WRITEABSOLUTECODE&‰MOVE.B#STRT,(A3)+STARTOFDATACODE‰MOVE.B#LINE21,(A3)+LINE21‰MOVE.B#POSONE,(A3)+COLUMN1!‰MOVE.L#34,D1MAXMESSAGELENGTH#‰SUB.LD0,D1#BYTESBEYONDMESSAGE2EOFM20ƒMOVE.B(A4)+,(A3)+MESSAGETOOUTPUTBUFFER‰SUB.L#1,D0DECREMENTCOUNTER"‰BNE.SEOFM20BRANCHTILMOVEDALL‰TST.LD1ANYEXTRABYTES?‰BLE.SEOFM40BRANCHIFNO:EOFM30ƒMOVE.B#BLANK,(A3)+BLANKFILLRESTOFMESSAGELINE‰SUB.L#1,D1DECREMENTCOUNTER ‰BNE.SEOFM30BRANCHTILBLANKED+EOFM40‚MOVE.B#ENDOD,(A3)+ENDOFDATACODE*/*ˆREPOSITIONCURSOR-FIXUPCURRENTRECORDNUMBER*‰CLR.LD0CLEARFORUSE.‰MOVE.BCRTLINE(A1),D0GETCURRENTLINENUMBER$‰SUB.B#POSONE,D0STRIPASCIIOFFSET2‰ADD.LTOPLINE-DATASG(A5),D0CURRENTRECORDNUMBER@‰SUB.LMAXLINE-DATASG(A5),D0SEEIFWITHINFILE-OFFSETONSCREEN$‰BLE.SEOFMRTSBRANCHIFWITHINFILE3‰SUB.BD0,CRTLINE(A1)REPOSITIONCURSORLINENUMBER:‰SUB.LD0,FILELINE-DATASG(A5)ƒUPDATECURRENTRECORDNUMBER*‰TST.BCURMODE-DATASG(A5)‡INCOMMANDMODE?‰BEQ.SEOFMRTSBRANCHIFYES5‰MOVE.B#LOADCUR,(A3)+INPAGEMODE,REPOSITIONCURSOR'‰MOVE.BCRTLINE(A1),(A3)+SCREENLINE#&‰MOVE.BCRTCOL(A1),(A3)+COLUMNNUMBEREOFMRTS RTS RETURN‰PAGE=**************************************************************3*ˆDOOUT-OUTPUTSCREENBUFFERBUILTBYFUNCTIONKEYS*ˆANDCURSORMOVEMENTKEYS)*ˆENTRY:A3=ENDADDRESS+1OFOUTPUTBUFFER*‘OUTBUF=STARTADDRESS*>**************************************************************$DOOUT MOVE.L A3,D3 GET END ADDRESS+15‰LEAOUTBUF-DATASG(A5),A2GETSTARTADDRESSOFBUFFER$‰SUB.LA2,D3STRIPTHESTARTADDRESS*‰BEQ.SDOOUT10BRANCHIFNOTHINGTOOUTPUT.‰CRT.OUTCRTIOS,OUTBUF,D3DOTHESCREENOUTPUT%‰BNEEDITERRORBRANCHIFANI/OERRORDOOUT10‚RTSRETURN‰PAGE?*************************************************************** *3*‡SENDPAGE‚TERMINATINGCHARACTERISSENDPAGE($D9)-*’DATAENTEREDONLASTLINEOFVIRTUALSCREEN/*’DISPLAYANDLASTCHARACTERPOSITIONANDTYPED.*’ACARRIAGERETURNORLINEFEEDISSENTHERE..*’ALLLINESSCROLLEDUP1LINEANDBOTTOMLINE *’BLANKED.*‡REV1.00‚1-3-80‚(C313)2*‡REV2.00‚8/26/80(C313)CHANGED TODOPROCEEDIO,*‘WHILEDOINGFILEUPDATES.USESCRTLSCODE.*‡EXITS:READCMD*@***************************************************************** PAGE„EQU‚*9ˆTST.BCURMODE-DATASG(A5)‚INCOMMANDMODE?USESCRTLSCODE&ˆBEQREADCMD„BRANCHIFINCOMMANDMODE)ˆADD.L#1,TOPLINE-DATASG(A5)BUMPTOPLINE*"* USE CRTLS CODE FOR REST OF STUFF*ˆPAGE@*****************************************************************2*…CARRIAGERETURN‚TERMINATINGCHARACTERISLS($DF))*ŽMOVECURSORDOWN1LINEANDTOCOLUMN1)*ŽINSERTBLANKLINETOSCREENANDTOFILE*SCREENSCROLLEDUP1LINE*†REV1.00‚12-3-79‚(C313)5*†REV2.00‚8/26/80‚(C313)DOFILEUPDATESWHILEDOING!*šSCREENUPDATESUSINGIOPROCEED-*†USES:CRTNFORPROCEEDIOCOMPLETIONADDRESS*†CALLS:UPDATE„FIXSFCR*†EXITS:READCMD*ŒMAINPROGRAME********************************************************************* CRTLS‚EQU‚*0†TST.B‚CURMODE-DATASG(A5)SEEIFINCOMMANDMODE†BEQ‚READCMDˆBRANCHIFYES/†LEA…CRFLAG-DATASG(A5),A2ƒGETFLAGBYTEADDRESS!†CLR.B(A2)ŠCLEARITFORTHISUSE3‡MOVE.LMAXLINE-DATASG(A5),D1GET#RECORDSINFILE:‡CMP.LFILELINE-DATASG(A5),D1SEEIFADDINGTOENDOFFILE.‡BLE.SCRTLS10BRANCHIFADDINGTOENDOFFILE ‡BSET#INSF,(A2)SETINSERTFLAG/‡MOVE.BCRTERM(A1),D1GETTERMINATINGCHARACTER"‡CMP.B#$D9,D1PAGEINSTEADOFCR?5‡BEQ.SCRTLS10BRANCHIFPAGE,NOBLANKLINETOSCREEN5‡BSET#FIXSF,(A2)SETFIXSCREENFLAG-USEDBYFIXSFCR-CRTLS10 TST.B CRTCHG(A1) A FILE CHANGE TO DO?"‡BEQ.S‚CRTLS20…BRANCHIFNOCHANGE$‡TST.BEMTYFILE-DATASG(A5)…NEWFILE?$‡BEQ.S‚CRTLS15…BRANCHIFNO,OLDFILE)‡BSET#INSF,(A2)„NEWFILE-SETINSERTLINE!‡BRA.SCRTLS25†GOTAKECAREOFIT-CRTLS15BSET#REPF,(A2)„SETFILEREPLACEFLAG2CRTLS20BSET#BLKF,(A2)ƒSETINSERTBLANKLINEFLAG%ˆBSET#INSF,(A2)„SETINSERTFLAGALSOJCRTLS25 BSR FIXSFCR SETUP SCREEN FIX-UP STUFF-RETURNS A3=END ADR OF BUFFER7‡LEACRTIOP-DATASG(A5),A0PROCEEDIOPARABLOCKADDRESS+‡MOVE.L#$56,IOSLEN(A0)RESETPACKETLENGTH7‡MOVE.LA3,IOSEAD(A0)‚RETURNEDENDADROFOUTPUTBUFFER'‡TST.BBRKFLG-DATASG(A5)ABREAKINPUT?4‡BNE.SCRTLS27BRANCHIFYES,DON'TDOTHESCREENI/O'‡BSET#CRF,(A2)SETCARRIGERETURNFLAG‡TRAP#2ŒGODOPROCEEDIO‡BNEEDITERROR†ERRORRETURN3CRTLS27BSET#FILEF,(A2)ƒSETDOINGFILEUPDATEFLAG&ˆBTST#REPF,(A2)„NEEDTODOAREPLACE?&ˆBEQ.SCRTLS30BRANCHIFNO,NOREPLACE/ˆMOVE.B#REPLCMD,D1SETFORFMSREPLACECOMMANDˆBSRUPDATEGODOTHEREPLACE-CRTLS30BTST#BLKF,(A2)ƒINSERTALBLANKLINE?,ˆBEQ.SCRTLS50‚BRANCHIFNO-NOTABLANKLINE$ˆTST.BEMTYFILE-DATASG(A5)‚NEWFILE?$ˆBEQ.SCRTLS35BRANCHIFANOLDFILE3ˆBCLR#BLKF,(A2)ƒNEWFILE,DON'TINSERTABLANKLINE(ˆBRA.SCRTLS50‚GODORESTOFFILECHANGE*ˆDISPLAYCURSORPOSITIONONLINE24OFSCREEN(CRTMODEONLY)*O*******************************************************************************ICURPSN MOVE.L FILELINE-DATASG(A5),D0 CURRENT FILE POSITION POINTER 0119858‡ADD.L#1,D0CORRECTSINCELINESSTARTAT1NOT0011985*CCURPSN10 LEA CURPSNA-DATASG(A5),A3 ADDR IN MSG BLOCK FOR CURSOR PSN0‰BSRCNVTHACONVERTHEX(D0)TOASCII(A3)011985D‰CRT.OUTCRTIOS,CURMSG,#CURMSGLOUTPUTCURRENTCURSORPSNTOLINE24 ‰RTS‚011985 PAGEO******************************************************************************** SUBROUTINE NAME: FMS#*REV1.00‚12/14/79‚(SANDYDEARING)F* FUNCTION: SET UP FMS PACKET FOR FMSINT CALL, MAKE THE CALL AND CHECK*‹ERRORRETURNS..* CALLING SEQUENCE: A0 = POINTER TO FMS PACKET*ŒFMSCMD(A0)=COMMANDCODE$* RETURN: A0 = POINTER TO FMS PACKET*‰D0=0=NOERROR!* REGISTERS USED: 0 1 2 3 4 5 6 7*DƒRPP*****AƒPPPPPPR:*SUBROUTINESCALLED:WRTMESS‚EDITFILE‚FMSINT‚SETNM‚GETERR* TABLES USED: FMSTABLEO********************************************************************************8* GET FMS COMMAND CODE AND JUMP TO ROUTINE TO PROCESS IT*5FMS MOVEM.L D1-D2/A0-A6,-(A7) SAVE REGISTERS IN STACK CLR.L D0 CLEAR FOR USE* MOVE.B FMSCMD(A0),D0 GET FMS COMMAND CODEALEA…FMSTABLE-DATASG(A5),A1GETADDROFVALIDFMSCMDCODESTABLE5LEA…FMSTBLND-DATASG(A5),A2ENDADDRESSOFCODETABLE-FMS10 CMP.W (A1),D0 LOOK FOR A VALID CMD CODE BEQ.S FMS20 BR IF YES, ADD.L #FMSTBLNG,A1 BUMP TO NEXT TABLE ENTRY% CMP.L A2,A1 SEE IF PAST END OF TABLE& BLT.S FMS10 NO, GO LOOK AT NEXT ENTRY BRA FMSER10 ERROR, CMD CODE#FMS20 SUB.L #1,D0 ADJUST THE OFFSET3‡LSL.L#2,D0MULTIPLYBY4-OFFSETINTOBRANCHTABLE/‡LEAFMSBRAT(PC),A1GETADDRESSOFBRANCHTABLE JMP (A1,D0) GO DO IT!**ˆBRANCHTABLEFORFMSROUTINES* FMSBRAT‚EQU‚*‰BRAFMSOPN‚OPENCOMMAND‰BRAFMSVCL‚CLOSECOMMAND‰BRAFMSRDƒREADCOMMAND‰BRAFMSDEL‚DELETECOMMAND"‰BRAFMSIRP‚INSERT-REPLACECOMMAND"‰BRAFMSIRP‚INSERT-REPLACECOMMAND%‰BRAFMSRCH‚SEARCHFORSTRINGCOMMAND‰BRAFMSPRNTPRINTCOMMAND‰BRAFMSSAV‚SAVECOMMAND‰BRAFMSMRG‚MERGECOMMAND‰BRAFMSMOV‚MOVECOMMAND‰BRAFMSEXT‚EXTRACTCOMMAND*‰BRAFMSDEXTDELETEEXTRACTBUFFERCOMMAND‰BRAFMSCKPTCHECKPOINTCOMMAND‰PAGE**‚FMSOPENROUTINE<* SET UP DEFAULT VALUES IN FHS INPUT BLOCK AND CALL EDITFILE*:FMSOPNƒLEA…CMDBUF-DATASG(A5),A0GETADDROFINPUTFILENAME2LEA…INFHS-DATASG( A5),A6GETADDROFINPUTFHSBLK6LEA…EDITVOLN-DATASG(A5),A4ˆGETDEFAULTVOLUMEADDRESS5 LEA (INFHS+6)-DATASG(A5),A2 POINT TO START OF VOLUME MOVE.L #7,D0 LENGTH OF MOVE=FMSOPN01 MOVE.W (A4)+,(A2)+ GET DEFAULT VALUES PASSED TO EDIT SUB.L #1,D0 DECREMENT COUNTER$ BNE.S FMSOPN01 BRANCH TIL MOVED ALL. MOVE.W #'SA',FHSEXT(A6) SET DEFAULT EXTENSION. BSR EDITFILE CALL EDITFILE FOR INPUT FILENAME BMI FMSER30 BR IF ERROR BTST #19,D0 WAS FILENAME FOUND? BEQ FMSER30 NO, ERRORBSR…SETNMƒGOSAVEFILENAME9TST.LSAVOTADD-DATASG(A5)„WASOUTPUTFILENAMESPECIFIED?, BEQ.S FMSOPN10 NO, GO SET UP CALL TO FHSINT*=* SET UP DEFAULT VALUES IN FHS OUTPUT BLOCK AND CALL EDITFILE*: MOVE.L SAVOTADD-DATASG(A5),A0 GET ADDR OF OUTPUT FILENAME4 LEA OUTFHS-DATASG(A5),A6 GET ADDR OF OUTPUT FHS BLK2 LEA INFHS-DATASG(A5),A2 GET ADDR OF INPUT FHS BLK0 LEA EDITVOLN-DATASG(A5),A3 GET ADDR OF DEFAULTSD LEA (OUTFHS+6)-DATASG(A5),A4 GET ADDR OF OUTPUT FHS BLOCK AT VOLUME MOVE.L #7,D0 MOVE LENGTH8FMSOPN02 MOVE.W (A3)+,(A4)+ GET DEFAULT FILE DESCRIPTORS SUB.L #1,D0 DECREMENT COUNTER BNE.S FMSOPN02: MOVE.W FHSEXT(A2),FHSEXT(A6) SET OUTPUT DEFAULT EXTENSION/ BSR EDITFILE CALL EDITFILE FOR OUTPUT FILENAME BMI FMSER40 BR IF ERROR BTST #19,D0 WAS FILENAME FOUND? BEQ FMSER40 NO, ERRORBSR‚SETNMGOSAVEFILENAME*@* SET UP FMS BUFFER WITH FILENAMES AND CALL FMSINT TO OPEN FILES*HFMSOPN10 LEA (INFHS+6)-DATASG(A5),A1 GET ADDR OF VOLUME IN FHS INPUT BLK; LEA FMSFILES-DATASG(A5),A2 GET ADDR OF FMS FILENAME BUFFER) MOVE.L #14,D0 SET UP COUNT OF LONG MOVES@FMSOPN20 MOVE.L (A1)+,(A2)+ MOVE QUALIFIED FILENAMES TO FMS BUFF SUB.L #1,D0 DECREMENT COUNTER BEQ.S FMSOPN30 BR IF ALL MOVED1 CMP.W #7,D0 ARE WE AT THE END OF INPUT FILENAME? BNE.S FMSOPN20 NO, GO MOVE MOREB LEA (OUTFHS+6)-DATASG(A5),A1 GET ADDR OF VOLUME IN FHS OUTPUT BLK' BRA.S FMSOPN20 GO MOVE OUTPUT FILENAMEFMSOPN30 CLR.L D4 CLEAR D46 MOVE.L EDITLUN-DATASG(A5),D6 GET BIT MASK FOR LUN #'S MOVE.L #2,D5 START WITH LUN #2'FMSOPN31 BTST D5,D6 IS BIT SET IN MASK?# BEQ.S FMSOPN33 NO, GO USE THIS LUN!FMSOPN32 ADD.L #1,D5 GET NEXT LUN% CMP.L #7,D5 ARE WE OVER A VALID LUN?% BLE.S FMSOPN31 NO, GO CHECK NEXT LUN% BRA FMSER95 YES, ERROR - 2 NOT FOUND$FMSOPN33 TST.L D4 WAS 1ST LUN FOUND?$ BNE.S FMSOPN34 YES, GO GET NEXT ONE MOVE.W D5,D4 SAVE LUN IN D4% LSL.W #8,D4 AND SHIFT TO LEFT 8 BITS BRA.S FMSOPN32 GO GET NEXT LUN$FMSOPN34 MOVE.B D5,D4 SAVE LUN IN D40LEA…FMSPKT-DATASG(A5),A0GETADDROFFMSPACKET6 MOVE.W D4,FMSRECN(A0) SAVE 2 LUN IN PACKET FOR FMSINT!FMSLUN10 ADD.L #1,D5 GET NEXT LUN CMP.L #7,D5 PAST MAX?& BLE.S FMSLUN20 BRANCH IF NOT PAST MAX( MOVE.B #$FF,D5 SET NO 3RD LUN AVAILABLE BRA.S FMSLUN30 GO SAVE IT*FMSLUN20 BTST D5,D6 IS THIS LUN AVAILABLE?0 BNE.S FMSLUN10 BRANCH IF NO,GO LOOK FOR ANOTHERHFMSLUN30MOVE.BD5,MSLUN-DATASG(A5)‚SAVELUNFORMERGEANDSAVECOMMANDS6CLR.BFILEOPT-DATASG(A5)ŒCLEARFILEOPTIONSFLAGBYTE7MOVE.B‚#$11,FMSOTRTN-DATASG(A5)ƒSETUPDEFAULTOPTIONS2TST.LSAVOPTAD-DATASG(A5)‹WEREANYOPTIONSINPUT?$ BEQ.S FMSOPN41 NO, LEAVE AT DEFAULT2 MOVE.L SAVOPTAD-DATASG(A5),A1 GET ADDR OF OPTIONS*A*‚GETOPTIONSANDSETBITMAPINFMSOTRTNACCORDINGLY‚DEFAULT=$11* MOVE.L #0,A2 CLEAR FOR USE MOVE.B #4,D1 OPTION COUNTER! MOVE.B #'S',D2 SEQUENTIAL OPTIONMOVE.B#'I',D3‚INDEXEDOPTION1FNDOPTS CMP.B (A1,A2),D2 SEQUENTIAL OPTION INPUT? BEQ.S SEQFND BRANCH IF YES,SEQ. CMP.B (A1,A2),D3 SEE IF INDEXED" BEQ.S INDFND BRANCH IF IS INDEXED& ADD.L #1,A2 BUMP TO NEXT OPTION ENTRY SUB.B #1,D1 DECREMENT COUNT/ BNE FNDOPTS GO SEARCH REST OF POSSIBLE OPTIONS. BRA.S FMSOPN35 NOT THESE OPTIONS,USE DEFAULTS4SEQFNDADD.B#1,FMSOTRTN-DATASG(A5)ƒMAKESEQFORFMS7SEQFND05ADD.B#1,FILEOPT-DATASG(A5)‚TURNONFOUNDFLAG!BRA.SFMSOPN35‚NOMORETOSEARCH8INDFNDADD.B#3,FMSOTRTN-DATASG(A5)ƒMAKEINDEXEDFORFMS BRA SEQFND05 GO SET FLAGS6FMSOPN35‚MOVE.LSAVOPTAD-DATASG(A5),A1RESTOREPOINTER1 MOVE.B #4,D2 MOVE  4 BYTES OF OPTION TO SAVE AREA* LEA SAVOTADD-DATASG(A5),A2 TEMP SAVE AREA MOVE.L A2,A3 SAVE FOR LATER USE1FMSOPN36 MOVE.B (A1)+,(A2)+ MOBE A BYTE AT A TIME SUB.B #1,D2 DECREMENT COUNT BNE.S FMSOPN36 BRANCH IF MORE4MOVE.L(A3),SAVOPTAD-DATASG(A5)†STOREOPTIONSFOUND! MOVE.L #4,D1 SEARCH FOR K OPTION+ LEA SAVOPTAD-DATASG(A5),A3 OPTIONS ADDRESS4CLR.BFILEOPT-DATASG(A5)ˆCLEARINCASENOTKOPTION"FMSK05 CMP.B #'K',(A3)+ LOOK FOR K BEQ.S FMSK10 BRANCH IF FOUND SUB.L #1,D1 DECREMENT COUNTER& BNE.S FMSK05 BRANCH IF MORE TO SEARCH" BRA.S FMSOPN41 NOT USING K OPTION6FMSK10MOVE.B#1,FILEOPT-DATASG(A5)„SETUSINGKOPTION6BSET#3,FMSOTRTN-DATASG(A5)‹TURNONKOPTIONFOROPEN8FMSOPN41 LEA FMSFILES-DATASG(A5),A1 GET FILENAME ADDRESS4 MOVE.L A1,FMSBUF(A0) SET ADDRESS OF FILENAME BUFFER% BSR FMSINT CALL FMSINT TO OPEN FILES BNE FMSER50 BR IF ERRORAMOVE.LFMSREC(A0),MAXLINE-DATASG(A5)‡SAVELASTLOGREC#INFILE+CMP.B‚#-1,FMSTAT(A0)†SEEIFNOTCONTINUINGBEQ.SFMSEDIT3†NOT,EXITEDITOR,CLR.BFILETYPE-DATASG(A5)‡SETOLDFILEFLAG- CMP.B #FSTADNM,FMSTAT(A0) IS INPUT FILE OLD?"BEQƒFMSEXITYES,OLDFILEFLAGOK- CMP.B #FSTANNM,FMSTAT(A0) IS INPUT FILE NEW?) BEQ.S FMSOPN40 YES, GO SET NEW FILE TYPE' CMP.B #FSTAKY,FMSTAT(A0) INVALID KEYS?# BEQ FMSER55 BRANCH IF INVALID KEYS% CMP.B #ISTABO,FMSTAT(A0) TRUNCATING? BEQ FMSER600 BRANCH IF YES2 TST.B FMSTAT(A0) DID FMSINT FIND ANY OTHER ERROR?! BNE FMSER50 YES, BRANCH TO ERROR BRA FMSEXIT GO RETURN TO CALLER8FMSOPN40MOVE.B#1,FILETYPE-DATASG(A5)„SETNEWFILEFLAG0TST.BFILEOPT-DATASG(A5)ƒNEWFILEANDKOPTION?! BNE FMSER620 BRANCH IF YES,ERROR3 LEA INFHS-DATASG(A5),A6 GET FILENAME INPUT ADDRESS BSR SETNM GO SAVE FILE NAME BRA FMSEXIT GO RETURN TO CALLER**ƒFMSDONTCONTINUERETURN*#FMSEDIT3‚EQU‚*‡DONTCONTINUERETURN,‰MOVEM.L‚(A7)+,D1-D2/A0-A6ƒRESTOREREGISTERS&‰LEA‚STACK-DATASG(A5),A7RESTORESTACK‰BRA‚EDITERMŽTERM** FMS CLOSE ROUTINE* FMSVCL EQU *& BSR FMSINT CALL FMSINT TO CLOSE FILES BNE FMSER60 BR IF ERROR BRA FMSEXIT GO RETURN TO CALLER*F*FMSREADROUTINE‚D1=FIRSTRECORD#TOREAD‚D6.W=#OFRECORDSTOREAD* FMSRD EQU *6 MOVE.L D1,FMSREC(A0) SET LOG REC # OF 1ST REC TO READ(MOVE.WD6,FMSRECN(A0)ƒ#RECORDSTOREAD- LEA EDITBUF-DATASG(A5),A1 GET BUFFER ADDRESS2 MOVE.L A1,FMSBUF(A0) SET BUFFER ADDR TO READ INTO$ BSR FMSINT CALL FMS TO READ RECORDS BNE FMSER70 BR IF ERROR-FMSRD30‚TST.B‚FMSTAT(A0)…DIDFMSFINDERRORS?$‚BEQ‚FMSEXIT‰NOP,CONTINUEPROCESSING$‚CMP.B#ISTABO,FMSTAT(A0)TRUNCATED?$‚BEQFMSEXITBRANCHIFYES,THAT'SOK+‚CMP.B‚#ISTARN,FMSTAT(A0)‚WASRECORDFOUND?"BEQ.S‚FMSRD50‚NO,RECORDNOTFOUND1 CMP.B #ISTAEOF,FMSTAT(A0) WAS END OF FILE FOUND?BEQFMSEXIT‚BRANCHIFYES0‚CMP.B‚#RDCMD,FMSCMD(A0)‚ISTHISAREADCOMMAND?$‚BEQ‚FMSER70‚YES,GOPRINTREADERROR"‚BRA‚FMSER80‚GOPRINTDELETEERROR/FMSRD50 CMP.B #RDCMD,FMSCMD(A0) IS THIS A READ? BNE FMSER100 NO, GO TO ERROR'TST.BFILETYPE-DATASG(A5)„ISFILENEW?, BNE.S FMSRD60 YES,GO CHECK FOR ZERO RECORDS,TST.BEMTYFILE-DATASG(A5)…ISFILEEMPTYOLD& BNE FMSEXIT YES,1ST READ OF EMPTY OLD7FMSRD60‚CMP.W#0,FMSRECN(A0)WEREZERORECORDSREADIN? BNE FMSER100 NO, GO TO ERROR2 BRA FMSEXIT 1ST READ OF NEW FILE, DON'T PRINT MSG*.*FMSDELETEROUTINEƒD6.W=#RECORDSTODELETE* FMSDEL EQU *I MOVE.L FILELINE-DATASG(A5),FMSREC(A0) SET LOG REC # OF 1ST REC TO DELETE2 MOVE.W D6,FMSRECN(A0) SET # SEQ RECORDS TO DELETE) BSR FMSINT CALL FMSINT TO DELETE RECORDS BNE FMSER80 BR IF ERROR$ CMP.B #-1,FMSTAT(A0) CAN'T DO THIS? BEQ FMSER640 BRANCH IF CAN'T' BRA FMSRD30 GO CHECK FOR FMSINT ERRORS** FMS INSERT OR REPLACE ROUTINE* FMSIRP EQU */ MOVE.L FILELINE-DATASG(A5),D0 GET FILE POINTER6 CMP.B #INSRTCMD,FMSCMD(A0) IS THIS AN INSERT COMMAND?4 BNE.S FMSIRP05 NO, BYPASS DECREMENT OF FILE POINTER. SUB.L #1,D0 DECREMENT FILE POINTER FOR INSERT@FMSIRP05MOVE.LD0,FMSREC(A0)‚LOGREC#OFRECTOREPLORINSERT- LEA FMSDATA-DATASG(A5),A1 GET  BUFFER ADDRESS+ MOVE.L A1,FMSBUF(A0) SET BUFFER START ADDR3 BSR FMSINT CALL FMSINT TO INSERT OR REPLACE RECORD BNE FMSER90 BR IF ERROR% CMP.B #-1,FMSTAT(A0) CANNOT DO THIS? BEQ FMSER640 BRANCH IF CAN'T-TST.BFMSTAT(A0)‚DIDFMSINTFINDANYERRORS?#BEQ„FMSEXITƒNO,GORETURNTOCALLER+‚CMP.B‚#ISTARN,FMSTAT(A0)ƒWASRECORDFOUND?!ƒBEQ‚FMSER100„NO,RECORDNOTFOUND3 CMP.B #ISTAEOF,FMSTAT(A0) WAS EOF FOUND BY FMSINT? BNE FMSER90 NO, GO TO ERROR BRA FMSEXIT GO RETURN TO CALLER*(* FMS SEARCH ROUTINE - SEARCH FOR STRING* FMSRCH EQU *&‡CLR.BFMSBRK(A0)ŽCLEARTHEBREAKFLAG-‡LEAEDITBUF-DATASG(A5),A1…GETBUFFERADDRESS8‡MOVE.L‚A1,FMSBUF(A0)ƒBUFFERADDRESSFORRETURNEDSTRINGB‡MOVE.L‚REC-DATASG(A5),FMSREC(A0)ƒLOGICALRECORD#TOSTARTSEARCH7‡MOVE.W‚RECN-DATASG(A5),FMSRECN(A0)†#RECORDSTOSEARCH;‡MOVE.B‚TRANS-DATASG(A5),FMSTRANS(A0)„TRANSPARENTCHARACTERA‡MOVE.B‚COUNT-DATASG(A5),FMSCNT(A0)†COUNT(#TRIMESSTRINGINREC)>‡MOVE.L‚RADR-DATASG(A5),FMSADR(A0)‡POINTERTOSTRINGADDRESSES‡BSR‚FMSINT“DOTHESEARCH&‡BNE‚FMSER250‘BRANCHIFERRORRETURNED5‡CMP.B‚#ISTARN,FMSTAT(A0)…1STRECORDTOSEARCHFOUND? ‡BEQ‚FMSER100‘BRANCHIFNO-ERROR‡BRA‚FMSEXIT’EVERYTHINGOK-EXIT*5*ƒFMSSAVEROUTINE-SAVEFILEINTONEWOUTPUTFILENAME* FMSSAV‚EQU‚*0 LEA FMSFILES-DATASG(A5),A1 GET FILENAME ADDRESS) MOVE.L A1,FMSBUF(A0) ADDRESS OF FILENAME5 MOVE.L REC-DATASG(A5),FMSREC(A0) START RECORD NUMBER5 MOVE.W RECN-DATASG(A5),FMSRECN(A0) # RECORDS TO SAVE6 MOVE.B MSLUN-DATASG(A5),FMSCNT(A0) LUN FOR FMS TO USE BSR FMSINT DO THE SAVE) BNE.S FMSSAV10 BRANCH IF AN ERROR RETURN$ CMP.B #-1,FMSTAT(A0) CAN'T DO THIS? BEQ FMSER640 BRANCH IF CAN'T+ TST.B FMSTAT(A0) FMSINT RETURNED AN ERROR?% BEQ FMSEXIT BRANCH IF NO,GOOD RETURN$ BRA FMSPRT05 GO CHECH ERROR RETURNS/FMSSAV10‚CMP.B#FSTADNM,D0FILEALREADYEXISTS?$ BEQ FMSER300 BRANCH IF EXISTS,ERROR% CMP.B #FSTADS,D0 NO DIRECTORY SPACE? BEQ FMSER320 BRANCH IF NO SPACE! CMP.B #ISTAIDS,D0 NO DISK SPACE? BEQ FMSER340 BRANCH IF NO SPACE BRA FMSER360 SOME OTHER ERROR*.*‚FMSMRGMERGEANEXISTINGFILEINTOTHISFILE* FMSMRGEQU‚*7 LEA FMSFILES-DATASG(A5),A1 GET FILENAME BUFFER ADDRESS& MOVE.L A1,FMSBUF(A0) FILENAME ADDRESS5 MOVE.L REC-DATASG(A5),FMSADR(A0) START RECORD NUMBER- MOVE.W RECN-DATASG(A5),FMSRECN(A0) # RECORDS6 MOVE.B MSLUN-DATASG(A5),FMSCNT(A0) LUN FOR FMS TO USE; MOVE.L FILELINE-DATASG(A5),FMSREC(A0) WHERE TO PUT RECORDS BSR FMSINT DO THE MERGE) BNE.S FMSMRG10 BRANCH IF AN ERROR RETURN$ CMP.B #-1,FMSTAT(A0) CAN'T DO THIS? BEQ FMSER640 BRANCH IF CAN'T% TST.B FMSTAT(A0) GOOD RETURN STATUS?" BEQ FMSEXIT BRANCH IF GOOD RETURN- CMP.B #FSTANNM,FMSTAT(A0) NON-EXISTENT FILE?$ BEQ FMSER500 BRANCH IF NON-EXISTENT' BRA FMSPRT05 GO CHECK ANY OTHER ERRORS)FMSMRG10 CMP.B #ISTAIDS,D0 NO DISK SPACE?% BEQ FMSER340 BRANCH IF NO DISK SPACE% CMP.B #FSTANNM,D0 NON-EXISTENT FILE?$ BEQ FMSER500 BRANCH IF NON-EXISTENT BRA FMSER520 SOME OTHER ERROR*2*‚FMSMOVPUTREQUESTEDDATAINTOANEXTRACTBUFFER* FMSMOVEQU‚*1 LEA SVEXT-DATASG(A5),A1 GET POINTERS FOR EXTRACT& MOVE.L (A1),FMSREC(A0) START RECORD #+ MOVE.W 6(A1),FMSRECN(A0) # RECORDS TO MOVEEMOVE.BCOUNT-DATASG(A5),FMSCNT(A0)‚SETFLAGFORAPPENDORNOTAPPEND BSR FMSINT GO DO THE MOVE' BNE FMSER380 BRANCH IF AN ERROR RETURN$ CMP.B #-1,FMSTAT(A0) CAN'T DO THIS? BEQ FMSER640 BRANCH IF CAN'T& TST.B FMSTAT(A0) FMSINT ERROR RETURN?% BEQ FMSEXIT BRANCH IF NO,GOOD RETURN$ CMP.B #1,FMSTAT(A0) PART EXTRACTED?+BEQ‚FMSER660‚BRANCHIFONLYPARTEXTRACTED$ CMP.B #2,FMSTAT(A0) NONE EXTRACTED?& BEQ FMSER650 BRANCH IF NONE EXTRACTED% BRA.S FMSPRT05 GO CHECH OTHER ERRORS*2*‚FMSEXTMOVEDATAFROMEXTRACTBUFFERTOFILELINE* FMSEXT EQU *7 MOVE.L FILELINE-DATASG(A5),FMSREC(A0) CURRENT RECORD # BSR FMSINT DO THE EXTRACT) BNE.S FMSEXT10 BRANCH IF AN ERROR RETURN TST.B FMSTAT(A0) FMSINT ERROR?% BEQ FMSEXIT BRANCH IF NO,GOOD RETURN, CMP.B #$FF,FMSTAT(A0) BUFFER DOESN'T EXIST? BEQ  FMSER400 ERROR-NO BUFFER BRA.S FMSEXIT GOOD RETURN)FMSEXT10 CMP.B #ISTAIDS,D0 NO DISK SPACE?% BEQ FMSER340 BRANCH IF NO DISK SPACE BRA FMSER540 SOME OTHER ERROR*#*‚FMSDEXTDELETETHEEXTRACTBUFFER*,FMSDEXT BSR FMSINT DELETE THE EXTRACT BUFFER$ BNE FMSER540 SHOW ERROR AND D0 CODE' TST.B FMSTAT(A0) CHECK RETURNED STATUS' BMI FMSER400 BRANCH IF AN ERROR RETURN BRA.S FMSEXIT NO ERROR CHECKING*$*‚FMSPRNTPRINTFILETOLINEPRINTER*7FMSPRNT MOVE.L REC-DATASG(A5),FMSREC(A0) START RECORD #- MOVE.W RECN-DATASG(A5),FMSRECN(A0) # RECORDS< MOVE.B MSLUN-DATASG(A5),FMSTRANS(A0) LUN TO USE FOR PRINTER+ MOVE.B COUNT-DATASG(A5),FMSCNT(A0) SPACING. MOVE.L RADR-DATASG(A5),FMSBUF(A0) DEVICE NAME BSR FMSINT DO THE PRINTING) BNE.S FMSPRT10 BRANCH IF AN ERROR RETURN& TST.B FMSTAT(A0) FMSINT ERROR RETURN?' BEQ.S FMSEXIT BRANCH IF NO,GOOD RETURN7FMSPRT05 CMP.B #ISTARN,FMSTAT(A0) RECORD DOESN'T EXIST?% BEQ FMSER100 BRANCH IF DOESN'T EXIST* CMP.B #ISTAIE,FMSTAT(A0) INVALID RECORD # BEQ FMSER100 BRANCH IF INVALID BRA.S FMSEXIT RETURN,FMSPRT10 CMP.B #ISTANR,D0 PRINTER NOT READY?! BEQ FMSER440 BRANCH IF NOT READY CMP.B #ISTADB,D0 PRINTER BUSY? BEQ FMSER460 BRANCH IF BUSY$ BRA FMSER540 SHOW ERROR AND D0 CODE*=*‚FMSCKPT-CHECKPOINT,SAVEOUTPUTFILEANDCONTINUEEDITING* FMSCKPT EQU * BSR FMSINT DO THE SAVE& BNE FMSER580 BRANCH IF ERROR RETURNED. TST.B FMSTAT(A0) CHECK STATUS RETURN FROM FMS- BEQ.S FMSEXIT BRANCH IF NO ERROR,GOOD RETURN* BRA FMSER560 GO OUTPUT SAVE ERROR MESSAGE*)* FMS EXIT - RESTORE REGISTERS FROM STACK* FMSEXIT EQU *9ˆMOVE.WCHKPCT-DATASG(A5),D1GET#RECORDSUPDATEDSOFARˆCMP.W#25,D1SEEIF25YET$ˆBLT.SFMSEXIT1BRANCHIFNOT25YET2ˆMOVE.W(A0),-(A7)SAVECURRENTSTATUSANDCOMMAND.ˆMOVE.WFMSRECN(A0),-(A7)SAVETHISFIELDALSO ˆMOVE.LD0,-(A7)SAVECURRENTD0+ˆMOVE.B#CKPTCMD,FMSCMD(A0)DOACHECKPOINT#ˆBSRFMSINTDOIT,IGNOREANYERRORS.ˆCLR.WCHKPCT-DATASG(A5)‚CLEARCURRENTCOUNTERˆMOVE.L(A7)+,D0RESTORED0,ˆMOVE.W(A7)+,FMSRECN(A0)RESTORETHISFIELD-ˆMOVE.W(A7)+,(A0)RESTORECOMMANDANDSTATUS?FMSEXIT1 MOVEM.L (A7)+,D1-D2/A0-A6 RESTORE REGISTERS FROM STACK* TST.L D0 RESET CONDITION CODES FOR RETURNRTS‚RETURNTOCALLER PAGE** FMS ERROR ROUTINES*.* ERROR 10 IS FROM AN ILLEGAL FMS COMMAND CODE*3FMSER10 LEA FMSG10-DATASG(A5),A4 SET MSG START ADDR+ LEA FMSGE10-DATASG(A5),A6 SET MSG END ADDR=MOVE.BFMSCMD(A0),FMSGE10-DATASG(A5)ˆSETILLEGALCODEINMSG" BRA FMSER71 GO SAVE FILES AND END*:* ERROR 30 IS FROM EDITFILE ROUTINE FOR THE INPUT FILENAME*3FMSER30 LEA FMSG30-DATASG(A5),A4 SET MSG START ADDR+ LEA FMSGE30-DATASG(A5),A6 SET MSG END ADDR(LEA‚FMSG30C-DATASG(A5),A3‚ERRORADDRESS$FMSER35BSR‚GETERR‚PUTD0INMESSAGE BRA FMSMSG GO SEND MSG AND END*;* ERROR 40 IS FROM EDITFILE ROUTINE FOR THE OUTPUT FILENAME*3FMSER40 LEA FMSG40-DATASG(A5),A4 SET MSG START ADDR+ LEA FMSGE40-DATASG(A5),A6 SET MSG END ADDR( LEA FMSG40C-DATASG(A5),A3 ERROR ADDRESS- BRA FMSER35 GO PUT D0 IN MESSAGE AND SEND IT*)* ERROR 50 IS FROM AN OPEN CALL TO FMSINT*FMSER340LEA‚FMSG62-DATASG(A5),A0ERRORMESSSAGE-NODISKSPACE MOVE.L #24,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN>FMSER360LEA…FMSG360-DATASG(A5),A0ERRORMESSAGE-SAVENOTDONE MOVE.L #28,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN;FMSER380‚LEA…FMSG380-DATASG(A5),A0ERRORM ESSAGE-MOVEERROR MOVE.L #32,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN=FMSER400LEA…NOBUF-DATASG(A5),A0NOBUFFERMESSAGEFOREXTRACT MOVE.L #28,D0 LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN5FMSER440LEA…MESSNR-DATASG(A5),A0PRINTERRORMESSAGE' MOVE.L #18,D0 LENGTH,PRINTER NOT READY' BRA FMSER310 OUTPUT MESSAGE AND RETURN6FMSER460LEA…MESSDB-DATASG(A5),A0PRINTERBUSYMESSAGE MOVE.L #12,D0 LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN@FMSER500LEA…NOFILE-DATASG(A5),A0MERGEERROR-FILEDOESN'TEXIST MOVE.L #18,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN,FMSER520LEA…NOMRG-DATASG(A5),A0MERGEERROR MOVE.L #24,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN8FMSER540 LEA ERRMESS-DATASG(A5),A0 ERROR MESSAGE ADDRESS/ LEA ERRMESSC-DATASG(A5),A3 ADDRESS FOR D0 CODE BSR GETERR CONVERT D0 TO ASCII MOVE.L #18,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN=FMSER560 LEA FMSG400-DATASG(A5),A0 SAVE ERROR MESSAGE ADDRESS MOVE.L #20,D0 MESSAGE LENGTH* BRA FMSER310 GO OUTPUT MESSAGE AND RETURN=FMSER580 LEA FMSG410-DATASG(A5),A0 SAVE SELF ERROR-CHECKPOINT/ LEA FMSG410C-DATASG(A5),A3 ADDRESS FOR D0 CODE BSR GETERR CONVERT D0 MOVE.L #18,D0 MESSAGE LENGTH+ TST.W FMSRECN(A0) SEE IF EXTENSION CHANGED# BEQ FMSER310 BRANCH IF NOT CHANGED$ MOVE.L #30,D0 CHANGE MESSAGE LENGTHEMOVE.WFMSRECN(A0),FMSG410E-DATASG(A5)†SAVENEWEXTENSIONFOROUTPUT* BRA FMSER310 GO OUTPUT MESSAGE AND RETURNIFMSER600MOVE.B#-1,TRUN-DATASG(A5)ƒSETTRUNCATEFLAG,REALLYNOTANERROR BRA FMSEXIT RETURNBFMSER620 LEA FMSG620-DATASG(A5),A4 NEW FILE AND K OPTION SPECIFIED* LEA FMSGE620-DATASG(A5),A6 END OF MESSAGE/ BRA.S FMSMSG GO OUTPUT MESSAGE AND EXIT EDITORIFMSER640 LEA FMSG640-DATASG(A5),A0 USING K OPTION,CANNOT DO THIS FUNCTION MOVE.L #14,D0 MESSAGE LENGTH'FMSER645 BSR WRTMESS OUTPUT THE MESSAGE& MOVE.L #-1,D0 SET MESSAGE OUTPUT FLAG BRA FMSEXIT RETURN*„ENTRY:D0CONTAINSSCREENLINENUMBERFORBOTTOMDISPLAYLINE**„EXIT:GOODRETURN-TOCALLER*‰ERRORRETURN-EDITERROR**„USES:01234567*‡D *‡A‚*ƒ*…P*F**************************** ******************************************* SETPROP‚EQU‚*/‰LEA‚OUTBUF-DATASG(A5),A2‡OUTPUTBUFFERADDRESS%‰MOVE.B‚#TOPDIS,(A2)+„SETTOPDISPLAY‰MOVE.B#POSONE,(A2)+…LINE1-‰MOVE.B#BOTDIS,(A2)+…SETBOTTOMDISPLAYCODE%‰MOVE.BD0,(A2)+ŠCODEFORBOTTOMLINE,‰MOVE.B‚#LEFTDIS,(A2)+ƒSETLEFTDISPLAYCODE‰MOVE.B‚#COLTWO,(A2)…COLUMN22‰CRT.OUT‚CRTIOS,OUTBUF,#6„OUTPUTSCREENPROTECTION‰BNE‚EDITERRORERRORRETURN ‰RTSRETURN‰PAGEE**********************************************************************%*ƒSETPROC‚SETCOMMANDMODEPROTECTION)*ŒSETSVIRTUALSCREENTOLINE22-COLUMN2/*ŒPUTSCURSORTHEREANDPUTSPROMPTINCOLUMN13*ŒOFLINE22.DOESNOTCHANGEPOSITIONOFPROMPTIN *ŒLINES1-20.*ƒCALLS:CRTOUT*ƒEXIT:GOODRETURN-TOCALLER*ˆERRORRETURN-EDITERROR**ƒUSES:01234567*†D* *†A*ƒ*…P*F********************************************************************** SETPROC‚EQU‚*/‰LEA‚OUTBUF-DATASG(A5),A2†OUTPUTBUFFERADDRESS-‰MOVE.B‚#BOTDIS,(A2)+‚SETBOTTOMDISPLAYCODE$‰MOVE.B‚#LINE22,(A2)+‚SCREENLINE22*‰MOVE.B‚#TOPDIS,(A2)+‚SETTOPDISPLAYCODE$‰MOVE.B‚#LINE22,(A2)+‚SCREENLINE22,‰MOVE.B‚#LEFTDIS,(A2)+‚SETLEFTDISPLAYCODE‰MOVE.B‚#COLTWO,(A2)+ƒCOLUMN2)‰MOVE.B‚#WRTABS,(A2)+ƒWRITEABSOLUTECODE&‰MOVE.B‚#STRT,(A2)+…STARTOFDATACODE$‰MOVE.B‚#LINE22,(A2)+ƒSCREENLINE22%‰MOVE.B‚#POSONE,(A2)+ƒSCREENCOLUMN1!‰MOVE.B‚#PROMPT,(A2)+ƒPROMPTCODE*‰MOVE.B‚#ENDOD,(A2)+„ENDOFWRITEABSOLUTE'‰MOVE.B‚#LOADCUR,(A2)+ƒLOADCURSORCODE‰MOVE.B‚#LINE22,(A2)+ƒLINE22‰MOVE.B‚#COLTWO,(A2)„COLUMN2+‰CRT.OUT‚CRTIOS,OUTBUF,#15ƒOUTPUTTOSCREEN‰BNE‚EDITERRORRETURNIFERROR ‰RTS—RETURN‰PAGEE**********************************************************************3*„PUTP‚PUTPROMPTINCOLUMN1TOSCREENLINENUMBER*ŠCONTAINEDIND0*„REV.1.00‚2-12-80‚(C313)*„CALLS:CRTOUT+*„ENTRY:D0=BYTESCREENLINE#INASCIICODE*„EXIT:GOODRETURN-TOCALLER*‰ERRORRETURN-EDITERROR*„USES:01234567*‡D* *‡A*ƒ*…P*F********************************************************************** PUTP‚EQU‚*/†LEA‚OUTBUF-DATASG(A5),A2‰OUTPUTBUFFERADDRESS)†MOVE.B‚#WRTABS,(A2)+‚WRITEABSOLUTECODE&†MOVE.B‚#STRT,(A2)+„STARTOFDATACODE0†MOVE.BSAVEP-DATASG(A5),(A2)+…OLDPROMPTLINE#†MOVE.B#POSONE,(A2)+ƒCOL1!†MOVE.B#BLANK,(A2)+…BLANKITOUT%†MOVE.B#ENDOD,(A2)+„ENDOFTHISLINE.†MOVE.B#WRTABS,(A2)+ƒWRITEABSOLUTE-NEXTLINE&†MOVE.B#STRT,(A2)+…STARTOFTHISLINE#†MOVE.B‚D0,(A2)+‡SCREENLINENUMBER%†MOVE.B‚#POSONE,(A2)+ƒSCREENCOLUMN#!†MOVE.B‚#PROMPT,(A2)+ƒPROMPTCODE.†MOVE.B‚#ENDOD,(A2)…ENDOFWRITEABSOLUTECODE,†MOVE.BD0,SAVEP-DATASG(A5)‚SAVETHISLINE#+…CRT.OUT‚CRTIOS,OUTBUF,#12ƒOUTPUTTOSCREEN…BNE‚EDITERRORBRANCHIFERROR …RTS˜RETURN PAGEE**********************************************************************>*‚CLRPRESETPROMPTCOLUMN1TOVIRTUALSCREENFORENDOFEDIT'*‡RESETVIRTUALSCREENTOENTIRESCREEND******************************************************************** CLRP‚EQU‚*/ LEA OUTBUF-DATASG(A5),A2 OUTPUT BUFFER ADDRESS( MOVE.B #LEFTDIS,(A2)+ LEFT DISPLAY CODE MOVE.B #POSONE,(A2)+ COLUMN 1&MOVE.B#TOPDIS,(A2)+‚TOPDISPLAYCODE#MOVE.B#POSONE,(A2)+ƒSETTOLINE1)MOVE.B#BOTDIS,(A2)+ƒBOTTOMDISPLAYCODE"MOVE.B#LINE24,(A2)„SETTOLINE24*‚CRT.OUTCRTIOS,OUTBUF,#6OUTPUTTOSCREENRTS‚RETURN-IGNOREANYERRORS‚PAGEA******************************************************************+*‚CLRCOL1‚SENDBLANKSTOCOLUMN1ALLLINES*‹FORINITIALIZINGTHEESCREEN*A*****************************************************************CLRCOL1‚CLR.LD2‚CLEARFORUSE…MOVE.B#POSONE,D2STARTLINE#5CLRCOL2 LEA OUTBUF-DATASG(A5),A2 OUTPUT BUFER ADDRESS) MOVE.B #WRTABS,(A2)+ WRITE ABSOLUTE CODE& MOVE.B #STRT,(A2)+ START OF DATA CODE MOVE.B D2,(A2)+ LINE NUMBER MOVE.B #POSONE,(A2)+ COLUMN 1% MOVE.B #BLANK,(A2)+ BLANK TO COLUMN1% MOVE.B #ENDOD,(A2)+ END OF DATA CODE* CRT.OUT CRTIOS,OUTBUF,#6 OU TPUT TO SCREEN BNE EDITERROR ERROR RETURN ADD.B #1,D2 NEXT LINE TO OUTPUT" CMP.B #LINE22,D2 AT END OF SCREEN# BLE.S CLRCOL2 BRANCH IF NO,DO MORE RTS‚RETURN‰PAGEF***********************************************************************"*†WRTMESS‚SUBROUTINEWRITEMESSAGEA*†CRTMODE:WRITEANYVARIABLELENGTHMESSAGE(MAXLENGTH=34BYTES)*TOLINE21OFSCREEN/*†SCROLLMODE:WRITEANYVARIABLELENGTHMESSAGE*†REV‚1.00‚1-3-80‚(C313)*†ENTRY:A0=ADDRESSOFMESSAGE*ŒD0=#BYTESOFMESSAGE*†CALLS:CRTOUT*†USES:01234567*‰D‚** *‰A‚*ƒ*…PE********************************************************************* WRTMESS‚EQU‚*(‰TST.BSCROLL-DATASG(A5)…INSCROLLMODE?(‰BMI.SWRTMESS3BRANCHIFINSCROLLMODE/‰LEA‚OUTBUF-DATASG(A5),A2‹OUTPUTBUFFERADDRESS*‰ADD.L‚#4,A2BUMPPASTFIRSTCONTROLBYTES-‰MOVE.L‚#34,D1ŒMAXNUMBEROFBYTESOFMESSAGE-WRTMESS1‚MOVE.B#BLANK,(A2)+„BLANKSTOBUFFER‰SUB.L‚#1,D1DECREMENTCOUNT$‰BNE.S‚WRTMESS1ŠBRANCHIFMORETODO%‰MOVE.B‚#ENDOD,(A2)+…ENDOFDATACODE7‰LEAƒOUTBUF-DATASG(A5),A2ŠRESTOREOUTPUTBUFFERADDRESS)‰MOVE.B‚#WRTABS,(A2)+„WRITEABSOLUTECODE&‰MOVE.B‚#STRT,(A2)+†STARTOFDATACODE*‰MOVE.B‚#LINE21,(A2)+„SCREENLINE#21CODE+‰MOVE.B‚#POSONE,(A2)+„SCREENCOLUMN#1CODECWRTMESS2‚MOVE.B‚(A0)+,(A2)+…MOVEABYTEOFMESSAGETOOUTPUTBUFFER‰SUB.W‚#1,D0DECREMENTCOUNT$‰BNE.S‚WRTMESS2ŠBRANCHIFMORETODO-‰CRT.OUT‚CRTIOS,OUTBUF,#39…OUTPUTTHEMESSAGE!‰BNE‚EDITERRORŽBRANCHIFANERROR‰RTS•GOODRETURN>WRTMESS3MOVE.LA0,IOSTART-DATASG(A5)‚STARTADDRESSOFMESSAGE CLR.L D1 CLEAR FOR USE MOVE.W D0,D1 GET MESSAGE LENGTH! ADD.L D1,A0 ADD IN START ADDRESS SUB.L #1,A0 CORRECT END ADDRESS2MOVE.LA0,IOEND-DATASG(A5)„ENDADDRESSOFMESSAGE'MOVE.W#2,IOSOUT-DATASG(A5)„WRITECODE, LEA IOSOUT-DATASG(A5),A0 PARA BLOCK ADDRESS TRAP #2 DO THE OUTPUT BNE EDITERROR ERROR RETURN RTS GOOD RETURNƒPAGE?****************************************************************/*‚GETERR‚GETERRORCODEIND0,CONVERTTOASCII,*ŠANDPUTINTOOUTPUTMESSSAGE.**‚REV1.002/21/80(C313)*‚ENTRY:D0=ERRORCODE*ˆA3=ADDRESSOFWHERETOPUTD0*‚EXIT:TOCALLER**‚USES:01234567*…D‚***…Aˆ*ƒP*‚CALLS:CONV(CONVERTTOASCII)*@**************************************************************** GETERREQU‚*,‡MOVE.WD0,SAVED0-DATASG(A5)„SAVELOWERHALF‡LSR.L#8,D0ŒMOVEOVER‡LSR.L#8,D0ŒMOVEMORE‡BSR.SCONVCONVERTTOASCII!‡MOVE.LD0,(A3)+ˆSTOREINMESSAGE‡CLR.LD0ŽNEEDCLEAN+‡MOVE.W‚SAVED0-DATASG(A5),D0…GETOTHERHALF‡BSR.SCONVŽCONVERT‚TOASCII‡MOVE.LD0,(A3)ˆSTORETHISPART ‡RTS’RETURN CONV‚EQU‚* †LSL.L‚#4,D0 †LSR.W‚#4,D0 †LSL.L‚#8,D0 †LSL.L‚#4,D0 †LSR.W‚#4,D0 †LSR.L‚#4,D0 †LSR.W‚#4,D0†MOVE.L‚#4,D1‚COUNTERCONV1CMP.B‚#9,D0ƒ0-9 †BLS.SCONV2 †ADD.B‚#7,D0CONV2ROR.L‚#8,D0 †SUB.L‚#1,D1 †BNE.S‚CONV1†ADD.L‚#$30303030,D0†RTS†PAGE?*****************************************************************ƒREADCMD‚READCOMMANDLINE(*ŒCURMODE=0‚SAVECHGCONTAINSCHANGEFLAG5*ŒIFSAVECHG=0RETURN-MUSTHAVEBEENCURSORMOVEMENT.-*ŒOTHERWISE,PARSETHEINPUTCOMMANDANDGOTO*ŒTHECORRECTROUTINE.*ƒREV1.0012-3-79‚(C313)(*ƒENTRY:A1=STARTADDRESSOFINPUTBUFFER-*ƒEXIT:TOEACHCOMMAND,THENTOMAINBYANRTS"*ˆA1=ENDADDRESS+1OFINPUTBUFFER.*ˆA3=ADDRESSOFNEXTCHARACTERININPUTBUFFER*ˆD1=IFNEXTCHARISABLANK'*ˆD1=1IFNEXTCHARISENDOFDATAFLAG*ƒCALLS:GETCMD„BLDCRT*‰WRTMESSƒCRTOUT*ƒUSESTABLES:CMDTBL1 *CMDTBL4*ƒUSES:01234567 *†D******†A****ƒP*@**************************************************************** READCMD‚EQU‚*(‰TST.BSCROLL-DATASG(A5)INSCROLLMODE?‰BMI.SREADCMD3BRANCHIFYES*‰TST.B‚SAVECHG-DATASG(A5)ƒSEEIFANYINPUT‰BNE.S‚READCMD1ƒBRANCHIFINPUT.‰CMP.B#'F',CURCMD-DATASG(A5)‚INFINDCOMMAND?‰BEQFIND220BRANCHIFYESCMDEXTƒRTSŽRETURN-NOTHINGTODO/READCMD1 MOVE.L A1,A6 SAVE START BUFFER ADDRESS.‰CLR.BCURCMD-DA  TASG(A5)„CLEARANYSETCOMMAND:LEA…FMSDATA-DATASG(A5),A1GETSTARTADDRESSOFINPUTDATA1 MOVE.L CRTLNG-DATASG(A5),D2 MAX LENGTH OF PACKET SUB.L #7,D2 ACTUAL DATA LENGTH+ MOVE.B #LINE22,D3 SCREEN LINE # FOR OUTPUT BSR BLDCRT BUILD OUTPUT LINE*‚CRT.OUTCRTIOS,OUTBUF,D4OUTPUTTOSCREEN BNE EDITERROR ERROR RETURN# MOVE.L A6,A1 RESTORE START ADDRESS# MOVE.B CRTERM(A1),D0 GET TERM CHAR CMP.B #$D9,D0 VALID TERM CHAR? BNE CMDEXT BRANCH IF NO,RETURN5‰LEA‚BLANKS-DATASG(A5),A0„CLEARANYMESSAGEONLINE21‰MOVE.L‚#4,D0…NUMBEROFBYTES‰BSR‚WRTMESS†GODOTHECLEAR/READCMD3MOVE.L‚A1,A0…SAVEINPUTBUFFERADDRESS1‰ADD.L‚#CRTDATA,A0ƒPOINTTOACTUALDATAINBUFFER4‰ADD.L‚CRTLNG-DATASG(A5),A1…ENDOFINPUTBUFFERDATA‰CLR.L‚D0ŒCLEARFORLATERUSE$‰MOVE.L‚#0,A2ˆWILLBERETURNEDVALUE&‰BSR‚GETCMDŠGOGETCOMMANDFROMBUFFER‰TST.L‚D0‹GOTACOMMAND?‰BNE.S‚READCMD2†BRANCHIFYES‰RTS‚.RETURN-NOTHINGTODO'READCMD2‚MOVE.L‚A0,A3‡SAVEDATAPOINTER#‰CMP.L‚#1,D0‰SEEIF1CHARRETURNED‰BGT.S‚READCMD6†BRANCHIFNOT1‰CLR.LD0CLEARFORUSE:‰LEA‚CMDTBL1-DATASG(A5),A0‡ADDRESSOF1CHARCOMMANDTABLE0‰LEA‚CMDTBL1E-DATASG(A5),A4†ENDADDRESSOFTABLE‰ADD.L‚#$2000,A2…ADDINABLANK'READCMD4‚CMP.W‚(A0),A2†LOOKFORAMATCH!ˆBEQ.S‚READCMD5‡BRANCHIFAMATCH!ˆCMP.W2(A0),A2ˆSEEIFLOWERCASE!ˆBEQ.S‚READCMD5‡BRANCHIFAMATCH&ˆADD.L‚#CMDTBL1L,A0ƒBUMPTONEXTENTRYˆCMP.L‚A4,A0ƒPASTENDOFTABLE?&ˆBLT.S‚READCMD4‡BRANCHIFNOTPASTEND)ˆBRA.S‚CMDERR‰DIDN'TFINDACOMMAND-ERROR8READCMD5‚MOVE.W‚4(A0),D0„OFFSETADDRESSOFROUTINETODO"READCMD9LSL.L#2,D0ŠMULTIPLYBY4'‰LEA‚CMDBRA(PC),A0ƒBRANCHTABLEADDRESSˆJMP‚(A0,D0)GODOIT(READCMD6‚EQU‚*ŽSCAN4CHARCOMMANDTABLE+‰LEA‚CMDTBL4-DATASG(A5),A0…ADDRESSOFTABLE0‰LEA‚CMDTBL4E-DATASG(A5),A4…ENDADDRESSOFTABLE‰CLR.LD0CLEARFORUSE'READCMD7‚CMP.L‚(A0),A2…LOOKFORAMATCH'ˆBEQ.S‚READCMD8†BRANCHIFFOUNDAMATCH!ˆCMP.L4(A0),A2‰SEEIFLOWERCASE!ˆBEQ.S‚READCMD8†BRANCHIFAMATCH&ˆADD.L‚#CMDTBL4L,A0ƒBUMPTONEXTENTRYˆCMP.L‚A4,A0ƒPASTEND?ˆBLT.S‚READCMD7‡BRANCHIFNO#ˆBRA.S‚CMDERR‰INVALIDCOMMAND-ERROR8READCMD8‚MOVE.W‚8(A0),D0„OFFSET‚ADDRESSOFROUTINETODOˆBRA‚READCMD9‰GODOIT!CMDERR‚EQU‚*INVALIDCOMMANDHERE&ˆTST.BCHAIN-DATASG(A5)INCHAINMODE?'ˆBMI.SCMDERR10BRANCHIFINCHAINMODE ˆMOVE.L‚#6,D0‰#BYTESINMESSAGE)ˆLEA‚OUTERR-DATASG(A5),A0ˆMESSAGEADDRESS!ˆBSR‚WRTMESSŠOUTPUTERRORMESSAGE ˆRTS’RETURN*0*ˆERRORFOUNDDURINGCHAINMODE-TERMINATEEDIT*BCMDERR10 LEA TERMCHN-DATASG(A5),A4 TERMINATE MESSAGE START ADDRESS9‰LEATERMCHNE-DATASG(A5),A6TERMINATEMESSAGEENDADDRESS.‰LEASTACK-DATASG(A5),A7‚RESTORESTACKPOINTER)‰BRAEDITSAV‰CANNOTCONTINUE,GOTERMINATE‰PAGE**ˆCOMMANDBRANCHTABLE* CMDBRA EQU *‰BRAADUPLCTƒAPPENDDUPLICATE‰BRAAMOVE…APPENDMOVE‰BRACHANGEŠCHANGE‰BRACOLMŒCOLUMN‰BRADELETEŠDELETE‰BRADOWNŒDOWN‰BRADTABŒDELETETABSTOP‰BRADUPLCTŠDUPLICATE‰BRAEXTENDŠEXTEND‰BRAFINDŒFIND‰BRAINSERTŠINSERT‰BRALINEC‹LINE‰BRALISTŒLIST‰BRAMERGE‹MERGE‰BRAMOVEŒMOVE‰BRAPRINT‹PRINT‰BRAQUITŒQUIT‰BRARANGE‹RANGE‰BRASAVEŒSAVE‰BRASTABŒSETTABSTOP‰BRAVERIFYŠVERIFY‰BRATABSETTABSTOP‰BRAXTRACTŠEXTRACT ‰BRAUPŽUP PAGE@*****************************************************************@*‚CHANGECOMMANDROUTINE--FINDASTRINGANDCHANGETONEWVALUE.*‚REV1.004/2/80(C313)/*‚ENTRY:D1=0IFNEXTCHARININPUTBUFFER=BLANK/*ˆD1=1IFNEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER+*‚EXIT:GOODRETURN-MAIN‚ERRORRETURN-CMDERR*‚USES:01234567 *…D**‡****…A*****P*1*‚CALLS:PROCLIST„GETVR„GETHR„WRTMESS„DOSRCH‚CKCNT'*ˆDOCHG‡OUTFIND‚FMS†CKHR‡CKRANG‚SCROLRD*A***************************************************************** CHANGE‚EQU‚*) TST.B FILEOPT-DATASG(A5) USING K OPTION? BEQ.S CHG01 BRANCH IF NO9 LEA FMSG640-DATASG(A5),A0 YES,K OPTION,CAN'T DO A CHA  NGE MOVE.L #14,D0 MESSAGE LENGTH BSR WRTMESS OUTPUT THE MESSAGE RTS RETURN0CHG01 TST.L MAXLINE-DATASG(A5) ANY FILE RECORDS? BGE.S CHG05 BRANCH IF YES=CHG03 LEA NOREC-DATASG(A5),A0 NO FILE RECORDS,INVALID COMMANDMOVE.L#32,D0‚MESSAGELENGTH" BSR WRTMESS GO OUTPUT THE MESSAGE RTS RETURN FOR NEXT INPUT%CHG05 TST.L D1 NEXT CHAR END OF DATA?) BNE CHG200 BRANCH IF YES,USE LAST STRING3 LEA CHGL-DATASG(A5),A4 CHANGE LIST ENTRIES ADDRESS5 CLR.B NOHR-DATASG(A5) 'A' FOR ALL OK IN COUNT FIELDS9 MOVE.B #1,SHRDEL-DATASG(A5) TURN ON SHARE DELIMITER FLAG" BSR PROCLIST GO PROCESS THIS LIST3CLR.BSHRDEL-DATASG(A5)ƒCLEARSHAREDELIMITERFLAG5 LEA LISTPB-DATASG(A5),A4 RETURNED PARA BLOCK ADDRESS0 TST.B RANGSW-DATASG(A5) ANY DEFAULT RANGES SET? BEQ.S CHG10 BRANCH IF NO" BSR CKRANG YES,GET THEM IF NEEDED*CHG10 BSR GETVR GET VERTICAL RANGE ENTRIES TST.W D1 SEE IF NO VR FOUND7 BEQ.S CHG20 BRANCH IF FOUND ONLY 1STVR CHG THE DEFAULT! BPL.S CHG30 GO SAVE RANGES FOUNDE MOVE.L FILELINE-DATASG(A5),(A4) MAKE CURRENT POSITION=START RECORD #)CHG20 MOVE.L #1,4(A4) DEFAULT # RECORDS=1;CHG30MOVE.L(A4),REC-DATASG(A5)‚SAVESTARTRECORD#FORFMS. MOVE.L MAXLINE-DATASG(A5),D0 GET MAX RECORD #% CMP.L REC-DATASG(A5),D0 BEYOND FILE? BLT.S CHG35 BRANCH IF YES,ERROR4MOVE.W6(A4),RECN-DATASG(A5)‚SAVE#RECORDSFORFMS'ADD.L#8,A4‚POINTTOHORIZONTALRANGES0 BSR GETHR GET HORIZONTAL RANGES FROM PARA BLOCK TST.W D1 ERROR RETURNED?-CHG35‚BNECMDERRBRANCHIFYES,INVALIDSYNTAX& ADD.L #8,A4 POINT TO TRANSPARENT CHAR CLR.L D0 CLEAR FOR USE$CLR.BTRANS-DATASG(A5)‚DEFAULT=NONE MOVE.B (A4),D0 GET TRANS CHAR BCLR.L #7,D0 IS THERE ONE? BEQ.S CHG40 BRANCH IF NO+ MOVE.B D0,TRANS-DATASG(A5) SAVE IT FOR FMS5CHG40 MOVE.B TRANS-DATASG(A5),(A4) SAVE IN PARA BLOCK) MOVE.B #1,COUNT-DATASG(A5) DEFAULT COUNT CLR.L D0 CLEAR FOR USE MOVE.B 1(A4),D0 GET COUNT CMP.B #$FF,D0 SEE IF ALL. BEQ.S CHG60 BRANCH IF ALL,USE DEFAULT FOR FMS BCLR.L #7,D0 ANY COUNT?% BEQ.S CHG50 BRANCH IF NO-USE DEFAULT.MOVE.BD0,COUNT-DATASG(A5)‚SAVECOUNTFORFMS6CHG50 MOVE.B COUNT-DATASG(A5),1(A4) SAVE IN PARA BLOCK&CHG60 ADD.L #18,A4 POINT TO REP. FIELD% MOVE.L #1,REP-DATASG(A5) DEFAULT REP MOVE.L (A4),D0 GET REP CMP.L #-1,D0 ALL? BNE.S CHG70 BRANCH IF NOT ALL#CLR.LD0ƒALL-USEDEFAULT#RECORDS, MOVE.W RECN-DATASG(A5),D0 NUMBER OF RECORDS BRA.S CHG80 GO SAVE ITCHG70 BCLR.L #31,D0 ANY REP? BNE.S CHG80 YES-GO SAVE IT( MOVE.L REP-DATASG(A5),D0 NO,USE DEFAULT+CHG80MOVE.LD0,REP-DATASG(A5)‚SAVEFORFMS. MOVE.L REP-DATASG(A5),(A4) SAVE IN PARA BLOCK) LEA LISTPB-DATASG(A5),A4 RESTORE POINTER MOVE.L A4,A6 SAVE START ADDRESS0 LEA SVCHG-DATASG(A5),A2 SAVE PARA BLOCK ADDRESS MOVE.L #19,D0 # WORDS TO MOVE,CHG90 MOVE.W (A4)+,(A2)+ MOVE THE PARA BLOCK SUB.L #1,D0 DECREMENT COUNT# BNE.S CHG90 BRANCH IF MORE TO MOVE. LEA SVCHG-DATASG(A5),A4 RESTORE SAVED ADDRESS# ORI.B #$80,(A4) TURN ON SAVED FLAG*<*‚SAVESTRINGSANDADJUSTSTRINGADDRESSINSAVEDPARABLOCK*$ MOVE.L A6,A1 GET PARA BLOCK ADDRESS' ADD.L #18,A1 POINT TO STRING ADDRESSES" MOVE.L (A1),D0 GET STRING ADDRESS# TST.L D0 SEE IF ADDRESS = 0 011785,BEQCMDERRIFADDRESS=0,NOSTRING‚011785 BCLR.L #31,D0 CLEAR FOUND BIT MOVE.L D0,A1 STRING ADDRESS/ LEA CHGSTG-DATASG(A5),A2 SAVED STRINGS ADDRESS$ MOVE.B #RECLNG,D5 MAX STRING LENGTHCHG090 MOVE.B (A1)+,(A2)+ SUB.B #1,D5 DECREMENT COUNT$ BNE.S CHG090 BRANCH IF MORE TO MOVE0 LEA CHGSTG-DATASG(A5),A2 RESTORE STRING ADDRESS9 ADD.L #18,A4 POINT TO STRING ADDRESS IN SAVED PARA BLOCK MOVE.L (A4),D5 STRING ADDRESS MOVE.L D5,D6 SAVE IT% BCLR.L #31,D5 CLEAR FOUND FLAG-IF ON" SUB.L D5,D6 CLEAR OUT THE ADDRESS ADD.L A2,D6 NEW ADDRESS+FLAG* MOVE.L D6,(A4)+ STORE IN SAVED PARA BLOCK MOVE.L #3,D1 COUNTER&CHG095 MOVE.L (A4),D6 GET NEXT ADDRESS SUB.L D5,D6 GET ADDRESS OUT ADD.L A2,D6 ADD IN NEW ADDRESS MOVE.L D6,(A4)+ SAVE IT SUB.L #1,D1 DECREMENT COUNT& BNE.S CHG095 BRANCH IF MO! RE ADDRESSES6*ƒSAVEORIGINALFILELINEINCASEDON'TFINDTHESTRING;MOVE.LFILELINE-DATASG(A5),SVLINE-DATASG(A5)‚SAVEFILELINEEMOVE.LREC-DATASG(A5),FILELINE-DATASG(A5)ˆFORUSINGSAVEDPARABLOCK# BRA CHG200 GO GET SAVED PARA BLOCK1CHG92 ADD.L #18,A6 POINT TO STRING1 START ADDRESSBMOVE.LA6,RADR-DATASG(A5)…SAVEPOINTERTOSTRING1ADDRESSFORFMS MOVE.L 4(A6),D0 GET END ADDRESS/ CMP.L (A6),D0 END ADDRESS AFTER START ADDRESS?&BLT‚CHG150BRANCHIFYES,NULLSTRING12 AND.B #$7F,(A6) TURN OFF FOUND FLAG START ADDRESS1 AND.B #$7F,4(A6) TURN OFF FOUND FLAG END STRING1+CLR.WFINDSW-DATASG(A5)‹CLEARFOUNDSWITCH)CMP.L#1,REP-DATASG(A5)‹ONESEARCHONLY? BEQ CHG130 BRANCH IF ONE**‚MULTIPLECHANGEHERE**CHG95TST.BBRKFLG-DATASG(A5)…BREAKINPUT? BNE CHG220 BRANCH IF YES$ BSR DOSRCH GO DO SEARCH FOR STRING1 TST.B FMSTAT(A0) STRING FOUND? BEQ.S CHG100 BRANCH IF FOUND& CMP.B #-1,FMSTAT(A0) SEE IF NOT FOUND& BNE CMDERR BRANCH IF SOME OTHER ERROR/CHG98TST.WFINDSW-DATASG(A5)…FOUNDANYBEFORE? BEQƒCHG120BRANCHIFFOUNDNONE+ BRA CHG140 GO OUTPUT LAST CHANGE TO SCREEN**‚HEREIFFOUNDONEOFMULTIPLE*2CHG100ADD.W#1,FINDSW-DATASG(A5)‚SETFOUNDSWITCH, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS0CMP.W#-1,RECN-DATASG(A5)„SEARCHINGWHOLEFILE? BEQ.S CHG110 BRANCH IF YES' MOVE.L FMSREC(A0),D0 RETURNED RECORD #5 SUB.L REC-DATASG(A5),D0 # RECORDS SEARCHED THIS TIME5SUB.WD0,RECN-DATASG(A5)ƒ#RECSSTILLTOBESEARCHEDCHG110MOVE.LFMSREC(A0),REC-DATASG(A5)„GETTHISRECORDNUMBER-ADD.L#1,REC-DATASG(A5)ŠPOINTTONEXTRECORD+ BSR CKHR GO SEE IF WITHIN HORIZONTAL RANGE TST.L D0 WITHIN? BEQ.S CHG115 BRANCH IF YES+SUB.W#1,FINDSW-DATASG(A5)‰UNSETTHISFIND) MOVE.L MAXLINE-DATASG(A5),D0 GET MAXLINE" CMP.L REC-DATASG(A5),D0 PAST EOF? BLT CHG98 BRANCH IF PAST EOF.TST.WRECN-DATASG(A5)‚MORERECORDSTOSEARCH? BEQ CHG98 BRANCH IF NO! BRA CHG95 YES,GO SEARCH FOR MORE%CHG115‚CLR.BD7NOTNULLSTRING1FLAG$ BSR DOCHG GO UPDATE RECORD AND FILE2 BSR CKCNT GO SEE IF CHANGED ALL STRINGS IN RECORD(TST.BSCROLL-DATASG(A5)‚INSCROLLMODE? BPL.S CHG116 BRANCH IF NO2 MOVE.L SVREC-DATASG(A5),D1 GET THIS RECORD NUMBER MOVE.L #1,D6 READ 1 RECORD$ BSR SCROLRD READ THE UPDATED RECORD TST.L D0 GOOD RETURN? BNE.S CHG118 BRANCH IF AN ERROR BSR OUTFIND OUTPUT THIS RECORD/CHG116 MOVE.L MAXLINE-DATASG(A5),D0 GET MAXLINE" CMP.L REC-DATASG(A5),D0 PAST EOF?*BLTƒCHG140BRANCHIFYES,GOOUTPUTSCREEN- SUB.L #1,REP-DATASG(A5) DECREMENT FIND COUNT' BEQ.S CHG117 BRANCH IF NO MORE TO FIND.TST.WRECN-DATASG(A5)‚MORERECORDSTOSEARCH?#CHG117 BEQ CHG140 BRANCH IF NO MORE BRA CHG95 MORE TO FIND**‚HEREIFDIDNTFINDSTRING*5CHG120 LEA SNF-DATASG(A5),A0 STRING NOT FOUND MESSAGE MOVE.L #16,D0 MESSAGE LENGTH BSR WRTMESS OUTPUT THE MESSAGEMCHG118MOVE.LSVLINE-DATASG(A5),FILELINE-DATASG(A5)‚RESTOREORIGINALFILELINE RTS RETURN*#*‚HEREIFLOOKINGFORONLY1RECORD*"CHG130 BSR DOSRCH GO DO THE SEARCH TST.B FMSTAT(A0) FOUND IT? BEQ.S CHG135 BRANCH IF FOUND3 CMP.B #-1,FMSTAT(A0) SEE IF FIRST RECORD NOT FOUND& BNE CMDERR BRANCH IF SOME OTHER ERROR( BRA.S CHG120 GO OUTPUT STRING NOT FOUND1CHG135 BSR CKHR GO SEE IF WITHIN HORIZONTAL RANGE TST.L D0 WITHIN? BEQ.S CHG138 BRANCH IF YES) MOVE.L MAXLINE-DATASG(A5),D0 GET MAXLINE! CMP.L FMSREC(A0),D0 BEYOND FILE?, BLE.S CHG120 BRANCH IF YES,STRING NOT FOUND,‚TST.WRECN-DATASG(A5)„SEARCHINGWHOLEFILE? BMI.S CHG136 BRANCH IF YES' MOVE.L FMSREC(A0),D0 GET THIS RECORD #+SUB.LREC-DATASG(A5),D0‚#RECORDSSEARCHED;SUB.WD0,RECN-DATASG(A5)ƒNUMBEROFRECORDSSTILLTOSEARCH-SUB.W#1,RECN-DATASG(A5)ƒDONTCOUNTTHISONE. BLE CHG120 NO MORE TO SEARCH,STRING NOT FOUND>CHG136MOVE.LFMSREC(A0),REC-DATASG(A5)ƒGETTHISRECORDNUMBER,ADD.L#1,REC-DATASG(A5)ˆBUMPTO! NEXTRECORD BRA CHG130 GO LOOK SOME MORE!CHG138 CLR.B D7 NOT NULL STRING 1$ BSR DOCHG GO UPDATE RECORD AND FILE/ BSR CKCNT GO SEE IF MORE COUNTS IN THIS RECORD(TST.BSCROLL-DATASG(A5)…INSCROLLMODE?+ BPL.S CHG145 BRANCH IF NO,GO OUTPUT RECORD: MOVE.L SVREC-DATASG(A5),D1 RECORD # TO OUTPUT,SCROLL MODE MOVE.L #1,D6 READ 1 RECORD# BSR SCROLRD GO READ UPDATED RECORD TST.L D0 GOOD RETURN?- BEQ.S CHG145 BRANCH IF GOOD,GO OUTPUT RECORD0 RTS RETURN,ERROR MESSAGE ALREADY OUTPUT IF HERE*+* DID ALL REQUIRED CHANGES,RE-OUTPUT SCREEN*.CHG140TST.BSCROLL-DATASG(A5)ƒINSCROLLMODE? BPL.S CHG145 BRANCH IF NOF MOVE.L SVREC-DATASG(A5),FILELINE-DATASG(A5) SET CURRENT RECORD NUMBER*CLR.WFINDSW-DATASG(A5)„CLEARFINDSWITCH1 RTS RETURN,CHANGES ALREADY OUTPUT IN SCROLL MODE2CHG145 LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS@MOVE.LSVREC-DATASG(A5),FILELINE-DATASG(A5)…RECORD#FORSCREEN" BSR OUTFIND OUTPUT PAGE TO SCREEN*CLR.WFINDSW-DATASG(A5)„CLEARFINDSWITCH RTS‚RETURN*5*‚HEREIFNULLSTRING1-INSERTSTRING2ATBEGINNINGOF>*‚THEHORIZONTALRANGE.READEACHRECORDWITHINVERTICALRANGE,*‚ANDDOTHECHANGEFOR#OFREPSSPECIFIED.*0CHG150‚MOVE.L12(A6),D0GETSTRING2ENDADDRESS$ CMP.L 8(A6),D0 SEE IF NULL STRING 2. BLT CMDERR BRANCH IF NULL STRING 2 ALSO,ERROR7CMP.B#1,COUNT-DATASG(A5)…GETCOUNT,CANONLYBE1HERE BNE CMDERR BRANCH IF NOT 1+CHG155 TST.B BRKFLG-DATASG(A5) BREAK INPUT?BNECHG220‚BRANCHIFYES* MOVE.L REC-DATASG(A5),D1 RECORD # TO READ, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS MOVE.L #1,D6 READ 1 RECORD& MOVE.B #RDCMD,FMSCMD(A0) READ COMMAND BSR FMS TST.L D0 RECORD FOUND? BEQ.S CHG160 BRANCH IF FOUND:LEA…FMSG100-DATASG(A5),A0OUTPUTRECORDNOTFOUNDMESSAGE >'2028=@4H3P5X1`8h<p:x4€6ˆ=1˜4 ;¨7°1¸5À9È9Ð9Ø?àBè?ð<ø4941 MOVE.L #18,D0 MESSAGE LENGTH BSR WRTMESS OUTPUT THE MESSAGE RTS‚RETURN'CHG160 MOVE.B #-1,D7 NULL STRING 1 FLAG$ BSR DOCHG GO UPDATE RECORD AND FILE(TST.BSCROLL-DATASG(A5)…INSCROLLMODE? BPL.S CHG165 BRANCH IF NO< MOVE.L SVREC-DATASG(A5),D1 IN SCROLL MODE,OUTPUT CHANGE NOW MOVE.L #1,D6 READ THIS RECORD BSR SCROLRD GO DO THE READ TST.L D0 GOOD READ?/ BNE CHG118 BRANCH IF NO,MESSAGE ALREADY OUTPUT" BSR OUTFIND GO OUTPUT THIS RECORD4CHG165CMP.W#-1,RECN-DATASG(A5)„READINGWHOLEFILE? BEQ.S CHG170 BRANCH IF YES7SUB.W#1,RECN-DATASG(A5)…DECREMENT#RECORDSTOSEARCH' BLE CHG140 BRANCH IF NO MORE TO SEARCH3CHG170ADD.L#1,REC-DATASG(A5)†POINTTONEXTRECORD) MOVE.L MAXLINE-DATASG(A5),D0 GET MAXLINE" CMP.L REC-DATASG(A5),D0 PAST EOF?;BLTƒCHG140BRANCHIFYES,NOMORETODO-GOOUTPUTSCREEN1SUB.L#1,REP-DATASG(A5)ƒDECREMENTNUMBERTOFIND# BLE CHG140 BRANCH IF NO MORE TO DO BRA CHG155 MORE RECORDS TO DO*$*‚ALWAYSUSESAVEDCHANGEPARABLOCK*>CHG200 LEA SVCHG-DATASG(A5),A4 SAVED CHANGE PARA BLOCK ADDRESS MOVE.L (A4),D0 GET 1ST WORD BTST.L #31,D0 DO WE HAVE ONE? BEQ CMDERR BRANCH IF NO,ERRORB LEA LISTPB-DATASG(A5),A2 ADDRESS OF WHERE TO PUT SAVED PARA BLOCK MOVE.L #19,D0 # WORDS TO MOVE%CHG205 MOVE.W (A4)+,(A2)+ MOVE A WORD SUB.W #1,D0 DECREMENT COUNT$ BNE.S CHG205 BRANCH IF MORE TO MOVE) LEA LISTPB-DATASG(A5),A6 RESTORE POINTER MOVE.L (A6),D0 GET 1ST WORD" BCLR.L #31,D0 TURN OFF SAVED FLAG" MOVE.L D0,(A6) SAVE IN PARA BLOCKD MOVE.L FILELINE-DATASG(A5),REC-DATASG(A5) GET CURRENT RECORD NUMBER- MOVE.W 6(A6),RECN-DATASG(A5) # RECORDS TO DO0MOVE.B16(A6),TRANS-DATASG(A5)‡TRANSPARENTCHAR0MOVE.B17(A6),COUNT-DATASG(A5)‡COUNTPERRECORD1MOVE.L34(A6),REP-DATASG(A5)‰#TIMESTODOCHANGE*CMP.B#$FF,COUNT-DATASG(A5)ŠISCOUNTALL? BNE.S CHG210 BRANCH IF NO4MOVE.B#1,COUNT-DATASG(A5)‹FORCE1FORCOUNTIFALL+CHG210CMP.L#-1,REP-DATASG(A5)‡ISREPALL? BNE.S CHG215 BRANCH IF NO" 9MOVE.L4(A6),REP-DATASG(A5)ŠALL-USEVERTICALRANGECOUNT CHG215 BRA CHG92 GO DO THE STUFF**‚BREAKWASINPUT*5CHG220 LEA BRKMESS-DATASG(A5),A0 OUTPUT BREAK MESSAGE MOVE.L #16,D0 LENGTH BSR WRTMESS OUTPUT IT-CLR.BBRKFLG-DATASG(A5)…CLEARTHEBREAKFLAG RTS RETURN†PAGEC********************************************************************1*ƒFIND‚COMMANDROUTINE--FINDASTRINGORPOSITION7*‰THEEDITORATBEGINNING,END,ORATASPECIFIEDRECORD*‰OFTHEFILE.*ƒREV1.00‚2-20-80(C313)**ƒENTRY:D1=0IFNEXTCHARINBUFFER=BLANK)*ŠD1=1IFNEXTCHARINBUFFER=ENDOFDATA*ŠA1=ENDADDRESS+1OFBUFFER#*ŠA3=ADDRESSOFNEXTCHARINBUFFER*ƒEXIT:MAINPROG*ˆERROREXIT:CMDERR*ƒUSES:01234567*†D***†A*****P**ƒCALLS:PROCLIST…MULFIND„CKHR*‰GETVRˆOUTFIND„SCROLRD*‰GETHRˆSETPROC*‰WRTMESS†PUTP*‰DOSRCH‡CKRANG*C******************************************************************* FIND„EQU‚*+‰TST.LMAXLINE-DATASG(A5)†ANYFILERECORDS?-‰BMI‚CHG03…BRANCHIFNO,CAN'TDOTHISCOMMAND*:*„SEARCHPARABLOCKLISTFORVALUESINCOMMANDLINEBUFFER* …TST.L‚D1…NEXTCHARENDOFDATA?*†BNE‚FIND100‚BRANCHIFYES,USELASTSTRING-†LEAƒFINDL-DATASG(A5),A4‚FINDPARABLOCKLIST5†CLR.BNOHR-DATASG(A5)'A'FORALLOKINCOUNTFIELDS†BSR‚PROCLIST‚PROCESSTHISLIST,†LEA‚LISTPB-DATASG(A5),A4‚PARABLOCKADDRESS0†TST.BRANGSW-DATASG(A5)ƒANYDEFAULTRANGESSET?†BEQ.SFIND05BRANCHIFNO"†BSR‚CKRANG‚YES,GETTHEMIFNEEDED$FIND05‚BSR‚GETVR†GETVERTICALRANGES†TST.W‚D1†2NDRANGEFOUND?/FIND06BEQ‚FIND200‚BRANCHIFNO,POSITIONEDITOR4†MOVE.L‚(A4),REC-DATASG(A5)ƒSAVESTARTREC#FORFMS.†MOVE.LMAXLINE-DATASG(A5),D0GETMAXRECORD#%†CMP.LREC-DATASG(A5),D0BEYONDFILE?!†BLT.SFIND08BRANCHIFTES,ERROR;†MOVE.W‚6(A4),RECN-DATASG(A5)SAVE#RECSTOSEARCHFORFMS'†ADD.L‚#8,A4„POINTTOHORIZONTALRANGES†BSR‚GETHR†GETTHEM†TST.W‚D1‡ERRORRETURNED?.FIND08‚BNE‚CMDERR…BRANCHIFYES,INVALIDSYNTAX&†ADD.L‚#8,A4„POINTTOTRANSPARENTCHAR†CLR.L‚D0†CLEARFORUSE/†CLR.B‚TRANS-DATASG(A5)ƒDEFAULTTRANSCHAR=NONE†MOVE.B‚(A4),D0„GETTRANSCHAR†BCLR.L‚#7,D0†ISTHEREONE?†BEQ.SƒFIND10…BRANCHIFNONE3†MOVE.B‚D0,TRANS-DATASG(A5)…SAVETRANSCHARFORFMS6FIND10‚MOVE.B‚TRANS-DATASG(A5),(A4)ƒSAVEINPARABLOCK)†MOVE.B‚#1,COUNT-DATASG(A5)DEFAULTCOUNT†CLR.L‚D0†CLEARFORUSE†MOVE.B‚1(A4),D0ƒGETCOUNT…CMP.B‚#$FF,D0„SEEIFALL'†BEQ.S‚FIND20‚BRANCHIFALL-USEDEFAULT†BCLR.L‚#7,D0„ANYCOUNT?&†BEQ.S‚FIND20ƒBRANCHIFNO-USEDEFAULT.‡MOVE.B‚D0,COUNT-DATASG(A5)„SAVECOUNTFORFMS7FIND20‚MOVE.BCOUNT-DATASG(A5),1(A4)ƒSAVEINPARABLOCK'†ADD.L‚#10,A4†POINTTOREPETITIONFIELD%…MOVE.L‚#1,REP-DATASG(A5)‚DEFAULTREP…MOVE.L‚(A4),D0‡GETREP…CMP.L‚#-1,D0ˆALL?…BEQ.S‚FIND30ˆBRANCHIFALL…BCLR.L‚#31,D0‡ANYREP?&…BEQ.S‚FIND40ˆBRANCHIFNO-USEDEFAULT/FIND30‚MOVE.L‚D0,REP-DATASG(A5)‚SAVEITFORFMS4FIND40‚MOVE.L‚REP-DATASG(A5),(A4)„SAVEINPARABLOCK)‡LEA‚LISTPB-DATASG(A5),A4…RESTOREPOINTER MOVE.L A4,A6 GET START ADDRESS+ ADD.L #18,A6 POINT TO STRING START ADDRESSGMOVE.LA6,RADR-DATASG(A5)‚SAVEPOINTERTOSTRINGSTARTADDRESSFORFMS5AND.B#$7F,(A6)‚TURNOFFFOUNDFLAGONSTARTADDRESS4 AND.B #$7F,4(A6) TURN OFF FOUND FLAG ON END ADDRESS*(*‚SAVEPARABLOCKFORNEXTFIND/NOPARAS*' MOVE.L 4(A6),A4 GET STRING END ADDRESS4 CMP.L #0,A4 CHECK FOR EXISTENCE OF STRG ADDR 010285)BEQƒCMDERRSTRGADDRWAS0:ERRORŠ010285' ADD.L #1,A4 POINT TO 1 BYTE BEYOND END. LEA FINDSTG-DATASG(A5),A2 SAVE STRING ADDRESS MOVE.L (A6),A6 STRING ADDRESS CMP.L A6,A4 SEE IF NULL STRING' BLE CMDERR BRANCH IF NULL STRING,ERROR/FIND43 MOVE.B (A6)+,(A2)+ MOVE A BYTE OF STRING CMP.L A6,A4 AT END OF STRING?$ BNE.S FIND43 BRANCH IF NO-MOVE MORE&„LEA‚SVFIND-DATASG(A5),A2ƒSAVEADDRESS„MOVE.L‚#15,D0„#WORDSTOMOVE,‚LEALISTPB-DATASG(A5),A4PARABLOCKADDRESS%FIND45‚MOVE.W‚(A4)+,(A2)+ƒMOVEAWORD…SUB.L‚#1,D0„DECREMENTCOUNT$…BNE.S‚FIND45„BRANCHIFMORETOMOVE+…LEA‚SVFIND-DATASG(A5),A2GETADDRESSAGAIN" #…ORI.B#$80,(A2)TURNONSAVEDFLAG. LEA FINDSTG-DATASG(A5),A4 SAVE STRING ADDRESS3 MOVE.L 18(A2),D0 GET ORIGINAL START STRING ADDRESS? MOVE.L A4,18(A2) NEW START STRING ADDRESS FOR SAVED PARA BLOCK+ MOVE.L 22(A2),D1 GET END ADDRESS OF STRING SUB.L D0,D1 LENGTH& ADD.L D1,A4 NEW END ADDRESS OF STRING$ MOVE.L A4,22(A2) SAVE IN PARA BLOCK**ƒDOTHESEARCHFORSTRING*9FIND50‚CLR.B‚MULFSW-DATASG(A5)‡CLEARMULTIPLEFINDSWITCH+†CLR.W‚FINDSW-DATASG(A5)‰CLEARFOUNDSWITCH/‡MOVE.B#'F',CURCMD-DATASG(A5)ƒSETFINDCOMMAND)†CMP.L‚#1,REP-DATASG(A5)‰ONESEARCHONLY?†BEQ„FIND80‰BRANCHIFONE1FIND55TST.BBRKFLG-DATASG(A5)ˆWASABREAKINPUT?ˆBNEFIND210BRANCHIFYESˆBSR‚DOSRCH‰DOSEARCHˆTST.B‚FMSTAT(A0)‚STRINGFOUND?ˆBEQ.S‚FIND60†BRANCHIFFOUND&ˆCMP.B‚#-1,FMSTAT(A0)‚SEEIFNOTFOUND&ˆBNE‚CMDERRˆBRANCHIFSOMEOTHERERROR0FIND58‚TST.W‚FINDSW-DATASG(A5)„FOUNDANYBEFORE? ˆBEQ‚FIND70†BRANCHIFFOUNDNONE)ˆBRA.SFIND65‡RETURN-FOUNDALLTHEREWERE**‚HEREIFFOUNDONEOFMULTIPLE*.FIND60 BSR CKHR SEE IF WITHIN HORIZONTAL RANGE‡TST.LD0WITHIN?‡BNE.S‚FIND64BRANCHIFNO,ˆADD.W‚#1,FINDSW-DATASG(A5)…SETFOUNDSWITCH;ˆMOVE.LFMSREC(A0),SVREC-DATASG(A5)SAVETHISRECORDNUMBERˆBSR‚MULFIND‰OUTPUTTOSCREEN6FIND64‚LEAFMSPKT-DATASG(A5),A0GETFMSPACKETADDRESS,ˆTST.WRECN-DATASG(A5)†SEARCHINGWHOLEFILE?ˆBMI.SFIND66BRANCHIFYES,ˆMOVE.LFMSREC(A0),D0GETTHISRECORDNUMBER*ˆSUB.LREC-DATASG(A5),D0„#RECORDSSEARCHED5ˆSUB.WD0,RECN-DATASG(A5)ƒNUMBEROFRECORDSTOSEARCH1ˆSUB.W#1,RECN-DATASG(A5)ƒACTUALNUMBERTOSEARCH&ˆBGE.SFIND66ƒBRANCHIFAVALIDNUMBER*ˆCLR.W‚RECN-DATASG(A5)†NONELEFTTOSEARCH4FIND66‚MOVE.L‚FMSREC(A0),REC-DATASG(A5)„GETRECORD#>ˆADD.L‚#1,REC-DATASG(A5)†UPDATETONEXTRECORDTOSTARTSEARCH+ˆMOVE.LREC-DATASG(A5),D0GETRECORDNUMBER&ˆCMP.LMAXLINE-DATASG(A5),D0ƒPASTEOF?ˆBGTƒFIND58ƒBRANCHIFYES-ˆSUB.L‚#1,REP-DATASG(A5)ƒDECREMENTFINDCOUNT%ˆBEQƒFIND58„BRANCHIFNOMORETOFIND.ˆTST.WRECN-DATASG(A5)ƒMORERECORDSTOSEARCH?ˆBEQƒFIND58„BRANCHIFNOMOREˆBRA‚FIND55†MORETOSEARCH.FIND65TST.BSCROLL-DATASG(A5)„INSCROLLMODE?ˆBMI.SFIND68BRANCHIFYES5ˆMOVE.B‚MULFSW-DATASG(A5),D0…SCREENLINE#FORPROMPT#ˆSUB.B#1,D0‹MAKEITCORRECTLINE#ˆBSR‚PUTPPLACEPROMPT(ˆBSR‚SETPROCŠSETCOMMANDMODEPROTECTION1FIND68‚CLR.WFINDSW-DATASG(A5)„CLEARFORNEXTUSEHˆMOVE.LSVREC-DATASG(A5),FILELINE-DATASG(A5)LASTRECFOUND=CURRENTREC#M MOVE.L SVREC-DATASG(A5),TOPLINE-DATASG(A5) GOES TO TOP OF FILE AT NEXT INPUT+ˆCLR.BCURCMD-DATASG(A5)…CLEARCOMMANDFLAGˆRTS’RETURN-DONE*+*ƒHEREIFMULTIPLEPASSANDDIDN'TFINDANY'*ƒORSINGLEPASSANDDIDN'TFINDSTRING*=FIND70‚LEA‚SNF-DATASG(A5),A0„STRINGNOTFOUNDMESSAGEADDRESS ˆMOVE.L‚#16,D0‚LENGTHOFMESSAGEˆBSR‚WRTMESS…OUTPUTMESSAGE5FIND75‚CLR.BCURCMD-DATASG(A5)„CLEARTHEFINDCOMMAND ˆRTSRETURN*%*ƒHEREIFLOOKINGFORONLYONESTRING*FIND80‚BSR‚DOSRCH„GODOSEARCH-ˆTST.BBRKFLG-DATASG(A5)ƒTERMINATEDBYBREAK?ˆBMIFIND75BRANCHIFYESˆTST.B‚FMSTAT(A0)ƒSTRINGFOUND?)ˆBNE.S‚FIND70„BRANCHIFNO-OUTPUTMESSAGE+ˆBSRCKHRGOSEEIFWITHINHORIZONTALRANGEˆTST.LD0WITHIN?‰BEQ.SFIND85BRANCHIFYES)‡MOVE.LMAXLINE-DATASG(A5),D0GETMAXLINE!‡CMP.LFMSREC(A0),D0BEYONDFILE?ˆBLE‚FIND70BRANCHIFYES,ˆTST.WRECN-DATASG(A5)ƒSEARCHINGWHOLEFILE?ˆBMI.SFIND83BRANCHIFYES,ˆMOVE.LFMSREC(A0),D0GETTHISRECORDNUMBER3ˆSUB.LREC-DATASG(A5),D0NUMBEROFRECORDSSEARCHED0ˆSUB.WD0,RECN-DATASG(A5)ƒNUMBEROFRECORDSLEFT,ˆSUB.W#1,RECN-DATASG(A5)ƒACTUALNUMBERLEFT'ˆBLE‚FIND70BRANCHIFNOMORETOSEARCH9FIND83‚MOVE.LFMSREC(A0),REC-DATASG(A5)‡GETTHISRECORD#,ˆADD.L#1,REC-DATASG(A5)„BUMPTONEXTRECORDˆBRAFIND80GOLOOKAGAINAFIND85‚MOVE.L‚FMSREC(A0),FILELINE-DATASG(A5)ƒUPDATECURRENTREC#(ˆTST.BSCROLL-DATASG(A5)ƒINSCROLLMODE?ˆBPLFIND207BRANCHIFNO(FIND87‚BSR‚OUTFIND‡OUTPUTPAGETOSCREENˆBRAFIND75‰GORETURN*# <*ƒHEREIFENTRYWAS'F'ONLY,USELASTFINDSTRINGPARABLOCK*9FIND100‚LEA‚SVFIND-DATASG(A5),A4„SAVEDPARABLOCKADDRESS‰MOVE.L(A4),D0GETFIRSTWORD-‰BTST.L#31,D0DOWEHAVEASAVEDPARABLOCK?‰BEQCMDERR†BRANCHIFNO,ERROR)‰LEA‚LISTPB-DATASG(A5),A2…WHERETOPUTIT‰MOVE.L‚#15,D0‚#WORDSTOMOVE&FIND110‚MOVE.W‚(A4)+,(A2)+ƒMOVEAWORD‰SUB.W‚#1,D0…DECREMENTCOUNT‰BNE.S‚FIND110„BRANCHIFMORE2‰LEA‚LISTPB-DATASG(A5),A4‚RESTOREPARABLKPOINTER‡MOVE.L(A4),D0GETFIRSTWORD"‡BCLR.L#31,D0TURNOFFSAVEDFLAG(‡MOVE.LD0,(A4)PUTBACKINTOPARABLOCK<ˆMOVE.L‚FILELINE-DATASG(A5),REC-DATASG(A5)ƒSTARTRECFORFMS,‡ADD.L#1,REC-DATASG(A5)„BUMPTONEXTRECORD.‡MOVE.W‚6(A4),RECN-DATASG(A5)‚#RECSTOSEARCH0‡MOVE.B‚16(A4),TRANS-DATASG(A5)„TRANSPARENTCHAR-‡MOVE.B‚17(A4),COUNT-DATASG(A5)„COUNTPERREC1‡MOVE.L‚A4,RADR-DATASG(A5)‰STRINGADDRESSPOINTER1‡ADD.L#18,RADR-DATASG(A5)ŠACTUALPOINTERADDRESS4‡MOVE.L‚26(A4),REP-DATASG(A5)†#TIMESTOFINDSTRING‡BRA‚FIND50ŠGODOSEARCH* *‚HEREIFFORPOSITIONINGEDITOR)*‚FILELINEISIN1STVERTICALRANGEFIELD*+FIND200‚TST.B18(A4)ISASTRINGSPECIFIED?;‰BMIFIND06BRANCHIFYES,USEDEFAULTSECONDVERTICALRANGE-‰MOVE.L‚(A4),FILELINE-DATASG(A5)‚GETRECORD#0FIND201‚MOVE.LMAXLINE-DATASG(A5),D0GETMAXLINE*‰CMP.LFILELINE-DATASG(A5),D0BEYONDFILE?‰BGE.SFIND205BRANCHIFNOL MOVE.L MAXLINE-DATASG(A5),FILELINE-DATASG(A5) BEYOND FILE,FORCE LAST RECORD/FIND205‚TST.BSCROLL-DATASG(A5)ƒINSCROLLMODE?‰BPL.SFIND207BRANCHIFNO MOVE.L #1,D6 READ 1 RECORD- MOVE.L FILELINE-DATASG(A5),D1 RECORD TO READ BSR SCROLRD DO THE READ TST.L D0 GOOD RETURN? BEQ.S FIND207 BRANCH IF GOOD ƒRTSRETURN/FIND207TST.BSCROLL-DATASG(A5)ƒINSCROLLMODE?- BMI.S FIND209 BRANCH IF YES,GO OUTPUT RECORD. MOVE.L TOPLINE-DATASG(A5),D1 GET TOP RECORD #. CMP.L FILELINE-DATASG(A5),D1 SEE IF ON SCREEN& BGT.S FIND209 BRANCH IF NOT ON SCREEN, ADD.L #$13,D1 POINT TO BOTTOM SCREEN LINE #7 CMP.L FILELINE-DATASG(A5),D1 SEE IF FILELINE ON SCREEN& BLT.S FIND209 BRANCH IF NOT ON SCREEN1 MOVE.L FILELINE-DATASG(A5),D0 GET CURRENT LINE #: SUB.L TOPLINE-DATASG(A5),D0 STRIP OUT TOPLINE,D0=SCREEN #* ADD.B #POSONE,D0 ADD IN ASCII SCREEN CODE  BSR PUTP GO POSITION THE PROMPTBRAFIND75‚GORETURN%FIND209‚BRAFIND87‰GOOUTPUTTHEPAGE ‰RTS‘RETURN**‚BREAKWASINPUT*/FIND210 LEA BRKMESS-DATASG(A5),A0 BREAK MESSAGE MOVE.L #16,D0 LENGTH BSR WRTMESS OUTPUT MESSAGE-CLR.BBRKFLG-DATASG(A5)„CLEARTHEBREAKFLAG0‚LEAFMSPKT-DATASG(A5),A0GETFMSPACKETADDRESS,‚CLR.BFMSBRK(A0)CLEARTHATBREAKFLAGALSO ‚RTSRETURNOFIND220 MOVE.B SVMULFSW-DATASG(A5),MULFSW-DATASG(A5) RESTORE MULTIPLE FIND VALU-CLR.BSVMULFSW-DATASG(A5)†CLEARFORNEXTUSE' BRA FIND55 GO FINISH THIS FIND COMMAND‰PAGED*********************************************************************#*‚QUITQUITEDITINGCOMMANDROUTINE!*‚REV1.002/1/80(SANDYDEARING)*‚REV2.003/31/81(C313)1*‚ENTRY:D1=0=NEXTCHARINCOMMANDLINEISABLANK1*ˆD1=1=NEXTCHARINCOMMANDLINEISENDOFBUFFER*‚EXIT:EDIT3(MAIN)*‚USES:01234567*…Dƒ* *…A*‡*P*‚CALLS:PROCLIST<************************************************************ QUIT‚EQU‚*#TST.LD1‚ISNEXTCHARENDOFDATA?, BNE.S QUIT10 BRANCH IF YES,GO CLOSE AND END3 LEA QUITL-DATASG(A5),A4 GET ADR OF LIST TO PROCESS# BSR.S PROCLIST GO PROCESS THE LIST2 LEA LISTPB-DATASG(A5),A4 GET RETURNED PARAR BLOCK" MOVE.B (A4),D1 GET RETURNED INPUT BCLR #7,D1 FOUND ANYTHING?! BEQ.S QUIT10 BRANCH IF NO,GO END/CMP.B#'A',D1‚WASCHARENTEREDANAFORABORT?, BEQ.S QUIT20 BRANCH IF YES,GO SET FOR ABORT CMP.B #'a',D1 a FOR ABORT?&BNE‚CMDERRBRANCHIFNO,COMMANDERROR9QUIT20„LEAFMSPKT-DATASG(A5),A0THISISABORT-GETFMSADR- MOVE.B #-1,FMSEFS(A0) SET ABORT CODE FOR FMS!QUIT10‚BRAEDIT3GOCLOSEANDEND PAGE?****************************************************************5* PROCLIST PROCESS A LIST FROM ANY COMMAND. PARSE THE# +*ŠOPTIONALINPUTFIELDSINTHECOMMANDLINE/*ŠANDBUILDALISTPARAMETERBLOCKWITHADDRESS-*ŠANDCONSTANTSFROMTHOSEOPTIONSSPECIFIED.**ŠEACHCOMMANDUSESTHESAMERETURNEDPARA0*ŠBLOCK,LISTPB.EACHCOMMANDHASITSOWNLISTTO *ŠPROCESS.(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA4=ADDRESSOFLISTTOPROCESS*‚EXIT:GOODRETURN-TOCALLER)*‡ERRORRETURN-MAINPROG(MESSAGEWRITTEN)*‚USES:01234567*…D***…A*P***P*R*‚CALLS:WRTMESS„FINDNXTC*ˆSETFLAG1ƒCHKREQDF *ˆUPDTLPBP*‚TABLESUSED:LISTABLE?***************************************************************PROCLIST‚EQU‚***‚CLEARLISTPARABLOCK* CLR.L D0 CLEAR FOR USE/ LEA LISTPB-DATASG(A5),A2 ADDRESS OF PARA BLOCK" MOVE.L #10,D1 SET LONG WORD COUNT$PROCL10 MOVE.L D0,(A2)+ CLEAR A WORD SUB.B #1,D1 DECREMENT COUNT& BNE.S PROCL10 BRANCH IF MORE TO CLEAR0 LEA LISTPB-DATASG(A5),A6 GET PARA BLOCK ADDRESS.CLR.BFLAG1-DATASG(A5)ƒCLEARFLAG1FORSTART**‚PROCESSLISTENTRIES*PROCL20 CLR.L D0 CLEAR FOR USE* MOVE.B (A4),D0 GET 1ST BYTE OF LIST ENTRY1 BEQ.S PROCL70 BRANCH IF ZERO-PROCESS END OF LIST% CMP.B #':',D0 IS LIST ENTRY A COLON? BEQ.S PROCL50 BRANCH IF YES* CMP.B #';',D0 IS LIST ENTRY A SEMI-COLON? BEQ.S PROCL50 BRANCH IF YES% CMP.B #',',D0 IS LIST ENTRY A COMMA? BEQ.S PROCL50 BRANCH IF YES CMP.B #'#',D0 A POUND SIGN? BEQ.S PROCL50 BRANCH IF YES=LEA…LISTABLE-DATASG(A5),A2GETADDRESSOFLISTTABLEOFFSETS0LEA…LISTBLND-DATASG(A5),A0ENDADDRESSOFTABLE6PROCL30 CMP.W (A2),D0 IS THIS A VALID LIST TO PROCESS?. BEQ.S PROCL40 BRANCH IF YES,GO TO ITS ROUTINE/ ADD.L #LISTBLNG,A2 BUMP TO NEXT ENTRY IN TABLE CMP.L A0,A2 PAST END OF TABLE?. BLT.S PROCL30 BRANCH IF NO,LOOK AT NEXT ENTRY! BRA.S PROCLERR ERROR IN THE LIST!PROCL40 SUB.L #1,D0 ADJUST OFFSET LSL.L #2,D0 MULTIPLY BY 4- LEA PROCBRAT(PC),A2 GET BRANCH TABLE ADDRESSJMP(A2,D0)‚GODOIT*,*‚PROCESSSPECIALCHARACTERSINLISTENTRIES*6PROCL50 BSR FINDNXTC GO FIND NEXT CHAR IN INPUT BUFFER TST.L D1 FOUND ONE?2 BNE.S PROCL60 BRANCH IF NOT FOUND,SEE IF REQUIRED+ CMP.B (A3),D0 IS NEXT CHAR A SPECIAL CHAR?. BNE.S PROCL60 BRANCH IF NO,CHEXK FOR REQUIRED ADD.L #1,A3 POINT TO NEXT CHAR# BSR SETFLAG1 SET FLAG1 IF REQUITED% ADD.L #2,A4 POINT TO NEXT LIST ENTRY) BRA.S PROCL20 GO PROCESS NEXT LIST ENTRY*-*‚SPECIALCHARACTERNOTFOUNDININPUTBUFFER*0PROCL60 BSR CHKREQDF GO CHECK FOR REQUIRED FIELD TST.L D1 IS FIELD REQUIRED?BNECMDERR‚BRANCHIFYES,ERROR/ BSR UPDTLPBP GO UPDATE LIST PARA BLOCK POINTER( ADD.L #4,A4 BUMP PAST 2 ENTRIES IN LIST' BRA PROCL20 GO PROCESS NEXT LIST ENTRY*1*‚ENDOFLIST-LOOKFORMORECHARSININPUTBUFFER*:PROCL70 BSR FINDNXTC GO LOOK FOR NEXT CHAR IN INPUT BUFFER TST.L D1 FOUND ONE?' BNE.S PROCL75 BRANCH IF NO,GOOD RETURN!PROCERTN ADD.L #4,A7 UPDATE STACK" BRA CMDERR GO OUTPUT WHAT MESSAGEPROCL75 RTS RETURN*1*‚ERRORINLISTPARAMETERS-INTERNALPROGRAMERROR*1PROCLERR MOVE.L #20,D0 # BYTES FOR OUTPUT MESSAGE- LEA LISTERR-DATASG(A5),A0 ADDRESS OF MESSAGE BSR WRTMESS OUTPUT THE MESSAGE ADD.L #4,A7 UPDATE STACK RTS RETURN TO MAIN PROGRAM**ˆPROCESSLISTBRANCHTABLE*PROCBRAT EQU *-‰BRAPROCSNDPROCESSSTRINGWITHNODELIMITER.‰BRAPROCNDNPROCESSNUMBERNUMBERDASHNUMBER‰BRAPROCHARPROCESSCHARACTER‰BRAPROCNT‚PROCESSCOUNT*‰BRAPROCSWDPROCESSSTRINGWITHDELIMITER‰BRAPROCFN‚PROCESSFILENAME(‰BRAPROCNCNPROCESSNUMBERCOMMANUMBER PAGE>***************************************************************9*PROCSND PROCESS STRING WITH NO DELIMITERS. DETERMINE THE2*ˆBEGINNINGANDENDINGADDRESSOFASTRINGWITHNO4*ˆDELIMITERSINTHEINPUTBUFFERANDPUTTHEADDRESS *ˆINTOTHELISTPARAMETERBLOCK.(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER#*ˆA3=ADDRESSOFNEXTCHARINBUFFER**ˆA4=ADDRESSOFLISTENTRYBEINGPROCESSED8*ˆA6=ADDRESSOFLISTPARA.BLOCKENTRYFORSTARTADDRESS*‚EXIT:GOODRETURN-TOCALLER$ (*‡ERRORRETURN-MAINPROG(MESSAGEOUTPUT)*‡A1=UNCHANGED5*‡A3=ADDRESSOF1STCHARAFTERSTRINGININPUTBUFFER*‡A4=ADDRESSOFNEXTLISTENTRY%*‡A6=ADDRESSOFNEXTPARABLOCKENTRY*‚USES:01234567*…Dƒ* *…AƒPƒRRPR*‚CALLS:WRTMESS„FINDNXTC*ˆSETFLAG1ƒCHKREQDF?*************************************************************** PROCSNDEQU‚*, BSR FINDNXTC FIND NEXT CHAR IN INPUT BUFFER TST.L D1 FOUND?5 BNE.S PRSND30 BRANCH IF NOT FOUND,CHECK FOR REQUIRED6 MOVE.L A3,(A6) SAVE START ADDRESS OF STRING IN LISTPB# ORI.B #$80,(A6) TURN ON FOUND FLAG+ ADD.L #4,A6 POINT TO END ADDRESS IN LISTPB-PRSND10 ADD.L #1,A3 BUMP INPUT BUFFER POINTER CMP.L A3,A1 PAST END OF BUFFER?9 BLE.S PRSND20 BRANCH IF PAST END,SAVE STRING END ADDRESS# CMP.B #' ',(A3) NEXT CHAR A BLANK?4 BEQ.S PRSND20 BRANCH IF YES,SAVE STRING END ADDRESS, CMP.B #ENDOD,(A3) IS NEXT CHAR END OF DATA?3 BNE.S PRSND10 BRANCH IF NO,GET NEXT CHAR IN BUFFER=PRSND20 MOVE.L A3,(A6) SAVE END ADDRESS+1 OF STRING IN LISTPB! SUB.L #1,(A6) ACTUAL END ADDRESS# ORI.B #$80,(A6) TURN ON FOUND FLAG. ADD.L #4,A6 BUMP LISTPB POINTER TO NEXT ENTRY$ BSR SETFLAG1 SET FLAG 1,IF REQUIRED, ADD.L #2,A4 BUMP LIST POINTER TO NEXT ENTRY' BRA PROCL20 GO PROCESS NEXT LIST ENTRY*%* STRING WITH NO DELIMITERS NOT FOUND*+PRSND30 BSR CHKREQDF GO SEE IF WAS REQUIRED TST.L D1 REQUIRED?! BNE PROCERTN BRANCH IF YES,ERROR& ADD.L #8,A6 BUMP TO NEXT LISTPB ENTRY$ ADD.L #2,A4 BUMP TO NEXT LIST ENTRY' BRA PROCL20 GO PROCESS NEXT LIST ENTRY PAGE>**************************************************************3*‚PROCSWDPROCESSSTRINGWITHDELIMITERS.DETERMINE,*ŠBEGINNINGANDENDINGADDRESSESOFASTRING**ŠWITHDELIMITERSANDPUTTHEADDRESSINTO*ŠTHELISTPARAMETERBLOCK.*‚REV.1.003/10/80(C313)(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER**ˆA4=ADDRESSOFLISTENTRYBEINGPROCESSED:*ˆA6=ADDRESSOFLISTPARABLOCKENTRYFORSTRINGADDRESSES0*‚EXIT:GOODRETURN-TOCALLER…ERRORRETURN-CMDERR*‡A1=UNCHANGED5*‡A3=ADDRESSOF1STCHARAFTERSTRINGININPUTBUFFER*‡A4=ADDRESSOFNEXTLISTENTRY-*‡A6=ADDRESSOFNEXTENTRYINLISTPARABLOCK*‚USES:01234567*…Dƒ** *…AƒPƒRRPR!*‚CALLS:FINDNXTC„SETFLAG1ƒCHKREQF?*************************************************************** PROCSWD‚EQU‚*% BSR FINDNXTC GET NEXT CHAR=DELIMITER TST.L D1 FOUND IT? BNE.S PRSWD20 BRANCH IF NOP.MOVE.B(A3)+,SAVDEL-DATASG(A5)„SAVEDELIMITER) MOVE.L A3,(A6) SAVE STRING START ADDRESS# ORI.B #$80,(A6) TURN ON FOUND FLAG$ ADD.L #4,A6 BUMP PARA BLOCK POINTER'PRSWD10 BSR FINDNXTC GET NEXT CHARACTER TST.L D1 FOUND ONE? BNE.S PRSWD30 BRANCH IF NO- MOVE.B (A3),D2 GET CHAR IN D REG FOR COMPARE, CMP.B SAVDEL-DATASG(A5),D2 IS IT DELIMITER? BEQ.S PRSWD15 BRANCH IF YES ADD.L #1,A3 POINT TO NEXT CHAR BRA.S PRSWD10 GO LOOK SOME MORE"*‚HEREIFFOUNDMATCHINGDELIMITER.PRSWD15 MOVE.L A3,(A6) SAVE STRING END ADDRESS) SUB.L #1,(A6) POINT TO ACTUAL STRING END# ORI.B #$80,(A6) TURN ON FOUND FLAG+ ADD.L #4,A6 POINT TO NEXT PARA BLOCK ENTRY# BSR SETFLAG1 SET FLAG1 IF REQUIRED%ADD.L#2,A4ƒPOINTTONEXTLISTENTRYITST.BSHRDEL-DATASG(A5)‚WILLTHEREBEANOTHERSTRINGFORTHISDELIMITER?BEQ.SPRSWD17‚BRANCHIFNO+CLR.BSHRDEL-DATASG(A5)„CLEARFORNEXTUSE BRA.S PRSWD18 GO RETURN3PRSWD17 ADD.L #1,A3 POINT TO NEXT INPUT BUFFER CHAR)PRSWD18 BRA PROCL20 GO PROCESS NEXT ENTRY)*‚HEREIFSTRINGWITHDELIMITERNOTFOUND+PRSWD20 BSR CHKREQDF SEE IF REALLY REQUIREDTST.LD1‚ISIT?" BNE.S PRSWD30 BRANCH IF YES,ERROR7 ADD.L #8,A6 NOT REQUIED,POINT TO NEXT PARA BLOCK ENTRY% ADD.L #2,A4 POINT TO NEXT LIST ENTRY" BRA PROCL20 GO PROCESS NEXT ENTRY%*‚HEREIFDIDNTFINDSECONDDELIMITER!PRSWD30BRAPROCERTN‚SYNTAXERROR PAGE>***************************************************************5*‚PROCHARPROCESSCHARACTER.FINDABYTECHARACTERIN(*ŠTHEINPUTBUFFERANDPUTINTOTHELIST*ŠPARAMETERBLOCK.$ *‚REV1.003/11/80(C313)(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER#*ˆA3=ADDRESSOFNEXTCHARINBUFFER**ˆA4=ADDRESSOFLISTENTRYBEINGPROCESSED6*ˆA6=ADDRESSOFLISTPARABLOCKFORSAVETHECHARACTER*‚EXIT:A1=UNCHANGED)*‡A3=ADDRESSOFNEXTCHARININPUTBUFFER*‡A4=ADDRESSOFNEXTLISTENTRY-*‡A6=ADDRESSOFNEXTENTRYINLISTPARABLOCK*‚USES:01234567*…Dƒ* *…AƒPƒRRPR*‚CALLS:FINDNXTC„SETFLAG1 *ˆCHKREQDF?*************************************************************** PROCHAR‚EQU‚* BSR FINDNXTC GET THE CHARACTER TST.L D1 FOUND IT?! BNE.S PRCR20 BRANCH IF NOT FOUND( MOVE.B (A3)+,(A6) SAVE IT IN PARA BLOCK$ ORI.B #$80,(A6)+ TURN ON FOUND FLAG$ BSR SETFLAG1 SET FLAG 1 IF REQUIRED+PRCR10 ADD.L #2,A4 POINT TO NEXT LIST ENTRY" BRA PROCL20 GO PROCESS NEXT ENTRY**‚HEREIFCHARACTERNOTFOUND*.PRCR20 BSR CHKREQDF SEE IF ITS REALLY REQUIRED TST.L D1 IS IT?! BNE PROCERTN BRANCH IF YES,ERROR3 ADD.L #1,A6 NOT REQUIRED,UPDATE PARA BLOCK POINTER, BRA.S PRCR10 UPDATE LIST POINTER AND RETURN PAGE>***************************************************************8*‚PROCNDNPROCESSNUMBERDASHNUMBER.FINDTHE2NUMBERS2*ŠINTHEINPUTBUFFER,CONVERTTHEMTOHEXADECIMAL,0*ŠANDSAVETHEMINTHELISTPARAMETERBLOCK.THE.*ŠRESULTINGNUMBERSWILLBOTHBE4BYTESLONG.*%*‚REV.1.10‚01/27/84‚PETERS.GILMOUR.*1.Allowed'.'inadditionto'*'character.$*‚REV.1.00‚02/07/80(SANDYDEARING)*(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER**ˆA4=ADDRESSOFLISTENTRYBEINGPROCESSED3*ˆA6=ADDRESSINLISTPARAMETERBLOCKFOR1STNUMBER*‚EXIT:A1=UNCHANGED)*‡A3=ADDRESSOF1STCHARAFTER2NDNUMBER*‡A4=ADDRESSOFNEXTLISTENTRY.*‡A6=ADDRESSOFNEXTENTRYINLISTPARA.BLOCK)*‡EXITTOCALLERIFGOOD,OTHERWISECMDERR*‚USES:01234567*…Dƒ* *…AƒPƒRRPR*‚CALLS:FINDNXTC„CHKREQDFF*ˆGETNEXTC„CVTASCBI *ˆSAVBINBR>************************************************************** PROCNDN‚EQU‚*>MOVE.LA3,CMDARGAD-DATASG(A5)PRESERVEADDROFCMDARG‚011685.CLR.BTABFLAG-DATASG(A5)ƒCLEARTABSTOPSFLAG-CLR.BNEGFLAG-DATASG(A5)ƒCLEARNEGATIVEFLAG/ BSR FINDNXTC GO FIND NEXT CHAR IN INPUT BUFFER TST.L D1 FOUND? BNE PRNDN90 BRANCH IF NO% CMP.B #'-',(A3) NEGATIVE SIGN FOUND? BNE.S PRNDN10 BRANCH IF NO/MOVE.B#1,NEGFLAG-DATASG(A5)„SETNEGATIVEFLAG) BRA.S PRNDN30 GO GET NEXT CHAR IN BUFFER,PRNDN10 CMP.B #'*',(A3) IS CHAR AN ASTERISK? BEQ.S PRNDN11 BRANCH IF YES"CMP.B#'.',(A3)ISCHARA‚PERIOD? BNE.S PRNDN20 BRANCH IF NO+PRNDN11 MOVE.B #$C0,(A6) TURN ON FOUND FLAG2 ADD.L #4,A6 BUMP POINTER TO NEXT PARA BLOCK ENTRY% BSR GETNEXTC GET NEXT CHAR IN BUFFER TST.L D1 FOUND ONE? BEQ.S PRNDN60 BRANCH IF FOUND, BRA.L PRNDN100 NOT FOUND,GO UPDATE POINTERS&PRNDN20 CMP.B #'F',(A3) TAB STOP CHAR? BNE.S PRNDN40 BRANCH IF NO; CMP.B #':',-1(A3) AN F FOR HORIZONTAL RANGE AND TAB STOPS? BNE.S PRNDN40 BRANCH IF NO.MOVE.B#1,TABFLAG-DATASG(A5)…TURNONTABFLAG2PRNDN30 BSR GETNEXTC GET NEXT CHAR IN INPUT BUFFER TST.L D1 FOUND ONE?" BNE.S PRNDNER BRANCH IF NOP,ERROR( BSR CVTASCBI GO CONVERT FIELD TO BINARY TST.L D1 WERE DIGITS FOUND?! BNE.S PRNDNER BRANCH IF NO,ERROR0 BRA.S PRNDN50 GO SAVE 1ST # AND LOOK FOR A DASH/PRNDN40 BSR CVTASCBI GO CONVERT FIELD TO BINARY TST.L D1 WERE DIGITS FOUND?+ BNE.S PRNDN90 BRANCH IF NO,SEE IF REQUIRED&CMP.L#-1,D1WASPERIODFOUND?‹011685/BNE.SPRNDN50NO,SOCAN'TBEFILENAME‚011685G MOVE.L CMDARGAD-DATASG(A5),A3 RESTORE PTR TO START OF FILE NAME 011685: BRA.S PRNDN90 MAKE SURE NO DIGITS REQUIRED FOR CMD 0116852PRNDN50‚BSRSAVBINBRSAVEBINARYRESULTSINLISTPB(PRNDN60 CMP.B #' ',(A3) IS CHAR A BLANK?0 BEQ.S PRNDN100 BRANCH IF YES,GO UPDATE POINTERS CMP.B #'-',(A3) IS CHAR A DASH?/ BNE.S PRNDN100 BRANCH IF NO,GO UPDATE POINTERS BSR GETNEXTC GO GETR NEXT CHAR TST.L D1 FOUND?( BNE.S PRNDNER BRANCH IF NOT FOUND,ERROR CMP.B #'F',(A3) TAB STOP CARA?: BEQ.S PRNDN70 BRANCH IF YES,SEE IF 1ST FIELD WAS TAB ALSO% 3TST.BTABFLAG-DATASG(A5)…WAS1STFIELDTABSTAOPS?" BNE.S PRNDNER BRANCH IF YES,ERROR) BRA.S PRNDN80 GO CONVERT FIELD TO BINARY9PRNDN70TST.BTABFLAG-DATASG(A5)„WAS1STFIELDTABSTOPS?! BEQ.S PRNDNER BRANCH IF NO,ERROR( BSR GETNEXTC GO GET NEXT CHAR IN BUFFER TST.L D1 FOUND?( BNE.S PRNDNER BRANCH IF NOT FOUND,ERROR/PRNDN80 BSR CVTASCBI GO CONVERT FIELD TO BINARY TST.L D1 WERE DIGITS FOUND?! BNE.S PRNDNER BRANCH IF NO,ERROR* BSR SAVBINBR SAVE BINARY RESULT IN LISTPB& BRA.S PRNDN110 GO UPDATE LIST POINTER'PRNDN90 BSR CHKREQDF GO SEE IF REQUIRED TST.L D1 REQUIRED?" BNE.S PRNDNER BRANCH IF YES,ERROR+ ADD.L #8,A6 POINT TO NEXT PARA BLOCK ENTRY% BRA.S PRNDN110 GO UPDATE LST POINTER*PRNDN100 ADD.L #4,A6 UPDATE LISTPB POINTER.PRNDN110 ADD.L #2,A4 UPDATE LIST ENTRY POINTER' BRA PROCL20 GO PROCESS NEXT LIST ENTRY!PRNDNERBRAPROCERTN‚ERRORRETURN PAGEC********************************************************************:*‚PROCNTPROCESSCOUNT.DETERMINEIFCOUNTVALUEIS1BYTE6*‰LONGOR4BYTESLONG.IFINPUTVALUEIS'A'FORALL,2*‰PUT-1INTHELISTPARA.BLOCK,OTHERWISE,CONVERT3*‰COUNTTOHEXANDSAVERESULTINLISTPARA.BLOCK.<*‰IFLOCATION'NOHR'ISNEGATIVE,'A'FORALLISNOTALLOWED.*‚REV.1.003/27/80(C313)(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER**ˆA4=ADDRESSOFLISTENTRYBEINGPROCESSED**ˆA6=ADDRESSOFLISTPARABLOCKFORRESULT*‚EXIT:A1=UNCHANGED)*‡A3=ADDRESSOFNEXTCHARININPUTBUFFER*‡A4=ADDRESSOFNEXTLISTENTRY+*‡A6=ADDRESSOFNEXTLISTPARA.BLOCKENTRY*‚USES:01234567*…D* *…AƒPƒRRPR"*‚CALLS:FINDNXTCƒGETNEXTCƒCHKREQDF*ˆCVTASCBIƒSAVBINBRA***************************************************************** PROCNT‚EQU‚*.CLR.BTABFLAG-DATASG(A5)‚CLEARTABSTOPSFLAG-CLR.BNEGFLAG-DATASG(A5)‚CLEARNEGATIVEFLAG( MOVE.B 1(A4),D7 GET FLAG BYTE FROM LIST- BSR FINDNXTC GET NEXT CHAR FROM INPUT BUFFER TST.L D1 GOT ONE? BNE.S PRCNT30 BRANCH IF NO# TST.B NOHR-DATASG(A5) 'A' ALLOWED?( BMI.S PRCNT05 BRANCH IF 'A' NOT ALLOWED! CMP.B #'A',(A3) IS IT A FOR ALL? BEQ.S PRCNT40 BRANCH IF YES! CMP.B #'a',(A3) IS IT a FOR ALL* BEQ.S PRCNT40 BRANCH IF YES,PRCNT05 BSR CVTASCBI CONVERT ASCII TO BINARY TST.L D1 WERE DIGITS FOUND?+ BNE.S PRCNT30 BRANCH IF NO,SEE IF REQUIRED' CMP.B #LONG,D7 IS THIS A 4 BYTE FIELD?' BEQ.S PRCNT20 BRANCH IF YES,GO SAVE IT**‚HEREIFSAVINGA1BYTEFIELD*0PRCNT10 MOVE.B D3,(A6) SAVE NUMBER IN PARA BLOCK$ ORI.B #$80,(A6)+ TURN ON FOUND FLAG+PRCNT15BSRƒSETFLAG1SETFLAG1IFREQUIRED,PRCNT17 ADD.L #2,A4 POINT TO NEXT LIST ENTRY' BRA PROCL20 GO PROCESS NEXT LIST ENTRY**‚HEREIFSAVINGA4BYTEFIELD*.PRCNT20 BSR SAVBINBR SAVE RESULT IN PARA BLOCK( BRA.S PRCNT15 GO UPDATE REST AND RETURN**‚HEREIFDIDNTFINDFIELD*'PRCNT30BSRƒCHKREQDFGOSEEIFREQUIRED TST.L D1 IS IT?! BNE PROCERTN BRANCH IF YES,ERROR' CMP.B #LONG,D7 IS THIS A 4 BYTE FIELD? BEQ.S PRCNT35 BRANCH IF YES& ADD.L #1,A6 UPDATE PARA BLOCK POINTER( BRA.S PRCNT17 GO UPDATE REST AND RETURN-PRCNT35 ADD.L #4,A6 UPDATE PARA BLOCK POINTER(BRA.SPRCNT17‚GOUPDATERESTANDRETURN**‚HEREIFAFORALL*6PRCNT40 ADD.L #1,A3 POINT TO NEXT CHAR IN INPUT BUFFER' CMP.B #LONG,D7 IS THIS A 4 BYTE FIELD? BEQ.S PRCNT50 BRANCH IF YES' MOVE.B #-1,D3 1 BYTE FIELD,SET FOR ALL* BRA PRCNT10 GO SAVE EVERYTHING AND RETURN1PRCNT50 MOVE.L #-1,(A6)+ 4 BYTE FIELD,SET FOR ALL! BRA PRCNT17 GO UPDATE AND RETURN PAGE@*****************************************************************3*‚PROCNCNPROCESSNUMBERCOMMANUMBER.FINDTHE1-2/*ŠCHARINPUTASCIINUMBERSINTHECOMMANDLINE,-*ŠCONVERTTOA1BYTEHEXVALUE,ANDSTOREIN/*ŠTHEPARAMETERBLOCK.EACHNUMBERISSEPARATED.*ŠBYACOMMA.20NUMBERSMAX.EACHNUMBERMUST*ŠBEINTHERANGEOF1TO80.*‚REV.1.00‚4/21/80‚(C313)(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER**ˆA4=ADDRESSOFLISTENTRYBEINGPROCESSED% )*ˆA6=ADDRESSOFPARABLOCKFOR1STNUMBER*‚EXIT:A1=UNCHANGED**‡A3=ADDRESSOF1STCHARAFTERLASTNUMBER**‡A4=ADDRESSOFNEXTLISTENTRYTOPROCESS-*‡A6=ADDRESSOFNEXTENTRYINPARAMETERBLOCK*‚USES:01234567 *…Dƒ*ƒ*…** *…AƒPƒRRPR+*‚CALLS:FINDNXTC„CVTASCBI„GETNEXTC„CHKREQDF:********************************************************** PROCNCN‚EQU‚* MOVE.L #20,D7 MAX # OF NUMBERS1 BSR FINDNXTC GET THE NEXT CHAR FROM INPUT BUFFER TST.L D1 FOUND ONE? BNE.S PRNCN30 BRANCH IF NO,PRNCN10 BSR CVTASCBI CONVERT FIELD TO BINARY TST.L D1 GOOD CONVERT?! BNE.S PRNCN30 BRANCH IF NO,ERROR% CMP.L #2,D6 MORE THAN 2 CHARS INPUT?" BGT.S PRNCNER BRANCH IF YES,ERROR CMP.B #1,D3 RESULT LESS THAN 1?" BLT.S PRNCNER BRANCH IF YES,ERROR% CMP.B #80,D3 RESULT GREATER THAN 80?" BGT.S PRNCNER BRANCH IF YES,ERROR. MOVE.B D3,(A6) STORE VALUE IN PARAMETER BLOCK$ORI.B#$80,(A6)+‚TURNONFOUNDFLAG SUB.L #1,D7 DECREMENT COUNT* BEQ.S PRNCN20 BRANCH IF REACHED MAX OF 20# CMP.B #',',(A3) NEXT CHAR A COMMA? BNE.S PRNCN20 BRANCH IF NO,DONE BSR GETNEXTC GET THE NEXT CHAR TST.L D1 GOT ONE?.BEQ‚PRNCN10BRANCHIFYES,GOCONVERTANDSAVE) BRA.S PRNCNER ERROR RETURN,NO MORE CHARS2PRNCN20 ADD.L D7,A6 POINT TO NEXT PARA BLOCK ENTRY% ADD.L #2,A4 POINT TO NEXT LIST ENTRY' BRA PROCL20 RETURN FOR NEXT LIST ENTRY'PRNCN30 BSR CHKREQDF IS FIELD REQUIRED?- BEQ.S PRNCN20 BRANCH IF NO,SET-UP FOR RETURN!PRNCNERBRAPROCERTN‚ERRORRETURN PAGE4*****************************************************0*‚PROCFN‚PROCESSFILENAME.SETUPDEFAULTVALUES)*ŠFORVOLUME,USER#,CATALOG,EXTENSIONFROM'*ŠORIGINALDEFAULTVALUESPASSEDTOTHE+*ŠEDITORATSTART.CALLSEDITFILETOSETUP(*ŠACTUALFILENAMEPARAMETERBLOCK.MOVES&*ŠRETURNEDFILENAMEPARAMETERBLOCKTO**ŠFMSFILES,WITHSTARTANDENDADDRESSESIN*ŠTHELISTPARAMETERBLOCK.*‚REV.‚1.00‚4/22/80‚(C313)(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER#*ˆA3=ADDRESSOFNEXTCHARINBUFFER$*ˆA4=ADDRESSOFLISTBEINGPROCESSED.*ˆA6=ADDRESSOFPARABLOCKENTRYFORADDRESSES2*‚EXIT:GOODRETURN-TOCALLER‚ERRORRETURN-PROCERTN*‡A1=UNCHANGED#*‡A3=ADDRESSOFNEXTCHARINBUFFER**‡A4=ADDRESSOFNEXTLISTENTRYTOPROCESS-*‡A6=ADDRESSOFNEXTENTRYINLISTPARABLOCK*‚USES:01234567*…D***…A*P*RRPR+*‚CALLS:FINDNXTC„EDITFILE„GETNEXTC„CHKREQDF=************************************************************* PROCFN‚EQU‚* BSR FINDNXTC GET NEXT CHAR TST.L D1 GOT ONE? BNE.L PRFN40 BRANCH IF NO$ MOVE.L A1,A2 GET BUFFER END ADDRESS SUB.L #1,A2 ACTUAL END ADDRESS1 MOVE.B #$0D,(A2) FORCE END TO BE CR FOR EDITFILE= LEA INFHS-DATASG(A5),A0 OUTPUT BUFFER FOR QUALIFIED FILENAME5 MOVE.L EDITVOLN-DATASG(A5),FHSVOL(A0) DEFAULT VOLUME5 MOVE.W EDITUSER-DATASG(A5),FHSUSN(A0) DEFAULT USER #4 MOVE.L EDTCAT-DATASG(A5),FHSCLG(A0) DEFAULT CATALOG7 MOVE.L EDTCAT1-DATASG(A5),FHSCLG+4(A0) REST OF CATALOG* MOVE.W #'SA',FHSEXT(A0) DEFAULT EXTENSION) MOVEM.L A1-A6,-(A7) SAVE THESE REGISTERS) MOVE.L A0,A6 START ADDRESS OF FHS BUFFER' MOVE.L A3,A0 START ADDRESS OF FILENAME*=*CHANGEANYLOWERCASECHARINFILENAMETOUPPERCASE…012085*;PRFN02 CMP.B #$61,(A3) SEE IF CHAR IS LOWER CASE "A" 012085%BGE.SPRFN04MAYBELOWERCASEƒ0120856 CMP.B #$0D,(A3) SEE IF CHAR IS CARRIAGE RETURN 0120852 BEQ.S PRFN06 END OF FILENAME, GO FIND FILE 0120850 BRA.S PRFN05 NOT LOWER CASE LETTER OR CR 012085)PRFN04 CMP.B #$7A,(A3) LOWER CASE? 012085& BGT PRFN05 NO, GO DO NEXT CHAR 0120857 AND.B #$DF,(A3) MAKE LOWER CASE INTO UPPER CASE 012085)PRFN05 ADD.L #1,A3 GO TO NEXT CHAR 012985$ BRA.S PRFN02 GO DO NEXT CHAR 0120859PRFN06 MOVE.L A0,A3 RESTORE START ADDR OF FILENAME 012085' BSR EDITFILE SET UP QUALIFIED FILENAME, MOVEM.L (A7)+,A1-A6 RESTORE THESE REGISTERS+ BMI.S PRFNER BRANCH IF ERROR FROM EDITFILE BTST.L #19,D0 FOUND FILENAME? BEQ.S PRFNER BRANCH IF NO,ERROR4 LEA (INFHS+6)-DATASG(A5),A0 POINT TO FILENAME STUFF MOVE.L A2,-(A7) SAVE A2> LEA FMSFILES-DATASG(A5),A2 OUTPUT BUFFER ADDRESS FOR FILENAME& 0 MOVE.L A2,(A6) SAVE START ADDRESS IN PARA BLOCK# ORI.B #$80,(A6) TURN ON FOUND FLAG( MOVE.L #7,D0 LENGTH FOR MOVING FILENAME3PRFN10 MOVE.L (A0)+,(A2)+ MOVE FILENAME TO FMSFILES SUB.L #1,D0 DECREMENT COUNTER$ BNE.S PRFN10 BRANCH IF MORE TO MOVE. SUB.L #4,A2 POINT TO END ADDRESS OF FILENAMES/ MOVE.L A2,4(A6) SAVE END ADDRESS IN PARA BLOCK$ ORI.B #$80,4(A6) TURN ON FOUND FLAG+ ADD.L #8,A6 POINT TO NEXT PARA BLOCK ENTRY% ADD.L #2,A4 POINT TO NEXT LIST ENTRY MOVE.L (A7)+,A2 RESTORE A2, MOVE.B #ENDOD,(A2) RESTORE END OF DATA CHAR0PRFN30 BSR.S GETNEXTC LOOK FOR NEXT BLANK OR END TST.L D1 NON-BLANK? BEQ.S PRFN30 LOOK SOME MORE BRA PROCL20 RETURN-DONE-PRFN40 BSR.S CHKREQDF IS THIS FIELD REQUIRED?+ BEQ.S PRFN30 BRANCH IF NOT REQUIRED,RETURN PRFNER BRA PROCERTN ERROR RETURN PAGE=**************************************************************4* SETFLAG1 CHECK 2ND BYTE OF LIST ENTRY TO DETERMINE,*ŠFLAG1ISTOBESETWHENTHEFIELDHASBEEN*ŠFOUNDANDSETIFNECESSARY.!*‚REV1.002/7/80(SANDYDEARING) *‚ENTRY:A4=POINTERTOLISTENTRY*‚EXIT:A4=UNCHANGED>**************************************************************SETFLAG1 EQU *+ MOVE.B 1(A4),D0 GET 2ND BYTE OF LIST ENTRYBTST‚#0,D0ISFLAG1TOBESET? BEQ.SSETF1ƒBRANCHIFNO,RETURN% MOVE.B #1,FLAG1-DATASG(A5) SET FLAG1SETF1RTSƒRETURN?****************************************************************:*‚CHKREQDFCHECKREQUIREDFIELD.CHECKTHE2NDBYTEOFTHE3*ŠLISTENTRYANDDETERMINEIFTHEFIELDISREQUIRED4*ŠORREQUIREDIFFLAG1ISSET,WHENTHEFIELDHASNOT3*ŠBEENFOUND.IFFIELDISREQUIRED,ASTATUSCODEIS *ŠRETURNEDIND1,OTHERWIDE,D1=0."*‚REV.1.002/7/80(SANDYDEARING) *‚ENTRY:A4=POINTERTOLISTENTRY*‚EXIT:A4=UNCHANGED*‡D1=0=FIELDNOTREQUIRED*‡D1=1=FIELDISREQUIRED>**************************************************************CHKREQDFEQU‚*+ MOVE.B 1(A4),D0 GET 2ND BYTE OF LIST ENTRY BTST #1,D0 IS FIELD REQUIRED?- BNE.S CHKRF20 BRANCH IF YES,SET ERROR RETURN. BTST #2,D0 IS FIELD REQUIRED IF FLAG1 IS SET?/ BEQ.S CHKRF10 BRANCH IF NO,CLEAR ERRORE RETURN%TST.BFLAG1-DATASG(A5)‚ISFLAG1SET?- BNE.S CHKRF20 BRANCH IF YES,SET ERROR RETURN#CHKRF10 CLR.L D1 CLEAR ERROR STATUS ƒRTS‚RETURN%CHKRF20 MOVE.L #1,D0 SET ERROR RETURN RTS RETURN PAGE>***************************************************************:*‚GETNEXTC‚GETNEXTCHARACTERINTHEINPUTCOMMANDBUFFER.1*ŒIFTHENEXTCHARACTERISABLANKORENDOFDATA.*ŒORPASTINPUTBUFFER,ANERRORSTATUSCODEIS&*ŒRETURNEDIND1,OTHERWISED1ISZERO."*‚REV1.00‚3/12/80(SANDYDEARING)(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER5*ˆA3=ADDRESSOFLASTCHARACTERUSEDFROMINPUTBUFFER*‚EXIT:A1=UNCHANGED6*‡A3=ADDRESSOFNEXTCHARTOBEUSEDFROMINPUTBUFFER *‡D1=0=NON-BLANKCHARACTERFOUND4*‡D1=1=PASTENDOFBUFFER,BLANK,ORENDOFDATAFOUND*‚USES:01234567*…DƒR*…AƒPƒR?***************************************************************GETNEXTC‚EQU‚* CLR.L D1 CLEAR STATUS RETURN/ ADD.L #1,A3 POINT TO NEXT CHAR IN INPUT BUFFER CMP.L A3,A1 PAST END?' BLE.S GETNC10 BRANCH IF PAST END,ERROR CMP.B #ENDOD,(A3) END OF DATA?" BEQ.S GETNC10 BRANCH IF END,ERROR CMP.B #' ',(A3) BLANK?' BNE.S GETNC20 BRANCH IF NOT BLANK,GOOD%GETNC10 MOVE.L #1,D1 SET ERROR STATUSGETNC20RTSƒRETURNTOCALLER PAGE>***************************************************************7*‚FINDNXTC‚FINDNEXTCHARACTER.FINDTHENEXTNON-BLANK-*ŒCHARACTERINTHEINPUTBUFFER.IFTHEREARE.*ŒMORECHARACTERSINTHEINPUTBUFFER,ASTATUS(*ŒCODEISRETURNEDIND1,OTHERWISED1=0.(*‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*‚EXIT:A1=UNCHANGED,*‡A3=ADDRESSOF1STNON-BLANKCHARINBUFFER*‡D1=0=NON-BLANKCHARFOUND$*‡D1=1=NOMORECHARSININPUTBUFFER*‚USES:01234567*…DƒR*…AƒP‚R?***************************************************************FINDNXTC‚EQU‚* CMP.L A3,A1 PAST END OF BUFFER* BLE.S FINDC20 BRANCH IF YES,NO MORE CHARS&  CMP.B #' ',(A3) A BLANK? BNE.S FINDC10 BRANCH IF NOP ADD.L #1,A3 BUMP BUFFER POINTER& BRA.S FINDNXTC GO LOOK FOR MORE CHARS&FINDC10 CMP.B #ENDOD,(A3) END OF DATA?* BEQ.S FINDC20 BRANCH IF YES,NO MORE CHARS CLR.L D1 SET FOUND STATUS RTS RETURN(FINDC20 MOVE.L #1,D1 SET NO CHARS STATUS RTS RETURN PAGE=**************************************************************.* UPDTLPBP UPDATE LIST PARAMETER BLOCK POINTER5*ŠCHECKTHE2NDBYTEOFTHELISTENTRYFORTHELENGTH1*ŠAND#BYTESOFFIELDSINTHELISTPARABLOCKFOR6*ŠTHISENTRY.THIS#OFBYTESISTHENADDEDTOTHELIST1*ŠPARABLOCKPOINTER.THISROUTINEISCALLEDWHEN*ŠAFIELDHASNOTBEENFOUND. *‚ENTRY:A4=POINTERTOLISTENTRY+*ˆA6=POINTERTOCURRENTFIELDINPARABLOCK*‚EXIT:A4=UNCHANGED(*‡A6=POINTERTONEXTFIELDINPARABLOCK*‚USES:01234567*…D** *…A‰PPR>**************************************************************UPDTLPBP EQU *+ MOVE.B 1(A4),D0 GET 2ND BYTE OF LIST ENTRY BTST #3,D0 4 BYTE FIELD?( BEQ.S UPDTL10 BRANCH IF NO,1 BYTE FIELD* MOVE.L #4,D1 SET #BYTES TO ADD TO POINTER. BRA.S UPDTL20 GO CHECK FOR 2 FIELDS IN LISTPB1UPDTL10 MOVE.L #1,D1 SET #BYTES TO ADD TO POINTER*UPDTL20 BTST #4,D0 ARE 2 FIELDS IN LISTPB?- BEQ.S UPDTL30 BRANCH IF NO,GO UPDATE POINTER( LSL.L #1,D1 MULTIPLY #BYTES BY 2 TO ADD,UPDTL30 ADD.L D1,A6 UPDATE POINTER TO LISTPB RTS RETURN TO CALLER PAGE?****************************************************************3*‚CVTASCBICONVERTASCIIDIGITSTOABINARYNUMBER.1*‹CONVERTSAMAXOF8ASCIIDIGITSFROMTHEINPUT*‹BUFFERTOABINARY#."*‚REV1.003/12/80(SANDYDEARING)**‚ENTRY:A1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFERA*‚EXIT:A3=ADDRESSOFNEXTCHARAFTERASCIIDIGITSININPUTBUFFER*‡D1=0=DIGITSFOUND*‡D1=1=NODIGITSFOUND*‡D3=BINARYRESULT*‡D6=#INPUTASCIICHARS*‚USES:01234567*…DƒR*R**R *…AƒPƒRƒP*‚CALLS:GETNEXTC?***************************************************************CVTASCBIEQU‚* MOVE.L #8,D2 MAX # OF DIGITS" CLR.L D3 CLEAR FOR RETURNED VALUE" CLR.L D6 CLEAR FOR RETURNED VALUE! CMP.B #'9',(A3) IS CHAR NUMERIC?, BGT.S CVTAB20 BRANCH IF NO,SET ERROR RETURN" CMP.B #'0',(A3) IS CHAR NUMBERIC?! BLT.S CVTAB20 BRANCH IF NO,ERROR)CVTAB10 ASL.L #1,D3 MULTIPLY RESULT BY 10 MOVE.L D3,D4 SAVE IT ASL.L #2,D3 MULTIPLY BY 100 ADD.L D4,D3 ADD IN ORIGINAL% MOVE.B (A3),D5 GET DIGIT FROM BUFFER AND.L #$F,D5 STRIP FRONT ADD.L D5,D3 ADD TO RESULT ADD.L #1,D6 COUNT THIS CHAR SUB.L #1,D2 DECREMENT COUNT$ BEQ.S CVTAB30 BRANCH IF REACHED MAX+ BSR GETNEXTC GET NEXT CHAR IN INPUT BUFFER TST.L D1 GOT ONE?" BNE.S CVTAB40 BRANCH IF NO,RETURN CMP.B #'9',(A3) NUMERIC?" BGT.S CVTAB40 BRANCH IF NO,RETURN CMP.B #'0',(A3) NUMERIC?3 BLT.S CVTAB35 BRANCH IF NO, TEST FOR PERIOD 011685# BRA.S CVTAB10 GO CONVERT TO BINARY,CVTAB20 MOVE.L #1,D1 SET ERROR RETURN STATUS RTS RETURN/CVTAB30 ADD.L #1,A3 UPDATE INPUT BUFFER POINTER%CVTAB35 CMP.B #'.',(A3) PERIOD 011685(BNE.SCVTAB40‚CAN'TBEFILENAME‚011685&MOVE.L#-1,D1FILENAMESIGNAL…011685 RTS 011685'CVTAB40 CLR.L D1 SET GOOD RETURN STATUS RTS RETURN PAGE>***************************************************************8*‚SAVBINBRSAVEBINARYNUMBERFROMCONVERSIONROUTINEIN6*‹THECURRENTENTRYINLISTPB.SETENTRYFOUNDBIT(31)4*‹ANDIFEITHERNEGFLAGORTABFLAGAREON,SETBIT301*‹INTHECURRENTENTRY.UPDATETHEPOINTERTOTHE*‹NEXTLISTPBENTRY."*‚REV1.003/12/80(SANDYDEARING)*‚ENTRY:D3=BINARYNUMBER'*ˆA6=POINTERTOCURRENTENTRYINLISTPB*‚EXIT:A6=NEXTENTRYINLISTPB*‚USES:01234567*…D‡P*…A‹PR?***************************************************************SAVBINBR EQU *2 MOVE.L D3,(A6) SAVE BINARY NUMBER IN LISTPB ENTRY" OR.B #$80,(A6) TURN ON FOUND FLAG2 TST.B NEGFLAG-DATASG(A5) IS THIS NUMBER NEGATIVE?& BNE.S SAVBN10 BRANCH IF YES,SET BIT30' 2TST.BTABFLAG-DATASG(A5)‚ISTHISNUMBERFORTABS? BEQ.S SAVBN20 BRANCH IF NO7SAVBN10CLR.BNEGFLAG-DATASG(A5)„TURNOFFNEGATIVEFLAG OR.B #$40,(A6) TURN ON BIT 307SAVBN20 ADD.L #4,A6 UPDATE POINTER TO NEXT LISTPB ENTRY RTS. RETURN…PAGE?****************************************************************9*ƒGETCMD‚READINPUTCOMMANDANDSEARCHFORNEXTDELIMETER#*‹(BLANK)ORENDOFDATAFLAG($DE)*ƒREV1.00‚12-3-79(C313)**ƒENTRY:‚A0=ADDRESSOFNEXTCHARINBUFFER&*‹A1=ENDADDRESS+1OFLASTBUFFERCHAR*‹A2=0*‹D0=0)*ƒEXIT:ƒA0=ADDRESSOFNEXTCHARINBUFFER*‹A1=UNCHANGED0*‹A2=FIRST1-4CHARSFOUNDBEFORENEXTDELIMITER%*‹D0=#CHARSFOUND,MAYBEMORETHAN4*‹D1=1IFNEXTCHAR=ENDFLAG*‹D1=0IFNEXTCHAR=BLANK**ƒUSES:01234567 *†DRR* *†ARPR…P@**************************************************************** GETCMDƒEQU‚*ˆCLR.L‚D1ƒCLEARRETURNFLAG!ˆCMP.L‚A0,A1„SEEIFENDOFBUFFER(ˆBLT.S‚GETCMDER‚BRANCHIFPASTEND-ERRORˆMOVE.B‚(A0)+,D1‚GETACHARˆCMP.W‚#ENDOD,D1„SEEIFEND ˆBNE.S‚GETCMD1„BRANCHIFNOTEND,GETCMD01‚MOVE.L‚#1,D1…SETENDOFBUFFERFLAG ˆRTSRETURNGETCMD1‚CMP.B‚#$20,D1ƒABLANK?"ˆBNE.S‚GETCMD2ƒBRANCHIFNOTBLANK&‡TST.L‚D0ŠABLANK-SEEIFGOTANYCHARS$ˆBEQ.S‚GETCMD„NONEYET-LOOKFORMORE+GETCMD05 MOVE.B (A0)+,D1 GET NEXT CHARACTER‰CMP.B#$20,D1‚ABLANK?!‰BEQ.SGETCMD05BRANCHIFABLANK‰CMP.W#ENDOD,D1SEEIFEND%‰BEQ.SGETCMD01BRANCHIFENDOFDATA&‰SUB.L#1,A0„ACHARACTER,RESETPOINTER ‡CLR.L‚D1‰TURNONNEXTCHARFLAG ‡RTSRETURN)GETCMD2CMP.B#'A',D1„MAKESUREITSALPHA"‡BLT.SGETCMD3…BRANCHIFNOTALPHA‡ADD.L‚#1,D0ƒCOUNTTHISCHAR‡CMP.L‚#4,D0†SEEIF4YET"‡BGT.S‚GETCMD…MORETHAN4-GETMORE ‡MOVE.L‚A2,D2…MOVECHARSWEHAVE‡LSL.L‚#8,D2†MOVEWHATWEHAVE‡ADD.L‚D1,D2†ADDINNEWCHAR‡MOVE.L‚D2,A2…SAVERESULT‡BRA.S‚GETCMD…LOOKFORMORE#GETCMDER‚MOVE.L‚#0,D0ƒNOTHINGFOUND ‡RTSRETURN*GETCMD3MOVE.L#0,A2‚SETNOCOMMANDRETURN ‡RTSRETURN‚PAGE?****************************************************************5*‚GETVR‚GETVERTICALRANGESFROMPARAMETERBLOCKLIST1*‰ANDCONVERTTOACTUALFILERECORDNUMBERTOUSE3*‰ORUSEDEFAULTS.‚DEFAULT1STVERTICALRANGE=REC0!*‰DEFAULT#RECORDS=TOENDOFFILE*‚REV.1.003/6/80‚(C313)(*‚ENTRY:A4=ADDRESSOF1STVERTICALRANGE**‚EXIT:D1=0=JUST1STVERTICALRANGEFOUND!*ˆD1=1=FOUNDBOTHVERTICALRANGES0*ˆD1=-1=NOVERTICALRANGESFOUND,USEINGDEFAULTS*ˆ0(A4)=STARTRECORD#,4BYTES*ˆ4(A4)=#RECORDS,4BYTES(*‚GOODRETURN=CALLERERRORRETURN=CMDERR*‚USES:01234567 *…D*R**…A‰PP@**************************************************************** GETVR‚EQU‚*‡CLR.W‚D1ƒRETURNFLAG"‡MOVE.L‚(A4),D0„1STVERTICALRANGE†BCLR.L‚#31,D0†FOUNDONE?1†BEQ.S‚GETVR10…BRANCHIFNOTFOUND,STARTATREC0†BCLR.L‚#30,D0„*?%†BEQ.S‚GETVR20…BRANCHIFNOT*ORNEG †TST.L‚D0‰*?'†BEQ.S‚GETVR30„BRANCHIF*,USEFILELINE* *‚ERRORFOUND* GETVR05‚ADD.L#4,A7UPDATESTACK†BRACMDERR‰ASKWHAT**‚HEREIFSTARTATREC#0*'GETVR10‚MOVE.W‚#-1,D1ƒVRNOTFOUNDFLAG&GETVR15‚CLR.L‚(A4)…STARTRECORDNUMBER‰BRA.S‚GETVR50…LOOKFOR2NDVR*>*‚HEREIFPOSITIVEREC#,STARTAT0,ORPOSITIONATENDOFFILE*"GETVR20‚TST.L‚D0…POSITIONATZERO?‰BEQ.S‚GETVR15ƒBRANCHIFYES*ˆCMP.L‚#999999,D0„POSITIONATENDOFFILE?‡BEQ.S‚GETVR25…BRANCHIFYES0‡SUB.L#1,D0MAKEITMATCHFILELINETYPENUMBERS!‡MOVE.L‚D0,(A4)ƒPOSITIONRECORD#‡BRA.S‚GETVR50†LOOKFOR2NDVR*-*‚HEREIFPOSITIONATENDOFFILE,USEMAXLINE*5GETVR25‚MOVE.L‚MAXLINE-DATASG(A5),(A4)„STARTRECORD#ˆBRA.S‚GETVR50‹LOOKFOR2NDVR**‚HEREIFUSECURRENTREC#*3GETVR30‚MOVE.L‚FILELINE-DATASG(A5),(A4)ƒSTARTREC#'‚MOVE.L4(A4),D0GET2NDVERTICALRANGE‚BCLR.L#31,D0FOUNDIT?‚BEQ.SGETVR60BRANCHIFNO&GETVR35 MOVE.L D0,4(A4) SAVE # RECORDS„TST.LD0RECORD#0?"…BEQGETVR05BRANCHIFYES,ILLEGAL‚MOVE.L#1,D1SETFOUNDFLAG) CMP.L MAXLINE-DATASG(A5),D0 BEYOND FILE? BGT.S GETVR60 BRANCH IF YES'  RTS RETURN**‚GETSECONDVERTICALRANGE*GETVR50‚MOVE.L‚4(A4),D0‚2NDVR‡BCLR.L‚#31,D0‚FOUNDONE?"‡BEQ.S‚GETVR60„BRANCHIFNO2NDVR‡TST.LD0‚SEEIFZEROINPUT#‡BEQGETVR05BRANCHIFZERO,ILLEGAL0‡CMP.L(A4),D0SEEIF2NDVRGREATERTHAN1STVR.‡BLTGETVR05‚BRANCHIF2NDLESSTHAN1ST-ERROR‡MOVE.L‚#1,D1„SETFOUNDFLAG‡MOVE.L‚D0,4(A4)‚LASTREC#‡MOVE.L(A4),D0GETSTARTREC#‡SUB.LD0,4(A4)MAKE#RECORDS/‡CMP.B#'M',CURCMD-DATASG(A5)INMERGECOMMAND?;‡BEQ.SGETVR55BRANCHIFINMERGECOMMAND,DON'TUSEMAXLINE MOVE.L 4(A4),D0 GET # RECORDS/ CMP.L MAXLINE-DATASG(A5),D0 WITHIN FILE RANGE? BLE.S GETVR55 BRANCH IF YES- MOVE.L #-1,4(A4) FORCE MAX NUMBER OF RECORDSGETVR55‚RTSŽRETURN**‚HEREIFNO2NDVERTICALRANGE*5GETVR60‚MOVE.L‚#-1,4(A4)ƒDEFAULT#RECORDS=WHOLEFILE‰BRA.S‚GETVR55ŠRETURN†PAGE?****************************************************************6*‚GETHR‚GETHORIZONTALRANGEFROMPARAMETERBLOCKLIST/*‰ANDCONVERTTOACTUALCOLUMNNUMBERTOUSE,OR*‰USEDEFAULTSOF1-79.*‚REV1.003/6/80‚(C313)**‚ENTRY:A4=ADDRESSOF1STHRINPARABLOCK*‚EXIT:A4=UNCHANGED*ˆD1=0=GOODRETURN*ˆD1=-1=INVALIDENTRYFOUND*ˆ0(A4)=STARTCOLUMNNUMBER*ˆ4(A4)=ENDCOLUMNNUMBER*‚USES:01234567 *…D‚*R* *…AŠPP*@**************************************************************** GETHR‚EQU‚*‡CLR.W‚D1ƒCLEARRETURNFLAG‡MOVE.L‚(A4),D0„GET1STHR‡BCLR.L‚#31,D0…FOUNDONE?(‡BEQ.S‚GETHR10…BRANCHIFNO,USEDEFAULTS‡BCLR.L‚#30,D0…TABSTOPS?‡BNE.S‚GETHR40‚BRANCHIFYES%GETHR05‚CMP.L#0,D0†CANTBE0ORLESS!‡BLE.SGETHR30BRANCHIFIS,ERROR!‡CMP.L#80,D0ƒCANTBEMORETHE80!‡BGT.SGETHR30BRANCHIFIS,ERROR"‡MOVE.L‚D0,(A4)„SAVEINPARABLOCK‡MOVE.L‚4(A4),D0ƒGET2NDHR‡BCLR.L‚#31,D0…FOUNDONE?,‡BEQ.S‚GETHR20„BRANCHIFNOTONE,USEDEFAULT ‡CMP.L#0,D0CANTBELESSTHAN0!‡BLT.SGETHR30BRANCHIFIS,ERROR%‡CMP.L#80,D0CANTBEGREATERTHAN80)‡BLT.SGETHR06BRANCHIFLESSTHAN80,OK( MOVE.L #79,D0 IS 80 OR MORE, MAKE IT 79# MOVE.L D0,4(A4) SAVE IN PARA BLOCK!GETHR06 MOVE.L (A4),D2 GET 1ST HR,‡CMP.LD0,D2‚1STCANTBEGREATERTHAN2NDHR!‡BGT.SGETHR30BRANCHIFIS,ERRPR*‡MOVE.L‚D0,4(A4)ƒSAVE2NDHRINPARABLOCK ‡RTSRETURN**„HEREIFUSINGDEFAULTS*%GETHR10‚MOVE.L‚#1,(A4)„1STHRDEFAULT'GETHR20‚MOVE.L‚#79,4(A4)‚2NDHRDEFAULT ‰RTS‘RETURN**‚HEREIFANERROR* GETHR30‚MOVE.W‚#-1,D1ƒERRORFLAG ‰RTSŽRETURN*.*‚HEREIFUSINGTABSTOPSFORHORIZONTALRANGE*6GETHR40‚LEASVTABS-DATASG(A5),A6GETTABSTOPSADDRESS CLR.L D2 CLEAR FOR LATER USE3 SUB.L #1,D0 MAKE ENTRY NUMBER MATCH TAB STOP TABLE$ MOVE.B (A6,D0),D0 GET THIS TAB STOP3 MOVE.L 4(A4),D2 GET 2ND HORIZONTAL RANGE PARAMETER BCLR.L #31,D2 HAVE ONE?0 BEQ GETHR05 BRANCH IF NO,USE DEFAULT FOR 2ND HR& BCLR.L #30,D2 IS 2ND A TAB STOP ALSO?" BEQ GETHR30 BRANCH IF ISN'T,ERROR) SUB.L #1,D2 MAKE IT MATCH TAB STOP TABLE$ MOVE.B (A6,D2),D2 GET THIS TOP STOP) MOVE.L D2,4(A4) PUT INTO PARAMETER BLOCK TST.L D2 IS THIS A TAB STOP? BNE.S GETHR50 BRANCH IF YES) MOVE.L #79,4(A4) FORCE MAX COLUMN NUMBER+GETHR50 ORI.B #$80,4(A4) TURN ON FOUND FLAG/ BRA GETHR05 GO CHECK VALIDITY OF THESE NUMBERS PAGE=**************************************************************8*‚DOCHGDOTHEREQUESTEDCHANGETOTHERECORDINEDITBUF*‚ENTRY:D7=0=HAVEASTRING1*ˆD7=NEG=NULLSRTING1 *‚CALLS:FMS*‚USES:01234567*…D****ƒ****…A*****P*=************************************************************* DOCHG EQU *;„MOVE.LFMSREC(A0),SVREC-DATASG(A5)ƒSAVETHISRECORDNUMBER, LEA LISTPB-DATASG(A5),A4 PARA BLOCK ADDRESS TST.B D7 NULL STRING1?3 BMI DOCHG50 BRANCH IF YES-INSERT STRING2 IN RECORD/ ADD.L #26,A4 POINT TO START ADDRESS OF STRING2 MOVE.L 4(A4),D0 GET END ADDRESS/ CMP.L (A4),D0 END ADR LESS THAN START ADDRESS?( BLT DOCHG90 BRANCH IF YES,NULL STRING 2( MOVE.L (A4),D1 START ADDRESS OF STRING2" BCLR.L #31,D1 TURN OFF FOUND FLAG( ! BEQ DOCHGER BRANCH IF NONE,ERROR, MOVE.L D1,A2 SAVE START ADDRRESS OF STRING2' MOVE.L 4(A4),D2 END ADDRESS OF STRING2" BCLR.L #31,D2 TURN OFF FOUND FLAG! BEQ DOCHGER BRANCH IF NONE,ERROR SUB.L D1,D2 LENGTH OF STRING 2 ADD.L #1,D2 ACTUAL LENGTH0 MOVE.B D2,SPARE-DATASG(A5) SAVE STRING 2 LENGTH, SUB.L #8,A4 POINT TO STRING 1 START ADDRESS MOVE.L (A4),D0 START ADDRESS# BTST.L #31,D0 SEE IF OFF,SHOULD BE$ BNE DOCHGER BRANCH IF NOT OFF-ERROR+ MOVE.L D0,A1 SAVE START ADDRESS OF STRING1' MOVE.L 4(A4),D1 END ADDRESS OF STRING1$ BTST.L #31,D1 SEE IF OFF-SCHOULD BE BNE DOCHGER BRANCH IF ON,ERROR SUB.L D0,D1 GET STRING1 LENGTH" ADD.L #1,D1 ACTUAL STRING1 LENGTH**‚MOVESTRING2INTORECORD*H LEA EDITBUF-DATASG(A5),A1 GET START ADDRESS OF RECORD CONTAINING STRING MOVE.L A1,A3 SAVE IT CLR.L D5 CLEAR FOR USE= MOVE.B FMSCNT(A0),D5 GET BYTE COUNT OF STRING1 WITHIN RECORD( ADD.L D5,A3 ADDRESS OF START OF STRING19LEA…FMSDATA-DATASG(A5),A6STARTADDRESSOFOUTPUTBUFFER( MOVE.L #RECLNG,D6 TOTAL # BYTES TO MOVE(DOCHG10 CMP.L A1,A3 AT START OF STRING1? BEQ.S DOCHG20 BRANCH IF YES MOVE.B (A1)+,(A6)+ MOVE A BYTE SUB.L #1,D6 DECREMENT COUNT4 BNE.S DOCHG10 BRANCH IF MORE TO MOVE BEFORE STRING1% BRA DOCHGER ERROR-DIDNT FIND STRING1+DOCHG20 CMP.L D2,D6 SEE IF ROOM FOR STRING2 BGE.S DOCHG30 BRANCH IF ROOM% MOVE.L D6,D2 CHOP OFF END OF STRING21DOCHG30 MOVE.B (A2)+,(A6)+ MOVE A BYTE OF STRING2" SUB.L #1,D6 DECREMENT TOTAL COUNT$ SUB.L #1,D2 DECREMENT STRING2 COUNT- BNE.S DOCHG30 BRANCH IF MORE SRTING2 TO MOVE) ADD.L D1,A1 POINT TO BYTE BEYOND STRING1 TST.L D6 MOVED ALL OF RECORD?!BEQ‚DOCHG120BRANCHIFMOVEDALL9DOCHG40 LEA EDITBUFE-DATASG(A5),A4 GET BUFFER END ADDRESS CMP.L A4,A1 AT END OF BUFFER BEQ.S DOCHG45 BRANCH IF YES' MOVE.B (A1)+,(A6)+ MOVE REST OF RECORD" SUB.L #1,D6 DECREMENT TOTAL COUNT% BNE.S DOCHG40 BRANCH IF MORE TO MOVE0 BRA DOCHG120 GO REPLACE THIS RECORD IN THE FILE3DOCHG45 MOVE.B #BLANK,(A6)+ BLANKS TO OUTPUT BUFFER SUB.L #1,D6 DECREMENT COUNT BNE.S DOCHG45 BRANCH IF MORE BRA DOCHG120 GO REPLACE*4*‚HEREIFNULLSTRING1-INSERTSTRING2ATSTARTOFHR* DOCHG50 EQU * MOVE.L 8(A4),D3 GET START HR" SUB.L #1,D3 MAKE IT A BYTE NUMBER/ ADD.L #26,A4 POINT TO SRART ADDRESS OF STRING2( MOVE.L (A4),D1 START ADDRESS OF STRING2" BCLR.L #31,D1 TURN OFF FOUND FLAG& BEQ DOCHGER BRANCH IF NOT THERE-ERROR) MOVE.L D1,A2 SAVE STRING 2 START ADDRESS MOVE.L 4(A4),D2 END ADDRESS" BCLR.L #31,D2 TURN OFF FOUND FLAG' BEQ DOCHGER BRANCH IF NO ADDRESS-ERROR SUB.L D1,D2 STRING2 LENGTH ADD.L #1,D2 ACTUAL LENGTH0MOVE.BD2,SPARE-DATASG(A5)‚SAVESTRING2LENGTH) LEA EDITBUF-DATASG(A5),A1 RECORD ADDRESS MOVE.L A1,A3 SAVE IT2 ADD.L D3,A3 START ADDRESS OF WHERE TO PUT STRING26LEA…FMSDATA-DATASG(A5),A6WHERETOPUTUPDATEDRECORD& MOVE.L #RECLNG,D6 TOTAL RECORD LENGTH5DOCHG60 CMP.L A1,A3 AT START OF WHERE TO PUT STRING2? BEQ.S DOCHG70 BRANCH IF YES MOVE.B (A1)+,(A6)+ MOVE A BYTE! SUB.L #1,D6 DECRMENT TOTAL COUNT% BNE.S DOCHG60 BRANCH IF MORE TO MOVE* BRA DOCHGER ERROR-NO PLACE TO PUT STRING2+DOCHG70 CMP.L D2,D6 SEE IF ROOM FOR STRING2$ BLT DOCHGER BRANCH IF NO ROOM-ERROR1DOCHG75 MOVE.B (A2)+,(A6)+ MOVE A BYTE OF STRING2" SUB.L #1,D6 DECREMENT TOTAL COUNT$ SUB.L #1,D2 DECREMENT STRING2 COUNT% BNE.S DOCHG75 BRANCH IF MORE TO MOVE TST.L D6 DONE WITH WHOLE MOVE?( BEQ.S DOCHG120 BRANCH IF YES-GO REPLACE.DOCHG80 MOVE.B (A1)+,(A6)+ MOVE REST OF RECORD SUB.L #1,D6 DECREMENT COUNT% BGT.S DOCHG80 BRANCH IF MORE TO MOVE& BRA.S DOCHG120 DONE-GO REPLACE RECORD*&*‚HEREIFNULLSTRING2-DELETESTRING1* DOCHG90EQU‚*'CLR.BSPARE-DATASG(A5)‚STRING2LENGTH, SUB.L #8,A4 POINT TO STRING 1 START ADDRESS& MOVE.L (A4),D0 STRING 1 START ADDRESS&BMI.S‚DOCHGERBRANCHIFNOTOFF-ERROR MOVE.L D0,A1 SAVE IT$ MOVE.L 4(A4),D1 STRING1 END ADDRESS# BTST.L #31,D1 SEE IF OFF-SHOULD BE& BNE.S DOCHGER BRANCH IF NOT OFF-ERROR SUB.L D0,D1 GET STRING 1 LENGTH ADD.L #1,D1 ACTUAL LENGTH( ) LEA EDITBUF-DATASG(A5),A1 RECORD ADDRESS MOVE.L A1,A3 SAVE IT CLR.L D5 CLEAR FOR USE= MOVE.B FMSCNT(A0),D5 GET BYTE COUNT WITHIN RECORD OF STRING1/ ADD.L D5,A3 START ADDRESS OF STRING1 IN RECORD9LEA…FMSDATA-DATASG(A5),A6STARTADDRESSOFOUTPUTBUFFER( MOVE.L #RECLNG,D6 TOTAL # BYTES TO MOVE(DOCHG95 CMP.L A1,A3 AT START OF STRING1? BEQ.S DOCHG100 BRANCH IF YES) MOVE.B (A1)+,(A6)+ MOVE A BYTE OF RECORD" SUB.L #1,D6 DECREMENT TOTAL COUNT% BNE.S DOCHG95 BRANCH IF MORE TO MOVE' BRA.S DOCHGER ERROR-DIDNT FIND STRING1&DOCHG100 ADD.L D1,A1 BUMP PAST STRING1+ SUB.L D1,D6 DONT COUNT THESE BYTES IN MOVE@ BLE.S DOCHG110 BRANCH IF NO MORE RECORD,BLANKS TO END OF RECORD/DOCHG105 MOVE.B (A1)+,(A6)+ MOVE REST OF RECORD SUB.L #1,D6 DECREMENT COUNT& BGT.S DOCHG105 BRANCH IF MORE TO MOVE6DOCHG110 MOVE.B #BLANK,(A6)+ BLANK FILL REST OF RECORD SUB.L #1,D1 DECRMENT COUNT& BGT.S DOCHG110 BRANCH IF MORE TO MOVE*&*‚REPLACEFILERECORDWITHTHISRECORD*4DOCHG120 MOVE.L FILELINE-DATASG(A5),A1 SAVE FILELINE? MOVE.L SVREC-DATASG(A5),FILELINE-DATASG(A5) THIS RECORD NUMBER+ MOVE.B #REPLCMD,FMSCMD(A0) REPLACE COMMAND BSR FMS GO REPLACE THIS RECORD/MOVE.LA1,FILELINE-DATASG(A5)ƒRESTOREFILELINE TST.L D0 RECORD FOUND?! BNE.S DOCHGER BRANCH IF NO-ERROR RTS RETURN-DONE(DOCHGER ADD.L #4,A7 UPDATE STACK POINTER BRA CMDERR GO ASK 'WHAT?' PAGE>***************************************************************,* CKCNT CHECK COUNT SUBROUTINE. SEE IF COUNT.*‡INPUTFORCHANGECOMMANDISA.IFNO,RETURN.4*‡IFYES,SEARCHTHISRECORDFORMORESTRINGMATCHES,2*‡DOUPDATE.‚SEARCHRECORDUNTILSTRINGNOTFOUND.*>************************************************************** CKCNT‚EQU‚*( LEA LISTPB-DATASG(A5),A4 GET PARA BLOCK MOVE.B 17(A4),D0 GET COUNT CMP.B #$FF,D0 IS IT ALL? BEQ.S CKCNT10 BRANCH IF YESRTS‚RETURN,NOTALLCCKCNT10 MOVE.L REC-DATASG(A5),SVRECNT-DATASG(A5) SAVE RECORD NUMBER, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS8MOVE.LFMSREC(A0),REC-DATASG(A5)ƒUSELASTRECORDNUMBERBMOVE.BFMSCNT(A0),SVCNT-DATASG(A5)‚SAVEBYTECOUNTOFLASTSTRING@ MOVE.W RECN-DATASG(A5),SVRECN-DATASG(A5) SAVE NUMBER OF RECORDS$ MOVE.L FMSADR(A0),A2 STRING POINTER MOVE.L (A2),D2 START ADDRESS MOVE.L 4(A2),D3 END ADDRESS SUB.L D2,D3 LENGTH ADD.L #1,D3 ACTUAL LENGTH/ MOVE.B SPARE-DATASG(A5),D2 GET STRING 2 LENGTH; CMP.B D2,D3 SEE IF STRING 1 LESS THEN OR EQUAL TO STRING 2/ BGE.S CKCNT14 BRANCH IF OK,USE STRING 1 LENGTH- MOVE.B D2,D3 USE STRING 2 LENGTH,IT'S BIGGER9CKCNT14ADD.BD3,SVCNT-DATASG(A5)…NEXTSTRINGSTARTBYTE#2MOVE.BD3,SVLNG-DATASG(A5)‹SAVETHESTRINGLENGTH+MOVE.W#1,RECN-DATASG(A5)ŒFORCEONERECORD(CKCNT15 BSR DOSRCH GO SEARCH THIS RECORD TST.B FMSTAT(A0) STRING FOUND? BEQ.S CKCNT30 BRANCH IF YES? MOVE.L SVRECNT-DATASG(A5),REC-DATASG(A5) RESTORE RECORD NUMBER; MOVE.W SVRECN-DATASG(A5),RECN-DATASG(A5) RESTORE # RECORDS*CLR.BSVCNT-DATASG(A5)‚CLEARFORNEXTUSE% MOVE.B #1,COUNT-DATASG(A5) SET COUNT ‚RTS‚RETURN8CKCNT30 MOVE.B SVCNT-DATASG(A5),D0 GET LAST START BYTE # CMP.B FMSCNT(A0),D0 SAME? BLE.S CKCNT40 BRANCH IF NO-ADD.B#1,COUNT-DATASG(A5)„GETNEXTOCCURENCE BRA CKCNT15 GO LOOK AGAIN9CKCNT36ADD.B#1,COUNT-DATASG(A5)„LOOKFORNEXTOCCURENCE BRA CKCNT15 GO LOOK AGAIN1CKCNT40BSR.SCKHRƒSEEIFWITHINHORIZONTALRANGE TST.L D0 WITHIN?1 BNE.S CKCNT36 BRANCH IF NO,SEARCH TILL NOT FOUND CLR.B D7 NOT NULL STRING 1 BSR DOCHG GO DO THE CHANGE3MOVE.BFMSCNT(A0),SVCNT-DATASG(A5)„NEXTBYTECOUNT- MOVE.B SVLNG-DATASG(A5),D0 GET STRING LENGTH(ADD.BD0,SVCNT-DATASG(A5)…ADDINLENGTH$ BRA CKCNT15 GO SEARCH TIL NOT FOUND PAGE>***************************************************************0*‚CKHRCHECKSTRINGFORWITHINHORIZONTALRANGE.,*‡IFNOTWITHINHR,SEARCHFORNEXTOCCURENCE3*‡OFSTRINGUNTILSTRINGWITHINRANGEORNOTFOUND.*‚RETURND0=0=WITHINRANGE*‰D0=-1=NOTWITHINRANGE*?***************************************************************)  CKHR‚EQU‚*= MOVE.B COUNT-DATASG(A5),CNTHR-DATASG(A5) SAVE ORIGINAL COUNT2‚ADD.B#1,COUNT-DATASG(A5)ƒLOOKFORNEXTOCCURENCEA‚MOVE.WRECN-DATASG(A5),RECNHR-DATASG(A5)SAVE#RECORDSTOSEARCH)‚MOVE.W#1,RECN-DATASG(A5)„FORCE1RECORD?‚MOVE.LREC-DATASG(A5),RECHR-DATASG(A5)‚SAVETHISRECORDNUMBER8‚MOVE.LFMSREC(A0),REC-DATASG(A5)ƒUSETHISRECORDNUMBER6CKHR01‚LEALISTPB-DATASG(A5),A4GETPARABLOCKADDRESS‚MOVE.L8(A4),D0GETFIRSTHR‚MOVE.L12(A4),D1GET2NDHR‚CMP.B#1,D01STHR=1?‚BNE.SCKHR10BRANCHIFNO‚CMP.B#79,D12NDHR=80?‚BNE.SCKHR10BRANCHIFNO CKHR05 CLR.L D0 GOOD RETURN FLAG!‚BRA.S‚CKHR30‚GORESETALLVALUES4CKHR10 SUB.B #1,D0 MAKE RANGE MATCH BYTE # OF STRING.‚SUB.B#1,D1†MAKERANGEMATCHBYTE#OFSTRING6‚CMP.BFMSCNT(A0),D0RETURNBYTE#ATORBEYOND1STHR? BGT.S CKHR20 BRANCH IF NO+‡MOVE.LFMSADR(A0),A2GETPOINTERTOSTRING+ MOVE.L (A2),D2 GET START ADDRESS OF STRING* MOVE.L 4(A2),D3 GET END ADDRESS OF STRING SUB.L D2,D3 GET STRING LENGTH, MOVE.B FMSCNT(A0),D0 GET STRING BYTE NUMBERH*ˆDeletedline=ADD.LD3,D0ENDBYTEOFSTRING(alreadyhaveit)010785 CMP.L D0,D1 BEYOND END OF HR?% BGE CKHR05 BRANCH IF NO,WITHIN RANGE CKHR20‚EQU‚**‚BSR.S‚DOSRCH‚GOSEARCHFORNEXTOCCURENCE4ƒADD.B#1,COUNT-DATASG(A5)„FORNEXTSEARCH,IFNEEDEDƒTST.BFMSTAT(A0)GOODRETURN?8‚BEQ‚CKHR01BRANCHIFGOODRETURN,CHECKFORWITHINRANGE$MOVE.L#-1,D0‚NOTWITHINRANGEFLAG=CKHR30‚MOVE.BCNTHR-DATASG(A5),COUNT-DATASG(A5)‚RESTORECOUNT;‚MOVE.WRECNHR-DATASG(A5),RECN-DATASG(A5)‚RESTORE#RECORDS=‚MOVE.LRECHR-DATASG(A5),REC-DATASG(A5)„RESTORERECORDNUMBER ‚RTS‚RETURN†PAGE?****************************************************************6*DOSRCH‚SETSUPFORFMSSEARCHFORSTRINGCOMMANDAND*‰FIELDSFMSERRORRETURN* USES: 0 1 2 3 4 5 6 7*„D‚R*„A‚R‰P?*************************************************************** DOSRCH‚EQU‚*(†LEA‚FMSPKT-DATASG(A5),A0„PACKETADDRESS5†MOVE.B‚#SRCHCMD,FMSCMD(A0)ƒSEARCHFORSTRINGCOMMAND/2!7)=1†BSR‚FMS‘DOIT%†TST.L‚D0…1STRECORDTOSEARCHFOUND?†BEQ.SDOSRCHRTNBRANCHIFYES:†ADD.L#4,A7UPDATESTACKFORERROR,MESSAGEALREADYOUTPUTDOSRCHRTNRTSŠRETURN†PAGE?****************************************************************+*‚MULFIND‚OUTPUTALINEATATIMETOSCREEN*‹CONTAININGTHE'FIND'RECORD.*‚REV.1.003/10/80(C313)&*‚ENTRY:EDITBUFCONTAINSOUTPUTRECORD*‚EXIT:TOCALLER*‚USES:01234567 *…D‚*ƒ*** *…A‚**‡P'*‚CALLS:SETPROP„BLDCRT„HOMECUR†SCROLOUT*ˆSEND1†CRTOUT„SEND1?*************************************************************** MULFIND‚EQU‚*(‰TST.BSCROLL-DATASG(A5)„INSCROLLMODE?&‰BMI.SMULF30BRANCHIFINSCROLLMODE+‰MOVE.B#LINE20,D0ƒLASTVIRTUALLINENUMBER%‰BSR‚SETPROP…SETPAGEMODEPROTECTION2‰TST.B‚MULFSW-DATASG(A5)…HAVEWEBEENHEREBEFORE?‰BNE.S‚MULF10…BRANCHIFYES%‰MOVE.B#CLRSCRN,D0…CLEARSCREENCODE‰BSR‚SEND1ˆOUTPUTIT6‰MOVE.B‚#POSONE,MULFSW-DATASG(A5)…SWITCH=SCREENLINE#/MULF10‚LEA‚EDITBUF-DATASG(A5),A1…RECORDADDRESS$ˆMOVE.L‚#RECLNG,D2„MAXRECORDLENGTH/ˆMOVE.B‚MULFSW-DATASG(A5),D3…SCREENLINENUMBER& CMP.B #LINE20,D3 PAST SCREEN LINE 20?( BLE.S MULF15 BRANCH IF NOT PAST LINE 20( BSR HOMECUR PUT CURSOR AT TOP OF SCREEN. MOVE.W TDELINE-DATASG(A5),D0 DELETE LINE CODE8 BSR SEND1 DELETE TOP LINE SO NEXT OUTPUT WILL SCROLL UP2 MOVE.B #LINE20,D3 FORCE LINE 20 FOR SCREEN OUTPUT)MOVE.BD3,MULFSW-DATASG(A5)ƒSAVELINE20)MULF15‚BSR‚BLDCRT‹BUILDOUTPUTRECBUFFER*…CRT.OUT‚CRTIOS,OUTBUF,D4ƒOUTPUTTOSCREEN…BNE‚EDITERROR…ERRORRETURN#…CMP.B‚#LINE20,D3ƒPASTBOTTOMLINE? …BLE.S‚MULF20†BRANCHIFNOTPAST …RTSRETURN>MULF20‚ADD.B‚#1,MULFSW-DATASG(A5)„NEXTSCREENLINE#TOOUTPUT …RTSRETURN?MULF30MOVE.B#1,MULFSW-DATASG(A5)ƒTURNONMULTIPLEFINDSWITCH) %TST.BVERFLG-DATASG(A5)…WANTOUTPUT?( BMI.S MULF40 BRANCH IF NO OUTPUT WANTED* BSR SCROLOUT DO SCROLL MODE SCREEN OUTPUTMULF40 RTS RETURN,DONE PAGE?****************************************************************9*‚OUTFINDCRTMODE:OUTPUTPAGECONTAININGRECORDFROMFIND *‹COMMAND*ŠSCROLLMODE:OUTPUT1RECORD*‚REV1.003/10/80(C313)*‚EXIT:TOCALLER*‚USES:01234567*…D***…A‹P**‚CALLS:SETPROPƒSETPROC*ˆPUTP†WRTSCRN*ˆEOFMESSƒSCROLOUT@**************************************************************** OUTFIND‚EQU*(TST.BSCROLL-DATASG(A5)„INSCROLLMODE?& BMI.S OUTF40 BRANCH IF IN SCROLL MODE- MOVE.L FILELINE-DATASG(A5),D0 GET FILELINE #2CMP.LMAXLINE-DATASG(A5),D0‚SEEIFATENDOFFILE#BEQ.SOUTF10‚BRANCHIFENDOFFILETST.LD0ƒSEEIFTOPOFFILE# BEQ.S OUTF20 BRANCH IF TOP OF FILE*‚HEREIFFILELINEWITHINFILE#* FILELINE GOES TO WHERE PROMPT WAS CLR.L D1 CLEAR FOR USE5 MOVE.B SAVEP-DATASG(A5),D1 GET CURRENT PROMPT LINE # SUB.B #POSONE,D1 STRIP ASCII SUB.L D1,D0 NEW TOPLINE NUMBER! BMI.S OUTF15 BRANCH IF NEG,USE 0.MOVE.LD0,TOPLINE-DATASG(A5)„SAVENEWTOPLINE% BLT RANG15 BRANCH IF SMALLER - ERROR**ˆCHECKHORIZONTALRANGES*#RANG30 BCLR.L #31,D2 HAVE A 1ST HR? BEQ.S RANG50 BRANCH IF NO MOVE.B #1,D4 SET FOUND FLAG BCLR.L #30,D2 TABS SPECIFIED?! BNE.S RANG50 BRANCH IF YES, TABS BCLR #31,D3 HAVE A 2ND HR? BEQ.S RANG50 BRANCH IF NO TST.L D2 1ST CAN'T BE ZERO# BEQ RANG15 BRANCH IF ZERO, ILLEGAL29>B:J:R8Z2b5j2r4z5‚3Š9’2š5¢7ª:²6º5Â0Ê8Ò5Ú1â5ê3ò;ú8: ;89"3 CMP.L #79,D2 1ST CAN'T BE > 79 BGT RANG15 BRANCH IF >, ILLEGAL TST.L D3 2ND CAN'T BE ZERO# BEQ RANG15 BRANCH IF ZERO, ILLEGAL CMP.L #79,D3 2ND CAN'T BE > 79 BLE.S RANG40 BRANCH IF OK MOVE.L #79,D3 FORCE 79. MOVE.W D3,14(A4) SAVE IN PARAMETER BLOCK ALSO3RANG40 CMP.L D2,D3 2ND HR CAN'T BE SMALLER THAN 1ST& BLT RANG15 BRANCH IF SMALLER, ILLEGAL**ˆSAVETHEFOUNDRANGES*RANG50 TST D4 ANY FOUND?7 BEQ.S RANG60 BRANCH IF NO - GO DELETE ANY SAVED RANGES* LEA SVRANG-DATASG(A5),A2 GET SAVE ADDRESS' MOVEM.L (A4),D0-D3 GET ORIGINAL VALUES! MOVEM.L D0-D3,(A2) AND SAVE THEM3 MOVE.B #-1,RANGSW-DATASG(A5) SET RANGES FOUND FLAGRTS‚RETURN-DONE**‚DELETESETRANGESHERE*,RANG60CLR.BRANGSW-DATASG(A5)‚TURNOFFFLAG. LEA SVRANG-DATASG(A5),A2 PARA BLOCK OF RANGES MOVE.L #4,D1 # ENTRIES TO CLEAR%RANG70 CLR.L (A2)+ CLEAR SAVED VALUES SUB.L #1,D1 DECREMENT COUNT% BNE.S RANG70 BRANCH IF MORE TO CLEARRTS‚RETURN-DONE PAGE?****************************************************************;*‚DELETECOMMAND-DELETETHEREQUESTEDDATAFROMTHEFILE.*‚REV.1.004/14/80(C313)/*‚ENTRY:D1=0IFNEXTCHARININPUTBUFFER=BLANK/*ˆD1=1IFNEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA+*‚EXIT:GOODRETURN-MAINƒERRORRETURN-CMDERR*‚USES:01234567 *…D***‡**…A*****P.*‚CALLS:PROCLIST‚GETVR„GETHR…FMS„DODEL„SCROLRD+*ˆCNVTHA„OUTFIND‚WRTMESSƒSEND1‚HOMECUR‚P* UTP@**************************************************************** DELETE‚EQU‚*)TST.BFILEOPT-DATASG(A5)‚USINGKOPTION?1 BNE EXTND01 BRANCH IF YES,CANNOT DO THIS COMMAND+ TST.L MAXLINE-DATASG(A5) ANY FILE RECORDS?0 BMI CHG03 BRANCH IF NONE,CANNOT DO THIS COMMAND' LEA DELL-DATASG(A5),A4 LIST TO PROCESS BSR PROCLIST GO PROCESS IT) LEA LISTPB-DATASG(A5),A4 RETURNED VALUES! BSR GETVR GO GET VERTICAL RANGES TST.W D1 FOUND ANY?5 BEQ.S DELE20 BRANCH IF FOUND ONLY 1ST,CHANGE DEFAULT* BPL.S DEL30 BRANCH IF FOUND BOTH-USE THEM5 MOVE.L FILELINE-DATASG(A5),(A4) DEFAULT=CURRENT LINE'DELE20 MOVE.L #1,4(A4) DEFAULT=1 RECORD,DEL30 ADD.L #8,A4 POINT TO HORIZONTAL RANGES BSR GETHR GET THEM TST.W D1 GOOD RETURN? DEL40BNEƒCMDERRBRANCHIFERROR*7*‚SEEIFDELETINGENTIRELINE-ALSOUSEDBYMOVECOMMAND* CMP.L #1,(A4) 1ST HR=1?0BNEƒDEL60BRANCHIFNO,NOTDELETINGENTIRELINE CMP.L #79,4(A4) 2ND=79?BNEƒDEL60BRANCHIFNO**‚HEREIFDELETINGENTIRELINE*9DEL41„LEALISTPB-DATASG(A5),A4RESTOREPARABLOCKADDRESS* BSR DODEL GO DELETE THE RECORDS REQUESTED MOVE.L D1,D0 # RECORDS DELETED: LEA DELNO-DATASG(A5),A3 # RECORDS DELETED MESSAGE ADDRESS BSR CNVTHA CONVERT # TO ASCII3 TST.L MAXLINE-DATASG(A5) DELETED ALL FILE RECORDS?5 BGE.S DEL50 BRANCH IF DIDN'T,STILL HAVE SOME RECORDS*"*‚HEREIFDELETEDALLFILERECORDS*-CLR.LFILELINE-DATASG(A5)‚SETRECORD#TONEW4CLR.LTOPLINE-DATASG(A5)ƒSETTOPSCREENLINETONEW5MOVE.B#-1,EMTYFILE-DATASG(A5)‚SETFILETOOLDEMPTY.MOVE.B#1,FILETYPE-DATASG(A5)ƒSETFILETONEW7MOVE.L#-1,MAXLINE-DATASG(A5)ƒRESETMAXCOUNTTOEMPTY/CLR.BFSTSW-DATASG(A5)ŠRESETFIRSTTIMESWITCH(TST.BSCROLL-DATASG(A5)„INSCROLLMODE?% BMI.S DEL45 BRANCH IF IN SCROLL MODE! MOVE.B #CLRSCRN,D0 CLEAR LINE 21 BSR SEND1 DO IT0MOVE.B#1,CURMODE-DATASG(A5)‚SETPAGEMODEFLAG" MOVE.B #LINE20,D0 NEW BOTTOM LINE BSR SETPROP SET PAGE MODE$ MOVE.B #CLRSCRN,D0 CLEAR LINES 1-20 BSR SEND1 DO IT BSR HOMECUR HOME THE CURSOR# MOVE.B #POSONE,D0 PROMPT TO LINE 1 BSR PUTP DO IT7DEL45 LEA DELNO-DATASG(A5),A0 # RECORDS DELETED MESSAGE MOVE.L #26,D0 MESSAGE LENGTH-BRA.SDEL67ƒOUTPUT#RECORDSDELETEDMESSAGE-DEL50TST.BSCROLL-DATASG(A5)ƒINSCROLLMODE? BEQ.S DEL55 BRANCH IF NO*"*ˆINSCROLLMODE,READNEWFILELINE* MOVE.L #1,D6 READ 1 RECORD4 MOVE.L FILELINE-DATASG(A5),D1 RECORD NUMBER TO READ BSR SCROLRD GO READ IT%DEL55 BSR OUTFIND REOUTPUT THE SCREEN+ BRA DEL45 OUTPUT # RECORDS DELETED MESSAGE*.*‚HEREIFDELETINGHORIZONTALRANGEPERRECORD**‚READRECORD,DODELETE,REPLACETHERECORD* DEL60‚EQU*4 LEA LISTPB-DATASG(A5),A3 RESTORE PARA BLOCK ADDRESS1DEL65 LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS& MOVE.B #RDCMD,FMSCMD(A0) READ COMMAND MOVE.L (A3),D1 RECORD # TO READ MOVE.L #1,D6 READ 1 RECORD BSR FMS DO THE READ TST.L D0 RECORD FOUND? BEQ.S DEL70 BRANCH IF FOUND2 BMI.S DEL68 BRANCH IF USING K OPTION,CAN'T DELETE:LEA‚FMSG100-DATASG(A5),A0OUTPUTRECORDNOTFOUNDMESSAGE MOVE.L #18,D0 MESSAGE LENGTH$DEL67 BSR WRTMESS OUTPUT THE MESSAGEDEL68 RTS RETURN-DONE*DEL70 MOVE.L 8(A3),D1 1ST HORIZONTAL RANGE SUB.L #1,D1 START BYTE NUMBER MOVE.L 12(A3),D2 2ND HR SUB.L D1,D2 # BYTES TO DELETE& MOVE.L #RECLNG,D3 TOTAL RECORD LENGTH) LEA EDITBUF-DATASG(A5),A4 RECORD ADDRESS MOVE.L A4,A2 SAVE IT0LEA‚FMSDATA-DATASG(A5),A6OUTPUTBUFFERADDRESS- ADD.L D1,A2 START ADDRESS OF 1ST DELETE BYTE!DEL80 CMP.L A4,A2 AT DELETE BYTE? BEQ.S DEL90 BRANCH IF YES: MOVE.B (A4)+,(A6)+ MOVE A BYTE OF RECORD TO OUTPUT BUFFER" SUB.L #1,D3 DECREMENT TOTAL COUNT BNE.S DEL80 BRANCH IF MORE< BRA CMDERR ERROR-NO MORE RECORD & DID'T FIND BYTE TO DELETE+DEL90 ADD.L D2,A4 BUMP PAST BYTES TO DELETE, SUB.L D2,D3 DON'T COUNT THESE BYTES IN MOVE( BEQ.S DEL110 BRANCH IF AT END OF RECORD>DEL100 MOVE.B (A4)+,(A6)+ MOVE REST OF RECORD TO OUTBUT BUFFER SUB.L #1,D3 DECREMENT COUNT$ BNE.S DEL100 BRANCH IF MORE TO MOVE4DEL110 MOVE.B #BLANK,(A6)+ BLANK FILL REST OF RECORD SUB.L #1,D2 D+ ECREMENT COUNT& BNE.S DEL110 BRANCH UNTIL RECORD FULL*"*‚REPLACEUPDATEDRECORDINTOFILE*4MOVE.L(A3),FILELINE-DATASG(A5)†RECORD#TOREPLACE+ MOVE.B #REPLCMD,FMSCMD(A0) REPLACE COMMAND BSR FMS DO THE REPLACE TST.L D0 GOOD REPLACE? BNE DEL40 BRANCH IF NO-ERROR(TST.BSCROLL-DATASG(A5)ƒINSCROLLMODE? BPL.S DEL114 BRANCH IF NO- MOVE.L #1,D6 IN SCROLL MODE,READ THIS RECORD- MOVE.L FILELINE-DATASG(A5),D1 RECORD TO READ BSR SCROLRD GO READ IT TST.L D0 GOOD RETURN?& BGT.S DEL125 BRANCH IF ERROR RETURNED# BMI DEL68 BRANCH IF USING K OPTION, BSR OUTFIND GO OUTPUT THIS RECORD TO SCREEN+DEL114‚MOVE.L4(A3),D0MORERECORDSTOFIX?) BMI.S DEL130 BRANCH IF DOING ENTIRE FILE, SUB.L #1,D0 DECREMENT # RECORDS TO DO COUNT. BEQ.S DEL120 BRANCH IF NO MORE-REWRITE SCREEN& MOVE.L D0,4(A3) STORE # RECORDS TO DO)DEL115 ADD.L #1,(A3) BUMP TO NEXT RECORD#!TST.BBRKFLG-DATASG(A5)‚ABREAK?) BMI.S DEL120 BRANCH IF YES,STOP DELETING BRA DEL65 GO GET NEXT RECORD6DEL120 LEA FMSPKT-DATASG(A5),A0 GET FMS PACKET ADDRESS3 MOVE.L FMSREC(A0),FILELINE-DATASG(A5) NEW FILELINE(TST.BSCROLL-DATASG(A5)ƒINSCROLLMODE?2 BMI.S DEL125 BRANCH IF YES,RECORDS ALREADY OUTPUT BSR OUTFIND REWRITE SCREENDEL125 RTS RETURN-DONE9DEL130 MOVE.L MAXLINE-DATASG(A5),D1 GET # RECORDS IN FILE- CMP.L FILELINE-DATASG(A5),D1 AT END OF FILE? BLE.S DEL120 BRANCH IF AT END BRA.S DEL115 MORE TO DO PAGE=**************************************************************4*‚EXTENDCOMMAND-INSERTDATAATTHEENDOFRECORDS*‚REV.1.004/16/80(C313)2*‚ENTRY:D1=0IFNEXTCHARININPUTBUFFERISBLANK2*ˆD1=1IFNEXTCHARININPUTBUFFERISENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA+*‚EXIT:GOODRETURN-MAIN‚ERRORRETURN-CMDERR*‚USES:01234567 *…D****…**…A*****P*:*‚CALLS:PROCLIST‚GETVR‚FMS‚WRTMESS‚OUTFINDSVEXTNDSCROLRDA***************************************************************** EXTEND‚EQU‚*) TST.B FILEOPT-DATASG(A5) USING K OPTION?3 BNE.S EXTND01 BRANCH IF YES,CANNOT DO THIS COMMAND+TST.LMAXLINE-DATASG(A5)‚ANYFILERECORDS?0 BMI CHG03 BRANCH IF NONE,CANNOT DO THIS COMMAND+ BRA.S EXTND05 CONTINUE WITH EXTEND COMMAND0EXTND01 LEA FMSG640-DATASG(A5),A0 USING K OPTION MOVE.L #14,D0 MESSAGE LENGTH BSR WRTMESS OUTPUT MESSAGE' RTS RETURN,CAN'T DO THIS WITH K OPTION EXTND05 TST.L D1 ANY PARAMETERS? BEQ.S EXTND20 BRANCH IF YES,OK-EXTND10 BRA CMDERR ERROR RETURN-NEED A STRING/EXTND20 LEA EXTNL-DATASG(A5),A4 LIST TO PROCESS BSR PROCLIST GO PROCESS INPUT) LEA LISTPB-DATASG(A5),A4 RETURNED VALUES BSR GETVR GET VERTICAL RANGES TST.W D1 CHECK RETURNED VALUES9 BEQ.S EXTND30 BRANCH IF FOUND ONLY 1ST VR-CHANGE DEFAULT, BPL.S EXTND40 BRANCH IF FOUND BOTH-USE THEM: MOVE.L FILELINE-DATASG(A5),(A4) USE CURRENT FILE POSITION+EXTND30 MOVE.L #1,4(A4) FORCE 1 RECORD READ8EXTND40 MOVE.L (A4),REC-DATASG(A5) RECORD NUMBER TO READ/MOVE.W6(A4),RECN-DATASG(A5)‚#RECORDSTOREAD) MOVE.L 8(A4),D0 GET STRING START ADDRESS BCLR.L #31,D0 CLEAR FOUND FLAG& BEQ EXTND10 BRANCH IF NO STRING-ERROR+ MOVE.L D0,8(A4) STORE BACK INTO PARA BLOCK( MOVE.L 12(A4),D1 GET END STRING ADDRESS BCLR.L #31,D1 CLEAR FOUND FLAG# BEQ EXTND10 BRANCH IF NO END,ERROR, MOVE.L D1,12(A4) STORE BACK INTO PARA BLOCK! CMP.L D0,D1 SEE IF HAVE A STRING/ BLT EXTND10 BRANCH IF NO STRING CONTENTS-ERROR* CMP.W #1,RECN-DATASG(A5) ONE RECORD ONLY? BEQ.S EXTND50 BRANCH IF YES BSR SVEXTND GO SAVE THE STRING**‚READTHERECORD*8EXTND50 CLR.W FINDSW-DATASG(A5) CLEAR FIND RECORD SWITCH3EXTND60 LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS& MOVE.B #RDCMD,FMSCMD(A0) READ COMMAND* MOVE.L REC-DATASG(A5),D1 RECORD # TO READ MOVE.L #1,D6 READ 1 RECORD BSR FMS READ THE RECORD TST.L D0 FOUND IT? BEQ.S EXTND70 BRANCH IF FOUNDAEXTND65 LEA FMSG100-DATASG(A5),A0 OUTPUT RECORD NOT FOUND MESSAGE MOVE.L #18,D0 MESSAGE LENGTH BSR WRTMESS OUTPUT TO+  SCREEN RTS‚RETURN*(*‚UPDATEFILERECORD-RECORDINEDITBUF*AEXTND70 MOVE.L REC-DATASG(A5),SVREC-DATASG(A5) SAVE THIS RECORD #, LEA LISTPB-DATASG(A5),A6 PARA BLOCK ADDRESS- ADD.L #8,A6 POINT TO START ADDRESS OF STRING. MOVE.L (A6),D1 ACTUAL START ADDRESS OF STRING MOVE.L (A6),A2 SAVE IT MOVE.L 4(A6),D2 END ADDRESS SUB.L D1,D2 STRING LENGTH! ADD.L #1,D2 ACTUAL STRING LENGTH) LEA EDITBUF-DATASG(A5),A1 RECORD ADDRESS MOVE.L A1,A3 SAVE IT0 LEA FMSDATA-DATASG(A5),A6 OUTPUT BUFFER ADDRESS$ MOVE.L #RECLNG,D3 MAX RECORD LENGTH' ADD.L #RECLNG,A3 END OF CURRENT RECORD2EXTND80 CMP.B #' ',-(A3) LOOK PAST TRAILING BLANKS$ BNE.S EXTND90 BRANCH IF NOT A BLANK SUB.L #1,D3 COUNT THIS BYTE CMP.L A1,A3 AT TOP OF RECORD?* BGT.S EXTND80 BRANCH IF NO,LOOK SOME MORE+ MOVE.L A1,A3 PUT STRING AT START OF RECORD* BRA.S EXTND100 GO MOVE STRING INTO RECORD9EXTND90 ADD.L #1,A3 RESTORE POINTER TO 1ST TRAILING BLANK:EXTND100 ADD.L D2,D3 BYTE COUNT OF REMAINING RECORD+STRING/ CMP.L #RECLNG,D3 SEE IF BIGGER THAN MAX LENGTH! BLE.S EXTND110 BRANCH IF SIZE OK! SUB.L #RECLNG,D3 # BYTES TOO BIG SUB.L D3,D2 # OF BYTES TO MOVE< BEQ EXTND115 NOTHING TO MOVE, RECORD IS ALREADY FULL 0103851EXTND110 MOVE.B (A2)+,(A3)+ MOVE STRING TO RECORD SUB.L #1,D2 DECREMENT COUNT0 BNE.S EXTND110 BRANCH UNTIL ALL OF STRING MOVED4EXTND115MOVE.L#RECLNG,D1#BYTESPERRECORD‚0103851EXTND120 MOVE.B (A1)+,(A6)+ MOVE TO OUTPUT BUFFER SUB.L #1,D1 DECREMENT COUNT BNE.S EXTND120 MOVE TIL DONE**‚REPLACEFILERECORD*, MOVE.L FILELINE-DATASG(A5),A1 SAVE FILELINEL MOVE.L SVREC-DATASG(A5),FILELINE-DATASG(A5) THIS IS THE RECORD # TO REPLACE+ MOVE.B #REPLCMD,FMSCMD(A0) REPLACE COMMAND BSR FMS DO THE REPLACE/MOVE.LA1,FILELINE-DATASG(A5)…RESTOREFILELINE TST.L D0 GOOD RETURN? BNE EXTND10 BRANCH IF ERROR(TST.BSCROLL-DATASG(A5)ƒINSCROLLMODE? BPL.S EXTND125 BRANCH IF NO+ MOVE.L #1,D6 IN SCROLL MODE ,READ 1 RECORD* MOVE.L SVREC-DATASG(A5),D1 RECORD TO READ BSR SCROLRD READ IT TST.L D0 GOOD RETURN? BNE.S EXTND135 BRANCH IF ERROR$ BSR OUTFIND OUTPUT RECORD TO SCREEN5EXTND125 ADD.W #1,FINDSW-DATASG(A5) COUNT THIS RECORD3SUB.W#1,RECN-DATASG(A5)‚DECREMENT#RECORDSTODO' BEQ.S EXTND130 BRANCH IF NO MORE TO DO!TST.BBRKFLG-DATASG(A5)‚ABREAK?, BMI.S EXTND130 BRANCH IF YES,DONE EXTENDING3ADD.L#1,REC-DATASG(A5)‚POINTTONEXTRECORDTODO MOVE.L REC-DATASG(A5),D0 GET IT& CMP.L MAXLINE-DATASG(A5),D0 PAST EOF?) BLE EXTND60 BRANCH IF NOT AT END,DO MORE*!*‚DONEWITHEXTEND-REWRITESCREEN*=EXTND130TST.WFINDSW-DATASG(A5)‚FOUNDANYRECORDSTOCHANGE? BEQ EXTND65 BRANCH IF NOJ MOVE.L SVREC-DATASG(A5),FILELINE-DATASG(A5) FILELINE=LAST RECORD# CHANGED(TST.BSCROLL-DATASG(A5)‚INSCROLLMODE?3 BMI.S EXTND135 BRANCH IF YES,RECORD ALREADY OUTPUT6 BSR OUTFIND OUTPUT PAGE CONTAINING FILELINE TO SCREEN-CLR.WFINDSW-DATASG(A5)ƒCLEARRECORDCOUNTEREXTND135RTS‚RETURN-DONE**‚SAVESTRINGHERE* SVEXTNDEQU‚*/ LEA EXTNDSTG-DATASG(A5),A0 SAVE STRING ADDRESS( MOVE.L 12(A4),A3 GET END STRING ADDRESS' ADD.L #1,A3 POINT TO 1 BYTE BEYOND END( MOVE.L 8(A4),A6 START ADDRESS OF STRING0SVEXT10 MOVE.B (A6)+,(A0)+ MOVE A BYTE OF STRING CMP.L A6,A3 AT END OF STRING? BNE.S SVEXT10 BRANCH IF NO2 LEA EXTNDSTG-DATASG(A5),A3 RESTORE STRING ADDRESS5 MOVE.L A3,8(A4) SAVE NEW START ADDRESS IN PARA BLOCK, SUB.L #1,A0 POINT TO NEW STRING END ADDRESS MOVE.L A0,12(A4) SAVE IT ALSO RTS RETURN TO CALLER PAGE@****************************************************************D*‚ADUPLCTAPPENDDUPLICATECOMMANDROUTINE-APPENDTHEREQUESTEDDATA*ŠINTOTHEEXTRACTBUFFER.;*‚DUPLCTDUPLICATECOMMANDROUTINE.COPYTHEREQUESTEDDATAE*‰INTOTHEEXTRACTBUFFERAFTERDELETINGANYEXISTINGEXTRACTBUFFER.*‚REV.1.004/10/80(C313),*‚ENTRY:D1=0=NEXTCHARININPUTBUFFER=BLANK,*ˆD1=1=NEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5, =BASEADDRESSOFDATA+*‚EXIT:GOODRETURN-MAIN‚ERRORRETURN-CMDERR*‚USES:01234567*…D** *…Aƒ****P*‚CALLS:PROCLIST„GETVR„FMS?***************************************************************AADUPLCTMOVE.B#-1,COUNT-DATASG(A5)‚SETAPPENDANDDUPLICATEMODE" BRA.S DUP05 USE DUPLICATE COMMAND DUPLCTEQU‚*4 CLR.B COUNT-DATASG(A5) SET DUPLICATE WITHOUT APPEND.DUP05TST.BFILEOPT-DATASG(A5)ƒUSINGKOPTION?1 BNE EXTND01 BRANCH IF YES,CANNOT DO THIS COMMAND+TST.LMAXLINE-DATASG(A5)‚ANYFILERECORDS?0 BMI CHG03 BRANCH IF NONE,CANNOT DO THIS COMMAND' LEA DUPL-DATASG(A5),A4 LIST TO PROCESS BSR PROCLIST GO PROCESS IT2 LEA LISTPB-DATASG(A5),A4 RETURNED PARAMETER BLOCK BSR GETVR GET VERTICAL RANGES TST.W D1 CHECK RTURN TYPES! BGT.S DUP20 BRANCH IF FOUND BOTH% BEQ.S DUP10 BRANCH IF FOUND JUST 1ST4 MOVE.L FILELINE-DATASG(A5),(A4) USE CURRENT RECORD#%DUP10 MOVE.L #1,4(A4) ONE RECORD ONLY,DUP20 MOVE.L (A4),D0 GET START RECORD NUMBER BEQ.S DUP30 BRANCH IF 0,OK! BMI.S DUPER BRANCH IF NEG.,ERROR1 CMP.L MAXLINE-DATASG(A5),D0 CAN'T BE BEYOND FILE BGT.S DUPER BRANCH IF IS,ERROR5DUP30 LEA SVEXT-DATASG(A5),A2 SAVE PARA BLOCK ADDRESS% MOVE.L (A4),(A2) SAVE START RECORD #" MOVE.L 4(A4),4(A2) SAVE # RECORDS, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS9 MOVE.B #MOVCMD,FMSCMD(A0) MOVE TO EXTRACT BUFFER COMMAND BSR FMS DO IT TST.L D0 GOOD RETURN? BNE.S DUP40 BRANCH IF NO,RETURN% ORI.B #$80,(A2) TURN ON EXTRACT FLAG,DUP40TST.BCOUNT-DATASG(A5)‚INAPPENDMODE?%†BEQ.SDUP50BRANCHIFINAPPENDMODE.†ORI.B#$80,(A2)STILLHAVETHEEXTRACTBUFFERDUP50 RTS RETURNDUPER BRA CMDERR ERROR RETURN PAGE=**************************************************************?*‚MERGECOMMANDROUTINE.MERGEANEXISTINGFILEINTOTHISFILE.*‚REV.1.005/1/580(C313),*‚ENTRY:D1=0=NEXTCHARININPUTBUFFER=BLANK,*ˆD1=1=NEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA+*‚EXIT:GOODRETURN-MAIN‚ERRORRETURN-CMDERR*‚USES:01234567*…D** *…A**ƒ**P**‚CALLS:PROCLISTGETVRFMSOUTFINDWRTMESSF********************************************************************** MERGE‚EQU*)TST.BFILEOPT-DATASG(A5)ƒUSINGKOPTION?1 BNE EXTND01 BRANCH IF YES,CANNOT DO THIS COMMAND+TST.LMAXLINE-DATASG(A5)ƒANYFILERECORDS?0 BMI CHG03 BRANCH IF NONE,CANNOT DO THIS COMMAND TST.L D1 ANY PARAMETERS?' BNE CMDERR NO,ERROR-MUST HAVE FILENAME( LEA MERGL-DATASG(A5),A4 LIST TO PROCESS BSR PROCLIST GO PROCESS IT2 LEA LISTPB-DATASG(A5),A4 RETURNED PARAMETER BLOCK6MOVE.B#'M',CURCMD-DATASG(A5)ƒSETDOINGMERGECOMMAND BSR GETVR GET VERTICAL RANGES+CLR.BCURCMD-DATASG(A5)ˆCLEARCOMMANDFLAG4MOVE.L(A4),REC-DATASG(A5)…SAVESTARTRECORDNUMBER,MOVE.W6(A4),RECN-DATASG(A5)ƒSAVE#RECORDS. ADD.L #8,A4 POINT TO START ADDRSS OF FILENAME* MOVE.L (A4),D0 GET FILENAME START ADDRESS BCLR.L #31,D0 HAVE ONE?$MERG10 BEQ CMDERR BRANCH IF NO,ERROR) MOVE.L 4(A4),D0 GET FILENAME END ADDRESS BCLR.L #31,D0 HAVE ONE? BEQ.S MERG10 BRANCH IF NO,ERROR**‚CALLFMSTODOTHEMERGE*,TST.BMSLUN-DATASG(A5)‚HAVEALUNFORTHIS? BMI.S MERG30 BRANCH IF NO LUN, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS( MOVE.B #MRGCMD,FMSCMD(A0) MERGE COMMAND BSR FMS GO DO THE MERGE7 BNE.S MERG20 BRANCH IF ERROR RETURN-MESSAGE WAS OUTPUT3MOVE.LFMSADR(A0),FILELINE-DATASG(A5)…NEWRECORD#3MOVE.LFMSREC(A0),MAXLINE-DATASG(A5)†NEW#RECORDS BSR OUTFIND REWRITE THE SCREENMERG20 RTS RETURN,DONE4MERG30 LEA NOLUN-DATASG(A5),A0 OUTPUT NO LUN MESSAGE MOVE.L #30,D0 MESSAGE LENGTH BSR WRTMESS OUTPUT THE MESSAGE RTS RETURN PAGE?****************************************************************C*‚AMOVECOMMANDROUTINE.APPENDTHEREQUESTEDDATAINTOTHEEXTRACTA*‡BUFFERANDDELETETHEREQUESTEDDATAFROMTHECURRENTPOSITION.=*‡IFANYDATAWON'TFITINTHEEXTRACTBUFFER,THERECORDSARE(*‡NOTDELETEDFROMTHECURRENTPOSITION.@*‚MOVEC, OMMANDROUTINE.COPYTHEREQUESTEDDATAINTOTHEEXTRACT7*‡BUFFERANDDELETETHEREQUESTEDDATAFROMTHECURRENT9*‡POSITION.‚USESPARTOFDELETECOMMANDCODE.THEEXTRACT$*‡BUFFERISDELETEDBEFORETHEMOVE.*‚REV.1.00‚4/10/80‚(C313),*‚ENTRY:D1=0=NEXTCHARININPUTBUFFER=BLANK,*ˆD1=1=NEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA+*‚EXIT:GOODRETURN-MAIN‚ERRORRETURN-CMDERR*‚USES:01234567 *…D****…A*****P-*‚CALLS:PROCLIST„GETHR„CNVTHA„OUTFIND„WRTMESS *ˆFMS‰DODEL>**************************************************************9AMOVEMOVE.B#-1,COUNT-DATASG(A5)‚SETAPPENDMOVECOMMAND& BRA.S MOVE10 USE MOVE COMMAND ROUTINE MOVE‚EQU‚*(CLR.BCOUNT-DATASG(A5)‡SETMOVECOMMAND/MOVE10ƒTST.BFILEOPT-DATASG(A5)„USINGKOPTION?1 BNE EXTND01 BRANCH IF YES,CANNOT DO THIS COMMAND+TST.LMAXLINE-DATASG(A5)…ANYFILERECORDS?0 BMI CHG03 BRANCH IF NONE,CANNOT DO THIS COMMAND( LEA MOVEL-DATASG(A5),A4 LIST TO PROCESS" BSR PROCLIST GO PROCESS THIS LIST2 LEA LISTPB-DATASG(A5),A4 RETURNED PARAMETER BLOCK BSR GETVR GO GET VERTICAL RANGE TST.W D1 CHECK RETURN TYPES+ BGT.S MOVE30 BRANCH IF FOUND BOTH-USE THEM4 BEQ.S MOVE20 BRANCH IF FOUND JUST 1ST-MAKE # RECS=19 MOVE.L FILELINE-DATASG(A5),(A4) USE FILELINE AS RECORD #MOVE20 MOVE.L #1,4(A4) 1 RECORD**‚SEEIFVALIDRECORD#*(MOVE30 MOVE.L (A4),D0 GET START RECORD # BEQ.S MOVE40 BRANCH IF 0,OK" BMI.S MOVER BRANCH IF MINUS,ERROR1 CMP.L MAXLINE-DATASG(A5),D0 CAN'T BE BEYOND FILE BGT.S MOVER BRANCH IF IS,ERROR**‚SAVEVALUESINEXTRACTBUFFER*5MOVE40 LEA SVEXT-DATASG(A5),A2 BUFFER POINTER ADDRESS MOVE.L (A4),(A2) SAVE RECORD #" MOVE.L 4(A4),4(A2) SAVE # RECORDS, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS' MOVE.B #MOVCMD,FMSCMD(A0) MOVE COMMAND) BSR FMS GO DO THE MOVE TO EXTRACT BUFFER TST.L D0 GOOD RETURN?3 BNE.S MOVE50 BRANCH IF NO,ERROR MESSAGE WAS OUTPUT2 ORI.B #$80,(A2) TURN ON SAVED EXTRACT BUFFER FLAG*(*‚DELETEFILERECORDSANDREWRITESCREEN*; BRA DEL41 GO USE DELETE COMMAND CODE TO DELETE AND REWRITE/MOVE50TST.BCOUNT-DATASG(A5)„MOVEWITHAPPEND? BEQ.S MOVE60 BRANCH IF NO; ORI.B #$80,(A2) APPEND OPTION,STILL HAVE AN EXTRACT BUFFERMOVE60 RTS RETURN,DONE&MOVER BRA CMDERR ERROR RETURN-ASK WHAT PAGE:***********************************************************5*‚PRINTCOMMMANDROUTINE.PRINTTHEREQUESTEDDATATO*ˆTHELINEPRINTER.*‚REV.1.00‚5/1/80‚(C313);*‚REV.2.00‚4/1/81‚(C313)ADDEDDEVICESPECIFICATIONOPTION,*‚ENTRY:D1=0=NEXTCHARININPUTBUFFER=BLANK,*ˆD1=1=NEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA+*‚EXIT:GOODRETURN-MAIN‚ERRORRETURN-CMDERR*‚USES:01234567*…D* *…A*…**P)*‚CALLS:PROCLIST„CKRANG„GETVR„FMS„WRTMESS:********************************************************** PRINTEQU‚*+TST.LMAXLINE-DATASG(A5)ƒANYFILERECORDS?0 BMI CHG03 BRANCH IF NONE,CANNOT DO THIS COMMAND( LEA PRNTL-DATASG(A5),A4 LIST TO PROCESS BSR PROCLIST PROCESS IT2 LEA LISTPB-DATASG(A5),A4 RETURNED PARAMETER BLOCK0TST.BRANGSW-DATASG(A5)…ANYDEFAULTRANGESSET? BEQ.S PRNT10 BRANCH IF NO7MOVE.B#-1,NOHR-DATASG(A5)…DON'TGETHORIZONTALRANGES) BSR CKRANG GO SEE IF WANT DEFAULT RANGES/CLR.BNOHR-DATASG(A5)ˆCLEARFOROTHERCOMMANDS$PRNT10 BSR GETVR GET VERTICAL RANGES/MOVE.L(A4),REC-DATASG(A5)„STARTRECORDNUMBER/ MOVE.L MAXLINE-DATASG(A5),D0 # RECORDS IN FILE* CMP.L REC-DATASG(A5),D0 PAST END OF FILE?# BGE.S PRNT30 BRANCH IF NOT PAST,OK*PRNT20 BRA CMDERR ERROR-RECORD BEYOND FILE7PRNT30MOVE.W6(A4),RECN-DATASG(A5)„#RECORDSTOOUTPUT' ADD.L #8,A4 POINT TO DEVICE NAME FIELD4 LEA RADR-DATASG(A5),A3 SAVE ADDRESS FOR DEVICE NAME*MOVE.L#'PR‚',(A3)SETFORDEFAULTDEVICE/ MOVE.L (A4),D0 GET DEVICE ADDRESS,IF SPECIFIED BCLR.L #31,D0 ONE SPECIFIED?& BEQ.S PRNT38 BRANCH IF NO,USE DEFAULT+MOVE.L#'„',(A3)SETDEVICENAM- ETOBLANKS' MOVE.L D0,A0 GET START ADDRESS OF NAME MOVE.L 4(A4),D0 GET END ADDRESS# BCLR.L #31,D0 HAVE AN END ADDRESS? BEQ PRNT20 BRANCH IF NO,ERROR! MOVE.L D0,A2 GET THE END ADDRESS SUB.L A0,A2 GET THE LENGTH ADD.L #1,A2 ACTUAL LENGTH% MOVE.L A2,D0 NEED IN A DATA REGISTER# BLE.S PRNT20 ERROR IF ZERO OR LESS* CMP.L #2,D0 MUST BE AT LEAST 2 CHARACTERS" BLT.S PRNT20 BRANCH IF LESS,ERROR, CMP.L #4,D0 CAN'T BE MORE THAN 4 CHARACTERS BGT.S PRNT20 ERROR IF >4$PRNT32 MOVE.B (A0)+,(A3)+ GET A BYTE SUB.L #1,D0 DECREMENT LENGTH BNE.S PRNT32 BRANCH IF MORE3 LEA RADR-DATASG(A5),A3 RESTORE DEVICE NAME ADDRESS MOVE.L #4,D1 LENGTH PRNT34 MOVE.B (A3),D0 GET A BYTE CMP.B #'a',D0 LOWER CASE? BLT.S PRNT36 BRANCH IF NO CMP.B #'z',D0 LOWER CASE? BGT.S PRNT36 BRANCH IF NO, BCLR.L #5,D0 IS LOWER CASE,FORCE UPPER CASE*PRNT36 MOVE.B D0,(A3)+ RESTORE DEVICE NAME SUB.L #1,D1 DECREMENT COUNTER+ BNE.S PRNT34 BRANCH IF MORE BYTES TO CHECK(PRNT38 ADD.L #8,A4 POINT TO SPACING CHAR CLR.L D0 CLEAR FOR USE MOVE.B (A4),D0 GET SPACING CHAR BCLR.L #7,D0 HAVE ONE? BNE.S PRNT40 BRANCH IF YES$ MOVE.B #0,(A4) NO SPACING 0=DEFAULT" BRA.S PRNT60 GO PRINT THE RECORDS$PRNT40 BCLR.L #5,D0 FORCE UPPER CASE CMP.B #'D',D0 DOUBLE SPACING? BNE.S PRNT50 BRANCH IF NO MOVE.B #1,(A4) 1=DOUBLE SPACING" BRA.S PRNT60 GO PRINT THE RECORDS$PRNT50 CMP.B #'T',D0 TRIPLE SPACING?BNEƒPRNT20BRANCHIFNO,ERROR MOVE.B #2,(A4) 2=TRIPLE SPACING8PRNT60MOVE.B(A4),COUNT-DATASG(A5)„COUNT=SPACINGNUMBER;MOVE.B#'P',CURCMD-DATASG(A5)‰SETPRINTASCURRENTCOMMAND, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS) MOVE.B #PRNTCMD,FMSCMD(A0) PRINT COMMAND BSR FMS GO DO THE PRINTING,CLR.BCURCMD-DATASG(A5)CLEARTHISCOMMMAND2 TST.B FMSBRK(A0) WAS PRINT TERMINATED BY A BREAK? BPL.S PRNT70 BRANCH IF NO' CLR.B FMSBRK(A0) CLEAR THIS BREAK FLAG2CLR.BBRKFLG-DATASG(A5)CLEARORIGINALBREAKFLAG2 LEA BRKABT-DATASG(A5),A0 YES,OUTPUT ABORT MESSAGE MOVE.L #28,D0 MESSAGE LENGTH% BSR WRTMESS OUTPUT THE ABORT MESSAGEPRNT70 RTS RETURN PAGE<************************************************************:*‚SAVECOMMANDROUTINE.SAVEALLORPARTOFTHISFILEINTO5*‡ANEWFILENAME,DONOTALTERTHISFILE-IFAFILENAME7*‡WASSPECIFIED.OTHERWISE,SAVESELFFORCHECKPOINTING.*‚REV.1.004/28/80‚(C313),*‚ENTRY:D1=0=NEXTCHARININPUTBUFFER=BLANK,*ˆD1=1=NEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA+*‚EXIT:GOODRETURN-MAIN‚ERRORRETURN-CMDERR*‚USES:01234567*…Dƒ* *…Aƒ*…*P)*‚CALLS:PROCLIST„CKRANG„GETVRƒFMS…WRTMESS;*********************************************************** SAVEEQU‚*)TST.BFILEOPT-DATASG(A5)‰USINGKOPTION?1 BNE EXTND01 BRANCH IF YES,CANNOT DO THIS COMMAND+TST.LMAXLINE-DATASG(A5)‡ANYFILERECORDS?0 BMI CHG03 BRANCH IF NONE,CANNOT DO THIS COMMAND TST.L D1 ANY PARAMETERS? BEQ.S SAVEE20 BRANCH IF YES,OK, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS8 MOVE.B #CKPTCMD,FMSCMD(A0) SAVE SELF-CHECKPOINT COMMAND BSR FMS DO THE SAVE) RTS RETURN-FMS OUTPUT ANY ERROR MESSAGESSAVEE10 BRA CMDERR ERROR-RETURN/SAVEE20 LEA SAVEL-DATASG(A5),A4 LIST TO PROCESS" BSR PROCLIST GO PROCESS THIS LIST2 LEA LISTPB-DATASG(A5),A4 RETURNED PARAMETER BLOCK5TST.BRANGSW-DATASG(A5)ƒANYDEFAULTRANGESTOCHECK? BEQ.S SAVEE30 BRANCH IF NO;MOVE.B#-1,NOHR-DATASG(A5)…DON'TGETANYHORIZONTALRANGES% BSR CKRANG GO GET DEFAULTS IF NEEDED+CLR.BNOHR-DATASG(A5)‹CLEARFOROTHERUSES%SAVEE30 BSR GETVR GET VERTICAL RANGES.MOVE.L(A4),REC-DATASG(A5)†SAVESTARTRECORD#,MOVE.W6(A4),RECN-DATASG(A5)…SAVE#RECORDS, ADD.L #8,A4 POINT TO FILENAME START ADDRESS MOVE.L (A4),D0 GET IT$ BCLR.L #31,D0 HAVE A START ADDRESS? BEQ SAVEE10 BRANCH IF NO,ERROR MOVE.L 4(A4),D0 GET END ADDRESS# BCLR.L #31,D0 HAVE AN END ADDRESS? BEQ SAVEE10 BRANCH IF NO,ERROR**‚CALLFMSTODOTHESAVE*,TST.BMSLUN-DATASG(A5)„HAVEALUNFORTHIS? BMI- .S SAVE40 BRANCH IF NO,ERROR, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS( MOVE.B #SAVNCMD,FMSCMD(A0) SAVE COMMAND BSR FMS GO DO THE SAVE' RTS RETURN,FMS DOES THE ERROR MESSAGES4SAVE40 LEA NOLUN-DATASG(A5),A0 OUTPUT NO LUN MESSAGE MOVE.L #30,D0 MESSAGE LENGTH BSR WRTMESS OUTPUT THE MESSAGE RTS RETURN PAGED*********************************************************************>*‚EXTRACTCOMMANDROUTINE.COPYTHEDATAINTHEEXTRACTBUFFER-*ŠTOTHEFILEATTHECURRENTFILEPOSITION,OR*ŠDELETETHEEXTRACTBUFFER.*‚REV.1.00‚5/1/80‚(C313),*‚ENTRY:D1=0=NEXTCHARININPUTBUFFER=BLANK,*ˆD1=1=NEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA+*‚EXIT:GOODRETURN-MAIN‚ERRORRETURN-CMDERR*‚USES:01234567*…D** *…Aƒ*…*P$*‚CALLS:PROCLIST„FMS„WRTMESS„OUTFINDA***************************************************************** XTRACT‚EQU‚*)TST.BFILEOPT-DATASG(A5)‰USINGKOPTION?1 BNE EXTND01 BRANCH IF YES,CANNOT DO THIS COMMAND+TST.LMAXLINE-DATASG(A5)…ANYFILERECORDS?( BMI CHG03 BRANCH IF NONE,CANNOT DO THISTST.LD1ƒANYPARAMETERS? BNE.S XTRCT30 BRANCH IF NO( LEA EXTRL-DATASG(A5),A4 LIST TO PROCESS BSR PROCLIST GO PROCESS IT2 LEA LISTPB-DATASG(A5),A4 RETURNED PARAMETER BLOCK& MOVE.B (A4),D0 GET DELETE BUFFER CHAR BCLR #7,D0 HAVE A CHAR? BEQ.S XTRCT30 BRANCH IF NO. CMP.B #'A',D0 IS IT 'A' FOR DELETE THE BUFFER BEQ.S XTRCT05 R BRANCH IF YES3 CMP.B #'a',D0 IS IT LOWER CAE A FOR DELETE BUFFER? BNE CMDERR BRANCH IF NO,ERROR* *‚DELETETHEEXTRACTBUFFERHERE*:XTRCT05‚LEASVEXT-DATASG(A5),A4GETEXTRACTBUFFERPOINTER MOVE.L (A4),D0 GET RECORD #& BCLR.L #31,D0 HAVE AN EXTRACT BUFFER?! BEQ.S XTRCT10 BRANCH IF NO,ERROR! CLR.L (A4) CLEAR SAVED # RECORDS CLR.L 4(A4) CLEAR # RECORDS, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS1 MOVE.B #DEXTCMD,FMSCMD(A0) DELETE BUFFER COMMAND BSR FMS GO DELETE THE BUFFER0 LEA BUFDEL-DATASG(A5),A0 BUFFER DELETED MESSAGE MOVE.L #22,D0 MESSAGE LENGTH$BRA.SXTRCT20‚GOOUTPUTTHEMESSAGE1XTRCT10 LEA NOBUF-DATASG(A5),A0 NO BUFFER MESSAGE MOVE.L #28,D0 MESSAGE LENGTH&XTRCT20 BSR WRTMESS OUTPUT THE MESSAGEXTRCT25 RTS RETURN**‚DOTHEEXTRACTHERE*4XTRCT30 LEA SVEXT-DATASG(A5),A4 GET EXTRACT POINTERS MOVE.L (A4),D0 GET RECORD # BCLR.L #31,D0 HAVE A BUFFER? BEQ XTRCT10 BRANCH IF NO BUFFER, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS* MOVE.B #EXTCMD,FMSCMD(A0) EXTRACT COMMAND BSR FMS GO DO THE EXTRACT' BNE XTRCT25 BRANCH IF EXTRACT NOT DONE:MOVE.LFMSADR(A0),FILELINE-DATASG(A5)„NEWFILELINENUMBER3MOVE.LFMSREC(A0),MAXLINE-DATASG(A5)„NEW#RECORDS BSR OUTFIND OUTPUT NEW SCREEN RTS RETURN PAGEB*******************************************************************7*‚INSERTCOMMANDROUTINE-INSERTDATAINTOTHEFILEAT0*‰THECURRENTFILEPOSITION.USEDBYSCROLLMODE1*‰ONLY.NULLINPUTTERMINATESTHEINSERTCOMMAND.-*‚INSRT50=ENTRYPOINTFORNEWOREMPTYFILES.,*‚ENTRY:D1=0=NEXTCHARININPUTBUFFER=BLANK,*ˆD1=1=NEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA *‚EXIT:MAIN*‚USES:01234567 *…D**‰* *…Aƒ****P*‚CALLS:PROCLIST„FMS†WRTMESS*ˆUPDINS†CRTINC******************************************************************* INSERT EQU *)TST.BFILEOPT-DATASG(A5)…USINGKOPTION?BNEƒEXTND01BRANCHIFYES(TST.BSCROLL-DATASG(A5)†INSCROLLMODE? BMI.S INSRT20 BRANCH IF YESINSRT10 BRA CMDERR ERROR.INSRT20 LEA INSL-DATASG(A5),A4 LIST TO PROCESS, CLR.B NOHR-DATASG(A5) 'A' OK IN COUNT FIELD BSR PROCLIST PROCESS IT- LEA LISTPB-DATASG(A5),A4 RETURNED PARA BLOCK' MOVE.L (A4),D0 GET OFFSET-IF ONE THERE+TST.LMAXLINE-DATASG(A5)‡ANYFILERECORDS? BPL.S INSRT22 BRANCH IF YES TST.L D0 ANY OFFSET?" BMI.S INSRT10 BRANCH IF YES,ERROR) BRA.S INSRT50 EMPTY FILE,GO START INSERT2INSRT22 CMP.L #-1,D0 -1 FOR APPEND TO END OF FILE? BNE.S I. NSRT25 BRANCH IN NOO MOVE.L MAXLINE-DATASG(A5),FILELINE-DATASG(A5) APPENDING,GET LAST RECORD NUMBER1ADD.L#1,FILELINE-DATASG(A5)ƒPOINTTOONEBEYOND BRA.S INSRT50 GO INSERT%INSRT25 BCLR.L #31,D0 HAVE AN OFFSET? BEQ.S INSRT30 BRANCH IF NOGADD.LD0,FILELINE-DATASG(A5)‡YES,HAVEANOFFSET,CALCULATENEWFILELINE:INSRT30‚MOVE.LFILELINE-DATASG(A5),D1GETCURRENTRECORD#& CMP.L MAXLINE-DATASG(A5),D1 PAST EOF?& BGT.S INSRT10 BRANCH IF GREATER,ERROR**ƒNOWREADYTOACCEPTNEWDATA9********DO NOT CHANGE INSRT50 - ENTRY POINT FOR NEW FILES*8INSRT50MOVE.B#'I',CURCMD-DATASG(A5)‚SETINSERTCOMMANDEINSRT55 CRT.IN CRTIOS,OUTBUF,#RECLNG READ THE INPUT-USE OUTPUT BUFFER& BEQ.S INSRT60 BRANCH IF A GOOD RETURN CMP.B #$C6,D0 BREAK? BEQ.S INSRT70 BRANCH IF BREAK BRA EDITERROR SOME OTHER ERROR&INSRT60TST.BBRKFLG-DATASG(A5)„BREAK? BNE.S INSRT70 BRANCH IF BREAK1MOVE.LD1,CRTLNG-DATASG(A5)…SAVERETURNEDLENGTH$TST.LCRTLNG-DATASG(A5)‹NULLINPUT?. BEQ.S INSRT80 BRANCH IF NULL,DONE WITH INSERT( LEA OUTBUF-DATASG(A5),A1 RECORD ADDRESS= BSR UPDINS GO LOOK FOR TABS AND UPDATE FILE WITH THIS RECORD TST.L D0 GOOD RETURN?( BNE.S INSRT80 BRANCH IF AN ERROR RETURN2ADD.L#1,FILELINE-DATASG(A5)ƒPOINTTONEXTRECORD3ADD.L#1,MAXLINE-DATASG(A5)„BUMPFILERECORDCOUNT BRA INSRT55 GO READ AGAIN**‚DONEWITHINSERT*3INSRT70CLR.BBRKFLG-DATASG(A5)ƒTURN-OFFBREAKFLAG:INSRT80 MOVE.L FILELINE-DATASG(A5),D1 GET CURRENT RECORD #- CLR.B CURCMD-DATASG(A5) CLEAR INSERT COMMAND+ TST.L MAXLINE-DATASG(A5) ANY FILE RECORDS? BMI.S INSRT100 BRANCH IF NONE/ CMP.L MAXLINE-DATASG(A5),D1 SEE IF BEYOND FILE# BLE.S INSRT90 BRANCH IF NOT BEYONDLMOVE.LMAXLINE-DATASG(A5),FILELINE-DATASG(A5)„FORCERECORD#TOLASTRECORD+INSRT90TST.BEMTYFILE-DATASG(A5)…OLDFILE? BEQ.S INSRT100 BRANCH IF OLD&CLR.BEMTYFILE-DATASG(A5)ƒMAKEITOLD/CLR.BFILETYPE-DATASG(A5)ƒMAKEITHAVERECORDS4MOVE.B#1,FSTSW-DATASG(A5)‚TURNOFF1STTIMESWITCHINSRT100 RTS RETURN PAGEA******************************************************************6*‚LISTCOMMANDROUTINE.DISPLAYAPORTIONOFTHEFILE.3*‡FIRSTLINELISTEDISNEWCURRENTLINE.FORSCROLL *‡MODEONLY.*‚REV1.00‚5-30-80‚(C313),*‚ENTRY:D1=0=NEXTCHARININPUTBUFFER=BLANK,*ˆD1=1=NEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA *‚EXIT:MAIN*‚USES:01234567 *…D**‰* *…A*‡*P2*‚CALLS:PROCLIST„GETVR„FMS„WRTMESS„SCROLOUT‚CKRANGA***************************************************************** LIST EQU *+TST.LMAXLINE-DATASG(A5)ˆANYFILERECORDS?0 BMI CHG03 BRANCH IF NONE,CANNOT DO THIS COMMAND(TST.BSCROLL-DATASG(A5)‰INSCROLLMODE? BPL CMDERR BRANCH IF NOT,ERROR( LEA LISTL-DATASG(A5),A4 LIST TO PROCESS BSR PROCLIST GO PROCESS IT- LEA LISTPB-DATASG(A5),A4 RETURNED PARA BLOCK(TST.BRANGSW-DATASG(A5)‰ANYRANGESSET? BEQ.S LIST05 BRANCH IF NO@MOVE.B#-1,NOHR-DATASG(A5)‚SETDON'TLOOKFORHORIZONTALRANGES& BSR CKRANG GET ANY VERTICAL RANGE SET2CLR.BNOHR-DATASG(A5)‡CLEARHORIZONTALRANGEFLAG(LIST05 BSR GETVR GET ANY VERTICAL RANGES( TST.W D1 CHECK RETURN OF VERTICAL RANGE BNE.S LIST10 BRANCH IF OK+ MOVE.L #1,4(A4) NO 2ND VR-DEFAULT=1 RECORD/LIST10 MOVE.L (A4),D0 GET RECORD NUMBER TO LIST/ CMP.L MAXLINE-DATASG(A5),D0 SEE IF BEYOND FILE# BLE.S LIST15 BRANCH IF WITHIN FILE9MOVE.LMAXLINE-DATASG(A5),D0„GETLASTFILERECORDNUMBER!ADD.L#1,D0„ACTUALRECORDNUMBER< LEA LASTMSG-DATASG(A5),A3 ADDRESS OF LINE NUMBER IN MESSAGE BSR CNVTHA CONVERT TO ASCII< LEA LASTMSG-DATASG(A5),A0 OUTPUT RECORD BEYOND FILE MESSAGE MOVE.L #22,D0 MESSAGE LENGTH# BRA.S LIST25 GO OUTPUT THE MESSAGE6LIST15MOVE.L(A4),REC-DATASG(A5)‚1STRECORD#TOREAD/MOVE.W6(A4),RECN-DATASG(A5)†#RECORDSTOREAD2LIST20 LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS!TST.BBRKFLG-DATASG(A5)ƒABREAK?( BMI.S LIST40 BRANCH IF YES,DONE LISTING& MOVE.B #RDCMD,FMSCMD(A0) READ.  COMMAND* MOVE.L REC-DATASG(A5),D1 RECORD # TO READ MOVE.L #1,D6 READ 1 RECORD BSR FMS GO DO THE READ TST.L D0 FOUND IT? BEQ.S LIST30 BRANCH IF FOUND(TST.BFLAG1-DATASG(A5)‚WEREANYLISTED?4 BNE.S LIST40 BRANCH IF YES,SAVE FILELINE AND RETURN: LEA FMSG100-DATASG(A5),A0 OUTPUT RECORD NOT FOUND MESSAGE MOVE.L #18,D0 MESSAGE LENGTH%LIST25 BSR WRTMESS OUTPUT THE MESSAGE RTS RETURN7LIST30MOVE.B#1,FLAG1-DATASG(A5)†SETFOUNDRECORDFLAG BSR SCROLOUT OUTPUT THE RECORD7SUB.W#1,RECN-DATASG(A5)‹DECREMENT#RECORDSTOOUTPUT% BEQ.S LIST40 BRANCH IF NO MORE TO DO-ADD.L#1,REC-DATASG(A5)ŠPOINTTONEXTRECORD MOVE.L REC-DATASG(A5),D0 GET IT. CMP.L MAXLINE-DATASG(A5),D0 PAST END OF FILE?) BLE LIST20 BRANCH IF NOT PAST,MORE TO DOELIST40 MOVE.L (A4),FILELINE-DATASG(A5) 1ST RECORD LISTED=CURRENT LINE RTS RETURN PAGEB*******************************************************************7*‚VERIFYCOMMANDROUTINE.FORSCROLLMODEONLY.DISPLAY8*‰ATTHETERMINALANYTIMEACHANGEISMADETOTHEFILE.1*‰USEDBYC,D,DUP,EXTEND,F,MERGE,XTRACTCOMMANDS.*‚REV.1.00‚5-30-80‚(C313)F*‚REV.2.00‚4/1/81ƒ(C313)CHANGEDDEFAULTTOON,ALLOWLOWERCASE'OFF',*‚ENTRY:D1=0=NEXTCHARININPUTBUFFER=BLANK,*ˆD1=1=NEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA *‚EXIT:MAIN*‚USES:01234567*…Dƒ* *…A…*ƒ*P*‚CALLS:PROCLISTB****************************************************************** VERIFY EQU *(TST.BSCROLL-DATASG(A5)‚INSCROLLMODE?" BPL.S VERIFYER BRANCH IF NO,ERROR TST.L D1 ANY INPUT? BEQ.S VERIFY20 BRANCH IF YES.VERIFY10CLR.BVERFLG-DATASG(A5)ƒENABLEVERIFY RTS RETURN/VERIFY20 LEA VERL-DATASG(A5),A4 LIST TO PROCESS" BSR PROCLIST GO PROCESS THIS LIST- LEA LISTPB-DATASG(A5),A4 RETURNED PARA BLOCK# MOVE.L (A4)+,D1 GET RETURNED VALUE BCLR.L #31,D1 HAVE A VALUE?+ BEQ VERIFY10 BRANCH IF NO-GO ENABLE VERIFY" MOVE.L D1,A2 START STRING ADDRESS MOVE.L (A4),D0 GET END ADDRESS BCLR.L #31,D0 HAVE ONE?" BEQ.S VERIFYER BRANCH IF NO,ERROR SUB.L D1,D0 GET INPUT LENGTH ADD.L #1,D0 ACTUAL LENGTH! CMP.B #3,D0 MUST BE 3 CHARACTERS BNE.S VERIFYER ERROR IF NOT MOVE.B (A2)+,D1 GET A BYTE BCLR.L #5,D1 FORCE UPPER CASE CMP.B #'O',D1 'O' FOR OFF?" BNE.S VERIFYER BRANCH IF NO,ERROR SUB.L #1,D0 DECREMENT COUNTER&VERIFY30 MOVE.B (A2)+,D1 GET NEXT BYTE BCLR.L #5,D1 FORCE UPPER CASE CMP.B #'F',D1 F?" BNE.S VERIFYER BRANCH IF NO,ERROR SUB.L #1,D0 DECREMENT COUNTER BNE.S VERIFY30 CHECK NEXT BYTE,MOVE.B#-1,VERFLG-DATASG(A5)‚DISABLEVERIFY RTS RETURN,DONE"VERIFYER BRA CMDERR ERROR,ASK WHAT PAGEB*******************************************************************2*‚LINECOMMAND-OUTPUTCURRENTFILELINETOSCREEN*B****************************************************************** LINEC EQU *&TST.LMAXLINE-DATASG(A5)ƒANYRECORDS? BMI CHG03 BRANCH IF NO6 LEA LINUMF-DATASG(A5),A3 ADDRESS OF LINE # IN MESSAGE- MOVE.L FILELINE-DATASG(A5),D0 CURRENT LINE # ADD.L #1,D0 START AT 1 NOT ZERO BSR CNVTHA CONVERT TO ASCII( LEA LINUM-DATASG(A5),A0 MESSAGE ADDRESS$ MOVE.L #24,D0 MESSAGE LENGTH 022285' BSR WRTMESS OUTPUT CURRENT LINE NUMBER RTS RETURN PAGEA******************************************************************>*‚DOWNCOMMANDROUTINE.MOVETHECURRENTFILEPOINTERDOWNTHE?*‡SPECIFEDNUMBEROFRECORDS.DEFAULT=1RECORD.IF#OFRECORDS?*‡MOVESBEYONDTHEFILE,MOVETOTHELASTRECORDANDOUTPUTEOF.*‚REV.1.004/1/81‚(C313)1*‚ENTRY:D1=0=NEXTCHARACTERININPUTBUFFER=BLANK1*ˆD1=1=NEXTCHARACTERININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER.*ˆA3=ADDRESSOFNEXTCHARACTERININPUTBUFFER*ˆA5=BASEADDRESSOFDATA *‚EXIT:MAIN:*‚USES'UP'COMMANDROUTINECODE,AFTERSETTING'DOWN'FLAG*B****************************************************************** DOWN EQU ** MOVE.B #-1,SPARE-DATASG(A5) SET DOWN FLAG BRA.S UP00 GO USE UP / CODE PAGEB******************************************************************C*‚UPCOMMANDROUTINE.MOVETHECURRENTFILEPOINTERUPTHESPECIFED<*‡NUMBEROFRECORDS.DEFAULT=1RECORD.IF#OFRECORDSMOVESB*‡BEYONDTHEFILE,MOVETOTHEFIRSTRECORDANDOUTPUTBOFMESSAGE.1*‚ENTRY:D1=0=NEXTCHARACTERININPUTBUFFER=BLANK1*ˆD1=1=NEXTCHARACTERININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER.*ˆA3=ADDRESSOFNEXTCHARACTERININPUTBUFFER*ˆA5=BASEADDRESSOFDATA *‚EXIT:MAIN*‚USES:01234567 *…D**‰* *…A**ƒ**P%*‚CALLS:PROCLIST‚FMS‚SCROLOUTƒWRTMESSA*****************************************************************(UP‚CLR.BSPARE-DATASG(A5)SETTOUPMODE)UP00 CLR.B FLAG1-DATASG(A5) CLEAR FOR USE+ TST.L MAXLINE-DATASG(A5) ANY FILE RECORDS?& BMI CHG03 BRANCH IF NO,CANNOT DO THIS( LEA UPDNL-DATASG(A5),A4 LIST TO PROCESS< MOVE.B #-1,NOHR-DATASG(A5) NO ALPHAS ALLOWED IN COUNT FIELD" BSR PROCLIST GO PROCESS THE INPUT5 CLR.B NOHR-DATASG(A5) RESET THIS FIELD FOR LATER USE6 LEA LISTPB-DATASG(A5),A4 GET RETURNED PARAMETER BLACK MOVE.L (A4),D0 GET THE ARGUMENT BCLR.L #31,D0 ANY SPECIFIED? BNE.S UP10 BRANCH IF YES+ MOVE.L #1,D0 NO ARGUMENT,UP DEFAULT OF ONEUP60 LEA FMSG100-DATASG(A5),A0 OUTPUT RECORD NOT FOUND MESSAGE MOVE.L #18,D0 MESSAGE LENGTH BRA UP40 GO OUTPUT THE MESSAGE PAGE<*************************************************************8*‚TAB‚ALTERORDELETETABSTOPS.USETABSTOPSSPECIFIED'*‡BYORIGINALOPTIONS,IFANY,ONDELETE.*‚REV.1.004/28/80‚(C313)6*‚REV.2.004/1/81ƒ(C313)ALLOWA-C-F-PTABSSPECIFIED/*‚ENTRY:D1=0IFNEXTCHARININPUTBUFFER=BLANK/*ˆD1=1IFNEXTCHARININPUTBUFFER=ENDOFDATA"*ˆA1=ENDADDRESS+1OFINPUTBUFFER)*ˆA3=ADDRESSOFNEXTCHARININPUTBUFFER*ˆA5=BASEADDRESSOFDATA#*‚TAB00ISANALTERNATEENTRYPOINT+*‚EXIT:GOODRETURN-MAIN‚ERRORRETURN-CMDERR*‚USES:01234567*…D********…A*****P*'*‚CALLS:PROCLIST„DOTABS„CLRTABSƒTABSORT=************************************************************* TAB‚EQU‚*+LEATABL-DATASG(A5),A4‚TABLISTTOPROCESSBSR‚PROCLIST‚GOPROCESSIT5LEALISTPB-DATASG(A5),A4‚RETURNEDPARABLOCKADDRESSTAB00 CLR.L D2 CLEAR FOR USE CLR.L D3 CLEAR FOR USE3 MOVE.B TABCNT-DATASG(A5),D2 GET CURRENT # TABS SET MOVE.B D2,D3 SAVE THIS COUNT.TST.BTABCNT-DATASG(A5)†ANYTABSALREADYSET? BNE.S TAB05 BRANCH IF YES, BSR CLRTABS NONE SET,CLEAR THE DEFAULT TABSTAB05 CLR.L D1 CLEAR FOR USE#TAB10‚MOVE.B(A4),D0‚GETATABSTOP BCLR.L #7,D0 A VALUE HERE?/ BEQ.S TAB20 BRANCH IF NO,DONE SETTING ANY TABS( MOVE.B D0,(A4)+ SAVE WITHOUT FOUND FLAG ADD.B #1,D2 COUNT IT" CMP.B #20,D2 PAST MAX OF 20 TABS? BGT.S TAB20 BRANCH IF PAS/ T MAX BSR‚DOTABSGOSETTHISTABSTOP ADD.B #1,D1 COUNT IT BRA.S TAB10 GET NEXT ENTRYTAB20 TST.L D1 SET ANY TABS?( BEQ.S TAB30 BRANCH IF NO,CLEAR SET TABS4 LEA LISTPB-DATASG(A5),A4 RESTORE PARA BLOCK ADDRESS1 LEA SVTABS-DATASG(A5),A0 GET SAVE TABLES ADDRESS! MOVE.L #20,D6 MAX NUMBER OF TABS! SUB.B D3,D6 NUMBER REMAINING,MAX+ ADD.L D3,A0 BUMP PAST CURRENT TAB SETTINGS7MOVE.BD2,TABCNT-DATASG(A5)ƒNEWNUMBEROFTABSETTINGS-TAB22MOVE.B(A4)+,(A0)+‚SAVETHESETABSTOPS" SUB.B #1,D6 DECREMENT TOTAL COUNT SUB.B #1,D1 DECREMENT COUNT# BNE.S TAB22 BRANCH IF MORE TO SAVE TST.B D6 ANY MORE SPACES LEFT? BLE.S TAB25 BRANCH IF NO,DONE&TAB23 CLR.B (A0)+ CLEAR REST OF BUFFER SUB.B #1,D6 DECREMENT COUNT$ BNE.S TAB23 BRANCH IF MORE TO BLANK'TAB25 BSR TABSORT GO SORT THE TAB STOPS/‚MOVE.B#1,D0ALWAYSSETCOLUMN1ASATABSTOP‚BSRDOTABSDOIT‚RTS‚RETURN-DONE%TAB30BSRCLRTABS‚CLEAROLDTABSTOPS( CLR.B TABCNT-DATASG(A5) CLEAR TAB COUNT CLR.L D2 CLEAR FOR LATER USE CLR.L D3 CLEAR FOR LATER USE+ MOVE.L #5,D1 COUNTER FOR CLEAR SAVE BUFFER( LEA SVTABS-DATASG(A5),A4 BUFFER ADDRESS#TAB35 CLR.L (A4)+ CLEAR SAVE BUFFER SUB.L #1,D1 DECREMENT COUNT BNE.S TAB35 BRANCH IF MORE9 LEA LISTPB-DATASG(A5),A4 RESTORE PARAMETER BLOCK ADDRESS CLR.L D0 CLEAR FOR USE3 MOVE.B 20(A4),D0 SEE IF LANGUAGE TAB WAS SPECIFIED) BCLR.L #7,D0 IS ANY CHARACTER SPECIFIED?/ BEQ.S TAB38 BRANCH IF NO,GO CHECK FOR DEFAULTS) MOVE.L A4,A1 GET PARAMETER BLOCK ADDRESS$ ADD.L #20,A1 POINT TO THE CHARACTER. BCLR.L #5,D0 FORCE TO CHARACTER TO UPPER CASE+ MOVE.B D0,(A1) SAVE IN THE PARAMETER BLOCK. BRA.S TAB39 GO FIND OUT WHICH TABS ARE WANTED;TAB38TST.BSAVOPTAD-DATASG(A5)…ANYTABSSETATEDITSTART?*BEQƒTAB70BRANCHIFNO,RESETDEFAULTTABS4 LEA LISTPB-DATASG(A5),A4 RESTORE PARA BLOCK ADDRESS. LEA SAVOPTAD-DATASG(A5),A1 GET OPTION ADDRESS%TAB39 CMP.B #'A',(A1) ASSMEBLER TABS? BNE.S TAB40 BRANCH IF NO1TABASM MOVE.B #11,(A4) SET FOR COLUMN 11 TAB STOP# ORI.B #$80,(A4) TURN ON FOUND FLAG, MOVE.B #18,1(A4) SET FOR COLUMN 18 TAB STOP$ ORI.B #$80,1(A4) TURN ON FOUND FLAG, MOVE.B #37,2(A4) SET FOR COLUMN 37 TAB STOP$ ORI.B #$80,2(A4) TURN ON FOUND FLAG BRA TAB05 GO DO THE TAB SETTING'TAB40 CMP.B #'F',(A1) FORTRAN TAB STOP? BNE.S TAB50 BRANCH IF NO,TABFORT MOVE.B #7,(A4) SET COLUMN 7 TAB STOP# ORI.B #$80,(A4) TURN ON FOUND FLAG BRA TAB05 GO SET TAB&TAB50 CMP.B #'C',(A1) COBOL TAB STOPS? BNE.S TAB60 BRANCH IF NO+TABCOB MOVE.B #6,(A4) SET COLUMN 6 TAB STOP# ORI.B #$80,(A4) TURN ON FOUND FLAG& MOVE.B #9,1(A4) SET COLUMN 9 TAB STOP$ ORI.B #$80,1(A4) TURN ON FOUND FLAG( MOVE.B #12,2(A4) SET COLUMN 12 TAB STOP$ ORI.B #$80,2(A4) TURN ON FOUND FLAG BRA TAB05 GO SET TABS'TAB60 CMP.B #'P',(A1) PASCAL TAB STOPS? BNE.S TAB69 BRANCH IF NO,ERRORTABPAS MOVE.L #19,D1 COUNTER! MOVE.L #4,D0 IST PASCAL TAB STOP'TAB65 MOVE.B D0,(A4) SAVE IN PARA BLOCK# ORI.B #$80,(A4)+ TURN ON HAVE FLAG" ADD.L #3,D0 BUMP TO NEXT TAB STOP SUB.L #1,D1 DECREMENT COUNTER" BNE.S TAB65 BRANCH IF MORE TO SET, MOVE.B #73,(A4) SET COLUMN 73 AS A TAB STOP" ORI.B #$80,(A4) TURN ON HAV EFLAG4 LEA LISTPB-DATASG(A5),A4 RESTORE PARA BLOCK ADDRESS BRA TAB05 GO SET THESE TABSTAB69 BRA CMDERR**‚RESETDEFAULTTABSTOPS*5TAB70 LEA LISTPB-DATASG(A5),A4 GET PARA BLOCK ADDRESS MOVE.L #7,D0 # TABS TO SET$ MOVE.L #10,D1 1ST TAB STOP COLUMN #(TAB80 MOVE.B D1,(A4) STORE IN PARA BLOCK$ ORI.B #$80,(A4)+ TURN ON FOUND FLAG# ADD.L #10,D1 BUMP TO NEXT TAB STOP SUB.L #1,D0 DECREMENT COUNT& BNE.S TAB80 BRANCH IF MORE TABS TO DO) LEA LISTPB-DATASG(A5),A4 RESTORE POINTER BRA TAB05 GO SET THESE TABS**‚SORTTABSHERE*6TABSORT LEA SVTABS-1-DATASG(A5),A6 TAB ADDRESS MINUS 1 CLR.L D1 CLEAR FOR USE0 MOVE.B TABCNT-DATASG(A5),D1 # TAB STOPS TO SORT MOVE.L D1,D0 SAVE FOR LATERTABS10 LSR #1,D1 GET HALF$ BNE.S TABS20 BRANCH IF MORE TO SORT*'*ˆMAKESURETHEREARENODUPLICATESSET*#‰ADD.L#1,A6POINTTO1STTABEN0 TRY#‰MOVE.LA6,A1ˆGET1STENTRYADDRESS&‰ADD.L#1,A1POINTTOSECONDTABENTRY.‰MOVE.BTABCNT-DATASG(A5),D0GET#OFTABSSET*‰CLR.LD1COUNTERFORNUMBEROFDUPLICATES+TABS60 SUB.B #1,D0 DECREMENT NUMBER OF TABS*‰BEQ.STABS80BRANCHIFNONELEFTTOCHECK‰MOVE.B(A1),D2GETANENTRY,‰CMP.B(A6),D2ARETHESETABSTOPSTHESAME? ‰BEQ.STABS70BRANCHIFTHESAME ‰ADD.L#1,A6POINTTONEXTENTRY%‰MOVE.B(A1)+,(A6)MOVETHISTABSTOP‰BRATABS60GOGETNEXTENTRY'TABS70 ADD.B #1,D1 COUNT THIS DUPLICATE ‰ADD.L#1,A1POINTTONEXTENTRY‰BRATABS60GOGETNEXTENTRY=TABS80 SUB.B D1,TABCNT-DATASG(A5) UPDATE THE ACTUAL TAB COUNTRTS‚RETURNTOCALLERTABS20 MOVE.L D0,D2 # ENTRIES SUB.W D1,D2 HALF THE ENTRIES MOVE.L #1,D3 COUNTER/TABS30 MOVE.L D3,A1 POINTER TO FIRST HALF ENTRY0TABS40 MOVE.L A1,A2 POINTER TO SECOND HALF ENTRY$ ADD.W D1,A2 BUMP TO THE SECOND HALF MOVE.B (A6,A1),D4 GET AN ENTRY( CMP.B (A6,A2),D4 COMPARE TO OTHER ENTRY' BLT.S TABS50 BRANCH IF LESS,DON'T MOVE1 MOVE.B (A6,A2),(A6,A1) MOVE IN THE SMALLER ENTRY* MOVE.B D4,(A6,A2) PUT THE BIGGER ENTRY IN SUB.W D1,A1 BUMP TO NEXT ENTRY! CMP.W #0,A1 DONE WITH THIS HALF?$ BGT.S TABS40 BRANCH IF NO,SORT MORE-TABS50 ADD.W #1,D3 BUMP POINTER TO NEXT ENTRY MOVE.W D3,D5 SAVE IT SUB.W D2,D5 LOOK TO NEXT ENTRY# BGT.S TABS10 GO GET ANOTHER STRING& BRA.S TABS30 SORT MORE OF THIS STRING PAGEA******************************************************************1*‚DTABDELETETABSTOPCOMMAND-SCROLLMODEONLY*‡A)OUTPUTTHECOLUMNTEMPLATE*‡B)PROMPTWITH'?'*‡C)READTHEINPUT/*‡D)DELETETHECORRESPONDINGTABSTOPFROMEACH*‰COLUMNCONTAININGAN'*'*‚REV.1.00‚5/8/81‚(C313).*‚ENTRY:D1=0IFNEXTCHARACTERINBUFFER=BLANK.*ˆD1=1IFNEXTCHARACTERINBUFFER=ENDOFDATA*ˆA5=BASEADDRESSOFDATA,*‚EXIT:MAIN‚ERROREXITS:CMDERRANDEDITERROR*‚USES:01234567*…D******ƒ* *…A***…P*‚CALLS:COLM00*B****************************************************************** DTAB EQU *(TST.BSCROLL-DATASG(A5)…INSCROLLMODE? BPL.S DTAB40 BRANCH IF NO,ERROR TST.L D1 ANY ARGUMENTS?! BEQ.S DTAB40 BRANCH IF YES,ERROR&TST.BTABCNT-DATASG(A5)„ANYTABSSET? BLE.S DTAB40 BRANCH IF NO,ERROR)BSRCOLM00‚GOOUTPUTTHECOLUMNTEMPLATE=MOVE.B#'T',CURCMD-DATASG(A5)‡SETTOTABCOMMANDFORTHEI/O- CRT.IN CRTIOS,FMSDATA,#RECLNG READ THE INPUT% BNE EDITERROR BRANCH IF AN I/O ERROR/CLR.BCURCMD-DATASG(A5)†CLEARTABCOMMANDFLAG'TST.BBRKFLG-DATASG(A5)†ABREAKINPUT?# BMI.S DTAB120 BRANCH IF YES,RETURN. MOVE.L IOSRRN(A0),A0 GET INPUT BUFFER ADDRESS*+*ˆPARSETHEINPUTFORTABCOLUMNSTODELETE*ˆA0=INPUTBUFFERADDRESS*ˆD1=INPUTBUFFERLENGTH* TST.L D1 ANY INPUT?& BEQ.S DTAB40 BRANCH IF NO INPUT-ERROR CLR.L D4 CLEAR FOR USE+ MOVE.B #'*',D3 TAB STOP DELETION CHARACTER CLR.L D0 CLEAR FOR USE. LEA LISTPB-DATASG(A5),A1 USE AS A SAVE BUFFER(DTAB10 MOVE.B (A0)+,D2 GET AN INPUT BYTE ADD.L #1,D0 COUNT COLUMN NUMBER CMP.B D2,D3 FOR DELETION? BNE.S DTAB20 BRANCH IF NO5 MOVE.B D0,(A1)+ FOR DELETION,SAVE THIS COLUMN NUMBER ADD.L #1,D4 COUNT IT0DTAB20 SUB.L #1,D1 DECREMENT INPUT BUFFER LENGTH& BNE.S DTAB10 BRANCH IF MORE TO SEARCH**ˆREADYTODELETETHETABSTOPS* TST.L D4 FOUND ANY TO DELETE? BNE.S DTAB50 BRANCH IF YES!DTAB40 BRA CMDERR NO,GO ASK WHAT?,DTAB50 CMP.B #20,D4 SEE IF DELETING TOO MANY! BGT DTAB40 BRANCH IF >20 - ERROR0 MOVE.L D4,D7 SAVE NUMBER OF TAB STOPS TO DELETE CLR.L D5 CLEAR FOR USE3 LEA LISTPB-DATASG(A5),A1 RESTORE THE SAVED ADDRESS; MOVE.B TABCNT-DATASG(A5),D5 GET CURRENT NUMBER OF TABS SETCOLM00 LEA IOSOUT-DATASG(A5),A0 OUTPUT PARAMETER BLOCK ADDRESS/ LEA OUTBUF-DATASG(A5),A1 OUTPUT BUFFER ADDRESS>MOVE.LA1,IOSTART-DATASG(A5)ˆSTARTADDRESSTOPARAMETERBLOCK MOVE.L A1,A2 SET-UP END ADDRESS! ADDA.L #79,A2 ACTUAL END ADDRESS:MOVE.LA2,IOEND-DATASG(A5)ˆENDADDRESSTOPARAMETERBLOCK MOVE.W #8,2(A0) IMAGE OUTPUT MOVE.L #80,D0 COUNTER**ˆBUILDTHEOUTPUTBUFFER*" MOVE.B #'0',D3 10TH COLUMN MARKER MOVE.B #'-',D4 COLUMN MARKER!MOVE.B#'+',D2‚5THCOLUMNMARKER" MOVE.B #BLANK,(A1)+ FIRST A BLANK$ SUB.L #1,D0 DECREMENT BUFFER LENGTH MOVE.L #4,D1 COUNTER FOR DASHES,COLM10 MOVE.B D4,(A1)+ DASH TO OUTPUT BUFFER SUB.L #1,D0 DECREMENT COUNTER# SUB.L #1,D1 DECREMENT DASH COUNTER BNE.S COLM10 BRANCH TIL DONE$ MOVE.B D2,(A1)+ 1 5TH COLUMN MARKER$ SUB.L #1,D0 DECREMENT TOTAL COUNTER COLM20 MOVE.L #4,D1 DASH COUNTER& ADD.B #1,D3 UPDATE 10TH COLUMN MARKER,COLM30 MOVE.B D4,(A1)+ DASH TO OUTPUT BUFFER" SUB.L #1,D0 DECREMENT TOTAL COUNT& BLE.S COLM50 BRANCH IF BUFFER IS FULL# SUB.L #1,D1 DECREMENT DASH COUNTER# BNE.S COLM30 BRANCH IF MORE DASHES# MOVE.B D3,(A1)+ 10TH COLUMN MARKER$ SUB.L #1,D0 DECREMENT TOTAL COUNTER MOVE.L #4,D1 DASH COUNTER,COLM40 MOVE.B D4,(A1)+ DASH TO OUTPUT BUFFER$ SUB.L #1,D0 DECREMENT TOTAL COUNTER- BLE.S COLM50 BRANCH IF OUTPUT BUFFER IS FULL# SUB.L #1,D1 DECREMENT DASH COUNTER# BNE.S COLM40 BRANCH IF MORE DASHES" MOVE.B D2,(A1)+ 5TH COLUMN MARKER$ SUB.L #1,D0 DECREMENT TOTAL COUNTER# BRA COLM20 GO FINISH OUTPUT BUFFERCOLM50 TRAP #2 DO THE OUTPUT% CLR.W 2(A0) RESTORE FORMATTED OUTPUT TST.L D0 AN I/O ERROR?% BNE EDITERROR BRANCH IF AN I/O ERROR RTS DONE WITH COLUMN COMMANMD PAGEB*******************************************************************.*‚CKRANG‚CHECKFORNORANGESINPARABLOCKFOR'*ŠFIND,CHANGE,SAVE,ANDPRINTCOMMANDS.**ŠIFHAVERANGES,RETURN.IFNORANGESSET,/*ŠSUBSTITUTEDEFAULTRANGESFROMRANGECOMMAND.+*‚ENTRY:A4=ADDRESSOFPARABLOCKFORRANGES*ˆA5=BASEADDRESSOFDATA#*ˆNOHR=0=CHECKFORHORIZONTALRANGE+*ˆNOHR=-1=DONOTCHECKFORHORIZONTALRANGE*‚USES:01234567*…D* *…A‰RP**‚EXIT:TOCALLERB****************************************************************** CKRANG‚EQU‚*. LEA SVRANG-DATASG(A5),A6 GET RANGE PARA BLOCK* MOVE.L (A4),D0 GET CALLERS VERTICAL RANGE BTST.L #31,D0 CALLER HAS VR?7 BNE.S CKRANG10 BRANCH IF YES,GO CHECK HORIZONTAL RANGE. MOVE.L (A6),D0 GET 1ST VR OF RANGE PARA BLOCK BTST.L #31,D0 HAVE ONE? BEQ.S CKRANG10 BRANCH IF NO6 MOVE.L (A6),(A4) PUT THIS RANGE IN CALLERS PARA BLOCK# MOVE.L 4(A6),4(A4) PUT 2ND VR ALSO4CKRANG10TST.BNOHR-DATASG(A5)…WANTHORIZONTALRANG?# BMI.S CKRANG20 BRANCH IF NO,RETURN MOVE.L 8(A4),D0 GET CALLERS HR BTST.L #31,D0 HAVE ONE?$ BNE.S CKRANG20 BRANCH IF YES,RETURN/ MOVE.L 8(A6),D0 GET 1ST HR OF RANGE PARA BLOCK BTST.L #31,D0 HAVE ONE?# BEQ.S CKRANG20 BRANCH IF NO,RETURN. MOVE.L 8(A6),8(A4) SAVE IN CALLERS PARA BLOCK& MOVE.L 12(A6),12(A4) SAVE 2ND HR ALSOCKRANG20‚RTS‚RETURN PAGE7********************************************************5*‚DODEL-DODELETE.USEDBYDELETEANDMOVECOMMANDS,*ŠTODELETESPECIFIEDRECORDSFROMTHEFILE.*‚REV.1.004/14/80(C313);*‚ENTRY:A4=POINTERTOSTARTRECORD#AND#RECORDSTODELETE*ˆA5=BASEADDRESSOFDATA*‚EXIT:D1=#RECORDSDELETED *‚CALLS:FMS7******************************************************* DODEL‚EQU‚*7MOVE.B#'D',CURCMD-DATASG(A5)‡SETDOINGDELETECOMMAND8MOVE.L(A4),FILELINE-DATASG(A5)„RECORDNUMBERTODELETE$ MOVE.L 4(A4),D6 # RECORDS TO DELETE8 BGT.S DODEL10 BRANCH IF HAVE ACTUAL # RECORDS TO DELETEH MOVE.L MA1 XLINE-DATASG(A5),D6 DELETING TO END OF FILE-GET # RECS IN FILE5 SUB.L FILELINE-DATASG(A5),D6 GET # RECORDS TO DELETE' ADD.L #1,D6 ACTUAL # RECORDS TO DELETE.DODEL10 AND.L #$FFFF,D6 GET RID OF ANY GARBAGE, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS) MOVE.B #DELCMD,FMSCMD(A0) DELETE COMMAND BSR FMS DO THE DELETE TST.L D0 RECORD FOUND?! BNE.S DODEL20 BRANCH IF NO,ERROR. CLR.L D1 CLEAR FOR RETURNED # RECORDS DELETED4 MOVE.W FMSRECN(A0),D1 GET NUMBER OF RECORDS DELETEDƒ+ BEQ.S BRK13 BRANCH IF YES, IN COMMAND MODE: CLR.B CURMODE-DATASG(A5) IN PAGE MODE, FORCE COMMAND MODE+ TST.L MAXLINE-DATASG(A5) ANY FILE RECORDS?- BPL.S BRK11 BRANCH IF YES, HAVE SOME RECORDS0 MOVE.B #CLRSCRN,D0 NO RECORDS, CLEAR THE SCREEN BSR SEND1 GO CLEAR BRA.S BRK12 AND CONTINUE(BRK11 BSR WRTSCRN GO RE-WRITE THE SCREEN;BRK12 MOVE.B SAVEP-DATASG(A5),D0 GET LAST KNOWN PROMPT LINE% BSR PUTP REPOSITION THE PROMPT TO IT.BRK13 BSR SETPROC SEET COMMAND MODE PROTECTION BRA EDIT5 GO GET NEXT INPUT/BRK15 CLR.B CURMODE-DATASG(A5) SET COMMAND MODE" BRA EDIT110 GET NEXT SCROLL INPUT1BRK20CLR.BCURCMD-DATASG(A5)„CLEARPRINTCOMMAND' LEA BRKABT-DATASG(A5),A0 BREAK MESSAGE MOVE.L #28,D0 MESSAGE LENGTHBSRWRTMESS‚OUTPUTTHEMESSAGE BRA EDIT5 RETURNLBRK40MOVE.BMULFSW-DATASG(A5),SVMULFSW-DATASG(A5)ƒSAVEMULTIPLEFINDSWITCHDCLR.BMULFSW-DATASG(A5)„CLEARTHISSWITCHSOPAGEWON'TBEREWITTEN BRA BRK10 GO OUTPUT MESSAGE PAGE1**************************************************%*‚BRKSR‚BREAKSERVICEROUTINEFORASQ*2************************************************** BRKSR EQU * MOVE.L #$22,D0 READ THE EVENT- LEA ATTEVNT-DATASG(A5),A0 PARA BLOCK ADDRESS TRAP #1 DO IT* MOVE.L (A7)+,D0 GET D0 BEFORE COMING HERE2 2 CMP.B #$E8,D0 IS THERE CURRENTLY A FRAMING ERROR?. BEQ.S BRKSR10 BRANCH IF YES,IGNORE THIS BREAK7 CMP.B #$EA,D0 IS THERE CURRENTLY A DATA OVERRUN ERROR?. BEQ.S BRKSR10 BRANCH IF YES,IGNORE THIS BREAK0MOVE.B#-1,BRKFLG-DATASG(A5)ƒTURNONBREAKFLAG.CMP.B#'F',CURCMD-DATASG(A5)ƒINFINDCOMMAND? BNE.S BRKSR05 BRANCH IF NOGMOVE.BMULFSW-DATASG(A5),SVMULFSW-DATASG(A5)‚SAVEMULTIPLEFINDSWITCH=CLR.BMULFSW-DATASG(A5)…CLEARSOEDITORWON'TREWRITESCREEN BRA.S BRKSR15 RETURN6BRKSR05CMP.B#'P',CURCMD-DATASG(A5)„INPRINTCOMMAND? BEQ.S BRKSR15 BRANCH IF YES0CMP.B#'D',CURCMD-DATASG(A5)ŠINDELETECOMMAND? BNE.S BRKSR10 BRANCH IF NO7BRKSR15 LEA FMSPKT-DATASG(A5),A0 GET FMS PACKET ADDRESS3 MOVE.B #-1,FMSBRK(A0) TELL FMSINT ABOUT THIS BREAK0BRKSR10 MOVE.L D0,-(A7) PUT D0 BACK ON THE STACK% MOVE.L #37,D0 RETURN FROM EVENT CODE MOVE.L #1,A0 ENABLE ASR TRAP #1 RETURN FROM THIS EVENT PAGE:***********************************************************@*‚DATOR‚DATAOVERRUNANDFRAMINGIOERROR.PUTINTOCOMMANDMODE$*‰REWRITESCREENANDOUTPUTMESSAGE.*:********************************************************** DATAOR EQU * MOVE.L D0,-(A7) SAVE CURRENT D0( CLR.B BRKFLG-DATASG(A5) CLEAR ANY BREAK(TST.BSCROLL-DATASG(A5)‚INSCROLLMODE?( BMI.S DATAOR20 BRANCH IF IN SCROLL MODE*TST.BCURMODE-DATASG(A5)‡INCOMMANDMODE? BEQ.S DATAOR10 BRANCH IF YES*CLR.BCURMODE-DATASG(A5)ƒSETCOMMANDMODE'DATAOR10 BSR OUTFIND REWRITE THE SCREEN)DATAOR20 MOVE.L (A7)+,D0 GET D0 CODE BACK CMP.B #$EA,D0 DATA OVERRUN? BEQ.S DATAOR25 BRANCH IF YES. LEA FRMER-DATASG(A5),A0 FRAMING ERROR MESSAGE MOVE.L #18,D0 MESSAGE LENGTH% BRA.S DATAOR30 GO OUTPUT THE MESSAGEADATAOR25 LEA DATAORM-DATASG(A5),A0 MESSAGE ADDRESS - DATA OVERRUN MOVE.L #22,D0 LENGTH'DATAOR30 BSR WRTMESS OUTPUT THE MESSAGE(TST.BSCROLL-DATASG(A5)…INSCROLLMODE?% BMI EDIT110 BRANCH IF IN SCROLL MODE BRA EDIT5 RETURN FOR NEXT INPUT PAGE:***********************************************************-*‚CKVPTRS‚CHECKFORVALIDPOINTERS.MAKESURE'*‹FILELINE,TOPLINE,&MAXLINEAREVALID.*‚CALLEDBYBREAK.-*‚EXIT:D0=0=VALIDPOINTERS,CCSETACCORDINGLY-*‡D0=-1=NOTVALIDPOINTERS,CCSETACCORDINGLY8******************************************************** CKVPTRS‚EQU‚*-TST.LFILELINE-DATASG(A5)‡POSITIVEFILELINE? BLT.S CKVPER BRANCH IF NO,ERROR+TST.LTOPLINE-DATASG(A5)‡POSITIVETOPLINE? BLT.S CKVPER BRANCH IF NO,ERROR3 MOVE.L FILELINE-DATASG(A5),D0 GET CURRENT FILELINE5 CMP.L TOPLINE-DATASG(A5),D0 TOPLINE BEYOND FILELINE?! BLT.S CKVPER BRANCH IF YES,ERROR5 CMP.L MAXLINE-DATASG(A5),D0 MAXLINE BEYOND FILELINE?! BGT.S CKVPER BRANCH IF YES,ERROR1 MOVE.L TOPLINE-DATASG(A5),D1 GET CURRENT TOPLINE1 SUB.L D1,D0 GET TOPLINE RELATIVE SCREEN POSITION& BLT.S CKVPER BRANCH IF NEGATIVE-ERROR+ CMP.L #$20,D0 FILELINE BEYOND SCREEN LINE?! BGE.S CKVPER BRANCH IF YES,ERROR CLR.L D0 GOOD RETURN FLAGRTS‚RETURNTOCALLER&CKVPER MOVE.L #-1,D0 ERROR RETURN FLAG RTS‚RETURN****‚UPDPTWS‚UPDATEPOINTERSANDWRITESCREEN*‹FORBREAKCONDITION*‰MOVE.W‚#IOPWAT+IOPIMG+IOPINM+IOPNEC+IOPBRK,IOSOPT(A0)‚OPTIONS9‰MOVE.L‚IOSSAD(A0),IOSRRN(A0)ƒSTARTINPUTBUFFERADDDRESS,‰MOVE.L‚IOSEAD(A0),D0‡GETENDBUFFERADDRESS)‰SUB.L‚IOSSAD(A0),D0ˆGETLENGTHOFBUFFER‰ADD.L‚#1,D0ACTUALLENGTH:‰MOVE.L‚D0,IOSLEN(A0)‡LENGTHOFINPUTBUFFERTOPARABLOCK0‰LEASET-DATASG(A5),A6‡GETCONTROLBYTESADDRESS2‰MOVE.L‚A6,IOSSAD(A0)…SETUPCONTROLBYTESADDRESS%‰LEASETEND-DATASG(A5),A6‡ENDADDRESS(‰MOVE.L‚A6,IOSEAD(A0)‚SETUPENDADDRESS(‰TST.B‚SCROLL-DATASG(A5)„INSCROLLMODE?‰BPL.SCRTIN4BRANCHIFNO3‰LEAFMSDATA-DATASG(A5),A6ƒGETINPUTBUFFERADDRESS6‰MOVE.LA6,IOSRRN(A0)‚INPUTBUFFERADDRESS,SCROLLMODE.‰MOVE.L#RECLNG,IOSLEN(A0)ƒINPUTBUFFERLENGTH7‰MOVE.W#IOPWAT+IOPBRK+IOPINF+IOPIMG,IOSOPT(A0)ƒOPTIONS0‰CMP.B#'I',CURCMD-DATASG(A5)ININSERTCOMMAND?‰BNE.S‚CRTIN1BRANCHIFNO2‰LEAINSPT-DATASG(A5),A6…GETOUTPUTBUFFERADDRESS+‰MOVE.LA6,IOSSAD(A0)„OUTPUTBUFFERADDRESS%‰LEAINSPTE-DATASG(A5),A6„ENDADDRESS/‰MOVE.LA6,IOSEAD(A0)ƒOUTPUTBUFFERENDADDRESS.‰LEAOUTBUF-DATASG(A5),A6„INPUTBUFFERADDRESS;‰MOVE.LA6,IOSRRN(A0)ƒUSEOUTPUTBUFFERFORINPUTONINSERT%‰BRA.SCRTIN4GODOOUTPUTWITHINPUT3CRTIN1ƒCMP.B#'T',CURCMD-DATASG(A5)‚INTABCOMMAND?ˆBNE.SCRTIN3BRANCHIFNO-ˆLEATABPRMT-DATASG(A5),A6ƒTABOUTPUTADDRESS3ˆMOVE.LA6,IOSSAD(A0)‚INTABCOMMAND,SETTABPROMPT'ˆLEATABPRMTE-DATASG(A5),A6‚ENDADDRESS!ˆMOVE.LA6,IOSEAD(A0)ENDADDRESSˆBRA.SCRTIN4GODOTHEI/ODCRTIN3‚LEASCPT-DATASG(A5),A6ˆSTARTADDRESSOFSCROLLCOMMANDPROMPT+ˆMOVE.L‚A6,IOSSAD(A0)†SCROLLCOMMANDPROMPT$ˆLEASCPTE-DATASG(A5),A6ˆENDADDRESS!ˆMOVE.LA6,IOSEAD(A0)†ENDADDRESS-CRTIN4‚TST.BBRKFLG-DATASG(A5)ƒABREAKINPUT?ˆBNEBREAKBRANCHIFYES‰TRAP‚#2”DOTHEREAD‰BNE.SƒCRTIN5ŽSOMETHINGWRONG!9RETURN10‚MOVE.L‚IOSLEN(A0),D1‡SAVERETURNEDBUFFERLENGTH(TST.BSCROLL-DATASG(A5)ŽINSCROLLMODE?( BMI.S RETURN15 BRANCH IF IN SCROLL MODE, CMP.L #7,D1 IN CRT-MODE,CHECK PACKET LENGTH! BLT.S CRTIN8 BRANCH IF TOO SHORT CMP.L #$56,D1 SEE IF TOO LONG BGT.S CRTIN8 BRANCH IF TOO LONGRETURN15MOVE.L‚#0,D0CLEARCC**ˆRETURNTOCALLER*RETURNƒRTS„.”RETURNTOCALLER%CRTIN5ƒCMP.B‚#ISTADO,D0ŠDATAOVERRUN?%‰BEQ.SCRTIN10BRANCHIFDATAOVERRUN‰CMP.B#$E8,D0FRAMINGERROR?,‰BNE.S‚RETURNŽBRANCHIFNO,RETURNWITHERROR6CRTIN10CLR.BBRKFLG-DATASG(A5)…IGNOREANYBREAKSHERE&‰TST.BCHAIN-DATASG(A5)…INCHAINMODE?-‰BMIRETURNƒBRANCHIFYES,DON'TDORETRANSMIT*%*†RETRANSMISSIONHEREIFDATAOVERRUN*%CRTIN8ƒMOVE.L‚#$20,D7NUMBEROFTRIES/‰CLR.BBRKFLG-DATASG(A5)…IGNOREANYBREAKSHERE1CRTIN6ƒMOVE.L‚#$60,IOSLEN(A0)„INPUTBUFFERLENGTH,‰MOVE.W‚#IOOWIN,IOSFCT(A0)‚OUTPUTWITHINPUT>‰MOVE.W‚#IOPWAT+IOPIMG+IOPINM+IOPNEC+IOPBRK,IOSOPT(A0)‚OPTIONS>‰LEALTRANS-DATASG(A5),A6…RETRANSMISSIONOUTPUTBUFFERADDRESS$‰MOVE.L‚A6,IOSSAD(A0)ƒOUTPUTADDRESS&‰LEALTRANSE-DATASG(A5),A6ƒENDADDRESS#‰MOVE.L‚A6,IOSEAD(A0)‚ENDOFOUTPUT*:*„DELAY64MILLISECONDSTOALLOWCRTTOSTOPSENDINGCHARS*‰MOVE.L‚A0,A6SAVEIOSPOINTER%‰MOVE.L‚#$40,A0ŽDELAY64MILLISECONDS%‰MOVE.L‚#21,D0ŽDELAYDIRECTIVENUMBER‰TRAP‚#1”DOIT!‰MOVE.L‚A6,A0RESTOREIOSPOINTER*7*„ASKFORRE-TRANSMISSIONOFLASTPACKET-TRIES32TIMES*(‰TST.BSCROLL-DATASG(A5)…INSCROLLMODE?‰BPL.SCRTIN7BRANCHIFNO>‰MOVE.W#IOPBRK+IOPWAT+IOPINF+IOPIMG,IOSOPT(A0)SCROLLOPTIONS#CRTIN7ƒTRAP‚#2”DOOUTPUTWITHIN4 PUT%‰BNE.S‚CRTIN11BRANCHIFERRORRETURN(‰TST.BSCROLL-DATASG(A5)„INSCROLLMODE?&‰BMIRETURN10RETURNIFINSCROLLMODE'‰MOVE.LIOSLEN(A0),D1GETBUFFERLENGTH‰CMP.L#7,D1SEEIFTOOSHORT!‰BLT.SCRTIN9BRANCHIFTOOSHORT‰CMP.L#$56,D1SEEIFTOOLONG0‰BLERETURN10BRANCHIFNOTTOOLONG,GOODRETURNACRTIN9 MOVE.B #ISTADO,D0 MAKE ERROR CODE LOOK LIKE A DATA OVERRUN9CRTIN11‚CLR.BBRKFLG-DATASG(A5)…IGNOREANYBREAKSFORNOW‰SUB.L‚#1,D7DECREMENTCOUNT‰BGE„CRTIN6TRY32TIMES ‰BRA„RETURNERROR-DONTTRYAGAIN‰PAGEG************************************************************************* SUBRINOUTE NAME: CRTOUT *REV.‚1.00‚11/01/79‚(JIMSMITH)<* FUNCTION: PERFORM OUTPUT SERVICES FOR CRT EDIT-MODE OUTPUT/*CALLINGSEQUENCE:A0‚=POINTERTOPARAMBLOCK"*ŒIOSLUN(A0)=LOGICALUNITNUMBER#*ŒIOSSAD(A0)=STARTBUFFERADDRESS!*ŒIOSEAD(A0)=ENDBUFFERADDRESS%*RETURN:A0‚=POINTERTOPARAMBLOCK*‰D0‚=IOSRETURNCODES*‰CC‚=STATUSOFD0*‚IOSSTA(A0)=D0**USING:ƒ01234567*ˆDR*ˆAP‰P** CRTOUTƒEQU…*(‰MOVE.LA0,-(A7)„SAVEPARABLOCKPOINTER/‰MOVE.LIOSEAD(A0),A0†GETENDADDRESSOFBUFFER#‰ADD.L#2,A0MAKEIT2BYTESLARGER‰CLR.B-1(A0)SETANULL%‰MOVE.B#0,(A0)NULLTOLOCKKEYBOARD ‰MOVE.L(A7)+,A0ŒRESTOREPOINTER.‰ADD.L#2,IOSEAD(A0)ˆFIXUPENDBUFFERADDRESS0‰MOVE.W‚#IOWRIT,IOSFCT(A0)‚SETUPWRITEFUNCTION;‰MOVE.W‚#IOPWAT+IOPIMG,IOSOPT(A0)‚WRITEOPTIONS(WAIT,IMAGE)‰TRAP‚#2”WRITE(‰RTS™RETURN-CALLERWILLCHECKFORERRORS PAGE4*****************************************************/*‚CNVTHACONVERTHEXTOASCIIFORSCREENOUTPUT*%*‚ENTRY:A3=LOCATIONFORCONVERTVALUE*ˆD0=VALUETOCONVERT*4**************************************************** CNVTHA EQU *# MOVE.L D1,-(A7) PRESERVE D1 012885$ CLR.L D1 SET COUNTER TO ZERO 012885 MOVE.L #8,D2 COUNTER0ADD.L#8,A3POINTTOEND+1OFOUTPUTLOCƒ022285>CNVT05 CMP.L #600000,D0 NEAR SIZE WHERE OVERFLOW OCCURS 012885, BLE.S CNVT10 SMALL ENOUGH SIZE IN D0 012885* SUB.L #100000,D0 TAKE OFF OVERFLOW 012885# ADD.L #1,D1 ADD 1 REDUCTION 012885-BRA.SCNVT05‚LOOKAGAINATSIZEOFD0012885CNVT10 DIVU #10,D0 DIVIDE BY 10 SWAP D0 GET THE REMAINDER ADD.B #$30,D0 ADD IN THE ASCII MOVE.B D0,-(A3) STORE IT CLR.W D0 CLEAR IT IT SWAP D0 GET REST, CMP.L #4,D2 TIME TO ADD IN OVERFLOW? 012885 BNE.S CNVT15 NOT TIME 012885* ADD.L D1,D0 100,000'S PUT BACK NOW 012885"CNVT15SUB.L#1,D2COUNTIT‚012885" BNE.S CNVT10 BRANCH IF MORE TO DO MOVE.L #7,D2 COUNTER 022285*CNVT20 CMP.B #$30,(A3) SEE IF LEADING ZERO( BNE.S CNVT30 BRANCH IF NOT LEADING ZERO/ MOVE.B #$20,(A3)+ IS LEADING ZERO,BLANK IT OUT SUB.L #1,D2 DECREMENT COUNTER, BNE.S CNVT20 GO LOOK FOR MORE LEADING ZEROS(CNVT30 MOVE.L (A7)+,D1 RESTORE D1 012885 RTS RETURN,DONEéééé4 ééé=/* =/*†DEBUG.AF=/*'=/* Chain file to assemble DEBUG module=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to DEBUG.LS=/*=/IFC \1ƒ=ARGDEBUG.LS=/ENDIF=/* =ASM DEBUG.SA,DEBUG.RO,\1;RZ=136=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*}=/*=ENDéééééé‹=/* =/*†DEBUG.LF=/*&=/* Link chain file to create DEBUG.LO=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to DEBUG.LL=/*=/IFC \1ƒ=ARGDEGUG.LL=/ENDIF=/*=LINK ,DEBUG.LO,\1;HAMX ATTRIBUTES P SEG DEBU:9,14INPUT DEBUG.ROLIB 0.&.UTILIB.ROEND=/*=ENDéé5 éééé”$DEBUG„IDNT†2,0‡MultitaskingDebugger‰NOLIST&INCLUDE9995.&.TR1.EQŽTRAP#1EQUATES!INCLUDE9995.&.IOE.EQŽIOEQUATES‰LIST*F*‚SYMBUG:ƒEXCEPTIONMONITORTASK(MULTI-TASKVERSION-MAX.19TASKS)** ‰SECTIONƒ9‰OPT‡FRS‰XREF†EDITFILE#‰XDEF†CLASCODEŒREQUIREDBYEDITFILE* *ˆDATAAREAS*/BˆEQU‡*‰USEA6FORSOURCEFIELDDATAADDRESSING:‰DC.B†'1220844'„UTILITYCONTROLDATE&VERSAdosRelease#*$*ˆVERSAdos‚CONTROLBLOCKSBEGINHERE* STOPTASK:!‰DC.L†0,0‡*TASKNAMEANDSESSION STARTTSK: ‰DC.L†0,0-‰DC.W†$A000…*MONITORTASKANDREGSSPECIFIED‰DC.L†0,0‡*MONITORTASK=MBUG=TASKREGSDS.L†16ˆREGSAVEAREAISPARTOFSTARTTSKPARMBLOCKDREG6„EQU‡TASKREGS+$18**ˆLOADERPARAMETERBLOCK*TASKLDR‚DC.L†'TASK'„*TASKNAME8SESSION‚DC.L†0‰*STANDARDSESSIONID(ALLTASKS&EXMON)/‰DC.W†$8000…*CRTCBOPTIONS-MONITORSPECIFIED)‰DC.L†0,0‡*MONITORTASKNAMEANDSESSION)‰DC.B†50,100„*INITIALANDFINALPRIORITY‰DC.W†0‰*TASKATTRIBUTES‰DC.L†0‰*TASKENTRYADDRESS‰DC.W†0‰*USERID?LOADOPT‚DC.W†$604E…*USELOADERINFORMATIONBLOCKFORTASKINFO$LOADCLL‚DC.B†0‰*COMMANDLINELENGTH‰DC.B†0‰*LUNOFLOADFILE‰DC.L†0,0‡*RESERVED%LOADCLA‚DC.L†0‰*COMMANDLINEADDRESS*J* FHS PARAMETER BLOCK BEGINS - DO NOT SEPARATE THIS FROM ABOVE DEFINITIONS*FHSTASK:‰DC.B†0‰*CODE‰DC.B†0‰*COMMAND=CHECKPOINT*‰DC.W†0‰*OPTIONS:CONTIGUOUS,PUBLICREAD‰DC.B†$FF‡*STATUS ‰DC.B†0‰*LUNLDVOL$L‚EQU‡*-TASKLDR‰DC.L†0LDUID$W‚EQU‡*-TASKLDR‰DC.W†0‰*USERNUMBERLDCAT$L‚EQU‡*-TASKLDR‰DC.L†0,0‡*CATALOG‰DC.L†0,0‡*FILENAME‰DC.W†'LO'‰*EXTENSION‰DC.W†0‰*RESERVED‰DC.B†0,0‡*PROTECTCODES‰DC.W†0‰*RECORDLENGTH‰DC.L†0‰*SIZE/POINTER**ˆGETASQPARAMETERBLOCK*"ASQB…EQU‚*‹GETASQPARAMETERBLOCK ‰DC.L‚0ŠTASK‰DC.L‚0ŠSESSION.‰DC.B‚5ŠSTATUS‚ASQ-MESSAGEENABLED-ASRENABLED‰DC.B‚12‰MAXMESSAGELENGTH‰DC.L‚120ˆ10MESSAGESMAX:ASQASRV‚DC.L‚0ŠASRSERVICEROUTINEVECTOR‚A(EXASR)1/25/82‰DC.L‚0*–N¦M®E¶?¾MÆ?Î;Ö9Þ?æ9î;ö9þ9@=37&1.86?>;F=N:V5^4f<n9vL~Z†I(*ˆATTACHTARGETTASKTOEXMONPARMBLOCK*)EXMONBƒEQUƒ*†ATTACHEXMONPARAMETERBLOCK‰DC.L‚'„'†TARGETTASKNAME‰DC.L‚0‹SESSION)EXMONAMEDC.L‚0‡NAMEOFEXCEPTIONMONITOR‰DC.L‚0ŠSESSION*$*ˆEXMONMASKMODIFICATIONPARMBLOCK*"XMSKB„EQU‚*ŠEXMMSKPARAMETERBLOCK‰DC.L‚'TEST'…TARGETTASK‰DC.L‚0ŠSESSION‰DC.L‚$01FFFFF1ƒMASK**ˆREXMONPARMBLOCK*8REXPB„DS.L†3‰TASKNAME,SESSION,A(OPTIONSINSTATEBUFFER)*9*ˆMOVELLPARMBLOCKSTOSEND&RECEIVEDATABETWEENTASKS*5BRKPBG‚D5 C.L‚'TEST',0MOVELLGETCODEFROMTARGETTASKBRKPBUF‚DC.L‚0,0,0BRKGET‚DC.L‚0,2*4BRKPBP‚DC.L‚0,0MOVELLPUTBPORCODETOTARGETTASKBRKSOR‚DC.L‚0,'TEST',0BRKBUF‚DC.L‚0,2**ˆGTSEGPARMBLOCK*PBGETSG‚DC.L†0,0‡TASK,SESSION#‰DC.W†$2000,0ƒOPT=PHYSICAL‚ATTR=R/W‰DC.L†'TSKS'„SEGMENTNAME'SEGADDR‚DC.L†0‰PHYSICALADDROFSEGMENT0SEGLTHƒDC.L†0‰SEGMENTLENGTH=#TASKS*(32+256)**ˆASQEVENTBUFFER*!EVNTBLK‚DC.B†0‰ASRRECEIVINGAREA0EVNTCODEDC.B†0‰ISALWAYS8FOREXCEPTIONEVENTS"EVNTTASKDC.L†0,0‡TASKNAMESESSION3EVNTECODDC.B†0‰IDENTIFIESNORMALEVENTEXCEPTION#)EVNTETYPDC.B†0‰3TYPES=ATT,DET,NORMAL*%*ˆFHSTOASSIGNPRINTERORREMOTECRT*;PRINTFHSDC.B…0,$40,0,3,0,1,'PR‚'ƒALSOUSEDTOASSIGNLUN#4‰DC.W…0”*USERNUMBER‰DC.L…'ˆ'‹*CATALOG‰DC.L…0,0’*FILENAME"‰DC.W…0,0’*EXTENSIONANDRESERVED'‰DC.B…0,0’*WRITEANDREADPROTECTCODE‰DC.W…0”*RECORDLENGTH‰DC.L…0”*SIZE/POINTER**ˆCHANGELUNFHS*4LUNFHSƒDC.B†1,$10,$80,0‰CHANGELUASSIGN‚SEND&KEEP%‰DC.B†0,5,5,0STATUSLUALUBRESERVED‰DC.L†0,0‘TASKNAME&SESSION*#*ˆIOSPARMBLOCKFORKEYBOARDINPUT* IOIN‚EQU‚*INPUTPARAMETERBLOCK6†DC.W‚1,IOPBRK‰NOTEBREAKOPTIONAUGMENTEDWITHIOPPROˆDC.B‚0,CDFLUN,0,0ˆDC.L‚00ˆDC.L‚0INPUTBUFFERSTARTADDRESS‚ALWAYSA(INQ)$ˆDC.L‚0ENDADDRESS‚ALWAYSA(INQE-1)ˆDC.L‚02ˆDC.L‚0…CSA=ASRADDRESSWHENINPROCEEDI/OMODE*"*ˆIOSPARMBLOCKFORSCREENOUTPUT!IOUT„EQU‚*OUTPUTPARAMETERBLOCKˆDC.W‚2,IOPBRKˆDC.B‚0,LDFLUN,0,0ˆDC.L‚0.IOUTSADDC.L‚0ŽDYNAMICIOSSAD&IOSEAD‡1/25/82ˆDC.L‚0¬1/25/82ˆDC.L‚0ˆDC.L‚0**ˆCRTKEYBOARDBUFFER*6INQ†COMLINEƒ80ˆCOMLINESERVESASKEYBOARDINPUTBUFFER INQE„EQU‚***ˆSCREENMESSAGEBUFFERS*B*ˆMSGADRisanaddresstableofconsecutivemessagesindexedbyD71*D7isinitializedbybranchingtoalabelMSGxx9*whichentersthemessagestart&endaddrsintotheIOB?MSGADRƒDC.L†QUEST1,QUEST2,QUEST3,OUTMESS,OUTSTAT,OUTBUF,OUTBUFE0‰DC.L†0,0,0,0,ERMES1,ERMES2,ERMES3,ERMES4,ERMES59‰DC.L†ERMES6,ERMES7,ERMES8,ERMES9,ERMES10,ERMES11,ERMES12=‰DC.L†ERMES13,ERMES14,ERMES15,ERMES16,ERMES17,HELPMSG,STATHDR‰DC.L†DMOUTAŽDMOUTAISMSG302‰DC.L†SPACES,SRPREFIX…LASTBUFFERVECTORISSPACES(QUEST1ƒDC.B†'Debug'ŒSYNTAXERRORPROMPTQUEST1N‚DC.B†'…WHAT?',$07 EQUEST2ƒDC.B†'MAXIMUMTASKCOUNT(1->19)?'‚REUSEDFORDEFAULTPROMPTS QUEST3ƒDC.B†'Debug'QUEST3N‚DC.B†'…?',$00 OUTMESS‚DC.B†'Debug'OUTTASK‚DC.B†'†'%OUTEVNT‚DC.B†''EVENTTYPEGOESHEREPCPREFIXDC.L‚'PC='OUTPC„DC.L‚0,0,0 OUTSTAT‚DC.L‚0,0**ˆBUFFERTODISPLAYBREAKPOINTS*-OUTBUFƒDC.B†'Debug:Revision‚B2.00‘'ˆ1/25/82 ‰DC.B†'¨' OUTBUFE‚EQU‡***ˆERRORMESSAGEBUFFERS*ERMES1ƒDC.B†'NOMEMORYFOR'ERMES1N‚DC.B†'ASQ'ERMES2ƒDC.B†'BADTARGETTASK'$ERMES3ƒDC.B†'BADPARMBLOCKADDRESS'"ERMES4ƒDC.B†'BUFFERADDRESSWRONG'ERMES5ƒDC.B†'NOASQ'ERMES6ƒDC.B†'BRKPTTABLEFULL'*ERMES7ƒDC.B†'VALUELOCATIONINCORRECT',7,7)ERMES8ƒDC.B†'TARGETTASKADDRESSERROR',7$ERMES9ƒDC.B†'MESSAGEFROMASQWRONG'!ERMES10‚DC.B†'NOROOMTOATTACH'6NUTASKNMDC.B†'TASK-BUTTASKISRUNNINGUNATTACHED'!ERMES11‚DC.B†'ATTACHNOTALLOWED'ERMES12‚DC.B†'LOADERROR''ERMES13‚DC.B†'CANNOTHANDLEBREAKS',7,7!ERMES14‚DC.B†'EVENTNOTSENT',7,7ERMES15‚DC.B†'***ERRORTRAP'TRAPIDƒDC.B†0,'‚ERRORCODE:'ERRCODƒDC.L†0,0,0CRLF…DC.W†$0D0AERMES16‚DC.B†'UNKNOWNTASKNAME')ERMES17‚DC.B†'BRKPTSLOCKEDINEXECUTION'&HELPMSG‚DC.B†'…AS„[][]‹',‰DC.B†'ADDRESSSTOP(Onchangeor=Value)…'‰DC.B†'[NO]BR„[]....‘'/‰DC.B†'BREAKPOINTList,SetorDeleteMultiple‚' ‰DC.B†'…DE¡'!‰DC.B†'DEFAULTList,SetOptions' ‰DC.B†'…DF¡'$‰DC.B†'DISPLAYFORMATTEDRegisters'‰DC.B†'…G…[]•',‰DC.B†'GOintoExecution(ForegroundTask)…'‰DC.B†'…MD„[]'0‰DC.B†'MEMORYDISPLAY(defaultcount=16Bytes)'‰DC.B†'…MS„....Œ'+‰DC.B†'MEMORYSET(Databytesspacedout)†'‰DC.B†'…OF„[]Ž'+‰DC.B†'OFFSETREGISTER6 List,SetorDelete†'‰DC.B†'…QUITŸ'+‰DC.B†'QUIT(TerminateDebuggingSession)†'‰DC.B†'…TR„[count]–''‰DC.B†'TRACE…(CRwillcontinueTRACE)†',‰DC.B†'….A0->.A7,.D0->.D7.PC.SR.XM.ST'-‰DC.B†'.VL.VA.VM.MC‚REGISTERListorSetƒ' ‰DC.B†'…ATTA‚[][<#crt>]Œ'.‰DC.B†'ATTACHTasktoDEBUG(RemotecrtI/O)ƒ'‰DC.B†'…DETA‚[]•'0‰DC.B†'DETACHTaskfromDEBUG(ContinuesExec)'$‰DC.B†'…EVEN‚[]<#exception>ˆ'!‰DC.B†'EVENTCREATEDforaTask'!‰DC.B†'…LOAD‚[]‹'!‰DC.B†'LOADTASK‚(withCOMLINE)'$‰DC.B†'…MASK‚[]<#exception>ˆ'‰DC.B†'MASKExceptionToggled’'‰DC.B†'…STAR‚[|ALL]'-‰DC.B†'STARTTask(s)intoExecutionlikeGO„' ‰DC.B†'…STAT‚[]Œ'/‰DC.B†'STATUSListorSet(DORM,REDYorWAKE)‚'‰DC.B†'…STOP‚[|ALL]'-‰DC.B†'STOPTask(s)Execution&SetDORMANT„'!‰DC.B†'…TASK‚[<#notify>]‹'0‰DC.B†'TASKbecomesFOREGROUNDwithBPoptions'‰DC.B†'…TERM‚—'‰DC.B†'TERMINATETaskš'‰DC.B†'…WAITŸ'+‰DC.B†'WAITfor{BREAK}todisplayPROMPT†' 6STATHDR‚DC.B†'TASKSESS‚STATEEVENT‚@PC‡PCNOW„SR…MASK'‰DC.B†'„TCBSTATƒOP„CRT‚' **ˆMEMORYDISPLAYBUFFERS*DMOUTAƒDC.B†'¨' ‰DC.B†'¨'SPACESƒDC.L†'„'SRPREFIXDC.B†'SR='D0D7…DC.B†'D0->D7‚'A0A7…DC.B†'A0->A7‚'!DEFMSGƒDC.B†'OPTIONS:PRECHO='ECHOOPT‚DC.B†'N(Y/N)?' PRLUN„EQU‡1 CRTLUNƒEQU‡4,RRCOUNT‚EQU‡8‰MAXNUMBEROFOFFSETREGISTERS.LTSKVECTEQU‡32ˆBYTESPERTASKINVECTORTABLE*LINCNTƒDC.W†0NUMBEROFLINESLEFTONPAGE4BPVALUE‚DC.W†$4E70…RESETINSTRUCTIONISABREAKPOINT$DECRT„DC.L†0‰EXMONCRTTERMINALNAME,TERMINALDC.L†0‰TERMINALOFLASTLOADEDTASK,STACKBRKDC.L†0‰BREAKRECOVERYSTACKPOINTER**’TABLEFOREDITFILE*/CLASCODEDC.B†0,0,0,0,0,0,0,0,0,0,0,0,0,$80,0,0%‰DC.B†0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;‰DC.B†$80,0,0,$40,$40,0,$10,0,$20,$20,$50,0,$80,$40,$20,$20?‰DC.B†$17,$17,$17,$17,$17,$17,$17,$17,$17,$17,$20,$80,0,$40,0,0E‡DC.B‚$10,$1E,$1E,$1E,$1E,$1E,$1E,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C;‰DC.B†$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,$1C,0,0,0,0,0%‰DC.B†0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0%‰DC.B†0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0* *ˆBREAKSTUFF*BREAK DC.W 0 THE WORDSETBRK EQU 15 TAKE IO BREAKSGOTBRK EQU 14 GOT IO BREAKBPMAX‚EQU10‚MAXBPPERTASK* *ˆBREAKEVENT* ATTEVNT EQU * DS.W 1 LENGTH + CODE DS.L 1 DEVICE DS.W 1 DEVICE STATUS**ˆCOMMANDPARSINGDATAFIELDS*FLDL‚DC.L‚0…FIELDLENGTHVFLD‚DC.L‚0„VALUE VTBL‚EQU‚*'‰DC.L†'Gƒ','GO‚','Tƒ','TR‚','AS‚','BR‚'#‰DC.L†'NOBR','DF‚','MD‚','MS‚','Qƒ'%‰DC.L†'QUIT','OF‚','HE‚','HELP','DE‚'!‰DC.L†'LOAD','ATTA','DETA','STAR'6‰DC.L†'STOP','TASK','MASK','EVEN','TERM','WAIT','STAT' VTBLE‚EQU‚**"*ˆDISPLAYSTATUSTABLEOFCOMMANDS*:STATBLƒDC.W‚'D0',0,'D1',4,'D2',8,'D3',$C,'D4',$10,'D5',$142‰DC.W‚'D6',$18,'D7',$1C,'A0',$20,'A1',$24,'A2',$282‰DC.W‚'A3',$2C,'A4',$30,'A5',$34,'A6',$38,'A7',$3C2‰DC.W‚'PC',$40,'SR',$44,'XM',$46,'ST',$4A,'OP',$4E)‰DC.W‚'VL',$50,'VA',$54,'VM',$58,'MC',$5C STATBLE‚EQU‚**#*ˆEVENTNOTIFICATIONMESSAGEBUFFER*MESTYPƒDC.B‚'TRAP0Š'‰DC.B‚'TRAP1Š'‰DC.B‚'TRAP2Š'‰DC.B‚'TRAP3Š'‰DC.B‚'TRAP4Š'‰DC.B‚'TRAP5Š'‰DC.B‚'TRAP6Š'‰DC.B‚'TRAP7Š'‰DC.B‚'TRAP8Š'‰DC.B‚'TRAP9Š'‰DC.B‚'TRAP10‰'‰DC.B‚'TRAP11‰'‰DC.B‚'TRAP12‰'‰DC.B‚'TRAP13‰'‰DC.B‚'TRAP14‰'‰DC.B‚'TRAP15‰'‰DC.B‚'BUSERROR‡'‰DC.B‚'ADDRESSERRORƒ'‰DC.B‚'ILLEGALINST„'‰DC.B‚'ZERODIVIDE…'‰DC.B‚'CHK‚INST‡'‰DC.B‚'TRAPV‹'‰DC.B‚'PRIVVIOLATION‚'‰DC.B‚'LINE1010‡'‰DC.B‚'LINE1111‡')UTLWORD‚DS.L†4“UNUSEDEXCEPTIONEVENT#196ADX†DC.B†'ADXDORMREDYWAIT'‚UNUSEDEXCEPTIONEVENT#1AADXENDƒDC.B‚'TRACEMAXINST‚'‰DC.B‚'TRACEONEINST‚'‰DC.B‚'VALUECHANGE„'‰DC.B‚'VALUEEQUAL…'3‰DC.B‚'STOPPED‰'…EXCEPTION$1FALTERNATEATTACHMSG‰DC.B‚'ATTACHEDˆ'20‰DC.B‚'DETACHEDˆ'21‰DC.B‚'BREAKPOINT†'22‰DCB.L…40,0“STACKSPACE STACK„EQU‡*‰SPC‡22**************************************************;*ˆTASKCONTROLDATA‚(BUFFERDYNAMICALLYOBTAINEDVIAGETSG)+*’6 includes‚TASKVECTORTABLE&TASKBUFFERS(*’sizeoftheGTSEGedareacontrolledby9MAXTCNT‚DS.W†1‰MAXIMUM#OFTASKSTOBEATTACHEDTOEXMON*CURTCNT‚DC.W†0‰CURRENT#OFTASKSATTACHED0=YES)"TVEVNTƒEQU‡18†EVENTEXCEPTIONTYPETVCODEƒEQU‡19ˆ"‡"…CODE TVPC…EQU‡20†PCATEVENT‰(BINARY)%TVTERMƒEQU‡24†TASKTERMINALVOLUMEID%TVNOTEƒEQU‡28†TASKNOTIFICATIONLEVELTVRES„EQU‡30†UNUSED2BYTES*1***************************************************ˆTASKBUFFERS*=LTASKBUFEQU‡$100†(256BYTEBUFFERPERTASK:FORMATFOLLOWS)BUFD…EQU‡0‰D0-D7BUFA…EQU‡$20‡A0-A6BUFUSPƒEQU‡$3C‡A7BUFPC„EQU‡$40‡PCBUFSR„EQU‡$44‡SRBUFMASK‚EQU‡$46‡EXMONMASKBUFSTAT‚EQU‡$4A‡TASKSTATUSBUFDO„EQU‡$4E‡DIRECTIVEOPTIONSBUFLOCƒEQU‡$50‡LOCATIONBUFVALƒEQU‡$54‡VALUEBUFVM„EQU‡$58‡VALUEMASKBUFCNTƒEQU‡$5C‡MAXCOUNT+BUFENDƒEQU‡$60‡THISVARIABLENOTREFERENCEDBUFLAST‚EQU‡$64‡NOTUSED.BUFSAVE‚EQU‡$68‡PCSTOPPEDONNEEDSBREAKPOINT%BUFDOSA‚EQU‡$6C‡USER'SCURRENTOPTIONBUFSVSOREQU‡$70‡NOTUSED)BUFBPCNTEQU‡$74‡BREAKPOINTCOUNT2BYTES3BUFBPTBLEQU‡$76‡BREAKPOINTTABLE104BYTEENTRIES'BFBPTBLEEQU‡$9E‡BREAKPOINTTABLEEND+18BUFBPSAVEQU‡$9E‡BREAKPOINTSAVETABLE‚104BYTEENTRIESCBUFBPREPEQU‡$C6‡BREAKPOINTREPETITIONCOUNTSNOTUSED(102BYTES)&BUFRRCNTEQU‡$DA‡OFFSETREGISTERCOUNT8BUFRRTBLEQU‡$DC‡OFFSETREGISTERVALUES(8LONGWORDS)BUFEND$$EQU‡$FC‰PAGE**ˆREGISTERCONVENTIONS**ˆA0ˆSCRATCHD0*ˆA1ˆA(TASKBUFFER)†D1*ˆA2œD2*ˆA3œD3*ˆA4ˆA(CURTASKVECTOR)ƒD4*ˆA5ˆA(INQKEYBDBUFF)ƒD5*ˆA6ˆA(DATAAREA)ˆD6&*ˆA7ˆA(STACK)ŒD7ˆINDEXTOCRTMESSAGES*4SYMBUGƒLEA‡STACK(PC),A7ŽESTABLISHUSERSTACKPOINTER‰LEA‡B(PC),A6’PICDATABASEREG/‰MOVEM.LƒD0-D7/A0-A7,TASKREGS-B(A6)*SAVEREGS0‰MOVE.L„A0,EXMONAME-B(A6)…*SAVEDEBUGGER'SNAME+‰MOVE.L„A0,ASQB-B(A6)‰*INITASQPARABLOCK7‰MOVE.L„A0,PBGETSG-B(A6)†*TASKNAMETOGTSEGPARMBLOCK1‰MOVE.L„A1,DECRT-B(A6)ŠSAVEDEBUGCRTVOLUMENAME,‰LEA‡EXASR(PC),A0ˆPUTA(ASR)INASQBŒ1/25/82 ‰MOVE.L„A0,ASQASRV-B(A6)¢1/25/82,‰LEA‡TASKLDR(PC),A0Š*INITIALIZETARGETTASK$‰MOVE.L„D2,LDVOL$L(A0)†*VOLUMENAME ‰MOVE.W„D3,LDUID$W(A0)†*USERID)‰MOVEM.LƒD4-D5,LDCAT$L(A0)ƒ*CATALOGNAME‰MOVE.L„D1,$04(A0)$‰MOVE.L„D1,$0E(A0)Š*MONITORSESSION‰MOVE.L„D1,STARTTSK+4-B(A6)‰MOVE.L„D1,STARTTSK+$0E-B(A6)(‰CLR.L…D7”D7ISINDEXTOMESSAGEVECTORS‰BSR‡MSG05VERSIONMESSAGE'‰MOVE.L„#1,D4*ASSUMESINGLETASKMODE%‰CMP.L…D4,D6*COMLINELENGTHPASSED?/‰BGT.S…IN.012Ž*YES-IMPLIESSINGLETASKDEBUG**ˆGETMEMORYFORTASKS*,IN.010ƒBSR‡MSG01*PROMPTFORMAX#OFTASKS‰BSR‡KEYIN*GETKEYBOARDREPLY#‰LEA‡INQ-1(PC),A1Œ*A(ASCIISTRING)‰CLR.L…D0’*OFFSET‰BSR‡DEC2BIŽ*CONVERTTOBINARY ‰TST.W…D4"‰BLE‡IN.010ŽZEROTASKSNOTALLOWED#‰CMP.B…#19,D4Ž*VALIDATETASKCOUNT&‰BGT‡IN.010Ž*INVALID-REISSUEPROMPT>*N.012ƒMOVE.L„#EDITFILE+$400,D0†LOGICALADDRFORGETSG…1/25/82=******ƒN‚O‚T‚Eƒ******‚CURRENTEDITFILELENGTHIS$3F6ˆ1/25/82*ˆAND.L…#$FFFFFF00,D0¥1/25/82!*ˆMOVE.L„D0,SEGADDR-B(A6)¢1/25/82!*ˆMOVE.L„D0,TASKBUF-B(A6)¢1/25/823IN.012ƒMOVE.W„D4,MAXTCNT-B(A6)†*MAXIMUMTASKCOUNT,‰ASL.L…#5,D4*TIMES32=LTHOFVECTORAREA-‰MOVE.L„D4,SEGLTH-B(A6)‡*TOGTSEGPARMBLOCK6‰MOVE.L„D4,TASKBUF-B(A6)†*ADJUSTBUFFERSTARTADDRESS+‰ASL.L…#3,D4*TASKBUFSIZE=#TASKS*256+‰ADD.L…D4,SEGLTH-B(A6)‡*TOTALSEGMENTSIZE+‰MOVE.L„#GTSEG,D0‹*GTSEGDIRECTIVECODE=1‰LEA‡PBGETSG(PC),A0"‰TRAP†#1’*ATTACHMEMORYFORTASKS‰BNE.S…FATAL01XŒ*UNSUCCESSFUL?‰MOVE.L„A0,SEGADDR-B(A6)„*PHYSICALADDROFGTSEGBLOCK1/25/82>‰MOVE.L„A0,FORTASK-B(A6)„ANTICIPATETHEATTACHOFTHE1STTASK2‰M7 OVE.L„A0,D0ADDREQUIRESADATAREGISTER‚1/25/822‰ADD.L…D0,TASKBUF-B(A6)„A(1STTASKBUFFER)Œ1/25/82*‰MOVE.W„MAXTCNT-B(A6),D0Š*NUMBEROFTASKS‰SUB.W…#1,D0*INDEXFORDBRA,‰MOVE.L„TASKBUF-B(A6),A1Š*FIRSTTASKBUFFER%IN.020ƒCLR.L…(A0)+…*CLEARTASKFIELD"‰CLR.L…(A0)+…*CLEARSESSIONFIELD3‰CLR.L…8(A0)…*CLEAREVENTFIELDSESPECIALLYTVEXEC1‰MOVE.L„A1,(A0)ƒ*SAVEAPPROPRIATEBUFFERADDRESS(‰ADD.L…#LTSKVECT-8,A0†*NEXTTASKVECTOR,‰ADD.L…#LTASKBUF,A1ˆ*ADVANCETONEXTBUFFER,‰DBRA†D0,IN.020‹*LOOPTOCLEARTASKVECTORS* *ˆGETANASQ*†MOVE.L‚#GTASQ,D0…GETANASQ,†LEA…ASQB(PC),A0‡ASQPARAMETERBLOCKADDRESS†TRAP„#1 †BEQ.S‚IN.030 †CMP.W‚#8,D0†BNE.SˆFATAL01 ‡CMP.W‚#6,D0 †BEQ.S‚IN.030†ALREADYHASASQ-OK †CMP.W‚#3,D0†BNE.SˆFATAL03ƒBADPARMBLOCK"†BRA.SˆFATAL02ƒBADTARGETTASKNAME:FATAL01XMOVE.L„#'TCB',ERMES1N-B(A6)ALTERMEMORYMESSAGE‰BRA.S…FATAL01'FATAL05‚ADD.L…#4,D7…ADJUSTMSGTOMSG15'FATAL04‚ADD.L…#4,D7…ADJUSTMSGTOMSG14'FATAL03‚ADD.L…#4,D7…ADJUSTMSGTOMSG13'FATAL02‚ADD.L…#4,D7…ADJUSTMSGTOMSG12;FATAL01‚BSR‡MSG11…HANDLESMSG11,12,13,14WITHD7ADJUSTMENT$DONE…MOVE.L„#TERM,D0‚TERMINATEEXMON‰TRAP†#1ˆTHAT'SALLFOLKS**ˆCLAIMBREAKS*&IN.030ƒCLR.W…BREAK-B(A6)‚SETNOBREAKS‰LEA‡IOIN(PC),A0>‰MOVE.L„IOSFCT(A0),D5SAVEFUNCTION&OPTIONSFORBREAKSERVICE*‰MOVE.L„#$01200200,IOSFCT(A0)CLAIMBREAKS‰LEA‡TENSHUN(PC),A1¤1/25/82-‰MOVE.L„A1,IOSCAD(A0)SERVICEADDRESS•1/25/82‰TRAP†#28‰MOVE.L„D5,IOSFCT(A0)RESTORENORMALCYTOIOSPARMBLOCK‰TST.L…D0ŒDIDITWORK?‰BEQ.S…IN.040ˆYES‰BSR‡MSG23‰TELLUSERNOBREAKS*&IN.040ƒLEA‡INQ(PC),A0…A(COMLINEPARMS)‰CMP.W…#1,D6†SINGLETASKMODE?0‰BLE‡PROMPT„NOCOMLINEIMPLIESMULTITASKINGMODE1‰BSR‡LOADTASK†PROCESSCOMLINELOADREFERENCETASK%‰MOVE.L„A0,A5…PRETENDPARMLINEISINQ ‰BSR‡ATCHTASK6‰BRA‡PROMPT„GODEBUGSINGLETASKMODE(NOWAITNEEDED)‰PAGE**ˆASR‚ROUTINESINNEXT5PAGES*"EXASR„MOVE.L„#RDEVNT,D0„READEVENT"‰LEA‡EVNTBLK(PC),A0…RECEIVINGAREA‰TRAP†#1%‰BNE‡MSG15‹EVENTREADFAILED‚(NOASQ) $*ˆEVENTCODE…TYPEEVENTŒEXMONACTION,*Š3ŒUSERTASKCREATEDƒ-SHOULDNOTSEETHESE*Š4ŒTIMEOUTEVENT‡-‚"†"ƒ"„"1*Š5ŒTERMINATIONEVENTƒ-DETACHSUBTASKFROMEXMON,*Š7ŒSERVERTASKEVENTƒ-SHOULDNOTSEETHESE2*Š8ŒEXCEPTIONEVENT…-NORMALTYPE:SUBTASKHALTED*™#1’SUBTASKATTACHTOEXMON*™#2’SUBTASKDETACHFROMEXMON%*™#3’SUBTASKHALTED(BREAKPOINT,etc.) ?‰CMP.B…#5,EVNTCODE-B(A6)…*SEEIFTASKTERMINATEDBEFOREDETACH ‰BEQ‡EXITASR5‰CMP.B…#8,EVNTCODE-B(A6)ƒ*NORMALTYPEEVENT?Š1/25/821‰BNE‡EX.019ŽNO-WHATSHALLWEDO?THROWITAWAY?5‰MOVEM.LƒEVNTTASK-B(A6),A2-A3†SAVETASKNAME&SESSION7‰MOVE.B„EVNTETYP-B(A6),D0‰GETEXCEPTIONEVENTTYPECODE!‰CMP.B…#2,D0CHECKEXCEPTIONTYPE*‰BGT‡EXEVNT†CODE3=NORMALEXCEPTIONEVENT‰BEQ‡EXDET‡CODE2=DETACH‰PAGE**ˆATTACHEVENT*EXATT„EQU‚*‹CODE1=ATTACH3‰MOVE.W„MAXTCNT-B(A6),D0ƒMAXNUMBEROFTASKVECTORS(‰MOVE.L„SEGADDR-B(A6),A4†A(TASKVECTORS),‰MOVE.B„#$20,D2‰PSEUDOEVENTCODEFORATTACHEX.002ƒTST.L…(A4)ŒTESTANENTRY‰BEQ.S…EX.005ŠEMPTY-USEIT#‰CMPA.L„(A4),A2TASKBEINGSTOPPED?-‰BEQ.S…EX.004ŽYES-ALTERTOPSEUDOEVENT#1F/‰ADD.W…#LTSKVECT,A4ˆA(NEXTVECTORSLOT)‹1/25/82 ‰SUB.L„#1,D0 ‰BNE‡EX.002)‰MOVE.L„A2,NUTASKNM-B(A6)ƒNAMETOMESSAGE‰BSR‡MSG20TASKLIMITMESSAGE‰BRA‡EXITASRGETOUT >FOREGRNDMOVE.L„A4,FORTASK-B(A6)†MAKETHISTHEFOREGROUNDTASK6‰MOVE.L„(A4),QUEST3N-B(A6)„INITIALIZEPROMPTTASKNAMES‰MOVE.L„(A4),QUEST1N-B(A6)‰RTS)EX.004ƒMOVE.B„#$1F,D2STOPPEDMESSAGEKEY.EX.005ƒMOVE.B„D2,EVNTECOD-B(A6)ƒTOEVENTBLOCK#‰MOVE.L„TVBUF(A4),A1ŒA(TASKBUFFER),‰MOVEM.LƒA2-A3,(A4)…SAVETASKNAME&SESSION2‰MOVE.L„TERMINAL-B(A6),TVTERM(A4)ƒSAVETERMINALID6‰MOVE.L„#$10000,TVNOTE(A4)‚NOTELEVEL=1‚&PRIORITY=04‰TST.W…CURTCNT-B(A6)‰FOREGROUNDTASKEXISTS?…1/25/82‰BNE.S…EX.007ŽYES)‰BSR‡FOREGRNDŒNO-MAKETHISTASKFORTASK9EX.007ƒADD.W…#1,CURTCNT-B(A6)†ONEMORETASKNOWINEFFECT/‰MOVE.L„#EXMMSK,D0„SETEXMONMASKFORTHISTASK(‰LEA‡XMSKB(PC),A0„ADDRESSOFPARA.BLOCK7 ‰MOVE.L„A2,(A0)…COPYTASKNAME,‰MOVE.L„8(A0),BUFMASK(A1)ˆSAVEMASKFORTASK‰TRAP†#1‰BEQ.S…EX.009†GOODRETURN"‰CMP.W…#1,D0„SEEIFBADPARABLOCK‰BEQ‡FATAL03‚BRANCHIFBAD‰BRA‡FATAL02‚BADTARGETTASK9EX.009ƒMOVE.L„8(A4),A0ƒ*GETADDRESSOFBUFFERTOBEUSED+‰MOVE.L„#LTASKBUF-1,D0‰*CLEANUPTHEBUFFEREX.010ƒCLR.B…(A0)+‰DBRA†D0,EX.010‰BRA.S…READSTAT‡SERVICEMESSAGE#EX.019ƒBSR‡MSG19…UNKNOWNEVENTTYPE‰BRA‡EXITASRƒTHROWITAWAY‰PAGE**ˆDETACHEVENT*:EXDET„BSR.S‚FINDTASK„LOCATEEVNTTASKINVTASKVECTORTABLE‰BRA.S…EXDET1„SUCCESSFUL‰BRA.S…UNKNOWNƒNOTFOUNDERROR:EXDET1ƒMOVE.W„#7,TVNOTE(A4)‚FORCEDETACHMESSAGEFROMTELL=******ƒCLR.L‚(A4)†FOUNDTASK-REMOVEITƒ[willbedoneinTELL] ‰CLR.L‚TVSESS(A4)ˆREMOVESESSION0‰SUB.W‚#1,CURTCNT-B(A6)‚REMOVEFROMNO.OFTASKS3‰MOVE.B„#$21,EVNTECOD-B(A6)ƒINDEXTODETACHMESSAGE$‰BRA.S‚GOTSTAT…SENDDETACHEDMESSAGE *0*ˆSUBROUTINEFINDEVNTTASKINVTASKVECTORTABLE*GFINDTASKMOVE.L„SEGADDR-B(A6),A4ƒASSUMESA2-A3HOLDEVNTTASK&EVNTSESS*‰MOVE.W„MAXTCNT-B(A6),D1„NUMBEROFENTRIESFINDVTƒCMP.L…(A4),A2…SAMETASK?‰BNE.S…NEXTVT‡BRANCHIFNO"‰CMP.L…TVSESS(A4),A3ŠSAMESESSION?‰BEQ.S…GOTVECTˆBRANCHIFSAME@NEXTVTƒADD.W…#LTSKVECT,A4…BUMPPASTLASTENTRYLOOKEDATƒ1/25/82‰SUB.W…#1,D1†DECREMENTCOUNTER‰BNE.S…FINDVT†CHECKANOTHER9‰ADD.L…#2,(A7)„NOTFOUNDEXITALTERSRETURNADDRONSTACK2GOTVECT‚RTSŒFOUNDTASK(A4=VECTORENTRYINVTASKS)‰PAGE**ˆNORMALEVENT*DEXEVNT‚BSRFINDTASK‡SEARCHVTASKSFOREVNTTASKRETURNSONLYIFFOUND!‰BRA.S…READSTAT‚FOUNDTASKVECTOR%UNKNOWN‚BSR‡MSG26…TASKNAMENOTFOUND ‰BRA‡EXITASR *-*ˆREADTASKSTATEANDPROCESSEXCEPTIONEVENT*1READSTATMOVE.L„#RSTATE,D0ƒSETUPFORREADSTATUS‰MOVE.L„A4,A0…USETASKVECTOR†TRAP‚#1)†BEQ.S‚GOTSTAT‰TASKSTATEREADSUCCESSFULER1ƒCMP.W‚#2,D0†BEQ„FATAL03‰BADPARMBLOCK †CMP.W‚#3,D0+†BEQ„FATAL02‰TASKNONEXISTENTORPRIVILEGED †CMP.W‚#10,D0'†BEQ„FATAL03‰TASKNOTATTACHEDTOEXMON†BRA„FATAL04‰BADBUFFERADDR*GOTSTAT‚MOVE.L„TVBUF(A4),A1…BUFFERADDRESS>‰MOVE.W„EVNTECOD-B(A6),TVEVNT(A4)‚SAVECODE&TYPEFORDISPLAT7‰MOVE.L„BUFPC(A1),D2ˆPCWILLSTAYIND2FORASRROUTINE.‰MOVE.L„D2,TVPC(A4)‹SAVEPCOFEXCEPTIONEVENT,‰CLR.B…TVEXEC(A4)ŽTASKFLAGGEDNOTEXECUTING**†CHECKTRACEANDBREAKPOINT*#‰MOVE.B„EVNTECOD-B(A6),D0‰GETEVENT#‰MOVE.B„D0,TVAGE(A4)ˆFLAGNEWEVENT‰BNE.S…NOTRAP0ISNONZEROFLAG3‰MOVE.B„#$FF,TVAGE(A4)†FORCEFLAGNONZEROFORTRAP0%NOTRAP0‚CMP.B…#28,D0ŽSEEIFTRACEONE‰BNE.S…NOTRACENOCHECKIFBP)‰CMP.W…#$1800,BUFDO(A1)„STEPPINGPASTBP?‰BNE.S…NOTBPNO-REGULARTRACE<‰MOVE.L„BUFSAVE(A1),BRKBUF-B(A6)YES-INSTALLOMITTEDBRKPT4‰MOVE.W„BUFDOSA(A1),BUFDO(A1)RESTORENORMALOPTIONS‰LEA‡BPVALUE(PC),A0ž1/25/829‰MOVE.L„A0,BRKSOR-B(A6)…A(BRKPT)ISFROMADDROFMOVELL„"#‰MOVE.L„#MOVELL,D0ŠMOVELLDIRECTIVE"‰LEA‡BRKPBP(PC),A0‹A(MOVELLPARMS)3‰MOVE.L„(A4),12(A0)‰DESTINATIONTASKNAMETOPARMBLK!‰TRAP†#1’PUTBREAKPOINTBEHINDUS‰BNE‡ERLLUNSUCCESSFUL&‰CMP.W…#$1000,BUFDO(A1)„ISHETRACING?"‰BEQ.S…NOTBPYES-DOTRACEOUTPUT/‰CLR.B…TVAGE(A4)‹SUPPRESSTELLOFTRACE1EVENT0RERUN„BSR‡RUN‰TASKCONTINUESEXECWITHBRKPTSIN0‰BRA.S…EXITASRRETURNFROMEVENTWITHOUTMESSAGE NOTRACE‚CMP.B‚#22,D0ƒSEEIFBP‰BNE.S‚NOTBP’NO &‰MOVE.W„BUFBPCNT(A1),D5…GETLOOPCOUNT'‰LEA‡BUFBPTBL(A1),A2…A(FIRSTBREAKADDR)"VALIDBP‚CMP.L…(A2)+,D2ŒTHISBRKPT?‰BEQ.S…BPFOUNDYES‰SUB.W…#1,D5LASTBPENTRY?‰BNE‡VALIDBPNOTYET(‰BRA.S…NOTBPYES-HAVETRUEPRIV.INST.9BPFOUND‚MOVE.B„#$22,TVAGE(A4)†INDEXTOBREAKPOINTMESSAGE/NOTBP„CMP.W…#$2102,EVNTECOD-B(A6)„SEEIFDETACH'‰BEQ.S…EXITASRBREAKPTSALREADYREMOVED !‰MOVE.W„BUFBPCNT(A1),D1‡GETCOUNT‰BEQ.S…EXITASR„NOBPTOREMOVE&‰LEA‡BUFBPTBL(A1),A3‚A3GOESTOBRKBUF%REMOVEBPLEA‡BUFBPSAV-BUFBPTBL(A3),A2 ‰CMP.W…#$1000,BUFDO(A1)„TRACING?‰BNE.S…PURGEBPNO,‰CMP.L…(A3),D2YES-THISINSTABREAKPOINT?,‰BNE.S…PURGEBPNO-WILLTELLTRACEDMESSAGE6‰MOVE.B„#$22,TVAGE8 (A4)†YES-CHANGEMESSAGETOBREAKPT2‰MOVE.B„#22,TVEVNT(A4)†PRETENDWEHITABREAKPOINT.PURGEBP‚BSR‡CLRALL†RESTORECODEWHILEINEXMON‰ADD.L…#4,A3‡POINTTONEXTBP ‰SUB.W…#1,D1$‰BNE.S…REMOVEBPƒBRANCHIFMORETODO +EXITASR‚MOVE.L‚#RTEVNT,D0„RETURNFROMEVENT‰LEA1,A0ENABLEASRSTATUS‰TRAP#1L*---------------------------------------------------------------------------L*/////////////////// EXECUTION PATH RESUMES FOLLOWING WTEVENT //////////////:*///////////////////ˆENDOFASRDRIVENCODEŒ//////////////L*---------------------------------------------------------------------------*)*ˆATTENTIONEVENT…(BREAKKEYSTRUCK!!!!)*(TENSHUN‚MOVE.L„#RDEVNT,D0ŒREADTHEEVENT‰LEA‡ATTEVNT(PC),A0‰TRAP†#1)‰BTST†#SETBRK,BREAK-B(A6)„WANTIOBREAKS?‰BEQ‡EXITASRBRANCHIFNO*‰BSET†#GOTBRK,BREAK-B(A6)ƒGOTANI/OBREAK‰BRA‡EXITASRRETURNFROMEVENT PAGE**ˆTELLUSERABOUTRECENTEVENTS*.TELL…MOVE.L„SEGADDR-B(A6),A4ŠFIRSTTASKVECTOR#‰MOVE.W„MAXTCNT-B(A6),D6ŠLOOPCOUNT)‰CMP.W…#1,MAXTCNT-B(A6)„SINGLETASKMODE?%‰BNE.S…TELLMOREŒNO-WAITNOTIMPLIED-‰TST.B…TVEXEC(A4)ŠYES,BUTISHEINEXECUTION0‰BEQ.S…TELLMOREŒNO-THENPROMPTWITHOUTWAITING+‰MOVE.L„#WTEVNT,D0ŠNOPROMPTUNTILANEVENT‰TRAP†#1&TELLMORETST.L…(A4)TASKINTHISSLOT?‰BEQ.S…NEXTELLNO‰CLR.L…D2’PREPAREINDEXREG$‰MOVE.B„TVAGE(A4),D2ˆNEWEVENTFLAG?!‰BEQ.S…NEXTELLNONEFORTHISTASK*‰BGT.S…TELLMSGUSEFLAGASINDEXTOMESTYP&‰ADD.B…#1,D2TRAP0MSGHASFLAGOF$FF"TELLMSG‚CLR.B…TVAGE(A4)‹CLEARFLAG6‰MOVE.L„TVBUF(A4),A1ˆESTABLISHBUFFERADDRFORGETRRID ‰CMP.B…#$22,D2BREAKPOINTEVENT?,‰BNE.S…NOTFORENO-SKIPNOTELEVELANALYSIS&‰MOVE.W„TVNOTE(A4),D1‡CHECKNOTELEVEL%‰BEQ.S…NEXTELL=0MEANSNOMSG&HALT ‰CMP.W…#2,D13‰BEQ.S…ISFOREŽ=2MEANSMSG&HALT&SETTOFOREGRND"‰BLT.S…NOTFORE=1MEANSMSG&HALT-‰BSR‡INSTALL=3OR4MEANSCONTINUEEXECUTION‰BSR‡RUN$‰MOVE.L„#$22,D2INSTALLCLOBBEREDD2,‰CMP.W…#3,D1EXECRESTARTEDCHECKIFMESSAGE&‰BEQ.S…NOTFORE=3MEANSMSG&CONTINUE)‰BRA.S…NEXTELL=4MEANSNOMSG&CONTINUE&ISFOREƒBSR‡FOREGRNDŒYES-NOTELEVEL=25NOTFORE‚MOVE.L„(A4),OUTTASK-B(A6)„TASKNAMETOMESSAGE,‰LEA‡OUTEVNT(PC),A0ŠA(MESSAGEVARIABLEPART).‰LEA‡MESTYP(PC),A5‹BASEADDROFEVENTMSGTABLE)‰LSL.L…#4,D2SHIFTINDEXTOMESTYPOFFSET$‰ADD.W…D2,A5A(MESSAGETOBECOPIED)1‰MOVE.L„(A5)+,(A0)+‰COPYEVENTMSGTOOUTPUTAREA‰MOVE.L„(A5)+,(A0)+‰MOVE.L„(A5)+,(A0)+.‰MOVE.L„(A5)+,(A0)+‰ALLMESSAGES16BYTESLONG‰MOVE.L„TVPC(A4),D0‰GETPC)‰LEA‡OUTPC(PC),A3ŒOUTPUTLOCATIONADDRESS4‰BSR‡GETRRIDƒ*GETRELOCATIONREGISTERIDANDOFFSET‰BSR‡MSG03‡PRINTEVENTMESSAGE(‰CMP.W…#7,TVNOTE(A4)JUSTDETACHEDTASK?‰BNE.S…NEXTELLƒNO6‰CLR.L…(A4)†YES:EMPTYTASKVECTORSLOTNOW!!!!!!!!!!!!@NEXTELL‚ADD.W…#LTSKVECT,A4ˆCHECKNEXTTASKFORNEWEVENT1/25/82#‰SUB.W…#1,D6‡DONEALLTASKVECTORS?‰BGT‡TELLMORE„NOTYET‰RTS PAGE**ˆGETNEXTCOMMAND*&WHAT…BSR‡TELLˆINTERJECTEVENTMESSAGES0‰LEA‡MSG00(PC),A5„SAYWHAT(WITHPROMPT)Œ1/25/82‰BRA.S…PROMPTER(PROMPTƒBSR‡TELLˆINTERJECTEVENTMESSAGES5‰LEA‡MSG02(PC),A5„ASKFORNEXTSYMBUGCOMMAND‡1/25/82&PROMPTERJSR‡(A5)PRINTMSG00ORMSG02$‰CLR.W…BREAK-B(A6)SETNOI/OBREAKS2‰MOVE.L„FORTASK-B(A6),A4ŠA(FOREGROUNDTASKVECTOR))‰MOVE.L„TVBUF(A4),A1ˆA(TASKSTATEBUFFER)‰BSR‡KEYINREADINPUTMESSAGE**ˆSEEIFNORMALCOMMAND*‰BSR‡PARSVERBŒGETIT$‰BGT.S…HAVEVERBŒBRANCHIFVERBFOUND0‰CMP.W…#$1000,BUFDO(A1)„CRINPUT--ISHETRACING?‰BEQ‡TRACINGYES!‰BRA‡WHAT†ERRORRETURNBADSYNTAX!HAVEVERBCMP.L…#4,D1…4=MAXLENGTH‰BGT‡WHAT†TOOLONG-ERROR&‰LEA‡VTBL(PC),A2‚ADDRESSOFVERBTABLE+‰LEA‡VTBLE(PC),A3‚ENDOFVERBTABLE1/25/82(FINDVERBCMP.L…(A2)+,D0‚LOOKFORAMATCH‰BEQ.S…DOVERB„BRANCHIFAMATCH(‰CMP.L…A3,A2…SEEIFENDOFTABLE•1/25/82‰BNE.S…FINDVERB‚BRANCHIFMORE**ˆSEEIFREGISTERCOMMAND*'‰CMP.B…#'.',VFLD-B(A6)‚REGISTERPREFIX? ‰BNE‡WHAT†NOTAREGISTERCOMMAND‰CMP.L…#3,D1…SEEIFLENGTHIS3"‰BNE‡WHAT†REGCOMMANDWRONGLENGTH&‰LEA‡STATBL(PC),A2ƒLOOKFORMO8 REVERBS-‰LEA‡STATBLE(PC),A3‚ENDOFVERBTABLE‹1/25/82‰ROR.L…#8,D0…GETREGIDIND0.W'FINDREG‚CMP.W…(A2)+,D0ƒLOOKFORAMATCH‰BEQ.S…DOREG†BRANCHIFAMATCH‰ADDQ†#2,A2†BUMPPASTINDEX(‰CMP.L…A3,A2†SEEIFENDOFTABLE”1/25/82‰BNE.S…FINDREGƒBRANCHIFMORE‰BRA‡WHAT„DIDN'TFINDAMATCH**ˆFOUNDNORMALCOMMAND*5DOVERBƒADD.L‚#BRATBL-VTBL-4,A2‚ACTUALADDRESS”1/25/82‰JMP‚(A2)„GOTHEREBRATBLƒBRA‡GOˆGO-RETURNTOTASK!‰BRA‡GOˆ'GO'ISEQUIVALENTTO'G'‰BRA‡TRACE…TRACEEXECUTION ‰BRA‡TRACE…TISEQUIVALENTTOTR‰BRA‡ASTOP…ADDRESSSTOPCOMMAND#‰BRA‡BRK‡BREAKPOINTSETORDISPLAY‰BRA‡BRKCLR„CLEARBREAKPOINT‰BRA‡DISPLY„TRACEDISPLAY‰BRA‡DMEM†DISPLAYMEMORY‰BRA‡SMEM†MEMORYSET!‰BRA‡QUIT†QISEQUIVALENTTOQUIT4‰BRA‡QUIT…TERMINATEDEBUGSESSION&ASSOCIATEDTASKS)‰BRA‡RELREG„*DEFINERELOCATIONREGISTERS ‰BRA‡HELP"‰BRA‡HELP†HEISEQUIVALENTTOHELP-‰BRA‡DEFAULTƒDISPLAY&CHANGEPRINTERDEFAULT‰BRA‡LOADˆLOADTASK‰BRA‡ATTACH†ATTACH&STARTTASK"‰BRA‡DETACH†DETACHTASKFROMEXMON‰BRA‡STARTASK„STARTTASK‰BRA‡HALTTASK„STOPTASK‰BRA‡TASKˆSETREFERENCETASK!‰BRA‡MASKˆALTEREXMONMASKREMOTE‰BRA‡EVENT‡CREATEEVENTREMOTE‰BRA‡TERMIN†TERMINATEREMOTE$‰BRA‡WAITER†NOPROMPTWAITFOREVENT$‰BRA‡STAT†REQUESTORSETTASKSTATUS**ˆFOUNDREGISTERCOMMAND*"DOREG„MOVE.W„D0,D2ƒSAVESTATETYPE!‰MOVE.W„(A2),A2‚GETBUFFEROFFSET,‰ADD.L…A1,A2‚ADDRESSOFSTATETYPEINBUFFER‰BSR‡PARSV‚GOGETVALUE(‰BEQ‡ONEDISƒNOVALUE-GODISPLAYCONTENTS+‰CMP.W…#9,D1‚CHECKFORVALIDLENGTH•1/25/82!‰BPL.S…WHAT.01‚BRANCHIFTOOLONG-‰CMP.W‚STATBL+$44-B(A6),D2‚SEEIF2BYTETYPE ‰BEQ.S…SHORTREGƒBRANCHIF2BYTE$‰CMP.W…STATBL+$50-B(A6),D2‚SEEAGAIN ‰BEQ.S…SHORTREGƒBRANCHIF2BYTE‰MOVE.L‚D0,(A2)ƒSAVEVALUE$PROM.01‚BRA„PROMPT‚SEEIFMOREINPUT)SHORTREGMOVE.W‚D0,(A2)„SAVE2BYTEVALUE7‰CMP.W‚STATBL+$50-B(A6),D2…SEEIFOPTIONSBEINGCHANGED"‰BNE…PROM.01ŒBRANCHIFNOTOPTIONS&‰CMP.W#$1800,D0ISNEWOPTIONS$1800?‰BNE.SƒNEWOPTƒBRANCHIFNOT1‰MOVE.WBUFDOSA(A1),(A2)RESTOREPREVIOUSOPTIONS-WHAT.01‚BRA…WHAT‚CAN'TDO$1800(BREAKPOINTS)9NEWOPTƒMOVE.W„D0,BUFDOSA(A1)†UPDATECURRENTOPTIONSFIELD ‰BRA‡PROM.01 PAGE**ˆGO*!GO‡CLR.W…BUFDO(A1)SETOP=$0000‰BSR‡PARSV…GETSTARTADDR‰BEQ.S…GOEX†NOSTARTADDR,‰MOVE.L„D0,BUFPC(A1)ˆINITPCWITHSTARTADDR &GOEX…BSR.S…INSTALLƒINSTALLBREAKPOINTS1‰BSR.S…RUN‡DOPSTATE&REXMONDIRECTIVESFORTASK ‰BRA‡PROMPT +RUN†TST.B…TVEXEC(A4)‚TASKINEXECUTIONNOW?6‰BNE.S…RAN‰YES-CANNOTSTARTSECONDPATHOFEXECUTION!‰MOVE.L„#PSTATE,D0‚PUTTASKSTATE+‰MOVE.L„A4,A0‡USETASKVECTORASPARMBLOCK‰TRAP†#1ŠUPDATEMASK,PC,ETC.‰BNE‡ER1#‰LEA‡REXPB(PC),A0ŒREXMONPARMBLOCK#‰MOVE.L„(A4),(A0)‹COPYTASKVECTORS‰MOVE.L„4(A4),4(A0)‰MOVE.L„8(A4),D01‰ADD.L…#BUFDO,D0„COMPUTEADDRESSOFEXMONOPTIONS‰MOVE.L„D0,8(A0),‰MOVE.B„#1,TVEXEC(A4)FLAGTASKINEXECUTION/‰MOVE.L„#REXMON,D0„RUNTASKUNDEREXMONCONTROL‰TRAP†#1‰BEQ.S…RUNNINGƒSUCCESSFUL0‰CMP.W…#15,D0„CHECKFORBADVALUELOCATIONERROR‰BNE‡ER1‡NO-SOMEOTHERERROR%‰BSR‡MSG17…BADVALUELOCATIONMESSAGERUNNING‚MOVE.L„#DELAY,D0"‰MOVE.L„#100,A0ƒDELAYFOR1/10SEC5‰TRAP†#1ˆHOPINGTHEEVENTWILLOCCURBEFOREWEPROMPTRAN†RTS‰SPC‡3(INSTALL‚MOVE.W„BUFBPCNT(A1),D5‡GETCOUNT‰BEQ.S…INSTALLDŽBRANCHIFNONE(‰TST.B…TVEXEC(A4)ŒTASKNOWINEXECUTION?,‰BNE.S…INSTALLDŽYES-BREAKPOINTSALREADYIN‰LEA‡BPVALUE(PC),A21/25/82*‰MOVE.L„A2,BRKSOR-B(A6)‡PUTSOURCE’1/25/82-‰LEA‡BUFBPSAV-4(A1),A2…BREAKPOINTSAVEBUFFER'‰MOVE.L„A2,BRKGET-B(A6)‡GETDESTINATION"‰MOVE.L„#2,BRKGET+4-B(A6)…LENGTH=2‰MOVE.L„#2,BRKBUF+4-B(A6)-‰LEA‡BUFBPTBL(A1),A2‡BREAKPOINTADDRESSTABLE)‰MOVE.L„BUFPC(A1),D2ŠPCSAVEDFORCOMPARE-INSTALBPMOVE.L„(A2),BRKPBUF-B(A6)„GETSOURCE*‰MOVE.L„(A2)+,BRKBUF-B(A6)„PUTDESTINATION&‰ADD.L…#4,BRKGET-B(A6)‡GETDESTINATION‰LEA‡BRKPBG(PC),A0‹GET,‰MOVE.L„(A4),(A0)‹COPYTASKNAMETOPARMBLOCK5‰MOVE.L„#MOVELL,D0ŠCOPYTARGETCODETOBUFBPSAVTABLE‰TRAP†#1‰BNE‡ERLLBRANCHIFBAD"‰CMP.L…-4(A2),D2‹B9 REAKPOINTATPC?‰BNE.S…NOTATBPƒNO0‰CMP.B…#22,TVEVNT(A4)†YES,BUTHAVEWETOLDHIM?,‰BNE.S…NOTATBPNO-SOCAUSEABRKPTMESSAGE0‰MOVE.L„D2,BUFSAVE(A1)†YES-SAVETHEPCADDRESS/‰MOVE.W„BUFDO(A1),BUFDOSA(A1)‰SAVEUSEROPTIONS9‰MOVE.W„#$1800,BUFDO(A1)„FORCETRACE1INSTRUCTIONOPTION*‰BRA.S…INSTLNXTŒSKIPINSTALLINGTHISBRKPT:NOTATBP‚LEA‡BRKPBP(PC),A0ŒOVERLAYTASKCODEWITHBREAKPOINT.‰MOVE.L„(A4),12(A0)‰COPYTASKNAMETOPARMBLOCK‰MOVE.L„#MOVELL,D0 ‰TRAP†#1ˆPUT‰BNE‡ERLL†BRANCHIFBADINSTLNXTSUB.W‚#1,D5%‰BNE.S‚INSTALBPˆSTILLMORETOINSTALL*INSTALLDRTS‘ALLBREAKPOINTSAREINSTALLED .TRACE„MOVE.W„#$1000,BUFDO(A1)„SETTRACEOPTION‰BSR‡PARSVGETTRACECOUNT‰BEQ.S…TRACINGNOTRACECOUNT;‰MOVE.W„#$0800,BUFDO(A1)„CHANGEOPTOTRACEMODEWITHCOUNT!‰MOVE.L„D0,BUFCNT(A1)‡COUNTINMC TRACING‚BRA‡GOEXBEGINEXECUTION9ASTOP„MOVE.W„#$2000,BUFDO(A1)„SETOPTIONSTOSTOPONADDR‰BSR‡PARSVGETADDRLOCATION+‰BEQ‡TRACINGUSECURRENTVLLOCATION&MASK)‰MOVE.L„D0,BUFLOC(A1)‡SETNEWVLLOCATION=‰MOVE.L„#$FFFFFFFF,BUFVM(A1)‚MASKLONGWORDIFADDRSPECIFIED/‰BSR‡PARSVGETVALUEIFSTOPONADDREQUALMODE%‰BEQ‡TRACINGSTOPONADDRCHANGEMODE4‰MOVE.L„D0,BUFVAL(A1)‡STOPONADDREQUALMODENEWVA4‰MOVE.W„#$3000,BUFDO(A1)„ALTEROPTOADDREQUALMODE‰BRA‡TRACINGSTARTEXECUTION HELP…BSR‡MSG28PRINTHELPSCREEN‰BRA.S…PROM.02ISSUEPROMPTDEFAULT‚MOVE.L„#6,D0LOOP-1(‰LEA‡DEFMSG(PC),A0‹COPYDEFMSGTOQUEST24‰LEA‡QUEST2(PC),A1‹TOACCOMPLISHOUTPUTW/INPUTMODEDEFCOPY‚MOVE.L„(A0)+,(A1)+‰DBRA†D0,DEFCOPY‰BSR‡MSG01TELLCURRENTDEFAULT‰BSR‡KEYINACCEPTNEWSETTING$‰LEA‡AP(PC),A2ASSUMEATTACHPRINTER(‰MOVE.B„(A5),D2FIRSTLETTEROFRESPONSE‰CMP.B…#'Y',D2SETECHO=YES?‰BEQ.S…ECHOSET‰CMP.B…#'N',D2SETECHO=NO?(‰BNE.S…PROM.02LEAVEECHOMODEUNALTERED"‰LEA‡DP(PC),A2CALLDETACHPRINTER,ECHOSET‚CMP.B…ECHOOPT-B(A6),D2ŠSAMESETTING?‰BEQ.S…PROM.02YES+‰MOVE.B„D2,ECHOOPT-B(A6)„ALTERECHODEFAULT"‰JSR‡(A2)ATTACHORDETACHPRINTER‰BRA.S…PROM.02**ˆTASKRELATEDCOMMANDS*$LOAD…MOVE.L„A5,A0…A(TASKNAMEININQ)'‰MOVE.L„#20,D6„PSEUDOCOMLINELENGTH=20=‰BSR‡LOADTASK‚PERFORMLOAD&PASSCOMLINETOUSERTASK1/25/82!PROM.02‚BRA‡PROMPT„REISSUEPROMPTJ*=========================================================================/ATTACHƒBSR‡PARSVERB‚PARSEFORTASKNAME(IFANY)!‰BNE.S…ATTDEF„NOTDEFAULTFORTASK&‰MOVE.L„(A4),D0ƒUSETHEFORGROUNDTASK6ATTDEFƒMOVE.L„D0,TASKLDR-B(A6)†TASKNAMETOBEATTACHED0‰BSR‡ATCHTASK‚ATTACHTASK&PASSLUNS&STARTIT ‰BRA‡PROM.02J*=========================================================================STARTASKBSR‡GETNAME-STARTNXTTST.L…(A4)†TASKEXISTSINTHISSLOT?‰BEQ.S…STARTSKP‚NO1‰MOVE.L„TVBUF(A4),A1‚YES-USEITSA(TASKBUFFER)(‰BSR‡INSTALLƒINSTALLBREAKPOINTSINTASK‰BSR‡RUN‡STARTEXECUTION8STARTSKPCMP.L…#'ALL',VFLD-B(A6)„COMMANDFORALLTASKS?‰BNE‡PROM.02ƒNO5‰ADD.W…#LTSKVECT,A4ˆPOINTTONEXTTASKVECTOR…1/25/82‰SUB.W…#1,D3…REDUCETASKCOUNT‰BNE‡STARTNXT‚CONTINUE#‰BRA‡PROM.02ƒALLTASKSINEXECUTIONJ*=========================================================================HALTTASKBSR‡GETNAMEHALTMORETST.L…(A4)TASKHERE?‰BEQ.S…HALTSKIPŒNO-TRYNEXT(‰TST.B…TVEXEC(A4)ŠYES-ISITEXECUTING?#‰BEQ.S…HALTSKIPŒNO-LEAVEITALONE-‰MOVE.L„A4,A0USETASKVECTORASSTOPPARMBLK‰MOVE.L„#STOP,D0ŒSTOPDIRECTIVE‰TRAP†#1'‰BEQ.S…HALTEDŽTASKSTOPPEDSUCCESSFULLY ‰BSR‡LD.021ŽREPORTTRAP#1ERROR-‰BRA.S…HALTSKIPŒONTOTHENEXTIFHALT"ALL"1HALTEDƒCLR.B…TVEXEC(A4)ŠTASKNOTNOWINEXECUTION#‰MOVE.L„TVBUF(A4),A1ˆA(TASKBUFFER)‰MOVE.L„(A4),A2SAVETASKNAME$‰BSR‡DETACHTTEMPORARILYDETACHTASK5‰MOVE.L„A2,(A4)UNERASETASKNAMEINVECTORFORATTACH4‰MOVE.L„A4,A1A1MUSTPOINTATTASKNAMEFORREDYTASK‰BSR‡REGLESSSTARTWITHOUTREGS4‰BSR‡REDYTASKŒATTACH&STARTTASK(WON"TBEGINEXEC))‰BSR‡STATISŽRSTATEFORCURRENTREGVALUES+HALTSKIPCMP.L…#'ALL',VFLD-B(A6)‚STOPALL?'‰BNE.S…PROM.03NO-SINGLETASKSTOPPED,‰ADD.W…#LTSKVECT,A4ˆ9 STEPTONEXTTASKVECTOR&‰SUB.W…#1,D3LOOPONGETNAME'SMAXTCNT4‰BNE‡HALTMOREŒLOOPUNTILUNSUCCESSFUL(FORALLMODE)‰BRA.S…PROM.03RETURNTOPROMPTK*==========================================================================(TASK…BSR‡GETNAMEGETTASKNAME(REQUIRED)%‰BSR‡FOREGRNDŒMAKEITFOREGROUNDTASK1‰CMP.B…#$0D,-1(A5)‰NOTELEVELPARAMETERSUPPLIED?‰BEQ‡PROMPTŽNO ‰BSR‡PARSVPARSEFORLEVELVALUE5‰MOVE.W„D0,TVNOTE(A4)‡ALTERNOTELEVELINTASKVECTOR‰BRA.S…PROM.03H*=======================================================================&MASK…BSR‡GETNAMEƒGETTASKNAME(IFANY)‰MOVE.L„#1,D1…SETMASKBIT‰BSR‡PARSV…PARSEFORBITVALUE&‰TST.L…D0ˆRETURNEDEXCEPTIONBITVALUE'‰BEQ.S…MASKXORƒD1CURRENTLY=1‚(BIT#0)‰LSL.L…D0,D1…SHIFTMASKBIT1MASKXOR‚MOVE.L„TVBUF(A4),A1„USENAMEDTASKBUFFER1‰EOR.L…D1,BUFMASK(A1)†INVERTSELECTEDBITINMASK‰LEA‡XMSKB(PC),A0‚A(PARMBLOCK)‰MOVE.L„(A4),(A0)COPYTASKNAME‰MOVE.L„4(A4),4(A0)ƒANDSESSION(‰MOVE.L„BUFMASK(A1),8(A0)ƒNEWMASKVALUE‰MOVE.L„#EXMMSK,D0ŠDIRECTIVE‰TRAP†#1.‰MOVE.L„#$01FFFFF1,8(A0)„RESTORESTANDARDMASKPROM.03‚BRA‡PROMPTH*=======================================================================EVENT„BSR‡GETNAME%‰BSR‡PARSV…PARSEFOREVENTCODEVALUE&‰LEA‡ASQB(PC),A0ƒREUSETHISPARMBLOCK‰MOVE.L„(A4),(A0)COPYTASKNAME+‰CLR.W…8(A0)…USEDEFAULTASROFTARGETTASK2‰SUB.W…#12,A7„MAKEROOMONSTACKFOREVENTŒ1/25/82(‰MOVE.L„A7,10(A0)A(EVENT)TOPARMBLOCK7‰MOVE.W„#$0C08,(A7)‰NORMALEXCEPTIONEVENTPUTONSTACK ‰MOVE.L„(A4),2(A7)ŠCOPYTASKNAME%‰MOVE.L„SESSION-B(A6),6(A7)Š&SESSION)‰MOVE.B„D0,10(A7)‹EXCEPTIONCODEOFEVENT%‰MOVE.B„#$03,11(A7)‰NORMALEVENTTYPE*‰MOVE.L„#QEVNT,D0‹DIRECTIVECODEFORQEVNT‰TRAP†#1#‰ADD.W…#12,A7ŽCLEANUPSTACK‘1/25/82‰TST.L…D0’CHECKSUCCESS‰BEQ‡PROM.03OK!‰BSR‡MSG24FAILED ‰BRA‡PROM.03G*======================================================================TERMINƒBSR‡GETNAME"‰BSR‡QUITTERTERMINATETARGETTASK ‰BRA‡PROM.03H*=======================================================================)DETACHƒBSR‡DETACHTDETACHTASKFROMEXMON ‰BRA‡PROM.03H*=======================================================================9WAITERƒMOVE.L„#WTEVNT,D0ŠWAITFOREVENTWITHOUTEXMONI/O&‰TRAP†#1’ALLOWSTARGETTASKTOUSECRT.‰BRA‡PROM.03NOWREADYTOISSUEDEBUGCOMMANDSH*=======================================================================STAT…BSR‡GETNAME'‰TST.L…FLDL-B(A6)ŠDISPLAYMODE?‘1/25/82‰BEQ.S…DISPLATYES#‰CMP.B…#$0D,-1(A5)‰STATUSPROVIDED?‰BEQ‡WHATSYNTAXERROR‰BSR‡PARSVERB‚GETSTATUSTEXT(‰LEA‡ADX+4(PC),A0‚TABLEOFTASKSTATUSES'‰LEA‡ADXEND(PC),A2A(TABLEEND)˜1/25/82#NXTSTAT‚CMP.L…(A0)+,D0‚FINDSTATUS?0‰BEQ.S…SETSTATƒYES-DORM,REDY&WAKELEGALARGS"‰CMP.L…A2,A0…ENDOFTABLE?›1/25/82‰BNE‡NXTSTATƒNO‰BRA‡WHAT†STATUSSYNTAXERRORSETSTAT‚SUB.L…A2,A0­1/25/82‰ADD.L…#SLEEP+8,A0§1/25/82‰JMP‡(A0)†JUMPTOSTATUSVECTORSLEEP„MOVE.L„#STOP,D0‰BRA.S…TRAPPER1‚DOTRAP1CALLAWAKE„MOVE.L„#START,D0‰BRA.S…TRAPPER1@UNWAITƒMOVE.L„#WAKEUP,D0DOWAKEUPTOSETSTATUSREADYFROMWAIT)TRAPPER1LEA‡STARTTSK(PC),A0‰A(PARMBLOCK)‰MOVE.L„(A4),(A0)‹COPYTASKNAME3‰MOVE.W„#$8000,8(A0)ˆNOREGINITIALIZATIONONSTART ‰TRAP†#1’DOWAKEUP,STARTORSTOP$‰MOVE.W„#$A000,8(A0)ˆRESTOREOPTIONS‰TST.W…D0’DIDITWORK?‰BEQ.S…DISPLATSUCCESSFUL‰BSR‡LD.021ŽREPORTTRAP1ERRORPROM.04‚BRA‡PROMPTDISPLAT‚BSR‡MSG29PRINTSTATHDR.‰MOVE.L„SEGADDR-B(A6),A4ŠSTARTOFTASKVECTORS'‰MOVE.W„MAXTCNT-B(A6),D2ŠMAXTASKCOUNTDIS.005‚TST.L…(A4)TASKHERE?‰BNE.S…DIS.007YES-SHOWIT8DIS.006‚ADD.W…#LTSKVECT,A4ˆNEXTTASKVECTORSLOT‰1/25/82%‰SUB.L…#1,D2LOOPONALLTASKVECTORS‰BNE‡DIS.005CONTINUE&‰BRA‡PROM.04ALLTASKSSTATUSREPORTEDDIS.007‚LEA‡SPACES(PC),A3‰MOVE.L„#19,D0ŽLOOPCOUNT-1;DIS.010‚MOVE.L„SPACES-B(A6),-(A3)ˆBLANKDMOUTAFOR80BYTES‰DBRA†D0,DIS.010‰MOVE.L„(A4),(A3)‹COPYTASKNAME"‰MOVE.L„TVSESS(A4),4(A3)‹&‚SESSION$‰TST.B…TVEXEC(A4)ŠTASKINEXECUTION?‰BEQ.S…DIS.012NO,‰MOVE.B„#$65,9(A3)ŠY: ES-FLAGeBEFORESTATEDIS.012‚LEA‡ADX(PC),A0/‰MOVE.B„TVCODE(A4),D0‡INDEXTOA,D,XTYPEEVENT ‰EXT.W…D02‰MOVE.B„0(A0,D0.W),17(A3)ƒEVENTIDTOPRINTBUFFER‰MOVE.B„TVEVNT(A4),D0 ‰BSR‡CONV"‰MOVE.W„D0,18(A3)‹ASCIIEVENTCODE‰TST.B…TVAGE(A4)‰BEQ.S…DIS.015OLDEVENTFLAG"‰MOVE.B„#'!',20(A3)‰FLAGNEWEVENT/DIS.015‚CMP.L…FORTASK-B(A6),A4ŠFOREGROUNDTASK?‰BNE.S…DIS.020NO‰MOVE.B„#'<',15(A3)‰YES/DIS.020‚MOVE.W„TVNOTE(A4),D0‹NOTIFICATIONLEVEL‰OR.B†#$30,D0CONVERTTOASCII‰MOVE.B„D0,16(A3)‹TOBUFFER$‰BSR.S…STATISŽRSTATEFORTASKSTATUS ‰LEA‡ADX+4(PC),A0ŒA(STATETABLE)!‰MOVE.L„BUFSTAT(A1),D1†TCBSTATUS‰BMI.S…DIS.030ISDORMANT ‰ADD.L…#4,A0‰BTST.L„#20,D1ŽREADYBITIS#20‰BNE.S…DIS.030TASKISREADY ‰ADD.L…#4,A09DIS.030‚MOVE.L„(A0),10(A3)‰LITERALSTATUSTOPRINTBUFFER"‰LEA‡DMOUTA+22(PC),A3ˆA(OUTPUTPC)‰LEA‡20(A4),A2‹BINARYPC‰BSR‡MOVETCONVERTPCTOASCII+‰LEA‡DMOUTA+32(PC),A3ˆSPACEPASTNOTELEVEL/‰LEA‡BUFPC(A1),A2ˆCONVERSIONADDRISCURRENTPC‰BSR‡MOVETPCNOWTOBUFFER‰BSR‡MOVE2SRTOBUFFER‰BSR‡MOVETEXMONMASKTOBUFFER#‰BSR‡MOVETTCBHEXSTATUSTOBUFFER‰BSR‡MOVE2OPTIONSTOBUFFER6‰MOVE.L„TVTERM(A4),(A3)…COPYCRTTERMINALIDTOBUFFER‰BSR‡MSG30REPORTSTATUS‰BRA‡DIS.006CONTINUE -STATISƒMOVE.L„A4,A0TASKVECTORISPARMBLOCK*‰MOVE.L„#RSTATE,D0ŠREADCURRENTTASKSTATE‰TRAP†#1‰BNE‡ER1‘FATALERROR%‰MOVE.L„TVBUF(A4),A1ˆTASKBUFFERADDR‰RTS*5*ˆFINDTASKNAMEININPUTBUF&LOCATEINTASKVECTORS*6GETNAME‚MOVE.L„FORTASK-B(A6),A4ŠASSUMEFOREGROUNDTASK!‰BSR‡PARSVERB‚TASKNAMESPECIFIED?3‰BEQ.S…GETFOREƒNO-USEFOREGROUNDDEFAULTTASKNAME+‰MOVE.L„D0,A2…YES-MOVELITERALNAMETOA2,‰MOVE.L„SESSION-B(A6),A3STANDARDSESSIONID*‰BSR‡FINDTASK‚MATCHNAMEWITHTASKVECTORS$‰BRA.S…GETRTS„FOUNDNAME(A4ISSET)(‰CMP.L…#'ALL',D0„COMMANDFORALLTASKS?‰BNE.S…GETWHO„NO-SYNTAXERROR5‰MOVE.L„SEGADDR-B(A6),A4ŠSTARTWITHFIRSTTASKVECTOR5‰MOVE.W„MAXTCNT-B(A6),D3ŠWILLHAVETOCHECKALLSLOTS0GETRTSƒRTS‘A5NOWPOINTSPASTTASKNAMEDELIMITER(GETWHOƒBSR‡MSG26…REPORTUNKNOWNTASKNAME&‰ADD.L…#4,A7…POPRETURNADDROFFSTACK‰BRA‡WHAT†EXIT-SYNTAXERROR?GETFORE‚MOVE.L„(A4),VFLD-B(A6)…NULLTASKNAMEBECOMESFOREGROUND‰BRA‡GETRTSŽNORMALEXIT PAGE**ˆDETACHANDEXIT*#DETACHT‚BSR‡CLRBPˆCLEARANYBPSSET#‰MOVE.W„BUFSR(A1),D0„GETSTATUSREG"‰BCLR†#15,D0†CLEARTRACEBITIFON‰MOVE.W„D0,BUFSR(A1)ƒRESTORESR‰CLR.L…BUFMASK(A1)ƒCLEARMASK‰CLR.W…BUFDO(A1)„CLEAROPTIONS'‰MOVE.L„#PSTATE,D0„SETUPFORPUTSTATE*‰MOVE.L„A4,A0…USETASKVECTORASPARMBLOCK‰TRAP†#1#‰BNE‡ER1PUTSTATEDIRECTIVEFAILED‰MOVE.L„#DEMON,D0*‰TRAP†#1‹A0POINTSTOTASKVECTORASABOVEH*----------------------------ASR ROUTINE GETS DETACH EVENT AT THIS POINT6‰BEQ.S…QUITTING…TASKSTILLRUNNINGUNATTACHEDTOEXMON-‰CMP.W…#1,D0‹IDENTIFYFAILUREERROROFDETACH‰BEQ‡FATAL03‹BADPARMBLOCK‰BRA‡FATAL02‹BADTASKNAME*%*ˆQUITƒ(TERMINATETARGETTASKSFIRST)*GQUIT…MOVE.W„MAXTCNT-B(A6),D1*NUMBEROFTASKTHATMYBEACTIVE(0RE) ‰SUB.W…#1,D1(‰MOVE.L„SEGADDR-B(A6),A4‰*GETTASKLIST0QUIT.01‚BSR.S…QUITTER…TERMINATETHISTARGETTASK2‰ADD.W…#LTSKVECT,A4ƒ*ADVANCETONEXTTASK1/25/82‰DBRA†D1,QUIT.01‰BRA‡DONE*TERMEXMON (QUITTER‚TST.L…(A4)†*ANYTASKNAMEHERE?‰BEQ.S…QUITTING‚*NO*‰MOVE.L„#TERMT,D0ƒ*TERMINATEDIRECTIVEID*‰MOVE.L„A4,A0‡COPYPARAMETERBLOCKADDRESS‰TRAP†#1"QUITTINGCLR.L…(A4)ˆCLEARTASKNAME ‰CLR.L…TVSESS(A4)‚SESSIONNUMBER‰RTS‘TERMINATEDONETARGETTASK‰PAGE**…DISPLAYREGISTERS*3DISPLYƒMOVE.L„A1,A2…REGISTERFROMADDRESSFORMOVER‰LEA‡D0D7(PC),A5ˆPREFIXADDR2DISPREGSBSR‡CLEAN…BLANKOUTBUF&SETA3=A(OUTBUF))‰MOVE.L„(A5)+,(A3)+„COPYPREFIXTOOUTBUF‰MOVE.L„(A5)+,(A3)+‰BSR‡MOVERŠCONVERTFIRST4REGS=‰MOVE.B„SPACES-B(A6),(A3)+ƒEXTRASPACEBETWEEND3&D4ORA3&A4‰BSR‡MOVERŠCONVERTNEXT4REGS‰BSR‡MSG05…PRINTREGS-‰CMP.B…#'A',OUTBUF-B(A6)‚FINISHEDA0-A7REGS?‰BNE.S…DISPREGS‡NO-GODOTHEM$‰BSR‡CLEANŠYES-NOWCONVERTPC&SR‰MOVE.L„: SRPREFIX-B(A6),12(A3)‰MOVE.L„PCPREFIX-B(A6),(A3)+ ‰BSR‡MOVEPC‰BSR‡MOVE2ŠMOVESR ‰BSR‡MSG05PROM.09‚BRA‡PROMPT‡RETURN**…DISPLAYONEVALUE**ONEDISƒLEA‡OUTSTAT(PC),A3ŠA(OUTPUTBUFFER))‰MOVE.L„SPACES-B(A6),4(A3)ˆBLANK2NDHALF6‰LEA‡MOVE2(PC),A5ˆANTICIPATE2BYTECONVERSION‚1/25/82-‰CMP.W…STATBL+$44-B(A6),D2„SEEIF2BYTETYPE‰BEQ.S…ONEDIS1†BRANCHIF2BYTE‰CMP.W…STATBL+$50-B(A6),D2‰BEQ.S…ONEDIS1.‰LEA‡MOVET(PC),A5ˆDO4BYTECONVERSIONŠ1/25/822ONEDIS1‚JSR‡(A5)†CONVERTTOASCII&PUTINOUTSTAT‰BSR‡MSG04‡PRINTMESSAGE‰BRA‡PROM.09…SEEIFANYMORE‰PAGE‰LISTE* ROUTINE: GETRRID - TO FIND HIGHEST RELOCATION REGISTER THAT IS JUST*ŠLESSTHANGIVENADDRESS#* IN : D0 = ADDRESS TO BE CONVERTED*†A3=OUTPUTBUFFERADDRESS.*OUT:†PRINTSADDRESSW.R.T.ARELOCATIONREG.*GETRRID‚MOVEM.LƒD1-D3/A2,-(A7)&‰CLR.L…D1ˆ*TOSAVERELOCATIONADDRESS‰CLR.L…D2ˆ*LOOPINGCOUNTER‰CLR.L…D3ˆ*REL.REG.ID-‰TST.W…BUFRRCNT(A1)ˆ*ANYREL.REG.DEFINED?‰BEQ.S…ID.040„*NO*‰LEA‡BUFRRTBL(A1),A2…*WHEREREL.REGSARE5ID.010ƒCMP.L…(A2),D0ƒ*GIVENADDRESS7)LEGAL*‰LEA‡BUFRRTBL(A1),A2…*GETTABLEBEGINNING(‰LSL.L…#2,D0…*COMPUTEOFFSETFROMREG#‰MOVE.L„(A2,D0),D0ŠGETADDRESS‰RTS+RRBAD„ADD.L…#4,A7ŠPOPRETURNADDROFFSTACK‰BRA‡WHAT‹SYNTAXERROR PAGE**ˆPRIMITIVECOMMANDS*BRK†BSR‡PARSVGETADDRESS2‰BNE.S…BRKNEWŽIFADDRESSGIVENTHENININSERTMODE2‰MOVE.W„BUFBPCNT(A1),D4…HEREIFBREAKPOINTDISPLAY%‰BEQ.S…PROM.05NOBREAKPOINTSDEFINED(‰LEA‡BUFBPTBL(A1),A2„ADDRESSOFBPTABLE6BRKDISP‚BSR‡CLEAN‡BLANKSTOOUTPUTLINE(A3=A(OUTBUF)))‰MOVE.L„#5,D3‡LIMIT5BPSOUTPUTPERLINE.BRKDNXT‚MOVE.L„(A2)+,D0„GETBREAKPOINTADDRESS-‰BSR‡GETRRID…GETRELREG.IDANDOFFSETIND0‰SUB.W…#1,D4‡DIDONE(‰BEQ.S…BRKSHOW…BRANCHIFDONE-PRINTLINE‰SUB.L…#1,D3‡COUNTIT$‰BNE‡BRKDNXT…BRANCHIFROOMFORMORE#BRKSHOW‚BSR‡MSG05‡PRINTBREAKPOINTS‰TST.W…D4ŠSEEIFMORETODO!‰BNE‡BRKDISP…BRANCHIFMORETODOPROM.05‚BRA‡PROMPT†DONE +BRKADDR‚TST.B…TVEXEC(A4)‚TASKINEXECUTION?0‰BEQ.S…GETADDR…NO-ALLOWEDTOALTERBREAKPOINTS@REJEXEC‚BSR‡MSG27‡YES-BREAKPOINTSINSTALLEDANDLOCKEDMESSAGE‰LEA‡PROMPT(PC),A0Ÿ1/25/82(‰MOVE.L„A0,(A7)…RETURNTOPROMPT–1/25/82‰RTSGETADDR‚CLR.L…D5ŠRESET&‰CMP.B…#'+',-1(A5)RELREGSPECIFIED?1‰BNE.S…GETABS†NO-THENGIVENADDRESSISABSOLUTE‰MOVE.L„D0,D5‡SAVEREL.ADDRESS*‰ADD.L…#1,A5‡STEPOVER'R'ININPUTBUFFER‰BSR‡PARSV‡GETREGISTERNUMBER0‰BEQ‡WHATˆREGISTERNUMBEROMITTED-SYNTAXERROR8‰BSR‡GETRRAD…GETAPPROPRIATERELOCATIONREGISTERADDRESS%‰ADD.L…D5,D0‡COMPUTEABSOLUTEADDRESS.GETABSƒLEA‡BUFBPTBL(A1),A2…ADDRESSOFBRTABLE%‰MOVE.W„BUFBPCNT(A1),D5…GET#OFBR'S‰RTS›D0=EFFECTIVEADDRESS 6BRKNEWƒBSR‡BRKADDR…GETEFFECTIVEADDRESSOFBREAKPOINT.‰BEQ.S…BRKSLOT…NOPREVIOUSBREAKPOINTSDEFINED'‰CMP.W…#BPMAX,D5ƒFULLBREAKPOINTTABLE?,‰BLT.S…BRKFIND…NO-SEEIFITALREADYEXISTS0‰BSR‡MSG16‡YES-PRINTBREAKPOINTTABLEFULLMSG ‰BRA‡PROM.05+BRKFIND‚CMP.L…(A2)+,D0ƒSEEIFALREADYTHERE,‰BEQ.S…BRNEWNXTƒYES-SKIPIFALREADYEXISTS‰SUB.W…#1,D5…DECREMENTCOUNTER‰BNE.S…B; RKFINDƒCONTINUESEARCH.BRKSLOT‚MOVE.L„D0,(A2)ƒNEWBREAKPOINTTOTABLE‰ADD.W…#1,BUFBPCNT(A1)„COUNTIT.‰MOVE.L„D0,BRKPBUF-B(A6)‹SEEIFADDRESSEXISTS2‰LEA‡BUFBPSAV-BUFBPTBL(A2),A3ƒA(BREAKPOINTSOURCE)$‰MOVE.L„A3,BRKGET-B(A6)…A(OFSOURCE)(‰MOVE.L„#2,BRKGET+4-B(A6)ƒLENGTHOFMOVE‰MOVE.L„#MOVELL,D0&‰LEA‡BRKPBG(PC),A0‹A(MOVELLPARMBLOCK)‰MOVE.L„(A4),(A0)ˆCOPYTASKNAME!‰TRAP#1—FETCHSOURCEFROMTARGET#‰BEQ.S…BRNEWNXT‚GOODNEWBREAKPOINT!‰CLR.L…(A2)REMOVEBADBREAKPOINT!‰SUB.W…#1,BUFBPCNT(A1)…UNCOUNTIT!‰BSR‡MSG18REPORTBADTARGETADDR.‰BRA.S…PROM.06SKIPANYREMAININGBRKPTSINPUT&BRNEWNXTBSR‡PARSVLOOKFORMOREINPUT‰BNE‡BRKNEWŽHAVEMOREGODOIT(‰BRA.S…PROM.06PROCESSEDALLBREAKPOINTS BRKCLRƒCLR.L…D5ˆFIRSTTIMEFLAG BCLRNXT‚BSR‡PARSV…GOGETAVALUE'‰BNE.S…CLRONE„BRANCHIFWEHAVEAVALUE‰TST.L…D5ˆFIRSTPARSE?"‰BNE.S…PROM.06ƒNO-WE'REALLDONE‰TST.B…TVEXEC(A4)„INEXECUTION?#‰BNE‡REJEXECƒYES-CAN'TDELETENOW+‰BSR.S…CLRBP…NO‚(PARMLESSNOBR=CLEARALL)%PROM.06‚BRA‡PROMPT„RETURN-ALLCLEARED DCLRBP„MOVE.W„BUFBPCNT(A1),D1…breakpointsmustbeclearatthispoint#‰BEQ.S…CLRBP4„EQUALMEANSNOBPSET&‰LEA‡BUFBPTBL(A1),A3ƒA3GOESTOBRKBUF5CLRBP2ƒLEA‡BUFBPSAV-BUFBPTBL(A3),A2†A2GOESTOBRKSOR0‰BSR‡CLRALL„DOMOVELLTORETURNSOURCETOTARGET$‰CLR.L…(A2)†ERASEBREAKPOINTADDRESS‰CLR.L…(A3)†ERASESOURCEENTRY*‰ADD.L…#4,A3…STEPTONEXTBREAKPOINTENTRY$‰SUB.W…#1,D1…REDUCEBREAKPOINTCOUNT&‰BNE.S…CLRBP2„LOOPUNTILALLARECLEAR‰CLR.W…BUFBPCNT(A1)ƒCLEARCOUNTCLRBP4ƒRTS–RETURN :CLRONEƒBSR‡BRKADDRƒGETADDRESSOFBREAKPOINTTOBECLEARED‰BEQ‡PROM.06ƒBRANCHIFNONESET2BRKLOOK‚CMP.L…(A2)+,D0‚FINDITINBREAKPOINTTABLE‰BEQ.S…BRKSAMEƒFOUNDIT‰SUB.W…#1,D5…DECREMENTCOUNTER‰BNE.S…BRKLOOKƒLOOKSOMEMORE‰BRA‡WHAT†DIDN'TFINDIT!BRKSAME‚SUB.L…#4,A2…RESETPOINTER<‰MOVE.W„BUFBPCNT(A1),D5ƒGETCOUNTOFACTIVEBRKPTSTHISTASK ‰SUB.W…#1,D5&‰ASL.W…#2,D5ˆOFFSETOFLASTBRKPTADDR‰LEA‡BUFBPTBL(A1),A3‰ADD.W…D5,A3ˆA(LASTBRKPTADDR)>‰MOVE.L„(A3),(A2)„MOVEITTOOVERLAYTHEBRKPTWEARECLEARING%‰CLR.L…(A3)‰CLEAROLDLASTBRKPTADDR!‰SUB.W…#1,BUFBPCNT(A1)„UNCOUNTIT=‰LEA‡BUFBPSAV-BUFBPTBL(A2),A2„A(CORRESPONDINGENTRYINBPSAV)5‰LEA‡BUFBPSAV-BUFBPTBL(A3),A3„A(OLDLASTSOURCESLOT)6‰MOVE.L„(A3),(A2)†MOVETOSOURCESLOTOFBRKPTCLEARED&‰CLR.L…(A3)‹CLEAROLDLASTSOURCESLOT-‰BRA‡BCLRNXTˆCONTINUEPARSINGPARMSUNTILEOLI*========================================================================;DMEM…MOVE.L„A7,STACKBRK-B(A6)ƒSAVESTACKPOINTERFORBREAKS(‰BSET†#SETBRK,BREAK-B(A6)TAKEIOBREAKS‰BSR‡PARSVGETLOCATION‰BEQ‡WHATMDREQUIRESANADDR)‰BSR‡GETADDRADJUSTADDRIFREGSPECIFIED(‰MOVE.L„D0,BRKPBUF-B(A6)„DISPLAYADDRESS ‰AND.L…#1,D0ODDADDRCORRECTION‰LEA‡OUTBUF(PC),A0Ÿ1/25/82#‰ADD.L…A0,D0RECEIVINGADDR1/25/82#‰MOVE.L„D0,BRKGET-B(A6)„A(DMBUFFER)‰BSR‡PARSVGETLENGTH‰BNE.S…DMLTHBRANCHIFAVALUE#‰MOVE.L„#$10,D0DEFAULTLENGTH=16/DMLTH„ADD.L…#15,D0ŽROUNDUPTO16BYTEMULTIPLE%‰ASR.L…#4,D0NUMBEROF16BYTEBLOCKS‰MOVE.L„D0,D6BLOCKLOOPCOUNT+‰MOVE.L„#16,BRKGET+4-B(A6)‚MOVELENGTHPARMDMFETCH‚MOVE.L„#MOVELL,D0&‰LEA‡BRKPBG(PC),A0‹A(MOVELLPARMBLOCK)‰MOVE.L„(A4),(A0)‹COPYTASKNAME‰TRAP†#1‰BNE‡ERLLERRORHANDLER+‰MOVE.L„BRKPBUF-B(A6),D0ŠSAVESTARTADDRESS$‰LEA‡DMOUTA(PC),A3‹BUFFERTOADDRESS9‰MOVE.L„SPACES-B(A6),8(A3)ˆBLANKPRIORREGRELATEDOFFSET(‰BSR‡GETRRIDƒ*GETREL.REG.IDANDOFFSET)‰LEA‡DMOUTA+60(PC),A0ˆA(ASCIITEXTFIELD).‰MOVE.W„SPACES-B(A6),(A0)+ˆSPACESBEFOREASCII.‰MOVE.L„BRKGET-B(A6),A2‹SOURCETOBECONVERTED‰MOVE.W„#15,D4ˆCONVERT16BYTES!DMBYTEƒMOVE.B„(A2)+,D0†GETABYTE‰CMP.B…#$20,D0‰BLT.S…DMDOT‰BRANCHIF$00-$1F‰CMP.B…#$7E,D0‰BGT.S…DMDOT‰BRANCHIF$7F-$FF ‰MOVE.B„D0,(A0)+†AS-ISTOOUTPUT‰BRA.S…DMHEX‰GODOHEX(DMDOT„MOVE.B„#'.',(A0)+„UNPRINTABLEBYTE"DMHEX„BSR‡CONVŠBYTETOASCII--HHLL‰CMP.W…#7,D4‰ATMIDDLEOFHEX?‰BNE.S…DMMID‰BRANCHIFNO&‰MOVE.B„SPACES-B(A6),(A3)+‚EXTRASPACEDMMID„ROR.W…; #8,D0‰LLHH‰MOVE.B„D0,(A3)+†HH‰LSR.W…#8,D0‰00LL‰MOVE.B„D0,(A3)+†LL ‰MOVE.B„SPACES-B(A6),(A3)+‚BLANK(‰DBRA†D4,DMBYTE…LOOPTOCONVERT16BYTES‰BSR‡PRORTY‡PRINTORTYPE&‰CMP.W…#11,LINCNT-B(A6)„CLOSETOEDGE?‰BGE.S…DMNOPAG‡BRANCHIFNOT‰BSR‡PAGEŠGOTOTOP5DMNOPAG‚ADD.L…#16,BRKPBUF-B(A6)†NEXTADDRESSTOPRINT‰SUB.L…#1,D6‰MOREBLOCKSTODO?‰BNE‡DMFETCH‡BRANCHIFYES%‰BSR‡PRNTBLNKŒABLANKLINETOPRINTER‰BSR‡PRNTBLNKŒANDANOTHER&‰CMP.W#15,LINCNT-B(A6)ˆCLOSETOEDGE?‰BGT.S…PROM.07BRANCHIFNOT ‰BSR‡PAGETOPOFFORMTOPRINTER+PROM.07‚BRA‡PROMPTŽBACKFORANOTHERCOMMANDG*======================================================================SMEM…BSR‡PARSVƒGETREL.REG.ID‰BEQ‡WHAT„SMREQUIRESARGUMENTS ‰BSR‡GETADDR"‰MOVE.L„D0,BRKBUF-B(A6)„TOADDRESS!‰AND.L…#1,D0CHECKIFODDADDRESS‰LEA‡OUTBUF(PC),A2Ÿ1/25/82'‰ADD.L…D0,A2ADJUSTFORODDNESSŒ1/25/82,‰MOVE.L„A2,BRKSOR-B(A6)„FROMADDRESS“1/25/82‰CLR.L…D2„BYTECOUNTERSMGET„BSR‡PARSV„GETAVALUE‰BNE.S…SMLTH„BRANCHIFALENGTH%‰TST.L…D2’SEEIFWEEVERHADALENGTH"‰BEQ.S…WHAT.05BRANCHIFNOLENGTH$‰MOVE.L„D2,BRKBUF+4-B(A6)ƒBYTECOUNT‰MOVE.L„#MOVELL,D0‰LEA‡BRKPBP(PC),A0!‰MOVE.L„(A4),12(A0)‰COPYTASKNAME‰TRAP†#1‰BNE‡ERLL‡MOVELLERROR‰BRA.S…PROM.08„RETURN*SMLTH„MOVE.B„D0,(A2)+„SAVEVALUEINBUFFER‰ADD.L…#1,D2ƒCOUNTIT‰BRA.S…SMGETƒGETANOTHERVALUEI*========================================================================!RELREGƒBSR‡PARSV…*LOOKFORVALUE9‰BNE.S…RRNEW…*LENGTHSPECIFIED-THENMUSTBEDEFINITION*‰TST.W…BUFRRCNT(A1)ˆ*CHECKIFANYDEFINED!‰BEQ.S…PROM.08ƒ*NONE-THENEXIT*‰LEAˆBUFRRTBL(A1),A2ˆ*WHERERRVALUESARE)‰MOVE.B„#'0',D2ƒ*RELO.REGISTERINASCII‰MOVE.L„#RRCOUNT,D4(RRLINEƒBSR‡CLEAN…*CLEANUPOUTPUTBUFFER ‰MOVE.L„#4,D3…*DISPLAY5/LINE+RRDISPƒTST.L…(A2)+…*SEEIFTHISISDEFINED‰BEQ.S…RRNEXT„*NO6‰TST.L…-(A2)…*YES-BACKOFFANDCONVERTTHATADDRESS&‰MOVE.L„#1,D5…*CONVERT1RRATATIME+‰MOVE.B„#'R',(A3)+‚'R'PREFIXTOREGNUMBER‰MOVE.B„D2,(A3)+‚*COPYRRID‰MOVE.W„#'=',(A3)+‰BSR‡MOVES…*CONVERTANDCOPY#‰SUB.L…#1,D3…ONEDONEFORTHISLINE&RRNEXTƒADD.B…#1,D2…*NEXTHIGHERASCII‰SUB.L…#1,D4…*ONEMOREDONE‰BLE.S…RRSHOW„*YES‰TST.L…D3ˆLINEOF5COMPLETE?)‰BGT‡RRDISP„*IFNOTGOBACKGETNEXTONERRSHOWƒBSR‡MSG05ˆDISPLAYRR‰TST.L…D4ˆ*ISALLDONE?‰BGT‡RRLINE„*NO-THENGOBACK(PROM.08‚BRA‡PROMPT„*IFALLDONEGETOUTWHAT.05‚BRA‡WHAT &RRNEW„MOVE.L„D0,D5…*SAVEREL.REG.ID/‰CMP.W…#RRCOUNT,D5‡*LOOKFORTOPLIMITŒ1/25/82‰BHS‡WHAT.05ƒ*REPORTERROR‰BSR‡PARSV…GETOFFSETVALUE%‰BEQ‡WHAT.05ƒ*NO-THENREPORTERROR‰TST.L…D0ˆDELETINGAREGISTER?'‰BEQ.S…RRDEL…YES-SKIPSEARCH&MOVELL/‰LEA‡BUFRRTBL(A1),A2…*WHEREREL.ADDRESSESARE"‰MOVE.L„#RRCOUNT-1,D4‡*MAX.COUNT.RRFINDƒCMP.L…(A2)+,D0‚*SEEIFALREADYDEFINED%‰BEQ‡PROM.08ƒ*YES-THENIGNORETHIS‰DBRA†D4,RRFIND*D* NO MATCH - BUT IT COULD BE NEW DEFINITON OR REDEFINITION - *** BUT6* SEE IF ADDRESS IS WITHIN TARGET TASK'S ADDRESS SPACE*1‰MOVE.L„D0,BRKPBUF-B(A6)†*SOURCELOGICALADDRESS‰LEA‡UTLWORD(PC),A0ž1/25/826‰MOVE.L„A0,BRKGET-B(A6)‡*MOVEINUTILITYWORD†1/25/82'‰MOVE.L„#2,BRKGET+4-B(A6)†MOVELLLENGTH‰MOVE.L„#MOVELL,D0‰LEA‡BRKPBG(PC),A0Ÿ1/25/82‰MOVE.L„(A4),(A0)ˆCOPYTASKNAME‰TRAP†#1‰BNE‡WHAT.05ƒ*REPORTERROR9‰MOVE.L„BRKPBUF-B(A6),D0Š*RESTORED0-IFADDRESSEXISTS ,RRDEL„LEA‡BUFRRTBL(A1),A2…*RRTABLEADDRESS(‰LSL.L…#2,D5…*COMPUTEOFFSETINTOTABLE0‰ADD.L…D5,A2…*GETADDRESSOFSPECIFIEDRRENTRY"‰TST.L…(A2)†*SEEIFITISDEFINED.‰BNE.S…RRPUT…*YES-THENMUSTBEREDEFINITION1‰ADD.W…#1,BUFRRCNT(A1)…*SINCENEW-UPDATECOUNT'RRPUT„MOVE.L„D0,(A2)ƒ*SAVENEWADDRESS"‰BNE‡PROM.08ƒ*DONENOTADELETION3‰SUB.W…#1,BUFRRCNT(A1)‚REDUCECOUNTFORDELETEDREG ‰BRA‡PROM.08 PAGE**ˆASSIGNPRINTER*&AP‡LEA‡PRINTFHS(PC),A0‰PARAMETERBLOCK$‰MOVE.W„#FHASGN,(A0)ˆASSIGNLUN#1EW‰TRAP†#3‰BNE.S…APERRBRANCHIFGOOD)‰MOVE.W„#66,LINCNT-B(A6)…R< ESETLINESLEFT APRTS„RTS**ˆDEASSIGNPRINTER*DP‡BSR.S…PAGELEAVEPAGEATTOP$‰LEA‡PRINTFHS(PC),A0‰PARAMETERBLOCK"‰MOVE.W„#FHCLOS,(A0)ˆCLOSEPRINTER‰TRAP†#3‰BEQ‡APRTSBRANCHIFGOOD(‰LEA‡ERMES11(PC),A5ŠCAN'TDETACHPRINTER1‰MOVE.W„#'DE',(A5)ŠALTERERRORMSGFORDETACHERRAPERR„BSR‡MSG216‰MOVE.W„#'AT',(A5)Š"HARMLESS"GARBAGEAFTERATTACHERR‰BRA‡APRTSRETURN**ˆPRINTORTYPEDM*0PRORTYƒCMP.B…#'N',ECHOOPT-B(A6)ƒAREWEPRINTING?‰BNE.S…PRORTY1ŽBRANCHIFYES;NOWTYPE‚CMP.L…4(A7),D1ƒSPACES?‚REENTRYPOINTTOECHOONCRT‰BEQ.S…PSPACESƒYES‰BSR‡MSG30†TYPEWITHOUTECHO ‰RTS’GOBACKPSPACES‚BSR‡MSG31‰RTS-PRORTY1‚MOVE.B„#PRLUN,IOUT+5-B(A6)†SWITCHLUN‰CMP.L…4(A7),D1ƒSPACES?‰BNE.S…PSPACELƒNO ‰BSR‡PSPACES‰BRA.S…PSPACEDƒYESPSPACEL‚BSR‡MSG30ŠPRINTLINE0PSPACED‚MOVE.B„#LDFLUN,IOUT+5-B(A6)…UNSWITCHLUN$‰SUB.W…#1,LINCNT-B(A6)‡ONELINEGONE‰BNE.S…PRORTY20MEANS66‰MOVE.W„#66,LINCNT-B(A6)-PRORTY2‚BCLR†#GOTBRK,BREAK-B(A6)ƒGOTABREAK?(‰BEQ‡NOWTYPEBRANCHIFNOTOECHOTOCRT-‰MOVE.L„STACKBRK-B(A6),A7‹YES--ABORTPRINTING‰BRA‡PROMPTGETNEXTCOMMAND* *ˆTOPOFPAGE*.PAGE…CMP.B…#'N',ECHOOPT-B(A6)ƒAREWEPRINTING?‰BEQ.S…PAGEXBRANCHOUTIFNO‰BSR.S…PRNTBLNKONEBLANKLINE‰CMP.W…#66,LINCNT-B(A6)ˆATTOP?‰BNE.S…PAGE‘BRANCHIFNOTYET PAGEX„RTS**ˆONEBLANKLINE*2PRNTBLNKCMP.B…#'N',ECHOOPT-B(A6)‚AREWEPRINTING?‰BEQ.S…PAGEXBRANCHOUTIFNO‰MOVEM.LƒD1/A3,-(A7)‰BSR‡PRORTYŒLINEGOESOUT‰MOVEM.Lƒ(A7)+,D1/A3‰RTS„PAGE**„MOVEANDCONVERTHEXTOASCII*…A2=FROM‚A3=TO‚D5=HOWMANY*/MOVER„MOVE.L„#1,-(A7)‚PADLENGTHBETWEENFIELDS‰MOVE.L„#4,D5…4FIELDS ‰BRA.S…MOVEMOVED0ƒLEA‡UTLWORD(PC),A2‰MOVE.L„D0,(A2)MOVEPCƒMOVE.L„#1,D5MOVES„MOVE.L„#4,-(A7) ‰BRA.S…MOVEMOVET„MOVE.L„#2,-(A7)‰MOVE.L„#1,D5…ONLY1FIELDMOVE…MOVE.W„(A2)+,D0 ‰BSR.S…CONV‰MOVE.L„D0,(A3)+*‰BRA.S…MOVE2NDƒDO2NDHALFOF4BYTEFIELD MOVE2„MOVE.L„#2,-(A7)‚PADLENGTH‰MOVE.L„#1,D5…ONEFIELDMOVE2ND‚MOVE.W„(A2)+,D0 ‰BSR.S…CONV‰MOVE.L„D0,(A3)+‰ADD.L…(A7),A3ˆADDPADFILLER ‰SUB.L…#1,D5 ‰BNE.S…MOVE‰ADD.L…#4,A7…POPPADOFFSTACK‰RTS*%*„CONVERTTOASCII‚INPUTBITS0-15D0*„OUTPUT‚BITS0-31‚DO*CONV…LSL.L…#4,D0 ‰LSR.W…#4,D0 ‰LSL.L…#8,D0 ‰LSL.L…#4,D0 ‰LSR.W…#4,D0 ‰LSR.L…#4,D0 ‰LSR.W…#4,D0 ‰MOVE.W„#3,D1CONV1„CMP.B…#9,D0 ‰BLS.S…CONV2 ‰ADD.B…#7,D0CONV2„ROR.L…#8,D0‰DBRA†D1,CONV1‰ADD.L…#$30303030,D0 ‰CMP.L…#1,4(A7)ŒCALLEDBYMOVER?(‰BNE.S…CONVRTSNO-RETURNFORD0MOVE.L.‰MOVE.L„#3,D1LOOPCOUNT-1FORBYTEMOVEOFD01ROTATED0ROL.L…#8,D0CIRCULARSHIFTLEFTMOSTBYTE-‰MOVE.B„D0,(A3)+ŒTAKESCAREOFODDA3ADDRESS&‰DBRA†D1,ROTATED0‰DOALL4BYTESOFD00‰ADD.L…#2,(A7)SKIPCALLERSMOVE.LWHICHFOLLOWS CONVRTS‚RTS*3*ˆSENDAMESSAGETOTHESYMBUGCRTTERMINAL(print)*MSG31„ADD.L…#4,D7MSG30„ADD.L…#4,D7MSG29„ADD.L…#4,D7MSG28„ADD.L…#4,D7MSG27„ADD.L…#4,D7MSG26„ADD.L…#4,D7MSG25„ADD.L…#4,D7MSG24„ADD.L…#4,D7MSG23„ADD.L…#4,D7MSG22„ADD.L…#4,D7MSG21„ADD.L…#4,D7MSG20„ADD.L…#4,D7MSG19„ADD.L…#4,D7MSG18„ADD.L…#4,D7MSG17„ADD.L…#4,D7MSG16„ADD.L…#4,D7MSG15„ADD.L…#4,D7MSG14„ADD.L…#4,D7MSG13„ADD.L…#4,D7MSG12„ADD.L…#4,D7MSG11„ADD.L…#4,D7MSG10„ADD.L…#4,D7MSG09„ADD.L…#4,D7MSG08„ADD.L…#4,D7MSG07„ADD.L…#4,D7MSG06„ADD.L…#4,D7MSG05„ADD.L…#4,D7MSG04„ADD.L…#4,D7MSG03„ADD.L…#4,D7MSG02„ADD.L…#4,D7MSG01„ADD.L…#4,D7MSG00„LEA‡MSGADR(PC),A03‰MOVEM.Lƒ0(A0,D7),D0-D1ˆIOSSAD&IOSEAD+1RELADDRS ‰ADD.L…A6,D0+‰ADD.L…A6,D1‘CONVERTRELADDRSTOABSADDRS‰SUB.L…#1,D1‘ADJUSTENDADDR8‰MOVEM.LƒD0-D1,IOUTSAD-B(A6)ƒIOSSAD&IOSEADTOIOUTIOB*1*ˆMESSAGESELECTED:PUTOUTPUTTODEBUGTERMINAL*/DO7OUTR‚LEA‡IOUT(PC),A0†PARAMETERBLOCKADDRESS3‰CMP.W…#8,D7…IMAGEOUTPUTONQUESTMESSAGESŠ1/25/82‰BGT.S…PRINTITƒFORMATTEDMODE-‰OR.W†#IOPIMG,IOSOPT(A0)‚ALTEROPTIONSINIOB!PRINTIT‚CLR.L…D7ˆRESETINDEXTO0‰TRAP†#2‡OUTPUTTHEMESSAGE‰BEQ.S…DO7OUT1†BRANCHIFGOOD‰CMP.B…#ISTABRK,D0BREAK?‰BNE.S< …DO7OUT2BRANCHIFNO%‰BCLR†#SETBRK,BREAK-B(A6)‡TAKEBREAK?‰BEQ.S…DO7OUT2BRANCHIFNO/‰MOVE.L„STACKBRK-B(A6),A7RESTORESTACKPOINTERDO7OUTNLBSR‡MSG31†PRINTSPACES ‰BRA‡PROMPT2DO7OUT2‚BTST†#GOTBRK,BREAK-B(A6)…BREAKBETWEENIO?‰BNE.S…DO7OUT1‘BRANCHIFYES+‰CMP.B…#PRLUN,IOUT+5-B(A6)…AREWEPRINTING?)‰BEQ.S…DO7OUTR‘BRANCHIFYESTOTRYAGAINŸ7§:‰BEQ.S…GETCHREF‚DELIMITEREXIT&‰ADD.L…#1,FLDL-B(A6)…*IFNOTCOUNTIT †RTS„.ƒRETURNGETCHRERƒADD.L‚#2,(A7)„RETURNGETCHREF‚ADD.L‚#2,(A7)„RETURN†RTS PAGE*+*ˆLOADATASKANDLEAVEITINDORMANTSTATE*6*ˆONENTRY:‚A0=A(COMLINEORINQTA= SKNAMETOBELOADED*“D6=COMLINELENGTH*5LOADTASKMOVEM.LƒD0-D7/A0-A6,-(A7)ƒSAVEREGSONSTACK)‰LEA‡FHSTASK(PC),A6ŠFILLEDINBYEDITFILE.‰BSR‡EDITFILEŒEDITVERSADOSFILENAMEINTOFHS‰BMI.S…LD.ERRŽBADFILENAME‰LEA‡B(PC),A6RESTOREBASEREG‰CMP.B…#$0D,D1COMLINEPRESENT?‰BEQ.S…LD.009ŽNO(LD.005ƒCMP.B…#'',(A0)+ŠSCANPASTBLANKS ‰BEQ‡LD.005‰SUB.L…#1,A0ADJUSTTONONBLANKLD.009ƒMOVE.L„A0,D3WORKREG0‰SUB.L…32(A7),D3‹BYTESUSEDOLDCOMLINE(OLDA0)%‰SUB.L…D3,D6REMAININGCOMLINELENGTH)‰MOVE.L„D6,DREG6-B(A6)ˆPASSLENGTHVIAD6+‰MOVE.B„D6,LOADCLL-B(A6)†TOLOADPARMBLOCK‰MOVE.L„A0,D3A(NEWCOMLINE)%‰BTST.L„#0,D3COMLINEATODDADDRESS?‰BEQ.S…LD.012ŽNO‰ADD.L…D6,A0A(ENDOFCOMLINE)‰BRA.S…LD.013ŽADJUSTLOOPCOUNT:LD.011ƒMOVE.B„-(A0),1(A0)‰SHIFTCOMLINEAHEADTOEVENADDRLD.013ƒDBRA†D6,LD.011‰ADD.L…#1,A0A(NEWCOMLINE)3LD.012ƒMOVE.L„A0,LOADCLA-B(A6)†TOLOADERPARMBLOCK/‰MOVE.W„#$A000,STARTTSK+8-B(A6)‰STARTWITHREGS'‰MOVEM.Lƒ(A7)+,D0-D7/A0-A6ƒRESTOREREGS‰LEA‡TASKLDR(PC),A0‰MOVE.L„#1,D0LOADEROPTION‰TRAP†#4’LOADTARGETTASK‰BEQ.S…LD.015ŽSUCCESSFUL-EXIT!‰CMP.W…#6,D0TASKALREADYLOADED?%‰BNE‡LD.024ŽNO-REPORTTRAP#4ERROR1MAKEDORMMOVE.L„(A0),STOPTASK-B(A6)ƒCOPYTASKNAME‰MOVE.L„#STOP,D0ŒSTOPDIRECTIVE$‰LEA‡STOPTASK(PC),A0‰STOPPARMBLOCK!‰TRAP†#1’STOPTASKALREADYLOADED"‰BEQ.S…REGLESSTASKISNOWDORMANT‰CMP.W…#6,D0TASKNOTRUNNING‰BNE‡LD.021ŽREPORTTRAP#1ERROR9REGLESS‚MOVE.W„#$8000,STARTTSK+8-B(A6)‰STARTWITHOUTREGSLD.015ƒRTS›EXIT-LD.ERRƒMOVEM.Lƒ(A7)+,D0-D7/A0-A6ƒRESTOREREGS‰BSR‡MSG22REPORTLOADERROR‰BRA‡LD.015ŽANDEXIT‰PAGE*2*ˆATTACHTARGETTASKTOEXMONANDSTART(READY)IT*/*ˆONENTRY‚A5=A(TERMINALIDFOLLOWINGTASKNAME) =/* =/*†DEL.LF=/*$=/* Link chain file to create DEL.LO=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to DEL.LL=/*=/IFC \1 ƒ=ARGDEL.LL=/ENDIF=/*=LINK ,DEL.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000 INPUT DEL.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé¸DEL…IDNT4,0ˆDELETEPICUTILITY „LLEN120;*************************************************************#*‰PROGRAMNAMEISƒDELU.DATA****ˆ***‡DELETECOMMANDƒ******3*ˆTHISCOMMANDISUSEDTOREMOVEAFILENAMEFROMA1*ˆDISKDIRECTORYANDTODEALLOCATEALLSPACETHAT2*ˆBELONGSTOTHEDELETEDFILE.‚ASINGLEFILENAME,1*ˆALISTOFFILENAMES,ORAFAMILYOFFILENAMES2*ˆWITHTHESAMENAMEPARAMETERSANDREADANDWRITE*ˆPASSWORDSCANBEDELETED.* *ˆREV1.00!*ˆREGISTERSUSED:01234567*’D…********’A…*********=*************************************************************=*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**‰PAGE***ˆINCLUDEFILES***ˆINCLUDE9995.&.FME.EQ*ˆINCLUDE9995.&.IOE.EQ*ˆINCLUDE9995.&.TR1.EQ**‰NOLIST‰INCLUDE9995.&.FME.EQ‰INCLUDE9995.&.IOE.EQ‰INCLUDE9995.&.TR1.EQ‰LIST**‰PAGE****ˆDELETEMODIFICATIONHISTORY****ˆREVISIONCODE‡0701813* *’CONTAINSERRORMESSAGEHANDLER$*’CONTAINSPOSITIONINDEPENDENTCODE-*’CONTAINSCURRENTREVISIONCODEMODIFICATION5*’CONTAINSTERMINATIONLOGICFORUSEWITHCHAINFILES1*’CONTAINSCOMMONSUBROUTINESPULLEDFROMLIBRARY*’USESTHE'SBARG'ROUTINE**‰PAGE***ˆREVISIONCODE‡0901813*0*’CORRECTSTHEFALLTHRUANDATTEMPTEDEXECUTION*—OFTERM_FLGASANINSTRUCTION'*’USESTHECORRECTED'SBARG'SUBROUTINE3*’HASACHARACTERFOLLOWINGTHEINPUTDATASOSBARG&*—WILLHAVEAPOSITIONTOPLACEA'CR'*‰PAGE***ˆREVISIONCODE‡0902813*8*’RE-LINKEDSOTHATALLSECTIONSWILLBEINSEGMENTZERO*‰PAGE***ˆREVISIONCODE‡1112813**’CORRECTPROBLEM…DELFILE.EX,#9*’CORRECTPROBLEM…DEL> FILE.EX;Z‚WHEREZININVALIDOPTION9*’TERMINATETASKPROPERLYWHENANSBARGERRORISRETURNED***‰PAGE"*ˆDELETEƒCOMMANDƒDATASEGMENT*ˆ****‚EQUATEAREA‚******* BEGDATA‚EQU0#STKLENƒEQU25‹STACKLENGTHINWORDS ÁcÊZÒXÚ[âRêZòXúXL TVK"W*R2=)BUFSIZE‚EQU160‰INPUTCOMMANDBUFFERSIZE DSKLU„EQU1!LISTLUƒEQU3‹LISTINGLOGICALUNITTSKNAMƒEQU'DELU'†MYTASKNAMEBN00…EQU‡0‰BITNBR0 ‰SECTION0!‰XREFEDITFILE,PARSE,OPTION,SBARG**‰PAGE**ˆ****‚MACROAREA‚**********ˆNEXTWORDBOUNDRYMACRO*2*******************************************************„DATASEGMENT(DSEG)ƒ****1**************************************************** PBA†EQU**œPROGRAMBASEADDR*‰PAGE;**************************************************************ˆ***ƒDATAAREA‚******:********************************************************** REV_CODE:‰DC.B†'1220844'&*œWHEREREV_CODEISDEFINEDASFOLLOWS *œMMDDYYXZ*3*œMMDDYY=MONTHDAYYEAROFLASTASSEMBLYORPATCH*œX†=REVISIONTYPECODE*¦SPACE=CLEANASSEMBLY *¦P…=PATCHED*¦C…=CUSTOMIZEDPATCHED**#*œZ†=VERSADOSMAJORREVISIONFIELD* ‰DS.LSTKLEN PROGSTK‚EQU**‰DC.L08*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFINISTHEAREATHECOMMANDLINEIS.*ˆ***ƒREADINTOWHENTHISPROGRAMISCALLEDIN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++**BUFFINƒCOMLINEBUFSIZE‚***‚INPUTBUFFER‚***+********************************************+*ˆ**‚IOSPARAMETERTABLEFORDISKREADS‚***6*ˆ**‚REFERTOIOSEQUATESUNDERIOSPARAMETERBLOCK‚***5*******************************************************3*****************************************************ŒIOSPARAMETERTABLE(*ˆSETUPIOS(ERR0R-LOG)‚PARAMETERBLOCK*3****************************************************‰DS.W04‰IOS.OUT6IOWRIT,IOPASC+IOPFOR+IOPWAT,LDFLUN,0,0,0,05‰IOS.OUT6IIOWRIT,IOPASC+IOPIMG+IOPWAT,LDFLUN,0,0,0,0‰PAGE:***********************************************************8*ˆFHSPARAMETERTABLEFORCHANGELOGICALUNITASSIGNMENT5*ˆCHANGEISFROM6TO3-SENDSOURCEISLUAINMASK*ˆANDRECEIVEISLUBINMASK4*ˆLU3ISUSEDF0RLISTINGANDLU6FORERR0R/LOGGING*3*ˆPARAMETERTABLEFORCHANGLOGICALUNITASSIGNMENT,*ˆISDIFFERENTFROMSTANDARTPARAMETERTABLE*;************************************************************ LU3AFHSƒEQU*'‰DC.WFHCHLU„COMMAND(CHANGELUASSIGN)‰DC.WFOPKEP…OPTIONKEEPASSIGN‰DC.B0ŠSTATUS‰DC.BLDFLUNŠSENDLUNUMBER‰DC.BLISTLUŠRECEIVELUNUM‰DC.B0ŠRESERVED&‰DC.L0ŠTASK-ID(0MEANSUSEYOURSELF)(‰DC.L0ŠSESSION#(0MEANSUSEYOURSELF)*‰DS.W0**!***********************************ˆSETUPIOSFORLISTINGLU3*‹IOSPARMTABLE*!*********************************/‰IOS.OUT3IOWRIT,IOPASC+IOPFOR+IOPWAT,3,0,0,0,0*)******************************************A*ˆLU3FHSISFHSPARMTABLEFORLU3WHICHISUSEDFOROUTPUTLISTI*********************************************"‰FHS.LU3FHCLOS,0,LISTLU,0,0,0,0,0‰DS.W0**;************************************************************7*‰DSKFHSISTHEPARAMETERTABLEFORTHEDISKINPUTFILE*;************************************************************!‰FHS.DSKFHFDEN,0,DSKLU,0,0,0,0,0‰DS.W0*#************************************)*ˆBUILDPARMBLOCKTOASSIGNVOLFORDISK*#************************************!‰FHS.VOLFHASGN,0,DSKLU,0,0,0,0,0‰DS.W0*,*********************************************2*ˆPARAMETERBLOCKFOROUTPUTWITHINPUT(TERMINAL)*,*********************************************%‰IOS.OI5IOREAD,IOPFOR,CDFLUN,,,0,0,2**.************************************? ***********+*ˆDIRECTORYENTRY(DIR)DATASTRUCTURE****%*ˆTHEMASKFORDIRBLKSTARTSATFDUSN-*ˆTHEDIRECTORYENTRYISREADINTOTHISBLOCK*+*********************************************DIRBLKƒDS.BFDLEN****8**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************‰DS.W0STSKNAMƒDC.L0‰SAVETASKNAMESESNUMƒDC.L0ˆSAVESESSIONNUM#VOLNAMƒDC.L0‰SAVEVOLDEFAULTNAME‰DC.W0/USERNUM‚DC.W0ŠDEFAULTUSERNUM(16BITBINARY)*CATNAMƒDC.L0,0‡SAVEDEFAULTCATAGORYNAME‰DS.L12‰SAVEOTHERREGISTERS*FAMVOLƒDC.L'„'…SAVEFAMILYVOL"FAMUSNƒDC.W0ŠSAVEFAMILYUSERNUM"FAMCATƒDC.L0,0ˆSAVEFAMCATALOGUE%FAMFILƒDC.L0,0ˆSAVEFAMILYFILENAMEFAMEXTƒDC.W0ŠSAVEFAMILYEXT)FAMWCDƒDC.B0ŠSAVEFAMILYWRITEPASSWORD)FAMRCDƒDC.B0ŠSAVEFAMILYWRITEPASSWORDFLAGF„DC.B0ŠFAMILYFLAG&FLAGWPƒDC.B0ŠWRITEPROTECTERRORFLAGDEVFLAG‚DC.B0ŠDEVICEFLAGFLAGY„DC.B0ŠOPTIONYFLAG‰DS.W0)SAVD7„DC.L0ŠBITMASKOFLUNSENTTOUSERFLAGC„DC.L0ŠCONTINUEFLAG+MSGIN„DC.B'„'„INPUTRESPONCEFROMTERMINALMSGINENDEQU‡*-1‰DC.B†0+*œREQUIREDPOSITIONFORSBARGTOPLACE'CR'"TSTCOUNTDC.B100ˆCOUNTERFORTEST*‰DS.W0*&****************************************ˆSTARTOFPRINTBUFFER*+******************************************* DELMSGƒEQU*‰DC.B'DELETED'* PRTBUFƒEQU*‰DS.B40#PRTBEND‚EQU*-1‹ENDOFPRINTBUFFERDELMSGE‚EQU*-1‰DS.W0DIRMSGƒEQU*ŒSTARTOFDIRMSG%VOLPRTƒDC.L'„'…VOLUMENAMEGOESHERE ‰DC.W':'L1USN„DC.L0ŠUSERNUM ‰DC.W'.'L1CAT„DC.L'„'…CATALOGUE ‰DC.L'„' ‰DC.W'.'L1FIL„DC.L'„'…FILENAME ‰DC.L'„' ‰DC.W'.'L1EXT„DC.W'‚'‡EXTENSION DIRMSGE‚EQU*!DIRMSGL‚EQUDIRMSGE-DIRMSG‚LENGTH‰DS.W0** DELOK„EQU*‰DC.B'OKTODELETE(Y/N/Q)‚'DELOKBƒDS.B40‰FILENAMEDELOKBE‚EQU*-1DELOKEƒEQU*-1**ˆDS.W0*‰PAGE***’ERRORMESSAGEPARAMETERBLOCK**EM_PBLK: EM_DO:ƒDC.L†0"*œD0-IOS/FHSRETURNERRORSTATUS*œ(ERRORMSGKEYVALUE) EM_A0:ƒDC.L†0"*œA0-ADDROFI/OPARAMETERBLOCKEM_OPT:‚DC.B†0*œOPTIONSFLAG*œBIT‡MEANINGIFSET*0ˆQUERYRESPONSEDESIREDEM_TLUN:DC.B†0*œUSERTERMINALLUN-(LDFLUN)EM_QRC:‚DC.B†0*œQUERYRETURNCHARACTEREM_KLUN:DC.B†0*œUSERKEYBOARDLUN-(CDFLUN)EM_SPA:‚DC.L†0'*œSTARTADDRESSFORUSERTEXTPLUGPOOLEM_EPA:‚DC.L†0%*œENDƒADDRESSFORUSERTEXTPLUGPOOL/ENDDATA‚EQU*‹***END‚OF‚DATA‚AREAƒ***‰PAGE BEGPROC‚EQU*‰PAGE*<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<**************************************************************/*ˆ***‚PROCEDURESECTIONFORDELETECOMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;***************************************************************STARPROG EQU *‰LEA‡PBA(PC),A7*œA7=PROGRAMBASEADDRESS*&***************************************.*ˆ**ƒSAVEDEFAULTVALUEPASSEDFROMSYSTEM****'****************************************$‰MOVEM.LD0-D7/A0-A7,STSKNAM-PBA(A7)*œSAVEREGISTERCONTENTS+*ˆD0TOSTSKNAM=TASKNAMETHATSTARTEDME*ˆD1TOSESNUM‚=SESSIONNUM$*ˆD2TOVOLNAM‚=DEFAULTVOLUMENAME*ˆD3TOUSERNUM=USERNUMBER*ˆD4TOCATNAM‚=CATALOGUENAME*ˆD5TOCATNAM+4**ˆD6‹=‚LENGTHOFCOMMANDLINE)*ˆD7=BITMASKOFLOGICALUNITSASSIGNED*ˆA0=YOURTASKNAME*ˆA1=TERMINALID*ˆA2=ACTUALUSERNUMBER(*ˆA3=SYSTEMVOLUMEDEFAULE(ALLSPACES)*ˆA4=SYSTEMUSERNUMBER*ˆA5=SYSTEMCATALOGUE*ˆA6=SYSTEMCATPART2*****‰PAGE*:*ˆPOSITIONINDEPENDENTCODETOINITIALIZEPARAMETERBLOCKS*ˆWITHFIXEDVALUES* ‰MOVE.L„A7,A3‰LEA‡PROGSTK(PC),A7*œA3=PROGRAMBASEADDRESS*œA7=STACKPOINTERADDRESS‰LEA‡DIRBLK(PC),A0 ‰MOVE.L„A0,DSKFHS-PBA+FHSSIZ(A3)(*œSETADDRESSINFHSPARAMETERBLOCKFOR *œADDRREADDIRECTORYENTRYINTO‰LEA‡MSGIN(PC),A0 ‰MOVE.L„A0? ,OI5IOS-PBA+IOSSAD(A3)‰LEA‡MSGINEND(PC),A0 ‰MOVE.L„A0,OI5IOS-PBA+IOSEAD(A3),*œSETSTART/ENDMSGADDRESSESINOUTPUTWITH*œINPUTPARAMETERBLOCK‰PAGE?*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!?********************************************************************„DRIVER‚BLOCK„*****?***************************************************************?*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!****ˆSYSTEMPASSESLOGUNITFOR%*’SYSTEMOUTPUT-ERRORMESSAGESETC.*#************************************&*‰*****CALLCOMMANDPARSEROUTINE‚***/*ˆTHISROUTINEWILLBREAKDOWNTHECOMMANDLINE/*ˆANDGIVEADDRSTARTOFOUTPUTFIELD&OPTIONS*#**************************************)‰LEABUFFIN(PC),A0‚SAVEBUFFERSTARTADDR ‰BSRPARSE**”PARSERETURNS *•D0=STATUS*•A1=ADDRSTARTOFOUTPUT*•A2=ADDRSTARTOFOPTIONS*‰LEA‡PBA(PC),A3/*œA3=PROGRAMBASEADDR-PARSERTNEDESTROYSA3‰TST.LD0‡CKF0RANYERR0RS‰BMIPINVALER‡BRIFERR0R*,*********************************************$*ˆCHECKFOROPTIONFROMCOMMANDLINE***********************!‰CMP.L#0,A2…WASOPTIONSFLAGSET‰BEQ.SCKOUTPUT„NO'‰BSRCKFOROPT„GOTOOPTIONPROCROUTINE*$**************************************ŠCKFORANYOUTPUT*‚ZEROINA1MEANSNOOUTPUT*8*ˆOUTPUTMEANSSENDOUTPUTTODEVICEOTHERTHANTERMINAL;************************************************************CKOUTPUT EQU **'‰CMP.L#0,A1‚A1CONTAINSADDROFOUTPUT4‰BNE.SGETOUT†ASSIGN‚OUTPUTISNOTGOINGTOTERMINAL$‰BTST#3,D7†ISLU3ALREADYASSIGNED‰BNE.SDOINPUT…YES"‰BSRSETLU3†ASSIGNLU3TOTERMINAL‰BRA.SDOINPUT'GETOUTƒBSRNEWOUT…DONEWOUTPUTROUTINE**+DOINPUT„BSRINITIN†GOTOPROCINPUTROUTINE***‰TST.BFLAGF-PBA(A3)$‰BNE.SFAMILYˆJMPIFFAMILYFLAGSET**8*********************************************************!*ˆDELETEOFNONFAMILYTYPEENTRY*8**********************************************************‰MOVE.W#FHDELT,DSKFHS-PBA(A3)*œSETDELETECOMMAND !‰BSR.SDODEL‡GOTODELETEROUTINE‰TST.LFLAGC-PBA(A3)*‰BEQ.SSTOPITˆJMPIFALLENTRIESPROCESSED‰BRA.SDOINPUT…GETNEXTENTRY*****8*********************************************************-*ˆTHECOMMANDLINEHADAFAMILYINDICATOR(*),*ˆINONEOFTHEPARTSOFTHETOTALFILENAME*8********************************************************* FAMILYƒEQU***************************ˆASSIGNVOLUMEFORDISK************************* ‰BSRASGNDSK**#************************************%*ˆMAKEFHSCALLTOGETENTRYFROMDIR*"***********************************'GETDIRƒLEADSKFHS(PC),A6‚INITBASEADDR2‰MOVE.W#FHFDEN,FHSCMD(A6)‚FETCHDIRENTRYCOMMAND!‰MOVE.LFAMVOL-PBA(A3),FHSVOL(A6)!‰MOVE.WFAMUSN-PBA(A3),FHSUSN(A6)!‰MOVE.LFAMCAT-PBA(A3),FHSCLG(A6)%‰MOVE.LFAMCAT+4-PBA(A3),FHSCLG+4(A6)!‰MOVE.LFAMFIL-PBA(A3),FHSFIL(A6)%‰MOVE.LFAMFIL+4-PBA(A3),FHSFIL+4(A6)!‰MOVE.WFAMEXT-PBA(A3),FHSEXT(A6)!‰MOVE.BFAMWCD-PBA(A3),FHSWCD(A6)!‰MOVE.BFAMRCD-PBA(A3),FHSRCD(A6)*œRESTORETHEFOLLOWINGFIELDS*¦VOLUME *¦USERNBR *¦CATALOG *¦FILENAME *¦EXTENSION*¦FAMILYWRITEPASSWORD*¦FAMILYREAD‚PASSWORD‰FHSCALL(A6)†MAKECALL*‰BEQ.SDOPROC‡GOODRETURN‰CMP.B#FSTAEOD,D0‚ENDOFDATA‰BEQ.SSTOPIT†ENDOFRUN‰BRAIOERPRTˆERR0R*DOPROCƒLEAPRTBUF(PC),A0!‰LEAPRTBEND(PC),A1‚ENDOFBUFFER!‰LEADELOKB(PC),A2ƒOTHERMSGAREACLAREAƒMOVE.L#'„',(A0)‰MOVE.L(A0)+,(A2)+‰CMP.LA0,A1…ATEND ‰BCCCLAREA#‰BSRPROCITEMƒBRTOBUILDDATALINE‰BRAGETDIR†GETNEXTENTRY*"*********************************** *ˆSTOPTHEPROGRAMATTHISPOINT*#************************************ STOPITƒEQU* *ˆTHISTAKESTHEPLACEOFASTOP*GOBACK: ‰BSR‡TERMINAT*œTERMINATETASKNORMALLY**8********************************************************8*???????????????????????????????????????????????????@ ????**ˆENDOFDRIVERBLOCK*8*???????????????????????????????????????????????????????8********************************************************ŠPAGE*********************************************#*ˆROUTINETOPROCESSACTUALDELETES,*ˆSINGLEANDFAMILYDELETESUSETHISROUTINE*+******************************************** DODEL„EQU******************************* *ˆSETUPFILENAMEINPRINTLINE*'****************************************"‰LEADSKFHS(PC),A6ƒINITPARMBLOCK!‰MOVE.LFHSVOL(A6),VOLPRT-PBA(A3) *œVOLUMENAME ‰MOVE.LFHSCLG(A6),L1CAT-PBA(A3)$‰MOVE.LFHSCLG+4(A6),L1CAT+4-PBA(A3) *œCATALOGUE ‰CLR.LD0/‰MOVE.WFHSUSN(A6),D0‚USERNUMBERCONVTOASCII‰LEAL1USN(PC),A0 ‰BSRBINDEC ‰MOVE.LFHSFIL(A6),L1FIL-PBA(A3)$‰MOVE.LFHSFIL+4(A6),L1FIL+4-PBA(A3) *œFILENAME ‰MOVE.WFHSEXT(A6),L1EXT-PBA(A3) *œEXTENSION*)*******************************************ˆMAKEDELETECALLTOFHS*)****************************************** ‰FHSCALL(A6)* ‰BNE.S…DELERR*œJMPIFDELETEERROROCCURRED0*************************************************!*ˆDELETESUCCESSFULPRINTMESSAGE*0************************************************* GOODDEL‚EQU*!‰MOVE.LFHSVOL(A6),VOLPRT-PBA(A3) *œVOLUMENAME'‰BSRMOVENAME‰GOTOMOVEFILENAMEROUT*‰LEA‡DELMSG(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSSAD(A3)-*œSETMESSAGESTARTADDRINIOSPARAMETERBLK%* ENDOFMSGADDRISSETUPINSPCOMP‰IOSCALLOUT3IOS(PC)*‰BNEIOERPRTˆERROR*'DODELEX‚RTSŒ.RETURNFROMDODELROUTINE****)******************************************%*ˆPRINTDELETENOTSUCCESSFULMESSAGE********************************************** DELERRƒEQU**‰MOVE.L„#LISTLU,D1!*œUSERLOGICALUNITNBROUTPUTTO ‰BSR‡C_EM_PGM*œISSUEERRORMSGREQUEST‰BRADODELEX…RETURN‰PAGE**ˆ****ƒOPTIONSROUTINECALL‚****4*ˆTHISROUTINEWILLCKINPUTTODETERMINEIFOPTIONS+*ˆHAVEBEENREQUESTED.OPTIONFLAGSARESET!*ˆA2=ADDRSTARTOFOPTIONFIELD*INCOMMANDLINE*?****************************************************************CKFOROPT‚EQU* ‰BSROPTION*‰LEA‡PBA(PC),A33*œA3=PROGRAMBASEADDRESS-RTNEOPTIONDESTROYSA3"***********************************@*‰**BIT6IND0SETMEANSTHECARRAGERETURNISTHENEXTCHAR**"***********************************#‰BTST#6,D0†CKFORCARRRETURNFLAG‰BNE.S…ENDOPT„EXITWASCARRRET&OPTERCK‚TST.BD0ˆCKFORERR0RBITSSET*‰BNEPINVALERˆFOUNDINVALIDFLAGCONDITION*+********************************************,*‰***CKFORY(DONOTREQUESTOK)OPTION***,*********************************************‰CMP.B#'Y',D1ƒEOPTIONSET!‰BNE.S…INV_OPTƒNOTAVALIDOPTION*‰MOVE.B#1,FLAGY-PBA(A3)*œSETOPTIONFLAG ENDOPTƒRTSŒ.‚RETURNFROMROUTINEINV_OPT:‰MOVE.L„#EM_NVO,D0)*œD0=KEYVALUEFORINVALIDOPTIONMESSAGE ‰BRA‡IOERPRT‰PAGE*/************************************************)*ˆ***‚SETUPFHSPARMBLOCKFORINPUT****7*ˆTHISROUTINEWILLINITIALIZETHEINPUTFILEPARAMETER!*ˆBLOCKANDASSIGNTHEDIRVOLUMN*/************************************************ INITIN„EQU*‰TST.LFLAGC-PBA(A3)+‰BEQ.SINITIN1…JMPIFCONTINUEFLAGNOTSET‰MOVE.LFLAGC-PBA(A3),A0*œPUTLOCATIONPOINTERINA0‰CLR.LFLAGC-PBA(A3)*œCLEARFORNEXTCALL‰BRA.SINITIN2,INITIN1‚LEABUFFIN(PC),A0ƒADDROFSCANSTART0INITIN2‚LEADSKFHS(PC),A6ƒADDROFFHSPARMBLOCK!‰MOVE.LVOLNAM-PBA(A3),FHSVOL(A6) *œVOLUMENAME(GETUSNƒMOVE.WUSERNUM-PBA(A3),FHSUSN(A6) *œUSERNUMER!‰MOVE.LCATNAM-PBA(A3),FHSCLG(A6)%‰MOVE.LCATNAM+4-PBA(A3),FHSCLG+4(A6)*œCATALOGUENAME'‰MOVE.L#'„',FHSFIL(A6)‚BLANKFILENAME‰MOVE.L#'„',FHSFIL+4(A6),‰MOVE.W#'‚',FHSEXT(A6)‚BLANKEXTENSIONNAME*&****************************************ˆ**ƒCALLEDITFILEROUTINE***&***************************************!‰BSREDITFILE„MAKEEDITFILECALL‰LEA‡PBA(PC),A@ 32*œA3=PROGRAMBASEADDR-RTNEEDITFILEDESTROYSA3‰BMIPINVALER‡ERR0R*‰BTST#1,D0‡WASDEVICEBITSET‰BNEPINVALERˆYES*‰BTST#0,D0‡CONTINUESET‰BEQ.SINIT1NO‰MOVE.LA0,FLAGC-PBA(A3)%*œSETCONTFLAGANDSAVEADDRPOINTER!INIT1„BTST#7,D0†FAMILYFIELDSET‰BEQ.SINITEXIT„NO‰LEADSKFHS(PC),A6ƒINITREG!‰MOVE.LFHSVOL(A6),FAMVOL-PBA(A3)!‰MOVE.WFHSUSN(A6),FAMUSN-PBA(A3)!‰MOVE.LFHSCLG(A6),FAMCAT-PBA(A3)%‰MOVE.LFHSCLG+4(A6),FAMCAT+4-PBA(A3)!‰MOVE.LFHSFIL(A6),FAMFIL-PBA(A3)%‰MOVE.LFHSFIL+4(A6),FAMFIL+4-PBA(A3)!‰MOVE.WFHSEXT(A6),FAMEXT-PBA(A3)!‰MOVE.BFHSWCD(A6),FAMWCD-PBA(A3)!‰MOVE.BFHSRCD(A6),FAMRCD-PBA(A3)*œSAVEFOLLOWINGFIELDS *¦VOLUMENAME *¦USERNUMBER *¦CATALOGUE *¦FILENAME *¦EXTENSION*¦WRITEPASSWORD*¦READ‚PASSWORD‰MOVE.BD0,FLAGF-PBA(A3)*œSAVEFAMILYSETTINGSINFLAGFINITEXIT EQU * ‰RTS.RETURN**‰PAGE* ASGNDSK‚EQU**2****************************************************ŠASSIGNDIRVOL‚***5*ˆCOMMAND,VOLNAMEANDLU#ARESETUPINPARMBLOCK*1**************************************************‰LEAVOLFHS(PC),A0'‰MOVE.L#'„',FHSCLG(A0)‚BLANKCATALOGUE.‰MOVE.WFHSUSN(A6),FHSUSN(A0)‚LOADUSERNUMBER+‰MOVE.LFHSVOL(A6),FHSVOL(A0)‚MOVEVOLNAME‰MOVE.L#'„',FHSCLG+4(A0)'‰MOVE.L#'„',FHSFIL(A0)‚BLANKFILENAME‰MOVE.L#'„',FHSFIL+4(A0)'‰MOVE.W#'‚',FHSEXT(A0)‚BLANKEXTENSION* ‰FHSCALL(A0)'*Š**‚RETURNFROMFILEHANDLERSYSTEM**‰BNEIOERPRTˆERR0R‰RTSŽ.RETURNFROMROUTINE*‰PAGE*.***********************************************'*ˆ**SETUPFILENAMEFROMDIRECTORY‚***.***********************************************PROCITEM EQU *%‰LEADSKFHS(PC),A6ƒADDROFPARMBLOCK,‰LEADIRBLK(PC),A4SETUPDIRPARBLOCKADDR*+********************************************ˆSETUPFILENAMEINHOLDAREA+********************************************%BLD1…MOVE.LFHSVOL(A6),VOLPRT-PBA(A3)‰MOVE.LFDCLG(A4),L1CAT-PBA(A3)#‰MOVE.LFDCLG+4(A4),L1CAT+4-PBA(A3)"*œSETUPVOLUMENAMEANDCATALOGUE**ˆUSERNUMBERCONVERTTOASCII* ‰CLR.LD0‰MOVE.WFDUSN(A4),D0+‰LEAL1USN(PC),A0„USERNUMBERCONVTOASCII ‰BSRBINDEC*‰MOVE.LFDFIL(A4),L1FIL-PBA(A3)#‰MOVE.LFDFIL+4(A4),L1FIL+4-PBA(A3)*œSETUPFILENAME‰MOVE.WFDEXT(A4),L1EXT-PBA(A3)*œSETUPFILEEXTENSION*‰TST.BFLAGY-PBA(A3)*œOPTIONBYPASSMSGSET‰BNE.SDO1‰YES‰LEA‡DELOK(PC),A2"‰MOVE.L„A2,OUT6IIOS-PBA+IOSSAD(A3)$*œSETMSGSTARTADDRINPARMETERBLK$‰LEADELOKB(PC),A2ƒLOADRECEIVEADDR!‰LEADIRMSG(PC),A1ƒLOADSENDADDR"‰MOVE.L#DIRMSGL,D1‚ENDOFMSGLOC ‰BSR.SSPCOMP‰ADD.L#1,A2…POSFORMOVE‰MOVE.B#'',(A2)+‰MOVE.B#'?',(A2)+‰MOVE.B#'',(A2)+"‰MOVE.LA2,OUT6IIOS-PBA+IOSEAD(A3)#*œSETMSGENDADDRINPARAMETERBLK**'*****************************************ˆDOOUTPUTANDINPUT*'****************************************ˆSENDMESSAGE‰IOSCALLOUT6IIOS(PC)‰BNEIOERPRTˆERROR**ˆRECEIVEANSWER*‰IOSCALLOI5IOS(PC)*‰BNEIOERPRTˆERR0R* ‰BSR‡SBARG-*œCHANGEFROMLOWERTOUPPERCASEIFNECESSARY ‰BNE‡IOERPRT*œJMPIFERRORRETURNED‰CMP.B#'Y',MSGIN-PBA(A3)"‰BEQ.SDO1‹JMPIFRESPONSEWASYES‰CMP.B#'Q',MSGIN-PBA(A3)'‰BEQ‚GOBACK‰JMPIFRESPONSEWASTOQUIT*$‰BRA.SPROCEXIT†BYPASSDONOTDELETE*)*******************************************ˆSETUPPARMBLOCKFORDELETE*)****************************************** DO1„EQU*,‰LEADIRBLK(PC),A4ƒDIRECTORYPARMBLOCKADDR)‰LEADSKFHS(PC),A6ƒDISKDELETEPARMBLOCK)‰MOVE.W#FHDELT,FHSCMD(A6)‚DELETECOMMAND%‰MOVE.WFDUSN(A4),FHSUSN(A6)‚USERNUM&‰MOVE.LFDCLG(A4),FHSCLG(A6)‚CATALOGUE ‰MOVE.LFDCLG+4(A4),FHSCLG+4(A6)&‰MOVE.LFDFIL(A4),FHSFIL(A6)‚FILENAME ‰MOVE.LFDFIL+4(A4),FHSFIL+4(A6) ‰MOVE.WFDEXT(A4),FHSEXT(A6)EXT**ŠBSRDODEL†GOTODELETEFILE**PROCEXIT‚RTSŒ.RETURN**,**********************************************ˆROUTINETOSPACECOMPRESS&*ŠA1CONTAA INSTHESENDINGLINEADDRESS(*ŠA2CONTAINSTHERECEIVINGLINEADDRESS,*ŠD1CONTAINSTHELENGTHOFTHESENDINGLINE*,*********************************************"SPCOMP…CMP.B#'',(A1)‚ISITBLANK‰BEQ.SBLD3ˆYES&‰MOVE.B(A1)+,(A2)+‚MOVETOPRINTLINE"BLDECK„SUB.W#1,D1…ISTHISTHEEND‰BHISPCOMPˆNO‰SUB.L#1,A2…ESTABLISHEND!‰MOVE.LA2,OUT3IOS-PBA+IOSEAD(A3)#*œSETENDMSGADDRINPARAMETERBLK ‰RTSRETURN*!BLD3…ADD.W#1,A1‡INCADDROFSEND ‰BRABLDECK**6*******************************************************ˆROUTINETOCOMPRESSANDMOVE**ˆTHEFULLYQUALIFIEDFILENAME6********************************************************MOVENAME EQU *!‰LEADIRMSG(PC),A1ƒLOADSENDADDR$‰LEAPRTBUF(PC),A2ƒLOADRECEIVEADDR'‰MOVE.L#DIRMSGL,D1‚ENDOFMSGLOCATION%‰BSRSPCOMP†CALLSPACEREMOVEROUTINE ‰RTS.RETURN***‰PAGE8*********************************************************=***‚ROUTINETODIRECTOUTPUTTOSOMETHINGOTHERTHANTERMINAL*9********************************************************** NEWOUTƒEQU*$‰BTST#3,D7†ISLU3ALREADYASSIGNED‰BEQ.SNEWOUT1…NO‰FHSCALLLU3FHS(PC)‚CLOSELU3*3NEWOUT1‚LEALU3FHS(PC),A6ƒLU3PARMTABLEADDRTOA6@‰MOVE.B#0,FHSWCD(A6)LOADWRITEPASSWORD(USERCANALWAYSWRITE?‰MOVE.B#$FF,FHSRCD(A6)‚LOADREADPASSWORD(ONLYUSERCANREAD)"‰MOVE.WUSERNUM-PBA(A3),FHSUSN(A6)!‰MOVE.LVOLNAM-PBA(A3),FHSVOL(A6)!‰MOVE.LCATNAM-PBA(A3),FHSCLG(A6)%‰MOVE.LCATNAM+4-PBA(A3),FHSCLG+4(A6)*œESTABLISHFOLLOWINGFIELDS *¦USERNUMBER *¦VOLUMENAME *¦CATALOGUE*‰MOVE.W#'LS',FHSEXT(A6)‡DEFAULTEXTENSION'‰MOVE.LA1,A0‡A1HADADDROFSCANSTART*)******************************************&*ˆSETUPA0WITHADDROFSTARTOFSCAN'*ˆSETUPA6WITHADDROFFHSPARMBLOCK*‰***CALLEDITFILEROUTINE****)****************************************** ‰BSREDITFILE‰LEA‡PBA(PC),A35*›A3=PROGRAMBASEADDRESS-RTNEEDITFILEDESTROYSA3‰TST.LD0ŠCKFORERR0R‰BMI.SPINVALER‰BTST#1,D0†CKFORDEVICEFLAG‰BNE.SSETDEV†YES‰TST.BD0ˆCKFORFAMILY'‰BNE.SPINVALERˆFOUNDFAMILYINDICATION‰BRA.SNOTDEV†BRANCH*)*******************************************ˆ****ƒASSIGNLOGICALUNIT3*'**************************************** SETDEVƒMOVE.B#1,DEVFLAG-PBA(A3)*œSETDEVICEFLAG-‰MOVE.W#FHASGN,FHSCMD(A6)‚SETASSIGNCOMMAND4‰MOVE.W#FOPPW,FHSOPT(A6)‚SETEXCLUSIVEWRITEOPTION ‰BTSTW…#14,D0 ‰BNE.S…SETLU3*œJMPIF*¦DEVICESPECIFIED*¦VOLUMEFIELDNULLSTATE ‰FHSCALL(A6)!*ˆ*****ƒRETURNFROMFHSCALL‚****‰BNE.SIOERPRTˆERR0R!NEWOUTE‚RTSŒ.RETURNFROMROUTINE****)******************************************"*ˆ**‚OUTPUTISAFILENOTADEVICE.*ˆ**‚A6CONTAINSADDROFOUTPUTFHSPARMBLOCK*)****************************************** NOTDEVƒEQU**3‰MOVE.W#FHALLO+FHASGN,FHSCMD(A6)‚SETALLOC&ASSIGN**Š***‚OPTIONSSET*'‰MOVE.W#FOPPW+FOPEND+FOPSEQ,FHSOPT(A6)"‰CLR.LFHSSIZ(A6)‚SIZECODE=ZERO#‰CLR.WFHSLRL(A6)„LOGRECLENGTO0*"NOTDEV1‚FHSCALL(A6)‡MAKEFHSCALL ‰BEQNEWOUTE*‰CMP.B#5,D0‰DUPFILE‰BNE.SIOERPRT‰NO‰MOVE.W#FHASGN,(A6)‰BRANOTDEV1‰TRYAGAIN**‰PAGE2***************************************************.*ˆROUTINETOASSIGNLOGICALUNIT3TOTERMINAL+*ˆBYSETTINGITUPTHESAMEASLU6WHICHIS"*ˆALREADYASSIGNEDTOTHETERMINAL*2*************************************************** SETLU3ƒEQU*‰FHSCALLLU3AFHS(PC)‰BNE.SIOERPRT…BADRETURN ‰RTSŒ.RETURN*****6*******************************************************4*ˆROUTINETOASSIGNLU6TOTERMINALFORTESTINGONLY7*ˆTHEFOLLOWINGDEVICESARESETUPFORTESTINGPURPOSES*ˆINTHESIMULATOR*ˆCONS=TERMINAL*ˆFD00=FLOPPYDISK00*ˆFD01=FLOPPYDISK01*ˆPR--*PRINTER(-ISBLANK)=*ˆNULL=NULLDEVICE(READANDWRITETONULLARELIKENOOPS)*6******************************************************‰PAGE**0*ˆPINVALERISERR0RRETURNFROMEDA ITFILEROUTINE*ˆ(GETCATISCLOSESTLABEL) PINVALER:‰MOVE.L„#EM_NVE,D0%*œSETKEYVALUEFORINVALIDENTRYMSG**ˆI/OERRORMESSAGE* IOERPRT‚EQU*‰MOVE.L„#LDFLUN,D1$*œD1=USERLOGICALUNITNBROUTPUTTO‰BSR.S…C_EM_PGM*œISSUECALLTOERRORMSGPRGM‰PAGE**2*ˆALLUTILITIESWILLTERMINATEBYCALLINGƒERQ.TERM:*ˆHOWEVER-ANINDICATIONASTOWHETHERTHEREWASANERROR5*ˆWHICHMIGHTCAUSECHAINPROCESSINGTOABORTMUSTBE9*ˆSPECIFIEDATTHETIMEOFTHETERMINATION.THEFOLLOWING8*ˆWILLDEFINETHETYPEOFTERMINATIONTHATARECURRENTLY *ˆPOSSIBLE:*8*’NORMALTERMINATION‚-IMPLIESTHATUTILITYSUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM#0,#0**:*’ERRORTERMINATIONƒ-IMPLIESTHATUTILITYTERMINATEDWITH *¨ANERROR**¦ERQ.TERM#0,#$C000*<*’WARNINGTERMINATION-IMPLIESTHATUTILITYTERMINATEDWITH*¨AWARNING(ie.ASSEMBLY)**¦ERQ.TERM#0,#$1000*L********PBA-ISTHEPROGRAMBASEADDRESS‚--THISMAYBEANYSYMBOLTHEUSER *®WOULDLIKE-PBAHASBEENUSED*®FORILLUSTRATIONPURPOSES*D******** THE USER IS RESPONSILE FOR SUPPLYING THE BASE REGISTER (A?)*** TERMINAT:‰ERQ.TERM‚#0,TERM_FLG-PBA(A3) TERM_FLG:‰DC.W†0‰TERMINATIONFLAG0*œWILLCONTAINTHEAPPROPRIATETERMINATIONVALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*‰PAGEK**************THE USER IS RESPONSIBLE FOR SUPPLYING THE REGISTER (A?) WHICH5**************CONTAINS THE PROGRAM BASE ADDRESS (PBA)***’ERRORMESSAGECALLINGROUTINE**ˆCALL†BSR‡C_EM_PGM**ˆINPUT!*’D0=ASRETURNEDFROMTRAPCALL,*’D1=USERLOGICALUNITNUMBERTOOUTPUTTO!*’A0=ASRETURNEDFROMTRAPCALL**ˆOUTPUT*’NOREGISTERPRESERVATION* EM_XCEPT:‰DC.W†$0017…FILENON-EXISTENT‰DC.W†$0000…TABLETERMINATOR2*œTHISTABLEISUSEDTODEFINEEXCEPTIONSTOERROR.*œMESSAGESTHATSHOULDNOTCAUSEATERMINATION*œVIATHEERRORCONDITION* C_EM_PGM:‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A3)+*œSAVED0ANDA0INERRORMSGPARAMETERBLK‰AND.L…#$00FF,D0*œISOLATEERRORSTATUSRETURN‰LEA‡EM_XCEPT(PC),A00*œA0=ADDROFTBLCONTAININGERRORMSGCODESTHAT-*ŸWILLNOTBECONSIDEREDASERRORTERMINATION *ŸCONDITIONS CEMP0100: ‰TST.W…(A0)‰BEQ.S…CEMP0200 *œJMPIFTABLEHASBEENEXAMINED‰CMP.W…(A0)+,D0‰BEQ.S…CEMP0300'*œJMPIFERRORCODERETURNISONEWHICH/*œWILLRESULTINBEINGANEXCEPTION-THISCASE**œWILLNOTBECONSIDEREDFORANERRORTYPE *œTERMINATION‰BRA.S…CEMP0100 *œREPEATLOOP CEMP0200:‰MOVE.W„#$C000,TERM_FLG-PBA(A3),*œSETFLAGTOTERMINATEWITHERRORCONDITION CEMP0300:‰LEA‡EM_PBLK(PC),A0&*œA0=ADDRUSERERRORMSGPARAMETERBLK‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)*œSETTHEUSERLUNTOOUTPUTTO ‰MOVE.L„#2,D0*œERRORMSGPRGMINPUTRQMNT‰TRAP†#4$*œISSUEREQUESTTOERRORMSGHANDLER‰RTS **‰PAGE*&*ˆ**CONVERTBINARYTOASCIIROUTINE**-*********************************************$*ˆBINARYTODECIMALASCIISUBROUTINE*REV1.00‚3/27.79GAT***16BITBINARYINPUT**4****************************************************6*ˆCONVERTSBINARYQUANTITYIND0TOASCIISTRINGWHICH *ˆISDEPOSITEDATLOCATION(A0)+**ˆCALLINGSEQUENCE:'*‹LOADD0WITHQUANTITYTOBECONVERTED.*‹LOADA0WITHADDRESSTODEPOSITASCIISTRING *‹JSRBINDEC*!*ˆREGISTERSUSED:01234567*“D„** *“A„*****ˆA1POINTSATBINARYTABLE*ˆA2POINTSATASCIITABLE*ˆD1ISWORKREGISTER*BINEQSƒDC.W0,1,10,100,1000(BINASCƒDC.B'0123456789ABCDEF'…HEXTABLE*%BINDECƒLEA‡BINEQS+8(PC),A1ƒADDR10**5*BINDE1ƒLEA‡BINASC(PC),A2†BASEADDRASCII0#BINDE2ƒSUB.W(A1),D0ŠSUBTRACT10**N‰BCS.SBINDE3BRANCHOVERBORROW&‰ADD.L#1,A2ŒINCREMENTNEXTASCIICHAR‰BRABINDE2CONTINUE'BINDE3ƒADD.W(A1),D0ŠRESTOREOVERBORROW!‰MOVE.B(A2),(A0)+†PUTASCIICHAR‰MOVE.W-(A1),D1ˆTESTDONE‰BNEBINDE1BRANCHNOTDONE‰RTS‰PAGEPRG_SIZEEQU‡*-PBA* ‰ENDBEGPROCB éé=/* =/*†DIR.AF=/*,=/* Chain file to assemble DIRectory utility=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to DIR.LS=/*=/IFC \1 ƒ=ARGDIR.LS=/ENDIF=/*=ASM DIR.SA,DIR.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDéééééé:=/* =/*†DIR.LF=/*$=/* Link chain file to create DIR.LO=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to DIR.LL=/*=/IFC \1 ƒ=ARGDIR.LL=/ENDIF=/*=LINK ,DIR.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000 INPUT DIR.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééB éééC‡LIST ‡LLEN120‡TTL„DIRECTORYOFFILESUTILITY!DIRECTIDNTƒ4,1‚DIRECTORYUTILITY<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************#*‹PROGRAMNAMEIS‚DIRC.DATA****ˆ***ƒDIRECTORYCOMMANDƒ******=*ˆTHISCOMMANDWILLDISPLAYFILENAMESFROMADISKDIRECTORY.<*ˆTHEDISPLAYMAYBETHEENTIREDIRECTORYORSELECTEDPARTS.* *ˆOPTIONS**ˆNORMAL„DISPLAYTHEFILENAME*?*ˆE‰FORANYFILENAMESPECIFIEDINTHEINPUTFIELD,THISOPTION:*’WILLOUTPUTALLDIRECTORYENTRIESINCLUDINGALLRELATIVE:*’DISKSPACEINFORMATIONBUTEXCLUDINGABSOLUTEDISKSPACE*’DATA*>*ˆZ‰WILLOUTPUTTHENAMESOFALLFILESCONTROLLEDBYTHELOGON*’USERANDUSERNUMBERZERO*<*ˆA‰WILLOUTPUTALLDIRECTORYENTRIESINCLUDINGALLRELATIVE%*’ANDABSOLUTEDISKSPACEINFORMATION1*’**VALIDFORVOLUMEOWNERORSYSTEMADMINSTRATOR*7*ˆS‰WILLSORTTHEDIRECTORYCOMMANDOUTPUTACCORDINGTO *œUSERNUMBER*œCATALOGNAME *œFILENAME *œEXTENSION9*’**MAYBEUSEDALONEORINCOMBINATIONWITHTHEFOLLOWING *”OPTIONS *œ"A","E","Z"*9*’**SORTINGISPERFORMEDININCREASINGALPHANUMERICORDER**!*ˆREGISTERSUSED:01234567*’D…********’A…*********=**************************************************************‰PAGE*** *ˆDIRECTORYMODIFICATIONHISTORY****ˆREVISIONCODE‡0801813* *’CONTAINSERRORMESSAGEHANDLER$*’CONTAINSPOSITIONINDEPENDENTCODE-*’CONTAINSCURRENTREVISIONCODEMODIFICATION5*’CONTAINSTERMINATIONLOGICFORUSEWITHCHAINFILES1*’CONTAINSCOMMONSUBROUTINESPULLEDFROMLIBRARY5*’SEGMENTALLOCATIONISDYNAMICALLYALLOCATEDANDNOT*—PRE-DETERMINED/*’USERNOWGETSCOUNTOFNBROFFILESRETRIEVED5*’THEDOUBLE"$"PROBLEMTHATPREVIOUSLYEXISTEDWHEN*—USINGTHE"A"OPTIONISFIXED9*’THE"Z"OPTIONWILLSEARCHFORONLYTHELOGONUSERNBR3*—ANDUSERZEROINSTEADOFFETCHINGEVERYDIRECTORY ELJUV]elm_uJ}T…j^•TA¥M­<µ8½LÅNÍLÕHÝIåAíNõMýW S T K O %K -Q 5H/*—ENTRYANDTHENDETERMININGIFITISUSERZERO*—ORTHELOGONUSER*****ˆREVISIONCODE‡0901813*0*’CORRECTSTHEFALLTHRUANDATTEMPTEDEXECUTION*—OFTERM_FLGASANINSTRUCTION'*’USESTHECORRECTED'SBARG'SUBROUTINE3*’HASACHARACTERFOLLOWINGTHEINPUTDATASOSBARG&*—WILLHAVEAPOSITIONTOPLACEA'CR'*****ˆREVISIONCODE‡0902813*3*’RE-LINKEDSOALLSECTIONSWILLBEINSEGMENTZERO*****ˆREVISIONCODE‡0909813*9*’CORRECTSIZEPROBLEMFOR'A'OPTIONONCONTIGIOUSFILES**‰PAGE***ˆREVISIONCODE‡0921813*7*’CORRECTPROBLEMFOR'A'OPTIONWHENFABENTRIESWOULD-*œSHOWDATABLOCKWHICHDIDNOTBELONGTOTHE*œFABBEINGDISPLAYED5*’ALLOWTHEUSERTHECAPABALITYTOSPEC CIFIYANOUTPUT)*œFILEORDEVICEWHENSEEKINGTHEVOLUME,1*œUSERNO.,ANDDESCRIPTIONOFASPECIFIEDDEVICE*****ˆREVISIONCODE‡1117813*#*’CORRECTPROBLEM…DIRFILENAME.EX,#'*’CORRECTPROBLEM…DIRFILENAME.EX,#CNXX7*’CORRECTPROBLEM…DIR;V‚WHERE'V'ISANINVALIDOPTION'*’CORRECTPROBLEM…DIRFILE1.EX,LISTFILE*°WHEREFILE1.EXISNON-EXSTENT*°ALLOUTPUTWILLNOWGOTO*°LISTFILE.LSANDNOTTHE*°INITIATINGDEVICE****ˆREVISIONCODE‡0926834*8*‘SETCHAIN/BATCHRDREGISTERWITH$1000IFNODIRECTORY8*‘ENTRIESFOUNDINFILESERCHATTEMPTDURINGCHAINMODE.****ˆRevisioncode‡0507844ŒKEG*0*’Print'.&.'foraNULLcataloginsteadof'..'****ˆRevisioncode‡0611844*;*’SeparatebufferDEVBUFaddedforFETDEVcalltofixerror:*’whennumberofrandomdevicesexceeds25.Maximumnumber"*’ofdevicesisnow100.(SPR897)*6*’OUT3PMacrocallinprintlinefeedroutinereplaced*’with**œBSR.S…OUT3PP*œIOSCALLƒOUT3IOS*&*’toeliminatewarningduringassembly**’HELPoptionadded**ˆRevisioncode‡0312854*4*’AddressregisterA4wasbeingdestroyedinLNFEED,4*’causingthetotalsforafiletobeincorrectwhen*’theAoptionwasused.**ŠPAGE***ˆINCLUDEFILES***ˆINCLUDE9995.&.FME.EQ*ˆINCLUDE9995.&.IOE.EQ*ˆINCLUDE9995.&.TR1.EQ**‰NOLIST‰INCLUDE9995.&.FME.EQéééééé‰INCLUDE9995.&.IOE.EQ‰INCLUDE9995.&.TR1.EQ‰LIST**‰PAGE*ˆDATASEGMENTFORDIRCOMMAND*ˆ****‚EQUATEAREA‚******* BEGDATA‚EQU0#STKLENƒEQU25‹STACKLENGTHINWORDS)BUFSIZE‚EQU160‰INPUTCOMMANDBUFFERSIZE SECLENƒEQU$100ˆLENGTHOFBUFFERCDEVLENƒEQU1000ˆLENGTHOFBUFFERUSEDONFETDEVCALL-ALLOWSUPTO*˜100DEVICES-SPR897 DSKLU„EQU1!LISTLUƒEQU3‹LISTINGLOGICALUNIT* ‰SECTION0‰XREFEDITFILE,PARSE,OPTION ‰XREF†DATEOJ**ˆ****‚MACROAREA‚*******ˆNEXTWORDBOUNDRYMACRO** NEXTWBƒMACRO‰NOLIST‰DS.W0‰LIST‰ENDM* OUT3P…MACRO ŠBSR„OUT3PP ŠIOSCALL\1ŠENDM*‰PAGE* PBA†EQU** REV_CODE:‰DC.B†'0312854'&*œWHEREREV_CODEISDEFINEDASFOLLOWS *œMMDDYYXZ*C 3*œMMDDYY=MONTHDAYYEAROFLASTASSEMBLYORPATCH*œX†=REVISIONTYPECODE*¦SPACE=CLEANASSEMBLY *¦P…=PATCHED*¦C…=CUSTOMIZEDPATCHED**#*œZ†=VERSADOSMAJORREVISIONFIELD*‰NEXTWB**‰PAGE;**************************************************************ˆ***ƒDATAAREA‚******:************************************************************ ‰DS.LSTKLEN PROGSTK‚EQU**‰DC.L0‰NEXTWB8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFINISTHEAREATHECOMMANDLINEIS.*ˆ***ƒREADINTOWHENTHISPROGRAMISCALLEDIN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++***BUFFINƒCOMLINEBUFSIZE‚***‚INPUTBUFFER‚***5******************************************************VERSION‚DC.L'DIRVERSION'V_NBR:ƒDC.B†'0312854‚'*œREVISIONCODE/VERSIONNBR&VDATE„DC.L'XX/XX/XX'‹DATEOFLISTING&VTIME„DC.L'XX:XX:XX'‹TIMEOFLISTING VEND…EQU…*-1** TIME PARAMETER BLOCKTIMBLK„DS.Lƒ1’DATE ŠDS.Lƒ1’TIME**5* ALLOCATE SEGEMENT PARAMETER BLOCK FOR SORTED OPTION*"FILCNT„DC.Lƒ200MAXIMUMFILECOUNTALLOCSEG‚DC.Lƒ0’TASKNAMEŠDC.Lƒ0’SESSIONSEG_OPTS:DC.Wƒ0’OPTIONSŠDC.Wƒ0’ATTRIBUTESŠDC.Bƒ'SSEG'NAMESEG_ADDR:DC.L…0ADDRESS3SEGLGH„DC.Lƒ0’SEGMENTLENGTH(DYNAMICALLYINSERTED)*5******************************************************+*ˆ**‚IOSPARAMETERTABLEFORDISKREADS‚***6*ˆ**‚REFERTOIOSEQUATESUNDERIOSPARAMETERBLOCK‚***5******************************************************‰NEXTWB DSKIOSƒEQU* ‰DC.WIOREAD‰DC.WIOPWAT+IOPRAN+IOPIMG‰DC.B0 ‰DC.BDSKLU‰DC.B0‰DC.B0‰DC.L0‰DC.L0‰DC.L0‰DC.L0‰DC.L0‰DC.L0‰NEXTWB*OPT†SETIOPASC+IOPWAT+IOPNXT+IOPNOC+IOPCNP"‰IOS.LIOWRIT,OPT,LDFLUN,0,0,0,0,0‰NEXTWB*3*****************************************************ŒIOSPARAMETERTABLE(*ˆSETUPIOS(ERR0R-LOG)‚PARAMETERBLOCK*3**************************************************** OUT6IOS‚EQU* ‰DC.WIOWRIT‰DC.WIOPASC+IOPFOR+IOPWAT‰DC.B0 ‰DC.BLDFLUN‰DC.B0‰DC.B0‰DC.L0 SADIO„DC.L0 EADIO„DC.L0‰DC.L0‰DC.L0‰DC.L0ŠNEXTWB#*ˆPARMTABLEFORFETCHDEVICETABLE*FETDEVƒDC.WFHFDMN…CMD‰DC.WFOPFRA…OPTIONS‰DC.W0‰DC.L0ŠBUFFER/‰DC.LDEVLEN…ALLOWSUPTO100DEVICES-SPR897*ŠNEXTWB‰PAGE"***********************************8*ˆFHSPARAMETERTABLEFORCHANGELOGICALUNITASSIGNMENT6*ˆCHANGEISFROM6TO3--SENDSOURCEISLUAINMASK*ˆANDRECEIVEISLUBINMASK4*ˆLU3ISUSEDF0RLISTINGANDLU6FORERR0R/LOGGING**3*ˆPARAMETERTABLEFORCHANGLOGICALUNITASSIGNMENT,*ˆISDIFFERENTFROMSTANDARTPARAMETERTABLE*%************************************** LU3AFHSƒEQU*'‰DC.WFHCHLU„COMMAND(CHANGELUASSIGN)‰DC.WFOPKEP…OPTIONKEEPASSIGN‰DC.B0ŠSTATUS‰DC.BLDFLUNŠSENDLUNUMBER‰DC.BLISTLUŠRECEIVELUNUM‰DC.B0ŠRESERVED-LU3ATID‚DC.L0ŠTASK-ID(0MEANSUSEYOURSELF)(‰DC.L0ŠSESSION#(0MEANSUSEYOURSELF)*‰NEXTWB**!***********************************ˆSETUPIOSFORLISTINGLU3*‹IOSPARMTABLE*!*********************************6‰IOS.OUT3IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU,0,0,0,0,0*‰NEXTWB)******************************************?*ˆLU3FHSISPARMTABLEFORLU3WHICHISUSEDFOROUTPUTLISTING*********************************************‰FHS.LU30,0,LISTLU,0,0,0,0,0*ŠNEXTWB*;************************************************************6*ˆ***DSKFHSISTHEPARAMETERTABLEFORTHEINPUTFILE*;************************************************************!‰FHS.DSKFHFDEN,0,DSKLU,0,0,0,0,0‰NEXTWB*#************************************ *ˆBUILDPARMBLOCKTOASSIGNVOL*#************************************!‰FHS.VOLFHASGN,0,DSKLU,0,0,0,0,0*‰NEXTWB********************************************+*ˆDIRECTORYENTRY(DIR)DATASTRUCTURE****$*ˆTHEMASKFORDIRBLKSTARTATFDUSN-*ˆTHEDIRECTORYENTRYISREADINTOTHISBLOCKD *+*********************************************DIRBLKƒDS.BFDLEN****‰NEXTWB8**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAMƒDC.L0‰SAVETASKNAMESESNUMƒDC.L0ˆSAVESESSIONNUM#VOLNAMƒDC.L0‰SAVEVOLDEFAULTNAME‰DC.W0ŠHIGHORDEROFUSERNUM/USERNUM‚DC.W0ŠDEFAULTUSERNUM(16BITBINARY)*CATNAMƒDC.L0,0‡SAVEDEFAULTCATAGORYNAME REGD6„DC.L0ŠCOMMANDLINELENGTH REGD7„DC.L0‰DS.L8ŠOTHERREGISTERS+TMPDATE‚DS.L2ŠFIELDTOHOLDGREGORIANDATE$HOLDDATEDC.L'„'…WORKAREAFORYEAR*,BLANK1S‚DC.B''ˆJUSTABLANKFORLINEFEEDS EJMSGSƒDC.W$0C20†FORPAGEEJECTDEVFLAG‚DC.B0ŠDEVICEFLAG(FLAGA„DC.B0ŠOPTIONA(SEGADDRESS)FLAG-FLAGS„DC.B0ŠOPTIONS(SORTEDDIRECTORY)FLAG1FLAGE„DC.B0ŠOPTIONE(PRINTALLATTRIBUTESFLAG)0FLAGZ„DC.B0‰OPTIONZPRINTSYSTEMEMTRIESALSO)*FLAGH„DC.B†0‰OPTIONH(HELP)FLAG-061184-SFIRSTƒDC.B0‰FIRSTTIMETHRUFLAGINSORTING"RFLAG„DC.B0‰RETURNTOGETDIRFLAGEXFLAGƒDC.B0ŠCARRRETFLAG&FLAG1„DC.B0…1STTIMEFLAGFORPRTMSG+PRNTFLG‚DC.B0…LINEFEEDFLAG1STTIMETHRU0FLAGLFƒDC.B0…USELINEFEEDSORNOTFLAG(0=NOT)1COUNT„DC.B0ŠCOUNTFORSECTORLENGTHFORAOPTIONFLAGEX„DC.B0…ENDOFFABFLAG!CFLAG„DC.B0ŠCONTIGUOUSFILEFLAGDFLAG„DC.B0‚DEVICEPRINTFLAG‰NEXTWB.ROWCNT„DC.Lƒ$7FFFFFFEŠROWCOUNTFORPAGEEJECT'LNCNT…DC.Lƒ$7FFFFFFFŠRUNNINGLINECOUNT#FFLAG…DC.Lƒ0’PRINTDETAILLINEFLAG7NXTBLKƒDC.L0ŠADDROFNEXTBLOCKFORSECTORS-OPTIONA5SAVEOPT‚DC.L0ŠSAVEOPTIONADDRESSPOINTERFROMPARSE1NCCOUNT‚DC.L0‰NONCONTIGUOUSLENGTHWORKCOUNTER1FABSPCƒDC.L0ŠACCUMULATEFABSIZEFORSINGLEFILE1TOTSIZƒDC.L0ŠACCUMULATETOTALSIZEFORALLFILES-FWPSN„DC.L'„'…WORKAREAFORFABPSNFROMFAB,DALL…DC.L$2A2E2A0DGETALLCOMDLINE(*.*CR)AST†DC.L$2A2A2A2A‚VALUEOFAST'ROOT†DC.Lƒ0’LISTHEADFORSORTEDOPTION+RLINK…DC.Lƒ0’RUNNINGLINKFORSORTEDOPTION‰NEXTWBFLAGINDC.B0ŒNULLINPUTFLAG*‰NEXTWB&***************************************0*‰BUFFERFORSECTORMEMORYFORFILEACCESSBLOCK&*************************************** SECBUFƒEQU*‰DS.BSECLENˆSECTORSIZESECBUFE‚EQU*-1‰ENDOFBUFFER‰DC.L0ŠMUSTFOLLOWSECBUFE NADR_SEC:‰DC.L†0!*œENDINGADDRESSOFSECTORBUFFER***&***************************************8*‰BUFFERFORDEVICEMNEMONICSENTRIES-CORRECTSPROBLEM*‰DETAILEDINSPR897*&***************************************‰NEXTWB DEVBUFƒEQU‡*‰DS.B†DEVLENŽSIZEOFBUFFER****.***********************************************"*ˆSTARTOFPRINTHEADERS&BUFFERS*.***********************************************‰NEXTWB* HDET1„EQU* ‰DC.B'‚' ‰DC.B'LOGƒ' ‰DC.B'#OF‘'!‰DC.B'REC‚KEYFABDBƒDATE†DATE'HDET1EƒEQU*-1 HDET2„EQU* ‰DC.B'‚'‰DC.B'START„END„EOF‚RECORDS'‰DC.B'WC‚RC‚FT„LEN'%‰DC.B'LENLENLENCHANGED‚ACCESSED'HDET2EƒEQU*-1‰ENDOFRECORD*‰NEXTWB* DETAILƒEQU* ‰DC.B'‚'!DFSƒDC.B'…'‚FILESTART/1STFABŠ0 ‰DC.B'‚'ž5DFE…DC.B'…'„LENGTH/LASTFAB‰7 ‰DC.B'‚'12DLOG…DC.B'…'„LOGICALEOF‹14 ‰DC.B'‚'19 DRNUM„DC.B'‡'‚NUMOFRECORDSˆ21 ‰DC.B'‚'28DWCD…DC.B'‚'‡WRITECODEŒ30 ‰DC.B'‚'32DRCD…DC.B'‚'‡READCODE34 ‰DC.B'‚'36$DATT…DC.B'ƒ'†ATTRIBUTESPARTONEƒ38 ‰DC.B''ž41DLRL…DC.B'…'„RECORDLENGTH‰42 ‰DC.B''ž47DKEY…DC.B'ƒ'†KEYLENGTHŒ48 ‰DC.B''ž51DFAB…DC.B'ƒ'†FABLENGTHŒ52 ‰DC.B''ž55DDAT„DC.B'ƒ'‡DATALENGTH‹56 ‰DC.B''ž59DCTOP…EQU„*‡DATECHANGED DSTOP…EQU„*DCDATE2ƒDC.Bƒ'‚'„MONTH‘60 ŠDC.Bƒ'/'DCDATE3ƒDC.Bƒ'‚'„DAY“63 ŠDC.Bƒ'/'DCDATE1ƒDC.Bƒ'‚'„YEAR’66 ŠDC.Bƒ'‚'š68DDATE2„DC.B'‚'‡MONTH70 ‰DC.B'/'DDATE3„DC.B'‚'‡DAY’75 ‰DC.B'/'DDATE1ƒDC.B'‚'‡YEAR’76DETAILE‚EQU*-1‰NEXTWB* PRTBUFƒEQU*‰DS.B80#PRTBEND‚EQU*-1‹ENDOFPRINTBUFFER*DIRMSGƒEQU*ŒSTARTOFDIRMSG%VOLPRTƒDC.L'„'…VOLUMENAMEGOESHERE ‰DC.W':'L1USN„DC.LD 0ŠUSERNUM ‰DC.W'.'L1CAT„DC.L'„'…CATALOGUE ‰DC.L'„' ‰DC.W'.'L1FIL„DC.L'„'…FILENAME ‰DC.L'„' ‰DC.W'.'L1EXT„DC.W'‚'‡EXTENSION!DIRMSGEƒEQU*-1‰ENDOFMSGLINE1DIRMSGL‚EQU‡*-DIRMSG‰NEXTWB****ˆADDRESSLINEMESSAGEAREA* HFABMSG‚EQU*‰DC.B'‚FABPSNˆ'‰DC.B'DATASTARTƒ'‰DC.B'#REC‚#SECT…'‰DC.B'DATASTARTƒ'‰DC.B'#REC‚#SECT'HFABMSGEEQU*-1‰ENDOFLINE*‰NEXTWB PFABD„EQU* ‰DC.B'‚'(DFABPSN‚DC.B'…'„FABPHYSICALSECTORNUM ‰DC.B'Ž'DFABDSƒDC.B'…'„DATASTART ‰DC.B'„'(DFABRNƒDC.B'†'ƒ#OFREC'SINDATABLOCK ‰DC.B'…'DFABSECTDC.B'ƒ' ‰DC.B'‹' ‰DC.B'Š' ‰DC.B''PFABDEƒEQU*-1‰NEXTWB ‰DC.B'„'* HFABLMƒEQU*‰DC.B'‚SIZE‚''HFABLMC‚DC.B'ˆ'‚DATALENGTHINSECTORS ‰DC.B'/$'HFABLMH‚DC.B'ˆ'HFABLME‚EQU*-1‰ENDOFMSG‰NEXTWB*/TFABLMƒEQU*–TOTALSPACECONSUMEDFORALLFILES‰DC.B'TOTALSIZE„''TFABLMC‚DC.B'ˆ'‚DATALENGTHINSECTORS ‰DC.B'/$'TFABLMH‚DC.B'ˆ'TFABLME‚EQU*-1‰ENDOFMSG‰NEXTWB* NOMSG„DC.B'FILENOTONVOLUME‚'NOMSGVOLDC.L'„'…VOLUMENAMENOMSGEƒEQU*-1„ENDOFMSG‰NEXTWBFABERMSG EQU *!‰DC.B'SECTORCOUNTERRORONFAB'FABERMSEEQU*-1‰.ENDOFMSG‰NEXTWB DEVM…EQU*‰DC.B'DEVICE‚'DEVM1„DC.B'„' ‰DC.B'‚'DEVM1EƒEQU‡*-DEVM‰DC.B'ISVOLUME'DEVM2„DC.B'„' DEVME„EQU*-1‰NEXTWB* UDM†EQU*‰DC.B'USERNUM=' UDMN…DC.B'„'‰DC.B'„DESC=' UDMD…DC.B'”' UDME…EQU*-1*‰NEXTWBDEVMN: ‰DS.B†DEVM1E‰DC.B'VOLUMENOTFOUND'DEVMNEƒEQU*-1**‰NEXTWB IOERR„EQU*‰DC.B'I/OERRORƒ'IOERRNƒDC.B'‚'IOERREƒEQU*-1*‰NEXTWB*7SEGERMSG‚DC.Bƒ'NOTENOUGHMEMORYFORTHIS''S''OPTION'SEGERMSE‚EQU„*-1ŠNEXTWB*CFILMAXSƒDC.Bƒ'FILECOUNTEXCEEDED-RETRYWITHLARGER''S''OPTION'FILMAXEƒEQU„*-1ŠNEXTWBIAOPERMSS‚DC.Bƒ'PROTECTIONERRORWITH''A''OPTION-''E''OPTIONASSUMED'AOPERMSE‚EQU„*-1‰NEXTWBZ_TABLE:‰DC.L†0*œADDRNEXTENTRYTOPROCESSZT_ZERO:‰NEXTWB‰DC.W†0*œ1STUSERNBR(ZERO)ZT_LOU:‰DC.W†0*œ2NDUSERNBR(LOGONUSER)‰DC.W†-1*œTABLETERMINATORŠNEXTWBX00100:!‰DC.B†'NUMBERFILESRETRIEVED='X00110: ‰DC.G†'†'X00198ƒEQU‡*-X00100X00199ƒEQU‡*-1*********************************ƒDIRMESSAGE-ADDED06/11/84******************************** HELPMSG‚EQU‡*>‰DC.B†'Commandformat:DIR[][,]'‰DC.B†'[;]' ‰DC.B†'‚'‰DC.B†'where:' ‰DC.B†'‚'8‰DC.B†'…inputfieldandoutputfieldmaybeanyfileor'‰DC.B†'devicename‚' ‰DC.B†'‚';‰DC.B†'…optionsƒZ-outputsnamesofallfilescontrolled'‰DC.B†'bydefaultuser'‰DC.B†'“anduser0' ‰DC.B†'‚'.‰DC.B†'E-outputsalldirectoryinformation' ‰DC.B†'‚'3‰DC.B†'A-outputsalldirectoryinformationplus'‰DC.B†'PSN''sof')‰DC.B†'“FAB''sanddatablocksinfile.'‰DC.B†'Functionsas'+‰DC.B†'“optionEifuserisnotuser0or'‰DC.B†'volumeowner' ‰DC.B†'‚'/‰DC.B†'Sƒ[=]-ArrangesDIR'‰DC.B†'outputaccording'/‰DC.B†'“tousernumber,catalog,filename,and'‰DC.B†'extension.The'.‰DC.B†'“optionalnumberoffilesisspecified'‰DC.B†'whenthenumber'-‰DC.B†'“offilesinthelistingexceedsthe'‰DC.B†'defaultof200' ‰DC.B†'‚' ‰DC.B†'H-Displaysthislist'EHELPLEN‚DC.W†67,1,7,1,65,1,71,29,1,51,1,65,61,65,1,71,71,71,69,1,37,0‰NEXTWB‰PAGE***’ERRORMESSAGEPARAMETERBLOCK**EM_PBLK: EM_DO:ƒDC.L†0"*œD0-IOS/FHSRETURNERRORSTATUS*œ(ERRORMSGKEYVALUE) EM_A0:ƒDC.L†0"*œA0-ADDROFI/OPARAMETERBLOCKEM_OPT:‚DC.B†0 *œFUTUREUSEEM_TLUN:DC.B†0*œUSERTERMINALLUN-(LDFLUN)EM_QRC:‚DC.B†0 *œFUTUREUSEEM_KLUN:DC.B†0*œUSERKEYBOARDLUN-(CDFLUN)EM_SPA:‚DC.L†0'*œSTARTADDRESSFORUSERTEXTPLUGPOOLEM_EPA:‚DC.L†0%*œENDƒADDRESSFORUSERTEXTPLUGPOOL‰PAGE ENDDATA‚EQU*‰PAGE BEGPROCƒEQU„**<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<*************************************************************E *2*ˆ***‚PROCEDURESECTIONFORDIRECTORYCOMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************STARPROG EQU *‰LEA‡PBA(PC),A7*œA7=PROGRAMBASEADDRESS(PBA)&***************************************.*ˆ**ƒSAVEDEFAULTVALUEPASSEDFROMSYSTEM****'***************************************=‰MOVEM.LD0-D7/A0-A7,STSKNAM-PBA(A7)„SAVEREG'SATPROGSTART**+*ˆD0TOSTSKNAM=TASKNAMETHATSTARTEDME*ˆD1TOSESNUM‚=SESSIONNUM$*ˆD2TOVOLNAM‚=DEFAULTVOLUMENAME*ˆD3TOUSERNUM=USERNUMBER*ˆD4TOCATNAM‚=CATALOGUENAME*ˆD5TOCATNAM+4**ˆD6=‚LENGTHOFCOMMANDLINE)*ˆD7=BITMASKOFLOGICALUNITSASSIGNED*ˆA0=YOURTASKNAME*ˆA1=TERMINALID*ˆA2=ACTUALUSERNUMBER(*ˆA3=SYSTEMVOLUMEDEFAULE(ALLSPACES)*ˆA4=SYSTEMUSERNUMBER*ˆA5=SYSTEMCATALOGUE*ˆA6=SYSTEMCATPART2*‰PAGE**B*ˆLOGICTOSTOREPREVIOUSLYASSEMBLEDABSOLUTEVALUESINPARAMETER=*ˆBLOCKSINTHESAMEPARAMETERBLOCKSDYNAMICALLYSOPOSITION+*ˆINDEPENDENTCODE(PIC)CANBEESTABLISHED** ‰MOVE.L„A7,A6‰LEA‡PROGSTK(PC),A7*œA6=PROGRAMBASEADDR(PBA)*œA7=STACKADDRESS‰LEA‡SECBUF(PC),A0 ‰MOVE.L„A0,DSKIOS-PBA+IOSSAD(A6)-‰LEA‡DEVBUF(PC),A0•INSERTEDTOCORRECTSPR89 ‰MOVE.L„A0,FETDEV-PBA+FHSPTR(A6)‰LEA‡SECBUFE(PC),A0 ‰MOVE.L„A0,DSKIOS-PBA+IOSEAD(A6)‰MOVE.L„A0,NADR_SEC-PBA(A6)+*œSETSTARTAND/ORENDADDRESSINFOLLOWING*¦DSKIOSPARAMETERBLOCK*¦FETDEVPARAMETERBLOCK *¦SAVEAREA‰LEA‡DIRBLK(PC),A0 ‰MOVE.L„A0,DSKFHS-PBA+FHSSIZ(A6)1*œSETADDRFORDIRECTORYBLOCKINDSKFHSPARMBLK‰PAGE%**************************************+*ˆCONVERTDATEANDSTOREINVERSIONMESSAGE*%*************************************ŠMOVE.L#GTDTIM,D0ŠLEA„TIMBLK(PC),A0ŠTRAPƒ#1*œOBTAINTIME/DATEFROMSYSTEMŠMOVE.LTIMBLK-PBA(A6),D0(ŠBSR„DATEOJCONVERTORDINALTOGREGORIAN.ŠMOVE.LD0,TMPDATE-PBA(A6)SAVEGREGORIANDATEŠAND.L‚#$FF,D0ŒMASKTODAY ŠMOVE.L#2,D1ŠLEA„VDATE+3(PC),A0,ŠBSR„BINDECFJ‹CONVERTDAYTOASCIIANDSTUFF&ŠMOVE.BTMPDATE+2-PBA(A6),D0‡GETMONTHŠLEA„VDATE(PC),A0.ŠBSR„BINDECFJ‹CONVERTMONTHTOASCIIANDSTUFFŠMOVE.WTMPDATE-PBA(A6),D0‰YEARŠLEA„HOLDDATE(PC),A0+ŠBSR„BINDECCONVERTYEARTOASCIIANDSTUFF*ŠMOVE.WHOLDDATE+2-PBA(A6),VDATE+6-PBA(A6)9**********************************************************2*ˆCONVERTTIMEOFDAYANDSTOREINVERSIONMESSAGE*9*********************************************************,ŠMOVE.LTIMBLK+4-PBA(A6),D1ˆMSPASTMIDNIGHTŠCLR.L‚D0‘HOURCOUNTERTL1‡SUB.L‚#1000*60*60,D1&ŠBCS.S‚TL2BRANCHIFHOURSALLCOUNTEDŠADD.L‚#1,D0ŽACCUMULATEHOURS ŠBRA.S‚TL1/TL2‡ADD.L‚#1000*60*60,D1…TOTAL#HOURSISIND0 ŠMOVE.LD1,D3+ŠLEA„HOLDDATE(PC),A0ˆWHERETODEPOSITASCII ŠMOVE.L#2,D1,ŠBSR„BINDECCONVERTHOURTOBINARYANDSTUFF(ŠMOVE.WHOLDDATE+2-PBA(A6),VTIME-PBA(A6)&ŠDIVUƒ#60*1000,D3ˆ#OFMINUTESIND3.W ŠCLR.L‚D0%ŠMOVE.WD3,D0ŽNUMBEROFMINUTESIND0ŠLEA„HOLDDATE(PC),A0 ŠMOVE.L#2,D1.ŠBSR„BINDECCONVERTMINUTESTOBNARYANDSTUFF*ŠMOVE.BHOLDDATE+2-PBA(A6),VTIME+3-PBA(A6)*ŠMOVE.BHOLDDATE+3-PBA(A6),VTIME+4-PBA(A6) ŠCLR.W‚D3ŠSWAPƒD3(ŠDIVUƒ#1000,D3‹NUMBEROFSECONDSIND3.W ŠMOVE.WD3,D0ŠLEA„HOLDDATE(PC),A0 ŠMOVE.L#2,D1/ŠBSR„BINDECCONVERTSECONDSTOBINARYANDSTUFF*ŠMOVE.WHOLDDATE+2-PBA(A6),VTIME+6-PBA(A6).***********************************************'*ˆMOVEREVISIONCODETOVERSIONMESSAGE*.**********************************************&‰MOVE.L„REV_CODE-PBA(A6),V_NBR-PBA(A6)*‰MOVE.L„REV_CODE+4-PBA(A6),V_NBR+4-PBA(A6)"*œREVISIONCODETOVERSIONMESSAGE‰LEA‡ZT_ZERO(PC),A0‰MOVE.L„A0,Z_TABLE-PBA(A6)2*œINITIALIZEADDRPROCESSNEXTIN"Z"OPTIONTABLE‰MOVE.W„#-1,D0‰MOVE.W„D0,ZT_LOU-PBA(A6)3*œINITIALIZELOGONUSERNBRSAMEASTBLTERMINATOR‰PAGE****„DRIVER‚BLOCK„******#************************************&*‰*****CALLCOMMANDPARSEROUTINE‚****#************************E ***************‰TST.LREGD6-PBA(A6)…ISCOMMANDLINEEMPTY‰BNE.SLBUFF‡NO‰MOVE.L#0,A1„INITREG ‰MOVE.LA1,A2*œA1=STARTADDROFOUTPUTFIELD*œA2=STARTADDROFOPTIONFIELD‰BRA.SSETNULL†GOASSGNINPUT*LBUFF:)‰LEABUFFIN(PC),A0ƒSAVEBUFFERSTARTADDR ‰BSRPARSE‰TST.LD0‡CKF0RANYERR0RS‰BMI‡INVMSGRƒBRIFERR0R#‰BTST.L#22,D0ƒISNULLINPUTBITON‰BEQ.SCKDR1‡NO.SETNULL‚MOVE.B#1,FLAGIN-PBA(A6)‚SETNULLFLAG6CKDR1„MOVE.LA2,SAVEOPT-PBA(A6)‚SAVEADDROFOPTPOINT*$**************************************ŠCKFORANYOUTPUT*‚ZEROINA1MEANSNOOUTPUT*$**************************************'‰CMP.L#0,A1‚A1CONTAINSADDROFOUTPUT4‰BNE.SGETOUT†ASSIGN‚OUTPUTISNOTGOINGTOTERMINAL"‰BSRSETLU3†ASSIGNLU3TOTERMINAL ‰BRA.SGETOPT'GETOUTƒBSRNEWOUT…DONEWOUTPUTROUTINE*********************************************%*ˆ**ROUTINETOCHECKFOROPTIONS************************************************ GETOPTƒEQU*/‰MOVE.LSAVEOPT-PBA(A6),A2‚LOADADDROFOPTIONS ‰CMP.L#0,A2#‰BEQ.SDOINPUT‡NOOPTIONSINDICATED%‰BSRCKFOROPT„GOTOCKOPTIONROUTINE/‰TST.B…FLAGH-PBA(A6)‡061184-WASHOPTIONSET?$‰BNE‡LISTHPRINTHELPLISTIFITWAS*+DOINPUT„BSRINITIN†GOTOPROCINPUTROUTINE*œINITIALIZEPARAMETERBLOCKS*¦INPUTPARAMETERBLOCK*¦ASSIGNVOLUMEPARAMETERBLOCK+‰TST.BDFLAG-PBA(A6)‰PRINTDEVICECONDITION‰BNECKTAB‡YES8**********************************************************“DOFHSCALLFORI/O**9********************************************************** ‰CLR.L…D7,*œINITIALIZECOUNTERFORNBRFILESRETRIEVED6GETDIR„CLR.B‚CFLAG-PBA(A6)†INDICATENOCONDIGUOUSFILE-ŠTST.B‚FLAGLF-PBA(A6)…DOWEPRINTLINEFEEDS?ŠBEQ.S‚GD3BRANCHIFNO;ŠTST.B‚PRNTFLG-PBA(A6)„DOWEPRINTLINEFEEDSONTHISPASS?)ŠBEQ.S‚GD2BRANCHIFNO(FIRSTTIMETHRU)GD1‡BSR„LNFEEDTWOLINEFEEDS ŠBSR„LNFEED9GD2‡MOVE.B#1,PRNTFLG-PBA(A6)MARKASNOTFIRSTTIMETHRU3GD3‡TST.B‚FLAGS-PBA(A6)†ISSORTEDOPTIONSPECIFIED?ŠBEQ„GETDIR2ŒBRANCHIFNO*N*ASORTEDDIRECTORYISREQUESTED.‚IFTHISISTHEFIRSTTIMETHROUGH,ALLOCATEE*ƒASEGMENTANDFILLITWITHALLTHESORTEDDIRECTORYENTRIESUSINGAI*ƒLINEARLINKEDLISTSTRUCTURE.‚IFTHISISNOTTHEFIRSTTIMETHRU,FETCHF*ƒTHENEXTDIRECTORYENTRYFROMTHELINKEDLIST,MOVEITTODIRBLKAND*ƒPROCEEDASNORMAL.*2ŠTST.B‚SFIRST-PBA(A6)…ISTHISTHEFIRSTTIMETHRU?ŠBNE„GT500ŽBRANCHIFNO*'* FIRST TIME THRU, ALLOCATE NEW SEGMENT5ŠMOVE.B#1,SFIRST-PBA(A6)‚MARKASNOTFIRSTTIMETHRU2ŠMOVE.LFILCNT-PBA(A6),D1ŠNUMBEROFFILESEXPECTED)ŠMULUƒ#FDLEN+8,D1ˆCOMPUTESIZEOFSEGMENT.*œ+8ISFORINTERNALUSEI.E.LINKAGEPOINTERS+ŠMOVE.LD1,SEGLGH-PBA(A6)‚LENGTHOFSEGMENT‰BSET†#13,SEG_OPTS-PBA(A6)/*œSETOPTIONFOROPERATINGSYSTEMTOALLOCATEA**œSEGMENTWHOSELOGICALADDRESSEQUALSTHE*œPHYSICALADDRESSŠLEA„ALLOCSEG(PC),A0"ŠMOVE.L#GTSEG,D0ŠALLOCATESEGMENTŠTRAPƒ#1 ‰BNE‡IOERPRT"*œJMPIFALLOCATIONERROROCCURRED*G* COLLECT ENTIRES, ENTER THEM IN SORTED ORDER INTO A LINKED LIST IN THE*ƒNEWLYALLOCATEDSEGMENT* ‰MOVE.L„A0,A4*œA4=ADDROFALLOCATEDSEGMENT*ŸFIRSTENTRYPOSITIONŠCLR.L‚ROOT-PBA(A6)‡LISTHEADGT15: ‰BSR‡FETCH_DE*œFETCHNEXTDIRECTORYENTRY%ŠBEQ.S‚GT20BRANCHONSUCCESSFULCALLŠCMP.B‚#FSTAEOD,D0ˆENDOFDATA?%ŠBEQ.S‚GT400ŽBRANCHIFWEGOT'EMALLŠBRA„IOERPRTŒBRANCHONERROR"GT20†EQU„*’COMEHEREFORNEWENTRY<ŠCMP.L‚FILCNT-PBA(A6),D7ŠHAVEWEEXCEEDEDTHEMAXIMUMFILECŠBCS.S‚GT25BRANCHIFNO‰LEA‡FILMAXS(PC),A08ŠMOVE.LA0,SADIO-PBA(A6)…COMPLAINOFFILELIMITEXCEEDED‰LEA‡FILMAXE(PC),A0ŠMOVE.LA0,EADIO-PBA(A6)ŠIOSCALLOUT6IOS(PC)‰MOVE.W„#$C000,TERM_FLG-PBA(A6)"*œSETTYPEOFTERMINATIONTOERROR ‰BRA‡TERMINAT*œTERMINATETASK8GT25†TST.L‚ROOT-PBA(A6)‡SEEIFANYTHINGINTHECHAINYET0ŠBNE.S‚GT50BRANCHIFWEHAVEATLEASTONEENTRY'ŠBSR.S‚MOVENTRY‹MOVEENTRYINTOSEGMENT'ŠMOVE.LA4,ROOT-PBA(A6)„LINKUPTOROOT>GT30†LEA„FDLEN+8(A4),AF 4…POSITIONTONEXTFREESPACEINSEGMENT2ŠADD.L‚#1,D7ŽBUMPCOUNTOFFILESWEHAVEPROCESSEDŠBRA„GT15GOFORANOTHERENTRY=OLD(ŠBRA„GT60ADVANCEA2TOCHECKNEXTENTRY,GT80†BSR.S‚MOVENTRY‹MOVENEWENTRYINTOLIST,ŠMOVE.LA1,(A4)ŒLINKNEXTENTRYTONEWENTRY1GT90†MOVE.LA4,(A2)ŒLINKNEWENTRYTOPRIORENTRY ŠBRA„GT30/GT100…BSR.S‚MOVENTRY‹MOVEENTRYTOENDOFCHAIN ŠBRA„GT90*6* GOT ALL DIRECTORY ENTRIES SORTED (LINKED) IN SEGMENT;GT400…MOVE.LROOT-PBA(A6),RLINK-PBA(A6)SETUPRUNNINGLINK*K*MOVEENTRYFROMLINKEDLISTINTODIRBLKBUFFER.‚IFNOMOREENTRIESBRANCH *ƒTOCKTOT. GT500…EQU„*4ŠTST.L‚RLINK-PBA(A6)†AREWEATTHEENDOFTHECHAIN?ŠBEQ„CKTOTŽBRANCHIFYES ‰MOVE.L„A6,A0*œA0=PBA%ŠMOVE.LRLINK-PBA(A6),A4‹RUNNINGLINK/ŠMOVE.L(A4),RLINK-PBA(A6)ADVANCERUNNINGLINK/ŠLEA„8(A4),A4‹BYPASSLINK...MOVEFROMADDRESSCGT550…MOVEM.L(A4)+,A6/D0-D6„MOVEATOTALOF$3C=60BYTES(15REGS) ŠMOVEM.LA6/D0-D6,DIRBLK-PBA(A0)ŠMOVEM.L(A4)+,D0-D6 ŠMOVEM.LD0-D6,DIRBLK+32-PBA(A0) ŠBRA.S‚DOBLDL*I* SUBROUTINE TO MOVE ENTRY FROM DIRBLK TO TO LINKED LIST POINTED AT BY A4MOVENTRY‚EQU„*ŠCLR.L‚(A4)CLEARNEXTLINK$ŠLEA„DIRBLK(PC),A3ŠMOVEFROMADDRESS ŠLEA„8+32(A4),A5ˆMOVETOADDRESS>ŠMOVEM.L(A3)+,A6/D0-D6„MOVEATOTALFO$3C=60BYTES(15REGS)ŠMOVEM.LA6/D0-D6,-(A5) ŠLEA„8+60(A4),A5ˆMOVETOADDRESSŠMOVEM.L(A3)+,D0-D6ŠMOVEM.LD0-D6,-(A5)‰LEA‡PBA(PC),A6*œA6=PBAŠRTS*GETDIR2: ‰BSR‡FETCH_DE*œFETCHNEXTDIRECTORENTRY‰BEQ.S…GETDIR3*œJMPIFGOODRETURN‰CMP.B#FSTAEOD,D0‚ENDOFDATA‰BEQ.SCKTOTˆENDOFRUN‰BRAIOERPRTˆERR0RGETDIR3: ‰ADD.L…#1,D7*œD7=NBROFFILESRETRIEVEDDOBLDL:‰LEA‡PBA(PC),A6*œA6=PBA#‰BSRBUILDLINƒBRTOBUILDDATALINE$‰TST.BRFLAG-PBA(A6)„RETURNFLAGSET‰BEQ.SCKFLG‡NO*‰MOVE.B#0,RFLAG-PBA(A6)ƒCLEARRETURNFLAG‰BRAGETDIR†GETNEXTENTRY*'*****************************************ˆ**CKFOREXTENDEDOPTION*****'****************************************(CKFLG„TST.BFLAGE-PBA(A6)EXTOPTIONSET‰BEQƒGETDIR„BRANCHIFNO%‰BSRBLDEXTL…GOTOEXTENDLINEOPTION**ˆCKFOROPTIONA+TSTOPTA‚TST.BFLAGA-PBA(A6)ƒADDROPTIONSET‰BEQƒGETDIR†NO ‰BSROPTIONA ‰BRAGETDIR*8* IF THIS WAS 'A' OPTION, PRINT THE TOTAL SPACE CONSUMED+CKTOT…TST.B‚FLAGA-PBA(A6)†WASTHISOPTIONAŠBEQ.S‚STOPITBRANCHIFNO$ŠMOVE.LTOTSIZ-PBA(A6),D0ŠTOTALSIZE**ˆCONVERTTOASCII*&‰MOVE.B#8,D1„PRINTLINESIZEFORCONV%‰LEATFABLMC(PC),A0‚ADDROFRECFIELD ‰BSRBINDECFJ„GOTOCONVROUTINE2‰MOVE.LTOTSIZ-PBA(A6),D0RESETREGWITHTOTVALUE%‰LEATFABLMH(PC),A0‚ADDROFRECFIELD&‰MOVE.L#'0ƒ',(A0)‚BLANKRECEIVEFIELD‰MOVE.L#'„',4(A0) ‰MOVE.L#8,D1‰MOVE.W#$2000,D2‚INITTHLCU1ƒROL.L#4,D0†GET4BITS‰MOVE.BD0,D2„SAVED0)‰AND.B#$F,D2„CLEARALLEXCEPTLOW4BITS"‰ADD.B#$20,D2ƒSETFORSPACECHECK ‰CMP.W#$2020,D2‚LEADINGSPACE?‰BEQ.STHLCU3„YES‰ADD.B#$10,D2ƒCONVERTTONUM‰CMP.B#$39,D2ƒISITANUM‰BLE.STHLCU2„YES‰ADD.B#7,D2…GETTOLETTERSTHLCU2ƒMOVE.BD2,(A0)+THLCU3ƒASL.W#8,D2†MOVEWORD‰SUB.B#1,D1…REDUCECOUNT‰BHITHLCU1†BRNOTZERO‰LEA‡TFABLM(PC),A0.‰MOVE.LA0,OUT3IOS-PBA+IOSSAD(A6)‚STARTOFMSG‰LEA‡TFABLME(PC),A0,‰MOVE.LA0,OUT3IOS-PBA+IOSEAD(A6)‚ENDOFMSG‰OUT3PƒOUT3IOS(PC) ‰BNE‡IOERPF RT** *ˆSTOPTHEPROGRAMATTHISPOINTSTOPIT:‰CLR.W…TERM_FLG-PBA(A6)2*œINITIALIZETERMINATEFLAGFORNORMALTERMINATION ‰BSR‡LNFEED ‰BSR‡LNFEED$*œLINEFEEDPRIORTOWRITINGMESSAGE ‰MOVE.L„D7,D0*œD0=NBRFILESRETRIEVED ‰BEQ.S…ITSTOP*œJMPIFNOFILESRETRIEVED ‰MOVE.L„#6,D1 *œD1=MAXNBRCHTRSTOCONVERTTO‰LEA‡X00110(PC),A0*œA0=ADDRSTORECONVERTEDDATA ‰BSR‡BINDECFJ**œCONVERTNBRFILESRETRIEVEDTODECASCII‰LEA‡X00100(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSSAD(A6)‰LEA‡X00199(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSEAD(A6)1*œSETMESSAGESTART/ENDADDRTOIOSPARAMETERBLK‰OUT3P…OUT3IOS(PC)$*œOUTPUTNBRFILESRETRIEVEDMESSAGEITSTOP:+‰TST.BFLAG1-PBA(A6)†WASONEITEMPRINTED?‰BNE.S…STOPITTƒYES‰CLR.BFLAG1-PBA(A6)‰LEA‡NOMSG(PC),A4/‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)…STARTADDRESS‰LEA‡NOMSGE(PC),A4-‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)…ENDƒADDRESS‰OUT3P…OUT3IOS(PC),‰MOVE.W„#$1000,TERM_FLG-PBA(A6)‡SENDWARNINGSTOPITT: ‰BRA‡TERMINAT‰PAGE** *ˆRTNETO*’FETCHNEXTDIRECTORYENTRY**ˆIF"Z"OPTIONSPECIFIED*ANDENDOFDATARETURNEXIST-*’ANADJUSTMENTWILLBEMADETOFINDTHENEXT2*’USERNBRUNTILTHE"Z"OPTIONTABLEISPROCESSED** FETCH_DE:‰LEA‡DSKFHS(PC),A0 *œA0=ADDRESSFHSPARAMETERBLOCK‰MOVE.W„#FHFDEN,FHSCMD(A0)+*œSETFETCHDIRECTORYENTRYCMDINPARMBLK ‰FHSCALLƒ(A0)*œFETCHDIRECTORYENTRY‰CMP.B…#1,FLAGZ-PBA(A6)‰BNE.S…FDE_0100!*œJMPIF"Z"OPTIONNOTSPECIFIED‰CMP.B…#FSTAEOD,D0‰BEQ.S…FDE_0200*œJMPIFENDOFDATA FDE_0100:‰LEA‡DSKFHS(PC),A0*œA0=ADDRFHSPARAMETERBLOCK ‰TST.L…D0**œRESTORESTATUSTOSAMEASAFTERFHSCALL‰RTS FDE_0200:‰MOVE.L„Z_TABLE-PBA(A6),A0(*œA0=ADDROFNEXTTABLEENTRYTOPROCESS ‰TST.W…(A0)‰BMI.S…FDE_0100#*œJMPIF"Z"OPTIONTABLEPROCESSED‰MOVE.W„(A0)+,D0*œD0=USERNBRTOPROCESSNEXT‰MOVE.L„A0,Z_TABLE-PBA(A6)%*œA0=ADDRNEXTTABLEENTRYTOPROCESS‰LEA‡DSKFHS(PC),A0*œA0=ADDRFHSPARAMETERBLOCK‰MOVE.W„D0,FHSUSN(A0)*œSETNEXTUSERNBRTOPROCESS‰BRA.S…FETCH_DE2*œFETCHNEXTDIRECTORYENTRYWITHTHENEWUSERNBR‰PAGE>****************************************************************ˆ****ƒOPTIONSROUTINECALL‚****4*ˆTHISROUTINEWILLCKINPUTTODETERMINEIFOPTIONS+*ˆHAVEBEENREQUESTED.OPTIONFLAGSARESET*?****************************************************************CKFOROPT‚EQU* ‰BSROPTION#‰BTST#6,D0†CKFORCARRRETURNFLAG'‰BNE.S‚ENDOPT†EXIT-CARRAGERETBITON)OPTERCK:BTST#7,D0†CKFORERR0RBITSSET)‰BNE‡INVMSGR†FOUNDINVALIDFLAGCONDITION0OPTOK„TST.LD1ˆISLETTERIND1WITHAMINUSSIGN‰BMI.S…CKFOROPTŒYES"*œJMPIF"NOTOPTION"ISSPECIFIED+*œITWILLBEIGNOREDANDNEXTCHTROBTAINED*+********************************************/*‰***CKFORE(PRINTALLATTRIBUTES)OPTION***,*********************************************‰CMP.B#'E',D1ƒEOPTIONSET‰BEQ.SSETEˆYES*.***********************************************/*ˆ**CKFORA(PRINTSEGMENTADDRESSOPTION)***.***********************************************CKFORAƒCMP.B#'A',D1ƒAOPTION‰BEQ.SSETAˆYES*-************************************************ˆ**CKFORS(SORTEDDIRECTORYOPTION)***-**********************************************CKFORS„CMP.B‚#'S',D1ŒSOPTION?ŠBEQ.S‚SETSBRANCHIFYES-***********************************************ˆ061184*ˆ**CKFORH(HELPOPTION)***-**********************************************CDFORHƒCMP.B…#'H',D1ŠHOPTION?‰BEQ.S…SETHPRINTLISTIFYES-**********************************************,*ˆ**CKFORZ(PRINTSYSTEMFILES)OPTION***-*********************************************)CKFORZƒCMP.B#'Z',D1ƒCKFORSYSTEMOPTION%‰BNE.S…INV_OPTƒERRORNOTVALIDOPTION(‰MOVE.B#1,FLAGZ-PBA(A6)‚SETSYSTEMFLAG‰BRA.SCKFOROPT**"***********************************@*‰**BIT6IND0SETMEANSTHECARRAGERETURNISTHENEXTCHAR**"****************************G *******0SETA†MOVE.B#1,FLAGA-PBA(A6)SETSYSTEMALLFLAG.SETE…MOVE.B#1,FLAGE-PBA(A6)‚SETEOPTIONFLAG3ŠMOVE.B#1,FFLAG-PBA(A6)SETPRINTDETAILLINEFLAG,ŠMOVE.B#1,FLAGLF-PBA(A6)SETLINEFEEDFLAG‰BRA.S…CKFOROPT.SETS†MOVE.B#1,FLAGS-PBA(A6)ƒSETSOPTIONFLAG#ŠBTSTƒ#4,D0ŽWASANUMBERSPECIFIED?‰BEQ.S…CKFOROPT‰BRANCHIFNO5ŠMOVE.LD3,FILCNT-PBA(A6)‚SAVECOUNTOFFILESTOSORT‰BRA.S…CKFOROPT**************************** *‡061184-ADDEDFORHELPOPTION****************************SETH…MOVE.B„#1,FLAGH-PBA(A6)‰BRA.S…CKFOROPT* ENDOPTƒRTSŒ.‚RETURNFROMROUTINEINV_OPT:‰MOVE.L„#EM_NVO,D0)*œD0=KEYVALUEFORINVALIDOPTIONMESSAGE ‰BRA‡IOERPRT‰PAGE/************************************************)*ˆ***‚SETUPFHSPARMBLOCKFORINPUT****7*ˆTHISROUTINEWILLINITIALIZETHEINPUTFILEPARAMETER!*ˆBLOCKANDASSIGNTHEDIRVOLUMN*/************************************************INITIN: ‰MOVE.L„A6,A3*œA3=PBA%‰LEA‡BUFFIN(PC),A0‚ADDROFSTARTSCAN)‰LEA‡DSKFHS(PC),A6‚ADDROFFHSPARMBLOCK*‰MOVE.LVOLNAM-PBA(A3),FHSVOL(A6)‚VOLNAME4‰MOVE.WUSERNUM-PBA(A3),FHSUSN(A6)‚USELOGONUSER#+‰MOVE.LCATNAM-PBA(A3),FHSCLG(A6)‚CATALOGUE%‰MOVE.LCATNAM+4-PBA(A3),FHSCLG+4(A6).‰MOVE.LAST-PBA(A3),FHSFIL(A6)‚AST2FILENAME ‰MOVE.LAST-PBA(A3),FHSFIL+4(A6)3‰MOVE.WAST-PBA(A3),FHSEXT(A6)‚AST2EXTENSIONNAME**‰CHECKFORNULLINPUT*‰TST.BFLAGIN-PBA(A3)+‰BEQ.SINITEDIT†JMPIFINPUTFILESPECIFIED‰LEA‡DALL(PC),A0‚INITPOINTER*œFORCEACOMMANDLINEOF*.*CR*&****************************************ˆ**ƒCALLEDITFILEROUTINE***&*************************************** INITEDIT:!‰BSREDITFILE„MAKEEDITFILECALL‰BMI‡INVMSGR‡ERR0R‰LEA‡PBA(PC),A3*œA3=PBA‰BTST#1,D0‡WASDEVICEBITSET‰BEQ.SINITIN2ˆNO*ˆSETDEVICEFLAG.‰MOVE.B#1,DFLAG-PBA(A3)‚SETPRINTDEVICEINFO ‰BRA‡INITINO*2**************************************************8*ˆCKFOR*INUSERNUMBERFIELDIFYESTURNOFFZOPTION2*ˆEDITFILEROUTINEPUT-2INPARMIF*WASPRESENT2**************************************************0INITIN2‚CMP.W#-2,FHSUSN(A6)‚ALLINUSER#FIELD‰BNE.SINITINA…NO!‰CLR.BFLAGZ-PBA(A3)…ZOPTIONOFF‰BRA.SINITINB INITINA‚EQU*.‰TST.BFLAGZ-PBA(A3)…WASZERO(SYSTEM)FLAGON‰BEQ.SINITINBƒNO‰MOVE.W„FHSUSN(A6),D0*œD0=DEFAULTUSERNBR ‰TST.W…D0‰BEQ.S…INITINAA *œJMPIFDEFAULTUSERNBR=ZERO‰MOVE.W„D0,ZT_LOU-PBA(A3)/*œESTABLISHLOGONUSERNBRIN"Z"OPTIONTABLE INITINAA:‰MOVE.L„Z_TABLE-PBA(A3),A0(*œA0=ADDROFNEXTTABLEENTRYTOPROCESS‰MOVE.W„(A0)+,FHSUSN(A6)3*œSETUSERNBRPROCESSNEXT(FIRST)INFHSPARMBLK‰MOVE.L„A0,Z_TABLE-PBA(A3)'*œSAVEADDRNEXTTABLEENTRYTOPROCESS* INITINB‚EQU**ŠASSIGNDIRVOL‚***5*ˆCOMMAND,VOLNAMEANDLU#ARESETUPINPARMBLOCK**‰LEAVOLFHS(PC),A0'‰MOVE.L#'„',FHSCLG(A0)‚BLANKCATALOGUE‰MOVE.L#'„',FHSCLG+4(A0)+‰MOVE.LFHSVOL(A6),FHSVOL(A0)‚MOVEVOLNAME'‰MOVE.L#'„',FHSFIL(A0)‚BLANKFILENAME‰MOVE.L#'„',FHSFIL+4(A0)'‰MOVE.W#'‚',FHSEXT(A0)‚BLANKEXTENSION* ‰FHSCALL(A0)'*Š**‚RETURNFROMFILEHANDLERSYSTEM**‰BNEIOERPRTˆERR0R8‰MOVE.LFHSVOL(A0),NOMSGVOL-PBA(A3)‚SAVEVOLNAMEINMSG*;* TEST FOR PROTECTION CODE ERROR IF 'A' OPTION WAS SELECTED-ŠTST.B‚FLAGA-PBA(A3)†WAS'A'OPTIONSELECTED?ŠBEQ.S‚INITINOŒBRANCHIFNO.ŠLEA„DSKIOS(PC),A0ŠI/OPARAMETERBLOCKADDRESS)ŠCLR.L‚IOSRRN(A0)‰TRYTOREADSECTORZERO2ŠMOVE.WIOSOPT(A0),-(A7)ƒSAVEPREVIOUSOPTIONBITS‰LEA‡SECBUF(PC),A6*œA6=STARTADDRESS:ŠMOVE.W#IOPRAN+IOPWAT+IOPIMG,IOSOPT(A0)RANDOMBLOCKREAD,ŠMOVE.LA6,IOSSAD(A0)STARTINGSECTORNUMBER‰LEA‡SECBUFE(PC),A6*œA6=ENDADDRESS*ŠMOVE.LA6,IOSEAD(A0)ENDINGSECTORNUMBER ŠIOSCALL(A0)ŽTRYTODOTHEREAD1ŠMOVE.W(A7)+,IOSOPT(A0)ƒRESTOREPREVIOUSOPTIONS2ŠCMP.B‚#ISTAPC,D0‰DIDWEGETAPROTECTCODEERROR?ŠBNE.S‚INITINOŒBRANCHIFNO‰LEA‡AOPERMSS(PC),A6*œA6=STARTADDR8ŠMOVE.LA6,SADIO-PBA(A3)„TELLTHEM'A'OPTIOG NWON'TWORK‰LEA‡AOPERMSE(PC),A6 *œA6=ENDADDRŠMOVE.LA6,EADIO-PBA(A3)ŠIOSCALLOUT6IOS(PC)'ŠCLR.B‚FLAGA-PBA(A3)†CLEARTHE'A'FLAG INITINO‚EQU*‰LEA‡PBA(PC),A6*œA6=PBA‰RTSŽ.RETURNFROMROUTINE‰PAGE.***********************************************"*ˆ**BUILDDIRECTORYPRINTLINE‚****FILENAMEONLY*0************************************************BUILDLIN EQU *,‰LEADIRBLK(PC),A4SETUPDIRPARBLOCKADDR‰CMP.B#1,FLAGZ-PBA(A6)&‰BEQƒCKSYS‰JMPIF"Z"OPTIONSPECIFIED2BLD1…MOVE.LNOMSGVOL-PBA(A6),VOLPRT-PBA(A6)‚VOLUMEN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>)‰IF.BƒFDCLG(A4)#$20THEN.Sœ05/07/84:‹MOVE.L#'&ƒ',L1CAT-PBA(A6)‚ShowthatitisaNULLcatalog‰ELSE.S.‹MOVE.LFDCLG(A4),L1CAT-PBA(A6)‚MOVECATALOGUE‰ENDI¹05/07/84N*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#‰MOVE.LFDCLG+4(A4),L1CAT+4-PBA(A6)* *ˆUSERNUMBER* ‰CLR.LD0‰MOVE.WFDUSN(A4),D0+‰LEAL1USN(PC),A0„USERNUMBERCONVTOASCII ‰BSRBINDEC*)‰MOVE.LFDFIL(A4),L1FIL-PBA(A6)‚FILENAME#‰MOVE.LFDFIL+4(A4),L1FIL+4-PBA(A6)*5‰MOVE.WFDEXT(A4),L1EXT-PBA(A6)‚1STCHAROFEXTENSION**‰LEA‡PRTBUF(PC),A10‰MOVE.L„A1,OUT3IOS-PBA+IOSSAD(A6)‚MSGSTARTADDR!‰LEADIRMSG(PC),A1„LOADSENDADDR ‰LEAPRTBUF(PC),A2ƒLOADRECADDR‰MOVE.L#DIRMSGL,D1*™D1=LENGTHOFMSG%*žENDOFMSGADDRISSETUPINSPCOMP ‰BSR.SSPCOMP†CALLSPACEREMOVER*2***************************************************$*ˆ**‚PRINTFIRSTLINEWITHVOLUMEID*2***************************************************‰TST.BƒFFLAG-PBA(A6)-ŠBEQ.S‚BLD5BRANCHIFNODETAILLINETOPRINT'ŠMOVE.LLNCNT-PBA(A6),A0‹EJECTPAGE...%ŠADD.L‚#4,A0Ž...IFWECANNOTFIT...*ŠTST.B‚FLAGA-PBA(A6)†...FIRSTPARTOF...&ŠBEQ.S‚BLD2...DETAILINFORMATION...#ŠADD.L‚#4,A0Ž...ONTHECURRENT...%BLD2†CMP.L‚ROWCNT-PBA(A6),A0Š...PAGE ŠBLS.S‚BLD5 ŠBSR„EJECTBLD5:ŠOUT3P‚OUT3IOS(PC)*‰BNE‡IOERPRTˆERR0R/‰TST.BƒFFLAG-PBA(A6)†DOWEPRINTDETAILHEADER?‰BEQ.SƒBLD6BRANCHIFNO!‰BSR.SƒPRTDETPRINTDETAILHEADER**9BLD6…MOVE.B#1,FLAG1-PBA(A6)‚SETPRINTATLEASTONCEFLAG**BLDLINE‚RTSŒ.RETURNFROMBUILDLINROUTINE‰PAGE********************************ˆCHECKFORSYSTEMROUTINE***************************** CKSYS„EQU*$‰TST.WSDBUSN(A4)‚ISTHISA0USER# ‰BEQBLD1‰MOVE.WUSERNUM-PBA(A6),D1$‰CMP.WSDBUSN(A4),D1‚LOGONUSERNUM ‰BEQBLD1ˆYES *ŠRFLAGSETMEANSTHISISAFILE*ŠTHATSHOULDNOTBEPROCESSED$‰MOVE.B#1,RFLAG-PBA(A6)‚RETURNFLAG ‰RTS‘EXIT*,**********************************************ˆSUBROUTINETOSPACECOMPRESS&*ŠA1CONTAINSTHESENDINGLINEADDRESS(*ŠA2CONTAINSTHERECEIVINGLINEADDRESS,*ŠD1CONTAINSTHELENGTHOFTHESENDINGLINE*,*********************************************"SPCOMP…CMP.B#'',(A1)‚ISITBLANK‰BEQ.SSPCOMP3ˆYES&‰MOVE.B(A1)+,(A2)+‚MOVETOPRINTLINE"BLDECK„SUB.W#1,D1…ISTHISTHEEND‰BGESPCOMPˆNO‰SUB.L#1,A2…ESTABLISHEND-‰MOVE.LA2,OUT3IOS-PBA+IOSEAD(A6)‚ENDOFDATA ‰RTSRETURN*$SPCOMP3…ADD.W#1,A1‡INCADDROFSEND ‰BRABLDECK**2***************************************************4*ˆSUBROUTINETOPRINTHEADERLINES1&2FORDETAIL*2***************************************************PRTDET:‰MOVE.L„A4,-(A7) *œSAVEREG‰LEA‡HDET1(PC),A42‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)‚STARTOFHEADER1‰LEA‡HDET1E(PC),A4%‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)‚END‰OUT3PƒOUT3IOS(PC)ƒPRINTLINE1*‰LEA‡HDET2(PC),A41‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)‚HEADDETLINE2‰LEA‡HDET2E(PC),A4%‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)‚END)‰OUT3PƒOUT3IOS(PC)‚PRINTLINE2OFHEADER*‰MOVE.L„(A7)+,A4 *œRESTOREREG ‰RTSŒ.RETURN*‰PAGE0************************************************* *ŒOPTIONH*†PRINTHELPMESSAGE*Š061184*0*************************************************LISTH„LEA‡HELPMSG(PC),A2”STARTOFHELPMSG)‰LEAH ‡HELPLEN(PC),A1”TABLEOFLINELENGTHS?PLINE„MOVE.L„A2,OUT3IOS-PBA+IOSSAD(A6)…STORELINESTARTADDRESS&‰ADDA.W„(A1)+,A2–ADDLENGTHOFMESSAGE8‰MOVE.L„A2,OUT3IOS-PBA+IOSEAD(A6)…STORELINEENDADDRESS$‰OUT3P…OUT3IOS(PC)“PRINTTHEMESSAGE'‰ADDA.W„#1,A2™POINTA2TOSTARTOFLINE$‰TST.W…(A1)šCHECKFORENDOFMESSAGE ‰BNE.S…PLINE™PRINTTHENEXTLINE/‰CLR.W…TERM_FLG-PBA(A6)ŽSETCODEFORNORMALEND‰BRA‡TERMINAT–EXITPROGRAM‰PAGE0************************************************* *ŒOPTIONE*ˆBUILDEXTENDEDDISPLAYLINE*0************************************************** BLDEXTL‚EQU**+‰LEADIRBLK(PC),A4ƒINITDIRPARMBLOCKADDR*$*************************************ˆCHECKFORCONTIGUOUSFILE *********************************‰MOVE.BFDATT(A4),D0‚SAVEBYTE#‰AND.B#DFTBIT,D0‚REMOVEOTHERBITS+‰CMP.B#DATCON,D0‚CKFORCONTIGUOUSSETTING‰BNE.SPROCNONC'‰BSRCONTIG†GOTOCONTIGUOUSPROCESSING&‰BRACOMMON†CONTINUECOMMONPROCESSING*,**********************************************ˆPROCESSNONCONTIGUOUSFILE*,*********************************************PROCNONC EQU ***0************************************************)*ˆATTRIBUTES(MUSTBE1STINTHISROUTINE%*“ORD0MUSTBERESETWITHFDATT(A4))0*************************************************‰MOVE.L#'„',DATT-PBA(A6)‚INIT/‰CLR.BCFLAG-PBA(A6)CLEARCONTIGUOUSFILEFLAG"‰CMP.B#DATSEQ,D0‚ISITSEQUENTIAL‰BNE.SPAT1ˆNO-‰MOVE.W#'S',DATT-PBA(A6)‚MOVESEQINDICATIO ‰BRA.SPNONFE* *********************************ˆKEYEDISAMWITHNODUPKEYS *********************************&PAT1…CMP.B#DATISK,D0‚ISITKEYEDISAM‰BNE.SPAT2ˆNO3‰MOVE.W#'IK',DATT-PBA(A6)‚KEYEDISAM-NODUPKEYS ‰BRA.SPNONFE******************************** *ˆKEYEDISAMWITHDUPLICATEKEYS********************************PAT2…CMP.B#DATISD,D0‰BNE.SPNONFEˆNOTKEYED3‰MOVE.W#'ID',DATT-PBA(A6)‚KEYEDISAMWITHDUPKEYS**)*****************************************!*ˆLASTFABPHYSICALSECTORNUMBER)******************************************PNONFEƒMOVE.LFDFE(A4),D0 ‰MOVE.L#6,D1‰LEADFE-1(PC),A0 ‰BSRBINHEX*+********************************************ˆLOGICALSECTORENDOFFILE+********************************************‰MOVE.LFDEOF(A4),D0 ‰MOVE.L#5,D1‰LEADLOG(PC),A0&‰MOVE.B„BLANK1S-PBA(A6),DLOG-1-PBA(A6)*œREMOVE"$"IFONEEXIST ‰BSRBINHEX*********************************************ˆNUMBEROFRECORDS********************************************‰MOVE.LFDEOR(A4),D0/*ˆ#OFRECORDSIS1GREATERTHANVALUEOFFDEOR ‰ADD.L#1,D0‰MOVE.L#7,D1„SIZE‰LEADRNUM(PC),A0 ‰BSRBINDECFJ*+********************************************ˆRECORDLENGTH+********************************************‰CLR.LD0ˆINIT‰MOVE.WFDLRL(A4),D0 ‰MOVE.L#5,D1‰LEADLRL(PC),A0 ‰BSRBINDECFJ*$************************************ *ˆKEYLENGTH!**********************************‰CLR.LD0ˆINIT‰MOVE.BFDKEY(A4),D0 ‰MOVE.L#3,D1‰LEADKEY(PC),A0 ‰BSRBINDECFJ**)***************************************** *ˆFABLENGTH)****************************************** ‰CLR.LD0‰MOVE.BFDFAB(A4),D0 ‰MOVE.L#3,D1‰LEADFAB(PC),A0 ‰BSRBINDECFJ*!**********************************ˆDATABLOCKSIZE!********************************** ‰CLR.LD0‰MOVE.BFDDAT(A4),D0 ‰MOVE.L#3,D1‰LEADDAT(PC),A0 ‰BSRBINDECFJ**4*****************************************************/*ˆTHEFOLLOWINGFIELDSARECOMMONTOCONTIGUOUS*ˆANDNONCONTIGUOUSFILES*4***************************************************** COMMONƒEQU**%*************************************'*ˆFILESTARTOR1STFABPHYSICALSECT#$*************************************‰MOVE.LFDFS(A4),D0‚SOURCE‰MOVE.L#7,D1„SIZE#‰LEADETAIL(PC),A0†RECEIVELOCATION ‰BSRBINHEX*-**********************************************ˆREAD&WRITEACCESSCODES-******************H ****************************‰CLR.LD0ˆINIT,‰MOVE.WFDWCD(A4),D0‚LOADWRITE&READCODES ‰BSRCVTKEYBA*,*ˆUPONRETURNFROMCVTKEYBATHEWRITEKEYIS+*ˆINLEFT2BYTESOFD0ANDTHEREADKEYIS*ˆINTHERIGHT2BYTESOFD0*%‰MOVE.WD0,DRCD-PBA(A6)‚MOVEREADKEY‰SWAPD0&‰MOVE.WD0,DWCD-PBA(A6)‚MOVEWRITEKEY*)*****************************************&*ˆDATEFILEWASLASTACCESSED/ASSIGNED)******************************************(****************************************#*ˆCONVERTORDINALDATETOGREGORIAN(*****************************************ˆGETDATEOFACCESSED/ASSIGNED* ‰CLR.LD0‰MOVE.WFDDTEA(A4),D0(‰BSRDATEOJŠCONVERTORDINALTOGREGORIAN*.‰MOVE.LD0,TMPDATE-PBA(A6)‚SAVEGREGORIANDATE*.***********************************************ˆCONVERTDAYTOASCII.***********************************************‰AND.L#$FF,D0ƒSAVELOWBYTE‰MOVE.L#2,D1„SIZEOFRECFIELD#‰LEADDATE3(PC),A0ƒADDROFRECAREA ‰BSRBINDECFJ*&***************************************ˆCONVERTMONTHTOASCII&*************************************** ‰CLR.LD0&‰MOVE.BTMPDATE+2-PBA(A6),D0‚GETMONTH‰MOVE.L#2,D1„SIZE‰LEADDATE2(PC),A0 ‰BSRBINDECFJ*)******************************************ˆCONVERTYEARTOASCII)****************************************** ‰CLR.LD0‰MOVE.WTMPDATE-PBA(A6),D0‰LEAHOLDDATE(PC),A0 ‰BSRBINDECB‰MOVE.WHOLDDATE+2-PBA(A6),DDATE1-PBA(A6)‚MOVELAST2DIGITSOFYR*)*****************************************$*ˆDATEFILEWASLASTCHANGED/CREATED)******************************************(****************************************#*ˆCONVERTORDINALDATETOGREGORIAN(*****************************************ˆGETDATEOFCHANGED/CREATED* ‰CLR.LD0‰MOVE.WFDDTEC(A4),D0 ‰BSRDATEOJŠCONVERTTOGREGORIAN*.‰MOVE.LD0,TMPDATE-PBA(A6)‚SAVEGREGORIANDATE*.***********************************************ˆCONVERTDAYTOASCII.***********************************************‰AND.L#$FF,D0ƒSAVELOWBYTE‰MOVE.L#2,D1„SIZEOFRECFIELD$‰LEADCDATE3(PC),A0‚ADDROFRECAREA ‰BSRBINDECFJ*&***************************************ˆCONVERTMONTHTOASCII&*************************************** ‰CLR.LD0&‰MOVE.BTMPDATE+2-PBA(A6),D0‚GETMONTH‰MOVE.L#2,D1„SIZE‰LEADCDATE2(PC),A0 ‰BSRBINDECFJ )******************************************ˆCONVERTYEARTOASCII)****************************************** ‰CLR.LD0‰MOVE.WTMPDATE-PBA(A6),D0‰LEAHOLDDATE(PC),A0 ‰BSRBINDECC‰MOVE.WHOLDDATE+2-PBA(A6),DCDATE1-PBA(A6)‚MOVELAST2DIGITSOFYR**'*****************************************ˆPRINTEXTENDEDDISPLAYLINE*'***************************************‰MOVE.L„A4,-(A7) *œSAVEREG‰LEA‡DETAIL(PC),A4,‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)STARTADDR‰LEA‡DETAILE(PC),A4*‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)‚ENDADDR‰MOVE.L„(A7)+,A4 *œRESTOREREG‰OUT3PƒOUT3IOS(PC)* ‰BNE‡IOERPRT+ŠTST.B‚FLAGA-PBA(A6)†ISTHE'A'OPTIONSET?ŠBEQ.S‚BLDEXRTS‹BRANCHIFNO,‰BSRLNFEED‘LINEFEEDIF'A'OPTIONONLYSET*BLDEXRTSRTSŒ.RETURNFROMBLDEXTLROUTINE******+*********************************************ˆPROCESSCONTIGUOUSFILE*+********************************************CONTIG:*****************************ˆBLANKUNUSEDFIELDS****************************)‰LEADFS(PC),A0†INITSTARTOFDETAILLINE‰MOVE.L„A4,-(A7) *œSAVEREG‰LEA‡DSTOP(PC),A4*œA4=ENDADDROFDETAILLINECONCL„MOVE.L#'„',(A0)+ ‰CMP.L…A4,A0 ‰BMICONCL*œJMPIFMORETOBLANKOUT‰MOVE.L„(A7)+,A4 *œRESTOREREG‰MOVE.B#'-',D0-‰MOVE.BD0,DLOG+3-PBA(A6)ƒINDICTENULLFIELDS‰MOVE.BD0,DRNUM+3-PBA(A6)‰MOVE.BD0,DLRL+3-PBA(A6)‰MOVE.BD0,DKEY+2-PBA(A6)‰MOVE.BD0,DFAB+2-PBA(A6)‰MOVE.BD0,DDAT+2-PBA(A6)*+********************************************ˆCONTIGUOUSIND+********************************************1‰MOVE.B#1,CFLAG-PBA(A6)‚SETCONTIGUOUGFILEFLAG5I ‰MOVE.L#'C‚',DATT-PBA(A6)„CONTIGUOUSFILEINDICATOR+******************************************* *ˆFILEEND+********************************************#ŠMOVE.LFDFE(A4),D0ˆGETFILELENGTH+ŠADD.L‚D0,TOTSIZ-PBA(A6)‚KEEPRUNNINGTOTAL-ŠADD.L‚#1,TOTSIZ-PBA(A6)‚REALLENGTH=FDFE+1'ŠADD.L‚FDFS(A4),D0ˆADDSTARTINGADDRESS* CONVERT TO HEXŠMOVE.L#6,D1ŽSIZEŠLEA„DFE-1(PC),A0RECLOCŠBSR„BINHEXFORENDDISPLAYŠRTS—RETURNFROMCONTIGSECTION‰PAGE1*ˆROUTINETOCHECKDEVICETABLEFORRANDOMACCESS%*ˆANDPRINTTHEVOLUMEFORTHEDEVICE*ˆA6=PBA*CKTAB: ‰MOVE.L„A6,A5*œA5=PBA‰LEA‡DSKFHS(PC),A6#*œA6=DSKFHSPARAMETERBLOCKADDRESS‰CLR.W…TERM_FLG-PBA(A5)+*œSETTERMINATIONFLAGFORGOODTERMINATION*‰FHSCALLFETDEV(PC)‚MAKEDEVICETABLECALL‰BNEIOERPRT…ERROR‰LEAFETDEV(PC),A0,‰LEADEVBUF(PC),A1ƒBUFFER-CORRECTSSPR897 ‰MOVE.WFHSLEN(A0),D1‚TABLESIZE'‰MOVE.LFHSVOL(A6),D4‚DEVICEFROMINPUT‰LEA‡DEVM(PC),A30‰MOVE.L„A3,OUT3IOS-PBA+IOSSAD(A5)„MSGSTARTADDR&‰MOVE.LD4,DEVM1-PBA(A5)‡DEVICETOMSG TABLOPƒEQU*‰CMP.LFDVDEV(A1),D4‚DEVICE=‰BEQ.SMOVTAB†YES ‰SUB.W#1,D1‰BLE.SNOFND‡ATEND‰ADD.L#FDVLEN,A1‚ADDOFFSET‰BRATABLOP†CKNEXT1MOVTABƒMOVE.LFDVVOL(A1),DEVM2-PBA(A5)‰VOLTOMSG‰LEA‡DEVME(PC),A3)‰MOVE.L„A3,OUT3IOS-PBA+IOSEAD(A5)„MSGEND*œSETUPFORASSIGN.‰MOVE.LFDVVOL(A1),FHSVOL(A6)‚MOVEINVOLNAME ‰MOVE.L„A5,A3*œA3=PBA&*ŸREQUIREDFORINITINBSUBROUTINECALL ‰BSRINITINB$*œSETUPUSER#&DESCRIPTIONFIELDS"‰IOSCALLDSKIOS(PC)ƒREADSECTZERO ‰BNEIOERPRT‰LEASECBUF(PC),A4 ‰CLR.LD0 ‰MOVE.WVIDUSN(A4),D0‚GETUSER#‰LEAUDMN(PC),A0 ‰BSRBINDEC*œSETUPVOLUMEDESCRIPTION‰LEAVIDVD(A4),A2‰LEAUDMD(PC),A3‰LEA20(A3),A4 NAML…EQU*‰MOVE.L(A2)+,(A3)+‰CMP.LA3,A4…ATEND ‰BGTNAML*œPRINTVOLUMENAME‰IOSCALLƒOUT3IOS(PC)‰LEA‡UDM(PC),A6!‰MOVE.L„A6,OUT3IOS-PBA+IOSSAD(A5)‰LEA‡UDME(PC),A6!‰MOVE.L„A6,OUT3IOS-PBA+IOSEAD(A5)*œPRINTLASTLINE TABPRTƒEQU*‰IOSCALLƒOUT3IOS(PC)* ‰BRA‡TERMINAT*NOFND:‰LEA‡DEVM(PC),A3*œADDRMOVEFROM‰LEA‡DEVMN(PC),A6*œADDRMOVETO‰MOVE.B„#DEVM1E,D0*œNBRBYTESTOMOVENOFND10:‰MOVE.B„(A3)+,(A6)+ ‰SUB.B…#1,D0‰BNE.S…NOFND10%*œMOVEDEVICENO.OFVOLUMENOTFOUND‰LEA‡DEVMN(PC),A62‰MOVE.L„A6,OUT3IOS-PBA+IOSSAD(A5)†NEXTPARTOFMSG‰LEA‡DEVMNE(PC),A6!‰MOVE.L„A6,OUT3IOS-PBA+IOSEAD(A5) ‰BRATABPRT*‰PAGE(***************************************** *ˆOPTIONA<*ˆROUTINETOPRINTINFORMATIONFROMTHE(FAB)DATASTRUCTURE3*ˆPRINTPSNOF1STSECTORALLOCATEDTOTHESEGMENT,%*ˆTHE#OFRECORDSINTHEDATABLOCK,,*ˆANDTHE#OFSECTORSINUSEINTHESEGMENT9*ˆTHEFABDATASTRUCTUREISDESIGNEDSUCHTHATTHEFIELDS;*ˆBEINGOBTAINEDCOULDCROSSSECTORBOUNDRIES.THISROUTINE*ˆOBTAINS1SECTORATATIME.*9*ˆIFFILESTARTINDIRECTORYBLOCK=0THEREISNOSECTOR'*ŒWHENWORKINGWITHTHECONTIGUOUSFILE*ˆTHERECLENGHTISFOUNDBY6*ŒADDING1TOTHELOGICALENDOFFILELOCINDIRECTORY*ˆFABSIZE.ISBLOCKSIZE*.************************************************(****************************************1*ˆTHISROUTINEMUSTDEALWITHTHEPROBLEMOFDATA-*ˆCROSSINGSEGMENTBOUNDRIES.THEREMUSTBEA0*ˆTESTAFTERTHEFETCHOFAWORDFORTHEBOUNDRY0*ˆENDOFSEGMENT.‚THEKEYORABLANKELEMENTCAN*ˆALSOCROSSABOUNDRY*)********************************************ˆOPTIONAAROUTINE* OPTIONA‚EQU*&‰LEADIRBLK(PC),A4ƒLOADDIRENTRYADDR ‰TST.BCFLAG-PBA(A6)…CONTIGFILE‰BEQ.SOPTIONA1‚BRANCHIFNO*$* DISPLAY LENGTH FOR CONTIGUOUS FILEŠMOVE.LFDFE(A4),D0)ŠADD.L‚#1,D0ŽLENGTHISONEMORETHANFDFEŠBSR„OPTACTG1‹DISPLAYLENGTH ŠBRA„OPTAEXIT* OPTIONA1:)‰TST.LFDFS(A4)‚ISFILESTART‚ADDR=ZERO&‰BEQOPTAEXIT„YESEXITNOBLOCKSEXIST5‰CLR.LNCCOUNT-PBA(A6)ƒCLEARDATALENGTHWORKCOUNTER9ŠCLR.L‚FABSPC-PBA(A6)…CLEARFABSIZEACCUMULATORFORFILE/‰MOVE.LFDFS(A4),NXTBLK-PBA(A6)‚SAVEBLOCKADDR*/***********************************************)*ˆNXTBLKCONTAINI STHEPSNOFTHENEXTFAB/************************************************8‰MOVE.BFDFAB(A4),COUNT-PBA(A6)ƒSAVECOUNTSIZEFROMDIR*+*******************************************/*ˆCOUNTCONTAINSTHENUMBEROFSECTORSINAFAB+********************************************'‰MOVE.L#0,A5ˆINITPRINTPOSITIONCOUNT%‰CLR.BFLAGEX-PBA(A6)„CLEAREXITFLAG*.************************************************ˆPRINTFABHEADER*.***********************************************‰MOVE.L„A4,-(A7) *œSAVEREG‰LEA‡HFABMSG(PC),A4'‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)‚START‰LEA‡HFABMSGE(PC),A4%‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)‚END‰MOVE.L„(A7)+,A4 *œRESTOREREG%‰OUT3PƒOUT3IOS(PC)‚CALLPRINTROUTINE* *********************************ˆ1STREADOFFABDATASECTOR!***********************************‰BSROPTARAN†GETFABSECTORBYRANDOMREAD**'OPTASTƒTST.BFLAGEX-PBA(A6)„AREWEDONE‰BNEOPTALAST„YES*#************************************ˆSTARTDATAPSNMOVE#************************************ OPTA0„EQU*>‰MOVE.W(A3)+,FWPSN-PBA(A6)‚GETWORDOFPSNFROMSECTOROFFAB)‰CMP.LNADR_SEC-PBA(A6),A3‚ATBOUNDRYEND‰BMI.SOPTA1‡NO‰TST.BD4ˆMORESECTORS?‰BNE.SOPTA05„YES‰TST.WFWPSN-PBA(A6)…TESTWORD ‰BEQ.SOPTA10„NO-OKIF0BYTES OPTA05„EQU*‰BSRSEQRDCK…GETNEXTSEG6OPTA1„MOVE.W(A3)+,FWPSN+2-PBA(A6)ƒGET2NDWORDOFPSN*2**************************************************1*ˆCONVERTPSNTOHEXVALUEFORPRINT(DATASTART)2***************************************************‰MOVE.LFWPSN-PBA(A6),D0‚SOURCE‰BNE.SOPTA11„NOTZERO*ˆENCOUNTEREDA0FORPSNOPTA10: ‰CMP.L…#00,A5‰BEQ.S…OPTA10A*œJMPIFNOLINETOPRINT ‰BSR‡OPTAPRT*œPRINTLASTLINEFORTHISFAB ‰CMP.L…A5,A5/*œFORCETHEEQUALCONDITONASTHELINEHASBEEN1*œPRINTEDANDWEDONOTWANTABLANKLINEPRINTEDOPTA10A:‰BSROPTARAN…GETNEXTFAB‰BRAOPTAST†STARTOVER* OPTA11ƒEQU*‰MOVE.L#5,D1„SIZEOFRECFIELD ‰LEADFABDS(PC),A0‚RECEIVEFIELD‰ADD.LA5,A0ŠADDOFFSET ‰BSRBINHEX********************************ˆCHECKFORBOUNDRYEND******************************)‰CMP.LNADR_SEC-PBA(A6),A3‚ATBOUNDRYEND‰BLS.S…OPTA2‡NO‰BSRSEQRDCK…GETNEXTSECTOR********************************"*ˆGETNUMOFRECORDSINDATABLOCK*******************************OPTA2„CLR.LD0ˆINIT‰MOVE.W(A3)+,D0‚SOURCE‰MOVE.B#6,D1„SIZE‰LEADFABRN(PC),A0‰ADD.LA5,A0ŠADDOFFSET ‰BSRBINDECFJ*(‰CMP.LNADR_SEC-PBA(A6),A3‚ATBUFFEREND‰BLS.S…OPTA3‡NO ‰BSRSEQRDCK*1*ˆADDTOCOUNTFORDATASECTORLENGTHCALCULATION* OPTA3„EQU*‰ADD.L#1,NCCOUNT-PBA(A6)*,********************************************&*ˆNUMOFSECTORSINUSEINTHESEGMENT,********************************************‰CLR.LD0ˆINIT#‰MOVE.B(A3)+,D0‚SOURCE-EVENBYTE‰MOVE.B#3,D1„SIZE‰LEADFABSECT(PC),A0 ‰ADD.LA5,A0 ‰BSRBINDECFJ*‰CLR.LD6‡INIT‰MOVE.B(A3)+,D6‚GETKEYSIZE(‰CMP.LNADR_SEC-PBA(A6),A3‚ATSECTOREND‰BLS.S…OPTA5‡NO********************************************6*ˆATTHISPOINTTHESECTORANDTHEFABCOULDBEATEND********************************************-‰BSRSEQREAD…YESGETNEXTSECTORFORTHISFAB‰TST.BFLAGEX-PBA(A6)‚ATEND‰BNE.SOPTALAST‰YES* OPTA5„TST.BD6ˆWASKEYSIZEZERO‰BEQ.SCKPRT‡YES*3***************************************************2*ˆRESETBUFFERPOINTERFORKEYSIZEINTHISSECTOR3****************************************************‰ADD.LD6,A3…ADDKEYSIZE,‰CMP.LNADR_SEC-PBA(A6),A3‚BEYONDSECTOREND‰BLS.S…CKPRT‡NO*ˆKEYAREAGOESACROSSBOUNDRY5‰SUB.LNADR_SEC-PBA(A6),A3‚GETKEYSIZEFORNEXTBUFF‰MOVEA3,D6†SAVESIZE‰BSRSEQRDCK…GETNEXTSECTOR‰SUB.B#1,D6…CORRECTPOINTER"‰ADD.LD6,A3…RESETTOPROPERSTART*%**************************************ˆCHECKIFPRINTLINEISFULL(***************************************** CKPRT„EQU*‰CMP.L#0,A5…INFIRSTHALF‰BNE.SCKPRT1„NO‰MOVE.LJ #32,A5„SETTO2NDHALF ‰MOVE.B#'-',DFABDS+3+32-PBA(A6) ‰MOVE.B#'-',DFABRN+5+32-PBA(A6)"‰MOVE.B#'-',DFABSECT+2+32-PBA(A6)‰BRAOPTAST†STARTONNEXTHALF CKPRT1ƒEQU*‰BSROPTAPRT„GOPRINTLINE ‰BRAOPTAST**'****************************************)*ˆPROCESSLASTRECORDNONCONTIGUOUSFILE*&***************************************OPTALAST EQU *3‰CMP.L#'„',DFABDS+1-PBA(A6)‚ANYTHINGINPRINTLINE‰BEQ.SOPTALENƒNOTHINGTOPRINT‰BSROPTAPRT„GOPRINTLINE**ˆROUTINETOPRINTFILELENGTH* OPTALEN‚EQU*0‰MOVE.LNCCOUNT-PBA(A6),D0‚INITWITHENTRYCOUNT‰TST.LD0ˆISITZERO‰BEQƒOPTAEXIT„YES*"‰SUB.L#1,D0…REDUCEFORLASTBLOCK‰CLR.LD1ˆINIT9‰MOVE.BFDDAT(A4),D1‚GETDATASIZEPERENTRY(INSEGMENTS)‰MULSD1,D0†CALCSIZE(‰MOVE.BFDLBZ(A4),D1‚GETLASTBLOCKSIZE ‰ADD.LD1,D05‰ADD.L‚FABSPC-PBA(A6),D0ŠADDINSPACETAKENUPBYFAB5ŠADD.L‚D0,TOTSIZ-PBA(A6)†KEEPTOTALSIZEACCUMULATION6OPTACTG1MOVE.LD0,-(A7)‚SAVEVALUEFORHEXCONVERSION**ˆCONVERTTOASCII*&‰MOVE.B#8,D1„PRINTLINESIZEFORCONV%‰LEAHFABLMC(PC),A0‚ADDROFRECFIELD ‰BSRBINDECFJ„GOTOCONVROUTINE4‰MOVE.L(A7)+,D0‚RESETREGWITHTOTVALUEFROMSTACK%‰LEAHFABLMH(PC),A0‚ADDROFRECFIELD,BHLCVTƒMOVE.L#'0ƒ',(A0)‚BLANKRECEIVEFIELD‰MOVE.L#'„',4(A0) ‰MOVE.L#8,D1‰MOVE.W#$2000,D2‚INITBHLCU1ƒROL.L#4,D0†GET4BITS‰MOVE.BD0,D2„SAVED0)‰AND.B#$F,D2„CLEARALLEXCEPTLOW4BITS"‰ADD.B#$20,D2ƒSETFORSPACECHECK ‰CMP.W#$2020,D2‚LEADINGSPACE?‰BEQ.SBHLCU3„YES‰ADD.B#$10,D2ƒCONVERTTONUM‰CMP.B#$39,D2ƒISITANUM‰BLE.SBHLCU2„YES‰ADD.B#7,D2…GETTOLETTERSBHLCU2ƒMOVE.BD2,(A0)+BHLCU3ƒASL.W#8,D2†MOVEWORD‰SUB.B#1,D1…REDUCECOUNT‰BHIBHLCU1†BRNOTZERO‰MOVE.L„A4,-(A7) *œSAVEREG‰LEA‡HFABLM(PC),A4.‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)‚STARTOFMSG‰LEA‡HFABLME(PC),A4,‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)‚ENDOFMSG‰MOVE.L„(A7)+,A4 *œRESTOREREGŠOUT3P‚OUT3IOS(PC) ‰BNE‡IOERPRT*,**********************************************,*ƒ******„RETURNFROMOPTIONAROUTINE„*******.***********************************************OPTAEXITRTS.RETURN*****/**************************************************ˆROUTINETOTESTFORSEQUENTIALREADONLY********************************************&SEQRDCK‚TST.BD4ˆANYMORESECTORSLEFT‰BNE.SSEQRD1†YES*********************************ˆPRINTERRORMSG*******************************‰LEA‡FABERMSG(PC),A2‰MOVE.L„A2,SADIO-PBA(A6)‚START‰LEA‡FABERMSE(PC),A2‰MOVE.L„A2,EADIO-PBA(A6)‚END‰IOSCALLOUT6IOS(PC)‰BSR.SSEQREAD‰ADD.L#4,A7…RESETSTACK‰BRAOPTAST‡TRYAGAIN*%SEQRD1ƒBSR.SSEQR1‡DOSEQUENTIALREAD ‰RTS.RETURN*********************************************"*ˆROUTINETODOSEQUENTIALREAD*********************************************** SEQREAD‚EQU*9‰TST.BD4ˆAREANYSECTORSLEFTINFAB(D4HASSECTCOUNT)"‰BNE.SSEQR1…GOTOSEQUENTIALREAD(‰BSR.SOPTARAN…GOTORANDOMREADROUTINE‰BRA.SSEQREXIT‡CONTINUE*&SEQR1„LEADSKIOS(PC),A2ˆLOADBASEADDR6‰ADD.L#1,IOSRRN(A2)‚INCREMENTREC#FORSEQTYPEREAD*‰IOSCALLDSKIOS(PC)‚DOI/OCALL* ‰BNE‡IOERPRT* ‰SUB.W#1,D4ŠREDUCESECTORCOUNTT =V FS NT VQ ^S fM nP vC ~&#‰LEASECBUF(PC),A3‚INITBUFFERADDR#SEQREXITRTSˆ.RETURNFROMSEQREAD**‰PAGE.***********************************************(*ˆROUTINETODORANDOMREADOFFABBLOCK*.*********************************************** OPTARANƒEQU*‰BEQ.SOPTARAN1„NO‰BSR.SOPTAPRT)OPTARAN1TST.LNXTBLK-PBA(A6)‚ISADDR=0‰BNE.SOPTARR†NO&‰MOVE.B#1,FLAGEX-PBA(A6)‚SETENDFLAG‰BRA.SOPTARANE‚GETOUT**2**************************************************7*ˆMOVEFABPSNTOPRINTLINEJ AFTERHEXASCIICONVERSION2**************************************************&OPTARRƒMOVE.LNXTBLK-PBA(A6),D0‚SOURCE ŠCLR.L‚D1ŠMOVE.BFDFAB(A4),D15ŠADD.L‚D1,FABSPC-PBA(A6)‚KEEPFABTOTALSIZEFORFILE‰MOVE.L#5,D1„SIZE‰LEADFABPSN(PC),A0ƒRECAREA ‰BSRBINHEX*#************************************ˆSETUPFORRANDOMREAD!**********************************(‰LEADSKIOS(PC),A2ƒADDROFIOSREADPARM ‰CLR.LD4%‰MOVE.BCOUNT-PBA(A6),D4‚INITCOUNTER4‰MOVE.LNXTBLK-PBA(A6),IOSRRN(A2)RANDOMRECADDRESS4‰MOVE.W#IOPRAN+IOPWAT+IOPIMG,IOSOPT(A2)‚SETOPTIONS‰LEA‡SECBUF(PC),A3‰MOVE.L„A3,IOSSAD(A2)‚STARTBUF‰LEA‡SECBUFE(PC),A3‰MOVE.L„A3,IOSEAD(A2)ENDBUF**************************** *ˆRANDOMREAD*****************************‰IOSCALLDSKIOS(PC)*‰BNE‡IOERPRT‚ERR0R ‰SUB.W#1,D4…REDUCESECTORCOUNT* ‰LEASECBUF(PC),A3‚LOADBUFADDR6‰MOVE.LFABFLK(A3),NXTBLK-PBA(A6)‚SAVEFORWARDPOINTER!ˆLEAFABPKY(A3),A3‚ADJFORHEADERˆCLR.WD0ˆINITREG,ˆMOVE.B(A3)+,D0‚PUTVALUEOFFABKEYINTOD0)ˆLEA0(A3,D0),A3‚POSITIONATSTARTOFPSN*OPTARANERTS.RETURN‰PAGE%************************************** *ˆROUTINETOPRINTOPTIONALINE*%**************************************OPTAPRT:‰LEA‡PFABD(PC),A01‰MOVE.L„A0,OUT3IOS-PBA+IOSSAD(A6)‚LOADSTARTADDR‰LEA‡PFABDE(PC),A0-‰MOVE.L„A0,OUT3IOS-PBA+IOSEAD(A6)‚MESSAGEEND*‰OUT3PƒOUT3IOS(PC)‚PRINTLINE* ‰BNE‡IOERPRT*$*************************************‰BLANKOUTPRINTAREA*$*************************************‰LEAPFABD(PC),A0„INIT‰MOVE.L„A4,-(A7) *œSAVEREG‰LEA‡PFABDE(PC),A4*œA4=MSGENDADDROPTAP1ƒMOVE.L#'„',(A0)+‚BLANK‰CMP.LA4,A0‚ATEND‰BLEOPTAP1†NO‰MOVE.L„(A7)+,A4 *œRESTOREREG**‰MOVE.L#0,A5ŠINITBEFORERTURN ‰RTS.RETURN***‰PAGE-**********************************************.*ˆROUTINETOASSIGNLOGICALUNIT3TOTERMINAL+*ˆBYSETTINGITUPTHESAMEASLU6WHICHIS"*ˆALREADYASSIGNEDTOTHETERMINAL*.*********************************************** SETLU3ƒEQU*‰LEA‡PBA(PC),A6*œA6=PBA‰LEAREGD7(PC),A0&‰BTST#3,3(A0)‰CKISITASSIGNALREADY‰BNE.SSETLU3EX‡YES‰FHSCALLLU3AFHS(PC)*ˆRETURNFROMFHSCALL‰BNE‡IOERPRT…BADRETURNSETLU3EX‚RTS‡.RETURN*******‰PAGE8*********************************************************=***‚ROUTINETODIRECTOUTPUTTOSOMETHINGOTHERTHANTERMINAL*9**********************************************************NEWOUT: ‰MOVE.L„A6,A0*œA0=PBA,‰LEALU3FHS(PC),A6ƒLU3PARMTABLEADDRTOA6@‰MOVE.B#0,FHSWCD(A6)LOADWRITEPASSWORD(USERCANALWAYSWRITE?‰MOVE.B#$FF,FHSRCD(A6)‚LOADREADPASSWORD(ONLYUSERCANREAD)3‰MOVE.WUSERNUM-PBA(A0),FHSUSN(A6)‚DEFAULTUSERNUM-‰MOVE.LVOLNAM-PBA(A0),FHSVOL(A6)‚VOLUMENAME*‰MOVE.LCATNAM-PBA(A0),FHSCLG(A6)‚CATNAME)‰MOVE.LCATNAM+4-PBA(A0),FHSCLG+4(A6)‚CAT$‰MOVE.W#'LS',FHSEXT(A6)‡DEFAULTEXT-*œFORCEDEFAULTVALUESINFHSPARAMETERBLOCK7‰MOVE.LA1,A0‡A1=A0=STARTADDRTOSCANFOROUTPUTFIELD*)******************************************&*ˆSETUPA0WITHADDROFSTARTOFSCAN'*ˆSETUPA6WITHADDROFFHSPARMBLOCK*‰CALLEDITFILEROUTINE****)*******************************************œCALLEDINRTNENEWOUT ‰BSREDITFILE ‰BMI‡INVMSGR‰LEA‡PBA(PC),A3*œA3=PBA ‰BTST#1,D05‰BNE.SSETDEVˆJMPIFDEVICESPECIFIEDINOUTPUTFIELD ‰TST.BD0<‰BNE.S…INVMSGRƒJMPIFFAMILYINDICTIONFOUNDINOUTPUTFIELD>‰BRA.SNOTDEVˆJMPASAFILEHASBEENSPECIFIEDINOUTPUTFIELD*)*******************************************ˆ****ƒASSSIGNLOGICALUNIT3*'**************************************** LU3ASSƒEQU*-‰MOVE.W#FHASGN,FHSCMD(A6)‚SETASSIGNCOMMAND1‰MOVE.W#FOPPW,FHSOPT(A6)‚SETPUBLICWRITEOPTION ‰FHSCALL(A6)‰BNE.S…IOERPRTˆERR0R*?* IF PRINTER TYPE DEVICE, THEN FETCH LINE COUNT FOR CONTROLLING*ƒPAGEEJECTS.*2ŠMOVE.W#FHRATT,FHSCMD(A6)FETCHDEVICEATTRIBUTES ŠFHSCALL‚(A6)ŠBK NE.S„IOERPRTBRANCHIFERROR$ŠBTSTW‚#9,FHSWCD(A6)†ATTRIBUTESWORD$ŠBEQ.S‚NEWOUTEŒBRANCHIFNOTPRINTERBŠMOVE.LFHSSIZ(A6),ROWCNT-PBA(A3)‚SAVEROWCOUNTIFPRINTERDEVICE8ŠSUB.L‚#6,ROWCNT-PBA(A3)‚BIASFORTOPANDBOTTOMMARGINSNEWOUTE:‰LEA‡PBA(PC),A6*œA6=PBA‰RTSŒ.RETURNFROMROUTINE***0SETDEVƒMOVE.B#1,DEVFLAG-PBA(A3)SETDEVICEFLAG ‰BTSTW…#14,D0 ‰BNE.S…HSKP1*œJMPIF*¦DEVICEISSPECIFIED*¦VOLUMEFIELDISNULL ‰BRALU3ASS*)******************************************"*ˆ**‚OUTPUTISAFILENOTADEVICE.*ˆ**‚A6CONTAINSADDROFOUTPUTFHSPARMBLOCK*)****************************************** NOTDEVƒEQU**3‰MOVE.W#FHALLO+FHASGN,FHSCMD(A6)‚SETALLOC&ASSIGN$*œPUTENTRYINDIRECTORYANDOPENIT*Š***‚OPTIONSSET*'‰MOVE.W#FOPPW+FOPEND+FOPSEQ,FHSOPT(A6)+‰CLR.WFHSLRL(A6)‚SETLOGICRECLENGTHTO0&‰MOVE.L#0,FHSSIZ(A6)‚SIZECODE=ZERO*"NOTDEV1‚FHSCALL(A6)‡MAKEFHSCALL‰BEQNEWOUTE‰GOOD‰CMP.B#5,D0‰DUPFILE‰BNE.S…IOERPRT‰NO‰MOVE.W#FHASGN,(A6) ‰BRANOTDEV1-*œFILEALREADYEXISTSOJUSTOPEN(ASSIGN)ITHSKP1:%‰MOVE.L„STSKNAM+24-PBA(A3),FHSVOL(A6)0*œFORCEVOLUMETOCONTAININITIATINGTERMINALID ‰BRA‡SETLU3*‰PAGEINVMSGR:‰MOVE.L„#EM_NVE,D0)*œSETKEYVALUEFORINVALIDENTRYMESSAGEIOERPRT:‰MOVE.L„#LDFLUN,D1'*œD1-USERLOGICALUNITNBRTOOUTPUTTO‰BSR.S…C_EM_PGM!*œISSUECALLTOERRORMSGPROGRAM‰PAGE**2*ˆALLUTILITIESWILLTERMINATEBYCALLINGƒERQ.TERM:*ˆHOWEVER-ANINDICATIONASTOWHETHERTHEREWASANERROR5*ˆWHICHMIGHTCAUSECHAINPROCESSINGTOABORTMUSTBE9*ˆSPECIFIEDATTHETIMEOFTHETERMINATION.THEFOLLOWING8*ˆWILLDEFINETHETYPEOFTERMINATIONTHATARECURRENTLY *ˆPOSSIBLE:*8*’NORMALTERMINATION‚-IMPLIESTHATUTILITYSUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM#0,#0**:*’ERRORTERMINATIONƒ-IMPLIESTHATUTILITYTERMINATEDWITH *¨ANERROR**¦ERQ.TERM#0,#$C000*<*’WARNINGTERMINATION-IMPLIESTHATUTILITYTERMINATEDWITH*¨AWARNING(ie.ASSEMBLY)**¦ERQ.TERM#0,#$1000*L********PBA-ISTHEPROGRAMBASEADDRESS‚--THISMAYBEANYSYMBOLTHEUSER *®WOULDLIKE-PBAHASBEENUSED*®FORILLUSTRATIONPURPOSES*D******** THE USER IS RESPONSILE FOR SUPPLYING THE BASE REGISTER (A?)*** TERMINAT:‰LEA‡PBA(PC),A6*œA6=PBA‰ERQ.TERM‚#0,TERM_FLG-PBA(A6) TERM_FLG:‰DC.W†0‰TERMINATIONFLAG0*œWILLCONTAINTHEAPPROPRIATETERMINATIONVALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*‰PAGEK**************THE USER IS RESPONSIBLE FOR SUPPLYING THE REGISTER (A?) WHICH5**************CONTAINS THE PROGRAM BASE ADDRESS (PBA)***’ERRORMESSAGECALLINGROUTINE**ˆCALL†BSR‡C_EM_PGM**ˆINPUT!*’D0=ASRETURNEDFROMTRAPCALL,*’D1=USERLOGICALUNITNUMBERTOOUTPUTTO!*’A0=ASRETURNEDFROMTRAPCALL**ˆOUTPUT*’NOREGISTERPRESERVATION* EM_XCEPT:‰DC.W†$0000…TABLETERMINATOR2*œTHISTABLEISUSEDTODEFINEEXCEPTIONSTOERROR.*œMESSAGESTHATSHOULDNOTCAUSEATERMINATION*œVIATHEERRORCONDITION* C_EM_PGM:‰LEA‡PBA(PC),A6*œA6=PROGRAMBASEADDR‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A6)+*œSAVED0ANDA0INERRORMSGPARAMETERBLK‰AND.L…#$00FF,D0*œISOLATEERRORSTATUSRETURN‰LEA‡EM_XCEPT(PC),A00*œA0=ADDROFTBLCONTAININGERRORMSGCODESTHAT-*ŸWILLNOTBECONSIDEREDASERRORTERMINATION *ŸCONDITIONS CEMP0100: ‰TST.W…(A0)‰BEQ.S…CEMP0200 *œJMPIFTABLEHASBEENEXAMINED‰CMP.W…(A0)+,D0‰BEQ.S…CEMP0300'*œJMPIFERRORCODERETURNISONEWHICH/*œWILLRESULTINBEINGANEXCEPTION-THISCASE**œWILLNOTBECONSIDEREDFORANERRORTYPE *œTERMINATION‰BRA.S…CEMP0100 *œREPEATLOOP CEMP0200:‰MOVE.W„#$C000,TERM_FLG-PBA(A6),*œSETFLAGTOTERMINATEWITHERRORCONDITION CEMP0300:‰LEA‡EM_PBLK(PC),A0&*œA0=ADDRUSERERRORMSGPARAMETERBLK‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)*œSETTHEUSERLUNTOOUTPUTTO ‰MOVE.L„#2,D0*œERRORMSGPRGMINPUTRQMNT‰TRAP†#4$*œISSUEREQUESTTOERRORMSGHANK DLER‰RTS **‰PAGE** ROUTINE TO PRINT LINE FEEDSLNFEED:‰MOVE.L„A0,-(A7) *œSAVEREG‰LEA‡BLANK1S(PC),A03ŠMOVE.LƒA0,OUT3IOS-PBA+IOSSAD(A6)PRINTOUTABLANK!ŠMOVE.LƒA0,OUT3IOS-PBA+IOSEAD(A6)‰MOVE.L„(A7)+,A0‚031285 *œRESTOREREGŠBSR.S„OUT3PP„053084ŠIOSCALL‚OUT3IOS(PC)†053084ŠRTS%**************************************E* SUBROUTINE TO TEST AND EJECT PAGE IF NECESSARY (BUMPS LINE COUNTER)*%*************************************OUT3PP„MOVE.LA0,-(A7)#ŠMOVE.LLNCNT-PBA(A6),A0‹LINECOUNT/ŠADD.L‚#1,A0ŽBUMPTOSEEIFTIMEFORPAGEEJECT*ŠMOVE.LA0,LNCNT-PBA(A6)ƒUPDATELINECOUNT1ŠCMP.L‚ROWCNT-PBA(A6),A0ŠISITTIMETOPAGEEJECTŠBLS.S‚OUTLBLBRANCHIFNOŠBSR.S‚EJECTŽEJECTTHEPAGEOUTLBL„MOVE.L(A7)+,A0ŠRTS%*************************************** SUBROUTINE TO EJECT PAGE*ƒALSOPRINTSHEADER*%************************************* EJECT…EQU„*ŠMOVEM.LA0/D0,-(A7);ŠMOVE.L#1,LNCNT-PBA(A6)ƒREFLECTPRINTEDHEADINGINCOUNTERAŠMOVEM.LOUT3IOS-PBA+IOSSAD(A6),A0/D0ƒSAVEOLDDISPLAYBOUNDARIESŠMOVEM.LA0/D0,-(A7)‰MOVE.L„A4,-(A7) *œSAVEREG‰LEA‡EJMSGS(PC),A4!ŠMOVE.LƒA4,OUT3IOS-PBA+IOSSAD(A6)‰LEA‡EJMSGS+1(PC),A4!ŠMOVE.LƒA4,OUT3IOS-PBA+IOSEAD(A6)ŠIOSCALLOUT3IOS(PC)‰LEA‡VERSION(PC),A4;ŠMOVE.LƒA4,OUT3IOS-PBA+IOSSAD(A6)HEADINGBUFFERBOUNDARIES‰LEA‡VEND(PC),A4!ŠMOVE.LƒA4,OUT3IOS-PBA+IOSEAD(A6)‰MOVE.L„(A7)+,A4 *œRESTOREREG&ŠIOSCALLOUT3IOS(PC)‡PRINTTHEHEADING#ŠBSR„LNFEEDLINEFEEDAFTERHEADING+ŠMOVEM.L(A7)+,A0/D0ŒOLDDISPLAYBOUNDARIES2ŠMOVEM.LA0/D0,OUT3IOS-PBA+IOSSAD(A6)ƒRESTORETHEM(ŠMOVEM.L(A7)+,A0/D0ŒREGISTERSASBEFOREŠRTS‰PAGE***.***********************************************%*ˆCONVERTBINARYTOHEXASCIIROUTINE*(*ˆRIGHTJUSTIFY&BLANKFILLONTHELEFT-*ˆTHELEASTSIGNIFICANTDIGITISNOTBLANKED.+*ˆA'$'ISINSERTEDJUSTTOTHELEFTOFTHE)*ˆMOSTSIGNIFICANTDIGIT.‚THEDOLLARSIGN0*ˆISNOTINCLUDEDINTHELENGTHOFTHERECEIVING*ˆFIELD.* *ˆD0=HEXVALUETOBECONVERTED *ˆD1=LENGTHOFRECEIVINGFIELD7*ˆA0=ADDRESSOFLEFTMOSTPOSITIONOFRECEIVINGFIELD*.**********************************************BINEQS‚DC.W0,1,10,100,1000(BINASCƒDC.B'0123456789ABCDEF'…HEXTABLE* BINHEXƒEQU*‰LEABINASC(PC),A1ƒINITADDR‰LEA0(A0,D1),A2‚ENDLOCATION*BINLOPƒMOVE.BD0,D3„GETBYTE%‰ASR.L#4,D0†SHIFTOFFLASTHEXVALUE!‰AND.L#$F,D3„MASKOFFOTHERBITS2‰MOVE.B0(A1,D3),-(A2)‚MOVEFROMTABLETORECAREA‰CMP.LA2,A0…AREWEDONE‰BLTBINLOP†NO**ˆDOZEROSUPPRESSION*‰LEA0(A0,D1),A2‚INITENDLOC‰SUB.L#1,A2…FIXENDLOC!BINSP„CMP.B#'0',(A0)‚ASCIIZERO?‰BNE.SBINOUT†NOGETOUT%‰MOVE.B#'',(A0)+‚REPLACEWITHBLANK‰CMP.LA0,A2…AREWEDONE ‰BGTBINSP‡NO**8BINOUTƒMOVE.B‚#'$',-1(A0)ˆINSERTLEADING'$'TOSHOWHEX ‰RTS.RETURN***‰PAGE*&*ˆ**CONVERTBINARYTOASCIIROUTINE**-*********************************************$*ˆBINARYTODECIMALASCIISUBROUTINE*REV1.00‚3/27.79GAT***16BITBINARYINPUT**4****************************************************6*ˆCONVERTSBINARYQUANTITYIND0TOASCIISTRINGWHICH *ˆISDEPOSITEDATLOCATION(A0)+**ˆCALLINGSEQUENCE:'*‹LOADD0WITHQUANTITYTOBECONVERTED.*‹LOADA0WITHADDRESSTODEPOSITASCIISTRING *‹JSRBINDEC*!*ˆREGISTERSUSED:01234567*“D„** *“A„*****ˆA1POINTSATBINARYTABLE*ˆA2POINTSATASCIITABLE*ˆD1ISWORKREGISTER**%BINDECƒLEA‡BINEQS+8(PC),A1ƒADDR10**5*BINDE1ƒLEA‡BINASC(PC),A2†BASEADDRASCII0#BINDE2ƒSUB.W(A1),D0ŠSUBTRACT10**N‰BCS.SBINDE3BRANCHOVERBORROW&‰ADD.L#1,A2ŒINCREMENTNEXTASCIICHAR‰BRABINDE2CONTINUE'BINDE3ƒADD.W(A1),D0ŠRESTOREOVERBORROW!‰MOVE.B(A2),(A0)+†PUTASCIICHAR‰MOVE.W-(A1),D1ˆTESTDONE‰BNEBINDE1BRANCHNOTDONE‰RTS‰PAGE*-*********************************************+*‚32BITBINARYTODECIMALASCIISUBROUTINE-**********************************************,*‚CONVERTSBINARYIND0ANDPUTSL ASCIIDIGIT(*…CHARACTERSATADDRESSSPECIFIEDINA0.(*…LEADINGZEROSARECONVERTEDTOSPACES.+*…THEFIELDLENGTH(NO.CHARS)ISSPECIFIED *…IND1INTHECALLINGSEQUENCE.**‚CALLINGSEQUENCE:!*…MOVE.L,D0*…MOVE.L,D11*…MOVE.L,A0*…BSRBINDECFJ* *‚RETURNS:*…D0=0=>GOODCONVERSION**‚REGSUSED:‚01234567 *ŠDƒ****ŠAƒ****7TENS DC.L 10000000,1000000,100000,10000,1000,100,10,1,0*$BINDECFJ MOVE.L #8,D2 MAX NO. DIGITS SUB.L D1,D2 NO. DIGITS TO SKIP! BMI.S BINDECF5 BRANCH ERROR EXIT LSL.L #2,D2 DOUBLE WORD LENGTHLEA…TENS(PC),A1STARTOFTABLE" ADD.L D2,A1 ADJUST FOR DIFFERENCE&MOVE.W#'‚',D2INITIALIZEACCUMULATOR%BINDECF1 SUB.L (A1),D0 SUBTRACT 10**N BCS.S BINDECF2 BRANCH TOO BIG* ADD.W #1,D2 INCREMENT CURRENT DIGIT COUNT BRA BINDECF1 CONTINUE)BINDECF2 ADD.L (A1)+,D0 RESTORE, ADV PNTR TST.L (A1) TEST DONE BEQ.S BINDECF4 BRANCH DONE CMP.W#'‚',D2LEADINGZEROTEST! BEQ.S BINDECF3 BRANCH STILL ZERO# ADD.B #$10,D2 BRING TO ASCII DIGIT%BINDECF3 MOVE.B D2,(A0)+ DEPOSIT CHAR LSL #8,D2 SAVE CHAR DEPOSITED# MOVE.B #$20,D2 RESTORE LS TO SPACE BRA BINDECF1 CONTINUE4BINDECF4 ADD.B #$10,D2 LAST ONE BECOMES DIGIT ALWAYS" MOVE.B D2,(A0)+ DEPOSIT LAST CHAR' TST.L D0 SET CONDITION CODE, 0 IF GOOD BINDECF5 RTS*‰PAGE,********************************************7*‚SUBROUTINETOCONVERTBINARYPROTECTIONKEYSTOASCII,*********************************************‚CALLINGSEQUENCE:*…MOVE.W,D0*…BSRCVTKEYBA*3*‚RETURNS4ASCIICHARSIND0(WRITEINUPPERHALF)*!*‚REGISTERSUSED:‚01234567*Dƒ**A**‚REV1.0RHBR807909060939*-*********************************************)CVTKEYBA AND.L #$FFFF,D0 CLEAR UPPER HALF# LSL.L #4,D0 GET 1ST DIGIT 000ABCD0% CMP.L #$10000,D0 TEST 1ST DIGIT ZERO BGE.S CVTKEYB1 BRANCH > 0 ADD.L #$100000,D0 INCREMENTCVTKEYB1 LSR.W #4,D0 00XA0BCD" CMP.W #$100,D0 TEST 2D DIGIT ZERO BGE.S CVTKEYB2 BRANCH > 0 ADD.W #$1000,D0 INCREMENTCVTKEYB2 LSL.L #8,D0 XAXBCD00 LSR.W #4,D0 XAXB0CD0" CMP.W #$100,D0 TEST 3D DIGIT ZERO BGE.S CVTKEYB3 BRANCH > 0 ADD.W #$1000,D0 INCREMENTCVTKEYB3 LSR.B #4,D0 XAXBXC0D# BNE.S CVTKEYB4 TEST 4TH DIGIT ZERO ADD.B #$10,D0 INCREMENT1CVTKEYB4 ADD.L #$40404040,D0 XAXBXCXD ALL ALPHA'S RTS*‰PAGEPGM_SIZE EQU *-PBA ‰ENDBEGPROC éééé=/*=/*†DISPATCH.AF=/*&=/* Chain file to assemble DISPATCH.SA=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to DISPATCH.LS=/*=/IFC \1ƒ=ARGDISPATCH.LS=/ENDIF=/*%=ASM DISPATCH.SA,DISPATCH.RO,\1;RZ=56=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.USM.EQ=/*}=/*=ENDL éééééé †=/*=/*†DISPATCH.LF=/*)=/* Link chain file to create DISPATCH.LO=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to DISPATCH.LL=/*=/IFC \1ƒ=ARGDISPATCH.LL=/ENDIF=/*=LINK ,DISPATCH.LO,\1;AHMIXATTRIBUTES S PSEG SEG0:0,14 $0000INPUT DISPATCH.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé M =DISPATCH‚IDNTƒ4,08203111430CHANGENO.CONCURRENTBATCHJOBSO*******************************************************************************-*ˆ**DISPATCHNUMBEROFCONCURRENTBATCHJOBSO*******************************************************************************‰PAGE**ˆINCLUDESTATEMENTS**ˆINCLUDEƒ9995.&.TR1.EQ*ˆINCLUDEƒ9995.&.USM.EQ**‰NOLIST‰INCLUDEƒ9995.&.TR1.EQ‰INCLUDEƒ9995.&.USM.EQ‰LIST‰PAGE ŠXREFƒASCVAL/LIMRUN„EQU„$1D6ˆOBTAINEDFROMEETMODULEDAT.SAŠPAGE ‰SECTIONƒ0 PBA†EQU‡*ŠDC.Bƒ'1220844'ŠDS.Bƒ64 STACK…DS.Bƒ0BUFF†COMLINE322DISPAR„DC.Lƒ0,0,BUFF-PBA,EETPNAM,EETSESNO,LIMRUN,4‰ASCII:‚ARRAY(.CHAR.)OFINTEGER;…(*ASCIICHARACTERCODES*) ¿ Ä! È% Ì/ Ð$ Ô?‰ASHEX:‚PACKEDARRAY(.1..36.)OFCHAR;(*FORHEXCONVERSION*)&‰RECƒ:‚RECTYPE;–(*HOLDSRAWRECORD*)/‰RECSIZ:‚INTEGER;–(*HOLDSLENGTHOFRAWREC*)-‰BUFF‚:‚BFTYPE;—(*BUFFHOLDSPACKEDBLOCK*))‰BUFFP:‚BFINDEX;–(*INDEXINTOBUFFER*)*‰RESPONSE:RSPTYPE;•(*ACKNAKRESPONSE*) ƒPROCEDUREINITIALIZE;0†TYPE‚CHRARRAY=‚PACKEDARRAY(.1..16.)OFCHAR;†VARƒIˆ:‚INTEGER; 2†PROCEDUREASGCODE(CODE:INTEGER;CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN(*ASGCODE*)‰FORI:=1TO16DO%ŒASCII(.CHRSET(.I.).):=CODE+I-1‰END;‚(*ASGCODE*) †BEGIN(*INITIALIZE*)†FORI:=0TOCHRMAXDO0‰ASCII(.CHR(I).):=32;…(*FORCEASCIIBLANKS*) †RESET(INFIL);1†ASHEX:='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~');!†ASGCODE(32,'!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno'); -†BUFFP:=4;œ(*STARTPACKINGRECORDSHERE*)†REPEATN /‰WRITE(OUTPUT,'PREAMBLED');Œ(*SENDPREAMBLE*)(‰WRITE(OUTPUT,OPTION);‘(*SENDOPTION*),‰WRITE(OUTPUT,CMAX:3);‘(*SENDBLOCKSIZE*)1‰WRITELN(OUTPUT,BLKCNT:1);(*SENDBLOCKCOUNT*)‰READLN(INPUT,RESPONSE);6†UNTIL(RESPONSE(.1.)='N')OR(RESPONSE(.1.)='T');†IFRESPONSE(.1.)='T'(‰THENQ:=TRUE;˜(*EARLYTERMINATION*)†END;‚(*INITIALIZE*) IƒPROCEDURECOMPRESS(VARREC:RECTYPE;VARRECSIZ:INTEGER;VARBUFF:BFTYPE;"–VARP:BFINDEX;VARCCNT:INTEGER); ƒVARƒI,Jƒ:‚INTEGER;‰RECPTR:‚INTEGER; †PROCEDURECOUT(C:CHAR);‰BEGIN(*COUT*)‰BUFF(.P.):=C; ‰P:=P+1;‰CCNT:=CCNT+1‰END;‚(*COUT*) ƒBEGIN(*COMPRESS*) ƒRECPTR:=1;ƒWHILERECPTR<=RECSIZDO†BEGIN †I:=RECPTR;F†WHILE(I<=RECSIZ)AND(REC(.RECPTR.)=REC(.I.))AND(I-RECPTR<35)DO ‰I:=I+1;5†I:=I-RECPTR;‚(*NUMBEROFMATCHINGCHARACTERS*)/†IF(I<=3)AND(I>0)AND(REC(.RECPTR.)<>'|')†THEN‰BEGIN‰FORJ:=1TOIDOŒCOUT(REC(.RECPTR.));‰RECPTR:=RECPTR+I‰END†ELSE ‰IFI>0‰THENŒBEGIN ŒCOUT('|');ŒCOUT(REC(.RECPTR.));ŒCOUT(ASHEX(.I+1.));ŒRECPTR:=RECPTR+I ŒENDƒ(*THEN*)†ENDƒ(*WHILE*)ƒEND;‚(*COMPRESS*) 2ƒPROCEDUREGETREC(VARP:BFINDEX;VARBUFF:BFTYPE);?†VARƒCPOS‚:‚BFINDEX;„(*POSITIONINBUFFFORCHARACTERCOUNT*)5ŒCCNT‚:‚INTEGER;„(*NUMBEROFCHARACTERSINRECORD*) ŒQ…:‚BOOLEAN; †BEGIN„(*GETREC*)#†IFEOLN(INFIL)THENREADLN(INFIL);†IFNOTEOF(INFIL)†THEN‰BEGIN ‰CPOS:=P; ‰CCNT:=0;,‰P:=P+2;’(*LEAVEROOMFORRECORDCOUNT*) ‰RECSIZ:=0;‰WHILENOTEOLN(INFIL)DOŒBEGINŒREAD(INFIL,REC(.RECSIZ+1.));ŒRECSIZ:=RECSIZ+1;ŒEND;(*WHILE*)‰IFRESPONSE(.2.)='B'‰THENŒBEGIN ŒQ:=FALSE;"ŒWHILE(NOTQ)AND(RECSIZ>0)DOIFREC(.RECSIZ.)=''THEN’RECSIZ:=RECSIZ-1ELSE ’Q:=TRUEŒEND;"‰COMPRESS(REC,RECSIZ,BUFF,P,CCNT);F‰BUFF(.CPOS.):=ASHEX(.CCNTDIV16+1.);ƒ(*CONSTRUCTHEXCHARCOUNT*)*‰BUFF(.CPOS+1.):=ASHEX(.CCNTMOD16+1.); ‰ENDƒ(*THEN*)†END;‚(*GETREC*) @ƒPROCEDUREPUTREC(VARQ:BOOLEAN;VARP:BFINDEX;VARBUFF:BFTYPE;”VARRESPONSE:RSPTYPE); †VARƒI‚:‚BFINDEX; †PROCEDUREOUTBLOCK(RTYPE:CHAR);‰VARI:‚INTEGER; J:‚INTEGER;C:‚INTEGER;‡(*CHECKSUM*) ‰BEGIN(*OUTBLOCK*)*‰BUFF(.3.):=RTYPE;‹(*MARKBLOCKTYPE*)‰C:=0;4‰FORI:=3TOCMAX*BLKCNTDOˆ(*COMPUTECHECKSUM*)ŒC:=C+ASCII(.BUFF(.I.).);2‰C:=CMOD255+1;(*0CHECKSUMISWILDCARD*)B‰BUFF(.1.):=ASHEX(.CDIV16+1.);(*PLACECHECKSUMINTOBLOCK*)"‰BUFF(.2.):=ASHEX(.CMOD16+1.);‰REPEATŒFORJ:=0TOBLKCNT-1DOBEGINBLKCNT*CMAX+1DO/‰OUTBLOCK('A');Š(*OUTPUTINTERMEDIATEBLOCK*)†IFEOF(INFIL)†THEN‰BEGIN‰FORI:=PTOBLKCNT*CMAXDO5ŒBUFF(.I.):='';„(*FORCEBLANKSTOENDOFBLOCK*)'‰OUTBLOCK('Z');Š(*OUTPUTLASTBLOCK*) ‰Q:=TRUE;‰END†ELSEF‰IFP>BLKCNT*CMAXTHENOUTBLOCK('A')(*OUTPUTINTERMEDIATEBLOCK*)†END;…(*PUTREC*) ƒBEGIN„(*MAIN*) ƒQ:=FALSE; ƒINITIALIZE;ƒWHILENOTQDO†BEGIN†GETREC(BUFFP,BUFF);†PUTREC(Q,BUFFP,BUFF,RESPONSE);†ENDƒEND.…(*MAIN*)éO =/* =/*†DMT.AF=/*+=/* Chain file to assemble Dismount utility=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to DMT.LS=/*=/IFC \1 ƒ=ARGDMT.LS=/ENDIF=/*=ASM DMT.SA,DMT.RO,\1;RZ=86=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*}=/*=ENDéééééé Ø=/* =/*†DMT.LF=/*$=/* Link chain file to create DMT.LO=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to DMT.LL=/*=/IFC \1 ƒ=ARGDMT.LL=/ENDIF=/*=LINK ,DMT.LO,\1;HIMX ATTRIBUTES P SEG MOUN:0-15 INPUT DMT.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééO é á6ŠTTLVERSAdosDismountUtilityVer.4.00(Description)LDSMNT IDNT 4,0 DISMOUNT Utility 3/1/83 Rel. 4.00 Copyright 1983 Motorola Inc ŠNOFORMATŠOPT„FRS,BRS,CREO*********************************************************************************œDismountUtility*œ---------------*F*ƒThisutilityperformsafunctionthatisthecomplementoftheMount0* utility. Its function is sumarized as follows:**‰FormountedVERSAdosdisks*‰-----------------------*C*‰1.‚Makeanexclusiveread/writevolumeassignmenttothedisk.IfC*‹exclusiveaccessisdenied,itisassumedthatthediskisinuse1*‹byanothertaskandanerrorexitisperformed.*D*‰2.‚Closethevolumeassignmentmadeinstep1.ThiswillcauseFMSC*‹toattempttoreadtheVolumeID(sector0).SincetheuseropensD*‹thediskdrivedoor(i.eputsthedeviceoff-line)priortocallingA*‹thisutility,theattempttoreadsector0willreturnanerrorA*‹causingFMStocloseitsexclusiveread/writedeviceassignment4*‹andallowingDismounttomakeadeviceassignment.*F*‰3.‚Attempttomakeanexclusiveread/writeassignmenttothedevice.A*‹Ifexclusiveaccessisdenied,thedevicewasnotoff-linewhenD*‹DismountwascalledandFMSstillholdsanexclusiveassignmentonC*‹thedevice.Ifthisconditionoccurs,anerrorexitisperformed.*E*‰4.‚IssueaConfigurerequesttothedevicewiththeDismountoptionD*‹theconfigurationofthedeviceisnotchangedbutthedriverwillB*‹rejectanyfurtherI/OrequestsforthedeviceuntilaConfigure,*‹requestisreceivedwiththeMountoption.*E*‰5.‚Closethedeviceassignmentmadeinstep3.ThecloseprocessingC*‹willcausethecurrentdeviceconfigurationtobechangedbackto*‹thedefaultconfiguration.**‰FormountedForeigndisks*‰----------------------2*‰Steps3-5onlyareperformedasdescribedabove.*I*ƒThisutilityisintendedforusewithdrivesorcontrollersthatdonot ê-ééééé