IMD 1.17: 11/11/2014 12:02:00 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 26 OF 30  SR26q82VKXSVRDOS 0420§o-  îrrŠPAGEOREPAIR IDNT 04,02 REPAIR Utility 01/31/85 Rel. 4.00 Copyright 1983 Motorola Inc‰PAGE**%*ˆBKM�LOGIC�CHANGES�TO�REPAIR�UTILITY***‰1.�'C'�OPTION�IS�TRULY�A�CHECK�ONLY�MODE!*�NO�UPDATING�WHAT-SO-EVER�OCCURS*;*‰2.�FOR�VARIABLE�LENGTH�RECORDS�(VRL)�AN�EDIT�IS�PERFORMED8*ŒTO�ENSURE�THAT�THE�BALANCE�OF�THE�DATA�BLOCK�IS�ZERO'S)*ŒAFTER�THE�LAST�RECORD�IN�THE�DATA�BLOCK*>*‰3.�FIXED�A�LOGIC�BUG�IN�THE�'UPDATE'�ROUTINE�TO�EDIT�FOR�THE*Œ'CR'�RESPONSE�ONLY*C*‰4.�STEVE�BALL�HAD�ALREADY�MADE�CHANGES�FOR�PROBLEM�OF�A�CRC�ERROR?*ŒWHILE�PROCESSING�SAT�TO�DISPLAY�ONLY�THOSE�SECTORS�IN�THE�SAT?*ŒTHAT�HAD�A�CRC�ERROR�---�THE�CODE�HAD�NOT�BEEN�CHECKED�OUT�--<*ŒI�CHECKED�IT�OUT�AND�MADE�MINOR�CHANGES�FOR�THOSE�PROBLEMS *ŒENCOUNTERED*C*‰5.�STEVE�BALL�HAD�ALREADY�MADE�CHANGES�FOR�PROBLEM�OF�PRINTER�NOTD*ŒREADY�--�A�1.5�SECOND�DELAY�AND�REPEAT�OF�ATTEMPT�TO�PRINT�MESSAGE>*ŒWAS�PUT�IN�--�ANY�ERROR�OTHER�THAN�NOT�READY�WOULD�TERMINATEA*ŒPROCESSING�--�THE�CODE�HAD�NOT�BEEN�CHECKED�OUT�--�I�CHECKED�IT;*ŒOUT�AND�MADE�MINOR�CHANGES�FOR�THOSE�PROBLEMS�ENCOUNTERED*F*‰6.�MESSAGE�-�PRINTER�ERROR�D0�=�XXXXXXXXU�-�WAS�BEING�OUTPUT�BECAUSED*ŒTHE�WRONG�ENDING�ADDRESS�WAS�BEING�SPECIFIED�-�THE�EXTRA�CHARACTER3*Œ'U'�WAS�BEING�DISPLAYED�---�PROBLEM�WAS�CORRECTED*$*ƒChanges�made�by�Marc�Briel‚1/17/83*E*‰1.�Modified�the�SAT�check�routine�to�execute�properly�if�the�number?*‹of�sectors�on�the�disk�being�repaired�exactly�filled�the�SAT.A*‹Previously,�REPAIR�would�attempt�to�allocate�sectors�far�beyond@*‹the�end�of�the�SAT�buffer�causing�a�bus�error�or�system�crash.*F*‰2.�Added�a�check�for�the�disk�configuration�area.�If�a�configurationD*‹area�exists,�its�length�must�be�non-zero�or�an�error�is�issued�andD*‹the�utility�terminates.�If�the�length�is�non-zero,�the�disk�SAT�isB*‹checked�to�assure�that�the�sectors�are�allocated�and�the�sectorsB*‹are�allocated�in�the�reconstructed�SAT.�Any�allocation�conflicts"*‹that�arise�are�handled�as�usual.*/(J0P8I@*HGPHX2`ohppnxm€uˆw�K˜H A¨E°P¸OÀDÈ;ÐHØAàaè@ð@øFTE (*ƒChanges�made�by�Ron�Jones,�Jr.�7/26/83*G*‰1.�Added�a�line�of�code�to�the�"CHECK�ATTRIBUTES"�routine�that�maskesC*Œoff�all�but�the�bits�that�represent�the�file�type.�This�fixed�theB*Œproblem�of�an�error�"ER:�FILE�ATTRIBUTES"�bieng�generated�if�anyA*Œof�the�bits�in�the�user�specified�attribute�field�are�set.�This=*Œis�even�though�all�other�file�attributes�are�correctly�set.‰PAGE*!* EQUATES (INCLUDED UNDER NOLIST)ŠNOLISTŠINCLUDE�9995.&.EXE.EQŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.NIO.EQŠINCLUDE�9995.&.FME.EQŠINCLUDE�9995.&.FMI.EQŠLIST*‰INCLUDE�9995.&.EXE.EQ*‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.IOE.EQ*‰INCLUDE�9995.&.NIO.EQ*‰INCLUDE�9995.&.FME.EQ*‰INCLUDE�9995.&.FMI.EQ*O*******************************************************************************O**********************************************************************************$*ˆR�E�P�A�I�R„U�T�I�L�I�T�Y‚-�PART�1***O*******************************************************************************O*********************************************************************************ˆ*************ˆDATA�SECTION*ˆ*************B*ˆNOTE:�ALL�SECTOR�NUMBERS�MUST�BE�LESS�THAN�OR�EQUAL�TO�$7FFFFFFF*ˆ(HIGH�ORDER�BIT�OFF).2*ˆALSO,�2�COMPLETE�SAT�BUFFERS�ARE�MEMORY�RESIDENT***ˆLINKAGE�TO�PART�2*ŠXDEFƒBŠXDEFƒSATABUF,SATDBUF,SATFLG(ŠXREFƒBDCONV,EDITFILE,OPTION,PARSE,SBARG/ŠXREFƒALDESC,TSTNYA,TSTFRE,TSTALC,DEALLC,ALLOCT9ŠXREFƒDECBINW,CHKKEY,IM,HEXBIN,CLRBUF,BLNKFL,ALPHA,ALFNUM ŠXREFƒBIN4HEX ŠXREFƒBIN2HEX ŠXREFƒBIN1HEX ŠXREFƒBIN2DECŠOPT„A *ˆEQUATES*3PDBSZE„EQU„DBSZEŽCHANGE�NAMES�FOR�UNIFORMITY'S�SAKEPDBFPT„EQU„DIRFPTPDBENT„EQU„DIRENTPDBSTR„EQU„DIRSTRPDBLEN„EQU„DIRLEN*7*ˆTHE�FOLLOWING�LUN'S�MUST�BE�AVAILABLE�FOR�ASSIGNMENT:D*ˆ(CDF/LDF�LUN�MUST�BE�ASSIGNED�AND�TRANSFERRED�TO�REPAIR�BY�LOADER)**VOLLUN„EQU„1’LUN�FOR�VOLUME�TO�BE�REPAIREDPRTLUN„EQU„2’LUN�FOR�PRINTER**ˆTASK�AND�SEGMENT�EQUATES*&TASKID„EQU„'REPA'�TASK�NAME�FOR�REPAIR.SATSEG„EQU„'SATS'�SEGMENT�NAME�FOR�SAT�SEGMENTB*ˆ(SEGMENT�ALLOCATED�AFTER�VID�CHECK�STEP�-�REMAINS�ALLOCATED�TILL*ˆREPAIR�TERMINATES.)-FDBSEG„EQU„'FDBS'�FAB/DATA�BLOCK�SEGMENT�NAMED*ˆ(SEGMENT�ALLOCATED�FOR�EACH�NONCONTIGUOUS�FILE�CHECK�-�DEALLOCATED*ˆAT�END�OF�THE�FILE�CHECK.)**CRˆEQU„$D‘CARRIAGE�RETURNLFˆEQU„$A‘LINE�FEED2NOPTIONƒEQU„0’D6�EQUATE�FOR�SCANNING�OPTIONS�FIELD1MAXBAD„EQU„12‘NUMBER�OF�TRACKS�FOR�ALT�SECTORS‚()ŠPAGE*1*ˆD7�BIT�EQUATES�-�SEE�VID�CHECK�FOR�MORE�DETAILS*"DEFOPT„EQU„1’DEFAULT�OPTION�STATUSKOPTIONƒEQU„131RCRSAT„EQU„14‘1�=>�RECREATE�SAT,�0�=>�USE�OLD�SAT9COPTIONƒEQU„15‘IM�OFF�FOR�CHECK-ONLY�MODE�(TERM�ON�ERROR)&IMC‡EQU„16‘IM�OFF�MODE�TILL�ERROR/DONE3NXTSTP„EQU„17‘IM�OFF�TILL�NEXT�MAJOR�STEP�OF�REPAIR.STP1†EQU„18‘IM�TURNED�OFF�TILL�NEXT�MINOR�STEP/FOUNDF„EQU„29‘SET�=>�FILE�FOUND�FOR�FILE�REPAIR*’OFF�=>�FILE�NOT�FOUND�YETROPTIONƒEQU„301FREPAIRƒEQU„31‘FILENAME�GIVEN‚FOR�REPAIR/RECOVERY5NIMASK„EQU„$0FFF0000ŠMASK�TO�TURN�IM�BACK�ON�IF�ERROR**O******************************************************************************** ŠSECTION�0B‰EQU„*’FOR�BASE�REFERENCINGŠDC.Bƒ'013185�4'*O********************************************************************************PATCH:„DS.Bƒ100�PATCH�AREA*ŠDS.Bƒ500�STACK�AREA*3STACK…EQU„*’STACK�OVERFLOW�WILL�CAUSE‚ADDRESS�ERROR*$************************************ *ˆM�A�C�R�O�S$************************************ L0LFƒMACROŠDC.Bƒ\1ŠDC.BƒCRŠDS…0ŠENDM L1LFƒMACROŠDC.Bƒ\1ŠDC.BƒCRŠDC.BƒLFŠDS…0ŠENDM L2LFƒMACROŠDC.Bƒ\1ŠDC.BƒCRŠDC.BƒLFŠDC.BƒLFŠDS…0ŠENDM *ˆ****************************ˆSTART�OF�UNINITIALIZED�DATA*ˆ**************************** DATAUI„EQU„**-DRVHEADS‚DS.Bƒ1’NUMBER�OF�HEADS�ON�THIS�DRIVE4SECPTRAK‚DS.Bƒ1’NUMBER�OF�SECTORS/TRACK�ON�THIS�DISK7ALTLASTƒDS.Lƒ1’PSN�OF�FIRST�SECTOR�OF�ALTERNATE�SECTORS2LSTSRD„DS.Lƒ1’PSN�OF�LAST�SECTOR�BEFORE�READ�ERROR 8TOTVSECT‚DS.Lƒ1’TOTAL�NUMBER�OF�VERSAdos�SECTORS�ON�DISKLINESTRT‚DS.Lƒ1AMTLEFTƒDS.Lƒ1 SDBDEL„DS.Lƒ1 PDBDEL„DS.Lƒ1**ˆSECTOR�BUFFER�FOR�VID*VIDBUF„DS.Bƒ256*6*ˆSECTOR�BUFFER�FOR�READING�IN�SECTORS�FOR�UPDATE/DUMP*SECBUF„DS.Bƒ2560PSNSEC„DS.Lƒ1’PSN�OF�SECTOR�IN�BUFFER�(0�=�NONE)***‰POINTERS�TO�THE�BUFFER�IN�USE*/USESBUFƒDS.Lƒ1’ADDRESS�OF�SDB�BUFFER�BEING�USED/USEPBUFƒDS.Lƒ1’ADDRESS�OF�PDB�BUFFER�BEING�USED** *‰SDB�BUFFER*-PSNSDB„DS.Lƒ1’PSN�OF�SDB�IN�BUFFER�(0�=�NONE)'PRVSDB„DS.Lƒ1’PRIOR�SDB'S�PSN,�0�=�NONE'NXTSDB„DS.Lƒ1’PSN�OF�NEXT�SDB,�0�=�NONE SPTR1…DS.Lƒ1SDBBUF„DS.BƒSDBSZE*256*6*‰ALTERNATE�SDB�BUFFER†(USED�IN�EMPTY�STRUCTURE�CHECK)* SPTR2…DS.Lƒ1SDB2BUFƒDS.BƒSDBSZE*256** *ˆPDB�BUFFER*.PSNPDB„DS.Lƒ1’PSN�OF�PDB�IN�BUFFER‚(0�IF�NONE)-PRVPDB„DS.Lƒ1’PSN�OF�PREVIOUS�PDBƒ(0�IF�NONE))NXTPDB„DS.Lƒ1’PSN�OF�NEXT…PDBƒ(0�IF�NONE) PPTR1…DS.Lƒ1PDBBUF„DS.BƒPDBSZE*256*6*‰ALTERNATE�PDB�BUFFER†(USED�IN�EMPTY�STRUCTURE�CHECK)* PPTR2…DS.Lƒ1PDB2BUFƒDS.BƒPDBSZE*256**:*ˆSAT�BUFFER�ADDRESSES‚-�BUFFERS�ALLOCATED�AFTER�VID�CHECK*@SATABUFƒDS.Lƒ1‹ADD.�OF�ALLOCATION�SAT�BUFFER�(CREATED�BY�REPAIR)DSATDBUFƒDS.Lƒ1‡ADD.�OF�OLD�SAT�BUFFER�(FROM�DISK,�CHANGED�BY�REPAIR)**ˆPRIOR�FAB'S�LAST�KEY*$PRIFKY„DS.Bƒ100�100�=�MAX�KEY�LENGTHŠPAGE*D*ˆFAB�AND�DATA�BLOCK�BUFFERS�-�BUFFER�ALLOCATED�FOR�EACH�FILE�DURING+*ˆFILE�CHECK,�RELEASED�AT�END�OF�THE�CHECK.*5PSNFAB„DS.Lƒ1’PSN�OF�CURRENT�FAB�IN�MEMORY�(0�=�NONE),PRVFAB„DS.Lƒ1’PSN�OF�PREVIOUS�FAB�(0�=�NONE)JFABLNK„DS.Lƒ1�PSN�OF�LAST�FAB�USING�FORWARD�LINKS,�TO�BE�LINKED�(0�=�NONE):FDBSTR„DS.Lƒ1�STARTING�LOGICAL�ADDRESS�OF�FAB-DATA-SEGMENT9*’ADDRESS�KNOWN�AFTER�IT�IS�ALLOCATED.�(PHYSICAL=LOCIGAL)5*’SEGMENT�ALLOCATED�FOR�EACH�FILE�CHECK�TO�GET�PROPER9*’SIZE�BUFFERS;�FAB�BUFFER�IS�AT�BEGINNING�OF�THE�SEGMENT'*’AND�IS�FOLLOWED�BY�DATA�BLOCK�BUFFER.'FABBUF„EQU„FDBSTR�ADDRESS�OF�FAB�BUFFER3PSNDB…DS.Lƒ1’PSN�OF�DATA�BLOCK�IN‚MEMORY�(0�=�NONE)!DBBUF…DS.Lƒ1’ADDRESS�OF�DB�BUFFER.DBEND…DS.Lƒ1’ADDRESS�OF�LAST�BYTE�OF�DBBUF�+�1-DBLEA…DS.Lƒ1’LOGICAL�END�ADDRESS�OF�DB�BUFFER&FABLEN„DS.Lƒ1’NUMBER�OF�SECTORS�IN�FAB2FABCHK„DS.Bƒ1’FAB�LINK�FLAG�FOR�CHECKING�FAB�CHAINFFBFLNK„EQU„0ƒDO�FORWARD�THEN�BACKWARD�SEARCH,�NOW�DOING�FORWARD�SEARCH#FLOLNK„EQU„1’DO�ONLY�FORWARD�SEARCH6FBBLNK„EQU„2’DOING�BACKWARD�SEARCH�AFTER�FORWARD�LINKS$BLOLNK„EQU„3’DO�BACKWARD�SEARCH�ONLY)LSTLNK„EQU„$FF�DONE,�DOING�LAST�FAB�CHECKDBFLG…DS.Bƒ1‰0�=�DB‚NOT�UPDATED,�1�=�DB‚UPDATED,�WRITE�TO�DISK?SATFLG„DS.Bƒ1‰0�=�SAT�NOT�TO�BE�UPDATED,�1�=�UPDATE�SAT�ON�DISKBCFGAFLGƒDS.Bƒ1‰0�=�CFGA�NOT�TO�BE�UPDATED,�1�=�UPDATE�CFGA�ON�DISK**5PRTFLG„DS.Bƒ1’0�=>�DUMP�TO�LDFLUN,�1�=�DUMP�TO�PRTLUNGCPYFLG„DS.Bƒ1ƒ1�=>�TERMINAL�OUTPUT�ONLY,�0�=>�HARD�COPY�TO�LINE�PRINTER%LINECNTƒDS.Bƒ1’LINES�PER�PAGE�PRINTED:MAXLINES‚DC.Bƒ1’MAX�#�OF�LINES�PER�PAGE�FOR�PRINTER�OUTPUT!FILOK…DS.Bƒ1’1=FILE�OK,�0=�NOT�OK 6RCVFLG„DS.Bƒ1’1=RECOVERING�DELETED�FILE,�0=NO�RECOVERY,DELCRI„DS.Bƒ1’1=DELETE�CURRENT�ITEM,�0=DON'T-DELPRI„DS.Bƒ1’1=DELETED�PRIOR�FAB,0=IF�DIDN'T,DELNXF„DS.Bƒ1’1=DELETED�NEXT�FAB,0=IF�DIDN'T*KILL†DS.Bƒ1’KILL�REPAIR*&TEMP†DS.Lƒ1’TEMPORARY�REGISTER�STORAGE**'*‰FLAGS�USED�BY�'EMPTY�STRUCTURE�CHECK'*/CRSDBFLG‚DS.Bƒ1’SDB�CURRENT�BUFFER�UPDATED�FLAG3FIRSFLGƒDS.Bƒ1’1st�CHAR�IN�LINE�TO�BE�PRINTED�FOUND-LSSDBFLG‚DS.Bƒ1’PREVIOUS�STRUCTURE�=�SDB�FLAG-LSPDBFLG‚DS.Bƒ1’PREVIOUS�STRUCTURE�=�PDB�FLAG/PUPFLG„DS.Bƒ1’PDB�ALTERNATE�BUFFER�UPDATED�FLAG/SUPFLG„DS.Bƒ1’SDB�ALTERNATE�BUFFER�UPDATED�FLAG2SATSGFLG‚DS.Bƒ1’1=�SAT�SEGMENT�ALLOCATED�IN�MEMORY***‰FLAGS�USED�BY�HELP�FACILITY*)ASKCTFLG‚DS.Bƒ1’1=�ASK�TO�CONTINUE‚0=�NOT***ˆUPDATE�SECTOR�LIMITS*>UPDSTR„DS.Lƒ1ŒUPDATE�PSN�BOUNDS:�FIRST�PSN�THAT�MAY�BE�UPDATED*œ(LOWER�BOUND)/UPDEND„DS.Lƒ1’FIRST�PSN�THAT�MAY�NOT�BE�UPDATED*œ(UPPER�BOUND�+�1)ŠPAGE**ˆDISK�ATTRIBUTES*FMPSN†DS.Lƒ1‚LAST�PSN�AVAILABLE�ON�THE�DISK�(MPSN+1=TOTAL�#�OF�SECTORS)ANOSEC…DS.Wƒ1ˆ#�OF�SECTORS�NOT�ON�DISK�BUT�MARKED�ALLOCATED�IN�SAT**ˆLINE�BUFFER�FOR�DUMP*LINEBUFƒDS.Bƒ2’2�SPACESOFSFLD„DS.Bƒ2’OFFSET�FIELDŠDS.Bƒ2’2�SPACES.ŠDS.Bƒ16*3+1�16�BYTES�IN�HEX�FOLLOWED�BY�SPACEŠDS.Bƒ3’3�SPACES#ASCFLD„DS.Bƒ16‘ASCII�REPRESENTATIONLINEL…EQU„*-LINEBUF**ˆ**************************ˆEND�OF�UNINITIALIZED�DATA*ˆ**************************ŠDS.Lƒ0:DATAUILƒEQU„*-DATAUI‹BYTE�COUNT�TO�CLEAR�IN�INITIALIZATIONŠPAGE*(*ˆCOMMAND�LINE�AND�INPUT/RESPONSE�BUFFER*(INPBUF„COMLINE�81�80�CHARACTER�LINE�+�CRINPBUFEƒEQU„*-1�END�OF�BUFFERŠDS.Lƒ0*)INITREGƒEQU„*’REGS�SAVED�ON�INITIAL�ENTRY-STSKNAMƒDS.Lƒ1’D0�=�TASK�NAME�THAT�STARTED�ME1SESNUM„DS.Lƒ1’D1�=�SESSION�NUMBER�THAT�STARTED�ME&VOLNAM„DS.Lƒ1’D2�=�DEFAULT�VOLUME�NAME'USERNUMƒDS.Lƒ1’D3�=�DEFAULT�USER�NUMBER(CATNAMEƒDS.Lƒ1’D4�=�DEFAULT�CATALOG�NAME-ŠDS.Lƒ1’D5�=�2ND�HALF�OF�DEFAULT�CATALOG�NAME,ŠDS.Lƒ1’D6�=�#�OF�CHARACTERS�IN�COMMAND�LINESAVD7…DS.Lƒ1’D7�=�LU�MASKINITA0„DS.Lƒ1’A0�=�TASK�NAME INITA1„DS.Lƒ1*#*ˆFILENAME�FOR�FILE�REPAIR/RECOVERY*#USRNUM„DC.Bƒ'„'�USER�NUMBER�(ASCII)CATNAM„DC.Bƒ'ˆ'‰CATALOG�NAMEFILNAM„DC.Bƒ'ˆ'‰FILE�NAMEEXTNAM„DC.Bƒ'‚'�EXTENSION*ŠPAGE** *ˆMESSAGES**ˆREPAIR�HEADER*ŠDS.Lƒ0REPVER„DC.BƒLF*ŠDC.Bƒ'VERSADOS�REPAIR�UTILITY�-�VERSION‚'&REPVERPƒDC.Bƒ'ˆ'‰RECEIVES�VERSION�CODEŠDC.BƒLFREPVERLƒEQU„*-REPVER*ŠDS.Lƒ0LFMSG…DC.Bƒ'�'LFMSGL„EQU„*-LFMSG*ŠDS.Lƒ0TOFMSG„DC.Bƒ$C‘TOP�OF�FORM*ŠDC.Bƒ'VERSADOS�REPAIR�UTILITY�-�VERSION‚'&TOFMSGPƒDC.Bƒ'ˆ'‰RECEIVES�VERSION�CODEŠDC.BƒLFTOFMSGLƒEQU„*-TOFMSGŠPAGE HLPSMSG:‚EQU�* HLPLMSG:‚DS‚0@�L0LF�<'�/////////////////////////////////////////////////////'>�L0LF�<'Ž/‘--‚HELP‚--–/�'>A�L0LF�<'�/////////////////////////////////////////////////////‚'>A�L0LF�<'�Many�commands�are�valid�for�only�certain�update�loops.'>=�L0LF�<'�The�following�diagram�illustrates,�with�asterics,‚'>3�L0LF�<'�the�commands�valid�for�each�update�loop.'>3�L1LF�<'�(NOTE�"FSU"�represents�FINAL�SAT�UPDATE)'> 6�L0LF�<'™VID�-CFGA-�SAT-�SDB-�PDB-�PDE-�FAB-�DB-�FSU'>6�L0LF�<'™-------------------------------------------'>�L0LF�<'„A¾*'>�L0LF�<'„A�$[,n]•*ž'>�L0LF�<'„C•*„*…*„*„*„*„*„*„*'>�L0LF�<'„D¥*„*„*„*„*„*'>�L0LF�<'„D�$[,n]�*…*ž'>�L0LF�<'„N•*„*…*„*„*„*„*„*„*'>�L0LF�<'„Q•*„*…*„*„*„*„*„*…'>!�L0LF�<'„$[,n]‘*„*…*„*„*„*„*„*…'>*�L0LF�<'„$[,n]�[#PR]†*„*…*„*„*‰*„*…'>.�L0LF�<'„$�xx[,xx]…*…*„*„*‰*„*…'>(�L0LF�<'„�xx[,xx]‹*…*„*„*‰*„*…'> �L2LF�<'„’*„*…*„*„*„*„*„*…'>HLPSMSGL‚EQU„*-HLPSMSG�L0LF�<'‚A‚--½'>F�L0LF�<'ˆAllocate�-�used�only�in�final�SAT�CHECK�when�SAT�is�not�to‚'>#�L1LF�<'ˆbe�recreated�by�REPAIR.¥'> �L0LF�<'‚A�$[,n]¶'>D�L0LF�<'ˆAllocate�sectors�in�SAT,�where��is�a�physical�sector'>D�L0LF�<'ˆnumber�(in�HEX)�within�the�SAT,�and�where�n�(if�given,�is'>?�L0LF�<'ˆthe�decimal�number�of�consecutive�sectors�affected).'>�L1LF�<'ˆn�defaults�to�1.'>  G�L0LF�<'‚C‚--�Terminates�loop,�and�continues�in�check�only�mode�until'>C�L2LF�<'ˆan�error�is�encountered�or�until�execution�is�completed.'> �L0LF�<'‚D�$[,n]'>B�L0LF�<'ˆDelete�or�deallocate�sectors�from�SAT,�where��is�a'>=�L0LF�<'ˆphysical�sector�number�(in�HEX)�within�the�SAT,and'>B�L0LF�<'ˆwhere�n�(if�given)�is�the�decimal�number�of�consecutive'>-�L1LF�<'ˆsectors�affected.‚n�defaults�to�1.'> �L0LF�<'‚$[,n]�[#PR]'>C�L0LF�<'ˆDump�any�sector(s)�to�the�listing�device,�where�n�is�the'>>�L0LF�<'ˆdecimal�number�of�consecutive�sectors�to�be�dumped.'>�L1LF�<'ˆ(n�defaults�to�1)'> %�L0LF�<'‚$��xx[,xx]...'>F�L0LF�<'ˆUpdate�a�sector�of�the�structure,�where��is�a�physical'>D�L0LF�<'ˆsector�number�(in�HEX)�,��is�a�HEX�value�(0-$FF),'>@�L0LF�<'ˆand�xx�is�either�a�HEX�value�(0-$FF)�or�a�period�(.)�'>C�L0LF�<'ˆfollowed�by�an�ASCII�character.�The�new�values�specified'>D�L0LF�<'ˆ(xx[,xx]...)‚replace�consecutive�bytes�starting�with�the�'>>�L1LF�<'ˆbyte�at�the�given��in�the�specified�sector.'> �L0LF�<'‚�xx[,xx]...'>H�L0LF�<'ˆSame�as�immediately�above,�but�changes�are�always�made�to�the'>G�L0LF�<'ˆfirst�sector�of�the�structure.�Here��must�start�with'>@�L1LF�<'ˆa�numeric�character�(its�value�must�still�be�(0-$FF).'> A�L1LF�<'‚N‚--�Terminate�loop,�turn�off�IM�until�next�structure.'> )�L0LF�<'‚Q‚--�Always�terminates�REPAIR.'>=�L1LF�<'ˆAll�sectors�updated�in�memory�are�written�to�disk.'> J�L1LF�<'‚$[,n]�Dump�structure,�if�n�given,�dump�nth�sector�of�structure.'> 8�L1LF�<'‚‚(carriage�return�only.)‚Terminates�loop.'> �L2LF�<'ˆ'> �L2LF�<'ˆ'> �L2LF�<'ˆ'> �L2LF�<'ˆ'> �L2LF�<'ˆ'>  HLPLMSGL‚EQU„*-HLPLMSG******** *HLPSMSG:‚DS.Lƒ0!*L0LF�<'�Q‚--‚terminate�REPAIR.'>8*L0LF�<'�ƒ(carriage�return�only.)‚Terminates�loop.'>A*L0LF�<'�N‚--‚terminate�loop,�turn�off�IM�until�next�structure.'>J*L0LF�<'�$[,n]‚dump�structure,�if�n�given,�dump�nth�sector�of�structure.'>J*L0LF�<'�C‚--‚terminate�loop,�continue�in�check�mode�until�error�or�end.'>*HLPSMSGL‚EQU„*-HLPSMSG********‰PAGE*"*ˆMESSAGES�FOR�EACH�NEW�MAJOR�STEP*ŠDS.Lƒ0 VIDMSG„DC.Bƒ'�***�VID�CHECK�***'ŠDC.BƒLFVIDMSGLƒEQU„*-VIDMSG*ŠDS.Lƒ0"CFGAMSGƒDC.Bƒ'�***�CFGA�CHECK�***'ŠDC.BƒLFCFGAMSGL‚EQU„*-CFGAMSG*ŠDS.Lƒ0 SATMSG„DC.Bƒ'�***�SAT�CHECK�***'ŠDC.BƒLFSATMSGLƒEQU„*-SATMSG*ŠDS.Lƒ0 SDBMSG„DC.Bƒ'�***�SDB�CHECK�***'ŠDC.BƒLFSDBMSGLƒEQU„*-SDBMSG*ŠDS.Lƒ0 PDBMSG„DC.Bƒ'�***�PDB�CHECK�***'ŠDC.BƒLFPDBMSGLƒEQU„*-PDBMSG*ŠDS.Lƒ0!FILMSG„DC.Bƒ'�***�FILE�CHECK�***'ŠDC.BƒLFFILMSGLƒEQU„*-FILMSG*,ŠDS.Lƒ0’FOR�EACH�FILE�CHECKED�SEND�FILE�NAMEFFFMSG„DC.Bƒ':'FUSERNŠDC.Bƒ'„'�USER�NUMBER ŠDC.Bƒ'.'FCATALŠDC.Bƒ'ˆ'‰CATALOG�NAME.FUCMSL„EQU„*-FFFMSG‹USER�#,�CATALOG�MSG�LENGTH ŠDC.Bƒ'.'FFILENŠDC.Bƒ'ˆ'‰FILENAME ŠDC.Bƒ'.'FEXTENŠDC.Bƒ'‚'�EXTENSIONFFFMSGLƒEQU„*-FFFMSG*CLNMSG„DS.Lƒ0­11/27/849ŠDC.Bƒ'�***�EMPTY�DIRECTORY�STRUCTURE�CHECK�***'„11/27/84ŠDC.BƒLF¬11/27/84CLNMSGLƒEQU„*-CLNMSG¦11/27/84ŠPAGE ŠDS.Lƒ0SDBDMSGN‚DC.Bƒ'„'ŠDC.Bƒ'‚empty‚SDB(s)ƒdeleted'SDBDMSGL‚EQU„*-SDBDMSGNŠDS.Lƒ0PDBDMSGN‚DC.Bƒ'„'ŠDC.Bƒ'‚empty‚PDB(s)ƒdeleted'PDBDMSGL‚EQU„*-PDBDMSGNŠDS.Lƒ0TOTDMSGN‚DC.Bƒ'„'#ŠDC.Bƒ'‚empty‚sectors‚de-allocated'ŠDC.BƒLFTOTDMSGL‚EQU„*-TOTDMSGN ŠDS.Lƒ0MOREMSGƒDC.Bƒ'MORE�HELP�(Y/N)?'MOREMSGL‚EQU„*-MOREMSG*ŠDS.Lƒ0"TNUEMSGƒDC.Bƒ'TYPE��TO�RETURN'TNUEMSGL‚EQU„*-TNUEMSG* ŠPAGE**ˆDISK�CONTENT�ERROR�MESSAGES* *ˆVID�ERRORS*ŠDS.Lƒ0LVOLNMSG�DC.Bƒ'ER:�VOL-ID�-1st�char.�must�be�alphabetic,�others�alphanumeric'VOLNMSGL‚EQU„*-VOLNMSG*ŠDS.Lƒ0$VOLDMSGƒDC.Bƒ'ER:�VOLUME�DESCRIPTOR'VOLDMSGL‚EQU„*-VOLDMSG*ŠDS.Lƒ0,WRDMSG„DC.Bƒ'ER:�DISK�NOT�A�VERSADOS�VOLUME'WRDMSGLƒEQU„*-WRDMSG*ŠDS.Lƒ0SATLER„DC.Bƒ'ER:�SAT�LENGTH�=‚' SATLEL„DS.Lƒ1SATLERLƒEQU„*-SATLER*ŠDS.Lƒ0CFGALERŠDC.Bƒ'�ER:�CFGA�LENGTH�ZERO'CFGALERL‚EQU„*-CFGALER*ŠDS.Lƒ0 STPMSG„DC.Bƒ'ER:�SAT�PSN�=�' STPPSN„DS.Lƒ2STPMSGLƒEQU„*-STPMSG*ŠDS.Lƒ0SDPMSG„DC.Bƒ'ER:�SDB�PSN�=�' SDPPSN„DS.Lƒ2SDPMSGLƒEQU„*-SDPMSG*ŠDS.Lƒ0NALMSG„DC.Bƒ'ER:�' NALITM„DS.Lƒ1’ITEM�NOT�ALLOCATEDŠDC.Bƒ'NOT�ALLOCATED�IN�SAT'ŠDC.Bƒ',�PSN�=�' NALPSN„DS.Lƒ2NALMSGLƒEQU„*-NALMSG*ŠDS.Lƒ0SLTMSG„DC.Bƒ'ER:�SLT�PSN�ERROR'SLTMSGLƒEQU„*-SLTMSG*ŠDS.Lƒ0SLSMSG„DC.Bƒ'ER:�SLS�PSN�BAD'SLSMSGLƒEQU„*-SLSMSG*ŠDS.Lƒ0"BTPMSG„DC.Bƒ'ER:�BAD�TEST�PATTERN'BTPMSGLƒEQU„*-BTPMSG*ŠDS.Lƒ0BTSMSG„DC.Bƒ'ER:�TST�PSN�ERROR'BTSMSGLƒEQU„*-BTSMSG*ŠDS.Lƒ0%BDAMSG„DC.Bƒ'ER:�DUMP�AREA�PSN�ERROR'BDAMSGLƒEQU„*-BDAMSG*ŠDS.Lƒ0CHSMSG„DC.Bƒ'ER:�CHECKSUM'CHSMSGLƒEQU„*-CHSMSG*ŠDS.Lƒ0FADMSG„DC.Bƒ'ER:�' FADITM„DS.Lƒ1.ŠDC.Bƒ'REALLOCATED�AFTER�FILE�DELETED,�PSN�=‚' FADPSN„DS.Lƒ2FADMSGLƒEQU„*-FADMSG*ŠDS.Lƒ0LNKMSG„DC.Bƒ'ER:�' LNKITM„DS.Lƒ1ŠDC.Bƒ'�LINK,�PSN�=�' LNKPSN„DS.Lƒ2LNKMSGLƒEQU„*-LNKMSG*ŠDS.Lƒ0ALEMSG„DC.Bƒ'ER:�'ALEITM„DS.Lƒ1’ITEM(ŠDC.Bƒ'�SPACE�ALREADY�ALLOCATED,�PSN�=�' ALEPSN„DS.Lƒ2ALEMSGLƒEQU„*-ALEMSG*ŠDS.Lƒ0CATMSG„DC.Bƒ'ER:�CATALOG�NAME'CATMSGLƒEQU„*-CATMSG*ŠDS.Lƒ0RESMSG„DC.Bƒ'ER:�' RESITM„DS.Lƒ1(ŠDC.Bƒ'�RESERVED�FIELD�NOT�ZERO,�PSN�=�'RESPSN„DS.Lƒ2’PSNRESMSGLƒEQU„*-RESMSG*ŠDS.Lƒ08USAMSG„DC.Bƒ'ER:�UNUSED�SECTORS�MARKED�ALLOCATED�IN�SAT'USAMSGLƒEQU„*-USAMSG*ŠDS.Lƒ0 ATEMSG„DC.Bƒ'ER:�FILE�ATTRIBUTE'ATEMSGLƒEQU„*-ATEMSG*ŠDS.Lƒ0FNEMSG„DC.Bƒ'ER:�FILE�NAME'FNEMSGLƒEQU„*-FNEMSG*ŠDS.Lƒ0EXTMSG„DC.Bƒ'ER:�EXTENSION'EXTMSGLƒEQU„*-EXTMSG*ŠDS.Lƒ0&DBPMSG„DC.Bƒ'ER:�DB�PSN�ERROR,�PSN�=�' DBPPSN„DS.Lƒ2DBPMSL„EQU„*-DBPMSGŠDC.Bƒ',�LENGTH�=‚' DBPLEN„DS.Lƒ2DBPMSGLƒEQU„*-DBPMSG*ŠDS.Lƒ0 FNFMSG„DC.Bƒ'ER:�FILE�NOT�FOUND'FNFMSGLƒEQU„*-FNFMSG*ŠDS.Lƒ07SPNMSG„DC.Bƒ'ER:�USER�#,�CATALOG�NAME�CONFLICT,�PSN�=‚' SPNPSN„DS.Lƒ2SPNMSGLƒEQU„*-SPNMSG*ŠDS.Lƒ0SPCMSG„DC.Bƒ'�DB�'�SDB/PDB ŠDC.Bƒ'�:'SPCUSN„DS.Lƒ1’USER�# ŠDC.Bƒ'.'ŠDS…0(SPCCAT„DC.Bƒ0,0,0,0,0,0,0,0„CATALOG�NAMESPCMSGLƒEQU„*-SPCMSG*ŠDS.Lƒ0EFCMSG„DC.Bƒ'ER:�EOF/EOR'EFCMSL„EQU„*-EFCMSGŠDC.Bƒ'�AND�FAB/DB�CONFLICT'EFCMSGLƒEQU„*-EFCMSG*ŠDS.Lƒ0DBZMSG„DC.Bƒ'ER:�'DBZMS…DC.Bƒ'DB�SIZE�=�' DBZFLD„DS.Wƒ1DBZMSL„EQU„*-DBZMSDBZMSGLƒEQU„*-DBZMSG*ŠDS.Lƒ0FDZMSG„DC.Bƒ'ER:�'ŠDC.Bƒ'FDB�SIZE�=�' FDZFLD„DS.Wƒ1FDZMSGLƒEQU„*-FDZMSG*ŠDS.Lƒ0LDBZMSGƒDC.Bƒ'ER:�LAST�DB�SIZE'LDBZMSGL‚EQU„*-LDBZMSG*ŠDS.Lƒ0FBZMSG„DC.Bƒ'ER:�FAB�SIZE�=�' FBZFLD„DS.Wƒ1FBZMSGLƒEQU„*-FBZMSG*ŠDS.Lƒ0'FDKMSG„DC.Bƒ'ER:�FAB/DB�KEY�CONFLICT�('FDKATR„DC.Bƒ1’L,�F,�OR�H ŠDC.Bƒ')'FDKMSGLƒEQU„*-FDKMSG*ŠDS.Lƒ00FDSMSG„DC.Bƒ'ER:�FAB/DB�SECTOR�CONFLICT,�PSN�=�' FDSPSN„DS.Lƒ2FDSMSGLƒEQU„*-FDSMSG*ŠDS.Lƒ00FDRMSG„DC.Bƒ'ER:�FAB/DB�RECORD�CONFLICT,�PSN�=�' FDRPSN„DS.Lƒ2FDRMSGLƒEQU„*-FDRMSG*ŠDS.Lƒ01EFFMSG„DC.Bƒ'ER:�EMPTY�FILE�-�LAST�FAB�PSN�NOT�0'EFFMSGLƒEQU„*-EFFMSG*ŠDS.Lƒ0#EFBMSG„DC.Bƒ'ER:�EMPTY�FAB,�PSN�=‚' EFBPSN„DS.Lƒ2EFBMSGLƒEQU„*-EFBMSG*ŠDS.Lƒ0&DKEMSG„DC.Bƒ'ER:�DB�KEY�ORDER,�PSN�=�' DKEPSN„DS.Lƒ2DKEMSGLƒEQU„*-DKEMSG*ŠDS.Lƒ0NFLMSG„DC.Bƒ'ER:�NO�FAB�LINKS'NFLMSGLƒEQU„*-NFLMSG*ŠDS.Lƒ0"RLEMSG„DC.Bƒ'ER:�RECORD�LENGTH�=�' RLEFLD„DS.Lƒ1RLEMSGLƒEQU„*-RLEMSG*ŠDS.Lƒ0KEYMSG„DC.Bƒ'ER:�KEY�SIZE�=‚' KEYFLD„DS.Wƒ1KEYMSL„EQU„*-KEYMSG ŠDC.Bƒ'�('#KEYATR„DC.Bƒ1’I�OR�D�OR�S‚OR�H�OR�E ŠDC.Bƒ')'KEYMSGLƒEQU„*-KEYMSG*ŠDS.Lƒ0"BFTMSG„DC.Bƒ'ER:�BAD�FAB�CONTENTS'BFTMSGLƒEQU„*-BFTMSG*ŠDS.Lƒ0.BFLMSG„DC.Bƒ'ER:�BAD�FAB�FORWARD�LINK,�PSN�=�' BFLPSN„DS.Bƒ8BFLMSGLƒEQU„*-BFLMSG*ŠDS.Lƒ0LFPMSG„DC.Bƒ'LAST�FAB�PSN�=‚' LFPPSN„DS.Lƒ2LFPMSGLƒEQU„*-LFPMSG*ŠDS.Lƒ0/BBLMSG„DC.Bƒ'ER:�BAD�FAB�BACKWARD�LINK,�PSN�=�' BBLPSN„DS.Bƒ8BBLMSGLƒEQU„*-BBLMSG*ŠDS.Lƒ0PFPMSG„DC.Bƒ'PRIOR�FAB�PSN�=‚' PFPPSN„DS.Lƒ2PFPMSGLƒEQU„*-PFPMSG*ŠDS.Lƒ0$FUSMSG„DC.Bƒ'ER:�FAB�USAGE�FRACTION'FUSMSGLƒEQU„*-FUSMSG*ŠDS.W†0X00100:+ŠDC.B†'ER:�DATA�EXIST�AFTER�LAST�DB�RECORD' X00199„EQU‡*-X00100ŠPAGE**ˆDEFAULT�REPAIR�MESSAGES*ŠDS.Lƒ0RECMSG„DC.Bƒ'R:�RECALCULATE'RECMSGLƒEQU„*-RECMSG*ŠDS.Lƒ0ZROMSG„DC.Bƒ'R:�ZERO�OUT'ZROMSGLƒEQU„*-ZROMSG*ŠDS.Lƒ0RSTMSG„DC.Bƒ'R:�RECREATE�SAT'RSTMSGLƒEQU„*-RSTMSG*ŠDS.Lƒ0SEQMSG„DC.Bƒ'R:�SET�EQUAL'SEQMSGLƒEQU„*-SEQMSGŠDC.Bƒ'�TO�FILE�KEY�SIZE'SEKMSGLƒEQU„*-SEQMSG*ŠDS.Lƒ0DELMSG„DC.Bƒ'R:�DELETE�' DELITM„DS.Lƒ1DELMSGLƒEQU„*-DELMSGŠDC.Bƒ'�CHAIN'DELCMSGL‚EQU„*-DELMSG*ŠDS.Lƒ0DEAMSG„DC.Bƒ'R:�DEALLOCATE�'DEAMSGLƒEQU„*-DEAMSG*ŠDS.Lƒ0TRNMSG„DC.Bƒ'R:�TRUNCATE�'TRNITM„DS.Lƒ1’ITEMTRNMSL„EQU„*-TRNMSG ŠDC.Bƒ'CHAIN'TRNMSGLƒEQU„*-TRNMSG*ŠDS.Lƒ0ALCMSG„DC.Bƒ'R:�ALLOCATE�'ALCMSL„EQU„*-ALCMSGALCITM„DS.Lƒ1’ITEMALCMSGLƒEQU„*-ALCMSG*ŠDS.Lƒ0GNVMSG„DC.Bƒ'R:�GIVE�NEW�VALUE'GNVMSGLƒEQU„*-GNVMSG*ŠDS.Lƒ0)RCVMSG„DC.Bƒ'RECOVER�DELETED�FILE�(Y/N)?'RCVMSGLƒEQU„*-RCVMSG*ŠDS.Lƒ0GNFMSG„DC.Bƒ'GIVE�NEW�NAME'GNFMSGLƒEQU„*-GNFMSG*ŠDS.Lƒ0SFEMSG„DC.Bƒ'R:�SET�FILE�EMPTY'SFEMSGLƒEQU„*-SFEMSG*ŠDS.Lƒ0/SWLMSG„DC.Bƒ'R:�SWITCH�TO�USING�BACKWARD�LINKS'SWLMSGLƒEQU„*-SWLMSG*ŠDS.Lƒ0,UBOMSG„DC.Bƒ'R:�USE�BACKWARD�FAB�LINKS�ONLY'UBOMSGLƒEQU„*-UBOMSG*ŠDS.Lƒ0FXLMSG„DC.Bƒ'R:�FIX�LINK'FXLMSGLƒEQU„*-FXLMSGŠPAGE**ˆIO�ERROR�MESSAGES*ŠDS.Lƒ0 CRCMSG„DC.Bƒ'CRC�ERROR�ON�READ�' CRCITM„DS.Lƒ1 ŠDC.Bƒ',�'*PSNMSG„DC.Bƒ'PSN�=�' PSNFLD„DS.Lƒ2PSNMSL„EQU„*-PSNMSGCRCMSGLƒEQU„*-CRCMSG ŠDC.Bƒ',�'DPSNCNT„EQU„*…'PSN�=�X,�CNT'�FOR�SAT�ERROR�AT�END�OF�REPAIR�(8�BYTES)4PSNITM„EQU„*’4�BYTE�ITEM�NAME�AS�PART�OF�DUMP�HEADERŠDS.Lƒ1’4�BYTE�ITEM�NAMEPSNMSGLƒEQU„*-PSNMSGŠDS.Lƒ1’8�BYTE�COUNT�FIELDPSNCML„EQU„*-PSNMSG*ŠDS.Lƒ0IOERMSGƒDC.Bƒ'IO�ERROR,�D0�=�'IOERD0„DS.Lƒ2’STATUSIOERMSLƒEQU„*-IOERMSGŠDC.Bƒ'�FROM‚'IOERRW„DS.Lƒ1’READ/WRITIOERRWCƒDC.Bƒ'E'�WRITE ŠDC.Bƒ'�'IOERITMƒDS.Lƒ1IOERMSGL‚EQU„*-IOERMSG*ŠDS.Lƒ0/WREMSG„DC.Bƒ'ERROR�FROM�WRITE,�STARTING�PSN�=‚'WREPSN„DS.Lƒ2’PSNWREMSGLƒEQU„*-WREMSG*ŠDS.Lƒ0#PRTERMSƒDC.Bƒ'PRINTER�ERROR,‚D0�=�'PRTERD0ƒDS.Lƒ2PRTERMSE‚EQU„*-1PRTERMSL‚EQU„*-PRTERMS*ŠDS.Lƒ0,PROTMSGƒDC.Bƒ'ERROR�--�DISK�WRITE�PROTECTED'PROTMSGL‚EQU„*-PROTMSGŠPAGE**ˆINITIALIZATION�ERRORS*ŠDS.Lƒ0-ASGMSG„DC.Bƒ'UNABLE�TO�ASSIGN�VOLUME�-�ERROR' ŠDC.Bƒ'‚'ASGMD0„DS.Lƒ2’D0�ERROR�CODEASGMSGLƒEQU„*-ASGMSG*ŠDS.Lƒ0IVDMSG„DC.Bƒ'INVALID�DEVICE'IVDMSGLƒEQU„*-IVDMSG*ŠDS.Lƒ0IERMSG„DC.Bƒ'INTERNAL�ERROR�'IERMSGCƒDC.Bƒ0’ERROR�CODEIERMSGLƒEQU„*-IERMSG*ŠDS.Lƒ0LUNMSG„DC.Bƒ'CDF�NOT�ASSIGNED'LUNMSGLƒEQU„*-LUNMSG*ŠDS.Lƒ0 FLUMSG„DC.Bƒ'FREE�LOGICAL�UNIT�' FLULUN„DC.Bƒ1FLUMSGLƒEQU„*-FLUMSG*ŠDS.Lƒ0 COMMSG„DC.Bƒ'COMMAND�LINE�ERROR'COMMSGLƒEQU„*-COMMSGŠPAGE*%*ˆABORT,TERMINATE,COMPLETION‚MESSAGES*ŠDS.Lƒ0BRKMSG„DC.Bƒ'BREAK�KEY!�-‚'*ABRTMSGƒDC.Bƒ'REPAIR�ABORTED'ABRTMSGL‚EQU„*-ABRTMSGBRKMSGLƒEQU„*-BRKMSG*ŠDS.Lƒ0TRMMSG„DC.Bƒ'REPAIR�TERMINATED'TRMMSGLƒEQU„*-TRMMSG*ŠDS.Lƒ0-SEGMSG„DC.Bƒ'SEGMENT�ALLOCATION�ERROR,�D0�=‚'SEGMD0„DS.Lƒ2’D0 ŠDC.Bƒ'‚SEG:'SEGMNM„DS.Lƒ1’SEGMENT�NAMESEGMSGLƒEQU„*-SEGMSG*ŠDS.Lƒ0NDRMSG„DC.Bƒ'NO�DIRECTORIES'NDRMSGLƒEQU„*-NDRMSG*ŠDS.Lƒ0DOKMSG„DC.Bƒ'DISK�OK'DOKMSGLƒEQU„*-DOKMSG*ŠDS.Lƒ0FOKMSG„DC.Bƒ'FILE�OK'FOKMSGLƒEQU„*-FOKMSG*ŠDS.Lƒ0DNEMSG„DC.Bƒ'REPAIR�COMPLETED'DNEMSGLƒEQU„*-DNEMSGŠPAGE**ˆINPUT�REQUESTS*ŠDS.Lƒ0UPDRQSTƒDC.Bƒ'UPDATE�' UPDITM„DS.Lƒ1#UPDQMK„DC.Bƒ'�'�=�?�AFTER�VID�CHECKUPDRQSTL‚EQU„*-UPDRQST*ŠDS.Lƒ0REPRQSTƒDC.Bƒ'REPAIR�(Y/N)?'REPRQSTL‚EQU„*-REPRQST*ŠDS.Lƒ0DMPMSG„DC.Bƒ'DUMP�(Y/N)?'DMPMSGLƒEQU„*-DMPMSG*ŠDS.Lƒ0QUTMSG„DC.Bƒ'QUIT�(Y/N)?'QUTMSGLƒEQU„*-QUTMSG*ŠDS.Lƒ0SKPMSG„DC.Bƒ'SKIP�(Y/N)?'SKPMSGLƒEQU„*-SKPMSG*&*ˆERROR�MESSAGES�ABOUT�RESPONSE�ERRORS*ŠDS.Lƒ0OFSMSG„DC.Bƒ'OFFSET�ERROR'OFSMSGLƒEQU„*-OFSMSG*ŠDS.Lƒ0VALMSG„DC.Bƒ'VALUE�ERROR'VALMSGLƒEQU„*-VALMSG*ŠDS.Lƒ0PERMSG„DC.Bƒ'PSN�ERROR' PERMSGLƒEQU„*-PERMSG*ŠDS.Lƒ0WHTMSG„DC.Bƒ'INVALID�COMMAND�'WHTMSGLƒEQU„*-WHTMSG ŠDS…0:SYNTMSGƒDC.Bƒ'SYNTAX�ERROR�-�try‚?‚or‚H‚for�help�messages'SYNTMSGL‚EQU„*-SYNTMSGŠPAGE*O*********************************************************************************ˆPARAMETER�BLOCKS*O********************************************************************************4*ˆINPUT�IOS�PARAMETER�BLOCK�(CDFLUN�ASSIGNED�BY�SCT)*INPIOS„DC.WƒIOREADŠDC.Wƒ0’FORMATTED,�NEXT,�RECORDŠDC.Bƒ0’STATUS ŠDC.BƒCDFLUNŠDC.Wƒ0’RESERVEDŠDC.Lƒ0ŠDC.Lƒ0’INPBUFŠDC.Lƒ0’INPBUFEŠDC.Lƒ0ŠDC.Lƒ0*5*ˆOUTPUT�IOS�PARAMETER�BLOCK�(LDFLUN�ASSIGNED�BY�SCT)*OUTIOS„DC.WƒIOWRITŠDC.Wƒ0’IOPFOR+IOPNXT+IOPRECŠDC.Bƒ0’STATUS ŠDC.BƒLDFLUNŠDC.Wƒ0ŠDC.Lƒ0ŠDS.Lƒ1ŠDS.Lƒ1ŠDC.Lƒ0ŠDC.Lƒ0*2*ˆREPAIR�VOLUME�IOS�PARAMETER�BLOCK�FOR�READ/WRITE* VOLIOS„DS.Wƒ1ŠDC.WƒIOPIMG+IOPBLK+IOPRANŠDC.Bƒ0’STATUS ŠDC.BƒVOLLUNŠDC.Wƒ0ŠDS.Lƒ1ŠDS.Lƒ1ŠDS.Lƒ1ŠDS.Lƒ1ŠDC.Lƒ0ŠPAGE*#*ˆREPAIR�VOLUME�FHS�PARAMETER�BLOCK*VOLFHS„DC.WƒFHASGN ŠDC.WƒFOPEREWŠDC.Bƒ0’STATUS ŠDC.BƒVOLLUNŠDC.Bƒ'„'�VOLUME�NAMEŠDS.Wƒ1ŠDC.Lƒ'„'�CATALOG ŠDC.Lƒ'„'ŠDC.Lƒ'„'�FILENAME ŠDC.Lƒ'„'ŠDC.Wƒ'‚'�EXTENSIONŠDC.Wƒ0ŠDC.Wƒ0’READ/WRITE�CODESŠDS.Bƒ6**ˆPRINTER�FHS�PARAMETER�BLOCK*PRTFHS„DC.WƒFHASGN ŠDC.WƒFOPEWŠDC.Bƒ0’STATUS ŠDC.BƒPRTLUN ŠDC.Lƒ'PR‚'ŠDC.Wƒ0ŠDC.Lƒ'„'�CATALOG�PART�1ŠDC.Lƒ'„'�CATALOG�PART�2ŠDC.Lƒ'„'�FILE�NAME�PART�1ŠDC.Lƒ'„'�FILE�NAME�PART�2 ŠDC.Wƒ'‚'�EXTŠDC.Wƒ0ŠDC.Wƒ0’READ/WRITE�CODESŠDS.Bƒ6**ˆRETRIEVE�PRINTER�ATTRIBUTES*PRTATR„DC.WƒFHRATTŠDC.Wƒ0ŠDC.Bƒ0 ŠDC.BƒPRTLUNŠDS.Bƒ34**ˆPRINTER�ERROR*PRTIOE„DC.WƒIOWRITŠDC.Wƒ0ŠDC.Bƒ0 ŠDC.BƒLDFLUNŠDC.Wƒ0ŠDC.Lƒ0ŠDC.Lƒ0’PRTERMSŠDC.Lƒ0’PRTERMS+PRTERMSL-1ŠDC.Lƒ0ŠDC.Lƒ0*1*ˆSEGMENT�ALLOCATION/DEALLOCATION�PARAMETER�BLOCK*SEGPRB„DC.LƒTASKIDŠDC.Lƒ0&ŠDC.Wƒ1<<13ŽOPTIONS�-�LOGICAL=PHYSICALŠDC.Wƒ0’ATTRIBUTESŠDS.Lƒ1’SEGMENT�NAMEŠDS.Lƒ1’LOGICAL�ADDRESSŠDS.Lƒ1’LENGTH�IN�BYTESŠDC.Lƒ0*(*ˆFETCH�DEVICE�MNEMONICS�PARAMETER�BLOCK*DEVMNE„DC.WƒFHFDMN ŠDC.WƒFOPFRA�RANDOM‚DEVICES�ONLY ŠDC.Wƒ0’NO�LUŠDC.Lƒ0’VIDBUF.ŠDC.Lƒ256*2ŽUSE�VIDBUF+SECBUF�TO�GET�MNEMONICS*ŠPAGE* *ˆDIAGNOSTIC�TEST�PATTERN�IN�VID*KTESTPRNƒDC.B‚$F,$1E,$2D,$3C,$4B,$5A,$69,$78,$87,$96,$A5,$B4,$C3,$D2,$E1,$F0DŠDC.B‚$F,$1E,$2D,$3C,$4B,$5A,$69,$78,$87,$96,$A5,$B4,$C3,$D2,$E1,$F0EŠDC.B�$F1,$F2,$F4,$F8,$F9,$FA,$FC,$FE,$FF,$7F,$BF,$DF,$EF,$6F,$AF,$CF/ŠDC.Bƒ$4F,$8F,$F,7,$B,$D,$E,6,$A,$C,4,8,4,2,1,0*R_FLAG1:‰DC.W†0*œREPAIR�FLAG�1 *œBIT‡MEANING*ž0‡0�-->�NORMAL�STATE'*¦1�-->�TERMINATE�MESSAGE�WAS�DISPLAYEDŠPAGE*O*********************************************************************************ˆP�R�O�G�R�A�M…S�E�C�T�I�O�N*O**********************************************************************************ˆINITIALIZATION***STARTPCƒEQU„*’STARTING�PC�VALUE�FOR�LOADER**ˆINITIAL�REGISTER�CONTENTS:*/*ˆD7�=�BIT�MAP�OF�ASSIGNED�LOGICAL�UNIT�NUMBERS**(*ˆDO�SOME�INITIALIZATION�-�GET�STACK�AND*ˆZERO�UNINITIALIZED�DATA*ŠLEA„STACK(PC),A7‹SET-UP�STACK.ŠLEA„B(PC),A5‹BASE�A5�FOR�POSITION�INDEPENDENT9ŠMOVEM.L�D0-D7/A0-A1,INITREG-B(A5)�SAVE�INITIAL�REGISTERS2ŠMOVE.W�D3,D1ŽCONVERT�USER�NUMBER�TO�HEX�AND�STORE!ŠLEA„USRNUM(PC),A0ŠWHERE�TO�STORE'ŠBSR„BIN2DECŒ2-BYTE�BINARY�TO�ASCII�HEXAŠMOVEM.L�D4-D5,CATNAME-B(A5)�SET�UP�DEFAULT�CATALOG�NAME‚12/03/84 ŠMOVEM.L�(A5),D0-D1ˆVERSION�CODE/ŠMOVEM.L�D0-D1,REPVERP-B(A5)�PLACE�INTO�MESSAGEŠMOVEM.L�D0-D1,TOFMSGP-B(A5)+ŠLEA„DATAUI(PC),A1ŠUNINITIALIZED�DATA�STARTŠMOVE.W�#DATAUIL,D1ˆLENGTHREP00…CLR.W‚(A1)+ŽZERO�OUT ŠSUB.W‚#2,D1 ŠBNE„REP00** INITIALIZE PARAMETER BLOCKSŠLEA„INPBUF(PC),A0ŠLEA„INPBUFE(PC),A1"ŠMOVEM.L�A0/A1,INPIOS+IOSSAD-B(A5)ŠLEA„PRTERMS(PC),A0ŠLEA„PRTERMSE(PC),A1"ŠMOVEM.L�A0/A1,PRTIOE+IOSSAD-B(A5)ŠLEA„VIDBUF(PC),A0ŠMOVE.L�A0,DEVMNE+FHSPTR-B(A5)* <*ˆCHECK�THAT�CDF/LDF�ARE�ASSIGNED�AND�VOLLUN/PRTLUN�ARE�FREE*6ŠMOVE.B�#1,CPYFLG-B(A5)„TERMINAL�OUTPUT�ONLY�INITIALLY+ŠBTSTƒ#LDFLUN,D7‰IS�OUTPUT�DEVICE�ASSIGNED?8ŠBEQ„KILLREP‹NO,�KILL�REPAIR�-�CAN'T�EVEN�SEND�ERROR�MSG**ˆSEND�'REPAIR�VER.REV'�MSG*ŠLEA„REPVER(PC),A0ŠMOVE.L�#REPVERL,D0 ŠBSR„SENDMSGS**ŠBTSTƒ#CDFLUN,D7‰IS�INPUT�DEVICE�ASSIGNED?ŠBEQ„ABRTR1�NO,�ABORT�ERROR�1FŠMOVE.L�#VOLLUN,D0�CHECK�THAT�VOLUME�LUN�HAS�NOT�BEEN�ALREADY�ASSIGNED ŠBTSTƒD0,D7Ž.REPA2…BNE„ABRTR2�ABORT8ŠMOVE.L�#PRTLUN,D0‰CHECK�PRINT�LUN�HAS�NOT�BEEN�ASSIGNED4ŠBTSTƒD0,D7Ž.�(PRINTER�IS�ASSIGNED�ONLY�WHEN�NEEDED)ŠBNE„REPA2ŽABORT�IF�IT'S�GONE*'*ˆCHECK�COMMAND�LINE�-�CR�TERMINATES�IT*(ŠLEA„INPBUF(PC),A0ŠSTARTING�SCAN�ADDRESS ŠBSR„PARSE9ŠMOVE.L�A1,TEMP-B(A5)†SAVE�OUTPUT�FIELD�POINTER�FOR�LATER$ŠROL.L‚#8,D0ŽCHECK�PARSE�CALL�STATUS ŠTST.B‚D0‘.ŠBNE„ABRTR3�ERROR%ŠROL.L‚#8,D0ŽCHECK�INPUT�FIELD�STATUS ŠTST.B‚D0‘.ŠBNE„ABRTR3�ERROR&ŠROL.L‚#8,D0ŽCHECK�OUTPUT�FIELD�STATUS!ŠCMP.B‚#$40,D0Œ.‚NULL�FIELD�IS�OK ŠBEQ.S‚REP05 ŠTST.B‚D0ŠBNE„ABRTR3�ERROR$ŠMOVE.B�#2,CPYFLG-B(A5)„NO�HARD�COPY%REP05…ROL.L‚#8,D0ŽCHECK�OPTIONS�FIELD9ŠMOVE.L�#DEFOPT,D7‰SET�DEFAULT�OPTIONS�-�INTERACTIVE�MODEŠCMP.B‚#$40,D0ŒNO�OPTIONS? ŠBEQ„REP20ŽNOŠTST.B‚D0‘ERROR?ŠBNE„ABRTR3�YESŠPAGE**ˆGET�OPTIONS:�N�OR�C�OR�R�OR�K*"REP10…CLR.L‚D6‘FOR�FLAG�COMPARISON ŠBSR„OPTION1ŠCMP.B‚#$40,D0ŒARE�WE�DONE�SCANNING�OPTION�FIELD?ŠBEQ.S‚REP18ŽBRANCH�IF�YESŠMOVE.L�#COPTION,D2#ŠCMP.B‚#'C',D1ŒWAS�THIS�OPTION�'C'?ŠBEQ.S‚REP15ŽBRANCH�IF�YESŠMOVE.L�#ROPTION,D2#ŠCMP.B‚#'R',D1ŒWAS�THIS�OPTION�'R'?ŠBEQ.S‚REP15ŽBRANCH�IF�YESŠMOVE.L�#KOPTION,D2#ŠCMP.B‚#'K',D1Œwas�this�option�'K'?ŠBEQ.S‚REP15Žbranch�if�yes.ŠMOVE.L�#NOPTION,D2#ŠCMP.B‚#'N',D1ŒWAS�THIS�OPTION�'N'?ŠBNE„ABRTR3�ERROR�IF�NOT*REP15…BSETƒD2,D6/ŠBNE„ABRTR3�BRANCH�IF�ERROR�(ALREADY�SPECIFIED)*ŠCMP.B‚#'N',D1 ŠBNE.S‚REP16(ŠCLR.B‚D7‘SPECIAL�HANDLING�ON�'N'�OPTION*ŠTST.L‚D1‘WAS�'-'�SPECIFIED�ON�'N'�OPTION?ŠBPL.S‚REP10ŽBRANCH�IF�NOŠMOVE.B�#DEFOPT,D7 ŠBRA.S‚REP10*$REP16…BSETƒD2,D7ŽSET�REAL�OPTION�BITŠTST.L‚D1‘WAS�SIGN�SPECIFIED?/ŠBPL.S‚REP10ŽBRANCH�IF�NO�-�GO�FOR�MORE�OPTIONS)ŠBCLRƒD2,D7ŽCLEAR�IF�'-'�OPTION�SPECIFIEDŠBRA.S‚REP10ŽGO�FOR�NEXT�OPTION REP18…EQU„*ŠBTSTƒ#COPTION,D7ˆC-OPTION?ŠBEQ.S‚REP20ŽNO5ŠBTSTƒ#ROPTION,D7ˆYES,�THEN�CANNOT�HAVE�ALSO�R-OPTIONŠBNE„ABRTR3�ERROR*$ŠBTSTƒ#KOPTION,D7ˆK-OPTION?„08/11/83ŠBEQ.S‚REP20ŽNO‹08/11/831ŠBTSTƒ#ROPTION,D7ˆYES,�NOT�ALSO�R-OPTION�08/11/83ŠBNE„ABRTR3š08/11/83$ŠBTSTƒ#KOPTION,D7ˆK-OPTION?„08/11/83ŠBEQ.S‚REP20ŽNO‹08/11/831ŠBTSTƒ#COPTION,D7ˆYES,�NOT�ALSO�C-OPTION�08/11/83ŠBNE„ABRTR3�ERRORˆ08/11/83*3* SET UP FHS PARAMETER BLOCK TO ASIGN VOLUME/DEVICE*REP20…LEA„VOLFHS-B(A5),A6 ŠBSR„DEFAULTS'ŠLEA„INPBUF(PC),A0ŠCOMMAND�LINE�ADDRESS ŠBSR„EDITFILEŠTST.L‚D0‘WAS�THERE�AN�ERROR?ŠBMI„ABRTR3�BRANCH�IF�YESŠLEA„B(PC),A5‹REBASE�A5ŠMOVE.L�#1,D2ŽFLAG�DEVICE�NAME#ŠBTSTƒ#1,D0ŽWAS�IT�REALLY�A�DEVICE?ŠBNE„REP89ŽBRANCH�IF�YESŠCLR.L‚D2‘FLAG�VOLUME�NAME"ŠBTSTƒ#21,D0�WAS�USER�#�SPECIFIED?ŠBEQ.S‚REP19ŽBRANCH�IF�NO5ŠMOVE.W�FHSUSN(A6),D1†CONVERT�USER�NUMBER�TO�ASCII...*ŠLEA„USRNUM(PC),A0Š...FOR�COMPARISON�LATER ŠBSR„BIN2DEC(REP19…BTSTƒ#19,D0�WAS�THERE�A�FILE�NAME?ŠBEQ„REP90ŽBRANCH�IF�NOŠBSETƒ#FREPAIR,D7ˆSET�FILE�FLAGŠMOVE.L�FHSCLG(A6),CATNAM-B(A5)#ŠMOVE.L�FHSCLG+4(A6),CATNAM+4-B(A5)4ŠMOVE.L�FHSFIL(A6),FILNAM-B(A5)†SET�UP�FILE�REPAIR�-;ŠMOVE.L�FHSFIL+4(A6),FILNAM+4-B(A5)‚FILE�NAME�AND�EXTENSIONŠMOVE.W�FHSEXT(A6),EXTNAM-B(A5)ŠMOVE.L�#'„',FHSCLG(A6)ŠMOVE.L�#'„',FHSCLG+4(A6)@ŠMOVE.L�#'„',FHSFIL(A6)�BLANK�OUT�FILE�NAME�SO�ONLY�VOL�ASSIGNEDŠMOVE.L�#'„',FHSFIL+4(A6)ŠMOVE.W�#'‚',FHSEXT(A6) ŠBTSTƒ#0,D0$ŠBNE„ABRTR3�BRANCH�IF�'/'�TERMINATOR%ŠBTSTƒ#18,D0�WAS�EXTENSION�SPECIFIED?ŠBEQ„ABRTR3�BRANCH�IF�NO ŠBRA.S‚REP90%*************************************F* SUBROUTINE TO PUT DEFAULT VALUES INTO FHS PARAMETER BLOCK POINTED TO*ƒBY�A6.*DEFAULTS‚EQU„* <ŠMOVE.W�USERNUM+2-B(A5),FHSUSN(A6)�DEFAULT�USER�NUM‰12/04/844ŠMOVE.L�VOLNAM-B(A5),FHSVOL(A6)‚VOLUME�NAME�12/04/846ŠMOVE.L�CATNAME-B(A5),FHSCLG(A6)�CATALOG�NAME�12/04/84BŠMOVE.L�CATNAME+4-B(A5),FHSCLG+4(A6)�2ND�PART�OF�CAT�NAMEƒ12/04/84ŠRTSŠPAGE*6*ˆFETCH�DEVICE�MNEMONICS�TO�SEE�IF�DEVICE�KNOWN�AND�OK*,REP89…FHSCALL�DEVMNE(PC)ˆRANDOM�DEVICES�ONLY ŠBNE„IOERR/ŠMOVE.L�DEVMNE+FHSLEN-B(A5),D3ƒGET�#�OF�ENTRIES ŠMOVE.W�DEVMNE+FHSLEN-B(A5),D1ƒ. ŠBEQ.S‚REPA45ŠMOVE.L�DEVMNE+FHSPTR-B(A5),A0ƒSEARCH�FOR�DEVICE�NAME ŠMOVE.L�FHSVOL+VOLFHS-B(A5),D0ƒ.REP891„CMP.L‚(A0)+,D0 ŠBNE.S‚REP892&ŠTST.L‚(A0)�CHECK�IF�VOLUME�NAME�GIVEN ŠBEQ.S‚REP90ŽNO,‚USE�DEVICE�NAME@ŠMOVE.L�(A0),FHSVOL+VOLFHS-B(A5)�YES,�USE�VOLUME�NAME�FOR�ASSIGN ŠBRA.S‚REP90#REP892„ADD.L‚#6,A0ŽCHECK�NEXT�ENTRY ŠSUB.W‚#1,D1 ŠBNE„REP891 ŠMOVE.W�D3,D0ŠSWAPƒD3)ŠCMP.W‚D0,D3ŽDIDN'T�GET�ALL�DEVICE�NAMES?)REPA4…BEQ„ABRTR4�YES,�INVALID�DEVICE�NAMECŠBRA„ABRTR5�NO,�BUFFER�TOO�SMALL,�MAYBE�THE�GIVEN�DEVICE�DIDN'T�FIT*(*ˆASSIGN�VOLUME�FOR�EXCLUSIVE�READ/WRITE* REP90…EQU„*<*�BLANK�OUT�EVERYTHING�EXCEPT�VOLUME�NAME�FOR�VOL�ASSIGNMENTŠMOVE.W�#'‚',FHSUSN(A6)ŠMOVE.L�#'„',FHSCLG(A6)ŠMOVE.L�#'„',FHSCLG+4(A6)ŠMOVE.L�#'„',FHSFIL(A6)ŠMOVE.L�#'„',FHSFIL+4(A6)ŠMOVE.W�#'‚',FHSEXT(A6)ŠFHSCALL�VOLFHS(PC)ŠBEQ.S‚REP95ŽIO�ERROR�?*-*ˆUNABLE�TO�ASSIGN�VOLUME�DUE�TO�ERROR�-�QUIT*0ŠLEA„ASGMD0(PC),A0ŠSET�ERROR�STATUS�INTO�MESSAGEŠMOVE.L�D0,D1Ž.*ŠBSR„BIN4HEXŒ.�CONVERT‚ERROR�STATUS�TO�HEX!ŠLEA„ASGMSG(PC),A0ŠSEND�ERROR�MSGŠMOVE.L�#ASGMSGL,D0ˆ. ŠBRA„ABORTXX* *ˆRETRIEVE�DISK�ATTRIBUTES:�MPSN*.REP95…MOVE.W�#FHRATT,FHSCMD(A0)�GET�ATTRIBUTES ŠFHSCALL�(A0) ŠBNE„IOERR3ŠMOVE.L�FHSSIZ(A0),MPSN-B(A5)�SAVE‚LAST�PSN‚ON�DISKŠSUB.L‚#1,MPSN-B(A5)†.*<*ˆSET-UP�REGISTER(S)�FOR�REMAINING�REPAIR�STEPS�(D7=OPTIONS)*ŠMOVE.L�#256,D6ŒSECTOR�SIZEŠPAGE*,*ˆPROCESS�OUTPUT�FIELD�-�FLAG�FOR�HARD�COPY?*0ŠCMP.B‚#1,CPYFLG-B(A5)„ANYTHING�IN�OUTPUT�FIELD?7ŠBEQ.S‚CHECKK�NO�-�GO�START�1ST�STEP�OF�REPAIR:�VID�CHK-ŠMOVE.L�TEMP-B(A5),A0ŒADDRESS�OF�OUTPUT�FIELD"ŠLEA„PRTFHS(PC),A6ŠPARAMETER�BLOCK ŠBSR„EDITFILEŠBMI.S‚ABRTR3�BRANCH�IF�ERROR&ŠBTSTƒ#1,D0ŽWAS�OUTPUT�FIELD�A�DEVICE?"ŠBEQ.S‚ABRTR3�BRANCH�IF�NO�-�ERROR&ŠCLR.B‚CPYFLG-B(A5)‡FLAG�FOR�HARD�COPY**ˆASSIGN�PRINTER* REP96…EQU„*ŠFHSCALL�PRTFHS(PC)ˆASSIGN ŠBNE.S‚IOERR**ˆGET�PRINTER�ATTRIBUTES*ŠFHSCALL�PRTATR(PC) ŠBNE.S‚IOERR3ŠMOVE.B�FHSSIZ+3+PRTATR-B(A5),D0�GET�MAX�LINE�COUNTŠSUB.B‚#6,D0ŽLEAVE�MARGINSŠMOVE.B�D0,MAXLINES-B(A5)"ŠSUB.B‚#1,D0ŽSTART�WITH�PAGE�EJECTŠMOVE.B�D0,LINECNT-B(A5)*0*‰IF�'K'�OPTION,�GO�DELETE�EMPTY�DATA�STRUCTURES*?*‰The�'K'�option�is�a�non�documented�option�intended�to�be�used*‰for�test�purposes�only.*0CHECKK:ƒBTSTƒ#KOPTION,D7ˆ'K'�OPTION�ON?‚08/11/83ŠBEQ.S‚DOIT�NOŽ08/11/835ŠBRA„DELEMPTŒYES,�GO�DELETE�EMPTY�STRUCTURES.�8/11/835DOIT†BRA‡VIDCHCK‰GO�START�1ST�STEP�OF�REPAIR:�VID�CHK*"*œSTART�EDITING�WITH�THE�VID�CHECK*B*ˆABORT�REPAIR�(BEFORE�VID�CHECK)�-�SEND�APPROPRIATE�ERROR�MESSAGE*-ABRTR1„MOVE.L�#LUNMSGL,D0ˆCDFLUN�NOT�ASSIGNEDŠLEA„LUNMSG(PC),A0ŠBRA.S‚ABORTXX.ABRTR2„OR.Bƒ#$30,D0ŒSET�ASCII�LUN�INTO�MESSAGEŠMOVE.B�D0,FLULUN-B(A5)6ŠMOVE.L�#FLUMSGL,D0ˆSEND�MESSAGE�ABOUT�UNAVAILABLE�LUNŠLEA„FLUMSG(PC),A0ŠBRA.S‚ABORTXX,ABRTR3„MOVE.L�#COMMSGL,D0ˆCOMMAND�LINE�ERRORŠLEA„COMMSG(PC),A0ŠBRA.S‚ABORTXX(ABRTR4„MOVE.L�#IVDMSGL,D0ˆINVALID�DEVICEŠLEA„IVDMSG(PC),A0ŠBRA.S‚ABORTXX1ABRTR5„MOVE.B�#'1',IERMSGC-B(A5)�INTERNAL�ERROR�1;ŠMOVE.L�#IERMSGL,D0ˆRANDOM�DEVICE�MNEMONIC�BUFFER�TOO�SMALLŠLEA„IERMSG(PC),A0* ABORTXXƒEQU„* ŠBSR„SENDMSGS ŠBRA„KILLREP**ˆIO�ERROR�ABORT* IOERR…EQU„*ŠMOVE.B�#1,KILL-B(A5)ŠBSR„IOERMS�SEND�ERROR�MESSAGE*ABORTREP‚EQU„*"ŠLEA„ABRTMSG(PC),A0‰SEND�ABORT-MSGŠMOVE.L�#ABRTMSGL,D0 ŠBSR„SENDMSGS ŠBRA„KILLREPŠPAGE**ˆTERMINATE�REPAIR* TRMREP„EQU„*#ŠLEA„TRMMSG(PC),A0ŠTERMINATE�REPAIRŠMOVE.L�#TRMMSGL,D0‰BSETW…#0,R_FLAG1-B(A5) &*œSET�FLAG�TERMINATE�MESSAGE�DISPLAYED ŠBSR„SENDMSGS* *ˆREPAIR�DONE*REPDONE*.*ˆCHECK�IF�NEED�TO�UPDATE�ANYTHING�ON�THE�DISK:*ˆIGNORE�WRITE�ERRORS�FOR�NOW�-�ONLY�ERROR�MESSAGE�IS�SENT*EXIT:‰BTST†#COPTION,D7 ‰BNE‡DONEREPA*œJMP�IF�C�OPTION�SPECIFIED/ŠMOVE.B�#1,KILL-B(A5)†SET�TERMINATE�REPAIR�FLAGŠTST.B‚VIDFLG-B(A5)‡UPDATE�VID?ŠBEQ.S‚EXITR0�NOŠLEA„VIDBUF(PC),A1ŠYES ŠCLR.L‚D1 ŠMOVE.L�#1,D2 ŠBSR„WRITSEC0EXITR0„TST.B‚SECFLG-B(A5)‡SECTOR�BUFFER�CHANGED?ŠBEQ.S‚EXITR1�NO*ŠMOVE.L�PSNSEC-B(A5),D1„YES,�UPDATE�SECTORŠMOVE.L�#1,D2Ž.ŠLEA„SECBUF(PC),A1ŠBSR„WRITSECŒWRITE EXITR1„EQU„*ŠTST.B‚SATFLG-B(A5)‡UPDATE�SAT?ŠBEQ.S‚EXITR2�NO"ŠMOVE.L�VIDBUF+VIDSAT-B(A5),D1ƒYES ŠCLR.L‚D2ŠMOVE.W�VIDBUF+VIDSAL-B(A5),D2ŠMOVE.L�SATABUF-B(A5),A1ŠBTSTƒ#RCRSAT,D7‰RECREATE�SAT?0ŠBNE.S‚EXITR1SŒYES,�WRITE�NEW�SAT�BUFFER�TO�DISK9ŠMOVE.L�SATDBUF-B(A5),A1ƒNO,�WRITE�OLD�SAT�BUFFER�TO�DISKEXITR1SƒBSR„WRITSEC/EXITR2„EQU„*’make�sure�the�SAT�seg�is�allocated-ŠTST.B‚SATSGFLG-B(A5)…before�trying�to�deleteŠBEQ.S‚NOSATSGŠMOVE.L�#SATSEG,D0 ŠBSR„DELSEG&NOSATSGƒTST.B‚SDBFLG-B(A5)‡UPDATE�SDB?ŠBEQ.S‚EXITR3�NO0ŠMOVE.L�PSNSDB-B(A5),D1„YES,�GET�CURRENT�SDB�PSNŠMOVE.L�#SDBSZE,D2ŠLEA„SDBBUF(PC),A1 ŠBSR„WRITSEC EXITR3„EQU„*ŠTST.B‚PDBFLG-B(A5)‡UPDATE�PDB?ŠBEQ.S‚EXITR4�NO0ŠMOVE.L�PSNPDB-B(A5),D1„YES,�GET�CURRENT�PDB�PSNŠMOVE.L�#PDBSZE,D2ŠLEA„PDBBUF(PC),A1 ŠBSR„WRITSEC EXITR4„EQU„*ŠTST.B‚FABFLG-B(A5)‡UPDATE�FAB?ŠBEQ.S‚EXITR5�NOŠMOVE.L�PSNFAB-B(A5),D1ŠMOVE.L�FABLEN-B(A5),D2ŠMOVE.L�FABBUF-B(A5),A1 ŠBSR„WRITSEC EXITR5„EQU„*ŠTST.B‚DBFLG-B(A5)ˆUPDATE�DB?ŠBEQ.S‚DELEMPTŒNOŠMOVE.L�PSNDB-B(A5),D1ŠMOVE.L�DBLEN-B(A5),D2ŠMOVE.L�DBBUF-B(A5),A1 ŠBSR„WRITSEC DELEMPTƒEQU„* DONEREPA:?ŠBTSTW…#0,R_FLAG1-B(A5)�If�terminate�message�allready�displayed5ŠBNE.S…KILLREPŠ'REPAIR�COMPLETED'�message�is�ommitted*3ŠBTST†#COPTION,D7…Do�not�delete�empties�if‚C�optionŠBNE.S…SNDNMSG6ŠBTST†#FREPAIR,D7…Do�not�delete�empties�if�file�repairŠBNE.S…SNDNMSG5ŠBSR‡CLEANUP‰Delete�empty�directory�structures�if�any2SNDNMSGƒLEA‡DNEMSG(PC),A0‡print�'REPAIR�COMPLETED'ŠMOVE.L„#DNEMSGL,D0 ŠBSR‡SENDMSGS*œOUTPUT�REPAIR�DONE�MESSAGEKILLREPƒERQ.TERM‚*(PC)ŒGET�OUTŠPAGEO*********************************************************************************ˆV�I�D„C�H�E�C�KƒS�T�E�P*O********************************************************************************/*ˆREGISTER�USAGE�DURING�REMAINING�REPAIR�STEPS:*/*’D7.B�=�0�IF�NONINTERACTIVE�MODE�(N-OPTION�ON)&*™1�IF�INTERACTIVE�MODE�(N-OPTION�OFF)!*’D7.W�-�BIT�15�ON�=>�C-OPTION�ON* OFF�=>�NO�C-OPTION2*™BIT�14�ON�=>�RECREATE�SAT�(IGNORE�SAT�FROM�DISK)* OFF�=>�USE�SAT�FROM�DISK*™BIT�13�ON�=>�K-OPTION�ON* OFF�=>�NO�K-OPTION)*’D7.L�BITS�28-16‚ARE�USED�TO�TURN�OFF�IM*—BIT�29�0�=>�FILE�NOT�FOUND(*ž1�=>�FILE�FOUND�FOR�FILE�REPAIR�(QUIT)*—BIT�30�0�=>�NO�R�-�OPTION*ž1�=>�R�-�OPTION�ON6*—BIT�31�0�=>�NO�FILE�NAME�IN�CMD�LINE�(VOLUME�REPAIR)/*ž1�=>�FILE�REPAIR�(FILENAME�GIVEN�IN�CMD�LINE)*’D6�=�256,�SECTOR�SIZE**VIDCHCK:‚EQU„**7*ˆSEND�'VID�CHECK'�MESSAGE�TO�USER�(UNLESS�FILE�REPAIR)*%ŠBTSTƒ#FREPAIR,D7ˆSKIP�IF�FILE�REPAIR ŠBNE.S‚VIDCH0%ŠLEA„VIDMSG(PC),A0ŠSEND�VID�CHECK�MSGŠMOVE.L�#VIDMSGL,D0 ŠBSR„SENDMSGS*>*ˆSET�UPDATE�BOUNDS�-�ANY�SECTOR�ON�DISK�CAN�BE�UPDATED�DURING *ˆVID�CHECK*VIDCH0„CLR.L‚D1;ŠMOVE.L�D1,UPDSTR-B(A5)„SET�UPDATE�PSN�BOUNDS�(LOWER�BOUND)+ŠMOVE.L�MPSN-B(A5),UPDEND-B(A5)‚UPPER�BOUND=ŠADD.L‚#1,UPDEND-B(A5)„.�PSN�OF�SECTOR�THAT�CANNOT�BE�UPDATED*0*ˆREAD�IN�VID�-�ALWAYS�SECTOR�0,�ONE�SECTOR�ONLY*(ŠLEA„VIDBUF(PC),A1ŠSECTOR�BUFFER�FOR�VIDŠCLR.L‚D1‘PSN�=�0�FOR�VID ŠMOVE.L�#1,D2ŽONE�SECTOR�TO�READŠMOVE.L�#'VID�',IOERITM-B(A5)ŠBSR„GETSEC�READ�IN�VIDŠBEQ.S‚VIDC00�NO�IO�ERRORS.ŠBTSTƒ#FREPAIR,D7ˆIF�FILE�REPAIR�QUIT�ON�ERROR ŠBNE„ABORTREPŠTST.B‚D0‘WAS�IT�CRC�ERROR?/ŠBNE„ABORTREP‹NO,�OTHER�IO�ERROR�(ABORT�REPAIR)7ŠMOVE.B�#1,VIDFLG-B(A5)„REWRITE�VID�-�COULD�CLEAR�ERRORŠPAGE**ˆTEST�VERSADOS�DISK* GVIDC00„CMP.L‚#MACSCDE1,VIDMAC+VIDBUF-B(A5)�IS�VOLUME�A�VERSADOS�VOLUME?ŠBNE.S‚VIDC01�.&ŠCMP.L‚#MACSCDE2,VIDMAC+4+VIDBUF-B(A5)ŠBEQ.S‚VIDC04�YES5VIDC01„CLR.B‚VIDFLG-B(A5)‡NO,�SEND�WRONG�DISK�MESSAGEŠLEA„WRDMSG(PC),A0ŠMOVE.L�#WRDMSGL,D0ˆ.!ŠBSR„SENDMSQC‹QUIT�IF�C-OPTION�ON%ŠBTSTƒ#FREPAIR,D7ˆQUIT�IF�FILE�REPAIR ŠBNE„TRMREP�.3ŠBSR„REPAIR�ELSE�ASK�IF�USER�WANTS�TO�REPAIR�ANYWAYŠBNE„KILLREPŒNO,�QUIT=ŠMOVE.B�#1,VIDFLG-B(A5)„YES,�UPDATE�VID�-�FORCE�VERSADOS�CODE*1*ˆIF�FILE�REPAIR�SKIP�CODE�TILL�'GET�SAT�BUFFERS'&*ˆIF�IN�IM�DUMP�VID�AND�REQUEST�UPDATE$*ˆIF�IN�NIM�GO�DIRECTLY�TO�VID�CHECK*$VIDC04„BTSTƒ#FREPAIR,D7ˆFILE�REPAIR?4ŠBNE„VIDC60�YES,�SKIP�VID�STUFF�-�GO�GET�SAT�BUFFERS ŠBSR„IM‘IM?:ŠBNE„VIDC40ˆNO,�NIM�OR�C-OPTION‚-�GO�CHECK�VID�INFORMATION+VIDC05„MOVE.L�#'�VID',PSNITM-B(A5)�DUMP�VID ŠBSR„DUMPSC7VIDC10:ƒMOVE.L�#'�VID',UPDITM-B(A5)�LOAD�UPDATE�MESSAGEŠMOVE.B�#'?',UPDQMK-B(A5)ŠBSR„UPDATE�REQUEST�UPDATE*ŠDC.LƒVIDC35-B‹CRŠDC.LƒVIDC35-B‹NŠDC.LƒVIDC15-B‹R�NOT�ALLOWEDŠDC.LƒVIDC15-B‹D�NOT�ALLOWEDŠDC.LƒVIDC15-B‹A�NOT�ALLOWED!ŠDC.LƒTRMREP-B‹Q�TERMINATE�REPAIR'ŠDC.LƒVIDC20-B‹$PSN�DUMP/UPDATE�SECTORSŠDC.LƒVIDC21-B‹$‚DUMP�VID$ŠDC.LƒVIDC15-B‹DUMP�MUST�BE�IN�RANGEŠDC.LƒVIDC15-B‹D�PSN.N‚N/AŠDC.LƒVIDC15-B‹A�PSN.N‚N/A"ŠDC.LƒVIDC15-B‹OFFSET�-�UPDATE�VIDŠDC.LƒVIDC31-B‹C"ŠDC.LƒVIDSHL-B‹?‚HELP‚-�short�list!ŠDC.LƒVIDLHL-B‹H‚HELP‚-�long‚listŠPAGEO*******************************************************************************D*‰PRINT�SHORT�HELP�COMMAND�LIST�JUST�ABOVE�THE�REPRINT�OF�THE�SCREEN9*‰BEING�SHOWN�PRIOR�TO�THE�USER�ASKING�FOR�SHORT�HELP�(?) VIDSHL:ƒEQU„*<ŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�messages8ŠLEA„HLPSMSG(PC),A1…Point�to�start�of�short�help�message.ŠMOVE.L�#HLPSMSGL,D2‡provide�length�of�message#ŠBRA.S‚VIDGOH�go�refresh�the�screen  **ˆPRINT�LONG�HELP�MESSAGES VIDLHL:ƒEQU„*AŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�help�messages%ŠLEA„HLPLMSG(PC),A1…start�of�messages'ŠMOVE.L�#HLPLMSGL,D2‡length�of�messages;VIDGOH„BSR„GETHELPŒprint�help�messages�and�accept�response. 1*‰RETURN�TO�THE�POINT�AT�WHICH�HELP�WAS�REQUESTED5ŠCLR.L‚D1‘Indicate�first�PSN�to�dump�to�screen�-�(�0)5ŠCLR.L‚D2‘Offset�for�starting�byte�from�which�to�dump5ŠLEA„VIDBUF(PC),A1ŠIndicate�buffer�from�which�to�dump!ŠBRA„VIDC05�Go�refresh�the�screen *ˆRESPONSE�NOT�ACCEPTABLE*&VIDC15„BSR„RESPNA�SEND�MESSAGE�TO�USERŠBRA„VIDC10�TRY�AGAIN*-*ˆREQUESTED�UPDATE/DUMP‚OTHER�THAN�VID�SECTOR*&VIDC20„TST.L‚D1‘UPDATE�VID�IF�PSN�=�0?ŠBEQ.S‚VIDC25�YESCŠMOVE.L�#'„',PSNITM-B(A5)�NO,�READ�AND�UPDATE�OR�PRINT�OTHER�SEC(S) ŠBSR„UPDSEC ŠBRA„VIDC10�CONTINUE�UPDATE�LOOP**ˆREQUESTED�DUMP�VID*VIDC21„CLR.L‚D1‘PSN�=�0�FOR�VIDŠMOVE.L�#1,D2ŽONE�SECTORŠBSETƒ#31,D2�FLAG�DUMP*"*ˆREQUESTED�UPDATE/DUMP�VID�SECTOR*'VIDC25„TST.L‚D2‘NEED‚ONLY�TO�PRINT�VID?ŠLEA„VIDBUF(PC),A1ŠBMI.S‚VIDC30�YES,�GO�PRINT�VID8ŠLEA„(A1,D6),A2‰NO,�UPDATE�-�GET�END�ADDRESS�FOR�UPDATES)ŠBSR„UPDBUF�UPDATE�ANY�PART�OF�VID�BUFFER+ŠMOVE.B�#1,VIDFLG-B(A5)„SET�VID�UPDATE�FLAG#ŠBRA„VIDC10�GO�CONTINUE�UPDATE�LOOPVIDC30„BCLRƒ#31,D2*ŠSUB.L‚#1,D2ŽPRINT�ONLY�ONE�SECTOR�FOR�VIDŠBEQ„VIDC05�OKŠBRA„VIDC15�BAD�RESPONSE**ˆ'C'*+VIDC31„BSETƒ#COPTION,D7ŒSET�CHECK�ONLY�MODE ŠCLR.B‚D7**ˆ'N'�RESPONSE *ˆCR�RESPONSE?*ˆEND�OF�UPDATE�LOOP:�WRITE�ANY�UPDATED�SECTOR�IN�SECTOR�BUFFER *ˆTO�DISK.*:VIDC35„TST.B‚SECFLG-B(A5)‡UPDATED�SECTOR�IN�SECTOR�BUFFER?*ŠBEQ.S‚VIDC40�NO,�GO�CHECK�VID�INFORMATION-ŠMOVE.L�PSNSEC-B(A5),D1„YES,�GET�SECTOR'S�PSN4ŠCLR.B‚SECFLG-B(A5)‡RESET�SECTOR�BUFFER�FLAG�AND�PSNŠCLR.L‚PSNSEC-B(A5)‡.&ŠMOVE.L�#1,D2ŽWRITE�ONE�SECTOR�TO�DISK(ŠLEA„SECBUF(PC),A1ŠSECTOR�BUFFER�ADDRESSŠMOVE.L�#'SEC.',IOERITM-B(A5)1ŠBSR„WRITSECŒWRITE�TO�DISK�-�IGNORE�ERROR�FOR�NOWŠPAGE**ˆCHECK�VID�INFORMATION** VIDC40„EQU„**?*ˆCHECK�VOLUME�ID�OK�-�FIRST�CHARACTER�MUST�BE�ALPHABETIC,�REST*ˆALPHANUMERIC*ŠLEA„VIDBUF(PC),A1 0ŠMOVE.L�#VIDVOL,D2‰OFFSET�FOR�VOLUME�NAME�IN�VID ŠMOVE.L�#4,D3ŽVOLUME�NAME�LENGTH3ŠLEA„VOLNMSG(PC),A0‰.�ERROR�MESSAGE�IN�CASE�NEED�ITŠMOVE.L�#VOLNMSGL,D0‡.6ŠBSR„NAMECKŒCHECK�VALID�NAME‚-�CORRECT�IF�ERRORS�FOUNDŠBEQ.S‚VIDC41�OK*ŠMOVE.B�#1,VIDFLG-B(A5)„ERROR,�UPDATED�VIDŠBRA„VIDC40�CHECK�AGAIN**ˆCHECK�VOLUME�DESCRIPTOR�ASCII*/VIDC41„MOVE.L�#VIDVD,D2ŠOFFSET�FOR�FIELD�IN�VIDŠMOVE.L�#20,D3�FIELD�LENGTH1ŠLEA„VOLDMSG(PC),A0‰ERROR�MESSAGE�IN�CASE�NEED�ITŠMOVE.L�#VOLDMSGL,D0‡.;ŠBSR„CHKASC†CHECK�IT�IS�ASCII‚-‚CORRECT�IF�ERRORS�ARE�FOUNDŠBEQ.S‚VIDC42�OK#ŠMOVE.B�#1,VIDFLG-B(A5)„UPDATED�VIDŠBRA„VIDC41�CHECK�AGAIN*#*ˆCHECK�SAT�LENGTH�OK�FOR�DISK�SIZE*VIDC42„CLR.L‚D2ŠMOVE.W�VIDSAL(A1),D27ŠMOVE.L�#8,D3ŽCALCULATE�HOW�MANY�SECTORS�NEEDED�FOR�SAT9ŠMULUƒD6,D3‹D3�=�#�OF�SECTORS�SUPPORTED�BY�ONE�SAT�SECTOR/ŠMOVE.L�MPSN-B(A5),D1†D1�=�#�OF�SECTORS�ON�DISKŠADD.L‚#1,D1Ž.+ŠDIVUƒD3,D1ŽSEE�HOW�MANY�SAT�SECTORS�NEEDED ŠCLR.L‚D0'ŠMOVE.W�D1,D0ŽD0�=�MINIMUM�#�OF�SECTORS+ŠSWAPƒD1‘MAY�NEED�ONE�MORE�IF�HAD�REMAINDER ŠTST.W‚D1‘.ŠBEQ.S‚VIDC45�NO�REMAINDER&ŠSUB.W‚D1,D3ŽGET�#�OF�SECTORS�TOO�MANYŠMOVE.W�D3,D1Ž.!ŠADD.L‚#1,D0ŽNEED�ONE�MORE�SECTORJVIDC45„MOVE.W�D1,NOSEC-B(A5)‚SAVE�EXTRA�SECS�THAT�HAVE�TO�BE�MARKED�IN�SAT:ŠCMP.L‚D2,D0‹VID'S�SAT�LENGTH�MUST�EQUAL�CALCULATED�LENGTHŠBNE„VIDC70�ERROR*,*ˆCHECK�SAT�PSN�REASONABLE�(D2�=�SAT�LENGTH)*'VIDC46„MOVE.L�VIDSAT(A1),D1†GET�SAT�PSN)ŠBEQ„VIDC80�ERROR�IF�SAME�AS�FOR�VID�(=0)(ŠBSR„MPSNCŽCHECK�ALL�SAT�SECTORS�ON�DISKŠBHI„VIDC80�ERROR**ˆCHECK�SDB�PSN�REASONABLE*9VIDC47„MOVE.L�D1,D3ŽGET�SAT�PSN�BOUNDS,�D3�=�STARTING�PSNŠADD.L‚D3,D2Ž.ŠSUB.L‚#1,D2Ž.!ŠMOVE.L�D2,D4ŽAND�D4�=�ENDING�PSN!ŠMOVE.L�VIDSDS(A1),D1†GET�SDB�PSN'ŠBEQ.S‚VIDC500ŒNO�DIRECTORIES‚IS�OK�TOO2ŠMOVE.L�#SDBSZE,D2‰CHECK�ALL�SDB�SECTOR(S)�ON�DISK ŠBSR„MPSNCŽ.ŠBHI.S‚VIDC49�ERRORŠADD.L‚D1,D2ŽGET�ENDING�SDB�PSNŠSUB.L‚#1,D2Ž.-ŠCMP.L‚D3,D1ŽCHECK�SAT�AND�SDB�DO�NOT�OVERLAP ŠBLT.S‚VIDC48ŠBEQ.S‚VIDC49�ERROR ŠCMP.L‚D4,D1ŠBHI.S‚VIDC500ŒOKŠBRA.S‚VIDC49�ERRORVIDC48„CMP.L‚D2,D3ŠBLE.S‚VIDC49�ERROR ŠCMP.L‚D4,D2ŠBHI.S‚VIDC500VIDC49„BRA„VIDC90**ˆCHECK�TEST�PATTERN*VIDC500ƒLEA„VIDDTP(A1),A0ŠLEA„TESTPRN(PC),A2ŠMOVE.L�#64/4,D0VIDC505ƒCMP.L‚(A2)+,(A0)+ŠBNE.S‚VIDE00�NOT�SAME ŠSUB.L‚#1,D0 ŠBNE„VIDC505ŠBRA.S‚VIDC510ŒOK'VIDE00„LEA„VIDDTP(A1),A2†OK�IF�ALL�ZEROŠMOVE.L�#64/4,D0VIDE05„TST.L‚(A2)+ŠBNE.S‚VIDE10�NOT�OK ŠSUB.L‚#1,D0 ŠBNE„VIDE05ŠBRA.S‚VIDC510ŒOK)VIDE10„LEA„BTPMSG(PC),A0ŠBAD�TEST�PATTERNŠMOVE.L�#BTPMSGL,D0 ŠBSR„SENDMSQCŠBSR„REPAIR�FIX?ŠBNE„TRMREP�NOŠMOVE.B�#1,VIDFLG-B(A5)„YESŠLEA„VIDDTP(A1),A0ŠLEA„TESTPRN(PC),A2ŠMOVE.L�#64/4,D0VIDE15„MOVE.L�(A2)+,(A0)+ ŠSUB.L‚#1,D0 ŠBNE„VIDE15**(*ˆCHECK�NO�PDB�LIST�(RESERVED�FIELD�NOW)*VIDC50„LEA„VIDBUF+VIDPDL(PC),A2 ŠMOVE.L�#4,D1ŠMOVE.L�#'PDBL',RESITM-B(A5) ŠBSR„RSVCHKŠBEQ.S‚VIDC55�OK/ŠBMI„TRMREP�QUIT�IF�USER�DOESN'T�WANT�TO�REPAIR,ŠMOVE.B�#1,VIDFLG-B(A5)„CHANGED�FIELD�IN�VID**ˆCHECK�RESERVED�SPACE�ZERO*VIDC55„LEA„VIDRS1(A1),A2ŠMOVE.L�#VIDRS1L,D1ŠMOVE.L�#'VID�',RESITM-B(A5)AŠBSR„RSVCHK‚CHECK�AND�REPAIR�IF�NECESSARY�(QUIT�IF�NOT�CORRECTED)ŠBEQ.S‚VIDC56�OK/ŠBMI„TRMREP�QUIT�IF�USER�DOESN'T�WANT�TO�REPAIR(ŠMOVE.B�#1,VIDFLG-B(A5)„FLAG�VID�UPDATED**ˆCHECK�SUM�OK?*VIDC510ƒMOVE.L�A1,A0ŠLEA„256(A1),A2ŠMOVE.L�#-1,D0VIDC520ƒMOVE.B�(A0)+,D1 ŠEOR.B‚D1,D0ŠSWAPƒD0ŠMOVE.B�(A0)+,D1 ŠEOR.B‚D1,D0ŠSWAPƒD0 ŠCMP.L‚A2,A0 ŠBLS„VIDC520 ŠTST.B‚D0ŠBNE.S‚VIDC540ŒERRORŠSWAPƒD0 ŠTST.B‚D0ŠBEQ.S‚VIDC50�OK)VIDC540ƒLEA„CHSMSG(PC),A0†CHECK�SUM�ERROR ŠMOVE.L�D0,D1ŠMOVE.L�#CHSMSGL,D0 ŠBSR„SENDMSQCŠBSR„IM‘Interactive�mode�?3ŠBNE.S‚VIDC543ŒNo...don't�ask�permission�to�correct'ŠBSR„REPAIR�Yes..ask�if�ok�to�fix‚(Y/N)&ŠBNE„VIDC50�Branch�if�response�was�'N'VIDC543ƒCLR.W‚VIDCHK(A1) ŠMOVE.L�A1,A0ŠMOVE.L�#-1,D0VIDC545ƒMOVE.B�(A0)+,D1 ŠEOR.B‚D1,D0ŠSWAPƒD0ŠMOVE.B�(A0)+,D1 ŠEOR.B‚D1,D0ŠSWAPƒD0 ŠCMP.L‚A2,A0 ŠBLS„VIDC545ŠMOVE.B�D0,VIDCHK(A1)†UPDATE ŠSWAPƒD0ŠMOVE.B�D0,VIDCHK+1(A1)ŠMOVE.B�#1,VIDFLG-B(A5)**ˆEVERYTHING�LOOKS�OK7*ˆFORCE�VERSADOS�CODE�INTO�VID,�ZERO�OUT�RESERVED�SPACE3*ˆAND�WRITE�VID�TO�DISK�UNLESS�NO�CHANGE�INDICATED.**VIDC56„LEA„VIDBUF(PC),A1ŠVID�SECTOR�BUFFER&ŠTST.B‚VIDFLG-B(A5)‡VID�TO�BE�CHANGED?ŠBEQ.S‚VIDC60�NO/ŠCLR.B‚VIDFLG-B(A5)‡YES�-�WRITE�IT�BACK�TO�DISK9ŠMOVE.L�#MACSCDE1,VIDMAC(A1)�FORCE�VERSADOS�CODE�INTO�VID ŠMOVE.L�#MACSCDE2,VIDMAC+4(A1)�.%ŠCLR.L‚D1‘WRITE�VID�TO�DISK�(PSN�=�0)#ŠMOVE.L�#1,D2Ž.�ONE�SECTOR�TO�WRITEŠMOVE.L�#'VID�',IOERITM-B(A5)ŠBSR„WRITSECŒWRITE�VID&ŠBNE„ABORTREP‹TERMINATE�IF�WRITE�ERROR*.*ˆALLOCATE�2�SAT�BUFFERS�ACCORDING�TO�SAT�SIZE*VIDC60„CLR.L‚D2%ŠMOVE.W�VIDSAL(A1),D2†SAT�SECTOR�SIZEŠMULUƒD6,D2ŽGET�BYTE�COUNT"ŠMOVE.L�D2,D1Ž.�ALLOCATE�2�BUFFERSŠLSL.L‚#1,D1Ž.ŠMOVE.L�#SATSEG,D0‰SEGMENT�NAMEŠBSR„GETSEG�GET�SEGMENT4ŠMOVE.L�A1,SATABUF-B(A5)ƒSAVE�SAT�STARTING�ADDRESSESŠADD.L‚D2,A1Ž.ŠMOVE.L�A1,SATDBUF-B(A5)ƒ.BŠMOVE.B�#1,SATSGFLG-B(A5)‚indicate�SAT�segment�allocated�in�memoryEŠADD.L‚D2,A1�SET�ALSO�FAB/DATA�BLOCK�SEGMENT�STARTING�LOGICAL�ADDRESSŠSPC„2ŠPAGE*"*‚CONFIGURATION�AREA�POINTER�CHECK*ECFGAPT:ƒLEA.L‚VIDBUF(PC),A1†If�the�configuration�area�starting�sector<ŠTST.L‚VIDCAS(A1)‰address�is�zero,�there�is�no�configuration,ŠBEQ„SATCHK�area�so�skip�the�CFGA�check�stepŠSPC„29ŠTST.B‚VIDCAL(A1)‰If�the�configuration�area�length�is�not4ŠBNE„CFGACHKŒzero,�proceed�with�the�CFGA�check�step.ŠSPC„2>ŠLEA.L‚CFGALER(PC),A0…Issue�an�error�message�for�a�zero�length6ŠMOVE.L�#CFGALERL,D0‡configuration�area�and�terminate. ŠBSR„SENDMSGS ŠBRA„ABORTREPŠPAGE*)*ˆSAT�LENGTH‚ERROR,�EITHER�FIX�IT�OR�QUIT*6VIDC70„MOVE.W�D2,D1ŽVALUE�TO�BE�CONVERTED�TO�ASCII�HEX1ŠLEA„SATLEL(PC),A0†WHERE�TO�PLACE�CONVERTED�VALUE ŠBSR„BIN2HEX ŠMOVE.W�D0,D2ŽSAVE�PROPER�LENGTH#ŠLEA„SATLER(PC),A0†SAT�LENGTH�ERRORŠMOVE.L�#SATLERL,D0 ŠBSR„SENDMSQC+ŠLEA„RECMSG(PC),A0†SEND�RECALCULATE�MESSAGEŠMOVE.L�#RECMSGL,D0ˆ. ŠBSR„SENDMSQC(ŠBEQ.S‚VIDC71�IN�NIM�FORCE�PROPER�LENGTH*ŠBSR„REPAIR�FORCE�RECALCULATED�SAT�LENGTH? ŠBNE„TRMREP�NO,�TERMINATE�REPAIR8VIDC71„MOVE.W�D2,VIDSAL+VIDBUF-B(A5)�FORCE�PROPER�LENGTH(ŠMOVE.B�#1,VIDFLG-B(A5)„FLAG�VID�CHANGEDŠBRA„VIDC46�CONTINUE*/*ˆSAT�PSN�ERROR,�GET�NEW�PSN�IN�IM,�QUIT�IN�NIM* VIDC80„EQU„*7ŠLEA„STPPSN(PC),A0ŠWHERE�TO�DEPOSIT�CONVERTED�ASCII�HEX ŠBSR„BIN4HEXŒCONVERT�AND�DEPOSIT%ŠLEA„STPMSG(PC),A0ŠSEND�ERROR�MESSAGEŠMOVE.L�#STPMSGL,D0 ŠBSR„SENDMSQC0ŠBEQ„TRMREP�TERMINATE�IF�IN�NIM�(OR�FILE�REPAIR)*ŠBSR„GET4HEXŒD1�=�OLD�PSN,‚GET�NEW�INTO�D1*ŠMOVE.L�D1,VIDSAT+VIDBUF-B(A5)�SET�NEW�PSN(ŠMOVE.B�#1,VIDFLG-B(A5)„FLAG�VID�CHANGEDŠBRA„VIDC46�TEST�AGAIN*-*ˆSDB�PSN�ERROR�-�GET�NEW�IN�IM�,�QUIT�IN�NIM* VIDC90„EQU„*7ŠLEA„SDPPSN(PC),A0ŠWHERE�TO�DEPOSIT�CONVERTED�ASCII�HEX ŠBSR„BIN4HEXŒCONVERT�AND�DEPOSIT!ŠLEA„SDPMSG(PC),A0ŠSEND�ERROR�MSGŠMOVE.L�#SDPMSGL,D0 ŠBSR„SENDMSQC'ŠBEQ„TRMREP�QUIT�IF�NONINTERACTIVE�MODE ŠBSR„GET4HEXŒGET�NEW�PSN�INTO�D1ŠMOVE.L�D1,VIDSDS+VIDBUF-B(A5)ŠCLR.L‚D2‘CHECK�PSN�AGAIN>ŠMOVE.W�VIDSAL+VIDBUF-B(A5),D2ƒGET�SAT�LENGTH�AND�STARTING�PSNDŠMOVE.L�VIDSAT+VIDBUF-B(A5),D1ƒTO�CHECK�SDB�DOES�NOT�OVERLAP�WITH�IT(ŠMOVE.B�#1,VIDFLG-B(A5)„FLAG�VID�CHANGED ŠBRA„VIDC47�.ŠPAGE**<>O*********************************************************************************‚CONFIGURATION�AREA�CHECK�STEP*O********************************************************************************CFGACHK:‚EQU„*<ŠMOVE.B�#'?',UPDQMK-B(A5)‚Set�question�mark�in�'UPDATE�?'ŠSPC„28ŠLEA.L‚CFGAMSG(PC),A0…Issue�the�configuration�area�checkŠMOVE.L�#CFGAMSGL,D0‡message. ŠBSR„SENDMSGSŠSPC„2*1*ˆSET-UP�UPDATE�BOUNDS�-�ONLY‚CFGA�CAN�BE�UPDATED*ˆREAD�IN�CFGA�FROM�DISK5*ˆIF�FILE�REPAIR�GO�TO�SAT�CHECK�STEP�AFTER�CFGA�READ*$CFGC0A„MOVE.L�VIDBUF+VIDCAS-B(A5),D1 ŠCLR.L‚D2ŠMOVE.B�VIDBUF+VIDCAL-B(A5),D28ŠMOVE.L�D1,UPDSTR-B(A5)„SET�NEW�UPDATE�SECTOR�PSN�BOUNDSŠMOVE.L�D1,UPDEND-B(A5)„.ŠADD.L‚D2,UPDEND-B(A5)„. 3ŠMOVE.L�SATDBUF-B(A5),A1ƒREAD�CFGA�INTO�THIS�BUFFERŠMOVE.L�#'CFG�',IOERITM-B(A5) ŠBSR„GETSEC�.ŠBNE.S‚CFGC01�ERROR #*‰SAVE�SOME�CFGA�DATA�FOR�LATER�USE*<ŠMOVE.B�IOSSPT(A1),SECPTRAK-B(A5)‚sectors/track�on�this�disk:ŠMOVE.B�IOSHDS(A1),DRVHEADS-B(A5)‚#�of�heads�on�this�drive=ŠMOVE.L�IOSRSZ(A1),TOTVSECT-B(A5)‚total�#�of�VERSAdos�sectors /ŠBTSTƒ#FREPAIR,D7ˆOK�READ,‚DO�FILE�REPAIR�ONLY?+ŠBNE„SATCHK�YES,�GO�DO�SAT�CHECK�AND�REPAIR ŠBSR„IM‘NO%ŠBEQ.S‚CFGC05�GO�ASK�FOR�UPDATE�IN�IM'ŠBRA„SATCHK�IN�NIM�GO�TO�SAT�CHECK�STEP**ˆCRC�ERROR�OR�OTHER�IO�ERROR*$CFGC01„BTSTƒ#FREPAIR,D7ˆFILE�REPAIR?$ŠBNE„ABORTREP‹YES,�ABORT�ON�IO�ERRORŠTST.B‚D0‘NO,�CRC�ERROR?ŠBNE„ABORTREP‹NO,�OTHER�ERROR ***ˆCFGA�UPDATE�LOOP*CFGC05„CLR.L‚D2‘DUMP�CFGA+ŠMOVE.B�VIDCAL+VIDBUF-B(A5),D2ƒ#�OF�SECTORS.ŠMOVE.L�VIDCAS+VIDBUF-B(A5),D1ƒ1ST�PSN�OF�CFGA ŠMOVE.L�D1,D3+CFGCDP„MOVE.L�SATDBUF-B(A5),A1ƒBUFFER�STARTŠMOVE.L�#'CFG�',PSNITM-B(A5)"ŠBSR„DUMP�WRITE�CFGA�OR�PART�OF�IT.CFGC06„MOVE.L�#'CFG�',UPDITM-B(A5)�UPDATE�CFGAŠBSR„UPDATE�REQUEST�UPDATE*ŠDC.LƒCFGC35-B‹CRŠDC.LƒCFGC35-B‹NŠDC.LƒCFGC10-B‹RŠDC.LƒCFGC10-B‹DŠDC.LƒCFGC10-B‹AŠDC.LƒTRMREP-B‹Q$ŠDC.LƒCFGC15-B‹$PSN�DUMP/UPDATE�CFGAŠDC.LƒCFGC14-B‹$�DUMP�CFGA'ŠDC.LƒCFGC20-B‹DUMP�SECTORS�NOT�IN�CFGAŠDC.LƒCFGC11-B‹D�PSN,NŠDC.LƒCFGC12-B‹A�PSN,N0ŠDC.LƒCFGC15-B‹OFFSET�-�UPDATE�FIRST�CFGA�SECTORŠDC.LƒCFGC30-B‹C ŠDC.LƒCFGSHL-B‹?�HELP�short�listŠDC.LƒCFGLHL-B‹H�HELP‚long�list*(*‰SEND�THE�HELP�MESSAGE�&�REFRESH�SCREEN* CFGSHL:ƒEQU„*<ŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�messagesŠLEA„HLPSMSG(PC),A1ŠMOVE.L�#HLPSMSGL,D2#ŠBRA.S‚CFGGOH�send�the�help�message CFGLHL:ƒEQU„*ŠMOVE.B�#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L�#HLPLMSGL,D2%CFGGOH„BSR„GETHELPŒprint�help�messageBŠMOVE.L�VIDBUF+VIDCAS-B(A5),D1ƒGet�the�location�of�the�last�sectorAŠADD.B‚VIDBUF+VIDCAL-B(A5),D1ƒin�the�CFGA�by�adding�start�of�CFGA(ŠSUB.L‚#1,D1Žto�length�of�CFGA�minus�one6ŠMOVE.L�#1,D2Ždumping�only�one�sector�returns�the�user4ŠBRA„CFGCDP�return�to�point�where�help�was�requested 'CFGC10„BSR„RESPNA�RESPONSE�NOT�ACCEPTED ŠBRA„CFGC06**ˆDEALLOCATE�GIVEN�SECTORS*2CFGC11„BSR„DEALLC�DEALLOCATE�SECTORS�IN�BOTH�SAT'SŠBRA„CFGC06�CONTINUE�LOOP**ˆALLOCATE�GIVEN�SECTORS*0CFGC12„BSR„ALLOCT�ALLOCATE�SECTORS�IN�BOTH‚SAT'SŠBRA„CFGC06�CONTINUE�LOOP* *‰DUMP�CFGA* CFGC14„EQU„*ŠTST.W‚D2‘N�GIVEN?ŠBNE.S‚CFGC14AŒYES2ŠMOVE.B�VIDCAL+VIDBUF-B(A5),D2ƒNO,�GET�CFGA�LENGTH ŠBRA.S‚CFGC151CFGC14AƒCMP.B‚VIDCAL+VIDBUF-B(A5),D2ƒN�TOO�LARGE?ŠBLE.S‚CFGC14BŒNOŠMOVE.W�#1,D2ŽYES,�USE�1)CFGC14BƒCLR.L‚D3‘GET�PSN�OF�SECTOR�WANTED ŠMOVE.W�D2,D3 ŠSUB.L‚#1,D3 ŠADD.L‚D3,D1 ŠMOVE.L�#1,D2ŽONE�SECTOR�TO�DUMPŠBSETƒ#31,D2�.**ˆUPDATE�OR�DUMP�CFGA*4CFGC15„MOVE.L�VIDCAS+VIDBUF-B(A5),D3ƒ1ST�PSN�OF�CFGAŠTST.L‚D2‘PRINT�ONLY?ŠBMI„CFGCDP�YES,�GO�DUMP�SAT*ŠMOVE.B�#1,CFGAFLG-B(A5)ƒFLAG�CFGA�UPDATED%ŠMOVE.L�SATDBUF-B(A5),A1ƒBUFFER�STARTAŠSUB.L‚VIDBUF+VIDCAS-B(A5),D1ƒGET�OFFSET�TO�REQUESTED�CFGA�BUFFER ŠMULUƒD6,D1Ž.2ŠLEA„(A1,D1),A1‰START�OF�CFGA�SECTOR�TO�BE�UPDATED)ŠLEA„(A1,D6),A2‰SET�END�OF�BUFFER�ADDRESS!ŠBSR„UPDBUF�UPDATE�CFGA�FROM�DISK ŠBRA„CFGC06**ˆDUMP�ANY�SECTOR*CFGC20„MOVE.L�#'„',PSNITM-B(A5)(ŠBSR„UPDSEC�DUMP�SECTORS�(D2�BIT�31�SET) ŠBRA„CFGC06**ˆ'C'*5CFGC30„BSETƒ#COPTION,D7ˆCHECK�MODE�TILL�ERROR�OR�DONE ŠCLR.B‚D7*CFGC35:*><ŠPAGE*O*********************************************************************************ˆS�A�TƒC�H�E�C�KƒS�T�E�P*O********************************************************************************* SATCHK:ƒEQU„**<ŠMOVE.B�#'?',UPDQMK-B(A5)‚SET�QUESTION�MARK�IN�'UPDATE�?'**ˆSEND�SAT�STEP�MESSAGE* SATC00„EQU„*-ŠBTSTƒ#FREPAIR,D7ˆSKIP�MESSAGE�IF�FILE�REPAIR ŠBNE.S‚SATC0AŠLEA„SATMSG(PC),A0ŠMOVE.L�#SATMSGL,D0 ŠBSR„SENDMSGS*0*ˆSET-UP�UPDATE�BOUNDS�-�ONLY‚SAT�CAN�BE�UPDATED*ˆREAD�IN�SAT�FROM�DISK 5*ˆIF�FILE�REPAIR�GO�TO�FILE�CHECK�STEP�AFTER�SAT�READ*$SATC0A„MOVE.L�VIDBUF+VIDSAT-B(A5),D1 ŠCLR.L‚D2ŠMOVE.W�VIDBUF+VIDSAL-B(A5),D28ŠMOVE.L�D1,UPDSTR-B(A5)„SET�NEW�UPDATE�SECTOR�PSN�BOUNDSŠMOVE.L�D1,UPDEND-B(A5)„.ŠADD.L‚D2,UPDEND-B(A5)„.2ŠMOVE.L�SATDBUF-B(A5),A1ƒREAD�SAT�INTO�THIS�BUFFERŠMOVE.L�#'SAT�',IOERITM-B(A5) ŠBSR„GETSEC�.ŠBNE.S‚SATC01�ERROR/ŠBTSTƒ#FREPAIR,D7ˆOK�READ,‚DO�FILE�REPAIR�ONLY?,ŠBNE„FILCHK�YES,�GO�LOOK�FOR�FILE�AND�REPAIR ŠBSR„IM‘NO%ŠBEQ.S‚SATC05�GO�ASK�FOR�UPDATE�IN�IMŠBRA„SATC35�IN�NIM�GO�CHECK�SAT**ˆCRC�ERROR�OR�OTHER�IO�ERROR*$SATC01„BTSTƒ#FREPAIR,D7ˆFILE�REPAIR?$ŠBNE„ABORTREP‹YES,�ABORT�ON�IO�ERRORŠTST.B‚D0‘NO,�CRC�ERROR?AŠBNE„ABORTREP‚NO,�OTHER�ERROR(LATER�RECREATE�SAT,�GET�NEW�SAT�PSN-*œFROM�USER�IN�IM,�MARK�SAT�BAD;�IN�NIM�ABORT(ŠLEA„RSTMSG(PC),A0ŠREPAIR�BY�RECONSTRUCTŠMOVE.L�#RSTMSGL,D0 ŠBSR„SENDMSQCŠBNE.S‚SATC06�IN�IM�UPDATE7ŠBSR„REPAIRŒIN�NIM�ASK�USER�IF�HE�WANTS�TO�RECREATE�SATŠBNE„TRMREP�NO,�QUITŠBRA„SATC25�YES,�RECREATE�SATŠPAGE**ˆSAT�UPDATE�LOOP*SATC05„CLR.L‚D2‘DUMP�SAT+ŠMOVE.W�VIDSAL+VIDBUF-B(A5),D2ƒ#�OF�SECTORS-ŠMOVE.L�VIDSAT+VIDBUF-B(A5),D1ƒ1ST�PSN�OF�SAT ŠMOVE.L�D1,D3+SATCDP„MOVE.L�SATDBUF-B(A5),A1‰BUFFER�STARTŠMOVE.L�#'�SAT',PSNITM-B(A5)!ŠBSR„DUMP�WRITE�SAT�OR�PART�OF�IT-SATC06„MOVE.L�#'�SAT',UPDITM-B(A5)�UPDATE�SATŠBSR„UPDATE�REQUEST�UPDATE*ŠDC.LƒSATC35-B‹CRŠDC.LƒSATC35-B‹N2ŠDC.LƒSATC25-B‹R„RECONSTRUCT�SAT�-�TERMINATES�LOOPŠDC.LƒSATC10-B‹DŠDC.LƒSATC10-B‹AŠDC.LƒTRMREP-B‹Q#ŠDC.LƒSATC15-B‹$PSN�DUMP/UPDATE�SATŠDC.LƒSATC14-B‹$�DUMP�SAT&ŠDC.LƒSATC20-B‹DUMP�SECTORS�NOT�IN�SATŠDC.LƒSATC11-B‹D�PSN,NŠDC.LƒSATC12-B‹A�PSN,N/ŠDC.LƒSATC15-B‹OFFSET�-�UPDATE�FIRST�SAT�SECTORŠDC.LƒSATC30-B‹C ŠDC.LƒSATSHL-B‹?�HELP�short�listŠDC.LƒSATLHL-B‹H�HELP‚long�list*(*‰SEND�THE�HELP�MESSAGE�&�REFRESH�SCREEN* SATSHL:ƒEQU„*<ŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�messagesŠLEA„HLPSMSG(PC),A1ŠMOVE.L�#HLPSMSGL,D2%ŠBRA.S‚SATGOH�print�the�help�messages SATLHL:ƒEQU„*ŠMOVE.B�#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L�#HLPLMSGL,D2*SATGOH„BSR„GETHELPŒprint�the�help�messagesBŠMOVE.L�VIDBUF+VIDSAT-B(A5),D1ƒGet�the�location�of�the�last�sector?ŠADD.W‚VIDBUF+VIDSAL-B(A5),D1ƒin�the�SAT�by�adding�start�of�SAT'ŠSUB.L‚#1,D1Žto�length�of�SAT�minus�one6ŠMOVE.L�#1,D2Ždumping�only�one�sector�returns�the�user&*§to�the�spot�where�help�was�requestedŠBRA„SATCDP�go�dump�the�sector.  'SATC10„BSR„RESPNA�RESPONSE�NOT�ACCEPTED ŠBRA„SATC06 **ˆDEALLOCATE�GIVEN�SECTORS*2SATC11„BSR„DEALLC�DEALLOCATE�SECTORS�IN�BOTH�SAT'SŠBRA„SATC06�CONTINUE�LOOP**ˆALLOCATE�GIVEN�SECTORS*0SATC12„BSR„ALLOCT�ALLOCATE�SECTORS�IN�BOTH‚SAT'SŠBRA„SATC06�CONTINUE�LOOP* *ˆDUMP�SAT* SATC14„EQU„*ŠTST.W‚D2‘N�GIVEN?ŠBNE.S‚SATC14AŒYES1ŠMOVE.W�VIDSAL+VIDBUF-B(A5),D2ƒNO,�GET�SAT�LENGTH ŠBRA.S‚SATC151SATC14AƒCMP.W‚VIDSAL+VIDBUF-B(A5),D2ƒN�TOO�LARGE?ŠBLE.S‚SATC14BŒNOŠMOVE.W�#1,D2ŽYES,�USE�1)SATC14BƒCLR.L‚D3‘GET�PSN�OF�SECTOR�WANTED ŠMOVE.W�D2,D3 ŠSUB.L‚#1,D3 ŠADD.L‚D3,D1 ŠMOVE.L�#1,D2ŽONE�SECTOR�TO�DUMPŠBSETƒ#31,D2�.**ˆUPDATE�OR�DUMP�SAT*3SATC15„MOVE.L�VIDSAT+VIDBUF-B(A5),D3ƒ1ST�PSN�OF�SATŠTST.L‚D2‘PRINT�ONLY?ŠBMI„SATCDP�YES,�GO�DUMP�SAT(ŠMOVE.B�#1,SATFLG-B(A5)„FLAG�SAT�UPDATED%ŠMOVE.L�SATDBUF-B(A5),A1ƒBUFFER�START@ŠSUB.L‚VIDBUF+VIDSAT-B(A5),D1ƒGET�OFFSET�TO�REQUESTED�SAT�BUFFER ŠMULUƒD6,D1Ž.1ŠLEA„(A1,D1),A1‰START�OF�SAT�SECTOR�TO�BE�UPDATED)ŠLEA„(A1,D6),A2‰SET�END�OF�BUFFER�ADDRESS ŠBSR„UPDBUF�UPDATE�SAT�FROM�DISK ŠBRA„SATC06**ˆDUMP�ANY�SECTOR*SATC20„MOVE.L�#'„',PSNITM-B(A5)(ŠBSR„UPDSEC�DUMP�SECTORS�(D2�BIT�31�SET) ŠBRA„SATC06**ˆRECREATE�SAT*.SATC25„BSETƒ#RCRSAT,D7‰FLAG�TO�RECONSTRUCT�SAT ŠBRA.S‚SATC35**ˆ'C'*5SATC30„BSETƒ#COPTION,D7ˆCHECK�MODE�TILL�ERROR�OR�DONE ŠCLR.B‚D7**ˆCHECK�SAT�INITIALLY:C*ˆCHECK�VID,�SAT�AND�ANY�SDB�ARE�ALLOCATED;�CHECK�SECTORS�PAST�MPSN *ˆARE�MARKED�ALLOCATED;�ALLOCATE* SATC35„EQU„*   'P8!I)H1I9KATIPQCYHaViOqXyE�@‰;‘b™K¡N©J±A¹?ÁYÉ]ÑOÙ_á_éBñVù@;ŠMOVE.L�#'VID�',NALITM-B(A5)�SETUP�ERROR�MSG�IN�CASE�NEEDEDŠMOVE.L�#'VID�',ALCITM-B(A5)1ŠCLR.L‚D1‘ALLOCATE�VID�AND�CHECK�IT�WAS�ALLOCATEDŠMOVE.L�#1,D2Ž. ŠBSR„TSTALC�.ŠBEQ.S‚SATC36�OK�OR�RECONSTRUCTŠBSR„SATC40�ERRORJSATC36„BSRƒTSTNYA�CHECK�NOT�ALREADY�ALLOCATED�(MARK�ALLOCATED�IF�NO�ERROR)%ŠBNE„SATC70�ALREADY�ALLOCATED�-�ERRORŠSPC„2*,*‰CHECK�CONFIGURATION�AREA�ALLOCATION�IN�SAT*>SATC36AƒLEA.L‚VIDBUF(PC),A1†If�the�configuration�area�starting?ŠMOVE.L�VIDCAS(A1),D1†sector�is�zero,�there�is�no�configuration*ŠBEQ.S‚SATC36CŒarea�so�skip�the�SAT�check.ŠSPC„2DŠMOVE.L�#'CFG�',NALITM-B(A5)‚Set�up�for�a�possible�sector�allocation#ŠMOVE.L�#'CFG�',ALCITM-B(A5)‚error.ŠMOVE.L�#'CFG�',ALEITM-B(A5)ŠSPC„23ŠCLR.L‚D2“Check�that�the�configuration�area�sectors?ŠMOVE.B�VIDCAL(A1),D2†are�allocated�in�the�original�SAT.�If�all0ŠBSR„TSTALC�sectors�are�allocated�then�check�the!ŠBEQ.S‚SATC36BŒreconstructed�SAT.ŠSPC„2-ŠBSR„SATC40�Handle�the�allocation�conflict�as'*£appropriate�for�the�execution�optionsŠSPC„26SATC36BƒBSR„TSTNYA�Mark�the�configuration�area�sectors6ŠBNE„SATC71�allocated�in�the�reconstructed�SAT.�If�the**£sectors�are�already�allocated,�handle�as)*£appropriate�for�the�execution�options.]ŠSPC„2LSATC36CƒMOVE.L�#'SAT�',NALITM-B(A5)�CHECK�SAT�ALLOCATED�AND�ALLOC�IN�NEW�SATŠMOVE.L�#'SAT�',ALCITM-B(A5)ŠLEA„VIDBUF(PC),A1!ŠMOVE.L�VIDSAT(A1),D1†GET�SAT�PSN ŠCLR.L‚D2ŠMOVE.W�VIDSAL(A1),D2†LENGTH(ŠBSR„TSTALC�WAS�IT�ALLOCATED�IN�OLD�SAT?ŠBEQ.S‚SATC37�YESŠBSR„SATC40�ERROR‚//////////////////////////////////////////////////////////////////////*2*ˆCHECK�THE�ALLOCATION�OF�ALTERNATE�SECTORS�IF�ANY*I*ƒ((max�#�of�bad�trks�allowed�+�1�cyl.)�x�(#�hds�on�drive))�x�(sects/trk)*B*‰The�above�formula�is�used�to�determin�the�first�alternate�sector*‰to�be�checked�for�allocation.**A*ƒ((max�#�of�bad�trks�allowed�)�x�(#�hds�on�drive))�x�(sects/trk)*?*‰The�above�formula�is�used�to�determin�the�number�of�alternate'*‰sectors�to�be�checked�for�allocation.* ALTCHK:ƒEQU„* ŠCLR.L‚D0 ŠCLR.L‚D1 ŠCLR.L‚D2BŠMOVE.L�#'ALTS',NALITM-B(A5)ƒGet�error�messages�ready�just�in�caseŠMOVE.L�#'ALTS',ALCITM-B(A5)ŠMOVE.L�#'ALTS',ALEITM-B(A5) CŠMOVE.B�VIDBUF+VIDALT-B(A5),D3ƒinitialized�with�alternate�sectors�?0ŠBEQ.S‚SETPARXŒno.....go�to�the�next�update�loop <ŠMOVE.B�#MAXBAD,D0‰get�the�max.�number�of�bad�tracks�allowed?ŠMOVE.B�DRVHEADS-B(A5),D1‚get�the�number�of�heads�on�this�drive<ŠMOVE.B�SECPTRAK-B(A5),D2‚get�the�sectors/track�on�this�diskBŠMOVE.L�TOTVSECT-B(A5),D3‚get�the�total�number�of�VERSAdos�sectors 7ŠADD.B‚#1,D0Žadd�one�cylinder�for�the�diagnostic�tracks*§at�the�end�of�the�disk.3ŠMULUƒD1,D0Ž(#�of�heads)�x�(max�#�bad�trks�+�1�cyl),ŠMULUƒD2,D0Ž(sect/track)�x�(above�resultant) ŠSUB.L‚D0,D3 1ŠMOVE.L�D3,D1ŽPSN�of�first�alternate�sector�to�be*§checked�for�allocation ?ŠMOVE.B�DRVHEADS-B(A5),D2‚get�the�number�of�heads�on�this�drive.ŠMULUƒ#MAXBAD,D2‰(max�#�bad�trks)�x�(#�of�hds) ŠCLR.L‚D3ŠMOVE.B�SECPTRAK-B(A5),D3,ŠMULUƒD3,D2Ž(sect/track)�x�(above�resultant) 0ŠBSR„TSTALC�Check�that�the�alternate�sectors�are *§allocated�in�the�original�SAT. 8ŠBEQ.S‚SATYALOC‹If�all�sectors�are�allocated,�then�check*§the�reconstructed�SAT. 7ŠBSR.S‚SATC40�If�not,�handle�the�allocation�conflict�as(*§appropriate�for�the�options�in�effect. SATYALOC‚EQU„*.ŠBSR„TSTNYA�designate�the�alternate�sectors�as%*§allocated�in�the�reconstructed�SAT. 3ŠBNE.S‚SATC71�If�the�sectors�are�already�allocated,#*§handle�as�appropriate�for�options *§in�effect. SETPARXƒEQU„*ŠBRA„SDBCHK�SDB�check�next*><*SATC370ƒLEA„SLSMSG(PC),A0ŠMOVE.L�#SLSMSGL,D0 ŠBSR„SENDMSQC ŠBRA„TRMREPSATC380ƒLEA„SLTMSG(PC),A0ŠMOVE.L�#SLTMSGL,D0 ŠBSR„SENDMSQC ŠBRA„TRMREP*=*ˆSAT�ERROR,�ITEM�NOT�ALLOCATED�(D1�=�PSN,�D2�=�#�OF�SECTORS)* SATC40„EQU„*ŠLEA„NALPSN(PC),A0 ŠBSR„BIN4HEX%ŠLEA„NALMSG(PC),A0ŠSEND�ERROR�MESSAGEŠMOVE.L�#NALMSGL,D0 ŠBSR„SENDMSQCŠLEA„ALCMSG(PC),A0ŠMOVE.L�#ALCMSGL,D0 ŠBSR„SENDMSQC$ŠBEQ.S‚SATC41�IN�NIM�FORCE�ALLOCATED/ŠBSR„REPAIR�IN�IM�ASK�IF�TO�ALLOCATE�OR�TO�QUIT ŠBNE„TRMREP'SATC41„MOVE.L�SATDBUF-B(A5),A0…ALL  OCATE*ŠMOVE.B�#1,SATFLG-B(A5)„.�FLAG�SAT�CHANGEDŠMOVE.L�#1,D0Ž. ŠBSR„ALDESCŠRTSŠPAGE*C*ˆTHE�FOLLOWING�ERRORS�SHOULD�ONLY�HAPPEN�IF�THE�USER�HAS�SET�GIVEN0*ˆITEM�ALLOCATED�(BY�'A�PSN')‚-�TERMINATE�REPAIR**†*�VID�ALREADY�ALLOCATED: SATC70„EQU„*ŠMOVE.L�#'VID�',ALEITM-B(A5)SATC71„LEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L�#ALEMSGL,D0ŠLEA„ALEMSG(PC),A0 ŠBSR„SENDMSGS ŠBRA„ABORTREP*†*�SAT�ALREADY�ALLOCATED SATC75„EQU„*ŠMOVE.L�#'SAT�',ALEITM-B(A5) ŠBRA„SATC71*†*�SDB�ALREADY�ALLOCATED SATC80„EQU„*ŠMOVE.L�#'SDB�',ALEITM-B(A5) ŠBRA„SATC71***ˆNO�DIRECTORIES�-�DONE**SATC60„CLR.L‚D1‘FLAG�SAT�CHECK(SATCND„LEA„NDRMSG(PC),A0ŠSEND�NO�DIR�MSGŠMOVE.L�#NDRMSGL,D0 ŠBSR„SENDMSGSŠBTSTƒ#RCRSAT,D7‰RECREATED�SAT?)ŠBNE„FSAT60�YES,�GO�WRITE�NEW�SAT�TO�DISK ŠTST.L‚D1=ŠBEQ.S‚FSAT00‡SKIP�'SAT�CHECK'�MSG‚IF�DOING�SAT�CHECK�ALREADYŠPAGE*O********************************************************************************@*ˆFINAL�SAT�CHECK�-�CHECK�OLD�SAT�HAS�NO�UNUSED�SECTOR�ALLOCATED*O*********************************************************************************ˆSEND�SAT�CHECK�MESSAGE*FSATCK:ŠBTSTƒ#RCRSAT,D7‰RECREATED�SAT?)ŠBNE„FSAT60�YES,�GO�WRITE�NEW�SAT�TO�DISKŠMOVE.L�#SATMSGL,D0ŠLEA„SATMSG(PC),A0 ŠBSR„SENDMSGS*$*ˆCHECK�FOR�UNUSED�SECTOR�ALLOCATION*0FSAT00„CLR.L‚D5‘INDICATE�NO�SECTORS�IN�ERROR�YET*ŠMOVE.L�D7,D0ŽTURN�IM�BACK�ON�IF�NECESSARYŠAND.L‚#NIMASK,D0 ŠBEQ.S‚FSAT01 ŠMOVE.B�#1,D7ŠAND.L‚#-(NIMASK+1),D7FSAT01„MOVE.L�SATABUF-B(A5),A1ŠMOVE.L�SATDBUF-B(A5),A2 ŠCLR.L‚D21ŠMOVE.W�VIDBUF+VIDSAL-B(A5),D2ƒGET�SAT�BUFFER�BCT ŠMULUƒD6,D2&ŠCLR.L‚D1‘D1�=�1ST�PSN�OF�CURRENT�BYTEKFSAT05„MOVE.B�(A1)+,D0�NO�MORE�SECTORS�MARKED�ALLOCATED�IN�OLD�SAT�THAN�NEWŠCMP.B‚(A2)+,D0ŠBCS„FSAT20�ERROR-ŠTST.W‚D5‘OK,�LAST�BIT(S)�IN�LAST�BYTE�WRONG?ŠBEQ.S‚FSAT10�NO)ŠBSR„PRNTPŽYES,�PRINT�BLOCK�NUMBER(S)�OUT9ŠAND.L‚#$FFFFFFF8,D1†ADJUST�PSN�SO�GET�NEXT�BYTE'S�PSN�OK)ŠADD.L‚#8,D1Ž.�SKIP�BYTE�THAT�WAS�JUST�OK+FSAT10„ADD.L‚#8,D1ŽNEXT�BYTE'S�STARTING�PSN!FSAT11„SUB.L‚#1,D2ŽDONE�WITH�SAT?ŠBNE.S‚FSAT05�NO2ŠTST.L‚D5‘YES,�ANY�ERROR?�(BIT�31�SET�IF�ERROR(S))(ŠBPL„FSAT60�NO,�GO�WRITE�NEW�SAT�TO�DISK*ŠTST.W‚D5‘YES,�ANY�SEGMENT�LEFT�UNPRINTED?ŠBEQ.S‚FSAT12�NOŠBSR„PRNTPŽYES,�PRINT�PSN,NŠPAGE*?*ˆIN�INTERACTIVE�MODE�(NONINTERACTIVE�MODE�QUIT�ON�FIRST�ERROR);*ˆPRINTED�ALL�ALLOCATED�UNUSED�SECTORS�-�NOW�ASK�FOR�UPDATE*FSAT12:‰BTST†#COPTION,D7 ‰BNE‡TRMREP*œJMP�IF�'C'�OPTION�IS�SETŠMOVE.L�#-1,D0*ŠMOVE.L�D0,UPDSTR-B(A5)„NO�UPDATES�ALLOWEDŠMOVE.L�D0,UPDEND-B(A5)„.ŠMOVE.L�#'�SAT',UPDITM-B(A5) FSAT13„BSR„UPDATE�REQUEST�UPDATE*ŠDC.LƒFSAT14-B‹CR�-�N/AŠDC.LƒREPDONE-BŠN‚-�N/AŠDC.LƒFSAT60-B‹R�-�DEALLOCATE6ŠDC.LƒFSAT60-B‹D�-�DEALLOCATE�=>�WRITE�NEW�SAT�TO�DISKAŠDC.LƒTRMREP-BƒA�-�LEAVE�ALLOCATED�-�WRITE�COMBINED�SAT'S�TO�DISKŠDC.LƒFSAT14-B‹Q�-�N/A'ŠDC.LƒFSAT15-B‹$PSN�IN�RANGE�-�DUMP�SAT%ŠDC.LƒFSAT01-B‹$�=�DUMP�NUMBERS�AGAIN"ŠDC.LƒFSAT15-B‹$PSN�-�DUMP�SECTORSŠDC.LƒFSAT14-B‹D�PSN‚-�N/AŠDC.LƒFSAT14-B‹A�PSN‚-�N/AŠDC.LƒFSAT14-B‹OFFSET�N/AŠDC.LƒFSAT14-B‹C!ŠDC.LƒFSATSHL-BŠ?‚HELP�short�list ŠDC.LƒFSATLHL-BŠH‚HELP�long�listŠPAGEFSATSHL:<ŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�messagesŠLEA„HLPSMSG(PC),A1ŠMOVE.L�#HLPSMSGL,D2ŠBRA.S‚FSATGOHFSATLHL:ŠMOVE.B�#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L�#HLPLMSGL,D2FSATGOHƒBSR„GETHELP ŠBRA„FSAT01**ˆRESPONSE�NO�GOOD*FSAT14„BSR„RESPNA ŠBRA„FSAT13**ˆDUMP�SECTORS*+FSAT15„BSR„UPDSEC�(D2�BIT�#31�SET�FOR�DUMP) ŠBRA„FSAT13**ˆD�PSN*.FSAT16„BSR„DEALLC�DEALLOCATE�SPECIFIED�SECTORS ŠBRA„FSAT13**ˆA�PSN*,FSAT17„BSR„ALLOCT�ALLOCATE�SPECIFIED�SECTORS ŠBRA„FSAT13ŠPAGE*$*ˆSECTOR�ALLOCATED,�NOT�USED�-�ERROR*0FSAT20„TST.L‚D5‘FOUND�ANY�SUCH�ERROR�PREVIOUSLY?ŠBNE.S‚FSAT30�YES$ŠMOVE.L�D0,D3ŽNO,�SEND�ERROR�MESSAGEŠMOVE.L�#USAMSGL,D0ŠLEA„USAMSG(PC),A0 ŠBSR„SENDMSGSŠLEA„DEAMSG(PC),A0ŠMOVE.L�#DEAMSGL,D0 ŠBSR„SENDMSGS7* LOGICAL OR NEWSAT/OLD SA  T IF NOT TO BE REPAIRED IN NIŠMOVE.B�#1,SATFLG-B(A5)0ŠBSETƒ#31,D5�SET�FLAG�NOT�TO�WRITE�MESSAGE�AGAINŠBTST†#COPTION,D7 ŠBNE‡TRMREP*œJMP�IF�C�OPTION�IS�SETŠBSR„REPAIR�DEALLOCATE?5ŠBEQ.S‚FSAT60�YES,�WRITE�NEW�SAT�(SAME�AS�DEALLOCATE)FSAT25:ŠTST.B‚D7‘NO,�INTERACTIVE�MODE?9ŠBEQ„TRMREPŠNO,�GO�WRITE�OLD�SAT�(SAME�AS�KEEP�ALLOCATED)ŠMOVE.L�D3,D0ŽRESTORE�BYTE=FSAT30„NOT.B‚D0ŽYES,�FIND�ALL�SECTORS�IN�ERROR�AND�PRINT�THEMŠMOVE.B�-1(A2),D4ŠOLD�SAT�BYTE9ŠAND.B‚D0,D4ŒD4�HAS�NOW�BITS�SET�FOR�EACH�SECTOR�IN�ERRORŠMOVE.L�#7,D0ŽCHECK�BIT�BY�BITFSAT40„BTSTƒD0,D4ŠBNE.S‚FSAT50�ERROR‚?'ŠTST.W‚D5‘NO,�PREVIOUS�SECTOR�IN�ERROR?ŠBEQ.S‚FSAT45�NO#FSAT41„BSR.S‚PRNTPŽYES,�PRINT�PSN,N$ŠADD.L‚#1,D1ŽSKIP�BIT�JUST�TESTED�OKFSAT45„ADD.L‚#1,D1ŽNEXT�PSNFSAT46„SUB.L‚#1,D0ŠBPL„FSAT40�DONE?"ŠBRA„FSAT11�YES,�PROCESS�NEXT�BYTE&FSAT50„ADD.W‚#1,D5ŽONE�MORE�BAD�SECTOR&ŠBNE„FSAT46�COUNT�FULL�PRINT�PSN,�N+1?ŠBSR.S‚PRNTPŽYESŠBRA„FSAT45�CONTINUEŠPAGE**ˆWRITE�NEW�SAT�TO�DISK*FSAT60:‰BTST†#COPTION,D7 ‰BNE.S…FSAT70*œJMP�IF�C�OPTION�SELECTED&ŠMOVE.L�VIDSAT+VIDBUF-B(A5),D1ƒSAT�PSN ŠCLR.L‚D2%ŠMOVE.W�VIDSAL+VIDBUF-B(A5),D2ƒLENGTH'ŠMOVE.L�SATABUF-B(A5),A1‰NEW�SAT�BUFFERŠMOVE.L�#'SAT�',IOERITM-B(A5) ŠBSR„WRITSECŠBNE„ABORTREP‹(LATER�MOVE�SAT?)FSAT70:ŠCLR.B‚SATFLG-B(A5)ŠLEA„DOKMSG(PC),A0ŠDISK�OK�MSGŠMOVE.L�#DOKMSGL,D0 ŠBSR„SENDMSGS-ŠBRA„REPDONEŒGO�MAKE�SURE�ALL�SECTORS�UPDATEDŠPAGE* *ˆSUBROUTINE:$*ˆPRINT�PSN,N�FOR�SECTOR(S)�IN�ERROR*ˆENT:�D1�=�1ST�PSN�WITH�ERROR*�D5.W�=�NUMBER�OF�SECTORS*ˆRET:�D1�=�LAST�PSN�WITH�ERROR *�D5.W�=�0 PRNTP…EQU„*ŠMOVEM.L�D0/D2,-(A7)ŠLEA„PSNFLD(PC),A0ŠBSR„BIN4HEXŒPSNŠMOVE.L�D1,D2ŽSAVE�PSNŠLEA„PSNCNT(PC),A0ŠN ŠCLR.L‚D1 ŠMOVE.W�D5,D1 ŠBNE.S‚PRNTP1"ŠMOVE.L�#1,D1ŽN�=�$10000�IF�D5�=�0 ŠSWAPƒD1‘.PRNTP1„MOVE.L�#PSNMSL,D0$ŠSUB.W‚#1,D5ŽCOUNT�=�1�TO�BE�IGNORED ŠBEQ.S‚PRNTP2 ŠBSR„BIN4HEXŠMOVE.L�#PSNCML,D0PRNTP2„LEA„PSNMSG(PC),A0 ŠBSR„SENDMSGS ŠADD.L‚D2,D1.ŠSUB.L‚#1,D1ŽRETURN�LAST�PSN�OF�BLOCK�IN�ERROR ŠCLR.W‚D5ŠMOVEM.L�(A7)+,D0/D2ŠRTSŠPAGE*O*********************************************************************************ˆS�D�B„C�H�E�C�K„S�T�E�P*O******************************************************************************** SDBCHK„EQU„**AŠMOVE.L�VIDBUF+VIDSDS(PC),D1‚If�there�are�no�primary�or�secondary3ŠBEQ„SATC60�directory�blocks,�skip�the�SDB,�PDB�and*¥file�checks.ŠSPC„2*ˆSEND�SDB�CHECK�MESSAGE*SDBC00„LEA„SDBMSG(PC),A0ŠMOVE.L�#SDBMSGL,D0 ŠBSR„SENDMSGS,ŠMOVE.L�#'SDB�',D5‰D5�SET�FOR�MSG�COMPLETION**ˆSETUP�UPDATE�BOUNDS*0ŠMOVE.L�VIDSDS+VIDBUF-B(A5),D1ƒGET�1ST�SDB'S�PSN+SDBC01„TST.L‚D1‘DONE?�(D1�=�NEXT�SDB'S�PSN)%ŠBEQ„PDBCHK�YES,�END�OF�CHAIN‚IF�ZERO%ŠCLR.B‚DELCRI-B(A5)‡RESET�DELETE�FLAGŠMOVE.L�#SDBSZE,D2#ŠMOVE.L�D1,UPDSTR-B(A5)„LOWER�BOUND#ŠMOVE.L�D1,UPDEND-B(A5)„UPPER�BOUNDŠADD.L‚D2,UPDEND-B(A5)„.**ˆREAD�IN�NEXT�SDB*%ŠCLR.L‚D4‘INDICATE�NO�ERROR�FROM�READ+ŠMOVE.L�D1,PSNSDB-B(A5)„SET�NEW�CURRENT�SDB ŠLEA„SDBBUF(PC),A1ŠBUFFER�TO�USEŠMOVE.L�D5,IOERITM-B(A5) ŠBSR„GETSECŠBEQ„SDBC25�OK�READEŠMOVE.B�#1,SDBFLG-B(A5)�SET�FLAG�TO�WRITE�IF�CRC�ERROR�TO�CLEAR�ERRORŠTST.B‚D0‘CRC�ERROR?2ŠBEQ„SDBC25�YES,�IGNORE�-�HOPE�TO�CORRECT�BY�WRITEŠPAGE*.*ˆIO�ERROR�FROM�READ�-�SETUP�TO�TRUNCATE�CHAIN*BSDBCTR„MOVE.L�#1,D4ŠTRUNCATE�CHAIN�BECAUSE�COULD�NOT�READ�NEXT�SDBŠMOVE.L�D5,TRNITM-B(A5)ŠLEA„TRNMSG(PC),A0ŠMOVE.L�#TRNMSGL,D0"SDBC05„BSR„SENDMSGŒSEND�REPAIR�MSGŠBSR„NIMC�UPDATE�IN�IM ŠBNE„SDBC35�.#ŠBSR„REPAIR�IN�NIM�ASK�FOR�APPROVAL/ŠBNE„TRMREP�QUIT‚IF�USER�DOESN'T�WANT�TO�REPAIR*.*ˆTRUNCATE�SDB�CHAIN�BECAUSE�LOST�FORWARD�LINK*SDBC06„CLR.B‚SDBFLG-B(A5)CŠMOVE.L�PRVSDB-B(A5),D1„GET�PREVIOUS�SDB'S�1ST�SECTOR�TO�BE�UPDATED.ŠBEQ.S‚SDBC10�IF�NONE�THEN�NO�SDB�CHAIN�AT�ALL ŠMOVE.L�#1,D2ŠLEA„SDBBUF(PC),A1ŠMOVE.L�D5,IOERITM-B(A5) ŠBSR„GETSEC#ŠBNE„ABORTREP‹IF�ERROR�QUIT�FOR�NOW6ŠCLR.L‚SDBBUF+SDBFPT-B(A5)�PRIOR�S  DB�NOW�LAST�IN�CHAIN"ŠBSR„WRITSECŒWRITE�IT�BACK�TO�DISK!ŠBNE„TRMREP�QUIT�FOR�NOW�ON�ERRORŠBRA„PDBCHK�DONE�WITH�SDB�CHECKFSDBC10„CLR.L‚VIDBUF+VIDSDS-B(A5)�DELETED�LAST�SDB�-�NO�DIRECTORIES�NOW"ŠMOVE.B�#1,VIDFLG-B(A5)„UPDATE�VID#ŠMOVE.L�#1,D1ŽFLAG�NOT�IN�SAT�CHECK;ŠBRA„SATCNDˆGO�CHECK�SAT�IS�OK�WITH�NO�DIRECTORIES�AND�QUIT*(*ˆDELETE�CURRENT�SDB,�FORWARD�LINK�KNOWN*5SDBC15„MOVE.L�SDBBUF+SDBFPT-B(A5),D4ƒGET�FORWARD�LINKŠCLR.B‚SDBFLG-B(A5)@ŠMOVE.L�PRVSDB-B(A5),D1„GET�PRIOR�SDB'S�1ST�SECTOR�TO�BE�UPDATEDŠBEQ.S‚SDBC20�NO�PRIOR�SDB ŠMOVE.L�#1,D2ŠLEA„SDBBUF(PC),A1ŠMOVE.L�D5,IOERITM-B(A5)ŠBSR„GETSEC�READ�SDB�SECTOR!ŠBNE„TRMREP�QUIT�FOR�NOW�IF�ERROR+ŠMOVE.L�D4,SDBBUF+SDBFPT-B(A5)�SET�NEW�LINKŠBSR„WRITSECŒUPDATE�ON�DISK!ŠBNE„TRMREP�QUIT�FOR�NOW�IF�ERROR SDBC19„MOVE.L�D4,D1ŽNEXT�SDB�PSNŠBRA„SDBC01�GO�PROCESS�IT;SDBC20„MOVE.L�D4,VIDBUF+VIDSDS-B(A5)�SET�NEW�1ST�SDB�IN�VID'ŠMOVE.B�#1,VIDFLG-B(A5)„FLAG�UPDATE�VID7ŠBRA„SDBC19ŒGO�PROCESS�NEXT�SDB�(MAY�BE�NONE�IF�D4�=�0)ŠPAGE*0*ˆIN�IM�DUMP�AND�UPDATE�SDB,�IN�NIM�GO�CHECK�SDB* SDBC25„BSR„IMŠBNE„SDBC80�IN�NIM�GO�CHECK�SDBCSDBC30„MOVE.L�PSNSDB-B(A5),D3„DUMP�ALL�OF�SDB�(D3�=�1ST�PSN�OF�SDB)ŠMOVE.L�D5,PSNITM-B(A5) ŠBSR„DUMP'ŠMOVE.L�#'�SDB',UPDITM-B(A5)�UPDATE�SDB5SDBC35„BSR„UPDATE�REQUEST�UPDATE�(D4�HAS�R-PARAMETER)*ŠDC.LƒSDBC80-B‹CR+ŠDC.LƒSDBC50-B‹N�TURN�OFF�IM�TILL�PDB�CHECK5ŠDC.LƒSDBC40-B‹R�TERMINATE�LOOP�D4�=�1-TRUNCATE�CHAIN*§D4�=�0�IS�ERRORAŠDC.LƒSDBC70-B‚D�DELETE�CURRENT�SDB,�USE‚FORWARD�LINK�IN�SDB�BUFF*§(SPACE�REMAINS�ALLOCATED)ŠDC.LƒSDBC45-B‹A�N/AŠDC.LƒTRMREP-B‹QŠDC.LƒSDBC60-B‹$PSNŠDC.LƒSDBC55-B‹$‚DUMP�SDB(ŠDC.LƒSDBC65-B‹DUMP�SECTOR(S)�NOT�IN�SDBŠDC.LƒSDBC45-B‹D�PSN,N�N/AŠDC.LƒSDBC45-B‹A�PSN,N�N/A"ŠDC.LƒSDBC60-B‹OFFSET�-�UPDATE�SDBŠDC.LƒSDBC75-B‹C ŠDC.LƒSDBSHL-B‹?�HELP�short�listŠDC.LƒSDBLHL-B‹H�HELP�long�listŠPAGE SDBSHL:ƒEQU„*<ŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�messagesŠLEA„HLPSMSG(PC),A1ŠMOVE.L�#HLPSMSGL,D2 ŠBRA.S‚SDBGOH SDBLHL:ƒEQU„*ŠMOVE.B�#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L�#HLPLMSGL,D2SDBGOH„BSR„GETHELPŠLEA„SDBBUF(PC),A1ŠMOVE.L�#SDBSZE,D2 ŠMOVE.L�D3,D1 ŠBRA„SDBC30**ˆ'R'*$SDBC40„TST.L‚D4‘REPAIR�IF�READ�ERRORŠBNE„SDBC06�.�GO�TRUNCATE�CHAIN)SDBC45„BSR„RESPNA�NOT�ACCEPTABLE�RESPONSEŠBRA„SDBC35�TRY�AGAIN**ˆ'N'*1SDBC50„BSETƒ#NXTSTP,D7‰TURN�OFF�IM�TILL�PDB�CHECK ŠCLR.B‚D7#ŠBRA.S‚SDBC80�GO�CHECK�SDB�CONTENTS* *ˆDUMP�SDB*SDBC55„MOVE.L�#SDBSZE,D2ŠMOVE.L�PSNSDB-B(A5),D1ŠBSETƒ#31,D2�DUMP**ˆUPDATE�OR�DUMP�SDB�REQUESTED*#SDBC60„LEA„SDBBUF(PC),A1ŠUPDATE�SDBŠTST.L‚D2‘DUMP�ONLY?ŠBMI„SDBC30�YES(ŠLEA„(A1,D6),A2‰NO,�UPDATE�-�GET�END�ADRŠBSR„UPDBUF�UPDATE�SDB�SECTOR*ŠMOVE.B�#1,SDBFLG-B(A5)„FLAG�TO�UPDATE�SDB ŠBRA„SDBC35�REQUEST�UPDATE�AGAIN**ˆDUMP�ANY�SECTOR�NOT�IN�SDB*SDBC65„MOVE.L�#'„',PSNITM-B(A5) ŠBSR„UPDSEC�DUMP�(D2�BIT�31�SET) ŠBRA„SDBC35**ˆDELETE�CURRENT�SDB*3SDBC70„MOVE.B�#1,DELCRI-B(A5)„SET�FLAG�TO�DELETE�IT ŠBRA.S‚SDBC80**ˆ'C'*SDBC75„BSETƒ#COPTION,D7 ŠCLR.B‚D7ŠPAGE**ˆCHECK�SDB�CONTENTS* SDBC80„EQU„***ˆCHECK�NEXT�SDB�OK*ŠMOVE.L�SDBBUF+SDBFPT-B(A5),D1ŠBEQ.S‚SDBC90�NONE�IS�OKŠMOVE.L�#SDBSZE,D2‰CHECK�PSN�OK ŠBSR„MPSNCŠBHI„SDBE00�NEXT�SDB�PSN�ERROR&ŠBSR„TSTALC�CHECK�ALLOCATED�IN�OLD�SAT ŠBNE„SDBE10�ERROR,�NOT�ALLOCATED%SDBC85„BSR„TSTNYA�ALLOCATE�IN�NEW�SAT6ŠBNE„SDBE20�ERROR,�ALLOCATED�TO�SOMETHING�ELSE�ALREADY*,*ˆCHECK�RESERVED�SPACE�IN�SDB�HEADER�IS�ZERO*-SDBC90„TST.B‚DELCRI-B(A5)‡DELETE�CURRENT�SDB?ŠBNE„SDBC15�YES,�GO�DELETEŠLEA„SDBBUF+4(PC),A2ŠMOVE.L�#SDBSTR-4,D1ŠMOVE.L�#'HDR�',RESITM-B(A5)"ŠBSR„RSVCHK�CHECK�AND�HANDLE�ERRORŠBEQ.S‚SDBC91�OK,ŠBMI„TRMREP�QUIT�IF�USER�DOENT'S�WANT�TO�FIX(ŠMOVE.B�#1,SDBFLG-B(A5)„FLAG�SDB�CHANGED**ˆCHECK�EACH�SDB�ENTRY*8SDBC91„LEA„SDBBUF+SDBSTR(PC),A1ƒGET�ADDRESS�OF�1ST�ENTRY5ŠMOVE.L�#SDBENT,D4‰NUMBER�OF�ENTRIES�TO�CHECK�PER�SDB**ˆCHECK�PDB�PSN*SDB100„MOVE.L�#PDBSZE,D2‰SIZ  EŠMOVE.L�SDBPDP(A1),D1†PSN'ŠBEQ.S‚SDB110�ZERO�=�EMPTY�ENTRY�-�SKIP ŠBSR„MPSNCŠBHI„SDBE50�ERROR,�PSN�>�MPSNŠBSR„TSTALC�IS�IT�ALLOCATED?ŠBNE„SDBE60�NO,�ERROR SDB101„BSR„TSTNYA�MARK�ALLOCATED3ŠBNE„SDBE70�ERROR�IF�ALREADY�ALLOCATED�TO�SOMETHING**ˆCHECK�CATALOG�NAME�OK* SDB104„EQU„**ŠMOVE.L�#SDBCLG,D2‰OFFSET�TO�CATALOG�FIELDŠMOVE.L�#CLGLEN,D3‰FIELD�LENGTHŠLEA„CATMSG(PC),A0ŠMOVE.L�#CATMSGL,D0ŠBSR„CATCHK�NO,�CHECK�FIELD ŠBEQ.S‚SDB105ŠMOVE.B�#1,SDBFLG-B(A5)ŠBRA„SDB104�CHECK�AGAIN**ˆCHECK�RESERVED�SPACE�IS�ZERO*SDB105„LEA„SDBRS1(A1),A2 ŠMOVE.L�#1,D1ŠMOVE.L�#'SDE�',RESITM-B(A5)"ŠBSR„RSVCHK�CHECK�AND�HANDLE�ERRORŠBEQ.S‚SDB110�OK$ŠBMI„TRMREP�QUIT�IF�NOT�TO�FIX�ERROR(ŠMOVE.B�#1,SDBFLG-B(A5)„FLAG�SDB�UPDATED*+*ˆTHIS�SDB�ENTRY�LOOKS�OK�-�CHECK�NEXT�ONE?*+SDB110„LEA„SDBLEN(A1),A1†NEXT�ENTRY�POINTERŠSUB.L‚#1,D4ŽANY�LEFT?ŠBNE„SDB100�YES*<*ˆDONE�CHECKING�THIS�SDB,�WRITE�IT�BACK�TO�DISK�IF�NECESSARY*9SDB111„MOVE.L�PSNSDB-B(A5),D1„WRITE�IT�TO�DISK�IF�CHANGEDŠLEA„SDBBUF(PC),A1 ŠTST.B‚SDBFLG-B(A5)‡SDB�UPDATED?ŠBEQ.S‚SDB115�NOŠMOVE.L�#SDBSZE,D2‰YESŠMOVE.L�#'SDB�',IOERITM-B(A5) ŠBSR„WRITSEC#ŠBNE„ABORTREP‹QUIT�FOR�NOW�IF�ERRORŠCLR.B‚SDBFLG-B(A5)1SDB115„MOVE.L�D1,PRVSDB-B(A5)„SET�IT�AS�PRIOR�SDB)ŠMOVE.L�SDBFPT(A1),D1†GET�FORWARD�POINTERŠBRA„SDBC01�GO�CHECK�NEXT�SDBŠPAGE**ˆER:�SDB�FORWARD�POINTER‚BAD*SDBE00„LEA„LNKPSN(PC),A0ŠMOVE.L�PSNSDB-B(A5),D1 ŠBSR„BIN4HEXŠLEA„LNKMSG(PC),A0ŠMOVE.L�#LNKMSGL,D0ŠMOVE.L�D5,LNKITM-B(A5) ŠBSR„SENDMSQCŠBEQ.S‚SDBE21�TRUNCATE�IN�NIM$ŠBRA„SDBC35�IN�IM�REPEAT�UPDATE�LOOP*'*ˆER:�NEXT�SDB�NOT�ALLOCATED�IN�OLD�SAT*.SDBE10„BTSTƒ#RCRSAT,D7‰SKIP�IF�TO�RECREATE�SATŠBNE„SDBC85�GO�SET�ALLOCATEDŠLEA„NALPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L�#NALMSGL,D0ŠMOVE.L�D5,NALITM-B(A5)/ŠBSR„SENDMSQC‹SEND�ERROR�MSG�THAT�NOT�ALLOCATEDŠBEQ.S‚SDBE16�ALLOCATE�IN�NIMŠMOVE.L�#SDBSZE,D0ŠMOVE.L�D5,ALCITM-B(A5)ŠMOVE.L�D5,PSNITM-B(A5)ŠBSR„DMPALC�ALLOCATE�IN�IM?ŠBEQ.S‚SDBE17�YES(SDBE15„BRA„SDBC35�NO,�REPEAT�UPDATE�LOOP!SDBE16„LEA„ALCMSG(PC),A0ŠALLOCATEŠMOVE.L�D5,ALCITM-B(A5)ŠMOVE.L�#ALCMSGL,D0,ŠBSR„SENDMSGŒSEND�ALLOCATE�REPAIR�ACTION�MSG'SDBE17„MOVE.L�SATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B�#1,SATFLG-B(A5)„.�FLAG�SAT�CHANGEDŠMOVE.L�#1,D0Ž. ŠBSR„ALDESCŠBRA„SDBC85�GO�ALLOCATE***ˆER:�NEXT�SDB'S�SECTORS�ALREADY�ALLOCATED*SDBE20„MOVE.L�D5,ALEITM-B(A5)ŠLEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L�#ALEMSGL,D0ŠLEA„ALEMSG(PC),A0 ŠBSR„SENDMSQC$ŠBNE„SDBC35�IN�IM�REPEAT�UPDATE�LOOPSDBE21„EQU„*’IN�NIM*ŠMOVE.L�PSNSDB-B(A5),D1„SETUP�REGISTERS�TOŠMOVE.L�#SDBSZE,D2‰.ŠLEA„SDBBUF(PC),A1Š.ŠBRA„SDBCTR�TRUNCATE�OR�QUITŠPAGE**ˆER:�PDB�LINK�BAD*SDBE50„LEA„LNKPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„LNKMSG(PC),A0ŠMOVE.L�#LNKMSGL,D0ŠMOVE.L�#'PDB�',LNKITM-B(A5) ŠBSR„SENDMSQCŠBNE.S‚SDBE55�IN�IMSDBE51„LEA„DELMSG(PC),A0=ŠMOVE.L�#DELCMSGL,D0‡IN�NIM�TRUNCATE�PDB�CHAIN�-�DELETE�PDB'SŠMOVE.L�#'PDB�',DELITM-B(A5) ŠBSR„SENDMSG ŠBSR„REPAIR ŠBNE„TRMREPŠMOVE.B�#1,SDBFLG-B(A5)ŠCLR.L‚SDBPDP(A1) ŠBRA„SDB105%SDBE55„BSR„GETNEW4ŒGET�NEW�LINK�IN�IMSDBE56„MOVE.L�D1,SDBPDP(A1)ŠMOVE.B�#1,SDBFLG-B(A5)ŠBRA„SDB100�CHECK�AGAIN**ˆER:�PDB�NOT�ALLOCATED*SDBE60„LEA„NALPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L�#NALMSGL,D0ŠMOVE.L�#'PDB�',NALITM-B(A5) ŠBSR„SENDMSQCŠBEQ.S‚SDBE65�ALLOCATE�IN�NIMŠMOVE.L�#PDBSZE,D0ŠMOVE.L�#'PDB�',ALCITM-B(A5)ŠMOVE.L�#'�PDB',PSNITM-B(A5)ŠBSR„DMPALC�DUMP/�ALLOCATE?ŠBEQ.S‚SDBE66�ALLOCATE ŠBSR„GET4HEXŠBRA„SDBE56�SET�NEW�LINK"SDBE65„MOVE.L�#'PDB�',ALCITM-B(A5)ŠLEA„ALCMSG(PC),A0ŠMOVE.L�#ALCMSGL,D0#ŠBSR„SENDMSGŒTELL�WHAT�ACTION‚TAKEN'SDBE66„MOVE.L�SATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B�#1,SATFLG-B(A5)„.�FLAG�SAT�CHANGEDŠMOVE.L�#1,D0Ž. ŠBSR„ALDESCŠBRA„SDB101�GO�ALLOCATEŠPAGE*!*ˆER:�PDB�SPACE�ALREADY�ALLOCATED*SDBE70„LEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„ALEMSG(PC),A0ŠMOVE.L�#ALEMSGL,D0  ŠMOVE.L�#'PDB�',ALEITM-B(A5) ŠBSR„SENDMSQC'ŠBEQ„SDBE51�IN�NIM�TRUNCATE�PDB�OR�QUITŠMOVE.L�#PDBSZE,D0ŠMOVE.L�#'�PDB',PSNITM-B(A5)%ŠBSR„DMPQNL�DUMP/QUIT�OR�GET�NEW�LINKŠMOVE.L�D1,SDBPDP(A1)ŠMOVE.B�#1,SDBFLG-B(A5)ŠBRA„SDB100�TRY�AGAIN*ŠPAGEO*********************************************************************************ˆP�D�BƒC�H�E�C�K*O******************************************************************************** PDBCHK„EQU„***ˆRESET�IM�IF�NECESSARY*ŠBCLRƒ#NXTSTP,D7ŠBEQ.S‚PDBC00�NIM ŠMOVE.B�#1,D7**ˆSEND�PDB�CHECK�MESSAGE* PDBC00„EQU„*ŠLEA„PDBMSG(PC),A0ŠMOVE.L�#PDBMSGL,D0 ŠBSR„SENDMSGS2ŠMOVE.L�VIDBUF+VIDSDS-B(A5),D1ƒGET�1ST�SDB�POINTER*2*ˆPROCESS�ONE�SDB�AT�A�TIME�TO�FIND�ALL�PDB�CHAINS*ˆREAD�IN�NEXT�SDB�IF�ANY*4PDBC01„MOVE.L�#SDBSZE,D2‰NEED�TO�UPDATE�CURRENT�SDB?ŠLEA„SDBBUF(PC),A1ŠSDB�BUFFERŠMOVE.L�#'SDB�',IOERITM-B(A5)�.ŠTST.B‚SDBFLG-B(A5)ŠBEQ.S‚PDBC05�NO;ŠMOVE.L�D1,D3‹YES,�WRITE�IT�TO�DISK�-�SAVE�NEXT�SDB�POINTER+ŠMOVE.L�PSNSDB-B(A5),D1„GET�CURRENT�SDB�PSNŠBSR„WRITSECŒWRITE�ITŠBNE„ABORTREP‹QUIT�IF�ERROR�NOWŠCLR.B‚SDBFLG-B(A5) ŠMOVE.L�D3,D1PDBC05„TST.L‚D1‘ANY�NEXT�SDB�?;ŠBEQ„FILCHKˆNO,�DONE�WITH�ALL�PDB�CHAINS�-�GO�DO�FILE�CHECK!ŠBSR„GETSEC�YES,�READ�IN�NEXT�SDBŠBNE„ABORTREP‹QUIT�IF�ERROR�NOWDŠMOVE.L�D1,PSNSDB-B(A5)‚CUR�SDB�PSN�(NEED�NO�PRIOR�SDB�PSN�ANY�MORE)7ŠLEA„SDBSTR(A1),A3†KEEP�CURRENT�SDB�ENTRY�POINTER�IN�A3ŠMOVE.L�A3,TEMP-B(A5)†.-ŠMOVE.L�#SDBENT,D5‰KEEP�#�OF�SDB�ENTRYS�IN�D5**ˆCHECK�IF�EMPTY�SDB�ENTRY*$PDBC10„TST.L‚SDBPDP(A3)‰EMPTY�ENTRY?ŠBNE.S‚PDBC12�NO0PDBC11„LEA„SDBLEN(A3),A3†YES,�SKIP�TO�NEXT�ENTRYŠMOVE.L�A3,TEMP-B(A5)†.*ŠSUB.L‚#1,D5ŽANY�MORE�ENTRIES�IN�THIS�SDB?(ŠBNE„PDBC10�YES,�GO�CHECK�NEXT�PDB�CHAIN7ŠMOVE.L�SDBBUF+SDBFPT-B(A5),D1ƒNO,�GET�NEXT�SDB�POINTER&ŠBRA„PDBC01�GO�READ�IN�NEXT�SDB�IF�ANYŠPAGE*:*ˆNOT�EMPTY�-�PROCESS�NEW�CATALOG�=�PROCESS�NEW�PDB�CHAIN.2*ˆTURN�IM�BACK�ON�IF�TURNED�OFF�TILL�NEXT�CATALOG.1*ˆSEND�'USER�#,�CATALOG�NAME'�IF�NIM�OR�C-OPTION.* PDBC12„BCLRƒ#NXTSTP,D7‰IM�TURNED ŠBEQ.S‚PDBC13 ŠMOVE.B�#1,D7PDBC13„BSR„IM‘INTERACTIVE�MODE?ŠBEQ.S‚PDBC15�YES;ŠMOVE.W�SDBUSN(A3),D1†NO,SEND�NEW�USER�NUMBER,�CATALOG�NAME%ŠLEA„FUSERN(PC),A0ŠIF�NIM�OR�C-OPTION ŠBSR„BIN2DECŠMOVE.L�SDBCLG(A3),FCATAL-B(A5)#ŠMOVE.L�SDBCLG+4(A3),FCATAL+4-B(A5)ŠLEA„FFFMSG(PC),A0ŠMOVE.L�#FUCMSL,D0 ŠBSR„SENDMSGS**ˆSET�PDB�UPDATE�BOUNDS*/PDBC15„MOVE.L�SDBPDP(A3),D1†GET�1ST�PDB�POINTER!PDBC20„TST.L‚D1‘END�OF�PDB�CHAIN?/ŠBEQ„PDBC11�YES,�GO�PROCESS�NEXT�CATALOG�IF�ANYPDBC25„MOVE.L�#PDBSZE,D2%ŠCLR.B‚DELCRI-B(A5)‡RESET�DELETE�FLAG#ŠMOVE.L�D1,UPDSTR-B(A5)„LOWER�BOUND#ŠMOVE.L�D1,UPDEND-B(A5)„UPPER�BOUNDŠADD.L‚D2,UPDEND-B(A5)„.**ˆREAD�IN�FIRST/NEXT�PDB*%ŠCLR.L‚D4‘INDICATE�NO�ERROR�FROM�READ ŠLEA„PDBBUF(PC),A1ŠBUFFER�TO�USEŠMOVE.L�#'PDB�',IOERITM-B(A5)4ŠTST.B‚PDBFLG-B(A5)‡NEED�TO�WRITE�PRIOR�PDB�TO�DISK?ŠBEQ.S‚PDBC26�NO#ŠMOVE.L�D1,D3ŽYES,�SAVE�NEW�PDB�PSN0ŠMOVE.L�PSNPDB-B(A5),D1„GET�PSN�OF�PDB�TO�UPDATE ŠBSR„WRITSECŠBNE„ABORTREP‹QUIT�IF�ERRORŠCLR.B‚PDBFLG-B(A5)"ŠMOVE.L�D3,D1ŽRESTORE�NEXT�PDB�PSN9PDBC26„MOVE.L�PSNPDB-B(A5),PRVPDB-B(A5)�SET�NEW�PRIOR�PDB+ŠMOVE.L�D1,PSNPDB-B(A5)„SET�NEW�CURRENT�PDB ŠBSR„GETSECŠBEQ„PDBC60�OK�READ;ŠMOVE.B�#1,PDBFLG-B(A5)„SET�FLAG�TO�UPDATE�PDB�IF�CRC�ERRORŠTST.B‚D0‘CRC�ERROR?2ŠBEQ„PDBC60�YES,�IGNORE�-�HOPE�TO�CORRECT�BY�WRITEŠPAGE**ˆIO�ERROR�FROM�READ*4PDBCDT„MOVE.L�#1,D4ŽCOULD�READ�IN�1ST�SECTOR�OF�PDB?BŠMOVE.L�#'PDB�',DELITM-B(A5)�.�IF�YES,�DEALLOCATE/DELETE�CURRENT�PŠMOVE.L�#DELMSGL,D0ˆ.ŠLEA„DELMSG(PC),A0Š.ŠTST.L‚LSTSRD-B(A5)‡.ŠBNE.S‚PDBC30�YES,�GO�DELETE>PDBCTR„MOVE.L�#2,D4ŽDIDN'T�READ�IN�1ST�SECTOR�-�TRUNCATE�CHAINŠMOVE.L�#'PDB�',TRNITM-B(A5)ŠLEA„TRNMSG(PC),A0ŠMOVE.L�#TRNMSGL,D0'PDBC30„BSR„SENDMSQC‹SEND�REPAIR�MESSAGE#ŠBNE„PDBC70�GO�REQUEST�UPDATE�IN�IM#ŠBSR„REPAIR�IN�NIM�ASK�FOR�APPROVAL/ŠBNE„TRMREP�QUIT�IF�USER�DOESN'T�WANT�TO�REPAIR;ŠCLR.B‚PDBFLG-B(A5)‡MAKE�SURE�DON'T�UPDATE�THIS�PDB�IN�DISK ŠSUB  .L‚#1,D4ŽDELETE�OR�TRUNCATE?"ŠBEQ.S‚PDBC45�DELETE�THIS�PDB�ONLY*1*ˆTRUNCATE�PDB�CHAIN�BECAUSE�LOST�FORWARD�POINTER*PDBC35„CLR.B‚PDBFLG-B(A5)CŠMOVE.L�PRVPDB-B(A5),D1„GET�PREVIOUS�PDB'S�1ST�SECTOR�TO�BE�UPDATED.ŠBEQ.S‚PDBC40�IF�NONE�THEN�NO�PDB�CHAIN�AT�ALL ŠMOVE.L�#1,D2ŠLEA„SDBBUF(PC),A1 ŠBSR„GETSEC!ŠBNE„TRMREP�IF�ERROR�QUIT�FOR�NOW6ŠCLR.L‚SDBBUF+SDBFPT-B(A5)�PRIOR�SDB�NOW�LAST�IN�CHAIN"ŠBSR„WRITSECŒWRITE�IT�BACK�TO�DISK!ŠBNE„TRMREP�QUIT�FOR�NOW�ON�ERROR6ŠBRA.S‚PDBC41�DONE�WITH�PDB�CHECK�-�CHECK�NEXT�CATALOG5PDBC40„CLR.L‚SDBPDP(A3)‰DELETED�LAST�PDB�-�NO�CATALOG"ŠMOVE.B�#1,SDBFLG-B(A5)„UPDATE�SDB$PDBC41„BRA„PDBC11�GO�TO�NEXT�CATALOG*9*ˆDELETE�CURRENT�PDB�BECAUSE�OF�ERROR,�FORWARD�LINK�KNOWN*5PDBC45„MOVE.L�PDBBUF+PDBFPT-B(A5),D4ƒGET�FORWARD�LINKŠCLR.B‚PDBFLG-B(A5)@ŠMOVE.L�PRVPDB-B(A5),D1„GET�PRIOR�PDB'S�1ST�SECTOR�TO�BE�UPDATEDŠBEQ.S‚PDBC55�NO�PRIOR�PDBŠMOVE.L�#1,D2ŽGET�ONE�SECTORŠLEA„PDBBUF(PC),A1ŠBSR„GETSEC�READ�PDB�SECTOR!ŠBNE„TRMREP�QUIT�FOR�NOW�IF�ERROR+ŠMOVE.L�D4,PDBBUF+PDBFPT-B(A5)�SET�NEW�LINKŠBSR„WRITSECŒUPDATE�ON�DISK!ŠBNE„TRMREP�QUIT�FOR�NOW�IF�ERROR PDBC50„MOVE.L�D4,D1ŽNEXT�PDB�PSNŠBRA.S‚PDBC56�GO�PROCESS�IT2PDBC55„MOVE.L�D4,SDBPDP(A3)†SET�NEW�1ST�PDB�IN�SDB*ŠMOVE.B�#1,SDBFLG-B(A5)„FLAG�TO�UPDATE�SDB ŠMOVE.L�D4,D1=PDBC56„BRA„PDBC20ŒGO�PROCESS�NEXT�PDB�(MAY�BE�NONE�IF�D1�=�0)*0*ˆIN�IM�DUMP�AND�UPDATE�PDB,�IN�NIM�GO�CHECK�PDB* PDBC60„BSR„IMŠBNE„PDB100�IN�NIM�GO�CHECK�PDBCPDBC65„MOVE.L�PSNPDB-B(A5),D3„DUMP�ALL�OF�PDB�(D3�=�1ST�PSN�OF�PDB)ŠMOVE.L�#'�PDB',PSNITM-B(A5) ŠBSR„DUMP/PDBC70„MOVE.L�TEMP-B(A5),A3†RESTORE�SDB�POINTER'ŠMOVE.L�#'�PDB',UPDITM-B(A5)�UPDATE�PDB/ŠBSR„UPDATE�REQUEST�UPDATE�(D4�HAS�R-PARAMETER)*ŠDC.LƒPDB100-B‹CR4ŠDC.LƒPDBC85-B‹N�TURN�OFF�IM�TILL�NEXT�CATALOG�CHECK@ŠDC.LƒPDBC75-B„R�TERM�LOOP�D4�=�1-DELETE�PDB,�=�2-TRUNCATE�CHAIN*§D4�=�0�IS�ERRORAŠDC.LƒPDBC99-B‚D�DELETE�CURRENT�PDB,�USE‚FORWARD�LINK�IN�PDB�BUFFŠDC.LƒPDBC80-B‹A�N/AŠDC.LƒTRMREP-B‹QŠDC.LƒPDBC95-B‹$PSN#ŠDC.LƒPDBC86-B‹$‚DUMP�PDB�(SECTORS)(ŠDC.LƒPDBC96-B‹DUMP�SECTOR(S)�NOT�IN�PDBŠDC.LƒPDBC80-B‹D�PSN,N�N/AŠDC.LƒPDBC80-B‹A�PSN,N�N/A-ŠDC.LƒPDBC95-B‹OFFSET�-�UPDATE�1ST�PDB�SECTORŠDC.LƒPDBC98-B‹C ŠDC.LƒPDBSHL-B‹?�HELP�short�listŠDC.LƒPDBLHL-B‹H�HELP�long�listŠPAGE PDBSHL:ƒEQU„*<ŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�messagesŠLEA„HLPSMSG(PC),A1ŠMOVE.L�#HLPSMSGL,D2 ŠBRA.S‚PDBGOH PDBLHL:ƒEQU„*ŠMOVE.B�#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L�#HLPLMSGL,D2PDBGOH„BSR„GETHELPŠMOVE.L�#'�PDB',PSNITM-B(A5)ŠLEA.L‚PDBBUF-B(A5),A1ŠMOVE.L�PSNPDB-B(A5),D1 ŠADD.L‚#3,D1 ŠMOVE.L�#1,D2 ŠBSR„DUMP ŠBRA„PDBC70 **ˆ'R'*$PDBC75„TST.L‚D4‘REPAIR�IF�READ�ERRORŠBEQ.S‚PDBC80�ERRORŠSUB.L‚#1,D4ŽTRUNCATE?ŠBNE„PDBC35�YESŠBRA.S‚PDBC99�NO,�DELETE)PDBC80„BSR„RESPNA�NOT�ACCEPTABLE�RESPONSEŠBRA„PDBC70�TRY�AGAIN**ˆ'N'*4PDBC85„BSETƒ#NXTSTP,D7‰TURN�OFF�IM�TILL�NEXT�CATALOG ŠCLR.B‚D7#ŠBRA.S‚PDB100�GO�CHECK�PDB�CONTENTS**ˆDUMP�PDB�($)*PDBC86„TST.W‚D2‘N�GIVEN?!ŠBEQ.S‚PDBC90�NO,�DUMP�ALL�OF�PDBŠCMP.W‚#PDBSZE,D2‰N�TOO�LARGE?ŠBLE.S‚PDBC87�NOŠMOVE.W�#1,D2ŽYES,�USE�1+PDBC87„SUB.L‚A1,A1ŽGET�PSN�OF�SECTOR�WANTED ŠMOVE.W�D2,A1 ŠSUB.L‚#1,A1 ŠADD.L‚A1,D1ŠMOVE.W�#1,D2ŽDUMP�ONE�SECTOR ŠBRA.S‚PDBC95* *ˆDUMP�PDB*PDBC90„MOVE.L�#PDBSZE,D2ŠMOVE.L�PSNPDB-B(A5),D1ŠBSETƒ#31,D2�DUMP**ˆUPDATE�OR�DUMP�PDB�REQUESTED*#PDBC95„LEA„PDBBUF(PC),A1ŠUPDATE�PDBŠTST.L‚D2‘DUMP�ONLY?ŠBMI„PDBC65�YES!ŠSUB.L‚PSNPDB-B(A5),D1„NO,�UPDATE)ŠMULUƒD6,D1ŽGET�SECTOR�ADDRESS�FOR�UPDATEŠLEA„(A1,D1),A1‰STARTŠLEA„(A1,D6),A2‰ENDŠBSR„UPDBUF�UPDATE�PDB�SECTOR*ŠMOVE.B�#1,PDBFLG-B(A5)„FLAG�TO�UPDATE�PDB ŠBRA„PDBC70�REQUEST�UPDATE�AGAIN**ˆDUMP�ANY�SECTOR�NOT�IN�PDB*PDBC96„MOVE.L�#'„',PSNITM-B(A5) ŠBSR„UPDSEC�DUMP�(D2�BIT�31�SET) ŠBRA„PDBC70**ˆ'C'*:PDBC98„BSETƒ#COPTION,D7ˆCHECK�ONLY�MODE�TILL�ERROR�OR�DONE ŠCLR.B‚D7 ŠBRA.S‚PDB100ŠPAGE**ˆDELETE�CURRENT�PDB*,PDBC99„MOVE.B�  #1,DELCRI-B(A5)„FLAG�TO�DELETE**ˆCHECK�PDB�CONTENTS* PDB100„EQU„**/*ˆCHECK�PDB�CATALOG/USER�#�SAME�AS�IN�SDB�ENTRY*.ŠTST.B‚DELCRI-B(A5)‡SKIP�TEST�IF�TO�DELETE�PDB ŠBNE„PDB104�.2ŠLEA„SDBUSN(A3),A0†SDB�ENTRY'S‚USER�#,CATALOG�NAME:ŠLEA„PDBBUF+DIRUSN(PC),A1ƒPDB�HEADER'S‚USER�#,CATALOG�NAMEŠMOVE.L�#USNLEN+CLGLEN,D0#PDB101„CMP.B‚(A0)+,(A1)+ˆCHECK�SAMEŠBNE.S‚PDB102�ERROR ŠSUB.L‚#1,D0ŠBNE„PDB101�OK�SO�FARŠBRA„PDB104�OKCPDB102„LEA„SPNPSN(PC),A0‡ERROR�-�CONFLICT�BETWEEN�PDB/SDB�CATALOG�IŠMOVE.L�UPDSTR-B(A5),D1 ŠBSR„BIN4HEXŠLEA„SPNMSG(PC),A0ŠMOVE.L�#SPNMSGL,D0ŠBSR„SENDMSQC‹SEND�ERROR�MSG9ŠMOVE.L�SDBCLG(A3),SPCCAT-B(A5)�OVERLAY�PRECEDING�CATALOG#ŠMOVE.L�SDBCLG+4(A3),SPCCAT+4-B(A5) ŠCLR.L‚D1ŠMOVE.W�SDBUSN(A3),D1ŠLEA„SPCUSN(PC),A0 ŠBSR„BIN2HEXŠLEA„SPCMSG(PC),A0#ŠMOVE.B�#'S',(A0)ŠSDB'S�USER�#,�CATŠMOVE.L�#SPCMSGL,D0 ŠBSR„SENDMSG,ŠMOVE.L�DIRCLG+PDBBUF+4-B(A5),SPCCAT+4-B(A5)(ŠMOVE.L�DIRCLG+PDBBUF-B(A5),SPCCAT-B(A5)ŠMOVE.W�DIRUSN+PDBBUF-B(A5),D1ŠLEA„SPCUSN(PC),A0 ŠBSR„BIN2HEX ŠMOVE.L�#8,D1ŽCHECK�ALPHANUMERICŠLEA„SPCCAT(PC),A0Š.PDB1A2„MOVE.B�(A0)+,D0 ŠBSR„ALFNUMŠBEQ.S‚PDB1B2�OKŠMOVE.B�#'.',-(A0)PDB1B2„SUB.L‚#1,D1 ŠBNE„PDB1A2ŠLEA„SPCMSG(PC),A0#ŠMOVE.B�#'P',(A0)ŠPDB'S�USER�#,�CATŠMOVE.L�#SPCMSGL,D0 ŠBSR„SENDMSGŠBSR„SETEQL�SET�EQUAL?#ŠBNE„TRMREP�NO�...�TERMINATE�REPAIR,ŠMOVE.B�#1,PDBFLG-B(A5)„INDICATE�PDB�CHANGEDŠLEA„SDBUSN(A3),A0†YESŠLEA„PDBBUF+DIRUSN(PC),A1ŠMOVE.L�#USNLEN+CLGLEN,D0PDB1C2„MOVE.B�(A0)+,(A1)+ ŠSUB.L‚#1,D0 ŠBNE„PDB1C2ŠBRA.S‚PDB104�CONTINUE PDB1D2„BSR„IMŠBEQ„PDBC70�UPDATE�IN�IMŠBRA„PDBCTR�TRUNCATE�IN�NIM**ˆCHECK�NEXT�PDB�OK*$PDB104„MOVE.L�PDBBUF+PDBFPT-B(A5),D1ŠBEQ.S‚PDB110�NONE�IS�OKŠMOVE.L�#PDBSZE,D2‰CHECK�PSN�OK ŠBSR„MPSNC ŠBHI.S‚PDBE00�NEXT�PDB�PSN�ERROR&ŠBSR„TSTALC�CHECK�ALLOCATED�IN�OLD�SAT"ŠBNE.S‚PDBE10�ERROR,�NOT�ALLOCATED%PDB105„BSR„TSTNYA�ALLOCATE�IN�NEW�SAT6ŠBNE„PDBE20�ERROR,�ALLOCATED�TO�SOMETHING�ELSE�ALREADY*,*ˆCHECK�RESERVED�SPACE�IN�PDB�HEADER�IS�ZERO*-PDB110„TST.B‚DELCRI-B(A5)‡DELETE�CURRENT�PDB?ŠBNE„PDBC45�YES,�GO�DELETE-ŠLEA„PDBBUF+$E(PC),A2‡START�OF�RESERVED�SPACEŠMOVE.L�#2,D1ŽLENGTHŠMOVE.L�#'HDR�',RESITM-B(A5)"ŠBSR„RSVCHK�CHECK�AND�HANDLE�ERRORŠBEQ.S‚PDB115�OK$ŠBMI„TRMREP�QUIT�IF�NOT�TO�FIX�ERROR(ŠMOVE.B�#1,PDBFLG-B(A5)„FLAG�PDB�UPDATED**ˆDONE�WITH�THIS�PDB*9PDB115„MOVE.L�PDBBUF+PDBFPT-B(A5),D1ƒGET�NEXT�PDB�POINTER.ŠBRA„PDBC20�GO�SEE�IF�ANY�MORE�IN�THIS�CATALOG**ˆER:�PDB�FORWARD�LINK�BAD* PDBE00„EQU„*ŠLEA„LNKPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„LNKMSG(PC),A0ŠMOVE.L�#LNKMSGL,D0ŠMOVE.L�#'PDB�',LNKITM-B(A5) ŠBSR„SENDMSQC$ŠBNE„PDBC70�IN�IM�REPEAT�UPDATE�LOOP3PDBE05„MOVE.L�#'PDB�',TRNITM-B(A5)�TRUNCATE�IN�NIM?ŠLEA„TRNMSG(PC),A0ŠMOVE.L�#TRNMSGL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠBNE„TRMREP�NOŠCLR.L‚PDBBUF+PDBFPT-B(A5)�YES#ŠMOVE.B�#1,PDBFLG-B(A5)„FLAG�CHANGE ŠBRA„PDB110*'*ˆER:�NEXT�PDB�NOT�ALLOCATED�IN�OLD�SAT* PDBE10„EQU„*ŠLEA„NALPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L�#NALMSGL,D0ŠMOVE.L�#'PDB�',NALITM-B(A5)/ŠBSR„SENDMSQC‹SEND�ERROR�MSG�THAT�NOT�ALLOCATEDŠBEQ.S‚PDBE15�ALLOCATE�IN�NIMŠMOVE.L�#PDBSZE,D0ŠMOVE.L�#'PDB�',ALCITM-B(A5)ŠMOVE.L�#'PDB�',PSNITM-B(A5)ŠBSR„DMPALC�ALLOCATE�IN�IM?ŠBEQ.S‚PDBE16�YES"ŠBRA„PDBC70�NO,�REPEAT�UPDATE�LOOPPDBE15„LEA„ALCMSG(PC),A0ŠMOVE.L�#ALCMSGL,D0ŠMOVE.L�#'PDB�',ALCITM-B(A5) ŠBSR„SENDMSG'PDBE16„MOVE.L�SATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B�#1,SATFLG-B(A5)„.�FLAG�SAT�CHANGEDŠMOVE.L�#1,D0Ž. ŠBSR„ALDESCŠBRA„PDB105�GO�ALLOCATE***ˆER:�NEXT�PDB'S�SECTORS�ALREADY�ALLOCATED*BPDBE20„CLR.B‚LSTSRD-B(A5)‡FLAG�TO�TRUNCATE�IF�1ST�SECTOR�ALLOCATED ŠTST.L‚D0ŠBMI.S‚PDBE20ACŠMOVE.B�#1,LSTSRD-B(A5)ƒFLAG�DELETE�IF�1ST�SECTOR�NOT�YET�ALLOCATED#PDBE20AƒMOVE.L�#'PDB�',ALEITM-B(A5)ŠLEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L�#ALEMSGL,D0ŠLEA„ALEMSG(PC),A0 ŠBSR„SENDMSQC$ŠBNE„PDBC70�IN�IM�REPEAT�UPDATE�LOOPŠTST.B‚LSTSRD-B(A5)‡TRUNCATE?*ŠBEQ„PDBE05�YES,�THIS�PDB�IS�LAST�IN�CHAINŠMOVE.L�#DELMSGL,D0  ŠLEA„DELMSG(PC),A0ŠMOVE.L�#'PDB�',DELITM-B(A5)ŠBSR„SENDMSGŒDELETE�PDB? ŠBSR„REPAIRŠBNE„TRMREP�NO7ŠBSR„WRTSBFŒYES,�WRITE�CURRENT�SECTOR�BUFFER�IF�CHANGED ŠBNE„TRMREP,ŠLEA„SECBUF(PC),A1ŠDELETE�PDB�-�UPDATE�LINKSEŠMOVE.L�PDBBUF+PDBFPT-B(A5),D1�GET�NXT�LINK�FROM�NXT�PDB'S�1ST�SECTOR$ŠMOVE.L�#1,D2Ž.�READ�JUST�ONE�SECTOR ŠBSR„GETSEC ŠBNE„TRMREPŠMOVE.L�D1,PSNSEC-B(A5)'* SET NEW NEXT PDB LINK (=DEL NEXT PDB)/ŠMOVE.L�SECBUF+PDBFPT-B(A5),PDBBUF+PDBFPT-B(A5)ŠLEA„PDBBUF(PC),A1ŠMOVE.B�#1,PDBFLG-B(A5)ŠBRA„PDB104�CHECK�NEW�LINKŠPAGEO*********************************************************************************ˆF�I�L�EƒC�H�E�C�K*O******************************************************************************** FILCHK„EQU„**&*ˆWRITE�ANY�UPDATED�SDB�OR�PDB�TO�DISK*ŠTST.B‚SDBFLG-B(A5)ŠBEQ.S‚FILC0ŽSDB�NOT�CHANGEDŠMOVE.L�#SDBSZE,D2ŠMOVE.L�PSNSDB-B(A5),D1ŠLEA„SDBBUF(PC),A1 ŠBSR„WRITSECŠBNE„ABORTREP‹QUIT�NOW�IF�ERRORŠCLR.B‚SDBFLG-B(A5)FILC0…TST.B‚PDBFLG-B(A5)ŠBEQ.S‚FILC1ŽPDB�NOT�CHANGEDŠLEA„PDBBUF(PC),A1ŠMOVE.L�#PDBSZE,D2ŠMOVE.L�PSNPDB-B(A5),D1 ŠBSR„WRITSECŠBNE„ABORTREP‹QUIT�NOW�IF�ERRORŠCLR.B‚PDBFLG-B(A5)FILC1…CLR.L‚PSNSDB-B(A5)ŠCLR.L‚PSNPDB-B(A5)**ˆTURN�IM�BACK�ON�IF�NECESSARY*ŠBCLRƒ#NXTSTP,D7 ŠBEQ.S‚FILC00 ŠMOVE.B�#1,D7**ˆSEND�'FILE�CHECK�MESSAGE'*FILC00„LEA„FILMSG(PC),A0ŠMOVE.L�#FILMSGL,D0 ŠBSR„SENDMSGS4ŠMOVE.L�VIDSDS+VIDBUF-B(A5),D1ƒGET�FIRST�SDB�POINTER**ˆGET�1ST/NEXT�SDB�INTO�MEMORY*FILC10„MOVE.L�#SDBSZE,D2ŠTST.L‚D1‘D1�=�NEXT�SDB'S�PSNŠBNE.S‚FILC11�ANY�MORE�SDB'S?"ŠBTSTƒ#FREPAIR,D7ˆNO,�FILE�REPAIR?;ŠBEQ„FSATCKˆNO,�DONE�-�NO�MORE�SDBS�-�GO�DO�FINAL�SAT�CHECK,ŠLEA„FNFMSG(PC),A0ŠYES,�FILE�NOT�FOUND�ERRORŠMOVE.L�#FNFMSGL,D0 ŠBSR„SENDMSGS ŠBRA„TRMREPFILC11„LEA„SDBBUF(PC),A1ŠMOVE.L�#'SDB�',IOERITM-B(A5)2ŠBSR„GETSEC�(NEED�NOT�TO�WRITE�SDB'S�BACK�ANYMORE)2ŠBNE„ABORTREP‹READ�ERROR�NOW�CAUSES�REPAIR�TO�QUITI‡LEA�SDBBUF+SDBSTR(PC),A3�KEEP�CURRENT�SDB�ENTRY�IN�A3�(DON'T�NEED�PSNSDB<ŠMOVE.L�A3,TEMP-B(A5)†.ANY�MORE�SINCE�WILL�NOT�UPDATE�SDB'S)8ŠMOVE.L�#SDBENT,D5‰KEEP�NUMBER�OF�SDB�ENTRIES�LEFT�IN�D5*B*ˆGET�1ST/NEXT�SDB�ENTRY�TO�GET�PDB�CHAIN�STARTING�PSN�FOR�CATALOG*#FILC15„TST.L‚SDBPDP(A3)‰PDB�POINTERŠBNE.S‚FILC21�EMPTY�ENTRY?6FILC20„LEA„SDBLEN(A3),A3†YES,�SKIP,�GET�NEXT�SDB�ENTRYŠMOVE.L�A3,TEMP-B(A5)†.'ŠSUB.L‚#1,D5ŽANY�MORE�LEFT�IN�THIS�SDB?ŠBNE.S‚FILC15�YES/ŠMOVE.L�SDBBUF+SDBFPT-B(A5),D1ƒNO,�GET�NEXT�SDB ŠBRA„FILC10**ˆPROCESS�NEW�CATALOG'S�FILES*7FILC21„MOVE.L�SDBCLG(A3),FCATAL-B(A5)�SAVE�CATALOG�NAME#ŠMOVE.L�SDBCLG+4(A3),FCATAL+4-B(A5) ŠCLR.L‚D1%ŠMOVE.W�SDBUSN(A3),D1†GET�USER�NUMBERŠLEA„FUSERN(PC),A0#ŠBSR„BIN2DECŒCHANGE�IT�INTO�DECIMAL*/*ˆIF�FILE�REPAIR�SKIP�ALL�BUT�SPECIFIED�CATALOG*ŠBTSTƒ#FREPAIR,D76ŠBEQ.S‚FILC22�SKIP�CATALOG�NAME�CHECK�IF�VOLUME�REPAIR,ŠBSR„CMATCH�CHECK�IF�THIS�CATALOG�IS�THE�ONE8ŠBNE„FILC20‹NO�MATCH�-�CONTINUE�SEARCH�FOR�GIVEN�CATALOG&ŠBSR„UMATCH�SEE�IF�USER�NUMBER�MATCHESŠBNE„FILC20�BRANCH�IF�NOT/FILC22„MOVE.L�SDBPDP(A3),D1†GET�1ST�PDB�POINTER>ŠBCLRƒ#NXTSTP,D7†TURN�IM�BACK�ON�FOR�NEXT�CATALOG�IF�NECESSARY ŠBEQ.S‚FILC25 ŠMOVE.B�#1,D7**ˆGET�1ST/NEXT�PDB�INTO�MEMORY*FILC25„MOVE.L�#PDBSZE,D24ŠTST.L‚D1‘ANY�MORE�DIRECTORY�BLOCKS�FOR�THIS�CATALOG"ŠBEQ„FILC20�NO,�GO�TO�NEXT�CATALOGŠLEA„PDBBUF(PC),A1ŠMOVE.L�#'PDB�',IOERITM-B(A5)9ŠTST.B‚PDBFLG-B(A5)‡NEED�TO�WRITE�PRIOR�PDB�BACK�TO�DISK?)ŠBEQ.S‚FILC30�NO,�IT�HAS�NOT�BEEN�CHANGED$ŠMOVE.L�D1,D3ŽYES,�SAVE�NEXT�PDB�PSNŠMOVE.L�PSNPDB-B(A5),D1ŠBSR„WRITSECŒABORT�IF�ERROR ŠBNE„ABORTREP!ŠMOVE.L�D3,D1ŽRESTORE�NEW�PDB�PSN*ŠCLR.B‚PDBFLG-B(A5)‡CLEAR�PDB�CHANGED�FLAG"FILC30„BSR„GETSEC�READ�IN�NEXT�PDB'ŠBNE„ABORTREP‹QUIT�IF�ERROR�ON�READ�NOWDŠMOVE.L�D1,PSNPDB-B(A5)‚SET�NEW�CURRENT�PDB�POINTER�(NEED�NO�PRVPDB)ŠPAGE**ˆSET�UPDATE�BOUNDS*ŠMOVE.L�D1,UPDSTR-B(A5)ŠMOVE.L�D1,UPDEND-B(A5)ŠADD.L‚D2,UPDEND-B(A5)>ŠLEA„PDBBUF+PDBSTR(PC),A2ƒKEEP�CURRENT�PDB�ENTRY�POINT ER�IN�A23ŠMOVE.L�#PDBENT,D4‰KEEP�NUMBER�OF�PDB�ENTRIES�IN�D4*9*ˆGET�1ST/NEXT�PDB�ENTRY�FOR�CATALOG�=�NEXT�FILE�TO�CHECK*2FILC35„TST.B‚DIRFIL(A2)‰EMPTY�ENTRY,�DELETED�FILE?ŠBNE.S‚FILC50�NOŠTST.L‚DIRFIL(A2)‰DELETED�FILE?ŠBNE.S‚FILC45�YES8FILC40„LEA„PDBLEN(A2),A2†NO,�EMPTY�ENTRY,�GET�NEXT�ENTRYŠCLR.B‚RCVFLG-B(A5)‡RESET�FLAGSŠCLR.B‚DELCRI-B(A5)ŠCLR.B‚FILOK-B(A5)3ŠSUB.L‚#1,D4ŽANY�MORE�PDB�ENTRIES�LEFT�IN�THIS�ONE?ŠBNE„FILC35�YES6ŠMOVE.L�PDBBUF+PDBFPT-B(A5),D1ƒNO,�GET�NEXT�PDB�IF�ANY ŠBRA„FILC25*;*ˆTHIS�ENTRY�BELONGS�TO�A�DELETED�FILE�-�TRY�TO�RECOVER�IT?**FILC45„BTSTƒ#ROPTION,D7ˆRECOVER�OPTION�ON?'ŠBEQ„FILC40�NO�-�SKIP�ALL�DELETED�FILES8ŠMOVE.B�#1,DELCRI-B(A5)„FLAG�DELETED�ENTRY(DELETED�FILE)1FILC50„BTSTƒ#FREPAIR,D7ˆWANT�ONLY�SPECIFIED�FILE?ŠBEQ.S‚FILC51�NOBŠBSR„FMATCH�YES,�CHECK�IF�THIS�IS�THE�DELETED�FILE�TO�BE�RECOVERED'ŠBNE„FILC40�IT'S�NOT,�SKIP�TO�NEXT�FILE2ŠBSETƒ#FOUNDF,D7‰FOUND�FILE,�QUIT�AFTER�FILE�CHECK?FILC51„BCLRƒ#STP1,D7‹TURN�IM�BACK�ON�FOR�NEXT�FILE�IF�NECESSARYŠBEQ.S‚FILC52�NIM ŠMOVE.B�#1,D7 FILC52„BSR„IMŠBEQ.S‚FILC54�INTERACTIVE�MODE*D*ˆIN�NONINTERACTIVE�MODE�SEND�FILE�NAME.�IF�DELETED�FILE�ASK�IF�USER*ˆWANTS�TO�RECOVER�FILE.*ŠBSR„PFILNM�SEND�FILE�NAMEŠTST.B‚DIRFIL(A2)‰DELETED�FILE?(ŠBNE„FIL100�NO,�GO�CONTINUE�FILE'S�CHECK4ŠLEA„RCVMSG(PC),A0ŠASK�IF�USER�WANTS�TO�RECOVER�FILEŠMOVE.L�#RCVMSGL,D0 ŠBSR„SENDMSG ŠBSR„GETRYN'ŠBNE„FIL999�SKIP�IF�NOT�TO�RECOVER�FILEŠBTSTƒ#FREPAIR,D7ˆFILE�REPAIR?ŠBEQ.S‚FILC53�NO@ŠMOVE.B�FILNAM-B(A5),DIRFIL(A2)‚YES,�USE�FIRST�CHAR�OF�FILE�NAMEŠBRA.S‚FILC53A-FILC53„LEA„GNFMSG(PC),A0Š'GIVE�NEW�FILE�NAME'ŠMOVE.L�#GNFMSGL,D0 ŠBSR„SENDMSG ŠMOVE.L�A2,A1ŠMOVE.L�#DIRFIL,D2$ŠMOVE.L�#8,D3ŽFILE�NAME�FIELD�LENGTHDŠBSR‚NEWFLD�GET�NEW�FILE�NAME(OR‚AT�LEAST�1ST�BYTE�MUST�BE�REPLACED)DFILC53AƒMOVE.B�#1,PDBFLG-B(A5)„SET�PDB�CHANGED�FLAG�FOR�FUTURE�WRITE4ŠMOVE.B�#1,RCVFLG-B(A5)„FLAG�RECOVERING�DELETED�FILE"ŠBRA„FIL100�GO�TRY�TO�RECOVER�FILEŠPAGE*4*ˆIN�INTERACTIVE�MODE�DUMP�PDB�ENTRY,�ASK�FOR�UPDATE*FILC54„LEA„PDBBUF(PC),A1 ŠMOVE.L�A2,D2!ŠSUB.L‚A1,D2ŽD2�=�OFFSET�TO�ENTRY!ŠMOVE.L�#PDBLEN,D3‰LENGTH�TO�DUMP ŠBSR„DUMPBFŠMOVE.L�#'�PDE',UPDITM-B(A5)/FILC55„MOVE.L�TEMP-B(A5),A3†RESTORE�SDB�POINTER ŠBSR„UPDATE*ŠDC.LƒFILC95-B‹CRŠDC.LƒFILC90-B‹N(ŠDC.LƒFILC99-B‹R�RECOVER�IF�DELETED�FILEŠDC.LƒFILC85-B‹D�DELETE�FILEŠDC.LƒFILC60-B‹A�N/AŠDC.LƒTRMREP-B‹QŠDC.LƒFILC65-B‹$PSN�IN�RANGEŠDC.LƒFILC54-B‹$�DUMP�ENTRY ŠDC.LƒFILC80-B‹$PSN�OUT�OF�RANGEŠDC.LƒFILC60-B‹D�PSN‚N/AŠDC.LƒFILC60-B‹A�PSN‚N/AŠDC.LƒFILC66-B‹OFFSETŠDC.LƒFILC91-B‹C ŠDC.LƒFILSHL-B‹?�HELP�short�listŠDC.LƒFILLHL-B‹H�HELP�long�list FILSHL:ƒEQU„*<ŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�messagesŠLEA„HLPSMSG(PC),A1ŠMOVE.L�#HLPSMSGL,D2 ŠBRA.S‚FILGOH FILLHL:ƒEQU„*ŠMOVE.B�#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L�#HLPLMSGL,D2FILGOH„BSR„GETHELP ŠBRA„FILC54 **ˆNOT�ACCEPTABLE�RESPONSE*$FILC60„BSR„RESPNA�SEND�ERROR�MESSAGEŠBRA„FILC55�TRY�AGAINŠPAGE*)*ˆDUMP�PDB�SECTOR(S),�OR�UPDATE�PDB�ENTRY*FILC65„LEA„PDBBUF(PC),A1 ŠTST.L‚D2ŠBMI.S‚FILC75�DUMP?ŠBRA„FILC60�NO,UPDATE�-�ERROR-FILC66„MOVE.L�A2,A1ŽCAN�UPDATE�ONLY�PDB�ENTRY ŠMOVE.L�A2,D3'ŠLEA„PDBLEN(A2),A2†ENTRY�END�FOR�UPDATEŠBSR„UPDBUF�UPDATE�ENTRY"ŠMOVE.B�#1,PDBFLG-B(A5)„UPDATE�PDB'ŠMOVE.L�D3,A2ŽRESTORE�PDB�ENTRY�POINTER ŠBRA„FILC550FILC75„MOVE.L�PSNPDB-B(A5),D3„DUMP�PDB�SECTOR(S)ŠMOVE.L�#'�PDB',PSNITM-B(A5) ŠBSR„DUMP ŠBRA„FILC55**ˆDUMP�ANY�SECTOR*FILC80„MOVE.L�#'„',PSNITM-B(A5) ŠBSR„UPDSEC ŠBRA„FILC55* *ˆDELETE�FILE* FILC85„EQU„*AŠCLR.B‚DIRFIL(A2)„DELETE�FILE�=>�ZERO�OUT�FIRST�BYTE�OF�FILE�NAMEDŠMOVE.B�#1,PDBFLG-B(A5)‚FLAG�PDB�CHANGED�AND�MUST�BE�UPDATED�ON�DISK$FILC89„BRA„FIL999�GO�CHECK�NEXT�FILE*#*ˆN�-�TURN�IM�OFF�TILL�NEXT�CATALOG*FILC90„BSETƒ#NXTSTP,D7 ŠCLR.B‚D7 ŠBRA.S‚FILC95**ˆ'C'*:FILC91„BSETƒ#COPTION,D7ˆCHECK�ONLY�MODE�TILL�ERROR�OR�DONE ŠCLR.B‚D7**ˆCR*,FILC95„TST.B‚DIRFIL(A2)‰SKIP �FILE�IF�DELETED ŠBEQ„FILC89 ŠBRA.S‚FIL100*6*ˆR�-�RECOVER�DELETED�FILE,�IGNORE�IF�NOT�DELETED�FILE,*ˆ(CONTINUE�WITH�PDB�ENTRY�CHECK/FILE�CHECK)*;FILC99„TST.B‚DELCRI-B(A5)‡ERROR�IF�NOT�DELETED�FILE�AT�HAND ŠBEQ„FILC60(ŠTST.B‚DIRFIL(A2)‰CHECK�HE�GAVE�NEW�NAMEŠBEQ„FILC60�ERROR�IF�DIDN'T,ŠMOVE.B�#1,RCVFLG-B(A5)„FLAG�RECOVERING�FILEŠCLR.B‚DELCRI-B(A5)ŠPAGE**ˆCHECK�PDB�ENTRY* FIL100„EQU„***‡CHECK�FILE�NAME*-ŠCLR.B‚DELCRI-B(A5)‡DISABLE�R-UPDATE�RESPONSEŠTST.B‚DIRFIL(A2)‰FILE�DELETED?ŠBEQ.S‚FIL102�YES,�SKIP�ENTRYŠLEA„DIRFIL(A2),A1 ŠCLR.L‚D2 ŠMOVE.L�#8,D3ŠMOVE.L�#FNEMSGL,D0-ŠBSETƒ#31,D0�FLAG�TO�ALLOW�&�AT�START�OF�NAMEŠLEA„FNEMSG(PC),A0 ŠBSR„NAMECKEŠBEQ.S‚FIL105�FILE�NAME�OK(�DOES�NOT�CHECK�FOR�DUPLICATE�NAME�ERRORS)ŠMOVE.B�#1,PDBFLG-B(A5) ŠTST.L‚D0 ŠBNE„FIL100FIL101„CLR.B‚(A1)�DELETED�FILE?(FIL102„BRA„FIL999�YES,�SKIP�DELETED�FILE**ˆCHECK�EXTENSION*FIL105„LEA„DIREXT(A2),A1 ŠCLR.L‚D2 ŠMOVE.L�#2,D3ŠMOVE.L�#EXTMSGL,D0ŠLEA„EXTMSG(PC),A0 ŠBSR„NAMECKŠBEQ.S‚FIL106�OK ŠTST.L‚D0ŠBEQ„FIL105�CHEKC�AGAINŠMOVE.B�#1,PDBFLG-B(A5)%ŠBRA„FIL105�CHECK�NEW�EXTENSION�AGAIN**ˆCHECK�RESERVED�SPACE�IS�ZERO*FIL106„MOVE.L�A2,A0ŽSAVEŠMOVE.L�#'PDE�',RESITM-B(A5)ŠLEA„DIRRS1(A0),A2 ŠMOVE.L�#2,D1 ŠBSR„RSVCHK ŠBEQ.S‚FIL107 ŠBMI„FIL999ŠMOVE.B�#1,PDBFLG-B(A5)FIL107„LEA„DIRRS2(A0),A2 ŠMOVE.L�#1,D1 ŠBSR„RSVCHK ŠBEQ.S‚FIL108$ŠBMI„FIL999�SKIP�IF�NOT�TO�FIX�FIELDŠMOVE.B�#1,PDBFLG-B(A5)FIL108„LEA„DIRRS3(A0),A2 ŠMOVE.L�#8,D1 ŠBSR„RSVCHKŠBEQ.S‚FIL109�OK$ŠBMI„FIL999�SKIP�IF�NOT�TO�FIX�FIELDŠMOVE.B�#1,PDBFLG-B(A5)5FIL109„MOVE.L�A0,A2ŽRESTORE�CURRENT�PDB�ENTRY�POINTER**ˆCHECK�ATTRIBUTES*ŠMOVE.B�DIRATT(A2),D09ŠANDI.B�#DFTBIT,D0‰MASK�ALL�BUT�FILE�TYPE�BITS�*�07/26/83FIL110„CMP.B‚#DATISD,D0 ŠBEQ„FIL300ŠCMP.B‚#DATISK,D0 ŠBEQ„FIL400ŠCMP.B‚#DATSEQ,D0 ŠBEQ„FIL500ŠCMP.B‚#DATCON,D0 ŠBEQ.S‚FIL200(FIL115„LEA„ATEMSG(PC),A0ŠATTRIBUTE�ERRORŠMOVE.L�#ATEMSGL,D0 ŠBSR„SENDMSQC$ŠBNE„FILC55�REPEAT�UPDATE�LOOP�IN�IM<ŠBSR„DELFIL‡DELETE�FILE�OR�SKIP�IT�UNDER�USER�CONTROL�IN�NIM ŠBRA„FIL999ŠPAGE**ˆ**********************ˆCONTIGUOUS�FILE�CHECK*ˆ********************** FIL200„EQU„****ˆCHECK�STARTING�PSN/LENGTH‚OK�FOR�SEGMENT*ŠMOVE.L�DIRFS(A2),D1ŠBEQ.S‚FIL2E10ŒZERO�IS�NOT�OKŠMOVE.L�DIRFE(A2),D2ŠADD.L‚#1,D2ŽLENGTH�IN�SECTORS ŠBSR„MPSNCŠBHI.S‚FIL2E10ŒERRORŠTST.B‚RCVFLG-B(A5)&ŠBNE.S‚FIL205�RECOVERING�DELETED�FILE?"ŠBSR„TSTALC�NO,�SEGMENT�ALLOCATED?ŠBNE„FIL2E30ŒNO,�ERRORŠBRA.S‚FIL210�YES?FIL205„BSR„TSTFREŠCHEKC�SPACE�STILL�FREE�AND�REALLOCATE�IF�FREEŠBNE„FIL2E50ŒERROR3FIL210„BSR„TSTNYA�CHECK�SPACE�NOT�ALREADY�ALLOCATEDŠBNE„FIL2E40ŒERROR**ˆCHECK�RESERVED�SPACE�IS�ZERO*$ŠMOVE.L�A2,D3ŽSAVE�PDB�ENTRY�POINTER&ŠLEA„DIREOF(A2),A2†DIREOF,�DIREOR�=�0? ŠMOVE.L�#8,D1ŠMOVE.L�#'PDE�',RESITM-B(A5) ŠBSR„RSVCHKŠBEQ.S‚FIL220�OK$ŠBMI„FIL999�SKIP�IF�NOT�TO�FIX�FIELD$ŠMOVE.B�#1,PDBFLG-B(A5)„ZEROED�FIELDFIL220„MOVE.L�D3,A2<ŠLEA„DIRLBZ(A2),A2†DIRLBZ,�-LRL,�-RS2,�-KEY,�-FAB,�-DAT�=�0? ŠMOVE.L�#7,D1 ŠBSR„RSVCHKŠBEQ.S‚FIL230�OK$ŠBMI„FIL999�SKIP�IF�NOT�TO�FIX�FIELDŠMOVE.B�#1,PDBFLG-B(A5)„ZEROED'FIL230„MOVE.L�D3,A2ŽRESTORE�PDB�POINTER!ŠMOVE.B�#1,FILOK-B(A5)…FILE�IS�OKŠBRA„FIL999�DONE‚WITH�FILE**ˆER:�DB�START/LENGTH�ERROR* FIL2E10ƒEQU„*#ŠLEA„DBPPSN(PC),A0ŠSET�PSN�INTO�MSG ŠBSR„BIN4HEX!ŠMOVE.L�D2,D1ŽSET�LENGTH�INTO�MSGŠLEA„DBPLEN(PC),A0 ŠBSR„BIN4HEXŠLEA„DBPMSG(PC),A0ŠMOVE.L�#DBPMSGL,D0 ŠBSR„SENDMSQC-ŠBNE„FILC55�IN�IM�GO�ASK�FOR�PDB�ENTRY�UPDATE&ŠBSR„DELFIL�IN�NIM�DELETE�OR�SKIP�FILE ŠBRA„FIL999*"*ˆER:�SEGMENT�NOT�ALLOCATED�IN�SAT*FIL2E30ƒLEA„NALPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L�#NALMSGL,D0ŠMOVE.L�#'�DB�',NALITM-B(A5)'ŠBSR„SENDMSQC‹SEND�DB�NOT�ALLOCATED�MSGŠBEQ.S‚FIL2E36ŒALLOCATE�IN�NIM ŠMOVE.L�D2,D0ŠMOVE.L�#'�DB�',PSNITM-B(A5) ŠBSR„DMPALCŠBEQ.S‚FIL2E37ŒALLOCATE&FIL2E35ƒBSR„DELFIL�DELETE�OR�SKIP�FILE ŠBRA„FIL999'FIL2E36ƒLE A„ALCMSG(PC),A0Š'R:�ALLOCATE'ŠMOVE.L�#'�DB�',ALCITM-B(A5)ŠMOVE.L�#ALCMSGL,D0 ŠBSR„SENDMSG(FIL2E37ƒMOVE.L�SATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B�#1,SATFLG-B(A5)„.�FLAG�SAT�CHANGEDŠMOVE.L�#1,D0Ž. ŠBSR„ALDESC ŠBRA„FIL210*&*ˆER:�SEGMENT�ALREADY�MARKED�ALLOCATED*FIL2E40ƒLEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„ALEMSG(PC),A0ŠMOVE.L�#ALEMSGL,D0ŠMOVE.L�#'�DB�',ALEITM-B(A5) ŠBSR„SENDMSQC'ŠBEQ„FIL2E35ŒDELETE�OR�SKIP�FILE�IF�NIM#ŠBRA„FILC55�GO�TO�UPDATE�LOOP�IN�IM*,*ˆER:�SEGMENT�REALLOCATED�AFTER�FILE�DELETED*#FIL2E50ƒMOVE.L�#'�DB�',FADITM-B(A5)ŠLEA„FADPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„FADMSG(PC),A0ŠMOVE.L�#FADMSGL,D0 ŠBSR„SENDMSQCŠBSR„DELFIL�DELETE�OR�SKIP�FILE ŠBRA„FIL999ŠPAGE*"*ˆ********************************"*ˆDUPLICATE�KEY�INDEXED�FILE�CHECK"*ˆ********************************* FIL300„EQU„***ˆCHECK�DIRECTORY�ENTRY* ŠBSR„CDIRNCŠBEQ.S‚FIL310�OKŠTST.L‚D0‘UPDATE�OR�SKIP/DELETEŠBNE„FILC55�UPDATE�PDB�ENTRY ŠBRA„FIL999�SKIP�OR�DELETED�FILE**ˆCHECK�KEY�SIZE�IS�OK*FIL310„CLR.L‚D0ŠMOVE.B�DIRKEY(A2),D0ŠMOVE.B�D0,KEYLEN-B(A5)„SAVEŠBTSTƒ#0,D0ŽMUST�BE�EVEN�NUMBERŠBNE.S‚FIL3E00ŒERRORŠTST.W‚DIRLRL(A2)‰VRL!ŠBEQ.S‚FIL315�YES,�SKIP�KEY�CHECK9ŠCMP.W‚DIRLRL(A2),D0†CHECK�NOT�GREATER�THAN�RECORD�LENGTHŠBHI.S‚FIL3E00ŒERROR1FIL315„CMP.B‚#100,D0ŒCHECK�NOT�MORE�THAN�MAX�SIZEŠBHI.S‚FIL3E00**ˆCHECK�FABS�AND�DATA�BLOCKS*4FIL320„MOVE.B�#1,KEYDUP-B(A5)„SET�DUPLICATE�KEY�FLAG ŠBSR„FDBCHK ŠBRA„FIL999**ˆER:�KEY�LENGTH* FIL3E00ƒEQU„*ŠMOVE.B�#'D',D1 ŠBSR.S‚HKEYERŠBNE.S‚FIL3E10ŒIMŠBSR„ZROUTŽZERO�KEY�FIELD?ŠBEQ.S‚FIL3E05ŒYESŠBSR„DELFIL�NOŠBRA„FIL999�SKIP‚OR�DELETE�FILE%FIL3E05ƒCLR.B‚DIRKEY(A2)‰ZERO�OUT�KEYŠMOVE.B�#1,PDBFLG-B(A5)ŠBRA„FIL320�CONTINUE*FIL3E10ƒBSR„GETNEW4ŒIN�IM�GET�NEW�KEY�SIZE"ŠCMP.L‚#100,D1ŒCHECK�NOT�TOO�LARGEŠBHI.S‚FIL3E20(ŠMOVE.B�D1,DIRKEY(A2)†SET�NEW�KEY‚LENGTHŠMOVE.B�#1,PDBFLG-B(A5)ŠBRA„FIL310�CHECK�SIZE�AGAINFIL3E20ƒBSR„RESPNAŠBRA„FIL3E10ŒGET�SIZE�AGAINŠPAGE*"*ˆHKEYER�SUBROUTINE�FOR�FILE�CHECK* HKEYER„EQU„**ŠMOVE.B�D1,KEYATR-B(A5)ŠLEA„KEYFLD(PC),A0 ŠMOVE.L�D0,D1 ŠBSR„BIN1HEXŠLEA„KEYMSG(PC),A0ŠMOVE.L�#KEYMSGL,D0 ŠBSR„SENDMSQCŠRTSŠPAGE**ˆ*******************ˆINDEXED�FILE�CHECK*ˆ*******************FIL400**ˆCHECK�DIRECTORY�ENTRY* ŠBSR„CDIRNCŠBEQ.S‚FIL410�OKŠTST.L‚D0‘UPDATE�OR�SKIP/DELETEŠBNE„FILC55�UPDATE�PDB�ENTRY ŠBRA„FIL999�SKIP�OR�DELETED�FILE**ˆCHECK�KEY�SIZE�IS�OK*FIL410„CLR.L‚D0ŠMOVE.B�DIRKEY(A2),D0ŠMOVE.B�D0,KEYLEN-B(A5)„SAVE!ŠBEQ.S‚FIL4E00ŒERROR�IF�ZERO�KEYSŠBTSTƒ#0,D0ŽMUST�BE�EVEN�NUMBERŠBNE.S‚FIL4E00ŒERRORŠTST.W‚DIRLRL(A2)‰VRL!ŠBEQ.S‚FIL415�YES,�SKIP�KEY�CHECK9ŠCMP.W‚DIRLRL(A2),D0†CHECK�NOT�GREATER�THAN�RECORD�LENGTHŠBHI.S‚FIL4E00ŒERROR1FIL415„CMP.B‚#100,D0ŒCHECK�NOT�MORE�THAN�MAX�SIZEŠBHI.S‚FIL4E00**ˆCHECK�FABS�AND�DATA�BLOCKS*4FIL420„CLR.B‚KEYDUP-B(A5)‡SET�NO�DUPLICATE�KEYS�FLAG ŠBSR„FDBCHK ŠBRA.S‚FIL999**ˆER:�KEY�LENGTH* FIL4E00ƒEQU„*ŠMOVE.B�#'I',D1 ŠBSR„HKEYERŠBNE.S‚FIL4E10ŒIM)ŠBSR„DELFIL�NO,�NIM‚-�DELETE�OR�SKIP�FILE ŠBRA.S‚FIL999$FIL4E10ƒBSR„GETNEW4ŒGET�NEW�KEY�SIZE"ŠCMP.L‚#100,D1ŒCHECK�NOT�TOO�LARGEŠBHI.S‚FIL4E20ŠMOVE.B�D1,DIRKEY(A2)ŠMOVE.B�#1,PDBFLG-B(A5) ŠBRA„FIL410�CHECK�KEY�SIZE�AGAINFIL4E20ƒBSR„RESPNA ŠBRA„FIL4E10ŠPAGE**ˆ**********************ˆSEQUENTIAL�FILE�CHECK*ˆ********************** FIL500„EQU„**ˆCHECK�DIRECTORY�ENTRY* ŠBSR„CDIRNCŠBEQ.S‚FIL510�OKŠTST.L‚D0‘UPDATE�OR�SKIP/DELETEŠBNE„FILC55�UPDATE�PDB�ENTRY"ŠBRA.S‚FIL999�SKIP�OR�DELETED�FILE**ˆCHECK�KEY�SIZE�IS�OK*FIL510„MOVE.B�DIRKEY(A2),D0ŠMOVE.B�D0,KEYLEN-B(A5)„SAVE ŠBNE.S‚FIL5E00ŒERROR�IF�NOT�ZERO**ˆCHECK�FABS�AND�DATA�BLOCKS*4FIL520„CLR.B‚KEYDUP-B(A5)‡SET�NO�DUPLICATE�KEYS�FLAG ŠBSR„FDBCHK ŠBRA.S‚FIL999**ˆER:�KEY�LENGTH* FIL5E00ƒEQU„*ŠMOVE.B�#'S',D1 ŠBSR„HKEYERŠBSR„ZROUTŽZERO�KEY�FIELD?ŠBNE.S‚FIL5E10ŒNOŠCLR.B‚DIRKEY(A2)‰YESŠMOVE.B�#1,PDBFL G-B(A5)ŠBRA„FIL520�CONTINUE&FIL5E10ƒBSR„DELFIL�SKIP�OR�DELETE�FILEŠPAGE*@*ˆDONE�FILE�CHECK�-�CHECK�NEXT�FILE�UNLESS�DONE�WITH�FILE�REPAIR* FIL999„EQU„*ŠBTSTƒ#FOUNDF,D7‰FOUND�FILE?7ŠBEQ„FILC40ŒNO,�CONTINUE�CHECKING�FILES�(VOLUME�REPAIR) ŠTST.B‚FILOK-B(A5)ˆYES,�FILE�OK?ŠBEQ„REPDONEŒNO�'REPAIR�DONE'!ŠLEA„FOKMSG(PC),A0ŠYES,�'FILE�OK'ŠMOVE.L�#FOKMSGL,D0 ŠBSR„SENDMSGS ŠBRA„REPDONEŠPAGE*O*******************************************************************************O*********************************************************************************™S�U�B�R�O�U�T�I�N�E�S*O*******************************************************************************O*********************************************************************************‰CLEANUP:’1.00‰12/22/84�RJ*O********************************************************************************=*‰THE�USE�OF�THE�'K'�OPTION�ENVOKES�THIS�SUBROUTINE�DIRECTLY.9*‰THIS�SHOULD�ONLY�BE�DONE�FOR�TESTING�PURPOSES�ONLY,�FORB*‰THE�ASSUMPTION�IS�MADE�THAT�ALL�DIRECTORY�STRUCTURES�ARE�INTACT.3*‰CLEANUP�DELETES�ALL�EMPTY�SDB�AND�PDB�STRUCTURES.5*‰NO�QUESTIONS�ARE�ASKED�DURING�THE�DELETION�PROCESS.*'*‰ON�ENTRY:‚NO�REGISTER�VALUES�REQUIRED*&*‰ON�RETURN:�NO�REGISTERS�ARE�MODIFIED*O*********************************************************************************ŠEMPTY�DATA�STRUCTURE�DELETION*O*******************************************************************************ŠPAGE CLEANUPƒEQU„*-ŠMOVEM.L�D0-D7/A0-A6,-(A7)�Save�all�registersŠLEA„VIDBUF(PC),A1ŠCLR„D1 ŠMOVE.L�#1,D2ŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6ŠMOVE.L�#'VID�',IOERITM-B(A5) ŠBSR„GETSEC�read�VID�into�buffer ŠBNE„ABORTREPŠMOVE.L�TEMP-B(A5),D6 <ŠMOVE.L�VIDBUF+VIDSDS-B(A5),D1‚do�we�have�at�least�one�SDB�?0ŠBEQ„COMPEX�no...�exit,�no�need�to�print�message 3ŠLEA„CLNMSG(PC),A0ŠSend�"STRUCTURE�CLEANUP"�messageŠMOVE.L�#CLNMSGL,D0ˆ...ŠBSR„SENDMSGS‹...  +*ˆALLOCATE�SAT�BUFFER�ACCORDING�TO�SAT�SIZE* ŠCLR.L‚D2%ŠMOVE.W�VIDSAL(A1),D2†SAT�SECTOR�SIZEŠMULUƒD6,D2ŽGET�BYTE�COUNT"ŠMOVE.L�D2,D1Ž.�ALLOCATE�2�BUFFERSŠLSL.L‚#1,D1Ž.ŠMOVE.L�#SATSEG,D0‰SEGMENT�NAMEŠBSR„GETSEG�GET�SEGMENT4ŠMOVE.L�A1,SATABUF-B(A5)ƒSAVE�SAT�STARTING�ADDRESSESŠADD.L‚D2,A1Ž.ŠMOVE.L�A1,SATDBUF-B(A5)ƒ.  *‰READ�SAT�INTO�BUFFER ŠCLR.L‚D2ŠLEA„VIDBUF(PC),A1ŠMOVE.L�VIDBUF+VIDSAT-B(A5),D1ŠMOVE.W�VIDBUF+VIDSAL-B(A5),D2ŠMOVE.L�SATDBUF-B(A5),A1ŠMOVE.L�#'SAT�',IOERITM-B(A5) ŠBSR„GETSEC ŠBNE„ABORTREP ŠPAGE**‰INITIALIZE�DELETION�COUNTERS*;ŠMOVE.L�#0,SDBDEL-B(A5)„initialize�the�deleted�SDBs�counter;ŠMOVE.L�#0,PDBDEL-B(A5)„initialize�the�deleted�PDBs�counter* SDB010„EQU„*=ŠCLR.B‚LSSDBFLG-B(A5)…indicate�the�last�structure�was�the�VID 2ŠLEAƒSDBBUF(PC),A4‹set�the�buffer�pointer�pointing7ŠMOVE.L�A4,USESBUF-B(A5)ƒto�the�first�buffer�to�be�used 8ŠLEA„SDB2BUF(PC),A4‰load�pointer�field�of�buffer�#1�with/ŠMOVE.L�A4,SPTR1-B(A5)…the�address�of�buffer�#2 7ŠLEAƒSDBBUF(PC),A4‹load�pointer�field�of�buffer�#2�with/ŠMOVE.L�A4,SPTR2-B(A5)…the�address�of�buffer�#1 (ŠMOVE.L�VIDSDS+VIDBUF-B(A5),PSNSDB-B(A5)*§get�PSN�of�1st�SDB *‰END�OF�SDB�CHAIN�? SDB020„EQU„*<ŠMOVE.L�PSNSDB-B(A5),D1„are�we�at�the�end�of�the�SDB�chain�?1ŠBEQ„COMPLETE‹yes...�go�do�the�completion�process'*§(make�sure�the�updated�structures�are*§written�back�to�disk.) ŠPAGE*‰READ�NEXT�SDB�INTO�BUFFER ŠCLR.L‚D4*ŠMOVE.L�USESBUF-B(A5),A1ƒbuffer�to�be�usedŠMOVE.L�#SDBSZE,D2ŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6ŠMOVE.L�#'SDB�',IOERITM-B(A5)ŠBSR„GETSEC�Read�in�SDB./ŠBNE„ABORTREP‹Read�error�causes�repair�to�quit.ŠMOVE.L�TEMP-B(A5),D6  *ˆSAVE�PSN�OF�NEXT�SDB SDB025„EQU„*ŠMOVE.L�USESBUF-B(A5),A0ŠMOVE.L�SDBFPT(A0),NXTSDB-B(A5)  *‰INITIALIZE‚SDE�COUNTERS #ŠCLR.L‚D4‘D4�=�number�of�empty�SDEs5ŠMOVE.L�#SDBENT,D5‰number�of�entries�to�check�per�SDB  (*‰ARE�WE�AT�THE�END�OF�THE�PRESENT�SDB�? SDB030„EQU„*#ŠTST.L‚D5‘at�the�end�of�the� SDB�yetŠBNE„SDB040�no...go�check�SDEs  *‰EMPTY�SDB�? (ŠCMP.L‚#SDBENT,D4‰are�all�the�SDEs�emptyŠBNE.S‚SDBNEMTŒno...EŠMOVE.B�LSSDBFLG-B(A5),D0‚have�we�read�a�non-empty�SDB�prior�to�this?ŠBNE„LSTNVIDŒyes..ŠMOVE.L�USESBUF-B(A5),A0&ŠMOVE.L�SDBFPT(A0),VIDBUF+VIDSDS-B(A5)*£update�the�VID�with�the�PSN*£of�the�next�SDB�in�the�list *‰DE-ALLOCATE�CURRENT�SDB ;ŠMOVE.L�PSNSDB-B(A5),D1„psn�of�structure�to�be�de-allocated7ŠMOVE.L�#SDBSZE,D2‰size�of�structure�to�be�de-allocated'ŠBSR„DEALLC�go�de-alocate�the�structure/ŠMOVE.B�#1,SATFLG-B(A5)„flag�the�SAT�as�updated/ŠMOVE.B�#1,VIDFLG-B(A5)„flag�the�VID�as�updated0*‰CLR.B•clear�"present�SDBs�buffer�updated"�flag-ŠADD.L�#1,SDBDEL-B(A5)…number�of�SDBs�deleted ŠBRA„SDB010 ŠPAGE*‰SDB�IS�NOT�EMPTY SDBNEMTƒEQU„*CŠMOVE.B�CRSDBFLG-B(A5),D0‚is�the�current�buffer�flaged�as�changed�?0ŠBEQ.S‚CRNOCHGŒno..go�see�about�the�other�buffer "*‰WRITE�THE�CURRENT�BUFFER�TO�DISK /ŠMOVE.L�PSNSDB-B(A5),D1„Sector�to�be�written�to,ŠMOVE.L�#SDBSZE,D2‰number�of�blocks�to�writeŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6‹block�size;ŠMOVE.L�USESBUF-B(A5),A1ƒdata�to�be�written�is�located�hereŠBSR„WRITSECŒgo�do�the�write0ŠBNE„ABORTREP‹write�error�causes�repair�to�quit.ŠMOVE.L�TEMP-B(A5),D69ŠCLR.B‚CRSDBFLG-B(A5)…reset�"current�buffer�updated"�flag FCRNOCHGƒMOVE.B�SUPFLG-B(A5),D0„is�the�other�buffer�flaged�as�changed�?,ŠBEQ.S‚SDBNEMT5‹no..go�switch�buffer�pointer  $*‰WRITE�THE�ALTERNATE�BUFFER�TO�DISK ŠMOVE.L�PRVSDB-B(A5),D1ŠMOVE.L�#SDBSZE,D2ŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6ŠMOVE.L�USESBUF-B(A5),A0ŠMOVE.L�-4(A0),A1 ŠBSR„WRITSEC0ŠBNE„ABORTREP‹write�error�causes�repair�to�quit.ŠMOVE.L�TEMP-B(A5),D65ŠCLR.B‚SUPFLG-B(A5)‡reset�"other�buffer�updated"�flag SDBNEMT5‚EQU„*!ŠMOVE.L�PSNSDB-B(A5),PRVSDB-B(A5)!ŠMOVE.L�NXTSDB-B(A5),PSNSDB-B(A5)&*¥store�the�PSN�for�the�present�SDB�as&*¥the�last�SDB�PSN,�then�store�the�PSN$*¥of�the�next�SDB�as�the�present�SDBŠMOVE.L�USESBUF-B(A5),A0ŠMOVE.L�-4(A0),USESBUF-B(A5)(*¥now�lets�point�to�the�next�buffer.�The)*¥idea�is�to�flip�between�the�two�buffers*¥used�for�storage.AŠMOVE.B‚#1,LSSDBFLG-B(A5)�since�the�SDB�just�read�was�not�empty..+ŠBRA„SDB020�subsequent�empties�will�require!*§a�forward�pointer�update�in�the*§previous�SDB�and�not�the�VID.ŠPAGELSTNVID:‚EQU„*2*‰We�enter�through�here�for�empty�SDBs�found�after+*‰we�have�found�at�least�one�non-empty�SDB.**‰The�empty�is�deleted�and�the�PSN�for�the4*‰next�SDB�is�written�to�the�previous�SDB�located�in>*‰the�'alternate'�buffer.�This�buffer�is�then�written�to�disk. :ŠMOVE.L�PRVSDB-B(A5),D1„PSN�to�which�the�buffer�is�written6ŠMOVE.L�#SDBSZE,D2‰Size�of�the�structure�in�the�bufferŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6‹Block�sizeŠMOVE.L�USESBUF-B(A5),A05ŠMOVE.L�-4(A0),A1ŠGet�the�pointer�to�the�other�buffer<ŠMOVE.L�NXTSDB-B(A5),SDBFPT(A1)‚Update�the�previous�SDB�with!*§new�forward�pointer�to�next�SDB"*§This�value�may�be�zero�for�null."ŠBSR„WRITSECŒNow�write�SDB�to�disk0ŠBNE„ABORTREP‹Write�error�causes�repair�to�quit.ŠMOVE.L�TEMP-B(A5),D65ŠCLR.B‚SUPFLG-B(A5)‡Reset�"other�buffer�updated"�flag  3ŠMOVE.L�PSNSDB-B(A5),D1„De-allocate�the�current�SDBŠMOVE.L�#SDBSZE,D2 ŠBSR„DEALLC EŠMOVE.L�NXTSDB-B(A5),PSNSDB-B(A5)�Set�the�next�SDB�as�the�new�present;ŠADD.L‚#1,SDBDEL-B(A5)„Increment�the�number�of�SDBs�deleted(ŠBRA„SDB020�Go�see�if�any�SDBs�remaining  %*‰This�area�is�entered�for�every�SDB. SDB040„EQU„*****†GET�START�OF�THE�FIRST�SDE*ŠMOVE.L�USESBUF-B(A5),A0ŠLEA.L‚SDBSTR(A0),A0 2SDB045„MOVE.L�A0,A3Žsave�pointer�to�1st/next�entry*¨to�be�used�in�the�PDB�areaŠTST.L‚D5‘any�more�SDEs�leftŠBEQ„SDB030�no... 'ŠMOVE.L�SDBPDP(A0),D0†is�this�SDE�empty ŠBNE.S‚SDB050�no...�go�make�sure &ŠADD.L‚#1,D4Žincrement�empty�SDE�count1ŠADD.L‚#SDBLEN,A0‰increment�pointer�to�next�entry&ŠSUB.L‚#1,D5Ždecrement�total�SDE�count ŠBRA„SDB045 ŠPAGE SDB050„EQU„* O**////////////////////////////////////////////////////// ///////////////////////**/›P�D�BƒA�R�E�AO**/////////////////////////////////////////////////////////////////////////////* PDB010„EQU„*=ŠCLR.B‚LSPDBFLG-B(A5)…indicate�the�last�structure�was�not�PDB*§but�was�a�SDB úB WDY"\*=2P:IBOJKRIZMbGjMrFzG‚MŠJ’CšG¢TªT²SºLÂLÊKÒOÚOâZêN2ŠLEA„PDBBUF(PC),A4Šset�the�buffer�pointer�pointing7ŠMOVE.L�A4,USEPBUF-B(A5)ƒto�the�first�buffer�to�be�used 8ŠLEA„PDB2BUF(PC),A4‰load�pointer�field�of�buffer�#1�with/ŠMOVE.L�A4,PPTR1-B(A5)…the�address�of�buffer�#2 6ŠLEA„PDBBUF(PC),A4Šload�pointer�field�of�buffer�#2�wit/ŠMOVE.L�A4,PPTR2-B(A5)…the�address�of�buffer�#1 .ŠMOVE.L�SDBPDP(A3),PSNPDB-B(A5)ƒPSN�of�1st�PDB  *‰END�OF�PDB�CHAIN�? PDB020„EQU„*<ŠMOVE.L�PSNPDB-B(A5),D1„are�we�at�the�end�of�the�PDB�chain�?-ŠBEQ„OUTT�yes...�go�do�the�completion�process  !*‰READ�FIRST/NEXT�PDB�INTO�BUFFER <ŠMOVE.L�USEPBUF-B(A5),A1ƒ*note�D1�=�PSN�of�1st�sector�in�PDBŠMOVE.L�#PDBSZE,D2ŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6ŠMOVE.L�#'PDB�',IOERITM-B(A5)ŠBSR„GETSEC�Read�in�PDB./ŠBNE„ABORTREP‹Read�error�causes�repair�to�quit.ŠMOVE.L�TEMP-B(A5),D6  *‰SAVE�PSN�OF�NEXT�PDB ŠMOVE.L�USEPBUF-B(A5),A1ŠMOVE.L�PDBFPT(A1),NXTPDB-B(A5) ŠPAGE*‰INITIALIZE‚PDE�COUNTERS #ŠCLR.L‚D6‘D6�=�number�of�empty�PDEs8ŠMOVE.L�#PDBENT,D7‰D7�=�number�of�entries�to�check�empty  *‰END�OF�THE�CURRENT�PDB�? PDB030„EQU„*#ŠTST.L‚D7‘at�the�end�of�the�PDB�yetŠBNE„PDB040�no...go�check�PDEs  *‰EMPTY‚PDB�? (ŠCMP.L‚#PDBENT,D6‰are�all�the�PDEs�emptyŠBNE.S‚PDBNEMTŒno..  *‰LAST�STRUCTURE�A�PDB�? 9ŠMOVE.B�LSPDBFLG-B(A5),D0‚was�the�last�structure�an�PDB�?ŠBNE.S‚LSTNSDBŒyes.   >ŠMOVE.L�NXTPDB-B(A5),SDBPDP(A3)‚update�the�SDB�with�the�PSN�of*§the�next�PDB�in�the�list&*§This�creats�a�new�"1st�PDB"�in�chain**‰DEALLOCATE�CURRENT�PDB ŠMOVE.L�PSNPDB-B(A5),D1ŠMOVE.L�#PDBSZE,D2'ŠBSR„DEALLC�de_allocate�the�present�PDB /ŠMOVE.B�#1,SATFLG-B(A5)„flag�the�SAT�as�updated 1ŠMOVE.B�#1,CRSDBFLG-B(A5)‚flag�the�SDB�as�updated 0*‰CLR.B•clear�"present�PDBs�buffer�updated"�flag -ŠADD.L�#1,PDBDEL-B(A5)…number�of�PDBs�deleted ŠBRA„PDB010 ŠPAGE*‰PDB�IS�NOT�EMPTY PDBNEMTƒEQU„*?ŠMOVE.B�PUPFLG-B(A5),D0„is�the�other�buffer�flaged�as�changed�?,ŠBEQ.S‚PDBNEMT5‹no..go�switch�buffer�pointer  *‰WRITE�OTHER�BUFFER�TO�DISK ŠMOVE.L�PRVPDB-B(A5),D1ŠMOVE.L�#PDBSZE,D2ŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6ŠMOVE.L�USEPBUF-B(A5),A1ŠMOVE.L�-4(A1),A1 ŠBSR„WRITSEC0ŠBNE„ABORTREP‹write�error�causes�repair�to�quit.ŠMOVE.L�TEMP-B(A5),D65ŠCLR.B‚PUPFLG-B(A5)‡reset�"other�buffer�updated"�flag PDBNEMT5‚EQU„*!ŠMOVE.L�PSNPDB-B(A5),PRVPDB-B(A5)!ŠMOVE.L�NXTPDB-B(A5),PSNPDB-B(A5)&*¥store�the�PSN�for�the�present�PDB�as&*¥the�last�PDB�PSN,�then�store�the�PSN$*¥of�the�next�PDB�as�the�present�PDB*ŠMOVE.L�USEPBUF-B(A5),A1ŠMOVE.L�-4(A1),USEPBUF-B(A5)(*¥now�lets�point�to�the�next�buffer.�The)*¥idea�is�to�flip�between�the�two�buffers*¥used�for�storage. AŠMOVE.B‚#1,LSPDBFLG-B(A5)�since�the�PDB�just�read�was�not�empty..+ŠBRA„PDB020�subsequent�empties�will�require!*§a�forward�pointer�update�in�the*§previous�PDB�and�not�the�SDB.%*§This�flag�being�set�indicates�such. ŠPAGELSTNSDB:‚EQU„*2*‰we�enter�through�here�for�empty�PDBs�found�after+*‰we�have�found�at�least�one�non-empty�PDB.**‰The�empty�is�deleted�and�the�PSN�for�the+*‰next�PDB�is�written�to�the�last�PDB�read.  :ŠMOVE.L�PRVPDB-B(A5),D1„PSN�to�which�the�buffer�is�written6ŠMOVE.L�#PDBSZE,D2‰Size�of�the�structure�in�the�bufferŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6‹Block�sizeŠMOVE.L�USEPBUF-B(A5),A15ŠMOVE.L�-4(A1),A1ŠGet�the�pointer�to�the�other�buffer<ŠMOVE.L�NXTPDB-B(A5),PDBFPT(A1)‚Update�the�previous�PDB�with!*§new�forward�pointer�to �next�PDB"*§This�value�may�be�zero�for�null."ŠBSR„WRITSECŒNow�write�PDB�to�disk0ŠBNE„ABORTREP‹Write�error�causes�repair�to�quit.ŠMOVE.L�TEMP-B(A5),D65ŠCLR.B‚PUPFLG-B(A5)‡Reset�"other�buffer�updated"�flag  3ŠMOVE.L�PSNPDB-B(A5),D1„De-allocate�the�current�PDBŠMOVE.L�#PDBSZE,D2 ŠBSR„DEALLC DŠMOVE.L�NXTPDB-B(A5),PSNPDB-B(A5)�Lets�store�the�PSN�of�the�next�PDB;ŠADD.L‚#1,PDBDEL-B(A5)„Increment�the�number�of�PDBs�deleted(ŠBRA„PDB020�Go�see�if�any�PDBs�remaining   "*‰This�area�entered�for�every�PDB. PDB040„EQU„*5ŠMOVE.L�USEPBUF-B(A5),A1ƒget�the�start�of�the�1st�PDEŠLEA.L‚PDBSTR(A1),A1 *‰ANY�MORE�PDEs PDB045„EQU„*ŠTST.L‚D7‘any�more�PDEs�leftŠBEQ„PDB030�no... #ŠTST.B‚DIRFIL(A1)‰is�this�PDE�empty)ŠBNE.S‚PDB050�no...�go�go�get�another�one &ŠADD.L‚#1,D6Žincrement�empty�PDE�count PDB050„EQU„*&ŠSUB.L‚#1,D7Ždecrement�total�PDE�count 1ŠADD.L‚#DIRLEN,A1‰increment�pointer�to�next�entry ŠBRA„PDB045 ŠPAGEO**\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ OUTT†EQU„*,ŠTST.B‚LSPDBFLG-B(A5)…last�structure�a�PDB�?ŠBNE.S‚OUTT2Žyes..,ŠADD.L‚#1,D4Žno...�increment�empty�SDE�count OUTT2…EQU„*&ŠSUB.L‚#1,D5Ždecrement�total�SDE�count*ŠADD.L‚#SDBLEN,A0‰point�to�next�SDE�in�SDB$ŠBRA„SDB045�go�check�if�SDE�is�empty COMPLETE‚EQU„*!ŠTST.B‚VIDFLG-B(A5)‡VID�updated�?ŠBEQ.S‚COMP0Žno..*ŠBSR„UPCKSM�yes..�recalculate�the�checksumŠLEA„VIDBUF(PC),A1 ŠCLR.L‚D1 ŠMOVE.L�#1,D2ŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6ŠMOVE.L�#'VID�',IOERITM-B(A5) ŠBSR„WRITSECŠMOVE.L�TEMP-B(A5),D6 &COMP0…TST.B‚SATFLG-B(A5)‡SAT�updated�?ŠBEQ.S‚COMP5Žno...$ŠMOVE.L�VIDBUF+VIDSAT-B(A5),D1ƒyes.. ŠCLR.L‚D2ŠMOVE.W�VIDBUF+VIDSAL-B(A5),D2ŠMOVE.L�D6,TEMP-B(A5)ŠMOVE.L�#$100,D6 ŠMOVE.L�SATDBUF-B(A5),A1„old�SATŠMOVE.L�#'SAT�',IOERITM-B(A5) ŠBSR„WRITSECŠMOVE.L�TEMP-B(A5),D6 3COMP5…MOVE.L�#SATSEG,D0‰de-allocate�the�SAT�segment ŠBSR„DELSEG  *‰RESET�MISC.�FLAGS,ŠCLR.B‚VIDFLG-B(A5)‡reset�'VID�updated'�flag,ŠCLR.B‚SATFLG-B(A5)‡reset�'SAT�updated'�flag   ŠPAGE $*‰DISPLAY�THE�NUMBER�OF�SDBs�DELETED ŠMOVE.L�SDBDEL-B(A5),D07ŠMOVE.L�D0,TEMP-B(A5)†save�SDB�deleted�for�use�in�total ŠBSR„BDCONV�convert�to�HEX�ASCII&ŠBSR„STUFBLNK‹replace�zeros�with�ASCIIŠMOVE.L�D0,SDBDMSGN-B(A5)ŠLEA„SDBDMSGN(PC),A0ŠMOVE.L�#SDBDMSGL,D0 ŠBSR„SENDMSG  $*‰DISPLAY�THE�NUMBER�OF�PDBs�DELETED ŠMOVE.L�PDBDEL-B(A5),D0 ŠMOVE.L�#4,D1 ŠMULUƒD1,D0ŠADD.L‚D0,TEMP-B(A5)ŠMOVE.L�PDBDEL-B(A5),D0 ŠBSR„BDCONV&ŠBSR„STUFBLNK‹replace�zeros�with�ASCIIŠMOVE.L�D0,PDBDMSGN-B(A5)ŠLEA„PDBDMSGN(PC),A0ŠMOVE.L�#PDBDMSGL,D0 ŠBSR„SENDMSG  )*‰DISPLAY�TOTAL�NUMBER�OF�SECTORS�DELETED ŠMOVE.L�TEMP-B(A5),D0 ŠBSR„BDCONV(ŠBSR.S‚STUFBLNK‹replace�zeros�with�ASCIIŠMOVE.L�D0,TOTDMSGN-B(A5)ŠLEA„TOTDMSGN(PC),A0ŠMOVE.L�#TOTDMSGL,D0 ŠBSR„SENDMSG 3COMPEX„MOVEM.L�(A7)+,D0-D7/A0-A6‡Save�all�registersŠRTSŠPAGE 3****************************************************�UPCKSM:�1.00…12/06/84‚RJ+*‰RECALCULATE�THE�CHECKSUM�VALUE�IN�THE�VID*"*‰ON�RETURN:�NO�REGISTERS�MODIFIED* UPCKSM„EQU„*0ŠMOVEM.L�D0-D7/A0-A6,-(A7)�restore�all�registersŠLEA„VIDBUF(PC),A1UPCK510ƒMOVE.L�A1,A0ŠLEA„256(A1),A2ŠMOVE.L�#-1,D0UPCK520ƒMOVE.B�(A0)+,D1 ŠEOR.B‚D1,D0ŠSWAPƒD0ŠMOVE.B�(A0)+,D1 ŠEOR.B‚D1,D0ŠSWAPƒD0 ŠCMP.L‚A2,A0 ŠBLS„UPCK520 ŠTST.B‚D0ŠBNE.S‚UPCK540ŒERRORŠSWAPƒD0 ŠTST.B‚D0ŠBEQ.S‚UPCKOUTŒOK)UPCK540ƒLEA„CHSMSG(PC),A0ŠCHECK�SUM�ERROR ŠMOVE.L�D0,D1ŠMOVE.L�#CHSMSGL,D0*‰BSR„SENDMSQC *‰BSR„REPAIR*‰BNE„TRMREP�FIX?ŠCLR.W‚VIDCHK(A1) ŠMOVE.L�A1,A0ŠMOVE.L�#-1,D0UPCK545ƒMOVE.B�(A0)+,D1 ŠEOR.B‚D1,D0ŠSWAPƒD0ŠMOVE.B�(A0)+,D1 ŠEOR.B‚D1,D0ŠSWAPƒD0 ŠCMP.L‚A2,A0 ŠBLS„UPCK545ŠMOVE.B�D0,VIDCHK(A1)†UPDATEŠSWAPƒD0ŠMOVE.B�D0,VIDCHK+1(A1)ŠMOVE.B�#1,VIDFLG-B(A5) UPCKOUTƒEQU„*0ŠMOVEM.L�(A7)+,D0-D7/A0-A6‡restore�all�registersŠRTSŠPAGE;************************************************************�STUFBLNK:�1.00ƒ12/06/8 4‚RJ1*‰REPLACE�ALL�ZERO'S�FOUND�IN�D0�WITH�ASCII‚($30)**‰ON�RETURN:�D0�MODIFIED<************************************************************STUFBLNK‚EQU„*ŠMOVEM.L�D1-D7/A0-A6,-(A7).ŠMOVE.L�#3,D1Žnumber�of�bytes�to�be�checked�-1STUF10„CMP.B‚#0,D0 ŠBNE.S‚SHIFT,ŠMOVE.B�#$30,D0Œreplace�zero�with�ASCII�zeroSHIFT…ROL.L‚#8,D0ŠDBRAƒD1,STUF10ŠMOVEM.L�(A7)+,D1-D7/A0-A6ŠRTSŠPAGE*<>M******************************************************************************�GETHELP:�1.0…12/07/84‚rj ,*‰PRINTS�MESSAGES�TO�SCREEN�IN�FORMATED�MODEC*‰AT�THE�END�OF�A�FULL�SCREEN,�THE�USER�IS�ASKED�IF�MORE�IS�NEEDED.C*‰IF�"Y"�MORE�IS�PRINTED.�IF�"N"�OR�,�NO�MORE�LINES�ARE�PRINTED*2*ˆON�ENTRY�:�A1�=�POINTS�TO�START�OF�HELP�MESSAGES5*“D2�=�CONTAINS�THE�TOTAL�LENGTH�OF�THE�HELP�MESSAGES*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED**!GETHELPƒMOVEM.L�D0-D7/A0-A6,-(A7)@ŠMOVE.B�#1,FIRSFLG-B(A5)ƒinitialize�the�first�char.�in�line�flag-ŠCLR.L‚D0‘initialize�the�line�character�count#ŠCLR.L‚D5‘initialize�the�line�count"ŠCLR.L‚D6‘used�for�zero�comparison **‰SUB.L‚#1,D2ŽHELPMSGL-1�(because�of�DBRA)1YES‡CMP.L‚#0,D2Žare�we�at�the�end�of�the�messages5ŠBEQ.S‚CKOUTŽyes...decide�to�print�a�line�or�drop�outCHECK…MOVE.B�(A1)+,D3 ŠCMP.B‚#0,D3ŠBNE.S‚CRCHECK0ŠDBRAƒD2,CHECK‹account�for�the�zero�in�the�totalCRCHECKƒCMP.B‚#CR,D3�CR�?ŠBNE.S‚CKLFEEDŒno...ŠBRA.S‚ITSACRLF‹yes..CKLFEEDƒCMP.B‚#LF,D3�LF�?ŠBNE.S‚NOTCRLFŒno.. ITSACRLF‚CMP.L‚#1,D0Žch�cnt�=1‚?!ŠBEQ.S‚SNDLFŽyes..send�a�linefeed!ŠBSR.S‚SNDLINEŒno...send�the�line ŠBRA.S‚CONTIN"SNDLF…BSR„LINEFD�print�a�line�feed5*‰ADD.L‚#1,A1Žpoint�to�the�next�character�in�the�line ;CONTIN„MOVE.L�#1,D0Žassume�that�the�next�char�is�a�CR�or�LF%ŠADD.L‚#1,D5Žincrement�the�line�count=ŠMOVE.B�#1,FIRSFLG-B(A5)ƒassume�next�char.�is�1st�in�the�line )ŠCMP.B‚#22,D5�printed�a�screen�full�yet�?(ŠBGE.S‚REQCRŽyes..ask�for�CR�to�continue1ŠDBRAƒD2,YES�dec.�total�character�count,�get�more #REQCR…CLR.L‚D5‘reset�the�line�count'ŠBSR.S‚ASKMOREŒadditional�HELP�needed�?ŠBNE.S‚OUT�no...�exit&ŠDBRAƒD2,YES�yes..�get�more�characters CNOTCRLFƒTST.B‚FIRSFLG-B(A5)†is�this�the�1st�character�in�the�line�?ŠBEQ.S‚NOTFST�no...1ŠSUB.L‚#1,A1Žyes..backup�and�point�directly�to�itAŠMOVE.L�A1,LINESTRT-B(A5)‚start�of�the�current�line�to�be�printed5ŠCLR.B‚FIRSFLG-B(A5)†indicate�start�of�the�line�found ŠCLR.LƒD00NOTFST„ADD.L‚#1,D0Žincrement�the�character�count#ŠDBRAƒD2,YES�go�get�more�characters  KSNDLINEƒMOVEM.L�D1-D7/A1-A6,-(A7)�yes..print�the�current�line�(D0�=�length)AŠMOVE.L�LINESTRT-B(A5),A0‚get�the�start�of�the�line�to�be�printed%ŠBSR„SENDMSGŒprint�the�available�lineŠMOVEM.L�(A7)+,D1-D7/A1-A6ŠRTS  %*‰SEND�A�LINE�TO�DEFAULT�LOGICAL�UNIT CKOUT…CMP.L‚#1,D0Žchr�cnt�=>1ŠBGE.S‚SNDLAST ŠBRA.S‚OUTHSNDLASTƒMOVE.L�LINESTRT-B(A5),A0‚get�the�start�of�the�line�to�be�printed ŠBSR„SENDMSGŠTST.B‚ASKCTFLG-B(A5) ŠBEQ.S‚OUTŠBSR.S‚CONTINUEOUT‡MOVEM.L�(A7)+,D0-D7/A0-A6ŠRTS ŠPAGE!**********************************�ASKMORE:�1.0ƒ12/07/84�rj* ASKMOREƒDS…0ŠMOVEM.L�D0-D7/A0-A6,-(A7)3ŠLEA„MOREMSG(PC),A0‰Ask�'Interested�in�more�HELP'‚?ŠMOVE.L�#MOREMSGL,D0 ŠBSR„SENDMSG ŠBSR„GETRYNŠMOVEM.L�(A7)+,D0-D7/A0-A6ŠRTSO********************************************************************************�CONTINUE:ˆ1.0‚12/07/84‚RJ.*ŠUSED�TO�STOP�AT�THE�END�OF�THE�HELP�MESSAGES0*ŠTHEN�WAITS�FOR�RESPONSE;�ANY�RESPONSE�WILL�DO.*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED*CONTINUE‚EQU„*4ŠLEA„TNUEMSG(PC),A0‰'Type�any�character�to�continue'.ŠMOVE.L�#TNUEMSGL,D0‡Provide�length�of�messageŠBSR„SENDMSGŒSend�messageŠMOVE.L�A0,-(A7)!ŠIOSCALL�INPIOS(PC)ˆREAD�RESPONSE ŠBNE„IOERR(*‰BSR„HRDCPY�SEND�HARD�COPY�IF�NECESSARYŠMOVE.L�(A7)+,A0ŠRTS*><ŠPAGEO**********************************************************************************ˆPFILNM�1.00�7/31/80�HBN6*O********************************************************************************7*ˆPFIL NM�PRINTS�FULLY�QUALIFIED�FILE�NAME�TO�LOG�DEVICE***ˆON�ENTRY:�A2�=�CURRENT�PDB�ENTRY�POINTER* PFILNM„EQU„*ŠMOVEM.L�D0/D1/A0/A1,-(A7) ŠMOVE.L�#8,D1!ŠLEA„FFILEN(PC),A1ŠMOVE�FILE�NAMEŠLEA„DIRFIL(A2),A0*ŠMOVE.B�(A0),D0ŒLET�FILE�START�WITH�&�OR�@ŠCMP.B‚#'@',D0 ŠBEQ.S‚PFIL05ŠCMP.B‚#'&',D0 ŠBEQ.S‚PFIL057PFIL00„MOVE.B�(A0)+,D0‹PUT�OUT�A�SPACE‚IF�BAD�CHARACTER ŠBSR„ALFNUM ŠBEQ.S‚PFIL05ŠMOVE.B�#'�',(A1)+ ŠBRA.S‚PFIL10PFIL05„MOVE.B�D0,(A1)+PFIL10„SUB.L‚#1,D1 ŠBNE„PFIL00ŠMOVE.B�DIREXT(A2),D0†EXTENSIONŠMOVE.B�D0,FEXTEN-B(A5)ŠBSR„ALFNUM�CHECK�CHARACTER�OKŠBEQ.S‚PFIL15�OKŠMOVE.B�#'�',FEXTEN+1-B(A5)PFIL15„MOVE.B�DIREXT+1(A2),D0ŠMOVE.B�D0,FEXTEN+1-B(A5) ŠBSR„ALFNUM ŠBEQ.S‚PFIL20ŠMOVE.B�#'�',FEXTEN+1-B(A5)PFIL20„LEA„FFFMSG(PC),A0ŠMOVE.L�#FFFMSGL,D0 ŠBSR„SENDMSGSŠMOVEM.L�(A7)+,D0-D1/A0-A1ŠRTSŠPAGE*O********************************************************************************)*ˆFMATCH/UMATCH/CMATCH/‚1.07�9/01/81�TB59*O********************************************************************************@*ˆFMATCH�CHECKS�IF�CURRENT�FILE�NAME�MATCHES�SPECIFIED�FILE�NAMED*ˆUMATCH�CHECKS�IF�CURRENT�USER�NUMBER�MATCHES�SPECIFIED�USER�NUMBERF*ˆCMATCH�CHECKS�IF�CURRENT�CATALOG�NAME�MATCHES�SPECIFIED�CATALOG�NAME*,*ˆON�ENTRY�TO�FMATCH:�A2�=�CURRENT�PDB�ENTRY*!*ˆON�RETURN:�Z�=�1�IF�MATCH�FOUND*—0�IF�DIFFERENT�NAMES** FMATCH„EQU„*ŠMOVEM.L�D0-D1/A0-A1,-(A7)6ŠMOVE.L�#10,D1�CHECK�FILE�NAME�AND�EXTENSION�FOR�MATCH&ŠLEA„DIRFIL(A2),A0†CURRENT�FILE'S�NAME$ŠLEA„FILNAM(PC),A1ŠFILE�NAME�TO�FINDŠBTSTƒ#ROPTION,D7ˆRECOVER?ŠBEQ.S‚FMATC00ŒNO,ŠTST.B‚DIRFIL(A2)‰YES,�CURRENT�FILE�DELETED?,ŠBEQ.S‚FMATC10ŒYES,�SKIP�CHECK�OF�FIRST�BYTEFMATC00ƒMOVE.B�(A0)+,D0ŠCMP.B‚(A1)+,D0ŠBNE.S‚FMATCRTŒNO�MATCH"FMATC05ƒSUB.L‚#1,D1ŽNEXT�CHARACTER ŠBNE„FMATC00!FMATCRTƒMOVEM.L�(A7)+,D0-D1/A0-A1ŠRTS#FMATC10ƒTST.B‚(A0)+ŽSKIP�FIRST�BYTE ŠTST.B‚(A1)+ ŠBRA„FMATC05** USER NUMBER CHECK ENTRY POINT UMATCH„MOVEM.L�D0-D1/A0-A1,-(A7)ŠLEA„USRNUM-B(A5),A0ŠLEA„FUSERN-B(A5),A1+ŠMOVE.L�#4,D1ŽNUMBER�OF�CHARACTERS�TO�CHECK ŠBRA„FMATC00* *ˆCATALOG�NAME�CHECK�ENTRY�POINT CMATCH„EQU„*ŠMOVEM.L�D0-D1/A0-A1,-(A7)ŠLEA„CATNAM(PC),A0ŠLEA„FCATAL(PC),A1!ŠMOVE.L�#8,D1ŽCATALOG�NAME�LENGTH(ŠBRA„FMATC00ŒCHECK�IF�CATALOG�NAMES�SAMEŠPAGEO*********************************************************************************ˆDELFIL:1.00�7/31/80�HBN6*O********************************************************************************-*ˆDELFIL�ASKS�USER�IF�HE�WANTS�TO�DELETE�FILE*3*ˆON�ENTRY:�A2�=�ADDRESS�OF�CURRENT�DIRECTORY�ENTRY*;*ˆON�RETURN:�Z�=�1�IF�DELETED�FILE�(1ST�BYTE�OF�FILENAME�0)*“Z�-�0�IF�FILE�TO�BE�SKIPPED* DELFIL„EQU„*ŠMOVEM.L�A0/D0,-(A7)ŠLEA„DELMSG(PC),A0ŠMOVE.L�#DELMSGL,D0ŠMOVE.L�#'FILE',DELITM-B(A5) ŠBSR„SENDMSG ŠBSR„REPAIR ŠBNE.S‚DELF00ŠCLR.B‚DIRFIL(A2)<ŠMOVE.B�#1,PDBFLG-B(A5)„FLAG�PDB�CHANGED�AND�MUST�BE�UPDATEDDELF00„MOVEM.L�(A7)+,D0/A0ŠRTSŠPAGE*O*********************************************************************************ˆMPSNC�1.00�6/25/80�HBN6*O********************************************************************************>*ˆMPSNC�CHECKS�THAT�ALL�PSN�IN�A�GIVEN�SEGMENT�ARE�ON�THE�DISK*'*ˆON�ENTRY:�D1�=�FIRST�PSN�IN�THE�BLOCK%*’D2�=�NUMBER�OF�SECTORS�IN�THE�BLOCK*+*ˆON�RETURN:�C�=�0�AND�Z�=�0�IF�ERROR�(BHI)*“D0�-�CHANGED* MPSNC…EQU„**%*ˆCHECK�1ST�PSN�NOT�GREATER�THAN�MPSN*ŠMOVE.L�MPSN-B(A5),D0†GET�MPSN ŠCMP.L‚D0,D1ŽGIVEN�PSN�TOO�HIGH?ŠBHI.S‚MPSNRŽYES,�ERROR*4*ˆCHECK�LAST�SECTOR�IN�THE�BLOCK�IS�NOT�OFF�THE�DISK*ŠCMP.L‚D0,D2ŽTOO�MANY�SECTORS?ŠBHI.S‚MPSNRŽYES+ŠSUB.L‚D2,D0ŽCHECK�LAST�SECTOR�ON�DISK�ALSOŠADD.L‚#1,D0Ž.#ŠCMP.L‚D0,D1ŽSETS�RETURN�CONDITIONS MPSNR…RTSŠPAGE*O*********************************************************************************ˆDUMP:1.00�7/9/80�HBN6*O********************************************************************************-*ˆDUMP�DUMPS�SEVERAL�SECTO RS�TO�OUTPUT�DEVICE*B*ˆON�ENTRY:�D1�=�1ST�PSN�TO�DUMP�(MAY�NOT�BE�1ST�SECTOR�IN�BUFFER)-*’D2�=�NUMBER�OF�SECTORS�TO�DUMP�(BIT�31�SET)*’A1�=�BUFFER�START+*’D3�=�PSN�OF�SECTOR�IN�BUFFER‚(D3�.LE.�D1)* DUMP†EQU„*ŠMOVEM.L�D0-D4/A0-A1,-(A7)ŠBSR„TOF�FORCE�FORM�FEED ŠMOVE.L�D1,D0+ŠSUB.L‚D3,D0ŽGET�1ST�SECTORS�BUFFER�ADDRESS ŠMULUƒD6,D0Ž.ŠADD.L‚D0,A1Ž.ŠMOVE.L�D2,D4ŽSAVE�SECTOR�COUNTŠBCLRƒ#31,D4�.(DMP00…CLR.L‚D2‘DUMP�ONE�SECTOR�AT�A�TIME ŠMOVE.L�D6,D3 ŠBSR.S‚DUMPITŠSUB.L‚#1,D4ŽDONE?ŠBEQ.S‚DMPRTŽYES"ŠADD.L‚#1,D1ŽNO,�PRINT�NEXT�SECTOR ŠADD.L‚D6,A1 ŠBSR„LINEFD ŠBRA„DMP00DMPRT…MOVEM.L�(A7)+,D0-D4/A0-A1ŠRTSŠPAGEO*********************************************************************************ˆDUMPSC:‡1.00�6/25/80�HBN6 *ˆDUMPBF:O********************************************************************************D*ˆDUMPSC�DUMPS�A�SECTOR,�DUMPBF�DUMPS�A�BUFFER�ON�THE�OUTPUT�DEVICE.*"*ˆDUMPSC�ENTRY:�D1�=�PSN�OF�SECTOR*–A1�=�SECTOR�BUFFER�ADDRESS5*ˆDUMPBF�ENTRY:�D2�=�OFFSET�FOR�STARTING�BYTE�TO�DUMP*–D3�=�NUMBER�OF�BYTES�TO�DUMP*–A1�=�SECTOR�BUFFER�ADDRESS**ˆDUMPSC�RETURN:�D2�=�0 *—D3�=�256*—A0,�D0�-�CHANGED*!*ˆDUMPBF�RETURN:�A0,�D0�-�CHANGED* DUMPSC„EQU„**!*ˆSETUP�REGISTERS�FOR�SECTOR�DUMP $ŠCLR.L‚D2‘OFFSET�=�0�FOR�SECTOR�DUMP$ŠMOVE.L�D6,D3ŽD3�=�256�BYTES�TO�DUMP ŠBRA.S‚DUMPIT*(DUMPBF„EQU„*’ENTRY�POINT�FOR�BUFFER�DUMP*)ŠMOVEM.L�D1-D5/A1-A2,-(A7)�SAVE�REGISTERS'ŠBSETƒ#31,D2�INDICATE�BUFFER/FIELD�DUMP!ŠCLR.L‚D5‘OFFSET�FOR�FIELD:�ORG�0 ŠBRA.S‚DUMP001DUMPIT„EQU„*’ENTRY�POINT�FOR�DUMP�SEVERAL�SECTORS*'*ˆSEND�'PSN�=�XXXXX'�AS�HEADER�FOR�DUMP*)ŠMOVEM.L�D1-D5/A1-A2,-(A7)�SAVE�REGISTERS2ŠLEA„PSNFLD(PC),A0ŠFIELD�TO�PUT�PSN�HEX�VALUE�INTO,ŠBSR„BIN4HEXŒCONVERT�BINARY�PSN�IN�D1�TO�HEX ŠLEA„PSNMSG(PC),A0ŠSEND�THE�LINEŠMOVE.L�#PSNMSGL,D0ˆ.+ŠTST.B‚PRTFLG-B(A5)‡OUTPUT�TO�LINE�PRINTER?ŠBEQ.S‚DUMPAA�NODŠMOVE.B�#PRTLUN,IOSLUN+OUTIOS-B(A5)�YES,�SET�PRINTER�LUN�INTO�IOS�PBDUMPAA„BSR„SENDMSGS‹.**ˆBLANK�FILL�LINE�BUFFER*)DUMP00„LEA„LINEBUF(PC),A0‰START�OF�BUFFER(ŠMOVE.L�#LINEL/2,D0ˆLENGTH�TO�SPACE�FILLDUMP01„MOVE.W�#'‚',(A0)+ ŠSUB.L‚#1,D0 ŠBNE„DUMP01ŠPAGE*&*ˆSET�LINE'S�OFFSET�INTO�START�OF�LINE* 7ŠLEA„ASCFLD(PC),A2ŠINITIALIZE�WHERE�TO�PUT�ASCII�VALUES+ŠLEA„OFSFLD(PC),A0ŠFIELD�TO�PUT�OFFSET�INTO(ŠMOVE.L�D2,D1ŽCONVERT�FROM�BINARY�TO�HEX'ŠBPL.S‚DUMP02�PUT�OFFSET�IF�SECTOR�DUMP/ŠMOVE.L�D5,D1ŽUSE�ORG�ZERO�IF�BUFFER/FIELD�DUMPŠADD.L‚#$10,D5Œ.�OFFSETDUMP02„BSR„BIN1HEXŒ.!ŠTST.L‚(A0)+ŽSKIP�NEXT�TWO�SPACES$ŠMOVE.L�#16,D4�PUT�16�BYTES�PER�LINE*0*ˆCONVERT�BYTES�TO�HEX�AND�ALSO�DISPLAY�IN�ASCII*.DUMP05„MOVE.B�(A1,D2),D1‰GET�NEXT�BYTE�TO�SHOW6ŠBSR„BIN1HEXŒCONVERT�INTO�HEX�AND�PUT�INTO�LINE�BUFFER"ŠLEA„3(A0),A0‹SKIP�FOLLOWING�SPACEŠCMP.B‚#$7E,D1ŒIS�IT�PRINTABLE?ŠBHI.S‚DUMP10�BRANCH�IF�NOŠCMP.B‚#$20,D1ŒIS�IT�PRINTABLE?*ŠBCS.S‚DUMP10�USE�DOT�(.)�IF�NOT�PRINTABLE ŠMOVE.B�D1,(A2)+‹ITS�DISPLAYABLE ŠBRA.S‚DUMP15/DUMP10„MOVE.B�#'.',(A2)+‰OTHERWISE�PUT�IN�A�DOT$DUMP15„SUB.L‚#1,D3ŽALL�BYTES�DUMPED?ŠBEQ.S‚DUMPRT�YES"ŠADD.L‚#1,D2ŽNO,�PUT�OUT�NEXT�BYTE&ŠSUB.L‚#1,D4ŽWILL�IT�FIT�ON�THIS�LINE?1ŠCMP.L‚#8,D4ŽDO�WE�DOUBLE�SPACE�FOR�PRETTY�PRINT?ŠBNE.S‚DUMP18�BRANCH�IF�NO5ŠLEA„1(A0),A0‹BUMP�CHARACTER�POINTER�FOR�PRETTY�PRINTDUMP18„TST.L‚D4ŠBNE„DUMP05�YES*2*ˆCURRENT�LINE�FULL,�PRINT�IT�AND�START�A�NEW�LINE*ŠBSR.S‚SNDLIN�WRITE�THE�LINE ŠBNE.S‚DUMPERŠBRA„DUMP00�GO�DO�NEXT�LINE**ˆDONE,�PRINT�OUT�LAST�LINE* DUMPRT„EQU„* ŠBSR.S‚SNDLIN:DUMPER„MOVE.B�#LDFLUN,IOSLUN+OUTIOS-B(A5)�RESET�NORMAL�LUN,ŠMOVEM.L�(A7)+,D1-D5/A1-A2�RESTORE�REGISTERSŠRTS*.SNDLIN„LEA„LINEBUF(PC),A0‰START�OF�LINE�BUFFERŠMOVE.L�#LINEL,D0ŠLENGTHŠBSR„SENDMSGS‹WRITEŠRTSŠPAGE*O*********************************************************************************ˆRSVCHK:1.00�7/22/80�HBN6*O********************************************************************************2*ˆRSVCHK�IS�CALLED�TO�CHECK�RESERVED�FIELD�IS�ZERO=*ˆER ROR�MESSAGE�IS�SENT,�FIELD�IS�ZEROED�OR�REPAIR�TERMINATED=*ˆTHIS�INSURES�THAT�REPAIR�DOES�NOT�ATTEMPT�TO�CORRECT�A�DISK**ˆWHICH�HAS�BEEN�GENERATED�BY�UPGRADED�FMS***ˆON�ENTRY:�A2�=�ADDRESS�OF�RESERVED�FIELD*’D1�=�LENGTH�OF�FIELD*$*ˆON�RETURN:�Z�=�1�IF�OK‚(UNCHANGED) *—0�IF�ERROR*šBMI�IF�NO�FIX�REQUESTED*šBNE�IF�FIELD�ZEROED�(CHANGED)* RSVCHK„EQU„**ŠMOVEM.L�D0-D2/A0/A2,-(A7)*&*ˆSET�PSN�OF�CURRENT�ITEM�INTO�MESSAGE*ŠLEA„RESPSN(PC),A0ŠMOVE.L�D1,D2ŽSAVE�BCT'ŠBEQ.S‚RSVRET�RETURN�IF�BYTE�COUNT�ZERO-ŠMOVE.L�UPDSTR-B(A5),D1„GET�ITEM�STARTING�PSN ŠBSR„BIN4HEXŠMOVE.L�D2,D1ŽRESTORE�BCT**ˆCHECK�IF�ERROR*(ŠLEA„RESMSG(PC),A0ŠERROR�MESSAGE‚TO�SENDŠMOVE.L�#RESMSGL,D0ˆ.RSVC00„TST.B‚(A2)+ŠBNE.S‚RSVR00�ERROR ŠSUB.L‚#1,D1 ŠBNE„RSVC00(ŠBRA.S‚RSVRET�OK,�Z�=�1�(FIELD�WAS�ZERO)RSVR00„BSR„SENDMSQCŠBSR.S‚ZROUTŽZERO�FIELD?ŠBNE.S‚RSVR03�NO�REPAIR�WANTED"ŠCLR.B‚-1(A2)�OK�TO�ZERO�OUT�FIELDRSVR01„SUB.L‚#1,D1Ž.ŠBEQ.S‚RSVR02�.�DONEŠCLR.B‚(A2)+Ž. ŠBRA„RSVR01�.2RSVR02„MOVE.L�#1,D0ŽZ�=�0�FOR�FIELD�ZEROED/CHANGED RSVRET„MOVEM.L�(A7)+,D0-D2/A0/A2ŠRTS.RSVR03„MOVE.L�#-1,D0�INDICATE�NO�REPAIR�WANTED ŠBRA„RSVRETŠPAGEO*********************************************************************************ˆZROUT:1.00�7/22/80‚HBN6*O*********************************************************************************+*ˆZROUT�REQUESTS�APPROVAL�TO�ZERO�OUT�FIELD* *ˆON�RETURN:�Z�=�1�IF�OK�TO�ZERO*—0�IF�NOT�TO�ZERO*ZROUT…MOVEM.L�D0/A0,-(A7)ŠLEA„ZROMSG(PC),A0ŠMOVE.L�#ZROMSGL,D0ŠBSR.S‚SENDMSG ŠBSR„REPAIRŠMOVEM.L�(A7)+,D0/A0ŠRTSO*********************************************************************************ˆUPDB:1.00�20/7/80�HBN6*O********************************************************************************>*ˆUPDB�UPDATES�CURRENT�DATA�BLOCK�ON�DISK�IF�CHANGED�IN�MEMORYA*ˆ(CURRENTLY�THE�COMPLETE�DB�IS�WRITTEN�TO�DISK�REGARDLESS�OF�HOWC*ˆMANY�SECTORS�ARE�ACTUALLY�IN�USE:�LATER�VERSION�SHOULD�ONLY�WRITE(*ˆMINIMUM�SECTOR�COUNT�TO�SPEED�PROCESS)**ˆON�RETURN:�Z�=�1�IF�OK�WRITE,�ELSE�ERROR* UPDB†EQU„*ŠTST.B‚DBFLG-B(A5)ˆCHANGED?ŠBEQ.S‚UPD0�NO�SKIP�CALLŠMOVEM.L�D1-D2/A0-A1,-(A7)ŠMOVE.L�PSNDB-B(A5),D1ŠMOVE.L�DBLEN-B(A5),D2ŠMOVE.L�DBBUF-B(A5),A1ŠCLR.B‚DBFLG-B(A5)ŠMOVE.L�#'�DB�',IOERITM-B(A5) ŠBSR„WRITSECŠMOVEM.L�(A7)+,D1-D2/A0-A1UPD0†RTSŠPAGE*O*********************************************************************************ˆSENDMSG:‰1.00�6/25/80�HBN6 *ˆSENDMSQC: *ˆSENDMSGS:O********************************************************************************6*ˆSENDMSG/SENDMSGS�OUTPUTS�A�LINE�TO�THE�OUTPUT�DEVICE*+*ˆSENDMSG‚IGNORES�CALL�IF�C-OPTION�WAS�SET.2*ˆSENDMSGS�OUTPUTS�MESSAGE�REGARDLESS�OF�C-OPTION.B*ˆSENDMSQC�CALL�SENDMSGS�AND�THEN�NIMC�(RET�Z�=�1�IF�NIM,0=�IF�IM)**ˆON�ENTRY:�D0�=�MESSAGE�LENGTH*’A0�=�ADDRESS�OF�MESSAGE*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED5*“Z�=�1�IF�NO�PRT�ERRORS†NOTE:�LDF�ERRORS�CAUSE�ABORT*—0�IF�ERROR�FROM�PRINTER* SENDMSGƒEQU„***ˆSKIP�CALL�IF�C-OPTION�IS�ON*ŠMOVEM.L�D0/A0,-(A7) ŠTST.W‚D7ŠBMI.S‚SENDMOKŒSKIPŠBRA.S‚SENDM00**ˆSEND�MESSAGE*SENDMSGS‚EQU„*’ENTRY�POINTŠMOVEM.L�D0/A0,-(A7)=SENDM00ƒBSR„INCLINEŒINCREMENT�LINE�COUNT�IF�OUTPUT�TO�PRINTER,ŠMOVE.L�A0,IOSSAD+OUTIOS-B(A5)�START�ADDRESS ŠTST.L‚D0‘LENGTH�=�ZERO�?‡1/9/85ŠBNE.S‚SENDMNSP‹NO”1/9/85-ŠMOVE.B�#'�',(A0)ŠYES�-�OUTPUT�A�SPACE‚1/9/85*ŠBRA.S‚SENDMSPŒUSE�'CR'�SPOT�AS�END‚1/9/85$SENDMNSP‚SUB.L‚#1,D0ŽGET�END�ADDRESSSENDMSPƒADD.L‚A0,D0Ž.ŠMOVE.L�D0,IOSEAD+OUTIOS-B(A5)!ŠIOSCALL�OUTIOS(PC)ˆWRITE�MESSAGEŠBNE.S‚SENDMER(ŠTST.B‚PRTFLG-B(A5)‡PRINTER�OUTPUT�ONLY?ŠBNE.S‚SENDMOKŒYES,�DONEŠTST.B‚CPYFLG-B(A5)‡HARD�COPY?ŠBNE.S‚SENDMOKŒNO%* YES, MAKE SURE NO DUPLICATES TO PRT"ŠCMP.B‚#PRTLUN,IOSLUN+OUTIOS-B(A5)ŠBEQ.S‚SENDMOK=ŠMOVE.B�#PRTLUN,IOSLUN+OUTIOS-B(A5)�SEND�LINE�TO�PRINTER�ALSOŠIOSCALL�OUTIOS(PC)ŠBNE.S‚SENDMERŒPRINTER�ERROR*SENDMRTƒMOVE.B�#LDFLUN,IOSLUN+OUTIOS-B(A5)SENDMOKƒCLR.L‚D0ŠMOVEM.L�( A7)+,D0/A0ŠRTS2SENDMERƒTST.B‚KILL-B(A5)‰TERMINATING�REPAIR?�ERRORŠBNE„KILLREPŒYES,�KILL�REPAIR1ŠCMP.B‚#PRTLUN,IOSLUN+OUTIOS-B(A5)�PRINTER�ERROR?&ŠBNE„IOERRŽNO,�SEND�ERROR�MSG�AND�QUIT ŠBSR„PIOERMSŒYES,�SEND�ERROR�MSG* ABORT IF NOT 'NOT READY'SEND05:ŠCMP.B‚#ISTANR,D0 ŠBNE„KILLREP$SENDM10ƒERQ.DELAY�1500ŒDELAY�1.5�SEC-ŠIOSCALL�OUTIOS(PC)ˆREPEAT�TILL�ERROR�CLEARED ŠBEQ„SENDMRT‰CMP.B…#ISTABRK,D0 ‰BEQ‡BREAKREP*œJMP�IF�'BREAK'�REQUEST ‰BRA.S…SEND05*œCONTINUE�LOOPSENDMSQC‚BSR„SENDMSGS ŠBSR„NIMCŠRTSŠPAGE*O*********************************************************************************ˆLINEFD:1.00�7/9/80�HBN6*O********************************************************************************?*ˆLINEFD�SENDS�A�LINE�FEED.�TOP�OF�FORM�IS�SENT�IF�END�OF�PAGE.**ˆCALLS‚SENDMSGS*LINEFD„MOVEM.L�D0/A0,-(A7)ŠLEA„LFMSG(PC),A0ŠMOVE.L�#LFMSGL,D0 ŠBSR„SENDMSGSŠMOVEM.L�(A7)+,D0/A0ŠRTS*O*********************************************************************************ˆTOF:1.00�7/9/80�HBN6*O********************************************************************************9*ˆTOF�PERFORMS�FORM�FEED�IF�OUTPUT�IS�TO�THE�LINE�PRINTER**ˆCALLS�SENDMSGS* TOF‡EQU„*ŠMOVEM.L�D0-D1/A0,-(A7)ŠTST.B‚CPYFLG-B(A5)‡HARD�COPY?ŠBEQ.S‚TOF00ŽYES.ŠTST.B‚PRTFLG-B(A5)‡NO,�OUTPUT�TO�THE�PRINTER?ŠBEQ.S‚TOFRTŽNO.TOF00…MOVE.B�#1,LINECNT-B(A5)ƒRESET�LINE�COUNTŠLEA„TOFMSG(PC),A0ŠMOVE.L�#TOFMSGL,D0/ŠMOVE.B�IOSLUN+OUTIOS-B(A5),D1ƒSAVE�CURRENT‚LUN#ŠMOVE.B�#PRTLUN,IOSLUN+OUTIOS-B(A5) ŠBSR„SENDMSGSŠMOVE.B�D1,IOSLUN+OUTIOS-B(A5)TOFRT…MOVEM.L�(A7)+,D0-D1/A0ŠRTS*O*********************************************************************************ˆINCLINE:1.00�7/9/80�HBN6*O********************************************************************************>*ˆINCLINE�INCREMENTS�LINE�COUNT,�SEND�TOP�OF�FORM�IF�PAGE�FULL *ˆCALLS�TOF* INCLINEƒEQU„*ŠMOVE.L�D0,-(A7)ŠTST.B‚CPYFLG-B(A5) ŠBEQ.S‚INCL00#ŠTST.B‚PRTFLG-B(A5)‡PRINTER�OUTPUT?ŠBEQ.S‚INCLRT�NO7INCL00„ADD.B‚#1,LINECNT-B(A5)ƒYES,�COUNT�LINES�PER�PAGEŠMOVE.B�MAXLINES-B(A5),D0ŠCMP.B‚LINECNT-B(A5),D0 ŠBNE.S‚INCLRT!ŠBSR„TOF�PAGE�FULL,�DO�PAGE�EJECTINCLRT„MOVE.L�(A7)+,D0ŠRTSŠPAGE*O********************************************************************************ˆGETSEC:1.00�25/6/80�HBN6*O********************************************************************************C*ˆGETSEC�READS�GIVEN�SECTOR�BLOCK�FROM�THE�VOLUME�INTO�GIVEN�BUFFERB*ˆIF�IO�ERROR�THEN�BLOCK�IS�READ�IN�AGAIN,�THIS�TIME�IT�IS�READ�IN*ˆONE�SECTOR�AT�A�TIME.>*ˆCRC�ERROR�MESSAGE�IS�SENT�FOR�EACH�SECTOR�HAVING�SUCH�ERROR.B*ˆOTHER�ERRORS�CAUSE�READING�TO�STOP�AND�ERROR�MESSAGE�TO�BE�SENT.*,*ˆIF�C�-�OPTION�IS�ON,�REPAIR�IS�TERMINATED.***ˆON�ENTRY:�D1�=�STARTING�PSN%*’D2�=�NUMBER�OF�SECTORS�IN�THE�BLOCK*’A1�=�BUFFER�STARTING�ADDRESS***ˆON�RETURN:�D0�=�0�AND�Z�=�1�IF�NO�ERROR;*˜0�IF�CRC�ERROR�AND�Z�=�0"*˜OTHERWISE�D0�=�ERROR�CODE,�Z�=�07*˜(LSTSRD�=�0�IF�1ST�SECTOR�WAS�NOT�READ�IN�ELSE�=�LAST*™GOOD�SECTOR'S�PSN)* GETSEC„EQU„***ˆREAD�IN�BLOCK*#ŠMOVEM.L�D1-D6/A0-A1,-(A7)˜10/10/84(ŠMOVE.W�#IOREAD,IOSFCT+VOLIOS-B(A5)�READŠBSR„IOSECŽREAD�BLOCKŠBEQ.S‚GETSCR�NO�ERROR*ŠMOVE.L�D1,D5ŽERROR,�SAVE�1ST�SECTOR'S�PSN*2*ˆREAD�IN�AGAIN�SECTOR�AT�A�TIME�IF�IO�ERROR�FOUND*ŠCLR.L‚D4‘FLAG�NO�ERRORGETSC0„MOVE.L�D1,D3 ŠMOVE.L�D2,D1ŠMULUƒD6,D1ŽGET�BCT'ŠBSR„CLRBUF�ZERO�OUT�BUFFER�BEFORE�READ'ŠCLR.L‚LSTSRD-B(A5)‡NO�SECTORS�READ�YET**ˆREAD�SECTOR�AT�A�TIME*!ŠMOVE.L�D3,D1ŽNEXT�SECTOR�TO�READ ‰BSR.S…IOSECŠBNE.S‚GETSC2�ERROR(GETSC1„ADD.L‚#1,D1ŽNO,�READ�NEXT�SECTOR?ŠADD.L‚D6,A1Ž.ŠSUB.L‚#1,D2Ž.ŠBNE.S‚GETSC0�YES.ŠMOVE.L�D4,D0ŽNO,�ANY�ERROR�FOUND�DURING�READ?ŠBEQ.S‚GETSCR�NO GETSCE„EQU„*ŠMOVE.L�D4,D0ŽRETURN�ERROR�CODEŠCMP.B‚#ISTACRC,D0 ŠBNE.S‚GETSCR ŠCLR.L‚D0ŠCMP.B‚#1,D0ŽZ�=�0)GETSCR„MOVEM.L�(A7)+,D1-D6/A0-A1˜10/10/84ŠRTS+GETSC2 „TST.L‚LSTSRD-B(A5)‡ANY�ERROR�SO�FAR?$ŠBNE.S‚GETSC5�YES,�KEEP�FIRST�SECTOR#ŠCMP.L‚D1,D5ŽERROR�FROM�1ST�SECTOR?ŠBEQ.S‚GETSC6�YESFŠMOVE.L�D1,LSTSRD-B(A5)�NO,�SAVE�PSN�OF�LAST�GOOD�SECTOR�THAT�WAS�READŠSUB.L‚#1,LSTSRD-B(A5)„.GETSC5:O********************************************************************************&*‰CMP.B‚D0,D4ŽSAME�ERROR�AS�LAST�TIME?*‰BNE.S‚GETSC6�BRANCH�IF�NO-*‰CMP.B‚#ISTACRC,D4ˆYES�-�WAS�IT�A�CRC�ERROR?:*‰BEQ.S‚GETSC1�YES�-�DON'T�COMPLAIN�TWICE�ABOUT�THIS�ERROR,*œTHESE�INSTRUCTIONS�HAVE�BEEN�COMMENTED�OUT1*œSO�THAT�EACH�INDIVIDUAL�SECTOR�THAT�HAS�A�'CRC'*œERROR�CAN�BE�PRINTEDO*******************************************************************************6GETSC6„MOVE.L�D0,D4ŽSAVE�ERROR�CODE�(SAVES�LAST�ERROR)ŠCMP.B‚#ISTACRC,D0ŠBNE.S‚GETSC9�NO**ˆSEND�CRC�ERROR�MSG*"ŠMOVE.L�IOERITM-B(A5),CRCITM-B(A5)'ŠLEA„PSNFLD(PC),A0ŠSET�PSN�INTO�MESSAGE'ŠBSR„BIN4HEXŒCONVERT�FROM�BINARY�TO�HEX0ŠLEA„CRCMSG(PC),A0ŠSEND�COMPLETE�MESSAGE�TO�USERŠMOVE.L�#CRCMSGL,D0;ŠMOVE.B�#LDFLUN,IOSLUN+OUTIOS-B(A5)�MAKE�SURE�OUTPUT�TO�LDFŠCLR.B‚PRTFLG-B(A5)‡. ŠBSR„SENDMSQCŠBRA.S‚GETSC1�GET�NEXT�SECTOR**ˆSEND�IO�ERROR�MSG*-GETSC9„MOVE.L�#'READ',IOERRW-B(A5)�READ�ERRORŠMOVE.B�#'�',IOERRWC-B(A5)ŠBSR„IOERMS�SEND�IO�ERROR�MSG ŠBRA„GETSCE*$*ˆCOMMON�CODE�FOR�GETSEC�AND�WRITSEC*0IOSEC…MOVE.L�D1,IOSRRN+VOLIOS-B(A5)�STARTING�PSN+ŠMOVE.L�A1,IOSSAD+VOLIOS-B(A5)�BUFFER�STARTŠMOVE.L�A1,A0ŽGET�BUFFER�END!ŠMOVE.L�D2,D0Ž.�NUMBER�OF�SECTORS,ŠMULUƒD6,D0Ž.�BYTE�COUNT�=�256*(#OF�SECTORS)ŠSUB.L‚#1,D0Ž.ŠADD.L‚D0,A0Ž.ŠMOVE.L�A0,IOSEAD+VOLIOS-B(A5)"ŠIOSCALL�VOLIOS(PC)ˆDO�THE�IO�CALLŠBEQ.S‚IOSECR�NO�ERRORŠCMP.B‚#ISTABRK,D0ˆBREAK�ERROR?ŠBEQ„BREAKREP‹YESIOSECR„RTS„NO,�OTHER�ERRORŠPAGE*O*********************************************************************************ˆWRITSEC:1.00�6/25/80�HBN6*O********************************************************************************3*ˆWRITSEC�WRITES�A�SECTOR�OR�A�SECTOR�BLOCK�TO�DISK(*ˆERROR�MESSAGE�IS�SENT�IF�ERROR�OCCURS.*9*ˆREPAIR�IS�TERMINATED�IF�C�-�OPTION�ON�AND�ERROR�OCCURS.**ˆON�ENTRY:�D1�=�STARTING�PSN!*’D2�=�NUMBER�OF�SECTORS�TO�WRITE*’A1�=�BUFFER�ADDRESS***ˆON�RETURN:�D0�=�0�AND�Z�=�1�IF�NO�ERROR;!*˜ERROR�CODE�AND�Z�=�0�OTHERWISE;* WRITSECƒEQU„**A*ˆSET�WRITE�CODE�INTO�PARAMETER�BLOCK;�OTHERWISE�SAME�CODE�AS�FOR *ˆGETSEC.*ŠMOVEM.L�D1-D2/A0,-(A7)#ŠMOVE.W�#IOWRIT,IOSFCT+VOLIOS-B(A5)ŠBSR.S‚IOSECŽWRITEŠBEQ.S‚WRITSCRŠMOVE.L�D0,D2ŽSAVE�ERROR�CODE$ŠCMP.B‚#$E4,D0ŒWrite�protect�error�?+ŠBNE.S‚WRITRSMŒNO...send�I/O�error�messages5ŠLEA„PROTMSG(PC),A0…'Disk�is�write�protected'�messageŠMOVE.L�#PROTMSGL,D0 ŠBSR„SENDMSGS)ŠBRA.S‚WRITSSMŒThis�message�is�sufficient#WRITRSMƒMOVE.L�#'WRIT',IOERRW-B(A5)ŠMOVE.B�#'E',IOERRWC-B(A5)!ŠBSR.S‚IOERMS�Send�message�to�LDF&ŠMOVE.L�IOSRRN+VOLIOS-B(A5),D1ƒGET�PSNŠLEA„WREPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„WREMSG(PC),A0ŠMOVE.L�#WREMSGL,D00ŠBSR„SENDMSQC‹Send�message�then�quit�if�C-OPTION'WRITSSMƒMOVE.L�D2,D0ŽRESTORE�ERROR�CODEWRITSCRƒMOVEM.L�(A7)+,D1-D2/A0ŠRTSŠPAGE*O*********************************************************************************ˆWRTSBF�1.00�6/25/80�HBN6*O********************************************************************************/*ˆWRTSBF�WRITE�SECTOR�BUFFER�TO�DISK�IF�CHANGED$*ˆON�RETURN:�Z�=�1�IF�OK,�ELSE�ERROR*9WRTSBF„TST.B‚SECFLG-B(A5)‡SKIP�CALL�IF�SECTOR�NOT�CHANGED ŠBEQ.S‚WRTS1ŠMOVEM.L�D0-D2/A0-A1,-(A7)ŠLEA„SECBUF(PC),A1ŠBUFFER�ADRŠMOVE.L�PSNSEC-B(A5),D1„PSNŠMOVE.L�#1,D2Ž1�SECTOR!ŠCLR.B‚SECFLG-B(A5)‡NOW�UNCHANGEDŠMOVE.L�#'SEC.',IOERITM-B(A5) ŠBSR„WRITSECŠMOVEM.L�(A0)+,D0-D2/A0-A1 WRTS1…RTSŠPAGE*O*********************************************************************************ˆIOERMS�1.00�7/3/80�HBN6*O********************************************************************************'*ˆIOERMS�SENDS�IO�ERROR�MESSAGE�TO�LDF.**ˆON�ENTRY:�D0�=�ERROR�STATUS"*’A0�=�IOS�PARAMETER �BLOCK�ADDRESS*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED* IOERMS„EQU„***ˆSET�ERROR�STATUS*ŠCMP.B‚#ISTABRK,D0ˆBREAK?ŠBEQ.S‚BREAKREP&ŠMOVEM.L�D1-D2/A0,-(A7)„SAVE�REGISTERS ŠMOVE.L�D0,D1ŠLEA„IOERD0(PC),A0 ŠBSR„BIN4HEX**ˆSEND�ERROR�MESSAGE*ŠLEA„IOERMSG(PC),A0ŠMOVE.L�#IOERMSL,D0ŠTST.B‚KILL-B(A5) ŠBNE.S‚IOER00ŠMOVE.L�#IOERMSGL,D0AIOER00„MOVE.B�#LDFLUN,IOSLUN+OUTIOS-B(A5)�MAKE�SURE�OUTPUT�TO�LDFŠCLR.B‚PRTFLG-B(A5)‡. ŠBSR„SENDMSQC/IOERRT„MOVEM.L�(A7)+,D1-D2/A0„RESTORE�REGISTERSŠRTS*BREAKREP‚MOVE.B�#1,KILL-B(A5)ŠLEA„BRKMSG(PC),A0ŠMOVE.L�#BRKMSGL,D0 ŠBSR„SENDMSGS ŠBRA„KILLREPŠPAGE*O*********************************************************************************ˆPIOERMS�1.00�7/3/80�HBN6*O********************************************************************************%*ˆPIOERMS�SENDS�PRINTER�ERROR�MESSAGE**ˆON�ENTRY:�D0�=�ERROR�STATUS"*’A0�=�IOS�PARAMETER�BLOCK�ADDRESS*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED* PIOERMSƒEQU„***ˆSET�ERROR�STATUS*&ŠMOVEM.L�D0-D2/A0,-(A7)„SAVE�REGISTERSŠCMP.B‚#ISTABRK,D0ˆBREAK?ŠBEQ„BREAKREP‹YES,�ABORT ŠMOVE.L�D0,D1ŠLEA„PRTERD0(PC),A0 ŠBSR„BIN4HEX**ˆSEND�ERROR�MESSAGE*ŠIOSCALL�PRTIOE(PC)ŠBNE„KILLREPŒQUIT�IF�ERROR)ŠMOVEM.L�(A7)+,D0-D2/A0„RESTORE�REGISTERSŠRTSŠPAGEO*********************************************************************************ˆUPDSEC�1.00�6/25/80�HBN6*O*********************************************************************************ˆDURING�VID�CHECK:G*ˆUPDSEC�UPDATES/DUMPS�GIVEN�SECTOR.�THE�SECTOR�IS�READ�IN�IF�NECESSARY?*ˆAND�ANY�PRIOR�SECTOR�IS�WRITTEN�BACK�TO�DISK�IF�IT�IS�FLAGGED!*ˆCHANGED.�SECTOR�BUFFER�IS�USED.**ˆON�ENTRY:�D1�=�PSN�OF�SECTOR3*’D2�=�OFFSET�TO�FIRST�BYTE�TO�CHANGE�FROM�'UPDATE''*—OR�#�OF�SECTORS�TO�PRINT�(BIT�31�SET)&*’A3�->�NEW�VALUES�IF�CHANGE�REQUESTED* UPDSEC„EQU„**0*ˆCHECK�IF�REQUESTED�SECTOR�IS�ALREADY�IN�MEMORY*)ŠMOVEM.L�D1-D4/A0-A2,-(A7)�SAVE�REGISTERS2UPDS00„LEA„SECBUF(PC),A1ŠGET�SECTOR�BUFFER�ADDRESSŠMOVE.L�#'SEC.',IOERITM-B(A5)&ŠMOVE.L�D2,D4ŽSAVE�OFFSET/SECTOR�COUNTŠMOVE.L�D1,D3ŽSAVE�PSN+ŠBEQ.S‚UPDS01�IF�DUMP�VID�ALWAYS�READ�IT�IN7ŠCMP.L‚PSNSEC-B(A5),D1„IS�THE�SECTOR�ALREADY�IN�MEMORY?/ŠBEQ.S‚UPDS15�YES,�NEED�NOT�READ�IT�INTO�MEMORYBUPDS01„TST.B‚SECFLG-B(A5)‡NO,�HAVE�TO�WRITE�ANOTHER�SECTOR�TO�DISKŠBEQ.S‚UPDS10�NO*.*ˆWRITE�PREVIUOSLY�UPDATED�SECTOR�BACK�TO�DISK-*ˆBEFORE�CAN�OVERWRITE�BUFFER�WITH�NEW�SECTOR*%ŠCLR.B‚SECFLG-B(A5)‡CLEAR�UPDATE�FLAG2ŠMOVE.L�PSNSEC-B(A5),D1„GET�PSN�OF�SECTOR�TO�WRITEŠMOVE.L�#1,D2ŽWRITE�ONE�SECTOR"ŠBSR„WRITSECŒIGNORE�ERRORS�FOR�NOW%UPDS05„MOVE.L�D3,D1ŽPSN�OF�NEW�SECTOR#UPDS10„MOVE.L�#1,D2ŽREAD�NEW�SECTOR5ŠMOVE.L�D1,PSNSEC-B(A5)„SET�NEW�PSN�FOR�SECTOR�BUFFER ŠBSR„GETSECŠBNE.S‚UPDS30�IO�ERROR'UPDS15„TST.L‚D4‘UPDATE�OR�PRINT�SECTOR?ŠBMI.S‚UPDS20�PRINTAŠLEA„(A1,D6),A2‚UPDATE�-�GET�END�OF�CHANGES�ADDRESS�AT�SECTOR�ENDŠMOVE.L�D4,D2ŽGET�OFFSETŠBSR„UPDBUF�DO�CHANGES+ŠMOVE.B�#1,SECFLG-B(A5)„FLAG�SECTOR�UPDATED UPDSRT„MOVEM.L�(A7)+,D1-D4/A0-A2ŠRTSŠPAGE**ˆWRITE�SECTOR(S)*UPDS20„BSR„DUMPSC�DUMP�SECTOR ŠBCLRƒ#31,D4ŠSUB.L‚#1,D4ŽDONE?ŠBEQ„UPDSRT�YES%ŠBSETƒ#31,D4�NO,�GO�PRINT�NEXT�SECTOR ŠMOVE.L�D4,D2 ŠADD.L‚#1,D1 ŠBRA„UPDS00"UPDS30„TST.B‚D0‘CRC�ERROR�ON�READ?>ŠBEQ„UPDS20…YES,�GO�PRINT�SECTOR�AND�HOPE�USER�CORRECTS�ERRORS3ŠCLR.L‚PSNSEC-B(A5)‡NO,�OTHER�ERROR.�IGNORE�FOR�NOW ŠBRA„UPDSRTŠPAGEO******************************************************************************* * UPDATE:*ˆUPDATE�1.01�01/11/85*O********************************************************************************B*ˆUPDATE�SENDS�'UPDATE'�REQUEST�AND�CHECKS�RESPONSE�IS�ACCEPTABLE.C*ˆA�RETURN�IS�MADE�TO�ADDRESS�GIVEN�IN�BRANCH�TABLE�FOLLOWING�CALL.*.*ˆCALLING�SEQUENCE:�BSR�UPDATE�CALL�SUBROUTINE*šDC.L�ADR1-B�CR*šDC.L�ADR2-B�N*šDC.L�ADR3-B�R*šDC.L�ADR4-B�D*šDC.L�ADR5-B�A*šDC.L�ADR6-B�Q'*šDC.L�ADR7-B�$PSN�DUMP/UPDATE�IN�RANGE-*š DC.L�ADR8-B�$�DUMP�ITEM�OR�ONE�SECTOR�OF�IT,*šDC.L�ADR9-B�$PSN�DUMP�SECTORS�OUT�OF�RANGE!*šDC.L�ADR10-B�D�PSN,N�DEALLOCATE*šDC.L�ADR11-B�A�PSN,N�ALLOCATE*šDC.L�ADR12-B�OFFSET�VALUE,....*šDC.L�ADR13-B�C�CHECK�MODE�UNTIL�ERROR�OR�END!*šDC.L�ADR14-B�?�HELP,�SHORT�LIST *šDC.L�ADR15-B�H�HELP,�LONG�LIST*/*ˆON�RETURN�TO�ADR7,�ADR8,�ADR9�ONLY:�D1�=�PSN;!*¬D2�BIT�31�=�0�IF�OFFSET�IN�D2.W *¸1�IF�PRINT,*¸(SECTOR�COUNT�IN�D2.W)!*¯(IF�ADR8�THEN�D2.W�=�0�IF�NO�'N*°ELSE�D2.W�=�N)$*¬A3�=�START�OF�NEW�VALUES�IF�UPDATE)*ˆON�RETURN�TO�ADR12:�D2�=�OFFSET�(0-$FF)*œA3�=�START�OF�NEW�VALUES*œD1�=�STARTING�PSN�OF�ITEM,*ˆON�RETURN�TO�ADR10�OR�ADR11�ONLY:�D1�=�PSN*ªD2�=�NUMBER�OF�SECTORS**ˆON�RETURN�TO�ALL�CASES:�D0,�A0�-�CHANGED* UPDATE„EQU„*&ŠMOVEM.L�D3-D6/A1,-(A7)„SAVE�REGISTERS-ŠCLR.B‚PRTFLG-B(A5)‡CLEAR�PRINTER�OUTPUT�FLAG*,*ˆSEND�'UPDATE'�REQUEST�AND�READ�IN�RESPONSE*UPDA00„LEA„UPDRQST(PC),A0ŠMOVE.L�#UPDRQSTL,D0 ŠBSR„SENDMSGS ŠIOSCALL�INPIOS(PC)ˆGET�RESPONSE ŠBNE„IOERR ŠBSR„SBARG6ŠMOVE.L�INPIOS+IOSSAD-B(A5),A0ƒSTARTING�BUFFER�ADDRESS%ŠMOVE.L�INPIOS+IOSLEN-B(A5),D0ƒLENGTHŠTST.B‚CPYFLG-B(A5)‡HARD�COPY?ŠBNE.S‚UPDA00.1‹BRANCH�IF�NO+ŠMOVE.W�IOSLUN+OUTIOS-1-B(A5),-(A7)�SAVE�LU#ŠMOVE.B�#PRTLUN,IOSLUN+OUTIOS-B(A5)/ŠBSR„SENDMSGS‹SEND�OPERATOR�RESPONSE�TO�PRINTER5ŠMOVE.W�(A7)+,IOSLUN+OUTIOS-1-B(A5)�RESTORE�FORMER�LUUPDA00.1‚MOVE.L�A0,A1 ŠMOVE.L�D0,D4ŽLENGTH�OF�RESPONSE(ŠMOVE.L�#1,D0ŽCASE1:�ONLY�CR�AS�RESPONSE ŠTST.L…D4"ŠBEQ„UPDA55�JMP�IF�CR�WAS�RESPONSE"ŠMOVE.B�(A1)+,D0‹GET�1ST�CHARACTERŠCMP.B‚#'�',D0ŒIS�IT�A�BLANK�?1ŠBEQ.S‚UPDAN0�YES�..�BLANK�HANDLED�AS�SOLITARY‚CRŠBRA.S‚UPDAN5�NO�..UPDAN0„MOVE.L�#1,D0 ŠBRA„UPDA55*UPDAN5„SUB.L‚#1,D4ŽONE�CHARACTER�RESPONSE?ŠBEQ„UPDA50�YES,�GO�HANDLE�IT$ŠCMP.B‚#'Q',D0ŒSPECIAL�CASE�FOR�QUIT+ŠBEQ„UPDA50�HANDLE�'QUIT'�AS�IF�IT�WERE�'Q'ŠCMP.B‚#'0',D0ŒNO,�OFFSET?ŠBLT.S‚UPDAA0�.�NOŠCMP.B‚#'9',D0Œ.ŠBLE„UPDA41�YESUPDAA0„CMP.B‚#'$',D0ŒNO,�PSN?ŠBEQ.S‚UPDA01�YES)ŠCMP.B‚#'�',(A1)+‰NEXT�BYTE�MUST�BE�SPACEŠBNE„UPDA40AŒERRORŠMOVE.L�#1,D6ŽFLAG�D�PSNŠCMP.B‚#'D',D0 ŠBEQ.S‚UPDAA5ŠCMP.B‚#'A',D0$ŠBNE„UPDA40�ERROR�--�INVALID�COMMANDŠMOVE.L�#2,D6ŽFLAG�A�PSN*‰BRA.S‚UPDA05¤12/06/846UPDAA5„CMP.B‚#'$',(A1)+‰NEXT�BYTE�MUST�BE�'$'‚12/06/84ŠBEQ.S‚UPDA05¤12/06/84"ŠBRA„UPDA40AŒSYNTAX�ERROR‹12/06/84* *ˆGET�PSN*UPDA01„CLR.L‚D6‘FLAG�$PSNŠMOVE.B�(A1),D0$UPDA05„SUB.L‚A3,A3ŽINIT�SECTOR�COUNT ŠCLR.L‚D3ŠCLR.L‚D2‘COUNT�DIGITS�FOR�PSNŠCMP.B‚#',',D0 ŠBEQ.S‚UPDA11UPDA10„MOVE.B�(A1)+,D0‹GET�PSN ŠCMP.B‚#CR,D0ŠBEQ.S‚UPDA20�ONLY�PSN�GIVENŠCMP.B‚#'�',D0$ŠBEQ.S‚UPDA20�ERROR�IF�NO�HEX�DIGITS$ŠCMP.B‚#',',D0ŒSECTOR�COUNT�FOLLOWS?ŠBEQ.S‚UPDA17�YES+ŠBSR„HEXBIN�CONVERT�ONE�HEX�DIGIT�TO�BINARYŠBNE„UPDA40�VALUE�ERROR%ŠADD.L‚#1,D2ŽONE�MORE�DIGIT�PROCESSEDŠCMP.L‚#8,D2ŽTOO�MANY�DIGITS?!ŠBHI„UPDA40AŒYES�....SYNTAX�ERROR ŠLSL.L‚#4,D3!ŠOR.BƒD1,D3ŽD3�=�PSN�VALUE�SO�FAR ŠBRA„UPDA10**ˆ$,N*UPDA11„TST.B‚(A1)+ŽSKIP�COMMAŠMOVE.L�A1,A0ŽGET�NŠBSR„DECBINWŒ.ŠBNE„UPDA40�VALUE�ERROR4ŠMOVE.L�A0,A1ŽA1�->�BYTE�AFTER�TERMINATING�CHARACTERŠTST.L‚D1‘CAN'T�GIVE�ZEROŠBEQ„UPDA40AŒSYNTAX�ERRORŠMOVE.L�D1,D2ŽDUMP�ONLY&ŠBRA„UPDA53�RETURN�PSN�OF�ITEM�START+N*(*ˆEND�OF�PSN�FIELD,�SECTOR�COUNT�FOLLOWS*$UPDA17„MOVE.L�A1,A0ŽGET�SECTOR�COUNT'ŠBSR„DECBINWŒCONVERT�DEC�TO�BINARY�WORDŠBNE„UPDA40�VALUE�ERROR ŠMOVE.L�A0,A1ŠCMP.B‚#';',D0#ŠBEQ„UPDA40AŒCAN'T�TERMINATE�IN�';'ŠCMP.B‚#'.',D0ŒOR�IN�'.' ŠBEQ„UPDA40AŠTST.L‚D1‘CAN'T�GIVE�ZERO ŠBEQ„UPDA40AŠMOVE.L�D1,A3ŽSAVE�SECTOR�COUNT**ˆCHECK�PSN‚GIVEN*UPDA20„TST.L‚D2‘ANY�PSN�GIVEN?ŠBEQ„UPDA40AŒNO,�SYNTAX�ERRORŠTST.L‚D6‘$PSN?ŠBEQ.S‚UPDA24�YES3ŠMOVE.L�D3,D1ŽNO,�GET�PSN�TO�DEALLOCATE�OR�ALLOCATEŠMOVE.L�#10,D3�'D�PSN'?ŠSUB.L‚#1,D6Ž.ŠBEQ.S‚UPDA22�YESŠMOVE.L�#11,D3�NO,�'A�PSN'UPDA22„MOVE.L�A3,D2Ž'N'�GIVEN�?ŠBNE.S‚UPDA23�YESŠMOVE.L�#1,D2ŽNO,�DEFAULT�IS�1"UPDA23„BSR„MPSNCŽCHECK�PSN�ON�DISKŠBHI„UPDA90�ERROR*ŠMOVE.L�D3,D0ŽOK,�RETURN�ACCORDING�TO�CASE ŠBRA„UPDAR T* *ˆGET�OFFSET*UPDA24„CLR.L‚D5 ŠCLR.L‚D2ŠCMP.B‚#CR,D0�DONE?ŠBEQ.S‚UPDA32�YES UPDA25„EQU„*ŠMOVE.B�(A1)+,D0ŠCMP.B‚#'#',D0ŒOR�IS�IT�'#PR'?'ŠBEQ„UPDA60�MAYBE�(SET�PRTFLG�IF�IT�IS)ŠCMP.B‚#'�',D0!ŠBEQ.S‚UPDA30�NO,�DONE�WITH�FIELD ŠCMP.B‚#CR,D0 ŠBEQ.S‚UPDA30ŠBSR„HEXBIN�CONVERT�NEXT�BYTEŠBNE„UPDA40�VALUE�ERROR ŠLSL.L‚#4,D2 ŠOR.BƒD1,D2ŠADD.L‚#1,D5ŽCOUNT�DIGITS ŠBRA„UPDA25!UPDA30„TST.L‚D5‘ANY�OFFSET‚GIVEN?ŠBNE.S‚UPDA35�YESŠBRA.S‚UPDA31A)UPDAPR„EQU„*’NO,�CAN�ONLY�END�WITH�SPACESUPDA31„MOVE.B�(A1)+,D0UPDA31AƒCMP.B‚#CR,D0 ŠBEQ.S‚UPDA32ŠCMP.B‚#'�',D0ŠBNE.S‚UPDA40AŒSYNTAX�ERROR ŠBRA„UPDA31UPDA32„MOVE.L�A3,D2Ž$PSN,N%ŠBNE.S‚UPDA33�ANY�SECTOR�COUNT�GIVEN?ŠMOVE.L�#1,D2ŽNO,�DEFAULT�IS�1ŠBRA.S‚UPDA331**ˆRETURN�PSN-SECTOR�COUNT*1UPDA33„MOVE.L�A3,D2ŽRETURN�SPECIFIED�SECTOR�COUNT8UPDA331ƒMOVE.L�D3,D0ŽCHECK�LAST�PSN�NOT�PAST�END�OF�DISK ŠADD.L‚D2,D0 ŠSUB.L‚#1,D0ŠCMP.L‚MPSN-B(A5),D0ŠBHI„UPDA90�ERROR$UPDA34„BSETƒ#31,D2�FLAG�SECTOR�COUNTUPDAPS„MOVE.L�D3,D1ŽPSN ŠMOVE.L�#7,D0+ŠCMP.L‚UPDSTR-B(A5),D3„IS�PSN�WITHIN�RANGE?ŠBLT.S‚UPDANR�.�NOŠCMP.L‚UPDEND-B(A5),D3„.ŠBLT„UPDART�YES%UPDANR„MOVE.L�#9,D0ŽNO,�RETURN�CASE�9 ŠBRA„UPDART **ˆRETURN�PSN-OFFSET-VALUE*#UPDA35„CLR.L‚D0‘SECTOR�COUNT�GIVEN?ŠCMP.L‚D0,A3Ž. ŠBNE.S‚UPDA40AŒYES,�SYNTAX�ERROR&ŠCMP.L‚#4,D5Ž4�CHARACTER�OFFSET�IS�MAXŠBHI.S‚UPDA40AŒSYNTAX�ERROR.ŠCMP.L‚UPDSTR-B(A5),D3„CHECK�PSN�WITHIN�BOUNDSŠBLT„UPDA90�.�ERRORŠCMP.L‚UPDEND-B(A5),D3„.ŠBGE„UPDA90�.�ERROR UPDA36„EQU„*ŠMOVE.B�(A1),D0ŒEND�OF�LINEŠCMP.B‚#'�',D0 ŠBEQ.S‚UPDA38 ŠCMP.B‚#CR,D0ŠBEQ.S‚UPDA40AŒSYNTAX�ERROR%ŠMOVE.L�A1,A3ŽRET�A3->�1ST�VALUE�BYTE ŠBRA„UPDAPS!UPDA38„TST.B‚(A1)+ŽNEXT�CHARACTER ŠBRA„UPDA36**ˆUPDATE�RESPONSE�ERROR* UPDA40„EQU„**ŠBSR„RESPNA�SEND�INVALID�COMMAND�ERROR�MSGŠBRA„UPDA00�TRY�AGAIN UPDA40AƒEQU„*'ŠBSR„SYNTXERR‹SEND�SYNTAX�ERROR�MESSAGEŠBRA„UPDA00�TRY�AGAIN**ˆOFFSET�VALUE(,VALUE)...*UPDA41„CLR.L‚D2‘INIT�OFFSETUPDA42„BSR„HEXBIN�CONVERTŠBNE„UPDA40�VALUE�ERROR ŠLSL.L‚#4,D2 ŠOR.BƒD1,D2ŠMOVE.B�(A1)+,D0 ŠCMP.B‚#CR,D0ŠBEQ„UPDA40AŒSYNTAX�ERRORŠCMP.B‚#'�',D0 ŠBNE„UPDA42+UPDA43„MOVE.B�(A1),D0ŒGET�POINTER�TO�VALUESŠCMP.B‚#'�',D0 ŠBNE.S‚UPDA44ŠTST.B‚(A1)+ŽSKIP�SPACES ŠBRA„UPDA43(UPDA44„CMP.B‚#CR,D0�MUST�HAVE�NEW�VALUESŠBEQ„UPDA40AŒSYNTAX�ERROR1ŠMOVE.L�UPDSTR-B(A5),D1„RETURN�FIRST�SECTOR'S�PSN:ŠMOVE.L�A1,A3ŒASSUME�THIS�IS�FIRST�CHARACTER�OF�NEW�VALUESŠMOVE.L�#12,D0�RETURN�CASE�#)ŠCMP.L‚#$FF,D2ŒCHECK�OFFSET�NOT�TOO�LARGEŠBLE.S‚UPDART�OKŠBRA„UPDA40AŒSYNTAX�ERROR**ˆSINGLE�CHARACTER�RESPONSE*UPDA50:ƒMOVE.B�D0,D1ŠMOVE.L�#6,D0ŽQ�RESPONSEŠCMP.B‚#'Q',D1 ŠBEQ.S‚UPDA55ŠMOVE.L�#13,D0ŠCMP.B‚#'C',D1ŒC�RESPONSE? ŠBEQ.S‚UPDA55ŠMOVE.L�#2,D0ŽN�RESPONSEŠCMP.B‚#'N',D1 ŠBEQ.S‚UPDA55ŠMOVE.L�#3,D0ŽR�RESPONSEŠCMP.B‚#'R',D1 ŠBEQ.S‚UPDARTŠMOVE.L�#4,D0ŽD�RESPONSEŠCMP.B‚#'D',D1 ŠBEQ.S‚UPDARTŠMOVE.L�#5,D0ŽA�RESPONSEŠCMP.B‚#'A',D1 ŠBEQ.S‚UPDARTŠMOVE.L�#14,D0�?�Rresponse-ŠCMP.B‚#'?',D1ŒUser�needs�help�-�short�form�?7ŠBEQ.S‚UPDART�return�to�routine�through�table�to�handleŠMOVE.L�#15,D0�H�response,ŠCMP.B‚#'H',D1Œuser�needs�help�-�long�form�?7ŠBEQ.S‚UPDART�return�to�routine�through�table�to�handleŠCMP.B‚#'$',D1Œ$�RESPONSEŠBNE„UPDA40�NO,�ERRORŠCLR.L‚D2‘N�=�0UPDA53:ƒMOVE.L�#8,D0ŽCASE�8:�$%ŠMOVE.L�UPDSTR-B(A5),D1„RETURN�PSN,�NŠBSETƒ#31,D2�DUMP�ONLY*)*ˆTERMINATING�RESPONSE,�CR�OR�N�OR�C�OR�Q* UPDA55„EQU„*ŠPAGE*4*ˆGET�CASE�RETURN�ADDRESS�TO�TOP�OF�STACK�FOR�RETURN*/UPDART„MOVEM.L�(A7)+,D3-D6/A1„RESTORE�REGISTERS*ŠSUB.L‚#1,D0ŽGET�OFFSET�FOR�BRANCH�ADDRESSŠLSL.L‚#2,D0ŽMULTIBLY�BY�FOUR#ŠMOVE.L�(A7),A0ŒA0�=�RETURN�ADDRESS2ŠMOVE.L�(A0,D0),D0‰D0�=�RETURN�ADDRESS�-�BASE�BIASŠADD.L‚A5,D0ŽADD�BASE�BIAS#ŠMOVE.L�D0,(A7)ŒJIMMY�STACK�FOR�RTSCŠRTS„NOW�RETURN�BRANCHES�TO�WHOEVER�HANDLES�THE�PARTICULAR�RESPONSE**ˆ#PR:�SET�PRINTER�OUTPUT�FLAG* UPDA60„EQU„*ŠMOVE.B�(A1)+,D0ŠCMP.B‚#'P', D0 ŠBNE„UPDA40ŠMOVE.B�(A1)+,D0ŠCMP.B‚#'R',D0 ŠBNE„UPDA408* CAN'T SPECIFY PRINTER UNLESS SPECIFIED ON COMMAND LINEŠTST.B‚CPYFLG-B(A5)'ŠBNE„UPDA40�PRINTER�NOT�SPECIFIED�ERRORUPDA70„MOVE.B�#1,PRTFLG-B(A5) ŠBRA„UPDAPR* *ˆPSN�ERROR*UPDA90„MOVE.L�#PERMSGL,D0ŠLEA„PERMSG(PC),A0 ŠBSR„SENDMSGS ŠBRA„UPDA00 ŠPAGE*O**********************************************************************************ˆREPAIR�1.00�7/3/80�HBN6*O********************************************************************************!*ˆREPAIR�REQUESTS�'REPAIR�(Y/N)?'*"*ˆON�RETURN:�Z�-�1�IF�'Y'�RESPONSE*—0�IF�'N'�REPSONSE* REPAIR„EQU„*ŠMOVEM.L�D0/A0,-(A7)ŠLEA„REPRQST(PC),A0ŠMOVE.L�#REPRQSTL,D0ŠBSR„SENDMSGS‹SEND�REQUESTŠBSR.S‚GETRYN�GET�RESPONSEŠMOVEM.L�(A7)+,D0/A0ŠRTS*O*********************************************************************************ˆGETRYN:�1.00�7/3/80�HBN6*O********************************************************************************>*ˆGETRYN�READS�RESPONSE�FROM�USER;�ONLY�'Y'�OR�'N'�IS�ACCEPTED*,*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED�EXCEPT:*“D0�-�CHANGED*“Z�=�1�IF�'Y'�ANSWER�WAS�GIVEN*—0�IF�'N'�ANSWER�WAS�GIVEN*—0�IF�CR‚ANSWER�WAS�GIVEN* GETRYN„EQU„**ŠMOVE.L�A0,-(A7)'GETRY0„IOSCALL�INPIOS(PC)ˆREAD�RESPONSE ŠBNE„IOERR ŠBSR„SBARG)ŠBSR.S‚HRDCPY�SEND�HARD�COPY�IF�NECESSARYAŠMOVE.L�IOSLEN+INPIOS-B(A5),D0ƒACCEPT�ONLY�ONE�CHARACTER�RESPONSE*‰SUB.L‚#1,D0Ž.*‰BNE.S‚GETRY1�BAD�RESPONSE%ŠMOVE.B�INPBUF-B(A5),D0„GET�CHARACTERŠCMP.B‚#'Y',D0ŒIS�IT�YES?ŠBEQ.S‚GETRYR�YESŠCMP.B‚#CR,D0�is�it�a�CR�?,ŠBEQ.S‚GETRYC�Yes..handle�as�if�it�was�a�'N'ŠCMP.B‚#'N',D0ŒOR�IS�IT�NO?ŠBNE.S‚GETRY1�NEITHER�IS�ERRORGETRYC„TST.B‚D0‘Z�=�0�FOR�'N'GETRYR„MOVE.L�(A7)+,A0ŠRTS+GETRY1„BSR.S‚RESPNA�NOT�ACCEPTABLE�RESPONSEŠBRA„GETRY0�TRY�AGAINŠPAGE*O**********************************************************************************ˆRESPNA�1.00�7/3/80�HBN6*O********************************************************************************@*ˆRESPNA�SENDS�'WHAT'�MESSAGE�BECAUSE�RESPONSE�IS�NOT�ACCEPTABLE*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED* RESPNA„EQU„*ŠMOVEM.L�A0/D0,-(A7)ŠLEA„WHTMSG(PC),A0ŠMOVE.L�#WHTMSGL,D0 ŠBSR„SENDMSGSŠMOVEM.L�(A7)+,D0/A0ŠRTS*O******************************************************************************* * 11/07/846*ˆSYNTXERR�SENDS�'SYNTAX�ERROR�--�try‚?‚or�H�for�help'*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED*SYNTXERR:�EQU„*ŠMOVEM.L�A0/D0,-(A7)ŠLEA„SYNTMSG(PC),A0ŠMOVE.L�#SYNTMSGL,D0 ŠBSR„SENDMSGSŠMOVEM.L�(A7)+,D0/A0ŠRTSŠPAGE*O*********************************************************************************ˆHRDCPY�1.00�12/1/80�HBN6*O********************************************************************************E*ˆHRDCPY�SENDS�INPUT�LINE�IMAGE�TO�THE�LINE�PRINTER‚(IF�LP�SPECIFIED)*+*ˆON�ENTRY:�A0�->�INPUT�IOS�PARAMETER�BLOCK.*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED�EXCEPT�D0* HRDCPY„EQU„**(ŠTST.B‚CPYFLG-B(A5)‡HARD�COPY�REQUESTED?ŠBNE.S‚HRDCP05ŒBRANCH�IF�NOŠMOVEM.L�D1-D2/A1,-(A7) ŠBSR„INCLINE5ŠMOVE.W�#IOWRIT,IOSFCT(A0)�SET-UP�TO�WRITE�TO�PRINTERŠMOVE.B�#PRTLUN,IOSLUN(A0)%ŠMOVE.L�IOSSAD(A0),D0†SET�END�ADDRESSŠADD.L‚IOSLEN(A0),D0 ŠCMP.L‚IOSSAD(A0),D0†LENGTH�=�0?ŠBNE.S‚HRDCP0AŒNO"ŠMOVE.L�D0,A1ŽYES�-�OUTPUT�1�SPACEŠMOVE.B�#'�',(A1)ŠBRA.S‚HRDCP0BHRDCP0AƒSUB.L‚#1,D0HRDCP0BƒMOVE.L�IOSLEN(A0),D1ŠMOVE.L�IOSEAD(A0),D2ŠMOVE.L�D0,IOSEAD(A0) ŠIOSCALL�(A0)ŠBNE.S‚HRDCPER)HRDCP00ƒMOVE.B�#CDFLUN,IOSLUN(A0)�RESTOREŠMOVE.W�#IOREAD,IOSFCT(A0)ŠMOVE.L�D1,IOSLEN(A0)ŠMOVE.L�D2,IOSEAD(A0)ŠMOVEM.L�(A7)+,D1-D2/A1HRDCP05ƒCLR.L‚D0ŠRTS*HRDCPERƒBSR„PIOERMSŒSEND�PRINTER�ERROR�MSG6* IF PRINTER ERROR SOMETHING BESIDES 'NOT READY', QUIT HRDCPY05:ŠCMP.B‚#ISTANR,D0 ŠBNE„KILLREP'*œJMP�IF�SOMETHING�OTHER�THAN�NOT�READY$HRDCP10ƒERQ.DELAY�1500ŒDELAY�1.5�SEC ŠIOSCALL�(A0)!ŠBEQ„HRDCP00ŒTRY�TILL�ERROR� CLEAR‰CMP.B…#ISTABRK,D0 ‰BEQ‡BREAKREP*œJMP�IF�'BREAK'�REQUEST‰BRA.S…HRDCPY05*œCONTINUE�LOOPŠPAGE*O**********************************************************************************‡UPDBUF�1.00�6/27/80�HBN6*O********************************************************************************B*ˆUPDBUF�UPDATES�GIVEN�BUFFER�BY�PROCESSING�'UPDATE'�RESPONSE�LINED*ˆERROR�MESSAGE�IS�SENT�IF�TRY�TO�CHANGE�PAST�BUFFER�END�OR�GIVE�BAD*ˆINPUT*/*ˆON�ENTRY:�D2�=�OFFSET�TO�FIRST�BYTE�TO�CHANGE*’A1�=�START�OF�BUFFER5*’A2�=�FIRST�BYTE�NOT�TO�BE�CHANGED�(�END�OF�BUFFER�)-*’A3�=�ADDRESS�OF�INPUT�BUFFER�FOR�NEW�VALUES*—BUFFER�ENDS�WITH�CR*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED* UPDBUF„EQU„**)*ˆCHECK�NOT�TRYING�TO�CHANGE�INVALID�BYTE*)ŠMOVEM.L�D0-D2/A0-A4,-(A7)�SAVE�REGISTERS8ŠLEA„(A1,D2),A4‰STARTING�ADDRESS�FOR�BYTES�TO�BE�CHANGEDFUPDB00„CMP.L‚A2,A4…OFFSET�ERROR�IF�TRYING�TO�CHANGE�PAST�ALLOWED�RANGEŠBGE.S‚UPDB25�.**ˆGET�NEW�VALUE�FOR�NEXT�BYTE*(ŠMOVE.B�(A3)+,D0‹DONE�IF�CARRIAGE�RETURN ŠCMP.B‚#CR,D0ŠBEQ.S‚UPDBRT�DONE-ŠCMP.B‚#'.',D0ŒASCII�VALUE�STARTS�WITH�AN�'.'(ŠBEQ.S‚UPDB15�.�GO�GET�BYTE�THAT�FOLLOWS'ŠBSR„HEXBIN�HEX�VALUES,�GET�FIRST�DIGITŠBNE.S‚UPDB35�VALUE�ERROR(ŠMOVE.B�(A3)+,D0‹GET�SECOND�DIGIT�IF�ANYŠCMP.B‚#',',D0Œ..ŠBEQ.S‚UPDB20�ONE�DIGIT�ONLY,�GO�SET�NEW�VALUEŠCMP.B‚#CR,D0�.%ŠBEQ.S‚UPDB20�ONE�DIGIT�ONLY�AND�DONEŠLSL.L‚#4,D1ŽSAVE�4�HIGH�BITSŠMOVE.B�D1,D2Ž.ŠBSR„HEXBIN�CONVERT�LOWER�DIGITŠBNE.S‚UPDB35�VALUE�ERROR1ŠOR.BƒD2,D1ŽNOW�HAVE�2�DIGITS�CONVERTED�TO�BINARY**ˆCHECK�END�OF�FIELD*UPDB05„MOVE.B�(A3)+,D0ŠCMP.B‚#',',D0ŠBEQ.S‚UPDB20�OK ŠCMP.B‚#CR,D0ŠBNE.S‚UPDB35�ERRORŠBRA.S‚UPDB20�OK&UPDB15„MOVE.B�(A3)+,D1‹GET�ASCII�VALUEŠCMP.B‚#CR,D1�ERROR�IF�CR ŠBEQ.S‚UPDB35 ŠBRA„UPDB05�GO�FIND�END�OF�FIELD**ˆSET�NEW�VALUE*"UPDB20„MOVE.B�D1,(A4)+‹UPDATE�BYTEŠCMP.B‚#CR,D0�DONE?*ŠBNE„UPDB00�NO,�GO�GET�VALUE�FOR�NEXT�BYTE2UPDBRT„MOVEM.L�(A7)+,D0-D2/A0-A4�RESTORE�REGISTERSŠRTS%UPDB25„LEA„OFSMSG(PC),A0ŠOFFSET�ERRORŠMOVE.L�#OFSMSGL,D0UPDB30„BSR„SENDMSGS ŠBRA„UPDBRT$UPDB35„LEA„VALMSG(PC),A0ŠVALUE�ERRORŠMOVE.L�#VALMSGL,D0ˆ. ŠBRA„UPDB30ŠPAGE*O*********************************************************************************ˆCDIRNC�1.00�8/1/80�HBN6*O********************************************************************************B*ˆCDIRNC�CHECKS�COMMON�FIELDS�IN�DIRECTORY�ENTRY�FOR�NONCONTIGUOUS*ˆFILES*'*ˆON�ENTRY:�A2�=�PDB�ENTRY�BASE�ADDRESS**ˆON�RETURN:�Z�=�1�IF�ENTRY�OK"*—0�AND�D0�=�0�IF�SKIP/DELETE�FILE-*—0�AND�D0�=�1�IF�TO�REQUEST�UPDATE�PDB�ENTRY* CDIRNC„EQU„***ˆCHECK�DB�SIZE�IS�OK* ŠCLR.L‚D2ŠMOVE.B�DIRDAT(A2),D23ŠCMP.B‚#DATMIN-1,D2‡MUST�BE�AT�LEAST�MINIMUM�LENGTHŠBLS„CDRE01�ERROR�IF�LESS<ŠCMP.B‚DIRLBZ(A2),D2†LAST�DATA�BLOCK�MUST�BE�SAME�LENGTH�NOWŠBNE„CDRE05�ERROR+CDIR00„MOVE.L�D2,DBLEN-B(A5)…SAVE�DB�LENGTH**ˆCHECK�RECORD�LENGTH�IS�OK* ŠCLR.L‚D0ŠMOVE.W�DIRLRL(A2),D0*ŠMOVE.W�D0,RECLEN-B(A5)„SAVE�RECORD�LENGTHŠBEQ.S‚CDIR01�ZERO�IS�OK>ŠMULUƒD6,D2†MAKE�SURE�RECORD�SIZE�SUPPORTED�BY�DATA�BLOCK�SIZEŠCMP.L‚D2,D0Ž.ŠBHI„CDRE10�ERROR+ŠBTSTƒ#0,D0ŽODD�RECORD�LENGTH�IS�ERROR�ALSO ŠBNE„CDRE10�.**ˆCHECK�FAB�SIZE*CDIR01„CLR.L‚D2ŠMOVE.B�DIRFAB(A2),D2%ŠMOVE.L�D2,FABLEN-B(A5)„SAVE�FAB�SIZEŠBEQ„CDRE20�ERROR�IF�ZERO ŠCMP.B‚#20,D2ŠBHI„CDRE20�ERROR�IF�TOO�LARGE**ˆCHECK�DIREOR,�DIREOF*/CDIR05„MOVE.L�DIREOF(A2),D1†LSN�MUST�BE�ON�DISK>ŠBMI.S‚CDIR40‡-1�IS�OK�IF�DIREOR�IS�ALSO�-1,�AND�DIRFS=DIRFE=0ŠCMP.L‚MPSN-B(A5),D1†LSN�OK?ŠBHI.S‚CDRE00�ERROR�IN�EOFHCDIR10„MOVE.L�DIREOR(A2),D1„DIREOR�CANNOT�BE�NOW�-1,�ANYTHING�ELSE�IS�OKŠBMI.S‚CDRE00�ERRORŠPAGE*-*ˆCHECK�1ST�FAB�POINTER�IS�OK�(D2�=�FAB�SIZE)* CDIR15„EQU„*ŠMOVE.L�DIRFS(A2),D1EŠBEQ‚CDRE85�ERROR�IF�NONE�(DIREOR,�DIREOF�DIDN'T�INDICATE�EMPTY�FILE)ŠBSR„MPSNCŽCHECK�PSN�OKŠBHI„CDRE90�ERROR)ŠTST.B‚RCVFLG-B(A5)‡OK,�RECOVER�DEL�FILE?ŠBNE.S‚CDIR16�YES"ŠBSR „TSTALC�NO,�SECTORS�ALLOCATED?ŠBNE„CDRE50�NO,�ERRORŠBRA.S‚CDIR20�OK'CDIR16„BSR„TSTFRE�CHECK�NOT�REALLOCATEDŠBNE„CDRE100ŒERROR-CDIR20„BSR„TSTNYA�CHECK�NOT�ALREADY�ALLOCATEDŠBNE„CDRE55�ERROR**ˆDIRECTORY�ENTRY�IS�OK�SO�FAR*CDIROK„CLR.L‚D0‘DONEŠRTS***ˆDIREOF/DIREOR�AND�DIRFS/DIRFE�CONFLICT�?*CDIR40„ADD.L‚#1,D1Ž-1�IS�OKŠBNE.S‚CDRE00�ERROR;ŠMOVE.L�DIREOR(A2),D1†IF�DIREOF�=�-1�THEN�DIREOR�MUST�BE�-1 ŠADD.L‚#1,D1ŠBNE.S‚CDRE00�ERRORŠMOVE.B�#1,FILOK-B(A5)>ŠMOVE.L�DIRFS(A2),D0‡OK,�NOW�MUST�HAVE�NO�FAB'S�FOR�EMPTY�FILEŠOR.LƒDIRFE(A2),D0.ŠBEQ.S‚CDIRSKPŒFILE�ENTRY�OK,�SKIP�SINCE�EMPTY'ŠTST.L‚DIRFS(A2)ŠFIRST�FAB�POINTER�BAD?ŠBEQ„CDRE0C�YES#ŠCLR.B‚FILOK-B(A5)ˆFLAG�FILE�NOT�OK'CDRE00„LEA„EFCMSG(PC),A0ŠSEND�ERROR�MSGŠMOVE.L�#EFCMSL,D0 ŠBSR„SENDMSQC%ŠLEA„RECMSG(PC),A0ŠIN�NIM�RECALCULATEŠMOVE.L�#RECMSGL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠBEQ.S‚CDRE0A�REPAIR? ŠBSR„IM‘NOŠBEQ„CDIRUPDŒUPDATE�PDE�IN�IM,CDIRDS„BSR„DELFIL�IN�NIM�DELETE�OR�SKIP�FILE!CDIRSKPƒCLR.L‚D0‘FLAG�SKIP/DELETE ŠCMP.B‚#1,D0ŠRTSFCDRE0A„MOVE.B�#1,CNTFLG-B(A5)„UPDATE�DIREOF/DIREOR�AT�END�OF�FAB�CHECK#ŠCLR.L‚DIREOR(A2)‰SET�EMPTY�FOR�NOWŠCLR.L‚DIREOF(A2)‰.ŠMOVE.B�#1,PDBFLG-B(A5)ŠBRA„CDIR15�CONTINUE*2CDRE0B„CMP.B‚#FLOLNK,FABCHK-B(A5)�FORWARD�LINK�OK?ŠBEQ„CDRE00�YES,ŠLEA„EFCMSG(PC),A0ŠNO,�BOTH�LINKS�FAILED(=0)ŠMOVE.L�#EFCMSGL,D0 ŠBSR„SENDMSQC‹SEND�ERROR�MESSAGEŠLEA„RECMSG(PC),A0ŠMOVE.L�#RECMSGL,D0 ŠBSR„SENDMSG0ŠMOVE.L�#-1,DIREOR(A2)…SET�EMPTY�FILE�INDICATORSŠMOVE.L�#-1,DIREOF(A2)….)ŠMOVE.B�#1,PDBFLG-B(A5)„UPDATED�PDB�ENTRY ŠBRA„CDIRSKPŒNOW�SKIP�EMPTY�FILE*ACDRE0C„LEA„EFFMSG(PC),A0†EMPTY�FILE�BUT�LAST�FAB�POINTER�NOT�ZEROŠMOVE.L�#EFFMSGL,D0 ŠBSR„SENDMSQC ŠBNE„CDIRUPDŠBSR„ZROUTŽZERO�FAB�POINTER?ŠBNE„CDIRSKPŒNOŠCLR.L‚DIRFE(A2)ŠYESŠMOVE.B�#1,PDBFLG-B(A5)ŠMOVE.B�#1,FILOK-B(A5) ŠBRA„CDIRSKP**ˆER:�DIRDAT�SIZ�ERROR*CDRE01„LEA„DBZFLD(PC),A0 ŠMOVE.L�D2,D1 ŠBSR„BIN1HEXŠLEA„DBZMSG(PC),A0ŠMOVE.L�#DBZMSGL,D0 ŠBSR„SENDMSQC#ŠBNE„CDIRUPDŒUPDATE�PDB�ENTRY�IN�IM&ŠBRA„CDIRDS�DELETE�OR�SKIP�FILE�IN�NIM**ˆER:�DIRLBZ�<>�DIRDAT*CDRE05„LEA„LDBZMSG(PC),A0ŠMOVE.L�#LDBZMSGL,D0 ŠBSR„SENDMSGS ŠCLR.L‚D1ŠLEA„DBZFLD(PC),A0ŠMOVE.B�DIRDAT(A2),D1 ŠBSR„BIN1HEX$ŠLEA„DBZMS(PC),A0‹SEND�FILES�DB�SIZEŠMOVE.L�#DBZMSL,D0 ŠBSR„SENDMSQCŠBSR„SETEQL�SET�EQUAL?ŠBEQ.S‚CDRE06�YES ŠBSR„IM‘NO$ŠBEQ.S‚CDIRUPDŒIN�IM�UPDATE�PDE�LOOP#ŠBRA„CDIRDS�IN�NIM�DEL�OR�SKIP�FILECDRE06„MOVE.B�D2,DIRLBZ(A2)†FIXŠMOVE.B�#1,PDBFLG-B(A5)ŠBRA„CDIR00�CONTINUEŠPAGE**ˆER:�RECORD�LENGTH*CDRE10„LEA„RLEFLD(PC),A0 ŠMOVE.L�D0,D1 ŠBSR„BIN2HEXŠLEA„RLEMSG(PC),A0ŠMOVE.L�#RLEMSGL,D0CDRE11„BSR„SENDMSQC,ŠBNE.S‚CDIRUPDŒASK�TO�UPDATE�PDB�ENTRY�IN�IM&ŠBRA„CDIRDS�DELETE�OR�SKIP�FILE�IN�NIM**ˆER:�FAB�SIZE*CDRE20„LEA„FBZFLD(PC),A0 ŠMOVE.L�D2,D1 ŠBSR„BIN1HEXŠLEA„FBZMSG(PC),A0ŠMOVE.L�#FBZMSGL,D0 ŠBRA„CDRE11**ˆER:�FIRST�FAB�NOT�ALLOCATED*CDRE50„BSR„FABNALŠBEQ.S‚CDRE51�ALLOCATE�IN�NIMŠMOVE.L�FABLEN-B(A5),D0ŠMOVE.L�#'FAB�',PSNITM-B(A5) ŠBSR„DMPALCŠBEQ.S‚CDRE52�ALLOCATE�IN�IM?/CDIRUPDƒMOVE.B�#1,D0ŽNO,�REPEAT�UPDATE�PDE�LOOPŠRTS)CDRE51„MOVE.L�#'FAB�',ALCITM-B(A5)�IN�NIMŠMOVE.L�#ALCMSGL,D0ŠLEA„ALCMSG(PC),A0ŠBSR„SENDMSGŒSEND�ACTION�MSG'CDRE52„MOVE.L�SATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B�#1,SATFLG-B(A5)„.�FLAG�SAT�CHANGEDŠMOVE.L�#1,D0Ž. ŠBSR„ALDESCŠBRA„CDIR20�GO�ALLOCATE*!*ˆER:�FIRST�FAB�ALREADY�ALLOCATED*CDRE55„BSR.S‚FABALEŠBNE„CDIRUPDŒIN�IM‚UPDATE�PDE#ŠBRA„CDIRDS�IN�NIM�SKIP�OR�DEL�FILE*+*ˆDIRFS/DIRFE�ERROR�(DIREOR/DIREOF�.NE.�-1)*$CDRE85„TST.L‚DIRFE(A2)ŠANY�FAB�LINK?ŠBEQ.S‚CDRE91�NO.CDRE90„LEA„BFLPSN(PC),A0ŠYES,�BAD�FORWARD�LINK ŠBSR„BIN4HEXŠLEA„BFLMSG(PC),A0ŠMOVE.L�#BFLMSGL,D0 ŠBSR„SENDMSQCŠBNE„CDIRUPDŒIN�IM�UPDATE�PDE#ŠBRA„CDIRDS�IN�NIM�SKIP�OR�DEL�FILE*%CDRE91„LEA„NFLMSG(PC),A0ŠNO�FAB�LINKSŠMOVE.L�#NFLMSGL,D0 ŠBSR„SENDMSQCŠLEA„SFEMSG(PC),A0ŠMOVE.L�#SFEMSGL,D0ŠBSR„SENDMSGŒSET�EMPTYŠMOVE.L�#-1, DIREOR(A2)ŠMOVE.L�#-1,DIREOF(A2)ŠMOVE.B�#1,PDBFLG-B(A5) ŠBRA„CDIRSKP**ˆER:�FAB�SPACE�REALLOCATED*CDRE100ƒLEA„FADPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L�#'FAB�',FADITM-B(A5)ŠMOVE.L�#FADMSGL,D0ŠLEA„FADMSG(PC),A0 ŠBSR„SENDMSQCŠBRA„CDIRDS�SKIP�OR�DEL�FILEŠPAGE*O*********************************************************************************ˆFABALE�1.00�8/2/80�HBN6*O********************************************************************************2*ˆFABALE�SENDS�ERROR�MESSAGE�FAB�ALREADY�ALLOCATED**ˆON�ENTRY:�D1�=�PSN�OF�FAB**ˆON�RETURN:�A0,�D0�-�CHANGED *“Z�=�0�IF�IM *—1�IF�NIM*FABALE„LEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„ALEMSG(PC),A0ŠMOVE.L�#ALEMSGL,D0ŠMOVE.L�#'FAB�',ALEITM-B(A5) ŠBSR„SENDMSQCŠRTS*O*********************************************************************************ˆFABNAL�1.00�8/2/80�HBN6*O********************************************************************************.*ˆFABNAL�SENDS�ERROR�MESSAGE�FAB�NOT�ALLOCATED**ˆON�ENTRY:�D1�=�PSN�OF�FAB**ˆON�RETURN:�A0,�D0�-�CHANGED *“Z�=�0�IF�IM *—1�IF�NIM*FABNAL„LEA„NALPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L�#NALMSGL,D0ŠMOVE.L�#'FAB�',NALITM-B(A5) ŠBSR„SENDMSQCŠRTSŠPAGE*O*********************************************************************************ˆFDBCHK:�1.00�8/2/80�HBN6*O********************************************************************************E*ˆFDBCHK�CHECKS�FAB�AND�DATA�BLOCKS�FOR�ERRORS�AND�CORRECTS�PROBLEMS.D*ˆFAB�AND�DB�BUFFERS�ARE�ALLOCATED,�THEY�ARE�RELEASED�AT�END�OF�THIS *ˆSUBROUTINE.*3*ˆON�ENTRY:�A2�=�BASE�ADDRESS�OF�PDB�ENTRY�FOR�FILE!*ˆON�RETURN:�FILOK�=�1�IF�FILE�OK'*›0�IF�FILE�NOT�OK�(SKIPPED�OR�DELETED)*)*ˆREGISTER�USAGE:�A6�->�CURRENT�FAB�ENTRY*˜A4�->�DIR�ENTRY�FOR�FILE FDBCHK„EQU„***ˆINITIALIZE�FOR�NEW�FILE*ŠMOVEM.L�D0-D6/A0-A6,-(A7)*ŠMOVE.L�A2,A4ŽUSE�A4�FOR�DIR�ENTRY�POINTER?ŠCLR.L‚RECCNT-B(A5)†CLEAR�SECTOR�AND�RECORD�COUNTS�FOR�NEW�FILEŠCLR.L‚SECCNT-B(A5)4ŠCLR.B‚CNTFLG-B(A5)‡FLAG�NOT�TO�UPDATE�DIREOR/DIREOF ŠCLR.L‚PRVFAB-B(A5)‡NO�PRIOR�FABŠCLR.B‚DELNXF-B(A5)"ŠCLR.B‚DELPRI-B(A5)‡NO�FAB�DELETED/ŠCLR.L‚D1‘ZERO�OUT�PRIOR�FAB�KEY�SINCE�NONE�YETŠMOVE.B�DIRKEY(A4),D1†.ŠBEQ.S‚FDBC0Ž.�SKIP�IF�NO�KEYSŠLEA„PRIFKY(PC),A1Š. ŠBSR„CLRBUF�.*)*ˆALLOCATE�SEGMENT�FOR�FAB�AND�DB�BUFFERS*$FDBC0…MOVE.L�#FDBSEG,D0‰SEGMENT�NAME ŠMOVE.L�FABLEN-B(A5),D1„FAB�SIZE(ŠMOVE.L�D1,D2ŽGET�DB�BUFFER�STARTING�ADR ŠMULUƒD6,D2Ž.ŠMOVE.L�D2,DBBUF-B(A5)….3ŠADD.L‚DBLEN-B(A5),D1…GET�DB�BUFFER�PHYSICAL�LENGTHŠMOVE.L�D1,D2Ž. ŠMULUƒD6,D2Ž.8ŠMOVE.L�D2,D1Ž.�SAVE�TOTAL�BUFFER�BCT�FOR�GETSEG�REQUEST ŠSUB.L‚#1,D2ŠBSR„GETSEG�GET�SEGMENT(ŠMOVE.L�A1,FDBSTR-B(A5)„START�OF�SEGMENT ŠADD.L‚A1,D2ŠMOVE.L�D2,DBEND-B(A5) ŠMOVE.L�A1,D0ŠADD.L‚D0,DBBUF-B(A5)(ŠMOVE.L�DIRFS(A4),D1‡GET�1ST‚FAB�POINTERŠPAGE*2*ˆREAD�FIRST/NEXT�FAB�INTO�MEMORY�-�D1�=PSN�OF�FAB*ˆSET�FAB�UPDATE�BOUNDS*/FDBC00„TST.B‚DELNXF-B(A5)‡NEXT�FAB�WAS�DELETED?ŠBEQ.S‚FDBC01�NO4ŠCLR.B‚DELNXF-B(A5)‡YES,�THEN�FLAG�PRIOR�FAB�DELETED3ŠMOVE.B�#1,DELPRI-B(A5)„SO�BACKWARD�LINK�IS�UPDATED FDBC01„EQU„*&ŠCLR.L‚PRIFBE-B(A5)‡NO�PRIOR�FAB�ENTRY)ŠCLR.B‚DELCRI-B(A5)‡RESET�DELETE�FAB�FLAGŠMOVE.L�FABLEN-B(A5),D2ŠMOVE.L�D1,UPDSTR-B(A5)ŠMOVE.L�D1,UPDEND-B(A5)ŠADD.L‚D2,UPDEND-B(A5),ŠCLR.L‚D5‘FLAG�NOT�TO�TRUNCATE�OR�DELETE�FAB'ŠMOVE.L�D1,PSNFAB-B(A5)„NEW�CURRENT�FABŠMOVE.L�#'FAB�',IOERITM-B(A5)ŠBSR„GETSEC�READ�FABŠBEQ„FDBC10�OK8ŠMOVE.B�#1,FABFLG-B(A5)„IF�CRC�ERROR�TRY�TO�FIX�BY�WRITE ŠTST.B‚D0‘. ŠBEQ„FDBC10�.**ˆIO�ERROR�FROM�FAB�READ*FDBTR…CLR.B‚FABFLG-B(A5))ŠLEA„TRNMSG(PC),A0ŠTRUNCATE�OR�DELETE�FABŠMOVE.L�#TRNMSGL,D0ŠMOVE.L�#'FAB�',TRNITM-B(A5)8ŠMOVE.L�#1,D5ŽTRUNCATE�IF�COULDN'T�READ�FIRST�FAB�SECTORŠTST.L‚LSTSRD-B(A5)ŠBEQ.S‚FDBC05�TRUNCATE#ŠMOVE.L�#2,D5ŽDELETE‚FAB,�HAVE�LINKŠLEA„DELMSG(PC),A0ŠMOVE.L�#DELMSGL,D0ŠMOVE.L�#'FAB�',DELITM-B(A5)FDBC05„BSR„SENDMSQCŠBNE„FDBC20�UPDATE�IN�IM'ŠMOVE.B�#1 ,DELCRI-B(A5)„IN�NIM,�DELETE?ŠCMP.B‚#2,D5Ž.:ŠBEQ„FDBC60ˆYES,�GO‚DELETE�FAB�AFTER�NEXT�FAB�LINK�CHECKED*(*ˆTRUNCATE�FAB�CHAIN�-�PRIOR�FAB�IS�LAST* FDBCTR„EQU„*ŠCLR.B‚FABFLG-B(A5)%ŠMOVE.L�PRVFAB-B(A5),D1„GET�PRIOR�FABŠBEQ„FDBCT50ŒNONE0ŠMOVE.L�#1,D2ŽGET�1ST�SECTOR�ONLY�TO�UPDATE�LINKŠMOVE.L�FABBUF-B(A5),A1ŠMOVE.L�#'FAB�',IOERITM-B(A5) ŠBSR„GETSEC ŠBNE„TRMREP-ŠCLR.L‚FABFLK(A1)‰PRIOR�FAB�NOW�LAST�IN�CHAIN ŠBSR„WRITSEC ŠBNE„TRMREP òHûMZ N=I#Q+U3I;HCNKISS[RcYkbsV{MƒW‹Z“P›Y£[«,6ŠMOVE.L�D1,DIRFE(A4)‡UPDATE�DIR�ENTRY�LAST�FAB�POINTER3ŠMOVE.L�RECCNT-B(A5),DIREOR(A4)‚UPDATE�#�OF�RECORDS3ŠMOVE.L�SECCNT-B(A5),DIREOF(A4)‚UPDATE�#�OF�SECTORSŠMOVE.B�#1,PDBFLG-B(A5)*$FDBCOK„MOVE.B�#1,FILOK-B(A5)…FILE�OKFDBCSF„EQU„*’SKIP�FILE�RETURN*%*ˆMAKE�SURE�DB�AND�FAB�BUFFER�FLUSHED*ŠTST.B‚FABFLG-B(A5) ŠBEQ.S‚FDBCS0-ŠCLR.B‚FABFLG-B(A5)‡FAB�TO�BE�UPDATED�ON�DISK(ŠMOVE.L�FABBUF-B(A5),A1„BUFFER�START�ADRŠMOVE.L�PSNFAB-B(A5),D1„PSN ŠMOVE.L�FABLEN-B(A5),D2„FAB�SIZEŠMOVE.L�#'FAB�',IOERITM-B(A5) ŠBSR„WRITSECŠBNE„TRMREP�ERROR�-�QUIT�NOW&FDBCS0„BSR„UPDB�UPDATE�DB�IF�NECESSARY ŠBNE„TRMREP*&*ˆDEALLOCATE�FILE'S�BUFFERS�AND�RETURN*ŠMOVE.L�#FDBSEG,D0 ŠBSR„DELSEGŠMOVEM.L�(A7)+,D0-D6/A0-A6ŠRTS**ˆNO�FABS,�SET�FILE�EMPTY* FDBCT50ƒEQU„*ŠCLR.L‚DIRFE(A4)ŠCLR.L‚DIRFS(A4)ŠMOVE.L�#-1,DIREOR(A4)ŠMOVE.L�#-1,DIREOF(A4)ŠMOVE.B�#1,PDBFLG-B(A5) ŠBRA„FDBCOK*7*ˆTRUNCATE�FAB�CHAIN:�CURRENT�FAB�BECOMES�LAST�IN�CHAIN*#FDBCTC„CLR.L‚FABFLK(A1)‰NO�NEXT�FAB@ŠMOVE.L�PSNFAB-B(A5),DIRFE(A4)ƒSET�NEW�LAST�FAB�POINTER�INTO�DIRŠMOVE.B�#1,FABFLG-B(A5)ŠMOVE.B�#1,PDBFLG-B(A5)2ŠBRA„FDBC80�FILE�CHECK�DONE�AFTER�THIS�FAB�CHECKED**ˆUPDATE�FAB�LOOP* FDBC10„BSR„IMŠBNE„FDBC60�IN�NIM�CHECK�FAB-FDBC15„MOVE.L�PSNFAB-B(A5),D1„DUMP�ALL�OF�FABŠMOVE.L�FABBUF-B(A5),A1ŠMOVE.L�FABLEN-B(A5),D2 ŠBSETƒ#31,D2FDBC16:ƒMOVE.L�PSNFAB-B(A5),D3ŠMOVE.L�#'FAB�',PSNITM-B(A5) ŠBSR„DUMP"FDBC20„MOVE.L�#'�FAB',UPDITM-B(A5) ŠBSR„UPDATE*ŠDC.LƒFDBC60-B‹CRŠDC.LƒFDBC55-B‹N@ŠDC.LƒFDBC50-B„R�D5=0�IS�ERROR,D5=1�IF�TRUNCATE�(PRIOR�FAB�LAST)>*ŒD5=2�IF�DEL�CURRENT�FAB,�D5=3�IF�TRUNCATE�(CURRENT�FAB�LAST)*ŒD5=4�IF�DELETE�NEXT�FABŠDC.LƒFDBC30-B‹D�DELETE�FABŠDC.LƒFDBC25-B‹A�N/AŠDC.LƒTRMREP-B‹QŠDC.LƒFDBC45-B‹$PSN�IN�RANGEŠDC.LƒFDBC42-B‹$�DUMP�FAB ŠDC.LƒFDBC40-B‹$PSN�OUT�OF�RANGE<ŠDC.LƒFDBC25-B†D�PSN�-�DELETE�DATA�BLOCKƒ**�LATER�VERSION�**ŠDC.LƒFDBC25-B‹A�PSN�-�N/AŠDC.LƒFDBC45-B‹OFFSETŠDC.LƒFDBC56-B‹C ŠDC.LƒFDBSHL-B‹?�HELP�short�listŠDC.LƒFDBLHL-B‹H�HELP�long�listŠPAGE FDBSHL:ƒEQU„*<ŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�messagesŠLEA„HLPSMSG(PC),A1ŠMOVE.L�#HLPSMSGL,D2 ŠBRA.S‚FDBGOH FDBLHL:ƒEQU„*ŠMOVE.B�#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L�#HLPLMSGL,D2FDBGOH„BSR„GETHELP ŠBRA„FDBC15 ŠPAGE**ˆBAD�RESPONSE*FDBC25„BSR„RESPNA ŠBRA„FDBC20* *ˆDELETE�FAB*7FDBC30„MOVE.B�#1,DELCRI-B(A5)„GO�CHECK�NEXT�FAB�LINK�OK&ŠBRA„FDBC60�BEFORE�CURRENT�FAB�DELETED**ˆDELETE�DB�-�NEXT�VERSION*FDBC35„SUB.L‚#1,D2ŠBNE„FDBC25�CANNOT�GIVE�$PSN,N ŠCLR.L‚D0%ŠMOVE.L�FABBUF-B(A5),A6„FIND�DB�ENTRYŠLEA„FABPKY(A6),A6$ŠMOVE.B�(A6)+,D0‹SKIP�FAB�HEADER�KEY ŠADD.L‚D0,A6!FDBC36„CMP.L‚(A6),D1ŒFOUND�ENTRY?ŠBNE.S‚FDBC37�NO!ŠBSR„DELFBE�YES,�DELETE�FAB�ENTRYŠBEQ„FDBC20�DELETED�OK)ŠLEA„KEYMSG(PC),A0ŠKEY�ERROR�IN�FAB�ENTRYŠMOVE.L�#KEYMSGL,D0 ŠBSR„SENDMSGŠBRA„FDBC20�TRY�AGAINFDBC37„TST.L‚(A6)�END�OF�FAB?ŠBEQ„FDBC25�YES,�DB�NOT�FOUND)ŠLEA„FABKEY(A6),A6†GET�NEXT�ENTRY�POINTER&ŠCMP.L‚DBBUF-B(A5),A6…PAST�END�OF�FAB?ŠBGE„FDBC25�YES,�DB�NOT�FOUND0ŠMOVE.B�(A6),D0ŒNO,�SKIP�CURRENT�ENTRY�KEY�FIELD ŠADD.L‚D0,A6&ŠCMP.L‚DBBUF-B(A5),A6…PAST�END�OF�FAB?ŠBGE„FDBC25�YES,�DB�NOT�FOUNDŠBRA„FDBC36�NO,�CHECK�NEW�ENTRY **ˆDUMP�ANY�SECTOR�NOT�IN�FAB*FDBC40„MOVE.L�#'„',PSNITM-B(A5) ŠBSR„UPDSEC ŠBRA„FDBC20**ˆDUMP�OR�UPDATE�FAB*/FDBC41„MOVE.W�FABLEN+2-B(A5),D2‚DUMP�ALL�OF�FAB ŠBRA.S‚FDBC45FDBC42„TST.W‚D2‘N�GIVEN?ŠBEQ„FDBC41�NO,�DUMP�ALL�OF�FABŠCMP.W‚FABLEN+2-B(A5),D2 ŠBLE.S‚FDBC43ŠMOVE.W�#1,D2ŽDEFAULT�=1FDBC43„CLR.L‚D0 ŠMOVE.W�D2,D0 ŠSUB.L‚#1,D0ŠADD.L‚D0,D1ŽPSN�FOR�DUMP"ŠMOVE.W�#1,D2ŽDUMP�JUST�ONE�SECTORFDBC45„MOVE.L�FABBUF-B(A5),A1ŠTST.L‚D2‘DUMP?ŠBMI„FDBC16�YESFŠSUB.L�PSNFAB-B(A5),D1�UPDATE�SOME�SECTOR�IN�FAB,�GET�BUFFER�START�ADR ŠMULUƒD6,D1ŠLEA„(A1,D1),A1&ŠLEA„(A1,D6),A2‰END�ADDRESS�FOR�UPDATE ŠBSR„UPDBUFŠMOVE.B�#1,FABFLG-B(A5)ŠMOVE.L�FABBUF-B(A5),A1 ŠBRA„FDBC20**ˆR*%FDBC50„TST.L‚D5‘ANY�REPAIR�INDICATED?ŠBEQ„FDBC25�NO&ŠCMP.B‚#1,D5ŽTRUNCATE‚-�PRIOR�FAB�LASTŠBEQ„FDBCTR�YES)ŠCMP.B‚#3,D5ŽTRUNCATE�-�CURRENT�FAB�LAST?ŠBEQ„FDBCTC�YESŠCMP.B‚#4,D5ŽDEL�NEXT�FAB?ŠBEQ„FDBCDC�YES+ŠMOVE.B�#1,DELCRI-B(A5)„DELETE�CURRENT�FAB? ŠCMP.B‚#2,D53ŠBEQ.S‚FDBC60�YES,�DEL�FAB�AFTER�CHECK�FORWARD�LINK@ŠBRA„FDBC25ƒ(INTERNAL�ERROR�---�CHANGE�TO�OTHER�ERROR�MSG�LATER)**ˆN*/FDBC55„BSETƒ#STP1,D7‹TURN�IM�OFF�TILL�NEXT�FILE ŠCLR.B‚D7 ŠBRA.S‚FDBC60**ˆC*;FDBC56„BSETƒ#COPTION,D7ˆCHECK�ONLY�MODE�TILL�ERRROR�OR�DONE ŠCLR.B‚D7**ˆSTART�FAB�CHECK:*ˆCHECK�FAB�HEADER* FDBC60„EQU„***ˆCHECK�NEXT�FAB�LINK�-�0�IS�OK*ŠCLR.B‚FABERR-B(A5)ŠMOVE.L�FABBUF-B(A5),A1#ŠMOVE.L�FABFLK(A1),D1†ANY�NEXT�FAB?ŠBNE.S‚FDBC65�YES+ŠTST.B‚DELCRI-B(A5)‡NO,�DELETE�CURRENT�FAB?%ŠBNE.S‚FDBCDL�YES,�GO�DELETE�THIS�FAB4ŠMOVE.L�PSNFAB-B(A5),D1„CURRENT�FAB�IS�LAST�IN�CHAIN/ŠCMP.L‚DIRFE(A4),D1‡LAST�FAB�POINTER�OK�IN�DIR?ŠBNE„FDBE00�NO,�ERRORAŠBRA.S‚FDBC80„OK,�FILE�CHECK�DONE�AFTER�THIS�FAB�HAS�BEEN�CHECKED**ˆCHECK�NEXT�FAB�PSN�IS�OK*FDBC65„MOVE.L�FABLEN-B(A5),D2 ŠBSR„MPSNCŠBHI„FDBE10�ERROR**ˆCHECK�NEXT�FAB�ALLOCATION*ŠTST.B‚RCVFLG-B(A5)‡RECOVER?ŠBNE.S‚FDBC70�YESŠBSR„TSTALC�NO,�CHECK�ALLOCATED ŠBNE„FDBE20�ERROR,�NOT�ALLOCATED ŠBRA.S‚FDBC75.FDBC70„BSR„TSTFRE�TEST�SECTORS�NOT�REALLOCATED#ŠBNE„FDBE30�ERROR,�NOT�FREE�ANYMORE9FDBC75„BSR„TSTNYA�TEST�NOT�YET�ALLOCATED�TO�ANYTHING�ELSEŠBNE„FDBE40�ERROR**ˆNEXT�FAB�LINK�OK.*ˆDELETE�CURRENT�FAB?*0FDBC80„TST.B‚DELCRI-B(A5)‡FLAGGED�TO�DELETE�FAB?ŠBEQ„FDBC85�NOAFDBCDL„CLR.B‚FABFLG-B(A5)‡YES,�MAKE�SURE�WILL�NOT�UPDATE�THIS�ONEAŠMOVE.L�PRVFAB-B(A5),D1„GET�PRIOR�FAB'S�1ST�SECTOR�TO�UPDATE�LINKŠBEQ.S‚FDBCD1�NO�PRIOR�FAB(ŠBSR„WRTSBF�UPDATE�CURRENT�SECTOR�IF�NEC ŠBNE„TRMREPŠMOVE.L�D1,PSNSEC-B(A5)ŠLEA„SECBUF(PC),A1 ŠMOVE.L�#1,D2ŠMOVE.L�#'FAB�',IOERITM-B(A5) ŠBSR„GETSEC ŠBNE„TRMREPŠMOVE.L�FABBUF-B(A5),A0&ŠMOVE.L�FABFLK(A0),SECBUF+FABFLK-B(A5) ŠBSR„WRITSEC ŠBNE„TRMREPFDBCD0„MOVE.L�FABBUF-B(A5),A1ŠMOVE.L�FABFLK(A0),D1.ŠMOVE.B�#1,DELPRI-B(A5)„FLAG�PRIOR�FAB�DELETEDEŠMOVE.B�#1,CNTFLG-B(A5)�FLAG�TO�UPDATE�SEC/REC�COUNT�IN�DIR�WHEN�DONEŠBRA„FDBC00�PROCESS�NEXT�FAB:FDBCD1„MOVE.L�FABBUF-B(A5),A0„SET�NEW�FIRST�FAB�PSN�IN�DIRŠMOVE.B�#1,PDBFLG-B(A5)8ŠMOVE.L�FABFLK(A0),DIRFS(A4)�.�BECAUSE�DELETED�FIRST�FAB#ŠBNE„FDBCD0�PROCESS�NEXT�FAB�IF�ANY*ŠBRA„FDBCT50ŒNO�FABS�LEFT�-�SET�FILE�EMPTY**ˆDELETE�NEXT�FAB*%FDBCDC„BSR„WRTSBF�FLUSH�SECTOR�BUFFERŠBNE„TRMREP�QUIT�FOR�NOW.ŠLEA„SECBUF(PC),A1ŠREAD�1ST�SECTOR�OF�NEXT�FABŠMOVE.L�FABBUF-B(A5),A0„.ŠMOVE.L�FABFLK(A0),D1†.2ŠMOVE.L�D1,PSNSEC-B(A5)„.�CURRENT�SECTOR�IN�BUFFERŠMOVE.L�#1,D2Ž.ŠMOVE.L�#'FAB�',IOERITM-B(A5) ŠBSR„GETSEC�.ŠBNE„TRMREP�.�QUIT�IF�ERROR�NOW6* SET NEW FORWARD LINK INTO CURRENT FAB (=DEL NEXT FAGŠMOVE.B�#1,FABFLG-B(A5)ŠMOVE.L�FABFLK(A1),FABFLK(A0)ŠBNE.S‚FDBCC0�ANY�NEXT�FAB?FŠMOVE.L�PSNFAB-B(A5),DIRFE(A4)�NO,�SET�CURRENT�FAB�AS�LST�FAB�IN�CHAINŠMOVE.B�#1,PDBFLG-B(A5)„.EFDBCC0„MOVE.B�#1,DELNXF-B(A5)„FLAG�NEXT�FAB�DELETED�SO�KNOW�TO�UPDATEDŠMOVE.B�#1,CNTFLG-B(A5)‚FLAG�TO�UPDATE�SECTOR/RECORD�COUNT�WHEN�DONE'ŠBRA„FDBC60�.‚BACKWARD�LINK�IN�NEXT�FAB***ˆCHECK�BACKWARD�LINK�IS�OK�IN�CURRENT �FAB*FDBC85„TST.B‚DELPRI-B(A5) ŠBEQ.S‚FDBC87�PRIOR�FAB�DELETED?�HEADER�KEY'ŠLEA„PRIFKY(PC),A1ŠPRIOR�FAB'S�LAST�KEY ŠBSR„CHKKEYBŠBCS„FDBE70�ERROR�IF�HEADER�KEY�NOT�LESS�THAN�PRIOR�FAB'S�LAST�KEYFDBC92„MOVE.L�FABBUF-B(A5),A1**ˆIF�EMPTY�FAB�DELETE�IT*FDBC95„CLR.L‚D0ŠMOVE.B�DIRKEY(A4),D0+ŠLEA„FABPKY+1(A1,D0),A6�A6�->‚1ST�FAB�ENTRY.ŠTST.L‚(A6)�IF�STARTS�WITH�0�THEN�FAB�IS�EMPTYŠBEQ„FDBE80�EMPTY�FAB�ERROR*5*ˆCHECK�FIRST/NEXT�FAB�ENTRY:„A6�->�CURRENT�FAB�ENTRY*ˆCHECK�FAB�ENTRY�KEY�SIZE*%* MAKE SURE ANOTHER ENTRY FITS IN FABFDBC100ƒMOVE.L�FABLEN-B(A5),D1ŠMULUƒ#256,D1ŒGET�FAB�LENGTH)ŠADD.L‚FABBUF-B(A5),D1„D1=ENDING�ADDR.�+1ŠSUB.L‚#4,D1ŽADJUST�FOR�PSN ŠCMP.L‚D1,A6 ŠBHI„FDBC500!ŠMOVE.L�(A6),D1ŒPSN�OF�DATA�BLOCK<ŠBEQ„FDBC500‡DONE�WITH�FAB�-�NO�MORE�DATA�BLOCKS�IN�THIS�FABŠMOVE.B�DIRKEY(A4),D0+ŠCMP.B‚FABKEY(A6),D0†FAB�ENTRY�KEY�SIZE�OK?6ŠBNE„FDBE90�NO,�ERROR�NOW�IF�NOT�SAME�AS�FILE�KEY�SIZE**ˆCHECK�DB�PSN�OK*FDBC101ƒMOVE.L�DBLEN-B(A5),D2 ŠBSR„MPSNCŠBHI„FDBE100ŒERROR�-�BAD�DB�PSN**ˆCHECK�DB�ALLOCATION*ŠTST.B‚RCVFLG-B(A5)$ŠBNE.S‚FDBC105ŒRECOVER�DELETED�FILE?&ŠBSR„TSTALC�NO,�TEST�SECTORS�ALLOCATED)ŠBNE„FDBE110ŒERROR,�SECTORS�NOT�ALLOCATEDŠBRA.S‚FDBC110(FDBC105ƒBSR„TSTFRE�CHECK�NOT�REALLOCATEDŠBNE„FDBE120ŒERROR2FDBC110ƒBSR„TSTNYA�CHECK�SECTORS�NOT�YET�ALLOCATED ŠBNE„FDBE130*6*ˆREAD�IN�DB:�CHECK�DB�SECTOR-USAGE-COUNT�IN�FAB�IS�OK*FDBC120ƒCLR.L‚D0*ŠMOVE.B�FABSGS(A6),D0†GET�SECTOR�USE�COUNTŠBEQ„FDBE140ŒERROR�IF�01ŠCMP.B‚D2,D0ŽERROR�IF�NUMBER�GREATER�THAN�DB�SIZE ŠBHI„FDBE140)ŠMOVE.L�D0,D2ŽREAD�IN�ONLY�SECTORS�IN�USEŠMOVE.L�DBBUF-B(A5),A1,ŠMULUƒD6,D0ŽGET�LOGICAL�END�ADR�OF�DB�BUFFERŠADD.L‚A1,D0Ž. ŠSUB.L‚#1,D0ŠMOVE.L�D0,DBLEA-B(A5)….&ŠBSR„UPDB�UPDATE�PRIOR�DB�IF�NECESSARY ŠBNE„TRMREP)ŠMOVE.L�D1,PSNDB-B(A5)…SET�CURRENT�DB�PSNŠMOVE.L�D1,UPDSTR-B(A5)ŠMOVE.L�D1,UPDEND-B(A5)ŠADD.L‚D2,UPDEND-B(A5)#ŠCLR.B‚DBFLG-B(A5)ˆFLAG�NOT�UPDATED ŠBSR„GETSECŠBEQ.S‚FDBC130ŒOK�READ**ˆIO�ERROR�FROM�DB�READ*!ŠMOVE.B�#1,DBFLG-B(A5)…CRC�ERROR? ŠTST.L‚D06ŠBEQ.S‚FDBC130ŒYES,�IGNORE�ERROR�-�REWRITE�MAY�CURE�ITŠLEA„DELMSG(PC),A0ŠDELETE�DB?ŠMOVE.L�#DELMSGL,D0ŠMOVE.L�#'�DB�',DELITM-B(A5)ŠMOVE.L�#1,D4ŽFLAG�TO�DELETE�DB ŠBSR„SENDMSQC#ŠBNE.S‚FDBC150ŒIN�IM�UPDATE�DB�LOOPŠBSR„REPAIR�REPAIR�IN�NIM?ŠBNE„FDBCSF�NO,�SKIP�FILEFDBC125ƒMOVE.L�PSNDB-B(A5),D1ŠMOVE.L�DBLEN-B(A5),D2#ŠBSR„DEALLC�YES,�DEALLOCATE�SECTORS!ŠMOVE.L�A6,A0Ž.�FAB�ENTRY�POINTER%ŠBSR„DELFBE�AND�DELETE�DB'S�FAB�ENTRYDŠMOVE.B�#1,CNTFLG-B(A5)‚FLAG�TO�UPDATE�SECTOR/RECORD�COUNT�WHEN�DONE@ŠBRA„FDBC100ƒNEXT�FAB�ENTRY�AT�SAME�SPOT�NOW�WHEN�KEY�SIZES�SAMEŠPAGE**ˆUPDATE�DB�LOOP�IN�IM*FDBC130ƒBSR„IMŠBNE„FDBC200ŒIN�NIM�GO�CHECK�DB)ŠCLR.L‚D4‘FLAG�NO�REPAIR�FOR�'R'�RESPONSE-FDBC135ƒMOVE.L�PSNDB-B(A5),D3…DB�STARTING�PSNŠMOVE.L�DBBUF-B(A5),A1ŠMOVE.L�#'�DB�',PSNITM-B(A5)ŠBSR„DUMP�DUMP�DB"FDBC150ƒMOVE.L�#'‚DB',UPDITM-B(A5)ŠBSR„UPDATE�UPDATE�DB*ŠDC.LƒFDBC200-BŠCR&ŠDC.LƒFDBC199-BŠN�-�NIM�TILL�NEXT�FILEDŠDC.LƒFDBC190-B�R�DEL�DB�IF�D4�=�1,�TRUNCATE�IF�D4�=�2,�ELSE�'WHAT?'ŠDC.LƒFDBC125-BŠD�DEL�DBŠDC.LƒFDBC160-BŠA�N/AŠDC.LƒTRMREP-B‹Q#ŠDC.LƒFDBC170-BŠ$PSN�DUMP/UPDATE�DBŠDC.LƒFDBC180-BŠ$�DUMP�DB&ŠDC.LƒFDBC185-BŠDUMP�SECTORS�NOT�IN�DBŠDC.LƒFDBC160-BŠD�PSN�N/AŠDC.LƒFDBC160-BŠA�PSN�N/AŠDC.LƒFDBC170-BŠOFFSETŠDC.LƒFDBC198-BŠC!ŠDC.LƒFDBBSHL-BŠ?�HELP�short�list ŠDC.LƒFDBBLHL-BŠH�HELP�long�listŠPAGE FDBBSHL:‚EQU„*<ŠMOVE.B�#1,ASKCTFLG-B(A5)‚ask�to�continue�at�end�of�mess agesŠLEA„HLPSMSG(PC),A1ŠMOVE.L�#HLPSMSGL,D2ŠBRA.S‚FDBBGOH FDBBLHL:‚EQU„*ŠMOVE.B�#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L�#HLPLMSGL,D2FDBBGOHƒBSR„GETHELP ŠBRA„FDBC135 ŠPAGE*FDBC160ƒBSR„RESPNA�WHAT?ŠBRA„FDBC150ŒTRY�AGAIN* *ˆDUMP�DB*FDBC165ƒMOVE.L�DBLEN-B(A5),D2ŠBSETƒ#31,D2�DUMP�ALL�OF�DBFDBC170ƒMOVE.L�DBBUF-B(A5),A1 ŠTST.L‚D2ŠBMI„FDBC135ŒDUMPŠSUB.L‚PSNDB-B(A5),D1…UPDATE ŠMULUƒD6,D1$ŠLEA„(A1,D1),A1‰START�ADR�FOR�UPDATEŠLEA„(A1,D6),A2‰GET�END�ADR ŠBSR„UPDBUFŠMOVE.B�#1,DBFLG-B(A5)ŠMOVE.L�DBBUF-B(A5),A1#ŠBRA„FDBC150ŒREPEATE�UPDATE�REQUEST**ˆ$,N*FDBC180ƒTST.W‚D2ŠBEQ.S‚FDBC165ŒDUMP�DB‚(NO�N)$ŠCMP.W‚DBLEN+2-B(A5),D2ƒN�TOO�LARGE?ŠBLE.S‚FDBC181ŒNO!ŠMOVE.W�#1,D2ŽYES,�DEFAULT�TO�ONEFDBC181ƒCLR.L‚D0 ŠMOVE.W�D2,D0 ŠSUB.L‚#1,D0%ŠADD.L‚D0,D1ŽGET�STARTING�PSN�TO�DUMP ŠMOVE.W�#1,D2ŽONE�SECTOR�TO�DUMPŠBRA„FDBC170ŒDO�THE�DUMP**ˆDUMP�ANY�SECTOR�NOT�IN�DB* FDBC185ƒMOVE.L�#'„',PSNITM-B(A5) ŠBSR„UPDSEC ŠBRA„PDBC70**ˆR*#FDBC190ƒTST.L‚D4‘ANYTHING�TO�REPAIRŠBEQ„FDBC160ŒNOŠCMP.B‚#1,D4ŽYES,�DELETE‚DB?ŠBEQ„FDBC125ŒYES,�GO�DELETE*$*ˆTRUNCATE�DB�AFTER‚LAST�GOOD�RECORD*;FDBCTDBƒMOVE.L�LSTREC-B(A5),A3„DELETE�DB�IF�NO�GOOD�RECORDSŠCMP.L‚DBBUF-B(A5),A3ŠBEQ„FDBC125ŒGO�DELETE�DB!ŠMOVE.L�A3,D1ŽD2�=�BCT�LEFT�IN�DBŠSUB.L‚DBBUF-B(A5),D1….ŠADD.L‚#1,D1Ž.ŠMOVE.L�D1,D2Ž.ŠTST.W‚DIRLRL(A4)‰VRL?ŠBEQ.S‚FDBC194ŒYES*ŠTST.B‚(A3)+ŽPOINT�TO�BYTE�1�BEYOND�RECORD,ŠMOVE.W�DIRLRL(A4),D0†CALCULATE�#�OF�RECORDS ŠDIVUƒD0,D1Ž.FDBC192ƒMOVE.W�D1,FABREC(A6) ŠDIVUƒD6,D2ŽGET�NEW�SECTOR�COUNT ŠMOVE.W�D2,D0ŠSWAPƒD2 ŠTST.W‚D2ŠBEQ.S‚FDBC193 ŠADD.W‚#1,D0* ZERO OUT REMAINDER OF DB FDBC193ƒEQU„*FDBC193A‚CMP.L‚DBLEA-B(A5),A3ŠBHI.S‚FDBC193B ŠCLR.B‚(A3)+ŠBRA.S‚FDBC193AFDBC193B‚EQU„*4ŠMOVE.B�D0,FABSGS(A6)†NEW�#�OF�SECTORS�IN�USE�FOR�DB(ŠMOVE.B�#1,FABFLG-B(A5)„FLAG�FAB�CHANGED&ŠMOVE.B�#1,DBFLG-B(A5)…FLAG�DB�CHANGED ŠCLR.L‚D2 ŠMOVE.W�D1,D25ŠADD.L‚D2,RECCNT-B(A5)„ADD�REMAINING�RECORDS�TO�TOTAL ŠMOVE.W�D0,D2*ŠADD.L‚D2,SECCNT-B(A5)„UPDATE�SECTOR�COUNTDŠMOVE.B�#1,CNTFLG-B(A5)‚FLAG�TO�UPDATE�SECTOR/RECORD�COUNT�WHEN�DONEŠBRA„FDBC300ŒPROCESS�NEXT�DBKFDBC194ƒTST.B‚(A3)+�GET�A3->ING�TO�START�OF�NEXT�RECORD�RECORD�LENGTH�FIELD ŠCLR.L‚D0 ŠCLR.L‚D1ŠMOVE.L�DBBUF-B(A5),A1FDBC195ƒMOVE.W�(A1)+,D0 ŠADD.L‚D0,A1#ŠBTSTƒ#0,D0ŽODD�BYTE�RECORD�LENGTH?ŠBEQ.S‚FDBC196ŒNO"ŠADD.L‚#1,A1ŽYES,�SKIP�FILLER�BYTE5FDBC196ƒADD.L‚#1,D1ŽCOUNT�#�OF�RECORDS‚LEFT�IN�VRL�DB ŠCMP.L‚A1,A3 ŠBNE„FDBC195 ŠBRA„FDBC192**ˆC*?FDBC198ƒBSETƒ#COPTION,D7ˆSET�CHECK�ONLY�MODE�TILL�ERROR�OR�DONE ŠCLR.B‚D7ŠBRA.S‚FDBC200**ˆN*0FDBC199ƒBSETƒ#STP1,D7‹TURN�IM�OFF�TILL�NEXT�FILE ŠCLR.B‚D7ŠPAGE**ˆCHECK�DB�CONTENTS:*ˆCHECK�RECORD�COUNT�OK*FDBC200ƒCLR.L‚D0ŠMOVE.W�DIRLRL(A4),D0ŠBEQ.S‚FDBC210ŒVRL�FILE*?*ˆFRL�#�OF�RECORDS�SPECED�IN�FAB�MUST�FIT�INTO�DB�AND�REMAINING*ˆDB�SPACE�MUST�BE�ZERO* ŠCLR.L‚D1:ŠMOVE.W�FABREC(A6),D1†GET�BCT�NECESSARY�TO�SUPPORT�RECORDSŠMULUƒD1,D0Ž.�INTO�D0)ŠMOVE.L�DBLEA-B(A5),D1…GET�DB�BCT�INTO�D1ŠSUB.L‚DBBUF-B(A5),D1….ŠADD.L‚#1,D1Ž.ŠCMP.L‚D1,D0ŽRECORDS�FIT?ŠBHI„FDBE200ŒNO,�ERRORŠBEQ.S‚FDBC206ŒEXACT�FIT?+ŠSUB.L‚D0,D1ŽNO,�EXTRA�BYTES�SHOULD�BE�ZEROŠMOVE.L�DBBUF-B(A5),A1 ŠADD.L‚D0,A1FDBC205ƒTST.B‚(A1)+ŠBNE„FDBE200ŒERROR ŠSUB.L‚#1,D1 ŠBNE„FDBC205.FDBC206ƒCLR.L‚D1‘RECORD/SECTOR�COUNT�OK�IN�FABFŠMOVE.B�FABSGS(A6),D1�ACCOUNT�FOR�DB�SECTORS�AND�RECORDS�IN�TOTAL�COUNŠADD.L‚D1,SECCNT-B(A5)„.ŠMOVE.W�FABREC(A6),D1†.ŠADD.L‚D1,RECCNT-B(A5)„.!ŠBRA„FDBC241ŒGO�CHECK�KEYS�IF�ANY*#*ˆALL�VRL�RECORD�LENGTHS�MUST�BE�OK*FDBC210ƒCLR.L‚D0 ŠCLR.L‚D1 ŠCLR.L‚D3ŠMOVE.B�DIRKEY(A4),D3ŠMOVE.L�DBBUF-B(A5),A15ŠMOVE.L�A1,LSTREC-B(A5)„SAVE�IN�CASE�LAST�GOOD�RECORD,FDBC215ƒMOVE.W�(A1)+,D0‹GET�NEXT�RECORDS�BCTŠBEQ.S‚FDBC220ŒDONE-ŠCMP.L‚D3,D0ŽCHECK�LONG�ENOUGH�TO�SUPPORT�KEYŠBLT„FDBE220ŒERROR#ŠADD.L‚#1,D1ŽINCREMENT�RECORD�COUNT)ŠMOVE.L�A1,D2Ž(SAVE�TO�CHECK�NO�OVERFLOW) (ŠLEA„-1(A1,D0),A1‡A1->END�OF�THIS�RECORDŠBTSTƒ#0,D0ŽODD�BCT?ŠBEQ.S‚FDBC216ŒNO"ŠADD.L‚#1,A1ŽYES,�SKIP�FILLER�BYTEFDBC216ƒCMP.L‚DBLEA-B(A5),A16ŠBGT„FDBE220ŒERROR�IF�RECORD�WOULD�GET�PAST�BUFFER�ENDŠCMP.L‚D2,A1Ž.�OVERFLOW?ŠBLS„FDBE220Œ.�YES=ŠMOVE.L�A1,LSTREC-B(A5)„SAVE�FOR‚LAST�GOOD�RECORD�END�POINTER ŠTST.B‚(A1)+"ŠCMP.L‚DBLEA-B(A5),A1…NEXT�RECORD?ŠBLT„FDBC215ŒYES,�GO�CHECK�IT3ŠBRA.S‚FDBC225ŒNO,�DONE�WITH�DB,�RECORD�BCTS�ARE�OK*'*ˆCHECK�VRL�RECORD�COUNT�SAME�AS�IN�FAB*:*ˆCHECK�BALANCE�OF�DATA�BLOCK�AFTER�LAST�RECORD�FOR�ZEROES** 4FDBC220ƒSUB.L‚#3,A1ŽGET�LAST�GOOD�RECORD�END�POINTERŠMOVE.L�A1,LSTREC-B(A5)„. ‰TST.B…(A1)+1*œA1=ADDRESS�+�1�OF�LAST�CHARACTER�IN�LAST�RECORD*®FOR�THIS�DATA�BLOCKFDBC222:‰CMP.L…DBLEA-B(A5),A1‰BHI.S…FDBC223'*œJMP�IF�BALANCE�OF�DATA�BLOCK�IS�ZEROS ‰TST.B…(A1)+‰BEQ.S…FDBC222*œJMP�IF�THIS�DATA�BYTE�IS�ZERO ‰BRA‡FDBE210-*œDATA�EXIST�BEYOND�LAST�REOCRD�IN�DATA�BLOCKFDBC223:‰MOVE.L„LSTREC-B(A5),A1$*œRESTORE�REGISTER�TO�ORIGINAL�VALUEFDBC225ƒCMP.W‚FABREC(A6),D1ŠBEQ.S‚FDBC230ŒOK$ŠMOVE.L�D1,D2ŽSAVE�NUMBER�OF�RECORDS!ŠLEA„FDRPSN(PC),A0ŠSEND�ERROR�MSGŠMOVE.L�PSNDB-B(A5),D1 ŠBSR„BIN4HEXŠLEA„FDRMSG(PC),A0ŠMOVE.L�#FDRMSGL,D0 ŠBSR„SENDMSQC,ŠLEA„RECMSG(PC),A0ŠSAY�THAT�WILL�RECALCULATEŠMOVE.L�#RECMSGL,D0 ŠBSR„SENDMSG*ŠMOVE.W�D2,FABREC(A6)†FORCE�CORRECT�NUMBER"ŠMOVE.L�D2,D1ŽRESTORE�#�OF�RECORDSŠMOVE.B�#1,FABFLG-B(A5)DŠMOVE.B�#1,CNTFLG-B(A5)‚FLAG�TO�UPDATE�SECTOR/RECORD�COUNT�WHEN�DONE>FDBC230ƒADD.L‚D1,RECCNT-B(A5)„ADD�DB'S�RECORDS�TO�RECORD�COUNT ŠCLR.L‚D2.ŠMOVE.L�LSTREC-B(A5),D0„CALCULATE�SECTOR�COUNTŠSUB.L‚DBBUF-B(A5),D0‹.ŠADD.L‚#1,D0Ž. ŠDIVUƒD6,D0Ž. ŠMOVE.W�D0,D2ŠSWAPƒD0 ŠTST.W‚D0ŠBEQ.S‚FDBC235 ŠADD.W‚#1,D2=FDBC235ƒCMP.B‚FABSGS(A6),D2†CHECK�IF�IT�IS�THE�SAME�AS�IN�FABŠBEQ.S‚FDBC240ŒOK!ŠLEA„FDSPSN(PC),A0ŠSEND�ERROR�MSGŠMOVE.L�PSNDB-B(A5),D1 ŠBSR„BIN4HEX,ŠLEA„FDSMSG(PC),A0ŠSAY�THAT�WILL�RECALCULATEŠMOVE.L�#FDSMSGL,D0 ŠBSR„SENDMSQCŠLEA„RECMSG(PC),A0ŠMOVE.L�#RECMSGL,D0 ŠBSR„SENDMSG/ŠMOVE.B�D2,FABSGS(A6)†FORCE�PROPER�SECTOR�COUNTŠMOVE.B�#1,FABFLG-B(A5)DŠMOVE.B�#1,CNTFLG-B(A5)‚FLAG�TO�UPDATE�SECTOR/RECORD�COUNT�WHEN�DONE?FDBC240ƒADD.L‚D2,SECCNT-B(A5)„ADD�SECTORS�TO�TOTAL�SECTOR�COUNT**ˆCHECK�KEYS�IN�ASCENDING�ORDER*FDBC241ƒTST.B‚DIRKEY(A4)(ŠBEQ„FDBC300ŒNOTHING�TO�CHECK�IF�NO�KEYSŠMOVE.L�DBBUF-B(A5),A1,ŠMOVE.W�FABREC(A6),D3†GET�#�OF�RECORDS�IN�DB ŠCLR.L‚D0 ŠCLR.L‚D1 ŠCLR.L‚D2ŠMOVE.W�DIRLRL(A4),D2ŠMOVE.B�DIRKEY(A4),D04ŠMOVE.L�A1,LSTREC-B(A5)„SAVE�IN�CASE�NO‚GOOD�RECORDS9* SET UP POINTER TO LAST RECORD KEY IN CASE ONLY 1 RECORD ŠMOVE.L�A1,A0ŠTST.W‚D2‘VRL?ŠBNE.S‚FDBC243ŒNO'ŠADD.L‚#2,A0ŽYES�-�SKIP�OVER�BYTE�COUNTFDBC243ƒMOVE.L�A0,LASTKY-B(A5)%FDBC245ƒSUB.W‚#1,D3ŽANY�MORE�RECORDS?ŠBEQ.S‚FDBC255ŒNO&ŠTST.W‚D2‘YES,�GET�NEXT�RECORD�POINTERŠBEQ.S‚FDBC250ŒVRL-ŠLEA„(A1,D2.L),A0‡NEXT�RECORD�POINTER�FOR�FRLŠBRA.S‚FDBC251FDBC250ƒMOVE.W�(A1)+,D1&ŠBEQ.S‚FDBC255ŒDONE�IF�NO�MORE�RECORDSŠLEA„(A1,D1.L),A0ŠBTSTƒ#0,D1ŽODD�RECORD�BCT?ŠBEQ.S‚FDBC251ŒNO"ŠADD.L‚#1,A0ŽYES,�SKIP�FILLER�BYTEFDBC251ƒTST.W‚D2‘GET�A0�->�KEYŠBNE.S‚FDBC253ŒFRL*ŠADD.L‚#2,A0ŽVRL,�SKIP�RECORD�LENGTH�FIELD8FDBC253ƒMOVE.L�A0,LASTKY-B(A5)„SAVE�FOR�LAST�KEY�POINTER ŠBSR„CHKKEY.ŠBCS„FDBE250ŒERROR�IF�NEXT�KEY�LESS�THAN�PRIORŠBNE.S‚FDBC252ŒOK#ŠTST.B‚KEYDUP-B(A5)‡DUPLICATE�KEYS?ŠBEQ„FDBE250ŒERROR�IF�NOTFDBC252ƒTST.W‚D2ŠBNE.S‚FDBC2541ŠSUB.L‚#2,A0Ž(GET�A0�->ING�TO�1ST�BYTE�OF�RECORD)8FDBC254ƒMOVE.L�A0,A1ŽOK�IF�EQUAL�KEYS�AND�DUPL.�KEY�FILE*ŠSUB.L‚#1,A1ŽSAVE�PRIOR�RECORD�END�POINTER0ŠMOVE.L�A1,LSTREC-B(A5)„IN�CASE�HAVE�TO�TRUNCATE ŠMOVE.L�A0,A1 ŠBRA„FDBC245*#*ˆCHECK�FAB�KEY�.GE.�LAST�KEY�IN�DB*FDBC255ƒLEA„FABKEY+1(A6),A0)ŠMOVE.L�LASTKY-B(A5),A1„A1�->�LAST�DB�KEY ŠBSR„CHKKEY ŠBCS„FDBE270*:*ˆCHECK�PRIOR�FAB�ENTRY�KEY�NOT�GREATER�THAN�1ST�KEY�IN�DB*FDBC260ƒMOVE.L�PRIFBE-B(A5),A1 ŠCMP.L‚#0,A1#ŠBEQ.S‚FDBC300ŒNONE�SO�DONE�WITH�DB2ŠLEA„FABKEY(A1),A1†A1�->�FAB�ENTRY'S�KEY�FIELD�BCT ŠMOVE.B�(A1)+,D0‹GET�KEY�LENGTH7ŠMOVE.L�A6,PRIFBE-B(A5)„SET�NEW�PRIOR�FAB�ENTRY�POINTERŠMOVE.L�DBBUF-B(A5),A0ŠTST.W‚DIRLRL(A4)‰VRL?ŠBNE.S‚FDBC265ŠTST.W‚(A0)+ŽSKIP�RECORD�BCTFDBC265ƒBSR„CHKKEY�CHECK�KEYS ŠBCS„FDBE280ŠBNE.S‚FDBC300ŠTST.B‚KEYDUP-B(A5) ŠBEQ„FDBE280**ˆCHECK�NEXT�DB* FDBC300ƒEQU„*@ŠMOVE.L�A6,PRIFBE-B(A5)„CURRENT�FAB�ENTRY�IS�PRIOR�FAB�ENTRY�NOW5ŠLEA„FABKEY(A6),A6†GET�NEXT�FAB�ENTRY�ADDRESS�INTO�A0 ŠCLR.L‚D0ŠMOVE.B�(A6)+,D0 ŠADD.L‚D0,A6ŠBRA„FDBC100ŒGO�CHECK�NEXT�DBŠPAGE*/*ˆDONE�WITH�THIS�FAB,�PREPARE�TO�CHECK�NEXT�FAB* FDBC500ƒEQU„**)*ˆCHECK�FAB�NOT�EMPTY,�DELETE�IT�IF�IT�IS*ŠMOVE.L�FABBUF-B(A5),A1ŠLEA„FABPKY(A1),A1 ŠCLR.L‚D0ŠMOVE.B�(A1)+,D0 ŠADD.L‚D0,A1 ŠTST.L‚(A1)#ŠBEQ„FDBCDL�EMPTY�FAB,�GO�DELETE�IT**ˆSAVE�FAB'S�LAST�KEY*ŠMOVE.B�DIRKEY(A4),D0ŠBEQ.S‚FDBC510ŒSKIP�IF�NO�KEYSŠMOVE.L�PRIFBE-B(A5),A0ŠLEA„FABKEY+1(A0),A0ŠLEA„PRIFKY(PC),A1FDBC505ƒMOVE.B�(A0)+,(A1)+ ŠSUB.B‚#1,D0 ŠBNE„FDBC505*&*ˆWRITE�CURRENT�FAB�TO�DISK�IF�CHANGED)*ˆ(CALCULATE�OR�CHECK�FAB�USAGE�FRACTION)** UPDATE LAST DB IF CHANGEDFDBC510ƒBSR„UPDBŠMOVE.L�FABBUF-B(A5),A1 ŠCLR.L‚D0=ŠMOVE.L�PRIFBE-B(A5),A0„GET�FAB�SECTOR�USAGE�FRACTION�INTO�D0)ŠLEA„FABKEY(A0),A0†.�GET�A0�->�END�OF�FABŠMOVE.B�(A0)+,D0‹.ŠLEA„(A0,D0),A0‰.ŠSUB.L‚A1,A0Ž.,ŠMOVE.B�DIRFAB(A4),D0†.�GET‚FAB�SECTOR�COUNTŠMULUƒ#256/16,D0‰.ŠMOVE.L�A0,D1Ž. ŠDIVUƒD0,D1Ž.ŠMOVE.B�D1,D0Ž. ŠSWAPƒD1‘. ŠTST.W‚D1‘.ŠBEQ.S‚FDBC511Œ.ŠADD.B‚#1,D0Ž.'FDBC511ƒTST.B‚FABFLG-B(A5)‡FAB�CHANGED?&ŠBNE.S‚FDBC512ŒYES,�FORCE�PROPER�VALUE3ŠCMP.B‚FABUSE(A1),D0†NO,�CHECK�CORRECT�VALUE�IN�FABŠBNE„FDBE310ŒERRORŠBRA.S‚FDBC515ŒOK>FDBC512ƒMOVE.B�D0,FABUSE(A1)†SET�PROPER�VALUE�IN�TO�FAB�HEADERŠMOVE.B�#1,FABFLG-B(A5) FDBC515ƒEQU„*ŠMOVE.L�PSNFAB-B(A5),D1(ŠTST.B‚FABFLG-B(A5)‡WRITE�FAB�IF�CHANGEDŠBEQ.S‚FDBC520ŒNOT�CHANGEDŠMOVE.L�FABLEN-B(A5),D2ŠMOVE.L�#'FAB�',IOERITM-B(A5) ŠBSR„WRITSEC ŠBNE„TRMREPŠCLR.B‚FABFLG-B(A5)FDBC520ƒMOVE.L�D1,PRVFAB-B(A5)#ŠMOVE.L�FABFLK(A1),D1†NEXT�FAB�LINK!ŠBNE„FDBC00�CHECK�NEXT�FAB�IF�ANY**ˆDONE�-�LAST�FAB�CHECKED*<ŠMOVE.L�PRVFAB-B(A5),D0„MAKE�SURE�LAST�FAB�POINTER�OK�IN�DIRŠCMP.L‚DIRFE(A4),D0ŠBEQ.S‚FDBC521ŒOK!ŠMOVE.L�D0,DIRFE(A4)‡NOT�OK�-�FIX0ŠMOVE.B�#1,PDBFLG-B(A5)„FLAG�TO�UPDATE�DIRECTORYEFDBC521ƒSUB.L‚#1,RECCNT-B(A5)„GET�EOF‚LOGICAL�RECORD�NUMBER�AS�IN�DIR>ŠSUB.L‚#1,SECCNT-B(A5)„GET�EOF‚LOGICAL�SECTOR�NUMBER�AS�IN�DIR7FDBC525ƒTST.B‚CNTFLG-B(A5)‡UPDATE�RECORD/SECTOR�COUNTS?ŠBNE.S‚FDBC530ŒYES/ŠMOVE.L�RECCNT-B(A5),D0„NO,�CHECK�THEM�TO�MATCHŠCMP.L‚DIREOR(A4),D0 ŠBNE„FDBE300ŠMOVE.L�SECCNT-B(A5),D0ŠCMP.L‚DIREOF(A4),D0ŠBNE„FDBE300ŒERRORŠBRA.S‚FDBC540ŒOK&FDBC530ƒMOVE.L�RECCNT-B(A5),DIREOR(A4)ŠMOVE.L�SECCNT-B(A5),DIREOF(A4)ŠMOVE.B�#1,PDBFLG-B(A5)FDBC540ƒBRA„FDBCOK�DONEŠPAGE**ˆFAB/DB�ERROR�HANDLING* FDBE00„EQU„**'*ˆER:�FAB�LINK�=�0,�LAST�FAB�PSN�NOT�OK*ŠLEA„BFLMSG(PC),A0ŠMOVE.L�#'0000',D0ŠMOVE.L�D0,BFLPSN-B(A5)ŠMOVE.L�D0,BFLPSN+4-B(A5)ŠMOVE.L�#BFLMSGL,D0 ŠBSR„SENDMSGS.ŠMOVE.L�DIRFE(A4),D1‡GET�LAST�FAB�PSN�FROM�DIRŠLEA„LFPPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„LFPMSG(PC),A0ŠMOVE.L�#LFPMSGL,D0 ŠBSR„SENDMSQCŠLEA„TRNMSG(PC),A0ŠTRUNCATE�FABŠMOVE.L�#TRNMSGL,D0ŠMOVE.L�#'FAB�',TRNITM-B(A5) ŠBSR„SENDMSQC ŠBEQ.S‚FDBE01�IN�NIM�GO�TRUNCATE ŠBSR„REPAIR�IN�IM�ASK�PERMISSION&ŠBNE„FDBC20�NO,�REPEAT�FAB‚UPDATE�LOOP>FDBE01„MOVE.L�PSNFAB-B(A5),DIRFE(A4)ƒSET�LAST�FAB�PSN�INTO�DIRŠMOVE.B�#1,PDBFLG-B(A5)'ŠBRA„FDBC80�DONE�AFTER�THIS�FAB�CHECKED**ˆER:�BAD�FORWARD�FAB�LINK* FDBE10„EQU„**ŠBSR„FABERM�CHECK�FOR�MAX�FAB�ERROR�IN�NIMŠLEA„BFLPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„BFLMSG(PC),A0ŠMOVE.L�#BFLMSGL,D0ŠBSR„SENDMSQC‹SEND�ERROR�MSG"ŠTST.B‚DELCRI-B(A5)‡TO�DELETE�FAB?(ŠBNE„FDBCTR�YES,�NOW�WILL�TRUNCATE�CHAIN5ŠMOVE.L�#3,D5ŽFLAG�TO�TRUNCATE�FAB�(CURRENT�FAB�LAST)ŠLEA„TRNMSG(PC),A0ŠTRUNCATE�FABŠMOVE.L�#TRNMSGL,D0ŠMOVE.L�#'FAB�',TRNITM-B(A5) ŠBSR„SENDMSQC(ŠBNE„FDBC20�IN�IM�REPEAT�UPDATE�FAB� LOOP%ŠBRA„FDBCTC�IN�NIM�TRUNCATE�FAB�CHAIN**ˆER:�FAB�NOT�ALLOCATED*FDBE20„LEA„NALPSN(PC),A0*ŠBSR„FABERM�CHECK�FOR�MAX�FAB�ERROR�IN�NIM ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L�#'FAB�',NALITM-B(A5)ŠMOVE.L�#NALMSGL,D0 ŠBSR„SENDMSQC"ŠBEQ.S‚FDBE21�IF�NIM�THEN�ALLOCATEŠMOVE.L�D2,D0ŽIN�IM�ASKŠMOVE.L�#'FAB�',PSNITM-B(A5) ŠBSR„DMPALCŠBEQ.S‚FDBE22�YES,�ALLOCATE&ŠBRA„FDBC20�NO,�REPEAT�UPDATE�FAB�LOOP(FDBE21„LEA„ALCMSG(PC),A0ŠALLOCATE�IN�NIMŠMOVE.L�#'FAB�',ALCITM-B(A5)ŠMOVE.L�#ALCMSGL,D0 ŠBSR„SENDMSG'FDBE22„MOVE.L�SATDBUF-B(A5),A0ƒALLOCATEŠMOVE.B�#1,SATFLG-B(A5) ŠMOVE.L�#1,D0 ŠBSR„ALDESC ŠBRA„FDBC75*(*ˆER:�FAB�REALLOCATED�AFTER�FILE�DELETED*FDBE30„LEA„FADPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L�#'FAB�',FADITM-B(A5)ŠLEA„FADMSG(PC),A0ŠMOVE.L�#FADMSGL,D0 ŠBSR„SENDMSQC ŠMOVE.L�A4,A2 ŠBSR„DELFILŠBRA„FDBCSF�SKIP�OR�DEL�FILE*!*ˆER:�FAB�SPACE�ALREADY�ALLOCATED*FDBE40„LEA„ALEPSN(PC),A0*ŠBSR„FABERM�CHECK�FOR�MAX�FAB�ERROR�IN�NIMŠMOVE.L�D0,D2ŽSAVE�STATUS ŠBSR„BIN4HEXŠLEA„ALEMSG(PC),A0ŠMOVE.L�#'FAB�',ALEITM-B(A5)ŠMOVE.L�#ALEMSGL,D0 ŠBSR„SENDMSQC5ŠMOVE.L�#4,D5ŽDEL�NEXT�FAB�IF�1ST�SCTOR�NOT�ALLOCATEDŠMOVE.L�#'FAB�',DELITM-B(A5)ŠLEA„DELMSG(PC),A0ŠMOVE.L�#DELMSGL,D0ŠTST.L‚D2‘1ST�SECTOR�ALLOCATED?ŠBPL.S‚FDBE41�YES,�DEL�NEXT�FAB9ŠMOVE.L�#3,D5�NO,�TRUNCATE�-�CURRENT�FAB�IS�LAST�IN�CHAINŠLEA„TRNMSG(PC),A0ŠMOVE.L�#'FAB�',TRNITM-B(A5)ŠMOVE.L�#TRNMSGL,D0FDBE41„BSR„SENDMSQC(ŠBNE„FDBC20�IN�IM�REPEAT�UPDATE�FAB�LOOP'ŠCMP.B‚#3,D5ŽIN�NIM�REPAIR�AS�INDICATEDŠBEQ„FDBCTC�TRUNCATE?ŠBRA„FDBCDC�NO,�DELETE�NEXT�FAB**ˆER:�BACKWARD�LINK*FDBE50„MOVE.L�FABBLK(A1),D1*ŠBSR„FABERM�CHECK�FOR�MAX�FAB�ERROR�IN�NIMŠLEA„BBLPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„BBLMSG(PC),A0ŠMOVE.L�#BBLMSGL,D0 ŠBSR„SENDMSGS,ŠMOVE.L�PRVFAB-B(A5),D1„SEND�PRIOR�FAB'S�PSNŠLEA„PFPPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„PFPMSG(PC),A0ŠMOVE.L�#PFPMSGL,D0 ŠBSR„SENDMSQC#ŠLEA„FXLMSG(PC),A0ŠREPAIR:�FIX�LINKŠMOVE.L�#FXLMSGL,D0 ŠBSR„SENDMSQCŠBEQ„FDBC86�IN�NIM�FIXŠBSR„REPAIR�IN�IM�ASK�FIRSTŠBNE„FDBCSF�SKIP�FILEŠBRA„FDBC86�FIX�ALSO**ˆER:�KEY�SIZE�IN�FAB�HEADER*FDBE60„LEA„KEYFLD(PC),A0*ŠBSR„FABERM�CHECK�FOR�MAX�FAB�ERROR�IN�NIM ŠMOVE.B�D0,D1 ŠBSR„BIN1HEXŠMOVE.B�#'H',KEYATR-B(A5)ŠLEA„KEYMSG(PC),A0ŠMOVE.L�#KEYMSGL,D0 ŠBSR„SENDMSQCŠLEA„SEQMSG(PC),A0ŠMOVE.L�#SEKMSGL,D0 ŠBSR„SENDMSQCŠBEQ.S‚FDBE61�FORCE�SAME�IN�NIMŠBSR„REPAIR�IN�IM�ASK ŠBEQ.S‚FDBE61(FDBESK„MOVE.L�A4,A2ŽNO,�DEL�OR�SKIP�FILE ŠBSR„DELFIL ŠBRA„FDBCSFIFDBE61„MOVE.B�DIRKEY(A4),FABPKY(A1)�FORCE�FILE'S�KEY�SIZE�INTO�FAB�HEADERŠMOVE.B�#1,FABFLG-B(A5)ŠBRA„FDBC91�CONTINUE*.*ˆER:�HEADER�KEY�LESS�THAN�LAST�FAB'S�LAST�KEY*+FDBE70„MOVE.L�A0,A2ŽSAVE�HEADER�KEY�POINTER*ŠBSR„FABERM�CHECK�FOR�MAX�FAB�ERROR�IN�NIMŠLEA„FDKMSG(PC),A0ŠMOVE.B�#'H',FDKATR-B(A5)ŠMOVE.L�#FDKMSGL,D0 ŠBSR„SENDMSQCŠLEA„RECMSG(PC),A0ŠMOVE.L�#RECMSGL,D0 ŠBSR„SENDMSQCŠBNE.S‚FDBE71�NIM:�SET�EQUAL ŠBSR„REPAIR/ŠBNE„FDBESK�IN�IM�NO�REPAIR�=>�SKIP�OR�DEL�FILEFDBE71„MOVE.B�DIRKEY(A4),D0ŠLEA„PRIFKY(PC),A0FDBE72„MOVE.B�(A0)+,(A2)+ ŠSUB.B‚#1,D0 ŠBNE„FDBE72ŠMOVE.B�#1,FABFLG-B(A5)ŠBRA„FDBC92�CONTINUE**ˆER:�EMPTY�FAB*FDBE80„LEA„EFBPSN(PC),A0*ŠBSR„FABERM�CHECK�FOR�MAX�FAB�ERROR�IN�NIMŠMOVE.L�PSNFAB-B(A5),D1 ŠBSR„BIN4HEXŠLEA„EFBMSG(PC),A0ŠMOVE.L�#EFBMSGL,D0 ŠBSR„SENDMSQCŠLEA„DELMSG(PC),A0ŠDELETE‚FABŠMOVE.L�#'FAB�',DELITM-B(A5)ŠMOVE.L�#DELMSGL,D0 ŠBSR„SENDMSGŠBRA„FDBCDL�GO�DEL�CURRENT�FAB**ˆER:�FAB�ENTRY�KEY�SIZE*FDBE90„MOVE.B�#'E',KEYATR-B(A5)*ŠBSR„FABERM�CHECK�FOR�MAX�FAB�ERROR�IN�NIMŠLEA„KEYFLD(PC),A0ŠMOVE.B�FABKEY(A6),D1 ŠBSR„BIN1HEXŠLEA„KEYMSG(PC),A0ŠMOVE.L�#KEYMSGL,D0 ŠBSR„SENDMSQCŠLEA„SEQMSG(PC),A0ŠMOVE.L�#SEKMSGL,D0 ŠBSR„SENDMSQCŠBEQ.S‚FDBE91�SET�EQUAL�IN�NIMŠBSR„REPAIR�ASK�IN�IMŠBEQ.S‚FDBE91�SET�EQUAL ŠLEA„TRNMSG(PC),A0ŠTRUNCATE�FAB?ŠMOVE.L�#'FAB�',TRNITM-B(A5)ŠMOVE.L�#TRNMSL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠBNE„FDBCSF�DO,�SKIP�FILEŠCLR.L‚(A6 )�YES,�TRUNCATE�FABŠMOVE.B�#1,FABFLG-B(A5)ŠBRA„FDBC500ŒDONE�WITH�FAB-FDBE91„MOVE.B�DIRKEY(A4),FABKEY(A6)�SET�EQUALŠMOVE.B�#1,FABFLG-B(A5) ŠBRA„FDBC101**ˆER:�DB�PSN�BAD*FDBE100ƒLEA„DBPPSN(PC),A0*ŠBSR„FABERM�CHECK�FOR�MAX�FAB�ERROR�IN�NIM ŠBSR„BIN4HEXŠLEA„DBPMSG(PC),A0ŠMOVE.L�#DBPMSL,D0 ŠBSR„SENDMSQCŠBEQ.S‚FDBE102ŒNIMŠBSR„GETNEW4ŒIN�IM�GET�NEW�PSN%FDBE105ƒMOVE.L�D1,(A6)ŒSET�NEW�DB�PSNŠMOVE.B�#1,FABFLG-B(A5)ŠTST.L‚D1‘ZERO?ŠBNE„FDBC101ŒNO,�CHECK�AGAIN#FDBE101ƒMOVE.L�A6,A0ŽYES,‚DELETE�DB ŠBSR„DELFBEŠBRA„FDBC100ŒNEXT�FAB�ENTRY-FDBE102ƒMOVE.L�#'�DB�',DELITM-B(A5)�DELETE�DBŠMOVE.L�#DELMSGL,D0ŠLEA„DELMSG(PC),A0 ŠBSR„SENDMSGŠBRA„FDBE101ŒGO�DELETE**ˆER:�DB�NOT�ALLOCATED*FDBE110ƒLEA„NALPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L�#'�DB�',NALITM-B(A5)ŠLEA„NALMSG(PC),A0ŠMOVE.L�#NALMSGL,D0 ŠBSR„SENDMSQC!ŠBEQ.S‚FDBE111ŒIN�NIM�ALLOCATE�DBŠMOVE.L�DBLEN-B(A5),D0ŠMOVE.L�#'�DB�',PSNITM-B(A5) ŠBSR„DMPALCŠBEQ.S‚FDBE112ŒGO�ALLOCATEŠBSR„GET4HEXŒNO,�GET�NEW�PSN ŠBRA„FDBE105FDBE111ƒLEA„ALCMSG(PC),A0ŠMOVE.L�#'�DB�',ALCITM-B(A5)ŠMOVE.L�#ALCMSGL,D0 ŠBSR„SENDMSG(FDBE112ƒMOVE.L�SATDBUF-B(A5),A0ƒALLOCATEŠMOVE.B�#1,SATFLG-B(A5) ŠMOVE.L�#1,D0 ŠBSR„ALDESCŠBRA„FDBC110ŒGO�ALLOCATE*'*ˆER:�DB�REALLOCATED�AFTER�FILE�DELETED*#FDBE120ƒMOVE.L�#'�DB�',FADITM-B(A5)ŠLEA„FADPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„FADMSG(PC),A0ŠMOVE.L�#FADMSGL,D0 ŠBSR„SENDMSQCŠBRA„FDBE102ŒGO�DEL�DB**ˆER:�DB�ALREADY�ALLOCATED*#FDBE130ƒMOVE.L�#'�DB�',ALEITM-B(A5)ŠLEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„ALEMSG(PC),A0ŠMOVE.L�#ALEMSGL,D0 ŠBSR„SENDMSQCŠBEQ„FDBE102ŒIN�NIM�DEL�DBŠMOVE.L�#'�DB�',DELITM-B(A5)ŠLEA„DELMSG(PC),A0ŠMOVE.L�#DELMSGL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠBEQ„FDBE102ŒGO�DELETEŠBSR„DMPSKP�SKIP?ŠBEQ„FDBCSF�YES&ŠBRA„FDBE105ŒCHECK�AGAIN,�0�DELETES�DB**ˆER:�DB�SECTOR�USAGE�COUNT*FDBE140ƒLEA„FDZFLD(PC),A0ŠMOVE.B�FABSGS(A6),D1 ŠBSR„BIN1HEXŠLEA„FDZMSG(PC),A0ŠMOVE.L�#FDZMSGL,D0 ŠBSR„SENDMSGSŠLEA„DBZFLD(PC),A0ŠMOVE.B�DIRDAT(A4),D1 ŠBSR„BIN1HEXŠLEA„DBZMS(PC),A0ŠMOVE.L�#DBZMSL,D0 ŠBSR„SENDMSQCŠBEQ„FDBE102ŒIN�NIM�DEL�DB ŠBSR„GET4HEX ŠTST.L‚D1ŠBEQ„FDBE101ŒDEL�DBŠMOVE.B�D1,FABSGS(A6)ŠMOVE.B�#1,FABFLG-B(A5) ŠBRA„FDBC120**ˆER:�FRL�AND�FAB�CONFLICT*FDBE200ƒLEA„FDRPSN(PC),A0ŠMOVE.L�PSNDB-B(A5),D1 ŠBSR„BIN4HEXŠLEA„FDRMSG(PC),A0ŠMOVE.L�#FDRMSGL,D0 ŠBSR„SENDMSQCŠBEQ„FDBE102ŒDEL�DB�IN�NIM(ŠBRA„FDBC150ŒREPEAT�UPDATE�DB�LOOP�IN�IM*9*ˆER:�DATA�EXIST�BEYOND�THE�LAST�RECORD�IN�THE�DATA�BLOCK*FDBE210:‰LEA‡X00100(PC),A0*œA0=MSG�START�ADDRESS‰MOVE.L„#X00199,D0*œD0=MSG�LENGTH‰BRA.S…FDBE225*œCONTINUE�PROCESSING*)*ˆER:�RECORD�BCT�OR�RECORD�PAST�END�OF�DB*FDBE220ƒMOVE.W�D0,D1ŠLEA„RLEFLD(PC),A0 ŠBSR„BIN2HEXŠLEA„RLEMSG(PC),A0ŠMOVE.L�#RLEMSGL,D0(FDBE225ƒMOVE.L�#2,D4ŽFLAG�TO�TRUNCATE�DB ŠBSR„SENDMSQCŠLEA„TRNMSG(PC),A0ŠTRUNCATE�DBŠMOVE.L�#TRNMSL,D0ŠMOVE.L�#'�DB�',TRNITM-B(A5) ŠBSR„SENDMSQC(ŠBNE„FDBC150ŒIN�IM�REPEAT�UPDATE�DB�LOOPŠBRA„FDBCTDBŒGO�TRUNCATE�IN�NIM*!*ˆER:�KEYS�NOT�IN�ASCENDING�ORDER*"FDBE250ƒLEA„DKEPSN(PC),A0ŠSEND�PSNŠMOVE.L�PSNDB-B(A5),D1 ŠBSR„BIN4HEXŠLEA„DKEMSG(PC),A0ŠMOVE.L�#DKEMSGL,D0ŠBRA„FDBE225ŒTRUNCATE�DB*%*ˆER:�FAB�KEY�LESS�THAN�DB'S�LAST�KEY* FDBE270ƒMOVE.B�#'L',FDKATR-B(A5)ŠLEA„FDKMSG(PC),A0ŠMOVE.L�#FDKMSGL,D0 ŠBSR„SENDMSQCŠLEA„RECMSG(PC),A0ŠMOVE.L�#RECMSGL,D0 ŠCLR.L‚D4 ŠBSR„SENDMSQC ŠBEQ.S‚FDBE275ŒIN�NIM�FORCE�SAMEŠBSR„REPAIR�IN�IM�ASK"ŠBNE„FDBC150ŒREPEAT�UPDATE�DB�LOOP%FDBE275ƒLEA„FABKEY+1(A6),A0„SET�EQUALFDBE276ƒMOVE.B�(A1)+,(A0)+ ŠSUB.B‚#1,D0 ŠBNE„FDBE276ŠMOVE.B�#1,FABFLG-B(A5)ŠMOVE.B�DIRKEY(A4),D0 ŠBRA„FDBC260*4*ˆER:�PRIOR�FAB�ENTRY�KEY�GREATER�THAN�1ST�KEY�IN�DB* FDBE280ƒMOVE.B�#'F',FDKATR-B(A5)ŠLEA„FDKMSG(PC),A0ŠMOVE.L�#FDKMSGL,D0 ŠBSR„SENDMSQCŠLEA„DELMSG(PC),A0ŠDELETE�DBŠMOVE.L�#'�DB�',DELITM-B(A5)ŠMOVE.L�#DELMSGL,D0ŠMOVE.L�#1,D4ŽFLAG�DEL�DB ŠBSR„SENDMSQC%ŠBNE„FDBC150ŒREPEAT�UPDATE�LOOP�IN�IMŠBRA„FDBC125ŒDEL�DB� IN�NIMŠPAGE**ˆER:�DIREOR/DIREOF�CONFLICT* FDBE300ƒEQU„*!ŠLEA„EFCMSG(PC),A0ŠSEND�ERROR�MSGŠMOVE.L�#EFCMSGL,D0 ŠBSR„SENDMSQCŠLEA„RECMSG(PC),A0ŠRECALCULATEŠMOVE.L�#RECMSGL,D0 ŠBSR„SENDMSG.ŠMOVE.B�#1,CNTFLG-B(A5)„GO�FORCE�PROPER�VALUES ŠBRA„FDBC525**ˆER:�FAB�USE�FRACTION*&FDBE310ƒMOVE.L�D0,D1ŽSAVE�USE�FRACTIONŠLEA„FUSMSG(PC),A0ŠMOVE.L�#FUSMSGL,D0ŠBSR„SENDMSQC‹SEND�ERRROR�MSGŠLEA„RECMSG(PC),A0ŠRECALCULATEŠMOVE.L�#RECMSGL,D0 ŠBSR„SENDMSG&ŠMOVE.L�D1,D0ŽRESTORE�FAB�USE�FRACTION"ŠBRA„FDBC512ŒGO�FORCE�PROPER�VALUEŠPAGE*O*********************************************************************************ˆDELFBE:1.00�8/18/80�HBN6*O********************************************************************************3*ˆDELFBE�DELETES�FAB�ENTRY�BY�MOVING�REST�OF�FAB�UP*!*ˆON�ENTRY:�A0�->�ENTRY�TO�DELETE**ˆON�RETURN:�Z�=�0�IF�KEY�ERROR*—1�IF�DELETED�OK* DELFBE„EQU„**4*ˆGET�END�OF�FAB�ENTRY�POINTER�-�'MOVE-FROM'�ADDRESS*ŠMOVEM.L�A0-A2/D0,-(A7) ŠCLR.L‚D0ŠLEA„FABKEY(A0),A1'ŠMOVE.B�(A1)+,D0‹GET�ENTRY'S�KEY�LENGTH$ŠCMP.B‚KEYLEN-B(A5),D0„CHECK�SIZE�OKŠBNE.S‚DELFBR�ERROR‚RETURN#ŠADD.L‚D0,A1ŽA1�->�END�OF�FAB�ENTRY**ˆMOVE�FAB�BUFFER�UP*1DELFB0„CMP.L‚DBBUF-B(A5),A1…AT�END�OF�FAB�BUFFER?ŠBGE.S‚DELFB1�YES#ŠMOVE.W�(A1)+,(A0)+ˆNO,�KEEP�MOVING ŠBRA„DELFB0DELFB1„MOVE.B�#1,FABFLG-B(A5),ŠCLR.L‚(A0)�MAKE�SURE�END�OF�FAB�ENTRIES�=�0DELFBR„MOVEM.L�(A7)+,A0-A2/D0ŠRTS*ŠPAGE*O*********************************************************************************ˆNIMC�1.00�7/8/80�HBN6*O********************************************************************************A*ˆNIMC�CHECKS�CURRENT�MODE�-�ERROR�HAS�OCCURED.‚IF�C-OPTION�IS�ONC*ˆA�BRANCH�IS�MADE�TO�'TRMREP'.�IM�IS�TURNED�BACK�ON�IF�TURNED�OFF.**ˆON�ENTRY:�D7�=�MODE�STATUS*1*ˆON�RETURN:�Z�=�1�IF�NIM,�OR�IM�WITH�FILE�REPAIR *—0�IF�IM*“D0�-�CHANGED* NIMC†EQU„*ŠTST.W‚D7‘C�-OPTION?ŠBMI„TRMREP�YES,�QUIT ŠTST.B‚D7‘IM?ŠBNE.S‚NIMCRŽYESŠMOVE.L�D7,D0ŽMAYBE�TURNED�OFF3ŠAND.L‚#NIMASK,D0‰CHECK�IF�SOME�IM-TURN-OFF�BIT�SET ŠBEQ.S‚NIMCRŠMOVE.B�#1,D7ŽTURN�IM�BACK�ON)ŠAND.L‚#-(NIMASK+1),D7„RESET�FLAGS,�Z�=�0NIMCR…RTS„Z=0�IF�I-OPTION�ONŠPAGE*O**********************************************************************************‡GETSEG�1.00�7/3/80�HBN6*O********************************************************************************>*ˆGETSEG�ALLOCATES�REQUESTED�SEGMENT;�IF�ERROR�OCCURS�AN�ERROR'*ˆMESSAGE�IS�SENT�AND�REPAIR�IS�ABORTED**ˆON�ENTRY:�D0�=�SEGMENT�NAME*’D1�=�BYTE�COUNT�REQUESTED**ˆON�RETURN:�D0,�A0�-�CHANGED1*’A0=A1�=�PHYSICAL=LOGICAL�ADDRESS�OF�NEW�SEGMENT* GETSEG„EQU„**#*ˆSET�PARAMETER�BLOCK�FOR�EXEC�CALL*#ŠMOVE.L�D0,SEGPRB+SEGNAM-B(A5)�NAME)ŠMOVE.L�D1,SEGPRB+SEGLEN-B(A5)�BYTE�COUNTŠERQ.GTSEG�SEGPRB(PC)ŠBNE.S‚SEGEXE�EXEC�ERROR$ŠMOVE.L�A0,A1ŽADDRESS�OF�NEW�SEGMENTŠBSR„CLRBUF�ZERO�OUT�BUFFERŠRTS*+*ˆCOMMON�ERROR�RETURN�FROM�GETSEG�OR�DELSEG* SEGEXE„EQU„*%ŠMOVE.L�D0,D1ŽCONVERT�STATUS�TO�ASCIIŠLEA„SEGMD0(PC),A0Š. ŠBSR„BIN4HEXFŠMOVE.L�SEGPRB+SEGNAM-B(A5),SEGMNM-B(A5)�SET�SEGMENT�NAME�INTO�MESSAGE%ŠLEA„SEGMSG(PC),A0ŠSEND�ERROR�MESSAGEŠMOVE.L�#SEGMSGL,D0 ŠBSR„SENDMSGS ŠBRA„TRMREP*O*********************************************************************************ˆDELSEG:1.00�7/4/80�HBN6*O********************************************************************************B*ˆDELSEG�DEALLOCATES�GIVEN�SEGMENT,�EXEC-ERROR�CAUSES�REPAIR�TO�BE *ˆABORTED**ˆON�ENTRY:�D0�-�SEGMENT�NAME**ˆON�RETURN:�D0,�A0�-�CHANGED* DELSEG„EQU„*/ŠMOVE.L�D0,SEGPRB+SEGNAM-B(A5)�SET�SEGMENT�NAME$ŠERQ.DESEG�SEGPRB(PC)†RELEASE�MEMORYŠBNE„SEGEXE�ERRORŠRTSŠPAGE*O*********************************************************************************ˆDMPALC:1.00�7/22/80�HBN6*O******************************************************************************* *&*ˆDMPALC�REQUESTS�'DUMP?',�'ALLOCATE?'*%*ˆON�ENTRY:�D1�=�STARTING�PSN�TO�DUMP*’D0�=�SECTOR�COUNT*%*ˆON�RETURN:�Z�=�1�IF�'Y'�TO�ALLOCATE *—0�IF�'N'* DMPALC„EQU„***ˆDUMP?*ŠMOVEM.L�D0-D2/A0,-(A7)ŠMOVE.L�D0,D2ŽSAVE�SECTOR�COUNTŠLEA„DMPMSG(PC),A0ŠMOVE.L�#DMPMSGL,D0ŠBSR„SENDMSGS‹DUMP? ŠBSR„GETRYN�.ŠBNE.S‚DMPAL0�NOŠBSETƒ#31,D2�YES,�DUMP&ŠBSR„UPDSEC�USE�SECTOR�BUFFER�FOR�DUMP* *ˆALLOCATE?*DMPAL0„LEA„ALCMSG(PC),A0ŠMOVE.L�#ALCMSL,D0 ŠBSR„SENDMSGSŠBSR„REPAIR�ALLOCATE?1ŠMOVEM.L�(A7)+,D0-D2/A0„Z�=�1�IF�YES,�Z�=�0�IF�NOŠRTS*ŠPAGE*O*********************************************************************************‰DMPSKP:1.00�7/23/80�HBN6*O*********************************************************************************ˆDMPSKP�ASKS�'DUMP',�'SKIP'**ˆON�ENTRY:�D1�=�OLD�PSN*’D0�=�SECTOR�COUNT�TO�DUMP* *ˆON�RETURN:�Z�=�1�IF�SKIP�-�YES*—0�IF�SKIP�-�NO* DMPSKP„EQU„***ˆDUMP?*ŠMOVEM.L�D0/D2/A0,-(A7)ŠMOVE.L�D0,D2ŽSAVE�SECTOR�COUNTŠLEA„DMPMSG(PC),A0ŠMOVE.L�#DMPMSGL,D0ŠBSR„SENDMSGS‹DUMP? ŠBSR„GETRYN�.ŠBNE.S‚DMPSK0�NOŠBSETƒ#31,D2�YES,�DUMP&ŠBSR„UPDSEC�USE�SECTOR�BUFFER�FOR�DUMP**ˆSKIP?*DMPSK0„LEA„SKPMSG(PC),A0ŠMOVE.L�#SKPMSGL,D0 ŠBSR„SENDMSGSŠBSR„GETRYN�GET�RESPONSEŠMOVEM.L�(A7)+,D0/D2/A0ŠRTSŠPAGE*O**********************************************************************************ˆDMPQNL:1.00�7/23/80�HBN6*O********************************************************************************=*ˆDMPQNL�ASKS�'DUMP',�'QUIT'�AND�IF�NOT�TO�QUIT�GETS�NEW�LINK**ˆON�ENTRY:�D1�=�OLD�PSN*’D0�=�SECTOR�COUNT�TO�DUMP**ˆON�RETURN:�D1�=�NEW�LINK* DMPQNL„EQU„***ˆDUMP?*ŠMOVEM.L�D0/D2/A0,-(A7)ŠMOVE.L�D0,D2ŽSAVE�SECTOR�COUNTŠLEA„DMPMSG(PC),A0ŠMOVE.L�#DMPMSGL,D0ŠBSR„SENDMSGS‹DUMP? ŠBSR„GETRYN�.ŠBNE.S‚DMPQN0�NOŠBSETƒ#31,D2�YES,�DUMP&ŠBSR„UPDSEC�USE�SECTOR�BUFFER�FOR�DUMP**ˆQUIT?*DMPQN0„LEA„QUTMSG(PC),A0ŠMOVE.L�#QUTMSGL,D0 ŠBSR„SENDMSGSŠBSR„GETRYN�QUIT?ŠBEQ„TRMREP�YESŠBSR„GET4HEXŒNO,�GET�NEW�LINKŠMOVEM.L�(A7)+,D0/D2/A0ŠRTSŠPAGE*O*********************************************************************************ˆCHKASC:1.00�7/7/80�HBN6*O********************************************************************************G*ˆCHKASC�CHECKS�A�FIELD�TO�CONTAIN�ONLY�PRINTABLE�ASCII�BYTES�($20-$7E)A*ˆERROR�MESSAGE�IS�SENT�IF�ERROR�IS�FOUND,�AND�NEW�FIELD�CONTENTS*ˆARE�REQUESTED* *ˆON�ENTRY:�A1�=�START�OF�BUFFER*’D2�=�OFFSET�TO�FIELD*’D3�=�LENGTH�OF�FIELD5*’A0�=�ERROR�MESSAGE�TO�PRINT�IF�NON�ASCII�CHARACTERS*’D0�=�ERROR�MSG�LENGTH***ˆON�RETURN:�Z�=�1�IF�NO�ERROR,�D0�UNKNOWN.*—0�IF�ERROR,�D0�=�#�OF�CHARACTERS�IN�RESPONSE* CHKASC„EQU„**ŠMOVEM.L�D1-D4/A0-A1,-(A7)ŠMOVE.L�D0,D4ŽSAVE�MSG�BCTCHKAS0„MOVE.B�(A1,D2),D0ŠCMP.B‚#$20,D0 ŠBLT.S‚CHKAS1ŠCMP.B‚#$7E,D0 ŠBHI.S‚CHKAS1 ŠADD.L‚#1,D2 ŠSUB.L‚#1,D3 ŠBNE„CHKAS0 CHKASR„MOVEM.L�(A7)+,D1-D4/A0-A1ŠRTSCHKAS1„MOVE.L�D4,D0 ŠBSR„SENDMSQCŠMOVEM.L�(A7)+,D1-D4/A0-A1&ŠBSR„NEWFLD�REQUEST�NEW�FIELD�CONTENTSŠRTS*O*********************************************************************************ˆSETEQL:1.00�7/7/80�HBN6*O********************************************************************************,*ˆSETEQL�ASKS�USER�IF�FIELD�CAN�BE�SET�EQUAL.*ˆON�RETURN:�Z�=�I�IF�CAN�SET�EQUAL�ELSE�DON'T*SETEQL„MOVEM.L�D0/A0,-(A7)ŠLEA„SEQMSG(PC),A0ŠMOVE.L�#SEQMSGL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠMOVEM.L�(A7)+,D0/A0ŠRTSŠPAGE*O*********************************************************************************ˆNAMECK:1.00�7/7/80�HBN6*ˆCATCHK:1.00�7/7/80�HBN6*O********************************************************************************>*ˆNAMECK�CHECKS�A�FIELD�TO�CONTAIN‚AN�ALPHANUMERIC�NAME,�FIRST>*ˆCHARACTER�MUST�BE�ALPHABETIC.�FIELD�MAY�TERMINATE�IN�SPACES.A*ˆERROR�MESSAGE�IS�SENT�IF�ERROR�IS�FOUND,�NEW�FIELD�CONTENTS�AR E *ˆREQUESTED.*>*ˆCATCHK�DOES�SAME�AS�NAMECK�BUT�ALLOWS�FIELD�TO�BE�ALL�SPACES* *ˆON�ENTRY:�A1�=�START�OF�BUFFER$*’D2�=�OFFSET�TO�FIELD�TO�BE�CHECKED*’D3�=�LENGTH�OF�FIELD*’A0�=�ERROR�MESSAGE�TO�PRINT8*’D0�=�LENGTH�OF�MSG‚(IF�BIT�31�SET�THEN�ALLOW�&�OR�@�TO *—START�NAME)*$*ˆON�RETURN:�Z�=�1�IF�OK,�D0�UNKNOWN%*—0�IF�ERROR,�D0�=�LENGTH�OF�RESPONSE* CATCHK„EQU„*ŠMOVEM.L�D1-D4/A0-A1,-(A7)ŠMOVE.L�D0,D4ŽSAVE�MSG�BCTŠMOVE.B�(A1,D2),D0=ŠBSR„ALPHA†IF�1ST�CHARACTER�IS�SPACE�THEN�REST�MUST�BE�SPACES ŠBEQ.S‚NCCHK0ŠCMP.B‚#'�',D0ŒSPACE?ŠBNE.S‚NAMEC2�ERRORŠBRA.S‚NCCHK1�OK*NAMECK„EQU„*’ENTRY�POINT*ŠMOVEM.L�D1-D4/A0-A1,-(A7)ŠMOVE.L�D0,D4ŽSAVE�MSG�BCTŠMOVE.B�(A1,D2),D0*ŠBCLRƒ#31,D4�&�OR�@�OK�AS�FIRST�CHARACTER?ŠBEQ.S‚NAMECŽNOŠCMP.B‚#'&',D0ŒYESŠBEQ.S‚NCCHK0�&�IS�OKŠCMP.B‚#'@',D0ŠBEQ.S‚NCCHK0�@�IS�OK"NAMEC…BSR„ALPHAŽELSE�MUST�BE�ALPHAŠBNE.S‚NAMEC2�ERRORNCCHK0„CLR.L‚D1NAMEC0„ADD.L‚#1,D2 ŠSUB.L‚#1,D3 ŠBEQ.S‚NAMECRŠMOVE.B�(A1,D2),D0 ŠBSR„ALFNUM ŠBEQ.S‚NAMEC1ŠCMP.B‚#'�',D0ŠBNE.S‚NAMEC2�ERROR-NCCHK1„MOVE.L�#1,D1ŽFLAG�TO�ALLOW�ONLY�SPACES ŠBRA„NAMEC0 NAMECR„MOVEM.L�(A7)+,D1-D4/A0-A1ŠRTSNAMEC1„TST.L‚D17ŠBEQ„NAMEC0ŒONCE�A�SPACE�FOUND�REST�MUST�BE�SPACES�ALSO"NAMEC2„MOVE.L�D4,D0ŽSEND�ERROR�MSG ŠBSR„SENDMSQCŠMOVEM.L�(A7)+,D1-D4/A0-A1ŠBSR.S‚NEWFLD�GET�NEW�FIELDŠTST.L‚D0‘SET�Z=0 ŠBNE.S‚NAMERT ŠCMP.B‚#1,D0 NAMERT„RTS*ŠPAGE*O*********************************************************************************ˆNEWFLD:1.00�7/22/80�HBN6*O********************************************************************************-*ˆNEWFLD�REQUESTS�'OLD��(N),ƒNEW?'"*ˆFIELD�IS�CHANGED�BY�NEW�CONTENTS* *ˆON�ENTRY:�D2�=�OFFSET�TO�FIELD*’D3�=�LENGTH�OF�FIELD*’A1�=�BASE�ADDRESS*-*ˆON�RETURN:�D0�=�NUMBER�OF�BYTES�IN�RESPONSE* NEWFLD„EQU„**ŠMOVEM.L�D4-D5/A0/A3,-(A7)ŠMOVE.L�D3,D5ŽSAVE�BCT**ˆBUILD�LINE�FOR�OLD�FIELD*ŠLEA„(A1,D2),A3‰START�OF�FIELDŠLEA„LINEBUF(PC),A0ŠMOVE.L�#'OLD�',(A0)+ŠMOVE.B�#'''',(A0)+ˆQUOTE/NEWF00„MOVE.B�(A3)+,D0‹GET�NEXT�BYTE�FROM�FIELDŠCMP.B‚#$20,D03ŠBLT.S‚NEWF05�CHANGE�NONPRINTABLE�CHARACTERS�TO�'.'ŠCMP.B‚#$7E,D0 ŠBLS.S‚NEWF10NEWF05„MOVE.B�#'.',D0NEWF10„MOVE.B�D0,(A0)+ ŠSUB.L‚#1,D3ŠBNE„NEWF00�NEXT�BYTEŠMOVE.B�#'''',(A0)+ˆQUOTEŠMOVE.B�#'�',(A0)+ŠMOVE.B�#'(',(A0)+0ŠMOVE.B�#'$',(A0)+‰INDICATE�THAT�VALUE�IS�IN�HEXŠMOVE.L�D5,D1ŽSET�BCT ŠBSR„BIN1HEX ŠLEA„2(A0),A0ŠMOVE.B�#')',(A0)+ŠMOVE.L�A0,-(A7)ŠLEA„LINEBUF(PC),A0 ŠMOVE.L�A0,D3ŠMOVE.L�(A7)+,A0ŠSUB.L‚D3,A0ŽGET�LINE�BCT ŠMOVE.L�A0,D0 ŠMOVE.L�D3,A0$ŠBSR„SENDMSGS‹SEND�'OLD�'FIELD''�MSG,NEWF15„MOVE.L�#'NEW?',(A0)‡ASK�FOR�NEW�FIELD ŠMOVE.L�#4,D0 ŠBSR„SENDMSGS ŠIOSCALL�INPIOS(PC)ˆGET�RESPONSE ŠBNE„IOERR ŠBSR„HRDCPY2ŠMOVE.L�IOSLEN+INPIOS-B(A5),D3ƒGET�RESPONSE�LENGTHŠBEQ.S‚NEWF30�ERROR�IF�CR�ONLY)ŠCMP.L‚D5,D3ŽERROR�IF�TOO�MANY�CHARACTERS ŠBHI.S‚NEWF30**ˆUPDATE�FIELD*ŠBSR„BLNKFL�BLANK�FILL�BUFFERŠLEA„INPBUF(PC),A0ŠBUFFER�STARTŠMOVE.L�D3,D0ŽRETURN�BCTŠLEA„(A1,D2),A3NEWF20„MOVE.B�(A0)+,(A3)+ ŠSUB.L‚#1,D3 ŠBNE„NEWF20'NEWFRT„MOVEM.L�(A7)+,D4-D5/A0/A3�RETURNŠRTS**ˆERROR�IN�RESPONSE*NEWF30„BSR„RESPNAŠLEA„LINEBUF(PC),A0ŠBRA„NEWF15�TRY�AGAINŠPAGEN********************************************************************************ˆGET4HEX:‰1.00�7/22/80�HBN6 *ˆGETNEW4:N*******************************************************************************=*ˆGET4HEX�GETS�4�BYTE�HEX�VALUE�FROM�USER�'R:�GIVE�NEW�VALUE'*°'OLD�<4BYTE�HEX>'*°'NEW?'+*ˆGETNEW4�IDENTICAL�EXCEPT�ASKS�ONLY�'NEW?'**ˆON�ENTRY:�D1�=�OLD�VALUE**ˆON�RETURN:�D1�=�NEW�VALUE* GETNEW4ƒEQU„**ŠMOVEM.L�D2-D3/D0/A0-A1,-(A7)ŠLEA„LINEBUF(PC),A0ŠBRA.S‚GETNEW0ŒSKIP�OTHER�MSGS* GET4HEXƒEQU„**ŠMOVEM.L�D2-D3/D0/A0-A1,-(A7)ŠLEA„GNVMSG(PC),A0ŠMOVE.L�#GNVMSGL,D0 ŠBSR„SENDMSGSŠLEA„LINEBUF(PC),A0 ŠMOVE.L�A0,A1ŠMOVE.L�#'OLD�',(A0)+ŠBSR„BIN4HEXŒSET�OLD�PSN ŠMOVE.L�A1,A0ŠMOVE.L�#12,D0 ŠBSR„SENDMSGS+ GETNEW0ƒEQU„*’CONTINUE�GETNEW4�FROM�HERE�ONŠMOVE.L�#'NEW?',(A0)GET4H00ƒMOVE.L�#4,D0 ŠBSR„SENDMSGS ŠIOSCALL�INPIOS(PC)ˆGET�RESPONSE ŠBNE„IOERR ŠBSR„HRDCPYŠLEA„INPBUF(PC),A0ŠMOVE.L�IOSLEN+INPIOS-B(A5),D3 ŠBEQ.S‚GET4ER&ŠMOVE.L�#-1,D2�INITIALIZE�NO�PSN�GIVEN ŠCLR.L‚D1GET4H05ƒMOVE.B�(A0)+,D0ŠCMP.B‚#CR,D0�DONE?ŠBEQ.S‚GET4H15&ŠBSR„HEXBIN�NO,�CONVERT�NEXT�CHARACTERŠBNE.S‚GET4ER�ERROR ŠTST.L‚D2ŠBPL.S‚GET4H10 ŠCLR.L‚D2'GET4H10ƒMOVE.L�#$F,D0�CHECK�NO�OVERFLOWŠLSR.L‚#4,D0ŽMASK ŠAND.L‚D2,D0ŠBNE.S‚GET4ER�ERROR ŠLSL.L‚#4,D2ŠBMI.S‚GET4ER�ERROR ŠOR.BƒD1,D2 ŠSUB.L‚#1,D3ŠBNE.S‚GET4H05&GET4H15ƒMOVE.L�D2,D1ŽANY�NUMBER�GIVEN?!ŠBMI.S‚GET4ER�OR�NUMBER�TOO�LARGEŠMOVEM.L�(A7)+,D0/D2-D3/A0-A1ŠRTSGET4ER„BSR„RESPNA�BAD�RESPONSEŠLEA„LINEBUF(PC),A0 ŠBRA„GET4H00ŠPAGE*O*********************************************************************************ˆFABERM:1.00�12/9/80�HBN6*O********************************************************************************B*ˆFABERM�CHECKS�FAB�FOR�A�MAXIMUM�NUMBER�OF�ERRORS,�IF�ERROR�COUNT'*ˆTOO�LARGE�THEN�FAB�CHAIN�IS�TRUNCATED* FABERM„EQU„*ŠADD.B‚#1,FABERR-B(A5)%ŠCMP.B‚#2,FABERR-B(A5)„REACHED�LIMIT?ŠBNE.S‚FABER0�NOŠLEA„BFTMSG(PC),A0ŠMOVE.L�#BFTMSGL,D0 ŠBSR„SENDMSQC,ŠCLR.L‚LSTSRD-B(A5)‡FORCE�TRUNCATE�FAB�CHAINŠADD.L‚#4,A7ŽRESTORE�STACKŠBRA„FDBTRŽGO�TRUNCATE FABER0„RTS O*******************************************************************************E*‰THIS�IS�A�TEMP.�SHORT�MESSAGE�TO�BE�USED�UNTIL�HELP�MESSAGES�INTACT*'STUBMSG:‚DC.Bƒ'�Not�implemented�as�yet'STUBMSGL:�EQU„*-STUBMSG STUB:…DS…0;ŠLEA„STUBMSG(PC),A0‰Point�to�start�"Not�implemented"�messag.ŠMOVE.L�#STUBMSGL,D0‡provide�length�of�messageŠBSR„SENDMSGŒsend�it2ŠCLR.L‚D1‘indicate�first�PSN�to�dump�to�screen�(0)*ŠCLR.L‚D2‘offset�for�starting�byte�to�dumpŠRTS  ** ŠEND„STARTPCééé**†REPAIR�SUBROUTINES�-�PART�2*ŠXREFƒBŠXREFƒSATABUF,SATDBUF,SATFLG7ŠXDEFƒALDESC,TSTNYA,TSTFRE,TSTALC,DEALLC,ALLOCT,DECBINW=ŠXDEFƒBIN4HEX,BIN2HEX,BIN1HEX,BIN2DEC,CHKKEY,IM,HEXBIN,CLRBUFŠXDEFƒBLNKFL,ALPHA,ALFNUM**ˆEQUATES�FROM�PART1* RCRSAT„EQU„14 CRˆEQU„$D* ŠSECTIONƒ0*O*********************************************************************************ˆTSTNYA�1.00�7/31/80�HBN6*O********************************************************************************=*ˆTSTNYA�CHECKS�THAT�SECTORS�HAVE�NOT�BEEN�ALLOCATED�ALREADY.G*ˆSECTORS�ARE�MARKED�ALLOCATED�IN�ALLOCATION�SAT�IF�NO�ERROR�WAS�FOUND.*"*ˆON�ENTRY:�D1�=�PSN�OF�1ST�SECTOR*’D2�=�NUMBER�OF�SECTORS*C*ˆON�RETURN:�Z�=�1‚IF�NO�SECTOR�YET�ALLOCATED(MARKED�NOW�ALLOCATED)3*“Z�=�0�AND�D0�=�-1�IF�1ST�SECTOR�ALREADY�ALLOCATED2*“Z�=�0�AND�D0�=�1�IF�1ST�SECTOR�NOT�YET�ALLOCATED* TSTNYA„EQU„*ŠMOVEM.L�D1-D5/A0,-(A7)$ŠMOVE.L�D2,D5ŽSAVE�NUMBER�OF�SECTORS ŠBEQ.S‚TSTNYR*$*ˆCHECK�NOT�MARKED�ALLOCATED�ALREADY*6ŠMOVE.L�SATABUF-B(A5),A0ƒALLOCATION�SAT�BUFFER�ADDRESSAŠBSR„OFSBIT‚GET�OFFSET�AND�BIT�NUMBER�FOR�1ST�PSN�INTO�SAT�BUFFER ŠCLR.L‚D09TSTNY0„BTSTƒD3,(A0,D4.L)‡SECTOR�MARKED�ALLOCATED�ALREADY?ŠBNE.S‚TSTNY9�YES,�ERROR ŠMOVE.L�#1,D0 ŠSUB.L‚#1,D5ŽNO,�DONE?ŠBEQ.S‚TSTNY5�YESŠADD.L‚#1,D0ŽNOŠSUB.W‚#1,D3ŽMOVE�TO�NEXT�BIT&ŠBPL„TSTNY0�HAVE�TO�MOVE�TO�NEXT�BYTE?$ŠMOVE.L�#7,D3ŽYES,�START�AT�HIGH�BITŠADD.W‚#1,D4ŽNEW�OFFSET.ŠBRA„TSTNY0�GO�CHECK�NEXT�SECTOR�NOT�ALLOCATED**ˆRETURN*1TSTNY5„EQU„*’SECTORS�OK�-�MARK�ALLOCATED�(D0�=�1) ŠBSR„ALDESCŠCLR.L‚D0‘FLAG�OK/TSTNYR„MOVEM.L�(A7)+,D1-D5/A0„RESTORE�REGISTERSŠRTS*"*ˆERROR�-�SECTOR�ALREADY�ALLOCATED*%TSTNY9„TST.L‚D0‘SET�RETURN�CONDITIONS ŠBNE„TSTNYR0ŠMOVE.L�#-1,D0�FLAG�1ST�SECTOR�ALREADY�ALLOCATED ŠBRA„TSTNYRŠPAGE*O*********************************************************************************ˆTSTFRE�1.00�7/31/80�HBN6*³J¼DÄJÌOÔ^ÜKäYì?O********************************************************************************A*ˆTSTFRE�CHECKS�THAT�SECTORS�HAVE�NOT�BEEN�REALLOCATED�AFTER�FILE**ˆDELETED.�TEST�SKIPPED�IF�RECREATING�SAT.5*ˆSECTORS�ARE�MARKED�ALLOCATED�IF�NO‚ERROR�WAS�FOUND.*"*ˆON�ENTRY:�D1�=�PSN�OF�1ST�SECTOR*’D2�=�NUMBER�OF�SECTROS*!*ˆON�RETURN:�Z�=�1‚REALLOCATED�OK-*“Z�=�0�AND�D0�=�-1�IF�1ST�SECTOR�REALLOCATED0*“Z�=�0�AND�D0�=�1�IF�1ST�SECTOR�NOT�REALLOCATED* TSTFRE„EQU„*ŠMOVEM.L�D1-D5/A0,-(A7) ŠMOVE.L�D2,D5 ŠBEQ.S‚TSTFRR**ˆCHECK�NOT�MARKED�ALLOCATED*9ŠMOVE.L�#1,D0�JUST�ALLOCATE�(SKIP�TEST)�IF�RECREATING�SATŠBTSTƒ#RCRSAT,D7ŠBNE.S‚TSTFR5�GO�ALLOCATE0ŠMOVE.L�SATDBUF-B(A5),A0ƒDISK�SAT�BUFFER�ADDRESSAŠBSR„OFSBIT‚GET�OFFSET�AND�BIT�NUMBER�FOR�1ST�PSN�INTO�SAT�BUFFER ŠCLR.L‚D04TSTFR0„BTSTƒD3,(A0,D4.L)‡SECTOR�MARKED�REALLOCATED�?ŠBNE.S‚TSTFR9�YES,�ERROR ŠMOVE.L�#1,D0ŠSUB.L‚#1,D5ŽNO,�DONE?ŠBEQ.S‚TSTFR5�YESŠADD.L‚#1,D0ŽNOŠSUB.W‚#1,D3ŽMOVE�TO�NEXT�BIT&ŠBPL„TSTFR0�HAVE�TO�MOVE�TO�NEXT�BYTE?$ŠMOVE.L�#7,D3ŽYES,�START�AT�HIGH�BITŠADD.W‚#1,D4ŽNEW�OFFSET.ŠBRA„TSTFR0�GO�CHECK�NEXT�SECTOR�NOT�ALLOCATED**ˆRETURN*1TSTFR5„EQU„*’SECTORS�OK�-�MARK�ALLOCATED�(D0�=�1) ŠBSR„ALDESC-ŠMOVE.B�#1,SATFLG-B(A5)„FLAG�DISK�SAT�CHANGEDŠCLR.L‚D0‘FLAG�OK/TSTFRR„MOVEM.L�(A7)+,D1-D5/A0„RESTORE�REGISTERSŠRTS*"*ˆERROR�-�SECTOR�ALREADY�ALLOCATED*%TSTFR9„TST.L‚D0‘SET�RETURN�CONDITIONS ŠBNE„TSTFRR*ŠMOVE.L�#-1,D0�FLAG�1ST�SECTOR�REALLOCATED ŠBRA„TSTFRRŠPAGEO*********************************************************************************ˆTSTALC�1.00�6/25/80�HBN6*O********************************************************************************9*ˆTSTALC�TEST�SECTORS�FOR�ALLOCATION�IN�OLD�SAT�FROM�DISK5*ˆCALL�IS�SKIPPED�IF�SAT�IS�TO�BE�RECREATED�BY�REPAIR*$*ˆON�ENTRY:�D1�=�PSN�OF�FIRST�SECTOR!*’D2�=�NUMBER�OF�SECTORS�TO�CHECK*#*ˆON�RETURN:�Z�=�1�IF�ALL�ALLOCATED/*“Z�=�0�AND�D0�=�-1�IF�1ST�SECTOR�NOT�ALLOCATED**“Z�=�0�AND�D0�=�1�IF�1ST�SECTOR�ALLOCATED*,TSTALC„MOVEM.L�D1-D4/A0,-(A7)„SAVE�REGISTERS ŠTST.L‚D2 ŠBEQ.S‚TSTARTŠBTSTƒ#RCRSAT,D7‰RECREATE�SAT?ŠBEQ.S‚TSTA00�NOŠCLR.L‚D0‘YES,�SKIP�CALL ŠBRA.S‚TSTART*0*ˆFIND�BIT�NUMBER,�OFFSET�INTO�SAT�FOR�GIVEN�PSN*6TSTA00„MOVE.L�SATDBUF-B(A5),A0ƒDISK�SAT�BUFFER�ADDRESS-ŠBSR„OFSBIT�GET�BIT�#�INTO�D3,�OFFSET�INTO�D4 ŠCLR.L‚D0*/*ˆCHECK�EACH�SECTOR�IN�THE�BLOCK�FOR�ALLOCATION*#TSTA01„BTSTƒD3,(A0,D4.L)‡ALLOCATED?ŠBEQ.S‚TSTA05�NO ŠMOVE.L�#1,D0 ŠSUB.L‚#1,D2ŽALL�SECTORS�TESTED?ŠBEQ.S‚TSTART�YES!ŠADD.L‚#1,D1ŽNO,�TEST�NEXT�SECTOR'ŠSUB.W‚#1,D3ŽIS�IT�IN�SAME�BYTE�IN�SAT?"ŠBPL„TSTA01�YES,�IN�NEXT�LOWER�BIT(ŠMOVE.L�#7,D3ŽNO,�IN�NEXT�BYTE,�HIGH�BITŠADD.W‚#1,D4Ž. ŠBRA„TSTA01�.TSTA05„TST.L‚D0‘RETURN�FLAG ŠBNE.S‚TSTARTŠMOVE.L�#-1,D0/TSTART„MOVEM.L�(A7)+,D1-D4/A0„RESTORE�REGISTERSŠRTSŠPAGE*O*********************************************************************************ˆDEALLC�1.01�7/23/80�HBN6*O************** ********************************************************************ˆDEALLC�DEALLOCATES�SECTORS�IN�BOTH�SAT'S*+*ˆON�ENTRY:�D1�=�FIRST�SECTOR�TO�DEALLOCATE!*’D2�=�#�OF�SECTORS�TO�DEALLOCATE DEALLC„EQU„*-ŠMOVEM.L�D0/A0,-(A7)‡STORE�REGISTERSƒ11/29/84ŠCLR.L‚D0‘DEALLOCATE�FLAGŠMOVE.L�SATABUF-B(A5),A0%ŠBSR.S‚ALDESC�DEALLOCATE�FROM�NEW�SATŠMOVE.L�SATDBUF-B(A5),A0%ŠBSR.S‚ALDESC�DEALLOCATE�FROM�OLD�SATŠMOVE.B�#1,SATFLG-B(A5)/ŠMOVEM.L�(A7)+,D0/A0‡RESTORE�REGISTERS‚11/29/84ŠRTSŠPAGE*O*********************************************************************************ˆALLOCT�1.00�7/23/80�HBN6*O**********************************************************************************ˆALLOCT�ALLOCATES�SECTOR(S)�IN�BOTH�SAT'S**ˆON�ENTRY:�D1�=�1ST�PSN#*’D2�=�NUMBER�OF�SECTOR�TO�ALLOCATE* ALLOCT„EQU„*ŠMOVEM.L�D0/A0,-(A7)ŠMOVE.L�#1,D0ŽSET�ALLOCATE�FLAG4ŠMOVE.L�SATABUF-B(A5),A0ƒALLOCATE�SECTORS�IN�NEW�SAT ŠBSR.S‚ALDESC4ŠMOVE.L�SATDBUF-B(A5),A0ƒALLOCATE�SECTORS�IN�OLD�SAT ŠBSR.S‚ALDESCŠMOVE.B�#1,SATFLG-B(A5)ŠMOVEM.L�(A7)+,D0/A0ŠRTSŠPAGE*O*********************************************************************************ˆALDESC�1.00�6/21/80�HBN6*O*********************************************************************************;*ˆALDESC�ALLOCATES/DEALLOCATES�GIVEN�SECTORS�IN�EITHER�SAT.A*ˆSECTORS�ARE�ALLOCATED/DEALLOCATED�REGARDLESS�OF�CURRENT�STATUS.*"*ˆON�ENTRY:�D1�=�PSN�OF�1ST�SECTOR$*’D2�=�NUMBER�OF�CONSECUTIVE�SECTORS*’A0�=�SAT�BUFFER�ADDRESS*’D0�=�0�IF�DEALLOCATE*—1�IF�ALLOCATE* ALDESC„EQU„**&ŠMOVEM.L�D0-D5/A0,-(A7)„SAVE�REGISTERS ŠTST.L‚D2 ŠBEQ.S‚ALDERT**ˆFIND�STARTING�BYTE�AND�BIT�#*%ŠMOVE.L�D0,D5ŽSAVE�ALLOC/DEALLOC�FLAGCŠBSR.S‚OFSBIT‚GET�OFFSET�AND�BIT�NUMBER�FOR�1ST�PSN�INTO�SAT�BUFFERALDE05„TST.B‚D5‘ALLOCATE?ŠBNE.S‚ALDE10�YES!ŠBCLRƒD3,(A0,D4.L)‡NO,�DEALLOCATE ŠBRA.S‚ALDE15!ALDE10„BSETƒD3,(A0,D4.L)‡ALLOCATEALDE15„SUB.L‚#1,D2ŽDONE?ŠBEQ.S‚ALDERT�YES,�RETURNŠADD.L‚#1,D1ŽNOŠSUB.W‚#1,D3ŽMOVE�TO�NEXT�BIT&ŠBPL„ALDE05�HAVE�TO�MOVE�TO�NEXT�BYTE?$ŠMOVE.L�#7,D3ŽYES,�START�AT�HIGH�BITŠADD.W‚#1,D4ŽNEW�OFFSET)ŠBRA„ALDE05�GO�MARK�NEXT�SECTOR�ALLOCATED/ALDERT„MOVEM.L�(A7)+,D0-D5/A0„RESTORE�REGISTERSŠRTSŠPAGE*O*********************************************************************************ˆOFSBIT�1.00�6/25/80�HBN6*O********************************************************************************B*ˆOFSBIT�CALCULATES�BIT�NUMBER�AND�OFFSET�FOR�GIVEN�PSN�INTO�A�SAT*ˆBUFFER**ˆON�ENTRY:�D1�=�PSN*$*ˆON�RETURN:�D3.W�=�BIT�NUMBER�(0-7)&*“D4.L�=�OFFSET�TO�BYTE�WITH�GIVEN�BIT* OFSBIT„EQU„*ŠMOVE.L�D1,D4ŽPSNŠLSR.L‚#3,D4ŽDIV�8�FOR�OFFSETŠMOVE.L�D1,D3ŽPSN ŠLSL.L‚#3,D4ŠSUB.L‚D4,D3ŽD3�=�REMAINDERŠLSR.L‚#3,D4ŽREESTABLISH�OFFSET ŠSUB.L‚#7,D3ŠNEG.L‚D3‘BIT�POSITIONŠRTSŠPAGE*O*********************************************************************************ˆDECBINW�1.00�7/3/80�HBN6*O********************************************************************************F*ˆDECBINW�CONVERTS�DECIMAL�NUMBER�TO�BINARY�WORD;�ERROR�IS�RETURNED�IFG*ˆA�CHARACTER�OTHER�THAN�0�THRU�9�IS�ENCOUNTERED�OR�NUMBER�IS�TOO�LARGE*C*ˆON�ENTRY:�A0�=�ADDRESS�OF�DECIMAL�NUMBER�(MOST�SIGNIFICANT�DIGIT)2*’(A�SPACE,�CR,�'.',�',',�OR�';'�TERMINATES�FIELD)*"*ˆON�RETURN:�Z�=�1�IF�CONVERTED�OK*—0�IF�ERROR�WAS�FOUND*“D0�=�TERMINATING�CHARACTER(*“A0�->�BYTE�AFTER�TERMINATING�CHARACTER*“D1.W�=�BINARY�RESULT* DECBINWƒEQU„** ŠCLR.L‚D1 ŠCLR.L‚D0ŠMOVE.B�(A0)+,D0DECBIN1ƒSUB.B‚#'0',D0ŠBMI.S‚DECBRT�ERROR ŠCMP.B‚#9,D0ŠBHI.S‚DECBRT�ERROR ŠADD.L‚D0,D1ŠCMP.L‚#$FFFF,D1ŠOVERFLOW?ŠBHI.S‚DECBRT�ERRORŠMOVE.B�(A0)+,D0ŠCMP.B‚#'�',D0 ŠBEQ.S‚DECBRTŠCMP.B‚#';',D0 ŠBEQ.S‚DECBRTŠCMP.B‚#',',D0 ŠBEQ.S‚DECBRT ŠCMP.B‚#CR,D0 ŠBEQ.S‚DECBRTŠCMP.B‚#'.',D0 ŠBEQ.S‚DECBRT ŠMULUƒ#10,D1 ŠBRA„DECBIN1 DECBRT„RTSŠPAGEO************************************************************** ********************ˆBIN1HEX/BIN2HEX/BIN4HEX�1.00�7/1/80�HBN6*O********************************************************************************@*ˆBIN4HEX�CONVERTS�4�BYTE�BINARY�VALUE�INTO�ASCII�HEX�AND�STORES**ˆTHE�NUMBER�INTO�MEMORY�AT�GIVEN�LOCATION%*ˆBIN2HEX�CONVERTS�2�BYTES�SIMILARLY.$*ˆBIN1HEX�CONVERTS�1�BYTE�SIMILARLY.*&*ˆON�ENTRY:�D1�=�VALUE�TO�BE�CONVERTED*’A0�=�FIELD�TO�PUT�IT�INTO**ˆON�RETURN:�D0�-�CHANGED* BIN4HEXƒEQU„**ŠMOVEM.L�D0-D1,-(A7) ŠBSR.S‚BINHEXŠMOVE.B�D0,7(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.B�D0,6(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.B�D0,5(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.B�D0,4(A0) ŠLSR.L‚#4,D1 ŠBRA.S‚BNHX0*BIN2HEXƒEQU„*’ENTRY�POINT*ŠMOVEM.L�D0-D1,-(A7)BNHX0…BSR.S‚BINHEXŠMOVE.B�D0,3(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.B�D0,2(A0) ŠLSR.L‚#4,D1 ŠBRA.S‚BNHX1*BIN1HEXƒEQU„*’ENTRY�POINT*ŠMOVEM.L�D0-D1,-(A7)BNHX1…BSR.S‚BINHEXŠMOVE.B�D0,1(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.B�D0,(A0)ŠMOVEM.L�(A7)+,D0-D1ŠRTSŠPAGEO*********************************************************************************ˆBINHEX�1.00�7/8/80�HBN6*O********************************************************************************5*ˆBINHEX�CONVERTS�4�BIT�BINARY�VALUE�INTO�A�HEX�DIGIT*+*ˆON�ENTRY:�D1.B�=�BITS�0-3�TO�BE�CONVERTED**ˆON�RETURN:�D0.B�=�HEX�DIGIT *“Z�=�1�IF�OK *—0�IF�ERROR BINHEX„EQU„** ŠMOVE.B�D1,D0 ŠAND.B‚#$F,D0 ŠCMP.B‚#9,D0ŠBHI.S‚BINHEX1 ŠOR.Bƒ#$30,D0ŠRTSBINHEX1ƒSUB.B‚#$A,D0ŠADD.B‚#'A',D0ŠRTSŠPAGEO*********************************************************************************ˆBIN2DEC�1.00�12/29/80�TB59*O********************************************************************************D*ˆBIN2DEC�CONVERTS�2�BYTE�BINARY�VALUE�INTO�ASCII�DECIMAL�AND�STORES**ˆTHE�NUMBER�INTO�MEMORY�AT�GIVEN�LOCATION*(*ˆON�ENTRY:�D1.W�=�VALUE�TO�BE�CONVERTED0*’A0ƒ=�ADDRESS�OF�FIELD�TO�PLACE�CONVERTED�ASCII*!*ˆON�RETURN:�NO�REGISTERS�CHANGED*TENS†DC.Lƒ1000,100,10,1,0* BIN2DECƒEQU„*ŠMOVEM.L�A0/A1/D0-D2,-(A7)(ŠAND.L‚#$0000FFFF,D1†ZERO�OUT�HIGH�ORDER(ŠLEA„TENS,A1ŒADDRESS�OF�CONVERSION�TABLEBIN2DEC0‚TST.L‚(A1)ŠBEQ.S‚BIN2DECR‹BRANCH�IF�DONEŠMOVE.B�#$30,D2ŒASCII�0%BIN2DEC1‚SUB.L‚(A1),D1ŒSUBTRACT�10**N!ŠBCS.S‚BIN2DEC2‹BRANCH�IF�TOO�BIGŠADD.B‚#1,D2ŽCONTINUEŠBRA.S‚BIN2DEC1,BIN2DEC2‚ADD.L‚(A1)+,D1‹RESTORE,�ADV�POINTER-ŠMOVE.B�D2,(A0)+‹PLACE�ASCII�DIGIT�INTO�FIELD#ŠBRA.S‚BIN2DEC0‹CONTINUE�CONVERSION4BIN2DECR‚MOVEM.L�(A7)+,A0/A1/D0-D2�RESTORE�REGISTERSŠRTSŠPAGEO*********************************************************************************ˆCHKKEY�1.00�7/20/80�HBN6*O********************************************************************************%*ˆCHKKEY�COMPARES�2�KEYS�BYTE�BY�BYTE**ˆON�ENTRY:�D0.B�=�KEY�LENGTH)*’A0�->�KEY�THAT�USUALLY�SHOULD�BE�LARGER*’A1�->�OTHER�KEYA*ˆON�RETURN:�SR�-�SET�ACCORDING�TO�LAST�COMPARE�-�CMP.B�(A1),(A0)*CHKKEY„MOVEM.L�D0/A0-A1,-(A7)CHKK00„CMP.B‚(A1)+,(A0)+ ŠBNE.S‚CHKKRT ŠSUB.B‚#1,D0 ŠBNE„CHKK00CHKKRT„MOVEM.L�(A7)+,D0/A0-A1ŠRTSŠPAGE*O*********************************************************************************ˆIM�1.00�7/8/80�HBN6*O********************************************************************************-*ˆIM�CHECKS�CURRENT�MODE�FOR�INTERACTIVE�MODE**ˆON�ENTRY:�D7�=�MODE�STATUS**ˆON�RETURN:�Z�=�1�IF�IM+*—0�IF�NIM�OR�C-OPTION�ON,�OR�IM�TURNED�OFF*IMˆEQU„*ŠTST.W‚D7‘C-OPTION�ON?ŠBMI.S‚IMRT�YES!ŠCMP.B‚#1,D7ŽNO,�IM�MEANS�D7.B�=1IMRT†RTSŠPAGE*O**********************************************************************************ˆHEXBIN�1.00�6/27/80�HBN6*O********************************************************************************1*ˆHEXBIN�CONVERTS�ONE�HEXADECIMAL�DIGIT�TO�BINARY*"*ˆON�ENTRY:�D0.B�=�ASCII�HEX�DIGIT3*ˆON�RETURN:�Z�=�1�IF�CONVERT�OK,�Z�=�0�IF�BAD�CHAR*“D1.B�=�4�BIT�BINARY�VALUE*“D0�-�CHANGED** HEXBIN„EQU„*ŠSUB.B‚#$3 0,D0Œ0-9?ŠBMI.S‚HEXBRT�TOO�LOWŠCMP.B‚#'F'-'0',D0ŠBHI.S‚HEXBRT�TOO�HIGH ŠCMP.B‚#9,D0ŠBHI.S‚HEXB05�NOT�0-9-HEXB00„MOVE.B�D0,D1ŽRETURN�BINARY�VALUE�IN�D1 ŠCLR.L‚D0 HEXBRT„RTSHEXB05„SUB.B‚#'A'-'0',D0ˆA-F?ŠBMI.S‚HEXBRT�NO,�ERRORŠADD.B‚#$A,D0�YES ŠBRA„HEXB00*ŠPAGE*O**********************************************************************************ˆCLRBUF�1.00�7/3/80�HBN6*O********************************************************************************!*ˆCLRBUF�ZEROES�A�BLOCK�OF�MEMORY*'*ˆON�ENTRY:�D1�=�BYTE�COUNT�TO�ZERO�OUT*’A1�=�STARTING�ADDRESS*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED* CLRBUF„EQU„**ŠMOVEM.L�D1/A1,-(A7)CLRB00„CLR.B‚(A1)+ ŠSUB.L‚#1,D1 ŠBNE„CLRB00ŠMOVEM.L�(A7)+,D1/A1ŠRTS*O**********************************************************************************‡BLNKFL�1.00�9/9/80�HBN6*O*********************************************************************************ˆBLNKFL�BLANK�FILLS�THE�FIELD* *ˆON�ENTRY:�D2�=�OFFSET�TO�FIELD *’D3�=�BCT*’A1�=�BASE�ADDRESS*(*ˆON�RETURN:�ALL�REGISTERS�ARE�UNCHANGED*BLNKFL„MOVEM.L�A0/D3,-(A7)ŠLEA„(A1,D2),A0BLNKF0„MOVE.B�#'�',(A0)+ ŠSUB.L‚#1,D3 ŠBNE„BLNKF0ŠMOVEM.L�(A7)+,A0/D3ŠRTSŠPAGE*O**********************************************************************************ˆALPHA�1.00�7/3/80�HBN6*O********************************************************************************>*ˆALPHA�CHECKS�THAT�PASSED�CHARACTER�IS�AN�UPPER�CASE�ALPHABET***ˆON�ENTRY:�D0.B�=�CHARACTER�TO�BE�CHECKED*$*ˆON�RETURN:�ALL�REGISTERS�UNCHANGED*“Z�=�1�IF�ALPHA *—0�IF�NOT* ALPHA…EQU„*ŠCMP.B‚#'A',D0 ŠBLT.S‚ALPH1ŠCMP.B‚#'Z',D0 ŠBHI.S‚ALPH1ŠCMP.B‚D0,D0ŽRETURNƒZ�=�1 ALPH1…RTS**O*********************************************************************************ˆALFNUM�1.00�7/7/80�HBN6*O********************************************************************************5*ˆALFNUM�CHECKS�THAT�PASSED�CHARACTER�IS�ALPHANUMERIC***ˆON�ENTRY:�D0.B�=�CHARACTER�TO�BE�CHECKED*"*ˆON�RETURN:�Z�=�1�IF�ALPHANUMERIC *—0�IF�NOT*“ALL�REGISTERS�UNCHANGED* ALFNUM„EQU„* ŠBSR.S‚ALPHA ŠBEQ.S‚ALFN1ŠCMP.B‚#'0',D0 ŠBLT.S‚ALFN1ŠCMP.B‚#'9',D0 ŠBHI.S‚ALFN1ŠCMP.B‚D0,D0ŽRETURN‚Z�=�1 ALFN1…RTS*ŠENDéé=/*=/*†SCRATCH.AF=/**=/* Chain file to assemble SCRATCH utility=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to SCRATCH.LS=/*=/IFC \1ƒ=ARG�SCRATCH.LS=/ENDIF=/*$=ASM SCRATCH.SA,SCRATCH.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDéé  ééééô=/*=/*†SCRATCH.LF=/*(=/* Link chain file to create SCRATCH.LO=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to SCRATCH.LL=/*=/IFC \1ƒ=ARG�SCRATCH.LL=/ENDIF=/*=LINK ,SCRATCH.LO,\1;HAMIX ATTRIBUTES PSEG SEG0:0-14 $0INPUT SCRATCH.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééééýŠLIST ŠLLEN�120<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************)*‰PROGRAM�NAME�IS‚S�C�R�A�T�C�H�.�D�A�T�A***,*�*****ƒBLANK�VOLUME�NAME�DISK�COMMANDƒ******#*‰THIS�PROGRAM�WILL�ZERO�THE�VOLUME$*‰IDENTIFICATION�NAME�ON�SECTOR�ZERO/*‰THE�FORMAT�OPTION�WILL�RESULT�IN�THE�DISKETTE*‰BEING�REFORMATTED****** *‰REV�1.00!*‰REGISTERS�USED:�0�1�2�3�4�5�6�7*’D…*�*�*�*�*�*�**’A…*�*�*�*�  *�*�***=****************************************************************L*****************************************************************************‰SYSTEM�FILES�INCLUDED*‰FME*‰IOE*‰TR1M*****************************************************************************ŠNOLISTŠINCLUDE‚9995.&.FME.EQŠINCLUDE‚9995.&.IOE.EQŠINCLUDE‚9995.&.TR1.EQŠLIST ŠPAGE2****************************************************ˆ***ƒS�C�R�A�T�C�H‚COMMAND*�DATA�SEGMENT�(DSEG)ƒ****1**************************************************ˆ****‚EQUATE�AREA‚******* BEGDATAƒEQU„0#STKLEN„EQU„50‘STACK�LENGTH�IN�WORDS*COMMSIZE‚EQU„160�INPUT�COMMAND�BUFFER�SIZE DSKLUI„EQU„1(DSKLUO„EQU„2’DISK�LOG�UNIT�ASSIGN�OUTPUT!LISTLU„EQU„3’LISTING�LOGICAL�UNITTSKNAM„EQUƒ'SCRA'ŽMY�TASK�NAMESECLEN„EQU„256�SECTOR�LENGTH** ŠSECTION�0!ŠXREF�PARSE,OPTION,EDITFILE,SBARG**‰NEXT�WORD�BOUNDRY�MACRO** NEXTWB„MACROŠNOLISTŠDS.W�0ŠLISTŠENDM*SET_ADDR‚MACRO ŠPEA„\1(PC)ŠMOVE.L�(A7)+,\2-PBA(A4)ŠENDM*2******************************************************†DATA�SEGMENT�(DSEG)ƒ***1*************************************************;*************************************************************‰***ƒDATA�AREA‚*****;*********************************************************** PBA‡EQU‡*STARDATA‚EQU‡* ;************************************************************‰REVISION�INFORMATION^MRW'Q/W7M?WGQO;*********************************************************** %ŠDC.Bƒ'122084'‹LAST�MODIFICATION�DATE ŠDC.Bƒ'�'ŠDC.Bƒ'4'�REVISION�NUMBER  ŠPAGE:***********************************************************‰USER�STACK�AREA:********************************************************** ŠDS.WƒSTKLEN PROGSTKƒEQU�*ŠDC.Lƒ0 8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++)*‰COMMLIN�IS�THE�AREA�THE�COMMAND�LINE�IS**‰READ�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ŠNEXTWB,COMMLINƒCOMLINE�COMMSIZE‚***‚INPUT�BUFFER‚**   :*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++7*‰EQUATES�FOR�VERSION�&�REVISION�FOR�DISK�INITALIZATION:*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ŠNEXTWBEVIDVNOƒDC.Bƒ'30'EVIDRNOƒDC.Bƒ'00'*<************************************************************* *‰BUFFER�AREA�FOR�I/O�OPERATIONS**‰BUFFER�SIZE�IS�2�SECTORS<************************************************************ BUFFIO„EQU�* ŠDS.BƒSECLENBUFFIOEƒEQU„*-1�END�OF�BUFFER+ŠDS.Lƒ2’BUFFER�CUSHION�-�MUST�FOLLOW�BUFFER  ŠPAGE<************************************************************%*‰IOS�PARAMENTER�TABLE�FOR�DISK�WRITE*<************************************************************ ŠNEXTWB.ŠIOS.DSK�IOREAD,IOPBLK+IOPRAN,DSKLUO,0,0,0,0,0 <*************************************************************!*‰FORMAT�DISKETTE�PARAMETER�BLOCK*<************************************************************ŠNEXTWB#ŠIOS.FORM�IOFRMT,0,DSKLUO,0,0,0,0,0 <**************************************************************ŒIOS�PARAMETER�TABLE(*‰SET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK*<************************************************************ ŠNEXTWB/ŠIOS.OUT6�IOWRIT,IOPFOR+IOPWAT,LDFLUN,0,0,0,0,00ŠIOS.OUT6I�IOWRIT,IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0Š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�ASSIG! NMENT,*‰IS�DIFFERENT�FROM�STANDARD�PARAMETER�TABLE*%*************************************ŠNEXTWB 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)     *******************************************-*‰PARM�BLOCK�OUTPUT�WITH�INPUT�FOR�DEVICE�MSG*******************************************ŠNEXTWBŠIOS.INP6�IOREAD,IOPFOR,CDFLUNŠIOS.INP4�IOREAD,IOPFOR,CDFLUN %*‰FHS�PARAMETER�BLOCK�FOR�DISK�OUTPUT ŠNEXTWB OUTFHS„EQU�*ŠDC.WƒFHASGN�COMMAND*ŠDC.WƒFOPEREWŒOPTIONS-EXCLUSIVE�READ/WRITEŠDC.Bƒ0’STATUSŠDC.BƒDSKLUO�LOGICAL�UNIT�NUM!OUTVOL„DC.Lƒ$20202020ŠVOLUME�NAMEŠDC.Wƒ0’USER�NUMŠDC.Lƒ$20202020ŠCAT�NAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILE�NAMEŠDC.Lƒ$20202020ŠDC.Wƒ$2020ŽEXTENSION ŠDC.Wƒ0’*ŠDC.Bƒ0’WRITE�PROTECT�CODEŠDC.Bƒ0’READ�PROTECT�CODEŠDC.Wƒ0’RECORD�LENGTHŠDC.Lƒ0’CONTIGUOUS�FILE�SIZE ŠDC.Lƒ0,0,0  7********************************************************,*‰PARAMETER�TABLE�FOR�FETCH�DEVICE�NMENONICS*7******************************************************* ŠNEXTWBFETDEV„DC.WƒFHFDMN�CMDŠDC.WƒFOPFRA�OPTIONSŠDC.Wƒ0’STATUS�&�RESERVEDFETDEVIƒDC.Lƒ0’BUFFER�********ŠDC.LƒSECLEN�BUFFER�LENGTH****ˆ***ƒ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/USERNUMƒDC.Wƒ0’DEFAULT�USER�NUM�(16�BIT�BINARY)*CATNAM„DC.Lƒ0,0�SAVE�DEFAULT�CATAGORY�NAMEREGD6…DC.Lƒ0’SAVE�REG�6 ŠDC.Lƒ0’REG�7ADDREG„DS.Lƒ1’ADDRESS�REG'SŠDS.Lƒ1ŠDC.Wƒ0’TOP�HALF�OF�REG�2ADDREG2ƒDC.Wƒ0’LOG�ON�USER�NUMŠDS.Lƒ6’OTHER�REGS ŠNEXTWBOKANS…DC.Bƒ'„'�OK�MSG�ANSWEROKANSE„EQU„*-1ŠDC.Bƒ'�'�SPACE�FOR�CR ŠNEXTWB'FORMANSƒDC.Bƒ'„'�FORMAT�DISKETTE�ANSWERFORMANSE‚EQU„*-1ŠDC.Bƒ'�'�SPACE�FOR�CR ŠNEXTWB%OFLAG…DC.Lƒ0’ADDR�OF�MORE�OUTPUT�SAVE(INFORN„DC.Bƒ0’DISK�HAS�NO�VOL�NAME�ON�IT%FORMFLAG‚DC.Bƒ0’FORMATT�DISKETTE�FLAG ŠNEXTWB SAVOUT„DC.Lƒ05SAVEOPTƒDC.Lƒ0’SAVE�OPTION�ADDRESS�POINTER�FROM�PARSEŠPAGE.**********************************************"*‰START�OF�PRINT�HEADERS�&�BUFFERS.********************************************** ŠNEXTWBERRMSGNƒDC.Wƒ'‚'*ŠNEXTWB* OKM‡EQU�*ŠDC.Bƒ'OK�TO�SCRATCH�(Y/N)ƒ'DEVM1…DC.Lƒ'„' ŠDC.Bƒ'�?'OKMES…DC.Bƒ'ƒVOLUME�'$VOLM1…DC.Lƒ'„'�VOLUME�NAME�GOES�HERE ŠDC.Wƒ'�?' OKME†DC.Bƒ'�'ŠNEXTWB* FORMSG„EQU„*/ŠDC.Bƒ'DO�YOU�WANT�TO�FORMAT�DISKETTE�(Y/N)�?‚'FORMSGEƒEQU„*-1ŠNEXTWB FORSMSGƒEQU�*ŠDC.Bƒ'START�FORMAT'FORSMSGE‚EQU„*-1ŠNEXTWB* ENDDATAƒEQU„* ŠPAGEJ****************************************************************************’ERROR�MESSAGE�PARAMETER�BLOCK*J************************************************************************** ŠDS.Wƒ0EM_PBLK: -EM_D0…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�DESIRED+EM_TLUNƒDC.Bƒ0‚USER�TERMINAL�LUN�-�(LDFLUN)$EM_QRC„DC.Bƒ0‚QUERY�RETURN�CHARACTER+EM_KLUNƒDC.Bƒ0‚USER�KEYBOARD�LUN�-�(CDFLUN)3EM_SPA„DC.Lƒ0‚START�ADDRESS�FOR�USER�TEXT�PLUG�POOL1EM_EPA„DC.Lƒ0‚ENDƒADDRESS�FOR�USER�TEXT�PLUG�POOLŠPAGE BEGPROGƒEQU�**<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<**************************************************************6*ˆ***‚PROCEDURE�SECTION�FOR�INIT�DISKETTE�COMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;***********************************************************    &***************************************.*ˆ**ƒSAVE�DEFAULT�VALUE�PASSED�FROM�SYSTEM�****'*************************************** 5ŠLEA„PBA(PC),A7�SAVE�CONTENTS�OF�A! LL�REGISTERS�BUT�A7$ŠMOVEM.L�D0-D7/A0-A7,STSKNAM-PBA(A7)1ŠLEA„PROGSTK(PC),A7‰LOAD�THE�PROGRAM�BASE�ADDRESS,ŠLEA„PBA(PC),A4�AND�SET�UP�THE�STACK�POINTER'***************************************+*‰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***�***„DRIVER‚BLOCK„****,*********************************************ˆATTACH�TO�CMDSPORT�SEGEMENT,********************************************ŠSET_ADDR�BUFFIO,FETDEVIŠSET_ADDR�BUFFIO,DSKIOS+IOSSADŠSET_ADDR�BUFFIOE,DSKIOS+IOSEAD ŠSET_ADDR�FORMANS,INP6IOS+IOSSAD!ŠSET_ADDR�FORMANSE,INP6IOS+IOSEADŠSET_ADDR�OKANS,INP4IOS+IOSSADŠSET_ADDR�OKANSE,INP4IOS+IOSEADŠPAGE#************************************&*‰*****�CALL�COMMAND�PARSE�ROUTINE‚****#************************************ /LBUFF…LEA„COMMLIN(PC),A0‰SAVE�BUFFER�START�ADDR*ŠTST.L‚REGD6-PBA(A4)†IS�COMMAND�LINE�EMPTYŠBEQ„ERINVALŒERROR�IF�EMPTY* ŠBSR„PARSEŽGO�TO�DISECT�CMD�LINEŠTST.L‚D0‘CK�F0R�ANY�ERR0RSŠBMI„ERINVALŒBR�IF�ERR0R*#ŠBTST.L�#22,D0�IS�NULL�INPUT�BIT�ONŠBNE„ERINVALŒBR�IF�SO -ŠBTST.L�#6,D0ŽCHECH�FOR�OPTIONS�IN�COMM.�LINEŠBEQ„EROPTINV‹BR�IF�YES %ŠBTST.L�#14,D0�CHECK�FOR�OUTPUT�FIELDŠBEQ„ERINVALŒBR�IF�YES     * CKDR1„EQU�***#‰BSR.S�INITIN�GO�TO�INPUT�INIT�ROUT*-*********************************************#*‰CHECK�FOR�FORMAT�MESSAGE�&�ANSWER*8ŠSET_ADDR‚FORMSG,OUT6IIOS+IOSSADƒ*�POINT�TO�START�OF�MSG7ŠSET_ADDR‚FORMSGE,OUT6IIOS+IOSEAD‚*�POINT�TO�END�OF�MSG  "ŠIOSCALL�OUT6IIOS(PC)†SEND�MESSAGEŠBNE„FATALERR‹ERROR**‰RECEIVE�ANSWER $ŠIOSCALL�INP6IOS(PC)‡RECIEVE�MESSAGEŠBNE„FATALERR‹ERROR ŠBSR„SBARG ŠBMI„FATALERR*.**********************************************+ŠCMP.B‚#'Y',FORMANS-PBA(A4)†IS�ANSWER�YES�?ŠBNE.S�CKDR0–BR�IF�NO+ŠMOVE.B�#1,FORMFLAG-PBA(A4)‡SET�FORMAT�FLAG CKDR0…EQU�****"ŠBSR„SETLU3�ASSIGN�LU3�TO�TERMINAL-CKFORM„TST.B‚FORMFLAG-PBA(A4)ƒFORMAT�FLAG�SETŠBEQ.S‚DOINIT�NO ŠBSR„DOFORM*ŠPAGE8**********************************************************“GO�TO�INIT�DISK�ROUTINE*2***************************************************.DOINIT„BSR„INITDSKŒGO�TO�INITALIZATION�ROUTINE* *‰STOP�THE�PROGRAM�AT�THIS�POINT STOPIT„EQU�*4ŠMOVE.W�#FHCLOS,OUTFHS-PBA(A4)ƒCLOSE�COMMAND�TO�PARMŠFHSCALL�OUTFHS(PC)ŠBNE„FATALERR‹ERROR** ŠERQ.TERMŠPAGE/************************************************$*ˆ**‚INITALIZATION�OF�INPUT�DISK‚***3*ˆ***‚SET�UP�FHS�PARM�BLOCK�BASED�ON�CMD�LINE�INPUT1*ˆTHIS�ROUTINE�WILL�DO�ASSIGN�AND�ATTRIBUTE�CALLS*/************************************************ INITIN EQU *"ŠLEA„OUTFHS(PC),A6ŠINIT�PARM�BLOCK-ŠLEA„COMMLIN(PC),A0‰INIT�COMMAND�LINE�POINTER*'*****************************************ˆCALL�EDIT�FILE�FOR�INPUT**ˆ**ƒCALL�EDITFILE�ROUTINE�***ˆA0�=�INPUT�COMMAND�START*ˆA6�=�ADDR�OF�PARM�BLOCK*&***************************************!ŠBSR„EDITFILE‹MAKE�EDIT�FILE�CALLŠBMI„ERINVALŒBRA�IF�ERROR*ŠBTSTƒ#1,D0ŽCK�FOR�DEVICEŠBEQ.S‚INASGN�NOŠCLR.L‚D0‘SET�DEVICE�FLAG*INASGN„MOVE.L�OUTVOL-PBA(A4),D4ŠBSR.S‚CKTABŽGO�TO�DEV�ROUTINE*(*****************************************‰ASSIGN�INPUT�VOLUME�OR�DEVICE+********************************************ŠFHSCALL�OUTFHS(PC)ŠBNE„FATALERR‹ERROR*-**********************************************‰OK�TO�INITIALIZE�MSG�&�ANSWER-**********************************************&ŠCMP.L‚#'„',VOLM1-PBA(A4)„VOL�IN�MSG�?ŠBNE.S‚INIT1”YES9‰SET_ADDR�OKMES,OUT6IIOS+IOSEADƒPOINT�TO�END�OF�SHORT�MSGŠBRA.S‚INIT2”CONTINUE INIT1…EQU�*7‰SET_ADD" R�OKME,OUT6IIOS+IOSEAD„POINT�TO�END�OF�LONG�MSGŠMOVE.B�#'�',OKMES-1-PBA(A4) INIT2…EQU�*6‰SET_ADDR�OKM,OUT6IIOS+IOSSAD…POINT�TO�BEGINING�OF�MSG ŠIOSCALL�OUT6IIOS(PC)ŒPRINT�MSG ŠBNE„FATALERR*$ŠIOSCALL�INP4IOS(PC)�CALL�FOR�ANSWERŠBNE„FATALERR‘BR�IF�ERROR ŠBSR„SBARGŠBMI„FATALERR‘BR�IF�ERROR&ŠCMP.B‚#'Y',OKANS-PBA(A4)‡ANSWER�YES�?ŠBNE„STOPIT“ABORT*INEXITƒRTSžRETURN‰PAGE6*******************************************************&*ˆROUTINE�TO�DO�FETCH�DEVICE�MNEMONICS *ˆAND�GET�VOLUME�NAME�IF�PRESENT7*ˆD4�CONTAINS�THE�DEVICE�BEING�CHECKED�FOR�IN�THE�TABLE*5****************************************************** CKTAB…EQU�*-ŠLEA„FETDEV(PC),A0ŠINIT�POINTER�TO�PARM�BLOCK)ŠLEA„BUFFIO(PC),A1ŠINIT�POINTER�TO�BUFFERŠMOVE.L�D0,D2ŽINIT�DEVICE�FLAG*ŠFHSCALL�FETDEV(PC)ˆGET�TABLEŠBNE„FATALERR‹ERROR'ŠMOVE.W�FHSLEN(A0),D1†SAVE�#�OF�ENTRIES* CKTAB2„EQU�*ŠTST.L‚D2‘IS�THIS�A�DEVICEŠBEQ.S‚CKTAB3�YES*‰PROCESS�VOLUME$ŠCMP.L‚FDVVOL(A1),D4†CK�FOR�VOL�NAMEŠBEQ.S‚CKTABV�YES ŠBRA.S‚CKTAB4 CKTAB3„EQU�*"ŠCMP.L‚FDVDEV(A1),D4†CK�FOR�DEVICEŠBEQ.S‚CKTABF�FOUND CKTAB4„EQU�*ŠSUB.W‚#1,D1ŽREDUCE�COUNT/ŠBLE.L‚ERDEVICE‹BR�IF�DEVICE�NOT�FOUND�IN�TABLEŠADD.L‚#FDVLEN,A1‰ADD�SIZE ŠBRA„CKTAB2* CKTABF„EQU�*+ŠMOVE.L�D4,DEVM1-PBA(A4)�MOVE�DEVICE�TO�MSG(ŠCMP.L‚#0,FDVVOL(A1)�CK�FOR�FOREIGN�DISKŠBEQ.S‚CKTABN—YES0ŠMOVE.L�FDVVOL(A1),VOLM1-PBA(A4)…MOVE�VOL�TO�MSG;ŠMOVE.L�VOLM1-PBA(A4),OUTVOL-PBA(A4)‰MOVE�VOL�TO�PARM�TABLEŠBRA.S‚CKTABEX–EXIT CKTABN„EQU�*,ŠMOVE.B�#1,INFORN-PBA(A4)ŒINPUT�FOREIGN�DISKŠBRA.S‚CKTABEX*3CKTABV„MOVE.L�D4,VOLM1-PBA(A4)�MOVE�VOL�NAME�TO�MSG3ŠMOVE.L�FDVDEV(A1),DEVM1-PBA(A4)…MOVE�DEVICE�TO�MSG*CKTABEXƒ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„LU3AFHS(PC),A0‰INIT�ADDR ŠFHSCALL�(A0)*‰RETURN�FROM�FHS�CALLŠBNE.S‚FATALERR‹BAD�RETURN ŠRTS—RETURN*‰PAGE2****************************************************ˆROUTINE�TO�INITALIZE�DISK*2*************************************************** INITDSKƒEQU�**ŠIOSCALL�DSKIOS(PC)�READ�SECTORŠBNE.S‚FATALERR’ERROR+ŠMOVE.W�#IOWRIT,DSKIOS-PBA(A4)„SET�TO�WRITEŠCLR.L‚BUFFIO-PBA(A4)*.************************************************ˆDO�WRITE�TO�OUTPUT�FILE*.***********************************************IOSWRITE‚IOSCALL�DSKIOS(PC)ŠBNE.S‚FATALERR‹ERRORŠRTS 7********************************************************4*ˆROUTINE�TO�SET�UP�AND�CALL�DISKETTE�FORMAT�ROUTINE*7******************************************************** DOFORM„EQU�*6ŠSET_ADDR�FORSMSG,OUT6IOS+IOSSADƒ*�POINT�TO�BEG�OF�MSG7ŠSET_ADDR�FORSMSGE,OUT6IOS+IOSEAD‚*�POINT�TO�END�OF�MSGŠIOSCALL�OUT6IOS(PC)�*�SEND�MSG*(ŠIOSCALL�FORMIOS(PC)‡CALL�TO�FORMAT�DISKŠBEQ.S‚FORMEXIT‹GOOD#*‰MOVE.L�#'FORM',IOERR†MOVE�MESSAGE*‰MOVE.W�#'AT',IOERR+2ŠBRA.S‚FATALERR‹GO�TO�ERROR�RT***FORMEXIT‚RTS˜RETURN**ŠPAGEJ***************************************************************************+*‰ERROR�MESSAGES�FROM�ERROR�MESSAGE�HANDLER*J*************************************************************************** ERDEVICE:<ŠMOVE.L�#EM_NVDEV,D0‹'INVALID�DEVICE�NAME�FOR�REQUEST'�ERRORŠBRA.S‚FATALERR *INVAL:7ŠMOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�MESSAGE,�BUT�RETURN!ŠBSR.S…C_EM_PGMŠRTS* EROPTINV:*ŠMOVE.L„#EM_NVO,D0Š'INVALID�OPTION'�ERROR.ŠBRA.S…FATALERR* EROPTCON:-ŠMOVE.L„#EM_OPTCF,D0ˆ'OPTION�CONFLICT'�ERROR.ŠBRA.S…FATALERR*ERINVAL:)ŠMOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�ERROR.***J***************************************************************************2*ˆROUTINE�TO�CALL�ERROR�MESSAGE�HANDLER,�THEN�DIE.*J**************************************************************" ************* FATALERR:‰BSR.S…C_EM_PGM2ERREXIT‚ERQ.TERM‚#0,#$C000‹EXIT�WITH�ERROR�STATUS.***M****************************************************************************** *’CALL�TO�ERROR�MESSAGE�HANDLER.*’OUTPUT�GOES�TO�LU�6.**‰CALLƒBSR�C_EM_PGM*A*‰INPUTS„D0�AND�A0�SET�BY�IOS�OR�FHS�CALL,�OR�D0�FOR�NON�IOS/FHS.*"*ˆOUTPUTSƒNO�REGISTER�PRESERVATION*N******************************************************************************* C_EM_PGM:C‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A4)ƒSAVE�D0,A0�IN�ERROR�MSG�PARAM�BLOCK.4‰LEA‡EM_PBLK(PC),A0ŽPOINT�A0�TO�THE�PARAMETER�BLOCK.:‰MOVE.B„#6,EM_TLUN-EM_PBLK(A0)‚SET�THE�LU�FOR�OUTPUT�TO�6. ‰MOVE.L„#2,D0‰TRAP†#4‰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* *ˆREGISTERS�USED‚0�1�2�3�4�5�6�7 *’A…*�*�* *’D…*�*ƒ*.*********************************************** 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�ONE�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(BINASC„DC.B‚'0123456789ABCDEF'‚HEX�TABLEŠPAGE ŠEND„BEGPROGééééééé=/*=/*†SESSIONS.AF=/*+=/* Chain file to assemble SESSIONS utility=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to SESSIONS.LS=/*=/IFC \1ƒ=ARG�SESSIONS.LS=/ENDIF=/*%=ASM SESSIONS.SA# ,SESSIONS.RO,\1;RZ=60=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*}=/*=END  ééééééW=/*=/*†SESSIONS.LF=/*)=/* Link chain file to create SESSIONS.LO=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to SESSIONS.LL=/*=/IFC \1ƒ=ARG�SESSIONS.LL=/ENDIF=/*=LINK ,SESSIONS.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000INPUT SESSIONS.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé# `>SESSIONS IDNT 4,0 8211020817 DISPLAY ONLINE AND BATCH SESSIONSO********************************************************************************4*ˆSESSIONS�UTILITY�DISPLAYS�THE�SESSIONS�IN�PROGRESS**ˆHBR8*O******************************************************************************* PAGE***ˆSESSIONS�MODIFICATION�HISTORY**ˆREVISION�CODE�110282�4*#*ˆPLACED�EVERYTHING�UNDER�SECTION�0 *ˆMADE�CODE�POSITION�INDEPENDENT**‰PAGE***ˆINCLUDE�STATEMENTS**ˆINCLUDEƒ9995.&.IOE.EQ*‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰LIST‰PAGE ‰SECTION�0‰XDEF�SESSIONS ‰XREF�BDCONV PBA†EQU‡**œPROGRAM�BASE�ADDRESS‰DC.B�'122084�4'‰DS.B�32 STACK„EQU�*$ATSEGPAR DC.L 0,0,$20001000,'.STT',0WRITEPAR DC.W 2,0,6,0 ‰DC.L�0,0,0,0SEGBUFF‚DS.B�18WRITEH1‚DC.W�2,0,6,0 ‰DC.L�0,0,0,0WRITEH2‚DC.W�2,0,6,0 ‰DC.L�0,0,0,0 PAGE* *ˆINITIALIZE* SESSIONS:‰LEA‡PBA(PC),A6*œA6=�PROGRAM�BASE�ADDRESS‰LEA‡SEGBUFF(PC),A0"‰MOVE.L„A0,WRITEPAR-PBA+IOSSAD(A6)‰LEA‡SEGBUFF+9(PC),A0"‰MOVE.L„A0,WRITEPAR-PBA+IOSEAD(A6)3*œSET�START/END�ADDRESS�IN�WRITEPAR�PARAMETER�BLOCK‰LEA‡HEAD1(PC),A0!‰MOVE.L„A0,WRITEH1-PBA+IOSSAD(A6)‰LEA‡HEAD1E(PC),A0!‰MOVE.L„A0,WRITEH1-PBA+IOSEAD(A6)2*œSET�START/END�ADDRESS�IN�WRITEH1�PARAMETER�BLOCK ‰LEA‡HEAD2(PC),A0!‰MOVE.L„A0,WRITEH2-PBA+IOSSAD(A6)‰LEA‡HEAD2E(PC),A0!‰MOVE.L„A0,WRITEH2-PBA+IOSEAD(A6)2*œSET�START/END�ADDRESS�IN�WRITEH2�PARAMETER�BLOCK*‰LEA�STACK(PC),A7�INITIALIZE�STACK�POINTER MOVE.L #4,D0 ATTACH SEGMENT$ LEA ATSEGPAR(PC),A0 PARAMETER BLOCK TRAP #1 BEQ.S SESS5 OK MOVE.W #$0809,A0 ABORT CODE BRA.S ABORT GO ABORT SESS5 EQU *" MOVE.L A0,A1 BEGINNING OF SEGMENT% LEA WRITEH1(PC),A0 "ONLINE SESSIONS" TRAP #2- MOVE.L (A1)+,A2 BEGINNING OF BATCH JOB QUEUE' MOVE.L (A1)+,A3 END OF BATCH JOB QUEUE SESS10 EQU *% CMP.L A2,A1 END OF ON LINE SESSIONS? BCC.S SESS40 YES TST.L (A1) ACTIVE SESSION? BEQ.S SESS20 NO LEA SEGBUFF(PC),A5 PUT ADDRESSiXr)' MOVE.L (A1),(A5)+ TRANSFER TERMINAL ID�MOVE.W�#'‚',(A5)+�SEPARATOR MOVE.L 4(A1),(A5) SESSION NO.- LEA WRITEPAR(PC),A0 PARAMETER BLOCK TO WRITE TRAP #2 SESS20 EQU *$ ADD.L #8,A1 INCREMENT TO NEXT ENTRY BRA SESS10 CONTINUE SESS40 EQU * LEA WRITEH2(PC),A0 "BATCH JOBS" TRAP #2 SESS50 EQU * CMP.L A3,A1 TEST DONE BCC.S SESSDONE DONE! TST.W (A1) TEST BATCH JOB STATUS! BLE.S SESS60 BRANCH NONE OR DONE CLR.L D0 CLEAR UPPER HALF MOVE.W 2(A1),D0 FETCH USER NO. BSR BDCONV CONVERT TO ASCII(�OR.L�#'ƒ0',D0�FORCE�LEADING�ZERO�DIGITS LEA SEGBUFF(PC),A5 PUT ADDRESS MOVE.L D0,(A5)+ PUT USER NO. �MOVE.W�#'‚',(A5)+�PUT�SEPARATOR" MOVE.L 4(A1),(A5) PUT SESSION NO.- LEA WRITEPAR(PC),A0 PARAMETER BLOCK TO WRITE TRAP #2 SESS60 EQU *$ ADD.L #8,A1 INCREMENT TO NEXT ENTRY BRA SESS50 CONTINUESESSDONE EQU * MOVE.L #15,D0 TERMINATE COMMAND TRAP #1 !!!GONE!!!ABORT MOVE.L #14,D0 ABORT CODE TRAP #1 !!!GONE!!!0HEAD1 DC.B 'ONLINE SESSIONS (TERMINAL/SESSION):'HEAD1E EQU *-1 DS 0'HEAD2 DC.B 'BATCH JOBS (USER/SESSION):'HEAD2E EQU *-1 DS 0 END SESSIONSé$ éé=/*=/*†SGSYMBL.AF=/**=/* Chain file to assemble SGSYMBL utility=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to SGSYMBL.LS=/*=/IFC \1ƒ=ARG�SGSYMBL.LS=/ENDIF=/*$=ASM SGSYMBL.SA,SGSYMBL.RO,\1;RZ=100=/*{ Included files are:=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDééééééz=/*=/*†SGSYMBL.LF=/*(=/* Link chain file to create SGSYMBL.LO=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to SGSYMBL.LL=/*=/IFC \1ƒ=ARG�SGSYMBL.LL=/ENDIF=/*=LINK ,SGSYMBL.LO,\1;HAMIX ATTRIBUTES PSEG SEG1:0,14 $0INPUT SGSYMBL.ROLIB 0.&.UTILIB.ROEND=/*=ENDééé$ éééƒ$SGSYMBLƒIDNTƒ1,0�Sysgen�symbol�table*ŠTTL„Sysgen�symbol�table�listing�generatorO********************************************************************************Í* *¡SGSYMBL¥**Í*O********************************************************************************N* SGSYMBL is used to create a cross reference listing file of the symbols usedK*�at�sysgen�time.‚The�program�will�produce�a�listing�which�will�contain�theO* Symbol name, the hexadecimal value and the decimal value if it is a number orO* the ASCII value if it is an ASCII string, the file(s) that define this symbolI*�and�the�file(s)�that�the�symbol�is�referenced�from.‚The�symbols�will�be* listed in alphabetical order.*ŠSPC„5**‰Modification�HistoryO*------------------------------------------------------------------------------*�12/10/84‡KEG�Initial�writing*ŠSPC„5*$*‰Copyrighted�1984�by�Motorola,�Inc.*ŠPAGEO********************************************************************************Í**˜I�N�T�R�O�D�U�C�T�I�O�Nž**Í*O*******************************************************************************ŠSPC„1M* This program was written to take as input, the file SGSYMS.SY and produce a* listing SYMBOLS.LS as output.H* The format of the symbol table entry is defined in the sysgen utility.* Currently it looks like this:*-PARLEN„EQU„8’Maximum�length�of�parameter�name%VALLEN„EQU„30‘Maximum�length�of�value* ŠOFFSET�0 PARAM…DS.BƒPARLEN�Parameter�nameVALUE…DS.BƒVALLEN�ValuePLEN†DS.Bƒ1’Parameter�lengthVLEN†DS.Bƒ1’Value�lengthPFLAG…DS.Wƒ1’Flag�word+SYMLEN„EQU„*’Length�of�a�symbol�table�entryŠPAGEK*�The�input�file�for�this�program�is�made�up�of�keyed�records.‚The�keys�areJ*�used�to�determine�the�type�of�record.‚There�are�4�types�of�keyed�records* in this file.*L*�1st�is�the�records�that�start�with�the�number�PREDEF�(0000).‚These�recordsF*…contain�the�symbols�that�are�predefined�by�SYSGEN.‚These�records�are Œ6•'�>¥B­;µD½RÅLÍ@Õ3Ý0å@í1õ<ý:? :8@%G-S5\=IEG*…of�the�size�TYPESIZE+SYMLEN.‚An�example�record�would�appear�as�below./*…PREDEF,'$DATEƒ','850110˜',$05,$06,$30,$30,$00J*…000024444154202020203835303131302020202020202020202020202020202020202020*…2020200506303000*N*�2nd�is�the�records�that�start�with�the�number�SYMVALUE�(0001).‚These�recordsC*…contain�the�symbols�and�their�value�that�are�defined�by�the�user.H*…These�records�are�of�the�size�TYPESIZE+SYMLEN.‚An�example�record�would*…appear�as�below.2*…SYMVALUE,'LABEL1‚','$123456—',$06,$07,$21,$81,00J*…00014C4142454C3120202431323334353620202020202020202020202020202020202020*…2020200607218100*M*�3rd�is�the�records�that�start�with�the�number�DEFINED�(0002).‚These�recordsH*…contain�the�symbols�along�with�the�name�of�the�file�that�defined% �them.E*…These�records�are�of�the�size�TYPESIZE+PARLEN+18.‚An�example�record*…would�appear�as�below.*…DEFINED,'LABEL1‚','ˆFILE1ƒSA'**…00024C4142454C31202046494C45312020205341*N*�4th�is�the�records�that�start�with�the�number�REFERENC�(0003).‚These�recordsK*…contain�the�symbols�along�with�the�name�of�the�file�that�referenced�them.E*…These�records�are�of�the�size�TYPESIZE+PARLEN+18.‚An�example�record*…would�appear�as�below. *…REFERENC,'LABEL1‚','ˆFILE2ƒSA'**…00034C4142454C31202046494C45322020205341*K*�The�output�from�this�program�will�go�into�the�file�SYMBOLS.LS.‚The�outputI* will contain the symbol name, the value in hex and the value in decimalH* or the ASCII string, the file(s) that the symbol is defined in and theN*�file(s)�that�the�symbol�is�referenced�in.‚The�hex�value�will�be�preceeded�byI*�a�"$"�sign�and�the�decimal�values�will�be�preceeded�by�an�"&"�sign.‚TheK*�files�in�the�NULL�catalog�will�be�represented�by�an�"&"�sign�also.‚If�theM* files in the referenced column are proceeded by brackets "[]" with a numberK* between them, this means the number of times the symbol was referenced inJ*�this�file.‚Example�-�&.FILE1.SA�[4]�means�that�the�label�was�reference�4* times in this file.*ŠPAGEO********************************************************************************Í** M�A�C�R�O�'�s **Í*O********************************************************************************N* Before we get into the actual code of the SGSYMBL utility, we need to define;* a few miscellaneous macros that are used by this utility.ŠSPC„3**‰Next�Word�Boundary�MACRO* NEXTWB„MACRO.ŠDS.Wƒ0’This�is�used�to�force�an�even�boundaryŠENDMŠSPC„3**‰IOS�output�MACRO*2OUTPUT„MACRO‚.’This�MACRO�is�used�to�output�to�theŠLEA„\1,A0ŽCRT.@ŠMOVE.L�A0,IOSSAD+\3-PBA(A6)�Set�the�starting�address�of�message ŠLEA„\2,A0>ŠMOVE.L�A0,IOSEAD+\3-PBA(A6)�Set�the�endingƒaddress�of�messageŠIOSCALL�\3-PBA(A6)ŠENDMŠPAGEO********************************************************************************Í**ŸO�P�T�I�O�N�S¡**Í*O********************************************************************************L* This section contains some options that tell the assembler what we want itL*�to�do.‚The�options�must�occur�before�any�code-affecting�or�code-generatingL* statements because the options tell the assembler how to assemble the rest* of the program. ŠOPT„A+*£We�use�the�A�option�so�the�assembler�will,*£force�absolute�addressing.‚All�non-indexed+*£operands�which�reference�either�labels�or,*£the�current�assembler�location�counter�(*))*£will�be�resolved�as�absolute�addresses.ŠPAGEO********************************************************************************Í**žE�Q�U�A�T�E�S¢**Í*O********************************************************************************L* This section contains some miscellaneous equates to define labels that areM*�are�useful�for�the�code�in�the�SGSYMBL�utility.‚The�equates�in�this�section<* are presented in alphabetical order for ease of reference.**‰INCLUDE�9995.&.EXE.EQ*‰INCLUDE�9995.&.IOE.EQ**‰INCLUDE�9995.&.TR1.EQ…Trap�1�equate�file*ŠNOLISTŠINCLUDE�9995.&.EXE.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.TR1.EQŠLIST8BUFSIZEƒEQU„132�This�is�the�buffer�to�contain�the�record**£that�will�be�written�to�the�output�file. 7CODE_SECTION�EQU�0’This�label�defines�the�number�of�the(*£program�section�that�contains�code�and *£constants. CRˆEQU„$0D�Carriage�return 7DATA_SECTION�EQU�0’This�label�defines�the�number�of�the*£section�that�contains�data. ;DEFINEDƒEQU„$0002ŽThis�is�the�value�that�starts�each�record)*£in�the�input�file�that�means�the�record)*£contains�the�symbol�along�with�the�file*£that�defined�the�symbol. 8DONE†EQU„$FF�This�label�is�used�to�define�if�we�are�done*£with�the�label�or�not. 9EMPTY…EQU„$FF�This�label�is�used�to�define�that�there�are,*£no�characters�in�the�buffer�to�be�printed. 1HEX‡% EQU„$FF�This�label�is�used�to�define�that�the#*£VALUTYPE�is�a�hexidecimal�number. LFˆEQU„$0A�Line�feed LSLUN…EQU„2’LU�for�listing�file ;MESSAGES_SECTION�EQU„0‹This�label�defines�the�number�of�the-*£messages�section�that�contains�the�messages*£for�this�utility. :NOTDONEƒEQU„$00�This�label�is�used�to�define�if�we�are�not*£done�with�the�label�or�not. :NOTEMPTY‚EQU„$00�This�label�defines�that�the�buffer�is�not**£empty.‚There�are�contents�to�be�printed. 4NOTHEX„EQU„$00�This�label�is�used�to�define�that�the'*£VALUTYPE�is�not�a�hexidecimal�number. 9NOTSAMEƒEQU„$00�This�label�defines�that�the�filenames�are *£the�same. :PREDEF„EQU„$0000ŽThis�is�the�value�that�starts�each�record)*£in�the�input�file�that�means�the�record**£contains�the�symbol�along�with�the�value)*£of�that�symbol.‚The�records�are�symbols!*£that�were�predefined�by�SYSGEN. *‰Parameter�Block�used�for�outputting�to�the�symbol�table�file*SYMIOS0ŠDC.WƒIOWRIT�Request�code/Function�specificationŠDC.Wƒ0’OptionsŠDC.Bƒ0’StatusŠDC.BƒLSLUNŽLogical�unit�numberŠDC.Wƒ0’ReservedŠDC.Lƒ0’Random�record�numberŠDC.Lƒ0’Start�addressŠDC.Lƒ0’End�addressŠDC.Lƒ0’Length�of�data�transferŠDC.Lƒ0’Completion�address *6*‰Parameter�Block�used�for�reading�from�the�input�file*IOSIN0ŠDC.WƒIOREAD�Request�code/Function�specificationŠDC.WƒIOPRAN+IOPRTK†OptionsŠDC.Bƒ0’StatusŠDC.BƒSYLUNŽLogical�unit�numberŠDC.Wƒ0’ReservedŠDC.Lƒ0’Random�record�numberŠDC.Lƒ0’Start�addressŠDC.Lƒ0’End�addressŠDC.Lƒ0’Length�of�data�transferŠDC.Lƒ0’Completion�address *6*‰Parameter�Block�used�for�assigning�to�the�input�fileSYMFHS!ŠDC.WƒFHASGN�Command�code/CommandŠDC.WƒFOPISK+FOPPR‡OptionsŠDC.Bƒ0’StatusŠDC.BƒSYLUNŽLUNŠDC.Bƒ'„'�Volume�IDŠDC.Wƒ0’User�numberŠDC.Bƒ'ˆ'‰Catalog�nameŠDC.Bƒ'SGSYMS‚'‰File�nameŠDC.Bƒ'SY'�ExtensionŠDC.Wƒ0’ReservedŠDC.Bƒ0,0�Write�code/Read�codeŠDC.Wƒ0’Record�length ŠDC.Lƒ0’Size *9*‰Parameter�Block�used�to�as& sign�output�symbol�table�file*SLSFHS!ŠDC.WƒFHDELT�Command�code/CommandŠDC.WƒFOPSEQ+FOPEREW…OptionsŠDC.Bƒ0’StatusŠDC.BƒLSLUNŽLUNŠDC.Bƒ'„'�Volume�IDŠDC.Wƒ0’User�numberŠDC.Bƒ'ˆ'‰Catalog�nameŠDC.Bƒ'SYMBOLS�'‰File�nameŠDC.Bƒ'LS'�ExtensionŠDC.Wƒ0’ReservedŠDC.Bƒ0,0�Write�code/Read�codeŠDC.Wƒ0’Record�length ŠDC.Lƒ0’SizeŠPAGEO********************************************************************************Í**�M�E�S�S�A�G�E�S¡**Í*O******************************************************************************* ŠSECTION�MESSAGES_SECTION,*£This�SECTION�directive�tells�the�assembler-*£that�we�are�now�assembling�code�that�should$*£be�kept�together�for�the�messages. (PROC†DC.WƒCR,'Processing�symbol�number‚'PROCNUMƒDC.Lƒ0,0,0,0 PROCE…EQU„*-1*TOTSYM„DC.WƒCR,'Total�number�of�symbols�='TOTSYMEƒEQU„*-1TOTSYMLƒEQU„*-TOTSYM-2#SGNPER„DC.Wƒ'SYSGEN�was�performed�'2SGNDATEƒDC.Wƒ'XX/XX/XX�'ˆDate�sysgen�was�performed1SGNTIMEƒDC.Wƒ'XX:XX:00'‰Time�sysgen�was�performed**£The�0's�are�because�SYSGEN�does�not�save(*£the�seconds�value�in�the�symbol�table.SGNPEREƒEQU„*-1HEAD1…DC.Wƒ'ŠValue†Value‰Value'HEAD1E„EQU„*-1,HEAD2…DC.Wƒ'Symbol„(hex)†(decimal)…(ASCII)�'(ŠDC.Wƒ'ASCII�string”Defined�in�file(s)„'ŠDC.Wƒ'Referenced�in�file(s)'HEAD2E„EQU„*-14HEAD3…DC.Wƒ'--------‚---------‚------------‚------‚'<ŠDC.Wƒ'------------------------------‚--------------------‚'ŠDC.Wƒ'--------------------'HEAD3E„EQU„*-1BLANK…DC.Wƒ$200DBLANKE„EQU„*-1ŠPAGEO********************************************************************************Í**›P�R�O�G�R�A�MƒC�O�D�E›**Í*O******************************************************************************* ŠSECTION�CODE_SECTION,*£This�SECTION�directive�tells�the�assembler-*£that�we�are�now�assembling�code�that�should*£be�kept�together�for�code. 7SGSYMBLƒEQU„*’This�is�where�the�SGSYMBL�utility�begins. /ŠLEA„PBA(PC),A7‰A7�=�Program�Base�Address�(PBA)EŠMOVEM.L�D0-D7/A0-A7,TASKNAME-PBA(A7)�Save�the�registers�at�the�start*£of�the�programs�execution.*,*�D0�to�TASKNAME�=�Task�name�that�started�me*�D1�to�SESNUMƒ=�Session�number%*�D2�to�VOLNAME‚=�Default�volume�name*�D3�to�USERNUM‚=�User�number*�D4�to�CATNAME‚=�Catalog�name*�D5�to�CATNAME+4(*�D6�to�LINELEN‚=�Length�of�command�line2*�D7�to�REGD7„=�Bit�mask�of�logical�units�assigned**�A0�=�Your�task�name*�A1�=�Terminal�ID*�A2�=�Actual�user�number)*�A3�=�System�volume�default�(all�spaces)*�A4�=�System�user�number*�A5�=�System�catalog*�A6�=�System�catalog�part�2*�A7�=*&ŠMOVE.L�A7,A6ŽLoad�A6�with�PBA�from�A7)*£This�is�where�we�initialize�A6�with�the)*£beginning�of�this�utility.‚This�will�be)*£used�as�the�base�address�to�use�offsets,*£from�to�get�to�other�areas�of�this�program%*£so�to�make�the�program�relocatable.9ŠLEA„STACK-PBA(A6),A7ƒLoad�the�stack�pointer�with�our�own *£stack�area.*,*£Request�the�system�to�give�me�the�date�and*£time.*EŠERQ.GTDTIM�TIMEBLK-PBA(A6)�The�GTDTIM�directive�will�tell�the�system**£that�we�want�the�date�and�time.‚The�date-*£will�be�stored�at�TIMEBLK�and�the�time�will*£be�stored�at�TIMEBLK+4.1**************************************************¯*-*ƒConvert�Date�and�store�in�version�messageƒ**¯*1*************************************************2ŠMOVE.L�TIMEBLK-PBA(A6),D0�Get�the�date�to�convert&ŠBSR„ODATCONV‹Convert�Ordinal�to�ASCII:ŠMOVE.W�D0,VDATE-PBA(A6)ƒSave�the�ASCII�value�of�the�Month2ŠSWAPƒD0‘Move�the�Day�to�the�lower�word�of�reg.�D0?ŠMOVE.B�D0,VDATE+4-PBA(A6)�Save�the�least�sig.�digit�of�the�Day-ŠLSR.W‚#8,D0ŽMove�the�most�sig.�digit�to�D0.B>ŠMOVE.B�D0,VDATE+3-PBA(A6)�Save�the�most�sig.�digit�of�the�Day5ŠMOVE.W�D1,VDATE+6-PBA(A6)�Save�the�value�of�the�Year$ŠIF.BƒVDATE-PBA(A6)��#$00�THEN.S5ŒMOVE.B�#$30,VDATE-PBA(A6)�Set�the�digit�to�ASCII�'0'ŠENDI&ŠIF.BƒVDATE+3-PBA(A6)��#$00�THEN.S7ŒMOVE.B�#$30,VDATE+3-PBA(A6)�Set�the�digit�to�ASCII�'0'ŠENDI1**************************************************¯*-*ƒConvert�' Time�and�store�in�version�messageƒ**¯*1*************************************************4ŠMOVE.L�TIMEBLK+4-PBA(A6),D0�Get�the�time�to�convert*ŠBSR„TIMECONV‹Convert�binary�time�to�ASCII'ŠMOVE.W�D0,VTIME-PBA(A6)ƒSave�the�Hours2ŠSWAPƒD0‘Move�the�minutes�to�lower�word�of�reg.�D0CŠMOVE.B�D0,VTIME+4-PBA(A6)�Save�the�least�sig.�digit�of�the�Minutes-ŠLSR.W‚#8,D0ŽMove�the�most�sig.�digit�to�D0.BBŠMOVE.B�D0,VTIME+3-PBA(A6)�Save�the�most�sig.�digit�of�the�Minutes8ŠMOVE.W�D1,VTIME+6-PBA(A6)�Save�the�value�of�the�Seconds$ŠIF.BƒVTIME-PBA(A6)��#$00�THEN.S5ŒMOVE.B�#$30,VTIME-PBA(A6)�Set�the�digit�to�ASCII�'0'ŠENDI&ŠIF.BƒVTIME+3-PBA(A6)��#$00�THEN.S7ŒMOVE.B�#$30,VTIME+3-PBA(A6)�Set�the�digit�to�ASCII�'0'ŠENDI&ŠIF.BƒVTIME+6-PBA(A6)��#$00�THEN.S7ŒMOVE.B�#$30,VTIME+6-PBA(A6)�Set�the�digit�to�ASCII�'0'ŠENDI *,*£Write�the�version�number�to�the�log�device*£to�identify�ourselves.*EŠOUTPUT�BLANK-PBA(A6),BLANKE-PBA(A6),OUTIOS�Write�a�blank�line�to�logŠBNE„IOERRŽdeviceDŠOUTPUT�VERSION-PBA(A6),VEND-PBA(A6),OUTIOS�Write�the�heading�to�logŠBNE„IOERRŽdeviceEŠOUTPUT�BLANK-PBA(A6),BLANKE-PBA(A6),OUTIOS�Write�a�blank�line�to�logŠBNE„IOERRŽdevice *&*£Assign�the�input�file�so�that�we�can)*£read�from�it�to�get�all�the�information *£needed.*BŠLEA„SYMFHS-PBA(A6),A0‚Get�the�address�of�the�parameter�block�used*£for�the�input�file.CŠMOVE.L�VOLNAME-PBA(A6),FHSVOL(A0)�Set�the�user�default�volume�nameCŠMOVE.L�USERNUM-PBA(A6),FHSUSN(A0)�Set�the�user�default�user�numberCŠMOVE.L�CATNAME-PBA(A6),FHSCLG(A0)�Set�the�user�default�catalog�1st/ŠMOVE.L�CATNAME+4-PBA(A6),FHSCLG+4(A0)�2nd�halfŠFHSCALL�(A0)ŽAssign�input�fileŠBNE„IOERRŽBranch�if�any�errors *-*£Allocate�and�Assign�the�output�listing�file*BŠLEA„SLSFHS-PBA(A6),A0‚Get�the�address�of�the�parameter�block�used*£for�the�output�listing�file.CŠMOVE.L�VOLNAME-PBA(A6),FHSVOL(A0)�Set�the�user�default�volume�nameCŠMOVE.L�USERNUM-PBA(A6),FHSUSN(A0)�Set�the�user�default�user�numberCŠMOVE.L�CATNAME-PBA(A6),FHSCLG(A0)�Set�the�user�default�catalog�1st/ŠMOVE.L�CATNAME+4-PBA(A6),FHSCLG+4(A0)�2nd�half(ŠFHSCALL�(A0)ŽDelete�output�listing�fileBŠMOVE.W�#FHALLO+FHASGN,FHSCMD(A0)�Get�ready�to�allocate�and�assign*£output�listing�file5ŠFHSCALL�(A0)ŽAllocate�and�Assign�output�listing�fileŠBNE„IOERRŽBranch�if�any�errors *#*£Start�reading�from�the�input�file*@ŠLEA„IOSIN-PBA(A6),A0ƒGet�the�address�of�the�input�parameter�blkAŠLEA„FENTRY-PBA(A6),A1‚Get�the�address�of�the�buffer�used�to�hold&*£the�record�read�from�the�input�file.>ŠMOVE.L�A1,IOSSAD(A0)†Save�this�address�in�the�parameter�blockBŠLEA„FENTRY+TYPESIZE+SYMLEN-1-PBA(A6),A1�Get�the�ending�address�of*£where�we�will�be�reading�into>ŠMOVE.L�A1,IOSEAD(A0)†Save�this�address�in�the�parameter�blockDŠMOVE.W�#IOPRAN+IOPRTK,IOSOPT(A0)�Do�I/O�by�Random�Record�Number�and+*£by�returning�the�key�with�the�record�read *+*£Go�into�a�loop�reading�all�the�predefined**£symbols�of�sysgen�until�we�read�a�record,*£that�starts�with�the�type�SYMVALUE�(0001).-*£Once�we�find�the�$DATE�label�then�save�this)*£value�into�the�message�used�to�show�the%*£date�that�the�sysgen�was�performed.-*£Once�we�find�the�$TIME�label�then�save�this)*£value�into�the�message�used�to�show�the%*£time�that�the�sysgen�was�performed.*ŠREPEAT;ŒMOVE.L�LABELRRN-PBA(A6),IOSRRN(A0)�Save�the�RRN�in�the�IOS*£parameter�block.ŒIOSCALL�(A0)ŒRead�a�record�in.ŒBNE„IOERRŒBranch�if�any�errors***£If�this�label�starts�with�'$DAT'�then�it)*£must�be�'$DATE'�so�save�the�date�in�the%*£message�to�show�when�the�sysgen�was *£performed.*1ŒIF.L�FENTRY+TYPESIZE-PBA(A6)��#'$DAT'�THEN.S8ŽMOVE.W�FENTRY+TYPESIZE+PARLEN-PBA(A6),SGNDATE+6-PBA(A6)8ŽMOVE.W�FENTRY+TYPESIZE+PARLEN+2-PBA(A6),SGNDATE-PBA(A6):ŽMOVE.B�FENTRY+TYPESIZE+PARLEN+4-PBA(A6),SGNDATE+3-PBA(A6):ŽMOVE.B�FENTRY+TYPESIZE+PARLEN+5-PBA(A6),SGNDATE+4-PBA(A6)ŒENDI***£If�this�label�starts�with�'$TIM'�then�it)*£must�be�'$TIME'�so�sav' e�the�time�in�the%*£message�to�show�when�the�sysgen�was *£performed.*1ŒIF.L�FENTRY+TYPESIZE-PBA(A6)��#'$TIM'�THEN.S6ŽMOVE.W�FENTRY+TYPESIZE+PARLEN-PBA(A6),SGNTIME-PBA(A6):ŽMOVE.B�FENTRY+TYPESIZE+PARLEN+2-PBA(A6),SGNTIME+3-PBA(A6):ŽMOVE.B�FENTRY+TYPESIZE+PARLEN+3-PBA(A6),SGNTIME+4-PBA(A6)ŒENDI>ŒADD.L‚#1,LABELRRN-PBA(A6)�Get�ready�to�read�the�next�record�#&ŠUNTIL.W�FENTRY-PBA(A6)��#SYMVALUE ?ŠMOVE.L‚IOSIN+IOSRRN-PBA(A6),LABELRRN-PBA(A6)�Save�this�currect*£Random�Record�Number *)*£Write�the�version�heading�to�the�output+*£listing�file�along�with�the�date�and�time%*£the�sysgen�was�performed.‚Write�the-*£column�headings�to�the�output�listing�file.*+ŠOUTPUT�VERSION-PBA(A6),VEND-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUT�BLANK-PBA(A6),BLANKE-PBA(A6),SYMIOS ŠBNE„IOERR-ŠOUTPUT�SGNPER-PBA(A6),SGNPERE-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUT�BLANK-PBA(A6),BLANKE-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUT�BLANK-PBA(A6),BLANKE-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUT�HEAD1-PBA(A6),HEAD1E-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUT�HEAD2-PBA(A6),HEAD2E-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUT�HEAD3-PBA(A6),HEAD3E-PBA(A6),SYMIOS ŠBNE„IOERR *-*£Fill�the�output�line�buffer�with�all�spaces'*£to�prepare�the�buffer�for�outputting.*ŠLEA„BUFFER-PBA(A6),A2ŠFOR.W‚D0�=�#1�TO�#BUFSIZE�DO.S3ŒMOVE.B�#'�',(A2)+‡Write�a�space�to�the�line�bufferŠENDF 5ŠCLR.L‚SYMNUM-PBA(A6)‚Start�with�a�count�of�0�symbols SYMSOVERBŠOUTPUT�BUFFER-PBA(A6),BUFFER+1-PBA(A6),SYMIOS�Output�a�blank�line#*£before�each�label�being�displayedŠBNE„IOERRŽBranch�if�any�errors@ŠLEA„IOSIN-PBA(A6),A0ƒGet�the�address�of�the�parameter�block�for*£the�input�fileBŠLEA„FENTRY-PBA(A6),A1‚Get�the�address�of�where�to�read�the�record*£into.>ŠMOVE.L�A1,IOSSAD(A0)†Save�this�address�in�the�parameter�blockBŠLEA„FENTRY+TYPESIZE+SYMLEN-1-PBA(A6),A1�Get�the�ending�address�of*£where�to�read�the�record�to.>ŠMOVE.L�A1,IOSEAD(A0)†Save�this�address�in�the�parameter�block9ŠMOVE.W�#SYMVALUE,FENTRY-PBA(A6)�Get�this�key�value�entryDŠMOVE.W�#IOPRAN+IOPRTK,IOSOPT(A0)�Do�I/O�by�Random�Record�Number�and+*£by�returning�the�key�with�the�record�readCŠMOVE.L�LABELRRN-PBA(A6),IOSRRN(A0)�Set�the�Random�Record�Number�to*£read. ŠIOSCALL�(A0)ŽGo�read�the�recordŠBNE„IOERRŽBranch�if�any�errors>ŠCMP.W‚#DEFINED,FENTRY-PBA(A6)�Is�this�record�a�DEFINED�record4ŠBEQ„READDONE‹If�it�is�then�we�are�done�with�all�the'*£symbols.‚We�junk�want�to�read�all�the*£SYMVALUE�records. 8ŠADD.L‚#1,SYMNUM-PBA(A6)‚Update�the�current�#�of�symbols1ŠMOVE.L�SYMNUM-PBA(A6),D0‚Get�this�number�in�D0.LBŠLEA„PROCNUM-PBA(A6),A2�This�is�where�we�want�to�write�the�decimal *£value�to.3ŠBSR„DECOUT�Go�calculate�the�decimal�value�of�the�#*ŠIF.L�TASKNAME-PBA(A6)��#'&BCT'�THEN.S:ŒMOVE.W�#IOPIMG,OUTIOS+IOSOPT-PBA(A6)�Change�to�image�modeCŒOUTPUT�PROC-PBA(A6),PROCE-PBA(A6),OUTIOS�Write�the�message�telling$*£the�symbol�number�being�processed.ŒBNE„IOERRŽBranch�if�any�errorsCŒMOVE.W�#IOPFOR,OUTIOS+IOSOPT-PBA(A6)�Change�back�to�formatted�modeŠENDI<ŠLEA„IOSIN-PBA(A6),A0ƒGet�the�address�of�the�parameter�block*£for�reading�the�input�file.BŠLEA„FENTRY+TYPESIZE-PBA(A6),A3�Get�the�address�of�where�the�label*£starts�within�the�record. SYMSOUT9ŠLEA„LABEL-PBA(A6),A5ƒGet�the�address�of�the�label�bufferŠFOR.B‚D0�=�#1�TO�#PARLEN�DO.S4ŒMOVE.B�#'�',(A5)+‡Fill�the�label�buffer�with�blanksŠENDF *-*£Write�the�parameter�name�to�the�output�line *£buffer.*9ŠLEA„LABEL-PBA(A6),A5ƒGet�the�address�of�the�label�buffer ŠMOVE.L�A3,A4@ŠLEA„BUFFER-PBA(A6),A2‚Get�the�address�of�the�output�line�buffer8ŠMOVE.B�PLEN(A3),D2ˆGet�the�length�of�the�parameter�nameŠFOR.B‚D0�=�#1�TO�D2�DO.S;ŒMOVE.B�(A4),(A5)+‡Write�the�parameter�name�to�label�buffer>ŒMOVE.B�(A4)+,(A2)+†Write�parameter�name�to�output�line�bufferŠENDF *,*£Write�the�value�to�the�output�line�buffer.*8ŠLEA„VALUE(A3),A4‡Get�the�address�where�the�value�startsŠIF.B�(A4)��#'$'�THEN.S@ŒMOVE.B�#HEX,VALUTYPE-PBA(A6)�Se( t�the�VALUTYPE�=�HEX�since�it�isŠELSE.S=ŒMOVE.B�#NOTHEX,VALUTYPE-PBA(A6)�Set�to�NOTHEX�since�it�isn'tŠENDI *+*£If�the�value�is�a�hexidecimal�number�then+*£display�the�value�in�the�hexidecimal�form)*£and�also�the�decimal�form.‚If�the�value+*£is�not�hexidecimal�then�display�the�value*£in�the�ASCII�form.*'ŠIF.B�VALUTYPE-PBA(A6)��#HEX�THEN.S:ŒLEA„BUFFER+TAB1HEX-PBA(A6),A2�Get�the�address�of�where�to'*£start�writing�the�hex�number.‚The�'$'*£is�already�in�the�value./ŒMOVE.B�VLEN(A3),D3†Get�the�length�of�the�valueŒFOR.B‚D0�=�#1�TO�D3�DO.S)ŽMOVE.B�(A4)+,(A2)+…Write�value�to�bufferŒENDF @ŒLEA„BUFFER+TAB2DEC-PBA(A6),A2�Get�the�address�of�where�to�start*£writing�the�decimal�number.;ŒLEA„VALUE(A3),A4…Get�the�address�of�where�the�hex�value�is ŒMOVE.L�A4,A52ŒADD.L‚D3,A5ŒAdd�the�length�of�the�ASCII�hex�value&ŒBSR„GETNUMDŠGo�convert�to�hexidecimalŒIF.LƒD0��#0�THEN.S<ŽMOVE.B�#'-',(A2)+…Print�'-'�to�show�that�it�is�a�negative�#)ŽNEG.L‚D0�Make�the�number�appear�negativeŒENDI;ŒMOVE.B�#'&',(A2)+‡Write�an�'&'�to�show�that�this�number�is *£decimal.5ŒBSR„DECOUT‹Go�write�the�decimal�number�to�the�output*£line�buffer.;ŒLEA„VALUE(A3),A4…Get�the�address�of�where�the�hex�value�is ŒMOVE.L�A4,A52ŒADD.L‚D3,A5ŒAdd�the�length�of�the�ASCII�hex�value&ŒBSR„GETNUMDŠGo�convert�to�hexidecimal@ŒLEA„BUFFER+TAB25AS-PBA(A6),A2�Get�the�address�of�where�to�start*£writing�the�ASCII�value.ŒMOVE.B�#'''',(A2)+ŒFOR.B‚D1�=�#1�TO�#4�DO.S&ŽROL.L‚#8,D0ŠGet�the�character�in�D0.B+ŽIF.B�D0��#$20�OR.B�D0��#$7F�THEN.S(�MOVE.B�#'.',(A2)+ƒElse�just�print�a�'.'ŽELSE.S:�MOVE.B�D0,(A2)+…If�the�character�is�displayable�then�showŽENDIŒENDFŒMOVE.B�#'''',(A2)+ŠELSE.S*%*£This�means�that�the�value�was�not�a-*£hexidecimal�number�so�we�will�put�it�in�the*£ASCII�column.*@ŒLEA„BUFFER+TAB3ASC-PBA(A6),A2�Get�the�address�of�where�to�start*£writing�the�ASCII�value.6ŒMOVE.B�VLEN(A3),D3†Get�the�length�of�the�ASCII�value.ŒFOR.B‚D0�=�#1�TO�D3�DO.S)ŽMOVE.B�(A4)+,(A2)+…Write�value�to�bufferŒENDFŠENDI ŠCLR.L‚DEFRRN-PBA(A6)ŠCLR.L‚REFRRN-PBA(A6)DŠMOVE.W�#IOPRTK+IOPRRN,IOSOPT(A0)�Do�I/O�by�Random�Record�Number�and+*£by�returning�the�key�with�the�record�readBŠMOVE.B�#NOTDONE,DEFEND-PBA(A6)�Set�DEFEND�to�show�that�we�are�not"*£done�with�the�Defined�files�yet.BŠMOVE.B�#NOTDONE,REFEND-PBA(A6)�Set�REFEND�to�show�that�we�are�not%*£done�with�the�Referenced�files�yet. ***£While�DEFEND�and�REFEND�are�NOTDONE�then**£keep�reading�records�showing�the�file(s)**£that�define�or�reference�the�same�label.**ŠWHILE.B�DEFEND-PBA(A6)��#NOTDONE�OR.B ’REFEND-PBA(A6)��#NOTDONE�DO*-*£If�DEFEND�is�NOTDONE�then�keep�reading�more(*£records�that�show�where�this�label�was'*£was�defined.‚Notice�that�this�is�only)*£valid�with�re-definable�parameters�(the*£parameters�starting�with�'&')*'ŠIF.B�DEFEND-PBA(A6)��#NOTDONE�THEN<ŒLEA„IOSIN-PBA(A6),A0�Get�the�address�of�the�parameter�block**£for�reading�records�from�the�input�file.;ŒLEA„FENTRY-PBA(A6),A1�Get�the�address�of�where�to�read�the*£record�into.6ŒMOVE.L�A1,IOSSAD(A0)„Save�this�in�the�parameter�blockAŒLEA„FENTRY+TYPESIZE+PARLEN+18-1-PBA(A6),A1�Get�the�ending�addres6ŒMOVE.L�A1,IOSEAD(A0)„Save�this�in�the�parameter�blockDŒMOVE.W�#DEFINED,FENTRY-PBA(A6)�Read�only�the�record�whose�key�value*£starts�with�DEFINED�(0002)BŒMOVE.L�DEFRRN-PBA(A6),IOSRRN(A0)�Tell�it�which�RRN�you�want�it�to*£read ŒIOSCALL�(A0)ŒGo�read�the�record*+*£If�the�record�does�not�exist�or�if�we�are,*£at�the�end�of�the�file�then�mark�DEFEND�as*£DONE.*ŒIF.B�D0��#ISTARN�OR.B‘D0��#ISTAEOF�THEN.S0ŽMOVE.B�#DONE,DEFEND-PBA(A6)�Mark�DEFEND�as�DONEŒENDI2ŒBSR„CMPLBL‹Compare�the�label�to�make�sure�this�is*£the�same�symbol.)*£If�the�symbol�is�not�the�same�then�mark*£DEFEND�as�DONE.*'ŒIF.B�SYMBOL-PBA(A6)��#NOTSAME�OR.B!‘DEFEND-PBA(A6)��#DONE�THEN.S0ŽMOVE.B�#DONE,DEFEND-PBA(A6)�Mark�DEFEND�as�DONEŒENDI*( )*£If�we�are�no�longer�reading�the�DEFINED(*£records�then�also�mark�DEFEND�as�DONE.*'ŒIF.W�FENTRY-PBA(A6)��#DEFINED�OR.B!‘DEFEND-PBA(A6)��#DONE�THEN.S0ŽMOVE.B�#DONE,DEFEND-PBA(A6)�Mark�DEFEND�as�DONEŒELSE.S-ŽTST.B‚D0�Test�for�any�errors�on�the�I/O�callŽBNE„IOERRŠBranch�if�any�errors5ŽIOSCALL�POSIOS-PBA(A6)�Read�the�Random�Record�NumberŽBNE„IOERRŠBranch�if�any�errorsŽMOVE.L�IOSRRN(A0),D0)ŽADD.L‚#1,D0ŠAdd�1�to�get�to�the�next�RRN@ŽMOVE.L�D0,DEFRRN-PBA(A6)�Save�the�RRN�at�DEFRRN.‚This�will�tell*£us�where�we�left�off.*+*£If�the�catalog�is�NULL�then�put�an�'&'�to!*£show�that�it�is�a�NULL�catolog.*?ŽLEA„FENTRY+TYPESIZE+PARLEN-PBA(A6),A4�Get�the�address�of�where*£the�defined�filename�is.:ŽLEA„BUFFER+TAB4DEF-PBA(A6),A2�Get�the�address�of�where�to%*£start�writing�the�defined�filename. ŽBSR„WFNAME ŒENDIŠENDI *(*£If�REFEND�is�NOTDONE�then�keep�reading)*£more�records�that�show�where�this�label*£was�referenced.*'ŠIF.B�REFEND-PBA(A6)��#NOTDONE�THEN<ŒLEA„IOSIN-PBA(A6),A0�Get�the�address�of�the�parameter�block**£for�reading�records�from�the�input�file.;ŒLEA„FENTRY-PBA(A6),A1�Get�the�address�of�where�to�read�the*£record�into.>ŒMOVE.L�A1,IOSSAD(A0)„Save�this�address�in�the�parameter�block?ŒLEA„FENTRY+TYPESIZE+PARLEN+18-1-PBA(A6),A1�Get�the�ending�addr>ŒMOVE.L�A1,IOSEAD(A0)„Save�this�address�in�the�parameter�block?ŒMOVE.W�#REFERENC,FENTRY-PBA(A6)�Get�the�record�whose�key�value*£starts�with�REFERENC�(0003)AŒMOVE.L�REFRRN-PBA(A6),IOSRRN(A0)�Tell�it�which�RRN�we�want�it�to*£read ŒIOSCALL�(A0)ŒGo�read�the�record*+*£If�the�record�does�not�exist�or�if�we�are,*£at�the�end�of�the�file�then�mark�REFEND�as*£DONE.*ŒIF.B�D0��#ISTARN�OR.B‘D0��#ISTAEOF�THEN.S0ŽMOVE.B�#DONE,REFEND-PBA(A6)�Mark�REFEND�as�DONEŒENDI2ŒBSR„CMPLBL‹Compare�the�label�to�make�sure�this�is*£the�same�symbol.*)*£If�the�symbol�is�not�the�same�then�mark*£REFEND�as�DONE.*'ŒIF.B�SYMBOL-PBA(A6)��#NOTSAME�OR.B!‘REFEND-PBA(A6)��#DONE�THEN.S1ŽMOVE.B�#DONE,REFEND-PBA(A6)�Mark�REFEND�as�DONE.ŒELSE.L.ŽTST.B‚D0�Test�for�any�errors�on�the�I/O�call.ŽBNE„IOERRŠBranch�if�any�errors5ŽIOSCALL�POSIOS-PBA(A6)�Read�the�Random�Record�NumberŽBNE„IOERRŠBranch�if�any�errorsŽMOVE.L�IOSRRN(A0),D0)ŽADD.L‚#1,D0ŠAdd�1�to�get�to�the�next�RRN@ŽMOVE.L�D0,REFRRN-PBA(A6)�Save�the�RRN�at�REFRRN.‚This�will�tell*£us�where�we�left�off.*)*£Save�the�filename�into�a�buffer�so�that)*£we�can�check�to�see�if�we�have�any�more*£with�the�same�filename.*<ŽLEA„FILENAME-PBA(A6),A0�Get�the�address�of�where�we�want�to*£save�the�filename.&ŽLEA„FENTRY+TYPESIZE+PARLEN-PBA(A6),A4ŽFOR.B‚D0�=�#1�TO�#8+8+2�DO.S6�MOVE.B�(A4)+,(A0)+‚Move�the�filename�to�a�buffer�areaŽENDF ?ŽMOVE.L�#1,REFCOUNT-PBA(A6)�Set�number�of�referenced�files�to�12ŽMOVE.B�#SAME,REFFILE-PBA(A6)�Mark�REFFILE�to�SAME*+*£While�the�referenced�filename�is�the�same,*£we�will�just�increment�REFCOUNT�each�time.&*£If�it�is�not�the�same�then�write�the+*£filename�out�to�the�buffer�along�with�the*£count�if�it�is�more�that�1.*&ŽWHILE.B�REFFILE-PBA(A6)��#SAME�DO<�LEA„IOSIN-PBA(A6),A0�Get�the�address�of�the�parameter�block**£for�reading�records�from�the�input�file.8�LEA„FENTRY-PBA(A6),A1�Get�the�address�where�to�read�the*£record�into.?�MOVE.L�A1,IOSSAD(A0)�Save�this�address�in�the�parameter�block.:�LEA„FENTRY+TYPESIZE+PARLEN+18-1-PBA(A6),A1�Get�the�ending *£address.@�MOVE.L�A1,IOSEAD(A0)�Save�this�address�into�the�parameter�block?�MOVE.W�#REFERENC,FENTRY-PBA(A6)�Read�only�the�record�whose�key#*£value�starts�with�REFERENC�(0003)<�MOVE.W�#IOPRAN+IOPRTK,IOSIN+IOSOPT-PBA(A6)�Do�I/O�by�Random(*£Record�Number�and�by�returning�the�key*£with�the�record�read.>�MOVE.L�REFRRN-PBA(A6),IOSRRN(A0)�Tell�it�which�RRN�we�want�it *£to�read �IOSCALL�(A0)ˆGo�read�the�record*+*£If�the�record�does�not�exist�or�if�we�are)*£at�the�end�of�the�file�then�mark�REFEND *£as�D) ONE.*�IF.B�D0��#ISTARN�OR.B•D0��#ISTAEOF�THEN.S0’MOVE.B�#DONE,REFEND-PBA(A6)�Mark�REFEND�as�DONE8’MOVE.B�#NOTSAME,REFFILE-PBA(A6)�Mark�REFFILE�as�NOTSAME�ENDI2�BSR„CMPLBL‡Compare�the�label�to�make�sure�this�is*£the�same�label.*)*£If�the�symbol�is�not�the�same�then�mark*£REFEND�as�DONE.*'�IF.B�SYMBOL-PBA(A6)��#NOTSAME�OR.B!•REFEND-PBA(A6)��#DONE�THEN.S0’MOVE.B�#DONE,REFEND-PBA(A6)�Mark�REFEND�as�DONE8’MOVE.B�#NOTSAME,REFFILE-PBA(A6)�Mark�REFFILE�as�NOTSAME5’LEA„FILENAME-PBA(A6),A4�Get�the�address�of�where�the*£referenced�filename�was�kept.7’LEA„BUFFER+TAB5REF-PBA(A6),A2�Get�the�address�of�where+*£to�start�writing�the�referenced�filename.3’BSR„WFNAME…Write�the�filename�to�the�output�buffer***£If�REFCOUNT�is�greater�than�1�then�print'*£in�brackets�([]),�the�number�of�times)*£the�symbol�was�referenced�in�that�file.*%’IF.L�REFCOUNT-PBA(A6)��#1�THEN.S-”MOVE.B�#'�',(A2)+�Add�a�space�after�filename ”MOVE.B�#'[',(A2)+�Open�brackets”MOVE.L�REFCOUNT-PBA(A6),D0)”BSR„DECOUTƒWrite�decimal�count�to�buffer!”MOVE.B�#']',(A2)+�Close�brackets’ENDI�ELSE.S6’BSR„CMPFILE„Compare�the�filename�to�make�sure�this�is$*£the�same�file�that�was�referenced.*-*£If�the�filename�was�the�same�then�increment$*£the�number�of�times�the�symbol�was *£referenced.*'’IF.BƒREFFILE-PBA(A6)��#SAME�THEN.S:”ADD.L‚#1,REFCOUNT-PBA(A6)�Update�the�number�of�references-”TST.B‚D0‡Test�for�any�errors�on�the�I/O�call”BNE„IOERR„Branch�if�any�errors5”IOSCALL�POSIOS-PBA(A6)�Read�the�Random�Record�Number”BNE„IOERR„Branch�if�any�errors”MOVE.L�IOSRRN(A0),D0)”ADD.L‚#1,D0„Add�1�to�get�to�the�next�RRN;”MOVE.L�D0,REFRRN-PBA(A6)�Save�the�RRN�at�REFRRN.‚This�will*£tell�us�where�we�left�off.’ELSE.S5”LEA„FILENAME-PBA(A6),A4�Get�the�address�of�where�the*£referenced�filename�was�kept.7”LEA„BUFFER+TAB5REF-PBA(A6),A2�Get�the�address�of�where+*£to�start�writing�the�referenced�filename.3”BSR„WFNAMEƒWrite�the�filename�to�the�output�buffer***£If�REFCOUNT�is�greater�than�1�then�print'*£in�brackets�([]),�the�number�of�times)*£the�symbol�was�referenced�in�that�file.*%”IF.L�REFCOUNT-PBA(A6)��#1�THEN.S-–MOVE.B�#'�',(A2)+�Add�a�space�after�filename –MOVE.B�#'[',(A2)+�Open�brackets–MOVE.L�REFCOUNT-PBA(A6),D0)–BSR„DECOUTƒWrite�decimal�count�to�buffer!–MOVE.B�#']',(A2)+�Close�brackets”ENDI8”MOVE.B�#NOTSAME,REFFILE-PBA(A6)�Mark�REFFILE�as�NOTSAME’ENDI�ENDIŽENDWŒENDIŠENDI*$*£If�DEFEND�or�REFEND�=�NOTDONE�then)*£output�the�buffer�to�the�output�listing*£file.*8ŠBSR.S‚CHKBLK�Check�to�see�if�there�is�anything�to�write(*‰IF.B�DEFEND-PBA(A6)��#NOTDONE�OR.B%*ŽREFEND-PBA(A6)��#NOTDONE�THEN.S+ŠIF.B�BUFCONT-PBA(A6)��#NOTEMPTY�THEN.S=ŒOUTPUT�BUFFER-PBA(A6),-1(A2),SYMIOS�Output�the�record�to�the*£output�listing�file.ŒBNE„IOERRŒBranch�if�any�errors*&*£Fill�the�output�line�buffer�with�all)*£spaces�so�that�we�can�start�over�again.*ŒLEA„BUFFER-PBA(A6),A2ŒFOR.W‚D0�=�#1�TO�#BUFSIZE�DO.S2ŽMOVE.B�#'�',(A2)+…Fill�the�buffer�with�all�spacesŒENDF <ŒMOVE.W�#IOPRAN+IOPRTK,IOSIN+IOSOPT-PBA(A6)�Do�I/O�by�Random(*£Record�Number�and�by�returning�the�key*£with�the�record�read.ŠENDIŠENDW>ŠADD.L‚#1,LABELRRN-PBA(A6)�Get�ready�to�read�the�next�SYMVALUE*£entry.ŠBRA„SYMSOVER‹Go�do�it�againŠPAGE*CHKBLK)ŠMOVEM.L�D0/A0,-(A7)‡Save�users�registersŠLEA„BUFFER-PBA(A6),A0ŠMOVE.B�#EMPTY,BUFCONT-PBA(A6)ŠFOR.W‚D0�=�#1�TO�#BUFSIZE�DO.SŒCMP.B‚#'�',(A0)+ŒIF��THEN.S!ŽMOVE.B�#NOTEMPTY,BUFCONT-PBA(A6)ŒENDIŠENDF,ŠMOVEM.L�(A7)+,D0/A0‡Restore�users�registersŠRTS*-*£This�subroutine�will�compare�the�referenced)*£filename�that�was�saved�to�the�filename *£just�read.*CMPFILE,ŠMOVEM.L�D0/A0/A1,-(A7)„Save�users�registers7ŠLEA„FILENAME-PBA(A6),A0�Address�where�save�filename�is>ŠLEA„FENTRY+TYPESIZE+PARLEN-PBA(A6),A1�Address�of�new�filename7ŠMOVE.B�#NOTSAME,REFFILE-PBA(A6)�Set�REFFILE�to�NOTSAMEŠFOR.B‚D0�=�#1�T) O�#8+8+2�DO.S4ŒCMP.B‚(A0)+,(A1)+†Compare�each�byte�of�the�filenameŒBNE.S‚CMPFILE1ŠENDFEŠMOVE.B�#SAME,REFFILE-PBA(A6)�Set�REFFILE�to�SAME�since�the�filenames*£are�the�same.7CMPFILE1‚MOVEM.L�(A7)+,D0/A0/A1„Restore�users�registersŠRTS*)*£This�subroutine�will�compare�the�symbol)*£that�was�saved�to�the�symbol�just�read.*CMPLBL,ŠMOVEM.L�D0/A0/A1,-(A7)„Save�users�registers5ŠLEA„FENTRY+TYPESIZE-PBA(A6),A0�Address�of�new�symbol-ŠLEA„LABEL-PBA(A6),A1ƒAddress�of�saved�symbol;ŠMOVE.B�#NOTSAME,SYMBOL-PBA(A6)�Mark�the�symbols�as�NOTSAMEŠFOR.B‚D0�=�#1�TO�#PARLEN�DO.S2ŒCMP.B‚(A0)+,(A1)+†Compare�each�byte�of�the�symbolŒBNE.S‚CMPLBL1ŠENDF5ŠMOVE.B�#SAME,SYMBOL-PBA(A6)�Mark�the�symbols�as�SAMECMPLBL1ƒMOVEM.L�(A7)+,D0/A0/A1ŠRTS *)*£This�subroutine�will�write�the�filename*£to�the�output�line�buffer.**£ENTRY:‚A4�=�Address�of�where�filename�is*WFNAMEŠIF.Bƒ(A4)��#$20�THEN.S.ŒMOVE.B�#'&',(A4)�Mark�the�catalog�as�NULL�'&'ŠENDI*+*£Write�the�catalog�name�to�the�output�line&*£buffer.‚This�will�not�print�trailing *£spaces.*ŠFOR.B‚D0�=�#1�TO�#8�DO.S-ŒIF.B�(A4)��#$20�THEN.S�Check�for�a�space7ŽMOVE.B�(A4)+,(A2)+�Write�catalog�to�output�line�bufferŒELSE.S!ŽADD.L‚#1,A4‚Skip�over�the�spacesŒENDIŠENDF >ŠMOVE.B�#'.',(A2)+�Add�a�'.'�to�seperate�catalog�from�filename*(*£Write�the�file�name�to�the�output�line&*£buffer.‚This�will�not�print�trailing *£spaces.*ŠFOR.B‚D0�=�#1�TO�#8�DO.S-ŒIF.B�(A4)��#$20�THEN.S�Check�for�a�space8ŽMOVE.B�(A4)+,(A2)+�Write�filename�to�output�line�bufferŒELSE.S!ŽADD.L‚#1,A4‚Skip�over�the�spacesŒENDIŠENDF 6ŠMOVE.B�#'.',(A2)+�Add�a�'.'�to�seperate�filename�from *£extension.*(*£Write�the�extension�to�the�output�line *£buffer.*ŠFOR.B‚D0�=�#1�TO�#2�DO.S;ŒMOVE.B�(A4)+,(A2)+�Write�the�extension�to�output�line�bffrŠENDFŠRTS *.* Convert Hexidecimal number to hex subroutine**8*�ENTRY:‚D0.L�=�Hexidecimal�number�to�convert�to�decimal**DECOUTŠMOVEM.L�D1-D4/A0,-(A7)ŠLEA„POWER10-PBA(A6),A04ŠMOVE.B�#10,D4�Maximum�number�of�characters�possible#ŠMOVE.L�(A0)+,D3‹Get�leading�spaces ŠMOVE.B�D3,D1BLANKITƒMOVE.B�D3,D2%SLODIV„SUB.L‚(A0),D0ŒSubtract�(10**N) ŠBCS.S‚LEAD0ŽTable�value�too�big*ŠADD.L‚#1,D2ŽIncrement�current�digit�count ŠBRA„SLODIV8LEAD0…ADD.L‚(A0)+,D0‹Restore�overborrow,�advance�pointer ŠCMP.B‚D1,D2%ŠBEQ.S‚LEADBŽYes,�store�leading�blank6ŠSUBQ.B�#1,D4ŽSubtract�the�number�of�blanks�to�display+ŠADD.W‚#$10,D2ŒConvert�blank�to�ASCII�digit!ŠCLR.B‚D1‘Turn�off�leading�blanks1ŠMOVE.B�D2,(A2)+‹Decimal�character�to�output�lineLEADB…TST.L‚(A0)�Done?ŠBEQ.S‚CHKALLB ŠBRA„BLANKITCHKALLBƒTST.B‚D1ŠBEQ.S‚BI2ASCXŠMOVE.B�#'0',(A2)+6ŠSUBQ.B�#1,D4ŽSubtract�the�number�of�blanks�to�displayBI2ASCXE*‰FOR.B�D0�=�#1�TO�D4�DO.S‚This�code�is�in�case�you�want�the�trailing,*‹MOVE.B�#'�',(A2)+‡characters�to�be�spaces.*‰ENDFŠMOVEM.L�(A7)+,D1-D4/A0ŠRTS   ** Register usage:*1*�D0.L�-�The�binary�value�returned�to�the�caller.7*�D1.L�-�Storage�as�numbers�are�entered�before�they�are *—moved�to�D0*�D2ƒ-�Counter*�D3.L�-�Base�for�the�number *¤1�-�ASCII *¤2�-�binary *¤8�-�octal*£10�-�decimal*£16�-�hexidecimal'*�D4.W�-�Flag�for�numbers�being�entered1*�D5.W�-�Scratch�registers�to�read�in�terminators*&*�A4.L�-�Pointer�to�ASCII�input�string-*�A5.L�-�Pointer�to�end�of�ASCII�input�string**GETNUMD"ŠBSR.S‚GETDECNU‹Get�decimal�numberGETNUMD9 ŠBNE„NOGOODŠRTS*GETNUMAŠBSR.S‚GETHEXNU‹Get�hex�number ŠBRA„GETNUMD9GETDECNU/ŠMOVEM.L�D1-D5/A0-A1,-(A7)�Save�users�registers*ŠMOVE.L�#10,D3�D3�=�decimal�base�(base�10) ŠBRA.S‚GETN20GETHEXNU/ŠMOVEM.L�D1-D5/A0-A1,-(A7)�Save�users�registers.ŠMOVE.L�#16,D3�D3�=�hexidecimal�base�(base�16)GETN20*ŠCLR.W‚D4‘D4�=�flag�for�characters�enteredŠCLR.L‚D1‘D1�=�temp�resultsŠREPEATŒMOVE.B�(A4),D0ŒIF.B�D0��#$20�THEN.S ŽADDQ.L�#1,A4ŒENDI;ŠUNTIL.B�D0��#$20�OR.L�A4��A5�Ignore�leading�spacesGETN30'ŠIF.L�A4��A5* �THEN.S„End�of�buffer�? ŒBRA„GETN90ŠENDIŠCLR.L‚D0‘HSKPŠMOVE.B�(A4)+,D0 'ŠLEA„TRMNTRS-PBA(A6),A1�Terminator�listGETN40ŠMOVE.B�(A1)+,D5&ŠBEQ.S‚GETN45�End�of�terminator�list�? ŠCMP.B‚D0,D5 ŠBEQ„GETN85 ŠBRA„GETN40GETN45*ŠCMP.L‚#1,D3ŽAre�we�doing�ASCII�characters ŠBEQ.S‚GETN77*ŠCMP.B‚#'''',D0‹Is�it�an�ASCII�character�? ŠBNE.S‚GETN50ŠMOVEQ.L�#1,D3 ŠBRA.S‚GETN71GETN50*ŠCMP.B‚#'%',D0ŒIf�'%'�the�number�is�binary ŠBNE.S‚GETN55&ŠMOVEQ.L�#2,D3�Set�for�base�2�(binary) ŠBRA.S‚GETN71GETN55*ŠCMP.B‚#'@',D0ŒIf�'@',�the�number�is�octal ŠBNE.S‚GETN60%ŠMOVEQ.L�#8,D3�Set�for�base�8�(octal) ŠBRA.S‚GETN71GETN60,ŠCMP.B‚#'&',D0ŒIf�'&',�the�number�is�decimal ŠBNE.S‚GETN65(ŠMOVE.L�#10,D3�Set�for�base�10�(decimal) ŠBRA.S‚GETN71GETN650ŠCMP.B‚#'$',D0ŒIf�'$',�the�number�is�hexadecimal ŠBNE.S‚GETN75,ŠMOVE.L�#16,D3�Set�for�base�16�(hexidecimal)GETN71 ŒTST.W‚D4 ŒBNE.S‚GETN80GETN57ŠMOVE.W�#-1,D4 ŠBRA„GETN30GETN75ŠIF.L�D3��#1�THEN.S+ŒSUB.B‚#$30,D0ŠConvert�from�ASCII�to�binary ŒBLT.S‚GETN80 ŒCMP.B‚#9,D0 ŒBLE.S‚GETN77ŒCMP.B‚#$11,D0 ŒBLT.S‚GETN80ŒCMP.B‚#$16,D0 ŒBGT.S‚GETN80ŒSUB.B‚#7,D0ŒConvert�to�$A�-�$FŠENDIGETN77ŠIF.L�D3��#1�THEN.S&ŒCMP.W‚D3,D0ŒIs�input�larger�that�base ŒBCC.S‚GETN80/ŒMOVE.L�D1,D2ŒGet�ready�to�multiply�(D1�*�base)ŒSWAPƒD1ŒMULUƒD3,D1ŒTop�partŒSWAPƒD1ŒTST.W‚D1�Check�for�overflow ŒBNE.S‚GETN80‹Value�is�too�large ŒMULUƒD3,D2ŒNow�work�on�low�word!ŒADD.L‚D2,D1ŒPut�it�back�togetherŒBVS.S‚GETN80‹Overflow�?ŒADD.L‚D0,D1ŒAdd�in�new�stuff ŒBVC„GETN57ŠELSE.S+ŒLSL.L‚#8,D1ŒMake�room�for�new�ASCII�number#ŒOR.BƒD0,D1ŒAdd�in�new�ASCII�numberŠENDI ŠBRA„GETN30GETN80ŠIF.L�D3��#1�THEN.S ŒBRA„GETN77ŠENDI!ŠMOVE.L�#-1,D0�Error�return�(BNE) ŠBRA.S‚GETN95:GETN85„SUB.L‚#1,A4ŽBack�up�to�point�at�space/previous�char,GETN90„MOVE.L�D1,D0ŽSet�up�result�for�returnŠCLR.L‚D1‘Normal�return�(BEQ)8GETN95„MOVEM.L�(A7)+,D1-D5/A0-A1�Restore�users�registersŠRTS,TRMNTRSƒDC.Bƒ'�+-*/',0ŠTerminator�characters NOGOOD   READDONE*&*£Write�a�blank�line�to�the�log�device'*£Write�the�'Total�number�of�symbols�='&*£Write�a�blank�line�to�the�log�device**ŠIF.L�TASKNAME-PBA(A6)��#'&BCT'�THEN.S:ŒMOVE.W�#IOPIMG,OUTIOS+IOSOPT-PBA(A6)�Change�to�image�mode+ŒOUTPUT�BLANK-PBA(A6),BLANKE-PBA(A6),OUTIOSŒBNE„IOERRŒBranch�if�any�errors-ŒOUTPUT�TOTSYM-PBA(A6),TOTSYME-PBA(A6),OUTIOSŒBNE„IOERRŒBranch�if�any�errorsCŒMOVE.W�#IOPFOR,OUTIOS+IOSOPT-PBA(A6)�Change�back�to�formatted�modeAŒOUTPUT�BLANK-PBA(A6),BLANKE-PBA(A6),OUTIOS�Write�a�blank�line�toŒBNE„IOERRŒlog�deviceŠENDI=ŠLEA„TOTSYM+2-PBA(A6),A0�Write�Total�number�of�symbols�to�the*£output�line�bufferŠLEA„BUFFER-PBA(A6),A1ŠFOR.W‚D0�=�#1�TO�#TOTSYML�DO.S1ŒMOVE.B�(A0)+,(A1)+†Move�each�character�to�bufferŠENDF 8ŠLEA„PROCNUM-PBA(A6),A0�Address�of�the�number�of�symbolsŠFOR.B‚D0�=�#1�TO�#12�DO.S1ŒMOVE.B�(A0)+,(A1)+†Move�the�number�to�the�bufferŠENDF *&*£Write�the�total�number�of�symbols�to*£the�listing�file.*+ŠOUTPUT�BLANK-PBA(A6),BLANKE-PBA(A6),SYMIOS!ŠBNE.S‚IOERRŽBranch�if�any�errors$ŠOUTPUT�BUFFER-PBA(A6),-1(A1),SYMIOS!ŠBNE.S‚IOERRŽBranch�if�any�errors ERRTERM<ŠMOVE.W�#FHCLOS,SYMFHS-PBA(A6)�Get�ready�to�close�input�file,ŠFHSCALL�SYMFHS-PBA(A6)„Close�the�input�file!ŠBNE.S‚IOERRŽBranch�if�any�errorsEŠMOVE.W�#FHCLOS,SLSFHS-PBA(A6)�Get�ready�to�close�output�listing�file5ŠFHSCALL�SLSFHS-PBA(A6)„Close�the�output�listing�file!ŠBNE.S‚IOERRŽBranch�if�any�errorsEŠOUTPUT�BLANK-PBA(A6),BLANKE-PBA(A6),OUTIOS�Write�a�blank�line�to�logŠBNE.S‚IOERRŽdevice ŠERQ.TERM *$* Print I/O error with LU and status*‰D0.L�=�status)*‰A0ƒ=�FHS�or�IOS�parameter�block�address*IOERR0ŠBSR.S‚ERRMSG�Let�error�message�handler�complainŠBRA„ERRTERMŒGo�terminate1*-----------------------------------------------*+*�Subroutine�to�use�error�message�handler‡**‰D0�-�Message�code•*)*‰A0�-�Points�to�parameter�block�if�any�*1*-----------------------------------------------** ERRMSG>ŠMOVEM.L�D0/A0,ERRPBLK-PBA(A6)�Save�D0�and�A0�in�error�messageŠMOVE.L�#2,D0Žparameter�blockŠLEA„ERRPBLK-PBA(A6),A0ŠTRAPƒ#4‘Show�the�errorŠMOVEM.L�ERRPBLK-PBA(A6),D0/A0ŠRTS ŠEND„SGSYMBLéééé=/*=/*†SNAPSHOT.AF=/*+=/* Chain file to assemble SNAPSHOT utility=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to SNAPSHOT.LS=/*=/IFC \1ƒ=ARG�SNAPSHOT.LS=/ENDIF=/*%=ASM SNAPSHOT.SA,SNAPSHOT.RO,\1;RZ=80=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDééééééM=/*=/*†SNAPSHOT.LF=/*)=/* Link chain file to create SNAPSHOT.LO=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to SNAPSHOT.LL=/*=/IFC \1ƒ=ARG�SNAPSHOT.LL=/ENDIF=/*=LINK ,SNAPSHOT.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000INPUT SNAPSHOT.ROLIB 0.&.UTILIB.ROEND=/*=END+ ééééééVO********************************************************************************3*‰S�N�A�P�S�H�O�T�-�-�S�A�V�EƒS�C�R�E�E�NƒI�M�A�G�E***„Command�line�format:*<*ˆ=SNAPSHOT�[]�[,]**E*„For�EXORTERM�155's�only--just�prints�garbage�on�other�terminals�and$*„locks�up�until�you�issue�a�RETURN.*O*******************************************************************************‰PAGE#*************************************ˆEQUATE�FILES�INCLUDED:*�IOE*�TR1*#***********************************‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰INCLUDEƒ9995.&.TR1.EQ‰LIST      **‚Miscellaneous�equates* "DATASECT�EQU‡0“Section�#�for�data.*PROGSECT�EQU‡0“Section�#�for�program�code. CR‡EQU‡13’ASCII�CR�char.ESC†EQU‡27’ASCII�ESC�char.SPACE„EQU‡32’ASCII�space. *TERMINAL�EQU‡'#ƒ'ŽName�of�user's�terminal.2TERMLUƒEQU‡1“LU�for�terminal�whose�screen�to�copy. )PRINTER‚EQU‡'PR‚'ŽName�of�printer�device.,PRINTLU‚EQU‡2“LU�for�output�of�screen�image. ,TLINESƒEQU‡24’#�of�lines�on�terminal�screen. #EOLINEƒEQU‡$F9‘Signals�end�of�line.#EOPAGEƒEQU‡$DE‘Signals�end�of�page.5GARBAGE‚EQU‡$EA‘Signals�start�of�garbage�that�follows*§the�good�stuff�on�each�line.‰PAGEO*********************************************************************************ˆD�A�T�AƒS�E�C�T�I�O�N*O******************************************************************************* ‰SECTIONƒDATASECT 3BˆEQU‡*‰Base�of�program�(for�position-independence)  #*********** MISCELLANY ************ **‚Revision�information.*(REVIS„DC.B†'122084'ŒDate�of�last�change.0‰DC.B†'�'‘Blank�in�.LO�indicates�clean�assembly.)‰DC.B†'4'‘Major�VERSAdos�revision�number. **‚Stack.* ‰DS.W†$20 STACK„EQU‡* **‚User's�command�line.*CLINE„COMLINEƒ80 *9*‚Area�to�save�data�passed�in�registers�at�task�creation.*‰DSˆ0REG_SAV: *------- D0 - D3"SAV_MTSK�DC.L†0“Monitor�task�name.__hQpTx@€Nˆ&+ "SAV_MSES�DC.L†0“Monitor�session�#.#SAV_VOL‚DC.L†0“Default�volume�name.‰DC.W†0SAV_USN‚DC.W†0“Default�user�#. *------- D4 - D7SAV_CLG‚DC.L†0“Default�catalog. ‰DC.L†0“*$SAV_COML�DC.L†0“Command�line�length.(SAV_LUMK�DC.L†0“Logical�unit�usage�mask. *------- A0 - A3SAV_TASK�DC.L†0“Task�name.$SAV_TERM�DC.L†0“Associated�terminal.‰DC.W†0SAV_LUSN�DC.W†0“Logon�user�#.SAV_SESS�DC.L†0“Session. *------- A4 - A5SAV_DATE�DC.L†0“System�date.SAV_TIME�DC.L†0“System�time.  **‚Flags�and�such.*1IGNOREƒDC.B†0“Set�if�we�should�ignore�the�rest�of&*§the�char's�on�a�line�while�scanning.‰PAGE)*********** PARAMETER BLOCKS ************ *L*‚FHS�parameter�block�to�assign�input�device�(default�will�be�his�terminal).*‰DSˆ0‰FHS.IN„FHASGN,FOPPRPW,TERMLU *C*‚FHS�parameter�block�to�assign�output�device�(default�is�printer).I*‚If�file,�indexed�sequential�with�key�length�0�and�4-sector�data�blocks.*‰DSˆ0,‰FHS.OUTƒFHASGN,FOPISD+FOPPW,PRINTLU,PRINTER *H*‚IOS�parameter�block�to�output�the�terminal's�'spill�your�guts'�command+*‚and�read�back�the�contents�of�the�screen.*‰DSˆ0*‰IOS.IN„IOOWIN,IOPIMG+IOPINM+IOPNEC,TERMLU *>*‚IOS�parameter�block�to�write�formatted�to�the�output�device.*‰DSˆ0‰IOS.OUTƒIOWRIT,IOPFOR,PRINTLU‰PAGE1************ OUTPUT & INPUT BUFFERS ************* *-*‚Command�to�the�terminal�to�send�its�screen.*‰DSˆ0)GET†DC.B†ESC,'O'�'send�contents�of�screen%‰DC.B†31+1,31+1‹from�line‚1,�column‚1)‰DC.B†31+24,31+80‰toƒline�24,�column�80.' GETE…EQU‡*-1 *0*‚Buffer�to�hold�the�screen�contents�sent�to�us.*‰DSˆ0@PAGEBUF‚DS.B†TLINES*128+100†Size�is�#�of�lines�*�quasi-arbitraryPAGEBUFE�EQU‡*-13BUFLENƒEQU‡*-PAGEBUF‹large�number,�plus�some�slack.‰PAGEJ***************************************************************************'*�ERROR�MESSAGE�HANDLER�PARAMETER�BLOCK0*‹PRESET�FOR�INPUT�FROM�CDFLUN,�OUTPUT�TO�LDFLUN*J************************************************************************** ‰DSƒ0EM_PBLK: =‰DC.L‚0‡D0�-�IOS/FHS�RETURN�ERROR�STATUS‚(ERROR�MSG�KEYVALUE)8‰DC.L‚0‡A0�-�ADDR�OF�I/O�PARAMETER�BLOCK‚(IF�APPLICABLE)‰DC.B‚0‡OPTIONS�FLAG‰DC.B‚LDFLUN‚LU�FOR�OUTPUT‰DC.B‚0‡UNUSED‰DC.B‚CDFLUN‚LU�FOR�INPUT-‰DC.L‚0‡START�ADDRESS�FOR�USER�TEXT�PLUG�POOL+‰DC.L‚0‡ENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL‰PAGEO*********************************************************************************ˆP�R�O�G�R�A�MƒS�E�C�T�I�O�N*O******************************************************************************* ‰SECTIONƒPROGSECT ‰OPT‡BRS ‰XREF†PARSE,EDITFILE *D*‚Macro�to�move�address�(param�1)�to�an�effective�address�(param�2).* MOVADDR‚MACRO ‰PEA‡\1(PC)‰MOVE.L„(A7)+,\2‰ENDM    ‰DSˆ0BEGIN:  *I*‚Save�information�passed�to�us�in�registers�and�set�up�stack�&�base�reg.*3‰LEA‡REG_SAV(PC),A7ŠSave�14�registers�in�save�area.‰MOVEM.LƒD0-D7/A0-A5,(A7)„* %‰LEA‡STACK(PC),A7ŒLoad�stack�pointer.(‰LEA‡B(PC),A4�Load�program�base�address. **‚Parse�the�command�line.*5‰MOVE.L„SAV_COML-B(A4),D6‰D6�<--�command�line�length.6‰LEA‡CLINE(PC),A0ŒCLINE�is�start�address�of�command�li/‰BSR.L…PARSE�Parse;�errors�yield�INVALID�ENTRY.‰BMI.L…ER_NVEŽ*  * *‚Assign�the�terminal�for�input.*6‰LEA‡INFHS(PC),A6ŒGet�address�of�param�block�for�assig 0‰BTST.L„#22,D0ŽIf�the�input�field�of�the�command‰IF��THEN’line�is�null,!‹MOVE.L‚SAV_TERM-B(A4),FHSVOL(A6)'‰ELSEš(but�if�input�field�is�not�null,)6‹LEA…CLINE(PC),A0Œcall�EDITFILE�to�stuff�the�parameter'‹BSR.LƒEDITFILEŒblock�for�the�terminal.‹BMI.LƒER_NVEŽ*2‹BTST.L‚#1,D0�Only�devices�are�valid�for�the�input‹BEQ.LƒER_NVEŽfield.>‹IF.L„FHSVOL(A6)��#TERMINAL�THENƒIf�#�was�entered,�replace=�MOVE.L�SAV_TERM-B(A4),FHSVOL(A6)‡it�with�user's�terminal�nam‹ENDI‰ENDI !‰FHSCALLƒINFHS(PC)‹Do�the�assign.‰BNE.L…FATALERR **‚Assign�output�file/device.*, 3‰MOVE.L„A1,A0�A0�<--�ptr�to�the�output�field�of�the‰MOVE.L„A0,D0�command�line./‰IF��THEN’If�output�field�is�not�null,�then 7‹LEA…OUTFHS(PC),A6‹load�defaults�for�a�filename�into�thB‹MOVE.L‚SAV_VOL-B(A4),FHSVOL(A6)‚parameter�block�and�call�EDITFILE*‹MOVE.W‚SAV_USN-B(A4),FHSUSN(A6)‚stuff�it. ‹MOVE.L‚SAV_CLG-B(A4),FHSCLG(A6)$‹MOVE.L‚SAV_CLG+4-B(A4),FHSCLG+4(A6)‹MOVE.W‚#'SA',FHSEXT(A6)‹BSR.LƒEDITFILE ‹BMI.LƒER_NVE /‰BTST.L„#1,D0�If�it's�a�file,�try�to�delete�the1‰IF��THEN’old�one�first.‚Ignore�error�if�it'sB‹MOVE.W‚#FHDELT,FHSCMD(A6)‚just�telling�us�the�file�doesn't�exist.:‹FHSCALL�OUTFHS(PC)ŠThen�set�up�to�allocate�and�assign�the*‹IF��THEN�new�indexed�sequential�file.�CMP.B�#FSTANNM,D0�BNE.L�FATALERR‹ENDI!‹MOVE.W‚#FHALLO+FHASGN,FHSCMD(A0)‰ENDI ‰ENDI /‰FHSCALLƒOUTFHS(PC)ŠDo�the�(allocate�&)�assign.‰BNE.L…FATALERR **‚Get�the�screen�image.*6‰LEA‡INIOS(PC),A0ŒSend�the�commands�to�cause�the�termi;‰MOVADDRƒGET,IOSSAD(A0)†to�spill�its�guts,�and�read�what�is0‰MOVADDRƒGETE,IOSEAD(A0)…says�(output�w/�input).‰MOVADDRƒPAGEBUF,IOSRRN(A0)‰MOVE.L„#BUFLEN,IOSLEN(A0)‰TRAP†#2‰BNE.L…FATALERR *F*‚Now�that�we�have�the�screen�contents,�move�one�line�at�a�time�to�the+*‚beginning�of�the�buffer�and�print�it�out.*7‰LEA‡OUTIOS(PC),A0‹A0�points�to�the�IOS�param�block�for*§printer�output.8‰LEA‡PAGEBUF(PC),A1ŠWe�will�need�this�address�frequently3‰MOVE.L„A1,A2�A2�will�scan�the�screen�image�looking*§for�good�characters.5‰MOVE.L„A1,A3�A3�will�be�used�to�build�the�records�to$*§print�at�the�beginning�of�PAGEBUF.2‰LEA‡PAGEBUFE(PC),A5‰Get�address�of�end�of�buffer. 9‰MOVE.L„A1,IOSSAD(A0)‡Set�the�start�address�of�the�output *§buffer�in�the�IOS�param�block. ‰REPEAT 9‹MOVE.B�(A2)+,D1�Get�the�next�char�from�the�screen�image. 8‹IF.B�D1��#EOLINE�THENƒIf�this�is�the�end�of�a�line, 8�SF„IGNORE-B(A4)ˆClear�the�ignore�flag�for�the�new�line./�BSRƒPRINTLINŒPrint�line�to�output�file/device.)�MOVE.L�A1,A3ŽRestore�the�buffer�pointer. ‹ELSE˜(not�the�end�of�a�line) 0�TST.B�IGNORE-B(A4)ˆIf�we're�not�in�the�garbage, �IF‚‚THEN -�TST.B‚D1‘If�char�is�ASCII�(bit�7�must�be�0),.�IF‚‚THENŒchar�is�good�data,�so�move�it�in#�MOVE.B�D1,(A3)+‰position�to�print.�ENDI >�IF.B�D1��#GARBAGE�THENƒIf�this�is�the�char�that�marks�the7�ST‚IGNORE-B(A4)ˆbeginning�of�the�garbage�following�the)�ENDI–real�line,�remember�to�ignore�rest. �ENDI ‹ENDI (‰UNTIL.B�D1��#EOPAGE�OR.L�A2��A5'*§Continue�until�we�hit�the�end�of�page *§mark�or�the�end�of�the�buffer. **‚Print�the�last�line.* ‰BSR‡PRINTLIN  **‚Terminate�normally.* ‰ERQ.TERM‰PAGEL*****************************************************************************-*ˆROUTINE�TO�PRINT�LINE�TO�OUTPUT�FILE/DEVICE* *ˆInputs:0*‹A0.Lƒaddress�of�IOS�parameter�block�for�output/*‹A1.Lƒaddress�of�beginning�of�buffer�to�output9*‹A3.Lƒaddress�of�end�of�buffer�to�output�(not�preserved)L**************************************************************************** PRINTLIN: *�IF.L�A3��A1�THEN†If�the�line�is�empty6�MOVE.B�#SPACE,(A3)†Give�the�printer�a�space�to�print, �ELSE–else.�SUB.L�#1,A3�back�up�to�the�last�char�we�moved�ENDI–into�the�line�buffer. :�MOVE.L�A3,IOSEAD(A0)†Move�the�buffer�end�address�into�the*�TRAP�#2“IOS�parameter�block�and�write�the4�BNEƒFATALERRŒline�to�the�printer�in�formatted�mode. ‰RTS‰PAGEJ***************************************************************************+*ˆERROR�MESSAGES�FROM�ERROR�MESSAGE�HANDLER*J************************************************************************** ER_NVE1:8‰MOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�message,�then�return.1‰BRA.S…C_EM_PGMŒDo�BSR�to�ER_NVE1�instead�of�BRA. ER_NVO::‰MOVE.L„#EM_NVO,D0Š'INVALID�OPTION'�message�and�terminate.‰BRA.S…FATALERR ER_OPTCF:=‰MOVE.L„#EM_OPTCF,D0ˆ'OPTION�CONFLICT'�message�and�terminate.‰BRA.S…FATALERR*ER_NVE:, 9‰MOVE.L„#EM_NVE,D0Š'INVALID�ENTRY'�message�and�terminate.***J***************************************************************************2*ˆROUTINE�TO�CALL�ERROR�MESSAGE�HANDLER,�THEN�DIE.*J************************************************************************** FATALERR:‰BSR.S…C_EM_PGMGERREXIT‚ERQ.TERM‚#0,#$C000†Exit�with�error�status�(to�abort�chainfile).   M*******************************************************************************’CALL�TO�ERROR�MESSAGE�HANDLER**ˆCALL†BSR‡C_EM_PGM*A*ˆINPUTS„D0�and�A0�set�by�IOS�or�FHS�call,�or�D0�for�non-IOS/FHS.8*’Contents�of�all�registers�preserved.‚CCR�is�destroyed.*N****************************************************************************** C_EM_PGM:&‰MOVE.L„A0,-(A7)ŒSave�A0�on�the�stack.:‰LEA‡EM_PBLK+4(PC),A0ˆGet�addr�to�store�A0�in�param�block.0‰MOVE.L„(A7)+,(A0)ŠMove�old�A0�into�param�block.*‰MOVE.L„D0,-(A0)ŒMove�D0�into�param�block.0‰MOVE.L„#2,D0�Load�D0�with�'EMH�CALL'�indicator."‰TRAP†#4’Call�the�LOADER/EMH�task./‰MOVEM.LƒEM_PBLK-B(A4),D0/A0‡Restore�registers.‰RTS ‰END‡BEGINééé=/* =/*†SPL.AF=/*&=/* Chain file to assemble SPL utility=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to SPL.LS=/*=/IFC \1 ƒ=ARG�SPL.LS=/ENDIF=/*=ASM SPL.SA,SPL.RO,\1;R-WZ=146=/*{ Included files are:=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.SPL.EQ =/*ƒSPLM.AI =/*ƒSPLFMS.AI=/*ƒSPLINIT.AI=/*}=/*=ENDéééééé- �=/* =/*†SPL.LF=/*$=/* Link chain file to create SPL.LO=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to SPL.LL=/*=/IFC \1 ƒ=ARG�SPL.LL=/ENDIF=/*=LINK ,SPL.LO,\1;MIXAHS SEG SPLD:0 $0SEG SPLP(GR):8,14 SEG INIT:9 ENTRY (INIT)0 TASK .SPL,$1ATTR S P INPUT SPL.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééé陊LIST*—SPL�MODIFICATION�HISTORY*…REVISION�CODEˆ122084�4*?*…The�option�(OPT)�"PCS"�was�changed�to�"A"�in�files�SPLFMS.AI,*…SPLINIT.AI�and�SPLM.AI.**…REVISION�CODEˆ062184�4*C*…Modifications�made�to�accomodate�real�time�RMS.�SETASQ�bit�numberA*…two�was�turned�off.�Caused�problem�for�real�time�processing�but=*…no�problem�for�4.3�because�bit�was�not�checked.�Also�had�to=*…use�the�GET�TASK�NAME�directive�due�to�real�time�processingB*…because�TCB�address�and�not�task�name�was�in�the�event�processed'*…by�SPL.�This�was�buried�in�the�event.*C*…A�multiple�register�save�instruction�to�push�registers�A0,A1,�and@*…D2�onto�the�stack�at�the�beginning�of�the�OUTMSG�routine�and�a;*…multiple�register�restore�instruction�to�restore�the�same:*…registers�at�the�end�of�the�OUTMSG�routine�were�added�to@*…SPLM.AI.�This�fixes�a�problem�that�caused�the�spooler�to�abortC*…when�more�than�four�printer�devices�were�listed�in�its�queue�file*…SPLQUEUE.SQ�-�SPR976*E*…The�line�which�sets�the�length�of�the�opening�message�in�the�moduleA*…SPLINIT.AI�was�changed�to�reflect�the�new�length.�The�change�inB*…length�was�due�to�the�addition�of�the�name�of�the�utility�to�the*…beginning�of�the�message.*D*…H�option�added�-�Prints�a�help�file�whenever�user�makes�an�illegalB*…entry.�The�message�is�in�SPL.SA�and�the�routine�is�in�SPLINIT.AI* *œSPLINIT.AIC*…A0�is�pointed�to�the�FHS�parameter�block�before�the�error�messageE*…call�is�made.�This�causes�the�correct�error�message�to�be�displayed- +*…if�a�non-existent�volume�name�is�entered.* *�SPLM.AID*…Two�lines�were�added�in�the�cancel�multiple�entries�routine.�TheseA*…two�lines�allow�user�0�to�delete�all�entries�in�the�queue.�AlsoB*…the�user�number�check�for�a�non-zero�FHSUSN�was�removed�to�allow/*…user�0�to�delete�all�of�his�entries.�-�SPR630*A*…The�number�of�blank�lines�printed�on�the�last�page�of�a�spoolerA*…output�listing�was�changed�to�64�so�that�the�lines�of�asterisks¢-«B³J»A*…go�along�the�page�boundary,�making�it�easier�to�find�the�end�of;*…a�listing.�The�number�of�line�feeds�on�the�first�page�was%*…increased�to�48�for�the�same�reason*G*…A�routine�which�checkes�for�a�file�being�output�on�a�specified�deviceE*…was�added�at�the�beginning�of�the�CONTSPL�subroutine�to�prevent�theG*…continue�option�from�taking�effect�while�a�file�is�being�output.�ThisD*…modification�was�made�so�that�the�function�of�the�command�conforms.*…to�the�description�in�the�facilities�manual.*F*…A�routine�was�added�at�the�end�of�STRTSPL�which�will�update�a�file'sC*…status�to�'WAIT'�and�not�'READY'�if�the�file�is�sent�to�a�printerE*…which�is�in�the�wait�state.�This�fixes�a�problem�that�gave�a�file�aE*…ready�status,�even�if�the�device�it�was�sent�to�was�in�a�wait�state*F*…The�TST�D7�instruction�which�was�after�CONT40�in�the�CONTSPL�routineF*…was�removed,�as�the�RPLREC�routine�returns�an�error�as�NE�as�opposed&*…to�an�error�code�in�the�D7�register.*D*…A�routine�was�added�at�the�end�of�CONTSPL�which�clears�the�printerD*…status�flag�after�a�CONT,�even�if�there�is�no�file�waiting�on�that*…device*9***********************************************************‚.SPL�DATA�SEGMENT*9**********************************************************5SPL.†IDNTƒ3,0�.SPL�TASK�COPYRIGHT�1984�MOTOROLA,�INC.EŠTTL�.SPL�SPOOLER�TASK‚VER.�3.0�6/21/84�COPYRIGHT�1984�MOTOROLA,�INC.**ˆINCLUDE�FILES:*–EXE.EQ*–IOE.EQ *–TR1RTCD.EQ*–NIO.EQ*–TR1.EQ*–SPL.EQ*ŠNOLISTŠINCLUDE�9995.&.EXE.EQŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.TR1RTCD.EQŠINCLUDE�9995.&.NIO.EQŠINCLUDE�9995.&.TR1.EQŠLISTŠINCLUDE�9995.&.SPL.EQ ŠSECTION�0"DATASG„EQU„*’START�OF�DATA�SEGMENT*'* RESERVE MEMORY FOR UNINITIALIZED DATA*BŠDC.Bƒ'SPL�122084�4'ƒDATE,ASM�TYPE,OS�REV.�-�122084�4�-�Name�addedŠDS.BƒDATASGL-8**�HELP�MESSAGE*‰ADDED�FOR�VERSION�062184�4*ŠDS.Wƒ0 HELPMSGƒEQU„*2ŠDC.Bƒ'Command�format�:�SPL��[�;H�]�' ŠDC.Bƒ'‚'ŠDC.Bƒ'where�:�' ŠDC.Bƒ'‚'H„DC.B�'…volume�name�is�the�name�of�the�volume�on�which�the�spooler�file'8ŠDC.Bƒ'…will�reside.�There�is�no�default�spooler�volume' ŠDC.Bƒ'‚'IƒDC.B�'…H�-�Help�option.�The�H�option�will�print�this�message.�Any�other'ŠDC.Bƒ'‰input�will�be�ignored' ŠDC.Bƒ'‚''HELPLENƒDC.Wƒ41,1,7,1,67,51,1,69,29,1,0*,* SET INITIALIZED DATA THE WAY IT WAS MAPPED* * SRCDBS:ŠDC.Lƒ0* * LRECRD:ŠDC.Lƒ0* * STKPTR:ŠDC.Lƒ0!FMSPKT„DS.Bƒ22‘FMS�COMMAND�PACKETSCRATCHƒDS.Bƒ154�SCRATCH�AREAŠDS.Bƒ200�STACK SPLSTK„EQU„*JREGS†EQU�SCRATCH+REGOFF�OFFSET�INTO�SCRATCH�FOR�REGISTERS�SENT�TO�SUBTASKS*REGS4…EQU„REGS+FOURŠOFFSET�FOR�REGISTER�A1%FHSPB…DS.BƒFHSNLN�FHS�PARAMETER�BLOCK%IOSPB…DS.BƒIOSBLN�IOS�PARAMETER�BLOCK4SPLQN…DC.Lƒ0,0�TASK�NAME�AND�SESSION�THAT�STARTED�MESPLFLG„DC.Bƒ0’SPOOLER�FLAGS!SPLFLG1ƒDC.Bƒ0’MORE�SPOOLER�FLAGS*CURREC„DC.Lƒ-1‘CURRENT�QUEUE�RECORD�NUMBERCQEVT†COMLINE�ENTRYLNGˆEVENT�RECEIVING�AREA�AND�INITIAL�COMMAND�LINE"QBUF†DS.BƒQLNG�QUEUE�RECORD�BUFFERFSPLDEV„DC.Lƒ0…VOLUME�NAME�TO�USE�FOR�SPOOER�QUEUE�FILE�&�SPOOLER�FILES;TERM_FLG‚DC.Wƒ0’USED�FOR�TERMINATION�LOGIC�-�ADDED�062184�4*#*ˆPARAMETER�BLOCK�FOR�GET�TASK�NAME PBTSKIDƒDS.Lƒ1‹TASK�ID/TASK�NAMEPBTSKNMƒDS.Lƒ1‹SESSION�NUMBERENDSPLDƒEQU„*-DATASGŠPAGE. **‚CMDTBL‚COMMAND�TABLE-*ŠTABLE�OF�COMMANDS�THAT�THE�SPOOLER�RECEIVES'*ŠTHRU�AN�EVENT�CODE�3�FROM�FMS�AND�FHS*‚ENTRY�STRUCTURE:‚DC.W�COMMAND'*”DC.L�COMMAND�PROCESSOR�ADDRESS�OFFSET* CMDTBL„EQU„*ŠDC.WƒFHASGN�ASSIGNŠDC.Wƒ0ŠDC.WƒFHCLOS�CLOSEŠDC.Wƒ1ŠDC.WƒSPLCANCŒCANCELŠDC.Wƒ2ŠDC.WƒSPLCONTŒCONTINUEŠDC.Wƒ3ŠDC.WƒSPLFORMŒFORMSŠDC.Wƒ4ŠDC.WƒSPLPRNTŒPRINTŠDC.Wƒ5ŠDC.WƒSPLCOPYŒCOPIESŠDC.Wƒ6ŠDC.WƒSPLQUE�QUEUEŠDC.Wƒ7 ŠDC.WƒFHRATT�RETREIVE�ATTRIBUTESŠDC.Wƒ8"CMDTBLEƒEQU„*’END�OF�COMMAND�TABLE CMDTBLEL‚EQU„4’#�BYTES�PER�ENTRY**'MSG1†DC.Bƒ'NO�QUEUE�ENTRIES'�(16�BYTES)DMSG2†DC.Bƒ'DEVICE�FORMS�ID�STATUS�(OK=OK�TO�OUTPUT,WAIT=WAITING�FOR'ŠDC.Bƒ'�CONTINUE)'‡(66�BYTES)0MSG4†DC.Bƒ'DEV‚FORM�JOBID„VOL‚CATALOG‚FILENAME„'ŠDC.Bƒ'�TASK�COPY�STATUS‚';MSG3†DC.Bƒ'NO�DEVICES�WAITING�FOR�SPOOLING�NOW�'�(36�BYTES)&MSG5†DC.Bƒ'READY‡'…(12�BYTES)‚QSTATRDY'MSG6†DC.Bƒ'ACTIVE†'…(12�BYTES)‚QSTATACT+MSG7†DC.Bƒ'OUTPUT�NOW‚'…(12�BYTES)‚QSTATOUT*MSG8†DC.Bƒ'WAIT-CONTƒ'…(12�BYTES)‚QSTATWAT+MSG9†DC.Bƒ'WAIT-FORMS‚'…(12�BYTES)‚QSTATFRM,MSG10…DC.Bƒ'IO�ERR�D0=‚'…(12�BYTES)‚QSTATIOE(MSG11…DC.Bƒ'CANCEL†'…(12�BYTES)‚QSTATCANENDATA„EQU„*-1-DATASG**ˆINCLUDE�FILES:‚SPLM.AI *˜SPLFMS.AI *˜SPLINIT.AIŠPAGEŠINCLUDE�SPLM.AIŠINCLUDE�SPLFMS.AIŠINCLUDE�SPLINIT.AIéééééŠPAGEŠLIST ŠSECTION�8ŠOPT„FRS,MEX,NOCL*H*************************************************************************%*�START�OF�CODE�FOR�THE�FMS�INTERFACE*H*************************************************************************&*Š**************************************�FMSINT�1.00�12/12/1979�HBN6*&*Š*************************************4*‚FMSINT�INFERFACES�THE�SPOOLER�TO�FHS�AND�IOS�CALLS*/*‚ON�ENTRY:�A0�=�FMSINT�PARAMETER�BLOCK�ADDRESS*ŒA4�=�BASE�ADDRESS *ŒBSR�FMSINT)*‚ON�EXIT:‚ALL�REGISTERS�UNCHANGED�EXCEPT*ŒD0�=�0�IF�NO�IO�ERROR,�OR+*‘NONZERO�IF�IO�ERROR�(�=�IO�ERROR�STATUS�)*ŒZ-FLAG�SET�ACCORDINGLY*ŒRTS FMSINT„EQU„**3*ŠGET�BRANCH�ADDRESS�FOR�FUNCTION�REQUESTED�INTO�A1*7ŠMOVEM.L�D1-D7/A0-A6,-(A7)�SAVE�ALL�REGISTERS�EXCEPT�D00ŠMOVE.L�A0,A3ŽKEEP�PARAMETER�BLOCK�ADDRESS�IN�A36ŠCLR.L‚D0�GET�COMMAND�CODE�FOR�INDEX�INTO�BRANCH�TABLEŠMOVE.B�FMSCMD(A3),D0†.ŠSUB.L‚#1,D0Ž.�ORG�TO�04ŠCMP.B‚#NOCMD,D0ŠCHECK�THAT�COMMAND�NOT�OUT�OF�RANGE2ŠBCC.S‚FMSER1�.�ERROR,�NO�SUCH�COMMAND�CODE�(.GE.)ŠCMP.B‚#1,D0ŽREAD�COMMAND?ŠBEQ.S‚FMSI00�YESK…MOVE.L�#-1,(DATASG+LRECRD)-DATASG(A4)�LAST�REC�NOT�AVAILABLE�ON�OTHER�CMDS4FMSI00„LSL.W‚#2,D0ŽD0�=�BRANCH�ADDRESS�OFFSET�(D0*4)'ŠLEA„FMSBRA(PC),A1†BRANCH�. ADDRESS�TABLE9ŠADD.L‚D0,A1�FINALLY�A1�=�SUBROUTINE�ADDRESS�TO�BRANCH�TO*0*ŠDO�COMMON�REGISTER�SETUP:�USE�D6�-�D7,�A2�-�A6*ŠSET�RETURN�STATUS�TO�ZERO* ŠMOVE.L�A4,A6ŽFMSINT�SCRATCH�PADMƒLEA�FHSPB-DATASG(A4),A2�ASSIGN/ALLOC/CLOSE�PARA�BLOCK�FOR�SOURCE/OUTPUT�FILECŠLEA„IOSPB-DATASG(A4),A5�INPUT/OUTPUT�PARAMETER�BLOCK�FOR�IOS�CALLS#ŠMOVE.L�#LINEBL,D6‰LINE�BUFFER�SIZEŠMOVE.B�#'�',D7ŒSPACE/ŠCLR.B‚FMSTAT(A3)‰CLEAR�STATUS�FOR�GOOD�RETURNSK…MOVE.L�A7,STKPTR(A6)�SAVE�CURRENT�STACK�POINTER�FOR�ABORT�FROM�SUBROUTINES**ŠBRANCH�TO�SUBROUTINE* ŠJMP„(A1)ŠPAGE*7*ŠSUBROUTINE�BRANCH�ADDRESS�TABLE,�FMSCMD�USED�AS�INDEX*FMSBRA„BRA„OPENCD�1�OPEN�FILESŠBRA„RDCD�2�READ�RECORDSŠBRA„DELCDŽ3�DELETE�RECORDSÃBÌJÔ:ÜLäHìMô9ü1ŠBRA„INSRTCDŒ4�INSERT�RECORDŠBRA„REPLCD�5�REPLACE�RECORD*2NOCMD…EQU„(*-FMSBRA)/4‡NO�COMMAND�CAN�BE�.GE.�THIS**ŠERROR�RETURNS*HFMSER1„MOVE.L�#FSTAIF,D0…INVALID�FMSCMD�CODE:�NOT�IMPLEMENTED�OR�TOO�BIG4ŠBRA.S‚FMSERR�OR�INVALID�PARAMETERS�PASSED�TO�FMSINT3FMSER3„MOVE.L�#ISTABO+MN,D0†SOURCE�RECORD�TOO�LARGE*ŠOR�EDIT�FILE�RECORD�TOO�SMALL ŠBRA.S‚FMSERR6FMSER4„MOVE.L�#ISTARR+MN,D0†INVALID�KEY�IN�SOURCE�FILE7FMSERR„MOVE.B�D0,FMSTAT(A3)†SET�RETURN�CODE�FROM�FMSINT**ŠRETURN�FROM�FMSINT*'FMSOKR„CLR.L‚D0‘INDICATE�GOOD�IO�RETURN2FMSRET„MOVEM.L�(A7)+,D1-D7/A0-A6�RESTORE�REGISTERSŠRTS*2FMSABRTƒMOVE.L�STKPTR(A6),A7†RESTORE�STACK�POINTER ŠCLR.L‚D0ŠBRA.S‚FMSRET�RETURNŠPAGE****&*Š**************************************ŽOPENCMD�1.00�12/12/1979�HBN6*&*Š*************************************/*ŠON�ENTRY:�A3�=�FMSINT�PARAMETER�BLOCK�ADDRESS9*”A2�=�FHS�PARAMETER�BLOCK�ADDRESS�FOR�SOURCE/OUTPUT�FILE"*”A5�=�IOS�PARAMETER�BLOCK�ADDRESS*”A6�=�FMSINT�SCRATCH�PAD*”D6�=�LINE�BUFFER�SIZE*”D7.B�=�SPACE *”BRA�OPENCMD*-*ŠON�EXIT:‚ALL�REGISTERS�USED/UNKNOWN�EXCEPT:!*”D0�=�LAST�IOS/FHS�ERROR�STATUS,* OPENCD„EQU„**"*ŠZERO�OUT�UNINITIALIZED�DATA�AREA*)ŠMOVE.L�#DATASGL/2,D0†WORD�COUNT�TO�CLEARŠMOVE.L�A6,A0ŽSTARTING�ADDRESSOPEN01„CLR.W‚(A0)+ ŠSUB.W‚#1,D0 ŠBNE„OPEN01*;*ŠSETUP�TO�ASSIGN�SOURCE�FILE�WITH�SHARED�BUFFER�(FOR�COPY)*&ŠMOVE.B�FMSRECN(A3),EFLUN(A6)�FILE�LUN*C*ŠASSIGN�THE�SOURCE�FILE�(AND�ALLOCATE�IF�NECESSARY)�WITH�EXCLUSIVE *ŠREAD�ACCESS;*ŠDETERMINE�ATTRIBUTES�FOR�NEW�FILE�IF�NEED�TO�ALLOCATE�ONE*O SFHSCO FHASGN,FOPEREW+FOPABF+FOPADR,A2 ASSIGN FOR EXCLUSIVE READ W/SHARED BUFF!ŠMOVE.B�EFLUN(A6),D0‡GET�FILE�LUN$ŠMOVE.L�FMSBUF(A3),A1†A1�->�FILENAMEŠMOVE.L�A1,A0ŽA0�->‚FILE�NAMEG‰SFATTR�FOPISD,VRLFIL,DEFSIZ,KEYSIZ,A2�DEFAULT�ATTRIBUTES�IF�MUST�ALLOC9ŠBSR„ASAFIL‹ASSIGN�(�ALLOCATE�IF�NON-EXISTENT�FILE�NAME�)ŠBNE„OPNERR�IO�ERROR?*+*ŠSAVE�SOURCE�FILE�ATTRIBUTES�FOR�LATER�USE*BŠMOVE.L�FHSSAD(A2),SRCDBS(A6)�SHARED�BUFFER�PHYSICAL�START�ADDRESSDŠMOVE.L�FHSEAD(A2),SRCDBE(A6)�SOURCE�FILE�SHARED�BUFFER�PHYSICAL�END%ŠCLR.L‚D6‘KEEP�'FILENAME1'‚KEY�LENGTHŠMOVE.B�FHSKEY(A2),D6†.�IN�D6#ŠMOVE.B�D6,SRCKYZ(A6)†SAVE�KEY�SIZEŠMOVE.B�D6,OUTKYZ(A6)†.ŠCMP.L‚#MXRECL,D6‰KEY�ERROR? ŠBGE„FMSER4+ŠMOVE.W�FHSLRL(A2),D2†RECORD�SIZE�TOO�LARGEŠCMP.W‚#MXRECL,D2ŠBGT„FMSER3�YES*ŠMOVE.W�D2,SRCRCZ(A6)†NO,�SAVE�RECORD�SIZEŠMOVE.W�D2,OUTRCZ(A6)†.**>ŠCLR.B‚FMSOFS(A3)ˆSET�SAVE�OUTPUT�FILE�STATUS�FOR�NOW�(OFSSAV)*ŠMOVE.W�FHSOPT(A2),D2†GET�SOURCE�FILE�TYPE"ŠAND.W‚#FFTBIT,D2‰.�AND�KEEP�IN�D2"ŠMOVE.L�#FSTADNM,D0ˆEDIT�OLD�FILE? ŠTST.B‚D1‘.ŠBEQ.S‚OPEN20�YES'ŠMOVE.L�#FSTANNM,D0ˆNO,�NEW�SOURCE�FILE=ŠMOVE.B�D1,FMSOFS(A3)†DELETE�IT�IF�ABORT�BEFORE�SAVE�(OFSDEL)@OPEN20„MOVE.B�D0,FMSTAT(A3)†RETURN�SOURCE�FILE�STATUS�FOR�EDITOR0ŠCLR.B‚OFSTAT(A1)‰SET�'FILENAME1'�AS�OUTPUT�FILEŠPAGE*/*‡EDIT�FILE�READY,�ESTABLISH�#�OF�RECORDS�IN�IT*EŠSIOSCO�IOPOST,IOPREC+IOPRAN,A5�POSITION/ �AT�END�OF�FILE�(GET�EOF�LRN).ŠMOVE.B�EFLUN(A6),IOSLUN(A5)�USE‚EDIT�FILE�LUN6ŠMOVE.L�#-1,D3�A�-1�LRN�WITH�POSITION�MEANS�EOF�WANTEDŠMOVE.L�D3,IOSRRN(A5)†.AŠIOSCALL�(A5)†POSITION�WILL�RETURN�LAST�LRN�IN�FILE�OR�EOF�STATUSŠBNE.S‚OPN165�ERROR�OR�EOF?.ŠMOVE.L�IOSRRN(A5),D3†NO,�GET�LAST�LRN�OF�FILE7ŠBRA.S‚OPN175�AND�RETURN�TO�EDITOR,GO�CLOSE�SOURCE�FILE,OPN165„CMP.B‚#ISTAEOF,D0ˆNO�RECORDS�IN�FILE?ŠBNE.S‚OPNERR�IO�ERROR*8*ŠSAVE�LOGICAL�RECORD�NUMBER�OF�LAST�RECORD�IN�EDIT�FILE*1OPN175„MOVE.L�D3,EOFLRN(A6)†SAVE�LAST�LRN�OF�FILE6ŠMOVE.L�D3,FMSREC(A3)†RETURN�IT�IN�THE�PARAMETER�BLOCK!ŠBRA„FMSOKR�GOOD�RETURN�FROM�OPENOPNERR„BRA„FMSRETŠPAGE%*Š*************************************ŽASAFIL�1.00�12/12/1979�HBN6*%*Š************************************C*ŠSUBROUTINE�ASAFIL�ASSIGNS�GIVEN�FILE�IF�IT�EXISTS,�ELSE�A�FILE�IS*•ALSO�ALLOCATED***ŠON�ENTRY:�A0�->�FILE�NAME�TO�BE�ASSIGNED2*”A2�->�FHS�PARAMETER�BLOCK;�SETUP�FOR�CALL�EXCEPT)*šFOR�FILE�NAME,�LUN�AND�READ/WRITE�CODES *”D0�=�LUN *”BSR�ASAFIL**ŠON�EXIT:‚ALL�REGISTERS�UNCHANGED�EXCEPT:&*”D0�=�LAST�IOS/FMS�CALL�RETURN�STATUS*™Z-FLAG�SET�ACCORDINGLY%*”D1�=�0�IF�ASSIGNED�AT�FIRST�TRY,�OR.*™1�(�=�OFSDEL�)‚IF�HAD�TO�ALLOCATE�FILE�FIRST*”RTS* ASAFIL„EQU„**)*ŠMOVE�FILE�NAME�INTO�FHS�PARAMETER�BLOCK*#ŠMOVEM.L�A0-A1,-(A7)‡SAVE�REGISTERSŠMOVE.B�D0,FHSLUN(A2)†SET�LUN"ŠLEA„FHSVOL(A2),A1†MOVE�TO�ADDRESS'ŠMOVE.L�#FILNML/2,D0‡WORD�COUNT�TO�MOVEASA00…MOVE.W�(A0)+,(A1)+ ŠSUB.W‚#1,D0 ŠBNE„ASA00**ŠSET�READ�AND�WRITE�CODE*ŠTST.W‚(A0)+ŽSKIP�RESERVED�WORD1ŠMOVE.W�(A0)+,FHSWCD(A2)ƒSET�READ�AND�WRITE�CODES**ŠTRY�TO�ASSIGN�GIVEN�FILE*-ŠCLR.L‚D1‘ANTICIPATE�GOOD�ASSIGN�AT�FIRST�TRY8ŠFHSCALL�(A2)ŽASSIGN�CALL�(AND�ALLOCATE�IF�SO�INDICATED)ŠBEQ.S‚ASARET�ASSIGN�OK?+ŠCMP.B‚#FSTANNM,D0ˆNO,�FILE�DOES�NOT�EXIST?ŠBNE.S‚ASARET�NO,�OTHER�ERROR*5*ŠHAVE�TO�ALLOCATE�NEW�FILE�BEFORE�CAN�HOPE�TO�ASSIGN*.ŠMOVE.L�#OFSDEL,D1‰INDICATE�NEW�FILE�ALLOCATED-ŠOR.Wƒ#FHALLO,FHSCMD(A2)�TRY�TO�ALLOCATE�FILEŠFHSCALL�(A2)ŽAND�THEN�ASSIGN,ASARET„MOVEM.L�(A7)+,A0-A1‡RESTORE�REGISTERSŠRTSŠPAGE**"*Š**********************************ŽRDCMD�1.00�01/07/79�HBN6*"*Š*********************************/*ŠENTRY�AND�EXIT�CONDITIONS�SAME�AS�FOR�OPENCMD** RDCD†EQU„** *ŠINITIALIZE*2ŠMOVE.L�FMSBUF(A3),A1†STARTING�LINE�BUFFER�ADDRESS ŠCLR.L‚D1/ŠMOVE.W�FMSRECN(A3),D1…GET�#�OF�RECORDS�TO�READ+ŠCLR.W‚D2‘0�#�OF�RECORDS�TRANSFERRED‚SO�FAR/ŠMOVE.L�FMSREC(A3),D3†LRN�OF�1ST�RECORD�TO�READ/ŠMOVE.L�EOFLRN(A6),D4†GET�LAST�LRN�IN�EDIT�FILEŠBMI.S‚RD40�EMPTY�FILE? ŠTST.L‚D3‘NO-ŠBMI.S‚RD35�READ�N�LAST�RECORDS�OF�FILE�IF�-11ŠCMP.L‚D4,D3ŽNO,�DOES�1ST�RECORD�REQUESTED�EXIST?3ŠBGT.S‚RD40�NO,�RETURN�WITH�RECORD�NOT�FOUND�STATUS**ŠGET�ONE�RECORD�AT�A�TIME*"RD01†CMP.L‚EOFLRN(A6),D3†PAST�EOF?ŠBHI.S‚RD25�YES,�DONE�READING,ŠCLR.L‚D0‘GET�RECORD�POSITION‚AND�SET�LRECRD;ŠBSR„POSTLR‰BY�READING�IN�BLOCK�CONTAINING�REQUESTED�RECORDŠBNE.S‚RDER�ERROR4RD01A…ADD.W‚#1,D2ŽINCREMENT�#�OF�RECORDS�TRANSFERRED**ŠMOVE�RECORD�TO�LINE�BUFFER* ŠMOVE.L�#LINEBL,D6‰RECORD�LENGTHRD02†MOVE.B�(A0)+,(A1)+ˆMOVEŠSUB.L‚#1,D6ŽDECREMENT�COUNTERŠBNE„RD02�BRANCH�TIL�MOVED**ŠREAD�NEXT�RECORD*RD15†SUB.L‚#1,D1ŽDONE?ŠBEQ.S‚RD20�YES6ŠADD.L‚#1,D3ŽNO,�READ�NEXT�RECORD,�GET�ITS�LRN�INTO�D3RD19†BRA.S‚RD01�.RDER†BRA„FMSRET�IO�ERROR**ŠSET�RETURN�PARAMETERS*+RD20†CLR.L‚D0‘GOOD�RETURN�UNLESS�FIND�ERROR.ŠCMP.L‚EOFLRN(A6),D3†READ�LAST�RECORD�OF�FILE?ŠBNE.S‚RD30�NO1RD25†MOVE.L�#ISTAEOF+MN,D0…YES,�RETURN�EOF�STATUS2ŠMOVE.L�EOFLRN(A6),D3†EOF�LRN�FOR�LAST�RECORD�READ3RD30†MOVE.W�D2,FMSRECN(A3)…RETURN�#�OF�RECORDS�READ4ŠMOVE.L�D3,FMSREC(A3)†RETURN�LRN�OF�LAST�RECORD�READ#ŠMOVE.B�D0,FMSTAT(A3)†RETURN�STATUSŠBRA„FMSOKR�GOOD�RETURN*!*ŠREAD�N�LAST�RECORDS�OF�THE�FILE*.RD35†MOVE.L�D4,D0ŽGET�STARTING�LRN�FOR�READING8ŠCLR.L‚D3ŽREAD�FROM�TOP�OF�FILE�IF�REQUESTED�ALL�OR�MORE)ŠADD.L‚#1,D0Ž.�RECORDS�THAN�FILE�CONTAINS/ ŠCMP.L‚D0,D1Ž.ŠBGE.S‚RD19�READ�FROM�TOP?.ŠSUB.L‚D1,D0ŽNO,�START�READING�FROM�EOFLRN+1-NŠMOVE.L�D0,D3Ž.ŠBRA„RD19�GO�READ*=RD40†MOVE.L�#ISTARN+MN,D0†1ST�RECORD�REQUESTED�DOES�NOT�EXISTŠBRA.S‚RD30�RETURNŠPAGE**ŽDELCMD�1.00�01/07/79�HBN6*/*ŠENTRY�AND�EXIT�CONDITIONS�SAME�AS�FOR�OPENCMD(*ŠCHECKPOINTING�IS�DONE�AFTER�THE�DELETE DELCD…EQU„** *ŠINITIALIZE*ŠCLR.L‚D1‘CLEAR�FOR�USE1ŠMOVE.W�FMSRECN(A3),D1…GET�#�OF�RECORDS�TO�DELETE'ŠCLR.W‚D2‘0�#�OF�RECORDS�DELETED�SO�FAR6ŠMOVE.L�FMSREC(A3),IOSRRN(A5)�LRN�OF�RECORDS�TO�DELETE2ŠMOVE.L�EOFLRN(A6),D0†EMPTY�FILE?�(�EOFLRN�=�-1�?)'ŠBMI.S‚DEL25ŽYES,�CAN'T�DELETE�ANYTHING#ŠCMP.L‚FMSREC(A3),D0†RECORD�EXISTS?4ŠBLT.S‚DEL25ŽNO,�RETURN�WITH�RECORD�NOT�FOUND�STATUS**ŠDELETE�ONE�RECORD�AT�A�TIME*.ŠSIOSCO�IODELR,IOPRAN,A5ƒDELETE�RANDOM�LOGICAL2ŠMOVE.B�EFLUN(A6),IOSLUN(A5)�DELETE�FROM�EDIT�FILE DEL00…EQU„*ŠIOSCALL�(A5)ŽDELETE$ŠBNE.S‚DEL10ŽIO�ERROR�OR�END�OF�FILE**ŠDELETE�NEXT�RECORD*1ŠSUB.L‚#1,EOFLRN(A6)†UPDATE�LAST�LRN�OF�EDIT�FILE+ŠADD.W‚#1,D2ŽINCREMENT�#�OF�RECORDS�DELETED"ŠSUB.W‚#1,D1ŽGO�DELETE�NEXT�RECORD ŠBNE„DEL00*/*ŠSET�EOF�STATUS�IF�DELETED�LAST�RECORD�OF�FILE*,ŠMOVE.L�EOFLRN(A6),D0†GET�LRN�OF�LAST�RECORD>ŠCMP.L‚FMSREC(A3),D0†LAST�RECORD�DELETED�IF�EOFLRN�.LT.�FMSREC%ŠBLT.S‚DEL20ŽLAST�RECORD�STILL�THERE?ŠBRA.S‚DEL15ŽNO'DEL10…CMP.B‚#ISTAEOF,D0ˆAT�END�OF�FILE?ŠBNE„FMSRET�NO,�IO�ERROR9DEL15…MOVE.B�#ISTAEOF,FMSTAT(A3)�YES,�DELETED�LAST�RECORD**ŠSET�RETURN�PARAMETERS*7DEL20…MOVE.W�D2,FMSRECN(A3)…RETURN�#�OF�RECORDS�DELETED:ŠMOVE.L�EOFLRN(A6),FMSREC(A3)�RETURN�LAST�LSN�IN�EDIT�FILE:ŠMOVE.B�#EFSCHG,FMSEFS(A3)�SET�EDIT�FILE�STATUS�AS�CHANGED ŠMOVE.L�D0,-(A7)‹SAVE�CURRENT�D0 ŠBSR.S‚CKPTCD�GO�DO�A�CHECKPOINTŠMOVE.L�D0,(A7)+‹RESTORE�D0ŠBRA„FMSOKR�GOOD�RETURN�EMPTY�FILE/ŠBMI„INSR35�RETURN�RECORD�DOES�NOT�EXIST�STATUSŠBRA.S‚INSREPLŒGO�REPLACE*4*ŠCHECKPOINTING�IS�DONE�AFTER�A�REPLACE�OR�AN�INSERT*!*Š*********************************�INSRTCMD�1.00�01/07/80*!*Š********************************6*ŠENTRY�AND�EXIT�CONDITIONS�SAME�AS�FOR�OPENCMD‚EXCEPT8*ŠON�ENTRY:�D1�=�0‚IF�INSREPL�ENTRY�ELSE�WILL�SET�D1�=�1* INSRTCDƒEQU„** *ŠINITIALIZE* ŠMOVE.L�#1,D1ŽSET�FLAG�TO�INSERT*9INSREPLƒEQU„*’ENTRY�POINT�IF�TO�REPLACE�INSTEAD�OF�INSERT*G‰MOVE.L�FMSREC(A3),D3�INSERT�AFTER�RECORD�WITH�THIS�LRN,OR�AT�TOP�IF�-1=ŠMOVE.L�FMSBUF(A3),A0†A0�->�RECORD�TO�BE�INSERTED�OR�REPLACED1ŠMOVE.L�A0,IOSSAD(A5)†SET�STARTING�RECORD�ADDRESS4ŠMOVE.L�A0,IOSEAD(A5)†PREPARE�FOR�BUFFER�END�ADDRESS'ŠADD.L‚#LINEBL,IOSEAD(A5)�ADD�IN�LENGTH'ŠSUB.L‚#1,IOSEAD(A5)†ACTUAL�END�ADDRESS*!*ŠPOSITION�AT�LRN�GIVEN�TO�INSERT*2ŠMOVE.B�EFLUN(A6),IOSLUN(A5)�INSERT�INTO�EDIT�FILEŠMOVE.L�D3,IOSRRN(A5)†SET�LRN)ŠCMP.L‚EOFLRN(A6),D3†GIVEN�RECORD�EXISTS?)ŠBGT.S‚INSR35�NO,�RETURN�RECORD�NOT�FOUND+ŠTST.L‚D1‘REPLACE�RECORD�INSTEAD�OF�INSERT?#ŠBEQ.S‚INSR20�YES,�SKIP�POSITIONING8ŠCMP.L‚EOFLRN(A6),D3†WRITE�FIRST�OR�LAST�RECORD�OF�FILE?ŠBEQ.S‚INSR40�YES,�GO�WRITE>ŠSIOSCO�IOPOST,IOPRAN,A5ƒNO,�POSITION�AT�RANDOM�LOGICAL�RECORD ŠTST.L‚D3‘INSERT�AT�TOP�OF�FILE?ŠBGE.S‚INSR15�NO/ŠCMP.L‚#-1,D3�.�INVALID�LRN�=>�RECORD�NOT�FOUNDŠBNE.S‚INSR35�.5ŠCLR.L‚IOSRRN(A5)‰YES,�POSITION�AT�1ST�RECORD�OF�FILE IN0 SR15„EQU„*ŠIOSCALL�(A5)ŽPOSITIONŠBNE.S‚INSERR�IO�ERROR*:*ŠINSERT�RECORD�AFTER�CURRENT�POSITION�OR�IN�FRONT�OF�FILE*ŠOR�REPLACE�GIVEN�RECORD*DŠSIOSCO�IOWRIT,IOPPRV+IOPIMG,A5�WRITE�PRIOR�IF�INSERT�AT�TOP�OF�FILEŠTST.L‚D3‘INSERT�1ST�RECORD?ŠBMI.S‚INSR20�YES.ŠSIOSCO�IOWRIT,IOPNXT+IOPIMG,A5�NO,�WRITE�NEXT4INSR20„IOSCALL�(A5)ŽWRITE�=�INSERT,�UPDATE�=�REPLACEŠBEQ.S‚INSR25�IO�ERROR?INSERR„TST.B‚D0‘YESŠBRA„FMSRET�IO�ERROR�RETURNŠPAGE**ŠSET�RETURN�PARAMETERS*=INSR25„MOVE.B�#EFSCHG,FMSEFS(A3)�SET�EDIT�FILE�CHANGED�STATUSŠTST.L‚D1‘REPLACED�RECORD?ŠBEQ.S‚INSR30�YES,�RETURN/ŠADD.L‚#1,D3ŽNO,�INSERTED,�GET�NEW�RECORD'S�LRNŠMOVE.L�D3,FMSREC(A3)†.(ŠADD.L‚#1,EOFLRN(A6)†INSERTED�ONE�RECORDDINSR30„CMP.L‚EOFLRN(A6),D3†INSERTED�OR�REPLACED�LAST�RECORD�OF�FILE?ŠBNE.S‚INSRET�NO-ŠMOVE.B�#ISTAEOF,FMSTAT(A3)�SET�STATUS�TO�EOFŠMOVE.L�D0,-(A7)‹SAVE�D0 ŠBSR„CKPTCD�GO�DO�THE�CHECKPOINTŠMOVE.L�(A7)+,D0‹RESTORE�D0INSRET„BRA„FMSOKR�GOOD�RETURNBINSR35„MOVE.B�#ISTARN,FMSTAT(A3)�SET�LRN�OUT�OF�BOUNDS�RETURN�FLAG ŠBRA.S‚INSRET*$*ŠWRITE�FIRST�OR�LAST�RECORD�OF�FILE* INSR40„EQU„*,ŠSIOSCO�IOWRIT,IOPRAN+IOPIMG,A5�WRITE�RANDOM&ŠADD.L‚#1,IOSRRN(A5)†LRN�IS‚0�OR�EOF+1ŠBRA„INSR20�GO�WRITEŠPAGE%*Š*************************************�POSTLR�1.00�01/07/80�HBN6*%*Š************************************C*ŠSUBROUTINE�POSTLR�POSITIONS�TO�RECORD�WITH�GIVEN�LRN�IN�EDIT�FILE7*•SHARED�BUFFER�AND�SETS�LRECRD�AND�LRECBA�IF�REQUESTED,*•(TO�BE�CALLED�FOR�EDIT�FILE�POSITION�ONLY)*F*ŠON�ENTRY:�D0�=�1�IF�TO�LEAVE�LRECRD�ALONE,�0�IF�TO�SET�LRECRD/LRECBA *”D3�=�LRN *”BSR�POSTLR**ŠON�EXIT:‚ALL�REGISTERS�UNCHANGED�EXCEPT:;*”A0�->�RECORD�IN�SHARED�BUFFER,�BCT�AND�KEY�FIELDS�SKIPPED*”D0�=�IOS�CALL�STATUS*”Z-FLAG�SET�ACCORDINGLY*”RTS* POSTLR„EQU„**'*ŠSET�PARAMETERS�IN�IOS�PARAMETER�BLOCK*ŠMOVE.L�D0,D4ŽSAVE�LRECRD�FLAG0ŠSIOSCO�IOPOST,IOPRAN,A5ƒRANDOM�LOGICAL�POSITION,ŠMOVE.L�D3,IOSRRN(A5)†SET�LRN�TO�POSITION�TO ŠMOVE.B�EFLUN(A6),IOSLUN(A5)�LUN ŠIOSCALL�(A5)ŠBNE.S‚POSTL1�ERROR�RETURNŠMOVE.L�SRCDBS(A6),A0!ŠADD.L‚IOSLEN(A5),A0†A0�->�RECORD)ŠTST.B‚D4‘UPDATE�LRECRD/LRECBA�REQUESTED?ŠBNE.S‚POSTL1�NO9ŠMOVE.L�D3,LRECRD(A6)†YES,�UPDATE�CURRENT�RECORD�POSITION1ŠMOVE.L�A0,LRECBA(A6)†SET�RECORD'S�BUFFER�ADDRESSN‚MOVE.L�SRCDBE(A6),SRCDBL(A6)�SET�LOGICAL�END�AT�END�OF�BUFFER�(0-WORD�=>�END)!POSTL1„TST.L‚D0‘RESTORE�IO�STATUSŠRTS*ééŠPAGE*>****************************************************************‚INITIAL�SPOOLER�START-UP*;*ˆREGISTER�A4�IS�USED�THROUGHOUT�SPL�AS�A�BASE�ADDRESS�REG.9*ˆREGISTER�A3�IS�USED�IN�THIS�SEGMENT�AS�THE�BASE�ADDRESS*”OF�THE�MAIN�PROGRAM�SEGMENT**‚A)GET�AN�ASQ5*‚B)GET�THE�VOLUME�NAME�TO�USE�FOR�THE�SPOOLER�VOLUME7*‚C)OPEN�THE�SPOOLER�QUEUE�FILE-CREATE�ONE�IF�NECESSARY%*‚D)START�SPOOLER�OUTPUT�IF�ANY�TO�DO*‚E)CLOSE�LUN�59*‚F)SENT�TERMINATION�MESSAGE�TO�TASK�THAT�STARTED�ME(SCT)8*‚G)GO�TO�SPL160�SO�THAT�THIS�SEGMENT�CAN�BE�DEALLOCATED**‚SPOOLER�QUEUE�FILE�COMMENTS:7*‚THE�SPOOLER�QUEUE�IS�AN�INDEXED�SEQUENTIAL�FILE,FIXED7*‚LENGTH�RECORDS.�IT�RESIDES�ON�THE�SPOOLER�VOLUME.�ALL8*‚SPOOLER�QUEUE�I/O�IS�HANDLED�BY�THE�SUBROUTINE�FMSINT.;*‚THE�SPOOLER�QUEUE�ENTRY�LAYOUT�IS�DOCUMENTED�IN�SPLEQU.SA;*‚FILE.�THE�QUEUE�ENTRIES�ARE�A�MIXTURE�OF�ASCII�AND�BINARY<*‚FIELDS.�RECORDS�0-9�ARE�RESERVED�FOR�THE�SPOOLER�TASK�ONLY>*‚AND�DO�NOT�CONTAIN�FILE�ENTRIES.�RECORDS�0-8�CON0 TAIN�A�TABLE:*‚OF�DEVICES,FORMS�ID,AND�DEVICE�STATUS.�THE�FIRST�2�BYTES;*‚OF�RECORD�9�CONTAINS�THE�LAST�JOB�NUMBER.�JOB�NUMBERS�ARE7*‚1-9999�AND�ROLL�START�OVER�AT�ONE�UPON�REACHING�9999.>**************************************************************** ŠSECTION�9ŠOPT„FRS,MEX,NOCLSPL‡EQU„*’ENTRY�POINT,ŠMOVE.L�D0,D2ŽSAVE�TASK�NAME�THAT�STARTED�ME*ŠMOVE.L�D1,D3ŽSAVE�SESSION�THAT�STARTED�MECŠLEA„GTADRPB(PC),A0�PARA.�BLOCK�ADDRESS�TO�GET�DATA�SEGMENT�ADDRESS6ŠMOVE.L�#RCVSA,D0ŠRECEIVE�SEGMENT�ATTRIBUTES�DIRECTIVE!ŠTRAPƒ#1‘GET�DATA�SEGMENT�ADDRESS0ŠBNE„SPL70ŽBRANCH�IF�AN�ERROR�RETURNED,TERMINATE'ŠMOVE.L�A0,A4ŽSAVE�DATA�SEGMENT�ADDRESS'ŠLEA„SPLSTK-DATASG(A4),A7�STACK�POINTERJ†MOVEM.L�D2-D3,SPLQN-DATASG(A4)�SAVE�TASK�NAME�AND�SESSION�THAT�STARTED�ME=ŠLEA„GTADRPB1(PC),A0„GET�MAIN�SEGMENT�ADDRESS�PARAMETER�BLOCK,ŠMOVE.L�#RCVSA,D0ŠRECEIVE�SEGMENT�ATTRIBUTESŠTRAPƒ#1‘GET�THE�ADDRESS)ŠBNE„SPL70ŽBRANCH�IF�AN�ERRO,GO�TERMINATE'ŠMOVE.L�A0,A3ŽSAVE�MAIN�PROGRAM�ADDRESS1 627%<->5@=(ŠLEA„IOSPB-DATASG(A4),A0�OUTPUT�REV�DATE ŠMOVE.W�#IOWRIT,IOSFCT(A0)�WRITE$ŠMOVE.W�#IOPFOR,IOSOPT(A0)�FORMATTEDŠMOVE.B�#LDFLUN,IOSLUN(A0)�LUN+ŠMOVE.L�A4,IOSSAD(A0)†MESSAGE�START�ADDRESS(ŠMOVE.L�A4,IOSEAD(A0)†SET�UP�END�ADDRESS3ŠADD.L‚#11,IOSEAD(A0)…ACTUAL�END�ADDRESS�-�062184�4ŠTRAPƒ#2‘OUTPUT�DATE,ETC.ŠBNE„SPL60ŽERROR�RETURN"ŠCMP.L‚#0,A2ŽSEE�IF�THIS�IS�USER�0 ŠBEQ.S‚SPL10ŽBRANCH�IF�USER�0,OK<ŠLEA„IOSPB-DATASG(A4),A0�NOT�USER�0,ERROR�SET�UP�FOR�MESSAGE'ŠLEA„ERRM2(PC),A1‡ERROR�MESSAGE�ADDRESS+ŠMOVE.L�A1,IOSSAD(A0)†ERROR�MESSAGE�ADDRESSŠLEA„ERRM2E(PC),A1†END�ADDRESS!ŠMOVE.L�A1,IOSEAD(A0)†END�ADDRESS0ŠBRA„SPL69ŽGO�OUTPUT�ERROR�MESSAGE�AND�TERMINATE5SPL10…LEA„FHSPB-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESSŠMOVE.L�A0,A1ŽADDRESS%ŠCLR.L‚(A1)+ŽTASK�NAME�FOR�GET�AN�ASQŠCLR.L‚(A1)+ŽSESSIONO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*MOVE.B�#2,(A1)+‚STATUS ŠCLR.B‚(A1)+*œSTATUSO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<(ŠMOVE.B�#ENTRYLNG,(A1)+„MAX�ENTRY�LENGTH'ŠMOVE.L�#ENTRYLNG*12,(A1)+�QUEUE�LENGTHŠMOVE.L�A3,(A1)ŒASR�ADDRESSŠMOVE.L�#GTASQ,D0ŠDIRECTIVEŠTRAPƒ#1‘GET�THE�ASQ*ŠBNE„SPL60ŽBRANCH�IF�AN�ERROR-GO�TERMINATE**‚GET�THE�SPOOLER�VOLUME�NAME*ŠTST.L‚D6‘A�COMMAND�LINE?-ŠBEQ„LISTHŽPRINT�HELP�OPTION�IF�NO�-�062184�45ŠCMP„#6,D6ŽINPUT�CANNOT�BE�>�6(INCLUDES�COLON�AND�CR)7ŠBGT„LISTH�BRANCH�IF�GREATER�TO�HELP�MESSAGE�-�062184�4ŠBSR„GTINPT�GO�PARSE�THE�INPUT;ŠBMI„LISTH‰ERROR�IN�PARSING�-�PRINT�HELP�MESSAGE�-�062184�42ŠMOVE.W�#FHDVOL,FHSCMD(A0)�SET�DEFAULT�VOLUME�NAME)ŠMOVE.W�#FOPDSP,FHSOPT(A0)�SPOOLER�VOLUMEŠTRAPƒ#3‘DO�IT)ŠBNE„SPL60ŽBRANCH�IF�AN�ERROR,CAN'T�SPOOL=ŠMOVE.L�FHSVOL(A0),SPLDEV-DATASG(A4)�SAVE�SPOOLER�VOLUME�NAME**‚GET�SPOOLER�QUEUE�FILE*‚LUN=1‚VOLN=CONTENTS�OF�SPLDEV-*‚USING�FMSINT�FOR�ALL�SPOOLER�QUEUE�FILE�I/O*/ŠLEA„FMSPKT-DATASG(A4),A0�FMSINT�PACKET�ADDRESS-ŠMOVE.B�#OPENCMD,FMSCMD(A0)�OPEN�FILE�COMMAND"ŠLEA„SCRATCH-DATASG(A4),A1�ADDRESSBŠMOVE.L�A1,FMSBUF(A0)…ADDRESS�OF�SPOOLER�QUEUE�FILENAME�FOR�FMSINT$ŠMOVE.W�#$0100,FMSRECN(A0)�USE�LUN�1/ŠLEA„SCRATCH-DATASG(A4),A1�GET�FILENAME�ADDRESS"ŠMOVE.L�A1,A2ŽSAVE�SCRATCH�ADDRESS9ŠMOVE.L�#14,D0�NUMBER�OF�LONG�WORDS�TO�CLEAR�FOR�FILENAME1SPL80…CLR.L‚(A1)+ŽCLEAR�SCRATCH�AREA�FOR�FILENAMEŠSUB.L‚#1,D0ŽDECREMENT�COUNTŠBNE„SPL80Ž56�BYTES�TO�CLEAR3ŠMOVE.L�SPLDEV-DATASG(A4),(A2)+�SPOOLER�VOLUME�NAMEŠMOVE.W�#0,(A2)+‹USER�NUMBER�0ŠMOVE.L�#BLANK,(A2)+‡CATALOGŠMOVE.L�#BLANK,(A2)+‡CATALOG'ŠMOVE.L�#'SPLQ',(A2)+†FILENAME=SPLQUEUE&ŠMOVE.L�#'UEUE',(A2)+†REST�OF�FILENAME ŠMOVE.W�#'SQ',(A2)+ˆEXTENSION=SQI‡LEA�FMSINT-SPLEVNT(A3),A6�GO�DO�THE�ASSIGN�AND�IF�NECESSARY�THE�ALLOCATEŠJSR„(A6)�GO�DO�IT+ŠBEQ.S‚SPL85ŽNO�ERROR�-�CONTINUE�-�062184�41 HˆLEA�FHSPB-DATASG(A4),A0�A0�POINTS�TO�CORRECT�PARAMETER�BLOCK�-�062184�4*ŠBRA„SPL60ŽOUTPUT�ERROR�MESSAGE�-�062184�44SPL85…CMP.B‚#FSTANNM,FMSTAT(A0)�NEW�FILE?�-�062184�4*ŠBNE.S‚SPL120�BRANCH�IF�NOT�NEW,SEE�IF�OLD*-*‚HERE�IF�JUST�CREATED�THE�SPOOLER�QUEUE�FILE0*‚RESERVED�RECORDS�0-9�FOR�DEVICE,FORMS�ID�TABLE*/SPL90…LEA„QBUF-DATASG(A4),A1�GET�BUFFER�ADDRESS$ŠMOVE.L�#QLNG/2,D1‰#�WORDS�IN�BUFFER#SPL100„CLR.W‚(A1)+ŽCLEAR�THE�BUFFER"ŠSUB.L‚#1,D1ŽDECREMENT�THE�COUNTER ŠBNE.S‚SPL100�BRANCH�TIL�CLEARED.ŠLEA„QBUF-DATASG(A4),A1�RESTORE�BUFFER�ADDRESS)ŠCLR.L‚D7‘START�INSERT�AT�1ST�FILE�RECORDŠMOVE.L�D7,D1ŽCOUNTERHSPL110„LEA„INSRTREC-SPLEVNT(A3),A6�INSERT�A�CLEARED�RECORD�TO�QUEUE�FILEŠJSR„(A6)�GO�DO�ITŠTST„D7‘GOOD�INSERT?ŠBNE„SPL60ŽERROR�RETURN,ŠADD.L‚#1,D1ŽINCREMENT�TO�NEXT�RECORD�NUMBER*ŠMOVE.L�D1,D7ŽNEXT�RECORD�NUMBER�TO�INSERT$ŠCMP.L‚#10,D1�INSERT�ALL�10�RECORDS?-ŠBLT„SPL110�BRANCH�TIL�10�RECORDS�IN�THE�FILE)ŠBRA.S‚SPL130�GO�SEE�IF�ANYTHING�TO�START*SPL120„CMP.B‚#FSTADNM,FMSTAT(A0)�OLD�FILE?(ŠBNE„SPL60ŽSOME�OTHER�ERROR-CANNOT�SPOOL:ŠTST.L‚FMSREC(A0)‰ANY�RECORDS�IN�THE�FILE?�(-1=NO�RECORDS)-ŠBMI.S‚SPL90ŽBRANCH�IF�NO�RECORDS�IN�THE�FILE*?* SEE IF ANYTHING WAS BEING OUTPUT THAT HAS TO BE STARTED AGAIN*)SPL130„MOVE.L�#-1,D7�LOOK�FOR�ALL�ENTRIESŠCLR.L‚D6‘ANY�DEVICEŠCLR.L‚D5‘ANY�FORMS�ID1ŠMOVE.L�CURREC-DATASG(A4),D4�START�AT�TOP�OF�FILE:ŠLEA„FNDENTRY-SPLEVNT(A3),A6�GO�LOOK�FOR�AN�ENTRY�TO�STARTŠJSR„(A6)�GO�DO�ITŠTST„D7‘FOUND�ONE?6ŠBMI.S‚SPL140�BRANCH�IF�DIDN'T�FIND�ONE�TO�START�AGAIN)ŠLEA„QSTAT(A1),A5‡GET�STATUS�BYTE�ADDRESSŠBTSTƒ#QSTATCAN,(A5)…TO�CANCEL?ŠBEQ.S‚SPL131�BRANCH�IF�NO3ŠLEA„DELENTRY-SPLEVNT(A3),A6�DELETE�THE�QUEUE�ENTRYŠJSR„(A6)�GO�DO�IT+ŠLEA„DELFILE-SPLEVNT(A3),A6�DELETE�THE�FILEŠJSR„(A6)�GO�DO�ITŠBRA„SPL130�GO�GET�NEXT�ENTRY(SPL131„BTSTƒ#QSTATOUT,(A5)…BEING�OUTPUT?ŠBNE.S‚SPL134�BRANCH�IF�NO'SPL132„CLR.B‚(A5)�CLEAR�THE�STATUS�FLAG3SPL133„BSETƒ#QSTATRDY,(A5)…MAKE�IT�READY�FOR�OUTPUT<ŠLEA„RPLREC-SPLEVNT(A3),A6�PUT�UPDATED�RECORD�BACK�INTO�FILEŠJSR„(A6)�GO�DO�ITŠBRA„SPL130�GET�NEXT�RECORD"SPL134„BTSTƒ#QSTATACT,(A5)…ACTIVE?ŠBEQ.S‚SPL132�BRANCH�IF�NO!ŠCLR.B‚(A5)�CLEAR�THE�STATUS�FLAG ŠCLR.L‚QSIZE(A1)ŠFORCE�ZERO�SIZEŠCLR.L‚D7‘CLEAR�FOR�USE+ŠLEA„MTCDF-SPLEVNT(A3),A6�GO�SET�FORMS�BITSŠJSR„(A6)�GO�DO�IT'ŠBRA„SPL133�GO�MAKE�IT�READY�FOR�OUTPUT>SPL140„MOVE.L�#-1,CURREC-DATASG(A4)�SET�POINTER�TO�TOP�OF�FILE ŠCLR.L‚D1‘START�RECORD�#�TO�READ6P05‡LEA„RDRES-SPLEVNT(A3),A6�GO�READ�A�RESERVED�RECORDŠJSR„(A6)�GO�DO�ITŠBNE„SPL60ŽERROR�RETURN%ŠMOVE.L�#RREC,D2‹#�ENTRIES�PER�RECORD,P10‡MOVE.L�RDEV(A2),D3ˆGET�DEVICE(TASK)�NAMEŠTST.L‚D3‘ANY�THERE?)ŠBEQ.S‚SPL150�BRANCH�IF�NO,DONE�WITH�THISŠMOVE.L�#4,D4ŽCOUNTER�FOR�TERMT3P20‡LEA„FHSPB-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS%ŠMOVE.L�#TERMT,D0ŠTERMINATE�THIS�TASKŠMOVE.L�D3,(A0)ŒTASK�TO�TERM#ŠMOVE.L�#MYSES,4(A0)‡SESSION�NUMBERŠTRAPƒ#1‘DO�ITŠBEQ.S‚P30�TERMT�TOOK ŠCMP.B‚#3,D0ŽTASK�DOESN'T�EXIST?"ŠBEQ.S‚P40�BRANCH�IF�DOESN'T�EXISTŠCMP.B‚#6,D0ŽBEING�TERMED?%ŠBNE„SPL60ŽBRANCH�IF�SOME�OTHER�ERROR&P30‡SUB.L‚#1,D4ŽDECREMENT�TERM�COUNTER'ŠBGT.S‚P35�BRANCH�IF�GOING�TO�TRY�AGAIN1ŠLEA„IOSPB-DATASG(A4),A0�SET�UP�FOR�ERROR�MESSAGE'ŠLEA„ERRM3(PC),A1‡ERROR�MESSAGE�ADDRESS(ŠMOVE.L�D3,(A1)ŒTASK�NAME�TO�THE�MESSAGE.ŠMOVE.L�A1,IOSSAD(A0)†START�ADDRESS�OF�MESSAGEŠLEA„ERRM3E(PC),A1†END�ADDRESS,ŠMOVE.L�A1,IOSEAD(A0)†END�ADDRESS�OF�MESSAGE'ŠBRA„SPL69ŽOUTPUT�MESSAGE�AND�TERM�SELF%P35‡MOVE.L�#RELINQ,D0‰REL.�FOR�AWHILEŠTRAPƒ#1‘DO�ITŠBRA„P20�TERM�TIL�TASK�IS�GONE&P40‡SUB.L‚#1,D2ŽDECREMENT�#�OF�ENTRIES#ŠBEQ.S‚P50�BRANCH�IF�MUST�READ�NEXT#ŠADD.L‚#RLNG,A2‹POINT�TO�NEXT�ENTRYŠBRA„P10�CHECK�NEXT�ENTRY#P50‡ADD.L‚#1,D1ŽBUMP�TO�NEXT�RECORDŠCMP.L‚#8,D1ŽDONE?ŠBLE„P05�BRANCH�IF�NOT�DONESPL150„CLR.L‚D7‘CLEAR�FOR�USE8ŠMOVE.B�#QSTATRDY,D7‡NOW�LOOK�FOR�A�'NEW'�FILE�TO�OUTPUTŠCLR.L‚D6‘ANY�DEVICEŠCLR.L‚D5‘ANY�FORMS�ID1ŠMOVE.L�CURREC-DATASG(A4),D4�START�AT�TOP�OF�FILE6ŠLEA„FNDENTRY-SPLEVNT(A3),A6�GO�LOOK�FOR�A�READY1 �ENTRYŠJSR„(A6)�GO�DO�ITŠTST„D7‘FOUND�ONE?ŠBMI.S‚SPL155�BRANCH�IF�NO9ŠLEA„STRTSPL-SPLEVNT(A3),A6�GO�START�THIS�FILE�FOR�OUTPUTŠJSR„(A6)�GO�DO�IT.ŠBRA„SPL150�GO�LOOK�FOR�ANOTHER�ENTRY�TO�START**‚CLOSE�LUN�5�AND�6*6SPL155„LEA„FHSPB-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS(ŠMOVE.W�#FHCLOS,FHSCMD(A0)�CLOSE�COMMAND'ŠMOVE.B�#CDFLUN,FHSLUN(A0)�LUN�TO�CLOSEŠTRAPƒ#3‘DO�ITŠBNE.S‚SPL60ŽERROR�RETURN ŠMOVE.B�#LDFLUN,FHSLUN(A0)�LUN�6ŠTRAPƒ#3‘CLOSE�ITŠBNE.S‚SPL60ŽERROR�RETURN*!* SEND TERMINATION MESSAGE TO SCT*0ŠLEA„FHSPB-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS5ŠMOVE.L�SPLQN-DATASG(A4),(A0)+�TASK�NAME�TO�THE�EVENT(ŠMOVE.L�SPLQN+4-DATASG(A4),(A0)+�SESSIONŠCLR.W‚(A0)+ŽNO�OPTIONS%ŠLEA„QEVT-DATASG(A4),A1�EVENT�ADDRESSŠMOVE.L�A1,(A0)+‹EVENT�ADDRESSŠCLR.L‚(A0)�NO�SERVICE�VECTORŠMOVE.L�A1,A0ŽGET�EVENT�ADDRESSŠMOVE.B�#24,(A0)+ŠEVENT�LENGTHŠMOVE.B�#5,(A0)+‹EVENT�CODE!ŠMOVE.L�#SPLID,(A0)+‡MY�TASK�NAMEŠMOVE.L�#MYSES,(A0)+‡SESSIONŠCLR.L‚(A0)+ŽTASKŠCLR.L‚(A0)+ŽSESSION1ŠMOVE.B�#1,(A0)+‹NO�ABORT�CODE-NORMAL�TERMINATION0ŠLEA„FHSPB-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS'ŠMOVE.L�#QEVNT,D0ŠQUEUE�EVENT�DIRECTIVE(ŠTRAPƒ#1‘MAKE�THE�MONITOR�THINK�I'M�GONE(ŠBNE.S‚SPL60ŽBRANCH�IF�AN�ERROR�RETURNEDAŠLEA„SPL160-SPLEVNT(A3),A6�GOOD�RETURN,GO�DEALLOCATE�THIS�SEGMENTŠJMP„(A6)�GO�DO�IT**‚ERROR�TERMINATION�HERE*0SPL60…LEA„SCRATCH-DATASG(A4),A1�USE�SCRATCH�AREA/ŠMOVEM.L�D0/A0,EM_D0(A1)ƒSAVE�THESE�2�REGISTERS.ŠMOVE.L�A1,A0ŽADDRESS�FOR�ERROR�MESAGE�HANDLERŠCLR.B‚EM_OPT(A0)‰NO�OPTIONSŠMOVE.B�#LDFLUN,EM_TLUN(A0)�LUNŠCLR.B‚EM_QRC(A0)‰NO�QUERYŠCLR.L‚EM_SPA(A0)‰NO�USER�TEXTŠCLR.L‚EM_EPA(A0)‰NO�USER�TEXT(ŠMOVE.L�#2,D0ŽCALL�ERROR�MESSAGE�HANDLERŠTRAPƒ#4‘DO�ITŠBRA.S‚SPL70ŽERROR�RETURN)SPL69…SIOSCO�IOWRIT,IOPASC,A0ƒWRITE�ASCIIŠMOVE.B�#LDFLUN,IOSLUN(A0)�LUN'ŠTRAPƒ#2‘OUTPUT�THE�MESSAGE-NO�SPOOLINGDSPL70…MOVE.W�#$C000,TERM_FLG-DATASG(A4)�ERROR�TERMINATION�-�062084�4ŠBRA„TERMINAT‹062184�4ERRM2…DC.Bƒ'MUST�BE�USER�0'ERRM2E„EQU„*-13ERRM3…DC.Bƒ'…NOT�TERMINATED-SPOOLING�NOT�INITIATED'ERRM3E„EQU„*-1GTADRPBƒDC.Lƒ0,0�TASK,SESSION4ŠDC.Wƒ$2000,0ŒRETURN�LOGICAL�ADDRESS�IN�A0,NO�BUFFERŠDC.Lƒ'SPLD',0,0,0‡SEGMENT�NAMEGTADRPB1‚DC.Lƒ0,0�TASK,SESSION4ŠDC.Wƒ$2000,0ŒRETURN�LOGICAL�ADDRESS�IN�A0,NO�BUFFERŠDC.Lƒ'SPLP',0,0,0‡SEGMENT�NAMEŠPAGE*5*‚GTINPT‚GET�INPUT�SUBROUTINE,PARSE�THE�INPUT�AND�PUT*ŠINTO�THE�PARAMETER�BLOCK*‚ENTRY:D6=INPUT�LENGTH *ˆQEVT=INPUT* EXIT:D0=-1=ERROR RETURN#*†D0=0=GOOD�RETURN,A0=FHSPB�ADDRESS*‚USES:0�1�2�3�4�5�6�7 *…D�R�*�*‡* *…A�R�*�*** GTINPT„EQU„*?ŠLEA„FHSPB-DATASG(A4),A0�GET�PARAMETER�BLOCK�ADDRESS�FOR�OUTPUT+ŠMOVE.L�#4,D2Ž#�CHARS�TO�MOVE�TO�PARA�BLOCK%ŠLEA„QEVT-DATASG(A4),A1�INPUT�ADDRESS!ŠLEA„FHSVOL(A0),A2†OUTPUT�ADDRESS+ŠMOVE.B�(A1)+,D1‹THIS�CHAR=1ST�CHAR�OF�NAME ŠCMP.B‚#CR,D1�A�CARRIAGE�RETURN?"ŠBEQ.S‚GTINERRŒBRANCH�IF�YES,ERROR%ŠCMP.B‚#'A',D1Œ1ST�CHAR�MUST�BE�ALPHAŠBLT.S‚GTINERRŒERROR�IF�ISN'TŠCMP.B‚#'Z',D1ŒSEE�IF�ALPHAŠBGT.S‚GTINERRŒERROR�IF�ISN'T-GTIN40„MOVE.B�D1,(A2)+‹GOOD�CHARACTER,SAVE�IT&ŠSUB.L‚#1,D2Ž#CHARS�REMAINING�FOR�NAME&ŠSUB.L‚#1,D6Ž#CHARS�REMAINING�IN�INPUT!ŠBLE.S‚GTIN50�BRANCH�IF�NONE�LEFTŠMOVE.B�(A1)+,D1‹GET�NEXT�CHARŠCMP.B‚#':',D1ŒSEE�IF�A�COLONŠBEQ.S‚GTIN80�BRANCH�IF�A�COLONŠCMP.B‚#CR,D1�SEE�IF�A�CR#ŠBNE.S‚GTIN40�BRANCH�IF�NOT,SAVE�IT$GTIN50„TST.L‚D2‘ALL�4�CHARACTERS�IN?ŠBNE.S‚GTIN70�BRANCH�IF�NO"GTIN60„CLR.L‚D0‘SET�TO�GOOD�RETURNŠRTS—RETURN�TO�CALLER>INERRƒMOVE.L�#-1,D0�SET�ERROR�RETURNŠRTS—RETURN�TO�CALLER>IN70„MOVE.B�#'�',(A2)+‰BLANK�TO�NAMEŠSUB.L‚#1,D2ŽDECREMENT�COUNT ŠBGT„GTIN70�BRANCH�IF�MORE�TO�DO$ŠBRA„GTIN60�GO�SEE�IF�END�AND�RETURN1GTIN80„SUB.L‚#1,D6ŽDECREMENT�NUMBER�OF�CHARS�LEFT!ŠBEQ„GTIN50�OK,NO�MORE�CHARACTERS#ŠMOVE.B�(A1)+,D1‹GET�NEXT�CHARACTER ŠCMP.B‚#CR,D1�A�CARRIAGE�RETURN?ŠBEQ„GTIN50�BRANCH�IF�YES,OK&ŠBRA„GTINERRŒERROR-TOO�MANY�CHARACTERS1**************************************************2*‰LISTH�-�PRINTS�HELP�MESSAGE�AND�EXITS�-�0621842 �4*1************************************************* LISTH…EQU„*,ŠLEA„HELPMSG-DATASG(A4),A2�START�OF�HELP�MSG0ŠLEA„HELPLEN-DATASG(A4),A1�TABLE�OF�LINE�LENGTHS,ŠLEA„IOSPB-DATASG(A4),A0�IOS�PARAMETER�BLOCK3PLINE…MOVE.L�A2,IOSSAD(A0)†STORE�LINE�START�ADDRESS#ŠADDA.W�(A1)+,A2‹ADD�LENGTH�OF�LINE$ŠMOVE.L�A2,IOSEAD(A0)†STORE�LINE�END.ŠIOSCALL�IOSPB-DATASG(A4)‚A0�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�LINE2ŠCLR.W‚TERM_FLG-DATASG(A4)�SET�CODE�FOR�NORMAL�ENDŠBRA„TERMINAT‹EXIT�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: ŠERQ.TERM�#0,TERM_FLG-DATASG(A4) *TERM_FLG:0*œWILL�CONTAIN�THE�APPROPRIATE�TERMINATION�VALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*ŠNOPŠEND„SPLééééééŠLIST ŠSECTION�8ŠOPT„FRS,MEX,NOCLŠXREFƒTIMECONV,ODATCONV,BDCONV**‚SPLEVNT‚ASR�FOR�MAIN�SPOOLER6*‚READS�THE�EVENT�AND�GOES�TO�A�SERVICE�AREA�DEPENDING1*‚ON�THE�EVENT�CODE.�THREE�EVENT�CODES�COME�HERE:*‚1)EVENT�CODE�3,SUB-CODE�7*„GET�BECAUSE�OF:+*„A)USER�DOES�AN�ASSIGN�TO�A�SPOOLER�DEVICE)*„B)USER�DOES�A�CLOSE�TO�A�SPOOLER�DEVICE7*„C)USER�DOES�A�RETREIVE�ATTRIBUTES�TO�A�SPPOLER�DEVICE*„D)CANCEL�COMMAND*„E)CONTINUE�COMMAND*„F)FORMS�COMMAND*„G)PRINT�COMMAND*„H)COPIES�COMMAND*„I)QUEUE�COMMAND*‚2)EVENT�CODE�328*„GET�BECAUSE�SUB-TASK�WHICH�IS�DOING�THE�ACTUAL�SPOOLER9*„OUTPUT�GOT�AN�I/O�ERROR-EITHER�FROM�READING�THE�SPOOLER'*„FILE�OR�WRITING�TO�THE�SPOOLER�DEVICE*‚3)EVENT�CODE�5"*„GET�WHEN�THE�SUB-TASK�TERMINAT2 ES*.*‚EXIT�TO�EVENT�3,SUB-CODE�7�COMMAND�ROUTINES:*‚A4=BASE�ADDRESS�REGISTER*‚A5=EVENT�ADDRESS)*‚A6=REQUESTOR'S�PARAAMETER�BLOCK�ADDRESS*‚D0=EVENT�LENGTH*** SPLEVNTƒEQU„*ŠNOPŠNOP*£FOR�DIAGNOSTIC�PURPOSES&ŠMOVE.L�#RDEVNT,D0‰READ�THE�EVENT�CODE-ŠLEA„QEVT-DATASG(A4),A0�ADDRESS�FOR�THE�EVENTŠTRAPƒ#1‘READ�THIS�EVENT!ŠBNE„SPLRTN�ERROR�RETURN-NO�EVENT)ŠMOVE.L�A0,A5ŽUSE�A5�AS�THE�EVENT�POINTER 2ŠMOVE.B�EVLENG(A5),D0†GET�THE�LENGTH�OF�THIS�EVENT$ŠMOVE.B�EVCODE(A5),D1†GET�EVENT�CODEŠCMP.B‚#3,D1ŽEVENT�3?!ŠBNE„SPLE30�BRANCH�IF�NOT�EVENT�3-ŠMOVE.B�EVTKOD(A5),D1†IS�EVENT�3,GET�SUB-CODE(ŠCMP.B‚#7,D1ŽMUST�BE�A�7�FOR�THE�SPOOLER*ŠBNE„SPLRTN�BRANCH�IF�NOT�SUB-CODE�7,ERROR&ŠCMP.B‚#ENTRYLNG,D0‡CHECK�EVENT�LENGTH%ŠBEQ.S‚SPLE05�BRANCH�IF�A�GOOD�LENGTH(ŠMOVE.L�#FSTAIE,D0‰SET�TO�INTERNAL�ERRORŠLEA„EVTLEN(A5),A6†IOCB�ADDRESS4ŠMOVE.L�D0,EVTRD0(A5)†ERROR�TO�EVENT�PARAMETER�BLOCK-ŠMOVE.B�D0,FHSSTA(A6)†TO�PARAMETER�BLOCK�ALSOŠBRA„SPLRTN�GO�RETURNSPLE05: O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,*‰Replace�the�TCB�address�with�the�task�name*%ŠMOVE.L�EVTTSK(A5),PBTSKID-DATASG(A4)%ŠMOVE.L�EVTSES(A5),PBTSKNM-DATASG(A4)-*£MOVE�TASK�ID�AND�SESSION�TO�PARAMETER�BLOCK>EBN:V5^@f4n6v9~<†<Ž9–:ž7¦5®6¶8¾4Æ:Î9Ö<Þ7æ=î<ö:þ86;;M&C.: ŠBSR„GTTNAME*£GET�TASK�NAME%ŠMOVE.L�PBTSKID-DATASG(A4),EVTTSK(A5),*£REPLACE�THE�TCB�ADDRESS�WITH�THE�TASK�NAME*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ŠLEA„EVTLEN(A5),A6†IOCB�ADDRESSŠCLR.L‚D1‘CLEAR�FOR�USE#ŠMOVE.W�(A6),D1ŒGET�SPOOLER�COMMAND3ŠLEA„CMDTBL-DATASG(A4),A2�GET�COMMAND�TABLE�ADDRESS8ŠLEA„CMDTBLE-DATASG(A4),A3�GET�COMMAND�TABLE�END�ADDRESS0SPLE10„CMP.W‚(A2),D1ŒLOOK�FOR�A�MATCHING�COMMAND5ŠBEQ„SPLE20�BRANCH�IF�THIS�IS�A�VALID�SPOOLER�COMMAND,ŠADD.L‚#CMDTBLEL,A2‡BUMP�TO�NEXT�TABLE�ENTRY'ŠCMP.L‚A3,A2ŽPAST�THE�END�OF�THE�TABLE?7ŠBLT„SPLE10�BRANCH�IF�NOT�PAST�END,MORE�TABLE�TO�SEARCH"ŠMOVE.L�#FSTAIF,D0‰INVALID�COMMAND* *‚UPDATE�IOCB*5SPLACK„MOVE.B�D0,FHSSTA(A6)†STATUS�TO�PARAMETER�BLOCKŠTST.L‚D0‘GOOD�RETURN?ŠBEQ.S‚SPLACK10‹BRANCH�IF�YESŠMOVE.L�D0,D1ŽGET�ERROR�CODEŠROL.L‚#8,D1ŽGET�UPPER�BYTEŠTST.B‚D1‘A�CODE�HERE?ŠBNE.S‚SPLACK10‹BRANCH�IF�YES'ŠADD.L‚#$18000000,D0†SET�FHS�ERROR�CODE=SPLACK10‚MOVE.L�D0,EVTRD0(A5)†STATUS�TO�EVENT�PARAMETER�BLOCK8ŠMOVE.L�EVTRA0(A5),A2†REQUESTORS�PARAMETER�BLOCK�ADDRESS)ŠADD.L‚#FHSSTA,A2‰POINT�TO�STATUS�ADDRESS)ŠLEA„FHSSTA(A6),A3†CURRENT�STATUS�ADDRESS5ŠLEA„FHSPB-DATASG(A4),A0�USE�THIS�FOR�ACK�THE�REQUESTŠMOVE.L�A0,A1ŽSAVE�THE�ADDRESS!ŠMOVE.L�#SPLID,(A1)+‡MY�TASK�NAMEŠMOVE.L�#MYSES,(A1)+‡SESSION(ŠMOVE.L�A3,(A1)+‹ADDRESS�OF�BYTE�TO�MOVE'ŠMOVE.L�EVTTSK(A5),(A1)+ƒRECEIVING�TASK ŠMOVE.L�EVTSES(A5),(A1)+ƒSESSIONŠMOVE.L�A2,(A1)+‹ADDRESSŠMOVE.L�#1,(A1)+‹LENGTH�OF�MOVE)ŠMOVE.L�#MOVELL,D0‰MOVE�LOGICAL�DIRECTIVEŠTRAPƒ#1‘DO�IT**‚ACKNOWLEDGE�THE�REQUEST*)SPLACK20‚MOVE.L�#AKRQST,D0‰ACK.�DIRECTIVE)ŠLEA„QBUF-DATASG(A4),A0�PARAMETER�ADDRESSŠMOVE.L�A0,A1ŽADDRESSŠMOVE.L�EVTTSK(A5),(A1)+ƒTASK ŠMOVE.L�EVTSES(A5),(A1)+ƒSESSIONŠMOVE.W�#$6800,(A1)+‡OPTIONSŠMOVE.B�EVTTIN(A5),(A1)+ƒTRAP�#%ŠTST.B‚FHSSTA(A6)‰GET�CONDITION�CODES'ŠSEQ„(A1)�SET�THE�CONDITION�CODES�IN�PB+ŠAND.B‚#$04,(A1)+‰SET�FOR�EITHER�=�OR�NOT�=ŠMOVE.L�EVTRD0(A5),(A1)+ƒD0ŠMOVE.L�EVTRA0(A5),(A1)+ƒA0ŠTRAPƒ#1‘DO�IT?SPLRTN„MOVEM.L�(A7)+,D0-D7/A0-A6�RESTORE�REGS,RETURN�FROM�EVENT(ŠRTR—RETURN�FROM�EVENT,RESTORE�SR�AND�PCSPLE20„CLR.L‚D0‘CLEAR�FOR�USE7ŠMOVE.W�2(A2),D0‹GET�THE�COMMAND�ROUTINE�ADDRESS�OFFSETŠLSL.L‚#2,D0ŽMULIPLY�BY�4/ŠLEA„BRATBL(PC),A2†ROUTINE�BRANCH�TABLE�ADDRESSŠADD.L‚D0,A2ŽROUTINE�TO�GO�TO!ŠJMP„(A2)�GO�PROCESS�THIS�COMMANDSPLE30„CLR.L‚D7‘CLEAR�FOR�USE4ŠCMP.B‚#SUBTECDE,D1‡IS�EVENT�FROM�SUB-TASK?(CODE�32)ŠBNE.S‚SPLE40�BRANCH�IF�NO*<*‚3 HERE�IF�EVENT�CODE�32-SUBTASK�SENDING�AN�I/O�ERROR�MESSAGE6*‚FIND�THE�MATCHING�ENTRY�IN�THE�SPOOLER�QUEUE�AND�SET*‚IT�TO�WAITING�FOR�CONTINUE*3ŠMOVE.B�#QSTATOUT,D7‡LOOK�FOR�AN�ENTRY�BEING�OUTPUT"ŠMOVE.L�IOERNAM(A5),D6…DEVICE�NAME ŠCLR.L‚D5‘DON'T�CARE�ABOUT�FORMS$ŠMOVE.L�#-1,D4�START�AT�TOP�OF�QUEUE(ŠBSR„FNDENTRY‹GO�FIND�THE�MATCHING�ENTRYŠTST„D7‘FOUND�IT?+ŠBMI„SPLRTN�BRANCH�IF�DIDN'T�FIND�THE�ENTRY/ŠBSETƒ#QSTATIOE,QSTAT(A1)�TURN�ON�THE�WAIT�FLAG1ŠMOVE.B�IOERD0+3(A5),QLUN(A1)�SAVE�THE�ERROR�CODE,ŠBSR„RPLREC�GO�PUT�ENTRY�BACK�INTO�THE�QUEUE"ŠBRA„SPLRTN�RETURN�FROM�THIS�EVENT-SPLE40„CMP.B‚#5,D1ŽSUB-TASK�TERMINATED�EVENT?ŠBNE„SPLRTN�BRANCH�IF�NO*,*‚HERE�IF�EVENT�CODE�5�-�SUB-TASK�TERMINATED*8ŠMOVE.B�#QSTATOUT,D7‡LOOK�FOR�A�QUEUE�ENTRY�BEING�OUTPUT!ŠMOVE.L�EVQTSK(A5),D6†DEVICE�NAME ŠCLR.L‚D5‘DON'T�CARE�ABOUT�FORMS*ŠMOVE.L�#-1,D4�START�SEARCH�AT�TOP�OF�FILE(ŠBSR„FNDENTRY‹GO�FIND�THE�MATCHING�ENTRYŠTST„D7‘FOUND�IT?-ŠBMI.S‚SPLE80�BRANCH�IF�DIDN'T�FIND�THE�ENTRY.SPLE43„MOVE.W�22(A5),D0ŠGET�TERMINATION�REASON(ŠBEQ.S‚SPLE70�BRANCH�IF�GOOD�TERMINATION*5*‚HERE�IF�SUB-TASK�TERMINATED�BUT�FILE�WAS�NOT�OUTPUT*7SPLE45„BSR„DELENTRY‹WAS�WAITING�FOR�CANCEL,GO�DELETE�IT)ŠBSR„DELFILEŒDELETE�THE�SPOOLER�FILE�ALSO,ŠBRA.S‚SPLE60�GO�GET�THE�NEXT�ENTRY�TO�START;SPLE50„BSETƒ#QSTATRDY,QSTAT(A1)�WASN'T�OUTPUT,MAKE�IT�READY,ŠBCLRƒ#QSTATOUT,QSTAT(A1)�CLEAR�BEING�OUTPUT+ŠBSR„RPLREC�GO�PUT�ENTRY�BACK�INTO�THE�FILE&SPLE60„BSR„STRTNXTŒGO�START�SOME�ENTRY#SPLE65„BRA„SPLRTN�RETURN�FROM�EVENT*5* HERE IF GOOD SUB-TASK TERMINATION - FILE WAS OUTPUT*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L�#5,A0ŽENABLE�THE�ASQ*MOVE.L #7,A0 ENABLE THE ASQO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DO�IT2SPLWAITƒMOVE.L�#WTEVNT,D0‰WAIT�FOR�EVENT�DIRECTIVEŠTRAPƒ#1‘DO�IT$ŠBRA„SPLWAITŒSPOOLER�IS�EVENT�DRIVEN*#*ˆBRANCH�TABLE�FOR�COMMAND�ROUTINES* BRATBL„EQU„*ŠBRA„ASGSPL�ASSIGNŠBRA„CLOSPL�CLOSEŠBRA„CANCSPLŒCANCELŠBRA„CONTSPLŒCONTINUEŠBRA„FORMSPLŒFORMS�IDŠBRA„PRNTSPLŒPRINT/STARTŠBRA„COPYSPLŒCOPIESŠBRA„QUESPL�QUEUE ŠBRA„ATTRSPLŒRETREIVE�ATTRIBUTESŠPAGEB*‚ASGSPL‚AN�ASSIGN�TO�A�SPOOLER�DEVICE�WAS�ISSUED�BY�THE�REQUESTOR,*ŠMUST:A)�ALLOCATE�AND�ASSIGN�A�SPOOLER�FILE"*’WITH�PUBLIC�READ,EXCLUSIVE�WRITE*�B)BUILD�A�SPOOLER�QUEUE�ENTRY%*�C)CHANGE�LU�ASSIGNMENT�TO�REQUESTOR!*�D)UPDATE�REQUESTORS�IOCB-STATUS*�E)ACKNOWLEDGE�REQUEST*�F)RETURN�FROM�EVENT*‚ENTRY:D0=EVENT�LENGTH*ˆA4=BASE�ADDRESS�REGISTER*ˆA5=EVENT�ADDRESS*ˆA6=REQUESTORS�PARAMETER�BLOCK*‚EXIT:RETURN�FROM�EVENT(*‚CALLS:GTJOBN„INSRTRECƒDELENTRY„DELFILE** ASGSPL„EQU„*0ŠLEA„QBUF-DATASG(A4),A1�GET�QUEUE�BUFFER�ADDRESS,ŠMOVE.L�#QLNG/2,D0‰LENGTH�OF�BUFFER�IN�WORDS0ASGSPL10‚CLR.W‚(A1)+ŽCLEAR�OUT�THE�CURRENT�ENTRYŠSUB.L‚#1,D0ŽDECREMENT�COUNT"ŠBNE.S‚ASGSPL10‹BRANCH�TIL�CLEARED.ŠLEA„QBUF-DATASG(A4),A1�RESTORE�BUFFER�ADDRESS,ŠLEA„FHSPB-DATASG(A4),A0�FHS�PARAMETER�BLOCKG‰SFHSCO�FHALLO+FHASGN,FOPPRPW+FOPSEQ,A0�ALLOCATE�&�ASSIGN�PUBLIC�RW,SEQŠMOVE.B�#2,FHSLUN(A0)†USE�LUN�2/ŠMOVE.B�FHSLUN(A6),QLUN(A1)�SAVE3 �REQUESTORS�LUNŠMOVE.L�#BLANK,D0ŠBLANKS4ŠMOVE.L�#6,D1ŽCOUNTER�FOR�MOVEING�FILENAME�TO�BUFFER+ŠLEA„FHSVOL(A0),A3†START�MOVING�FROM�VOLUME/ASGSPL12‚MOVE.L�D0,(A3)+‹BLANKS�TO�THE�FILENAMEŠSUB.L‚#1,D1ŽDECREMENT�COUNTER%ŠBNE.S‚ASGSPL12‹BRANCH�TIL�ALL�BLANKS)ŠMOVE.W�EVTUNM(A5),FHSUSN(A0)�USER�NUMBER7ŠMOVE.B�#SPOOLF,FHSFIL(A0)�1ST�CHAR�OF�SPOOLER�FILENAME2ŠMOVE.W�#$0000,FHSWCD(A0)‚PUBLIC�READ,PUBLIC�WRITE)ŠCLR.W‚FHSLRL(A0)‰VARIABLE�LENGTH�RECORDS5ŠCLR.L‚FHSSIZ(A0)‰CLEAR�SIZE�FIELD,USING�THE�DEFAULTS%ŠMOVE.L�FHSVOL(A6),QDEVICE(A1)�DEVICE%ŠMOVE.L�FHSCLG(A6),D0†GET�FORMS�FIELD-ŠCMP.L‚#BLANK,D0ŠBLANKS�FOR�STANDARD�FORM�ID?**ˆSEE�IF�PRINTABLE�FORMS�ID*ŠMOVE.L�#4,D1ŽCOUNTERŠMOVE.L�D0,D3ŽFORMS�IDASGSPL13‚ROL.L‚#8,D3ŽGET�A�BYTEŠCMP.B‚#$21,D3ŒPRINTABLE?4ŠBLT.S‚ASGSPL14‹BRANCH�IF�NO,FORCE�STANDARD�FORMS�IDŠCMP.B‚#$7E,D3ŒPRINTABLE?4ŠBGT.S‚ASGSPL14‹BRANCH�IF�NO,FORCE�STANDARD�FORMS�IDŠSUB.L‚#1,D1ŽDECREMENT�COUNTER+ŠBNE„ASGSPL13‹BRANCH�IF�MORE�BYTES�TO�CHECKŠBRA.S‚ASGSPL15‹GOOD�FORMS�ID2ASGSPL14‚MOVE.L�#'STND',D0‰FORCE�STANDARD�FORMS�ID&ASGSPL15‚MOVE.L�D0,QFORMS(A1)†FORMS�ID'ŠMOVE.L�EVTTSK(A5),QTASKN(A1)�TASK�NAME$ŠMOVE.L�EVTSES(A5),QSESS(A1)�SESSION$ŠMOVE.B�EVTPRI(A5),QPRI(A1)�PRIORITY:ŠCLR.L‚QSIZE(A1)ŠCLEAR�SIZE�FIELD,WON'T�GET�IT�UNTIL�CLOSEŠCLR.B‚QSTAT(A1)ŠCLEAR�STATUS"ŠMOVE.B�#1,QCOPYS(A1)†FORCE�1�COPYŠMOVE.L�A0,A3ŽSAVE�A0)ŠMOVE.L�#GTDTIM,D0‰GET�DATE�AND�TIME�CODEAŠLEA„SCRATCH-DATASG(A4),A0�USE�SCRATCH�FOR�RETURNED�DATE�AND�TIMEŠTRAPƒ#1‘GET�THE�DATE�AND�TIME"ŠBNE„SPLACK�ERROR�RETURN,D0�IS�SET!ŠMOVE.L�(A0)+,QDATE(A1)„SAVE�DATE ŠMOVE.L�(A0),QTIME(A1)…SAVE�TIMEŠMOVE.L�A3,A0ŽRESTORE�A0ŠTRAPƒ#3‘CREATE�THIS�FILE)ŠBNE„ASGSPL20‹BRANCH�IF�AN�ERROR�RETURNEDCŠLEA„FHSVOL(A0),A2�GET�START�ADDRESS�OF�RETURNED�QUALIFIED�FILENAME,ŠLEA„QVOL(A1),A3ˆGET�START�ADDRESS�IN�ENTRYE*ŠMOVE.L�#6,D0ŽNUMBER�OF�LONG�WORDS�TO�MOVE>ASGSPL17‚MOVE.L�(A2)+,(A3)+ˆSAVE�FILENAME�STUFF�IN�QUEUE�ENTRYŠSUB.L‚#1,D0ŽDECREMENT�COUNTER ŠBNE.S‚ASGSPL17‹BRANCH�TIL�MOVED*)*‚SPOOLER�FILE�CREATED�-�DETERMINE�JOB�ID*ŠMOVE.L�A0,-(A7)‹SAVE�A0ŠBSR„GTJOBN�GO�GET�JOB�NUMBERŠMOVE.L�(A7)+,A0‹RESTORE�A0ŠTST.L‚D7‘CHECK�RETURNŠBNE„ASGSPL40‹ERROR�RETURN3ŠMOVE.W�QUSERN(A1),QJOBID(A1)�USER�NUMBER�TO�JOB�ID+ŠMOVE.W�D6,QJOBID+2(A1)„OCCURANCE�TO�JOB�ID0ŠMOVE.L�#10,D7�INSERT�QUEUE�ENTRY�AT�TOP�OF�FILE'ŠBSETƒ#QSTATACT,QSTAT(A1)�STATUS=ACTIVE*-*ˆGET�THE�LOGGED�ON�USER�NUMBER�FOR�THE�JOBID*:ŠCMP.L‚#0,A4ŒARE�WE�RUNNING�IN�ERORmacs?(A4=0�IF�EXORmacs)>ŠBNE.S‚ASGSPL19ˆBRANCH�IS�NO�MMU,FORGET�AABOUT�ANT�USER�NUMBERŠTST.W‚QJOBID(A1)‰USER�0?8ŠBNE.S‚ASGSPL19‹BRANCH�IF�NO,USE�THE�USER�NUMBER�WE�HAVE(ŠBSR„GTUSER�GO�GET�LOGGED�ON�USER�NUMBER ASGSPL19‚MOVE.L�A0,-(A7)‹SAVE�A03ŠBSR„INSRTREC‹GO�PUT�THIS�ENTRY�INTO�THE�QUEUE�FILE<ŠMOVE.L�FMSREC(A0),CURREC-DATASG(A4)�SAVE�THIS�RECORD�NUMBERŠMOVE.L�(A7)+,A0‹RESTORE�A0ŠTST„D7‘GOOD�INSERT?8ŠBNE.S‚ASGSPL40‹BRANCH�IF�NOT�GOOD-GO�DELETE�OUTPUT�FILE*(* CHANGE LU ASSIGNMENT BACK TO REQUESTOR"*�LUA�=#2‚LUB=QLUN(A1)�SEND�OPTION*0ŠLEA„FHSPB-DATASG(A4),A0�USE�FHS�PARAMETER�BLOCK/ŠMOVE.W�#FHCHLU,FHSCMD(A0)�CHANGE�LU�ASSIGNMENT ŠMOVE.B�#2,FHSLUA(A0)†LUN�A�=�#2*ŠMOVE.B�QLUN(A1),FHSLUB(A0)�REQUESTORS�LUN2ŠMOVE.L�EVTTSK(A5),FHSTSK(A0)�REQUESTORS�TASK�NAME0ŠMOVE.L�EVTSES(A5),FHSSES(A0)�REQUESTORS�SESSION&ŠMOVE.W�#FOPSLU,FHSOPT(A0)�SEND�OPTIONŠTRAPƒ#3‘DO�IT'ŠBEQ.S‚ASGSPL20‹BRANCH�IF�A�GOOD�RETURNŠMOVE.L�D0,D7ŽSAVE�ERROR�CODE#ŠBSR„DELENTRY‹GO�DELETE�QUEUE�ENTRY)ŠMOVE.B�#2,FHSLUN(A0)†LUN�FOR�FILE�DELETE#ŠBRA.S‚ASGSPL40‹GO�DELETE�THIS�FILE**‚RETURN�FROM�EVENT�HERE*%ASGSPL20‚BRA„SPLACK�RETURN�FROM�EVENT*)*‚ERROR�HANDLING�HERE-DELETE�SPOOLER�FILE*;ASGSPL40‚MOVE.W�#FHCLOS,FHSCMD(A0)�GO�CLOSE�THE�OUTPUT�FILEŠTRAPƒ#3‘DO�IT#ŠBSR„DELFILEŒDELETE�THE�OUTPUT�FILE+ŠMOVE.L�D7,D0ŽRESTORE�ERROR�CODE�FOR�RETURN'ŠBRA„ASGSPL20‹GO�RETURN�FROM�THIS�EVENTŠPAGE=*‚CLOSPL‚CLOSE�COMMAND�RECEIVED�BY�FMS�FOR�THE�OUTPUT�SPOOLER-*ŠFILE�ASSIGNED�TO�THE�OUT4 PUT�SPOOLER�DEVICE.8*ŠREQUESTOR'S�PARAMETER�BLOCK�CONTAINS�SPOOLER�FILE�NAME,*ˆA)MAKE�SPOOLER�QUEUE�ENTRY�READY�TO�OUTPUT9*ŠDELETE�CURRENT�QUEUE�ENTRY�AND�REPOSITION�IT�FOR�OUTPUT,*ˆB)ASSIGN�AND�START�FILE�IF�DEVICE�NOT�BUSY*ˆC)ACKNOWLEDGE�REQUEST*ˆD)RETURN�FROM�EVENT*‚ENTRY:D0=EVENT�LENGTH*ˆA4=BASE�ADDRESS�REGISTER*ˆA5=EVENT�ADDRESS(*ˆA6=REQUESTOR'S�PARAMETER�BLOCK�ADDRESS*‚EXIT:RETURN�FROM�EVENT8*‚CALLS:FNDENTRY„DELENTRY„STPRIRPL„STRTNXT„MTCDFƒASFSIZE CLOSPL„EQU„*G‰MOVE.L�#-1,CURREC-DATASG(A4)�SEARCH�SPOOLER�QUEUE-START�AT�FIRST�ENTRY@CLOS10„MOVE.L�CURREC-DATASG(A4),D4�RECORD�NUMBER�TO�START�SEARCHŠCLR.L‚D5‘ANY�FORMS�IDŠCLR.L‚D6‘ANY�DEVICEŠCLR.L‚D7‘CLEAR�FOR�USE,ŠMOVE.B�#QSTATACT,D7‡LOOK�FOR�ACTIVE�ENTRIES%ŠBSR„FNDENTRY‹GO�FIND�AN�ACTIVE�ENTRYŠTST„D7‘FOUND�ONE?$ŠBMI.S‚CLOSER�BRANCH�IF�DIDN'T-ERROR"ŠMOVE.L�FHSFIL(A6),D0†GET�FILENAME#ŠCMP.L‚QFILEN(A1),D0†SAME�FILENAME?3ŠBNE„CLOS10�BRANCH�IF�NOT�THE�SAME,SEARCH�SOME�MORE,ŠMOVE.L�FHSFIL+4(A6),D0„GET�REST�OF�FILENAMEŠCMP.L‚QFILEN+4(A1),D0„SAME?"ŠBNE„CLOS10�BRANCH�IF�NOT�THE�SAME#ŠMOVE.W�FHSEXT(A6),D0†GET�EXTENSIONŠCMP.W‚QEXT(A1),D0ˆSAME?"ŠBNE„CLOS10�BRANCH�IF�NOT�THE�SAME*‚FOUND�CORRECT�QUEUE�ENTRY*+ŠCLR.B‚QLUN(A1)‹NOT�ASSIGNED�TO�ANY�LUN�NOWŠBSR„ASFSIZEŒGO�GET�FILE�SIZEŠBNE.S‚CLOS20�ERROR�RETURN.ŠBCLRƒ#QSTATACT,QSTAT(A1)�TURN�OFF�ACTIVE�FLAG0ŠBSETƒ#QSTATRDY,QSTAT(A1)�SET�TO�READY�TO�OUTPUT$ŠCLR.L‚D7‘SET�NOT�FROM�CONTINUE�FLAG:ŠBSR„MTCDFŠGO�SET�STATUS�BITS�FOR�MATCHING�DEVICE,FORMS�IDŠTST„D7‘GOOD�RETURN? ŠBMI.S‚CLOSER�BRANCH�IF�NO,ERROR=ŠBSR„DELENTRY‡GO�DELETE�THIS�ENTRY�FROM�IT'S�CURRENT�POSITIONŠTST„D7‘DELETED?)ŠBMI.S‚CLOS20�BRANCH�IF�NOT�DELETED,ERROR<ŠBSR„STPRIRPLˆGO�SET�OUTPUT�PRIORITY�AND�PUT�INTO�QUEUE�FILEŠTST„D7‘DID�IT? ŠBMI.S‚CLOS20�BRANCH�IF�NO,ERROR/ŠBSR„STRTNXTŒGO�START�OUTPUT�IF�DEVICE�NOT�BUSY ŠCLR.L‚D0‘SET�GOOD�RETURN�STATUS#CLOS20„BRA„SPLRTN�RETURN�FROM�EVENT9CLOSER„MOVE.L�#FSTANNM,D0ˆSET�NON-EXISTENT�FILENAME�ERROR ŠBRA„CLOS20�GO�RETURN�FROM�EVENTŠPAGE**‚CANCSPL‚CANCEL�A�SPOOLER�JOB(*‹CANCEL�COMES�FROM�A�USER�COMMAND�INPUT*‹INPUTS�AND�ACTIONS�ARE:*‹SPECIFYŽACTION*‹-------Ž------*‹JOBID�DELETE�THAT�JOB*‹FILENAME�DELETE�THAT�JOB5*‹USER�NUMBER�ONLY…DELETE�ALL�JOBS�WITH�THAT�USER�NO.C*‹**�FOR�USER�NUMBERƒDELETE�ALL�JOBS�IN�QUEUE�(PRIVELEGED)�062184�4*3*‹IF�A�JOB�IS�CURRENTLY�BEING�OUTPUT�OR�WAITING�FOR4*‹A�CONTINUE,SEND�THE�SUB-TASK�A�TERMINATION�MESSAGE7*‹EVENT�CODE�33,SET�QSTAT�TO�CANCEL.�THE�FILE�AND�QUEUE4*‹ENTRY�WILL�BE�DELETED�BY�THE�EVENT�HANDLER�AND�THE*‹NEXT�ENTRY�WILL�BE�STARTED.*3*‹USER�#0�MAY�CANCEL�ANY�JOB,USE�#X�MAY�CANCEL�ONLY*‹HIS�OWN�JOBS.*‚ENTRY:D0=EVENT�LENGTH*ˆA4=BASE�ADDRESS�REGISTER*ˆA5=EVENT�ADDRESS(*ˆA6=REQUESTOR'S�PARAMETER�BLOCK�ADDRESS*‚EXIT:RETURN�FROM�EVENT/*‚CALLS:FNDENTRY„DELENTRY„DELFILE„RPLREC„DOQEVT** CANCSPLƒEQU„*,ŠCLR.L‚D3‘CLEAR�COUNTER�FOR�MULTIPLE�DELETES&ŠCLR.L‚D5‘CLEAR�FIND�ANY�FORMS�ID�FLAG$ŠCLR.L‚D6‘CLEAR�FIND�ANY�DEVICE�FLAG.ŠMOVE.L�#-1,D4�SET�START�SEARCH�AT�TOP�OF�FILE&ŠMOVE.L�FHSSIZ(A6),D1†JOBID�SPECIFIED?ŠBNE.S‚CANC20�BRANCH�IF�YES)ŠMOVE.L�FHSFIL(A6),D1†FILENAME�SPECIFIED?ŠBNE.S‚CANC50�BRANCH�IF�YES,ŠMOVE.W�FHSUSN(A6),D1†USER�NUMBER�SPECIFIED?=ŠBRA„CANC80‡CANCEL�ALL�JOBS�FOR�USER�NUMBER�-�CORRECTS�SPR630*&* HERE IF INVALID CANCEL SPECIFICATION*)ŠMOVE.L�#FSTAIF,D0‰INVALID�COMMAND�STATUS+CANC10„TST„D3‘LOOKING�FOR�MULTIPLE�CANCELS?"ŠBNE„CANC90�BRANCH�IF�YES,MULTIPLE#CANC00„BRA„SPLACK�RETURN�FROM�EVENT*'*ˆHERE�IF�INVALID�USER�NUMBER�SPECIFIED*,CANC05„MOVE.L�#FSTAIU,D0‰INVALID�USER�NUMBERŠBRA„CANC00�GO�RETURN**‚HERE�IF�JOB�ID�SPECIFIED**CANC20„MOVE.L�#-1,D7�STATUS�DOESN'T�MATTER8ŠBSR„FNDENTRY‹GO�FIND�AN�ENTRY�IN�THE�SPOOLER�QUEUE�FILEŠTST„D7‘FOUND�ONE?*ŠBMI„CANCNE�BRANCH�IF�DIDN'T�FIND�AN�ENTRY7ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�CURRENT�RECORD�NUMBER ŠCMP.L‚QJOBID(A1),D1†SAME�JOBID?.ŠBNE„CANC20�BRANCH�IF�NOT�THE�SAME,SEARCH�MORE6CANC30„TST.W‚EVTUNM(A5)‰USER�NUMBER�0�REQUESTING�THI4 S?ŠBEQ.S‚CANC40�BRANCH�IF�YES%ŠMOVE.W�EVTUNM(A5),D1†GET�USER�NUMBER&ŠCMP.W‚QJOBID(A1),D1†SAME�USER�NUMBER?+ŠBNE„CANC05�BRANCH�IF�NOT�SAME�USER�#-ERROR** FOUND MATCH ENTRY*-CANC40„BTSTƒ#QSTATOUT,QSTAT(A1)�BEING�OUTPUT?ŠBNE.S‚CANC60�BRANCH�IF�YES1ŠBTSTƒ#QSTATIOE,QSTAT(A1)�WAITING�FOR�A�CONTINUE?ŠBNE.S‚CANC60�BRANCH�IF�YES%ŠBSR„DELENTRY‹DELETE�THIS�QUEUE�ENTRY?ŠSUB.L‚#1,D4‡DECREMENT�RECORD�NUMBER�IN�CASE�OF�MULTIPLE�SEARCHŠTST.L‚D7‘CHECK�RETURNŠBMI„CANC10�ERROR�RETURN%ŠBSR„DELFILEŒDELETE�THIS�SPOOLER�FILE+CANC45„BRA„CANC10�GO�RETURN�FROM�THIS�EVENT**‚HERE�IF�FILENAME�SPECIFIED*+CANC50„MOVE.L�#-1,D7�STATUS�DOES�NOT�MATTERŠBSR„FNDENTRY‹GO�FIND�AN�ENTRYŠTST„D7‘FOUND�ONE?'ŠBMI.S‚CANCNE�BRANCH�IF�DIDN'T�FIND�ONE4ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�THIS�RECORD�NUMBER"ŠMOVE.L�FHSFIL(A6),D1†GET�FILENAMEŠCMP.L‚QFILEN(A1),D1†SAME�?.ŠBNE„CANC50�BRANCH�IF�NOT�THE�SAME,SEARCH�MORE,ŠMOVE.L�FHSFIL+4(A6),D1„GET�REST�OF�FILENAMEŠCMP.L‚QFILEN+4(A1),D1„SAME?ŠBNE„CANC50�BRANCH�IF�NO#ŠMOVE.W�FHSEXT(A6),D1†GET�EXTENSIONŠCMP.W‚QEXT(A1),D1ˆSAME?"ŠBNE„CANC50�BRANCH�IF�NOT�THE�SAME)ŠCMP.B‚#SPOOLF,FHSFIL(A6)�A�SPOOLER�FILE?ŠBEQ„CANC30�BRANCH�IF�YES:ŠMOVE.L�FHSVOL(A6),D1†NON-SPOOLER-CHECK�VOLUME�AND�CATALOGŠCMP.L‚QVOL(A1),D1ˆSAME?ŠBNE„CANC50�BRANCH�IF�NO!ŠMOVE.L�FHSCLG(A6),D1†GET�CATALOGŠCMP.L‚QCATLG(A1),D1†SAME?ŠBNE„CANC50�BRANCH�IF�NO+ŠMOVE.L�FHSCLG+4(A6),D1„GET�REST�OF�CATALOGŠCMP.L‚QCATLG+4(A1),D1„SAME?ŠBNE„CANC50�BRANCH�IF�NO*ŠBRA„CANC30�A�MATCHING�ENTRY-GO�PROCESS�IT7CANCNE„MOVE.L�#FSTANNM,D0ˆFILENAME�DOESN'T�EXIST�STATUS ŠBRA„CANC45�GO�RETURN�FROM�EVENT*7* HERE IF FILE BEING OUTPUT NOW OR WAITING FOR CONTINUE8* SET CANCEL FLAG AND SEND TERMINATION EVENT TO SUB-TASK*/CANC60„BSETƒ#QSTATCAN,QSTAT(A1)�SET�CANCEL�FLAG9ŠBSR„RPLREC‹GO�PUT�UPDATED�ENTRY�BACK�INTO�THE�QUEUE�FILEŠBMI„CANC10�ERROR�RETURN!ŠMOVE.W�#-1,D7�SET�CANCEL�MESSAGE/ŠBSR„DOQEVT�GO�QUEUE�THIS�EVENT�TO�THE�SUB-TASKŠTST„D7‘GOOD�RETURN?#ŠBEQ„CANC10�BRANCH�IF�A�GOOD�RETURN%ŠMOVE.L�#FSTAIE,D0‰SET�INTERNAL�ERROR ŠBRA„CANC45�GO�RETURN�FROM�EVENT*8* HERE IF USER NUMBER SPECIFIED,DELETE ALL MATCH ENTRIES**CANC80„TST.W‚EVTUNM(A5)‰USER�0�DOING�THIS?ŠBEQ.S‚CANC90�BRANCH�IF�YES,OK&ŠCMP.W‚EVTUNM(A5),D1†SAME�USER�NUMBER?ŠBNE„CANC05�BRANCH�IF�NO,ERROR0CANC90„MOVE.L�#-1,D7�START�SEARCH�AT�TOP�OF�FILEŠBSR„FNDENTRY‹GO�FING�AN�ENTRYŠTST„D7‘FOUND�ONE?ŠBMI.S‚CANC100ŒBRANCH�IF�NO7ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�CURRENT�RECORD�NUMBER2ŠCMP.W‚#'**',D1‹CHECK�FOR�GLOBAL�CANCEL�-�062184�4(ŠBEQ.S‚CANC95�AUTOMATIC�MATCH�-�062184�4&ŠCMP.W‚QJOBID(A1),D1†SAME�USER�NUMBER?,ŠBNE„CANC90�BRANCH�IF�NO,GO�SEARCH�SOME�MORE)CANC95„ADD.L‚#1,D3ŽA�MATCH,UPDATE�COUNTER&ŠBRA„CANC40�GO�TAKE�CARE�OF�THIS�ENTRYCANC100ƒCLR.L‚D3‘CLEAR�COUNTER%ŠBRA„CANC45�GO�RETURN�FROM�THIS�EVENTŠPAGE*#*‚CONTSPL‚CONTINUE�A�SPOOLER�OUTPUT,*‹COMES�FROM�A�USER�COMMAND�INPUT�CODE�$0204*‚TO�USE:SPECIFY�DEVICE�NAME,*‚ACTION:1)RETRY�OUTPUT�IF�I/O�ERROR�PENDING**‰2)START�NEXT�JOB�IF�AFTER�A�FORMS�CHANGE.*‰3)COMMAND�IS�IGNORED�IF�THE�DEVICE�IS�ACTIVE*‚ANY�USER�MAY�SPECIFY�CONTINUE*‚ENTRY:D0=EVENT�LENGTH*ˆA4=BASE�ADDRESS�REGISTER*ˆA5=EVENT�ADDRESS(*ˆA6=REQUESTOR'S�PARAMETER�BLOCK�ADDRESS*‚EXIT:RETURN�FROM�EVENT,*‚CALLS:FNDENTRY„RPLREC„DOQEVT„STRTSPL„MTCDF** CONTSPLƒEQU„*%ŠMOVE.L�FHSVOL(A6),D6†GET�DEVICE�NAME*J* SEARCH SPOOLER QUEUE FILE FOR AN ENTRY BEING OUTPUT ON THIS DEVICE. THISB* MEANS THAT THE DEVICE IS BUSY AND THE CONTINUE SHOULD BE IGNORED *˜062184�4ŠCLR.L‚D5‘IGNORE�FORMS�IDŠMOVE.L�D5,D7ŽCLEAR�D7�FOR�USE;ŠMOVE.B�#QSTATOUT,D7‡CHECK�FOR�FILES�WHICH�ARE�BEING�OUTPUTŠMOVE.L�#-1,D4�START�AT�TOPŠBSR„FNDENTRY‹LOOK�FOR�ITŠTST„D7‘FOUND�ONE?#ŠBEQ.S‚CONT10�RETURN�IF�DEVICE�BUSY?***************************************************************ŠCLR.L‚D5‘IGNORE�FORMS�ID7ŠMOVE.L�#-1,D4�START�SEARCHING�SPOOLER�QUEUE�AT�THE�TOPŠCLR.L‚D7‘CLEAR�FOR�USE2ŠMOVE.B�#QSTAT5 IOE,D7‡SEARCH�FOR�PENDING�I/E�ERRORS*3*‚SEARCH�THE�SPOOLER�QUEUE�FILE�FOR�AN�ENTRY�WITH�A5*‚MATCHING�DEVICE�AND�IS�WAITING�FOR�CONTINUE�BECAUSE*‚OF�A�IO�ERROR*ŠBSR„FNDENTRY‹GO�FIND�1ŠTST„D7‘FOUND�IT?%ŠBMI.S‚CONT40�BRANCH�IF�ONE�NOT�THERE*4*‚FOUND�THE�ENTRY,SEND�THE�SUB-TASK�AN�EVENT�CODE�33*‚MESSAGE�=CONTINUE*)ŠBCLRƒ#QSTATIOE,QSTAT(A1)�CLEAR�WAIT�FLAG)ŠBSETƒ#QSTATOUT,QSTAT(A1)�SET�OUTPUT�FLAG$ŠCLR.B‚QLUN(A1)‹CLEAR�THE�ERROR�CODE2ŠBSR„RPLREC�PUT�UPDATED�ENTRY�BACK�INTOT�THE�QUEUE&ŠBEQ.S‚CONT20�BRANCH�IF�A�GOOD�REPLACE#CONT10„BRA„SPLACK�RETURN�FROM�EVENT$CONT20„CLR.L‚D7‘SET�CONTINUE�MESSAGE/ŠBSR„DOQEVT�GO�QUEUE�THIS�EVENT�TO�THE�SUB-TASKŠTST„D7‘GOOD�RETURN?#ŠBEQ.S‚CONT10�BRANCH�IF�GOOD�RETURN%ŠMOVE.L�#FSTAIE,D0‰SET�INTERNAL�ERRORŠBRA„CONT10�GO�RETURN+CONT30„MOVE.L�#FSTADT,D0‰SET�INVALID�DEVICEŠBRA„CONT10�GO�RETURN*9*‚HERE�IF�DEVICE�NOT�WAITING�FOR�IO�ERROR�CONTINUE,SEE�IF(*‚ONE�TO�START�BECAUSE�OF�A�FORMS�CHANGE**CONT40„MOVE.L�#-1,D4�START�AT�TOP�OF�QUEUEŠCLR.L‚D7‘CLEAR�FOR�USE5CONT50„MOVE.B�#QSTATWAT,D7‡LOOK�FOR�A�MUST�WAIT�ENTRY'ŠBSR„FNDENTRY‹GO�FIND�AN�ENTRY�TO�START3ŠMOVE.L�CURREC-DATASG(A4),D4�GET�THIS�RECORD�NUMBERŠCLR.L‚D0‘SET�FOR�GOOD�RETURNŠTST„D7‘FOUND�ONE?ŠBMI„CONT80�BRANCH�IF�NO ŠMOVE.L�#-1,D7�SET�CONTINUE�FLAG*ŠBSR„MTCDFŽGO�SEE�IF�MATCHING�DEVICE-FORMSŠCLR.L‚D0‘SET�FOR�GOOD�RETURNŠTST„D7‘FOUND�THIS�DEVICE?ŠBMI„CONT30�BRANCH�IF�NO,ERROR-ŠBNE„CONT10�FOUND�DEVICE�BUT�CAN'T�OUTPUT�NOW"ŠBSR„RPLREC�GO�REPLACE�THIS�RECORD)ŠBTSTƒ#QSTATWAT,QSTAT(A1)�MATCHING�FORMS?+ŠBNE.S‚CONT50�BRANCH�IF�NO,SEARCH�SOME�MORE*4*‚FOUND�AN�ENTRY�TO�START-FIX�UP�STATUS�AND�START�IT**ŠBTSTƒ#QSTATRDY,QSTAT(A1)�READY�TO�OUTPUT?ŠBEQ.S‚CONT55�BRANCH�IF�NO!ŠBSR„STRTSPLŒGO�START�THIS�OUTPUTŠTST„D7‘STARTED?ŠBEQ.S‚CONT60�BRANCH�IF�STARTED5ŠBSETƒ#QSTATRDY,QSTAT(A1)�MAKE�SURE�THIS�ONE�IS�READY:CONT55„BCLRƒ#QSTATOUT,QSTAT(A1)�MAKE�SURE�NOT�BEING�OUTPUT)ŠBSR„RPLREC�GO�PUT�RECORD�BACK�INTO�QUEUEŠBNE„CONT10�ERROR�RETURNEŠMOVE.L�CURREC-DATASG(A4),D4�SEARCH�THE�QUEUE�SOME�MORE,STARTING�HEREŠCLR.L‚D7‘CLEAR�FOR�USEŠBRA„CONT50�GO�SEARCH*8*‚HERE�IF�OUTPUT�STARTED,GO�FIX�UP�REST�OF�QUEUE�ENTRIES*CONT60„CLR.L‚D7‘CLEAR�FOR�USE#ŠMOVE.L�#-1,D4�START�AT�TOP�OF�FILE(ŠMOVE.L�QDEVICE(A1),D6…MATCH�THIS�DEVICE)ŠMOVE.L�QFORMS(A1),D5†MATCH�THIS�FORMS�ID3CONT70„MOVE.B�#QSTATWAT,D7‡LOOK�FOR�WAITING�ENTRIES&ŠBSR„FNDENTRY‹GO�FIND�A�MATCHING�ENTRYŠCLR.L‚D0‘SET�FOR�A�GOOD�RETURN4ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�THIS�RECORD�NUMBERŠTST„D7‘FOUND�ONE?ŠBMI„CONT10�BRANCH�IF�NO,DONE-ŠBCLRƒ#QSTATWAT,QSTAT(A1)�CLEAR�THE�WAIT�FLAG-ŠBCLRƒ#QSTATFRM,QSTAT(A1)�CLEAR�THE�FORM�FLAG.ŠBSR„RPLREC�PUT�ENTRY�BACK�INTO�THE�QUEUE�FILEŠBNE„CONT10�ERROR�RETURN&ŠBRA„CONT70�DO�TIL�NO�MATCHING�ENTRIES*<*ŠTHE�FOLLOWING�ROUTINE�IS�ADDED�TO�CLEAR�THE�PRINTER�STATUS%*ŠFLAG�AFTER�A�CONT�COMMAND.�062184�4*$CONT80„CLR.L‚D1‘FIRST�RECORD�TO�READ)ŠLEA„QSTAT(A1),A3‡GET�STATUS�BYTE�ADDRESS*CONT85„BSR„RDRESŽGO�READ�A�RESERVED�RECORD%ŠMOVE.L�#RREC,D2‹#�ENTRIES�PER�RECORD+CONT90„MOVE.L�RDEV(A2),D3ˆGET�A�DEVICE�NAMEŠTST.L‚D3‘ANY�DEVICE1ŠBEQ„CONT10�BRANC�IF�END�OF�LIST-DEVICE�NOT�FOUNDŠCMP.L‚D6,D3ŽMATCHING�DEVICE?ŠBEQ.S‚CONT100ŒBRANCH�IF�YES#ŠSUB.L‚#1,D2ŽDECREMENT�#�OF�ENTRIES/ŠBEQ.S‚CONT105ŒBRANCH�IF�MUST�READ�A�NEW�RECORD"ŠADD.L‚#RLNG,A2‹BUMP�TO�NEXT�ENTRY!ŠBRA„CONT90�GO�LOOK�AT�NEXT�ENTRY'CONT105ƒADD.L‚#1,D1ŽBUMP�TO�NEXT�RECORDŠCMP.L‚#8,D1ŽREAD�EVERY�RECORD?"ŠBLE„CONT85�BRANCH�IF�MORE�TO�READ2CONT100ƒCLR.L‚RSTAT(A2)ŠSET�PRINTER�STATUS�TO�'OK'ŠBSR„RPLRES�REPLACE�THE�RECORDŠBRA„CONT10�RETURN�TO�CALLER*ŠPAGE**‚FORMSPL‚CHANGE�FORMS�ID&*‹COMES�FROM�A�USER�COMMAND�CODE�$0208)*‚TO�USE,SPECIFY:DEVICE�NAME�AND�FORMS�ID0*‚OVERVIEW:WHEN�THE�CURRENT�JOB�ID�DONE,NO�OTHER7*‚OUTPUT�IS�STARTED�UNTIL�A�CONTINUE�COMMAND�IS�ISSUED.6*‚THE�DEVICE�OUTPUTS�SPOOLER�FILES�WITH�MATCHING�FORMS6*‚ID�UNTIL�A�NEW�FORMS�ID�IS�SPECIFIED.�SPECIFY�'STND';*‚FORMS�ID�T5 O�CHANGE�BACK�TO�THE�STANDARD�DEFAULT�FORMS�ID.9*‚ALL�QUEUE�ENTRIES�START�AS�'STND'�UNLESS�A�FORMS�ID�WAS?*‚SPECIFIED�IN�THE�CATALOG�FIELD�AT�ASSIGN.�ON�A�FORMS�COMMAND,@*‚ALL�QUEUE�ENTRIES�WITH�A�MATCHING�FORMS�ID�ARE�SET�TO�WAIT�FOR>*‚CONTINUE,IF�THE�DEVICE�IS�THE�SAME.�ALL�OTHER�ENTRIES�WITH�A<*‚MATCHING�DEVICE�BUT�NOT�A�MATCHING�FORMS�ID�ARE�SET�TO�NOT*‚MATCHING�FORMS�ID.**‚ENTRY:D0=EVENT�LENGTH*ˆA4=BASE�ADDRESS�REGISTER*ˆA5=EVENT�ADDRESS(*ˆA6=REQUESTOR'S�PARAMETER�BLOCK�ADDRESS*‚EXIT:RETURN�FROM�EVENT$*‚CALLS:RPLRES„FNDENTRY„RDRES„RPLREC** FORMSPLƒEQU„*ŠCLR.L‚D1‘1ST�RECORD�TO�READ*FORM10„BSR„RDRESŽGO�READ�A�RESERVED�RECORD%ŠMOVE.L�#RREC,D2‹#�ENTRIES�PER�RECORD)FORM20„MOVE.L�RDEV(A2),D3ˆGET�DEVICE�NAME#ŠBEQ.S‚FORM40�BRANCH�IF�END�OF�LIST!ŠCMP.L‚FHSVOL(A6),D3†SAME�DEVICE?ŠBEQ.S‚FORM60�BRANCH�IF�SAMEŠSUB.L‚#1,D2ŽDECREMENT�COUNT0ŠBEQ.S‚FORM30�BRANCH�IF�MUST�READ�IN�NEXT�RECORD"ŠADD.L‚#RLNG,A2‹BUMP�TO�NEXT�ENTRY#ŠBRA„FORM20�GO�CHECK�THE�NEXT�ENTRY-FORM30„ADD.L‚#1,D1ŽBUMP�TO�NEXT�RECORD�NUMBER"ŠCMP.L‚#8,D1ŽMORE�RECORDS�TO�READ?$ŠBLE.S‚FORM10�BRANCH�IF�MORE�TO�READ+FORM40„MOVE.L�#FSTADT,D0‰SET�INVALID�DEVICE#FORM50„BRA„SPLACK�RETURN�FROM�EVENT5FORM60„MOVE.L�FHSSIZ(A6),RFRM(A2)�SET�TO�NEW�FORMS�ID"ŠBEQ„FORM40�FORMS�ID�CAN'T�BE�ZERO)ŠMOVE.L�#-1,RSTAT(A2)†SET�TO�FORMS�CHANGE7ŠBSR„RPLRES�GO�PUT�THIS�RECORD�BACK�INTO�THE�QUEUE�FILE*:*‚READ�THE�QUEUE�FILE�AND�UPDATE�ALL�ENTRIES�WITH�MATCHING;*‚DEVICE.�UPDATE=IF�MATCHING�FORMS�ID,SET�WAIT�FOR�CONTINUE5*‚IF�NOT�MATCHING�FORMS�ID,SET�NOT�MATCHING�FORMS�ID.*(ŠMOVE.L�FHSSIZ(A6),D3†SAVE�THIS�FORMS�ID,ŠMOVE.L�#-1,D4�SEARCH�QUEUE�AT�START�OF�FILEŠCLR.L‚D5‘ANY�FORMS�ID,ŠMOVE.L�FHSVOL(A6),D6†SEARCH�FOR�THIS�DEVICE"FORM70„MOVE.L�#-1,D7�IGNORE�STATUSŠBSR„FNDENTRY‹GO�FIND�A�MATCHŠCLR.L‚D0‘SET�FOR�A�GOOD�RETURN4ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�THIS�RECORD�NUMBERŠTST„D7‘FOUND�A�MATCH?ŠBMI„FORM50�BRANCH�IF�NO,DONE+ŠBTSTƒ#QSTATOUT,QSTAT(A1)�BEING�OUTPUT�NOW?/ŠBNE„FORM70�BRANCH�IF�YES,DON'T�CHANGE�ANYTHING#ŠCMP.L‚QFORMS(A1),D3†SAME�FORMS�ID?$ŠBNE.S‚FORM80�BRANCH�IF�NOT�THE�SAME%ŠBSETƒ#QSTATWAT,QSTAT(A1)�SET�TO�WAIT/ŠBCLRƒ#QSTATFRM,QSTAT(A1)�SET�TO�MATCHING�FORMSŠBRA.S‚FORM90�GO�REPLACE0FORM80„BSETƒ#QSTATWAT,QSTAT(A1)�SET�TO�MUST�WAIT6ŠBSETƒ#QSTATFRM,QSTAT(A1)�SET�TO�NOT�MATCHING�FORMS�ID7FORM90„BSR„RPLREC�PUT�UPDATED�RECORD�BACK�INTO�THE�FILEŠBNE„FORM50�ERROR�RETURNŠBRA„FORM70�GO�SEARCH�SOME�MOREŠPAGE9*‚PRNTSPL‚OUTPUT�A�SPOOLER�FILE�NEXT�OR�ADD�A�NON-SPOOLER *‹FILENAME�TO�THE�SPOOLER�QUEUE.!*‹COMES�FROM�A�USER�COMMAND�$0210#*‹ONLY�VALID�IF�THE�FILE�IS�CLOSED.!*‹USER�0�MAY�SPECIFY�ANY�FILENAME**‹USER�X�MAY�ONLY�SPECIFY�HIS�OWN�FILENAME*‹SPECIFY•ACTION*‹-------•------*‹JOBID—OUTPUT�THIS�JOB�NEXT(*‹FILENAME(SPOOLER)‹OUTPUT�THIS�JOB�NEXT2*‹FILENAME(NON-SPOOLER)‡ADD�THIS�FILENAME�TO�QUEUE*‚ENTRY:D0=EVENT�LENGTH*ˆA4=BASE�ADDRESS�REGISTER*ˆA5=EVENT�ADDRESS(*ˆA6=REQUESTOR'S�PARAMETER�BLOCK�ADDRESS*‚EXIT:RETURN�FROM�EVENT)*‚CALLS:FNDENTRY„DELENTRY„INSRTREC„GTJOBN *ˆMTCDF‡STPRIRPL„ASFSIZE…STRTNXT* PRNTSPLƒEQU„*ŠCLR.L‚D0‘CLEAR�FOR�USE"ŠCLR.L‚D1‘FLAG�FOR�JOBID�SPECIFIED,ŠMOVE.L�FHSSIZ(A6),D3†SEE�IF�JOBID�SPECIFIED*ŠBNE.S‚PRNT10�BRANCH�IF�JOBID�IS�SPECIFIED4ŠMOVE.B�FHSFIL(A6),D3†SEE�IF�A�SPOOER�FILE�SPECIFIED3ŠCMP.B‚#SPOOLF,D3‰START�WITH�THE�SPOOLER�FILE�SIGN?(ŠBNE„PRNT90�BRANCH�IF�NOT�A�SPOOLER�FILE4ŠMOVE.L�FHSFIL(A6),D3†IS�A�SPOOLER�FILE,GET�FILENAME(ŠMOVE.L�FHSFIL+4(A6),D2„REST�OF�FILENAMEŠMOVE.L�#1,D1ŽSET�FILE�FLAG5PRNT10„MOVE.L�#-1,D4�SEARCH�QUEUE�STARTING�AT�THE�TOPŠCLR.L‚D5‘ANY�FORMS�IDŠCLR.L‚D6‘ANY�DEVICE"PRNT20„MOVE.L�#-1,D7�IGNORE�STATUSŠBSR„FNDENTRY‹GO�FIND�AN�ENTRY4ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�THIS�RECORD�NUMBERŠTST„D7‘FOUND�ONE?ŠBMI„PRNT80�BRANCH�IF�NO%ŠTST„D1‘LOOKING�FOR�A�MATCHING�JOBID?ŠBEQ.S‚PRNT30�BRANCH�IF�YES#ŠCMP.L‚QFILEN(A1),D3†SAME�FILENAME?ŠBNE„PRNT20�BRANCH�IF�NOŠCMP.L‚QFILEN+4(A1),D2„SAME?ŠBNE6 „PRNT20�BRANCH�IF�NO#ŠMOVE.W�FHSEXT(A1),D7†GET�EXTENSIONŠCMP.W‚QEXT(A1),D7ˆSAME?"ŠBNE„PRNT20�BRANCH�IF�NOT�THE�SAME)ŠBRA.S‚PRNT40�FOUND�THE�MATCHING�FILENAME&PRNT30„CMP.L‚QJOBID(A1),D3†SAME�JOBID?ŠBNE„PRNT20�BRANCH�IF�NO0PRNT40„BTSTƒ#QSTATRDY,QSTAT(A1)�READY�TO�OUTPUT? ŠBEQ.S‚PRNT56�BRANCH�IF�NO,ERROR)ŠTST.W‚EVTUNM(A5)‰USER�0�REQUESTING�THIS?ŠBEQ.S‚PRNT60�BRANCH�IF�YES,OK%ŠMOVE.W�EVTUNM(A5),D1†GET�USER�NUMBERŠCMP.W‚QJOBID(A1),D1†SAME�USER?ŠBEQ.S‚PRNT60�BRANCH�IF�YES,OK0PRNT50„MOVE.L�#FSTAIU,D0‰SET�INVALID�USER�NUMBER$PRNTRTNƒBRA„SPLACK�RETURN�FROM�EVENT.PRNT55„MOVE.L�#FSTAIE,D0‰SET�TO�INTERNAL�ERRORŠBRA„PRNTRTNŒRETURN5PRNT56„MOVE.L�#FSTAWS,D0‰SET�TO�WRONG�STATE�FOR�STARTŠBRA„PRNTRTNŒRETURN**‚HERE�IF�MATCHING�QUEUE�ENTRY*&PRNT60„CLR.L‚QSIZE(A1)ŠFORCE�ZERO�SIZE2ŠMOVE.W�FHSOPT(A6),D0†GET�#�OF�COPIES,IF�SPECIFIED>ŠBEQ.S‚PRNT65ˆBRANCH�IF�NOT�SPECIFIED,USE�WHAT'S�ALREADY�THERE*ŠMOVE.B�D0,QCOPYS(A1)†SAVE�NEW�#�OF�COPIES1PRNT65„LEA„SCRATCH-DATASG(A4),A2�USE�SCRATCH�AREA#ŠMOVE.L�#QLNG/2,D0‰#�WORDS�IN�ENTRY)PRNT70„MOVE.W�(A1)+,(A2)+ˆSAVE�THIS�ENTRYŠSUB.L‚#1,D0ŽDECREMENT�COUNTŠBNE.S‚PRNT70�BRANCH�TIL�MOVED8ŠBSR„DELENTRY‹GO�DELETE�THIS�ENTRY�FROM�CURRENT�POSITIONŠTST„D7‘GOOD�RETURN?"ŠBMI„PRNT55�BRANCH�IF�ERROR�RETURN!ŠMOVE.L�#-1,D4�SEARCH�QUEUE�AGAINŠCLR.L‚D5‘ANY�FORMS�IDŠCLR.L‚D6‘ANY�DEVICE-ŠMOVE.B�#QSTATRDY,D7‡LOOK�FOR�1ST�READY�ENTRYŠBSR„FNDENTRY‹GO�FIND�ONE4ŠLEA„SCRATCH-DATASG(A4),A1�POINT�TO�THIS�ENTRY�AGAIN7ŠMOVE.L�CURREC-DATASG(A4),D7�GET�RECORD�#�FOR�INSERTION"ŠCMP.L‚#10,D7�VALID�RECORD�NUMBER?ŠBGE.S‚PRNT73�BRANCH�IF�YES,ŠMOVE.L�#10,D7�FORCE�1ST�ENTRY�RECORD�NUMBER$ŠMOVE.L�D7,CURREC-DATASG(A4)�SAVE�IT1PRNT73„BSR„INSRTREC‹GO�INSERT�BACK�INTO�THE�QUEUE#ŠMOVE.L�#QLNG/2,D0‰GET�ENTRY�LENGTH*ŠLEA„QBUF-DATASG(A4),A2�GET�BUFFER�ADDRESSŠMOVE.L�A2,A3ŽSAVE�IT=PRNT75„MOVE.W�(A1)+,(A2)+ˆMOVE�THE�ENTRY�BACK�INTO�ITS�BUFFER"ŠSUB.L‚#1,D0ŽDECREMENT�THE�COUNTERŠBNE.S‚PRNT75�BRANCH�TIL�MOVED$ŠMOVE.L�A3,A1ŽRESTORE�BUFFER�ADDRESS1ŠBRA„PRNT170ŒGO�START�THIS�ONE�IF�DEVICE�NOT�BUSY/PRNT80„MOVE.L�#FSTANNM,D0ˆNON-EXISTENT�FILENAMEŠBRA„PRNTRTNŒGO�RETURN*(*‚HERE�IF�NON-SPOOLER�FILENAME�SPECIFIED*5PRNT90„MOVE.L�#-1,D4�SEARCH�QUEUE,SEE�IF�ALREADY�HEREŠMOVE.L�FHSSAD(A6),D6†DEVICEŠMOVE.L�FHSEAD(A6),D5†FORMS�ID PRNT100ƒMOVE.L�#-1,D7�ANY�STATUS(ŠBSR„FNDENTRY‹GO�SEE�IF�A�MATCHING�ENTRY4ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�THIS�RECORD�NUMBERŠTST„D7‘FOUND�ONE?1ŠBMI.S‚PRNT120ŒBRANCH�IF�NO,GO�INSERT�THE�NEW�ONE0ŠLEA„QVOL(A1),A2ˆSTART�ADDRESS�OF�QUAL.�FILENAME6ŠLEA„FHSVOL(A6),A3†START�ADDRESS�OF�SPECIFIED�FILENAME(ŠMOVE.L�#6,D1Ž#�OF�LONG�WORDS�TO�COMPARE(PRNT110ƒCMP.L‚(A2)+,(A3)+ˆSAME�FILENAME?,ŠBNE„PRNT100ŒBRANCH�IF�DIFFERENT-SEARCH�MOREŠSUB.L‚#1,D1ŽDECRMENT�COUNTER1ŠBNE.S‚PRNT110ŒBRANCH�IF�MORE�FILENAME�TO�COMPARE7ŠBRA„PRNT40�IN�QUEUE�ALREADY,GO�SEE�IF�CAN�MAKE�IT�NEXT*/*‚BUILD�A�SPOOLER�QUEUE�ENTRY�FOR�THIS�FILENAME*5PRNT120ƒLEA„QBUF-DATASG(A4),A1�BUFFER�FOR�QUEUE�ENTRY ŠMOVE.W�#QLNG/2,D0‰BUFFER�LENGTH,PRNT130ƒCLR.W‚(A1)+ŽCLEAR�IT�BEFORE�USING�ITŠSUB.L‚#1,D0ŽDECREMENT�COUNTER!ŠBNE.S‚PRNT130ŒBRANCH�TIL�CLEARED.ŠLEA„QBUF-DATASG(A4),A1�RESTORE�BUFFER�ADDRESS+ŠMOVE.L�FHSSAD(A6),(A1)+ƒOUTPUT�DEVICE�NAME%ŠBEQ„PRNT50�DEVICE�NAME�CAN'T�BE�ZERO"ŠMOVE.L�FHSEAD(A6),D0†GET�FORMS�ID"ŠBNE.S‚PRNT140ŒBRANCH�IF�NOT�BLANKŠMOVE.L�#'STND',D0‰USE�DEFAULT PRNT140ƒMOVE.L�D0,(A1)+‹FORMS�ID(ŠMOVE.L�#6,D0ŽLENGTH�OF�FILENAME�TO�MOVE-ŠLEA„FHSVOL(A6),A2†START�ADDRESS�TO�MOVE�FROM6PRNT145ƒMOVE.L�(A2)+,(A1)+ˆMOVE�THE�QUALIFIED�FILENAMEŠSUB.L‚#1,D0ŽDECREMANR�COUNTERŠBNE.S‚PRNT145ŒBRANCH�TIL�MOVED"ŠMOVE.L�EVTTSK(A5),(A1)+ƒTASK�NAME ŠMOVE.L�EVTSES(A5),(A1)+ƒSESSIONŠCLR.L‚(A1)+ŽJOBID,GET�LATER&ŠMOVE.B�EVTPRI(A5),(A1)+ƒTASK�PRIORITY.ŠLEA„QBUF-DATASG(A4),A1�RESTORE�BUFFER�ADDRESS*ŠMOVE.W�FHSOPT(A6),D0†GET�NUMBER�OF�COPIESŠTST.B‚D0‘ANY�VALUE?#ŠBNE.S‚PRNT150ŒBRANCH�IF�YES,USE�IT#ŠMOVE.L�#1,D0ŽNO�VALUE,FORCE�1�COPY-PRNT150ƒMOVE.B�D0,QCOPYS(A1)†NUMBER�OF�COPIES.ŠMOVE.L�#G6 TDTIM,D0‰GET�DATE�AND�TIME�DIRECTIVE5ŠLEA„SCRATCH-DATASG(A4),A0�USE�SCRATCH�FOR�THE�ANSWERŠTRAPƒ#1‘GO�GET�THEM%ŠMOVE.L�(A0)+,QDATE(A1)„SAVE�THE�DATE$ŠMOVE.L�(A0),QTIME(A1)…SAVE�THE�TIME1ŠBSETƒ#QSTATRDY,QSTAT(A1)�SET�FOR�READY�TO�OUTPUTŠBSR.S‚ASFSIZEŒGO�GET�FILE�SIZEŠBNE„PRNTRTNŒERROR�RETURN*8*‚DETERMINE�JOBID,FORMS�ID,�AND�PUT�ENTRY�INTO�THE�QUEUE*ŠBSR„GTJOBN�GO�GET�JOB�NUMBERŠTST.L‚D7‘CHECK�RETURNŠBNE„PRNTRTNŒERROR�RETURN2ŠMOVE.W�EVTUNM(A5),QJOBID(A1)�USER�NUMBER�TO�JOBID#ŠBNE.S‚PRNT160ŒBRANCH�IF�NOT�USER�0.ŠCMP.L‚#0,A4ŽARE�WE�IN�EXORmacs?�(YES�IS�A4=0)EŠBNE.S‚PRNT160�BRANCH�IF�NOT�EXORmacs,USE�THE�USER�NUMBER�WE�NOW�HAVE(ŠBSR„GTUSER�GO�GET�LOGGED�ON�USER�NUMBER1PRNT160ƒMOVE.W�D6,QJOBID+2(A1)„OCCURENCE�TO�JOBID&ŠCLR.L‚D7‘SET-UP�FOR�NOT�FROM�CONTINUEŠBSR„MTCDFŽGO�SET�UP�FORMS�IDŠTST„D7‘GOOD�RETURN?ŠBMI„PRNT55�ERROR�RETURN>ŠMOVE.L�#10,CURREC-DATASG(A4)�SET�UP�FOR�INSERT�AT�TOP�OF�FILE.ŠBSR„STPRIRPL‹GO�SET�PRIORITY�AND�PUT�IN�QUEUEŠTST„D7‘GOOD�RETURN?%ŠBMI„PRNT55�BRANCH�IF�AN�ERROR�RETURN+PRNT170ƒBSR„STRTNXTŒGO�SEE�IF�ONE�CAN�STARTŠCLR.L‚D0‘GOOD�RETURNŠBRA„PRNTRTNŒGO�RETURNŠPAGE*!*‚ASSIGN�THE�FILE�TO�GET�THE�SIZE*‚ENTRY:A1=QUEUE�ENTRY�ADDRESS*ˆA4=BASE�ADDRESS�REGISTER*‚EXIT:D0=0=GOOD�RETURN*‡D0=ANYTHING�ELSE=ERROR�RETURN*‡QSIZE(A1)=FILE�SIZE*‚USES:0�1�2�3�4�5�6�7*…D�R*…A�*�P�*�*�PƒP ASFSIZEƒEQU„*0ŠLEA„FHSPB-DATASG(A4),A0�USE�FHS�PARAMETER�BLOCK/ŠSFHSCO�FHASGN,FOPPR,A0„ASSIGN�WITH�PUBLIC�READŠMOVE.B�#3,FHSLUN(A0)†USE�LUN�3BŠLEA„6(A6),A2�USE�PARAMETER�BLOCK�ADDRESS�STARTING�AT�VOLUME‚USERSAŠLEA„6(A0),A3‚USE�PARAMETER�BLOCK�ADDRESS�STARTING�AT�VOLUME‚MINEŠMOVE.L�#6,D0ŽLENGTH�OF�MOVE5ASF10…MOVE.L�(A2)+,(A3)+ˆMOVE�IN�THE�FILE�INFORMATIONŠSUB.L‚#1,D0ŽDECREMENT�COUNTER!ŠBNE.S‚ASF10ŽBRANCH�TIL�MOVED�ALL"ŠMOVE.B�FHSFIL(A0),D0†GET�FILENAME'ŠCMP.B‚#SPOOLF,D0‰SEE�IF�A�SPOOLER�FILE)ŠBNE.S‚ASF15ŽBRANCH�IF�NOT�A�SPOOLER�FILE?ŠMOVE.L�SPLDEV-DATASG(A4),FHSVOL(A0)�IS�SPOOLER,USE�THIS�VOLUME$ASF15…CLR.W‚FHSWCD(A0)‰PROTECT�CODESŠTRAPƒ#3‘ASSIGN�THIS�FILE ŠBNE.S‚ASFERR�BRANCH�IF�AN�ERRORŠMOVE.L�A0,A2ŽSAVE�THIS�ADDRESS8ŠLEA„IOSPB-DATASG(A4),A0�GET�IOS�PARAMETER�BLOCK�ADDRESSŠMOVE.B�#3,IOSLUN(A0)†LUNEŠSIOSCO�IOPOST,IOPREC+IOPRAN,A0�POSITION�TO�END�OF�FILE,RANDOM�RECORD@ŠMOVE.L�#-1,IOSRRN(A0)…POSITION�TO�END,WILL�RETURN�LAST�RECORD�#ŠTRAPƒ#2‘DO�IT"ŠBEQ.S‚ASF20ŽBRANCH�IF�GOOD�RETURN.ŠCLR.L‚IOSRRN(A0)‰FORCE�NO�RECORDS�ON�AN�ERROR(ASF20…MOVE.L�IOSRRN(A0),D0†GET�#�RECORDS+ŠMOVE.L�D0,QSIZE(A1)‡SAVE�NUMBER�OF�RECORDS-ŠMOVE.L�A2,A0ŽRESTORE�PARAMETER�BLOCK�ADDRESS-ŠMOVE.W�#FHCLOS,FHSCMD(A0)�NOW�CLOSE�THE�FILEŠTRAPƒ#3‘DO�ITASFERR„RTS—RETURNŠPAGE*,*‚COPYSPL‚CHANGE�#�COPIES�FOR�A�SPOOLER�FILE*‹FROM�USER�COMMAND�$0220*‹#�COPIES�MUST�BE�SPECIFIED+*‹EITHER�JOBID�OR�FILENAME�MAY�BE�SPECIFIED*‹USER�0�MAY�CHANGE�ANY�ENTRY *‹USER�X�MAY�ONLY�CHANGE�HIS�OWN*‚ENTRY:D0=EVENT�LENGTH*ˆA4=BASE�ADDRESS�REGISTER*ˆA5=EVENT�ADDRESS(*ˆA6=REQUESTOR'S�PARAMETER�BLOCK�ADDRESS*‚EXIT:RETURN�FROM�EVENT*‚CALLS:FNDENTRY„RPLREC** COPYSPLƒEQU„*ŠCLR.L‚D1‘CLEAR�FOR�USE-ŠMOVE.L�FHSSIZ(A6),D3†SEE�IF�JOB�ID�SPECIFIEDŠBNE.S‚COPY10�BRANCH�IF�YES0ŠMOVE.L�FHSFIL(A6),D3†FILENAME�MUST�BE�SPECIFIED$ŠBEQ„COPY60�BRANCH�IF�IT�ISN'T,ERROR,ŠMOVE.L�FHSFIL+4(A6),D2„GET�REST�OF�FILENAMEŠMOVE.L�#1,D1ŽSET�FILENAME�FLAG,COPY10„MOVE.L�#-1,D4�SET�SEARCH�QUEUE�AT�TOPŠCLR.L‚D5‘ANY�FORMS�IDŠCLR.L‚D6‘ANY�DEVICECOPY20„MOVE.L�#-1,D7�ANY�STATUSŠBSR„FNDENTRY‹GO�FIND�AN�ENTRY4ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�THIS�RECORD�NUMBERŠTST„D7‘FOUND�AN�ENTRY? ŠBMI.S‚COPY60�BRANCH�IF�NO,ERRORŠTST„D1‘LOOKING�FOR�JOBID?ŠBEQ.S‚COPY70�BRANCH�IF�YES#ŠCMP.L‚QFILEN(A1),D3†SAME�FILENAME?ŠBNE„COPY20�BRANCH�IF�NOŠCMP.L‚QFILEN+4(A1),D2„SAME?ŠBNE„COPY20�BRANCH�IF�NO#ŠMOVE.W�FHSEXT(A6),D7†GET�EXTENSION"ŠCMP.W‚QEXT(A1),D7ˆSAME�EXTENSION?ŠBNE„COPY20�BRANCH�IF�NO%ŠCMP.B‚#SPOOLF,D3‰A�SPOOLER�FILENAME?ŠBEQ.S‚COPY30�BRANCH�IF�YESCŠMOVE.L�FHSVOL(A6),D7„NON-SPOOLER�FILENAME,CHECK7 �VOLUME�AND�CATALOGŠCMP.L‚QVOL(A1),D7ˆSAME?ŠBNE„COPY20�BRANCH�IF�NO!ŠMOVE.L�FHSCLG(A6),D7†GET�CATALOGŠCMP.L‚QCATLG(A1),D7†SAME?ŠBNE„COPY20�BRANCH�IF�NO+ŠMOVE.L�FHSCLG+4(A6),D7„GET�REST�OF�CATALOGŠCMP.L‚QCATLG+4(A1),D7„SAME?ŠBNE„COPY20�BRANCH�IF�NO/COPY30„TST.W‚EVTUNM(A5)‰USER�0�REQUESTING�THIS?ŠBEQ.S‚COPY35�BRANCH�IF�YES,OK%ŠMOVE.W�EVTUNM(A5),D1†GET�USER�NUMBER&ŠCMP.W‚QJOBID(A1),D1†SAME�USER�NUMBER? ŠBNE.S‚COPY80�BRANCH�IF�NO,ERRORCOPY35„CLR.L‚D0‘CLEAR�FOR�USE*ŠMOVE.W�FHSOPT(A6),D0†GET�NUMBER�OF�COPIESŠTST.B‚D0‘ZERO? ŠBNE.S‚COPY40�BRANCH�IF�NOT�ZEROŠMOVE.B�#1,D0ŽFORCE�15COPY40„MOVE.B�D0,QCOPYS(A1)†SAVE�NUM�NUMBER�OF�COPIES ŠCLR.L‚D75ŠBSR„RPLREC�GO�PUT�UPDATED�RECORD�BACK�INTO�THE�QUEUEŠTST„D7ŠBEQ.S‚COPYRTNŒBRANCH�IF�YES+COPY50„MOVE.L�#FSTAIE,D0‰SET�INTERNAL�ERROR$COPYRTNƒBRA„SPLACK�RETURN�FROM�EVENT/COPY60„MOVE.L�#FSTANNM,D0ˆFILENAME�DOEN'T�EXISTŠBRA„COPYRTNŒGO�RETURN©70„CMP.L‚QJOBID(A1),D3†SAME�JOBID?"ŠBNE„COPY20�BRANCH�IF�NOT�THE�SAME,ŠBRA„COPY30�YES,THE�SAME,GO�FIX�UP�THE�ENTRY3COPY80„MOVE.L�#FSTAIU,D0‰SET�TI�INVALID�USER�NUMBERŠBRA„COPYRTNŒRETURNŠPAGE*‚QUESPL‚OUTPUT�SPOOLER�QUEUE*ŠFROM�USER�COMMAND‚$0240*‚TO�USE:SPECIFYŒACTION*‰------�------+*‰DEVICE�LIST�QUEUE�ENTRIES�FOR�THAT�DEVICE)*‰USER�#�LIST�QUEUE�ENTRIES�FOR�THAT�USER-*‰SESSIONŒLIST�QUEUE�ENTRIES�FOR�THAT�SESSION*‰QUEUE�ONLY‰LIST�ALL�ENTRIES*‚ENTRY:D0=EVENT�LENGTH*ˆA4=BASE�ADDRESS�REGISTER*ˆA5=EVENT�ADDRESS(*ˆA6=REQUESTOR'S�PARAMETER�BLOCK�ADDRESS*‚EXIT:RETURN�FROM�EVENT4*‚CALLS:FNDENTRY„OUTENT„OUTMGS„FMSINTƒSETDEV�RESTDEV* QUESPL„EQU„*#ŠBSR„SETDEV�GO�ASSIGN�OUTPUT�DEVICEŠCLR.L‚D2‘CLEAR�FOR�USE)ŠCLR.B‚SPLFLG1-DATASG(A4)�CLEAR�FLAG�BYTE+ŠLEA„SPLFLG1-DATASG(A4),A2�GET�FLAG�ADDRESS1ŠMOVE.L�FHSVOL(A6),D3†SEE�IF�DEVICE�WAS�SPECIFIEDŠBEQ.S‚QUE10ŽBRANCH�IF�NO1ŠCMP.L‚#'FORM',D3‰SEE�IF�WANTS�DEVICE-FORMS�TABLEŠBEQ„QUE110�BRANCH�IF�YES&ŠBSETƒ#OUTDEV,(A2)‡SET�LOOK�FOR�DEVICE!ŠBRA.S‚QUE40ŽGO�SET-UP�FOR�OUTPUT9QUE10…MOVE.W�FHSUSN(A6),D3†SEE�IF�LOOKING�FOR�USER�NUMBERŠBEQ.S‚QUE20ŽBRANCH�IF�NO.ŠBSETƒ#OUTUSN,(A2)‡SET�LOOKING�FOR�USER�NUMBER!ŠBRA.S‚QUE40ŽGO�SET-UP�FOR�OUTPUT:QUE20…MOVE.W�FHSOPT(A6),D3†SEE�IF�LOOKING�FOR�THIS�SESSION/ŠBEQ.S‚QUE30ŽBRANCH�IF�NO,OUTPUT�COMPLETE�QUEUE1ŠBSETƒ#OUTSES,(A2)‡SET�TO�THIS�SESSION�FOR�OUTPUT!ŠBRA.S‚QUE40ŽGO�SET-UP�FOR�OUTPUT&QUE30…BSETƒ#OUTALL,(A2)‡SET�OUTPUT�ALL)QUE40…MOVE.L�#-1,D4�SET�AT�START�OF�QUEUEŠCLR.L‚D6‘SET�TO�ANY�DEVICE(ŠBTSTƒ#OUTDEV,(A2)‡LOOKING�FOR�A�DEVICE?ŠBEQ.S‚QUE50ŽBRANCH�IF�NO%ŠMOVE.L�D3,D6ŽLOOKING�FOR�THIS�DEVICEQUE50…CLR.L‚D5‘ANY�FORMS�IDQUE60…MOVE.L�#-1,D7�ANY�STATUSŠBSR„FNDENTRY‹GO�FIND�AN�ENTRY4ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�THIS�RECORD�NUMBERŠTST„D7‘FOUND�AN�ENTRY?ŠBMI.S‚QUE100�BRANCH�IF�NO"ŠBTSTƒ#OUTALL,(A2)‡OUTPUTTING�ALL?ŠBEQ.S‚QUE80ŽBRANCH�IF�NO%QUE70…BSR„OUTENT�GO�OUTPUT�THIS�ENTRYŠADD.L‚#1,D2ŽCOUNT�ITŠBRA„QUE60ŽGO�GET�NEXT�ENTRY)QUE80…BTSTƒ#OUTDEV,(A2)‡OUTPUT�BY�DEVICE?ŠBNE„QUE70ŽBRANCH�IF�YES)ŠBTSTƒ#OUTUSN,(A2)‡OUTPUT�BY�USER�NUMBER?ŠBEQ.S‚QUE90ŽBRANCH�IF�NO&ŠCMP.W‚QJOBID(A1),D3†SAME�USER�NUMBER?ŠBEQ„QUE70ŽBRANCH�IF�YES&ŠBRA„QUE60ŽNOT�THE�SAME,GET�NEXT�ENTRY-QUE90…MOVE.L�EVTSES(A5),D3†GET�SESSION�NUMBERŠCMP.L‚QSESS(A1),D3‡SAME?ŠBEQ„QUE70ŽBRANCH�IF�THE�SAME)ŠBRA„QUE60ŽNOT�THE�SAME,GO�GET�NEXT�ENTRYQUE100„TST„D2‘ANY�OUTPUT?"ŠBNE.S‚QUERTN�BRANCH�IF�YES,RETURN1ŠLEA„MSG1-DATASG(A4),A6�OUTPUT�NO�ENTRIES�MESSAGEŠMOVE.L�#16,D0�MESSAGE�LENGTH!ŠBSR„OUTMSG�GO�OUTPUT�THE�MESSAGE-QUERTN„BSR„RESTDEVŒGO�CLOSE�THE�OUTPUT�DEVOCE;ŠLEA„EVTLEN(A5),A6†RESTORE�POINTER�TO�USERS�PARAMETER�BLOCKŠBRA„SPLACK�RETURN�FROM�EVENT*)*‚HERE�IF�TO�OUTPUT�DEVICE-FORMS�ID�TABLE*-QUE110„LEA„MSG2-DATASG(A4),A6�HEADING�MESSAGEŠMOVE.L�#66,D0�MESSAGE�LENGTHŠBSR„OUTMSG�OUTPUT�THE�HEADINGŠCLR.L‚D7‘CLEAR�FOR�USEŠCLR.L‚D1‘CLEAR�COUNTER/ŠLEA„FMSPKT-DATASG(A4),A0�FMSINT�PACKET�ADDRESS&ŠMOVE.B�#RDCMD,FMSCMD(A0)‚READ�COMMAND5QUE120„LEA„QBUF-DATASG(A4),A2�RETURNED�BUFFER�ADDRESSŠMOVE.7 L�A2,FMSBUF(A0)†TO�PACKET+ŠMOVE.L�D1,FMSREC(A0)†RECORD�NUMBER�TO�READ$ŠMOVE.W�#1,FMSRECN(A0)…READ�1�RECORDŠBSR„FMSINT�GO�READ�A�RECORDŠBNE.S‚QUE160�ERROR�RETURN%ŠMOVE.L�#RREC,D2‹#�ENTRIES�PER�RECORD$QUE130„MOVE.L�RDEV(A2),D0ˆGET�DEVICEŠTST.L‚D0‘ANY�DEVICE?ŠBEQ.S‚QUE160�DONE�IF�NO�DEVICE0ŠLEA„SCRATCH-DATASG(A4),A1�OUTPUT�BUFFER�ADDRESS-ŠMOVE.L�D0,(A1)+‹DEVICE�NAME�TO�OUTPUT�BUFFERŠMOVE.L�#BLANK,(A1)+‡BLANKSŠMOVE.L�RFRM(A2),(A1)+…FORMS�IDŠMOVE.L�#BLANK,(A1)+‡BLANKSŠMOVE.L�RSTAT(A2),D0‡GET�STATUS+ŠBEQ.S‚QUE140�BRANCH�IF�OK�TO�OUTPUT�STATUS ŠMOVE.L�#'WAIT',(A1)‡WAIT�STATUSŠBRA.S‚QUE150�GO�OUTPUT'QUE140„MOVE.L�#'OK‚',(A1)‡SET�OK�STATUS5QUE150„LEA„SCRATCH-DATASG(A4),A6�RESET�OUTPUT�ADDRESSŠMOVE.L�#20,D0�MESSAGE�LENGTHŠADD.L‚#1,D7ŽCOUNT�IT!ŠBSR„OUTMSG�GO�OUTPUT�THIS�DEVICE"ŠADD.L‚#RLNG,A2‹BUMP�TO�NEXT�ENTRY(ŠSUB.L‚#1,D2ŽDECREMENT�NUMBER�OF�ENTRIES"ŠBNE„QUE130�BRANCH�IF�MORE�ENTRIES'ŠADD.L‚#1,D1ŽBUMP�TO�NEXT�RECORD�NUMBERŠCMP.L‚#9,D1ŽSEE�IF�DONE"ŠBLE„QUE120�BRANCH�IF�MORE�TO�READ!QUE160„TST„D7‘OUTPUT�ANY�DEVICES?ŠBNE„QUERTN�BRANCH�IF�YES)ŠLEA„MSG3-DATASG(A4),A6�OUTPUT�NO�DEVICESŠMOVE.L�#36,D0�MESSAGE�LENGTHŠBSR„OUTMSG�GO�OUTPUTŠBRA„QUERTN�GO�RETURNŠPAGE*8* ATTRSPL RETREIVE DEVICE ATTRIBUTES FOR ORIGINAL DEVICE+*‰ASSIGNMENT�AND�SENT�THEM�TO�THE�REQUESTOR* ENTRY:D0=EVENT LENGTH*‡A4=BASE�ADDRESS�REGISTER*‡A5=EVENT�ADDRESS'*‡A6=REQUESTORS�PARAMETER�BLOCK�ADDRESS* EXIT:RETURN FROM EVENT* CALLS:FNDENTRY* ATTRSPLƒEQU„*,ŠCMP.L‚#1,EVTSES(A5)†FROM�A�SPOOLER�SUBTASK?ŠBNE.S‚ATTR05�BRANCH�IF�NOŠMOVE.L�#-1,D3�SET�SUBTASK�FLAGŠBRA.S‚ATTR25�GO�GET�ATTRIBUTES$ATTR05„CLR.L‚D3‘SET�NORMAL�TASK�FLAG*ŠMOVE.L�#-1,D4�START�SEARCH�AT�TOP�OF�FILEŠCLR.L‚D5‘ANY�FORMSŠCLR.L‚D6‘ANY�DEVICEATTR10„CLR.L‚D7‘CLEAR�FOR�USE*ŠMOVE.B�#QSTATACT,D7‡LOOK�FOR�ACTIVE�TASKSŠBSR„FNDENTRY‹GO�FIND�AN�ENTRY4ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�THIS�RECORD�NUMBERŠTST.L‚D7‘CHECK�RETURNŠBPL.S‚ATTR15�GOOD�RETURN)ŠMOVE.L�#FSTAILU,D0ˆSET�INVALID�LUN�ERRORŠBRA„ATTRTN�GO�RETURN-ATTR15„LEA„FHSFIL(A6),A2†GET�FILENAME�ADDRESS%ŠLEA„QFILEN(A1),A3†GET�QUEUE�FILENAME&ŠMOVE.L�#5,D7ŽNUMBER�OF�WORDS�TO�CHECK3ATTR20„CMP.W‚(A2)+,(A3)+ˆLOOK�FOR�MATCHING�FILENAME!ŠBNE„ATTR10�BRANCH�IF�NOT�A�MATCHŠSUB.L‚#1,D7ŽDECREMENT�COUNTER%ŠBNE„ATTR20�BRANCH�IF�MORE�TO�COMPARE** FOUND THE MATCHING ENTRY*6ATTR25„LEA„FHSPB-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS6ŠMOVE.W�#FHRATT,FHSCMD(A0)�RETREIVE�ATTRIBUTES�COMMAND'ŠMOVE.W�#USER0,FHSUSN(A0)‚USER�NUMBER�0ŠMOVE.B�#DOUT,FHSLUN(A0)ƒLUNŠTRAPƒ#3‘DO�ITŠBEQ.S‚ATTR40�GOOD�RETURNŠTST.L‚D3‘SEE�IF�FOR�A�SUBTASK#ŠBMI„ATTRTN�BRANCH�IF�SUBTASK,ERROR/ŠMOVE.L�QDEVICE(A1),FHSVOL(A0)�TRY�TO�ASSIGN�ITŠMOVE.L�#BLANK,D0ŠBLANKS+ŠLEA„FHSCLG(A0),A2†START�ADDRESS�FOR�BLANKSŠMOVE.L�#9,D2Ž#�WORDS�TO�BLANK0ATTR30„MOVE.W�D0,(A2)+‹BLANKS�TO�PARAMETER�BLOCKŠSUB.L‚#1,D2ŽDECREMENT�COUNTER$ŠBNE.S‚ATTR30�BRANCH�TIL�BLANKED�ALLŠMOVE.B�#DOUT,FHSLUN(A0)ƒLUN ŠMOVE.W�#USER0,FHSUSN(A0)‚USER�0+ŠSFHSCO�FHASGN,FOPPW,A0„ASSIGN,PUBLIC�WRITEŠCLR.W‚FHSWCD(A0)‰PROTECT�CODESŠTRAPƒ#3‘DO�IT.ŠMOVE.W�#FHRATT,FHSCMD(A0)�RETREIVE�ATTRIBUTESŠTRAPƒ#3‘DO�ITŠBNE.S‚ATTRTN�ERROR�RETURN#ŠMOVE.W�#FHCLOS,FHSCMD(A0)�CLOSE�ITŠTRAPƒ#3‘DO�ITŠBNE.S‚ATTRTN�ERROR�RETURNŠCLR.L‚D0‘SET�FOR�GOOD�RETURN*&*‚MOVE�THE�ATTRIBUTES�TO�THE�REQUESTOR*/ATTR40„MOVE.W�FHSOPT(A0),FHSOPT(A6)�DEVICE�TYPE)ŠMOVE.L�FHSVOL(A0),FHSVOL(A6)�DEVICE�NAME)ŠMOVE.L�FHSSIZ(A0),FHSSIZ(A6)�PAGE�LENGTH(ŠMOVE.W�FHSWCD(A0),FHSWCD(A6)�ATTRIBUTES+ŠMOVE.W�FHSLRL(A0),FHSLRL(A6)�RECORD�LENGTH%ŠMOVE.L�A0,A2ŽPARAMETER�BLOCK�ADDRESS!ŠMOVE.L�#SPLID,(A2)+‡MY�TASK�NAMEŠMOVE.L�#MYSES,(A2)+‡SESSION+ŠMOVE.L�A6,(A2)+‹ADDRESS�TO�START�MOVE�FROM,ŠMOVE.L�EVTTSK(A5),(A2)+ƒRECEIVING�TASK�NAME ŠMOVE.L�EVTSES(A5),(A2)+ƒSESSION+ŠMOVE.L�EVTRA0(A5),(A2)+ƒREQUESTORS�ADDRESS#ŠMOVE.L�#FHSBLN,(A2)‡LENGTH�OF�MOVE)ŠMOVE.L�#MOVELL,D0‰MOVE�LOGICAL�DIRECTIVEŠTRAPƒ#1"ATTRTN„BRA„SPLACK�RETURN,D0�IS�SETŠPAGE*9*‚GTUSERƒGET�THE�LOGGED�ON�USER�NUMBER�FROM�&S8 CT,IF�THERE*,*‚MOVES�USER�NUMBER�TO�QJOBID.W(A1)�IF�FOUND**‚USES:0�1�2�3�4�5�6�7*…D *…A�P�P�*�*�P*4GTUSER„MOVE.L�A0,A3ŽSAVE�A0-SEE�IF�NOT�REALLY�USER�0G‰LEA�SCRATCH-DATASG(A4),A0�USE�SCRATCH�FOR�THE�GET�SEG�ATTRIBUTES�PARA. ŠMOVE.L�#'&SCT',(A0)‡TARGET�TASK ŠMOVE.L�EVTSES(A5),4(A0)ƒSESSIONŠCLR.L‚8(A0)ŽNO�OPTIONS#ŠMOVE.L�#'.SCT',12(A0)…SEGMENT�NAME*ŠCLR.L‚16(A0)�DON'T�SUPPLY�LOGICAL�ADDRESSŠCLR.L‚20(A0)�N/A&ŠLEA„28(A0),A2ŠRETURNED�BUFFER�ADDRESS(ŠMOVE.L�A2,24(A0)ŠTO�THE�PARAMETER�BLOCK,ŠMOVE.L�#RCVSA,D0ŠRECEIVE�SEGMENT�ATTRIBUTESŠTRAPƒ#1‘DO�IT2ŠBNE.S‚GTUSERTŒIGNORE�THE�MOVE�LOGICAL�IF�AN�ERROR4ŠLEA„6(A2),A2‹GET�ADDRESS�OF�SEGMENT�LOGICAL�ADDRESSAŠLEA„SCRATCH-DATASG(A4),A0�USE�SCRATCH�FOR�MOVELL�PARAMETER�BLOCK9ŠMOVE.L�#'&SCT',0(A0)†TASK�NAME�THAT�CONTAINS�USER�NUMBER ŠMOVE.L�EVTSES(A5),4(A0)ƒSESSION-ŠMOVE.L�(A2),8(A0)‰ADDRESS�OF�THE�WORD�TO�GET2ŠADD.L‚#$9C,8(A0)‰ADD�IN�THE�OFFSET�TO�USER�NUMBER"ŠMOVE.L�#SPLID,12(A0)†MY�TASK�NAME ŠMOVE.L�#MYSES,16(A0)†MY�SESSION6ŠLEA„QJOBID(A1),A2†GET�ADDRESS�TO�SAVE�THE�USER�NUMBER(ŠMOVE.L�A2,20(A0)ŠTO�THE�PARAMETER�BLOCKŠMOVE.L�#2,24(A0)ŠGET�2�BYTES)ŠMOVE.L�#MOVELL,D0‰MOVE�LOGICAL�DIRECTIVEŠTRAPƒ#1‘DO�IT0GTUSERTƒMOVE.L�A3,A0ŽRESTORE�A0,IGNORE�ANY�ERRORŠRTS—RETURN�TO�CALLERŠPAGE*#*‚STRTSPL‚START�SPOOLER�FILE�OUTPUT**‚1)CREATE�A�TCB�FOR�NEW�TASK*„TASK�NAME=DEVICE�NAME8*„IF�CREATE�TCB�DOESN'T�WORK,MEANS�DEVICE�IS�BUSY,RETURN1*‚2)GRANT�A�SHARED�SEGMENT�(PROG)�TO�THE�NEW�TASK+*‚3)ALLOCATE�A�DATA�SEGMENT�TO�THE�NEW�TASK-*‚4)MOVE�START-UP�INFORMATION�TO�THE�NEW�TASK*‚5)START�THE�NEW�TASK*‚6)UPDATE�THE�QUEUE�ENTRY**‚7)WRITE�THE�ENTRY�BACK�TO�THE�QUEUE�FILE***‚ENTRY:A1=ADDRESS�OF�QUEUE�ENTRY�TO�START*ˆA4=BASE�ADDRESS�REGISTER*‚EXIT:D7=0=TASK�STARTED2*‡D7=-1=TASK�NOT�STARTED,FILE�NOT�BEING�OUTPUT�NOW*‚USES:0�1�2�3�4�5�6�7 *…D�*�*�*‰R *…A�*�P�*�P�P*‚CALLS:FMSINT„CKFORMS** STRTSPLƒEQU„* ŠMOVE.L�A3,-(A7)‹SAVE�CALLERS�A3*ŠBTSTƒ#QSTATRDY,QSTAT(A1)�READY�TO�OUTPUT?$ŠBEQ.S‚STRT10�BRANCH�IF�NO,NOT�READY3ŠBTSTƒ#QSTATWAT,QSTAT(A1)�MUST�WAIT�FOR�A�CONTINUE?3ŠBNE.S‚STRT10�BRANCH�IF�MUST�WAIT-CANNOT�OUTPUT�NOW,ŠBTSTƒ#QSTATFRM,QSTAT(A1)�MATCHING�FORMS�ID?6ŠBNE.S‚STRT10�BRANCH�IF�NOT�MATCHING,CANNOT�OUTPUT�NOW(ŠBSR„CKFORMSŒGO�SEE�IF�MATCHING�FORMS�IDŠTST„D7‘IS�IT?1ŠBMI„STRT40�BRANCH�IF�NO�-�STATUS�=�WAIT�062184�4+ŠLEA„SCRATCH-DATASG(A4),A0�USE�SCRATCH�AREA?ŠMOVE.L�A0,A2ˆADDRESS�TO�USE�FOR�SETTING�UP�THE�PARAMETER�BLOCK/ŠMOVE.L�QDEVICE(A1),(A2)+‚TASK�NAME=DEVICE�NAMEŠMOVE.L�#MYSES,(A2)+‡SESSION�1'ŠMOVE.W�#CTOPMS,(A2)+†MONITOR�SPECIFIEDŠMOVE.L�#SPLID,(A2)+‡MONITOR=MEŠMOVE.L�#MYSES,(A2)+‡SESSION�1#ŠMOVE.B�#100,(A2)+‰INITIAL�PRIORITY#ŠMOVE.B�#255,(A2)+‰HIGHEST�PRIORITYCŠMOVE.W�#$8800,(A2)+„SYSTEM�TASK+EXEC�WILL�FIX�UP�THE�ENTRY�ADDRESS(ŠLEA„TSKSTRT(PC),A3…GET�TASK�ENTRY�POINT2ŠCMP.L‚#0,A4ŽARE�WE�RUNNING�WITH�MMU?(A4=0�IF�MMU)=ŠBNE.S‚STRT07‰BRANCH�IF�NO�MMU,ENTRY�ADDRESS�IS�CORRECT�AS�IS*=*ˆHAVE�AN�MMU,MUST�FIX�UP�ENTRY�ADDRESS�TO�BYPASS�THE�LOGICAL*ˆSTART�ADDRESS�OF�THIS�SEGMENT**ŠMOVE.L�#ENDATA,D7‰GET�END�OF�DATA�SEGMENT!ŠDIVUƒ#255,D7ŒGET�NUMBER�OF�PAGESŠCLR.L‚D2‘CLEAR�FOR�USE%ŠMOVE.W�D7,D2ŽGET�THE�NUMBER�OF�PAGESŠSWAPƒD7‘SEE�IF�A�REMAINDERŠTST.W‚D7‘A�REMAINDER?$ŠBEQ.S‚STRT05�BRANCH�IF�NO�REMAINDER*ŠADD.W‚#1,D2ŽA�REMAINDER,ADJUST�#�OF�PAGESSTRT05„MULUƒ#256,D2ŒGET�LENGTH/ŠSUB.L‚D2,A3ŽACTUAL�ENTRY�POINT�OF�SPAWNED�TASK'STRT07„MOVE.L�A3,(A2)+‹TASK�ENTRY�POINTŠCLR.W‚(A2)+ŽUSER�ID=0!ŠMOVE.L�#CRTCB,D0ŠCREATE�TCB�CODEŠTRAPƒ#1‘CREATE�A�TCB%ŠBEQ.S‚STRT20�BRANCH�IF�A�GOOD�RETURN)STRT10„MOVE.L�(A7)+,A3‹RESTORE�CALLERS�A3*ŠMOVE.L�#-1,D7�SET�OUTPUT�NOT�STARTED�FLAGŠRTS—RETURN�TO�CALLER*-* GRANT SHARED SEGMENT ACCESS TO THE NEW TASK*8STRT20„LEA„SCRATCH-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS;ŠMOVE.L�A0,A2ŒADDRESS�TO�USE�FOR�SETTING�UP�PARAMETER�BLOCK*ŠMOVE.L�#SHRSEG,D0‰SHARE�SEGMENT�DIRECTIVE:ŠMOVE.L�QDEVICE(A1),(A2)+‚TASK�NAME�TO�RECEIVE�THE�SEGMENTŠMOVE.L�#MYSES,(A28 )+‡SESSION�1&ŠCMP.L‚#0,A4ŽHAVE�AN�MMU?(YES�IF�A4=0)6ŠBNE.S‚STRT22�BRANCH�IF�NO�MMU,USE�PHYSICAL�ADDRESSING4ŠMOVE.W�#$0,(A2)+ŠHAVE�AN�MMU,USE�LOGICAL�ADDRESSINGŠBRA.S‚STRT23�CONTINUE;STRT22„MOVE.W�#$2000,(A2)+‡LOGICAL�ADDRESS=PHYSICAL�ADDRESS?STRT23„MOVE.W�#SGATRO+SGATGS,(A2)+�READ�ONLY,GLOBALLY�SHAREABLE"ŠMOVE.L�#'SPLP',(A2)+†SEGMENT�NAME#ŠCLR.L‚(A2)+ŽCLEAR‚START�OF�SEGMENT!ŠCLR.L‚(A2)+ŽCLEAR�SEGMENT�LENGTHŠTRAPƒ#1‘DO�IT!ŠBNE„STRT30�BRANCH�IF�CAN'T�SHARE**‚ALLOCATE�A�DATA�SEGMENT*2ŠLEA„SCRATCH-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS'ŠMOVE.L�#GTSEG,D0ŠGET�SEGMENT�DIRECTIVE2ŠMOVE.W�#SGOPPA,SEGOPT(A0)�PHYSICAL�ADDRESS�OPTION$ŠCLR.W‚SEGATT(A0)‰READ/WRITE�SEGMENT'ŠMOVE.L�#'SPLD',SEGNAM(A0)�SEGMENT�NAME.ŠMOVE.L�A4,SEGLAD(A0)†START�ADDRESS�OF�SEGMENT#ŠMOVE.L�#ENDSPLD,D1ˆGET�END�ADDRESS$ŠMOVE.L�D1,SEGLEN(A0)†SEGMENT�LENGTHŠTRAPƒ#1‘DO�IT'ŠBNE.S‚STRT30�BRANCH�IF�CANNOT�ALLOCATEDŠMOVE.L�A0,REGS-DATASG(A4)�SAVE�THE�PHYSICAL�ADDRESS�OF�THIS�SEGMENT*D*‚ALLOCATE�A�DATA�SEGMENT�FOR�READ/WRITE�BUFFERS�IF�NON-SPOOLER�FILE*0ŠMOVE.L�#-1,A0�SET�UP�FOR�MAYBE�NOT�THIS�SEGMENT3ŠMOVE.B�QFILEN(A1),D0†GET�1ST�CHARACTER�OF�FILENAME'ŠCMP.B‚#SPOOLF,D0‰DOING�A�SPOOLER�FILE?&ŠBEQ.S‚STRT25�BRANCH�IF�A�SPOOLER�FILE2ŠLEA„SCRATCH-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS'ŠMOVE.L�#'SPLB',SEGNAM(A0)�SEGMENT�NAME(ŠMOVE.L�#BUFADR,SEGLAD(A0)�START�ADDRESS!ŠMOVE.L�#BUFLNG,SEGLEN(A0)�LENGTH'ŠMOVE.L�#GTSEG,D0ŠGET�SEGMENT�DIRECTIVEŠTRAPƒ#1‘DO�IT*ŠBNE.S‚STRT30�BRANCH�IF�CANNOT�ALLOCATE�IT*&*‚MOVE�THE�QUEUE�ENTRY�TO�THE�NEW�TASK*JSTRT25„MOVE.L�A0,REGS4-DATASG(A4)�SAVE�THE�PHYSICAL�ADDRESS�OF�THE�SEGMENT:ŠLEA„SCRATCH-DATASG(A4),A0�RESTORE�PARAMETER�BLOCK�ADDRESSŠMOVE.L�A0,A2ŽADDRESS�TO�USE)ŠMOVE.L�#MOVELL,D0‰MOVE�LOGICAL�DIRECTIVE!ŠMOVE.L�#SPLID,(A2)+‡MY�TASK�NAMEŠMOVE.L�#MYSES,(A2)+‡MY�SESSION,ŠLEA„QBUF-DATASG(A4),A3�GET�THE�FROM�ADDRESSŠMOVE.L�A3,(A2)+‹FROM�ADDRESS/ŠMOVE.L�QDEVICE(A1),(A2)+‚DESTINATION�TASK�NAMEŠMOVE.L�#MYSES,(A2)+‡SESSION/ŠMOVE.L�REGS-DATASG(A4),A3�GET�DESINATION�START+ŠADD.L‚#QBUFS,A3ŠACTUAL�DESTINATION�ADDRESS$ŠMOVE.L�A3,(A2)+‹DESTINATION�ADDRESS ŠMOVE.L�#QLNG,(A2)+ˆQUEUE�LENGTHŠTRAPƒ#1‘DO�IT)STRT30„BNE.S‚STRTER�BRANCH�IF�CANNOT�MOVE**‚START�THE�TASK*&ŠMOVE.L�#START,D0ŠSTART�TASK�DIRECTIVEŠMOVE.L�A0,A2ŽADDRESS�TO�USE,ŠMOVE.L�QDEVICE(A1),(A2)+‚TASK�NAME�TO�STARTŠMOVE.L�#MYSES,(A2)+‡SESSIONDŠMOVE.W�#STOPMS+STOPRG,(A2)+�MONITOR�SPECIFIEDAND�REGISTERS�SUPPLIEDŠMOVE.L�#SPLID,(A2)+‡MONITOR=MEŠMOVE.L�#MYSES,(A2)+‡SESSIONŠTRAPƒ#1‘DO�IT%ŠBNE.S‚STRTER�BRANCH�IF�DID�NOT�START**‚UPDATE�THE�QUEUE�ENTRY*/ŠBCLRƒ#QSTATRDY,QSTAT(A1)�CLEAR�READY�TO�OUTPUT<ŠBSETƒ#QSTATOUT,QSTAT(A1)�SET�BEING�OUTPUT�TO�SPOOLER�DEVICE5STRT35„LEA„FMSPKT-DATASG(A4),A0�FMSINT�PACKET�ADDRESS*ŠMOVE.B�#REPLCMD,FMSCMD(A0)�REPLCE�COMMAND2ŠMOVE.L�CURREC-DATASG(A4),FMSREC(A0)�RECORD�NUMBER*ŠLEA„QBUF-DATASG(A4),A3�GET�BUFFER�ADDRESS$ŠMOVE.L�A3,FMSBUF(A0)†BUFFER�ADDRESSŠBSR„FMSINT�DO�THE�FILE�REPLACE#ŠMOVE.L�(A7)+,A3‹RESTORE�CALLERS�A3ŠCLR.L‚D7‘SET�GOOD�RETURNŠRTS—RETURN�TO�CALLER** ERROR-TERMINATE THE NEW TASK*@STRTER„LEA„SCRATCH-DATASG(A4),A0�RESTORE�PARAMETER�BLOCK�ADDRESS*ŠMOVE.L�#TERMT,D0ŠTERMINATE�TASK�DIRECTIVE"ŠMOVE.L�QDEVICE(A1),(A0)ƒTASK�NAMEŠMOVE.L�#MYSES,4(A0)‡SESSIONŠTRAPƒ#1‘DO�IT!ŠBRA„STRT10�RETURN�WITH�ERROR�SET*7*‰THIS�ROUTINE�IS�USED�TO�SET�THE�QUEUE�FIL'S�STATUS�TO>*‰WAIT�.�THIS�WILL�OCCUR�IF�THE�FILE�IS�SENT�TO�A�PRINTER�THAT*‰IS�IN�THE�WAIT�STATE.* *™062184�41STRT40„BSETƒ#QSTATWAT,QSTAT(A1)�WAIT�FOR�CONTINUEŠBRA„STRT35�UPDATE�THE�RECORDŠPAGE*2*‚FNDENTRY‚FIND�AN�ENTRY�IN�THE�SPOOLER�QUEUE�FILE+*ŒNOT�USED�TO�FIND�THE�RESERVED�RECORDS�0-9-*ŒIF�D4=-1�ON�ENTRY,IT�IS�CHANGED�TO�10,WHICH *ŒIS�THE�1ST�ACTUAL�QUEUE�ENTRY.5*‚ENTRY:D7.B=BIT�NUMBER�TO�TEST�FOR�EQUALITY�IN�QSTAT*ˆD7.L=-1=DON'T�CHECK�QSTAT*ˆD6=DEVICE�TO�SEARCH�FOR*ˆD6=0=ANY�DEVICE*ˆD5=FORMS�ID�TO�SEARCH�FOR*ˆD5=0=ANY�FORMS�ID'*ˆD4=RECORD�#-1�TO�START�SEARCHING�FROM*ˆD4=-9 1=START�AT�TOP�OF�FILE*ˆA4=BASE�ADDRESS�REGISTER*‚EXIT:D7=-1=AN�ENTRY�NOT�FOUND*‡D7=0=ENTRY�FOUND*‡A1=RECORD�ADDRESS(QBUF)*‡CURREC=LOGICAL�RECORD�NUMBER*‚USES:0�1�2�3�4�5�6�7 *…D�*‡P�P�P�R *…A�*�R…P*‚CALLS:FMSINT**FNDENTRY‚EQU„*/ŠLEA„FMSPKT-DATASG(A4),A0�FMSINT�PACKET�ADDRESS&ŠMOVE.B�#RDCMD,FMSCMD(A0)‚READ�COMMAND ŠCMP.L‚#-1,D4�IS�THIS�RECRD�#-1?ŠBNE.S‚FNDE10�BRANCH�IF�NO6ŠMOVE.L�#9,D4ŽFORCE�RECORD�#10‚(1�WILL�BE�ADDED�LATER)8FNDE10„MOVE.L�D4,FMSREC(A0)†RECORD�NUMBER�-1�TO�START�AT.ŠMOVE.W�#1,FMSRECN(A0)…READ�1�RECORD�AT�A�TIME&ŠLEA„QBUF-DATASG(A4),A1�BUFFER�ADDRESS8ŠMOVE.L�A1,FMSBUF(A0)†BUFFER�ADDRESS�FOR�RETURNED�RECORD7FNDE20„ADD.L‚#1,FMSREC(A0)†ACTUAL�RECORD�NUMBER�TO�READŠBSR„FMSINT�GO�DO�THE�READŠBNE.S‚FNDERR�ERROR�RETURN(ŠCMP.B‚#ISTARN,FMSTAT(A0)�RECORD�EXISTS?ŠBNE.S‚FNDE30�BRANCH�IF�YES.FNDERR„MOVE.L�#-1,D7�SET�RECORD�NOT�FOUND�FLAGŠRTS—RETURN�TO�CALLER0FNDE30„LEA„QBUF-DATASG(A4),A1�GET�RECORD�ADDRESS"ŠTST„D5‘LOOK�FOR�A�FORMS�ID�MATCH?ŠBEQ.S‚FNDE40�BRANCH�IF�NO#ŠCMP.L‚QFORMS(A1),D5†SAME�FORMS�ID?)ŠBNE.S‚FNDE20�BRANCH�IF�NO,GO�SEARCH�MORE'FNDE40„TST„D6‘LOOK�FOR�MATCHING�DEVICE?ŠBEQ.S‚FNDE50�BRANCH�IF�NO"ŠCMP.L‚QDEVICE(A1),D6…SAME�DEVICE?-ŠBNE„FNDE20�BRANCH�IF�NOT�A�MATCH,SEARCH�MORE&FNDE50„TST.L‚D7‘LOOK�FOR�A�STATUS�BIT?ŠBMI.S‚FNDE60�BRANCH�IF�NO&ŠBTST.B�D7,QSTAT(A1)‡STATUS=BIT�IN�D7?"ŠBEQ„FNDE20�BRANCH�IF�NOT�THE�SAME,FNDE60„CLR.L‚D7‘CORRECT�ENTRY-SET�FOUND�FLAG<ŠMOVE.L�FMSREC(A0),CURREC-DATASG(A4)�SAVE�THIS�RECORD�NUMBERŠRTS—RETURN�TO�CALLERŠPAGE*3*‚INSRTREC‚INSERT�A�QUEUE�ENTRY�INTO�THE�QUEUE�FILE2*ŒUSED�FOR�BOTH�QUEUE�ENTRIES�AND�RESERVED�RECORDS**‚ENTRY:A1=RECORD�ADDRESS*ˆA4=BASE�ADDRESS�REGISTER"*ˆD7=RECORD�NUMBER�TO�INSERT�AFTER*‚EXIT:D7=0=GOOD�INSERT.*‡D7=�ANYTHING�ELSE=IOS�ERROR�CODE�FROM�INSERT*‚USES:0�1�2�3�4�5�6�7*…D�*�R *…A�*�P…P*‚CALLS:FMSINT**INSRTREC‚EQU„*,ŠLEA„FMSPKT-DATASG(A4),A0�FMS�PACKET�ADDRESS1ŠSUB.L‚#1,D7ŽADJUST�RECORD�NUMBER�FOR�GOOD�INSERT#ŠMOVE.L�D7,FMSREC(A0)†RECORD�NUMBERŠCLR.L‚D7‘SET�FOR�GOOD�RETURN$ŠMOVE.L�A1,FMSBUF(A0)†RECORD�ADDRESS+ŠMOVE.B�#INSRTCMD,FMSCMD(A0)�INSERT�COMMANDŠBSR„FMSINT�DO�THE�INSERTŠBEQ.S‚INSRTN�GOOD�RETURNŠMOVE.L�D0,D7ŽERROR�CODEINSRTN„RTS—RETURN�TO�CALLER****/*‚RPLREC‚REPLACE�QUEUE�ENTRY�BACK�INTO�THE�FILE2*ŠUSED�FOR�BOTH�QUEUE�ENTRIES�AND�RESERVED�RECORDS*‚ENTRY:A1=RECORD�ADDRESS*ˆA4=BASE�ADDRESS�REGISTER*ˆCURREC=RECORD�NUMBER*‚EXIT:TO�CALLER*‚USES:0�1�2�3�4�5�6�7*…D�* *…A�*�P…P*‚CALLS:FMSINT** RPLREC„EQU„*/ŠLEA„FMSPKT-DATASG(A4),A0�FMSINT�PACKET�ADDRESS+ŠMOVE.B�#REPLCMD,FMSCMD(A0)�REPLACE�COMMAND2ŠMOVE.L�CURREC-DATASG(A4),FMSREC(A0)�RECORD�NUMBER$ŠMOVE.L�A1,FMSBUF(A0)†RECORD�ADDRESSŠBSR„FMSINT�DO�THE�REPLACEŠRTS—RETURN�TO�CALLERŠPAGE*6*‚DELENTRY�DELETE�AN�ENTRY�FROM�THE�SPOOLER�QUEUE�FILE2*‹USED�FOR�BOTH�QUEUE�ENTRIES�AND�RESERVED�RECORDS&*‚ENTRY:CURREC=RECORD�NUMBER�TO�DELETE*ˆA4=BASE�ADDRESS�REGISTER*‚EXIT:D7=0=DELETED,GOOD�RETURN *‡D7=-1=NOT�DELETED,ERROR�RETURN*‚USES:0�1�2�3�4�5�6�7*…D�*�R*…A�P‡P* CALLS:FMSINT**DELENTRY‚EQU„*ŠMOVE.L�A0,-(A7)‹SAVE�A0/ŠLEA„FMSPKT-DATASG(A4),A0�FMSINT�PACKET�ADDRESS)ŠMOVE.B�#DELCMD,FMSCMD(A0)�DELETE�COMMAND<ŠMOVE.L�CURREC-DATASG(A4),FMSREC(A0)�RECORD�NUMBER�TO�DELETE&ŠMOVE.W�#1,FMSRECN(A0)…DELETE�1�RECORDŠBSR„FMSINT�DO�THE�DELETEŠBNE.S‚DELE30�ERROR�RETURNŠTST.B‚FMSTAT(A0)‰GOOD�RETURN?ŠBNE.S‚DELE20�GO�CHECK�STATUS DELE10„CLR.L‚D7‘GOOD�RETURN�FLAGŠMOVE.L�(A7)+,A0‹RESTORE�A0ŠRTS—RETURN�TO�CALLER&DELE20„MOVE.B�FMSTAT(A0),D0†GET�STATUS'ŠCMP.B‚#ISTAEOF,D0ˆDELETED�LAST�RECORD?.ŠBNE.S‚DELE30�BRANCH�IF�SOME�OTHER�THING,ERRORL„SUB.L�#1,CURREC-DATASG(A4)�DELETED�LAST�RECORD,UPDATE�CURRENT�RECORD�NUMBERŠBRA„DELE10�BRANCH,OK�TO�DO%DELE30„MOVE.L�#-1,D7�SET�ERROR�RETURNŠMOVE.L�(A7)+,A0‹RESTORE�A0ŠRTS—RETURN�TO�CALLERŠPAGE**‚DELFILE�DELETE�A�SPOOLER�FILE!*‚ENTRY:A1=ADDRESS�OF�QUEUE�ENTRY*ˆA4=BASE�ADDRESS�REGISTER*‚EXIT:TO�CALLER*‚USES:0�1�2�3�4�5�6�7*…9 D�R *…A�*�P�*�*�P** DELFILEƒEQU„*0ŠLEA„FHSPB-DATASG(A4),A0�USE�FHS�PARAMETER�BLOCK.ŠMOVE.W�#FHDELT,FHSCMD(A0)�DELETE�FILE�COMMAND8ŠMOVE.L�#6,D0ŽLENGHT�OF�MOVE�FILENAME�TO�PARAMETER�BLOCK+ŠLEA„QVOL(A1),A2ˆSTART�ADDRESS�OF�MOVE�FROM+ŠLEA„FHSVOL(A0),A3†START�ADDRESS�OF�MOVE�TO2DELF10„MOVE.L�(A2)+,(A3)+ˆMOVE�QUALIFIEDE�FILENAMEŠSUB.L‚#1,D0ŽDECREMENT�COUNTERŠBNE.S‚DELF10�BRANCH�TIL�MOVED'ŠMOVE.W�#$0000,FHSWCD(A0)‚PROTECT�CODES"ŠMOVE.B�FHSFIL(A0),D0†GET�FILENAMEŠCMP.B‚#SPOOLF,D0‰SPOOLER�FILE?ŠBEQ.S‚DELF20�BRANCH�IF�YES,ŠCLR.L‚D0‘NOT�A�SPOOLER�FILE,DON'T�DELETE�ITŠRTS—RETURN�TO�CALLERDELF20„TRAPƒ#3‘DELETE�THE�FILE(ŠRTS—RETURN,CALLER�WILL�CHECK�FOR�ERRORSŠPAGE*%*‚DOQEVT‚QUEUE�AN�EVENT�TO�A�SUB-TASK*‚EVENT�CODE=33 *‚LENGHT=4*‚MESSAGE=CONTENTS�OF�D7.W*‚ENTRY:A1=QUEUE�ENTRY�ADDRESS*ˆA4=BASE�ADDRESS�REGISTER(*ˆD7.W=MESSAGE‚(0=CONTINUE,-1=TERMINATE)*‚EXIT:D7=0=GOOD�RETURN*‡D7=-1=ERROR�RETURN*‚USES:0�1�2�3�4�5�6�7*…D�*�R *…A�*�Pƒ*�P** DOQEVT„EQU„*?ŠLEA„SCRATCH-DATASG(A4),A0�USE�SCRATCH�BUFFER�TO�SEND�THE�EVENT'ŠMOVE.L�#QEVNT,D0ŠQUEUE�EVENT�DIRECTIVEŠMOVE.L�A0,A3ŽGET�START�ADDRESS%ŠADD.L‚#18,A3�POINT�TO�START�OF�EVENT5ŠMOVE.L�QDEVICE(A1),QEVTSK(A0)�TASK�TO�GET�THIS�EVENT!ŠMOVE.L�#MYSES,QEVSES(A0)‚SESSIONŠCLR.W‚QEVOPT(A0)‰NO�OPTIONS#ŠMOVE.L�A3,QEVPKT(A0)†EVENT�ADDRESS!ŠCLR.L‚QEVIAD(A0)‰USE�DEFAULT�ASRŠMOVE.B�#4,(A3)+‹EVENT�LENGTH$ŠMOVE.B�#SPLECDE,(A3)+…CODE�33�EVENTŠMOVE.W�D7,(A3)ŒEVENT�MESSAGEDOQ10…TRAPƒ#1‘QUEUE�THIS�EVENT$ŠBEQ.S‚DOQ20ŽBRANCH�IF�A�GOOD�RETURNŠCMP.B‚#RTCDTFUL,D0‡ASQ�FULL?"ŠBEQ„DOQ10ŽBRANCH�IF�YES,TRY�AGAINŠMOVE.L�#-1,D7�SET�ERROR�RETURNŠRTS—RETURN�TO�CALLERDOQ20…CLR.L‚D7‘GOOD�RETURNŠRTS—RETURN�TO�CALLERŠPAGE*"*‚MTCDF�MATCH�DEVICE�WITH�FORMS�ID*&*‚ENTRY�D7=0�ENTRY�FROM�CLOSE�OR�PRINT6*‚LOOKS�THRU�THE�RESERVED�RECORDS�OF�THE�SPOOLER�QUEUE8*‚FOR�A�MATCHING�DEVICE.�IF�THE�MATCHING�DEVICE�IS�FOUND8*‚THE�FORMS�ID�IS�CHECKED.�IF�IT�ALSO�MATCHES,THE�STATUS9*‚BITS�ARE�SET�TO�DON'T�WAIT�FOR�A�CONTINUE,OK�TO�OUTPUT.5*‚IF�THE�FORMS�ID�DOES�NOT�MATCH,THE�STATUS�IS�SET�TO:*‚WAIT�AND�NOT�MATCHING.�IF�THE�DEVICE�DOEN'T�EXIST�IN�THE5*‚RECORDS,IT�IS�ENTERED�WITH�FORMS�ID=STND.�THE�FORMS(*‚ID�IS�THEN�CHECKED�AS�DESCRIBED�ABOVE.*!*‚ENTRY�D7=-1‚ENTRY�FROM�CONTINUE?*‚ALSO�LOOKS�FOR�MATCHING�DEVICE�AND�FORMS�ID.�IF�NOT�MATCHING,:*‚SETS�WAIT�AND�RETURNS.�IF�MATCHING,CHECKS�TO�SEE�IF�THIS>*‚CONTINUE�WAS�AFTER�A�FORMS�CHANGE.�IF�YES,SETS�DEVICE�STATUSB*‚TO�OK�TO�OUTPUT�AND�RETURNS.�IF�NOT�AFTER�A�FORMS�CHANGE,RETURNS!*‚WITH�D7=1,IGNORE�THIS�CONTINUE.**‚ENTRY:A1=QUEUE�ENTRY�ADDRESS*ˆA4=BASE�ADDRESS�REGISTER*ˆD7=0=CALLED�BY�CLOSE�OR�PRINT*ˆD7=-1=CALLED�BY�CONTINUE*‚EXIT:D7=0=GOOD�RETURN9*‡D7=-1=DEVICE�NOT�FOUND�OR�NO�ROOM�TO�ENTER�A�NEW�DEVICE4*‡D7=1=IGNORE�THIS�CONTINUE,NOT�AFTER�A�FORMS�CHANGE**‚USES:0�1�2�3�4�5�6�7 *…D�*�*�*�*‡R *…A�*�P�*�*�P*‚CALLS:RDRES‚RPLRES** MTCDF…EQU„*ŠCLR.L‚D1‘RECORD�NUMBER�TO�READ)ŠLEA„QSTAT(A1),A3‡GET�STATUS�BYTE�ADDRESS)MTC10…BSR„RDRESŽGO�READ�A�RESERVED�RECORD%ŠMOVE.L�#RREC,D2‹#�ENTRIES�PER�RECORD*MTC20…MOVE.L�RDEV(A2),D3ˆGET�A�DEVICE�NAMEŠTST.L‚D3‘ANY�DEVICE?,ŠBEQ.S‚MTC90ŽBRANCH�IF�END�OF�LIST-NO�DEVICE&ŠCMP.L‚QDEVICE(A1),D3…MATCHING�DEVICE?ŠBEQ.S‚MTC50ŽBRANCH�IF�YES#ŠSUB.L‚#1,D2ŽDECREMENT�#�OF�ENTRIES-ŠBEQ.S‚MTC30ŽBRANCH�IF�MUST�READ�A�NEW�RECORD"ŠADD.L‚#RLNG,A2‹BUMP�TO�NEXT�ENTRY ŠBRA„MTC20ŽGO�LOOK�AT�NEXT�ENTRY%MTC30…ADD.L‚#1,D1ŽBUMP�TO�NEXT�RECORDŠCMP.L‚#8,D1ŽREAD�EVERY�RECORD?!ŠBLE„MTC10ŽBRANCH�IF�MORE�TO�READ1MTC40…MOVE.L�#-1,D7�SET�NO�ROOM,OR�INVALID�DEVICEŠRTS—RETURN�TO�CALLER*!*‚HERE�IF�FOUND�A�MATCHING�DEVICE*-MTC50…MOVE.L�RFRM(A2),D3ˆGET�CURRENT�FORMS�IDŠCMP.L‚QFORMS(A1),D3†SAME?#ŠBNE.S‚MTC70ŽBRANCH�IF�NOT�THE�SAMEŠTST„D7‘SENT�HERE�BY�CONTINUE?ŠBMI.S‚MTC80ŽBRANCH�IF�YES)MTC55…BCLRƒ#QSTATWAT,(A3)…CLEAR�WAIT�FLAG'ŠBCLRƒ#QSTATFRM,(A3)…CLEAR�NOT�MATCHINGMTC60…CLR.L‚D7‘SET�GOOD�RETURNŠRTS—RETURN�TO�CALLER*/*‚HERE�IF�NOT�MATCHING�FORMS�ID-SE: T�STATUS�BITS*%MTC70…BSETƒ#QSTATWAT,(A3)…SET�TO�WAIT%ŠBSETƒ#QSTATFRM,(A3)…SET�NOT�MATCHINGŠBRA„MTC60ŽGO�RETURN***‚HERE�IS�MATCHING�FORMS�AND�FROM�CONTINUEç+*‚RDRES‚READ�RESERVED�RECORDS�IN�QUEUE�FILE *‚ENTRY:D1=RECORD�NUMBER�TO�READ*ˆA4=BASE�ADDRESS�REGISTER*‚EXIT:A2=RECORD�ADDRESS*‚USES:0�1�2�3�4�5�6�7*…D�*�R *…A�*ƒRƒP*‚CALLS:FMSINT** RDRES…EQU„*1ŠLEA„SCRATCH-DATASG(A4),A2�USE�SCRATCH�FOR�BUFFER,ŠLEA„FMSPKT-DATASG(A4),A0�FMS�PACKET�ADDRESSŠMOVE.B�#RDCMD,FMSCMD(A0)‚READ$ŠMOVE.L�D1,FMSREC(A0)†RECORD�TO�READ$ŠMOVE.W�#1,FMSRECN(A0)…READ�1�RECORD$ŠMOVE.L�A2,FMSBUF(A0)†BUFFER�ADDRESSŠBSR„FMSINT�DO�THE�READŠRTS—RETURN�TO�CALLERŠPAGE*.*‚CKFORMS‚SEE�IF�A�FORMS�CHANGE�WAS�ISSUED�BUT *‹NOT�A�CONTINUE�FOR�THIS�DEVICE*‚ENTRY:A1=QUEUE�ENTRY�ADDRESS*ˆA4=BASE�ADDRESS�REGISTER*‚EXIT:D7=0=OK+*‡D7=-1=DON'T�OUTPUT,NO�CONTINUE�WAS�ISSUED*‚USES:0�1�2�3�4�5�6�7 *…D�*�*�*‰R *…A�*�P�*ƒP *‚CALLS:RDRES** CKFORMSƒEQU„*ŠCLR.L‚D1‘RECORD�NUMBER�TO�READ*CKFR10„BSR„RDRESŽGO�READ�1�RESERVED�RECORD%ŠMOVE.L�#RREC,D2‹#�ENTRIES�PER�RECORD$CKFR20„MOVE.L�RDEV(A2),D3ˆGET�DEVICEŠTST.L‚D3‘ANY�DEVICE?-ŠBEQ.S‚CKFR40�BRANCH�IF�END�OF�LIST-NO�DEVICE"ŠCMP.L‚QDEVICE(A1),D3…SAME�DEVICE? ŠBEQ.S‚CKFR50�BRANCH�IF�THE�SAME#ŠSUB.L‚#1,D2ŽDECREMENT�#�OF�ENTRIES-ŠBEQ.S‚CKFR30�BRANCH�IF�MUST�READ�NEXT�RECORD"ŠADD.L‚#RLNG,A2‹BUMP�TO�NEXT�ENTRYŠBRA„CKFR20�GO�CHECK�IT-CKFR30„ADD.L‚#1,D1ŽBUMP�TO�NEXT�RECORD�NUMBERŠCMP.L‚#8,D1ŽREAD�ALL?"ŠBLE„CKFR10�BRANCH�IF�NO,READ�NEXT%CKFR40„MOVE.L�#-1,D7�SET�ERROR�RETURN ŠRTS—RETURN&CKFR50„MOVE.L�RFRM(A2),D3ˆGET�FORMS�IDŠCMP.L‚QFORMS(A1),D3†SAME?"ŠBNE„CKFR40�BRANCH�IF�NOT�THE�SAMEŠTST.L‚RSTAT(A2)ŠOK�TO�OUTPUT?)ŠBMI„CKFR40�BRANCH�IF�NO,SET�ERROR�RETURNŠCLR.L‚D7‘SET�GOOD�RETURN ŠRTS—RETURNŠPAGE/*‚OUTENT‚OUTPUT�A�SPOOLER�QUEUE�ENTRY�TO�LDFLUN*ŠCALLED�BY�QUESPL*‚ENTRY:A1=ADDRESS�OF�ENTRY*ˆA4=BASE�ADDRESS�REGISTER*ˆD2=#ENTRIES�ALREADY�OUTPUT*‚EXIT:REGISTERS�PRESERVED*‚CALLS:OUTMSG„BDCONV„ODATCONV** OUTENT„EQU„*.ŠMOVEM.L�D0-D2/A0-A6,-(A7)�SAVE�USED�REGISTERSŠTST„D2‘OUTPUT�ANYTHING�YET?ŠBNE.S‚OUTE00�BRANCH�IF�YES+ŠLEA„MSG4-DATASG(A4),A6�GET�HEADING�ADDRESSŠMOVE.L�#63,D0�MESSAGE�LENGTH!ŠBSR„OUTMSG�GO�OUTPUT�THE�HEADING>OUTE00„LEA„SCRATCH-DATASG(A4),A0�USE�SCRATCH�FOR�OUTPUT�BUFFER)ŠMOVE.L�A1,A2ŽSAVE�START�ADDRESS�OF�ENTRY6ŠMOVE.L�QDEVICE(A1),(A0)+‚DEVICE: �NAME�TO�OUTPUT�BUFFERŠMOVE.B�#'�',(A0)+‰BLANK!ŠMOVE.B�QFORMS(A1),(A0)+ƒFORMS�IDG‰MOVE.B�QFORMS+1(A1),(A0)+�MORE�FORMS�ID,A�BYTE�AT�A�TIME,ODD�ADDRESSES(ŠMOVE.B�QFORMS+2(A1),(A0)+�MORE�FORMS�ID(ŠMOVE.B�QFORMS+3(A1),(A0)+�MORE�FORMS�IDŠMOVE.B�#'�',(A0)+‰BLANKŠCLR.L‚D0‘CLEAR�FOR�USE9ŠMOVE.W�QJOBID(A1),D0†GET�1ST�HALF�OF�JOB�ID(USER�NUMBER)ŠBSR„BDCONV�CONVERT�TO�DECIMALŠTST.L‚D0‘SEE�IF�USER�ZEROŠBNE.S‚OUTE02�BRANCH�IF�NOT+ŠMOVE.B�#$30,D0ŒIS�USER�ZERO,FORCE�ONE�ZERO5OUTE02„MOVE.L�#4,D1ŽNUMBER�OF�BYTES�TO�CHECK�FOR�NULLOUTE01„ROL.L‚#8,D0ŽGET�A�CHARŠTST.B‚D0‘NULL? ŠBNE.S‚OUTE03�BRANCH�IF�NOT�NULL%ŠMOVE.B�#$20,D0ŒFORCE�A�BLANK�IF�NULL,OUTE03„MOVE.B�D0,(A0)+‹SAVE�IN�OUTPUT�BUFFERŠSUB.L‚#1,D1ŽDECREMENT�COUNTER"ŠBNE.S‚OUTE01�BRANCH�IF�MORE�TO�DOŠCLR.L‚D0‘CLEAR�FOR�USE.ŠMOVE.W�QJOBID+2(A1),D0„GET�2ND�HALF�OF�JOB�IDŠBSR„BDCONV�CONVERT�TO�DICIMAL/ŠMOVE.L�#4,D1ŽNUMBER�OF�BYTES�TO�CHECK�FOR�NULLOUTE10„ROL.L‚#8,D0ŽGET�A�BYTEŠTST.B‚D0‘NULL? ŠBNE.S‚OUTE15�BRANCH�IF�NOT�NULL$ŠMOVE.B�#$30,D0ŒFORCE�A�ZERO�IF�NULL,OUTE15„MOVE.B�D0,(A0)+‹SAVE�IN�OUTPUT�BUFFERŠSUB.L‚#1,D1ŽDECREMENT�COUNTER"ŠBNE.S‚OUTE10�BRANCH�IF�MORE�TO�DOŠMOVE.B�#'�',(A0)+‰BLANK3ŠMOVE.B�QVOL(A1),(A0)+…VOLUME,1�BYTE-ODD�ADDRESSING$ŠMOVE.B�QVOL+1(A1),(A0)+ƒMORE�VOLUME$ŠMOVE.B�QVOL+2(A1),(A0)+ƒMORE�VOLUME$ŠMOVE.B�QVOL+3(A1),(A0)+ƒMORE�VOLUMEŠMOVE.B�#'�',(A0)+‰BLANK ŠMOVE.L�QCATLG(A1),(A0)+ƒCATALOG*ŠMOVE.L�QCATLG+4(A1),(A0)+�REST�OF�CATALOGŠMOVE.B�#'�',(A0)+‰BLANK!ŠMOVE.L�#8,D0Ž#�BYTES�IN�FILENAME%ŠADD.L‚#QFILEN,A2‰ADDRESS�OF�FILENAME,OUTE20„MOVE.B�(A2)+,(A0)+ˆFILENAME�TO�BUFFERŠSUB.L‚#1,D0ŽDECREMENT�COUNTER ŠBNE„OUTE20�BRANCH�TIL�MOVED�ALLŠMOVE.B�#'.',(A0)+‰DOTŠMOVE.W�(A2)+,(A0)+ˆEXTENSIONŠMOVE.W�#'‚',(A0)+ˆBLANKS "ŠMOVE.L�QTASKN(A1),(A0)+ƒTASK�NAME ŠMOVE.B�#'�',(A0)+‰BLANKŠCLR.L‚D0‘CLEAR�FOR�USE%ŠMOVE.B�QCOPYS(A1),D0†GET�#�OF�COPIESŠBSR„BDCONV�CONVERT�TO�ASCII%ŠMOVE.L�#4,D1ŽNUMBER�OF�BYTES�TO�SAVEOUTE52„ROL.L‚#8,D0ŽGET�A�BYTEŠTST.B‚D0‘NULL? ŠBNE.S‚OUTE55�BRANCH�IF�NOT�NULL#ŠMOVE.B�#$20,D0ŒFORCE�BLANK�IF�NULL,OUTE55„MOVE.B�D0,(A0)+‹SAVE�IN�OUTPUT�BUFFERŠSUB.L‚#1,D1ŽDECREMENT�COUNTERŠBNE.S‚OUTE52�BRANCH�TIL�DONE**‚DETERMINE�ENTRY�STATUS*ŠCLR.L‚D0‘CLEAR�FOR�USEŠMOVE.B�QSTAT(A1),D0‡GET�STATUS ŠMOVE.L�#6,D1ŽBIT�NUMBER�TO�TEST*OUTE60„BTSTƒD1,D0ŽSEE�WHICH�STATUS�THIS�ISŠBNE.S‚OUTE70�BRANCH�IF�A�MATCH*ŠSUB.L‚#1,D1ŽBUMP�DOWN�TO�NEXT�BIT�TO�TEST&ŠBGE.S‚OUTE60�BRANCH�TIL�FOUND�A�MATCHŠMOVE.B�#$20,(A0)+‰BLANK/ŠMOVE.L�#BLANK,(A0)+‡NO�STATUS,BLANKS�TO�BUFFERŠMOVE.L�#BLANK,(A0)+‡NO�STATUSŠMOVE.L�#BLANK,(A0)+‡NO�STATUS"ŠBRA.S‚OUTE80�GO�OUTPUT�THE�BUFFER/OUTE70„MULUƒ#12,D1�GET�OFFSET�TO�STATUS�MESSAGE.ŠLEA„MSG5-DATASG(A4),A6�ADDRESS�OF�1ST�MESSAGE#ŠADD.L‚A6,D1ŽACTUAL�MESSAGE�ADDRESS%ŠMOVE.L�D1,A6ŽNEEDS�TO�BE�IN�AN�A�REG"ŠMOVE.B�#'�',(A0)+‰BLANK�TO�BUFFER,ŠMOVE.L�(A6)+,(A0)+ˆSTATUS�MESSAGE�TO�BUFFERŠMOVE.L�(A6)+,(A0)+ˆMOREŠMOVE.L�(A6),(A0)+‰AND�MOREŠBTSTƒ#QSTATIOE,D0‡I/O�ERROR?ŠBEQ.S‚OUTE80�BRANCH�IF�NOŠCLR.L‚D0‘CLEAR�FOR�USE&ŠMOVE.B�QLUN(A1),D0ˆGET�THE�ERROR�CODE!ŠMOVE.B�D0,D1ŽSAVE�THE�ERROR�CODEŠROR.L‚#4,D0ŽGET�THE�UPPER�BYTEŠADD.B‚#$30,D0ŒFORCE�ASCIIŠCMP.B‚#$39,D0Œ0-9?ŠBLE.S‚OUTE74�BRANCH�IF�0-9ŠADD.B‚#7,D0ŽMUST�BE�A-F"OUTE74„ROL.L‚#8,D0ŽSAVE�THE�RESULT+ŠAND.B‚#$F,D1�STRIP�TOP�OFF�REMAINING�VALUEŠMOVE.B�D1,D0ŽGET�ITŠADD.B‚#$30,D0ŒFORCE�ASCIIŠCMP.B‚#$39,D0Œ0-9?ŠBLE.S‚OUTE78�BRANCH�IF�0-9ŠADD.B‚#7,D0ŽMUST�BE�A-F+OUTE78„MOVE.L�A0,A6ŽGET�THE�STORAGE�ADDRESS/ŠMOVE.W�D0,-(A6)‹SAVE�THE�ERROR�CODE�FOR�OUTPUT6OUTE80„LEA„SCRATCH-DATASG(A4),A6�OUTPUT�BUFFER�ADDRESSŠMOVE.L�A6,D1ŽGET�START�ADDRESSŠMOVE.L�A0,D0ŽGET�END�ADDRESSŠSUB.L‚D1,D0ŽMESSAGE�LENGTH"ŠBSR.S‚OUTMSG�GO�OUTPUT�THIS�ENTRY1ŠMOVEM.L�(A7)+,D0-D2/A0-A6�RESTORE�REGISTERS�USED ŠRTS—RETURN O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*%*‡GETTNAME�-�GET�TASK�NAME�SUBROUTINE**ˆINPUT:*’A4=BASE�ADDRESS�REGISTER* *ˆOUTPUT: ; *’PBTSKID-DATASG(A4)�=�TASK�NAME4*’IF�an�error�occurs�attempting�to�get�the�task�name*—THEN**œthe�task�name�will�be�filled�with�spaces**ˆREGISTER�ALTERATION**’NONE*GTTNAME:‰MOVEM.LƒA0-A1,-(A7)#‰MOVE.L„#GTTASKNM,D0”DIRECTIVE�CODE‰LEA‡PBTSKID-DATASG(A4),A0‰TRAP†#1‰BEQ.S…GTN0100*²BRANCH�IF�SUCCESSFUL‰MOVE.L„#'„',A0 *²A0�=�SPACESGTN0100:9‰MOVE.L„A0,PBTSKID-DATASG(A4)‹TASKNAME�TO�PARAMETER�BLOCK‰MOVEM.Lƒ(A7)+,A0-A1‰RTS*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ŠPAGE***‚OUTMSG‚OUTPUT�A�MESSAGE�TO�USERS�CONSOLE*ŠFORMATTED,ASCII *‚ENTRY:A6=MESSAGE�START�ADDRESS*ˆA4=BASE�ADDRESS�REGISTER*ˆD0=MESSAGE�LENGTH*‚EXIT:TO�CALLER*‚USES:0�1�2�3�4�5�6�7*…D�*�P *…A�PƒPƒPƒP* OUTMSG„EQU„*8ŠMOVEM.L�A0/A2/D1,-(A7)„FIXES�PROBLEM�DETAILED�IN�SPR9760ŠLEA„IOSPB-DATASG(A4),A0�USE�IOS�PARAMETER�BLOCK5ŠSIOSCO�IOWRIT,IOPASC+IOPFOR,A0�WRITE,ASCII,FORMATTEDŠMOVE.B�#7,IOSLUN(A0)†LUN�71ŠMOVE.L�A6,IOSSAD(A0)†OUTPUT�BUFFER�START�ADDRESS(ŠMOVE.L�A6,IOSEAD(A0)†SET-UP�END�ADDRESS"ŠADD.L‚D0,IOSEAD(A0)†ADD�IN�LENGTH"ŠSUB.L‚#1,IOSEAD(A0)†ACTUAL�LENGTHŠTRAPƒ#2‘DO�THE�OUTPUT8ŠMOVEM.L�(A7)+,A0/A2/D1„FIXES�PROBLEM�DETAILED�IN�SPR976ŠRTS—RETURN�TO�CALLER*&*‚SETDEV�ASSIGN�LUN�7�TO�USERS�CONSOLE*6SETDEV„LEA„FHSPB-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS*ŠSFHSCO�FHASGN,FOPPW,A0„ASSIGN,PUBLIC�READŠMOVE.B�#7,FHSLUN(A0)†LUN�7)ŠMOVE.L�FHSCLG(A6),FHSVOL(A0)�DEVICE�NAME%ŠMOVE.W�#USER0,FHSUSN(A0)‚USER�NUMBERŠMOVE.W�#$2020,D0ŠBLANKS+ŠLEA„FHSCLG(A0),A2†ADDRESS�OF�CATALOG�FIELD ŠMOVE.L�#9,D1Ž#�BLANKS�TO�BUFFER&SETD5…MOVE.W�D0,(A2)+‹BLANKS�TO�BUFFERŠSUB.L‚#1,D1ŽDECREMENT�COUNTERŠBNE.S‚SETD5ŽBRANCH�TIL�BLANKEDŠCLR.W‚FHSWCD(A0)‰PROTECT�CODESŠTRAPƒ#3‘DO�THE�ASSIGNŠRTS—RETURN�TO�CALLER*"* RESTDEV RESET DEVICE,CLOSE LUN 7*7RESTDEVƒLEA„FHSPB-DATASG(A4),A0�PARAMETER�BLOCK�ADDRESS(ŠMOVE.W�#FHCLOS,FHSCMD(A0)�CLOSE�COMMANDŠMOVE.L�D0,D1ŽSAVE�CURRENT�D0"ŠMOVE.B�#7,FHSLUN(A0)†LUN�TO�CLOSEŠTRAPƒ#3‘DO�THE�CLOSEŠMOVE.L�D1,D0ŽRESTORE�D0ŠRTS—RETURN�TO�CALLERŠPAGE**‚STRTNXT‚START�NEXT�OUTPUT3*ŒSEARCHES�QUEUE�LIST�LOOKING�FOR�AN�ENTRY�TO�START/*ŒWITH�A�MATCHING�DEVICE�OF�THE�ENTRY�THAT�JUST*ŒCOMPLETED�OUTPUT.**‚ENTRY:A1=ADDRESS�OF�ENTRY�JUST�COMPLETED*ˆA4=BASE�ADDRESS�REGISTER.*ˆCURREC=RECORD�NUMBER�OF�ENTRY�JUST�COMPLETED"*‚EXIT:A1=ADDRESS�OF�ENTRY�STARTED'*‡CURREC=RECOND�NUMBER�OF�ENTRY�STARTED5*‡EXITS�EITHER�BECAUSE�OF�SOMETHING�STARTED�OR�DIDN'T*‡FIND�AN�ENTRY�TO�START*‚USES:0�1�2�3�4�5�6�7*…D�*…*�*�*�*�* *…A�*�R…P*‚CALLS:FNDENTRY„STRTSPL** STRTNXTƒEQU„*/ŠMOVE.L�QDEVICE(A1),D6…LOOK�FOR�MATCHING�DEVICEŠCLR.L‚D5‘LOOK�FOR�ANY�FORMS�ID$ŠMOVE.L�#-1,D4�START�AT�TOP�OF�QUEUEŠCLR.L‚D7‘CLEAR�FOR�USE5ŠMOVE.B�#QSTATOUT,D7‡SEE�IF�ANYTHING�BEING�OUTPUT�NOWŠBSR„FNDENTRY‹GO�SEE"ŠTST„D7‘ANYTHING�BEING�OUTPUT�NOW?,ŠBEQ.S‚STRTN50ŒBRANCH�IF�YES,DON'T�TRY�AGAIN=ŠCLR.L‚D7‰DEVICE�NOT�BUSY,SET�UP�TO�FIND�NEXT�ENTRY�TO�OUTPUT=STRTN20ƒMOVE.B�#QSTATRDY,D7‡LOOK�FOR�AN�ENTRY�READY�TO�OUTPUTŠBSR„FNDENTRY‹GO�FIND�AN�ENTRYŠTST„D7‘FOUND�ONE?"ŠBMI.S‚STRTN50ŒBRANCH�IF�NOT�FOUND6STRTN25ƒBTSTƒ#QSTATWAT,QSTAT(A1)�MUST�THIS�ENTRY�WAIT?ŠBEQ.S‚STRTN40ŒBRANCH�IF�NO>STRTN30ƒMOVE.L�CURREC-DATASG(A4),D4�SEARCH�QUEUE�STARTING�HERE ŠBRA„STRTN20ŒGO�SEARCH�SOME�MORE3STRTN40ƒBTSTƒ#QSTATFRM,QSTAT(A1)�MATCHING�FORMS�ID?/ŠBNE„STRTN30ŒBRANCH�IF�NOT�MATCHING,SEARCH�MORE/ŠBTSTƒ#QSTATIOE,QSTAT(A1)�WAITING�FOR�CONTINUE?*ŠBNE„STRTN30ŒBRANCH�IF�WAITING,SEARCH�MORE!ŠBSR„STRTSPLŒGO�START�THIS�OUTPUT$STRTN50ƒRTS—RETURN,STARTED�SOMETHINGŠPAGE**‚GTJOBNƒGET�JOB�NUMBER1*‹READ�THE�JOB�NUMBER�IN�QUEUE�RECORD�#9,1ST�WORD1*‹BUMP�IT‚AND�REPLACE.�IF�GREATER�THAN�9999,START *‹OVER�AT�1.*‚EXIT:D6.W=JOB�NUMBER�TO�USE)*‡D7=0=GOOD�RETURN,OTHERWISE�ERROR�RETURN*‚USES:0�1�2�3�4�5�6�7 *…D�*�*‰R�R *…A�*ƒ*ƒP*‚CALLS:FMSINT** GTJOBN„EQU„*/ŠLEA„FMSPKT-DATASG(A4),A0�FMSINT�PACKET�ADDRESS&ŠMOVE.B�#RDCMD,FMSCMD(A0)‚READ�COMMAND+; ŠMOVE.L�#9,FMSREC(A0)†RECORD�NUMBER�TO�READ)ŠLEA„SCRATCH-DATASG(A4),A2�BUFFER�ADDRESS7ŠMOVE.L�A2,FMSBUF(A0)†BUFFER�ADDRESS�OF�RETURNED�RECORD$ŠMOVE.W�#1,FMSRECN(A0)…READ�1�RECORDŠBSR„FMSINT�GO�READ�ITŠBNE.S‚GTJNERRŒBRANCH�IF�ERRORŠCLR.L‚D6‘CLEAR�FOR�RETURN&ŠMOVE.W�(A2),D6ŒGET�CURRENT�JOB�NUMBERŠADD.W‚#1,D6ŽBUMP�IT"ŠCMP.W‚#9999,D6‹GREATER�THAN�9999?-ŠBLT.S‚GTJN10�BRANCH�IF�NOT�GREATER�THAN�9999ŠMOVE.W�#1,D6ŽSTART�OVER�AT�ONE GTJN10„MOVE.W�D6,(A2)ŒRESTORE�IT+ŠMOVE.B�#REPLCMD,FMSCMD(A0)�REPLACE�COMMANDŠBSR„FMSINT�GO�REPLACE�IN�FILEŠBNE.S‚GTJNERRŒERROR�RETURNŠCLR.L‚D7‘GOOD�RETURNŠCLR.L‚D0‘GOOD�RETURNŠRTS—RETURN�TO�CALLER,GTJNERRƒMOVE.L�D0,D7ŽSAVE�ERROR�STATUS�IN�D7ŠRTS—RETURN�TO�CALLERŠPAGE*6*‚STPRIRPL‚SET�SPOOLER�FILE�OUTPUT�PRIORITY,UPDATE�ANY(*ŒBUMPED�QUEUE�ENTRIES,INSERT�THIS�ENTRY*ŒINTO�THE�SPOOLER�QUEUE/*ŒSEARCHES�THE�SPOOLER�QUEUE�OF�READY�TO�OUTPUT/*ŒENTRIES,INSERTS�THE�NEW�ENTRY�WITHIN�THE�SAME2*ŒPRIORITY�RANGE�OF�EXISTING�ENTRIES.�IT�SUBTRACTS/*ŒTHIS�ENTRY�SIZE�FROM�ANY�ENTRIES�IT�BUMPS�AND *ŒWRITES�THOSE�RECORDS�BACK�OUT.*‚ENTRY:A1=RECORD�ADDRESS*ˆA4=BASE�ADDRESS�REGISTER*‚EXIT:D7=0=GOOD�RETURN*‡D7=-1=ERROR�RETURN*‚USES:0�1�2�3�4�5�6�7 *…D�*�*�*�*‡R *…A�*�P�*�*�P *‚CALLS:FNDENTRY„RPLREC„INSRTREC**STPRIRPL‚EQU„*/ŠLEA„SCRATCH-DATASG(A4),A2�SCRATCH�AREA�ADDRESS"ŠMOVE.L�A1,A3ŽSTART�RECORD�ADDRESS+ŠMOVE.L�#QLNG/2,D0‰#�WORDS�IN�A�QUEUE�ENTRYCSTPRI10ƒMOVE.W�(A3)+,(A2)+ˆPUT�CURRENT�RECORD�INTO�THE�SCRATCH�AREAŠSUB.L‚#1,D0ŽDECREMENT�COUNTER/ŠBNE.S‚STPRI10ŒBRANCH�TIL�ALL�OF�ENTRY�IF�MOVED/ŠLEA„SCRATCH-DATASG(A4),A2�RESET�RECORD�ADDRESSŠCLR.L‚D1‘CLEAR�FOR�USE)ŠMOVE.B�QPRI(A2),D1ˆSAVE�CURRENT�PRIORITYŠMOVE.L�#1,D2ŽSET�INSERT�SWITCHŠMOVE.L�#0,A3ŽCLEAR�FOR�USE&ŠMOVE.L�QSIZE(A2),A3‡SAVE�CURRENT�SIZE*ŠMOVE.L�#-1,D4�START�SEARCH�AT�TOP�OF�FILE6ŠMOVE.L�D4,CURREC-DATASG(A4)�SET�CURRENT�RECORD�NUMBERŠCLR.L‚D5‘ANY�FORMSID"ŠMOVE.L�QDEVICE(A2),D6…SAME�DEVICEŠCLR.L‚D7‘CLEAR�FOR�USE>STPRI20ƒMOVE.B�#QSTATRDY,D7‡LOOK�FOR�ANY�READY�TO�OUTPUT�ENTRYŠBSR„FNDENTRY‹GO�FIND�AN�ENTRY4ŠMOVE.L�CURREC-DATASG(A4),D4�SAVE�THIS�RECORD�NUMBERŠTST„D7‘FOUND�AN�ENTRY?ŠBMI.S‚STPRI70ŒBRANCH�IF�NOŠTST„D2‘DID�AN�INSERT�ALREADY??ŠBLE.S‚STPRI30‡BRANCH�IF�RECORD�ALREADY�INSERTED�INTO�THE�QUEUE(ŠCMP.B‚QPRI(A1),D1ˆSEE�IF�PRIORITY�IS�OK$ŠBLT„STPRI20ŒBRANCH�IF�CAN'T�GO�HEREEŠBGT.S‚STPRI30�THIS�PRIORITY�IS�BIGGER-INSERT�IN�FRONT�OF�THIS�RECORD-ŠCMPA.L�QSIZE(A1),A3‡SAME�PRIORITY,CHECK�SIZE-ŠBGE„STPRI20ŒTHIS�ONE�IS�BIGGER,CAN'T�GO�HERE%STPRI30ƒMOVE.L�A3,D0ŽGET�CURRENT�SIZE,ŠSUB.L‚D0,QSIZE(A1)‡UPDATE�BUMPED�ENTRY�SIZE%ŠBPL.S‚STPRI40ŒBRANCH�IF�SIZE�NOT�NEG:ŠCLR.L‚QSIZE(A1)ŠMAKE�IT�ZERO,DON'T�WANT�ANYTHING�NEGATIVE*STPRI40ƒTST„D2‘ALREADY�INSERTED�NEW�ENTRY?ŠBLE.S‚STPRI60ŒBRANCH�IF�YES,ŠCMPA.L�QSIZE(A1),A3‡DOES�NEW�ENTRY�GO�HERE?*ŠBGE.S‚STPRI60ŒBRANCH�IF�NO,LOOK�SOME�MORE*)*‚REPLACE�BUMPED�RECORD,INSERT�NEW�RECORD*.ŠMOVE.L�A2,A1ŽREPLACE�OLD�ENTRY�WITH�NEW�ENTRYŠBSR„RPLREC�GO�DO�THE�REPLACEŠBNE.S‚STPRI90ŒERROR�RETURN-ŠLEA„QBUF-DATASG(A4),A1�ADDRESS�OF�OLD�RECORD/ŠMOVE.L�CURREC-DATASG(A4),D7�WHERE�TO�INSERT�IT)ŠADD.L‚#1,D7ŽINSERT�AFTER�REPLACED�RECORD5ŠBSR„INSRTREC‹GO�INSERT�OLD�RECORD�BACK�INTO�THE�FILEŠTST„D7‘GOOD�INSERT?!ŠBMI.S‚STPRI90ŒBRANCH�IF�AN�ERROR+ŠADD.L‚#1,CURREC-DATASG(A4)�FOR�NEXT�SEARCH=ŠMOVE.L�CURREC-DATASG(A4),D4�SET-UP�FOR�NEXT�CALL�TO�FNDENTRY ŠCLR.L‚D2‘SET�INSERTED�SWITCH�ONŠBRA„STPRI20ŒGO�GET�NEXT�ENTRY/STPRI60ƒBSR„RPLREC�REPLACE�OLD�RECORD�WITH�SELFŠBNE.S‚STPRI90ŒERROR�RETURNŠBRA„STPRI20ŒGO�GET�NEXT�ENTRY**‚AT�END�OF�FILE**STPRI70ƒTST„D2‘INSERTED�THE�NEW�ENTRY�YET?!ŠBLE.S‚STPRI80ŒBRANCH�IF�YES,DONE>ŠMOVE.L�CURREC-DATASG(A4),D7�INSERT�NEW�ENTRY�AFTER�LAST�ENTRY3ŠADD.L‚#1,D7ŽBUMP�RECORD�NUMBER�FOR�THE�INSERT�CALL0ŠCMP.L‚#10,D7�SEE�IF�SET�TO�A�VALID�ENTRY�NUMBERŠBGE.S‚STPRI75ŒBRANCH�IF�GOODŠMOVE.L�#10,D7�SET�TO�1ST�ENTRY4ŠMOVE.L�D7,CURREC-DATASG(A4)�SAVE�THIS�RECORD�NUMBER,STPRI75ƒMOVE.L�A2,A1ŽSTART�ADD< RESS�OF�RECORDŠBSR„INSRTREC‹GO�INSERT�ITSTPRI80ƒCLR.L‚D7‘GOOD�RETURN**‚PUT�ENTRY�BACK�INTO�QBUF**ŠLEA„QBUF-DATASG(A4),A1�GET�BUFFER�ADDRESSŠMOVE.L�A1,A3ŽGET�QBUF�ADDRESS"ŠMOVE.L�#QLNG/2,D0‰#�WORDS�TO�MOVE*STPRI85ƒMOVE.W�(A2)+,(A3)+ˆMOVE�THE�RECORDŠSUB.L‚#1,D0ŽDECREMENT�COUNTERŠBNE.S‚STPRI85ŒBRANCH�TIL�MOVEDŠRTS—RETURN�TO�CALLER&STPRI90ƒMOVE.L�#-1,D7�SET�ERROR�RETURNŠRTS—RETURN�TO�CALLERŠPAGE=*‚TSKSTRT‚THIS�CODE�IS�EXECUTED�BY�EACH�TASK�THAT�WAS�CREATED$*‹BY�STRTSPL.�IT�DOES�THE�FOLLOWING:4*‰1)ASSIGN�THE�FILE�IN�QBUF�FOR�EXCLUSIVE�READ‚LUN�1.*‰2)ASSIGN�THE�DEVICE�IN�QBUF�FOR�OUTPUT‚LUN�2"*‰3)DOES�THE�FILE�READS�AND�WRITES7*‰4)TERMINATES�SELF�AT�END�OF�FILE�-�THIS�NOTIFIES�.SPL*‹THAT�THE�I/O�IS�COMPLETE.0*‰5)IF�.SPL�IS�TO�CANCEL�THIS�OUTPUT,.SPL�ISSUES*‹A�TERMINATE�EVENT+*‰6)IF�THIS�TASK�ENCOUNTERS�AN�I/O�ERROR,IT*‹ISSUES�AN�EVENT�TO�.SPL3*‰7)THE�ONLY�INITIALIZED�DATA�ON�ENTRY�IS�THE�QUEUE*‹ENTRY�TO�PROCESS,IN�QBUF<*‰8)REGISTER�A0�IS�INITIALIZED�TO�THE�PHYSICAL�START�ADDRESS*‹OF�THE�DATA�SEGMENT<*‰9)REGISTER�A1�IS�INITIALIZED�TO�THE�PHYSICAL�START�ADDRESS3*‹OF�THE�SEGMENT�USED�FOR�NON-SPOOLER�FILE�I/O,IF�A3*‹NON-SPOOLER�FILE�IS�BEING�OUTPUT.�OTHERWISE�A1=-1* TSKSTRTƒEQU„*2ŠMOVE.L�A0,A4ŽPHYSICAL�ADDRESS�OF�THE�DATA�SEGMENTI‡MOVE.L�A1,BUFSTRT(A4)�SAVE�THE�PHSICAL�ADDRESS�OF�THE�I/O�BUFFER,IF�HAVEŠMOVE.L�A1,D2ŽSAVE�THE�ADDRESSŠLEA„STACK(A4),A7‡STACK�POINTER1ŠLEA„FHSPBS(A4),A0†CLEAR�OUT�THE�PARAMETER�BLOCKS6ŠMOVE.L�#(FHSNLN+IOSBLN)/2,D0�NUMBER�OF�WORDS�TO�CLEARTSKS01„CLR.W‚(A0)+ŽCLEAR�ITŠSUB.L‚#1,D0ŽDECREMENT�COUNTER ŠBNE.S‚TSKS01�BRANCH�TIL�CLEARED'ŠCLR.W‚SUBTERR(A4)ˆCLEAR�THE�ERROR�FLAG+ŠCLR.B‚SPLFLGS(A4)ˆCLEAR�THE�TASK�FLAG�BYTE=ŠMOVE.L�#BUFLNG/2,CURRECS(A4)�GET�1/2�THE�BUFFER�SEGMENT�SIZE0ŠMOVE.L�CURRECS(A4),SAVLNG(A4)�SAVE�THE�1/2�SIZEAŠADD.L‚D2,CURRECS(A4)…OUTPUT�BUFFER�ADDRESS�FOR�NON-SPOOLER�FILES*ŠLEA„FHSPBS(A4),A0†PARAMETER�BLOCK�ADDRESSŠMOVE.L�A0,A1ŽADDRESSŠCLR.L‚(A1)+ŽTASK�=�MEŠCLR.L‚(A1)+ŽSESSION.ŠMOVE.B�#AQSTQE+AQSTRE,(A1)+�STATUS=EVERYTHING"ŠMOVE.B�#20,(A1)+ŠMAX�ENTRY�LENGTH ŠMOVE.L�#20*4,(A1)+ˆQUEUE�LENGTHŠLEA„TSKASR(PC),A2†ARS�ADDRESSŠMOVE.L�A2,(A1)ŒARS�ADDRESS&ŠMOVE.L�#GTASQ,D0ŠGET�AN�ASQ�DIRECTIVEŠTRAPƒ#1‘GET�ITŠBNE„TSKERR�ERROR�RETURN%ŠLEA„QBUFS(A4),A1‡QUEUE�ENTRY�ADDRESS2ŠMOVE.L�QDEVICE(A1),SPLQNS(A4)�SAVE�THIS�TASK�NAME.ŠLEA„FHSPBS(A4),A0†FHS�PARAMETER�BLOCK�ADDRESSFŠSFHSCO�FHASGN,FOPPR+FOPABF+FOPADR,A0�ASSIGN,PUBLIC�READ,SHARED�BUFFERŠMOVE.B�#FOUT,FHSLUN(A0)ƒLUN(ŠMOVE.L�#6,D0ŽLENGTH�OF�FILENAME�TO�MOVE2ŠLEA„QVOL(A1),A2ˆSTART�ADDRESS�OF�VOLUME�NAME,FROM2ŠLEA„FHSVOL(A0),A3†START�ADDRESS�OF�VOLUME�NAME,TO@TSKS02„MOVE.L�(A2)+,(A3)+ˆMOVE�THE�NAME�INTO�THE�PARAMETER�BLOCK"ŠSUB.L‚#1,D0ŽDECREMENT�THE�COUNTERŠBNE.S‚TSKS02�BRANCH�TIL�MOVED2ŠMOVE.W�#$0000,FHSWCD(A0)‚READ/WRITE�PROTECT�CODES)ŠCLR.W‚FHSGEN(A0)‰CLEAR�THE�RESERVED�WORD6ŠMOVE.L�#FMSSRA,FHSSAD(A0)�SHARED�BUFFER�START�ADDRESSŠTRAPƒ#3‘ASSIGN�THIS�FILE)ŠBNE„TSKERRFŒERROR-CAN'T�ASSIGN�THIS�FILE5ŠMOVE.L�FHSEAD(A0),SBUFEA(A4)�SAVE�BUFFER�END�ADDRESSBŠMOVE.L�FHSSAD(A0),SBUFSA(A4)�PHYSICAL�START�ADDRESS-SHARED�BUFFER,ŠMOVE.W�FHSOPT(A0),FOPT(A4)�SAVE�THE�OPTIONS**‚ASSIGN�THE�OUTPUT�DEVICE*/ŠMOVE.L�QDEVICE(A1),FHSVOL(A0)�DEVICE�TO�ASSIGN8ŠMOVE.L�#BLANK,D0ŠBLANKS�FOR�PART�OF�THE�PARAMETER�BLOCK/ŠLEA„FHSCLG(A0),A2†START�ADDRESS�FOR�THE�BLANKS'ŠMOVE.L�#9,D1ŽNUMBER�OF�WORDS�TO�BLANKS,TSKS03„MOVE.W�D0,(A2)+‹BLANKS�TO�PARA.�BLOCKŠSUB.L‚#1,D1ŽDECREMENT�COUNTER ŠBNE.S‚TSKS03�BRANCH�TIL�BLANKEDŠMOVE.B�#DOUT,FHSLUN(A0)ƒLUN%ŠMOVE.W�#USER0,FHSUSN(A0)‚USER�NUMBER+ŠSFHSCO�FHASGN,FOPPW,A0„ASSIGN,PUBLIC�WRITEŠCLR.W‚FHSWCD(A0)‰PROTECT�CODESŠTRAPƒ#3‘ASSIGN�THIS�DEVICE#ŠBNE„TSKERRDŒBRANCH�IF�CAN'T�ASSIGN%ŠBSR„TSKHDR�GO�OUTPUT�THE�FILE�HEADER:TSKS05„LEA„IOSPBS(A4),A0†GET�WRITE�PARAMETER�BLOCK�ADDRESSŠMOVE.B�#DOUT,IOSLUN(A0)ƒLUN ŠMOVE.W�#IOWRIT,IOSFCT(A0)�WRITE"ŠLEA„TSKASR(PC),A2†GET�ASR�ADDRESS+ŠMOVE.L�A2,IOSCAD(A0)†IO�COMPLETION�ADDRESSŠCLR.L‚D< 2‘CLEAR�FOR�LATER�USE.ŠMOVE.B�QFILEN(A1),D0†GET�1ST�CHAR�OF�FILENAME!ŠCMP.B‚#SPOOLF,D0‰A�SPOOLER�FILE?ŠBEQ.S‚TSKS10�BRANCH�IF�YES;ŠBSETƒ#NOTSPL,SPLFLGS(A4)�SET�NOT�OUTPUTTING�A�SPOOLER�FILE9ŠMOVE.L�BUFSTRT(A4),SBUFSA(A4)�GET�CORRECT�BUFFER�ADDRESSŠBRA„TSKS50�GO�DO�RECORD�IO*5* SET UP BLOCK READ PARAMETER BLOCK-FOR SPOOLER FILES*=TSKS10„LEA„FHSPBS(A4),A0†USE�THE�FHS�PARA.�BLOCK�FOR�THE�READ&ŠMOVE.B�#FOUT,IOSLUN(A0)ƒREAD�FILE�LUN)ŠCLR.W‚IOSSRV(A0)‰CLEAR�THE�RESERVED�WORD$ŠCLR.L‚IOSRRN(A0)‰CLEAR�THE�RECORD�#9ŠMOVE.L�SBUFSA(A4),IOSSAD(A0)�SHARED�BUFFER�START�ADDRESS0ŠMOVE.L�SBUFEA(A4),IOSEAD(A0)�END�BUFFER�ADDRESS8TSKS15„LEA„FHSPBS(A4),A0†RESTORE�PARAMETER�BLOCK�ADDRESS+ŠSIOSCO�IOREAD,IOPNXT+IOPBLK,A0�BLOCK�READS'TSKS20„MOVE.L�#SETASQ,D0‰SET�ASQ�STATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L�#1,A0ŽDISABLE�ASR*MOVE.L #3,A0 DISABLE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DO�IT(ŠBTSTƒ#PIOF,SPLFLGS(A4)‚PROCEED�IO�DONE?ŠBEQ.S‚TSKS23�BRANCH�IF�YES'ŠMOVE.L�#WTEVNT,D0‰NOT�DONE,WAIT�FOR�ITŠTRAPƒ#1‘DO�THE�WAIT!ŠBRA.S‚TSKS25�CONTINUE�PROCESSING'TSKS23„MOVE.L�#SETASQ,D0‰SET�ASQ�STATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L�#5,A0ŽENABLE�ASR*MOVE.L #7,A0 ENABLE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DO�IT5TSKS25„LEA„FHSPBS(A4),A0†READ�PARAMETER�BLOCK�ADDRESSŠTRAPƒ#2‘DO�THE�BLOCK�READŠBEQ.S‚TSKS30�GOOD�RETURN(ŠBTSTƒ#TERMERR,SUBTERR(A4)�TO�TERMINATE?ŠBNE„TSKIO30ŒBRANCH�IF�TO�TERM'ŠCMP.B‚#ISTAEOF,IOSSTA(A0)�END�OF�FILE?*ŠBNE„TSKIOERŒBRANCH�IF�NO,SOME�OTHER�ERRORŠBRA„TSKDONEŒGO�TERMINATE-TSKS30„MOVE.L�IOSSAD(A0),D0†GET�START�ADDRESSŠMOVE.L�D0,CURPT(A4)‡SAVE�ITŠMOVE.L�D0,A2ŽSAVE�IT&ŠADD.L‚IOSLEN(A0),D0†ADD�IN�THE�LENGTHŠSUB.L‚#1,D0ŽACTUAL�END�ADDRESS*ŠMOVE.L�D0,BUFEND(A4)†SAVE�THE�END�ADDRESS!TSKS40„BSR„DOWRTŽGO�DO�THE�OUTPUT6TSKS45„MOVE.L�CURPT(A4),A2‡GET�THE�NEXT�RECORD�ADDRESS,ŠCMP.L‚BUFEND(A4),A2†SEE�IF�AT�END�OF�BUFFER,ŠBGE„TSKS15�BRANCH�IF�AT�END,READ�NEXT�BLOCK!ŠBRA„TSKS40�WRITE�THE�NEXT�RECORD*(* DOING RECORD I/O FOR NON-SPOOLER FILES*9TSKS50„LEA„FHSPBS(A4),A0†GET�READ�PARAMETER�BLOCK�ADDRESSŠMOVE.B�#FOUT,IOSLUN(A0)ƒLUN)ŠCLR.W‚IOSSRV(A0)‰CLEAR�THE�RESERVED�WORD,ŠCLR.L‚IOSRRN(A0)‰CLEAR�RANDOM�RECORD�NUMBER0ŠMOVE.L�CURRECS(A4),A3…GET�OUTPUT�BUFFER�ADDRESS.ŠMOVE.L�SBUFSA(A4),A2†GET�INPUT�BUFFER�ADDRESS:TSKS55„LEA„FHSPBS(A4),A0†RESET�THE�PARAMETER�BLOCK�ADDRESS"ŠSIOSCO�IOREAD,IOPNXT,A0ƒREAD�NEXT0TSKS60„MOVE.L�A2,IOSSAD(A0)†BUFFER�START�ADDRESS0ŠADD.L‚#2,IOSSAD(A0)†ADJUST�FOR�NON-SPOOLER�FILE,ŠCLR.W‚(A2)�SET�OPTIONS�FOR�FORMATTED�OUTPUT(ŠMOVE.L�A2,IOSEAD(A0)†BUFFER�END�ADDRESS'ŠMOVE.L�SAVLNG(A4),D0†GET�BUFFER�LENGTH%ŠADD.L‚D0,IOSEAD(A0)†ADD�TO�THE�START'ŠSUB.L‚#1,IOSEAD(A0)†ACTUAL�END�ADDRESSŠTRAPƒ#2‘DO�THE�READ#ŠBEQ.S‚TSKS80�BRANCH�IF�A�GOOD�READ(ŠBTSTƒ#TERMERR,SUBTERR(A4)�TO�TERMINATE?ŠBNE„TSKIO30ŒBRANCH�IF�YES'ŠCMP.B‚#ISTAEOF,IOSSTA(A0)�END�OF�FILE?ŠBNE.S‚TSKS70�BRANCH�IF�NO#ŠBSETƒ#EOF,SPLFLGS(A4)ƒSET�EOF�FLAGŠBRA.S‚TSKDONEŒGO�TERMINATE0TSKS70„CMP.B‚#ISTABO,IOSSTA(A0)�BUFFER�OVERFLOW? ŠBNE„TSKIOERŒNO,SOME�OTHER�ERRORDTSKS80„MOVE.L�IOSLEN(A0),D2†GET�RECORD�LENGTH-IGNORE�BUFFER�OVERFLOW%ŠADD.L‚#2,D2ŽFORCE�THE�OPTIONS�LENGTHŠBSR.S‚DOWRTŽGO�DO�THE�OUTPUT%TSKS85„BRA„TSKS55�GET�THE�NEXT�RECORD*>*‚HERE�IF�CAN'T�ASSIGN�THE�FILE�FOR�OUTPUT�OR�CAN'T�GET�AN�ASQ* TSKERR„EQU„*BŠMOVE.L�#TERM,D0…TERMINATE�DIRECTIVE,USED�FOR�FILE�NOT�OUTPUT�CODE2TSKERRFƒSWAPƒD0‘PUT�ERROR�CODE�IN�UPPER�HALF�OF�D0ŠCLR.W‚D0‘CLEAR�LOWER�HALF!ŠMOVE.B�#TERM,D0‹TERMINATION�CODEŠTRAPƒ#1‘TERMINATE�SELF*-*‚HERE�IF�FILE�WAS�ASSIGNED,BUT�DEVICE�WASN'T* TSKERRDƒEQU„*ŠMOVE.B�#FOUT,D0‹FILE�LUNŠBSR.S‚CLOSFD�CLOSE�THE�FILE$ŠBRA„TSKERR�TERM�WITH�ERROR�CODE�SET**‚HERE�IF�GOOD�END* TSKDONEƒEQU„*!ŠMOVE.L�#SETASQ,D0‰SET�ASQ�STATUSO*>>>>>>>>>= >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L�#1,A0ŽTO�DISABLE�ASR*MOVE.L #3,A0 TO DISABLE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DO�IT)ŠBTSTƒ#PIOF,SPLFLGS(A4)‚LAST�OUTPUT�DONE?ŠBEQ.S‚TSKDN10ŒBRANCH�IF�YES'ŠMOVE.L�#WTEVNT,D0‰NOT�DONE,WAIT�FOR�ITŠTRAPƒ#1‘DO�THE�WAIT(TSKDN10ƒMOVE.L�#SETASQ,D0‰SET�ASQ�STATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L�#5,A0ŽTO�ENABLE�THE�ASR*MOVE.L #7,A0 TO ENABLE THE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DO�IT&TSKDN20ƒMOVE.L�#1,D1ŽSET�END�PAGE�FLAGŠBSR„SEE�GO�OUTPUT�END�PAGEŠMOVE.B�#FOUT,D0‹FILE�LUNŠBSR.S‚CLOSFD�GO�CLOSE�THE�FILEŠMOVE.B�#DOUT,D0‹DEVICE�LUN!ŠBSR.S‚CLOSFD�GO�CLOSE�THE�DEVICEŠERQ.TERM�#0,#0ŒGOOD�TERMINATE**%*‚CLOSFD‚CLOSE�THE�FILE�OR�THE�DEVICE*‚ENTRY:D0.B=LUN�TO�CLOSE*‚EXIT:TO�CALLER*‚USES:0�1�2�3�4�5�6�7*…D�**…A�***4CLOSFD„LEA„FHSPBS(A4),A0†FHS�PARAMETER�BLOCK�ADDRESS(ŠMOVE.W�#FHCLOS,FHSCMD(A0)�CLOSE�COMMAND"ŠMOVE.B�D0,FHSLUN(A0)†LUN�TO�CLOSEŠTRAPƒ#3‘DO�ITŠRTS—RETURN�TO�CALLERŠPAGE* DOWRT DO THE ACTUAL OUTPUT%* ENTRY:A2=ADDRESS OF RECORD TO WRITE(*‡D2=RECORD�LENGTH�IF�A�NON-SPOOLER�FILE#*‡A3=ADDRESS�OF�LAST�RECORD�WRITTEN*‚EXIT:A2=ADDRESS�FOR�NEXT�READ*‡A3=ADDRESS�FOR�NEXT�WRITE*‚USES:0�1�2�3�4�5�6�7*…D�*ƒ* *…A�*ƒR�R�P DOWRT…EQU„*(ŠBTSTƒ#TERMERR,SUBTERR(A4)�TO�TERMINATE?ŠBNE„TSKIO30ŒBRANCH�IF�YES!ŠMOVE.L�#SETASQ,D0‰SET�ASQ�STATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L�#1,A0ŽDISABLE�THE�ASR*MOVE.L #3,A0 DISABLE THE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DO�IT(ŠBTSTƒ#PIOF,SPLFLGS(A4)‚PROCEED�IO�DONE?ŠBEQ.S‚DOWR10�BRANCH�IF�DONE)ŠMOVE.L�#WTEVNT,D0‰WAIT�FOR�IT�TO�BE�DONEŠTRAPƒ#1‘DO�THE�WAIT!ŠBRA.S‚DOWR20�CONTINUE�PROCESSING'DOWR10„MOVE.L�#SETASQ,D0‰SET�ASQ�STATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L�#5,A0ŽENABLE�THE�ASR*MOVE.L #7,A0 ENABLE THE ASRO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠTRAPƒ#1‘DO�IT?DOWR20„BTSTƒ#IOERRF,SPLFLGS(A4)�SEE�IF�ANY�ERRORS�ON�PROCEED�IOŠBNE„TSKIOEWŒBRANCH�IF�ERRORSŠEXG„A2,A3ŽSWAP�THE�POINTERS:DOWR25„LEA„IOSPBS(A4),A0†GET�WRITE�PARAMETER�BLOCK�ADDRESSŠCLR.L‚D3‘CLEAR�FOR�USE/ŠBTSTƒ#NOTSPL,SPLFLGS(A4)�DOING�A�SPOOLER�FILE?ŠBNE.S‚DOWR30�BRANCH�IF�NOŠMOVE.W�(A3)+,D2‹GET�THE�LENGTH2ŠADD.L‚#2,D3ŽCOUNT�THE�NUMBER�OF�BYTES�ADDED�TO�A3.DOWR30„MOVE.W�(A3)+,IOSOPT(A0)ƒSET�THE�OPTIONS2ŠADD.L‚#2,D3ŽCOUNT�THE�NUMBER�OF�BYTES�ADDED�TO�A31ŠOR.Wƒ#IOPPRO+IOPCAD,IOSOPT(A0)�SET�TO�PROCEED�IO*ŠMOVE.L�A3,IOSSAD(A0)†START�BUFFER�ADDRESS(ŠMOVE.L�A3,IOSEAD(A0)†SET�UP�END�ADDRESS&ŠADD.L‚D2,IOSEAD(A0)†ADD�IN�THE�LENGTH'ŠSUB.L‚#3,IOSEAD(A0)†ACTUAL�END�ADDRESS$ŠSUBA.L�D3,A3ŽRESTORE�OUTPUT�POINTER5DOWR35„BSETƒ#PIOF,SPLFLGS(A4)‚SET�TO�DOING�PROCEED�IOŠTRAPƒ#2‘DO�ITŠBNE.S‚TSKIOEWŒERROR�RETURN(ŠBTSTƒ#TERMERR,SUBTERR(A4)�TO�TERMINATE?ŠBNE„TSKIO30ŒBRANCH�IF�YES/ŠBTSTƒ#NOTSPL,SPLFLGS(A4)�DOING�A�SPOOLER�FILE?ŠBEQ.S‚DOWR40�BRANCH�IF�YESŠRTS—NO,RETURN�TO�CALLER1DOWR40„MOVE.L�CURPT(A4),A2‡GET�THE�RECORD�ADDRESSŠMOVE.W�(A2),D2ŒGET�THE�LENGTHŠBTSTƒ#0,D2ŽSEE�IF�EVENŠBEQ.S‚DOWR50�BRANCH�IF�EVEN&ŠADD.L‚#1,D2ŽODD,ADD�IN�THE�EXTRA�BYTE'DOWR50„ADD.L‚#2,D2ŽBUMP�PAST�THE�LENGTH(ŠLEA„(A2,D2),A2‰POINT�TO�THE�NEXT�RECORD%ŠMOVE.L�A2,CURPT(A4)‡SAVE�THE�ADDRESSŠRTS—RETURN�TO�CALLERŠPAGE**‚TSKIOER‚TSKIOEW‚TSKIOEH8*‚I/O�ERRORS�ON�READING�FILE,WRITING�FILE,WRITING�HEADER7*‚SEND�AN�EVENT�TO�THE�MONITOR�TASK�AS�TO�WHICH�PROBLEM:*‚AND�WAIT�FOR�AN�EVENT.�RETURNED�EVENT�MAY�BE�TO�CONTINUE>*‚OR�TO�TERMINATE.�IF�TERMINATE,CLOSE�THE�FILE�AND�THE�DEVICE.***‚EVENT�STRUCTURE:�DC.B�1�EVENT�LENGTH�(8)*“DC.B�1�EVENT�CODE‚(32)=  *“DC.W�1�EVENT�MESSAGE�(SUBTERR)$*“DC.L�1�D0�CONTENTS�(IO�ERROR�CODE)*“DC.L�1�TASK�NAME**‚HEADER�ERROR�ENTRY�POINT* TSKIOEHƒEQU„**ŠBSETƒ#HDRERR,SUBTERR(A4)�SET�HEADER�ERRORŠBRA.S‚TSKIO10ŒCONTINUE**‚READ�ERROR�ENTRY�POINT* TSKIOERƒEQU„*'ŠBSETƒ#RDERR,SUBTERR(A4)�SET�READ�ERRORŠBRA.S‚TSKIO10ŒCONTINUE**‚WRITE�ERROR�ENTRY�POINT* TSKIOEWƒEQU„*)ŠBSETƒ#WRTERR,SUBTERR(A4)�SET�WRITE�ERRORŠCLR.L‚D5‘CLEAR�FOR�USE6ŠLEA„IOSPBS(A4),A0†GET�THE�IOS�PARAMETER�BLOCK�ADDRESS(ŠMOVE.B�IOSSTA(A0),D5†GET�THE�ERROR�CODE&ŠBSR„OUTERR�GO�OUTPUT�AN�ERROR�MESSAGE)ŠMOVE.L�D5,D0ŽRESTORE�ORIGINAL�ERROR�CODE ** REST OF ERROR HANDLING CODE**TSKIO10ƒLEA„STACK(A4),A7‡RESTORE�THE�STACK%ŠBTSTƒ#TERMERR,SUBTERR(A4)�TO�CANCEL?ŠBNE.S‚TSKIO30ŒBRANCH�IF�YES.ŠBCLRƒ#IOERRF,SPLFLGS(A4)�CLEAR�THE�ERROR�FLAG/ŠLEA„QEVTS(A4),A0‡EVENT�PARAMETER�BLOCK�ADDRESSŠMOVE.L�A0,A1ŽSAVE�ITŠMOVE.L�A0,A5ŽSAVE�IT*ŠADD.L‚#18,A1�POINT�TO�START�OF�EVENT�AREA*ŠMOVE.B�#SUBTELNG,IOERLNG(A1)�EVENT�LENGTH(ŠMOVE.B�#SUBTECDE,IOERCDE(A1)�ERROR�CODE(ŠMOVE.W�SUBTERR(A4),D1…GET�THE�ERROR�BIT$ŠMOVE.W�D1,IOERMSG(A1)…ERROR�MESSAGE$ŠMOVE.L�D0,IOERD0(A1)†IOS�ERROR�CODE-ŠMOVE.L�SPLQNS(A4),IOERNAM(A1)�THIS�TASK�NAME+ŠMOVE.L�#SPLID,(A5)+‡.SPL�TO�GET�THIS�EVENTŠMOVE.L�#MYSES,(A5)+‡SESSIONŠCLR.W‚(A5)+ŽUSE�DEFAULT�ASR%ŠMOVE.L�A1,(A5)+‹EVENT�PACKET�ADDRESSŠCLR.L‚(A5)�USES�DEFAULT�ASR.TSKIO20ƒMOVE.L�#QEVNT,D0ŠQUEUE�EVENT�DIRECTIVEŠTRAPƒ#1‘DO�IT$ŠBEQ.S‚TSKIO40ŒBRANCH�IF�GOOD�RETURNŠCMP.B‚#RTCDTFUL,D0‡ASQ�FULL?&ŠBEQ.S‚TSKIO20ŒBRANCH�IF�YES,TRY�AGAIN*?*‚HERE�IF�CAN'T�TELL�.SPL�ABOUT�ERRORS�-�CLOSE�FILE�AND�DEVICE,;*‚TERMINATE�WITH�FILE�NOT�OUTPUT.�HERE�ALSO�IF�.SPL�SENDS�A#*‚CANCEL�WHILE�FILE�IS�BEING�OUTPUT*&TSKIO30ƒMOVE.L�#1,D1ŽSET�END�PAGE�FLAG4ŠBTSTƒ#RDYERR,SPLFLGS(A4)�OUTPUT�DEVICE�NOT�ON�LINE?$ŠBNE.S‚TSKIO35ŒBRANCH�IF�NOT�ON�LINEŠBSR„SEE�GO�OUTPUT�A�LAST�PAGE TSKIO35ƒMOVE.B�#FOUT,D0‹FILE�LUNŠBSR„CLOSFD�GO�CLOSE�FILEŠMOVE.B�#DOUT,D0‹DEVICE�LUNŠBSR„CLOSFD�GO�CLOSE�THE�DEVICE,ŠBRA„TSKERR�TERM�WITH�FILE�NOT�OUTPUT�STATUS2TSKIO40ƒMOVE.L�#WTEVNT,D0‰WAIT�FOR�EVENT�DIRECTIVEŠTRAPƒ#1‘DO�IT*ŠMOVE.B�SUBTERR(A4),D0…GET�RETURNED�STATUSŠBTSTƒ#TERMERR,D0ˆTO�TERMINATE?$ŠBNE„TSKIO30ŒBRANCH�IF�YES,TERMINATE&ŠCLR.W‚SUBTERR(A4)ˆCLEAR�FOR�NEXT�TIME(ŠBTSTƒ#RDERR,D0ŠRETURN�FOR�A�READ�ERROR?&ŠBEQ.S‚TSKIO50ŒBRANCH�IF�NOT�FROM�READ9ŠLEA„FHSPBS(A4),A0†FROM�A�READ,FIX�UP�THE�PARAMETER�BLOCK'ŠBTSTƒ#NOTSPL,SPLFLGS(A4)�SPOOLER�FILE?ŠBNE.S‚TSKIO45ŒBRANCH�IF�NO6ŠSIOSCO�IOREAD,IOPBLK+IOPCUR,A0�SET�READ�CURRENT�BLOCKŠBRA„TSKS20�GO�DO�THE�READ3TSKIO45ƒSIOSCO�IOREAD,IOPCUR,A0ƒREAD�CURRENT�RECORD%ŠMOVE.L�CURRECS(A4),A3…OUTPUT�ADDRESS#ŠMOVE.L�SBUFSA(A4),A2†INPUT�ADDRESSŠBRA„TSKS60�GO�DO�THE�READ+TSKIO50ƒBTSTƒ#WRTERR,D0‰FROM�A�WRITE�ERROR?ŠBEQ.S‚TSKIO60ŒBRANCH�IF�NO6ŠLEA„IOSPBS(A4),A0†RESET�WRITE�PARAMETER�BLOCK�ADDRESS)ŠBTSTƒ#NOTSPL,SPLFLGS(A4)�A�SPOOLER�FILE?ŠBNE.S‚TSKIO70ŒBRANCH�IF�NO%ŠLEA„TSKS45(PC),A5†GET�RETURN�ADDRESS0ŠMOVE.L�A5,-(A7)‹SET�SPOOLER�FILE�RETURN�ADDRESSŠBRA„DOWR35�GO�TRY�WRITE�AGAIN,TSKIO70ƒLEA„TSKS85(PC),A5†GET�RETURN�ADDRESS4ŠMOVE.L�A5,-(A7)‹SET�NON-SPOOLER�FILE�RETURN�ADDRESS"ŠBRA„DOWR35�GO�TRY�THE�WRITE�AGAIN,TSKIO60ƒBTSTƒ#HDRERR,D0‰FROM�A�HEADER�ERROR?0ŠBEQ„TSKIO30ŒBRANCH�IF�NO,SOMETHING�ELSE,GO�TERM%ŠLEA„TSKS05(PC),A5†GET�RETURN�ADDRESS&ŠMOVE.L�A5,-(A7)‹PUSH�A�RETURN�ADDRESS!ŠBRA„TSKHD10ŒGO�OUTPUT�THE�HEADERŠPAGE*9*‚TSKASR‚THIS�IS�THE�ASR�FOR�THE�SUB-TASK�CREATED�BY�.SPL2*ŠENTER�HERE�BECAUSE�THE�SUB-TASK�SENT�AN�IO�ERROR)*ŠEVENT�TO�.SPL�OR�.SPL�RECEIVED�A�CANCEL;*ŠTHIS�ASR�SETS�TERMERR�ON�IF�THE�SUB-TASK�IS�TO�TERMINATE..*ŠIF�THE�SUB-TASK�IS�TO�CONTINUE,JUST�RETURNS.*'*ŠPROCEED�IO�COMPLETION�COMES�HERE�ALSO*&*‚EVENT�STRUCTURE:‚DC.B�1�EVENT�LENGTH*”DC.B�1�EVENT�CODE�(33)*”DC.L�1�TASKNAME�OF�SENDER*”DC.L�1�SESSION�OF�SENDER*”DC.W�1�MESSAGE&*‚MESSAGE�STRUCTURE:�-1=TERMINATE�TASK*–0=CONTINUE�PROCESSING** TSKASR„EQU„*'ŠMOVE.L�#RDEVNT,D0‰READ�> EVENT�DIRECTIVE/ŠLEA„QEVTS(A4),A0‡EVENT�PARAMETER�BLOCK�ADDRESSŠTRAPƒ#1‘READ�THIS�EVENTŠBNE.S‚TSKASRTN‹ERROR�RETURN.ŠCMP.B‚#SPLECDE,EVCODE(A0)�AN�EVENT�FROM�.SPL?ŠBNE.S‚TSKASR20‹BRANCH�IF�NO"ŠMOVE.W�2(A0),D0‹GET�EVENT�MESSAGE0ŠBMI.S‚TSKASR10‹BRANCH�IF�NEG,SET�FOR�TERMINTION6ŠBCLRƒ#TERMERR,SUBTERR(A4)�CONTINUE,ENSURE�TERM�IS�OFF$ŠBRA.S‚TSKASRTN‹GO�SET�UP�FOR�RETURN=TSKASR10‚BSETƒ#TERMERR,SUBTERR(A4)�SET�TERMINATION�ERROR�CODE4TSKASRTN‚MOVEM.L�(A7)+,D0-D7/A0-A6�RESTORE�REGISTERS"ŠRTR—RETURN�FROM�EVENT-ASR�ENABLED* *‚HERE�IF�AN�IO�COMPLETION�EVENT**TSKASR20‚CMP.B‚#2,EVCODE(A0)†CODE�2�EVENT?,ŠBNE„TSKASRTN‹BRANCH�IF�NO,IGNORE�THIS�EVENTŠCLR.L‚D1‘CLEAR�FOR�USE!ŠMOVE.L�2(A0),A0‹GET�IOCB�ADDRESS1TSKASR25‚MOVE.B�IOSSTA(A0),D1†GET�RETURNED�STATUS*ŠBNE.S‚TSKASR40‹BRANCH�IF�AN�ERROR�RETURND5TSKASR30‚BCLRƒ#PIOF,SPLFLGS(A4)‚CLEAR�PROCEED�IO�FLAG'ŠBRA„TSKASRTN‹GO�RETURN�FROM�THIS�EVENT+TSKASR40‚CMP.B‚#ISTANR,D1‰DEVICE�NOT�READY?#ŠBEQ.S‚TSKASR50‹BRANCH�IF�NOT�READY6ŠBSETƒ#IOERRF,SPLFLGS(A4)�SET�A�PROCEED�IO�ERROR�FOUND"ŠBRA„TSKASR30‹GO�SET�UP�FOR�RETURN*‚TSKHDR‚OUTPUT�THE�BANNER�PAGE�IF�OUTPUT�IS�TO�A�LINE�PRINTER*‚ENTRY:A0=FHS�PARAMETER�BLOCK#*‹THE�PARA.�BLOCK�IS�ALREADY�SET-UP** TSKHDR„EQU„*4ŠMOVE.W�#FHRATT,FHSCMD(A0)�RECIEVE�DEVICE�ATTRIBUTESŠTRAPƒ#3‘GET�THEM$ŠBNE.S‚TSKHDRER‹SOMETHING�WRONG,EXIT-ŠMOVE.W�FHSWCD(A0),D0†GET�RETURNED�ATTRIBUTESŠBTSTƒ#1,D0ŽSUPPORTS�WRITE?"ŠBEQ.S‚TSKHDRER‹BRANCH�IF�NO,ERRORŠBTSTƒ#10,D0�SPOOLER�DEVICE?"ŠBEQ.S‚TSKHDRER‹BRANCH�IF�NO,ERRORŠBTSTƒ#9,D0ŽA�PRINTER?"ŠBNE.S‚TSKHD10ŒBRANCH�IF�A�PRINTER!ŠRTS—RETURN,DON'T�OUTPUT�A�HEADER.TSKHDRER‚BRA„TSKERRDŒDEVICE�ERROR,GO�TERMINATE*1*‚OUTPUT�DEVICE�IS�A�PRINTER-OUTPUT�A�HEADER�PAGE* TSKHD10ƒEQU„*6ŠBSETƒ#PRNTER,SPLFLGS(A4)�SET�PRINTER�IS�OUTPUT�DEVICE.ŠLEA„IOSPBS(A4),A0†IOS�PARAMETER�BLOCK�ADDRESSŠMOVE.B�#DOUT,IOSLUN(A0)ƒLUN<ŠSIOSCO�IOWRIT,IOPNXT+IOPIMG,A0�WRITE,OPTIONS=NEXT�AND�IMAGE1ŠLEA„DATAST(A4),A1†START�ADDRESS�OF�OUTPUT�BUFFER1ŠMOVE.L�A1,IOSSAD(A0)†OUTPUT�BUFFER�START�ADDRESSŠLEA„QBUFS(A4),A2‡ENTRY�ADDRESSŠMOVE.B�#LF,(A1)+ŠLINE�FEEDŠMOVE.B�#LF,(A1)+ŠLINE�FEEDŠMOVE.B�#LF,(A1)+ŠLINE�FEEDŠMOVE.B�#LF,(A1)+ŠLINE�FEEDŠMOVE.L�#BLANK,(A1)+‡4�BLANKSŠMOVE.L�#'JOB�',(A1)+ŠMOVE.L�#'ID=�',(A1)+ ŠCLR.L‚D01ŠMOVE.W�QJOBID(A2),D0†GET�JOB�ID�FROM�QUEUE�ENTRY,ŠMOVE.W�D0,D4ŽSAVE�IT�D4=USER�NUMBER(BINARY)ŠBSR„BDCONV�GO�CONVERT�TO�ASCIIŠTST.L‚D0‘USER�ZERO?ŠBNE.S‚TSKHD11ŒBRANCH�IF�NOŠMOVE.B�#$30,D0ŒFORCE�A�ZERO*TSKHD11ƒMOVE.L�D0,(A1)+‹TOP�HALF�OF�JOB�ID,ŠMOVE.L�D0,D3ŽSAVE�IT�D3=USER�NUMBER(DECIMAL ŠCLR.L‚D0-ŠMOVE.W�QJOBID+2(A2),D0„GET�2ND�HALF�OF�JOBIDŠBSR„BDCONV�CONVERT�TO�ASCII/ŠMOVE.L�#4,D1ŽCOUNTER�FOR�#�BYTES�IN�JOB�NUMBERTSKHD12ƒROL.L‚#8,D0ŽGET�1�CHARŠTST.B‚D0‘SEE�IF�NULL!ŠBNE.S‚TSKHD14ŒBRANCH�IF�NOT�NULL!ŠMOVE.B�#$30,D0ŒNULL,FORCE�A�ZERO-TSKHD14ƒMOVE.B�D0,(A1)+‹SAVE�IN�OUTPUT�BUFFERŠSUB.L‚#1,D1ŽDECREMENT�COUNTERŠBNE.S‚TSKHD12ŒBRANCH�TIL�DONEŠMOVE.L�#'‚US',(A1)+ŠMOVE.L�#'ER‚',(A1)+ŠMOVE.L�D3,(A1)+‹USER�NUMBERŠMOVE.W�#'‚',(A1)+ˆBLANKSŠMOVE.L�A0,A5ŽSAVE�A0DŠLEAƒFHSPBS(A4),A0�ADDRESS�TO�ASSIGN�PRIV.ACCOUNT.OW(GET�USERS�NAME)*ŠSFHSCO�FHASGN,FOPPR,A0„ASSIGN,PUBLIC�READŠMOVE.B�#2,FHSLUN(A0)†LUN�2(ŠMOVE.L�#BLANK,FHSVOL(A0)‚DEFAULT�VOLUMEŠCLR.W‚FHSUSN(A0)‰USER�NUMBER�0'ŠMOVE.L�#'PRIV',FHSCLG(A0)�CATALOG�NAME+ŠMOVE.L�#BLANK,FHSCLG+4(A0)�REST�OF�CATALOG#ŠMOVE.L�#'ACCO',FHSFIL(A0)�FILENAME-ŠMOVE.L�#'UNT�',FHSFIL+4(A0)�REST�OF�FILENAME"ŠMOVE.W�#'OW',FHSEXT(A0)ƒEXTENSIONŠCLR.W‚FHSGEN(A0)‰RESERVED"ŠCLR.W‚FHSWCD(A0)‰READ/WRITE�CODESŠTRAPƒ#3‘ASSIGN�FILE�FOR�READ6ŠBNE.S‚TSKHD17ŒBRANCH�IF�ERROR,MUST�NOT�HAVE�THIS�FILE9ŠSIOSCO�IOREAD,IOPRRN+IOPBIN+IOPIMG,A0�READ�RANDOM�RECORDŠMOVE.> B�#2,IOSLUN(A0)†LUNŠCLR.W‚IOSSRV(A0)‰RESERVEDŠCLR.L‚IOSRRN(A0)‰CLEAR'ŠLEA„QEVTS(A4),A3‡RECORD�BUFFER�ADDRESS$ŠMOVE.L�D4,(A3)ŒKEYED�RECORD�TO�READ#ŠMOVE.L�A3,IOSSAD(A0)†START�ADDRESS(ŠMOVE.L�A3,IOSEAD(A0)†SET-UP�END�ADDRESS(ŠADD.L‚#59,IOSEAD(A0)…ACTUAL�END�ADDRESSŠTRAPƒ#2‘READ�THE�RECORD>ŠBNE.S‚TSKHD16ˆBRANCH�IF�ERROR,RECORD�MUST�NOT�EXIST,IGNORE�IT6ŠMOVE.L�#5,D0ŽCOUNTER�FOR�MOVING�OWNERS�NAME�TO�BANNER"ŠADDA.L�#8,A3ŽBUMP�PAST�DEPT.�NAME)TSKHD15ƒMOVE.L�(A3)+,(A1)+ˆNAME�TO�BANNERŠSUB.L‚#1,D0ŽDECREMENT�COUNTER)ŠBNE.S‚TSKHD15ŒBRANCH�TIL�MOVED(20�BYTES)1TSKHD16ƒMOVE.W�#FHCLOS,FHSCMD(A0)�CLOSE�THIS�FILEŠTRAPƒ#3‘DO�THE�CLOSE8TSKHD17ƒMOVE.L�A5,A0ŽRESTORE�IOS�PARAMETER�BLOCK�ADDRESS&ŠMOVE.W�#LF*$100+CR,(A1)+‚LINE�FEED,CRŠMOVE.L�#BLANK,(A1)+‡BLANKSŠMOVE.L�#'FILE',(A1)+ŠMOVE.L�#'NAME',(A1)+ŠMOVE.W�#'=�',(A1)+/ŠMOVE.B�QCATLG(A2),D0†GET�FIRST�BYTE�OF�CATALOG*ŠCMP.B‚#'�',D0ŒSEE�IF�BLANK�FOR�NO�CATALOG3ŠBEQ.S‚TSKHD19ŒBRANCH�IF�BLANK,NO�CATALOG�SPECIFIED+ŠLEA„QCATLG(A2),A3†GET�CATALOG�NAME�ADDRESS(ŠMOVE.L�#8,D0Ž#�OF�BYTES�IN�CATALOG�NAME,ŠMOVE.B�#'�',(A1)+‰BLANK�TO�MAKE�THINGS�EVEN1TSKHD18ƒMOVE.B�(A3)+,(A1)+ˆCATALOG�NAME�TO�BANNERŠSUB.L‚#1,D0ŽDECREMENT�COUNTER#ŠBNE.S‚TSKHD18ŒBRANCH�TIL�MOVED�ALL3ŠMOVE.B�#'.',(A1)+‰DOT�BETWEEN�CATALOG�AND�FILENAME9TSKHD19ƒMOVE.L�QFILEN(A2),(A1)+ƒFILENAME�FROM�QUEUE�ENTRY+ŠMOVE.L�QFILEN+4(A2),(A1)+�REST�OF�FILENAMEŠMOVE.B�#'.',(A1)+ ŠMOVE.B�QEXT(A2),(A1)+…EXTENSION*ŠMOVE.B�QEXT+1(A2),(A1)+ƒREST�OF�EXTENSION#ŠMOVE.B�#$20,(A1)+‰BLANK�TO�BE�EVEN&ŠMOVE.W�#LF*$100+CR,(A1)+‚LINE�FEED,CRŠMOVE.L�#BLANK,(A1)+‡BLANKSŠMOVE.L�#'TASK',(A1)+ŠMOVE.L�#'NAME',(A1)+ŠMOVE.W�#'=�',(A1)+ 3ŠMOVE.L�QTASKN(A2),(A1)+ƒTASK�NAME�FROM�QUEUE�ENTRY &ŠMOVE.W�#LF*$100+CR,(A1)+‚LINE�FEED,CRŠMOVE.L�#BLANK,(A1)+ŠMOVE.L�#'SESS',(A1)+ŠMOVE.L�#'ION=',(A1)+ŠMOVE.W�#'‚',(A1)+0ŠMOVE.L�QSESS(A2),(A1)+„SESSION�FROM�QUEUE�ENTRY&ŠMOVE.W�#LF*$100+CR,(A1)+‚LINE�FEED,CRŠMOVE.L�#BLANK,(A1)+‡BLANKSŠMOVE.L�#'DATE',(A1)+ŠMOVE.W�#'=�',(A1)+#ŠMOVE.L�QDATE(A2),D0‡GET�ENTRY�DATEŠBSR„ODATCONV‹CONVERT�TO�ASCIIŠMOVE.W�D0,(A1)+‹SAVE�MONTHŠMOVE.B�#'/',(A1)+ŠROL.L‚#8,D0ŽGET�1ST�DAYŠTST.B‚D0‘SEE�IF�NULL!ŠBNE.S‚TSKHD20ŒBRANCH�IF�NOT�NULLŠMOVE.B�#'0',D0ŒMAKE�IT�A�ZERO$TSKHD20ƒMOVE.B�D0,(A1)+‹SAVE�1ST�DAYŠROL.L‚#8,D0ŽGET�2ND�DAYŠTST.B‚D0‘SEE�IF�NULL!ŠBNE.S‚TSKHD30ŒBRANCH�IF�NOT�NULLŠMOVE.B�#'0',D0ŒMAKE�IT�A�ZERO$TSKHD30ƒMOVE.B�D0,(A1)+‹SAVE�2ND�DAYŠMOVE.B�#'/',(A1)+ŠMOVE.L�D1,(A1)+‹YEAR&ŠMOVE.W�#LF*$100+CR,(A1)+‚LINE�FEED,CRŠMOVE.L�#BLANK,(A1)+‡BLANKSŠMOVE.L�#'TIME',(A1)+ŠMOVE.W�#'=�',(A1)+ŠMOVE.L�QTIME(A2),D0‡GET�TIMEŠBSR„TIMECONV‹CONVERT�TO�ASCIIŠMOVE.W�D0,(A1)+‹HOURSŠMOVE.B�#':',(A1)+ŠROL.L‚#8,D0ŽGET�1ST�MINUTEŠTST.B‚D0‘SEE�IF�NULL!ŠBNE.S‚TSKHD40ŒBRANCH�IF�NOT�NULLŠMOVE.B�#'0',D0ŒMAKE�IT�ZERO'TSKHD40ƒMOVE.B�D0,(A1)+‹SAVE�1ST�MINUTEŠROL.L‚#8,D0ŽGET�2ND�MINUTEŠTST.B‚D0‘SEE�IF�NULL!ŠBNE.S‚TSKHD50ŒBRANCH�IF�NOT�NULLŠMOVE.B�#'0',D0ŒMAKE�IT�A�ZERO'TSKHD50ƒMOVE.B�D0,(A1)+‹SAVE�2ND�MINUTEŠMOVE.B�#':',(A1)+ŠROR.L‚#8,D1ŽGET�1ST�SECONDŠTST.B‚D1‘NULL?!ŠBNE.S‚TSKHD60ŒBRANCH�IF�NOT�NULLŠMOVE.B�#$30,D1ŒFORCE�A�ZERO!TSKHD60ƒMOVE.B�D1,(A1)+‹TO�BUFFERŠROL.L‚#8,D1ŽGET�2ND�SECONDŠMOVE.B�D1,(A1)+‹TO�BUFFER&ŠMOVE.W�#LF*$100+CR,(A1)+‚LINE�FEED,CR1ŠMOVE.L�#24,D0�DO�48�LINE�FEEDS‚MODIFIED�062184�4%TSKHD70ƒMOVE.W�#$0A0A,(A1)+‡TO�BUFFERŠSUB.L‚#1,D0ŽDECREMENT�COUNTERŠBNE.S‚TSKHD70ŒBRANCH�TIL�DONEŠMOVE.B�#LF,(A1)‹LINE�FEED/ŠMOVE.L�A1,IOSEAD(A0)†OUTPUT�BUFFER�END�ADDRESS'ŠLEA„QBUFS(A4),A1‡RESTORE�ENTRY�ADDRESSŠTRAPƒ#2‘OUTPUT�THE�HEADER�PAGEŠBEQ.S‚TSKHD80ŒGOOD�RETURN&ŠBSR„CKRDYŽGO�SEE�IF�PRINTER�NOT�READY'ŠBNE„TSKIOEHŒBRANCH�IF�SOME�OTHER�ERROR/TSKHD80ƒCLR.L‚D1‘FLAG�FOR�OUTPUTTING�FRONT�PAGEŠBSR.S‚SEE�GO�FINISH�PAGEŠBNE„TSKIOEHŒERROR�RETURNŠRTS—RETURN�TO�CALLERŠPAGE!*‚SEE‚OUTPUT�FRONT�AND�BACK�PAGES*‚ENTRY:D1=0=FRONT�PAGE**ˆOUTPUT�5�LINES�OF�****�AND�A�TOP�OF�FORM*ˆD1=1=END? �PAGE5*ˆOUTPUT�A�TOP�OF�FORM,59�BLANK�LINES,5�LINES�OF�****)*‚EXIT:D0=0=GOOD�RETURN,OTERWISE�AN�ERROR*‚USES:0�1�2�3�4�5�6�7 *…D�R�P�*�* *…A�*ƒ*ƒP SEE‡EQU„*'ŠBTSTƒ#RDYERR,SPLFLGS(A4)�DEVICE�READY?5ŠBNE„SEERTN�BRANCH�IF�NOT�READY-DON'T�TRY�THIS�OUTPUTŠCLR.L‚D0‘CLEAR�FOR�USE$ŠBTSTƒ#PRNTER,SPLFLGS(A4)�A�PRINTER?/ŠBEQ.S‚SEERTN�BRANCH�IF�NO,DON'T�DO�THIS�OUTPUT*ŠLEA„IOSPBS(A4),A0†PARAMETER�BLOCK�ADDRESSŠMOVE.B�#DOUT,IOSLUN(A0)ƒLUN$ŠSIOSCO�IOWRIT,IOPIMG,A0ƒIMAGE�WRITE)ŠLEA„SCRATCHS(A4),A2„BUFFER�START�ADDRESS(ŠMOVE.L�A2,IOSSAD(A0)†TO�PARAMETER�BLOCKŠTST.L‚D1‘DOING�FRONT�PAGE?ŠBEQ.S‚SEE20ŽBRANCH�IF�FRONT#ŠMOVE.W�#$0C0D,(A2)+‡TOP�OF�FORM,CR:ŠMOVE.L�#64,D0�#�OF�LINE�FEEDS�TO�OUTPUT�MODIFIED�062184�4ŠMOVE.B�#LF,D2�LINE�FEED�CODE*SEE10…MOVE.B�D2,(A2)+‹TO�THE�OUTPUT�BUFFERŠSUB.L‚#1,D0ŽDECREMENT�COUNTERŠBNE.S‚SEE10ŽBRANCH�TIL�DONE(ŠMOVE.L�A2,IOSEAD(A0)†SET-UP�END�ADDRESS'ŠSUB.L‚#1,IOSEAD(A0)†ACTUAL�END�ADDRESSŠTRAPƒ#2‘DO�THE�OUTPUT$ŠBEQ.S‚SEE20ŽBRANCH�IF�A�GOOD�RETURN(ŠBSR.S‚CKRDYŽGO�SEE�IF�PRINTER�NOT�READYŠBNE.S‚SEERTN�ERROR�RETURN!SEE20…MOVE.L�#5,D3ŽOUTPUT�5�LINES0SEE30…LEA„SCRATCHS(A4),A2„RESTORE�BUFFER�ADDRESSŠMOVE.W�#'**',D2‹**�FOR�OUTPUTŠMOVE.L�#64,D0�128�**'S*SEE40…MOVE.W�D2,(A2)+‹TO�THE�OUTPUT�BUFFERŠSUB.L‚#1,D0ŽDECREMENT�COUNTER#ŠBNE.S‚SEE40ŽBRANCH�TIL�BUFFER�FULL!ŠCMP.L‚#1,D3ŽDOING�THE�LAST�LINE?ŠBNE.S‚SEE50ŽBRANCH�IF�NOŠTST.L‚D1‘DOING�THE�BACK�PAGE? ŠBNE.S‚SEE50ŽBRANCH�IF�BACK�PAGE#ŠMOVE.W�#$0D0C,(A2)+‡TOP�OF�FORM,CRŠBRA.S‚SEE60ŽGO�OUTPUT+SEE50…MOVE.W�#LF*$100+CR,(A2)+‚CR,LINE�FEED-SEE60…MOVE.L�A2,IOSEAD(A0)†SET-UP�END�ADDRESS'ŠSUB.L‚#1,IOSEAD(A0)†ACTUAL�END�ADDRESSŠTRAPƒ#2‘DO�THE�OUTPUT$ŠBEQ.S‚SEE70ŽBRANCH�IF�A�GOOD�RETURN(ŠBSR.S‚CKRDYŽGO�SEE�IF�PRINTER�NOT�READYŠBNE.S‚SEERTN�ERROR�RETURN'SEE70…SUB.L‚#1,D3ŽDECRMENT�LINE�COUNTER%ŠBNE.S‚SEE30ŽBRANCH�IF�MORE�TO�OUTPUTSEERTN„RTS—RETURN�TO�CALLERŠPAGE***‚CKRDY�PROCESS�ERROR�RETURN�FROM�IOS�CALL5*ˆIF�ERROR�IS�NOT�'E1'�(DEVICE�NOT�READY)�RETURN�WITH,*ˆCC�NOT�ZERO�AND�ORIGINAL�ERROR�CODE�IN�D0.9*ˆIF�ERROR�IS�DEVICE�NOT�READY,DO�A�DELAY�FOR�1.5�SECONDS6*ˆAND�RE-ISSUE�THE�IOS�CALL�UNTIL�THE�DEVICE�NOT�READY3*ˆERROR�CODE�IS�CLEARED,A�DIFFERENT�ERROR�OCCURS,OR*ˆA�TERMINATE�WAS�ISSUED.*‚ENTRY:D0=ERROR�CODE *ˆA0=IOS�PARAMETER�BLOCK�ADDRESS*ˆUSES:�0�1�2�3�4�5�6�7*‹D‚R*‹A‚P‡P* CKRDY…EQU„*2ŠBTSTƒ#TERMERR,SUBTERR(A4)�TO�TERMINATE�THIS�TASK?$ŠBNE„TSKIO30ŒBRANCH�IF�YES,TERMINATE)ŠCMP.B‚#ISTANR,D0‰DEVICE�NOT�READY�ERROR?)ŠBEQ.S‚CKRDY10ŒBRANCH�IF�DEVICE�NOT�READY8CKRDYRTN‚BCLRƒ#RDYERR,SPLFLGS(A4)�TURN�OF�NOT�READY�FLAGŠTST.B‚D0‘SET�CONDITION�CODESŠRTS—RETURN�TO�CALLER8CKRDY10ƒMOVE.L�A0,-(A7)‹SAVE�IOS�PARAMETER�BLOCK�ADDRESS7ŠBSETƒ#RDYERR,SPLFLGS(A4)�TURN�ON�DEVICE�NOT�READY�FLAG!ŠMOVE.L�#DELAY,D0ŠDELAY�DIRECTIVE"ŠMOVE.L�#1500,A0‹DELAY�1.5�SECONDS"ŠTRAPƒ#1‘CALL�EXEC�TO�DO�THE�DELAY4ŠMOVE.L�(A7)+,A0‹RESTORE�IOS�PARAMETER�BLOCK�ADDRESSŠTRAPƒ#2‘RE-ISSUE�THE�CALLŠBEQ„CKRDYRTN‹GOOD�RETURNŠBRA„CKRDYŽERROR�RETURNŠPAGE*7*‚OUTERR�OUTPUT�'CANNOT�SPOOL�THIS�FILE�TO�THE�PRINTER-*‘INVALID�FILETYPE'*‚USES:0�1�2�3�4�5�6�7*…D�* *…A�*�*�*ƒP* OUTERR„EQU„*$ŠBTSTƒ#PRNTER,SPLFLGS(A4)�A�PRINTER?4ŠBEQ.S‚OUTRTN�BRANCH�IF�NO,DON'T�OUTPUT�THIS�MESSAGE/ŠLEA„SCRATCHS(A4),A1„GET�OUTPUT�MESSAGE�ADDRESSŠMOVE.L�A1,A2ŽSAVE�THIS�ADDRESS'ŠMOVE.L�#'CANN',(A1)+†BUILD�THE�MESSAGEŠMOVE.L�#'OT�S',(A1)+†.ŠMOVE.L�#'POOL',(A1)+†.ŠMOVE.L�#'�THI',(A1)+†.ŠMOVE.L�#'S�FI',(A1)+†.ŠMOVE.W�#'LE',(A1)+ˆ.#ŠMOVE.W�#$0D0C,(A1)+‡TOP�OF�FORM,CR%ŠMOVE.L�A1,A0ŽPARAMETER�BLOCK�ADDRESSŠMOVE.B�#DOUT,IOSLUN(A0)ƒLUN$ŠSIOSCO�IOWRIT,IOPIMG,A0ƒIMAGE�WRITE+ŠMOVE.L�A2,IOSSAD(A0)†MESSAGE�START�ADDRESS!ŠMOVE.L�A1,IOSEAD(A0)†END�ADDRESS'ŠSUB.L‚#1,IOSEAD(A0)†ACTUAL�END�ADDRESSŠCLR.L‚IOSRRN(A0)‰NOT�USEDŠCLR.L‚IOSLEN(A0)‰NOT�USEDŠCLR.W‚IOSSRV(A0)‰NOT�USEDŠCLR.L‚IOSCAD(A0)‰NOT�USEDŠTRAPƒ#2‘DO�THE�OUTPUTOUTRTN„RTS—RETURN�TO�CALLERŠNOP? ééééééé' SPOOL AFûûrrSPOOL LFrrSPOOL SA  ‚?rrSRCCOM LF––rrSRCCOM PFŸŸrrSRCCOM SA¨¨+ñrrSYMBUG AFÙÙWrrSYMBUG LFâârrYMBUG SAë Ü“rr=/* =/*†SPOOL.AF=/*(=/* Chain file to assemble SPOOL utility=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to SPOOL.LS=/*=/IFC \1ƒ=ARG�SPOOL.LS=/ENDIF=/*=ASM SPOOL.SA,SPOOL.RO,\1;RZ=86=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDééé@ éééó=/* =/*†SPOOL.LF=/*&=/* Link chain file to create SPOOL.LO=/*:=/* If no output argument is specified for the listing the'=/* chain file will default to SPOOL.LL=/*=/IFC \1ƒ=ARG�SPOOL.LL=/ENDIF=/*=LINK ,SPOOL.LO,\1;MIXAHATTRIBUTES D PSEG SEG0:0,14 $0INPUT SPOOL.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééééüŠLISTŠPAGE**”SPOOL�MODIFICATION�HISTORY**…REVISION�CODE‰122084�4*1*…PC�relative�addressing�was�explicitly�inserted.***…REVISION�CODE‰120484�4*C*ˆBranch�instruction�in�the�branch�table,�BRATBL,�contained�a�shortD*ˆbranch�which�caused�the�jump�vector�for�the�Help�subcommand�to�getE*ˆto�an�illegal�instruction�(the�middle�of�an�instruction).�A�NOP�was1*ˆadded�to�make�up�for�the�short�addressing�mode.**…REVISION�CODE‰062184�4*?*…A�new�option,�CANC�*,�was�added�which�allows�user�0�to�cancelB*…all�files�in�the�spooler�queue.�The�routine�CANCQST�now�requiresF*…two�parameters,�the�starting�address�of�the�message,�which�is�passedD*…in�a6�and�the�message�length-1,�passed�in�D4.�This�allows�the�sameC*…routine�to�be�us@ ed�for�the�questions�"OK�TO�CANCEL�ALL�YOUR�FILESB*…(Y/N)�?"�and�"OK�TO�CANCEL�ALL�FILES�IN�QUEUE�(Y/N)�?".�When�theC*…cancel�all�files�in�queue�option�is�chosen,�.SPL�insures�that�the8*…user�doing�this�is�user�0�and�returns�in�error�if�not.*G*…A�BRA�to�QUIT�was�changed�to�a�BRA.S�to�eliminate�an�assembly�warning*3*…The�opening�message�now�contains�the�utility�name*FŠTTL�SPOOLER�UTILITY�6/21/84�REL�4.30�COPYRIGHT�1984�BY�MOTOROLA,�INC.ISPOL†IDNT‚4,0�SPOOL�UTILITY�6/21/84�REL�4.30�COPYRIGHT�1984�MOTOROLA�INC. ŠSECTION�0ŠOPT„FRS* *ˆINCLUDE:*�9995.&.IOE.EQ*�9995.&.TR1.EQ*ŠNOLISTŠINCLUDE�9995.&.IOE.EQŠINCLUDE�9995.&.TR1.EQŠLIST ŠSECTION�0 DATAS…EQU„*,ŠDC.Bƒ'SPOOL�122084�4'ƒDISPLAYS�UTILITY�NAMEŠDS.Bƒ100�SPOOLER�STACK STACK…EQU„**1*‚TABLE�OF�SPOOLER�COMMANDS�AND�ROUTINE�ADDRESSES*!CMDTBL„EQU„*’4�CHARACTER�COMMANDS ŠDC.Lƒ'CANC'ŠDC.Wƒ0’CANCEL ŠDC.Lƒ'CONT'ŠDC.Wƒ1’CONTINUE ŠDC.Lƒ'FORM' ŠDC.Wƒ2’FORM ŠDC.Lƒ'PRIN' ŠDC.Wƒ3’PRINT ŠDC.Lƒ'STAR' ŠDC.Wƒ4’START ŠDC.Lƒ'COPI' ŠDC.Wƒ5’COPY ŠDC.Lƒ'QUEU' ŠDC.Wƒ6’QUEUE ŠDC.Lƒ'QUIT' ŠDC.Wƒ7’QUIT ŠDC.Lƒ'HELP' ŠDC.Wƒ8’QUERYCMDTBLEƒEQU„*’END�OF�TABLECMDTBLLƒEQU„6’ENTRY�LENGTH'CMDTBL1ƒEQU„*’1�CHARACTER�COMMAND�TABLE ŠDC.Bƒ'F',0 ŠDC.Wƒ2’FORM MI9G&=.:6D>:F:NBVA^CfInEv@~J† ŠDC.Bƒ'P',0 ŠDC.Wƒ3’PRINT ŠDC.Bƒ'S',0 ŠDC.Wƒ4’START ŠDC.Bƒ'Q',0 ŠDC.Wƒ6’QUEUECMDTBL1E‚EQU„*’END�OF�TABLECMDTBL1L‚EQU„4’ENTRY�LENGTH**‚SAVE�START-UP�REGISTERS*-SAVREG„DS.Bƒ9*4�SAVE�9�REGISTERS,4�BYTES�EACH**‚INPUT�COMMAND�LINE*BUF‡COMLINE�82�80�BYTES BUFE†EQU„*-2*QURMSG„DC.Bƒ'COMMAND�SYNTAX:�'ŠDC.Bƒ'CANCEL'ŠDC.Bƒ'CANCEL�'ŠDC.Bƒ'CANCEL��'ŠDC.Bƒ'CANCEL�<*>'‡062184�4ŠDC.Bƒ'CONTINUE�'"ŠDC.Bƒ'COPIES�'&ŠDC.Bƒ'COPIES��'$ŠDC.Bƒ'FORMS�'=ŠDC.Bƒ'PRINT�[<,FORMS�ID>]'ŠDC.Bƒ'[,<#�OF�COPIES>]�'ŠDC.Bƒ'QUEUE�'ŠDC.Bƒ'QUEUE��'ŠDC.Bƒ'QUEUE��'ŠDC.Bƒ'QUEUE�<S>�'ŠDC.Bƒ'QUEUE�
'&ŠDC.Bƒ'START�[,<#�OF�COPIES>]�'(ŠDC.Bƒ'START�[,<#�OF�COPIES>]' ŠDC.Bƒ'QUIT'>LNGTBL„DC.Bƒ15,5,13,17,9,21,25,29,27,69,5,19,19,9,11,29,31,3,0*SPOOLF„EQU„$40,ŠDS.Wƒ0’062184�4�-�KEEP�IT�ON�EVEN�ADDRESSES%IOSPB…DS.BƒIOSBLN�IOS�PARAMETER�BLOCK%FHSPB…DS.BƒFHSNLN�FHS�PARAMETER�BLOCK"SCRATCHƒDS.BƒFHSNLN�SCRATCH�BUFFERPRMPT…DC.Bƒ'>'�PROMPTPRMPTE„EQU„*-1ŠDS…0’TO�BE�EVENCONS†DC.Lƒ0’USER�CONSOLE�NAMEPRTSTF„DC.Wƒ0’PRINT-START�FLAG1CNQST…DC.Bƒ'OK�TO�CANCEL�ALL�YOUR�FILES�(Y/N)�?�'CNQSTE„EQU„*-1?CNQST2„DC.Bƒ'OK�TO�CANCEL�ALL�FILES�IN�QUEUE�(Y/N)�?�'�062184�4CNQST2EƒEQU„*-1**ˆERROR�MESSAGE�PARAMETER�BLOCK* EM_PBLKƒEQU„*+EM_D0…DC.Lƒ0’D0�IOS/FHS�ERROR�RETURN�STATUS.EM_A0…DC.Lƒ0’A0�IOS/FHS�PARAMETER�BLOCK�ADDRESEM_OPT„DC.Bƒ0’OPTIONS�FLAGEM_TLUNƒDC.Bƒ0’LDFLUN$EM_QRC„DC.Bƒ0’QUERY�RETURN�CHARACTEREM_KLUNƒDC.Bƒ0’CDFLUN3EM_SPA„DC.Lƒ0’START�ADDRESS�FOR�USER�TEXT�PLUG�TOOL1EM_EPA„DC.Lƒ0’END�ADDRESS�FOR�USER�TEXT�PLUG�TOOLŠPAGEŠXREFƒEDITFILE,SBARG*/*‚SPOOL‚UTILITY�TO�HANDLE�USER�COMMANDS�TO�.SPL)*‰TAKES�ASSORTED�USER�COMMANDS�AND�ISSUES)*‰PARAMETER�BLOCKS�TO�FHS,WHICH�SENDS�THE *‰EVENTS�TO�.SPL�FOR�PROCESSING.+*‰RETURNED�STATUS�IS�SET�BY�.SPL.�.SPL�DOES*‰MOST�OF�THE�ERROR�CHECKING.*4*‰COMMANDS�MAY�BE�ENTERED�ON�THE�INPUT�LINE.�IN�THAT/*‰CASE�ONLY�THAT�COMMAND�IS�PROCESSED�AND�SPOOL;*‰TERMINATES.�IF�NO�COMMAND�IS�ENTERED�ON�THE�COMMAND�LINE,5*‰SPOOL�ENTERS�AN�INTERACTIVE�MODE,PROMPTING�FOR�EACH"*‰COMMAND�UNTIL�'QUIT'�IS�ENTERED.*C*ˆVALID�COMMANDS�ARE:CANCEL,CONTINUE,FORMS,PRINT,COPIES,START,QUIT,@*ˆHELP,AND�QUEUE.�EACH�MAY�BE�ABBREVIATED�WITH�THE�FIRST�4�CHARS=*ˆOF�THE�NAME.�ALSO,QUEUE�MAY�BE�ENTERED�AS�'Q',FORMS�AS�'F', *ˆPRINT�AS�'A P'�AND�START�AS�'S'.*<*ˆALL�IOS,FHS,�AND�.SPL�ERROR�RETURNS�ARE�HANDLED�BY�CALLING?*ˆTHE�ERROR�MESSAGE�HANDLER�THRU�TRAP�#4.�ARGUMENT�SUBSTITUTION@*ˆIS�HANDLED�BY�CALLING�SBARG�AFTER�EACH�READ�IN�THE�INTERACTIVE*ˆMODE.*2*ˆGENERAL�REGISTER�USAGE:A4=DATA�AREA�BASE�ADDRESS-*ŸA0=FHS�PARAMETER�BLOCK�ADDRESS�(.SPL�CALLS)*ŸA3=COMMAND�BUFFER�ADDRESS&*ŸD2=INTERACTIVE�FLAG�(-1=INTERACTIVE)*ŸD6=INPUT�BUFFER�LENGTH**ƒMAIN�SPOOLER�DRIVER* SPOL†EQU„*+ŠLEA„DATAS(PC),A7‡GET�START�OF�DATA�ADDRESS=ŠMOVEM.L�D0-D6/A0-A1,SAVREG-DATAS(A7)�SAVE�START-UP�REGISTERS+ŠMOVE.L�A1,CONS-DATAS(A7)‚USER�CONSOLE�NAMEŠLEA„STACK(PC),A7‡STACK�ADDRESS,ŠLEA„DATAS(PC),A4‡BASE�ADDRESS�OF�DATA�START ŠCLR.L‚D2‘CLEAR�INTERACTIVE�FLAG&ŠBSR„INITMSGŒGO�OUTPUT�INITIAL�MESSAGEŠTST.L‚D6‘ANY�COMMAND�LINE?ŠBNE.S‚SPOL20�BRANCH�IF�YES&ŠMOVE.L�#-1,D2�SET�TO�INTERACTIVE�MODESPOL10„BSR„PROMPT�GET�A�COMMAND)SPOL20„LEA„BUF(PC),A3‰GET�COMMAND�ADDRESS$ŠBSR.S‚GETCMD�GO�GET�COMMAND�ADDRESSŠTST„D7‘GOT�ONE?ŠBMI.S‚SPOL30�BRANCH�IF�NO2ŠMOVE.L�A1,D0ŽGET�THE�OFFSET�INTO�THE�BRANCH�TABLEŠLSL.L‚#2,D0ŽMULTIPLY�BY�4+ŠLEA„BRATBL(PC),A1†GET�BRANCH�TABLE�ADDRESS)ŠADD.L‚D0,A1ŽBRANCH�TABLE�ROUTINE�ADDRESS ŠJSR„(A1)�GO�PROCESS�THE�COMMANDŠTST„D2‘INTERACTIVE?%ŠBEQ.S‚QUIT�BRANCH�IF�NO,GO�TERMINATE+ŠBRA„SPOL10�INTERACTIVE,GO�GET�NEXT�COMMAND6SPOL30„BSR„QUERYŽINVALID�ENTRY,OUTPUT�LIST�OF�COMMANDSŠBRA„SPOL10�GO�GET�INPUT�AGAIN*#*ˆBRANCH�TABLE�FOR�COMMAND�ROUTINES* BRATBL„EQU„*ŠBRA„CANCEL�CANCEL�COMMANDŠBRA„CONT�CONTINUE�COMMANDŠBRA„FORM�FORMS�COMMANDŠBRA„PRINTŽPRINT�COMMANDŠBRA„STRT�START�COMMANDŠBRA„COPY�COPIES�COMMANDŠBRA„QUEUEŽQUEUE�COMMANDŠBRA.S‚QUIT�QUIT�COMMAND$ŠNOP�NEEDED�FOR�PROPER�VECTOR�120484ŠBRA„QUERYŽHELP�COMMANDŠPAGE***‚QUIT�COMMAND…TERMINATE**'QUIT†ERQ.TERM�#0,#0ŒGOOD�TERMINATE�CODE***ˆERROR�TERMINATION* QUITERRƒEQU„*"ŠBSR„ERRORŽGO�OUTPUT�ERROR�MESSAGE%ŠERQ.TERM�#0,#$C000ˆERROR�TERMINATIONŠPAGE**‚GETCMD‚GET�COMMAND5*‚SEARCHES�COMMAND�TABLES�FOR�A�VALID�SPOOLER�COMMAND*0*‚ENTRY:A3=BUFFER�ADDRESS�CONTAINING�THE�COMMAND*ˆA4=BASE�ADDRESS*ˆD2=INTERACTIVE�FLAG*ˆD6=INPUT�BUFFER�LENGTH%*‚EXIT:A3=ADDRESS�OF�COMMAND�ARGUMENT/*‡A1=ROUTINE�ADDRESS�OFFSET�TO�THE�BRANCH�TABLE*‡D2=INTERACTIVE�FLAG*‡D6=REMAINING�BUFFER�LENGTH*‡D7=0=VALID�COMMAND*‡D7=-1=INVALID�COMMAND*‚USES:0�1�2�3�4�5�6�7 *…Dƒ*�P�*‡R *…AƒR�*�R�P�** GETCMD„EQU„*!ŠMOVE.L�#0,A1ŽCLEAR�FOR�LATER�USE!ŠMOVE.L�(A3),D1ŒGET�INPUT�COMMAND1ŠLEA„CMDTBL(PC),A2†START�ADDRESS�OF�COMMAND�TABLE0ŠLEA„CMDTBLE(PC),A5…END�ADDRESS�OF�COMMAND�TABLE0GETC10„CMP.L‚(A2),D1ŒLOOK�FOR�A�MATCHING�COMMAND0ŠBEQ.S‚GETC30�BRANCH�IF�FOUND�A�MATCHING�COMMAND)ŠADD.L‚#CMDTBLL,A2ˆBUMP�TO�THE�NEXT�ENTRY%ŠCMP.L‚A5,A2ŽSEE�IF�PAST�END�OF�TABLE&ŠBLT„GETC10�BRANCH�IF�NOT�PAST�THE�END3ŠLEA„CMDTBL1(PC),A2…SEARCH�THE�1�CHAR�COMMAND�TABLE)ŠLEA„CMDTBL1E(PC),A5„END�ADDRESS�OF�TABLEŠCLR.L‚D1‘CLEAR�FOR�USE!ŠMOVE.B�(A3),D1ŒGET�INPUT�COMMAND%GETC20„CMP.B‚(A2),D1ŒLOOK�FOR�A�MATCH!ŠBEQ.S‚GETC40�BRANCH�IF�FOUND�ONE&ŠADD.L‚#CMDTBL1L,A2‡BUMP�TO�NEXT�ENTRYŠCMP.L‚A5,A2ŽPAST�END�OF�TABLE?,ŠBLT.S‚GETC20�BRANCH�IF�MORE�TABLE�TO�SEARCH&ŠMOVE.L�#-1,D7�SET�TO�NO�COMMAND�FOUND ŠRTS—RETURN1GETC30„MOVE.W�4(A2),A1‹GET�COMMAND�ADDRESS�OFFSET"ŠBRA.S‚GETC50�GO�FINISH�PROCESSING1GETC40„MOVE.W�2(A2),A1‹GET�COMMAND�ADDRESS�OFFSET*.*‚VAILD�COMMAND,GET�ADDRESS�OF�ARGUMENT,IF�ANY*%GETC50„CLR.L‚D7‘SET�FOR�A�GOOD�RETURN"ŠMOVE.B�#'�',D1ŒSEARCH�FOR�A�BLANK'ŠMOVE.B�#',',D0ŒSEARCH�FOR�A�COMMA�ALSO!GETC60„MOVE.B�(A3)+,D3‹GET�A�BYTEŠCMP.B‚D0,D3ŽA�COMMA?ŠBEQ.S‚GETC70�BRANCH�IF�YESŠCMP.B‚D1,D3ŽA�BLANK?ŠBEQ.S‚GETC70�BRANCH�IF�YES$ŠSUB.L‚#1,D6ŽDECREMENT�BUFFER�LENGTH'ŠBNE.S‚GETC60�BRANCH�IF�MORE�TO�LOOK�AT1GETC70„TST„D6‘SEE�IF�MUST�DECREMENT�FOR�THE�BLANKŠBLE.S‚GETC80�BRANCH�IF�NO ŠSUB.L‚#1,D6ŽBUMP�PAST�THE�BLANKGETC80„RTS—RETURNŠPAGE**‚CANCEL‚CANCEL�A�SPOOLER�JOB*ŠCOMMAND�CODE=$0202*ŠSPECIFY�ACTION*Š-------�------*ŠJOBID�A DELETE�THAT�JOB*ŠFILENAMEŒDELETE�THAT�FILENAME4*Š*“DELETE�ALL�JOBS�IN�QUEUE�(PRIVELEGED)�-�062184�4.*ŠNOTHING�DELETE�ALL�JOBS�FOR�THAT�USER�NUMBER**‚ENTRY:D2=INTERACTIVE�FLAG*ˆA4=BASE�ADDRESS*ˆD6=COMMAND�LINE�LENGTH*ˆA3=COMMAND�LINE�ADDRESS*‚EXIT:D2=INTERACTIVE�FLAG$*‚CALLS:CLRFHS‚FNJOBID‚ERROR‚CANCQST** CANCEL„EQU„*8ŠBSR„CLRFHSŒGO�CLEAR�THE�PARA�BLOCK,RETURN�ADDRESS�IN�A0*ŠMOVE.W�#SPLCANC,FHSCMD(A0)�CANCEL�COMMAND.ŠLEA„SAVREG(PC),A5†GET�SAVED�REGISTERS�ADDRESS)ŠMOVE.W�14(A5),FHSUSN(A0)‚SET�USER�NUMBERŠTST„D6‘ANY�ARGUMENTS?ŠBGT.S‚CANC40�BRANCH�IF�YES=CANC10„LEA„CNQST(PC),A6‡BEGINNING�OF�MESSAGE�-�ADDED�062184�4:ŠMOVE.L�#CNQSTE-CNQST,D4ƒMESSAGE�LENGTH-1�-�ADDED�062184�4BŠBSR.S‚CANCQST„GO�ASK�IF�REALLY�WANT�TO�CANCEL�ALL�-�MOD.�062184�4ŠTST„D7‘CHECK�RETURN2ŠBMI.S‚CANC30�BRANCH�IF�ANSWER�WAS�NO,DON'T�CANCELCANC20„TRAPƒ#3‘DO�THE�CANCELŠBEQ.S‚CANC30�GOOD�RETURN"ŠBSR„ERRORŽGO�OUTPUT�ERROR�MESSAGECANC30„RTS—RETURN**‚PARSE�THE�COMMAND�LINE)CANC40„CMP.B‚#$0D,(A3)ŠA�CARRIAGE�RETURN?,ŠBEQ„CANC10�BRANCH�IF�YES,NO�MORE�INPUT�LINE0ŠCMP.B‚#'*',(A3)ŠCANCEL�EVERYONE?�ADDED�062184�4"ŠBEQ.S‚CANC50�YES�-�ADDED�062184�44ŠMOVE.L�A3,D5ŽSAVE�CURRENT�ADDRESS�IN�COMMAND�BUFFER:ŠBSR„FNJOBIDŠGO�PUT�FILENAME�OR�JOBID�INTO�PARAMETER�BLOCKŠTST„D7‘GOOD�RETURN?$ŠBMI„CMDERR�BRANCH�IF�ERROR�RETURNED2ŠADD.L‚#1,D6ŽFIX-UP�NUMBER�OF�CHARACTERS�IN�BUFFER6ŠBSR„GTAAFT�GO�SEE�IF�NEED�DEFAULT�VAOLUME�AND�CATALOGŠBRA„CANC20�GO�DO�THE�CANCEL*5*„DOUBLE�CHECK�TO�SEE�IF�THEY�WANT�TO�CANCEL�EVERYONE*)CANC50„LEA„CNQST2(PC),A6†CANCEL�EVERYONE?-ŠMOVE.L�#CNQST2E-CNQST2,D4�MESSAGE�LENGTH�-�1ŠBSR.S‚CANCQSTŒGET�RESPONSEŠBMI.S‚CANC30�USER�CHANGED�MIND8ŠMOVE.W�#'**',FHSUSN(A0)ƒPUT�ASTERISK�IN�FOR�USER�NUMBERŠBRA„CANC20�DO�THE�CANCELŠPAGE*9*‚CANCQST‚ASK�IF�REALLY�WANT�TO�CANCEL�ALL�THE�USERS�JOBS*‚EXIT:D7=0=DO�THE�CANCEL*‡D7=-1=DON'T�CANCEL*‚USES:0�1�2�3�4�5�6�7 *…D�*�*ƒ*�*…R *…A�P�*�*ƒPƒ*** CANCQSTƒEQU„*ŠMOVE.L�A0,A1ŽSAVE�CURRENT�A0/CANQ05„LEA„IOSPB(PC),A0‡USE�IOS�PARAMETER�BLOCK,ŠMOVE.W�#IOWRIT,IOSFCT(A0)�OUTPUT�WITH�INPUT)ŠMOVE.W�#IOPASC+IOPIMG,IOSOPT(A0)�OPTIONSŠMOVE.B�#LDFLUN,IOSLUN(A0)�LUN*ŠMOVE.L�A6,IOSSAD(A0)†OUTPUT�START�ADDRESS+ŠMOVEA.L�A6,A2�PRESERVE�A6�-�ADDED�062184�44ŠADDA.L�D4,A2ŽDETERMINE�END�ADDRESS�-�ADDED�062184�4<ŠMOVE.L�A2,IOSEAD(A0)†OUTPUT�END�ADDRESS�-�MODIFIED�062184�4ŠTRAPƒ#2‘DO�THE�IMAGE�OUTPUTŠBNE„QUITERRŒERROR�RETURN)ŠMOVE.W�#IOREAD,IOSFCT(A0)�READ�THE�INPUT$ŠMOVE.W�#IOPFOR,IOSOPT(A0)�FORMATTEDŠMOVE.B�#CDFLUN,IOSLUN(A0)�LUN3ŠLEA„BUF(PC),A2‰INPUT�BUFFER�START�ADDRESS�062184�45ŠMOVE.L�A2,IOSSAD(A0)†START�ADDRESS�OF�INPUT�062184�42ŠLEA„BUFE(PC),A2ˆINPUT�BUFFER�END�ADDRESS�062184�43ŠMOVE.L�A2,IOSEAD(A0)†END�ADDRESS�OF�INPUT�062184�4ŠTRAPƒ#2‘DO�THE�READŠBNE„QUITERRŒERROR�RETURN;ŠBSR„SBARG‰GO�SEE�IF�ARGUMENT�SUB.�OR�CONVERT�TO�UPPER�CASEŠBNE„QUITERRŒERROR�RETURN&ŠMOVE.L�IOSLEN(A0),D0†GET�INPUT�LENGTHŠCMP.L‚#2,D0ŽCHECK�LENGTH)ŠBGT„CANQ05�BRANCH�IF�TOO�LARGE,ASK�AGAIN"ŠLEA„BUF(PC),A2‰GET�BUFFER�ADDRESS!ŠMOVE.B�(A2)+,D1‹GET�THE�1ST�BYTEŠSUB.L‚#1,D0ŽDECREMENT�LENGTHŠBEQ.S‚CANQ10�BRANCH�IF�NO�MOREŠMOVE.B�(A2),D3ŒGET�NEXT�BYTE!ŠCMP.B‚#$0D,D3ŒA�CARRIAGE�RETURN?"ŠBNE„CANQ05�BRANCH�IF�NO,ASK�AGAIN'CANQ10„CLR.L‚D7‘SET�UP�FOR�A�YES�ANSWERŠCMP.B‚#'Y',D1ŒA�Y�FOR�YES?ŠBNE.S‚CANQ20�BRANCH�IF�NOCANQRTNƒMOVE.L�A1,A0ŽRESTORE�A0 ŠRTS—RETURN!CANQ20„CMP.B‚#'N',D1ŒAN�N�FOR�NO?"ŠBNE„CANQ05�BRANCH�IF�NO,ASK�AGAIN+CANQ30„MOVE.L�#-1,D7�SET�TO�NO,DON'T�CANCELŠBRA„CANQRTNŒGO�RETURNŠPAGE**ƒCONT‚CONTINUE�COMMAND>*‰RETRY�OUTPUT�IF�AFTER�AN�IO�ERROR�OR�START�NEXT�JOB�IF�AFTER.*‰A�FORMS�CHANGE.�IGNORED�IF�DEVICE�IS�ACTIVE.*‰COMMAND�CODE=$0204*‰SPECIFY:DEVICE�NAME**‚ENTRY:D2=INTERACTIVE�FLAG*ˆA4=BASE�ADDRESS*ˆD6=COMMAND�BUFFER�LENGTH*ˆA3=COMMAND�BUFFER�ADDRESS*‚EXIT:D2=INTERACTIVE�FLAG*‚CALLS:CLRFHS‚SETDEVNƒERROR** CONT†EQU„*ŠTST„D6‘ANY�DEVICE�NAME?ŠBLE„CMDERR�BRANCH�IF�NO,ERRB OR8ŠBSR„CLRFHSŒGO�CLEAR�THE�PARA�BLOCK,RETURN�ADDRESS�IN�A00ŠMOVE.W�#SPLCONT,FHSCMD(A0)�SET�CONTINUE�COMMAND8ŠBSR„SETDEVNŒGO�PUT�DEVICE�NAME�INTO�THE�PARAMETER�BLOCKŠTRAPƒ#3‘DO�THE�CONTINUEŠBEQ.S‚CONT10�GOOD�RETURN"ŠBSR„ERRORŽGO�OUTPUT�ERROR�MESSAGECONT10„RTS—RETURNŠPAGE**‚FORMƒCHANGE�FORMS�ID�COMMAND*‰COMMAND�CODE=$0208"*‰SPECIFY:DEVICE�NAME�AND�FORMS�ID*‚ENTRY:D2=INTERACTIVE�FLAG*ˆD6=COMMAND�BUFFER�LENGTH*ˆA3=COMMAND�BUFFER�ADDRESS*ˆA4=BASE�ADDRESS*‚EXIT:D2=INTERACTIVE�FLAG*‚CALLS:CLRFHS‚SETDEVN‚ERROR** FORM†EQU„*ŠTST„D6‘ANY�ARGUMENTS?ŠBLE„CMDERR�BRANCH�IF�NO,ERROR<ŠBSR„CLRFHSˆGO�CLEAR�THE�PARA�BLOCK�AND�RETURN�ADDRESS�IN�A0"ŠMOVE.L�A3,D5ŽSAVE�CURRENT�ADDRESS,ŠMOVE.W�#SPLFORM,FHSCMD(A0)�SET�FORM�COMMAND8ŠBSR„SETDEVNŒGO�PUT�DEVICE�NAME�INTO�THE�PARAMETER�BLOCK.ŠMOVE.L�A3,D0ŽGET�CURRENT�COMMAND�LINE�ADDRESS9ŠSUB.L‚D5,D0�SEE�HOW�MANY�CHARACTERS�USED�FOR�DEVICE�NAME+ŠSUB.L‚D0,D6Ž#�CHARS�REMAINING�IN�TO�BUFFER!ŠCMP.L‚#4,D6ŽMUST�HAVE�AT�LEAST�4*ŠBLT„CMDERR�BRANCH�IF�NOT�AT�LEAST�4,ERROR1ŠMOVE.L�#4,D0ŽMOVE�4�BYTES�TO�THE�PARAMETER�BLOCK)ŠMOVE.L�A0,A1ŽGET�PARAMETER�BLOCK�ADDRESS(ŠADD.L‚#FHSSIZ,A1‰POINT�TO�CORRECT�FIELD'FORM10„MOVE.B�(A3)+,(A1)+ˆMOVE�FORMS�IDŠSUB.L‚#1,D0ŽDECREMENT�COUNTERŠBNE„FORM10�BRANCH�TIL�MOVED(ŠSUB.L‚#4,D6ŽDECREMENT�BUFFER�COUNT�ALSOŠCMP.L‚#1,D6ŽSEE�IF�1�LEFT ŠBGT„CMDERR�BRANCH�IF�MORE,ERRORŠTRAPƒ#3‘DO�THE�FORMS�CHANGEŠBEQ.S‚FORM20�GOOD�RETURN"ŠBSR„ERRORŽGO�OUTPUT�ERROR�MESSAGEFORM20„RTS—RETURNŠPAGE**‚PRINT‚PRINT�A�FILE*‚START‚START�A�FILE*‰COMMAND�CODE=$0210*‰SPECIFY•ACTION*‰-------•------.*�(START)�JOBID<#�COPIES>�OUTPUT�THIS�JOB�NEXT9*�(START)�SPOOLER�FILENAME<#�COPIES>‚OUTPUT�THIS�JOB�NEXTG*�(PRINT)�NON-SPOOLER�FILENAMEˆADD�THIS�TO�THE�SPOOLER�QUEUE�FOR�OUTPUT*%*‰NON-SPOOLER�FILENAME�SPECIFICATION:'*‰FILENAME,DEVICE<,FORMS�ID><,#�COPIES>**‚ENTRY:D2=INTERACTIVE�FLAG*ˆD6=COMMAND�LINE�LENGTH*ˆA3=COMMAND�LINE�ADDRESS*ˆA4=BASE�ADDRESS*‚EXIT:D2=INTERACTIVE�FLAG1*‚CALLS:CLRFHS„FNJOBID„SETDEVNƒCNVAB„GTAAFTƒERROR**STRT†EQU„*’START�ENTRY�POINT+ŠMOVE.W�#-1,PRTSTF-DATAS(A4)�SET�START�FLAGŠBRA.S‚PRNT10�GO�PROCESS PRINT…EQU„*&ŠCLR.W‚PRTSTF-DATAS(A4)ƒSET�PRINT�FLAGPRNT10„TST„D6‘ANY�ARGUMENT?ŠBLE„CMDERR�BRANCH�IF�NO,ERROR5ŠBSR„CLRFHS�CLEAR�PARA�BLOCK�AND�RETURN�ADDRESS�IN�A0-ŠMOVE.W�#SPLPRNT,FHSCMD(A0)�SET�PRINT�COMMAND.ŠLEA„SAVREG(PC),A5†GET�SAVED�REGISTERS�ADDRESS)ŠMOVE.W�14(A5),FHSUSN(A0)‚GET�USER�NUMBER1ŠMOVE.L�A3,D5ŽSAVE�CURRENT�COMMAND�BUFFER�ADDRESS5ŠBSR„FNJOBIDŒGO�PUT�FILENAME�OR�JOBID�INTO�PARA�BLOCKŠTST„D7‘CHECK�RETURNŠBMI„PRNTERRŒBRANCH�IF�AN�ERROR:ŠBSR„GTAAFTŠGO�FIX�LENGTH�OF�BUFFER�AND�DETERMINE�FILETYPEŠTST„D7‘SPOOLER�FILE?(ŠBMI.S‚PRNT30�BRANCH�IF�NON-SPOOLER�FILE'PRNT20„TST„D6‘ANY�CHARACTERS�REMAINING?+ŠBEQ.S‚PRNT40�BRANCH�IF�NO,GO�DO�THIS�PRINT#ŠSUB.L‚#1,A3ŽPOINT�TO�THE�SEPARATOR%ŠBRA.S‚PRNT80�GO�GET�NUMBER�OF�COPIES***‚HERE�IF�A�NON-SPOOLER�FILENAME�SPECIFIED*6PRNT30„TST.W‚PRTSTF-DATAS(A4)ƒHERE�FROM�START�COMMAND?ŠBMI„PRNT20�BRANCH�IF�YES.ŠCMP.L‚#1,D6ŽANY�MORE�CHARS�IN�COMMAND�BUFFER?ŠBLE„PRNTERRŒBRANCH�IF�NO,ERROR)ŠMOVE.L�A3,D5ŽSAVE�COMMAND�BUFFER�ADDRESS'ŠBSR„SAVFHS�GO�SAVE�THE�PARAMETER�BLOCKŠBSR„SETDEVNŒGO�GET�DEVICE�NAME*ŠMOVE.L�FHSVOL(A0),D0†GET�DEVICE�NAME�HERE'ŠBSR„GETFHS�RESTORE�THE�PARAMETER�BLOCKBŠMOVE.L�D0,FHSSAD(A0)…PUT�THE�DEVICE�NAME�INTO�THE�PARAMETER�BLOCK(ŠMOVE.L�A3,D1ŽGET�CURRENT�BUFFER�ADDRESS$ŠSUB.L‚D5,D1ŽSEE�HOW�MANY�CHARS�USED!ŠADD.L‚#1,D1ŽADD�IN�THE�SEPARATOR#ŠSUB.L‚D1,D6Ž#�CHARACTERS�REMAINING@ŠBLE.S‚PRNT40†BRANCH�IF�NONE�LEFT,USE�DEFAULT�FORMSID�AND�COPIESŠCMP.L‚#1,D6ŽONE�LEFT?#ŠBGT.S‚PRNT60�BRANCH�IF�MORE�THAN�1&PRNT40„CLR.W‚FHSOPT(A0)‰DEFAULT�COPIES"ŠCLR.L‚FHSEAD(A0)‰DEFAULT�FORMS�ID$PRNT50„TRAPƒ#3‘DO�THIS�PRINT�COMMANDŠBEQ.S‚PRNT55�GOOD�RETURN"ŠBSR„ERRORŽGO�OUTPUT�ERROR�MESSAGE8PRNT55„CLR.W‚PRTSTF-DATAS(A4)ƒCLEAR�THE�PRINT-START�FLAG ŠRTS—RETURN,PRNT60„CLR.L‚FHSEAD(A0)‰SET�DEFAULT�FORMS�ID&ŠCLR.W‚FHSOPT(A0)‰SET�DEFAULT�#�COPIESŠCMP.B‚#B ',',(A3)ŠNULL�FORMS�ID?ŠBEQ.S‚PRNT80�BRANCH�IF�YESŠCMP.B‚#'�',(A3)ŠNULL�FORMS�ID?ŠBEQ.S‚PRNT80�BRANCH�IF�YES!ŠCMP.B‚#$0D,(A3)ŠCARRIAGE�RETURN?1ŠBEQ„PRNT50�BRANCH�IF�YES,GO�PROCESS�THIS�COMMAND!ŠMOVE.L�#4,D0Ž#�CHARS�IN�FORMS�ID)ŠMOVE.L�A0,A6ŽGET�PARAMETER�BLOCK�ADDRESS)ŠADD.L‚#FHSEAD,A6‰POINT�TO�FORMS�ID�FIELD6PRNT70„MOVE.B�(A3)+,(A6)+ˆPUT�FORMS�ID�INTO�PARA�BLOCKŠSUB.L‚#1,D0ŽDECREMENT�COUNTERŠBNE.S‚PRNT70�BRANCH�TIL�MOVED$ŠSUB.L‚#4,D6ŽDECREMENT�BUFFER�LENGTH)ŠBMI.S‚PRNTERRŒBRANCH�IF�NOT�ENOUGH,ERROR$ŠBEQ.S‚PRNT50�BRANCH�IF�NO�MORE,DONE&PRNT80„SUB.L‚#1,D6ŽBUMP�PAST�SEPARATOR"ŠBLE„PRNT50�BRANCH�IF�NO�MORE,DONE!ŠCMP.B‚#$0D,(A3)ŠCARRIAGE�RETURN?ŠBEQ„PRNT50�BRANCH�IF�YES,DONEŠCMP.B‚#',',(A3)ŠCOMMA?+ŠBEQ.S‚PRNT90�BRANCH�IF�YES,GO�GET�#�COPIESŠCMP.B‚#'�',(A3)ŠBLANK?!ŠBNE.S‚PRNTERRŒBRANCH�IF�NO,ERROR*$*‚HERE�IF�NUMBER�OF�COPIES�SPECIFIED*PRNT90„CLR.L‚D0‘CLEAR�COUNTER$ŠADD.L‚#1,A3ŽPOINT�TO�NEXT�CHARACTER ŠMOVE.L�A3,A1ŽGET�BUFFER�POINTER"PRNT100ƒMOVE.B�(A3)+,D1‹GET�A�BYTEŠCMP.B‚#$30,D1ŒA�NUMBER?ŠBLT.S‚PRNT110ŒBRANCH�IF�NOŠCMP.B‚#$39,D1ŒA�NUMBER?ŠBGT.S‚PRNT110ŒBRANCH�IF�NOŠADD.L‚#1,D0ŽCOUNT�IT$ŠSUB.L‚#1,D6ŽDECREMENT�BUFFER�LENGTH$ŠBGT.S‚PRNT100ŒBRANCH�IF�MORE�TO�GET&PRNT110ƒTST.L‚D0‘GOT�ANY�FOR�#�COPIES?!ŠBEQ.S‚PRNTERRŒBRANCH�IF�NO,ERRORŠCMP.L‚#3,D0Ž3�NUMBERS�MAX#ŠBGT.S‚PRNTERRŒBRANCH�IF�MORE,ERRORŠTST.L‚D6‘ANY�BUFFER�LEFT?!ŠBMI.S‚PRNTERRŒBRANCH�IF�NO,ERRORŠBSR„CNVABŽGO�CONVERT�TO�BINARYŠTST„D7‘GOOD�CONVERT?!ŠBNE.S‚PRNTERRŒBRANCH�IF�NO,ERROR"ŠMOVE.W�D3,FHSOPT(A0)†SET�#�COPIESŠBRA„PRNT50�GO�DO�THIS�PRINT9PRNTERRƒCLR.W‚PRTSTF-DATAS(A4)ƒCLEAR�THE�PRINT-START�FLAG ŠBRA„CMDERR�COMMAND�ERROR�RETURNŠPAGE*!*‚COPY‚CHANGE�#�COPIES�FOR�OUTPUT*ˆCOMMAND�CODE=$0220(*ˆSPECIFY:JOBID�OR�FILENAME�AND�#�COPIES**‚ENTRY:D2=INTERACTIVE�FLAG*ˆD6=COMMAND�LINE�LENGTH*ˆA3=COMMAND�LINE�ADDRESS*ˆA4=BASE�ADDRESS*‚EXIT:D2=INTERACTIVE�FLAG)*‚CALLS:CLRFHS„FNJOBIDƒCNVAB„GTAAFT‚ERROR** COPY†EQU„*ŠTST„D6‘ANY�ARGUMENT?!ŠBLE.S‚COPYERRŒBRANCH�IF�NO,ERROR3ŠBSR„CLRFHS�CLEAR�PARA�BLOCK,RETURNED�ADDRESS�IN�A0#ŠMOVE.W�#SPLCOPY,FHSCMD(A0)�COMMAND.ŠLEA„SAVREG(PC),A5†GET�SAVED�REGISTERS�ADDRESS%ŠMOVE.W�14(A5),FHSUSN(A0)‚USER�NUMBER!ŠMOVE.L�A3,D5ŽSAVE�BUFFER�ADDRESS:ŠBSR„FNJOBIDŠGO�PUT�FILENAME�OR�JOBID�INTO�PARAMETER�BLOCKŠTST„D7‘GOOD�RETURN?!ŠBMI.S‚COPYERRŒBRANCH�IF�NO,ERROR,ŠBSR„GTAAFT�GET�REMAINING�LENGTHAND�FILETYPEŠTST„D6‘ANY�BUFFER�LEFT?!ŠBLE.S‚COPYERRŒBRANCH�IF�NO,ERRORŠCLR.L‚D0‘CLEAR�FOR�COUNTER)ŠMOVE.L�A3,A1ŽSAVE�CURRENT�BUFFER�POINTER9COPY10„MOVE.B�(A3)+,D1‹GET�A�BYTE,LOOKING�FOR�#�OF�COPIESŠCMP.B‚#$30,D1ŒA�NUMBER?ŠBLT.S‚COPY20�BRANCH�IF�NOŠCMP.B‚#$39,D1ŒA�NUMBER?ŠBGT.S‚COPY20�BRANCH�IF�NOŠADD.L‚#1,D0ŽCOUNT�IT&ŠSUB.L‚#1,D6ŽDECREMENT�#�OF�BYTES�LEFTŠBGT.S‚COPY10�BRANCH�IF�MORECOPY20„TST.L‚D0‘ANY�COUNT?!ŠBEQ.S‚COPYERRŒBRANCH�IF�NO,ERRORŠCMP.L‚#3,D0ŽAT�LEAST�3?%ŠBGT.S‚COPYERRŒBRANCH�IF�MORE,TOO�BIG%ŠSUB.L‚#1,D6ŽGET�RID�OF�END�CHARACTER.ŠBGT.S‚COPYERRŒBRANCH�IF�MORE�CHARS�LEFT-ERRORŠBSR„CNVABŽCONVERT�TO�BINARYŠTST„D7‘GOOD�CONVERT?ŠBMI.S‚COPYERRŒBRANCH�IF�NO8ŠMOVE.W�D3,FHSOPT(A0)†PUT�NUMBER�OF�COPIES�IN�PARA�BLOCKŠTRAPƒ#3‘DO�THE�COPIESŠBEQ.S‚COPY30�GOOD�RETURN"ŠBSR„ERRORŽGO�OUTPUT�ERROR�MESSAGECOPY30„RTS—RETURN©ERRƒBRA„CMDERR�SYNTAX�ERROR�RETURNŠPAGE*$*‚QUEUE‚OUTPUT�SPOOLER�QUEUE�ENTRIES*‰COMMAND�CODE=$0240*‰SPECIFY–ACTION*‰-------–------*‰NOTHING�(�)’LIST�ALL�ENTRIES0*‰FORM�('FORM')�OUTPUT�DEVICE�NAMES�AND�FORMS�ID2*‰DEVICE�('#DEV')ŽLIST�ALL�ENTRIES�FOR�THAT�DEVICE3*‰USER�NUMBER�(XXXX)‹LIST�ALL�ENTRIES�FOR�THAT�USER1*‰SESSION�('S')�LIST�ALL�ENTRIES�FOR�THAT�SESSION**‚ENTRY:D2=INTERACTIVE�FLAG*ˆD6=COMMAND�LINE�LENGTH*ˆA3=COMMAND�LINE�ADDRESS*ˆA4=BASE�ADDRESS*‚EXIT:D2=INTERACTIVE�FLAG"*‚CALLS:CLRFHS„SETDEVNƒCNVABƒERROR** QUEUE…EQU„*3ŠBSR„CLRFHS�CLEAR�PARA�BLOCK,RETURNED�ADDRESS�IN�A0.ŠMOVE.W�#SPLQUE,FHSCMD(A0)�SET�SPOOLER�COMMANDŠTST.L‚D6‘ANY�ARGUMENTS?ŠBGT.S‚QUE20ŽBRANCH�IF�YESKQUC E10…MOVE.L�CONS-DATAS(A4),FHSCLG(A0)�PASS�CONSOLE�NAME�TO�.SPL�FOR�OUTPUTŠTRAPƒ#3‘OUTPUT�THE�QUEUEŠBEQ.S‚QUE15ŽGOOD�RETURN"ŠBSR„ERRORŽGO�OUTPUT�ERROR�MESSAGEQUE15…RTS—RETURN&QUE20…CMP.B‚#$0D,(A3)ŠCARRIAGE�RETURN?%ŠBEQ.S‚QUE10ŽBRANCH�IF�YES,OUTPUT‚ALLŠCMP.B‚#'S',(A3)ŠS�FOR�SESSION?ŠBNE.S‚QUE30ŽBRANCH�IF�NO*#*‚HERE�IF�INPUT�WAS�'S'�FOR�SESSION*%ŠSUB.L‚#1,D6ŽSESSION,DECREMENT�LENGTH!ŠCMP.L‚#1,D6ŽSEE�IF�ANYTHING�LEFT!ŠBGT.S‚QUERRŽBRANCH�IF�MORE,ERROR4ŠMOVE.W�#1,FHSOPT(A0)†SET�FOR�OUTPUT�SESSION�ENTRIESŠBRA„QUE10ŽGO�DO�ITQUE30…CMP.B‚#'#',(A3)ŠA�DEVICE?ŠBNE.S‚QUE40ŽBRANCH�IF�NO*!*‚HERE�IF�A�DEVICE�NAME�WAS�INPUT*2ŠBSR„SETDEVNŒA�DEVICE,GO�PUT�IT�IN�PARAMETER�BLOCK#ŠBRA„QUE10ŽGO�OUTPUT�DEVICE�ENTRIES"QUE40…CMP.B‚#'F',(A3)ŠF�FOR�FORMS?/ŠBNE.S‚QUE70ŽBRANCH�IF�NO,GO�SEE�IF�USER�NUMBER*3*‚HERE�IF�'F'�OR�'FORM'�FOR�OUTPUT�DEVICES-FORMS�ID*#ŠADD.L‚#1,A3ŽBUMP�TO�NEXT�CHARACTERŠSUB.L‚#1,D6ŽDECREMENT�LENGTH!ŠBNE.S‚QUE60ŽBRANCH�IF�MORE�BYTES;QUE50…MOVE.L�#'FORM',FHSVOL(A0)�SET�TO�OUTPUT�FORMS-DEVICESŠBRA„QUE10ŽGO�DO�IT(QUE60…CMP.B‚#$0D,(A3)ŠA�CARRIAGE�RETURN?ŠBEQ.S‚QUE50ŽBRANCH�IF�YES ŠCMP.B‚#'O',(A3)+‰'O'�FOR�FORMS?ŠBNE.S‚QUERRŽBRANCH�IF�NO,ERRORŠSUB.L‚#1,D6ŽDECREMENT�COUNTŠCMP.B‚#'R',(A3)+‰'R'?ŠBNE.S‚QUERRŽBRANCH�IF�NO,ERRORŠSUB.L‚#1,D6ŽDECREMENT�COUNTŠCMP.B‚#'M',(A3)+‰'M'?ŠBNE.S‚QUERRŽBRANCH�IF�NO,ERRORŠSUB.L‚#1,D6ŽDECREMENT�COUNTERŠBLE.S‚QUE50ŽBRANCH�IF�IS�FORMS!ŠCMP.B‚#$0D,(A3)ŠCARRIAGE�RETURN?ŠBEQ.S‚QUE50ŽBRANCH�IF�YES#ŠCMP.L‚#1,D6ŽMORE�THAN�1�CHAR�LEFT?"ŠBLE.S‚QUE50ŽBRANCH�IF�NO,IS�FORMS$QUERR…BRA„CMDERR�SYNTAX�ERROR�RETURN**‚HERE�IF�USER�NUMBER�INPUT*QUE70…CLR.L‚D0‘CLEAR�FOR�USE!ŠMOVE.L�A3,A1ŽSAVE�BUFFER�ADDRESS%QUE80…MOVE.B�(A3)+,D1‹GET�A�CHARACTERŠCMP.B‚#$30,D1ŒA�NUMBER?ŠBLT.S‚QUE90ŽBRANCH�IF�NOŠCMP.B‚#$39,D1ŒA�NUMBER?ŠBGT.S‚QUE90ŽBRANCH�IF�NOŠADD.L‚#1,D0ŽCOUNT�ITŠSUB.L‚#1,D6ŽDECREMENT�COUNTERŠBGT.S‚QUE80ŽBRANCH�IF�MOREQUE90…TST„D0‘FOUND�ANY�NUMBERS?ŠBEQ„QUERRŽBRANCH�IF�NO,ERRORŠCMP.L‚#4,D0Ž1-4�NUMBERS?ŠBGT„QUERRŽBRANCH�IF�MORE,ERRORŠBSR„CNVABŽCONVERT�TO�BINARYŠTST„D7‘GOOD�CONVERT?#ŠBMI„QUERRŽBRANCH�IF�ERROR�RETURNED&ŠMOVE.W�D3,FHSUSN(A0)†SAVE�USER�NUMBER$ŠCMP.L‚#1,D6ŽDONE�WITH�INPUT�BUFFER?*ŠBLE„QUE10ŽBRANCH�IF�DONE,GO�DO�THE�OUTPUT"ŠBRA„CMDERR�ERROR,MORE�BUFFER�LEFTŠPAGE*&*‚PROMPT‚PROMPT�FOR�NEXT�INPUT�COMMAND**‚ENTRY:D2=INTERACTIVE�FLAG*ˆA4=BASE�ADDRESS*‚EXIT:�D2=INTERACTIVE�FLAG*ˆD6=COMMMAND�LENGTH *ˆBUF=COMMAND*‚USES:0�1�2�3�4�5�6�7 *…D�*ƒP‡R*…A�*‡P* PROMPT„EQU„*)ŠLEA„IOSPB(PC),A0‡USE�IOS�PARAMETER�BLOCK,ŠMOVE.W�#IOWRIT,IOSFCT(A0)�OUTPUT�WITH�INPUT.ŠMOVE.W�#IOPASC+IOPIMG,IOSOPT(A0)�OUTPUT=IMAGEŠMOVE.B�#LDFLUN,IOSLUN(A0)�LUN-ŠLEA„PRMPT(PC),A6‡OUTPUT�BUFFER�START�ADDRESS-ŠMOVE.L�A6,IOSSAD(A0)†START�ADDRESS�OF�OUTPUT,ŠLEA„PRMPTE(PC),A6†OUTPUT�BUFFER�END�ADDRESS+ŠMOVE.L�A6,IOSEAD(A0)†END�ADDRESS�OF�OUTPUTŠTRAPƒ#2‘GET�THE�COMMANDŠBNE„QUITERRŒERROR�RETURNŠMOVE.W�#IOREAD,IOSFCT(A0)�READ$ŠMOVE.W�#IOPFOR,IOSOPT(A0)�FORMATTEDŠMOVE.B�#CDFLUN,IOSLUN(A0)�LUN*ŠLEA„BUF(PC),A6‰INPUT�BUFFER�START�ADDRESS0ŠMOVE.L�A6,IOSSAD(A0)†INPUT�BUFFER�START�ADDRESS)ŠLEA„BUFE(PC),A6ˆINPUT�BUFFER�END�ADDRESS.ŠMOVE.L�A6,IOSEAD(A0)†INPUT�BUFFER�END�ADDRESSŠTRAPƒ#2‘READ�THE�INPUTŠBNE„QUITERRŒERROR�RETURN9ŠBSR„SBARG‹GO�GET�ARGUMENT�SUBS.�OR�CONVERT�TO�UPPER�CASEŠBNE„QUITERRŒERROR�RETURN.ŠMOVE.L�IOSLEN(A0),D6†SAVE�INPUT�BUFFER�LENGTH ŠRTS—RETURNŠPAGE*7*‚QUERY‚OUTPUTS�A�LIST�OF�VALID�COMMANDS�AND�ENTRY�FORM*‚HELP�COMMAND*‚ENTRY:D2=INTERACTIVE�FLAG*ˆA4=BASE�ADDRESS*‚EXIT:TO�CALLER*‚USES:0�1�2�3�4�5�6�7 *…D�*�*�P *…A�*�*…Pƒ*** QUERY…EQU„*(ŠMOVE.L�#17,D1�NUMBER�OF�LINES�TO�OUTPUTŠCLR.L‚D0‘CLEAR�FOR�USE6ŠLEA„LNGTBL(PC),A1†GET�ADDRESS�OF�MESSAGE�LENGTH�TABLE)ŠLEA„IOSPB(PC),A0‡USE�IOS�PARAMETER�BLOCK ŠMOVE.W�#IOWRIT,IOSFCT(A0)�WRITE1ŠMOVE.W�#IOPASC+IOPFOR,IOSOPT(A0)�FORMATTED�ASCIIŠMOVE.B�#LDFLUN,IOSLUN(A0)�LUN.ŠLEA„QURMSG(PC),A6†OUTPUT�BUFFER�START�ADDRESS+ŠMOVE.L�A6,IOSSAD(A0C )†MESSAGE�START�ADDRESS7QUERY20ƒMOVE.L�IOSSAD(A0),IOSEAD(A0)�SET�UP�END�ADDRESS,ŠMOVE.B�(A1)+,D0‹GET�LENGTH�FOR�THIS�MESSAGE'ŠADD.L‚D0,IOSEAD(A0)†ACTUAL�END�ADDRESSŠTRAPƒ#2‘DO�THE�OUTPUTŠBNE„QUITERRŒERROR�RETURNŠCLR.L‚D0‘CLEAR�FOR�USEŠSUB.L‚#1,D1ŽDECREMENT�COUNTŠBEQ.S‚QUERY30ŒBRANCH�IF�DONE:ŠMOVE.L�IOSEAD(A0),IOSSAD(A0)�SET�UP�FOR�NEW�START�ADDRESS)ŠADD.L‚#1,IOSSAD(A0)†ACTUAL�START�ADDRESS"ŠBRA„QUERY20ŒGO�DO�REST�OF�MESSAGEQUERY30ƒRTS—RETURNŠPAGE**‚ERROR�HANDLERS*CMDERR„EQU„*’SYNTAX�ERRORS!ŠLEA„STACK(PC),A7‡RESET�THE�STACK4ŠBRA„SPOL30�GO�OUTPUT�COMMNAD�LIST�AND�GET�NEW�INPUT***ERROR…EQU„*’IOS/FHS/.SPL�ERRORSK…MOVEM.L�D0/A0,EM_PBLK-DATAS(A4)�D0�AND�A0�TO�THE�ERROR�MESSAGE�PARA.�BLOCK1ŠLEA„EM_PBLK(PC),A0…ERROR�MESSAGE�PARAMETER�BLOCK7ŠMOVE.B�#6,EM_TLUN-DATAS(A4)�OUTPUT�LOGICAL�UNIT�NUMBER"ŠMOVE.L�#2,D0ŽERROR�MESSAGE�OUTPUT'ŠTRAPƒ#4‘CALL�THE�ERROR�MESSAGE�HANDLERŠRTS—RETURN�TO�CALLERŠPAGE*&*‚CLRFHS‚CLEAR�THE�FHS�PARAMETER�BLOCK!*‚EXIT:A0=PARAMETER�BLOCK�ADDRESS*‚USES:0�1�2�3�4�5�6�7*…D�**…A�R‡P** CLRFHS„EQU„*)ŠLEA„FHSPB(PC),A0‡PARAMETER�BLOCK�ADDRESS$ŠMOVE.L�#FHSNLN/2,D0‡LENGTH�IN�WORDSCLRF10„CLR.W‚(A0)+ŽCLEAR�ITŠSUB.L‚#1,D0ŽDECREMENT�COUNT ŠBNE.S‚CLRF10�BRANCH�TIL�CLEARED%ŠLEA„FHSPB(PC),A0‡RESTORE�THE�ADDRESS ŠRTS—RETURN**5*‚SAVFHS‚SAVE�FHS�PARAMETER�BLOCK�IN�THE�SCRATCH�AREA*‚USES:0�1�2�3�4�5�6�7*…Dƒ* *…A‰P�*�**-SAVFHS„LEA„SCRATCH(PC),A6…GET�SCRATCH�ADDRESS-ŠMOVE.L�A0,A5ŽGET�FHS�PARAMETER�BLOCK�ADDRESS,ŠMOVE.L�#FHSNLN/2,D1‡NUMBER�OF�WORDS�TO�MOVE/SAVFHS10‚MOVE.W�(A5)+,(A6)+ˆSAVE�IN�SCRATCH�AREŠSUB.L‚#1,D1ŽDECREMENT�COUNTER$ŠBNE.S‚SAVFHS10‹BRANCH�TIL�MOVED�ALL ŠRTS—RETURN**9*‚GETFHS‚RESTORE�FHS�PARAMETER�BLOCK�FROM�THE�SCRATCH�ARE*‚USES:0�1�2�3�4�5�6�7*…Dƒ* *…A‰P�*�**-GETFHS„LEA„SCRATCH(PC),A5…GET�SCRATCH�ADDRESS-ŠMOVE.L�A0,A6ŽGET�FHS�PARAMETER�BLOCK�ADDRESS,ŠMOVE.L�#FHSNLN/2,D1‡NUMBER�OF�WORDS�TO�MOVE=GETFHS10‚MOVE.W�(A5)+,(A6)+ˆPUT�BACK�INTO�FHS�PARAMETER�BLOCKŠSUB.L‚#1,D1ŽDECREMENT�COUNT ŠBNE.S‚GETFHS10‹BRANCH�TIL�MOVED ŠRTS—RETURNŠPAGE*0*„INITMSG‚OUTPUT�THE�INITIAL�START-UP�MESSAGE�OF0*�DATE�LAST�ASSEMBLED,REV.�TYPE,�AND�REV.�NUMBER**„ENTRY:A4=BASE�ADDRESS*„USES:�0�1�2�3�4�5�6�7*‡D‚**‡A‚*‡P INITMSGƒEQU„*-ŠLEA„IOSPB(PC),A0‡IOS�PARAMETER�BLOCK�ADDRESS ŠMOVE.W�#IOWRIT,IOSFCT(A0)�WRITE$ŠMOVE.W�#IOPFOR,IOSOPT(A0)�FORMATTED ŠMOVE.B�#LDFLUN,IOSLUN(A0)�LUN�61ŠMOVE.L�A4,IOSSAD(A0)†OUTOUT�BUFFER�START�ADDRESS6ŠMOVE.L�A4,IOSEAD(A0)†SET-UP�OUTOUT�BUFFER�END�ADDRESSF‰ADD.L�#13,IOSEAD(A0)�ACTUAL�END�ADDRESS‚062184�4�-�CHANGED�TO�REFLECT *ªNEW�LENGTHŠTRAPƒ#2‘DO�THE�OUTPUTŠBNE„QUITERRŒERROR�RETURNŠRTSŠPAGE*0*‚FNJOBID‚FILENAME-JOBIDƒDETERMINE�IF�A�FILENAME'*‹OR�A�JOBID�HAS�BEEN�SPECIFIED�AND�PUT"*‹WHICHEVER�ONE�IT�IS�INTO�THE�FHS*‹PARAMETER�BLOCK&*‚ENTRY:A0=FHS�PARAMETER�BLOCK�ADDRESS!*ˆA3=ADDRESS�OF�FILENAME�OR�JOBID*ˆA4=BASE�ADDRESS*‚EXIT:D7=0=GOOD�RETURN*‡D7=-1=ERROR�RETURN*‡A0=UNCHANGEDA*‡A3=ADDRESS�OF�NEXT�CHARACTER�IN�COMMAND�BUFFER�PAST�A�SEPARATOR*‚USES:0�1�2�3�4�5�6�7*…D�*�*�P�*…P�R*…A�P�*�*�R�Pƒ**‚CALLS:EDITFILE‚CNVAB** FNJOBIDƒEQU„* ŠCLR.L‚D7‘HOPE�FOR�A�GOOD�RETURN&ŠMOVE.L�D2,-(A7)‹SAVE�INTERACTIVE�FLAG2ŠMOVE.L�A0,A6ŽPARAMETER�BLOCK�ADDRESS�FOR�EDITFILE+ŠMOVE.L�A3,A0ŽFILENAME�ADDRESS�FOR�EDITFILEŠMOVE.L�A3,A1ŽSAVE�IT0ŠBSR„EDITFILE‹GO�PUT�FILENAME�IN�PARAMETER�BLOCKŠTST.L‚D0‘CHECK�RETURN%ŠBMI.S‚FNJ10ŽBRANCH�IF�NOT�A�FILENAMEŠBTSTƒ#19,D0�FILENAME�FOUND?ŠBEQ.S‚FNJ10ŽBRANCH�IF�NO-ŠMOVE.L�A0,A3ŽADJUSTED�COMMAND�BUFFER�ADDRESS1ŠMOVE.L�A6,A0ŽRESTORE�FHS�PARAMETER�BLOCK�ADDRESS/FNJRTN„MOVE.L�(A7)+,D2‹RESTORE�INTERACTIVE�FLAGŠRTS—RETURN�TO�CALLER**‚NOT�FILENAME�-�SEE�IF�JOBID*0FNJ10…MOVE.L�#17,D0�CLEAR�OUT�THE�PARAMTER�BLOCK&ŠMOVE.W�FHSUSN(A6),D1†SAVE�USER�NUMBER*ŠADD.L‚#FHSVOL,A6‰STARTING�AT�VOLUME�FIELDFNJ20…CLR.W‚(A6)+ŽCLEAR�ITŠSUB.L‚#1,D0ŽDECREMENT�COUNTŠBNE.S‚FNJ20ŽBRANCH�TIL�CLEARED)ŠMOVE.W�D1,FD HSUSN(A6)†RESTORE�USER�NUMBER,ŠLEA„FHSPB(PC),A0‡RESTORE�PARA�BLOCK�ADDRESS,ŠMOVE.L�A1,A3ŽRESTORE�COMMAND�BUFFER�ADDRESS1ŠCMP.B‚#5,D6ŽMUST�HAVE�AT�LEAST�5�CHARACTERS�LEFT"ŠBLT.S‚FNJERR�BRANCH�IF�LESS,ERRORŠCLR.L‚D0‘COUNTER%FNJ30…MOVE.B�(A3)+,D1‹GET�A�CHARACTERŠCMP.B‚#$30,D1ŒA�NUMBER?ŠBLT.S‚FNJ40ŽBRANCH�IF�NOŠCMP.B‚#$39,D1ŒA�NUMBER?ŠBGT.S‚FNJ40ŽBRANCH�IF�NOŠADD.L‚#1,D0Ž0-9,COUNT�ITŠCMP.L‚D0,D6ŽPAST�END�OF�INPUT?ŠBGT.S‚FNJ30ŽBRANCH�IF�NOT�PASTFNJ40…TST„D0‘GOT�ANY�NUMBERS ŠBEQ.S‚FNJERR�BRANCH�IF�NO,ERRORŠCMP.L‚#5,D0ŽMUST�BE�AT�LEAST�5"ŠBLT.S‚FNJERR�BRANCH�IF�LESS,ERRERŠCMP.L‚#8,D0ŽSEE�IF�MORE�THAN�8%ŠBGT.S‚FNJERR�BRANCH�IF�GREATER,ERROR)ŠSUB.L‚#4,D0ŽSUBTRACT�OUT�4�FOR�OCCURENCE#ŠMOVE.L�A1,D1ŽRESTORE�START�ADDRESS'ŠADD.L‚D0,D1ŽSTART�ADDRESS�OF�OCCURENCEŠMOVE.L�D1,A2ŽSAVE�IT*3*‚D0=#CHARS�IN�USER�NUMBER�PART�OF�JOBID�A1=ADDRESS(*‚4=�#CHARS�IN�OCCURENCE�PART�A2=ADDRESS*(ŠBSR„CNVABŽCONVERT�USER�NUMBER�TO�BINARY)ŠMOVE.W�D3,FHSSIZ(A0)†PUT�INTO�PARA�BLOCK+ŠMOVE.L�A2,A1ŽGET�ADDRESS�OF�OCCURENCE�PARTŠMOVE.L�#4,D0ŽCOUNTŠBSR„CNVABŽCONVERT�TO�BINARYŠMOVE.W�D3,FHSSIZ+2(A0)„SAVE�ITŠBRA„FNJRTN�GO�RETURN%FNJERR„MOVE.L�#-1,D7�SET�ERROR�RETURNŠBRA„FNJRTN�GO�RETURNŠPAGE*!*‚GTAAFT‚GET�ADDRESS�AND�FILETYPE*!*‚ENTRY:A0=PARAMTER�BLOCK�ADDRESS#*ˆD5=INITIAL�COMMAND�BUFFER�ADDRESS#*ˆA3=CURRENT�COMMAND�BUFFER�ADDRESS*ˆA4=BASE�ADDRESS*ˆD6=BUFFER�LENGTH*ˆD0=STATUS�BITS�FROM�EDITFILE*‚EXIT:D6=NEW�BUFFER�LENGTH*‡D7=0=SPOOLER�FILE�OR�JOBID*‡D7=-1=NON-SPOOLER�FILE*‚ERROR�EXIT:CMDERR*‚USES:0�1�2�3�4�5�6�7 *…D�P�*‡P�R�R *…A�P…P�P�*** GTAAFT„EQU„*)ŠCLR.L‚D7‘SET�UP�FOR�SPOOLER-JOBID�RETURN*ŠMOVE.L�A3,D1ŽGET�NEW�COMMAND�LINE�ADDRESS)ŠSUB.L‚D5,D1ŽSEE�HOW�MANY�CHARACTERS�USED ŠSUB.L‚#1,D1ŽBUMP�PAST�SEPARATOR#ŠSUB.L‚D1,D6Ž#�CHARACTERS�REMAININGŠBLT„CMDERR�ERROR�RETURN#ŠTST.L‚FHSSIZ(A0)‰JOB�ID�SPECIFIED?ŠBEQ.S‚GTAAFT10‹BRANCH�IF�NOGTARTN„RTS—RETURN1GTAAFT10‚CMP.B‚#SPOOLF,FHSFIL(A0)�A�SPOOLER�FILE? ŠBEQ„GTARTN�BRANCH�IF�YES-RETURN*-*‚NON-SPOOLER�FILENAME,SET�VOLUME�AND�CATALOG*ŠMOVE.L�#-1,D7�SET�RETURN�CODE3ŠLEA„SAVREG(PC),A5†GET�ADDRESS�OF�INITIAL�REGISTERSŠTST.L‚6(A0)ŽNULL�VOLUME?ŠBNE.S‚GTAAFT20‹BRANCH�IF�NO+ŠMOVE.L�8(A5),FHSVOL(A0)ƒUSE�DEFAULT�VOLUME"GTAAFT20‚BTSTƒ#20,D0�NULL�CATALOG?ŠBNE.S‚GTAAFT30‹BRANCH�IF�NO-ŠMOVE.L�16(A5),FHSCLG(A0)‚USE�DEFAULT�CATALOG+ŠMOVE.L�20(A5),FHSCLG+4(A0)�REST�OF�CATALOG#GTAAFT30‚BTSTƒ#19,D0�NULL�FILENAME?ŠBEQ„CMDERR�BRANCH�IF�YES,ERRORŠBTSTƒ#18,D0�NULL�EXTENSION?ŠBNE„GTARTN�BRANCH�IF�NO,DONE.ŠMOVE.W�#'SA',FHSEXT(A0)ƒSET�DEFAULT�EXTENSIONŠBRA„GTARTN�GO�RETURNŠPAGE*.*‚SETDEVN‚SET�DEVICE�NAME�INTO�PARAMETER�BLOCK*&*‚ENTRY:A0=FHS�PARAMETER�BLOCK�ADDRESS*ˆA3=COMMAND�BUFFER�ADDRESS*ˆA4=BASE�ADDRESS*ˆD2=INTERACTIVE�FLAG*‚EXIT:A0=UNCHANGED=*‡A3=COMMAND�BUFFER�ADDRESS,UPDATED�PAST�DEVICE�AND�SEPARATOR*‡D2=UNCHANGED*‚USES:0�1�2�3�4�5�6�7*…D�*ƒP *…A�P…R�Pƒ**‚CALLS:EDITFILE*‚ERROR�EXIR:CMDERR** SETDEVNƒEQU„*&ŠMOVE.L�D2,-(A7)‹SAVE�INTERACTIVE�FLAG!ŠMOVE.L�A0,A6ŽSAVE�PARA�BLOCK�ADR ŠMOVE.L�A3,A0ŽADR�OF�DEVICE�NAME$ŠBSR„EDITFILE‹GO�PUT�INTO�PARA�BLOCKŠMOVE.L�(A7)+,D2‹RESTORE�FLAGŠTST.L‚D0‘CHECK�RETURNŠBMI„CMDERR�ERROR�RETURNŠBTSTƒ#1,D0ŽDEVICE�NAME�FOUND?ŠBEQ„CMDERR�BRANCH�IF�NO,ERROR"ŠMOVE.L�A0,A3ŽRESTORE�NEXT�ADDRESS(ŠMOVE.L�A6,A0ŽRESTORE�PARA�BLOCK�ADDRESS ŠRTS—RETURNŠPAGE**‚CNVAB‚CONVERT�ASCII�TO�BINARY*"*‚ENTRY:D0=#�CHARACTERS�TO�CONVERT(*ˆA1=START�ADDRESS�OF�NUMBERS�TO�CONVERT*ˆA4=BASE�ADDRESS*‚EXIT:D7=0=GOOD�RETURN*‡D7=-7=ERROR�RETURN*‡D3=CONVERTED�VALUE*‚USES:0�1�2�3�4�5�6�7 *…D�*�*ƒR�*…R*…Aƒ*…P** CNVAB…EQU„* ŠCLR.L‚D7‘HOPE�FOE�A�GOOD�RETURNŠCLR.L‚D3‘CLEAR�RETURNED�VALUE"CNVAB10ƒMOVE.B�(A1)+,D1‹GET�A�BYTEŠCMP.B‚#$30,D1ŒA�NUMBER?"ŠBLT.S‚CNVABERR‹BRANCH�IF�NO,ERRORŠCMP.B‚#$39,D1ŒA�NUMBER?"ŠBGT.S‚CNVABERR‹BRANCH�IF�NO,ERRORŠASL.L‚#1,D3ŽMULTIPLY�BY�10ŠMOVE.L�D3,D4ŽSAVE�ITŠASL.L‚#2,D3ŽMULTIILPY�BY�100ŠADD.L‚D4,D3ŽADD�IN�ORIGINALŠAND.LD ‚#$F,D1�STRIP�ASCIIŠADD.L‚D1,D3ŽADD�TO�RESULTŠSUB.L‚#1,D0ŽDECREMENT�COUNTERŠBNE.S‚CNVAB10ŒBRANCH�TIL�DONE ŠRTS—RETURN%CNVABERR‚MOVE.L�#-1,D7�SET�ERROR�CODEŠRTS ŠEND„SPOLééééé=/* =/*†SRCCOM.LF=/*'=/* Link chain file to create SRCCOM.LO=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to SRCCOM.LL=/*=/IFC \1ƒ=ARG�SRCCOM.LL=/ENDIF=/*=LINK ,SRCCOM.LO,\1;HAMIXS ATTRIBUTES PINPUT SRCCOM.ROLIB 0.&.PDOLRLIB.ROLIB 0.&.PASVMDOS.ROEND=/*=ENDééééééŽ=/* =/*†SRCCOM.PF=/*(=/* Chain file to compile SRCCOM utility=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to SRCCOM.LS=/*=/IFC \1ƒ=ARG�SRCCOM.LS=/ENDIF=/*#=PASCAL SRCCOM.SA,SRCCOM.PE C,\1;Z=80=POPTIM SRCCOM.PC=PASCAL2 SRCCOM.PO=/*=ENDéééééé—G{---------------------------------------------------------------------}{Å}{’S�O�U�R�C�EƒC�O�M�P�A�R�E˜}{Å}6{†This�program�compares�source�files,�outputting�the�}9{†differences.‚The�compare�is�done�line�by�line�until�2‰}:{†lines�do�not�match.‚At�this�point,�both�files�are�readˆ}?{†until�a�group�of�'equal_lines'�lines�is�found�which�matches„}7{†between�the�two�files.‚When�the�match�is�found,�the‹}={†differing�lines�(including�the�first�line�of�the�group�of†}4{†matching�lines)�are�printed.‚The�comparison�thenŽ}{†continues.µ}{Å} {‚To�use:¼}A{„=SRCCOM‚,[,][;]ƒ}7{ˆwhere:‚�and��must�exist�and‰}"{“default�to�extension�.SA�type.”}7{��is�optional.‚If�not�specified,�output�}1{“defaults�to�the�user's�terminal.‚Device�codes„}4{“(#,�#CN00,�#PR)�or�file�names�(default�extension‚}{“.SA�type)�are�accepted.›}{��are�as�follows:œ}2{“M=nnn‚set�matching�lines�count�to�"nnn"�lines.ƒ}!{œ(default�is�3;�-M�is�invalid)Œ};{…-not�imple-ƒW†ignore�blanks�(white�space)�for�compares.‚},{“Y†overwrite�existing�output�file,�if�any…}{œ(default�is�-Y)š}4{“Z=nnn‚increase�stack/heap�size�to�"nnn"�K�bytes.�}{œ(default�is�20K)™}{Å}E{‚NOTE:�To�implement�W�option,�it�is�suggested�to�pack�the�lines�as‚}={ˆread�by�compressing�spaces�into�a�'space�count'�char�such„}<{ˆas�MDOS�did.�If�-W,�then�compare�as�usual.�If�W,�do�byte…}<{ˆcompare�such�that�'space�count'�chars�always�match.�Must…}8{ˆunpack�the�lines�prior�to�printing.�This�method�is�a‰}={ˆcompromise�over�time�(packing�for�each�compare)�vs�memory„}2{ˆ(saving�packed�&�unpacked�source).†-PS�GilmourŠ}{Å}G{---------------------------------------------------------------------}.{�By:‚Peter�S.�GilmourˆDate:‚31�January�1985‘}A{ƒ1.�Changed�to�std.�VERSAdos�utility�format�for�output�file�as…}{†the�3rd�cmd�line�parameter.¤}A{ƒ2.�Added�file�checking�to�insure�that�the�1st�two�files�exist…}E  +©b±v¹fÁaÉ(9{†and�the�3rd�one�doesn't�(asks�for�delete�permission).Š}A{ƒ3.�Changed�default�Z�size�to�20K�(about�70�lines�difference).…}{ƒ4.�Added�M�and�Y�options.©}{Å}{Å}{Å}G{---------------------------------------------------------------------}+{�By:‚John�R.�KoehringˆDate:‚27�June�1980”}G{---------------------------------------------------------------------}  :PROGRAM source_compare (input,output,file1,file2,outfile); ƒCONST(†version…=�'013185�4';ˆ{version�ID�code}†maxint†=�32767;†max_len…=�132;†file1charƒ=�'<';†file2charƒ=�'>'; †space‡=�'�'; †bellˆ=�7;†separatorƒ=�'----------'; ƒTYPE†integer†=�-32768..32767;†line‰=�STRING�[max_len];†link‰=�^line_rec;†line_rec…=�RECORD˜number:‚integer;˜lngth:ƒinteger; ˜data:„line; ˜next:„link•END;�{RECORD}&†options†=�ARRAY['A'..'Z']�OF�integer;†comline†=�STRING[162];†filename…=�STRING[30];6†filestatusƒ=�(found,protect,notfound,invalid,unable);  ƒVAR†eof1,eof2,error,null:†boolean; †head1,head2,†middle1,middle2, †tail1,tail2,†start1,start2, †stop1,stop2,†avl_head:’link;†file1,file2,outfile:‡text;†count1,count2,i:‹integer;†equal_lines,val:‹integer;!†outname,fname1,fname2:…filename;†status:”filestatus;†cmdline:“comline;†opts:–options;†answer,c:’char; ƒLABEL †finished; ƒFUNCTION)†p$fname(var�f:�text):ˆfilename;ƒFORWARD; ƒFUNCTION0†p$lookup(var�f:�filename):ƒfilestatus;�FORWARD; ƒFUNCTION†p$comline:“comline;„FORWARD; ƒPROCEDURE$†p$options(var�f:�options);�FORWARD; ƒPROCEDURE†p$force(var�f:�text);”FORWARD; ƒPROCEDURE#†p$setdiag(val�:�integer);�FORWARD; ƒPROCEDURE$†p$swpfil(var�f1,f2:�text);‘FORWARD; ƒ{$A=2�-�Do�2-byte�arithmetic})ƒ{$H=20480�-�Set�default�stack/heap�size} ƒPROCEDURE�get_lins; †VAR‰cur_line:ƒline; †PROCEDURE�get_lin‚(VAR‚f:…text;šVAR‚eofl:‚boolean;šVAR‚lin:ƒline); ‰BEGIN�{get_lin} Œlin‚:=�'';Œeofl�:=�eof(f);ŒIF�NOT�eofl�THEN�BEGIN’readln�(f,lin);#’IF�length(lin)�=�0�THEN‚lin‚:=�'�' �END�{THEN}‰END;�{get_lin}  †PROCEDURE�put_line�(…lin:ƒline;šVAR‚tail:‚link); ‰VAR Œpnt:‚link; ‰BEGIN�{put_line}ŒIF�avl_head�=�NIL�THEN‚new(pnt) �ELSE‚BEGIN˜pntˆ:=�avl_head;˜avl_headƒ:=�avl_head^.next •END;�{ELSE} ŒWITH�pnt^�DO�BEGIN’number�:=�tail^.number�+�1;’lngth‚:=�length(lin); ’dataƒ:=�lin; ’nextƒ:=�NIL; �END;�{WITH} Œtail^.next‚:=�pnt; Œtailˆ:=�pnt‰END;�{put_line} †BEGIN�{get_lins} ‰IF�NOT�eof1ŒTHEN�BEGIN’get_lin�(file1,eof1,cur_line);’put_line�(cur_line,tail1);’count1‚:=�count1�+�1;6’IF�count1�>�equal_lines�THEN‚middle1‚:=�middle1^.next �END;�{THEN} ‰IF�NOT�eof2ŒTHEN�BEGIN’get_lin�(file2,eof2,cur_line);’put_line�(cur_line,tail2);’count2‚:=�count2�+�1;6’IF�count2�>�equal_lines�THEN‚middle2‚:=�middle2^.next �END�{THEN}†END;�{get_lins}  1ƒFUNCTION�check_fname�(fname:�filename):ƒboolean; †VAR‰i,pc:‰integer;‰null_name:„boolean; †BEGIN�{check_fname}‰null_name�:=�false;‰IF�fname[1]�<>�'#'�THENŒBEGIN�i‚:=�1; �pc�:=�0;�REPEAT’IF�fname[i]�=�'.'�THEN•pc‚:=�pc�+�1; •iƒ:=�i�+�1;�UNTIL�pc�=�2;�IF�fname[i]�=�'&'�THEN’null_name�:=�true;ŒEND;‰check_fname�:=�null_name;†END;�{check_fname}  -ƒFUNCTION�cmp_lin�(ptr1,ptr2:‚link):‚boolean; †VAR‰equal:‚boolean; †BEGIN�{cmp_lin}*‰IF�(ptr1^.lngth�=�0)�OR�(ptr2^.lngth�=�0)*ŒTHEN‚equal‚:=�(ptr1^.lngth�=�ptr2^.lngth))ŒELSE‚equal‚:=�(ptr1^.data‚=�ptr2^.data); ‰cmp_lin�:=�equal†END;�{cmp_lin}  ƒFUNCTION�cmp_lins:‚boolean; †VAR‰equal:‚boolean;  )†PROCEDURE‚compare�(begin1,begin2:�link); ‰VARŒequal_count:‚integer;Œdone:‰boolean; ‰BEGIN�{compare}Œequal�:=�false;F Œstart1�:=�begin1; 'ŒWHILE�(start1�<>�NIL)�AND�NOT�equal�DO�BEGIN’start2�:=�begin2; '’WHILE�(start2�<>�NIL)�AND�NOT�equal�DO•BEGIN˜equal_count�:=�0;˜stop1�:=�start1;˜stop2�:=�start2; ˜REPEAT›IF�cmp_lin�(stop1,stop2)žTHEN¡BEGIN¤IF�stop1^.lngth�=�0 §THEN�equal_count�:=�equal_lines%§ELSE�equal_count�:=�equal_count�+�1;"¤done�:=�equal_count�=�equal_lines ¡END�{THEN}žELSE¡done�:=�true; ›IF�NOT�donežTHEN¡BEGIN¤stop1�:=�stop1^.next;¤stop2�:=�stop2^.next ¡END�{THEN}.˜UNTIL�(stop1�=�NIL)�OR�(stop2�=�NIL)�OR�done; $˜equal�:=�equal_count�=�equal_lines; ˜IF�NOT�equal›THEN�start2�:=�start2^.next •END;�{WHILE} ’IF�NOT�equal•THEN�start1�:=�start1^.next �END�{WHILE}‰END;�{compare} †BEGIN�{cmp_lins}‰compare�(middle1,head2^.next);1‰IF�NOT�equal�THEN‚compare�(head1^.next,middle2);‰cmp_lins‚:=�equal†END;�{cmp_lins}  3ƒPROCEDURE�write_differences�(equal1,equal2:‚link);  7†PROCEDURE�wrt_lins�(head,tail:�link;‚file_char:�char); ‰BEGIN�{wrt_lins}ŒREPEAT�head�:=�head^.next;�IF�head^.lngth�>�0�THEN6’writeln�(outfile,head^.number:5,file_char,head^.data)ŒUNTIL�head�=�tail‰END;�{wrt_lins}  †BEGIN�{write_differences}6‰IF�(equal1�<>�head1^.next)�OR�(equal2�<>�head2^.next)ŒTHEN�BEGIN’writeln�(outfile,separator);#’wrt_lins�(head1,equal1,file1char);’writeln�(outfile,separator);#’wrt_lins�(head2,equal2,file2char);’writeln�(outfile,separator); �END�{THEN}†END;�{write_differences}  -ƒPROCEDURE�free�(VAR�head:�link;‚tail:�link); †VAR ‰old:‚link; †BEGIN�{free}‰WHILE�head�<>�tail�DOŒBEGIN �oldˆ:=�head;�head‡:=�head^.next;�old^.next‚:=�avl_head;�avl_headƒ:=�old ŒEND�{WHILE} †END;�{free}  ƒPROCEDURE�initialize; †BEGIN�{initialize}‰avl_head‚:=�NIL; ‰new�(head1);‰tail1�:=�head1;‰head1^.number�:=�0;‰head1^.next�:=�NIL; ‰new�(head2);‰tail2�:=�head2;‰head2^.number�:=�0;‰head2^.next�:=�NIL;‰reset�(file1);‰reset�(file2);‰eof1�:=�false;‰eof2�:=�false; ‰count1‚:=�0; ‰count2‚:=�0†END;�{initialize}  ƒBEGIN�{source_compare}?†writeln�('Source�Compare:‚',version);†{print�utility�ID�stamp}†error�:=�false;†cmdline�:=�p$comline;†p$options(opts);†equal_lines�:=�3;†FOR�c�:=�'A'�TO�'Z'�DO‰IF�opts[c]�<>�0�THENŒBEGIN�i�:=�opts[c]; �CASE�c�OF1’'M':‚IF�(opts['M']�<�0)�OR�(cmdline[i+1]�<>�'=')*˜OR�(NOT(cmdline[i+2]�IN�['0'..'9']))�THEN›error�:=�true˜ELSE›BEGIN žval�:=�0; ži�:=�i+2;žREPEAT#¡val�:=�val�*�10�+�(ord(cmdline[i]) ±-‚ord('0')); ¡i�:=�i+1;&žUNTIL�NOT�(cmdline[i]�IN�['0'..'9']);žIF�val�<=�0�THEN¡error�:=�truežELSE¡equal_lines�:=�val; ›END;‚{ELSE}’'Y':‚;’OTHERWISE‚error�:=�true;’END;ŒEND; †fname1†:=�p$fname(file1);†fname2†:=�p$fname(file2);†outname…:=�p$fname(outfile); †IF�error�=�true�THEN‰BEGIN4Œwriteln�(output,'Invalid�option�field!',chr(bell));Œp$setdiag(16#8004);Œgoto�finished;‰END; †nullƒ:=�check_fname(fname1);†IF�null�=�true�THEN‰BEGIN4Œwriteln�(output,'File�#1�name�missing!',chr(bell));Œp$setdiag(16#8001);Œgoto�finished;‰END; †nullƒ:=�check_fname(fname2);†IF�null�=�true�THEN‰BEGIN4Œwriteln�(output,'File�#2�name�missing!',chr(bell));Œp$setdiag(16#8002);Œgoto�finished;‰END; †nullƒ:=�check_fname(outname);†IF�null�=�true�THENŒoutname�:=�'#�'‰ELSEŒBEGIN�status�:=�p$lookup(outname);.�IF�(status�=�found)�AND�(opts['Y']�<=�0)�THEN’BEGIN'•write�(output,'Output�file�(',outname,'˜')�already�exists!‚Overwrite�(Y/N)?�', ˜chr(bell));•p$force(output);•readln�(answer);,•IF�(answer�<>�'Y')�AND�(answer�<>�'y')�THEN˜BEGIN›p$setdiag(16#8003);›goto�finished;˜END’ENDŒEND; †rewrite(outfile,�outname); 2†IF�(outname[1]�=�'#')�AND�(outname[2]�=�'�')�THEN‰p$swpfil(output,outfile); †status�:=�p$lookup(fname1);†IF�status�<>�found�THEN‰BEGINCŒwriteln�(output,'File�#1�(',fname1,')�does�not�exist!',chr(bell));Œp$setdiag(16#8001);Œgoto�F finished;‰END; †status�:=�p$lookup(fname2);†IF�status�<>�found�THEN‰BEGINCŒwriteln�(output,'File�#2�(',fname2,')�does�not�exist!',chr(bell));Œp$setdiag(16#8002);Œgoto�finished;‰END; 9†initialize;‚{reset�to�get�&�print�1st�line�of�each�file}<†fname1‚:=�p$fname(file1);‡{get�full�filenames�for�listings}†fname2‚:=�p$fname(file2); †get_lins;6†writeln�(outfile,fname1,file1char,head1^.next^.data);6†writeln�(outfile,fname2,file2char,head2^.next^.data);†writeln�(outfile,separator);†free�(head1,NIL);†free�(head2,NIL); /†initialize;‚{reset�to�start�actual�comparison}†stop1�:=�head1;†stop2�:=�head2; †REPEAT ‰count1‚:=�0; ‰count2‚:=�0; ‰get_lins;‰stop1�:=�stop1^.next;‰stop2�:=�stop2^.next;"‰IF�NOT�cmp_lin�(stop1,stop2)�THENŒBEGIN �count1ƒ:=�1; �count2ƒ:=�1; �middle1‚:=�stop1;�middle2‚:=�stop2; �REPEAT ’get_lins�UNTIL�cmp_lins; "�write_differences�(start1,start2) ŒEND;�{THEN}‰free�(head1,stop1);‰free�(head2,stop2)†UNTIL�eof1�AND�eof2; finished:ƒEND.�{source_compare}éééé=/* =/*†SYMBUG.AF=/*3=/* Chain file to assemble symbolic debugger SYMBUG=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to SYMBUG.LS=/*=/IFC \1ƒ=ARG�SYMBUG.LS=/ENDIF=/*(=ASM SYMBUG.SA,SYMBUG.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Y=/*4=ASM SYMBUG.SIMBO.SA,SYMBUG.SIMBO.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*2=ASM SYMBUG.IODB.SA,SYMBUG.IODB.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*.=ASM SYMBUG.MM.SA,SYMBUG.MM.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*2=ASM SYMBUG.MBSR.SA,SYMBUG.MBSR.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*6=PASCAL SYMBUG.SYMSUBII.SA,SYMBUG.SYMSUBII.PC,TEMP1.LS=/*{ Included files are:=/*ƒ--�none�--=/*}=/*.ƒ=POPTIM�SYMBUG.SYMSUBII.PC,SYMBUG.SYMSUBII.PO4ƒ=PASCAL2�SYMBUG.SYMSUBII.PO,SYMBUG.SYMSUBII.RO;Z=50ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*8=ASM SYMBUG.UTILITY.SA,SYMBUG.UTILITY.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*8=ASM SYMBUG.CODE68K.SA,SYMBUG.CODE68K.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*:=ASM SYMBUG.DCODE68K.SA,SYMBUG.DCODE68K.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;A=/*8=ASM SYMBUG.ERRMSGS.SA,SYMBUG.ERRMSGS.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Aƒ=COPY�TEMP2.LS,\1;Yƒ=DEL�TEMP1.LSG ƒ=DEL�TEMP2.LS=/*=ENDÑX=/* =/*†SYMBUG.LF=/*'=/* Link chain file to create SYMBUG.LO=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to SYMBUG.LL=/*=/IFC \1ƒ=ARG�SYMBUG.LL=/ENDIF=/*=LINK ,SYMBUG.LO,\1;AHMXZ=100SEGƒSYMB(LG):0,14,8,9ATTR S PINPUT SYMBUG.ROIN„SYMBUG.ERRMSGS.ROIN„SYMBUG.SIMBO.ROIN„SYMBUG.IODB.ROIN„SYMBUG.MM.ROIN„SYMBUG.MBSR.ROIN„SYMBUG.DCODE68K.ROIN„SYMBUG.CODE68K.ROIN„SYMBUG.UTILITY.ROINPUT SYMBUG.SYMSUBII.ROLIBƒ0.&.UTILIB.ROLIBƒ0.&.PASVMDOS.ROLIBƒ0.&.PASCALIB.ROEND=/*=ENDéééééÚ/SYMBUG:‚IDNT†2,5‡Multitasking�Symbolic�Debugger*F*‚SYMBUG:ƒEXCEPTION�MONITOR�TASK�(�MULTI-TASK�VERSION�-�MAX.�19�TASKS)**ˆSYMBUG�MODIFICATION�HISTORY**ˆREVISION�CODE‡021885�4:*’PROCESSOR�TYPE�CODES�WERE�INCORRECT�(68000/68008/68010).**’THESE�WERE�CHANGED�TO�68000/68010/68020.*5*’INCORRECT�ERROR�MESSAGE�WHEN�MEMORY�WAS�UNAVAILABLE$*’ON�A�GTASQ�CALL�(D0=8)�AT�IN.TASK.*7*’SYMBUGGING�A�TASK�WITH�AN�EXCEPTION�VIOLATION�ASSUMED9*’THAT�A�BREAKPOINT�HAD�BEEN�THERE,�AND�IF�THERE�WEREN'T,5*’SYMBUG�WOULD�TRAP�LOOKING�FOR�AN�ENTRY.‚CHANGED�THE4*’NOTRACE�ROUTINE�TO�SEE�IF�ANY�BREAKPOINTS�HAD�BEEN6*’ENTERED�BEFORE�SEARCHING�A�TABLE�WITH�NOTHING�IN�IT.*ééG ééé ÜãìFôaüQ G F : ; $M ,H 4; <8 D; L> T: \8 d; l7 t; | „4 Œ; ”4 œ- ¤B ¬1 ´0 ¼7 Ä1 Ì2*ˆREVISION�CODE‡012585�47*’CHANGED�PARAMETER�BLOCK�FOR�LOADER�SO�THAT�ATTRIBUTES*’ARE�TAKEN�FROM�THE�TASK�LIB.**ˆREVISION�CODE‡011685�48*’Changed�DCODE68K�to�output�the�displacement�of�a�MOVEP*’instruction�in�decimal.**ˆREVISION�CODE‡010485�48*’CHANGED�ASQ�MESSAGE�EVENT�SIZE�FROM�12�TO�24�SO�AS�NOT2*’TO�OVERWRITE�PART�OF�"PRINTFHS"�PARAMETER�BLOCK.**ˆREVISION�CODE‡111484�46*’UPGRADE�1-LINE�ASSEMBLER/DISASSEMBLER�TO�HANDLE�LOAD"*’MODULES�FOR�THE�68010�PROCESSOR.* ‰OPT‡FRS¯3/82*‰XREF†EDITFILE,SIMBO,RESOLVE,GETNUMDE“3/82(‰XREF†.PVTRAPD,.PVTRAPE,PARSE_ST,MM,MDDI‰XREF†FORMADDR,BESTFIT,PARSMSGS(‰XDEF†CONV,CLASCODEˆREQUIRED�BY�EDITFILE0‰XDEF†.PLJSR,.PALSTS,.PALSTSLƒREQUIRED�BY�PASCAL%‰XDEF†PROMPT,WHAT‰REQUIRED�BY�MM�3/82*‰XDEF†KEYIN,DO7OUTR,ERLL,MSG00,MSGADR“3/82#‰XDEF†ADRELOŽREQUIRED�BY�MBSRŽ11/83 *Â<<111484*’DATA�LOCATIONS†REQUIRED�BY*‰XDEF†ADR_VAL�-†-…-ƒMBSR‰XDEF†BASE�-†-…-ƒMBSR‰XDEF†BRKBUFŽ-†-…MM‰XDEF†BRKGETŽ-†-…MM‰XDEF†BRKPBGŽ-†-…MM‰XDEF†BRKPBPŽ-†-…MM‰XDEF†BRKPBUF�-†-…MM‰XDEF†BRKSORŽ-†-…MM‰XDEF†CURTCNT�SIMBO‰XDEF†DMOUTAŽ-†-…MM‰XDEF†EOL_FLG�-†-…-ƒMBSR‰XDEF†ERR_NMBRŒ-†-…MM‚MBSR‰XDEF†FHSDB0ŽSIMBO‰XDEF†FHSDB1ŽSIMBO‰XDEF†FHSOPEN�SIMBO‚IODB‰XDEF†FORTASK�SIMBO‚IODB'‰XDEF†GLOBALŽSIMBO‚IODB‚MM‚MBSR‚UTILITY‰XDEF†INP_STR�-†-…-ƒMBSR‰XDEF†INQ‘-†-…MM‚MBSR‰XDEF†INQE�-†-…MM‰XDEF†IOIN�-†-…MM‰XDEF†IOSDB�-†IODB‰XDEF†IOUT�SIMBO‚-…-ƒ-…UTILITY‰XDEF†MODNAME�SIMBO‰XDEF†OMNEXTŽSIMBO‰XDEF†OMNTBLŽSIMBO‰XDEF†OTEND�-†-…MM‰XDEF†OUTBUFŽ-†-…MM‰XDEF†OUTSTAR�-†-…MM‰XDEF†PCODE�-†-…MM‰XDEF†POOL�-†IODB‰XDEF†POOLEND�-†IODB‰XDEF†POOLPTR�-†IODB‰XDEF†PRSE_MD�SIMBO‚-…-ƒMBSR‰XDEF†PTR_INP�-†-…-ƒMBSR‰XDEF†RCVADDR�SIMBO‰XDEF†RCVBLKŽSIMBO‰XDEF†RCVBUFŽSIMBO‰XDEF†RCVSEGŽSIMBO‰XDEF†REVISIONŒSIMBO‰XDEF†SEGADDR�-†IODB‰XDEF†SEGENDŽSIMBO‰XDEF†SYM_BUF�-†-…MM ‰XDEF†SYMNAME�SIMBO‚IODB‚MM‚MBSR‰XDEF†TOKEN�-†-…MM‰XDEF†UTLWORD�-†-…MM**ˆIOS�&�TR1�EQUATES* CDFLUNƒEQU‡$5 DELAY„EQU‡$15 DEMON„EQU‡$41EXMMSKƒEQU‡$42 EXMON„EQU‡$40FHALLOƒEQU‡$80FHASGNƒEQU‡$40 FHCLOSƒEQU‡$4 FHSCLGƒEQU‡$CFHSCLNƒEQU‡$10FHSEXTƒEQU‡$1CFHSFILƒEQU‡$14FHSLRLƒEQU‡$22 FHSLUAƒEQU‡$5 FHSLUBƒEQU‡$6 FHSLUNƒEQU‡$5 FHSOPTƒEQU‡$2 FHSSESƒEQU‡$CFHSSIZƒEQU‡$24 FHSTSKƒEQU‡$8 FHSUSNƒEQU‡$A FHSVOLƒEQU‡$6FHSWCDƒEQU‡$200 FOPEW„EQU‡$3FOPPRPW‚EQU‡$4 GTASQ„EQU‡$1F GTSEG„EQU‡$1IOPBLKƒEQU‡$40IOPBRKƒEQU‡$10 IOPIMGƒEQU‡$8 IOREADƒEQU‡$1IOSCADƒEQU‡$18IOSEADƒEQU‡$10 IOSFCTƒEQU‡$0IOSLENƒEQU‡$14 IOSOPTƒEQU‡$2 IOSRRNƒEQU‡$8 IOSSADƒEQU‡$C IOWRITƒEQU‡$2ISTABRK‚EQU‡$C6 LDFLUNƒEQU‡$6 MOVELLƒEQU‡$6PSTATEƒEQU‡$44 QEVNT„EQU‡$23RDEVNTƒEQU‡$22REXMONƒEQU‡$45RSTATEƒEQU‡$43RTEVNTƒEQU‡$25SETASQƒEQU‡$21 START„EQU‡$D STOP…EQU‡$19 TERM…EQU‡$F TERMT„EQU‡$10TRPVCTƒEQU‡$1BWAKEUPƒEQU‡$14WTEVNTƒEQU‡$24* H *ˆDATA�AREAS* ‰SECTIONƒ0/BˆEQU‡*‰USE�A6�FOR�SOURCE�FIELD�DATA�ADDRESSING:‰DC.B†'011685�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�IDDLOADOPT‚DC.W†$600E…*�USE�LIB�FOR�TASK�INFO�&�ATTRS�(CHGD�BIT�6)�1/85$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‡*�CATALOGFILENAME�DC.L†0,0‡*�FILENAMEEXTENTƒ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‚24‰MAX�MESSAGE�LENGTH…010485‰DC.L‚120ˆ10�MESSAGES�MAX6ASQASRV‚DC.L‚0ŠASR�SERVICE�ROUTINE�VECTOR‚(EXASR)ˆ1/82‰DC.L‚0*(*ˆ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ééééééééH ééééééééééééééééI ééééééééééééééééI ééééééééééééééééJ ééééééééééééééééJ ééééééééééééééééK ééééééééééééééééK ééééééééééééééééL ééééééééééééééééL ééééééééééééééééM ééééééééééééééééM ééééééééééééééééN ééééééééééééééééN ééééééééééééééééO ééééééééééééééééO éééééééééééééééé