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-*’NOT�THE�SAME�LENGTH'�MESSAGE�TO�CONTINUE�TO�BE�PRINTED,�EVEN**’WHEN�THE�RECORDS�WERE�OF�THE�SAME�LENGTH*9*’TWO�ADDITIONAL�CHECKS,�ONE�FOR�NULL�INPUT�AND�ONE�FOR�A7*’COMMA�AS�THE�FIRST�CHARACTER�OF�THE�OUTPUT�FIELD�WERE*’ADDED.*9*’TWO�ENHANCEMENTS�WERE�ADDED.�ONE�ALLOWS�WILDCARD�COPIES8*’TO�A�SINGLE�FILE.�WHEN�A�WILD�CARD�IS�SPECIFIED�IN�THE6*’INPUT�FIELD,�ALL�OF�THE�FILES�MATCHING�THAT�WILDCARD7*’(OR�ALL�THE�FILES�SELECTED,�IF�THAT�OPTION�IS�CHOSEN)8*’WILL�BE�CONCATENATED�INTO�ONE.�INCOMPATIBLE�TYPES�WILL<*’PRODUCE�ERROR�MESSAGES.�THE�SECOND�ENHANCEMENT�IS�SIMILAR,C(B0d8`@UHWPFX<`chgpWx>€Iˆ9�+˜B 6¨E°:¸5À;ÈQÐDØ=à>è<ð5ø<DQ 9*’BUT�IN�THIS�CASE�THE�MULTIPLE�INPUT�FILES�ARE�SEPARATED6*’WITH�A�'/'.�THE�FILENAMES�WILL�BE�OUTPUT�AS�THEY�ARE *’COPIED.*4*’THE�VERSION�NUMBER�IS�NOW�PRINTED�AT�THE�BEGINNING*4*’THE�CHECK�FOR�OPTIONS�IS�NOW�DONE�BEFORE�THE�CHECK4*’FOR�NULL�FIELDS�SO�THAT�A�'COPY�;H'�WILL�PRODUCE�A*’HELP�LISTING**ˆREVISION�CODE‡020384�4**7*’IF�THERE�IS�AN�SPR�FOR�THIS�PROBLEM�I�DON'T�KNOW�WHAT.*’THE�NUMBER�IS�BUT�THE�PROBLEM�IS�AS�FOLLOWS:!*’=COPY�JUNK.CF,JUNK.XX,JUNK.YY;B:*’THE�ABOVE�COMMAND�LINE�WOULD�NOT�WORK�IF�THE�LIST/DEVICE'*’PORTION�OF�THE�COMMAND�LINE�WAS�FIXED *’IT�DOES�NOW**ˆREVISION�CODE‡101983�4*4*’SPR�669�fixed.‚A�problem�occurred�using�COPY�X,Y;B3*’when�the�data�block�of�X�was�greater�than�13,�the0*’default�size�for�verify.‚This�program�will�now6*’get�a�segment�the�size�of�the�data�block�as�found�in/*’the�parameter�table�after�the�assign�is�made.**ˆREVISION�CODE‡100583�4*6*’'V=�x'�ADDED,�WHERE�x�REPRESENTS�THE�MAX�#�OF�VERIFY8*’ERRORS�TO�BE�DISPLAYED.�COPY�TERMINATES�WITH�A�WARNING"*’IF�ANY�VERIFY�ERRORS�WERE�FOUND.**ˆREVISION�CODE‡092083�4*3*’CONTAINS�NEW�'U'�OPTION,�WHICH�ENABLES�THE�USE�OF.*’THE�USER�NUMBER�OF�THE�INPUT�FOR�THE�OUTPUT.**ˆREVISION�CODE‡082383�4*.*’CORRECTED�PROBLEM�OF�ONLY�THE�1ST�DIFFERENCE/*’BIENG�PRINTED�PER�13�SECTOR�BUFFER�INSTEAD�OF5*’1ST�DIFFERNCE�PER�1�SECTOR�OF�THE�13�SECTOR�BUFFER.**’THIS�OCCURED�IF�THE�'T'�OPTION�WAS�USED.**ˆREVISION�CODE‡060183�4*$*’CONTAINS�CODE�TO�ENABLE�'C'�OPTION**ˆREVISION�CODE‡042883�4*+*’CONTAINS�CODE�TO�DO�RECORD�I/O�FOR�APPEND$*•IF�FILES�HAVE�DIFFERENT�BLOCK�SIZE***ˆREVISION�CODE‡100681�3* *’CONTAINS�ERROR�MESSAGE�HANDLER$*’CONTAINS�POSITION�INDEPENDENT�CODE-*’CONTAINS�CURRENT�REVISION�CODE�MODIFICATION5*’CONTAINS�TERMINATION�LOGIC�FOR�USE�WITH�CHAIN�FILES1*’CONTAINS�COMMON�SUBROUTINES�PULLED�FROM�LIBRARY*’USES�THE�'SBARG'�ROUTINE3*’CONTAINS�THE�ADDED�CHARACTER�SPACE�FOR�'SBARG'�TO*œPLACE�A�'CR'"*’CONTAINS�NEW�'T'�AND�'P'�OPTIONS$*’WILL�APPEND�TO�A�NON-EXISTENT�FILE*’RETRY�LOGIC�WAS�REMOVED:*’GIVES�NOTIFICATION�OF�COPY/VERIFY�STATUS�UPON�COMPLETION *œOF�REQUEST9*’WHEN�VERIFY�DIFFERENCES�ARE�DISPLAYED�THE�RECORD�NUMBER'*œWILL�BE�SHOWN�IN�DECIMAL�AT�ALL�TIMES***ˆREVISION�CODE‡102881�3*:*’INCREASED�STACK�SIZE�TO�ACCOMODATE�SBARG�IF�A�CHAIN�FILE0*’FIX�PROBLEM�OF�COPYING�TO�THE�DEFAULT�TERMINAL***ˆREVISION�CODE‡102981�3*%*’CORRECT�ERROR�WITH�COPY�ERROR�COUNT********ˆREVISION�CODE‡110381�3*2*’REWORK�COPY/VERIFY�OUTPUT�WHEN�REQUEST�COMPLETED:*’SHOW�RECORD�NUMBERS�IN�HEX�ASCII�IF�CONTIGIOUS�FILE�TYPE*******ˆREVISION�CODE‡120281�3*)*’CORRECT�PROBLEM…,T.SA…NEW�ERROR�MESSAGE(*’CORRECT�PROBLEM…*.TES*.*,*.TES*.*,FIX:*°ELEMINATE�LOOP*’CORRECT�PROBLEM…X.SA,Y.SA;Q*°WHERE�Q�IS�AN�INVALID�OPTION9*’CORRECT�PROBLEM…ADJUSTED�SBARG�INPUT�BUFFERS�TO�MINIMUM**¦OF�5�CHARACTERS�PLUS�A�DEAD�BYTE�FOR�THE*¦CARRIAGE�RETURN6*’CORRECT�PROBLEM…FORCE�USER�TO�SPECIFY�'A'�OR�'S'�FOR*¦ALL�OR�SELECT**’CORRECT�PROBLEM…CLEANED�UP�THE�HELP�MASK*******ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ**ŠNOLISTŠINCLUDE�9995.&.FME.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.TR1.EQŠLIST**ŠPAGE<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************!*ˆ***†C�O�P�Y‚C�O�M�M�A�N�Dƒ*******ˆ***‰DATAƒSEGMENT„*******=****************************************************************ˆ****‚EQUATE�AREA‚******* BEGDATAƒEQU„0(STKLEN„EQU„25‘STACK�LENGTH�IN�LONG�WORDS)BUFSIZEƒEQU„160�INPUT�COMMAND�BUFFER�SIZE DSKLUI„EQU„1(DSKLUO„EQU„2’DISK�LOG�UNIT�ASSIGN�OUTPUT!LISTLU„EQU„3’LISTING�LOGICAL�UNIT"DIRLU…EQU„4’LOG�UNIT�FOR�DIRECTORY LU6‡EQU„6SECLEN„EQU„256�SECTOR�LENGTHHSECLENƒEQU„$100�SECTOR�LENGTH CRˆEQU„$0D LFˆEQU„$0A*ŠPAGE ŠOFFSET�0 **ˆDUMMY�DATA�SEGMENT*3******************************************************ˆBUFFER�AREA�TO�READ�CONTIGUOUG�FILE�INTO*3****************************************************ŠPAGE ŠSECTION�0!ŠXREFƒEDITFILE,PARSE,OPTION,SBARG**ˆ****‚MACRO�AREA‚*********ˆNEXT�WORD�BOUNDRY�MACRO**ŠPAGE2*******************************************************„DATA�SEGMENT�(DSEG)ƒ****1**************************************************** PBA‡EQU„**;**************************************************************ˆ***ƒDATA�AREA‚******:************************************************************ REV_CODE:ŠDC.Bƒ'122084�4'&*œWHERE�REV_CODE�IS�DEFINED�AS�FOLLOWS *œMMDDYYXZ*3*œMMDDYY�=�MONTH�DAY�YEAR�OF�LAST�ASSEMBLY�OR�PATCH*œX†=�REVISION�TYPE�CODE*¦SPACE�=�CLEAN�ASSEMBLY *¦P…=�PATCHED*¦C…=�CUSTOMIZED�PATCHED**#*œZ†=�VERSADOS�MAJOR�REVISION�FIELD* ŠDS.LƒSTKLEN PROGSTKƒEQU„**ŠDC.Lƒ0ŠDS.Wƒ08*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFIN�IS�THE�AREA�THE�COMMAND�LINE�IS.*ˆ***ƒREAD�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++**BUFFIN„COMLINE�BUFSIZE‹***‚INPUT�BUFFER‚***-**********************************************5******************************************************+*ˆ**‚IOS�PARAMETER�TABLE�FOR�DISK�READS‚***6*ˆ**‚REFER�TO�IOS�EQUATES�UNDER�IOS�PARAMETER�BLOCK‚***5******************************************************ŠDS.Wƒ0/ŠIOS.DSKR�IOREAD,IOPWAT+IOPREC,DSKLUI,0,0,0,0,0$************************************%*ˆIOS�PARAMENTER�TABLE�FOR�DISK�WRITE*$*************************************(ŠIOS.DSKW�IOWRIT,IOPREC,DSKLUO,0,0,0,0,0ŠDS.Wƒ0*1*ˆHOLD�AREA�FOR�IOS�TABLES�FOR�B�OPT�USING�FAMILY HOLDPTFƒDS.Lƒ2’HOLD�AREA�FOR�FMSHOLDPTIƒDS.Bƒ56HOLDPTEƒEQU„*-13*****************************************************ŒIOS�PARAMETER�TABLE(*ˆSET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK*3****************************************************7ŠIOS.OUT6I�IOWRIT,IOPASC+IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0**ŠDS.Wƒ0**ˆGET�SEGMENT�PARAMETER�BLOCK* BUFPAR„EQU„*ŠDC.Lƒ0,0�TASK�(0=SELF)ŠDC.Wƒ$2000ŽOPTIONS0*œRMS68K�SUPPLIES�LOGICAL�ADDRESS�EQUAL�PHYSICAL *œADDRESSŠDC.Wƒ0’(RAM�SEGMENT)ŠDC.Lƒ'BUFR'�NAME�OF�SEGŠDC.Lƒ0’START�OF�BUFFER'BUFLEN„DC.Lƒ0’length�of�buffer‘10/19/83**ˆSET�UP�IOS�FOR�LISTING�LU3*6ŠIOS.OUT3�IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU,0,0,0,0,0ŠDS.Wƒ0ŠPAGE"***********************************8*ˆFHS�PARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT5*ˆCHANGE�IS�FROM�6�TO�3�-�SEND�SOURCE�IS�LU�A�IN�MASK*ˆAND�RECEIVE�IS�LU�B�IN�MASK4*ˆLU3�IS�USED�F0R�LISTING�AND�LU6�FOR�ERR0R�/LOGGING**3*ˆPARAMETER�TABLE�FOR�CHANG�LOGICAL�UNIT�ASSIGNMENT,*ˆIS�DIFFERENT�FROM�STANDART�PARAMETER�TABLE*%************************************** LU3AFHSƒEQU„*'ŠDC.WƒFHCHLU�COMMAND�(CHANGE�LU�ASSIGN)&ŠDC.WƒFOPKEP+FOPSLU†OPTION�KEEP�ASSIGNŠDC.Bƒ0’STATUSŠDC.BƒLDFLUN�SEND�LU�NUMBERŠDC.BƒLISTLU�RECEIVE�LU�NUMŠDC.Bƒ0’RESERVED&ŠDC.Lƒ0’TASK-ID�(0�MEANS�USE�YOURSELF)(ŠDC.Lƒ0’SESSION�#�(0�MEANS�USE�YOURSELF)*ŠDS.Wƒ0* *ˆSET�LU2�=�LU6�IF�OUTPUT�#�ONLY* LU2AFHSƒEQU„*'ŠDC.WƒFHCHLU�COMMAND�(CHANGE�LU�ASSIGN)&ŠDC.WƒFOPKEP+FOPSLU†OPTION�KEEP�ASSIGNŠDC.Bƒ0’STATUSŠDC.BƒLDFLUN�SEND�LU�NUMBERŠDC.BƒDSKLUO�RECEIVE�LU�NUMŠDC.Bƒ0’RESERVED&ŠDC.Lƒ0’TASK-ID�(0�MEANS�USE�YOURSELF)(ŠDC.Lƒ0’SESSION�#�(0�MEANS�USE�YOURSELF)*ŠDS.Wƒ0***,*********************************************&*ˆPARAMETER�BLOCK�FOR‚INPUT�(TERMINAL)*,*********************************************'ŠIOS.OUTIN�IOREAD,IOPFOR,CDFLUN,,,0,0,2*ŠDS.Wƒ0%ŠIOS.DNR�IOREAD,IOPFOR,CDFLUN,,,0,0,2*ŠDS.Wƒ0)******************************************?*ˆLU3FHS�IS�PARM�TABLE�FOR�LU3�WHICH�IS�USED�FOR�OUTPUT�LISTING*********************************************#*ˆFHS.LU3�FHCLOS,0,LISTLU,0,0,0,0,0 &ŠFHS.LU3�FHASGN,FOPEW,LISTLU,0,0,0,0,0 ŠDC.Lƒ0,0,0*ŠDS.Wƒ0*;************************************************************:*ˆ***�DSKFHS�IS�THE�PARAMETER�TABLE�FOR�THE�FHS�INPUT�FILE*;***********************************************************INFHS…DC.WƒFHASGN�COMMANDŠDC.WƒFOPPRŽOPTIONS�PUBLIC�READŠDC.Bƒ0’STATUS ŠDC.BƒDSKLUI�LOGICAL�UNIT�NUMBER INVOL…DC.Lƒ$20202020ŠVOLUME�NAMEINUSN…DC.Wƒ0’USER�NUMBER!INCAT…DC.Lƒ$20202020ŠCATALOG�NAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILE�NAMEŠDC.Lƒ$20202020ŠDC.Wƒ$2020ŽEXTENSIONINFHSR„DC.Wƒ0’RESERVEDŠDC.Bƒ0’WRITE�PROTECT�CODEŠDC.Bƒ0’READ�PROTECT�CODEŠDC.Wƒ0’LOGICAL�RCORD�LENGTH5INSEC…DC.Lƒ0’CONTIGUOUS�FILE�SIZE�/�DIR�ENTRY�POINTER6*ˆFOLLOWING�FHS�PARAMENTERS�FOR�SHARED�SEGMENT�REQUEST(ŠDC.Lƒ0’SEGMENT�STARTING�LOGICAL�ADDRESS$ŠDC.Lƒ0’SEGMENT�ENDING�LOGICAL�ADDR.3ŠDC.Lƒ0’LENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUESTŠDS.Wƒ0***%*ˆFHS�PARAMETER�BLOCK�FOR�DISK�OUTPUT* OUTFHS„EQU„*ŠDC.WƒFHASGN�COMMAND ŠDC.WƒFOPPWŽOPTIONS-PUBLIC�WRITEŠDC.Bƒ0’STATUSŠDC.BƒDSKLUO�LOGICAL�UNIT�NUM!OUTVOL„DC.Lƒ$20202020ŠVOLUME�NAMEŠDC.Wƒ0’USER�NUMOUTCAT„DC.Lƒ$20202020ŠCAT�NAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILE�NAMEŠDC.Lƒ$20202020 ŠDC.Wƒ$2020ŠDC.Wƒ0ŠDC.Bƒ0’WRITE�PROT�CODEŠDC.Bƒ0ŠDC.Wƒ0ŠDC.Lƒ0’CONT�FILE�SIZE ŠDC.Lƒ0,0,0ŽCONTIGIOUS�FILE�INFOŠDS.Wƒ0*"*�VOLUME�ASSIGNMENT�FOR�FAMILY�AND**ˆPARAMETER�BLOCK�FOR�FETCH�DIRECTORY�CALL DIRFHS„EQU„*ŠDC.WƒFHFDEN�CMDŠDC.WƒFOPPRŽOPTIONSŠDC.Bƒ0’STATUSŠDC.BƒDIRLUŽLOG�UNITDIRFHSVƒDC.Lƒ$20202020ŠVOLŠDC.Wƒ-2‘USER�NUMDIRCAT„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’DIR�ADDR�PARM*ŠDS.Wƒ0&*ˆDIRECTORY�ENTRY�(DIR)�DATA�STRUCTURE'*ˆTHE�DIR�ENTRY�IS�READ�INTO�THIS�BLOCK*DIRBLK„DS.BƒFDLEN*ˆDS.W�0;************************************************************(*ˆPARAMETER�BLOCK�TO�ASSIGN�INPUT�VOLUME*DIRVOL„DC.WƒFHASGN�COMMANDŠDC.WƒFOPPRŽOPTIONS�PUBLIC�READŠDC.Bƒ0’STATUSŠDC.BƒDIRLUŽLOGICAL�UNIT�NUMBERŠDC.Lƒ$20202020ŠVOLUME�NAMEŠDC.Wƒ0’USER�NUMBERŠDC.Lƒ$20202020ŠCAT�NAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILE�NAMEŠDC.Lƒ$20202020 ŠDC.Wƒ$2020ŠDS.Lƒ3(ŠDC.Lƒ0’SEGMENT�STARTING�LOGICAL�ADDRESS$ŠDC.Lƒ0’SEGMENT�ENDING�LOGICAL�ADDR.3ŠDC.Lƒ0’LENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUESTŠDS.Wƒ0**'HOLDFUSN‚DC.Wƒ0’FAMILY�USER�NUMBER�MASK*’HOLD�MASK�OUTPUT�FOR�FAMILYHOLDFAMƒDC.Lƒ'„'�CAT ŠDC.Lƒ'„'ŠDC.Lƒ'„'�FILE ŠDC.Lƒ'„' ŠDC.Lƒ'‚'�EXŠDS.Wƒ08**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAMƒDC.Lƒ0’SAVE�TASK�NAMESESNUM„DC.Lƒ0’SAVE�SESSION�NUM#VOLNAM„DC.Lƒ0’SAVE�VOL�DEFAULT�NAMEŠDC.Wƒ0’TOP�HALF�OF�D3"USERNUMƒDC.Wƒ0’DEFAULT�USER�NUMBER*CATNAM„DC.Lƒ0,0�SAVE�DEFAULT�CATAGORY�NAMEŠDS.Lƒ3’REG�D6�D7�&�A0&TIDLOGON‚DC.Lƒ0’TERM�ID�AT�LOG�ON�TIMEŠDC.Wƒ0’TOP�HALF�OF�A2"LUSERNUM‚DC.Wƒ0’LOG�ON�USER�NUMBERŠDS.Lƒ8’SAVE�OTHERS�REGISTERS-PROTIN„DC.Wƒ0’SAVE�INPUT�PROT�CODE�FOR�FAMILY$PROTOUTƒDC.Wƒ0’SAVE�OUTPUT�PROT�CODEOFLAG…DC.Lƒ0’MORE�OUTPUT�FLAG DNRR†DC.Bƒ'‚'�NOT�READY�RESPONSEDEVFLAGƒDC.Bƒ0’DEVICE�FLAG!FLAGA…DC.Bƒ0’OPTION�A�APPEND�FILEEXFLAG„DC.Bƒ0’END�OF�INPUT�FLAG"NCFLAG„DC.Bƒ0’CONTIGUOUS�FILE�FLAG!FAMIFLAG‚DC.Bƒ0’FAMILY�FLAG�INPUT"FAMOFLAG‚DC.Bƒ0’FAMILY�FLAG�OUTPUT#ERFLAG„DC.Bƒ0’ERROR�FLAG�FOR�FAMILY0QFLAG…DC.Bƒ0’SET�WHEN�FAMILY�COPY�ABORTED�WITH�Q*£***�080684�***4FAMAPEND‚DC.Bƒ0’WILD�CARD�APPEND�FLAG�***�080684�***3REREAD„DC.Bƒ0’FLAG�FOR�REREAD�AFTER�BUFFER�OVERFLOW!*£ADDED�080684�TO�CORRECT�SPR1035*ŠDS.Wƒ0*0SAVOADDƒDC.Lƒ0’1ST�TIME�FLAG�FOR�PRT�DETAIL�LINE'FORMFEED‚DC.Bƒ$0C�TOP�OF�PAGE�CHARACTER!ODEV†DC.Bƒ0’OUTPUT�IS�DEVICE�FLAG IDEV†DC.Bƒ0’INPUT�IS�DEVICE�FLAG%ISDEV…DC.Bƒ0’INPUT�OR�OUTPUT�WS�A�DEVFLAGY…DC.Bƒ0’BYPASS�FLAG,FLAGN…DC.Bƒ0’DUP�FILE�DO�NOT�OVER�DELETE�OLDFLAGV…DC.Bƒ0’VERIFY�FLAGFLAGB…DC.Bƒ0’COPY�&�VERIFY�FLAG 'FLAGC…DC.Bƒ0’MAINTAIN�CATALOG�NAME�FLAG&FLAGU…DC.Bƒ0’MAINTAIN�USER�NUMBER�FLAG/CHGEND„DC.Bƒ0’END�OF�RECORDS�NOT�SAME�IN�VERIFY-NOTEND„DC.Bƒ1’END�FLAG�NOT�AT�END�=�1�END�=�0SEL‡DC.Bƒ0’SELECT�INDICATOR2V_EQUALƒDC.Bƒ0’"="�IN�OPTIONS�FIELD�AFTER�"V"�FLAG5OV_VALUE‚DC.Bƒ0’ORIG�VALUE�AFTER�'V='�IN�OPTION�FIELD,V_VALUEƒDC.Wƒ0’DECREMENTED�VALUE�OF�OV_VALUE*)BUFCE…DS.Lƒ1’#�sectors�*�256�-�1Ž10/19/83 BUFNUM„DS.Lƒ1’BUFCE�+�1˜10/19/834BUFNUMEƒDS.Lƒ1’#�sectors�in�file�data�block…10/19/830BUFSIZ„DS.Lƒ1’size�of�area�1�+�area�2�+ˆ10/19/83&*£8�bytes�between�the�2�areas†10/19/831BUFVER„DS.Lƒ1’BUFNUM�+�8‚start�of�area�2†10/19/835BUFEND„DS.Lƒ1’end�of�area�2,�last�byte�of�itƒ10/19/83�FILE�UNACCOUNTED�FOR*¦1�-->�FILEƒACCOUNTED�FOR**ž1‡0�-->�MODE�COPY*¦1�-->�MODE�VERIFY*!*ž2‡0�-->�'T'�OPTION�NOT�SELECTED*¦1�-->�'T'�OPTION…SELECTED*!*ž3‡0�-->�'P'�OPTION�NOT�SELECTED*¦1�-->�'P'�OPTION…SELECTED*+*ž4‡0�-->�FILE�TYPE�IS�NOT�INDEX�SEQUENTIAL%*¦1�-->�FILE�TYPE�IS…INDEX�SEQUENTIAL*-*�12‡0�-->�DO�NOT�DISPLAY�#FILE�VERIFY�ERRORS#*¦1�-->ˆDISPLAY�#FILE�VERIFY�ERRORS*,*�13‡0�-->�DO�NOT�DISPLAY�NBR�FILES�VERIFIED"*¦1�-->ˆDISPLAY�NBR�FILES�VERIFIED*+*�14‡0�-->�DO�NOT�DISPLAY�#FILE�COPY�ERRORS!*¦1�-->ˆDISPLAY�#FILE�COPY�ERRORS***�15‡0�-->�DO�NOT�DISPLAY�NBR�FILES�COPIED *¦1�-->ˆDISPLAY�NBR�FILES�COPIED GSEG_ADR:ŠDC.Lƒ0*œADDR�OF�GET�SEGMENTŠDS.Wƒ0ŠPAGE***’ERROR�MESSAGE�PARAMETER�BLOCK**EM_PBLK: EM_DO:„DC.Lƒ0"*œD0�-�IOS/FHS�RETURN�ERROR�STATUS*œ(ERROR�MSG�KEYVALUE) EM_A0:„DC.Lƒ0"*œA0�-�ADDR�OF�I/O�PARAMETER�BLOCKEM_OPT:ƒDC.Bƒ0*œOPTIONS�FLAG*œBIT‡MEANING�IF�SET*�0ˆQUERY�RESPONSE�DESIREDEM_TLUN:‚DC.Bƒ0*œUSER�TERMINAL�LUN�-�(LDFLUN)EM_QRC:ƒDC.Bƒ0*œQUERY�RETURN�CHARACTEREM_KLUN:‚DC.Bƒ0*œUSER�KEYBOARD�LUN�-(CDFLUN)EM_SPA:ƒDC.Lƒ0'*œSTART�ADDRESS�FOR�USER�TEXT�PLUG�POOLEM_EPA:ƒDC.Lƒ0%*œENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL ENDDATAƒEQU„*****O*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*8*ˆIN�AS�MUCH�AS�POSSIBLE�REGISTER�A6�WILL�BE�USED�AS�THE%*ˆPROGRAM�BASE�ADDRESS�(PBA)�REGISTER*O*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ŠPAGE ŠSECTION�0 BEGPROCƒEQU„**<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<***************************************************************ŽCOPY�COMMAND-*ˆ***‚PROCEDURE�SECTION�FOR�COPY�COMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************ŠLEA„PBA(PC),A7*œA7=PBA*&***************************************.*ˆ**ƒSAVE�DEFAULT�VALUE�PASSED�FROM�SYSTEM�****'*****************************************$ŠMOVEM.L�D0-D7/A0-A7,STSKNAM-PBA(A7)*œSAVE�TASK�INPUT�DATA*+*ˆD0�TO�STSKNAM�=�TASK�NAME�THAT�STARTED�ME*ˆD1�TO�SESNUM‚=�SESSION�NUM$*ˆD2�TO�VOLNAM‚=�DEFAULT�VOLUME�NAME*ˆD3�TO�USERNUM�=�USER�NUMBER*ˆD4�TO�CATNAM‚=�CATALOGUE�NAME*ˆD5�TO�CATNAM�+4**ˆD6‹=‚LENGTH�OF�COMMAND�LINE)*ˆD7�=�BIT�MASK�OF�LOGICAL�UNITS�ASSIGNED*ˆA0�=�YOUR�TASK�NAME*ˆA1�=�TERMINAL�ID*ˆA2�=�ACTUAL�USER�NUMBER(*ˆA3�=�SYSTEM�VOLUME�DEFAULE(ALL�SPACES)*ˆA4�=�SYSTEM�USER�NUMBER*ˆA5�=�SYSTEM�CATALOGUE*ˆA6�=�SYSTEM�CAT�PART�2**ŠPAGE ŠMOVE.L�A7,A6ŠLEA„PROGSTK(PC),A7*œA6=PBA*œA7=STACK�ADDRESSŠLEA„MSGANS(PC),A0 "ŠMOVE.L�A0,OUTINIOS-PBA+IOSSAD(A6)ŠADD.L‚#MSGANSSZ,A0"ŠMOVE.L�A0,OUTINIOS-PBA+IOSEAD(A6)4*œSET�IOS�START�AND�END�ADDRESSES�IN�PARAMETER�BLOCKŠLEA„DNRR(PC),A0 ŠMOVE.L�A0,DNRIOS-PBA+IOSSAD(A6) ŠADD.L‚#1,A0 ŠMOVE.L�A0,DNRIOS-PBA+IOSEAD(A6)4*œSET�IOS�START�AND�END�ADDRESSES�IN�PARAMETER�BLOCKŠLEA„DIRBLK(PC),A0 ŠMOVE.L�A0,DIRFHS-PBA+FHSSIZ(A6)'*œSET�FHS�FETCH�DIRECTORY�ENTRY�ADDRESSŠPAGE)ŠMOVE.L�REV_CODE-PBA(A6),QUESTM10-PBA(A6)-ŠMOVE.L�REV_CODE+4-PBA(A6),QUESTM10+4-PBA(A6)!*œMOVE�REVISION�NBR�TO�HELP�PANEL#ŠLEA�REV_CODE(PC),A2„***�080684�***"ŠLEA�REV_NBR(PC),A3…***�080684�***4ŠMOVE.L�#8,D1‡***�080684�***‚#�OF�CHARACTERS�TO�MOVEDREV_MOVE‚MOVE.B�(A2)+,(A3)+�***�080684�***‚MOVE�REV�#�TO�INITIAL�MSG-ŠSUBQ.L�#1,D1‡***�080684�***‚DECREMENT�LENGTH4ŠBNE�REV_MOVE‡***�080684�***‚MOVE�REST�OF�REVISION�#"ŠLEA�REV_MSG(PC),A3Œ***�080684�***>ŠMOVE.L�A3,OUT6IIOS+IOSSAD-PBA(A6)�START�OF�MSG�***�080684�***#ŠLEA�REV_MSGE(PC),A3‹***�080684�***<ŠMOVE.L�A3,OUT6IIOS+IOSEAD-PBA(A6)�END�OF�MSGƒ***�080684�***2ŠIOSCALL�OUT6IIOS(PC)‡PRINT�THE�MSG�***�080684�***ŠCLR.L‚FCC-PBA(A6)ŠCLR.L‚FCE-PBA(A6)*œCLEAR�COUNTERS*¦FILES�COPIED*¦FILES�VERIFIED*¦FILES�COPIED�WITH�ERRORS*¦FILES�VERIFIED�WITH�ERRORSŠCLR.W‚COPY_FLG-PBA(A6)*œCLEAR�GENERAL�COPY�FLAGŠPAGE*�***„DRIVER‚BLOCK„****** ŠBNE„IOERPRT*œJMP�IF�GET�SEGMENT�ERRORŠMOVE.L�A0,GSEG_ADR-PBA(A6)*œSAVE�ADDR�OF�SEGMENT#************************************&*‰*****�CALL�COMMAND�PARSE�ROUTINE‚****#***********************************CDOBUFF„MOVE.L�D6,LENLEFT-PBA(A6)�SAVE�LENGTH�OF�LINE�***�080684�******‘FOLLOWING�BLOCK�RELOCATED�***�080684�****5*ˆASSIGNMENT�OF�SEND�&�RECEIVE�LU'S�IS�DONE�BY�SYSTEM"*’IF�THEY�GO�TO�TERMINAL�LU5�&�LU6 ŠBTSTƒ#3,D7ŽLU3�ALREADY�ASSIGNED)ŠBNE.S‚DOBUFF3ŒYES‚CHANGED�***�080684�***"ŠBSR„SETLU3�ASSIGN�LU3�TO�TERMINAL*'*‘END�OF�RELOCATED�BLOCK�***�080684�****EDOBUFF3ƒLEA„BUFFIN(PC),A0ƒSAVE�BUFFER�START�ADDR‚MOVED�***�080684�***‚BUFNUME-PBA(A6)ƒTHEN.S“10/19/83!*£is�curr�seg�big�enough‹10/19/83(ŠRTS—current�big�enough,�return‡10/19/83ŠENDI–. 10/19/83GETSEG1ƒEQU„*’. 10/19/839ŠMOVE.L�D0,BUFNUME-PBA(A6)�save�the�#�of�sectorsŒ10/19/830ŠMULSƒ#256,D0Œcalc�the�#�bytes�requiredˆ10/19/838ŠMOVE.L�D0,BUFNUM-PBA(A6)‚1st�byte�after�area�1Œ10/19/83"ŠSUB„#1,D0Žsize�of�area�1“10/19/83/ŠMOVE.L�D0,BUFCE-PBA(A6)ƒsave�the�size”10/19/832ŠADD„#9,D0Žstart�of�area�2,�leave�8�bytesƒ10/19/83*ŠMOVE.L�D0,BUFVER-PBA(A6)‚save�itš10/19/83.ŠADD.L‚BUFCE-PBA(A6),D0ƒend�of�area�2”10/19/83:ŠMOVE.L�D0,BUFSIZ-PBA(A6)‚total�buf�size�requiredŠ10/19/83;ŠMOVE.L�D0,BUFLEN-PBA(A6)‚save�buf�siz�for�get�seq‰10/19/839ŠERQ.DESEG�BUFPAR(PC)†deallocate�current�segment‡10/19/83-ŠERQ.GTSEG�BUFPAR(PC)†request�memory“10/19/83ŠBNE„IOERPRTŒerror?›10/19/83,ŠMOVE.L�A0,GSEG_ADR-PBA(A6)�save�it™10/19/83ŠRTS—. 10/19/83ŠPAGE/************************************************)*ˆ***‚SET�UP�FHS�PARM�BLOCK�FOR�INPUT�****7*ˆTHIS�ROUTINE�WILL�INITIALIZE�THE�INPUT�FILE�PARAMETER*/************************************************INITIN: ŠMOVE.L�A6,A0*œA0=PBA(ŠLEA„INFHS(PC),A6‹ADDR�OF�FHS�PARM�BLOCK!ŠBSR„INITDSKŒGO�TO�INIT�DISK�SUBR*&****************************************ˆ**ƒCALL�EDITFILE�ROUTINE�***ˆA0�=�INPUT�COMMAND�START*ˆA6�=�ADDR�OF�PARM�BLOCK*&***************************************CŠTST.B‚MULTIN-PBA(A0)�CHECK�FOR�MULTIPLE�INPUT�FILES�***�080684�***>ŠBEQ.S‚INITIN2ˆNO,�USE�BUFFIN�FOR�START�ADDRESS�***�080684�***EŠMOVE.L�NEXTIN-PBA(A0),A0�GET�ADDRESS�OF�NEXT�FILESPEC‚***�080684�***ŠBRA.S‚INITIN3Œ***�080684�***INITIN2ƒEQU„*’***�080684�***)ŠLEA„BUFFIN(PC),A0ŠA0=ADDR�OF�INPUT�FIELD INITIN3ƒEQU„*0ŠMOVEA.L�A0,A4�SAVE�START�OF�LINE�***�080684�***!ŠBSR„EDITFILE‹MAKE�EDIT�FILE�CALLŠBMI„INVALERR‹ERR0R9ŠMOVEA.L�A0,A5�COMPUTE�LAST�CHARACTER�OF�FIELD�***�080684*œ***�080684�***ŠSUBA.L�#2,A5Ž***�080684�****ŠBTSTƒ#0,D0ŽCHECK�FOR�MULTIPLE�INPUT�FILES/ŠBEQ.S‚INITIN4ŒSINGLE�INPUT�FILE�***�080684�***3ŠMOVE.L�A6,-(A7)‹SAVE�A6�TEMPORARILY�***�080684�****ŠLEA„PBA(PC),A6�RESTORE�PBA�***�080684�***4ŠBTSTƒ#1,D0ŽCHECK�FOR�DEVICE�AS�INPUT�***�080684�***7ŠBNE.S�INITERŽYES�-�TERMINATE�WITH�ERROR�***�080684�***2ŠTST.B‚FLAGV-PBA(A6)†VERIFY�OPTION?�***�080684�***0ŠBNE.S‚INITER�YES�-�INVALID�ERROR�***�080684�***6ŠTST.B‚FLAGB-PBA(A6)†COPY�WITH�VERIFY�?‚***�080684�***$ŠBNE.S‚INITER�INVALID�***�080684�***:ŠTST.B‚FLAGC-PBA(A6)†RETAIN�INPUT�CATALOG�?�***�080684�***$ŠBNE.S‚INITER�INVALID�***�080684�***.ŠTST.B‚FLAGN-PBA(A6)†N�OPTION�?�***�080684�***$ŠBNE.S‚INITER�INVALID�***�080684�***>ŠTST.B‚FLAGU-PBA(A6)†RETAIN�INPUT�USER�NUMBER�?�***�080684�***$ŠBNE.S‚INITER�INVALID�***�080684�***3ŠTST.B‚FLAGV-PBA(A6)†VERIFY�OPTION�?�***�080684�***+ŠBEQ.S‚INITIN8ŒNO�-�CONTINUEƒ***�080684�***1INITER„MOVEA.L�(A7)+,A6ŠRESTORE�A6�***�080684�***&ŠBRA„INVALERR‹TERMINATE‚***�080684�***JINITIN8ƒST.BƒMULTIN-PBA(A6)‚SET�ADDITIONAL�INPUT�FILES�FLAG�***�080684�***>ŠST.BƒMULTIN2-PBA(A6)�SET�MULTIPLE�ENTRIES�FLAG�***�080684�***EŠBSETW‚#15,COPY_FLG-PBA(A6)�SET�FLAG�TO�PRINT�#�OF�FILES�***�080684�*DŠMOVE.L�A0,NEXTIN-PBA(A6)‚SAVE�START�OF�NEXT�FILESPEC�***�080684�***0ŠSUBA.L�A4,A0�COMPUTE�LENGTH�LOST�***�080684�***ŠMOVE.L�A0,D1Ž***�080684�***EŠSUB.L‚D1,LENLEFT-PBA(A6)�AND�SUBTRACT�FROM�LENGTH�COUNTER�***�080684+ŠMOVEA.L�(A7)+,A6ŠRESTORE�A6�***�080684�***4ŠBRA.S�INITIN6�SKIP�RESETTING�OF�FLAG�***�080684�***INITIN4ƒEQU„*’***�080684�***ŠMOVE.L�A6,A0Ž***�080684�***(*£***�080684�***�A0=ADDR�INPUT�FHS�BLOCK%ŠLEA�PBA(PC),A6�***�080684�***�A6=PBA>ŠSF.B�MULTIN-PBA(A6)‰RESET�MULTIPLE�INPUTS�FLAG�***�080684�*** ŠBRA.S�INITIN7�***�080684�***INITIN6ƒEQU„*’***�080684�*** ŠMOVE.L�A6,A0#*œA0=ADDR�INPUT�FHS�PARAMETER�BLOCKŠLEA„PBA(PC),A6*œA6=PBAINITIN7ƒEQU„*’***�080684�***6ŠMOVE.L�D0,EDITSTAT-PBA(A6)�SAVE�STATUS�***�080684�***9ŠBSR„CONVMASK„CONVERT�WILDCARD�MASK�TO�A�DISPLAYABLE�FORM@ŠMOVE.W�INFHS-PBA+FHSWCD(A6),PROTIN-PBA(A6)�SAVE�INPUT�PROT�CODEŠTST.B‚FLAGV-PBA(A6)"ŠBEQ.S‚IN1�JMP�IF�NO�VERIFY�OPTION ŠBTSTƒ#1,D0=ŠBNE„INVALERR‡JMP�BECAUSE�INPUT�FOR�VERIFY�OPTION�IS�A�DEVICE ŠBTSTƒ#7,D04ŠBNE.S‚INFAMŽJMP�IF�FAMILY�TYPE�OPERATION�FOR�VERIFYŠBRA.S‚INITEX�EXITIN1‡BTSTƒ#1,D05ŠBEQ.S‚INITIN1ŒJMP�IF�AN�INPUT�FILE�WAS�SPECIFIED�FOR*œOPERATION�REQUESTED9ŠMOVE.B�#1,IDEV-PBA(A6)„SET�FLAG�-�INPUT�DEVICE�SPECIFIEDCŠMOVE.B�#1,ISDEV-PBA(A6)ƒSET�FLAG�-�INPUT�OR�OUTPUT�WAS�SPECIFIED�A*¤DEVICEŠBTSTƒ#14,D0�NULL�VOLŠBEQ.S‚INITIN1ŒNO3ŠMOVE.L�TIDLOGON-PBA(A6),FHSVOL(A0)�GET�TERMINAL�IDINITIN1ƒBTSTƒ#7,D0)ŠBNE.S‚INFAMŽJMP�IF�FAMILY�TYPE�OPERATION ŠMOVE.W�#FOPPR+FOPBEG,FHSOPT(A0)*œOPTIONS�REQUESTED*¦EXCLUSIVE�R/W*¦POSITION�AT�BEGINNING�OF�FILE*2***************************************************ŠASSIGN�DISK�INPUT�VOL‚***5*ˆCOMMAND,�VOL�NAME�AND�LU�#�ARE�SET�UP�IN�PARM�BLOCK3****************************************************)ŠMOVE.W�#FHASGN,FHSCMD(A0)�ASSIGN�COMMANDŠFHSCALL�INFHS(PC)'*Š**‚RETURN�FROM�FILE�HANDLER�SYSTEM�**ŠBEQ.S‚INITEX�NO�ERRORINITIN5: ŠBSR„ERR_0130*œHSKP�COPY�FUNCTION ŠBSR„ERR_0100*œADJUST�COPY�COUNTŠBRA„IOERPRTŒOTHER�TYPE�ERRORINFAM…BTSTƒ#6,D0Ž*�IN�VOL�FIELDŠBNE„INVALERR‹ERROR*“***�080684�***:*‰TST.B‚FLAGA-PBA(A6)†THESE�TWO�LINES�HAVE�BEEN�ELIMINATED6*‰BNE„INVALERR‹TO�ALLOW�FOR�THE�WILDCARD�APPEND�OPTION*“***�080684�***ŠMOVE.B�D0,FAMIFLAG-PBA(A6)0*œSAVE�FAMILY�STATUS�FOR�INPUT�FIELD�AS�RETURNED*œFROM�EDITFILE�ROUTINE INITEX„RTS**ˆINPUT�-�A0=PBA*-*ˆSUBROUTINE�TO�INIT�PARM�WITH�DEFAULT�VALUES* INITDSKƒEQU„*-ŠMOVE.L�VOLNAM-PBA(A0),FHSVOL(A6)�VOLUME�NAME4ŠMOVE.W�USERNUM-PBA(A0),FHSUSN(A6)�USE�LOG�ON�USER�#+ŠMOVE.L�CATNAM-PBA(A0),FHSCLG(A6)�CATALOGUE%ŠMOVE.L�CATNAM+4-PBA(A0),FHSCLG+4(A6)'ŠMOVE.L�#'„',FHSFIL(A6)�BLANK�FILE�NAMEŠMOVE.L�#'„',FHSFIL+4(A6),ŠMOVE.W�#'‚',FHSEXT(A6)ƒBLANK�EXTENSION�NAME ŠRTS—.�RETURN*0*************************************************8*‰ROUTINE�TO�CONVERT�WILDCARD�MASK�TO�A�DISPLAYABLE�FORM**‰ADDED�***�080684�****3*‰ON�ENTRY:�A4�POINTS�TO�BEGINNING�OF�UNEDITED�MASK#*“A5�POINTS�TO�END�OF�UNEDITED�MASK*7*�EXIT:�MASK�DISPLAYABLE�VIA�MOVMSG�ROUTINE�STARTING�AT *“VOLMASK*1CONVMASK�MOVEM.L�D0/A0/A3-A6,-(A7)‚SAVE�REGISTERS‰LEA�PBA(PC),A6ŽSET�UP�PBA%‰MOVE.L�#6,D0Œ#�OF�LONGWORDS�TO�CLEAR!‰LEA�VOLMASK(PC),A0ŠAREA�TO�CLEAR-CONVMAS1�MOVE.L�#'„',(A0)+„BLANK�OUT�FILESPEC‰SUBQ.L�#1,D0ŒDECREMENT�COUNT ‰BNE�CONVMAS1ŒBLANK�OUT�THE�REST3‰MOVE.L�EDITSTAT-PBA(A6),D0�RESTORE�EDITFILE�STATUS)‰LEA�INFHS(PC),A0ŒLOCATION�OF�EDITED�MASK;‰LEA�EXTMASK+2(PC),A3ˆLOCATION�OF�LAST�CHARACTER�IN�MASK�+1‰ADDA�#1,A5ŽPOINT�TO�END�+�1:CONVEXT‚CMP.B�#'.',-1(A5)‡CHECK�FOR�END�OF�FILE�NAME�FIELD#‰BEQ.S�CONVFILEŠGO�CONVERT�FILENAME+‰BTST�#10,D0�CHECK�FOR�NULL�EXTENSION�FIELD)‰BNE.S�CONVFIL2ŠGO�TO�FILENAME�CONVERSION"‰MOVE.B�-(A5),-(A3)†MOVE�CHARACTER ‰CMP.L�A4,A5�CHECK�FOR�BEGINNING$‰BEQ.S�CONVDONEŠTERMINATE�CONVERSION+‰BRA�CONVEXT�CONVERT�REMAINDER�OF�EXTENSION/CONVFILE�SUBA�#1,A5ŽPOINT�A5�TO�END�OF�FILENAME3CONVFIL2�LEA�EXTMASK(PC),A3ŠEND�OF�FILENAME�MASK�+1‰BSR.S�MOVFIELDŠMOVE�THE�FILE"‰CMP.L�A4,A5�CHECK�FOR�END�OF�MASK$‰BEQ.S�CONVDONEŠTERMINATE�CONVERSION ‰SUBA�#1,A5ŽPOINT�A5�PAST�PERIOD.CONVCAT‚LEA�FILEMASK(PC),A3‰END�OF�CATALOG�+�1!‰BSR.S�MOVFIELDŠMOVE�CATALOG�NAME>CONVDONE MOVE.L FHSVOL(A0),VOLMASK-PBA(A6) MOVE VOLUME TO MASK5‰MOVE.W�FHSUSN(A0),USNMASK-PBA(A6)�PUT�USER�#�IN�MASK%‰BTST�#4,D0ŽCHECK�FOR�WILCARD�CATALOG‰BNE.S�CONVDON2/‰MOVE.L�FHSCLG(A0),CATMASK-PBA(A6)�MOVE�CATALOG&‰MOVE.L�FHSCLG+4(A0),CATMASK+4-PBA(A6)+CONVDON2�BTST�#3,D0ŽCHECK�FOR�WILDCARD�FILE ‰BNE.S�CONVDON31‰MOVE.L�FHSFIL(A0),FILEMASK-PBA(A6)�MOVE�FILENAME'‰MOVE.L�FHSFIL+4(A0),FILEMASK+4-PBA(A6)0CONVDON3�BTST�#2,D0ŽCHECK�FOR�WILDCARD�EXTENSION‰BNE.S�CONVDON41‰MOVE.B�FHSEXT(A0),EXTMASK-PBA(A6)�MOVE�EXTENSION4CONVDON4�MOVEM.L�(A7)+,D0/A0/A3-A6‹RESTORE�REGISTERS‰RTS****************************†***�080684�***C*‚THIS�ROUTINE�WILL�MOVE�CHARACTERS�FROM�THE�LOCATION�POINTED�TO�BYC*‚A5�TO�THE�LOCATION�POINTED�TO�BY�A3�UNTIL�IT�ENCOUNTERS�A�PERIOD.****************************†***�080684�***:MOVFIELD�CMP.B�#'.',-1(A5)‡CHECK�FOR�END�OF�PREVIOUS�FIELD‰BEQ.S�MOVEXIT‹RETURN�TO�CALLER&‰MOVE.B�-(A5),-(A3)†MOVE�THE�CHARACTER.‰CMP.L�A4,A5�CHECK�FOR�BEGINNING�OF�USER�INPUT$‰BNE�MOVFIELDŒCONTINUE�WITH�THE�MOVE MOVEXIT‚RTS ŠPAGE-**********************************************.*ˆROUTINE�TO�ASSIGN�LOGICAL�UNIT�3�TO�TERMINAL+*ˆBY�SETTING�IT�UP�THE�SAME�AS�LU6�WHICH�IS"*ˆALREADY�ASSIGNED�TO�THE�TERMINAL*.*********************************************** SETLU3„EQU„*ŠLEA„LU3AFHS(PC),A0ŠTRAPƒ#3ŠBNE„ERCALL6ŒBAD ŠRTS—.�RETURN*ŠPAGE1****************************************************ˆROUTINE�TO�PERFORM�OUTPUT�INITIALIZATION*1************************************************** INITOUTƒEQU„**#*ˆLOGIC�IF�INPUT�FIELD�WAS�A�DEVICE*ŠLEA„PBA(PC),A0*œA0=PBA'ŠLEA„INFHS(PC),A5‹INPUT�PARM�BLOCK�ADDRŠLEA„OUTFHS(PC),A6ŠOUTPUT�PARMŠTST.B‚IDEV-PBA(A0)/ŠBEQ.S‚OUTA�JMP�IF�INPUT�FIELD�SPECIFIED�A�FILE(*œFALL�THRU�-->�INPUT�FIELD�WAS�A�DEVICE%ŠBSR„INITDSKŒINIT�OUTPUT�WITH�DEFAULT ŠCLR.W‚FHSLRL(A6)‰LOG�REC�LENGTHŠCLR.L‚FHSSIZ(A6)‰FILE�SIZE-ŠOR.Wƒ#FOPSEQ,FHSOPT(A6)�SEQUENTIAL�FILE�TYPE** ŠBRA.S‚OUTB OUTA†EQU„**!*ˆLOGIC�IF�INPUT�FIELD�WAS�A�FILE*(ŠMOVE.L�VOLNAM-PBA(A0),FHSVOL(A6)�VOLUME)ŠMOVE.W�USERNUM-PBA(A0),FHSUSN(A6)�USER�#+ŠMOVE.L�CATNAM-PBA(A0),FHSCLG(A6)�CATALOGUE%ŠMOVE.L�CATNAM+4-PBA(A0),FHSCLG+4(A6)#ŠTST.B‚FLAGC-PBA(A0)†CHECK�'C'�FLAGŠBEQ.S‚OUTA0ŽBRANCH�IF�NOT�SET@ŠMOVE.L�INCAT-PBA(A0),FHSCLG(A6)�CARRY�OVER�CATA�NAME�FROM�INPUT$ŠMOVE.L�INCAT+4-PBA(A0),FHSCLG+4(A6)(OUTA0…TST.B‚FLAGU-PBA(A0)†CHECK�'U'�FLAGŠBEQ.S‚OUTA1ŽBRANCH�IF�NOT�SET?ŠMOVE.W�INUSN-PBA(A0),FHSUSN(A6)�CARRY�OVER�USER�NBR�FROM�INPUTOUTA1…BTSTƒ#7,FAMIFLAG-PBA(A0)1ŠBNE.S‚OUTB�JMP�IF�FAMILY�SPECIFIED�IN�INPUT�FILE'ŠMOVE.L�FHSFIL(A5),FHSFIL(A6)�FILE�NAME!ŠMOVE.L�FHSFIL+4(A5),FHSFIL+4(A6)1ŠMOVE.W�FHSEXT(A5),FHSEXT(A6)�GET�INPUT�EXTENSION9ŠMOVE.W�FHSWCD(A5),FHSWCD(A6)�WRITE�&�READ�PASSWORD�CODES,ŠMOVE.W�FHSLRL(A5),FHSLRL(A6)�LOG�REC�LENGTH'ŠMOVE.L�FHSSIZ(A5),FHSSIZ(A6)�FILE�SIZE7ŠMOVE.B�FHSOPT(A5),FHSOPT(A6)�MOVE�HIGH�BYTE�OF�OPTIONS**4*****************************************************ˆCALL�EDIT�FILE�ROUTINE*ˆA0�HAS�ADDR�OF�START�OF�SCAN*ˆA6�HAS�ADDR�OF�FHS�PARM�BLOCK*4*****************************************************)OUTB†MOVE.L�SAVOADD-PBA(A0),A0�SCAN�START/************************************************'*ˆCALL�TO�EDITFILE�TO�SET�UP�PARM�BLOCK*1************************************************** ŠBSR„EDITFILE,*œINITIALIZE�PARAMETER�BLOCK�FOR�OUTPUT�FILEŠBMI„INVALERR‹YESŠLEA„PBA(PC),A6*œA6=PBAŠBTSTƒ#0,D0ŽIS�THERE�MORE ŠBNE„INVALERR,*œJMP�IF�USER�SPECIFIED�A�LISTING�FILE�USING*œTHE�OLD�DELIMITER�OF�'/'ŠCMP.B‚#',',-1(A0) ŠBNE.S‚OUT1,*œJMP�IF�THERE�IS�NOT�A�LIST�FIELD�SPECIFIED%ŠMOVE.L�A0,OFLAG-PBA(A6)ƒSAVE�POINTEROUT1:ŠLEA„OUTFHS(PC),A0$*œA0=ADDR�OUTPUT�FHS�PARAMETER�BLOCK ŠBTSTƒ#7,D03ŠBNE„OUTFAM�JMP�IF�FAMILY�SPECIFIED�IN�OUTPUT�FIELDDŠTST.B�MULTIN2-PBA(A6)�CHECK�FOR�MULTIPLE�INPUT�FILES�***�080684�***4ŠBEQ.S�OUT1B‹NO�-�PROCEED�AS�NORMALLY�***�080684�***>ŠLEA�VOLMASK(PC),A0ˆPOINT�A0�TO�INPUT�FILE�NAME�***�080684�***<ŠBSR�NAMEOUT‹PRINT�SOURCE�AND�DESTINATION�NAMES�***�080684�*DŠLEA�OUTFHS(PC),A0ƒRESTORE�OUTPUT�PARAMETER�BLOCK�ADDRESS�***�080684OUT1B…EQU�*‘***�080684�***:************************ 080684 ***************************>*‰THE�FOLLOWING�CODE�WAS�ADDED�FOR�THE�WILD�CARD�APPEND�OPTION* AŠTST.B‚FAMIFLAG-PBA(A6)ƒCHECK�FOR�FAMILY�SPECIFIED�IN�INPUT�FIELD"ŠBEQ.S‚NOFAMŽNO�FAMILIES�SPECIFIED=ŠTST.B‚FLAGN-PBA(A6)†SINCE�THIS�IS�AN�IMPLIED�A�OPTION,�CHECK2ŠBNE„INVALERR‹FOR�OPTIONS�THAT�WOULD�CONFLICT�WITH ŠTST.B‚FLAGV-PBA(A6)†AN�A�OPTION ŠBNE„INVALERRŠTST.B‚FLAGB-PBA(A6) ŠBNE„INVALERR:ŠTST.B‚FLAGC-PBA(A6)†ALSO�DISALLOW�C�AND�U�OPTIONS�BECAUSE-ŠBNE„INVALERR‹WE�ARE�COPYING�TO�A�SINGLE�FILEŠTST.B‚FLAGU-PBA(A6) ŠBNE„INVALERR#ŠBTST�#1,D0�CHECK�FOR�OUTPUT�DEVICE ŠBNE.S‚NOFAM2ŠMOVE.B�#1,FAMAPEND-PBA(A6)�SET�FAMILY�APPEND�FLAGFŠMOVE.W�OUTFHS-PBA+FHSWCD(A6),PROTOUT-PBA(A6)�SAVE�OUTPUT�PROTECT�CODEFŠMOVE.L�INVOL-PBA(A6),DIRVOL-PBA+FHSVOL(A6)�VOLNAME�FOR�VOL�ASSIGNMENT0ŠFHSCALL�DIRVOL(PC)�ASSIGN�VOLUME�FOR�INPUT�FILEŠBNE�IOERPRT†ERROR,ŠLEA�INFHS+FHSVOL(PC),A1�INPUT�MASK�LOCATION1ŠLEA�DIRFHS+FHSVOL(PC),A4�DIRECTORY�MASK�LOCATIONŠMOVE.L�(A1)+,(A4)+�MOVE�VOLUME$ŠMOVE.W�(A1)+,(A4)+�MOVE�USER�NUMBER%ŠMOVE.L�#9,D0�NUMBER�OF�WORDS�TO�MOVE1ŠLEA�OUTFHS+FHSCLG(PC),A0�OUTPUT�CATALOG�LOCATION$ŠLEA�HOLDFAM(PC),A5‡STORAGE�LOCATIONKMOVEIN„MOVE.W�(A1)+,(A4)+‚MOVE�INPUT�INFORMATION�TO�DIRECTORY�REQUEST�BLOCK<ŠMOVE.W�(A0)+,(A5)+‚MOVE�OUTPUT�INFORMATION�TO�STORAGE�BLOCK/ŠSUBQ.L�#1,D0ˆDECREMENT�NUMBER�OF�WORDS�TO�MOVEŠBNE�MOVEINŠMOVE�SOME�MOREDŠMOVE.W�DIRFHS-PBA+FHSUSN(A6),HOLDFUSN-PBA(A6)�SAVE�DIRECTORY�USER�# .ŠRTS—WE'RE�NOT�READY�TO�ASSIGN�THE�OUTPUT�FILE*£YET,�SO�RETURN*:************************ 080684 **************************4NOFAM…TST.B‚FLAGV-PBA(A6)†LABEL�ADDED�***�080684�***#ŠBNE„OUTEXITŒJMP�IF�VERIFY�FLAG�SET7ŠLEA„INFHS(PC),A5‹RESET�POINTER�(EDITFILE�DESTROYED�IT) ŠBTSTƒ#1,D04ŠBNE.S‚OUTB1ŽJMP�IF�DEVICE�SPECIFIED�IN�OUTPUT�FIELD ŠBRA.S‚OUTC OUTB1…EQU„*+ŠMOVE.B�#1,ODEV-PBA(A6)„SET�OUTPUT�DEV�FLAGŠMOVE.B�#1,ISDEV-PBA(A6)'ŠMOVE.W�#FHASGN,(A0)‡SET�ASSIGN�COMMAND*‰WAS�OUT�PUT�TO�TERMINALŠBTSTƒ#14,D0�BIT�ONŠBEQ.S‚OUTC�NO8ŠMOVE.L�TIDLOGON-PBA(A6),FHSVOL(A0)�LOGON�TERM�ID�TO�VOL* OUTC†EQU„*ŠTST.B‚ODEV-PBA(A6)/ŠBNE‚OUTT4ŽJMP�IF�DEV�SPECIFIED�IN�OUTPUT�FIELD!*¡CHANGED�TO�BNE.L�***�080684�*****ˆOUTPUT�FIELD�SPECIFIED�A�FILE*ŠTST.B‚IDEV-PBA(A6)5ŠBNE.S‚ALLOCOUT‹JMP�IF�INPUT�FIELD�SPECIFIED�A�DEVICE#*œAND�OUTPUT�FIELD�SPECIFIED�A�FILEŠTST.B‚FLAGA-PBA(A6)@ŠBNE.S‚OUTT11†JMP�IF�APPEND�OPTION�SET�-�RECORD�I/O�WILL�BE�DONE>8,FHSOPT(A5) ŠBEQ„ERRFIL*œJMP�IF�INPUT�CONTIGIOUSŠCMP.B‚#FOPCON>>8,FHSOPT(A0) ŠBEQ„ERRFIL*œJMP�IF�OUTPUT�FILE�CONTIGIOUSŠMOVE.W�FHSLRL(A5),D0ŠCMP.W‚FHSLRL(A0),D0:ŠBNE„ERRFILŠJMP�IF�LOGICAL�RECORD�LENGTHS�ARE�NOT�THE�SAMEŠMOVE.W�FHSSIZ+2(A5),D0ŠCMP.W‚FHSSIZ+2(A0),D0 ŠBNE.S‚RECIO,*œBRANCH�IF�DB�SIZE�AND/OR�FAB�SIZE�NOT�SAMEŠMOVE.W�FHSSIZ(A5),D0ŠCMP.W‚FHSSIZ(A0),D0 ŠBEQ„OUTEXIT'***************************************2*ˆDO�RECORD�I/O�SINCE�DATA�BLOCK�FAB�NOT�SAME�SIZE'***************************************RECIO:&ŠMOVE.W�#IOPREC,DSKRIOS-PBA+IOSOPT(A6)&ŠMOVE.W�#IOPREC,DSKWIOS-PBA+IOSOPT(A6) ŠBRA„OUTEXIT'****************************************ˆTEST�FOR�FAMILY�CONDITIONS'***************************************3*�ANY�FIELD�WITH�AN�*�IN�THE�OUTPUT�FIELD�MUST�HAVE*�AN�*�IN�THE�INPUT�FIELD,*’AN�*�IN�THE�FILE�OR�EXTENSION�FIELD�OF�THE)*’OUTPUT�REQUIRES�AN�*�IN�THE�INPUT�FIELD OUTFAM„EQU„*;ŠTST.B�FLAGA-PBA(A6)�CHECK�FOR�APPEND�OPTION�***�080684�***BŠBNE�INVALERR�APPEND�OPTION�WITH�FAMILY�FOR�BOTH�FIELDS�IS�ILLEGAL*¥***�080684�***FŠMOVE.W�OUTFHS-PBA+FHSWCD(A6),PROTOUT-PBA(A6)�SAVE�OUTPUT�PROTECT�CODE ŠMOVE.B�FAMIFLAG-PBA(A6),D1,*œD1=EDITFILE�STATUS�RETURNED�FOR�INPUT�FILE ŠBTSTƒ#6,D05ŠBNE.S‚FAMERŽJMP�IF�FAMILY�INDICATION�IN�VOLUME�FIELDŠMOVE.B�D0,FAMOFLAG-PBA(A6)-*œD0=EDITFILE�STATUS�RETURNED�FOR�OUTPUT�FILEEŠMOVE.L�INVOL-PBA(A6),DIRVOL-PBA+FHSVOL(A6)�VOLNAM�FOR�VOL�ASSIGNMENT/ŠFHSCALL�DIRVOL(PC)ˆASSGN�VOLUME�FOR�INPUT�FILEŠBNE„IOERPRTŒERROR;ŠMOVE.L�INFHS-PBA+FHSVOL(A6),DIRFHS-PBA+FHSVOL(A6)�SAVE�VOLŠMOVE.B�FAMOFLAG-PBA(A6),D0-*œD0=EDITFILE�STATUS�RETURNED�FOR�OUTPUT�FILE ŠBTSTƒ#5,D0 ŠBNE.S‚X00100'*œJMP�IF�'*'�IN�USER�NBR�OF�OUTPUT�FILE*'*ˆOUTPUT�FILE�HAS�NO�'*'�IN�USER�NUMBER* ŠBTSTƒ#5,D1 ŠBNE.S‚FAMER)*œJMP�IF�'*'�IN�USER�NUMBER�OF�INPUT�FILE2ŠMOVE.W�INFHS-PBA+FHSUSN(A6),DIRFHS-PBA+FHSUSN(A6)0*œSET�USER�NBR�IN�DIRECTORY�CALL�PARAMETER�BLOCK*œEQUAL�TO�INPUT�USER�NUMBER ŠBRA.S‚OUTF1X00100:*$*ˆOUTPUT�FILE�HAS�'*'�IN�USER�NUMBER* ŠBTSTƒ#5,D1 ŠBEQ.S‚FAMER-*œJMP�IF�INPUT�FILE�HAS�NO�'*'�IN�USER�NUMBER3OUTF1…MOVE.W�DIRFHS-PBA+FHSUSN(A6),HOLDFUSN-PBA(A6)0*œUSER�NBR�IN�DIRECTROY�PARAMETER�BLOCK�IS�SAVED3ŠLEA„INFHS+FHSCLG(PC),A5„A5=ADDR�INPUT‚FILE�CATALOG5ŠLEA„OUTFHS+FHSCLG(PC),A4ƒA4=ADDR�OUTPUT�FILE�CATALOGŠLEA„HOLDFAM(PC),A0"ŠLEA„DIRCAT(PC),A1ŠA1=ADDR�MOVE�TOŠMOVE.B�#18,D0�COUNTOUTFLOPƒCMP.B‚#'*',(A5))ŠBNE.S‚OUTF3ŽJMP�IF�SOURCE�BYTE�NOT�=�'*' *’SOURCE�IS�*ŠCMP.B‚#'*',(A4);ŠBNE.S‚FAMER‹JMP�IF�CORRESPONDING�DESINATION�BYTE�NOT�=�'*'1OUTF2…MOVE.B�(A4)+,(A0)+ˆSAVE�DESTINATION�AS�MASK,ŠMOVE.B�(A5)+,(A1)+ˆSAVE�SOURCE�IN�DIR�TABLEŠSUB.B‚#1,D0ŽDONEŠBNE„OUTFLOPŒNOŠBRA.S‚OUTEXITŒEXIT*’SOURCE�WAS�NOT�*OUTF3…CMP.B‚#'*',(A4)<ŠBNE.S‚OUTF2ŠJMP�IF�CORRESPONDING�DESTINATION�BYTE�NOT�=�'*'&FAMER…BRA„INVALERR‹GO�TO�ERROR�ROUTINE OUTEXITƒEQU„*ŠRTS&************** 080684 *****************<*„THIS�ROUTINE�WILL�OUTPUT�THE�NAMES�OF�THE�INPUT�AND�OUTPUTC*„FILES�CURRENTLY�BEING�USED�WHILE�IN�THE�MULTIPLE�INPUT�FILE�MODE.*C*„ALL�REGISTERS�ARE�SAVED.�A6�SHOULD�CONTAIN�THE�PBA�UPON�ENTRY�AND(*„A0�SHOULD�POINT�TO�THE�INPUT�FILENAME.*&*************** 080684 ***************CNAMEOUT MOVEM.L A0/A4/A5/D0,-(A7) SAVE REGISTERS WHICH WILL BE USED)ˆMOVE.L�A0,A4‰SAVE�INPUT�FILENAME�ADDRESS(ˆTST.B�FLAGA-PBA(A6)‚CHECK�FOR�APPENDINGˆBEQ.S�NAMEOUT2‡NO�APPENDING6ˆLEA�APPNDMSG(PC),A0†BEGINNING�OF�"APPENDING�"�MESSAGE!ˆMOVE.L�A0,OUT3IOS+IOSSAD-PBA(A6)+ˆLEA�COPOKA(PC),A5ˆPLACE�FOR�FILENAME�TO�GOˆBRA.S�NAMEOUT32NAMEOUT2�LEA�COPMSG(PC),A0‡'COPYING�FROM�'�MESSAGE!‰MOVE.L�A0,OUT3IOS+IOSSAD-PBA(A6)(‰LEA�COPOUT(PC),A5‡BEGINNING�OF�FILENAME$NAMEOUT3�BSR�MOVMSGŠCONVERT�TO�ASCII&‰MOVEA.L�A5,A4‡DESTINATION�OF�FILESPEC(‰BSR�MOVMSG10ˆMOVE�IT�AND�SPACE�COMPRESS$‰LEA�TOMSG(PC),A0ˆLOCATION�OF�'�TO�'5‰MOVE.B�(A0)+,(A4)+‚MOVE�THE�MESSAGE�A�BYTE�AT�A�TIME‰MOVE.B�(A0)+,(A4)+‰MOVE.B�(A0)+,(A4)+‰MOVE.B�(A0)+,(A4)+‰MOVEA.L�A4,A5‡SAVE�LOCATION5‰LEA�OUTFHS+FHSVOL(PC),A4�LOCATION�OF�OUTPUT�FILESPEC‰BSR�MOVMSG‹CONVERT�IT9‰MOVEA.L�A5,A4ˆRESTORE�NEXT�AVAILABLE�POSITION�IN�MESSAGE‰BSR�MOVMSG10‰MOVE�THE�FILESPECC‰MOVE.L�A4,OUT3IOS+IOSEAD-PBA(A6)�STORE�END�OF�MESSAGE�IN�IOS�BLOCK&‰IOSCALL�OUT3IOS(PC)‚PRINT�THE�MESSAGE*‰BNE�IOERPRTŠABORT�IF�ERROR�IS�ENCOUNTERED0‰MOVE.L�A0,OUT3IOS+IOSEAD-PBA(A6)�END�OF�MESSAGE&‰IOSCALL�OUT3IOS(PC)�PRINT�THE�MESSAGE,‰MOVEM.L�(A7)+,A0/A4/A5/D0�RESTORE�REGISTERS‰RTSŠPAGE0*************************************************ˆFAMILY�PROCESSING�FOR�COPY0*************************************************FAMILYES‚EQU„*ŠTST.B‚ISDEV-PBA(A6)†DEVICEŠBNE„INVALERR‹YES$************************************ *ˆSELECT�MSG$************************************ŠLEA„COPAM(PC),A3ŠLEA„COPAME(PC),A4 ŠBSR„PRTLU6IŠIOSCALL�OUTINIOS(PC) ŠBNE„IOERPRT*œJMP�IF�READ�ERROR ŠBSR„SBARG&*œLOWER�CASE�TO�UPPERCASE�IF�NECESSARY ŠBNE„IOERPRT*œJMP�IF�SBARG�ERRORŠCMP.B‚#'S',MSGANS-PBA(A6)ŠBNE.S‚FAMILY10&*œJMP�IF�'SELECT'�OPTION�NOT�REQUESTED5ŠMOVE.B�MSGANS-PBA(A6),SEL-PBA(A6)�SAVE�SELECT�OPTIONŠBRA.S‚FAMILY20*œCONTINUE�PROCESSING FAMILY10: ŠCMP.B‚#'A',MSGANS-PBA(A6)ŠBNE.S‚FAMILYES*œJMP�IF�'ALL'�NOT�REQUESTED FAMILY20:ŠBCLRW‚#4,COPY_FLG-PBA(A6)0*œRESET�FILE�TYPE�TO�OTHER�THAN�INDEX‚SEQUENTIAL ŠBSR„ERR_0130 *œHSKP�FLAGS)******************************************ˆGET�FILE�FROM�DIRECTORY)*****************************************"ŠFHSCALL�DIRFHS(PC)ˆDIRECTORY�CALLŠBEQ.S‚PROCDIRŠCMP.B‚#FSTAEOD,D0&ŠBEQ„FAMILYEX‹JMP�IF�EOF�FOR�DIRECTORYŠBRA„IOERPRTŒERRORPROCDIRƒLEA„INFHS+FHSUSN(PC),A1*œA1=ADDR�INPUT�USER�NUMBERŠLEA„DIRBLK+FDUSN(PC),A0*œA0=ADDR�DIRECTORY�USER�NUMBERŠMOVE.W�(A0)+,(A1)+ˆUSER�NUMBERŠMOVE.L�(A0)+,(A1)+ˆCATŠMOVE.L�(A0)+,(A1)+ŠMOVE.L�(A0)+,(A1)+ˆFILEŠMOVE.L�(A0)+,(A1)+ŠMOVE.W�(A0),(A1)ŠEXT4ŠMOVE.W�PROTIN-PBA(A6),INFHS-PBA+FHSWCD(A6)�PASSWORDŠMOVE.W�#FHASGN,INFHS-PBA(A6)*œFHS�COMMAND�=�ASSIGN* *’DO�OUTPUT*ŠCMP.W‚#-2,HOLDFUSN-PBA(A6)0ŠBNE.S‚FAM2�JMP�IF�USER�NUMBER�OTHER�THAN�FAMILY@ŠTST.B‚FAMAPEND-PBA(A6)ƒCHECK�FOR�WILDCARD�APPEND�***�080684�***3ŠBNE.S‚FAM2�DON'T�CHANGE�USER�NUMBER‚***�080684�***2ŠMOVE.W�INFHS-PBA+FHSUSN(A6),OUTFHS-PBA+FHSUSN(A6)#*œSET�OUTPUT�FHS�USER�NBR�TO�FAMILY2FAM2†LEA„HOLDFAM(PC),A0‰A0=MASTER�OUTPUT�FILE�NAME>ŠLEA„INFHS+FHSCLG(PC),A1„A1=ADDR�INPUT�PARAMTER�BLOCK�(FAMILY)@ŠLEA„OUTFHS+FHSCLG(PC),A2ƒA2=ADDR�OUTPUT�FILE�PARAMER�BLOCK�MOVEŠMOVE.B�#18,D0�INIT�COUNTERFAMLOP„CMP.B‚#'*',(A0).ŠBNE.S‚FAM3AŽJMP�IF�NOT�A�FAMILY�INDICATOR�'*'"ŠMOVE.B�(A1)+,(A2)+ˆGET�FROM�INPUTŠADD.L‚#1,A0ŽREPOSITION�MASKFAM3†SUB.B‚#1,D0ŽCK�FOR�ENDŠBNE„FAMLOP�NOŠBRA.S‚FAMNXT�DONE&FAM3A…MOVE.B�(A0)+,(A2)+ˆGET�FROM�MASKŠADD.L‚#1,A1ŽREPOSITION�INPUT ŠBRA„FAM3FAMNXT„LEA„OUTVOL(PC),A4ŠTST.B‚SEL-PBA(A6)8ŠBEQ.S‚FAM3BŽJMP�IF�ALL�FILES�WERE�SELECTED�TO�BE�COPIED=ŠTST.B‚FAMAPEND-PBA(A6)ƒIMPLIED�APPEND�OPTION?†***�080684�***9ŠBEQ.S‚FAMNXT1ŒJMP�IF�APPEND�NOT�SPECIFIED�***�080684�***7ŠLEA„INVOL(PC),A4‹INPUT�FILENAME�WILL�GO�OUT‚***�0806847ŠTST.B‚FLAGA-PBA(A6)†TRUE�APPEND�OPTION?‰***�080684�***9ŠBEQ.S‚FAMNXT1ŒNO�-�USE�OK�TO�COPY�MESSAGE�***�080684�***.ŠBSR„MOVMSG�CONVERT�IT�TO�ASCII‰***�080684�***ŠLEA„COPOKA2(PC),A4¥***�0806849ŠBSR„MOVMSG10ŠMOVE�FILE�NAME�TO�CORRECT�MSG***�080684�***8ŠLEA„OKTOAPND(PC),A3ˆ'OK�TO�APPEND�?'�MESSAGE„***�080684.ŠBRA.S‚FAMNXT2‹ASK�THE�QUESTION�***�080684�***BFAMNXT1ƒBSR„MOVMSG†SET�UP�FILE�NAME�MSG‚***�080684�***�LABEL�ADDED*�**‚PRINT�OK�TO�COPY�MSG�**ŠLEA„COPOKF(PC),A4 ŠBSR„MOVMSG10.*œMOVE�FILE�NAME�TO�CORRECT�MESSAGE�TO�DISPLAYŠLEA„COPOK(PC),A3.FAMNXT2ƒBSR„PRTLU6I‹LABEL�ADDED�***�080684�***ŠIOSCALL�OUTINIOS(PC) ŠBNE„IOERPRT*œJMP�IF�READ�ERROR ŠBSR„SBARG%*œLOWERCASE�TO�UPPERCASE�IF�NECESSARY ŠBNE„IOERPRT*œJMP�IF�SBARG�ERRORŠCMP.B‚#'Q',MSGANS-PBA(A6)'ŠBNE.S‚FAM3HŽCHECK�FOR�Y�***�080684�***?ŠST.BƒQFLAG-PBA(A6)†TERMINATE�MULTIPLE�FILE�COPY�***�080684�***.ŠBRA„DOCOPY10‹TERMINATE�PROGRAM�IN�NORMAL�MODEFAM3H…EQU„*’***�080684�***ŠCMP.B‚#'Y',MSGANS-PBA(A6)ŠBEQ.S‚FAM3BŽCONTINUEŠBRA„FAMILY20‹GET�NEXTFAM3B…TST.B‚FLAGV-PBA(A6)"ŠBNE„FAMVER�JMP�IF�VERIFY�FLAG�SET?ŠTST.B‚FAMAPEND-PBA(A6)ƒCHECK�FOR�WILDCARD�APPEND***�080684�***0ŠBEQ.S‚FAM3CŽPRINT�NORMAL�MESSAGE„***�080684�***9ŠTST.B‚FLAGA-PBA(A6)†CHECK�FOR�TRUE�APPENDƒ***�080684�***ŠBNE.S‚FAM3G¦***�080684�***8ŠLEA„INVOL(PC),A0„POINT�TO�INPUT�FILENAMEˆ***�080684�***8ŠBSR„NAMEOUT…PRINT�INPUT�AND�OUTPUT�NAMESƒ***�080684�***.ŠBRA.S‚INASSIGN„GO�ASSIGN�INPUT�***�080684�***9FAM3G…LEA„INVOL(PC),A4‹USE�INPUT�FILE�NAME…***�080684�***+ŠBSR„MOVMSG�CONVERT�TO�ASCIIˆ***�080684�***5ŠLEA„COPOKA(PC),A4Š'APPENDING'�MESSAGE…***�080684�***1ŠBSR„MOVMSG10‹MOVE�FILENAME�TO�MSG„***�080684�***4ŠLEA„APPNDMSG(PC),A3ˆSTART�OF�MESSAGEˆ***�080684�***$ŠBRA.S‚FAM3EŽPRINT�IT�***�080684�***FAM3C…LEA„OUTVOL(PC),A4 ŠBSR„MOVMSG�SET�UP�FILE�NAME�MSG%FAM3F…LEA„COPOKB(PC),A3ŠPRT�FILE�NAMEFAM3E…BSR„PRTLU37********************************************************’ASSIGN�INPUT7*******************************************************INASSIGN‚EQU…*‘***�080684�***ŠFHSCALL�INFHS(PC))ŠBEQ.S‚FAM3DŽJMP�IF�GOOD�INPUT�ASSIGNMENT ŠBSR„IOERPRTR *œDISPLAY�ASSIGNMENT�ERROR ŠBSR„ERR_0100*œADJUST�COPY�COUNTŠBRA.S‚FAMBADC/FAMBAD„BSR„MOVMSG�PRT�FILE�NAME�PART�OF�MESSAGEŠLEA„COPOKB(PC),A3*ŽEND�IS�ALREADY�SET�UP ŠBSR„PRTLU3FAMBADCƒBSR„FAMRESTŒCLOSEŠBRA„FAMILY20‹GET�NEXT*FAM3D…LEA„INFHS(PC),A5ŠLEA„OUTFHS(PC),A0>ŠMOVE.W�PROTOUT-PBA(A6),FHSWCD(A0)�WRITE�&�READ�PASSWORD�CODES,ŠMOVE.W�FHSLRL(A5),FHSLRL(A0)�LOG�REC�LENGTH'ŠMOVE.L�FHSSIZ(A5),FHSSIZ(A0)�FILE�SIZE7ŠMOVE.B�FHSOPT(A5),FHSOPT(A0)�MOVE�HIGH�BYTE�OF�OPTIONSŠCLR.B‚ERFLAG-PBA(A6)ŠMOVE.W�#FHASGN,OUTFHS-PBA(A6)2***************************************************’GO�ASSIGN�OUTPUT2**************************************************;ŠTST.B‚FLAGA-PBA(A6)†CHECK�FOR�APPEND�OPTION�***�080684�***3ŠBEQ.S‚NOOPTA�NO�-�PROCEED�AS�BEFORE‚***�080684�***7ŠBSR„OUTT11�ASSIGN�OUTPUT�WITH�RECORD�IO�***�080684�***3ŠBRA.S‚OPTA�SKIP�OVER�OLD�ASSIGNMENT�***�080684�***;NOOPTA„BSR„OUTFSŽASSIGN�OUTPUT‚-�LABEL�ADDED�***�080684�***,OPTA†BSR„GETSEG�get�seg�if�requiredŽ10/19/83*£LABEL�ADDED�***�080684�***ŠLEA„PBA(PC),A6*œA6=PBAŠTST.B‚ERFLAG-PBA(A6)…ERRORŠBEQ.S‚FAM6�NO)ŠCMP.B‚#2,ERFLAG-PBA(A6)‚BYPASS�CONDITIONŠBEQ„FAMBADCŒYESŠLEA„OUTVOL(PC),A4 ŠBRA„FAMBAD*.FAMVER„MOVE.W�OV_VALUE-PBA(A6),V_VALUE-PBA(A6)**£Start�with�the�original�value�of�x�in�..+*£'V=x'�of�option�field�every�time�a�new�.."*£family�member�is�bieng�verified.ŠBSR„VERIFYIT‹Go�to�verify.*FAM5A…BSR„FAMRESTŒWRAPUPŠTST.B‚FLAGV-PBA(A6)†VERIFYŠBNE„FAMILY20‹YES!*‹RESET�AFTER�VERIFY‚FOR�B�OPTION%ŠLEA„HOLDPTI(PC),A0‰A0=ADDR�MOVE�FROM#ŠLEA„DSKRIOS(PC),A1‰A1=ADDR�MOVE�TO/ŠLEA„HOLDPTE(PC),A2‰A2=MOVE�TERMINATION�ADDRESS4FAML†MOVE.L�(A0)+,(A1)+ˆRESTORE�R/W�PARAMETER�BLOCKSŠCMP.L‚A0,A2ŽAT�END ŠBCC„FAML�NO%ŠMOVE.L�HOLDPTF-PBA(A6),INFHS-PBA(A6)(ŠMOVE.L�HOLDPTF+4-PBA(A6),OUTFHS-PBA(A6)ŠBRA„FAMILY20‹GET�NEXT9FAM6†BSR„COPYIT�COPY�FILE�***�080684�***�CHANGED�TO�BSR.L@ŠTST.B‚FAMAPEND-PBA(A6)ƒCHECK�FOR�WILDCARD�APPEND�***�080684�***3ŠBEQ.S‚FAM6BŽDON'T�CHANGE�OPT�A�FLAGƒ***�080684�***DŠMOVE.B�#1,FLAGA-PBA(A6)ƒDO�OPTION�A�COPY�FROM�NOW�ON�***�080684�***FAM6B…EQU„*’***�080684�***ŠTST.B‚EXFLAG-PBA(A6)#ŠBNE.S‚FAM6AŽJMP‚IF�SUCCESSFUL�COPYŠMOVE.B�#'�',TERMMSGF-PBA(A6) ŠBSR„TERMERR ŠBRA.S‚FAM5AFAM6A…BSR.S‚FAMRESTŒWRAPUP%ŠTST.B‚FLAGB-PBA(A6)†COPY�WITH�VERIFYŠBEQ„FAMILY20‹NO*’SAVE�PAR�TABLE�BEFOR�VERIFY%ŠLEA„DSKRIOS(PC),A0‰A0=ADDR�MOVE�FROM#ŠLEA„HOLDPTI(PC),A1‰A1=ADDR�MOVE�TO/ŠLEA„HOLDPTE(PC),A2‰A2=MOVE�TERMINATION�ADDRESSFAML1…MOVE.L�(A0)+,(A1)+ŠCMP.L‚A1,A2ŽAT�END ŠBCC„FAML1ŽNO2ŠMOVE.L�INFHS-PBA(A6),HOLDPTF-PBA(A6)�SAVE�SETTING(ŠMOVE.L�OUTFHS-PBA(A6),HOLDPTF+4-PBA(A6)ŠBRA„FAMVER�GO�VERIFY�IT *!FAMILYEX‚RTS—>‰RETURN�FROM�FAMILY**-*ˆCLOSE�INPUT�&�OUTPUT�WITHOUT�ERROR�CHECKING*;CLOSNECƒMOVE.W�#FHCLOS,OUTFHS-PBA(A6)�CLOSE�COMMAND�TO�PARMŠFHSCALL�OUTFHS(PC)ŠMOVE.W�#FHCLOS,INFHS-PBA(A6)ŠFHSCALL�INFHS(PC)ŠCLR.B‚ERFLAG-PBA(A6)…RESETŠCLR.B‚NCFLAG-PBA(A6)ŠRTS**ˆRESET�AFTER�FAMILY�PASS(FAMRESTƒBSR„CLOSNECŒCLOSE�INPUT�&�OUTPUTŠCLR.B‚EXFLAG-PBA(A6)ŠCLR.B‚CHGEND-PBA(A6)=ŠCLR.B‚REREAD-PBA(A6)…CLEAR�REREAD�AFTER�BUFFER�OVERFLOW�FLAG!*£ADDED�080684�TO�CORRECT�SPR1035ŠMOVE.B�#1,NOTEND-PBA(A6) ŠRTS—.�RETURN2***************************************************7*‰ROUTINE�TO�CLOSE�DIRECTORY�LUN�-�ADDED�***�080684�****2**************************************************3CLOSDIRƒMOVE.W�#FHCLOS,DIRFHS-PBA(A6)�CLOSE�COMMAND'ŠFHSCALL�DIRFHS(PC)ŒCLOSE�DIRECTORY�LUN/ŠMOVE.W�#FHFDEN,DIRFHS-PBA(A6)�ORIGINAL�COMMANDŠRTSŠPAGE2***************************************************+*ˆROUTINE�TO�PERFORM�COPY�OF�REQUESTED�FILE*2***************************************************COPYIT:8ŠLEA„DSKWIOS(PC),A4‰A4=PARAMETER�BLOCK�ADDRESS�FOR�WRITE7ŠLEA„DSKRIOS(PC),A3‰A3=PARAMETER�BLOCK�ADDRESS�FOR�READŠTST.B‚ISDEV-PBA(A6)8ŠBNE.S‚IOSCONTŒJMP�IF�INPUT�OR�OUTPUT�FEILD�WAS�A�DEVICEŠTST.B‚FLAGA-PBA(A6).ŠBNE.S‚COPYIT1ŒJMP�IF�'APPEND'�OPTION�SELECTEDŠBTSTW‚#3,COPY_FLG-PBA(A6)ŠBEQ.S‚COPYIT2 *œJMP�IF�OTHER�THAN�'P'�OPTIONŠBTSTW‚#4,COPY_FLG-PBA(A6)ŠBEQ.S‚COPYIT2**œJMP�IF�'P'�OPTION�SELECTED�BUT�FILE�TYPE*œIS�NOT�INDEX�SEQUENTIALCOPYIT1:*+*ˆRECORD�I/O�CANNOT�USE�SHARED�SEGMENT�AREA5*ˆMAKE�NECESSARY�ALTERATIONS�TO�ACCOMODATE�RECORD�I/O**$*ˆSET�UP�TO�RETRIEVE�KEY�WITH�RECORD*ŠOR.Wƒ#IOPRTK,IOSOPT(A3)ŠOR.Wƒ#IOPRTK,IOSOPT(A4)%*œSET�OPTION�=�RETURN�KEY�WITH�RECORDŠBRA.S‚IOSCONT COPYIT2ƒEQU„**ŠTST.B‚NCFLAG-PBA(A6)%ŠBEQ.S‚IOSCONTŒJMP�IF�CONTIGIOUS�FILE*********************************************ˆPROC�NON�CONTIGUOUS*********************************************%ŠLEA„OUTFHS(PC),A0ŠINIT�FHS�PAR�BLOCKŠMOVE.L�FHSSAD(A0),D0!*œD0=SHARED�SEGMENT�START�ADDRESSŠMOVE.L�D0,IOSSAD(A3)ŠMOVE.L�D0,IOSSAD(A4)"*œSET�START�ADDRESS�FOR�READ/WRITEŠMOVE.L�FHSEAD(A0),D0*œD0=SHARED�SEGMENT�END�ADDRESSŠMOVE.L�D0,IOSEAD(A3) *œSET�END�ADDRESS�FOR�READ/WRITEŠBRA.S‚IOSREAD*(******************************************ˆPROCESS�CONTIGUOUS�FILE*-*ˆRECORD�FILE�I/O�ALSO�REQUIRES�SHARED�BUFFER(***************************************** IOSCONTƒEQU„**$ŠMOVE.L�GSEG_ADR-PBA(A6),A0 12/17/84*œA0=ADDRESS�OF�GET�SEGMENT)ŠMOVE.L�A0,IOSSAD(A3)†START�ADDR�TO�INPUTŠMOVE.L�A0,IOSSAD(A4)†TO�OUTPUT3ŠADD.L‚BUFCE-PBA(A6),A0ƒadd�in�end�addressŽ10/19/83*œA0=END�ADDRESS*ŠMOVE.L�A0,IOSEAD(A3)†ENDING�ADDR�TO�INPUT* IOSREADƒEQU„***%***************************************ˆDO�READ�OF�INPUT�FILE*%**************************************ŠIOSCALL�DSKRIOS(PC)ŠBEQ.S‚IOSWSETŒJMP�IF�GOOD�READ-*********************************************!*ˆCHECK�FOR�END�OF�FILE�CONDITION-*********************************************ŠCMP.B‚#ISTAEOF,D0ŠBEQ.S‚IOSEND�JMP�IF�EOF ŠBSR„ERR_0100 *œADJUST�FILE�COPIED�ERROR�COUNT ŠBRA„IOERPRT *œREAD�ERROR�-�TERMINATE�PROGRAM$*************************************ˆSET�UP�FOR�WRITE�FILE$************************************* IOSWSETƒEQU„*8ŠLEA„DSKRIOS(PC),A3‰A3=ADDR�INPUT�PARAMETER�BLOCK�-�READ9ŠLEA„DSKWIOS(PC),A4‰A4=ADDR�INPUT�PARAMETER�BLOCK�-�WRITE,ŠMOVE.L�IOSSAD(A3),A0†A0=ADDR�OF�RECORD�READŠTST.L‚IOSLEN(A3),ŠBNE.S‚IOSW2ŽJMP�IF�DATA�TRANSFERRED�ON�READCŠMOVE.B�#'�',(A0)„MOVE�BLANK�TO�BUFF�-�WE'LL�FORCE�OUTPUT�OF�1�BYTE ŠBRA.S‚IOSW3$IOSW2…ADD.L‚IOSLEN(A3),A0†ADD�LENGTHŠSUB.L‚#1,A0ŽADJUST�END�ADDR*IOSW3…MOVE.L�A0,IOSEAD(A4)†END�BUFFER�ADDR**ˆDO�WRITE�TO�OUTPUT�FILE*IOSWRITE‚EQU„*ŠIOSCALL�DSKWIOS(PC)7ŠBEQ„IOSREADŒJMP�IF�GOOD�WRITE�SO�R/W�LOOP�CAN�CONTINUE ŠBSR„ERR_0100 *œADJUST�FILE�COPIED�ERROR�COUNT ŠBRA„IOERPRT*œJMP�IF�WRITE�ERROR IOSEND„EQU„*&ŠMOVE.B�#1,EXFLAG-PBA(A6)‚SET�END�FLAG*ŠADD.W‚#1,FCC-PBA(A6)*œADJUST�NBR�FILES�COPIED�COUNT@ŠTST.B�MULTIN2-PBA(A6)„CHECK�FOR�MULTIPLE�ENTRIES�***�080684�***ŠBEQ.S�IOSEND2Œ***�080684�***9ŠST.B�FLAGA-PBA(A6)‡USE�APPEND�FROM�NOW�ON�***�080684�*** IOSEND2ƒRTSŠPAGE%**************************************;*ˆROUTINE�TO�DIRECT�OUTPUT�TO�SOMETHING�OTHER�THAN�TERMINAL*&**************************************9********************************************************** NEWOUT„EQU„*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º02/03/84%‰MOVE.Wƒ#FHCLOS,LU3FHS+FHSCMD-PBA(A6)*œSET�CODE/CMD�FOR�CLOSE *º02/03/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*%ŠFHSCALL�LU3FHS(PC)ˆCLOSE�PREV�ASSIGN ŠBNE„IOERPRTŠLEA„PBA(PC),A0*œA0=PBA,ŠLEA„LU3FHS(PC),A6ŠLU3�PARM�TABLE�ADDR�TO�A6@ŠMOVE.B�#0,FHSWCD(A6)†LOAD�WRITE�PASSWORD�(USER�CAN�ALWAYS�WRITE?ŠMOVE.B�#$FF,FHSRCD(A6)„LOAD�READ�PASSWORD�(ONLY�USER�CAN�READ)3ŠMOVE.W�USERNUM-PBA(A0),FHSUSN(A6)�DEFAULT�USER�NUM-ŠMOVE.L�VOLNAM-PBA(A0),FHSVOL(A6)�VOLUME�NAME*ŠMOVE.L�CATNAM-PBA(A0),FHSCLG(A6)�CAT�NAME)ŠMOVE.L�CATNAM+4-PBA(A0),FHSCLG+4(A6)�CAT*ŠMOVE.W�#'LS',FHSEXT(A6)ƒDEFAULT�EXT�IS�SA5ŠMOVE.L�OFLAG-PBA(A0),A0ƒOFLAG�HAD�ADDR�OF�SCAN�START*)******************************************  ' =S!L)Y1G9CADIZQAY>aLi`qByY�Z‰P‘&*ˆSET�UP�A0�WITH�ADDR�OF�START�OF�SCAN'*ˆSET�UP�A6�WITH�ADDR�OF�FHS�PARM�BLOCK*‰CALL�EDITFILE�ROUTINE�****)****************************************** ŠBSR„EDITFILEŠTST.L‚D0‘CK�FOR�ERR0R ŠBMI„INVALERRŠLEA„PBA(PC),A6ŠLEA„LU3FHS(PC),A0*œA6=PBA$*œA0=LU3�FHS�PARAMETER�BLOCK�ADDRESS ŠBTSTƒ#1,D06ŠBNE.S‚LU3ASS�JMP�IF�LIST�FIELD�HAS�A�DEVICE�SPECIFIED ŠTST.B‚D04ŠBNE„INVALERR‹JMP�IF�FAMILY�INDICATED�FOR�LIST�FIELD ŠBRA.S‚NOTDEV)******************************************'*ˆ****ƒASSSIGN�LOGICAL�UNIT�3�(LISTING)*'**************************************** LU3ASS„EQU„*-ŠMOVE.W�#FHASGN,FHSCMD(A0)�SET�ASSIGN�COMMAND4ŠMOVE.W�#FOPPW,FHSOPT(A0)‚SET�EXCLUSIVE�WRITE�OPTION ŠFHSCALL�(A0)!*ˆ*****ƒRETURN�FROM�FHS�CALL‚****ŠBNE„IOERPRTŒERR0R!NEWOUTEƒRTS—.�RETURN�FROM�ROUTINE***)******************************************"*ˆ**‚OUTPUT�IS�A�FILE�NOT�A�DEVICE.*ˆ**‚A6�CONTAINS�ADDR�OF�OUTPUT�FHS�PARM�BLOCK*)****************************************** NOTDEV„EQU„**3ŠMOVE.W�#FHALLO+FHASGN,FHSCMD(A0)�SET�ALLOC&�ASSIGN**'ŠMOVE.W�#FOPPW+FOPEND+FOPSEQ,FHSOPT(A0)*œOPTIONS�INCLUDE *¦PUBLIC�READ*¦POSITION�AT�END�OF�FILE*¦SEQUENTIAL�FILE+ŠCLR.W‚FHSLRL(A0)‰SET�LOGIC�REC�LENGTH�TO�0"ŠCLR.L‚FHSSIZ(A0)‰SIZE�CODE�=�ZERO* NOTDEV10:ŠFHSCALL�(A0)ŽMAKE�FHS�CALLŠBEQ„NEWOUTEŒGOODŠCMP.B‚#5,D0ŽDUP�FILEŠBNE„ERCALL6ŒERROR&ŠMOVE.W�#FHASGN,(A0)‡SET�CMD�TO�ASSIGNŠBRA.S‚NOTDEV10 *œTRY�TO�ASSIGN�--�AS�FILE�EXISTŠPAGE?****************************************************************ˆ****ƒOPTIONS�ROUTINE�CALL‚****4*ˆTHIS�ROUTINE�WILL�CK�INPUT�TO�DETERMINE�IF�OPTIONS+*ˆHAVE�BEEN�REQUESTED.�OPTION�FLAGS�ARE�SET!*ˆA2�=�ADDR�START�OF�OPTION�FIELD*�IN�COMMAND�LINE*?****************************************************************CKFOROPT‚EQU„*ŠCMP.L‚#0,A2ŽANY�OPTIONSŠBEQ„ENDOPT�NO*OPTOPT„BSR„OPTION*£D0=RETURNED�STATUS*£D1=OPTION�CHARACTER*"***********************************@*‰**�BIT�6�IN�D0�SET�MEANS�THE�CARRAGE�RETURN�IS�THE�NEXT�CHAR�**"***********************************#ŠBTSTƒ#6,D0ŽCK�FOR�CARR�RETURN�FLAG%ŠBNE„ENDOPT�JMP�IF�ALL�OPTIONS�EDITED'OPTERCKƒBTSTƒ#7,D0ŽCK�FOR�ERR0R�BIT�SET*ŠBNE„INVALERR‹FOUND�INVALID�FLAG�CONDITION*+********************************************,*‰***�CK�FOR�Y�(DO�NOT�REQUEST�OK)�OPTION�***,*********************************************ŠCMP.B‚#'Y',D1ŒIS�Y�OPTION�REQŠBNE.S‚OPTNCK�NOŠTST.B‚FLAGN-PBA(A6)†N�OPT�SET)ŠBNE„OPTER20ŒJMP�IF�OPTION�CONFLICT�(Y,N)"ŠMOVE.B�#1,FLAGY-PBA(A6)ƒSET�Y�OPTŠBRA„OPTOPT�GET�NEXT*,*********************************************#*ˆCK�FOR�N�(DO�NOT�OVERWRITE�OPTION*,********************************************OPTNCK„CMP.B‚#'N',D1ŠBNE.S‚OPTACK�NO ŠTST.B‚FLAGA-PBA(A6)†APP�OPT�SET)ŠBNE„OPTER20ŒJMP�IF�OPTION�CONFLICT�(A,N)ŠTST.B‚FLAGY-PBA(A6)†Y�OPT)ŠBNE„OPTER20ŒJMP�IF�OPTION�CONFLICT�(N,Y)ŠMOVE.B�#1,FLAGN-PBA(A6) ŠBRA„OPTOPTŠPAGE.***********************************************(*ˆCK�FOR�A�(APPEND�1ST�TO�SECOND)�OPTION*.**********************************************OPTACK„CMP.B‚#'A',D1!ŠBNE.S‚OPTB�JMP�IF�NOT�'A'�OPTION*ŠTST.B‚FLAGN-PBA(A6))ŠBNE„OPTER20ŒJMP�IF�OPTION�CONFLICT�(A,N)ŠTST.B‚FLAGV-PBA(A6))ŠBNE„OPTER20ŒJMP�IF�OPTION�CONFLICT�(A,V)*ŠTST.B‚FLAGB-PBA(A6))ŠBNE„OPTER20ŒJMP�IF�OPTION�CONFLICT�(A,B)*(ŠMOVE.B�#1,FLAGA-PBA(A6)ƒSET�OPTION�FLAG ŠBRA„OPTOPT-**********************************************!*‰CK�FOR�B�(COPY�&�VERIFY)�OPTION*-*********************************************OPTB†CMP.B‚#'B',D1!ŠBNE.S‚OPTV�JMP�IF�NOT�'B'�OPTION*ŠTST.B‚FLAGV-PBA(A6)+ŠBNE.S‚OPTER20ŒJMP�IF�OPTION�CONFLICT�(B,V)*ŠTST.B‚FLAGA-PBA(A6)+ŠBNE.S‚OPTER20ŒJMP�IF�OPTION�CONFL  ICT�(B,A)*!ŠMOVE.B�#1,FLAGB-PBA(A6)ƒSET�FLAG ŠBRA„OPTOPT-***********************************************‰CK�FOR�V�(VERIFY�ONLY)�OPTION*-*********************************************OPTV†CMP.B‚#'V',D1!ŠBNE.S‚OPTT�JMP�IF�NOT�'V'�OPTION*+ŠBTSTƒ#4,D0ŽIs�there�an�"="�after�the�"V"�?ŠBEQ.S‚NOEQUALŒBranch�if�no.<ŠMOVE.B�#1,V_EQUAL-PBA(A6)�Set�the�"="�found�after�"V"�flag.:ŠMOVE.W�D3,V_VALUE-PBA(A6)�Save�binary�of�value�after�"=".ŠMOVE.W�D3,OV_VALUE-PBA(A6) NOEQUALƒEQU„*ŠTST.B‚FLAGA-PBA(A6)+ŠBNE.S‚OPTER20ŒJMP�IF�OPTION�CONFLICT�(A,V)*ŠTST.B‚FLAGB-PBA(A6)+ŠBNE.S‚OPTER20ŒJMP�IF�OPTION�CONFLICT�(V,B)*ŠBTSTW‚#3,COPY_FLG-PBA(A6)+ŠBNE.S‚OPTER20ŒJMP�IF�OPTION�CONFLICT�(V,P)*ŠMOVE.B�#1,FLAGV-PBA(A6) ŠBRA„OPTOPTŠPAGEOPTER:ŠMOVE.L�#EM_NVO,D0)*£D0=KEY�VALUE�FOR�INVALID�OPTION�MESSAGE ŠBSR„IOERPRTR*£OUTPUT�THE�MESSAGEŠLEA„QUESTM(PC),A3ŠLEA„QUESTME(PC),A4ŠBSR.S‚OPTER99*£OUTPUT�HELP�MASK ŠBRA„TERMINAT**ENDOPT:ŠBTSTW‚#2,COPY_FLG-PBA(A6).ŠBEQ.S‚T_OPT_CK‹JMP�IF�'T'�OPTION�NOT�SELECTEDŠTST.B‚FLAGV-PBA(A6)/ŠBEQ.S‚OPTER20ŒJMP�IF�'T'�OPTION�SELECTED�.....*£BUT�'V'�OPTION�NOT T_OPT_CK:ŠRTS—RETURN�FROM�ROUTINE*OPTER20:ŠMOVE.L�#EM_OPTCF,D0**£D0=KEY�VALUE�FOR�OPTION�CONFLICT�MESSAGE ŠBRA„IOERPRT *£DISPLAY�ERROR�MESSAGE�AND�EXITOPTER99:%ŠORI.W‚#IOPIMG,OUT3IOS-PBA+IOSOPT(A6)*£SET�OPTIONS�FOR�IMAGE�FORMAT ŠBSR„PRTLU3*£OUTPUT�MESSAGE,ŠANDI.W�#$FFFF-IOPIMG,OUT3IOS-PBA+IOSOPT(A6)*£REMOVE�IMAGE�FORMAT�REQUESTŠRTSOPTT:ŠCMP.B‚#'T',D1 ŠBNE.S‚OPTP*£JMP�IF�NOT�'T'�OPTIONŠBSETW‚#2,COPY_FLG-PBA(A6) *£SET�FLAG�-�'T'�OPTION�SELECTED ŠBRA„OPTOPT*£LOOK�FOR�ANOTHER�OPTIONOPTP:ŠCMP.B‚#'P',D1 ŠBNE.S‚OPTU*£JMP�IF�NOT�'P'�OPTIONŠTST.B‚FLAGV-PBA(A6)ŠBNE.S‚OPTER20*£JMP�IF�OPTION�CONFLICT�(P,V)ŠBSETW‚#3,COPY_FLG-PBA(A6)!*£SET�FLAG�--�'P'�OPTION�SELECTED ŠBRA„OPTOPT*£LOOK�FOR�ANOTHER�OPTION*OPTU:ŠCMP.B‚#'U',D1%ŠBNE.S‚OPTC�Branch�if�not�'U'�option.8ŠMOVE.B�#1,FLAGU-PBA(A6)ƒSet�flag�-�'U'�option�selected.'ŠBRA„OPTOPT�Go�look�for�another�option.*OPTC:ŠCMP.B‚#'C',D1 ŠBNE.S‚OPTERŠMOVE.B�#1,FLAGC-PBA(A6) ŠBRA„OPTOPTŠPAGE*4******************************************************ˆROUTINE�TO�SPACE�COMPRESS&*ŠA0�CONTAINS�THE�SENDING�LINE�ADDRESS(*ŠA4�CONTAINS�THE�RECEIVING�LINE�ADDRESS,*ŠD1�CONTAINS�THE�LENGTH�OF�THE�SENDING�LINE*5******************************************************"SPCOMP„CMP.B‚#'�',(A0)ŠIS�IT�BLANKŠBEQ.S‚BLD3�YES&ŠMOVE.B�(A0)+,(A4)+ˆMOVE�TO�PRINT�LINE"BLDECK„SUB.W‚#1,D1ŽIS�THIS�THE�ENDŠBHI„SPCOMP�NO"ŠMOVE.B�#'�',(A4)ŠPUT�BLANK�AT�END ŠRTS—RETURN*!BLD3†ADD.W‚#1,A0ŽINC�ADDR�OF�SEND ŠBRA„BLDECK**ŠPAGE5******************************************************ˆROUTINE�TO�VERIFY�A�FILE* VERIFYIT:,*‰BTSTƒ#4,D0ŽIs�there�an�"="�after�the�"V"�?*‰BEQ.S‚NOEQUAL1‹Branch�if�no.=*‰MOVE.B�#1,V_EQUAL-PBA(A6)�Set�the�"="�found�after�"V"�flag.;*‰MOVE.W�D3,V_VALUE-PBA(A6)�Save�binary�of�value�after�"=".*‚NOEQUAL1‚EQU„*$ŠMOVE.L�GSEG_ADR-PBA(A6),A3¡12/17/84*œA3=ADDR�OF�GET�SEGMENTŠCLR.L‚D0²10/19/83:ŠMOVE.L�BUFNUME-PBA(A6),D0�get�#�sectors�in�block‹10/19/83<ŠADDA.L�BUFNUM-PBA(A6),A3‚1st�byte�at�end�of�area�1ˆ10/19/830ŠMOVE.L�D0,(A3)Œinitialize�record�countŠ10/19/83*ŠBCLRW‚#0,COPY_FLG-PBA(A6)!*œINITIALIZE�UNACCOUNTED�FOR�FLAGŠBSETW‚#1,COPY_FLG-PBA(A6)*œSET�FLAG�-�VERIFY�MODEŠTST.B‚FLAGA-PBA(A6) ŠBNE.S‚VER1ŠMOVE.W�COPY_FLG-PBA(A6),D0ŠAND.W‚#$0018,D0"*œISOLATE�'P'�OPTION�AND�FILE�TYPEŠCMP.W‚#$0018,D0 ŠBEQ.S‚VER1*œJMP�IF�'A'�OPTION�SELECTED2*œJMP�IF�'P'�OPTION�SELECTED�AND�FILE�TYPE=NDX�SEQ *œVERIFY�MODE�MUST�BE�RECORD�I/OŠTST.B‚FLAGB-PBA(A6) ŠBNE.S‚VER12*œJMP�IF�'B'�OPTION$*œWHAT�EVER�I/O�COPY�PERFORMED�UNDER%*œVERIFY�WILL�BE�PERFORMED�UNDER�SAME*œ(BLOCK�OR�RECORD)VER1:4ŠMOVE.W�#IOPWAT+IOPREC+IOPRTK,DSKRIOS-PBA+IOSOPT(A6)4ŠMOVE.W�#IOPWAT+IOPREC+IOPRTK,DSKWIOS-PBA+IOSOPT(A6)*œSET�R/W�OPTIONS*¦WAIT*¦RECORD�ACCESS*¦RETURN�KEY�W  ITH�RECORDVER12…LEA„VERMSG(PC),A3ŠLEA„VERMSGE(PC),A4 ŠBSR„PRTLU3*œOUTPUT�'START�VERIFY'�MESSAGEŠMOVE.W�#FHASGN,INFHS-PBA(A6)ŠMOVE.W�#FHASGN,OUTFHS-PBA(A6)*œFHS�COMMAND�=�ASSIGN#ŠMOVE.W�#FOPPR,INFHS+FHSOPT-PBA(A6)$ŠMOVE.W�#FOPPR,OUTFHS+FHSOPT-PBA(A6) *œFHS�OPTION *¦PUBLIC�READŠMOVE.W�#IOREAD,DSKWIOS-PBA(A6)*œIOS�COMMAND�=�READŠMOVE.L�GSEG_ADR-PBA(A6),A4 ŠMOVE.L�A4,A3*œA3=A4=GET�SEGMENT�ADDRESS!ŠMOVE.L�A4,DSKRIOS-PBA+IOSSAD(A6)%*œSET�START�ADDRESS�FOR�VERIFY�FILE�14ŠADD.L‚BUFCE-PBA(A6),A4ƒ#�sectors�in�area�1Ž10/19/83!ŠMOVE.L�A4,DSKRIOS-PBA+IOSEAD(A6)#*œSET�END�ADDRESS�FOR�VERIFY�FILE�16ŠADD.L‚BUFVER-PBA(A6),A3‚start�of�area�2�addr�10/19/83!ŠMOVE.L�A3,DSKWIOS-PBA+IOSSAD(A6)(*œA3=SET�START�ADDRESS�FOR�VERIFY�FILE�23ŠADD.L‚BUFCE-PBA(A6),A3ƒadd�size�of�area�1�10/19/83!ŠMOVE.L�A3,DSKWIOS-PBA+IOSEAD(A6)#*œSET�END�ADDRESS�FOR�VERIFY�FILE�2"ŠMOVE.B�#'1',VFILMN-PBA(A6)�FILE�1ŠLEA„INVOL(PC),A4 ŠBSR„MOVMSGŠLEA„VFILM(PC),A3*œA3=MSG�START�ADDRESSŠBSR„PRTLU3�PRT�REST�OF�MSG&*œOUTPUT�FILE�1�PART�OF�VERIFY�MESSAGEŠFHSCALL�INFHS(PC)‰ASSIGN�DSK1 ŠBEQ.S‚VER2%*œJMP�IF�FILE�1�ASSIGNED�SUCCESSFULLYVERER: ŠBSR„ERR_0100 *œADJUST�FILE�VERIFY�ERROR�COUNTŠTST.B‚FAMIFLAG-PBA(A6)0ŠBEQ„IOERPRTŒJMP�IF�OTHER�THAN�FAMILY�PROCESSING ŠBSR„IOERPRTR ŠRTS—RETURN�TO�FAMILY�PROCESSINGVER2:ŠCLR.B‚NCFLAG-PBA(A6)!*œSET�FLAG�-�CONTIGIOUS�FILE�TYPEŠMOVE.W�INFHS-PBA+FHSOPT(A6),D0ŠAND.W‚#FFTBIT,D0ŠBEQ.S‚CONTIG_X*œJMP�IF�CONTIGIOUS�FILEŠMOVE.L�GSEG_ADR-PBA(A6),A4*œA4=ADDR�OF�GET�SEGMENT8ŠADDA.L�BUFNUM-PBA(A6),A4‚1st�byte�after�area�1Œ10/19/83ŠMOVE.L�#1,(A4)+*œSET�SECTOR�COUNT�FOR�NON-CONTIGIOUS�FILESŠMOVE.B�#1,NCFLAG-PBA(A6)%*œSET�FLAG�-�NON�CONTIGIOUS�FILE�TYPE CONTIG_X:"ŠMOVE.B�#'2',VFILMN-PBA(A6)�FILE�2ŠLEA„OUTVOL(PC),A4 ŠBSR„MOVMSGŠLEA„VFILM(PC),A3*œA3=MSG�START�ADDRESS ŠBSR„PRTLU3&*œOUTPUT�FILE�2�PART�OF�VERIFY�MESSAGEŠFHSCALL�OUTFHS(PC)ˆASSIGN�DSK2)ŠBNE„VERERŽJMP�IF�ASSIGN�ERROR�FOR�FILE�2ŠCLR.L‚D4‘INIT�RECORD�COUNTERŠBRA.S‚VREAD10ŒBYPASS�1ST�TIME* VREAD1„EQU„*EŠCLR.B�CHGEND-PBA(A6)�CLEAR�DIFFERENT�RECORD�LENGTH�FLAG�***080684***ŠMOVE.L�GSEG_ADR-PBA(A6),A4*œA4=GET�SEGMENT�ADDR@ŠADDA.L�BUFNUM-PBA(A6),A4‚1st�byte�after�addr�of�area�1„10/19/83/ŠADD.L‚(A4),D4ŒADJUST�THE�RECORD�COUNTŠ10/19/83VREAD10ƒCLR.L‚D5‘INIT�OFFSET8ŠMOVE.L�GSEG_ADR-PBA(A6),A4�A4=BUFFER�ADDRESS�FOR�FILE�1 ŠMOVE.L�A4,A5?ŠADDA.L�BUFVER-PBA(A6),A5‚A5=BUFFER�ADDRESS�FOR�FILE�2…10/19/83*4**************************************************** *ˆREAD�DISK�14***************************************************** VREAD1AƒEQU„*ŠIOSCALL�DSKRIOS(PC)‡READ�DSK1ŠBEQ.S‚VREAD2�GOOD�READŠCMP.B‚#ISTAEOF,D0ˆEND�OF�FILEŠBEQ„VEND1ŽYES9ŠBRA‚IOERCHKŠCHECK�FOR�BUFFER�OVERFLOW�BEFORE�TERMINATING$*œMODIFIED�080684�TO�CORRECT�SPR1035#*********************************** *ˆREAD�DISK�2!********************************** VREAD2„EQU„* ŠIOSCALL�DSKWIOS(PC)‡READ�DISK�2 ŠBEQ.S‚VCMPSŠCMP.B‚#ISTAEOF,D0ˆEND�OF�FILE ŠBEQ.S‚VEND29ŠBRA„IOERCHKŠCHECK�FOR�BUFFER�OVERFLOW�BEFORE�TERMINATING$*£MODIFIED�080684�TO�CORRECT�SPR1035 VCMPS…EQU„*$ŠTST.B‚NOTEND-PBA(A6)…END�SWITCH�SETŠBNE.S‚VCMPSOKŒNOBŠMOVE.B�#'2',TERMMSGF-PBA(A6)�EOF�REACHED�ON�FILE�1�BUT�NOT�FILE�2ŠBRA„TERMERRŒERROR* VCMPSOKƒEQU„*>ŠMOVE.L�DSKRIOS-PBA+IOSLEN(A6),D6�D6=NBR�BYTES�READ�FOR�FILE�1>ŠMOVE.L�DSKWIOS-PBA+IOSLEN(A6),D7�D7=NBR�BYTES�READ�FOR�FILE�2 ŠCMP.L‚D6,D7.ŠBEQ.S‚VCMPLOOP‹JMP�IF�RECORD�LENGTHS�ARE�SAME?ŠMOVE.B�#1,CHGEND-PBA(A6)‚SET�FLAG�RECORD�LENGTHS�ARE�DIFFERENT*VCMPLOOP‚EQU„*!ŠCMPM.B�(A4)+,(A5)+ˆCOMPARE�BYTESŠBNE.S‚VPRT�NOT�EQUAL* *ˆADD�OFFSET VCMPOS„EQU„*ŠSUB.L‚#1,D6ŽREDUCE�SIZEŠBNE„VCMPLOOP‹NOT�AT�END/************************************************ˆAT�END�OF�DATA�IN�BUFFER/************************************************&ŠTST.B‚CHGEND-PBA(A6)…LENGTHS�THE�SAMEŠBEQ„VREAD1�YES*(*****************************************ˆPUT�OUT�LENGTH  �ERROR�MSG&**************************************%ŠMOVE.L�D4,D0ŽRECORD�#�FOR�CONVERSIONŠMOVE.L�#5,D1ŽSIZEŠLEA„ENDRN(PC),A0‹REC�AREAŠTST.B‚NCFLAG-PBA(A6) ŠBNE.S‚V_0100*œJMP�IF�NON-CONTIGIOUS�FILEŠMOVE.B�#'$',-1(A0)*œFORCE�HEX�INDIATOR ŠBSR„BINHEX*œCONVERT�TO�HEX�ASCII ŠBRA.S‚V_0200V_0100: ŠBSR„BINDECFJ*œCONVERT�TO�DECIMAL�ASCIIV_0200:ŠLEA„ENDNSM(PC),A0!ŠMOVE.L�A0,OUT3IOS-PBA+IOSSAD(A6)ŠLEA„ENDNSME(PC),A0!ŠMOVE.L�A0,OUT3IOS-PBA+IOSEAD(A6)ŠIOSCALL�OUT3IOS(PC)ŠBNE„IOERPRTŒERROR ŠBRA„VREAD1* VEND1…EQU„*4ŠCLR.B‚NOTEND-PBA(A6)…SET�FLAG�-�EOF�FOUND�OF�FILE�1 ŠBRA„VREAD2�GO�FOR�END�ON�FILE�2* VEND2…EQU„*ŠTST.B‚NOTEND-PBA(A6),ŠBEQ.S‚FVC_0100‹JMP�IF�BOTH�FILES�ARE�AT�EOFEŠMOVE.B�#'1',TERMMSGF-PBA(A6)�EOF�REACHED�ON�FILE�2�BUT�NOT�ON�FILE�1 ŠBRA„TERMERR*VEREXIT:ŠRTS—EXIT�VERIFY�ROUTINE* FVC_0100:ŠADD.W‚#1,FCV-PBA(A6)*œADJUST�NBR�OF�FILES�VERIFIEDŠBRA.S‚VEREXIT*œEXITVPRT: ŠBSR„ERR_0100 *œADJUST�FILE�VERIFY�ERROR�COUNTŠTST.B‚FAMIFLAG-PBA(A6) ŠBNE„FVP_0100!*œJMP�IF�FAMILY�VERIFY�PROCESSING)******************************************ˆMOVE�OFFSET�TO�MSG(*****************************************-VPRT1…MOVE.L�DSKRIOS-PBA+IOSLEN(A6),D5�LENGTHŠSUB.L‚D6,D5ŽPOS�FROM�END ŠCLR.L‚D0ŠMOVE.B�D5,D0ŽGET�OFFSET ŠMOVE.L�#2,D1ŠLEA„VM21(PC),A0ŠBSR„BINHEX�GO�CONVERT*"***********************************ˆCONVERT�SECTOR�#�&�PRINT#************************************* ŠMOVE.L�D5,D0ŠLSR.L‚#8,D0ŽGET�PAST�OFFSET ŠADD.L‚D4,D0ŽADD�SECTOR�CNT�BASE ŠMOVE.L�#5,D1ŠLEA„VMS(PC),A0ŠTST.B‚NCFLAG-PBA(A6) ŠBNE.S‚VPRT2!*œJMP�IF�NON-CONTIGIOUS�TYPE�FILEŠMOVE.B�#'$',-1(A0)*œFORCE�HEX�INDICATOR ŠBSR„BINHEX*œCONVERT�TO�HEX�ASCII ŠBRA.S‚VPRT3VPRT2:&ŠBSR„BINDECFJ‹CONVERT�TO�DECIMAL�ASCII*)***************************************** *ˆCONVERT�DSK0�BYTE�FOR�PRINTING)******************************************VPRT3:ŠCLR.L‚D0‘INITŠMOVE.B�-(A4),D0‹GET�DK0�BYTEŠMOVE.L�D0,D1ŽINIT"ŠBSR„ASCCKŽGO�TO�CK�PRINT�RANGE�RT/ŠMOVE.B�D1,VMO11-PBA(A6)ƒMOVE�ASCII�CHAR�TO�MSGŠASR.B‚#4,D0ŽTOP�4�BITSŠLEA„VMO1(PC),A0ŒREC�ADDRŠMOVE.L�#1,D1ŽSIZEŠBSR„BINHEX�GO�CONVERT*ŠMOVE.B�(A4),D0ŠAND.B‚#$F,D0�LOW�4�BITSŠLEA„VMO1+1(PC),A0ŠADDR�TO�RECŠMOVE.L�#1,D1ŽSAZE ŠBSR„BINHEXŠADD.L‚#1,A4ŽRESET�LOCATION*&***************************************ˆCONVERT�DSK1�FOR�PRINTING&****************************************ŠMOVE.B�-(A5),D0ŠMOVE.L�D0,D1ŽINIT"ŠBSR„ASCCKŽGO�TO�ASCII�CK�PRINT�RT1ŠMOVE.B�D1,VMO21-PBA(A6)ƒMOVE�ASCII�CHAR�2�TO�MSGŠASR.B‚#4,D0ŽHI�4�BITSŠLEA„VMO2(PC),A0ŒADDRŠMOVE.L�#1,D1ŽSIZE ŠBSR„BINHEX*ŠMOVE.B�(A5),D0ŠADD.L‚#1,A5ŽRESET�LOCATIONŠAND.B‚#$F,D0�LOW�4�BITESŠLEA„VMO2+1(PC),A0 ŠMOVE.L�#1,D1 ŠBSR„BINHEX******************************ˆPRINT�DIFFERENCE****************************ŠLEA„VM1(PC),A0+ŠMOVE.L�A0,OUT3IOS-PBA+IOSSAD(A6)�MSG�STARTŠLEA„VM2E(PC),A0!ŠMOVE.L�A0,OUT3IOS-PBA+IOSEAD(A6)ŠIOSCALL�OUT3IOS(PC) ŠBNE„IOERPRTŠTST.B‚V_EQUAL-PBA(A6)ˆ"V="�? ŠBEQ.S‚CNTNUE*AŠMOVE.W�V_VALUE-PBA(A6),D3…The�value�of�x�in�"V=x"�is�decremented2ŠSUB.L‚#1,D3’on�every�occurance�of�a�difference...4ŠBNE.S‚LIMITOUT�This�limits�the�"V"�option�to�x�....*§differences.2ŠBSR„ERR_0100�Adjust�file�verify�error�count�and../ŠBRA„FVC_0100�#�of�files�verified,�then�return.*"LIMITOUT‚MOVE.W�D3,V_VALUE-PBA(A6)* CNTNUE„BTSTW‚#2,COPY_FLG-PBA(A6) ŠBNE.S‚VRSEC1*£JMP�IF�'T'�OPTION�SELECTED2ŠBRA„VCMPOS�CONTINUE�COMPARISON�IF�MORE�TO�COMPARE*F**********************************************************************>*ˆROUTINE�TO�SELECT�1�DIFFERENCE/256�BYTES�WHEN�'T'�OPTION�SETF********************************************************************** *ˆ08/23/83‚RJ<*ˆThe�point�at�which�the�difference�is�found�is�evaluated�to=*ˆdetermine�in�which�256�byte�block�of�the�data�buffer�it�was=*ˆlocated.�The�address�pointers�are�then�set�to�the�beginning=*ˆof�the�next�256�byte�block.�(This�algorithm�depends�on�A4's>*ˆcomparison�buffer�bieng�  based�on�an�even�$100�byte�boundary.9*ˆNo�such�restriction�applies�to�A5's�comparison�buffer.)*1VRSEC1„MOVE.L�A4,D7ŽSave�old�comparison�pointer..ŠMOVE.L�D7,-(A7)‹on�the�stack.'ŠADD.L‚#$FF,D7ŒCompute�amount�to�add...5ŠAND.L‚#$FFFFFF00,D7†in�order�to�arive�at�the�next...7ŠSUB.L‚(A7)+,D7‹$100�byte�boundary.�(rec�length�=�$100)%ŠADD.L‚D7,A4ŽBump�both�pointers�to...%ŠADD.L‚D7,A5Žnext�$100�byte�boundary.*#ŠSUB.L‚#1,D6ŽAdjust�byte�counter...(ŠAND.L‚#$FFFFFF00,D6†downward�to�next...#ŠADD.L‚#1,D6Žmultiple�of�$100�bytes ŠBRA„VCMPOS*>**************************************************************7*ˆROUTINE�TO�CK�ASCII�PRINT�RNAGE�&�BLANK�NON�PRINTABLE>***************************************************************#ASCCK…CMP.B‚#$20,D1ŒLESS�THAN�BLANKŠBCS.S‚ASCSPŽYESŠCMP.B‚#$7F,D1ŒGR�THAN�7F�(DEL)ŠBLS.S‚ASCEXŽNOASCSP…MOVE.B�#'�',D1ASCEX…RTS—.�RETURN******* FVP_0100:ŠTST.B‚FLAGV-PBA(A6) ŠBNE„VPRT1*œJMP�IF�VERIFY�ONLY�OPTIONŠLEA„NVERM(PC),A3ŠLEA„NVERME(PC),A4*œA3=MESSAGE�START�ADDR*œA4=MESSAGE�ENDƒADDR ŠBSR„OPTER99*œOUTPUT�MESSAGEŠRTS*8********************************************************>*‰ROUTINE�TO�CHECK�FOR�IOS�BUFFER�OVERFLOW�ERROR�AND�RETRY�I/O*‰IF�NOT�ALREADY�DONE�SO7********************************************************@*‰ADDED�080684�TO�CORRECT�SPR1035.�THIS�ROUTINE�RETRIES�ANY�READA*‰WHICH�HAS�GENERATED�AN�IOS�BUFFER�OVERFLOW�ERROR.�IT�RETRIES�IT?*‰BY�PERFORMING�THE�READ�IN�BINARY�FORMATTED�MODE�AS�OPPOSED�TO?*‰ASCII�FORMATTED�MODE.�THIS�ELIMINATES�ANY�ERRORS�CAUSED�BY�AN>*‰EXPANDED�ASCII�RECORD�OF�LENGTH�>�256�BYTES.�IT�WILL�THEN�BE=*‰ASSUMED�THAT�THE�FILE�IS�NON-ASCII,�AND�THE�REMAINING�READS-*‰WILL�BE�PERFORMED�IN�BINARY�FORMATTED�MODE.*IOERCHK: EQU *+ŠCMP.W�#ISTABO,D0ƒCHECK�FOR�BUFFER�OVERFLOW"ŠBNE.S�CHKEXIT‡NO�-�TERMINATE�TASK/ŠTST.B�REREAD-PBA(A6)�CHECK�FOR�PREVIOUS�REREAD<ŠBNE.S�CHKEXIT‡REREAD�HAS�ALREADY�BEEN�PERFORMED�-�TERMINATEHƒOR.W�#IOPBIN+IOPCUR,DSKRIOS-PBA+IOSOPT(A6)�START�READING�IN�BINARY�MODE>ƒOR.W�#IOPBIN,DSKWIOS-PBA+IOSOPT(A6)�AND�REREAD�CURRENT�RECORDCŠMOVE.B�#1,REREAD-PBA(A6)�SET�FLAG�TO�INDICATE�REREAD�HAS�BEEN�DONE#ŠMOVE.L�A0,-(A7)�SAVE�OLD�IOS�BLOCKŠIOSCALL�DSKRIOS(PC):ŠBNE.S�CHKEXIT�WE�KNOW�IT�ISN'T�AN�END�OF�FILE,�BECAUSE�WE/* COULDN'T�GET�HERE�IF�IT�WAS,�SO�TERMINATE�THE* TASK>ŠAND.W�#$FFFF-IOPRAN,DSKRIOS-PBA+IOSOPT(A6)�RESET�TO�READ�NEXT'ŠMOVEA.L�(A7)+,A0�RESTORE�OLD�IOS�BLOCK7ŠCMP.B�#1,IOSLUN(A0)�CHECK�FOR�ERROR�ON�FIRST�FILE�ONLY.ŠBEQ�VREAD2�YES�-�PROCESS�SECOND�FILE�NORMALLYHƒOR.W�#IOPCUR,DSKWIOS-PBA+IOSOPT(A6)�REREAD�CURRENT�RECORD�FROM�2ND�FILEŠIOSCALL�DSKWIOS(PC)%ŠBNE.S�CHKEXIT�ERROR�-�TERMINATE�TASKEŠAND.W�#$FFFF-IOPRAN,DSKWIOS-PBA+IOSOPT(A6)�RESET�TO�READ�NEXT�RECORDŠBRA�VCMPS�NOW�DO�THE�COMPARE+CHKEXITƒBRA�IOERPRT‚PRINT�THE�ERROR�MESSAGE ŠPAGE**ˆMOVE�FILE�NAME�TO�WORK�AREA*"MOVMSG„MOVE.L�(A4)+,VOLPRT-PBA(A6)*œMOVE�VOLUME�FIELDŠLEA„L1USN(PC),A0 ŠCLR.L‚D0ŠMOVE.W�(A4)+,D0ŠMOVE.L�#4,D1ŽSIZE9ŠCMP.W�#-2,D0ŽCHECK�FOR�WILDCARD�USER�NUMBER�***�080684�*3ŠBEQ.S‚MOVMSG20‹SKIP�OVER�CONVERSION„***�080684�***"ŠBSR„BINDECFJ‹CONV�TO�ASCII�USER�#*œMOVE�USER�NUMBER�FIELDŠBRA.S‚MOVMSG30„***�080684�***KMOVMSG20‚MOVE.B�#'*',0(A0)‚PUT�ASTERISK�IN�USER�NUMBER�FIELD�***�080684�***MOVMSG30‚EQU„*‹***�080684�***.ŠMOVE.L�(A4)+,L1CAT-PBA(A6)�MOVE�CATALOG�FIELDŠMOVE.L�(A4)+,L1CAT+4-PBA(A6)+ŠMOVE.L�(A4)+,L1FIL-PBA(A6)�MOVE�FILE�FIELDŠMOVE.L�(A4)+,L1FIL+4-PBA(A6))ŠMOVE.W�(A4),L1EXT-PBA(A6)�MOVE�EXT�FIELD*ŠLEA„COPOKB(PC),A4 MOVMSG10:1*œSECONDARY�RTNE�ENTRY�POINT�WHERE�REG�A4�ALREADY *œESTABLISHEDŠLEA„DIRMSG(PC),A0ŠMOVEƒ#DIRMSGE-DIRMSG,D1�SIZE ŠBSR„SPCOMP**œSPACE�COMPRESS�FULLY�QUALIFIED�FILE�NAMEŠRTS*PRTLU6I:ŠLEA„PBA(PC),A0*œA0=PBA"ŠMOVE.L�A3,OUT6IIOS-PBA+IOSSAD(A0)"ŠMOVE.L�A4,OUT6IIOS-PBA+IOSEAD(A0)ŠIOSCALL�OUT6IIOS(PC) ŠBNE„IOERPRT ŠRTS—.�RETURN*’PRINT�TO�LU3�FORMATTED�FORMATPRTLU3:ŠLEA„PBA(PC),A0!ŠMOVE.L�A3,OUT3IOS-PBA+I  OSSAD(A6)!ŠMOVE.L�A4,OUT3IOS-PBA+IOSEAD(A6)ŠIOSCALL�OUT3IOS(PC) ŠBNE„C_TERMŠRTS* ERRFIL„EQU„*ŠLEA„ATTMSG(PC),A3ŠLEA„ATTMSGE(PC),A4* ŠBRA.S‚ERCALL*****ƒTERMERR�IS�IN�DRIVER�BLOCK�NEAR�(DOCOPY)*TERMERR:ŠBSR.S‚ERR_0100 *œADJUST�COPY-VERIFY�ERROR�COUNTŠLEA„TERMMSG(PC),A3‰MSG�STARTŠLEA„TERMMSGE(PC),A4ˆEND ŠBSR„PRTLU3ŠRTS*:*ˆERROR�SAME�MEANS�INPUT�FILE�&�OUTPUT�FILE�HAVE�SAME�NAME ERRSAM„EQU„*ŠLEA„ERRSAMM(PC),A3ŠLEA„ERRSAMME(PC),A4 ŠBTSTƒ#7,FAMOFLAG-PBA(A6)�FAMILYŠBEQ.S‚ERCALL�NO ŠBSR„PRTLU3ŠMOVE.B�#2,ERFLAG-PBA(A6) ŠRTS—.‰RETURN** IOERPRTR:ŠMOVE.L�#LISTLU,D1*œD1=LUN�OUTPUT�MSG�TO ŠBSR„C_EM_PGM*œOUTPUT�ERROR�MESSAGEŠRTS*2**************************************************&*ˆ**‚ROUTINE�TO�PRINT�ERR0R�MESSAGE‚***3**************************************************** ERCALL„EQU„* ŠBSR„PRTLU3ŠBRA.S‚TERMINAT**!ERCALL6ƒEQU„*’CALL�USING�TERMINALŠMOVE.L�#LDFLUN,D1*œD1=LUN�OUTPUT�MSG�TO ŠBSR„C_EM_PGM*œOUTPUT�MESSAGEŠBRA.S‚TERMINAT**0*ˆADJUST�COPY�-�VERIFY�ERROR�COUNTS�IF�NECESSARY* ERR_0100:ŠBSETW‚#0,COPY_FLG-PBA(A6)*œSET�FILE�ACCOUNTED�FOR�FLAGŠBNE.S‚ERR_0120*œJMP�IF�FILE�ACCOUNTED�FORŠBTSTW‚#1,COPY_FLG-PBA(A6)ŠBEQ.S‚ERR_0110*œJMP�IF�COPY�MODEŠADD.W‚#1,FVE-PBA(A6)*œADJUST�VERIFY�ERROR�COUNTŠRTS* ERR_0110:ŠADD.W‚#1,FCE-PBA(A6)*œADJUST�COPY�ERROR�COUNT ERR_0120:ŠRTS ERR_0130:ŠBCLRW‚#0,COPY_FLG-PBA(A6)!*œINITIALIZE�UNACCOUNTED�FOR�FLAGŠBCLRW‚#1,COPY_FLG-PBA(A6)*œSET�FLAG�-�COPY�MODEŠRTSŠPAGE INVALERR:8ŠCLR.B‚FAMIFLAG-PBA(A6)�RESET�FAMILY�FLAG�***�080684�***ŠMOVE.L�#EM_NVE,D0'*œD0=KEYVALUE�FOR�INVALID�ENTRY�MESSAGEIOERPRT:ŠBSR.S‚IOERPRTRŠPAGE**2*ˆALL�UTILITIES�WILL�TERMINATE�BY�CALLINGƒERQ.TERM:*ˆHOWEVER�-�AN�INDICATION�AS�TO�WHETHER�THERE�WAS�AN�ERROR5*ˆWHICH�MIGHT�CAUSE�CHAIN�PROCESSING�TO�ABORT�MUST�BE9*ˆSPECIFIED�AT�THE�TIME�OF�THE�TERMINATION.�THE�FOLLOWING8*ˆWILL�DEFINE�THE�TYPE�OF�TERMINATION�THAT�ARE�CURRENTLY *ˆPOSSIBLE:*8*’NORMAL�TERMINATION‚-�IMPLIES�THAT�UTILITY�SUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM�#0,#0**:*’ERROR�TERMINATIONƒ-�IMPLIES�THAT�UTILITY�TERMINATED�WITH *¨AN�ERROR**¦ERQ.TERM�#0,#$C000*<*’WARNING�TERMINATION�-�IMPLIES�THAT�UTILITY�TERMINATED�WITH*¨A�WARNING�(ie.�ASSEMBLY)**¦ERQ.TERM�#0,#$1000*L********�PBA�-�IS�THE�PROGRAM�BASE�ADDRESS‚--�THIS�MAYBE�ANY�SYMBOL�THE�USER *®WOULD�LIKE�-�PBA�HAS�BEEN�USED*®HERE**** TERMINAT:ŠLEA„PBA(PC),A6>ŠTST.B‚MULTIN-PBA(A6)„CHECK�FOR�MULTIPLE�INPUTS�***�080684�***6ŠBEQ.S‚TERMIN2‹PROCEED�WITH�TERMINATION‚***�080684�***6ŠTST.B‚TERM_FLG-PBA(A6)‚CHECK�FOR�ERROR‹***�080684�***4ŠBNE.S‚TERMIN2‹USE�NORMAL�TERMINATION„***�080684�***;ŠTST.B‚QFLAG-PBA(A6)…QUIT�FROM�FAMILY�COPY�?ƒ***�080684�***4ŠBNE.S‚TERMIN2‹USE�NORMAL�TERMINATION„***�080684�***'ŠBSR�CLOSNECŽCLOSE�FILES�***�080684�***)ŠBSR�CLOSDIRŽCLOSE�DIR�LUN�***�080684�***DŠMOVE.L�NEXTIN-PBA(A6),A0�RESTORE�ADDRESS�OF�FILESPEC�***�080684�***=ŠMOVE.L�LENLEFT-PBA(A6),D6�RESTORE�LINE�LENGTHˆ***�080684�***7ŠSF.BƒFAMIFLAG-PBA(A6)ƒRESET�FAMILY�FLAGŠ***�080684�***%ŠSF.BƒFAMOFLAG-PBA(A6)ž***�080684�***4ŠSF.BƒIDEV-PBA(A6)‡RESET�DEVICE�FLAGS‰***�080684�***!ŠSF.BƒODEV-PBA(A6)¢***�080684�***"ŠSF.BƒISDEV-PBA(A6)¡***�080684�***$ŠSF.BƒDEVFLAG-PBA(A6)Ÿ***�080684�***;ŠSF.BƒFAMAPEND-PBA(A6)‚RESET�WILDCARD�APPEND‡***�080684�***7ŠBRA„DOBUFF2‹PROCESS�THE�NEXT�INPUT�FILE�***�080684�***TERMIN2ƒEQU„*‘***�080684�***ŠLEA„FCC(PC),A1ŠLEA„X10200(PC),A0 ŠBSR„C_COUNTS*œCONVERT�FILES�COPIED�COUNTŠLEA„FCV(PC),A1ŠLEA„X11200(PC),A0 ŠBSR„C_COUNTS*œCONVERT�FILES�VERIFIED�COUNTŠLEA„FCE(PC),A1ŠLEA„X10500(PC),A0 ŠBSR„C_COUNTS*œCONVERT�FILES�COPIED�ERRORŠLEA„FVE(PC),A1ŠLEA„X11500(PC),A0 ŠBSR„C_COUNTS*œCONVERT�FILES�VERIFIED�ERROR+*œCONVERT�NBR�FILES�COPIED�TO�DECIMAL�ASCII*œA0=ADDR�STORE�CONVERISON*œD1=NBR�BYTES�TO�CONVERT*œD0=VALUE�TO�CONVERT ŠTST.B‚FLAGV-PBA(A6)ŠBNE.S‚TRM_0300*œJMP�IF�VERIFY�  ONLY�MODEŠTST.B‚FAMIFLAG-PBA(A6)ŠBEQ.S‚TRM_0100*œJMP�IF�OTHER�THAN�FAMILY�MODEŠBSETW‚#15,COPY_FLG-PBA(A6)$*œSET�FLAG�-�DISLAY�NBR�FILES�COPIED TRM_0100:ŠTST.W‚FCE-PBA(A6)ŠBEQ.S‚TRM_0200*œJMP�IF�NO�COPY�ERRORSŠBSETW‚#14,COPY_FLG-PBA(A6) *œSET�FLAG�-�DISPLAY�COPY�ERRORS TRM_0200:ŠTST.B‚FLAGB-PBA(A6)ŠBEQ.S‚TRM_0500*œJMP�IF�COPY�ONLY�MODE TRM_0300:ŠTST.B‚FAMIFLAG-PBA(A6)ŠBEQ.S‚TRM_0400*œJMP�IF�OTHER�THAN�FAMILY�MODEŠBSETW‚#13,COPY_FLG-PBA(A6)'*œSET�FLAG�-�DISPLAY�NBR�FILES�VERIFIED TRM_0400:ŠTST.W‚FVE-PBA(A6)ŠBEQ.S‚TRM_0500#*œJMP�IF�READY�TO�PRINT�VERIFY�INFOŠBSETW‚#12,COPY_FLG-PBA(A6) TRM_0500:ŠMOVE.W�COPY_FLG-PBA(A6),D6ŠAND.W‚#$F000,D6'*œD6=ISOLATED�COPY/VERIFY�DISPLAY�FLAGS ŠBEQ.S‚C_TERM*œJMP�IF�NOTHING�TO�DISPLAY ŠMOVE.W�D6,D0ŠAND.W‚#$C000,D0 *œD0=ISOLATED�COPY�DISPLAY�FLAGSŠBEQ.S‚TRM_0800 *œJMP�IF�NO�COPY�INFO�TO�DISPLAY ŠLSL.W‚#1,D0ŠBCS.S‚TRM_0600)*œJMP�IF�NBR�FILES�COPIED�TO�BE�DISPLAYEDŠMOVE.B�#X10300,D0*œD0.B=NBR�BYTES�TO�ZERO�FILLŠLEA„X10000(PC),A3*œA3=ADDR�START�ZERO�FILL ŠBSR.S‚Z_FILL*œZERO�FILL�SPECIFIED�ADDRESSŠBRA.S‚TRM_0700 TRM_0600: ŠLSL.W‚#1,D0ŠBCS.S‚TRM_0700&*œJMP�IF�READY�TO�DISPLAY�COPIED�INFORŠMOVE.B�#X10600,D0*œD0.B=NBR�BYTES�TO�ZERO�FILLŠLEA„X10400(PC),A3*œA3=ADDR�TO�START�ZERO�FILL ŠBSR.S‚Z_FILL TRM_0700:ŠLEA„X10000(PC),A3ŠLEA„X10700(PC),A4*œA3=MESSAGE�START�ADDR*œA4=MESSAGE�ENDƒADDR ŠBSR„PRTLU3*œOUTPUT�COPY�INFO�MESSAGE TRM_0800: ŠLSL.W‚#2,D6 ŠBEQ.S‚C_TERM"*œJMP�IF�NO�VERIFY�INFO�TO�DISPLAY ŠLSL.W‚#1,D6ŠBCS.S‚TRM_0900+*œJMP�IF�NBR�FILES�VERIFIED�TO�BE�DISPLAYEDŠMOVE.B�#X11300,D0*œD0.B=NBR�BYTES�TO�ZERO�FILLŠLEA„X11000(PC),A3*œA3=START�ADDR�TO�ZERO�FILL ŠBSR.S‚Z_FILL*œZERO�FILL�AT�SPECIFIED�ADDRŠBRA.S‚TRM_1000 TRM_0900: ŠLSL.W‚#1,D6ŠBCS.S‚TRM_1000%*œJMP�IF�READY�TO�DISPLAY�VERIFY�INFOŠMOVE.B�#X11600,D0 *œD0.B=NBR�OF�BYTES�TO�ZERO�FILLŠLEA„X11400(PC),A3*œA3=ADDR�START�ZERO�FILL ŠBSR.S‚Z_FILL*œZERO�FILL�AT�SPECIFIED�ADDR TRM_1000:ŠLEA„X11000(PC),A3ŠLEA„X11700(PC),A4*œA3=MESSAGE�START�ADDR*œA4=MESSAGE�ENDƒADDR ŠBSR„PRTLU3*œOUTPUT�VERIFY�INFO‚MESSAGEC_TERM:ŠERQ.TERM�#0,TERM_FLG-PBA(A6) TERM_FLG:ŠDC.Wƒ0’TERMINATION�FLAG0*œWILL�CONTAIN�THE�APPROPRIATE�TERMINATION�VALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*O*------------------------------------------------------------------------------* C_COUNTS: ŠCLR.L‚D0ŠMOVE.W�(A1),D0*œD0=VALUE�TO�CONVERT ŠMOVE.L�#4,D1 *œD4=NBR�OF�POSITIONS�TO�CONVERT ŠBSR„BINDECFJ*œPERFORM�CONVERSIONŠRTS*O*------------------------------------------------------------------------------*Z_FILL:ŠMOVE.B�#$0,(A3)+ ŠSUB.B‚#1,D0 ŠBNE.S‚Z_FILL$*œCHARACATER�FILL�SPECIFIED�LOCATIONŠRTSŠPAGE***’ERROR�MESSAGE�CALLING�ROUTINE**ˆCALL†BSR‡C_EM_PGM**ˆINPUT!*’D0�=�AS�RETURNED�FROM�TRAP�CALL,*’D1�=�USER�LOGICAL�UNIT�NUMBER�TO�OUTPUT�TO!*’A0�=�AS�RETURNED�FROM�TRAP�CALL**ˆOUTPUT*’NO�REGISTER�PRESERVATION* EM_XCEPT:ŠDC.Wƒ$0000ŽTABLE�TERMINATOR2*œTHIS�TABLE�IS�USED�TO�DEFINE�EXCEPTIONS�TO�ERROR.*œMESSAGES�THAT�SHOULD�NOT�CAUSE�A�TERMINATION*œVIA�THE�ERROR�CONDITION* C_EM_PGM:ŠLEA„PBA(PC),A6*œA6=PROGRAM�BASE�ADDRESSŠMOVEM.L�D0/A0,EM_PBLK-PBA(A6)+*œSAVE�D0�AND�A0�IN�ERROR�MSG�PARAMETER�BLKŠAND.L‚#$00FF,D0*œISOLATE�ERROR�STATUS�RETURNŠLEA„EM_XCEPT(PC),A00*œA0=ADDR�OF�TBL�CONTAINING�ERROR�MSG�CODES�THAT-*ŸWILL�NOT�BE�CONSIDERED�AS�ERROR�TERMINATION *ŸCONDITIONS CEMP0100: ŠTST.W‚(A0)ŠBEQ.S‚CEMP0200 *œJMP�IF�TABLE�HAS�BEEN�EXAMINEDŠCMP.W‚(A0)+,D0ŠBEQ.S‚CEMP0300'*œJMP�IF�ERROR�CODE�RETURN�IS�ONE�WHICH/*œWILL�RESULT�IN�BEING�AN�EXCEPTION�-�THIS�CASE**œWILL�NOT�BE�CONSIDERED�FOR�AN�ERROR�TYPE *œTERMINATIONŠBRA.S‚CEMP0100 *œREPEAT�LOOP CEMP0200:ŠMOVE.W�#$C000,TERM_FLG-PBA(A6),*œSET�FLAG�TO�TERMINATE�WITH�ERROR�CONDITION CEMP0300:ŠLEA„EM_PBLK(PC),A0&*œA0=ADDR�USER�ERROR�MSG�PARAMETER�BLKŠMOVE.  B�D1,EM_TLUN-EM_PBLK(A0)*œSET�THE�USER�LUN�TO�OUTPUT�TO ŠMOVE.L�#2,D0*œERROR�MSG�PRGM�INPUT�RQMNTŠTRAPƒ#4$*œISSUE�REQUEST�TO�ERROR�MSG�HANDLERŠRTS **ŠPAGE.***********************************************%*ˆCONVERT�BINARY�TO�HEX�ASCII�ROUTINE*(*ˆRIGHT�JUSTIFY�&�BLANK�FILL�ON�THE�LEFT,*ˆTHE�LEAST�SIGNIFICANT�DIGIT�IS�NOT�BLANKED* *ˆD0�=�HEX�VALUE�TO�BE�CONVERTED *ˆD1�=�LENGTH�OF�RECEIVING�FIELD7*ˆA0�=�ADDRESS�OF�LEFT�MOST�POSITION�OF�RECEIVING�FIELD*.***********************************************(BINASC„DC.Bƒ'0123456789ABCDEF'�HEX�TABLE* BINHEX„EQU„*ŠLEA„BINASC(PC),A1ŠINIT�ADDRŠLEA„0(A0,D1),A2ˆEND�LOCATION*BINLOP„MOVE.B�D0,D3ŽGET�BYTE%ŠASR.L‚#4,D0ŽSHIFT�OFF�LAST�HEX�VALUE!ŠAND.L‚#$F,D3�MASK�OFF�OTHER�BITS2ŠMOVE.B�0(A1,D3),-(A2)…MOVE�FROM�TABLE�TO�REC�AREAŠCMP.L‚A2,A0ŽARE�WE�DONEŠBLT„BINLOP�NO*ŠCMP.W‚#1,D1ŽONLY�1�CHARŠBEQ.S‚BINOUT�YES**ˆDO�ZERO�SUPPRESSION*ŠLEA„0(A0,D1),A2ˆINIT�END�LOCŠSUB.L‚#1,A2ŽFIX�END�LOC!BINSP…CMP.B‚#'0',(A0)ŠASCII�ZERO?ŠBNE.S‚BINOUT�NO�GET�OUT%ŠMOVE.B�#'�',(A0)+‰REPLACE�WITH�BLANKŠCMP.L‚A0,A2ŽARE�WE�DONE ŠBGT„BINSPŽNO**BINOUT„RTS—.�RETURN*ŠPAGE*-*********************************************+*‚32�BIT�BINARY�TO�DECIMAL�ASCII�SUBROUTINE-**********************************************,*‚CONVERTS�BINARY�IN�D0�AND�PUTS�ASCII�DIGIT(*…CHARACTERS�AT�ADDRESS�SPECIFIED�IN�A0.(*…LEADING�ZEROS�ARE�CONVERTED�TO�SPACES.+*…THE�FIELD�LENGTH�(NO.�CHARS)�IS�SPECIFIED *…IN�D1�IN�THE�CALLING�SEQUENCE.**‚CALLING�SEQUENCE:!*…MOVE.L�,�D0*…MOVE.L�,D11*…MOVE.L�,A0*…BSR�BINDECFJ* *‚RETURNS:*…D0�=�0�=>GOOD�CONVERSION**‚REGS�USED:‚0�1�2�3�4�5�6�7 *Š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�LENGTHŠLEA„TENS(PC),A1ŒSTART�OF�TABLE"ŠADD.L‚D2,A1ŽADJUST�FOR�DIFFERENCE&ŠMOVE.W�#'‚',D2‹INITIALIZE�ACCUMULATOR%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‚#'‚',D2‹LEADING�ZERO�TEST!Š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*Š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 ƒ=ARG�CREF.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 ƒ=ARG�CREF.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�-�March�1983¶}6{�This�program�will�print�a�cross-reference�listing:—}#{�=cref�P1,P2,P3;K,Z=??,L,M='x-y'ª}{Ê} {ƒWhereÂ}>{‰P1�is�a�file�containing�symbol�names�(max�length�if�string‡}{Œlength�defined�in�symtype).£}{Ê}?{‰P2�is�a�file�containing�a�list�of�file�names�(max�length�is†}%{Œstring�length�defined�in�strtype.�}{Ê}&{‰P3�is�listing�file�or�device�name.Ÿ}{Ê}<{‰Option�'K'�is�used�to�cause�the�cref�program�to�find�the‰}<{‹occurrance�of�a�string�whether�it�is�upper�or�lower�case‡}<{‹letters.‚If�option�'K'�is�not�included,�cref�will�search†}6{‹for�the�string�as�it�was�entered�into�the�P1�file.�}{Ê}@{‰Option�'L'�will�cause�the�line�image�where�a�match�was�found…}?{‹to�be�printed�along�with�the�line�number�of�the�line�in�the„}={‹file.‚If�option�'L'�is�not�included,�only�the�line�number…}{‹will�be�displayed.­}{Ê}>{‰Option�'M=x-y'�allows�one�to�define�left�and�right�margins‡};{‹(horizontal�range)�within�the�source�file.‚Here�x�would‡};{‹be�an�integer�specifying�the�left�margin�and�y�would�beˆ}:{‹an�integer�specifying�the�right�margin.‚XREF�will�onlyˆ}>{‹search�within�the�boundaries�for�a�match.‚If�not�specified„}<{‹the�default�value�for�x�is�1�and�the�default�value�for�y‡} {‹is�80.¹}{Ê} {ƒExample:¿}!{ŒP1�may�contain�the�following:¡} {‘'DOG'´} {‘'CAT'´} {‘/HORSE'S/°} {‘'PIG'´}<{ŒNote:�Only�one�symbol�name�per�line.‚Symbol�delimeter�is…}4{”the�first�non-blank�character�found�on�the�line.†}{Ê}!{ŒP2�may�contain�the�following:¡} {’ZIP.SA²} {’ZAPPER.CF¯} {’FARM.LS±}:{ŒNote:�The�file�names�must�be�one�to�a�line�and�must�beˆ}{”the�only�thing�on�the�line.›}{Ê}.{ŒP3�may�contain�#PR�or�CROSS.LS�for�example”}{Ê}F{�Because�the�cross�reference�list�is�maintained�entirely�in�memory,‡}E{ƒa�'Z='�option�may�need�to�be�specified�if�the�symbol�or�file�list†}{ƒis�very�large.¹}{Ê}«7´e¼fÄiÌcÔkÜL{--------------------------------------------------------------------------}{Ê}1{$S=51200ŒSet�the�size�of�the�stack�heap�to�50K‘}{Ê}L{**************************************************************************} $CONST�linemax…=‚60;Œ{lines�per�page})†linesize„=‚80;Œ{line�size�in�characters} TYPE‚strtype…=‚STRING[30];†symtype…=‚STRING[10];†str80‡=‚STRING[linesize];†integer2„=�-32768..32767;6†options…=�ARRAY['A'..'Z']�OF�integer2;ƒ{option�array} †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;ƒIF�linecnt�>�linemaxƒTHEN†BEGIN†page(outfil);†writeln(outfil);†writeln(outfil);†linecnt�:=�2;†END;ƒEND; PROCEDURE getsym(VAR s:symtype);ƒBEGIN ƒc�:=�'�';,ƒWHILE�(NOT�eoln(symnames))�AND�(c�=�'�')�DO*†read(symnames,c);™{find�symbol�delimeter} ƒs�:=�'';/ƒread(symnames,c2);›{first�character�of�symbol}ƒWHILE�c�<>�c2�DO†BEGIN,†s�:=�concat(s,c2);˜{task�new�symbol�to�end}†read(symnames,c2)†ENDƒEND;�{getsym} 3FUNCTION deconv(VAR i:integer; str:str80): integer;ƒVARƒj:�integer; ‰q:�boolean;ƒBEGINƒj�:=�0; ƒq�:=�false;ƒWHILE�NOT�q�DO†BEGIN†q�:=�i=length(str)+1; †IF�NOT�q†THEN‰BEGIN!‰q�:=�NOT�(str[i]�IN�['0'..'9']); ‰IF�NOT�q‰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,'Command�line�=�',cline);breakcheck;ƒi�:=�pos(cline,'M='''); ƒIF�i�<>�0ƒTHEN†BEGIN †i�:=�i+3;†left�:=�deconv(i,cline);†right�:=�deconv(i,cline);†END;ƒshead�:=�nil;ƒfhead�:=�nil; ƒtptr‚:=�nil;ƒfrefhead�:=�nil;ƒif�not�eof(symnames)ƒthen†BEGIN'†writeln(output,'processing�symbols:');2†writeln(outfil,'processing�symbols:');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;ƒWHILE�NOT�eof(symnames)�DO†BEGIN †new(tptr);+†getsym(tptr^.sym);’{�fill�in�symbol�name�}†readln(symnames);†writeln(output,tptr^.sym);&†writeln(outfil,tptr^.sym);breakcheck;.†pptr^.sptr�:=�tptr;‘{�link�into�symbol�list�}†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];†{for�reading�line�from�file}†psptr„:‚^srec;†pfptr„:‚^frec;†ofptr„:‚^frec;†plptr„:‚^lrec;†olptr„:‚^lrec;$†lcnt…:‚integer;Š{file�line�counter}†spos…:‚integer;†q2‡:‚boolean; 6ƒPROCEDURE�insert(VAR�sym:�symtype;�VAR�head:�symptr);ƒVARƒptr1�:�symptr;ƒBEGIN�{insert}ƒIF�head�=�nilƒTHEN†BEGIN †new(head);†head^.ptr�:=�nil;†head^.sym�:=�sym;†ENDƒELSE†BEGIN†ptr1�:=�head;†WHILE�ptr1^.ptr�<>�nil�DO‰ptr1�:=�ptr1^.ptr;†new(ptr1^.ptr);†ptr1^.ptr^.ptr�:=�nil;†ptr1^.ptr^.sym�:=�sym;†END;ƒEND;�{insert} 7ƒPROCEDURE�insertf(VAR�fym:�strtype;�VAR�head:�filptr);ƒVARƒptr1�:�filptr;ƒBEGIN�{insertf}ƒIF�head�=�nilƒTHEN†BEGIN †new(head);†head^.ptr�:=�nil;†head^.fil�:=�fym;†ENDƒELSE†BEGIN†ptr1�:=�head;†WHILE�ptr1^.ptr�<>�nil�DO‰ptr1�:=�ptr1^.ptr;†new(ptr1^.ptr);†ptr1^.ptr^. ptr�:=�nil;†ptr1^.ptr^.fil�:=�fym;†END;ƒEND;�{insertf} ƒBEGIN�{process}+ƒwriteln(output,'Processing�file:‚',fname);6ƒwriteln(outfil,'Processing�file:‚',fname);breakcheck;ƒreset(fil,fname); ƒlcnt�:=�0;ƒWHILE�NOT�eof(fil)�DO†BEGIN†readln(fil,strbuff);,†strbuff�:=‚copy(strbuff,left,right-left+1); †strbuff�:=�concat(strbuff,'�');†lcnt�:=�lcnt+1;†psptr�:=�shead;†pfptr�:=�psptr^.fptr;†{�check�line�for�symbol�}†WHILE�psptr�<>�nil�DO‰BEGIN‰IF�opts['K']�<>�0‰THEN0Œspos�:=�pos(upper1(strbuff),upper2(psptr^.sym))‰ELSE!Œspos�:=�pos(strbuff,psptr^.sym); ‰IF�spos�<>�0‰THENŒBEGIN�{�found�a�match�}Œinsertf(fname,frefhead);)Œwriteln(output,'ˆ','found�',psptr^.sym);Œpsptr^.ref�:=�true;Œofptr�:=�pfptr; Œq2�:=�false;ŒWHILE�NOT�q2�DO�BEGIN�q2�:=�pfptr�=�nil; �IF�NOT�q2�THEN’BEGIN’ofptr�:=�pfptr;’q2�:=�pfptr^.fil�=�fname; ’IF�NOT�q2’THEN1•pfptr�:=�pfptr^.fptr;ƒ{�link�to�next�file�name�}’END; �END;�{WHILE}ŒIF�pfptr�=�nilŒTHEN�BEGIN �new(pfptr);1�pfptr^.fil�:=�fname;Š{�new�file�name�insertion�}�pfptr^.fptr�:=�nil;�pfptr^.lptr�:=�nil;�IF�ofptr�=�nil�THEN4’psptr^.fptr�:=�pfptr‡{�link�file�record�onto�list�}�ELSE’ofptr^.fptr�:=�pfptr; �END;�{THEN}ŒIF�pfptr^.lptr�=�nilŒTHEN�BEGIN0�new(pfptr^.lptr);�{�link�on�first�line�number�}�pfptr^.lptr^.lptr�:=�nil;�pfptr^.lptr^.lnum�:=�lcnt;�ENDŒELSE�BEGIN6�plptr�:=�pfptr^.lptr;‰{�find�place�to�link�line�nbr�}�WHILE�plptr�<>�nil�DO’BEGIN’olptr�:=�plptr;’plptr�:=�plptr^.lptr;’END;+�new(plptr);“{�link�on�non-first�line�nbr�}�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;‰WHILE�llptr�<>�nil�DOŒBEGINŒIF�llptr^.lnum-2�<�0ŒTHEN(�reset(fil)‘{1st�record�is�what�we�want}ŒELSE7�i$pos(llptr^.lnum-2,fil);‚{we�want�other�than�1st�rec}Œ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,'Cross�reference�being�produced');#ƒlspace�:=�(colcnt-26)�DIV�(lsize);ƒlinecnt�:=�linemax+1; ƒbreakcheck;=ƒwriteln(outfil,'symbolˆ','fileŠ','line�numbers');breakcheck;ƒlsptr�:=�shead;ƒWHILE�lsptr�<>�nil�DO†BEGIN†writeln(outfil);breakcheck;A†writeln(outfil,'‚',lsptr^.sym);breakcheck;„{�write�symbol�name�}†lfptr�:=�lsptr^.fptr;†WHILE�lfptr�<>�nil�DO‰BEGIN7‰writeln(outfil,'Ž',lfptr^.fil);breakcheck;�{file�name}‰llptr�:=�lfptr^.lptr;‰IF�opts['L']�=�0‰THEN ŒBEGIN™{'L'�option�NOT�selected}ŒWHILE�llptr�<>�nil�DO�BEGIN�write(outfil,'œ');�i�:=�1;)�WHILE�(i�<=�lsize)�AND�(llptr�<>�nil)�DO’BEGIN’IF�llptr�<>�nil’THEN•BEGIN"•write(outfil,llptr^.lnum:lspace);•llptr�:=�llptr^.lptr; •i�:=�i�+�1; •END;�{THEN}’END;�{WHILE�i�<=�lsize}’writeln(outfil);breakcheck;�END‚{WHILE�llprt�<>�nil} ŒEND�{THEN}‰ELSE Œlprocess;•{'L'�option�selected}‰lfptr�:=�lfptr^.fptr;‰END;�{WHILE�lfptr�<>�nil}†lsptr�:=�lsptr^.sptr;†END;�{WHILE�lfstr�<>�nil}ƒwriteln(outfil);breakcheck; ƒq�:=�false;ƒlsptr�:=�shead;ƒWHILE�lsptr�<>�nil�DO†BEGIN†IF�NOT�lsptr^.ref†THEN‰BEGIN ‰IF�NOT�q‰THENŒBEGIN Œq�:=�true;:Œwriteln(outfil,'Non-referenced�symbols�are:');breakcheck;Œwriteln(outfil);breakcheck;Œp$setdiag(16#1000+1);ŒEND;'‰writeln(outfil,lsptr^.sym);breakcheck;‰END;†lsptr�:=�lsptr^.spt r;†END; ƒIF�NOT�qƒTHEN:†writeln(outfil,'All�symbols�were�referenced');breakcheck;ƒwriteln(outfil);breakcheck;ƒreset(filenames); ƒq2�:=�false;ƒreadln(filenames,tsym); ƒq3�:=�false;ƒWHILE�NOT�q3�DO†BEGIN†q3�:=�eof(filenames);†symp�:=�frefhead; †q�:=�false;†WHILE�NOT�q�DO‰BEGIN‰IF�symp�=�nil‰THENŒBEGIN Œq�:=�true; ŒIF�NOT�q2ŒTHEN�BEGIN �q2�:=�true;8�writeln(outfil,'Non-referenced�files�are:');breakcheck;�writeln(outfil);breakcheck;�p$setdiag(16#1000+1);�END;!Œwriteln(outfil,tsym);breakcheck;ŒEND‰ELSEŒIF�symp^.fil�=�tsymŒTHEN �q�:=�trueŒELSE�symp�:=�symp^.ptr‰END; †IF�NOT�q3†THEN‰readln(filenames,tsym);†END; ƒIF�not�q2ƒTHEN8†writeln(outfil,'All�files�were�referenced');breakcheck; ƒEND;�{list}  BEGIN {main} initialize;WHILE NOT eof(filenames) DOƒBEGINƒreadln(filenames,fname);ƒi�:=�1;ƒWHILE�i�<=�length(fname)�DO†IF�fname[i]�=�'�'�THEN‰fname�:=�delete(fname,i,1)†ELSE ‰i�:=�i+1;†IF�fname�<>�''�THEN‰process(fname);ƒEND;list;END.ééééééé†PAGE***…CRTEDIT�DATA�SECTION* SECTION 0*DATASG EQU * START OF DATA SEGMENT/SECTION*'*‚RESERVE�MEMORY�FOR�UNINITIALIZED�DATA*$�DC.B�'022285�4'„Revision�Identifier DS.B DATASGL-8**,*‚SET�INITIALIZED�DATA�THE�WAY�IT�WAS�MAPPED* *‚SRCDBS:‚DC.L�0* *‚LRECRD: DC.L 0* *‚STKPTR: DC.L 0* *‚EXBSEG:�DC.L�0†TASK�NAME 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/CLOSE�SCRATCH�FILE�PARAMETER�BLOCK�FOR�FHS�CALLS*‡DC.L�0�FHSCMD,�FHSOPT DC.B 0 STATUS DC.B 0 LUN2†DC.L�'„'�TEMPORARY�FILE�VOLUME�(TEMPORARY�VOLUME) DC.W -1 USER NUMBER�DC.L�'„'�CATALOG �DC.L�'„'�DC.L�'&ƒ'�TEMPORARY�FILE�NAME �DC.L�'„'�DC.W�'‚'�EXTENSION�DC.W‚0�RESERVED DC.W 0 WRITE/READ CODE) DC.W VRLFIL VRL FILE (RECORD LENGTH = 0) DC.B 0 RESERVED†DC.B�KEYSIZ�KEY�SIZE!�DC.W�DEFSIZ‚FAB,�DATA�BLOCK�SIZE1‡DC.L�FMSDBA�START�OF�SHARED�DATA�BUFFER�(FMSDBS)% ‡DC.L�0�END�OF�SHARED�BUFFER�(FMSDBE) DC.L 1 SEGMENT NAME PAGE*!FMSPKT‚DS.B‚22†FMS�COMMAND�PACKET)FMSFILES‚DS.B‚52„FMS�QUALIFIED�FILE�NAMES$FMSOPT„DC.B‚0…FMS�OUTPUT�FILE�OPTION*+*�FMSOTRTN‚CONTAINS�OPTION�BIT�MAP�FOR�OPEN**‚FMSOPT�IS�AVAILABLE�FOR�FUTURE�ADDITIONS.*‚BIT�MAP�AS�FOLLOWS:�$1=DEFAULT�RECORD�FORMAT*–$2=SEQUENTIAL�FORMAT*–$4=INDEXED�FORMAT,*–$8=K�OPTION,NO�CHANGES�ALLOWED�TO�THE�FILE*–$10=NO�LINE�NUMBERS/*„$11=DEFAULT,NO�LINE�#'S,DEFAULT�RECORD�FORMAT*5FMSOTRTN‚DC.B�$11„FMS�OUTPUT�FILE�RETURN�(NEW�OR�OLD)ŠDS.W‚1…NOT�USED�NOW**"INBUF‚DS.B‚CRTLEN‚CRT�INPUT�BUFFER4FMSDATA�EQU‚INBUF+CRTDATA…ADDRESS�OF�FMS�DATA�RECORD$OUTBUF‚COMLINE‚250ƒCRT�OUTPUT�BUFFER1CMDBUF‚EQUƒOUTBUF…INPUT�COMMAND�BUFFER�FOR�LOADER)PROCBUF�DS.B�$60‰PROCEED�I/O�INPUT�BUFFER.CRTLNG‚DC.L‚0ŠLENGTH�OF�PACKET-RETURNED�BY�IOS>CHKPCT�DC.W�0‹COUNT�#�OF�FILE�UPDATES�FOR�OCCAS.�CHECKPOINTING*CRFLAG�DC.B�0‹FLAGS�USED�BY�CRTLS�AND�PAGETRUN DC.B 0 TRUNCATE FLAG*äUíGõIýMA CV9%<->5V=-*ˆBIT�FLAGS�FOR�CRFLAG�(CARRIAGE�RETURN�FLAG)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‚*…CRTIOS�PARAMETER�BLOCK ˆDC.W‚0,0ˆDC.B‚0,CRTLUN,0,0ˆDC.L‚0,0,0,0,0,03EDITVOLN‚DC.L‚0„VOLUME�NAME„INITIAL�REGISTER�VALUES3EDITUSER‚DC.W‚0†USER�NUMBER‚INITIAL�REGISTER�VALUES2EDTCAT‚DC.L‚0‡CATALOG�NAME‚INITIAL�REGISTER�VALUES3EDTCAT1�DC.L‚0‡CATALOG�NAME‚INITIAL�REGISTER�VALUES3EDITLUNƒDC.L‚0…LUN�FROM�SCT‚INITIAL�REGISTER�VALUES*IMESS1‚DC.B‚'VERSAdos�EDITOR‚RELEASE‚4.40'IMESS1E‚EQU‚*-1‡DS�0-IMESS2‚DC.B‚'Copyright�1984�by�Motorola�Inc.'IMESS2E‚EQU‚*-1‡DS�0MESSDON‚DC.B‚'EDIT�DONE�'MESSDONE‚EQU‚*-1‡DS�0$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‡DS�0$OUT24‚DC.B‚WRTABS,STRT,LINE24,POSONE‡DC.B‚'MODEŒPAGE^„PAGE'3‡DC.B‚$76,'„LINE^„LINE',$76,'„DUP„SET�TABƒDEL�TAB�'‡DC.B‚ENDOD,0,0‡DS�0 OUTVOLƒDC.L�0OUTUSER‚DC.W�0 OUTCAT‚DC.L�0OUTCAT1 DC.L 0OUTNAME‚DC.L�0OUTNAME1 DC.L 0 OUTEXT‚DC.W�0,ACSMESS‚DC.B‚'ERROR-RETRIEVE�ATTRIBUTES‚D0='ACSMESSC‚DC.L�'„','„'ACSMESSE‚EQU‚*-1!IOSMESS‚DC.B‚'ERROR-IOS�CALLƒD0='IOSMESSC�DC.L�'„','„'IOSMESSE‚EQU‚*-1'RECTOOL DC.B 'RE-INPUT-RECORD TOO LONG'RECTOOLE EQU *-1IOSOUT‚EQU‚*ˆIOS�PARAMTER�BLOCK†DC.W‚2,0‡WRITE�REQUEST,ASCII†DC.B�0 IOLUN�DC.B‚CRTLUN,0,0„STATUS,LUN†DC.L‚0#IOSTART‚DC.L‚0ŠBUFFER�START�ADDRESS!IOEND‚DC.L‚0,0ŠBUFFER�END�ADDRESS…DC.L‚0ŽCOMPLETION�ADDRESS PAGE3****************************************************-*„TERMTBL‚TERMINATING�CODES�RETURNED�BY�CRTIN#*ŒDEFINES�SCREEN�ACTION�TO�BE�TAKEN*„ENTRY�STRUCTURE: *ŠDC.W‚CODE2*ŠDC.W‚OFFSET�INTO�THE�BRANCH�TABLE�FOR�THE�ACTION* *„TERMTBLL:#�BYTES�OF�EACH�ENTRY*7********************************************************)TERMTBL‚EQU‚*‡TERMINATING�CHARACTER�TABLETINSLIN‚DC.W‚$D6ƒINSERT�LINE‰DC.W‚0†INSLINTDELINE‚DC.W‚$D7ƒDELETE�LINE‰DC.W‚1…DELINE‰DC.W‚$0B‚CURSOR�UP�ONE�LINE‰DC.W‚2„UPAROW‰DC.W‚$C2„CURSOR�DOWN�ONE�LINE‰DC.W‚3„DNAROW"‰DC.W‚$DFƒCRT�LINE�SEND-SUB�FOR�CR ‰DC.W‚4„CRTLS‰DC.W‚$0A�LINE�FEED‰DC.W‚5„DNAROW)‰DC.W‚$A0…REVERSE�EDIT�MODE�PAGE<>COMMAND ‰DC.W‚6„FKEY1&‰DC.W‚$A2…SCROLL�SCREEN�FORWARD�1�PAGE ‰DC.W‚7„FKEY3#‰DC.W‚$A3„SCROLL�SCREEN�BACK�1�PAGE ‰DC.W‚8…FKEY4& ‰DC.W‚$A4ƒSCROLL�SCREEN�FORWARD�1�LINE ‰DC.W‚9…FKEY5#‰DC.W‚$A5„SCROLL�SCREEN�BACK�1�LINE‰DC.W‚10„FKEY6‰DC.W‚$C1ˆCURSOR�UP�1�LINE‰DC.W‚2…UPAROW‰DC.W‚$C0ˆHOME�CURSOR ‰DC.W‚11‰HOME‰DC.W‚$D8‚HOME�CURSOR ‰DC.W‚11ƒHOME‰DC.W‚$D9…SEND�PAGE�CODE3‰DC.W‚12„PAGE-CARRIAGE�RETURN�AT�END�OF�SCREEN�PAGE‰DC.W‚$AA…SET�TAB�STOP‰DC.W‚13…FKEY11‰DC.W‚$AB…DELETE�TAB�STOP‰DC.W‚14‡FKEY12TERMTBLE‚EQU‚*„END�OF�TABLE4TERMTBLL‚EQU‚4ƒNO.�OF�BYTES�OF�EACH�TERM�TABLE�ENTRYˆPAGE9**********************************************************'*…CMDTBL1‚TABLE�OF�1�CHARACTER�COMMANDS(*ŽRECOGNIZED�DURING�COMMAND�MODE�EDITING**„ENTRY�STRUCTURE:*ŽDC.W‚VALID�COMMAND-UPPER�CASE*ŽDC.W‚VALID�COMMAND-LOWER�CASE'*ŽDC.W‚COMMAND�OFFSET�INTO�BRANCH�TABLE$*„CMDTBL1L:#BYTES�FOR�EACH�ENTRY�(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ƒ<<<<<�PSG�>>>>>‰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…#�BYTES�PER�ENTRY PAGE;************************************************************'*ƒCMDTBL4‚TABLE�OF�4�CHARACTER�COMMANDS(*ŒRECOGNIZED�DURING�COMMAND�MODE�EDITING*ƒENTRY�STRUCTURE:*‰DC.L‚VALID�COMMAND-UPPER�CASE*‰DC.L‚VALID�COMMAND-LOWER�CASE/*‰DC.W‚COMMAND�ROUTINE�OFFSET�INTO�BRANCH�TABLE *ƒCMDBL4L:#�BYTES�PER�ENTRY�(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.W�0,'EX',0,'ex'‰EXTEND‰DC.Wƒ8“EXTEND‰DC.W�0,'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: *‚BIT�0:SET�FLAG1�IF�FIELD�EXITS*‚BIT�1:FIELD�REQUIRED#*‚BIT�2:FIELD�REQUIRED�IF�FLAG1�SET,*‚BIT�3:NUMBER�RESULT�SAVED=4�BYTES=BIT�3�ON&*ˆNUMBER�RESULT�SAVED=1�BYTE=BIT�3�OFF*‚BIT�4:2�FIELDS�IN�LISTPB*.*EQUATES FOR MASK BYTE(2ND BYTE IN LIST ENTRY)*NOFLG‚EQU‚0ƒNO�FLAGS�SET$SF1„EQU‚1ƒSET�FLAG1�IF�FIELD�PRESENTREQD 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*8LISTPB�DS.L�10‚LIST�PARAMETER�BLOCK,USED�BY�ALL�COMMANDSA* QUIT LIST PARAMETE R BLOCK STRUCTURE(HI ORDER BIT=1=ENTRY FOUND)*†DS.B�1�ABORT�CHARCTER**QUITL‚DC.B�CHAR,NOFLG�ABORT�CHARACTER('A')‡DC.B�END,NOFLG�END�OF�LIST*$*FIND LIST PARAMETER BLOCK STRUCTURE*(HI ORDER BIT=1=ENTRY FOUND)*�DS.L�1ƒ1ST�VERTICAL�RANGE�**�DS.L�1ƒ2ND�VERTICAL�RANGE *�DS.L�1ƒ1ST�HORIZONTAL�RANGE�** *�DS.L�1ƒ2ND�HORIZONTAL�RANGE�***�DS.B�1ƒTRANSPARENT�CHARACTER)*�DS.B�1ƒCOUNT�OR�$FF�IF�INPUT�WAS�A(ALL)"*�DS.L�1ƒSTART�ADDRESS�OF�STRING�1 *�DS.L�1ƒEND�ADDRESS�OF�STRING�2/*�DS.L�1ƒCOUNT�OR�$FFFFFFFF�IF�INPUT�WAS�A(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ƒ1ST�VERTICAL�RANGEƒ**‚DS.L‚1ƒ2ND�VERTICAL�RANGE *‚DS.L‚1ƒ1ST�HORIZONTAL�RANGE�** *‚DS.L‚1ƒ2ND�HORIZONTAL�RANGE�***‚DS.B‚1ƒTRANSPARENT�CHARACTER*‚DS.B‚1ƒCOUNT�OR�$FF�IF�'ALL'"*‚DS.L‚1ƒSTART�ADDRESS�OF�STRING�1 *‚DS.L‚1ƒEND�ADDRESS�OF�STRING�1"*‚DS.L‚1ƒSTART�ADDRESS�OF�STRING�2 *‚DS.L‚1ƒEND�ADDRESS�OF�STRING�2$*‚DS.L‚1ƒCOUNT�OR�$FFFFFFFF�IF�'ALL'6*ˆ*ƒIF�'*'�FOUND�BIT�30�WILL�BE=1�AND�ALL�OTHER�BITS=04*ŒIF�MINUS�SIGN�FOUND�BIT�30=1�AND�A�POSITIVE�NUMBER*ŒIN�OTHER�BITS@*‡**ƒIF�AN�'F'�FOUND�BIT�30=1�AND�A�NUMBER�IN�THE�LOW�ORDER�BITS*"CHGL‚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+SF1‚TRANSPARENT�CHARACTER†DC.B‚';',NOFLG†COUNT�DELIMITER/†DC.B‚CNT,REQD+SF1ƒCOUNT(OCCURENCE)�OR�'A'(ALL)$†DC.B‚SWD,IF1ˆSTRING�WITH�DELIMITERS&†DC.B‚SWD,NOFLG†STRING�WITH�DELIMITERS,†DC.B‚CNT,LONG‡COUNT(REPETITION)�OR�'A'(ALL)†DC.B‚END,NOFLG†END�OF�LIST*'*ƒDELETE�LIST�PARAMETER�BLOCK�STRUCTURE*ƒSAME�RULES�AS�FIND�AND�CHANGE**‚DS.L‚1�1ST�VERTICAL�RANGE*‚DS.L‚1�2ND�VERTICAL�RANGE*‚DS.L‚1�1ST�HORIZONTAL�RANGE*‚DS.L‚1�2ND�HORIZONTAL�RANGE*"DELL‚DC.B‚NDN,NOFLG‚VERTICAL�RANGE-†DC.B‚':',TWO+LONG‚HORIZONTAL�RANGE�DELIMITER†DC.B‚NDN,REQD…HORIZONTAL�RANGE†DC.B‚END,NOFLG„END�OF�LIST*'*‚EXTEND�LIST�PARAMETER�BLOCK�STRUCTURE*‚SAME�RULES�AS�FIND�AND�CHANGE**‚DS.L‚1‚1ST�VERTICAL�RANGE*‚DS.L‚1‚2ND�VERTICAL�RANGE *‚DS.L‚1‚START�ADDRESS�OF�STRING*‚DS.L‚1‚END�ADDRESS�OF�STRING*#EXTNL‚DC.B‚NDN,NOFLG‚VERTICAL�RANGE%‡DC.B‚SWD,REQD‚STRING�WITH�DELIMITERS‡DC.B‚END,NOFLG‚END�OF�LIST*&*‚RANGE�LIST�PARAMETER�BLOCK�STRUCTURE*‚SAME�RULES�AS�FIND�AND�CHANGE**‚DS.L‚1‚1ST�VERTICAL�RANGE*‚DS.L‚1‚2ND�VERTICAL�RANGE*‚DS.L‚1‚1ST�HORIZONTAL�RANGE*‚DS.L‚1‚2ND�HORIZONTAL�RANGE*RANGL‚EQUƒDELL*†DC.B‚NDN,NOFLG‚VERTICAL�RANGE.*†DC.B‚':',TWO+LONG‚HORIZONTAL�RANGE�DELIMITER *†DC.B‚NDN,REQD‚HORIZONTAL�RANGE*†DC.B‚END,NOFLGƒEND�OF�LIST*$*‚TAB�LIST�PARAMETER�BLOCK�STRUCTURE*!*„DS.B�20„TAB�STOP�COLUMNS,20�MAX-*„DS.B�1…TAB�STOP�CHARACTER�A-C-F-P�TAB�STOPS*$TABL‚DC.B‚NCN,NOFLG„TAB�STOPS,20�MAX*†DC.B‚CHAR,NOFLGƒTAB�STOP�CHARACTER,1�BYTE†DC.B‚END,NOFLG„END�OF�LIST***‚DUPLICATE�LIST�PARAMETER�BLOCK�STRUCTURE**‚DS.L�1�1ST�VERTICAL�RANGE*‚DS.L�1�2ND�VERTICAL�RANGE*"DUPL‚DC.B‚NDN,NOFLG‚VERTICAL�RANGE†DC.B�END,NOFLGƒEND�OF�LIST*&*‚MERGE�LIST�PARAMETER�BLOCK�STRUCTURE**‚DC.L‚1�1ST�VERTICAL�RANGE*‚DC.L‚1�2ND�VERTICAL�RANGE"*‚DC.L‚1�START�ADDRESS�OF�FILENAME *‚DC.L‚1�END�ADDRESS�OF�FILENAME*#MERGL�DC.B‚NDN,NOFLG�VERTICAL�RANGE†DC.B�FN,REQD�FILENAME†DC.B�END,NOFLG�END�OF�LIST*%*‚MOVE�LIST�PARAMETER�BLOCK�STRUCTURE**‚DS.L�1�1ST�VERTICAL�RANGE*‚DS.L�1�2ND�VERTICAL�RANGE*MOVEL‚EQU‚DUPL*…DC.B�NDN,NOFLG�VERTICAL�RANGE*…DC.B�END,NOFLG�END�OF�LIST*&*‚PRINT�LIST�PARAMETER�BLOCK�STRUCTURE **‚DS.L�1�1ST�VERTICAL�RANGE*‚DS.L�1�2ND�VERTICAL�RANGE%*‚DS.L�1�START�ADDRESS�OF�DEVICE�NAME#*‚DS.L�1�END�ADDRESS�OF�DEVICE�NAME*‚DS.B�1�SPACING�CHARACTER*#PRNTL DC.B NDN,NOFLG VERTICAL RANGE,†DC.B�'#',TWO+LONG�DEVICE�MNEMONIC�DELIMITER†DC.B�SND,REQD‚DEVICE�NAME)†DC.B�CHAR,NOFLG�SPACING�CHAR('D'�OR�'T')†DC.B�END,NOFLG‚END�OF�LIST*%*‚SAVE�LIST�PARAMETER�BLOCK�STRUCTURE**‚DS.L�1�1ST�VERTICAL�RANGE*‚DS.L�1�2ND�VERTICAL�RANGE"*‚DS.L�1�START�ADDRESS�OF�FILENAME *‚DS.L�1�END�ADDRESS�OF�FILENAME*SAVEL�EQU‚MERGL*…DC.B�NDN,NOFLG�VERTICAL�RANGE*…DC.B�FN,REQD�FILENAME*…DC.B�END,NOFLG�END�OF�LIST*(*‚EXTRACT�LIST�PARAMETER�BLOCK�STRUCTURE*(*‚DS.B�1�DELETE�EXTRACT�BUFFER�CHARACTER*EXTRL�EQU‚QUITL1*…DC.B�CHAR,NOFLG�DELETE�EXTRACT�BUFFER�CHAR('A')*…DC.B�END,NOFLG�END�OF�LIST*'*‚INSERT�LIST�PARAMETER�BLOCK�STRUCTURE*‰SCROLL�MODE�ONLY**ƒDC.L�1�COUNT* INSL‚DC.B�CNT,LONG�COUNT(OFFSET)†DC.B�END,NOFLG�END�OF�LIST* *‚LIST�PARAMETER�BLOCK�STRUCTURE*‡SCROLL�MODE�ONLY**‚DS.L�1�1ST�VERTICAL�RANGE*‚DS.L�1�2ND�VERTICAL�RANGE*LISTL EQU DUPL*…DC.B�NDN,NOFLG�VERTICAL�RANGE*…DC.B�END,NOFLG�END�OF�LIST*'*‚VERIFY�LIST�PARAMETER�BLOCK�STRUCTURE*‰SCROLL�MODE�ONLY* *‚DS.L�1�START�ADDRESS�OF�STRING*‚DS.L�1�END�ADDRESS�OF�STRING*,VERL DC.B SND,NOFLG STRING NO DELIMITER(OFF)…DC.B�END,NOFLG�END�OF�LIST4*‚UP�AND�DOWN�COMMAND�LIST�PARAMETER�BLOCK�STRUCTURE*ŠSCROLL�MODE�ONLY**‚DS.L�1�COUNT(OFFSET)*UPDNL EQU INSL*…DC.B�CNT,LONG�4�BYTE�NUMBER*…DC.B�END,NOFLG*4*LIST TABLE FOR PROCESS LIST PARAMETER BLOCK ENTRIES*LISTABLE EQU *+�DC.W�1‚PROCSND-PROCESS�STRING�NO�DELIMITER*�DC.W�2‚PROCNDN-PROCESS�NUMBER�DASH�NUMBER!�DC.W�3‚PROCHAR-PROCESS�CHARACTER�DC.W�4‚PROCNT-PROCESS�COUNT-�DC.W�5‚PROCSWD-PROCESS�STRING�WITH�DELIMITER�DC.W�6‚PROCFN-PROCESS�FILENAME+�DC.W�7‚PROCNCN-PROCESS�NUMBER�COMMA�NUMBER LISTBLND EQU * END OF LIST TABLE#LISTBLNG EQU 2 # OF BYTES PER ENTRY FLAG1 DC.B 0NEGFLAG DC.B 0TABFLAG DC.B 0 PAGETABCNT�DC.B�0ƒ#�TABS�SETTABCNT1 DC.B 08SHRDEL DC.B 0 SHARE DELIMITER FLAG,1=SHARE,0=DON'T SHAREBRANGSW�DC.B�0�RANGE�SWITCH‚-1=HAVE�SAVED�RANGES�FROM�RANGE�COMMAND'LINE‚DC.B‚0‡LAST�CRT�SCREEN�LINE�NUMBER-SVCHG�DS.W�19ƒSAVE�CHANGE�COMMAND�PARA.�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‚EQU�OUTCAT+4‚SAVED�#�RECORDS-CHANGE#FINDSTG�EQU�OUT23…SAVED�FIND�STRING SVTABS‚EQU�IMESS2„SAVE�TAB�STOPS%CHGSTG‚EQU�OUT24ƒSAVED�CHANGE�STRINGS#EXTNDSTG‚DS.B‚80‚SAVE�EXTEND�STRING6SVLINE‚EQU�OUTVOL‚ORIGINAL�FILELINE�FOR�CHANGE�COMMAND3SVCNT‚DC.B�0„SAVE�COUNT�FIELD�FOR�HORIZONTAL�RANGESCNTHR‚DC.B�0ƒSAVE�COUNT�FIELD*RECHR‚DC.L�0‚SAVE�REC�FOR�HORIZONTAL�RANGE7RECNHR‚EQU�OUTUSERƒSAVE�#�RECORDS�FOR�HORIZONTAL�RANGESSVLNG‚DC.B�0‚STRING�LENGTHBRKFLG‚DC.B‚0‚BREAK�FLAG'NOHR‚DC.B�0�NO�HORIZONTAL�RANGES�WANTED@MSLUN�DC.B�0„LUN�FOR�MERGE�AND�SAVE�COMMANDS,-1=NO�LUN�AVAILABLE3*‚HIGH-ORDER�BIT�OF�SVEXT�ON=HAVE�AN�EXTRACT�BUFFER=SVEXT‚EQU�OUTNAMEƒRECORD�#�FOR�EXTRACT,#�RECORDSD�FOR�EXTRACT7VERFLG 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 MODE9SVMULFSW�DC.B�0ƒSAVE�MULTIPLE�FIND�SWITCH,USED�FOR�BREAKSASQPB DC.L 0,0 ASQ PARA BLOCK3†DC.B�5,12„011885‚NEED�LONGER�MSG�LENGTH�FOR�VME120†DC.L�80 †DC.L�0,07ATTEVNT EQU ASQPB BREAK EVENT-LENGTH+CODE,DEVICE,STATUSOPTTBL‚DC.B�'KLSIAFCPE�'ˆPAGE*6*†SCREEN�MESSAGES�FOR�LINE�21�USING�SUBROUTINE�WRTMESS*OUTERR‚DC.B‚'WHAT?�'SNF…DC.B‚'STRING�NOT�FOUND'#LISTERR DC.B 'INTERNAL LIST ERROR 'DELNO‚DC.B‚'ŒLINES�DELETED�'BRKMESS DC.B 'BREAK WAS INPUT 'NOASQ�DC.B�'ASQ�ERROR‚D0='NOASQC�DC.B�'ˆ'NOASQE EQU *-1%NOBRK DC.B 'CANNOT HANDLE BREAKS D0='NOBRKC�DC.B�'ˆ'NOBRKE EQU *-1*BRKABT‚DC.B‚'COMMAND�ABORTED�BY�BREAK�KEY'LINUM DC.B 'CURRENT LINE IS 'LINUMF�DC.B�'ˆ'%MESSNR  DC.B 'DEVICE NOT READY' 012184MESSDB DC.B 'DEVICE BUSY '!NOFILE DC.B 'FILE DOESN''T EXIST'ERRMESS DC.B 'ERROR D0= ',ERRMESSC�DC.B�'ˆ'ƒD0�CODE,FMS�ERROR(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/O�FRAMING�ERROR�'!TRUNMSG DC.B 'TRUNCATED RECORDS 'TRUNMSGE EQU *-1-NOREC‚DC.B�'INVALID�COMMAND-NO�FILE�RECORDS�'LASTMSG�DC.B�'‰IS�LAST�LINE�'(TABMSG‚DC.B�'MAXIMUM�#�OF�TABS�SET�(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†EMPTY�FILE�FLAG,-1=EMPTY*FSTSW‚DC.B‚1‰FIRST�TIME�TO�OLD�FILE�SWITCH"SAVED0‚DC.W‚0‰SAVE�D0�FOR�MESSAGES/TRANS‚DC.B‚0ˆSAVE�TRANSPARENT�CHARACTER�FOR�FMSCOUNT‚DC.B‚0ˆSAVE�COUNT�FOR�FMS+REC‚DC.L„0ˆSAVE�START�LOGICAL�REC�#�FOR�FMS5RECN‚EQU�OUTEXT†SAVE�NUMBER�OF�RECS�TO�SEARCH�FOR�FMS%RADR‚DC.L‚0‰POINTER�TO�STRING�FOR�FMS"REP‚DC.L‚0ŠREPETITION�FIELD�-1=ALL+SVFIND‚EQU�IMESS1„SAVE�FIND�PARAMETER�BLOCK FINDSW‚DC.W‚0‡FIND�STRING�SWITCH!SAVEP‚DC.B‚$20†SAVE�PROMPT�LINE�#"MULFSW‚DC.B‚0‡MULTIPLE�FIND�SWITCH6FILEOPT‚DC.B‚0†FILE�OPTION�FLAG‚1=SEQ�OR�INDEXED�INPUT'SAVSW‚DC.B‚0‰SAVE�FILE�SWITCH�FOR�CLOSE*"BLANKS‚DC.L‚$20202020…ASCII�BLANKSCURCMD‚DC.B‚0…CURRENT�COMMAND&SAVDEL DC.B 0 SAVE 1ST DELIMITER FOUNDDDISABLE‚DC.B‚0,0,$D8,$D2,$8F,0,0„CLEAR�SCREEN,ENABLE�KB,DISABLE�EDITSAVECHG‚DC.B‚0–SAVE�CRTCHG�FLAGAENABLE‚DC.B‚0,0,$8E,$A6,$D8,$90,0,0ƒENABLE�EDIT�MODE,DUP=F7,CLEAR&MAXLINE‚DC.L‚0†NUMBER�OF�LINES�IN�FILE(FILELINE‚DC.L‚0…CURRENT�FILE�LINE�NUMBER8TOPLINE‚DC.L‚0†CURRENT�FILE�LINE�NUMBER�AT�TOP�OF�SCREEN%FILETYPE‚DC.B‚0…FILE�TYPE�0=OLD‚1=NEW1CURMODE‚DC.B‚0†CURRENT�MODE�0=COMMAND‚1=PAGE�EDITKBON…EQU…$D2‘ENABLE�KEYBOARDKBOFF„EQU…$D3‘DISABLE�KEYBOARDEMON…EQU…$8E‘ENABLE�EDIT�MODEEMOFF„EQU…$8F‘DISABLE�EDIT�MODEDUP†EQU…$A6‘F7=DUPLICATE�KEY"RTNCMDƒEQU…$90‘RETURN�COMMAND�MODE=SET†DC.B„EMON,DUP,KBON,RTNCMD,0,0,0,0‚SET�INPUT�CONTROL�BYTESSETENDƒEQU…*-1‘LENGTH!LTRANSƒDC.Bƒ$8D,0‰RETRANSMIT�CODELTRANSE‚EQU‚*-1�LENGTH$SCPT�DC.B�'E>'ŒSCROLL�COMMAND�PROMPT SCPTE EQU *-12INSPTƒDC.B�'>',0ˆINSERT�COMMAND�PROMPT,SCROLL�MODEINSPTE EQU *-13TABPRMT�DC.B�'?'ˆSTAB�AND�DTAB�PROMPT�-�SCROLL�MODETABPRMTE EQU *-1ˆDC.B�0ŒTO�BE�EVEN PAGE****************************** FMS ROUTINE DATA AREA*****************************FMSTABLE EQU *‡DC.W�1„FMSOPN-OPEN�COMMAND‡DC.W�2„FMSVCL-CLOSE�COMMAND†DC.W�3…FMSRD-READ�COMMAND†DC.W�4…FMSDEL-DELETE�COMMAND%‡DC.W�5„FMSIRP-INSERT&REPLACE�COMMAND%‡DC.W�6„FMSIRP-INSERT&REPLACE�COMMAND(ˆDC.W�7ƒFMSRCH-SEARCH�FOR�STRING�COMMANDˆDC.W�8ƒFMSPRNT-PRINT�COMMANDƒDC.W‚9‡FMSSAV-SAVE�COMMAND�DC.W�10‰FMSMRG-MERGE�COMMAND�DC.W�11‰FMSMOV-MOVE�COMMAND�DC.W�12‰FMSEXT-EXTRACT�COMMAND.�DC.W�13‰FMSDEXT-DELETE�EXTRACT�BUFFER�COMMAND#�DC.W�14‰FMSCKPT-CHECKPOINT�COMMANDFMSTBLND 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='FMSG30C�DC.B�'ˆ'FMSGE30 EQU *-1&FMSG40 DC.B 'ILLEGAL OUTPUT FILENAME ' ‡DC.B�'�D0='FMSG40C�DC.B�'ˆ'FMSGE40 EQU *-1FMSG50 DC.B 'OPEN ERROR' ‡DC.B�'�D0='FMSG50C�DC.B�'ˆ'FMSGE50 EQU *-1*FMSG55 DC.B 'INVALID KEYSIZE-OUTPUT FILE 'FMSGE55 EQU *-1FMSG60 DC.B 'CLOSE ERROR ' ‡DC.B�'�D0='FMSG60C�DC.B�'ˆ'FMSGE60 EQU *-1‡DC.B�'‚NEW�EXTENSION='FMSG60E�DC.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='FMSG70C�DC.B�'ˆ'FMSGE70 EQU *-1FMSG80 DC.B 'DELETE ERROR' ‡DC.B‚'�D0='FMSG80C�DC.B�'ˆ'FMSGE80 EQU *-1FMSG90 DC.B 'REPLA CE ERROR ' ‡DC.B�'�D0='FMSG90C�DC.B�'ˆ'FMSGE90 EQU *-1FMSG91 DC.B 'INSERT ERROR' ‡DC.B�'�D0='FMSG91C�DC.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‚'SEARCH�FOR�STRING�ERROR�D0=�'FMSG250C‚DC.B‚'ˆ'FMSGE250‚EQU‚*-1/FMSG300‚DC.B�'OUTPUT�FILE�EXISTS-SAVE�NOT�DONE'+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= 'FMSG410C�DC.B�'ˆ'FMSG410E�DC.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 ')FMSG660�DC.B�'‰RECORDS�SAVED-BUFFER�FULL'*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…BUFFER�FOR�1�RECORD�FROM�FILE'EDITBUFE‚EQU‚*„END�OF�1�RECORD‚BUFFER+1* �DS�0ƒ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*+PATCH�DS.B�200‚PATCH�AREA‚<<<<<<�PSG�>>>>>>*SPARE�DC.Bƒ0ƒSPARE�BYTE*TERMINAL�EQU�3�011185*/IOSPB�EQU�*‚PARM�BLK�FOR�CNFG�STATUS�REQ‚011185†DC.L�0,0,0,0™011185†DC.L�0,0,0,0™011185†DC.L�0,0,0,0™011185*$IOCB‚EQU�*‚CONFIGURATION�IOCB‚011185†DC.L�0,0,0,0,0�011185†DC.L�0,0,0,0,0�011185†DC.L�0,0,0,0,0�011185†DC.L�0,0,0,0,0�011185†DC.L�0,0,0,0,0�011185†DC.L�0,0,0,0,0�011185*8CMDARGAD DC.L 0 ADDR OF START OF ARG FOR CMD LINE 011685*„DS.B‚200ƒSTACK�AREA STACK‚EQU‚*ééééé†PAGE †SECTIONƒ8†OPT‚FRS,PCS,MEX,NOCL,A†XREFƒPARSE,EDITFILE †LLEN�120;************************************************************$*†COPYRIGHTED�1982�BY�MOTOROLA,�INC.*†M68000�CRT�EDITOR *†CRTE11.SA*†REV.�A0.50‚11-21-79‚(C313),*†REV.�A1.00ƒ2-13-80‚(C313)�ONE�RECORD�READS*†REV.�A1.00‚RELEASED�3/7/804*†REV.‚1.00‚COMMANDS�FIND�AND�CHANGE�RELEASED�5/1/80-*†REV‚A1.10‚REST�OF�COMMANDS�RELEASED�6/30/80(*†REV‚A1.20‚SCROLL�MODE�RELEASED‚7/11/80)*†REV‚A1.31‚FOR�VERSAdos�RELEASE�2.1�4/81>*†REV‚A2.00‚AFTER�VERSAdos�REL�2.1�ADDING�UP�&�DOWN,TAB�THINGS*†REV‚A2.00‚5/21/81@*†REV‚B2.00‚ADUP,AMOVE,TEST�FOR�TERMINAL�TYPE,SCREEN�I/O=1�WRITE*†REV‚B2.00‚7/15/81(*†REV‚C2.00‚9/30/81�POSITION�INDEPENDENT3*†REVƒ3.00‚11/25/81�EDITOR�FOR�VERSA dos�3.0�RELEASE6*†REVƒ4.00‚8/26/82�EDITOR�FOR�OEM-VERSAdos�RELEASE�4.08*’<<�no�intervening�release�information�present�-�PSG�>>*†REVƒ4.30‚01/27/83‚PS�GILMOUR:'*’1.�Allow�'.'�in�addition�to�'*'�as�in*˜DUP�*-3ƒandƒDUP�.-3,*•Period�is�an�unshifted�key�on�the�EXORterm-*•and�the�VME/10�keyboards�and�is�also�in�the*•same�keyboard�location!0*’2.�Added�'Q'�and�'q'�alias�for�QUIT�command�to3*•match�syntax�for�other�commands�(DUMP,PATCH,etc.)3*’3.�Added�patch�area�just�before�the�stack�area�in*•the�data�section.1*’4.�Changed�copyright�message�to�the�new�format.*ˆREV‚4.4‚12/19/84=*’The�EDITOR�was�checked�and�found�to�be�postion�independent.>*ˆREV‚4.4‚010285�Stopped�EDITOR�from�crashing�when�F�*-1�used.E*ˆREV‚4.4‚010385�Stopped�EDITOR�from�crashing�when�the�EXTEND�command%*’is�used�on�a�full�record.�SPR�1147.C*ˆREV‚4.4‚010485�Fixed�EDITOR�so�that�after�an�unsuccessful�attempt:*’to�change�a�nonexistent�string,�the�LINE�command�outputs5*’the�correct�line�number.‚SPR�1071�(deleted�2�lines)D*ˆREV‚4.4‚010785�Fixed�EDITOR�so�that�horizontal�range�search�works.%*’Deleted�1�line�in�CKHR10.‚SPR�1075.>*ˆREV‚4.4‚011085�EDITOR�would�not�run�on�4.4�release�because�a8*’previously�unchecked�bit�which�was�set�is�now�checked.>E0NV^2f0n4v9~4†3Ž8–3ž1¦3®5¶8¾6Æ3Î9Ö6Þ>æ2î3ö4þ447=6&8.-*’Repaired�the�bit.C*ˆREV‚4.4‚011185�Fixed�EDITOR�so�that�if�a�port�is�configured�for�a8*’foreign�terminal,�the�EDITOR�automatically�comes�up�in*’in�scroll�mode.A*ˆREV‚4.4‚011685�Fixed�EDITOR�so�that�it�can�MERGE�a�file�with�no*’volume�name�given.C*ˆREV‚4.4‚011785�Fixed�EDITOR�so�that�it�does�not�abort�with�a�task>*’dump�request�while�locking�the�keyboard�if�a�user�mistakenly *’types�in�C�n�without�a�string.F*ˆREV‚4.4‚011885�Gave�EDITOR�a�longer�event�receiving�area�and�message%*’length�for�running�on�VERSAdos�4.4.C*ˆREV‚4.4‚011985�Added�code�(CURPSN�routine)�to�display�cursor�line:*’position�on�Line�24�of�screen�between�F1�and�F2�banners.:*’Position�is�automatically�updated�as�cursor�virtual�line*’position�in�file�changes.F*ˆREV‚4.4‚012085�Fixed�MERGE�and�SAVE�commands�to�be�accepted�in�lower;*’case�by�converting�all�lower�case�filenames�to�upper�case<*’filenames.‚The�"merge"�and�"save"�commands�were�already�in>*’the�jump�tables�and�it�was�the�lower�case�filename�which�was*’causing�the�problem.A*ˆREV‚4.4‚012185�SPR#1148�Misspelling�in�DEVICE�NOT�READY�message *’corrected.?*ˆREV‚4.4‚012885�AR#161�Corrected�the�hex�to�ASCII�routine�that8*’converts�the�line�number�for�output.‚Had�to�revise�the7*’code�that�puts�out�the�file�name�at�the�bottom�of�the9*’screen�also,�due�to�expanding�the�output�buffer�for�the8*’larger�ASCII�number�to�be�displayed.‚Had�to�revise�the5*’routine�that�also�puts�out�the�line�number�with�the*’LINE�command.ééA*ˆREV‚4.4‚022285�Previous�change�caused�two�problems:�User�number<*’0�was�not�displayed�in�the�file�name�on�line�21�of�screen;<*’miscellaneous�messages�outputting�line�numbers�had�garbage:*’in�them�due�to�CNVTHA�was�depositting�10�characters�into.*’output�field�instead�of�8.�(8�is�big�enough)*:*†THIS�IS�THE�MAIN�BODY�OF�THE�EDITOR.�IT�DOES�THE�INITIAL9*†SET�UP�OF�FILES�AND�THE�SCREEN.�IT�THEN�WAITS�FOR�INPUT<*†AND�PARSES�IT�WHEN�A�TERMINATING�CHARACTER�HAS�BEEN�TYPED.*B*…*****‚NOTE:�BASE�A DDRESS�OF�THE�DATA�SEGMENT�IS�KEPT�IN�A5�******=*************************************************************$EDITSTRT‚EQU‚*†START�OF�EDIT�PROGRAM7‰LEA�GTADRPB(PC),A0‚GET�ADDRESS�PARAMETER�BLOCK�ADDRESS6‰MOVE.L�#RCVSA,D0„RECEIVE�SEGMENT�ATTRIBUTES�DIRECTIVE!‰TRAP�#1�CALL�EXEC�TO�GET�ADDRESSéééé%‰BEQ.S�EDIT00ˆBRANCH�IF�A�GOOD�RETURN%‰ERQ.TERM‚#0,#$C000‚ERROR�TERMINATIONGTADRPB‚DC.L‚0,0‹TASK,SESSION/‰DC.W‚$2000,0‡RETURN�PHYSICAL�ADDRESS,NO�BUFFER‰DC.L‚'EDTD'ˆSEGMENT�NAME1‰DC.L‚0,0,0‰NO�LOGICAL�ADDRESS�OR�BUFFER�SUPPLIED4EDIT00ƒMOVE.L�A0,A5ˆPHYSICAL�ADDRESS�OF�DATA�SEGMENT5‰LEA‚STACK-DATASG(A5),A7ƒSET-UP�POINTER�TO�STACK�AREA*#*†SAVE�REGISTERS�PASSED�AT�START-UP**ƒMOVE.L‚D2,EDITVOLN-DATASG(A5)‚VOLUME�NAME*†MOVE.W‚D3,EDITUSER-DATASG(A5)„USER�NUMBER)†MOVE.L‚D4,EDTCAT-DATASG(A5)‚CATALOG�NAME2†MOVE.L‚D5,EDTCAT1-DATASG(A5)‚REST�OF�CATALOG�NAME6†MOVE.L‚D7,EDITLUN-DATASG(A5)…LOGICAL�UNIT�NUMBER�MASK(�CLR.B�CHAIN-DATASG(A5)‘CLEAR�CHAIN�FLAG/�CLR.B�SCROLL-DATASG(A5)‘CLEAR�SCROLL�MODE�FLAG*3*ˆSET-UP�SOME�INITIAL�ADDRESSES�IN�THE�DATA�SEGMENT*=‰LEA�CRTIOP-DATASG(A5),A0„PROCEED�I/O�PARAMETER�BLOCK�ADDRESS.‰LEA‚PROCBUF-DATASG(A5),A1‚INPUT�BUFFER�ADRESS‰MOVE.L�A1,IOSRRN(A0)ŠSTORE�IT4‰LEA�EDITBUF-DATASG(A5),A1„GET�OUTPUT�BUFFER�ADDRESS‰MOVE.L�A1,IOSSAD(A0)ŠSTORE�IT/‰LEAƒCRTN(PC),A1�PROCEED�I/O�COMPLETION�ADDRESS‰MOVE.L�A1,IOSCAD(A0)ŠSTORE�IT<‰LEA�IOSOUT-DATASG(A5),A0†GET�I/O�OUTPUT�PARAMETER�BLOCK�ADR+‰LEA�MESSOUTR(PC),A1‹GET�COMPLETION�ADDRESS‰MOVE.L�A1,IOSCAD(A0)ŠSTORE�IT8‰LEA�ASQPB-DATASG(A5),A0‡GET�ASQ�PARAMETER�BLOCK�ADDRESS!‰LEA�BRKSR(PC),A1ŽGET�ASR�ADDRESS‰MOVE.L�A1,14(A0)ŽSTORE�IT**‰CHECK�FOR�CHAIN�MODE*ŠBTST�#0,D7�IN�CHAIN�MODE?)ŠBNE.S�EDIT01�BRANCH�IF�NOT�IN�CHAIN�MODE=ŠMOVE.B�#-1,SCROLL-DATASG(A5)�IN�CHAIN�MODE,FORCE�SCROLL�MODE4ŠMOVE.B�#-1,CHAIN-DATASG(A5)�ALSO�SET�THE�CHAIN�FLAG=ŠMOVE.B�#LDFLUN,IOLUN-DATASG(A5)�USE�LUN�6�FOR�ALL�SCREEN�I/O-ŠCLR.B�BRKFLG-DATASG(A5)‰CLEAR�THE�BREAK�FLAG>EDIT01„LEA�CMDBUF-DATASG(A5),A0„GET�INPUT�COMMAND�LINE�ADDRESS BSR PARSE PARSE IT TST.L D0 CHECK RETURN BMI.S EDIT38 BRANCH IF AN ERROR:�MOVE.L�A1,SAVOTADD-DATASG(A5)‰SAVE�POINTER�TO�OUTPUT�FILE6�MOVE.L�A2,SAVOPTAD-DATASG(A5)‰SAVE�POINTER�TO�OPTIONS-�TST.L�SAVOPTAD-DATASG(A5)�ANY�OPTIONS�INPUT?< BEQ.S EDIT08 BRANCH IF NO,CRTMODE EDITING-SEE IF CHAIN MODEŠPAGE**‰CHECK�FOR�VALID�OPTIONS*(ŠMOVE.L�A2,D2�SAVE�OPTIONS�START�ADDRESS7CK20†LEA�OPTTBL-DATASG(A5),A1�GET�OPTIONS�TABLE�ADDRESS%ŠMOVE.L�#9,D3�NUMBER�OF�VALID�OPTIONS$ŠMOVE.B�(A2)+,D1�GET�AN�INPUT�OPTION&ŠCMPA.L‚A0,A2�AT�END�OF�INPUT�OPTIONS?ŠBGE.SƒCK30‚BRANCH�IF�AT�END)CK10†CMP.B�(A1)+,D1�SEE�IF�A�VALID�OPTIONŠBEQ.S�CK20�BRANCH�IF�VALIDŠSUB.L�#1,D3�DECREMENT�COUNTER#ŠBNE.S�CK10�BRANCH�IF�MORE�TO�CHECK?ŠLEA�OPTMSG- DATASG(A5),A4�INVALID�OPTION�SPECIFED-START�ADDRESS1ŠLEA�OPTMSGE-DATASG(A5),A6�END�ADDRESS�OF�MESSAGE/ŠBRA�EDITSMSG�GO�OUTPUT�MESSAGE�AND�EXIT�EDITOR/CK30†MOVE.L�D2,A2�RESTORE�INPUT�OPTIONS�ADDRESS* 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.ŠLEA�FMSGE20-DATASG(A5),A6�END�MESSAGE�ADDRESS/ŠBRA�EDITSMSG�GO�OUTPUT�MESSAGE�AND�EXIT�EDITORAEDIT39 LEA ACSMESS-DATASG(A5),A4 ERROR IN RETEIVE ATTRIBUTES CALL2ŠLEA�ACSMESSE-DATASG(A5),A6�END�ADDRESS�OF�MESSAGE3ŠLEA�ACSMESSC-DATASG(A5),A3�ADDRESS�FOR�D0�CONTENTS"ŠBSR�GETERR�GO�CONVERT�AND�SAVE�D00ŠBRA�EDITSMSG�GO�OUTPUT�MESSAGE�AND�EXIT�MESSAGE*!*‚SEE�IF�USING�A�NON�EXORTERM-155*,EDIT08 TST.B CHAIN-DATASG(A5) IN CHAIN MODE?<ŠBMI�EDIT10�BRANCH�IF�IN�CHAIN�MODE,DON'T�CARE�WHAT�TERMINAL:‡LEA�IOSPB-DATASG(A5),A0�GET�PB�FOR�CNFG�STATUR�REQ�0111856 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 011185�BNEƒEDIT39�ERROR�RETURN8 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**‚SET�SOFTWARE�PRIORITY*7EDIT09„LEA�ASQPB-DATASG(A5),A0�USE�THIS�PARAMETER�BLOCK,ŠMOVE.L�#24,D0�SET�PRIORITY�DIRECTIVE�NUMBER*ŠMOVE.L�A0,A1�SAVE�PARAMETER�BLOCK�ADDRESS*ŠMOVE.B�#$FF,8(A0)�SET�TO�HIGHEST�PRIORITYŠTRAP�#1�DO�IT!ŠBEQ.S�EDIT07�BRANCH�IF�IT�WORKED)ŠMOVE.L�A0,D0�GET�RETURNED�LIMIT�PRIORITY-ŠMOVE.L�A1,A0�RESTORE�PARAMETER�BLOCK�ADDRESS&ŠMOVE.B�D0,8(A0)�SET�TO�LIMIT�PRIORITY,ŠMOVE.L�#24,D0�SET�PRIORITY�DIRECTIVE�NUMBERŠTRAP�#1�TRY�AGAIN3EDIT07 MOVE.L A1,A0 RESTORE PARAMETER BLOCK ADDRESS1ŠMOVE.B�#5,8(A0)�RESTORE�ENTRY�FOR�GET�ASQ�011085**‚SET-UP�BREAK�STUFF�HERE* 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 TERM3EDIT50�CLR.B�BRKFLG-DATASG(A5)ƒCLEAR�THE�BREAK�FLAGC 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*)*„OUTPUT�INITIAL�EDITOR�MESSAGE�TO�SCREEN*8EDIT10ƒLEA‚IMESS1-DATASG(A5),A4…START�ADDRESS�OF�MESSAGE1…LEA‚IMESS1E-DATASG(A5),A6…END�ADDRESS�OF�MESSAGE)†BSR‚MESSOUTŽOUTPUT�FIRST�LINE�OF�MESSAGE?†LEA‚IMESS2-DATASG(A5),A4ˆSTART�ADDRESS�OF�NEXT�LINE�OF�MESSAGE&†LEA‚IMESS2E-DATASG(A5),A6‡END�ADDRESS*†BSR‚MESSOUT‹OUTPUT�SECOND�LINE�OF�MESSAGE PAGE*1*†INITIALIZE�VARIABLES�AND�HAVE�FMS�OPEN�THE�FILE**†CLR.B�TRUN-DATASG (A5)�CLEAR�TRUNCATE�FLAG3†CLR.B‚EMTYFILE-DATASG(A5)‚TURN�OFF�EMPTY�FILE�FLAG8†CLR.L‚FILELINE-DATASG(A5)‚CURRENT�RECORD�NUMBER�ON�DISK=†CLR.L‚TOPLINE-DATASG(A5)‚CURRENT�RECORD�NUMBER�TOP�OF�SCREEN*†CLR.B‚CURMODE-DATASG(A5)‚SET�COMMAND�MODE5†CLR.W‚CHKPCT-DATASG(A5)‚CLEAR�THE�CHECKPOINT�COUNTER7†LEA‚FMSPKT-DATASG(A5),A0…ADDRESS�OF�FMS�COMMAND�PACKET-†MOVE.B‚#OPENCMD,FMSCMD(A0)…OPEN�FILE�COMMAND&†CLR.B�FMSBRK(A0)�CLEAR�FMS�BREAK�FLAG†BSR‚FMS”GO�OPEN�THE�FILE*†TST.BƒFILETYPE-DATASG(A5)�SEE�IF�NEW�FILE †BNE.S‚EDIT11�BRANCH�IF�NEW�FILE4†TST.LƒMAXLINE-DATASG(A5)‚SEE�IF�EMPTY,-1=EMPTY�FILE!†BPL.S‚EDIT15�BRANCH�IF�NOT�EMPTY*$*…HERE�IF�NEW�FILE�OR�OLD�EMPTY�FILE*=EDIT11ƒMOVE.B‚#-1,EMTYFILE-DATASG(A5)�TURN�ON�EMPTY�FILE�FLAG)‰CLR.B‚FSTSW-DATASG(A5)�FIRST�TIME�SWITCH+‰MOVE.B‚#1,CURMODE-DATASG(A5)‚SET�PAGE�MODE*3*„FIRST�FILE�RECORD�NUMBER�IS�ZERO�OF�EXISTING�FILE* EDIT15‚EQU‚*( TST.B SCROLL-DATASG(A5) IN SCROLL MODE?% BMI EDIT100 BRANCH IF IN SCROLL MODE PAGE*0*†RESET�SCREEN�AND�SET�UP�CRTIOS�PARAMETER�BLACK&*†AND�RECORD�NUMBERS�FOR�SUBSEQUENT�IO*1‡CRT.OUT‚CRTIOS,ENABLE,#6†SET�SCREEN�TO�EDIT�MODEˆBEQ.S‚EDIT20‡BRANCH�IF�OK/EDITERROR‚LEA�STACK-DATASG(A5),A7�RESTORE�STACK‹CMP.B�#$C6,D0�BREAK�CONDITION?‰BEQ‚BREAK�BRANCH�IF�YES‰CMP.B�#ISTADO,D0�DATA�OVERRUN?‰BEQ�DATAOR�BRANCH�IF�YES‰CMP.B�#$E8,D0�FRAMING�ERROR?‰BEQ�DATAOR�BRANCH�IF�YES:‰LEA‚IOSMESS-DATASG(A5),A4„SET�UP�FOR�OUTPUT�ERROR�MESSAGE2‰LEA‚IOSMESSE-DATASG(A5),A6ƒEND�ADDRESS�OF�MESSAGE1‰LEA‚IOSMESSC-DATASG(A5),A3ƒADDRESS�OF�ERROR�CODE‰BSR‚GETERRˆPUT�D0�IN�MESSAGE$‰BRA‚EDITSAV‡OUTPUT�MESSAGE�AND�TERM PAGE*G*‡SET�SCREEN�PROTECTION�FIELDS�AND�WRITE�1ST�20�LINES�OF�FILE�TO�SCREEN*=EDIT20‚MOVE.B‚#LINE20,D0„LINE�20�CODE�FOR�BOTTOM�LINE�DISPLAY1‡BSR‚SETPROPŠSET�SCREEN�PROTECTION-PAGE�EDIT�MODE*‡CRT.OUT‚CRTIOS,OUT23,#80…OUTPUT�FKEY�LINE(‡BNE‚EDITERROR�BRANCH�IF�AN�OUTPUT�ERROR*‡CRT.OUT‚CRTIOS,OUT24,#82…OUTPUT�FKEY�USES(‡BNE‚EDITERROR�BRANCH�IF�AN�OUTPUT�ERROR(†BSR�CLRCOL1‡GO�CLEAR�ALL�LINES,COLUMN�1**…BUILD�OUTPUT�FILENAME�BUFFER*:†LEA�OUT24-DATASG(A5),A2‡USE�THIS�SPACE,WON'T�USE�IT�AGAIN$†ADD.L�#2,A2ˆBUMP�PAST�PART�WILL�USE(†MOVE.B�#LINE21,(A2)+�OUTPUT�LINE�NUMBER'†MOVE.B�#$4E,(A2)+…OUTPUT�COLUMN�NUMBER(†MOVE.L�#14,D7ˆCOUNT�THE�BYTES�OF�OUTPUT+†MOVE.L�OUTVOL-DATASG(A5),(A2)+‚VOLUME�NAME†MOVE.B�#':',(A2)+„DELIMITER?†LEA�OUTBUF-DATASG(A5),A3ˆUSE�OUTBUF�FOR�CONVERTING�USER�NUMBER-†MOVE.W�OUTUSER-DATASG(A5),D0�GET�USER�NUMBER†BSR�CNVTHAˆCONVERT�TO�ASCIIF†LEA�(OUTBUF+4)-DATASG(A5),A3ƒGET�CONVERTED�USER�NUMBER�ADDRESS�022285†MOVE.L�#4,D6†NUMBER�OF�BYTES4EDITB10‚MOVE.B�(A3)+,(A2)+�MOVE�TO�THE�OUTPUT�BUFFER†SUB.L�#1,D6�DECRMENT�COUNTER†BNE.S�EDITB10�BRANCH�TIL�MOVED†MOVE.B�#'.',(A2)+�DELIMITER-†MOVE.L�OUTCAT-DATASG(A5),D6�GET�CATALOG�NAME†CMP.L�#'„',D6ƒIS�IT�BLANK?(†BEQ.S�EDITB20�BRANCH�IF�BLANK,IGNORE�IT"†MOVE.L�D6,(A2)+�NOT�BLANK,SAVE�IT9†MOVE.L�OUTCAT1-DATASG(A5),(A2)+�AND�REST�OF�CATALOG�NAME†ADD.L�#8,D7�COUNT�THE�BYTES#EDITB20 MOVE.B #'.',(A2)+ DELIMITER†MOVE.L�#8,D6�FILENAME�LENGTH+†LEA�OUTNAME-DATASG(A5),A3�FILENAME�ADDRESS4EDITB30 MOVE.B (A3)+,(A2)+ FILENAME TO OUTPUT BUFFER†SUB.L�#1,D6�DECREMENT�COUNTER†BNE.S�EDITB30�BRANCH�TIL�MOVED†ADD.L�#13,D7�ADD�IN�THE�BYTES†MOVE.B�#'.',(A2)+�DELIMITER)†MOVE.W�OUTEXT-DATASG(A5),(A2)+‚EXTENSION$†MOVE.B�#ENDOD,(A2)ƒEND�OF�DATA�CODE6†CRT.OUT‚CRTIOS,OUT24,D7‚GO�OUTPUT�FILE�NAME�TO�SCREEN%†BNE�EDITERROR‡BRANCH�IF�AN�I/O�ERROR,†TST.B‚EMTYFILE-DATASG(A5)‚SEE�IF�EMPTY�FILE1†BMI.S‚EDIT21ˆBRANCH�IF�EMPTY-SCREEN�IS�CLEAR�NOW#‰BSR‚WRTSCRN‰GO�WRITE�ENTIRE�SCREEN+ˆBSR‚HOMECUR‹GO�PUT�CURSOR�AT�HOME�POSITION;EDIT21‚BSR‚SETABS‰SET�DEFAULT�TABS�FROM�COMMAND�LINE,IF�ANY,ˆTST.B�TRUN-DATASG(A5)‚TRUNCATING�THIS�FILE?…BEQ.S�EDIT22�BRANCH�IF�NO6 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)‚CLEAR�SAVE�CHANGE�FLAG:†TST.B‚CURMODE-DATASG(A5)„CHECK�FOR�MODE�-�PAGE�OR�COMMAND#†BNE.S‚EDI T1ŠBRANCH�IF�IN�PAGE�MODE(†BSR„SETPROCˆSET�COMMAND�PROTECTION�MODE!†MOVE.B�#CLRSCRN,D0�CLEAR�LINE�22†BSR‚SEND1‚GO�DO�IT PAGE*'*…PAGE�EDIT�MODE-READ�INPUT�FROM�SCREEN*0EDIT1 MOVE.B #POSONE,D0 SCREEN LINE # FOR PROMPT…BSR�PUTP�POSITION�PROMPTEEDIT2 BSR CURPSN UPDATE CURRENT CURSOR LINE POSITION ON SCREEN 011985#†CRT.IN‚CRTIOS,INBUF,#$60…READ�LINE EDIT6�BNE‚EDITERROR�ERROR�RETURN.†TST.B�BRKFLG-DATASG(A5)‡RETURN�AFTER�A�BREAK?,†BNE‚BREAK„BRANCH�IF�YES,GO�TO�BREAK�ROUTINE:†MOVE.L‚D1,CRTLNG-DATASG(A5)‚SAVE�RETURNED�LENGTH�OF�INPUT†BSR‚CRTMODEˆGO�HANDLE�INPUT$†TST.B�EMTYFILE-DATASG(A5)ƒNEW�FILE?!†BNE.S�EDIT7�BRANCH�IF�A�NEW�FILE3†MOVE.L�MAXLINE-DATASG(A5),D1�GET�#�RECORDS�IN�FILE?†CMP.L�FILELINE-DATASG(A5),D1ƒSEE�IF�CURRENT�REC�BEYOND�MAX�REC!†BGE.S�EDIT7�BRANCH�IF�NOT�BEYOND=†MOVE.L�MAXLINE-DATASG(A5),FILELINE-DATASG(A5)�FORCE�EQUALITY0EDIT7�TST.B�BRKFLG-DATASG(A5)„WAS�A�BREAK�INPUT?†BNE�BREAKŠBRANCH�IF�YES5EDIT5�LEA‚INBUF-DATASG(A5),A1‡ADDRESS�OF�INPUT�BUFFER7EDIT4�CLR.B‚CRTERM(A1)†CLEAR�LAST�TERMINATING�CHARACTER/†CLR.W‚(A1)�CLEAR�FIRST�2�BYTES�OF�INPUT�BUFFER:†CLR.B‚SAVECHG-DATASG(A5)„CLEAR�CHANGE�FLAG�FOR�NEXT�INPUT*†TST.B�CURMODE-DATASG(A5)…IN�COMMAND�MODE?†BNE.S�EDIT2�BRANCH�IF�NO+†MOVE.B�#CLRSCRN,D0�CLEAR�LINE�22�OF�SCREEN†BSR�SEND1�DO�IT"†BRA„EDIT2‹GO�DO�IT�ALL�OVER�AGAIN†PAGE**‡END�OF�EDIT�SESSION*EDITSAV‚LEA‚FMSPKT-DATASG(A5),A0…ADDRESS�OF�FMS�COMMAND�PACKET)†MOVE.B‚#CLOSCMD,FMSCMD(A0)„CLOSE�COMMAND†BSR‚FMS“CLOSE�THE�FILE0EDITDISA TST.B SCROLL-DATASG(A5) IN SCROLL MODE?(‰BMI.S�EDITSMSG�BRANCH�IF�IN�SCROLL�MODE0ŠCLR.L�SAVOPTAD-DATASG(A5)‚CLEAR�ANY�SET�OPTIONS*ŠMOVEM.L�A4-A6,-(A7)…SAVE�MESSAGE�POINTERS!ŠBSR�SETABS�GO�RESET�DEFAULT�TABS-ŠMOVEM.L�(A7)+,A4-A6�RESTORE�MESSAGE�POINTERS%ŠBSR�CLRP“RESET�COL�1�TO�FULL�DISPLAY,ŠCRT.OUT‚CRTIOS,DISABLE,#5†DISABLE�EDIT�MODE#EDITSMSG‚BSR‚MESSOUT�OUTPUT�MESSAGE EDITERM‚ERQ.TERM�#0,#0‡TERMINATE PAGE**‚MAIN�PORTION�OF�SCROLL�MODE* EDIT100 EQU * BSR SETABS SET INITIAL TABS"�TST.B�TRUN-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.B�CURMODE-DATASG(A5)ƒSCROLL�MODE�ALWAYS�IN�COMMAND�MODE$�TST.B�EMTYFILE-DATASG(A5)ŠNEW�FILE? BMI.S EDIT120 BRANCH IF NEW-EDIT110 CRT.IN CRTIOS,INBUF,#CRTLEN GET INPUT BNE EDITERROR ERROR RETURN.�TST.B�BRKFLG-DATASG(A5)ˆRETURN�AFTER�A�BREAK? BNE BREAK BRANCH IF YES2�MOVE.L�D1,CRTLNG-DATASG(A5)„RETURNED�INPUT�LENGTH-�CMP.L�#RECLNG,CRTLNG-DATASG(A5)ƒCAN'T�BE�>79 BGT.S EDIT125 BRANCH IF GREATER" BSR SCROLMOD GO HANDLE THIS INPUT.�TST.L�MAXLINE-DATASG(A5)‰ANY�RECORDS�IN�FILE?- BMI.S EDIT120 BRANCH IF NO,GO TO INSERT MODE2EDIT115�TST.B�BRKFLG-DATASG(A5)‚WAS�A�BREAK�INPUT? 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‚MESSAGE�OUTPUT�SUBROUTINE#*�OUTPUT�A�LINE�TO�SCREEN�USING�IOS$*†ENTRY:‚A4=START�ADDRESS�OF�MESSAGE*ŽA6=END�ADDRESS�OF�MESSAGE*%*†EXIT:ƒA0=ADDRESS�OF�IOS�PARA.�BLOCK**†GOOD�RETURN:�BACK�TO�CALLER*!*†ERROR�RETURN:�EDITERROR�ROUTINE*?**************************************************************** MESSOUT‚EQU‚*B‰MOVE.L‚A4,IOSTART-DATASG(A5)‚START�MESSAGE�ADDRESS�TO�PARA.�BLOCK>‰MOVE.L‚A6,IOEND-DATASG(A5)‚END�MESSAGE�ADDRESS�TO�PARA.�BLOCK'‰MOVE.W‚#2,IOSOUT-DATASG(A5)‚WRITE�CODE1‰LEA†IOSOUT-DATASG(A5),A0†PARAMETER�BLOCK�ADDRESS‰TRAP�#2“OUTPUT�THE�MESSAGE'MESSOUTR‚BNE‚EDITERM‰BRANCH�IF�AN�ERROR‰RTS•RETURN�IF�GOOD‡PAGE?******************** *******************************************7*„SUBROUTINE�CRTMODE---READ�INPUT�TERMINATING�CHARACTER4*„RETURNED�FROM�CRT.IN‚AND�DETERMINE�OPERATION�MODE.;*„CONTROL�IS�RETURNED�TO�THE�EDITOR�BECAUSE�OF�INSERT�LINE,0*„DELETE�LINE,UP�ARROW,DOWN�ARROW,LF-CR,&�FKEYS.:*„CRTCHG�IS�$FF�IF�NO�CHANGE�TO�CURRENT�LINE.�THIS�ROUTINE:*„CHANGES�CRTCHG�TO�00�IF�IT�IS�$FF,OTHERWISE�DOES�NOTHING *„TO�CRTCHG./*†SOME�MODES�GO�TO�READCMD�IF�WE�ARE�IN�COMMAND**†MODE�EDITING�INSTEAD�OF�IN�PAGE�EDITING./*†ALL�PAGE�EDITING�MODES�DO�FILE�CHANGES�BEFORE *†CHANGING�THE�SCREEN,IF�NEEDED.*!*…ENTRY:INBUF�CONTAINS�CRT�PACKET*‹CURMODE:1=PAGE�MODE*“0=COMMAND�MODE1*…EXIT:TO�EACH�OPERATION�MODE,A1=ADDRESS�OF�INBUF%*…ERROR�EXIT:IOS�ERROR-EDITERROR,EXIT*…REGISTERS�USED:ALL*…TABLES�USED:TERMTBL=************************************************************* CRTMODE†EQU‚*3ŠTST.B�MULFSW-DATASG(A5)‰DID�WE�LEAVE�SCREEN�FUNNY?‰BEQ.S�CRTMODE5�BRANCH�IF�NO/‰MOVE.B�#LINE20,D0‚SET�SCREEN�LINE�20�TO�BOTTOM‰BSR‚SETPROPƒGO�SET�PAGE�MODE&‰BSR�WRTSCRN…REOUTPUT�SCREEN�CORRECTLY%‰MOVE.B�#POSONE,D0ƒSCREEN�LINE�NUMBER‰BSR‚PUTP�POSITION�PROMPT'‰BSR‚SETPROC‚PUT�BACK�INTO�COMMAND�MODE?‰CLR.B�MULFSW-DATASG(A5)…TURN�OFF�MULTIPLE�SCREEN�OUTPUT�SWITCH8CRTMODE5�LEA‚INBUF-DATASG(A5),A1…ADDRESS�OF�INPUT�BUFFER.‰CMP.W‚#$DDFF,(A1)ƒFIRST�2�BYTES�MUST�BE�$DDFF1‰BNE�CRTMODER‰BRANCH�IF�NOT,ERROR�IN�INPUT�BUFFER'‰TST.B‚CRTCHG(A1)„SEE�IF�NO�CHANGE($FF)"‰BPL.S‚CRTMODE4†BRANCH�IF�A�CHANGE<‰MOVE.B‚#0,CRTCHG(A1)‚REPLACE�$FF�WITH�00�FOR�NO�CHANGE�FLAG:CRTMODE4�TST.B‚CURMODE-DATASG(A5)„SEE�WHICH�MODE�WE�ARE�IN(†BNE.S‚CRTMODE3ŠBRANCH�IF�PAGE�EDIT�MODE6†MOVE.B‚CRTCHG(A1),SAVECHG-DATASG(A5)ˆSAVE�CHANGE�FLAG&†CLR.B‚CRTCHG(A1)„TURN-OFF�CHANGE�FLAG7†MOVE.B�SAVEP-DATASG(A5),CRTLINE(A1)�USE�LAST�TIME�LINECRTMODE3‚CLR.L�D0�CLEAR�FOR�USE4‚MOVE.B‚CRTERM(A1),D0ƒRETURNED�TERMINATING�CHARACTER=‹LEA‚TERMTBL-DATASG(A5),A0…ADDRESS�OF�VALID�TERM�CHARS.�TABLE4‰LEA�TERMTBLE-DATASG(A5),A2†END�ADDRESS�OF�THE�TABLE'CRTMODE1…CMP.W‚(A0),D0ˆLOOK�FOR�A�MATCH!‹BEQ.S‚CRTMODE2ŠBRANCH�IF�A�MATCH&ŠADD.L‚#TERMTBLL,A0„BUMP�TO�NEXT�ENTRY‹CMP.L‚A2,A0ŠSEE�IF�PAST�TABLE(ˆBLT.S‚CRTMODE1ŠBRANCH�IF�NOT�PAST�TABLE1‹BRA.S�CRTMODER‰BRANCH�TO�ERROR-NOT�A�VALID�CHAR.;CRTMODE2‚MOVE.W‚2(A0),D0…OFFSET�OF�ADDRESS�OF�ROUTINE�TO�DO‰LSL.L�#2,D0‹MULTIPLY�BY�FOUR'‰LEA�BRATBL(PC),A0…BRANCH�TABLE�ADDRESSˆJMP‚(A0,D0)ŽGO�THERE PAGE*%*ˆINVALID�TERMINATING�CHARACTER�FOUND*(CRTMODER‚EQU‚*�ERROR-DIDN'T�FIND�A�MATCH1ŠTST.B�CURMODE-DATASG(A5)�SEE�WHAT�MODE�WE�ARE�IN&ŠBNE.S�CRTMODE7‡BRANCH�IF�IN�PAGE�MODE2ŠLEA�OUTERR-DATASG(A5),A0‚IN�COMMAND�MODE,ASK�WHATŠMOVE.L�#6,D0‡MESSAGE�LENGTH"‰BSR�WRTMESS‰GO�OUTPUT�THE�MESSAGE&CRTMODE6�ADD.L�#4,A7‰RESTORE�THE�STACK‰BRA�EDIT5‹GO�GET�NEXT�INPUT@CRTMODE7 LEA INVCHAR-DATASG(A5),A0 INVALID INPUT MESSAGE ADDRESS‰MOVE.L�#34,D0‡MESSAGE�LENGTH$‰BSR�WRTMESS‰GO�OUTPUT�ERROR�MESSAGE+‰TST.L�MAXLINE-DATASG(A5)�ANY�FILE�RECORDS?*‰BPL.S�CRTMODE8†BRANCH�IF�YES,FILE�RECORDS8‰MOVE.B�#CLRSCRN,D0‚NO�RECORDS,MAKE�SURE�SCREEN�IS�EMPTY‰BSR�SEND1‹GO�CLEAR�THE�SCREEN3‰MOVE.B�#POSONE,SAVEP-DATASG(A5)�FORCE�SREEN�LINE�1‰BRA.S�CRTMODE9†CONTINUE2CRTMODE8�BSR�WRTSCRN‰RE-OUTPUT�SCREEN�AS�I�KNOW�IT7CRTMODE9 LEA OUTBUF-DATASG(A5),A3 OUTPUT BUFFER ADDRESS&‰MOVE.B�#LOADCUR,(A3)+�LOAD�THE�CURSOR1‰MOVE.B�SAVEP-DATASG(A5),(A3)+�TO�LAST�KNOWN�LINE ‰MOVE.B�#COLTWO,(A3)+�COLUMN�TWO!‰BSR�DOOUT‹GO�POSITION�THE�CURSOR‰BRA�CRTMODE6ˆAND�RETURN*;*ˆBRANCH�TABLE�OF�VALID�ROUTINES�FOR�TERMINATING�CHARACTERS* BRATBLƒEQUƒ*‰BRA�INSLINŠINSERT�LINE‰BRA�DELINEŠDELETE�LINE‰BRA�UPAROWŠUP�ARROW‰BRA�DNAROWŠDOWN�ARROW‰BRA�CRTLS‹CARRIAGE�RETURN ‰BRA�DNAROWŠDOWN�ARROW-LINE�FEED(‰BRA�FKEY1‹FUNCTION�KEY�1�-�REVERSE�MODE3‰BRA�FKEY3‹FUNCTION�KEY�3�-�SCROLL�FORWARD�ONE�PAGE4‰BRA�FKEY4‹FUNCTION�KEY�4�-�SCROLL�BACKWARD�ONE�PAGE3‰BRA�FKEY5‹FUNCTION�KEY�5�-�SCROLL�FORWARD�ONE�LINE4‰BRA�FKEY6‹FUNCTION�KEY�6�-�SCROLL�BACKWARD�ONE�LINE$‰BRA�HOMEŒHO ME�KEY�-�HOME�THE�CURSOR1‰BRA�PAGEŒPAGE�-�CARRIAGE�RETURN�AT�END�OF�SCREEN*‰BRA�FKEY11ŠFUNCTION�KEY�11�-�SET�TAB�STOP-‰BRA�FKEY12ŠFUNCTION�KEY�12�-�DELETE�TAB�STOP PAGE5******************************************************-*‚SCROLMODE�SCROLL�MODE�-�SET�CARRIAGE�RETURN%*ŒTO�END�OF�DATA�SO�ALL�COMMANDS�WILL1*ŒWORK.�IF�IN�CHAIN�MODE,A�CARRIAGE�RETURN�IS�NOT1*ŒIN�THE�INPUT�BUFFER,SO�ONE�IS�PUT�AT�THE�END�OF5*ŒTHE�INPUT�BUFFER.�ALSO,THE�COMMAND�IS�OUTPUT�TO�THE!*ŒSCREEN(TERMINAL)�IN�CHAIN�MODE.*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)�MAKE�IT�END�OF�DATA�CODEB 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@*****************************************************************@*†UP�ARROW‚MOVE�CURSOR�AND�PROMPT�UP�1�LINE�WITH�PAGE�WRAPAROUND*†REV�1.00‚12-3-79‚(C313)*†REV�2.00‚7-15-81‚(C313)*†ENTRY:A1=INPUT�BUFFER�ADDRESS'*†USES:�A3=SCREEN�OUTPUT�BUFFER�ADDRESS *†EXIT:�THRU�DELETE�LINE�ROUTINE *†CALLS:�CKREAD�TESTOLD1‚EOFMSG3*Œ0�1�2�3�4�5�6�7 *†REGS:D‚* *‹A‚Pƒ*ƒP?***************************************************************2UPAROW„EQU‚*ŽCURSOR�UP�1�LINE-WITH�PAGE�WRAPAROUND6‰LEA�OUTBUF-DATASG(A5),A3‚SCREEN�OUTPUT�BUFFER�ADDRESS*‰TST.B�CURMODE-DATASG(A5)‚IN�COMMAND�MODE?-‰BNE.S�UPAROW10�BRANCH�IF�NOT�IN�COMMAND�MODE7‰SUB.B�#1,CRTLINE(A1)�COMMAND�MODE,ADJUST�SCREEN�LINE�#+‰CMP.B�#POSONE,CRTLINE(A1)�PAGE�WRAPAROUND?‰BGE.S�UPAROW10�BRANCH�IF�NO>‰MOVE.B�#LINE20,CRTLINE(A1)�PAGE�WRAPAROUND,SET�TO�LAST�LINE�#)UPAROW10 TST.B CRTCHG(A1) A CHANGE TO DO?(‰BEQ.S�UPAROW30�BRANCH�IF�NO�FILE�CHANGE-‰MOVE.B�#1,FSTSW-DATASG(A5)ƒTURN�OFF�NEW�FLAG‰BSR�CKREAD�UPDATE�THE�FILE2UPAROW20 BSR.S TESTOLD1 TURN OFF REST OF NEW FLAGS‰CLR.L�D1�CLEAR�FOR�USE-‰MOVE.B�CRTLINE(A1),D1�GET�SCREEN�LINE�NUMBER"‰CMP.B�#LINE20,D1�PAGE�WRAPAROUND?-‰BEQ.S�UPAROW50�BRANCH�IF�YES,PAGE�WRAPAROUND$‰SUB.B�#POSONE,D1�STRIP�ASCII�OFFSETE‰MOVE.L�TOPLINE-DATASG(A5),FILELINE-DATASG(A5)�DETERMINE�NEW�RECORD�#3‰ADD.L�D1,FILELINE-DATASG(A5)„CURRENT�RECORD�NUMBER"‰BRA�DELINE15�GO�DO�ALL�THE�OUTPUT**ˆSEE�IF�ANY�RECORDS*-UPAROW30�TST.L�MAXLINE-DATASG(A5)„ANY�RECORD?$‰BMI.S�UPAROW40�BRANCH�IF�NO�RECORDS:‰MOVE.B�#1,FSTSW-DATASG(A5)‚HAVE�RECORDS,TURN�OFF�NEW�FLAG%‰BRA�UPAROW20�AND�CONTINUE�PROCESSINGAUPAROW40 MOVE.B #LOADCUR,(A3)+ REPOSITION CURSOR TO TOP OF SCREEN ‰MOVE.B�#POSONE,(A3)+�FIRST�LINE"‰MOVE.B�#COLTWO,(A3)+�FIRST�COLUMN‰BRA�DOOUT�GO�DO�ALL�THE�OUTPUT**ˆPAGE�WRAPAROUND*CUPAROW50‚ADD.L�#WRAPKEY,FILELINE-DATASG(A5)‚UPDATE�CURRENT�RECORD�#!‰BSR�EOFM40‚GO�SEE�IF�END�OF�FILE2‰BRA�DELINE15�GO�POSITION�PROMPT�AND�DO�THE�OUTPUT‡PAGE*A******************************************************************:*†TEST�FOR�OLD�OR�NEW�EMPTY�FILE�AND�SET�FLAGS�ACCORDINGLY**†REV�1.00‚01-24-80‚(C313)*†ENTRY:D1.B=#REPLCMD *†ALTERNATE�ENTRY�POINT:TESTOLD1*†EXIT:�RETURNS�TO�CALLER**†USES:�0�1�2�3�4�5�6�7*ˆD…R…**ˆA�P*A****************************************************************** TESTOLD‚EQU„*<‰TST.B‚EMTYFILE-DATASG(A5)†IS�THIS�AN�OLD�OR�NEW�EMPTY�FILE?*‰BNE.S�TESTOLD1‹YES,�GO�RESET�TO�NOT�EMPTY8‰MOVE.L‚MAXLIN E-DATASG(A5),D4‡GET�#�LAST�LOG�REC�IN�FILE>‰CMP.LƒFILELINE-DATASG(A5),D4†ARE�WE�PAST�THE�END�OF�THE�FILE?'‰BLT.SƒTESTOLD2‰YES,�GO�SET�INSERT�CODE‰RTS•GO�RETURN�TO�CALLER:TESTOLD1�CLR.B‚EMTYFILE-DATASG(A5)…RESET�FILE�TO�NOT�EMPTY1‰CLR.B‚FILETYPE-DATASG(A5)…RESET�FILE�TO�OLD�TYPE*‰TST.B‚FSTSW-DATASG(A5)ˆFIRST�TIME�TO�OLD?‰BNE.S‚TESTOLD2ŠBRANCH�IF�NO5‰MOVE.B‚#1,FSTSW-DATASG(A5)„TURN�ON�FIRST�TIME�SWITCH?‰SUB.L‚#1,FILELINE-DATASG(A5)‚MAKE�FILELINE�MATCH�OLD�FILE�TYPE3TESTOLD2�MOVE.B�#INSRTCMD,D1†SET�INSERT�FMS�COMMAND‰RTS•RETURN�TO�CALLER‡PAGEA******************************************************************E*…DOWN�ARROW-MOVE�CURSOR�AND�PROMPT�DOWN�1�LINE�WITH�PAGE�WRAP�AROUND*…REV�1.00‚12-3-79‚(C313)*…REV�2.00‚7-15-81‚(C313)*…ENTRY:A1=INPUT�BUFFER�ADDRESS'*…USES:�A3=SCREEN�OUTPUT�BUFFER�ADDRESS *…EXIT:�THRU�DELETE�LINE�ROUTINE*…CALLS:CKREAD�TESTOLD1*Œ0�1�2�3�4�5�6�7 *…REGS:�D‚* *‹A‚Pƒ*ƒPB*******************************************************************DNAROWƒEQU‚*�CURSOR�DOWN�1�LINE6ˆLEA�OUTBUF-DATASG(A5),A3�SCREEN�OUTPUT�BUFFER�ADDRESS*ˆTST.B�CURMODE-DATASG(A5)„IN�COMMAND�MODE?ˆBNE.S�DNAROW10�BRANCH�IF�NO&ˆADD.B�#1,CRTLINE(A1)‚INCREMENT�LINE�#+ˆCMP.B�#LINE20,CRTLINE(A1)�PAGE�WRAPAROUND?ˆBLE.S�DNAROW10�BRANCH�IF�NO,OK0ˆMOVE.B�#POSONE,CRTLINE(A1)�FORCE�SCREEN�LINE�#1/DNAROW10�TST.B‚CRTCHG(A1)„SEE�IF�A�CHANGE�TO�DO)ˆBEQ.SƒDNAROW20ˆBRANCH�IF�NO�CHANGE�TO�DO/ˆMOVE.B�#1,FSTSW-DATASG(A5)ƒTURN�OFF�FIRST�FLAG,ˆBSR„CKREAD‰GO�INSERT�OR�REPLACE�THIS�RECORD.DNAROW20�TST.L�MAXLINE-DATASG(A5)‚ANY�RECORDS?2‡BMI„UPAROW40‚BRANCH�IF�NO,RESET�CURSOR�AND�PROMPT ‰BSR‚TESTOLD1‰TURN�OFF�NEW�FLAGS0‰MOVE.B‚SAVEP-DATASG(A5),D1†GET�LAST�LINE�NUMBER6‡CMP.B‚CRTLINE(A1),D1ƒSEE�IF�PAGE�WRAPAROUND�THIS�TIME)†BGT.S‚DNAROW30…BRANCH�IF�PAGE�WRAPAROUNDF‰ADD.L‚#1,FILELINE-DATASG(A5)�NOT�PAGE�WRAPAROUND-UPDATE�CURRENT�REC�#8†MOVE.L�FILELINE-DATASG(A5),D1�GET�CURRENT�RECORD�NUMBER)‰CMP.L�MAXLINE-DATASG(A5),D1�BEYOND�FILE?%‰BLE.S�DNAROW40�BRANCH�IF�WITHIN�FILE*6*ˆBEYOND�FILE�OR�PAGE�WRAPAROUND-MOVE�TO�TOP�OF�SCREEN*KDNAROW30 MOVE.L TOPLINE-DATASG(A5),FILELINE-DATASG(A5) SET CURRENT RECORD #.‰MOVE.B�#POSONE,CRTLINE(A1)�SCREEN�LINE�NUMBER/DNAROW40 MOVE.B #LOADCUR,(A3)+ LOAD CURSOR CODE,‰MOVE.B�CRTLINE(A1),(A3)+�SCREEN�LINE�NUMBER&‰MOVE.B�CRTCOL(A1),(A3)+�COLUMN�NUMBER‰BRA�DELINE15�GO�DO�THE�OUTPUT†PAGEB******************************************************************* *…HOME�CURSOR**…REV�1.00‚12-3-79‚(C313)*…REV�2.00‚7-15-81‚(C313)*…ENTRY:A1=INPUT�BUFFER�ADDRESS'*…USES:�A3=SCREEN�OUTPUT�BUFFER�ADDRESS *…EXIT:�THRU�DELETE�LINE�ROUTINE*…CALLS:CKREAD�TESTOLD1*Œ0�1�2�3�4�5�6�7 *…REGS:�D *‹A‚Pƒ*ƒPA****************************************************************** HOME‚EQU‚*/†LEA�OUTBUF-DATASG(A5),A3�OUTPUT�BUFFER�ADDRESS-†TST.B‚CRTCHG(A1)…SEE�IF�A�CHANGE�TO�DO�FIRST!†BEQ.S‚HOME10‰BRANCH�IF�NO�CHANGE,†BSR‚CKREAD‰GO�INSERT�OR�REPLACE�THIS�RECORD,HOME10�TST.L�MAXLINE-DATASG(A5)ƒANY�RECORDS?!‡BMI�UPAROW40‡BRANCH�IF�NO�RECORD(‡BSR�TESTOLD1‡TURN�OFF�REST�OF�NEW�FLAGS=‡MOVE.L�TOPLINE-DATASG(A5),FILELINE-DATASG(A5)�CURRENT�RECORD‡BRA�DELINE15†GO�DO�THE�OUTPUT‡PAGE>****************************************************************†FKEY1‚GO�TO�COMMAND�MODE�IF�IN�PAGE�MODE$*�GO�TO�PAGE�MODE�IF�IN�COMMAND�MODE-*�DON'T�ALLOW�PAGE�MODE�IF�USING�THE�K�OPTION/*�K�OPTION�FOR�LOOKING�AT�FILES�ONLY,NO�CHANGES*†REV�1.00‚12-3�-79‚(C313)*†REV�2.00‚3/27/80�(313)*†REV�3.00‚7-15-81�(313)*†ENTRY:A1=INPUT�BUFFER�ADDRESS'*†USES:�A3=SCREEN�OUTPUT�BUFFER�ADDRESS4*†CALLS:WRTMESS‚CLRMSG‚CKREAD‚SETPP3‚TESTOLD1�SETCP3=*************************************************************FKEY1…EQU„*ŒCHANGE�MODE)‡TST.B�FILEOPT-DATASG(A5)‡USING�K�OPTION?‡BEQ.S�F100ƒBRANCH�IF�NO3‡LEA�FMSG640-DATASG(A5),A0�YES,K:DON'T�CHANGE�MODES‡MOVE.L�#14,D0�MESSAGE�LENGTH+‡BSR�WRTMESS�OUTPUT�THE�MESSAGE�TO�THE�USER ‡RTS�RETURN:F100ƒLEA�OUTBUF-DATASG(A5),A3�SCREEN�OUTPUT�BUFF ER�ADDRESS‡BSR�CLRMSG…CLEAR�ANY�MESSAGE$‡TST.B�CRTCHG(A1)�FILE�UPDATE�TO�DO?‡BEQ.S�F110�BRANCH�IF�NO)ˆMOVE.B‚#1,FSTSW-DATASG(A5)‚TURN�OFF�FLAG,ˆBSRƒCKREAD‡GO�INSERT�OR�REPLACE�THIS�RECORD.F110„TST.B�CURMODE-DATASG(A5)‚IN�COMMAND�MODE?ˆBEQ.S�F140„BRANCH�IF�YES**ˆSET�TO�COMMAND�MODE*'ˆBSR�SETCP3‚SET�COMMAND�MODE�PROTECTION3ˆCLR.B�CURMODE-DATASG(A5)ƒTURN�ON�COMMAND�MODE�FLAG&ˆTST.L�MAXLINE-DATASG(A5)„ANY�RECORDS?7ˆBMI.S�F130ƒBRANCH�IF�NO�RECORDS,�DON'T�CHANGE�ANYTHING*ˆTST.B�CRTCHG(A1)�WAS�THERE�A�FILE�CHANGE?(ˆBNE.S�F115�BRANCH�IF�YES,�A�FILE�CHANGE$ˆTST.B�EMTYFILE-DATASG(A5)�OLD�FILE?#ˆBEQ.S�F115�BRANCH�IF�YES,�OLD�FILE;ˆMOVE.B�#WRTABS,(A3)+�PROMPT�IS�ON�WRONG�LINE,�MUST�MOVE�IT!ˆMOVE.B�#STRT,(A3)+�START�OF�DATA-ˆMOVE.B�CRTLINE(A1),(A3)+�CURRENT�LINE�NUMBER ˆMOVE.B�#POSONE,(A3)+�COLUMN�ONE!ˆMOVE.B�#BLANK,(A3)+�BLANK�IT�OUT ˆMOVE.B�#ENDOD,(A3)+�END�OF�DATA$ˆMOVE.B�#WRTABS,(A3)+�WRITE�ABSOLUTE!ˆMOVE.B�#STRT,(A3)+�START�OF�DATA2ˆMOVE.B�SAVEP-DATASG(A5),(A3)+�CORRECT�LINE�NUMBER ˆMOVE.B�#POSONE,(A3)+�COLUMN�ONEˆMOVE.B�#PROMPT,(A3)+�PROMPT ˆMOVE.B�#ENDOD,(A3)+�END�OF�DATA6ˆMOVE.B�SAVEP-DATASG(A5),CRTLINE(A1)�RESET�LINE�NUMBER"F115„BSR�TESTOLD1�FIX�UP�ALL�FLAGS6ˆTST.L�FILELINE-DATASG(A5)„SEE�IF�FILELINE�IS�NEGATIVE ˆBPL.S�F120ƒBRANCH�IF�NOT�NEG,OK-ˆCLR.L�FILELINE-DATASG(A5)†FORCE�FIRST�RECORD-F120ƒMOVE.L�MAXLINE-DATASG(A5),D1�GET�MAXLINE9‡CMP.L�FILELINE-DATASG(A5),D1�SEE�IF�FILELINE�BEYOND�FILE ‡BGE.S�F130ƒBRANCH�IF�NOT�BEYONDD‡MOVE.L�MAXLINE-DATASG(A5),FILELINE-DATASG(A5)…RESET�FILELINE�TO�END*F130ƒBRA�DOOUT�GO�DO�THE�OUTPUT�AND�RETURN**ˆSET�TO�PAGE�MODE*+F140ƒBSR�SETPP3„GO�SET�PAGE�MODE�PROTECTION'‡MOVE.B�#LOADCUR,(A3)+�LOAD�CURSOR�CODE%‡MOVE.B�SAVEP-DATASG(A5),(A3)+‚LINE�##‡MOVE.B�#COLTWO,(A3)+�COLUMN�NUMBER,‡MOVE.B�#1,CURMODE-DATASG(A5)‚PAGE�MODE�FLAG‡BRA�F130�GO�DO�THE�OUTPUTˆPAGEB*******************************************************************&*…FKEY3…SCROLL�SCREEN�FORWARD�ONE�PAGE*…REV�1.00‚12-3-79‚(C313)*…REV�2.00‚7-15-81‚(C313)*…ENTRY:A1=INPUT�BUFFER�ADDRESS'*…USES:�A3=SCREEN�OUTPUT�BUFFER�ADDRESS *…EXIT:�THRU�DELETE�LINE�ROUTINE'*…CALLS:FKEYSTUP�TESTOLD1�EOFMSG3�DOOUT*‹0�1�2�3�4�5�6�7 *…REGS:D„* *ŠA‚Pƒ*ƒPA*****************************************************************-FKEY3„EQU‚*ŽSCROLL�SCREEN�FORWARD�1�PAGE‚(A2)$‰BSR‚FKEYSTUPƒGO�DO�COMMON�FUNCTIONS&‡TST.L�MAXLINE-DATASG(A5)…ANY�RECORDS? ˆBMI.S�F330ƒBRANCH�IF�NO�RECORDS ‰BSR‚TESTOLD1‡TURN�OFF�NEW�FLAGS7‰ADD.L‚#FULSCRN,TOPLINE-DATASG(A5)„POINT�TO�NEW�TOPLINE7‰MOVE.L�TOPLINE-DATASG(A5),D2�GET�NEW�TOP�RECORD�NUMBER)‰CMP.L‚MAXLINE-DATASG(A5),D2†WITHIN�FILE?‰BLE.S‚F335ŒBRANCH�IF�WITHIN<‰SUB.L‚#FULSCRN,TOPLINE-DATASG(A5)…RESET�TOPLINE�TO�ORIGINAL%F320„BSR�EOFMSG3’GO�BUILD�EOF�MESSAGE"ˆBRA�DELINE10†GO�DO�ALL�THE�OUTPUT*!*ˆNO�RECORDS-IGNORE�THIS�FUNCTION*3F330„MOVE.B�#POSONE,CRTLINE(A1)�FORCE�SCREEN�LINE�1ˆBRA�DELINE10�GO�DO�THE�OUTPUT**ˆWITHIN�THE�FILE-DO�THE�SCROLL*DF335„ADD.L�#FULSCRN,FILELINE-DATASG(A5)„UPDATE�CURRENT�RECORD�NUMBER-F340„BSR�DOOUT„GO�OUTPUT�WHATEVER�WE�NOW�HAVE#F350…BSR�WRTSCRN�GO�OUTPUT�THE�PAGE/†LEA‚OUTBUF-DATASG(A5),A3„OUTPUT�BUFFER�ADDRESS"†MOVE.B�#LOADCUR,(A3)+�LOAD�CURSOR,†MOVE.B‚CRTLINE(A1),(A3)+‚SCREEN�LINE�NUMBER(†MOVE.B‚#COLTWO,(A3)+ƒSET�FOR�1ST�COLUMN%†BRA�F320�GO�SEE�IF�EOF�AND�DO�OUTPUT†PAGEB******************************************************************!*†FKEY4‚SCROLL�SCREEN�BACK�1�PAGE*†REV�1.00‚12-3-79‚(C313)*†REV�2.00‚7-15-81‚(C313)*†ENTRY:A1=INPUT�BUFFER�ADDRESS'*†USES:�A3=SCREEN�OUTPUT�BUFFER�ADDRESS *†EXIT:�THRU�DELETE�LINE�ROUTINE*†CALLS:FKEYSTUP�TESTOLD1*Œ0�1�2�3�4�5�6�7 *†REGS:D* *‹A‚Pƒ*ƒP=**************************************************************FKEY4…EQU„*ŽSCROLL�SCREEN�BACK�1�PAGEƒ(A3)!‰BSR‚FKEYSTUP‰GO�DO�COMMON�SET�UP&‡TST.L�MAXLINE-DATASG(A5)„ANY�RECORDS?‡BMI�F330ƒBRANCH�IN�NO�RECORDS ˆBSR‚TESTOLD1ŠTURN�OFF�NEW�FLAGS6ˆTST.L�TOPLINE-DATASG(A5)�SEE�IF�ALREADY�AT�FIRST� LINE!ˆBEQ„F320‹BRANCH�IF�IN�FIRST�LINE4ˆSUB.L‚#FULSCRN,TOPLINE-DATASG(A5)�UPDATE�TOP�RECORD9†SUB.L‚#FULSCRN,FILELINE-DATASG(A5)‚UPDATE�CURRENT�RECORD,‡TST.L�TOPLINE-DATASG(A5)ŒSEE�IF�WITHIN�FILE/‡BGE‚F340ŒBRANCH�IF�WITHIN�FILE-WRITE�TO�SCREEN<‡CLR.L‚TOPLINE-DATASG(A5)„WRITE�TO�SCREEN�STARTING�AT�LINE�1"‡CLR.L‚D0ŽCLEAR�FOR�BYTE�OPERATION-‡MOVE.B‚CRTLINE(A1),D0…GET�CURSOR�LINE�NUMBER‡SUB.B‚#POSONE,D0ŠSTRIP�ASCII8‡MOVE.L‚D0,FILELINE-DATASG(A5)†UPDATE�DISK�RECORD�NUMBER†BRAƒF340�GO�WRITE�SCREEN†PAGEB*******************************************************************$*†FKEY5‚SCROLL�SCREEN�FORWARD�1�LINE**†REV‚1.00‚12-3-79‚(C313)*†REV‚2.00‚7-15-81‚(C313)*†ENTRY:A1=INPUT�BUFFER�ADDRESS'*†USES:�A3=SCREEN�OUTPUT�BUFFER�ADDRESS *†EXIT:�THRU�DELETE�LINE�ROUTINE)*†CALLS:FKEYSTUP�TESTOLD1�EOFMSG3�CKREAD1*Œ0�1�2�3�4�5�6�7*†REGS:D*�*ƒ*…* *‹A‚Pƒ*ƒPA*****************************************************************-FKEY5„EQU„*ŒSCROLL�SCREEN�FORWARD�1�LINE‚(A4) ‰BSR‚FKEYSTUP…GO�DO�COMMON�SETUP&‡TST.L�MAXLINE-DATASG(A5)ˆANY�RECORDS? ‡BMI.S�F520ƒBRANCH�IF�NO�RECORDS ˆBSR‚TESTOLD1‡TURN�OFF�NEW�FLAGS2ˆADD.L‚#1,TOPLINE-DATASG(A5)†POINT�TO�NEW�TOPLLINE5ˆADD.L‚#1,FILELINE-DATASG(A5)†POINT�TO�CURRENT�RECORD5ˆMOVE.L‚MAXLINE-DATASG(A5),D0‡GET�MAX�NUMBER�OF�LINES7ˆMOVE.L‚TOPLINE-DATASG(A5),D1‡GET�TOPLINE�RECORD�NUMBER0ˆADD.L‚#WRAPVAL,D1ˆNEW�BOTTOM�LINE�RECORD�NUMBER&ˆCMP.L‚D1,D0�SEE�IF�BOTTOM�BEYOND�FILE!ˆBGE.S‚F530�BRANCH�IF�WITHIN�FILE*.*ˆBEYOND�FILE-CANNOT�SCROLL-RESET�ALL�POINTERS*,ˆSUB.L‚#1,TOPLINE-DATASG(A5)‚RESTORE�TOPLINE;ˆSUB.L‚#1,FILELINE-DATASG(A5)ƒRESTORE�CURRENT�RECORD�NUMBER!ˆBSRƒEOFMSG3ŽGO�BUILD�EOF�MESSAGEˆBRA�DELINE10ŽGO�DO�THE�OUTPUT**ˆNO�FILE�RECORDS*5F520„MOVE.B�#POSONE,CRTLINE(A1)‚FORCE�SCREEN�LINE�ONEˆBRA�DELINE10’GO�DO�THE�OUTPUT**ˆWITHIN�THE�FILE*&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‚SCROLL�SCREEN�BACK�1�LINE*†REV‚1.00‚12-3-79‚(C313)*†REV‚2.00‚7-15-81‚(C313)*†ENTRY:A1=INPUT�BUFFER�ADDRESS'*†USES:�A3=SCREEN�OUTPUT�BUFFER�ADDRESS(*†CALLS:FKEYSTUP�TESOLD1�EOFMSG3�CKREAD1 *†EXIT:�THRU�DELETE�LINE�ROUTINE*Œ0�1�2�3�4�5�6�7*†REGS:D‚*ƒ*…* *‹A‚Pƒ*ƒ*D*********************************************************************FKEY6„EQUƒ*‰SCROLL�SCREEN�BACK�1�LINE‚(A5) ˆBSR�FKEYSTUP†GO�DO�COMMON�SETUP&‡TST.L�MAXLINE-DATASG(A5)…ANY�RECORDS?‡BMIƒF520�BRANCH�IF�NO�RECORDS ˆBSR‚TESTOLD1†TURN�OFF�NEW�FLAGS1ˆSUB.L‚#1,TOPLINE-DATASG(A5)ƒPOINT�TO�NEW�TOPLINE6ˆSUB.L‚#1,FILELINE-DATASG(A5)ƒPOINT�TO�NEW�DISK�RECORD,ˆTST.L‚TOPLINE-DATASG(A5)�SEE�IF�BEYOND�FILE!ˆBGE.S‚F620’BRANCH�IF�WITHIN�FILE*.*†HERE�IF�CAN'T�SCROLL�DOWN�1�LINE-BEYOND�FILE*,‡ADD.L‚#1,TOPLINE-DATASG(A5)…RESTORE�TOPLINE8‡ADD.L‚#1,FILELINE-DATASG(A5)†RESTORE�DISK�RECORD�NUMBER!‡BSR�EOFMSG3’GO‚BUILD�EOF�MESSAGE"‰BRA�DELINE10ƒGO�DO�REST�OF�OUTPUT**ˆWITHIN�THE�FILE*&F620„MOVE.B�#LOADCUR,(A3)+�LOAD�CURSOR"ˆMOVE.B‚#LINE20,(A3)+‚LINE�20�CODE#ˆMOVE.B‚#COLTWO,(A3)+‚COLUMN�2�CODE'ˆMOVE.B‚#DELLINE,(A3)+�DELETE�LAST�LINE"ˆMOVE.B‚#LOADCUR,(A3)+�LOAD�CURSORˆMOVE.B‚#POSONE,(A3)+�LINE�1ˆMOVE.B‚#COLTWO,(A3)+�COLUMN�2'ˆMOVE.B‚#INSRTLN,(A3)+�INSERT�LINE�CODE+ˆMOVE.L�TOPLINE-DATASG(A5),D1�READ�TOP�LINEˆMOVE.L�#1,D6�READ�1�RECORDˆBSR�CKREAD1�GO�READ�THE�RECORD‡TST.L‚D1�SEE�IF�DID�READ#‡BMIƒEDIT3�BRANCH�IF�NO,FATAL�ERROR$†MOVE.B‚#POSONE,D3†CODE�FOR�TOP�LINE†BRA�DELINE60ŒGO�DO�THE�OUTPUT†PAGEA******************************************************************0*‚ FKEY11‚SET�TAB�STOP�IN�CURRENT�COLUMN�POSITION4*ŠDELETES�THE�DEFAULT�TAB�STOPS�OF�EVERY�10TH�COLUMN-*ŠUSES�TAB�COMMAND�CODE�TO�DO�THE�TAB�SETTING*‚REV.�1.00‚5/11/81‚(C313)!*‚ENTRY:A1=COMMAND�PACKET�ADDRESS*‚EXIT:THRU�DOOUT�ROUTINE"*‚CALLS:CKREAD‚TAB00‚DOOUT‚WRTMESS*A***************************************************************** FKEY11 EQU **�TST.B�CURMODE-DATASG(A5)„IN�COMMAND�MODE?, 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)‚TURN�OFF�NEW�FLAG, BSR CKREAD GO INSERT OR REPLACE THIS RECORD1FKEY11A�CMP.B�#20,TABCNT-DATASG(A5)„AT�MAX�COUNT?$ 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 NUMBER3�MOVE.B�CRTCOL(A1),-(A7)‚SAVE�CURRENT�COLUMN�NUMBER? 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.B�CURMODE-DATASG(A5)‚IN�COMMAND�MODE? 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‚DOOUT�GO�REPOSITION�THE�CURSOR�AND�RETURN=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‚DELETE�A�TAB�STOP�FROM�THE�CURRENT�COLUMN*‚REV.�1.00‚5/11/81‚(C313)!*‚ENTRY:A1=COMMAND�PACKET�ADDRESS/*‚EXIT:�THRU�DOOUT�ROUTINE‚ERROR�EXIT:EDITERROR*‚CALLS:CKREADA*****************************************************************0FKEY12�TST.B�CURMODE-DATASG(A5)…IN�COMMAND�MODE?, 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.B�TABCNT-DATASG(A5)ƒANY�TO�DELETE?% 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***ˆFIND�THE�TAB�STOP�IN�THE�SAVED�TAB�TABLE*; 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„IGNORE�IF�NOT�FOUND,GO�REPOSITION�THE�CURSOR**ˆFOUND�THE�TAB�STOP�TO�DELETE*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)…UPDATE�NUMBER�OF�TABS�CURRENTLY�SET1FKEY12E TST.B CURMODE-DATASG(A5) IN COMMAND MODE?ˆBEQ.S�FKEY12F�BRANCH�IF�YES.ˆMOVE.B�CRTLINE(A1),D0�GET�CURRENT�LINE�NUMBER/ MOVE.B CRTCOL (A1),D1 GET CURRENT COLUMN NUMBER0 BRA FKEY11E GO REPOSITION THE CURSOR AND RETURN)FKEY12FƒRTS�RETURN,DONE�WITH�TAB�DELETION PAGEC*******************************************************************(*„INSERT�LINEƒMOVE�ALL�LINES�DOWN�1�LINE*’FROM�FILELINE�TO�END+1*’BLANK�LINE�TO�CURRENT�LINE*†REV�1.00‚12-3-79‚(C313)*†REV�2.00‚3/31/81‚(C313)*†CALLS:CKREAD‚TESTOLD1‚UPDATE*†EXITS:READCMD*ŒMAIN�PROGRAM*C******************************************************************* INSLINƒEQUƒ*0‡TST.B‚CURMODE-DATASG(A5)‡SEE�IF�IN�COMMAND�MODE/ˆBEQ‚READCMD†IN�COMMAND�MODE-IGNORE�INSERT�LINE-‰TST.B‚CRTCHG(A1)„SEE�IF�A�CHANGE�TO�DO�FIRST"‰BEQ.S‚INSLIN2‡BRANCH�IF�NO�CHANGE$‰TST.B�EMTYFILE-DATASG(A5)…OLD�FILE? ‰BEQ.S�INSLIN1‡BRANCH�IF�YES,OLD1‰MOVE.B�#INSRTCMD,D1‚SET�UP�FOR�INSET�ON�NEW�FILE=‰ADD.L�#1,MAXLINE-DATASG(A5)ƒUPDATE�NUMBER�OF�RECORDS�IN�FILE!‰BSR�UPDATEŠGO�INSERT�THIS�RECORD2‰ADD.L�#1,FILELINE-DATASG(A5)ƒPOINT�TO�THIS�RECORD%‰BRA.S�INSLIN2‡GO�CONTINUE�PROCESSING0INSLIN1‚MOVE.B‚#1,FSTSW-DATASG(A5)�TURN�OFF�FLAG,‰BSR„CKREADˆGO�INSERT�OR�REPLACE�THIS�RECORD-INSLIN2�TST.L�MAXLINE-DATASG(A5)ƒANY�RECORDS?.‰BMI.S�INSLIN3�BRANCH�IF�NO,IGNORE�THIS�INSERT ‰BSR‚TESTOLD1‡TURN�OFF�NEW�FLAGS0‰MOVE.L‚#7,CRTLNG-DATASG(A5)…CODE�FOR�BLANK�LINE+‰MOVE.B‚#INSRTCMD,D1†INSERT�COMMAND�FOR�FMS*‰BSR„UPDATE‹GO�UPDATE�DISK�FILE�AND�SCREEN5‰ADD.L‚#1,MAXLINE-DATASG(A5)ƒUPDATE�#�OF�DISK�RECORDSINSLIN3‚RTS™RETURN‰PAGEC********************************************************************/*…DELETE�LINE…DELETE�CURRENT�LINE�AND�MOVE�REST*•OF�LINES�UP�ONE�LINE*†REV‚1.00‚12-3-79‚(C313)*†REV‚2.00‚7-15-81‚(C313*†ENTRY:A1=INPUT�BUFFER�ADDRESS*†USES:�A3=OUTPUT�BUFFE�ADDRESS*†EXIT:READCMD‚DOOUT<*†NOTE:MOST�FUNCTION�KEYS�AND�CURSOR�MOVEMENT�FKEYS�USE�THIS7*‹ROUTINE�TO�BUILD�PARTS�OF�THIER�OUTPUT�BUFFER,�DO�THE-*‹OUTPUT,AND�RETURN‚TO�THE�MAIN�PART�OF�EDIT.5*‹ALL�THE�SCREEN�OUTPUT�IS�BUILT�WHILE�PROCESSING�AND.*‹THE�OUTPUT�IS�DONE�AT�THE�END�OF�PROCESSING.*†CALLS:FMS�SETCP3�CKREAD1*Œ0�1�2�3�4�5�6�7*†REGS:D*�*�*�*…* *‹A*�P�*�*ƒPD******************************************************************** DELINEƒEQUƒ*0‡TST.B‚CURMODE-DATASG(A5)‚SEE�IF�IN�COMMAND�MODE6†BEQ‚READCMD„BRANCH�IF�COMMAND�MODE-IGNORE�DELETE�LINE&†TST.L�MAXLINE-DATASG(A5)‚ANY�RECORDS?6†BMI‚DELINE90�BRANCH�IF�NO�RECORDS,IGNORE�THIS�COMMAND$†TST.B‚EMTYFILE-DATASG(A5)�NEW�FILE?9†BNE„DELINE95ƒBRANCH�IF�NEW,GO�MOVE�THE�CURSOR�AND�PROMPT6†LEA�OUTBUF-DATASG(A5),A3�SCREEN�OUTPUT�BUFFER�ADDRESS6‰MOVE.B‚#0,CRTCHG(A1)„IGNORE�CHANGE-DELETING�THIS�LINE7‰LEA‚FMSPKT-DATASG(A5),A0ˆADDRESS�OF�FMS�COMMAND�PACKET0‰MOVE.B‚#DELCMD,FMSCMD(A0)„DELETE�RECORD�COMMAND‰MOVE.L�#1,D6‘DELETE�1�RECORD#‰BSR‚FMS•DELETE�THIS�RECORD�ON�DISK‰TST.L‚D0”RECORD�FOUND?(‰BNE‚F350”BRANCH�IF�NO,GO�REWRITE�SCREEN4‰TST.L‚MAXLINE-DATASG(A5)„SEE�IF�DELETED�ONLY�RECORD‰BEQ„DELINE80ŽBRANCH�IF�YES2‰SUB.L‚#1,MAXLINE-DATASG(A5)�UPDATE�#�DISK�RECORDS**†SEE�IF�DELETED�LAST�RECORD*,ˆMOVE.B‚CRTLINE(A1),D0�CURRENT�CURSOR�LINE�#$ˆSUB.B�#POSONE,D0‚STRIP�ASCII�OFFSET2ˆADD.L�TOPLINE-DATASG(A5),D0�CURRENT�RECORD�NUMBER3ˆSUB.L�MAXLINE-DATASG(A5),D0‚SEE�IF�WITHIN�THE�FILE'ˆBLEƒDELINE50�BRANCH�IF�WITHIN�THE�FILE.ˆSUB.B�D0,CRTLINE(A1)�RESET�SCREEN�LINE�NUMBER;ˆMOVE.L�MAXLINE-DATASG(A5),D1�SEE�IF�ANYTHING�ON�THE�SCREEN0ˆCMP.L�TOPLINE-DATASG(A5),D1†SEE�IF�>�THAN�TOP�#/ˆBLT.S�DELINE30�BRANCH�IF�NOTHING�ON�THE�SCREEN*!*ˆRESET�THE�CURSOR�AND�THE�PROMPT**DELINE00 MOVE.B #LOADCUR,(A3)+ LOAD CURSOR …MOVE.B�CRTLINE(A1),(A3)+‚LINE�#!…MOVE.B�CRTCOL(A1),(A3)+�COLUMN�#/DELINE10�TST.B�CURMODE-DATASG(A5)†IN�PAGE�MODE?&…BNE.S�DELINE15�BRANCH�IF�IN�PAGE�MODE"…BSR�SETCP3�SET�COMMAND�PROTECTION1DELINE15 MOVE.B #WRTABS,(A3)+ WRITE ABSOLUTE CODE&…MOVE.B‚#STRT,(A3)+‚START�OF�DATA�CODE0…MOVE.B‚SAVEP-DATASG(A5),(A3)+‚OLD�PROMPT�LINE�#…MOVE.B‚#POSONE,(A3)+�COLUMN�#-…MOVE.B‚#BLANK,(A3)+‚BLANK�OUT�THE�OLD�PROMPT%…MOVE.B‚#ENDOD,(A3)+‚END�OF�DATA�CODE$…MOVE.B‚#WRTABS,(A3)+�WRITE�ABSOLUTE&…MOVE.B‚#STRT, (A3)+�START�OF�DATA�CODE8…MOVE.B‚CRTLINE(A1),(A3)+�CURRENT�LINE�NUMBER�FOR�PROMPT…MOVE.B‚#POSONE,(A3)+�COLUMN�1#…MOVE.B‚#PROMPT,(A3)+�PROMPT�SYMBOL%…MOVE.B‚#ENDOD,(A3)+�END�OF�DATA�CODE4…MOVE.B�CRTLINE(A1),SAVEP-DATASG(A5)ƒSAVE�NEW�LINE�#:…BRA�DOOUTƒGO�DO�THE�SCREEN�OUTPUT�AND�RETURN�TO�MAIN�PART*/*ˆSCREEN�IS�EMPTY-PUT�LAST�RECORD�ON�THE�SCEEEN*HDELINE30 MOVE.L MAXLINE-DATASG(A5),TOPLINE-DATASG(A5) LAST RECORD NUMBER=…MOVE.L�MAXLINE-DATASG(A5),FILELINE-DATASG(A5)‚CURRENT�RECORD.…MOVE.B‚#POSONE,CRTLINE(A1)�SCREEN�LINE�NUMBER…MOVE.L‚#1,D6�READ�1�RECORD…BSR�CKREAD1‡GO�READ�THE�RECORD…TST.L�D1�GOT�IT?+DELINE40 BMI EDIT3 BRANCH IF NO,FATAL ERROR(…MOVE.B�CRTLINE(A1),D3�GET�SCREEN�LINE�#'…BRA.S�DELINE60�GO�SETUP�REST�OF�OUTPUT*#*ˆWRITE�NEW�LAST�LINE�TO�THE�SCREEN*.DELINE50 MOVE.L #WRAPVAL,D1 SCREEN LINE OFFSET2…ADD.L�TOPLINE-DATASG(A5),D1�RECORD�NUMBER�TO�READ…MOVE.L�#1,D6�READ�1�RECORD…BSR�CKREAD1�GO�READ�IT…TST.L�D1�GOT�IT?1…BMI.S�DELINE75�BRANCH�IF�NO,GO�REPOSITION�CURSOR+…MOVE.B�#POSONE,D3�FIRST�SCREEN�LINE�NUMBER$…ADD.B�#WRAPVAL,D3�ADD�IN�THE�OFFSET1DELINE60 LEA EDITBUF-DATASG(A5),A2 RECORD ADDRESS'…MOVE.B�#LOADCUR,(A3)+�LOAD�CURSOR�CODE#…MOVE.B�D3,(A3)+�SCREEN�LINE�NUMBER…MOVE.B�#COLTWO,(A3)+�CLOUMN�2 …MOVE.L�#RECLNG,D2�RECORD�LENGTH3DELINE70 MOVE.B (A2)+,(A3)+ RECORD TO OUTPUT BUFFER…SUB.L�#1,D2�DECREMENT�COUNTER8…BNE.S�DELINE70�BRANCH�TIL�RECORD�MOVED�TO�OUTPUT�BUFFER*DELINE75 BRA DELINE00 GO FINISH THE OUTPUT**†NO�MORE�RECORDS�IN�THE�FILE*;DELINE80ƒCLR.L‚FILELINE-DATASG(A5)„SET�RECORD�NUMBER�TO�NEW4ˆCLR.L‚TOPLINE-DATASG(A5)„SET�TOP�SCREEN�LINE�TO�NEW<ˆMOVE.B‚#-1,EMTYFILE-DATASG(A5)„SET�FILE�TO�NEW�OR�OLD�EMPTY.ˆMOVE.B‚#1,FILETYPE-DATASG(A5)†SET�FILE�TO�NEW.ˆMOVE.L‚#-1,MAXLINE-DATASG(A5)†RESET�MAX�COUNT/ˆCLR.B‚FSTSW-DATASG(A5)‡RESET�FIRST�TIME�SWITCHDELINE90�RTS†RETURN*7*‡NEW�FILE�-�MOVE�THE�CURSOR�AND�THE�PROMPT�UP�ONE�LINE*7DELINE95‚LEA�OUTBUF-DATASG(A5),A3�OUTPUT�BUFFER�ADDRESS'ŠSUB.B�#1,CRTLINE(A1)�POINT�UP�ONE�LINE%ŠBSR�TESTOLD�GO�SET�FLAGS�TO�OLD�FILE+ŠBRA�DELINE00�GO�MOVE�THE�CURSOR�AND�PROMPT‰PAGE>**************************************************************"*ˆFKEYSTP�COMMON�FUNCTON�KEY�SETUP#*ˆLOADS�OUTPUT�BUFFER�ADDRESS�TO�A3!*ˆBUILDS�MESSAGE�CLEAR�ON�LINE�21"*ˆBUILDS�PAGE�PROTECTION�IF�NEEDED*ˆUPDATES�FILE�IF�NEEDED*ˆENTRY:A1=INPUT�BUFFER�ADDRESS*ˆEXIT:�A1=INPUT�BUFFER�ADDRESS"*ŽA3=CURRENT�OUTPUT�BUFFER�ADDRESS*ˆCALLS:CLRMSG‚SETPP3‚CKREAD*Ž0�1�2�3�4�5�6�7*ˆREGS:D *�A‚PƒRƒP>**************************************************************FKEYSTUP EQU */‰LEA�OUTBUF-DATASG(A5),A3‚OUTPUT�BUFFER�ADDRESS‰BSRƒCLRMSG…BUILD�MESSAGE�CLEAR'‰TST.B�CURMODE-DATASG(A5)ƒIN�PAGE�MODE?$‰BNE.S�FKEY10ƒBRANCH�IF�IN�PAGE�MODE;‰BSR.S�SETPP3…IN�COMMAND�MODE,MUST�SET�PAGE�MODE�PROTECTION,FKEY10ƒTST.B�CRTCHG(A1)�A�FILE�CHANGE�TO�DO?!‰BEQ.S�FKEY30�BRANCH�IF�NO�CHANGE7‰MOVE.B�#1,FSTSW-DATASG(A5)�A�CHANGE,�TURN�OFF�NEW�FLAG‰BSR�CKREADˆGO�UPDATE�THE�FILEFKEY20ƒRTS‘RETURN1FKEY30ƒTST.L�MAXLINE-DATASG(A5)�ANY�FILE�RECORDS?(ˆBMI�FKEY20�BRANCH�IF�NO,NO�FILE�RECORDS;ˆMOVE.B�#1,FSTSW-DATASG(A5)�HAVE�RECORDS,�TURN�OFF�NEW�FLAGˆBRA�FKEY20�AND�RETURNˆPAGE>***************************************************************0*ˆSETPP3‚BUILD�PAGE�PROTECTION�CODES�INTO�BUFFER*ˆPOINTED�TO�BY�A3.*>**************************************************************,SETPP3‚MOVE.B�#TOPDIS,(A3)+�TOP�DISPLAY�CODEˆMOVE.B�#POSONE,(A3)+�LINE�1)ˆMOVE.B�#BOTDIS,(A3)+�BOTTOM�DISPLAY�CODEˆMOVE.B�#LINE20,(A3)+�LINE�20(ˆMOVE.B�#LEFTDIS,(A3)+�LEFT�DISPLAY�CODEˆMOVE.B�#COLTWO,(A3)+�COLUMN�2 ˆRTSˆRETURN***>***************************************************************3*ˆSETCP3‚BUILD�COMMAND�PROTECTION�CODES�INTO�BUFFER*ˆPOINTED�TO�BY�A3.*>**************************************************************/SETCP3ƒMOVE.B�#BOTDIS,(A3)+�BOTTOM�DISPLAY�CODE‰MOVE.B�#LINE22,(A3)+�LINE�22&‰MOVE.B�#TOPDIS,(A3)+�TOP�DISPLAY�CODE ‰MOVE.B�#LINE22,(A3)+�LINE�22(‰MOVE.B�#LEFTDIS,(A3)+�LEFT�DISPLAY�CODE‰MOVE.B�#COLTWO,(A3)+�COLUMN�2)‰MOVE.B�#WRTABS,(A3)+�WRITE�ABSOLUTE�CODE&‰MOVE.B�#STRT,(A3)+�START�OF�DATA�CODE‰MOVE.B�#LINE22,(A3)+�LINE�22‰MOVE.B�#POSONE,(A3)+�COLUMN�1#‰MOVE.B�#PROMPT,(A3)+�PROMPT�SYMBOL%‰MOVE.B�#ENDOD,(A3)+�END�OF�DATA�CODE'‰MOVE.B�#LOADCUR,(A3)+�LOAD�CURSOR�CODE‰MOVE.B�#LINE22,(A3)+�LINE�22‰MOVE.B�#COLTWO,(A3)+�COLUMN�2 ‰RTS�RETURN‰PAGE?****************************************************************%*ˆCLRMSG‚CLEAR�ANY�MESSAGE�ON�LINE�215*ˆBUILDS�THE�OUTPUT�INTO�THE�BUFFER�POINTED�TO�BY�A3.*?***************************************************************/CLRMSG MOVE.B #WRTABS,(A3)+ WRITE ABSOLUTE CODE&‰MOVE.B�#STRT,(A3)+�START�OF�DATA�CODE‰MOVE.B�#LINE21,(A3)+�LINE�21‰MOVE.B�#POSONE,(A3)+‚COLUMN�1"‰MOVE.L�#34,D0�MESSAGE�LINE�LENGTH.CLRMSG10 MOVE.B #BLANK,(A3)+ BLANK TO THE LINE‰SUB.L�#1,D0�DECREMENT�COUNTER"‰BNE.S�CLRMSG10�BRANCH�TIL�BLANKED%‰MOVE.B�#ENDOD,(A3)+�END�OF�DATA�CODE‰RTS‰PAGE@*****************************************************************6*ˆEOFMSG3�BUILD�END�OF�FILE�MESSAGE�INTO�OUTPUT�BUFFER9*ˆAND�REPOSITION�CURSOR�IF�EITHER�LAST�LINE�OR�FIRST�LINE*ˆOF�FILE�IS�ON�THE�SCREEN. *ˆENTRY:A3=OUTPUT�BUFFER�ADDRESS*Ž0�1�2�3�4�5�6�7 *ˆREGS:D*�* *�A‚PƒR�*�P*?***************************************************************0EOFMSG3�TST.L�TOPLINE-DATASG(A5)‰AT�TOP�OF�FILE?‰BEQ.S�EOFM10�BRANCH�IF�YES3‰MOVE.L�TOPLINE-DATASG(A5),D0�GET�TOP�RECORD�NUMBER,‰ADD.L�#FULSCRN,D0�ADD�IN�FULL�SCREEN�OFFSET/‰CMP.L�MAXLINE-DATASG(A5),D0�SEE�IF�WITHIN�FILE$‰BLE.S�EOFMRTS�BRANCH�IF�WITHIN�FILE**ˆBUILD�THE�OUTPUT�MESSAGE*0EOFM10 LEA FMSG200-DATASG(A5),A4 MESSAGE ADDRESS‰MOVE.L�#22,D0�MESSAGE�LENGTH)‰MOVE.B�#WRTABS,(A3)+�WRITE�ABSOLUTE�CODE&‰MOVE.B�#STRT,(A3)+�START�OF�DATA�CODE‰MOVE.B�#LINE21,(A3)+�LINE�21‰MOVE.B�#POSONE,(A3)+�COLUMN�1!‰MOVE.L�#34,D1�MAX�MESSAGE�LENGTH#‰SUB.L�D0,D1�#�BYTES�BEYOND�MESSAGE2EOFM20ƒMOVE.B�(A4)+,(A3)+�MESSAGE�TO�OUTPUT�BUFFER‰SUB.L�#1,D0�DECREMENT�COUNTER"‰BNE.S�EOFM20�BRANCH�TIL�MOVED�ALL‰TST.L�D1�ANY�EXTRA�BYTES?‰BLE.S�EOFM40�BRANCH�IF�NO:EOFM30ƒMOVE.B�#BLANK,(A3)+�BLANK�FILL�REST�OF�MESSAGE�LINE‰SUB.L�#1,D1�DECREMENT�COUNTER ‰BNE.S�EOFM30�BRANCH�TIL�BLANKED+EOFM40‚MOVE.B�#ENDOD,(A3)+�END�OF�DATA�CODE*/*ˆREPOSITION�CURSOR-FIXUP�CURRENT�RECORD�NUMBER*‰CLR.L�D0�CLEAR�FOR�USE.‰MOVE.B�CRTLINE(A1),D0�GET�CURRENT�LINE�NUMBER$‰SUB.B�#POSONE,D0�STRIP�ASCII�OFFSET2‰ADD.L�TOPLINE-DATASG(A5),D0�CURRENT�RECORD�NUMBER@‰SUB.L�MAXLINE-DATASG(A5),D0�SEE�IF�WITHIN�FILE-OFFSET�ON�SCREEN$‰BLE.S�EOFMRTS�BRANCH�IF�WITHIN�FILE3‰SUB.B�D0,CRTLINE(A1)�REPOSITION�CURSOR�LINE�NUMBER:‰SUB.L�D0,FILELINE-DATASG(A5)ƒUPDATE�CURRENT�RECORD�NUMBER*‰TST.B�CURMODE-DATASG(A5)‡IN�COMMAND�MODE?‰BEQ.S�EOFMRTS�BRANCH�IF�YES5‰MOVE.B�#LOADCUR,(A3)+�IN�PAGE�MODE,REPOSITION�CURSOR'‰MOVE.B�CRTLINE(A1),(A3)+�SCREEN�LINE�#&‰MOVE.B�CRTCOL(A1),(A3)+�COLUMN�NUMBEREOFMRTS RTS RETURN‰PAGE=**************************************************************3*ˆDOOUT-OUTPUT�SCREEN�BUFFER�BUILT�BY�FUNCTION�KEYS*ˆAND�CURSOR�MOVEMENT�KEYS)*ˆENTRY:A3=END�ADDRESS+1�OF�OUTPUT�BUFFER*‘OUTBUF=START�ADDRESS*>**************************************************************$DOOUT MOVE.L A3,D3 GET END ADDRESS+15‰LEA�OUTBUF-DATASG(A5),A2�GET�START�ADDRESS�OF�BUFFER$‰SUB.L�A2,D3�STRIP�THE�START�ADDRESS*‰BEQ.S�DOOUT10�BRANCH�IF�NOTHING�TO�OUTPUT.‰CRT.OUT�CRTIOS,OUTBUF,D3�DO�THE�SCREEN�OUTPUT%‰BNE�EDITERROR�BRANCH�IF�AN�I/O�ERRORDOOUT10‚RTS�RETURN‰PAGE?*************************************************************** *3*‡SEND�PAGE‚TERMINATING�CHARACTER�IS�SEND�PAGE($D9)-*’DATA�ENTERED�ON�LAST�LINE�OF�VIRTUAL�SCREEN/*’DISPLAY�AND�LAST�CHARACTER�POSITION�AND�TYPED.*’A�CARRIAGE�RETURN�OR�LINE�FEED�IS�SENT�HERE..*’ALL�LINES�SCROLLED�UP�1�LINE�AND�BOTTOM�LINE *’BLANKED.*‡REV�1.00‚1-3-80‚(C313)2*‡REV�2.00‚8/26/80�(C313)�CHANGED� TO�DO�PROCEED�IO,*‘WHILE�DOING�FILE�UPDATES.�USES�CRTLS�CODE.*‡EXITS:READCMD*@***************************************************************** PAGE„EQU‚*9ˆTST.B�CURMODE-DATASG(A5)‚IN�COMMAND�MODE?USES�CRTLS�CODE&ˆBEQ�READCMD„BRANCH�IF�IN�COMMAND�MODE)ˆADD.L�#1,TOPLINE-DATASG(A5)�BUMP�TOPLINE*"* USE CRTLS CODE FOR REST OF STUFF*ˆPAGE@*****************************************************************2*…CARRIAGE�RETURN‚TERMINATING�CHARACTER�IS�LS($DF))*ŽMOVE�CURSOR�DOWN�1�LINE�AND�TO�COLUMN�1)*ŽINSERT�BLANK�LINE�TO�SCREEN�AND�TO�FILE*�SCREEN�SCROLLED�UP�1�LINE*†REV�1.00‚12-3-79‚(C313)5*†REV�2.00‚8/26/80‚(C313)�DO�FILE�UPDATES�WHILE�DOING!*šSCREEN�UPDATES�USING�IO�PROCEED-*†USES:CRTN�FOR�PROCEED�IO�COMPLETION�ADDRESS*†CALLS:UPDATE„FIXSFCR*†EXITS:READCMD*ŒMAIN�PROGRAME********************************************************************* CRTLS‚EQU‚*0†TST.B‚CURMODE-DATASG(A5)�SEE�IF�IN�COMMAND�MODE†BEQ‚READCMDˆBRANCH�IF�YES/†LEA…CRFLAG-DATASG(A5),A2ƒGET�FLAG�BYTE�ADDRESS!†CLR.B�(A2)ŠCLEAR�IT�FOR�THIS�USE3‡MOVE.L�MAXLINE-DATASG(A5),D1�GET�#�RECORDS�IN�FILE:‡CMP.L�FILELINE-DATASG(A5),D1�SEE�IF�ADDING�TO�END�OF�FILE.‡BLE.S�CRTLS10�BRANCH�IF�ADDING�TO�END�OF�FILE ‡BSET�#INSF,(A2)�SET�INSERT�FLAG/‡MOVE.B�CRTERM(A1),D1�GET�TERMINATING�CHARACTER"‡CMP.B�#$D9,D1�PAGE�INSTEAD�OF�CR?5‡BEQ.S�CRTLS10�BRANCH�IF�PAGE,NO�BLANK�LINE�TO�SCREEN5‡BSET�#FIXSF,(A2)�SET�FIX�SCREEN�FLAG-USED�BY�FIXSFCR-CRTLS10 TST.B CRTCHG(A1) A FILE CHANGE TO DO?"‡BEQ.S‚CRTLS20…BRANCH�IF�NO�CHANGE$‡TST.B�EMTYFILE-DATASG(A5)…NEW�FILE?$‡BEQ.S‚CRTLS15…BRANCH�IF�NO,OLD�FILE)‡BSET�#INSF,(A2)„NEW�FILE-SET�INSERT�LINE!‡BRA.S�CRTLS25†GO�TAKE�CARE�OF�IT-CRTLS15�BSET�#REPF,(A2)„SET�FILE�REPLACE�FLAG2CRTLS20�BSET�#BLKF,(A2)ƒSET�INSERT�BLANK�LINE�FLAG%ˆBSET�#INSF,(A2)„SET�INSERT�FLAG�ALSOJCRTLS25 BSR FIXSFCR SETUP SCREEN FIX-UP STUFF-RETURNS A3=END ADR OF BUFFER7‡LEA�CRTIOP-DATASG(A5),A0�PROCEED�IO�PARA�BLOCK�ADDRESS+‡MOVE.L�#$56,IOSLEN(A0)�RESET�PACKET�LENGTH7‡MOVE.L�A3,IOSEAD(A0)‚RETURNED�END�ADR�OF�OUTPUT�BUFFER'‡TST.B�BRKFLG-DATASG(A5)�A�BREAK�INPUT?4‡BNE.S�CRTLS27�BRANCH�IF�YES,DON'T�DO�THE�SCREEN�I/O'‡BSET�#CRF,(A2)�SET�CARRIGE�RETURN�FLAG‡TRAP�#2ŒGO�DO�PROCEED�IO‡BNE�EDITERROR†ERROR�RETURN3CRTLS27�BSET�#FILEF,(A2)ƒSET�DOING�FILE�UPDATE�FLAG&ˆBTST�#REPF,(A2)„NEED�TO�DO�A�REPLACE?&ˆBEQ.S�CRTLS30�BRANCH�IF�NO,NO�REPLACE/ˆMOVE.B�#REPLCMD,D1�SET�FOR�FMS�REPLACE�COMMANDˆBSR�UPDATE�GO�DO�THE�REPLACE-CRTLS30�BTST�#BLKF,(A2)ƒINSERT�A�LBLANK�LINE?,ˆBEQ.S�CRTLS50‚BRANCH�IF�NO-NOT�A�BLANK�LINE$ˆTST.B�EMTYFILE-DATASG(A5)‚NEW�FILE?$ˆBEQ.S�CRTLS35�BRANCH�IF�AN�OLD�FILE3ˆBCLR�#BLKF,(A2)ƒNEW�FILE,DON'T�INSERT�A�BLANK�LINE(ˆBRA.S�CRTLS50‚GO�DO�REST�OF�FILE�CHANGE*ˆDISPLAY�CURSOR�POSITION�ON�LINE�24�OF�SCREEN�(CRT�MODE�ONLY)*O*******************************************************************************ICURPSN MOVE.L FILELINE-DATASG(A5),D0 CURRENT FILE POSITION POINTER 0119858‡ADD.L�#1,D0�CORRECT�SINCE�LINES�START�AT�1�NOT�0�011985*CCURPSN10 LEA CURPSNA-DATASG(A5),A3 ADDR IN MSG BLOCK FOR CURSOR PSN0‰BSR�CNVTHA�CONVERT�HEX�(D0)�TO�ASCII(A3)�011985D‰CRT.OUT�CRTIOS,CURMSG,#CURMSGL�OUTPUT�CURRENT�CURSOR�PSN�TO�LINE�24 ‰RTS‚011985 PAGEO******************************************************************************** SUBROUTINE NAME: FMS#*�REV�1.00‚12/14/79‚(SANDY�DEARING)F* FUNCTION: SET UP FMS PACKET FOR FMSINT CALL, MAKE THE CALL AND CHECK*‹ERROR�RETURNS..* CALLING SEQUENCE: A0 = POINTER TO FMS PACKET*ŒFMSCMD(A0)=�COMMAND�CODE$* RETURN: A0 = POINTER TO FMS PACKET*‰D0�=�0�=�NO�ERROR!* REGISTERS USED: 0 1 2 3 4 5 6 7*�DƒR�P�P�*�*�*�**�AƒP�P�P�P�P�P�R:*�SUBROUTINES�CALLED:�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 CODEA�LEA…FMSTABLE-DATASG(A5),A1�GET�ADDR�OF�VALID�FMS�CMD�CODES�TABLE5�LEA…FMSTBLND-DATASG(A5),A2�END�ADDRESS�OF�CODE�TABLE-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,D0�MULTIPLY�BY�4-OFFSET�INTO�BRANCH�TABLE/‡LEA�FMSBRAT(PC),A1�GET�ADDRESS�OF�BRANCH�TABLE JMP (A1,D0) GO DO IT!**ˆBRANCH�TABLE�FOR�FMS�ROUTINES* FMSBRAT‚EQU‚*‰BRA�FMSOPN‚OPEN�COMMAND‰BRA�FMSVCL‚CLOSE�COMMAND‰BRA�FMSRDƒREAD�COMMAND‰BRA�FMSDEL‚DELETE�COMMAND"‰BRA�FMSIRP‚INSERT-REPLACE�COMMAND"‰BRA�FMSIRP‚INSERT-REPLACE�COMMAND%‰BRA�FMSRCH‚SEARCH�FOR�STRING�COMMAND‰BRA�FMSPRNT�PRINT�COMMAND‰BRA�FMSSAV‚SAVE�COMMAND‰BRA�FMSMRG‚MERGE�COMMAND‰BRA�FMSMOV‚MOVE�COMMAND‰BRA�FMSEXT‚EXTRACT�COMMAND*‰BRA�FMSDEXT�DELETE�EXTRACT�BUFFER�COMMAND‰BRA�FMSCKPT�CHECKPOINT�COMMAND‰PAGE**‚FMS�OPEN�ROUTINE<* SET UP DEFAULT VALUES IN FHS INPUT BLOCK AND CALL EDITFILE*:FMSOPNƒLEA…CMDBUF-DATASG(A5),A0�GET�ADDR�OF�INPUT�FILENAME2�LEA…INFHS-DATASG( A5),A6�GET�ADDR�OF�INPUT�FHS�BLK6�LEA…EDITVOLN-DATASG(A5),A4ˆGET�DEFAULT�VOLUME�ADDRESS5 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, ERROR�BSR…SETNMƒGO�SAVE�FILE�NAME9�TST.L�SAVOTADD-DATASG(A5)„WAS�OUTPUT�FILENAME�SPECIFIED?, 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, ERROR�BSR‚SETNM�GO�SAVE�FILE�NAME*@* 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 D40�LEA…FMSPKT-DATASG(A5),A0�GET�ADDR�OF�FMS�PACKET6 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 ANOTHERHFMSLUN30�MOVE.B�D5,MSLUN-DATASG(A5)‚SAVE�LUN�FOR�MERGE�AND�SAVE�COMMANDS6�CLR.B�FILEOPT-DATASG(A5)ŒCLEAR�FILE�OPTIONS�FLAG�BYTE7�MOVE.B‚#$11,FMSOTRTN-DATASG(A5)ƒSET�UP�DEFAULT�OPTIONS2�TST.L�SAVOPTAD-DATASG(A5)‹WERE�ANY�OPTIONS�INPUT?$ BEQ.S FMSOPN41 NO, LEAVE AT DEFAULT2 MOVE.L SAVOPTAD-DATASG(A5),A1 GET ADDR OF OPTIONS*A*‚GET�OPTIONS�AND�SET�BIT�MAP�IN�FMSOTRTN�ACCORDINGLY‚DEFAULT=$11* MOVE.L #0,A2 CLEAR FOR USE MOVE.B #4,D1 OPTION COUNTER! MOVE.B #'S',D2 SEQUENTIAL OPTION�MOVE.B�#'I',D3‚INDEXED�OPTION1FNDOPTS 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 DEFAULTS4SEQFND�ADD.B�#1,FMSOTRTN-DATASG(A5)ƒMAKE�SEQ�FOR�FMS7SEQFND05�ADD.B�#1,FILEOPT-DATASG(A5)‚TURN�ON�FOUND�FLAG!�BRA.S�FMSOPN35‚NO�MORE�TO�SEARCH8INDFND�ADD.B�#3,FMSOTRTN-DATASG(A5)ƒMAKE�INDEXED�FOR�FMS BRA SEQFND05 GO SET FLAGS6FMSOPN35‚MOVE.L�SAVOPTAD-DATASG(A5),A1�RESTORE�POINTER1 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 MORE4�MOVE.L�(A3),SAVOPTAD-DATASG(A5)†STORE�OPTIONS�FOUND! MOVE.L #4,D1 SEARCH FOR K OPTION+ LEA SAVOPTAD-DATASG(A5),A3 OPTIONS ADDRESS4�CLR.B�FILEOPT-DATASG(A5)ˆCLEAR�IN�CASE�NOT�K�OPTION"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 OPTION6FMSK10�MOVE.B�#1,FILEOPT-DATASG(A5)„SET�USING�K�OPTION6�BSET�#3,FMSOTRTN-DATASG(A5)‹TURN�ON�K�OPTION�FOR�OPEN8FMSOPN41 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 ERRORA�MOVE.L�FMSREC(A0),MAXLINE-DATASG(A5)‡SAVE�LAST�LOG�REC�#�IN�FILE+�CMP.B‚#-1,FMSTAT(A0)†SEE�IF�NOT�CONTINUING�BEQ.S�FMSEDIT3†NOT,EXIT�EDITOR,�CLR.B�FILETYPE-DATASG(A5)‡SET�OLD�FILE�FLAG- CMP.B #FSTADNM,FMSTAT(A0) IS INPUT FILE OLD?"�BEQƒFMSEXIT�YES,�OLD�FILE�FLAG�OK- 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 CALLER8FMSOPN40�MOVE.B�#1,FILETYPE-DATASG(A5)„SET�NEW�FILE�FLAG0�TST.B�FILEOPT-DATASG(A5)ƒNEW�FILE�AND�K�OPTION?! 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**ƒFMS�DONT�CONTINUE�RETURN*#FMSEDIT3‚EQU‚*‡DONT�CONTINUE�RETURN,‰MOVEM.L‚(A7)+,D1-D2/A0-A6ƒRESTORE�REGISTERS&‰LEA‚STACK-DATASG(A5),A7�RESTORE�STACK‰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*�FMS�READ�ROUTINE‚D1=FIRST�RECORD�#�TO�READ‚D6.W=#�OF�RECORDS�TO�READ* FMSRD EQU *6 MOVE.L D1,FMSREC(A0) SET LOG REC # OF 1ST REC TO READ(�MOVE.W�D6,FMSRECN(A0)ƒ#�RECORDS�TO�READ- 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)…DID�FMS�FIND�ERRORS?$‚BEQ‚FMSEXIT‰NOP,CONTINUE�PROCESSING$‚CMP.B�#ISTABO,FMSTAT(A0)�TRUNCATED?$‚BEQ�FMSEXIT�BRANCH�IF�YES,THAT'S�OK+‚CMP.B‚#ISTARN,FMSTAT(A0)‚WAS�RECORD�FOUND?"�BEQ.S‚FMSRD50‚NO,RECORD�NOT�FOUND1 CMP.B #ISTAEOF,FMSTAT(A0) WAS END OF FILE FOUND?�BEQ�FMSEXIT‚BRANCH�IF�YES0‚CMP.B‚#RDCMD,FMSCMD(A0)‚IS�THIS�A�READ�COMMAND?$‚BEQ‚FMSER70‚YES,GO�PRINT�READ�ERROR"‚BRA‚FMSER80‚GO�PRINT�DELETE�ERROR/FMSRD50 CMP.B #RDCMD,FMSCMD(A0) IS THIS A READ? BNE FMSER100 NO, GO TO ERROR'�TST.B�FILETYPE-DATASG(A5)„IS�FILE�NEW?, BNE.S FMSRD60 YES,GO CHECK FOR ZERO RECORDS,�TST.B�EMTYFILE-DATASG(A5)…IS�FILE�EMPTY�OLD& BNE FMSEXIT YES,1ST READ OF EMPTY OLD7FMSRD60‚CMP.W�#0,FMSRECN(A0)�WERE�ZERO�RECORDS�READ�IN? BNE FMSER100 NO, GO TO ERROR2 BRA FMSEXIT 1ST READ OF NEW FILE, DON'T PRINT MSG*.*�FMS�DELETE�ROUTINEƒD6.W=�#�RECORDS�TO�DELETE* 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@FMSIRP05�MOVE.L�D0,FMSREC(A0)‚LOG�REC�#�OF�REC�TO�REPL�OR�INSERT- 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.B�FMSTAT(A0)‚DID�FMSINT�FIND�ANY�ERRORS?#�BEQ„FMSEXITƒNO,GO�RETURN�TO�CALLER+‚CMP.B‚#ISTARN,FMSTAT(A0)ƒWAS�RECORD�FOUND?!ƒBEQ‚FMSER100„NO,RECORD�NOT�FOUND3 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.B�FMSBRK(A0)ŽCLEAR�THE�BREAK�FLAG-‡LEA�EDITBUF-DATASG(A5),A1…GET�BUFFER�ADDRESS8‡MOVE.L‚A1,FMSBUF(A0)ƒBUFFER�ADDRESS�FOR�RETURNED�STRINGB‡MOVE.L‚REC-DATASG(A5),FMSREC(A0)ƒLOGICAL�RECORD�#�TO�START�SEARCH7‡MOVE.W‚RECN-DATASG(A5),FMSRECN(A0)†#�RECORDS�TO�SEARCH;‡MOVE.B‚TRANS-DATASG(A5),FMSTRANS(A0)„TRANSPARENT�CHARACTERA‡MOVE.B‚COUNT-DATASG(A5),FMSCNT(A0)†COUNT(#�TRIMES�STRING�IN�REC)>‡MOVE.L‚RADR-DATASG(A5),FMSADR(A0)‡POINTER�TO�STRING�ADDRESSES‡BSR‚FMSINT“DO�THE�SEARCH&‡BNE‚FMSER250‘BRANCH�IF�ERROR�RETURNED5‡CMP.B‚#ISTARN,FMSTAT(A0)…1ST�RECORD�TO�SEARCH�FOUND? ‡BEQ‚FMSER100‘BRANCH�IF�NO-ERROR‡BRA‚FMSEXIT’EVERYTHING�OK-EXIT*5*ƒFMS�SAVE�ROUTINE-SAVE�FILE�INTO�NEW�OUTPUT�FILENAME* 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,D0�FILE�ALREADY�EXISTS?$ 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*.*‚FMSMRG�MERGE�AN�EXISTING�FILE�INTO�THIS�FILE* FMSMRG�EQU‚*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*‚FMSMOV�PUT�REQUESTED�DATA�INTO�AN�EXTRACT�BUFFER* FMSMOV�EQU‚*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 MOVEE�MOVE.B�COUNT-DATASG(A5),FMSCNT(A0)‚SET�FLAG�FOR�APPEND�OR�NOT�APPEND 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‚BRANCH�IF�ONLY�PART�EXTRACTED$ CMP.B #2,FMSTAT(A0) NONE EXTRACTED?& BEQ FMSER650 BRANCH IF NONE EXTRACTED% BRA.S FMSPRT05 GO CHECH OTHER ERRORS*2*‚FMSEXT�MOVE�DATA�FROM�EXTRACT�BUFFER�TO�FILELINE* 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*#*‚FMSDEXT�DELETE�THE�EXTRACT�BUFFER*,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*$*‚FMSPRNT�PRINT�FILE�TO�LINE�PRINTER*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�-�CHECK�POINT,SAVE�OUTPUT�FILE�AND�CONTINUE�EDITING* 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.W�CHKPCT-DATASG(A5),D1�GET�#�RECORDS�UPDATED�SO�FARˆCMP.W�#25,D1�SEE�IF�25�YET$ˆBLT.S�FMSEXIT1�BRANCH�IF�NOT�25�YET2ˆMOVE.W�(A0),-(A7)�SAVE�CURRENT�STATUS�AND�COMMAND.ˆMOVE.W�FMSRECN(A0),-(A7)�SAVE�THIS�FIELD�ALSO ˆMOVE.L�D0,-(A7)�SAVE�CURRENT�D0+ˆMOVE.B�#CKPTCMD,FMSCMD(A0)�DO�A�CHECKPOINT#ˆBSR�FMSINT�DO�IT,IGNORE�ANY�ERRORS.ˆCLR.W�CHKPCT-DATASG(A5)‚CLEAR�CURRENT�COUNTERˆMOVE.L�(A7)+,D0�RESTORE�D0,ˆMOVE.W�(A7)+,FMSRECN(A0)�RESTORE�THIS�FIELD-ˆMOVE.W�(A7)+,(A0)�RESTORE�COMMAND�AND�STATUS?FMSEXIT1 MOVEM.L (A7)+,D1-D2/A0-A6 RESTORE REGISTERS FROM STACK* TST.L D0 RESET CONDITION CODES FOR RETURN�RTS‚RETURN�TO�CALLER 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.B�FMSCMD(A0),FMSGE10-DATASG(A5)ˆSET�ILLEGAL�CODE�IN�MSG" 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‚ERROR�ADDRESS$FMSER35�BSR‚GETERR‚PUT�D0�IN�MESSAGE 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*FMSER340�LEA‚FMSG62-DATASG(A5),A0�ERROR�MESSSAGE-NO�DISK�SPACE MOVE.L #24,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN>FMSER360�LEA…FMSG360-DATASG(A5),A0�ERROR�MESSAGE-SAVE�NOT�DONE MOVE.L #28,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN;FMSER380‚LEA…FMSG380-DATASG(A5),A0�ERROR�M ESSAGE-MOVE�ERROR MOVE.L #32,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN=FMSER400�LEA…NOBUF-DATASG(A5),A0�NOBUFFER�MESSAGE�FOR�EXTRACT MOVE.L #28,D0 LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN5FMSER440�LEA…MESSNR-DATASG(A5),A0�PRINT�ERROR�MESSAGE' MOVE.L #18,D0 LENGTH,PRINTER NOT READY' BRA FMSER310 OUTPUT MESSAGE AND RETURN6FMSER460�LEA…MESSDB-DATASG(A5),A0�PRINTER�BUSY�MESSAGE MOVE.L #12,D0 LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN@FMSER500�LEA…NOFILE-DATASG(A5),A0�MERGE�ERROR-FILE�DOESN'T�EXIST MOVE.L #18,D0 MESSAGE LENGTH' BRA FMSER310 OUTPUT MESSAGE AND RETURN,FMSER520�LEA…NOMRG-DATASG(A5),A0�MERGE�ERROR 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 LENGTHE�MOVE.W�FMSRECN(A0),FMSG410E-DATASG(A5)†SAVE�NEW�EXTENSION�FOR�OUTPUT* BRA FMSER310 GO OUTPUT MESSAGE AND RETURNIFMSER600�MOVE.B�#-1,TRUN-DATASG(A5)ƒSET�TRUNCATE�FLAG,REALLY�NOT�AN�ERROR 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:D0�CONTAINS�SCREEN�LINE�NUMBER�FOR�BOTTOM�DISPLAY�LINE**„EXIT:GOOD�RETURN-TO�CALLER*‰ERROR�RETURN-EDITERROR**„USES:�0�1�2�3�4�5�6�7*‡D *‡A‚*ƒ*…P*F**************************** ******************************************* SETPROP‚EQU‚*/‰LEA‚OUTBUF-DATASG(A5),A2‡OUTPUT�BUFFER�ADDRESS%‰MOVE.B‚#TOPDIS,(A2)+„SET�TOP�DISPLAY‰MOVE.B�#POSONE,(A2)+…LINE�1-‰MOVE.B�#BOTDIS,(A2)+…SET�BOTTOM�DISPLAY�CODE%‰MOVE.B�D0,(A2)+ŠCODE�FOR�BOTTOM�LINE,‰MOVE.B‚#LEFTDIS,(A2)+ƒSET�LEFT�DISPLAY�CODE‰MOVE.B‚#COLTWO,(A2)…COLUMN�22‰CRT.OUT‚CRTIOS,OUTBUF,#6„OUTPUT�SCREEN�PROTECTION‰BNE‚EDITERROR�ERROR�RETURN ‰RTS�RETURN‰PAGEE**********************************************************************%*ƒSETPROC‚SET�COMMAND�MODE�PROTECTION)*ŒSETS�VIRTUAL�SCREEN�TO�LINE�22-COLUMN�2/*ŒPUTS�CURSOR�THERE�AND�PUTS�PROMPT�IN�COLUMN�13*ŒOF�LINE�22.�DOES�NOT�CHANGE�POSITION�OF�PROMPT�IN *ŒLINES1-20.*ƒCALLS:CRTOUT*ƒEXIT:GOOD�RETURN-TO�CALLER*ˆERROR�RETURN-EDITERROR**ƒUSES:0�1�2�3�4�5�6�7*†D�* *†A�*ƒ*…P*F********************************************************************** SETPROC‚EQU‚*/‰LEA‚OUTBUF-DATASG(A5),A2†OUTPUT�BUFFER�ADDRESS-‰MOVE.B‚#BOTDIS,(A2)+‚SET�BOTTOM�DISPLAY�CODE$‰MOVE.B‚#LINE22,(A2)+‚SCREEN�LINE�22*‰MOVE.B‚#TOPDIS,(A2)+‚SET�TOP�DISPLAY�CODE$‰MOVE.B‚#LINE22,(A2)+‚SCREEN�LINE�22,‰MOVE.B‚#LEFTDIS,(A2)+‚SET�LEFT�DISPLAY�CODE‰MOVE.B‚#COLTWO,(A2)+ƒCOLUMN�2)‰MOVE.B‚#WRTABS,(A2)+ƒWRITE�ABSOLUTE�CODE&‰MOVE.B‚#STRT,(A2)+…START�OF�DATA�CODE$‰MOVE.B‚#LINE22,(A2)+ƒSCREEN�LINE�22%‰MOVE.B‚#POSONE,(A2)+ƒSCREEN�COLUMN�1!‰MOVE.B‚#PROMPT,(A2)+ƒPROMPT�CODE*‰MOVE.B‚#ENDOD,(A2)+„END�OF�WRITE�ABSOLUTE'‰MOVE.B‚#LOADCUR,(A2)+ƒLOAD�CURSOR�CODE‰MOVE.B‚#LINE22,(A2)+ƒLINE�22‰MOVE.B‚#COLTWO,(A2)„COLUMN�2+‰CRT.OUT‚CRTIOS,OUTBUF,#15ƒOUTPUT�TO�SCREEN‰BNE‚EDITERROR�RETURN�IF�ERROR ‰RTS—RETURN‰PAGEE**********************************************************************3*„PUTP‚PUT�PROMPT�IN�COLUMN�1�TO�SCREEN�LINE�NUMBER*ŠCONTAINED�IN�D0*„REV.�1.00‚2-12-80‚(C313)*„CALLS:CRTOUT+*„ENTRY:D0=BYTE�SCREEN�LINE�#�IN�ASCII�CODE*„EXIT:GOOD�RETURN-TO�CALLER*‰ERROR�RETURN-EDITERROR*„USES:0�1�2�3�4�5�6�7*‡D�* *‡A�*ƒ*…P*F********************************************************************** PUTP‚EQU‚*/†LEA‚OUTBUF-DATASG(A5),A2‰OUTPUT�BUFFER�ADDRESS)†MOVE.B‚#WRTABS,(A2)+‚WRITE�ABSOLUTE�CODE&†MOVE.B‚#STRT,(A2)+„START�OF�DATA�CODE0†MOVE.B�SAVEP-DATASG(A5),(A2)+…OLD�PROMPT�LINE�#†MOVE.B�#POSONE,(A2)+ƒCOL�1!†MOVE.B�#BLANK,(A2)+…BLANK�IT�OUT%†MOVE.B�#ENDOD,(A2)+„END�OF�THIS�LINE.†MOVE.B�#WRTABS,(A2)+ƒWRITE�ABSOLUTE-NEXT�LINE&†MOVE.B�#STRT,(A2)+…START�OF�THIS�LINE#†MOVE.B‚D0,(A2)+‡SCREEN�LINE�NUMBER%†MOVE.B‚#POSONE,(A2)+ƒSCREEN�COLUMN�#!†MOVE.B‚#PROMPT,(A2)+ƒPROMPT�CODE.†MOVE.B‚#ENDOD,(A2)…END�OF�WRITE�ABSOLUTE�CODE,†MOVE.B�D0,SAVEP-DATASG(A5)‚SAVE�THIS�LINE�#+…CRT.OUT‚CRTIOS,OUTBUF,#12ƒOUTPUT�TO�SCREEN…BNE‚EDITERROR�BRANCH�IF�ERROR …RTS˜RETURN PAGEE**********************************************************************>*‚CLRP�RESET�PROMPT�COLUMN�1�TO�VIRTUAL�SCREEN�FOR�END�OF�EDIT'*‡RESET�VIRTUAL�SCREEN�TO�ENTIRE�SCREEND******************************************************************** 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)+‚TOP�DISPLAY�CODE#�MOVE.B�#POSONE,(A2)+ƒSET�TO�LINE�1)�MOVE.B�#BOTDIS,(A2)+ƒBOTTOM�DISPLAY�CODE"�MOVE.B�#LINE24,(A2)„SET�TO�LINE24*‚CRT.OUT�CRTIOS,OUTBUF,#6�OUTPUT�TO�SCREEN�RTS‚RETURN-IGNORE�ANY�ERRORS‚PAGEA******************************************************************+*‚CLRCOL1‚SEND�BLANKS�TO�COLUMN�1�ALL�LINES*‹FOR�INITIALIZING�THEE�SCREEN*A*****************************************************************CLRCOL1‚CLR.L�D2‚CLEAR�FOR�USE…MOVE.B�#POSONE,D2�START�LINE�#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‚SUBROUTINE�WRITE�MESSAGEA*†CRTMODE:�WRITE�ANY�VARIABLE�LENGTH�MESSAGE(MAX�LENGTH=34�BYTES)*�TO�LINE�21�OF�SCREEN/*†SCROLL�MODE:WRITE�ANY�VARIABLE�LENGTH�MESSAGE*†REV‚1.00‚1-3-80‚(C313)*†ENTRY:A0=ADDRESS�OF�MESSAGE*ŒD0=#�BYTES�OF�MESSAGE*†CALLS:CRTOUT*†USES:�0�1�2�3�4�5�6�7*‰D‚*�* *‰A‚*ƒ*…PE********************************************************************* WRTMESS‚EQU‚*(‰TST.B�SCROLL-DATASG(A5)…IN�SCROLL�MODE?(‰BMI.S�WRTMESS3�BRANCH�IF�IN�SCROLL�MODE/‰LEA‚OUTBUF-DATASG(A5),A2‹OUTPUT�BUFFER�ADDRESS*‰ADD.L‚#4,A2�BUMP�PAST�FIRST�CONTROL�BYTES-‰MOVE.L‚#34,D1ŒMAX�NUMBER�OF�BYTES�OF�MESSAGE-WRTMESS1‚MOVE.B�#BLANK,(A2)+„BLANKS�TO�BUFFER‰SUB.L‚#1,D1�DECREMENT�COUNT$‰BNE.S‚WRTMESS1ŠBRANCH�IF�MORE�TO�DO%‰MOVE.B‚#ENDOD,(A2)+…END�OF�DATA�CODE7‰LEAƒOUTBUF-DATASG(A5),A2ŠRESTORE�OUTPUT�BUFFER�ADDRESS)‰MOVE.B‚#WRTABS,(A2)+„WRITE�ABSOLUTE�CODE&‰MOVE.B‚#STRT,(A2)+†START�OF�DATA�CODE*‰MOVE.B‚#LINE21,(A2)+„SCREEN�LINE�#21�CODE+‰MOVE.B‚#POSONE,(A2)+„SCREEN�COLUMN�#1�CODECWRTMESS2‚MOVE.B‚(A0)+,(A2)+…MOVE�A�BYTE�OF�MESSAGE�TO�OUTPUT�BUFFER‰SUB.W‚#1,D0�DECREMENT�COUNT$‰BNE.S‚WRTMESS2ŠBRANCH�IF�MORE�TO�DO-‰CRT.OUT‚CRTIOS,OUTBUF,#39…OUTPUT�THE�MESSAGE!‰BNE‚EDITERRORŽBRANCH�IF�AN�ERROR‰RTS•GOOD�RETURN>WRTMESS3�MOVE.L�A0,IOSTART-DATASG(A5)‚START�ADDRESS�OF�MESSAGE 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 ADDRESS2�MOVE.L�A0,IOEND-DATASG(A5)„END�ADDRESS�OF�MESSAGE'�MOVE.W�#2,IOSOUT-DATASG(A5)„WRITE�CODE, LEA IOSOUT-DATASG(A5),A0 PARA BLOCK ADDRESS TRAP #2 DO THE OUTPUT BNE EDITERROR ERROR RETURN RTS GOOD RETURNƒPAGE?****************************************************************/*‚GETERR‚GET�ERROR�CODE�IN�D0,CONVERT�TO�ASCII,*ŠAND�PUT�INTO�OUTPUT�MESSSAGE.**‚REV�1.00�2/21/80�(C313)*‚ENTRY:D0=ERROR�CODE*ˆA3=ADDRESS�OF�WHERE�TO�PUT�D0*‚EXIT:TO�CALLER**‚USES:�0�1�2�3�4�5�6�7*…D‚*�**…Aˆ*ƒP*‚CALLS:CONV�(CONVERT�TO�ASCII)*@**************************************************************** GETERR�EQU‚*,‡MOVE.W�D0,SAVED0-DATASG(A5)„SAVE�LOWER�HALF‡LSR.L�#8,D0ŒMOVE�OVER‡LSR.L�#8,D0ŒMOVE�MORE‡BSR.S�CONV�CONVERT�TO�ASCII!‡MOVE.L�D0,(A3)+ˆSTORE�IN�MESSAGE‡CLR.L�D0ŽNEED�CLEAN+‡MOVE.W‚SAVED0-DATASG(A5),D0…GET�OTHER�HALF‡BSR.S�CONVŽCONVERT‚TO�ASCII‡MOVE.L�D0,(A3)ˆSTORE�THIS�PART ‡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‚COUNTERCONV1�CMP.B‚#9,D0ƒ0-9 †BLS.S�CONV2 †ADD.B‚#7,D0CONV2�ROR.L‚#8,D0 †SUB.L‚#1,D1 †BNE.S‚CONV1†ADD.L‚#$30303030,D0†RTS†PAGE?*****************************************************************ƒREADCMD‚READ�COMMAND�LINE(*ŒCURMODE=0‚SAVECHG�CONTAINS�CHANGE�FLAG5*ŒIF�SAVECHG=0�RETURN-MUST�HAVE�BEEN�CURSOR�MOVEMENT.-*ŒOTHERWISE,PARSE�THE�INPUT�COMMAND�AND�GO�TO*ŒTHE�CORRECT�ROUTINE.*ƒREV�1.00�12-3-79‚(C313)(*ƒENTRY:A1=START�ADDRESS�OF�INPUT�BUFFER-*ƒEXIT:TO�EACH�COMMAND,THEN�TO�MAIN�BY�AN�RTS"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER.*ˆA3=ADDRESS�OF�NEXT�CHARACTER�IN�INPUT�BUFFER*ˆD1=IF�NEXT�CHAR�IS�A�BLANK'*ˆD1=1�IF�NEXT�CHAR�IS�END�OF�DATA�FLAG*ƒCALLS:GETCMD„BLDCRT*‰WRTMESSƒCRTOUT*ƒUSES�TABLES:CMDTBL1 *�CMDTBL4*ƒUSES:0�1�2�3�4�5�6�7 *†D�*�*�*�*�**†A�*�*�*�*ƒP�*@**************************************************************** READCMD‚EQU‚*(‰TST.B�SCROLL-DATASG(A5)�IN�SCROLL�MODE?‰BMI.S�READCMD3�BRANCH�IF�YES*‰TST.B‚SAVECHG-DATASG(A5)ƒSEE�IF�ANY�INPUT‰BNE.S‚READCMD1ƒBRANCH�IF�INPUT.‰CMP.B�#'F',CURCMD-DATASG(A5)‚IN�FIND�COMMAND?‰BEQ�FIND220�BRANCH�IF�YESCMDEXTƒRTSŽRETURN-NOTHING�TO�DO/READCMD1 MOVE.L A1,A6 SAVE START BUFFER ADDRESS.‰CLR.B�CURCMD-DA  TASG(A5)„CLEAR�ANY�SET�COMMAND:�LEA…FMSDATA-DATASG(A5),A1�GET�START�ADDRESS�OF�INPUT�DATA1 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.OUT�CRTIOS,OUTBUF,D4�OUTPUT�TO�SCREEN 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„CLEAR�ANY�MESSAGE�ON�LINE21‰MOVE.L‚#4,D0…NUMBER�OF�BYTES‰BSR‚WRTMESS†GO�DO�THE�CLEAR/READCMD3�MOVE.L‚A1,A0…SAVE�INPUT�BUFFER�ADDRESS1‰ADD.L‚#CRTDATA,A0ƒPOINT�TO�ACTUAL�DATA�IN�BUFFER4‰ADD.L‚CRTLNG-DATASG(A5),A1…END�OF�INPUT�BUFFER�DATA‰CLR.L‚D0ŒCLEAR�FOR�LATER�USE$‰MOVE.L‚#0,A2ˆWILL�BE�RETURNED�VALUE&‰BSR‚GETCMDŠGO�GET�COMMAND�FROM�BUFFER‰TST.L‚D0‹GOT�A�COMMAND?‰BNE.S‚READCMD2†BRANCH�IF�YES‰RTS‚.�RETURN-NOTHING�TO�DO'READCMD2‚MOVE.L‚A0,A3‡SAVE�DATA�POINTER#‰CMP.L‚#1,D0‰SEE�IF�1�CHAR�RETURNED‰BGT.S‚READCMD6†BRANCH�IF�NOT�1‰CLR.L�D0�CLEAR�FOR�USE:‰LEA‚CMDTBL1-DATASG(A5),A0‡ADDRESS�OF�1�CHAR�COMMAND�TABLE0‰LEA‚CMDTBL1E-DATASG(A5),A4†END�ADDRESS�OF�TABLE‰ADD.L‚#$2000,A2…ADD�IN�A�BLANK'READCMD4‚CMP.W‚(A0),A2†LOOK�FOR�A�MATCH!ˆBEQ.S‚READCMD5‡BRANCH�IF�A�MATCH!ˆCMP.W�2(A0),A2ˆSEE�IF�LOWER�CASE!ˆBEQ.S‚READCMD5‡BRANCH�IF�A�MATCH&ˆADD.L‚#CMDTBL1L,A0ƒBUMP�TO�NEXT�ENTRYˆCMP.L‚A4,A0ƒPAST�END�OF�TABLE?&ˆBLT.S‚READCMD4‡BRANCH�IF�NOT�PAST�END)ˆBRA.S‚CMDERR‰DIDN'T�FIND�A�COMMAND-ERROR8READCMD5‚MOVE.W‚4(A0),D0„OFFSET�ADDRESS�OF�ROUTINE�TO�DO"READCMD9�LSL.L�#2,D0ŠMULTIPLY�BY�4'‰LEA‚CMDBRA(PC),A0ƒBRANCH�TABLE�ADDRESSˆJMP‚(A0,D0)�GO�DO�IT(READCMD6‚EQU‚*ŽSCAN�4�CHAR�COMMAND�TABLE+‰LEA‚CMDTBL4-DATASG(A5),A0…ADDRESS�OF�TABLE0‰LEA‚CMDTBL4E-DATASG(A5),A4…END�ADDRESS�OF�TABLE‰CLR.L�D0�CLEAR�FOR�USE'READCMD7‚CMP.L‚(A0),A2…LOOK�FOR�A�MATCH'ˆBEQ.S‚READCMD8†BRANCH�IF�FOUND�A�MATCH!ˆCMP.L�4(A0),A2‰SEE�IF�LOWER�CASE!ˆBEQ.S‚READCMD8†BRANCH�IF�A�MATCH&ˆADD.L‚#CMDTBL4L,A0ƒBUMP�TO�NEXT�ENTRYˆCMP.L‚A4,A0ƒPAST�END?ˆBLT.S‚READCMD7‡BRANCH�IF�NO#ˆBRA.S‚CMDERR‰INVALID�COMMAND-ERROR8READCMD8‚MOVE.W‚8(A0),D0„OFFSET‚ADDRESS�OF�ROUTINE�TO�DOˆBRA‚READCMD9‰GO�DO�IT!CMDERR‚EQU‚*�INVALID�COMMAND�HERE&ˆTST.B�CHAIN-DATASG(A5)�IN�CHAIN�MODE?'ˆBMI.S�CMDERR10�BRANCH�IF�IN�CHAIN�MODE ˆMOVE.L‚#6,D0‰#�BYTES�IN�MESSAGE)ˆLEA‚OUTERR-DATASG(A5),A0ˆMESSAGE�ADDRESS!ˆBSR‚WRTMESSŠOUTPUT�ERROR�MESSAGE ˆRTS’RETURN*0*ˆERROR�FOUND�DURING�CHAIN�MODE�-�TERMINATE�EDIT*BCMDERR10 LEA TERMCHN-DATASG(A5),A4 TERMINATE MESSAGE START ADDRESS9‰LEA�TERMCHNE-DATASG(A5),A6�TERMINATE�MESSAGE�END�ADDRESS.‰LEA�STACK-DATASG(A5),A7‚RESTORE�STACK�POINTER)‰BRA�EDITSAV‰CANNOT�CONTINUE,GO�TERMINATE‰PAGE**ˆCOMMAND�BRANCH�TABLE* CMDBRA EQU *‰BRA�ADUPLCTƒAPPEND�DUPLICATE‰BRA�AMOVE…APPEND�MOVE‰BRA�CHANGEŠCHANGE‰BRA�COLMŒCOLUMN‰BRA�DELETEŠDELETE‰BRA�DOWNŒDOWN‰BRA�DTABŒDELETE�TAB�STOP‰BRA�DUPLCTŠDUPLICATE‰BRA�EXTENDŠEXTEND‰BRA�FINDŒFIND‰BRA�INSERTŠINSERT‰BRA�LINEC‹LINE‰BRA�LISTŒLIST‰BRA�MERGE‹MERGE‰BRA�MOVEŒMOVE‰BRA�PRINT‹PRINT‰BRA�QUITŒQUIT‰BRA�RANGE‹RANGE‰BRA�SAVEŒSAVE‰BRA�STABŒSET�TAB�STOP‰BRA�VERIFYŠVERIFY‰BRA�TAB�SET�TAB�STOP‰BRA�XTRACTŠEXTRACT ‰BRA�UPŽUP PAGE@*****************************************************************@*‚CHANGE�COMMAND�ROUTINE--FIND�A�STRING�AND�CHANGE�TO�NEW�VALUE.*‚REV�1.00�4/2/80�(C313)/*‚ENTRY:D1=0�IF�NEXT�CHAR�IN�INPUT�BUFFER=BLANK/*ˆD1=1�IF�NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER+*‚EXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7 *…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 COMMAND�MOVE.L�#32,D0‚MESSAGE�LENGTH" 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 LIST3�CLR.B�SHRDEL-DATASG(A5)ƒCLEAR�SHARE�DELIMITER�FLAG5 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;CHG30�MOVE.L�(A4),REC-DATASG(A5)‚SAVE�START�RECORD#�FOR�FMS. MOVE.L MAXLINE-DATASG(A5),D0 GET MAX RECORD #% CMP.L REC-DATASG(A5),D0 BEYOND FILE? BLT.S CHG35 BRANCH IF YES,ERROR4�MOVE.W�6(A4),RECN-DATASG(A5)‚SAVE�#�RECORDS�FOR�FMS'�ADD.L�#8,A4‚POINT�TO�HORIZONTAL�RANGES0 BSR GETHR GET HORIZONTAL RANGES FROM PARA BLOCK TST.W D1 ERROR RETURNED?-CHG35‚BNE�CMDERR�BRANCH�IF�YES,INVALID�SYNTAX& ADD.L #8,A4 POINT TO TRANSPARENT CHAR CLR.L D0 CLEAR FOR USE$�CLR.B�TRANS-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.B�D0,COUNT-DATASG(A5)‚SAVE�COUNT�FOR�FMS6CHG50 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.L�D0ƒALL-USE�DEFAULT�#�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+CHG80�MOVE.L�D0,REP-DATASG(A5)‚SAVE�FOR�FMS. 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*<*‚SAVE�STRINGS�AND�ADJUST�STRING�ADDRESS�IN�SAVED�PARA�BLOCK*$ 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,�BEQ�CMDERR�IF�ADDRESS�=�0,�NO�STRING‚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*ƒSAVE�ORIGINAL�FILELINE�IN�CASE�DON'T�FIND�THE�STRING;�MOVE.L�FILELINE-DATASG(A5),SVLINE-DATASG(A5)‚SAVE�FILELINEE�MOVE.L�REC-DATASG(A5),FILELINE-DATASG(A5)ˆFOR�USING�SAVED�PARA�BLOCK# BRA CHG200 GO GET SAVED PARA BLOCK1CHG92 ADD.L #18,A6 POINT TO STRING1 START ADDRESSB�MOVE.L�A6,RADR-DATASG(A5)…SAVE�POINTER�TO�STRING1�ADDRESS�FOR�FMS MOVE.L 4(A6),D0 GET END ADDRESS/ CMP.L (A6),D0 END ADDRESS AFTER START ADDRESS?&�BLT‚CHG150�BRANCH�IF�YES,NULL�STRING12 AND.B #$7F,(A6) TURN OFF FOUND FLAG START ADDRESS1 AND.B #$7F,4(A6) TURN OFF FOUND FLAG END STRING1+�CLR.W�FINDSW-DATASG(A5)‹CLEAR�FOUND�SWITCH)�CMP.L�#1,REP-DATASG(A5)‹ONE�SEARCH�ONLY? BEQ CHG130 BRANCH IF ONE**‚MULTIPLE�CHANGE�HERE**CHG95�TST.B�BRKFLG-DATASG(A5)…BREAK�INPUT? 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/CHG98�TST.W�FINDSW-DATASG(A5)…FOUND�ANY�BEFORE? �BEQƒCHG120�BRANCH�IF�FOUND�NONE+ BRA CHG140 GO OUTPUT LAST CHANGE TO SCREEN**‚HERE�IF�FOUND�ONE�OF�MULTIPLE*2CHG100�ADD.W�#1,FINDSW-DATASG(A5)‚SET�FOUND�SWITCH, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS0�CMP.W�#-1,RECN-DATASG(A5)„SEARCHING�WHOLE�FILE? BEQ.S CHG110 BRANCH IF YES' MOVE.L FMSREC(A0),D0 RETURNED RECORD #5 SUB.L REC-DATASG(A5),D0 # RECORDS SEARCHED THIS TIME5�SUB.W�D0,RECN-DATASG(A5)ƒ#�RECS�STILL�TO�BE�SEARCHED<�SUB.W�#1,RECN-DATASG(A5)ƒACTUAL�NUMBER�OF�RECORDS�TO�SEARCH% BGE.S CHG110 BRANCH IF A GOOD NUMBER.�CLR.W�RECN-DATASG(A5)†CLEAR,NO�MORE�TO�SEARCH>CHG110�MOVE.L�FMSREC(A0),REC-DATASG(A5)„GET�THIS�RECORD�NUMBER-�ADD.L�#1,REC-DATASG(A5)ŠPOINT�TO�NEXT�RECORD+ BSR CKHR GO SEE IF WITHIN HORIZONTAL RANGE TST.L D0 WITHIN? BEQ.S CHG115 BRANCH IF YES+�SUB.W�#1,FINDSW-DATASG(A5)‰UNSET�THIS�FIND) MOVE.L MAXLINE-DATASG(A5),D0 GET MAXLINE" CMP.L REC-DATASG(A5),D0 PAST EOF? BLT CHG98 BRANCH IF PAST EOF.�TST.W�RECN-DATASG(A5)‚MORE�RECORDS�TO�SEARCH? BEQ CHG98 BRANCH IF NO! BRA CHG95 YES,GO SEARCH FOR MORE%CHG115‚CLR.B�D7�NOT�NULL�STRING1�FLAG$ BSR DOCHG GO UPDATE RECORD AND FILE2 BSR CKCNT GO SEE IF CHANGED ALL STRINGS IN RECORD(�TST.B�SCROLL-DATASG(A5)‚IN�SCROLL�MODE? 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ƒCHG140�BRANCH�IF�YES,GO�OUTPUT�SCREEN- SUB.L #1,REP-DATASG(A5) DECREMENT FIND COUNT' BEQ.S CHG117 BRANCH IF NO MORE TO FIND.�TST.W�RECN-DATASG(A5)‚MORE�RECORDS�TO�SEARCH?#CHG117 BEQ CHG140 BRANCH IF NO MORE BRA CHG95 MORE TO FIND**‚HERE�IF�DIDNT�FIND�STRING*5CHG120 LEA SNF-DATASG(A5),A0 STRING NOT FOUND MESSAGE MOVE.L #16,D0 MESSAGE LENGTH BSR WRTMESS OUTPUT THE MESSAGEMCHG118�MOVE.L�SVLINE-DATASG(A5),FILELINE-DATASG(A5)‚RESTORE�ORIGINAL�FILELINE RTS RETURN*#*‚HERE�IF�LOOKING�FOR�ONLY�1�RECORD*"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.W�RECN-DATASG(A5)„SEARCHING�WHOLE�FILE? BMI.S CHG136 BRANCH IF YES' MOVE.L FMSREC(A0),D0 GET THIS RECORD #+�SUB.L�REC-DATASG(A5),D0‚#�RECORDS�SEARCHED;�SUB.W�D0,RECN-DATASG(A5)ƒNUMBER�OF�RECORDS�STILL�TO�SEARCH-�SUB.W�#1,RECN-DATASG(A5)ƒDONT�COUNT�THIS�ONE. BLE CHG120 NO MORE TO SEARCH,STRING NOT FOUND>CHG136�MOVE.L�FMSREC(A0),REC-DATASG(A5)ƒGET�THIS�RECORD�NUMBER,�ADD.L�#1,REC-DATASG(A5)ˆBUMP�TO! �NEXT�RECORD 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.B�SCROLL-DATASG(A5)…IN�SCROLL�MODE?+ 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*.CHG140�TST.B�SCROLL-DATASG(A5)ƒIN�SCROLL�MODE? BPL.S CHG145 BRANCH IF NOF MOVE.L SVREC-DATASG(A5),FILELINE-DATASG(A5) SET CURRENT RECORD NUMBER*�CLR.W�FINDSW-DATASG(A5)„CLEAR�FIND�SWITCH1 RTS RETURN,CHANGES ALREADY OUTPUT IN SCROLL MODE2CHG145 LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS@�MOVE.L�SVREC-DATASG(A5),FILELINE-DATASG(A5)…RECORD�#�FOR�SCREEN" BSR OUTFIND OUTPUT PAGE TO SCREEN*�CLR.W�FINDSW-DATASG(A5)„CLEAR�FIND�SWITCH �RTS‚RETURN*5*‚HERE�IF�NULL�STRING1-INSERT�STRING2�AT�BEGINNING�OF>*‚THE�HORIZONTAL�RANGE.�READ�EACH�RECORD�WITHIN�VERTICAL�RANGE,*‚AND�DO�THE�CHANGE�FOR�#�OF�REPS�SPECIFIED.*0CHG150‚MOVE.L�12(A6),D0�GET�STRING�2�END�ADDRESS$ CMP.L 8(A6),D0 SEE IF NULL STRING 2. BLT CMDERR BRANCH IF NULL STRING 2 ALSO,ERROR7�CMP.B�#1,COUNT-DATASG(A5)…GET�COUNT,CAN�ONLY�BE�1�HERE BNE CMDERR BRANCH IF NOT 1+CHG155 TST.B BRKFLG-DATASG(A5) BREAK INPUT?�BNE�CHG220‚BRANCH�IF�YES* 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),A0�OUTPUT�RECORD�NOT�FOUND�MESSAGE >'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.B�SCROLL-DATASG(A5)…IN�SCROLL�MODE? 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 RECORD4CHG165�CMP.W�#-1,RECN-DATASG(A5)„READING�WHOLE�FILE? BEQ.S CHG170 BRANCH IF YES7�SUB.W�#1,RECN-DATASG(A5)…DECREMENT�#�RECORDS�TO�SEARCH' BLE CHG140 BRANCH IF NO MORE TO SEARCH3CHG170�ADD.L�#1,REC-DATASG(A5)†POINT�TO�NEXT�RECORD) MOVE.L MAXLINE-DATASG(A5),D0 GET MAXLINE" CMP.L REC-DATASG(A5),D0 PAST EOF?;�BLTƒCHG140�BRANCH�IF�YES,�NO�MORE�TO�DO�-�GO�OUTPUT�SCREEN1�SUB.L�#1,REP-DATASG(A5)ƒDECREMENT�NUMBER�TO�FIND# BLE CHG140 BRANCH IF NO MORE TO DO BRA CHG155 MORE RECORDS TO DO*$*‚ALWAYS�USE�SAVED�CHANGE�PARA�BLOCK*>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 DO0�MOVE.B�16(A6),TRANS-DATASG(A5)‡TRANSPARENT�CHAR0�MOVE.B�17(A6),COUNT-DATASG(A5)‡COUNT�PER�RECORD1�MOVE.L�34(A6),REP-DATASG(A5)‰#TIMES�TO�DO�CHANGE*�CMP.B�#$FF,COUNT-DATASG(A5)ŠIS�COUNT�ALL? BNE.S CHG210 BRANCH IF NO4�MOVE.B�#1,COUNT-DATASG(A5)‹FORCE�1�FOR�COUNT�IF�ALL+CHG210�CMP.L�#-1,REP-DATASG(A5)‡IS�REP�ALL? BNE.S CHG215 BRANCH IF NO" 9�MOVE.L�4(A6),REP-DATASG(A5)ŠALL-USE�VERTICAL�RANGE�COUNT CHG215 BRA CHG92 GO DO THE STUFF**‚BREAK�WAS�INPUT*5CHG220 LEA BRKMESS-DATASG(A5),A0 OUTPUT BREAK MESSAGE MOVE.L #16,D0 LENGTH BSR WRTMESS OUTPUT IT-�CLR.B�BRKFLG-DATASG(A5)…CLEAR�THE�BREAK�FLAG RTS RETURN†PAGEC********************************************************************1*ƒFIND‚COMMAND�ROUTINE--FIND�A�STRING�OR�POSITION7*‰THE�EDITOR�AT�BEGINNING,�END,OR�AT�A�SPECIFIED�RECORD*‰OF�THE�FILE.*ƒREV�1.00‚2-20-80�(C313)**ƒENTRY:�D1=0�IF�NEXT�CHAR�IN�BUFFER=BLANK)*ŠD1=1�IF�NEXT�CHAR�IN�BUFFER=END�OF�DATA*ŠA1=END�ADDRESS+1�OF�BUFFER#*ŠA3=ADDRESS�OF�NEXT�CHAR�IN�BUFFER*ƒEXIT:MAIN�PROG*ˆERROR�EXIT:CMDERR*ƒUSES:0�1�2�3�4�5�6�7*†D�*�**†A�*�*�*�*�*�P�**ƒCALLS:PROCLIST…MULFIND„CKHR*‰GETVRˆOUTFIND„SCROLRD*‰GETHRˆSETPROC*‰WRTMESS†PUTP*‰DOSRCH‡CKRANG*C******************************************************************* FIND„EQU‚*+‰TST.L�MAXLINE-DATASG(A5)†ANY�FILE�RECORDS?-‰BMI‚CHG03…BRANCH�IF�NO,CAN'T�DO�THIS�COMMAND*:*„SEARCH�PARA�BLOCK�LIST�FOR�VALUES�IN�COMMAND�LINE�BUFFER* …TST.L‚D1…NEXT�CHAR�END�OF�DATA?*†BNE‚FIND100‚BRANCH�IF�YES,USE�LAST�STRING-†LEAƒFINDL-DATASG(A5),A4‚FIND�PARA�BLOCK�LIST5†CLR.B�NOHR-DATASG(A5)�'A'�FOR�ALL�OK�IN�COUNT�FIELDS†BSR‚PROCLIST‚PROCESS�THIS�LIST,†LEA‚LISTPB-DATASG(A5),A4‚PARA�BLOCK�ADDRESS0†TST.B�RANGSW-DATASG(A5)ƒANY�DEFAULT�RANGES�SET?†BEQ.S�FIND05�BRANCH�IF�NO"†BSR‚CKRANG‚YES,GET�THEM�IF�NEEDED$FIND05‚BSR‚GETVR†GET�VERTICAL�RANGES†TST.W‚D1†2ND�RANGE�FOUND?/FIND06�BEQ‚FIND200‚BRANCH�IF�NO,POSITION�EDITOR4†MOVE.L‚(A4),REC-DATASG(A5)ƒSAVE�START�REC�#�FOR�FMS.†MOVE.L�MAXLINE-DATASG(A5),D0�GET�MAX�RECORD�#%†CMP.L�REC-DATASG(A5),D0�BEYOND�FILE?!†BLT.S�FIND08�BRANCH�IF�TES,ERROR;†MOVE.W‚6(A4),RECN-DATASG(A5)�SAVE�#�RECS�TO�SEARCH�FOR�FMS'†ADD.L‚#8,A4„POINT�TO�HORIZONTAL�RANGES†BSR‚GETHR†GET�THEM†TST.W‚D1‡ERROR�RETURNED?.FIND08‚BNE‚CMDERR…BRANCH�IF�YES,INVALID�SYNTAX&†ADD.L‚#8,A4„POINT�TO�TRANSPARENT�CHAR†CLR.L‚D0†CLEAR�FOR�USE/†CLR.B‚TRANS-DATASG(A5)ƒDEFAULT�TRANS�CHAR=NONE†MOVE.B‚(A4),D0„GET�TRANS�CHAR†BCLR.L‚#7,D0†IS�THERE�ONE?†BEQ.SƒFIND10…BRANCH�IF�NONE3†MOVE.B‚D0,TRANS-DATASG(A5)…SAVE�TRANS�CHAR�FOR�FMS6FIND10‚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‚FIND20‚BRANCH�IF�ALL-USE�DEFAULT†BCLR.L‚#7,D0„ANY�COUNT?&†BEQ.S‚FIND20ƒBRANCH�IF�NO-USE�DEFAULT.‡MOVE.B‚D0,COUNT-DATASG(A5)„SAVE�COUNT�FOR�FMS7FIND20‚MOVE.B�COUNT-DATASG(A5),1(A4)ƒSAVE�IN�PARA�BLOCK'†ADD.L‚#10,A4†POINT�TO�REPETITION�FIELD%…MOVE.L‚#1,REP-DATASG(A5)‚DEFAULT�REP…MOVE.L‚(A4),D0‡GET�REP…CMP.L‚#-1,D0ˆALL?…BEQ.S‚FIND30ˆBRANCH�IF�ALL…BCLR.L‚#31,D0‡ANY�REP?&…BEQ.S‚FIND40ˆBRANCH�IF�NO-USE�DEFAULT/FIND30‚MOVE.L‚D0,REP-DATASG(A5)‚SAVE�IT�FOR�FMS4FIND40‚MOVE.L‚REP-DATASG(A5),(A4)„SAVE�IN�PARA�BLOCK)‡LEA‚LISTPB-DATASG(A5),A4…RESTORE�POINTER MOVE.L A4,A6 GET START ADDRESS+ ADD.L #18,A6 POINT TO STRING START ADDRESSG�MOVE.L�A6,RADR-DATASG(A5)‚SAVE�POINTER�TO�STRING�START�ADDRESS�FOR�FMS5�AND.B�#$7F,(A6)‚TURN�OFF�FOUND�FLAG�ON�START�ADDRESS4 AND.B #$7F,4(A6) TURN OFF FOUND FLAG ON END ADDRESS*(*‚SAVE�PARA�BLOCK�FOR�NEXT�FIND/NO�PARAS*' MOVE.L 4(A6),A4 GET STRING END ADDRESS4 CMP.L #0,A4 CHECK FOR EXISTENCE OF STRG ADDR 010285)�BEQƒCMDERR�STRG�ADDR�WAS�0:�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ƒSAVE�ADDRESS„MOVE.L‚#15,D0„#�WORDS�TO�MOVE,‚LEA�LISTPB-DATASG(A5),A4�PARA�BLOCK�ADDRESS%FIND45‚MOVE.W‚(A4)+,(A2)+ƒMOVE�A�WORD…SUB.L‚#1,D0„DECREMENT�COUNT$…BNE.S‚FIND45„BRANCH�IF�MORE�TO�MOVE+…LEA‚SVFIND-DATASG(A5),A2�GET�ADDRESS�AGAIN" #…ORI.B�#$80,(A2)�TURN�ON�SAVED�FLAG. 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**ƒDO�THE�SEARCH�FOR�STRING*9FIND50‚CLR.B‚MULFSW-DATASG(A5)‡CLEAR�MULTIPLE�FIND�SWITCH+†CLR.W‚FINDSW-DATASG(A5)‰CLEAR�FOUND�SWITCH/‡MOVE.B�#'F',CURCMD-DATASG(A5)ƒSET�FIND�COMMAND)†CMP.L‚#1,REP-DATASG(A5)‰ONE�SEARCH�ONLY?†BEQ„FIND80‰BRANCH�IF�ONE1FIND55�TST.B�BRKFLG-DATASG(A5)ˆWAS�A�BREAK�INPUT?ˆBNE�FIND210�BRANCH�IF�YESˆBSR‚DOSRCH‰DO�SEARCHˆTST.B‚FMSTAT(A0)‚STRING�FOUND?ˆBEQ.S‚FIND60†BRANCH�IF�FOUND&ˆCMP.B‚#-1,FMSTAT(A0)‚SEE�IF�NOT�FOUND&ˆBNE‚CMDERRˆBRANCH�IF�SOME�OTHER�ERROR0FIND58‚TST.W‚FINDSW-DATASG(A5)„FOUND�ANY�BEFORE? ˆBEQ‚FIND70†BRANCH�IF�FOUND�NONE)ˆBRA.S�FIND65‡RETURN-FOUND�ALL�THERE�WERE**‚HERE�IF�FOUND�ONE�OF�MULTIPLE*.FIND60 BSR CKHR SEE IF WITHIN HORIZONTAL RANGE‡TST.L�D0�WITHIN?‡BNE.S‚FIND64�BRANCH�IF�NO,ˆADD.W‚#1,FINDSW-DATASG(A5)…SET�FOUND�SWITCH;ˆMOVE.L�FMSREC(A0),SVREC-DATASG(A5)�SAVE�THIS�RECORD�NUMBERˆBSR‚MULFIND‰OUTPUT�TO�SCREEN6FIND64‚LEA�FMSPKT-DATASG(A5),A0�GET�FMS�PACKET�ADDRESS,ˆTST.W�RECN-DATASG(A5)†SEARCHING�WHOLE�FILE?ˆBMI.S�FIND66�BRANCH�IF�YES,ˆMOVE.L�FMSREC(A0),D0�GET�THIS�RECORD�NUMBER*ˆSUB.L�REC-DATASG(A5),D0„#RECORDS�SEARCHED5ˆSUB.W�D0,RECN-DATASG(A5)ƒNUMBER�OF�RECORDS�TO�SEARCH1ˆSUB.W�#1,RECN-DATASG(A5)ƒACTUAL�NUMBER�TO�SEARCH&ˆBGE.S�FIND66ƒBRANCH�IF�A�VALID�NUMBER*ˆCLR.W‚RECN-DATASG(A5)†NONE�LEFT�TO�SEARCH4FIND66‚MOVE.L‚FMSREC(A0),REC-DATASG(A5)„GET�RECORD�#>ˆADD.L‚#1,REC-DATASG(A5)†UPDATE�TO�NEXT�RECORD�TO�START�SEARCH+ˆMOVE.L�REC-DATASG(A5),D0�GET�RECORD�NUMBER&ˆCMP.L�MAXLINE-DATASG(A5),D0ƒPAST�EOF?ˆBGTƒFIND58ƒBRANCH�IF�YES-ˆSUB.L‚#1,REP-DATASG(A5)ƒDECREMENT�FIND�COUNT%ˆBEQƒFIND58„BRANCH�IF�NO�MORE�TO�FIND.ˆTST.W�RECN-DATASG(A5)ƒMORE�RECORDS�TO�SEARCH?ˆBEQƒFIND58„BRANCH�IF�NO�MOREˆBRA‚FIND55†MORE�TO�SEARCH.FIND65�TST.B�SCROLL-DATASG(A5)„IN�SCROLL�MODE?ˆBMI.S�FIND68�BRANCH�IF�YES5ˆMOVE.B‚MULFSW-DATASG(A5),D0…SCREEN�LINE�#�FOR�PROMPT#ˆSUB.B�#1,D0‹MAKE�IT�CORRECT�LINE�#ˆBSR‚PUTP�PLACE�PROMPT(ˆBSR‚SETPROCŠSET�COMMAND�MODE�PROTECTION1FIND68‚CLR.W�FINDSW-DATASG(A5)„CLEAR�FOR�NEXT�USEHˆMOVE.L�SVREC-DATASG(A5),FILELINE-DATASG(A5)�LAST�REC�FOUND=CURRENT�REC#M MOVE.L SVREC-DATASG(A5),TOPLINE-DATASG(A5) GOES TO TOP OF FILE AT NEXT INPUT+ˆCLR.B�CURCMD-DATASG(A5)…CLEAR�COMMAND�FLAGˆRTS’RETURN-DONE*+*ƒHERE�IF�MULTIPLE�PASS�AND�DIDN'T�FIND�ANY'*ƒOR�SINGLE�PASS�AND�DIDN'T�FIND�STRING*=FIND70‚LEA‚SNF-DATASG(A5),A0„STRING�NOT�FOUND�MESSAGE�ADDRESS ˆMOVE.L‚#16,D0‚LENGTH�OF�MESSAGEˆBSR‚WRTMESS…OUTPUT�MESSAGE5FIND75‚CLR.B�CURCMD-DATASG(A5)„CLEAR�THE�FIND�COMMAND ˆRTS�RETURN*%*ƒHERE�IF�LOOKING�FOR�ONLY�ONE�STRING*FIND80‚BSR‚DOSRCH„GO�DO�SEARCH-ˆTST.B�BRKFLG-DATASG(A5)ƒTERMINATED�BY�BREAK?ˆBMI�FIND75�BRANCH�IF�YESˆTST.B‚FMSTAT(A0)ƒSTRING�FOUND?)ˆBNE.S‚FIND70„BRANCH�IF�NO-OUTPUT�MESSAGE+ˆBSR�CKHR�GO�SEE�IF�WITHIN�HORIZONTAL�RANGEˆTST.L�D0�WITHIN?‰BEQ.S�FIND85�BRANCH�IF�YES)‡MOVE.L�MAXLINE-DATASG(A5),D0�GET�MAXLINE!‡CMP.L�FMSREC(A0),D0�BEYOND�FILE?ˆBLE‚FIND70�BRANCH�IF�YES,ˆTST.W�RECN-DATASG(A5)ƒSEARCHING�WHOLE�FILE?ˆBMI.S�FIND83�BRANCH�IF�YES,ˆMOVE.L�FMSREC(A0),D0�GET�THIS�RECORD�NUMBER3ˆSUB.L�REC-DATASG(A5),D0�NUMBER�OF�RECORDS�SEARCHED0ˆSUB.W�D0,RECN-DATASG(A5)ƒNUMBER�OF�RECORDS�LEFT,ˆSUB.W�#1,RECN-DATASG(A5)ƒACTUAL�NUMBER�LEFT'ˆBLE‚FIND70�BRANCH�IF�NO�MORE�TO�SEARCH9FIND83‚MOVE.L�FMSREC(A0),REC-DATASG(A5)‡GET�THIS�RECORD�#,ˆADD.L�#1,REC-DATASG(A5)„BUMP�TO�NEXT�RECORDˆBRA�FIND80�GO�LOOK�AGAINAFIND85‚MOVE.L‚FMSREC(A0),FILELINE-DATASG(A5)ƒUPDATE�CURRENT�REC�#(ˆTST.B�SCROLL-DATASG(A5)ƒIN�SCROLL�MODE?ˆBPL�FIND207�BRANCH�IF�NO(FIND87‚BSR‚OUTFIND‡OUTPUT�PAGE�TO�SCREENˆBRA�FIND75‰GO�RETURN*# <*ƒHERE�IF�ENTRY�WAS�'F'�ONLY,USE�LAST�FIND�STRING�PARA�BLOCK*9FIND100‚LEA‚SVFIND-DATASG(A5),A4„SAVED�PARA�BLOCK�ADDRESS‰MOVE.L�(A4),D0�GET�FIRST�WORD-‰BTST.L�#31,D0�DO�WE�HAVE�A�SAVED�PARA�BLOCK?‰BEQ�CMDERR†BRANCH�IF�NO,ERROR)‰LEA‚LISTPB-DATASG(A5),A2…WHERE�TO�PUT�IT‰MOVE.L‚#15,D0‚#�WORDS�TO�MOVE&FIND110‚MOVE.W‚(A4)+,(A2)+ƒMOVE�A�WORD‰SUB.W‚#1,D0…DECREMENT�COUNT‰BNE.S‚FIND110„BRANCH�IF�MORE2‰LEA‚LISTPB-DATASG(A5),A4‚RESTORE�PARA�BLK�POINTER‡MOVE.L�(A4),D0�GET�FIRST�WORD"‡BCLR.L�#31,D0�TURN�OFF�SAVED�FLAG(‡MOVE.L�D0,(A4)�PUT�BACK�INTO�PARA�BLOCK<ˆMOVE.L‚FILELINE-DATASG(A5),REC-DATASG(A5)ƒSTART�REC�FOR�FMS,‡ADD.L�#1,REC-DATASG(A5)„BUMP�TO�NEXT�RECORD.‡MOVE.W‚6(A4),RECN-DATASG(A5)‚#�RECS�TO�SEARCH0‡MOVE.B‚16(A4),TRANS-DATASG(A5)„TRANSPARENT�CHAR-‡MOVE.B‚17(A4),COUNT-DATASG(A5)„COUNT�PER�REC1‡MOVE.L‚A4,RADR-DATASG(A5)‰STRING�ADDRESS�POINTER1‡ADD.L�#18,RADR-DATASG(A5)ŠACTUAL�POINTER�ADDRESS4‡MOVE.L‚26(A4),REP-DATASG(A5)†#�TIMES�TO�FIND�STRING‡BRA‚FIND50ŠGO�DO�SEARCH* *‚HERE�IF�FOR�POSITIONING�EDITOR)*‚FILELINE�IS�IN�1ST�VERTICAL�RANGE�FIELD*+FIND200‚TST.B�18(A4)�IS�A�STRING�SPECIFIED?;‰BMI�FIND06�BRANCH�IF�YES,USE�DEFAULT�SECOND�VERTICAL�RANGE-‰MOVE.L‚(A4),FILELINE-DATASG(A5)‚GET�RECORD�#0FIND201‚MOVE.L�MAXLINE-DATASG(A5),D0�GET�MAXLINE*‰CMP.L�FILELINE-DATASG(A5),D0�BEYOND�FILE?‰BGE.S�FIND205�BRANCH�IF�NOL MOVE.L MAXLINE-DATASG(A5),FILELINE-DATASG(A5) BEYOND FILE,FORCE LAST RECORD/FIND205‚TST.B�SCROLL-DATASG(A5)ƒIN�SCROLL�MODE?‰BPL.S�FIND207�BRANCH�IF�NO 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 ƒRTS�RETURN/FIND207�TST.B�SCROLL-DATASG(A5)ƒIN�SCROLL�MODE?- 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 PROMPT�BRA�FIND75‚GO�RETURN%FIND209‚BRA�FIND87‰GO�OUTPUT�THE�PAGE ‰RTS‘RETURN**‚BREAK�WAS�INPUT*/FIND210 LEA BRKMESS-DATASG(A5),A0 BREAK MESSAGE MOVE.L #16,D0 LENGTH BSR WRTMESS OUTPUT MESSAGE-�CLR.B�BRKFLG-DATASG(A5)„CLEAR�THE�BREAK�FLAG0‚LEA�FMSPKT-DATASG(A5),A0�GET�FMS�PACKET�ADDRESS,‚CLR.B�FMSBRK(A0)�CLEAR�THAT�BREAK�FLAG�ALSO ‚RTS�RETURNOFIND220 MOVE.B SVMULFSW-DATASG(A5),MULFSW-DATASG(A5) RESTORE MULTIPLE FIND VALU-�CLR.B�SVMULFSW-DATASG(A5)†CLEAR�FOR�NEXT�USE' BRA FIND55 GO FINISH THIS FIND COMMAND‰PAGED*********************************************************************#*‚QUIT�QUIT�EDITING�COMMAND�ROUTINE!*‚REV�1.00�2/1/80�(SANDY�DEARING)*‚REV�2.00�3/31/81�(C313)1*‚ENTRY:D1=0=NEXT�CHAR�IN�COMMAND�LINE�IS�A�BLANK1*ˆD1=1=NEXT�CHAR�IN�COMMAND�LINE�IS�END�OF�BUFFER*‚EXIT:�EDIT3(MAIN)*‚USES:0�1�2�3�4�5�6�7*…Dƒ* *…A�*‡*�P*‚CALLS:PROCLIST<************************************************************ QUIT‚EQU‚*#�TST.L�D1‚IS�NEXT�CHAR�END�OF�DATA?, 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‚WAS�CHAR�ENTERED�AN�A�FOR�ABORT?, BEQ.S QUIT20 BRANCH IF YES,GO SET FOR ABORT CMP.B #'a',D1 a FOR ABORT?&�BNE‚CMDERR�BRANCH�IF�NO,COMMAND�ERROR9QUIT20„LEA�FMSPKT-DATASG(A5),A0�THIS�IS�ABORT-GET�FMS�ADR- MOVE.B #-1,FMSEFS(A0) SET ABORT CODE FOR FMS!QUIT10‚BRA�EDIT3�GO�CLOSE�AND�END PAGE?****************************************************************5* PROCLIST PROCESS A LIST FROM ANY COMMAND. PARSE THE# +*ŠOPTIONAL�INPUT�FIELDS�IN�THE�COMMAND�LINE/*ŠAND�BUILD�A�LIST�PARAMETER�BLOCK�WITH�ADDRESS-*ŠAND�CONSTANTS�FROM�THOSE�OPTIONS�SPECIFIED.**ŠEACH�COMMAND�USES�THE�SAME�RETURNED�PARA0*ŠBLOCK,LISTPB.�EACH�COMMAND�HAS�ITS�OWN�LIST�TO *ŠPROCESS.(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA4=ADDRESS�OF�LIST�TO�PROCESS*‚EXIT:GOOD�RETURN-TO�CALLER)*‡ERROR�RETURN-MAIN�PROG(MESSAGE�WRITTEN)*‚USES:0�1�2�3�4�5�6�7*…D�*�**…A�*�P�*�*�*�P�*�R*‚CALLS:WRTMESS„FINDNXTC*ˆSETFLAG1ƒCHKREQDF *ˆUPDTLPBP*‚TABLES�USED:LISTABLE?***************************************************************PROCLIST‚EQU‚***‚CLEAR�LIST�PARA�BLOCK* 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.B�FLAG1-DATASG(A5)ƒCLEAR�FLAG�1�FOR�START**‚PROCESS�LIST�ENTRIES*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),A2�GET�ADDRESS�OF�LIST�TABLE�OFFSETS0�LEA…LISTBLND-DATASG(A5),A0�END�ADDRESS�OF�TABLE6PROCL30 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 ADDRESS�JMP�(A2,D0)‚GO�DO�IT*,*‚PROCESS�SPECIAL�CHARACTERS�IN�LIST�ENTRIES*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*-*‚SPECIAL�CHARACTER�NOT�FOUND�IN�INPUT�BUFFER*0PROCL60 BSR CHKREQDF GO CHECK FOR REQUIRED FIELD TST.L D1 IS FIELD REQUIRED?�BNE�CMDERR‚BRANCH�IF�YES,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*‚END�OF�LIST-LOOK�FOR�MORE�CHARS�IN�INPUT�BUFFER*: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*‚ERROR�IN�LIST�PARAMETERS-INTERNAL�PROGRAM�ERROR*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**ˆPROCESS�LIST�BRANCH�TABLE*PROCBRAT EQU *-‰BRA�PROCSND�PROCESS�STRING�WITH�NO�DELIMITER.‰BRA�PROCNDN�PROCESS�NUMBER�NUMBER�DASH�NUMBER‰BRA�PROCHAR�PROCESS�CHARACTER‰BRA�PROCNT‚PROCESS�COUNT*‰BRA�PROCSWD�PROCESS�STRING�WITH�DELIMITER‰BRA�PROCFN‚PROCESS�FILENAME(‰BRA�PROCNCN�PROCESS�NUMBER�COMMA�NUMBER PAGE>***************************************************************9*PROCSND PROCESS STRING WITH NO DELIMITERS. DETERMINE THE2*ˆBEGINNING�AND�ENDING�ADDRESS�OF�A�STRING�WITH�NO4*ˆDELIMITERS�IN�THE�INPUT�BUFFER�AND�PUT�THE�ADDRESS *ˆINTO�THE�LIST�PARAMETER�BLOCK.(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER#*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�BUFFER**ˆA4=ADDRESS�OF�LIST�ENTRY�BEING�PROCESSED8*ˆA6=ADDRESS�OF�LIST�PARA.�BLOCK�ENTRY�FOR�START�ADDRESS*‚EXIT:GOOD�RETURN-TO�CALLER$ (*‡ERROR�RETURN-MAIN�PROG(MESSAGE�OUTPUT)*‡A1=UNCHANGED5*‡A3=ADDRESS�OF�1ST�CHAR�AFTER�STRING�IN�INPUT�BUFFER*‡A4=ADDRESS�OF�NEXT�LIST�ENTRY%*‡A6=ADDRESS�OF�NEXT�PARA�BLOCK�ENTRY*‚USES:0�1�2�3�4�5�6�7*…Dƒ* *…AƒPƒR�R�P�R*‚CALLS:WRTMESS„FINDNXTC*ˆSETFLAG1ƒCHKREQDF?*************************************************************** PROCSND�EQU‚*, 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*‚PROCSWD�PROCESS�STRING�WITH�DELIMITERS.�DETERMINE,*ŠBEGINNING�AND�ENDING�ADDRESSES�OF�A�STRING**ŠWITH�DELIMITERS�AND�PUT�THE�ADDRESS�INTO*ŠTHE�LIST�PARAMETER�BLOCK.*‚REV.�1.00�3/10/80�(C313)(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER**ˆA4=ADDRESS�OF�LIST�ENTRY�BEING�PROCESSED:*ˆA6=ADDRESS�OF�LIST�PARA�BLOCK�ENTRY�FOR�STRING�ADDRESSES0*‚EXIT:GOOD�RETURN-TO�CALLER…ERROR�RETURN-CMDERR*‡A1=UNCHANGED5*‡A3=ADDRESS�OF�1ST�CHAR�AFTER�STRING�IN�INPUT�BUFFER*‡A4=ADDRESS�OF�NEXT�LIST�ENTRY-*‡A6=ADDRESS�OF�NEXT�ENTRY�IN�LIST�PARA�BLOCK*‚USES:0�1�2�3�4�5�6�7*…Dƒ*�* *…AƒPƒR�R�P�R!*‚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)„SAVE�DELIMITER) 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"*‚HERE�IF�FOUND�MATCHING�DELIMITER.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ƒPOINT�TO�NEXT�LIST�ENTRYI�TST.B�SHRDEL-DATASG(A5)‚WILL�THERE�BE�ANOTHER�STRING�FOR�THIS�DELIMITER?�BEQ.S�PRSWD17‚BRANCH�IF�NO+�CLR.B�SHRDEL-DATASG(A5)„CLEAR�FOR�NEXT�USE BRA.S PRSWD18 GO RETURN3PRSWD17 ADD.L #1,A3 POINT TO NEXT INPUT BUFFER CHAR)PRSWD18 BRA PROCL20 GO PROCESS NEXT ENTRY)*‚HERE�IF�STRING�WITH�DELIMITER�NOT�FOUND+PRSWD20 BSR CHKREQDF SEE IF REALLY REQUIRED�TST.L�D1‚IS�IT?" 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%*‚HERE�IF�DIDNT�FIND�SECOND�DELIMITER!PRSWD30�BRA�PROCERTN‚SYNTAX�ERROR PAGE>***************************************************************5*‚PROCHAR�PROCESS�CHARACTER.�FIND�A�BYTE�CHARACTER�IN(*ŠTHE�INPUT�BUFFER�AND�PUT�INTO�THE�LIST*ŠPARAMETER�BLOCK.$ *‚REV�1.00�3/11/80�(C313)(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER#*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�BUFFER**ˆA4=ADDRESS�OF�LIST�ENTRY�BEING�PROCESSED6*ˆA6=ADDRESS�OF�LIST�PARA�BLOCK�FOR�SAVE�THE�CHARACTER*‚EXIT:A1=UNCHANGED)*‡A3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*‡A4=ADDRESS�OF�NEXT�LIST�ENTRY-*‡A6=ADDRESS�OF�NEXT�ENTRY�IN�LIST�PARA�BLOCK*‚USES:0�1�2�3�4�5�6�7*…Dƒ* *…AƒPƒR�R�P�R*‚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**‚HERE�IF�CHARACTER�NOT�FOUND*.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*‚PROCNDN�PROCESS�NUMBER�DASH�NUMBER.�FIND�THE�2�NUMBERS2*ŠIN�THE�INPUT�BUFFER,CONVERT�THEM�TO�HEXADECIMAL,0*ŠAND�SAVE�THEM�IN�THE�LIST�PARAMETER�BLOCK.�THE.*ŠRESULTING�NUMBERS�WILL�BOTH�BE�4�BYTES�LONG.*%*‚REV.�1.10‚01/27/84‚PETER�S.�GILMOUR.*�1.�Allowed�'.'�in�addition�to�'*'�character.$*‚REV.�1.00‚02/07/80�(SANDY�DEARING)*(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER**ˆA4=ADDRESS�OF�LIST�ENTRY�BEING�PROCESSED3*ˆA6=ADDRESS�IN�LIST�PARAMETER�BLOCK�FOR�1ST�NUMBER*‚EXIT:A1=UNCHANGED)*‡A3=ADDRESS�OF�1ST�CHAR�AFTER�2ND�NUMBER*‡A4=ADDRESS�OF�NEXT�LIST�ENTRY.*‡A6=ADDRESS�OF�NEXT�ENTRY�IN�LIST�PARA.�BLOCK)*‡EXIT�TO�CALLER�IF�GOOD,OTHERWISE�CMDERR*‚USES:0�1�2�3�4�5�6�7*…Dƒ* *…AƒPƒR�R�P�R*‚CALLS:FINDNXTC„CHKREQDFF*ˆGETNEXTC„CVTASCBI *ˆSAVBINBR>************************************************************** PROCNDN‚EQU‚*>�MOVE.L�A3,CMDARGAD-DATASG(A5)�PRESERVE�ADDR�OF�CMD�ARG‚011685.�CLR.B�TABFLAG-DATASG(A5)ƒCLEAR�TAB�STOPS�FLAG-�CLR.B�NEGFLAG-DATASG(A5)ƒCLEAR�NEGATIVE�FLAG/ 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)„SET�NEGATIVE�FLAG) 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)�IS�CHAR�A‚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)…TURN�ON�TAB�FLAG2PRNDN30 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,D1�WAS�PERIOD�FOUND?‹011685/�BNE.S�PRNDN50�NO,�SO�CAN'T�BE�FILE�NAME‚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‚BSR�SAVBINBR�SAVE�BINARY�RESULTS�IN�LISTPB(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% 3�TST.B�TABFLAG-DATASG(A5)…WAS�1ST�FIELD�TAB�STAOPS?" BNE.S PRNDNER BRANCH IF YES,ERROR) BRA.S PRNDN80 GO CONVERT FIELD TO BINARY9PRNDN70�TST.B�TABFLAG-DATASG(A5)„WAS�1ST�FIELD�TAB�STOPS?! 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!PRNDNER�BRA�PROCERTN‚ERROR�RETURN PAGEC********************************************************************:*‚PROCNT�PROCESS�COUNT.�DETERMINE�IF�COUNT�VALUE�IS�1�BYTE6*‰LONG�OR�4�BYTES�LONG.�IF�INPUT�VALUE�IS�'A'�FOR�ALL,2*‰PUT�-1�IN�THE�LIST�PARA.�BLOCK,OTHERWISE,CONVERT3*‰COUNT�TO�HEX�AND�SAVE�RESULT�IN�LIST�PARA.�BLOCK.<*‰IF�LOCATION�'NOHR'�IS�NEGATIVE,'A'�FOR�ALL�IS�NOT�ALLOWED.*‚REV.�1.00�3/27/80�(C313)(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER**ˆA4=ADDRESS�OF�LIST�ENTRY�BEING�PROCESSED**ˆA6=ADDRESS�OF�LIST�PARA�BLOCK�FOR�RESULT*‚EXIT:A1=UNCHANGED)*‡A3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*‡A4=ADDRESS�OF�NEXT�LIST�ENTRY+*‡A6=ADDRESS�OF�NEXT�LIST�PARA.�BLOCK�ENTRY*‚USES:0�1�2�3�4�5�6�7*…D�* *…AƒPƒR�R�P�R"*‚CALLS:FINDNXTCƒGETNEXTCƒCHKREQDF*ˆCVTASCBIƒSAVBINBRA***************************************************************** PROCNT‚EQU‚*.�CLR.B�TABFLAG-DATASG(A5)‚CLEAR�TAB�STOPS�FLAG-�CLR.B�NEGFLAG-DATASG(A5)‚CLEAR�NEGATIVE�FLAG( 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**‚HERE�IF�SAVING�A�1�BYTE�FIELD*0PRCNT10 MOVE.B D3,(A6) SAVE NUMBER IN PARA BLOCK$ ORI.B #$80,(A6)+ TURN ON FOUND FLAG+PRCNT15�BSRƒSETFLAG1�SET�FLAG�1�IF�REQUIRED,PRCNT17 ADD.L #2,A4 POINT TO NEXT LIST ENTRY' BRA PROCL20 GO PROCESS NEXT LIST ENTRY**‚HERE�IF�SAVING�A�4�BYTE�FIELD*.PRCNT20 BSR SAVBINBR SAVE RESULT IN PARA BLOCK( BRA.S PRCNT15 GO UPDATE REST AND RETURN**‚HERE�IF�DIDNT�FIND�FIELD*'PRCNT30�BSRƒCHKREQDF�GO�SEE�IF�REQUIRED 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.S�PRCNT17‚GO�UPDATE�REST�AND�RETURN**‚HERE�IF�A�FOR�ALL*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*‚PROCNCN�PROCESS�NUMBER�COMMA�NUMBER.�FIND�THE�1-2/*ŠCHAR�INPUT�ASCII�NUMBERS�IN�THE�COMMAND�LINE,-*ŠCONVERT�TO�A�1�BYTE�HEX�VALUE,�AND�STORE�IN/*ŠTHE�PARAMETER�BLOCK.�EACH�NUMBER�IS�SEPARATED.*ŠBY�A�COMMA.�20�NUMBERS�MAX.�EACH�NUMBER�MUST*ŠBE�IN�THE�RANGE�OF�1�TO�80.*‚REV.�1.00‚4/21/80‚(C313)(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER**ˆA4=ADDRESS�OF�LIST�ENTRY�BEING�PROCESSED% )*ˆA6=ADDRESS�OF�PARA�BLOCK�FOR�1ST�NUMBER*‚EXIT:A1=UNCHANGED**‡A3=ADDRESS�OF�1ST�CHAR�AFTER�LAST�NUMBER**‡A4=ADDRESS�OF�NEXT�LIST�ENTRY�TO�PROCESS-*‡A6=ADDRESS�OF�NEXT�ENTRY�IN�PARAMETER�BLOCK*‚USES:0�1�2�3�4�5�6�7 *…Dƒ*ƒ*…*�* *…AƒPƒR�R�P�R+*‚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)+‚TURN�ON�FOUND�FLAG 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‚PRNCN10�BRANCH�IF�YES,GO�CONVERT�AND�SAVE) 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!PRNCNER�BRA�PROCERTN‚ERROR�RETURN PAGE4*****************************************************0*‚PROCFN‚PROCESS�FILENAME.�SET�UP�DEFAULT�VALUES)*ŠFOR�VOLUME,USER#,CATALOG,EXTENSION�FROM'*ŠORIGINAL�DEFAULT�VALUES�PASSED�TO�THE+*ŠEDITOR�AT�START.�CALLS�EDITFILE�TO�SET�UP(*ŠACTUAL�FILENAME�PARAMETER�BLOCK.�MOVES&*ŠRETURNED�FILENAME�PARAMETER�BLOCK�TO**ŠFMSFILES,WITH�START�AND�END�ADDRESSES�IN*ŠTHE�LIST�PARAMETER�BLOCK.*‚REV.‚1.00‚4/22/80‚(C313)(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER#*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�BUFFER$*ˆA4=ADDRESS�OF�LIST�BEING�PROCESSED.*ˆA6=ADDRESS�OF�PARA�BLOCK�ENTRY�FOR�ADDRESSES2*‚EXIT:GOOD�RETURN-TO�CALLER‚ERROR�RETURN-PROCERTN*‡A1=UNCHANGED#*‡A3=ADDRESS�OF�NEXT�CHAR�IN�BUFFER**‡A4=ADDRESS�OF�NEXT�LIST�ENTRY�TO�PROCESS-*‡A6=ADDRESS�OF�NEXT�ENTRY�IN�LIST�PARA�BLOCK*‚USES:0�1�2�3�4�5�6�7*…D�*�**…A�*�P�*�R�R�P�R+*‚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*=*�CHANGE�ANY�LOWER�CASE�CHAR�IN�FILENAME�TO�UPPER�CASE…012085*;PRFN02 CMP.B #$61,(A3) SEE IF CHAR IS LOWER CASE "A" 012085%�BGE.S�PRFN04�MAYBE�LOWER�CASEƒ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,*ŠFLAG1�IS�TO�BE�SET�WHEN�THE�FIELD�HAS�BEEN*ŠFOUND�AND�SET�IF�NECESSARY.!*‚REV�1.00�2/7/80�(SANDY�DEARING) *‚ENTRY:A4=POINTER�TO�LIST�ENTRY*‚EXIT:A4=UNCHANGED>**************************************************************SETFLAG1 EQU *+ MOVE.B 1(A4),D0 GET 2ND BYTE OF LIST ENTRY�BTST‚#0,D0�IS�FLAG1�TO�BE�SET? �BEQ.S�SETF1ƒBRANCH�IF�NO,RETURN% MOVE.B #1,FLAG1-DATASG(A5) SET FLAG1SETF1�RTSƒRETURN?****************************************************************:*‚CHKREQDF�CHECK�REQUIRED�FIELD.�CHECK�THE�2ND�BYTE�OF�THE3*ŠLIST�ENTRY�AND�DETERMINE�IF�THE�FIELD�IS�REQUIRED4*ŠOR�REQUIRED�IF�FLAG1�IS�SET,WHEN�THE�FIELD�HAS�NOT3*ŠBEEN�FOUND.�IF�FIELD�IS�REQUIRED,A�STATUS�CODE�IS *ŠRETURNED�IN�D1,OTHERWIDE,D1=0."*‚REV.�1.00�2/7/80�(SANDY�DEARING) *‚ENTRY:A4=POINTER�TO�LIST�ENTRY*‚EXIT:A4=UNCHANGED*‡D1=0=FIELD�NOT�REQUIRED*‡D1=1=FIELD�IS�REQUIRED>**************************************************************CHKREQDF�EQU‚*+ 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.B�FLAG1-DATASG(A5)‚IS�FLAG1�SET?- 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‚GET�NEXT�CHARACTER�IN�THE�INPUT�COMMAND�BUFFER.1*ŒIF�THE�NEXT�CHARACTER�IS�A�BLANK�OR�END�OF�DATA.*ŒOR�PAST�INPUT�BUFFER,AN�ERROR�STATUS�CODE�IS&*ŒRETURNED�IN�D1,OTHERWISE�D1�IS�ZERO."*‚REV�1.00‚3/12/80�(SANDY�DEARING)(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER5*ˆA3=ADDRESS�OF�LAST�CHARACTER�USED�FROM�INPUT�BUFFER*‚EXIT:A1=UNCHANGED6*‡A3=ADDRESS�OF�NEXT�CHAR�TO�BE�USED�FROM�INPUT�BUFFER *‡D1=0=NON-BLANK�CHARACTER�FOUND4*‡D1=1=PAST�END�OF�BUFFER,BLANK,OR�END�OF�DATA�FOUND*‚USES:0�1�2�3�4�5�6�7*…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 STATUSGETNC20�RTSƒRETURN�TO�CALLER PAGE>***************************************************************7*‚FINDNXTC‚FIND�NEXT�CHARACTER.�FIND�THE�NEXT�NON-BLANK-*ŒCHARACTER�IN�THE�INPUT�BUFFER.�IF�THERE�ARE.*ŒMORE�CHARACTERS�IN�THE�INPUT�BUFFER,A�STATUS(*ŒCODE�IS�RETURNED�IN�D1,OTHERWISE�D1=0.(*‚ENTRY:A1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*‚EXIT:A1=UNCHANGED,*‡A3=ADDRESS�OF�1ST�NON-BLANK�CHAR�IN�BUFFER*‡D1=0=NON-BLANK�CHAR�FOUND$*‡D1=1=NO�MORE�CHARS�IN�INPUT�BUFFER*‚USES:0�1�2�3�4�5�6�7*…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*ŠCHECK�THE�2ND�BYTE�OF�THE�LIST�ENTRY�FOR�THE�LENGTH1*ŠAND�#BYTES�OF�FIELDS�IN�THE�LIST�PARA�BLOCK�FOR6*ŠTHIS�ENTRY.�THIS�#OF�BYTES�IS�THEN�ADDED�TO�THE�LIST1*ŠPARA�BLOCK�POINTER.�THIS�ROUTINE�IS�CALLED�WHEN*ŠA�FIELD�HAS�NOT�BEEN�FOUND. *‚ENTRY:A4=POINTER�TO�LIST�ENTRY+*ˆA6=POINTER�TO�CURRENT�FIELD�IN�PARA�BLOCK*‚EXIT:A4=UNCHANGED(*‡A6=POINTER�TO�NEXT�FIELD�IN�PARA�BLOCK*‚USES:0�1�2�3�4�5�6�7*…D�*�* *…A‰P�P�R>**************************************************************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*‚CVTASCBI�CONVERT�ASCII�DIGITS�TO�A�BINARY�NUMBER.1*‹CONVERTS�A�MAX�OF�8�ASCII�DIGITS�FROM�THE�INPUT*‹BUFFER�TO�A�BINARY�#."*‚REV�1.00�3/12/80�(SANDY�DEARING)**‚ENTRY:A1=END�ADDRESS�+�1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFERA*‚EXIT:A3=ADDRESS�OF�NEXT�CHAR�AFTER�ASCII�DIGITS�IN�INPUT�BUFFER*‡D1=0=DIGITS�FOUND*‡D1=1=NO�DIGITS�FOUND*‡D3=BINARY�RESULT*‡D6=#INPUT�ASCII�CHARS*‚USES:0�1�2�3�4�5�6�7*…DƒR�*�R�*�*�R *…AƒPƒRƒP*‚CALLS:GETNEXTC?***************************************************************CVTASCBI�EQU‚* 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.S�CVTAB40‚CAN'T�BE�FILE�NAME‚011685&�MOVE.L�#-1,D1�FILE�NAME�SIGNAL…011685 �RTS 011685'CVTAB40 CLR.L D1 SET GOOD RETURN STATUS RTS RETURN PAGE>***************************************************************8*‚SAVBINBR�SAVE�BINARY�NUMBER�FROM�CONVERSION�ROUTINE�IN6*‹THE�CURRENT�ENTRY�IN�LISTPB.�SET�ENTRY�FOUND�BIT(31)4*‹AND�IF�EITHER�NEGFLAG�OR�TABFLAG�ARE�ON,SET�BIT�301*‹IN�THE�CURRENT�ENTRY.�UPDATE�THE�POINTER�TO�THE*‹NEXT�LISTPB�ENTRY."*‚REV�1.00�3/12/80�(SANDY�DEARING)*‚ENTRY:D3=BINARY�NUMBER'*ˆA6=POINTER�TO�CURRENT�ENTRY�IN�LISTPB*‚EXIT:A6=NEXT�ENTRY�IN�LISTPB*‚USES:0�1�2�3�4�5�6�7*…D‡P*…A‹P�R?***************************************************************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' 2�TST.B�TABFLAG-DATASG(A5)‚IS�THIS�NUMBER�FOR�TABS? BEQ.S SAVBN20 BRANCH IF NO7SAVBN10�CLR.B�NEGFLAG-DATASG(A5)„TURN�OFF�NEGATIVE�FLAG OR.B #$40,(A6) TURN ON BIT 307SAVBN20 ADD.L #4,A6 UPDATE POINTER TO NEXT LISTPB ENTRY RTS. RETURN…PAGE?****************************************************************9*ƒGETCMD‚READ�INPUT�COMMAND�AND�SEARCH�FOR�NEXT�DELIMETER#*‹(BLANK)�OR�END�OF�DATA�FLAG�($DE)*ƒREV�1.00‚12-3-79�(C313)**ƒENTRY:‚A0=ADDRESS�OF�NEXT�CHAR�IN�BUFFER&*‹A1=END�ADDRESS+1�OF�LAST�BUFFER�CHAR*‹A2=0*‹D0=0)*ƒEXIT:ƒA0=ADDRESS�OF�NEXT�CHAR�IN�BUFFER*‹A1=UNCHANGED0*‹A2=FIRST�1-4�CHARS�FOUND�BEFORE�NEXT�DELIMITER%*‹D0=#�CHARS�FOUND,MAY�BE�MORE�THAN�4*‹D1=1�IF�NEXT�CHAR=END�FLAG*‹D1=0�IF�NEXT�CHAR=BLANK**ƒUSES:0�1�2�3�4�5�6�7 *†D�R�R�* *†A�R�P�R…P@**************************************************************** GETCMDƒEQU‚*ˆCLR.L‚D1ƒCLEAR�RETURN�FLAG!ˆCMP.L‚A0,A1„SEE�IF�END�OF�BUFFER(ˆBLT.S‚GETCMDER‚BRANCH�IF�PAST�END-ERRORˆMOVE.B‚(A0)+,D1‚GET�A�CHARˆCMP.W‚#ENDOD,D1„SEE�IF�END ˆBNE.S‚GETCMD1„BRANCH�IF�NOT�END,GETCMD01‚MOVE.L‚#1,D1…SET�END�OF�BUFFER�FLAG ˆRTS�RETURNGETCMD1‚CMP.B‚#$20,D1ƒA�BLANK?"ˆBNE.S‚GETCMD2ƒBRANCH�IF�NOT�BLANK&‡TST.L‚D0ŠA�BLANK-SEE�IF�GOT�ANY�CHARS$ˆBEQ.S‚GETCMD„NONE�YET-LOOK�FOR�MORE+GETCMD05 MOVE.B (A0)+,D1 GET NEXT CHARACTER‰CMP.B�#$20,D1‚A�BLANK?!‰BEQ.S�GETCMD05�BRANCH�IF�A�BLANK‰CMP.W�#ENDOD,D1�SEE�IF�END%‰BEQ.S�GETCMD01�BRANCH�IF�END�OF�DATA&‰SUB.L�#1,A0„A�CHARACTER,RESET�POINTER ‡CLR.L‚D1‰TURN�ON�NEXT�CHAR�FLAG ‡RTS�RETURN)GETCMD2�CMP.B�#'A',D1„MAKE�SURE�ITS�ALPHA"‡BLT.S�GETCMD3…BRANCH�IF�NOT�ALPHA‡ADD.L‚#1,D0ƒCOUNT�THIS�CHAR‡CMP.L‚#4,D0†SEE�IF�4�YET"‡BGT.S‚GETCMD…MORE�THAN�4-GET�MORE ‡MOVE.L‚A2,D2…MOVE�CHARS�WE�HAVE‡LSL.L‚#8,D2†MOVE�WHAT�WE�HAVE‡ADD.L‚D1,D2†ADD�IN�NEW�CHAR‡MOVE.L‚D2,A2…SAVE�RESULT‡BRA.S‚GETCMD…LOOK�FOR�MORE#GETCMDER‚MOVE.L‚#0,D0ƒNOTHING�FOUND ‡RTS�RETURN*GETCMD3�MOVE.L�#0,A2‚SET�NO�COMMAND�RETURN ‡RTS�RETURN‚PAGE?****************************************************************5*‚GETVR‚GET�VERTICAL�RANGES�FROM�PARAMETER�BLOCK�LIST1*‰AND�CONVERT�TO�ACTUAL�FILE�RECORD�NUMBER�TO�USE3*‰OR�USE�DEFAULTS.‚DEFAULT�1ST�VERTICAL�RANGE=REC�0!*‰DEFAULT�#RECORDS=TO�END�OF�FILE*‚REV.�1.00�3/6/80‚(C313)(*‚ENTRY:A4=ADDRESS�OF�1ST�VERTICAL�RANGE**‚EXIT:�D1=0=JUST�1ST�VERTICAL�RANGE�FOUND!*ˆD1=1=FOUND�BOTH�VERTICAL�RANGES0*ˆD1=-1=NO�VERTICAL�RANGES�FOUND,USEING�DEFAULTS*ˆ0(A4)=START�RECORD�#,4�BYTES*ˆ4(A4)=#�RECORDS,4�BYTES(*‚GOOD�RETURN=CALLER�ERROR�RETURN=CMDERR*‚USES:0�1�2�3�4�5�6�7 *…D�*�R�**…A‰P�P@**************************************************************** GETVR‚EQU‚*‡CLR.W‚D1ƒRETURN�FLAG"‡MOVE.L‚(A4),D0„1ST�VERTICAL�RANGE†BCLR.L‚#31,D0†FOUND�ONE?1†BEQ.S‚GETVR10…BRANCH�IF�NOT�FOUND,START�AT�REC�0†BCLR.L‚#30,D0„*�?%†BEQ.S‚GETVR20…BRANCH�IF�NOT�*�OR�NEG †TST.L‚D0‰*?'†BEQ.S‚GETVR30„BRANCH�IF�*,USE�FILELINE* *‚ERROR�FOUND* GETVR05‚ADD.L�#4,A7�UPDATE�STACK†BRA�CMDERR‰ASK�WHAT**‚HERE�IF�START�AT�REC�#0*'GETVR10‚MOVE.W‚#-1,D1ƒVR�NOT�FOUND�FLAG&GETVR15‚CLR.L‚(A4)…START�RECORD�NUMBER‰BRA.S‚GETVR50…LOOK�FOR�2ND�VR*>*‚HERE�IF�POSITIVE�REC�#,START�AT�0,OR�POSITION�AT�END�OF�FILE*"GETVR20‚TST.L‚D0…POSITION�AT�ZERO?‰BEQ.S‚GETVR15ƒBRANCH�IF�YES*ˆCMP.L‚#999999,D0„POSITION�AT�END�OF�FILE?‡BEQ.S‚GETVR25…BRANCH�IF�YES0‡SUB.L�#1,D0�MAKE�IT�MATCH�FILELINE�TYPE�NUMBERS!‡MOVE.L‚D0,(A4)ƒPOSITION�RECORD�#‡BRA.S‚GETVR50†LOOK�FOR�2ND�VR*-*‚HERE�IF�POSITION�AT�END�OF�FILE,USE�MAXLINE*5GETVR25‚MOVE.L‚MAXLINE-DATASG(A5),(A4)„START�RECORD�#ˆBRA.S‚GETVR50‹LOOK�FOR�2ND�VR**‚HERE�IF�USE�CURRENT�REC�#*3GETVR30‚MOVE.L‚FILELINE-DATASG(A5),(A4)ƒSTART�REC�#'‚MOVE.L�4(A4),D0�GET�2ND�VERTICAL�RANGE‚BCLR.L�#31,D0�FOUND�IT?‚BEQ.S�GETVR60�BRANCH�IF�NO&GETVR35 MOVE.L D0,4(A4) SAVE # RECORDS„TST.L�D0�RECORD�#0?"…BEQ�GETVR05�BRANCH�IF�YES,ILLEGAL‚MOVE.L�#1,D1�SET�FOUND�FLAG) CMP.L MAXLINE-DATASG(A5),D0 BEYOND FILE? BGT.S GETVR60 BRANCH IF YES'  RTS RETURN**‚GET�SECOND�VERTICAL�RANGE*GETVR50‚MOVE.L‚4(A4),D0‚2ND�VR‡BCLR.L‚#31,D0‚FOUND�ONE?"‡BEQ.S‚GETVR60„BRANCH�IF�NO�2ND�VR‡TST.L�D0‚SEE�IF�ZERO�INPUT#‡BEQ�GETVR05�BRANCH�IF�ZERO,ILLEGAL0‡CMP.L�(A4),D0�SEE�IF�2ND�VR�GREATER�THAN�1ST�VR.‡BLT�GETVR05‚BRANCH�IF�2ND�LESS�THAN�1ST-ERROR‡MOVE.L‚#1,D1„SET�FOUND�FLAG‡MOVE.L‚D0,4(A4)‚LAST�REC�#‡MOVE.L�(A4),D0�GET�START�REC�#‡SUB.L�D0,4(A4)�MAKE�#�RECORDS/‡CMP.B�#'M',CURCMD-DATASG(A5)�IN�MERGE�COMMAND?;‡BEQ.S�GETVR55�BRANCH�IF�IN�MERGE�COMMAND,DON'T�USE�MAXLINE 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**‚HERE�IF�NO�2ND�VERTICAL�RANGE*5GETVR60‚MOVE.L‚#-1,4(A4)ƒDEFAULT�#�RECORDS=WHOLE�FILE‰BRA.S‚GETVR55ŠRETURN†PAGE?****************************************************************6*‚GETHR‚GET�HORIZONTAL�RANGE�FROM�PARAMETER�BLOCK�LIST/*‰AND�CONVERT�TO�ACTUAL�COLUMN�NUMBER�TO�USE,OR*‰USE�DEFAULTS�OF�1-79.*‚REV�1.00�3/6/80‚(C313)**‚ENTRY:A4=ADDRESS�OF�1ST�HR�IN�PARA�BLOCK*‚EXIT:�A4=UNCHANGED*ˆD1=0=GOOD�RETURN*ˆD1=-1=INVALID�ENTRY�FOUND*ˆ0(A4)=START�COLUMN�NUMBER*ˆ4(A4)=END�COLUMN�NUMBER*‚USES:�0�1�2�3�4�5�6�7 *…D‚*�R�* *…AŠP�P�*@**************************************************************** GETHR‚EQU‚*‡CLR.W‚D1ƒCLEAR�RETURN�FLAG‡MOVE.L‚(A4),D0„GET�1ST�HR‡BCLR.L‚#31,D0…FOUND�ONE?(‡BEQ.S‚GETHR10…BRANCH�IF�NO,USE�DEFAULTS‡BCLR.L‚#30,D0…TAB�STOPS?‡BNE.S‚GETHR40‚BRANCH�IF�YES%GETHR05‚CMP.L�#0,D0†CANT�BE�0�OR�LESS!‡BLE.S�GETHR30�BRANCH�IF�IS,ERROR!‡CMP.L�#80,D0ƒCANT�BE�MORE�THE�80!‡BGT.S�GETHR30�BRANCH�IF�IS,ERROR"‡MOVE.L‚D0,(A4)„SAVE�IN�PARA�BLOCK‡MOVE.L‚4(A4),D0ƒGET�2ND�HR‡BCLR.L‚#31,D0…FOUND�ONE?,‡BEQ.S‚GETHR20„BRANCH�IF�NOT�ONE,USE�DEFAULT ‡CMP.L�#0,D0�CANT�BE�LESS�THAN�0!‡BLT.S�GETHR30�BRANCH�IF�IS,ERROR%‡CMP.L�#80,D0�CANT�BE�GREATER�THAN�80)‡BLT.S�GETHR06�BRANCH�IF�LESS�THAN�80,�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.L�D0,D2‚1ST�CANT�BE�GREATER�THAN�2ND�HR!‡BGT.S�GETHR30�BRANCH�IF�IS,ERRPR*‡MOVE.L‚D0,4(A4)ƒSAVE�2ND�HR�IN�PARA�BLOCK ‡RTS�RETURN**„HERE�IF�USING�DEFAULTS*%GETHR10‚MOVE.L‚#1,(A4)„1ST�HR�DEFAULT'GETHR20‚MOVE.L‚#79,4(A4)‚2ND�HR�DEFAULT ‰RTS‘RETURN**‚HERE�IF�AN�ERROR* GETHR30‚MOVE.W‚#-1,D1ƒERROR�FLAG ‰RTSŽRETURN*.*‚HERE�IF�USING�TAB�STOPS�FOR�HORIZONTAL�RANGE*6GETHR40‚LEA�SVTABS-DATASG(A5),A6�GET�TAB�STOPS�ADDRESS 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*‚DOCHG�DO�THE�REQUESTED�CHANGE�TO�THE�RECORD�IN�EDITBUF*‚ENTRY:D7=0=HAVE�A�STRING1*ˆD7=NEG=NULL�SRTING�1 *‚CALLS:FMS*‚USES:0�1�2�3�4�5�6�7*…D�*�*�*�*ƒ*�*�**…A�*�*�*�*�*�P�*=************************************************************* DOCHG EQU *;„MOVE.L�FMSREC(A0),SVREC-DATASG(A5)ƒSAVE�THIS�RECORD�NUMBER, 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**‚MOVE�STRING2�INTO�RECORD*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 STRING19�LEA…FMSDATA-DATASG(A5),A6�START�ADDRESS�OF�OUTPUT�BUFFER( 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‚DOCHG120�BRANCH�IF�MOVED�ALL9DOCHG40 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*‚HERE�IF�NULL�STRING1-INSERT�STRING2�AT�START�OF�HR* 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 LENGTH0�MOVE.B�D2,SPARE-DATASG(A5)‚SAVE�STRING�2�LENGTH) LEA EDITBUF-DATASG(A5),A1 RECORD ADDRESS MOVE.L A1,A3 SAVE IT2 ADD.L D3,A3 START ADDRESS OF WHERE TO PUT STRING26�LEA…FMSDATA-DATASG(A5),A6�WHERE�TO�PUT�UPDATED�RECORD& 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*&*‚HERE�IF�NULL�STRING2-DELETE�STRING�1* DOCHG90�EQU‚*'�CLR.B�SPARE-DATASG(A5)‚STRING�2�LENGTH, SUB.L #8,A4 POINT TO STRING 1 START ADDRESS& MOVE.L (A4),D0 STRING 1 START ADDRESS&�BMI.S‚DOCHGER�BRANCH�IF�NOT�OFF-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 RECORD9�LEA…FMSDATA-DATASG(A5),A6�START�ADDRESS�OF�OUTPUT�BUFFER( 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*&*‚REPLACE�FILE�RECORD�WITH�THIS�RECORD*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.L�A1,FILELINE-DATASG(A5)ƒRESTORE�FILELINE 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.*‡INPUT�FOR�CHANGE�COMMAND�IS�A.�IF�NO,RETURN.4*‡IF�YES,SEARCH�THIS�RECORD�FOR�MORE�STRING�MATCHES,2*‡DO�UPDATE.‚SEARCH�RECORD�UNTIL�STRING�NOT�FOUND.*>************************************************************** 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 YES�RTS‚RETURN,NOT�ALLCCKCNT10 MOVE.L REC-DATASG(A5),SVRECNT-DATASG(A5) SAVE RECORD NUMBER, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS8�MOVE.L�FMSREC(A0),REC-DATASG(A5)ƒUSE�LAST�RECORD�NUMBERB�MOVE.B�FMSCNT(A0),SVCNT-DATASG(A5)‚SAVE�BYTE�COUNT�OF�LAST�STRING@ 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 BIGGER9CKCNT14�ADD.B�D3,SVCNT-DATASG(A5)…NEXT�STRING�START�BYTE#2�MOVE.B�D3,SVLNG-DATASG(A5)‹SAVE�THE�STRING�LENGTH+�MOVE.W�#1,RECN-DATASG(A5)ŒFORCE�ONE�RECORD(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.B�SVCNT-DATASG(A5)‚CLEAR�FOR�NEXT�USE% 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)„GET�NEXT�OCCURENCE BRA CKCNT15 GO LOOK AGAIN9CKCNT36�ADD.B�#1,COUNT-DATASG(A5)„LOOK�FOR�NEXT�OCCURENCE BRA CKCNT15 GO LOOK AGAIN1CKCNT40�BSR.S�CKHRƒSEE�IF�WITHIN�HORIZONTAL�RANGE 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 CHANGE3�MOVE.B�FMSCNT(A0),SVCNT-DATASG(A5)„NEXT�BYTE�COUNT- MOVE.B SVLNG-DATASG(A5),D0 GET STRING LENGTH(�ADD.B�D0,SVCNT-DATASG(A5)…ADD�IN�LENGTH$ BRA CKCNT15 GO SEARCH TIL NOT FOUND PAGE>***************************************************************0*‚CKHR�CHECK�STRING�FOR�WITHIN�HORIZONTAL�RANGE.,*‡IF�NOT�WITHIN�HR,SEARCH�FOR�NEXT�OCCURENCE3*‡OF�STRING�UNTIL�STRING�WITHIN�RANGE�OR�NOT�FOUND.*‚RETURN�D0=0=WITHIN�RANGE*‰D0=-1=NOT�WITHIN�RANGE*?***************************************************************)  CKHR‚EQU‚*= MOVE.B COUNT-DATASG(A5),CNTHR-DATASG(A5) SAVE ORIGINAL COUNT2‚ADD.B�#1,COUNT-DATASG(A5)ƒLOOK�FOR�NEXT�OCCURENCEA‚MOVE.W�RECN-DATASG(A5),RECNHR-DATASG(A5)�SAVE�#RECORDS�TO�SEARCH)‚MOVE.W�#1,RECN-DATASG(A5)„FORCE�1�RECORD?‚MOVE.L�REC-DATASG(A5),RECHR-DATASG(A5)‚SAVE�THIS�RECORD�NUMBER8‚MOVE.L�FMSREC(A0),REC-DATASG(A5)ƒUSE�THIS�RECORD�NUMBER6CKHR01‚LEA�LISTPB-DATASG(A5),A4�GET�PARA�BLOCK�ADDRESS‚MOVE.L�8(A4),D0�GET�FIRST�HR‚MOVE.L�12(A4),D1�GET�2ND�HR‚CMP.B�#1,D0�1ST�HR�=1?‚BNE.S�CKHR10�BRANCH�IF�NO‚CMP.B�#79,D1�2ND�HR=80?‚BNE.S�CKHR10�BRANCH�IF�NO CKHR05 CLR.L D0 GOOD RETURN FLAG!‚BRA.S‚CKHR30‚GO�RESET�ALL�VALUES4CKHR10 SUB.B #1,D0 MAKE RANGE MATCH BYTE # OF STRING.‚SUB.B�#1,D1†MAKE�RANGE�MATCH�BYTE�#�OF�STRING6‚CMP.B�FMSCNT(A0),D0�RETURN�BYTE#�AT�OR�BEYOND�1ST�HR? BGT.S CKHR20 BRANCH IF NO+‡MOVE.L�FMSADR(A0),A2�GET�POINTER�TO�STRING+ 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*ˆDeleted�line�=�ADD.L�D3,D0�END�BYTE�OF�STRING�(already�have�it)�010785 CMP.L D0,D1 BEYOND END OF HR?% BGE CKHR05 BRANCH IF NO,WITHIN RANGE CKHR20‚EQU‚**‚BSR.S‚DOSRCH‚GO�SEARCH�FOR�NEXT�OCCURENCE4ƒADD.B�#1,COUNT-DATASG(A5)„FOR�NEXT�SEARCH,IF�NEEDEDƒTST.B�FMSTAT(A0)�GOOD�RETURN?8‚BEQ‚CKHR01�BRANCH�IF�GOOD�RETURN,CHECK�FOR�WITHIN�RANGE$�MOVE.L�#-1,D0‚NOT�WITHIN�RANGE�FLAG=CKHR30‚MOVE.B�CNTHR-DATASG(A5),COUNT-DATASG(A5)‚RESTORE�COUNT;‚MOVE.W�RECNHR-DATASG(A5),RECN-DATASG(A5)‚RESTORE�#�RECORDS=‚MOVE.L�RECHR-DATASG(A5),REC-DATASG(A5)„RESTORE�RECORD�NUMBER ‚RTS‚RETURN†PAGE?****************************************************************6*�DOSRCH‚SETS�UP�FOR�FMS�SEARCH�FOR�STRING�COMMAND�AND*‰FIELDS�FMS�ERROR�RETURN* USES: 0 1 2 3 4 5 6 7*„D‚R*„A‚R‰P?*************************************************************** DOSRCH‚EQU‚*(†LEA‚FMSPKT-DATASG(A5),A0„PACKET�ADDRESS5†MOVE.B‚#SRCHCMD,FMSCMD(A0)ƒSEARCH�FOR�STRING�COMMAND/2!7)=1†BSR‚FMS‘DO�IT%†TST.L‚D0…1ST�RECORD�TO�SEARCH�FOUND?†BEQ.S�DOSRCHRTN�BRANCH�IF�YES:†ADD.L�#4,A7�UPDATE�STACK�FOR�ERROR,MESSAGE�ALREADY�OUTPUTDOSRCHRTN�RTSŠRETURN†PAGE?****************************************************************+*‚MULFIND‚OUTPUT�A�LINE�AT�A�TIME�TO�SCREEN*‹CONTAINING�THE�'FIND'�RECORD.*‚REV.�1.00�3/10/80�(C313)&*‚ENTRY:EDITBUF�CONTAINS�OUTPUT�RECORD*‚EXIT:TO�CALLER*‚USES:�0�1�2�3�4�5�6�7 *…D‚*ƒ*�*�* *…A‚*�*‡P'*‚CALLS:SETPROP„BLDCRT„HOMECUR†SCROLOUT*ˆSEND1†CRTOUT„SEND1?*************************************************************** MULFIND‚EQU‚*(‰TST.B�SCROLL-DATASG(A5)„IN�SCROLL�MODE?&‰BMI.S�MULF30�BRANCH�IF�IN�SCROLL�MODE+‰MOVE.B�#LINE20,D0ƒLAST�VIRTUAL�LINE�NUMBER%‰BSR‚SETPROP…SET�PAGE�MODE�PROTECTION2‰TST.B‚MULFSW-DATASG(A5)…HAVE�WE�BEEN�HERE�BEFORE?‰BNE.S‚MULF10…BRANCH�IF�YES%‰MOVE.B�#CLRSCRN,D0…CLEAR�SCREEN�CODE‰BSR‚SEND1ˆOUTPUT�IT6‰MOVE.B‚#POSONE,MULFSW-DATASG(A5)…SWITCH=SCREEN�LINE�#/MULF10‚LEA‚EDITBUF-DATASG(A5),A1…RECORD�ADDRESS$ˆMOVE.L‚#RECLNG,D2„MAX�RECORD�LENGTH/ˆMOVE.B‚MULFSW-DATASG(A5),D3…SCREEN�LINE�NUMBER& 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.B�D3,MULFSW-DATASG(A5)ƒSAVE�LINE�20)MULF15‚BSR‚BLDCRT‹BUILD�OUTPUT�REC�BUFFER*…CRT.OUT‚CRTIOS,OUTBUF,D4ƒOUTPUT�TO�SCREEN…BNE‚EDITERROR…ERROR�RETURN#…CMP.B‚#LINE20,D3ƒPAST�BOTTOM�LINE? …BLE.S‚MULF20†BRANCH�IF�NOT�PAST …RTS�RETURN>MULF20‚ADD.B‚#1,MULFSW-DATASG(A5)„NEXT�SCREEN�LINE�#�TO�OUTPUT …RTS�RETURN?MULF30�MOVE.B�#1,MULFSW-DATASG(A5)ƒTURN�ON�MULTIPLE�FIND�SWITCH) %�TST.B�VERFLG-DATASG(A5)…WANT�OUTPUT?( BMI.S MULF40 BRANCH IF NO OUTPUT WANTED* BSR SCROLOUT DO SCROLL MODE SCREEN OUTPUTMULF40 RTS RETURN,DONE PAGE?****************************************************************9*‚OUTFIND�CRTMODE:OUTPUT�PAGE�CONTAINING�RECORD�FROM�FIND *‹COMMAND*ŠSCROLL�MODE:OUTPUT�1�RECORD*‚REV�1.00�3/10/80�(C313)*‚EXIT:TO�CALLER*‚USES:0�1�2�3�4�5�6�7*…D�*�**…A‹P�**‚CALLS:SETPROPƒSETPROC*ˆPUTP†WRTSCRN*ˆEOFMESSƒSCROLOUT@**************************************************************** OUTFIND‚EQU�*(�TST.B�SCROLL-DATASG(A5)„IN�SCROLL�MODE?& BMI.S OUTF40 BRANCH IF IN SCROLL MODE- MOVE.L FILELINE-DATASG(A5),D0 GET FILELINE #2�CMP.L�MAXLINE-DATASG(A5),D0‚SEE�IF�AT�END�OF�FILE#�BEQ.S�OUTF10‚BRANCH�IF�END�OF�FILE�TST.L�D0ƒSEE�IF�TOP�OF�FILE# BEQ.S OUTF20 BRANCH IF TOP OF FILE*‚HERE�IF�FILELINE�WITHIN�FILE#* 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.L�D0,TOPLINE-DATASG(A5)„SAVE�NEW�TOPLINE<�MOVE.B�SAVEP-DATASG(A5),LINE-DATASG(A5)†RESET�PROMPT�LINE�# BRA.S OUTF30 GO DO OUTPUT**‚HERE�IF�FILELINE=MAXLINE*‚PUT�FILE�ON�LAST�SCREEN�LINE*(OUTF10‚SUB.L�#19,D0�POINT�TO�NEW�TOPLINE%�MOVE.L�D0,TOPLINE-DATASG(A5)ƒSAVE�IT TST.L D0 SEE IF LESS THAN ZERO- BMI.S OUTF15 BRANCH IF LESS-USE FIRST RECORD1�MOVE.B�#LINE20,LINE-DATASG(A5)‚NEW�PROMPT�LINE�# BRA.S OUTF30 GO DO OUTPUT+OUTF15�CLR.L�TOPLINE-DATASG(A5)‚NEW�TOPLINE/ MOVE.L FILELINE-DATASG(A5),D0 GET CURRENT LINE% ADD.L #POSONE,D0 ADD IN SCREENLINE #*�MOVE.B�D0,LINE-DATASG(A5)„PROMPT�POSITION BRA.S OUTF30 OUTPUT TO SCREEN**‚HERE�IF�FILELINE�AT�TOP*+OUTF20�CLR.L�TOPLINE-DATASG(A5)‚NEW�TOPLINE1�MOVE.B�#POSONE,LINE-DATASG(A5)ƒNEW�PROMPT�LINE�#-�CLR.L�FILELINE-DATASG(A5)ƒMAKE�SURE�ITS�ZERO** OUTPUT TO SCREEN*,OUTF30 MOVE.B #LINE20,D0 LAST VIRTUAL LINE #& BSR SETPROP CHANGE TO PAGE PROTECTION$ BSR WRTSCRN DO ACTUAL SCREEN OUTPUT3 MOVE.B LINE-DATASG(A5),D0 SCREEN LINE # FOR PROMPT BSR PUTP POSITION PROMPT% BSR SETPROC RESET COMMAND PROTECTION RTS RETURN+OUTF40�TST.B�VERFLG-DATASG(A5)‚WANT�OUTPUT?( BMI.S OUTF50 BRANCH IF NO OUTPUT WANTED' BSR SCROLOUT OUTPUT SCROLL MODE RECORDOUTF50 RTS RETURN,DONEéééééé* é PAGE* *‚CRTE2.SA*=**************************************************************;*‚RANGE�COMMAND�-�ESTABLISH�DEFAULT�VALUES�FOR�THE�VERTICAL-*’AND�HORIZONTAL�RANGES.�USED�BY�FIND,CHANGE,.*’SAVE,AND�PRINT�COMMANDS.�CHECKS�TO�MAKE�SURE.*’THE�NUMBERS�ARE�VALID.�IF�THE�2ND�HORIZONTAL%*’RANGE�IS�BEYOND�79�IT�IS�SET�TO�79.*‚REV.�1.00�4/8/80�(C313)*‚REV.�2.00�8/26/82�(C313)/*‚ENTRY:D1=0�IF�NEXT�CHAR�IN�INPUT�BUFFER=BLANK/*ˆD1=1�IF�NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA+*ƒEXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7*…D�*�* *…Aƒ*�*�*�*�P*‚CALLS:PROCLIST=************************************************************* RANGE‚EQU‚* TST.L D1 ANY PARAMETERS?.�BNEƒRANG60�BRANCH�IF�NO,DELETE�CURRENT�RANGES( LEA RANGL-DATASG(A5),A4 LIST TO PROCESS BSR PROCLIST PROCESS IT) LEA LISTPB-DATASG(A5),A4 RETURNED VALUES" MOVEM.L (A4),D0-D3 GET THE VALUES' CLR.L D4 FLAG FOR ANY FOUND RANGES SET*!*ˆSEE�IF�VERTICAL�RANGE�SPECIFIED*$�BCLR.L�#31,D0�IS�THERE‚A�1ST�RANGE?8 BEQ.S RANG30 BRANCH IF NO - GO CHECK HORIZONTIAL RANGES TST.L D0 IS VALUE ZERO?& BEQ.S RANG15 BRANCH IF ZERO - ILLEGAL MOVE.B #1,D4 SET FOUND A RANGE�BCLR.L�#30,D0‚*�SPECIFIED? BEQ.S RANG10 BRANCH IF NOD MOVE.L FILELINE-DATASG(A5),D0 * SPECIFIED, USE CURRENT LINE FOR NOW,RANG10 CMP.L MAXLINE-DATASG(A5),D0 PAST EOF?$ BLE.S RANG20 BRANCH IF NOT PAST EOFRANG15 BRA CMDERR ERROR RETURN'RANG20 BCLR.L #31,D1 IS THERE A 2ND VR? BEQ.S RANG30 BRANCH IF NO CMP.L D0,D1 2ND MUST BE = OR >% BLT RANG15 BRANCH IF SMALLER - ERROR**ˆCHECK�HORIZONTAL�RANGES*#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**ˆSAVE�THE�FOUND�RANGES*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 FLAG�RTS‚RETURN-DONE**‚DELETE�SET�RANGES�HERE*,RANG60�CLR.B�RANGSW-DATASG(A5)‚TURN�OFF�FLAG. 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 CLEAR�RTS‚RETURN-DONE PAGE?****************************************************************;*‚DELETE�COMMAND�-�DELETE�THE�REQUESTED�DATA�FROM�THE�FILE.*‚REV.�1.00�4/14/80�(C313)/*‚ENTRY:D1=0�IF�NEXT�CHAR�IN�INPUT�BUFFER=BLANK/*ˆD1=1�IF�NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA+*‚EXIT:GOOD�RETURN-MAINƒERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7 *…D�*�*�*‡**…A�*�*�*�*�*�P.*‚CALLS:PROCLIST‚GETVR„GETHR…FMS„DODEL„SCROLRD+*ˆCNVTHA„OUTFIND‚WRTMESSƒSEND1‚HOMECUR‚P* UTP@**************************************************************** DELETE‚EQU‚*)�TST.B�FILEOPT-DATASG(A5)‚USING�K�OPTION?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? DEL40�BNEƒCMDERR�BRANCH�IF�ERROR*7*‚SEE�IF�DELETING�ENTIRE�LINE-ALSO�USED�BY�MOVE�COMMAND* CMP.L #1,(A4) 1ST HR=1?0�BNEƒDEL60�BRANCH�IF�NO,NOT�DELETING�ENTIRE�LINE CMP.L #79,4(A4) 2ND=79?�BNEƒDEL60�BRANCH�IF�NO**‚HERE�IF�DELETING�ENTIRE�LINE*9DEL41„LEA�LISTPB-DATASG(A5),A4�RESTORE�PARA�BLOCK�ADDRESS* 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*"*‚HERE�IF�DELETED�ALL�FILE�RECORDS*-�CLR.L�FILELINE-DATASG(A5)‚SET�RECORD#�TO�NEW4�CLR.L�TOPLINE-DATASG(A5)ƒSET�TOP�SCREEN�LINE�TO�NEW5�MOVE.B�#-1,EMTYFILE-DATASG(A5)‚SET�FILE�TO�OLD�EMPTY.�MOVE.B�#1,FILETYPE-DATASG(A5)ƒSET�FILE�TO�NEW7�MOVE.L�#-1,MAXLINE-DATASG(A5)ƒRESET�MAX�COUNT�TO�EMPTY/�CLR.B�FSTSW-DATASG(A5)ŠRESET�FIRST�TIME�SWITCH(�TST.B�SCROLL-DATASG(A5)„IN�SCROLL�MODE?% BMI.S DEL45 BRANCH IF IN SCROLL MODE! MOVE.B #CLRSCRN,D0 CLEAR LINE 21 BSR SEND1 DO IT0�MOVE.B�#1,CURMODE-DATASG(A5)‚SET�PAGE�MODE�FLAG" 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.S�DEL67ƒOUTPUT�#�RECORDS�DELETED�MESSAGE-DEL50�TST.B�SCROLL-DATASG(A5)ƒIN�SCROLL�MODE? BEQ.S DEL55 BRANCH IF NO*"*ˆIN�SCROLL�MODE,READ�NEW�FILELINE* 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*.*‚HERE�IF�DELETING�HORIZONTAL�RANGE�PER�RECORD**‚READ�RECORD,DO�DELETE,REPLACE�THE�RECORD* 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),A0�OUTPUT�RECORD�NOT�FOUND�MESSAGE 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 IT0�LEA‚FMSDATA-DATASG(A5),A6�OUTPUT�BUFFER�ADDRESS- 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*"*‚REPLACE�UPDATED�RECORD�INTO�FILE*4�MOVE.L�(A3),FILELINE-DATASG(A5)†RECORD�#�TO�REPLACE+ MOVE.B #REPLCMD,FMSCMD(A0) REPLACE COMMAND BSR FMS DO THE REPLACE TST.L D0 GOOD REPLACE? BNE DEL40 BRANCH IF NO-ERROR(�TST.B�SCROLL-DATASG(A5)ƒIN�SCROLL�MODE? 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.L�4(A3),D0�MORE�RECORDS�TO�FIX?) 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.B�BRKFLG-DATASG(A5)‚A�BREAK?) 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.B�SCROLL-DATASG(A5)ƒIN�SCROLL�MODE?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*‚EXTEND�COMMAND�-�INSERT�DATA�AT�THE�END�OF�RECORDS*‚REV.�1.00�4/16/80�(C313)2*‚ENTRY:D1=0�IF�NEXT�CHAR�IN�INPUT�BUFFER�IS�BLANK2*ˆD1=1�IF�NEXT�CHAR�IN�INPUT�BUFFER�IS�END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA+*‚EXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7 *…D�*�*�*�*…**…A�*�*�*�*�*�P�*:*‚CALLS:PROCLIST‚GETVR‚FMS‚WRTMESS‚OUTFIND�SVEXTND�SCROLRDA***************************************************************** EXTEND‚EQU‚*) TST.B FILEOPT-DATASG(A5) USING K OPTION?3 BNE.S 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+ 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.W�6(A4),RECN-DATASG(A5)‚#�RECORDS�TO�READ) 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**‚READ�THE�RECORD*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*(*‚UPDATE�FILE�RECORD�-�RECORD�IN�EDITBUF*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 MOVED4EXTND115�MOVE.L�#RECLNG,D1�#�BYTES�PER�RECORD‚0103851EXTND120 MOVE.B (A1)+,(A6)+ MOVE TO OUTPUT BUFFER SUB.L #1,D1 DECREMENT COUNT BNE.S EXTND120 MOVE TIL DONE**‚REPLACE�FILE�RECORD*, 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.L�A1,FILELINE-DATASG(A5)…RESTORE�FILELINE TST.L D0 GOOD RETURN? BNE EXTND10 BRANCH IF ERROR(�TST.B�SCROLL-DATASG(A5)ƒIN�SCROLL�MODE? 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 RECORD3�SUB.W�#1,RECN-DATASG(A5)‚DECREMENT�#�RECORDS�TO�DO' BEQ.S EXTND130 BRANCH IF NO MORE TO DO!�TST.B�BRKFLG-DATASG(A5)‚A�BREAK?, BMI.S EXTND130 BRANCH IF YES,DONE EXTENDING3�ADD.L�#1,REC-DATASG(A5)‚POINT�TO�NEXT�RECORD�TO�DO 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*!*‚DONE�WITH�EXTEND-REWRITE�SCREEN*=EXTND130�TST.W�FINDSW-DATASG(A5)‚FOUND�ANY�RECORDS�TO�CHANGE? BEQ EXTND65 BRANCH IF NOJ MOVE.L SVREC-DATASG(A5),FILELINE-DATASG(A5) FILELINE=LAST RECORD# CHANGED(�TST.B�SCROLL-DATASG(A5)‚IN�SCROLL�MODE?3 BMI.S EXTND135 BRANCH IF YES,RECORD ALREADY OUTPUT6 BSR OUTFIND OUTPUT PAGE CONTAINING FILELINE TO SCREEN-�CLR.W�FINDSW-DATASG(A5)ƒCLEAR�RECORD�COUNTEREXTND135�RTS‚RETURN-DONE**‚SAVE�STRING�HERE* SVEXTND�EQU‚*/ 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*‚ADUPLCT�APPEND�DUPLICATE�COMMAND�ROUTINE-APPEND�THE�REQUESTED�DATA*ŠINTO�THE�EXTRACT�BUFFER.;*‚DUPLCT�DUPLICATE�COMMAND�ROUTINE.�COPY�THE�REQUESTED�DATAE*‰INTO�THE�EXTRACT�BUFFER�AFTER�DELETING�ANY�EXISTING�EXTRACT�BUFFER.*‚REV.�1.00�4/10/80�(C313),*‚ENTRY:D1=0=NEXT�CHAR�IN�INPUT�BUFFER=BLANK,*ˆD1=1=NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5, =BASE�ADDRESS�OF�DATA+*‚EXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7*…D�*�* *…Aƒ*�*�*�*�P*‚CALLS:PROCLIST„GETVR„FMS?***************************************************************AADUPLCT�MOVE.B�#-1,COUNT-DATASG(A5)‚SET�APPEND�AND�DUPLICATE�MODE" BRA.S DUP05 USE DUPLICATE COMMAND DUPLCT�EQU‚*4 CLR.B COUNT-DATASG(A5) SET DUPLICATE WITHOUT APPEND.DUP05�TST.B�FILEOPT-DATASG(A5)ƒUSING�K�OPTION?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 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,DUP40�TST.B�COUNT-DATASG(A5)‚IN�APPEND�MODE?%†BEQ.S�DUP50�BRANCH�IF�IN�APPEND�MODE.†ORI.B�#$80,(A2)�STILL�HAVE�THE�EXTRACT�BUFFERDUP50 RTS RETURNDUPER BRA CMDERR ERROR RETURN PAGE=**************************************************************?*‚MERGE�COMMAND�ROUTINE.�MERGE�AN�EXISTING�FILE�INTO�THIS�FILE.*‚REV.�1.00�5/1/580�(C313),*‚ENTRY:D1=0=NEXT�CHAR�IN�INPUT�BUFFER=BLANK,*ˆD1=1=NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA+*‚EXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7*…D�*�* *…A�*�*ƒ*�*�P**‚CALLS:PROCLIST�GETVR�FMS�OUTFIND�WRTMESSF********************************************************************** MERGE‚EQU�*)�TST.B�FILEOPT-DATASG(A5)ƒUSING�K�OPTION?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 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 BLOCK6�MOVE.B�#'M',CURCMD-DATASG(A5)ƒSET�DOING�MERGE�COMMAND BSR GETVR GET VERTICAL RANGES+�CLR.B�CURCMD-DATASG(A5)ˆCLEAR�COMMAND�FLAG4�MOVE.L�(A4),REC-DATASG(A5)…SAVE�START�RECORD�NUMBER,�MOVE.W�6(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**‚CALL�FMS�TO�DO�THE�MERGE*,�TST.B�MSLUN-DATASG(A5)‚HAVE�A�LUN�FOR�THIS? 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 OUTPUT3�MOVE.L�FMSADR(A0),FILELINE-DATASG(A5)…NEW�RECORD�#3�MOVE.L�FMSREC(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*‚AMOVE�COMMAND�ROUTINE.�APPEND�THE�REQUESTED�DATA�INTO�THE�EXTRACTA*‡BUFFER�AND�DELETE�THE�REQUESTED�DATA�FROM�THE�CURRENT�POSITION.=*‡IF�ANY�DATA�WON'T�FIT�IN�THE�EXTRACT�BUFFER,THE�RECORDS�ARE(*‡NOT�DELETED�FROM�THE�CURRENT�POSITION.@*‚MOVE�C, OMMAND�ROUTINE.�COPY�THE�REQUESTED�DATA�INTO�THE�EXTRACT7*‡BUFFER�AND�DELETE�THE�REQUESTED�DATA�FROM�THE�CURRENT9*‡POSITION.‚USES�PART�OF�DELETE�COMMAND�CODE.�THE�EXTRACT$*‡BUFFER�IS�DELETED�BEFORE�THE�MOVE.*‚REV.�1.00‚4/10/80‚(C313),*‚ENTRY:D1=0=NEXT�CHAR�IN�INPUT�BUFFER=BLANK,*ˆD1=1=NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA+*‚EXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7 *…D�*�*�**…A�*�*�*�*�*�P-*‚CALLS:PROCLIST„GETHR„CNVTHA„OUTFIND„WRTMESS *ˆFMS‰DODEL>**************************************************************9AMOVE�MOVE.B�#-1,COUNT-DATASG(A5)‚SET�APPEND�MOVE�COMMAND& BRA.S MOVE10 USE MOVE COMMAND ROUTINE MOVE‚EQU‚*(�CLR.B�COUNT-DATASG(A5)‡SET�MOVE�COMMAND/MOVE10ƒTST.B�FILEOPT-DATASG(A5)„USING�K�OPTION?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 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**‚SEE�IF�VALID�RECORD�#*(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**‚SAVE�VALUES�IN�EXTRACT�BUFFER*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*(*‚DELETE�FILE�RECORDS�AND�REWRITE�SCREEN*; BRA DEL41 GO USE DELETE COMMAND CODE TO DELETE AND REWRITE/MOVE50�TST.B�COUNT-DATASG(A5)„MOVE�WITH�APPEND? 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*‚PRINT�COMMMAND�ROUTINE.�PRINT�THE�REQUESTED�DATA�TO*ˆTHE�LINE�PRINTER.*‚REV.�1.00‚5/1/80‚(C313);*‚REV.�2.00‚4/1/81‚(C313)�ADDED�DEVICE�SPECIFICATION�OPTION,*‚ENTRY:D1=0=NEXT�CHAR�IN�INPUT�BUFFER=BLANK,*ˆD1=1=NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA+*‚EXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7*…D�* *…A�*…*�*�P)*‚CALLS:PROCLIST„CKRANG„GETVR„FMS„WRTMESS:********************************************************** PRINT�EQU‚*+�TST.L�MAXLINE-DATASG(A5)ƒANY�FILE�RECORDS?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 BLOCK0�TST.B�RANGSW-DATASG(A5)…ANY�DEFAULT�RANGES�SET? BEQ.S PRNT10 BRANCH IF NO7�MOVE.B�#-1,NOHR-DATASG(A5)…DON'T�GET�HORIZONTAL�RANGES) BSR CKRANG GO SEE IF WANT DEFAULT RANGES/�CLR.B�NOHR-DATASG(A5)ˆCLEAR�FOR�OTHER�COMMANDS$PRNT10 BSR GETVR GET VERTICAL RANGES/�MOVE.L�(A4),REC-DATASG(A5)„START�RECORD�NUMBER/ 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 FILE7PRNT30�MOVE.W�6(A4),RECN-DATASG(A5)„#�RECORDS�TO�OUTPUT' ADD.L #8,A4 POINT TO DEVICE NAME FIELD4 LEA RADR-DATASG(A5),A3 SAVE ADDRESS FOR DEVICE NAME*�MOVE.L�#'PR‚',(A3)�SET�FOR�DEFAULT�DEVICE/ 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)�SET�DEVICE�NAM- E�TO�BLANKS' 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ƒPRNT20�BRANCH�IF�NO,ERROR MOVE.B #2,(A4) 2=TRIPLE SPACING8PRNT60�MOVE.B�(A4),COUNT-DATASG(A5)„COUNT=SPACING�NUMBER;�MOVE.B�#'P',CURCMD-DATASG(A5)‰SET�PRINT�AS�CURRENT�COMMAND, LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS) MOVE.B #PRNTCMD,FMSCMD(A0) PRINT COMMAND BSR FMS GO DO THE PRINTING,�CLR.B�CURCMD-DATASG(A5)�CLEAR�THIS�COMMMAND2 TST.B FMSBRK(A0) WAS PRINT TERMINATED BY A BREAK? BPL.S PRNT70 BRANCH IF NO' CLR.B FMSBRK(A0) CLEAR THIS BREAK FLAG2�CLR.B�BRKFLG-DATASG(A5)�CLEAR�ORIGINAL�BREAK�FLAG2 LEA BRKABT-DATASG(A5),A0 YES,OUTPUT ABORT MESSAGE MOVE.L #28,D0 MESSAGE LENGTH% BSR WRTMESS OUTPUT THE ABORT MESSAGEPRNT70 RTS RETURN PAGE<************************************************************:*‚SAVE�COMMAND�ROUTINE.�SAVE�ALL�OR�PART�OF�THIS�FILE�INTO5*‡A�NEW�FILENAME,DO�NOT�ALTER�THIS�FILE-IF�A�FILENAME7*‡WAS�SPECIFIED.�OTHERWISE,SAVE�SELF�FOR�CHECKPOINTING.*‚REV.�1.00�4/28/80‚(C313),*‚ENTRY:D1=0=NEXT�CHAR�IN�INPUT�BUFFER=BLANK,*ˆD1=1=NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA+*‚EXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7*…Dƒ* *…Aƒ*…*�P)*‚CALLS:PROCLIST„CKRANG„GETVRƒFMS…WRTMESS;*********************************************************** SAVE�EQU‚*)�TST.B�FILEOPT-DATASG(A5)‰USING�K�OPTION?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 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 BLOCK5�TST.B�RANGSW-DATASG(A5)ƒANY�DEFAULT�RANGES�TO�CHECK? BEQ.S SAVEE30 BRANCH IF NO;�MOVE.B�#-1,NOHR-DATASG(A5)…DON'T�GET�ANY�HORIZONTAL�RANGES% BSR CKRANG GO GET DEFAULTS IF NEEDED+�CLR.B�NOHR-DATASG(A5)‹CLEAR�FOR�OTHER�USES%SAVEE30 BSR GETVR GET VERTICAL RANGES.�MOVE.L�(A4),REC-DATASG(A5)†SAVE�START�RECORD#,�MOVE.W�6(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**‚CALL�FMS�TO�DO�THE�SAVE*,�TST.B�MSLUN-DATASG(A5)„HAVE�A�LUN�FOR�THIS? 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*********************************************************************>*‚EXTRACT�COMMAND�ROUTINE.�COPY�THE�DATA�IN�THE�EXTRACT�BUFFER-*ŠTO�THE�FILE�AT�THE�CURRENT�FILE�POSITION,OR*ŠDELETE�THE�EXTRACT�BUFFER.*‚REV.�1.00‚5/1/80‚(C313),*‚ENTRY:D1=0=NEXT�CHAR�IN�INPUT�BUFFER=BLANK,*ˆD1=1=NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA+*‚EXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7*…D�*�* *…Aƒ*…*�P$*‚CALLS:PROCLIST„FMS„WRTMESS„OUTFINDA***************************************************************** XTRACT‚EQU‚*)�TST.B�FILEOPT-DATASG(A5)‰USING�K�OPTION?1 BNE EXTND01 BRANCH IF YES,CANNOT DO THIS COMMAND+�TST.L�MAXLINE-DATASG(A5)…ANY�FILE�RECORDS?( BMI CHG03 BRANCH IF NONE,CANNOT DO THIS�TST.L�D1ƒANY�PARAMETERS? 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* *‚DELETE�THE�EXTRACT�BUFFER�HERE*:XTRCT05‚LEA�SVEXT-DATASG(A5),A4�GET�EXTRACT�BUFFER�POINTER 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.S�XTRCT20‚GO�OUTPUT�THE�MESSAGE1XTRCT10 LEA NOBUF-DATASG(A5),A0 NO BUFFER MESSAGE MOVE.L #28,D0 MESSAGE LENGTH&XTRCT20 BSR WRTMESS OUTPUT THE MESSAGEXTRCT25 RTS RETURN**‚DO�THE�EXTRACT�HERE*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.L�FMSADR(A0),FILELINE-DATASG(A5)„NEW�FILELINE�NUMBER3�MOVE.L�FMSREC(A0),MAXLINE-DATASG(A5)„NEW�#�RECORDS BSR OUTFIND OUTPUT NEW SCREEN RTS RETURN PAGEB*******************************************************************7*‚INSERT�COMMAND�ROUTINE�-�INSERT�DATA�INTO�THE�FILE�AT0*‰THE�CURRENT�FILE�POSITION.�USED�BY�SCROLL�MODE1*‰ONLY.�NULL�INPUT�TERMINATES�THE�INSERT�COMMAND.-*‚INSRT50=ENTRY�POINT�FOR�NEW�OR�EMPTY�FILES.,*‚ENTRY:D1=0=NEXT�CHAR�IN�INPUT�BUFFER=BLANK,*ˆD1=1=NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA *‚EXIT:MAIN*‚USES:0�1�2�3�4�5�6�7 *…D�*�*‰* *…Aƒ*�*�*�*�P*‚CALLS:PROCLIST„FMS†WRTMESS*ˆUPDINS†CRTINC******************************************************************* INSERT EQU *)�TST.B�FILEOPT-DATASG(A5)…USING�K�OPTION?�BNEƒEXTND01�BRANCH�IF�YES(�TST.B�SCROLL-DATASG(A5)†IN�SCROLL�MODE? 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.L�MAXLINE-DATASG(A5)‡ANY�FILE�RECORDS? 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 NUMBER1�ADD.L�#1,FILELINE-DATASG(A5)ƒPOINT�TO�ONE�BEYOND BRA.S INSRT50 GO INSERT%INSRT25 BCLR.L #31,D0 HAVE AN OFFSET? BEQ.S INSRT30 BRANCH IF NOG�ADD.L�D0,FILELINE-DATASG(A5)‡YES,HAVE�AN�OFFSET,CALCULATE�NEW�FILELINE:INSRT30‚MOVE.L�FILELINE-DATASG(A5),D1�GET�CURRENT�RECORD�#& CMP.L MAXLINE-DATASG(A5),D1 PAST EOF?& BGT.S INSRT10 BRANCH IF GREATER,ERROR**ƒNOW�READY�TO�ACCEPT�NEW�DATA9********DO NOT CHANGE INSRT50 - ENTRY POINT FOR NEW FILES*8INSRT50�MOVE.B�#'I',CURCMD-DATASG(A5)‚SET�INSERT�COMMANDEINSRT55 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&INSRT60�TST.B�BRKFLG-DATASG(A5)„BREAK? BNE.S INSRT70 BRANCH IF BREAK1�MOVE.L�D1,CRTLNG-DATASG(A5)…SAVE�RETURNED�LENGTH$�TST.L�CRTLNG-DATASG(A5)‹NULL�INPUT?. 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 RETURN2�ADD.L�#1,FILELINE-DATASG(A5)ƒPOINT�TO�NEXT�RECORD3�ADD.L�#1,MAXLINE-DATASG(A5)„BUMP�FILE�RECORD�COUNT BRA INSRT55 GO READ AGAIN**‚DONE�WITH�INSERT*3INSRT70�CLR.B�BRKFLG-DATASG(A5)ƒTURN-OFF�BREAK�FLAG: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 BEYONDL�MOVE.L�MAXLINE-DATASG(A5),FILELINE-DATASG(A5)„FORCE�RECORD�#�TO�LAST�RECORD+INSRT90�TST.B�EMTYFILE-DATASG(A5)…OLD�FILE? BEQ.S INSRT100 BRANCH IF OLD&�CLR.B�EMTYFILE-DATASG(A5)ƒMAKE�IT�OLD/�CLR.B�FILETYPE-DATASG(A5)ƒMAKE�IT�HAVE�RECORDS4�MOVE.B�#1,FSTSW-DATASG(A5)‚TURN�OFF�1ST�TIME�SWITCHINSRT100 RTS RETURN PAGEA******************************************************************6*‚LIST�COMMAND�ROUTINE.�DISPLAY�A�PORTION�OF�THE�FILE.3*‡FIRST�LINE�LISTED�IS�NEW�CURRENT�LINE.�FOR�SCROLL *‡MODE�ONLY.*‚REV�1.00‚5-30-80‚(C313),*‚ENTRY:D1=0=NEXT�CHAR�IN�INPUT�BUFFER=BLANK,*ˆD1=1=NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA *‚EXIT:MAIN*‚USES:0�1�2�3�4�5�6�7 *…D�*�*‰* *…A�*‡*�P2*‚CALLS:PROCLIST„GETVR„FMS„WRTMESS„SCROLOUT‚CKRANGA***************************************************************** LIST EQU *+�TST.L�MAXLINE-DATASG(A5)ˆANY�FILE�RECORDS?0 BMI CHG03 BRANCH IF NONE,CANNOT DO THIS COMMAND(�TST.B�SCROLL-DATASG(A5)‰IN�SCROLL�MODE? 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.B�RANGSW-DATASG(A5)‰ANY�RANGES�SET? BEQ.S LIST05 BRANCH IF NO@�MOVE.B�#-1,NOHR-DATASG(A5)‚SET�DON'T�LOOK�FOR�HORIZONTAL�RANGES& BSR CKRANG GET ANY VERTICAL RANGE SET2�CLR.B�NOHR-DATASG(A5)‡CLEAR�HORIZONTAL�RANGE�FLAG(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 FILE9�MOVE.L�MAXLINE-DATASG(A5),D0„GET�LAST�FILE�RECORD�NUMBER!�ADD.L�#1,D0„ACTUAL�RECORD�NUMBER< 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 MESSAGE6LIST15�MOVE.L�(A4),REC-DATASG(A5)‚1ST�RECORD�#�TO�READ/�MOVE.W�6(A4),RECN-DATASG(A5)†#�RECORDS�TO�READ2LIST20 LEA FMSPKT-DATASG(A5),A0 FMS PACKET ADDRESS!�TST.B�BRKFLG-DATASG(A5)ƒA�BREAK?( 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.B�FLAG1-DATASG(A5)‚WERE�ANY�LISTED?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 RETURN7LIST30�MOVE.B�#1,FLAG1-DATASG(A5)†SET�FOUND�RECORD�FLAG BSR SCROLOUT OUTPUT THE RECORD7�SUB.W�#1,RECN-DATASG(A5)‹DECREMENT�#�RECORDS�TO�OUTPUT% BEQ.S LIST40 BRANCH IF NO MORE TO DO-�ADD.L�#1,REC-DATASG(A5)ŠPOINT�TO�NEXT�RECORD 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*‚VERIFY�COMMAND�ROUTINE.�FOR�SCROLL�MODE�ONLY.�DISPLAY8*‰AT�THE�TERMINAL�ANY�TIME�A�CHANGE�IS�MADE�TO�THE�FILE.1*‰USED�BY�C,D,DUP,EXTEND,F,MERGE,XTRACT�COMMANDS.*‚REV.�1.00‚5-30-80‚(C313)F*‚REV.�2.00‚4/1/81ƒ(C313)�CHANGED�DEFAULT�TO�ON,ALLOW�LOWER�CASE�'OFF',*‚ENTRY:D1=0=NEXT�CHAR�IN�INPUT�BUFFER=BLANK,*ˆD1=1=NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA *‚EXIT:MAIN*‚USES:0�1�2�3�4�5�6�7*…Dƒ* *…A…*ƒ*�P*‚CALLS:PROCLISTB****************************************************************** VERIFY EQU *(�TST.B�SCROLL-DATASG(A5)‚IN�SCROLL�MODE?" BPL.S VERIFYER BRANCH IF NO,ERROR TST.L D1 ANY INPUT? BEQ.S VERIFY20 BRANCH IF YES.VERIFY10�CLR.B�VERFLG-DATASG(A5)ƒENABLE�VERIFY 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)‚DISABLE�VERIFY RTS RETURN,DONE"VERIFYER BRA CMDERR ERROR,ASK WHAT PAGEB*******************************************************************2*‚LINE�COMMAND�-�OUTPUT�CURRENT�FILELINE�TO�SCREEN*B****************************************************************** LINEC EQU *&�TST.L�MAXLINE-DATASG(A5)ƒANY�RECORDS? 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******************************************************************>*‚DOWN�COMMAND�ROUTINE.�MOVE�THE�CURRENT�FILE�POINTER�DOWN�THE?*‡SPECIFED�NUMBER�OF�RECORDS.�DEFAULT=1�RECORD.�IF�#�OF�RECORDS?*‡MOVES�BEYOND�THE�FILE,MOVE�TO�THE�LAST�RECORD�AND�OUTPUT�EOF.*‚REV.�1.00�4/1/81‚(C313)1*‚ENTRY:D1=0=NEXT�CHARACTER�IN�INPUT�BUFFER=BLANK1*ˆD1=1=NEXT�CHARACTER�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER.*ˆA3=ADDRESS�OF�NEXT�CHARACTER�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA *‚EXIT:MAIN:*‚USES�'UP'�COMMAND�ROUTINE�CODE,AFTER�SETTING�'DOWN'�FLAG*B****************************************************************** DOWN EQU ** MOVE.B #-1,SPARE-DATASG(A5) SET DOWN FLAG BRA.S UP00 GO USE UP / CODE PAGEB******************************************************************C*‚UP�COMMAND�ROUTINE.�MOVE�THE�CURRENT�FILE�POINTER�UP�THE�SPECIFED<*‡NUMBER�OF�RECORDS.�DEFAULT=1�RECORD.�IF�#�OF�RECORDS�MOVESB*‡BEYOND�THE�FILE,MOVE�TO�THE�FIRST�RECORD�AND�OUTPUT�BOF�MESSAGE.1*‚ENTRY:D1=0=NEXT�CHARACTER�IN�INPUT�BUFFER=BLANK1*ˆD1=1=NEXT�CHARACTER�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER.*ˆA3=ADDRESS�OF�NEXT�CHARACTER�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA *‚EXIT:MAIN*‚USES:0�1�2�3�4�5�6�7 *…D�*�*‰* *…A�*�*ƒ*�*�P%*‚CALLS:PROCLIST‚FMS‚SCROLOUTƒWRTMESSA*****************************************************************(UP‚CLR.B�SPARE-DATASG(A5)�SET�TO�UP�MODE)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‚ALTER�OR�DELETE�TAB�STOPS.�USE�TAB�STOPS�SPECIFIED'*‡BY�ORIGINAL�OPTIONS,IF�ANY,ON�DELETE.*‚REV.�1.00�4/28/80‚(C313)6*‚REV.�2.00�4/1/81ƒ(C313)�ALLOW�A-C-F-P�TABS�SPECIFIED/*‚ENTRY:D1=0�IF�NEXT�CHAR�IN�INPUT�BUFFER=BLANK/*ˆD1=1�IF�NEXT�CHAR�IN�INPUT�BUFFER=END�OF�DATA"*ˆA1=END�ADDRESS+1�OF�INPUT�BUFFER)*ˆA3=ADDRESS�OF�NEXT�CHAR�IN�INPUT�BUFFER*ˆA5=BASE�ADDRESS�OF�DATA#*‚TAB00�IS�AN�ALTERNATE�ENTRY�POINT+*‚EXIT:GOOD�RETURN-MAIN‚ERROR�RETURN-CMDERR*‚USES:0�1�2�3�4�5�6�7*…D�*�*�*�*�*�*�**…A�*�*�*�*�*�P�*'*‚CALLS:PROCLIST„DOTABS„CLRTABSƒTABSORT=************************************************************* TAB‚EQU‚*+�LEA�TABL-DATASG(A5),A4‚TAB�LIST�TO�PROCESS�BSR‚PROCLIST‚GO�PROCESS�IT5�LEA�LISTPB-DATASG(A5),A4‚RETURNED�PARA�BLOCK�ADDRESSTAB00 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.B�TABCNT-DATASG(A5)†ANY�TABS�ALREADY�SET? 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‚GET�A�TAB�STOP 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‚DOTABS�GO�SET�THIS�TAB�STOP 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 SETTINGS7�MOVE.B�D2,TABCNT-DATASG(A5)ƒNEW�NUMBER�OF�TAB�SETTINGS-TAB22�MOVE.B�(A4)+,(A0)+‚SAVE�THESE�TAB�STOPS" 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,D0�ALWAYS�SET�COLUMN�1�AS�A�TAB�STOP‚BSR�DOTABS�DO�IT‚RTS‚RETURN-DONE%TAB30�BSR�CLRTABS‚CLEAR�OLD�TAB�STOPS( 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;TAB38�TST.B�SAVOPTAD-DATASG(A5)…ANY�TABS�SET�AT�EDIT�START?*�BEQƒTAB70�BRANCH�IF�NO,RESET�DEFAULT�TABS4 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**‚RESET�DEFAULT�TAB�STOPS*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**‚SORT�TABS�HERE*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*'*ˆMAKE�SURE�THERE�ARE�NO�DUPLICATES�SET*#‰ADD.L�#1,A6�POINT�TO�1ST�TAB�EN0 TRY#‰MOVE.L�A6,A1ˆGET�1ST�ENTRY�ADDRESS&‰ADD.L�#1,A1�POINT�TO�SECOND�TAB�ENTRY.‰MOVE.B�TABCNT-DATASG(A5),D0�GET�#�OF�TABS�SET*‰CLR.L�D1�COUNTER�FOR�NUMBER�OF�DUPLICATES+TABS60 SUB.B #1,D0 DECREMENT NUMBER OF TABS*‰BEQ.S�TABS80�BRANCH�IF�NONE�LEFT�TO�CHECK‰MOVE.B�(A1),D2�GET�AN�ENTRY,‰CMP.B�(A6),D2�ARE�THESE�TAB�STOPS�THE�SAME? ‰BEQ.S�TABS70�BRANCH�IF�THE�SAME ‰ADD.L�#1,A6�POINT�TO�NEXT�ENTRY%‰MOVE.B�(A1)+,(A6)�MOVE�THIS�TAB�STOP‰BRA�TABS60�GO�GET�NEXT�ENTRY'TABS70 ADD.B #1,D1 COUNT THIS DUPLICATE ‰ADD.L�#1,A1�POINT�TO�NEXT�ENTRY‰BRA�TABS60�GO�GET�NEXT�ENTRY=TABS80 SUB.B D1,TABCNT-DATASG(A5) UPDATE THE ACTUAL TAB COUNT�RTS‚RETURN�TO�CALLERTABS20 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*‚DTAB�DELETE�TAB�STOP�COMMAND�-�SCROLL�MODE�ONLY*‡A)OUTPUT�THE�COLUMN�TEMPLATE*‡B)PROMPT�WITH�'?'*‡C)READ�THE�INPUT/*‡D)DELETE�THE�CORRESPONDING�TAB�STOP�FROM�EACH*‰COLUMN�CONTAINING�AN�'*'*‚REV.�1.00‚5/8/81‚(C313).*‚ENTRY:D1=0�IF�NEXT�CHARACTER�IN�BUFFER=BLANK.*ˆD1=1�IF�NEXT�CHARACTER�IN�BUFFER=END�OF�DATA*ˆA5=BASE�ADDRESS�OF�DATA,*‚EXIT:MAIN‚ERROR�EXITS:CMDERR�AND�EDITERROR*‚USES:0�1�2�3�4�5�6�7*…D�*�*�*�*�*�*ƒ* *…A�*�*�*…P*‚CALLS:COLM00*B****************************************************************** DTAB EQU *(�TST.B�SCROLL-DATASG(A5)…IN�SCROLL�MODE? BPL.S DTAB40 BRANCH IF NO,ERROR TST.L D1 ANY ARGUMENTS?! BEQ.S DTAB40 BRANCH IF YES,ERROR&�TST.B�TABCNT-DATASG(A5)„ANY�TABS�SET? BLE.S DTAB40 BRANCH IF NO,ERROR)�BSR�COLM00‚GO�OUTPUT�THE�COLUMN�TEMPLATE=�MOVE.B�#'T',CURCMD-DATASG(A5)‡SET�TO�TAB�COMMAND�FOR�THE�I/O- CRT.IN CRTIOS,FMSDATA,#RECLNG READ THE INPUT% BNE EDITERROR BRANCH IF AN I/O ERROR/�CLR.B�CURCMD-DATASG(A5)†CLEAR�TAB�COMMAND�FLAG'�TST.B�BRKFLG-DATASG(A5)†A�BREAK�INPUT?# BMI.S DTAB120 BRANCH IF YES,RETURN. MOVE.L IOSRRN(A0),A0 GET INPUT BUFFER ADDRESS*+*ˆPARSE�THE�INPUT�FOR�TAB�COLUMNS�TO�DELETE*ˆA0=INPUT�BUFFER�ADDRESS*ˆD1=INPUT�BUFFER�LENGTH* 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**ˆREADY�TO�DELETE�THE�TAB�STOPS* 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.L�A1,IOSTART-DATASG(A5)ˆSTART�ADDRESS�TO�PARAMETER�BLOCK MOVE.L A1,A2 SET-UP END ADDRESS! ADDA.L #79,A2 ACTUAL END ADDRESS:�MOVE.L�A2,IOEND-DATASG(A5)ˆEND�ADDRESS�TO�PARAMETER�BLOCK MOVE.W #8,2(A0) IMAGE OUTPUT MOVE.L #80,D0 COUNTER**ˆBUILD�THE�OUTPUT�BUFFER*" MOVE.B #'0',D3 10TH COLUMN MARKER MOVE.B #'-',D4 COLUMN MARKER!�MOVE.B�#'+',D2‚5TH�COLUMN�MARKER" 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‚CHECK�FOR�NO�RANGES�IN�PARA�BLOCK�FOR'*ŠFIND,CHANGE,SAVE,�AND�PRINT�COMMANDS.**ŠIF�HAVE�RANGES,RETURN.�IF�NO�RANGES�SET,/*ŠSUBSTITUTE�DEFAULT�RANGES�FROM�RANGE�COMMAND.+*‚ENTRY:A4=ADDRESS�OF�PARA�BLOCK�FOR�RANGES*ˆA5=BASE�ADDRESS�OF�DATA#*ˆNOHR=0=CHECK�FOR�HORIZONTAL�RANGE+*ˆNOHR=-1=DO�NOT�CHECK�FOR�HORIZONTAL�RANGE*‚USES:0�1�2�3�4�5�6�7*…D�* *…A‰R�P�**‚EXIT:TO�CALLERB****************************************************************** 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 ALSO4CKRANG10�TST.B�NOHR-DATASG(A5)…WANT�HORIZONTAL�RANG?# 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�-�DO�DELETE.�USED�BY�DELETE�AND�MOVE�COMMANDS,*ŠTO�DELETE�SPECIFIED�RECORDS�FROM�THE�FILE.*‚REV.�1.00�4/14/80�(C313);*‚ENTRY:A4=POINTER�TO�START�RECORD#�AND�#�RECORDS�TO�DELETE*ˆA5=BASE�ADDRESS�OF�DATA*‚EXIT:D1=�#�RECORDS�DELETED *‚CALLS:FMS7******************************************************* DODEL‚EQU‚*7�MOVE.B�#'D',CURCMD-DATASG(A5)‡SET�DOING�DELETE�COMMAND8�MOVE.L�(A4),FILELINE-DATASG(A5)„RECORD�NUMBER�TO�DELETE$ 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<�MOVE.L�FMSREC(A0),MAXLINE-DATASG(A5)‡NEW�LAST�RECORD�NUMBER5 BMI.S DODEL20 BRANCH IF DELETED ALL THE FILE RECORDS3 MOVE.L FILELINE-DATASG(A5),D0 GET CURRENT RECORD #7 CMP.L MAXLINE-DATASG(A5),D0 SEE IF DELETED LAST RECORD# BLE.S DODEL20 BRANCH IF NOT AT ENDJ�MOVE.L�MAXLINE-DATASG(A5),FILELINE-DATASG(A5)‚RESET�CURRENT�RECORD�NUMBER4DODEL20�CLR.B�CURCMD-DATASG(A5)‚CLEAR�DELETE�COMMAND& CLR.B FMSBRK(A0) CLEAR FMS BREAK FLAG RTS RETURN PAGE6*******************************************************4*‚BREAK�-�BREAK�CONDITION�FOUND�DURING�I/O(D0.B=$C6)*ŠOR�BREAK�FROM�ASR#*ƒA.�PAGE�MODE-VALID�FILE�POINTERS-2*†OUTPUT�MESSAGE,REWRITE�SCREEN,GO�TO�COMMAND�MODE$*ƒB.�PAGE�MODE-INVALID�FILE�POINTERS0*†RESET�POINTERS�TO�START�OF�FILE,REWRITE�SCREEN#*†OUTPUT�MESSAGE,GO�TO�COMMAND�MODE+*ƒC.�COMMAND�MODE-NOT�FIND�OR�PRINT�COMMAND *†DO�A�OR�B.*ƒD.�COMMAND�MODE-FIND�COMMAND*†PAUSE�PROCESSING*ƒE.�COMMAND�MODE-PRINT�COMMAND*†TERMINATE�PROCESSING*‚CALLS:CKVPTRS�UPDPTWS�SETPROP*ˆSETPROC�WRTMESS*‚EXIT:CRTMODE-EDIT5*‡SCROLL�MODE-EDIT110=************************************************************* BREAK�EQU‚*J�LEA�STACK-DATASG(A5),A7ƒRESTORE�THE�STACK,WILL�BRANCH�OUT�OF�HERE�TO�MAIN-�CLR.B�BRKFLG-DATASG(A5)ƒCLEAR�THE�BREAK�FLAG.�CMP.B�#'F',CURCMD-DATASG(A5)‚IN�FIND�COMMAND?�BEQƒBRK40�BRANCH�IF�YES/�CMP.B�#'P',CURCMD-DATASG(A5)„IN�PRINT�COMMAND?�BEQƒBRK20�BRANCH�IF�YES(�TST.B�SCROLL-DATASG(A5)‡IN�SCROLL�MODE?% BMI.S BRK10 BRANCH IF IN SCROLL MODE( BSR CKVPTRS GO CHECK FOR VALID POINTERS BEQ.S BRK10 BRANCH IF VALID- MOVE.B #LINE20,D0 LAST VIRTUAL SCREEN LINE # BSR SETPROP SET PAGE PROTECTION2 BSR UPDPTWS GO UPDATE POINTERS AND REWRITE SCREEN% BSR SETPROC RESET COMMAND PROTECTION-BRK10 LEA BRKMESS-DATASG(A5),A0 BRACK MESSAGE MOVE.L #16,D0 MESSAGE LENGTH% BSR WRTMESS OUTPUT MESSAGE TO SCREEN(�TST.B�SCROLL-DATASG(A5)‡IN�SCROLL�MODE?%�BMI.S�BRK15ƒBRANCH�IF�IN�SCROLL�MODE* TST.B CURMODE-DATASG(A5) IN COMMAND MODE?A*330;4C9K8S7[7c;k1s6{>ƒ+ 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 INPUT1BRK20�CLR.B�CURCMD-DATASG(A5)„CLEAR�PRINT�COMMAND' LEA BRKABT-DATASG(A5),A0 BREAK MESSAGE MOVE.L #28,D0 MESSAGE LENGTH�BSR�WRTMESS‚OUTPUT�THE�MESSAGE BRA EDIT5 RETURNLBRK40�MOVE.B�MULFSW-DATASG(A5),SVMULFSW-DATASG(A5)ƒSAVE�MULTIPLE�FIND�SWITCHD�CLR.B�MULFSW-DATASG(A5)„CLEAR�THIS�SWITCH�SO�PAGE�WON'T�BE�REWITTEN BRA BRK10 GO OUTPUT MESSAGE PAGE1**************************************************%*‚BRKSR‚BREAK�SERVICE�ROUTINE�FOR�ASQ*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 BREAK0�MOVE.B�#-1,BRKFLG-DATASG(A5)ƒTURN�ON�BREAK�FLAG.�CMP.B�#'F',CURCMD-DATASG(A5)ƒIN�FIND�COMMAND? BNE.S BRKSR05 BRANCH IF NOG�MOVE.B�MULFSW-DATASG(A5),SVMULFSW-DATASG(A5)‚SAVE�MULTIPLE�FIND�SWITCH=�CLR.B�MULFSW-DATASG(A5)…CLEAR�SO�EDITOR�WON'T�REWRITE�SCREEN BRA.S BRKSR15 RETURN6BRKSR05�CMP.B�#'P',CURCMD-DATASG(A5)„IN�PRINT�COMMAND? BEQ.S BRKSR15 BRANCH IF YES0�CMP.B�#'D',CURCMD-DATASG(A5)ŠIN�DELETE�COMMAND? 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‚DATA�OVERRUN�AND�FRAMING�IO�ERROR.�PUT�INTO�COMMAND�MODE$*‰REWRITE�SCREEN�AND�OUTPUT�MESSAGE.*:********************************************************** DATAOR EQU * MOVE.L D0,-(A7) SAVE CURRENT D0( CLR.B BRKFLG-DATASG(A5) CLEAR ANY BREAK(�TST.B�SCROLL-DATASG(A5)‚IN�SCROLL�MODE?( BMI.S DATAOR20 BRANCH IF IN SCROLL MODE*�TST.B�CURMODE-DATASG(A5)‡IN�COMMAND�MODE? BEQ.S DATAOR10 BRANCH IF YES*�CLR.B�CURMODE-DATASG(A5)ƒSET�COMMAND�MODE'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.B�SCROLL-DATASG(A5)…IN�SCROLL�MODE?% BMI EDIT110 BRANCH IF IN SCROLL MODE BRA EDIT5 RETURN FOR NEXT INPUT PAGE:***********************************************************-*‚CKVPTRS‚CHECK�FOR�VALID�POINTERS.�MAKE�SURE'*‹FILELINE,TOPLINE,&�MAXLINE�ARE�VALID.*‚CALLED�BY�BREAK.-*‚EXIT:D0=0=VALID�POINTERS,CC�SET�ACCORDINGLY-*‡D0=-1=NOT�VALID�POINTERS,CC�SET�ACCORDINGLY8******************************************************** CKVPTRS‚EQU‚*-�TST.L�FILELINE-DATASG(A5)‡POSITIVE�FILELINE? BLT.S CKVPER BRANCH IF NO,ERROR+�TST.L�TOPLINE-DATASG(A5)‡POSITIVE�TOPLINE? 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 FLAG�RTS‚RETURN�TO�CALLER&CKVPER MOVE.L #-1,D0 ERROR RETURN FLAG �RTS‚RETURN****‚UPDPTWS‚UPDATE�POINTERS�AND�WRITE�SCREEN*‹FOR�BREAK�CONDITION*‰MOVE.W‚#IOPWAT+IOPIMG+IOPINM+IOPNEC+IOPBRK,IOSOPT(A0)‚OPTIONS9‰MOVE.L‚IOSSAD(A0),IOSRRN(A0)ƒSTART�INPUT�BUFFER�ADDDRESS,‰MOVE.L‚IOSEAD(A0),D0‡GET�END�BUFFER�ADDRESS)‰SUB.L‚IOSSAD(A0),D0ˆGET�LENGTH�OF�BUFFER‰ADD.L‚#1,D0�ACTUAL�LENGTH:‰MOVE.L‚D0,IOSLEN(A0)‡LENGTH�OF�INPUT�BUFFER�TO�PARA�BLOCK0‰LEA�SET-DATASG(A5),A6‡GET�CONTROL�BYTES�ADDRESS2‰MOVE.L‚A6,IOSSAD(A0)…SET�UP�CONTROL�BYTES�ADDRESS%‰LEA�SETEND-DATASG(A5),A6‡END�ADDRESS(‰MOVE.L‚A6,IOSEAD(A0)‚SET�UP�END�ADDRESS(‰TST.B‚SCROLL-DATASG(A5)„IN�SCROLL�MODE?‰BPL.S�CRTIN4�BRANCH�IF�NO3‰LEA�FMSDATA-DATASG(A5),A6ƒGET�INPUT�BUFFER�ADDRESS6‰MOVE.L�A6,IOSRRN(A0)‚INPUT�BUFFER�ADDRESS,SCROLL�MODE.‰MOVE.L�#RECLNG,IOSLEN(A0)ƒINPUT�BUFFER�LENGTH7‰MOVE.W�#IOPWAT+IOPBRK+IOPINF+IOPIMG,IOSOPT(A0)ƒOPTIONS0‰CMP.B�#'I',CURCMD-DATASG(A5)�IN�INSERT�COMMAND?‰BNE.S‚CRTIN1�BRANCH�IF�NO2‰LEA�INSPT-DATASG(A5),A6…GET�OUTPUT�BUFFER�ADDRESS+‰MOVE.L�A6,IOSSAD(A0)„OUTPUT�BUFFER�ADDRESS%‰LEA�INSPTE-DATASG(A5),A6„END�ADDRESS/‰MOVE.L�A6,IOSEAD(A0)ƒOUTPUT�BUFFER�END�ADDRESS.‰LEA�OUTBUF-DATASG(A5),A6„INPUT�BUFFER�ADDRESS;‰MOVE.L�A6,IOSRRN(A0)ƒUSE�OUTPUT�BUFFER�FOR�INPUT�ON�INSERT%‰BRA.S�CRTIN4�GO�DO�OUTPUT�WITH�INPUT3CRTIN1ƒCMP.B�#'T',CURCMD-DATASG(A5)‚IN�TAB�COMMAND?ˆBNE.S�CRTIN3�BRANCH�IF�NO-ˆLEA�TABPRMT-DATASG(A5),A6ƒTAB�OUTPUT�ADDRESS3ˆMOVE.L�A6,IOSSAD(A0)‚IN�TAB�COMMAND,SET�TAB�PROMPT'ˆLEA�TABPRMTE-DATASG(A5),A6‚END�ADDRESS!ˆMOVE.L�A6,IOSEAD(A0)�END�ADDRESSˆBRA.S�CRTIN4�GO�DO�THE�I/ODCRTIN3‚LEA�SCPT-DATASG(A5),A6ˆSTART�ADDRESS�OF�SCROLL�COMMAND�PROMPT+ˆMOVE.L‚A6,IOSSAD(A0)†SCROLL�COMMAND�PROMPT$ˆLEA�SCPTE-DATASG(A5),A6ˆEND�ADDRESS!ˆMOVE.L�A6,IOSEAD(A0)†END�ADDRESS-CRTIN4‚TST.B�BRKFLG-DATASG(A5)ƒA�BREAK�INPUT?ˆBNE�BREAK�BRANCH�IF�YES‰TRAP‚#2”DO�THE�READ‰BNE.SƒCRTIN5ŽSOMETHING�WRONG�!9RETURN10‚MOVE.L‚IOSLEN(A0),D1‡SAVE�RETURNED�BUFFER�LENGTH(�TST.B�SCROLL-DATASG(A5)ŽIN�SCROLL�MODE?( 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 LONGRETURN15�MOVE.L‚#0,D0�CLEAR�CC**ˆRETURN�TO�CALLER*RETURNƒRTS„.”RETURN�TO�CALLER%CRTIN5ƒCMP.B‚#ISTADO,D0ŠDATA�OVERRUN?%‰BEQ.S�CRTIN10�BRANCH�IF�DATA�OVERRUN‰CMP.B�#$E8,D0�FRAMING�ERROR?,‰BNE.S‚RETURNŽBRANCH�IF�NO,RETURN�WITH�ERROR6CRTIN10�CLR.B�BRKFLG-DATASG(A5)…IGNORE�ANY�BREAKS�HERE&‰TST.B�CHAIN-DATASG(A5)…IN�CHAIN�MODE?-‰BMI�RETURNƒBRANCH�IF�YES,DON'T�DO�RETRANSMIT*%*†RETRANSMISSION�HERE�IF�DATA�OVERRUN*%CRTIN8ƒMOVE.L‚#$20,D7�NUMBER�OF�TRIES/‰CLR.B�BRKFLG-DATASG(A5)…IGNORE�ANY�BREAKS�HERE1CRTIN6ƒMOVE.L‚#$60,IOSLEN(A0)„INPUT�BUFFER�LENGTH,‰MOVE.W‚#IOOWIN,IOSFCT(A0)‚OUTPUT�WITH�INPUT>‰MOVE.W‚#IOPWAT+IOPIMG+IOPINM+IOPNEC+IOPBRK,IOSOPT(A0)‚OPTIONS>‰LEA�LTRANS-DATASG(A5),A6…RETRANSMISSION�OUTPUT�BUFFER�ADDRESS$‰MOVE.L‚A6,IOSSAD(A0)ƒOUTPUT�ADDRESS&‰LEA�LTRANSE-DATASG(A5),A6ƒEND�ADDRESS#‰MOVE.L‚A6,IOSEAD(A0)‚END�OF�OUTPUT*:*„DELAY�64�MILLISECONDS�TO�ALLOW�CRT�TO�STOP�SENDING�CHARS*‰MOVE.L‚A0,A6�SAVE�IOS�POINTER%‰MOVE.L‚#$40,A0ŽDELAY�64�MILLISECONDS%‰MOVE.L‚#21,D0ŽDELAY�DIRECTIVE�NUMBER‰TRAP‚#1”DO�IT!‰MOVE.L‚A6,A0�RESTORE�IOS�POINTER*7*„ASK�FOR�RE-TRANSMISSION�OF�LAST�PACKET-TRIES�32�TIMES*(‰TST.B�SCROLL-DATASG(A5)…IN�SCROLL�MODE?‰BPL.S�CRTIN7�BRANCH�IF�NO>‰MOVE.W�#IOPBRK+IOPWAT+IOPINF+IOPIMG,IOSOPT(A0)�SCROLL�OPTIONS#CRTIN7ƒTRAP‚#2”DO�OUTPUT�WITH�IN4 PUT%‰BNE.S‚CRTIN11�BRANCH�IF�ERROR�RETURN(‰TST.B�SCROLL-DATASG(A5)„IN�SCROLL�MODE?&‰BMI�RETURN10�RETURN�IF�IN�SCROLL�MODE'‰MOVE.L�IOSLEN(A0),D1�GET�BUFFER�LENGTH‰CMP.L�#7,D1�SEE�IF�TOO�SHORT!‰BLT.S�CRTIN9�BRANCH�IF�TOO�SHORT‰CMP.L�#$56,D1�SEE�IF�TOO�LONG0‰BLE�RETURN10�BRANCH�IF�NOT�TOO�LONG,GOOD�RETURNACRTIN9 MOVE.B #ISTADO,D0 MAKE ERROR CODE LOOK LIKE A DATA OVERRUN9CRTIN11‚CLR.B�BRKFLG-DATASG(A5)…IGNORE�ANY�BREAKS�FOR�NOW‰SUB.L‚#1,D7�DECREMENT�COUNT‰BGE„CRTIN6�TRY�32�TIMES ‰BRA„RETURN�ERROR-DONT�TRY�AGAIN‰PAGEG************************************************************************* SUBRINOUTE NAME: CRTOUT *�REV.‚1.00‚11/01/79‚(JIM�SMITH)<* FUNCTION: PERFORM OUTPUT SERVICES FOR CRT EDIT-MODE OUTPUT/*�CALLING�SEQUENCE:�A0‚=�POINTER�TO�PARAM�BLOCK"*ŒIOSLUN(A0)�=�LOGICAL�UNIT�NUMBER#*ŒIOSSAD(A0)�=�START�BUFFER�ADDRESS!*ŒIOSEAD(A0)�=�END�BUFFER�ADDRESS%*�RETURN:�A0‚=�POINTER�TO�PARAM�BLOCK*‰D0‚=�IOS�RETURN�CODES*‰CC‚=�STATUS�OF�D0*‚IOSSTA(A0)�=�D0**�USING:ƒ0�1�2�3�4�5�6�7*ˆD�R*ˆA�P‰P** CRTOUTƒEQU…*(‰MOVE.L�A0,-(A7)„SAVE�PARA�BLOCK�POINTER/‰MOVE.L�IOSEAD(A0),A0†GET�END�ADDRESS�OF�BUFFER#‰ADD.L�#2,A0�MAKE�IT�2�BYTES�LARGER‰CLR.B�-1(A0)�SET�A�NULL%‰MOVE.B�#0,(A0)�NULL�TO�LOCK�KEYBOARD ‰MOVE.L�(A7)+,A0ŒRESTORE�POINTER.‰ADD.L�#2,IOSEAD(A0)ˆFIX�UP�END�BUFFER�ADDRESS0‰MOVE.W‚#IOWRIT,IOSFCT(A0)‚SET�UP�WRITE�FUNCTION;‰MOVE.W‚#IOPWAT+IOPIMG,IOSOPT(A0)‚WRITE�OPTIONS(WAIT,IMAGE)‰TRAP‚#2”WRITE(‰RTS™RETURN-CALLER�WILL�CHECK�FOR�ERRORS PAGE4*****************************************************/*‚CNVTHA�CONVERT�HEX�TO�ASCII�FOR�SCREEN�OUTPUT*%*‚ENTRY:A3=LOCATION�FOR�CONVERT�VALUE*ˆD0=VALUE�TO�CONVERT*4**************************************************** CNVTHA EQU *# MOVE.L D1,-(A7) PRESERVE D1 012885$ CLR.L D1 SET COUNTER TO ZERO 012885 MOVE.L #8,D2 COUNTER0�ADD.L�#8,A3�POINT�TO�END+1�OF�OUTPUT�LOCƒ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.S�CNVT05‚LOOK�AGAIN�AT�SIZE�OF�D0�012885CNVT10 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"CNVT15�SUB.L�#1,D2�COUNT�IT‚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ƒ=ARG�DEBUG.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ƒ=ARG�DEGUG.LL=/ENDIF=/*=LINK ,DEBUG.LO,\1;HAMX ATTRIBUTES P SEG DEBU:9,14INPUT DEBUG.ROLIB 0.&.UTILIB.ROEND=/*=ENDéé5 éééé”$DEBUG„IDNT†2,0‡Multitasking�Debugger‰NOLIST&�INCLUDE�9995.&.TR1.EQŽTRAP�#1�EQUATES!�INCLUDE�9995.&.IOE.EQŽIO�EQUATES‰LIST*F*‚SYMBUG:ƒEXCEPTION�MONITOR�TASK�(�MULTI-TASK�VERSION�-�MAX.�19�TASKS)** ‰SECTIONƒ9‰OPT‡FRS‰XREF†EDITFILE#‰XDEF†CLASCODEŒREQUIRED�BY�EDITFILE* *ˆDATA�AREAS*/BˆEQU‡*‰USE�A6�FOR�SOURCE�FIELD�DATA�ADDRESSING:‰DC.B†'122084�4'„UTILITY�CONTROL�DATE�&�VERSAdos�Release�#*$*ˆVERSAdos‚CONTROL�BLOCKS�BEGIN�HERE* STOPTASK:!‰DC.L†0,0‡*�TASK�NAME�AND�SESSION STARTTSK: ‰DC.L†0,0-‰DC.W†$A000…*�MONITOR�TASK�AND�REGS�SPECIFIED‰DC.L†0,0‡*�MONITOR�TASK�=�MBUG=TASKREGS�DS.L†16ˆREG�SAVE�AREA�IS�PART�OF�STARTTSK�PARM�BLOCKDREG6„EQU‡TASKREGS+$18**ˆLOADER�PARAMETER�BLOCK*TASKLDR‚DC.L†'TASK'„*�TASK�NAME8SESSION‚DC.L†0‰*�STANDARD�SESSION�ID�(ALL�TASKS�&�EXMON)/‰DC.W†$8000…*�CRTCB�OPTIONS�-�MONITOR�SPECIFIED)‰DC.L†0,0‡*�MONITOR�TASK�NAME�AND�SESSION)‰DC.B†50,100„*�INITIAL�AND�FINAL�PRIORITY‰DC.W†0‰*�TASK�ATTRIBUTES‰DC.L†0‰*�TASK�ENTRY�ADDRESS‰DC.W†0‰*�USER�ID?LOADOPT‚DC.W†$604E…*�USE�LOADER�INFORMATION�BLOCK�FOR�TASK�INFO$LOADCLL‚DC.B†0‰*�COMMAND�LINE�LENGTH‰DC.B†0‰*�LUN�OF�LOAD�FILE‰DC.L†0,0‡*�RESERVED%LOADCLA‚DC.L†0‰*�COMMAND�LINE�ADDRESS*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,�PUBLIC�READ‰DC.B†$FF‡*�STATUS ‰DC.B†0‰*�LUNLDVOL$L‚EQU‡*-TASKLDR‰DC.L†0LDUID$W‚EQU‡*-TASKLDR‰DC.W†0‰*�USER�NUMBERLDCAT$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‡*�PROTECT�CODES‰DC.W†0‰*�RECORD�LENGTH‰DC.L†0‰*�SIZE�/�POINTER**ˆGETASQ�PARAMETER�BLOCK*"ASQB…EQU‚*‹GET�ASQ�PARAMETER�BLOCK ‰DC.L‚0ŠTASK‰DC.L‚0ŠSESSION.‰DC.B‚5ŠSTATUS‚ASQ-MESSAGE�ENABLED-ASR�ENABLED‰DC.B‚12‰MAX�MESSAGE�LENGTH‰DC.L‚120ˆ10�MESSAGES�MAX:ASQASRV‚DC.L‚0ŠASR�SERVICE�ROUTINE�VECTOR‚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(*ˆATTACH�TARGET�TASK�TO�EXMON�PARM�BLOCK*)EXMONBƒEQUƒ*†ATTACH�EXMON�PARAMETER�BLOCK‰DC.L‚'„'†TARGET�TASK�NAME‰DC.L‚0‹SESSION)EXMONAME�DC.L‚0‡NAME�OF�EXCEPTION�MONITOR‰DC.L‚0ŠSESSION*$*ˆEXMON�MASK�MODIFICATION�PARM�BLOCK*"XMSKB„EQU‚*ŠEXMMSK�PARAMETER�BLOCK‰DC.L‚'TEST'…TARGET�TASK‰DC.L‚0ŠSESSION‰DC.L‚$01FFFFF1ƒMASK**ˆREXMON�PARM�BLOCK*8REXPB„DS.L†3‰TASKNAME,SESSION,A(OPTIONS�IN�STATE�BUFFER)*9*ˆMOVELL�PARM�BLOCKS�TO�SEND�&�RECEIVE�DATA�BETWEEN�TASKS*5BRKPBG‚D5 C.L‚'TEST',0�MOVELL�GET�CODE�FROM�TARGET�TASKBRKPBUF‚DC.L‚0,0,0BRKGET‚DC.L‚0,2*4BRKPBP‚DC.L‚0,0�MOVELL�PUT�BP�OR�CODE�TO�TARGET�TASKBRKSOR‚DC.L‚0,'TEST',0BRKBUF‚DC.L‚0,2**ˆGTSEG�PARM�BLOCK*PBGETSG‚DC.L†0,0‡TASK,SESSION#‰DC.W†$2000,0ƒOPT=PHYSICAL‚ATTR=R/W‰DC.L†'TSKS'„SEGMENT�NAME'SEGADDR‚DC.L†0‰PHYSICAL�ADDR�OF�SEGMENT0SEGLTHƒDC.L†0‰SEGMENT�LENGTH�=�#TASKS�*�(32+256)**ˆASQ�EVENT�BUFFER*!EVNTBLK‚DC.B†0‰ASR�RECEIVING�AREA0EVNTCODE�DC.B†0‰IS�ALWAYS�8�FOR�EXCEPTION�EVENTS"EVNTTASK�DC.L†0,0‡TASKNAME�SESSION3EVNTECOD�DC.B†0‰IDENTIFIES�NORMAL�EVENT�EXCEPTION�#)EVNTETYP�DC.B†0‰3�TYPES�=�ATT,DET,�NORMAL*%*ˆFHS�TO�ASSIGN�PRINTER�OR�REMOTE�CRT*;PRINTFHS�DC.B…0,$40,0,3,0,1,'PR‚'ƒALSO�USED�TO�ASSIGN�LUN#4‰DC.W…0”*�USER�NUMBER‰DC.L…'ˆ'‹*�CATALOG‰DC.L…0,0’*�FILENAME"‰DC.W…0,0’*�EXTENSION�AND�RESERVED'‰DC.B…0,0’*�WRITE�AND�READ�PROTECT�CODE‰DC.W…0”*�RECORD�LENGTH‰DC.L…0”*�SIZE�/�POINTER**ˆCHANGE�LUN�FHS*4LUNFHSƒDC.B†1,$10,$80,0‰CHANGE�LU�ASSIGN‚SEND�&�KEEP%‰DC.B†0,5,5,0�STATUS�LUA�LUB�RESERVED‰DC.L†0,0‘TASKNAME�&�SESSION*#*ˆIOS�PARM�BLOCK�FOR�KEYBOARD�INPUT* IOIN‚EQU‚*�INPUT�PARAMETER�BLOCK6†DC.W‚1,IOPBRK‰NOTE�BREAK�OPTION�AUGMENTED�WITH�IOPPROˆDC.B‚0,CDFLUN,0,0ˆDC.L‚00ˆDC.L‚0�INPUT�BUFFER�START�ADDRESS‚ALWAYS�A(INQ)$ˆDC.L‚0�END�ADDRESS‚ALWAYS�A(INQE-1)ˆDC.L‚02ˆDC.L‚0…CSA�=�ASR�ADDRESS�WHEN�IN�PROCEED�I/O�MODE*"*ˆIOS�PARM�BLOCK�FOR�SCREEN�OUTPUT!IOUT„EQU‚*�OUTPUT�PARAMETER�BLOCKˆDC.W‚2,IOPBRKˆDC.B‚0,LDFLUN,0,0ˆDC.L‚0.IOUTSAD�DC.L‚0ŽDYNAMIC�IOSSAD�&�IOSEAD‡1/25/82ˆDC.L‚0¬1/25/82ˆDC.L‚0ˆDC.L‚0**ˆCRT�KEYBOARD�BUFFER*6INQ†COMLINEƒ80ˆCOMLINE�SERVES�AS�KEYBOARD�INPUT�BUFFER INQE„EQU‚***ˆSCREEN�MESSAGE�BUFFERS*B*ˆMSGADR�is�an�address�table�of�consecutive�messages�indexed�by�D71*�D7�is�initialized�by�branching�to�a�label�MSGxx9*�which�enters�the�message�start�&�end�addrs�into�the�IOB?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ŽDMOUTA�IS�MSG302‰DC.L†SPACES,SRPREFIX…LAST�BUFFER�VECTOR�IS�SPACES(QUEST1ƒDC.B†'Debug�'ŒSYNTAX�ERROR�PROMPTQUEST1N‚DC.B†'…WHAT?�',$07 EQUEST2ƒDC.B†'MAXIMUM�TASK�COUNT�(1->19)?�'‚REUSED�FOR�DEFAULT�PROMPTS QUEST3ƒDC.B†'Debug�'QUEST3N‚DC.B†'…?�',$00 OUTMESS‚DC.B†'Debug�'OUTTASK‚DC.B†'†'%OUTEVNT‚DC.B†'�'�EVENT�TYPE�GOES�HEREPCPREFIX�DC.L‚'�PC='OUTPC„DC.L‚0,0,0 OUTSTAT‚DC.L‚0,0**ˆBUFFER�TO�DISPLAY�BREAKPOINTS*-OUTBUFƒDC.B†'Debug�:�Revision‚B2.00‘'ˆ1/25/82 ‰DC.B†'¨' OUTBUFE‚EQU‡***ˆERROR�MESSAGE�BUFFERS*ERMES1ƒDC.B†'NO�MEMORY�FOR�'ERMES1N‚DC.B†'ASQ�'ERMES2ƒDC.B†'BAD�TARGET�TASK�'$ERMES3ƒDC.B†'BAD�PARM�BLOCK�ADDRESS'"ERMES4ƒDC.B†'BUFFER�ADDRESS�WRONG'ERMES5ƒDC.B†'NO�ASQ'ERMES6ƒDC.B†'BRKPT�TABLE�FULL'*ERMES7ƒDC.B†'VALUE�LOCATION�INCORRECT',7,7)ERMES8ƒDC.B†'TARGET�TASK�ADDRESS�ERROR',7$ERMES9ƒDC.B†'MESSAGE�FROM�ASQ�WRONG'!ERMES10‚DC.B†'NO�ROOM�TO�ATTACH�'6NUTASKNM�DC.B†'TASK�-�BUT�TASK�IS�RUNNING�UNATTACHED�'!ERMES11‚DC.B†'ATTACH�NOT�ALLOWED'ERMES12‚DC.B†'LOAD�ERROR''ERMES13‚DC.B†'CANNOT�HANDLE�BREAKS',7,7!ERMES14‚DC.B†'EVENT�NOT�SENT',7,7ERMES15‚DC.B†'***�ERROR�TRAP�'TRAPIDƒDC.B†0,'‚ERROR�CODE:�'ERRCODƒDC.L†0,0,0CRLF…DC.W†$0D0AERMES16‚DC.B†'UNKNOWN�TASKNAME')ERMES17‚DC.B†'BRKPTS�LOCKED�IN�EXECUTION'&HELPMSG‚DC.B†'…AS„[]�[]‹',‰DC.B†'ADDRESS�STOP�(On�change�or�=�Value)…'‰DC.B†'[NO]�BR„[]....‘'/‰DC.B†'BREAKPOINT�List,Set�or�Delete�Multiple‚' ‰DC.B†'…DE¡'!‰DC.B†'DEFAULT�List,Set�Options�' ‰DC.B†'…DF¡'$‰DC.B†'DISPLAY�FORMATTED�Registers�'‰DC.B†'…G…[]•',‰DC.B†'GO�into�Execution�(Foreground�Task)…'‰DC.B†'…MD„�[]�'0‰DC.B†'MEMORY�DISPLAY�(default�count=16�Bytes)�'‰DC.B†'…MS„�....Œ'+‰DC.B†'MEMORY�SET�(Data�bytes�spaced�out)†'‰DC.B†'…OF„[�]Ž'+‰DC.B†'OFFSET�REGISTER6 �List,Set�or�Delete†'‰DC.B†'…QUITŸ'+‰DC.B†'QUIT�(Terminate�Debugging�Session)†'‰DC.B†'…TR„[count]–''‰DC.B†'TRACE…(CR�will�continue�TRACE)†',‰DC.B†'….A0->.A7,�.D0->.D7�.PC�.SR�.XM�.ST�'-‰DC.B†'.VL�.VA�.VM�.MC‚REGISTER�List�or�Setƒ' ‰DC.B†'…ATTA‚[]�[<#crt>]Œ'.‰DC.B†'ATTACH�Task�to�DEBUG�(Remote�crt�I/O)ƒ'‰DC.B†'…DETA‚[]•'0‰DC.B†'DETACH�Task�from�DEBUG�(Continues�Exec)�'$‰DC.B†'…EVEN‚[]�<#exception>ˆ'!‰DC.B†'EVENT�CREATED�for�a�Task�'!‰DC.B†'…LOAD‚�[]‹'!‰DC.B†'LOAD�TASK‚(with�COMLINE)�'$‰DC.B†'…MASK‚[]�<#exception>ˆ'‰DC.B†'MASK�Exception�Toggled’'‰DC.B†'…STAR‚[�|�ALL]�'-‰DC.B†'START�Task(s)�into�Execution�like�GO„' ‰DC.B†'…STAT‚[�]Œ'/‰DC.B†'STATUS�List�or�Set�(DORM,REDY�or�WAKE)‚'‰DC.B†'…STOP‚[�|�ALL]�'-‰DC.B†'STOP�Task(s)�Execution�&�Set�DORMANT„'!‰DC.B†'…TASK‚�[<#notify>]‹'0‰DC.B†'TASK�becomes�FOREGROUND�with�BP�options�'‰DC.B†'…TERM‚—'‰DC.B†'TERMINATE�Taskš'‰DC.B†'…WAITŸ'+‰DC.B†'WAIT�for�{BREAK}�to�display�PROMPT†' 6STATHDR‚DC.B†'TASKSESS‚STATE�EVENT‚@PC‡PC�NOW„SR…MASK'‰DC.B†'„TCB�STATƒOP„CRT‚' **ˆMEMORY�DISPLAY�BUFFERS*DMOUTAƒDC.B†'¨' ‰DC.B†'¨'SPACESƒDC.L†'„'SRPREFIX�DC.B†'�SR='D0D7…DC.B†'D0->D7‚'A0A7…DC.B†'A0->A7‚'!DEFMSGƒDC.B†'OPTIONS:�PR�ECHO�=�'ECHOOPT‚DC.B†'N�(Y/N)?�' PRLUN„EQU‡1 CRTLUNƒEQU‡4,RRCOUNT‚EQU‡8‰MAX�NUMBER�OF�OFFSET�REGISTERS.LTSKVECT�EQU‡32ˆBYTES�PER�TASK�IN�VECTOR�TABLE*LINCNTƒDC.W†0�NUMBER�OF�LINES�LEFT�ON�PAGE4BPVALUE‚DC.W†$4E70…RESET�INSTRUCTION�IS�A�BREAKPOINT$DECRT„DC.L†0‰EXMON�CRT�TERMINAL�NAME,TERMINAL�DC.L†0‰TERMINAL�OF�LAST�LOADED�TASK,STACKBRK�DC.L†0‰BREAK�RECOVERY�STACK�POINTER**’TABLE�FOR�EDITFILE*/CLASCODE�DC.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* *ˆBREAK�STUFF*BREAK DC.W 0 THE WORDSETBRK EQU 15 TAKE IO BREAKSGOTBRK EQU 14 GOT IO BREAKBPMAX‚EQU�10‚MAX�BP�PER�TASK* *ˆBREAK�EVENT* ATTEVNT EQU * DS.W 1 LENGTH + CODE DS.L 1 DEVICE DS.W 1 DEVICE STATUS**ˆCOMMAND�PARSING�DATA�FIELDS*FLDL‚DC.L‚0…FIELD�LENGTHVFLD‚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‚**"*ˆDISPLAY�STATUS�TABLE�OF�COMMANDS*: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‚**#*ˆEVENT�NOTIFICATION�MESSAGE�BUFFER*MESTYPƒDC.B‚'TRAP�0Š'‰DC.B‚'TRAP�1Š'‰DC.B‚'TRAP�2Š'‰DC.B‚'TRAP�3Š'‰DC.B‚'TRAP�4Š'‰DC.B‚'TRAP�5Š'‰DC.B‚'TRAP�6Š'‰DC.B‚'TRAP�7Š'‰DC.B‚'TRAP�8Š'‰DC.B‚'TRAP�9Š'‰DC.B‚'TRAP�10‰'‰DC.B‚'TRAP�11‰'‰DC.B‚'TRAP�12‰'‰DC.B‚'TRAP�13‰'‰DC.B‚'TRAP�14‰'‰DC.B‚'TRAP�15‰'‰DC.B‚'BUS�ERROR‡'‰DC.B‚'ADDRESS�ERRORƒ'‰DC.B‚'ILLEGAL�INST„'‰DC.B‚'ZERO�DIVIDE…'‰DC.B‚'CHK‚INST‡'‰DC.B‚'TRAPV‹'‰DC.B‚'PRIV�VIOLATION‚'‰DC.B‚'LINE�1010‡'‰DC.B‚'LINE�1111‡')UTLWORD‚DS.L†4“UNUSED�EXCEPTION�EVENT�#196ADX†DC.B†'�ADXDORMREDYWAIT'‚UNUSED�EXCEPTION�EVENT�#1AADXENDƒDC.B‚'TRACE�MAX�INST‚'‰DC.B‚'TRACE�ONE�INST‚'‰DC.B‚'VALUE�CHANGE„'‰DC.B‚'VALUE�EQUAL…'3‰DC.B‚'STOPPED‰'…EXCEPTION�$1F�ALTERNATE�ATTACH�MSG‰DC.B‚'ATTACHEDˆ'�20‰DC.B‚'DETACHEDˆ'�21‰DC.B‚'BREAKPOINT†'�22‰DCB.L…40,0“STACK�SPACE STACK„EQU‡*‰SPC‡22**************************************************;*ˆTASK�CONTROL�DATA‚(BUFFER�DYNAMICALLY�OBTAINED�VIA�GETSG)+*’6 includes‚TASK�VECTOR�TABLE�&�TASK�BUFFERS(*’size�of�the�GTSEGed�area�controlled�by9MAXTCNT‚DS.W†1‰MAXIMUM�#�OF�TASKS�TO�BE�ATTACHED�TO�EXMON*CURTCNT‚DC.W†0‰CURRENT�#�OF�TASKS�ATTACHED0�=�YES)"TVEVNTƒEQU‡18†EVENT�EXCEPTION�TYPETVCODEƒEQU‡19ˆ"‡"…CODE TVPC…EQU‡20†PC�AT�EVENT‰(BINARY)%TVTERMƒEQU‡24†TASK�TERMINAL�VOLUME�ID%TVNOTEƒEQU‡28†TASK�NOTIFICATION�LEVELTVRES„EQU‡30†UNUSED�2�BYTES*1***************************************************ˆTASK�BUFFERS*=LTASKBUF�EQU‡$100†(256�BYTE�BUFFER�PER�TASK�:�FORMAT�FOLLOWS)BUFD…EQU‡0‰D0-D7BUFA…EQU‡$20‡A0-A6BUFUSPƒEQU‡$3C‡A7BUFPC„EQU‡$40‡PCBUFSR„EQU‡$44‡SRBUFMASK‚EQU‡$46‡EXMON�MASKBUFSTAT‚EQU‡$4A‡TASK�STATUSBUFDO„EQU‡$4E‡DIRECTIVE�OPTIONSBUFLOCƒEQU‡$50‡LOCATIONBUFVALƒEQU‡$54‡VALUEBUFVM„EQU‡$58‡VALUE�MASKBUFCNTƒEQU‡$5C‡MAX�COUNT+BUFENDƒEQU‡$60‡THIS�VARIABLE�NOT�REFERENCEDBUFLAST‚EQU‡$64‡NOT�USED.BUFSAVE‚EQU‡$68‡PC�STOPPED�ON�NEEDS�BREAKPOINT%BUFDOSA‚EQU‡$6C‡USER'S�CURRENT�OPTIONBUFSVSOR�EQU‡$70‡NOT�USED)BUFBPCNT�EQU‡$74‡BREAKPOINT�COUNT�2�BYTES3BUFBPTBL�EQU‡$76‡BREAKPOINT�TABLE�10�4�BYTE�ENTRIES'BFBPTBLE�EQU‡$9E‡BREAKPOINT�TABLE�END+18BUFBPSAV�EQU‡$9E‡BREAKPOINT�SAVE�TABLE‚10�4�BYTE�ENTRIESCBUFBPREP�EQU‡$C6‡BREAKPOINT�REPETITION�COUNTS�NOT�USED�(10�2�BYTES)&BUFRRCNT�EQU‡$DA‡OFFSET�REGISTER�COUNT8BUFRRTBL�EQU‡$DC‡OFFSET�REGISTER�VALUES�(�8�LONG�WORDS�)BUFEND$$�EQU‡$FC‰PAGE**ˆREGISTER�CONVENTIONS**ˆA0ˆSCRATCH�D0*ˆA1ˆA(TASK�BUFFER)†D1*ˆA2œD2*ˆA3œD3*ˆA4ˆA(CURTASK�VECTOR)ƒD4*ˆA5ˆA(INQ�KEYBD�BUFF)ƒD5*ˆA6ˆA(DATA�AREA)ˆD6&*ˆA7ˆA(STACK)ŒD7ˆINDEX�TO�CRT�MESSAGES*4SYMBUGƒLEA‡STACK(PC),A7ŽESTABLISH�USER�STACK�POINTER‰LEA‡B(PC),A6’PIC�DATA�BASE�REG/‰MOVEM.LƒD0-D7/A0-A7,TASKREGS-B(A6)�*�SAVE�REGS0‰MOVE.L„A0,EXMONAME-B(A6)…*�SAVE�DEBUGGER'S�NAME+‰MOVE.L„A0,ASQB-B(A6)‰*�INIT�ASQ�PARA�BLOCK7‰MOVE.L„A0,PBGETSG-B(A6)†*�TASKNAME�TO�GTSEG�PARM�BLOCK1‰MOVE.L„A1,DECRT-B(A6)ŠSAVE�DEBUG�CRT�VOLUME�NAME,‰LEA‡EXASR(PC),A0ˆPUT�A(ASR)�IN�ASQBŒ1/25/82 ‰MOVE.L„A0,ASQASRV-B(A6)¢1/25/82,‰LEA‡TASKLDR(PC),A0Š*�INITIALIZE�TARGET�TASK$‰MOVE.L„D2,LDVOL$L(A0)†*�VOLUME�NAME ‰MOVE.W„D3,LDUID$W(A0)†*�USER�ID)‰MOVEM.LƒD4-D5,LDCAT$L(A0)ƒ*�CATALOG�NAME‰MOVE.L„D1,$04(A0)$‰MOVE.L„D1,$0E(A0)Š*�MONITOR�SESSION‰MOVE.L„D1,STARTTSK+4-B(A6)‰MOVE.L„D1,STARTTSK+$0E-B(A6)(‰CLR.L…D7”D7�IS�INDEX�TO�MESSAGE�VECTORS‰BSR‡MSG05�VERSION�MESSAGE'‰MOVE.L„#1,D4�*�ASSUME�SINGLE�TASK�MODE%‰CMP.L…D4,D6�*�COMLINE�LENGTH�PASSED?/‰BGT.S…IN.012Ž*�YES�-�IMPLIES�SINGLE�TASK�DEBUG**ˆGET�MEMORY�FOR�TASKS*,IN.010ƒBSR‡MSG01�*�PROMPT�FOR�MAX�#�OF�TASKS‰BSR‡KEYIN�*�GET�KEYBOARD�REPLY#‰LEA‡INQ-1(PC),A1Œ*�A(ASCII�STRING)‰CLR.L…D0’*�OFFSET‰BSR‡DEC2BIŽ*�CONVERT�TO�BINARY ‰TST.W…D4"‰BLE‡IN.010ŽZERO�TASKS�NOT�ALLOWED#‰CMP.B…#19,D4Ž*�VALIDATE�TASK�COUNT&‰BGT‡IN.010Ž*�INVALID�-�REISSUE�PROMPT>*N.012ƒMOVE.L„#EDITFILE+$400,D0†LOGICAL�ADDR�FOR�GETSG…1/25/82=******ƒN‚O‚T‚Eƒ******‚CURRENT�EDITFILE�LENGTH�IS�$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)†*�MAXIMUM�TASK�COUNT,‰ASL.L…#5,D4�*�TIMES�32�=�LTH�OF�VECTOR�AREA-‰MOVE.L„D4,SEGLTH-B(A6)‡*�TO�GTSEG�PARM�BLOCK6‰MOVE.L„D4,TASKBUF-B(A6)†*�ADJUST�BUFFER�START�ADDRESS+‰ASL.L…#3,D4�*�TASK�BUF�SIZE�=�#TASKS�*�256+‰ADD.L…D4,SEGLTH-B(A6)‡*�TOTAL�SEGMENT�SIZE+‰MOVE.L„#GTSEG,D0‹*�GTSEG�DIRECTIVE�CODE�=1‰LEA‡PBGETSG(PC),A0"‰TRAP†#1’*�ATTACH�MEMORY�FOR�TASKS‰BNE.S…FATAL01XŒ*�UNSUCCESSFUL?‰MOVE.L„A0,SEGADDR-B(A6)„*�PHYSICAL�ADDR�OF�GTSEG�BLOCK�1/25/82>‰MOVE.L„A0,FORTASK-B(A6)„ANTICIPATE�THE�ATTACH�OF�THE�1ST�TASK2‰M7 OVE.L„A0,D0�ADD�REQUIRES�A�DATA�REGISTER‚1/25/822‰ADD.L…D0,TASKBUF-B(A6)„A(1ST�TASK�BUFFER)Œ1/25/82*‰MOVE.W„MAXTCNT-B(A6),D0Š*�NUMBER�OF�TASKS‰SUB.W…#1,D0�*�INDEX�FOR�DBRA,‰MOVE.L„TASKBUF-B(A6),A1Š*�FIRST�TASK�BUFFER%IN.020ƒCLR.L…(A0)+…*�CLEAR�TASK�FIELD"‰CLR.L…(A0)+…*�CLEAR�SESSION�FIELD3‰CLR.L…8(A0)…*�CLEAR�EVENT�FIELDS�ESPECIALLY�TVEXEC1‰MOVE.L„A1,(A0)ƒ*�SAVE�APPROPRIATE�BUFFER�ADDRESS(‰ADD.L…#LTSKVECT-8,A0†*�NEXT�TASK�VECTOR,‰ADD.L…#LTASKBUF,A1ˆ*�ADVANCE�TO�NEXT�BUFFER,‰DBRA†D0,IN.020‹*�LOOP�TO�CLEAR�TASK�VECTORS* *ˆGET�AN�ASQ*†MOVE.L‚#GTASQ,D0…GET�AN�ASQ,†LEA…ASQB(PC),A0‡ASQ�PARAMETER�BLOCK�ADDRESS†TRAP„#1 †BEQ.S‚IN.030 †CMP.W‚#8,D0†BNE.SˆFATAL01 ‡CMP.W‚#6,D0 †BEQ.S‚IN.030†ALREADY�HAS�ASQ-OK †CMP.W‚#3,D0†BNE.SˆFATAL03ƒBAD�PARM�BLOCK"†BRA.SˆFATAL02ƒBAD�TARGET�TASKNAME:FATAL01X�MOVE.L„#'TCB�',ERMES1N-B(A6)�ALTER�MEMORY�MESSAGE‰BRA.S…FATAL01'FATAL05‚ADD.L…#4,D7…ADJUST�MSG�TO�MSG15'FATAL04‚ADD.L…#4,D7…ADJUST�MSG�TO�MSG14'FATAL03‚ADD.L…#4,D7…ADJUST�MSG�TO�MSG13'FATAL02‚ADD.L…#4,D7…ADJUST�MSG�TO�MSG12;FATAL01‚BSR‡MSG11…HANDLES�MSG11,12,13,14�WITH�D7�ADJUSTMENT$DONE…MOVE.L„#TERM,D0‚TERMINATE�EXMON‰TRAP†#1ˆTHAT'S�ALL�FOLKS**ˆCLAIM�BREAKS*&IN.030ƒCLR.W…BREAK-B(A6)‚SET�NO�BREAKS‰LEA‡IOIN(PC),A0>‰MOVE.L„IOSFCT(A0),D5�SAVE�FUNCTION�&OPTIONS�FOR�BREAK�SERVICE*‰MOVE.L„#$01200200,IOSFCT(A0)�CLAIM�BREAKS‰LEA‡TENSHUN(PC),A1¤1/25/82-‰MOVE.L„A1,IOSCAD(A0)�SERVICE�ADDRESS•1/25/82‰TRAP†#28‰MOVE.L„D5,IOSFCT(A0)�RESTORE�NORMALCY�TO�IOS�PARM�BLOCK‰TST.L…D0ŒDID�IT�WORK?‰BEQ.S…IN.040ˆYES‰BSR‡MSG23‰TELL�USER�NO�BREAKS*&IN.040ƒLEA‡INQ(PC),A0…A(COMLINE�PARMS)‰CMP.W…#1,D6†SINGLE�TASK�MODE?0‰BLE‡PROMPT„NO�COMLINE�IMPLIES�MULTITASKING�MODE1‰BSR‡LOADTASK†PROCESS�COMLINE�LOAD�REFERENCE�TASK%‰MOVE.L„A0,A5…PRETEND�PARMLINE�IS�INQ ‰BSR‡ATCHTASK6‰BRA‡PROMPT„GO�DEBUG�SINGLE�TASK�MODE�(NO�WAIT�NEEDED)‰PAGE**ˆASR‚ROUTINES�IN�NEXT�5�PAGES*"EXASR„MOVE.L„#RDEVNT,D0„READ�EVENT"‰LEA‡EVNTBLK(PC),A0…RECEIVING�AREA‰TRAP†#1%‰BNE‡MSG15‹EVENT�READ�FAILED‚(NO�ASQ) $*ˆEVENT�CODE…TYPE�EVENTŒEXMON�ACTION,*Š3ŒUSER�TASK�CREATEDƒ-�SHOULD�NOT�SEE�THESE*Š4ŒTIMEOUT�EVENT‡-‚"†"ƒ"„"1*Š5ŒTERMINATION�EVENTƒ-�DETACH�SUBTASK�FROM�EXMON,*Š7ŒSERVER�TASK�EVENTƒ-�SHOULD�NOT�SEE�THESE2*Š8ŒEXCEPTION�EVENT…-�NORMAL�TYPE�:�SUBTASK�HALTED*™#1’SUBTASK�ATTACH�TO�EXMON*™#2’SUBTASK�DETACH�FROM�EXMON%*™#3’SUBTASK�HALTED�(BREAKPOINT,etc.) ?‰CMP.B…#5,EVNTCODE-B(A6)…*�SEE�IF�TASK�TERMINATED�BEFORE�DETACH ‰BEQ‡EXITASR5‰CMP.B…#8,EVNTCODE-B(A6)ƒ*�NORMAL�TYPE�EVENT?Š1/25/821‰BNE‡EX.019ŽNO�-�WHAT�SHALL�WE�DO?�THROW�IT�AWAY?5‰MOVEM.LƒEVNTTASK-B(A6),A2-A3†SAVE�TASKNAME�&�SESSION7‰MOVE.B„EVNTETYP-B(A6),D0‰GET�EXCEPTION�EVENT�TYPE�CODE!‰CMP.B…#2,D0�CHECK�EXCEPTION�TYPE*‰BGT‡EXEVNT†CODE�3=�NORMAL�EXCEPTION�EVENT‰BEQ‡EXDET‡CODE�2=�DETACH‰PAGE**ˆATTACH�EVENT*EXATT„EQU‚*‹CODE�1=�ATTACH3‰MOVE.W„MAXTCNT-B(A6),D0ƒMAX�NUMBER�OF�TASK�VECTORS(‰MOVE.L„SEGADDR-B(A6),A4†A(TASK�VECTORS),‰MOVE.B„#$20,D2‰PSEUDO�EVENT�CODE�FOR�ATTACHEX.002ƒTST.L…(A4)ŒTEST�AN�ENTRY‰BEQ.S…EX.005ŠEMPTY-USE�IT#‰CMPA.L„(A4),A2�TASK�BEING�STOPPED?-‰BEQ.S…EX.004ŽYES�-�ALTER�TO�PSEUDO�EVENT�#1F/‰ADD.W…#LTSKVECT,A4ˆA(NEXT�VECTOR�SLOT)‹1/25/82 ‰SUB.L„#1,D0 ‰BNE‡EX.002)‰MOVE.L„A2,NUTASKNM-B(A6)ƒNAME�TO�MESSAGE‰BSR‡MSG20�TASK�LIMIT�MESSAGE‰BRA‡EXITASR�GET�OUT >FOREGRND�MOVE.L„A4,FORTASK-B(A6)†MAKE�THIS�THE�FOREGROUND�TASK6‰MOVE.L„(A4),QUEST3N-B(A6)„INITIALIZE�PROMPT�TASKNAMES‰MOVE.L„(A4),QUEST1N-B(A6)‰RTS)EX.004ƒMOVE.B„#$1F,D2�STOPPED�MESSAGE�KEY.EX.005ƒMOVE.B„D2,EVNTECOD-B(A6)ƒTO�EVENT�BLOCK#‰MOVE.L„TVBUF(A4),A1ŒA(TASK�BUFFER),‰MOVEM.LƒA2-A3,(A4)…SAVE�TASK�NAME�&�SESSION2‰MOVE.L„TERMINAL-B(A6),TVTERM(A4)ƒSAVE�TERMINAL�ID6‰MOVE.L„#$10000,TVNOTE(A4)‚NOTE�LEVEL=1‚&�PRIORITY�=�04‰TST.W…CURTCNT-B(A6)‰FOREGROUND�TASK�EXISTS?…1/25/82‰BNE.S…EX.007ŽYES)‰BSR‡FOREGRNDŒNO�-�MAKE�THIS�TASK�FORTASK9EX.007ƒADD.W…#1,CURTCNT-B(A6)†ONE�MORE�TASK�NOW�IN�EFFECT/‰MOVE.L„#EXMMSK,D0„SET�EXMON�MASK�FOR�THIS�TASK(‰LEA‡XMSKB(PC),A0„ADDRESS�OF�PARA.�BLOCK7 ‰MOVE.L„A2,(A0)…COPY�TASKNAME,‰MOVE.L„8(A0),BUFMASK(A1)ˆSAVE�MASK�FOR�TASK‰TRAP†#1‰BEQ.S…EX.009†GOOD�RETURN"‰CMP.W…#1,D0„SEE�IF�BAD�PARA�BLOCK‰BEQ‡FATAL03‚BRANCH�IF�BAD‰BRA‡FATAL02‚BAD�TARGET�TASK9EX.009ƒMOVE.L„8(A4),A0ƒ*�GET�ADDRESS�OF�BUFFER�TO�BE�USED+‰MOVE.L„#LTASKBUF-1,D0‰*�CLEANUP�THE�BUFFEREX.010ƒCLR.B…(A0)+‰DBRA†D0,EX.010‰BRA.S…READSTAT‡SERVICE�MESSAGE#EX.019ƒBSR‡MSG19…UNKNOWN�EVENT�TYPE‰BRA‡EXITASRƒTHROW�IT�AWAY‰PAGE**ˆDETACH�EVENT*:EXDET„BSR.S‚FINDTASK„LOCATE�EVNTTASK�IN�VTASK�VECTOR�TABLE‰BRA.S…EXDET1„SUCCESSFUL‰BRA.S…UNKNOWNƒNOT�FOUND�ERROR:EXDET1ƒMOVE.W„#7,TVNOTE(A4)‚FORCE�DETACH�MESSAGE�FROM�TELL=******ƒCLR.L‚(A4)†FOUND�TASK-REMOVE�ITƒ[will�be�done�in�TELL] ‰CLR.L‚TVSESS(A4)ˆREMOVE�SESSION0‰SUB.W‚#1,CURTCNT-B(A6)‚REMOVE�FROM�NO.�OF�TASKS3‰MOVE.B„#$21,EVNTECOD-B(A6)ƒINDEX�TO�DETACH�MESSAGE$‰BRA.S‚GOTSTAT…SEND�DETACHED�MESSAGE *0*ˆSUBROUTINE�FIND�EVNTTASK�IN�VTASK�VECTOR�TABLE*GFINDTASK�MOVE.L„SEGADDR-B(A6),A4ƒASSUMES�A2-A3�HOLD�EVNTTASK�&�EVNTSESS*‰MOVE.W„MAXTCNT-B(A6),D1„NUMBER�OF�ENTRIESFINDVTƒCMP.L…(A4),A2…SAME�TASK?‰BNE.S…NEXTVT‡BRANCH�IF�NO"‰CMP.L…TVSESS(A4),A3ŠSAME�SESSION?‰BEQ.S…GOTVECTˆBRANCH�IF�SAME@NEXTVTƒADD.W…#LTSKVECT,A4…BUMP�PAST�LAST�ENTRY�LOOKED�ATƒ1/25/82‰SUB.W…#1,D1†DECREMENT�COUNTER‰BNE.S…FINDVT†CHECK�ANOTHER9‰ADD.L…#2,(A7)„NOT�FOUND�EXIT�ALTERS�RETURN�ADDR�ON�STACK2GOTVECT‚RTSŒFOUND�TASK�(A4=VECTOR�ENTRY�IN�VTASKS)‰PAGE**ˆNORMAL�EVENT*DEXEVNT‚BSR�FINDTASK‡SEARCH�VTASKS�FOR�EVNTTASK�RETURNS�ONLY�IF�FOUND!‰BRA.S…READSTAT‚FOUND�TASK�VECTOR%UNKNOWN‚BSR‡MSG26…TASK�NAME�NOT�FOUND ‰BRA‡EXITASR *-*ˆREAD�TASK�STATE�AND�PROCESS�EXCEPTION�EVENT*1READSTAT�MOVE.L„#RSTATE,D0ƒSET�UP�FOR�READ�STATUS‰MOVE.L„A4,A0…USETASK�VECTOR†TRAP‚#1)†BEQ.S‚GOTSTAT‰TASK�STATE�READ�SUCCESSFULER1ƒCMP.W‚#2,D0†BEQ„FATAL03‰BAD�PARM�BLOCK †CMP.W‚#3,D0+†BEQ„FATAL02‰TASK�NONEXISTENT�OR�PRIVILEGED †CMP.W‚#10,D0'†BEQ„FATAL03‰TASK�NOT�ATTACHED�TO�EXMON†BRA„FATAL04‰BAD�BUFFER�ADDR*GOTSTAT‚MOVE.L„TVBUF(A4),A1…BUFFER�ADDRESS>‰MOVE.W„EVNTECOD-B(A6),TVEVNT(A4)‚SAVE�CODE�&�TYPE�FOR�DISPLAT7‰MOVE.L„BUFPC(A1),D2ˆPC�WILL�STAY�IN�D2�FOR�ASR�ROUTINE.‰MOVE.L„D2,TVPC(A4)‹SAVE�PC�OF�EXCEPTION�EVENT,‰CLR.B…TVEXEC(A4)ŽTASK�FLAGGED�NOT�EXECUTING**†CHECK�TRACE�AND�BREAKPOINT*#‰MOVE.B„EVNTECOD-B(A6),D0‰GET�EVENT#‰MOVE.B„D0,TVAGE(A4)ˆFLAG�NEW�EVENT‰BNE.S…NOTRAP0�IS�NONZERO�FLAG3‰MOVE.B„#$FF,TVAGE(A4)†FORCE�FLAG�NONZERO�FOR�TRAP0%NOTRAP0‚CMP.B…#28,D0ŽSEE�IF�TRACE�ONE‰BNE.S…NOTRACE�NO�CHECK�IF�BP)‰CMP.W…#$1800,BUFDO(A1)„STEPPING�PAST�BP?‰BNE.S…NOTBP�NO�-�REGULAR�TRACE<‰MOVE.L„BUFSAVE(A1),BRKBUF-B(A6)�YES�-�INSTALL�OMITTED�BRKPT4‰MOVE.W„BUFDOSA(A1),BUFDO(A1)�RESTORE�NORMAL�OPTIONS‰LEA‡BPVALUE(PC),A0ž1/25/829‰MOVE.L„A0,BRKSOR-B(A6)…A(BRKPT)�IS�FROM�ADDR�OF�MOVELL„"#‰MOVE.L„#MOVELL,D0ŠMOVELL�DIRECTIVE"‰LEA‡BRKPBP(PC),A0‹A(MOVELL�PARMS)3‰MOVE.L„(A4),12(A0)‰DESTINATION�TASKNAME�TO�PARMBLK!‰TRAP†#1’PUT�BREAKPOINT�BEHIND�US‰BNE‡ERLL�UNSUCCESSFUL&‰CMP.W…#$1000,BUFDO(A1)„IS�HE�TRACING?"‰BEQ.S…NOTBP�YES�-�DO�TRACE�OUTPUT/‰CLR.B…TVAGE(A4)‹SUPPRESS�TELL�OF�TRACE�1�EVENT0RERUN„BSR‡RUN‰TASK�CONTINUES�EXEC�WITH�BRKPTS�IN0‰BRA.S…EXITASR�RETURN�FROM�EVENT�WITHOUT�MESSAGE NOTRACE‚CMP.B‚#22,D0ƒSEE�IF�BP‰BNE.S‚NOTBP’NO &‰MOVE.W„BUFBPCNT(A1),D5…GET�LOOP�COUNT'‰LEA‡BUFBPTBL(A1),A2…A(FIRST�BREAKADDR)"VALIDBP‚CMP.L…(A2)+,D2ŒTHIS�BRKPT?‰BEQ.S…BPFOUND�YES‰SUB.W…#1,D5�LAST�BP�ENTRY?‰BNE‡VALIDBP�NOT�YET(‰BRA.S…NOTBP�YES�-�HAVE�TRUE�PRIV.�INST.9BPFOUND‚MOVE.B„#$22,TVAGE(A4)†INDEX�TO�BREAKPOINT�MESSAGE/NOTBP„CMP.W…#$2102,EVNTECOD-B(A6)„SEE�IF�DETACH'‰BEQ.S…EXITASR�BREAKPTS�ALREADY�REMOVED !‰MOVE.W„BUFBPCNT(A1),D1‡GET�COUNT‰BEQ.S…EXITASR„NO�BP�TO�REMOVE&‰LEA‡BUFBPTBL(A1),A3‚A3�GOES�TO�BRKBUF%REMOVEBP�LEA‡BUFBPSAV-BUFBPTBL(A3),A2 ‰CMP.W…#$1000,BUFDO(A1)„TRACING?‰BNE.S…PURGEBP�NO,‰CMP.L…(A3),D2�YES�-�THIS�INST�A�BREAKPOINT?,‰BNE.S…PURGEBP�NO�-�WILL�TELL�TRACED�MESSAGE6‰MOVE.B„#$22,TVAGE8 (A4)†YES�-�CHANGE�MESSAGE�TO�BREAKPT2‰MOVE.B„#22,TVEVNT(A4)†PRETEND�WE�HIT�A�BREAKPOINT.PURGEBP‚BSR‡CLRALL†RESTORE�CODE�WHILE�IN�EXMON‰ADD.L…#4,A3‡POINT�TO�NEXT�BP ‰SUB.W…#1,D1$‰BNE.S…REMOVEBPƒBRANCH�IF�MORE�TO�DO +EXITASR‚MOVE.L‚#RTEVNT,D0„RETURN�FROM�EVENT‰LEA�1,A0�ENABLE�ASR�STATUS‰TRAP�#1L*---------------------------------------------------------------------------L*/////////////////// EXECUTION PATH RESUMES FOLLOWING WTEVENT //////////////:*///////////////////ˆEND�OF�ASR�DRIVEN�CODEŒ//////////////L*---------------------------------------------------------------------------*)*ˆATTENTION�EVENT…(BREAK�KEY�STRUCK�!!!!)*(TENSHUN‚MOVE.L„#RDEVNT,D0ŒREAD�THE�EVENT‰LEA‡ATTEVNT(PC),A0‰TRAP†#1)‰BTST†#SETBRK,BREAK-B(A6)„WANT�IO�BREAKS?‰BEQ‡EXITASR�BRANCH�IF�NO*‰BSET†#GOTBRK,BREAK-B(A6)ƒGOT�AN�I/O�BREAK‰BRA‡EXITASR�RETURN�FROM�EVENT PAGE**ˆTELL�USER�ABOUT�RECENT�EVENTS*.TELL…MOVE.L„SEGADDR-B(A6),A4ŠFIRST�TASK�VECTOR#‰MOVE.W„MAXTCNT-B(A6),D6ŠLOOP�COUNT)‰CMP.W…#1,MAXTCNT-B(A6)„SINGLE�TASK�MODE?%‰BNE.S…TELLMOREŒNO�-�WAIT�NOT�IMPLIED-‰TST.B…TVEXEC(A4)ŠYES,�BUT�IS�HE�IN�EXECUTION0‰BEQ.S…TELLMOREŒNO�-�THEN�PROMPT�WITHOUT�WAITING+‰MOVE.L„#WTEVNT,D0ŠNO�PROMPT�UNTIL�AN�EVENT‰TRAP†#1&TELLMORE�TST.L…(A4)�TASK�IN�THIS�SLOT?‰BEQ.S…NEXTELL�NO‰CLR.L…D2’PREPARE�INDEX�REG$‰MOVE.B„TVAGE(A4),D2ˆNEW�EVENT�FLAG?!‰BEQ.S…NEXTELL�NONE�FOR�THIS�TASK*‰BGT.S…TELLMSG�USE�FLAG�AS�INDEX�TO�MESTYP&‰ADD.B…#1,D2�TRAP0�MSG�HAS�FLAG�OF�$FF"TELLMSG‚CLR.B…TVAGE(A4)‹CLEAR�FLAG6‰MOVE.L„TVBUF(A4),A1ˆESTABLISH�BUFFER�ADDR�FOR�GETRRID ‰CMP.B…#$22,D2�BREAKPOINT�EVENT?,‰BNE.S…NOTFORE�NO�-�SKIP�NOTE�LEVEL�ANALYSIS&‰MOVE.W„TVNOTE(A4),D1‡CHECK�NOTE�LEVEL%‰BEQ.S…NEXTELL�=0�MEANS�NO�MSG�&�HALT ‰CMP.W…#2,D13‰BEQ.S…ISFOREŽ=2�MEANS�MSG�&�HALT�&�SET�TO�FOREGRND"‰BLT.S…NOTFORE�=1�MEANS�MSG�&�HALT-‰BSR‡INSTALL�=3�OR�4�MEANS�CONTINUE�EXECUTION‰BSR‡RUN$‰MOVE.L„#$22,D2�INSTALL�CLOBBERED�D2,‰CMP.W…#3,D1�EXEC�RESTARTED�CHECK�IF�MESSAGE&‰BEQ.S…NOTFORE�=3�MEANS�MSG�&�CONTINUE)‰BRA.S…NEXTELL�=4�MEANS�NO�MSG�&�CONTINUE&ISFOREƒBSR‡FOREGRNDŒYES�-�NOTE�LEVEL=25NOTFORE‚MOVE.L„(A4),OUTTASK-B(A6)„TASKNAME�TO�MESSAGE,‰LEA‡OUTEVNT(PC),A0ŠA(MESSAGE�VARIABLE�PART).‰LEA‡MESTYP(PC),A5‹BASE�ADDR�OF�EVENTMSG�TABLE)‰LSL.L…#4,D2�SHIFT�INDEX�TO�MESTYP�OFFSET$‰ADD.W…D2,A5�A(MESSAGE�TO�BE�COPIED)1‰MOVE.L„(A5)+,(A0)+‰COPY�EVENT�MSG�TO�OUTPUT�AREA‰MOVE.L„(A5)+,(A0)+‰MOVE.L„(A5)+,(A0)+.‰MOVE.L„(A5)+,(A0)+‰ALL�MESSAGES�16�BYTES�LONG‰MOVE.L„TVPC(A4),D0‰GET�PC)‰LEA‡OUTPC(PC),A3ŒOUTPUT�LOCATION�ADDRESS4‰BSR‡GETRRIDƒ*�GET�RELOCATION�REGISTER�ID�AND�OFFSET‰BSR‡MSG03‡PRINT�EVENT�MESSAGE(‰CMP.W…#7,TVNOTE(A4)�JUST�DETACHED�TASK?‰BNE.S…NEXTELLƒNO6‰CLR.L…(A4)†YES:EMPTY�TASK�VECTOR�SLOT�NOW!!!!!!!!!!!!@NEXTELL‚ADD.W…#LTSKVECT,A4ˆCHECK�NEXT�TASK�FOR�NEW�EVENT�1/25/82#‰SUB.W…#1,D6‡DONE�ALL�TASK�VECTORS?‰BGT‡TELLMORE„NOT�YET‰RTS PAGE**ˆGET�NEXT�COMMAND*&WHAT…BSR‡TELLˆINTERJECT�EVENT�MESSAGES0‰LEA‡MSG00(PC),A5„SAY�WHAT�(WITH�PROMPT)Œ1/25/82‰BRA.S…PROMPTER(PROMPTƒBSR‡TELLˆINTERJECT�EVENT�MESSAGES5‰LEA‡MSG02(PC),A5„ASK�FOR�NEXT�SYMBUG�COMMAND‡1/25/82&PROMPTER�JSR‡(A5)�PRINT�MSG00�OR�MSG02$‰CLR.W…BREAK-B(A6)�SET�NO�I/O�BREAKS2‰MOVE.L„FORTASK-B(A6),A4ŠA(FOREGROUND�TASK�VECTOR))‰MOVE.L„TVBUF(A4),A1ˆA(TASK�STATE�BUFFER)‰BSR‡KEYIN�READ�INPUT�MESSAGE**ˆSEE�IF�NORMAL�COMMAND*‰BSR‡PARSVERBŒGET�IT$‰BGT.S…HAVEVERBŒBRANCH�IF�VERB�FOUND0‰CMP.W…#$1000,BUFDO(A1)„CR�INPUT--IS�HE�TRACING?‰BEQ‡TRACING�YES!‰BRA‡WHAT†ERROR�RETURN�BAD�SYNTAX!HAVEVERB�CMP.L…#4,D1…4=MAX�LENGTH‰BGT‡WHAT†TOO�LONG-ERROR&‰LEA‡VTBL(PC),A2‚ADDRESS�OF�VERB�TABLE+‰LEA‡VTBLE(PC),A3‚END�OF�VERB�TABLE�1/25/82(FINDVERB�CMP.L…(A2)+,D0‚LOOK�FOR�A�MATCH‰BEQ.S…DOVERB„BRANCH�IF�A�MATCH(‰CMP.L…A3,A2…SEE�IF�END�OF�TABLE•1/25/82‰BNE.S…FINDVERB‚BRANCH�IF�MORE**ˆSEE�IF�REGISTER�COMMAND*'‰CMP.B…#'.',VFLD-B(A6)‚REGISTER�PREFIX? ‰BNE‡WHAT†NOT�A�REGISTER�COMMAND‰CMP.L…#3,D1…SEE�IF�LENGTH�IS�3"‰BNE‡WHAT†REG�COMMAND�WRONG�LENGTH&‰LEA‡STATBL(PC),A2ƒLOOK�FOR�MO8 RE�VERBS-‰LEA‡STATBLE(PC),A3‚END�OF�VERB�TABLE‹1/25/82‰ROR.L…#8,D0…GET�REG�ID�IN�D0.W'FINDREG‚CMP.W…(A2)+,D0ƒLOOK�FOR�A�MATCH‰BEQ.S…DOREG†BRANCH�IF�A�MATCH‰ADDQ†#2,A2†BUMP�PAST�INDEX(‰CMP.L…A3,A2†SEE�IF�END�OF�TABLE”1/25/82‰BNE.S…FINDREGƒBRANCH�IF�MORE‰BRA‡WHAT„DIDN'T�FIND�A�MATCH**ˆFOUND�NORMAL�COMMAND*5DOVERBƒADD.L‚#BRATBL-VTBL-4,A2‚ACTUAL�ADDRESS”1/25/82‰JMP‚(A2)„GO�THEREBRATBLƒBRA‡GOˆGO-RETURN�TO�TASK!‰BRA‡GOˆ'GO'�IS�EQUIVALENT�TO�'G'‰BRA‡TRACE…TRACE�EXECUTION ‰BRA‡TRACE…T�IS�EQUIVALENT�TO�TR‰BRA‡ASTOP…ADDRESS�STOP�COMMAND#‰BRA‡BRK‡BREAK�POINT�SET�OR�DISPLAY‰BRA‡BRKCLR„CLEAR�BREAK�POINT‰BRA‡DISPLY„TRACE�DISPLAY‰BRA‡DMEM†DISPLAY�MEMORY‰BRA‡SMEM†MEMORY�SET!‰BRA‡QUIT†Q�IS�EQUIVALENT�TO�QUIT4‰BRA‡QUIT…TERMINATE�DEBUG�SESSION�&�ASSOCIATED�TASKS)‰BRA‡RELREG„*�DEFINE�RELOCATION�REGISTERS ‰BRA‡HELP"‰BRA‡HELP†HE�IS�EQUIVALENT�TO�HELP-‰BRA‡DEFAULTƒDISPLAY�&�CHANGE�PRINTER�DEFAULT‰BRA‡LOADˆLOAD�TASK‰BRA‡ATTACH†ATTACH�&�START�TASK"‰BRA‡DETACH†DETACH�TASK�FROM�EXMON‰BRA‡STARTASK„START�TASK‰BRA‡HALTTASK„STOP�TASK‰BRA‡TASKˆSET�REFERENCE�TASK!‰BRA‡MASKˆALTER�EXMON�MASK�REMOTE‰BRA‡EVENT‡CREATE�EVENT�REMOTE‰BRA‡TERMIN†TERMINATE�REMOTE$‰BRA‡WAITER†NO�PROMPT�WAIT�FOR�EVENT$‰BRA‡STAT†REQUEST�OR�SET�TASK�STATUS**ˆFOUND�REGISTER�COMMAND*"DOREG„MOVE.W„D0,D2ƒSAVE�STATE�TYPE!‰MOVE.W„(A2),A2‚GET�BUFFER�OFFSET,‰ADD.L…A1,A2‚ADDRESS�OF�STATE�TYPE�IN�BUFFER‰BSR‡PARSV‚GO�GET�VALUE(‰BEQ‡ONEDISƒNO�VALUE-GO�DISPLAY�CONTENTS+‰CMP.W…#9,D1‚CHECK�FOR�VALID�LENGTH•1/25/82!‰BPL.S…WHAT.01‚BRANCH�IF�TOO�LONG-‰CMP.W‚STATBL+$44-B(A6),D2‚SEE�IF�2�BYTE�TYPE ‰BEQ.S…SHORTREGƒBRANCH�IF�2�BYTE$‰CMP.W…STATBL+$50-B(A6),D2‚SEE�AGAIN ‰BEQ.S…SHORTREGƒBRANCH�IF�2�BYTE‰MOVE.L‚D0,(A2)ƒSAVE�VALUE$PROM.01‚BRA„PROMPT‚SEE�IF�MORE�INPUT)SHORTREG�MOVE.W‚D0,(A2)„SAVE�2�BYTE�VALUE7‰CMP.W‚STATBL+$50-B(A6),D2…SEE�IF�OPTIONS�BEING�CHANGED"‰BNE…PROM.01ŒBRANCH�IF�NOT�OPTIONS&‰CMP.W�#$1800,D0�IS�NEW�OPTIONS�$1800?‰BNE.SƒNEWOPTƒBRANCH�IF�NOT1‰MOVE.W�BUFDOSA(A1),(A2)�RESTORE�PREVIOUS�OPTIONS-WHAT.01‚BRA…WHAT‚CAN'T�DO�$1800�(BREAKPOINTS)9NEWOPTƒMOVE.W„D0,BUFDOSA(A1)†UPDATE�CURRENT�OPTIONS�FIELD ‰BRA‡PROM.01 PAGE**ˆGO*!GO‡CLR.W…BUFDO(A1)�SET�OP�=�$0000‰BSR‡PARSV…GET�START�ADDR‰BEQ.S…GOEX†NO�START�ADDR,‰MOVE.L„D0,BUFPC(A1)ˆINIT�PC�WITH�START�ADDR &GOEX…BSR.S…INSTALLƒINSTALL�BREAKPOINTS1‰BSR.S…RUN‡DO�PSTATE�&�REXMON�DIRECTIVES�FOR�TASK ‰BRA‡PROMPT +RUN†TST.B…TVEXEC(A4)‚TASK�IN�EXECUTION�NOW?6‰BNE.S…RAN‰YES�-�CANNOT�START�SECOND�PATH�OF�EXECUTION!‰MOVE.L„#PSTATE,D0‚PUT�TASK�STATE+‰MOVE.L„A4,A0‡USE�TASK�VECTOR�AS�PARM�BLOCK‰TRAP†#1ŠUPDATE�MASK,PC,ETC.‰BNE‡ER1#‰LEA‡REXPB(PC),A0ŒREXMON�PARM�BLOCK#‰MOVE.L„(A4),(A0)‹COPY�TASK�VECTORS‰MOVE.L„4(A4),4(A0)‰MOVE.L„8(A4),D01‰ADD.L…#BUFDO,D0„COMPUTE�ADDRESS�OF�EXMON�OPTIONS‰MOVE.L„D0,8(A0),‰MOVE.B„#1,TVEXEC(A4)�FLAG�TASK�IN�EXECUTION/‰MOVE.L„#REXMON,D0„RUN�TASK�UNDER�EXMON�CONTROL‰TRAP†#1‰BEQ.S…RUNNINGƒSUCCESSFUL0‰CMP.W…#15,D0„CHECK�FOR�BAD�VALUE�LOCATION�ERROR‰BNE‡ER1‡NO�-�SOME�OTHER�ERROR%‰BSR‡MSG17…BAD�VALUE�LOCATION�MESSAGERUNNING‚MOVE.L„#DELAY,D0"‰MOVE.L„#100,A0ƒDELAY�FOR�1/10�SEC5‰TRAP†#1ˆHOPING�THE�EVENT�WILL�OCCUR�BEFORE�WE�PROMPTRAN†RTS‰SPC‡3(INSTALL‚MOVE.W„BUFBPCNT(A1),D5‡GET�COUNT‰BEQ.S…INSTALLDŽBRANCH�IF�NONE(‰TST.B…TVEXEC(A4)ŒTASK�NOW�IN�EXECUTION?,‰BNE.S…INSTALLDŽYES�-�BREAKPOINTS�ALREADY�IN‰LEA‡BPVALUE(PC),A2�1/25/82*‰MOVE.L„A2,BRKSOR-B(A6)‡PUT�SOURCE’1/25/82-‰LEA‡BUFBPSAV-4(A1),A2…BREAKPOINT�SAVE�BUFFER'‰MOVE.L„A2,BRKGET-B(A6)‡GET�DESTINATION"‰MOVE.L„#2,BRKGET+4-B(A6)…LENGTH=2‰MOVE.L„#2,BRKBUF+4-B(A6)-‰LEA‡BUFBPTBL(A1),A2‡BREAKPOINT�ADDRESS�TABLE)‰MOVE.L„BUFPC(A1),D2ŠPC�SAVED�FOR�COMPARE-INSTALBP�MOVE.L„(A2),BRKPBUF-B(A6)„GET�SOURCE*‰MOVE.L„(A2)+,BRKBUF-B(A6)„PUT�DESTINATION&‰ADD.L…#4,BRKGET-B(A6)‡GET�DESTINATION‰LEA‡BRKPBG(PC),A0‹GET,‰MOVE.L„(A4),(A0)‹COPY�TASKNAME�TO�PARMBLOCK5‰MOVE.L„#MOVELL,D0ŠCOPY�TARGET�CODE�TO�BUFBPSAV�TABLE‰TRAP†#1‰BNE‡ERLL�BRANCH�IF�BAD"‰CMP.L…-4(A2),D2‹B9 REAKPOINT�AT�PC?‰BNE.S…NOTATBPƒNO0‰CMP.B…#22,TVEVNT(A4)†YES,�BUT�HAVE�WE�TOLD�HIM?,‰BNE.S…NOTATBP�NO�-�SO�CAUSE�A�BRKPT�MESSAGE0‰MOVE.L„D2,BUFSAVE(A1)†YES�-�SAVE�THE�PC�ADDRESS/‰MOVE.W„BUFDO(A1),BUFDOSA(A1)‰SAVE�USER�OPTIONS9‰MOVE.W„#$1800,BUFDO(A1)„FORCE�TRACE�1�INSTRUCTION�OPTION*‰BRA.S…INSTLNXTŒSKIP�INSTALLING�THIS�BRKPT:NOTATBP‚LEA‡BRKPBP(PC),A0ŒOVERLAY�TASKCODE�WITH�BREAKPOINT.‰MOVE.L„(A4),12(A0)‰COPY�TASKNAME�TO�PARMBLOCK‰MOVE.L„#MOVELL,D0 ‰TRAP†#1ˆPUT‰BNE‡ERLL†BRANCH�IF�BADINSTLNXT�SUB.W‚#1,D5%‰BNE.S‚INSTALBPˆSTILL�MORE�TO�INSTALL*INSTALLD�RTS‘ALL�BREAKPOINTS�ARE�INSTALLED .TRACE„MOVE.W„#$1000,BUFDO(A1)„SET�TRACE�OPTION‰BSR‡PARSV�GET�TRACE�COUNT‰BEQ.S…TRACING�NO�TRACE�COUNT;‰MOVE.W„#$0800,BUFDO(A1)„CHANGE�OP�TO�TRACE�MODE�WITH�COUNT!‰MOVE.L„D0,BUFCNT(A1)‡COUNT�IN�MC TRACING‚BRA‡GOEX�BEGIN�EXECUTION9ASTOP„MOVE.W„#$2000,BUFDO(A1)„SET�OPTIONS�TO�STOP�ON�ADDR‰BSR‡PARSV�GET�ADDR�LOCATION+‰BEQ‡TRACING�USE�CURRENT�VL�LOCATION�&�MASK)‰MOVE.L„D0,BUFLOC(A1)‡SET�NEW�VL�LOCATION=‰MOVE.L„#$FFFFFFFF,BUFVM(A1)‚MASK�LONG�WORD�IF�ADDR�SPECIFIED/‰BSR‡PARSV�GET�VALUE�IF�STOP�ON�ADDR�EQUAL�MODE%‰BEQ‡TRACING�STOP�ON�ADDR�CHANGE�MODE4‰MOVE.L„D0,BUFVAL(A1)‡STOP�ON�ADDR�EQUAL�MODE�NEW�VA4‰MOVE.W„#$3000,BUFDO(A1)„ALTER�OP�TO�ADDR�EQUAL�MODE‰BRA‡TRACING�START�EXECUTION HELP…BSR‡MSG28�PRINT�HELP�SCREEN‰BRA.S…PROM.02�ISSUE�PROMPTDEFAULT‚MOVE.L„#6,D0�LOOP�-1(‰LEA‡DEFMSG(PC),A0‹COPY�DEFMSG�TO�QUEST24‰LEA‡QUEST2(PC),A1‹TO�ACCOMPLISH�OUTPUT�W/INPUT�MODEDEFCOPY‚MOVE.L„(A0)+,(A1)+‰DBRA†D0,DEFCOPY‰BSR‡MSG01�TELL�CURRENT�DEFAULT‰BSR‡KEYIN�ACCEPT�NEW�SETTING$‰LEA‡AP(PC),A2�ASSUME�ATTACH�PRINTER(‰MOVE.B„(A5),D2�FIRST�LETTER�OF�RESPONSE‰CMP.B…#'Y',D2�SET�ECHO=YES?‰BEQ.S…ECHOSET‰CMP.B…#'N',D2�SET�ECHO=NO?(‰BNE.S…PROM.02�LEAVE�ECHO�MODE�UNALTERED"‰LEA‡DP(PC),A2�CALL�DETACH�PRINTER,ECHOSET‚CMP.B…ECHOOPT-B(A6),D2ŠSAME�SETTING?‰BEQ.S…PROM.02�YES+‰MOVE.B„D2,ECHOOPT-B(A6)„ALTER�ECHO�DEFAULT"‰JSR‡(A2)�ATTACH�OR�DETACH�PRINTER‰BRA.S…PROM.02**ˆTASK�RELATED�COMMANDS*$LOAD…MOVE.L„A5,A0…A(TASKNAME�IN�INQ)'‰MOVE.L„#20,D6„PSEUDO�COMLINE�LENGTH=20=‰BSR‡LOADTASK‚PERFORM�LOAD�&�PASS�COMLINE�TO�USERTASK�1/25/82!PROM.02‚BRA‡PROMPT„REISSUE�PROMPTJ*=========================================================================/ATTACHƒBSR‡PARSVERB‚PARSE�FOR�TASKNAME�(IF�ANY)!‰BNE.S…ATTDEF„NOT�DEFAULT�FORTASK&‰MOVE.L„(A4),D0ƒUSE�THE�FORGROUND�TASK6ATTDEFƒMOVE.L„D0,TASKLDR-B(A6)†TASKNAME�TO�BE�ATTACHED0‰BSR‡ATCHTASK‚ATTACH�TASK�&�PASS�LUNS�&�START�IT ‰BRA‡PROM.02J*=========================================================================STARTASK�BSR‡GETNAME-STARTNXT�TST.L…(A4)†TASK�EXISTS�IN�THIS�SLOT?‰BEQ.S…STARTSKP‚NO1‰MOVE.L„TVBUF(A4),A1‚YES�-�USE�ITS�A(TASK�BUFFER)(‰BSR‡INSTALLƒINSTALL�BREAKPOINTS�IN�TASK‰BSR‡RUN‡START�EXECUTION8STARTSKP�CMP.L…#'ALL�',VFLD-B(A6)„COMMAND�FOR�ALL�TASKS?‰BNE‡PROM.02ƒNO5‰ADD.W…#LTSKVECT,A4ˆPOINT�TO�NEXT�TASK�VECTOR…1/25/82‰SUB.W…#1,D3…REDUCE�TASKCOUNT‰BNE‡STARTNXT‚CONTINUE#‰BRA‡PROM.02ƒALL�TASKS�IN�EXECUTIONJ*=========================================================================HALTTASK�BSR‡GETNAMEHALTMORE�TST.L…(A4)�TASK�HERE?‰BEQ.S…HALTSKIPŒNO�-�TRY�NEXT(‰TST.B…TVEXEC(A4)ŠYES�-�IS�IT�EXECUTING?#‰BEQ.S…HALTSKIPŒNO�-�LEAVE�IT�ALONE-‰MOVE.L„A4,A0�USE�TASK�VECTOR�AS�STOP�PARMBLK‰MOVE.L„#STOP,D0ŒSTOP�DIRECTIVE‰TRAP†#1'‰BEQ.S…HALTEDŽTASK�STOPPED�SUCCESSFULLY ‰BSR‡LD.021ŽREPORT�TRAP�#1�ERROR-‰BRA.S…HALTSKIPŒON�TO�THE�NEXT�IF�HALT�"ALL�"1HALTEDƒCLR.B…TVEXEC(A4)ŠTASK�NOT�NOW�IN�EXECUTION#‰MOVE.L„TVBUF(A4),A1ˆA(TASK�BUFFER)‰MOVE.L„(A4),A2�SAVE�TASKNAME$‰BSR‡DETACHT�TEMPORARILY�DETACH�TASK5‰MOVE.L„A2,(A4)�UNERASE�TASKNAME�IN�VECTOR�FOR�ATTACH4‰MOVE.L„A4,A1�A1�MUST�POINT�AT�TASKNAME�FOR�REDYTASK‰BSR‡REGLESS�START�WITHOUT�REGS4‰BSR‡REDYTASKŒATTACH�&�START�TASK�(WON"T�BEGIN�EXEC))‰BSR‡STATISŽRSTATE�FOR�CURRENT�REG�VALUES+HALTSKIP�CMP.L…#'ALL�',VFLD-B(A6)‚STOP�ALL?'‰BNE.S…PROM.03�NO�-�SINGLE�TASK�STOPPED,‰ADD.W…#LTSKVECT,A4ˆ9 STEP�TO�NEXT�TASK�VECTOR&‰SUB.W…#1,D3�LOOP�ON�GETNAME'S�MAXTCNT4‰BNE‡HALTMOREŒLOOP�UNTIL�UNSUCCESSFUL�(FOR�ALL�MODE)‰BRA.S…PROM.03�RETURN�TO�PROMPTK*==========================================================================(TASK…BSR‡GETNAME�GET�TASKNAME�(REQUIRED)%‰BSR‡FOREGRNDŒMAKE�IT�FOREGROUND�TASK1‰CMP.B…#$0D,-1(A5)‰NOTE�LEVEL�PARAMETER�SUPPLIED?‰BEQ‡PROMPTŽNO ‰BSR‡PARSV�PARSE�FOR�LEVEL�VALUE5‰MOVE.W„D0,TVNOTE(A4)‡ALTER�NOTE�LEVEL�IN�TASK�VECTOR‰BRA.S…PROM.03H*=======================================================================&MASK…BSR‡GETNAMEƒGET�TASKNAME�(IF�ANY)‰MOVE.L„#1,D1…SET�MASK�BIT‰BSR‡PARSV…PARSE�FOR�BIT�VALUE&‰TST.L…D0ˆRETURNED�EXCEPTION�BIT�VALUE'‰BEQ.S…MASKXORƒD1�CURRENTLY�=�1‚(BIT#0)‰LSL.L…D0,D1…SHIFT�MASK�BIT1MASKXOR‚MOVE.L„TVBUF(A4),A1„USE�NAMED�TASK�BUFFER1‰EOR.L…D1,BUFMASK(A1)†INVERT�SELECTED�BIT�IN�MASK‰LEA‡XMSKB(PC),A0‚A(PARM�BLOCK)‰MOVE.L„(A4),(A0)�COPY�TASKNAME‰MOVE.L„4(A4),4(A0)ƒAND�SESSION(‰MOVE.L„BUFMASK(A1),8(A0)ƒNEW�MASK�VALUE‰MOVE.L„#EXMMSK,D0ŠDIRECTIVE‰TRAP†#1.‰MOVE.L„#$01FFFFF1,8(A0)„RESTORE�STANDARD�MASKPROM.03‚BRA‡PROMPTH*=======================================================================EVENT„BSR‡GETNAME%‰BSR‡PARSV…PARSE�FOR�EVENT�CODE�VALUE&‰LEA‡ASQB(PC),A0ƒREUSE�THIS�PARM�BLOCK‰MOVE.L„(A4),(A0)�COPY�TASKNAME+‰CLR.W…8(A0)…USE�DEFAULT�ASR�OF�TARGET�TASK2‰SUB.W…#12,A7„MAKE�ROOM�ON�STACK�FOR�EVENTŒ1/25/82(‰MOVE.L„A7,10(A0)�A(EVENT)�TO�PARM�BLOCK7‰MOVE.W„#$0C08,(A7)‰NORMAL�EXCEPTION�EVENT�PUT�ON�STACK ‰MOVE.L„(A4),2(A7)ŠCOPY�TASKNAME%‰MOVE.L„SESSION-B(A6),6(A7)Š&�SESSION)‰MOVE.B„D0,10(A7)‹EXCEPTION�CODE�OF�EVENT%‰MOVE.B„#$03,11(A7)‰NORMAL�EVENT�TYPE*‰MOVE.L„#QEVNT,D0‹DIRECTIVE�CODE�FOR�QEVNT‰TRAP†#1#‰ADD.W…#12,A7ŽCLEANUP�STACK‘1/25/82‰TST.L…D0’CHECK�SUCCESS‰BEQ‡PROM.03�OK!‰BSR‡MSG24�FAILED ‰BRA‡PROM.03G*======================================================================TERMINƒBSR‡GETNAME"‰BSR‡QUITTER�TERMINATE�TARGET�TASK ‰BRA‡PROM.03H*=======================================================================)DETACHƒBSR‡DETACHT�DETACH�TASK�FROM�EXMON ‰BRA‡PROM.03H*=======================================================================9WAITERƒMOVE.L„#WTEVNT,D0ŠWAIT�FOR�EVENT�WITHOUT�EXMON�I/O&‰TRAP†#1’ALLOWS�TARGET�TASK�TO�USE�CRT.‰BRA‡PROM.03�NOW�READY�TO�ISSUE�DEBUG�COMMANDSH*=======================================================================STAT…BSR‡GETNAME'‰TST.L…FLDL-B(A6)ŠDISPLAY�MODE?‘1/25/82‰BEQ.S…DISPLAT�YES#‰CMP.B…#$0D,-1(A5)‰STATUS�PROVIDED?‰BEQ‡WHAT�SYNTAX�ERROR‰BSR‡PARSVERB‚GET�STATUS�TEXT(‰LEA‡ADX+4(PC),A0‚TABLE�OF�TASK�STATUSES'‰LEA‡ADXEND(PC),A2�A(TABLE�END)˜1/25/82#NXTSTAT‚CMP.L…(A0)+,D0‚FIND�STATUS?0‰BEQ.S…SETSTATƒYES�-�DORM,REDY�&�WAKE�LEGAL�ARGS"‰CMP.L…A2,A0…END�OF�TABLE?›1/25/82‰BNE‡NXTSTATƒNO‰BRA‡WHAT†STATUS�SYNTAX�ERRORSETSTAT‚SUB.L…A2,A0­1/25/82‰ADD.L…#SLEEP+8,A0§1/25/82‰JMP‡(A0)†JUMP�TO�STATUS�VECTORSLEEP„MOVE.L„#STOP,D0‰BRA.S…TRAPPER1‚DO�TRAP�1�CALLAWAKE„MOVE.L„#START,D0‰BRA.S…TRAPPER1@UNWAITƒMOVE.L„#WAKEUP,D0�DO�WAKEUP�TO�SET�STATUS�READY�FROM�WAIT)TRAPPER1�LEA‡STARTTSK(PC),A0‰A(PARMBLOCK)‰MOVE.L„(A4),(A0)‹COPY�TASKNAME3‰MOVE.W„#$8000,8(A0)ˆNO�REG�INITIALIZATION�ON�START ‰TRAP†#1’DO�WAKEUP,START�OR�STOP$‰MOVE.W„#$A000,8(A0)ˆRESTORE�OPTIONS‰TST.W…D0’DID�IT�WORK?‰BEQ.S…DISPLAT�SUCCESSFUL‰BSR‡LD.021ŽREPORT�TRAP�1�ERRORPROM.04‚BRA‡PROMPTDISPLAT‚BSR‡MSG29�PRINT�STATHDR.‰MOVE.L„SEGADDR-B(A6),A4ŠSTART�OF�TASK�VECTORS'‰MOVE.W„MAXTCNT-B(A6),D2ŠMAX�TASK�COUNTDIS.005‚TST.L…(A4)�TASK�HERE?‰BNE.S…DIS.007�YES�-�SHOW�IT8DIS.006‚ADD.W…#LTSKVECT,A4ˆNEXT�TASK�VECTOR�SLOT‰1/25/82%‰SUB.L…#1,D2�LOOP�ON�ALL�TASK�VECTORS‰BNE‡DIS.005�CONTINUE&‰BRA‡PROM.04�ALL�TASKS�STATUS�REPORTEDDIS.007‚LEA‡SPACES(PC),A3‰MOVE.L„#19,D0ŽLOOP�COUNT�-1;DIS.010‚MOVE.L„SPACES-B(A6),-(A3)ˆBLANK�DMOUTA�FOR�80�BYTES‰DBRA†D0,DIS.010‰MOVE.L„(A4),(A3)‹COPY�TASKNAME"‰MOVE.L„TVSESS(A4),4(A3)‹&‚SESSION$‰TST.B…TVEXEC(A4)ŠTASK�IN�EXECUTION?‰BEQ.S…DIS.012�NO,‰MOVE.B„#$65,9(A3)ŠY: ES�-�FLAG�e�BEFORE�STATEDIS.012‚LEA‡ADX(PC),A0/‰MOVE.B„TVCODE(A4),D0‡INDEX�TO�A,D,X�TYPE�EVENT ‰EXT.W…D02‰MOVE.B„0(A0,D0.W),17(A3)ƒEVENT�ID�TO�PRINT�BUFFER‰MOVE.B„TVEVNT(A4),D0 ‰BSR‡CONV"‰MOVE.W„D0,18(A3)‹ASCII�EVENT�CODE‰TST.B…TVAGE(A4)‰BEQ.S…DIS.015�OLD�EVENT�FLAG"‰MOVE.B„#'!',20(A3)‰FLAG�NEW�EVENT/DIS.015‚CMP.L…FORTASK-B(A6),A4ŠFOREGROUND�TASK?‰BNE.S…DIS.020�NO‰MOVE.B„#'<',15(A3)‰YES/DIS.020‚MOVE.W„TVNOTE(A4),D0‹NOTIFICATION�LEVEL‰OR.B†#$30,D0�CONVERT�TO�ASCII‰MOVE.B„D0,16(A3)‹TO�BUFFER$‰BSR.S…STATISŽRSTATE�FOR�TASK�STATUS ‰LEA‡ADX+4(PC),A0ŒA(STATE�TABLE)!‰MOVE.L„BUFSTAT(A1),D1†TCB�STATUS‰BMI.S…DIS.030�IS�DORMANT ‰ADD.L…#4,A0‰BTST.L„#20,D1ŽREADY�BIT�IS�#20‰BNE.S…DIS.030�TASK�IS�READY ‰ADD.L…#4,A09DIS.030‚MOVE.L„(A0),10(A3)‰LITERAL�STATUS�TO�PRINT�BUFFER"‰LEA‡DMOUTA+22(PC),A3ˆA(OUTPUT�PC)‰LEA‡20(A4),A2‹BINARY�PC‰BSR‡MOVET�CONVERT�PC�TO�ASCII+‰LEA‡DMOUTA+32(PC),A3ˆSPACE�PAST�NOTE�LEVEL/‰LEA‡BUFPC(A1),A2ˆCONVERSION�ADDR�IS�CURRENT�PC‰BSR‡MOVET�PC�NOW�TO�BUFFER‰BSR‡MOVE2�SR�TO�BUFFER‰BSR‡MOVET�EXMON�MASK�TO�BUFFER#‰BSR‡MOVET�TCB�HEX�STATUS�TO�BUFFER‰BSR‡MOVE2�OPTIONS�TO�BUFFER6‰MOVE.L„TVTERM(A4),(A3)…COPY�CRT�TERMINAL�ID�TO�BUFFER‰BSR‡MSG30�REPORT�STATUS‰BRA‡DIS.006�CONTINUE -STATISƒMOVE.L„A4,A0�TASK�VECTOR�IS�PARM�BLOCK*‰MOVE.L„#RSTATE,D0ŠREAD�CURRENT�TASK�STATE‰TRAP†#1‰BNE‡ER1‘FATAL�ERROR%‰MOVE.L„TVBUF(A4),A1ˆTASK�BUFFER�ADDR‰RTS*5*ˆFIND�TASKNAME�IN�INPUT�BUF�&�LOCATE�IN�TASK�VECTORS*6GETNAME‚MOVE.L„FORTASK-B(A6),A4ŠASSUME�FOREGROUND�TASK!‰BSR‡PARSVERB‚TASKNAME�SPECIFIED?3‰BEQ.S…GETFOREƒNO�-�USE�FOREGROUND�DEFAULT�TASKNAME+‰MOVE.L„D0,A2…YES�-�MOVE�LITERAL�NAME�TO�A2,‰MOVE.L„SESSION-B(A6),A3�STANDARD�SESSION�ID*‰BSR‡FINDTASK‚MATCH�NAME�WITH�TASK�VECTORS$‰BRA.S…GETRTS„FOUND�NAME�(A4�IS�SET)(‰CMP.L…#'ALL�',D0„COMMAND�FOR�ALL�TASKS?‰BNE.S…GETWHO„NO�-�SYNTAX�ERROR5‰MOVE.L„SEGADDR-B(A6),A4ŠSTART�WITH�FIRST�TASK�VECTOR5‰MOVE.W„MAXTCNT-B(A6),D3ŠWILL�HAVE�TO�CHECK�ALL�SLOTS0GETRTSƒRTS‘A5�NOW�POINTS�PAST�TASKNAME�DELIMITER(GETWHOƒBSR‡MSG26…REPORT�UNKNOWN�TASKNAME&‰ADD.L…#4,A7…POP�RETURN�ADDR�OFF�STACK‰BRA‡WHAT†EXIT�-�SYNTAX�ERROR?GETFORE‚MOVE.L„(A4),VFLD-B(A6)…NULL�TASKNAME�BECOMES�FOREGROUND‰BRA‡GETRTSŽNORMAL�EXIT PAGE**ˆDETACH�AND�EXIT*#DETACHT‚BSR‡CLRBPˆCLEAR�ANY�BPS�SET#‰MOVE.W„BUFSR(A1),D0„GET�STATUS�REG"‰BCLR†#15,D0†CLEAR�TRACE�BIT�IF�ON‰MOVE.W„D0,BUFSR(A1)ƒRESTORE�SR‰CLR.L…BUFMASK(A1)ƒCLEAR�MASK‰CLR.W…BUFDO(A1)„CLEAR�OPTIONS'‰MOVE.L„#PSTATE,D0„SET�UP�FOR�PUT�STATE*‰MOVE.L„A4,A0…USE�TASK�VECTOR�AS�PARMBLOCK‰TRAP†#1#‰BNE‡ER1�PUT�STATE�DIRECTIVE�FAILED‰MOVE.L„#DEMON,D0*‰TRAP†#1‹A0�POINTS�TO�TASK�VECTOR�AS�ABOVEH*----------------------------ASR ROUTINE GETS DETACH EVENT AT THIS POINT6‰BEQ.S…QUITTING…TASK�STILL�RUNNING�UNATTACHED�TO�EXMON-‰CMP.W…#1,D0‹IDENTIFY�FAILURE�ERROR�OF�DETACH‰BEQ‡FATAL03‹BAD�PARM�BLOCK‰BRA‡FATAL02‹BAD�TASKNAME*%*ˆQUITƒ(TERMINATE�TARGET�TASKS�FIRST)*GQUIT…MOVE.W„MAXTCNT-B(A6),D1�*�NUMBER�OF�TASK�THAT�MY�BE�ACTIVE�(0�RE�) ‰SUB.W…#1,D1(‰MOVE.L„SEGADDR-B(A6),A4‰*�GET�TASK�LIST0QUIT.01‚BSR.S…QUITTER…TERMINATE�THIS�TARGET�TASK2‰ADD.W…#LTSKVECT,A4ƒ*�ADVANCE�TO�NEXT�TASK�1/25/82‰DBRA†D1,QUIT.01‰BRA‡DONE�*�TERM�EXMON (QUITTER‚TST.L…(A4)†*�ANY�TASKNAME�HERE�?‰BEQ.S…QUITTING‚*�NO*‰MOVE.L„#TERMT,D0ƒ*�TERMINATE�DIRECTIVE�ID*‰MOVE.L„A4,A0‡COPY�PARAMETER�BLOCK�ADDRESS‰TRAP†#1"QUITTING�CLR.L…(A4)ˆCLEAR�TASKNAME ‰CLR.L…TVSESS(A4)‚SESSION�NUMBER‰RTS‘TERMINATED�ONE�TARGET�TASK‰PAGE**…DISPLAY�REGISTERS*3DISPLYƒMOVE.L„A1,A2…REGISTER�FROM�ADDRESS�FOR�MOVER‰LEA‡D0D7(PC),A5ˆPREFIX�ADDR2DISPREGS�BSR‡CLEAN…BLANK�OUTBUF�&�SET�A3=A(OUTBUF))‰MOVE.L„(A5)+,(A3)+„COPY�PREFIX�TO�OUTBUF‰MOVE.L„(A5)+,(A3)+‰BSR‡MOVERŠCONVERT�FIRST�4�REGS=‰MOVE.B„SPACES-B(A6),(A3)+ƒEXTRA�SPACE�BETWEEN�D3&D4�OR�A3&A4‰BSR‡MOVERŠCONVERT�NEXT�4�REGS‰BSR‡MSG05…PRINT�REGS-‰CMP.B…#'A',OUTBUF-B(A6)‚FINISHED�A0-A7�REGS?‰BNE.S…DISPREGS‡NO�-�GO�DO�THEM$‰BSR‡CLEANŠYES�-�NOW�CONVERT�PC�&�SR‰MOVE.L„: SRPREFIX-B(A6),12(A3)‰MOVE.L„PCPREFIX-B(A6),(A3)+ ‰BSR‡MOVEPC‰BSR‡MOVE2ŠMOVE�SR ‰BSR‡MSG05PROM.09‚BRA‡PROMPT‡RETURN**…DISPLAY�ONE�VALUE**ONEDISƒLEA‡OUTSTAT(PC),A3ŠA(OUTPUT�BUFFER))‰MOVE.L„SPACES-B(A6),4(A3)ˆBLANK�2ND�HALF6‰LEA‡MOVE2(PC),A5ˆANTICIPATE�2�BYTE�CONVERSION‚1/25/82-‰CMP.W…STATBL+$44-B(A6),D2„SEE�IF�2�BYTE�TYPE‰BEQ.S…ONEDIS1†BRANCH�IF�2�BYTE‰CMP.W…STATBL+$50-B(A6),D2‰BEQ.S…ONEDIS1.‰LEA‡MOVET(PC),A5ˆDO�4�BYTE�CONVERSIONŠ1/25/822ONEDIS1‚JSR‡(A5)†CONVERT�TO�ASCII�&�PUT�IN�OUTSTAT‰BSR‡MSG04‡PRINT�MESSAGE‰BRA‡PROM.09…SEE�IF�ANY�MORE‰PAGE‰LISTE* ROUTINE: GETRRID - TO FIND HIGHEST RELOCATION REGISTER THAT IS JUST*ŠLESS�THAN�GIVEN�ADDRESS#* IN : D0 = ADDRESS TO BE CONVERTED*†A3�=�OUTPUT�BUFFER�ADDRESS.*�OUT:†PRINTS�ADDRESS�W.R.T.�A�RELOCATION�REG.*GETRRID‚MOVEM.LƒD1-D3/A2,-(A7)&‰CLR.L…D1ˆ*�TO�SAVE�RELOCATION�ADDRESS‰CLR.L…D2ˆ*�LOOPING�COUNTER‰CLR.L…D3ˆ*�REL.�REG.�ID-‰TST.W…BUFRRCNT(A1)ˆ*�ANY�REL.�REG.�DEFINED�?‰BEQ.S…ID.040„*�NO*‰LEA‡BUFRRTBL(A1),A2…*�WHERE�REL.�REGS�ARE5ID.010ƒCMP.L…(A2),D0ƒ*�GIVEN�ADDRESS�<�RELO�ADDRESS�?(‰BLT.S…ID.020„*�YES�-�THEN�SKIP�THIS�ONE8‰CMP.L…(A2),D1ƒ*�IS�IT�BETTER�THAN�WHAT�I�HAVE�ALREADY�?'‰BGE.S…ID.020„*�NO�-�THEN�SKIP�THIS�ONE)‰MOVE.L„(A2),D1ƒ*�THEN�UPDATE�BEST�SO�FAR-‰MOVE.L„D2,D3…*�SAVE�REL.�REG�ID�(�ZERO�REL�))ID.020ƒTST.L…(A2)+…*�TRY�NEXT�IN�RR�TABLE!‰ADD.L…#1,D2…*�ONE�MORE�LOOKED�AT)‰CMP.W…#RRCOUNT,D2‰*�LOOK�FOR�END�1/25/82 ‰BLT‡ID.010‰TST.L…D1ˆ*�ANYTHING�FOUND‰BNE.S…ID.050„*�YES'ID.040ƒBSR‡MOVED0„CONVERT�ABSOLUTE�ADDR ‰BRA.S…ID.060$ID.050ƒSUB.L…D1,D0…OFFSET�FROM�R�REG ‰BSR‡MOVED0,‰ADD.L…#$30,D3ƒ*�CONVERT�RR�ID�INTO�ASCII�ID‰MOVE.W„#'+R',-4(A3)‰APPEND�REG‰MOVE.B„D3,-2(A3)�*�SAVE�RR�IDID.060ƒMOVEM.Lƒ(A7)+,D1-D3/A2‰RTSG* ROUTINE: GETRRAD - FIND RELOCATION REGISTER ADDRESS GIVEN REL. REG.ID* IN : D0 = REL. REG. ID* OUT: D0 = REL REG.ADDRESS*6GETRRAD‚CMP.W…#RRCOUNT,D0„EDIT�REGISTER�NUMBER�1/25/82%‰BHS.S…RRBAD…INVALID�REG�(0->7)�LEGAL*‰LEA‡BUFRRTBL(A1),A2…*�GET�TABLE�BEGINNING(‰LSL.L…#2,D0…*�COMPUTE�OFFSET�FROM�REG�#‰MOVE.L„(A2,D0),D0ŠGET�ADDRESS‰RTS+RRBAD„ADD.L…#4,A7ŠPOP�RETURN�ADDR�OFF�STACK‰BRA‡WHAT‹SYNTAX�ERROR PAGE**ˆPRIMITIVE�COMMANDS*BRK†BSR‡PARSV�GET�ADDRESS2‰BNE.S…BRKNEWŽIF�ADDRESS�GIVEN�THEN�IN�INSERT�MODE2‰MOVE.W„BUFBPCNT(A1),D4…HERE�IF�BREAKPOINT�DISPLAY%‰BEQ.S…PROM.05�NO�BREAKPOINTS�DEFINED(‰LEA‡BUFBPTBL(A1),A2„ADDRESS�OF�BP�TABLE6BRKDISP‚BSR‡CLEAN‡BLANKS�TO�OUTPUT�LINE�(A3=A(OUTBUF)))‰MOVE.L„#5,D3‡LIMIT�5�BPS�OUTPUT�PER�LINE.BRKDNXT‚MOVE.L„(A2)+,D0„GET�BREAKPOINT�ADDRESS-‰BSR‡GETRRID…GET�REL�REG.�ID�AND�OFFSET�IN�D0‰SUB.W…#1,D4‡DID�ONE(‰BEQ.S…BRKSHOW…BRANCH�IF�DONE-PRINT�LINE‰SUB.L…#1,D3‡COUNT�IT$‰BNE‡BRKDNXT…BRANCH�IF�ROOM�FOR�MORE#BRKSHOW‚BSR‡MSG05‡PRINT�BREAKPOINTS‰TST.W…D4ŠSEE�IF�MORE�TO�DO!‰BNE‡BRKDISP…BRANCH�IF�MORE�TO�DOPROM.05‚BRA‡PROMPT†DONE +BRKADDR‚TST.B…TVEXEC(A4)‚TASK�IN�EXECUTION?0‰BEQ.S…GETADDR…NO�-�ALLOWED�TO�ALTER�BREAKPOINTS@REJEXEC‚BSR‡MSG27‡YES�-�BREAKPOINTS�INSTALLED�AND�LOCKED�MESSAGE‰LEA‡PROMPT(PC),A0Ÿ1/25/82(‰MOVE.L„A0,(A7)…RETURN�TO�PROMPT–1/25/82‰RTSGETADDR‚CLR.L…D5ŠRESET&‰CMP.B…#'+',-1(A5)�REL�REG�SPECIFIED�?1‰BNE.S…GETABS†NO�-�THEN�GIVEN�ADDRESS�IS�ABSOLUTE‰MOVE.L„D0,D5‡SAVE�REL.�ADDRESS*‰ADD.L…#1,A5‡STEP�OVER�'R'�IN�INPUT�BUFFER‰BSR‡PARSV‡GET�REGISTER�NUMBER0‰BEQ‡WHATˆREGISTER�NUMBER�OMITTED�-�SYNTAX�ERROR8‰BSR‡GETRRAD…GET�APPROPRIATE�RELOCATION�REGISTER�ADDRESS%‰ADD.L…D5,D0‡COMPUTE�ABSOLUTE�ADDRESS.GETABSƒLEA‡BUFBPTBL(A1),A2…ADDRESS�OF�BR�TABLE%‰MOVE.W„BUFBPCNT(A1),D5…GET�#�OF�BR'S‰RTS›D0�=�EFFECTIVE�ADDRESS 6BRKNEWƒBSR‡BRKADDR…GET�EFFECTIVE�ADDRESS�OF�BREAKPOINT.‰BEQ.S…BRKSLOT…NO�PREVIOUS�BREAKPOINTS�DEFINED'‰CMP.W…#BPMAX,D5ƒFULL�BREAKPOINT�TABLE?,‰BLT.S…BRKFIND…NO�-�SEE�IF�IT�ALREADY�EXISTS0‰BSR‡MSG16‡YES�-�PRINT�BREAKPOINT�TABLE�FULL�MSG ‰BRA‡PROM.05+BRKFIND‚CMP.L…(A2)+,D0ƒSEE�IF�ALREADY�THERE,‰BEQ.S…BRNEWNXTƒYES�-�SKIP�IF�ALREADY�EXISTS‰SUB.W…#1,D5…DECREMENT�COUNTER‰BNE.S…B; RKFINDƒCONTINUE�SEARCH.BRKSLOT‚MOVE.L„D0,(A2)ƒNEW�BREAKPOINT�TO�TABLE‰ADD.W…#1,BUFBPCNT(A1)„COUNT�IT.‰MOVE.L„D0,BRKPBUF-B(A6)‹SEE�IF�ADDRESS�EXISTS2‰LEA‡BUFBPSAV-BUFBPTBL(A2),A3ƒA(BREAKPOINT�SOURCE)$‰MOVE.L„A3,BRKGET-B(A6)…A(OF�SOURCE)(‰MOVE.L„#2,BRKGET+4-B(A6)ƒLENGTH�OF�MOVE‰MOVE.L„#MOVELL,D0&‰LEA‡BRKPBG(PC),A0‹A(MOVELL�PARMBLOCK)‰MOVE.L„(A4),(A0)ˆCOPY�TASKNAME!‰TRAP�#1—FETCH�SOURCE�FROM�TARGET#‰BEQ.S…BRNEWNXT‚GOOD�NEW�BREAKPOINT!‰CLR.L…(A2)�REMOVE�BAD�BREAKPOINT!‰SUB.W…#1,BUFBPCNT(A1)…UNCOUNT�IT!‰BSR‡MSG18�REPORT�BAD�TARGET�ADDR.‰BRA.S…PROM.06�SKIP�ANY�REMAINING�BRKPTS�INPUT&BRNEWNXT�BSR‡PARSV�LOOK�FOR�MORE�INPUT‰BNE‡BRKNEWŽHAVE�MORE�GO�DO�IT(‰BRA.S…PROM.06�PROCESSED�ALL�BREAKPOINTS BRKCLRƒCLR.L…D5ˆFIRST�TIME�FLAG BCLRNXT‚BSR‡PARSV…GO�GET�A�VALUE'‰BNE.S…CLRONE„BRANCH�IF�WE�HAVE�A�VALUE‰TST.L…D5ˆFIRST�PARSE?"‰BNE.S…PROM.06ƒNO�-�WE'RE�ALL�DONE‰TST.B…TVEXEC(A4)„IN�EXECUTION?#‰BNE‡REJEXECƒYES�-�CAN'T�DELETE�NOW+‰BSR.S…CLRBP…NO‚(PARMLESS�NOBR�=�CLEAR�ALL)%PROM.06‚BRA‡PROMPT„RETURN-ALL�CLEARED DCLRBP„MOVE.W„BUFBPCNT(A1),D1…breakpoints�must�be�clear�at�this�point#‰BEQ.S…CLRBP4„EQUAL�MEANS�NO�BP�SET&‰LEA‡BUFBPTBL(A1),A3ƒA3�GOES�TO�BRKBUF5CLRBP2ƒLEA‡BUFBPSAV-BUFBPTBL(A3),A2†A2�GOES�TO�BRKSOR0‰BSR‡CLRALL„DO�MOVELL�TO�RETURN�SOURCE�TO�TARGET$‰CLR.L…(A2)†ERASE�BREAKPOINT�ADDRESS‰CLR.L…(A3)†ERASE�SOURCE�ENTRY*‰ADD.L…#4,A3…STEP�TO�NEXT�BREAKPOINT�ENTRY$‰SUB.W…#1,D1…REDUCE�BREAKPOINT�COUNT&‰BNE.S…CLRBP2„LOOP�UNTIL�ALL�ARE�CLEAR‰CLR.W…BUFBPCNT(A1)ƒCLEAR�COUNTCLRBP4ƒRTS–RETURN :CLRONEƒBSR‡BRKADDRƒGET�ADDRESS�OF�BREAKPOINT�TO�BE�CLEARED‰BEQ‡PROM.06ƒBRANCH�IF�NONE�SET2BRKLOOK‚CMP.L…(A2)+,D0‚FIND�IT�IN�BREAKPOINT�TABLE‰BEQ.S…BRKSAMEƒFOUND�IT‰SUB.W…#1,D5…DECREMENT�COUNTER‰BNE.S…BRKLOOKƒLOOK�SOME�MORE‰BRA‡WHAT†DIDN'T�FIND�IT!BRKSAME‚SUB.L…#4,A2…RESET�POINTER<‰MOVE.W„BUFBPCNT(A1),D5ƒGET�COUNT�OF�ACTIVE�BRKPTS�THIS�TASK ‰SUB.W…#1,D5&‰ASL.W…#2,D5ˆOFFSET�OF�LAST�BRKPT�ADDR‰LEA‡BUFBPTBL(A1),A3‰ADD.W…D5,A3ˆA(LAST�BRKPT�ADDR)>‰MOVE.L„(A3),(A2)„MOVE�IT�TO�OVERLAY�THE�BRKPT�WE�ARE�CLEARING%‰CLR.L…(A3)‰CLEAR�OLD�LAST�BRKPT�ADDR!‰SUB.W…#1,BUFBPCNT(A1)„UNCOUNT�IT=‰LEA‡BUFBPSAV-BUFBPTBL(A2),A2„A(CORRESPONDING�ENTRY�IN�BPSAV)5‰LEA‡BUFBPSAV-BUFBPTBL(A3),A3„A(OLD�LAST�SOURCE�SLOT)6‰MOVE.L„(A3),(A2)†MOVE�TO�SOURCE�SLOT�OF�BRKPT�CLEARED&‰CLR.L…(A3)‹CLEAR�OLD�LAST�SOURCE�SLOT-‰BRA‡BCLRNXTˆCONTINUE�PARSING�PARMS�UNTIL�EOLI*========================================================================;DMEM…MOVE.L„A7,STACKBRK-B(A6)ƒSAVE�STACK�POINTER�FOR�BREAKS(‰BSET†#SETBRK,BREAK-B(A6)�TAKE�IO�BREAKS‰BSR‡PARSV�GET�LOCATION‰BEQ‡WHAT�MD�REQUIRES�AN�ADDR)‰BSR‡GETADDR�ADJUST�ADDR�IF�REG�SPECIFIED(‰MOVE.L„D0,BRKPBUF-B(A6)„DISPLAY�ADDRESS ‰AND.L…#1,D0�ODD�ADDR�CORRECTION‰LEA‡OUTBUF(PC),A0Ÿ1/25/82#‰ADD.L…A0,D0�RECEIVING�ADDR�1/25/82#‰MOVE.L„D0,BRKGET-B(A6)„A(DMBUFFER)‰BSR‡PARSV�GET�LENGTH‰BNE.S…DMLTH�BRANCH�IF�A�VALUE#‰MOVE.L„#$10,D0�DEFAULT�LENGTH�=�16/DMLTH„ADD.L…#15,D0ŽROUND�UP�TO�16�BYTE�MULTIPLE%‰ASR.L…#4,D0�NUMBER�OF�16�BYTE�BLOCKS‰MOVE.L„D0,D6�BLOCK�LOOP�COUNT+‰MOVE.L„#16,BRKGET+4-B(A6)‚MOVE�LENGTH�PARMDMFETCH‚MOVE.L„#MOVELL,D0&‰LEA‡BRKPBG(PC),A0‹A(MOVELL�PARMBLOCK)‰MOVE.L„(A4),(A0)‹COPY�TASKNAME‰TRAP†#1‰BNE‡ERLL�ERROR�HANDLER+‰MOVE.L„BRKPBUF-B(A6),D0ŠSAVE�START�ADDRESS$‰LEA‡DMOUTA(PC),A3‹BUFFER�TO�ADDRESS9‰MOVE.L„SPACES-B(A6),8(A3)ˆBLANK�PRIOR�REG�RELATED�OFFSET(‰BSR‡GETRRIDƒ*�GET�REL.REG.ID�AND�OFFSET)‰LEA‡DMOUTA+60(PC),A0ˆA(ASCII�TEXT�FIELD).‰MOVE.W„SPACES-B(A6),(A0)+ˆSPACES�BEFORE�ASCII.‰MOVE.L„BRKGET-B(A6),A2‹SOURCE�TO�BE�CONVERTED‰MOVE.W„#15,D4ˆCONVERT�16�BYTES!DMBYTEƒMOVE.B„(A2)+,D0†GET�A�BYTE‰CMP.B…#$20,D0‰BLT.S…DMDOT‰BRANCH�IF�$00-$1F‰CMP.B…#$7E,D0‰BGT.S…DMDOT‰BRANCH�IF�$7F-$FF ‰MOVE.B„D0,(A0)+†AS-IS�TO�OUTPUT‰BRA.S…DMHEX‰GO�DO�HEX(DMDOT„MOVE.B„#'.',(A0)+„UNPRINTABLE�BYTE"DMHEX„BSR‡CONVŠBYTE�TO�ASCII--HHLL‰CMP.W…#7,D4‰AT�MIDDLE�OF�HEX?‰BNE.S…DMMID‰BRANCH�IF�NO&‰MOVE.B„SPACES-B(A6),(A3)+‚EXTRA�SPACEDMMID„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…LOOP�TO�CONVERT�16�BYTES‰BSR‡PRORTY‡PRINT�OR�TYPE&‰CMP.W…#11,LINCNT-B(A6)„CLOSE�TO�EDGE?‰BGE.S…DMNOPAG‡BRANCH�IF�NOT‰BSR‡PAGEŠGO�TO�TOP5DMNOPAG‚ADD.L…#16,BRKPBUF-B(A6)†NEXT�ADDRESS�TO�PRINT‰SUB.L…#1,D6‰MORE�BLOCKS�TO�DO?‰BNE‡DMFETCH‡BRANCH�IF�YES%‰BSR‡PRNTBLNKŒA�BLANK�LINE�TO�PRINTER‰BSR‡PRNTBLNKŒAND�ANOTHER&‰CMP.W�#15,LINCNT-B(A6)ˆCLOSE�TO�EDGE?‰BGT.S…PROM.07�BRANCH�IF�NOT ‰BSR‡PAGE�TOP�OF�FORM�TO�PRINTER+PROM.07‚BRA‡PROMPTŽBACK�FOR�ANOTHER�COMMANDG*======================================================================SMEM…BSR‡PARSVƒGET�REL.REG.ID‰BEQ‡WHAT„SM�REQUIRES�ARGUMENTS ‰BSR‡GETADDR"‰MOVE.L„D0,BRKBUF-B(A6)„TO�ADDRESS!‰AND.L…#1,D0�CHECK�IF�ODD�ADDRESS‰LEA‡OUTBUF(PC),A2Ÿ1/25/82'‰ADD.L…D0,A2�ADJUST�FOR�ODDNESSŒ1/25/82,‰MOVE.L„A2,BRKSOR-B(A6)„FROM�ADDRESS“1/25/82‰CLR.L…D2„BYTE�COUNTERSMGET„BSR‡PARSV„GET�A�VALUE‰BNE.S…SMLTH„BRANCH�IF�A�LENGTH%‰TST.L…D2’SEE�IF�WE�EVER�HAD�A�LENGTH"‰BEQ.S…WHAT.05�BRANCH�IF�NO�LENGTH$‰MOVE.L„D2,BRKBUF+4-B(A6)ƒBYTE�COUNT‰MOVE.L„#MOVELL,D0‰LEA‡BRKPBP(PC),A0!‰MOVE.L„(A4),12(A0)‰COPY�TASKNAME‰TRAP†#1‰BNE‡ERLL‡MOVELL�ERROR‰BRA.S…PROM.08„RETURN*SMLTH„MOVE.B„D0,(A2)+„SAVE�VALUE�IN�BUFFER‰ADD.L…#1,D2ƒCOUNT�IT‰BRA.S…SMGETƒGET�ANOTHER�VALUEI*========================================================================!RELREGƒBSR‡PARSV…*�LOOK�FOR�VALUE9‰BNE.S…RRNEW…*�LENGTH�SPECIFIED�-�THEN�MUST�BE�DEFINITION*‰TST.W…BUFRRCNT(A1)ˆ*�CHECK�IF�ANY�DEFINED!‰BEQ.S…PROM.08ƒ*�NONE�-�THEN�EXIT*‰LEAˆBUFRRTBL(A1),A2ˆ*�WHERE�RR�VALUES�ARE)‰MOVE.B„#'0',D2ƒ*�RELO.�REGISTER�IN�ASCII‰MOVE.L„#RRCOUNT,D4(RRLINEƒBSR‡CLEAN…*�CLEANUP�OUTPUT�BUFFER ‰MOVE.L„#4,D3…*�DISPLAY�5�/�LINE+RRDISPƒTST.L…(A2)+…*�SEE�IF�THIS�IS�DEFINED‰BEQ.S…RRNEXT„*�NO6‰TST.L…-(A2)…*�YES�-�BACK�OFF�AND�CONVERT�THAT�ADDRESS&‰MOVE.L„#1,D5…*�CONVERT�1�RR�AT�A�TIME+‰MOVE.B„#'R',(A3)+‚'R'�PREFIX�TO�REG�NUMBER‰MOVE.B„D2,(A3)+‚*�COPY�RR�ID‰MOVE.W„#'=�',(A3)+‰BSR‡MOVES…*�CONVERT�AND�COPY#‰SUB.L…#1,D3…ONE�DONE�FOR�THIS�LINE&RRNEXTƒADD.B…#1,D2…*�NEXT�HIGHER�ASCII‰SUB.L…#1,D4…*�ONE�MORE�DONE‰BLE.S…RRSHOW„*�YES‰TST.L…D3ˆLINE�OF�5�COMPLETE?)‰BGT‡RRDISP„*�IF�NOT�GO�BACK�GET�NEXT�ONERRSHOWƒBSR‡MSG05ˆDISPLAY�RR‰TST.L…D4ˆ*�IS�ALL�DONE�?‰BGT‡RRLINE„*�NO�-�THEN�GO�BACK(PROM.08‚BRA‡PROMPT„*�IF�ALL�DONE�GET�OUTWHAT.05‚BRA‡WHAT &RRNEW„MOVE.L„D0,D5…*�SAVE�REL.�REG.�ID/‰CMP.W…#RRCOUNT,D5‡*�LOOK�FOR�TOP�LIMITŒ1/25/82‰BHS‡WHAT.05ƒ*�REPORT�ERROR‰BSR‡PARSV…GET�OFFSET�VALUE%‰BEQ‡WHAT.05ƒ*�NO�-�THEN�REPORT�ERROR‰TST.L…D0ˆDELETING�A�REGISTER?'‰BEQ.S…RRDEL…YES�-�SKIP�SEARCH�&�MOVELL/‰LEA‡BUFRRTBL(A1),A2…*�WHERE�REL.�ADDRESSES�ARE"‰MOVE.L„#RRCOUNT-1,D4‡*�MAX.�COUNT.RRFINDƒCMP.L…(A2)+,D0‚*�SEE�IF�ALREADY�DEFINED%‰BEQ‡PROM.08ƒ*�YES�-�THEN�IGNORE�THIS‰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)†*�SOURCE�LOGICAL�ADDRESS‰LEA‡UTLWORD(PC),A0ž1/25/826‰MOVE.L„A0,BRKGET-B(A6)‡*�MOVE�IN�UTILITY�WORD†1/25/82'‰MOVE.L„#2,BRKGET+4-B(A6)†MOVELL�LENGTH‰MOVE.L„#MOVELL,D0‰LEA‡BRKPBG(PC),A0Ÿ1/25/82‰MOVE.L„(A4),(A0)ˆCOPY�TASKNAME‰TRAP†#1‰BNE‡WHAT.05ƒ*�REPORT�ERROR9‰MOVE.L„BRKPBUF-B(A6),D0Š*�RESTORE�D0�-�IF�ADDRESS�EXISTS ,RRDEL„LEA‡BUFRRTBL(A1),A2…*�RR�TABLE�ADDRESS(‰LSL.L…#2,D5…*�COMPUTE�OFFSET�INTO�TABLE0‰ADD.L…D5,A2…*�GET�ADDRESS�OF�SPECIFIED�RR�ENTRY"‰TST.L…(A2)†*�SEE�IF�IT�IS�DEFINED.‰BNE.S…RRPUT…*�YES�-�THEN�MUST�BE�REDEFINITION1‰ADD.W…#1,BUFRRCNT(A1)…*�SINCE�NEW�-�UPDATE�COUNT'RRPUT„MOVE.L„D0,(A2)ƒ*�SAVE�NEW�ADDRESS"‰BNE‡PROM.08ƒ*�DONE�NOT�A�DELETION3‰SUB.W…#1,BUFRRCNT(A1)‚REDUCE�COUNT�FOR�DELETED�REG ‰BRA‡PROM.08 PAGE**ˆASSIGN�PRINTER*&AP‡LEA‡PRINTFHS(PC),A0‰PARAMETER�BLOCK$‰MOVE.W„#FHASGN,(A0)ˆASSIGN�LUN#1�EW‰TRAP†#3‰BNE.S…APERR�BRANCH�IF�GOOD)‰MOVE.W„#66,LINCNT-B(A6)…R< ESET�LINES�LEFT APRTS„RTS**ˆDEASSIGN�PRINTER*DP‡BSR.S…PAGE�LEAVE�PAGE�AT�TOP$‰LEA‡PRINTFHS(PC),A0‰PARAMETER�BLOCK"‰MOVE.W„#FHCLOS,(A0)ˆCLOSE�PRINTER‰TRAP†#3‰BEQ‡APRTS�BRANCH�IF�GOOD(‰LEA‡ERMES11(PC),A5ŠCAN'T�DETACH�PRINTER1‰MOVE.W„#'DE',(A5)ŠALTER�ERROR�MSG�FOR�DETACH�ERRAPERR„BSR‡MSG216‰MOVE.W„#'AT',(A5)Š"HARMLESS"�GARBAGE�AFTER�ATTACH�ERR‰BRA‡APRTS�RETURN**ˆPRINT�OR�TYPE�DM*0PRORTYƒCMP.B…#'N',ECHOOPT-B(A6)ƒARE�WE�PRINTING?‰BNE.S…PRORTY1ŽBRANCH�IF�YES;NOWTYPE‚CMP.L…4(A7),D1ƒSPACES?‚REENTRY�POINT�TO�ECHO�ON�CRT‰BEQ.S…PSPACESƒYES‰BSR‡MSG30†TYPE�WITHOUT�ECHO ‰RTS’GO�BACKPSPACES‚BSR‡MSG31‰RTS-PRORTY1‚MOVE.B„#PRLUN,IOUT+5-B(A6)†SWITCH�LUN‰CMP.L…4(A7),D1ƒSPACES?‰BNE.S…PSPACELƒNO ‰BSR‡PSPACES‰BRA.S…PSPACEDƒYESPSPACEL‚BSR‡MSG30ŠPRINT�LINE0PSPACED‚MOVE.B„#LDFLUN,IOUT+5-B(A6)…UNSWITCH�LUN$‰SUB.W…#1,LINCNT-B(A6)‡ONE�LINE�GONE‰BNE.S…PRORTY2�0�MEANS�66‰MOVE.W„#66,LINCNT-B(A6)-PRORTY2‚BCLR†#GOTBRK,BREAK-B(A6)ƒGOT�A�BREAK?(‰BEQ‡NOWTYPE�BRANCH�IF�NO�TO�ECHO�TO�CRT-‰MOVE.L„STACKBRK-B(A6),A7‹YES--ABORT�PRINTING‰BRA‡PROMPT�GET�NEXT�COMMAND* *ˆTOP�OF�PAGE*.PAGE…CMP.B…#'N',ECHOOPT-B(A6)ƒARE�WE�PRINTING?‰BEQ.S…PAGEX�BRANCH�OUT�IF�NO‰BSR.S…PRNTBLNK�ONE�BLANK�LINE‰CMP.W…#66,LINCNT-B(A6)ˆAT�TOP?‰BNE.S…PAGE‘BRANCH�IF�NOT�YET PAGEX„RTS**ˆONE�BLANK�LINE*2PRNTBLNK�CMP.B…#'N',ECHOOPT-B(A6)‚ARE�WE�PRINTING?‰BEQ.S…PAGEX�BRANCH�OUT�IF�NO‰MOVEM.LƒD1/A3,-(A7)‰BSR‡PRORTYŒLINE�GOES�OUT‰MOVEM.Lƒ(A7)+,D1/A3‰RTS„PAGE**„MOVE�AND�CONVERT�HEX�TO�ASCII*…A2=FROM‚A3=TO‚D5=HOW�MANY*/MOVER„MOVE.L„#1,-(A7)‚PAD�LENGTH�BETWEEN�FIELDS‰MOVE.L„#4,D5…4�FIELDS ‰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…ONLY�1�FIELDMOVE…MOVE.W„(A2)+,D0 ‰BSR.S…CONV‰MOVE.L„D0,(A3)+*‰BRA.S…MOVE2NDƒDO�2ND�HALF�OF�4�BYTE�FIELD MOVE2„MOVE.L„#2,-(A7)‚PAD�LENGTH‰MOVE.L„#1,D5…ONE�FIELDMOVE2ND‚MOVE.W„(A2)+,D0 ‰BSR.S…CONV‰MOVE.L„D0,(A3)+‰ADD.L…(A7),A3ˆADD�PAD�FILLER ‰SUB.L…#1,D5 ‰BNE.S…MOVE‰ADD.L…#4,A7…POP�PAD�OFF�STACK‰RTS*%*„CONVERT�TO�ASCII‚INPUT�BITS�0-15�D0*„OUTPUT‚BITS�0-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)ŒCALLED�BY�MOVER?(‰BNE.S…CONVRTS�NO�-�RETURN�FOR�D0�MOVE.L.‰MOVE.L„#3,D1�LOOPCOUNT�-1�FOR�BYTE�MOVE�OF�D01ROTATED0�ROL.L…#8,D0�CIRCULAR�SHIFT�LEFTMOST�BYTE-‰MOVE.B„D0,(A3)+ŒTAKES�CARE�OF�ODD�A3�ADDRESS&‰DBRA†D1,ROTATED0‰DO�ALL�4�BYTES�OF�D00‰ADD.L…#2,(A7)�SKIP�CALLERS�MOVE.L�WHICH�FOLLOWS CONVRTS‚RTS*3*ˆSEND�A�MESSAGE�TO�THE�SYMBUG�CRT�TERMINAL�(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+1�REL�ADDRS ‰ADD.L…A6,D0+‰ADD.L…A6,D1‘CONVERT�REL�ADDRS�TO�ABS�ADDRS‰SUB.L…#1,D1‘ADJUST�END�ADDR8‰MOVEM.LƒD0-D1,IOUTSAD-B(A6)ƒIOSSAD�&�IOSEAD�TO�IOUT�IOB*1*ˆMESSAGE�SELECTED�:�PUT�OUTPUT�TO�DEBUG�TERMINAL*/DO7OUTR‚LEA‡IOUT(PC),A0†PARAMETER�BLOCK�ADDRESS3‰CMP.W…#8,D7…IMAGE�OUTPUT�ON�QUEST�MESSAGESŠ1/25/82‰BGT.S…PRINTITƒFORMATTED�MODE-‰OR.W†#IOPIMG,IOSOPT(A0)‚ALTER�OPTIONS�IN�IOB!PRINTIT‚CLR.L…D7ˆRESET�INDEX�TO�0‰TRAP†#2‡OUTPUT�THE�MESSAGE‰BEQ.S…DO7OUT1†BRANCH�IF�GOOD‰CMP.B…#ISTABRK,D0�BREAK?‰BNE.S< …DO7OUT2�BRANCH�IF�NO%‰BCLR†#SETBRK,BREAK-B(A6)‡TAKE�BREAK?‰BEQ.S…DO7OUT2�BRANCH�IF�NO/‰MOVE.L„STACKBRK-B(A6),A7�RESTORE�STACK�POINTERDO7OUTNL�BSR‡MSG31†PRINT�SPACES ‰BRA‡PROMPT2DO7OUT2‚BTST†#GOTBRK,BREAK-B(A6)…BREAK�BETWEEN�IO?‰BNE.S…DO7OUT1‘BRANCH�IF�YES+‰CMP.B…#PRLUN,IOUT+5-B(A6)…ARE�WE�PRINTING?)‰BEQ.S…DO7OUTR‘BRANCH�IF�YES�TO�TRY�AGAINŸ7§:‰BEQ.S…GETCHREF‚DELIMITER�EXIT&‰ADD.L…#1,FLDL-B(A6)…*�IF�NOT�COUNT�IT †RTS„.ƒRETURNGETCHRERƒADD.L‚#2,(A7)„RETURNGETCHREF‚ADD.L‚#2,(A7)„RETURN†RTS PAGE*+*ˆLOAD�A�TASK�AND�LEAVE�IT�IN�DORMANT�STATE*6*ˆON�ENTRY:‚A0=A(COMLINE�OR�INQ�TA= SK�NAME�TO�BE�LOADED*“D6=COMLINE�LENGTH*5LOADTASK�MOVEM.LƒD0-D7/A0-A6,-(A7)ƒSAVE�REGS�ON�STACK)‰LEA‡FHSTASK(PC),A6ŠFILLED�IN�BY�EDITFILE.‰BSR‡EDITFILEŒEDIT�VERSADOS�FILE�NAME�INTO�FHS‰BMI.S…LD.ERRŽBAD�FILENAME‰LEA‡B(PC),A6�RESTORE�BASEREG‰CMP.B…#$0D,D1�COMLINE�PRESENT?‰BEQ.S…LD.009ŽNO(LD.005ƒCMP.B…#'�',(A0)+ŠSCAN�PAST�BLANKS ‰BEQ‡LD.005‰SUB.L…#1,A0�ADJUST�TO�NONBLANKLD.009ƒMOVE.L„A0,D3�WORK�REG0‰SUB.L…32(A7),D3‹BYTES�USED�OLD�COMLINE�(OLD�A0)%‰SUB.L…D3,D6�REMAINING�COMLINE�LENGTH)‰MOVE.L„D6,DREG6-B(A6)ˆPASS�LENGTH�VIA�D6+‰MOVE.B„D6,LOADCLL-B(A6)†TO�LOAD�PARM�BLOCK‰MOVE.L„A0,D3�A(NEW�COMLINE)%‰BTST.L„#0,D3�COMLINE�AT�ODD�ADDRESS?‰BEQ.S…LD.012ŽNO‰ADD.L…D6,A0�A(END�OF�COMLINE)‰BRA.S…LD.013ŽADJUST�LOOP�COUNT:LD.011ƒMOVE.B„-(A0),1(A0)‰SHIFT�COMLINE�AHEAD�TO�EVEN�ADDRLD.013ƒDBRA†D6,LD.011‰ADD.L…#1,A0�A(NEW�COMLINE)3LD.012ƒMOVE.L„A0,LOADCLA-B(A6)†TO�LOADER�PARM�BLOCK/‰MOVE.W„#$A000,STARTTSK+8-B(A6)‰START�WITH�REGS'‰MOVEM.Lƒ(A7)+,D0-D7/A0-A6ƒRESTORE�REGS‰LEA‡TASKLDR(PC),A0‰MOVE.L„#1,D0�LOADER�OPTION‰TRAP†#4’LOAD�TARGET�TASK‰BEQ.S…LD.015ŽSUCCESSFUL�-�EXIT!‰CMP.W…#6,D0�TASK�ALREADY�LOADED?%‰BNE‡LD.024ŽNO�-�REPORT�TRAP�#4�ERROR1MAKEDORM�MOVE.L„(A0),STOPTASK-B(A6)ƒCOPY�TASKNAME‰MOVE.L„#STOP,D0ŒSTOP�DIRECTIVE$‰LEA‡STOPTASK(PC),A0‰STOP�PARM�BLOCK!‰TRAP†#1’STOP�TASK�ALREADY�LOADED"‰BEQ.S…REGLESS�TASK�IS�NOW�DORMANT‰CMP.W…#6,D0�TASK�NOT�RUNNING‰BNE‡LD.021ŽREPORT�TRAP#1�ERROR9REGLESS‚MOVE.W„#$8000,STARTTSK+8-B(A6)‰START�WITHOUT�REGSLD.015ƒRTS›EXIT-LD.ERRƒMOVEM.Lƒ(A7)+,D0-D7/A0-A6ƒRESTORE�REGS‰BSR‡MSG22�REPORT�LOAD�ERROR‰BRA‡LD.015ŽAND�EXIT‰PAGE*2*ˆATTACH�TARGET�TASK�TO�EXMON�AND�START�(READY)�IT*/*ˆON�ENTRY‚A5=A(TERMINAL�ID�FOLLOWING�TASKNAME) =/* =/*†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 ƒ=ARG�DEL.LL=/ENDIF=/*=LINK ,DEL.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000 INPUT DEL.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé¸DEL…IDNT�4,0ˆDELETE�PIC�UTILITY „LLEN�120;*************************************************************#*‰PROGRAM�NAME�ISƒD�E�L�U�.�D�A�T�A****ˆ***‡DELETE�COMMANDƒ******3*ˆTHIS�COMMAND�IS�USED�TO�REMOVE�A�FILE�NAME�FROM�A1*ˆDISK�DIRECTORY�AND�TO�DEALLOCATE�ALL�SPACE�THAT2*ˆBELONGS�TO�THE�DELETED�FILE.‚A�SINGLE�FILE�NAME,1*ˆA�LIST�OF�FILE�NAMES,�OR�A�FAMILY�OF�FILE�NAMES2*ˆWITH�THE�SAME�NAME�PARAMETERS�AND�READ�AND�WRITE*ˆPASSWORDS�CAN�BE�DELETED.* *ˆREV�1.00!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*’D…*�*�*�*�*�*�**’A…*�*�*�*�*�*�***=*************************************************************=*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**‰PAGE***ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ**‰NOLIST‰INCLUDE�9995.&.FME.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.TR1.EQ‰LIST**‰PAGE****ˆDELETE�MODIFICATION�HISTORY****ˆREVISION�CODE‡070181�3* *’CONTAINS�ERROR�MESSAGE�HANDLER$*’CONTAINS�POSITION�INDEPENDENT�CODE-*’CONTAINS�CURRENT�REVISION�CODE�MODIFICATION5*’CONTAINS�TERMINATION�LOGIC�FOR�USE�WITH�CHAIN�FILES1*’CONTAINS�COMMON�SUBROUTINES�PULLED�FROM�LIBRARY*’USES�THE�'SBARG'�ROUTINE**‰PAGE***ˆREVISION�CODE‡090181�3*0*’CORRECTS�THE�FALL�THRU�AND�ATTEMPTED�EXECUTION*—OF�TERM_FLG�AS�AN�INSTRUCTION'*’USES�THE�CORRECTED�'SBARG'�SUBROUTINE3*’HAS�A�CHARACTER�FOLLOWING�THE�INPUT�DATA�SO�SBARG&*—WILL�HAVE�A�POSITION�TO�PLACE�A�'CR'*‰PAGE***ˆREVISION�CODE‡090281�3*8*’RE-LINKED�SO�THAT�ALL�SECTIONS�WILL�BE�IN�SEGMENT�ZERO*‰PAGE***ˆREVISION�CODE‡111281�3**’CORRECT�PROBLEM…DEL�FILE.EX,#9*’CORRECT�PROBLEM…DEL�> FILE.EX;Z‚WHERE�Z�IN�INVALID�OPTION9*’TERMINATE�TASK�PROPERLY�WHEN�AN�SBARG�ERROR�IS�RETURNED***‰PAGE"*ˆD�E�L�E�T�EƒCOMMANDƒDATA�SEGMENT*ˆ****‚EQUATE�AREA‚******* BEGDATA‚EQU�0#STKLENƒEQU�25‹STACK�LENGTH�IN�WORDS ÁcÊZÒXÚ[âRêZòXúXL TVK"W*R2=)BUFSIZE‚EQU�160‰INPUT�COMMAND�BUFFER�SIZE DSKLU„EQU�1!LISTLUƒEQU�3‹LISTING�LOGICAL�UNITTSKNAMƒEQU�'DELU'†MY�TASK�NAMEBN00…EQU‡0‰BIT�NBR�0 ‰SECTION�0!‰XREF�EDITFILE,PARSE,OPTION,SBARG**‰PAGE**ˆ****‚MACRO�AREA‚**********ˆNEXT�WORD�BOUNDRY�MACRO*2*******************************************************„DATA�SEGMENT�(DSEG)ƒ****1**************************************************** PBA†EQU�**œPROGRAM�BASE�ADDR*‰PAGE;**************************************************************ˆ***ƒDATA�AREA‚******:********************************************************** REV_CODE:‰DC.B†'122084�4'&*œWHERE�REV_CODE�IS�DEFINED�AS�FOLLOWS *œMMDDYYXZ*3*œMMDDYY�=�MONTH�DAY�YEAR�OF�LAST�ASSEMBLY�OR�PATCH*œX†=�REVISION�TYPE�CODE*¦SPACE�=�CLEAN�ASSEMBLY *¦P…=�PATCHED*¦C…=�CUSTOMIZED�PATCHED**#*œZ†=�VERSADOS�MAJOR�REVISION�FIELD* ‰DS.L�STKLEN PROGSTK‚EQU�**‰DC.L�08*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFIN�IS�THE�AREA�THE�COMMAND�LINE�IS.*ˆ***ƒREAD�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++**BUFFINƒCOMLINE�BUFSIZE‚***‚INPUT�BUFFER‚***+********************************************+*ˆ**‚IOS�PARAMETER�TABLE�FOR�DISK�READS‚***6*ˆ**‚REFER�TO�IOS�EQUATES�UNDER�IOS�PARAMETER�BLOCK‚***5*******************************************************3*****************************************************ŒIOS�PARAMETER�TABLE(*ˆSET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK*3****************************************************‰DS.W�04‰IOS.OUT6�IOWRIT,IOPASC+IOPFOR+IOPWAT,LDFLUN,0,0,0,05‰IOS.OUT6I�IOWRIT,IOPASC+IOPIMG+IOPWAT,LDFLUN,0,0,0,0‰PAGE:***********************************************************8*ˆFHS�PARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT5*ˆCHANGE�IS�FROM�6�TO�3�-�SEND�SOURCE�IS�LU�A�IN�MASK*ˆAND�RECEIVE�IS�LU�B�IN�MASK4*ˆLU3�IS�USED�F0R�LISTING�AND�LU6�FOR�ERR0R�/LOGGING*3*ˆPARAMETER�TABLE�FOR�CHANG�LOGICAL�UNIT�ASSIGNMENT,*ˆIS�DIFFERENT�FROM�STANDART�PARAMETER�TABLE*;************************************************************ LU3AFHSƒEQU�*'‰DC.W�FHCHLU„COMMAND�(CHANGE�LU�ASSIGN)‰DC.W�FOPKEP…OPTION�KEEP�ASSIGN‰DC.B�0ŠSTATUS‰DC.B�LDFLUNŠSEND�LU�NUMBER‰DC.B�LISTLUŠRECEIVE�LU�NUM‰DC.B�0ŠRESERVED&‰DC.L�0ŠTASK-ID�(0�MEANS�USE�YOURSELF)(‰DC.L�0ŠSESSION�#�(0�MEANS�USE�YOURSELF)*‰DS.W�0**!***********************************ˆSET�UP�IOS�FOR�LISTING�LU3*‹IOS�PARM�TABLE*!*********************************/‰IOS.OUT3�IOWRIT,IOPASC+IOPFOR+IOPWAT,3,0,0,0,0*)******************************************A*ˆLU3FHS�IS�FHS�PARM�TABLE�FOR�LU3�WHICH�IS�USED�FOR�OUTPUT�LISTI*********************************************"‰FHS.LU3�FHCLOS,0,LISTLU,0,0,0,0,0‰DS.W�0**;************************************************************7*‰DSKFHS�IS�THE�PARAMETER�TABLE�FOR�THE�DISK�INPUT�FILE*;************************************************************!‰FHS.DSK�FHFDEN,0,DSKLU,0,0,0,0,0‰DS.W�0*#************************************)*ˆBUILD�PARM�BLOCK�TO�ASSIGN�VOL�FOR�DISK*#************************************!‰FHS.VOL�FHASGN,0,DSKLU,0,0,0,0,0‰DS.W�0*,*********************************************2*ˆPARAMETER�BLOCK�FOR�OUTPUT�WITH�INPUT�(TERMINAL)*,*********************************************%‰IOS.OI5�IOREAD,IOPFOR,CDFLUN,,,0,0,2**.************************************? ***********+*ˆDIRECTORY�ENTRY�(DIR)�DATA�STRUCTURE�****%*ˆTHE�MASK�FOR�DIRBLK�STARTS�AT�FDUSN-*ˆTHE�DIRECTORY�ENTRY�IS�READ�INTO�THIS�BLOCK*+*********************************************DIRBLKƒDS.B�FDLEN****8**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************‰DS.W�0STSKNAMƒDC.L�0‰SAVE�TASK�NAMESESNUMƒDC.L�0ˆSAVE�SESSION�NUM#VOLNAMƒDC.L�0‰SAVE�VOL�DEFAULT�NAME‰DC.W�0/USERNUM‚DC.W�0ŠDEFAULT�USER�NUM�(16�BIT�BINARY)*CATNAMƒDC.L�0,0‡SAVE�DEFAULT�CATAGORY�NAME‰DS.L�12‰SAVE�OTHER�REGISTERS*FAMVOLƒDC.L�'„'…SAVE�FAMILY�VOL"FAMUSNƒDC.W�0ŠSAVE�FAMILY�USER�NUM"FAMCATƒDC.L�0,0ˆSAVE�FAM�CATALOGUE%FAMFILƒDC.L�0,0ˆSAVE�FAMILY�FILE�NAMEFAMEXTƒDC.W�0ŠSAVE�FAMILY�EXT)FAMWCDƒDC.B�0ŠSAVE�FAMILY�WRITE�PASS�WORD)FAMRCDƒDC.B�0ŠSAVE�FAMILY�WRITE�PASS�WORDFLAGF„DC.B�0ŠFAMILY�FLAG&FLAGWPƒDC.B�0ŠWRITE�PROTECT�ERROR�FLAGDEVFLAG‚DC.B�0ŠDEVICE�FLAGFLAGY„DC.B�0ŠOPTION�Y�FLAG‰DS.W�0)SAVD7„DC.L�0ŠBIT�MASK�OF�LUN�SENT�TO�USERFLAGC„DC.L�0ŠCONTINUE�FLAG+MSGIN„DC.B�'„'„INPUT�RESPONCE�FROM�TERMINALMSGINEND�EQU‡*-1‰DC.B†0+*œREQUIRED�POSITION�FOR�SBARG�TO�PLACE�'CR'"TSTCOUNT�DC.B�100ˆCOUNTER�FOR�TEST*‰DS.W�0*&****************************************ˆSTART�OF�PRINT�BUFFER*+******************************************* DELMSGƒEQU�*‰DC.B�'DELETED�'* PRTBUFƒEQU�*‰DS.B�40#PRTBEND‚EQU�*-1‹END�OF�PRINT�BUFFERDELMSGE‚EQU�*-1‰DS.W�0DIRMSGƒEQU�*ŒSTART�OF�DIR�MSG%VOLPRTƒDC.L�'„'…VOLUME�NAME�GOES�HERE ‰DC.W�':�'L1USN„DC.L�0ŠUSER�NUM ‰DC.W�'.�'L1CAT„DC.L�'„'…CATALOGUE ‰DC.L�'„' ‰DC.W�'.�'L1FIL„DC.L�'„'…FILE�NAME ‰DC.L�'„' ‰DC.W�'.�'L1EXT„DC.W�'‚'‡EXTENSION DIRMSGE‚EQU�*!DIRMSGL‚EQU�DIRMSGE-DIRMSG‚LENGTH‰DS.W�0** DELOK„EQU�*‰DC.B�'OK�TO�DELETE�(Y/N/Q)‚'DELOKBƒDS.B�40‰FILE�NAMEDELOKBE‚EQU�*-1DELOKEƒEQU�*-1**ˆDS.W�0*‰PAGE***’ERROR�MESSAGE�PARAMETER�BLOCK**EM_PBLK: EM_DO:ƒDC.L†0"*œD0�-�IOS/FHS�RETURN�ERROR�STATUS*œ(ERROR�MSG�KEYVALUE) EM_A0:ƒDC.L†0"*œA0�-�ADDR�OF�I/O�PARAMETER�BLOCKEM_OPT:‚DC.B†0*œOPTIONS�FLAG*œBIT‡MEANING�IF�SET*�0ˆQUERY�RESPONSE�DESIREDEM_TLUN:�DC.B†0*œUSER�TERMINAL�LUN�-�(LDFLUN)EM_QRC:‚DC.B†0*œQUERY�RETURN�CHARACTEREM_KLUN:�DC.B†0*œUSER�KEYBOARD�LUN�-(CDFLUN)EM_SPA:‚DC.L†0'*œSTART�ADDRESS�FOR�USER�TEXT�PLUG�POOLEM_EPA:‚DC.L†0%*œENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL/ENDDATA‚EQU�*‹***�E�N�D‚O�F‚D�A�T�A‚A�R�E�Aƒ***‰PAGE BEGPROC‚EQU�*‰PAGE*<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<**************************************************************/*ˆ***‚PROCEDURE�SECTION�FOR�DELETE�COMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;***************************************************************STARPROG EQU *‰LEA‡PBA(PC),A7*œA7=PROGRAM�BASE�ADDRESS*&***************************************.*ˆ**ƒSAVE�DEFAULT�VALUE�PASSED�FROM�SYSTEM�****'****************************************$‰MOVEM.L�D0-D7/A0-A7,STSKNAM-PBA(A7)*œSAVE�REGISTER�CONTENTS+*ˆD0�TO�STSKNAM�=�TASK�NAME�THAT�STARTED�ME*ˆD1�TO�SESNUM‚=�SESSION�NUM$*ˆD2�TO�VOLNAM‚=�DEFAULT�VOLUME�NAME*ˆD3�TO�USERNUM�=�USER�NUMBER*ˆD4�TO�CATNAM‚=�CATALOGUE�NAME*ˆD5�TO�CATNAM�+4**ˆD6‹=‚LENGTH�OF�COMMAND�LINE)*ˆD7�=�BIT�MASK�OF�LOGICAL�UNITS�ASSIGNED*ˆA0�=�YOUR�TASK�NAME*ˆA1�=�TERMINAL�ID*ˆA2�=�ACTUAL�USER�NUMBER(*ˆA3�=�SYSTEM�VOLUME�DEFAULE(ALL�SPACES)*ˆA4�=�SYSTEM�USER�NUMBER*ˆA5�=�SYSTEM�CATALOGUE*ˆA6�=�SYSTEM�CAT�PART�2*****‰PAGE*:*ˆPOSITION�INDEPENDENT�CODE�TO�INITIALIZE�PARAMETER�BLOCKS*ˆWITH�FIXED�VALUES* ‰MOVE.L„A7,A3‰LEA‡PROGSTK(PC),A7*œA3=PROGRAM�BASE�ADDRESS*œA7=STACK�POINTER�ADDRESS‰LEA‡DIRBLK(PC),A0 ‰MOVE.L„A0,DSKFHS-PBA+FHSSIZ(A3)(*œSET�ADDRESS�IN�FHS�PARAMETER�BLOCK�FOR *œADDR�READ�DIRECTORY�ENTRY�INTO‰LEA‡MSGIN(PC),A0 ‰MOVE.L„A0? ,OI5IOS-PBA+IOSSAD(A3)‰LEA‡MSGINEND(PC),A0 ‰MOVE.L„A0,OI5IOS-PBA+IOSEAD(A3),*œSET�START/END�MSG�ADDRESSES�IN�OUTPUT�WITH*œINPUT�PARAMETER�BLOCK‰PAGE?*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!?*****************************************************************�***„DRIVER‚BLOCK„*****?***************************************************************?*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!****ˆSYSTEM�PASSES�LOG�UNIT�FOR%*’SYSTEM�OUTPUT�-�ERROR�MESSAGES�ETC.*#************************************&*‰*****�CALL�COMMAND�PARSE�ROUTINE‚***/*ˆTHIS�ROUTINE�WILL�BREAK�DOWN�THE�COMMAND�LINE/*ˆAND�GIVE�ADDR�START�OF�OUTPUT�FIELD�&�OPTIONS*#**************************************)‰LEA�BUFFIN(PC),A0‚SAVE�BUFFER�START�ADDR ‰BSR�PARSE**”PARSE�RETURNS *•D0�=�STATUS*•A1�=�ADDR�START�OF�OUTPUT*•A2�=�ADDR�START�OF�OPTIONS*‰LEA‡PBA(PC),A3/*œA3=PROGRAM�BASE�ADDR�-�PARSE�RTNE�DESTROYS�A3‰TST.L�D0‡CK�F0R�ANY�ERR0RS‰BMI�PINVALER‡BR�IF�ERR0R*,*********************************************$*ˆCHECK�FOR�OPTION�FROM�COMMAND�LINE***********************!‰CMP.L�#0,A2…WAS�OPTIONS�FLAG�SET‰BEQ.S�CKOUTPUT„NO'‰BSR�CKFOROPT„GO�TO�OPTION�PROC�ROUTINE*$**************************************ŠCK�FOR�ANY�OUTPUT*‚ZERO�IN�A1�MEANS�NO�OUTPUT*8*ˆOUTPUT�MEANS�SEND�OUTPUT�TO�DEVICE�OTHER�THAN�TERMINAL;************************************************************CKOUTPUT EQU **'‰CMP.L�#0,A1‚A1�CONTAINS�ADDR�OF�OUTPUT4‰BNE.S�GETOUT†ASSIGN‚OUTPUT�IS�NOT�GOING�TO�TERMINAL$‰BTST�#3,D7†IS�LU�3�ALREADY�ASSIGNED‰BNE.S�DOINPUT…YES"‰BSR�SETLU3†ASSIGN�LU3�TO�TERMINAL‰BRA.S�DOINPUT'GETOUTƒBSR�NEWOUT…DO�NEW�OUTPUT�ROUTINE**+DOINPUT„BSR�INITIN†GO�TO�PROC�INPUT�ROUTINE***‰TST.B�FLAGF-PBA(A3)$‰BNE.S�FAMILYˆJMP�IF�FAMILY�FLAG�SET**8*********************************************************!*ˆDELETE�OF�NON�FAMILY�TYPE�ENTRY*8**********************************************************‰MOVE.W�#FHDELT,DSKFHS-PBA(A3)*œSET�DELETE�COMMAND !‰BSR.S�DODEL‡GO�TO�DELETE�ROUTINE‰TST.L�FLAGC-PBA(A3)*‰BEQ.S�STOPITˆJMP�IF�ALL�ENTRIES�PROCESSED‰BRA.S�DOINPUT…GET�NEXT�ENTRY*****8*********************************************************-*ˆTHE�COMMAND�LINE�HAD�A�FAMILY�INDICATOR�(*),*ˆIN�ONE�OF�THE�PARTS�OF�THE�TOTAL�FILE�NAME*8********************************************************* FAMILYƒEQU�***************************ˆASSIGN�VOLUME�FOR�DISK************************* ‰BSR�ASGNDSK**#************************************%*ˆMAKE�FHS�CALL�TO�GET�ENTRY�FROM�DIR*"***********************************'GETDIRƒLEA�DSKFHS(PC),A6‚INIT�BASE�ADDR2‰MOVE.W�#FHFDEN,FHSCMD(A6)‚FETCH�DIR�ENTRY�COMMAND!‰MOVE.L�FAMVOL-PBA(A3),FHSVOL(A6)!‰MOVE.W�FAMUSN-PBA(A3),FHSUSN(A6)!‰MOVE.L�FAMCAT-PBA(A3),FHSCLG(A6)%‰MOVE.L�FAMCAT+4-PBA(A3),FHSCLG+4(A6)!‰MOVE.L�FAMFIL-PBA(A3),FHSFIL(A6)%‰MOVE.L�FAMFIL+4-PBA(A3),FHSFIL+4(A6)!‰MOVE.W�FAMEXT-PBA(A3),FHSEXT(A6)!‰MOVE.B�FAMWCD-PBA(A3),FHSWCD(A6)!‰MOVE.B�FAMRCD-PBA(A3),FHSRCD(A6)*œRESTORE�THE�FOLLOWING�FIELDS*¦VOLUME *¦USER�NBR *¦CATALOG *¦FILENAME *¦EXTENSION*¦FAMILY�WRITE�PASSWORD*¦FAMILY�READ‚PASSWORD‰FHSCALL�(A6)†MAKE�CALL*‰BEQ.S�DOPROC‡GOOD�RETURN‰CMP.B�#FSTAEOD,D0‚END�OF�DATA‰BEQ.S�STOPIT†END�OF�RUN‰BRA�IOERPRTˆERR0R*DOPROCƒLEA�PRTBUF(PC),A0!‰LEA�PRTBEND(PC),A1‚END�OF�BUFFER!‰LEA�DELOKB(PC),A2ƒOTHER�MSG�AREACLAREAƒMOVE.L�#'„',(A0)‰MOVE.L�(A0)+,(A2)+‰CMP.L�A0,A1…AT�END ‰BCC�CLAREA#‰BSR�PROCITEMƒBR�TO�BUILD�DATA�LINE‰BRA�GETDIR†GET�NEXT�ENTRY*"*********************************** *ˆSTOP�THE�PROGRAM�AT�THIS�POINT*#************************************ STOPITƒEQU�* *ˆTHIS�TAKES�THE�PLACE�OF�A�STOP*GOBACK: ‰BSR‡TERMINAT*œTERMINATE�TASK�NORMALLY**8********************************************************8*???????????????????????????????????????????????????@ ????**ˆEND�OF�DRIVER�BLOCK*8*???????????????????????????????????????????????????????8********************************************************ŠPAGE*********************************************#*ˆROUTINE�TO�PROCESS�ACTUAL�DELETES,*ˆSINGLE�AND�FAMILY�DELETES�USE�THIS�ROUTINE*+******************************************** DODEL„EQU�******************************* *ˆSET�UP�FILE�NAME�IN�PRINT�LINE*'****************************************"‰LEA�DSKFHS(PC),A6ƒINIT�PARM�BLOCK!‰MOVE.L�FHSVOL(A6),VOLPRT-PBA(A3) *œVOLUME�NAME ‰MOVE.L�FHSCLG(A6),L1CAT-PBA(A3)$‰MOVE.L�FHSCLG+4(A6),L1CAT+4-PBA(A3) *œCATALOGUE ‰CLR.L�D0/‰MOVE.W�FHSUSN(A6),D0‚USER�NUMBER�CONV�TO�ASCII‰LEA�L1USN(PC),A0 ‰BSR�BINDEC ‰MOVE.L�FHSFIL(A6),L1FIL-PBA(A3)$‰MOVE.L�FHSFIL+4(A6),L1FIL+4-PBA(A3) *œFILE�NAME ‰MOVE.W�FHSEXT(A6),L1EXT-PBA(A3) *œEXTENSION*)*******************************************ˆMAKE�DELETE�CALL�TO�FHS*)****************************************** ‰FHSCALL�(A6)* ‰BNE.S…DELERR*œJMP�IF�DELETE�ERROR�OCCURRED0*************************************************!*ˆDELETE�SUCCESSFUL�PRINT�MESSAGE*0************************************************* GOODDEL‚EQU�*!‰MOVE.L�FHSVOL(A6),VOLPRT-PBA(A3) *œVOLUME�NAME'‰BSR�MOVENAME‰GO�TO�MOVE�FILE�NAME�ROUT*‰LEA‡DELMSG(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSSAD(A3)-*œSET�MESSAGE�START�ADDR�IN�IOS�PARAMETER�BLK%* END�OF�MSG�ADDR�IS�SET�UP�IN�SPCOMP‰IOSCALL�OUT3IOS(PC)*‰BNE�IOERPRTˆERROR*'DODELEX‚RTSŒ.�RETURN�FROM�DODEL�ROUTINE****)******************************************%*ˆPRINT�DELETE�NOT�SUCCESSFUL�MESSAGE********************************************** DELERRƒEQU�**‰MOVE.L„#LISTLU,D1!*œUSER�LOGICAL�UNIT�NBR�OUTPUT�TO ‰BSR‡C_EM_PGM*œISSUE�ERROR�MSG�REQUEST‰BRA�DODELEX…RETURN‰PAGE**ˆ****ƒOPTIONS�ROUTINE�CALL‚****4*ˆTHIS�ROUTINE�WILL�CK�INPUT�TO�DETERMINE�IF�OPTIONS+*ˆHAVE�BEEN�REQUESTED.�OPTION�FLAGS�ARE�SET!*ˆA2�=�ADDR�START�OF�OPTION�FIELD*�IN�COMMAND�LINE*?****************************************************************CKFOROPT‚EQU�* ‰BSR�OPTION*‰LEA‡PBA(PC),A33*œA3=PROGRAM�BASE�ADDRESS�-�RTNE�OPTION�DESTROYS�A3"***********************************@*‰**�BIT�6�IN�D0�SET�MEANS�THE�CARRAGE�RETURN�IS�THE�NEXT�CHAR�**"***********************************#‰BTST�#6,D0†CK�FOR�CARR�RETURN�FLAG‰BNE.S…ENDOPT„EXIT�WAS�CARR�RET&OPTERCK‚TST.B�D0ˆCK�FOR�ERR0R�BITS�SET*‰BNE�PINVALERˆFOUND�INVALID�FLAG�CONDITION*+********************************************,*‰***�CK�FOR�Y�(DO�NOT�REQUEST�OK)�OPTION�***,*********************************************‰CMP.B�#'Y',D1ƒE�OPTION�SET!‰BNE.S…INV_OPTƒNOT�A�VALID�OPTION*‰MOVE.B�#1,FLAGY-PBA(A3)*œSET�OPTION�FLAG ENDOPTƒRTSŒ.‚RETURN�FROM�ROUTINEINV_OPT:‰MOVE.L„#EM_NVO,D0)*œD0=KEY�VALUE�FOR�INVALID�OPTION�MESSAGE ‰BRA‡IOERPRT‰PAGE*/************************************************)*ˆ***‚SET�UP�FHS�PARM�BLOCK�FOR�INPUT�****7*ˆTHIS�ROUTINE�WILL�INITIALIZE�THE�INPUT�FILE�PARAMETER!*ˆBLOCK�AND�ASSIGN�THE�DIR�VOLUMN*/************************************************ INITIN„EQU�*‰TST.L�FLAGC-PBA(A3)+‰BEQ.S�INITIN1…JMP�IF�CONTINUE�FLAG�NOT�SET‰MOVE.L�FLAGC-PBA(A3),A0*œPUT�LOCATION�POINTER�IN�A0‰CLR.L�FLAGC-PBA(A3)*œCLEAR�FOR�NEXT�CALL‰BRA.S�INITIN2,INITIN1‚LEA�BUFFIN(PC),A0ƒADDR�OF�SCAN�START0INITIN2‚LEA�DSKFHS(PC),A6ƒADDR�OF�FHS�PARM�BLOCK!‰MOVE.L�VOLNAM-PBA(A3),FHSVOL(A6) *œVOLUME�NAME(GETUSNƒMOVE.W�USERNUM-PBA(A3),FHSUSN(A6) *œUSER�NUMER!‰MOVE.L�CATNAM-PBA(A3),FHSCLG(A6)%‰MOVE.L�CATNAM+4-PBA(A3),FHSCLG+4(A6)*œCATALOGUE�NAME'‰MOVE.L�#'„',FHSFIL(A6)‚BLANK�FILE�NAME‰MOVE.L�#'„',FHSFIL+4(A6),‰MOVE.W�#'‚',FHSEXT(A6)‚BLANK�EXTENSION�NAME*&****************************************ˆ**ƒCALL�EDITFILE�ROUTINE�***&***************************************!‰BSR�EDITFILE„MAKE�EDIT�FILE�CALL‰LEA‡PBA(PC),A@ 32*œA3=PROGRAM�BASE�ADDR�-�RTNE�EDITFILE�DESTROYS�A3‰BMI�PINVALER‡ERR0R*‰BTST�#1,D0‡WAS�DEVICE�BIT�SET‰BNE�PINVALERˆYES*‰BTST�#0,D0‡CONTINUE�SET‰BEQ.S�INIT1�NO‰MOVE.L�A0,FLAGC-PBA(A3)%*œSET�CONT�FLAG�AND�SAVE�ADDR�POINTER!INIT1„BTST�#7,D0†FAMILY�FIELD�SET‰BEQ.S�INITEXIT„NO‰LEA�DSKFHS(PC),A6ƒINIT�REG!‰MOVE.L�FHSVOL(A6),FAMVOL-PBA(A3)!‰MOVE.W�FHSUSN(A6),FAMUSN-PBA(A3)!‰MOVE.L�FHSCLG(A6),FAMCAT-PBA(A3)%‰MOVE.L�FHSCLG+4(A6),FAMCAT+4-PBA(A3)!‰MOVE.L�FHSFIL(A6),FAMFIL-PBA(A3)%‰MOVE.L�FHSFIL+4(A6),FAMFIL+4-PBA(A3)!‰MOVE.W�FHSEXT(A6),FAMEXT-PBA(A3)!‰MOVE.B�FHSWCD(A6),FAMWCD-PBA(A3)!‰MOVE.B�FHSRCD(A6),FAMRCD-PBA(A3)*œSAVE�FOLLOWING�FIELDS *¦VOLUME�NAME *¦USER�NUMBER *¦CATALOGUE *¦FILE�NAME *¦EXTENSION*¦WRITE�PASSWORD*¦READ‚PASSWORD‰MOVE.B�D0,FLAGF-PBA(A3)*œSAVE�FAMILY�SETTINGS�IN�FLAGFINITEXIT EQU * ‰RTS�.�RETURN**‰PAGE* ASGNDSK‚EQU�**2****************************************************ŠASSIGN�DIR�VOL‚***5*ˆCOMMAND,�VOL�NAME�AND�LU�#�ARE�SET�UP�IN�PARM�BLOCK*1**************************************************‰LEA�VOLFHS(PC),A0'‰MOVE.L�#'„',FHSCLG(A0)‚BLANK�CATALOGUE.‰MOVE.W�FHSUSN(A6),FHSUSN(A0)‚LOAD�USER�NUMBER+‰MOVE.L�FHSVOL(A6),FHSVOL(A0)‚MOVE�VOL�NAME‰MOVE.L�#'„',FHSCLG+4(A0)'‰MOVE.L�#'„',FHSFIL(A0)‚BLANK�FILE�NAME‰MOVE.L�#'„',FHSFIL+4(A0)'‰MOVE.W�#'‚',FHSEXT(A0)‚BLANK�EXTENSION* ‰FHSCALL�(A0)'*Š**‚RETURN�FROM�FILE�HANDLER�SYSTEM�**‰BNE�IOERPRTˆERR0R‰RTSŽ.�RETURN�FROM�ROUTINE*‰PAGE*.***********************************************'*ˆ**�SET�UP�FILE�NAME�FROM�DIRECTORY‚***.***********************************************PROCITEM EQU *%‰LEA�DSKFHS(PC),A6ƒADDR�OF�PARM�BLOCK,‰LEA�DIRBLK(PC),A4�SET�UP�DIR�PAR�BLOCK�ADDR*+********************************************ˆSET�UP�FILE�NAME�IN�HOLD�AREA+********************************************%BLD1…MOVE.L�FHSVOL(A6),VOLPRT-PBA(A3)‰MOVE.L�FDCLG(A4),L1CAT-PBA(A3)#‰MOVE.L�FDCLG+4(A4),L1CAT+4-PBA(A3)"*œSET�UP�VOLUME�NAME�AND�CATALOGUE**ˆUSER�NUMBER�CONVERT�TO�ASCII* ‰CLR.L�D0‰MOVE.W�FDUSN(A4),D0+‰LEA�L1USN(PC),A0„USER�NUMBER�CONV�TO�ASCII ‰BSR�BINDEC*‰MOVE.L�FDFIL(A4),L1FIL-PBA(A3)#‰MOVE.L�FDFIL+4(A4),L1FIL+4-PBA(A3)*œSETUP�FILE�NAME‰MOVE.W�FDEXT(A4),L1EXT-PBA(A3)*œSETUP�FILE�EXTENSION*‰TST.B�FLAGY-PBA(A3)*œOPTION�BYPASS�MSG�SET‰BNE.S�DO1‰YES‰LEA‡DELOK(PC),A2"‰MOVE.L„A2,OUT6IIOS-PBA+IOSSAD(A3)$*œSET�MSG�START�ADDR�IN�PARMETER�BLK$‰LEA�DELOKB(PC),A2ƒLOAD�RECEIVE�ADDR!‰LEA�DIRMSG(PC),A1ƒLOAD�SEND�ADDR"‰MOVE.L�#DIRMSGL,D1‚END�OF�MSG�LOC ‰BSR.S�SPCOMP‰ADD.L�#1,A2…POS�FOR�MOVE‰MOVE.B�#'�',(A2)+‰MOVE.B�#'?',(A2)+‰MOVE.B�#'�',(A2)+"‰MOVE.L�A2,OUT6IIOS-PBA+IOSEAD(A3)#*œSET�MSG�END�ADDR�IN�PARAMETER�BLK**'*****************************************ˆDO�OUTPUT�AND�INPUT*'****************************************ˆSEND�MESSAGE‰IOSCALL�OUT6IIOS(PC)‰BNE�IOERPRTˆERROR**ˆRECEIVE�ANSWER*‰IOSCALL�OI5IOS(PC)*‰BNE�IOERPRTˆERR0R* ‰BSR‡SBARG-*œCHANGE�FROM�LOWER�TO�UPPERCASE�IF�NECESSARY ‰BNE‡IOERPRT*œJMP�IF�ERROR�RETURNED‰CMP.B�#'Y',MSGIN-PBA(A3)"‰BEQ.S�DO1‹JMP�IF�RESPONSE�WAS�YES‰CMP.B�#'Q',MSGIN-PBA(A3)'‰BEQ‚GOBACK‰JMP�IF�RESPONSE�WAS�TO�QUIT*$‰BRA.S�PROCEXIT†BYPASS�DO�NOT�DELETE*)*******************************************ˆSET�UP�PARM�BLOCK�FOR�DELETE*)****************************************** DO1„EQU�*,‰LEA�DIRBLK(PC),A4ƒDIRECTORY�PARM�BLOCK�ADDR)‰LEA�DSKFHS(PC),A6ƒDISK�DELETE�PARM�BLOCK)‰MOVE.W�#FHDELT,FHSCMD(A6)‚DELETE�COMMAND%‰MOVE.W�FDUSN(A4),FHSUSN(A6)‚USER�NUM&‰MOVE.L�FDCLG(A4),FHSCLG(A6)‚CATALOGUE ‰MOVE.L�FDCLG+4(A4),FHSCLG+4(A6)&‰MOVE.L�FDFIL(A4),FHSFIL(A6)‚FILE�NAME ‰MOVE.L�FDFIL+4(A4),FHSFIL+4(A6) ‰MOVE.W�FDEXT(A4),FHSEXT(A6)�EXT**ŠBSR�DODEL†GO�TO�DELETE�FILE**PROCEXIT‚RTSŒ.�RETURN**,**********************************************ˆROUTINE�TO�SPACE�COMPRESS&*ŠA1�CONTAA INS�THE�SENDING�LINE�ADDRESS(*ŠA2�CONTAINS�THE�RECEIVING�LINE�ADDRESS,*ŠD1�CONTAINS�THE�LENGTH�OF�THE�SENDING�LINE*,*********************************************"SPCOMP…CMP.B�#'�',(A1)‚IS�IT�BLANK‰BEQ.S�BLD3ˆYES&‰MOVE.B�(A1)+,(A2)+‚MOVE�TO�PRINT�LINE"BLDECK„SUB.W�#1,D1…IS�THIS�THE�END‰BHI�SPCOMPˆNO‰SUB.L�#1,A2…ESTABLISH�END!‰MOVE.L�A2,OUT3IOS-PBA+IOSEAD(A3)#*œSET�END�MSG�ADDR�IN�PARAMETER�BLK ‰RTS�RETURN*!BLD3…ADD.W�#1,A1‡INC�ADDR�OF�SEND ‰BRA�BLDECK**6*******************************************************ˆROUTINE�TO�COMPRESS�AND�MOVE**ˆTHE�FULLY�QUALIFIED�FILE�NAME6********************************************************MOVENAME EQU *!‰LEA�DIRMSG(PC),A1ƒLOAD�SEND�ADDR$‰LEA�PRTBUF(PC),A2ƒLOAD�RECEIVE�ADDR'‰MOVE.L�#DIRMSGL,D1‚END�OF�MSG�LOCATION%‰BSR�SPCOMP†CALL�SPACE�REMOVE�ROUTINE ‰RTS�.�RETURN***‰PAGE8*********************************************************=***‚ROUTINE�TO�DIRECT�OUTPUT�TO�SOMETHING�OTHER�THAN�TERMINAL*9********************************************************** NEWOUTƒEQU�*$‰BTST�#3,D7†IS�LU�3�ALREADY�ASSIGNED‰BEQ.S�NEWOUT1…NO‰FHSCALL�LU3FHS(PC)‚CLOSE�LU3*3NEWOUT1‚LEA�LU3FHS(PC),A6ƒLU3�PARM�TABLE�ADDR�TO�A6@‰MOVE.B�#0,FHSWCD(A6)�LOAD�WRITE�PASSWORD�(USER�CAN�ALWAYS�WRITE?‰MOVE.B�#$FF,FHSRCD(A6)‚LOAD�READ�PASSWORD�(ONLY�USER�CAN�READ)"‰MOVE.W�USERNUM-PBA(A3),FHSUSN(A6)!‰MOVE.L�VOLNAM-PBA(A3),FHSVOL(A6)!‰MOVE.L�CATNAM-PBA(A3),FHSCLG(A6)%‰MOVE.L�CATNAM+4-PBA(A3),FHSCLG+4(A6)*œESTABLISH�FOLLOWING�FIELDS *¦USER�NUMBER *¦VOLUME�NAME *¦CATALOGUE*‰MOVE.W�#'LS',FHSEXT(A6)‡DEFAULT�EXTENSION'‰MOVE.L�A1,A0‡A1�HAD�ADDR�OF�SCAN�START*)******************************************&*ˆSET�UP�A0�WITH�ADDR�OF�START�OF�SCAN'*ˆSET�UP�A6�WITH�ADDR�OF�FHS�PARM�BLOCK*‰***�CALL�EDITFILE�ROUTINE�****)****************************************** ‰BSR�EDITFILE‰LEA‡PBA(PC),A35*›A3=PROGRAM�BASE�ADDRESS�-�RTNE�EDITFILE�DESTROYS�A3‰TST.L�D0ŠCK�FOR�ERR0R‰BMI.S�PINVALER‰BTST�#1,D0†CK�FOR�DEVICE�FLAG‰BNE.S�SETDEV†YES‰TST.B�D0ˆCK�FOR�FAMILY'‰BNE.S�PINVALERˆFOUND�FAMILY�INDICATION‰BRA.S�NOTDEV†BRANCH*)*******************************************ˆ****ƒASSIGN�LOGICAL�UNIT�3*'**************************************** SETDEVƒMOVE.B�#1,DEVFLAG-PBA(A3)*œSET�DEVICE�FLAG-‰MOVE.W�#FHASGN,FHSCMD(A6)‚SET�ASSIGN�COMMAND4‰MOVE.W�#FOPPW,FHSOPT(A6)‚SET�EXCLUSIVE�WRITE�OPTION ‰BTSTW…#14,D0 ‰BNE.S…SETLU3*œJMP�IF*¦DEVICE�SPECIFIED*¦VOLUME�FIELD�NULL�STATE ‰FHSCALL�(A6)!*ˆ*****ƒRETURN�FROM�FHS�CALL‚****‰BNE.S�IOERPRTˆERR0R!NEWOUTE‚RTSŒ.�RETURN�FROM�ROUTINE****)******************************************"*ˆ**‚OUTPUT�IS�A�FILE�NOT�A�DEVICE.*ˆ**‚A6�CONTAINS�ADDR�OF�OUTPUT�FHS�PARM�BLOCK*)****************************************** NOTDEVƒEQU�**3‰MOVE.W�#FHALLO+FHASGN,FHSCMD(A6)‚SET�ALLOC&�ASSIGN**Š***‚OPTIONS�SET*'‰MOVE.W�#FOPPW+FOPEND+FOPSEQ,FHSOPT(A6)"‰CLR.L�FHSSIZ(A6)‚SIZE�CODE�=�ZERO#‰CLR.W�FHSLRL(A6)„LOG�REC�LENG�TO�0*"NOTDEV1‚FHSCALL�(A6)‡MAKE�FHS�CALL ‰BEQ�NEWOUTE*‰CMP.B�#5,D0‰DUP�FILE‰BNE.S�IOERPRT‰NO‰MOVE.W�#FHASGN,(A6)‰BRA�NOTDEV1‰TRY�AGAIN**‰PAGE2***************************************************.*ˆROUTINE�TO�ASSIGN�LOGICAL�UNIT�3�TO�TERMINAL+*ˆBY�SETTING�IT�UP�THE�SAME�AS�LU6�WHICH�IS"*ˆALREADY�ASSIGNED�TO�THE�TERMINAL*2*************************************************** SETLU3ƒEQU�*‰FHSCALL�LU3AFHS(PC)‰BNE.S�IOERPRT…BAD�RETURN ‰RTSŒ.�RETURN*****6*******************************************************4*ˆROUTINE�TO�ASSIGN�LU6�TO�TERMINAL�FOR�TESTING�ONLY7*ˆTHE�FOLLOWING�DEVICES�ARE�SET�UP�FOR�TESTING�PURPOSES*ˆIN�THE�SIMULATOR*ˆCONS�=�TERMINAL*ˆFD00�=�FLOPPY�DISK�00*ˆFD01�=�FLOPPY�DISK�01*ˆPR--�*�PRINTER�(-�IS�BLANK)=*ˆNULL�=�NULL�DEVICE�(READ�AND�WRITE�TO�NULL�ARE�LIKE�NO�OPS)*6******************************************************‰PAGE**0*ˆPINVALER�IS�ERR0R�RETURN�FROM�EDA ITFILE�ROUTINE*ˆ(GETCAT�IS�CLOSEST�LABEL) PINVALER:‰MOVE.L„#EM_NVE,D0%*œSET�KEY�VALUE�FOR�INVALID�ENTRY�MSG**ˆI/O�ERROR�MESSAGE* IOERPRT‚EQU�*‰MOVE.L„#LDFLUN,D1$*œD1=USER�LOGICAL�UNIT�NBR�OUTPUT�TO‰BSR.S…C_EM_PGM*œISSUE�CALL�TO�ERROR�MSG�PRGM‰PAGE**2*ˆALL�UTILITIES�WILL�TERMINATE�BY�CALLINGƒERQ.TERM:*ˆHOWEVER�-�AN�INDICATION�AS�TO�WHETHER�THERE�WAS�AN�ERROR5*ˆWHICH�MIGHT�CAUSE�CHAIN�PROCESSING�TO�ABORT�MUST�BE9*ˆSPECIFIED�AT�THE�TIME�OF�THE�TERMINATION.�THE�FOLLOWING8*ˆWILL�DEFINE�THE�TYPE�OF�TERMINATION�THAT�ARE�CURRENTLY *ˆPOSSIBLE:*8*’NORMAL�TERMINATION‚-�IMPLIES�THAT�UTILITY�SUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM�#0,#0**:*’ERROR�TERMINATIONƒ-�IMPLIES�THAT�UTILITY�TERMINATED�WITH *¨AN�ERROR**¦ERQ.TERM�#0,#$C000*<*’WARNING�TERMINATION�-�IMPLIES�THAT�UTILITY�TERMINATED�WITH*¨A�WARNING�(ie.�ASSEMBLY)**¦ERQ.TERM�#0,#$1000*L********�PBA�-�IS�THE�PROGRAM�BASE�ADDRESS‚--�THIS�MAYBE�ANY�SYMBOL�THE�USER *®WOULD�LIKE�-�PBA�HAS�BEEN�USED*®FOR�ILLUSTRATION�PURPOSES*D******** THE USER IS RESPONSILE FOR SUPPLYING THE BASE REGISTER (A?)*** TERMINAT:‰ERQ.TERM‚#0,TERM_FLG-PBA(A3) TERM_FLG:‰DC.W†0‰TERMINATION�FLAG0*œWILL�CONTAIN�THE�APPROPRIATE�TERMINATION�VALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*‰PAGEK**************THE USER IS RESPONSIBLE FOR SUPPLYING THE REGISTER (A?) WHICH5**************CONTAINS THE PROGRAM BASE ADDRESS (PBA)***’ERROR�MESSAGE�CALLING�ROUTINE**ˆCALL†BSR‡C_EM_PGM**ˆINPUT!*’D0�=�AS�RETURNED�FROM�TRAP�CALL,*’D1�=�USER�LOGICAL�UNIT�NUMBER�TO�OUTPUT�TO!*’A0�=�AS�RETURNED�FROM�TRAP�CALL**ˆOUTPUT*’NO�REGISTER�PRESERVATION* EM_XCEPT:‰DC.W†$0017…FILE�NON-EXISTENT‰DC.W†$0000…TABLE�TERMINATOR2*œTHIS�TABLE�IS�USED�TO�DEFINE�EXCEPTIONS�TO�ERROR.*œMESSAGES�THAT�SHOULD�NOT�CAUSE�A�TERMINATION*œVIA�THE�ERROR�CONDITION* C_EM_PGM:‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A3)+*œSAVE�D0�AND�A0�IN�ERROR�MSG�PARAMETER�BLK‰AND.L…#$00FF,D0*œISOLATE�ERROR�STATUS�RETURN‰LEA‡EM_XCEPT(PC),A00*œA0=ADDR�OF�TBL�CONTAINING�ERROR�MSG�CODES�THAT-*ŸWILL�NOT�BE�CONSIDERED�AS�ERROR�TERMINATION *ŸCONDITIONS CEMP0100: ‰TST.W…(A0)‰BEQ.S…CEMP0200 *œJMP�IF�TABLE�HAS�BEEN�EXAMINED‰CMP.W…(A0)+,D0‰BEQ.S…CEMP0300'*œJMP�IF�ERROR�CODE�RETURN�IS�ONE�WHICH/*œWILL�RESULT�IN�BEING�AN�EXCEPTION�-�THIS�CASE**œWILL�NOT�BE�CONSIDERED�FOR�AN�ERROR�TYPE *œTERMINATION‰BRA.S…CEMP0100 *œREPEAT�LOOP CEMP0200:‰MOVE.W„#$C000,TERM_FLG-PBA(A3),*œSET�FLAG�TO�TERMINATE�WITH�ERROR�CONDITION CEMP0300:‰LEA‡EM_PBLK(PC),A0&*œA0=ADDR�USER�ERROR�MSG�PARAMETER�BLK‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)*œSET�THE�USER�LUN�TO�OUTPUT�TO ‰MOVE.L„#2,D0*œERROR�MSG�PRGM�INPUT�RQMNT‰TRAP†#4$*œISSUE�REQUEST�TO�ERROR�MSG�HANDLER‰RTS **‰PAGE*&*ˆ**CONVERT�BINARY�TO�ASCII�ROUTINE�**-*********************************************$*ˆBINARY�TO�DECIMAL�ASCII�SUBROUTINE*�REV�1.00‚3/27.79�GAT*�**�16�BIT�BINARY�INPUT�**4****************************************************6*ˆCONVERTS�BINARY�QUANTITY�IN�D0�TO�ASCII�STRING�WHICH *ˆIS�DEPOSITED�AT�LOCATION�(A0)+**ˆCALLING�SEQUENCE:'*‹LOAD�D0�WITH�QUANTITY�TO�BE�CONVERTED.*‹LOAD�A0�WITH�ADDRESS�TO�DEPOSIT�ASCII�STRING *‹JSR�BINDEC*!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*“D„*�* *“A„*�*�***ˆA1�POINTS�AT�BINARY�TABLE*ˆA2�POINTS�AT�ASCII�TABLE*ˆD1�IS�WORK�REGISTER*BINEQSƒDC.W�0,1,10,100,1000(BINASCƒDC.B�'0123456789ABCDEF'…HEX�TABLE*%BINDECƒLEA‡BINEQS+8(PC),A1ƒADDR�10**5*BINDE1ƒLEA‡BINASC(PC),A2†BASE�ADDR�ASCII�0#BINDE2ƒSUB.W�(A1),D0ŠSUBTRACT�10**N‰BCS.S�BINDE3�BRANCH�OVERBORROW&‰ADD.L�#1,A2ŒINCREMENT�NEXT�ASCII�CHAR‰BRA�BINDE2�CONTINUE'BINDE3ƒADD.W�(A1),D0ŠRESTORE�OVERBORROW!‰MOVE.B�(A2),(A0)+†PUT�ASCII�CHAR‰MOVE.W�-(A1),D1ˆTEST�DONE‰BNE�BINDE1�BRANCH�NOT�DONE‰RTS‰PAGEPRG_SIZE�EQU‡*-PBA* ‰END�BEGPROCB éé=/* =/*†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 ƒ=ARG�DIR.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 ƒ=ARG�DIR.LL=/ENDIF=/*=LINK ,DIR.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000 INPUT DIR.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééB éééC‡LIST ‡LLEN�120‡TTL„DIRECTORY�OF�FILES�UTILITY!DIRECT�IDNTƒ4,1‚DIRECTORY�UTILITY<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************#*‹PROGRAM�NAME�IS‚D�I�R�C�.�D�A�T�A****ˆ***ƒDIRECTORY�COMMANDƒ******=*ˆTHIS�COMMAND�WILL�DISPLAY�FILE�NAMES�FROM�A�DISK�DIRECTORY.<*ˆTHE�DISPLAY�MAY�BE�THE�ENTIRE�DIRECTORY�OR�SELECTED�PARTS.* *ˆOPTIONS**ˆNORMAL„DISPLAY�THE�FILE�NAME*?*ˆE‰FOR�ANY�FILE�NAME�SPECIFIED�IN�THE�INPUT�FIELD,�THIS�OPTION:*’WILL�OUTPUT�ALL�DIRECTORY�ENTRIES�INCLUDING�ALL�RELATIVE:*’DISK�SPACE�INFORMATION�BUT�EXCLUDING�ABSOLUTE�DISK�SPACE*’DATA*>*ˆZ‰WILL�OUTPUT�THE�NAMES�OF�ALL�FILES�CONTROLLED�BY�THE�LOGON*’USER�AND�USER�NUMBER�ZERO*<*ˆA‰WILL�OUTPUT�ALL�DIRECTORY�ENTRIES�INCLUDING�ALL�RELATIVE%*’AND�ABSOLUTE�DISK�SPACE�INFORMATION1*’**VALID�FOR�VOLUME�OWNER�OR�SYSTEM�ADMINSTRATOR*7*ˆS‰WILL�SORT�THE�DIRECTORY�COMMAND�OUTPUT�ACCORDING�TO *œUSER�NUMBER*œCATALOG�NAME *œFILE�NAME *œEXTENSION9*’**MAYBE�USED�ALONE�OR�IN�COMBINATION�WITH�THE�FOLLOWING *”OPTIONS *œ"A","E","Z"*9*’**SORTING�IS�PERFORMED�IN�INCREASING�ALPHANUMERIC�ORDER**!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*’D…*�*�*�*�*�*�**’A…*�*�*�*�*�*�***=**************************************************************‰PAGE*** *ˆDIRECTORY�MODIFICATION�HISTORY****ˆREVISION�CODE‡080181�3* *’CONTAINS�ERROR�MESSAGE�HANDLER$*’CONTAINS�POSITION�INDEPENDENT�CODE-*’CONTAINS�CURRENT�REVISION�CODE�MODIFICATION5*’CONTAINS�TERMINATION�LOGIC�FOR�USE�WITH�CHAIN�FILES1*’CONTAINS�COMMON�SUBROUTINES�PULLED�FROM�LIBRARY5*’SEGMENT�ALLOCATION�IS�DYNAMICALLY�ALLOCATED�AND�NOT*—PRE-DETERMINED/*’USER�NOW�GETS�COUNT�OF�NBR�OF�FILES�RETRIEVED5*’THE�DOUBLE�"$"�PROBLEM�THAT�PREVIOUSLY�EXISTED�WHEN*—USING�THE�"A"�OPTION�IS�FIXED9*’THE�"Z"�OPTION�WILL�SEARCH�FOR�ONLY�THE�LOG�ON�USER�NBR3*—AND�USER�ZERO�INSTEAD�OF�FETCHING�EVERY�DIRECTORY ELJUV]elm_uJ}T…j�^•T�A¥M­<µ8½LÅNÍLÕHÝIåAíNõMýW S T K O %K -Q 5H/*—ENTRY�AND�THEN�DETERMINING�IF�IT�IS�USER�ZERO*—OR�THE�LOG�ON�USER*****ˆREVISION�CODE‡090181�3*0*’CORRECTS�THE�FALL�THRU�AND�ATTEMPTED�EXECUTION*—OF�TERM_FLG�AS�AN�INSTRUCTION'*’USES�THE�CORRECTED�'SBARG'�SUBROUTINE3*’HAS�A�CHARACTER�FOLLOWING�THE�INPUT�DATA�SO�SBARG&*—WILL�HAVE�A�POSITION�TO�PLACE�A�'CR'*****ˆREVISION�CODE‡090281�3*3*’RE-LINKED�SO�ALL�SECTIONS�WILL�BE�IN�SEGMENT�ZERO*****ˆREVISION�CODE‡090981�3*9*’CORRECT�SIZE�PROBLEM�FOR�'A'�OPTION�ON�CONTIGIOUS�FILES**‰PAGE***ˆREVISION�CODE‡092181�3*7*’CORRECT�PROBLEM�FOR�'A'�OPTION�WHEN�FAB�ENTRIES�WOULD-*œSHOW�DATA�BLOCK�WHICH�DID�NOT�BELONG�TO�THE*œFAB�BEING�DISPLAYED5*’ALLOW�THE�USER�THE�CAPABALITY�TO�SPEC CIFIY�AN�OUTPUT)*œFILE�OR�DEVICE�WHEN�SEEKING�THE�VOLUME,1*œUSER�NO.,�AND�DESCRIPTION�OF�A�SPECIFIED�DEVICE*****ˆREVISION�CODE‡111781�3*#*’CORRECT�PROBLEM…DIR�FILENAME.EX,#'*’CORRECT�PROBLEM…DIR�FILENAME.EX,#CNXX7*’CORRECT�PROBLEM…DIR�;V‚WHERE�'V'�IS�AN�INVALID�OPTION'*’CORRECT�PROBLEM…DIR�FILE1.EX,LISTFILE*°WHERE�FILE1.EX�IS�NON-EXSTENT*°ALL�OUTPUT�WILL�NOW�GO�TO*°LISTFILE.LS�AND�NOT�THE*°INITIATING�DEVICE****ˆREVISION�CODE‡092683�4*8*‘SET�CHAIN/BATCH�RD�REGISTER�WITH�$1000�IF�NO�DIRECTORY8*‘ENTRIES�FOUND�IN�FILE�SERCH�ATTEMPT�DURING�CHAIN�MODE.****ˆRevision�code‡050784�4ŒKEG*0*’Print�'.&.'�for�a�NULL�catalog�instead�of�'..'****ˆRevision�code‡061184�4*;*’Separate�buffer�DEVBUF�added�for�FETDEV�call�to�fix�error:*’when�number�of�random�devices�exceeds�25.�Maximum�number"*’of�devices�is�now�100.�(SPR�897)*6*’OUT3P�Macro�call�in�print�line�feed�routine�replaced*’with**œBSR.S…OUT3PP*œIOSCALLƒOUT3IOS*&*’to�eliminate�warning�during�assembly**’HELP�option�added**ˆRevision�code‡031285�4*4*’Address�register�A4�was�being�destroyed�in�LNFEED,4*’causing�the�totals�for�a�file�to�be�incorrect�when*’the�A�option�was�used.**ŠPAGE***ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ**‰NOLIST‰INCLUDE�9995.&.FME.EQéééééé‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.TR1.EQ‰LIST**‰PAGE*ˆDATA�SEGMENT�FOR�DIR�COMMAND*ˆ****‚EQUATE�AREA‚******* BEGDATA‚EQU�0#STKLENƒEQU�25‹STACK�LENGTH�IN�WORDS)BUFSIZE‚EQU�160‰INPUT�COMMAND�BUFFER�SIZE SECLENƒEQU�$100ˆLENGTH�OF�BUFFERCDEVLENƒEQU�1000ˆLENGTH�OF�BUFFER�USED�ON�FETDEV�CALL�-�ALLOWS�UP�TO*˜100�DEVICES�-�SPR�897 DSKLU„EQU�1!LISTLUƒEQU�3‹LISTING�LOGICAL�UNIT* ‰SECTION�0‰XREF�EDITFILE,PARSE,OPTION ‰XREF†DATEOJ**ˆ****‚MACRO�AREA‚*******ˆNEXT�WORD�BOUNDRY�MACRO** NEXTWBƒMACRO‰NOLIST‰DS.W�0‰LIST‰ENDM* OUT3P…MACRO ŠBSR„OUT3PP ŠIOSCALL�\1ŠENDM*‰PAGE* PBA†EQU�** REV_CODE:‰DC.B†'031285�4'&*œWHERE�REV_CODE�IS�DEFINED�AS�FOLLOWS *œMMDDYYXZ*C 3*œMMDDYY�=�MONTH�DAY�YEAR�OF�LAST�ASSEMBLY�OR�PATCH*œX†=�REVISION�TYPE�CODE*¦SPACE�=�CLEAN�ASSEMBLY *¦P…=�PATCHED*¦C…=�CUSTOMIZED�PATCHED**#*œZ†=�VERSADOS�MAJOR�REVISION�FIELD*‰NEXTWB**‰PAGE;**************************************************************ˆ***ƒDATA�AREA‚******:************************************************************ ‰DS.L�STKLEN PROGSTK‚EQU�**‰DC.L�0‰NEXTWB8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFIN�IS�THE�AREA�THE�COMMAND�LINE�IS.*ˆ***ƒREAD�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++***BUFFINƒCOMLINE�BUFSIZE‚***‚INPUT�BUFFER‚***5******************************************************VERSION‚DC.L�'DIR�VERSION�'V_NBR:ƒDC.B†'031285�4‚'*œREVISION�CODE/VERSION�NBR&VDATE„DC.L�'XX/XX/XX�'‹DATE�OF�LISTING&VTIME„DC.L�'XX:XX:XX�'‹TIME�OF�LISTING 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ƒ200�MAXIMUM�FILE�COUNTALLOCSEG‚DC.Lƒ0’TASK�NAMEŠDC.Lƒ0’SESSIONSEG_OPTS:�DC.Wƒ0’OPTIONSŠDC.Wƒ0’ATTRIBUTESŠDC.Bƒ'SSEG'�NAMESEG_ADDR:�DC.L…0�ADDRESS3SEGLGH„DC.Lƒ0’SEGMENT�LENGTH�(DYNAMICALLY�INSERTED)*5******************************************************+*ˆ**‚IOS�PARAMETER�TABLE�FOR�DISK�READS‚***6*ˆ**‚REFER�TO�IOS�EQUATES�UNDER�IOS�PARAMETER�BLOCK‚***5******************************************************‰NEXTWB DSKIOSƒEQU�* ‰DC.W�IOREAD‰DC.W�IOPWAT+IOPRAN+IOPIMG‰DC.B�0 ‰DC.B�DSKLU‰DC.B�0‰DC.B�0‰DC.L�0‰DC.L�0‰DC.L�0‰DC.L�0‰DC.L�0‰DC.L�0‰NEXTWB*OPT†SET�IOPASC+IOPWAT+IOPNXT+IOPNOC+IOPCNP"‰IOS.L�IOWRIT,OPT,LDFLUN,0,0,0,0,0‰NEXTWB*3*****************************************************ŒIOS�PARAMETER�TABLE(*ˆSET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK*3**************************************************** OUT6IOS‚EQU�* ‰DC.W�IOWRIT‰DC.W�IOPASC+IOPFOR+IOPWAT‰DC.B�0 ‰DC.B�LDFLUN‰DC.B�0‰DC.B�0‰DC.L�0 SADIO„DC.L�0 EADIO„DC.L�0‰DC.L�0‰DC.L�0‰DC.L�0ŠNEXTWB#*ˆPARM�TABLE�FOR�FETCH�DEVICE�TABLE*FETDEVƒDC.W�FHFDMN…CMD‰DC.W�FOPFRA…OPTIONS‰DC.W�0‰DC.L�0ŠBUFFER/‰DC.L�DEVLEN…ALLOWS�UP�TO�100�DEVICES�-�SPR�897*ŠNEXTWB‰PAGE"***********************************8*ˆFHS�PARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT6*ˆCHANGE�IS�FROM�6�TO�3�--�SEND�SOURCE�IS�LU�A�IN�MASK*ˆAND�RECEIVE�IS�LU�B�IN�MASK4*ˆLU3�IS�USED�F0R�LISTING�AND�LU6�FOR�ERR0R�/LOGGING**3*ˆPARAMETER�TABLE�FOR�CHANG�LOGICAL�UNIT�ASSIGNMENT,*ˆIS�DIFFERENT�FROM�STANDART�PARAMETER�TABLE*%************************************** LU3AFHSƒEQU�*'‰DC.W�FHCHLU„COMMAND�(CHANGE�LU�ASSIGN)‰DC.W�FOPKEP…OPTION�KEEP�ASSIGN‰DC.B�0ŠSTATUS‰DC.B�LDFLUNŠSEND�LU�NUMBER‰DC.B�LISTLUŠRECEIVE�LU�NUM‰DC.B�0ŠRESERVED-LU3ATID‚DC.L�0ŠTASK-ID�(0�MEANS�USE�YOURSELF)(‰DC.L�0ŠSESSION�#�(0�MEANS�USE�YOURSELF)*‰NEXTWB**!***********************************ˆSET�UP�IOS�FOR�LISTING�LU3*‹IOS�PARM�TABLE*!*********************************6‰IOS.OUT3�IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU,0,0,0,0,0*‰NEXTWB)******************************************?*ˆLU3FHS�IS�PARM�TABLE�FOR�LU3�WHICH�IS�USED�FOR�OUTPUT�LISTING*********************************************‰FHS.LU3�0,0,LISTLU,0,0,0,0,0*ŠNEXTWB*;************************************************************6*ˆ***�DSKFHS�IS�THE�PARAMETER�TABLE�FOR�THE�INPUT�FILE*;************************************************************!‰FHS.DSK�FHFDEN,0,DSKLU,0,0,0,0,0‰NEXTWB*#************************************ *ˆBUILD�PARM�BLOCK�TO�ASSIGN�VOL*#************************************!‰FHS.VOL�FHASGN,0,DSKLU,0,0,0,0,0*‰NEXTWB********************************************+*ˆDIRECTORY�ENTRY�(DIR)�DATA�STRUCTURE�****$*ˆTHE�MASK�FOR�DIRBLK�START�AT�FDUSN-*ˆTHE�DIRECTORY�ENTRY�IS�READ�INTO�THIS�BLOCKD *+*********************************************DIRBLKƒDS.B�FDLEN****‰NEXTWB8**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAMƒDC.L�0‰SAVE�TASK�NAMESESNUMƒDC.L�0ˆSAVE�SESSION�NUM#VOLNAMƒDC.L�0‰SAVE�VOL�DEFAULT�NAME‰DC.W�0ŠHIGH�ORDER�OF�USER�NUM/USERNUM‚DC.W�0ŠDEFAULT�USER�NUM�(16�BIT�BINARY)*CATNAMƒDC.L�0,0‡SAVE�DEFAULT�CATAGORY�NAME REGD6„DC.L�0ŠCOMMAND�LINE�LENGTH REGD7„DC.L�0‰DS.L�8ŠOTHER�REGISTERS+TMPDATE‚DS.L�2ŠFIELD�TO�HOLD�GREGORIAN�DATE$HOLDDATE�DC.L�'„'…WORK�AREA�FOR�YEAR*,BLANK1S‚DC.B�'�'ˆJUST�A�BLANK�FOR�LINE�FEEDS EJMSGSƒDC.W�$0C20†FOR�PAGE�EJECTDEVFLAG‚DC.B�0ŠDEVICE�FLAG(FLAGA„DC.B�0ŠOPTION�A�(SEG�ADDRESS)�FLAG-FLAGS„DC.B�0ŠOPTION�S�(SORTED�DIRECTORY)�FLAG1FLAGE„DC.B�0ŠOPTION�E�(PRINT�ALL�ATTRIBUTES�FLAG)0FLAGZ„DC.B�0‰OPTION�Z�PRINT�SYSTEM�EMTRIES�ALSO)*FLAGH„DC.B†0‰OPTION�H�(HELP)�FLAG�-�061184-SFIRSTƒDC.B�0‰FIRST�TIME�THRU�FLAG�IN�SORTING"RFLAG„DC.B�0‰RETURN�TO�GETDIR�FLAGEXFLAGƒDC.B�0ŠCARR�RET�FLAG&FLAG1„DC.B�0…1ST�TIME�FLAG�FOR�PRT�MSG+PRNTFLG‚DC.B�0…LINE�FEED�FLAG�1ST�TIME�THRU0FLAGLFƒDC.B�0…USE�LINE�FEEDS�OR�NOT�FLAG�(0=NOT)1COUNT„DC.B�0ŠCOUNT�FOR�SECTOR�LENGTH�FOR�A�OPTIONFLAGEX„DC.B�0…END�OF�FAB�FLAG!CFLAG„DC.B�0ŠCONTIGUOUS�FILE�FLAGDFLAG„DC.B�0‚DEVICE�PRINT�FLAG‰NEXTWB.ROWCNT„DC.Lƒ$7FFFFFFEŠROW�COUNT�FOR�PAGE�EJECT'LNCNT…DC.Lƒ$7FFFFFFFŠRUNNING�LINE�COUNT#FFLAG…DC.Lƒ0’PRINT�DETAIL�LINE�FLAG7NXTBLKƒDC.L�0ŠADDR�OF�NEXT�BLOCK�FOR�SECTORS�-�OPTION�A5SAVEOPT‚DC.L�0ŠSAVE�OPTION�ADDRESS�POINTER�FROM�PARSE1NCCOUNT‚DC.L�0‰NON�CONTIGUOUS�LENGTH�WORK�COUNTER1FABSPCƒDC.L�0ŠACCUMULATE�FAB�SIZE�FOR�SINGLE�FILE1TOTSIZƒDC.L�0ŠACCUMULATE�TOTAL�SIZE�FOR�ALL�FILES-FWPSN„DC.L�'„'…WORK�AREA�FOR�FAB�PSN�FROM�FAB,DALL…DC.L�$2A2E2A0D�GET�ALL�COMD�LINE(*.*CR)AST†DC.L�$2A2A2A2A‚VALUE�OF�AST'ROOT†DC.Lƒ0’LIST�HEAD�FOR�SORTED�OPTION+RLINK…DC.Lƒ0’RUNNING�LINK�FOR�SORTED�OPTION‰NEXTWBFLAGIN�DC.B�0ŒNULL�INPUT�FLAG*‰NEXTWB&***************************************0*‰BUFFER�FOR�SECTOR�MEMORY�FOR�FILE�ACCESS�BLOCK&*************************************** SECBUFƒEQU�*‰DS.B�SECLENˆSECTOR�SIZESECBUFE‚EQU�*-1‰END�OF�BUFFER‰DC.L�0ŠMUST�FOLLOW�SECBUFE NADR_SEC:‰DC.L†0!*œENDING�ADDRESS�OF�SECTOR�BUFFER***&***************************************8*‰BUFFER�FOR�DEVICE�MNEMONICS�ENTRIES�-�CORRECTS�PROBLEM*‰DETAILED�IN�SPR�897*&***************************************‰NEXTWB DEVBUFƒEQU‡*‰DS.B†DEVLENŽSIZE�OF�BUFFER****.***********************************************"*ˆSTART�OF�PRINT�HEADERS�&�BUFFERS*.***********************************************‰NEXTWB* HDET1„EQU�* ‰DC.B�'‚' ‰DC.B�'�LOGƒ' ‰DC.B�'#�OF‘'!‰DC.B�'�REC‚KEY�FAB�DBƒDATE†DATE'HDET1EƒEQU�*-1 HDET2„EQU�* ‰DC.B�'‚'‰DC.B�'START„END„EOF‚RECORDS�'‰DC.B�'�WC‚RC‚FT„LEN�'%‰DC.B�'�LEN�LEN�LEN�CHANGED‚ACCESSED'HDET2EƒEQU�*-1‰END�OF�RECORD*‰NEXTWB* DETAILƒEQU�* ‰DC.B�'‚'!DFSƒDC.B�'…'‚FILE�START/1ST�FABŠ0 ‰DC.B�'‚'ž5DFE…DC.B�'…'„LENGTH/LAST�FAB‰7 ‰DC.B�'‚'�12DLOG…DC.B�'…'„LOGICAL�EOF‹14 ‰DC.B�'‚'�19 DRNUM„DC.B�'‡'‚NUM�OF�RECORDSˆ21 ‰DC.B�'‚'�28DWCD…DC.B�'‚'‡WRITE�CODEŒ30 ‰DC.B�'‚'�32DRCD…DC.B�'‚'‡READ�CODE�34 ‰DC.B�'‚'�36$DATT…DC.B�'ƒ'†ATTRIBUTES�PART�ONEƒ38 ‰DC.B�'�'ž41DLRL…DC.B�'…'„RECORD�LENGTH‰42 ‰DC.B�'�'ž47DKEY…DC.B�'ƒ'†KEY�LENGTHŒ48 ‰DC.B�'�'ž51DFAB…DC.B�'ƒ'†FAB�LENGTHŒ52 ‰DC.B�'�'ž55DDAT„DC.B�'ƒ'‡DATA�LENGTH‹56 ‰DC.B�'�'ž59DCTOP…EQU„*‡DATE�CHANGED 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�'‚'‡MONTH�70 ‰DC.B�'/'DDATE3„DC.B�'‚'‡DAY’75 ‰DC.B�'/'DDATE1ƒDC.B�'‚'‡YEAR’76DETAILE‚EQU�*-1‰NEXTWB* PRTBUFƒEQU�*‰DS.B�80#PRTBEND‚EQU�*-1‹END�OF�PRINT�BUFFER*DIRMSGƒEQU�*ŒSTART�OF�DIR�MSG%VOLPRTƒDC.L�'„'…VOLUME�NAME�GOES�HERE ‰DC.W�':�'L1USN„DC.LD �0ŠUSER�NUM ‰DC.W�'.�'L1CAT„DC.L�'„'…CATALOGUE ‰DC.L�'„' ‰DC.W�'.�'L1FIL„DC.L�'„'…FILE�NAME ‰DC.L�'„' ‰DC.W�'.�'L1EXT„DC.W�'‚'‡EXTENSION!DIRMSGEƒEQU�*-1‰END�OF�MSG�LINE�1DIRMSGL‚EQU‡*-DIRMSG‰NEXTWB****ˆADDRESS�LINE�MESSAGE�AREA* HFABMSG‚EQU�*‰DC.B�'‚FAB�PSNˆ'‰DC.B�'DATA�STARTƒ'‰DC.B�'�#�REC‚#�SECT…'‰DC.B�'DATA�STARTƒ'‰DC.B�'�#�REC‚#�SECT'HFABMSGE�EQU�*-1‰END�OF�LINE*‰NEXTWB PFABD„EQU�* ‰DC.B�'‚'(DFABPSN‚DC.B�'…'„FAB�PHYSICAL�SECTOR�NUM ‰DC.B�'Ž'DFABDSƒDC.B�'…'„DATA�START ‰DC.B�'„'(DFABRNƒDC.B�'†'ƒ#�OF�REC'S�IN�DATA�BLOCK ‰DC.B�'…'DFABSECT�DC.B�'ƒ' ‰DC.B�'‹' ‰DC.B�'Š' ‰DC.B�'�'PFABDEƒEQU�*-1‰NEXTWB ‰DC.B�'„'* HFABLMƒEQU�*‰DC.B�'‚SIZE‚''HFABLMC‚DC.B�'ˆ'‚DATA�LENGTH�IN�SECTORS ‰DC.B�'/$'HFABLMH‚DC.B�'ˆ'HFABLME‚EQU�*-1‰END�OF�MSG‰NEXTWB*/TFABLMƒEQU�*–TOTAL�SPACE�CONSUMED�FOR�ALL�FILES‰DC.B�'TOTAL�SIZE„''TFABLMC‚DC.B�'ˆ'‚DATA�LENGTH�IN�SECTORS ‰DC.B�'/$'TFABLMH‚DC.B�'ˆ'TFABLME‚EQU�*-1‰END�OF�MSG‰NEXTWB* NOMSG„DC.B�'FILE�NOT�ON�VOLUME‚'NOMSGVOL�DC.L�'„'…VOLUME�NAMENOMSGEƒEQU�*-1„END�OF�MSG‰NEXTWBFABERMSG EQU *!‰DC.B�'SECTOR�COUNT�ERROR�ON�FAB'FABERMSE�EQU�*-1‰.END�OF�MSG‰NEXTWB DEVM…EQU�*‰DC.B�'DEVICE‚'DEVM1„DC.B�'„' ‰DC.B�'‚'DEVM1EƒEQU‡*-DEVM‰DC.B�'IS�VOLUME�'DEVM2„DC.B�'„' DEVME„EQU�*-1‰NEXTWB* UDM†EQU�*‰DC.B�'USER�NUM=�' UDMN…DC.B�'„'‰DC.B�'„DESC=�' UDMD…DC.B�'”' UDME…EQU�*-1*‰NEXTWBDEVMN: ‰DS.B†DEVM1E‰DC.B�'VOLUME�NOT�FOUND'DEVMNEƒEQU�*-1**‰NEXTWB IOERR„EQU�*‰DC.B�'I/O�ERRORƒ'IOERRNƒDC.B�'‚'IOERREƒEQU�*-1*‰NEXTWB*7SEGERMSG‚DC.Bƒ'NOT�ENOUGH�MEMORY�FOR�THIS�''S''�OPTION'SEGERMSE‚EQU„*-1ŠNEXTWB*CFILMAXSƒDC.Bƒ'FILE�COUNT�EXCEEDED�-�RETRY�WITH�LARGER�''S''�OPTION'FILMAXEƒEQU„*-1ŠNEXTWBIAOPERMSS‚DC.Bƒ'PROTECTION�ERROR�WITH�''A''�OPTION�-�''E''�OPTION�ASSUMED'AOPERMSE‚EQU„*-1‰NEXTWBZ_TABLE:‰DC.L†0*œADDR�NEXT�ENTRY�TO�PROCESSZT_ZERO:‰NEXTWB‰DC.W†0*œ1ST�USER�NBR�(ZERO)ZT_LOU:‰DC.W†0*œ2ND�USER�NBR�(LOG�ON�USER)‰DC.W†-1*œTABLE�TERMINATORŠNEXTWBX00100:!‰DC.B†'NUMBER�FILES�RETRIEVED�=�'X00110: ‰DC.G†'†'X00198ƒEQU‡*-X00100X00199ƒEQU‡*-1*********************************ƒDIR�MESSAGE�-�ADDED�06/11/84******************************** HELPMSG‚EQU‡*>‰DC.B†'Command�format�:�DIR�[]�[,]'‰DC.B†'�[;]�' ‰DC.B†'‚'‰DC.B†'where�:�' ‰DC.B†'‚'8‰DC.B†'…input�field�and�output�field�may�be�any�file�or'‰DC.B†'�device�name‚' ‰DC.B†'‚';‰DC.B†'…optionsƒZ�-�outputs�names�of�all�files�controlled�'‰DC.B†'by�default�user'‰DC.B†'“and�user�0�' ‰DC.B†'‚'.‰DC.B†'�E�-�outputs�all�directory�information' ‰DC.B†'‚'3‰DC.B†'�A�-�outputs�all�directory�information�plus'‰DC.B†'�PSN''s�of')‰DC.B†'“FAB''s�and�data�blocks�in�file.�'‰DC.B†'Functions�as'+‰DC.B†'“option�E�if�user�is�not�user�0�or�'‰DC.B†'volume�owner�' ‰DC.B†'‚'/‰DC.B†'�Sƒ[=]�-�Arranges�DIR�'‰DC.B†'output�according�'/‰DC.B†'“to�user�number,�catalog,�filename,�and'‰DC.B†'�extension.�The'.‰DC.B†'“optional�number�of�files�is�specified'‰DC.B†'�when�the�number'-‰DC.B†'“of�files�in�the�listing�exceeds�the�'‰DC.B†'default�of�200�' ‰DC.B†'‚' ‰DC.B†'�H�-�Displays�this�list�'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***’ERROR�MESSAGE�PARAMETER�BLOCK**EM_PBLK: EM_DO:ƒDC.L†0"*œD0�-�IOS/FHS�RETURN�ERROR�STATUS*œ(ERROR�MSG�KEYVALUE) EM_A0:ƒDC.L†0"*œA0�-�ADDR�OF�I/O�PARAMETER�BLOCKEM_OPT:‚DC.B†0 *œFUTURE�USEEM_TLUN:�DC.B†0*œUSER�TERMINAL�LUN�-�(LDFLUN)EM_QRC:‚DC.B†0 *œFUTURE�USEEM_KLUN:�DC.B†0*œUSER�KEYBOARD�LUN�-(CDFLUN)EM_SPA:‚DC.L†0'*œSTART�ADDRESS�FOR�USER�TEXT�PLUG�POOLEM_EPA:‚DC.L†0%*œENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL‰PAGE ENDDATA‚EQU�*‰PAGE BEGPROCƒEQU„**<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<*************************************************************E *2*ˆ***‚PROCEDURE�SECTION�FOR�DIRECTORY�COMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************STARPROG EQU *‰LEA‡PBA(PC),A7*œA7=PROGRAM�BASE�ADDRESS�(PBA)&***************************************.*ˆ**ƒSAVE�DEFAULT�VALUE�PASSED�FROM�SYSTEM�****'***************************************=‰MOVEM.L�D0-D7/A0-A7,STSKNAM-PBA(A7)„SAVE�REG'S�AT�PROG�START**+*ˆD0�TO�STSKNAM�=�TASK�NAME�THAT�STARTED�ME*ˆD1�TO�SESNUM‚=�SESSION�NUM$*ˆD2�TO�VOLNAM‚=�DEFAULT�VOLUME�NAME*ˆD3�TO�USERNUM�=�USER�NUMBER*ˆD4�TO�CATNAM‚=�CATALOGUE�NAME*ˆD5�TO�CATNAM�+4**ˆD6�=‚LENGTH�OF�COMMAND�LINE)*ˆD7�=�BIT�MASK�OF�LOGICAL�UNITS�ASSIGNED*ˆA0�=�YOUR�TASK�NAME*ˆA1�=�TERMINAL�ID*ˆA2�=�ACTUAL�USER�NUMBER(*ˆA3�=�SYSTEM�VOLUME�DEFAULE(ALL�SPACES)*ˆA4�=�SYSTEM�USER�NUMBER*ˆA5�=�SYSTEM�CATALOGUE*ˆA6�=�SYSTEM�CAT�PART�2*‰PAGE**B*ˆLOGIC�TO�STORE�PREVIOUSLY�ASSEMBLED�ABSOLUTE�VALUES�IN�PARAMETER=*ˆBLOCKS�IN�THE�SAME�PARAMETER�BLOCKS�DYNAMICALLY�SO�POSITION+*ˆINDEPENDENT�CODE�(PIC)�CAN�BE�ESTABLISHED** ‰MOVE.L„A7,A6‰LEA‡PROGSTK(PC),A7*œA6=PROGRAM�BASE�ADDR�(PBA)*œA7=STACK�ADDRESS‰LEA‡SECBUF(PC),A0 ‰MOVE.L„A0,DSKIOS-PBA+IOSSAD(A6)-‰LEA‡DEVBUF(PC),A0•INSERTED�TO�CORRECT�SPR�89 ‰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)+*œSET�START�AND/OR�END�ADDRESS�IN�FOLLOWING*¦DSKIOS�PARAMETER�BLOCK*¦FETDEV�PARAMETER�BLOCK *¦SAVE�AREA‰LEA‡DIRBLK(PC),A0 ‰MOVE.L„A0,DSKFHS-PBA+FHSSIZ(A6)1*œSET�ADDR�FOR�DIRECTORY�BLOCK�IN�DSKFHS�PARM�BLK‰PAGE%**************************************+*ˆCONVERT�DATE�AND�STORE�IN�VERSION�MESSAGE*%*************************************ŠMOVE.L�#GTDTIM,D0ŠLEA„TIMBLK(PC),A0ŠTRAPƒ#1*œOBTAIN�TIME/DATE�FROM�SYSTEMŠMOVE.L�TIMBLK-PBA(A6),D0(ŠBSR„DATEOJ�CONVERT�ORDINAL�TO�GREGORIAN.ŠMOVE.L�D0,TMPDATE-PBA(A6)�SAVE�GREGORIAN�DATEŠAND.L‚#$FF,D0ŒMASK�TO�DAY ŠMOVE.L�#2,D1ŠLEA„VDATE+3(PC),A0,ŠBSR„BINDECFJ‹CONVERT�DAY�TO�ASCII�AND�STUFF&ŠMOVE.B�TMPDATE+2-PBA(A6),D0‡GET�MONTHŠLEA„VDATE(PC),A0.ŠBSR„BINDECFJ‹CONVERT�MONTH�TO�ASCII�AND�STUFFŠMOVE.W�TMPDATE-PBA(A6),D0‰YEARŠLEA„HOLDDATE(PC),A0+ŠBSR„BINDEC�CONVERT�YEAR�TO�ASCII�AND�STUFF*ŠMOVE.W�HOLDDATE+2-PBA(A6),VDATE+6-PBA(A6)9**********************************************************2*ˆCONVERT�TIME�OF�DAY�AND�STORE�IN�VERSION�MESSAGE*9*********************************************************,ŠMOVE.L�TIMBLK+4-PBA(A6),D1ˆMS�PAST�MIDNIGHTŠCLR.L‚D0‘HOUR�COUNTERTL1‡SUB.L‚#1000*60*60,D1&ŠBCS.S‚TL2�BRANCH�IF�HOURS�ALL�COUNTEDŠADD.L‚#1,D0ŽACCUMULATE�HOURS ŠBRA.S‚TL1/TL2‡ADD.L‚#1000*60*60,D1…TOTAL�#�HOURS�IS�IN�D0 ŠMOVE.L�D1,D3+ŠLEA„HOLDDATE(PC),A0ˆWHERE�TO�DEPOSIT�ASCII ŠMOVE.L�#2,D1,ŠBSR„BINDEC�CONVERT�HOUR�TO�BINARY�AND�STUFF(ŠMOVE.W�HOLDDATE+2-PBA(A6),VTIME-PBA(A6)&ŠDIVUƒ#60*1000,D3ˆ#�OF�MINUTES�IN�D3.W ŠCLR.L‚D0%ŠMOVE.W�D3,D0ŽNUMBER�OF�MINUTES�IN�D0ŠLEA„HOLDDATE(PC),A0 ŠMOVE.L�#2,D1.ŠBSR„BINDEC�CONVERT�MINUTES�TO�BNARY�AND�STUFF*ŠMOVE.B�HOLDDATE+2-PBA(A6),VTIME+3-PBA(A6)*ŠMOVE.B�HOLDDATE+3-PBA(A6),VTIME+4-PBA(A6) ŠCLR.W‚D3ŠSWAPƒD3(ŠDIVUƒ#1000,D3‹NUMBER�OF�SECONDS�IN�D3.W ŠMOVE.W�D3,D0ŠLEA„HOLDDATE(PC),A0 ŠMOVE.L�#2,D1/ŠBSR„BINDEC�CONVERT�SECONDS�TO�BINARY�AND�STUFF*ŠMOVE.W�HOLDDATE+2-PBA(A6),VTIME+6-PBA(A6).***********************************************'*ˆMOVE�REVISION�CODE�TO�VERSION�MESSAGE*.**********************************************&‰MOVE.L„REV_CODE-PBA(A6),V_NBR-PBA(A6)*‰MOVE.L„REV_CODE+4-PBA(A6),V_NBR+4-PBA(A6)"*œREVISION�CODE�TO�VERSION�MESSAGE‰LEA‡ZT_ZERO(PC),A0‰MOVE.L„A0,Z_TABLE-PBA(A6)2*œINITIALIZE�ADDR�PROCESS�NEXT�IN�"Z"�OPTION�TABLE‰MOVE.W„#-1,D0‰MOVE.W„D0,ZT_LOU-PBA(A6)3*œINITIALIZE�LOG�ON�USER�NBR�SAME�AS�TBL�TERMINATOR‰PAGE*�***„DRIVER‚BLOCK„******#************************************&*‰*****�CALL�COMMAND�PARSE�ROUTINE‚****#************************E ***************‰TST.L�REGD6-PBA(A6)…IS�COMMAND�LINE�EMPTY‰BNE.S�LBUFF‡NO‰MOVE.L�#0,A1„INIT�REG ‰MOVE.L�A1,A2*œA1=START�ADDR�OF�OUTPUT�FIELD*œA2=START�ADDR�OF�OPTION�FIELD‰BRA.S�SETNULL†GO�ASSGN�INPUT*LBUFF:)‰LEA�BUFFIN(PC),A0ƒSAVE�BUFFER�START�ADDR ‰BSR�PARSE‰TST.L�D0‡CK�F0R�ANY�ERR0RS‰BMI‡INVMSGRƒBR�IF�ERR0R#‰BTST.L�#22,D0ƒIS�NULL�INPUT�BIT�ON‰BEQ.S�CKDR1‡NO.SETNULL‚MOVE.B�#1,FLAGIN-PBA(A6)‚SET�NULL�FLAG6CKDR1„MOVE.L�A2,SAVEOPT-PBA(A6)‚SAVE�ADDR�OF�OPT�POINT*$**************************************ŠCK�FOR�ANY�OUTPUT*‚ZERO�IN�A1�MEANS�NO�OUTPUT*$**************************************'‰CMP.L�#0,A1‚A1�CONTAINS�ADDR�OF�OUTPUT4‰BNE.S�GETOUT†ASSIGN‚OUTPUT�IS�NOT�GOING�TO�TERMINAL"‰BSR�SETLU3†ASSIGN�LU3�TO�TERMINAL ‰BRA.S�GETOPT'GETOUTƒBSR�NEWOUT…DO�NEW�OUTPUT�ROUTINE*********************************************%*ˆ**�ROUTINE�TO�CHECK�FOR�OPTIONS�************************************************ GETOPTƒEQU�*/‰MOVE.L�SAVEOPT-PBA(A6),A2‚LOAD�ADDR�OF�OPTIONS ‰CMP.L�#0,A2#‰BEQ.S�DOINPUT‡NO�OPTIONS�INDICATED%‰BSR�CKFOROPT„GO�TO�CK�OPTION�ROUTINE/‰TST.B…FLAGH-PBA(A6)‡061184�-�WAS�H�OPTION�SET?$‰BNE‡LISTH�PRINT�HELP�LIST�IF�IT�WAS*+DOINPUT„BSR�INITIN†GO�TO�PROC�INPUT�ROUTINE*œINITIALIZE�PARAMETER�BLOCKS*¦INPUT�PARAMETER�BLOCK*¦ASSIGN�VOLUME�PARAMETER�BLOCK+‰TST.B�DFLAG-PBA(A6)‰PRINT�DEVICE�CONDITION‰BNE�CKTAB‡YES8**********************************************************“DO�FHS�CALL�FOR�I/O**9********************************************************** ‰CLR.L…D7,*œINITIALIZE�COUNTER�FOR�NBR�FILES�RETRIEVED6GETDIR„CLR.B‚CFLAG-PBA(A6)†INDICATE�NO�CONDIGUOUS�FILE-ŠTST.B‚FLAGLF-PBA(A6)…DO�WE�PRINT�LINE�FEEDS?ŠBEQ.S‚GD3�BRANCH�IF�NO;ŠTST.B‚PRNTFLG-PBA(A6)„DO�WE�PRINT�LINE�FEEDS�ON�THIS�PASS?)ŠBEQ.S‚GD2�BRANCH�IF�NO�(FIRST�TIME�THRU)GD1‡BSR„LNFEED�TWO�LINE�FEEDS ŠBSR„LNFEED9GD2‡MOVE.B�#1,PRNTFLG-PBA(A6)�MARK�AS�NOT�FIRST�TIME�THRU3GD3‡TST.B‚FLAGS-PBA(A6)†IS�SORTED�OPTION�SPECIFIED?ŠBEQ„GETDIR2ŒBRANCH�IF�NO*N*�A�SORTED�DIRECTORY�IS�REQUESTED.‚IF�THIS�IS�THE�FIRST�TIME�THROUGH,�ALLOCATEE*ƒA�SEGMENT�AND�FILL�IT�WITH�ALL�THE�SORTED�DIRECTORY�ENTRIES�USING�AI*ƒLINEAR�LINKED�LIST�STRUCTURE.‚IF�THIS�IS�NOT�THE�FIRST�TIME�THRU,�FETCHF*ƒTHE�NEXT�DIRECTORY�ENTRY�FROM�THE�LINKED�LIST,�MOVE�IT�TO�DIRBLK�AND*ƒPROCEED�AS�NORMAL.*2ŠTST.B‚SFIRST-PBA(A6)…IS�THIS�THE�FIRST�TIME�THRU?ŠBNE„GT500ŽBRANCH�IF�NO*'* FIRST TIME THRU, ALLOCATE NEW SEGMENT5ŠMOVE.B�#1,SFIRST-PBA(A6)‚MARK�AS�NOT�FIRST�TIME�THRU2ŠMOVE.L�FILCNT-PBA(A6),D1ŠNUMBER�OF�FILES�EXPECTED)ŠMULUƒ#FDLEN+8,D1ˆCOMPUTE�SIZE�OF�SEGMENT.*œ+8�IS�FOR�INTERNAL�USE�I.E.�LINKAGE�POINTERS+ŠMOVE.L�D1,SEGLGH-PBA(A6)‚LENGTH�OF�SEGMENT‰BSET†#13,SEG_OPTS-PBA(A6)/*œSET�OPTION�FOR�OPERATING�SYSTEM�TO�ALLOCATE�A**œSEGMENT�WHOSE�LOGICAL�ADDRESS�EQUALS�THE*œPHYSICAL�ADDRESSŠLEA„ALLOCSEG(PC),A0"ŠMOVE.L�#GTSEG,D0ŠALLOCATE�SEGMENTŠTRAPƒ#1 ‰BNE‡IOERPRT"*œJMP�IF�ALLOCATION�ERROR�OCCURRED*G* COLLECT ENTIRES, ENTER THEM IN SORTED ORDER INTO A LINKED LIST IN THE*ƒNEWLY�ALLOCATED�SEGMENT* ‰MOVE.L„A0,A4*œA4=ADDR�OF�ALLOCATED�SEGMENT*ŸFIRST�ENTRY�POSITIONŠCLR.L‚ROOT-PBA(A6)‡LIST�HEADGT15: ‰BSR‡FETCH_DE*œFETCH�NEXT�DIRECTORY�ENTRY%ŠBEQ.S‚GT20�BRANCH�ON�SUCCESSFUL�CALLŠCMP.B‚#FSTAEOD,D0ˆEND�OF�DATA?%ŠBEQ.S‚GT400ŽBRANCH�IF�WE�GOT�'EM�ALLŠBRA„IOERPRTŒBRANCH�ON�ERROR"GT20†EQU„*’COME�HERE�FOR�NEW�ENTRY<ŠCMP.L‚FILCNT-PBA(A6),D7ŠHAVE�WE�EXCEEDED�THE�MAXIMUM�FILE�CŠBCS.S‚GT25�BRANCH�IF�NO‰LEA‡FILMAXS(PC),A08ŠMOVE.L�A0,SADIO-PBA(A6)…COMPLAIN�OF�FILE�LIMIT�EXCEEDED‰LEA‡FILMAXE(PC),A0ŠMOVE.L�A0,EADIO-PBA(A6)ŠIOSCALL�OUT6IOS(PC)‰MOVE.W„#$C000,TERM_FLG-PBA(A6)"*œSET�TYPE�OF�TERMINATION�TO�ERROR ‰BRA‡TERMINAT*œTERMINATE�TASK8GT25†TST.L‚ROOT-PBA(A6)‡SEE�IF�ANYTHING�IN�THE�CHAIN�YET0ŠBNE.S‚GT50�BRANCH�IF�WE�HAVE�AT�LEAST�ONE�ENTRY'ŠBSR.S‚MOVENTRY‹MOVE�ENTRY�INTO�SEGMENT'ŠMOVE.L�A4,ROOT-PBA(A6)„LINK�UP�TO�ROOT>GT30†LEA„FDLEN+8(A4),AF 4…POSITION�TO�NEXT�FREE�SPACE�IN�SEGMENT2ŠADD.L‚#1,D7ŽBUMP�COUNT�OF�FILES�WE�HAVE�PROCESSEDŠBRA„GT15�GO�FOR�ANOTHER�ENTRY=�OLD(ŠBRA„GT60�ADVANCE�A2�TO�CHECK�NEXT�ENTRY,GT80†BSR.S‚MOVENTRY‹MOVE�NEW�ENTRY�INTO�LIST,ŠMOVE.L�A1,(A4)ŒLINK�NEXT�ENTRY�TO�NEW�ENTRY1GT90†MOVE.L�A4,(A2)ŒLINK�NEW�ENTRY�TO�PRIOR�ENTRY ŠBRA„GT30/GT100…BSR.S‚MOVENTRY‹MOVE�ENTRY�TO�END�OF�CHAIN ŠBRA„GT90*6* GOT ALL DIRECTORY ENTRIES SORTED (LINKED) IN SEGMENT;GT400…MOVE.L�ROOT-PBA(A6),RLINK-PBA(A6)�SET�UP�RUNNING�LINK*K*�MOVE�ENTRY�FROM�LINKED�LIST�INTO�DIRBLK�BUFFER.‚IF�NO�MORE�ENTRIES�BRANCH *ƒTO�CKTOT. GT500…EQU„*4ŠTST.L‚RLINK-PBA(A6)†ARE�WE�AT�THE�END�OF�THE�CHAIN?ŠBEQ„CKTOTŽBRANCH�IF�YES ‰MOVE.L„A6,A0*œA0=PBA%ŠMOVE.L�RLINK-PBA(A6),A4‹RUNNING�LINK/ŠMOVE.L�(A4),RLINK-PBA(A6)�ADVANCE�RUNNING�LINK/ŠLEA„8(A4),A4‹BYPASS�LINK�...�MOVE�FROM�ADDRESSCGT550…MOVEM.L�(A4)+,A6/D0-D6„MOVE�A�TOTAL�OF�$3C=60�BYTES�(15�REGS) ŠMOVEM.L�A6/D0-D6,DIRBLK-PBA(A0)ŠMOVEM.L�(A4)+,D0-D6 ŠMOVEM.L�D0-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)�CLEAR�NEXT�LINK$ŠLEA„DIRBLK(PC),A3ŠMOVE�FROM�ADDRESS ŠLEA„8+32(A4),A5ˆMOVE�TO�ADDRESS>ŠMOVEM.L�(A3)+,A6/D0-D6„MOVE�A�TOTAL�FO�$3C=60�BYTES�(15�REGS)ŠMOVEM.L�A6/D0-D6,-(A5) ŠLEA„8+60(A4),A5ˆMOVE�TO�ADDRESSŠMOVEM.L�(A3)+,D0-D6ŠMOVEM.L�D0-D6,-(A5)‰LEA‡PBA(PC),A6*œA6=PBAŠRTS*GETDIR2: ‰BSR‡FETCH_DE*œFETCH�NEXT�DIRECTOR�ENTRY‰BEQ.S…GETDIR3*œJMP�IF�GOOD�RETURN‰CMP.B�#FSTAEOD,D0‚END�OF�DATA‰BEQ.S�CKTOTˆEND�OF�RUN‰BRA�IOERPRTˆERR0RGETDIR3: ‰ADD.L…#1,D7*œD7=NBR�OF�FILES�RETRIEVEDDOBLDL:‰LEA‡PBA(PC),A6*œA6=PBA#‰BSR�BUILDLINƒBR�TO�BUILD�DATA�LINE$‰TST.B�RFLAG-PBA(A6)„RETURN�FLAG�SET‰BEQ.S�CKFLG‡NO*‰MOVE.B�#0,RFLAG-PBA(A6)ƒCLEAR�RETURN�FLAG‰BRA�GETDIR†GET�NEXT�ENTRY*'*****************************************ˆ**CK�FOR�EXTENDED�OPTION�*****'****************************************(CKFLG„TST.B�FLAGE-PBA(A6)�EXT�OPTION�SET‰BEQƒGETDIR„BRANCH�IF�NO%‰BSR�BLDEXTL…GO�TO�EXTEND�LINE�OPTION**ˆCK�FOR�OPTION�A+TSTOPTA‚TST.B�FLAGA-PBA(A6)ƒADDR�OPTION�SET‰BEQƒGETDIR†NO ‰BSR�OPTIONA ‰BRA�GETDIR*8* IF THIS WAS 'A' OPTION, PRINT THE TOTAL SPACE CONSUMED+CKTOT…TST.B‚FLAGA-PBA(A6)†WAS�THIS�OPTION�AŠBEQ.S‚STOPIT�BRANCH�IF�NO$ŠMOVE.L�TOTSIZ-PBA(A6),D0ŠTOTAL�SIZE**ˆCONVERT�TO�ASCII*&‰MOVE.B�#8,D1„PRINT�LINE�SIZE�FOR�CONV%‰LEA�TFABLMC(PC),A0‚ADDR�OF�REC�FIELD ‰BSR�BINDECFJ„GO�TO�CONV�ROUTINE2‰MOVE.L�TOTSIZ-PBA(A6),D0�RESET�REG�WITH�TOT�VALUE%‰LEA�TFABLMH(PC),A0‚ADDR�OF�REC�FIELD&‰MOVE.L�#'0ƒ',(A0)‚BLANK�RECEIVE�FIELD‰MOVE.L�#'„',4(A0) ‰MOVE.L�#8,D1‰MOVE.W�#$2000,D2‚INITTHLCU1ƒROL.L�#4,D0†GET�4�BITS‰MOVE.B�D0,D2„SAVE�D0)‰AND.B�#$F,D2„CLEAR�ALL�EXCEPT�LOW�4�BITS"‰ADD.B�#$20,D2ƒSET�FOR�SPACE�CHECK ‰CMP.W�#$2020,D2‚LEADING�SPACE�?‰BEQ.S�THLCU3„YES‰ADD.B�#$10,D2ƒCONVERT�TO�NUM‰CMP.B�#$39,D2ƒIS�IT�A�NUM‰BLE.S�THLCU2„YES‰ADD.B�#7,D2…GET�TO�LETTERSTHLCU2ƒMOVE.B�D2,(A0)+THLCU3ƒASL.W�#8,D2†MOVE�WORD‰SUB.B�#1,D1…REDUCE�COUNT‰BHI�THLCU1†BR�NOT�ZERO‰LEA‡TFABLM(PC),A0.‰MOVE.L�A0,OUT3IOS-PBA+IOSSAD(A6)‚START�OF�MSG‰LEA‡TFABLME(PC),A0,‰MOVE.L�A0,OUT3IOS-PBA+IOSEAD(A6)‚END�OF�MSG‰OUT3PƒOUT3IOS(PC) ‰BNE‡IOERPF RT** *ˆSTOP�THE�PROGRAM�AT�THIS�POINTSTOPIT:‰CLR.W…TERM_FLG-PBA(A6)2*œINITIALIZE�TERMINATE�FLAG�FOR�NORMAL�TERMINATION ‰BSR‡LNFEED ‰BSR‡LNFEED$*œLINE�FEED�PRIOR�TO�WRITING�MESSAGE ‰MOVE.L„D7,D0*œD0=NBR�FILES�RETRIEVED ‰BEQ.S…ITSTOP*œJMP�IF�NO�FILES�RETRIEVED ‰MOVE.L„#6,D1 *œD1=MAX�NBR�CHTRS�TO�CONVERT�TO‰LEA‡X00110(PC),A0*œA0=ADDR�STORE�CONVERTED�DATA ‰BSR‡BINDECFJ**œCONVERT�NBR�FILES�RETRIEVED�TO�DEC�ASCII‰LEA‡X00100(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSSAD(A6)‰LEA‡X00199(PC),A0!‰MOVE.L„A0,OUT3IOS-PBA+IOSEAD(A6)1*œSET�MESSAGE�START/END�ADDR�TO�IOS�PARAMETER�BLK‰OUT3P…OUT3IOS(PC)$*œOUTPUT�NBR�FILES�RETRIEVED�MESSAGEITSTOP:+‰TST.B�FLAG1-PBA(A6)†WAS�ONE�ITEM�PRINTED�?‰BNE.S…STOPITTƒYES‰CLR.B�FLAG1-PBA(A6)‰LEA‡NOMSG(PC),A4/‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)…START�ADDRESS‰LEA‡NOMSGE(PC),A4-‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)…ENDƒADDRESS‰OUT3P…OUT3IOS(PC),‰MOVE.W„#$1000,TERM_FLG-PBA(A6)‡SEND�WARNINGSTOPITT: ‰BRA‡TERMINAT‰PAGE** *ˆRTNE�TO*’FETCH�NEXT�DIRECTORY�ENTRY**ˆIF�"Z"�OPTION�SPECIFIED*�AND�END�OF�DATA�RETURN�EXIST-*’AN�ADJUSTMENT�WILL�BE�MADE�TO�FIND�THE�NEXT2*’USER�NBR�UNTIL�THE�"Z"�OPTION�TABLE�IS�PROCESSED** FETCH_DE:‰LEA‡DSKFHS(PC),A0 *œA0=ADDRESS�FHS�PARAMETER�BLOCK‰MOVE.W„#FHFDEN,FHSCMD(A0)+*œSET�FETCH�DIRECTORY�ENTRY�CMD�IN�PARM�BLK ‰FHSCALLƒ(A0)*œFETCH�DIRECTORY�ENTRY‰CMP.B…#1,FLAGZ-PBA(A6)‰BNE.S…FDE_0100!*œJMP�IF�"Z"�OPTION�NOT�SPECIFIED‰CMP.B…#FSTAEOD,D0‰BEQ.S…FDE_0200*œJMP�IF�END�OF�DATA FDE_0100:‰LEA‡DSKFHS(PC),A0*œA0=ADDR�FHS�PARAMETER�BLOCK ‰TST.L…D0**œRESTORE�STATUS�TO�SAME�AS�AFTER�FHS�CALL‰RTS FDE_0200:‰MOVE.L„Z_TABLE-PBA(A6),A0(*œA0=ADDR�OF�NEXT�TABLE�ENTRY�TO�PROCESS ‰TST.W…(A0)‰BMI.S…FDE_0100#*œJMP�IF�"Z"�OPTION�TABLE�PROCESSED‰MOVE.W„(A0)+,D0*œD0=USER�NBR�TO�PROCESS�NEXT‰MOVE.L„A0,Z_TABLE-PBA(A6)%*œA0=ADDR�NEXT�TABLE�ENTRY�TO�PROCESS‰LEA‡DSKFHS(PC),A0*œA0=ADDR�FHS�PARAMETER�BLOCK‰MOVE.W„D0,FHSUSN(A0)*œSET�NEXT�USER�NBR�TO�PROCESS‰BRA.S…FETCH_DE2*œFETCH�NEXT�DIRECTORY�ENTRY�WITH�THE�NEW�USER�NBR‰PAGE>****************************************************************ˆ****ƒOPTIONS�ROUTINE�CALL‚****4*ˆTHIS�ROUTINE�WILL�CK�INPUT�TO�DETERMINE�IF�OPTIONS+*ˆHAVE�BEEN�REQUESTED.�OPTION�FLAGS�ARE�SET*?****************************************************************CKFOROPT‚EQU�* ‰BSR�OPTION#‰BTST�#6,D0†CK�FOR�CARR�RETURN�FLAG'‰BNE.S‚ENDOPT†EXIT�-�CARRAGE�RET�BIT�ON)OPTERCK:�BTST�#7,D0†CK�FOR�ERR0R�BITS�SET)‰BNE‡INVMSGR†FOUND�INVALID�FLAG�CONDITION0OPTOK„TST.L�D1ˆIS�LETTER�IN�D1�WITH�A�MINUS�SIGN‰BMI.S…CKFOROPTŒYES"*œJMP�IF�"NOT�OPTION"�IS�SPECIFIED+*œIT�WILL�BE�IGNORED�AND�NEXT�CHTR�OBTAINED*+********************************************/*‰***�CK�FOR�E�(PRINT�ALL�ATTRIBUTES)�OPTION�***,*********************************************‰CMP.B�#'E',D1ƒE�OPTION�SET‰BEQ.S�SETEˆYES*.***********************************************/*ˆ**�CK�FOR�A�(PRINT�SEGMENT�ADDRESS�OPTION)�***.***********************************************CKFORAƒCMP.B�#'A',D1ƒA�OPTION‰BEQ.S�SETAˆYES*-************************************************ˆ**�CK�FOR�S�(SORTED�DIRECTORY�OPTION)�***-**********************************************CKFORS„CMP.B‚#'S',D1ŒS�OPTION?ŠBEQ.S‚SETS�BRANCH�IF�YES-***********************************************ˆ061184*ˆ**�CK�FOR�H�(HELP�OPTION)�***-**********************************************CDFORHƒCMP.B…#'H',D1ŠH�OPTION?‰BEQ.S…SETH�PRINT�LIST�IF�YES-**********************************************,*ˆ**�CK�FOR�Z�(PRINT�SYSTEM�FILES)�OPTION�***-*********************************************)CKFORZƒCMP.B�#'Z',D1ƒCK�FOR�SYSTEM�OPTION%‰BNE.S…INV_OPTƒERROR�NOT�VALID�OPTION(‰MOVE.B�#1,FLAGZ-PBA(A6)‚SET�SYSTEM�FLAG‰BRA.S�CKFOROPT**"***********************************@*‰**�BIT�6�IN�D0�SET�MEANS�THE�CARRAGE�RETURN�IS�THE�NEXT�CHAR�**"****************************G *******0SETA†MOVE.B�#1,FLAGA-PBA(A6)�SET�SYSTEM�ALL�FLAG.SETE…MOVE.B�#1,FLAGE-PBA(A6)‚SET�E�OPTION�FLAG3ŠMOVE.B�#1,FFLAG-PBA(A6)�SET�PRINT�DETAIL�LINE�FLAG,ŠMOVE.B�#1,FLAGLF-PBA(A6)�SET�LINE�FEED�FLAG‰BRA.S…CKFOROPT.SETS†MOVE.B�#1,FLAGS-PBA(A6)ƒSET�S�OPTION�FLAG#ŠBTSTƒ#4,D0ŽWAS�A�NUMBER�SPECIFIED?‰BEQ.S…CKFOROPT‰BRANCH�IF�NO5ŠMOVE.L�D3,FILCNT-PBA(A6)‚SAVE�COUNT�OF�FILES�TO�SORT‰BRA.S…CKFOROPT**************************** *‡061184�-�ADDED�FOR�HELP�OPTION****************************SETH…MOVE.B„#1,FLAGH-PBA(A6)‰BRA.S…CKFOROPT* ENDOPTƒRTSŒ.‚RETURN�FROM�ROUTINEINV_OPT:‰MOVE.L„#EM_NVO,D0)*œD0=KEY�VALUE�FOR�INVALID�OPTION�MESSAGE ‰BRA‡IOERPRT‰PAGE/************************************************)*ˆ***‚SET�UP�FHS�PARM�BLOCK�FOR�INPUT�****7*ˆTHIS�ROUTINE�WILL�INITIALIZE�THE�INPUT�FILE�PARAMETER!*ˆBLOCK�AND�ASSIGN�THE�DIR�VOLUMN*/************************************************INITIN: ‰MOVE.L„A6,A3*œA3=PBA%‰LEA‡BUFFIN(PC),A0‚ADDR�OF�START�SCAN)‰LEA‡DSKFHS(PC),A6‚ADDR�OF�FHS�PARM�BLOCK*‰MOVE.L�VOLNAM-PBA(A3),FHSVOL(A6)‚VOL�NAME4‰MOVE.W�USERNUM-PBA(A3),FHSUSN(A6)‚USE�LOG�ON�USER�#+‰MOVE.L�CATNAM-PBA(A3),FHSCLG(A6)‚CATALOGUE%‰MOVE.L�CATNAM+4-PBA(A3),FHSCLG+4(A6).‰MOVE.L�AST-PBA(A3),FHSFIL(A6)‚AST�2�FILE�NAME ‰MOVE.L�AST-PBA(A3),FHSFIL+4(A6)3‰MOVE.W�AST-PBA(A3),FHSEXT(A6)‚AST�2�EXTENSION�NAME**‰CHECK�FOR�NULL�INPUT*‰TST.B�FLAGIN-PBA(A3)+‰BEQ.S�INITEDIT†JMP�IF�INPUT�FILE�SPECIFIED‰LEA‡DALL(PC),A0‚INIT�POINTER*œFORCE�A�COMMAND�LINE�OF�*.*CR*&****************************************ˆ**ƒCALL�EDITFILE�ROUTINE�***&*************************************** INITEDIT:!‰BSR�EDITFILE„MAKE�EDIT�FILE�CALL‰BMI‡INVMSGR‡ERR0R‰LEA‡PBA(PC),A3*œA3=PBA‰BTST�#1,D0‡WAS�DEVICE�BIT�SET‰BEQ.S�INITIN2ˆNO*ˆSET�DEVICE�FLAG.‰MOVE.B�#1,DFLAG-PBA(A3)‚SET�PRINT�DEVICE�INFO ‰BRA‡INITINO*2**************************************************8*ˆCK�FOR�*�IN�USER�NUMBER�FIELD�IF�YES�TURN�OFF�Z�OPTION2*ˆEDITFILE�ROUTINE�PUT�-2�IN�PARM�IF�*�WAS�PRESENT2**************************************************0INITIN2‚CMP.W�#-2,FHSUSN(A6)‚ALL�IN�USER�#�FIELD‰BNE.S�INITINA…NO!‰CLR.B�FLAGZ-PBA(A3)…Z�OPTION�OFF‰BRA.S�INITINB INITINA‚EQU�*.‰TST.B�FLAGZ-PBA(A3)…WAS�ZERO�(SYSTEM)�FLAG�ON‰BEQ.S�INITINBƒNO‰MOVE.W„FHSUSN(A6),D0*œD0=DEFAULT�USER�NBR ‰TST.W…D0‰BEQ.S…INITINAA *œJMP�IF�DEFAULT�USER�NBR�=�ZERO‰MOVE.W„D0,ZT_LOU-PBA(A3)/*œESTABLISH�LOG�ON�USER�NBR�IN�"Z"�OPTION�TABLE INITINAA:‰MOVE.L„Z_TABLE-PBA(A3),A0(*œA0=ADDR�OF�NEXT�TABLE�ENTRY�TO�PROCESS‰MOVE.W„(A0)+,FHSUSN(A6)3*œSET�USER�NBR�PROCESS�NEXT�(FIRST)�IN�FHS�PARM�BLK‰MOVE.L„A0,Z_TABLE-PBA(A3)'*œSAVE�ADDR�NEXT�TABLE�ENTRY�TO�PROCESS* INITINB‚EQU�**ŠASSIGN�DIR�VOL‚***5*ˆCOMMAND,�VOL�NAME�AND�LU�#�ARE�SET�UP�IN�PARM�BLOCK**‰LEA�VOLFHS(PC),A0'‰MOVE.L�#'„',FHSCLG(A0)‚BLANK�CATALOGUE‰MOVE.L�#'„',FHSCLG+4(A0)+‰MOVE.L�FHSVOL(A6),FHSVOL(A0)‚MOVE�VOL�NAME'‰MOVE.L�#'„',FHSFIL(A0)‚BLANK�FILE�NAME‰MOVE.L�#'„',FHSFIL+4(A0)'‰MOVE.W�#'‚',FHSEXT(A0)‚BLANK�EXTENSION* ‰FHSCALL�(A0)'*Š**‚RETURN�FROM�FILE�HANDLER�SYSTEM�**‰BNE�IOERPRTˆERR0R8‰MOVE.L�FHSVOL(A0),NOMSGVOL-PBA(A3)‚SAVE�VOL�NAME�IN�MSG*;* TEST FOR PROTECTION CODE ERROR IF 'A' OPTION WAS SELECTED-ŠTST.B‚FLAGA-PBA(A3)†WAS�'A'�OPTION�SELECTED?ŠBEQ.S‚INITINOŒBRANCH�IF�NO.ŠLEA„DSKIOS(PC),A0ŠI/O�PARAMETER�BLOCK�ADDRESS)ŠCLR.L‚IOSRRN(A0)‰TRY�TO�READ�SECTOR�ZERO2ŠMOVE.W�IOSOPT(A0),-(A7)ƒSAVE�PREVIOUS�OPTION�BITS‰LEA‡SECBUF(PC),A6*œA6=START�ADDRESS:ŠMOVE.W�#IOPRAN+IOPWAT+IOPIMG,IOSOPT(A0)�RANDOM�BLOCK�READ,ŠMOVE.L�A6,IOSSAD(A0)�STARTING�SECTOR�NUMBER‰LEA‡SECBUFE(PC),A6*œA6=END�ADDRESS*ŠMOVE.L�A6,IOSEAD(A0)�ENDING�SECTOR�NUMBER ŠIOSCALL�(A0)ŽTRY�TO�DO�THE�READ1ŠMOVE.W�(A7)+,IOSOPT(A0)ƒRESTORE�PREVIOUS�OPTIONS2ŠCMP.B‚#ISTAPC,D0‰DID�WE�GET�A�PROTECT�CODE�ERROR?ŠBNE.S‚INITINOŒBRANCH�IF�NO‰LEA‡AOPERMSS(PC),A6*œA6=START�ADDR8ŠMOVE.L�A6,SADIO-PBA(A3)„TELL�THEM�'A'�OPTIOG N�WON'T�WORK‰LEA‡AOPERMSE(PC),A6 *œA6=END�ADDRŠMOVE.L�A6,EADIO-PBA(A3)ŠIOSCALL�OUT6IOS(PC)'ŠCLR.B‚FLAGA-PBA(A3)†CLEAR�THE�'A'�FLAG INITINO‚EQU�*‰LEA‡PBA(PC),A6*œA6=PBA‰RTSŽ.�RETURN�FROM�ROUTINE‰PAGE.***********************************************"*ˆ**�BUILD�DIRECTORY�PRINT�LINE‚****�FILE�NAME�ONLY*0************************************************BUILDLIN EQU *,‰LEA�DIRBLK(PC),A4�SET�UP�DIR�PAR�BLOCK�ADDR‰CMP.B�#1,FLAGZ-PBA(A6)&‰BEQƒCKSYS‰JMP�IF�"Z"�OPTION�SPECIFIED2BLD1…MOVE.L�NOMSGVOL-PBA(A6),VOLPRT-PBA(A6)‚VOLUMEN*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>)‰IF.BƒFDCLG(A4)��#$20�THEN.Sœ05/07/84:‹MOVE.L�#'&ƒ',L1CAT-PBA(A6)‚Show�that�it�is�a�NULL�catalog‰ELSE.S.‹MOVE.L�FDCLG(A4),L1CAT-PBA(A6)‚MOVE�CATALOGUE‰ENDI¹05/07/84N*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#‰MOVE.L�FDCLG+4(A4),L1CAT+4-PBA(A6)* *ˆUSER�NUMBER* ‰CLR.L�D0‰MOVE.W�FDUSN(A4),D0+‰LEA�L1USN(PC),A0„USER�NUMBER�CONV�TO�ASCII ‰BSR�BINDEC*)‰MOVE.L�FDFIL(A4),L1FIL-PBA(A6)‚FILE�NAME#‰MOVE.L�FDFIL+4(A4),L1FIL+4-PBA(A6)*5‰MOVE.W�FDEXT(A4),L1EXT-PBA(A6)‚1ST�CHAR�OF�EXTENSION**‰LEA‡PRTBUF(PC),A10‰MOVE.L„A1,OUT3IOS-PBA+IOSSAD(A6)‚MSG�START�ADDR!‰LEA�DIRMSG(PC),A1„LOAD�SEND�ADDR ‰LEA�PRTBUF(PC),A2ƒLOAD�REC�ADDR‰MOVE.L�#DIRMSGL,D1*™D1=LENGTH�OF�MSG%*žEND�OF�MSG�ADDR�IS�SET�UP�IN�SPCOMP ‰BSR.S�SPCOMP†CALL�SPACE�REMOVER*2***************************************************$*ˆ**‚PRINT�FIRST�LINE�WITH�VOLUME�ID*2***************************************************‰TST.BƒFFLAG-PBA(A6)-ŠBEQ.S‚BLD5�BRANCH�IF�NO�DETAIL�LINE�TO�PRINT'ŠMOVE.L�LNCNT-PBA(A6),A0‹EJECT�PAGE�...%ŠADD.L‚#4,A0Ž...�IF�WE�CANNOT�FIT�...*ŠTST.B‚FLAGA-PBA(A6)†...�FIRST�PART�OF�...&ŠBEQ.S‚BLD2�...�DETAIL�INFORMATION�...#ŠADD.L‚#4,A0Ž...�ON�THE�CURRENT�...%BLD2†CMP.L‚ROWCNT-PBA(A6),A0Š...�PAGE ŠBLS.S‚BLD5 ŠBSR„EJECTBLD5:ŠOUT3P‚OUT3IOS(PC)*‰BNE‡IOERPRTˆERR0R/‰TST.BƒFFLAG-PBA(A6)†DO�WE�PRINT�DETAIL�HEADER?‰BEQ.SƒBLD6�BRANCH�IF�NO!‰BSR.SƒPRTDET�PRINT�DETAIL�HEADER**9BLD6…MOVE.B�#1,FLAG1-PBA(A6)‚SET�PRINT�AT�LEAST�ONCE�FLAG**BLDLINE‚RTSŒ.�RETURN�FROM�BUILDLIN�ROUTINE‰PAGE********************************ˆCHECK�FOR�SYSTEM�ROUTINE***************************** CKSYS„EQU�*$‰TST.W�SDBUSN(A4)‚IS�THIS�A�0�USER�# ‰BEQ�BLD1‰MOVE.W�USERNUM-PBA(A6),D1$‰CMP.W�SDBUSN(A4),D1‚LOG�ON�USER�NUM ‰BEQ�BLD1ˆYES *ŠRFLAG�SET�MEANS�THIS�IS�A�FILE*ŠTHAT�SHOULD�NOT�BE�PROCESSED$‰MOVE.B�#1,RFLAG-PBA(A6)‚RETURN�FLAG ‰RTS‘EXIT*,**********************************************ˆSUB�ROUTINE�TO�SPACE�COMPRESS&*ŠA1�CONTAINS�THE�SENDING�LINE�ADDRESS(*ŠA2�CONTAINS�THE�RECEIVING�LINE�ADDRESS,*ŠD1�CONTAINS�THE�LENGTH�OF�THE�SENDING�LINE*,*********************************************"SPCOMP…CMP.B�#'�',(A1)‚IS�IT�BLANK‰BEQ.S�SPCOMP3ˆYES&‰MOVE.B�(A1)+,(A2)+‚MOVE�TO�PRINT�LINE"BLDECK„SUB.W�#1,D1…IS�THIS�THE�END‰BGE�SPCOMPˆNO‰SUB.L�#1,A2…ESTABLISH�END-‰MOVE.L�A2,OUT3IOS-PBA+IOSEAD(A6)‚END�OF�DATA ‰RTS�RETURN*$SPCOMP3…ADD.W�#1,A1‡INC�ADDR�OF�SEND ‰BRA�BLDECK**2***************************************************4*ˆSUB�ROUTINE�TO�PRINT�HEADER�LINES�1�&�2�FOR�DETAIL*2***************************************************PRTDET:‰MOVE.L„A4,-(A7) *œSAVE�REG‰LEA‡HDET1(PC),A42‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)‚START�OF�HEADER1‰LEA‡HDET1E(PC),A4%‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)‚END‰OUT3PƒOUT3IOS(PC)ƒPRINT�LINE�1*‰LEA‡HDET2(PC),A41‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)‚HEAD�DET�LINE�2‰LEA‡HDET2E(PC),A4%‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)‚END)‰OUT3PƒOUT3IOS(PC)‚PRINT�LINE�2�OF�HEADER*‰MOVE.L„(A7)+,A4 *œRESTORE�REG ‰RTSŒ.�RETURN*‰PAGE0************************************************* *ŒOPTION�H*†PRINT�HELP�MESSAGE*Š061184*0*************************************************LISTH„LEA‡HELPMSG(PC),A2”START�OF�HELP�MSG)‰LEAH ‡HELPLEN(PC),A1”TABLE�OF�LINE�LENGTHS?PLINE„MOVE.L„A2,OUT3IOS-PBA+IOSSAD(A6)…STORE�LINE�START�ADDRESS&‰ADDA.W„(A1)+,A2–ADD�LENGTH�OF�MESSAGE8‰MOVE.L„A2,OUT3IOS-PBA+IOSEAD(A6)…STORE�LINE�END�ADDRESS$‰OUT3P…OUT3IOS(PC)“PRINT�THE�MESSAGE'‰ADDA.W„#1,A2™POINT�A2�TO�START�OF�LINE$‰TST.W…(A1)šCHECK�FOR�END�OF�MESSAGE ‰BNE.S…PLINE™PRINT�THE�NEXT�LINE/‰CLR.W…TERM_FLG-PBA(A6)ŽSET�CODE�FOR�NORMAL�END‰BRA‡TERMINAT–EXIT�PROGRAM‰PAGE0************************************************* *ŒOPTION�E*ˆBUILD�EXTENDED�DISPLAY�LINE*0************************************************** BLDEXTL‚EQU�**+‰LEA�DIRBLK(PC),A4ƒINIT�DIR�PARM�BLOCK�ADDR*$*************************************ˆCHECK�FOR�CONTIGUOUS�FILE *********************************‰MOVE.B�FDATT(A4),D0‚SAVE�BYTE#‰AND.B�#DFTBIT,D0‚REMOVE�OTHER�BITS+‰CMP.B�#DATCON,D0‚CK�FOR�CONTIGUOUS�SETTING‰BNE.S�PROCNONC'‰BSR�CONTIG†GO�TO�CONTIGUOUS�PROCESSING&‰BRA�COMMON†CONTINUE�COMMON�PROCESSING*,**********************************************ˆPROCESS�NON�CONTIGUOUS�FILE*,*********************************************PROCNONC EQU ***0************************************************)*ˆATTRIBUTES�(MUST�BE�1ST�IN�THIS�ROUTINE%*“OR�D0�MUST�BE�RESETWITH�FDATT(A4)�)0*************************************************‰MOVE.L�#'„',DATT-PBA(A6)‚INIT/‰CLR.B�CFLAG-PBA(A6)�CLEAR�CONTIGUOUS�FILE�FLAG"‰CMP.B�#DATSEQ,D0‚IS�IT�SEQUENTIAL‰BNE.S�PAT1ˆNO-‰MOVE.W�#'�S',DATT-PBA(A6)‚MOVE�SEQ�INDICATIO ‰BRA.S�PNONFE* *********************************ˆKEYED�ISAM�WITH�NO�DUP�KEYS *********************************&PAT1…CMP.B�#DATISK,D0‚IS�IT�KEYED�ISAM‰BNE.S�PAT2ˆNO3‰MOVE.W�#'IK',DATT-PBA(A6)‚KEYED�ISAM�-�NO�DUP�KEYS ‰BRA.S�PNONFE******************************** *ˆKEYED�ISAM�WITH�DUPLICATE�KEYS********************************PAT2…CMP.B�#DATISD,D0‰BNE.S�PNONFEˆNOT�KEYED3‰MOVE.W�#'ID',DATT-PBA(A6)‚KEYED�ISAM�WITH�DUP�KEYS**)*****************************************!*ˆLAST�FAB�PHYSICAL�SECTOR�NUMBER)******************************************PNONFEƒMOVE.L�FDFE(A4),D0 ‰MOVE.L�#6,D1‰LEA�DFE-1(PC),A0 ‰BSR�BINHEX*+********************************************ˆLOGICAL�SECTOR�END�OF�FILE+********************************************‰MOVE.L�FDEOF(A4),D0 ‰MOVE.L�#5,D1‰LEA�DLOG(PC),A0&‰MOVE.B„BLANK1S-PBA(A6),DLOG-1-PBA(A6)*œREMOVE�"$"�IF�ONE�EXIST ‰BSR�BINHEX*********************************************ˆNUMBER�OF�RECORDS********************************************‰MOVE.L�FDEOR(A4),D0/*ˆ#�OF�RECORDS�IS�1�GREATER�THAN�VALUE�OF�FDEOR ‰ADD.L�#1,D0‰MOVE.L�#7,D1„SIZE‰LEA�DRNUM(PC),A0 ‰BSR�BINDECFJ*+********************************************ˆRECORD�LENGTH+********************************************‰CLR.L�D0ˆINIT‰MOVE.W�FDLRL(A4),D0 ‰MOVE.L�#5,D1‰LEA�DLRL(PC),A0 ‰BSR�BINDECFJ*$************************************ *ˆKEY�LENGTH!**********************************‰CLR.L�D0ˆINIT‰MOVE.B�FDKEY(A4),D0 ‰MOVE.L�#3,D1‰LEA�DKEY(PC),A0 ‰BSR�BINDECFJ**)***************************************** *ˆFAB�LENGTH)****************************************** ‰CLR.L�D0‰MOVE.B�FDFAB(A4),D0 ‰MOVE.L�#3,D1‰LEA�DFAB(PC),A0 ‰BSR�BINDECFJ*!**********************************ˆDATA�BLOCK�SIZE!********************************** ‰CLR.L�D0‰MOVE.B�FDDAT(A4),D0 ‰MOVE.L�#3,D1‰LEA�DDAT(PC),A0 ‰BSR�BINDECFJ**4*****************************************************/*ˆTHE�FOLLOWING�FIELDS�ARE�COMMON�TO�CONTIGUOUS*ˆAND�NON�CONTIGUOUS�FILES*4***************************************************** COMMONƒEQU�**%*************************************'*ˆFILE�START�OR�1ST�FAB�PHYSICAL�SECT�#$*************************************‰MOVE.L�FDFS(A4),D0‚SOURCE‰MOVE.L�#7,D1„SIZE#‰LEA�DETAIL(PC),A0†RECEIVE�LOCATION ‰BSR�BINHEX*-**********************************************ˆREAD�&�WRITE�ACCESS�CODES-******************H ****************************‰CLR.L�D0ˆINIT,‰MOVE.W�FDWCD(A4),D0‚LOAD�WRITE�&�READ�CODES ‰BSR�CVTKEYBA*,*ˆUPON�RETURN�FROM�CVTKEYBA�THE�WRITE�KEY�IS+*ˆIN�LEFT�2�BYTES�OF�D0�AND�THE�READ�KEY�IS*ˆIN�THE�RIGHT�2�BYTES�OF�D0*%‰MOVE.W�D0,DRCD-PBA(A6)‚MOVE�READ�KEY‰SWAP�D0&‰MOVE.W�D0,DWCD-PBA(A6)‚MOVE�WRITE�KEY*)*****************************************&*ˆDATE�FILE�WAS�LAST�ACCESSED/ASSIGNED)******************************************(****************************************#*ˆCONVERT�ORDINAL�DATE�TO�GREGORIAN(*****************************************ˆGET�DATE�OF�ACCESSED/ASSIGNED* ‰CLR.L�D0‰MOVE.W�FDDTEA(A4),D0(‰BSR�DATEOJŠCONVERT�ORDINAL�TO�GREGORIAN*.‰MOVE.L�D0,TMPDATE-PBA(A6)‚SAVE�GREGORIAN�DATE*.***********************************************ˆCONVERT�DAY�TO�ASCII.***********************************************‰AND.L�#$FF,D0ƒSAVE�LOW�BYTE‰MOVE.L�#2,D1„SIZE�OF�REC�FIELD#‰LEA�DDATE3(PC),A0ƒADDR�OF�REC�AREA ‰BSR�BINDECFJ*&***************************************ˆCONVERT�MONTH�TO�ASCII&*************************************** ‰CLR.L�D0&‰MOVE.B�TMPDATE+2-PBA(A6),D0‚GET�MONTH‰MOVE.L�#2,D1„SIZE‰LEA�DDATE2(PC),A0 ‰BSR�BINDECFJ*)******************************************ˆCONVERT�YEAR�TO�ASCII)****************************************** ‰CLR.L�D0‰MOVE.W�TMPDATE-PBA(A6),D0‰LEA�HOLDDATE(PC),A0 ‰BSR�BINDECB‰MOVE.W�HOLDDATE+2-PBA(A6),DDATE1-PBA(A6)‚MOVE�LAST�2�DIGITS�OF�YR*)*****************************************$*ˆDATE�FILE�WAS�LAST�CHANGED/CREATED)******************************************(****************************************#*ˆCONVERT�ORDINAL�DATE�TO�GREGORIAN(*****************************************ˆGET�DATE�OF�CHANGED/CREATED* ‰CLR.L�D0‰MOVE.W�FDDTEC(A4),D0 ‰BSR�DATEOJŠCONVERT�TO�GREGORIAN*.‰MOVE.L�D0,TMPDATE-PBA(A6)‚SAVE�GREGORIAN�DATE*.***********************************************ˆCONVERT�DAY�TO�ASCII.***********************************************‰AND.L�#$FF,D0ƒSAVE�LOW�BYTE‰MOVE.L�#2,D1„SIZE�OF�REC�FIELD$‰LEA�DCDATE3(PC),A0‚ADDR�OF�REC�AREA ‰BSR�BINDECFJ*&***************************************ˆCONVERT�MONTH�TO�ASCII&*************************************** ‰CLR.L�D0&‰MOVE.B�TMPDATE+2-PBA(A6),D0‚GET�MONTH‰MOVE.L�#2,D1„SIZE‰LEA�DCDATE2(PC),A0 ‰BSR�BINDECFJ )******************************************ˆCONVERT�YEAR�TO�ASCII)****************************************** ‰CLR.L�D0‰MOVE.W�TMPDATE-PBA(A6),D0‰LEA�HOLDDATE(PC),A0 ‰BSR�BINDECC‰MOVE.W�HOLDDATE+2-PBA(A6),DCDATE1-PBA(A6)‚MOVE�LAST�2�DIGITS�OF�YR**'*****************************************ˆPRINT�EXTENDED�DISPLAY�LINE*'***************************************‰MOVE.L„A4,-(A7) *œSAVE�REG‰LEA‡DETAIL(PC),A4,‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)�START�ADDR‰LEA‡DETAILE(PC),A4*‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)‚END�ADDR‰MOVE.L„(A7)+,A4 *œRESTORE�REG‰OUT3PƒOUT3IOS(PC)* ‰BNE‡IOERPRT+ŠTST.B‚FLAGA-PBA(A6)†IS�THE�'A'�OPTION�SET?ŠBEQ.S‚BLDEXRTS‹BRANCH�IF�NO,‰BSR�LNFEED‘LINE�FEED�IF�'A'�OPTION�ONLY�SET*BLDEXRTS�RTSŒ.�RETURN�FROM�BLDEXTL�ROUTINE******+*********************************************ˆPROCESS�CONTIGUOUS�FILE*+********************************************CONTIG:*****************************ˆBLANK�UNUSED�FIELDS****************************)‰LEA�DFS(PC),A0†INIT�START�OF�DETAIL�LINE‰MOVE.L„A4,-(A7) *œSAVE�REG‰LEA‡DSTOP(PC),A4*œA4=END�ADDR�OF�DETAIL�LINECONCL„MOVE.L�#'„',(A0)+ ‰CMP.L…A4,A0 ‰BMI�CONCL*œJMP�IF�MORE�TO�BLANK�OUT‰MOVE.L„(A7)+,A4 *œRESTORE�REG‰MOVE.B�#'-',D0-‰MOVE.B�D0,DLOG+3-PBA(A6)ƒINDICTE�NULL�FIELDS‰MOVE.B�D0,DRNUM+3-PBA(A6)‰MOVE.B�D0,DLRL+3-PBA(A6)‰MOVE.B�D0,DKEY+2-PBA(A6)‰MOVE.B�D0,DFAB+2-PBA(A6)‰MOVE.B�D0,DDAT+2-PBA(A6)*+********************************************ˆCONTIGUOUS�IND+********************************************1‰MOVE.B�#1,CFLAG-PBA(A6)‚SET�CONTIGUOUG�FILE�FLAG5I ‰MOVE.L�#'�C‚',DATT-PBA(A6)„CONTIGUOUS�FILE�INDICATOR+******************************************* *ˆFILE�END+********************************************#ŠMOVE.L�FDFE(A4),D0ˆGET�FILE�LENGTH+ŠADD.L‚D0,TOTSIZ-PBA(A6)‚KEEP�RUNNING�TOTAL-ŠADD.L‚#1,TOTSIZ-PBA(A6)‚REAL�LENGTH�=�FDFE+1'ŠADD.L‚FDFS(A4),D0ˆADD�STARTING�ADDRESS* CONVERT TO HEXŠMOVE.L�#6,D1ŽSIZEŠLEA„DFE-1(PC),A0�REC�LOCŠBSR„BINHEX�FOR�END�DISPLAYŠRTS—RETURN�FROM�CONTIG�SECTION‰PAGE1*ˆROUTINE�TO�CHECK�DEVICE�TABLE�FOR�RANDOM�ACCESS%*ˆAND�PRINT�THE�VOLUME�FOR�THE�DEVICE*ˆA6=PBA*CKTAB: ‰MOVE.L„A6,A5*œA5=PBA‰LEA‡DSKFHS(PC),A6#*œA6=DSKFHS�PARAMETER�BLOCK�ADDRESS‰CLR.W…TERM_FLG-PBA(A5)+*œSET�TERMINATION�FLAG�FOR�GOOD�TERMINATION*‰FHSCALL�FETDEV(PC)‚MAKE�DEVICE�TABLE�CALL‰BNE�IOERPRT…ERROR‰LEA�FETDEV(PC),A0,‰LEA�DEVBUF(PC),A1ƒBUFFER�-�CORRECTS�SPR�897 ‰MOVE.W�FHSLEN(A0),D1‚TABLE�SIZE'‰MOVE.L�FHSVOL(A6),D4‚DEVICE�FROM�INPUT‰LEA‡DEVM(PC),A30‰MOVE.L„A3,OUT3IOS-PBA+IOSSAD(A5)„MSG�START�ADDR&‰MOVE.L�D4,DEVM1-PBA(A5)‡DEVICE�TO�MSG TABLOPƒEQU�*‰CMP.L�FDVDEV(A1),D4‚DEVICE�=‰BEQ.S�MOVTAB†YES ‰SUB.W�#1,D1‰BLE.S�NOFND‡AT�END‰ADD.L�#FDVLEN,A1‚ADD�OFFSET‰BRA�TABLOP†CK�NEXT1MOVTABƒMOVE.L�FDVVOL(A1),DEVM2-PBA(A5)‰VOL�TO�MSG‰LEA‡DEVME(PC),A3)‰MOVE.L„A3,OUT3IOS-PBA+IOSEAD(A5)„MSG�END*œSET�UP�FOR�ASSIGN.‰MOVE.L�FDVVOL(A1),FHSVOL(A6)‚MOVE�IN�VOL�NAME ‰MOVE.L„A5,A3*œA3=PBA&*ŸREQUIRED�FOR�INITINB�SUBROUTINE�CALL ‰BSR�INITINB$*œSET�UP�USER�#�&�DESCRIPTION�FIELDS"‰IOSCALL�DSKIOS(PC)ƒREAD�SECT�ZERO ‰BNE�IOERPRT‰LEA�SECBUF(PC),A4 ‰CLR.L�D0 ‰MOVE.W�VIDUSN(A4),D0‚GET�USER�#‰LEA�UDMN(PC),A0 ‰BSR�BINDEC*œSET�UP�VOLUME�DESCRIPTION‰LEA�VIDVD(A4),A2‰LEA�UDMD(PC),A3‰LEA�20(A3),A4 NAML…EQU�*‰MOVE.L�(A2)+,(A3)+‰CMP.L�A3,A4…AT�END ‰BGT�NAML*œPRINT�VOLUME�NAME‰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)*œPRINT�LAST�LINE TABPRTƒEQU�*‰IOSCALLƒOUT3IOS(PC)* ‰BRA‡TERMINAT*NOFND:‰LEA‡DEVM(PC),A3*œADDR�MOVE�FROM‰LEA‡DEVMN(PC),A6*œADDR�MOVE�TO‰MOVE.B„#DEVM1E,D0*œNBR�BYTES�TO�MOVENOFND10:‰MOVE.B„(A3)+,(A6)+ ‰SUB.B…#1,D0‰BNE.S…NOFND10%*œMOVE�DEVICE�NO.�OF�VOLUME�NOT�FOUND‰LEA‡DEVMN(PC),A62‰MOVE.L„A6,OUT3IOS-PBA+IOSSAD(A5)†NEXT�PART�OF�MSG‰LEA‡DEVMNE(PC),A6!‰MOVE.L„A6,OUT3IOS-PBA+IOSEAD(A5) ‰BRA�TABPRT*‰PAGE(***************************************** *ˆOPTION�A<*ˆROUTINE�TO�PRINT�INFORMATION�FROM�THE�(FAB)�DATA�STRUCTURE3*ˆPRINT�PSN�OF�1ST�SECTOR�ALLOCATED�TO�THE�SEGMENT,%*ˆTHE�#�OF�RECORDS�IN�THE�DATA�BLOCK,,*ˆAND�THE�#�OF�SECTORS�IN�USE�IN�THE�SEGMENT9*ˆTHE�FAB�DATA�STRUCTURE�IS�DESIGNED�SUCH�THAT�THE�FIELDS;*ˆBEING�OBTAINED�COULD�CROSS�SECTOR�BOUNDRIES.�THIS�ROUTINE*ˆOBTAINS�1�SECTOR�AT�A�TIME.*9*ˆIF�FILE�START�IN�DIRECTORY�BLOCK�=�0�THERE�IS�NO�SECTOR'*ŒWHEN�WORKING�WITH�THE�CONTIGUOUS�FILE*ˆTHE�REC�LENGHT�IS�FOUND�BY6*ŒADDING�1�TO�THE�LOGICAL�END�OF�FILE�LOC�IN�DIRECTORY*ˆFAB�SIZE.�IS�BLOCK�SIZE*.************************************************(****************************************1*ˆTHIS�ROUTINE�MUST�DEAL�WITH�THE�PROBLEM�OF�DATA-*ˆCROSSING�SEGMENT�BOUNDRIES.�THERE�MUST�BE�A0*ˆTEST�AFTER�THE�FETCH�OF�A�WORD�FOR�THE�BOUNDRY0*ˆEND�OF�SEGMENT.‚THE�KEY�OR�A�BLANK�ELEMENT�CAN*ˆALSO�CROSS�A�BOUNDRY*)********************************************ˆOPTIONA�A�ROUTINE* OPTIONA‚EQU�*&‰LEA�DIRBLK(PC),A4ƒLOAD�DIR�ENTRY�ADDR ‰TST.B�CFLAG-PBA(A6)…CONTIG�FILE‰BEQ.S�OPTIONA1‚BRANCH�IF�NO*$* DISPLAY LENGTH FOR CONTIGUOUS FILEŠMOVE.L�FDFE(A4),D0)ŠADD.L‚#1,D0ŽLENGTH�IS�ONE�MORE�THAN�FDFEŠBSR„OPTACTG1‹DISPLAY�LENGTH ŠBRA„OPTAEXIT* OPTIONA1:)‰TST.L�FDFS(A4)‚IS�FILE�START‚ADDR�=�ZERO&‰BEQ�OPTAEXIT„YES�EXIT�NO�BLOCKS�EXIST5‰CLR.L�NCCOUNT-PBA(A6)ƒCLEAR�DATA�LENGTH�WORK�COUNTER9ŠCLR.L‚FABSPC-PBA(A6)…CLEAR�FAB�SIZE�ACCUMULATOR�FOR�FILE/‰MOVE.L�FDFS(A4),NXTBLK-PBA(A6)‚SAVE�BLOCK�ADDR*/***********************************************)*ˆNXTBLK�CONTAINI S�THE�PSN�OF�THE�NEXT�FAB/************************************************8‰MOVE.B�FDFAB(A4),COUNT-PBA(A6)ƒSAVE�COUNT�SIZE�FROM�DIR*+*******************************************/*ˆCOUNT�CONTAINS�THE�NUMBER�OF�SECTORS�IN�A�FAB+********************************************'‰MOVE.L�#0,A5ˆINIT�PRINT�POSITION�COUNT%‰CLR.B�FLAGEX-PBA(A6)„CLEAR�EXIT�FLAG*.************************************************ˆPRINT�FAB�HEADER*.***********************************************‰MOVE.L„A4,-(A7) *œSAVE�REG‰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 *œRESTORE�REG%‰OUT3PƒOUT3IOS(PC)‚CALL�PRINT�ROUTINE* *********************************ˆ1ST�READ�OF�FAB�DATA�SECTOR!***********************************‰BSR�OPTARAN†GET�FAB�SECTOR�BY�RANDOM�READ**'OPTASTƒTST.B�FLAGEX-PBA(A6)„ARE�WE�DONE‰BNE�OPTALAST„YES*#************************************ˆSTART�DATA�PSN�MOVE#************************************ OPTA0„EQU�*>‰MOVE.W�(A3)+,FWPSN-PBA(A6)‚GET�WORD�OF�PSN�FROM�SECTOR�OF�FAB)‰CMP.L�NADR_SEC-PBA(A6),A3‚AT�BOUNDRY�END‰BMI.S�OPTA1‡NO‰TST.B�D4ˆMORE�SECTORS?‰BNE.S�OPTA05„YES‰TST.W�FWPSN-PBA(A6)…TEST�WORD ‰BEQ.S�OPTA10„NO�-�OK�IF�0�BYTES OPTA05„EQU�*‰BSR�SEQRDCK…GET�NEXT�SEG6OPTA1„MOVE.W�(A3)+,FWPSN+2-PBA(A6)ƒGET�2ND�WORD�OF�PSN*2**************************************************1*ˆCONVERT�PSN�TO�HEX�VALUE�FOR�PRINT�(DATA�START)2***************************************************‰MOVE.L�FWPSN-PBA(A6),D0‚SOURCE‰BNE.S�OPTA11„NOT�ZERO*ˆENCOUNTERED�A�0�FOR�PSNOPTA10: ‰CMP.L…#00,A5‰BEQ.S…OPTA10A*œJMP�IF�NO�LINE�TO�PRINT ‰BSR‡OPTAPRT*œPRINT�LAST�LINE�FOR�THIS�FAB ‰CMP.L…A5,A5/*œFORCE�THE�EQUAL�CONDITON�AS�THE�LINE�HAS�BEEN1*œPRINTED�AND�WE�DO�NOT�WANT�A�BLANK�LINE�PRINTEDOPTA10A:‰BSR�OPTARAN…GET�NEXT�FAB‰BRA�OPTAST†START�OVER* OPTA11ƒEQU�*‰MOVE.L�#5,D1„SIZE�OF�REC�FIELD ‰LEA�DFABDS(PC),A0‚RECEIVE�FIELD‰ADD.L�A5,A0ŠADD�OFFSET ‰BSR�BINHEX********************************ˆCHECK�FOR�BOUNDRY�END******************************)‰CMP.L�NADR_SEC-PBA(A6),A3‚AT�BOUNDRY�END‰BLS.S…OPTA2‡NO‰BSR�SEQRDCK…GET�NEXT�SECTOR********************************"*ˆGET�NUM�OF�RECORDS�IN�DATA�BLOCK*******************************OPTA2„CLR.L�D0ˆINIT‰MOVE.W�(A3)+,D0‚SOURCE‰MOVE.B�#6,D1„SIZE‰LEA�DFABRN(PC),A0‰ADD.L�A5,A0ŠADD�OFFSET ‰BSR�BINDECFJ*(‰CMP.L�NADR_SEC-PBA(A6),A3‚AT�BUFFER�END‰BLS.S…OPTA3‡NO ‰BSR�SEQRDCK*1*ˆADD�TO�COUNT�FOR�DATA�SECTOR�LENGTH�CALCULATION* OPTA3„EQU�*‰ADD.L�#1,NCCOUNT-PBA(A6)*,********************************************&*ˆNUM�OF�SECTORS�IN�USE�IN�THE�SEGMENT,********************************************‰CLR.L�D0ˆINIT#‰MOVE.B�(A3)+,D0‚SOURCE�-�EVEN�BYTE‰MOVE.B�#3,D1„SIZE‰LEA�DFABSECT(PC),A0 ‰ADD.L�A5,A0 ‰BSR�BINDECFJ*‰CLR.L�D6‡INIT‰MOVE.B�(A3)+,D6‚GET�KEY�SIZE(‰CMP.L�NADR_SEC-PBA(A6),A3‚AT�SECTOR�END‰BLS.S…OPTA5‡NO********************************************6*ˆAT�THIS�POINT�THE�SECTOR�AND�THE�FAB�COULD�BE�AT�END********************************************-‰BSR�SEQREAD…YES�GET�NEXT�SECTOR�FOR�THIS�FAB‰TST.B�FLAGEX-PBA(A6)‚AT�END‰BNE.S�OPTALAST‰YES* OPTA5„TST.B�D6ˆWAS�KEY�SIZE�ZERO‰BEQ.S�CKPRT‡YES*3***************************************************2*ˆRESET�BUFFER�POINTER�FOR�KEY�SIZE�IN�THIS�SECTOR3****************************************************‰ADD.L�D6,A3…ADD�KEY�SIZE,‰CMP.L�NADR_SEC-PBA(A6),A3‚BEYOND�SECTOR�END‰BLS.S…CKPRT‡NO*ˆKEY�AREA�GOES�ACROSS�BOUNDRY5‰SUB.L�NADR_SEC-PBA(A6),A3‚GET�KEY�SIZE�FOR�NEXT�BUFF‰MOVE�A3,D6†SAVE�SIZE‰BSR�SEQRDCK…GET�NEXT�SECTOR‰SUB.B�#1,D6…CORRECT�POINTER"‰ADD.L�D6,A3…RESET�TO�PROPER�START*%**************************************ˆCHECK�IF�PRINT�LINE�IS�FULL(***************************************** CKPRT„EQU�*‰CMP.L�#0,A5…IN�FIRST�HALF‰BNE.S�CKPRT1„NO‰MOVE.L�J #32,A5„SET�TO�2ND�HALF ‰MOVE.B�#'-',DFABDS+3+32-PBA(A6) ‰MOVE.B�#'-',DFABRN+5+32-PBA(A6)"‰MOVE.B�#'-',DFABSECT+2+32-PBA(A6)‰BRA�OPTAST†START�ON�NEXT�HALF CKPRT1ƒEQU�*‰BSR�OPTAPRT„GO�PRINT�LINE ‰BRA�OPTAST**'****************************************)*ˆPROCESS�LAST�RECORD�NON�CONTIGUOUS�FILE*&***************************************OPTALAST EQU *3‰CMP.L�#'„',DFABDS+1-PBA(A6)‚ANYTHING�IN�PRINT�LINE‰BEQ.S�OPTALENƒNOTHING�TO�PRINT‰BSR�OPTAPRT„GO�PRINT�LINE**ˆROUTINE�TO�PRINT�FILE�LENGTH* OPTALEN‚EQU�*0‰MOVE.L�NCCOUNT-PBA(A6),D0‚INIT�WITH�ENTRY�COUNT‰TST.L�D0ˆIS�IT�ZERO‰BEQƒOPTAEXIT„YES*"‰SUB.L�#1,D0…REDUCE�FOR�LAST�BLOCK‰CLR.L�D1ˆINIT9‰MOVE.B�FDDAT(A4),D1‚GET�DATA�SIZE�PER�ENTRY(IN�SEGMENTS)‰MULS�D1,D0†CALC�SIZE(‰MOVE.B�FDLBZ(A4),D1‚GET�LAST�BLOCK�SIZE ‰ADD.L�D1,D05‰ADD.L‚FABSPC-PBA(A6),D0ŠADD�IN�SPACE�TAKEN�UP�BY�FAB5ŠADD.L‚D0,TOTSIZ-PBA(A6)†KEEP�TOTAL�SIZE�ACCUMULATION6OPTACTG1�MOVE.L�D0,-(A7)‚SAVE�VALUE�FOR�HEX�CONVERSION**ˆCONVERT�TO�ASCII*&‰MOVE.B�#8,D1„PRINT�LINE�SIZE�FOR�CONV%‰LEA�HFABLMC(PC),A0‚ADDR�OF�REC�FIELD ‰BSR�BINDECFJ„GO�TO�CONV�ROUTINE4‰MOVE.L�(A7)+,D0‚RESET�REG�WITH�TOT�VALUE�FROM�STACK%‰LEA�HFABLMH(PC),A0‚ADDR�OF�REC�FIELD,BHLCVTƒMOVE.L�#'0ƒ',(A0)‚BLANK�RECEIVE�FIELD‰MOVE.L�#'„',4(A0) ‰MOVE.L�#8,D1‰MOVE.W�#$2000,D2‚INITBHLCU1ƒROL.L�#4,D0†GET�4�BITS‰MOVE.B�D0,D2„SAVE�D0)‰AND.B�#$F,D2„CLEAR�ALL�EXCEPT�LOW�4�BITS"‰ADD.B�#$20,D2ƒSET�FOR�SPACE�CHECK ‰CMP.W�#$2020,D2‚LEADING�SPACE�?‰BEQ.S�BHLCU3„YES‰ADD.B�#$10,D2ƒCONVERT�TO�NUM‰CMP.B�#$39,D2ƒIS�IT�A�NUM‰BLE.S�BHLCU2„YES‰ADD.B�#7,D2…GET�TO�LETTERSBHLCU2ƒMOVE.B�D2,(A0)+BHLCU3ƒASL.W�#8,D2†MOVE�WORD‰SUB.B�#1,D1…REDUCE�COUNT‰BHI�BHLCU1†BR�NOT�ZERO‰MOVE.L„A4,-(A7) *œSAVE�REG‰LEA‡HFABLM(PC),A4.‰MOVE.L„A4,OUT3IOS-PBA+IOSSAD(A6)‚START�OF�MSG‰LEA‡HFABLME(PC),A4,‰MOVE.L„A4,OUT3IOS-PBA+IOSEAD(A6)‚END�OF�MSG‰MOVE.L„(A7)+,A4 *œRESTORE�REGŠOUT3P‚OUT3IOS(PC) ‰BNE‡IOERPRT*,**********************************************,*ƒ******„RETURN�FROM�OPTION�A�ROUTINE„*******.***********************************************OPTAEXIT�RTS�.�RETURN*****/**************************************************ˆROUTINE�TO�TEST�FOR�SEQUENTIAL�READ�ONLY********************************************&SEQRDCK‚TST.B�D4ˆANY�MORE�SECTORS�LEFT‰BNE.S�SEQRD1†YES*********************************ˆPRINT�ERROR�MSG*******************************‰LEA‡FABERMSG(PC),A2‰MOVE.L„A2,SADIO-PBA(A6)‚START‰LEA‡FABERMSE(PC),A2‰MOVE.L„A2,EADIO-PBA(A6)‚END‰IOSCALL�OUT6IOS(PC)‰BSR.S�SEQREAD‰ADD.L�#4,A7…RESET�STACK‰BRA�OPTAST‡TRY�AGAIN*%SEQRD1ƒBSR.S�SEQR1‡DO�SEQUENTIAL�READ ‰RTS�.�RETURN*********************************************"*ˆROUTINE�TO�DO�SEQUENTIAL�READ�*********************************************** SEQREAD‚EQU�*9‰TST.B�D4ˆARE�ANY�SECTORS�LEFT�IN�FAB�(D4�HAS�SECT�COUNT)"‰BNE.S�SEQR1…GO�TO�SEQUENTIAL�READ(‰BSR.S�OPTARAN…GO�TO�RANDOM�READ�ROUTINE‰BRA.S�SEQREXIT‡CONTINUE*&SEQR1„LEA�DSKIOS(PC),A2ˆLOAD�BASE�ADDR6‰ADD.L�#1,IOSRRN(A2)‚INCREMENT�REC�#�FOR�SEQ�TYPE�READ*‰IOSCALL�DSKIOS(PC)‚DO�I/O�CALL* ‰BNE‡IOERPRT* ‰SUB.W�#1,D4ŠREDUCE�SECTOR�COUNTT =V FS NT VQ ^S fM nP vC ~&#‰LEA�SECBUF(PC),A3‚INIT�BUFFER�ADDR#SEQREXIT�RTSˆ.�RETURN�FROM�SEQ�READ**‰PAGE.***********************************************(*ˆROUTINE�TO�DO�RANDOM�READ�OF�FAB�BLOCK*.*********************************************** OPTARANƒEQU�*‰BEQ.S�OPTARAN1„NO‰BSR.S�OPTAPRT)OPTARAN1�TST.L�NXTBLK-PBA(A6)‚IS�ADDR�=�0‰BNE.S�OPTARR†NO&‰MOVE.B�#1,FLAGEX-PBA(A6)‚SET�END�FLAG‰BRA.S�OPTARANE‚GET�OUT**2**************************************************7*ˆMOVE�FAB�PSN�TO�PRINT�LINEJ �AFTER�HEX�ASCII�CONVERSION2**************************************************&OPTARRƒMOVE.L�NXTBLK-PBA(A6),D0‚SOURCE ŠCLR.L‚D1ŠMOVE.B�FDFAB(A4),D15ŠADD.L‚D1,FABSPC-PBA(A6)‚KEEP�FAB�TOTAL�SIZE�FOR�FILE‰MOVE.L�#5,D1„SIZE‰LEA�DFABPSN(PC),A0ƒREC�AREA ‰BSR�BINHEX*#************************************ˆSET�UP�FOR�RANDOM�READ!**********************************(‰LEA�DSKIOS(PC),A2ƒADDR�OF�IOS�READ�PARM ‰CLR.L�D4%‰MOVE.B�COUNT-PBA(A6),D4‚INIT�COUNTER4‰MOVE.L�NXTBLK-PBA(A6),IOSRRN(A2)�RANDOM�REC�ADDRESS4‰MOVE.W�#IOPRAN+IOPWAT+IOPIMG,IOSOPT(A2)‚SET�OPTIONS‰LEA‡SECBUF(PC),A3‰MOVE.L„A3,IOSSAD(A2)‚START�BUF‰LEA‡SECBUFE(PC),A3‰MOVE.L„A3,IOSEAD(A2)�END�BUF**************************** *ˆRANDOM�READ*****************************‰IOSCALL�DSKIOS(PC)*‰BNE‡IOERPRT‚ERR0R ‰SUB.W�#1,D4…REDUCE�SECTOR�COUNT* ‰LEA�SECBUF(PC),A3‚LOAD�BUF�ADDR6‰MOVE.L�FABFLK(A3),NXTBLK-PBA(A6)‚SAVE�FORWARD�POINTER!ˆLEA�FABPKY(A3),A3‚ADJ�FOR�HEADERˆCLR.W�D0ˆINIT�REG,ˆMOVE.B�(A3)+,D0‚PUT�VALUE�OF�FABKEY�INTO�D0)ˆLEA�0(A3,D0),A3‚POSITION�AT�START�OF�PSN*OPTARANE�RTS�.�RETURN‰PAGE%************************************** *ˆROUTINE�TO�PRINT�OPTION�A�LINE*%**************************************OPTAPRT:‰LEA‡PFABD(PC),A01‰MOVE.L„A0,OUT3IOS-PBA+IOSSAD(A6)‚LOAD�START�ADDR‰LEA‡PFABDE(PC),A0-‰MOVE.L„A0,OUT3IOS-PBA+IOSEAD(A6)‚MESSAGE�END*‰OUT3PƒOUT3IOS(PC)‚PRINT�LINE* ‰BNE‡IOERPRT*$*************************************‰BLANK�OUT�PRINT�AREA*$*************************************‰LEA�PFABD(PC),A0„INIT‰MOVE.L„A4,-(A7) *œSAVE�REG‰LEA‡PFABDE(PC),A4*œA4=MSG�END�ADDROPTAP1ƒMOVE.L�#'„',(A0)+‚BLANK‰CMP.L�A4,A0‚AT�END‰BLE�OPTAP1†NO‰MOVE.L„(A7)+,A4 *œRESTORE�REG**‰MOVE.L�#0,A5ŠINIT�BEFORE�RTURN ‰RTS�.�RETURN***‰PAGE-**********************************************.*ˆROUTINE�TO�ASSIGN�LOGICAL�UNIT�3�TO�TERMINAL+*ˆBY�SETTING�IT�UP�THE�SAME�AS�LU6�WHICH�IS"*ˆALREADY�ASSIGNED�TO�THE�TERMINAL*.*********************************************** SETLU3ƒEQU�*‰LEA‡PBA(PC),A6*œA6=PBA‰LEA�REGD7(PC),A0&‰BTST�#3,3(A0)‰CK�IS�IT�ASSIGN�ALREADY‰BNE.S�SETLU3EX‡YES‰FHSCALL�LU3AFHS(PC)*ˆRETURN�FROM�FHS�CALL‰BNE‡IOERPRT…BAD�RETURNSETLU3EX‚RTS‡.�RETURN*******‰PAGE8*********************************************************=***‚ROUTINE�TO�DIRECT�OUTPUT�TO�SOMETHING�OTHER�THAN�TERMINAL*9**********************************************************NEWOUT: ‰MOVE.L„A6,A0*œA0=PBA,‰LEA�LU3FHS(PC),A6ƒLU3�PARM�TABLE�ADDR�TO�A6@‰MOVE.B�#0,FHSWCD(A6)�LOAD�WRITE�PASSWORD�(USER�CAN�ALWAYS�WRITE?‰MOVE.B�#$FF,FHSRCD(A6)‚LOAD�READ�PASSWORD�(ONLY�USER�CAN�READ)3‰MOVE.W�USERNUM-PBA(A0),FHSUSN(A6)‚DEFAULT�USER�NUM-‰MOVE.L�VOLNAM-PBA(A0),FHSVOL(A6)‚VOLUME�NAME*‰MOVE.L�CATNAM-PBA(A0),FHSCLG(A6)‚CAT�NAME)‰MOVE.L�CATNAM+4-PBA(A0),FHSCLG+4(A6)‚CAT$‰MOVE.W�#'LS',FHSEXT(A6)‡DEFAULT�EXT-*œFORCE�DEFAULT�VALUES�IN�FHS�PARAMETER�BLOCK7‰MOVE.L�A1,A0‡A1=A0=START�ADDR�TO�SCAN�FOR�OUTPUT�FIELD*)******************************************&*ˆSET�UP�A0�WITH�ADDR�OF�START�OF�SCAN'*ˆSET�UP�A6�WITH�ADDR�OF�FHS�PARM�BLOCK*‰CALL�EDITFILE�ROUTINE�****)*******************************************œCALLED�IN�RTNE�NEWOUT ‰BSR�EDITFILE ‰BMI‡INVMSGR‰LEA‡PBA(PC),A3*œA3=PBA ‰BTST�#1,D05‰BNE.S�SETDEVˆJMP�IF�DEVICE�SPECIFIED�IN�OUTPUT�FIELD ‰TST.B�D0<‰BNE.S…INVMSGRƒJMP�IF�FAMILY�INDICTION�FOUND�IN�OUTPUT�FIELD>‰BRA.S�NOTDEVˆJMP�AS�A�FILE�HAS�BEEN�SPECIFIED�IN�OUTPUT�FIELD*)*******************************************ˆ****ƒASSSIGN�LOGICAL�UNIT�3*'**************************************** LU3ASSƒEQU�*-‰MOVE.W�#FHASGN,FHSCMD(A6)‚SET�ASSIGN�COMMAND1‰MOVE.W�#FOPPW,FHSOPT(A6)‚SET�PUBLIC�WRITE�OPTION ‰FHSCALL�(A6)‰BNE.S…IOERPRTˆERR0R*?* IF PRINTER TYPE DEVICE, THEN FETCH LINE COUNT FOR CONTROLLING*ƒPAGE�EJECTS.*2ŠMOVE.W�#FHRATT,FHSCMD(A6)�FETCH�DEVICE�ATTRIBUTES ŠFHSCALL‚(A6)ŠBK NE.S„IOERPRT�BRANCH�IF�ERROR$ŠBTSTW‚#9,FHSWCD(A6)†ATTRIBUTES�WORD$ŠBEQ.S‚NEWOUTEŒBRANCH�IF�NOT�PRINTERBŠMOVE.L�FHSSIZ(A6),ROWCNT-PBA(A3)‚SAVE�ROW�COUNT�IF�PRINTER�DEVICE8ŠSUB.L‚#6,ROWCNT-PBA(A3)‚BIAS�FOR�TOP�AND�BOTTOM�MARGINSNEWOUTE:‰LEA‡PBA(PC),A6*œA6=PBA‰RTSŒ.�RETURN�FROM�ROUTINE***0SETDEVƒMOVE.B�#1,DEVFLAG-PBA(A3)�SET�DEVICE�FLAG ‰BTSTW…#14,D0 ‰BNE.S…HSKP1*œJMP�IF*¦DEVICE�IS�SPECIFIED*¦VOLUME�FIELD�IS�NULL ‰BRA�LU3ASS*)******************************************"*ˆ**‚OUTPUT�IS�A�FILE�NOT�A�DEVICE.*ˆ**‚A6�CONTAINS�ADDR�OF�OUTPUT�FHS�PARM�BLOCK*)****************************************** NOTDEVƒEQU�**3‰MOVE.W�#FHALLO+FHASGN,FHSCMD(A6)‚SET�ALLOC&�ASSIGN$*œPUT�ENTRY�IN�DIRECTORY�AND�OPEN�IT*Š***‚OPTIONS�SET*'‰MOVE.W�#FOPPW+FOPEND+FOPSEQ,FHSOPT(A6)+‰CLR.W�FHSLRL(A6)‚SET�LOGIC�REC�LENGTH�TO�0&‰MOVE.L�#0,FHSSIZ(A6)‚SIZE�CODE�=�ZERO*"NOTDEV1‚FHSCALL�(A6)‡MAKE�FHS�CALL‰BEQ�NEWOUTE‰GOOD‰CMP.B�#5,D0‰DUP�FILE‰BNE.S…IOERPRT‰NO‰MOVE.W�#FHASGN,(A6) ‰BRA�NOTDEV1-*œFILE�ALREADY�EXIST�SO�JUST�OPEN�(ASSIGN)�ITHSKP1:%‰MOVE.L„STSKNAM+24-PBA(A3),FHSVOL(A6)0*œFORCE�VOLUME�TO�CONTAIN�INITIATING�TERMINAL�ID ‰BRA‡SETLU3*‰PAGEINVMSGR:‰MOVE.L„#EM_NVE,D0)*œSET�KEY�VALUE�FOR�INVALID�ENTRY�MESSAGEIOERPRT:‰MOVE.L„#LDFLUN,D1'*œD1-USER�LOGICAL�UNIT�NBR�TO�OUTPUT�TO‰BSR.S…C_EM_PGM!*œISSUE�CALL�TO�ERROR�MSG�PROGRAM‰PAGE**2*ˆALL�UTILITIES�WILL�TERMINATE�BY�CALLINGƒERQ.TERM:*ˆHOWEVER�-�AN�INDICATION�AS�TO�WHETHER�THERE�WAS�AN�ERROR5*ˆWHICH�MIGHT�CAUSE�CHAIN�PROCESSING�TO�ABORT�MUST�BE9*ˆSPECIFIED�AT�THE�TIME�OF�THE�TERMINATION.�THE�FOLLOWING8*ˆWILL�DEFINE�THE�TYPE�OF�TERMINATION�THAT�ARE�CURRENTLY *ˆPOSSIBLE:*8*’NORMAL�TERMINATION‚-�IMPLIES�THAT�UTILITY�SUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM�#0,#0**:*’ERROR�TERMINATIONƒ-�IMPLIES�THAT�UTILITY�TERMINATED�WITH *¨AN�ERROR**¦ERQ.TERM�#0,#$C000*<*’WARNING�TERMINATION�-�IMPLIES�THAT�UTILITY�TERMINATED�WITH*¨A�WARNING�(ie.�ASSEMBLY)**¦ERQ.TERM�#0,#$1000*L********�PBA�-�IS�THE�PROGRAM�BASE�ADDRESS‚--�THIS�MAYBE�ANY�SYMBOL�THE�USER *®WOULD�LIKE�-�PBA�HAS�BEEN�USED*®FOR�ILLUSTRATION�PURPOSES*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‰TERMINATION�FLAG0*œWILL�CONTAIN�THE�APPROPRIATE�TERMINATION�VALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*‰PAGEK**************THE USER IS RESPONSIBLE FOR SUPPLYING THE REGISTER (A?) WHICH5**************CONTAINS THE PROGRAM BASE ADDRESS (PBA)***’ERROR�MESSAGE�CALLING�ROUTINE**ˆCALL†BSR‡C_EM_PGM**ˆINPUT!*’D0�=�AS�RETURNED�FROM�TRAP�CALL,*’D1�=�USER�LOGICAL�UNIT�NUMBER�TO�OUTPUT�TO!*’A0�=�AS�RETURNED�FROM�TRAP�CALL**ˆOUTPUT*’NO�REGISTER�PRESERVATION* EM_XCEPT:‰DC.W†$0000…TABLE�TERMINATOR2*œTHIS�TABLE�IS�USED�TO�DEFINE�EXCEPTIONS�TO�ERROR.*œMESSAGES�THAT�SHOULD�NOT�CAUSE�A�TERMINATION*œVIA�THE�ERROR�CONDITION* C_EM_PGM:‰LEA‡PBA(PC),A6*œA6=PROGRAM�BASE�ADDR‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A6)+*œSAVE�D0�AND�A0�IN�ERROR�MSG�PARAMETER�BLK‰AND.L…#$00FF,D0*œISOLATE�ERROR�STATUS�RETURN‰LEA‡EM_XCEPT(PC),A00*œA0=ADDR�OF�TBL�CONTAINING�ERROR�MSG�CODES�THAT-*ŸWILL�NOT�BE�CONSIDERED�AS�ERROR�TERMINATION *ŸCONDITIONS CEMP0100: ‰TST.W…(A0)‰BEQ.S…CEMP0200 *œJMP�IF�TABLE�HAS�BEEN�EXAMINED‰CMP.W…(A0)+,D0‰BEQ.S…CEMP0300'*œJMP�IF�ERROR�CODE�RETURN�IS�ONE�WHICH/*œWILL�RESULT�IN�BEING�AN�EXCEPTION�-�THIS�CASE**œWILL�NOT�BE�CONSIDERED�FOR�AN�ERROR�TYPE *œTERMINATION‰BRA.S…CEMP0100 *œREPEAT�LOOP CEMP0200:‰MOVE.W„#$C000,TERM_FLG-PBA(A6),*œSET�FLAG�TO�TERMINATE�WITH�ERROR�CONDITION CEMP0300:‰LEA‡EM_PBLK(PC),A0&*œA0=ADDR�USER�ERROR�MSG�PARAMETER�BLK‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)*œSET�THE�USER�LUN�TO�OUTPUT�TO ‰MOVE.L„#2,D0*œERROR�MSG�PRGM�INPUT�RQMNT‰TRAP†#4$*œISSUE�REQUEST�TO�ERROR�MSG�HANK DLER‰RTS **‰PAGE** ROUTINE TO PRINT LINE FEEDSLNFEED:‰MOVE.L„A0,-(A7) *œSAVE�REG‰LEA‡BLANK1S(PC),A03ŠMOVE.LƒA0,OUT3IOS-PBA+IOSSAD(A6)�PRINT�OUT�A�BLANK!ŠMOVE.LƒA0,OUT3IOS-PBA+IOSEAD(A6)‰MOVE.L„(A7)+,A0‚031285 *œRESTORE�REGŠBSR.S„OUT3PP„053084ŠIOSCALL‚OUT3IOS(PC)†053084ŠRTS%**************************************E* SUBROUTINE TO TEST AND EJECT PAGE IF NECESSARY (BUMPS LINE COUNTER)*%*************************************OUT3PP„MOVE.L�A0,-(A7)#ŠMOVE.L�LNCNT-PBA(A6),A0‹LINE�COUNT/ŠADD.L‚#1,A0ŽBUMP�TO�SEE�IF�TIME�FOR�PAGE�EJECT*ŠMOVE.L�A0,LNCNT-PBA(A6)ƒUPDATE�LINE�COUNT1ŠCMP.L‚ROWCNT-PBA(A6),A0ŠIS�IT�TIME�TO�PAGE�EJECTŠBLS.S‚OUTLBL�BRANCH�IF�NOŠBSR.S‚EJECTŽEJECT�THE�PAGEOUTLBL„MOVE.L�(A7)+,A0ŠRTS%*************************************** SUBROUTINE TO EJECT PAGE*ƒALSO�PRINTS�HEADER*%************************************* EJECT…EQU„*ŠMOVEM.L�A0/D0,-(A7);ŠMOVE.L�#1,LNCNT-PBA(A6)ƒREFLECT�PRINTED�HEADING�IN�COUNTERAŠMOVEM.L�OUT3IOS-PBA+IOSSAD(A6),A0/D0ƒSAVE�OLD�DISPLAY�BOUNDARIESŠMOVEM.L�A0/D0,-(A7)‰MOVE.L„A4,-(A7) *œSAVE�REG‰LEA‡EJMSGS(PC),A4!ŠMOVE.LƒA4,OUT3IOS-PBA+IOSSAD(A6)‰LEA‡EJMSGS+1(PC),A4!ŠMOVE.LƒA4,OUT3IOS-PBA+IOSEAD(A6)ŠIOSCALL�OUT3IOS(PC)‰LEA‡VERSION(PC),A4;ŠMOVE.LƒA4,OUT3IOS-PBA+IOSSAD(A6)�HEADING�BUFFER�BOUNDARIES‰LEA‡VEND(PC),A4!ŠMOVE.LƒA4,OUT3IOS-PBA+IOSEAD(A6)‰MOVE.L„(A7)+,A4 *œRESTORE�REG&ŠIOSCALL�OUT3IOS(PC)‡PRINT�THE�HEADING#ŠBSR„LNFEED�LINE�FEED�AFTER�HEADING+ŠMOVEM.L�(A7)+,A0/D0ŒOLD�DISPLAY�BOUNDARIES2ŠMOVEM.L�A0/D0,OUT3IOS-PBA+IOSSAD(A6)ƒRESTORE�THEM(ŠMOVEM.L�(A7)+,A0/D0ŒREGISTERS�AS�BEFOREŠRTS‰PAGE***.***********************************************%*ˆCONVERT�BINARY�TO�HEX�ASCII�ROUTINE*(*ˆRIGHT�JUSTIFY�&�BLANK�FILL�ON�THE�LEFT-*ˆTHE�LEAST�SIGNIFICANT�DIGIT�IS�NOT�BLANKED.+*ˆA�'$'�IS�INSERTED�JUST�TO�THE�LEFT�OF�THE)*ˆMOST�SIGNIFICANT�DIGIT.‚THE�DOLLAR�SIGN0*ˆIS�NOT�INCLUDED�IN�THE�LENGTH�OF�THE�RECEIVING*ˆFIELD.* *ˆD0�=�HEX�VALUE�TO�BE�CONVERTED *ˆD1�=�LENGTH�OF�RECEIVING�FIELD7*ˆA0�=�ADDRESS�OF�LEFT�MOST�POSITION�OF�RECEIVING�FIELD*.**********************************************BINEQS‚DC.W�0,1,10,100,1000(BINASCƒDC.B�'0123456789ABCDEF'…HEX�TABLE* BINHEXƒEQU�*‰LEA�BINASC(PC),A1ƒINIT�ADDR‰LEA�0(A0,D1),A2‚END�LOCATION*BINLOPƒMOVE.B�D0,D3„GET�BYTE%‰ASR.L�#4,D0†SHIFT�OFF�LAST�HEX�VALUE!‰AND.L�#$F,D3„MASK�OFF�OTHER�BITS2‰MOVE.B�0(A1,D3),-(A2)‚MOVE�FROM�TABLE�TO�REC�AREA‰CMP.L�A2,A0…ARE�WE�DONE‰BLT�BINLOP†NO**ˆDO�ZERO�SUPPRESSION*‰LEA�0(A0,D1),A2‚INIT�END�LOC‰SUB.L�#1,A2…FIX�END�LOC!BINSP„CMP.B�#'0',(A0)‚ASCII�ZERO?‰BNE.S�BINOUT†NO�GET�OUT%‰MOVE.B�#'�',(A0)+‚REPLACE�WITH�BLANK‰CMP.L�A0,A2…ARE�WE�DONE ‰BGT�BINSP‡NO**8BINOUTƒMOVE.B‚#'$',-1(A0)ˆINSERT�LEADING�'$'�TO�SHOW�HEX ‰RTS�.�RETURN***‰PAGE*&*ˆ**CONVERT�BINARY�TO�ASCII�ROUTINE�**-*********************************************$*ˆBINARY�TO�DECIMAL�ASCII�SUBROUTINE*�REV�1.00‚3/27.79�GAT*�**�16�BIT�BINARY�INPUT�**4****************************************************6*ˆCONVERTS�BINARY�QUANTITY�IN�D0�TO�ASCII�STRING�WHICH *ˆIS�DEPOSITED�AT�LOCATION�(A0)+**ˆCALLING�SEQUENCE:'*‹LOAD�D0�WITH�QUANTITY�TO�BE�CONVERTED.*‹LOAD�A0�WITH�ADDRESS�TO�DEPOSIT�ASCII�STRING *‹JSR�BINDEC*!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*“D„*�* *“A„*�*�***ˆA1�POINTS�AT�BINARY�TABLE*ˆA2�POINTS�AT�ASCII�TABLE*ˆD1�IS�WORK�REGISTER**%BINDECƒLEA‡BINEQS+8(PC),A1ƒADDR�10**5*BINDE1ƒLEA‡BINASC(PC),A2†BASE�ADDR�ASCII�0#BINDE2ƒSUB.W�(A1),D0ŠSUBTRACT�10**N‰BCS.S�BINDE3�BRANCH�OVERBORROW&‰ADD.L�#1,A2ŒINCREMENT�NEXT�ASCII�CHAR‰BRA�BINDE2�CONTINUE'BINDE3ƒADD.W�(A1),D0ŠRESTORE�OVERBORROW!‰MOVE.B�(A2),(A0)+†PUT�ASCII�CHAR‰MOVE.W�-(A1),D1ˆTEST�DONE‰BNE�BINDE1�BRANCH�NOT�DONE‰RTS‰PAGE*-*********************************************+*‚32�BIT�BINARY�TO�DECIMAL�ASCII�SUBROUTINE-**********************************************,*‚CONVERTS�BINARY�IN�D0�AND�PUTSL �ASCII�DIGIT(*…CHARACTERS�AT�ADDRESS�SPECIFIED�IN�A0.(*…LEADING�ZEROS�ARE�CONVERTED�TO�SPACES.+*…THE�FIELD�LENGTH�(NO.�CHARS)�IS�SPECIFIED *…IN�D1�IN�THE�CALLING�SEQUENCE.**‚CALLING�SEQUENCE:!*…MOVE.L�,�D0*…MOVE.L�,D11*…MOVE.L�,A0*…BSR�BINDECFJ* *‚RETURNS:*…D0�=�0�=>GOOD�CONVERSION**‚REGS�USED:‚0�1�2�3�4�5�6�7 *Š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 LENGTH�LEA…TENS(PC),A1�START�OF�TABLE" ADD.L D2,A1 ADJUST FOR DIFFERENCE&�MOVE.W�#'‚',D2�INITIALIZE�ACCUMULATOR%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�#'‚',D2�LEADING�ZERO�TEST! 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*‚SUBROUTINE�TO�CONVERT�BINARY�PROTECTION�KEYS�TO�ASCII,*********************************************‚CALLING�SEQUENCE:*…MOVE.W�,D0*…BSR�CVTKEYBA*3*‚RETURNS�4�ASCII�CHARS�IN�D0�(WRITE�IN�UPPER�HALF)*!*‚REGISTERS�USED:‚0�1�2�3�4�5�6�7*�Dƒ**�A**‚REV�1.0�RHBR80�7909060939*-*********************************************)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 ‰END�BEGPROC éééé=/*=/*†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ƒ=ARG�DISPATCH.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ƒ=ARG�DISPATCH.LL=/ENDIF=/*=LINK ,DISPATCH.LO,\1;AHMIXATTRIBUTES S PSEG SEG0:0,14 $0000INPUT DISPATCH.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé �M =DISPATCH‚IDNTƒ4,0�8203111430�CHANGE�NO.�CONCURRENT�BATCH�JOBSO*******************************************************************************-*ˆ**�DISPATCH�NUMBER�OF�CONCURRENT�BATCH�JOBSO*******************************************************************************‰PAGE**ˆINCLUDE�STATEMENTS**ˆINCLUDEƒ9995.&.TR1.EQ*ˆINCLUDEƒ9995.&.USM.EQ**‰NOLIST‰INCLUDEƒ9995.&.TR1.EQ‰INCLUDEƒ9995.&.USM.EQ‰LIST‰PAGE ŠXREFƒASCVAL/LIMRUN„EQU„$1D6ˆOBTAINED�FROM�EET�MODULE�DAT.SAŠPAGE ‰SECTIONƒ0 PBA†EQU‡*ŠDC.Bƒ'122084�4'ŠDS.Bƒ64 STACK…DS.Bƒ0BUFF†COMLINE�322DISPAR„DC.Lƒ0,0,BUFF-PBA,EETPNAM,EETSESNO,LIMRUN,4‰ASCII�:‚ARRAY(.CHAR.)�OF�INTEGER;…(*�ASCII�CHARACTER�CODES�*) ¿ Ä! È% Ì/ Ð$ Ô?‰ASHEX�:‚PACKED�ARRAY(.1..36.)�OF�CHAR;(*�FOR�HEX�CONVERSION�*)&‰RECƒ:‚RECTYPE;–(*�HOLDS�RAW�RECORD�*)/‰RECSIZ:‚INTEGER;–(*�HOLDS�LENGTH�OF�RAW�REC�*)-‰BUFF‚:‚BFTYPE;—(*�BUFF�HOLDS�PACKED�BLOCK�*))‰BUFFP�:‚BFINDEX;–(*�INDEX�INTO�BUFFER�*)*‰RESPONSE:�RSPTYPE;•(*�ACK�NAK�RESPONSE�*) ƒPROCEDURE�INITIALIZE;0†TYPE‚CHRARRAY�=‚PACKED�ARRAY�(.1..16.)�OF�CHAR;†VARƒIˆ:‚INTEGER; 2†PROCEDURE�ASGCODE(CODE:INTEGER;�CHRSET:CHRARRAY);‰VARƒI‚:‚INTEGER;‰BEGIN�(*�ASGCODE�*)‰FOR�I�:=�1�TO�16�DO%ŒASCII(.CHRSET(.I.).)�:=�CODE�+�I�-�1‰END;‚(*�ASGCODE�*) †BEGIN�(*�INITIALIZE�*)†FOR�I:=�0�TO�CHRMAX�DO0‰ASCII(.CHR(I).)�:=�32;…(*�FORCE�ASCII�BLANKS�*) †RESET(INFIL);1†ASHEX�:=�'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';!†ASGCODE(112,'pqrstuvwxyz{|}~�');!†ASGCODE(32,'�!"#$%&''()*+,-./'); †ASGCODE(48,'0123456789:;<=>?'); †ASGCODE(64,'@ABCDEFGHIJKLMNO'); †ASGCODE(80,'PQRSTUVWXYZ[\]^_'); †ASGCODE(96,'`abcdefghijklmno'); -†BUFFP�:=�4;œ(*�START�PACKING�RECORDS�HERE�*)†REPEATN /‰WRITE(OUTPUT,'PREAMBLED');Œ(*�SEND�PREAMBLE�*)(‰WRITE(OUTPUT,OPTION);‘(*�SEND�OPTION�*),‰WRITE(OUTPUT,CMAX:3);‘(*�SEND�BLOCK�SIZE�*)1‰WRITELN(OUTPUT,BLKCNT:1);�(*�SEND�BLOCK�COUNT�*)‰READLN(INPUT,RESPONSE);6†UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');†IF�RESPONSE(.1.)�=�'T'(‰THEN�Q�:=�TRUE;˜(*�EARLY�TERMINATION�*)†END;‚(*�INITIALIZE�*) IƒPROCEDURE�COMPRESS(VAR�REC:RECTYPE;�VAR�RECSIZ:INTEGER;�VAR�BUFF:BFTYPE;"–VAR�P:BFINDEX;�VAR�CCNT:INTEGER); ƒVARƒI,Jƒ:‚INTEGER;‰RECPTR:‚INTEGER; †PROCEDURE�COUT(C:CHAR);‰BEGIN�(*�COUT�*)‰BUFF(.P.)�:=�C; ‰P�:=�P�+�1;‰CCNT�:=�CCNT�+�1‰END;‚(*�COUT�*) ƒBEGIN�(*�COMPRESS�*) ƒRECPTR�:=�1;ƒWHILE�RECPTR�<=�RECSIZ�DO†BEGIN †I�:=�RECPTR;F†WHILE�(I<=RECSIZ)�AND�(REC(.RECPTR.)�=�REC(.I.))�AND�(I-RECPTR<35)�DO ‰I�:=�I�+�1;5†I�:=�I�-�RECPTR;‚(*�NUMBER�OF�MATCHING�CHARACTERS�*)/†IF�(I<=3)�AND�(I>0)�AND�(REC(.RECPTR.)�<>�'|')†THEN‰BEGIN‰FOR�J�:=�1�TO�I�DOŒCOUT(REC(.RECPTR.));‰RECPTR�:=�RECPTR�+�I‰END†ELSE ‰IF�I�>�0‰THENŒBEGIN ŒCOUT('|');ŒCOUT(REC(.RECPTR.));ŒCOUT(ASHEX(.I+1.));ŒRECPTR�:=�RECPTR�+�I ŒENDƒ(*THEN*)†ENDƒ(*WHILE*)ƒEND;‚(*�COMPRESS�*) 2ƒPROCEDURE�GETREC(VAR�P:BFINDEX;�VAR�BUFF:BFTYPE);?†VARƒCPOS‚:‚BFINDEX;„(*�POSITION�IN�BUFF�FOR�CHARACTER�COUNT�*)5ŒCCNT‚:‚INTEGER;„(*�NUMBER�OF�CHARACTERS�IN�RECORD�*) ŒQ…:‚BOOLEAN; †BEGIN„(*�GETREC�*)#†IF�EOLN(INFIL)�THEN�READLN(INFIL);†IF�NOT�EOF(INFIL)†THEN‰BEGIN ‰CPOS�:=�P; ‰CCNT�:=�0;,‰P�:=�P+2;’(*�LEAVE�ROOM�FOR�RECORD�COUNT�*) ‰RECSIZ�:=�0;‰WHILE�NOT�EOLN(INFIL)�DOŒBEGINŒREAD(INFIL,REC(.RECSIZ+1.));ŒRECSIZ�:=�RECSIZ�+�1;ŒEND;�(*WHILE*)‰IF�RESPONSE(.2.)�=�'B'‰THENŒBEGIN ŒQ�:=�FALSE;"ŒWHILE�(NOT�Q)�AND�(RECSIZ�>�0)�DO�IF�REC(.RECSIZ.)�=�'�'�THEN’RECSIZ�:=�RECSIZ�-�1�ELSE ’Q�:=�TRUEŒEND;"‰COMPRESS(REC,RECSIZ,BUFF,P,CCNT);F‰BUFF(.CPOS.)�:=�ASHEX(.CCNT�DIV�16+1.);ƒ(*�CONSTRUCT�HEX�CHAR�COUNT*)*‰BUFF(.CPOS+1.)�:=�ASHEX(.CCNT�MOD�16+1.); ‰ENDƒ(*THEN*)†END;‚(*�GETREC�*) @ƒPROCEDURE�PUTREC(VAR�Q:BOOLEAN;�VAR�P:BFINDEX;�VAR�BUFF:BFTYPE;”VAR�RESPONSE:RSPTYPE); †VARƒI‚:‚BFINDEX; †PROCEDURE�OUTBLOCK(RTYPE:CHAR);‰VAR�I�:‚INTEGER; �J�:‚INTEGER;�C�:‚INTEGER;‡(*�CHECKSUM�*) ‰BEGIN�(*�OUTBLOCK�*)*‰BUFF(.3.)�:=�RTYPE;‹(*�MARK�BLOCK�TYPE�*)‰C�:=�0;4‰FOR�I�:=�3�TO�CMAX*BLKCNT�DOˆ(*�COMPUTE�CHECKSUM�*)ŒC�:=�C�+�ASCII(.BUFF(.I.).);2‰C�:=�C�MOD�255�+�1;�(*�0�CHECKSUM�IS�WILD�CARD�*)B‰BUFF(.1.)�:=�ASHEX(.C�DIV�16+1.);�(*�PLACE�CHECKSUM�INTO�BLOCK�*)"‰BUFF(.2.)�:=�ASHEX(.C�MOD�16+1.);‰REPEATŒFOR�J�:=�0�TO�BLKCNT-1�DO�BEGIN<�FOR�I�:=�J*CMAX+1�TO�(J+1)*CMAX�DO„(*�WRITE�OUTPUT�BLOCK�*)’WRITE(OUTPUT,BUFF(.I.));�WRITELN(OUTPUT);�END;ŒREADLN(INPUT,RESPONSE)6‰UNTIL�(RESPONSE(.1.)�=�'N')�OR�(RESPONSE(.1.)�=�'T');‰Q�:=�RESPONSE(.1.)='T';5‰C�:=�BLKCNT*CMAX+1;‘(*�JUSTIFY�ANY�BLOCK�OVERFLOW�*)‰WHILE�C�<�P�DOŒBEGIN&ŒBUFF(.C-BLKCNT*CMAX+3.)�:=�BUFF(.C.); ŒC�:=�C�+�1ŒEND;8‰P�:=�P�-�(BLKCNT*CMAX�-�3);‰(*�RESET�NEXT�IN�POINTER�*)‰END;‚(*�OUTBLOCK�*) †BEGIN„(*�PUTREC�*)†WHILE�P�>�BLKCNT*CMAX+1�DO/‰OUTBLOCK('A');Š(*�OUTPUT�INTERMEDIATE�BLOCK�*)†IF�EOF(INFIL)†THEN‰BEGIN‰FOR�I�:=�P�TO�BLKCNT*CMAX�DO5ŒBUFF(.I.)�:=�'�';„(*�FORCE�BLANKS�TO�END�OF�BLOCK�*)'‰OUTBLOCK('Z');Š(*�OUTPUT�LAST�BLOCK�*) ‰Q�:=�TRUE;‰END†ELSEF‰IF�P�>�BLKCNT*CMAX�THEN�OUTBLOCK('A')�(*�OUTPUT�INTERMEDIATE�BLOCK�*)†END;…(*�PUTREC�*) ƒBEGIN„(*�MAIN�*) ƒQ�:=�FALSE; ƒINITIALIZE;ƒWHILE�NOT�Q�DO†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 ƒ=ARG�DMT.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 ƒ=ARG�DMT.LL=/ENDIF=/*=LINK ,DMT.LO,\1;HIMX ATTRIBUTES P SEG MOUN:0-15 INPUT DMT.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééO é á6ŠTTL�VERSAdos�Dismount�Utility�Ver.�4.00�(Description)LDSMNT IDNT 4,0 DISMOUNT Utility 3/1/83 Rel. 4.00 Copyright 1983 Motorola Inc ŠNOFORMATŠOPT„FRS,BRS,CREO*********************************************************************************œDismount�Utility*œ--------�-------*F*ƒThis�utility�performs�a�function�that�is�the�complement�of�the�Mount0* utility. Its function is sumarized as follows:**‰For�mounted�VERSAdos�disks*‰---�-------�--------�-----*C*‰1.‚Make�an�exclusive�read/write�volume�assignment�to�the�disk.�IfC*‹exclusive�access�is�denied,�it�is�assumed�that�the�disk�is�in�use1*‹by�another�task�and�an�error�exit�is�performed.*D*‰2.‚Close�the�volume�assignment�made�in�step�1.�This�will�cause�FMSC*‹to�attempt�to�read�the�Volume�ID�(sector�0).�Since�the�user�opensD*‹the�disk�drive�door(i.e�puts�the�device�off-line)�prior�to�callingA*‹this�utility,�the�attempt�to�read�sector�0�will�return�an�errorA*‹causing�FMS�to�close�its�exclusive�read/write�device�assignment4*‹and�allowing�Dismount�to�make�a�device�assignment.*F*‰3.‚Attempt�to�make�an�exclusive�read/write�assignment�to�the�device.A*‹If�exclusive�access�is�denied,�the�device�was�not�off-line�whenD*‹Dismount�was�called�and�FMS�still�holds�an�exclusive�assignment�onC*‹the�device.�If�this�condition�occurs,�an�error�exit�is�performed.*E*‰4.‚Issue�a�Configure�request�to�the�device�with�the�Dismount�optionD*‹the�configuration�of�the�device�is�not�changed�but�the�driver�willB*‹reject�any�further�I/O�requests�for�the�device�until�a�Configure,*‹request�is�received�with�the�Mount�option.*E*‰5.‚Close�the�device�assignment�made�in�step�3.�The�close�processingC*‹will�cause�the�current�device�configuration�to�be�changed�back�to*‹the�default�configuration.**‰For�mounted�Foreign�disks*‰---�-------�-------�-----2*‰Steps�3-5�only�are�performed�as�described�above.*I*ƒThis�utility�is�intended�for�use�with�drives�or�controllers�that�do�not ê-ééééé