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**%*ˆBKMLOGICCHANGESTOREPAIRUTILITY***‰1.'C'OPTIONISTRULYACHECKONLYMODE!*NOUPDATINGWHAT-SO-EVEROCCURS*;*‰2.FORVARIABLELENGTHRECORDS(VRL)ANEDITISPERFORMED8*ŒTOENSURETHATTHEBALANCEOFTHEDATABLOCKISZERO'S)*ŒAFTERTHELASTRECORDINTHEDATABLOCK*>*‰3.FIXEDALOGICBUGINTHE'UPDATE'ROUTINETOEDITFORTHE*Œ'CR'RESPONSEONLY*C*‰4.STEVEBALLHADALREADYMADECHANGESFORPROBLEMOFACRCERROR?*ŒWHILEPROCESSINGSATTODISPLAYONLYTHOSESECTORSINTHESAT?*ŒTHATHADACRCERROR---THECODEHADNOTBEENCHECKEDOUT--<*ŒICHECKEDITOUTANDMADEMINORCHANGESFORTHOSEPROBLEMS *ŒENCOUNTERED*C*‰5.STEVEBALLHADALREADYMADECHANGESFORPROBLEMOFPRINTERNOTD*ŒREADY--A1.5SECONDDELAYANDREPEATOFATTEMPTTOPRINTMESSAGE>*ŒWASPUTIN--ANYERROROTHERTHANNOTREADYWOULDTERMINATEA*ŒPROCESSING--THECODEHADNOTBEENCHECKEDOUT--ICHECKEDIT;*ŒOUTANDMADEMINORCHANGESFORTHOSEPROBLEMSENCOUNTERED*F*‰6.MESSAGE-PRINTERERRORD0=XXXXXXXXU-WASBEINGOUTPUTBECAUSED*ŒTHEWRONGENDINGADDRESSWASBEINGSPECIFIED-THEEXTRACHARACTER3*Œ'U'WASBEINGDISPLAYED---PROBLEMWASCORRECTED*$*ƒChangesmadebyMarcBriel‚1/17/83*E*‰1.ModifiedtheSATcheckroutinetoexecuteproperlyifthenumber?*‹ofsectorsonthediskbeingrepairedexactlyfilledtheSAT.A*‹Previously,REPAIRwouldattempttoallocatesectorsfarbeyond@*‹theendoftheSATbuffercausingabuserrororsystemcrash.*F*‰2.Addedacheckforthediskconfigurationarea.IfaconfigurationD*‹areaexists,itslengthmustbenon-zerooranerrorisissuedandD*‹theutilityterminates.Ifthelengthisnon-zero,thediskSATisB*‹checkedtoassurethatthesectorsareallocatedandthesectorsB*‹areallocatedinthereconstructedSAT.Anyallocationconflicts"*‹thatarisearehandledasusual.*/(J0P8I@*HGPHX2`ohppnxm€uˆwK˜H A¨E°P¸OÀDÈ;ÐHØAàaè@ð@øFTE (*ƒChangesmadebyRonJones,Jr.7/26/83*G*‰1.Addedalineofcodetothe"CHECKATTRIBUTES"routinethatmaskesC*Œoffallbutthebitsthatrepresentthefiletype.ThisfixedtheB*Œproblemofanerror"ER:FILEATTRIBUTES"bienggeneratedifanyA*Œofthebitsintheuserspecifiedattributefieldareset.This=*Œiseventhoughallotherfileattributesarecorrectlyset.‰PAGE*!* EQUATES (INCLUDED UNDER NOLIST)ŠNOLISTŠINCLUDE9995.&.EXE.EQŠINCLUDE9995.&.TR1.EQŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.NIO.EQŠINCLUDE9995.&.FME.EQŠINCLUDE9995.&.FMI.EQŠLIST*‰INCLUDE9995.&.EXE.EQ*‰INCLUDE9995.&.TR1.EQ*‰INCLUDE9995.&.IOE.EQ*‰INCLUDE9995.&.NIO.EQ*‰INCLUDE9995.&.FME.EQ*‰INCLUDE9995.&.FMI.EQ*O*******************************************************************************O**********************************************************************************$*ˆREPAIR„UTILITY‚-PART1***O*******************************************************************************O*********************************************************************************ˆ*************ˆDATASECTION*ˆ*************B*ˆNOTE:ALLSECTORNUMBERSMUSTBELESSTHANOREQUALTO$7FFFFFFF*ˆ(HIGHORDERBITOFF).2*ˆALSO,2COMPLETESATBUFFERSAREMEMORYRESIDENT***ˆLINKAGETOPART2*Š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ŽCHANGENAMESFORUNIFORMITY'SSAKEPDBFPT„EQU„DIRFPTPDBENT„EQU„DIRENTPDBSTR„EQU„DIRSTRPDBLEN„EQU„DIRLEN*7*ˆTHEFOLLOWINGLUN'SMUSTBEAVAILABLEFORASSIGNMENT:D*ˆ(CDF/LDFLUNMUSTBEASSIGNEDANDTRANSFERREDTOREPAIRBYLOADER)**VOLLUN„EQU„1’LUNFORVOLUMETOBEREPAIREDPRTLUN„EQU„2’LUNFORPRINTER**ˆTASKANDSEGMENTEQUATES*&TASKID„EQU„'REPA'TASKNAMEFORREPAIR.SATSEG„EQU„'SATS'SEGMENTNAMEFORSATSEGMENTB*ˆ(SEGMENTALLOCATEDAFTERVIDCHECKSTEP-REMAINSALLOCATEDTILL*ˆREPAIRTERMINATES.)-FDBSEG„EQU„'FDBS'FAB/DATABLOCKSEGMENTNAMED*ˆ(SEGMENTALLOCATEDFOREACHNONCONTIGUOUSFILECHECK-DEALLOCATED*ˆATENDOFTHEFILECHECK.)**CRˆEQU„$D‘CARRIAGERETURNLFˆEQU„$A‘LINEFEED2NOPTIONƒEQU„0’D6EQUATEFORSCANNINGOPTIONSFIELD1MAXBAD„EQU„12‘NUMBEROFTRACKSFORALTSECTORS‚()ŠPAGE*1*ˆD7BITEQUATES-SEEVIDCHECKFORMOREDETAILS*"DEFOPT„EQU„1’DEFAULTOPTIONSTATUSKOPTIONƒEQU„131RCRSAT„EQU„14‘1=>RECREATESAT,0=>USEOLDSAT9COPTIONƒEQU„15‘IMOFFFORCHECK-ONLYMODE(TERMONERROR)&IMC‡EQU„16‘IMOFFMODETILLERROR/DONE3NXTSTP„EQU„17‘IMOFFTILLNEXTMAJORSTEPOFREPAIR.STP1†EQU„18‘IMTURNEDOFFTILLNEXTMINORSTEP/FOUNDF„EQU„29‘SET=>FILEFOUNDFORFILEREPAIR*’OFF=>FILENOTFOUNDYETROPTIONƒEQU„301FREPAIRƒEQU„31‘FILENAMEGIVEN‚FORREPAIR/RECOVERY5NIMASK„EQU„$0FFF0000ŠMASKTOTURNIMBACKONIFERROR**O******************************************************************************** ŠSECTION0B‰EQU„*’FORBASEREFERENCINGŠDC.Bƒ'0131854'*O********************************************************************************PATCH:„DS.Bƒ100PATCHAREA*ŠDS.Bƒ500STACKAREA*3STACK…EQU„*’STACKOVERFLOWWILLCAUSE‚ADDRESSERROR*$************************************ *ˆMACROS$************************************ 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 *ˆ****************************ˆSTARTOFUNINITIALIZEDDATA*ˆ**************************** DATAUI„EQU„**-DRVHEADS‚DS.Bƒ1’NUMBEROFHEADSONTHISDRIVE4SECPTRAK‚DS.Bƒ1’NUMBEROFSECTORS/TRACKONTHISDISK7ALTLASTƒDS.Lƒ1’PSNOFFIRSTSECTOROFALTERNATESECTORS2LSTSRD„DS.Lƒ1’PSNOFLASTSECTORBEFOREREADERROR 8TOTVSECT‚DS.Lƒ1’TOTALNUMBEROFVERSAdosSECTORSONDISKLINESTRT‚DS.Lƒ1AMTLEFTƒDS.Lƒ1 SDBDEL„DS.Lƒ1 PDBDEL„DS.Lƒ1**ˆSECTORBUFFERFORVID*VIDBUF„DS.Bƒ256*6*ˆSECTORBUFFERFORREADINGINSECTORSFORUPDATE/DUMP*SECBUF„DS.Bƒ2560PSNSEC„DS.Lƒ1’PSNOFSECTORINBUFFER(0=NONE)***‰POINTERSTOTHEBUFFERINUSE*/USESBUFƒDS.Lƒ1’ADDRESSOFSDBBUFFERBEINGUSED/USEPBUFƒDS.Lƒ1’ADDRESSOFPDBBUFFERBEINGUSED** *‰SDBBUFFER*-PSNSDB„DS.Lƒ1’PSNOFSDBINBUFFER(0=NONE)'PRVSDB„DS.Lƒ1’PRIORSDB'SPSN,0=NONE'NXTSDB„DS.Lƒ1’PSNOFNEXTSDB,0=NONE SPTR1…DS.Lƒ1SDBBUF„DS.BƒSDBSZE*256*6*‰ALTERNATESDBBUFFER†(USEDINEMPTYSTRUCTURECHECK)* SPTR2…DS.Lƒ1SDB2BUFƒDS.BƒSDBSZE*256** *ˆPDBBUFFER*.PSNPDB„DS.Lƒ1’PSNOFPDBINBUFFER‚(0IFNONE)-PRVPDB„DS.Lƒ1’PSNOFPREVIOUSPDBƒ(0IFNONE))NXTPDB„DS.Lƒ1’PSNOFNEXT…PDBƒ(0IFNONE) PPTR1…DS.Lƒ1PDBBUF„DS.BƒPDBSZE*256*6*‰ALTERNATEPDBBUFFER†(USEDINEMPTYSTRUCTURECHECK)* PPTR2…DS.Lƒ1PDB2BUFƒDS.BƒPDBSZE*256**:*ˆSATBUFFERADDRESSES‚-BUFFERSALLOCATEDAFTERVIDCHECK*@SATABUFƒDS.Lƒ1‹ADD.OFALLOCATIONSATBUFFER(CREATEDBYREPAIR)DSATDBUFƒDS.Lƒ1‡ADD.OFOLDSATBUFFER(FROMDISK,CHANGEDBYREPAIR)**ˆPRIORFAB'SLASTKEY*$PRIFKY„DS.Bƒ100100=MAXKEYLENGTHŠPAGE*D*ˆFABANDDATABLOCKBUFFERS-BUFFERALLOCATEDFOREACHFILEDURING+*ˆFILECHECK,RELEASEDATENDOFTHECHECK.*5PSNFAB„DS.Lƒ1’PSNOFCURRENTFABINMEMORY(0=NONE),PRVFAB„DS.Lƒ1’PSNOFPREVIOUSFAB(0=NONE)JFABLNK„DS.Lƒ1PSNOFLASTFABUSINGFORWARDLINKS,TOBELINKED(0=NONE):FDBSTR„DS.Lƒ1STARTINGLOGICALADDRESSOFFAB-DATA-SEGMENT9*’ADDRESSKNOWNAFTERITISALLOCATED.(PHYSICAL=LOCIGAL)5*’SEGMENTALLOCATEDFOREACHFILECHECKTOGETPROPER9*’SIZEBUFFERS;FABBUFFERISATBEGINNINGOFTHESEGMENT'*’ANDISFOLLOWEDBYDATABLOCKBUFFER.'FABBUF„EQU„FDBSTRADDRESSOFFABBUFFER3PSNDB…DS.Lƒ1’PSNOFDATABLOCKIN‚MEMORY(0=NONE)!DBBUF…DS.Lƒ1’ADDRESSOFDBBUFFER.DBEND…DS.Lƒ1’ADDRESSOFLASTBYTEOFDBBUF+1-DBLEA…DS.Lƒ1’LOGICALENDADDRESSOFDBBUFFER&FABLEN„DS.Lƒ1’NUMBEROFSECTORSINFAB2FABCHK„DS.Bƒ1’FABLINKFLAGFORCHECKINGFABCHAINFFBFLNK„EQU„0ƒDOFORWARDTHENBACKWARDSEARCH,NOWDOINGFORWARDSEARCH#FLOLNK„EQU„1’DOONLYFORWARDSEARCH6FBBLNK„EQU„2’DOINGBACKWARDSEARCHAFTERFORWARDLINKS$BLOLNK„EQU„3’DOBACKWARDSEARCHONLY)LSTLNK„EQU„$FFDONE,DOINGLASTFABCHECKDBFLG…DS.Bƒ1‰0=DB‚NOTUPDATED,1=DB‚UPDATED,WRITETODISK?SATFLG„DS.Bƒ1‰0=SATNOTTOBEUPDATED,1=UPDATESATONDISKBCFGAFLGƒDS.Bƒ1‰0=CFGANOTTOBEUPDATED,1=UPDATECFGAONDISK**5PRTFLG„DS.Bƒ1’0=>DUMPTOLDFLUN,1=DUMPTOPRTLUNGCPYFLG„DS.Bƒ1ƒ1=>TERMINALOUTPUTONLY,0=>HARDCOPYTOLINEPRINTER%LINECNTƒDS.Bƒ1’LINESPERPAGEPRINTED:MAXLINES‚DC.Bƒ1’MAX#OFLINESPERPAGEFORPRINTEROUTPUT!FILOK…DS.Bƒ1’1=FILEOK,0=NOTOK 6RCVFLG„DS.Bƒ1’1=RECOVERINGDELETEDFILE,0=NORECOVERY,DELCRI„DS.Bƒ1’1=DELETECURRENTITEM,0=DON'T-DELPRI„DS.Bƒ1’1=DELETEDPRIORFAB,0=IFDIDN'T,DELNXF„DS.Bƒ1’1=DELETEDNEXTFAB,0=IFDIDN'T*KILL†DS.Bƒ1’KILLREPAIR*&TEMP†DS.Lƒ1’TEMPORARYREGISTERSTORAGE**'*‰FLAGSUSEDBY'EMPTYSTRUCTURECHECK'*/CRSDBFLG‚DS.Bƒ1’SDBCURRENTBUFFERUPDATEDFLAG3FIRSFLGƒDS.Bƒ1’1stCHARINLINETOBEPRINTEDFOUND-LSSDBFLG‚DS.Bƒ1’PREVIOUSSTRUCTURE=SDBFLAG-LSPDBFLG‚DS.Bƒ1’PREVIOUSSTRUCTURE=PDBFLAG/PUPFLG„DS.Bƒ1’PDBALTERNATEBUFFERUPDATEDFLAG/SUPFLG„DS.Bƒ1’SDBALTERNATEBUFFERUPDATEDFLAG2SATSGFLG‚DS.Bƒ1’1=SATSEGMENTALLOCATEDINMEMORY***‰FLAGSUSEDBYHELPFACILITY*)ASKCTFLG‚DS.Bƒ1’1=ASKTOCONTINUE‚0=NOT***ˆUPDATESECTORLIMITS*>UPDSTR„DS.Lƒ1ŒUPDATEPSNBOUNDS:FIRSTPSNTHATMAYBEUPDATED*œ(LOWERBOUND)/UPDEND„DS.Lƒ1’FIRSTPSNTHATMAYNOTBEUPDATED*œ(UPPERBOUND+1)ŠPAGE**ˆDISKATTRIBUTES*FMPSN†DS.Lƒ1‚LASTPSNAVAILABLEONTHEDISK(MPSN+1=TOTAL#OFSECTORS)ANOSEC…DS.Wƒ1ˆ#OFSECTORSNOTONDISKBUTMARKEDALLOCATEDINSAT**ˆLINEBUFFERFORDUMP*LINEBUFƒDS.Bƒ2’2SPACESOFSFLD„DS.Bƒ2’OFFSETFIELDŠDS.Bƒ2’2SPACES.ŠDS.Bƒ16*3+116BYTESINHEXFOLLOWEDBYSPACEŠDS.Bƒ3’3SPACES#ASCFLD„DS.Bƒ16‘ASCIIREPRESENTATIONLINEL…EQU„*-LINEBUF**ˆ**************************ˆENDOFUNINITIALIZEDDATA*ˆ**************************ŠDS.Lƒ0:DATAUILƒEQU„*-DATAUI‹BYTECOUNTTOCLEARININITIALIZATIONŠPAGE*(*ˆCOMMANDLINEANDINPUT/RESPONSEBUFFER*(INPBUF„COMLINE8180CHARACTERLINE+CRINPBUFEƒEQU„*-1ENDOFBUFFERŠDS.Lƒ0*)INITREGƒEQU„*’REGSSAVEDONINITIALENTRY-STSKNAMƒDS.Lƒ1’D0=TASKNAMETHATSTARTEDME1SESNUM„DS.Lƒ1’D1=SESSIONNUMBERTHATSTARTEDME&VOLNAM„DS.Lƒ1’D2=DEFAULTVOLUMENAME'USERNUMƒDS.Lƒ1’D3=DEFAULTUSERNUMBER(CATNAMEƒDS.Lƒ1’D4=DEFAULTCATALOGNAME-ŠDS.Lƒ1’D5=2NDHALFOFDEFAULTCATALOGNAME,ŠDS.Lƒ1’D6=#OFCHARACTERSINCOMMANDLINESAVD7…DS.Lƒ1’D7=LUMASKINITA0„DS.Lƒ1’A0=TASKNAME INITA1„DS.Lƒ1*#*ˆFILENAMEFORFILEREPAIR/RECOVERY*#USRNUM„DC.Bƒ'„'USERNUMBER(ASCII)CATNAM„DC.Bƒ'ˆ'‰CATALOGNAMEFILNAM„DC.Bƒ'ˆ'‰FILENAMEEXTNAM„DC.Bƒ'‚'EXTENSION*ŠPAGE** *ˆMESSAGES**ˆREPAIRHEADER*ŠDS.Lƒ0REPVER„DC.BƒLF*ŠDC.Bƒ'VERSADOSREPAIRUTILITY-VERSION‚'&REPVERPƒDC.Bƒ'ˆ'‰RECEIVESVERSIONCODEŠDC.BƒLFREPVERLƒEQU„*-REPVER*ŠDS.Lƒ0LFMSG…DC.Bƒ''LFMSGL„EQU„*-LFMSG*ŠDS.Lƒ0TOFMSG„DC.Bƒ$C‘TOPOFFORM*ŠDC.Bƒ'VERSADOSREPAIRUTILITY-VERSION‚'&TOFMSGPƒDC.Bƒ'ˆ'‰RECEIVESVERSIONCODEŠDC.BƒLFTOFMSGLƒEQU„*-TOFMSGŠPAGE HLPSMSG:‚EQU* HLPLMSG:‚DS‚0@L0LF<'/////////////////////////////////////////////////////'>L0LF<'Ž/‘--‚HELP‚--–/'>AL0LF<'/////////////////////////////////////////////////////‚'>AL0LF<'Manycommandsarevalidforonlycertainupdateloops.'>=L0LF<'Thefollowingdiagramillustrates,withasterics,‚'>3L0LF<'thecommandsvalidforeachupdateloop.'>3L1LF<'(NOTE"FSU"representsFINALSATUPDATE)'> 6L0LF<'™VID-CFGA-SAT-SDB-PDB-PDE-FAB-DB-FSU'>6L0LF<'™-------------------------------------------'>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„*-HLPSMSGL0LF<'‚A‚--½'>FL0LF<'ˆAllocate-usedonlyinfinalSATCHECKwhenSATisnotto‚'>#L1LF<'ˆberecreatedbyREPAIR.¥'> L0LF<'‚A$[,n]¶'>DL0LF<'ˆAllocatesectorsinSAT,whereisaphysicalsector'>DL0LF<'ˆnumber(inHEX)withintheSAT,andwheren(ifgiven,is'>?L0LF<'ˆthedecimalnumberofconsecutivesectorsaffected).'>L1LF<'ˆndefaultsto1.'>  GL0LF<'‚C‚--Terminatesloop,andcontinuesincheckonlymodeuntil'>CL2LF<'ˆanerrorisencounteredoruntilexecutioniscompleted.'> L0LF<'‚D$[,n]'>BL0LF<'ˆDeleteordeallocatesectorsfromSAT,whereisa'>=L0LF<'ˆphysicalsectornumber(inHEX)withintheSAT,and'>BL0LF<'ˆwheren(ifgiven)isthedecimalnumberofconsecutive'>-L1LF<'ˆsectorsaffected.‚ndefaultsto1.'> L0LF<'‚$[,n][#PR]'>CL0LF<'ˆDumpanysector(s)tothelistingdevice,wherenisthe'>>L0LF<'ˆdecimalnumberofconsecutivesectorstobedumped.'>L1LF<'ˆ(ndefaultsto1)'> %L0LF<'‚$xx[,xx]...'>FL0LF<'ˆUpdateasectorofthestructure,whereisaphysical'>DL0LF<'ˆsectornumber(inHEX),isaHEXvalue(0-$FF),'>@L0LF<'ˆandxxiseitheraHEXvalue(0-$FF)oraperiod(.)'>CL0LF<'ˆfollowedbyanASCIIcharacter.Thenewvaluesspecified'>DL0LF<'ˆ(xx[,xx]...)‚replaceconsecutivebytesstartingwiththe'>>L1LF<'ˆbyteatthegiveninthespecifiedsector.'> L0LF<'‚xx[,xx]...'>HL0LF<'ˆSameasimmediatelyabove,butchangesarealwaysmadetothe'>GL0LF<'ˆfirstsectorofthestructure.Heremuststartwith'>@L1LF<'ˆanumericcharacter(itsvaluemuststillbe(0-$FF).'> AL1LF<'‚N‚--Terminateloop,turnoffIMuntilnextstructure.'> )L0LF<'‚Q‚--AlwaysterminatesREPAIR.'>=L1LF<'ˆAllsectorsupdatedinmemoryarewrittentodisk.'> JL1LF<'‚$[,n]Dumpstructure,ifngiven,dumpnthsectorofstructure.'> 8L1LF<'‚‚(carriagereturnonly.)‚Terminatesloop.'> L2LF<'ˆ'> L2LF<'ˆ'> L2LF<'ˆ'> L2LF<'ˆ'> L2LF<'ˆ'>  HLPLMSGL‚EQU„*-HLPLMSG******** *HLPSMSG:‚DS.Lƒ0!*L0LF<'Q‚--‚terminateREPAIR.'>8*L0LF<'ƒ(carriagereturnonly.)‚Terminatesloop.'>A*L0LF<'N‚--‚terminateloop,turnoffIMuntilnextstructure.'>J*L0LF<'$[,n]‚dumpstructure,ifngiven,dumpnthsectorofstructure.'>J*L0LF<'C‚--‚terminateloop,continueincheckmodeuntilerrororend.'>*HLPSMSGL‚EQU„*-HLPSMSG********‰PAGE*"*ˆMESSAGESFOREACHNEWMAJORSTEP*ŠDS.Lƒ0 VIDMSG„DC.Bƒ'***VIDCHECK***'ŠDC.BƒLFVIDMSGLƒEQU„*-VIDMSG*ŠDS.Lƒ0"CFGAMSGƒDC.Bƒ'***CFGACHECK***'ŠDC.BƒLFCFGAMSGL‚EQU„*-CFGAMSG*ŠDS.Lƒ0 SATMSG„DC.Bƒ'***SATCHECK***'ŠDC.BƒLFSATMSGLƒEQU„*-SATMSG*ŠDS.Lƒ0 SDBMSG„DC.Bƒ'***SDBCHECK***'ŠDC.BƒLFSDBMSGLƒEQU„*-SDBMSG*ŠDS.Lƒ0 PDBMSG„DC.Bƒ'***PDBCHECK***'ŠDC.BƒLFPDBMSGLƒEQU„*-PDBMSG*ŠDS.Lƒ0!FILMSG„DC.Bƒ'***FILECHECK***'ŠDC.BƒLFFILMSGLƒEQU„*-FILMSG*,ŠDS.Lƒ0’FOREACHFILECHECKEDSENDFILENAMEFFFMSG„DC.Bƒ':'FUSERNŠDC.Bƒ'„'USERNUMBER ŠDC.Bƒ'.'FCATALŠDC.Bƒ'ˆ'‰CATALOGNAME.FUCMSL„EQU„*-FFFMSG‹USER#,CATALOGMSGLENGTH ŠDC.Bƒ'.'FFILENŠDC.Bƒ'ˆ'‰FILENAME ŠDC.Bƒ'.'FEXTENŠDC.Bƒ'‚'EXTENSIONFFFMSGLƒEQU„*-FFFMSG*CLNMSG„DS.Lƒ0­11/27/849ŠDC.Bƒ'***EMPTYDIRECTORYSTRUCTURECHECK***'„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ƒ'MOREHELP(Y/N)?'MOREMSGL‚EQU„*-MOREMSG*ŠDS.Lƒ0"TNUEMSGƒDC.Bƒ'TYPETORETURN'TNUEMSGL‚EQU„*-TNUEMSG* ŠPAGE**ˆDISKCONTENTERRORMESSAGES* *ˆVIDERRORS*ŠDS.Lƒ0LVOLNMSGDC.Bƒ'ER:VOL-ID-1stchar.mustbealphabetic,othersalphanumeric'VOLNMSGL‚EQU„*-VOLNMSG*ŠDS.Lƒ0$VOLDMSGƒDC.Bƒ'ER:VOLUMEDESCRIPTOR'VOLDMSGL‚EQU„*-VOLDMSG*ŠDS.Lƒ0,WRDMSG„DC.Bƒ'ER:DISKNOTAVERSADOSVOLUME'WRDMSGLƒEQU„*-WRDMSG*ŠDS.Lƒ0SATLER„DC.Bƒ'ER:SATLENGTH=‚' SATLEL„DS.Lƒ1SATLERLƒEQU„*-SATLER*ŠDS.Lƒ0CFGALERŠDC.Bƒ'ER:CFGALENGTHZERO'CFGALERL‚EQU„*-CFGALER*ŠDS.Lƒ0 STPMSG„DC.Bƒ'ER:SATPSN=' STPPSN„DS.Lƒ2STPMSGLƒEQU„*-STPMSG*ŠDS.Lƒ0SDPMSG„DC.Bƒ'ER:SDBPSN=' SDPPSN„DS.Lƒ2SDPMSGLƒEQU„*-SDPMSG*ŠDS.Lƒ0NALMSG„DC.Bƒ'ER:' NALITM„DS.Lƒ1’ITEMNOTALLOCATEDŠDC.Bƒ'NOTALLOCATEDINSAT'ŠDC.Bƒ',PSN=' NALPSN„DS.Lƒ2NALMSGLƒEQU„*-NALMSG*ŠDS.Lƒ0SLTMSG„DC.Bƒ'ER:SLTPSNERROR'SLTMSGLƒEQU„*-SLTMSG*ŠDS.Lƒ0SLSMSG„DC.Bƒ'ER:SLSPSNBAD'SLSMSGLƒEQU„*-SLSMSG*ŠDS.Lƒ0"BTPMSG„DC.Bƒ'ER:BADTESTPATTERN'BTPMSGLƒEQU„*-BTPMSG*ŠDS.Lƒ0BTSMSG„DC.Bƒ'ER:TSTPSNERROR'BTSMSGLƒEQU„*-BTSMSG*ŠDS.Lƒ0%BDAMSG„DC.Bƒ'ER:DUMPAREAPSNERROR'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ƒ'REALLOCATEDAFTERFILEDELETED,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ƒ'SPACEALREADYALLOCATED,PSN=' ALEPSN„DS.Lƒ2ALEMSGLƒEQU„*-ALEMSG*ŠDS.Lƒ0CATMSG„DC.Bƒ'ER:CATALOGNAME'CATMSGLƒEQU„*-CATMSG*ŠDS.Lƒ0RESMSG„DC.Bƒ'ER:' RESITM„DS.Lƒ1(ŠDC.Bƒ'RESERVEDFIELDNOTZERO,PSN='RESPSN„DS.Lƒ2’PSNRESMSGLƒEQU„*-RESMSG*ŠDS.Lƒ08USAMSG„DC.Bƒ'ER:UNUSEDSECTORSMARKEDALLOCATEDINSAT'USAMSGLƒEQU„*-USAMSG*ŠDS.Lƒ0 ATEMSG„DC.Bƒ'ER:FILEATTRIBUTE'ATEMSGLƒEQU„*-ATEMSG*ŠDS.Lƒ0FNEMSG„DC.Bƒ'ER:FILENAME'FNEMSGLƒEQU„*-FNEMSG*ŠDS.Lƒ0EXTMSG„DC.Bƒ'ER:EXTENSION'EXTMSGLƒEQU„*-EXTMSG*ŠDS.Lƒ0&DBPMSG„DC.Bƒ'ER:DBPSNERROR,PSN=' DBPPSN„DS.Lƒ2DBPMSL„EQU„*-DBPMSGŠDC.Bƒ',LENGTH=‚' DBPLEN„DS.Lƒ2DBPMSGLƒEQU„*-DBPMSG*ŠDS.Lƒ0 FNFMSG„DC.Bƒ'ER:FILENOTFOUND'FNFMSGLƒEQU„*-FNFMSG*ŠDS.Lƒ07SPNMSG„DC.Bƒ'ER:USER#,CATALOGNAMECONFLICT,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„CATALOGNAMESPCMSGLƒEQU„*-SPCMSG*ŠDS.Lƒ0EFCMSG„DC.Bƒ'ER:EOF/EOR'EFCMSL„EQU„*-EFCMSGŠDC.Bƒ'ANDFAB/DBCONFLICT'EFCMSGLƒEQU„*-EFCMSG*ŠDS.Lƒ0DBZMSG„DC.Bƒ'ER:'DBZMS…DC.Bƒ'DBSIZE=' DBZFLD„DS.Wƒ1DBZMSL„EQU„*-DBZMSDBZMSGLƒEQU„*-DBZMSG*ŠDS.Lƒ0FDZMSG„DC.Bƒ'ER:'ŠDC.Bƒ'FDBSIZE=' FDZFLD„DS.Wƒ1FDZMSGLƒEQU„*-FDZMSG*ŠDS.Lƒ0LDBZMSGƒDC.Bƒ'ER:LASTDBSIZE'LDBZMSGL‚EQU„*-LDBZMSG*ŠDS.Lƒ0FBZMSG„DC.Bƒ'ER:FABSIZE=' FBZFLD„DS.Wƒ1FBZMSGLƒEQU„*-FBZMSG*ŠDS.Lƒ0'FDKMSG„DC.Bƒ'ER:FAB/DBKEYCONFLICT('FDKATR„DC.Bƒ1’L,F,ORH ŠDC.Bƒ')'FDKMSGLƒEQU„*-FDKMSG*ŠDS.Lƒ00FDSMSG„DC.Bƒ'ER:FAB/DBSECTORCONFLICT,PSN=' FDSPSN„DS.Lƒ2FDSMSGLƒEQU„*-FDSMSG*ŠDS.Lƒ00FDRMSG„DC.Bƒ'ER:FAB/DBRECORDCONFLICT,PSN=' FDRPSN„DS.Lƒ2FDRMSGLƒEQU„*-FDRMSG*ŠDS.Lƒ01EFFMSG„DC.Bƒ'ER:EMPTYFILE-LASTFABPSNNOT0'EFFMSGLƒEQU„*-EFFMSG*ŠDS.Lƒ0#EFBMSG„DC.Bƒ'ER:EMPTYFAB,PSN=‚' EFBPSN„DS.Lƒ2EFBMSGLƒEQU„*-EFBMSG*ŠDS.Lƒ0&DKEMSG„DC.Bƒ'ER:DBKEYORDER,PSN=' DKEPSN„DS.Lƒ2DKEMSGLƒEQU„*-DKEMSG*ŠDS.Lƒ0NFLMSG„DC.Bƒ'ER:NOFABLINKS'NFLMSGLƒEQU„*-NFLMSG*ŠDS.Lƒ0"RLEMSG„DC.Bƒ'ER:RECORDLENGTH=' RLEFLD„DS.Lƒ1RLEMSGLƒEQU„*-RLEMSG*ŠDS.Lƒ0KEYMSG„DC.Bƒ'ER:KEYSIZE=‚' KEYFLD„DS.Wƒ1KEYMSL„EQU„*-KEYMSG ŠDC.Bƒ'('#KEYATR„DC.Bƒ1’IORDORS‚ORHORE ŠDC.Bƒ')'KEYMSGLƒEQU„*-KEYMSG*ŠDS.Lƒ0"BFTMSG„DC.Bƒ'ER:BADFABCONTENTS'BFTMSGLƒEQU„*-BFTMSG*ŠDS.Lƒ0.BFLMSG„DC.Bƒ'ER:BADFABFORWARDLINK,PSN=' BFLPSN„DS.Bƒ8BFLMSGLƒEQU„*-BFLMSG*ŠDS.Lƒ0LFPMSG„DC.Bƒ'LASTFABPSN=‚' LFPPSN„DS.Lƒ2LFPMSGLƒEQU„*-LFPMSG*ŠDS.Lƒ0/BBLMSG„DC.Bƒ'ER:BADFABBACKWARDLINK,PSN=' BBLPSN„DS.Bƒ8BBLMSGLƒEQU„*-BBLMSG*ŠDS.Lƒ0PFPMSG„DC.Bƒ'PRIORFABPSN=‚' PFPPSN„DS.Lƒ2PFPMSGLƒEQU„*-PFPMSG*ŠDS.Lƒ0$FUSMSG„DC.Bƒ'ER:FABUSAGEFRACTION'FUSMSGLƒEQU„*-FUSMSG*ŠDS.W†0X00100:+ŠDC.B†'ER:DATAEXISTAFTERLASTDBRECORD' X00199„EQU‡*-X00100ŠPAGE**ˆDEFAULTREPAIRMESSAGES*ŠDS.Lƒ0RECMSG„DC.Bƒ'R:RECALCULATE'RECMSGLƒEQU„*-RECMSG*ŠDS.Lƒ0ZROMSG„DC.Bƒ'R:ZEROOUT'ZROMSGLƒEQU„*-ZROMSG*ŠDS.Lƒ0RSTMSG„DC.Bƒ'R:RECREATESAT'RSTMSGLƒEQU„*-RSTMSG*ŠDS.Lƒ0SEQMSG„DC.Bƒ'R:SETEQUAL'SEQMSGLƒEQU„*-SEQMSGŠDC.Bƒ'TOFILEKEYSIZE'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:GIVENEWVALUE'GNVMSGLƒEQU„*-GNVMSG*ŠDS.Lƒ0)RCVMSG„DC.Bƒ'RECOVERDELETEDFILE(Y/N)?'RCVMSGLƒEQU„*-RCVMSG*ŠDS.Lƒ0GNFMSG„DC.Bƒ'GIVENEWNAME'GNFMSGLƒEQU„*-GNFMSG*ŠDS.Lƒ0SFEMSG„DC.Bƒ'R:SETFILEEMPTY'SFEMSGLƒEQU„*-SFEMSG*ŠDS.Lƒ0/SWLMSG„DC.Bƒ'R:SWITCHTOUSINGBACKWARDLINKS'SWLMSGLƒEQU„*-SWLMSG*ŠDS.Lƒ0,UBOMSG„DC.Bƒ'R:USEBACKWARDFABLINKSONLY'UBOMSGLƒEQU„*-UBOMSG*ŠDS.Lƒ0FXLMSG„DC.Bƒ'R:FIXLINK'FXLMSGLƒEQU„*-FXLMSGŠPAGE**ˆIOERRORMESSAGES*ŠDS.Lƒ0 CRCMSG„DC.Bƒ'CRCERRORONREAD' 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'FORSATERRORATENDOFREPAIR(8BYTES)4PSNITM„EQU„*’4BYTEITEMNAMEASPARTOFDUMPHEADERŠDS.Lƒ1’4BYTEITEMNAMEPSNMSGLƒEQU„*-PSNMSGŠDS.Lƒ1’8BYTECOUNTFIELDPSNCML„EQU„*-PSNMSG*ŠDS.Lƒ0IOERMSGƒDC.Bƒ'IOERROR,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ƒ'ERRORFROMWRITE,STARTINGPSN=‚'WREPSN„DS.Lƒ2’PSNWREMSGLƒEQU„*-WREMSG*ŠDS.Lƒ0#PRTERMSƒDC.Bƒ'PRINTERERROR,‚D0='PRTERD0ƒDS.Lƒ2PRTERMSE‚EQU„*-1PRTERMSL‚EQU„*-PRTERMS*ŠDS.Lƒ0,PROTMSGƒDC.Bƒ'ERROR--DISKWRITEPROTECTED'PROTMSGL‚EQU„*-PROTMSGŠPAGE**ˆINITIALIZATIONERRORS*ŠDS.Lƒ0-ASGMSG„DC.Bƒ'UNABLETOASSIGNVOLUME-ERROR' ŠDC.Bƒ'‚'ASGMD0„DS.Lƒ2’D0ERRORCODEASGMSGLƒEQU„*-ASGMSG*ŠDS.Lƒ0IVDMSG„DC.Bƒ'INVALIDDEVICE'IVDMSGLƒEQU„*-IVDMSG*ŠDS.Lƒ0IERMSG„DC.Bƒ'INTERNALERROR'IERMSGCƒDC.Bƒ0’ERRORCODEIERMSGLƒEQU„*-IERMSG*ŠDS.Lƒ0LUNMSG„DC.Bƒ'CDFNOTASSIGNED'LUNMSGLƒEQU„*-LUNMSG*ŠDS.Lƒ0 FLUMSG„DC.Bƒ'FREELOGICALUNIT' FLULUN„DC.Bƒ1FLUMSGLƒEQU„*-FLUMSG*ŠDS.Lƒ0 COMMSG„DC.Bƒ'COMMANDLINEERROR'COMMSGLƒEQU„*-COMMSGŠPAGE*%*ˆABORT,TERMINATE,COMPLETION‚MESSAGES*ŠDS.Lƒ0BRKMSG„DC.Bƒ'BREAKKEY!-‚'*ABRTMSGƒDC.Bƒ'REPAIRABORTED'ABRTMSGL‚EQU„*-ABRTMSGBRKMSGLƒEQU„*-BRKMSG*ŠDS.Lƒ0TRMMSG„DC.Bƒ'REPAIRTERMINATED'TRMMSGLƒEQU„*-TRMMSG*ŠDS.Lƒ0-SEGMSG„DC.Bƒ'SEGMENTALLOCATIONERROR,D0=‚'SEGMD0„DS.Lƒ2’D0 ŠDC.Bƒ'‚SEG:'SEGMNM„DS.Lƒ1’SEGMENTNAMESEGMSGLƒEQU„*-SEGMSG*ŠDS.Lƒ0NDRMSG„DC.Bƒ'NODIRECTORIES'NDRMSGLƒEQU„*-NDRMSG*ŠDS.Lƒ0DOKMSG„DC.Bƒ'DISKOK'DOKMSGLƒEQU„*-DOKMSG*ŠDS.Lƒ0FOKMSG„DC.Bƒ'FILEOK'FOKMSGLƒEQU„*-FOKMSG*ŠDS.Lƒ0DNEMSG„DC.Bƒ'REPAIRCOMPLETED'DNEMSGLƒEQU„*-DNEMSGŠPAGE**ˆINPUTREQUESTS*ŠDS.Lƒ0UPDRQSTƒDC.Bƒ'UPDATE' UPDITM„DS.Lƒ1#UPDQMK„DC.Bƒ''=?AFTERVIDCHECKUPDRQSTL‚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*&*ˆERRORMESSAGESABOUTRESPONSEERRORS*ŠDS.Lƒ0OFSMSG„DC.Bƒ'OFFSETERROR'OFSMSGLƒEQU„*-OFSMSG*ŠDS.Lƒ0VALMSG„DC.Bƒ'VALUEERROR'VALMSGLƒEQU„*-VALMSG*ŠDS.Lƒ0PERMSG„DC.Bƒ'PSNERROR' PERMSGLƒEQU„*-PERMSG*ŠDS.Lƒ0WHTMSG„DC.Bƒ'INVALIDCOMMAND'WHTMSGLƒEQU„*-WHTMSG ŠDS…0:SYNTMSGƒDC.Bƒ'SYNTAXERROR-try‚?‚or‚H‚forhelpmessages'SYNTMSGL‚EQU„*-SYNTMSGŠPAGE*O*********************************************************************************ˆPARAMETERBLOCKS*O********************************************************************************4*ˆINPUTIOSPARAMETERBLOCK(CDFLUNASSIGNEDBYSCT)*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*ˆOUTPUTIOSPARAMETERBLOCK(LDFLUNASSIGNEDBYSCT)*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*ˆREPAIRVOLUMEIOSPARAMETERBLOCKFORREAD/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*#*ˆREPAIRVOLUMEFHSPARAMETERBLOCK*VOLFHS„DC.WƒFHASGN ŠDC.WƒFOPEREWŠDC.Bƒ0’STATUS ŠDC.BƒVOLLUNŠDC.Bƒ'„'VOLUMENAMEŠDS.Wƒ1ŠDC.Lƒ'„'CATALOG ŠDC.Lƒ'„'ŠDC.Lƒ'„'FILENAME ŠDC.Lƒ'„'ŠDC.Wƒ'‚'EXTENSIONŠDC.Wƒ0ŠDC.Wƒ0’READ/WRITECODESŠDS.Bƒ6**ˆPRINTERFHSPARAMETERBLOCK*PRTFHS„DC.WƒFHASGN ŠDC.WƒFOPEWŠDC.Bƒ0’STATUS ŠDC.BƒPRTLUN ŠDC.Lƒ'PR‚'ŠDC.Wƒ0ŠDC.Lƒ'„'CATALOGPART1ŠDC.Lƒ'„'CATALOGPART2ŠDC.Lƒ'„'FILENAMEPART1ŠDC.Lƒ'„'FILENAMEPART2 ŠDC.Wƒ'‚'EXTŠDC.Wƒ0ŠDC.Wƒ0’READ/WRITECODESŠDS.Bƒ6**ˆRETRIEVEPRINTERATTRIBUTES*PRTATR„DC.WƒFHRATTŠDC.Wƒ0ŠDC.Bƒ0 ŠDC.BƒPRTLUNŠDS.Bƒ34**ˆPRINTERERROR*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*ˆSEGMENTALLOCATION/DEALLOCATIONPARAMETERBLOCK*SEGPRB„DC.LƒTASKIDŠDC.Lƒ0&ŠDC.Wƒ1<<13ŽOPTIONS-LOGICAL=PHYSICALŠDC.Wƒ0’ATTRIBUTESŠDS.Lƒ1’SEGMENTNAMEŠDS.Lƒ1’LOGICALADDRESSŠDS.Lƒ1’LENGTHINBYTESŠDC.Lƒ0*(*ˆFETCHDEVICEMNEMONICSPARAMETERBLOCK*DEVMNE„DC.WƒFHFDMN ŠDC.WƒFOPFRARANDOM‚DEVICESONLY ŠDC.Wƒ0’NOLUŠDC.Lƒ0’VIDBUF.ŠDC.Lƒ256*2ŽUSEVIDBUF+SECBUFTOGETMNEMONICS*ŠPAGE* *ˆDIAGNOSTICTESTPATTERNINVID*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*œREPAIRFLAG1 *œBIT‡MEANING*ž0‡0-->NORMALSTATE'*¦1-->TERMINATEMESSAGEWASDISPLAYEDŠPAGE*O*********************************************************************************ˆPROGRAM…SECTION*O**********************************************************************************ˆINITIALIZATION***STARTPCƒEQU„*’STARTINGPCVALUEFORLOADER**ˆINITIALREGISTERCONTENTS:*/*ˆD7=BITMAPOFASSIGNEDLOGICALUNITNUMBERS**(*ˆDOSOMEINITIALIZATION-GETSTACKAND*ˆZEROUNINITIALIZEDDATA*ŠLEA„STACK(PC),A7‹SET-UPSTACK.ŠLEA„B(PC),A5‹BASEA5FORPOSITIONINDEPENDENT9ŠMOVEM.LD0-D7/A0-A1,INITREG-B(A5)SAVEINITIALREGISTERS2ŠMOVE.WD3,D1ŽCONVERTUSERNUMBERTOHEXANDSTORE!ŠLEA„USRNUM(PC),A0ŠWHERETOSTORE'ŠBSR„BIN2DECŒ2-BYTEBINARYTOASCIIHEXAŠMOVEM.LD4-D5,CATNAME-B(A5)SETUPDEFAULTCATALOGNAME‚12/03/84 ŠMOVEM.L(A5),D0-D1ˆVERSIONCODE/ŠMOVEM.LD0-D1,REPVERP-B(A5)PLACEINTOMESSAGEŠMOVEM.LD0-D1,TOFMSGP-B(A5)+ŠLEA„DATAUI(PC),A1ŠUNINITIALIZEDDATASTARTŠMOVE.W#DATAUIL,D1ˆLENGTHREP00…CLR.W‚(A1)+ŽZEROOUT ŠSUB.W‚#2,D1 ŠBNE„REP00** INITIALIZE PARAMETER BLOCKSŠLEA„INPBUF(PC),A0ŠLEA„INPBUFE(PC),A1"ŠMOVEM.LA0/A1,INPIOS+IOSSAD-B(A5)ŠLEA„PRTERMS(PC),A0ŠLEA„PRTERMSE(PC),A1"ŠMOVEM.LA0/A1,PRTIOE+IOSSAD-B(A5)ŠLEA„VIDBUF(PC),A0ŠMOVE.LA0,DEVMNE+FHSPTR-B(A5)* <*ˆCHECKTHATCDF/LDFAREASSIGNEDANDVOLLUN/PRTLUNAREFREE*6ŠMOVE.B#1,CPYFLG-B(A5)„TERMINALOUTPUTONLYINITIALLY+ŠBTSTƒ#LDFLUN,D7‰ISOUTPUTDEVICEASSIGNED?8ŠBEQ„KILLREP‹NO,KILLREPAIR-CAN'TEVENSENDERRORMSG**ˆSEND'REPAIRVER.REV'MSG*ŠLEA„REPVER(PC),A0ŠMOVE.L#REPVERL,D0 ŠBSR„SENDMSGS**ŠBTSTƒ#CDFLUN,D7‰ISINPUTDEVICEASSIGNED?ŠBEQ„ABRTR1NO,ABORTERROR1FŠMOVE.L#VOLLUN,D0CHECKTHATVOLUMELUNHASNOTBEENALREADYASSIGNED ŠBTSTƒD0,D7Ž.REPA2…BNE„ABRTR2ABORT8ŠMOVE.L#PRTLUN,D0‰CHECKPRINTLUNHASNOTBEENASSIGNED4ŠBTSTƒD0,D7Ž.(PRINTERISASSIGNEDONLYWHENNEEDED)ŠBNE„REPA2ŽABORTIFIT'SGONE*'*ˆCHECKCOMMANDLINE-CRTERMINATESIT*(ŠLEA„INPBUF(PC),A0ŠSTARTINGSCANADDRESS ŠBSR„PARSE9ŠMOVE.LA1,TEMP-B(A5)†SAVEOUTPUTFIELDPOINTERFORLATER$ŠROL.L‚#8,D0ŽCHECKPARSECALLSTATUS ŠTST.B‚D0‘.ŠBNE„ABRTR3ERROR%ŠROL.L‚#8,D0ŽCHECKINPUTFIELDSTATUS ŠTST.B‚D0‘.ŠBNE„ABRTR3ERROR&ŠROL.L‚#8,D0ŽCHECKOUTPUTFIELDSTATUS!ŠCMP.B‚#$40,D0Œ.‚NULLFIELDISOK ŠBEQ.S‚REP05 ŠTST.B‚D0ŠBNE„ABRTR3ERROR$ŠMOVE.B#2,CPYFLG-B(A5)„NOHARDCOPY%REP05…ROL.L‚#8,D0ŽCHECKOPTIONSFIELD9ŠMOVE.L#DEFOPT,D7‰SETDEFAULTOPTIONS-INTERACTIVEMODEŠCMP.B‚#$40,D0ŒNOOPTIONS? ŠBEQ„REP20ŽNOŠTST.B‚D0‘ERROR?ŠBNE„ABRTR3YESŠPAGE**ˆGETOPTIONS:NORCORRORK*"REP10…CLR.L‚D6‘FORFLAGCOMPARISON ŠBSR„OPTION1ŠCMP.B‚#$40,D0ŒAREWEDONESCANNINGOPTIONFIELD?ŠBEQ.S‚REP18ŽBRANCHIFYESŠMOVE.L#COPTION,D2#ŠCMP.B‚#'C',D1ŒWASTHISOPTION'C'?ŠBEQ.S‚REP15ŽBRANCHIFYESŠMOVE.L#ROPTION,D2#ŠCMP.B‚#'R',D1ŒWASTHISOPTION'R'?ŠBEQ.S‚REP15ŽBRANCHIFYESŠMOVE.L#KOPTION,D2#ŠCMP.B‚#'K',D1Œwasthisoption'K'?ŠBEQ.S‚REP15Žbranchifyes.ŠMOVE.L#NOPTION,D2#ŠCMP.B‚#'N',D1ŒWASTHISOPTION'N'?ŠBNE„ABRTR3ERRORIFNOT*REP15…BSETƒD2,D6/ŠBNE„ABRTR3BRANCHIFERROR(ALREADYSPECIFIED)*ŠCMP.B‚#'N',D1 ŠBNE.S‚REP16(ŠCLR.B‚D7‘SPECIALHANDLINGON'N'OPTION*ŠTST.L‚D1‘WAS'-'SPECIFIEDON'N'OPTION?ŠBPL.S‚REP10ŽBRANCHIFNOŠMOVE.B#DEFOPT,D7 ŠBRA.S‚REP10*$REP16…BSETƒD2,D7ŽSETREALOPTIONBITŠTST.L‚D1‘WASSIGNSPECIFIED?/ŠBPL.S‚REP10ŽBRANCHIFNO-GOFORMOREOPTIONS)ŠBCLRƒD2,D7ŽCLEARIF'-'OPTIONSPECIFIEDŠBRA.S‚REP10ŽGOFORNEXTOPTION REP18…EQU„*ŠBTSTƒ#COPTION,D7ˆC-OPTION?ŠBEQ.S‚REP20ŽNO5ŠBTSTƒ#ROPTION,D7ˆYES,THENCANNOTHAVEALSOR-OPTIONŠBNE„ABRTR3ERROR*$ŠBTSTƒ#KOPTION,D7ˆK-OPTION?„08/11/83ŠBEQ.S‚REP20ŽNO‹08/11/831ŠBTSTƒ#ROPTION,D7ˆYES,NOTALSOR-OPTION08/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,NOTALSOC-OPTION08/11/83ŠBNE„ABRTR3ERRORˆ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ŠCOMMANDLINEADDRESS ŠBSR„EDITFILEŠTST.L‚D0‘WASTHEREANERROR?ŠBMI„ABRTR3BRANCHIFYESŠLEA„B(PC),A5‹REBASEA5ŠMOVE.L#1,D2ŽFLAGDEVICENAME#ŠBTSTƒ#1,D0ŽWASITREALLYADEVICE?ŠBNE„REP89ŽBRANCHIFYESŠCLR.L‚D2‘FLAGVOLUMENAME"ŠBTSTƒ#21,D0WASUSER#SPECIFIED?ŠBEQ.S‚REP19ŽBRANCHIFNO5ŠMOVE.WFHSUSN(A6),D1†CONVERTUSERNUMBERTOASCII...*ŠLEA„USRNUM(PC),A0Š...FORCOMPARISONLATER ŠBSR„BIN2DEC(REP19…BTSTƒ#19,D0WASTHEREAFILENAME?ŠBEQ„REP90ŽBRANCHIFNOŠBSETƒ#FREPAIR,D7ˆSETFILEFLAGŠMOVE.LFHSCLG(A6),CATNAM-B(A5)#ŠMOVE.LFHSCLG+4(A6),CATNAM+4-B(A5)4ŠMOVE.LFHSFIL(A6),FILNAM-B(A5)†SETUPFILEREPAIR-;ŠMOVE.LFHSFIL+4(A6),FILNAM+4-B(A5)‚FILENAMEANDEXTENSIONŠMOVE.WFHSEXT(A6),EXTNAM-B(A5)ŠMOVE.L#'„',FHSCLG(A6)ŠMOVE.L#'„',FHSCLG+4(A6)@ŠMOVE.L#'„',FHSFIL(A6)BLANKOUTFILENAMESOONLYVOLASSIGNEDŠMOVE.L#'„',FHSFIL+4(A6)ŠMOVE.W#'‚',FHSEXT(A6) ŠBTSTƒ#0,D0$ŠBNE„ABRTR3BRANCHIF'/'TERMINATOR%ŠBTSTƒ#18,D0WASEXTENSIONSPECIFIED?ŠBEQ„ABRTR3BRANCHIFNO ŠBRA.S‚REP90%*************************************F* SUBROUTINE TO PUT DEFAULT VALUES INTO FHS PARAMETER BLOCK POINTED TO*ƒBYA6.*DEFAULTS‚EQU„* <ŠMOVE.WUSERNUM+2-B(A5),FHSUSN(A6)DEFAULTUSERNUM‰12/04/844ŠMOVE.LVOLNAM-B(A5),FHSVOL(A6)‚VOLUMENAME12/04/846ŠMOVE.LCATNAME-B(A5),FHSCLG(A6)CATALOGNAME12/04/84BŠMOVE.LCATNAME+4-B(A5),FHSCLG+4(A6)2NDPARTOFCATNAMEƒ12/04/84ŠRTSŠPAGE*6*ˆFETCHDEVICEMNEMONICSTOSEEIFDEVICEKNOWNANDOK*,REP89…FHSCALLDEVMNE(PC)ˆRANDOMDEVICESONLY ŠBNE„IOERR/ŠMOVE.LDEVMNE+FHSLEN-B(A5),D3ƒGET#OFENTRIES ŠMOVE.WDEVMNE+FHSLEN-B(A5),D1ƒ. ŠBEQ.S‚REPA45ŠMOVE.LDEVMNE+FHSPTR-B(A5),A0ƒSEARCHFORDEVICENAME ŠMOVE.LFHSVOL+VOLFHS-B(A5),D0ƒ.REP891„CMP.L‚(A0)+,D0 ŠBNE.S‚REP892&ŠTST.L‚(A0)CHECKIFVOLUMENAMEGIVEN ŠBEQ.S‚REP90ŽNO,‚USEDEVICENAME@ŠMOVE.L(A0),FHSVOL+VOLFHS-B(A5)YES,USEVOLUMENAMEFORASSIGN ŠBRA.S‚REP90#REP892„ADD.L‚#6,A0ŽCHECKNEXTENTRY ŠSUB.W‚#1,D1 ŠBNE„REP891 ŠMOVE.WD3,D0ŠSWAPƒD3)ŠCMP.W‚D0,D3ŽDIDN'TGETALLDEVICENAMES?)REPA4…BEQ„ABRTR4YES,INVALIDDEVICENAMECŠBRA„ABRTR5NO,BUFFERTOOSMALL,MAYBETHEGIVENDEVICEDIDN'TFIT*(*ˆASSIGNVOLUMEFOREXCLUSIVEREAD/WRITE* REP90…EQU„*<*BLANKOUTEVERYTHINGEXCEPTVOLUMENAMEFORVOLASSIGNMENTŠ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)ŠFHSCALLVOLFHS(PC)ŠBEQ.S‚REP95ŽIOERROR?*-*ˆUNABLETOASSIGNVOLUMEDUETOERROR-QUIT*0ŠLEA„ASGMD0(PC),A0ŠSETERRORSTATUSINTOMESSAGEŠMOVE.LD0,D1Ž.*ŠBSR„BIN4HEXŒ.CONVERT‚ERRORSTATUSTOHEX!ŠLEA„ASGMSG(PC),A0ŠSENDERRORMSGŠMOVE.L#ASGMSGL,D0ˆ. ŠBRA„ABORTXX* *ˆRETRIEVEDISKATTRIBUTES:MPSN*.REP95…MOVE.W#FHRATT,FHSCMD(A0)GETATTRIBUTES ŠFHSCALL(A0) ŠBNE„IOERR3ŠMOVE.LFHSSIZ(A0),MPSN-B(A5)SAVE‚LASTPSN‚ONDISKŠSUB.L‚#1,MPSN-B(A5)†.*<*ˆSET-UPREGISTER(S)FORREMAININGREPAIRSTEPS(D7=OPTIONS)*ŠMOVE.L#256,D6ŒSECTORSIZEŠPAGE*,*ˆPROCESSOUTPUTFIELD-FLAGFORHARDCOPY?*0ŠCMP.B‚#1,CPYFLG-B(A5)„ANYTHINGINOUTPUTFIELD?7ŠBEQ.S‚CHECKKNO-GOSTART1STSTEPOFREPAIR:VIDCHK-ŠMOVE.LTEMP-B(A5),A0ŒADDRESSOFOUTPUTFIELD"ŠLEA„PRTFHS(PC),A6ŠPARAMETERBLOCK ŠBSR„EDITFILEŠBMI.S‚ABRTR3BRANCHIFERROR&ŠBTSTƒ#1,D0ŽWASOUTPUTFIELDADEVICE?"ŠBEQ.S‚ABRTR3BRANCHIFNO-ERROR&ŠCLR.B‚CPYFLG-B(A5)‡FLAGFORHARDCOPY**ˆASSIGNPRINTER* REP96…EQU„*ŠFHSCALLPRTFHS(PC)ˆASSIGN ŠBNE.S‚IOERR**ˆGETPRINTERATTRIBUTES*ŠFHSCALLPRTATR(PC) ŠBNE.S‚IOERR3ŠMOVE.BFHSSIZ+3+PRTATR-B(A5),D0GETMAXLINECOUNTŠSUB.B‚#6,D0ŽLEAVEMARGINSŠMOVE.BD0,MAXLINES-B(A5)"ŠSUB.B‚#1,D0ŽSTARTWITHPAGEEJECTŠMOVE.BD0,LINECNT-B(A5)*0*‰IF'K'OPTION,GODELETEEMPTYDATASTRUCTURES*?*‰The'K'optionisanondocumentedoptionintendedtobeused*‰fortestpurposesonly.*0CHECKK:ƒBTSTƒ#KOPTION,D7ˆ'K'OPTIONON?‚08/11/83ŠBEQ.S‚DOITNOŽ08/11/835ŠBRA„DELEMPTŒYES,GODELETEEMPTYSTRUCTURES.8/11/835DOIT†BRA‡VIDCHCK‰GOSTART1STSTEPOFREPAIR:VIDCHK*"*œSTARTEDITINGWITHTHEVIDCHECK*B*ˆABORTREPAIR(BEFOREVIDCHECK)-SENDAPPROPRIATEERRORMESSAGE*-ABRTR1„MOVE.L#LUNMSGL,D0ˆCDFLUNNOTASSIGNEDŠLEA„LUNMSG(PC),A0ŠBRA.S‚ABORTXX.ABRTR2„OR.Bƒ#$30,D0ŒSETASCIILUNINTOMESSAGEŠMOVE.BD0,FLULUN-B(A5)6ŠMOVE.L#FLUMSGL,D0ˆSENDMESSAGEABOUTUNAVAILABLELUNŠLEA„FLUMSG(PC),A0ŠBRA.S‚ABORTXX,ABRTR3„MOVE.L#COMMSGL,D0ˆCOMMANDLINEERRORŠLEA„COMMSG(PC),A0ŠBRA.S‚ABORTXX(ABRTR4„MOVE.L#IVDMSGL,D0ˆINVALIDDEVICEŠLEA„IVDMSG(PC),A0ŠBRA.S‚ABORTXX1ABRTR5„MOVE.B#'1',IERMSGC-B(A5)INTERNALERROR1;ŠMOVE.L#IERMSGL,D0ˆRANDOMDEVICEMNEMONICBUFFERTOOSMALLŠLEA„IERMSG(PC),A0* ABORTXXƒEQU„* ŠBSR„SENDMSGS ŠBRA„KILLREP**ˆIOERRORABORT* IOERR…EQU„*ŠMOVE.B#1,KILL-B(A5)ŠBSR„IOERMSSENDERRORMESSAGE*ABORTREP‚EQU„*"ŠLEA„ABRTMSG(PC),A0‰SENDABORT-MSGŠMOVE.L#ABRTMSGL,D0 ŠBSR„SENDMSGS ŠBRA„KILLREPŠPAGE**ˆTERMINATEREPAIR* TRMREP„EQU„*#ŠLEA„TRMMSG(PC),A0ŠTERMINATEREPAIRŠMOVE.L#TRMMSGL,D0‰BSETW…#0,R_FLAG1-B(A5) &*œSETFLAGTERMINATEMESSAGEDISPLAYED ŠBSR„SENDMSGS* *ˆREPAIRDONE*REPDONE*.*ˆCHECKIFNEEDTOUPDATEANYTHINGONTHEDISK:*ˆIGNOREWRITEERRORSFORNOW-ONLYERRORMESSAGEISSENT*EXIT:‰BTST†#COPTION,D7 ‰BNE‡DONEREPA*œJMPIFCOPTIONSPECIFIED/ŠMOVE.B#1,KILL-B(A5)†SETTERMINATEREPAIRFLAGŠTST.B‚VIDFLG-B(A5)‡UPDATEVID?ŠBEQ.S‚EXITR0NOŠLEA„VIDBUF(PC),A1ŠYES ŠCLR.L‚D1 ŠMOVE.L#1,D2 ŠBSR„WRITSEC0EXITR0„TST.B‚SECFLG-B(A5)‡SECTORBUFFERCHANGED?ŠBEQ.S‚EXITR1NO*ŠMOVE.LPSNSEC-B(A5),D1„YES,UPDATESECTORŠMOVE.L#1,D2Ž.ŠLEA„SECBUF(PC),A1ŠBSR„WRITSECŒWRITE EXITR1„EQU„*ŠTST.B‚SATFLG-B(A5)‡UPDATESAT?ŠBEQ.S‚EXITR2NO"ŠMOVE.LVIDBUF+VIDSAT-B(A5),D1ƒYES ŠCLR.L‚D2ŠMOVE.WVIDBUF+VIDSAL-B(A5),D2ŠMOVE.LSATABUF-B(A5),A1ŠBTSTƒ#RCRSAT,D7‰RECREATESAT?0ŠBNE.S‚EXITR1SŒYES,WRITENEWSATBUFFERTODISK9ŠMOVE.LSATDBUF-B(A5),A1ƒNO,WRITEOLDSATBUFFERTODISKEXITR1SƒBSR„WRITSEC/EXITR2„EQU„*’makesuretheSATsegisallocated-ŠTST.B‚SATSGFLG-B(A5)…beforetryingtodeleteŠBEQ.S‚NOSATSGŠMOVE.L#SATSEG,D0 ŠBSR„DELSEG&NOSATSGƒTST.B‚SDBFLG-B(A5)‡UPDATESDB?ŠBEQ.S‚EXITR3NO0ŠMOVE.LPSNSDB-B(A5),D1„YES,GETCURRENTSDBPSNŠMOVE.L#SDBSZE,D2ŠLEA„SDBBUF(PC),A1 ŠBSR„WRITSEC EXITR3„EQU„*ŠTST.B‚PDBFLG-B(A5)‡UPDATEPDB?ŠBEQ.S‚EXITR4NO0ŠMOVE.LPSNPDB-B(A5),D1„YES,GETCURRENTPDBPSNŠMOVE.L#PDBSZE,D2ŠLEA„PDBBUF(PC),A1 ŠBSR„WRITSEC EXITR4„EQU„*ŠTST.B‚FABFLG-B(A5)‡UPDATEFAB?ŠBEQ.S‚EXITR5NOŠMOVE.LPSNFAB-B(A5),D1ŠMOVE.LFABLEN-B(A5),D2ŠMOVE.LFABBUF-B(A5),A1 ŠBSR„WRITSEC EXITR5„EQU„*ŠTST.B‚DBFLG-B(A5)ˆUPDATEDB?ŠBEQ.S‚DELEMPTŒNOŠMOVE.LPSNDB-B(A5),D1ŠMOVE.LDBLEN-B(A5),D2ŠMOVE.LDBBUF-B(A5),A1 ŠBSR„WRITSEC DELEMPTƒEQU„* DONEREPA:?ŠBTSTW…#0,R_FLAG1-B(A5)Ifterminatemessageallreadydisplayed5ŠBNE.S…KILLREPŠ'REPAIRCOMPLETED'messageisommitted*3ŠBTST†#COPTION,D7…Donotdeleteemptiesif‚CoptionŠBNE.S…SNDNMSG6ŠBTST†#FREPAIR,D7…DonotdeleteemptiesiffilerepairŠBNE.S…SNDNMSG5ŠBSR‡CLEANUP‰Deleteemptydirectorystructuresifany2SNDNMSGƒLEA‡DNEMSG(PC),A0‡print'REPAIRCOMPLETED'ŠMOVE.L„#DNEMSGL,D0 ŠBSR‡SENDMSGS*œOUTPUTREPAIRDONEMESSAGEKILLREPƒERQ.TERM‚*(PC)ŒGETOUTŠPAGEO*********************************************************************************ˆVID„CHECKƒSTEP*O********************************************************************************/*ˆREGISTERUSAGEDURINGREMAININGREPAIRSTEPS:*/*’D7.B=0IFNONINTERACTIVEMODE(N-OPTIONON)&*™1IFINTERACTIVEMODE(N-OPTIONOFF)!*’D7.W-BIT15ON=>C-OPTIONON* OFF=>NOC-OPTION2*™BIT14ON=>RECREATESAT(IGNORESATFROMDISK)* OFF=>USESATFROMDISK*™BIT13ON=>K-OPTIONON* OFF=>NOK-OPTION)*’D7.LBITS28-16‚AREUSEDTOTURNOFFIM*—BIT290=>FILENOTFOUND(*ž1=>FILEFOUNDFORFILEREPAIR(QUIT)*—BIT300=>NOR-OPTION*ž1=>R-OPTIONON6*—BIT310=>NOFILENAMEINCMDLINE(VOLUMEREPAIR)/*ž1=>FILEREPAIR(FILENAMEGIVENINCMDLINE)*’D6=256,SECTORSIZE**VIDCHCK:‚EQU„**7*ˆSEND'VIDCHECK'MESSAGETOUSER(UNLESSFILEREPAIR)*%ŠBTSTƒ#FREPAIR,D7ˆSKIPIFFILEREPAIR ŠBNE.S‚VIDCH0%ŠLEA„VIDMSG(PC),A0ŠSENDVIDCHECKMSGŠMOVE.L#VIDMSGL,D0 ŠBSR„SENDMSGS*>*ˆSETUPDATEBOUNDS-ANYSECTORONDISKCANBEUPDATEDDURING *ˆVIDCHECK*VIDCH0„CLR.L‚D1;ŠMOVE.LD1,UPDSTR-B(A5)„SETUPDATEPSNBOUNDS(LOWERBOUND)+ŠMOVE.LMPSN-B(A5),UPDEND-B(A5)‚UPPERBOUND=ŠADD.L‚#1,UPDEND-B(A5)„.PSNOFSECTORTHATCANNOTBEUPDATED*0*ˆREADINVID-ALWAYSSECTOR0,ONESECTORONLY*(ŠLEA„VIDBUF(PC),A1ŠSECTORBUFFERFORVIDŠCLR.L‚D1‘PSN=0FORVID ŠMOVE.L#1,D2ŽONESECTORTOREADŠMOVE.L#'VID',IOERITM-B(A5)ŠBSR„GETSECREADINVIDŠBEQ.S‚VIDC00NOIOERRORS.ŠBTSTƒ#FREPAIR,D7ˆIFFILEREPAIRQUITONERROR ŠBNE„ABORTREPŠTST.B‚D0‘WASITCRCERROR?/ŠBNE„ABORTREP‹NO,OTHERIOERROR(ABORTREPAIR)7ŠMOVE.B#1,VIDFLG-B(A5)„REWRITEVID-COULDCLEARERRORŠPAGE**ˆTESTVERSADOSDISK* GVIDC00„CMP.L‚#MACSCDE1,VIDMAC+VIDBUF-B(A5)ISVOLUMEAVERSADOSVOLUME?ŠBNE.S‚VIDC01.&ŠCMP.L‚#MACSCDE2,VIDMAC+4+VIDBUF-B(A5)ŠBEQ.S‚VIDC04YES5VIDC01„CLR.B‚VIDFLG-B(A5)‡NO,SENDWRONGDISKMESSAGEŠLEA„WRDMSG(PC),A0ŠMOVE.L#WRDMSGL,D0ˆ.!ŠBSR„SENDMSQC‹QUITIFC-OPTIONON%ŠBTSTƒ#FREPAIR,D7ˆQUITIFFILEREPAIR ŠBNE„TRMREP.3ŠBSR„REPAIRELSEASKIFUSERWANTSTOREPAIRANYWAYŠBNE„KILLREPŒNO,QUIT=ŠMOVE.B#1,VIDFLG-B(A5)„YES,UPDATEVID-FORCEVERSADOSCODE*1*ˆIFFILEREPAIRSKIPCODETILL'GETSATBUFFERS'&*ˆIFINIMDUMPVIDANDREQUESTUPDATE$*ˆIFINNIMGODIRECTLYTOVIDCHECK*$VIDC04„BTSTƒ#FREPAIR,D7ˆFILEREPAIR?4ŠBNE„VIDC60YES,SKIPVIDSTUFF-GOGETSATBUFFERS ŠBSR„IM‘IM?:ŠBNE„VIDC40ˆNO,NIMORC-OPTION‚-GOCHECKVIDINFORMATION+VIDC05„MOVE.L#'VID',PSNITM-B(A5)DUMPVID ŠBSR„DUMPSC7VIDC10:ƒMOVE.L#'VID',UPDITM-B(A5)LOADUPDATEMESSAGEŠMOVE.B#'?',UPDQMK-B(A5)ŠBSR„UPDATEREQUESTUPDATE*ŠDC.LƒVIDC35-B‹CRŠDC.LƒVIDC35-B‹NŠDC.LƒVIDC15-B‹RNOTALLOWEDŠDC.LƒVIDC15-B‹DNOTALLOWEDŠDC.LƒVIDC15-B‹ANOTALLOWED!ŠDC.LƒTRMREP-B‹QTERMINATEREPAIR'ŠDC.LƒVIDC20-B‹$PSNDUMP/UPDATESECTORSŠDC.LƒVIDC21-B‹$‚DUMPVID$ŠDC.LƒVIDC15-B‹DUMPMUSTBEINRANGEŠDC.LƒVIDC15-B‹DPSN.N‚N/AŠDC.LƒVIDC15-B‹APSN.N‚N/A"ŠDC.LƒVIDC15-B‹OFFSET-UPDATEVIDŠDC.LƒVIDC31-B‹C"ŠDC.LƒVIDSHL-B‹?‚HELP‚-shortlist!ŠDC.LƒVIDLHL-B‹H‚HELP‚-long‚listŠPAGEO*******************************************************************************D*‰PRINTSHORTHELPCOMMANDLISTJUSTABOVETHEREPRINTOFTHESCREEN9*‰BEINGSHOWNPRIORTOTHEUSERASKINGFORSHORTHELP(?) VIDSHL:ƒEQU„*<ŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofmessages8ŠLEA„HLPSMSG(PC),A1…Pointtostartofshorthelpmessage.ŠMOVE.L#HLPSMSGL,D2‡providelengthofmessage#ŠBRA.S‚VIDGOHgorefreshthescreen  **ˆPRINTLONGHELPMESSAGES VIDLHL:ƒEQU„*AŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofhelpmessages%ŠLEA„HLPLMSG(PC),A1…startofmessages'ŠMOVE.L#HLPLMSGL,D2‡lengthofmessages;VIDGOH„BSR„GETHELPŒprinthelpmessagesandacceptresponse. 1*‰RETURNTOTHEPOINTATWHICHHELPWASREQUESTED5ŠCLR.L‚D1‘IndicatefirstPSNtodumptoscreen-(0)5ŠCLR.L‚D2‘Offsetforstartingbytefromwhichtodump5ŠLEA„VIDBUF(PC),A1ŠIndicatebufferfromwhichtodump!ŠBRA„VIDC05Gorefreshthescreen *ˆRESPONSENOTACCEPTABLE*&VIDC15„BSR„RESPNASENDMESSAGETOUSERŠBRA„VIDC10TRYAGAIN*-*ˆREQUESTEDUPDATE/DUMP‚OTHERTHANVIDSECTOR*&VIDC20„TST.L‚D1‘UPDATEVIDIFPSN=0?ŠBEQ.S‚VIDC25YESCŠMOVE.L#'„',PSNITM-B(A5)NO,READANDUPDATEORPRINTOTHERSEC(S) ŠBSR„UPDSEC ŠBRA„VIDC10CONTINUEUPDATELOOP**ˆREQUESTEDDUMPVID*VIDC21„CLR.L‚D1‘PSN=0FORVIDŠMOVE.L#1,D2ŽONESECTORŠBSETƒ#31,D2FLAGDUMP*"*ˆREQUESTEDUPDATE/DUMPVIDSECTOR*'VIDC25„TST.L‚D2‘NEED‚ONLYTOPRINTVID?ŠLEA„VIDBUF(PC),A1ŠBMI.S‚VIDC30YES,GOPRINTVID8ŠLEA„(A1,D6),A2‰NO,UPDATE-GETENDADDRESSFORUPDATES)ŠBSR„UPDBUFUPDATEANYPARTOFVIDBUFFER+ŠMOVE.B#1,VIDFLG-B(A5)„SETVIDUPDATEFLAG#ŠBRA„VIDC10GOCONTINUEUPDATELOOPVIDC30„BCLRƒ#31,D2*ŠSUB.L‚#1,D2ŽPRINTONLYONESECTORFORVIDŠBEQ„VIDC05OKŠBRA„VIDC15BADRESPONSE**ˆ'C'*+VIDC31„BSETƒ#COPTION,D7ŒSETCHECKONLYMODE ŠCLR.B‚D7**ˆ'N'RESPONSE *ˆCRRESPONSE?*ˆENDOFUPDATELOOP:WRITEANYUPDATEDSECTORINSECTORBUFFER *ˆTODISK.*:VIDC35„TST.B‚SECFLG-B(A5)‡UPDATEDSECTORINSECTORBUFFER?*ŠBEQ.S‚VIDC40NO,GOCHECKVIDINFORMATION-ŠMOVE.LPSNSEC-B(A5),D1„YES,GETSECTOR'SPSN4ŠCLR.B‚SECFLG-B(A5)‡RESETSECTORBUFFERFLAGANDPSNŠCLR.L‚PSNSEC-B(A5)‡.&ŠMOVE.L#1,D2ŽWRITEONESECTORTODISK(ŠLEA„SECBUF(PC),A1ŠSECTORBUFFERADDRESSŠMOVE.L#'SEC.',IOERITM-B(A5)1ŠBSR„WRITSECŒWRITETODISK-IGNOREERRORFORNOWŠPAGE**ˆCHECKVIDINFORMATION** VIDC40„EQU„**?*ˆCHECKVOLUMEIDOK-FIRSTCHARACTERMUSTBEALPHABETIC,REST*ˆALPHANUMERIC*ŠLEA„VIDBUF(PC),A1 0ŠMOVE.L#VIDVOL,D2‰OFFSETFORVOLUMENAMEINVID ŠMOVE.L#4,D3ŽVOLUMENAMELENGTH3ŠLEA„VOLNMSG(PC),A0‰.ERRORMESSAGEINCASENEEDITŠMOVE.L#VOLNMSGL,D0‡.6ŠBSR„NAMECKŒCHECKVALIDNAME‚-CORRECTIFERRORSFOUNDŠBEQ.S‚VIDC41OK*ŠMOVE.B#1,VIDFLG-B(A5)„ERROR,UPDATEDVIDŠBRA„VIDC40CHECKAGAIN**ˆCHECKVOLUMEDESCRIPTORASCII*/VIDC41„MOVE.L#VIDVD,D2ŠOFFSETFORFIELDINVIDŠMOVE.L#20,D3FIELDLENGTH1ŠLEA„VOLDMSG(PC),A0‰ERRORMESSAGEINCASENEEDITŠMOVE.L#VOLDMSGL,D0‡.;ŠBSR„CHKASC†CHECKITISASCII‚-‚CORRECTIFERRORSAREFOUNDŠBEQ.S‚VIDC42OK#ŠMOVE.B#1,VIDFLG-B(A5)„UPDATEDVIDŠBRA„VIDC41CHECKAGAIN*#*ˆCHECKSATLENGTHOKFORDISKSIZE*VIDC42„CLR.L‚D2ŠMOVE.WVIDSAL(A1),D27ŠMOVE.L#8,D3ŽCALCULATEHOWMANYSECTORSNEEDEDFORSAT9ŠMULUƒD6,D3‹D3=#OFSECTORSSUPPORTEDBYONESATSECTOR/ŠMOVE.LMPSN-B(A5),D1†D1=#OFSECTORSONDISKŠADD.L‚#1,D1Ž.+ŠDIVUƒD3,D1ŽSEEHOWMANYSATSECTORSNEEDED ŠCLR.L‚D0'ŠMOVE.WD1,D0ŽD0=MINIMUM#OFSECTORS+ŠSWAPƒD1‘MAYNEEDONEMOREIFHADREMAINDER ŠTST.W‚D1‘.ŠBEQ.S‚VIDC45NOREMAINDER&ŠSUB.W‚D1,D3ŽGET#OFSECTORSTOOMANYŠMOVE.WD3,D1Ž.!ŠADD.L‚#1,D0ŽNEEDONEMORESECTORJVIDC45„MOVE.WD1,NOSEC-B(A5)‚SAVEEXTRASECSTHATHAVETOBEMARKEDINSAT:ŠCMP.L‚D2,D0‹VID'SSATLENGTHMUSTEQUALCALCULATEDLENGTHŠBNE„VIDC70ERROR*,*ˆCHECKSATPSNREASONABLE(D2=SATLENGTH)*'VIDC46„MOVE.LVIDSAT(A1),D1†GETSATPSN)ŠBEQ„VIDC80ERRORIFSAMEASFORVID(=0)(ŠBSR„MPSNCŽCHECKALLSATSECTORSONDISKŠBHI„VIDC80ERROR**ˆCHECKSDBPSNREASONABLE*9VIDC47„MOVE.LD1,D3ŽGETSATPSNBOUNDS,D3=STARTINGPSNŠADD.L‚D3,D2Ž.ŠSUB.L‚#1,D2Ž.!ŠMOVE.LD2,D4ŽANDD4=ENDINGPSN!ŠMOVE.LVIDSDS(A1),D1†GETSDBPSN'ŠBEQ.S‚VIDC500ŒNODIRECTORIES‚ISOKTOO2ŠMOVE.L#SDBSZE,D2‰CHECKALLSDBSECTOR(S)ONDISK ŠBSR„MPSNCŽ.ŠBHI.S‚VIDC49ERRORŠADD.L‚D1,D2ŽGETENDINGSDBPSNŠSUB.L‚#1,D2Ž.-ŠCMP.L‚D3,D1ŽCHECKSATANDSDBDONOTOVERLAP ŠBLT.S‚VIDC48ŠBEQ.S‚VIDC49ERROR ŠCMP.L‚D4,D1ŠBHI.S‚VIDC500ŒOKŠBRA.S‚VIDC49ERRORVIDC48„CMP.L‚D2,D3ŠBLE.S‚VIDC49ERROR ŠCMP.L‚D4,D2ŠBHI.S‚VIDC500VIDC49„BRA„VIDC90**ˆCHECKTESTPATTERN*VIDC500ƒLEA„VIDDTP(A1),A0ŠLEA„TESTPRN(PC),A2ŠMOVE.L#64/4,D0VIDC505ƒCMP.L‚(A2)+,(A0)+ŠBNE.S‚VIDE00NOTSAME ŠSUB.L‚#1,D0 ŠBNE„VIDC505ŠBRA.S‚VIDC510ŒOK'VIDE00„LEA„VIDDTP(A1),A2†OKIFALLZEROŠMOVE.L#64/4,D0VIDE05„TST.L‚(A2)+ŠBNE.S‚VIDE10NOTOK ŠSUB.L‚#1,D0 ŠBNE„VIDE05ŠBRA.S‚VIDC510ŒOK)VIDE10„LEA„BTPMSG(PC),A0ŠBADTESTPATTERNŠMOVE.L#BTPMSGL,D0 ŠBSR„SENDMSQCŠBSR„REPAIRFIX?ŠBNE„TRMREPNOŠ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**(*ˆCHECKNOPDBLIST(RESERVEDFIELDNOW)*VIDC50„LEA„VIDBUF+VIDPDL(PC),A2 ŠMOVE.L#4,D1ŠMOVE.L#'PDBL',RESITM-B(A5) ŠBSR„RSVCHKŠBEQ.S‚VIDC55OK/ŠBMI„TRMREPQUITIFUSERDOESN'TWANTTOREPAIR,ŠMOVE.B#1,VIDFLG-B(A5)„CHANGEDFIELDINVID**ˆCHECKRESERVEDSPACEZERO*VIDC55„LEA„VIDRS1(A1),A2ŠMOVE.L#VIDRS1L,D1ŠMOVE.L#'VID',RESITM-B(A5)AŠBSR„RSVCHK‚CHECKANDREPAIRIFNECESSARY(QUITIFNOTCORRECTED)ŠBEQ.S‚VIDC56OK/ŠBMI„TRMREPQUITIFUSERDOESN'TWANTTOREPAIR(ŠMOVE.B#1,VIDFLG-B(A5)„FLAGVIDUPDATED**ˆCHECKSUMOK?*VIDC510ƒMOVE.LA1,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‚VIDC50OK)VIDC540ƒLEA„CHSMSG(PC),A0†CHECKSUMERROR ŠMOVE.LD0,D1ŠMOVE.L#CHSMSGL,D0 ŠBSR„SENDMSQCŠBSR„IM‘Interactivemode?3ŠBNE.S‚VIDC543ŒNo...don'taskpermissiontocorrect'ŠBSR„REPAIRYes..askifoktofix‚(Y/N)&ŠBNE„VIDC50Branchifresponsewas'N'VIDC543ƒCLR.W‚VIDCHK(A1) ŠMOVE.LA1,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.BD0,VIDCHK(A1)†UPDATE ŠSWAPƒD0ŠMOVE.BD0,VIDCHK+1(A1)ŠMOVE.B#1,VIDFLG-B(A5)**ˆEVERYTHINGLOOKSOK7*ˆFORCEVERSADOSCODEINTOVID,ZEROOUTRESERVEDSPACE3*ˆANDWRITEVIDTODISKUNLESSNOCHANGEINDICATED.**VIDC56„LEA„VIDBUF(PC),A1ŠVIDSECTORBUFFER&ŠTST.B‚VIDFLG-B(A5)‡VIDTOBECHANGED?ŠBEQ.S‚VIDC60NO/ŠCLR.B‚VIDFLG-B(A5)‡YES-WRITEITBACKTODISK9ŠMOVE.L#MACSCDE1,VIDMAC(A1)FORCEVERSADOSCODEINTOVID ŠMOVE.L#MACSCDE2,VIDMAC+4(A1).%ŠCLR.L‚D1‘WRITEVIDTODISK(PSN=0)#ŠMOVE.L#1,D2Ž.ONESECTORTOWRITEŠMOVE.L#'VID',IOERITM-B(A5)ŠBSR„WRITSECŒWRITEVID&ŠBNE„ABORTREP‹TERMINATEIFWRITEERROR*.*ˆALLOCATE2SATBUFFERSACCORDINGTOSATSIZE*VIDC60„CLR.L‚D2%ŠMOVE.WVIDSAL(A1),D2†SATSECTORSIZEŠMULUƒD6,D2ŽGETBYTECOUNT"ŠMOVE.LD2,D1Ž.ALLOCATE2BUFFERSŠLSL.L‚#1,D1Ž.ŠMOVE.L#SATSEG,D0‰SEGMENTNAMEŠBSR„GETSEGGETSEGMENT4ŠMOVE.LA1,SATABUF-B(A5)ƒSAVESATSTARTINGADDRESSESŠADD.L‚D2,A1Ž.ŠMOVE.LA1,SATDBUF-B(A5)ƒ.BŠMOVE.B#1,SATSGFLG-B(A5)‚indicateSATsegmentallocatedinmemoryEŠADD.L‚D2,A1SETALSOFAB/DATABLOCKSEGMENTSTARTINGLOGICALADDRESSŠSPC„2ŠPAGE*"*‚CONFIGURATIONAREAPOINTERCHECK*ECFGAPT:ƒLEA.L‚VIDBUF(PC),A1†Iftheconfigurationareastartingsector<ŠTST.L‚VIDCAS(A1)‰addressiszero,thereisnoconfiguration,ŠBEQ„SATCHKareasoskiptheCFGAcheckstepŠSPC„29ŠTST.B‚VIDCAL(A1)‰Iftheconfigurationarealengthisnot4ŠBNE„CFGACHKŒzero,proceedwiththeCFGAcheckstep.ŠSPC„2>ŠLEA.L‚CFGALER(PC),A0…Issueanerrormessageforazerolength6ŠMOVE.L#CFGALERL,D0‡configurationareaandterminate. ŠBSR„SENDMSGS ŠBRA„ABORTREPŠPAGE*)*ˆSATLENGTH‚ERROR,EITHERFIXITORQUIT*6VIDC70„MOVE.WD2,D1ŽVALUETOBECONVERTEDTOASCIIHEX1ŠLEA„SATLEL(PC),A0†WHERETOPLACECONVERTEDVALUE ŠBSR„BIN2HEX ŠMOVE.WD0,D2ŽSAVEPROPERLENGTH#ŠLEA„SATLER(PC),A0†SATLENGTHERRORŠMOVE.L#SATLERL,D0 ŠBSR„SENDMSQC+ŠLEA„RECMSG(PC),A0†SENDRECALCULATEMESSAGEŠMOVE.L#RECMSGL,D0ˆ. ŠBSR„SENDMSQC(ŠBEQ.S‚VIDC71INNIMFORCEPROPERLENGTH*ŠBSR„REPAIRFORCERECALCULATEDSATLENGTH? ŠBNE„TRMREPNO,TERMINATEREPAIR8VIDC71„MOVE.WD2,VIDSAL+VIDBUF-B(A5)FORCEPROPERLENGTH(ŠMOVE.B#1,VIDFLG-B(A5)„FLAGVIDCHANGEDŠBRA„VIDC46CONTINUE*/*ˆSATPSNERROR,GETNEWPSNINIM,QUITINNIM* VIDC80„EQU„*7ŠLEA„STPPSN(PC),A0ŠWHERETODEPOSITCONVERTEDASCIIHEX ŠBSR„BIN4HEXŒCONVERTANDDEPOSIT%ŠLEA„STPMSG(PC),A0ŠSENDERRORMESSAGEŠMOVE.L#STPMSGL,D0 ŠBSR„SENDMSQC0ŠBEQ„TRMREPTERMINATEIFINNIM(ORFILEREPAIR)*ŠBSR„GET4HEXŒD1=OLDPSN,‚GETNEWINTOD1*ŠMOVE.LD1,VIDSAT+VIDBUF-B(A5)SETNEWPSN(ŠMOVE.B#1,VIDFLG-B(A5)„FLAGVIDCHANGEDŠBRA„VIDC46TESTAGAIN*-*ˆSDBPSNERROR-GETNEWINIM,QUITINNIM* VIDC90„EQU„*7ŠLEA„SDPPSN(PC),A0ŠWHERETODEPOSITCONVERTEDASCIIHEX ŠBSR„BIN4HEXŒCONVERTANDDEPOSIT!ŠLEA„SDPMSG(PC),A0ŠSENDERRORMSGŠMOVE.L#SDPMSGL,D0 ŠBSR„SENDMSQC'ŠBEQ„TRMREPQUITIFNONINTERACTIVEMODE ŠBSR„GET4HEXŒGETNEWPSNINTOD1ŠMOVE.LD1,VIDSDS+VIDBUF-B(A5)ŠCLR.L‚D2‘CHECKPSNAGAIN>ŠMOVE.WVIDSAL+VIDBUF-B(A5),D2ƒGETSATLENGTHANDSTARTINGPSNDŠMOVE.LVIDSAT+VIDBUF-B(A5),D1ƒTOCHECKSDBDOESNOTOVERLAPWITHIT(ŠMOVE.B#1,VIDFLG-B(A5)„FLAGVIDCHANGED ŠBRA„VIDC47.ŠPAGE**<>O*********************************************************************************‚CONFIGURATIONAREACHECKSTEP*O********************************************************************************CFGACHK:‚EQU„*<ŠMOVE.B#'?',UPDQMK-B(A5)‚Setquestionmarkin'UPDATE?'ŠSPC„28ŠLEA.L‚CFGAMSG(PC),A0…IssuetheconfigurationareacheckŠMOVE.L#CFGAMSGL,D0‡message. ŠBSR„SENDMSGSŠSPC„2*1*ˆSET-UPUPDATEBOUNDS-ONLY‚CFGACANBEUPDATED*ˆREADINCFGAFROMDISK5*ˆIFFILEREPAIRGOTOSATCHECKSTEPAFTERCFGAREAD*$CFGC0A„MOVE.LVIDBUF+VIDCAS-B(A5),D1 ŠCLR.L‚D2ŠMOVE.BVIDBUF+VIDCAL-B(A5),D28ŠMOVE.LD1,UPDSTR-B(A5)„SETNEWUPDATESECTORPSNBOUNDSŠMOVE.LD1,UPDEND-B(A5)„.ŠADD.L‚D2,UPDEND-B(A5)„. 3ŠMOVE.LSATDBUF-B(A5),A1ƒREADCFGAINTOTHISBUFFERŠMOVE.L#'CFG',IOERITM-B(A5) ŠBSR„GETSEC.ŠBNE.S‚CFGC01ERROR #*‰SAVESOMECFGADATAFORLATERUSE*<ŠMOVE.BIOSSPT(A1),SECPTRAK-B(A5)‚sectors/trackonthisdisk:ŠMOVE.BIOSHDS(A1),DRVHEADS-B(A5)‚#ofheadsonthisdrive=ŠMOVE.LIOSRSZ(A1),TOTVSECT-B(A5)‚total#ofVERSAdossectors /ŠBTSTƒ#FREPAIR,D7ˆOKREAD,‚DOFILEREPAIRONLY?+ŠBNE„SATCHKYES,GODOSATCHECKANDREPAIR ŠBSR„IM‘NO%ŠBEQ.S‚CFGC05GOASKFORUPDATEINIM'ŠBRA„SATCHKINNIMGOTOSATCHECKSTEP**ˆCRCERROROROTHERIOERROR*$CFGC01„BTSTƒ#FREPAIR,D7ˆFILEREPAIR?$ŠBNE„ABORTREP‹YES,ABORTONIOERRORŠTST.B‚D0‘NO,CRCERROR?ŠBNE„ABORTREP‹NO,OTHERERROR ***ˆCFGAUPDATELOOP*CFGC05„CLR.L‚D2‘DUMPCFGA+ŠMOVE.BVIDCAL+VIDBUF-B(A5),D2ƒ#OFSECTORS.ŠMOVE.LVIDCAS+VIDBUF-B(A5),D1ƒ1STPSNOFCFGA ŠMOVE.LD1,D3+CFGCDP„MOVE.LSATDBUF-B(A5),A1ƒBUFFERSTARTŠMOVE.L#'CFG',PSNITM-B(A5)"ŠBSR„DUMPWRITECFGAORPARTOFIT.CFGC06„MOVE.L#'CFG',UPDITM-B(A5)UPDATECFGAŠBSR„UPDATEREQUESTUPDATE*Š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‹$PSNDUMP/UPDATECFGAŠDC.LƒCFGC14-B‹$DUMPCFGA'ŠDC.LƒCFGC20-B‹DUMPSECTORSNOTINCFGAŠDC.LƒCFGC11-B‹DPSN,NŠDC.LƒCFGC12-B‹APSN,N0ŠDC.LƒCFGC15-B‹OFFSET-UPDATEFIRSTCFGASECTORŠDC.LƒCFGC30-B‹C ŠDC.LƒCFGSHL-B‹?HELPshortlistŠDC.LƒCFGLHL-B‹HHELP‚longlist*(*‰SENDTHEHELPMESSAGE&REFRESHSCREEN* CFGSHL:ƒEQU„*<ŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofmessagesŠLEA„HLPSMSG(PC),A1ŠMOVE.L#HLPSMSGL,D2#ŠBRA.S‚CFGGOHsendthehelpmessage CFGLHL:ƒEQU„*ŠMOVE.B#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L#HLPLMSGL,D2%CFGGOH„BSR„GETHELPŒprinthelpmessageBŠMOVE.LVIDBUF+VIDCAS-B(A5),D1ƒGetthelocationofthelastsectorAŠADD.B‚VIDBUF+VIDCAL-B(A5),D1ƒintheCFGAbyaddingstartofCFGA(ŠSUB.L‚#1,D1ŽtolengthofCFGAminusone6ŠMOVE.L#1,D2Ždumpingonlyonesectorreturnstheuser4ŠBRA„CFGCDPreturntopointwherehelpwasrequested 'CFGC10„BSR„RESPNARESPONSENOTACCEPTED ŠBRA„CFGC06**ˆDEALLOCATEGIVENSECTORS*2CFGC11„BSR„DEALLCDEALLOCATESECTORSINBOTHSAT'SŠBRA„CFGC06CONTINUELOOP**ˆALLOCATEGIVENSECTORS*0CFGC12„BSR„ALLOCTALLOCATESECTORSINBOTH‚SAT'SŠBRA„CFGC06CONTINUELOOP* *‰DUMPCFGA* CFGC14„EQU„*ŠTST.W‚D2‘NGIVEN?ŠBNE.S‚CFGC14AŒYES2ŠMOVE.BVIDCAL+VIDBUF-B(A5),D2ƒNO,GETCFGALENGTH ŠBRA.S‚CFGC151CFGC14AƒCMP.B‚VIDCAL+VIDBUF-B(A5),D2ƒNTOOLARGE?ŠBLE.S‚CFGC14BŒNOŠMOVE.W#1,D2ŽYES,USE1)CFGC14BƒCLR.L‚D3‘GETPSNOFSECTORWANTED ŠMOVE.WD2,D3 ŠSUB.L‚#1,D3 ŠADD.L‚D3,D1 ŠMOVE.L#1,D2ŽONESECTORTODUMPŠBSETƒ#31,D2.**ˆUPDATEORDUMPCFGA*4CFGC15„MOVE.LVIDCAS+VIDBUF-B(A5),D3ƒ1STPSNOFCFGAŠTST.L‚D2‘PRINTONLY?ŠBMI„CFGCDPYES,GODUMPSAT*ŠMOVE.B#1,CFGAFLG-B(A5)ƒFLAGCFGAUPDATED%ŠMOVE.LSATDBUF-B(A5),A1ƒBUFFERSTARTAŠSUB.L‚VIDBUF+VIDCAS-B(A5),D1ƒGETOFFSETTOREQUESTEDCFGABUFFER ŠMULUƒD6,D1Ž.2ŠLEA„(A1,D1),A1‰STARTOFCFGASECTORTOBEUPDATED)ŠLEA„(A1,D6),A2‰SETENDOFBUFFERADDRESS!ŠBSR„UPDBUFUPDATECFGAFROMDISK ŠBRA„CFGC06**ˆDUMPANYSECTOR*CFGC20„MOVE.L#'„',PSNITM-B(A5)(ŠBSR„UPDSECDUMPSECTORS(D2BIT31SET) ŠBRA„CFGC06**ˆ'C'*5CFGC30„BSETƒ#COPTION,D7ˆCHECKMODETILLERRORORDONE ŠCLR.B‚D7*CFGC35:*><ŠPAGE*O*********************************************************************************ˆSATƒCHECKƒSTEP*O********************************************************************************* SATCHK:ƒEQU„**<ŠMOVE.B#'?',UPDQMK-B(A5)‚SETQUESTIONMARKIN'UPDATE?'**ˆSENDSATSTEPMESSAGE* SATC00„EQU„*-ŠBTSTƒ#FREPAIR,D7ˆSKIPMESSAGEIFFILEREPAIR ŠBNE.S‚SATC0AŠLEA„SATMSG(PC),A0ŠMOVE.L#SATMSGL,D0 ŠBSR„SENDMSGS*0*ˆSET-UPUPDATEBOUNDS-ONLY‚SATCANBEUPDATED*ˆREADINSATFROMDISK 5*ˆIFFILEREPAIRGOTOFILECHECKSTEPAFTERSATREAD*$SATC0A„MOVE.LVIDBUF+VIDSAT-B(A5),D1 ŠCLR.L‚D2ŠMOVE.WVIDBUF+VIDSAL-B(A5),D28ŠMOVE.LD1,UPDSTR-B(A5)„SETNEWUPDATESECTORPSNBOUNDSŠMOVE.LD1,UPDEND-B(A5)„.ŠADD.L‚D2,UPDEND-B(A5)„.2ŠMOVE.LSATDBUF-B(A5),A1ƒREADSATINTOTHISBUFFERŠMOVE.L#'SAT',IOERITM-B(A5) ŠBSR„GETSEC.ŠBNE.S‚SATC01ERROR/ŠBTSTƒ#FREPAIR,D7ˆOKREAD,‚DOFILEREPAIRONLY?,ŠBNE„FILCHKYES,GOLOOKFORFILEANDREPAIR ŠBSR„IM‘NO%ŠBEQ.S‚SATC05GOASKFORUPDATEINIMŠBRA„SATC35INNIMGOCHECKSAT**ˆCRCERROROROTHERIOERROR*$SATC01„BTSTƒ#FREPAIR,D7ˆFILEREPAIR?$ŠBNE„ABORTREP‹YES,ABORTONIOERRORŠTST.B‚D0‘NO,CRCERROR?AŠBNE„ABORTREP‚NO,OTHERERROR(LATERRECREATESAT,GETNEWSATPSN-*œFROMUSERINIM,MARKSATBAD;INNIMABORT(ŠLEA„RSTMSG(PC),A0ŠREPAIRBYRECONSTRUCTŠMOVE.L#RSTMSGL,D0 ŠBSR„SENDMSQCŠBNE.S‚SATC06INIMUPDATE7ŠBSR„REPAIRŒINNIMASKUSERIFHEWANTSTORECREATESATŠBNE„TRMREPNO,QUITŠBRA„SATC25YES,RECREATESATŠPAGE**ˆSATUPDATELOOP*SATC05„CLR.L‚D2‘DUMPSAT+ŠMOVE.WVIDSAL+VIDBUF-B(A5),D2ƒ#OFSECTORS-ŠMOVE.LVIDSAT+VIDBUF-B(A5),D1ƒ1STPSNOFSAT ŠMOVE.LD1,D3+SATCDP„MOVE.LSATDBUF-B(A5),A1‰BUFFERSTARTŠMOVE.L#'SAT',PSNITM-B(A5)!ŠBSR„DUMPWRITESATORPARTOFIT-SATC06„MOVE.L#'SAT',UPDITM-B(A5)UPDATESATŠBSR„UPDATEREQUESTUPDATE*ŠDC.LƒSATC35-B‹CRŠDC.LƒSATC35-B‹N2ŠDC.LƒSATC25-B‹R„RECONSTRUCTSAT-TERMINATESLOOPŠDC.LƒSATC10-B‹DŠDC.LƒSATC10-B‹AŠDC.LƒTRMREP-B‹Q#ŠDC.LƒSATC15-B‹$PSNDUMP/UPDATESATŠDC.LƒSATC14-B‹$DUMPSAT&ŠDC.LƒSATC20-B‹DUMPSECTORSNOTINSATŠDC.LƒSATC11-B‹DPSN,NŠDC.LƒSATC12-B‹APSN,N/ŠDC.LƒSATC15-B‹OFFSET-UPDATEFIRSTSATSECTORŠDC.LƒSATC30-B‹C ŠDC.LƒSATSHL-B‹?HELPshortlistŠDC.LƒSATLHL-B‹HHELP‚longlist*(*‰SENDTHEHELPMESSAGE&REFRESHSCREEN* SATSHL:ƒEQU„*<ŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofmessagesŠLEA„HLPSMSG(PC),A1ŠMOVE.L#HLPSMSGL,D2%ŠBRA.S‚SATGOHprintthehelpmessages SATLHL:ƒEQU„*ŠMOVE.B#1,ASKCTFLG-B(A5)ŠLEA„HLPLMSG(PC),A1ŠMOVE.L#HLPLMSGL,D2*SATGOH„BSR„GETHELPŒprintthehelpmessagesBŠMOVE.LVIDBUF+VIDSAT-B(A5),D1ƒGetthelocationofthelastsector?ŠADD.W‚VIDBUF+VIDSAL-B(A5),D1ƒintheSATbyaddingstartofSAT'ŠSUB.L‚#1,D1ŽtolengthofSATminusone6ŠMOVE.L#1,D2Ždumpingonlyonesectorreturnstheuser&*§tothespotwherehelpwasrequestedŠBRA„SATCDPgodumpthesector.  'SATC10„BSR„RESPNARESPONSENOTACCEPTED ŠBRA„SATC06 **ˆDEALLOCATEGIVENSECTORS*2SATC11„BSR„DEALLCDEALLOCATESECTORSINBOTHSAT'SŠBRA„SATC06CONTINUELOOP**ˆALLOCATEGIVENSECTORS*0SATC12„BSR„ALLOCTALLOCATESECTORSINBOTH‚SAT'SŠBRA„SATC06CONTINUELOOP* *ˆDUMPSAT* SATC14„EQU„*ŠTST.W‚D2‘NGIVEN?ŠBNE.S‚SATC14AŒYES1ŠMOVE.WVIDSAL+VIDBUF-B(A5),D2ƒNO,GETSATLENGTH ŠBRA.S‚SATC151SATC14AƒCMP.W‚VIDSAL+VIDBUF-B(A5),D2ƒNTOOLARGE?ŠBLE.S‚SATC14BŒNOŠMOVE.W#1,D2ŽYES,USE1)SATC14BƒCLR.L‚D3‘GETPSNOFSECTORWANTED ŠMOVE.WD2,D3 ŠSUB.L‚#1,D3 ŠADD.L‚D3,D1 ŠMOVE.L#1,D2ŽONESECTORTODUMPŠBSETƒ#31,D2.**ˆUPDATEORDUMPSAT*3SATC15„MOVE.LVIDSAT+VIDBUF-B(A5),D3ƒ1STPSNOFSATŠTST.L‚D2‘PRINTONLY?ŠBMI„SATCDPYES,GODUMPSAT(ŠMOVE.B#1,SATFLG-B(A5)„FLAGSATUPDATED%ŠMOVE.LSATDBUF-B(A5),A1ƒBUFFERSTART@ŠSUB.L‚VIDBUF+VIDSAT-B(A5),D1ƒGETOFFSETTOREQUESTEDSATBUFFER ŠMULUƒD6,D1Ž.1ŠLEA„(A1,D1),A1‰STARTOFSATSECTORTOBEUPDATED)ŠLEA„(A1,D6),A2‰SETENDOFBUFFERADDRESS ŠBSR„UPDBUFUPDATESATFROMDISK ŠBRA„SATC06**ˆDUMPANYSECTOR*SATC20„MOVE.L#'„',PSNITM-B(A5)(ŠBSR„UPDSECDUMPSECTORS(D2BIT31SET) ŠBRA„SATC06**ˆRECREATESAT*.SATC25„BSETƒ#RCRSAT,D7‰FLAGTORECONSTRUCTSAT ŠBRA.S‚SATC35**ˆ'C'*5SATC30„BSETƒ#COPTION,D7ˆCHECKMODETILLERRORORDONE ŠCLR.B‚D7**ˆCHECKSATINITIALLY:C*ˆCHECKVID,SATANDANYSDBAREALLOCATED;CHECKSECTORSPASTMPSN *ˆAREMARKEDALLOCATED;ALLOCATE* SATC35„EQU„*   'P8!I)H1I9KATIPQCYHaViOqXyE@‰;‘b™K¡N©J±A¹?ÁYÉ]ÑOÙ_á_éBñVù@;ŠMOVE.L#'VID',NALITM-B(A5)SETUPERRORMSGINCASENEEDEDŠMOVE.L#'VID',ALCITM-B(A5)1ŠCLR.L‚D1‘ALLOCATEVIDANDCHECKITWASALLOCATEDŠMOVE.L#1,D2Ž. ŠBSR„TSTALC.ŠBEQ.S‚SATC36OKORRECONSTRUCTŠBSR„SATC40ERRORJSATC36„BSRƒTSTNYACHECKNOTALREADYALLOCATED(MARKALLOCATEDIFNOERROR)%ŠBNE„SATC70ALREADYALLOCATED-ERRORŠSPC„2*,*‰CHECKCONFIGURATIONAREAALLOCATIONINSAT*>SATC36AƒLEA.L‚VIDBUF(PC),A1†Iftheconfigurationareastarting?ŠMOVE.LVIDCAS(A1),D1†sectoriszero,thereisnoconfiguration*ŠBEQ.S‚SATC36CŒareasoskiptheSATcheck.ŠSPC„2DŠMOVE.L#'CFG',NALITM-B(A5)‚Setupforapossiblesectorallocation#ŠMOVE.L#'CFG',ALCITM-B(A5)‚error.ŠMOVE.L#'CFG',ALEITM-B(A5)ŠSPC„23ŠCLR.L‚D2“Checkthattheconfigurationareasectors?ŠMOVE.BVIDCAL(A1),D2†areallocatedintheoriginalSAT.Ifall0ŠBSR„TSTALCsectorsareallocatedthencheckthe!ŠBEQ.S‚SATC36BŒreconstructedSAT.ŠSPC„2-ŠBSR„SATC40Handletheallocationconflictas'*£appropriatefortheexecutionoptionsŠSPC„26SATC36BƒBSR„TSTNYAMarktheconfigurationareasectors6ŠBNE„SATC71allocatedinthereconstructedSAT.Ifthe**£sectorsarealreadyallocated,handleas)*£appropriatefortheexecutionoptions.]ŠSPC„2LSATC36CƒMOVE.L#'SAT',NALITM-B(A5)CHECKSATALLOCATEDANDALLOCINNEWSATŠMOVE.L#'SAT',ALCITM-B(A5)ŠLEA„VIDBUF(PC),A1!ŠMOVE.LVIDSAT(A1),D1†GETSATPSN ŠCLR.L‚D2ŠMOVE.WVIDSAL(A1),D2†LENGTH(ŠBSR„TSTALCWASITALLOCATEDINOLDSAT?ŠBEQ.S‚SATC37YESŠBSR„SATC40ERROR‚//////////////////////////////////////////////////////////////////////*2*ˆCHECKTHEALLOCATIONOFALTERNATESECTORSIFANY*I*ƒ((max#ofbadtrksallowed+1cyl.)x(#hdsondrive))x(sects/trk)*B*‰Theaboveformulaisusedtodeterminthefirstalternatesector*‰tobecheckedforallocation.**A*ƒ((max#ofbadtrksallowed)x(#hdsondrive))x(sects/trk)*?*‰Theaboveformulaisusedtodeterminthenumberofalternate'*‰sectorstobecheckedforallocation.* ALTCHK:ƒEQU„* ŠCLR.L‚D0 ŠCLR.L‚D1 ŠCLR.L‚D2BŠMOVE.L#'ALTS',NALITM-B(A5)ƒGeterrormessagesreadyjustincaseŠMOVE.L#'ALTS',ALCITM-B(A5)ŠMOVE.L#'ALTS',ALEITM-B(A5) CŠMOVE.BVIDBUF+VIDALT-B(A5),D3ƒinitializedwithalternatesectors?0ŠBEQ.S‚SETPARXŒno.....gotothenextupdateloop <ŠMOVE.B#MAXBAD,D0‰getthemax.numberofbadtracksallowed?ŠMOVE.BDRVHEADS-B(A5),D1‚getthenumberofheadsonthisdrive<ŠMOVE.BSECPTRAK-B(A5),D2‚getthesectors/trackonthisdiskBŠMOVE.LTOTVSECT-B(A5),D3‚getthetotalnumberofVERSAdossectors 7ŠADD.B‚#1,D0Žaddonecylinderforthediagnostictracks*§attheendofthedisk.3ŠMULUƒD1,D0Ž(#ofheads)x(max#badtrks+1cyl),ŠMULUƒD2,D0Ž(sect/track)x(aboveresultant) ŠSUB.L‚D0,D3 1ŠMOVE.LD3,D1ŽPSNoffirstalternatesectortobe*§checkedforallocation ?ŠMOVE.BDRVHEADS-B(A5),D2‚getthenumberofheadsonthisdrive.ŠMULUƒ#MAXBAD,D2‰(max#badtrks)x(#ofhds) ŠCLR.L‚D3ŠMOVE.BSECPTRAK-B(A5),D3,ŠMULUƒD3,D2Ž(sect/track)x(aboveresultant) 0ŠBSR„TSTALCCheckthatthealternatesectorsare *§allocatedintheoriginalSAT. 8ŠBEQ.S‚SATYALOC‹Ifallsectorsareallocated,thencheck*§thereconstructedSAT. 7ŠBSR.S‚SATC40Ifnot,handletheallocationconflictas(*§appropriatefortheoptionsineffect. SATYALOC‚EQU„*.ŠBSR„TSTNYAdesignatethealternatesectorsas%*§allocatedinthereconstructedSAT. 3ŠBNE.S‚SATC71Ifthesectorsarealreadyallocated,#*§handleasappropriateforoptions *§ineffect. SETPARXƒEQU„*ŠBRA„SDBCHKSDBchecknext*><*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*=*ˆSATERROR,ITEMNOTALLOCATED(D1=PSN,D2=#OFSECTORS)* SATC40„EQU„*ŠLEA„NALPSN(PC),A0 ŠBSR„BIN4HEX%ŠLEA„NALMSG(PC),A0ŠSENDERRORMESSAGEŠMOVE.L#NALMSGL,D0 ŠBSR„SENDMSQCŠLEA„ALCMSG(PC),A0ŠMOVE.L#ALCMSGL,D0 ŠBSR„SENDMSQC$ŠBEQ.S‚SATC41INNIMFORCEALLOCATED/ŠBSR„REPAIRINIMASKIFTOALLOCATEORTOQUIT ŠBNE„TRMREP'SATC41„MOVE.LSATDBUF-B(A5),A0…ALL  OCATE*ŠMOVE.B#1,SATFLG-B(A5)„.FLAGSATCHANGEDŠMOVE.L#1,D0Ž. ŠBSR„ALDESCŠRTSŠPAGE*C*ˆTHEFOLLOWINGERRORSSHOULDONLYHAPPENIFTHEUSERHASSETGIVEN0*ˆITEMALLOCATED(BY'APSN')‚-TERMINATEREPAIR**†*VIDALREADYALLOCATED: 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*†*SATALREADYALLOCATED SATC75„EQU„*ŠMOVE.L#'SAT',ALEITM-B(A5) ŠBRA„SATC71*†*SDBALREADYALLOCATED SATC80„EQU„*ŠMOVE.L#'SDB',ALEITM-B(A5) ŠBRA„SATC71***ˆNODIRECTORIES-DONE**SATC60„CLR.L‚D1‘FLAGSATCHECK(SATCND„LEA„NDRMSG(PC),A0ŠSENDNODIRMSGŠMOVE.L#NDRMSGL,D0 ŠBSR„SENDMSGSŠBTSTƒ#RCRSAT,D7‰RECREATEDSAT?)ŠBNE„FSAT60YES,GOWRITENEWSATTODISK ŠTST.L‚D1=ŠBEQ.S‚FSAT00‡SKIP'SATCHECK'MSG‚IFDOINGSATCHECKALREADYŠPAGE*O********************************************************************************@*ˆFINALSATCHECK-CHECKOLDSATHASNOUNUSEDSECTORALLOCATED*O*********************************************************************************ˆSENDSATCHECKMESSAGE*FSATCK:ŠBTSTƒ#RCRSAT,D7‰RECREATEDSAT?)ŠBNE„FSAT60YES,GOWRITENEWSATTODISKŠMOVE.L#SATMSGL,D0ŠLEA„SATMSG(PC),A0 ŠBSR„SENDMSGS*$*ˆCHECKFORUNUSEDSECTORALLOCATION*0FSAT00„CLR.L‚D5‘INDICATENOSECTORSINERRORYET*ŠMOVE.LD7,D0ŽTURNIMBACKONIFNECESSARYŠAND.L‚#NIMASK,D0 ŠBEQ.S‚FSAT01 ŠMOVE.B#1,D7ŠAND.L‚#-(NIMASK+1),D7FSAT01„MOVE.LSATABUF-B(A5),A1ŠMOVE.LSATDBUF-B(A5),A2 ŠCLR.L‚D21ŠMOVE.WVIDBUF+VIDSAL-B(A5),D2ƒGETSATBUFFERBCT ŠMULUƒD6,D2&ŠCLR.L‚D1‘D1=1STPSNOFCURRENTBYTEKFSAT05„MOVE.B(A1)+,D0NOMORESECTORSMARKEDALLOCATEDINOLDSATTHANNEWŠCMP.B‚(A2)+,D0ŠBCS„FSAT20ERROR-ŠTST.W‚D5‘OK,LASTBIT(S)INLASTBYTEWRONG?ŠBEQ.S‚FSAT10NO)ŠBSR„PRNTPŽYES,PRINTBLOCKNUMBER(S)OUT9ŠAND.L‚#$FFFFFFF8,D1†ADJUSTPSNSOGETNEXTBYTE'SPSNOK)ŠADD.L‚#8,D1Ž.SKIPBYTETHATWASJUSTOK+FSAT10„ADD.L‚#8,D1ŽNEXTBYTE'SSTARTINGPSN!FSAT11„SUB.L‚#1,D2ŽDONEWITHSAT?ŠBNE.S‚FSAT05NO2ŠTST.L‚D5‘YES,ANYERROR?(BIT31SETIFERROR(S))(ŠBPL„FSAT60NO,GOWRITENEWSATTODISK*ŠTST.W‚D5‘YES,ANYSEGMENTLEFTUNPRINTED?ŠBEQ.S‚FSAT12NOŠBSR„PRNTPŽYES,PRINTPSN,NŠPAGE*?*ˆININTERACTIVEMODE(NONINTERACTIVEMODEQUITONFIRSTERROR);*ˆPRINTEDALLALLOCATEDUNUSEDSECTORS-NOWASKFORUPDATE*FSAT12:‰BTST†#COPTION,D7 ‰BNE‡TRMREP*œJMPIF'C'OPTIONISSETŠMOVE.L#-1,D0*ŠMOVE.LD0,UPDSTR-B(A5)„NOUPDATESALLOWEDŠMOVE.LD0,UPDEND-B(A5)„.ŠMOVE.L#'SAT',UPDITM-B(A5) FSAT13„BSR„UPDATEREQUESTUPDATE*Š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=>WRITENEWSATTODISKAŠDC.LƒTRMREP-BƒA-LEAVEALLOCATED-WRITECOMBINEDSAT'STODISKŠDC.LƒFSAT14-B‹Q-N/A'ŠDC.LƒFSAT15-B‹$PSNINRANGE-DUMPSAT%ŠDC.LƒFSAT01-B‹$=DUMPNUMBERSAGAIN"ŠDC.LƒFSAT15-B‹$PSN-DUMPSECTORSŠDC.LƒFSAT14-B‹DPSN‚-N/AŠDC.LƒFSAT14-B‹APSN‚-N/AŠDC.LƒFSAT14-B‹OFFSETN/AŠDC.LƒFSAT14-B‹C!ŠDC.LƒFSATSHL-BŠ?‚HELPshortlist ŠDC.LƒFSATLHL-BŠH‚HELPlonglistŠPAGEFSATSHL:<ŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofmessagesŠ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**ˆRESPONSENOGOOD*FSAT14„BSR„RESPNA ŠBRA„FSAT13**ˆDUMPSECTORS*+FSAT15„BSR„UPDSEC(D2BIT#31SETFORDUMP) ŠBRA„FSAT13**ˆDPSN*.FSAT16„BSR„DEALLCDEALLOCATESPECIFIEDSECTORS ŠBRA„FSAT13**ˆAPSN*,FSAT17„BSR„ALLOCTALLOCATESPECIFIEDSECTORS ŠBRA„FSAT13ŠPAGE*$*ˆSECTORALLOCATED,NOTUSED-ERROR*0FSAT20„TST.L‚D5‘FOUNDANYSUCHERRORPREVIOUSLY?ŠBNE.S‚FSAT30YES$ŠMOVE.LD0,D3ŽNO,SENDERRORMESSAGEŠ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,D5SETFLAGNOTTOWRITEMESSAGEAGAINŠBTST†#COPTION,D7 ŠBNE‡TRMREP*œJMPIFCOPTIONISSETŠBSR„REPAIRDEALLOCATE?5ŠBEQ.S‚FSAT60YES,WRITENEWSAT(SAMEASDEALLOCATE)FSAT25:ŠTST.B‚D7‘NO,INTERACTIVEMODE?9ŠBEQ„TRMREPŠNO,GOWRITEOLDSAT(SAMEASKEEPALLOCATED)ŠMOVE.LD3,D0ŽRESTOREBYTE=FSAT30„NOT.B‚D0ŽYES,FINDALLSECTORSINERRORANDPRINTTHEMŠMOVE.B-1(A2),D4ŠOLDSATBYTE9ŠAND.B‚D0,D4ŒD4HASNOWBITSSETFOREACHSECTORINERRORŠMOVE.L#7,D0ŽCHECKBITBYBITFSAT40„BTSTƒD0,D4ŠBNE.S‚FSAT50ERROR‚?'ŠTST.W‚D5‘NO,PREVIOUSSECTORINERROR?ŠBEQ.S‚FSAT45NO#FSAT41„BSR.S‚PRNTPŽYES,PRINTPSN,N$ŠADD.L‚#1,D1ŽSKIPBITJUSTTESTEDOKFSAT45„ADD.L‚#1,D1ŽNEXTPSNFSAT46„SUB.L‚#1,D0ŠBPL„FSAT40DONE?"ŠBRA„FSAT11YES,PROCESSNEXTBYTE&FSAT50„ADD.W‚#1,D5ŽONEMOREBADSECTOR&ŠBNE„FSAT46COUNTFULLPRINTPSN,N+1?ŠBSR.S‚PRNTPŽYESŠBRA„FSAT45CONTINUEŠPAGE**ˆWRITENEWSATTODISK*FSAT60:‰BTST†#COPTION,D7 ‰BNE.S…FSAT70*œJMPIFCOPTIONSELECTED&ŠMOVE.LVIDSAT+VIDBUF-B(A5),D1ƒSATPSN ŠCLR.L‚D2%ŠMOVE.WVIDSAL+VIDBUF-B(A5),D2ƒLENGTH'ŠMOVE.LSATABUF-B(A5),A1‰NEWSATBUFFERŠMOVE.L#'SAT',IOERITM-B(A5) ŠBSR„WRITSECŠBNE„ABORTREP‹(LATERMOVESAT?)FSAT70:ŠCLR.B‚SATFLG-B(A5)ŠLEA„DOKMSG(PC),A0ŠDISKOKMSGŠMOVE.L#DOKMSGL,D0 ŠBSR„SENDMSGS-ŠBRA„REPDONEŒGOMAKESUREALLSECTORSUPDATEDŠPAGE* *ˆSUBROUTINE:$*ˆPRINTPSN,NFORSECTOR(S)INERROR*ˆENT:D1=1STPSNWITHERROR*D5.W=NUMBEROFSECTORS*ˆRET:D1=LASTPSNWITHERROR *D5.W=0 PRNTP…EQU„*ŠMOVEM.LD0/D2,-(A7)ŠLEA„PSNFLD(PC),A0ŠBSR„BIN4HEXŒPSNŠMOVE.LD1,D2ŽSAVEPSNŠLEA„PSNCNT(PC),A0ŠN ŠCLR.L‚D1 ŠMOVE.WD5,D1 ŠBNE.S‚PRNTP1"ŠMOVE.L#1,D1ŽN=$10000IFD5=0 ŠSWAPƒD1‘.PRNTP1„MOVE.L#PSNMSL,D0$ŠSUB.W‚#1,D5ŽCOUNT=1TOBEIGNORED ŠBEQ.S‚PRNTP2 ŠBSR„BIN4HEXŠMOVE.L#PSNCML,D0PRNTP2„LEA„PSNMSG(PC),A0 ŠBSR„SENDMSGS ŠADD.L‚D2,D1.ŠSUB.L‚#1,D1ŽRETURNLASTPSNOFBLOCKINERROR ŠCLR.W‚D5ŠMOVEM.L(A7)+,D0/D2ŠRTSŠPAGE*O*********************************************************************************ˆSDB„CHECK„STEP*O******************************************************************************** SDBCHK„EQU„**AŠMOVE.LVIDBUF+VIDSDS(PC),D1‚Iftherearenoprimaryorsecondary3ŠBEQ„SATC60directoryblocks,skiptheSDB,PDBand*¥filechecks.ŠSPC„2*ˆSENDSDBCHECKMESSAGE*SDBC00„LEA„SDBMSG(PC),A0ŠMOVE.L#SDBMSGL,D0 ŠBSR„SENDMSGS,ŠMOVE.L#'SDB',D5‰D5SETFORMSGCOMPLETION**ˆSETUPUPDATEBOUNDS*0ŠMOVE.LVIDSDS+VIDBUF-B(A5),D1ƒGET1STSDB'SPSN+SDBC01„TST.L‚D1‘DONE?(D1=NEXTSDB'SPSN)%ŠBEQ„PDBCHKYES,ENDOFCHAIN‚IFZERO%ŠCLR.B‚DELCRI-B(A5)‡RESETDELETEFLAGŠMOVE.L#SDBSZE,D2#ŠMOVE.LD1,UPDSTR-B(A5)„LOWERBOUND#ŠMOVE.LD1,UPDEND-B(A5)„UPPERBOUNDŠADD.L‚D2,UPDEND-B(A5)„.**ˆREADINNEXTSDB*%ŠCLR.L‚D4‘INDICATENOERRORFROMREAD+ŠMOVE.LD1,PSNSDB-B(A5)„SETNEWCURRENTSDB ŠLEA„SDBBUF(PC),A1ŠBUFFERTOUSEŠMOVE.LD5,IOERITM-B(A5) ŠBSR„GETSECŠBEQ„SDBC25OKREADEŠMOVE.B#1,SDBFLG-B(A5)SETFLAGTOWRITEIFCRCERRORTOCLEARERRORŠTST.B‚D0‘CRCERROR?2ŠBEQ„SDBC25YES,IGNORE-HOPETOCORRECTBYWRITEŠPAGE*.*ˆIOERRORFROMREAD-SETUPTOTRUNCATECHAIN*BSDBCTR„MOVE.L#1,D4ŠTRUNCATECHAINBECAUSECOULDNOTREADNEXTSDBŠMOVE.LD5,TRNITM-B(A5)ŠLEA„TRNMSG(PC),A0ŠMOVE.L#TRNMSGL,D0"SDBC05„BSR„SENDMSGŒSENDREPAIRMSGŠBSR„NIMCUPDATEINIM ŠBNE„SDBC35.#ŠBSR„REPAIRINNIMASKFORAPPROVAL/ŠBNE„TRMREPQUIT‚IFUSERDOESN'TWANTTOREPAIR*.*ˆTRUNCATESDBCHAINBECAUSELOSTFORWARDLINK*SDBC06„CLR.B‚SDBFLG-B(A5)CŠMOVE.LPRVSDB-B(A5),D1„GETPREVIOUSSDB'S1STSECTORTOBEUPDATED.ŠBEQ.S‚SDBC10IFNONETHENNOSDBCHAINATALL ŠMOVE.L#1,D2ŠLEA„SDBBUF(PC),A1ŠMOVE.LD5,IOERITM-B(A5) ŠBSR„GETSEC#ŠBNE„ABORTREP‹IFERRORQUITFORNOW6ŠCLR.L‚SDBBUF+SDBFPT-B(A5)PRIORS  DBNOWLASTINCHAIN"ŠBSR„WRITSECŒWRITEITBACKTODISK!ŠBNE„TRMREPQUITFORNOWONERRORŠBRA„PDBCHKDONEWITHSDBCHECKFSDBC10„CLR.L‚VIDBUF+VIDSDS-B(A5)DELETEDLASTSDB-NODIRECTORIESNOW"ŠMOVE.B#1,VIDFLG-B(A5)„UPDATEVID#ŠMOVE.L#1,D1ŽFLAGNOTINSATCHECK;ŠBRA„SATCNDˆGOCHECKSATISOKWITHNODIRECTORIESANDQUIT*(*ˆDELETECURRENTSDB,FORWARDLINKKNOWN*5SDBC15„MOVE.LSDBBUF+SDBFPT-B(A5),D4ƒGETFORWARDLINKŠCLR.B‚SDBFLG-B(A5)@ŠMOVE.LPRVSDB-B(A5),D1„GETPRIORSDB'S1STSECTORTOBEUPDATEDŠBEQ.S‚SDBC20NOPRIORSDB ŠMOVE.L#1,D2ŠLEA„SDBBUF(PC),A1ŠMOVE.LD5,IOERITM-B(A5)ŠBSR„GETSECREADSDBSECTOR!ŠBNE„TRMREPQUITFORNOWIFERROR+ŠMOVE.LD4,SDBBUF+SDBFPT-B(A5)SETNEWLINKŠBSR„WRITSECŒUPDATEONDISK!ŠBNE„TRMREPQUITFORNOWIFERROR SDBC19„MOVE.LD4,D1ŽNEXTSDBPSNŠBRA„SDBC01GOPROCESSIT;SDBC20„MOVE.LD4,VIDBUF+VIDSDS-B(A5)SETNEW1STSDBINVID'ŠMOVE.B#1,VIDFLG-B(A5)„FLAGUPDATEVID7ŠBRA„SDBC19ŒGOPROCESSNEXTSDB(MAYBENONEIFD4=0)ŠPAGE*0*ˆINIMDUMPANDUPDATESDB,INNIMGOCHECKSDB* SDBC25„BSR„IMŠBNE„SDBC80INNIMGOCHECKSDBCSDBC30„MOVE.LPSNSDB-B(A5),D3„DUMPALLOFSDB(D3=1STPSNOFSDB)ŠMOVE.LD5,PSNITM-B(A5) ŠBSR„DUMP'ŠMOVE.L#'SDB',UPDITM-B(A5)UPDATESDB5SDBC35„BSR„UPDATEREQUESTUPDATE(D4HASR-PARAMETER)*ŠDC.LƒSDBC80-B‹CR+ŠDC.LƒSDBC50-B‹NTURNOFFIMTILLPDBCHECK5ŠDC.LƒSDBC40-B‹RTERMINATELOOPD4=1-TRUNCATECHAIN*§D4=0ISERRORAŠDC.LƒSDBC70-B‚DDELETECURRENTSDB,USE‚FORWARDLINKINSDBBUFF*§(SPACEREMAINSALLOCATED)ŠDC.LƒSDBC45-B‹AN/AŠDC.LƒTRMREP-B‹QŠDC.LƒSDBC60-B‹$PSNŠDC.LƒSDBC55-B‹$‚DUMPSDB(ŠDC.LƒSDBC65-B‹DUMPSECTOR(S)NOTINSDBŠDC.LƒSDBC45-B‹DPSN,NN/AŠDC.LƒSDBC45-B‹APSN,NN/A"ŠDC.LƒSDBC60-B‹OFFSET-UPDATESDBŠDC.LƒSDBC75-B‹C ŠDC.LƒSDBSHL-B‹?HELPshortlistŠDC.LƒSDBLHL-B‹HHELPlonglistŠPAGE SDBSHL:ƒEQU„*<ŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofmessagesŠ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.LD3,D1 ŠBRA„SDBC30**ˆ'R'*$SDBC40„TST.L‚D4‘REPAIRIFREADERRORŠBNE„SDBC06.GOTRUNCATECHAIN)SDBC45„BSR„RESPNANOTACCEPTABLERESPONSEŠBRA„SDBC35TRYAGAIN**ˆ'N'*1SDBC50„BSETƒ#NXTSTP,D7‰TURNOFFIMTILLPDBCHECK ŠCLR.B‚D7#ŠBRA.S‚SDBC80GOCHECKSDBCONTENTS* *ˆDUMPSDB*SDBC55„MOVE.L#SDBSZE,D2ŠMOVE.LPSNSDB-B(A5),D1ŠBSETƒ#31,D2DUMP**ˆUPDATEORDUMPSDBREQUESTED*#SDBC60„LEA„SDBBUF(PC),A1ŠUPDATESDBŠTST.L‚D2‘DUMPONLY?ŠBMI„SDBC30YES(ŠLEA„(A1,D6),A2‰NO,UPDATE-GETENDADRŠBSR„UPDBUFUPDATESDBSECTOR*ŠMOVE.B#1,SDBFLG-B(A5)„FLAGTOUPDATESDB ŠBRA„SDBC35REQUESTUPDATEAGAIN**ˆDUMPANYSECTORNOTINSDB*SDBC65„MOVE.L#'„',PSNITM-B(A5) ŠBSR„UPDSECDUMP(D2BIT31SET) ŠBRA„SDBC35**ˆDELETECURRENTSDB*3SDBC70„MOVE.B#1,DELCRI-B(A5)„SETFLAGTODELETEIT ŠBRA.S‚SDBC80**ˆ'C'*SDBC75„BSETƒ#COPTION,D7 ŠCLR.B‚D7ŠPAGE**ˆCHECKSDBCONTENTS* SDBC80„EQU„***ˆCHECKNEXTSDBOK*ŠMOVE.LSDBBUF+SDBFPT-B(A5),D1ŠBEQ.S‚SDBC90NONEISOKŠMOVE.L#SDBSZE,D2‰CHECKPSNOK ŠBSR„MPSNCŠBHI„SDBE00NEXTSDBPSNERROR&ŠBSR„TSTALCCHECKALLOCATEDINOLDSAT ŠBNE„SDBE10ERROR,NOTALLOCATED%SDBC85„BSR„TSTNYAALLOCATEINNEWSAT6ŠBNE„SDBE20ERROR,ALLOCATEDTOSOMETHINGELSEALREADY*,*ˆCHECKRESERVEDSPACEINSDBHEADERISZERO*-SDBC90„TST.B‚DELCRI-B(A5)‡DELETECURRENTSDB?ŠBNE„SDBC15YES,GODELETEŠLEA„SDBBUF+4(PC),A2ŠMOVE.L#SDBSTR-4,D1ŠMOVE.L#'HDR',RESITM-B(A5)"ŠBSR„RSVCHKCHECKANDHANDLEERRORŠBEQ.S‚SDBC91OK,ŠBMI„TRMREPQUITIFUSERDOENT'SWANTTOFIX(ŠMOVE.B#1,SDBFLG-B(A5)„FLAGSDBCHANGED**ˆCHECKEACHSDBENTRY*8SDBC91„LEA„SDBBUF+SDBSTR(PC),A1ƒGETADDRESSOF1STENTRY5ŠMOVE.L#SDBENT,D4‰NUMBEROFENTRIESTOCHECKPERSDB**ˆCHECKPDBPSN*SDB100„MOVE.L#PDBSZE,D2‰SIZ  EŠMOVE.LSDBPDP(A1),D1†PSN'ŠBEQ.S‚SDB110ZERO=EMPTYENTRY-SKIP ŠBSR„MPSNCŠBHI„SDBE50ERROR,PSN>MPSNŠBSR„TSTALCISITALLOCATED?ŠBNE„SDBE60NO,ERROR SDB101„BSR„TSTNYAMARKALLOCATED3ŠBNE„SDBE70ERRORIFALREADYALLOCATEDTOSOMETHING**ˆCHECKCATALOGNAMEOK* SDB104„EQU„**ŠMOVE.L#SDBCLG,D2‰OFFSETTOCATALOGFIELDŠMOVE.L#CLGLEN,D3‰FIELDLENGTHŠLEA„CATMSG(PC),A0ŠMOVE.L#CATMSGL,D0ŠBSR„CATCHKNO,CHECKFIELD ŠBEQ.S‚SDB105ŠMOVE.B#1,SDBFLG-B(A5)ŠBRA„SDB104CHECKAGAIN**ˆCHECKRESERVEDSPACEISZERO*SDB105„LEA„SDBRS1(A1),A2 ŠMOVE.L#1,D1ŠMOVE.L#'SDE',RESITM-B(A5)"ŠBSR„RSVCHKCHECKANDHANDLEERRORŠBEQ.S‚SDB110OK$ŠBMI„TRMREPQUITIFNOTTOFIXERROR(ŠMOVE.B#1,SDBFLG-B(A5)„FLAGSDBUPDATED*+*ˆTHISSDBENTRYLOOKSOK-CHECKNEXTONE?*+SDB110„LEA„SDBLEN(A1),A1†NEXTENTRYPOINTERŠSUB.L‚#1,D4ŽANYLEFT?ŠBNE„SDB100YES*<*ˆDONECHECKINGTHISSDB,WRITEITBACKTODISKIFNECESSARY*9SDB111„MOVE.LPSNSDB-B(A5),D1„WRITEITTODISKIFCHANGEDŠLEA„SDBBUF(PC),A1 ŠTST.B‚SDBFLG-B(A5)‡SDBUPDATED?ŠBEQ.S‚SDB115NOŠMOVE.L#SDBSZE,D2‰YESŠMOVE.L#'SDB',IOERITM-B(A5) ŠBSR„WRITSEC#ŠBNE„ABORTREP‹QUITFORNOWIFERRORŠCLR.B‚SDBFLG-B(A5)1SDB115„MOVE.LD1,PRVSDB-B(A5)„SETITASPRIORSDB)ŠMOVE.LSDBFPT(A1),D1†GETFORWARDPOINTERŠBRA„SDBC01GOCHECKNEXTSDBŠPAGE**ˆER:SDBFORWARDPOINTER‚BAD*SDBE00„LEA„LNKPSN(PC),A0ŠMOVE.LPSNSDB-B(A5),D1 ŠBSR„BIN4HEXŠLEA„LNKMSG(PC),A0ŠMOVE.L#LNKMSGL,D0ŠMOVE.LD5,LNKITM-B(A5) ŠBSR„SENDMSQCŠBEQ.S‚SDBE21TRUNCATEINNIM$ŠBRA„SDBC35INIMREPEATUPDATELOOP*'*ˆER:NEXTSDBNOTALLOCATEDINOLDSAT*.SDBE10„BTSTƒ#RCRSAT,D7‰SKIPIFTORECREATESATŠBNE„SDBC85GOSETALLOCATEDŠLEA„NALPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L#NALMSGL,D0ŠMOVE.LD5,NALITM-B(A5)/ŠBSR„SENDMSQC‹SENDERRORMSGTHATNOTALLOCATEDŠBEQ.S‚SDBE16ALLOCATEINNIMŠMOVE.L#SDBSZE,D0ŠMOVE.LD5,ALCITM-B(A5)ŠMOVE.LD5,PSNITM-B(A5)ŠBSR„DMPALCALLOCATEINIM?ŠBEQ.S‚SDBE17YES(SDBE15„BRA„SDBC35NO,REPEATUPDATELOOP!SDBE16„LEA„ALCMSG(PC),A0ŠALLOCATEŠMOVE.LD5,ALCITM-B(A5)ŠMOVE.L#ALCMSGL,D0,ŠBSR„SENDMSGŒSENDALLOCATEREPAIRACTIONMSG'SDBE17„MOVE.LSATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B#1,SATFLG-B(A5)„.FLAGSATCHANGEDŠMOVE.L#1,D0Ž. ŠBSR„ALDESCŠBRA„SDBC85GOALLOCATE***ˆER:NEXTSDB'SSECTORSALREADYALLOCATED*SDBE20„MOVE.LD5,ALEITM-B(A5)ŠLEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L#ALEMSGL,D0ŠLEA„ALEMSG(PC),A0 ŠBSR„SENDMSQC$ŠBNE„SDBC35INIMREPEATUPDATELOOPSDBE21„EQU„*’INNIM*ŠMOVE.LPSNSDB-B(A5),D1„SETUPREGISTERSTOŠMOVE.L#SDBSZE,D2‰.ŠLEA„SDBBUF(PC),A1Š.ŠBRA„SDBCTRTRUNCATEORQUITŠPAGE**ˆER:PDBLINKBAD*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‚SDBE55INIMSDBE51„LEA„DELMSG(PC),A0=ŠMOVE.L#DELCMSGL,D0‡INNIMTRUNCATEPDBCHAIN-DELETEPDB'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ŒGETNEWLINKINIMSDBE56„MOVE.LD1,SDBPDP(A1)ŠMOVE.B#1,SDBFLG-B(A5)ŠBRA„SDB100CHECKAGAIN**ˆER:PDBNOTALLOCATED*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‚SDBE65ALLOCATEINNIMŠMOVE.L#PDBSZE,D0ŠMOVE.L#'PDB',ALCITM-B(A5)ŠMOVE.L#'PDB',PSNITM-B(A5)ŠBSR„DMPALCDUMP/ALLOCATE?ŠBEQ.S‚SDBE66ALLOCATE ŠBSR„GET4HEXŠBRA„SDBE56SETNEWLINK"SDBE65„MOVE.L#'PDB',ALCITM-B(A5)ŠLEA„ALCMSG(PC),A0ŠMOVE.L#ALCMSGL,D0#ŠBSR„SENDMSGŒTELLWHATACTION‚TAKEN'SDBE66„MOVE.LSATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B#1,SATFLG-B(A5)„.FLAGSATCHANGEDŠMOVE.L#1,D0Ž. ŠBSR„ALDESCŠBRA„SDB101GOALLOCATEŠPAGE*!*ˆER:PDBSPACEALREADYALLOCATED*SDBE70„LEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„ALEMSG(PC),A0ŠMOVE.L#ALEMSGL,D0  ŠMOVE.L#'PDB',ALEITM-B(A5) ŠBSR„SENDMSQC'ŠBEQ„SDBE51INNIMTRUNCATEPDBORQUITŠMOVE.L#PDBSZE,D0ŠMOVE.L#'PDB',PSNITM-B(A5)%ŠBSR„DMPQNLDUMP/QUITORGETNEWLINKŠMOVE.LD1,SDBPDP(A1)ŠMOVE.B#1,SDBFLG-B(A5)ŠBRA„SDB100TRYAGAIN*ŠPAGEO*********************************************************************************ˆPDBƒCHECK*O******************************************************************************** PDBCHK„EQU„***ˆRESETIMIFNECESSARY*ŠBCLRƒ#NXTSTP,D7ŠBEQ.S‚PDBC00NIM ŠMOVE.B#1,D7**ˆSENDPDBCHECKMESSAGE* PDBC00„EQU„*ŠLEA„PDBMSG(PC),A0ŠMOVE.L#PDBMSGL,D0 ŠBSR„SENDMSGS2ŠMOVE.LVIDBUF+VIDSDS-B(A5),D1ƒGET1STSDBPOINTER*2*ˆPROCESSONESDBATATIMETOFINDALLPDBCHAINS*ˆREADINNEXTSDBIFANY*4PDBC01„MOVE.L#SDBSZE,D2‰NEEDTOUPDATECURRENTSDB?ŠLEA„SDBBUF(PC),A1ŠSDBBUFFERŠMOVE.L#'SDB',IOERITM-B(A5).ŠTST.B‚SDBFLG-B(A5)ŠBEQ.S‚PDBC05NO;ŠMOVE.LD1,D3‹YES,WRITEITTODISK-SAVENEXTSDBPOINTER+ŠMOVE.LPSNSDB-B(A5),D1„GETCURRENTSDBPSNŠBSR„WRITSECŒWRITEITŠBNE„ABORTREP‹QUITIFERRORNOWŠCLR.B‚SDBFLG-B(A5) ŠMOVE.LD3,D1PDBC05„TST.L‚D1‘ANYNEXTSDB?;ŠBEQ„FILCHKˆNO,DONEWITHALLPDBCHAINS-GODOFILECHECK!ŠBSR„GETSECYES,READINNEXTSDBŠBNE„ABORTREP‹QUITIFERRORNOWDŠMOVE.LD1,PSNSDB-B(A5)‚CURSDBPSN(NEEDNOPRIORSDBPSNANYMORE)7ŠLEA„SDBSTR(A1),A3†KEEPCURRENTSDBENTRYPOINTERINA3ŠMOVE.LA3,TEMP-B(A5)†.-ŠMOVE.L#SDBENT,D5‰KEEP#OFSDBENTRYSIND5**ˆCHECKIFEMPTYSDBENTRY*$PDBC10„TST.L‚SDBPDP(A3)‰EMPTYENTRY?ŠBNE.S‚PDBC12NO0PDBC11„LEA„SDBLEN(A3),A3†YES,SKIPTONEXTENTRYŠMOVE.LA3,TEMP-B(A5)†.*ŠSUB.L‚#1,D5ŽANYMOREENTRIESINTHISSDB?(ŠBNE„PDBC10YES,GOCHECKNEXTPDBCHAIN7ŠMOVE.LSDBBUF+SDBFPT-B(A5),D1ƒNO,GETNEXTSDBPOINTER&ŠBRA„PDBC01GOREADINNEXTSDBIFANYŠPAGE*:*ˆNOTEMPTY-PROCESSNEWCATALOG=PROCESSNEWPDBCHAIN.2*ˆTURNIMBACKONIFTURNEDOFFTILLNEXTCATALOG.1*ˆSEND'USER#,CATALOGNAME'IFNIMORC-OPTION.* PDBC12„BCLRƒ#NXTSTP,D7‰IMTURNED ŠBEQ.S‚PDBC13 ŠMOVE.B#1,D7PDBC13„BSR„IM‘INTERACTIVEMODE?ŠBEQ.S‚PDBC15YES;ŠMOVE.WSDBUSN(A3),D1†NO,SENDNEWUSERNUMBER,CATALOGNAME%ŠLEA„FUSERN(PC),A0ŠIFNIMORC-OPTION ŠBSR„BIN2DECŠMOVE.LSDBCLG(A3),FCATAL-B(A5)#ŠMOVE.LSDBCLG+4(A3),FCATAL+4-B(A5)ŠLEA„FFFMSG(PC),A0ŠMOVE.L#FUCMSL,D0 ŠBSR„SENDMSGS**ˆSETPDBUPDATEBOUNDS*/PDBC15„MOVE.LSDBPDP(A3),D1†GET1STPDBPOINTER!PDBC20„TST.L‚D1‘ENDOFPDBCHAIN?/ŠBEQ„PDBC11YES,GOPROCESSNEXTCATALOGIFANYPDBC25„MOVE.L#PDBSZE,D2%ŠCLR.B‚DELCRI-B(A5)‡RESETDELETEFLAG#ŠMOVE.LD1,UPDSTR-B(A5)„LOWERBOUND#ŠMOVE.LD1,UPDEND-B(A5)„UPPERBOUNDŠADD.L‚D2,UPDEND-B(A5)„.**ˆREADINFIRST/NEXTPDB*%ŠCLR.L‚D4‘INDICATENOERRORFROMREAD ŠLEA„PDBBUF(PC),A1ŠBUFFERTOUSEŠMOVE.L#'PDB',IOERITM-B(A5)4ŠTST.B‚PDBFLG-B(A5)‡NEEDTOWRITEPRIORPDBTODISK?ŠBEQ.S‚PDBC26NO#ŠMOVE.LD1,D3ŽYES,SAVENEWPDBPSN0ŠMOVE.LPSNPDB-B(A5),D1„GETPSNOFPDBTOUPDATE ŠBSR„WRITSECŠBNE„ABORTREP‹QUITIFERRORŠCLR.B‚PDBFLG-B(A5)"ŠMOVE.LD3,D1ŽRESTORENEXTPDBPSN9PDBC26„MOVE.LPSNPDB-B(A5),PRVPDB-B(A5)SETNEWPRIORPDB+ŠMOVE.LD1,PSNPDB-B(A5)„SETNEWCURRENTPDB ŠBSR„GETSECŠBEQ„PDBC60OKREAD;ŠMOVE.B#1,PDBFLG-B(A5)„SETFLAGTOUPDATEPDBIFCRCERRORŠTST.B‚D0‘CRCERROR?2ŠBEQ„PDBC60YES,IGNORE-HOPETOCORRECTBYWRITEŠPAGE**ˆIOERRORFROMREAD*4PDBCDT„MOVE.L#1,D4ŽCOULDREADIN1STSECTOROFPDB?BŠMOVE.L#'PDB',DELITM-B(A5).IFYES,DEALLOCATE/DELETECURRENTPŠMOVE.L#DELMSGL,D0ˆ.ŠLEA„DELMSG(PC),A0Š.ŠTST.L‚LSTSRD-B(A5)‡.ŠBNE.S‚PDBC30YES,GODELETE>PDBCTR„MOVE.L#2,D4ŽDIDN'TREADIN1STSECTOR-TRUNCATECHAINŠMOVE.L#'PDB',TRNITM-B(A5)ŠLEA„TRNMSG(PC),A0ŠMOVE.L#TRNMSGL,D0'PDBC30„BSR„SENDMSQC‹SENDREPAIRMESSAGE#ŠBNE„PDBC70GOREQUESTUPDATEINIM#ŠBSR„REPAIRINNIMASKFORAPPROVAL/ŠBNE„TRMREPQUITIFUSERDOESN'TWANTTOREPAIR;ŠCLR.B‚PDBFLG-B(A5)‡MAKESUREDON'TUPDATETHISPDBINDISK ŠSUB  .L‚#1,D4ŽDELETEORTRUNCATE?"ŠBEQ.S‚PDBC45DELETETHISPDBONLY*1*ˆTRUNCATEPDBCHAINBECAUSELOSTFORWARDPOINTER*PDBC35„CLR.B‚PDBFLG-B(A5)CŠMOVE.LPRVPDB-B(A5),D1„GETPREVIOUSPDB'S1STSECTORTOBEUPDATED.ŠBEQ.S‚PDBC40IFNONETHENNOPDBCHAINATALL ŠMOVE.L#1,D2ŠLEA„SDBBUF(PC),A1 ŠBSR„GETSEC!ŠBNE„TRMREPIFERRORQUITFORNOW6ŠCLR.L‚SDBBUF+SDBFPT-B(A5)PRIORSDBNOWLASTINCHAIN"ŠBSR„WRITSECŒWRITEITBACKTODISK!ŠBNE„TRMREPQUITFORNOWONERROR6ŠBRA.S‚PDBC41DONEWITHPDBCHECK-CHECKNEXTCATALOG5PDBC40„CLR.L‚SDBPDP(A3)‰DELETEDLASTPDB-NOCATALOG"ŠMOVE.B#1,SDBFLG-B(A5)„UPDATESDB$PDBC41„BRA„PDBC11GOTONEXTCATALOG*9*ˆDELETECURRENTPDBBECAUSEOFERROR,FORWARDLINKKNOWN*5PDBC45„MOVE.LPDBBUF+PDBFPT-B(A5),D4ƒGETFORWARDLINKŠCLR.B‚PDBFLG-B(A5)@ŠMOVE.LPRVPDB-B(A5),D1„GETPRIORPDB'S1STSECTORTOBEUPDATEDŠBEQ.S‚PDBC55NOPRIORPDBŠMOVE.L#1,D2ŽGETONESECTORŠLEA„PDBBUF(PC),A1ŠBSR„GETSECREADPDBSECTOR!ŠBNE„TRMREPQUITFORNOWIFERROR+ŠMOVE.LD4,PDBBUF+PDBFPT-B(A5)SETNEWLINKŠBSR„WRITSECŒUPDATEONDISK!ŠBNE„TRMREPQUITFORNOWIFERROR PDBC50„MOVE.LD4,D1ŽNEXTPDBPSNŠBRA.S‚PDBC56GOPROCESSIT2PDBC55„MOVE.LD4,SDBPDP(A3)†SETNEW1STPDBINSDB*ŠMOVE.B#1,SDBFLG-B(A5)„FLAGTOUPDATESDB ŠMOVE.LD4,D1=PDBC56„BRA„PDBC20ŒGOPROCESSNEXTPDB(MAYBENONEIFD1=0)*0*ˆINIMDUMPANDUPDATEPDB,INNIMGOCHECKPDB* PDBC60„BSR„IMŠBNE„PDB100INNIMGOCHECKPDBCPDBC65„MOVE.LPSNPDB-B(A5),D3„DUMPALLOFPDB(D3=1STPSNOFPDB)ŠMOVE.L#'PDB',PSNITM-B(A5) ŠBSR„DUMP/PDBC70„MOVE.LTEMP-B(A5),A3†RESTORESDBPOINTER'ŠMOVE.L#'PDB',UPDITM-B(A5)UPDATEPDB/ŠBSR„UPDATEREQUESTUPDATE(D4HASR-PARAMETER)*ŠDC.LƒPDB100-B‹CR4ŠDC.LƒPDBC85-B‹NTURNOFFIMTILLNEXTCATALOGCHECK@ŠDC.LƒPDBC75-B„RTERMLOOPD4=1-DELETEPDB,=2-TRUNCATECHAIN*§D4=0ISERRORAŠDC.LƒPDBC99-B‚DDELETECURRENTPDB,USE‚FORWARDLINKINPDBBUFFŠDC.LƒPDBC80-B‹AN/AŠDC.LƒTRMREP-B‹QŠDC.LƒPDBC95-B‹$PSN#ŠDC.LƒPDBC86-B‹$‚DUMPPDB(SECTORS)(ŠDC.LƒPDBC96-B‹DUMPSECTOR(S)NOTINPDBŠDC.LƒPDBC80-B‹DPSN,NN/AŠDC.LƒPDBC80-B‹APSN,NN/A-ŠDC.LƒPDBC95-B‹OFFSET-UPDATE1STPDBSECTORŠDC.LƒPDBC98-B‹C ŠDC.LƒPDBSHL-B‹?HELPshortlistŠDC.LƒPDBLHL-B‹HHELPlonglistŠPAGE PDBSHL:ƒEQU„*<ŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofmessagesŠ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.LPSNPDB-B(A5),D1 ŠADD.L‚#3,D1 ŠMOVE.L#1,D2 ŠBSR„DUMP ŠBRA„PDBC70 **ˆ'R'*$PDBC75„TST.L‚D4‘REPAIRIFREADERRORŠBEQ.S‚PDBC80ERRORŠSUB.L‚#1,D4ŽTRUNCATE?ŠBNE„PDBC35YESŠBRA.S‚PDBC99NO,DELETE)PDBC80„BSR„RESPNANOTACCEPTABLERESPONSEŠBRA„PDBC70TRYAGAIN**ˆ'N'*4PDBC85„BSETƒ#NXTSTP,D7‰TURNOFFIMTILLNEXTCATALOG ŠCLR.B‚D7#ŠBRA.S‚PDB100GOCHECKPDBCONTENTS**ˆDUMPPDB($)*PDBC86„TST.W‚D2‘NGIVEN?!ŠBEQ.S‚PDBC90NO,DUMPALLOFPDBŠCMP.W‚#PDBSZE,D2‰NTOOLARGE?ŠBLE.S‚PDBC87NOŠMOVE.W#1,D2ŽYES,USE1+PDBC87„SUB.L‚A1,A1ŽGETPSNOFSECTORWANTED ŠMOVE.WD2,A1 ŠSUB.L‚#1,A1 ŠADD.L‚A1,D1ŠMOVE.W#1,D2ŽDUMPONESECTOR ŠBRA.S‚PDBC95* *ˆDUMPPDB*PDBC90„MOVE.L#PDBSZE,D2ŠMOVE.LPSNPDB-B(A5),D1ŠBSETƒ#31,D2DUMP**ˆUPDATEORDUMPPDBREQUESTED*#PDBC95„LEA„PDBBUF(PC),A1ŠUPDATEPDBŠTST.L‚D2‘DUMPONLY?ŠBMI„PDBC65YES!ŠSUB.L‚PSNPDB-B(A5),D1„NO,UPDATE)ŠMULUƒD6,D1ŽGETSECTORADDRESSFORUPDATEŠLEA„(A1,D1),A1‰STARTŠLEA„(A1,D6),A2‰ENDŠBSR„UPDBUFUPDATEPDBSECTOR*ŠMOVE.B#1,PDBFLG-B(A5)„FLAGTOUPDATEPDB ŠBRA„PDBC70REQUESTUPDATEAGAIN**ˆDUMPANYSECTORNOTINPDB*PDBC96„MOVE.L#'„',PSNITM-B(A5) ŠBSR„UPDSECDUMP(D2BIT31SET) ŠBRA„PDBC70**ˆ'C'*:PDBC98„BSETƒ#COPTION,D7ˆCHECKONLYMODETILLERRORORDONE ŠCLR.B‚D7 ŠBRA.S‚PDB100ŠPAGE**ˆDELETECURRENTPDB*,PDBC99„MOVE.B  #1,DELCRI-B(A5)„FLAGTODELETE**ˆCHECKPDBCONTENTS* PDB100„EQU„**/*ˆCHECKPDBCATALOG/USER#SAMEASINSDBENTRY*.ŠTST.B‚DELCRI-B(A5)‡SKIPTESTIFTODELETEPDB ŠBNE„PDB104.2ŠLEA„SDBUSN(A3),A0†SDBENTRY'S‚USER#,CATALOGNAME:ŠLEA„PDBBUF+DIRUSN(PC),A1ƒPDBHEADER'S‚USER#,CATALOGNAMEŠMOVE.L#USNLEN+CLGLEN,D0#PDB101„CMP.B‚(A0)+,(A1)+ˆCHECKSAMEŠBNE.S‚PDB102ERROR ŠSUB.L‚#1,D0ŠBNE„PDB101OKSOFARŠBRA„PDB104OKCPDB102„LEA„SPNPSN(PC),A0‡ERROR-CONFLICTBETWEENPDB/SDBCATALOGIŠMOVE.LUPDSTR-B(A5),D1 ŠBSR„BIN4HEXŠLEA„SPNMSG(PC),A0ŠMOVE.L#SPNMSGL,D0ŠBSR„SENDMSQC‹SENDERRORMSG9ŠMOVE.LSDBCLG(A3),SPCCAT-B(A5)OVERLAYPRECEDINGCATALOG#ŠMOVE.LSDBCLG+4(A3),SPCCAT+4-B(A5) ŠCLR.L‚D1ŠMOVE.WSDBUSN(A3),D1ŠLEA„SPCUSN(PC),A0 ŠBSR„BIN2HEXŠLEA„SPCMSG(PC),A0#ŠMOVE.B#'S',(A0)ŠSDB'SUSER#,CATŠMOVE.L#SPCMSGL,D0 ŠBSR„SENDMSG,ŠMOVE.LDIRCLG+PDBBUF+4-B(A5),SPCCAT+4-B(A5)(ŠMOVE.LDIRCLG+PDBBUF-B(A5),SPCCAT-B(A5)ŠMOVE.WDIRUSN+PDBBUF-B(A5),D1ŠLEA„SPCUSN(PC),A0 ŠBSR„BIN2HEX ŠMOVE.L#8,D1ŽCHECKALPHANUMERICŠLEA„SPCCAT(PC),A0Š.PDB1A2„MOVE.B(A0)+,D0 ŠBSR„ALFNUMŠBEQ.S‚PDB1B2OKŠMOVE.B#'.',-(A0)PDB1B2„SUB.L‚#1,D1 ŠBNE„PDB1A2ŠLEA„SPCMSG(PC),A0#ŠMOVE.B#'P',(A0)ŠPDB'SUSER#,CATŠMOVE.L#SPCMSGL,D0 ŠBSR„SENDMSGŠBSR„SETEQLSETEQUAL?#ŠBNE„TRMREPNO...TERMINATEREPAIR,ŠMOVE.B#1,PDBFLG-B(A5)„INDICATEPDBCHANGEDŠ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‚PDB104CONTINUE PDB1D2„BSR„IMŠBEQ„PDBC70UPDATEINIMŠBRA„PDBCTRTRUNCATEINNIM**ˆCHECKNEXTPDBOK*$PDB104„MOVE.LPDBBUF+PDBFPT-B(A5),D1ŠBEQ.S‚PDB110NONEISOKŠMOVE.L#PDBSZE,D2‰CHECKPSNOK ŠBSR„MPSNC ŠBHI.S‚PDBE00NEXTPDBPSNERROR&ŠBSR„TSTALCCHECKALLOCATEDINOLDSAT"ŠBNE.S‚PDBE10ERROR,NOTALLOCATED%PDB105„BSR„TSTNYAALLOCATEINNEWSAT6ŠBNE„PDBE20ERROR,ALLOCATEDTOSOMETHINGELSEALREADY*,*ˆCHECKRESERVEDSPACEINPDBHEADERISZERO*-PDB110„TST.B‚DELCRI-B(A5)‡DELETECURRENTPDB?ŠBNE„PDBC45YES,GODELETE-ŠLEA„PDBBUF+$E(PC),A2‡STARTOFRESERVEDSPACEŠMOVE.L#2,D1ŽLENGTHŠMOVE.L#'HDR',RESITM-B(A5)"ŠBSR„RSVCHKCHECKANDHANDLEERRORŠBEQ.S‚PDB115OK$ŠBMI„TRMREPQUITIFNOTTOFIXERROR(ŠMOVE.B#1,PDBFLG-B(A5)„FLAGPDBUPDATED**ˆDONEWITHTHISPDB*9PDB115„MOVE.LPDBBUF+PDBFPT-B(A5),D1ƒGETNEXTPDBPOINTER.ŠBRA„PDBC20GOSEEIFANYMOREINTHISCATALOG**ˆER:PDBFORWARDLINKBAD* 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„PDBC70INIMREPEATUPDATELOOP3PDBE05„MOVE.L#'PDB',TRNITM-B(A5)TRUNCATEINNIM?ŠLEA„TRNMSG(PC),A0ŠMOVE.L#TRNMSGL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠBNE„TRMREPNOŠCLR.L‚PDBBUF+PDBFPT-B(A5)YES#ŠMOVE.B#1,PDBFLG-B(A5)„FLAGCHANGE ŠBRA„PDB110*'*ˆER:NEXTPDBNOTALLOCATEDINOLDSAT* PDBE10„EQU„*ŠLEA„NALPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L#NALMSGL,D0ŠMOVE.L#'PDB',NALITM-B(A5)/ŠBSR„SENDMSQC‹SENDERRORMSGTHATNOTALLOCATEDŠBEQ.S‚PDBE15ALLOCATEINNIMŠMOVE.L#PDBSZE,D0ŠMOVE.L#'PDB',ALCITM-B(A5)ŠMOVE.L#'PDB',PSNITM-B(A5)ŠBSR„DMPALCALLOCATEINIM?ŠBEQ.S‚PDBE16YES"ŠBRA„PDBC70NO,REPEATUPDATELOOPPDBE15„LEA„ALCMSG(PC),A0ŠMOVE.L#ALCMSGL,D0ŠMOVE.L#'PDB',ALCITM-B(A5) ŠBSR„SENDMSG'PDBE16„MOVE.LSATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B#1,SATFLG-B(A5)„.FLAGSATCHANGEDŠMOVE.L#1,D0Ž. ŠBSR„ALDESCŠBRA„PDB105GOALLOCATE***ˆER:NEXTPDB'SSECTORSALREADYALLOCATED*BPDBE20„CLR.B‚LSTSRD-B(A5)‡FLAGTOTRUNCATEIF1STSECTORALLOCATED ŠTST.L‚D0ŠBMI.S‚PDBE20ACŠMOVE.B#1,LSTSRD-B(A5)ƒFLAGDELETEIF1STSECTORNOTYETALLOCATED#PDBE20AƒMOVE.L#'PDB',ALEITM-B(A5)ŠLEA„ALEPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L#ALEMSGL,D0ŠLEA„ALEMSG(PC),A0 ŠBSR„SENDMSQC$ŠBNE„PDBC70INIMREPEATUPDATELOOPŠTST.B‚LSTSRD-B(A5)‡TRUNCATE?*ŠBEQ„PDBE05YES,THISPDBISLASTINCHAINŠMOVE.L#DELMSGL,D0  ŠLEA„DELMSG(PC),A0ŠMOVE.L#'PDB',DELITM-B(A5)ŠBSR„SENDMSGŒDELETEPDB? ŠBSR„REPAIRŠBNE„TRMREPNO7ŠBSR„WRTSBFŒYES,WRITECURRENTSECTORBUFFERIFCHANGED ŠBNE„TRMREP,ŠLEA„SECBUF(PC),A1ŠDELETEPDB-UPDATELINKSEŠMOVE.LPDBBUF+PDBFPT-B(A5),D1GETNXTLINKFROMNXTPDB'S1STSECTOR$ŠMOVE.L#1,D2Ž.READJUSTONESECTOR ŠBSR„GETSEC ŠBNE„TRMREPŠMOVE.LD1,PSNSEC-B(A5)'* SET NEW NEXT PDB LINK (=DEL NEXT PDB)/ŠMOVE.LSECBUF+PDBFPT-B(A5),PDBBUF+PDBFPT-B(A5)ŠLEA„PDBBUF(PC),A1ŠMOVE.B#1,PDBFLG-B(A5)ŠBRA„PDB104CHECKNEWLINKŠPAGEO*********************************************************************************ˆFILEƒCHECK*O******************************************************************************** FILCHK„EQU„**&*ˆWRITEANYUPDATEDSDBORPDBTODISK*ŠTST.B‚SDBFLG-B(A5)ŠBEQ.S‚FILC0ŽSDBNOTCHANGEDŠMOVE.L#SDBSZE,D2ŠMOVE.LPSNSDB-B(A5),D1ŠLEA„SDBBUF(PC),A1 ŠBSR„WRITSECŠBNE„ABORTREP‹QUITNOWIFERRORŠCLR.B‚SDBFLG-B(A5)FILC0…TST.B‚PDBFLG-B(A5)ŠBEQ.S‚FILC1ŽPDBNOTCHANGEDŠLEA„PDBBUF(PC),A1ŠMOVE.L#PDBSZE,D2ŠMOVE.LPSNPDB-B(A5),D1 ŠBSR„WRITSECŠBNE„ABORTREP‹QUITNOWIFERRORŠCLR.B‚PDBFLG-B(A5)FILC1…CLR.L‚PSNSDB-B(A5)ŠCLR.L‚PSNPDB-B(A5)**ˆTURNIMBACKONIFNECESSARY*ŠBCLRƒ#NXTSTP,D7 ŠBEQ.S‚FILC00 ŠMOVE.B#1,D7**ˆSEND'FILECHECKMESSAGE'*FILC00„LEA„FILMSG(PC),A0ŠMOVE.L#FILMSGL,D0 ŠBSR„SENDMSGS4ŠMOVE.LVIDSDS+VIDBUF-B(A5),D1ƒGETFIRSTSDBPOINTER**ˆGET1ST/NEXTSDBINTOMEMORY*FILC10„MOVE.L#SDBSZE,D2ŠTST.L‚D1‘D1=NEXTSDB'SPSNŠBNE.S‚FILC11ANYMORESDB'S?"ŠBTSTƒ#FREPAIR,D7ˆNO,FILEREPAIR?;ŠBEQ„FSATCKˆNO,DONE-NOMORESDBS-GODOFINALSATCHECK,ŠLEA„FNFMSG(PC),A0ŠYES,FILENOTFOUNDERRORŠMOVE.L#FNFMSGL,D0 ŠBSR„SENDMSGS ŠBRA„TRMREPFILC11„LEA„SDBBUF(PC),A1ŠMOVE.L#'SDB',IOERITM-B(A5)2ŠBSR„GETSEC(NEEDNOTTOWRITESDB'SBACKANYMORE)2ŠBNE„ABORTREP‹READERRORNOWCAUSESREPAIRTOQUITI‡LEASDBBUF+SDBSTR(PC),A3KEEPCURRENTSDBENTRYINA3(DON'TNEEDPSNSDB<ŠMOVE.LA3,TEMP-B(A5)†.ANYMORESINCEWILLNOTUPDATESDB'S)8ŠMOVE.L#SDBENT,D5‰KEEPNUMBEROFSDBENTRIESLEFTIND5*B*ˆGET1ST/NEXTSDBENTRYTOGETPDBCHAINSTARTINGPSNFORCATALOG*#FILC15„TST.L‚SDBPDP(A3)‰PDBPOINTERŠBNE.S‚FILC21EMPTYENTRY?6FILC20„LEA„SDBLEN(A3),A3†YES,SKIP,GETNEXTSDBENTRYŠMOVE.LA3,TEMP-B(A5)†.'ŠSUB.L‚#1,D5ŽANYMORELEFTINTHISSDB?ŠBNE.S‚FILC15YES/ŠMOVE.LSDBBUF+SDBFPT-B(A5),D1ƒNO,GETNEXTSDB ŠBRA„FILC10**ˆPROCESSNEWCATALOG'SFILES*7FILC21„MOVE.LSDBCLG(A3),FCATAL-B(A5)SAVECATALOGNAME#ŠMOVE.LSDBCLG+4(A3),FCATAL+4-B(A5) ŠCLR.L‚D1%ŠMOVE.WSDBUSN(A3),D1†GETUSERNUMBERŠLEA„FUSERN(PC),A0#ŠBSR„BIN2DECŒCHANGEITINTODECIMAL*/*ˆIFFILEREPAIRSKIPALLBUTSPECIFIEDCATALOG*ŠBTSTƒ#FREPAIR,D76ŠBEQ.S‚FILC22SKIPCATALOGNAMECHECKIFVOLUMEREPAIR,ŠBSR„CMATCHCHECKIFTHISCATALOGISTHEONE8ŠBNE„FILC20‹NOMATCH-CONTINUESEARCHFORGIVENCATALOG&ŠBSR„UMATCHSEEIFUSERNUMBERMATCHESŠBNE„FILC20BRANCHIFNOT/FILC22„MOVE.LSDBPDP(A3),D1†GET1STPDBPOINTER>ŠBCLRƒ#NXTSTP,D7†TURNIMBACKONFORNEXTCATALOGIFNECESSARY ŠBEQ.S‚FILC25 ŠMOVE.B#1,D7**ˆGET1ST/NEXTPDBINTOMEMORY*FILC25„MOVE.L#PDBSZE,D24ŠTST.L‚D1‘ANYMOREDIRECTORYBLOCKSFORTHISCATALOG"ŠBEQ„FILC20NO,GOTONEXTCATALOGŠLEA„PDBBUF(PC),A1ŠMOVE.L#'PDB',IOERITM-B(A5)9ŠTST.B‚PDBFLG-B(A5)‡NEEDTOWRITEPRIORPDBBACKTODISK?)ŠBEQ.S‚FILC30NO,ITHASNOTBEENCHANGED$ŠMOVE.LD1,D3ŽYES,SAVENEXTPDBPSNŠMOVE.LPSNPDB-B(A5),D1ŠBSR„WRITSECŒABORTIFERROR ŠBNE„ABORTREP!ŠMOVE.LD3,D1ŽRESTORENEWPDBPSN*ŠCLR.B‚PDBFLG-B(A5)‡CLEARPDBCHANGEDFLAG"FILC30„BSR„GETSECREADINNEXTPDB'ŠBNE„ABORTREP‹QUITIFERRORONREADNOWDŠMOVE.LD1,PSNPDB-B(A5)‚SETNEWCURRENTPDBPOINTER(NEEDNOPRVPDB)ŠPAGE**ˆSETUPDATEBOUNDS*ŠMOVE.LD1,UPDSTR-B(A5)ŠMOVE.LD1,UPDEND-B(A5)ŠADD.L‚D2,UPDEND-B(A5)>ŠLEA„PDBBUF+PDBSTR(PC),A2ƒKEEPCURRENTPDBENTRYPOINT ERINA23ŠMOVE.L#PDBENT,D4‰KEEPNUMBEROFPDBENTRIESIND4*9*ˆGET1ST/NEXTPDBENTRYFORCATALOG=NEXTFILETOCHECK*2FILC35„TST.B‚DIRFIL(A2)‰EMPTYENTRY,DELETEDFILE?ŠBNE.S‚FILC50NOŠTST.L‚DIRFIL(A2)‰DELETEDFILE?ŠBNE.S‚FILC45YES8FILC40„LEA„PDBLEN(A2),A2†NO,EMPTYENTRY,GETNEXTENTRYŠCLR.B‚RCVFLG-B(A5)‡RESETFLAGSŠCLR.B‚DELCRI-B(A5)ŠCLR.B‚FILOK-B(A5)3ŠSUB.L‚#1,D4ŽANYMOREPDBENTRIESLEFTINTHISONE?ŠBNE„FILC35YES6ŠMOVE.LPDBBUF+PDBFPT-B(A5),D1ƒNO,GETNEXTPDBIFANY ŠBRA„FILC25*;*ˆTHISENTRYBELONGSTOADELETEDFILE-TRYTORECOVERIT?**FILC45„BTSTƒ#ROPTION,D7ˆRECOVEROPTIONON?'ŠBEQ„FILC40NO-SKIPALLDELETEDFILES8ŠMOVE.B#1,DELCRI-B(A5)„FLAGDELETEDENTRY(DELETEDFILE)1FILC50„BTSTƒ#FREPAIR,D7ˆWANTONLYSPECIFIEDFILE?ŠBEQ.S‚FILC51NOBŠBSR„FMATCHYES,CHECKIFTHISISTHEDELETEDFILETOBERECOVERED'ŠBNE„FILC40IT'SNOT,SKIPTONEXTFILE2ŠBSETƒ#FOUNDF,D7‰FOUNDFILE,QUITAFTERFILECHECK?FILC51„BCLRƒ#STP1,D7‹TURNIMBACKONFORNEXTFILEIFNECESSARYŠBEQ.S‚FILC52NIM ŠMOVE.B#1,D7 FILC52„BSR„IMŠBEQ.S‚FILC54INTERACTIVEMODE*D*ˆINNONINTERACTIVEMODESENDFILENAME.IFDELETEDFILEASKIFUSER*ˆWANTSTORECOVERFILE.*ŠBSR„PFILNMSENDFILENAMEŠTST.B‚DIRFIL(A2)‰DELETEDFILE?(ŠBNE„FIL100NO,GOCONTINUEFILE'SCHECK4ŠLEA„RCVMSG(PC),A0ŠASKIFUSERWANTSTORECOVERFILEŠMOVE.L#RCVMSGL,D0 ŠBSR„SENDMSG ŠBSR„GETRYN'ŠBNE„FIL999SKIPIFNOTTORECOVERFILEŠBTSTƒ#FREPAIR,D7ˆFILEREPAIR?ŠBEQ.S‚FILC53NO@ŠMOVE.BFILNAM-B(A5),DIRFIL(A2)‚YES,USEFIRSTCHAROFFILENAMEŠBRA.S‚FILC53A-FILC53„LEA„GNFMSG(PC),A0Š'GIVENEWFILENAME'ŠMOVE.L#GNFMSGL,D0 ŠBSR„SENDMSG ŠMOVE.LA2,A1ŠMOVE.L#DIRFIL,D2$ŠMOVE.L#8,D3ŽFILENAMEFIELDLENGTHDŠBSR‚NEWFLDGETNEWFILENAME(OR‚ATLEAST1STBYTEMUSTBEREPLACED)DFILC53AƒMOVE.B#1,PDBFLG-B(A5)„SETPDBCHANGEDFLAGFORFUTUREWRITE4ŠMOVE.B#1,RCVFLG-B(A5)„FLAGRECOVERINGDELETEDFILE"ŠBRA„FIL100GOTRYTORECOVERFILEŠPAGE*4*ˆININTERACTIVEMODEDUMPPDBENTRY,ASKFORUPDATE*FILC54„LEA„PDBBUF(PC),A1 ŠMOVE.LA2,D2!ŠSUB.L‚A1,D2ŽD2=OFFSETTOENTRY!ŠMOVE.L#PDBLEN,D3‰LENGTHTODUMP ŠBSR„DUMPBFŠMOVE.L#'PDE',UPDITM-B(A5)/FILC55„MOVE.LTEMP-B(A5),A3†RESTORESDBPOINTER ŠBSR„UPDATE*ŠDC.LƒFILC95-B‹CRŠDC.LƒFILC90-B‹N(ŠDC.LƒFILC99-B‹RRECOVERIFDELETEDFILEŠDC.LƒFILC85-B‹DDELETEFILEŠDC.LƒFILC60-B‹AN/AŠDC.LƒTRMREP-B‹QŠDC.LƒFILC65-B‹$PSNINRANGEŠDC.LƒFILC54-B‹$DUMPENTRY ŠDC.LƒFILC80-B‹$PSNOUTOFRANGEŠDC.LƒFILC60-B‹DPSN‚N/AŠDC.LƒFILC60-B‹APSN‚N/AŠDC.LƒFILC66-B‹OFFSETŠDC.LƒFILC91-B‹C ŠDC.LƒFILSHL-B‹?HELPshortlistŠDC.LƒFILLHL-B‹HHELPlonglist FILSHL:ƒEQU„*<ŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofmessagesŠ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 **ˆNOTACCEPTABLERESPONSE*$FILC60„BSR„RESPNASENDERRORMESSAGEŠBRA„FILC55TRYAGAINŠPAGE*)*ˆDUMPPDBSECTOR(S),ORUPDATEPDBENTRY*FILC65„LEA„PDBBUF(PC),A1 ŠTST.L‚D2ŠBMI.S‚FILC75DUMP?ŠBRA„FILC60NO,UPDATE-ERROR-FILC66„MOVE.LA2,A1ŽCANUPDATEONLYPDBENTRY ŠMOVE.LA2,D3'ŠLEA„PDBLEN(A2),A2†ENTRYENDFORUPDATEŠBSR„UPDBUFUPDATEENTRY"ŠMOVE.B#1,PDBFLG-B(A5)„UPDATEPDB'ŠMOVE.LD3,A2ŽRESTOREPDBENTRYPOINTER ŠBRA„FILC550FILC75„MOVE.LPSNPDB-B(A5),D3„DUMPPDBSECTOR(S)ŠMOVE.L#'PDB',PSNITM-B(A5) ŠBSR„DUMP ŠBRA„FILC55**ˆDUMPANYSECTOR*FILC80„MOVE.L#'„',PSNITM-B(A5) ŠBSR„UPDSEC ŠBRA„FILC55* *ˆDELETEFILE* FILC85„EQU„*AŠCLR.B‚DIRFIL(A2)„DELETEFILE=>ZEROOUTFIRSTBYTEOFFILENAMEDŠMOVE.B#1,PDBFLG-B(A5)‚FLAGPDBCHANGEDANDMUSTBEUPDATEDONDISK$FILC89„BRA„FIL999GOCHECKNEXTFILE*#*ˆN-TURNIMOFFTILLNEXTCATALOG*FILC90„BSETƒ#NXTSTP,D7 ŠCLR.B‚D7 ŠBRA.S‚FILC95**ˆ'C'*:FILC91„BSETƒ#COPTION,D7ˆCHECKONLYMODETILLERRORORDONE ŠCLR.B‚D7**ˆCR*,FILC95„TST.B‚DIRFIL(A2)‰SKIP FILEIFDELETED ŠBEQ„FILC89 ŠBRA.S‚FIL100*6*ˆR-RECOVERDELETEDFILE,IGNOREIFNOTDELETEDFILE,*ˆ(CONTINUEWITHPDBENTRYCHECK/FILECHECK)*;FILC99„TST.B‚DELCRI-B(A5)‡ERRORIFNOTDELETEDFILEATHAND ŠBEQ„FILC60(ŠTST.B‚DIRFIL(A2)‰CHECKHEGAVENEWNAMEŠBEQ„FILC60ERRORIFDIDN'T,ŠMOVE.B#1,RCVFLG-B(A5)„FLAGRECOVERINGFILEŠCLR.B‚DELCRI-B(A5)ŠPAGE**ˆCHECKPDBENTRY* FIL100„EQU„***‡CHECKFILENAME*-ŠCLR.B‚DELCRI-B(A5)‡DISABLER-UPDATERESPONSEŠTST.B‚DIRFIL(A2)‰FILEDELETED?ŠBEQ.S‚FIL102YES,SKIPENTRYŠLEA„DIRFIL(A2),A1 ŠCLR.L‚D2 ŠMOVE.L#8,D3ŠMOVE.L#FNEMSGL,D0-ŠBSETƒ#31,D0FLAGTOALLOW&ATSTARTOFNAMEŠLEA„FNEMSG(PC),A0 ŠBSR„NAMECKEŠBEQ.S‚FIL105FILENAMEOK(DOESNOTCHECKFORDUPLICATENAMEERRORS)ŠMOVE.B#1,PDBFLG-B(A5) ŠTST.L‚D0 ŠBNE„FIL100FIL101„CLR.B‚(A1)DELETEDFILE?(FIL102„BRA„FIL999YES,SKIPDELETEDFILE**ˆCHECKEXTENSION*FIL105„LEA„DIREXT(A2),A1 ŠCLR.L‚D2 ŠMOVE.L#2,D3ŠMOVE.L#EXTMSGL,D0ŠLEA„EXTMSG(PC),A0 ŠBSR„NAMECKŠBEQ.S‚FIL106OK ŠTST.L‚D0ŠBEQ„FIL105CHEKCAGAINŠMOVE.B#1,PDBFLG-B(A5)%ŠBRA„FIL105CHECKNEWEXTENSIONAGAIN**ˆCHECKRESERVEDSPACEISZERO*FIL106„MOVE.LA2,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„FIL999SKIPIFNOTTOFIXFIELDŠMOVE.B#1,PDBFLG-B(A5)FIL108„LEA„DIRRS3(A0),A2 ŠMOVE.L#8,D1 ŠBSR„RSVCHKŠBEQ.S‚FIL109OK$ŠBMI„FIL999SKIPIFNOTTOFIXFIELDŠMOVE.B#1,PDBFLG-B(A5)5FIL109„MOVE.LA0,A2ŽRESTORECURRENTPDBENTRYPOINTER**ˆCHECKATTRIBUTES*ŠMOVE.BDIRATT(A2),D09ŠANDI.B#DFTBIT,D0‰MASKALLBUTFILETYPEBITS*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ŠATTRIBUTEERRORŠMOVE.L#ATEMSGL,D0 ŠBSR„SENDMSQC$ŠBNE„FILC55REPEATUPDATELOOPINIM<ŠBSR„DELFIL‡DELETEFILEORSKIPITUNDERUSERCONTROLINNIM ŠBRA„FIL999ŠPAGE**ˆ**********************ˆCONTIGUOUSFILECHECK*ˆ********************** FIL200„EQU„****ˆCHECKSTARTINGPSN/LENGTH‚OKFORSEGMENT*ŠMOVE.LDIRFS(A2),D1ŠBEQ.S‚FIL2E10ŒZEROISNOTOKŠMOVE.LDIRFE(A2),D2ŠADD.L‚#1,D2ŽLENGTHINSECTORS ŠBSR„MPSNCŠBHI.S‚FIL2E10ŒERRORŠTST.B‚RCVFLG-B(A5)&ŠBNE.S‚FIL205RECOVERINGDELETEDFILE?"ŠBSR„TSTALCNO,SEGMENTALLOCATED?ŠBNE„FIL2E30ŒNO,ERRORŠBRA.S‚FIL210YES?FIL205„BSR„TSTFREŠCHEKCSPACESTILLFREEANDREALLOCATEIFFREEŠBNE„FIL2E50ŒERROR3FIL210„BSR„TSTNYACHECKSPACENOTALREADYALLOCATEDŠBNE„FIL2E40ŒERROR**ˆCHECKRESERVEDSPACEISZERO*$ŠMOVE.LA2,D3ŽSAVEPDBENTRYPOINTER&ŠLEA„DIREOF(A2),A2†DIREOF,DIREOR=0? ŠMOVE.L#8,D1ŠMOVE.L#'PDE',RESITM-B(A5) ŠBSR„RSVCHKŠBEQ.S‚FIL220OK$ŠBMI„FIL999SKIPIFNOTTOFIXFIELD$ŠMOVE.B#1,PDBFLG-B(A5)„ZEROEDFIELDFIL220„MOVE.LD3,A2<ŠLEA„DIRLBZ(A2),A2†DIRLBZ,-LRL,-RS2,-KEY,-FAB,-DAT=0? ŠMOVE.L#7,D1 ŠBSR„RSVCHKŠBEQ.S‚FIL230OK$ŠBMI„FIL999SKIPIFNOTTOFIXFIELDŠMOVE.B#1,PDBFLG-B(A5)„ZEROED'FIL230„MOVE.LD3,A2ŽRESTOREPDBPOINTER!ŠMOVE.B#1,FILOK-B(A5)…FILEISOKŠBRA„FIL999DONE‚WITHFILE**ˆER:DBSTART/LENGTHERROR* FIL2E10ƒEQU„*#ŠLEA„DBPPSN(PC),A0ŠSETPSNINTOMSG ŠBSR„BIN4HEX!ŠMOVE.LD2,D1ŽSETLENGTHINTOMSGŠLEA„DBPLEN(PC),A0 ŠBSR„BIN4HEXŠLEA„DBPMSG(PC),A0ŠMOVE.L#DBPMSGL,D0 ŠBSR„SENDMSQC-ŠBNE„FILC55INIMGOASKFORPDBENTRYUPDATE&ŠBSR„DELFILINNIMDELETEORSKIPFILE ŠBRA„FIL999*"*ˆER:SEGMENTNOTALLOCATEDINSAT*FIL2E30ƒLEA„NALPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L#NALMSGL,D0ŠMOVE.L#'DB',NALITM-B(A5)'ŠBSR„SENDMSQC‹SENDDBNOTALLOCATEDMSGŠBEQ.S‚FIL2E36ŒALLOCATEINNIM ŠMOVE.LD2,D0ŠMOVE.L#'DB',PSNITM-B(A5) ŠBSR„DMPALCŠBEQ.S‚FIL2E37ŒALLOCATE&FIL2E35ƒBSR„DELFILDELETEORSKIPFILE ŠBRA„FIL999'FIL2E36ƒLE A„ALCMSG(PC),A0Š'R:ALLOCATE'ŠMOVE.L#'DB',ALCITM-B(A5)ŠMOVE.L#ALCMSGL,D0 ŠBSR„SENDMSG(FIL2E37ƒMOVE.LSATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B#1,SATFLG-B(A5)„.FLAGSATCHANGEDŠMOVE.L#1,D0Ž. ŠBSR„ALDESC ŠBRA„FIL210*&*ˆER:SEGMENTALREADYMARKEDALLOCATED*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ŒDELETEORSKIPFILEIFNIM#ŠBRA„FILC55GOTOUPDATELOOPINIM*,*ˆER:SEGMENTREALLOCATEDAFTERFILEDELETED*#FIL2E50ƒMOVE.L#'DB',FADITM-B(A5)ŠLEA„FADPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„FADMSG(PC),A0ŠMOVE.L#FADMSGL,D0 ŠBSR„SENDMSQCŠBSR„DELFILDELETEORSKIPFILE ŠBRA„FIL999ŠPAGE*"*ˆ********************************"*ˆDUPLICATEKEYINDEXEDFILECHECK"*ˆ********************************* FIL300„EQU„***ˆCHECKDIRECTORYENTRY* ŠBSR„CDIRNCŠBEQ.S‚FIL310OKŠTST.L‚D0‘UPDATEORSKIP/DELETEŠBNE„FILC55UPDATEPDBENTRY ŠBRA„FIL999SKIPORDELETEDFILE**ˆCHECKKEYSIZEISOK*FIL310„CLR.L‚D0ŠMOVE.BDIRKEY(A2),D0ŠMOVE.BD0,KEYLEN-B(A5)„SAVEŠBTSTƒ#0,D0ŽMUSTBEEVENNUMBERŠBNE.S‚FIL3E00ŒERRORŠTST.W‚DIRLRL(A2)‰VRL!ŠBEQ.S‚FIL315YES,SKIPKEYCHECK9ŠCMP.W‚DIRLRL(A2),D0†CHECKNOTGREATERTHANRECORDLENGTHŠBHI.S‚FIL3E00ŒERROR1FIL315„CMP.B‚#100,D0ŒCHECKNOTMORETHANMAXSIZEŠBHI.S‚FIL3E00**ˆCHECKFABSANDDATABLOCKS*4FIL320„MOVE.B#1,KEYDUP-B(A5)„SETDUPLICATEKEYFLAG ŠBSR„FDBCHK ŠBRA„FIL999**ˆER:KEYLENGTH* FIL3E00ƒEQU„*ŠMOVE.B#'D',D1 ŠBSR.S‚HKEYERŠBNE.S‚FIL3E10ŒIMŠBSR„ZROUTŽZEROKEYFIELD?ŠBEQ.S‚FIL3E05ŒYESŠBSR„DELFILNOŠBRA„FIL999SKIP‚ORDELETEFILE%FIL3E05ƒCLR.B‚DIRKEY(A2)‰ZEROOUTKEYŠMOVE.B#1,PDBFLG-B(A5)ŠBRA„FIL320CONTINUE*FIL3E10ƒBSR„GETNEW4ŒINIMGETNEWKEYSIZE"ŠCMP.L‚#100,D1ŒCHECKNOTTOOLARGEŠBHI.S‚FIL3E20(ŠMOVE.BD1,DIRKEY(A2)†SETNEWKEY‚LENGTHŠMOVE.B#1,PDBFLG-B(A5)ŠBRA„FIL310CHECKSIZEAGAINFIL3E20ƒBSR„RESPNAŠBRA„FIL3E10ŒGETSIZEAGAINŠPAGE*"*ˆHKEYERSUBROUTINEFORFILECHECK* HKEYER„EQU„**ŠMOVE.BD1,KEYATR-B(A5)ŠLEA„KEYFLD(PC),A0 ŠMOVE.LD0,D1 ŠBSR„BIN1HEXŠLEA„KEYMSG(PC),A0ŠMOVE.L#KEYMSGL,D0 ŠBSR„SENDMSQCŠRTSŠPAGE**ˆ*******************ˆINDEXEDFILECHECK*ˆ*******************FIL400**ˆCHECKDIRECTORYENTRY* ŠBSR„CDIRNCŠBEQ.S‚FIL410OKŠTST.L‚D0‘UPDATEORSKIP/DELETEŠBNE„FILC55UPDATEPDBENTRY ŠBRA„FIL999SKIPORDELETEDFILE**ˆCHECKKEYSIZEISOK*FIL410„CLR.L‚D0ŠMOVE.BDIRKEY(A2),D0ŠMOVE.BD0,KEYLEN-B(A5)„SAVE!ŠBEQ.S‚FIL4E00ŒERRORIFZEROKEYSŠBTSTƒ#0,D0ŽMUSTBEEVENNUMBERŠBNE.S‚FIL4E00ŒERRORŠTST.W‚DIRLRL(A2)‰VRL!ŠBEQ.S‚FIL415YES,SKIPKEYCHECK9ŠCMP.W‚DIRLRL(A2),D0†CHECKNOTGREATERTHANRECORDLENGTHŠBHI.S‚FIL4E00ŒERROR1FIL415„CMP.B‚#100,D0ŒCHECKNOTMORETHANMAXSIZEŠBHI.S‚FIL4E00**ˆCHECKFABSANDDATABLOCKS*4FIL420„CLR.B‚KEYDUP-B(A5)‡SETNODUPLICATEKEYSFLAG ŠBSR„FDBCHK ŠBRA.S‚FIL999**ˆER:KEYLENGTH* FIL4E00ƒEQU„*ŠMOVE.B#'I',D1 ŠBSR„HKEYERŠBNE.S‚FIL4E10ŒIM)ŠBSR„DELFILNO,NIM‚-DELETEORSKIPFILE ŠBRA.S‚FIL999$FIL4E10ƒBSR„GETNEW4ŒGETNEWKEYSIZE"ŠCMP.L‚#100,D1ŒCHECKNOTTOOLARGEŠBHI.S‚FIL4E20ŠMOVE.BD1,DIRKEY(A2)ŠMOVE.B#1,PDBFLG-B(A5) ŠBRA„FIL410CHECKKEYSIZEAGAINFIL4E20ƒBSR„RESPNA ŠBRA„FIL4E10ŠPAGE**ˆ**********************ˆSEQUENTIALFILECHECK*ˆ********************** FIL500„EQU„**ˆCHECKDIRECTORYENTRY* ŠBSR„CDIRNCŠBEQ.S‚FIL510OKŠTST.L‚D0‘UPDATEORSKIP/DELETEŠBNE„FILC55UPDATEPDBENTRY"ŠBRA.S‚FIL999SKIPORDELETEDFILE**ˆCHECKKEYSIZEISOK*FIL510„MOVE.BDIRKEY(A2),D0ŠMOVE.BD0,KEYLEN-B(A5)„SAVE ŠBNE.S‚FIL5E00ŒERRORIFNOTZERO**ˆCHECKFABSANDDATABLOCKS*4FIL520„CLR.B‚KEYDUP-B(A5)‡SETNODUPLICATEKEYSFLAG ŠBSR„FDBCHK ŠBRA.S‚FIL999**ˆER:KEYLENGTH* FIL5E00ƒEQU„*ŠMOVE.B#'S',D1 ŠBSR„HKEYERŠBSR„ZROUTŽZEROKEYFIELD?ŠBNE.S‚FIL5E10ŒNOŠCLR.B‚DIRKEY(A2)‰YESŠMOVE.B#1,PDBFL G-B(A5)ŠBRA„FIL520CONTINUE&FIL5E10ƒBSR„DELFILSKIPORDELETEFILEŠPAGE*@*ˆDONEFILECHECK-CHECKNEXTFILEUNLESSDONEWITHFILEREPAIR* FIL999„EQU„*ŠBTSTƒ#FOUNDF,D7‰FOUNDFILE?7ŠBEQ„FILC40ŒNO,CONTINUECHECKINGFILES(VOLUMEREPAIR) ŠTST.B‚FILOK-B(A5)ˆYES,FILEOK?ŠBEQ„REPDONEŒNO'REPAIRDONE'!ŠLEA„FOKMSG(PC),A0ŠYES,'FILEOK'ŠMOVE.L#FOKMSGL,D0 ŠBSR„SENDMSGS ŠBRA„REPDONEŠPAGE*O*******************************************************************************O*********************************************************************************™SUBROUTINES*O*******************************************************************************O*********************************************************************************‰CLEANUP:’1.00‰12/22/84RJ*O********************************************************************************=*‰THEUSEOFTHE'K'OPTIONENVOKESTHISSUBROUTINEDIRECTLY.9*‰THISSHOULDONLYBEDONEFORTESTINGPURPOSESONLY,FORB*‰THEASSUMPTIONISMADETHATALLDIRECTORYSTRUCTURESAREINTACT.3*‰CLEANUPDELETESALLEMPTYSDBANDPDBSTRUCTURES.5*‰NOQUESTIONSAREASKEDDURINGTHEDELETIONPROCESS.*'*‰ONENTRY:‚NOREGISTERVALUESREQUIRED*&*‰ONRETURN:NOREGISTERSAREMODIFIED*O*********************************************************************************ŠEMPTYDATASTRUCTUREDELETION*O*******************************************************************************ŠPAGE CLEANUPƒEQU„*-ŠMOVEM.LD0-D7/A0-A6,-(A7)SaveallregistersŠLEA„VIDBUF(PC),A1ŠCLR„D1 ŠMOVE.L#1,D2ŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6ŠMOVE.L#'VID',IOERITM-B(A5) ŠBSR„GETSECreadVIDintobuffer ŠBNE„ABORTREPŠMOVE.LTEMP-B(A5),D6 <ŠMOVE.LVIDBUF+VIDSDS-B(A5),D1‚dowehaveatleastoneSDB?0ŠBEQ„COMPEXno...exit,noneedtoprintmessage 3ŠLEA„CLNMSG(PC),A0ŠSend"STRUCTURECLEANUP"messageŠMOVE.L#CLNMSGL,D0ˆ...ŠBSR„SENDMSGS‹...  +*ˆALLOCATESATBUFFERACCORDINGTOSATSIZE* ŠCLR.L‚D2%ŠMOVE.WVIDSAL(A1),D2†SATSECTORSIZEŠMULUƒD6,D2ŽGETBYTECOUNT"ŠMOVE.LD2,D1Ž.ALLOCATE2BUFFERSŠLSL.L‚#1,D1Ž.ŠMOVE.L#SATSEG,D0‰SEGMENTNAMEŠBSR„GETSEGGETSEGMENT4ŠMOVE.LA1,SATABUF-B(A5)ƒSAVESATSTARTINGADDRESSESŠADD.L‚D2,A1Ž.ŠMOVE.LA1,SATDBUF-B(A5)ƒ.  *‰READSATINTOBUFFER ŠCLR.L‚D2ŠLEA„VIDBUF(PC),A1ŠMOVE.LVIDBUF+VIDSAT-B(A5),D1ŠMOVE.WVIDBUF+VIDSAL-B(A5),D2ŠMOVE.LSATDBUF-B(A5),A1ŠMOVE.L#'SAT',IOERITM-B(A5) ŠBSR„GETSEC ŠBNE„ABORTREP ŠPAGE**‰INITIALIZEDELETIONCOUNTERS*;ŠMOVE.L#0,SDBDEL-B(A5)„initializethedeletedSDBscounter;ŠMOVE.L#0,PDBDEL-B(A5)„initializethedeletedPDBscounter* SDB010„EQU„*=ŠCLR.B‚LSSDBFLG-B(A5)…indicatethelaststructurewastheVID 2ŠLEAƒSDBBUF(PC),A4‹setthebufferpointerpointing7ŠMOVE.LA4,USESBUF-B(A5)ƒtothefirstbuffertobeused 8ŠLEA„SDB2BUF(PC),A4‰loadpointerfieldofbuffer#1with/ŠMOVE.LA4,SPTR1-B(A5)…theaddressofbuffer#2 7ŠLEAƒSDBBUF(PC),A4‹loadpointerfieldofbuffer#2with/ŠMOVE.LA4,SPTR2-B(A5)…theaddressofbuffer#1 (ŠMOVE.LVIDSDS+VIDBUF-B(A5),PSNSDB-B(A5)*§getPSNof1stSDB *‰ENDOFSDBCHAIN? SDB020„EQU„*<ŠMOVE.LPSNSDB-B(A5),D1„areweattheendoftheSDBchain?1ŠBEQ„COMPLETE‹yes...godothecompletionprocess'*§(makesuretheupdatedstructuresare*§writtenbacktodisk.) ŠPAGE*‰READNEXTSDBINTOBUFFER ŠCLR.L‚D4*ŠMOVE.LUSESBUF-B(A5),A1ƒbuffertobeusedŠMOVE.L#SDBSZE,D2ŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6ŠMOVE.L#'SDB',IOERITM-B(A5)ŠBSR„GETSECReadinSDB./ŠBNE„ABORTREP‹Readerrorcausesrepairtoquit.ŠMOVE.LTEMP-B(A5),D6  *ˆSAVEPSNOFNEXTSDB SDB025„EQU„*ŠMOVE.LUSESBUF-B(A5),A0ŠMOVE.LSDBFPT(A0),NXTSDB-B(A5)  *‰INITIALIZE‚SDECOUNTERS #ŠCLR.L‚D4‘D4=numberofemptySDEs5ŠMOVE.L#SDBENT,D5‰numberofentriestocheckperSDB  (*‰AREWEATTHEENDOFTHEPRESENTSDB? SDB030„EQU„*#ŠTST.L‚D5‘attheendofthe SDByetŠBNE„SDB040no...gocheckSDEs  *‰EMPTYSDB? (ŠCMP.L‚#SDBENT,D4‰arealltheSDEsemptyŠBNE.S‚SDBNEMTŒno...EŠMOVE.BLSSDBFLG-B(A5),D0‚havewereadanon-emptySDBpriortothis?ŠBNE„LSTNVIDŒyes..ŠMOVE.LUSESBUF-B(A5),A0&ŠMOVE.LSDBFPT(A0),VIDBUF+VIDSDS-B(A5)*£updatetheVIDwiththePSN*£ofthenextSDBinthelist *‰DE-ALLOCATECURRENTSDB ;ŠMOVE.LPSNSDB-B(A5),D1„psnofstructuretobede-allocated7ŠMOVE.L#SDBSZE,D2‰sizeofstructuretobede-allocated'ŠBSR„DEALLCgode-alocatethestructure/ŠMOVE.B#1,SATFLG-B(A5)„flagtheSATasupdated/ŠMOVE.B#1,VIDFLG-B(A5)„flagtheVIDasupdated0*‰CLR.B•clear"presentSDBsbufferupdated"flag-ŠADD.L#1,SDBDEL-B(A5)…numberofSDBsdeleted ŠBRA„SDB010 ŠPAGE*‰SDBISNOTEMPTY SDBNEMTƒEQU„*CŠMOVE.BCRSDBFLG-B(A5),D0‚isthecurrentbufferflagedaschanged?0ŠBEQ.S‚CRNOCHGŒno..goseeabouttheotherbuffer "*‰WRITETHECURRENTBUFFERTODISK /ŠMOVE.LPSNSDB-B(A5),D1„Sectortobewrittento,ŠMOVE.L#SDBSZE,D2‰numberofblockstowriteŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6‹blocksize;ŠMOVE.LUSESBUF-B(A5),A1ƒdatatobewrittenislocatedhereŠBSR„WRITSECŒgodothewrite0ŠBNE„ABORTREP‹writeerrorcausesrepairtoquit.ŠMOVE.LTEMP-B(A5),D69ŠCLR.B‚CRSDBFLG-B(A5)…reset"currentbufferupdated"flag FCRNOCHGƒMOVE.BSUPFLG-B(A5),D0„istheotherbufferflagedaschanged?,ŠBEQ.S‚SDBNEMT5‹no..goswitchbufferpointer  $*‰WRITETHEALTERNATEBUFFERTODISK ŠMOVE.LPRVSDB-B(A5),D1ŠMOVE.L#SDBSZE,D2ŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6ŠMOVE.LUSESBUF-B(A5),A0ŠMOVE.L-4(A0),A1 ŠBSR„WRITSEC0ŠBNE„ABORTREP‹writeerrorcausesrepairtoquit.ŠMOVE.LTEMP-B(A5),D65ŠCLR.B‚SUPFLG-B(A5)‡reset"otherbufferupdated"flag SDBNEMT5‚EQU„*!ŠMOVE.LPSNSDB-B(A5),PRVSDB-B(A5)!ŠMOVE.LNXTSDB-B(A5),PSNSDB-B(A5)&*¥storethePSNforthepresentSDBas&*¥thelastSDBPSN,thenstorethePSN$*¥ofthenextSDBasthepresentSDBŠMOVE.LUSESBUF-B(A5),A0ŠMOVE.L-4(A0),USESBUF-B(A5)(*¥nowletspointtothenextbuffer.The)*¥ideaistoflipbetweenthetwobuffers*¥usedforstorage.AŠMOVE.B‚#1,LSSDBFLG-B(A5)sincetheSDBjustreadwasnotempty..+ŠBRA„SDB020subsequentemptieswillrequire!*§aforwardpointerupdateinthe*§previousSDBandnottheVID.ŠPAGELSTNVID:‚EQU„*2*‰WeenterthroughhereforemptySDBsfoundafter+*‰wehavefoundatleastonenon-emptySDB.**‰TheemptyisdeletedandthePSNforthe4*‰nextSDBiswrittentothepreviousSDBlocatedin>*‰the'alternate'buffer.Thisbufferisthenwrittentodisk. :ŠMOVE.LPRVSDB-B(A5),D1„PSNtowhichthebufferiswritten6ŠMOVE.L#SDBSZE,D2‰SizeofthestructureinthebufferŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6‹BlocksizeŠMOVE.LUSESBUF-B(A5),A05ŠMOVE.L-4(A0),A1ŠGetthepointertotheotherbuffer<ŠMOVE.LNXTSDB-B(A5),SDBFPT(A1)‚UpdatethepreviousSDBwith!*§newforwardpointertonextSDB"*§Thisvaluemaybezerofornull."ŠBSR„WRITSECŒNowwriteSDBtodisk0ŠBNE„ABORTREP‹Writeerrorcausesrepairtoquit.ŠMOVE.LTEMP-B(A5),D65ŠCLR.B‚SUPFLG-B(A5)‡Reset"otherbufferupdated"flag  3ŠMOVE.LPSNSDB-B(A5),D1„De-allocatethecurrentSDBŠMOVE.L#SDBSZE,D2 ŠBSR„DEALLC EŠMOVE.LNXTSDB-B(A5),PSNSDB-B(A5)SetthenextSDBasthenewpresent;ŠADD.L‚#1,SDBDEL-B(A5)„IncrementthenumberofSDBsdeleted(ŠBRA„SDB020GoseeifanySDBsremaining  %*‰ThisareaisenteredforeverySDB. SDB040„EQU„*****†GETSTARTOFTHEFIRSTSDE*ŠMOVE.LUSESBUF-B(A5),A0ŠLEA.L‚SDBSTR(A0),A0 2SDB045„MOVE.LA0,A3Žsavepointerto1st/nextentry*¨tobeusedinthePDBareaŠTST.L‚D5‘anymoreSDEsleftŠBEQ„SDB030no... 'ŠMOVE.LSDBPDP(A0),D0†isthisSDEempty ŠBNE.S‚SDB050no...gomakesure &ŠADD.L‚#1,D4ŽincrementemptySDEcount1ŠADD.L‚#SDBLEN,A0‰incrementpointertonextentry&ŠSUB.L‚#1,D5ŽdecrementtotalSDEcount ŠBRA„SDB045 ŠPAGE SDB050„EQU„* O**////////////////////////////////////////////////////// ///////////////////////**/›PDBƒAREAO**/////////////////////////////////////////////////////////////////////////////* PDB010„EQU„*=ŠCLR.B‚LSPDBFLG-B(A5)…indicatethelaststructurewasnotPDB*§butwasaSDB úB WDY"\*=2P:IBOJKRIZMbGjMrFzG‚MŠJ’CšG¢TªT²SºLÂLÊKÒOÚOâZêN2ŠLEA„PDBBUF(PC),A4Šsetthebufferpointerpointing7ŠMOVE.LA4,USEPBUF-B(A5)ƒtothefirstbuffertobeused 8ŠLEA„PDB2BUF(PC),A4‰loadpointerfieldofbuffer#1with/ŠMOVE.LA4,PPTR1-B(A5)…theaddressofbuffer#2 6ŠLEA„PDBBUF(PC),A4Šloadpointerfieldofbuffer#2wit/ŠMOVE.LA4,PPTR2-B(A5)…theaddressofbuffer#1 .ŠMOVE.LSDBPDP(A3),PSNPDB-B(A5)ƒPSNof1stPDB  *‰ENDOFPDBCHAIN? PDB020„EQU„*<ŠMOVE.LPSNPDB-B(A5),D1„areweattheendofthePDBchain?-ŠBEQ„OUTTyes...godothecompletionprocess  !*‰READFIRST/NEXTPDBINTOBUFFER <ŠMOVE.LUSEPBUF-B(A5),A1ƒ*noteD1=PSNof1stsectorinPDBŠMOVE.L#PDBSZE,D2ŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6ŠMOVE.L#'PDB',IOERITM-B(A5)ŠBSR„GETSECReadinPDB./ŠBNE„ABORTREP‹Readerrorcausesrepairtoquit.ŠMOVE.LTEMP-B(A5),D6  *‰SAVEPSNOFNEXTPDB ŠMOVE.LUSEPBUF-B(A5),A1ŠMOVE.LPDBFPT(A1),NXTPDB-B(A5) ŠPAGE*‰INITIALIZE‚PDECOUNTERS #ŠCLR.L‚D6‘D6=numberofemptyPDEs8ŠMOVE.L#PDBENT,D7‰D7=numberofentriestocheckempty  *‰ENDOFTHECURRENTPDB? PDB030„EQU„*#ŠTST.L‚D7‘attheendofthePDByetŠBNE„PDB040no...gocheckPDEs  *‰EMPTY‚PDB? (ŠCMP.L‚#PDBENT,D6‰areallthePDEsemptyŠBNE.S‚PDBNEMTŒno..  *‰LASTSTRUCTUREAPDB? 9ŠMOVE.BLSPDBFLG-B(A5),D0‚wasthelaststructureanPDB?ŠBNE.S‚LSTNSDBŒyes.   >ŠMOVE.LNXTPDB-B(A5),SDBPDP(A3)‚updatetheSDBwiththePSNof*§thenextPDBinthelist&*§Thiscreatsanew"1stPDB"inchain**‰DEALLOCATECURRENTPDB ŠMOVE.LPSNPDB-B(A5),D1ŠMOVE.L#PDBSZE,D2'ŠBSR„DEALLCde_allocatethepresentPDB /ŠMOVE.B#1,SATFLG-B(A5)„flagtheSATasupdated 1ŠMOVE.B#1,CRSDBFLG-B(A5)‚flagtheSDBasupdated 0*‰CLR.B•clear"presentPDBsbufferupdated"flag -ŠADD.L#1,PDBDEL-B(A5)…numberofPDBsdeleted ŠBRA„PDB010 ŠPAGE*‰PDBISNOTEMPTY PDBNEMTƒEQU„*?ŠMOVE.BPUPFLG-B(A5),D0„istheotherbufferflagedaschanged?,ŠBEQ.S‚PDBNEMT5‹no..goswitchbufferpointer  *‰WRITEOTHERBUFFERTODISK ŠMOVE.LPRVPDB-B(A5),D1ŠMOVE.L#PDBSZE,D2ŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6ŠMOVE.LUSEPBUF-B(A5),A1ŠMOVE.L-4(A1),A1 ŠBSR„WRITSEC0ŠBNE„ABORTREP‹writeerrorcausesrepairtoquit.ŠMOVE.LTEMP-B(A5),D65ŠCLR.B‚PUPFLG-B(A5)‡reset"otherbufferupdated"flag PDBNEMT5‚EQU„*!ŠMOVE.LPSNPDB-B(A5),PRVPDB-B(A5)!ŠMOVE.LNXTPDB-B(A5),PSNPDB-B(A5)&*¥storethePSNforthepresentPDBas&*¥thelastPDBPSN,thenstorethePSN$*¥ofthenextPDBasthepresentPDB*ŠMOVE.LUSEPBUF-B(A5),A1ŠMOVE.L-4(A1),USEPBUF-B(A5)(*¥nowletspointtothenextbuffer.The)*¥ideaistoflipbetweenthetwobuffers*¥usedforstorage. AŠMOVE.B‚#1,LSPDBFLG-B(A5)sincethePDBjustreadwasnotempty..+ŠBRA„PDB020subsequentemptieswillrequire!*§aforwardpointerupdateinthe*§previousPDBandnottheSDB.%*§Thisflagbeingsetindicatessuch. ŠPAGELSTNSDB:‚EQU„*2*‰weenterthroughhereforemptyPDBsfoundafter+*‰wehavefoundatleastonenon-emptyPDB.**‰TheemptyisdeletedandthePSNforthe+*‰nextPDBiswrittentothelastPDBread.  :ŠMOVE.LPRVPDB-B(A5),D1„PSNtowhichthebufferiswritten6ŠMOVE.L#PDBSZE,D2‰SizeofthestructureinthebufferŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6‹BlocksizeŠMOVE.LUSEPBUF-B(A5),A15ŠMOVE.L-4(A1),A1ŠGetthepointertotheotherbuffer<ŠMOVE.LNXTPDB-B(A5),PDBFPT(A1)‚UpdatethepreviousPDBwith!*§newforwardpointerto nextPDB"*§Thisvaluemaybezerofornull."ŠBSR„WRITSECŒNowwritePDBtodisk0ŠBNE„ABORTREP‹Writeerrorcausesrepairtoquit.ŠMOVE.LTEMP-B(A5),D65ŠCLR.B‚PUPFLG-B(A5)‡Reset"otherbufferupdated"flag  3ŠMOVE.LPSNPDB-B(A5),D1„De-allocatethecurrentPDBŠMOVE.L#PDBSZE,D2 ŠBSR„DEALLC DŠMOVE.LNXTPDB-B(A5),PSNPDB-B(A5)LetsstorethePSNofthenextPDB;ŠADD.L‚#1,PDBDEL-B(A5)„IncrementthenumberofPDBsdeleted(ŠBRA„PDB020GoseeifanyPDBsremaining   "*‰ThisareaenteredforeveryPDB. PDB040„EQU„*5ŠMOVE.LUSEPBUF-B(A5),A1ƒgetthestartofthe1stPDEŠLEA.L‚PDBSTR(A1),A1 *‰ANYMOREPDEs PDB045„EQU„*ŠTST.L‚D7‘anymorePDEsleftŠBEQ„PDB030no... #ŠTST.B‚DIRFIL(A1)‰isthisPDEempty)ŠBNE.S‚PDB050no...gogogetanotherone &ŠADD.L‚#1,D6ŽincrementemptyPDEcount PDB050„EQU„*&ŠSUB.L‚#1,D7ŽdecrementtotalPDEcount 1ŠADD.L‚#DIRLEN,A1‰incrementpointertonextentry ŠBRA„PDB045 ŠPAGEO**\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ OUTT†EQU„*,ŠTST.B‚LSPDBFLG-B(A5)…laststructureaPDB?ŠBNE.S‚OUTT2Žyes..,ŠADD.L‚#1,D4Žno...incrementemptySDEcount OUTT2…EQU„*&ŠSUB.L‚#1,D5ŽdecrementtotalSDEcount*ŠADD.L‚#SDBLEN,A0‰pointtonextSDEinSDB$ŠBRA„SDB045gocheckifSDEisempty COMPLETE‚EQU„*!ŠTST.B‚VIDFLG-B(A5)‡VIDupdated?ŠBEQ.S‚COMP0Žno..*ŠBSR„UPCKSMyes..recalculatethechecksumŠLEA„VIDBUF(PC),A1 ŠCLR.L‚D1 ŠMOVE.L#1,D2ŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6ŠMOVE.L#'VID',IOERITM-B(A5) ŠBSR„WRITSECŠMOVE.LTEMP-B(A5),D6 &COMP0…TST.B‚SATFLG-B(A5)‡SATupdated?ŠBEQ.S‚COMP5Žno...$ŠMOVE.LVIDBUF+VIDSAT-B(A5),D1ƒyes.. ŠCLR.L‚D2ŠMOVE.WVIDBUF+VIDSAL-B(A5),D2ŠMOVE.LD6,TEMP-B(A5)ŠMOVE.L#$100,D6 ŠMOVE.LSATDBUF-B(A5),A1„oldSATŠMOVE.L#'SAT',IOERITM-B(A5) ŠBSR„WRITSECŠMOVE.LTEMP-B(A5),D6 3COMP5…MOVE.L#SATSEG,D0‰de-allocatetheSATsegment ŠBSR„DELSEG  *‰RESETMISC.FLAGS,ŠCLR.B‚VIDFLG-B(A5)‡reset'VIDupdated'flag,ŠCLR.B‚SATFLG-B(A5)‡reset'SATupdated'flag   ŠPAGE $*‰DISPLAYTHENUMBEROFSDBsDELETED ŠMOVE.LSDBDEL-B(A5),D07ŠMOVE.LD0,TEMP-B(A5)†saveSDBdeletedforuseintotal ŠBSR„BDCONVconverttoHEXASCII&ŠBSR„STUFBLNK‹replacezeroswithASCIIŠMOVE.LD0,SDBDMSGN-B(A5)ŠLEA„SDBDMSGN(PC),A0ŠMOVE.L#SDBDMSGL,D0 ŠBSR„SENDMSG  $*‰DISPLAYTHENUMBEROFPDBsDELETED ŠMOVE.LPDBDEL-B(A5),D0 ŠMOVE.L#4,D1 ŠMULUƒD1,D0ŠADD.L‚D0,TEMP-B(A5)ŠMOVE.LPDBDEL-B(A5),D0 ŠBSR„BDCONV&ŠBSR„STUFBLNK‹replacezeroswithASCIIŠMOVE.LD0,PDBDMSGN-B(A5)ŠLEA„PDBDMSGN(PC),A0ŠMOVE.L#PDBDMSGL,D0 ŠBSR„SENDMSG  )*‰DISPLAYTOTALNUMBEROFSECTORSDELETED ŠMOVE.LTEMP-B(A5),D0 ŠBSR„BDCONV(ŠBSR.S‚STUFBLNK‹replacezeroswithASCIIŠMOVE.LD0,TOTDMSGN-B(A5)ŠLEA„TOTDMSGN(PC),A0ŠMOVE.L#TOTDMSGL,D0 ŠBSR„SENDMSG 3COMPEX„MOVEM.L(A7)+,D0-D7/A0-A6‡SaveallregistersŠRTSŠPAGE 3****************************************************UPCKSM:1.00…12/06/84‚RJ+*‰RECALCULATETHECHECKSUMVALUEINTHEVID*"*‰ONRETURN:NOREGISTERSMODIFIED* UPCKSM„EQU„*0ŠMOVEM.LD0-D7/A0-A6,-(A7)restoreallregistersŠLEA„VIDBUF(PC),A1UPCK510ƒMOVE.LA1,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ŠCHECKSUMERROR ŠMOVE.LD0,D1ŠMOVE.L#CHSMSGL,D0*‰BSR„SENDMSQC *‰BSR„REPAIR*‰BNE„TRMREPFIX?ŠCLR.W‚VIDCHK(A1) ŠMOVE.LA1,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.BD0,VIDCHK(A1)†UPDATEŠSWAPƒD0ŠMOVE.BD0,VIDCHK+1(A1)ŠMOVE.B#1,VIDFLG-B(A5) UPCKOUTƒEQU„*0ŠMOVEM.L(A7)+,D0-D7/A0-A6‡restoreallregistersŠRTSŠPAGE;************************************************************STUFBLNK:1.00ƒ12/06/8 4‚RJ1*‰REPLACEALLZERO'SFOUNDIND0WITHASCII‚($30)**‰ONRETURN:D0MODIFIED<************************************************************STUFBLNK‚EQU„*ŠMOVEM.LD1-D7/A0-A6,-(A7).ŠMOVE.L#3,D1Žnumberofbytestobechecked-1STUF10„CMP.B‚#0,D0 ŠBNE.S‚SHIFT,ŠMOVE.B#$30,D0ŒreplacezerowithASCIIzeroSHIFT…ROL.L‚#8,D0ŠDBRAƒD1,STUF10ŠMOVEM.L(A7)+,D1-D7/A0-A6ŠRTSŠPAGE*<>M******************************************************************************GETHELP:1.0…12/07/84‚rj ,*‰PRINTSMESSAGESTOSCREENINFORMATEDMODEC*‰ATTHEENDOFAFULLSCREEN,THEUSERISASKEDIFMOREISNEEDED.C*‰IF"Y"MOREISPRINTED.IF"N"OR,NOMORELINESAREPRINTED*2*ˆONENTRY:A1=POINTSTOSTARTOFHELPMESSAGES5*“D2=CONTAINSTHETOTALLENGTHOFTHEHELPMESSAGES*$*ˆONRETURN:ALLREGISTERSUNCHANGED**!GETHELPƒMOVEM.LD0-D7/A0-A6,-(A7)@ŠMOVE.B#1,FIRSFLG-B(A5)ƒinitializethefirstchar.inlineflag-ŠCLR.L‚D0‘initializethelinecharactercount#ŠCLR.L‚D5‘initializethelinecount"ŠCLR.L‚D6‘usedforzerocomparison **‰SUB.L‚#1,D2ŽHELPMSGL-1(becauseofDBRA)1YES‡CMP.L‚#0,D2Žareweattheendofthemessages5ŠBEQ.S‚CKOUTŽyes...decidetoprintalineordropoutCHECK…MOVE.B(A1)+,D3 ŠCMP.B‚#0,D3ŠBNE.S‚CRCHECK0ŠDBRAƒD2,CHECK‹accountforthezerointhetotalCRCHECKƒCMP.B‚#CR,D3CR?ŠBNE.S‚CKLFEEDŒno...ŠBRA.S‚ITSACRLF‹yes..CKLFEEDƒCMP.B‚#LF,D3LF?ŠBNE.S‚NOTCRLFŒno.. ITSACRLF‚CMP.L‚#1,D0Žchcnt=1‚?!ŠBEQ.S‚SNDLFŽyes..sendalinefeed!ŠBSR.S‚SNDLINEŒno...sendtheline ŠBRA.S‚CONTIN"SNDLF…BSR„LINEFDprintalinefeed5*‰ADD.L‚#1,A1Žpointtothenextcharacterintheline ;CONTIN„MOVE.L#1,D0ŽassumethatthenextcharisaCRorLF%ŠADD.L‚#1,D5Žincrementthelinecount=ŠMOVE.B#1,FIRSFLG-B(A5)ƒassumenextchar.is1stintheline )ŠCMP.B‚#22,D5printedascreenfullyet?(ŠBGE.S‚REQCRŽyes..askforCRtocontinue1ŠDBRAƒD2,YESdec.totalcharactercount,getmore #REQCR…CLR.L‚D5‘resetthelinecount'ŠBSR.S‚ASKMOREŒadditionalHELPneeded?ŠBNE.S‚OUTno...exit&ŠDBRAƒD2,YESyes..getmorecharacters CNOTCRLFƒTST.B‚FIRSFLG-B(A5)†isthisthe1stcharacterintheline?ŠBEQ.S‚NOTFSTno...1ŠSUB.L‚#1,A1Žyes..backupandpointdirectlytoitAŠMOVE.LA1,LINESTRT-B(A5)‚startofthecurrentlinetobeprinted5ŠCLR.B‚FIRSFLG-B(A5)†indicatestartofthelinefound ŠCLR.LƒD00NOTFST„ADD.L‚#1,D0Žincrementthecharactercount#ŠDBRAƒD2,YESgogetmorecharacters  KSNDLINEƒMOVEM.LD1-D7/A1-A6,-(A7)yes..printthecurrentline(D0=length)AŠMOVE.LLINESTRT-B(A5),A0‚getthestartofthelinetobeprinted%ŠBSR„SENDMSGŒprinttheavailablelineŠMOVEM.L(A7)+,D1-D7/A1-A6ŠRTS  %*‰SENDALINETODEFAULTLOGICALUNIT CKOUT…CMP.L‚#1,D0Žchrcnt=>1ŠBGE.S‚SNDLAST ŠBRA.S‚OUTHSNDLASTƒMOVE.LLINESTRT-B(A5),A0‚getthestartofthelinetobeprinted Š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/84rj* ASKMOREƒDS…0ŠMOVEM.LD0-D7/A0-A6,-(A7)3ŠLEA„MOREMSG(PC),A0‰Ask'InterestedinmoreHELP'‚?ŠMOVE.L#MOREMSGL,D0 ŠBSR„SENDMSG ŠBSR„GETRYNŠMOVEM.L(A7)+,D0-D7/A0-A6ŠRTSO********************************************************************************CONTINUE:ˆ1.0‚12/07/84‚RJ.*ŠUSEDTOSTOPATTHEENDOFTHEHELPMESSAGES0*ŠTHENWAITSFORRESPONSE;ANYRESPONSEWILLDO.*$*ˆONRETURN:ALLREGISTERSUNCHANGED*CONTINUE‚EQU„*4ŠLEA„TNUEMSG(PC),A0‰'Typeanycharactertocontinue'.ŠMOVE.L#TNUEMSGL,D0‡ProvidelengthofmessageŠBSR„SENDMSGŒSendmessageŠMOVE.LA0,-(A7)!ŠIOSCALLINPIOS(PC)ˆREADRESPONSE ŠBNE„IOERR(*‰BSR„HRDCPYSENDHARDCOPYIFNECESSARYŠMOVE.L(A7)+,A0ŠRTS*><ŠPAGEO**********************************************************************************ˆPFILNM1.007/31/80HBN6*O********************************************************************************7*ˆPFIL NMPRINTSFULLYQUALIFIEDFILENAMETOLOGDEVICE***ˆONENTRY:A2=CURRENTPDBENTRYPOINTER* PFILNM„EQU„*ŠMOVEM.LD0/D1/A0/A1,-(A7) ŠMOVE.L#8,D1!ŠLEA„FFILEN(PC),A1ŠMOVEFILENAMEŠLEA„DIRFIL(A2),A0*ŠMOVE.B(A0),D0ŒLETFILESTARTWITH&OR@ŠCMP.B‚#'@',D0 ŠBEQ.S‚PFIL05ŠCMP.B‚#'&',D0 ŠBEQ.S‚PFIL057PFIL00„MOVE.B(A0)+,D0‹PUTOUTASPACE‚IFBADCHARACTER ŠBSR„ALFNUM ŠBEQ.S‚PFIL05ŠMOVE.B#'',(A1)+ ŠBRA.S‚PFIL10PFIL05„MOVE.BD0,(A1)+PFIL10„SUB.L‚#1,D1 ŠBNE„PFIL00ŠMOVE.BDIREXT(A2),D0†EXTENSIONŠMOVE.BD0,FEXTEN-B(A5)ŠBSR„ALFNUMCHECKCHARACTEROKŠBEQ.S‚PFIL15OKŠMOVE.B#'',FEXTEN+1-B(A5)PFIL15„MOVE.BDIREXT+1(A2),D0ŠMOVE.BD0,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.079/01/81TB59*O********************************************************************************@*ˆFMATCHCHECKSIFCURRENTFILENAMEMATCHESSPECIFIEDFILENAMED*ˆUMATCHCHECKSIFCURRENTUSERNUMBERMATCHESSPECIFIEDUSERNUMBERF*ˆCMATCHCHECKSIFCURRENTCATALOGNAMEMATCHESSPECIFIEDCATALOGNAME*,*ˆONENTRYTOFMATCH:A2=CURRENTPDBENTRY*!*ˆONRETURN:Z=1IFMATCHFOUND*—0IFDIFFERENTNAMES** FMATCH„EQU„*ŠMOVEM.LD0-D1/A0-A1,-(A7)6ŠMOVE.L#10,D1CHECKFILENAMEANDEXTENSIONFORMATCH&ŠLEA„DIRFIL(A2),A0†CURRENTFILE'SNAME$ŠLEA„FILNAM(PC),A1ŠFILENAMETOFINDŠBTSTƒ#ROPTION,D7ˆRECOVER?ŠBEQ.S‚FMATC00ŒNO,ŠTST.B‚DIRFIL(A2)‰YES,CURRENTFILEDELETED?,ŠBEQ.S‚FMATC10ŒYES,SKIPCHECKOFFIRSTBYTEFMATC00ƒMOVE.B(A0)+,D0ŠCMP.B‚(A1)+,D0ŠBNE.S‚FMATCRTŒNOMATCH"FMATC05ƒSUB.L‚#1,D1ŽNEXTCHARACTER ŠBNE„FMATC00!FMATCRTƒMOVEM.L(A7)+,D0-D1/A0-A1ŠRTS#FMATC10ƒTST.B‚(A0)+ŽSKIPFIRSTBYTE ŠTST.B‚(A1)+ ŠBRA„FMATC05** USER NUMBER CHECK ENTRY POINT UMATCH„MOVEM.LD0-D1/A0-A1,-(A7)ŠLEA„USRNUM-B(A5),A0ŠLEA„FUSERN-B(A5),A1+ŠMOVE.L#4,D1ŽNUMBEROFCHARACTERSTOCHECK ŠBRA„FMATC00* *ˆCATALOGNAMECHECKENTRYPOINT CMATCH„EQU„*ŠMOVEM.LD0-D1/A0-A1,-(A7)ŠLEA„CATNAM(PC),A0ŠLEA„FCATAL(PC),A1!ŠMOVE.L#8,D1ŽCATALOGNAMELENGTH(ŠBRA„FMATC00ŒCHECKIFCATALOGNAMESSAMEŠPAGEO*********************************************************************************ˆDELFIL:1.007/31/80HBN6*O********************************************************************************-*ˆDELFILASKSUSERIFHEWANTSTODELETEFILE*3*ˆONENTRY:A2=ADDRESSOFCURRENTDIRECTORYENTRY*;*ˆONRETURN:Z=1IFDELETEDFILE(1STBYTEOFFILENAME0)*“Z-0IFFILETOBESKIPPED* DELFIL„EQU„*ŠMOVEM.LA0/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)„FLAGPDBCHANGEDANDMUSTBEUPDATEDDELF00„MOVEM.L(A7)+,D0/A0ŠRTSŠPAGE*O*********************************************************************************ˆMPSNC1.006/25/80HBN6*O********************************************************************************>*ˆMPSNCCHECKSTHATALLPSNINAGIVENSEGMENTAREONTHEDISK*'*ˆONENTRY:D1=FIRSTPSNINTHEBLOCK%*’D2=NUMBEROFSECTORSINTHEBLOCK*+*ˆONRETURN:C=0ANDZ=0IFERROR(BHI)*“D0-CHANGED* MPSNC…EQU„**%*ˆCHECK1STPSNNOTGREATERTHANMPSN*ŠMOVE.LMPSN-B(A5),D0†GETMPSN ŠCMP.L‚D0,D1ŽGIVENPSNTOOHIGH?ŠBHI.S‚MPSNRŽYES,ERROR*4*ˆCHECKLASTSECTORINTHEBLOCKISNOTOFFTHEDISK*ŠCMP.L‚D0,D2ŽTOOMANYSECTORS?ŠBHI.S‚MPSNRŽYES+ŠSUB.L‚D2,D0ŽCHECKLASTSECTORONDISKALSOŠADD.L‚#1,D0Ž.#ŠCMP.L‚D0,D1ŽSETSRETURNCONDITIONS MPSNR…RTSŠPAGE*O*********************************************************************************ˆDUMP:1.007/9/80HBN6*O********************************************************************************-*ˆDUMPDUMPSSEVERALSECTO RSTOOUTPUTDEVICE*B*ˆONENTRY:D1=1STPSNTODUMP(MAYNOTBE1STSECTORINBUFFER)-*’D2=NUMBEROFSECTORSTODUMP(BIT31SET)*’A1=BUFFERSTART+*’D3=PSNOFSECTORINBUFFER‚(D3.LE.D1)* DUMP†EQU„*ŠMOVEM.LD0-D4/A0-A1,-(A7)ŠBSR„TOFFORCEFORMFEED ŠMOVE.LD1,D0+ŠSUB.L‚D3,D0ŽGET1STSECTORSBUFFERADDRESS ŠMULUƒD6,D0Ž.ŠADD.L‚D0,A1Ž.ŠMOVE.LD2,D4ŽSAVESECTORCOUNTŠBCLRƒ#31,D4.(DMP00…CLR.L‚D2‘DUMPONESECTORATATIME ŠMOVE.LD6,D3 ŠBSR.S‚DUMPITŠSUB.L‚#1,D4ŽDONE?ŠBEQ.S‚DMPRTŽYES"ŠADD.L‚#1,D1ŽNO,PRINTNEXTSECTOR ŠADD.L‚D6,A1 ŠBSR„LINEFD ŠBRA„DMP00DMPRT…MOVEM.L(A7)+,D0-D4/A0-A1ŠRTSŠPAGEO*********************************************************************************ˆDUMPSC:‡1.006/25/80HBN6 *ˆDUMPBF:O********************************************************************************D*ˆDUMPSCDUMPSASECTOR,DUMPBFDUMPSABUFFERONTHEOUTPUTDEVICE.*"*ˆDUMPSCENTRY:D1=PSNOFSECTOR*–A1=SECTORBUFFERADDRESS5*ˆDUMPBFENTRY:D2=OFFSETFORSTARTINGBYTETODUMP*–D3=NUMBEROFBYTESTODUMP*–A1=SECTORBUFFERADDRESS**ˆDUMPSCRETURN:D2=0 *—D3=256*—A0,D0-CHANGED*!*ˆDUMPBFRETURN:A0,D0-CHANGED* DUMPSC„EQU„**!*ˆSETUPREGISTERSFORSECTORDUMP $ŠCLR.L‚D2‘OFFSET=0FORSECTORDUMP$ŠMOVE.LD6,D3ŽD3=256BYTESTODUMP ŠBRA.S‚DUMPIT*(DUMPBF„EQU„*’ENTRYPOINTFORBUFFERDUMP*)ŠMOVEM.LD1-D5/A1-A2,-(A7)SAVEREGISTERS'ŠBSETƒ#31,D2INDICATEBUFFER/FIELDDUMP!ŠCLR.L‚D5‘OFFSETFORFIELD:ORG0 ŠBRA.S‚DUMP001DUMPIT„EQU„*’ENTRYPOINTFORDUMPSEVERALSECTORS*'*ˆSEND'PSN=XXXXX'ASHEADERFORDUMP*)ŠMOVEM.LD1-D5/A1-A2,-(A7)SAVEREGISTERS2ŠLEA„PSNFLD(PC),A0ŠFIELDTOPUTPSNHEXVALUEINTO,ŠBSR„BIN4HEXŒCONVERTBINARYPSNIND1TOHEX ŠLEA„PSNMSG(PC),A0ŠSENDTHELINEŠMOVE.L#PSNMSGL,D0ˆ.+ŠTST.B‚PRTFLG-B(A5)‡OUTPUTTOLINEPRINTER?ŠBEQ.S‚DUMPAANODŠMOVE.B#PRTLUN,IOSLUN+OUTIOS-B(A5)YES,SETPRINTERLUNINTOIOSPBDUMPAA„BSR„SENDMSGS‹.**ˆBLANKFILLLINEBUFFER*)DUMP00„LEA„LINEBUF(PC),A0‰STARTOFBUFFER(ŠMOVE.L#LINEL/2,D0ˆLENGTHTOSPACEFILLDUMP01„MOVE.W#'‚',(A0)+ ŠSUB.L‚#1,D0 ŠBNE„DUMP01ŠPAGE*&*ˆSETLINE'SOFFSETINTOSTARTOFLINE* 7ŠLEA„ASCFLD(PC),A2ŠINITIALIZEWHERETOPUTASCIIVALUES+ŠLEA„OFSFLD(PC),A0ŠFIELDTOPUTOFFSETINTO(ŠMOVE.LD2,D1ŽCONVERTFROMBINARYTOHEX'ŠBPL.S‚DUMP02PUTOFFSETIFSECTORDUMP/ŠMOVE.LD5,D1ŽUSEORGZEROIFBUFFER/FIELDDUMPŠADD.L‚#$10,D5Œ.OFFSETDUMP02„BSR„BIN1HEXŒ.!ŠTST.L‚(A0)+ŽSKIPNEXTTWOSPACES$ŠMOVE.L#16,D4PUT16BYTESPERLINE*0*ˆCONVERTBYTESTOHEXANDALSODISPLAYINASCII*.DUMP05„MOVE.B(A1,D2),D1‰GETNEXTBYTETOSHOW6ŠBSR„BIN1HEXŒCONVERTINTOHEXANDPUTINTOLINEBUFFER"ŠLEA„3(A0),A0‹SKIPFOLLOWINGSPACEŠCMP.B‚#$7E,D1ŒISITPRINTABLE?ŠBHI.S‚DUMP10BRANCHIFNOŠCMP.B‚#$20,D1ŒISITPRINTABLE?*ŠBCS.S‚DUMP10USEDOT(.)IFNOTPRINTABLE ŠMOVE.BD1,(A2)+‹ITSDISPLAYABLE ŠBRA.S‚DUMP15/DUMP10„MOVE.B#'.',(A2)+‰OTHERWISEPUTINADOT$DUMP15„SUB.L‚#1,D3ŽALLBYTESDUMPED?ŠBEQ.S‚DUMPRTYES"ŠADD.L‚#1,D2ŽNO,PUTOUTNEXTBYTE&ŠSUB.L‚#1,D4ŽWILLITFITONTHISLINE?1ŠCMP.L‚#8,D4ŽDOWEDOUBLESPACEFORPRETTYPRINT?ŠBNE.S‚DUMP18BRANCHIFNO5ŠLEA„1(A0),A0‹BUMPCHARACTERPOINTERFORPRETTYPRINTDUMP18„TST.L‚D4ŠBNE„DUMP05YES*2*ˆCURRENTLINEFULL,PRINTITANDSTARTANEWLINE*ŠBSR.S‚SNDLINWRITETHELINE ŠBNE.S‚DUMPERŠBRA„DUMP00GODONEXTLINE**ˆDONE,PRINTOUTLASTLINE* DUMPRT„EQU„* ŠBSR.S‚SNDLIN:DUMPER„MOVE.B#LDFLUN,IOSLUN+OUTIOS-B(A5)RESETNORMALLUN,ŠMOVEM.L(A7)+,D1-D5/A1-A2RESTOREREGISTERSŠRTS*.SNDLIN„LEA„LINEBUF(PC),A0‰STARTOFLINEBUFFERŠMOVE.L#LINEL,D0ŠLENGTHŠBSR„SENDMSGS‹WRITEŠRTSŠPAGE*O*********************************************************************************ˆRSVCHK:1.007/22/80HBN6*O********************************************************************************2*ˆRSVCHKISCALLEDTOCHECKRESERVEDFIELDISZERO=*ˆER RORMESSAGEISSENT,FIELDISZEROEDORREPAIRTERMINATED=*ˆTHISINSURESTHATREPAIRDOESNOTATTEMPTTOCORRECTADISK**ˆWHICHHASBEENGENERATEDBYUPGRADEDFMS***ˆONENTRY:A2=ADDRESSOFRESERVEDFIELD*’D1=LENGTHOFFIELD*$*ˆONRETURN:Z=1IFOK‚(UNCHANGED) *—0IFERROR*šBMIIFNOFIXREQUESTED*šBNEIFFIELDZEROED(CHANGED)* RSVCHK„EQU„**ŠMOVEM.LD0-D2/A0/A2,-(A7)*&*ˆSETPSNOFCURRENTITEMINTOMESSAGE*ŠLEA„RESPSN(PC),A0ŠMOVE.LD1,D2ŽSAVEBCT'ŠBEQ.S‚RSVRETRETURNIFBYTECOUNTZERO-ŠMOVE.LUPDSTR-B(A5),D1„GETITEMSTARTINGPSN ŠBSR„BIN4HEXŠMOVE.LD2,D1ŽRESTOREBCT**ˆCHECKIFERROR*(ŠLEA„RESMSG(PC),A0ŠERRORMESSAGE‚TOSENDŠMOVE.L#RESMSGL,D0ˆ.RSVC00„TST.B‚(A2)+ŠBNE.S‚RSVR00ERROR ŠSUB.L‚#1,D1 ŠBNE„RSVC00(ŠBRA.S‚RSVRETOK,Z=1(FIELDWASZERO)RSVR00„BSR„SENDMSQCŠBSR.S‚ZROUTŽZEROFIELD?ŠBNE.S‚RSVR03NOREPAIRWANTED"ŠCLR.B‚-1(A2)OKTOZEROOUTFIELDRSVR01„SUB.L‚#1,D1Ž.ŠBEQ.S‚RSVR02.DONEŠCLR.B‚(A2)+Ž. ŠBRA„RSVR01.2RSVR02„MOVE.L#1,D0ŽZ=0FORFIELDZEROED/CHANGED RSVRET„MOVEM.L(A7)+,D0-D2/A0/A2ŠRTS.RSVR03„MOVE.L#-1,D0INDICATENOREPAIRWANTED ŠBRA„RSVRETŠPAGEO*********************************************************************************ˆZROUT:1.007/22/80‚HBN6*O*********************************************************************************+*ˆZROUTREQUESTSAPPROVALTOZEROOUTFIELD* *ˆONRETURN:Z=1IFOKTOZERO*—0IFNOTTOZERO*ZROUT…MOVEM.LD0/A0,-(A7)ŠLEA„ZROMSG(PC),A0ŠMOVE.L#ZROMSGL,D0ŠBSR.S‚SENDMSG ŠBSR„REPAIRŠMOVEM.L(A7)+,D0/A0ŠRTSO*********************************************************************************ˆUPDB:1.0020/7/80HBN6*O********************************************************************************>*ˆUPDBUPDATESCURRENTDATABLOCKONDISKIFCHANGEDINMEMORYA*ˆ(CURRENTLYTHECOMPLETEDBISWRITTENTODISKREGARDLESSOFHOWC*ˆMANYSECTORSAREACTUALLYINUSE:LATERVERSIONSHOULDONLYWRITE(*ˆMINIMUMSECTORCOUNTTOSPEEDPROCESS)**ˆONRETURN:Z=1IFOKWRITE,ELSEERROR* UPDB†EQU„*ŠTST.B‚DBFLG-B(A5)ˆCHANGED?ŠBEQ.S‚UPD0NOSKIPCALLŠMOVEM.LD1-D2/A0-A1,-(A7)ŠMOVE.LPSNDB-B(A5),D1ŠMOVE.LDBLEN-B(A5),D2ŠMOVE.LDBBUF-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.006/25/80HBN6 *ˆSENDMSQC: *ˆSENDMSGS:O********************************************************************************6*ˆSENDMSG/SENDMSGSOUTPUTSALINETOTHEOUTPUTDEVICE*+*ˆSENDMSG‚IGNORESCALLIFC-OPTIONWASSET.2*ˆSENDMSGSOUTPUTSMESSAGEREGARDLESSOFC-OPTION.B*ˆSENDMSQCCALLSENDMSGSANDTHENNIMC(RETZ=1IFNIM,0=IFIM)**ˆONENTRY:D0=MESSAGELENGTH*’A0=ADDRESSOFMESSAGE*$*ˆONRETURN:ALLREGISTERSUNCHANGED5*“Z=1IFNOPRTERRORS†NOTE:LDFERRORSCAUSEABORT*—0IFERRORFROMPRINTER* SENDMSGƒEQU„***ˆSKIPCALLIFC-OPTIONISON*ŠMOVEM.LD0/A0,-(A7) ŠTST.W‚D7ŠBMI.S‚SENDMOKŒSKIPŠBRA.S‚SENDM00**ˆSENDMESSAGE*SENDMSGS‚EQU„*’ENTRYPOINTŠMOVEM.LD0/A0,-(A7)=SENDM00ƒBSR„INCLINEŒINCREMENTLINECOUNTIFOUTPUTTOPRINTER,ŠMOVE.LA0,IOSSAD+OUTIOS-B(A5)STARTADDRESS ŠTST.L‚D0‘LENGTH=ZERO?‡1/9/85ŠBNE.S‚SENDMNSP‹NO”1/9/85-ŠMOVE.B#'',(A0)ŠYES-OUTPUTASPACE‚1/9/85*ŠBRA.S‚SENDMSPŒUSE'CR'SPOTASEND‚1/9/85$SENDMNSP‚SUB.L‚#1,D0ŽGETENDADDRESSSENDMSPƒADD.L‚A0,D0Ž.ŠMOVE.LD0,IOSEAD+OUTIOS-B(A5)!ŠIOSCALLOUTIOS(PC)ˆWRITEMESSAGEŠBNE.S‚SENDMER(ŠTST.B‚PRTFLG-B(A5)‡PRINTEROUTPUTONLY?ŠBNE.S‚SENDMOKŒYES,DONEŠTST.B‚CPYFLG-B(A5)‡HARDCOPY?Š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)SENDLINETOPRINTERALSOŠIOSCALLOUTIOS(PC)ŠBNE.S‚SENDMERŒPRINTERERROR*SENDMRTƒMOVE.B#LDFLUN,IOSLUN+OUTIOS-B(A5)SENDMOKƒCLR.L‚D0ŠMOVEM.L( A7)+,D0/A0ŠRTS2SENDMERƒTST.B‚KILL-B(A5)‰TERMINATINGREPAIR?ERRORŠBNE„KILLREPŒYES,KILLREPAIR1ŠCMP.B‚#PRTLUN,IOSLUN+OUTIOS-B(A5)PRINTERERROR?&ŠBNE„IOERRŽNO,SENDERRORMSGANDQUIT ŠBSR„PIOERMSŒYES,SENDERRORMSG* ABORT IF NOT 'NOT READY'SEND05:ŠCMP.B‚#ISTANR,D0 ŠBNE„KILLREP$SENDM10ƒERQ.DELAY1500ŒDELAY1.5SEC-ŠIOSCALLOUTIOS(PC)ˆREPEATTILLERRORCLEARED ŠBEQ„SENDMRT‰CMP.B…#ISTABRK,D0 ‰BEQ‡BREAKREP*œJMPIF'BREAK'REQUEST ‰BRA.S…SEND05*œCONTINUELOOPSENDMSQC‚BSR„SENDMSGS ŠBSR„NIMCŠRTSŠPAGE*O*********************************************************************************ˆLINEFD:1.007/9/80HBN6*O********************************************************************************?*ˆLINEFDSENDSALINEFEED.TOPOFFORMISSENTIFENDOFPAGE.**ˆCALLS‚SENDMSGS*LINEFD„MOVEM.LD0/A0,-(A7)ŠLEA„LFMSG(PC),A0ŠMOVE.L#LFMSGL,D0 ŠBSR„SENDMSGSŠMOVEM.L(A7)+,D0/A0ŠRTS*O*********************************************************************************ˆTOF:1.007/9/80HBN6*O********************************************************************************9*ˆTOFPERFORMSFORMFEEDIFOUTPUTISTOTHELINEPRINTER**ˆCALLSSENDMSGS* TOF‡EQU„*ŠMOVEM.LD0-D1/A0,-(A7)ŠTST.B‚CPYFLG-B(A5)‡HARDCOPY?ŠBEQ.S‚TOF00ŽYES.ŠTST.B‚PRTFLG-B(A5)‡NO,OUTPUTTOTHEPRINTER?ŠBEQ.S‚TOFRTŽNO.TOF00…MOVE.B#1,LINECNT-B(A5)ƒRESETLINECOUNTŠLEA„TOFMSG(PC),A0ŠMOVE.L#TOFMSGL,D0/ŠMOVE.BIOSLUN+OUTIOS-B(A5),D1ƒSAVECURRENT‚LUN#ŠMOVE.B#PRTLUN,IOSLUN+OUTIOS-B(A5) ŠBSR„SENDMSGSŠMOVE.BD1,IOSLUN+OUTIOS-B(A5)TOFRT…MOVEM.L(A7)+,D0-D1/A0ŠRTS*O*********************************************************************************ˆINCLINE:1.007/9/80HBN6*O********************************************************************************>*ˆINCLINEINCREMENTSLINECOUNT,SENDTOPOFFORMIFPAGEFULL *ˆCALLSTOF* INCLINEƒEQU„*ŠMOVE.LD0,-(A7)ŠTST.B‚CPYFLG-B(A5) ŠBEQ.S‚INCL00#ŠTST.B‚PRTFLG-B(A5)‡PRINTEROUTPUT?ŠBEQ.S‚INCLRTNO7INCL00„ADD.B‚#1,LINECNT-B(A5)ƒYES,COUNTLINESPERPAGEŠMOVE.BMAXLINES-B(A5),D0ŠCMP.B‚LINECNT-B(A5),D0 ŠBNE.S‚INCLRT!ŠBSR„TOFPAGEFULL,DOPAGEEJECTINCLRT„MOVE.L(A7)+,D0ŠRTSŠPAGE*O********************************************************************************ˆGETSEC:1.0025/6/80HBN6*O********************************************************************************C*ˆGETSECREADSGIVENSECTORBLOCKFROMTHEVOLUMEINTOGIVENBUFFERB*ˆIFIOERRORTHENBLOCKISREADINAGAIN,THISTIMEITISREADIN*ˆONESECTORATATIME.>*ˆCRCERRORMESSAGEISSENTFOREACHSECTORHAVINGSUCHERROR.B*ˆOTHERERRORSCAUSEREADINGTOSTOPANDERRORMESSAGETOBESENT.*,*ˆIFC-OPTIONISON,REPAIRISTERMINATED.***ˆONENTRY:D1=STARTINGPSN%*’D2=NUMBEROFSECTORSINTHEBLOCK*’A1=BUFFERSTARTINGADDRESS***ˆONRETURN:D0=0ANDZ=1IFNOERROR;*˜0IFCRCERRORANDZ=0"*˜OTHERWISED0=ERRORCODE,Z=07*˜(LSTSRD=0IF1STSECTORWASNOTREADINELSE=LAST*™GOODSECTOR'SPSN)* GETSEC„EQU„***ˆREADINBLOCK*#ŠMOVEM.LD1-D6/A0-A1,-(A7)˜10/10/84(ŠMOVE.W#IOREAD,IOSFCT+VOLIOS-B(A5)READŠBSR„IOSECŽREADBLOCKŠBEQ.S‚GETSCRNOERROR*ŠMOVE.LD1,D5ŽERROR,SAVE1STSECTOR'SPSN*2*ˆREADINAGAINSECTORATATIMEIFIOERRORFOUND*ŠCLR.L‚D4‘FLAGNOERRORGETSC0„MOVE.LD1,D3 ŠMOVE.LD2,D1ŠMULUƒD6,D1ŽGETBCT'ŠBSR„CLRBUFZEROOUTBUFFERBEFOREREAD'ŠCLR.L‚LSTSRD-B(A5)‡NOSECTORSREADYET**ˆREADSECTORATATIME*!ŠMOVE.LD3,D1ŽNEXTSECTORTOREAD ‰BSR.S…IOSECŠBNE.S‚GETSC2ERROR(GETSC1„ADD.L‚#1,D1ŽNO,READNEXTSECTOR?ŠADD.L‚D6,A1Ž.ŠSUB.L‚#1,D2Ž.ŠBNE.S‚GETSC0YES.ŠMOVE.LD4,D0ŽNO,ANYERRORFOUNDDURINGREAD?ŠBEQ.S‚GETSCRNO GETSCE„EQU„*ŠMOVE.LD4,D0ŽRETURNERRORCODEŠ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)‡ANYERRORSOFAR?$ŠBNE.S‚GETSC5YES,KEEPFIRSTSECTOR#ŠCMP.L‚D1,D5ŽERRORFROM1STSECTOR?ŠBEQ.S‚GETSC6YESFŠMOVE.LD1,LSTSRD-B(A5)NO,SAVEPSNOFLASTGOODSECTORTHATWASREADŠSUB.L‚#1,LSTSRD-B(A5)„.GETSC5:O********************************************************************************&*‰CMP.B‚D0,D4ŽSAMEERRORASLASTTIME?*‰BNE.S‚GETSC6BRANCHIFNO-*‰CMP.B‚#ISTACRC,D4ˆYES-WASITACRCERROR?:*‰BEQ.S‚GETSC1YES-DON'TCOMPLAINTWICEABOUTTHISERROR,*œTHESEINSTRUCTIONSHAVEBEENCOMMENTEDOUT1*œSOTHATEACHINDIVIDUALSECTORTHATHASA'CRC'*œERRORCANBEPRINTEDO*******************************************************************************6GETSC6„MOVE.LD0,D4ŽSAVEERRORCODE(SAVESLASTERROR)ŠCMP.B‚#ISTACRC,D0ŠBNE.S‚GETSC9NO**ˆSENDCRCERRORMSG*"ŠMOVE.LIOERITM-B(A5),CRCITM-B(A5)'ŠLEA„PSNFLD(PC),A0ŠSETPSNINTOMESSAGE'ŠBSR„BIN4HEXŒCONVERTFROMBINARYTOHEX0ŠLEA„CRCMSG(PC),A0ŠSENDCOMPLETEMESSAGETOUSERŠMOVE.L#CRCMSGL,D0;ŠMOVE.B#LDFLUN,IOSLUN+OUTIOS-B(A5)MAKESUREOUTPUTTOLDFŠCLR.B‚PRTFLG-B(A5)‡. ŠBSR„SENDMSQCŠBRA.S‚GETSC1GETNEXTSECTOR**ˆSENDIOERRORMSG*-GETSC9„MOVE.L#'READ',IOERRW-B(A5)READERRORŠMOVE.B#'',IOERRWC-B(A5)ŠBSR„IOERMSSENDIOERRORMSG ŠBRA„GETSCE*$*ˆCOMMONCODEFORGETSECANDWRITSEC*0IOSEC…MOVE.LD1,IOSRRN+VOLIOS-B(A5)STARTINGPSN+ŠMOVE.LA1,IOSSAD+VOLIOS-B(A5)BUFFERSTARTŠMOVE.LA1,A0ŽGETBUFFEREND!ŠMOVE.LD2,D0Ž.NUMBEROFSECTORS,ŠMULUƒD6,D0Ž.BYTECOUNT=256*(#OFSECTORS)ŠSUB.L‚#1,D0Ž.ŠADD.L‚D0,A0Ž.ŠMOVE.LA0,IOSEAD+VOLIOS-B(A5)"ŠIOSCALLVOLIOS(PC)ˆDOTHEIOCALLŠBEQ.S‚IOSECRNOERRORŠCMP.B‚#ISTABRK,D0ˆBREAKERROR?ŠBEQ„BREAKREP‹YESIOSECR„RTS„NO,OTHERERRORŠPAGE*O*********************************************************************************ˆWRITSEC:1.006/25/80HBN6*O********************************************************************************3*ˆWRITSECWRITESASECTORORASECTORBLOCKTODISK(*ˆERRORMESSAGEISSENTIFERROROCCURS.*9*ˆREPAIRISTERMINATEDIFC-OPTIONONANDERROROCCURS.**ˆONENTRY:D1=STARTINGPSN!*’D2=NUMBEROFSECTORSTOWRITE*’A1=BUFFERADDRESS***ˆONRETURN:D0=0ANDZ=1IFNOERROR;!*˜ERRORCODEANDZ=0OTHERWISE;* WRITSECƒEQU„**A*ˆSETWRITECODEINTOPARAMETERBLOCK;OTHERWISESAMECODEASFOR *ˆGETSEC.*ŠMOVEM.LD1-D2/A0,-(A7)#ŠMOVE.W#IOWRIT,IOSFCT+VOLIOS-B(A5)ŠBSR.S‚IOSECŽWRITEŠBEQ.S‚WRITSCRŠMOVE.LD0,D2ŽSAVEERRORCODE$ŠCMP.B‚#$E4,D0ŒWriteprotecterror?+ŠBNE.S‚WRITRSMŒNO...sendI/Oerrormessages5ŠLEA„PROTMSG(PC),A0…'Diskiswriteprotected'messageŠMOVE.L#PROTMSGL,D0 ŠBSR„SENDMSGS)ŠBRA.S‚WRITSSMŒThismessageissufficient#WRITRSMƒMOVE.L#'WRIT',IOERRW-B(A5)ŠMOVE.B#'E',IOERRWC-B(A5)!ŠBSR.S‚IOERMSSendmessagetoLDF&ŠMOVE.LIOSRRN+VOLIOS-B(A5),D1ƒGETPSNŠLEA„WREPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„WREMSG(PC),A0ŠMOVE.L#WREMSGL,D00ŠBSR„SENDMSQC‹SendmessagethenquitifC-OPTION'WRITSSMƒMOVE.LD2,D0ŽRESTOREERRORCODEWRITSCRƒMOVEM.L(A7)+,D1-D2/A0ŠRTSŠPAGE*O*********************************************************************************ˆWRTSBF1.006/25/80HBN6*O********************************************************************************/*ˆWRTSBFWRITESECTORBUFFERTODISKIFCHANGED$*ˆONRETURN:Z=1IFOK,ELSEERROR*9WRTSBF„TST.B‚SECFLG-B(A5)‡SKIPCALLIFSECTORNOTCHANGED ŠBEQ.S‚WRTS1ŠMOVEM.LD0-D2/A0-A1,-(A7)ŠLEA„SECBUF(PC),A1ŠBUFFERADRŠMOVE.LPSNSEC-B(A5),D1„PSNŠMOVE.L#1,D2Ž1SECTOR!ŠCLR.B‚SECFLG-B(A5)‡NOWUNCHANGEDŠMOVE.L#'SEC.',IOERITM-B(A5) ŠBSR„WRITSECŠMOVEM.L(A0)+,D0-D2/A0-A1 WRTS1…RTSŠPAGE*O*********************************************************************************ˆIOERMS1.007/3/80HBN6*O********************************************************************************'*ˆIOERMSSENDSIOERRORMESSAGETOLDF.**ˆONENTRY:D0=ERRORSTATUS"*’A0=IOSPARAMETER BLOCKADDRESS*$*ˆONRETURN:ALLREGISTERSUNCHANGED* IOERMS„EQU„***ˆSETERRORSTATUS*ŠCMP.B‚#ISTABRK,D0ˆBREAK?ŠBEQ.S‚BREAKREP&ŠMOVEM.LD1-D2/A0,-(A7)„SAVEREGISTERS ŠMOVE.LD0,D1ŠLEA„IOERD0(PC),A0 ŠBSR„BIN4HEX**ˆSENDERRORMESSAGE*Š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)MAKESUREOUTPUTTOLDFŠCLR.B‚PRTFLG-B(A5)‡. ŠBSR„SENDMSQC/IOERRT„MOVEM.L(A7)+,D1-D2/A0„RESTOREREGISTERSŠRTS*BREAKREP‚MOVE.B#1,KILL-B(A5)ŠLEA„BRKMSG(PC),A0ŠMOVE.L#BRKMSGL,D0 ŠBSR„SENDMSGS ŠBRA„KILLREPŠPAGE*O*********************************************************************************ˆPIOERMS1.007/3/80HBN6*O********************************************************************************%*ˆPIOERMSSENDSPRINTERERRORMESSAGE**ˆONENTRY:D0=ERRORSTATUS"*’A0=IOSPARAMETERBLOCKADDRESS*$*ˆONRETURN:ALLREGISTERSUNCHANGED* PIOERMSƒEQU„***ˆSETERRORSTATUS*&ŠMOVEM.LD0-D2/A0,-(A7)„SAVEREGISTERSŠCMP.B‚#ISTABRK,D0ˆBREAK?ŠBEQ„BREAKREP‹YES,ABORT ŠMOVE.LD0,D1ŠLEA„PRTERD0(PC),A0 ŠBSR„BIN4HEX**ˆSENDERRORMESSAGE*ŠIOSCALLPRTIOE(PC)ŠBNE„KILLREPŒQUITIFERROR)ŠMOVEM.L(A7)+,D0-D2/A0„RESTOREREGISTERSŠRTSŠPAGEO*********************************************************************************ˆUPDSEC1.006/25/80HBN6*O*********************************************************************************ˆDURINGVIDCHECK:G*ˆUPDSECUPDATES/DUMPSGIVENSECTOR.THESECTORISREADINIFNECESSARY?*ˆANDANYPRIORSECTORISWRITTENBACKTODISKIFITISFLAGGED!*ˆCHANGED.SECTORBUFFERISUSED.**ˆONENTRY:D1=PSNOFSECTOR3*’D2=OFFSETTOFIRSTBYTETOCHANGEFROM'UPDATE''*—OR#OFSECTORSTOPRINT(BIT31SET)&*’A3->NEWVALUESIFCHANGEREQUESTED* UPDSEC„EQU„**0*ˆCHECKIFREQUESTEDSECTORISALREADYINMEMORY*)ŠMOVEM.LD1-D4/A0-A2,-(A7)SAVEREGISTERS2UPDS00„LEA„SECBUF(PC),A1ŠGETSECTORBUFFERADDRESSŠMOVE.L#'SEC.',IOERITM-B(A5)&ŠMOVE.LD2,D4ŽSAVEOFFSET/SECTORCOUNTŠMOVE.LD1,D3ŽSAVEPSN+ŠBEQ.S‚UPDS01IFDUMPVIDALWAYSREADITIN7ŠCMP.L‚PSNSEC-B(A5),D1„ISTHESECTORALREADYINMEMORY?/ŠBEQ.S‚UPDS15YES,NEEDNOTREADITINTOMEMORYBUPDS01„TST.B‚SECFLG-B(A5)‡NO,HAVETOWRITEANOTHERSECTORTODISKŠBEQ.S‚UPDS10NO*.*ˆWRITEPREVIUOSLYUPDATEDSECTORBACKTODISK-*ˆBEFORECANOVERWRITEBUFFERWITHNEWSECTOR*%ŠCLR.B‚SECFLG-B(A5)‡CLEARUPDATEFLAG2ŠMOVE.LPSNSEC-B(A5),D1„GETPSNOFSECTORTOWRITEŠMOVE.L#1,D2ŽWRITEONESECTOR"ŠBSR„WRITSECŒIGNOREERRORSFORNOW%UPDS05„MOVE.LD3,D1ŽPSNOFNEWSECTOR#UPDS10„MOVE.L#1,D2ŽREADNEWSECTOR5ŠMOVE.LD1,PSNSEC-B(A5)„SETNEWPSNFORSECTORBUFFER ŠBSR„GETSECŠBNE.S‚UPDS30IOERROR'UPDS15„TST.L‚D4‘UPDATEORPRINTSECTOR?ŠBMI.S‚UPDS20PRINTAŠLEA„(A1,D6),A2‚UPDATE-GETENDOFCHANGESADDRESSATSECTORENDŠMOVE.LD4,D2ŽGETOFFSETŠBSR„UPDBUFDOCHANGES+ŠMOVE.B#1,SECFLG-B(A5)„FLAGSECTORUPDATED UPDSRT„MOVEM.L(A7)+,D1-D4/A0-A2ŠRTSŠPAGE**ˆWRITESECTOR(S)*UPDS20„BSR„DUMPSCDUMPSECTOR ŠBCLRƒ#31,D4ŠSUB.L‚#1,D4ŽDONE?ŠBEQ„UPDSRTYES%ŠBSETƒ#31,D4NO,GOPRINTNEXTSECTOR ŠMOVE.LD4,D2 ŠADD.L‚#1,D1 ŠBRA„UPDS00"UPDS30„TST.B‚D0‘CRCERRORONREAD?>ŠBEQ„UPDS20…YES,GOPRINTSECTORANDHOPEUSERCORRECTSERRORS3ŠCLR.L‚PSNSEC-B(A5)‡NO,OTHERERROR.IGNOREFORNOW ŠBRA„UPDSRTŠPAGEO******************************************************************************* * UPDATE:*ˆUPDATE1.0101/11/85*O********************************************************************************B*ˆUPDATESENDS'UPDATE'REQUESTANDCHECKSRESPONSEISACCEPTABLE.C*ˆARETURNISMADETOADDRESSGIVENINBRANCHTABLEFOLLOWINGCALL.*.*ˆCALLINGSEQUENCE:BSRUPDATECALLSUBROUTINE*šDC.LADR1-BCR*šDC.LADR2-BN*šDC.LADR3-BR*šDC.LADR4-BD*šDC.LADR5-BA*šDC.LADR6-BQ'*šDC.LADR7-B$PSNDUMP/UPDATEINRANGE-*š DC.LADR8-B$DUMPITEMORONESECTOROFIT,*šDC.LADR9-B$PSNDUMPSECTORSOUTOFRANGE!*šDC.LADR10-BDPSN,NDEALLOCATE*šDC.LADR11-BAPSN,NALLOCATE*šDC.LADR12-BOFFSETVALUE,....*šDC.LADR13-BCCHECKMODEUNTILERROROREND!*šDC.LADR14-B?HELP,SHORTLIST *šDC.LADR15-BHHELP,LONGLIST*/*ˆONRETURNTOADR7,ADR8,ADR9ONLY:D1=PSN;!*¬D2BIT31=0IFOFFSETIND2.W *¸1IFPRINT,*¸(SECTORCOUNTIND2.W)!*¯(IFADR8THEND2.W=0IFNO'N*°ELSED2.W=N)$*¬A3=STARTOFNEWVALUESIFUPDATE)*ˆONRETURNTOADR12:D2=OFFSET(0-$FF)*œA3=STARTOFNEWVALUES*œD1=STARTINGPSNOFITEM,*ˆONRETURNTOADR10ORADR11ONLY:D1=PSN*ªD2=NUMBEROFSECTORS**ˆONRETURNTOALLCASES:D0,A0-CHANGED* UPDATE„EQU„*&ŠMOVEM.LD3-D6/A1,-(A7)„SAVEREGISTERS-ŠCLR.B‚PRTFLG-B(A5)‡CLEARPRINTEROUTPUTFLAG*,*ˆSEND'UPDATE'REQUESTANDREADINRESPONSE*UPDA00„LEA„UPDRQST(PC),A0ŠMOVE.L#UPDRQSTL,D0 ŠBSR„SENDMSGS ŠIOSCALLINPIOS(PC)ˆGETRESPONSE ŠBNE„IOERR ŠBSR„SBARG6ŠMOVE.LINPIOS+IOSSAD-B(A5),A0ƒSTARTINGBUFFERADDRESS%ŠMOVE.LINPIOS+IOSLEN-B(A5),D0ƒLENGTHŠTST.B‚CPYFLG-B(A5)‡HARDCOPY?ŠBNE.S‚UPDA00.1‹BRANCHIFNO+ŠMOVE.WIOSLUN+OUTIOS-1-B(A5),-(A7)SAVELU#ŠMOVE.B#PRTLUN,IOSLUN+OUTIOS-B(A5)/ŠBSR„SENDMSGS‹SENDOPERATORRESPONSETOPRINTER5ŠMOVE.W(A7)+,IOSLUN+OUTIOS-1-B(A5)RESTOREFORMERLUUPDA00.1‚MOVE.LA0,A1 ŠMOVE.LD0,D4ŽLENGTHOFRESPONSE(ŠMOVE.L#1,D0ŽCASE1:ONLYCRASRESPONSE ŠTST.L…D4"ŠBEQ„UPDA55JMPIFCRWASRESPONSE"ŠMOVE.B(A1)+,D0‹GET1STCHARACTERŠCMP.B‚#'',D0ŒISITABLANK?1ŠBEQ.S‚UPDAN0YES..BLANKHANDLEDASSOLITARY‚CRŠBRA.S‚UPDAN5NO..UPDAN0„MOVE.L#1,D0 ŠBRA„UPDA55*UPDAN5„SUB.L‚#1,D4ŽONECHARACTERRESPONSE?ŠBEQ„UPDA50YES,GOHANDLEIT$ŠCMP.B‚#'Q',D0ŒSPECIALCASEFORQUIT+ŠBEQ„UPDA50HANDLE'QUIT'ASIFITWERE'Q'ŠCMP.B‚#'0',D0ŒNO,OFFSET?ŠBLT.S‚UPDAA0.NOŠCMP.B‚#'9',D0Œ.ŠBLE„UPDA41YESUPDAA0„CMP.B‚#'$',D0ŒNO,PSN?ŠBEQ.S‚UPDA01YES)ŠCMP.B‚#'',(A1)+‰NEXTBYTEMUSTBESPACEŠBNE„UPDA40AŒERRORŠMOVE.L#1,D6ŽFLAGDPSNŠCMP.B‚#'D',D0 ŠBEQ.S‚UPDAA5ŠCMP.B‚#'A',D0$ŠBNE„UPDA40ERROR--INVALIDCOMMANDŠMOVE.L#2,D6ŽFLAGAPSN*‰BRA.S‚UPDA05¤12/06/846UPDAA5„CMP.B‚#'$',(A1)+‰NEXTBYTEMUSTBE'$'‚12/06/84ŠBEQ.S‚UPDA05¤12/06/84"ŠBRA„UPDA40AŒSYNTAXERROR‹12/06/84* *ˆGETPSN*UPDA01„CLR.L‚D6‘FLAG$PSNŠMOVE.B(A1),D0$UPDA05„SUB.L‚A3,A3ŽINITSECTORCOUNT ŠCLR.L‚D3ŠCLR.L‚D2‘COUNTDIGITSFORPSNŠCMP.B‚#',',D0 ŠBEQ.S‚UPDA11UPDA10„MOVE.B(A1)+,D0‹GETPSN ŠCMP.B‚#CR,D0ŠBEQ.S‚UPDA20ONLYPSNGIVENŠCMP.B‚#'',D0$ŠBEQ.S‚UPDA20ERRORIFNOHEXDIGITS$ŠCMP.B‚#',',D0ŒSECTORCOUNTFOLLOWS?ŠBEQ.S‚UPDA17YES+ŠBSR„HEXBINCONVERTONEHEXDIGITTOBINARYŠBNE„UPDA40VALUEERROR%ŠADD.L‚#1,D2ŽONEMOREDIGITPROCESSEDŠCMP.L‚#8,D2ŽTOOMANYDIGITS?!ŠBHI„UPDA40AŒYES....SYNTAXERROR ŠLSL.L‚#4,D3!ŠOR.BƒD1,D3ŽD3=PSNVALUESOFAR ŠBRA„UPDA10**ˆ$,N*UPDA11„TST.B‚(A1)+ŽSKIPCOMMAŠMOVE.LA1,A0ŽGETNŠBSR„DECBINWŒ.ŠBNE„UPDA40VALUEERROR4ŠMOVE.LA0,A1ŽA1->BYTEAFTERTERMINATINGCHARACTERŠTST.L‚D1‘CAN'TGIVEZEROŠBEQ„UPDA40AŒSYNTAXERRORŠMOVE.LD1,D2ŽDUMPONLY&ŠBRA„UPDA53RETURNPSNOFITEMSTART+N*(*ˆENDOFPSNFIELD,SECTORCOUNTFOLLOWS*$UPDA17„MOVE.LA1,A0ŽGETSECTORCOUNT'ŠBSR„DECBINWŒCONVERTDECTOBINARYWORDŠBNE„UPDA40VALUEERROR ŠMOVE.LA0,A1ŠCMP.B‚#';',D0#ŠBEQ„UPDA40AŒCAN'TTERMINATEIN';'ŠCMP.B‚#'.',D0ŒORIN'.' ŠBEQ„UPDA40AŠTST.L‚D1‘CAN'TGIVEZERO ŠBEQ„UPDA40AŠMOVE.LD1,A3ŽSAVESECTORCOUNT**ˆCHECKPSN‚GIVEN*UPDA20„TST.L‚D2‘ANYPSNGIVEN?ŠBEQ„UPDA40AŒNO,SYNTAXERRORŠTST.L‚D6‘$PSN?ŠBEQ.S‚UPDA24YES3ŠMOVE.LD3,D1ŽNO,GETPSNTODEALLOCATEORALLOCATEŠMOVE.L#10,D3'DPSN'?ŠSUB.L‚#1,D6Ž.ŠBEQ.S‚UPDA22YESŠMOVE.L#11,D3NO,'APSN'UPDA22„MOVE.LA3,D2Ž'N'GIVEN?ŠBNE.S‚UPDA23YESŠMOVE.L#1,D2ŽNO,DEFAULTIS1"UPDA23„BSR„MPSNCŽCHECKPSNONDISKŠBHI„UPDA90ERROR*ŠMOVE.LD3,D0ŽOK,RETURNACCORDINGTOCASE ŠBRA„UPDAR T* *ˆGETOFFSET*UPDA24„CLR.L‚D5 ŠCLR.L‚D2ŠCMP.B‚#CR,D0DONE?ŠBEQ.S‚UPDA32YES UPDA25„EQU„*ŠMOVE.B(A1)+,D0ŠCMP.B‚#'#',D0ŒORISIT'#PR'?'ŠBEQ„UPDA60MAYBE(SETPRTFLGIFITIS)ŠCMP.B‚#'',D0!ŠBEQ.S‚UPDA30NO,DONEWITHFIELD ŠCMP.B‚#CR,D0 ŠBEQ.S‚UPDA30ŠBSR„HEXBINCONVERTNEXTBYTEŠBNE„UPDA40VALUEERROR ŠLSL.L‚#4,D2 ŠOR.BƒD1,D2ŠADD.L‚#1,D5ŽCOUNTDIGITS ŠBRA„UPDA25!UPDA30„TST.L‚D5‘ANYOFFSET‚GIVEN?ŠBNE.S‚UPDA35YESŠBRA.S‚UPDA31A)UPDAPR„EQU„*’NO,CANONLYENDWITHSPACESUPDA31„MOVE.B(A1)+,D0UPDA31AƒCMP.B‚#CR,D0 ŠBEQ.S‚UPDA32ŠCMP.B‚#'',D0ŠBNE.S‚UPDA40AŒSYNTAXERROR ŠBRA„UPDA31UPDA32„MOVE.LA3,D2Ž$PSN,N%ŠBNE.S‚UPDA33ANYSECTORCOUNTGIVEN?ŠMOVE.L#1,D2ŽNO,DEFAULTIS1ŠBRA.S‚UPDA331**ˆRETURNPSN-SECTORCOUNT*1UPDA33„MOVE.LA3,D2ŽRETURNSPECIFIEDSECTORCOUNT8UPDA331ƒMOVE.LD3,D0ŽCHECKLASTPSNNOTPASTENDOFDISK ŠADD.L‚D2,D0 ŠSUB.L‚#1,D0ŠCMP.L‚MPSN-B(A5),D0ŠBHI„UPDA90ERROR$UPDA34„BSETƒ#31,D2FLAGSECTORCOUNTUPDAPS„MOVE.LD3,D1ŽPSN ŠMOVE.L#7,D0+ŠCMP.L‚UPDSTR-B(A5),D3„ISPSNWITHINRANGE?ŠBLT.S‚UPDANR.NOŠCMP.L‚UPDEND-B(A5),D3„.ŠBLT„UPDARTYES%UPDANR„MOVE.L#9,D0ŽNO,RETURNCASE9 ŠBRA„UPDART **ˆRETURNPSN-OFFSET-VALUE*#UPDA35„CLR.L‚D0‘SECTORCOUNTGIVEN?ŠCMP.L‚D0,A3Ž. ŠBNE.S‚UPDA40AŒYES,SYNTAXERROR&ŠCMP.L‚#4,D5Ž4CHARACTEROFFSETISMAXŠBHI.S‚UPDA40AŒSYNTAXERROR.ŠCMP.L‚UPDSTR-B(A5),D3„CHECKPSNWITHINBOUNDSŠBLT„UPDA90.ERRORŠCMP.L‚UPDEND-B(A5),D3„.ŠBGE„UPDA90.ERROR UPDA36„EQU„*ŠMOVE.B(A1),D0ŒENDOFLINEŠCMP.B‚#'',D0 ŠBEQ.S‚UPDA38 ŠCMP.B‚#CR,D0ŠBEQ.S‚UPDA40AŒSYNTAXERROR%ŠMOVE.LA1,A3ŽRETA3->1STVALUEBYTE ŠBRA„UPDAPS!UPDA38„TST.B‚(A1)+ŽNEXTCHARACTER ŠBRA„UPDA36**ˆUPDATERESPONSEERROR* UPDA40„EQU„**ŠBSR„RESPNASENDINVALIDCOMMANDERRORMSGŠBRA„UPDA00TRYAGAIN UPDA40AƒEQU„*'ŠBSR„SYNTXERR‹SENDSYNTAXERRORMESSAGEŠBRA„UPDA00TRYAGAIN**ˆOFFSETVALUE(,VALUE)...*UPDA41„CLR.L‚D2‘INITOFFSETUPDA42„BSR„HEXBINCONVERTŠBNE„UPDA40VALUEERROR ŠLSL.L‚#4,D2 ŠOR.BƒD1,D2ŠMOVE.B(A1)+,D0 ŠCMP.B‚#CR,D0ŠBEQ„UPDA40AŒSYNTAXERRORŠCMP.B‚#'',D0 ŠBNE„UPDA42+UPDA43„MOVE.B(A1),D0ŒGETPOINTERTOVALUESŠCMP.B‚#'',D0 ŠBNE.S‚UPDA44ŠTST.B‚(A1)+ŽSKIPSPACES ŠBRA„UPDA43(UPDA44„CMP.B‚#CR,D0MUSTHAVENEWVALUESŠBEQ„UPDA40AŒSYNTAXERROR1ŠMOVE.LUPDSTR-B(A5),D1„RETURNFIRSTSECTOR'SPSN:ŠMOVE.LA1,A3ŒASSUMETHISISFIRSTCHARACTEROFNEWVALUESŠMOVE.L#12,D0RETURNCASE#)ŠCMP.L‚#$FF,D2ŒCHECKOFFSETNOTTOOLARGEŠBLE.S‚UPDARTOKŠBRA„UPDA40AŒSYNTAXERROR**ˆSINGLECHARACTERRESPONSE*UPDA50:ƒMOVE.BD0,D1ŠMOVE.L#6,D0ŽQRESPONSEŠCMP.B‚#'Q',D1 ŠBEQ.S‚UPDA55ŠMOVE.L#13,D0ŠCMP.B‚#'C',D1ŒCRESPONSE? ŠBEQ.S‚UPDA55ŠMOVE.L#2,D0ŽNRESPONSEŠCMP.B‚#'N',D1 ŠBEQ.S‚UPDA55ŠMOVE.L#3,D0ŽRRESPONSEŠCMP.B‚#'R',D1 ŠBEQ.S‚UPDARTŠMOVE.L#4,D0ŽDRESPONSEŠCMP.B‚#'D',D1 ŠBEQ.S‚UPDARTŠMOVE.L#5,D0ŽARESPONSEŠCMP.B‚#'A',D1 ŠBEQ.S‚UPDARTŠMOVE.L#14,D0?Rresponse-ŠCMP.B‚#'?',D1ŒUserneedshelp-shortform?7ŠBEQ.S‚UPDARTreturntoroutinethroughtabletohandleŠMOVE.L#15,D0Hresponse,ŠCMP.B‚#'H',D1Œuserneedshelp-longform?7ŠBEQ.S‚UPDARTreturntoroutinethroughtabletohandleŠCMP.B‚#'$',D1Œ$RESPONSEŠBNE„UPDA40NO,ERRORŠCLR.L‚D2‘N=0UPDA53:ƒMOVE.L#8,D0ŽCASE8:$%ŠMOVE.LUPDSTR-B(A5),D1„RETURNPSN,NŠBSETƒ#31,D2DUMPONLY*)*ˆTERMINATINGRESPONSE,CRORNORCORQ* UPDA55„EQU„*ŠPAGE*4*ˆGETCASERETURNADDRESSTOTOPOFSTACKFORRETURN*/UPDART„MOVEM.L(A7)+,D3-D6/A1„RESTOREREGISTERS*ŠSUB.L‚#1,D0ŽGETOFFSETFORBRANCHADDRESSŠLSL.L‚#2,D0ŽMULTIBLYBYFOUR#ŠMOVE.L(A7),A0ŒA0=RETURNADDRESS2ŠMOVE.L(A0,D0),D0‰D0=RETURNADDRESS-BASEBIASŠADD.L‚A5,D0ŽADDBASEBIAS#ŠMOVE.LD0,(A7)ŒJIMMYSTACKFORRTSCŠRTS„NOWRETURNBRANCHESTOWHOEVERHANDLESTHEPARTICULARRESPONSE**ˆ#PR:SETPRINTEROUTPUTFLAG* 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„UPDA40PRINTERNOTSPECIFIEDERRORUPDA70„MOVE.B#1,PRTFLG-B(A5) ŠBRA„UPDAPR* *ˆPSNERROR*UPDA90„MOVE.L#PERMSGL,D0ŠLEA„PERMSG(PC),A0 ŠBSR„SENDMSGS ŠBRA„UPDA00 ŠPAGE*O**********************************************************************************ˆREPAIR1.007/3/80HBN6*O********************************************************************************!*ˆREPAIRREQUESTS'REPAIR(Y/N)?'*"*ˆONRETURN:Z-1IF'Y'RESPONSE*—0IF'N'REPSONSE* REPAIR„EQU„*ŠMOVEM.LD0/A0,-(A7)ŠLEA„REPRQST(PC),A0ŠMOVE.L#REPRQSTL,D0ŠBSR„SENDMSGS‹SENDREQUESTŠBSR.S‚GETRYNGETRESPONSEŠMOVEM.L(A7)+,D0/A0ŠRTS*O*********************************************************************************ˆGETRYN:1.007/3/80HBN6*O********************************************************************************>*ˆGETRYNREADSRESPONSEFROMUSER;ONLY'Y'OR'N'ISACCEPTED*,*ˆONRETURN:ALLREGISTERSUNCHANGEDEXCEPT:*“D0-CHANGED*“Z=1IF'Y'ANSWERWASGIVEN*—0IF'N'ANSWERWASGIVEN*—0IFCR‚ANSWERWASGIVEN* GETRYN„EQU„**ŠMOVE.LA0,-(A7)'GETRY0„IOSCALLINPIOS(PC)ˆREADRESPONSE ŠBNE„IOERR ŠBSR„SBARG)ŠBSR.S‚HRDCPYSENDHARDCOPYIFNECESSARYAŠMOVE.LIOSLEN+INPIOS-B(A5),D0ƒACCEPTONLYONECHARACTERRESPONSE*‰SUB.L‚#1,D0Ž.*‰BNE.S‚GETRY1BADRESPONSE%ŠMOVE.BINPBUF-B(A5),D0„GETCHARACTERŠCMP.B‚#'Y',D0ŒISITYES?ŠBEQ.S‚GETRYRYESŠCMP.B‚#CR,D0isitaCR?,ŠBEQ.S‚GETRYCYes..handleasifitwasa'N'ŠCMP.B‚#'N',D0ŒORISITNO?ŠBNE.S‚GETRY1NEITHERISERRORGETRYC„TST.B‚D0‘Z=0FOR'N'GETRYR„MOVE.L(A7)+,A0ŠRTS+GETRY1„BSR.S‚RESPNANOTACCEPTABLERESPONSEŠBRA„GETRY0TRYAGAINŠPAGE*O**********************************************************************************ˆRESPNA1.007/3/80HBN6*O********************************************************************************@*ˆRESPNASENDS'WHAT'MESSAGEBECAUSERESPONSEISNOTACCEPTABLE*$*ˆONRETURN:ALLREGISTERSUNCHANGED* RESPNA„EQU„*ŠMOVEM.LA0/D0,-(A7)ŠLEA„WHTMSG(PC),A0ŠMOVE.L#WHTMSGL,D0 ŠBSR„SENDMSGSŠMOVEM.L(A7)+,D0/A0ŠRTS*O******************************************************************************* * 11/07/846*ˆSYNTXERRSENDS'SYNTAXERROR--try‚?‚orHforhelp'*$*ˆONRETURN:ALLREGISTERSUNCHANGED*SYNTXERR:EQU„*ŠMOVEM.LA0/D0,-(A7)ŠLEA„SYNTMSG(PC),A0ŠMOVE.L#SYNTMSGL,D0 ŠBSR„SENDMSGSŠMOVEM.L(A7)+,D0/A0ŠRTSŠPAGE*O*********************************************************************************ˆHRDCPY1.0012/1/80HBN6*O********************************************************************************E*ˆHRDCPYSENDSINPUTLINEIMAGETOTHELINEPRINTER‚(IFLPSPECIFIED)*+*ˆONENTRY:A0->INPUTIOSPARAMETERBLOCK.*ˆONRETURN:ALLREGISTERSUNCHANGEDEXCEPTD0* HRDCPY„EQU„**(ŠTST.B‚CPYFLG-B(A5)‡HARDCOPYREQUESTED?ŠBNE.S‚HRDCP05ŒBRANCHIFNOŠMOVEM.LD1-D2/A1,-(A7) ŠBSR„INCLINE5ŠMOVE.W#IOWRIT,IOSFCT(A0)SET-UPTOWRITETOPRINTERŠMOVE.B#PRTLUN,IOSLUN(A0)%ŠMOVE.LIOSSAD(A0),D0†SETENDADDRESSŠADD.L‚IOSLEN(A0),D0 ŠCMP.L‚IOSSAD(A0),D0†LENGTH=0?ŠBNE.S‚HRDCP0AŒNO"ŠMOVE.LD0,A1ŽYES-OUTPUT1SPACEŠMOVE.B#'',(A1)ŠBRA.S‚HRDCP0BHRDCP0AƒSUB.L‚#1,D0HRDCP0BƒMOVE.LIOSLEN(A0),D1ŠMOVE.LIOSEAD(A0),D2ŠMOVE.LD0,IOSEAD(A0) ŠIOSCALL(A0)ŠBNE.S‚HRDCPER)HRDCP00ƒMOVE.B#CDFLUN,IOSLUN(A0)RESTOREŠMOVE.W#IOREAD,IOSFCT(A0)ŠMOVE.LD1,IOSLEN(A0)ŠMOVE.LD2,IOSEAD(A0)ŠMOVEM.L(A7)+,D1-D2/A1HRDCP05ƒCLR.L‚D0ŠRTS*HRDCPERƒBSR„PIOERMSŒSENDPRINTERERRORMSG6* IF PRINTER ERROR SOMETHING BESIDES 'NOT READY', QUIT HRDCPY05:ŠCMP.B‚#ISTANR,D0 ŠBNE„KILLREP'*œJMPIFSOMETHINGOTHERTHANNOTREADY$HRDCP10ƒERQ.DELAY1500ŒDELAY1.5SEC ŠIOSCALL(A0)!ŠBEQ„HRDCP00ŒTRYTILLERROR CLEAR‰CMP.B…#ISTABRK,D0 ‰BEQ‡BREAKREP*œJMPIF'BREAK'REQUEST‰BRA.S…HRDCPY05*œCONTINUELOOPŠPAGE*O**********************************************************************************‡UPDBUF1.006/27/80HBN6*O********************************************************************************B*ˆUPDBUFUPDATESGIVENBUFFERBYPROCESSING'UPDATE'RESPONSELINED*ˆERRORMESSAGEISSENTIFTRYTOCHANGEPASTBUFFERENDORGIVEBAD*ˆINPUT*/*ˆONENTRY:D2=OFFSETTOFIRSTBYTETOCHANGE*’A1=STARTOFBUFFER5*’A2=FIRSTBYTENOTTOBECHANGED(ENDOFBUFFER)-*’A3=ADDRESSOFINPUTBUFFERFORNEWVALUES*—BUFFERENDSWITHCR*$*ˆONRETURN:ALLREGISTERSUNCHANGED* UPDBUF„EQU„**)*ˆCHECKNOTTRYINGTOCHANGEINVALIDBYTE*)ŠMOVEM.LD0-D2/A0-A4,-(A7)SAVEREGISTERS8ŠLEA„(A1,D2),A4‰STARTINGADDRESSFORBYTESTOBECHANGEDFUPDB00„CMP.L‚A2,A4…OFFSETERRORIFTRYINGTOCHANGEPASTALLOWEDRANGEŠBGE.S‚UPDB25.**ˆGETNEWVALUEFORNEXTBYTE*(ŠMOVE.B(A3)+,D0‹DONEIFCARRIAGERETURN ŠCMP.B‚#CR,D0ŠBEQ.S‚UPDBRTDONE-ŠCMP.B‚#'.',D0ŒASCIIVALUESTARTSWITHAN'.'(ŠBEQ.S‚UPDB15.GOGETBYTETHATFOLLOWS'ŠBSR„HEXBINHEXVALUES,GETFIRSTDIGITŠBNE.S‚UPDB35VALUEERROR(ŠMOVE.B(A3)+,D0‹GETSECONDDIGITIFANYŠCMP.B‚#',',D0Œ..ŠBEQ.S‚UPDB20ONEDIGITONLY,GOSETNEWVALUEŠCMP.B‚#CR,D0.%ŠBEQ.S‚UPDB20ONEDIGITONLYANDDONEŠLSL.L‚#4,D1ŽSAVE4HIGHBITSŠMOVE.BD1,D2Ž.ŠBSR„HEXBINCONVERTLOWERDIGITŠBNE.S‚UPDB35VALUEERROR1ŠOR.BƒD2,D1ŽNOWHAVE2DIGITSCONVERTEDTOBINARY**ˆCHECKENDOFFIELD*UPDB05„MOVE.B(A3)+,D0ŠCMP.B‚#',',D0ŠBEQ.S‚UPDB20OK ŠCMP.B‚#CR,D0ŠBNE.S‚UPDB35ERRORŠBRA.S‚UPDB20OK&UPDB15„MOVE.B(A3)+,D1‹GETASCIIVALUEŠCMP.B‚#CR,D1ERRORIFCR ŠBEQ.S‚UPDB35 ŠBRA„UPDB05GOFINDENDOFFIELD**ˆSETNEWVALUE*"UPDB20„MOVE.BD1,(A4)+‹UPDATEBYTEŠCMP.B‚#CR,D0DONE?*ŠBNE„UPDB00NO,GOGETVALUEFORNEXTBYTE2UPDBRT„MOVEM.L(A7)+,D0-D2/A0-A4RESTOREREGISTERSŠRTS%UPDB25„LEA„OFSMSG(PC),A0ŠOFFSETERRORŠMOVE.L#OFSMSGL,D0UPDB30„BSR„SENDMSGS ŠBRA„UPDBRT$UPDB35„LEA„VALMSG(PC),A0ŠVALUEERRORŠMOVE.L#VALMSGL,D0ˆ. ŠBRA„UPDB30ŠPAGE*O*********************************************************************************ˆCDIRNC1.008/1/80HBN6*O********************************************************************************B*ˆCDIRNCCHECKSCOMMONFIELDSINDIRECTORYENTRYFORNONCONTIGUOUS*ˆFILES*'*ˆONENTRY:A2=PDBENTRYBASEADDRESS**ˆONRETURN:Z=1IFENTRYOK"*—0ANDD0=0IFSKIP/DELETEFILE-*—0ANDD0=1IFTOREQUESTUPDATEPDBENTRY* CDIRNC„EQU„***ˆCHECKDBSIZEISOK* ŠCLR.L‚D2ŠMOVE.BDIRDAT(A2),D23ŠCMP.B‚#DATMIN-1,D2‡MUSTBEATLEASTMINIMUMLENGTHŠBLS„CDRE01ERRORIFLESS<ŠCMP.B‚DIRLBZ(A2),D2†LASTDATABLOCKMUSTBESAMELENGTHNOWŠBNE„CDRE05ERROR+CDIR00„MOVE.LD2,DBLEN-B(A5)…SAVEDBLENGTH**ˆCHECKRECORDLENGTHISOK* ŠCLR.L‚D0ŠMOVE.WDIRLRL(A2),D0*ŠMOVE.WD0,RECLEN-B(A5)„SAVERECORDLENGTHŠBEQ.S‚CDIR01ZEROISOK>ŠMULUƒD6,D2†MAKESURERECORDSIZESUPPORTEDBYDATABLOCKSIZEŠCMP.L‚D2,D0Ž.ŠBHI„CDRE10ERROR+ŠBTSTƒ#0,D0ŽODDRECORDLENGTHISERRORALSO ŠBNE„CDRE10.**ˆCHECKFABSIZE*CDIR01„CLR.L‚D2ŠMOVE.BDIRFAB(A2),D2%ŠMOVE.LD2,FABLEN-B(A5)„SAVEFABSIZEŠBEQ„CDRE20ERRORIFZERO ŠCMP.B‚#20,D2ŠBHI„CDRE20ERRORIFTOOLARGE**ˆCHECKDIREOR,DIREOF*/CDIR05„MOVE.LDIREOF(A2),D1†LSNMUSTBEONDISK>ŠBMI.S‚CDIR40‡-1ISOKIFDIREORISALSO-1,ANDDIRFS=DIRFE=0ŠCMP.L‚MPSN-B(A5),D1†LSNOK?ŠBHI.S‚CDRE00ERRORINEOFHCDIR10„MOVE.LDIREOR(A2),D1„DIREORCANNOTBENOW-1,ANYTHINGELSEISOKŠBMI.S‚CDRE00ERRORŠPAGE*-*ˆCHECK1STFABPOINTERISOK(D2=FABSIZE)* CDIR15„EQU„*ŠMOVE.LDIRFS(A2),D1EŠBEQ‚CDRE85ERRORIFNONE(DIREOR,DIREOFDIDN'TINDICATEEMPTYFILE)ŠBSR„MPSNCŽCHECKPSNOKŠBHI„CDRE90ERROR)ŠTST.B‚RCVFLG-B(A5)‡OK,RECOVERDELFILE?ŠBNE.S‚CDIR16YES"ŠBSR „TSTALCNO,SECTORSALLOCATED?ŠBNE„CDRE50NO,ERRORŠBRA.S‚CDIR20OK'CDIR16„BSR„TSTFRECHECKNOTREALLOCATEDŠBNE„CDRE100ŒERROR-CDIR20„BSR„TSTNYACHECKNOTALREADYALLOCATEDŠBNE„CDRE55ERROR**ˆDIRECTORYENTRYISOKSOFAR*CDIROK„CLR.L‚D0‘DONEŠRTS***ˆDIREOF/DIREORANDDIRFS/DIRFECONFLICT?*CDIR40„ADD.L‚#1,D1Ž-1ISOKŠBNE.S‚CDRE00ERROR;ŠMOVE.LDIREOR(A2),D1†IFDIREOF=-1THENDIREORMUSTBE-1 ŠADD.L‚#1,D1ŠBNE.S‚CDRE00ERRORŠMOVE.B#1,FILOK-B(A5)>ŠMOVE.LDIRFS(A2),D0‡OK,NOWMUSTHAVENOFAB'SFOREMPTYFILEŠOR.LƒDIRFE(A2),D0.ŠBEQ.S‚CDIRSKPŒFILEENTRYOK,SKIPSINCEEMPTY'ŠTST.L‚DIRFS(A2)ŠFIRSTFABPOINTERBAD?ŠBEQ„CDRE0CYES#ŠCLR.B‚FILOK-B(A5)ˆFLAGFILENOTOK'CDRE00„LEA„EFCMSG(PC),A0ŠSENDERRORMSGŠMOVE.L#EFCMSL,D0 ŠBSR„SENDMSQC%ŠLEA„RECMSG(PC),A0ŠINNIMRECALCULATEŠMOVE.L#RECMSGL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠBEQ.S‚CDRE0AREPAIR? ŠBSR„IM‘NOŠBEQ„CDIRUPDŒUPDATEPDEINIM,CDIRDS„BSR„DELFILINNIMDELETEORSKIPFILE!CDIRSKPƒCLR.L‚D0‘FLAGSKIP/DELETE ŠCMP.B‚#1,D0ŠRTSFCDRE0A„MOVE.B#1,CNTFLG-B(A5)„UPDATEDIREOF/DIREORATENDOFFABCHECK#ŠCLR.L‚DIREOR(A2)‰SETEMPTYFORNOWŠCLR.L‚DIREOF(A2)‰.ŠMOVE.B#1,PDBFLG-B(A5)ŠBRA„CDIR15CONTINUE*2CDRE0B„CMP.B‚#FLOLNK,FABCHK-B(A5)FORWARDLINKOK?ŠBEQ„CDRE00YES,ŠLEA„EFCMSG(PC),A0ŠNO,BOTHLINKSFAILED(=0)ŠMOVE.L#EFCMSGL,D0 ŠBSR„SENDMSQC‹SENDERRORMESSAGEŠLEA„RECMSG(PC),A0ŠMOVE.L#RECMSGL,D0 ŠBSR„SENDMSG0ŠMOVE.L#-1,DIREOR(A2)…SETEMPTYFILEINDICATORSŠMOVE.L#-1,DIREOF(A2)….)ŠMOVE.B#1,PDBFLG-B(A5)„UPDATEDPDBENTRY ŠBRA„CDIRSKPŒNOWSKIPEMPTYFILE*ACDRE0C„LEA„EFFMSG(PC),A0†EMPTYFILEBUTLASTFABPOINTERNOTZEROŠMOVE.L#EFFMSGL,D0 ŠBSR„SENDMSQC ŠBNE„CDIRUPDŠBSR„ZROUTŽZEROFABPOINTER?ŠBNE„CDIRSKPŒNOŠCLR.L‚DIRFE(A2)ŠYESŠMOVE.B#1,PDBFLG-B(A5)ŠMOVE.B#1,FILOK-B(A5) ŠBRA„CDIRSKP**ˆER:DIRDATSIZERROR*CDRE01„LEA„DBZFLD(PC),A0 ŠMOVE.LD2,D1 ŠBSR„BIN1HEXŠLEA„DBZMSG(PC),A0ŠMOVE.L#DBZMSGL,D0 ŠBSR„SENDMSQC#ŠBNE„CDIRUPDŒUPDATEPDBENTRYINIM&ŠBRA„CDIRDSDELETEORSKIPFILEINNIM**ˆER:DIRLBZ<>DIRDAT*CDRE05„LEA„LDBZMSG(PC),A0ŠMOVE.L#LDBZMSGL,D0 ŠBSR„SENDMSGS ŠCLR.L‚D1ŠLEA„DBZFLD(PC),A0ŠMOVE.BDIRDAT(A2),D1 ŠBSR„BIN1HEX$ŠLEA„DBZMS(PC),A0‹SENDFILESDBSIZEŠMOVE.L#DBZMSL,D0 ŠBSR„SENDMSQCŠBSR„SETEQLSETEQUAL?ŠBEQ.S‚CDRE06YES ŠBSR„IM‘NO$ŠBEQ.S‚CDIRUPDŒINIMUPDATEPDELOOP#ŠBRA„CDIRDSINNIMDELORSKIPFILECDRE06„MOVE.BD2,DIRLBZ(A2)†FIXŠMOVE.B#1,PDBFLG-B(A5)ŠBRA„CDIR00CONTINUEŠPAGE**ˆER:RECORDLENGTH*CDRE10„LEA„RLEFLD(PC),A0 ŠMOVE.LD0,D1 ŠBSR„BIN2HEXŠLEA„RLEMSG(PC),A0ŠMOVE.L#RLEMSGL,D0CDRE11„BSR„SENDMSQC,ŠBNE.S‚CDIRUPDŒASKTOUPDATEPDBENTRYINIM&ŠBRA„CDIRDSDELETEORSKIPFILEINNIM**ˆER:FABSIZE*CDRE20„LEA„FBZFLD(PC),A0 ŠMOVE.LD2,D1 ŠBSR„BIN1HEXŠLEA„FBZMSG(PC),A0ŠMOVE.L#FBZMSGL,D0 ŠBRA„CDRE11**ˆER:FIRSTFABNOTALLOCATED*CDRE50„BSR„FABNALŠBEQ.S‚CDRE51ALLOCATEINNIMŠMOVE.LFABLEN-B(A5),D0ŠMOVE.L#'FAB',PSNITM-B(A5) ŠBSR„DMPALCŠBEQ.S‚CDRE52ALLOCATEINIM?/CDIRUPDƒMOVE.B#1,D0ŽNO,REPEATUPDATEPDELOOPŠRTS)CDRE51„MOVE.L#'FAB',ALCITM-B(A5)INNIMŠMOVE.L#ALCMSGL,D0ŠLEA„ALCMSG(PC),A0ŠBSR„SENDMSGŒSENDACTIONMSG'CDRE52„MOVE.LSATDBUF-B(A5),A0ƒALLOCATE*ŠMOVE.B#1,SATFLG-B(A5)„.FLAGSATCHANGEDŠMOVE.L#1,D0Ž. ŠBSR„ALDESCŠBRA„CDIR20GOALLOCATE*!*ˆER:FIRSTFABALREADYALLOCATED*CDRE55„BSR.S‚FABALEŠBNE„CDIRUPDŒINIM‚UPDATEPDE#ŠBRA„CDIRDSINNIMSKIPORDELFILE*+*ˆDIRFS/DIRFEERROR(DIREOR/DIREOF.NE.-1)*$CDRE85„TST.L‚DIRFE(A2)ŠANYFABLINK?ŠBEQ.S‚CDRE91NO.CDRE90„LEA„BFLPSN(PC),A0ŠYES,BADFORWARDLINK ŠBSR„BIN4HEXŠLEA„BFLMSG(PC),A0ŠMOVE.L#BFLMSGL,D0 ŠBSR„SENDMSQCŠBNE„CDIRUPDŒINIMUPDATEPDE#ŠBRA„CDIRDSINNIMSKIPORDELFILE*%CDRE91„LEA„NFLMSG(PC),A0ŠNOFABLINKSŠMOVE.L#NFLMSGL,D0 ŠBSR„SENDMSQCŠLEA„SFEMSG(PC),A0ŠMOVE.L#SFEMSGL,D0ŠBSR„SENDMSGŒSETEMPTYŠMOVE.L#-1, DIREOR(A2)ŠMOVE.L#-1,DIREOF(A2)ŠMOVE.B#1,PDBFLG-B(A5) ŠBRA„CDIRSKP**ˆER:FABSPACEREALLOCATED*CDRE100ƒLEA„FADPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L#'FAB',FADITM-B(A5)ŠMOVE.L#FADMSGL,D0ŠLEA„FADMSG(PC),A0 ŠBSR„SENDMSQCŠBRA„CDIRDSSKIPORDELFILEŠPAGE*O*********************************************************************************ˆFABALE1.008/2/80HBN6*O********************************************************************************2*ˆFABALESENDSERRORMESSAGEFABALREADYALLOCATED**ˆONENTRY:D1=PSNOFFAB**ˆONRETURN:A0,D0-CHANGED *“Z=0IFIM *—1IFNIM*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*********************************************************************************ˆFABNAL1.008/2/80HBN6*O********************************************************************************.*ˆFABNALSENDSERRORMESSAGEFABNOTALLOCATED**ˆONENTRY:D1=PSNOFFAB**ˆONRETURN:A0,D0-CHANGED *“Z=0IFIM *—1IFNIM*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.008/2/80HBN6*O********************************************************************************E*ˆFDBCHKCHECKSFABANDDATABLOCKSFORERRORSANDCORRECTSPROBLEMS.D*ˆFABANDDBBUFFERSAREALLOCATED,THEYARERELEASEDATENDOFTHIS *ˆSUBROUTINE.*3*ˆONENTRY:A2=BASEADDRESSOFPDBENTRYFORFILE!*ˆONRETURN:FILOK=1IFFILEOK'*›0IFFILENOTOK(SKIPPEDORDELETED)*)*ˆREGISTERUSAGE:A6->CURRENTFABENTRY*˜A4->DIRENTRYFORFILE FDBCHK„EQU„***ˆINITIALIZEFORNEWFILE*ŠMOVEM.LD0-D6/A0-A6,-(A7)*ŠMOVE.LA2,A4ŽUSEA4FORDIRENTRYPOINTER?ŠCLR.L‚RECCNT-B(A5)†CLEARSECTORANDRECORDCOUNTSFORNEWFILEŠCLR.L‚SECCNT-B(A5)4ŠCLR.B‚CNTFLG-B(A5)‡FLAGNOTTOUPDATEDIREOR/DIREOF ŠCLR.L‚PRVFAB-B(A5)‡NOPRIORFABŠCLR.B‚DELNXF-B(A5)"ŠCLR.B‚DELPRI-B(A5)‡NOFABDELETED/ŠCLR.L‚D1‘ZEROOUTPRIORFABKEYSINCENONEYETŠMOVE.BDIRKEY(A4),D1†.ŠBEQ.S‚FDBC0Ž.SKIPIFNOKEYSŠLEA„PRIFKY(PC),A1Š. ŠBSR„CLRBUF.*)*ˆALLOCATESEGMENTFORFABANDDBBUFFERS*$FDBC0…MOVE.L#FDBSEG,D0‰SEGMENTNAME ŠMOVE.LFABLEN-B(A5),D1„FABSIZE(ŠMOVE.LD1,D2ŽGETDBBUFFERSTARTINGADR ŠMULUƒD6,D2Ž.ŠMOVE.LD2,DBBUF-B(A5)….3ŠADD.L‚DBLEN-B(A5),D1…GETDBBUFFERPHYSICALLENGTHŠMOVE.LD1,D2Ž. ŠMULUƒD6,D2Ž.8ŠMOVE.LD2,D1Ž.SAVETOTALBUFFERBCTFORGETSEGREQUEST ŠSUB.L‚#1,D2ŠBSR„GETSEGGETSEGMENT(ŠMOVE.LA1,FDBSTR-B(A5)„STARTOFSEGMENT ŠADD.L‚A1,D2ŠMOVE.LD2,DBEND-B(A5) ŠMOVE.LA1,D0ŠADD.L‚D0,DBBUF-B(A5)(ŠMOVE.LDIRFS(A4),D1‡GET1ST‚FABPOINTERŠPAGE*2*ˆREADFIRST/NEXTFABINTOMEMORY-D1=PSNOFFAB*ˆSETFABUPDATEBOUNDS*/FDBC00„TST.B‚DELNXF-B(A5)‡NEXTFABWASDELETED?ŠBEQ.S‚FDBC01NO4ŠCLR.B‚DELNXF-B(A5)‡YES,THENFLAGPRIORFABDELETED3ŠMOVE.B#1,DELPRI-B(A5)„SOBACKWARDLINKISUPDATED FDBC01„EQU„*&ŠCLR.L‚PRIFBE-B(A5)‡NOPRIORFABENTRY)ŠCLR.B‚DELCRI-B(A5)‡RESETDELETEFABFLAGŠMOVE.LFABLEN-B(A5),D2ŠMOVE.LD1,UPDSTR-B(A5)ŠMOVE.LD1,UPDEND-B(A5)ŠADD.L‚D2,UPDEND-B(A5),ŠCLR.L‚D5‘FLAGNOTTOTRUNCATEORDELETEFAB'ŠMOVE.LD1,PSNFAB-B(A5)„NEWCURRENTFABŠMOVE.L#'FAB',IOERITM-B(A5)ŠBSR„GETSECREADFABŠBEQ„FDBC10OK8ŠMOVE.B#1,FABFLG-B(A5)„IFCRCERRORTRYTOFIXBYWRITE ŠTST.B‚D0‘. ŠBEQ„FDBC10.**ˆIOERRORFROMFABREAD*FDBTR…CLR.B‚FABFLG-B(A5))ŠLEA„TRNMSG(PC),A0ŠTRUNCATEORDELETEFABŠMOVE.L#TRNMSGL,D0ŠMOVE.L#'FAB',TRNITM-B(A5)8ŠMOVE.L#1,D5ŽTRUNCATEIFCOULDN'TREADFIRSTFABSECTORŠTST.L‚LSTSRD-B(A5)ŠBEQ.S‚FDBC05TRUNCATE#ŠMOVE.L#2,D5ŽDELETE‚FAB,HAVELINKŠLEA„DELMSG(PC),A0ŠMOVE.L#DELMSGL,D0ŠMOVE.L#'FAB',DELITM-B(A5)FDBC05„BSR„SENDMSQCŠBNE„FDBC20UPDATEINIM'ŠMOVE.B#1 ,DELCRI-B(A5)„INNIM,DELETE?ŠCMP.B‚#2,D5Ž.:ŠBEQ„FDBC60ˆYES,GO‚DELETEFABAFTERNEXTFABLINKCHECKED*(*ˆTRUNCATEFABCHAIN-PRIORFABISLAST* FDBCTR„EQU„*ŠCLR.B‚FABFLG-B(A5)%ŠMOVE.LPRVFAB-B(A5),D1„GETPRIORFABŠBEQ„FDBCT50ŒNONE0ŠMOVE.L#1,D2ŽGET1STSECTORONLYTOUPDATELINKŠMOVE.LFABBUF-B(A5),A1ŠMOVE.L#'FAB',IOERITM-B(A5) ŠBSR„GETSEC ŠBNE„TRMREP-ŠCLR.L‚FABFLK(A1)‰PRIORFABNOWLASTINCHAIN ŠBSR„WRITSEC ŠBNE„TRMREP òHûMZ N=I#Q+U3I;HCNKISS[RcYkbsV{MƒW‹Z“P›Y£[«,6ŠMOVE.LD1,DIRFE(A4)‡UPDATEDIRENTRYLASTFABPOINTER3ŠMOVE.LRECCNT-B(A5),DIREOR(A4)‚UPDATE#OFRECORDS3ŠMOVE.LSECCNT-B(A5),DIREOF(A4)‚UPDATE#OFSECTORSŠMOVE.B#1,PDBFLG-B(A5)*$FDBCOK„MOVE.B#1,FILOK-B(A5)…FILEOKFDBCSF„EQU„*’SKIPFILERETURN*%*ˆMAKESUREDBANDFABBUFFERFLUSHED*ŠTST.B‚FABFLG-B(A5) ŠBEQ.S‚FDBCS0-ŠCLR.B‚FABFLG-B(A5)‡FABTOBEUPDATEDONDISK(ŠMOVE.LFABBUF-B(A5),A1„BUFFERSTARTADRŠMOVE.LPSNFAB-B(A5),D1„PSN ŠMOVE.LFABLEN-B(A5),D2„FABSIZEŠMOVE.L#'FAB',IOERITM-B(A5) ŠBSR„WRITSECŠBNE„TRMREPERROR-QUITNOW&FDBCS0„BSR„UPDBUPDATEDBIFNECESSARY ŠBNE„TRMREP*&*ˆDEALLOCATEFILE'SBUFFERSANDRETURN*ŠMOVE.L#FDBSEG,D0 ŠBSR„DELSEGŠMOVEM.L(A7)+,D0-D6/A0-A6ŠRTS**ˆNOFABS,SETFILEEMPTY* 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*ˆTRUNCATEFABCHAIN:CURRENTFABBECOMESLASTINCHAIN*#FDBCTC„CLR.L‚FABFLK(A1)‰NONEXTFAB@ŠMOVE.LPSNFAB-B(A5),DIRFE(A4)ƒSETNEWLASTFABPOINTERINTODIRŠMOVE.B#1,FABFLG-B(A5)ŠMOVE.B#1,PDBFLG-B(A5)2ŠBRA„FDBC80FILECHECKDONEAFTERTHISFABCHECKED**ˆUPDATEFABLOOP* FDBC10„BSR„IMŠBNE„FDBC60INNIMCHECKFAB-FDBC15„MOVE.LPSNFAB-B(A5),D1„DUMPALLOFFABŠMOVE.LFABBUF-B(A5),A1ŠMOVE.LFABLEN-B(A5),D2 ŠBSETƒ#31,D2FDBC16:ƒMOVE.LPSNFAB-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„RD5=0ISERROR,D5=1IFTRUNCATE(PRIORFABLAST)>*ŒD5=2IFDELCURRENTFAB,D5=3IFTRUNCATE(CURRENTFABLAST)*ŒD5=4IFDELETENEXTFABŠDC.LƒFDBC30-B‹DDELETEFABŠDC.LƒFDBC25-B‹AN/AŠDC.LƒTRMREP-B‹QŠDC.LƒFDBC45-B‹$PSNINRANGEŠDC.LƒFDBC42-B‹$DUMPFAB ŠDC.LƒFDBC40-B‹$PSNOUTOFRANGE<ŠDC.LƒFDBC25-B†DPSN-DELETEDATABLOCKƒ**LATERVERSION**ŠDC.LƒFDBC25-B‹APSN-N/AŠDC.LƒFDBC45-B‹OFFSETŠDC.LƒFDBC56-B‹C ŠDC.LƒFDBSHL-B‹?HELPshortlistŠDC.LƒFDBLHL-B‹HHELPlonglistŠPAGE FDBSHL:ƒEQU„*<ŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofmessagesŠ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**ˆBADRESPONSE*FDBC25„BSR„RESPNA ŠBRA„FDBC20* *ˆDELETEFAB*7FDBC30„MOVE.B#1,DELCRI-B(A5)„GOCHECKNEXTFABLINKOK&ŠBRA„FDBC60BEFORECURRENTFABDELETED**ˆDELETEDB-NEXTVERSION*FDBC35„SUB.L‚#1,D2ŠBNE„FDBC25CANNOTGIVE$PSN,N ŠCLR.L‚D0%ŠMOVE.LFABBUF-B(A5),A6„FINDDBENTRYŠLEA„FABPKY(A6),A6$ŠMOVE.B(A6)+,D0‹SKIPFABHEADERKEY ŠADD.L‚D0,A6!FDBC36„CMP.L‚(A6),D1ŒFOUNDENTRY?ŠBNE.S‚FDBC37NO!ŠBSR„DELFBEYES,DELETEFABENTRYŠBEQ„FDBC20DELETEDOK)ŠLEA„KEYMSG(PC),A0ŠKEYERRORINFABENTRYŠMOVE.L#KEYMSGL,D0 ŠBSR„SENDMSGŠBRA„FDBC20TRYAGAINFDBC37„TST.L‚(A6)ENDOFFAB?ŠBEQ„FDBC25YES,DBNOTFOUND)ŠLEA„FABKEY(A6),A6†GETNEXTENTRYPOINTER&ŠCMP.L‚DBBUF-B(A5),A6…PASTENDOFFAB?ŠBGE„FDBC25YES,DBNOTFOUND0ŠMOVE.B(A6),D0ŒNO,SKIPCURRENTENTRYKEYFIELD ŠADD.L‚D0,A6&ŠCMP.L‚DBBUF-B(A5),A6…PASTENDOFFAB?ŠBGE„FDBC25YES,DBNOTFOUNDŠBRA„FDBC36NO,CHECKNEWENTRY **ˆDUMPANYSECTORNOTINFAB*FDBC40„MOVE.L#'„',PSNITM-B(A5) ŠBSR„UPDSEC ŠBRA„FDBC20**ˆDUMPORUPDATEFAB*/FDBC41„MOVE.WFABLEN+2-B(A5),D2‚DUMPALLOFFAB ŠBRA.S‚FDBC45FDBC42„TST.W‚D2‘NGIVEN?ŠBEQ„FDBC41NO,DUMPALLOFFABŠCMP.W‚FABLEN+2-B(A5),D2 ŠBLE.S‚FDBC43ŠMOVE.W#1,D2ŽDEFAULT=1FDBC43„CLR.L‚D0 ŠMOVE.WD2,D0 ŠSUB.L‚#1,D0ŠADD.L‚D0,D1ŽPSNFORDUMP"ŠMOVE.W#1,D2ŽDUMPJUSTONESECTORFDBC45„MOVE.LFABBUF-B(A5),A1ŠTST.L‚D2‘DUMP?ŠBMI„FDBC16YESFŠSUB.LPSNFAB-B(A5),D1UPDATESOMESECTORINFAB,GETBUFFERSTARTADR ŠMULUƒD6,D1ŠLEA„(A1,D1),A1&ŠLEA„(A1,D6),A2‰ENDADDRESSFORUPDATE ŠBSR„UPDBUFŠMOVE.B#1,FABFLG-B(A5)ŠMOVE.LFABBUF-B(A5),A1 ŠBRA„FDBC20**ˆR*%FDBC50„TST.L‚D5‘ANYREPAIRINDICATED?ŠBEQ„FDBC25NO&ŠCMP.B‚#1,D5ŽTRUNCATE‚-PRIORFABLASTŠBEQ„FDBCTRYES)ŠCMP.B‚#3,D5ŽTRUNCATE-CURRENTFABLAST?ŠBEQ„FDBCTCYESŠCMP.B‚#4,D5ŽDELNEXTFAB?ŠBEQ„FDBCDCYES+ŠMOVE.B#1,DELCRI-B(A5)„DELETECURRENTFAB? ŠCMP.B‚#2,D53ŠBEQ.S‚FDBC60YES,DELFABAFTERCHECKFORWARDLINK@ŠBRA„FDBC25ƒ(INTERNALERROR---CHANGETOOTHERERRORMSGLATER)**ˆN*/FDBC55„BSETƒ#STP1,D7‹TURNIMOFFTILLNEXTFILE ŠCLR.B‚D7 ŠBRA.S‚FDBC60**ˆC*;FDBC56„BSETƒ#COPTION,D7ˆCHECKONLYMODETILLERRRORORDONE ŠCLR.B‚D7**ˆSTARTFABCHECK:*ˆCHECKFABHEADER* FDBC60„EQU„***ˆCHECKNEXTFABLINK-0ISOK*ŠCLR.B‚FABERR-B(A5)ŠMOVE.LFABBUF-B(A5),A1#ŠMOVE.LFABFLK(A1),D1†ANYNEXTFAB?ŠBNE.S‚FDBC65YES+ŠTST.B‚DELCRI-B(A5)‡NO,DELETECURRENTFAB?%ŠBNE.S‚FDBCDLYES,GODELETETHISFAB4ŠMOVE.LPSNFAB-B(A5),D1„CURRENTFABISLASTINCHAIN/ŠCMP.L‚DIRFE(A4),D1‡LASTFABPOINTEROKINDIR?ŠBNE„FDBE00NO,ERRORAŠBRA.S‚FDBC80„OK,FILECHECKDONEAFTERTHISFABHASBEENCHECKED**ˆCHECKNEXTFABPSNISOK*FDBC65„MOVE.LFABLEN-B(A5),D2 ŠBSR„MPSNCŠBHI„FDBE10ERROR**ˆCHECKNEXTFABALLOCATION*ŠTST.B‚RCVFLG-B(A5)‡RECOVER?ŠBNE.S‚FDBC70YESŠBSR„TSTALCNO,CHECKALLOCATED ŠBNE„FDBE20ERROR,NOTALLOCATED ŠBRA.S‚FDBC75.FDBC70„BSR„TSTFRETESTSECTORSNOTREALLOCATED#ŠBNE„FDBE30ERROR,NOTFREEANYMORE9FDBC75„BSR„TSTNYATESTNOTYETALLOCATEDTOANYTHINGELSEŠBNE„FDBE40ERROR**ˆNEXTFABLINKOK.*ˆDELETECURRENTFAB?*0FDBC80„TST.B‚DELCRI-B(A5)‡FLAGGEDTODELETEFAB?ŠBEQ„FDBC85NOAFDBCDL„CLR.B‚FABFLG-B(A5)‡YES,MAKESUREWILLNOTUPDATETHISONEAŠMOVE.LPRVFAB-B(A5),D1„GETPRIORFAB'S1STSECTORTOUPDATELINKŠBEQ.S‚FDBCD1NOPRIORFAB(ŠBSR„WRTSBFUPDATECURRENTSECTORIFNEC ŠBNE„TRMREPŠMOVE.LD1,PSNSEC-B(A5)ŠLEA„SECBUF(PC),A1 ŠMOVE.L#1,D2ŠMOVE.L#'FAB',IOERITM-B(A5) ŠBSR„GETSEC ŠBNE„TRMREPŠMOVE.LFABBUF-B(A5),A0&ŠMOVE.LFABFLK(A0),SECBUF+FABFLK-B(A5) ŠBSR„WRITSEC ŠBNE„TRMREPFDBCD0„MOVE.LFABBUF-B(A5),A1ŠMOVE.LFABFLK(A0),D1.ŠMOVE.B#1,DELPRI-B(A5)„FLAGPRIORFABDELETEDEŠMOVE.B#1,CNTFLG-B(A5)FLAGTOUPDATESEC/RECCOUNTINDIRWHENDONEŠBRA„FDBC00PROCESSNEXTFAB:FDBCD1„MOVE.LFABBUF-B(A5),A0„SETNEWFIRSTFABPSNINDIRŠMOVE.B#1,PDBFLG-B(A5)8ŠMOVE.LFABFLK(A0),DIRFS(A4).BECAUSEDELETEDFIRSTFAB#ŠBNE„FDBCD0PROCESSNEXTFABIFANY*ŠBRA„FDBCT50ŒNOFABSLEFT-SETFILEEMPTY**ˆDELETENEXTFAB*%FDBCDC„BSR„WRTSBFFLUSHSECTORBUFFERŠBNE„TRMREPQUITFORNOW.ŠLEA„SECBUF(PC),A1ŠREAD1STSECTOROFNEXTFABŠMOVE.LFABBUF-B(A5),A0„.ŠMOVE.LFABFLK(A0),D1†.2ŠMOVE.LD1,PSNSEC-B(A5)„.CURRENTSECTORINBUFFERŠMOVE.L#1,D2Ž.ŠMOVE.L#'FAB',IOERITM-B(A5) ŠBSR„GETSEC.ŠBNE„TRMREP.QUITIFERRORNOW6* SET NEW FORWARD LINK INTO CURRENT FAB (=DEL NEXT FAGŠMOVE.B#1,FABFLG-B(A5)ŠMOVE.LFABFLK(A1),FABFLK(A0)ŠBNE.S‚FDBCC0ANYNEXTFAB?FŠMOVE.LPSNFAB-B(A5),DIRFE(A4)NO,SETCURRENTFABASLSTFABINCHAINŠMOVE.B#1,PDBFLG-B(A5)„.EFDBCC0„MOVE.B#1,DELNXF-B(A5)„FLAGNEXTFABDELETEDSOKNOWTOUPDATEDŠMOVE.B#1,CNTFLG-B(A5)‚FLAGTOUPDATESECTOR/RECORDCOUNTWHENDONE'ŠBRA„FDBC60.‚BACKWARDLINKINNEXTFAB***ˆCHECKBACKWARDLINKISOKINCURRENT FAB*FDBC85„TST.B‚DELPRI-B(A5) ŠBEQ.S‚FDBC87PRIORFABDELETED?HEADERKEY'ŠLEA„PRIFKY(PC),A1ŠPRIORFAB'SLASTKEY ŠBSR„CHKKEYBŠBCS„FDBE70ERRORIFHEADERKEYNOTLESSTHANPRIORFAB'SLASTKEYFDBC92„MOVE.LFABBUF-B(A5),A1**ˆIFEMPTYFABDELETEIT*FDBC95„CLR.L‚D0ŠMOVE.BDIRKEY(A4),D0+ŠLEA„FABPKY+1(A1,D0),A6A6->‚1STFABENTRY.ŠTST.L‚(A6)IFSTARTSWITH0THENFABISEMPTYŠBEQ„FDBE80EMPTYFABERROR*5*ˆCHECKFIRST/NEXTFABENTRY:„A6->CURRENTFABENTRY*ˆCHECKFABENTRYKEYSIZE*%* MAKE SURE ANOTHER ENTRY FITS IN FABFDBC100ƒMOVE.LFABLEN-B(A5),D1ŠMULUƒ#256,D1ŒGETFABLENGTH)ŠADD.L‚FABBUF-B(A5),D1„D1=ENDINGADDR.+1ŠSUB.L‚#4,D1ŽADJUSTFORPSN ŠCMP.L‚D1,A6 ŠBHI„FDBC500!ŠMOVE.L(A6),D1ŒPSNOFDATABLOCK<ŠBEQ„FDBC500‡DONEWITHFAB-NOMOREDATABLOCKSINTHISFABŠMOVE.BDIRKEY(A4),D0+ŠCMP.B‚FABKEY(A6),D0†FABENTRYKEYSIZEOK?6ŠBNE„FDBE90NO,ERRORNOWIFNOTSAMEASFILEKEYSIZE**ˆCHECKDBPSNOK*FDBC101ƒMOVE.LDBLEN-B(A5),D2 ŠBSR„MPSNCŠBHI„FDBE100ŒERROR-BADDBPSN**ˆCHECKDBALLOCATION*ŠTST.B‚RCVFLG-B(A5)$ŠBNE.S‚FDBC105ŒRECOVERDELETEDFILE?&ŠBSR„TSTALCNO,TESTSECTORSALLOCATED)ŠBNE„FDBE110ŒERROR,SECTORSNOTALLOCATEDŠBRA.S‚FDBC110(FDBC105ƒBSR„TSTFRECHECKNOTREALLOCATEDŠBNE„FDBE120ŒERROR2FDBC110ƒBSR„TSTNYACHECKSECTORSNOTYETALLOCATED ŠBNE„FDBE130*6*ˆREADINDB:CHECKDBSECTOR-USAGE-COUNTINFABISOK*FDBC120ƒCLR.L‚D0*ŠMOVE.BFABSGS(A6),D0†GETSECTORUSECOUNTŠBEQ„FDBE140ŒERRORIF01ŠCMP.B‚D2,D0ŽERRORIFNUMBERGREATERTHANDBSIZE ŠBHI„FDBE140)ŠMOVE.LD0,D2ŽREADINONLYSECTORSINUSEŠMOVE.LDBBUF-B(A5),A1,ŠMULUƒD6,D0ŽGETLOGICALENDADROFDBBUFFERŠADD.L‚A1,D0Ž. ŠSUB.L‚#1,D0ŠMOVE.LD0,DBLEA-B(A5)….&ŠBSR„UPDBUPDATEPRIORDBIFNECESSARY ŠBNE„TRMREP)ŠMOVE.LD1,PSNDB-B(A5)…SETCURRENTDBPSNŠMOVE.LD1,UPDSTR-B(A5)ŠMOVE.LD1,UPDEND-B(A5)ŠADD.L‚D2,UPDEND-B(A5)#ŠCLR.B‚DBFLG-B(A5)ˆFLAGNOTUPDATED ŠBSR„GETSECŠBEQ.S‚FDBC130ŒOKREAD**ˆIOERRORFROMDBREAD*!ŠMOVE.B#1,DBFLG-B(A5)…CRCERROR? ŠTST.L‚D06ŠBEQ.S‚FDBC130ŒYES,IGNOREERROR-REWRITEMAYCUREITŠLEA„DELMSG(PC),A0ŠDELETEDB?ŠMOVE.L#DELMSGL,D0ŠMOVE.L#'DB',DELITM-B(A5)ŠMOVE.L#1,D4ŽFLAGTODELETEDB ŠBSR„SENDMSQC#ŠBNE.S‚FDBC150ŒINIMUPDATEDBLOOPŠBSR„REPAIRREPAIRINNIM?ŠBNE„FDBCSFNO,SKIPFILEFDBC125ƒMOVE.LPSNDB-B(A5),D1ŠMOVE.LDBLEN-B(A5),D2#ŠBSR„DEALLCYES,DEALLOCATESECTORS!ŠMOVE.LA6,A0Ž.FABENTRYPOINTER%ŠBSR„DELFBEANDDELETEDB'SFABENTRYDŠMOVE.B#1,CNTFLG-B(A5)‚FLAGTOUPDATESECTOR/RECORDCOUNTWHENDONE@ŠBRA„FDBC100ƒNEXTFABENTRYATSAMESPOTNOWWHENKEYSIZESSAMEŠPAGE**ˆUPDATEDBLOOPINIM*FDBC130ƒBSR„IMŠBNE„FDBC200ŒINNIMGOCHECKDB)ŠCLR.L‚D4‘FLAGNOREPAIRFOR'R'RESPONSE-FDBC135ƒMOVE.LPSNDB-B(A5),D3…DBSTARTINGPSNŠMOVE.LDBBUF-B(A5),A1ŠMOVE.L#'DB',PSNITM-B(A5)ŠBSR„DUMPDUMPDB"FDBC150ƒMOVE.L#'‚DB',UPDITM-B(A5)ŠBSR„UPDATEUPDATEDB*ŠDC.LƒFDBC200-BŠCR&ŠDC.LƒFDBC199-BŠN-NIMTILLNEXTFILEDŠDC.LƒFDBC190-BRDELDBIFD4=1,TRUNCATEIFD4=2,ELSE'WHAT?'ŠDC.LƒFDBC125-BŠDDELDBŠDC.LƒFDBC160-BŠAN/AŠDC.LƒTRMREP-B‹Q#ŠDC.LƒFDBC170-BŠ$PSNDUMP/UPDATEDBŠDC.LƒFDBC180-BŠ$DUMPDB&ŠDC.LƒFDBC185-BŠDUMPSECTORSNOTINDBŠDC.LƒFDBC160-BŠDPSNN/AŠDC.LƒFDBC160-BŠAPSNN/AŠDC.LƒFDBC170-BŠOFFSETŠDC.LƒFDBC198-BŠC!ŠDC.LƒFDBBSHL-BŠ?HELPshortlist ŠDC.LƒFDBBLHL-BŠHHELPlonglistŠPAGE FDBBSHL:‚EQU„*<ŠMOVE.B#1,ASKCTFLG-B(A5)‚asktocontinueatendofmess 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„RESPNAWHAT?ŠBRA„FDBC150ŒTRYAGAIN* *ˆDUMPDB*FDBC165ƒMOVE.LDBLEN-B(A5),D2ŠBSETƒ#31,D2DUMPALLOFDBFDBC170ƒMOVE.LDBBUF-B(A5),A1 ŠTST.L‚D2ŠBMI„FDBC135ŒDUMPŠSUB.L‚PSNDB-B(A5),D1…UPDATE ŠMULUƒD6,D1$ŠLEA„(A1,D1),A1‰STARTADRFORUPDATEŠLEA„(A1,D6),A2‰GETENDADR ŠBSR„UPDBUFŠMOVE.B#1,DBFLG-B(A5)ŠMOVE.LDBBUF-B(A5),A1#ŠBRA„FDBC150ŒREPEATEUPDATEREQUEST**ˆ$,N*FDBC180ƒTST.W‚D2ŠBEQ.S‚FDBC165ŒDUMPDB‚(NON)$ŠCMP.W‚DBLEN+2-B(A5),D2ƒNTOOLARGE?ŠBLE.S‚FDBC181ŒNO!ŠMOVE.W#1,D2ŽYES,DEFAULTTOONEFDBC181ƒCLR.L‚D0 ŠMOVE.WD2,D0 ŠSUB.L‚#1,D0%ŠADD.L‚D0,D1ŽGETSTARTINGPSNTODUMP ŠMOVE.W#1,D2ŽONESECTORTODUMPŠBRA„FDBC170ŒDOTHEDUMP**ˆDUMPANYSECTORNOTINDB* FDBC185ƒMOVE.L#'„',PSNITM-B(A5) ŠBSR„UPDSEC ŠBRA„PDBC70**ˆR*#FDBC190ƒTST.L‚D4‘ANYTHINGTOREPAIRŠBEQ„FDBC160ŒNOŠCMP.B‚#1,D4ŽYES,DELETE‚DB?ŠBEQ„FDBC125ŒYES,GODELETE*$*ˆTRUNCATEDBAFTER‚LASTGOODRECORD*;FDBCTDBƒMOVE.LLSTREC-B(A5),A3„DELETEDBIFNOGOODRECORDSŠCMP.L‚DBBUF-B(A5),A3ŠBEQ„FDBC125ŒGODELETEDB!ŠMOVE.LA3,D1ŽD2=BCTLEFTINDBŠSUB.L‚DBBUF-B(A5),D1….ŠADD.L‚#1,D1Ž.ŠMOVE.LD1,D2Ž.ŠTST.W‚DIRLRL(A4)‰VRL?ŠBEQ.S‚FDBC194ŒYES*ŠTST.B‚(A3)+ŽPOINTTOBYTE1BEYONDRECORD,ŠMOVE.WDIRLRL(A4),D0†CALCULATE#OFRECORDS ŠDIVUƒD0,D1Ž.FDBC192ƒMOVE.WD1,FABREC(A6) ŠDIVUƒD6,D2ŽGETNEWSECTORCOUNT ŠMOVE.WD2,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.BD0,FABSGS(A6)†NEW#OFSECTORSINUSEFORDB(ŠMOVE.B#1,FABFLG-B(A5)„FLAGFABCHANGED&ŠMOVE.B#1,DBFLG-B(A5)…FLAGDBCHANGED ŠCLR.L‚D2 ŠMOVE.WD1,D25ŠADD.L‚D2,RECCNT-B(A5)„ADDREMAININGRECORDSTOTOTAL ŠMOVE.WD0,D2*ŠADD.L‚D2,SECCNT-B(A5)„UPDATESECTORCOUNTDŠMOVE.B#1,CNTFLG-B(A5)‚FLAGTOUPDATESECTOR/RECORDCOUNTWHENDONEŠBRA„FDBC300ŒPROCESSNEXTDBKFDBC194ƒTST.B‚(A3)+GETA3->INGTOSTARTOFNEXTRECORDRECORDLENGTHFIELD ŠCLR.L‚D0 ŠCLR.L‚D1ŠMOVE.LDBBUF-B(A5),A1FDBC195ƒMOVE.W(A1)+,D0 ŠADD.L‚D0,A1#ŠBTSTƒ#0,D0ŽODDBYTERECORDLENGTH?ŠBEQ.S‚FDBC196ŒNO"ŠADD.L‚#1,A1ŽYES,SKIPFILLERBYTE5FDBC196ƒADD.L‚#1,D1ŽCOUNT#OFRECORDS‚LEFTINVRLDB ŠCMP.L‚A1,A3 ŠBNE„FDBC195 ŠBRA„FDBC192**ˆC*?FDBC198ƒBSETƒ#COPTION,D7ˆSETCHECKONLYMODETILLERRORORDONE ŠCLR.B‚D7ŠBRA.S‚FDBC200**ˆN*0FDBC199ƒBSETƒ#STP1,D7‹TURNIMOFFTILLNEXTFILE ŠCLR.B‚D7ŠPAGE**ˆCHECKDBCONTENTS:*ˆCHECKRECORDCOUNTOK*FDBC200ƒCLR.L‚D0ŠMOVE.WDIRLRL(A4),D0ŠBEQ.S‚FDBC210ŒVRLFILE*?*ˆFRL#OFRECORDSSPECEDINFABMUSTFITINTODBANDREMAINING*ˆDBSPACEMUSTBEZERO* ŠCLR.L‚D1:ŠMOVE.WFABREC(A6),D1†GETBCTNECESSARYTOSUPPORTRECORDSŠMULUƒD1,D0Ž.INTOD0)ŠMOVE.LDBLEA-B(A5),D1…GETDBBCTINTOD1ŠSUB.L‚DBBUF-B(A5),D1….ŠADD.L‚#1,D1Ž.ŠCMP.L‚D1,D0ŽRECORDSFIT?ŠBHI„FDBE200ŒNO,ERRORŠBEQ.S‚FDBC206ŒEXACTFIT?+ŠSUB.L‚D0,D1ŽNO,EXTRABYTESSHOULDBEZEROŠMOVE.LDBBUF-B(A5),A1 ŠADD.L‚D0,A1FDBC205ƒTST.B‚(A1)+ŠBNE„FDBE200ŒERROR ŠSUB.L‚#1,D1 ŠBNE„FDBC205.FDBC206ƒCLR.L‚D1‘RECORD/SECTORCOUNTOKINFABFŠMOVE.BFABSGS(A6),D1ACCOUNTFORDBSECTORSANDRECORDSINTOTALCOUNŠADD.L‚D1,SECCNT-B(A5)„.ŠMOVE.WFABREC(A6),D1†.ŠADD.L‚D1,RECCNT-B(A5)„.!ŠBRA„FDBC241ŒGOCHECKKEYSIFANY*#*ˆALLVRLRECORDLENGTHSMUSTBEOK*FDBC210ƒCLR.L‚D0 ŠCLR.L‚D1 ŠCLR.L‚D3ŠMOVE.BDIRKEY(A4),D3ŠMOVE.LDBBUF-B(A5),A15ŠMOVE.LA1,LSTREC-B(A5)„SAVEINCASELASTGOODRECORD,FDBC215ƒMOVE.W(A1)+,D0‹GETNEXTRECORDSBCTŠBEQ.S‚FDBC220ŒDONE-ŠCMP.L‚D3,D0ŽCHECKLONGENOUGHTOSUPPORTKEYŠBLT„FDBE220ŒERROR#ŠADD.L‚#1,D1ŽINCREMENTRECORDCOUNT)ŠMOVE.LA1,D2Ž(SAVETOCHECKNOOVERFLOW) (ŠLEA„-1(A1,D0),A1‡A1->ENDOFTHISRECORDŠBTSTƒ#0,D0ŽODDBCT?ŠBEQ.S‚FDBC216ŒNO"ŠADD.L‚#1,A1ŽYES,SKIPFILLERBYTEFDBC216ƒCMP.L‚DBLEA-B(A5),A16ŠBGT„FDBE220ŒERRORIFRECORDWOULDGETPASTBUFFERENDŠCMP.L‚D2,A1Ž.OVERFLOW?ŠBLS„FDBE220Œ.YES=ŠMOVE.LA1,LSTREC-B(A5)„SAVEFOR‚LASTGOODRECORDENDPOINTER ŠTST.B‚(A1)+"ŠCMP.L‚DBLEA-B(A5),A1…NEXTRECORD?ŠBLT„FDBC215ŒYES,GOCHECKIT3ŠBRA.S‚FDBC225ŒNO,DONEWITHDB,RECORDBCTSAREOK*'*ˆCHECKVRLRECORDCOUNTSAMEASINFAB*:*ˆCHECKBALANCEOFDATABLOCKAFTERLASTRECORDFORZEROES** 4FDBC220ƒSUB.L‚#3,A1ŽGETLASTGOODRECORDENDPOINTERŠMOVE.LA1,LSTREC-B(A5)„. ‰TST.B…(A1)+1*œA1=ADDRESS+1OFLASTCHARACTERINLASTRECORD*®FORTHISDATABLOCKFDBC222:‰CMP.L…DBLEA-B(A5),A1‰BHI.S…FDBC223'*œJMPIFBALANCEOFDATABLOCKISZEROS ‰TST.B…(A1)+‰BEQ.S…FDBC222*œJMPIFTHISDATABYTEISZERO ‰BRA‡FDBE210-*œDATAEXISTBEYONDLASTREOCRDINDATABLOCKFDBC223:‰MOVE.L„LSTREC-B(A5),A1$*œRESTOREREGISTERTOORIGINALVALUEFDBC225ƒCMP.W‚FABREC(A6),D1ŠBEQ.S‚FDBC230ŒOK$ŠMOVE.LD1,D2ŽSAVENUMBEROFRECORDS!ŠLEA„FDRPSN(PC),A0ŠSENDERRORMSGŠMOVE.LPSNDB-B(A5),D1 ŠBSR„BIN4HEXŠLEA„FDRMSG(PC),A0ŠMOVE.L#FDRMSGL,D0 ŠBSR„SENDMSQC,ŠLEA„RECMSG(PC),A0ŠSAYTHATWILLRECALCULATEŠMOVE.L#RECMSGL,D0 ŠBSR„SENDMSG*ŠMOVE.WD2,FABREC(A6)†FORCECORRECTNUMBER"ŠMOVE.LD2,D1ŽRESTORE#OFRECORDSŠMOVE.B#1,FABFLG-B(A5)DŠMOVE.B#1,CNTFLG-B(A5)‚FLAGTOUPDATESECTOR/RECORDCOUNTWHENDONE>FDBC230ƒADD.L‚D1,RECCNT-B(A5)„ADDDB'SRECORDSTORECORDCOUNT ŠCLR.L‚D2.ŠMOVE.LLSTREC-B(A5),D0„CALCULATESECTORCOUNTŠSUB.L‚DBBUF-B(A5),D0‹.ŠADD.L‚#1,D0Ž. ŠDIVUƒD6,D0Ž. ŠMOVE.WD0,D2ŠSWAPƒD0 ŠTST.W‚D0ŠBEQ.S‚FDBC235 ŠADD.W‚#1,D2=FDBC235ƒCMP.B‚FABSGS(A6),D2†CHECKIFITISTHESAMEASINFABŠBEQ.S‚FDBC240ŒOK!ŠLEA„FDSPSN(PC),A0ŠSENDERRORMSGŠMOVE.LPSNDB-B(A5),D1 ŠBSR„BIN4HEX,ŠLEA„FDSMSG(PC),A0ŠSAYTHATWILLRECALCULATEŠMOVE.L#FDSMSGL,D0 ŠBSR„SENDMSQCŠLEA„RECMSG(PC),A0ŠMOVE.L#RECMSGL,D0 ŠBSR„SENDMSG/ŠMOVE.BD2,FABSGS(A6)†FORCEPROPERSECTORCOUNTŠMOVE.B#1,FABFLG-B(A5)DŠMOVE.B#1,CNTFLG-B(A5)‚FLAGTOUPDATESECTOR/RECORDCOUNTWHENDONE?FDBC240ƒADD.L‚D2,SECCNT-B(A5)„ADDSECTORSTOTOTALSECTORCOUNT**ˆCHECKKEYSINASCENDINGORDER*FDBC241ƒTST.B‚DIRKEY(A4)(ŠBEQ„FDBC300ŒNOTHINGTOCHECKIFNOKEYSŠMOVE.LDBBUF-B(A5),A1,ŠMOVE.WFABREC(A6),D3†GET#OFRECORDSINDB ŠCLR.L‚D0 ŠCLR.L‚D1 ŠCLR.L‚D2ŠMOVE.WDIRLRL(A4),D2ŠMOVE.BDIRKEY(A4),D04ŠMOVE.LA1,LSTREC-B(A5)„SAVEINCASENO‚GOODRECORDS9* SET UP POINTER TO LAST RECORD KEY IN CASE ONLY 1 RECORD ŠMOVE.LA1,A0ŠTST.W‚D2‘VRL?ŠBNE.S‚FDBC243ŒNO'ŠADD.L‚#2,A0ŽYES-SKIPOVERBYTECOUNTFDBC243ƒMOVE.LA0,LASTKY-B(A5)%FDBC245ƒSUB.W‚#1,D3ŽANYMORERECORDS?ŠBEQ.S‚FDBC255ŒNO&ŠTST.W‚D2‘YES,GETNEXTRECORDPOINTERŠBEQ.S‚FDBC250ŒVRL-ŠLEA„(A1,D2.L),A0‡NEXTRECORDPOINTERFORFRLŠBRA.S‚FDBC251FDBC250ƒMOVE.W(A1)+,D1&ŠBEQ.S‚FDBC255ŒDONEIFNOMORERECORDSŠLEA„(A1,D1.L),A0ŠBTSTƒ#0,D1ŽODDRECORDBCT?ŠBEQ.S‚FDBC251ŒNO"ŠADD.L‚#1,A0ŽYES,SKIPFILLERBYTEFDBC251ƒTST.W‚D2‘GETA0->KEYŠBNE.S‚FDBC253ŒFRL*ŠADD.L‚#2,A0ŽVRL,SKIPRECORDLENGTHFIELD8FDBC253ƒMOVE.LA0,LASTKY-B(A5)„SAVEFORLASTKEYPOINTER ŠBSR„CHKKEY.ŠBCS„FDBE250ŒERRORIFNEXTKEYLESSTHANPRIORŠBNE.S‚FDBC252ŒOK#ŠTST.B‚KEYDUP-B(A5)‡DUPLICATEKEYS?ŠBEQ„FDBE250ŒERRORIFNOTFDBC252ƒTST.W‚D2ŠBNE.S‚FDBC2541ŠSUB.L‚#2,A0Ž(GETA0->INGTO1STBYTEOFRECORD)8FDBC254ƒMOVE.LA0,A1ŽOKIFEQUALKEYSANDDUPL.KEYFILE*ŠSUB.L‚#1,A1ŽSAVEPRIORRECORDENDPOINTER0ŠMOVE.LA1,LSTREC-B(A5)„INCASEHAVETOTRUNCATE ŠMOVE.LA0,A1 ŠBRA„FDBC245*#*ˆCHECKFABKEY.GE.LASTKEYINDB*FDBC255ƒLEA„FABKEY+1(A6),A0)ŠMOVE.LLASTKY-B(A5),A1„A1->LASTDBKEY ŠBSR„CHKKEY ŠBCS„FDBE270*:*ˆCHECKPRIORFABENTRYKEYNOTGREATERTHAN1STKEYINDB*FDBC260ƒMOVE.LPRIFBE-B(A5),A1 ŠCMP.L‚#0,A1#ŠBEQ.S‚FDBC300ŒNONESODONEWITHDB2ŠLEA„FABKEY(A1),A1†A1->FABENTRY'SKEYFIELDBCT ŠMOVE.B(A1)+,D0‹GETKEYLENGTH7ŠMOVE.LA6,PRIFBE-B(A5)„SETNEWPRIORFABENTRYPOINTERŠMOVE.LDBBUF-B(A5),A0ŠTST.W‚DIRLRL(A4)‰VRL?ŠBNE.S‚FDBC265ŠTST.W‚(A0)+ŽSKIPRECORDBCTFDBC265ƒBSR„CHKKEYCHECKKEYS ŠBCS„FDBE280ŠBNE.S‚FDBC300ŠTST.B‚KEYDUP-B(A5) ŠBEQ„FDBE280**ˆCHECKNEXTDB* FDBC300ƒEQU„*@ŠMOVE.LA6,PRIFBE-B(A5)„CURRENTFABENTRYISPRIORFABENTRYNOW5ŠLEA„FABKEY(A6),A6†GETNEXTFABENTRYADDRESSINTOA0 ŠCLR.L‚D0ŠMOVE.B(A6)+,D0 ŠADD.L‚D0,A6ŠBRA„FDBC100ŒGOCHECKNEXTDBŠPAGE*/*ˆDONEWITHTHISFAB,PREPARETOCHECKNEXTFAB* FDBC500ƒEQU„**)*ˆCHECKFABNOTEMPTY,DELETEITIFITIS*ŠMOVE.LFABBUF-B(A5),A1ŠLEA„FABPKY(A1),A1 ŠCLR.L‚D0ŠMOVE.B(A1)+,D0 ŠADD.L‚D0,A1 ŠTST.L‚(A1)#ŠBEQ„FDBCDLEMPTYFAB,GODELETEIT**ˆSAVEFAB'SLASTKEY*ŠMOVE.BDIRKEY(A4),D0ŠBEQ.S‚FDBC510ŒSKIPIFNOKEYSŠMOVE.LPRIFBE-B(A5),A0ŠLEA„FABKEY+1(A0),A0ŠLEA„PRIFKY(PC),A1FDBC505ƒMOVE.B(A0)+,(A1)+ ŠSUB.B‚#1,D0 ŠBNE„FDBC505*&*ˆWRITECURRENTFABTODISKIFCHANGED)*ˆ(CALCULATEORCHECKFABUSAGEFRACTION)** UPDATE LAST DB IF CHANGEDFDBC510ƒBSR„UPDBŠMOVE.LFABBUF-B(A5),A1 ŠCLR.L‚D0=ŠMOVE.LPRIFBE-B(A5),A0„GETFABSECTORUSAGEFRACTIONINTOD0)ŠLEA„FABKEY(A0),A0†.GETA0->ENDOFFABŠMOVE.B(A0)+,D0‹.ŠLEA„(A0,D0),A0‰.ŠSUB.L‚A1,A0Ž.,ŠMOVE.BDIRFAB(A4),D0†.GET‚FABSECTORCOUNTŠMULUƒ#256/16,D0‰.ŠMOVE.LA0,D1Ž. ŠDIVUƒD0,D1Ž.ŠMOVE.BD1,D0Ž. ŠSWAPƒD1‘. ŠTST.W‚D1‘.ŠBEQ.S‚FDBC511Œ.ŠADD.B‚#1,D0Ž.'FDBC511ƒTST.B‚FABFLG-B(A5)‡FABCHANGED?&ŠBNE.S‚FDBC512ŒYES,FORCEPROPERVALUE3ŠCMP.B‚FABUSE(A1),D0†NO,CHECKCORRECTVALUEINFABŠBNE„FDBE310ŒERRORŠBRA.S‚FDBC515ŒOK>FDBC512ƒMOVE.BD0,FABUSE(A1)†SETPROPERVALUEINTOFABHEADERŠMOVE.B#1,FABFLG-B(A5) FDBC515ƒEQU„*ŠMOVE.LPSNFAB-B(A5),D1(ŠTST.B‚FABFLG-B(A5)‡WRITEFABIFCHANGEDŠBEQ.S‚FDBC520ŒNOTCHANGEDŠMOVE.LFABLEN-B(A5),D2ŠMOVE.L#'FAB',IOERITM-B(A5) ŠBSR„WRITSEC ŠBNE„TRMREPŠCLR.B‚FABFLG-B(A5)FDBC520ƒMOVE.LD1,PRVFAB-B(A5)#ŠMOVE.LFABFLK(A1),D1†NEXTFABLINK!ŠBNE„FDBC00CHECKNEXTFABIFANY**ˆDONE-LASTFABCHECKED*<ŠMOVE.LPRVFAB-B(A5),D0„MAKESURELASTFABPOINTEROKINDIRŠCMP.L‚DIRFE(A4),D0ŠBEQ.S‚FDBC521ŒOK!ŠMOVE.LD0,DIRFE(A4)‡NOTOK-FIX0ŠMOVE.B#1,PDBFLG-B(A5)„FLAGTOUPDATEDIRECTORYEFDBC521ƒSUB.L‚#1,RECCNT-B(A5)„GETEOF‚LOGICALRECORDNUMBERASINDIR>ŠSUB.L‚#1,SECCNT-B(A5)„GETEOF‚LOGICALSECTORNUMBERASINDIR7FDBC525ƒTST.B‚CNTFLG-B(A5)‡UPDATERECORD/SECTORCOUNTS?ŠBNE.S‚FDBC530ŒYES/ŠMOVE.LRECCNT-B(A5),D0„NO,CHECKTHEMTOMATCHŠCMP.L‚DIREOR(A4),D0 ŠBNE„FDBE300ŠMOVE.LSECCNT-B(A5),D0ŠCMP.L‚DIREOF(A4),D0ŠBNE„FDBE300ŒERRORŠBRA.S‚FDBC540ŒOK&FDBC530ƒMOVE.LRECCNT-B(A5),DIREOR(A4)ŠMOVE.LSECCNT-B(A5),DIREOF(A4)ŠMOVE.B#1,PDBFLG-B(A5)FDBC540ƒBRA„FDBCOKDONEŠPAGE**ˆFAB/DBERRORHANDLING* FDBE00„EQU„**'*ˆER:FABLINK=0,LASTFABPSNNOTOK*ŠLEA„BFLMSG(PC),A0ŠMOVE.L#'0000',D0ŠMOVE.LD0,BFLPSN-B(A5)ŠMOVE.LD0,BFLPSN+4-B(A5)ŠMOVE.L#BFLMSGL,D0 ŠBSR„SENDMSGS.ŠMOVE.LDIRFE(A4),D1‡GETLASTFABPSNFROMDIRŠLEA„LFPPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„LFPMSG(PC),A0ŠMOVE.L#LFPMSGL,D0 ŠBSR„SENDMSQCŠLEA„TRNMSG(PC),A0ŠTRUNCATEFABŠMOVE.L#TRNMSGL,D0ŠMOVE.L#'FAB',TRNITM-B(A5) ŠBSR„SENDMSQC ŠBEQ.S‚FDBE01INNIMGOTRUNCATE ŠBSR„REPAIRINIMASKPERMISSION&ŠBNE„FDBC20NO,REPEATFAB‚UPDATELOOP>FDBE01„MOVE.LPSNFAB-B(A5),DIRFE(A4)ƒSETLASTFABPSNINTODIRŠMOVE.B#1,PDBFLG-B(A5)'ŠBRA„FDBC80DONEAFTERTHISFABCHECKED**ˆER:BADFORWARDFABLINK* FDBE10„EQU„**ŠBSR„FABERMCHECKFORMAXFABERRORINNIMŠLEA„BFLPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„BFLMSG(PC),A0ŠMOVE.L#BFLMSGL,D0ŠBSR„SENDMSQC‹SENDERRORMSG"ŠTST.B‚DELCRI-B(A5)‡TODELETEFAB?(ŠBNE„FDBCTRYES,NOWWILLTRUNCATECHAIN5ŠMOVE.L#3,D5ŽFLAGTOTRUNCATEFAB(CURRENTFABLAST)ŠLEA„TRNMSG(PC),A0ŠTRUNCATEFABŠMOVE.L#TRNMSGL,D0ŠMOVE.L#'FAB',TRNITM-B(A5) ŠBSR„SENDMSQC(ŠBNE„FDBC20INIMREPEATUPDATEFAB LOOP%ŠBRA„FDBCTCINNIMTRUNCATEFABCHAIN**ˆER:FABNOTALLOCATED*FDBE20„LEA„NALPSN(PC),A0*ŠBSR„FABERMCHECKFORMAXFABERRORINNIM ŠBSR„BIN4HEXŠLEA„NALMSG(PC),A0ŠMOVE.L#'FAB',NALITM-B(A5)ŠMOVE.L#NALMSGL,D0 ŠBSR„SENDMSQC"ŠBEQ.S‚FDBE21IFNIMTHENALLOCATEŠMOVE.LD2,D0ŽINIMASKŠMOVE.L#'FAB',PSNITM-B(A5) ŠBSR„DMPALCŠBEQ.S‚FDBE22YES,ALLOCATE&ŠBRA„FDBC20NO,REPEATUPDATEFABLOOP(FDBE21„LEA„ALCMSG(PC),A0ŠALLOCATEINNIMŠMOVE.L#'FAB',ALCITM-B(A5)ŠMOVE.L#ALCMSGL,D0 ŠBSR„SENDMSG'FDBE22„MOVE.LSATDBUF-B(A5),A0ƒALLOCATEŠMOVE.B#1,SATFLG-B(A5) ŠMOVE.L#1,D0 ŠBSR„ALDESC ŠBRA„FDBC75*(*ˆER:FABREALLOCATEDAFTERFILEDELETED*FDBE30„LEA„FADPSN(PC),A0 ŠBSR„BIN4HEXŠMOVE.L#'FAB',FADITM-B(A5)ŠLEA„FADMSG(PC),A0ŠMOVE.L#FADMSGL,D0 ŠBSR„SENDMSQC ŠMOVE.LA4,A2 ŠBSR„DELFILŠBRA„FDBCSFSKIPORDELFILE*!*ˆER:FABSPACEALREADYALLOCATED*FDBE40„LEA„ALEPSN(PC),A0*ŠBSR„FABERMCHECKFORMAXFABERRORINNIMŠMOVE.LD0,D2ŽSAVESTATUS ŠBSR„BIN4HEXŠLEA„ALEMSG(PC),A0ŠMOVE.L#'FAB',ALEITM-B(A5)ŠMOVE.L#ALEMSGL,D0 ŠBSR„SENDMSQC5ŠMOVE.L#4,D5ŽDELNEXTFABIF1STSCTORNOTALLOCATEDŠMOVE.L#'FAB',DELITM-B(A5)ŠLEA„DELMSG(PC),A0ŠMOVE.L#DELMSGL,D0ŠTST.L‚D2‘1STSECTORALLOCATED?ŠBPL.S‚FDBE41YES,DELNEXTFAB9ŠMOVE.L#3,D5NO,TRUNCATE-CURRENTFABISLASTINCHAINŠLEA„TRNMSG(PC),A0ŠMOVE.L#'FAB',TRNITM-B(A5)ŠMOVE.L#TRNMSGL,D0FDBE41„BSR„SENDMSQC(ŠBNE„FDBC20INIMREPEATUPDATEFABLOOP'ŠCMP.B‚#3,D5ŽINNIMREPAIRASINDICATEDŠBEQ„FDBCTCTRUNCATE?ŠBRA„FDBCDCNO,DELETENEXTFAB**ˆER:BACKWARDLINK*FDBE50„MOVE.LFABBLK(A1),D1*ŠBSR„FABERMCHECKFORMAXFABERRORINNIMŠLEA„BBLPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„BBLMSG(PC),A0ŠMOVE.L#BBLMSGL,D0 ŠBSR„SENDMSGS,ŠMOVE.LPRVFAB-B(A5),D1„SENDPRIORFAB'SPSNŠLEA„PFPPSN(PC),A0 ŠBSR„BIN4HEXŠLEA„PFPMSG(PC),A0ŠMOVE.L#PFPMSGL,D0 ŠBSR„SENDMSQC#ŠLEA„FXLMSG(PC),A0ŠREPAIR:FIXLINKŠMOVE.L#FXLMSGL,D0 ŠBSR„SENDMSQCŠBEQ„FDBC86INNIMFIXŠBSR„REPAIRINIMASKFIRSTŠBNE„FDBCSFSKIPFILEŠBRA„FDBC86FIXALSO**ˆER:KEYSIZEINFABHEADER*FDBE60„LEA„KEYFLD(PC),A0*ŠBSR„FABERMCHECKFORMAXFABERRORINNIM ŠMOVE.BD0,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‚FDBE61FORCESAMEINNIMŠBSR„REPAIRINIMASK ŠBEQ.S‚FDBE61(FDBESK„MOVE.LA4,A2ŽNO,DELORSKIPFILE ŠBSR„DELFIL ŠBRA„FDBCSFIFDBE61„MOVE.BDIRKEY(A4),FABPKY(A1)FORCEFILE'SKEYSIZEINTOFABHEADERŠMOVE.B#1,FABFLG-B(A5)ŠBRA„FDBC91CONTINUE*.*ˆER:HEADERKEYLESSTHANLASTFAB'SLASTKEY*+FDBE70„MOVE.LA0,A2ŽSAVEHEADERKEYPOINTER*ŠBSR„FABERMCHECKFORMAXFABERRORINNIMŠ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‚FDBE71NIM:SETEQUAL ŠBSR„REPAIR/ŠBNE„FDBESKINIMNOREPAIR=>SKIPORDELFILEFDBE71„MOVE.BDIRKEY(A4),D0ŠLEA„PRIFKY(PC),A0FDBE72„MOVE.B(A0)+,(A2)+ ŠSUB.B‚#1,D0 ŠBNE„FDBE72ŠMOVE.B#1,FABFLG-B(A5)ŠBRA„FDBC92CONTINUE**ˆER:EMPTYFAB*FDBE80„LEA„EFBPSN(PC),A0*ŠBSR„FABERMCHECKFORMAXFABERRORINNIMŠMOVE.LPSNFAB-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„FDBCDLGODELCURRENTFAB**ˆER:FABENTRYKEYSIZE*FDBE90„MOVE.B#'E',KEYATR-B(A5)*ŠBSR„FABERMCHECKFORMAXFABERRORINNIMŠLEA„KEYFLD(PC),A0ŠMOVE.BFABKEY(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‚FDBE91SETEQUALINNIMŠBSR„REPAIRASKINIMŠBEQ.S‚FDBE91SETEQUAL ŠLEA„TRNMSG(PC),A0ŠTRUNCATEFAB?ŠMOVE.L#'FAB',TRNITM-B(A5)ŠMOVE.L#TRNMSL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠBNE„FDBCSFDO,SKIPFILEŠCLR.L‚(A6 )YES,TRUNCATEFABŠMOVE.B#1,FABFLG-B(A5)ŠBRA„FDBC500ŒDONEWITHFAB-FDBE91„MOVE.BDIRKEY(A4),FABKEY(A6)SETEQUALŠMOVE.B#1,FABFLG-B(A5) ŠBRA„FDBC101**ˆER:DBPSNBAD*FDBE100ƒLEA„DBPPSN(PC),A0*ŠBSR„FABERMCHECKFORMAXFABERRORINNIM ŠBSR„BIN4HEXŠLEA„DBPMSG(PC),A0ŠMOVE.L#DBPMSL,D0 ŠBSR„SENDMSQCŠBEQ.S‚FDBE102ŒNIMŠBSR„GETNEW4ŒINIMGETNEWPSN%FDBE105ƒMOVE.LD1,(A6)ŒSETNEWDBPSNŠMOVE.B#1,FABFLG-B(A5)ŠTST.L‚D1‘ZERO?ŠBNE„FDBC101ŒNO,CHECKAGAIN#FDBE101ƒMOVE.LA6,A0ŽYES,‚DELETEDB ŠBSR„DELFBEŠBRA„FDBC100ŒNEXTFABENTRY-FDBE102ƒMOVE.L#'DB',DELITM-B(A5)DELETEDBŠMOVE.L#DELMSGL,D0ŠLEA„DELMSG(PC),A0 ŠBSR„SENDMSGŠBRA„FDBE101ŒGODELETE**ˆER:DBNOTALLOCATED*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ŒINNIMALLOCATEDBŠMOVE.LDBLEN-B(A5),D0ŠMOVE.L#'DB',PSNITM-B(A5) ŠBSR„DMPALCŠBEQ.S‚FDBE112ŒGOALLOCATEŠBSR„GET4HEXŒNO,GETNEWPSN ŠBRA„FDBE105FDBE111ƒLEA„ALCMSG(PC),A0ŠMOVE.L#'DB',ALCITM-B(A5)ŠMOVE.L#ALCMSGL,D0 ŠBSR„SENDMSG(FDBE112ƒMOVE.LSATDBUF-B(A5),A0ƒALLOCATEŠMOVE.B#1,SATFLG-B(A5) ŠMOVE.L#1,D0 ŠBSR„ALDESCŠBRA„FDBC110ŒGOALLOCATE*'*ˆER:DBREALLOCATEDAFTERFILEDELETED*#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ŒGODELDB**ˆER:DBALREADYALLOCATED*#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ŒINNIMDELDBŠMOVE.L#'DB',DELITM-B(A5)ŠLEA„DELMSG(PC),A0ŠMOVE.L#DELMSGL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠBEQ„FDBE102ŒGODELETEŠBSR„DMPSKPSKIP?ŠBEQ„FDBCSFYES&ŠBRA„FDBE105ŒCHECKAGAIN,0DELETESDB**ˆER:DBSECTORUSAGECOUNT*FDBE140ƒLEA„FDZFLD(PC),A0ŠMOVE.BFABSGS(A6),D1 ŠBSR„BIN1HEXŠLEA„FDZMSG(PC),A0ŠMOVE.L#FDZMSGL,D0 ŠBSR„SENDMSGSŠLEA„DBZFLD(PC),A0ŠMOVE.BDIRDAT(A4),D1 ŠBSR„BIN1HEXŠLEA„DBZMS(PC),A0ŠMOVE.L#DBZMSL,D0 ŠBSR„SENDMSQCŠBEQ„FDBE102ŒINNIMDELDB ŠBSR„GET4HEX ŠTST.L‚D1ŠBEQ„FDBE101ŒDELDBŠMOVE.BD1,FABSGS(A6)ŠMOVE.B#1,FABFLG-B(A5) ŠBRA„FDBC120**ˆER:FRLANDFABCONFLICT*FDBE200ƒLEA„FDRPSN(PC),A0ŠMOVE.LPSNDB-B(A5),D1 ŠBSR„BIN4HEXŠLEA„FDRMSG(PC),A0ŠMOVE.L#FDRMSGL,D0 ŠBSR„SENDMSQCŠBEQ„FDBE102ŒDELDBINNIM(ŠBRA„FDBC150ŒREPEATUPDATEDBLOOPINIM*9*ˆER:DATAEXISTBEYONDTHELASTRECORDINTHEDATABLOCK*FDBE210:‰LEA‡X00100(PC),A0*œA0=MSGSTARTADDRESS‰MOVE.L„#X00199,D0*œD0=MSGLENGTH‰BRA.S…FDBE225*œCONTINUEPROCESSING*)*ˆER:RECORDBCTORRECORDPASTENDOFDB*FDBE220ƒMOVE.WD0,D1ŠLEA„RLEFLD(PC),A0 ŠBSR„BIN2HEXŠLEA„RLEMSG(PC),A0ŠMOVE.L#RLEMSGL,D0(FDBE225ƒMOVE.L#2,D4ŽFLAGTOTRUNCATEDB ŠBSR„SENDMSQCŠLEA„TRNMSG(PC),A0ŠTRUNCATEDBŠMOVE.L#TRNMSL,D0ŠMOVE.L#'DB',TRNITM-B(A5) ŠBSR„SENDMSQC(ŠBNE„FDBC150ŒINIMREPEATUPDATEDBLOOPŠBRA„FDBCTDBŒGOTRUNCATEINNIM*!*ˆER:KEYSNOTINASCENDINGORDER*"FDBE250ƒLEA„DKEPSN(PC),A0ŠSENDPSNŠMOVE.LPSNDB-B(A5),D1 ŠBSR„BIN4HEXŠLEA„DKEMSG(PC),A0ŠMOVE.L#DKEMSGL,D0ŠBRA„FDBE225ŒTRUNCATEDB*%*ˆER:FABKEYLESSTHANDB'SLASTKEY* 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ŒINNIMFORCESAMEŠBSR„REPAIRINIMASK"ŠBNE„FDBC150ŒREPEATUPDATEDBLOOP%FDBE275ƒLEA„FABKEY+1(A6),A0„SETEQUALFDBE276ƒMOVE.B(A1)+,(A0)+ ŠSUB.B‚#1,D0 ŠBNE„FDBE276ŠMOVE.B#1,FABFLG-B(A5)ŠMOVE.BDIRKEY(A4),D0 ŠBRA„FDBC260*4*ˆER:PRIORFABENTRYKEYGREATERTHAN1STKEYINDB* FDBE280ƒMOVE.B#'F',FDKATR-B(A5)ŠLEA„FDKMSG(PC),A0ŠMOVE.L#FDKMSGL,D0 ŠBSR„SENDMSQCŠLEA„DELMSG(PC),A0ŠDELETEDBŠMOVE.L#'DB',DELITM-B(A5)ŠMOVE.L#DELMSGL,D0ŠMOVE.L#1,D4ŽFLAGDELDB ŠBSR„SENDMSQC%ŠBNE„FDBC150ŒREPEATUPDATELOOPINIMŠBRA„FDBC125ŒDELDB INNIMŠPAGE**ˆER:DIREOR/DIREOFCONFLICT* FDBE300ƒEQU„*!ŠLEA„EFCMSG(PC),A0ŠSENDERRORMSGŠMOVE.L#EFCMSGL,D0 ŠBSR„SENDMSQCŠLEA„RECMSG(PC),A0ŠRECALCULATEŠMOVE.L#RECMSGL,D0 ŠBSR„SENDMSG.ŠMOVE.B#1,CNTFLG-B(A5)„GOFORCEPROPERVALUES ŠBRA„FDBC525**ˆER:FABUSEFRACTION*&FDBE310ƒMOVE.LD0,D1ŽSAVEUSEFRACTIONŠLEA„FUSMSG(PC),A0ŠMOVE.L#FUSMSGL,D0ŠBSR„SENDMSQC‹SENDERRRORMSGŠLEA„RECMSG(PC),A0ŠRECALCULATEŠMOVE.L#RECMSGL,D0 ŠBSR„SENDMSG&ŠMOVE.LD1,D0ŽRESTOREFABUSEFRACTION"ŠBRA„FDBC512ŒGOFORCEPROPERVALUEŠPAGE*O*********************************************************************************ˆDELFBE:1.008/18/80HBN6*O********************************************************************************3*ˆDELFBEDELETESFABENTRYBYMOVINGRESTOFFABUP*!*ˆONENTRY:A0->ENTRYTODELETE**ˆONRETURN:Z=0IFKEYERROR*—1IFDELETEDOK* DELFBE„EQU„**4*ˆGETENDOFFABENTRYPOINTER-'MOVE-FROM'ADDRESS*ŠMOVEM.LA0-A2/D0,-(A7) ŠCLR.L‚D0ŠLEA„FABKEY(A0),A1'ŠMOVE.B(A1)+,D0‹GETENTRY'SKEYLENGTH$ŠCMP.B‚KEYLEN-B(A5),D0„CHECKSIZEOKŠBNE.S‚DELFBRERROR‚RETURN#ŠADD.L‚D0,A1ŽA1->ENDOFFABENTRY**ˆMOVEFABBUFFERUP*1DELFB0„CMP.L‚DBBUF-B(A5),A1…ATENDOFFABBUFFER?ŠBGE.S‚DELFB1YES#ŠMOVE.W(A1)+,(A0)+ˆNO,KEEPMOVING ŠBRA„DELFB0DELFB1„MOVE.B#1,FABFLG-B(A5),ŠCLR.L‚(A0)MAKESUREENDOFFABENTRIES=0DELFBR„MOVEM.L(A7)+,A0-A2/D0ŠRTS*ŠPAGE*O*********************************************************************************ˆNIMC1.007/8/80HBN6*O********************************************************************************A*ˆNIMCCHECKSCURRENTMODE-ERRORHASOCCURED.‚IFC-OPTIONISONC*ˆABRANCHISMADETO'TRMREP'.IMISTURNEDBACKONIFTURNEDOFF.**ˆONENTRY:D7=MODESTATUS*1*ˆONRETURN:Z=1IFNIM,ORIMWITHFILEREPAIR *—0IFIM*“D0-CHANGED* NIMC†EQU„*ŠTST.W‚D7‘C-OPTION?ŠBMI„TRMREPYES,QUIT ŠTST.B‚D7‘IM?ŠBNE.S‚NIMCRŽYESŠMOVE.LD7,D0ŽMAYBETURNEDOFF3ŠAND.L‚#NIMASK,D0‰CHECKIFSOMEIM-TURN-OFFBITSET ŠBEQ.S‚NIMCRŠMOVE.B#1,D7ŽTURNIMBACKON)ŠAND.L‚#-(NIMASK+1),D7„RESETFLAGS,Z=0NIMCR…RTS„Z=0IFI-OPTIONONŠPAGE*O**********************************************************************************‡GETSEG1.007/3/80HBN6*O********************************************************************************>*ˆGETSEGALLOCATESREQUESTEDSEGMENT;IFERROROCCURSANERROR'*ˆMESSAGEISSENTANDREPAIRISABORTED**ˆONENTRY:D0=SEGMENTNAME*’D1=BYTECOUNTREQUESTED**ˆONRETURN:D0,A0-CHANGED1*’A0=A1=PHYSICAL=LOGICALADDRESSOFNEWSEGMENT* GETSEG„EQU„**#*ˆSETPARAMETERBLOCKFOREXECCALL*#ŠMOVE.LD0,SEGPRB+SEGNAM-B(A5)NAME)ŠMOVE.LD1,SEGPRB+SEGLEN-B(A5)BYTECOUNTŠERQ.GTSEGSEGPRB(PC)ŠBNE.S‚SEGEXEEXECERROR$ŠMOVE.LA0,A1ŽADDRESSOFNEWSEGMENTŠBSR„CLRBUFZEROOUTBUFFERŠRTS*+*ˆCOMMONERRORRETURNFROMGETSEGORDELSEG* SEGEXE„EQU„*%ŠMOVE.LD0,D1ŽCONVERTSTATUSTOASCIIŠLEA„SEGMD0(PC),A0Š. ŠBSR„BIN4HEXFŠMOVE.LSEGPRB+SEGNAM-B(A5),SEGMNM-B(A5)SETSEGMENTNAMEINTOMESSAGE%ŠLEA„SEGMSG(PC),A0ŠSENDERRORMESSAGEŠMOVE.L#SEGMSGL,D0 ŠBSR„SENDMSGS ŠBRA„TRMREP*O*********************************************************************************ˆDELSEG:1.007/4/80HBN6*O********************************************************************************B*ˆDELSEGDEALLOCATESGIVENSEGMENT,EXEC-ERRORCAUSESREPAIRTOBE *ˆABORTED**ˆONENTRY:D0-SEGMENTNAME**ˆONRETURN:D0,A0-CHANGED* DELSEG„EQU„*/ŠMOVE.LD0,SEGPRB+SEGNAM-B(A5)SETSEGMENTNAME$ŠERQ.DESEGSEGPRB(PC)†RELEASEMEMORYŠBNE„SEGEXEERRORŠRTSŠPAGE*O*********************************************************************************ˆDMPALC:1.007/22/80HBN6*O******************************************************************************* *&*ˆDMPALCREQUESTS'DUMP?','ALLOCATE?'*%*ˆONENTRY:D1=STARTINGPSNTODUMP*’D0=SECTORCOUNT*%*ˆONRETURN:Z=1IF'Y'TOALLOCATE *—0IF'N'* DMPALC„EQU„***ˆDUMP?*ŠMOVEM.LD0-D2/A0,-(A7)ŠMOVE.LD0,D2ŽSAVESECTORCOUNTŠLEA„DMPMSG(PC),A0ŠMOVE.L#DMPMSGL,D0ŠBSR„SENDMSGS‹DUMP? ŠBSR„GETRYN.ŠBNE.S‚DMPAL0NOŠBSETƒ#31,D2YES,DUMP&ŠBSR„UPDSECUSESECTORBUFFERFORDUMP* *ˆALLOCATE?*DMPAL0„LEA„ALCMSG(PC),A0ŠMOVE.L#ALCMSL,D0 ŠBSR„SENDMSGSŠBSR„REPAIRALLOCATE?1ŠMOVEM.L(A7)+,D0-D2/A0„Z=1IFYES,Z=0IFNOŠRTS*ŠPAGE*O*********************************************************************************‰DMPSKP:1.007/23/80HBN6*O*********************************************************************************ˆDMPSKPASKS'DUMP','SKIP'**ˆONENTRY:D1=OLDPSN*’D0=SECTORCOUNTTODUMP* *ˆONRETURN:Z=1IFSKIP-YES*—0IFSKIP-NO* DMPSKP„EQU„***ˆDUMP?*ŠMOVEM.LD0/D2/A0,-(A7)ŠMOVE.LD0,D2ŽSAVESECTORCOUNTŠLEA„DMPMSG(PC),A0ŠMOVE.L#DMPMSGL,D0ŠBSR„SENDMSGS‹DUMP? ŠBSR„GETRYN.ŠBNE.S‚DMPSK0NOŠBSETƒ#31,D2YES,DUMP&ŠBSR„UPDSECUSESECTORBUFFERFORDUMP**ˆSKIP?*DMPSK0„LEA„SKPMSG(PC),A0ŠMOVE.L#SKPMSGL,D0 ŠBSR„SENDMSGSŠBSR„GETRYNGETRESPONSEŠMOVEM.L(A7)+,D0/D2/A0ŠRTSŠPAGE*O**********************************************************************************ˆDMPQNL:1.007/23/80HBN6*O********************************************************************************=*ˆDMPQNLASKS'DUMP','QUIT'ANDIFNOTTOQUITGETSNEWLINK**ˆONENTRY:D1=OLDPSN*’D0=SECTORCOUNTTODUMP**ˆONRETURN:D1=NEWLINK* DMPQNL„EQU„***ˆDUMP?*ŠMOVEM.LD0/D2/A0,-(A7)ŠMOVE.LD0,D2ŽSAVESECTORCOUNTŠLEA„DMPMSG(PC),A0ŠMOVE.L#DMPMSGL,D0ŠBSR„SENDMSGS‹DUMP? ŠBSR„GETRYN.ŠBNE.S‚DMPQN0NOŠBSETƒ#31,D2YES,DUMP&ŠBSR„UPDSECUSESECTORBUFFERFORDUMP**ˆQUIT?*DMPQN0„LEA„QUTMSG(PC),A0ŠMOVE.L#QUTMSGL,D0 ŠBSR„SENDMSGSŠBSR„GETRYNQUIT?ŠBEQ„TRMREPYESŠBSR„GET4HEXŒNO,GETNEWLINKŠMOVEM.L(A7)+,D0/D2/A0ŠRTSŠPAGE*O*********************************************************************************ˆCHKASC:1.007/7/80HBN6*O********************************************************************************G*ˆCHKASCCHECKSAFIELDTOCONTAINONLYPRINTABLEASCIIBYTES($20-$7E)A*ˆERRORMESSAGEISSENTIFERRORISFOUND,ANDNEWFIELDCONTENTS*ˆAREREQUESTED* *ˆONENTRY:A1=STARTOFBUFFER*’D2=OFFSETTOFIELD*’D3=LENGTHOFFIELD5*’A0=ERRORMESSAGETOPRINTIFNONASCIICHARACTERS*’D0=ERRORMSGLENGTH***ˆONRETURN:Z=1IFNOERROR,D0UNKNOWN.*—0IFERROR,D0=#OFCHARACTERSINRESPONSE* CHKASC„EQU„**ŠMOVEM.LD1-D4/A0-A1,-(A7)ŠMOVE.LD0,D4ŽSAVEMSGBCTCHKAS0„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.LD4,D0 ŠBSR„SENDMSQCŠMOVEM.L(A7)+,D1-D4/A0-A1&ŠBSR„NEWFLDREQUESTNEWFIELDCONTENTSŠRTS*O*********************************************************************************ˆSETEQL:1.007/7/80HBN6*O********************************************************************************,*ˆSETEQLASKSUSERIFFIELDCANBESETEQUAL.*ˆONRETURN:Z=IIFCANSETEQUALELSEDON'T*SETEQL„MOVEM.LD0/A0,-(A7)ŠLEA„SEQMSG(PC),A0ŠMOVE.L#SEQMSGL,D0 ŠBSR„SENDMSG ŠBSR„REPAIRŠMOVEM.L(A7)+,D0/A0ŠRTSŠPAGE*O*********************************************************************************ˆNAMECK:1.007/7/80HBN6*ˆCATCHK:1.007/7/80HBN6*O********************************************************************************>*ˆNAMECKCHECKSAFIELDTOCONTAIN‚ANALPHANUMERICNAME,FIRST>*ˆCHARACTERMUSTBEALPHABETIC.FIELDMAYTERMINATEINSPACES.A*ˆERRORMESSAGEISSENTIFERRORISFOUND,NEWFIELDCONTENTSAR E *ˆREQUESTED.*>*ˆCATCHKDOESSAMEASNAMECKBUTALLOWSFIELDTOBEALLSPACES* *ˆONENTRY:A1=STARTOFBUFFER$*’D2=OFFSETTOFIELDTOBECHECKED*’D3=LENGTHOFFIELD*’A0=ERRORMESSAGETOPRINT8*’D0=LENGTHOFMSG‚(IFBIT31SETTHENALLOW&OR@TO *—STARTNAME)*$*ˆONRETURN:Z=1IFOK,D0UNKNOWN%*—0IFERROR,D0=LENGTHOFRESPONSE* CATCHK„EQU„*ŠMOVEM.LD1-D4/A0-A1,-(A7)ŠMOVE.LD0,D4ŽSAVEMSGBCTŠMOVE.B(A1,D2),D0=ŠBSR„ALPHA†IF1STCHARACTERISSPACETHENRESTMUSTBESPACES ŠBEQ.S‚NCCHK0ŠCMP.B‚#'',D0ŒSPACE?ŠBNE.S‚NAMEC2ERRORŠBRA.S‚NCCHK1OK*NAMECK„EQU„*’ENTRYPOINT*ŠMOVEM.LD1-D4/A0-A1,-(A7)ŠMOVE.LD0,D4ŽSAVEMSGBCTŠMOVE.B(A1,D2),D0*ŠBCLRƒ#31,D4&OR@OKASFIRSTCHARACTER?ŠBEQ.S‚NAMECŽNOŠCMP.B‚#'&',D0ŒYESŠBEQ.S‚NCCHK0&ISOKŠCMP.B‚#'@',D0ŠBEQ.S‚NCCHK0@ISOK"NAMEC…BSR„ALPHAŽELSEMUSTBEALPHAŠBNE.S‚NAMEC2ERRORNCCHK0„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‚NAMEC2ERROR-NCCHK1„MOVE.L#1,D1ŽFLAGTOALLOWONLYSPACES ŠBRA„NAMEC0 NAMECR„MOVEM.L(A7)+,D1-D4/A0-A1ŠRTSNAMEC1„TST.L‚D17ŠBEQ„NAMEC0ŒONCEASPACEFOUNDRESTMUSTBESPACESALSO"NAMEC2„MOVE.LD4,D0ŽSENDERRORMSG ŠBSR„SENDMSQCŠMOVEM.L(A7)+,D1-D4/A0-A1ŠBSR.S‚NEWFLDGETNEWFIELDŠTST.L‚D0‘SETZ=0 ŠBNE.S‚NAMERT ŠCMP.B‚#1,D0 NAMERT„RTS*ŠPAGE*O*********************************************************************************ˆNEWFLD:1.007/22/80HBN6*O********************************************************************************-*ˆNEWFLDREQUESTS'OLD(N),ƒNEW?'"*ˆFIELDISCHANGEDBYNEWCONTENTS* *ˆONENTRY:D2=OFFSETTOFIELD*’D3=LENGTHOFFIELD*’A1=BASEADDRESS*-*ˆONRETURN:D0=NUMBEROFBYTESINRESPONSE* NEWFLD„EQU„**ŠMOVEM.LD4-D5/A0/A3,-(A7)ŠMOVE.LD3,D5ŽSAVEBCT**ˆBUILDLINEFOROLDFIELD*ŠLEA„(A1,D2),A3‰STARTOFFIELDŠLEA„LINEBUF(PC),A0ŠMOVE.L#'OLD',(A0)+ŠMOVE.B#'''',(A0)+ˆQUOTE/NEWF00„MOVE.B(A3)+,D0‹GETNEXTBYTEFROMFIELDŠCMP.B‚#$20,D03ŠBLT.S‚NEWF05CHANGENONPRINTABLECHARACTERSTO'.'ŠCMP.B‚#$7E,D0 ŠBLS.S‚NEWF10NEWF05„MOVE.B#'.',D0NEWF10„MOVE.BD0,(A0)+ ŠSUB.L‚#1,D3ŠBNE„NEWF00NEXTBYTEŠMOVE.B#'''',(A0)+ˆQUOTEŠMOVE.B#'',(A0)+ŠMOVE.B#'(',(A0)+0ŠMOVE.B#'$',(A0)+‰INDICATETHATVALUEISINHEXŠMOVE.LD5,D1ŽSETBCT ŠBSR„BIN1HEX ŠLEA„2(A0),A0ŠMOVE.B#')',(A0)+ŠMOVE.LA0,-(A7)ŠLEA„LINEBUF(PC),A0 ŠMOVE.LA0,D3ŠMOVE.L(A7)+,A0ŠSUB.L‚D3,A0ŽGETLINEBCT ŠMOVE.LA0,D0 ŠMOVE.LD3,A0$ŠBSR„SENDMSGS‹SEND'OLD'FIELD''MSG,NEWF15„MOVE.L#'NEW?',(A0)‡ASKFORNEWFIELD ŠMOVE.L#4,D0 ŠBSR„SENDMSGS ŠIOSCALLINPIOS(PC)ˆGETRESPONSE ŠBNE„IOERR ŠBSR„HRDCPY2ŠMOVE.LIOSLEN+INPIOS-B(A5),D3ƒGETRESPONSELENGTHŠBEQ.S‚NEWF30ERRORIFCRONLY)ŠCMP.L‚D5,D3ŽERRORIFTOOMANYCHARACTERS ŠBHI.S‚NEWF30**ˆUPDATEFIELD*ŠBSR„BLNKFLBLANKFILLBUFFERŠLEA„INPBUF(PC),A0ŠBUFFERSTARTŠMOVE.LD3,D0ŽRETURNBCTŠLEA„(A1,D2),A3NEWF20„MOVE.B(A0)+,(A3)+ ŠSUB.L‚#1,D3 ŠBNE„NEWF20'NEWFRT„MOVEM.L(A7)+,D4-D5/A0/A3RETURNŠRTS**ˆERRORINRESPONSE*NEWF30„BSR„RESPNAŠLEA„LINEBUF(PC),A0ŠBRA„NEWF15TRYAGAINŠPAGEN********************************************************************************ˆGET4HEX:‰1.007/22/80HBN6 *ˆGETNEW4:N*******************************************************************************=*ˆGET4HEXGETS4BYTEHEXVALUEFROMUSER'R:GIVENEWVALUE'*°'OLD<4BYTEHEX>'*°'NEW?'+*ˆGETNEW4IDENTICALEXCEPTASKSONLY'NEW?'**ˆONENTRY:D1=OLDVALUE**ˆONRETURN:D1=NEWVALUE* GETNEW4ƒEQU„**ŠMOVEM.LD2-D3/D0/A0-A1,-(A7)ŠLEA„LINEBUF(PC),A0ŠBRA.S‚GETNEW0ŒSKIPOTHERMSGS* GET4HEXƒEQU„**ŠMOVEM.LD2-D3/D0/A0-A1,-(A7)ŠLEA„GNVMSG(PC),A0ŠMOVE.L#GNVMSGL,D0 ŠBSR„SENDMSGSŠLEA„LINEBUF(PC),A0 ŠMOVE.LA0,A1ŠMOVE.L#'OLD',(A0)+ŠBSR„BIN4HEXŒSETOLDPSN ŠMOVE.LA1,A0ŠMOVE.L#12,D0 ŠBSR„SENDMSGS+ GETNEW0ƒEQU„*’CONTINUEGETNEW4FROMHEREONŠMOVE.L#'NEW?',(A0)GET4H00ƒMOVE.L#4,D0 ŠBSR„SENDMSGS ŠIOSCALLINPIOS(PC)ˆGETRESPONSE ŠBNE„IOERR ŠBSR„HRDCPYŠLEA„INPBUF(PC),A0ŠMOVE.LIOSLEN+INPIOS-B(A5),D3 ŠBEQ.S‚GET4ER&ŠMOVE.L#-1,D2INITIALIZENOPSNGIVEN ŠCLR.L‚D1GET4H05ƒMOVE.B(A0)+,D0ŠCMP.B‚#CR,D0DONE?ŠBEQ.S‚GET4H15&ŠBSR„HEXBINNO,CONVERTNEXTCHARACTERŠBNE.S‚GET4ERERROR ŠTST.L‚D2ŠBPL.S‚GET4H10 ŠCLR.L‚D2'GET4H10ƒMOVE.L#$F,D0CHECKNOOVERFLOWŠLSR.L‚#4,D0ŽMASK ŠAND.L‚D2,D0ŠBNE.S‚GET4ERERROR ŠLSL.L‚#4,D2ŠBMI.S‚GET4ERERROR ŠOR.BƒD1,D2 ŠSUB.L‚#1,D3ŠBNE.S‚GET4H05&GET4H15ƒMOVE.LD2,D1ŽANYNUMBERGIVEN?!ŠBMI.S‚GET4ERORNUMBERTOOLARGEŠMOVEM.L(A7)+,D0/D2-D3/A0-A1ŠRTSGET4ER„BSR„RESPNABADRESPONSEŠLEA„LINEBUF(PC),A0 ŠBRA„GET4H00ŠPAGE*O*********************************************************************************ˆFABERM:1.0012/9/80HBN6*O********************************************************************************B*ˆFABERMCHECKSFABFORAMAXIMUMNUMBEROFERRORS,IFERRORCOUNT'*ˆTOOLARGETHENFABCHAINISTRUNCATED* FABERM„EQU„*ŠADD.B‚#1,FABERR-B(A5)%ŠCMP.B‚#2,FABERR-B(A5)„REACHEDLIMIT?ŠBNE.S‚FABER0NOŠLEA„BFTMSG(PC),A0ŠMOVE.L#BFTMSGL,D0 ŠBSR„SENDMSQC,ŠCLR.L‚LSTSRD-B(A5)‡FORCETRUNCATEFABCHAINŠADD.L‚#4,A7ŽRESTORESTACKŠBRA„FDBTRŽGOTRUNCATE FABER0„RTS O*******************************************************************************E*‰THISISATEMP.SHORTMESSAGETOBEUSEDUNTILHELPMESSAGESINTACT*'STUBMSG:‚DC.Bƒ'Notimplementedasyet'STUBMSGL:EQU„*-STUBMSG STUB:…DS…0;ŠLEA„STUBMSG(PC),A0‰Pointtostart"Notimplemented"messag.ŠMOVE.L#STUBMSGL,D0‡providelengthofmessageŠBSR„SENDMSGŒsendit2ŠCLR.L‚D1‘indicatefirstPSNtodumptoscreen(0)*ŠCLR.L‚D2‘offsetforstartingbytetodumpŠRTS  ** ŠEND„STARTPCééé**†REPAIRSUBROUTINES-PART2*Š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**ˆEQUATESFROMPART1* RCRSAT„EQU„14 CRˆEQU„$D* ŠSECTIONƒ0*O*********************************************************************************ˆTSTNYA1.007/31/80HBN6*O********************************************************************************=*ˆTSTNYACHECKSTHATSECTORSHAVENOTBEENALLOCATEDALREADY.G*ˆSECTORSAREMARKEDALLOCATEDINALLOCATIONSATIFNOERRORWASFOUND.*"*ˆONENTRY:D1=PSNOF1STSECTOR*’D2=NUMBEROFSECTORS*C*ˆONRETURN:Z=1‚IFNOSECTORYETALLOCATED(MARKEDNOWALLOCATED)3*“Z=0ANDD0=-1IF1STSECTORALREADYALLOCATED2*“Z=0ANDD0=1IF1STSECTORNOTYETALLOCATED* TSTNYA„EQU„*ŠMOVEM.LD1-D5/A0,-(A7)$ŠMOVE.LD2,D5ŽSAVENUMBEROFSECTORS ŠBEQ.S‚TSTNYR*$*ˆCHECKNOTMARKEDALLOCATEDALREADY*6ŠMOVE.LSATABUF-B(A5),A0ƒALLOCATIONSATBUFFERADDRESSAŠBSR„OFSBIT‚GETOFFSETANDBITNUMBERFOR1STPSNINTOSATBUFFER ŠCLR.L‚D09TSTNY0„BTSTƒD3,(A0,D4.L)‡SECTORMARKEDALLOCATEDALREADY?ŠBNE.S‚TSTNY9YES,ERROR ŠMOVE.L#1,D0 ŠSUB.L‚#1,D5ŽNO,DONE?ŠBEQ.S‚TSTNY5YESŠADD.L‚#1,D0ŽNOŠSUB.W‚#1,D3ŽMOVETONEXTBIT&ŠBPL„TSTNY0HAVETOMOVETONEXTBYTE?$ŠMOVE.L#7,D3ŽYES,STARTATHIGHBITŠADD.W‚#1,D4ŽNEWOFFSET.ŠBRA„TSTNY0GOCHECKNEXTSECTORNOTALLOCATED**ˆRETURN*1TSTNY5„EQU„*’SECTORSOK-MARKALLOCATED(D0=1) ŠBSR„ALDESCŠCLR.L‚D0‘FLAGOK/TSTNYR„MOVEM.L(A7)+,D1-D5/A0„RESTOREREGISTERSŠRTS*"*ˆERROR-SECTORALREADYALLOCATED*%TSTNY9„TST.L‚D0‘SETRETURNCONDITIONS ŠBNE„TSTNYR0ŠMOVE.L#-1,D0FLAG1STSECTORALREADYALLOCATED ŠBRA„TSTNYRŠPAGE*O*********************************************************************************ˆTSTFRE1.007/31/80HBN6*³J¼DÄJÌOÔ^ÜKäYì?O********************************************************************************A*ˆTSTFRECHECKSTHATSECTORSHAVENOTBEENREALLOCATEDAFTERFILE**ˆDELETED.TESTSKIPPEDIFRECREATINGSAT.5*ˆSECTORSAREMARKEDALLOCATEDIFNO‚ERRORWASFOUND.*"*ˆONENTRY:D1=PSNOF1STSECTOR*’D2=NUMBEROFSECTROS*!*ˆONRETURN:Z=1‚REALLOCATEDOK-*“Z=0ANDD0=-1IF1STSECTORREALLOCATED0*“Z=0ANDD0=1IF1STSECTORNOTREALLOCATED* TSTFRE„EQU„*ŠMOVEM.LD1-D5/A0,-(A7) ŠMOVE.LD2,D5 ŠBEQ.S‚TSTFRR**ˆCHECKNOTMARKEDALLOCATED*9ŠMOVE.L#1,D0JUSTALLOCATE(SKIPTEST)IFRECREATINGSATŠBTSTƒ#RCRSAT,D7ŠBNE.S‚TSTFR5GOALLOCATE0ŠMOVE.LSATDBUF-B(A5),A0ƒDISKSATBUFFERADDRESSAŠBSR„OFSBIT‚GETOFFSETANDBITNUMBERFOR1STPSNINTOSATBUFFER ŠCLR.L‚D04TSTFR0„BTSTƒD3,(A0,D4.L)‡SECTORMARKEDREALLOCATED?ŠBNE.S‚TSTFR9YES,ERROR ŠMOVE.L#1,D0ŠSUB.L‚#1,D5ŽNO,DONE?ŠBEQ.S‚TSTFR5YESŠADD.L‚#1,D0ŽNOŠSUB.W‚#1,D3ŽMOVETONEXTBIT&ŠBPL„TSTFR0HAVETOMOVETONEXTBYTE?$ŠMOVE.L#7,D3ŽYES,STARTATHIGHBITŠADD.W‚#1,D4ŽNEWOFFSET.ŠBRA„TSTFR0GOCHECKNEXTSECTORNOTALLOCATED**ˆRETURN*1TSTFR5„EQU„*’SECTORSOK-MARKALLOCATED(D0=1) ŠBSR„ALDESC-ŠMOVE.B#1,SATFLG-B(A5)„FLAGDISKSATCHANGEDŠCLR.L‚D0‘FLAGOK/TSTFRR„MOVEM.L(A7)+,D1-D5/A0„RESTOREREGISTERSŠRTS*"*ˆERROR-SECTORALREADYALLOCATED*%TSTFR9„TST.L‚D0‘SETRETURNCONDITIONS ŠBNE„TSTFRR*ŠMOVE.L#-1,D0FLAG1STSECTORREALLOCATED ŠBRA„TSTFRRŠPAGEO*********************************************************************************ˆTSTALC1.006/25/80HBN6*O********************************************************************************9*ˆTSTALCTESTSECTORSFORALLOCATIONINOLDSATFROMDISK5*ˆCALLISSKIPPEDIFSATISTOBERECREATEDBYREPAIR*$*ˆONENTRY:D1=PSNOFFIRSTSECTOR!*’D2=NUMBEROFSECTORSTOCHECK*#*ˆONRETURN:Z=1IFALLALLOCATED/*“Z=0ANDD0=-1IF1STSECTORNOTALLOCATED**“Z=0ANDD0=1IF1STSECTORALLOCATED*,TSTALC„MOVEM.LD1-D4/A0,-(A7)„SAVEREGISTERS ŠTST.L‚D2 ŠBEQ.S‚TSTARTŠBTSTƒ#RCRSAT,D7‰RECREATESAT?ŠBEQ.S‚TSTA00NOŠCLR.L‚D0‘YES,SKIPCALL ŠBRA.S‚TSTART*0*ˆFINDBITNUMBER,OFFSETINTOSATFORGIVENPSN*6TSTA00„MOVE.LSATDBUF-B(A5),A0ƒDISKSATBUFFERADDRESS-ŠBSR„OFSBITGETBIT#INTOD3,OFFSETINTOD4 ŠCLR.L‚D0*/*ˆCHECKEACHSECTORINTHEBLOCKFORALLOCATION*#TSTA01„BTSTƒD3,(A0,D4.L)‡ALLOCATED?ŠBEQ.S‚TSTA05NO ŠMOVE.L#1,D0 ŠSUB.L‚#1,D2ŽALLSECTORSTESTED?ŠBEQ.S‚TSTARTYES!ŠADD.L‚#1,D1ŽNO,TESTNEXTSECTOR'ŠSUB.W‚#1,D3ŽISITINSAMEBYTEINSAT?"ŠBPL„TSTA01YES,INNEXTLOWERBIT(ŠMOVE.L#7,D3ŽNO,INNEXTBYTE,HIGHBITŠADD.W‚#1,D4Ž. ŠBRA„TSTA01.TSTA05„TST.L‚D0‘RETURNFLAG ŠBNE.S‚TSTARTŠMOVE.L#-1,D0/TSTART„MOVEM.L(A7)+,D1-D4/A0„RESTOREREGISTERSŠRTSŠPAGE*O*********************************************************************************ˆDEALLC1.017/23/80HBN6*O************** ********************************************************************ˆDEALLCDEALLOCATESSECTORSINBOTHSAT'S*+*ˆONENTRY:D1=FIRSTSECTORTODEALLOCATE!*’D2=#OFSECTORSTODEALLOCATE DEALLC„EQU„*-ŠMOVEM.LD0/A0,-(A7)‡STOREREGISTERSƒ11/29/84ŠCLR.L‚D0‘DEALLOCATEFLAGŠMOVE.LSATABUF-B(A5),A0%ŠBSR.S‚ALDESCDEALLOCATEFROMNEWSATŠMOVE.LSATDBUF-B(A5),A0%ŠBSR.S‚ALDESCDEALLOCATEFROMOLDSATŠMOVE.B#1,SATFLG-B(A5)/ŠMOVEM.L(A7)+,D0/A0‡RESTOREREGISTERS‚11/29/84ŠRTSŠPAGE*O*********************************************************************************ˆALLOCT1.007/23/80HBN6*O**********************************************************************************ˆALLOCTALLOCATESSECTOR(S)INBOTHSAT'S**ˆONENTRY:D1=1STPSN#*’D2=NUMBEROFSECTORTOALLOCATE* ALLOCT„EQU„*ŠMOVEM.LD0/A0,-(A7)ŠMOVE.L#1,D0ŽSETALLOCATEFLAG4ŠMOVE.LSATABUF-B(A5),A0ƒALLOCATESECTORSINNEWSAT ŠBSR.S‚ALDESC4ŠMOVE.LSATDBUF-B(A5),A0ƒALLOCATESECTORSINOLDSAT ŠBSR.S‚ALDESCŠMOVE.B#1,SATFLG-B(A5)ŠMOVEM.L(A7)+,D0/A0ŠRTSŠPAGE*O*********************************************************************************ˆALDESC1.006/21/80HBN6*O*********************************************************************************;*ˆALDESCALLOCATES/DEALLOCATESGIVENSECTORSINEITHERSAT.A*ˆSECTORSAREALLOCATED/DEALLOCATEDREGARDLESSOFCURRENTSTATUS.*"*ˆONENTRY:D1=PSNOF1STSECTOR$*’D2=NUMBEROFCONSECUTIVESECTORS*’A0=SATBUFFERADDRESS*’D0=0IFDEALLOCATE*—1IFALLOCATE* ALDESC„EQU„**&ŠMOVEM.LD0-D5/A0,-(A7)„SAVEREGISTERS ŠTST.L‚D2 ŠBEQ.S‚ALDERT**ˆFINDSTARTINGBYTEANDBIT#*%ŠMOVE.LD0,D5ŽSAVEALLOC/DEALLOCFLAGCŠBSR.S‚OFSBIT‚GETOFFSETANDBITNUMBERFOR1STPSNINTOSATBUFFERALDE05„TST.B‚D5‘ALLOCATE?ŠBNE.S‚ALDE10YES!ŠBCLRƒD3,(A0,D4.L)‡NO,DEALLOCATE ŠBRA.S‚ALDE15!ALDE10„BSETƒD3,(A0,D4.L)‡ALLOCATEALDE15„SUB.L‚#1,D2ŽDONE?ŠBEQ.S‚ALDERTYES,RETURNŠADD.L‚#1,D1ŽNOŠSUB.W‚#1,D3ŽMOVETONEXTBIT&ŠBPL„ALDE05HAVETOMOVETONEXTBYTE?$ŠMOVE.L#7,D3ŽYES,STARTATHIGHBITŠADD.W‚#1,D4ŽNEWOFFSET)ŠBRA„ALDE05GOMARKNEXTSECTORALLOCATED/ALDERT„MOVEM.L(A7)+,D0-D5/A0„RESTOREREGISTERSŠRTSŠPAGE*O*********************************************************************************ˆOFSBIT1.006/25/80HBN6*O********************************************************************************B*ˆOFSBITCALCULATESBITNUMBERANDOFFSETFORGIVENPSNINTOASAT*ˆBUFFER**ˆONENTRY:D1=PSN*$*ˆONRETURN:D3.W=BITNUMBER(0-7)&*“D4.L=OFFSETTOBYTEWITHGIVENBIT* OFSBIT„EQU„*ŠMOVE.LD1,D4ŽPSNŠLSR.L‚#3,D4ŽDIV8FOROFFSETŠMOVE.LD1,D3ŽPSN ŠLSL.L‚#3,D4ŠSUB.L‚D4,D3ŽD3=REMAINDERŠLSR.L‚#3,D4ŽREESTABLISHOFFSET ŠSUB.L‚#7,D3ŠNEG.L‚D3‘BITPOSITIONŠRTSŠPAGE*O*********************************************************************************ˆDECBINW1.007/3/80HBN6*O********************************************************************************F*ˆDECBINWCONVERTSDECIMALNUMBERTOBINARYWORD;ERRORISRETURNEDIFG*ˆACHARACTEROTHERTHAN0THRU9ISENCOUNTEREDORNUMBERISTOOLARGE*C*ˆONENTRY:A0=ADDRESSOFDECIMALNUMBER(MOSTSIGNIFICANTDIGIT)2*’(ASPACE,CR,'.',',',OR';'TERMINATESFIELD)*"*ˆONRETURN:Z=1IFCONVERTEDOK*—0IFERRORWASFOUND*“D0=TERMINATINGCHARACTER(*“A0->BYTEAFTERTERMINATINGCHARACTER*“D1.W=BINARYRESULT* DECBINWƒEQU„** ŠCLR.L‚D1 ŠCLR.L‚D0ŠMOVE.B(A0)+,D0DECBIN1ƒSUB.B‚#'0',D0ŠBMI.S‚DECBRTERROR ŠCMP.B‚#9,D0ŠBHI.S‚DECBRTERROR ŠADD.L‚D0,D1ŠCMP.L‚#$FFFF,D1ŠOVERFLOW?ŠBHI.S‚DECBRTERRORŠ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/BIN4HEX1.007/1/80HBN6*O********************************************************************************@*ˆBIN4HEXCONVERTS4BYTEBINARYVALUEINTOASCIIHEXANDSTORES**ˆTHENUMBERINTOMEMORYATGIVENLOCATION%*ˆBIN2HEXCONVERTS2BYTESSIMILARLY.$*ˆBIN1HEXCONVERTS1BYTESIMILARLY.*&*ˆONENTRY:D1=VALUETOBECONVERTED*’A0=FIELDTOPUTITINTO**ˆONRETURN:D0-CHANGED* BIN4HEXƒEQU„**ŠMOVEM.LD0-D1,-(A7) ŠBSR.S‚BINHEXŠMOVE.BD0,7(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.BD0,6(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.BD0,5(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.BD0,4(A0) ŠLSR.L‚#4,D1 ŠBRA.S‚BNHX0*BIN2HEXƒEQU„*’ENTRYPOINT*ŠMOVEM.LD0-D1,-(A7)BNHX0…BSR.S‚BINHEXŠMOVE.BD0,3(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.BD0,2(A0) ŠLSR.L‚#4,D1 ŠBRA.S‚BNHX1*BIN1HEXƒEQU„*’ENTRYPOINT*ŠMOVEM.LD0-D1,-(A7)BNHX1…BSR.S‚BINHEXŠMOVE.BD0,1(A0) ŠLSR.L‚#4,D1 ŠBSR.S‚BINHEXŠMOVE.BD0,(A0)ŠMOVEM.L(A7)+,D0-D1ŠRTSŠPAGEO*********************************************************************************ˆBINHEX1.007/8/80HBN6*O********************************************************************************5*ˆBINHEXCONVERTS4BITBINARYVALUEINTOAHEXDIGIT*+*ˆONENTRY:D1.B=BITS0-3TOBECONVERTED**ˆONRETURN:D0.B=HEXDIGIT *“Z=1IFOK *—0IFERROR BINHEX„EQU„** ŠMOVE.BD1,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*********************************************************************************ˆBIN2DEC1.0012/29/80TB59*O********************************************************************************D*ˆBIN2DECCONVERTS2BYTEBINARYVALUEINTOASCIIDECIMALANDSTORES**ˆTHENUMBERINTOMEMORYATGIVENLOCATION*(*ˆONENTRY:D1.W=VALUETOBECONVERTED0*’A0ƒ=ADDRESSOFFIELDTOPLACECONVERTEDASCII*!*ˆONRETURN:NOREGISTERSCHANGED*TENS†DC.Lƒ1000,100,10,1,0* BIN2DECƒEQU„*ŠMOVEM.LA0/A1/D0-D2,-(A7)(ŠAND.L‚#$0000FFFF,D1†ZEROOUTHIGHORDER(ŠLEA„TENS,A1ŒADDRESSOFCONVERSIONTABLEBIN2DEC0‚TST.L‚(A1)ŠBEQ.S‚BIN2DECR‹BRANCHIFDONEŠMOVE.B#$30,D2ŒASCII0%BIN2DEC1‚SUB.L‚(A1),D1ŒSUBTRACT10**N!ŠBCS.S‚BIN2DEC2‹BRANCHIFTOOBIGŠADD.B‚#1,D2ŽCONTINUEŠBRA.S‚BIN2DEC1,BIN2DEC2‚ADD.L‚(A1)+,D1‹RESTORE,ADVPOINTER-ŠMOVE.BD2,(A0)+‹PLACEASCIIDIGITINTOFIELD#ŠBRA.S‚BIN2DEC0‹CONTINUECONVERSION4BIN2DECR‚MOVEM.L(A7)+,A0/A1/D0-D2RESTOREREGISTERSŠRTSŠPAGEO*********************************************************************************ˆCHKKEY1.007/20/80HBN6*O********************************************************************************%*ˆCHKKEYCOMPARES2KEYSBYTEBYBYTE**ˆONENTRY:D0.B=KEYLENGTH)*’A0->KEYTHATUSUALLYSHOULDBELARGER*’A1->OTHERKEYA*ˆONRETURN:SR-SETACCORDINGTOLASTCOMPARE-CMP.B(A1),(A0)*CHKKEY„MOVEM.LD0/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*********************************************************************************ˆIM1.007/8/80HBN6*O********************************************************************************-*ˆIMCHECKSCURRENTMODEFORINTERACTIVEMODE**ˆONENTRY:D7=MODESTATUS**ˆONRETURN:Z=1IFIM+*—0IFNIMORC-OPTIONON,ORIMTURNEDOFF*IMˆEQU„*ŠTST.W‚D7‘C-OPTIONON?ŠBMI.S‚IMRTYES!ŠCMP.B‚#1,D7ŽNO,IMMEANSD7.B=1IMRT†RTSŠPAGE*O**********************************************************************************ˆHEXBIN1.006/27/80HBN6*O********************************************************************************1*ˆHEXBINCONVERTSONEHEXADECIMALDIGITTOBINARY*"*ˆONENTRY:D0.B=ASCIIHEXDIGIT3*ˆONRETURN:Z=1IFCONVERTOK,Z=0IFBADCHAR*“D1.B=4BITBINARYVALUE*“D0-CHANGED** HEXBIN„EQU„*ŠSUB.B‚#$3 0,D0Œ0-9?ŠBMI.S‚HEXBRTTOOLOWŠCMP.B‚#'F'-'0',D0ŠBHI.S‚HEXBRTTOOHIGH ŠCMP.B‚#9,D0ŠBHI.S‚HEXB05NOT0-9-HEXB00„MOVE.BD0,D1ŽRETURNBINARYVALUEIND1 ŠCLR.L‚D0 HEXBRT„RTSHEXB05„SUB.B‚#'A'-'0',D0ˆA-F?ŠBMI.S‚HEXBRTNO,ERRORŠADD.B‚#$A,D0YES ŠBRA„HEXB00*ŠPAGE*O**********************************************************************************ˆCLRBUF1.007/3/80HBN6*O********************************************************************************!*ˆCLRBUFZEROESABLOCKOFMEMORY*'*ˆONENTRY:D1=BYTECOUNTTOZEROOUT*’A1=STARTINGADDRESS*$*ˆONRETURN:ALLREGISTERSUNCHANGED* CLRBUF„EQU„**ŠMOVEM.LD1/A1,-(A7)CLRB00„CLR.B‚(A1)+ ŠSUB.L‚#1,D1 ŠBNE„CLRB00ŠMOVEM.L(A7)+,D1/A1ŠRTS*O**********************************************************************************‡BLNKFL1.009/9/80HBN6*O*********************************************************************************ˆBLNKFLBLANKFILLSTHEFIELD* *ˆONENTRY:D2=OFFSETTOFIELD *’D3=BCT*’A1=BASEADDRESS*(*ˆONRETURN:ALLREGISTERSAREUNCHANGED*BLNKFL„MOVEM.LA0/D3,-(A7)ŠLEA„(A1,D2),A0BLNKF0„MOVE.B#'',(A0)+ ŠSUB.L‚#1,D3 ŠBNE„BLNKF0ŠMOVEM.L(A7)+,A0/D3ŠRTSŠPAGE*O**********************************************************************************ˆALPHA1.007/3/80HBN6*O********************************************************************************>*ˆALPHACHECKSTHATPASSEDCHARACTERISANUPPERCASEALPHABET***ˆONENTRY:D0.B=CHARACTERTOBECHECKED*$*ˆONRETURN:ALLREGISTERSUNCHANGED*“Z=1IFALPHA *—0IFNOT* 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*********************************************************************************ˆALFNUM1.007/7/80HBN6*O********************************************************************************5*ˆALFNUMCHECKSTHATPASSEDCHARACTERISALPHANUMERIC***ˆONENTRY:D0.B=CHARACTERTOBECHECKED*"*ˆONRETURN:Z=1IFALPHANUMERIC *—0IFNOT*“ALLREGISTERSUNCHANGED* 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ƒ=ARGSCRATCH.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ƒ=ARGSCRATCH.LL=/ENDIF=/*=LINK ,SCRATCH.LO,\1;HAMIX ATTRIBUTES PSEG SEG0:0-14 $0INPUT SCRATCH.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééééýŠLIST ŠLLEN120<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************)*‰PROGRAMNAMEIS‚SCRATCH.DATA***,******ƒBLANKVOLUMENAMEDISKCOMMANDƒ******#*‰THISPROGRAMWILLZEROTHEVOLUME$*‰IDENTIFICATIONNAMEONSECTORZERO/*‰THEFORMATOPTIONWILLRESULTINTHEDISKETTE*‰BEINGREFORMATTED****** *‰REV1.00!*‰REGISTERSUSED:01234567*’D…********’A…****  *****=****************************************************************L*****************************************************************************‰SYSTEMFILESINCLUDED*‰FME*‰IOE*‰TR1M*****************************************************************************ŠNOLISTŠINCLUDE‚9995.&.FME.EQŠINCLUDE‚9995.&.IOE.EQŠINCLUDE‚9995.&.TR1.EQŠLIST ŠPAGE2****************************************************ˆ***ƒSCRATCH‚COMMAND*DATASEGMENT(DSEG)ƒ****1**************************************************ˆ****‚EQUATEAREA‚******* BEGDATAƒEQU„0#STKLEN„EQU„50‘STACKLENGTHINWORDS*COMMSIZE‚EQU„160INPUTCOMMANDBUFFERSIZE DSKLUI„EQU„1(DSKLUO„EQU„2’DISKLOGUNITASSIGNOUTPUT!LISTLU„EQU„3’LISTINGLOGICALUNITTSKNAM„EQUƒ'SCRA'ŽMYTASKNAMESECLEN„EQU„256SECTORLENGTH** ŠSECTION0!ŠXREFPARSE,OPTION,EDITFILE,SBARG**‰NEXTWORDBOUNDRYMACRO** NEXTWB„MACROŠNOLISTŠDS.W0ŠLISTŠENDM*SET_ADDR‚MACRO ŠPEA„\1(PC)ŠMOVE.L(A7)+,\2-PBA(A4)ŠENDM*2******************************************************†DATASEGMENT(DSEG)ƒ***1*************************************************;*************************************************************‰***ƒDATAAREA‚*****;*********************************************************** PBA‡EQU‡*STARDATA‚EQU‡* ;************************************************************‰REVISIONINFORMATION^MRW'Q/W7M?WGQO;*********************************************************** %ŠDC.Bƒ'122084'‹LASTMODIFICATIONDATE ŠDC.Bƒ''ŠDC.Bƒ'4'REVISIONNUMBER  ŠPAGE:***********************************************************‰USERSTACKAREA:********************************************************** ŠDS.WƒSTKLEN PROGSTKƒEQU*ŠDC.Lƒ0 8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++)*‰COMMLINISTHEAREATHECOMMANDLINEIS**‰READINTOWHENTHISPROGRAMISCALLEDIN8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++ ŠNEXTWB,COMMLINƒCOMLINECOMMSIZE‚***‚INPUTBUFFER‚**   :*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++7*‰EQUATESFORVERSION&REVISIONFORDISKINITALIZATION:*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ŠNEXTWBEVIDVNOƒDC.Bƒ'30'EVIDRNOƒDC.Bƒ'00'*<************************************************************* *‰BUFFERAREAFORI/OOPERATIONS**‰BUFFERSIZEIS2SECTORS<************************************************************ BUFFIO„EQU* ŠDS.BƒSECLENBUFFIOEƒEQU„*-1ENDOFBUFFER+ŠDS.Lƒ2’BUFFERCUSHION-MUSTFOLLOWBUFFER  ŠPAGE<************************************************************%*‰IOSPARAMENTERTABLEFORDISKWRITE*<************************************************************ ŠNEXTWB.ŠIOS.DSKIOREAD,IOPBLK+IOPRAN,DSKLUO,0,0,0,0,0 <*************************************************************!*‰FORMATDISKETTEPARAMETERBLOCK*<************************************************************ŠNEXTWB#ŠIOS.FORMIOFRMT,0,DSKLUO,0,0,0,0,0 <**************************************************************ŒIOSPARAMETERTABLE(*‰SETUPIOS(ERR0R-LOG)‚PARAMETERBLOCK*<************************************************************ ŠNEXTWB/ŠIOS.OUT6IOWRIT,IOPFOR+IOPWAT,LDFLUN,0,0,0,0,00ŠIOS.OUT6IIOWRIT,IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0ŠPAGE<*************************************************************8*‰FHSPARAMETERTABLEFORCHANGELOGICALUNITASSIGNMENT6*‰CHANGEISFROM6TO3--SENDSOURCEISLUAINMASK*‰ANDRECEIVEISLUBINMASK4*‰LU3ISUSEDF0RLISTINGANDLU6FORERR0R/LOGGING**3*‰PARAMETERTABLEFORCHANGLOGICALUNITASSIG! NMENT,*‰ISDIFFERENTFROMSTANDARDPARAMETERTABLE*%*************************************ŠNEXTWB LU3AFHSƒEQU*'ŠDC.WƒFHCHLUCOMMAND(CHANGELUASSIGN)ŠDC.WƒFOPKEPOPTIONKEEPASSIGNŠDC.Bƒ0’STATUSŠDC.BƒLDFLUNSENDLUNUMBERŠDC.BƒLISTLURECEIVELUNUMŠDC.Bƒ0’RESERVED-LU3ATIDƒDC.Lƒ0’TASK-ID(0MEANSUSEYOURSELF)(ŠDC.Lƒ0’SESSION#(0MEANSUSEYOURSELF)     *******************************************-*‰PARMBLOCKOUTPUTWITHINPUTFORDEVICEMSG*******************************************ŠNEXTWBŠIOS.INP6IOREAD,IOPFOR,CDFLUNŠIOS.INP4IOREAD,IOPFOR,CDFLUN %*‰FHSPARAMETERBLOCKFORDISKOUTPUT ŠNEXTWB OUTFHS„EQU*ŠDC.WƒFHASGNCOMMAND*ŠDC.WƒFOPEREWŒOPTIONS-EXCLUSIVEREAD/WRITEŠDC.Bƒ0’STATUSŠDC.BƒDSKLUOLOGICALUNITNUM!OUTVOL„DC.Lƒ$20202020ŠVOLUMENAMEŠDC.Wƒ0’USERNUMŠDC.Lƒ$20202020ŠCATNAMEŠDC.Lƒ$20202020ŠDC.Lƒ$20202020ŠFILENAMEŠDC.Lƒ$20202020ŠDC.Wƒ$2020ŽEXTENSION ŠDC.Wƒ0’*ŠDC.Bƒ0’WRITEPROTECTCODEŠDC.Bƒ0’READPROTECTCODEŠDC.Wƒ0’RECORDLENGTHŠDC.Lƒ0’CONTIGUOUSFILESIZE ŠDC.Lƒ0,0,0  7********************************************************,*‰PARAMETERTABLEFORFETCHDEVICENMENONICS*7******************************************************* ŠNEXTWBFETDEV„DC.WƒFHFDMNCMDŠDC.WƒFOPFRAOPTIONSŠDC.Wƒ0’STATUS&RESERVEDFETDEVIƒDC.Lƒ0’BUFFER********ŠDC.LƒSECLENBUFFERLENGTH****ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAMƒDC.Lƒ0’SAVETASKNAMESESNUM„DC.Lƒ0’SAVESESSIONNUM#VOLNAM„DC.Lƒ0’SAVEVOLDEFAULTNAMEŠDC.Wƒ0/USERNUMƒDC.Wƒ0’DEFAULTUSERNUM(16BITBINARY)*CATNAM„DC.Lƒ0,0SAVEDEFAULTCATAGORYNAMEREGD6…DC.Lƒ0’SAVEREG6 ŠDC.Lƒ0’REG7ADDREG„DS.Lƒ1’ADDRESSREG'SŠDS.Lƒ1ŠDC.Wƒ0’TOPHALFOFREG2ADDREG2ƒDC.Wƒ0’LOGONUSERNUMŠDS.Lƒ6’OTHERREGS ŠNEXTWBOKANS…DC.Bƒ'„'OKMSGANSWEROKANSE„EQU„*-1ŠDC.Bƒ''SPACEFORCR ŠNEXTWB'FORMANSƒDC.Bƒ'„'FORMATDISKETTEANSWERFORMANSE‚EQU„*-1ŠDC.Bƒ''SPACEFORCR ŠNEXTWB%OFLAG…DC.Lƒ0’ADDROFMOREOUTPUTSAVE(INFORN„DC.Bƒ0’DISKHASNOVOLNAMEONIT%FORMFLAG‚DC.Bƒ0’FORMATTDISKETTEFLAG ŠNEXTWB SAVOUT„DC.Lƒ05SAVEOPTƒDC.Lƒ0’SAVEOPTIONADDRESSPOINTERFROMPARSEŠPAGE.**********************************************"*‰STARTOFPRINTHEADERS&BUFFERS.********************************************** ŠNEXTWBERRMSGNƒDC.Wƒ'‚'*ŠNEXTWB* OKM‡EQU*ŠDC.Bƒ'OKTOSCRATCH(Y/N)ƒ'DEVM1…DC.Lƒ'„' ŠDC.Bƒ'?'OKMES…DC.Bƒ'ƒVOLUME'$VOLM1…DC.Lƒ'„'VOLUMENAMEGOESHERE ŠDC.Wƒ'?' OKME†DC.Bƒ''ŠNEXTWB* FORMSG„EQU„*/ŠDC.Bƒ'DOYOUWANTTOFORMATDISKETTE(Y/N)?‚'FORMSGEƒEQU„*-1ŠNEXTWB FORSMSGƒEQU*ŠDC.Bƒ'STARTFORMAT'FORSMSGE‚EQU„*-1ŠNEXTWB* ENDDATAƒEQU„* ŠPAGEJ****************************************************************************’ERRORMESSAGEPARAMETERBLOCK*J************************************************************************** ŠDS.Wƒ0EM_PBLK: -EM_D0…DC.Lƒ0‚D0-IOS/FHSRETURNERRORSTATUS*ª(ERRORMSGKEYVALUE)-EM_A0…DC.Lƒ0‚A0-ADDROFI/OPARAMETERBLOCKEM_OPT„DC.Bƒ0‚OPTIONSFLAG*­BIT‡MEANINGIFSET*®0ˆQUERYRESPONSEDESIRED+EM_TLUNƒDC.Bƒ0‚USERTERMINALLUN-(LDFLUN)$EM_QRC„DC.Bƒ0‚QUERYRETURNCHARACTER+EM_KLUNƒDC.Bƒ0‚USERKEYBOARDLUN-(CDFLUN)3EM_SPA„DC.Lƒ0‚STARTADDRESSFORUSERTEXTPLUGPOOL1EM_EPA„DC.Lƒ0‚ENDƒADDRESSFORUSERTEXTPLUGPOOLŠPAGE BEGPROGƒEQU**<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<**************************************************************6*ˆ***‚PROCEDURESECTIONFORINITDISKETTECOMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;***********************************************************    &***************************************.*ˆ**ƒSAVEDEFAULTVALUEPASSEDFROMSYSTEM****'*************************************** 5ŠLEA„PBA(PC),A7SAVECONTENTSOFA! LLREGISTERSBUTA7$ŠMOVEM.LD0-D7/A0-A7,STSKNAM-PBA(A7)1ŠLEA„PROGSTK(PC),A7‰LOADTHEPROGRAMBASEADDRESS,ŠLEA„PBA(PC),A4ANDSETUPTHESTACKPOINTER'***************************************+*‰D0TOSTSKNAM=TASKNAMETHATSTARTEDME*‰D1TOSESNUM‚=SESSIONNUM$*‰D2TOVOLNAM‚=DEFAULTVOLUMENAME*‰D3TOUSERNUM=USERNUMBER*‰D4TOCATNAM‚=CATALOGUENAME*‰D5TOCATNAM+4**‰D6=‚LENGTHOFCOMMANDLINE)*‰D7=BITMASKOFLOGICALUNITSASSIGNED*‰A0=YOURTASKNAME*‰A1=TERMINALID*‰A2=ACTUALUSERNUMBER(*‰A3=SYSTEMVOLUMEDEFAULE(ALLSPACES)*ˆA4=SYSTEMUSERNUMBER*ˆA5=SYSTEMCATALOGUE*ˆA6=SYSTEMCATPART2******„DRIVER‚BLOCK„****,*********************************************ˆATTACHTOCMDSPORTSEGEMENT,********************************************ŠSET_ADDRBUFFIO,FETDEVIŠSET_ADDRBUFFIO,DSKIOS+IOSSADŠSET_ADDRBUFFIOE,DSKIOS+IOSEAD ŠSET_ADDRFORMANS,INP6IOS+IOSSAD!ŠSET_ADDRFORMANSE,INP6IOS+IOSEADŠSET_ADDROKANS,INP4IOS+IOSSADŠSET_ADDROKANSE,INP4IOS+IOSEADŠPAGE#************************************&*‰*****CALLCOMMANDPARSEROUTINE‚****#************************************ /LBUFF…LEA„COMMLIN(PC),A0‰SAVEBUFFERSTARTADDR*ŠTST.L‚REGD6-PBA(A4)†ISCOMMANDLINEEMPTYŠBEQ„ERINVALŒERRORIFEMPTY* ŠBSR„PARSEŽGOTODISECTCMDLINEŠTST.L‚D0‘CKF0RANYERR0RSŠBMI„ERINVALŒBRIFERR0R*#ŠBTST.L#22,D0ISNULLINPUTBITONŠBNE„ERINVALŒBRIFSO -ŠBTST.L#6,D0ŽCHECHFOROPTIONSINCOMM.LINEŠBEQ„EROPTINV‹BRIFYES %ŠBTST.L#14,D0CHECKFOROUTPUTFIELDŠBEQ„ERINVALŒBRIFYES     * CKDR1„EQU***#‰BSR.SINITINGOTOINPUTINITROUT*-*********************************************#*‰CHECKFORFORMATMESSAGE&ANSWER*8ŠSET_ADDR‚FORMSG,OUT6IIOS+IOSSADƒ*POINTTOSTARTOFMSG7ŠSET_ADDR‚FORMSGE,OUT6IIOS+IOSEAD‚*POINTTOENDOFMSG  "ŠIOSCALLOUT6IIOS(PC)†SENDMESSAGEŠBNE„FATALERR‹ERROR**‰RECEIVEANSWER $ŠIOSCALLINP6IOS(PC)‡RECIEVEMESSAGEŠBNE„FATALERR‹ERROR ŠBSR„SBARG ŠBMI„FATALERR*.**********************************************+ŠCMP.B‚#'Y',FORMANS-PBA(A4)†ISANSWERYES?ŠBNE.SCKDR0–BRIFNO+ŠMOVE.B#1,FORMFLAG-PBA(A4)‡SETFORMATFLAG CKDR0…EQU****"ŠBSR„SETLU3ASSIGNLU3TOTERMINAL-CKFORM„TST.B‚FORMFLAG-PBA(A4)ƒFORMATFLAGSETŠBEQ.S‚DOINITNO ŠBSR„DOFORM*ŠPAGE8**********************************************************“GOTOINITDISKROUTINE*2***************************************************.DOINIT„BSR„INITDSKŒGOTOINITALIZATIONROUTINE* *‰STOPTHEPROGRAMATTHISPOINT STOPIT„EQU*4ŠMOVE.W#FHCLOS,OUTFHS-PBA(A4)ƒCLOSECOMMANDTOPARMŠFHSCALLOUTFHS(PC)ŠBNE„FATALERR‹ERROR** ŠERQ.TERMŠPAGE/************************************************$*ˆ**‚INITALIZATIONOFINPUTDISK‚***3*ˆ***‚SETUPFHSPARMBLOCKBASEDONCMDLINEINPUT1*ˆTHISROUTINEWILLDOASSIGNANDATTRIBUTECALLS*/************************************************ INITIN EQU *"ŠLEA„OUTFHS(PC),A6ŠINITPARMBLOCK-ŠLEA„COMMLIN(PC),A0‰INITCOMMANDLINEPOINTER*'*****************************************ˆCALLEDITFILEFORINPUT**ˆ**ƒCALLEDITFILEROUTINE***ˆA0=INPUTCOMMANDSTART*ˆA6=ADDROFPARMBLOCK*&***************************************!ŠBSR„EDITFILE‹MAKEEDITFILECALLŠBMI„ERINVALŒBRAIFERROR*ŠBTSTƒ#1,D0ŽCKFORDEVICEŠBEQ.S‚INASGNNOŠCLR.L‚D0‘SETDEVICEFLAG*INASGN„MOVE.LOUTVOL-PBA(A4),D4ŠBSR.S‚CKTABŽGOTODEVROUTINE*(*****************************************‰ASSIGNINPUTVOLUMEORDEVICE+********************************************ŠFHSCALLOUTFHS(PC)ŠBNE„FATALERR‹ERROR*-**********************************************‰OKTOINITIALIZEMSG&ANSWER-**********************************************&ŠCMP.L‚#'„',VOLM1-PBA(A4)„VOLINMSG?ŠBNE.S‚INIT1”YES9‰SET_ADDROKMES,OUT6IIOS+IOSEADƒPOINTTOENDOFSHORTMSGŠBRA.S‚INIT2”CONTINUE INIT1…EQU*7‰SET_ADD" ROKME,OUT6IIOS+IOSEAD„POINTTOENDOFLONGMSGŠMOVE.B#'',OKMES-1-PBA(A4) INIT2…EQU*6‰SET_ADDROKM,OUT6IIOS+IOSSAD…POINTTOBEGININGOFMSG ŠIOSCALLOUT6IIOS(PC)ŒPRINTMSG ŠBNE„FATALERR*$ŠIOSCALLINP4IOS(PC)CALLFORANSWERŠBNE„FATALERR‘BRIFERROR ŠBSR„SBARGŠBMI„FATALERR‘BRIFERROR&ŠCMP.B‚#'Y',OKANS-PBA(A4)‡ANSWERYES?ŠBNE„STOPIT“ABORT*INEXITƒRTSžRETURN‰PAGE6*******************************************************&*ˆROUTINETODOFETCHDEVICEMNEMONICS *ˆANDGETVOLUMENAMEIFPRESENT7*ˆD4CONTAINSTHEDEVICEBEINGCHECKEDFORINTHETABLE*5****************************************************** CKTAB…EQU*-ŠLEA„FETDEV(PC),A0ŠINITPOINTERTOPARMBLOCK)ŠLEA„BUFFIO(PC),A1ŠINITPOINTERTOBUFFERŠMOVE.LD0,D2ŽINITDEVICEFLAG*ŠFHSCALLFETDEV(PC)ˆGETTABLEŠBNE„FATALERR‹ERROR'ŠMOVE.WFHSLEN(A0),D1†SAVE#OFENTRIES* CKTAB2„EQU*ŠTST.L‚D2‘ISTHISADEVICEŠBEQ.S‚CKTAB3YES*‰PROCESSVOLUME$ŠCMP.L‚FDVVOL(A1),D4†CKFORVOLNAMEŠBEQ.S‚CKTABVYES ŠBRA.S‚CKTAB4 CKTAB3„EQU*"ŠCMP.L‚FDVDEV(A1),D4†CKFORDEVICEŠBEQ.S‚CKTABFFOUND CKTAB4„EQU*ŠSUB.W‚#1,D1ŽREDUCECOUNT/ŠBLE.L‚ERDEVICE‹BRIFDEVICENOTFOUNDINTABLEŠADD.L‚#FDVLEN,A1‰ADDSIZE ŠBRA„CKTAB2* CKTABF„EQU*+ŠMOVE.LD4,DEVM1-PBA(A4)MOVEDEVICETOMSG(ŠCMP.L‚#0,FDVVOL(A1)CKFORFOREIGNDISKŠBEQ.S‚CKTABN—YES0ŠMOVE.LFDVVOL(A1),VOLM1-PBA(A4)…MOVEVOLTOMSG;ŠMOVE.LVOLM1-PBA(A4),OUTVOL-PBA(A4)‰MOVEVOLTOPARMTABLEŠBRA.S‚CKTABEX–EXIT CKTABN„EQU*,ŠMOVE.B#1,INFORN-PBA(A4)ŒINPUTFOREIGNDISKŠBRA.S‚CKTABEX*3CKTABV„MOVE.LD4,VOLM1-PBA(A4)MOVEVOLNAMETOMSG3ŠMOVE.LFDVDEV(A1),DEVM1-PBA(A4)…MOVEDEVICETOMSG*CKTABEXƒRTS¡RETURN*ŠPAGE-**********************************************.*‰ROUTINETOASSIGNLOGICALUNIT3TOTERMINAL+*‰BYSETTINGITUPTHESAMEASLU6WHICHIS"*‰ALREADYASSIGNEDTOTHETERMINAL*.*********************************************** SETLU3„EQU*ŠLEA„LU3AFHS(PC),A0‰INITADDR ŠFHSCALL(A0)*‰RETURNFROMFHSCALLŠBNE.S‚FATALERR‹BADRETURN ŠRTS—RETURN*‰PAGE2****************************************************ˆROUTINETOINITALIZEDISK*2*************************************************** INITDSKƒEQU**ŠIOSCALLDSKIOS(PC)READSECTORŠBNE.S‚FATALERR’ERROR+ŠMOVE.W#IOWRIT,DSKIOS-PBA(A4)„SETTOWRITEŠCLR.L‚BUFFIO-PBA(A4)*.************************************************ˆDOWRITETOOUTPUTFILE*.***********************************************IOSWRITE‚IOSCALLDSKIOS(PC)ŠBNE.S‚FATALERR‹ERRORŠRTS 7********************************************************4*ˆROUTINETOSETUPANDCALLDISKETTEFORMATROUTINE*7******************************************************** DOFORM„EQU*6ŠSET_ADDRFORSMSG,OUT6IOS+IOSSADƒ*POINTTOBEGOFMSG7ŠSET_ADDRFORSMSGE,OUT6IOS+IOSEAD‚*POINTTOENDOFMSGŠIOSCALLOUT6IOS(PC)*SENDMSG*(ŠIOSCALLFORMIOS(PC)‡CALLTOFORMATDISKŠBEQ.S‚FORMEXIT‹GOOD#*‰MOVE.L#'FORM',IOERR†MOVEMESSAGE*‰MOVE.W#'AT',IOERR+2ŠBRA.S‚FATALERR‹GOTOERRORRT***FORMEXIT‚RTS˜RETURN**ŠPAGEJ***************************************************************************+*‰ERRORMESSAGESFROMERRORMESSAGEHANDLER*J*************************************************************************** ERDEVICE:<ŠMOVE.L#EM_NVDEV,D0‹'INVALIDDEVICENAMEFORREQUEST'ERRORŠBRA.S‚FATALERR *INVAL:7ŠMOVE.L„#EM_NVE,D0Š'INVALIDENTRY'MESSAGE,BUTRETURN!ŠBSR.S…C_EM_PGMŠRTS* EROPTINV:*ŠMOVE.L„#EM_NVO,D0Š'INVALIDOPTION'ERROR.ŠBRA.S…FATALERR* EROPTCON:-ŠMOVE.L„#EM_OPTCF,D0ˆ'OPTIONCONFLICT'ERROR.ŠBRA.S…FATALERR*ERINVAL:)ŠMOVE.L„#EM_NVE,D0Š'INVALIDENTRY'ERROR.***J***************************************************************************2*ˆROUTINETOCALLERRORMESSAGEHANDLER,THENDIE.*J**************************************************************" ************* FATALERR:‰BSR.S…C_EM_PGM2ERREXIT‚ERQ.TERM‚#0,#$C000‹EXITWITHERRORSTATUS.***M****************************************************************************** *’CALLTOERRORMESSAGEHANDLER.*’OUTPUTGOESTOLU6.**‰CALLƒBSRC_EM_PGM*A*‰INPUTS„D0ANDA0SETBYIOSORFHSCALL,ORD0FORNONIOS/FHS.*"*ˆOUTPUTSƒNOREGISTERPRESERVATION*N******************************************************************************* C_EM_PGM:C‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A4)ƒSAVED0,A0INERRORMSGPARAMBLOCK.4‰LEA‡EM_PBLK(PC),A0ŽPOINTA0TOTHEPARAMETERBLOCK.:‰MOVE.B„#6,EM_TLUN-EM_PBLK(A0)‚SETTHELUFOROUTPUTTO6. ‰MOVE.L„#2,D0‰TRAP†#4‰RTS*‰PAGE.***********************************************%*ˆCONVERTBINARYTOHEXASCIIROUTINE*(*ˆRIGHTJUSTIFY&BLANKFILLONTHELEFT,*ˆTHELEASTSIGNIFICANTDIGITISNOTBLANKED* *ˆD0=HEXVALUETOBECONVERTED *ˆD1=LENGTHOFRECEIVINGFIELD7*ˆA0=ADDRESSOFLEFTMOSTPOSITIONOFRECEIVINGFIELD* *ˆREGISTERSUSED‚01234567 *’A…*** *’D…**ƒ*.*********************************************** BINHEX„EQU*ŠLEA„BINASC(PC),A1†INITADDRŠLEA„0(A0,D1),A2ˆENDLOCATION*BINLOP„MOVE.BD0,D3ŽGETBYTE%ŠASR.L‚#4,D0ŽSHIFTOFFLASTHEXVALUE!ŠAND.L‚#$F,D3MASKOFFOTHERBITS2ŠMOVE.B0(A1,D3),-(A2)…MOVEFROMTABLETORECAREAŠCMP.L‚A2,A0ŽAREWEDONEŠBLT„BINLOPNO*ŠCMP.W‚#1,D1ŽONLYONECHARŠBEQ.S‚BINOUTYES*‰DOZEROSUPPRESSION*ŠLEA„0(A0,D1),A2ˆINITENDLOCŠSUB.L‚#1,A2ŽFIXENDLOC!BINSP…CMP.B‚#'0',(A0)ŠASCIIZERO?ŠBNE.S‚BINOUTNOGETOUT%ŠMOVE.B#'',(A0)+‰REPLACEWITHBLANKŠCMP.L‚A0,A2ŽAREWEDONE ŠBGT„BINSPŽNO**BINOUT„RTS—RETURN(BINASC„DC.B‚'0123456789ABCDEF'‚HEXTABLEŠ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ƒ=ARGSESSIONS.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ƒ=ARGSESSIONS.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*ˆSESSIONSUTILITYDISPLAYSTHESESSIONSINPROGRESS**ˆHBR8*O******************************************************************************* PAGE***ˆSESSIONSMODIFICATIONHISTORY**ˆREVISIONCODE1102824*#*ˆPLACEDEVERYTHINGUNDERSECTION0 *ˆMADECODEPOSITIONINDEPENDENT**‰PAGE***ˆINCLUDESTATEMENTS**ˆINCLUDEƒ9995.&.IOE.EQ*‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰LIST‰PAGE ‰SECTION0‰XDEFSESSIONS ‰XREFBDCONV PBA†EQU‡**œPROGRAMBASEADDRESS‰DC.B'1220844'‰DS.B32 STACK„EQU*$ATSEGPAR DC.L 0,0,$20001000,'.STT',0WRITEPAR DC.W 2,0,6,0 ‰DC.L0,0,0,0SEGBUFF‚DS.B18WRITEH1‚DC.W2,0,6,0 ‰DC.L0,0,0,0WRITEH2‚DC.W2,0,6,0 ‰DC.L0,0,0,0 PAGE* *ˆINITIALIZE* SESSIONS:‰LEA‡PBA(PC),A6*œA6=PROGRAMBASEADDRESS‰LEA‡SEGBUFF(PC),A0"‰MOVE.L„A0,WRITEPAR-PBA+IOSSAD(A6)‰LEA‡SEGBUFF+9(PC),A0"‰MOVE.L„A0,WRITEPAR-PBA+IOSEAD(A6)3*œSETSTART/ENDADDRESSINWRITEPARPARAMETERBLOCK‰LEA‡HEAD1(PC),A0!‰MOVE.L„A0,WRITEH1-PBA+IOSSAD(A6)‰LEA‡HEAD1E(PC),A0!‰MOVE.L„A0,WRITEH1-PBA+IOSEAD(A6)2*œSETSTART/ENDADDRESSINWRITEH1PARAMETERBLOCK ‰LEA‡HEAD2(PC),A0!‰MOVE.L„A0,WRITEH2-PBA+IOSSAD(A6)‰LEA‡HEAD2E(PC),A0!‰MOVE.L„A0,WRITEH2-PBA+IOSEAD(A6)2*œSETSTART/ENDADDRESSINWRITEH2PARAMETERBLOCK*‰LEASTACK(PC),A7INITIALIZESTACKPOINTER 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 IDMOVE.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',D0FORCELEADINGZERODIGITS LEA SEGBUFF(PC),A5 PUT ADDRESS MOVE.L D0,(A5)+ PUT USER NO. MOVE.W#'‚',(A5)+PUTSEPARATOR" 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ƒ=ARGSGSYMBL.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ƒ=ARGSGSYMBL.LL=/ENDIF=/*=LINK ,SGSYMBL.LO,\1;HAMIX ATTRIBUTES PSEG SEG1:0,14 $0INPUT SGSYMBL.ROLIB 0.&.UTILIB.ROEND=/*=ENDééé$ éééƒ$SGSYMBLƒIDNTƒ1,0Sysgensymboltable*ŠTTL„SysgensymboltablelistinggeneratorO********************************************************************************Í* *¡SGSYMBL¥**Í*O********************************************************************************N* SGSYMBL is used to create a cross reference listing file of the symbols usedK*atsysgentime.‚TheprogramwillproducealistingwhichwillcontaintheO* 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*andthefile(s)thatthesymbolisreferencedfrom.‚Thesymbolswillbe* listed in alphabetical order.*ŠSPC„5**‰ModificationHistoryO*------------------------------------------------------------------------------*12/10/84‡KEGInitialwriting*ŠSPC„5*$*‰Copyrighted1984byMotorola,Inc.*ŠPAGEO********************************************************************************Í**˜INTRODUCTIONž**Í*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’Maximumlengthofparametername%VALLEN„EQU„30‘Maximumlengthofvalue* ŠOFFSET0 PARAM…DS.BƒPARLENParameternameVALUE…DS.BƒVALLENValuePLEN†DS.Bƒ1’ParameterlengthVLEN†DS.Bƒ1’ValuelengthPFLAG…DS.Wƒ1’Flagword+SYMLEN„EQU„*’LengthofasymboltableentryŠPAGEK*Theinputfileforthisprogramismadeupofkeyedrecords.‚ThekeysareJ*usedtodeterminethetypeofrecord.‚Thereare4typesofkeyedrecords* in this file.*L*1stistherecordsthatstartwiththenumberPREDEF(0000).‚TheserecordsF*…containthesymbolsthatarepredefinedbySYSGEN.‚Theserecordsare Œ6•'>¥B­;µD½RÅLÍ@Õ3Ý0å@í1õ<ý:? :8@%G-S5\=IEG*…ofthesizeTYPESIZE+SYMLEN.‚Anexamplerecordwouldappearasbelow./*…PREDEF,'$DATEƒ','850110˜',$05,$06,$30,$30,$00J*…000024444154202020203835303131302020202020202020202020202020202020202020*…2020200506303000*N*2ndistherecordsthatstartwiththenumberSYMVALUE(0001).‚TheserecordsC*…containthesymbolsandtheirvaluethataredefinedbytheuser.H*…TheserecordsareofthesizeTYPESIZE+SYMLEN.‚Anexamplerecordwould*…appearasbelow.2*…SYMVALUE,'LABEL1‚','$123456—',$06,$07,$21,$81,00J*…00014C4142454C3120202431323334353620202020202020202020202020202020202020*…2020200607218100*M*3rdistherecordsthatstartwiththenumberDEFINED(0002).‚TheserecordsH*…containthesymbolsalongwiththenameofthefilethatdefined% them.E*…TheserecordsareofthesizeTYPESIZE+PARLEN+18.‚Anexamplerecord*…wouldappearasbelow.*…DEFINED,'LABEL1‚','ˆFILE1ƒSA'**…00024C4142454C31202046494C45312020205341*N*4thistherecordsthatstartwiththenumberREFERENC(0003).‚TheserecordsK*…containthesymbolsalongwiththenameofthefilethatreferencedthem.E*…TheserecordsareofthesizeTYPESIZE+PARLEN+18.‚Anexamplerecord*…wouldappearasbelow. *…REFERENC,'LABEL1‚','ˆFILE2ƒSA'**…00034C4142454C31202046494C45322020205341*K*TheoutputfromthisprogramwillgointothefileSYMBOLS.LS.‚TheoutputI* 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)thatthesymbolisreferencedin.‚ThehexvaluewillbepreceededbyI*a"$"signandthedecimalvalueswillbepreceededbyan"&"sign.‚TheK*filesintheNULLcatalogwillberepresentedbyan"&"signalso.‚IftheM* 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*thisfile.‚Example-&.FILE1.SA[4]meansthatthelabelwasreference4* times in this file.*ŠPAGEO********************************************************************************Í** MACRO'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**‰NextWordBoundaryMACRO* NEXTWB„MACRO.ŠDS.Wƒ0’ThisisusedtoforceanevenboundaryŠENDMŠSPC„3**‰IOSoutputMACRO*2OUTPUT„MACRO‚.’ThisMACROisusedtooutputtotheŠLEA„\1,A0ŽCRT.@ŠMOVE.LA0,IOSSAD+\3-PBA(A6)Setthestartingaddressofmessage ŠLEA„\2,A0>ŠMOVE.LA0,IOSEAD+\3-PBA(A6)SettheendingƒaddressofmessageŠIOSCALL\3-PBA(A6)ŠENDMŠPAGEO********************************************************************************Í**ŸOPTIONS¡**Í*O********************************************************************************L* This section contains some options that tell the assembler what we want itL*todo.‚Theoptionsmustoccurbeforeanycode-affectingorcode-generatingL* statements because the options tell the assembler how to assemble the rest* of the program. ŠOPT„A+*£WeusetheAoptionsotheassemblerwill,*£forceabsoluteaddressing.‚Allnon-indexed+*£operandswhichreferenceeitherlabelsor,*£thecurrentassemblerlocationcounter(*))*£willberesolvedasabsoluteaddresses.ŠPAGEO********************************************************************************Í**žEQUATES¢**Í*O********************************************************************************L* This section contains some miscellaneous equates to define labels that areM*areusefulforthecodeintheSGSYMBLutility.‚Theequatesinthissection<* are presented in alphabetical order for ease of reference.**‰INCLUDE9995.&.EXE.EQ*‰INCLUDE9995.&.IOE.EQ**‰INCLUDE9995.&.TR1.EQ…Trap1equatefile*ŠNOLISTŠINCLUDE9995.&.EXE.EQŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.TR1.EQŠLIST8BUFSIZEƒEQU„132Thisisthebuffertocontaintherecord**£thatwillbewrittentotheoutputfile. 7CODE_SECTIONEQU0’Thislabeldefinesthenumberofthe(*£programsectionthatcontainscodeand *£constants. CRˆEQU„$0DCarriagereturn 7DATA_SECTIONEQU0’Thislabeldefinesthenumberofthe*£sectionthatcontainsdata. ;DEFINEDƒEQU„$0002ŽThisisthevaluethatstartseachrecord)*£intheinputfilethatmeanstherecord)*£containsthesymbolalongwiththefile*£thatdefinedthesymbol. 8DONE†EQU„$FFThislabelisusedtodefineifwearedone*£withthelabelornot. 9EMPTY…EQU„$FFThislabelisusedtodefinethatthereare,*£nocharactersinthebuffertobeprinted. 1HEX‡% EQU„$FFThislabelisusedtodefinethatthe#*£VALUTYPEisahexidecimalnumber. LFˆEQU„$0ALinefeed LSLUN…EQU„2’LUforlistingfile ;MESSAGES_SECTIONEQU„0‹Thislabeldefinesthenumberofthe-*£messagessectionthatcontainsthemessages*£forthisutility. :NOTDONEƒEQU„$00Thislabelisusedtodefineifwearenot*£donewiththelabelornot. :NOTEMPTY‚EQU„$00Thislabeldefinesthatthebufferisnot**£empty.‚Therearecontentstobeprinted. 4NOTHEX„EQU„$00Thislabelisusedtodefinethatthe'*£VALUTYPEisnotahexidecimalnumber. 9NOTSAMEƒEQU„$00Thislabeldefinesthatthefilenamesare *£thesame. :PREDEF„EQU„$0000ŽThisisthevaluethatstartseachrecord)*£intheinputfilethatmeanstherecord**£containsthesymbolalongwiththevalue)*£ofthatsymbol.‚Therecordsaresymbols!*£thatwerepredefinedbySYSGEN. *‰ParameterBlockusedforoutputtingtothesymboltablefile*SYMIOS0ŠDC.WƒIOWRITRequestcode/FunctionspecificationŠDC.Wƒ0’OptionsŠDC.Bƒ0’StatusŠDC.BƒLSLUNŽLogicalunitnumberŠDC.Wƒ0’ReservedŠDC.Lƒ0’RandomrecordnumberŠDC.Lƒ0’StartaddressŠDC.Lƒ0’EndaddressŠDC.Lƒ0’LengthofdatatransferŠDC.Lƒ0’Completionaddress *6*‰ParameterBlockusedforreadingfromtheinputfile*IOSIN0ŠDC.WƒIOREADRequestcode/FunctionspecificationŠDC.WƒIOPRAN+IOPRTK†OptionsŠDC.Bƒ0’StatusŠDC.BƒSYLUNŽLogicalunitnumberŠDC.Wƒ0’ReservedŠDC.Lƒ0’RandomrecordnumberŠDC.Lƒ0’StartaddressŠDC.Lƒ0’EndaddressŠDC.Lƒ0’LengthofdatatransferŠDC.Lƒ0’Completionaddress *6*‰ParameterBlockusedforassigningtotheinputfileSYMFHS!ŠDC.WƒFHASGNCommandcode/CommandŠDC.WƒFOPISK+FOPPR‡OptionsŠDC.Bƒ0’StatusŠDC.BƒSYLUNŽLUNŠDC.Bƒ'„'VolumeIDŠDC.Wƒ0’UsernumberŠDC.Bƒ'ˆ'‰CatalognameŠDC.Bƒ'SGSYMS‚'‰FilenameŠDC.Bƒ'SY'ExtensionŠDC.Wƒ0’ReservedŠDC.Bƒ0,0Writecode/ReadcodeŠDC.Wƒ0’Recordlength ŠDC.Lƒ0’Size *9*‰ParameterBlockusedtoas& signoutputsymboltablefile*SLSFHS!ŠDC.WƒFHDELTCommandcode/CommandŠDC.WƒFOPSEQ+FOPEREW…OptionsŠDC.Bƒ0’StatusŠDC.BƒLSLUNŽLUNŠDC.Bƒ'„'VolumeIDŠDC.Wƒ0’UsernumberŠDC.Bƒ'ˆ'‰CatalognameŠDC.Bƒ'SYMBOLS'‰FilenameŠDC.Bƒ'LS'ExtensionŠDC.Wƒ0’ReservedŠDC.Bƒ0,0Writecode/ReadcodeŠDC.Wƒ0’Recordlength ŠDC.Lƒ0’SizeŠPAGEO********************************************************************************Í**MESSAGES¡**Í*O******************************************************************************* ŠSECTIONMESSAGES_SECTION,*£ThisSECTIONdirectivetellstheassembler-*£thatwearenowassemblingcodethatshould$*£bekepttogetherforthemessages. (PROC†DC.WƒCR,'Processingsymbolnumber‚'PROCNUMƒDC.Lƒ0,0,0,0 PROCE…EQU„*-1*TOTSYM„DC.WƒCR,'Totalnumberofsymbols='TOTSYMEƒEQU„*-1TOTSYMLƒEQU„*-TOTSYM-2#SGNPER„DC.Wƒ'SYSGENwasperformed'2SGNDATEƒDC.Wƒ'XX/XX/XX'ˆDatesysgenwasperformed1SGNTIMEƒDC.Wƒ'XX:XX:00'‰Timesysgenwasperformed**£The0'sarebecauseSYSGENdoesnotsave(*£thesecondsvalueinthesymboltable.SGNPEREƒEQU„*-1HEAD1…DC.Wƒ'ŠValue†Value‰Value'HEAD1E„EQU„*-1,HEAD2…DC.Wƒ'Symbol„(hex)†(decimal)…(ASCII)'(ŠDC.Wƒ'ASCIIstring”Definedinfile(s)„'ŠDC.Wƒ'Referencedinfile(s)'HEAD2E„EQU„*-14HEAD3…DC.Wƒ'--------‚---------‚------------‚------‚'<ŠDC.Wƒ'------------------------------‚--------------------‚'ŠDC.Wƒ'--------------------'HEAD3E„EQU„*-1BLANK…DC.Wƒ$200DBLANKE„EQU„*-1ŠPAGEO********************************************************************************Í**›PROGRAMƒCODE›**Í*O******************************************************************************* ŠSECTIONCODE_SECTION,*£ThisSECTIONdirectivetellstheassembler-*£thatwearenowassemblingcodethatshould*£bekepttogetherforcode. 7SGSYMBLƒEQU„*’ThisiswheretheSGSYMBLutilitybegins. /ŠLEA„PBA(PC),A7‰A7=ProgramBaseAddress(PBA)EŠMOVEM.LD0-D7/A0-A7,TASKNAME-PBA(A7)Savetheregistersatthestart*£oftheprogramsexecution.*,*D0toTASKNAME=Tasknamethatstartedme*D1toSESNUMƒ=Sessionnumber%*D2toVOLNAME‚=Defaultvolumename*D3toUSERNUM‚=Usernumber*D4toCATNAME‚=Catalogname*D5toCATNAME+4(*D6toLINELEN‚=Lengthofcommandline2*D7toREGD7„=Bitmaskoflogicalunitsassigned**A0=Yourtaskname*A1=TerminalID*A2=Actualusernumber)*A3=Systemvolumedefault(allspaces)*A4=Systemusernumber*A5=Systemcatalog*A6=Systemcatalogpart2*A7=*&ŠMOVE.LA7,A6ŽLoadA6withPBAfromA7)*£ThisiswhereweinitializeA6withthe)*£beginningofthisutility.‚Thiswillbe)*£usedasthebaseaddresstouseoffsets,*£fromtogettootherareasofthisprogram%*£sotomaketheprogramrelocatable.9ŠLEA„STACK-PBA(A6),A7ƒLoadthestackpointerwithourown *£stackarea.*,*£Requestthesystemtogivemethedateand*£time.*EŠERQ.GTDTIMTIMEBLK-PBA(A6)TheGTDTIMdirectivewilltellthesystem**£thatwewantthedateandtime.‚Thedate-*£willbestoredatTIMEBLKandthetimewill*£bestoredatTIMEBLK+4.1**************************************************¯*-*ƒConvertDateandstoreinversionmessageƒ**¯*1*************************************************2ŠMOVE.LTIMEBLK-PBA(A6),D0Getthedatetoconvert&ŠBSR„ODATCONV‹ConvertOrdinaltoASCII:ŠMOVE.WD0,VDATE-PBA(A6)ƒSavetheASCIIvalueoftheMonth2ŠSWAPƒD0‘MovetheDaytothelowerwordofreg.D0?ŠMOVE.BD0,VDATE+4-PBA(A6)Savetheleastsig.digitoftheDay-ŠLSR.W‚#8,D0ŽMovethemostsig.digittoD0.B>ŠMOVE.BD0,VDATE+3-PBA(A6)Savethemostsig.digitoftheDay5ŠMOVE.WD1,VDATE+6-PBA(A6)SavethevalueoftheYear$ŠIF.BƒVDATE-PBA(A6)#$00THEN.S5ŒMOVE.B#$30,VDATE-PBA(A6)SetthedigittoASCII'0'ŠENDI&ŠIF.BƒVDATE+3-PBA(A6)#$00THEN.S7ŒMOVE.B#$30,VDATE+3-PBA(A6)SetthedigittoASCII'0'ŠENDI1**************************************************¯*-*ƒConvert' Timeandstoreinversionmessageƒ**¯*1*************************************************4ŠMOVE.LTIMEBLK+4-PBA(A6),D0Getthetimetoconvert*ŠBSR„TIMECONV‹ConvertbinarytimetoASCII'ŠMOVE.WD0,VTIME-PBA(A6)ƒSavetheHours2ŠSWAPƒD0‘Movetheminutestolowerwordofreg.D0CŠMOVE.BD0,VTIME+4-PBA(A6)Savetheleastsig.digitoftheMinutes-ŠLSR.W‚#8,D0ŽMovethemostsig.digittoD0.BBŠMOVE.BD0,VTIME+3-PBA(A6)Savethemostsig.digitoftheMinutes8ŠMOVE.WD1,VTIME+6-PBA(A6)SavethevalueoftheSeconds$ŠIF.BƒVTIME-PBA(A6)#$00THEN.S5ŒMOVE.B#$30,VTIME-PBA(A6)SetthedigittoASCII'0'ŠENDI&ŠIF.BƒVTIME+3-PBA(A6)#$00THEN.S7ŒMOVE.B#$30,VTIME+3-PBA(A6)SetthedigittoASCII'0'ŠENDI&ŠIF.BƒVTIME+6-PBA(A6)#$00THEN.S7ŒMOVE.B#$30,VTIME+6-PBA(A6)SetthedigittoASCII'0'ŠENDI *,*£Writetheversionnumbertothelogdevice*£toidentifyourselves.*EŠOUTPUTBLANK-PBA(A6),BLANKE-PBA(A6),OUTIOSWriteablanklinetologŠBNE„IOERRŽdeviceDŠOUTPUTVERSION-PBA(A6),VEND-PBA(A6),OUTIOSWritetheheadingtologŠBNE„IOERRŽdeviceEŠOUTPUTBLANK-PBA(A6),BLANKE-PBA(A6),OUTIOSWriteablanklinetologŠBNE„IOERRŽdevice *&*£Assigntheinputfilesothatwecan)*£readfromittogetalltheinformation *£needed.*BŠLEA„SYMFHS-PBA(A6),A0‚Gettheaddressoftheparameterblockused*£fortheinputfile.CŠMOVE.LVOLNAME-PBA(A6),FHSVOL(A0)SettheuserdefaultvolumenameCŠMOVE.LUSERNUM-PBA(A6),FHSUSN(A0)SettheuserdefaultusernumberCŠMOVE.LCATNAME-PBA(A6),FHSCLG(A0)Settheuserdefaultcatalog1st/ŠMOVE.LCATNAME+4-PBA(A6),FHSCLG+4(A0)2ndhalfŠFHSCALL(A0)ŽAssigninputfileŠBNE„IOERRŽBranchifanyerrors *-*£AllocateandAssigntheoutputlistingfile*BŠLEA„SLSFHS-PBA(A6),A0‚Gettheaddressoftheparameterblockused*£fortheoutputlistingfile.CŠMOVE.LVOLNAME-PBA(A6),FHSVOL(A0)SettheuserdefaultvolumenameCŠMOVE.LUSERNUM-PBA(A6),FHSUSN(A0)SettheuserdefaultusernumberCŠMOVE.LCATNAME-PBA(A6),FHSCLG(A0)Settheuserdefaultcatalog1st/ŠMOVE.LCATNAME+4-PBA(A6),FHSCLG+4(A0)2ndhalf(ŠFHSCALL(A0)ŽDeleteoutputlistingfileBŠMOVE.W#FHALLO+FHASGN,FHSCMD(A0)Getreadytoallocateandassign*£outputlistingfile5ŠFHSCALL(A0)ŽAllocateandAssignoutputlistingfileŠBNE„IOERRŽBranchifanyerrors *#*£Startreadingfromtheinputfile*@ŠLEA„IOSIN-PBA(A6),A0ƒGettheaddressoftheinputparameterblkAŠLEA„FENTRY-PBA(A6),A1‚Gettheaddressofthebufferusedtohold&*£therecordreadfromtheinputfile.>ŠMOVE.LA1,IOSSAD(A0)†SavethisaddressintheparameterblockBŠLEA„FENTRY+TYPESIZE+SYMLEN-1-PBA(A6),A1Gettheendingaddressof*£wherewewillbereadinginto>ŠMOVE.LA1,IOSEAD(A0)†SavethisaddressintheparameterblockDŠMOVE.W#IOPRAN+IOPRTK,IOSOPT(A0)DoI/ObyRandomRecordNumberand+*£byreturningthekeywiththerecordread *+*£Gointoaloopreadingallthepredefined**£symbolsofsysgenuntilwereadarecord,*£thatstartswiththetypeSYMVALUE(0001).-*£Oncewefindthe$DATElabelthensavethis)*£valueintothemessageusedtoshowthe%*£datethatthesysgenwasperformed.-*£Oncewefindthe$TIMElabelthensavethis)*£valueintothemessageusedtoshowthe%*£timethatthesysgenwasperformed.*ŠREPEAT;ŒMOVE.LLABELRRN-PBA(A6),IOSRRN(A0)SavetheRRNintheIOS*£parameterblock.ŒIOSCALL(A0)ŒReadarecordin.ŒBNE„IOERRŒBranchifanyerrors***£Ifthislabelstartswith'$DAT'thenit)*£mustbe'$DATE'sosavethedateinthe%*£messagetoshowwhenthesysgenwas *£performed.*1ŒIF.LFENTRY+TYPESIZE-PBA(A6)#'$DAT'THEN.S8ŽMOVE.WFENTRY+TYPESIZE+PARLEN-PBA(A6),SGNDATE+6-PBA(A6)8ŽMOVE.WFENTRY+TYPESIZE+PARLEN+2-PBA(A6),SGNDATE-PBA(A6):ŽMOVE.BFENTRY+TYPESIZE+PARLEN+4-PBA(A6),SGNDATE+3-PBA(A6):ŽMOVE.BFENTRY+TYPESIZE+PARLEN+5-PBA(A6),SGNDATE+4-PBA(A6)ŒENDI***£Ifthislabelstartswith'$TIM'thenit)*£mustbe'$TIME'sosav' ethetimeinthe%*£messagetoshowwhenthesysgenwas *£performed.*1ŒIF.LFENTRY+TYPESIZE-PBA(A6)#'$TIM'THEN.S6ŽMOVE.WFENTRY+TYPESIZE+PARLEN-PBA(A6),SGNTIME-PBA(A6):ŽMOVE.BFENTRY+TYPESIZE+PARLEN+2-PBA(A6),SGNTIME+3-PBA(A6):ŽMOVE.BFENTRY+TYPESIZE+PARLEN+3-PBA(A6),SGNTIME+4-PBA(A6)ŒENDI>ŒADD.L‚#1,LABELRRN-PBA(A6)Getreadytoreadthenextrecord#&ŠUNTIL.WFENTRY-PBA(A6)#SYMVALUE ?ŠMOVE.L‚IOSIN+IOSRRN-PBA(A6),LABELRRN-PBA(A6)Savethiscurrect*£RandomRecordNumber *)*£Writetheversionheadingtotheoutput+*£listingfilealongwiththedateandtime%*£thesysgenwasperformed.‚Writethe-*£columnheadingstotheoutputlistingfile.*+ŠOUTPUTVERSION-PBA(A6),VEND-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUTBLANK-PBA(A6),BLANKE-PBA(A6),SYMIOS ŠBNE„IOERR-ŠOUTPUTSGNPER-PBA(A6),SGNPERE-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUTBLANK-PBA(A6),BLANKE-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUTBLANK-PBA(A6),BLANKE-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUTHEAD1-PBA(A6),HEAD1E-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUTHEAD2-PBA(A6),HEAD2E-PBA(A6),SYMIOS ŠBNE„IOERR+ŠOUTPUTHEAD3-PBA(A6),HEAD3E-PBA(A6),SYMIOS ŠBNE„IOERR *-*£Filltheoutputlinebufferwithallspaces'*£topreparethebufferforoutputting.*ŠLEA„BUFFER-PBA(A6),A2ŠFOR.W‚D0=#1TO#BUFSIZEDO.S3ŒMOVE.B#'',(A2)+‡WriteaspacetothelinebufferŠENDF 5ŠCLR.L‚SYMNUM-PBA(A6)‚Startwithacountof0symbols SYMSOVERBŠOUTPUTBUFFER-PBA(A6),BUFFER+1-PBA(A6),SYMIOSOutputablankline#*£beforeeachlabelbeingdisplayedŠBNE„IOERRŽBranchifanyerrors@ŠLEA„IOSIN-PBA(A6),A0ƒGettheaddressoftheparameterblockfor*£theinputfileBŠLEA„FENTRY-PBA(A6),A1‚Gettheaddressofwheretoreadtherecord*£into.>ŠMOVE.LA1,IOSSAD(A0)†SavethisaddressintheparameterblockBŠLEA„FENTRY+TYPESIZE+SYMLEN-1-PBA(A6),A1Gettheendingaddressof*£wheretoreadtherecordto.>ŠMOVE.LA1,IOSEAD(A0)†Savethisaddressintheparameterblock9ŠMOVE.W#SYMVALUE,FENTRY-PBA(A6)GetthiskeyvalueentryDŠMOVE.W#IOPRAN+IOPRTK,IOSOPT(A0)DoI/ObyRandomRecordNumberand+*£byreturningthekeywiththerecordreadCŠMOVE.LLABELRRN-PBA(A6),IOSRRN(A0)SettheRandomRecordNumberto*£read. ŠIOSCALL(A0)ŽGoreadtherecordŠBNE„IOERRŽBranchifanyerrors>ŠCMP.W‚#DEFINED,FENTRY-PBA(A6)IsthisrecordaDEFINEDrecord4ŠBEQ„READDONE‹Ifitisthenwearedonewithallthe'*£symbols.‚Wejunkwanttoreadallthe*£SYMVALUErecords. 8ŠADD.L‚#1,SYMNUM-PBA(A6)‚Updatethecurrent#ofsymbols1ŠMOVE.LSYMNUM-PBA(A6),D0‚GetthisnumberinD0.LBŠLEA„PROCNUM-PBA(A6),A2Thisiswherewewanttowritethedecimal *£valueto.3ŠBSR„DECOUTGocalculatethedecimalvalueofthe#*ŠIF.LTASKNAME-PBA(A6)#'&BCT'THEN.S:ŒMOVE.W#IOPIMG,OUTIOS+IOSOPT-PBA(A6)ChangetoimagemodeCŒOUTPUTPROC-PBA(A6),PROCE-PBA(A6),OUTIOSWritethemessagetelling$*£thesymbolnumberbeingprocessed.ŒBNE„IOERRŽBranchifanyerrorsCŒMOVE.W#IOPFOR,OUTIOS+IOSOPT-PBA(A6)ChangebacktoformattedmodeŠENDI<ŠLEA„IOSIN-PBA(A6),A0ƒGettheaddressoftheparameterblock*£forreadingtheinputfile.BŠLEA„FENTRY+TYPESIZE-PBA(A6),A3Gettheaddressofwherethelabel*£startswithintherecord. SYMSOUT9ŠLEA„LABEL-PBA(A6),A5ƒGettheaddressofthelabelbufferŠFOR.B‚D0=#1TO#PARLENDO.S4ŒMOVE.B#'',(A5)+‡FillthelabelbufferwithblanksŠENDF *-*£Writetheparameternametotheoutputline *£buffer.*9ŠLEA„LABEL-PBA(A6),A5ƒGettheaddressofthelabelbuffer ŠMOVE.LA3,A4@ŠLEA„BUFFER-PBA(A6),A2‚Gettheaddressoftheoutputlinebuffer8ŠMOVE.BPLEN(A3),D2ˆGetthelengthoftheparameternameŠFOR.B‚D0=#1TOD2DO.S;ŒMOVE.B(A4),(A5)+‡Writetheparameternametolabelbuffer>ŒMOVE.B(A4)+,(A2)+†WriteparameternametooutputlinebufferŠENDF *,*£Writethevaluetotheoutputlinebuffer.*8ŠLEA„VALUE(A3),A4‡GettheaddresswherethevaluestartsŠIF.B(A4)#'$'THEN.S@ŒMOVE.B#HEX,VALUTYPE-PBA(A6)Se( ttheVALUTYPE=HEXsinceitisŠELSE.S=ŒMOVE.B#NOTHEX,VALUTYPE-PBA(A6)SettoNOTHEXsinceitisn'tŠENDI *+*£Ifthevalueisahexidecimalnumberthen+*£displaythevalueinthehexidecimalform)*£andalsothedecimalform.‚Ifthevalue+*£isnothexidecimalthendisplaythevalue*£intheASCIIform.*'ŠIF.BVALUTYPE-PBA(A6)#HEXTHEN.S:ŒLEA„BUFFER+TAB1HEX-PBA(A6),A2Gettheaddressofwhereto'*£startwritingthehexnumber.‚The'$'*£isalreadyinthevalue./ŒMOVE.BVLEN(A3),D3†GetthelengthofthevalueŒFOR.B‚D0=#1TOD3DO.S)ŽMOVE.B(A4)+,(A2)+…WritevaluetobufferŒENDF @ŒLEA„BUFFER+TAB2DEC-PBA(A6),A2Gettheaddressofwheretostart*£writingthedecimalnumber.;ŒLEA„VALUE(A3),A4…Gettheaddressofwherethehexvalueis ŒMOVE.LA4,A52ŒADD.L‚D3,A5ŒAddthelengthoftheASCIIhexvalue&ŒBSR„GETNUMDŠGoconverttohexidecimalŒIF.LƒD0#0THEN.S<ŽMOVE.B#'-',(A2)+…Print'-'toshowthatitisanegative#)ŽNEG.L‚D0MakethenumberappearnegativeŒENDI;ŒMOVE.B#'&',(A2)+‡Writean'&'toshowthatthisnumberis *£decimal.5ŒBSR„DECOUT‹Gowritethedecimalnumbertotheoutput*£linebuffer.;ŒLEA„VALUE(A3),A4…Gettheaddressofwherethehexvalueis ŒMOVE.LA4,A52ŒADD.L‚D3,A5ŒAddthelengthoftheASCIIhexvalue&ŒBSR„GETNUMDŠGoconverttohexidecimal@ŒLEA„BUFFER+TAB25AS-PBA(A6),A2Gettheaddressofwheretostart*£writingtheASCIIvalue.ŒMOVE.B#'''',(A2)+ŒFOR.B‚D1=#1TO#4DO.S&ŽROL.L‚#8,D0ŠGetthecharacterinD0.B+ŽIF.BD0#$20OR.BD0#$7FTHEN.S(MOVE.B#'.',(A2)+ƒElsejustprinta'.'ŽELSE.S:MOVE.BD0,(A2)+…IfthecharacterisdisplayablethenshowŽENDIŒENDFŒMOVE.B#'''',(A2)+ŠELSE.S*%*£Thismeansthatthevaluewasnota-*£hexidecimalnumbersowewillputitinthe*£ASCIIcolumn.*@ŒLEA„BUFFER+TAB3ASC-PBA(A6),A2Gettheaddressofwheretostart*£writingtheASCIIvalue.6ŒMOVE.BVLEN(A3),D3†GetthelengthoftheASCIIvalue.ŒFOR.B‚D0=#1TOD3DO.S)ŽMOVE.B(A4)+,(A2)+…WritevaluetobufferŒENDFŠENDI ŠCLR.L‚DEFRRN-PBA(A6)ŠCLR.L‚REFRRN-PBA(A6)DŠMOVE.W#IOPRTK+IOPRRN,IOSOPT(A0)DoI/ObyRandomRecordNumberand+*£byreturningthekeywiththerecordreadBŠMOVE.B#NOTDONE,DEFEND-PBA(A6)SetDEFENDtoshowthatwearenot"*£donewiththeDefinedfilesyet.BŠMOVE.B#NOTDONE,REFEND-PBA(A6)SetREFENDtoshowthatwearenot%*£donewiththeReferencedfilesyet. ***£WhileDEFENDandREFENDareNOTDONEthen**£keepreadingrecordsshowingthefile(s)**£thatdefineorreferencethesamelabel.**ŠWHILE.BDEFEND-PBA(A6)#NOTDONEOR.B ’REFEND-PBA(A6)#NOTDONEDO*-*£IfDEFENDisNOTDONEthenkeepreadingmore(*£recordsthatshowwherethislabelwas'*£wasdefined.‚Noticethatthisisonly)*£validwithre-definableparameters(the*£parametersstartingwith'&')*'ŠIF.BDEFEND-PBA(A6)#NOTDONETHEN<ŒLEA„IOSIN-PBA(A6),A0Gettheaddressoftheparameterblock**£forreadingrecordsfromtheinputfile.;ŒLEA„FENTRY-PBA(A6),A1Gettheaddressofwheretoreadthe*£recordinto.6ŒMOVE.LA1,IOSSAD(A0)„SavethisintheparameterblockAŒLEA„FENTRY+TYPESIZE+PARLEN+18-1-PBA(A6),A1Gettheendingaddres6ŒMOVE.LA1,IOSEAD(A0)„SavethisintheparameterblockDŒMOVE.W#DEFINED,FENTRY-PBA(A6)Readonlytherecordwhosekeyvalue*£startswithDEFINED(0002)BŒMOVE.LDEFRRN-PBA(A6),IOSRRN(A0)TellitwhichRRNyouwantitto*£read ŒIOSCALL(A0)ŒGoreadtherecord*+*£Iftherecorddoesnotexistorifweare,*£attheendofthefilethenmarkDEFENDas*£DONE.*ŒIF.BD0#ISTARNOR.B‘D0#ISTAEOFTHEN.S0ŽMOVE.B#DONE,DEFEND-PBA(A6)MarkDEFENDasDONEŒENDI2ŒBSR„CMPLBL‹Comparethelabeltomakesurethisis*£thesamesymbol.)*£Ifthesymbolisnotthesamethenmark*£DEFENDasDONE.*'ŒIF.BSYMBOL-PBA(A6)#NOTSAMEOR.B!‘DEFEND-PBA(A6)#DONETHEN.S0ŽMOVE.B#DONE,DEFEND-PBA(A6)MarkDEFENDasDONEŒENDI*( )*£IfwearenolongerreadingtheDEFINED(*£recordsthenalsomarkDEFENDasDONE.*'ŒIF.WFENTRY-PBA(A6)#DEFINEDOR.B!‘DEFEND-PBA(A6)#DONETHEN.S0ŽMOVE.B#DONE,DEFEND-PBA(A6)MarkDEFENDasDONEŒELSE.S-ŽTST.B‚D0TestforanyerrorsontheI/OcallŽBNE„IOERRŠBranchifanyerrors5ŽIOSCALLPOSIOS-PBA(A6)ReadtheRandomRecordNumberŽBNE„IOERRŠBranchifanyerrorsŽMOVE.LIOSRRN(A0),D0)ŽADD.L‚#1,D0ŠAdd1togettothenextRRN@ŽMOVE.LD0,DEFRRN-PBA(A6)SavetheRRNatDEFRRN.‚Thiswilltell*£uswhereweleftoff.*+*£IfthecatalogisNULLthenputan'&'to!*£showthatitisaNULLcatolog.*?ŽLEA„FENTRY+TYPESIZE+PARLEN-PBA(A6),A4Gettheaddressofwhere*£thedefinedfilenameis.:ŽLEA„BUFFER+TAB4DEF-PBA(A6),A2Gettheaddressofwhereto%*£startwritingthedefinedfilename. ŽBSR„WFNAME ŒENDIŠENDI *(*£IfREFENDisNOTDONEthenkeepreading)*£morerecordsthatshowwherethislabel*£wasreferenced.*'ŠIF.BREFEND-PBA(A6)#NOTDONETHEN<ŒLEA„IOSIN-PBA(A6),A0Gettheaddressoftheparameterblock**£forreadingrecordsfromtheinputfile.;ŒLEA„FENTRY-PBA(A6),A1Gettheaddressofwheretoreadthe*£recordinto.>ŒMOVE.LA1,IOSSAD(A0)„Savethisaddressintheparameterblock?ŒLEA„FENTRY+TYPESIZE+PARLEN+18-1-PBA(A6),A1Gettheendingaddr>ŒMOVE.LA1,IOSEAD(A0)„Savethisaddressintheparameterblock?ŒMOVE.W#REFERENC,FENTRY-PBA(A6)Gettherecordwhosekeyvalue*£startswithREFERENC(0003)AŒMOVE.LREFRRN-PBA(A6),IOSRRN(A0)TellitwhichRRNwewantitto*£read ŒIOSCALL(A0)ŒGoreadtherecord*+*£Iftherecorddoesnotexistorifweare,*£attheendofthefilethenmarkREFENDas*£DONE.*ŒIF.BD0#ISTARNOR.B‘D0#ISTAEOFTHEN.S0ŽMOVE.B#DONE,REFEND-PBA(A6)MarkREFENDasDONEŒENDI2ŒBSR„CMPLBL‹Comparethelabeltomakesurethisis*£thesamesymbol.*)*£Ifthesymbolisnotthesamethenmark*£REFENDasDONE.*'ŒIF.BSYMBOL-PBA(A6)#NOTSAMEOR.B!‘REFEND-PBA(A6)#DONETHEN.S1ŽMOVE.B#DONE,REFEND-PBA(A6)MarkREFENDasDONE.ŒELSE.L.ŽTST.B‚D0TestforanyerrorsontheI/Ocall.ŽBNE„IOERRŠBranchifanyerrors5ŽIOSCALLPOSIOS-PBA(A6)ReadtheRandomRecordNumberŽBNE„IOERRŠBranchifanyerrorsŽMOVE.LIOSRRN(A0),D0)ŽADD.L‚#1,D0ŠAdd1togettothenextRRN@ŽMOVE.LD0,REFRRN-PBA(A6)SavetheRRNatREFRRN.‚Thiswilltell*£uswhereweleftoff.*)*£Savethefilenameintoabuffersothat)*£wecanchecktoseeifwehaveanymore*£withthesamefilename.*<ŽLEA„FILENAME-PBA(A6),A0Gettheaddressofwherewewantto*£savethefilename.&ŽLEA„FENTRY+TYPESIZE+PARLEN-PBA(A6),A4ŽFOR.B‚D0=#1TO#8+8+2DO.S6MOVE.B(A4)+,(A0)+‚MovethefilenametoabufferareaŽENDF ?ŽMOVE.L#1,REFCOUNT-PBA(A6)Setnumberofreferencedfilesto12ŽMOVE.B#SAME,REFFILE-PBA(A6)MarkREFFILEtoSAME*+*£Whilethereferencedfilenameisthesame,*£wewilljustincrementREFCOUNTeachtime.&*£Ifitisnotthesamethenwritethe+*£filenameouttothebufferalongwiththe*£countifitismorethat1.*&ŽWHILE.BREFFILE-PBA(A6)#SAMEDOMOVE.LREFRRN-PBA(A6),IOSRRN(A0)TellitwhichRRNwewantit *£toread IOSCALL(A0)ˆGoreadtherecord*+*£Iftherecorddoesnotexistorifweare)*£attheendofthefilethenmarkREFEND *£asD) ONE.*IF.BD0#ISTARNOR.B•D0#ISTAEOFTHEN.S0’MOVE.B#DONE,REFEND-PBA(A6)MarkREFENDasDONE8’MOVE.B#NOTSAME,REFFILE-PBA(A6)MarkREFFILEasNOTSAMEENDI2BSR„CMPLBL‡Comparethelabeltomakesurethisis*£thesamelabel.*)*£Ifthesymbolisnotthesamethenmark*£REFENDasDONE.*'IF.BSYMBOL-PBA(A6)#NOTSAMEOR.B!•REFEND-PBA(A6)#DONETHEN.S0’MOVE.B#DONE,REFEND-PBA(A6)MarkREFENDasDONE8’MOVE.B#NOTSAME,REFFILE-PBA(A6)MarkREFFILEasNOTSAME5’LEA„FILENAME-PBA(A6),A4Gettheaddressofwherethe*£referencedfilenamewaskept.7’LEA„BUFFER+TAB5REF-PBA(A6),A2Gettheaddressofwhere+*£tostartwritingthereferencedfilename.3’BSR„WFNAME…Writethefilenametotheoutputbuffer***£IfREFCOUNTisgreaterthan1thenprint'*£inbrackets([]),thenumberoftimes)*£thesymbolwasreferencedinthatfile.*%’IF.LREFCOUNT-PBA(A6)#1THEN.S-”MOVE.B#'',(A2)+Addaspaceafterfilename ”MOVE.B#'[',(A2)+Openbrackets”MOVE.LREFCOUNT-PBA(A6),D0)”BSR„DECOUTƒWritedecimalcounttobuffer!”MOVE.B#']',(A2)+Closebrackets’ENDIELSE.S6’BSR„CMPFILE„Comparethefilenametomakesurethisis$*£thesamefilethatwasreferenced.*-*£Ifthefilenamewasthesamethenincrement$*£thenumberoftimesthesymbolwas *£referenced.*'’IF.BƒREFFILE-PBA(A6)#SAMETHEN.S:”ADD.L‚#1,REFCOUNT-PBA(A6)Updatethenumberofreferences-”TST.B‚D0‡TestforanyerrorsontheI/Ocall”BNE„IOERR„Branchifanyerrors5”IOSCALLPOSIOS-PBA(A6)ReadtheRandomRecordNumber”BNE„IOERR„Branchifanyerrors”MOVE.LIOSRRN(A0),D0)”ADD.L‚#1,D0„Add1togettothenextRRN;”MOVE.LD0,REFRRN-PBA(A6)SavetheRRNatREFRRN.‚Thiswill*£telluswhereweleftoff.’ELSE.S5”LEA„FILENAME-PBA(A6),A4Gettheaddressofwherethe*£referencedfilenamewaskept.7”LEA„BUFFER+TAB5REF-PBA(A6),A2Gettheaddressofwhere+*£tostartwritingthereferencedfilename.3”BSR„WFNAMEƒWritethefilenametotheoutputbuffer***£IfREFCOUNTisgreaterthan1thenprint'*£inbrackets([]),thenumberoftimes)*£thesymbolwasreferencedinthatfile.*%”IF.LREFCOUNT-PBA(A6)#1THEN.S-–MOVE.B#'',(A2)+Addaspaceafterfilename –MOVE.B#'[',(A2)+Openbrackets–MOVE.LREFCOUNT-PBA(A6),D0)–BSR„DECOUTƒWritedecimalcounttobuffer!–MOVE.B#']',(A2)+Closebrackets”ENDI8”MOVE.B#NOTSAME,REFFILE-PBA(A6)MarkREFFILEasNOTSAME’ENDIENDIŽENDWŒENDIŠENDI*$*£IfDEFENDorREFEND=NOTDONEthen)*£outputthebuffertotheoutputlisting*£file.*8ŠBSR.S‚CHKBLKChecktoseeifthereisanythingtowrite(*‰IF.BDEFEND-PBA(A6)#NOTDONEOR.B%*ŽREFEND-PBA(A6)#NOTDONETHEN.S+ŠIF.BBUFCONT-PBA(A6)#NOTEMPTYTHEN.S=ŒOUTPUTBUFFER-PBA(A6),-1(A2),SYMIOSOutputtherecordtothe*£outputlistingfile.ŒBNE„IOERRŒBranchifanyerrors*&*£Filltheoutputlinebufferwithall)*£spacessothatwecanstartoveragain.*ŒLEA„BUFFER-PBA(A6),A2ŒFOR.W‚D0=#1TO#BUFSIZEDO.S2ŽMOVE.B#'',(A2)+…FillthebufferwithallspacesŒENDF <ŒMOVE.W#IOPRAN+IOPRTK,IOSIN+IOSOPT-PBA(A6)DoI/ObyRandom(*£RecordNumberandbyreturningthekey*£withtherecordread.ŠENDIŠENDW>ŠADD.L‚#1,LABELRRN-PBA(A6)GetreadytoreadthenextSYMVALUE*£entry.ŠBRA„SYMSOVER‹GodoitagainŠPAGE*CHKBLK)ŠMOVEM.LD0/A0,-(A7)‡SaveusersregistersŠLEA„BUFFER-PBA(A6),A0ŠMOVE.B#EMPTY,BUFCONT-PBA(A6)ŠFOR.W‚D0=#1TO#BUFSIZEDO.SŒCMP.B‚#'',(A0)+ŒIFTHEN.S!ŽMOVE.B#NOTEMPTY,BUFCONT-PBA(A6)ŒENDIŠENDF,ŠMOVEM.L(A7)+,D0/A0‡RestoreusersregistersŠRTS*-*£Thissubroutinewillcomparethereferenced)*£filenamethatwassavedtothefilename *£justread.*CMPFILE,ŠMOVEM.LD0/A0/A1,-(A7)„Saveusersregisters7ŠLEA„FILENAME-PBA(A6),A0Addresswheresavefilenameis>ŠLEA„FENTRY+TYPESIZE+PARLEN-PBA(A6),A1Addressofnewfilename7ŠMOVE.B#NOTSAME,REFFILE-PBA(A6)SetREFFILEtoNOTSAMEŠFOR.B‚D0=#1T) O#8+8+2DO.S4ŒCMP.B‚(A0)+,(A1)+†CompareeachbyteofthefilenameŒBNE.S‚CMPFILE1ŠENDFEŠMOVE.B#SAME,REFFILE-PBA(A6)SetREFFILEtoSAMEsincethefilenames*£arethesame.7CMPFILE1‚MOVEM.L(A7)+,D0/A0/A1„RestoreusersregistersŠRTS*)*£Thissubroutinewillcomparethesymbol)*£thatwassavedtothesymboljustread.*CMPLBL,ŠMOVEM.LD0/A0/A1,-(A7)„Saveusersregisters5ŠLEA„FENTRY+TYPESIZE-PBA(A6),A0Addressofnewsymbol-ŠLEA„LABEL-PBA(A6),A1ƒAddressofsavedsymbol;ŠMOVE.B#NOTSAME,SYMBOL-PBA(A6)MarkthesymbolsasNOTSAMEŠFOR.B‚D0=#1TO#PARLENDO.S2ŒCMP.B‚(A0)+,(A1)+†CompareeachbyteofthesymbolŒBNE.S‚CMPLBL1ŠENDF5ŠMOVE.B#SAME,SYMBOL-PBA(A6)MarkthesymbolsasSAMECMPLBL1ƒMOVEM.L(A7)+,D0/A0/A1ŠRTS *)*£Thissubroutinewillwritethefilename*£totheoutputlinebuffer.**£ENTRY:‚A4=Addressofwherefilenameis*WFNAMEŠIF.Bƒ(A4)#$20THEN.S.ŒMOVE.B#'&',(A4)MarkthecatalogasNULL'&'ŠENDI*+*£Writethecatalognametotheoutputline&*£buffer.‚Thiswillnotprinttrailing *£spaces.*ŠFOR.B‚D0=#1TO#8DO.S-ŒIF.B(A4)#$20THEN.SCheckforaspace7ŽMOVE.B(A4)+,(A2)+WritecatalogtooutputlinebufferŒELSE.S!ŽADD.L‚#1,A4‚SkipoverthespacesŒENDIŠENDF >ŠMOVE.B#'.',(A2)+Adda'.'toseperatecatalogfromfilename*(*£Writethefilenametotheoutputline&*£buffer.‚Thiswillnotprinttrailing *£spaces.*ŠFOR.B‚D0=#1TO#8DO.S-ŒIF.B(A4)#$20THEN.SCheckforaspace8ŽMOVE.B(A4)+,(A2)+WritefilenametooutputlinebufferŒELSE.S!ŽADD.L‚#1,A4‚SkipoverthespacesŒENDIŠENDF 6ŠMOVE.B#'.',(A2)+Adda'.'toseperatefilenamefrom *£extension.*(*£Writetheextensiontotheoutputline *£buffer.*ŠFOR.B‚D0=#1TO#2DO.S;ŒMOVE.B(A4)+,(A2)+WritetheextensiontooutputlinebffrŠENDFŠRTS *.* Convert Hexidecimal number to hex subroutine**8*ENTRY:‚D0.L=Hexidecimalnumbertoconverttodecimal**DECOUTŠMOVEM.LD1-D4/A0,-(A7)ŠLEA„POWER10-PBA(A6),A04ŠMOVE.B#10,D4Maximumnumberofcharacterspossible#ŠMOVE.L(A0)+,D3‹Getleadingspaces ŠMOVE.BD3,D1BLANKITƒMOVE.BD3,D2%SLODIV„SUB.L‚(A0),D0ŒSubtract(10**N) ŠBCS.S‚LEAD0ŽTablevaluetoobig*ŠADD.L‚#1,D2ŽIncrementcurrentdigitcount ŠBRA„SLODIV8LEAD0…ADD.L‚(A0)+,D0‹Restoreoverborrow,advancepointer ŠCMP.B‚D1,D2%ŠBEQ.S‚LEADBŽYes,storeleadingblank6ŠSUBQ.B#1,D4ŽSubtractthenumberofblankstodisplay+ŠADD.W‚#$10,D2ŒConvertblanktoASCIIdigit!ŠCLR.B‚D1‘Turnoffleadingblanks1ŠMOVE.BD2,(A2)+‹DecimalcharactertooutputlineLEADB…TST.L‚(A0)Done?ŠBEQ.S‚CHKALLB ŠBRA„BLANKITCHKALLBƒTST.B‚D1ŠBEQ.S‚BI2ASCXŠMOVE.B#'0',(A2)+6ŠSUBQ.B#1,D4ŽSubtractthenumberofblankstodisplayBI2ASCXE*‰FOR.BD0=#1TOD4DO.S‚Thiscodeisincaseyouwantthetrailing,*‹MOVE.B#'',(A2)+‡characterstobespaces.*‰ENDFŠMOVEM.L(A7)+,D1-D4/A0ŠRTS   ** Register usage:*1*D0.L-Thebinaryvaluereturnedtothecaller.7*D1.L-Storageasnumbersareenteredbeforetheyare *—movedtoD0*D2ƒ-Counter*D3.L-Baseforthenumber *¤1-ASCII *¤2-binary *¤8-octal*£10-decimal*£16-hexidecimal'*D4.W-Flagfornumbersbeingentered1*D5.W-Scratchregisterstoreadinterminators*&*A4.L-PointertoASCIIinputstring-*A5.L-PointertoendofASCIIinputstring**GETNUMD"ŠBSR.S‚GETDECNU‹GetdecimalnumberGETNUMD9 ŠBNE„NOGOODŠRTS*GETNUMAŠBSR.S‚GETHEXNU‹Gethexnumber ŠBRA„GETNUMD9GETDECNU/ŠMOVEM.LD1-D5/A0-A1,-(A7)Saveusersregisters*ŠMOVE.L#10,D3D3=decimalbase(base10) ŠBRA.S‚GETN20GETHEXNU/ŠMOVEM.LD1-D5/A0-A1,-(A7)Saveusersregisters.ŠMOVE.L#16,D3D3=hexidecimalbase(base16)GETN20*ŠCLR.W‚D4‘D4=flagforcharactersenteredŠCLR.L‚D1‘D1=tempresultsŠREPEATŒMOVE.B(A4),D0ŒIF.BD0#$20THEN.S ŽADDQ.L#1,A4ŒENDI;ŠUNTIL.BD0#$20OR.LA4A5IgnoreleadingspacesGETN30'ŠIF.LA4A5* THEN.S„Endofbuffer? ŒBRA„GETN90ŠENDIŠCLR.L‚D0‘HSKPŠMOVE.B(A4)+,D0 'ŠLEA„TRMNTRS-PBA(A6),A1TerminatorlistGETN40ŠMOVE.B(A1)+,D5&ŠBEQ.S‚GETN45Endofterminatorlist? ŠCMP.B‚D0,D5 ŠBEQ„GETN85 ŠBRA„GETN40GETN45*ŠCMP.L‚#1,D3ŽArewedoingASCIIcharacters ŠBEQ.S‚GETN77*ŠCMP.B‚#'''',D0‹IsitanASCIIcharacter? ŠBNE.S‚GETN50ŠMOVEQ.L#1,D3 ŠBRA.S‚GETN71GETN50*ŠCMP.B‚#'%',D0ŒIf'%'thenumberisbinary ŠBNE.S‚GETN55&ŠMOVEQ.L#2,D3Setforbase2(binary) ŠBRA.S‚GETN71GETN55*ŠCMP.B‚#'@',D0ŒIf'@',thenumberisoctal ŠBNE.S‚GETN60%ŠMOVEQ.L#8,D3Setforbase8(octal) ŠBRA.S‚GETN71GETN60,ŠCMP.B‚#'&',D0ŒIf'&',thenumberisdecimal ŠBNE.S‚GETN65(ŠMOVE.L#10,D3Setforbase10(decimal) ŠBRA.S‚GETN71GETN650ŠCMP.B‚#'$',D0ŒIf'$',thenumberishexadecimal ŠBNE.S‚GETN75,ŠMOVE.L#16,D3Setforbase16(hexidecimal)GETN71 ŒTST.W‚D4 ŒBNE.S‚GETN80GETN57ŠMOVE.W#-1,D4 ŠBRA„GETN30GETN75ŠIF.LD3#1THEN.S+ŒSUB.B‚#$30,D0ŠConvertfromASCIItobinary Œ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ŒConvertto$A-$FŠENDIGETN77ŠIF.LD3#1THEN.S&ŒCMP.W‚D3,D0ŒIsinputlargerthatbase ŒBCC.S‚GETN80/ŒMOVE.LD1,D2ŒGetreadytomultiply(D1*base)ŒSWAPƒD1ŒMULUƒD3,D1ŒToppartŒSWAPƒD1ŒTST.W‚D1Checkforoverflow ŒBNE.S‚GETN80‹Valueistoolarge ŒMULUƒD3,D2ŒNowworkonlowword!ŒADD.L‚D2,D1ŒPutitbacktogetherŒBVS.S‚GETN80‹Overflow?ŒADD.L‚D0,D1ŒAddinnewstuff ŒBVC„GETN57ŠELSE.S+ŒLSL.L‚#8,D1ŒMakeroomfornewASCIInumber#ŒOR.BƒD0,D1ŒAddinnewASCIInumberŠENDI ŠBRA„GETN30GETN80ŠIF.LD3#1THEN.S ŒBRA„GETN77ŠENDI!ŠMOVE.L#-1,D0Errorreturn(BNE) ŠBRA.S‚GETN95:GETN85„SUB.L‚#1,A4ŽBackuptopointatspace/previouschar,GETN90„MOVE.LD1,D0ŽSetupresultforreturnŠCLR.L‚D1‘Normalreturn(BEQ)8GETN95„MOVEM.L(A7)+,D1-D5/A0-A1RestoreusersregistersŠRTS,TRMNTRSƒDC.Bƒ'+-*/',0ŠTerminatorcharacters NOGOOD   READDONE*&*£Writeablanklinetothelogdevice'*£Writethe'Totalnumberofsymbols='&*£Writeablanklinetothelogdevice**ŠIF.LTASKNAME-PBA(A6)#'&BCT'THEN.S:ŒMOVE.W#IOPIMG,OUTIOS+IOSOPT-PBA(A6)Changetoimagemode+ŒOUTPUTBLANK-PBA(A6),BLANKE-PBA(A6),OUTIOSŒBNE„IOERRŒBranchifanyerrors-ŒOUTPUTTOTSYM-PBA(A6),TOTSYME-PBA(A6),OUTIOSŒBNE„IOERRŒBranchifanyerrorsCŒMOVE.W#IOPFOR,OUTIOS+IOSOPT-PBA(A6)ChangebacktoformattedmodeAŒOUTPUTBLANK-PBA(A6),BLANKE-PBA(A6),OUTIOSWriteablanklinetoŒBNE„IOERRŒlogdeviceŠENDI=ŠLEA„TOTSYM+2-PBA(A6),A0WriteTotalnumberofsymbolstothe*£outputlinebufferŠLEA„BUFFER-PBA(A6),A1ŠFOR.W‚D0=#1TO#TOTSYMLDO.S1ŒMOVE.B(A0)+,(A1)+†MoveeachcharactertobufferŠENDF 8ŠLEA„PROCNUM-PBA(A6),A0AddressofthenumberofsymbolsŠFOR.B‚D0=#1TO#12DO.S1ŒMOVE.B(A0)+,(A1)+†MovethenumbertothebufferŠENDF *&*£Writethetotalnumberofsymbolsto*£thelistingfile.*+ŠOUTPUTBLANK-PBA(A6),BLANKE-PBA(A6),SYMIOS!ŠBNE.S‚IOERRŽBranchifanyerrors$ŠOUTPUTBUFFER-PBA(A6),-1(A1),SYMIOS!ŠBNE.S‚IOERRŽBranchifanyerrors ERRTERM<ŠMOVE.W#FHCLOS,SYMFHS-PBA(A6)Getreadytocloseinputfile,ŠFHSCALLSYMFHS-PBA(A6)„Closetheinputfile!ŠBNE.S‚IOERRŽBranchifanyerrorsEŠMOVE.W#FHCLOS,SLSFHS-PBA(A6)Getreadytocloseoutputlistingfile5ŠFHSCALLSLSFHS-PBA(A6)„Closetheoutputlistingfile!ŠBNE.S‚IOERRŽBranchifanyerrorsEŠOUTPUTBLANK-PBA(A6),BLANKE-PBA(A6),OUTIOSWriteablanklinetologŠBNE.S‚IOERRŽdevice ŠERQ.TERM *$* Print I/O error with LU and status*‰D0.L=status)*‰A0ƒ=FHSorIOSparameterblockaddress*IOERR0ŠBSR.S‚ERRMSGLeterrormessagehandlercomplainŠBRA„ERRTERMŒGoterminate1*-----------------------------------------------*+*Subroutinetouseerrormessagehandler‡**‰D0-Messagecode•*)*‰A0-Pointstoparameterblockifany*1*-----------------------------------------------** ERRMSG>ŠMOVEM.LD0/A0,ERRPBLK-PBA(A6)SaveD0andA0inerrormessageŠMOVE.L#2,D0ŽparameterblockŠLEA„ERRPBLK-PBA(A6),A0ŠTRAPƒ#4‘ShowtheerrorŠMOVEM.LERRPBLK-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ƒ=ARGSNAPSHOT.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ƒ=ARGSNAPSHOT.LL=/ENDIF=/*=LINK ,SNAPSHOT.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000INPUT SNAPSHOT.ROLIB 0.&.UTILIB.ROEND=/*=END+ ééééééVO********************************************************************************3*‰SNAPSHOT--SAVEƒSCREENƒIMAGE***„Commandlineformat:*<*ˆ=SNAPSHOT[][,]**E*„ForEXORTERM155'sonly--justprintsgarbageonotherterminalsand$*„locksupuntilyouissueaRETURN.*O*******************************************************************************‰PAGE#*************************************ˆEQUATEFILESINCLUDED:*IOE*TR1*#***********************************‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰INCLUDEƒ9995.&.TR1.EQ‰LIST      **‚Miscellaneousequates* "DATASECTEQU‡0“Section#fordata.*PROGSECTEQU‡0“Section#forprogramcode. CR‡EQU‡13’ASCIICRchar.ESC†EQU‡27’ASCIIESCchar.SPACE„EQU‡32’ASCIIspace. *TERMINALEQU‡'#ƒ'ŽNameofuser'sterminal.2TERMLUƒEQU‡1“LUforterminalwhosescreentocopy. )PRINTER‚EQU‡'PR‚'ŽNameofprinterdevice.,PRINTLU‚EQU‡2“LUforoutputofscreenimage. ,TLINESƒEQU‡24’#oflinesonterminalscreen. #EOLINEƒEQU‡$F9‘Signalsendofline.#EOPAGEƒEQU‡$DE‘Signalsendofpage.5GARBAGE‚EQU‡$EA‘Signalsstartofgarbagethatfollows*§thegoodstuffoneachline.‰PAGEO*********************************************************************************ˆDATAƒSECTION*O******************************************************************************* ‰SECTIONƒDATASECT 3BˆEQU‡*‰Baseofprogram(forposition-independence)  #*********** MISCELLANY ************ **‚Revisioninformation.*(REVIS„DC.B†'122084'ŒDateoflastchange.0‰DC.B†''‘Blankin.LOindicatescleanassembly.)‰DC.B†'4'‘MajorVERSAdosrevisionnumber. **‚Stack.* ‰DS.W†$20 STACK„EQU‡* **‚User'scommandline.*CLINE„COMLINEƒ80 *9*‚Areatosavedatapassedinregistersattaskcreation.*‰DSˆ0REG_SAV: *------- D0 - D3"SAV_MTSKDC.L†0“Monitortaskname.__hQpTx@€Nˆ&+ "SAV_MSESDC.L†0“Monitorsession#.#SAV_VOL‚DC.L†0“Defaultvolumename.‰DC.W†0SAV_USN‚DC.W†0“Defaultuser#. *------- D4 - D7SAV_CLG‚DC.L†0“Defaultcatalog. ‰DC.L†0“*$SAV_COMLDC.L†0“Commandlinelength.(SAV_LUMKDC.L†0“Logicalunitusagemask. *------- A0 - A3SAV_TASKDC.L†0“Taskname.$SAV_TERMDC.L†0“Associatedterminal.‰DC.W†0SAV_LUSNDC.W†0“Logonuser#.SAV_SESSDC.L†0“Session. *------- A4 - A5SAV_DATEDC.L†0“Systemdate.SAV_TIMEDC.L†0“Systemtime.  **‚Flagsandsuch.*1IGNOREƒDC.B†0“Setifweshouldignoretherestof&*§thechar'sonalinewhilescanning.‰PAGE)*********** PARAMETER BLOCKS ************ *L*‚FHSparameterblocktoassigninputdevice(defaultwillbehisterminal).*‰DSˆ0‰FHS.IN„FHASGN,FOPPRPW,TERMLU *C*‚FHSparameterblocktoassignoutputdevice(defaultisprinter).I*‚Iffile,indexedsequentialwithkeylength0and4-sectordatablocks.*‰DSˆ0,‰FHS.OUTƒFHASGN,FOPISD+FOPPW,PRINTLU,PRINTER *H*‚IOSparameterblocktooutputtheterminal's'spillyourguts'command+*‚andreadbackthecontentsofthescreen.*‰DSˆ0*‰IOS.IN„IOOWIN,IOPIMG+IOPINM+IOPNEC,TERMLU *>*‚IOSparameterblocktowriteformattedtotheoutputdevice.*‰DSˆ0‰IOS.OUTƒIOWRIT,IOPFOR,PRINTLU‰PAGE1************ OUTPUT & INPUT BUFFERS ************* *-*‚Commandtotheterminaltosenditsscreen.*‰DSˆ0)GET†DC.B†ESC,'O''sendcontentsofscreen%‰DC.B†31+1,31+1‹fromline‚1,column‚1)‰DC.B†31+24,31+80‰toƒline24,column80.' GETE…EQU‡*-1 *0*‚Buffertoholdthescreencontentssenttous.*‰DSˆ0@PAGEBUF‚DS.B†TLINES*128+100†Sizeis#oflines*quasi-arbitraryPAGEBUFEEQU‡*-13BUFLENƒEQU‡*-PAGEBUF‹largenumber,plussomeslack.‰PAGEJ***************************************************************************'*ERRORMESSAGEHANDLERPARAMETERBLOCK0*‹PRESETFORINPUTFROMCDFLUN,OUTPUTTOLDFLUN*J************************************************************************** ‰DSƒ0EM_PBLK: =‰DC.L‚0‡D0-IOS/FHSRETURNERRORSTATUS‚(ERRORMSGKEYVALUE)8‰DC.L‚0‡A0-ADDROFI/OPARAMETERBLOCK‚(IFAPPLICABLE)‰DC.B‚0‡OPTIONSFLAG‰DC.B‚LDFLUN‚LUFOROUTPUT‰DC.B‚0‡UNUSED‰DC.B‚CDFLUN‚LUFORINPUT-‰DC.L‚0‡STARTADDRESSFORUSERTEXTPLUGPOOL+‰DC.L‚0‡ENDƒADDRESSFORUSERTEXTPLUGPOOL‰PAGEO*********************************************************************************ˆPROGRAMƒSECTION*O******************************************************************************* ‰SECTIONƒPROGSECT ‰OPT‡BRS ‰XREF†PARSE,EDITFILE *D*‚Macrotomoveaddress(param1)toaneffectiveaddress(param2).* MOVADDR‚MACRO ‰PEA‡\1(PC)‰MOVE.L„(A7)+,\2‰ENDM    ‰DSˆ0BEGIN:  *I*‚Saveinformationpassedtousinregistersandsetupstack&basereg.*3‰LEA‡REG_SAV(PC),A7ŠSave14registersinsavearea.‰MOVEM.LƒD0-D7/A0-A5,(A7)„* %‰LEA‡STACK(PC),A7ŒLoadstackpointer.(‰LEA‡B(PC),A4Loadprogrambaseaddress. **‚Parsethecommandline.*5‰MOVE.L„SAV_COML-B(A4),D6‰D6<--commandlinelength.6‰LEA‡CLINE(PC),A0ŒCLINEisstartaddressofcommandli/‰BSR.L…PARSEParse;errorsyieldINVALIDENTRY.‰BMI.L…ER_NVEŽ*  * *‚Assigntheterminalforinput.*6‰LEA‡INFHS(PC),A6ŒGetaddressofparamblockforassig 0‰BTST.L„#22,D0ŽIftheinputfieldofthecommand‰IFTHEN’lineisnull,!‹MOVE.L‚SAV_TERM-B(A4),FHSVOL(A6)'‰ELSEš(butifinputfieldisnotnull,)6‹LEA…CLINE(PC),A0ŒcallEDITFILEtostufftheparameter'‹BSR.LƒEDITFILEŒblockfortheterminal.‹BMI.LƒER_NVEŽ*2‹BTST.L‚#1,D0Onlydevicesarevalidfortheinput‹BEQ.LƒER_NVEŽfield.>‹IF.L„FHSVOL(A6)#TERMINALTHENƒIf#wasentered,replace=MOVE.LSAV_TERM-B(A4),FHSVOL(A6)‡itwithuser'sterminalnam‹ENDI‰ENDI !‰FHSCALLƒINFHS(PC)‹Dotheassign.‰BNE.L…FATALERR **‚Assignoutputfile/device.*, 3‰MOVE.L„A1,A0A0<--ptrtotheoutputfieldofthe‰MOVE.L„A0,D0commandline./‰IFTHEN’Ifoutputfieldisnotnull,then 7‹LEA…OUTFHS(PC),A6‹loaddefaultsforafilenameintothB‹MOVE.L‚SAV_VOL-B(A4),FHSVOL(A6)‚parameterblockandcallEDITFILE*‹MOVE.W‚SAV_USN-B(A4),FHSUSN(A6)‚stuffit. ‹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,D0Ifit'safile,trytodeletethe1‰IFTHEN’oldonefirst.‚Ignoreerrorifit'sB‹MOVE.W‚#FHDELT,FHSCMD(A6)‚justtellingusthefiledoesn'texist.:‹FHSCALLOUTFHS(PC)ŠThensetuptoallocateandassignthe*‹IFTHENnewindexedsequentialfile.CMP.B#FSTANNM,D0BNE.LFATALERR‹ENDI!‹MOVE.W‚#FHALLO+FHASGN,FHSCMD(A0)‰ENDI ‰ENDI /‰FHSCALLƒOUTFHS(PC)ŠDothe(allocate&)assign.‰BNE.L…FATALERR **‚Getthescreenimage.*6‰LEA‡INIOS(PC),A0ŒSendthecommandstocausethetermi;‰MOVADDRƒGET,IOSSAD(A0)†tospillitsguts,andreadwhatis0‰MOVADDRƒGETE,IOSEAD(A0)…says(outputw/input).‰MOVADDRƒPAGEBUF,IOSRRN(A0)‰MOVE.L„#BUFLEN,IOSLEN(A0)‰TRAP†#2‰BNE.L…FATALERR *F*‚Nowthatwehavethescreencontents,moveonelineatatimetothe+*‚beginningofthebufferandprintitout.*7‰LEA‡OUTIOS(PC),A0‹A0pointstotheIOSparamblockfor*§printeroutput.8‰LEA‡PAGEBUF(PC),A1ŠWewillneedthisaddressfrequently3‰MOVE.L„A1,A2A2willscanthescreenimagelooking*§forgoodcharacters.5‰MOVE.L„A1,A3A3willbeusedtobuildtherecordsto$*§printatthebeginningofPAGEBUF.2‰LEA‡PAGEBUFE(PC),A5‰Getaddressofendofbuffer. 9‰MOVE.L„A1,IOSSAD(A0)‡Setthestartaddressoftheoutput *§bufferintheIOSparamblock. ‰REPEAT 9‹MOVE.B(A2)+,D1Getthenextcharfromthescreenimage. 8‹IF.BD1#EOLINETHENƒIfthisistheendofaline, 8SF„IGNORE-B(A4)ˆCleartheignoreflagforthenewline./BSRƒPRINTLINŒPrintlinetooutputfile/device.)MOVE.LA1,A3ŽRestorethebufferpointer. ‹ELSE˜(nottheendofaline) 0TST.BIGNORE-B(A4)ˆIfwe'renotinthegarbage, IF‚‚THEN -TST.B‚D1‘IfcharisASCII(bit7mustbe0),.IF‚‚THENŒcharisgooddata,somoveitin#MOVE.BD1,(A3)+‰positiontoprint.ENDI >IF.BD1#GARBAGETHENƒIfthisisthecharthatmarksthe7ST‚IGNORE-B(A4)ˆbeginningofthegarbagefollowingthe)ENDI–realline,remembertoignorerest. ENDI ‹ENDI (‰UNTIL.BD1#EOPAGEOR.LA2A5'*§Continueuntilwehittheendofpage *§markortheendofthebuffer. **‚Printthelastline.* ‰BSR‡PRINTLIN  **‚Terminatenormally.* ‰ERQ.TERM‰PAGEL*****************************************************************************-*ˆROUTINETOPRINTLINETOOUTPUTFILE/DEVICE* *ˆInputs:0*‹A0.LƒaddressofIOSparameterblockforoutput/*‹A1.Lƒaddressofbeginningofbuffertooutput9*‹A3.Lƒaddressofendofbuffertooutput(notpreserved)L**************************************************************************** PRINTLIN: *IF.LA3A1THEN†Ifthelineisempty6MOVE.B#SPACE,(A3)†Givetheprinteraspacetoprint, ELSE–else.SUB.L#1,A3backuptothelastcharwemovedENDI–intothelinebuffer. :MOVE.LA3,IOSEAD(A0)†Movethebufferendaddressintothe*TRAP#2“IOSparameterblockandwritethe4BNEƒFATALERRŒlinetotheprinterinformattedmode. ‰RTS‰PAGEJ***************************************************************************+*ˆERRORMESSAGESFROMERRORMESSAGEHANDLER*J************************************************************************** ER_NVE1:8‰MOVE.L„#EM_NVE,D0Š'INVALIDENTRY'message,thenreturn.1‰BRA.S…C_EM_PGMŒDoBSRtoER_NVE1insteadofBRA. ER_NVO::‰MOVE.L„#EM_NVO,D0Š'INVALIDOPTION'messageandterminate.‰BRA.S…FATALERR ER_OPTCF:=‰MOVE.L„#EM_OPTCF,D0ˆ'OPTIONCONFLICT'messageandterminate.‰BRA.S…FATALERR*ER_NVE:, 9‰MOVE.L„#EM_NVE,D0Š'INVALIDENTRY'messageandterminate.***J***************************************************************************2*ˆROUTINETOCALLERRORMESSAGEHANDLER,THENDIE.*J************************************************************************** FATALERR:‰BSR.S…C_EM_PGMGERREXIT‚ERQ.TERM‚#0,#$C000†Exitwitherrorstatus(toabortchainfile).   M*******************************************************************************’CALLTOERRORMESSAGEHANDLER**ˆCALL†BSR‡C_EM_PGM*A*ˆINPUTS„D0andA0setbyIOSorFHScall,orD0fornon-IOS/FHS.8*’Contentsofallregisterspreserved.‚CCRisdestroyed.*N****************************************************************************** C_EM_PGM:&‰MOVE.L„A0,-(A7)ŒSaveA0onthestack.:‰LEA‡EM_PBLK+4(PC),A0ˆGetaddrtostoreA0inparamblock.0‰MOVE.L„(A7)+,(A0)ŠMoveoldA0intoparamblock.*‰MOVE.L„D0,-(A0)ŒMoveD0intoparamblock.0‰MOVE.L„#2,D0LoadD0with'EMHCALL'indicator."‰TRAP†#4’CalltheLOADER/EMHtask./‰MOVEM.LƒEM_PBLK-B(A4),D0/A0‡Restoreregisters.‰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 ƒ=ARGSPL.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 ƒ=ARGSPL.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*—SPLMODIFICATIONHISTORY*…REVISIONCODEˆ1220844*?*…Theoption(OPT)"PCS"waschangedto"A"infilesSPLFMS.AI,*…SPLINIT.AIandSPLM.AI.**…REVISIONCODEˆ0621844*C*…ModificationsmadetoaccomodaterealtimeRMS.SETASQbitnumberA*…twowasturnedoff.Causedproblemforrealtimeprocessingbut=*…noproblemfor4.3becausebitwasnotchecked.Alsohadto=*…usetheGETTASKNAMEdirectiveduetorealtimeprocessingB*…becauseTCBaddressandnottasknamewasintheeventprocessed'*…bySPL.Thiswasburiedintheevent.*C*…AmultipleregistersaveinstructiontopushregistersA0,A1,and@*…D2ontothestackatthebeginningoftheOUTMSGroutineanda;*…multipleregisterrestoreinstructiontorestorethesame:*…registersattheendoftheOUTMSGroutinewereaddedto@*…SPLM.AI.ThisfixesaproblemthatcausedthespoolertoabortC*…whenmorethanfourprinterdeviceswerelistedinitsqueuefile*…SPLQUEUE.SQ-SPR976*E*…ThelinewhichsetsthelengthoftheopeningmessageinthemoduleA*…SPLINIT.AIwaschangedtoreflectthenewlength.ThechangeinB*…lengthwasduetotheadditionofthenameoftheutilitytothe*…beginningofthemessage.*D*…Hoptionadded-PrintsahelpfilewheneverusermakesanillegalB*…entry.ThemessageisinSPL.SAandtheroutineisinSPLINIT.AI* *œSPLINIT.AIC*…A0ispointedtotheFHSparameterblockbeforetheerrormessageE*…callismade.Thiscausesthecorrecterrormessagetobedisplayed- +*…ifanon-existentvolumenameisentered.* *SPLM.AID*…Twolineswereaddedinthecancelmultipleentriesroutine.TheseA*…twolinesallowuser0todeleteallentriesinthequeue.AlsoB*…theusernumbercheckforanon-zeroFHSUSNwasremovedtoallow/*…user0todeleteallofhisentries.-SPR630*A*…ThenumberofblanklinesprintedonthelastpageofaspoolerA*…outputlistingwaschangedto64sothatthelinesofasterisks¢-«B³J»A*…goalongthepageboundary,makingiteasiertofindtheendof;*…alisting.Thenumberoflinefeedsonthefirstpagewas%*…increasedto48forthesamereason*G*…AroutinewhichcheckesforafilebeingoutputonaspecifieddeviceE*…wasaddedatthebeginningoftheCONTSPLsubroutinetopreventtheG*…continueoptionfromtakingeffectwhileafileisbeingoutput.ThisD*…modificationwasmadesothatthefunctionofthecommandconforms.*…tothedescriptioninthefacilitiesmanual.*F*…AroutinewasaddedattheendofSTRTSPLwhichwillupdateafile'sC*…statusto'WAIT'andnot'READY'ifthefileissenttoaprinterE*…whichisinthewaitstate.ThisfixesaproblemthatgaveafileaE*…readystatus,evenifthedeviceitwassenttowasinawaitstate*F*…TheTSTD7instructionwhichwasafterCONT40intheCONTSPLroutineF*…wasremoved,astheRPLRECroutinereturnsanerrorasNEasopposed&*…toanerrorcodeintheD7register.*D*…AroutinewasaddedattheendofCONTSPLwhichclearstheprinterD*…statusflagafteraCONT,evenifthereisnofilewaitingonthat*…device*9***********************************************************‚.SPLDATASEGMENT*9**********************************************************5SPL.†IDNTƒ3,0.SPLTASKCOPYRIGHT1984MOTOROLA,INC.EŠTTL.SPLSPOOLERTASK‚VER.3.06/21/84COPYRIGHT1984MOTOROLA,INC.**ˆINCLUDEFILES:*–EXE.EQ*–IOE.EQ *–TR1RTCD.EQ*–NIO.EQ*–TR1.EQ*–SPL.EQ*ŠNOLISTŠINCLUDE9995.&.EXE.EQŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.NIO.EQŠINCLUDE9995.&.TR1.EQŠLISTŠINCLUDE9995.&.SPL.EQ ŠSECTION0"DATASG„EQU„*’STARTOFDATASEGMENT*'* RESERVE MEMORY FOR UNINITIALIZED DATA*BŠDC.Bƒ'SPL1220844'ƒDATE,ASMTYPE,OSREV.-1220844-NameaddedŠDS.BƒDATASGL-8**HELPMESSAGE*‰ADDEDFORVERSION0621844*ŠDS.Wƒ0 HELPMSGƒEQU„*2ŠDC.Bƒ'Commandformat:SPL[;H]' ŠDC.Bƒ'‚'ŠDC.Bƒ'where:' ŠDC.Bƒ'‚'H„DC.B'…volumenameisthenameofthevolumeonwhichthespoolerfile'8ŠDC.Bƒ'…willreside.Thereisnodefaultspoolervolume' ŠDC.Bƒ'‚'IƒDC.B'…H-Helpoption.TheHoptionwillprintthismessage.Anyother'ŠDC.Bƒ'‰inputwillbeignored' Š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‘FMSCOMMANDPACKETSCRATCHƒDS.Bƒ154SCRATCHAREAŠDS.Bƒ200STACK SPLSTK„EQU„*JREGS†EQUSCRATCH+REGOFFOFFSETINTOSCRATCHFORREGISTERSSENTTOSUBTASKS*REGS4…EQU„REGS+FOURŠOFFSETFORREGISTERA1%FHSPB…DS.BƒFHSNLNFHSPARAMETERBLOCK%IOSPB…DS.BƒIOSBLNIOSPARAMETERBLOCK4SPLQN…DC.Lƒ0,0TASKNAMEANDSESSIONTHATSTARTEDMESPLFLG„DC.Bƒ0’SPOOLERFLAGS!SPLFLG1ƒDC.Bƒ0’MORESPOOLERFLAGS*CURREC„DC.Lƒ-1‘CURRENTQUEUERECORDNUMBERCQEVT†COMLINEENTRYLNGˆEVENTRECEIVINGAREAANDINITIALCOMMANDLINE"QBUF†DS.BƒQLNGQUEUERECORDBUFFERFSPLDEV„DC.Lƒ0…VOLUMENAMETOUSEFORSPOOERQUEUEFILE&SPOOLERFILES;TERM_FLG‚DC.Wƒ0’USEDFORTERMINATIONLOGIC-ADDED0621844*#*ˆPARAMETERBLOCKFORGETTASKNAME PBTSKIDƒDS.Lƒ1‹TASKID/TASKNAMEPBTSKNMƒDS.Lƒ1‹SESSIONNUMBERENDSPLDƒEQU„*-DATASGŠPAGE. **‚CMDTBL‚COMMANDTABLE-*ŠTABLEOFCOMMANDSTHATTHESPOOLERRECEIVES'*ŠTHRUANEVENTCODE3FROMFMSANDFHS*‚ENTRYSTRUCTURE:‚DC.WCOMMAND'*”DC.LCOMMANDPROCESSORADDRESSOFFSET* CMDTBL„EQU„*ŠDC.WƒFHASGNASSIGNŠDC.Wƒ0ŠDC.WƒFHCLOSCLOSEŠ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ƒSPLQUEQUEUEŠDC.Wƒ7 ŠDC.WƒFHRATTRETREIVEATTRIBUTESŠDC.Wƒ8"CMDTBLEƒEQU„*’ENDOFCOMMANDTABLE CMDTBLEL‚EQU„4’#BYTESPERENTRY**'MSG1†DC.Bƒ'NOQUEUEENTRIES'(16BYTES)DMSG2†DC.Bƒ'DEVICEFORMSIDSTATUS(OK=OKTOOUTPUT,WAIT=WAITINGFOR'ŠDC.Bƒ'CONTINUE)'‡(66BYTES)0MSG4†DC.Bƒ'DEV‚FORMJOBID„VOL‚CATALOG‚FILENAME„'ŠDC.Bƒ'TASKCOPYSTATUS‚';MSG3†DC.Bƒ'NODEVICESWAITINGFORSPOOLINGNOW'(36BYTES)&MSG5†DC.Bƒ'READY‡'…(12BYTES)‚QSTATRDY'MSG6†DC.Bƒ'ACTIVE†'…(12BYTES)‚QSTATACT+MSG7†DC.Bƒ'OUTPUTNOW‚'…(12BYTES)‚QSTATOUT*MSG8†DC.Bƒ'WAIT-CONTƒ'…(12BYTES)‚QSTATWAT+MSG9†DC.Bƒ'WAIT-FORMS‚'…(12BYTES)‚QSTATFRM,MSG10…DC.Bƒ'IOERRD0=‚'…(12BYTES)‚QSTATIOE(MSG11…DC.Bƒ'CANCEL†'…(12BYTES)‚QSTATCANENDATA„EQU„*-1-DATASG**ˆINCLUDEFILES:‚SPLM.AI *˜SPLFMS.AI *˜SPLINIT.AIŠPAGEŠINCLUDESPLM.AIŠINCLUDESPLFMS.AIŠINCLUDESPLINIT.AIéééééŠPAGEŠLIST ŠSECTION8ŠOPT„FRS,MEX,NOCL*H*************************************************************************%*STARTOFCODEFORTHEFMSINTERFACE*H*************************************************************************&*Š**************************************FMSINT1.0012/12/1979HBN6*&*Š*************************************4*‚FMSINTINFERFACESTHESPOOLERTOFHSANDIOSCALLS*/*‚ONENTRY:A0=FMSINTPARAMETERBLOCKADDRESS*ŒA4=BASEADDRESS *ŒBSRFMSINT)*‚ONEXIT:‚ALLREGISTERSUNCHANGEDEXCEPT*ŒD0=0IFNOIOERROR,OR+*‘NONZEROIFIOERROR(=IOERRORSTATUS)*ŒZ-FLAGSETACCORDINGLY*ŒRTS FMSINT„EQU„**3*ŠGETBRANCHADDRESSFORFUNCTIONREQUESTEDINTOA1*7ŠMOVEM.LD1-D7/A0-A6,-(A7)SAVEALLREGISTERSEXCEPTD00ŠMOVE.LA0,A3ŽKEEPPARAMETERBLOCKADDRESSINA36ŠCLR.L‚D0GETCOMMANDCODEFORINDEXINTOBRANCHTABLEŠMOVE.BFMSCMD(A3),D0†.ŠSUB.L‚#1,D0Ž.ORGTO04ŠCMP.B‚#NOCMD,D0ŠCHECKTHATCOMMANDNOTOUTOFRANGE2ŠBCC.S‚FMSER1.ERROR,NOSUCHCOMMANDCODE(.GE.)ŠCMP.B‚#1,D0ŽREADCOMMAND?ŠBEQ.S‚FMSI00YESK…MOVE.L#-1,(DATASG+LRECRD)-DATASG(A4)LASTRECNOTAVAILABLEONOTHERCMDS4FMSI00„LSL.W‚#2,D0ŽD0=BRANCHADDRESSOFFSET(D0*4)'ŠLEA„FMSBRA(PC),A1†BRANCH. ADDRESSTABLE9ŠADD.L‚D0,A1FINALLYA1=SUBROUTINEADDRESSTOBRANCHTO*0*ŠDOCOMMONREGISTERSETUP:USED6-D7,A2-A6*ŠSETRETURNSTATUSTOZERO* ŠMOVE.LA4,A6ŽFMSINTSCRATCHPADMƒLEAFHSPB-DATASG(A4),A2ASSIGN/ALLOC/CLOSEPARABLOCKFORSOURCE/OUTPUTFILECŠLEA„IOSPB-DATASG(A4),A5INPUT/OUTPUTPARAMETERBLOCKFORIOSCALLS#ŠMOVE.L#LINEBL,D6‰LINEBUFFERSIZEŠMOVE.B#'',D7ŒSPACE/ŠCLR.B‚FMSTAT(A3)‰CLEARSTATUSFORGOODRETURNSK…MOVE.LA7,STKPTR(A6)SAVECURRENTSTACKPOINTERFORABORTFROMSUBROUTINES**ŠBRANCHTOSUBROUTINE* ŠJMP„(A1)ŠPAGE*7*ŠSUBROUTINEBRANCHADDRESSTABLE,FMSCMDUSEDASINDEX*FMSBRA„BRA„OPENCD1OPENFILESŠBRA„RDCD2READRECORDSŠBRA„DELCDŽ3DELETERECORDSÃBÌJÔ:ÜLäHìMô9ü1ŠBRA„INSRTCDŒ4INSERTRECORDŠBRA„REPLCD5REPLACERECORD*2NOCMD…EQU„(*-FMSBRA)/4‡NOCOMMANDCANBE.GE.THIS**ŠERRORRETURNS*HFMSER1„MOVE.L#FSTAIF,D0…INVALIDFMSCMDCODE:NOTIMPLEMENTEDORTOOBIG4ŠBRA.S‚FMSERRORINVALIDPARAMETERSPASSEDTOFMSINT3FMSER3„MOVE.L#ISTABO+MN,D0†SOURCERECORDTOOLARGE*ŠOREDITFILERECORDTOOSMALL ŠBRA.S‚FMSERR6FMSER4„MOVE.L#ISTARR+MN,D0†INVALIDKEYINSOURCEFILE7FMSERR„MOVE.BD0,FMSTAT(A3)†SETRETURNCODEFROMFMSINT**ŠRETURNFROMFMSINT*'FMSOKR„CLR.L‚D0‘INDICATEGOODIORETURN2FMSRET„MOVEM.L(A7)+,D1-D7/A0-A6RESTOREREGISTERSŠRTS*2FMSABRTƒMOVE.LSTKPTR(A6),A7†RESTORESTACKPOINTER ŠCLR.L‚D0ŠBRA.S‚FMSRETRETURNŠPAGE****&*Š**************************************ŽOPENCMD1.0012/12/1979HBN6*&*Š*************************************/*ŠONENTRY:A3=FMSINTPARAMETERBLOCKADDRESS9*”A2=FHSPARAMETERBLOCKADDRESSFORSOURCE/OUTPUTFILE"*”A5=IOSPARAMETERBLOCKADDRESS*”A6=FMSINTSCRATCHPAD*”D6=LINEBUFFERSIZE*”D7.B=SPACE *”BRAOPENCMD*-*ŠONEXIT:‚ALLREGISTERSUSED/UNKNOWNEXCEPT:!*”D0=LASTIOS/FHSERRORSTATUS,* OPENCD„EQU„**"*ŠZEROOUTUNINITIALIZEDDATAAREA*)ŠMOVE.L#DATASGL/2,D0†WORDCOUNTTOCLEARŠMOVE.LA6,A0ŽSTARTINGADDRESSOPEN01„CLR.W‚(A0)+ ŠSUB.W‚#1,D0 ŠBNE„OPEN01*;*ŠSETUPTOASSIGNSOURCEFILEWITHSHAREDBUFFER(FORCOPY)*&ŠMOVE.BFMSRECN(A3),EFLUN(A6)FILELUN*C*ŠASSIGNTHESOURCEFILE(ANDALLOCATEIFNECESSARY)WITHEXCLUSIVE *ŠREADACCESS;*ŠDETERMINEATTRIBUTESFORNEWFILEIFNEEDTOALLOCATEONE*O SFHSCO FHASGN,FOPEREW+FOPABF+FOPADR,A2 ASSIGN FOR EXCLUSIVE READ W/SHARED BUFF!ŠMOVE.BEFLUN(A6),D0‡GETFILELUN$ŠMOVE.LFMSBUF(A3),A1†A1->FILENAMEŠMOVE.LA1,A0ŽA0->‚FILENAMEG‰SFATTRFOPISD,VRLFIL,DEFSIZ,KEYSIZ,A2DEFAULTATTRIBUTESIFMUSTALLOC9ŠBSR„ASAFIL‹ASSIGN(ALLOCATEIFNON-EXISTENTFILENAME)ŠBNE„OPNERRIOERROR?*+*ŠSAVESOURCEFILEATTRIBUTESFORLATERUSE*BŠMOVE.LFHSSAD(A2),SRCDBS(A6)SHAREDBUFFERPHYSICALSTARTADDRESSDŠMOVE.LFHSEAD(A2),SRCDBE(A6)SOURCEFILESHAREDBUFFERPHYSICALEND%ŠCLR.L‚D6‘KEEP'FILENAME1'‚KEYLENGTHŠMOVE.BFHSKEY(A2),D6†.IND6#ŠMOVE.BD6,SRCKYZ(A6)†SAVEKEYSIZEŠMOVE.BD6,OUTKYZ(A6)†.ŠCMP.L‚#MXRECL,D6‰KEYERROR? ŠBGE„FMSER4+ŠMOVE.WFHSLRL(A2),D2†RECORDSIZETOOLARGEŠCMP.W‚#MXRECL,D2ŠBGT„FMSER3YES*ŠMOVE.WD2,SRCRCZ(A6)†NO,SAVERECORDSIZEŠMOVE.WD2,OUTRCZ(A6)†.**>ŠCLR.B‚FMSOFS(A3)ˆSETSAVEOUTPUTFILESTATUSFORNOW(OFSSAV)*ŠMOVE.WFHSOPT(A2),D2†GETSOURCEFILETYPE"ŠAND.W‚#FFTBIT,D2‰.ANDKEEPIND2"ŠMOVE.L#FSTADNM,D0ˆEDITOLDFILE? ŠTST.B‚D1‘.ŠBEQ.S‚OPEN20YES'ŠMOVE.L#FSTANNM,D0ˆNO,NEWSOURCEFILE=ŠMOVE.BD1,FMSOFS(A3)†DELETEITIFABORTBEFORESAVE(OFSDEL)@OPEN20„MOVE.BD0,FMSTAT(A3)†RETURNSOURCEFILESTATUSFOREDITOR0ŠCLR.B‚OFSTAT(A1)‰SET'FILENAME1'ASOUTPUTFILEŠPAGE*/*‡EDITFILEREADY,ESTABLISH#OFRECORDSINIT*EŠSIOSCOIOPOST,IOPREC+IOPRAN,A5POSITION/ ATENDOFFILE(GETEOFLRN).ŠMOVE.BEFLUN(A6),IOSLUN(A5)USE‚EDITFILELUN6ŠMOVE.L#-1,D3A-1LRNWITHPOSITIONMEANSEOFWANTEDŠMOVE.LD3,IOSRRN(A5)†.AŠIOSCALL(A5)†POSITIONWILLRETURNLASTLRNINFILEOREOFSTATUSŠBNE.S‚OPN165ERROROREOF?.ŠMOVE.LIOSRRN(A5),D3†NO,GETLASTLRNOFFILE7ŠBRA.S‚OPN175ANDRETURNTOEDITOR,GOCLOSESOURCEFILE,OPN165„CMP.B‚#ISTAEOF,D0ˆNORECORDSINFILE?ŠBNE.S‚OPNERRIOERROR*8*ŠSAVELOGICALRECORDNUMBEROFLASTRECORDINEDITFILE*1OPN175„MOVE.LD3,EOFLRN(A6)†SAVELASTLRNOFFILE6ŠMOVE.LD3,FMSREC(A3)†RETURNITINTHEPARAMETERBLOCK!ŠBRA„FMSOKRGOODRETURNFROMOPENOPNERR„BRA„FMSRETŠPAGE%*Š*************************************ŽASAFIL1.0012/12/1979HBN6*%*Š************************************C*ŠSUBROUTINEASAFILASSIGNSGIVENFILEIFITEXISTS,ELSEAFILEIS*•ALSOALLOCATED***ŠONENTRY:A0->FILENAMETOBEASSIGNED2*”A2->FHSPARAMETERBLOCK;SETUPFORCALLEXCEPT)*šFORFILENAME,LUNANDREAD/WRITECODES *”D0=LUN *”BSRASAFIL**ŠONEXIT:‚ALLREGISTERSUNCHANGEDEXCEPT:&*”D0=LASTIOS/FMSCALLRETURNSTATUS*™Z-FLAGSETACCORDINGLY%*”D1=0IFASSIGNEDATFIRSTTRY,OR.*™1(=OFSDEL)‚IFHADTOALLOCATEFILEFIRST*”RTS* ASAFIL„EQU„**)*ŠMOVEFILENAMEINTOFHSPARAMETERBLOCK*#ŠMOVEM.LA0-A1,-(A7)‡SAVEREGISTERSŠMOVE.BD0,FHSLUN(A2)†SETLUN"ŠLEA„FHSVOL(A2),A1†MOVETOADDRESS'ŠMOVE.L#FILNML/2,D0‡WORDCOUNTTOMOVEASA00…MOVE.W(A0)+,(A1)+ ŠSUB.W‚#1,D0 ŠBNE„ASA00**ŠSETREADANDWRITECODE*ŠTST.W‚(A0)+ŽSKIPRESERVEDWORD1ŠMOVE.W(A0)+,FHSWCD(A2)ƒSETREADANDWRITECODES**ŠTRYTOASSIGNGIVENFILE*-ŠCLR.L‚D1‘ANTICIPATEGOODASSIGNATFIRSTTRY8ŠFHSCALL(A2)ŽASSIGNCALL(ANDALLOCATEIFSOINDICATED)ŠBEQ.S‚ASARETASSIGNOK?+ŠCMP.B‚#FSTANNM,D0ˆNO,FILEDOESNOTEXIST?ŠBNE.S‚ASARETNO,OTHERERROR*5*ŠHAVETOALLOCATENEWFILEBEFORECANHOPETOASSIGN*.ŠMOVE.L#OFSDEL,D1‰INDICATENEWFILEALLOCATED-ŠOR.Wƒ#FHALLO,FHSCMD(A2)TRYTOALLOCATEFILEŠFHSCALL(A2)ŽANDTHENASSIGN,ASARET„MOVEM.L(A7)+,A0-A1‡RESTOREREGISTERSŠRTSŠPAGE**"*Š**********************************ŽRDCMD1.0001/07/79HBN6*"*Š*********************************/*ŠENTRYANDEXITCONDITIONSSAMEASFOROPENCMD** RDCD†EQU„** *ŠINITIALIZE*2ŠMOVE.LFMSBUF(A3),A1†STARTINGLINEBUFFERADDRESS ŠCLR.L‚D1/ŠMOVE.WFMSRECN(A3),D1…GET#OFRECORDSTOREAD+ŠCLR.W‚D2‘0#OFRECORDSTRANSFERRED‚SOFAR/ŠMOVE.LFMSREC(A3),D3†LRNOF1STRECORDTOREAD/ŠMOVE.LEOFLRN(A6),D4†GETLASTLRNINEDITFILEŠBMI.S‚RD40EMPTYFILE? ŠTST.L‚D3‘NO-ŠBMI.S‚RD35READNLASTRECORDSOFFILEIF-11ŠCMP.L‚D4,D3ŽNO,DOES1STRECORDREQUESTEDEXIST?3ŠBGT.S‚RD40NO,RETURNWITHRECORDNOTFOUNDSTATUS**ŠGETONERECORDATATIME*"RD01†CMP.L‚EOFLRN(A6),D3†PASTEOF?ŠBHI.S‚RD25YES,DONEREADING,ŠCLR.L‚D0‘GETRECORDPOSITION‚ANDSETLRECRD;ŠBSR„POSTLR‰BYREADINGINBLOCKCONTAININGREQUESTEDRECORDŠBNE.S‚RDERERROR4RD01A…ADD.W‚#1,D2ŽINCREMENT#OFRECORDSTRANSFERRED**ŠMOVERECORDTOLINEBUFFER* ŠMOVE.L#LINEBL,D6‰RECORDLENGTHRD02†MOVE.B(A0)+,(A1)+ˆMOVEŠSUB.L‚#1,D6ŽDECREMENTCOUNTERŠBNE„RD02BRANCHTILMOVED**ŠREADNEXTRECORD*RD15†SUB.L‚#1,D1ŽDONE?ŠBEQ.S‚RD20YES6ŠADD.L‚#1,D3ŽNO,READNEXTRECORD,GETITSLRNINTOD3RD19†BRA.S‚RD01.RDER†BRA„FMSRETIOERROR**ŠSETRETURNPARAMETERS*+RD20†CLR.L‚D0‘GOODRETURNUNLESSFINDERROR.ŠCMP.L‚EOFLRN(A6),D3†READLASTRECORDOFFILE?ŠBNE.S‚RD30NO1RD25†MOVE.L#ISTAEOF+MN,D0…YES,RETURNEOFSTATUS2ŠMOVE.LEOFLRN(A6),D3†EOFLRNFORLASTRECORDREAD3RD30†MOVE.WD2,FMSRECN(A3)…RETURN#OFRECORDSREAD4ŠMOVE.LD3,FMSREC(A3)†RETURNLRNOFLASTRECORDREAD#ŠMOVE.BD0,FMSTAT(A3)†RETURNSTATUSŠBRA„FMSOKRGOODRETURN*!*ŠREADNLASTRECORDSOFTHEFILE*.RD35†MOVE.LD4,D0ŽGETSTARTINGLRNFORREADING8ŠCLR.L‚D3ŽREADFROMTOPOFFILEIFREQUESTEDALLORMORE)ŠADD.L‚#1,D0Ž.RECORDSTHANFILECONTAINS/ ŠCMP.L‚D0,D1Ž.ŠBGE.S‚RD19READFROMTOP?.ŠSUB.L‚D1,D0ŽNO,STARTREADINGFROMEOFLRN+1-NŠMOVE.LD0,D3Ž.ŠBRA„RD19GOREAD*=RD40†MOVE.L#ISTARN+MN,D0†1STRECORDREQUESTEDDOESNOTEXISTŠBRA.S‚RD30RETURNŠPAGE**ŽDELCMD1.0001/07/79HBN6*/*ŠENTRYANDEXITCONDITIONSSAMEASFOROPENCMD(*ŠCHECKPOINTINGISDONEAFTERTHEDELETE DELCD…EQU„** *ŠINITIALIZE*ŠCLR.L‚D1‘CLEARFORUSE1ŠMOVE.WFMSRECN(A3),D1…GET#OFRECORDSTODELETE'ŠCLR.W‚D2‘0#OFRECORDSDELETEDSOFAR6ŠMOVE.LFMSREC(A3),IOSRRN(A5)LRNOFRECORDSTODELETE2ŠMOVE.LEOFLRN(A6),D0†EMPTYFILE?(EOFLRN=-1?)'ŠBMI.S‚DEL25ŽYES,CAN'TDELETEANYTHING#ŠCMP.L‚FMSREC(A3),D0†RECORDEXISTS?4ŠBLT.S‚DEL25ŽNO,RETURNWITHRECORDNOTFOUNDSTATUS**ŠDELETEONERECORDATATIME*.ŠSIOSCOIODELR,IOPRAN,A5ƒDELETERANDOMLOGICAL2ŠMOVE.BEFLUN(A6),IOSLUN(A5)DELETEFROMEDITFILE DEL00…EQU„*ŠIOSCALL(A5)ŽDELETE$ŠBNE.S‚DEL10ŽIOERRORORENDOFFILE**ŠDELETENEXTRECORD*1ŠSUB.L‚#1,EOFLRN(A6)†UPDATELASTLRNOFEDITFILE+ŠADD.W‚#1,D2ŽINCREMENT#OFRECORDSDELETED"ŠSUB.W‚#1,D1ŽGODELETENEXTRECORD ŠBNE„DEL00*/*ŠSETEOFSTATUSIFDELETEDLASTRECORDOFFILE*,ŠMOVE.LEOFLRN(A6),D0†GETLRNOFLASTRECORD>ŠCMP.L‚FMSREC(A3),D0†LASTRECORDDELETEDIFEOFLRN.LT.FMSREC%ŠBLT.S‚DEL20ŽLASTRECORDSTILLTHERE?ŠBRA.S‚DEL15ŽNO'DEL10…CMP.B‚#ISTAEOF,D0ˆATENDOFFILE?ŠBNE„FMSRETNO,IOERROR9DEL15…MOVE.B#ISTAEOF,FMSTAT(A3)YES,DELETEDLASTRECORD**ŠSETRETURNPARAMETERS*7DEL20…MOVE.WD2,FMSRECN(A3)…RETURN#OFRECORDSDELETED:ŠMOVE.LEOFLRN(A6),FMSREC(A3)RETURNLASTLSNINEDITFILE:ŠMOVE.B#EFSCHG,FMSEFS(A3)SETEDITFILESTATUSASCHANGED ŠMOVE.LD0,-(A7)‹SAVECURRENTD0 ŠBSR.S‚CKPTCDGODOACHECKPOINTŠMOVE.LD0,(A7)+‹RESTORED0ŠBRA„FMSOKRGOODRETURNEMPTYFILE/ŠBMI„INSR35RETURNRECORDDOESNOTEXISTSTATUSŠBRA.S‚INSREPLŒGOREPLACE*4*ŠCHECKPOINTINGISDONEAFTERAREPLACEORANINSERT*!*Š*********************************INSRTCMD1.0001/07/80*!*Š********************************6*ŠENTRYANDEXITCONDITIONSSAMEASFOROPENCMD‚EXCEPT8*ŠONENTRY:D1=0‚IFINSREPLENTRYELSEWILLSETD1=1* INSRTCDƒEQU„** *ŠINITIALIZE* ŠMOVE.L#1,D1ŽSETFLAGTOINSERT*9INSREPLƒEQU„*’ENTRYPOINTIFTOREPLACEINSTEADOFINSERT*G‰MOVE.LFMSREC(A3),D3INSERTAFTERRECORDWITHTHISLRN,ORATTOPIF-1=ŠMOVE.LFMSBUF(A3),A0†A0->RECORDTOBEINSERTEDORREPLACED1ŠMOVE.LA0,IOSSAD(A5)†SETSTARTINGRECORDADDRESS4ŠMOVE.LA0,IOSEAD(A5)†PREPAREFORBUFFERENDADDRESS'ŠADD.L‚#LINEBL,IOSEAD(A5)ADDINLENGTH'ŠSUB.L‚#1,IOSEAD(A5)†ACTUALENDADDRESS*!*ŠPOSITIONATLRNGIVENTOINSERT*2ŠMOVE.BEFLUN(A6),IOSLUN(A5)INSERTINTOEDITFILEŠMOVE.LD3,IOSRRN(A5)†SETLRN)ŠCMP.L‚EOFLRN(A6),D3†GIVENRECORDEXISTS?)ŠBGT.S‚INSR35NO,RETURNRECORDNOTFOUND+ŠTST.L‚D1‘REPLACERECORDINSTEADOFINSERT?#ŠBEQ.S‚INSR20YES,SKIPPOSITIONING8ŠCMP.L‚EOFLRN(A6),D3†WRITEFIRSTORLASTRECORDOFFILE?ŠBEQ.S‚INSR40YES,GOWRITE>ŠSIOSCOIOPOST,IOPRAN,A5ƒNO,POSITIONATRANDOMLOGICALRECORD ŠTST.L‚D3‘INSERTATTOPOFFILE?ŠBGE.S‚INSR15NO/ŠCMP.L‚#-1,D3.INVALIDLRN=>RECORDNOTFOUNDŠBNE.S‚INSR35.5ŠCLR.L‚IOSRRN(A5)‰YES,POSITIONAT1STRECORDOFFILE IN0 SR15„EQU„*ŠIOSCALL(A5)ŽPOSITIONŠBNE.S‚INSERRIOERROR*:*ŠINSERTRECORDAFTERCURRENTPOSITIONORINFRONTOFFILE*ŠORREPLACEGIVENRECORD*DŠSIOSCOIOWRIT,IOPPRV+IOPIMG,A5WRITEPRIORIFINSERTATTOPOFFILEŠTST.L‚D3‘INSERT1STRECORD?ŠBMI.S‚INSR20YES.ŠSIOSCOIOWRIT,IOPNXT+IOPIMG,A5NO,WRITENEXT4INSR20„IOSCALL(A5)ŽWRITE=INSERT,UPDATE=REPLACEŠBEQ.S‚INSR25IOERROR?INSERR„TST.B‚D0‘YESŠBRA„FMSRETIOERRORRETURNŠPAGE**ŠSETRETURNPARAMETERS*=INSR25„MOVE.B#EFSCHG,FMSEFS(A3)SETEDITFILECHANGEDSTATUSŠTST.L‚D1‘REPLACEDRECORD?ŠBEQ.S‚INSR30YES,RETURN/ŠADD.L‚#1,D3ŽNO,INSERTED,GETNEWRECORD'SLRNŠMOVE.LD3,FMSREC(A3)†.(ŠADD.L‚#1,EOFLRN(A6)†INSERTEDONERECORDDINSR30„CMP.L‚EOFLRN(A6),D3†INSERTEDORREPLACEDLASTRECORDOFFILE?ŠBNE.S‚INSRETNO-ŠMOVE.B#ISTAEOF,FMSTAT(A3)SETSTATUSTOEOFŠMOVE.LD0,-(A7)‹SAVED0 ŠBSR„CKPTCDGODOTHECHECKPOINTŠMOVE.L(A7)+,D0‹RESTORED0INSRET„BRA„FMSOKRGOODRETURNBINSR35„MOVE.B#ISTARN,FMSTAT(A3)SETLRNOUTOFBOUNDSRETURNFLAG ŠBRA.S‚INSRET*$*ŠWRITEFIRSTORLASTRECORDOFFILE* INSR40„EQU„*,ŠSIOSCOIOWRIT,IOPRAN+IOPIMG,A5WRITERANDOM&ŠADD.L‚#1,IOSRRN(A5)†LRNIS‚0OREOF+1ŠBRA„INSR20GOWRITEŠPAGE%*Š*************************************POSTLR1.0001/07/80HBN6*%*Š************************************C*ŠSUBROUTINEPOSTLRPOSITIONSTORECORDWITHGIVENLRNINEDITFILE7*•SHAREDBUFFERANDSETSLRECRDANDLRECBAIFREQUESTED,*•(TOBECALLEDFOREDITFILEPOSITIONONLY)*F*ŠONENTRY:D0=1IFTOLEAVELRECRDALONE,0IFTOSETLRECRD/LRECBA *”D3=LRN *”BSRPOSTLR**ŠONEXIT:‚ALLREGISTERSUNCHANGEDEXCEPT:;*”A0->RECORDINSHAREDBUFFER,BCTANDKEYFIELDSSKIPPED*”D0=IOSCALLSTATUS*”Z-FLAGSETACCORDINGLY*”RTS* POSTLR„EQU„**'*ŠSETPARAMETERSINIOSPARAMETERBLOCK*ŠMOVE.LD0,D4ŽSAVELRECRDFLAG0ŠSIOSCOIOPOST,IOPRAN,A5ƒRANDOMLOGICALPOSITION,ŠMOVE.LD3,IOSRRN(A5)†SETLRNTOPOSITIONTO ŠMOVE.BEFLUN(A6),IOSLUN(A5)LUN ŠIOSCALL(A5)ŠBNE.S‚POSTL1ERRORRETURNŠMOVE.LSRCDBS(A6),A0!ŠADD.L‚IOSLEN(A5),A0†A0->RECORD)ŠTST.B‚D4‘UPDATELRECRD/LRECBAREQUESTED?ŠBNE.S‚POSTL1NO9ŠMOVE.LD3,LRECRD(A6)†YES,UPDATECURRENTRECORDPOSITION1ŠMOVE.LA0,LRECBA(A6)†SETRECORD'SBUFFERADDRESSN‚MOVE.LSRCDBE(A6),SRCDBL(A6)SETLOGICALENDATENDOFBUFFER(0-WORD=>END)!POSTL1„TST.L‚D0‘RESTOREIOSTATUSŠRTS*ééŠPAGE*>****************************************************************‚INITIALSPOOLERSTART-UP*;*ˆREGISTERA4ISUSEDTHROUGHOUTSPLASABASEADDRESSREG.9*ˆREGISTERA3ISUSEDINTHISSEGMENTASTHEBASEADDRESS*”OFTHEMAINPROGRAMSEGMENT**‚A)GETANASQ5*‚B)GETTHEVOLUMENAMETOUSEFORTHESPOOLERVOLUME7*‚C)OPENTHESPOOLERQUEUEFILE-CREATEONEIFNECESSARY%*‚D)STARTSPOOLEROUTPUTIFANYTODO*‚E)CLOSELUN59*‚F)SENTTERMINATIONMESSAGETOTASKTHATSTARTEDME(SCT)8*‚G)GOTOSPL160SOTHATTHISSEGMENTCANBEDEALLOCATED**‚SPOOLERQUEUEFILECOMMENTS:7*‚THESPOOLERQUEUEISANINDEXEDSEQUENTIALFILE,FIXED7*‚LENGTHRECORDS.ITRESIDESONTHESPOOLERVOLUME.ALL8*‚SPOOLERQUEUEI/OISHANDLEDBYTHESUBROUTINEFMSINT.;*‚THESPOOLERQUEUEENTRYLAYOUTISDOCUMENTEDINSPLEQU.SA;*‚FILE.THEQUEUEENTRIESAREAMIXTUREOFASCIIANDBINARY<*‚FIELDS.RECORDS0-9ARERESERVEDFORTHESPOOLERTASKONLY>*‚ANDDONOTCONTAINFILEENTRIES.RECORDS0-8CON0 TAINATABLE:*‚OFDEVICES,FORMSID,ANDDEVICESTATUS.THEFIRST2BYTES;*‚OFRECORD9CONTAINSTHELASTJOBNUMBER.JOBNUMBERSARE7*‚1-9999ANDROLLSTARTOVERATONEUPONREACHING9999.>**************************************************************** ŠSECTION9ŠOPT„FRS,MEX,NOCLSPL‡EQU„*’ENTRYPOINT,ŠMOVE.LD0,D2ŽSAVETASKNAMETHATSTARTEDME*ŠMOVE.LD1,D3ŽSAVESESSIONTHATSTARTEDMECŠLEA„GTADRPB(PC),A0PARA.BLOCKADDRESSTOGETDATASEGMENTADDRESS6ŠMOVE.L#RCVSA,D0ŠRECEIVESEGMENTATTRIBUTESDIRECTIVE!ŠTRAPƒ#1‘GETDATASEGMENTADDRESS0ŠBNE„SPL70ŽBRANCHIFANERRORRETURNED,TERMINATE'ŠMOVE.LA0,A4ŽSAVEDATASEGMENTADDRESS'ŠLEA„SPLSTK-DATASG(A4),A7STACKPOINTERJ†MOVEM.LD2-D3,SPLQN-DATASG(A4)SAVETASKNAMEANDSESSIONTHATSTARTEDME=ŠLEA„GTADRPB1(PC),A0„GETMAINSEGMENTADDRESSPARAMETERBLOCK,ŠMOVE.L#RCVSA,D0ŠRECEIVESEGMENTATTRIBUTESŠTRAPƒ#1‘GETTHEADDRESS)ŠBNE„SPL70ŽBRANCHIFANERRO,GOTERMINATE'ŠMOVE.LA0,A3ŽSAVEMAINPROGRAMADDRESS1 627%<->5@=(ŠLEA„IOSPB-DATASG(A4),A0OUTPUTREVDATE ŠMOVE.W#IOWRIT,IOSFCT(A0)WRITE$ŠMOVE.W#IOPFOR,IOSOPT(A0)FORMATTEDŠMOVE.B#LDFLUN,IOSLUN(A0)LUN+ŠMOVE.LA4,IOSSAD(A0)†MESSAGESTARTADDRESS(ŠMOVE.LA4,IOSEAD(A0)†SETUPENDADDRESS3ŠADD.L‚#11,IOSEAD(A0)…ACTUALENDADDRESS-0621844ŠTRAPƒ#2‘OUTPUTDATE,ETC.ŠBNE„SPL60ŽERRORRETURN"ŠCMP.L‚#0,A2ŽSEEIFTHISISUSER0 ŠBEQ.S‚SPL10ŽBRANCHIFUSER0,OK<ŠLEA„IOSPB-DATASG(A4),A0NOTUSER0,ERRORSETUPFORMESSAGE'ŠLEA„ERRM2(PC),A1‡ERRORMESSAGEADDRESS+ŠMOVE.LA1,IOSSAD(A0)†ERRORMESSAGEADDRESSŠLEA„ERRM2E(PC),A1†ENDADDRESS!ŠMOVE.LA1,IOSEAD(A0)†ENDADDRESS0ŠBRA„SPL69ŽGOOUTPUTERRORMESSAGEANDTERMINATE5SPL10…LEA„FHSPB-DATASG(A4),A0PARAMETERBLOCKADDRESSŠMOVE.LA0,A1ŽADDRESS%ŠCLR.L‚(A1)+ŽTASKNAMEFORGETANASQŠCLR.L‚(A1)+ŽSESSIONO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*MOVE.B#2,(A1)+‚STATUS ŠCLR.B‚(A1)+*œSTATUSO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<(ŠMOVE.B#ENTRYLNG,(A1)+„MAXENTRYLENGTH'ŠMOVE.L#ENTRYLNG*12,(A1)+QUEUELENGTHŠMOVE.LA3,(A1)ŒASRADDRESSŠMOVE.L#GTASQ,D0ŠDIRECTIVEŠTRAPƒ#1‘GETTHEASQ*ŠBNE„SPL60ŽBRANCHIFANERROR-GOTERMINATE**‚GETTHESPOOLERVOLUMENAME*ŠTST.L‚D6‘ACOMMANDLINE?-ŠBEQ„LISTHŽPRINTHELPOPTIONIFNO-06218445ŠCMP„#6,D6ŽINPUTCANNOTBE>6(INCLUDESCOLONANDCR)7ŠBGT„LISTHBRANCHIFGREATERTOHELPMESSAGE-0621844ŠBSR„GTINPTGOPARSETHEINPUT;ŠBMI„LISTH‰ERRORINPARSING-PRINTHELPMESSAGE-06218442ŠMOVE.W#FHDVOL,FHSCMD(A0)SETDEFAULTVOLUMENAME)ŠMOVE.W#FOPDSP,FHSOPT(A0)SPOOLERVOLUMEŠTRAPƒ#3‘DOIT)ŠBNE„SPL60ŽBRANCHIFANERROR,CAN'TSPOOL=ŠMOVE.LFHSVOL(A0),SPLDEV-DATASG(A4)SAVESPOOLERVOLUMENAME**‚GETSPOOLERQUEUEFILE*‚LUN=1‚VOLN=CONTENTSOFSPLDEV-*‚USINGFMSINTFORALLSPOOLERQUEUEFILEI/O*/ŠLEA„FMSPKT-DATASG(A4),A0FMSINTPACKETADDRESS-ŠMOVE.B#OPENCMD,FMSCMD(A0)OPENFILECOMMAND"ŠLEA„SCRATCH-DATASG(A4),A1ADDRESSBŠMOVE.LA1,FMSBUF(A0)…ADDRESSOFSPOOLERQUEUEFILENAMEFORFMSINT$ŠMOVE.W#$0100,FMSRECN(A0)USELUN1/ŠLEA„SCRATCH-DATASG(A4),A1GETFILENAMEADDRESS"ŠMOVE.LA1,A2ŽSAVESCRATCHADDRESS9ŠMOVE.L#14,D0NUMBEROFLONGWORDSTOCLEARFORFILENAME1SPL80…CLR.L‚(A1)+ŽCLEARSCRATCHAREAFORFILENAMEŠSUB.L‚#1,D0ŽDECREMENTCOUNTŠBNE„SPL80Ž56BYTESTOCLEAR3ŠMOVE.LSPLDEV-DATASG(A4),(A2)+SPOOLERVOLUMENAMEŠMOVE.W#0,(A2)+‹USERNUMBER0ŠMOVE.L#BLANK,(A2)+‡CATALOGŠMOVE.L#BLANK,(A2)+‡CATALOG'ŠMOVE.L#'SPLQ',(A2)+†FILENAME=SPLQUEUE&ŠMOVE.L#'UEUE',(A2)+†RESTOFFILENAME ŠMOVE.W#'SQ',(A2)+ˆEXTENSION=SQI‡LEAFMSINT-SPLEVNT(A3),A6GODOTHEASSIGNANDIFNECESSARYTHEALLOCATEŠJSR„(A6)GODOIT+ŠBEQ.S‚SPL85ŽNOERROR-CONTINUE-06218441 HˆLEAFHSPB-DATASG(A4),A0A0POINTSTOCORRECTPARAMETERBLOCK-0621844*ŠBRA„SPL60ŽOUTPUTERRORMESSAGE-06218444SPL85…CMP.B‚#FSTANNM,FMSTAT(A0)NEWFILE?-0621844*ŠBNE.S‚SPL120BRANCHIFNOTNEW,SEEIFOLD*-*‚HEREIFJUSTCREATEDTHESPOOLERQUEUEFILE0*‚RESERVEDRECORDS0-9FORDEVICE,FORMSIDTABLE*/SPL90…LEA„QBUF-DATASG(A4),A1GETBUFFERADDRESS$ŠMOVE.L#QLNG/2,D1‰#WORDSINBUFFER#SPL100„CLR.W‚(A1)+ŽCLEARTHEBUFFER"ŠSUB.L‚#1,D1ŽDECREMENTTHECOUNTER ŠBNE.S‚SPL100BRANCHTILCLEARED.ŠLEA„QBUF-DATASG(A4),A1RESTOREBUFFERADDRESS)ŠCLR.L‚D7‘STARTINSERTAT1STFILERECORDŠMOVE.LD7,D1ŽCOUNTERHSPL110„LEA„INSRTREC-SPLEVNT(A3),A6INSERTACLEAREDRECORDTOQUEUEFILEŠJSR„(A6)GODOITŠTST„D7‘GOODINSERT?ŠBNE„SPL60ŽERRORRETURN,ŠADD.L‚#1,D1ŽINCREMENTTONEXTRECORDNUMBER*ŠMOVE.LD1,D7ŽNEXTRECORDNUMBERTOINSERT$ŠCMP.L‚#10,D1INSERTALL10RECORDS?-ŠBLT„SPL110BRANCHTIL10RECORDSINTHEFILE)ŠBRA.S‚SPL130GOSEEIFANYTHINGTOSTART*SPL120„CMP.B‚#FSTADNM,FMSTAT(A0)OLDFILE?(ŠBNE„SPL60ŽSOMEOTHERERROR-CANNOTSPOOL:ŠTST.L‚FMSREC(A0)‰ANYRECORDSINTHEFILE?(-1=NORECORDS)-ŠBMI.S‚SPL90ŽBRANCHIFNORECORDSINTHEFILE*?* SEE IF ANYTHING WAS BEING OUTPUT THAT HAS TO BE STARTED AGAIN*)SPL130„MOVE.L#-1,D7LOOKFORALLENTRIESŠCLR.L‚D6‘ANYDEVICEŠCLR.L‚D5‘ANYFORMSID1ŠMOVE.LCURREC-DATASG(A4),D4STARTATTOPOFFILE:ŠLEA„FNDENTRY-SPLEVNT(A3),A6GOLOOKFORANENTRYTOSTARTŠJSR„(A6)GODOITŠTST„D7‘FOUNDONE?6ŠBMI.S‚SPL140BRANCHIFDIDN'TFINDONETOSTARTAGAIN)ŠLEA„QSTAT(A1),A5‡GETSTATUSBYTEADDRESSŠBTSTƒ#QSTATCAN,(A5)…TOCANCEL?ŠBEQ.S‚SPL131BRANCHIFNO3ŠLEA„DELENTRY-SPLEVNT(A3),A6DELETETHEQUEUEENTRYŠJSR„(A6)GODOIT+ŠLEA„DELFILE-SPLEVNT(A3),A6DELETETHEFILEŠJSR„(A6)GODOITŠBRA„SPL130GOGETNEXTENTRY(SPL131„BTSTƒ#QSTATOUT,(A5)…BEINGOUTPUT?ŠBNE.S‚SPL134BRANCHIFNO'SPL132„CLR.B‚(A5)CLEARTHESTATUSFLAG3SPL133„BSETƒ#QSTATRDY,(A5)…MAKEITREADYFOROUTPUT<ŠLEA„RPLREC-SPLEVNT(A3),A6PUTUPDATEDRECORDBACKINTOFILEŠJSR„(A6)GODOITŠBRA„SPL130GETNEXTRECORD"SPL134„BTSTƒ#QSTATACT,(A5)…ACTIVE?ŠBEQ.S‚SPL132BRANCHIFNO!ŠCLR.B‚(A5)CLEARTHESTATUSFLAG ŠCLR.L‚QSIZE(A1)ŠFORCEZEROSIZEŠCLR.L‚D7‘CLEARFORUSE+ŠLEA„MTCDF-SPLEVNT(A3),A6GOSETFORMSBITSŠJSR„(A6)GODOIT'ŠBRA„SPL133GOMAKEITREADYFOROUTPUT>SPL140„MOVE.L#-1,CURREC-DATASG(A4)SETPOINTERTOTOPOFFILE ŠCLR.L‚D1‘STARTRECORD#TOREAD6P05‡LEA„RDRES-SPLEVNT(A3),A6GOREADARESERVEDRECORDŠJSR„(A6)GODOITŠBNE„SPL60ŽERRORRETURN%ŠMOVE.L#RREC,D2‹#ENTRIESPERRECORD,P10‡MOVE.LRDEV(A2),D3ˆGETDEVICE(TASK)NAMEŠTST.L‚D3‘ANYTHERE?)ŠBEQ.S‚SPL150BRANCHIFNO,DONEWITHTHISŠMOVE.L#4,D4ŽCOUNTERFORTERMT3P20‡LEA„FHSPB-DATASG(A4),A0PARAMETERBLOCKADDRESS%ŠMOVE.L#TERMT,D0ŠTERMINATETHISTASKŠMOVE.LD3,(A0)ŒTASKTOTERM#ŠMOVE.L#MYSES,4(A0)‡SESSIONNUMBERŠTRAPƒ#1‘DOITŠBEQ.S‚P30TERMTTOOK ŠCMP.B‚#3,D0ŽTASKDOESN'TEXIST?"ŠBEQ.S‚P40BRANCHIFDOESN'TEXISTŠCMP.B‚#6,D0ŽBEINGTERMED?%ŠBNE„SPL60ŽBRANCHIFSOMEOTHERERROR&P30‡SUB.L‚#1,D4ŽDECREMENTTERMCOUNTER'ŠBGT.S‚P35BRANCHIFGOINGTOTRYAGAIN1ŠLEA„IOSPB-DATASG(A4),A0SETUPFORERRORMESSAGE'ŠLEA„ERRM3(PC),A1‡ERRORMESSAGEADDRESS(ŠMOVE.LD3,(A1)ŒTASKNAMETOTHEMESSAGE.ŠMOVE.LA1,IOSSAD(A0)†STARTADDRESSOFMESSAGEŠLEA„ERRM3E(PC),A1†ENDADDRESS,ŠMOVE.LA1,IOSEAD(A0)†ENDADDRESSOFMESSAGE'ŠBRA„SPL69ŽOUTPUTMESSAGEANDTERMSELF%P35‡MOVE.L#RELINQ,D0‰REL.FORAWHILEŠTRAPƒ#1‘DOITŠBRA„P20TERMTILTASKISGONE&P40‡SUB.L‚#1,D2ŽDECREMENT#OFENTRIES#ŠBEQ.S‚P50BRANCHIFMUSTREADNEXT#ŠADD.L‚#RLNG,A2‹POINTTONEXTENTRYŠBRA„P10CHECKNEXTENTRY#P50‡ADD.L‚#1,D1ŽBUMPTONEXTRECORDŠCMP.L‚#8,D1ŽDONE?ŠBLE„P05BRANCHIFNOTDONESPL150„CLR.L‚D7‘CLEARFORUSE8ŠMOVE.B#QSTATRDY,D7‡NOWLOOKFORA'NEW'FILETOOUTPUTŠCLR.L‚D6‘ANYDEVICEŠCLR.L‚D5‘ANYFORMSID1ŠMOVE.LCURREC-DATASG(A4),D4STARTATTOPOFFILE6ŠLEA„FNDENTRY-SPLEVNT(A3),A6GOLOOKFORAREADY1 ENTRYŠJSR„(A6)GODOITŠTST„D7‘FOUNDONE?ŠBMI.S‚SPL155BRANCHIFNO9ŠLEA„STRTSPL-SPLEVNT(A3),A6GOSTARTTHISFILEFOROUTPUTŠJSR„(A6)GODOIT.ŠBRA„SPL150GOLOOKFORANOTHERENTRYTOSTART**‚CLOSELUN5AND6*6SPL155„LEA„FHSPB-DATASG(A4),A0PARAMETERBLOCKADDRESS(ŠMOVE.W#FHCLOS,FHSCMD(A0)CLOSECOMMAND'ŠMOVE.B#CDFLUN,FHSLUN(A0)LUNTOCLOSEŠTRAPƒ#3‘DOITŠBNE.S‚SPL60ŽERRORRETURN ŠMOVE.B#LDFLUN,FHSLUN(A0)LUN6ŠTRAPƒ#3‘CLOSEITŠBNE.S‚SPL60ŽERRORRETURN*!* SEND TERMINATION MESSAGE TO SCT*0ŠLEA„FHSPB-DATASG(A4),A0PARAMETERBLOCKADDRESS5ŠMOVE.LSPLQN-DATASG(A4),(A0)+TASKNAMETOTHEEVENT(ŠMOVE.LSPLQN+4-DATASG(A4),(A0)+SESSIONŠCLR.W‚(A0)+ŽNOOPTIONS%ŠLEA„QEVT-DATASG(A4),A1EVENTADDRESSŠMOVE.LA1,(A0)+‹EVENTADDRESSŠCLR.L‚(A0)NOSERVICEVECTORŠMOVE.LA1,A0ŽGETEVENTADDRESSŠMOVE.B#24,(A0)+ŠEVENTLENGTHŠMOVE.B#5,(A0)+‹EVENTCODE!ŠMOVE.L#SPLID,(A0)+‡MYTASKNAMEŠMOVE.L#MYSES,(A0)+‡SESSIONŠCLR.L‚(A0)+ŽTASKŠCLR.L‚(A0)+ŽSESSION1ŠMOVE.B#1,(A0)+‹NOABORTCODE-NORMALTERMINATION0ŠLEA„FHSPB-DATASG(A4),A0PARAMETERBLOCKADDRESS'ŠMOVE.L#QEVNT,D0ŠQUEUEEVENTDIRECTIVE(ŠTRAPƒ#1‘MAKETHEMONITORTHINKI'MGONE(ŠBNE.S‚SPL60ŽBRANCHIFANERRORRETURNEDAŠLEA„SPL160-SPLEVNT(A3),A6GOODRETURN,GODEALLOCATETHISSEGMENTŠJMP„(A6)GODOIT**‚ERRORTERMINATIONHERE*0SPL60…LEA„SCRATCH-DATASG(A4),A1USESCRATCHAREA/ŠMOVEM.LD0/A0,EM_D0(A1)ƒSAVETHESE2REGISTERS.ŠMOVE.LA1,A0ŽADDRESSFORERRORMESAGEHANDLERŠCLR.B‚EM_OPT(A0)‰NOOPTIONSŠMOVE.B#LDFLUN,EM_TLUN(A0)LUNŠCLR.B‚EM_QRC(A0)‰NOQUERYŠCLR.L‚EM_SPA(A0)‰NOUSERTEXTŠCLR.L‚EM_EPA(A0)‰NOUSERTEXT(ŠMOVE.L#2,D0ŽCALLERRORMESSAGEHANDLERŠTRAPƒ#4‘DOITŠBRA.S‚SPL70ŽERRORRETURN)SPL69…SIOSCOIOWRIT,IOPASC,A0ƒWRITEASCIIŠMOVE.B#LDFLUN,IOSLUN(A0)LUN'ŠTRAPƒ#2‘OUTPUTTHEMESSAGE-NOSPOOLINGDSPL70…MOVE.W#$C000,TERM_FLG-DATASG(A4)ERRORTERMINATION-0620844ŠBRA„TERMINAT‹0621844ERRM2…DC.Bƒ'MUSTBEUSER0'ERRM2E„EQU„*-13ERRM3…DC.Bƒ'…NOTTERMINATED-SPOOLINGNOTINITIATED'ERRM3E„EQU„*-1GTADRPBƒDC.Lƒ0,0TASK,SESSION4ŠDC.Wƒ$2000,0ŒRETURNLOGICALADDRESSINA0,NOBUFFERŠDC.Lƒ'SPLD',0,0,0‡SEGMENTNAMEGTADRPB1‚DC.Lƒ0,0TASK,SESSION4ŠDC.Wƒ$2000,0ŒRETURNLOGICALADDRESSINA0,NOBUFFERŠDC.Lƒ'SPLP',0,0,0‡SEGMENTNAMEŠPAGE*5*‚GTINPT‚GETINPUTSUBROUTINE,PARSETHEINPUTANDPUT*ŠINTOTHEPARAMETERBLOCK*‚ENTRY:D6=INPUTLENGTH *ˆQEVT=INPUT* EXIT:D0=-1=ERROR RETURN#*†D0=0=GOODRETURN,A0=FHSPBADDRESS*‚USES:01234567 *…DR**‡* *…AR**** GTINPT„EQU„*?ŠLEA„FHSPB-DATASG(A4),A0GETPARAMETERBLOCKADDRESSFOROUTPUT+ŠMOVE.L#4,D2Ž#CHARSTOMOVETOPARABLOCK%ŠLEA„QEVT-DATASG(A4),A1INPUTADDRESS!ŠLEA„FHSVOL(A0),A2†OUTPUTADDRESS+ŠMOVE.B(A1)+,D1‹THISCHAR=1STCHAROFNAME ŠCMP.B‚#CR,D1ACARRIAGERETURN?"ŠBEQ.S‚GTINERRŒBRANCHIFYES,ERROR%ŠCMP.B‚#'A',D1Œ1STCHARMUSTBEALPHAŠBLT.S‚GTINERRŒERRORIFISN'TŠCMP.B‚#'Z',D1ŒSEEIFALPHAŠBGT.S‚GTINERRŒERRORIFISN'T-GTIN40„MOVE.BD1,(A2)+‹GOODCHARACTER,SAVEIT&ŠSUB.L‚#1,D2Ž#CHARSREMAININGFORNAME&ŠSUB.L‚#1,D6Ž#CHARSREMAININGININPUT!ŠBLE.S‚GTIN50BRANCHIFNONELEFTŠMOVE.B(A1)+,D1‹GETNEXTCHARŠCMP.B‚#':',D1ŒSEEIFACOLONŠBEQ.S‚GTIN80BRANCHIFACOLONŠCMP.B‚#CR,D1SEEIFACR#ŠBNE.S‚GTIN40BRANCHIFNOT,SAVEIT$GTIN50„TST.L‚D2‘ALL4CHARACTERSIN?ŠBNE.S‚GTIN70BRANCHIFNO"GTIN60„CLR.L‚D0‘SETTOGOODRETURNŠRTS—RETURNTOCALLER>INERRƒMOVE.L#-1,D0SETERRORRETURNŠRTS—RETURNTOCALLER>IN70„MOVE.B#'',(A2)+‰BLANKTONAMEŠSUB.L‚#1,D2ŽDECREMENTCOUNT ŠBGT„GTIN70BRANCHIFMORETODO$ŠBRA„GTIN60GOSEEIFENDANDRETURN1GTIN80„SUB.L‚#1,D6ŽDECREMENTNUMBEROFCHARSLEFT!ŠBEQ„GTIN50OK,NOMORECHARACTERS#ŠMOVE.B(A1)+,D1‹GETNEXTCHARACTER ŠCMP.B‚#CR,D1ACARRIAGERETURN?ŠBEQ„GTIN50BRANCHIFYES,OK&ŠBRA„GTINERRŒERROR-TOOMANYCHARACTERS1**************************************************2*‰LISTH-PRINTSHELPMESSAGEANDEXITS-0621842 4*1************************************************* LISTH…EQU„*,ŠLEA„HELPMSG-DATASG(A4),A2STARTOFHELPMSG0ŠLEA„HELPLEN-DATASG(A4),A1TABLEOFLINELENGTHS,ŠLEA„IOSPB-DATASG(A4),A0IOSPARAMETERBLOCK3PLINE…MOVE.LA2,IOSSAD(A0)†STORELINESTARTADDRESS#ŠADDA.W(A1)+,A2‹ADDLENGTHOFLINE$ŠMOVE.LA2,IOSEAD(A0)†STORELINEEND.ŠIOSCALLIOSPB-DATASG(A4)‚A0PRINTTHEMESSAGE'ŠADDA.W#1,A2ŽPOINTA2TOSTARTOFLINE$ŠTST.W‚(A1)CHECKFORENDOFMESSAGE ŠBNE.S‚PLINEŽPRINTTHENEXTLINE2ŠCLR.W‚TERM_FLG-DATASG(A4)SETCODEFORNORMALENDŠBRA„TERMINAT‹EXITPROGRAMŠPAGE**2*ˆALLUTILITIESWILLTERMINATEBYCALLINGƒERQ.TERM:*ˆHOWEVER-ANINDICATIONASTOWHETHERTHEREWASANERROR5*ˆWHICHMIGHTCAUSECHAINPROCESSINGTOABORTMUSTBE9*ˆSPECIFIEDATTHETIMEOFTHETERMINATION.THEFOLLOWING8*ˆWILLDEFINETHETYPEOFTERMINATIONTHATARECURRENTLY *ˆPOSSIBLE:*8*’NORMALTERMINATION‚-IMPLIESTHATUTILITYSUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM#0,#0**:*’ERRORTERMINATIONƒ-IMPLIESTHATUTILITYTERMINATEDWITH *¨ANERROR**¦ERQ.TERM#0,#$C000*<*’WARNINGTERMINATION-IMPLIESTHATUTILITYTERMINATEDWITH*¨AWARNING(ie.ASSEMBLY)**¦ERQ.TERM#0,#$1000*L********PBA-ISTHEPROGRAMBASEADDRESS‚--THISMAYBEANYSYMBOLTHEUSER *®WOULDLIKE-PBAHASBEENUSED*®FORILLUSTRATIONPURPOSES*D******** THE USER IS RESPONSILE FOR SUPPLYING THE BASE REGISTER (A?)*** TERMINAT: ŠERQ.TERM#0,TERM_FLG-DATASG(A4) *TERM_FLG:0*œWILLCONTAINTHEAPPROPRIATETERMINATIONVALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*ŠNOPŠEND„SPLééééééŠLIST ŠSECTION8ŠOPT„FRS,MEX,NOCLŠXREFƒTIMECONV,ODATCONV,BDCONV**‚SPLEVNT‚ASRFORMAINSPOOLER6*‚READSTHEEVENTANDGOESTOASERVICEAREADEPENDING1*‚ONTHEEVENTCODE.THREEEVENTCODESCOMEHERE:*‚1)EVENTCODE3,SUB-CODE7*„GETBECAUSEOF:+*„A)USERDOESANASSIGNTOASPOOLERDEVICE)*„B)USERDOESACLOSETOASPOOLERDEVICE7*„C)USERDOESARETREIVEATTRIBUTESTOASPPOLERDEVICE*„D)CANCELCOMMAND*„E)CONTINUECOMMAND*„F)FORMSCOMMAND*„G)PRINTCOMMAND*„H)COPIESCOMMAND*„I)QUEUECOMMAND*‚2)EVENTCODE328*„GETBECAUSESUB-TASKWHICHISDOINGTHEACTUALSPOOLER9*„OUTPUTGOTANI/OERROR-EITHERFROMREADINGTHESPOOLER'*„FILEORWRITINGTOTHESPOOLERDEVICE*‚3)EVENTCODE5"*„GETWHENTHESUB-TASKTERMINAT2 ES*.*‚EXITTOEVENT3,SUB-CODE7COMMANDROUTINES:*‚A4=BASEADDRESSREGISTER*‚A5=EVENTADDRESS)*‚A6=REQUESTOR'SPARAAMETERBLOCKADDRESS*‚D0=EVENTLENGTH*** SPLEVNTƒEQU„*ŠNOPŠNOP*£FORDIAGNOSTICPURPOSES&ŠMOVE.L#RDEVNT,D0‰READTHEEVENTCODE-ŠLEA„QEVT-DATASG(A4),A0ADDRESSFORTHEEVENTŠTRAPƒ#1‘READTHISEVENT!ŠBNE„SPLRTNERRORRETURN-NOEVENT)ŠMOVE.LA0,A5ŽUSEA5ASTHEEVENTPOINTER 2ŠMOVE.BEVLENG(A5),D0†GETTHELENGTHOFTHISEVENT$ŠMOVE.BEVCODE(A5),D1†GETEVENTCODEŠCMP.B‚#3,D1ŽEVENT3?!ŠBNE„SPLE30BRANCHIFNOTEVENT3-ŠMOVE.BEVTKOD(A5),D1†ISEVENT3,GETSUB-CODE(ŠCMP.B‚#7,D1ŽMUSTBEA7FORTHESPOOLER*ŠBNE„SPLRTNBRANCHIFNOTSUB-CODE7,ERROR&ŠCMP.B‚#ENTRYLNG,D0‡CHECKEVENTLENGTH%ŠBEQ.S‚SPLE05BRANCHIFAGOODLENGTH(ŠMOVE.L#FSTAIE,D0‰SETTOINTERNALERRORŠLEA„EVTLEN(A5),A6†IOCBADDRESS4ŠMOVE.LD0,EVTRD0(A5)†ERRORTOEVENTPARAMETERBLOCK-ŠMOVE.BD0,FHSSTA(A6)†TOPARAMETERBLOCKALSOŠBRA„SPLRTNGORETURNSPLE05: O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,*‰ReplacetheTCBaddresswiththetaskname*%ŠMOVE.LEVTTSK(A5),PBTSKID-DATASG(A4)%ŠMOVE.LEVTSES(A5),PBTSKNM-DATASG(A4)-*£MOVETASKIDANDSESSIONTOPARAMETERBLOCK>EBN:V5^@f4n6v9~<†<Ž9–:ž7¦5®6¶8¾4Æ:Î9Ö<Þ7æ=î<ö:þ86;;M&C.: ŠBSR„GTTNAME*£GETTASKNAME%ŠMOVE.LPBTSKID-DATASG(A4),EVTTSK(A5),*£REPLACETHETCBADDRESSWITHTHETASKNAME*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ŠLEA„EVTLEN(A5),A6†IOCBADDRESSŠCLR.L‚D1‘CLEARFORUSE#ŠMOVE.W(A6),D1ŒGETSPOOLERCOMMAND3ŠLEA„CMDTBL-DATASG(A4),A2GETCOMMANDTABLEADDRESS8ŠLEA„CMDTBLE-DATASG(A4),A3GETCOMMANDTABLEENDADDRESS0SPLE10„CMP.W‚(A2),D1ŒLOOKFORAMATCHINGCOMMAND5ŠBEQ„SPLE20BRANCHIFTHISISAVALIDSPOOLERCOMMAND,ŠADD.L‚#CMDTBLEL,A2‡BUMPTONEXTTABLEENTRY'ŠCMP.L‚A3,A2ŽPASTTHEENDOFTHETABLE?7ŠBLT„SPLE10BRANCHIFNOTPASTEND,MORETABLETOSEARCH"ŠMOVE.L#FSTAIF,D0‰INVALIDCOMMAND* *‚UPDATEIOCB*5SPLACK„MOVE.BD0,FHSSTA(A6)†STATUSTOPARAMETERBLOCKŠTST.L‚D0‘GOODRETURN?ŠBEQ.S‚SPLACK10‹BRANCHIFYESŠMOVE.LD0,D1ŽGETERRORCODEŠROL.L‚#8,D1ŽGETUPPERBYTEŠTST.B‚D1‘ACODEHERE?ŠBNE.S‚SPLACK10‹BRANCHIFYES'ŠADD.L‚#$18000000,D0†SETFHSERRORCODE=SPLACK10‚MOVE.LD0,EVTRD0(A5)†STATUSTOEVENTPARAMETERBLOCK8ŠMOVE.LEVTRA0(A5),A2†REQUESTORSPARAMETERBLOCKADDRESS)ŠADD.L‚#FHSSTA,A2‰POINTTOSTATUSADDRESS)ŠLEA„FHSSTA(A6),A3†CURRENTSTATUSADDRESS5ŠLEA„FHSPB-DATASG(A4),A0USETHISFORACKTHEREQUESTŠMOVE.LA0,A1ŽSAVETHEADDRESS!ŠMOVE.L#SPLID,(A1)+‡MYTASKNAMEŠMOVE.L#MYSES,(A1)+‡SESSION(ŠMOVE.LA3,(A1)+‹ADDRESSOFBYTETOMOVE'ŠMOVE.LEVTTSK(A5),(A1)+ƒRECEIVINGTASK ŠMOVE.LEVTSES(A5),(A1)+ƒSESSIONŠMOVE.LA2,(A1)+‹ADDRESSŠMOVE.L#1,(A1)+‹LENGTHOFMOVE)ŠMOVE.L#MOVELL,D0‰MOVELOGICALDIRECTIVEŠTRAPƒ#1‘DOIT**‚ACKNOWLEDGETHEREQUEST*)SPLACK20‚MOVE.L#AKRQST,D0‰ACK.DIRECTIVE)ŠLEA„QBUF-DATASG(A4),A0PARAMETERADDRESSŠMOVE.LA0,A1ŽADDRESSŠMOVE.LEVTTSK(A5),(A1)+ƒTASK ŠMOVE.LEVTSES(A5),(A1)+ƒSESSIONŠMOVE.W#$6800,(A1)+‡OPTIONSŠMOVE.BEVTTIN(A5),(A1)+ƒTRAP#%ŠTST.B‚FHSSTA(A6)‰GETCONDITIONCODES'ŠSEQ„(A1)SETTHECONDITIONCODESINPB+ŠAND.B‚#$04,(A1)+‰SETFOREITHER=ORNOT=ŠMOVE.LEVTRD0(A5),(A1)+ƒD0ŠMOVE.LEVTRA0(A5),(A1)+ƒA0ŠTRAPƒ#1‘DOIT?SPLRTN„MOVEM.L(A7)+,D0-D7/A0-A6RESTOREREGS,RETURNFROMEVENT(ŠRTR—RETURNFROMEVENT,RESTORESRANDPCSPLE20„CLR.L‚D0‘CLEARFORUSE7ŠMOVE.W2(A2),D0‹GETTHECOMMANDROUTINEADDRESSOFFSETŠLSL.L‚#2,D0ŽMULIPLYBY4/ŠLEA„BRATBL(PC),A2†ROUTINEBRANCHTABLEADDRESSŠADD.L‚D0,A2ŽROUTINETOGOTO!ŠJMP„(A2)GOPROCESSTHISCOMMANDSPLE30„CLR.L‚D7‘CLEARFORUSE4ŠCMP.B‚#SUBTECDE,D1‡ISEVENTFROMSUB-TASK?(CODE32)ŠBNE.S‚SPLE40BRANCHIFNO*<*‚3 HEREIFEVENTCODE32-SUBTASKSENDINGANI/OERRORMESSAGE6*‚FINDTHEMATCHINGENTRYINTHESPOOLERQUEUEANDSET*‚ITTOWAITINGFORCONTINUE*3ŠMOVE.B#QSTATOUT,D7‡LOOKFORANENTRYBEINGOUTPUT"ŠMOVE.LIOERNAM(A5),D6…DEVICENAME ŠCLR.L‚D5‘DON'TCAREABOUTFORMS$ŠMOVE.L#-1,D4STARTATTOPOFQUEUE(ŠBSR„FNDENTRY‹GOFINDTHEMATCHINGENTRYŠTST„D7‘FOUNDIT?+ŠBMI„SPLRTNBRANCHIFDIDN'TFINDTHEENTRY/ŠBSETƒ#QSTATIOE,QSTAT(A1)TURNONTHEWAITFLAG1ŠMOVE.BIOERD0+3(A5),QLUN(A1)SAVETHEERRORCODE,ŠBSR„RPLRECGOPUTENTRYBACKINTOTHEQUEUE"ŠBRA„SPLRTNRETURNFROMTHISEVENT-SPLE40„CMP.B‚#5,D1ŽSUB-TASKTERMINATEDEVENT?ŠBNE„SPLRTNBRANCHIFNO*,*‚HEREIFEVENTCODE5-SUB-TASKTERMINATED*8ŠMOVE.B#QSTATOUT,D7‡LOOKFORAQUEUEENTRYBEINGOUTPUT!ŠMOVE.LEVQTSK(A5),D6†DEVICENAME ŠCLR.L‚D5‘DON'TCAREABOUTFORMS*ŠMOVE.L#-1,D4STARTSEARCHATTOPOFFILE(ŠBSR„FNDENTRY‹GOFINDTHEMATCHINGENTRYŠTST„D7‘FOUNDIT?-ŠBMI.S‚SPLE80BRANCHIFDIDN'TFINDTHEENTRY.SPLE43„MOVE.W22(A5),D0ŠGETTERMINATIONREASON(ŠBEQ.S‚SPLE70BRANCHIFGOODTERMINATION*5*‚HEREIFSUB-TASKTERMINATEDBUTFILEWASNOTOUTPUT*7SPLE45„BSR„DELENTRY‹WASWAITINGFORCANCEL,GODELETEIT)ŠBSR„DELFILEŒDELETETHESPOOLERFILEALSO,ŠBRA.S‚SPLE60GOGETTHENEXTENTRYTOSTART;SPLE50„BSETƒ#QSTATRDY,QSTAT(A1)WASN'TOUTPUT,MAKEITREADY,ŠBCLRƒ#QSTATOUT,QSTAT(A1)CLEARBEINGOUTPUT+ŠBSR„RPLRECGOPUTENTRYBACKINTOTHEFILE&SPLE60„BSR„STRTNXTŒGOSTARTSOMEENTRY#SPLE65„BRA„SPLRTNRETURNFROMEVENT*5* HERE IF GOOD SUB-TASK TERMINATION - FILE WAS OUTPUT*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L#5,A0ŽENABLETHEASQ*MOVE.L #7,A0 ENABLE THE ASQO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DOIT2SPLWAITƒMOVE.L#WTEVNT,D0‰WAITFOREVENTDIRECTIVEŠTRAPƒ#1‘DOIT$ŠBRA„SPLWAITŒSPOOLERISEVENTDRIVEN*#*ˆBRANCHTABLEFORCOMMANDROUTINES* BRATBL„EQU„*ŠBRA„ASGSPLASSIGNŠBRA„CLOSPLCLOSEŠBRA„CANCSPLŒCANCELŠBRA„CONTSPLŒCONTINUEŠBRA„FORMSPLŒFORMSIDŠBRA„PRNTSPLŒPRINT/STARTŠBRA„COPYSPLŒCOPIESŠBRA„QUESPLQUEUE ŠBRA„ATTRSPLŒRETREIVEATTRIBUTESŠPAGEB*‚ASGSPL‚ANASSIGNTOASPOOLERDEVICEWASISSUEDBYTHEREQUESTOR,*ŠMUST:A)ALLOCATEANDASSIGNASPOOLERFILE"*’WITHPUBLICREAD,EXCLUSIVEWRITE*B)BUILDASPOOLERQUEUEENTRY%*C)CHANGELUASSIGNMENTTOREQUESTOR!*D)UPDATEREQUESTORSIOCB-STATUS*E)ACKNOWLEDGEREQUEST*F)RETURNFROMEVENT*‚ENTRY:D0=EVENTLENGTH*ˆA4=BASEADDRESSREGISTER*ˆA5=EVENTADDRESS*ˆA6=REQUESTORSPARAMETERBLOCK*‚EXIT:RETURNFROMEVENT(*‚CALLS:GTJOBN„INSRTRECƒDELENTRY„DELFILE** ASGSPL„EQU„*0ŠLEA„QBUF-DATASG(A4),A1GETQUEUEBUFFERADDRESS,ŠMOVE.L#QLNG/2,D0‰LENGTHOFBUFFERINWORDS0ASGSPL10‚CLR.W‚(A1)+ŽCLEAROUTTHECURRENTENTRYŠSUB.L‚#1,D0ŽDECREMENTCOUNT"ŠBNE.S‚ASGSPL10‹BRANCHTILCLEARED.ŠLEA„QBUF-DATASG(A4),A1RESTOREBUFFERADDRESS,ŠLEA„FHSPB-DATASG(A4),A0FHSPARAMETERBLOCKG‰SFHSCOFHALLO+FHASGN,FOPPRPW+FOPSEQ,A0ALLOCATE&ASSIGNPUBLICRW,SEQŠMOVE.B#2,FHSLUN(A0)†USELUN2/ŠMOVE.BFHSLUN(A6),QLUN(A1)SAVE3 REQUESTORSLUNŠMOVE.L#BLANK,D0ŠBLANKS4ŠMOVE.L#6,D1ŽCOUNTERFORMOVEINGFILENAMETOBUFFER+ŠLEA„FHSVOL(A0),A3†STARTMOVINGFROMVOLUME/ASGSPL12‚MOVE.LD0,(A3)+‹BLANKSTOTHEFILENAMEŠSUB.L‚#1,D1ŽDECREMENTCOUNTER%ŠBNE.S‚ASGSPL12‹BRANCHTILALLBLANKS)ŠMOVE.WEVTUNM(A5),FHSUSN(A0)USERNUMBER7ŠMOVE.B#SPOOLF,FHSFIL(A0)1STCHAROFSPOOLERFILENAME2ŠMOVE.W#$0000,FHSWCD(A0)‚PUBLICREAD,PUBLICWRITE)ŠCLR.W‚FHSLRL(A0)‰VARIABLELENGTHRECORDS5ŠCLR.L‚FHSSIZ(A0)‰CLEARSIZEFIELD,USINGTHEDEFAULTS%ŠMOVE.LFHSVOL(A6),QDEVICE(A1)DEVICE%ŠMOVE.LFHSCLG(A6),D0†GETFORMSFIELD-ŠCMP.L‚#BLANK,D0ŠBLANKSFORSTANDARDFORMID?**ˆSEEIFPRINTABLEFORMSID*ŠMOVE.L#4,D1ŽCOUNTERŠMOVE.LD0,D3ŽFORMSIDASGSPL13‚ROL.L‚#8,D3ŽGETABYTEŠCMP.B‚#$21,D3ŒPRINTABLE?4ŠBLT.S‚ASGSPL14‹BRANCHIFNO,FORCESTANDARDFORMSIDŠCMP.B‚#$7E,D3ŒPRINTABLE?4ŠBGT.S‚ASGSPL14‹BRANCHIFNO,FORCESTANDARDFORMSIDŠSUB.L‚#1,D1ŽDECREMENTCOUNTER+ŠBNE„ASGSPL13‹BRANCHIFMOREBYTESTOCHECKŠBRA.S‚ASGSPL15‹GOODFORMSID2ASGSPL14‚MOVE.L#'STND',D0‰FORCESTANDARDFORMSID&ASGSPL15‚MOVE.LD0,QFORMS(A1)†FORMSID'ŠMOVE.LEVTTSK(A5),QTASKN(A1)TASKNAME$ŠMOVE.LEVTSES(A5),QSESS(A1)SESSION$ŠMOVE.BEVTPRI(A5),QPRI(A1)PRIORITY:ŠCLR.L‚QSIZE(A1)ŠCLEARSIZEFIELD,WON'TGETITUNTILCLOSEŠCLR.B‚QSTAT(A1)ŠCLEARSTATUS"ŠMOVE.B#1,QCOPYS(A1)†FORCE1COPYŠMOVE.LA0,A3ŽSAVEA0)ŠMOVE.L#GTDTIM,D0‰GETDATEANDTIMECODEAŠLEA„SCRATCH-DATASG(A4),A0USESCRATCHFORRETURNEDDATEANDTIMEŠTRAPƒ#1‘GETTHEDATEANDTIME"ŠBNE„SPLACKERRORRETURN,D0ISSET!ŠMOVE.L(A0)+,QDATE(A1)„SAVEDATE ŠMOVE.L(A0),QTIME(A1)…SAVETIMEŠMOVE.LA3,A0ŽRESTOREA0ŠTRAPƒ#3‘CREATETHISFILE)ŠBNE„ASGSPL20‹BRANCHIFANERRORRETURNEDCŠLEA„FHSVOL(A0),A2GETSTARTADDRESSOFRETURNEDQUALIFIEDFILENAME,ŠLEA„QVOL(A1),A3ˆGETSTARTADDRESSINENTRYE*ŠMOVE.L#6,D0ŽNUMBEROFLONGWORDSTOMOVE>ASGSPL17‚MOVE.L(A2)+,(A3)+ˆSAVEFILENAMESTUFFINQUEUEENTRYŠSUB.L‚#1,D0ŽDECREMENTCOUNTER ŠBNE.S‚ASGSPL17‹BRANCHTILMOVED*)*‚SPOOLERFILECREATED-DETERMINEJOBID*ŠMOVE.LA0,-(A7)‹SAVEA0ŠBSR„GTJOBNGOGETJOBNUMBERŠMOVE.L(A7)+,A0‹RESTOREA0ŠTST.L‚D7‘CHECKRETURNŠBNE„ASGSPL40‹ERRORRETURN3ŠMOVE.WQUSERN(A1),QJOBID(A1)USERNUMBERTOJOBID+ŠMOVE.WD6,QJOBID+2(A1)„OCCURANCETOJOBID0ŠMOVE.L#10,D7INSERTQUEUEENTRYATTOPOFFILE'ŠBSETƒ#QSTATACT,QSTAT(A1)STATUS=ACTIVE*-*ˆGETTHELOGGEDONUSERNUMBERFORTHEJOBID*:ŠCMP.L‚#0,A4ŒAREWERUNNINGINERORmacs?(A4=0IFEXORmacs)>ŠBNE.S‚ASGSPL19ˆBRANCHISNOMMU,FORGETAABOUTANTUSERNUMBERŠTST.W‚QJOBID(A1)‰USER0?8ŠBNE.S‚ASGSPL19‹BRANCHIFNO,USETHEUSERNUMBERWEHAVE(ŠBSR„GTUSERGOGETLOGGEDONUSERNUMBER ASGSPL19‚MOVE.LA0,-(A7)‹SAVEA03ŠBSR„INSRTREC‹GOPUTTHISENTRYINTOTHEQUEUEFILE<ŠMOVE.LFMSREC(A0),CURREC-DATASG(A4)SAVETHISRECORDNUMBERŠMOVE.L(A7)+,A0‹RESTOREA0ŠTST„D7‘GOODINSERT?8ŠBNE.S‚ASGSPL40‹BRANCHIFNOTGOOD-GODELETEOUTPUTFILE*(* CHANGE LU ASSIGNMENT BACK TO REQUESTOR"*LUA=#2‚LUB=QLUN(A1)SENDOPTION*0ŠLEA„FHSPB-DATASG(A4),A0USEFHSPARAMETERBLOCK/ŠMOVE.W#FHCHLU,FHSCMD(A0)CHANGELUASSIGNMENT ŠMOVE.B#2,FHSLUA(A0)†LUNA=#2*ŠMOVE.BQLUN(A1),FHSLUB(A0)REQUESTORSLUN2ŠMOVE.LEVTTSK(A5),FHSTSK(A0)REQUESTORSTASKNAME0ŠMOVE.LEVTSES(A5),FHSSES(A0)REQUESTORSSESSION&ŠMOVE.W#FOPSLU,FHSOPT(A0)SENDOPTIONŠTRAPƒ#3‘DOIT'ŠBEQ.S‚ASGSPL20‹BRANCHIFAGOODRETURNŠMOVE.LD0,D7ŽSAVEERRORCODE#ŠBSR„DELENTRY‹GODELETEQUEUEENTRY)ŠMOVE.B#2,FHSLUN(A0)†LUNFORFILEDELETE#ŠBRA.S‚ASGSPL40‹GODELETETHISFILE**‚RETURNFROMEVENTHERE*%ASGSPL20‚BRA„SPLACKRETURNFROMEVENT*)*‚ERRORHANDLINGHERE-DELETESPOOLERFILE*;ASGSPL40‚MOVE.W#FHCLOS,FHSCMD(A0)GOCLOSETHEOUTPUTFILEŠTRAPƒ#3‘DOIT#ŠBSR„DELFILEŒDELETETHEOUTPUTFILE+ŠMOVE.LD7,D0ŽRESTOREERRORCODEFORRETURN'ŠBRA„ASGSPL20‹GORETURNFROMTHISEVENTŠPAGE=*‚CLOSPL‚CLOSECOMMANDRECEIVEDBYFMSFORTHEOUTPUTSPOOLER-*ŠFILEASSIGNEDTOTHEOUT4 PUTSPOOLERDEVICE.8*ŠREQUESTOR'SPARAMETERBLOCKCONTAINSSPOOLERFILENAME,*ˆA)MAKESPOOLERQUEUEENTRYREADYTOOUTPUT9*ŠDELETECURRENTQUEUEENTRYANDREPOSITIONITFOROUTPUT,*ˆB)ASSIGNANDSTARTFILEIFDEVICENOTBUSY*ˆC)ACKNOWLEDGEREQUEST*ˆD)RETURNFROMEVENT*‚ENTRY:D0=EVENTLENGTH*ˆA4=BASEADDRESSREGISTER*ˆA5=EVENTADDRESS(*ˆA6=REQUESTOR'SPARAMETERBLOCKADDRESS*‚EXIT:RETURNFROMEVENT8*‚CALLS:FNDENTRY„DELENTRY„STPRIRPL„STRTNXT„MTCDFƒASFSIZE CLOSPL„EQU„*G‰MOVE.L#-1,CURREC-DATASG(A4)SEARCHSPOOLERQUEUE-STARTATFIRSTENTRY@CLOS10„MOVE.LCURREC-DATASG(A4),D4RECORDNUMBERTOSTARTSEARCHŠCLR.L‚D5‘ANYFORMSIDŠCLR.L‚D6‘ANYDEVICEŠCLR.L‚D7‘CLEARFORUSE,ŠMOVE.B#QSTATACT,D7‡LOOKFORACTIVEENTRIES%ŠBSR„FNDENTRY‹GOFINDANACTIVEENTRYŠTST„D7‘FOUNDONE?$ŠBMI.S‚CLOSERBRANCHIFDIDN'T-ERROR"ŠMOVE.LFHSFIL(A6),D0†GETFILENAME#ŠCMP.L‚QFILEN(A1),D0†SAMEFILENAME?3ŠBNE„CLOS10BRANCHIFNOTTHESAME,SEARCHSOMEMORE,ŠMOVE.LFHSFIL+4(A6),D0„GETRESTOFFILENAMEŠCMP.L‚QFILEN+4(A1),D0„SAME?"ŠBNE„CLOS10BRANCHIFNOTTHESAME#ŠMOVE.WFHSEXT(A6),D0†GETEXTENSIONŠCMP.W‚QEXT(A1),D0ˆSAME?"ŠBNE„CLOS10BRANCHIFNOTTHESAME*‚FOUNDCORRECTQUEUEENTRY*+ŠCLR.B‚QLUN(A1)‹NOTASSIGNEDTOANYLUNNOWŠBSR„ASFSIZEŒGOGETFILESIZEŠBNE.S‚CLOS20ERRORRETURN.ŠBCLRƒ#QSTATACT,QSTAT(A1)TURNOFFACTIVEFLAG0ŠBSETƒ#QSTATRDY,QSTAT(A1)SETTOREADYTOOUTPUT$ŠCLR.L‚D7‘SETNOTFROMCONTINUEFLAG:ŠBSR„MTCDFŠGOSETSTATUSBITSFORMATCHINGDEVICE,FORMSIDŠTST„D7‘GOODRETURN? ŠBMI.S‚CLOSERBRANCHIFNO,ERROR=ŠBSR„DELENTRY‡GODELETETHISENTRYFROMIT'SCURRENTPOSITIONŠTST„D7‘DELETED?)ŠBMI.S‚CLOS20BRANCHIFNOTDELETED,ERROR<ŠBSR„STPRIRPLˆGOSETOUTPUTPRIORITYANDPUTINTOQUEUEFILEŠTST„D7‘DIDIT? ŠBMI.S‚CLOS20BRANCHIFNO,ERROR/ŠBSR„STRTNXTŒGOSTARTOUTPUTIFDEVICENOTBUSY ŠCLR.L‚D0‘SETGOODRETURNSTATUS#CLOS20„BRA„SPLRTNRETURNFROMEVENT9CLOSER„MOVE.L#FSTANNM,D0ˆSETNON-EXISTENTFILENAMEERROR ŠBRA„CLOS20GORETURNFROMEVENTŠPAGE**‚CANCSPL‚CANCELASPOOLERJOB(*‹CANCELCOMESFROMAUSERCOMMANDINPUT*‹INPUTSANDACTIONSARE:*‹SPECIFYŽACTION*‹-------Ž------*‹JOBIDDELETETHATJOB*‹FILENAMEDELETETHATJOB5*‹USERNUMBERONLY…DELETEALLJOBSWITHTHATUSERNO.C*‹**FORUSERNUMBERƒDELETEALLJOBSINQUEUE(PRIVELEGED)0621844*3*‹IFAJOBISCURRENTLYBEINGOUTPUTORWAITINGFOR4*‹ACONTINUE,SENDTHESUB-TASKATERMINATIONMESSAGE7*‹EVENTCODE33,SETQSTATTOCANCEL.THEFILEANDQUEUE4*‹ENTRYWILLBEDELETEDBYTHEEVENTHANDLERANDTHE*‹NEXTENTRYWILLBESTARTED.*3*‹USER#0MAYCANCELANYJOB,USE#XMAYCANCELONLY*‹HISOWNJOBS.*‚ENTRY:D0=EVENTLENGTH*ˆA4=BASEADDRESSREGISTER*ˆA5=EVENTADDRESS(*ˆA6=REQUESTOR'SPARAMETERBLOCKADDRESS*‚EXIT:RETURNFROMEVENT/*‚CALLS:FNDENTRY„DELENTRY„DELFILE„RPLREC„DOQEVT** CANCSPLƒEQU„*,ŠCLR.L‚D3‘CLEARCOUNTERFORMULTIPLEDELETES&ŠCLR.L‚D5‘CLEARFINDANYFORMSIDFLAG$ŠCLR.L‚D6‘CLEARFINDANYDEVICEFLAG.ŠMOVE.L#-1,D4SETSTARTSEARCHATTOPOFFILE&ŠMOVE.LFHSSIZ(A6),D1†JOBIDSPECIFIED?ŠBNE.S‚CANC20BRANCHIFYES)ŠMOVE.LFHSFIL(A6),D1†FILENAMESPECIFIED?ŠBNE.S‚CANC50BRANCHIFYES,ŠMOVE.WFHSUSN(A6),D1†USERNUMBERSPECIFIED?=ŠBRA„CANC80‡CANCELALLJOBSFORUSERNUMBER-CORRECTSSPR630*&* HERE IF INVALID CANCEL SPECIFICATION*)ŠMOVE.L#FSTAIF,D0‰INVALIDCOMMANDSTATUS+CANC10„TST„D3‘LOOKINGFORMULTIPLECANCELS?"ŠBNE„CANC90BRANCHIFYES,MULTIPLE#CANC00„BRA„SPLACKRETURNFROMEVENT*'*ˆHEREIFINVALIDUSERNUMBERSPECIFIED*,CANC05„MOVE.L#FSTAIU,D0‰INVALIDUSERNUMBERŠBRA„CANC00GORETURN**‚HEREIFJOBIDSPECIFIED**CANC20„MOVE.L#-1,D7STATUSDOESN'TMATTER8ŠBSR„FNDENTRY‹GOFINDANENTRYINTHESPOOLERQUEUEFILEŠTST„D7‘FOUNDONE?*ŠBMI„CANCNEBRANCHIFDIDN'TFINDANENTRY7ŠMOVE.LCURREC-DATASG(A4),D4SAVECURRENTRECORDNUMBER ŠCMP.L‚QJOBID(A1),D1†SAMEJOBID?.ŠBNE„CANC20BRANCHIFNOTTHESAME,SEARCHMORE6CANC30„TST.W‚EVTUNM(A5)‰USERNUMBER0REQUESTINGTHI4 S?ŠBEQ.S‚CANC40BRANCHIFYES%ŠMOVE.WEVTUNM(A5),D1†GETUSERNUMBER&ŠCMP.W‚QJOBID(A1),D1†SAMEUSERNUMBER?+ŠBNE„CANC05BRANCHIFNOTSAMEUSER#-ERROR** FOUND MATCH ENTRY*-CANC40„BTSTƒ#QSTATOUT,QSTAT(A1)BEINGOUTPUT?ŠBNE.S‚CANC60BRANCHIFYES1ŠBTSTƒ#QSTATIOE,QSTAT(A1)WAITINGFORACONTINUE?ŠBNE.S‚CANC60BRANCHIFYES%ŠBSR„DELENTRY‹DELETETHISQUEUEENTRY?ŠSUB.L‚#1,D4‡DECREMENTRECORDNUMBERINCASEOFMULTIPLESEARCHŠTST.L‚D7‘CHECKRETURNŠBMI„CANC10ERRORRETURN%ŠBSR„DELFILEŒDELETETHISSPOOLERFILE+CANC45„BRA„CANC10GORETURNFROMTHISEVENT**‚HEREIFFILENAMESPECIFIED*+CANC50„MOVE.L#-1,D7STATUSDOESNOTMATTERŠBSR„FNDENTRY‹GOFINDANENTRYŠTST„D7‘FOUNDONE?'ŠBMI.S‚CANCNEBRANCHIFDIDN'TFINDONE4ŠMOVE.LCURREC-DATASG(A4),D4SAVETHISRECORDNUMBER"ŠMOVE.LFHSFIL(A6),D1†GETFILENAMEŠCMP.L‚QFILEN(A1),D1†SAME?.ŠBNE„CANC50BRANCHIFNOTTHESAME,SEARCHMORE,ŠMOVE.LFHSFIL+4(A6),D1„GETRESTOFFILENAMEŠCMP.L‚QFILEN+4(A1),D1„SAME?ŠBNE„CANC50BRANCHIFNO#ŠMOVE.WFHSEXT(A6),D1†GETEXTENSIONŠCMP.W‚QEXT(A1),D1ˆSAME?"ŠBNE„CANC50BRANCHIFNOTTHESAME)ŠCMP.B‚#SPOOLF,FHSFIL(A6)ASPOOLERFILE?ŠBEQ„CANC30BRANCHIFYES:ŠMOVE.LFHSVOL(A6),D1†NON-SPOOLER-CHECKVOLUMEANDCATALOGŠCMP.L‚QVOL(A1),D1ˆSAME?ŠBNE„CANC50BRANCHIFNO!ŠMOVE.LFHSCLG(A6),D1†GETCATALOGŠCMP.L‚QCATLG(A1),D1†SAME?ŠBNE„CANC50BRANCHIFNO+ŠMOVE.LFHSCLG+4(A6),D1„GETRESTOFCATALOGŠCMP.L‚QCATLG+4(A1),D1„SAME?ŠBNE„CANC50BRANCHIFNO*ŠBRA„CANC30AMATCHINGENTRY-GOPROCESSIT7CANCNE„MOVE.L#FSTANNM,D0ˆFILENAMEDOESN'TEXISTSTATUS ŠBRA„CANC45GORETURNFROMEVENT*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)SETCANCELFLAG9ŠBSR„RPLREC‹GOPUTUPDATEDENTRYBACKINTOTHEQUEUEFILEŠBMI„CANC10ERRORRETURN!ŠMOVE.W#-1,D7SETCANCELMESSAGE/ŠBSR„DOQEVTGOQUEUETHISEVENTTOTHESUB-TASKŠTST„D7‘GOODRETURN?#ŠBEQ„CANC10BRANCHIFAGOODRETURN%ŠMOVE.L#FSTAIE,D0‰SETINTERNALERROR ŠBRA„CANC45GORETURNFROMEVENT*8* HERE IF USER NUMBER SPECIFIED,DELETE ALL MATCH ENTRIES**CANC80„TST.W‚EVTUNM(A5)‰USER0DOINGTHIS?ŠBEQ.S‚CANC90BRANCHIFYES,OK&ŠCMP.W‚EVTUNM(A5),D1†SAMEUSERNUMBER?ŠBNE„CANC05BRANCHIFNO,ERROR0CANC90„MOVE.L#-1,D7STARTSEARCHATTOPOFFILEŠBSR„FNDENTRY‹GOFINGANENTRYŠTST„D7‘FOUNDONE?ŠBMI.S‚CANC100ŒBRANCHIFNO7ŠMOVE.LCURREC-DATASG(A4),D4SAVECURRENTRECORDNUMBER2ŠCMP.W‚#'**',D1‹CHECKFORGLOBALCANCEL-0621844(ŠBEQ.S‚CANC95AUTOMATICMATCH-0621844&ŠCMP.W‚QJOBID(A1),D1†SAMEUSERNUMBER?,ŠBNE„CANC90BRANCHIFNO,GOSEARCHSOMEMORE)CANC95„ADD.L‚#1,D3ŽAMATCH,UPDATECOUNTER&ŠBRA„CANC40GOTAKECAREOFTHISENTRYCANC100ƒCLR.L‚D3‘CLEARCOUNTER%ŠBRA„CANC45GORETURNFROMTHISEVENTŠPAGE*#*‚CONTSPL‚CONTINUEASPOOLEROUTPUT,*‹COMESFROMAUSERCOMMANDINPUTCODE$0204*‚TOUSE:SPECIFYDEVICENAME,*‚ACTION:1)RETRYOUTPUTIFI/OERRORPENDING**‰2)STARTNEXTJOBIFAFTERAFORMSCHANGE.*‰3)COMMANDISIGNOREDIFTHEDEVICEISACTIVE*‚ANYUSERMAYSPECIFYCONTINUE*‚ENTRY:D0=EVENTLENGTH*ˆA4=BASEADDRESSREGISTER*ˆA5=EVENTADDRESS(*ˆA6=REQUESTOR'SPARAMETERBLOCKADDRESS*‚EXIT:RETURNFROMEVENT,*‚CALLS:FNDENTRY„RPLREC„DOQEVT„STRTSPL„MTCDF** CONTSPLƒEQU„*%ŠMOVE.LFHSVOL(A6),D6†GETDEVICENAME*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 *˜0621844ŠCLR.L‚D5‘IGNOREFORMSIDŠMOVE.LD5,D7ŽCLEARD7FORUSE;ŠMOVE.B#QSTATOUT,D7‡CHECKFORFILESWHICHAREBEINGOUTPUTŠMOVE.L#-1,D4STARTATTOPŠBSR„FNDENTRY‹LOOKFORITŠTST„D7‘FOUNDONE?#ŠBEQ.S‚CONT10RETURNIFDEVICEBUSY?***************************************************************ŠCLR.L‚D5‘IGNOREFORMSID7ŠMOVE.L#-1,D4STARTSEARCHINGSPOOLERQUEUEATTHETOPŠCLR.L‚D7‘CLEARFORUSE2ŠMOVE.B#QSTAT5 IOE,D7‡SEARCHFORPENDINGI/EERRORS*3*‚SEARCHTHESPOOLERQUEUEFILEFORANENTRYWITHA5*‚MATCHINGDEVICEANDISWAITINGFORCONTINUEBECAUSE*‚OFAIOERROR*ŠBSR„FNDENTRY‹GOFIND1ŠTST„D7‘FOUNDIT?%ŠBMI.S‚CONT40BRANCHIFONENOTTHERE*4*‚FOUNDTHEENTRY,SENDTHESUB-TASKANEVENTCODE33*‚MESSAGE=CONTINUE*)ŠBCLRƒ#QSTATIOE,QSTAT(A1)CLEARWAITFLAG)ŠBSETƒ#QSTATOUT,QSTAT(A1)SETOUTPUTFLAG$ŠCLR.B‚QLUN(A1)‹CLEARTHEERRORCODE2ŠBSR„RPLRECPUTUPDATEDENTRYBACKINTOTTHEQUEUE&ŠBEQ.S‚CONT20BRANCHIFAGOODREPLACE#CONT10„BRA„SPLACKRETURNFROMEVENT$CONT20„CLR.L‚D7‘SETCONTINUEMESSAGE/ŠBSR„DOQEVTGOQUEUETHISEVENTTOTHESUB-TASKŠTST„D7‘GOODRETURN?#ŠBEQ.S‚CONT10BRANCHIFGOODRETURN%ŠMOVE.L#FSTAIE,D0‰SETINTERNALERRORŠBRA„CONT10GORETURN+CONT30„MOVE.L#FSTADT,D0‰SETINVALIDDEVICEŠBRA„CONT10GORETURN*9*‚HEREIFDEVICENOTWAITINGFORIOERRORCONTINUE,SEEIF(*‚ONETOSTARTBECAUSEOFAFORMSCHANGE**CONT40„MOVE.L#-1,D4STARTATTOPOFQUEUEŠCLR.L‚D7‘CLEARFORUSE5CONT50„MOVE.B#QSTATWAT,D7‡LOOKFORAMUSTWAITENTRY'ŠBSR„FNDENTRY‹GOFINDANENTRYTOSTART3ŠMOVE.LCURREC-DATASG(A4),D4GETTHISRECORDNUMBERŠCLR.L‚D0‘SETFORGOODRETURNŠTST„D7‘FOUNDONE?ŠBMI„CONT80BRANCHIFNO ŠMOVE.L#-1,D7SETCONTINUEFLAG*ŠBSR„MTCDFŽGOSEEIFMATCHINGDEVICE-FORMSŠCLR.L‚D0‘SETFORGOODRETURNŠTST„D7‘FOUNDTHISDEVICE?ŠBMI„CONT30BRANCHIFNO,ERROR-ŠBNE„CONT10FOUNDDEVICEBUTCAN'TOUTPUTNOW"ŠBSR„RPLRECGOREPLACETHISRECORD)ŠBTSTƒ#QSTATWAT,QSTAT(A1)MATCHINGFORMS?+ŠBNE.S‚CONT50BRANCHIFNO,SEARCHSOMEMORE*4*‚FOUNDANENTRYTOSTART-FIXUPSTATUSANDSTARTIT**ŠBTSTƒ#QSTATRDY,QSTAT(A1)READYTOOUTPUT?ŠBEQ.S‚CONT55BRANCHIFNO!ŠBSR„STRTSPLŒGOSTARTTHISOUTPUTŠTST„D7‘STARTED?ŠBEQ.S‚CONT60BRANCHIFSTARTED5ŠBSETƒ#QSTATRDY,QSTAT(A1)MAKESURETHISONEISREADY:CONT55„BCLRƒ#QSTATOUT,QSTAT(A1)MAKESURENOTBEINGOUTPUT)ŠBSR„RPLRECGOPUTRECORDBACKINTOQUEUEŠBNE„CONT10ERRORRETURNEŠMOVE.LCURREC-DATASG(A4),D4SEARCHTHEQUEUESOMEMORE,STARTINGHEREŠCLR.L‚D7‘CLEARFORUSEŠBRA„CONT50GOSEARCH*8*‚HEREIFOUTPUTSTARTED,GOFIXUPRESTOFQUEUEENTRIES*CONT60„CLR.L‚D7‘CLEARFORUSE#ŠMOVE.L#-1,D4STARTATTOPOFFILE(ŠMOVE.LQDEVICE(A1),D6…MATCHTHISDEVICE)ŠMOVE.LQFORMS(A1),D5†MATCHTHISFORMSID3CONT70„MOVE.B#QSTATWAT,D7‡LOOKFORWAITINGENTRIES&ŠBSR„FNDENTRY‹GOFINDAMATCHINGENTRYŠCLR.L‚D0‘SETFORAGOODRETURN4ŠMOVE.LCURREC-DATASG(A4),D4SAVETHISRECORDNUMBERŠTST„D7‘FOUNDONE?ŠBMI„CONT10BRANCHIFNO,DONE-ŠBCLRƒ#QSTATWAT,QSTAT(A1)CLEARTHEWAITFLAG-ŠBCLRƒ#QSTATFRM,QSTAT(A1)CLEARTHEFORMFLAG.ŠBSR„RPLRECPUTENTRYBACKINTOTHEQUEUEFILEŠBNE„CONT10ERRORRETURN&ŠBRA„CONT70DOTILNOMATCHINGENTRIES*<*ŠTHEFOLLOWINGROUTINEISADDEDTOCLEARTHEPRINTERSTATUS%*ŠFLAGAFTERACONTCOMMAND.0621844*$CONT80„CLR.L‚D1‘FIRSTRECORDTOREAD)ŠLEA„QSTAT(A1),A3‡GETSTATUSBYTEADDRESS*CONT85„BSR„RDRESŽGOREADARESERVEDRECORD%ŠMOVE.L#RREC,D2‹#ENTRIESPERRECORD+CONT90„MOVE.LRDEV(A2),D3ˆGETADEVICENAMEŠTST.L‚D3‘ANYDEVICE1ŠBEQ„CONT10BRANCIFENDOFLIST-DEVICENOTFOUNDŠCMP.L‚D6,D3ŽMATCHINGDEVICE?ŠBEQ.S‚CONT100ŒBRANCHIFYES#ŠSUB.L‚#1,D2ŽDECREMENT#OFENTRIES/ŠBEQ.S‚CONT105ŒBRANCHIFMUSTREADANEWRECORD"ŠADD.L‚#RLNG,A2‹BUMPTONEXTENTRY!ŠBRA„CONT90GOLOOKATNEXTENTRY'CONT105ƒADD.L‚#1,D1ŽBUMPTONEXTRECORDŠCMP.L‚#8,D1ŽREADEVERYRECORD?"ŠBLE„CONT85BRANCHIFMORETOREAD2CONT100ƒCLR.L‚RSTAT(A2)ŠSETPRINTERSTATUSTO'OK'ŠBSR„RPLRESREPLACETHERECORDŠBRA„CONT10RETURNTOCALLER*ŠPAGE**‚FORMSPL‚CHANGEFORMSID&*‹COMESFROMAUSERCOMMANDCODE$0208)*‚TOUSE,SPECIFY:DEVICENAMEANDFORMSID0*‚OVERVIEW:WHENTHECURRENTJOBIDDONE,NOOTHER7*‚OUTPUTISSTARTEDUNTILACONTINUECOMMANDISISSUED.6*‚THEDEVICEOUTPUTSSPOOLERFILESWITHMATCHINGFORMS6*‚IDUNTILANEWFORMSIDISSPECIFIED.SPECIFY'STND';*‚FORMSIDT5 OCHANGEBACKTOTHESTANDARDDEFAULTFORMSID.9*‚ALLQUEUEENTRIESSTARTAS'STND'UNLESSAFORMSIDWAS?*‚SPECIFIEDINTHECATALOGFIELDATASSIGN.ONAFORMSCOMMAND,@*‚ALLQUEUEENTRIESWITHAMATCHINGFORMSIDARESETTOWAITFOR>*‚CONTINUE,IFTHEDEVICEISTHESAME.ALLOTHERENTRIESWITHA<*‚MATCHINGDEVICEBUTNOTAMATCHINGFORMSIDARESETTONOT*‚MATCHINGFORMSID.**‚ENTRY:D0=EVENTLENGTH*ˆA4=BASEADDRESSREGISTER*ˆA5=EVENTADDRESS(*ˆA6=REQUESTOR'SPARAMETERBLOCKADDRESS*‚EXIT:RETURNFROMEVENT$*‚CALLS:RPLRES„FNDENTRY„RDRES„RPLREC** FORMSPLƒEQU„*ŠCLR.L‚D1‘1STRECORDTOREAD*FORM10„BSR„RDRESŽGOREADARESERVEDRECORD%ŠMOVE.L#RREC,D2‹#ENTRIESPERRECORD)FORM20„MOVE.LRDEV(A2),D3ˆGETDEVICENAME#ŠBEQ.S‚FORM40BRANCHIFENDOFLIST!ŠCMP.L‚FHSVOL(A6),D3†SAMEDEVICE?ŠBEQ.S‚FORM60BRANCHIFSAMEŠSUB.L‚#1,D2ŽDECREMENTCOUNT0ŠBEQ.S‚FORM30BRANCHIFMUSTREADINNEXTRECORD"ŠADD.L‚#RLNG,A2‹BUMPTONEXTENTRY#ŠBRA„FORM20GOCHECKTHENEXTENTRY-FORM30„ADD.L‚#1,D1ŽBUMPTONEXTRECORDNUMBER"ŠCMP.L‚#8,D1ŽMORERECORDSTOREAD?$ŠBLE.S‚FORM10BRANCHIFMORETOREAD+FORM40„MOVE.L#FSTADT,D0‰SETINVALIDDEVICE#FORM50„BRA„SPLACKRETURNFROMEVENT5FORM60„MOVE.LFHSSIZ(A6),RFRM(A2)SETTONEWFORMSID"ŠBEQ„FORM40FORMSIDCAN'TBEZERO)ŠMOVE.L#-1,RSTAT(A2)†SETTOFORMSCHANGE7ŠBSR„RPLRESGOPUTTHISRECORDBACKINTOTHEQUEUEFILE*:*‚READTHEQUEUEFILEANDUPDATEALLENTRIESWITHMATCHING;*‚DEVICE.UPDATE=IFMATCHINGFORMSID,SETWAITFORCONTINUE5*‚IFNOTMATCHINGFORMSID,SETNOTMATCHINGFORMSID.*(ŠMOVE.LFHSSIZ(A6),D3†SAVETHISFORMSID,ŠMOVE.L#-1,D4SEARCHQUEUEATSTARTOFFILEŠCLR.L‚D5‘ANYFORMSID,ŠMOVE.LFHSVOL(A6),D6†SEARCHFORTHISDEVICE"FORM70„MOVE.L#-1,D7IGNORESTATUSŠBSR„FNDENTRY‹GOFINDAMATCHŠCLR.L‚D0‘SETFORAGOODRETURN4ŠMOVE.LCURREC-DATASG(A4),D4SAVETHISRECORDNUMBERŠTST„D7‘FOUNDAMATCH?ŠBMI„FORM50BRANCHIFNO,DONE+ŠBTSTƒ#QSTATOUT,QSTAT(A1)BEINGOUTPUTNOW?/ŠBNE„FORM70BRANCHIFYES,DON'TCHANGEANYTHING#ŠCMP.L‚QFORMS(A1),D3†SAMEFORMSID?$ŠBNE.S‚FORM80BRANCHIFNOTTHESAME%ŠBSETƒ#QSTATWAT,QSTAT(A1)SETTOWAIT/ŠBCLRƒ#QSTATFRM,QSTAT(A1)SETTOMATCHINGFORMSŠBRA.S‚FORM90GOREPLACE0FORM80„BSETƒ#QSTATWAT,QSTAT(A1)SETTOMUSTWAIT6ŠBSETƒ#QSTATFRM,QSTAT(A1)SETTONOTMATCHINGFORMSID7FORM90„BSR„RPLRECPUTUPDATEDRECORDBACKINTOTHEFILEŠBNE„FORM50ERRORRETURNŠBRA„FORM70GOSEARCHSOMEMOREŠPAGE9*‚PRNTSPL‚OUTPUTASPOOLERFILENEXTORADDANON-SPOOLER *‹FILENAMETOTHESPOOLERQUEUE.!*‹COMESFROMAUSERCOMMAND$0210#*‹ONLYVALIDIFTHEFILEISCLOSED.!*‹USER0MAYSPECIFYANYFILENAME**‹USERXMAYONLYSPECIFYHISOWNFILENAME*‹SPECIFY•ACTION*‹-------•------*‹JOBID—OUTPUTTHISJOBNEXT(*‹FILENAME(SPOOLER)‹OUTPUTTHISJOBNEXT2*‹FILENAME(NON-SPOOLER)‡ADDTHISFILENAMETOQUEUE*‚ENTRY:D0=EVENTLENGTH*ˆA4=BASEADDRESSREGISTER*ˆA5=EVENTADDRESS(*ˆA6=REQUESTOR'SPARAMETERBLOCKADDRESS*‚EXIT:RETURNFROMEVENT)*‚CALLS:FNDENTRY„DELENTRY„INSRTREC„GTJOBN *ˆMTCDF‡STPRIRPL„ASFSIZE…STRTNXT* PRNTSPLƒEQU„*ŠCLR.L‚D0‘CLEARFORUSE"ŠCLR.L‚D1‘FLAGFORJOBIDSPECIFIED,ŠMOVE.LFHSSIZ(A6),D3†SEEIFJOBIDSPECIFIED*ŠBNE.S‚PRNT10BRANCHIFJOBIDISSPECIFIED4ŠMOVE.BFHSFIL(A6),D3†SEEIFASPOOERFILESPECIFIED3ŠCMP.B‚#SPOOLF,D3‰STARTWITHTHESPOOLERFILESIGN?(ŠBNE„PRNT90BRANCHIFNOTASPOOLERFILE4ŠMOVE.LFHSFIL(A6),D3†ISASPOOLERFILE,GETFILENAME(ŠMOVE.LFHSFIL+4(A6),D2„RESTOFFILENAMEŠMOVE.L#1,D1ŽSETFILEFLAG5PRNT10„MOVE.L#-1,D4SEARCHQUEUESTARTINGATTHETOPŠCLR.L‚D5‘ANYFORMSIDŠCLR.L‚D6‘ANYDEVICE"PRNT20„MOVE.L#-1,D7IGNORESTATUSŠBSR„FNDENTRY‹GOFINDANENTRY4ŠMOVE.LCURREC-DATASG(A4),D4SAVETHISRECORDNUMBERŠTST„D7‘FOUNDONE?ŠBMI„PRNT80BRANCHIFNO%ŠTST„D1‘LOOKINGFORAMATCHINGJOBID?ŠBEQ.S‚PRNT30BRANCHIFYES#ŠCMP.L‚QFILEN(A1),D3†SAMEFILENAME?ŠBNE„PRNT20BRANCHIFNOŠCMP.L‚QFILEN+4(A1),D2„SAME?ŠBNE6 „PRNT20BRANCHIFNO#ŠMOVE.WFHSEXT(A1),D7†GETEXTENSIONŠCMP.W‚QEXT(A1),D7ˆSAME?"ŠBNE„PRNT20BRANCHIFNOTTHESAME)ŠBRA.S‚PRNT40FOUNDTHEMATCHINGFILENAME&PRNT30„CMP.L‚QJOBID(A1),D3†SAMEJOBID?ŠBNE„PRNT20BRANCHIFNO0PRNT40„BTSTƒ#QSTATRDY,QSTAT(A1)READYTOOUTPUT? ŠBEQ.S‚PRNT56BRANCHIFNO,ERROR)ŠTST.W‚EVTUNM(A5)‰USER0REQUESTINGTHIS?ŠBEQ.S‚PRNT60BRANCHIFYES,OK%ŠMOVE.WEVTUNM(A5),D1†GETUSERNUMBERŠCMP.W‚QJOBID(A1),D1†SAMEUSER?ŠBEQ.S‚PRNT60BRANCHIFYES,OK0PRNT50„MOVE.L#FSTAIU,D0‰SETINVALIDUSERNUMBER$PRNTRTNƒBRA„SPLACKRETURNFROMEVENT.PRNT55„MOVE.L#FSTAIE,D0‰SETTOINTERNALERRORŠBRA„PRNTRTNŒRETURN5PRNT56„MOVE.L#FSTAWS,D0‰SETTOWRONGSTATEFORSTARTŠBRA„PRNTRTNŒRETURN**‚HEREIFMATCHINGQUEUEENTRY*&PRNT60„CLR.L‚QSIZE(A1)ŠFORCEZEROSIZE2ŠMOVE.WFHSOPT(A6),D0†GET#OFCOPIES,IFSPECIFIED>ŠBEQ.S‚PRNT65ˆBRANCHIFNOTSPECIFIED,USEWHAT'SALREADYTHERE*ŠMOVE.BD0,QCOPYS(A1)†SAVENEW#OFCOPIES1PRNT65„LEA„SCRATCH-DATASG(A4),A2USESCRATCHAREA#ŠMOVE.L#QLNG/2,D0‰#WORDSINENTRY)PRNT70„MOVE.W(A1)+,(A2)+ˆSAVETHISENTRYŠSUB.L‚#1,D0ŽDECREMENTCOUNTŠBNE.S‚PRNT70BRANCHTILMOVED8ŠBSR„DELENTRY‹GODELETETHISENTRYFROMCURRENTPOSITIONŠTST„D7‘GOODRETURN?"ŠBMI„PRNT55BRANCHIFERRORRETURN!ŠMOVE.L#-1,D4SEARCHQUEUEAGAINŠCLR.L‚D5‘ANYFORMSIDŠCLR.L‚D6‘ANYDEVICE-ŠMOVE.B#QSTATRDY,D7‡LOOKFOR1STREADYENTRYŠBSR„FNDENTRY‹GOFINDONE4ŠLEA„SCRATCH-DATASG(A4),A1POINTTOTHISENTRYAGAIN7ŠMOVE.LCURREC-DATASG(A4),D7GETRECORD#FORINSERTION"ŠCMP.L‚#10,D7VALIDRECORDNUMBER?ŠBGE.S‚PRNT73BRANCHIFYES,ŠMOVE.L#10,D7FORCE1STENTRYRECORDNUMBER$ŠMOVE.LD7,CURREC-DATASG(A4)SAVEIT1PRNT73„BSR„INSRTREC‹GOINSERTBACKINTOTHEQUEUE#ŠMOVE.L#QLNG/2,D0‰GETENTRYLENGTH*ŠLEA„QBUF-DATASG(A4),A2GETBUFFERADDRESSŠMOVE.LA2,A3ŽSAVEIT=PRNT75„MOVE.W(A1)+,(A2)+ˆMOVETHEENTRYBACKINTOITSBUFFER"ŠSUB.L‚#1,D0ŽDECREMENTTHECOUNTERŠBNE.S‚PRNT75BRANCHTILMOVED$ŠMOVE.LA3,A1ŽRESTOREBUFFERADDRESS1ŠBRA„PRNT170ŒGOSTARTTHISONEIFDEVICENOTBUSY/PRNT80„MOVE.L#FSTANNM,D0ˆNON-EXISTENTFILENAMEŠBRA„PRNTRTNŒGORETURN*(*‚HEREIFNON-SPOOLERFILENAMESPECIFIED*5PRNT90„MOVE.L#-1,D4SEARCHQUEUE,SEEIFALREADYHEREŠMOVE.LFHSSAD(A6),D6†DEVICEŠMOVE.LFHSEAD(A6),D5†FORMSID PRNT100ƒMOVE.L#-1,D7ANYSTATUS(ŠBSR„FNDENTRY‹GOSEEIFAMATCHINGENTRY4ŠMOVE.LCURREC-DATASG(A4),D4SAVETHISRECORDNUMBERŠTST„D7‘FOUNDONE?1ŠBMI.S‚PRNT120ŒBRANCHIFNO,GOINSERTTHENEWONE0ŠLEA„QVOL(A1),A2ˆSTARTADDRESSOFQUAL.FILENAME6ŠLEA„FHSVOL(A6),A3†STARTADDRESSOFSPECIFIEDFILENAME(ŠMOVE.L#6,D1Ž#OFLONGWORDSTOCOMPARE(PRNT110ƒCMP.L‚(A2)+,(A3)+ˆSAMEFILENAME?,ŠBNE„PRNT100ŒBRANCHIFDIFFERENT-SEARCHMOREŠSUB.L‚#1,D1ŽDECRMENTCOUNTER1ŠBNE.S‚PRNT110ŒBRANCHIFMOREFILENAMETOCOMPARE7ŠBRA„PRNT40INQUEUEALREADY,GOSEEIFCANMAKEITNEXT*/*‚BUILDASPOOLERQUEUEENTRYFORTHISFILENAME*5PRNT120ƒLEA„QBUF-DATASG(A4),A1BUFFERFORQUEUEENTRY ŠMOVE.W#QLNG/2,D0‰BUFFERLENGTH,PRNT130ƒCLR.W‚(A1)+ŽCLEARITBEFOREUSINGITŠSUB.L‚#1,D0ŽDECREMENTCOUNTER!ŠBNE.S‚PRNT130ŒBRANCHTILCLEARED.ŠLEA„QBUF-DATASG(A4),A1RESTOREBUFFERADDRESS+ŠMOVE.LFHSSAD(A6),(A1)+ƒOUTPUTDEVICENAME%ŠBEQ„PRNT50DEVICENAMECAN'TBEZERO"ŠMOVE.LFHSEAD(A6),D0†GETFORMSID"ŠBNE.S‚PRNT140ŒBRANCHIFNOTBLANKŠMOVE.L#'STND',D0‰USEDEFAULT PRNT140ƒMOVE.LD0,(A1)+‹FORMSID(ŠMOVE.L#6,D0ŽLENGTHOFFILENAMETOMOVE-ŠLEA„FHSVOL(A6),A2†STARTADDRESSTOMOVEFROM6PRNT145ƒMOVE.L(A2)+,(A1)+ˆMOVETHEQUALIFIEDFILENAMEŠSUB.L‚#1,D0ŽDECREMANRCOUNTERŠBNE.S‚PRNT145ŒBRANCHTILMOVED"ŠMOVE.LEVTTSK(A5),(A1)+ƒTASKNAME ŠMOVE.LEVTSES(A5),(A1)+ƒSESSIONŠCLR.L‚(A1)+ŽJOBID,GETLATER&ŠMOVE.BEVTPRI(A5),(A1)+ƒTASKPRIORITY.ŠLEA„QBUF-DATASG(A4),A1RESTOREBUFFERADDRESS*ŠMOVE.WFHSOPT(A6),D0†GETNUMBEROFCOPIESŠTST.B‚D0‘ANYVALUE?#ŠBNE.S‚PRNT150ŒBRANCHIFYES,USEIT#ŠMOVE.L#1,D0ŽNOVALUE,FORCE1COPY-PRNT150ƒMOVE.BD0,QCOPYS(A1)†NUMBEROFCOPIES.ŠMOVE.L#G6 TDTIM,D0‰GETDATEANDTIMEDIRECTIVE5ŠLEA„SCRATCH-DATASG(A4),A0USESCRATCHFORTHEANSWERŠTRAPƒ#1‘GOGETTHEM%ŠMOVE.L(A0)+,QDATE(A1)„SAVETHEDATE$ŠMOVE.L(A0),QTIME(A1)…SAVETHETIME1ŠBSETƒ#QSTATRDY,QSTAT(A1)SETFORREADYTOOUTPUTŠBSR.S‚ASFSIZEŒGOGETFILESIZEŠBNE„PRNTRTNŒERRORRETURN*8*‚DETERMINEJOBID,FORMSID,ANDPUTENTRYINTOTHEQUEUE*ŠBSR„GTJOBNGOGETJOBNUMBERŠTST.L‚D7‘CHECKRETURNŠBNE„PRNTRTNŒERRORRETURN2ŠMOVE.WEVTUNM(A5),QJOBID(A1)USERNUMBERTOJOBID#ŠBNE.S‚PRNT160ŒBRANCHIFNOTUSER0.ŠCMP.L‚#0,A4ŽAREWEINEXORmacs?(YESISA4=0)EŠBNE.S‚PRNT160BRANCHIFNOTEXORmacs,USETHEUSERNUMBERWENOWHAVE(ŠBSR„GTUSERGOGETLOGGEDONUSERNUMBER1PRNT160ƒMOVE.WD6,QJOBID+2(A1)„OCCURENCETOJOBID&ŠCLR.L‚D7‘SET-UPFORNOTFROMCONTINUEŠBSR„MTCDFŽGOSETUPFORMSIDŠTST„D7‘GOODRETURN?ŠBMI„PRNT55ERRORRETURN>ŠMOVE.L#10,CURREC-DATASG(A4)SETUPFORINSERTATTOPOFFILE.ŠBSR„STPRIRPL‹GOSETPRIORITYANDPUTINQUEUEŠTST„D7‘GOODRETURN?%ŠBMI„PRNT55BRANCHIFANERRORRETURN+PRNT170ƒBSR„STRTNXTŒGOSEEIFONECANSTARTŠCLR.L‚D0‘GOODRETURNŠBRA„PRNTRTNŒGORETURNŠPAGE*!*‚ASSIGNTHEFILETOGETTHESIZE*‚ENTRY:A1=QUEUEENTRYADDRESS*ˆA4=BASEADDRESSREGISTER*‚EXIT:D0=0=GOODRETURN*‡D0=ANYTHINGELSE=ERRORRETURN*‡QSIZE(A1)=FILESIZE*‚USES:01234567*…DR*…A*P**PƒP ASFSIZEƒEQU„*0ŠLEA„FHSPB-DATASG(A4),A0USEFHSPARAMETERBLOCK/ŠSFHSCOFHASGN,FOPPR,A0„ASSIGNWITHPUBLICREADŠMOVE.B#3,FHSLUN(A0)†USELUN3BŠLEA„6(A6),A2USEPARAMETERBLOCKADDRESSSTARTINGATVOLUME‚USERSAŠLEA„6(A0),A3‚USEPARAMETERBLOCKADDRESSSTARTINGATVOLUME‚MINEŠMOVE.L#6,D0ŽLENGTHOFMOVE5ASF10…MOVE.L(A2)+,(A3)+ˆMOVEINTHEFILEINFORMATIONŠSUB.L‚#1,D0ŽDECREMENTCOUNTER!ŠBNE.S‚ASF10ŽBRANCHTILMOVEDALL"ŠMOVE.BFHSFIL(A0),D0†GETFILENAME'ŠCMP.B‚#SPOOLF,D0‰SEEIFASPOOLERFILE)ŠBNE.S‚ASF15ŽBRANCHIFNOTASPOOLERFILE?ŠMOVE.LSPLDEV-DATASG(A4),FHSVOL(A0)ISSPOOLER,USETHISVOLUME$ASF15…CLR.W‚FHSWCD(A0)‰PROTECTCODESŠTRAPƒ#3‘ASSIGNTHISFILE ŠBNE.S‚ASFERRBRANCHIFANERRORŠMOVE.LA0,A2ŽSAVETHISADDRESS8ŠLEA„IOSPB-DATASG(A4),A0GETIOSPARAMETERBLOCKADDRESSŠMOVE.B#3,IOSLUN(A0)†LUNEŠSIOSCOIOPOST,IOPREC+IOPRAN,A0POSITIONTOENDOFFILE,RANDOMRECORD@ŠMOVE.L#-1,IOSRRN(A0)…POSITIONTOEND,WILLRETURNLASTRECORD#ŠTRAPƒ#2‘DOIT"ŠBEQ.S‚ASF20ŽBRANCHIFGOODRETURN.ŠCLR.L‚IOSRRN(A0)‰FORCENORECORDSONANERROR(ASF20…MOVE.LIOSRRN(A0),D0†GET#RECORDS+ŠMOVE.LD0,QSIZE(A1)‡SAVENUMBEROFRECORDS-ŠMOVE.LA2,A0ŽRESTOREPARAMETERBLOCKADDRESS-ŠMOVE.W#FHCLOS,FHSCMD(A0)NOWCLOSETHEFILEŠTRAPƒ#3‘DOITASFERR„RTS—RETURNŠPAGE*,*‚COPYSPL‚CHANGE#COPIESFORASPOOLERFILE*‹FROMUSERCOMMAND$0220*‹#COPIESMUSTBESPECIFIED+*‹EITHERJOBIDORFILENAMEMAYBESPECIFIED*‹USER0MAYCHANGEANYENTRY *‹USERXMAYONLYCHANGEHISOWN*‚ENTRY:D0=EVENTLENGTH*ˆA4=BASEADDRESSREGISTER*ˆA5=EVENTADDRESS(*ˆA6=REQUESTOR'SPARAMETERBLOCKADDRESS*‚EXIT:RETURNFROMEVENT*‚CALLS:FNDENTRY„RPLREC** COPYSPLƒEQU„*ŠCLR.L‚D1‘CLEARFORUSE-ŠMOVE.LFHSSIZ(A6),D3†SEEIFJOBIDSPECIFIEDŠBNE.S‚COPY10BRANCHIFYES0ŠMOVE.LFHSFIL(A6),D3†FILENAMEMUSTBESPECIFIED$ŠBEQ„COPY60BRANCHIFITISN'T,ERROR,ŠMOVE.LFHSFIL+4(A6),D2„GETRESTOFFILENAMEŠMOVE.L#1,D1ŽSETFILENAMEFLAG,COPY10„MOVE.L#-1,D4SETSEARCHQUEUEATTOPŠCLR.L‚D5‘ANYFORMSIDŠCLR.L‚D6‘ANYDEVICECOPY20„MOVE.L#-1,D7ANYSTATUSŠBSR„FNDENTRY‹GOFINDANENTRY4ŠMOVE.LCURREC-DATASG(A4),D4SAVETHISRECORDNUMBERŠTST„D7‘FOUNDANENTRY? ŠBMI.S‚COPY60BRANCHIFNO,ERRORŠTST„D1‘LOOKINGFORJOBID?ŠBEQ.S‚COPY70BRANCHIFYES#ŠCMP.L‚QFILEN(A1),D3†SAMEFILENAME?ŠBNE„COPY20BRANCHIFNOŠCMP.L‚QFILEN+4(A1),D2„SAME?ŠBNE„COPY20BRANCHIFNO#ŠMOVE.WFHSEXT(A6),D7†GETEXTENSION"ŠCMP.W‚QEXT(A1),D7ˆSAMEEXTENSION?ŠBNE„COPY20BRANCHIFNO%ŠCMP.B‚#SPOOLF,D3‰ASPOOLERFILENAME?ŠBEQ.S‚COPY30BRANCHIFYESCŠMOVE.LFHSVOL(A6),D7„NON-SPOOLERFILENAME,CHECK7 VOLUMEANDCATALOGŠCMP.L‚QVOL(A1),D7ˆSAME?ŠBNE„COPY20BRANCHIFNO!ŠMOVE.LFHSCLG(A6),D7†GETCATALOGŠCMP.L‚QCATLG(A1),D7†SAME?ŠBNE„COPY20BRANCHIFNO+ŠMOVE.LFHSCLG+4(A6),D7„GETRESTOFCATALOGŠCMP.L‚QCATLG+4(A1),D7„SAME?ŠBNE„COPY20BRANCHIFNO/COPY30„TST.W‚EVTUNM(A5)‰USER0REQUESTINGTHIS?ŠBEQ.S‚COPY35BRANCHIFYES,OK%ŠMOVE.WEVTUNM(A5),D1†GETUSERNUMBER&ŠCMP.W‚QJOBID(A1),D1†SAMEUSERNUMBER? ŠBNE.S‚COPY80BRANCHIFNO,ERRORCOPY35„CLR.L‚D0‘CLEARFORUSE*ŠMOVE.WFHSOPT(A6),D0†GETNUMBEROFCOPIESŠTST.B‚D0‘ZERO? ŠBNE.S‚COPY40BRANCHIFNOTZEROŠMOVE.B#1,D0ŽFORCE15COPY40„MOVE.BD0,QCOPYS(A1)†SAVENUMNUMBEROFCOPIES ŠCLR.L‚D75ŠBSR„RPLRECGOPUTUPDATEDRECORDBACKINTOTHEQUEUEŠTST„D7ŠBEQ.S‚COPYRTNŒBRANCHIFYES+COPY50„MOVE.L#FSTAIE,D0‰SETINTERNALERROR$COPYRTNƒBRA„SPLACKRETURNFROMEVENT/COPY60„MOVE.L#FSTANNM,D0ˆFILENAMEDOEN'TEXISTŠBRA„COPYRTNŒGORETURN©70„CMP.L‚QJOBID(A1),D3†SAMEJOBID?"ŠBNE„COPY20BRANCHIFNOTTHESAME,ŠBRA„COPY30YES,THESAME,GOFIXUPTHEENTRY3COPY80„MOVE.L#FSTAIU,D0‰SETTIINVALIDUSERNUMBERŠBRA„COPYRTNŒRETURNŠPAGE*‚QUESPL‚OUTPUTSPOOLERQUEUE*ŠFROMUSERCOMMAND‚$0240*‚TOUSE:SPECIFYŒACTION*‰------------+*‰DEVICELISTQUEUEENTRIESFORTHATDEVICE)*‰USER#LISTQUEUEENTRIESFORTHATUSER-*‰SESSIONŒLISTQUEUEENTRIESFORTHATSESSION*‰QUEUEONLY‰LISTALLENTRIES*‚ENTRY:D0=EVENTLENGTH*ˆA4=BASEADDRESSREGISTER*ˆA5=EVENTADDRESS(*ˆA6=REQUESTOR'SPARAMETERBLOCKADDRESS*‚EXIT:RETURNFROMEVENT4*‚CALLS:FNDENTRY„OUTENT„OUTMGS„FMSINTƒSETDEVRESTDEV* QUESPL„EQU„*#ŠBSR„SETDEVGOASSIGNOUTPUTDEVICEŠCLR.L‚D2‘CLEARFORUSE)ŠCLR.B‚SPLFLG1-DATASG(A4)CLEARFLAGBYTE+ŠLEA„SPLFLG1-DATASG(A4),A2GETFLAGADDRESS1ŠMOVE.LFHSVOL(A6),D3†SEEIFDEVICEWASSPECIFIEDŠBEQ.S‚QUE10ŽBRANCHIFNO1ŠCMP.L‚#'FORM',D3‰SEEIFWANTSDEVICE-FORMSTABLEŠBEQ„QUE110BRANCHIFYES&ŠBSETƒ#OUTDEV,(A2)‡SETLOOKFORDEVICE!ŠBRA.S‚QUE40ŽGOSET-UPFOROUTPUT9QUE10…MOVE.WFHSUSN(A6),D3†SEEIFLOOKINGFORUSERNUMBERŠBEQ.S‚QUE20ŽBRANCHIFNO.ŠBSETƒ#OUTUSN,(A2)‡SETLOOKINGFORUSERNUMBER!ŠBRA.S‚QUE40ŽGOSET-UPFOROUTPUT:QUE20…MOVE.WFHSOPT(A6),D3†SEEIFLOOKINGFORTHISSESSION/ŠBEQ.S‚QUE30ŽBRANCHIFNO,OUTPUTCOMPLETEQUEUE1ŠBSETƒ#OUTSES,(A2)‡SETTOTHISSESSIONFOROUTPUT!ŠBRA.S‚QUE40ŽGOSET-UPFOROUTPUT&QUE30…BSETƒ#OUTALL,(A2)‡SETOUTPUTALL)QUE40…MOVE.L#-1,D4SETATSTARTOFQUEUEŠCLR.L‚D6‘SETTOANYDEVICE(ŠBTSTƒ#OUTDEV,(A2)‡LOOKINGFORADEVICE?ŠBEQ.S‚QUE50ŽBRANCHIFNO%ŠMOVE.LD3,D6ŽLOOKINGFORTHISDEVICEQUE50…CLR.L‚D5‘ANYFORMSIDQUE60…MOVE.L#-1,D7ANYSTATUSŠBSR„FNDENTRY‹GOFINDANENTRY4ŠMOVE.LCURREC-DATASG(A4),D4SAVETHISRECORDNUMBERŠTST„D7‘FOUNDANENTRY?ŠBMI.S‚QUE100BRANCHIFNO"ŠBTSTƒ#OUTALL,(A2)‡OUTPUTTINGALL?ŠBEQ.S‚QUE80ŽBRANCHIFNO%QUE70…BSR„OUTENTGOOUTPUTTHISENTRYŠADD.L‚#1,D2ŽCOUNTITŠBRA„QUE60ŽGOGETNEXTENTRY)QUE80…BTSTƒ#OUTDEV,(A2)‡OUTPUTBYDEVICE?ŠBNE„QUE70ŽBRANCHIFYES)ŠBTSTƒ#OUTUSN,(A2)‡OUTPUTBYUSERNUMBER?ŠBEQ.S‚QUE90ŽBRANCHIFNO&ŠCMP.W‚QJOBID(A1),D3†SAMEUSERNUMBER?ŠBEQ„QUE70ŽBRANCHIFYES&ŠBRA„QUE60ŽNOTTHESAME,GETNEXTENTRY-QUE90…MOVE.LEVTSES(A5),D3†GETSESSIONNUMBERŠCMP.L‚QSESS(A1),D3‡SAME?ŠBEQ„QUE70ŽBRANCHIFTHESAME)ŠBRA„QUE60ŽNOTTHESAME,GOGETNEXTENTRYQUE100„TST„D2‘ANYOUTPUT?"ŠBNE.S‚QUERTNBRANCHIFYES,RETURN1ŠLEA„MSG1-DATASG(A4),A6OUTPUTNOENTRIESMESSAGEŠMOVE.L#16,D0MESSAGELENGTH!ŠBSR„OUTMSGGOOUTPUTTHEMESSAGE-QUERTN„BSR„RESTDEVŒGOCLOSETHEOUTPUTDEVOCE;ŠLEA„EVTLEN(A5),A6†RESTOREPOINTERTOUSERSPARAMETERBLOCKŠBRA„SPLACKRETURNFROMEVENT*)*‚HEREIFTOOUTPUTDEVICE-FORMSIDTABLE*-QUE110„LEA„MSG2-DATASG(A4),A6HEADINGMESSAGEŠMOVE.L#66,D0MESSAGELENGTHŠBSR„OUTMSGOUTPUTTHEHEADINGŠCLR.L‚D7‘CLEARFORUSEŠCLR.L‚D1‘CLEARCOUNTER/ŠLEA„FMSPKT-DATASG(A4),A0FMSINTPACKETADDRESS&ŠMOVE.B#RDCMD,FMSCMD(A0)‚READCOMMAND5QUE120„LEA„QBUF-DATASG(A4),A2RETURNEDBUFFERADDRESSŠMOVE.7 LA2,FMSBUF(A0)†TOPACKET+ŠMOVE.LD1,FMSREC(A0)†RECORDNUMBERTOREAD$ŠMOVE.W#1,FMSRECN(A0)…READ1RECORDŠBSR„FMSINTGOREADARECORDŠBNE.S‚QUE160ERRORRETURN%ŠMOVE.L#RREC,D2‹#ENTRIESPERRECORD$QUE130„MOVE.LRDEV(A2),D0ˆGETDEVICEŠTST.L‚D0‘ANYDEVICE?ŠBEQ.S‚QUE160DONEIFNODEVICE0ŠLEA„SCRATCH-DATASG(A4),A1OUTPUTBUFFERADDRESS-ŠMOVE.LD0,(A1)+‹DEVICENAMETOOUTPUTBUFFERŠMOVE.L#BLANK,(A1)+‡BLANKSŠMOVE.LRFRM(A2),(A1)+…FORMSIDŠMOVE.L#BLANK,(A1)+‡BLANKSŠMOVE.LRSTAT(A2),D0‡GETSTATUS+ŠBEQ.S‚QUE140BRANCHIFOKTOOUTPUTSTATUS ŠMOVE.L#'WAIT',(A1)‡WAITSTATUSŠBRA.S‚QUE150GOOUTPUT'QUE140„MOVE.L#'OK‚',(A1)‡SETOKSTATUS5QUE150„LEA„SCRATCH-DATASG(A4),A6RESETOUTPUTADDRESSŠMOVE.L#20,D0MESSAGELENGTHŠADD.L‚#1,D7ŽCOUNTIT!ŠBSR„OUTMSGGOOUTPUTTHISDEVICE"ŠADD.L‚#RLNG,A2‹BUMPTONEXTENTRY(ŠSUB.L‚#1,D2ŽDECREMENTNUMBEROFENTRIES"ŠBNE„QUE130BRANCHIFMOREENTRIES'ŠADD.L‚#1,D1ŽBUMPTONEXTRECORDNUMBERŠCMP.L‚#9,D1ŽSEEIFDONE"ŠBLE„QUE120BRANCHIFMORETOREAD!QUE160„TST„D7‘OUTPUTANYDEVICES?ŠBNE„QUERTNBRANCHIFYES)ŠLEA„MSG3-DATASG(A4),A6OUTPUTNODEVICESŠMOVE.L#36,D0MESSAGELENGTHŠBSR„OUTMSGGOOUTPUTŠBRA„QUERTNGORETURNŠPAGE*8* ATTRSPL RETREIVE DEVICE ATTRIBUTES FOR ORIGINAL DEVICE+*‰ASSIGNMENTANDSENTTHEMTOTHEREQUESTOR* ENTRY:D0=EVENT LENGTH*‡A4=BASEADDRESSREGISTER*‡A5=EVENTADDRESS'*‡A6=REQUESTORSPARAMETERBLOCKADDRESS* EXIT:RETURN FROM EVENT* CALLS:FNDENTRY* ATTRSPLƒEQU„*,ŠCMP.L‚#1,EVTSES(A5)†FROMASPOOLERSUBTASK?ŠBNE.S‚ATTR05BRANCHIFNOŠMOVE.L#-1,D3SETSUBTASKFLAGŠBRA.S‚ATTR25GOGETATTRIBUTES$ATTR05„CLR.L‚D3‘SETNORMALTASKFLAG*ŠMOVE.L#-1,D4STARTSEARCHATTOPOFFILEŠCLR.L‚D5‘ANYFORMSŠCLR.L‚D6‘ANYDEVICEATTR10„CLR.L‚D7‘CLEARFORUSE*ŠMOVE.B#QSTATACT,D7‡LOOKFORACTIVETASKSŠBSR„FNDENTRY‹GOFINDANENTRY4ŠMOVE.LCURREC-DATASG(A4),D4SAVETHISRECORDNUMBERŠTST.L‚D7‘CHECKRETURNŠBPL.S‚ATTR15GOODRETURN)ŠMOVE.L#FSTAILU,D0ˆSETINVALIDLUNERRORŠBRA„ATTRTNGORETURN-ATTR15„LEA„FHSFIL(A6),A2†GETFILENAMEADDRESS%ŠLEA„QFILEN(A1),A3†GETQUEUEFILENAME&ŠMOVE.L#5,D7ŽNUMBEROFWORDSTOCHECK3ATTR20„CMP.W‚(A2)+,(A3)+ˆLOOKFORMATCHINGFILENAME!ŠBNE„ATTR10BRANCHIFNOTAMATCHŠSUB.L‚#1,D7ŽDECREMENTCOUNTER%ŠBNE„ATTR20BRANCHIFMORETOCOMPARE** FOUND THE MATCHING ENTRY*6ATTR25„LEA„FHSPB-DATASG(A4),A0PARAMETERBLOCKADDRESS6ŠMOVE.W#FHRATT,FHSCMD(A0)RETREIVEATTRIBUTESCOMMAND'ŠMOVE.W#USER0,FHSUSN(A0)‚USERNUMBER0ŠMOVE.B#DOUT,FHSLUN(A0)ƒLUNŠTRAPƒ#3‘DOITŠBEQ.S‚ATTR40GOODRETURNŠTST.L‚D3‘SEEIFFORASUBTASK#ŠBMI„ATTRTNBRANCHIFSUBTASK,ERROR/ŠMOVE.LQDEVICE(A1),FHSVOL(A0)TRYTOASSIGNITŠMOVE.L#BLANK,D0ŠBLANKS+ŠLEA„FHSCLG(A0),A2†STARTADDRESSFORBLANKSŠMOVE.L#9,D2Ž#WORDSTOBLANK0ATTR30„MOVE.WD0,(A2)+‹BLANKSTOPARAMETERBLOCKŠSUB.L‚#1,D2ŽDECREMENTCOUNTER$ŠBNE.S‚ATTR30BRANCHTILBLANKEDALLŠMOVE.B#DOUT,FHSLUN(A0)ƒLUN ŠMOVE.W#USER0,FHSUSN(A0)‚USER0+ŠSFHSCOFHASGN,FOPPW,A0„ASSIGN,PUBLICWRITEŠCLR.W‚FHSWCD(A0)‰PROTECTCODESŠTRAPƒ#3‘DOIT.ŠMOVE.W#FHRATT,FHSCMD(A0)RETREIVEATTRIBUTESŠTRAPƒ#3‘DOITŠBNE.S‚ATTRTNERRORRETURN#ŠMOVE.W#FHCLOS,FHSCMD(A0)CLOSEITŠTRAPƒ#3‘DOITŠBNE.S‚ATTRTNERRORRETURNŠCLR.L‚D0‘SETFORGOODRETURN*&*‚MOVETHEATTRIBUTESTOTHEREQUESTOR*/ATTR40„MOVE.WFHSOPT(A0),FHSOPT(A6)DEVICETYPE)ŠMOVE.LFHSVOL(A0),FHSVOL(A6)DEVICENAME)ŠMOVE.LFHSSIZ(A0),FHSSIZ(A6)PAGELENGTH(ŠMOVE.WFHSWCD(A0),FHSWCD(A6)ATTRIBUTES+ŠMOVE.WFHSLRL(A0),FHSLRL(A6)RECORDLENGTH%ŠMOVE.LA0,A2ŽPARAMETERBLOCKADDRESS!ŠMOVE.L#SPLID,(A2)+‡MYTASKNAMEŠMOVE.L#MYSES,(A2)+‡SESSION+ŠMOVE.LA6,(A2)+‹ADDRESSTOSTARTMOVEFROM,ŠMOVE.LEVTTSK(A5),(A2)+ƒRECEIVINGTASKNAME ŠMOVE.LEVTSES(A5),(A2)+ƒSESSION+ŠMOVE.LEVTRA0(A5),(A2)+ƒREQUESTORSADDRESS#ŠMOVE.L#FHSBLN,(A2)‡LENGTHOFMOVE)ŠMOVE.L#MOVELL,D0‰MOVELOGICALDIRECTIVEŠTRAPƒ#1"ATTRTN„BRA„SPLACKRETURN,D0ISSETŠPAGE*9*‚GTUSERƒGETTHELOGGEDONUSERNUMBERFROM&S8 CT,IFTHERE*,*‚MOVESUSERNUMBERTOQJOBID.W(A1)IFFOUND**‚USES:01234567*…D *…APP**P*4GTUSER„MOVE.LA0,A3ŽSAVEA0-SEEIFNOTREALLYUSER0G‰LEASCRATCH-DATASG(A4),A0USESCRATCHFORTHEGETSEGATTRIBUTESPARA. ŠMOVE.L#'&SCT',(A0)‡TARGETTASK ŠMOVE.LEVTSES(A5),4(A0)ƒSESSIONŠCLR.L‚8(A0)ŽNOOPTIONS#ŠMOVE.L#'.SCT',12(A0)…SEGMENTNAME*ŠCLR.L‚16(A0)DON'TSUPPLYLOGICALADDRESSŠCLR.L‚20(A0)N/A&ŠLEA„28(A0),A2ŠRETURNEDBUFFERADDRESS(ŠMOVE.LA2,24(A0)ŠTOTHEPARAMETERBLOCK,ŠMOVE.L#RCVSA,D0ŠRECEIVESEGMENTATTRIBUTESŠTRAPƒ#1‘DOIT2ŠBNE.S‚GTUSERTŒIGNORETHEMOVELOGICALIFANERROR4ŠLEA„6(A2),A2‹GETADDRESSOFSEGMENTLOGICALADDRESSAŠLEA„SCRATCH-DATASG(A4),A0USESCRATCHFORMOVELLPARAMETERBLOCK9ŠMOVE.L#'&SCT',0(A0)†TASKNAMETHATCONTAINSUSERNUMBER ŠMOVE.LEVTSES(A5),4(A0)ƒSESSION-ŠMOVE.L(A2),8(A0)‰ADDRESSOFTHEWORDTOGET2ŠADD.L‚#$9C,8(A0)‰ADDINTHEOFFSETTOUSERNUMBER"ŠMOVE.L#SPLID,12(A0)†MYTASKNAME ŠMOVE.L#MYSES,16(A0)†MYSESSION6ŠLEA„QJOBID(A1),A2†GETADDRESSTOSAVETHEUSERNUMBER(ŠMOVE.LA2,20(A0)ŠTOTHEPARAMETERBLOCKŠMOVE.L#2,24(A0)ŠGET2BYTES)ŠMOVE.L#MOVELL,D0‰MOVELOGICALDIRECTIVEŠTRAPƒ#1‘DOIT0GTUSERTƒMOVE.LA3,A0ŽRESTOREA0,IGNOREANYERRORŠRTS—RETURNTOCALLERŠPAGE*#*‚STRTSPL‚STARTSPOOLERFILEOUTPUT**‚1)CREATEATCBFORNEWTASK*„TASKNAME=DEVICENAME8*„IFCREATETCBDOESN'TWORK,MEANSDEVICEISBUSY,RETURN1*‚2)GRANTASHAREDSEGMENT(PROG)TOTHENEWTASK+*‚3)ALLOCATEADATASEGMENTTOTHENEWTASK-*‚4)MOVESTART-UPINFORMATIONTOTHENEWTASK*‚5)STARTTHENEWTASK*‚6)UPDATETHEQUEUEENTRY**‚7)WRITETHEENTRYBACKTOTHEQUEUEFILE***‚ENTRY:A1=ADDRESSOFQUEUEENTRYTOSTART*ˆA4=BASEADDRESSREGISTER*‚EXIT:D7=0=TASKSTARTED2*‡D7=-1=TASKNOTSTARTED,FILENOTBEINGOUTPUTNOW*‚USES:01234567 *…D***‰R *…A*P*PP*‚CALLS:FMSINT„CKFORMS** STRTSPLƒEQU„* ŠMOVE.LA3,-(A7)‹SAVECALLERSA3*ŠBTSTƒ#QSTATRDY,QSTAT(A1)READYTOOUTPUT?$ŠBEQ.S‚STRT10BRANCHIFNO,NOTREADY3ŠBTSTƒ#QSTATWAT,QSTAT(A1)MUSTWAITFORACONTINUE?3ŠBNE.S‚STRT10BRANCHIFMUSTWAIT-CANNOTOUTPUTNOW,ŠBTSTƒ#QSTATFRM,QSTAT(A1)MATCHINGFORMSID?6ŠBNE.S‚STRT10BRANCHIFNOTMATCHING,CANNOTOUTPUTNOW(ŠBSR„CKFORMSŒGOSEEIFMATCHINGFORMSIDŠTST„D7‘ISIT?1ŠBMI„STRT40BRANCHIFNO-STATUS=WAIT0621844+ŠLEA„SCRATCH-DATASG(A4),A0USESCRATCHAREA?ŠMOVE.LA0,A2ˆADDRESSTOUSEFORSETTINGUPTHEPARAMETERBLOCK/ŠMOVE.LQDEVICE(A1),(A2)+‚TASKNAME=DEVICENAMEŠMOVE.L#MYSES,(A2)+‡SESSION1'ŠMOVE.W#CTOPMS,(A2)+†MONITORSPECIFIEDŠMOVE.L#SPLID,(A2)+‡MONITOR=MEŠMOVE.L#MYSES,(A2)+‡SESSION1#ŠMOVE.B#100,(A2)+‰INITIALPRIORITY#ŠMOVE.B#255,(A2)+‰HIGHESTPRIORITYCŠMOVE.W#$8800,(A2)+„SYSTEMTASK+EXECWILLFIXUPTHEENTRYADDRESS(ŠLEA„TSKSTRT(PC),A3…GETTASKENTRYPOINT2ŠCMP.L‚#0,A4ŽAREWERUNNINGWITHMMU?(A4=0IFMMU)=ŠBNE.S‚STRT07‰BRANCHIFNOMMU,ENTRYADDRESSISCORRECTASIS*=*ˆHAVEANMMU,MUSTFIXUPENTRYADDRESSTOBYPASSTHELOGICAL*ˆSTARTADDRESSOFTHISSEGMENT**ŠMOVE.L#ENDATA,D7‰GETENDOFDATASEGMENT!ŠDIVUƒ#255,D7ŒGETNUMBEROFPAGESŠCLR.L‚D2‘CLEARFORUSE%ŠMOVE.WD7,D2ŽGETTHENUMBEROFPAGESŠSWAPƒD7‘SEEIFAREMAINDERŠTST.W‚D7‘AREMAINDER?$ŠBEQ.S‚STRT05BRANCHIFNOREMAINDER*ŠADD.W‚#1,D2ŽAREMAINDER,ADJUST#OFPAGESSTRT05„MULUƒ#256,D2ŒGETLENGTH/ŠSUB.L‚D2,A3ŽACTUALENTRYPOINTOFSPAWNEDTASK'STRT07„MOVE.LA3,(A2)+‹TASKENTRYPOINTŠCLR.W‚(A2)+ŽUSERID=0!ŠMOVE.L#CRTCB,D0ŠCREATETCBCODEŠTRAPƒ#1‘CREATEATCB%ŠBEQ.S‚STRT20BRANCHIFAGOODRETURN)STRT10„MOVE.L(A7)+,A3‹RESTORECALLERSA3*ŠMOVE.L#-1,D7SETOUTPUTNOTSTARTEDFLAGŠRTS—RETURNTOCALLER*-* GRANT SHARED SEGMENT ACCESS TO THE NEW TASK*8STRT20„LEA„SCRATCH-DATASG(A4),A0PARAMETERBLOCKADDRESS;ŠMOVE.LA0,A2ŒADDRESSTOUSEFORSETTINGUPPARAMETERBLOCK*ŠMOVE.L#SHRSEG,D0‰SHARESEGMENTDIRECTIVE:ŠMOVE.LQDEVICE(A1),(A2)+‚TASKNAMETORECEIVETHESEGMENTŠMOVE.L#MYSES,(A28 )+‡SESSION1&ŠCMP.L‚#0,A4ŽHAVEANMMU?(YESIFA4=0)6ŠBNE.S‚STRT22BRANCHIFNOMMU,USEPHYSICALADDRESSING4ŠMOVE.W#$0,(A2)+ŠHAVEANMMU,USELOGICALADDRESSINGŠBRA.S‚STRT23CONTINUE;STRT22„MOVE.W#$2000,(A2)+‡LOGICALADDRESS=PHYSICALADDRESS?STRT23„MOVE.W#SGATRO+SGATGS,(A2)+READONLY,GLOBALLYSHAREABLE"ŠMOVE.L#'SPLP',(A2)+†SEGMENTNAME#ŠCLR.L‚(A2)+ŽCLEAR‚STARTOFSEGMENT!ŠCLR.L‚(A2)+ŽCLEARSEGMENTLENGTHŠTRAPƒ#1‘DOIT!ŠBNE„STRT30BRANCHIFCAN'TSHARE**‚ALLOCATEADATASEGMENT*2ŠLEA„SCRATCH-DATASG(A4),A0PARAMETERBLOCKADDRESS'ŠMOVE.L#GTSEG,D0ŠGETSEGMENTDIRECTIVE2ŠMOVE.W#SGOPPA,SEGOPT(A0)PHYSICALADDRESSOPTION$ŠCLR.W‚SEGATT(A0)‰READ/WRITESEGMENT'ŠMOVE.L#'SPLD',SEGNAM(A0)SEGMENTNAME.ŠMOVE.LA4,SEGLAD(A0)†STARTADDRESSOFSEGMENT#ŠMOVE.L#ENDSPLD,D1ˆGETENDADDRESS$ŠMOVE.LD1,SEGLEN(A0)†SEGMENTLENGTHŠTRAPƒ#1‘DOIT'ŠBNE.S‚STRT30BRANCHIFCANNOTALLOCATEDŠMOVE.LA0,REGS-DATASG(A4)SAVETHEPHYSICALADDRESSOFTHISSEGMENT*D*‚ALLOCATEADATASEGMENTFORREAD/WRITEBUFFERSIFNON-SPOOLERFILE*0ŠMOVE.L#-1,A0SETUPFORMAYBENOTTHISSEGMENT3ŠMOVE.BQFILEN(A1),D0†GET1STCHARACTEROFFILENAME'ŠCMP.B‚#SPOOLF,D0‰DOINGASPOOLERFILE?&ŠBEQ.S‚STRT25BRANCHIFASPOOLERFILE2ŠLEA„SCRATCH-DATASG(A4),A0PARAMETERBLOCKADDRESS'ŠMOVE.L#'SPLB',SEGNAM(A0)SEGMENTNAME(ŠMOVE.L#BUFADR,SEGLAD(A0)STARTADDRESS!ŠMOVE.L#BUFLNG,SEGLEN(A0)LENGTH'ŠMOVE.L#GTSEG,D0ŠGETSEGMENTDIRECTIVEŠTRAPƒ#1‘DOIT*ŠBNE.S‚STRT30BRANCHIFCANNOTALLOCATEIT*&*‚MOVETHEQUEUEENTRYTOTHENEWTASK*JSTRT25„MOVE.LA0,REGS4-DATASG(A4)SAVETHEPHYSICALADDRESSOFTHESEGMENT:ŠLEA„SCRATCH-DATASG(A4),A0RESTOREPARAMETERBLOCKADDRESSŠMOVE.LA0,A2ŽADDRESSTOUSE)ŠMOVE.L#MOVELL,D0‰MOVELOGICALDIRECTIVE!ŠMOVE.L#SPLID,(A2)+‡MYTASKNAMEŠMOVE.L#MYSES,(A2)+‡MYSESSION,ŠLEA„QBUF-DATASG(A4),A3GETTHEFROMADDRESSŠMOVE.LA3,(A2)+‹FROMADDRESS/ŠMOVE.LQDEVICE(A1),(A2)+‚DESTINATIONTASKNAMEŠMOVE.L#MYSES,(A2)+‡SESSION/ŠMOVE.LREGS-DATASG(A4),A3GETDESINATIONSTART+ŠADD.L‚#QBUFS,A3ŠACTUALDESTINATIONADDRESS$ŠMOVE.LA3,(A2)+‹DESTINATIONADDRESS ŠMOVE.L#QLNG,(A2)+ˆQUEUELENGTHŠTRAPƒ#1‘DOIT)STRT30„BNE.S‚STRTERBRANCHIFCANNOTMOVE**‚STARTTHETASK*&ŠMOVE.L#START,D0ŠSTARTTASKDIRECTIVEŠMOVE.LA0,A2ŽADDRESSTOUSE,ŠMOVE.LQDEVICE(A1),(A2)+‚TASKNAMETOSTARTŠMOVE.L#MYSES,(A2)+‡SESSIONDŠMOVE.W#STOPMS+STOPRG,(A2)+MONITORSPECIFIEDANDREGISTERSSUPPLIEDŠMOVE.L#SPLID,(A2)+‡MONITOR=MEŠMOVE.L#MYSES,(A2)+‡SESSIONŠTRAPƒ#1‘DOIT%ŠBNE.S‚STRTERBRANCHIFDIDNOTSTART**‚UPDATETHEQUEUEENTRY*/ŠBCLRƒ#QSTATRDY,QSTAT(A1)CLEARREADYTOOUTPUT<ŠBSETƒ#QSTATOUT,QSTAT(A1)SETBEINGOUTPUTTOSPOOLERDEVICE5STRT35„LEA„FMSPKT-DATASG(A4),A0FMSINTPACKETADDRESS*ŠMOVE.B#REPLCMD,FMSCMD(A0)REPLCECOMMAND2ŠMOVE.LCURREC-DATASG(A4),FMSREC(A0)RECORDNUMBER*ŠLEA„QBUF-DATASG(A4),A3GETBUFFERADDRESS$ŠMOVE.LA3,FMSBUF(A0)†BUFFERADDRESSŠBSR„FMSINTDOTHEFILEREPLACE#ŠMOVE.L(A7)+,A3‹RESTORECALLERSA3ŠCLR.L‚D7‘SETGOODRETURNŠRTS—RETURNTOCALLER** ERROR-TERMINATE THE NEW TASK*@STRTER„LEA„SCRATCH-DATASG(A4),A0RESTOREPARAMETERBLOCKADDRESS*ŠMOVE.L#TERMT,D0ŠTERMINATETASKDIRECTIVE"ŠMOVE.LQDEVICE(A1),(A0)ƒTASKNAMEŠMOVE.L#MYSES,4(A0)‡SESSIONŠTRAPƒ#1‘DOIT!ŠBRA„STRT10RETURNWITHERRORSET*7*‰THISROUTINEISUSEDTOSETTHEQUEUEFIL'SSTATUSTO>*‰WAIT.THISWILLOCCURIFTHEFILEISSENTTOAPRINTERTHAT*‰ISINTHEWAITSTATE.* *™06218441STRT40„BSETƒ#QSTATWAT,QSTAT(A1)WAITFORCONTINUEŠBRA„STRT35UPDATETHERECORDŠPAGE*2*‚FNDENTRY‚FINDANENTRYINTHESPOOLERQUEUEFILE+*ŒNOTUSEDTOFINDTHERESERVEDRECORDS0-9-*ŒIFD4=-1ONENTRY,ITISCHANGEDTO10,WHICH *ŒISTHE1STACTUALQUEUEENTRY.5*‚ENTRY:D7.B=BITNUMBERTOTESTFOREQUALITYINQSTAT*ˆD7.L=-1=DON'TCHECKQSTAT*ˆD6=DEVICETOSEARCHFOR*ˆD6=0=ANYDEVICE*ˆD5=FORMSIDTOSEARCHFOR*ˆD5=0=ANYFORMSID'*ˆD4=RECORD#-1TOSTARTSEARCHINGFROM*ˆD4=-9 1=STARTATTOPOFFILE*ˆA4=BASEADDRESSREGISTER*‚EXIT:D7=-1=ANENTRYNOTFOUND*‡D7=0=ENTRYFOUND*‡A1=RECORDADDRESS(QBUF)*‡CURREC=LOGICALRECORDNUMBER*‚USES:01234567 *…D*‡PPPR *…A*R…P*‚CALLS:FMSINT**FNDENTRY‚EQU„*/ŠLEA„FMSPKT-DATASG(A4),A0FMSINTPACKETADDRESS&ŠMOVE.B#RDCMD,FMSCMD(A0)‚READCOMMAND ŠCMP.L‚#-1,D4ISTHISRECRD#-1?ŠBNE.S‚FNDE10BRANCHIFNO6ŠMOVE.L#9,D4ŽFORCERECORD#10‚(1WILLBEADDEDLATER)8FNDE10„MOVE.LD4,FMSREC(A0)†RECORDNUMBER-1TOSTARTAT.ŠMOVE.W#1,FMSRECN(A0)…READ1RECORDATATIME&ŠLEA„QBUF-DATASG(A4),A1BUFFERADDRESS8ŠMOVE.LA1,FMSBUF(A0)†BUFFERADDRESSFORRETURNEDRECORD7FNDE20„ADD.L‚#1,FMSREC(A0)†ACTUALRECORDNUMBERTOREADŠBSR„FMSINTGODOTHEREADŠBNE.S‚FNDERRERRORRETURN(ŠCMP.B‚#ISTARN,FMSTAT(A0)RECORDEXISTS?ŠBNE.S‚FNDE30BRANCHIFYES.FNDERR„MOVE.L#-1,D7SETRECORDNOTFOUNDFLAGŠRTS—RETURNTOCALLER0FNDE30„LEA„QBUF-DATASG(A4),A1GETRECORDADDRESS"ŠTST„D5‘LOOKFORAFORMSIDMATCH?ŠBEQ.S‚FNDE40BRANCHIFNO#ŠCMP.L‚QFORMS(A1),D5†SAMEFORMSID?)ŠBNE.S‚FNDE20BRANCHIFNO,GOSEARCHMORE'FNDE40„TST„D6‘LOOKFORMATCHINGDEVICE?ŠBEQ.S‚FNDE50BRANCHIFNO"ŠCMP.L‚QDEVICE(A1),D6…SAMEDEVICE?-ŠBNE„FNDE20BRANCHIFNOTAMATCH,SEARCHMORE&FNDE50„TST.L‚D7‘LOOKFORASTATUSBIT?ŠBMI.S‚FNDE60BRANCHIFNO&ŠBTST.BD7,QSTAT(A1)‡STATUS=BITIND7?"ŠBEQ„FNDE20BRANCHIFNOTTHESAME,FNDE60„CLR.L‚D7‘CORRECTENTRY-SETFOUNDFLAG<ŠMOVE.LFMSREC(A0),CURREC-DATASG(A4)SAVETHISRECORDNUMBERŠRTS—RETURNTOCALLERŠPAGE*3*‚INSRTREC‚INSERTAQUEUEENTRYINTOTHEQUEUEFILE2*ŒUSEDFORBOTHQUEUEENTRIESANDRESERVEDRECORDS**‚ENTRY:A1=RECORDADDRESS*ˆA4=BASEADDRESSREGISTER"*ˆD7=RECORDNUMBERTOINSERTAFTER*‚EXIT:D7=0=GOODINSERT.*‡D7=ANYTHINGELSE=IOSERRORCODEFROMINSERT*‚USES:01234567*…D*R *…A*P…P*‚CALLS:FMSINT**INSRTREC‚EQU„*,ŠLEA„FMSPKT-DATASG(A4),A0FMSPACKETADDRESS1ŠSUB.L‚#1,D7ŽADJUSTRECORDNUMBERFORGOODINSERT#ŠMOVE.LD7,FMSREC(A0)†RECORDNUMBERŠCLR.L‚D7‘SETFORGOODRETURN$ŠMOVE.LA1,FMSBUF(A0)†RECORDADDRESS+ŠMOVE.B#INSRTCMD,FMSCMD(A0)INSERTCOMMANDŠBSR„FMSINTDOTHEINSERTŠBEQ.S‚INSRTNGOODRETURNŠMOVE.LD0,D7ŽERRORCODEINSRTN„RTS—RETURNTOCALLER****/*‚RPLREC‚REPLACEQUEUEENTRYBACKINTOTHEFILE2*ŠUSEDFORBOTHQUEUEENTRIESANDRESERVEDRECORDS*‚ENTRY:A1=RECORDADDRESS*ˆA4=BASEADDRESSREGISTER*ˆCURREC=RECORDNUMBER*‚EXIT:TOCALLER*‚USES:01234567*…D* *…A*P…P*‚CALLS:FMSINT** RPLREC„EQU„*/ŠLEA„FMSPKT-DATASG(A4),A0FMSINTPACKETADDRESS+ŠMOVE.B#REPLCMD,FMSCMD(A0)REPLACECOMMAND2ŠMOVE.LCURREC-DATASG(A4),FMSREC(A0)RECORDNUMBER$ŠMOVE.LA1,FMSBUF(A0)†RECORDADDRESSŠBSR„FMSINTDOTHEREPLACEŠRTS—RETURNTOCALLERŠPAGE*6*‚DELENTRYDELETEANENTRYFROMTHESPOOLERQUEUEFILE2*‹USEDFORBOTHQUEUEENTRIESANDRESERVEDRECORDS&*‚ENTRY:CURREC=RECORDNUMBERTODELETE*ˆA4=BASEADDRESSREGISTER*‚EXIT:D7=0=DELETED,GOODRETURN *‡D7=-1=NOTDELETED,ERRORRETURN*‚USES:01234567*…D*R*…AP‡P* CALLS:FMSINT**DELENTRY‚EQU„*ŠMOVE.LA0,-(A7)‹SAVEA0/ŠLEA„FMSPKT-DATASG(A4),A0FMSINTPACKETADDRESS)ŠMOVE.B#DELCMD,FMSCMD(A0)DELETECOMMAND<ŠMOVE.LCURREC-DATASG(A4),FMSREC(A0)RECORDNUMBERTODELETE&ŠMOVE.W#1,FMSRECN(A0)…DELETE1RECORDŠBSR„FMSINTDOTHEDELETEŠBNE.S‚DELE30ERRORRETURNŠTST.B‚FMSTAT(A0)‰GOODRETURN?ŠBNE.S‚DELE20GOCHECKSTATUS DELE10„CLR.L‚D7‘GOODRETURNFLAGŠMOVE.L(A7)+,A0‹RESTOREA0ŠRTS—RETURNTOCALLER&DELE20„MOVE.BFMSTAT(A0),D0†GETSTATUS'ŠCMP.B‚#ISTAEOF,D0ˆDELETEDLASTRECORD?.ŠBNE.S‚DELE30BRANCHIFSOMEOTHERTHING,ERRORL„SUB.L#1,CURREC-DATASG(A4)DELETEDLASTRECORD,UPDATECURRENTRECORDNUMBERŠBRA„DELE10BRANCH,OKTODO%DELE30„MOVE.L#-1,D7SETERRORRETURNŠMOVE.L(A7)+,A0‹RESTOREA0ŠRTS—RETURNTOCALLERŠPAGE**‚DELFILEDELETEASPOOLERFILE!*‚ENTRY:A1=ADDRESSOFQUEUEENTRY*ˆA4=BASEADDRESSREGISTER*‚EXIT:TOCALLER*‚USES:01234567*…9 DR *…A*P**P** DELFILEƒEQU„*0ŠLEA„FHSPB-DATASG(A4),A0USEFHSPARAMETERBLOCK.ŠMOVE.W#FHDELT,FHSCMD(A0)DELETEFILECOMMAND8ŠMOVE.L#6,D0ŽLENGHTOFMOVEFILENAMETOPARAMETERBLOCK+ŠLEA„QVOL(A1),A2ˆSTARTADDRESSOFMOVEFROM+ŠLEA„FHSVOL(A0),A3†STARTADDRESSOFMOVETO2DELF10„MOVE.L(A2)+,(A3)+ˆMOVEQUALIFIEDEFILENAMEŠSUB.L‚#1,D0ŽDECREMENTCOUNTERŠBNE.S‚DELF10BRANCHTILMOVED'ŠMOVE.W#$0000,FHSWCD(A0)‚PROTECTCODES"ŠMOVE.BFHSFIL(A0),D0†GETFILENAMEŠCMP.B‚#SPOOLF,D0‰SPOOLERFILE?ŠBEQ.S‚DELF20BRANCHIFYES,ŠCLR.L‚D0‘NOTASPOOLERFILE,DON'TDELETEITŠRTS—RETURNTOCALLERDELF20„TRAPƒ#3‘DELETETHEFILE(ŠRTS—RETURN,CALLERWILLCHECKFORERRORSŠPAGE*%*‚DOQEVT‚QUEUEANEVENTTOASUB-TASK*‚EVENTCODE=33 *‚LENGHT=4*‚MESSAGE=CONTENTSOFD7.W*‚ENTRY:A1=QUEUEENTRYADDRESS*ˆA4=BASEADDRESSREGISTER(*ˆD7.W=MESSAGE‚(0=CONTINUE,-1=TERMINATE)*‚EXIT:D7=0=GOODRETURN*‡D7=-1=ERRORRETURN*‚USES:01234567*…D*R *…A*Pƒ*P** DOQEVT„EQU„*?ŠLEA„SCRATCH-DATASG(A4),A0USESCRATCHBUFFERTOSENDTHEEVENT'ŠMOVE.L#QEVNT,D0ŠQUEUEEVENTDIRECTIVEŠMOVE.LA0,A3ŽGETSTARTADDRESS%ŠADD.L‚#18,A3POINTTOSTARTOFEVENT5ŠMOVE.LQDEVICE(A1),QEVTSK(A0)TASKTOGETTHISEVENT!ŠMOVE.L#MYSES,QEVSES(A0)‚SESSIONŠCLR.W‚QEVOPT(A0)‰NOOPTIONS#ŠMOVE.LA3,QEVPKT(A0)†EVENTADDRESS!ŠCLR.L‚QEVIAD(A0)‰USEDEFAULTASRŠMOVE.B#4,(A3)+‹EVENTLENGTH$ŠMOVE.B#SPLECDE,(A3)+…CODE33EVENTŠMOVE.WD7,(A3)ŒEVENTMESSAGEDOQ10…TRAPƒ#1‘QUEUETHISEVENT$ŠBEQ.S‚DOQ20ŽBRANCHIFAGOODRETURNŠCMP.B‚#RTCDTFUL,D0‡ASQFULL?"ŠBEQ„DOQ10ŽBRANCHIFYES,TRYAGAINŠMOVE.L#-1,D7SETERRORRETURNŠRTS—RETURNTOCALLERDOQ20…CLR.L‚D7‘GOODRETURNŠRTS—RETURNTOCALLERŠPAGE*"*‚MTCDFMATCHDEVICEWITHFORMSID*&*‚ENTRYD7=0ENTRYFROMCLOSEORPRINT6*‚LOOKSTHRUTHERESERVEDRECORDSOFTHESPOOLERQUEUE8*‚FORAMATCHINGDEVICE.IFTHEMATCHINGDEVICEISFOUND8*‚THEFORMSIDISCHECKED.IFITALSOMATCHES,THESTATUS9*‚BITSARESETTODON'TWAITFORACONTINUE,OKTOOUTPUT.5*‚IFTHEFORMSIDDOESNOTMATCH,THESTATUSISSETTO:*‚WAITANDNOTMATCHING.IFTHEDEVICEDOEN'TEXISTINTHE5*‚RECORDS,ITISENTEREDWITHFORMSID=STND.THEFORMS(*‚IDISTHENCHECKEDASDESCRIBEDABOVE.*!*‚ENTRYD7=-1‚ENTRYFROMCONTINUE?*‚ALSOLOOKSFORMATCHINGDEVICEANDFORMSID.IFNOTMATCHING,:*‚SETSWAITANDRETURNS.IFMATCHING,CHECKSTOSEEIFTHIS>*‚CONTINUEWASAFTERAFORMSCHANGE.IFYES,SETSDEVICESTATUSB*‚TOOKTOOUTPUTANDRETURNS.IFNOTAFTERAFORMSCHANGE,RETURNS!*‚WITHD7=1,IGNORETHISCONTINUE.**‚ENTRY:A1=QUEUEENTRYADDRESS*ˆA4=BASEADDRESSREGISTER*ˆD7=0=CALLEDBYCLOSEORPRINT*ˆD7=-1=CALLEDBYCONTINUE*‚EXIT:D7=0=GOODRETURN9*‡D7=-1=DEVICENOTFOUNDORNOROOMTOENTERANEWDEVICE4*‡D7=1=IGNORETHISCONTINUE,NOTAFTERAFORMSCHANGE**‚USES:01234567 *…D****‡R *…A*P**P*‚CALLS:RDRES‚RPLRES** MTCDF…EQU„*ŠCLR.L‚D1‘RECORDNUMBERTOREAD)ŠLEA„QSTAT(A1),A3‡GETSTATUSBYTEADDRESS)MTC10…BSR„RDRESŽGOREADARESERVEDRECORD%ŠMOVE.L#RREC,D2‹#ENTRIESPERRECORD*MTC20…MOVE.LRDEV(A2),D3ˆGETADEVICENAMEŠTST.L‚D3‘ANYDEVICE?,ŠBEQ.S‚MTC90ŽBRANCHIFENDOFLIST-NODEVICE&ŠCMP.L‚QDEVICE(A1),D3…MATCHINGDEVICE?ŠBEQ.S‚MTC50ŽBRANCHIFYES#ŠSUB.L‚#1,D2ŽDECREMENT#OFENTRIES-ŠBEQ.S‚MTC30ŽBRANCHIFMUSTREADANEWRECORD"ŠADD.L‚#RLNG,A2‹BUMPTONEXTENTRY ŠBRA„MTC20ŽGOLOOKATNEXTENTRY%MTC30…ADD.L‚#1,D1ŽBUMPTONEXTRECORDŠCMP.L‚#8,D1ŽREADEVERYRECORD?!ŠBLE„MTC10ŽBRANCHIFMORETOREAD1MTC40…MOVE.L#-1,D7SETNOROOM,ORINVALIDDEVICEŠRTS—RETURNTOCALLER*!*‚HEREIFFOUNDAMATCHINGDEVICE*-MTC50…MOVE.LRFRM(A2),D3ˆGETCURRENTFORMSIDŠCMP.L‚QFORMS(A1),D3†SAME?#ŠBNE.S‚MTC70ŽBRANCHIFNOTTHESAMEŠTST„D7‘SENTHEREBYCONTINUE?ŠBMI.S‚MTC80ŽBRANCHIFYES)MTC55…BCLRƒ#QSTATWAT,(A3)…CLEARWAITFLAG'ŠBCLRƒ#QSTATFRM,(A3)…CLEARNOTMATCHINGMTC60…CLR.L‚D7‘SETGOODRETURNŠRTS—RETURNTOCALLER*/*‚HEREIFNOTMATCHINGFORMSID-SE: TSTATUSBITS*%MTC70…BSETƒ#QSTATWAT,(A3)…SETTOWAIT%ŠBSETƒ#QSTATFRM,(A3)…SETNOTMATCHINGŠBRA„MTC60ŽGORETURN***‚HEREISMATCHINGFORMSANDFROMCONTINUEç+*‚RDRES‚READRESERVEDRECORDSINQUEUEFILE *‚ENTRY:D1=RECORDNUMBERTOREAD*ˆA4=BASEADDRESSREGISTER*‚EXIT:A2=RECORDADDRESS*‚USES:01234567*…D*R *…A*ƒRƒP*‚CALLS:FMSINT** RDRES…EQU„*1ŠLEA„SCRATCH-DATASG(A4),A2USESCRATCHFORBUFFER,ŠLEA„FMSPKT-DATASG(A4),A0FMSPACKETADDRESSŠMOVE.B#RDCMD,FMSCMD(A0)‚READ$ŠMOVE.LD1,FMSREC(A0)†RECORDTOREAD$ŠMOVE.W#1,FMSRECN(A0)…READ1RECORD$ŠMOVE.LA2,FMSBUF(A0)†BUFFERADDRESSŠBSR„FMSINTDOTHEREADŠRTS—RETURNTOCALLERŠPAGE*.*‚CKFORMS‚SEEIFAFORMSCHANGEWASISSUEDBUT *‹NOTACONTINUEFORTHISDEVICE*‚ENTRY:A1=QUEUEENTRYADDRESS*ˆA4=BASEADDRESSREGISTER*‚EXIT:D7=0=OK+*‡D7=-1=DON'TOUTPUT,NOCONTINUEWASISSUED*‚USES:01234567 *…D***‰R *…A*P*ƒP *‚CALLS:RDRES** CKFORMSƒEQU„*ŠCLR.L‚D1‘RECORDNUMBERTOREAD*CKFR10„BSR„RDRESŽGOREAD1RESERVEDRECORD%ŠMOVE.L#RREC,D2‹#ENTRIESPERRECORD$CKFR20„MOVE.LRDEV(A2),D3ˆGETDEVICEŠTST.L‚D3‘ANYDEVICE?-ŠBEQ.S‚CKFR40BRANCHIFENDOFLIST-NODEVICE"ŠCMP.L‚QDEVICE(A1),D3…SAMEDEVICE? ŠBEQ.S‚CKFR50BRANCHIFTHESAME#ŠSUB.L‚#1,D2ŽDECREMENT#OFENTRIES-ŠBEQ.S‚CKFR30BRANCHIFMUSTREADNEXTRECORD"ŠADD.L‚#RLNG,A2‹BUMPTONEXTENTRYŠBRA„CKFR20GOCHECKIT-CKFR30„ADD.L‚#1,D1ŽBUMPTONEXTRECORDNUMBERŠCMP.L‚#8,D1ŽREADALL?"ŠBLE„CKFR10BRANCHIFNO,READNEXT%CKFR40„MOVE.L#-1,D7SETERRORRETURN ŠRTS—RETURN&CKFR50„MOVE.LRFRM(A2),D3ˆGETFORMSIDŠCMP.L‚QFORMS(A1),D3†SAME?"ŠBNE„CKFR40BRANCHIFNOTTHESAMEŠTST.L‚RSTAT(A2)ŠOKTOOUTPUT?)ŠBMI„CKFR40BRANCHIFNO,SETERRORRETURNŠCLR.L‚D7‘SETGOODRETURN ŠRTS—RETURNŠPAGE/*‚OUTENT‚OUTPUTASPOOLERQUEUEENTRYTOLDFLUN*ŠCALLEDBYQUESPL*‚ENTRY:A1=ADDRESSOFENTRY*ˆA4=BASEADDRESSREGISTER*ˆD2=#ENTRIESALREADYOUTPUT*‚EXIT:REGISTERSPRESERVED*‚CALLS:OUTMSG„BDCONV„ODATCONV** OUTENT„EQU„*.ŠMOVEM.LD0-D2/A0-A6,-(A7)SAVEUSEDREGISTERSŠTST„D2‘OUTPUTANYTHINGYET?ŠBNE.S‚OUTE00BRANCHIFYES+ŠLEA„MSG4-DATASG(A4),A6GETHEADINGADDRESSŠMOVE.L#63,D0MESSAGELENGTH!ŠBSR„OUTMSGGOOUTPUTTHEHEADING>OUTE00„LEA„SCRATCH-DATASG(A4),A0USESCRATCHFOROUTPUTBUFFER)ŠMOVE.LA1,A2ŽSAVESTARTADDRESSOFENTRY6ŠMOVE.LQDEVICE(A1),(A0)+‚DEVICE: NAMETOOUTPUTBUFFERŠMOVE.B#'',(A0)+‰BLANK!ŠMOVE.BQFORMS(A1),(A0)+ƒFORMSIDG‰MOVE.BQFORMS+1(A1),(A0)+MOREFORMSID,ABYTEATATIME,ODDADDRESSES(ŠMOVE.BQFORMS+2(A1),(A0)+MOREFORMSID(ŠMOVE.BQFORMS+3(A1),(A0)+MOREFORMSIDŠMOVE.B#'',(A0)+‰BLANKŠCLR.L‚D0‘CLEARFORUSE9ŠMOVE.WQJOBID(A1),D0†GET1STHALFOFJOBID(USERNUMBER)ŠBSR„BDCONVCONVERTTODECIMALŠTST.L‚D0‘SEEIFUSERZEROŠBNE.S‚OUTE02BRANCHIFNOT+ŠMOVE.B#$30,D0ŒISUSERZERO,FORCEONEZERO5OUTE02„MOVE.L#4,D1ŽNUMBEROFBYTESTOCHECKFORNULLOUTE01„ROL.L‚#8,D0ŽGETACHARŠTST.B‚D0‘NULL? ŠBNE.S‚OUTE03BRANCHIFNOTNULL%ŠMOVE.B#$20,D0ŒFORCEABLANKIFNULL,OUTE03„MOVE.BD0,(A0)+‹SAVEINOUTPUTBUFFERŠSUB.L‚#1,D1ŽDECREMENTCOUNTER"ŠBNE.S‚OUTE01BRANCHIFMORETODOŠCLR.L‚D0‘CLEARFORUSE.ŠMOVE.WQJOBID+2(A1),D0„GET2NDHALFOFJOBIDŠBSR„BDCONVCONVERTTODICIMAL/ŠMOVE.L#4,D1ŽNUMBEROFBYTESTOCHECKFORNULLOUTE10„ROL.L‚#8,D0ŽGETABYTEŠTST.B‚D0‘NULL? ŠBNE.S‚OUTE15BRANCHIFNOTNULL$ŠMOVE.B#$30,D0ŒFORCEAZEROIFNULL,OUTE15„MOVE.BD0,(A0)+‹SAVEINOUTPUTBUFFERŠSUB.L‚#1,D1ŽDECREMENTCOUNTER"ŠBNE.S‚OUTE10BRANCHIFMORETODOŠMOVE.B#'',(A0)+‰BLANK3ŠMOVE.BQVOL(A1),(A0)+…VOLUME,1BYTE-ODDADDRESSING$ŠMOVE.BQVOL+1(A1),(A0)+ƒMOREVOLUME$ŠMOVE.BQVOL+2(A1),(A0)+ƒMOREVOLUME$ŠMOVE.BQVOL+3(A1),(A0)+ƒMOREVOLUMEŠMOVE.B#'',(A0)+‰BLANK ŠMOVE.LQCATLG(A1),(A0)+ƒCATALOG*ŠMOVE.LQCATLG+4(A1),(A0)+RESTOFCATALOGŠMOVE.B#'',(A0)+‰BLANK!ŠMOVE.L#8,D0Ž#BYTESINFILENAME%ŠADD.L‚#QFILEN,A2‰ADDRESSOFFILENAME,OUTE20„MOVE.B(A2)+,(A0)+ˆFILENAMETOBUFFERŠSUB.L‚#1,D0ŽDECREMENTCOUNTER ŠBNE„OUTE20BRANCHTILMOVEDALLŠMOVE.B#'.',(A0)+‰DOTŠMOVE.W(A2)+,(A0)+ˆEXTENSIONŠMOVE.W#'‚',(A0)+ˆBLANKS "ŠMOVE.LQTASKN(A1),(A0)+ƒTASKNAME ŠMOVE.B#'',(A0)+‰BLANKŠCLR.L‚D0‘CLEARFORUSE%ŠMOVE.BQCOPYS(A1),D0†GET#OFCOPIESŠBSR„BDCONVCONVERTTOASCII%ŠMOVE.L#4,D1ŽNUMBEROFBYTESTOSAVEOUTE52„ROL.L‚#8,D0ŽGETABYTEŠTST.B‚D0‘NULL? ŠBNE.S‚OUTE55BRANCHIFNOTNULL#ŠMOVE.B#$20,D0ŒFORCEBLANKIFNULL,OUTE55„MOVE.BD0,(A0)+‹SAVEINOUTPUTBUFFERŠSUB.L‚#1,D1ŽDECREMENTCOUNTERŠBNE.S‚OUTE52BRANCHTILDONE**‚DETERMINEENTRYSTATUS*ŠCLR.L‚D0‘CLEARFORUSEŠMOVE.BQSTAT(A1),D0‡GETSTATUS ŠMOVE.L#6,D1ŽBITNUMBERTOTEST*OUTE60„BTSTƒD1,D0ŽSEEWHICHSTATUSTHISISŠBNE.S‚OUTE70BRANCHIFAMATCH*ŠSUB.L‚#1,D1ŽBUMPDOWNTONEXTBITTOTEST&ŠBGE.S‚OUTE60BRANCHTILFOUNDAMATCHŠMOVE.B#$20,(A0)+‰BLANK/ŠMOVE.L#BLANK,(A0)+‡NOSTATUS,BLANKSTOBUFFERŠMOVE.L#BLANK,(A0)+‡NOSTATUSŠMOVE.L#BLANK,(A0)+‡NOSTATUS"ŠBRA.S‚OUTE80GOOUTPUTTHEBUFFER/OUTE70„MULUƒ#12,D1GETOFFSETTOSTATUSMESSAGE.ŠLEA„MSG5-DATASG(A4),A6ADDRESSOF1STMESSAGE#ŠADD.L‚A6,D1ŽACTUALMESSAGEADDRESS%ŠMOVE.LD1,A6ŽNEEDSTOBEINANAREG"ŠMOVE.B#'',(A0)+‰BLANKTOBUFFER,ŠMOVE.L(A6)+,(A0)+ˆSTATUSMESSAGETOBUFFERŠMOVE.L(A6)+,(A0)+ˆMOREŠMOVE.L(A6),(A0)+‰ANDMOREŠBTSTƒ#QSTATIOE,D0‡I/OERROR?ŠBEQ.S‚OUTE80BRANCHIFNOŠCLR.L‚D0‘CLEARFORUSE&ŠMOVE.BQLUN(A1),D0ˆGETTHEERRORCODE!ŠMOVE.BD0,D1ŽSAVETHEERRORCODEŠROR.L‚#4,D0ŽGETTHEUPPERBYTEŠADD.B‚#$30,D0ŒFORCEASCIIŠCMP.B‚#$39,D0Œ0-9?ŠBLE.S‚OUTE74BRANCHIF0-9ŠADD.B‚#7,D0ŽMUSTBEA-F"OUTE74„ROL.L‚#8,D0ŽSAVETHERESULT+ŠAND.B‚#$F,D1STRIPTOPOFFREMAININGVALUEŠMOVE.BD1,D0ŽGETITŠADD.B‚#$30,D0ŒFORCEASCIIŠCMP.B‚#$39,D0Œ0-9?ŠBLE.S‚OUTE78BRANCHIF0-9ŠADD.B‚#7,D0ŽMUSTBEA-F+OUTE78„MOVE.LA0,A6ŽGETTHESTORAGEADDRESS/ŠMOVE.WD0,-(A6)‹SAVETHEERRORCODEFOROUTPUT6OUTE80„LEA„SCRATCH-DATASG(A4),A6OUTPUTBUFFERADDRESSŠMOVE.LA6,D1ŽGETSTARTADDRESSŠMOVE.LA0,D0ŽGETENDADDRESSŠSUB.L‚D1,D0ŽMESSAGELENGTH"ŠBSR.S‚OUTMSGGOOUTPUTTHISENTRY1ŠMOVEM.L(A7)+,D0-D2/A0-A6RESTOREREGISTERSUSED ŠRTS—RETURN O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*%*‡GETTNAME-GETTASKNAMESUBROUTINE**ˆINPUT:*’A4=BASEADDRESSREGISTER* *ˆOUTPUT: ; *’PBTSKID-DATASG(A4)=TASKNAME4*’IFanerroroccursattemptingtogetthetaskname*—THEN**œthetasknamewillbefilledwithspaces**ˆREGISTERALTERATION**’NONE*GTTNAME:‰MOVEM.LƒA0-A1,-(A7)#‰MOVE.L„#GTTASKNM,D0”DIRECTIVECODE‰LEA‡PBTSKID-DATASG(A4),A0‰TRAP†#1‰BEQ.S…GTN0100*²BRANCHIFSUCCESSFUL‰MOVE.L„#'„',A0 *²A0=SPACESGTN0100:9‰MOVE.L„A0,PBTSKID-DATASG(A4)‹TASKNAMETOPARAMETERBLOCK‰MOVEM.Lƒ(A7)+,A0-A1‰RTS*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ŠPAGE***‚OUTMSG‚OUTPUTAMESSAGETOUSERSCONSOLE*ŠFORMATTED,ASCII *‚ENTRY:A6=MESSAGESTARTADDRESS*ˆA4=BASEADDRESSREGISTER*ˆD0=MESSAGELENGTH*‚EXIT:TOCALLER*‚USES:01234567*…D*P *…APƒPƒPƒP* OUTMSG„EQU„*8ŠMOVEM.LA0/A2/D1,-(A7)„FIXESPROBLEMDETAILEDINSPR9760ŠLEA„IOSPB-DATASG(A4),A0USEIOSPARAMETERBLOCK5ŠSIOSCOIOWRIT,IOPASC+IOPFOR,A0WRITE,ASCII,FORMATTEDŠMOVE.B#7,IOSLUN(A0)†LUN71ŠMOVE.LA6,IOSSAD(A0)†OUTPUTBUFFERSTARTADDRESS(ŠMOVE.LA6,IOSEAD(A0)†SET-UPENDADDRESS"ŠADD.L‚D0,IOSEAD(A0)†ADDINLENGTH"ŠSUB.L‚#1,IOSEAD(A0)†ACTUALLENGTHŠTRAPƒ#2‘DOTHEOUTPUT8ŠMOVEM.L(A7)+,A0/A2/D1„FIXESPROBLEMDETAILEDINSPR976ŠRTS—RETURNTOCALLER*&*‚SETDEVASSIGNLUN7TOUSERSCONSOLE*6SETDEV„LEA„FHSPB-DATASG(A4),A0PARAMETERBLOCKADDRESS*ŠSFHSCOFHASGN,FOPPW,A0„ASSIGN,PUBLICREADŠMOVE.B#7,FHSLUN(A0)†LUN7)ŠMOVE.LFHSCLG(A6),FHSVOL(A0)DEVICENAME%ŠMOVE.W#USER0,FHSUSN(A0)‚USERNUMBERŠMOVE.W#$2020,D0ŠBLANKS+ŠLEA„FHSCLG(A0),A2†ADDRESSOFCATALOGFIELD ŠMOVE.L#9,D1Ž#BLANKSTOBUFFER&SETD5…MOVE.WD0,(A2)+‹BLANKSTOBUFFERŠSUB.L‚#1,D1ŽDECREMENTCOUNTERŠBNE.S‚SETD5ŽBRANCHTILBLANKEDŠCLR.W‚FHSWCD(A0)‰PROTECTCODESŠTRAPƒ#3‘DOTHEASSIGNŠRTS—RETURNTOCALLER*"* RESTDEV RESET DEVICE,CLOSE LUN 7*7RESTDEVƒLEA„FHSPB-DATASG(A4),A0PARAMETERBLOCKADDRESS(ŠMOVE.W#FHCLOS,FHSCMD(A0)CLOSECOMMANDŠMOVE.LD0,D1ŽSAVECURRENTD0"ŠMOVE.B#7,FHSLUN(A0)†LUNTOCLOSEŠTRAPƒ#3‘DOTHECLOSEŠMOVE.LD1,D0ŽRESTORED0ŠRTS—RETURNTOCALLERŠPAGE**‚STRTNXT‚STARTNEXTOUTPUT3*ŒSEARCHESQUEUELISTLOOKINGFORANENTRYTOSTART/*ŒWITHAMATCHINGDEVICEOFTHEENTRYTHATJUST*ŒCOMPLETEDOUTPUT.**‚ENTRY:A1=ADDRESSOFENTRYJUSTCOMPLETED*ˆA4=BASEADDRESSREGISTER.*ˆCURREC=RECORDNUMBEROFENTRYJUSTCOMPLETED"*‚EXIT:A1=ADDRESSOFENTRYSTARTED'*‡CURREC=RECONDNUMBEROFENTRYSTARTED5*‡EXITSEITHERBECAUSEOFSOMETHINGSTARTEDORDIDN'T*‡FINDANENTRYTOSTART*‚USES:01234567*…D*…***** *…A*R…P*‚CALLS:FNDENTRY„STRTSPL** STRTNXTƒEQU„*/ŠMOVE.LQDEVICE(A1),D6…LOOKFORMATCHINGDEVICEŠCLR.L‚D5‘LOOKFORANYFORMSID$ŠMOVE.L#-1,D4STARTATTOPOFQUEUEŠCLR.L‚D7‘CLEARFORUSE5ŠMOVE.B#QSTATOUT,D7‡SEEIFANYTHINGBEINGOUTPUTNOWŠBSR„FNDENTRY‹GOSEE"ŠTST„D7‘ANYTHINGBEINGOUTPUTNOW?,ŠBEQ.S‚STRTN50ŒBRANCHIFYES,DON'TTRYAGAIN=ŠCLR.L‚D7‰DEVICENOTBUSY,SETUPTOFINDNEXTENTRYTOOUTPUT=STRTN20ƒMOVE.B#QSTATRDY,D7‡LOOKFORANENTRYREADYTOOUTPUTŠBSR„FNDENTRY‹GOFINDANENTRYŠTST„D7‘FOUNDONE?"ŠBMI.S‚STRTN50ŒBRANCHIFNOTFOUND6STRTN25ƒBTSTƒ#QSTATWAT,QSTAT(A1)MUSTTHISENTRYWAIT?ŠBEQ.S‚STRTN40ŒBRANCHIFNO>STRTN30ƒMOVE.LCURREC-DATASG(A4),D4SEARCHQUEUESTARTINGHERE ŠBRA„STRTN20ŒGOSEARCHSOMEMORE3STRTN40ƒBTSTƒ#QSTATFRM,QSTAT(A1)MATCHINGFORMSID?/ŠBNE„STRTN30ŒBRANCHIFNOTMATCHING,SEARCHMORE/ŠBTSTƒ#QSTATIOE,QSTAT(A1)WAITINGFORCONTINUE?*ŠBNE„STRTN30ŒBRANCHIFWAITING,SEARCHMORE!ŠBSR„STRTSPLŒGOSTARTTHISOUTPUT$STRTN50ƒRTS—RETURN,STARTEDSOMETHINGŠPAGE**‚GTJOBNƒGETJOBNUMBER1*‹READTHEJOBNUMBERINQUEUERECORD#9,1STWORD1*‹BUMPIT‚ANDREPLACE.IFGREATERTHAN9999,START *‹OVERAT1.*‚EXIT:D6.W=JOBNUMBERTOUSE)*‡D7=0=GOODRETURN,OTHERWISEERRORRETURN*‚USES:01234567 *…D**‰RR *…A*ƒ*ƒP*‚CALLS:FMSINT** GTJOBN„EQU„*/ŠLEA„FMSPKT-DATASG(A4),A0FMSINTPACKETADDRESS&ŠMOVE.B#RDCMD,FMSCMD(A0)‚READCOMMAND+; ŠMOVE.L#9,FMSREC(A0)†RECORDNUMBERTOREAD)ŠLEA„SCRATCH-DATASG(A4),A2BUFFERADDRESS7ŠMOVE.LA2,FMSBUF(A0)†BUFFERADDRESSOFRETURNEDRECORD$ŠMOVE.W#1,FMSRECN(A0)…READ1RECORDŠBSR„FMSINTGOREADITŠBNE.S‚GTJNERRŒBRANCHIFERRORŠCLR.L‚D6‘CLEARFORRETURN&ŠMOVE.W(A2),D6ŒGETCURRENTJOBNUMBERŠADD.W‚#1,D6ŽBUMPIT"ŠCMP.W‚#9999,D6‹GREATERTHAN9999?-ŠBLT.S‚GTJN10BRANCHIFNOTGREATERTHAN9999ŠMOVE.W#1,D6ŽSTARTOVERATONE GTJN10„MOVE.WD6,(A2)ŒRESTOREIT+ŠMOVE.B#REPLCMD,FMSCMD(A0)REPLACECOMMANDŠBSR„FMSINTGOREPLACEINFILEŠBNE.S‚GTJNERRŒERRORRETURNŠCLR.L‚D7‘GOODRETURNŠCLR.L‚D0‘GOODRETURNŠRTS—RETURNTOCALLER,GTJNERRƒMOVE.LD0,D7ŽSAVEERRORSTATUSIND7ŠRTS—RETURNTOCALLERŠPAGE*6*‚STPRIRPL‚SETSPOOLERFILEOUTPUTPRIORITY,UPDATEANY(*ŒBUMPEDQUEUEENTRIES,INSERTTHISENTRY*ŒINTOTHESPOOLERQUEUE/*ŒSEARCHESTHESPOOLERQUEUEOFREADYTOOUTPUT/*ŒENTRIES,INSERTSTHENEWENTRYWITHINTHESAME2*ŒPRIORITYRANGEOFEXISTINGENTRIES.ITSUBTRACTS/*ŒTHISENTRYSIZEFROMANYENTRIESITBUMPSAND *ŒWRITESTHOSERECORDSBACKOUT.*‚ENTRY:A1=RECORDADDRESS*ˆA4=BASEADDRESSREGISTER*‚EXIT:D7=0=GOODRETURN*‡D7=-1=ERRORRETURN*‚USES:01234567 *…D****‡R *…A*P**P *‚CALLS:FNDENTRY„RPLREC„INSRTREC**STPRIRPL‚EQU„*/ŠLEA„SCRATCH-DATASG(A4),A2SCRATCHAREAADDRESS"ŠMOVE.LA1,A3ŽSTARTRECORDADDRESS+ŠMOVE.L#QLNG/2,D0‰#WORDSINAQUEUEENTRYCSTPRI10ƒMOVE.W(A3)+,(A2)+ˆPUTCURRENTRECORDINTOTHESCRATCHAREAŠSUB.L‚#1,D0ŽDECREMENTCOUNTER/ŠBNE.S‚STPRI10ŒBRANCHTILALLOFENTRYIFMOVED/ŠLEA„SCRATCH-DATASG(A4),A2RESETRECORDADDRESSŠCLR.L‚D1‘CLEARFORUSE)ŠMOVE.BQPRI(A2),D1ˆSAVECURRENTPRIORITYŠMOVE.L#1,D2ŽSETINSERTSWITCHŠMOVE.L#0,A3ŽCLEARFORUSE&ŠMOVE.LQSIZE(A2),A3‡SAVECURRENTSIZE*ŠMOVE.L#-1,D4STARTSEARCHATTOPOFFILE6ŠMOVE.LD4,CURREC-DATASG(A4)SETCURRENTRECORDNUMBERŠCLR.L‚D5‘ANYFORMSID"ŠMOVE.LQDEVICE(A2),D6…SAMEDEVICEŠCLR.L‚D7‘CLEARFORUSE>STPRI20ƒMOVE.B#QSTATRDY,D7‡LOOKFORANYREADYTOOUTPUTENTRYŠBSR„FNDENTRY‹GOFINDANENTRY4ŠMOVE.LCURREC-DATASG(A4),D4SAVETHISRECORDNUMBERŠTST„D7‘FOUNDANENTRY?ŠBMI.S‚STPRI70ŒBRANCHIFNOŠTST„D2‘DIDANINSERTALREADY??ŠBLE.S‚STPRI30‡BRANCHIFRECORDALREADYINSERTEDINTOTHEQUEUE(ŠCMP.B‚QPRI(A1),D1ˆSEEIFPRIORITYISOK$ŠBLT„STPRI20ŒBRANCHIFCAN'TGOHEREEŠBGT.S‚STPRI30THISPRIORITYISBIGGER-INSERTINFRONTOFTHISRECORD-ŠCMPA.LQSIZE(A1),A3‡SAMEPRIORITY,CHECKSIZE-ŠBGE„STPRI20ŒTHISONEISBIGGER,CAN'TGOHERE%STPRI30ƒMOVE.LA3,D0ŽGETCURRENTSIZE,ŠSUB.L‚D0,QSIZE(A1)‡UPDATEBUMPEDENTRYSIZE%ŠBPL.S‚STPRI40ŒBRANCHIFSIZENOTNEG:ŠCLR.L‚QSIZE(A1)ŠMAKEITZERO,DON'TWANTANYTHINGNEGATIVE*STPRI40ƒTST„D2‘ALREADYINSERTEDNEWENTRY?ŠBLE.S‚STPRI60ŒBRANCHIFYES,ŠCMPA.LQSIZE(A1),A3‡DOESNEWENTRYGOHERE?*ŠBGE.S‚STPRI60ŒBRANCHIFNO,LOOKSOMEMORE*)*‚REPLACEBUMPEDRECORD,INSERTNEWRECORD*.ŠMOVE.LA2,A1ŽREPLACEOLDENTRYWITHNEWENTRYŠBSR„RPLRECGODOTHEREPLACEŠBNE.S‚STPRI90ŒERRORRETURN-ŠLEA„QBUF-DATASG(A4),A1ADDRESSOFOLDRECORD/ŠMOVE.LCURREC-DATASG(A4),D7WHERETOINSERTIT)ŠADD.L‚#1,D7ŽINSERTAFTERREPLACEDRECORD5ŠBSR„INSRTREC‹GOINSERTOLDRECORDBACKINTOTHEFILEŠTST„D7‘GOODINSERT?!ŠBMI.S‚STPRI90ŒBRANCHIFANERROR+ŠADD.L‚#1,CURREC-DATASG(A4)FORNEXTSEARCH=ŠMOVE.LCURREC-DATASG(A4),D4SET-UPFORNEXTCALLTOFNDENTRY ŠCLR.L‚D2‘SETINSERTEDSWITCHONŠBRA„STPRI20ŒGOGETNEXTENTRY/STPRI60ƒBSR„RPLRECREPLACEOLDRECORDWITHSELFŠBNE.S‚STPRI90ŒERRORRETURNŠBRA„STPRI20ŒGOGETNEXTENTRY**‚ATENDOFFILE**STPRI70ƒTST„D2‘INSERTEDTHENEWENTRYYET?!ŠBLE.S‚STPRI80ŒBRANCHIFYES,DONE>ŠMOVE.LCURREC-DATASG(A4),D7INSERTNEWENTRYAFTERLASTENTRY3ŠADD.L‚#1,D7ŽBUMPRECORDNUMBERFORTHEINSERTCALL0ŠCMP.L‚#10,D7SEEIFSETTOAVALIDENTRYNUMBERŠBGE.S‚STPRI75ŒBRANCHIFGOODŠMOVE.L#10,D7SETTO1STENTRY4ŠMOVE.LD7,CURREC-DATASG(A4)SAVETHISRECORDNUMBER,STPRI75ƒMOVE.LA2,A1ŽSTARTADD< RESSOFRECORDŠBSR„INSRTREC‹GOINSERTITSTPRI80ƒCLR.L‚D7‘GOODRETURN**‚PUTENTRYBACKINTOQBUF**ŠLEA„QBUF-DATASG(A4),A1GETBUFFERADDRESSŠMOVE.LA1,A3ŽGETQBUFADDRESS"ŠMOVE.L#QLNG/2,D0‰#WORDSTOMOVE*STPRI85ƒMOVE.W(A2)+,(A3)+ˆMOVETHERECORDŠSUB.L‚#1,D0ŽDECREMENTCOUNTERŠBNE.S‚STPRI85ŒBRANCHTILMOVEDŠRTS—RETURNTOCALLER&STPRI90ƒMOVE.L#-1,D7SETERRORRETURNŠRTS—RETURNTOCALLERŠPAGE=*‚TSKSTRT‚THISCODEISEXECUTEDBYEACHTASKTHATWASCREATED$*‹BYSTRTSPL.ITDOESTHEFOLLOWING:4*‰1)ASSIGNTHEFILEINQBUFFOREXCLUSIVEREAD‚LUN1.*‰2)ASSIGNTHEDEVICEINQBUFFOROUTPUT‚LUN2"*‰3)DOESTHEFILEREADSANDWRITES7*‰4)TERMINATESSELFATENDOFFILE-THISNOTIFIES.SPL*‹THATTHEI/OISCOMPLETE.0*‰5)IF.SPLISTOCANCELTHISOUTPUT,.SPLISSUES*‹ATERMINATEEVENT+*‰6)IFTHISTASKENCOUNTERSANI/OERROR,IT*‹ISSUESANEVENTTO.SPL3*‰7)THEONLYINITIALIZEDDATAONENTRYISTHEQUEUE*‹ENTRYTOPROCESS,INQBUF<*‰8)REGISTERA0ISINITIALIZEDTOTHEPHYSICALSTARTADDRESS*‹OFTHEDATASEGMENT<*‰9)REGISTERA1ISINITIALIZEDTOTHEPHYSICALSTARTADDRESS3*‹OFTHESEGMENTUSEDFORNON-SPOOLERFILEI/O,IFA3*‹NON-SPOOLERFILEISBEINGOUTPUT.OTHERWISEA1=-1* TSKSTRTƒEQU„*2ŠMOVE.LA0,A4ŽPHYSICALADDRESSOFTHEDATASEGMENTI‡MOVE.LA1,BUFSTRT(A4)SAVETHEPHSICALADDRESSOFTHEI/OBUFFER,IFHAVEŠMOVE.LA1,D2ŽSAVETHEADDRESSŠLEA„STACK(A4),A7‡STACKPOINTER1ŠLEA„FHSPBS(A4),A0†CLEAROUTTHEPARAMETERBLOCKS6ŠMOVE.L#(FHSNLN+IOSBLN)/2,D0NUMBEROFWORDSTOCLEARTSKS01„CLR.W‚(A0)+ŽCLEARITŠSUB.L‚#1,D0ŽDECREMENTCOUNTER ŠBNE.S‚TSKS01BRANCHTILCLEARED'ŠCLR.W‚SUBTERR(A4)ˆCLEARTHEERRORFLAG+ŠCLR.B‚SPLFLGS(A4)ˆCLEARTHETASKFLAGBYTE=ŠMOVE.L#BUFLNG/2,CURRECS(A4)GET1/2THEBUFFERSEGMENTSIZE0ŠMOVE.LCURRECS(A4),SAVLNG(A4)SAVETHE1/2SIZEAŠADD.L‚D2,CURRECS(A4)…OUTPUTBUFFERADDRESSFORNON-SPOOLERFILES*ŠLEA„FHSPBS(A4),A0†PARAMETERBLOCKADDRESSŠMOVE.LA0,A1ŽADDRESSŠCLR.L‚(A1)+ŽTASK=MEŠCLR.L‚(A1)+ŽSESSION.ŠMOVE.B#AQSTQE+AQSTRE,(A1)+STATUS=EVERYTHING"ŠMOVE.B#20,(A1)+ŠMAXENTRYLENGTH ŠMOVE.L#20*4,(A1)+ˆQUEUELENGTHŠLEA„TSKASR(PC),A2†ARSADDRESSŠMOVE.LA2,(A1)ŒARSADDRESS&ŠMOVE.L#GTASQ,D0ŠGETANASQDIRECTIVEŠTRAPƒ#1‘GETITŠBNE„TSKERRERRORRETURN%ŠLEA„QBUFS(A4),A1‡QUEUEENTRYADDRESS2ŠMOVE.LQDEVICE(A1),SPLQNS(A4)SAVETHISTASKNAME.ŠLEA„FHSPBS(A4),A0†FHSPARAMETERBLOCKADDRESSFŠSFHSCOFHASGN,FOPPR+FOPABF+FOPADR,A0ASSIGN,PUBLICREAD,SHAREDBUFFERŠMOVE.B#FOUT,FHSLUN(A0)ƒLUN(ŠMOVE.L#6,D0ŽLENGTHOFFILENAMETOMOVE2ŠLEA„QVOL(A1),A2ˆSTARTADDRESSOFVOLUMENAME,FROM2ŠLEA„FHSVOL(A0),A3†STARTADDRESSOFVOLUMENAME,TO@TSKS02„MOVE.L(A2)+,(A3)+ˆMOVETHENAMEINTOTHEPARAMETERBLOCK"ŠSUB.L‚#1,D0ŽDECREMENTTHECOUNTERŠBNE.S‚TSKS02BRANCHTILMOVED2ŠMOVE.W#$0000,FHSWCD(A0)‚READ/WRITEPROTECTCODES)ŠCLR.W‚FHSGEN(A0)‰CLEARTHERESERVEDWORD6ŠMOVE.L#FMSSRA,FHSSAD(A0)SHAREDBUFFERSTARTADDRESSŠTRAPƒ#3‘ASSIGNTHISFILE)ŠBNE„TSKERRFŒERROR-CAN'TASSIGNTHISFILE5ŠMOVE.LFHSEAD(A0),SBUFEA(A4)SAVEBUFFERENDADDRESSBŠMOVE.LFHSSAD(A0),SBUFSA(A4)PHYSICALSTARTADDRESS-SHAREDBUFFER,ŠMOVE.WFHSOPT(A0),FOPT(A4)SAVETHEOPTIONS**‚ASSIGNTHEOUTPUTDEVICE*/ŠMOVE.LQDEVICE(A1),FHSVOL(A0)DEVICETOASSIGN8ŠMOVE.L#BLANK,D0ŠBLANKSFORPARTOFTHEPARAMETERBLOCK/ŠLEA„FHSCLG(A0),A2†STARTADDRESSFORTHEBLANKS'ŠMOVE.L#9,D1ŽNUMBEROFWORDSTOBLANKS,TSKS03„MOVE.WD0,(A2)+‹BLANKSTOPARA.BLOCKŠSUB.L‚#1,D1ŽDECREMENTCOUNTER ŠBNE.S‚TSKS03BRANCHTILBLANKEDŠMOVE.B#DOUT,FHSLUN(A0)ƒLUN%ŠMOVE.W#USER0,FHSUSN(A0)‚USERNUMBER+ŠSFHSCOFHASGN,FOPPW,A0„ASSIGN,PUBLICWRITEŠCLR.W‚FHSWCD(A0)‰PROTECTCODESŠTRAPƒ#3‘ASSIGNTHISDEVICE#ŠBNE„TSKERRDŒBRANCHIFCAN'TASSIGN%ŠBSR„TSKHDRGOOUTPUTTHEFILEHEADER:TSKS05„LEA„IOSPBS(A4),A0†GETWRITEPARAMETERBLOCKADDRESSŠMOVE.B#DOUT,IOSLUN(A0)ƒLUN ŠMOVE.W#IOWRIT,IOSFCT(A0)WRITE"ŠLEA„TSKASR(PC),A2†GETASRADDRESS+ŠMOVE.LA2,IOSCAD(A0)†IOCOMPLETIONADDRESSŠCLR.L‚D< 2‘CLEARFORLATERUSE.ŠMOVE.BQFILEN(A1),D0†GET1STCHAROFFILENAME!ŠCMP.B‚#SPOOLF,D0‰ASPOOLERFILE?ŠBEQ.S‚TSKS10BRANCHIFYES;ŠBSETƒ#NOTSPL,SPLFLGS(A4)SETNOTOUTPUTTINGASPOOLERFILE9ŠMOVE.LBUFSTRT(A4),SBUFSA(A4)GETCORRECTBUFFERADDRESSŠBRA„TSKS50GODORECORDIO*5* SET UP BLOCK READ PARAMETER BLOCK-FOR SPOOLER FILES*=TSKS10„LEA„FHSPBS(A4),A0†USETHEFHSPARA.BLOCKFORTHEREAD&ŠMOVE.B#FOUT,IOSLUN(A0)ƒREADFILELUN)ŠCLR.W‚IOSSRV(A0)‰CLEARTHERESERVEDWORD$ŠCLR.L‚IOSRRN(A0)‰CLEARTHERECORD#9ŠMOVE.LSBUFSA(A4),IOSSAD(A0)SHAREDBUFFERSTARTADDRESS0ŠMOVE.LSBUFEA(A4),IOSEAD(A0)ENDBUFFERADDRESS8TSKS15„LEA„FHSPBS(A4),A0†RESTOREPARAMETERBLOCKADDRESS+ŠSIOSCOIOREAD,IOPNXT+IOPBLK,A0BLOCKREADS'TSKS20„MOVE.L#SETASQ,D0‰SETASQSTATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L#1,A0ŽDISABLEASR*MOVE.L #3,A0 DISABLE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DOIT(ŠBTSTƒ#PIOF,SPLFLGS(A4)‚PROCEEDIODONE?ŠBEQ.S‚TSKS23BRANCHIFYES'ŠMOVE.L#WTEVNT,D0‰NOTDONE,WAITFORITŠTRAPƒ#1‘DOTHEWAIT!ŠBRA.S‚TSKS25CONTINUEPROCESSING'TSKS23„MOVE.L#SETASQ,D0‰SETASQSTATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L#5,A0ŽENABLEASR*MOVE.L #7,A0 ENABLE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DOIT5TSKS25„LEA„FHSPBS(A4),A0†READPARAMETERBLOCKADDRESSŠTRAPƒ#2‘DOTHEBLOCKREADŠBEQ.S‚TSKS30GOODRETURN(ŠBTSTƒ#TERMERR,SUBTERR(A4)TOTERMINATE?ŠBNE„TSKIO30ŒBRANCHIFTOTERM'ŠCMP.B‚#ISTAEOF,IOSSTA(A0)ENDOFFILE?*ŠBNE„TSKIOERŒBRANCHIFNO,SOMEOTHERERRORŠBRA„TSKDONEŒGOTERMINATE-TSKS30„MOVE.LIOSSAD(A0),D0†GETSTARTADDRESSŠMOVE.LD0,CURPT(A4)‡SAVEITŠMOVE.LD0,A2ŽSAVEIT&ŠADD.L‚IOSLEN(A0),D0†ADDINTHELENGTHŠSUB.L‚#1,D0ŽACTUALENDADDRESS*ŠMOVE.LD0,BUFEND(A4)†SAVETHEENDADDRESS!TSKS40„BSR„DOWRTŽGODOTHEOUTPUT6TSKS45„MOVE.LCURPT(A4),A2‡GETTHENEXTRECORDADDRESS,ŠCMP.L‚BUFEND(A4),A2†SEEIFATENDOFBUFFER,ŠBGE„TSKS15BRANCHIFATEND,READNEXTBLOCK!ŠBRA„TSKS40WRITETHENEXTRECORD*(* DOING RECORD I/O FOR NON-SPOOLER FILES*9TSKS50„LEA„FHSPBS(A4),A0†GETREADPARAMETERBLOCKADDRESSŠMOVE.B#FOUT,IOSLUN(A0)ƒLUN)ŠCLR.W‚IOSSRV(A0)‰CLEARTHERESERVEDWORD,ŠCLR.L‚IOSRRN(A0)‰CLEARRANDOMRECORDNUMBER0ŠMOVE.LCURRECS(A4),A3…GETOUTPUTBUFFERADDRESS.ŠMOVE.LSBUFSA(A4),A2†GETINPUTBUFFERADDRESS:TSKS55„LEA„FHSPBS(A4),A0†RESETTHEPARAMETERBLOCKADDRESS"ŠSIOSCOIOREAD,IOPNXT,A0ƒREADNEXT0TSKS60„MOVE.LA2,IOSSAD(A0)†BUFFERSTARTADDRESS0ŠADD.L‚#2,IOSSAD(A0)†ADJUSTFORNON-SPOOLERFILE,ŠCLR.W‚(A2)SETOPTIONSFORFORMATTEDOUTPUT(ŠMOVE.LA2,IOSEAD(A0)†BUFFERENDADDRESS'ŠMOVE.LSAVLNG(A4),D0†GETBUFFERLENGTH%ŠADD.L‚D0,IOSEAD(A0)†ADDTOTHESTART'ŠSUB.L‚#1,IOSEAD(A0)†ACTUALENDADDRESSŠTRAPƒ#2‘DOTHEREAD#ŠBEQ.S‚TSKS80BRANCHIFAGOODREAD(ŠBTSTƒ#TERMERR,SUBTERR(A4)TOTERMINATE?ŠBNE„TSKIO30ŒBRANCHIFYES'ŠCMP.B‚#ISTAEOF,IOSSTA(A0)ENDOFFILE?ŠBNE.S‚TSKS70BRANCHIFNO#ŠBSETƒ#EOF,SPLFLGS(A4)ƒSETEOFFLAGŠBRA.S‚TSKDONEŒGOTERMINATE0TSKS70„CMP.B‚#ISTABO,IOSSTA(A0)BUFFEROVERFLOW? ŠBNE„TSKIOERŒNO,SOMEOTHERERRORDTSKS80„MOVE.LIOSLEN(A0),D2†GETRECORDLENGTH-IGNOREBUFFEROVERFLOW%ŠADD.L‚#2,D2ŽFORCETHEOPTIONSLENGTHŠBSR.S‚DOWRTŽGODOTHEOUTPUT%TSKS85„BRA„TSKS55GETTHENEXTRECORD*>*‚HEREIFCAN'TASSIGNTHEFILEFOROUTPUTORCAN'TGETANASQ* TSKERR„EQU„*BŠMOVE.L#TERM,D0…TERMINATEDIRECTIVE,USEDFORFILENOTOUTPUTCODE2TSKERRFƒSWAPƒD0‘PUTERRORCODEINUPPERHALFOFD0ŠCLR.W‚D0‘CLEARLOWERHALF!ŠMOVE.B#TERM,D0‹TERMINATIONCODEŠTRAPƒ#1‘TERMINATESELF*-*‚HEREIFFILEWASASSIGNED,BUTDEVICEWASN'T* TSKERRDƒEQU„*ŠMOVE.B#FOUT,D0‹FILELUNŠBSR.S‚CLOSFDCLOSETHEFILE$ŠBRA„TSKERRTERMWITHERRORCODESET**‚HEREIFGOODEND* TSKDONEƒEQU„*!ŠMOVE.L#SETASQ,D0‰SETASQSTATUSO*>>>>>>>>>= >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L#1,A0ŽTODISABLEASR*MOVE.L #3,A0 TO DISABLE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DOIT)ŠBTSTƒ#PIOF,SPLFLGS(A4)‚LASTOUTPUTDONE?ŠBEQ.S‚TSKDN10ŒBRANCHIFYES'ŠMOVE.L#WTEVNT,D0‰NOTDONE,WAITFORITŠTRAPƒ#1‘DOTHEWAIT(TSKDN10ƒMOVE.L#SETASQ,D0‰SETASQSTATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L#5,A0ŽTOENABLETHEASR*MOVE.L #7,A0 TO ENABLE THE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DOIT&TSKDN20ƒMOVE.L#1,D1ŽSETENDPAGEFLAGŠBSR„SEEGOOUTPUTENDPAGEŠMOVE.B#FOUT,D0‹FILELUNŠBSR.S‚CLOSFDGOCLOSETHEFILEŠMOVE.B#DOUT,D0‹DEVICELUN!ŠBSR.S‚CLOSFDGOCLOSETHEDEVICEŠERQ.TERM#0,#0ŒGOODTERMINATE**%*‚CLOSFD‚CLOSETHEFILEORTHEDEVICE*‚ENTRY:D0.B=LUNTOCLOSE*‚EXIT:TOCALLER*‚USES:01234567*…D**…A***4CLOSFD„LEA„FHSPBS(A4),A0†FHSPARAMETERBLOCKADDRESS(ŠMOVE.W#FHCLOS,FHSCMD(A0)CLOSECOMMAND"ŠMOVE.BD0,FHSLUN(A0)†LUNTOCLOSEŠTRAPƒ#3‘DOITŠRTS—RETURNTOCALLERŠPAGE* DOWRT DO THE ACTUAL OUTPUT%* ENTRY:A2=ADDRESS OF RECORD TO WRITE(*‡D2=RECORDLENGTHIFANON-SPOOLERFILE#*‡A3=ADDRESSOFLASTRECORDWRITTEN*‚EXIT:A2=ADDRESSFORNEXTREAD*‡A3=ADDRESSFORNEXTWRITE*‚USES:01234567*…D*ƒ* *…A*ƒRRP DOWRT…EQU„*(ŠBTSTƒ#TERMERR,SUBTERR(A4)TOTERMINATE?ŠBNE„TSKIO30ŒBRANCHIFYES!ŠMOVE.L#SETASQ,D0‰SETASQSTATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L#1,A0ŽDISABLETHEASR*MOVE.L #3,A0 DISABLE THE ASRO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<ŠTRAPƒ#1‘DOIT(ŠBTSTƒ#PIOF,SPLFLGS(A4)‚PROCEEDIODONE?ŠBEQ.S‚DOWR10BRANCHIFDONE)ŠMOVE.L#WTEVNT,D0‰WAITFORITTOBEDONEŠTRAPƒ#1‘DOTHEWAIT!ŠBRA.S‚DOWR20CONTINUEPROCESSING'DOWR10„MOVE.L#SETASQ,D0‰SETASQSTATUSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠMOVE.L#5,A0ŽENABLETHEASR*MOVE.L #7,A0 ENABLE THE ASRO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ŠTRAPƒ#1‘DOIT?DOWR20„BTSTƒ#IOERRF,SPLFLGS(A4)SEEIFANYERRORSONPROCEEDIOŠBNE„TSKIOEWŒBRANCHIFERRORSŠEXG„A2,A3ŽSWAPTHEPOINTERS:DOWR25„LEA„IOSPBS(A4),A0†GETWRITEPARAMETERBLOCKADDRESSŠCLR.L‚D3‘CLEARFORUSE/ŠBTSTƒ#NOTSPL,SPLFLGS(A4)DOINGASPOOLERFILE?ŠBNE.S‚DOWR30BRANCHIFNOŠMOVE.W(A3)+,D2‹GETTHELENGTH2ŠADD.L‚#2,D3ŽCOUNTTHENUMBEROFBYTESADDEDTOA3.DOWR30„MOVE.W(A3)+,IOSOPT(A0)ƒSETTHEOPTIONS2ŠADD.L‚#2,D3ŽCOUNTTHENUMBEROFBYTESADDEDTOA31ŠOR.Wƒ#IOPPRO+IOPCAD,IOSOPT(A0)SETTOPROCEEDIO*ŠMOVE.LA3,IOSSAD(A0)†STARTBUFFERADDRESS(ŠMOVE.LA3,IOSEAD(A0)†SETUPENDADDRESS&ŠADD.L‚D2,IOSEAD(A0)†ADDINTHELENGTH'ŠSUB.L‚#3,IOSEAD(A0)†ACTUALENDADDRESS$ŠSUBA.LD3,A3ŽRESTOREOUTPUTPOINTER5DOWR35„BSETƒ#PIOF,SPLFLGS(A4)‚SETTODOINGPROCEEDIOŠTRAPƒ#2‘DOITŠBNE.S‚TSKIOEWŒERRORRETURN(ŠBTSTƒ#TERMERR,SUBTERR(A4)TOTERMINATE?ŠBNE„TSKIO30ŒBRANCHIFYES/ŠBTSTƒ#NOTSPL,SPLFLGS(A4)DOINGASPOOLERFILE?ŠBEQ.S‚DOWR40BRANCHIFYESŠRTS—NO,RETURNTOCALLER1DOWR40„MOVE.LCURPT(A4),A2‡GETTHERECORDADDRESSŠMOVE.W(A2),D2ŒGETTHELENGTHŠBTSTƒ#0,D2ŽSEEIFEVENŠBEQ.S‚DOWR50BRANCHIFEVEN&ŠADD.L‚#1,D2ŽODD,ADDINTHEEXTRABYTE'DOWR50„ADD.L‚#2,D2ŽBUMPPASTTHELENGTH(ŠLEA„(A2,D2),A2‰POINTTOTHENEXTRECORD%ŠMOVE.LA2,CURPT(A4)‡SAVETHEADDRESSŠRTS—RETURNTOCALLERŠPAGE**‚TSKIOER‚TSKIOEW‚TSKIOEH8*‚I/OERRORSONREADINGFILE,WRITINGFILE,WRITINGHEADER7*‚SENDANEVENTTOTHEMONITORTASKASTOWHICHPROBLEM:*‚ANDWAITFORANEVENT.RETURNEDEVENTMAYBETOCONTINUE>*‚ORTOTERMINATE.IFTERMINATE,CLOSETHEFILEANDTHEDEVICE.***‚EVENTSTRUCTURE:DC.B1EVENTLENGTH(8)*“DC.B1EVENTCODE‚(32)=  *“DC.W1EVENTMESSAGE(SUBTERR)$*“DC.L1D0CONTENTS(IOERRORCODE)*“DC.L1TASKNAME**‚HEADERERRORENTRYPOINT* TSKIOEHƒEQU„**ŠBSETƒ#HDRERR,SUBTERR(A4)SETHEADERERRORŠBRA.S‚TSKIO10ŒCONTINUE**‚READERRORENTRYPOINT* TSKIOERƒEQU„*'ŠBSETƒ#RDERR,SUBTERR(A4)SETREADERRORŠBRA.S‚TSKIO10ŒCONTINUE**‚WRITEERRORENTRYPOINT* TSKIOEWƒEQU„*)ŠBSETƒ#WRTERR,SUBTERR(A4)SETWRITEERRORŠCLR.L‚D5‘CLEARFORUSE6ŠLEA„IOSPBS(A4),A0†GETTHEIOSPARAMETERBLOCKADDRESS(ŠMOVE.BIOSSTA(A0),D5†GETTHEERRORCODE&ŠBSR„OUTERRGOOUTPUTANERRORMESSAGE)ŠMOVE.LD5,D0ŽRESTOREORIGINALERRORCODE ** REST OF ERROR HANDLING CODE**TSKIO10ƒLEA„STACK(A4),A7‡RESTORETHESTACK%ŠBTSTƒ#TERMERR,SUBTERR(A4)TOCANCEL?ŠBNE.S‚TSKIO30ŒBRANCHIFYES.ŠBCLRƒ#IOERRF,SPLFLGS(A4)CLEARTHEERRORFLAG/ŠLEA„QEVTS(A4),A0‡EVENTPARAMETERBLOCKADDRESSŠMOVE.LA0,A1ŽSAVEITŠMOVE.LA0,A5ŽSAVEIT*ŠADD.L‚#18,A1POINTTOSTARTOFEVENTAREA*ŠMOVE.B#SUBTELNG,IOERLNG(A1)EVENTLENGTH(ŠMOVE.B#SUBTECDE,IOERCDE(A1)ERRORCODE(ŠMOVE.WSUBTERR(A4),D1…GETTHEERRORBIT$ŠMOVE.WD1,IOERMSG(A1)…ERRORMESSAGE$ŠMOVE.LD0,IOERD0(A1)†IOSERRORCODE-ŠMOVE.LSPLQNS(A4),IOERNAM(A1)THISTASKNAME+ŠMOVE.L#SPLID,(A5)+‡.SPLTOGETTHISEVENTŠMOVE.L#MYSES,(A5)+‡SESSIONŠCLR.W‚(A5)+ŽUSEDEFAULTASR%ŠMOVE.LA1,(A5)+‹EVENTPACKETADDRESSŠCLR.L‚(A5)USESDEFAULTASR.TSKIO20ƒMOVE.L#QEVNT,D0ŠQUEUEEVENTDIRECTIVEŠTRAPƒ#1‘DOIT$ŠBEQ.S‚TSKIO40ŒBRANCHIFGOODRETURNŠCMP.B‚#RTCDTFUL,D0‡ASQFULL?&ŠBEQ.S‚TSKIO20ŒBRANCHIFYES,TRYAGAIN*?*‚HEREIFCAN'TTELL.SPLABOUTERRORS-CLOSEFILEANDDEVICE,;*‚TERMINATEWITHFILENOTOUTPUT.HEREALSOIF.SPLSENDSA#*‚CANCELWHILEFILEISBEINGOUTPUT*&TSKIO30ƒMOVE.L#1,D1ŽSETENDPAGEFLAG4ŠBTSTƒ#RDYERR,SPLFLGS(A4)OUTPUTDEVICENOTONLINE?$ŠBNE.S‚TSKIO35ŒBRANCHIFNOTONLINEŠBSR„SEEGOOUTPUTALASTPAGE TSKIO35ƒMOVE.B#FOUT,D0‹FILELUNŠBSR„CLOSFDGOCLOSEFILEŠMOVE.B#DOUT,D0‹DEVICELUNŠBSR„CLOSFDGOCLOSETHEDEVICE,ŠBRA„TSKERRTERMWITHFILENOTOUTPUTSTATUS2TSKIO40ƒMOVE.L#WTEVNT,D0‰WAITFOREVENTDIRECTIVEŠTRAPƒ#1‘DOIT*ŠMOVE.BSUBTERR(A4),D0…GETRETURNEDSTATUSŠBTSTƒ#TERMERR,D0ˆTOTERMINATE?$ŠBNE„TSKIO30ŒBRANCHIFYES,TERMINATE&ŠCLR.W‚SUBTERR(A4)ˆCLEARFORNEXTTIME(ŠBTSTƒ#RDERR,D0ŠRETURNFORAREADERROR?&ŠBEQ.S‚TSKIO50ŒBRANCHIFNOTFROMREAD9ŠLEA„FHSPBS(A4),A0†FROMAREAD,FIXUPTHEPARAMETERBLOCK'ŠBTSTƒ#NOTSPL,SPLFLGS(A4)SPOOLERFILE?ŠBNE.S‚TSKIO45ŒBRANCHIFNO6ŠSIOSCOIOREAD,IOPBLK+IOPCUR,A0SETREADCURRENTBLOCKŠBRA„TSKS20GODOTHEREAD3TSKIO45ƒSIOSCOIOREAD,IOPCUR,A0ƒREADCURRENTRECORD%ŠMOVE.LCURRECS(A4),A3…OUTPUTADDRESS#ŠMOVE.LSBUFSA(A4),A2†INPUTADDRESSŠBRA„TSKS60GODOTHEREAD+TSKIO50ƒBTSTƒ#WRTERR,D0‰FROMAWRITEERROR?ŠBEQ.S‚TSKIO60ŒBRANCHIFNO6ŠLEA„IOSPBS(A4),A0†RESETWRITEPARAMETERBLOCKADDRESS)ŠBTSTƒ#NOTSPL,SPLFLGS(A4)ASPOOLERFILE?ŠBNE.S‚TSKIO70ŒBRANCHIFNO%ŠLEA„TSKS45(PC),A5†GETRETURNADDRESS0ŠMOVE.LA5,-(A7)‹SETSPOOLERFILERETURNADDRESSŠBRA„DOWR35GOTRYWRITEAGAIN,TSKIO70ƒLEA„TSKS85(PC),A5†GETRETURNADDRESS4ŠMOVE.LA5,-(A7)‹SETNON-SPOOLERFILERETURNADDRESS"ŠBRA„DOWR35GOTRYTHEWRITEAGAIN,TSKIO60ƒBTSTƒ#HDRERR,D0‰FROMAHEADERERROR?0ŠBEQ„TSKIO30ŒBRANCHIFNO,SOMETHINGELSE,GOTERM%ŠLEA„TSKS05(PC),A5†GETRETURNADDRESS&ŠMOVE.LA5,-(A7)‹PUSHARETURNADDRESS!ŠBRA„TSKHD10ŒGOOUTPUTTHEHEADERŠPAGE*9*‚TSKASR‚THISISTHEASRFORTHESUB-TASKCREATEDBY.SPL2*ŠENTERHEREBECAUSETHESUB-TASKSENTANIOERROR)*ŠEVENTTO.SPLOR.SPLRECEIVEDACANCEL;*ŠTHISASRSETSTERMERRONIFTHESUB-TASKISTOTERMINATE..*ŠIFTHESUB-TASKISTOCONTINUE,JUSTRETURNS.*'*ŠPROCEEDIOCOMPLETIONCOMESHEREALSO*&*‚EVENTSTRUCTURE:‚DC.B1EVENTLENGTH*”DC.B1EVENTCODE(33)*”DC.L1TASKNAMEOFSENDER*”DC.L1SESSIONOFSENDER*”DC.W1MESSAGE&*‚MESSAGESTRUCTURE:-1=TERMINATETASK*–0=CONTINUEPROCESSING** TSKASR„EQU„*'ŠMOVE.L#RDEVNT,D0‰READ> EVENTDIRECTIVE/ŠLEA„QEVTS(A4),A0‡EVENTPARAMETERBLOCKADDRESSŠTRAPƒ#1‘READTHISEVENTŠBNE.S‚TSKASRTN‹ERRORRETURN.ŠCMP.B‚#SPLECDE,EVCODE(A0)ANEVENTFROM.SPL?ŠBNE.S‚TSKASR20‹BRANCHIFNO"ŠMOVE.W2(A0),D0‹GETEVENTMESSAGE0ŠBMI.S‚TSKASR10‹BRANCHIFNEG,SETFORTERMINTION6ŠBCLRƒ#TERMERR,SUBTERR(A4)CONTINUE,ENSURETERMISOFF$ŠBRA.S‚TSKASRTN‹GOSETUPFORRETURN=TSKASR10‚BSETƒ#TERMERR,SUBTERR(A4)SETTERMINATIONERRORCODE4TSKASRTN‚MOVEM.L(A7)+,D0-D7/A0-A6RESTOREREGISTERS"ŠRTR—RETURNFROMEVENT-ASRENABLED* *‚HEREIFANIOCOMPLETIONEVENT**TSKASR20‚CMP.B‚#2,EVCODE(A0)†CODE2EVENT?,ŠBNE„TSKASRTN‹BRANCHIFNO,IGNORETHISEVENTŠCLR.L‚D1‘CLEARFORUSE!ŠMOVE.L2(A0),A0‹GETIOCBADDRESS1TSKASR25‚MOVE.BIOSSTA(A0),D1†GETRETURNEDSTATUS*ŠBNE.S‚TSKASR40‹BRANCHIFANERRORRETURND5TSKASR30‚BCLRƒ#PIOF,SPLFLGS(A4)‚CLEARPROCEEDIOFLAG'ŠBRA„TSKASRTN‹GORETURNFROMTHISEVENT+TSKASR40‚CMP.B‚#ISTANR,D1‰DEVICENOTREADY?#ŠBEQ.S‚TSKASR50‹BRANCHIFNOTREADY6ŠBSETƒ#IOERRF,SPLFLGS(A4)SETAPROCEEDIOERRORFOUND"ŠBRA„TSKASR30‹GOSETUPFORRETURN*‚TSKHDR‚OUTPUTTHEBANNERPAGEIFOUTPUTISTOALINEPRINTER*‚ENTRY:A0=FHSPARAMETERBLOCK#*‹THEPARA.BLOCKISALREADYSET-UP** TSKHDR„EQU„*4ŠMOVE.W#FHRATT,FHSCMD(A0)RECIEVEDEVICEATTRIBUTESŠTRAPƒ#3‘GETTHEM$ŠBNE.S‚TSKHDRER‹SOMETHINGWRONG,EXIT-ŠMOVE.WFHSWCD(A0),D0†GETRETURNEDATTRIBUTESŠBTSTƒ#1,D0ŽSUPPORTSWRITE?"ŠBEQ.S‚TSKHDRER‹BRANCHIFNO,ERRORŠBTSTƒ#10,D0SPOOLERDEVICE?"ŠBEQ.S‚TSKHDRER‹BRANCHIFNO,ERRORŠBTSTƒ#9,D0ŽAPRINTER?"ŠBNE.S‚TSKHD10ŒBRANCHIFAPRINTER!ŠRTS—RETURN,DON'TOUTPUTAHEADER.TSKHDRER‚BRA„TSKERRDŒDEVICEERROR,GOTERMINATE*1*‚OUTPUTDEVICEISAPRINTER-OUTPUTAHEADERPAGE* TSKHD10ƒEQU„*6ŠBSETƒ#PRNTER,SPLFLGS(A4)SETPRINTERISOUTPUTDEVICE.ŠLEA„IOSPBS(A4),A0†IOSPARAMETERBLOCKADDRESSŠMOVE.B#DOUT,IOSLUN(A0)ƒLUN<ŠSIOSCOIOWRIT,IOPNXT+IOPIMG,A0WRITE,OPTIONS=NEXTANDIMAGE1ŠLEA„DATAST(A4),A1†STARTADDRESSOFOUTPUTBUFFER1ŠMOVE.LA1,IOSSAD(A0)†OUTPUTBUFFERSTARTADDRESSŠLEA„QBUFS(A4),A2‡ENTRYADDRESSŠMOVE.B#LF,(A1)+ŠLINEFEEDŠMOVE.B#LF,(A1)+ŠLINEFEEDŠMOVE.B#LF,(A1)+ŠLINEFEEDŠMOVE.B#LF,(A1)+ŠLINEFEEDŠMOVE.L#BLANK,(A1)+‡4BLANKSŠMOVE.L#'JOB',(A1)+ŠMOVE.L#'ID=',(A1)+ ŠCLR.L‚D01ŠMOVE.WQJOBID(A2),D0†GETJOBIDFROMQUEUEENTRY,ŠMOVE.WD0,D4ŽSAVEITD4=USERNUMBER(BINARY)ŠBSR„BDCONVGOCONVERTTOASCIIŠTST.L‚D0‘USERZERO?ŠBNE.S‚TSKHD11ŒBRANCHIFNOŠMOVE.B#$30,D0ŒFORCEAZERO*TSKHD11ƒMOVE.LD0,(A1)+‹TOPHALFOFJOBID,ŠMOVE.LD0,D3ŽSAVEITD3=USERNUMBER(DECIMAL ŠCLR.L‚D0-ŠMOVE.WQJOBID+2(A2),D0„GET2NDHALFOFJOBIDŠBSR„BDCONVCONVERTTOASCII/ŠMOVE.L#4,D1ŽCOUNTERFOR#BYTESINJOBNUMBERTSKHD12ƒROL.L‚#8,D0ŽGET1CHARŠTST.B‚D0‘SEEIFNULL!ŠBNE.S‚TSKHD14ŒBRANCHIFNOTNULL!ŠMOVE.B#$30,D0ŒNULL,FORCEAZERO-TSKHD14ƒMOVE.BD0,(A1)+‹SAVEINOUTPUTBUFFERŠSUB.L‚#1,D1ŽDECREMENTCOUNTERŠBNE.S‚TSKHD12ŒBRANCHTILDONEŠMOVE.L#'‚US',(A1)+ŠMOVE.L#'ER‚',(A1)+ŠMOVE.LD3,(A1)+‹USERNUMBERŠMOVE.W#'‚',(A1)+ˆBLANKSŠMOVE.LA0,A5ŽSAVEA0DŠLEAƒFHSPBS(A4),A0ADDRESSTOASSIGNPRIV.ACCOUNT.OW(GETUSERSNAME)*ŠSFHSCOFHASGN,FOPPR,A0„ASSIGN,PUBLICREADŠMOVE.B#2,FHSLUN(A0)†LUN2(ŠMOVE.L#BLANK,FHSVOL(A0)‚DEFAULTVOLUMEŠCLR.W‚FHSUSN(A0)‰USERNUMBER0'ŠMOVE.L#'PRIV',FHSCLG(A0)CATALOGNAME+ŠMOVE.L#BLANK,FHSCLG+4(A0)RESTOFCATALOG#ŠMOVE.L#'ACCO',FHSFIL(A0)FILENAME-ŠMOVE.L#'UNT',FHSFIL+4(A0)RESTOFFILENAME"ŠMOVE.W#'OW',FHSEXT(A0)ƒEXTENSIONŠCLR.W‚FHSGEN(A0)‰RESERVED"ŠCLR.W‚FHSWCD(A0)‰READ/WRITECODESŠTRAPƒ#3‘ASSIGNFILEFORREAD6ŠBNE.S‚TSKHD17ŒBRANCHIFERROR,MUSTNOTHAVETHISFILE9ŠSIOSCOIOREAD,IOPRRN+IOPBIN+IOPIMG,A0READRANDOMRECORDŠMOVE.> B#2,IOSLUN(A0)†LUNŠCLR.W‚IOSSRV(A0)‰RESERVEDŠCLR.L‚IOSRRN(A0)‰CLEAR'ŠLEA„QEVTS(A4),A3‡RECORDBUFFERADDRESS$ŠMOVE.LD4,(A3)ŒKEYEDRECORDTOREAD#ŠMOVE.LA3,IOSSAD(A0)†STARTADDRESS(ŠMOVE.LA3,IOSEAD(A0)†SET-UPENDADDRESS(ŠADD.L‚#59,IOSEAD(A0)…ACTUALENDADDRESSŠTRAPƒ#2‘READTHERECORD>ŠBNE.S‚TSKHD16ˆBRANCHIFERROR,RECORDMUSTNOTEXIST,IGNOREIT6ŠMOVE.L#5,D0ŽCOUNTERFORMOVINGOWNERSNAMETOBANNER"ŠADDA.L#8,A3ŽBUMPPASTDEPT.NAME)TSKHD15ƒMOVE.L(A3)+,(A1)+ˆNAMETOBANNERŠSUB.L‚#1,D0ŽDECREMENTCOUNTER)ŠBNE.S‚TSKHD15ŒBRANCHTILMOVED(20BYTES)1TSKHD16ƒMOVE.W#FHCLOS,FHSCMD(A0)CLOSETHISFILEŠTRAPƒ#3‘DOTHECLOSE8TSKHD17ƒMOVE.LA5,A0ŽRESTOREIOSPARAMETERBLOCKADDRESS&ŠMOVE.W#LF*$100+CR,(A1)+‚LINEFEED,CRŠMOVE.L#BLANK,(A1)+‡BLANKSŠMOVE.L#'FILE',(A1)+ŠMOVE.L#'NAME',(A1)+ŠMOVE.W#'=',(A1)+/ŠMOVE.BQCATLG(A2),D0†GETFIRSTBYTEOFCATALOG*ŠCMP.B‚#'',D0ŒSEEIFBLANKFORNOCATALOG3ŠBEQ.S‚TSKHD19ŒBRANCHIFBLANK,NOCATALOGSPECIFIED+ŠLEA„QCATLG(A2),A3†GETCATALOGNAMEADDRESS(ŠMOVE.L#8,D0Ž#OFBYTESINCATALOGNAME,ŠMOVE.B#'',(A1)+‰BLANKTOMAKETHINGSEVEN1TSKHD18ƒMOVE.B(A3)+,(A1)+ˆCATALOGNAMETOBANNERŠSUB.L‚#1,D0ŽDECREMENTCOUNTER#ŠBNE.S‚TSKHD18ŒBRANCHTILMOVEDALL3ŠMOVE.B#'.',(A1)+‰DOTBETWEENCATALOGANDFILENAME9TSKHD19ƒMOVE.LQFILEN(A2),(A1)+ƒFILENAMEFROMQUEUEENTRY+ŠMOVE.LQFILEN+4(A2),(A1)+RESTOFFILENAMEŠMOVE.B#'.',(A1)+ ŠMOVE.BQEXT(A2),(A1)+…EXTENSION*ŠMOVE.BQEXT+1(A2),(A1)+ƒRESTOFEXTENSION#ŠMOVE.B#$20,(A1)+‰BLANKTOBEEVEN&ŠMOVE.W#LF*$100+CR,(A1)+‚LINEFEED,CRŠMOVE.L#BLANK,(A1)+‡BLANKSŠMOVE.L#'TASK',(A1)+ŠMOVE.L#'NAME',(A1)+ŠMOVE.W#'=',(A1)+ 3ŠMOVE.LQTASKN(A2),(A1)+ƒTASKNAMEFROMQUEUEENTRY &ŠMOVE.W#LF*$100+CR,(A1)+‚LINEFEED,CRŠMOVE.L#BLANK,(A1)+ŠMOVE.L#'SESS',(A1)+ŠMOVE.L#'ION=',(A1)+ŠMOVE.W#'‚',(A1)+0ŠMOVE.LQSESS(A2),(A1)+„SESSIONFROMQUEUEENTRY&ŠMOVE.W#LF*$100+CR,(A1)+‚LINEFEED,CRŠMOVE.L#BLANK,(A1)+‡BLANKSŠMOVE.L#'DATE',(A1)+ŠMOVE.W#'=',(A1)+#ŠMOVE.LQDATE(A2),D0‡GETENTRYDATEŠBSR„ODATCONV‹CONVERTTOASCIIŠMOVE.WD0,(A1)+‹SAVEMONTHŠMOVE.B#'/',(A1)+ŠROL.L‚#8,D0ŽGET1STDAYŠTST.B‚D0‘SEEIFNULL!ŠBNE.S‚TSKHD20ŒBRANCHIFNOTNULLŠMOVE.B#'0',D0ŒMAKEITAZERO$TSKHD20ƒMOVE.BD0,(A1)+‹SAVE1STDAYŠROL.L‚#8,D0ŽGET2NDDAYŠTST.B‚D0‘SEEIFNULL!ŠBNE.S‚TSKHD30ŒBRANCHIFNOTNULLŠMOVE.B#'0',D0ŒMAKEITAZERO$TSKHD30ƒMOVE.BD0,(A1)+‹SAVE2NDDAYŠMOVE.B#'/',(A1)+ŠMOVE.LD1,(A1)+‹YEAR&ŠMOVE.W#LF*$100+CR,(A1)+‚LINEFEED,CRŠMOVE.L#BLANK,(A1)+‡BLANKSŠMOVE.L#'TIME',(A1)+ŠMOVE.W#'=',(A1)+ŠMOVE.LQTIME(A2),D0‡GETTIMEŠBSR„TIMECONV‹CONVERTTOASCIIŠMOVE.WD0,(A1)+‹HOURSŠMOVE.B#':',(A1)+ŠROL.L‚#8,D0ŽGET1STMINUTEŠTST.B‚D0‘SEEIFNULL!ŠBNE.S‚TSKHD40ŒBRANCHIFNOTNULLŠMOVE.B#'0',D0ŒMAKEITZERO'TSKHD40ƒMOVE.BD0,(A1)+‹SAVE1STMINUTEŠROL.L‚#8,D0ŽGET2NDMINUTEŠTST.B‚D0‘SEEIFNULL!ŠBNE.S‚TSKHD50ŒBRANCHIFNOTNULLŠMOVE.B#'0',D0ŒMAKEITAZERO'TSKHD50ƒMOVE.BD0,(A1)+‹SAVE2NDMINUTEŠMOVE.B#':',(A1)+ŠROR.L‚#8,D1ŽGET1STSECONDŠTST.B‚D1‘NULL?!ŠBNE.S‚TSKHD60ŒBRANCHIFNOTNULLŠMOVE.B#$30,D1ŒFORCEAZERO!TSKHD60ƒMOVE.BD1,(A1)+‹TOBUFFERŠROL.L‚#8,D1ŽGET2NDSECONDŠMOVE.BD1,(A1)+‹TOBUFFER&ŠMOVE.W#LF*$100+CR,(A1)+‚LINEFEED,CR1ŠMOVE.L#24,D0DO48LINEFEEDS‚MODIFIED0621844%TSKHD70ƒMOVE.W#$0A0A,(A1)+‡TOBUFFERŠSUB.L‚#1,D0ŽDECREMENTCOUNTERŠBNE.S‚TSKHD70ŒBRANCHTILDONEŠMOVE.B#LF,(A1)‹LINEFEED/ŠMOVE.LA1,IOSEAD(A0)†OUTPUTBUFFERENDADDRESS'ŠLEA„QBUFS(A4),A1‡RESTOREENTRYADDRESSŠTRAPƒ#2‘OUTPUTTHEHEADERPAGEŠBEQ.S‚TSKHD80ŒGOODRETURN&ŠBSR„CKRDYŽGOSEEIFPRINTERNOTREADY'ŠBNE„TSKIOEHŒBRANCHIFSOMEOTHERERROR/TSKHD80ƒCLR.L‚D1‘FLAGFOROUTPUTTINGFRONTPAGEŠBSR.S‚SEEGOFINISHPAGEŠBNE„TSKIOEHŒERRORRETURNŠRTS—RETURNTOCALLERŠPAGE!*‚SEE‚OUTPUTFRONTANDBACKPAGES*‚ENTRY:D1=0=FRONTPAGE**ˆOUTPUT5LINESOF****ANDATOPOFFORM*ˆD1=1=END? PAGE5*ˆOUTPUTATOPOFFORM,59BLANKLINES,5LINESOF****)*‚EXIT:D0=0=GOODRETURN,OTERWISEANERROR*‚USES:01234567 *…DRP** *…A*ƒ*ƒP SEE‡EQU„*'ŠBTSTƒ#RDYERR,SPLFLGS(A4)DEVICEREADY?5ŠBNE„SEERTNBRANCHIFNOTREADY-DON'TTRYTHISOUTPUTŠCLR.L‚D0‘CLEARFORUSE$ŠBTSTƒ#PRNTER,SPLFLGS(A4)APRINTER?/ŠBEQ.S‚SEERTNBRANCHIFNO,DON'TDOTHISOUTPUT*ŠLEA„IOSPBS(A4),A0†PARAMETERBLOCKADDRESSŠMOVE.B#DOUT,IOSLUN(A0)ƒLUN$ŠSIOSCOIOWRIT,IOPIMG,A0ƒIMAGEWRITE)ŠLEA„SCRATCHS(A4),A2„BUFFERSTARTADDRESS(ŠMOVE.LA2,IOSSAD(A0)†TOPARAMETERBLOCKŠTST.L‚D1‘DOINGFRONTPAGE?ŠBEQ.S‚SEE20ŽBRANCHIFFRONT#ŠMOVE.W#$0C0D,(A2)+‡TOPOFFORM,CR:ŠMOVE.L#64,D0#OFLINEFEEDSTOOUTPUTMODIFIED0621844ŠMOVE.B#LF,D2LINEFEEDCODE*SEE10…MOVE.BD2,(A2)+‹TOTHEOUTPUTBUFFERŠSUB.L‚#1,D0ŽDECREMENTCOUNTERŠBNE.S‚SEE10ŽBRANCHTILDONE(ŠMOVE.LA2,IOSEAD(A0)†SET-UPENDADDRESS'ŠSUB.L‚#1,IOSEAD(A0)†ACTUALENDADDRESSŠTRAPƒ#2‘DOTHEOUTPUT$ŠBEQ.S‚SEE20ŽBRANCHIFAGOODRETURN(ŠBSR.S‚CKRDYŽGOSEEIFPRINTERNOTREADYŠBNE.S‚SEERTNERRORRETURN!SEE20…MOVE.L#5,D3ŽOUTPUT5LINES0SEE30…LEA„SCRATCHS(A4),A2„RESTOREBUFFERADDRESSŠMOVE.W#'**',D2‹**FOROUTPUTŠMOVE.L#64,D0128**'S*SEE40…MOVE.WD2,(A2)+‹TOTHEOUTPUTBUFFERŠSUB.L‚#1,D0ŽDECREMENTCOUNTER#ŠBNE.S‚SEE40ŽBRANCHTILBUFFERFULL!ŠCMP.L‚#1,D3ŽDOINGTHELASTLINE?ŠBNE.S‚SEE50ŽBRANCHIFNOŠTST.L‚D1‘DOINGTHEBACKPAGE? ŠBNE.S‚SEE50ŽBRANCHIFBACKPAGE#ŠMOVE.W#$0D0C,(A2)+‡TOPOFFORM,CRŠBRA.S‚SEE60ŽGOOUTPUT+SEE50…MOVE.W#LF*$100+CR,(A2)+‚CR,LINEFEED-SEE60…MOVE.LA2,IOSEAD(A0)†SET-UPENDADDRESS'ŠSUB.L‚#1,IOSEAD(A0)†ACTUALENDADDRESSŠTRAPƒ#2‘DOTHEOUTPUT$ŠBEQ.S‚SEE70ŽBRANCHIFAGOODRETURN(ŠBSR.S‚CKRDYŽGOSEEIFPRINTERNOTREADYŠBNE.S‚SEERTNERRORRETURN'SEE70…SUB.L‚#1,D3ŽDECRMENTLINECOUNTER%ŠBNE.S‚SEE30ŽBRANCHIFMORETOOUTPUTSEERTN„RTS—RETURNTOCALLERŠPAGE***‚CKRDYPROCESSERRORRETURNFROMIOSCALL5*ˆIFERRORISNOT'E1'(DEVICENOTREADY)RETURNWITH,*ˆCCNOTZEROANDORIGINALERRORCODEIND0.9*ˆIFERRORISDEVICENOTREADY,DOADELAYFOR1.5SECONDS6*ˆANDRE-ISSUETHEIOSCALLUNTILTHEDEVICENOTREADY3*ˆERRORCODEISCLEARED,ADIFFERENTERROROCCURS,OR*ˆATERMINATEWASISSUED.*‚ENTRY:D0=ERRORCODE *ˆA0=IOSPARAMETERBLOCKADDRESS*ˆUSES:01234567*‹D‚R*‹A‚P‡P* CKRDY…EQU„*2ŠBTSTƒ#TERMERR,SUBTERR(A4)TOTERMINATETHISTASK?$ŠBNE„TSKIO30ŒBRANCHIFYES,TERMINATE)ŠCMP.B‚#ISTANR,D0‰DEVICENOTREADYERROR?)ŠBEQ.S‚CKRDY10ŒBRANCHIFDEVICENOTREADY8CKRDYRTN‚BCLRƒ#RDYERR,SPLFLGS(A4)TURNOFNOTREADYFLAGŠTST.B‚D0‘SETCONDITIONCODESŠRTS—RETURNTOCALLER8CKRDY10ƒMOVE.LA0,-(A7)‹SAVEIOSPARAMETERBLOCKADDRESS7ŠBSETƒ#RDYERR,SPLFLGS(A4)TURNONDEVICENOTREADYFLAG!ŠMOVE.L#DELAY,D0ŠDELAYDIRECTIVE"ŠMOVE.L#1500,A0‹DELAY1.5SECONDS"ŠTRAPƒ#1‘CALLEXECTODOTHEDELAY4ŠMOVE.L(A7)+,A0‹RESTOREIOSPARAMETERBLOCKADDRESSŠTRAPƒ#2‘RE-ISSUETHECALLŠBEQ„CKRDYRTN‹GOODRETURNŠBRA„CKRDYŽERRORRETURNŠPAGE*7*‚OUTERROUTPUT'CANNOTSPOOLTHISFILETOTHEPRINTER-*‘INVALIDFILETYPE'*‚USES:01234567*…D* *…A***ƒP* OUTERR„EQU„*$ŠBTSTƒ#PRNTER,SPLFLGS(A4)APRINTER?4ŠBEQ.S‚OUTRTNBRANCHIFNO,DON'TOUTPUTTHISMESSAGE/ŠLEA„SCRATCHS(A4),A1„GETOUTPUTMESSAGEADDRESSŠMOVE.LA1,A2ŽSAVETHISADDRESS'ŠMOVE.L#'CANN',(A1)+†BUILDTHEMESSAGEŠMOVE.L#'OTS',(A1)+†.ŠMOVE.L#'POOL',(A1)+†.ŠMOVE.L#'THI',(A1)+†.ŠMOVE.L#'SFI',(A1)+†.ŠMOVE.W#'LE',(A1)+ˆ.#ŠMOVE.W#$0D0C,(A1)+‡TOPOFFORM,CR%ŠMOVE.LA1,A0ŽPARAMETERBLOCKADDRESSŠMOVE.B#DOUT,IOSLUN(A0)ƒLUN$ŠSIOSCOIOWRIT,IOPIMG,A0ƒIMAGEWRITE+ŠMOVE.LA2,IOSSAD(A0)†MESSAGESTARTADDRESS!ŠMOVE.LA1,IOSEAD(A0)†ENDADDRESS'ŠSUB.L‚#1,IOSEAD(A0)†ACTUALENDADDRESSŠCLR.L‚IOSRRN(A0)‰NOTUSEDŠCLR.L‚IOSLEN(A0)‰NOTUSEDŠCLR.W‚IOSSRV(A0)‰NOTUSEDŠCLR.L‚IOSCAD(A0)‰NOTUSEDŠTRAPƒ#2‘DOTHEOUTPUTOUTRTN„RTS—RETURNTOCALLERŠ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ƒ=ARGSPOOL.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ƒ=ARGSPOOL.LL=/ENDIF=/*=LINK ,SPOOL.LO,\1;MIXAHATTRIBUTES D PSEG SEG0:0,14 $0INPUT SPOOL.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééééüŠLISTŠPAGE**”SPOOLMODIFICATIONHISTORY**…REVISIONCODE‰1220844*1*…PCrelativeaddressingwasexplicitlyinserted.***…REVISIONCODE‰1204844*C*ˆBranchinstructioninthebranchtable,BRATBL,containedashortD*ˆbranchwhichcausedthejumpvectorfortheHelpsubcommandtogetE*ˆtoanillegalinstruction(themiddleofaninstruction).ANOPwas1*ˆaddedtomakeupfortheshortaddressingmode.**…REVISIONCODE‰0621844*?*…Anewoption,CANC*,wasaddedwhichallowsuser0tocancelB*…allfilesinthespoolerqueue.TheroutineCANCQSTnowrequiresF*…twoparameters,thestartingaddressofthemessage,whichispassedD*…ina6andthemessagelength-1,passedinD4.ThisallowsthesameC*…routinetobeus@ edforthequestions"OKTOCANCELALLYOURFILESB*…(Y/N)?"and"OKTOCANCELALLFILESINQUEUE(Y/N)?".WhentheC*…cancelallfilesinqueueoptionischosen,.SPLinsuresthatthe8*…userdoingthisisuser0andreturnsinerrorifnot.*G*…ABRAtoQUITwaschangedtoaBRA.Stoeliminateanassemblywarning*3*…Theopeningmessagenowcontainstheutilityname*FŠTTLSPOOLERUTILITY6/21/84REL4.30COPYRIGHT1984BYMOTOROLA,INC.ISPOL†IDNT‚4,0SPOOLUTILITY6/21/84REL4.30COPYRIGHT1984MOTOROLAINC. ŠSECTION0ŠOPT„FRS* *ˆINCLUDE:*9995.&.IOE.EQ*9995.&.TR1.EQ*ŠNOLISTŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.TR1.EQŠLIST ŠSECTION0 DATAS…EQU„*,ŠDC.Bƒ'SPOOL1220844'ƒDISPLAYSUTILITYNAMEŠDS.Bƒ100SPOOLERSTACK STACK…EQU„**1*‚TABLEOFSPOOLERCOMMANDSANDROUTINEADDRESSES*!CMDTBL„EQU„*’4CHARACTERCOMMANDS Š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„*’ENDOFTABLECMDTBLLƒEQU„6’ENTRYLENGTH'CMDTBL1ƒEQU„*’1CHARACTERCOMMANDTABLE Š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„*’ENDOFTABLECMDTBL1L‚EQU„4’ENTRYLENGTH**‚SAVESTART-UPREGISTERS*-SAVREG„DS.Bƒ9*4SAVE9REGISTERS,4BYTESEACH**‚INPUTCOMMANDLINE*BUF‡COMLINE8280BYTES BUFE†EQU„*-2*QURMSG„DC.Bƒ'COMMANDSYNTAX:'ŠDC.Bƒ'CANCEL'ŠDC.Bƒ'CANCEL'ŠDC.Bƒ'CANCEL'ŠDC.Bƒ'CANCEL<*>'‡0621844ŠDC.Bƒ'CONTINUE'"ŠDC.Bƒ'COPIES'&ŠDC.Bƒ'COPIES'$ŠDC.Bƒ'FORMS'=ŠDC.Bƒ'PRINT[<,FORMSID>]'ŠDC.Bƒ'[,<#OFCOPIES>]'ŠDC.Bƒ'QUEUE'ŠDC.Bƒ'QUEUE'ŠDC.Bƒ'QUEUE'ŠDC.Bƒ'QUEUE<S>'ŠDC.Bƒ'QUEUE
'&ŠDC.Bƒ'START[,<#OFCOPIES>]'(ŠDC.Bƒ'START[,<#OFCOPIES>]' Š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’0621844-KEEPITONEVENADDRESSES%IOSPB…DS.BƒIOSBLNIOSPARAMETERBLOCK%FHSPB…DS.BƒFHSNLNFHSPARAMETERBLOCK"SCRATCHƒDS.BƒFHSNLNSCRATCHBUFFERPRMPT…DC.Bƒ'>'PROMPTPRMPTE„EQU„*-1ŠDS…0’TOBEEVENCONS†DC.Lƒ0’USERCONSOLENAMEPRTSTF„DC.Wƒ0’PRINT-STARTFLAG1CNQST…DC.Bƒ'OKTOCANCELALLYOURFILES(Y/N)?'CNQSTE„EQU„*-1?CNQST2„DC.Bƒ'OKTOCANCELALLFILESINQUEUE(Y/N)?'0621844CNQST2EƒEQU„*-1**ˆERRORMESSAGEPARAMETERBLOCK* EM_PBLKƒEQU„*+EM_D0…DC.Lƒ0’D0IOS/FHSERRORRETURNSTATUS.EM_A0…DC.Lƒ0’A0IOS/FHSPARAMETERBLOCKADDRESEM_OPT„DC.Bƒ0’OPTIONSFLAGEM_TLUNƒDC.Bƒ0’LDFLUN$EM_QRC„DC.Bƒ0’QUERYRETURNCHARACTEREM_KLUNƒDC.Bƒ0’CDFLUN3EM_SPA„DC.Lƒ0’STARTADDRESSFORUSERTEXTPLUGTOOL1EM_EPA„DC.Lƒ0’ENDADDRESSFORUSERTEXTPLUGTOOLŠPAGEŠXREFƒEDITFILE,SBARG*/*‚SPOOL‚UTILITYTOHANDLEUSERCOMMANDSTO.SPL)*‰TAKESASSORTEDUSERCOMMANDSANDISSUES)*‰PARAMETERBLOCKSTOFHS,WHICHSENDSTHE *‰EVENTSTO.SPLFORPROCESSING.+*‰RETURNEDSTATUSISSETBY.SPL..SPLDOES*‰MOSTOFTHEERRORCHECKING.*4*‰COMMANDSMAYBEENTEREDONTHEINPUTLINE.INTHAT/*‰CASEONLYTHATCOMMANDISPROCESSEDANDSPOOL;*‰TERMINATES.IFNOCOMMANDISENTEREDONTHECOMMANDLINE,5*‰SPOOLENTERSANINTERACTIVEMODE,PROMPTINGFOREACH"*‰COMMANDUNTIL'QUIT'ISENTERED.*C*ˆVALIDCOMMANDSARE:CANCEL,CONTINUE,FORMS,PRINT,COPIES,START,QUIT,@*ˆHELP,ANDQUEUE.EACHMAYBEABBREVIATEDWITHTHEFIRST4CHARS=*ˆOFTHENAME.ALSO,QUEUEMAYBEENTEREDAS'Q',FORMSAS'F', *ˆPRINTAS'A P'ANDSTARTAS'S'.*<*ˆALLIOS,FHS,AND.SPLERRORRETURNSAREHANDLEDBYCALLING?*ˆTHEERRORMESSAGEHANDLERTHRUTRAP#4.ARGUMENTSUBSTITUTION@*ˆISHANDLEDBYCALLINGSBARGAFTEREACHREADINTHEINTERACTIVE*ˆMODE.*2*ˆGENERALREGISTERUSAGE:A4=DATAAREABASEADDRESS-*ŸA0=FHSPARAMETERBLOCKADDRESS(.SPLCALLS)*ŸA3=COMMANDBUFFERADDRESS&*ŸD2=INTERACTIVEFLAG(-1=INTERACTIVE)*ŸD6=INPUTBUFFERLENGTH**ƒMAINSPOOLERDRIVER* SPOL†EQU„*+ŠLEA„DATAS(PC),A7‡GETSTARTOFDATAADDRESS=ŠMOVEM.LD0-D6/A0-A1,SAVREG-DATAS(A7)SAVESTART-UPREGISTERS+ŠMOVE.LA1,CONS-DATAS(A7)‚USERCONSOLENAMEŠLEA„STACK(PC),A7‡STACKADDRESS,ŠLEA„DATAS(PC),A4‡BASEADDRESSOFDATASTART ŠCLR.L‚D2‘CLEARINTERACTIVEFLAG&ŠBSR„INITMSGŒGOOUTPUTINITIALMESSAGEŠTST.L‚D6‘ANYCOMMANDLINE?ŠBNE.S‚SPOL20BRANCHIFYES&ŠMOVE.L#-1,D2SETTOINTERACTIVEMODESPOL10„BSR„PROMPTGETACOMMAND)SPOL20„LEA„BUF(PC),A3‰GETCOMMANDADDRESS$ŠBSR.S‚GETCMDGOGETCOMMANDADDRESSŠTST„D7‘GOTONE?ŠBMI.S‚SPOL30BRANCHIFNO2ŠMOVE.LA1,D0ŽGETTHEOFFSETINTOTHEBRANCHTABLEŠLSL.L‚#2,D0ŽMULTIPLYBY4+ŠLEA„BRATBL(PC),A1†GETBRANCHTABLEADDRESS)ŠADD.L‚D0,A1ŽBRANCHTABLEROUTINEADDRESS ŠJSR„(A1)GOPROCESSTHECOMMANDŠTST„D2‘INTERACTIVE?%ŠBEQ.S‚QUITBRANCHIFNO,GOTERMINATE+ŠBRA„SPOL10INTERACTIVE,GOGETNEXTCOMMAND6SPOL30„BSR„QUERYŽINVALIDENTRY,OUTPUTLISTOFCOMMANDSŠBRA„SPOL10GOGETINPUTAGAIN*#*ˆBRANCHTABLEFORCOMMANDROUTINES* BRATBL„EQU„*ŠBRA„CANCELCANCELCOMMANDŠBRA„CONTCONTINUECOMMANDŠBRA„FORMFORMSCOMMANDŠBRA„PRINTŽPRINTCOMMANDŠBRA„STRTSTARTCOMMANDŠBRA„COPYCOPIESCOMMANDŠBRA„QUEUEŽQUEUECOMMANDŠBRA.S‚QUITQUITCOMMAND$ŠNOPNEEDEDFORPROPERVECTOR120484ŠBRA„QUERYŽHELPCOMMANDŠPAGE***‚QUITCOMMAND…TERMINATE**'QUIT†ERQ.TERM#0,#0ŒGOODTERMINATECODE***ˆERRORTERMINATION* QUITERRƒEQU„*"ŠBSR„ERRORŽGOOUTPUTERRORMESSAGE%ŠERQ.TERM#0,#$C000ˆERRORTERMINATIONŠPAGE**‚GETCMD‚GETCOMMAND5*‚SEARCHESCOMMANDTABLESFORAVALIDSPOOLERCOMMAND*0*‚ENTRY:A3=BUFFERADDRESSCONTAININGTHECOMMAND*ˆA4=BASEADDRESS*ˆD2=INTERACTIVEFLAG*ˆD6=INPUTBUFFERLENGTH%*‚EXIT:A3=ADDRESSOFCOMMANDARGUMENT/*‡A1=ROUTINEADDRESSOFFSETTOTHEBRANCHTABLE*‡D2=INTERACTIVEFLAG*‡D6=REMAININGBUFFERLENGTH*‡D7=0=VALIDCOMMAND*‡D7=-1=INVALIDCOMMAND*‚USES:01234567 *…Dƒ*P*‡R *…AƒR*RP** GETCMD„EQU„*!ŠMOVE.L#0,A1ŽCLEARFORLATERUSE!ŠMOVE.L(A3),D1ŒGETINPUTCOMMAND1ŠLEA„CMDTBL(PC),A2†STARTADDRESSOFCOMMANDTABLE0ŠLEA„CMDTBLE(PC),A5…ENDADDRESSOFCOMMANDTABLE0GETC10„CMP.L‚(A2),D1ŒLOOKFORAMATCHINGCOMMAND0ŠBEQ.S‚GETC30BRANCHIFFOUNDAMATCHINGCOMMAND)ŠADD.L‚#CMDTBLL,A2ˆBUMPTOTHENEXTENTRY%ŠCMP.L‚A5,A2ŽSEEIFPASTENDOFTABLE&ŠBLT„GETC10BRANCHIFNOTPASTTHEEND3ŠLEA„CMDTBL1(PC),A2…SEARCHTHE1CHARCOMMANDTABLE)ŠLEA„CMDTBL1E(PC),A5„ENDADDRESSOFTABLEŠCLR.L‚D1‘CLEARFORUSE!ŠMOVE.B(A3),D1ŒGETINPUTCOMMAND%GETC20„CMP.B‚(A2),D1ŒLOOKFORAMATCH!ŠBEQ.S‚GETC40BRANCHIFFOUNDONE&ŠADD.L‚#CMDTBL1L,A2‡BUMPTONEXTENTRYŠCMP.L‚A5,A2ŽPASTENDOFTABLE?,ŠBLT.S‚GETC20BRANCHIFMORETABLETOSEARCH&ŠMOVE.L#-1,D7SETTONOCOMMANDFOUND ŠRTS—RETURN1GETC30„MOVE.W4(A2),A1‹GETCOMMANDADDRESSOFFSET"ŠBRA.S‚GETC50GOFINISHPROCESSING1GETC40„MOVE.W2(A2),A1‹GETCOMMANDADDRESSOFFSET*.*‚VAILDCOMMAND,GETADDRESSOFARGUMENT,IFANY*%GETC50„CLR.L‚D7‘SETFORAGOODRETURN"ŠMOVE.B#'',D1ŒSEARCHFORABLANK'ŠMOVE.B#',',D0ŒSEARCHFORACOMMAALSO!GETC60„MOVE.B(A3)+,D3‹GETABYTEŠCMP.B‚D0,D3ŽACOMMA?ŠBEQ.S‚GETC70BRANCHIFYESŠCMP.B‚D1,D3ŽABLANK?ŠBEQ.S‚GETC70BRANCHIFYES$ŠSUB.L‚#1,D6ŽDECREMENTBUFFERLENGTH'ŠBNE.S‚GETC60BRANCHIFMORETOLOOKAT1GETC70„TST„D6‘SEEIFMUSTDECREMENTFORTHEBLANKŠBLE.S‚GETC80BRANCHIFNO ŠSUB.L‚#1,D6ŽBUMPPASTTHEBLANKGETC80„RTS—RETURNŠPAGE**‚CANCEL‚CANCELASPOOLERJOB*ŠCOMMANDCODE=$0202*ŠSPECIFYACTION*Š-------------*ŠJOBIDA DELETETHATJOB*ŠFILENAMEŒDELETETHATFILENAME4*Š*“DELETEALLJOBSINQUEUE(PRIVELEGED)-0621844.*ŠNOTHINGDELETEALLJOBSFORTHATUSERNUMBER**‚ENTRY:D2=INTERACTIVEFLAG*ˆA4=BASEADDRESS*ˆD6=COMMANDLINELENGTH*ˆA3=COMMANDLINEADDRESS*‚EXIT:D2=INTERACTIVEFLAG$*‚CALLS:CLRFHS‚FNJOBID‚ERROR‚CANCQST** CANCEL„EQU„*8ŠBSR„CLRFHSŒGOCLEARTHEPARABLOCK,RETURNADDRESSINA0*ŠMOVE.W#SPLCANC,FHSCMD(A0)CANCELCOMMAND.ŠLEA„SAVREG(PC),A5†GETSAVEDREGISTERSADDRESS)ŠMOVE.W14(A5),FHSUSN(A0)‚SETUSERNUMBERŠTST„D6‘ANYARGUMENTS?ŠBGT.S‚CANC40BRANCHIFYES=CANC10„LEA„CNQST(PC),A6‡BEGINNINGOFMESSAGE-ADDED0621844:ŠMOVE.L#CNQSTE-CNQST,D4ƒMESSAGELENGTH-1-ADDED0621844BŠBSR.S‚CANCQST„GOASKIFREALLYWANTTOCANCELALL-MOD.0621844ŠTST„D7‘CHECKRETURN2ŠBMI.S‚CANC30BRANCHIFANSWERWASNO,DON'TCANCELCANC20„TRAPƒ#3‘DOTHECANCELŠBEQ.S‚CANC30GOODRETURN"ŠBSR„ERRORŽGOOUTPUTERRORMESSAGECANC30„RTS—RETURN**‚PARSETHECOMMANDLINE)CANC40„CMP.B‚#$0D,(A3)ŠACARRIAGERETURN?,ŠBEQ„CANC10BRANCHIFYES,NOMOREINPUTLINE0ŠCMP.B‚#'*',(A3)ŠCANCELEVERYONE?ADDED0621844"ŠBEQ.S‚CANC50YES-ADDED06218444ŠMOVE.LA3,D5ŽSAVECURRENTADDRESSINCOMMANDBUFFER:ŠBSR„FNJOBIDŠGOPUTFILENAMEORJOBIDINTOPARAMETERBLOCKŠTST„D7‘GOODRETURN?$ŠBMI„CMDERRBRANCHIFERRORRETURNED2ŠADD.L‚#1,D6ŽFIX-UPNUMBEROFCHARACTERSINBUFFER6ŠBSR„GTAAFTGOSEEIFNEEDDEFAULTVAOLUMEANDCATALOGŠBRA„CANC20GODOTHECANCEL*5*„DOUBLECHECKTOSEEIFTHEYWANTTOCANCELEVERYONE*)CANC50„LEA„CNQST2(PC),A6†CANCELEVERYONE?-ŠMOVE.L#CNQST2E-CNQST2,D4MESSAGELENGTH-1ŠBSR.S‚CANCQSTŒGETRESPONSEŠBMI.S‚CANC30USERCHANGEDMIND8ŠMOVE.W#'**',FHSUSN(A0)ƒPUTASTERISKINFORUSERNUMBERŠBRA„CANC20DOTHECANCELŠPAGE*9*‚CANCQST‚ASKIFREALLYWANTTOCANCELALLTHEUSERSJOBS*‚EXIT:D7=0=DOTHECANCEL*‡D7=-1=DON'TCANCEL*‚USES:01234567 *…D**ƒ**…R *…AP**ƒPƒ*** CANCQSTƒEQU„*ŠMOVE.LA0,A1ŽSAVECURRENTA0/CANQ05„LEA„IOSPB(PC),A0‡USEIOSPARAMETERBLOCK,ŠMOVE.W#IOWRIT,IOSFCT(A0)OUTPUTWITHINPUT)ŠMOVE.W#IOPASC+IOPIMG,IOSOPT(A0)OPTIONSŠMOVE.B#LDFLUN,IOSLUN(A0)LUN*ŠMOVE.LA6,IOSSAD(A0)†OUTPUTSTARTADDRESS+ŠMOVEA.LA6,A2PRESERVEA6-ADDED06218444ŠADDA.LD4,A2ŽDETERMINEENDADDRESS-ADDED0621844<ŠMOVE.LA2,IOSEAD(A0)†OUTPUTENDADDRESS-MODIFIED0621844ŠTRAPƒ#2‘DOTHEIMAGEOUTPUTŠBNE„QUITERRŒERRORRETURN)ŠMOVE.W#IOREAD,IOSFCT(A0)READTHEINPUT$ŠMOVE.W#IOPFOR,IOSOPT(A0)FORMATTEDŠMOVE.B#CDFLUN,IOSLUN(A0)LUN3ŠLEA„BUF(PC),A2‰INPUTBUFFERSTARTADDRESS06218445ŠMOVE.LA2,IOSSAD(A0)†STARTADDRESSOFINPUT06218442ŠLEA„BUFE(PC),A2ˆINPUTBUFFERENDADDRESS06218443ŠMOVE.LA2,IOSEAD(A0)†ENDADDRESSOFINPUT0621844ŠTRAPƒ#2‘DOTHEREADŠBNE„QUITERRŒERRORRETURN;ŠBSR„SBARG‰GOSEEIFARGUMENTSUB.ORCONVERTTOUPPERCASEŠBNE„QUITERRŒERRORRETURN&ŠMOVE.LIOSLEN(A0),D0†GETINPUTLENGTHŠCMP.L‚#2,D0ŽCHECKLENGTH)ŠBGT„CANQ05BRANCHIFTOOLARGE,ASKAGAIN"ŠLEA„BUF(PC),A2‰GETBUFFERADDRESS!ŠMOVE.B(A2)+,D1‹GETTHE1STBYTEŠSUB.L‚#1,D0ŽDECREMENTLENGTHŠBEQ.S‚CANQ10BRANCHIFNOMOREŠMOVE.B(A2),D3ŒGETNEXTBYTE!ŠCMP.B‚#$0D,D3ŒACARRIAGERETURN?"ŠBNE„CANQ05BRANCHIFNO,ASKAGAIN'CANQ10„CLR.L‚D7‘SETUPFORAYESANSWERŠCMP.B‚#'Y',D1ŒAYFORYES?ŠBNE.S‚CANQ20BRANCHIFNOCANQRTNƒMOVE.LA1,A0ŽRESTOREA0 ŠRTS—RETURN!CANQ20„CMP.B‚#'N',D1ŒANNFORNO?"ŠBNE„CANQ05BRANCHIFNO,ASKAGAIN+CANQ30„MOVE.L#-1,D7SETTONO,DON'TCANCELŠBRA„CANQRTNŒGORETURNŠPAGE**ƒCONT‚CONTINUECOMMAND>*‰RETRYOUTPUTIFAFTERANIOERRORORSTARTNEXTJOBIFAFTER.*‰AFORMSCHANGE.IGNOREDIFDEVICEISACTIVE.*‰COMMANDCODE=$0204*‰SPECIFY:DEVICENAME**‚ENTRY:D2=INTERACTIVEFLAG*ˆA4=BASEADDRESS*ˆD6=COMMANDBUFFERLENGTH*ˆA3=COMMANDBUFFERADDRESS*‚EXIT:D2=INTERACTIVEFLAG*‚CALLS:CLRFHS‚SETDEVNƒERROR** CONT†EQU„*ŠTST„D6‘ANYDEVICENAME?ŠBLE„CMDERRBRANCHIFNO,ERRB OR8ŠBSR„CLRFHSŒGOCLEARTHEPARABLOCK,RETURNADDRESSINA00ŠMOVE.W#SPLCONT,FHSCMD(A0)SETCONTINUECOMMAND8ŠBSR„SETDEVNŒGOPUTDEVICENAMEINTOTHEPARAMETERBLOCKŠTRAPƒ#3‘DOTHECONTINUEŠBEQ.S‚CONT10GOODRETURN"ŠBSR„ERRORŽGOOUTPUTERRORMESSAGECONT10„RTS—RETURNŠPAGE**‚FORMƒCHANGEFORMSIDCOMMAND*‰COMMANDCODE=$0208"*‰SPECIFY:DEVICENAMEANDFORMSID*‚ENTRY:D2=INTERACTIVEFLAG*ˆD6=COMMANDBUFFERLENGTH*ˆA3=COMMANDBUFFERADDRESS*ˆA4=BASEADDRESS*‚EXIT:D2=INTERACTIVEFLAG*‚CALLS:CLRFHS‚SETDEVN‚ERROR** FORM†EQU„*ŠTST„D6‘ANYARGUMENTS?ŠBLE„CMDERRBRANCHIFNO,ERROR<ŠBSR„CLRFHSˆGOCLEARTHEPARABLOCKANDRETURNADDRESSINA0"ŠMOVE.LA3,D5ŽSAVECURRENTADDRESS,ŠMOVE.W#SPLFORM,FHSCMD(A0)SETFORMCOMMAND8ŠBSR„SETDEVNŒGOPUTDEVICENAMEINTOTHEPARAMETERBLOCK.ŠMOVE.LA3,D0ŽGETCURRENTCOMMANDLINEADDRESS9ŠSUB.L‚D5,D0SEEHOWMANYCHARACTERSUSEDFORDEVICENAME+ŠSUB.L‚D0,D6Ž#CHARSREMAININGINTOBUFFER!ŠCMP.L‚#4,D6ŽMUSTHAVEATLEAST4*ŠBLT„CMDERRBRANCHIFNOTATLEAST4,ERROR1ŠMOVE.L#4,D0ŽMOVE4BYTESTOTHEPARAMETERBLOCK)ŠMOVE.LA0,A1ŽGETPARAMETERBLOCKADDRESS(ŠADD.L‚#FHSSIZ,A1‰POINTTOCORRECTFIELD'FORM10„MOVE.B(A3)+,(A1)+ˆMOVEFORMSIDŠSUB.L‚#1,D0ŽDECREMENTCOUNTERŠBNE„FORM10BRANCHTILMOVED(ŠSUB.L‚#4,D6ŽDECREMENTBUFFERCOUNTALSOŠCMP.L‚#1,D6ŽSEEIF1LEFT ŠBGT„CMDERRBRANCHIFMORE,ERRORŠTRAPƒ#3‘DOTHEFORMSCHANGEŠBEQ.S‚FORM20GOODRETURN"ŠBSR„ERRORŽGOOUTPUTERRORMESSAGEFORM20„RTS—RETURNŠPAGE**‚PRINT‚PRINTAFILE*‚START‚STARTAFILE*‰COMMANDCODE=$0210*‰SPECIFY•ACTION*‰-------•------.*(START)JOBID<#COPIES>OUTPUTTHISJOBNEXT9*(START)SPOOLERFILENAME<#COPIES>‚OUTPUTTHISJOBNEXTG*(PRINT)NON-SPOOLERFILENAMEˆADDTHISTOTHESPOOLERQUEUEFOROUTPUT*%*‰NON-SPOOLERFILENAMESPECIFICATION:'*‰FILENAME,DEVICE<,FORMSID><,#COPIES>**‚ENTRY:D2=INTERACTIVEFLAG*ˆD6=COMMANDLINELENGTH*ˆA3=COMMANDLINEADDRESS*ˆA4=BASEADDRESS*‚EXIT:D2=INTERACTIVEFLAG1*‚CALLS:CLRFHS„FNJOBID„SETDEVNƒCNVAB„GTAAFTƒERROR**STRT†EQU„*’STARTENTRYPOINT+ŠMOVE.W#-1,PRTSTF-DATAS(A4)SETSTARTFLAGŠBRA.S‚PRNT10GOPROCESS PRINT…EQU„*&ŠCLR.W‚PRTSTF-DATAS(A4)ƒSETPRINTFLAGPRNT10„TST„D6‘ANYARGUMENT?ŠBLE„CMDERRBRANCHIFNO,ERROR5ŠBSR„CLRFHSCLEARPARABLOCKANDRETURNADDRESSINA0-ŠMOVE.W#SPLPRNT,FHSCMD(A0)SETPRINTCOMMAND.ŠLEA„SAVREG(PC),A5†GETSAVEDREGISTERSADDRESS)ŠMOVE.W14(A5),FHSUSN(A0)‚GETUSERNUMBER1ŠMOVE.LA3,D5ŽSAVECURRENTCOMMANDBUFFERADDRESS5ŠBSR„FNJOBIDŒGOPUTFILENAMEORJOBIDINTOPARABLOCKŠTST„D7‘CHECKRETURNŠBMI„PRNTERRŒBRANCHIFANERROR:ŠBSR„GTAAFTŠGOFIXLENGTHOFBUFFERANDDETERMINEFILETYPEŠTST„D7‘SPOOLERFILE?(ŠBMI.S‚PRNT30BRANCHIFNON-SPOOLERFILE'PRNT20„TST„D6‘ANYCHARACTERSREMAINING?+ŠBEQ.S‚PRNT40BRANCHIFNO,GODOTHISPRINT#ŠSUB.L‚#1,A3ŽPOINTTOTHESEPARATOR%ŠBRA.S‚PRNT80GOGETNUMBEROFCOPIES***‚HEREIFANON-SPOOLERFILENAMESPECIFIED*6PRNT30„TST.W‚PRTSTF-DATAS(A4)ƒHEREFROMSTARTCOMMAND?ŠBMI„PRNT20BRANCHIFYES.ŠCMP.L‚#1,D6ŽANYMORECHARSINCOMMANDBUFFER?ŠBLE„PRNTERRŒBRANCHIFNO,ERROR)ŠMOVE.LA3,D5ŽSAVECOMMANDBUFFERADDRESS'ŠBSR„SAVFHSGOSAVETHEPARAMETERBLOCKŠBSR„SETDEVNŒGOGETDEVICENAME*ŠMOVE.LFHSVOL(A0),D0†GETDEVICENAMEHERE'ŠBSR„GETFHSRESTORETHEPARAMETERBLOCKBŠMOVE.LD0,FHSSAD(A0)…PUTTHEDEVICENAMEINTOTHEPARAMETERBLOCK(ŠMOVE.LA3,D1ŽGETCURRENTBUFFERADDRESS$ŠSUB.L‚D5,D1ŽSEEHOWMANYCHARSUSED!ŠADD.L‚#1,D1ŽADDINTHESEPARATOR#ŠSUB.L‚D1,D6Ž#CHARACTERSREMAINING@ŠBLE.S‚PRNT40†BRANCHIFNONELEFT,USEDEFAULTFORMSIDANDCOPIESŠCMP.L‚#1,D6ŽONELEFT?#ŠBGT.S‚PRNT60BRANCHIFMORETHAN1&PRNT40„CLR.W‚FHSOPT(A0)‰DEFAULTCOPIES"ŠCLR.L‚FHSEAD(A0)‰DEFAULTFORMSID$PRNT50„TRAPƒ#3‘DOTHISPRINTCOMMANDŠBEQ.S‚PRNT55GOODRETURN"ŠBSR„ERRORŽGOOUTPUTERRORMESSAGE8PRNT55„CLR.W‚PRTSTF-DATAS(A4)ƒCLEARTHEPRINT-STARTFLAG ŠRTS—RETURN,PRNT60„CLR.L‚FHSEAD(A0)‰SETDEFAULTFORMSID&ŠCLR.W‚FHSOPT(A0)‰SETDEFAULT#COPIESŠCMP.B‚#B ',',(A3)ŠNULLFORMSID?ŠBEQ.S‚PRNT80BRANCHIFYESŠCMP.B‚#'',(A3)ŠNULLFORMSID?ŠBEQ.S‚PRNT80BRANCHIFYES!ŠCMP.B‚#$0D,(A3)ŠCARRIAGERETURN?1ŠBEQ„PRNT50BRANCHIFYES,GOPROCESSTHISCOMMAND!ŠMOVE.L#4,D0Ž#CHARSINFORMSID)ŠMOVE.LA0,A6ŽGETPARAMETERBLOCKADDRESS)ŠADD.L‚#FHSEAD,A6‰POINTTOFORMSIDFIELD6PRNT70„MOVE.B(A3)+,(A6)+ˆPUTFORMSIDINTOPARABLOCKŠSUB.L‚#1,D0ŽDECREMENTCOUNTERŠBNE.S‚PRNT70BRANCHTILMOVED$ŠSUB.L‚#4,D6ŽDECREMENTBUFFERLENGTH)ŠBMI.S‚PRNTERRŒBRANCHIFNOTENOUGH,ERROR$ŠBEQ.S‚PRNT50BRANCHIFNOMORE,DONE&PRNT80„SUB.L‚#1,D6ŽBUMPPASTSEPARATOR"ŠBLE„PRNT50BRANCHIFNOMORE,DONE!ŠCMP.B‚#$0D,(A3)ŠCARRIAGERETURN?ŠBEQ„PRNT50BRANCHIFYES,DONEŠCMP.B‚#',',(A3)ŠCOMMA?+ŠBEQ.S‚PRNT90BRANCHIFYES,GOGET#COPIESŠCMP.B‚#'',(A3)ŠBLANK?!ŠBNE.S‚PRNTERRŒBRANCHIFNO,ERROR*$*‚HEREIFNUMBEROFCOPIESSPECIFIED*PRNT90„CLR.L‚D0‘CLEARCOUNTER$ŠADD.L‚#1,A3ŽPOINTTONEXTCHARACTER ŠMOVE.LA3,A1ŽGETBUFFERPOINTER"PRNT100ƒMOVE.B(A3)+,D1‹GETABYTEŠCMP.B‚#$30,D1ŒANUMBER?ŠBLT.S‚PRNT110ŒBRANCHIFNOŠCMP.B‚#$39,D1ŒANUMBER?ŠBGT.S‚PRNT110ŒBRANCHIFNOŠADD.L‚#1,D0ŽCOUNTIT$ŠSUB.L‚#1,D6ŽDECREMENTBUFFERLENGTH$ŠBGT.S‚PRNT100ŒBRANCHIFMORETOGET&PRNT110ƒTST.L‚D0‘GOTANYFOR#COPIES?!ŠBEQ.S‚PRNTERRŒBRANCHIFNO,ERRORŠCMP.L‚#3,D0Ž3NUMBERSMAX#ŠBGT.S‚PRNTERRŒBRANCHIFMORE,ERRORŠTST.L‚D6‘ANYBUFFERLEFT?!ŠBMI.S‚PRNTERRŒBRANCHIFNO,ERRORŠBSR„CNVABŽGOCONVERTTOBINARYŠTST„D7‘GOODCONVERT?!ŠBNE.S‚PRNTERRŒBRANCHIFNO,ERROR"ŠMOVE.WD3,FHSOPT(A0)†SET#COPIESŠBRA„PRNT50GODOTHISPRINT9PRNTERRƒCLR.W‚PRTSTF-DATAS(A4)ƒCLEARTHEPRINT-STARTFLAG ŠBRA„CMDERRCOMMANDERRORRETURNŠPAGE*!*‚COPY‚CHANGE#COPIESFOROUTPUT*ˆCOMMANDCODE=$0220(*ˆSPECIFY:JOBIDORFILENAMEAND#COPIES**‚ENTRY:D2=INTERACTIVEFLAG*ˆD6=COMMANDLINELENGTH*ˆA3=COMMANDLINEADDRESS*ˆA4=BASEADDRESS*‚EXIT:D2=INTERACTIVEFLAG)*‚CALLS:CLRFHS„FNJOBIDƒCNVAB„GTAAFT‚ERROR** COPY†EQU„*ŠTST„D6‘ANYARGUMENT?!ŠBLE.S‚COPYERRŒBRANCHIFNO,ERROR3ŠBSR„CLRFHSCLEARPARABLOCK,RETURNEDADDRESSINA0#ŠMOVE.W#SPLCOPY,FHSCMD(A0)COMMAND.ŠLEA„SAVREG(PC),A5†GETSAVEDREGISTERSADDRESS%ŠMOVE.W14(A5),FHSUSN(A0)‚USERNUMBER!ŠMOVE.LA3,D5ŽSAVEBUFFERADDRESS:ŠBSR„FNJOBIDŠGOPUTFILENAMEORJOBIDINTOPARAMETERBLOCKŠTST„D7‘GOODRETURN?!ŠBMI.S‚COPYERRŒBRANCHIFNO,ERROR,ŠBSR„GTAAFTGETREMAININGLENGTHANDFILETYPEŠTST„D6‘ANYBUFFERLEFT?!ŠBLE.S‚COPYERRŒBRANCHIFNO,ERRORŠCLR.L‚D0‘CLEARFORCOUNTER)ŠMOVE.LA3,A1ŽSAVECURRENTBUFFERPOINTER9COPY10„MOVE.B(A3)+,D1‹GETABYTE,LOOKINGFOR#OFCOPIESŠCMP.B‚#$30,D1ŒANUMBER?ŠBLT.S‚COPY20BRANCHIFNOŠCMP.B‚#$39,D1ŒANUMBER?ŠBGT.S‚COPY20BRANCHIFNOŠADD.L‚#1,D0ŽCOUNTIT&ŠSUB.L‚#1,D6ŽDECREMENT#OFBYTESLEFTŠBGT.S‚COPY10BRANCHIFMORECOPY20„TST.L‚D0‘ANYCOUNT?!ŠBEQ.S‚COPYERRŒBRANCHIFNO,ERRORŠCMP.L‚#3,D0ŽATLEAST3?%ŠBGT.S‚COPYERRŒBRANCHIFMORE,TOOBIG%ŠSUB.L‚#1,D6ŽGETRIDOFENDCHARACTER.ŠBGT.S‚COPYERRŒBRANCHIFMORECHARSLEFT-ERRORŠBSR„CNVABŽCONVERTTOBINARYŠTST„D7‘GOODCONVERT?ŠBMI.S‚COPYERRŒBRANCHIFNO8ŠMOVE.WD3,FHSOPT(A0)†PUTNUMBEROFCOPIESINPARABLOCKŠTRAPƒ#3‘DOTHECOPIESŠBEQ.S‚COPY30GOODRETURN"ŠBSR„ERRORŽGOOUTPUTERRORMESSAGECOPY30„RTS—RETURN©ERRƒBRA„CMDERRSYNTAXERRORRETURNŠPAGE*$*‚QUEUE‚OUTPUTSPOOLERQUEUEENTRIES*‰COMMANDCODE=$0240*‰SPECIFY–ACTION*‰-------–------*‰NOTHING()’LISTALLENTRIES0*‰FORM('FORM')OUTPUTDEVICENAMESANDFORMSID2*‰DEVICE('#DEV')ŽLISTALLENTRIESFORTHATDEVICE3*‰USERNUMBER(XXXX)‹LISTALLENTRIESFORTHATUSER1*‰SESSION('S')LISTALLENTRIESFORTHATSESSION**‚ENTRY:D2=INTERACTIVEFLAG*ˆD6=COMMANDLINELENGTH*ˆA3=COMMANDLINEADDRESS*ˆA4=BASEADDRESS*‚EXIT:D2=INTERACTIVEFLAG"*‚CALLS:CLRFHS„SETDEVNƒCNVABƒERROR** QUEUE…EQU„*3ŠBSR„CLRFHSCLEARPARABLOCK,RETURNEDADDRESSINA0.ŠMOVE.W#SPLQUE,FHSCMD(A0)SETSPOOLERCOMMANDŠTST.L‚D6‘ANYARGUMENTS?ŠBGT.S‚QUE20ŽBRANCHIFYESKQUC E10…MOVE.LCONS-DATAS(A4),FHSCLG(A0)PASSCONSOLENAMETO.SPLFOROUTPUTŠTRAPƒ#3‘OUTPUTTHEQUEUEŠBEQ.S‚QUE15ŽGOODRETURN"ŠBSR„ERRORŽGOOUTPUTERRORMESSAGEQUE15…RTS—RETURN&QUE20…CMP.B‚#$0D,(A3)ŠCARRIAGERETURN?%ŠBEQ.S‚QUE10ŽBRANCHIFYES,OUTPUT‚ALLŠCMP.B‚#'S',(A3)ŠSFORSESSION?ŠBNE.S‚QUE30ŽBRANCHIFNO*#*‚HEREIFINPUTWAS'S'FORSESSION*%ŠSUB.L‚#1,D6ŽSESSION,DECREMENTLENGTH!ŠCMP.L‚#1,D6ŽSEEIFANYTHINGLEFT!ŠBGT.S‚QUERRŽBRANCHIFMORE,ERROR4ŠMOVE.W#1,FHSOPT(A0)†SETFOROUTPUTSESSIONENTRIESŠBRA„QUE10ŽGODOITQUE30…CMP.B‚#'#',(A3)ŠADEVICE?ŠBNE.S‚QUE40ŽBRANCHIFNO*!*‚HEREIFADEVICENAMEWASINPUT*2ŠBSR„SETDEVNŒADEVICE,GOPUTITINPARAMETERBLOCK#ŠBRA„QUE10ŽGOOUTPUTDEVICEENTRIES"QUE40…CMP.B‚#'F',(A3)ŠFFORFORMS?/ŠBNE.S‚QUE70ŽBRANCHIFNO,GOSEEIFUSERNUMBER*3*‚HEREIF'F'OR'FORM'FOROUTPUTDEVICES-FORMSID*#ŠADD.L‚#1,A3ŽBUMPTONEXTCHARACTERŠSUB.L‚#1,D6ŽDECREMENTLENGTH!ŠBNE.S‚QUE60ŽBRANCHIFMOREBYTES;QUE50…MOVE.L#'FORM',FHSVOL(A0)SETTOOUTPUTFORMS-DEVICESŠBRA„QUE10ŽGODOIT(QUE60…CMP.B‚#$0D,(A3)ŠACARRIAGERETURN?ŠBEQ.S‚QUE50ŽBRANCHIFYES ŠCMP.B‚#'O',(A3)+‰'O'FORFORMS?ŠBNE.S‚QUERRŽBRANCHIFNO,ERRORŠSUB.L‚#1,D6ŽDECREMENTCOUNTŠCMP.B‚#'R',(A3)+‰'R'?ŠBNE.S‚QUERRŽBRANCHIFNO,ERRORŠSUB.L‚#1,D6ŽDECREMENTCOUNTŠCMP.B‚#'M',(A3)+‰'M'?ŠBNE.S‚QUERRŽBRANCHIFNO,ERRORŠSUB.L‚#1,D6ŽDECREMENTCOUNTERŠBLE.S‚QUE50ŽBRANCHIFISFORMS!ŠCMP.B‚#$0D,(A3)ŠCARRIAGERETURN?ŠBEQ.S‚QUE50ŽBRANCHIFYES#ŠCMP.L‚#1,D6ŽMORETHAN1CHARLEFT?"ŠBLE.S‚QUE50ŽBRANCHIFNO,ISFORMS$QUERR…BRA„CMDERRSYNTAXERRORRETURN**‚HEREIFUSERNUMBERINPUT*QUE70…CLR.L‚D0‘CLEARFORUSE!ŠMOVE.LA3,A1ŽSAVEBUFFERADDRESS%QUE80…MOVE.B(A3)+,D1‹GETACHARACTERŠCMP.B‚#$30,D1ŒANUMBER?ŠBLT.S‚QUE90ŽBRANCHIFNOŠCMP.B‚#$39,D1ŒANUMBER?ŠBGT.S‚QUE90ŽBRANCHIFNOŠADD.L‚#1,D0ŽCOUNTITŠSUB.L‚#1,D6ŽDECREMENTCOUNTERŠBGT.S‚QUE80ŽBRANCHIFMOREQUE90…TST„D0‘FOUNDANYNUMBERS?ŠBEQ„QUERRŽBRANCHIFNO,ERRORŠCMP.L‚#4,D0Ž1-4NUMBERS?ŠBGT„QUERRŽBRANCHIFMORE,ERRORŠBSR„CNVABŽCONVERTTOBINARYŠTST„D7‘GOODCONVERT?#ŠBMI„QUERRŽBRANCHIFERRORRETURNED&ŠMOVE.WD3,FHSUSN(A0)†SAVEUSERNUMBER$ŠCMP.L‚#1,D6ŽDONEWITHINPUTBUFFER?*ŠBLE„QUE10ŽBRANCHIFDONE,GODOTHEOUTPUT"ŠBRA„CMDERRERROR,MOREBUFFERLEFTŠPAGE*&*‚PROMPT‚PROMPTFORNEXTINPUTCOMMAND**‚ENTRY:D2=INTERACTIVEFLAG*ˆA4=BASEADDRESS*‚EXIT:D2=INTERACTIVEFLAG*ˆD6=COMMMANDLENGTH *ˆBUF=COMMAND*‚USES:01234567 *…D*ƒP‡R*…A*‡P* PROMPT„EQU„*)ŠLEA„IOSPB(PC),A0‡USEIOSPARAMETERBLOCK,ŠMOVE.W#IOWRIT,IOSFCT(A0)OUTPUTWITHINPUT.ŠMOVE.W#IOPASC+IOPIMG,IOSOPT(A0)OUTPUT=IMAGEŠMOVE.B#LDFLUN,IOSLUN(A0)LUN-ŠLEA„PRMPT(PC),A6‡OUTPUTBUFFERSTARTADDRESS-ŠMOVE.LA6,IOSSAD(A0)†STARTADDRESSOFOUTPUT,ŠLEA„PRMPTE(PC),A6†OUTPUTBUFFERENDADDRESS+ŠMOVE.LA6,IOSEAD(A0)†ENDADDRESSOFOUTPUTŠTRAPƒ#2‘GETTHECOMMANDŠBNE„QUITERRŒERRORRETURNŠMOVE.W#IOREAD,IOSFCT(A0)READ$ŠMOVE.W#IOPFOR,IOSOPT(A0)FORMATTEDŠMOVE.B#CDFLUN,IOSLUN(A0)LUN*ŠLEA„BUF(PC),A6‰INPUTBUFFERSTARTADDRESS0ŠMOVE.LA6,IOSSAD(A0)†INPUTBUFFERSTARTADDRESS)ŠLEA„BUFE(PC),A6ˆINPUTBUFFERENDADDRESS.ŠMOVE.LA6,IOSEAD(A0)†INPUTBUFFERENDADDRESSŠTRAPƒ#2‘READTHEINPUTŠBNE„QUITERRŒERRORRETURN9ŠBSR„SBARG‹GOGETARGUMENTSUBS.ORCONVERTTOUPPERCASEŠBNE„QUITERRŒERRORRETURN.ŠMOVE.LIOSLEN(A0),D6†SAVEINPUTBUFFERLENGTH ŠRTS—RETURNŠPAGE*7*‚QUERY‚OUTPUTSALISTOFVALIDCOMMANDSANDENTRYFORM*‚HELPCOMMAND*‚ENTRY:D2=INTERACTIVEFLAG*ˆA4=BASEADDRESS*‚EXIT:TOCALLER*‚USES:01234567 *…D**P *…A**…Pƒ*** QUERY…EQU„*(ŠMOVE.L#17,D1NUMBEROFLINESTOOUTPUTŠCLR.L‚D0‘CLEARFORUSE6ŠLEA„LNGTBL(PC),A1†GETADDRESSOFMESSAGELENGTHTABLE)ŠLEA„IOSPB(PC),A0‡USEIOSPARAMETERBLOCK ŠMOVE.W#IOWRIT,IOSFCT(A0)WRITE1ŠMOVE.W#IOPASC+IOPFOR,IOSOPT(A0)FORMATTEDASCIIŠMOVE.B#LDFLUN,IOSLUN(A0)LUN.ŠLEA„QURMSG(PC),A6†OUTPUTBUFFERSTARTADDRESS+ŠMOVE.LA6,IOSSAD(A0C )†MESSAGESTARTADDRESS7QUERY20ƒMOVE.LIOSSAD(A0),IOSEAD(A0)SETUPENDADDRESS,ŠMOVE.B(A1)+,D0‹GETLENGTHFORTHISMESSAGE'ŠADD.L‚D0,IOSEAD(A0)†ACTUALENDADDRESSŠTRAPƒ#2‘DOTHEOUTPUTŠBNE„QUITERRŒERRORRETURNŠCLR.L‚D0‘CLEARFORUSEŠSUB.L‚#1,D1ŽDECREMENTCOUNTŠBEQ.S‚QUERY30ŒBRANCHIFDONE:ŠMOVE.LIOSEAD(A0),IOSSAD(A0)SETUPFORNEWSTARTADDRESS)ŠADD.L‚#1,IOSSAD(A0)†ACTUALSTARTADDRESS"ŠBRA„QUERY20ŒGODORESTOFMESSAGEQUERY30ƒRTS—RETURNŠPAGE**‚ERRORHANDLERS*CMDERR„EQU„*’SYNTAXERRORS!ŠLEA„STACK(PC),A7‡RESETTHESTACK4ŠBRA„SPOL30GOOUTPUTCOMMNADLISTANDGETNEWINPUT***ERROR…EQU„*’IOS/FHS/.SPLERRORSK…MOVEM.LD0/A0,EM_PBLK-DATAS(A4)D0ANDA0TOTHEERRORMESSAGEPARA.BLOCK1ŠLEA„EM_PBLK(PC),A0…ERRORMESSAGEPARAMETERBLOCK7ŠMOVE.B#6,EM_TLUN-DATAS(A4)OUTPUTLOGICALUNITNUMBER"ŠMOVE.L#2,D0ŽERRORMESSAGEOUTPUT'ŠTRAPƒ#4‘CALLTHEERRORMESSAGEHANDLERŠRTS—RETURNTOCALLERŠPAGE*&*‚CLRFHS‚CLEARTHEFHSPARAMETERBLOCK!*‚EXIT:A0=PARAMETERBLOCKADDRESS*‚USES:01234567*…D**…AR‡P** CLRFHS„EQU„*)ŠLEA„FHSPB(PC),A0‡PARAMETERBLOCKADDRESS$ŠMOVE.L#FHSNLN/2,D0‡LENGTHINWORDSCLRF10„CLR.W‚(A0)+ŽCLEARITŠSUB.L‚#1,D0ŽDECREMENTCOUNT ŠBNE.S‚CLRF10BRANCHTILCLEARED%ŠLEA„FHSPB(PC),A0‡RESTORETHEADDRESS ŠRTS—RETURN**5*‚SAVFHS‚SAVEFHSPARAMETERBLOCKINTHESCRATCHAREA*‚USES:01234567*…Dƒ* *…A‰P***-SAVFHS„LEA„SCRATCH(PC),A6…GETSCRATCHADDRESS-ŠMOVE.LA0,A5ŽGETFHSPARAMETERBLOCKADDRESS,ŠMOVE.L#FHSNLN/2,D1‡NUMBEROFWORDSTOMOVE/SAVFHS10‚MOVE.W(A5)+,(A6)+ˆSAVEINSCRATCHAREŠSUB.L‚#1,D1ŽDECREMENTCOUNTER$ŠBNE.S‚SAVFHS10‹BRANCHTILMOVEDALL ŠRTS—RETURN**9*‚GETFHS‚RESTOREFHSPARAMETERBLOCKFROMTHESCRATCHARE*‚USES:01234567*…Dƒ* *…A‰P***-GETFHS„LEA„SCRATCH(PC),A5…GETSCRATCHADDRESS-ŠMOVE.LA0,A6ŽGETFHSPARAMETERBLOCKADDRESS,ŠMOVE.L#FHSNLN/2,D1‡NUMBEROFWORDSTOMOVE=GETFHS10‚MOVE.W(A5)+,(A6)+ˆPUTBACKINTOFHSPARAMETERBLOCKŠSUB.L‚#1,D1ŽDECREMENTCOUNT ŠBNE.S‚GETFHS10‹BRANCHTILMOVED ŠRTS—RETURNŠPAGE*0*„INITMSG‚OUTPUTTHEINITIALSTART-UPMESSAGEOF0*DATELASTASSEMBLED,REV.TYPE,ANDREV.NUMBER**„ENTRY:A4=BASEADDRESS*„USES:01234567*‡D‚**‡A‚*‡P INITMSGƒEQU„*-ŠLEA„IOSPB(PC),A0‡IOSPARAMETERBLOCKADDRESS ŠMOVE.W#IOWRIT,IOSFCT(A0)WRITE$ŠMOVE.W#IOPFOR,IOSOPT(A0)FORMATTED ŠMOVE.B#LDFLUN,IOSLUN(A0)LUN61ŠMOVE.LA4,IOSSAD(A0)†OUTOUTBUFFERSTARTADDRESS6ŠMOVE.LA4,IOSEAD(A0)†SET-UPOUTOUTBUFFERENDADDRESSF‰ADD.L#13,IOSEAD(A0)ACTUALENDADDRESS‚0621844-CHANGEDTOREFLECT *ªNEWLENGTHŠTRAPƒ#2‘DOTHEOUTPUTŠBNE„QUITERRŒERRORRETURNŠRTSŠPAGE*0*‚FNJOBID‚FILENAME-JOBIDƒDETERMINEIFAFILENAME'*‹ORAJOBIDHASBEENSPECIFIEDANDPUT"*‹WHICHEVERONEITISINTOTHEFHS*‹PARAMETERBLOCK&*‚ENTRY:A0=FHSPARAMETERBLOCKADDRESS!*ˆA3=ADDRESSOFFILENAMEORJOBID*ˆA4=BASEADDRESS*‚EXIT:D7=0=GOODRETURN*‡D7=-1=ERRORRETURN*‡A0=UNCHANGEDA*‡A3=ADDRESSOFNEXTCHARACTERINCOMMANDBUFFERPASTASEPARATOR*‚USES:01234567*…D**P*…PR*…AP**RPƒ**‚CALLS:EDITFILE‚CNVAB** FNJOBIDƒEQU„* ŠCLR.L‚D7‘HOPEFORAGOODRETURN&ŠMOVE.LD2,-(A7)‹SAVEINTERACTIVEFLAG2ŠMOVE.LA0,A6ŽPARAMETERBLOCKADDRESSFOREDITFILE+ŠMOVE.LA3,A0ŽFILENAMEADDRESSFOREDITFILEŠMOVE.LA3,A1ŽSAVEIT0ŠBSR„EDITFILE‹GOPUTFILENAMEINPARAMETERBLOCKŠTST.L‚D0‘CHECKRETURN%ŠBMI.S‚FNJ10ŽBRANCHIFNOTAFILENAMEŠBTSTƒ#19,D0FILENAMEFOUND?ŠBEQ.S‚FNJ10ŽBRANCHIFNO-ŠMOVE.LA0,A3ŽADJUSTEDCOMMANDBUFFERADDRESS1ŠMOVE.LA6,A0ŽRESTOREFHSPARAMETERBLOCKADDRESS/FNJRTN„MOVE.L(A7)+,D2‹RESTOREINTERACTIVEFLAGŠRTS—RETURNTOCALLER**‚NOTFILENAME-SEEIFJOBID*0FNJ10…MOVE.L#17,D0CLEAROUTTHEPARAMTERBLOCK&ŠMOVE.WFHSUSN(A6),D1†SAVEUSERNUMBER*ŠADD.L‚#FHSVOL,A6‰STARTINGATVOLUMEFIELDFNJ20…CLR.W‚(A6)+ŽCLEARITŠSUB.L‚#1,D0ŽDECREMENTCOUNTŠBNE.S‚FNJ20ŽBRANCHTILCLEARED)ŠMOVE.WD1,FD HSUSN(A6)†RESTOREUSERNUMBER,ŠLEA„FHSPB(PC),A0‡RESTOREPARABLOCKADDRESS,ŠMOVE.LA1,A3ŽRESTORECOMMANDBUFFERADDRESS1ŠCMP.B‚#5,D6ŽMUSTHAVEATLEAST5CHARACTERSLEFT"ŠBLT.S‚FNJERRBRANCHIFLESS,ERRORŠCLR.L‚D0‘COUNTER%FNJ30…MOVE.B(A3)+,D1‹GETACHARACTERŠCMP.B‚#$30,D1ŒANUMBER?ŠBLT.S‚FNJ40ŽBRANCHIFNOŠCMP.B‚#$39,D1ŒANUMBER?ŠBGT.S‚FNJ40ŽBRANCHIFNOŠADD.L‚#1,D0Ž0-9,COUNTITŠCMP.L‚D0,D6ŽPASTENDOFINPUT?ŠBGT.S‚FNJ30ŽBRANCHIFNOTPASTFNJ40…TST„D0‘GOTANYNUMBERS ŠBEQ.S‚FNJERRBRANCHIFNO,ERRORŠCMP.L‚#5,D0ŽMUSTBEATLEAST5"ŠBLT.S‚FNJERRBRANCHIFLESS,ERRERŠCMP.L‚#8,D0ŽSEEIFMORETHAN8%ŠBGT.S‚FNJERRBRANCHIFGREATER,ERROR)ŠSUB.L‚#4,D0ŽSUBTRACTOUT4FOROCCURENCE#ŠMOVE.LA1,D1ŽRESTORESTARTADDRESS'ŠADD.L‚D0,D1ŽSTARTADDRESSOFOCCURENCEŠMOVE.LD1,A2ŽSAVEIT*3*‚D0=#CHARSINUSERNUMBERPARTOFJOBIDA1=ADDRESS(*‚4=#CHARSINOCCURENCEPARTA2=ADDRESS*(ŠBSR„CNVABŽCONVERTUSERNUMBERTOBINARY)ŠMOVE.WD3,FHSSIZ(A0)†PUTINTOPARABLOCK+ŠMOVE.LA2,A1ŽGETADDRESSOFOCCURENCEPARTŠMOVE.L#4,D0ŽCOUNTŠBSR„CNVABŽCONVERTTOBINARYŠMOVE.WD3,FHSSIZ+2(A0)„SAVEITŠBRA„FNJRTNGORETURN%FNJERR„MOVE.L#-1,D7SETERRORRETURNŠBRA„FNJRTNGORETURNŠPAGE*!*‚GTAAFT‚GETADDRESSANDFILETYPE*!*‚ENTRY:A0=PARAMTERBLOCKADDRESS#*ˆD5=INITIALCOMMANDBUFFERADDRESS#*ˆA3=CURRENTCOMMANDBUFFERADDRESS*ˆA4=BASEADDRESS*ˆD6=BUFFERLENGTH*ˆD0=STATUSBITSFROMEDITFILE*‚EXIT:D6=NEWBUFFERLENGTH*‡D7=0=SPOOLERFILEORJOBID*‡D7=-1=NON-SPOOLERFILE*‚ERROREXIT:CMDERR*‚USES:01234567 *…DP*‡PRR *…AP…PP*** GTAAFT„EQU„*)ŠCLR.L‚D7‘SETUPFORSPOOLER-JOBIDRETURN*ŠMOVE.LA3,D1ŽGETNEWCOMMANDLINEADDRESS)ŠSUB.L‚D5,D1ŽSEEHOWMANYCHARACTERSUSED ŠSUB.L‚#1,D1ŽBUMPPASTSEPARATOR#ŠSUB.L‚D1,D6Ž#CHARACTERSREMAININGŠBLT„CMDERRERRORRETURN#ŠTST.L‚FHSSIZ(A0)‰JOBIDSPECIFIED?ŠBEQ.S‚GTAAFT10‹BRANCHIFNOGTARTN„RTS—RETURN1GTAAFT10‚CMP.B‚#SPOOLF,FHSFIL(A0)ASPOOLERFILE? ŠBEQ„GTARTNBRANCHIFYES-RETURN*-*‚NON-SPOOLERFILENAME,SETVOLUMEANDCATALOG*ŠMOVE.L#-1,D7SETRETURNCODE3ŠLEA„SAVREG(PC),A5†GETADDRESSOFINITIALREGISTERSŠTST.L‚6(A0)ŽNULLVOLUME?ŠBNE.S‚GTAAFT20‹BRANCHIFNO+ŠMOVE.L8(A5),FHSVOL(A0)ƒUSEDEFAULTVOLUME"GTAAFT20‚BTSTƒ#20,D0NULLCATALOG?ŠBNE.S‚GTAAFT30‹BRANCHIFNO-ŠMOVE.L16(A5),FHSCLG(A0)‚USEDEFAULTCATALOG+ŠMOVE.L20(A5),FHSCLG+4(A0)RESTOFCATALOG#GTAAFT30‚BTSTƒ#19,D0NULLFILENAME?ŠBEQ„CMDERRBRANCHIFYES,ERRORŠBTSTƒ#18,D0NULLEXTENSION?ŠBNE„GTARTNBRANCHIFNO,DONE.ŠMOVE.W#'SA',FHSEXT(A0)ƒSETDEFAULTEXTENSIONŠBRA„GTARTNGORETURNŠPAGE*.*‚SETDEVN‚SETDEVICENAMEINTOPARAMETERBLOCK*&*‚ENTRY:A0=FHSPARAMETERBLOCKADDRESS*ˆA3=COMMANDBUFFERADDRESS*ˆA4=BASEADDRESS*ˆD2=INTERACTIVEFLAG*‚EXIT:A0=UNCHANGED=*‡A3=COMMANDBUFFERADDRESS,UPDATEDPASTDEVICEANDSEPARATOR*‡D2=UNCHANGED*‚USES:01234567*…D*ƒP *…AP…RPƒ**‚CALLS:EDITFILE*‚ERROREXIR:CMDERR** SETDEVNƒEQU„*&ŠMOVE.LD2,-(A7)‹SAVEINTERACTIVEFLAG!ŠMOVE.LA0,A6ŽSAVEPARABLOCKADR ŠMOVE.LA3,A0ŽADROFDEVICENAME$ŠBSR„EDITFILE‹GOPUTINTOPARABLOCKŠMOVE.L(A7)+,D2‹RESTOREFLAGŠTST.L‚D0‘CHECKRETURNŠBMI„CMDERRERRORRETURNŠBTSTƒ#1,D0ŽDEVICENAMEFOUND?ŠBEQ„CMDERRBRANCHIFNO,ERROR"ŠMOVE.LA0,A3ŽRESTORENEXTADDRESS(ŠMOVE.LA6,A0ŽRESTOREPARABLOCKADDRESS ŠRTS—RETURNŠPAGE**‚CNVAB‚CONVERTASCIITOBINARY*"*‚ENTRY:D0=#CHARACTERSTOCONVERT(*ˆA1=STARTADDRESSOFNUMBERSTOCONVERT*ˆA4=BASEADDRESS*‚EXIT:D7=0=GOODRETURN*‡D7=-7=ERRORRETURN*‡D3=CONVERTEDVALUE*‚USES:01234567 *…D**ƒR*…R*…Aƒ*…P** CNVAB…EQU„* ŠCLR.L‚D7‘HOPEFOEAGOODRETURNŠCLR.L‚D3‘CLEARRETURNEDVALUE"CNVAB10ƒMOVE.B(A1)+,D1‹GETABYTEŠCMP.B‚#$30,D1ŒANUMBER?"ŠBLT.S‚CNVABERR‹BRANCHIFNO,ERRORŠCMP.B‚#$39,D1ŒANUMBER?"ŠBGT.S‚CNVABERR‹BRANCHIFNO,ERRORŠASL.L‚#1,D3ŽMULTIPLYBY10ŠMOVE.LD3,D4ŽSAVEITŠASL.L‚#2,D3ŽMULTIILPYBY100ŠADD.L‚D4,D3ŽADDINORIGINALŠAND.LD ‚#$F,D1STRIPASCIIŠADD.L‚D1,D3ŽADDTORESULTŠSUB.L‚#1,D0ŽDECREMENTCOUNTERŠBNE.S‚CNVAB10ŒBRANCHTILDONE ŠRTS—RETURN%CNVABERR‚MOVE.L#-1,D7SETERRORCODEŠ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ƒ=ARGSRCCOM.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ƒ=ARGSRCCOM.LS=/ENDIF=/*#=PASCAL SRCCOM.SA,SRCCOM.PE C,\1;Z=80=POPTIM SRCCOM.PC=PASCAL2 SRCCOM.PO=/*=ENDéééééé—G{---------------------------------------------------------------------}{Å}{’SOURCEƒCOMPARE˜}{Å}6{†Thisprogramcomparessourcefiles,outputtingthe}9{†differences.‚Thecompareisdonelinebylineuntil2‰}:{†linesdonotmatch.‚Atthispoint,bothfilesarereadˆ}?{†untilagroupof'equal_lines'linesisfoundwhichmatches„}7{†betweenthetwofiles.‚Whenthematchisfound,the‹}={†differinglines(includingthefirstlineofthegroupof†}4{†matchinglines)areprinted.‚ThecomparisonthenŽ}{†continues.µ}{Å} {‚Touse:¼}A{„=SRCCOM‚,[,][;]ƒ}7{ˆwhere:‚andmustexistand‰}"{“defaulttoextension.SAtype.”}7{isoptional.‚Ifnotspecified,output}1{“defaultstotheuser'sterminal.‚Devicecodes„}4{“(#,#CN00,#PR)orfilenames(defaultextension‚}{“.SAtype)areaccepted.›}{areasfollows:œ}2{“M=nnn‚setmatchinglinescountto"nnn"lines.ƒ}!{œ(defaultis3;-Misinvalid)Œ};{…-notimple-ƒW†ignoreblanks(whitespace)forcompares.‚},{“Y†overwriteexistingoutputfile,ifany…}{œ(defaultis-Y)š}4{“Z=nnn‚increasestack/heapsizeto"nnn"Kbytes.}{œ(defaultis20K)™}{Å}E{‚NOTE:ToimplementWoption,itissuggestedtopackthelinesas‚}={ˆreadbycompressingspacesintoa'spacecount'charsuch„}<{ˆasMDOSdid.If-W,thencompareasusual.IfW,dobyte…}<{ˆcomparesuchthat'spacecount'charsalwaysmatch.Must…}8{ˆunpackthelinespriortoprinting.Thismethodisa‰}={ˆcompromiseovertime(packingforeachcompare)vsmemory„}2{ˆ(savingpacked&unpackedsource).†-PSGilmourŠ}{Å}G{---------------------------------------------------------------------}.{By:‚PeterS.GilmourˆDate:‚31January1985‘}A{ƒ1.Changedtostd.VERSAdosutilityformatforoutputfileas…}{†the3rdcmdlineparameter.¤}A{ƒ2.Addedfilecheckingtoinsurethatthe1sttwofilesexist…}E  +©b±v¹fÁaÉ(9{†andthe3rdonedoesn't(asksfordeletepermission).Š}A{ƒ3.ChangeddefaultZsizeto20K(about70linesdifference).…}{ƒ4.AddedMandYoptions.©}{Å}{Å}{Å}G{---------------------------------------------------------------------}+{By:‚JohnR.KoehringˆDate:‚27June1980”}G{---------------------------------------------------------------------}  :PROGRAM source_compare (input,output,file1,file2,outfile); ƒCONST(†version…='0131854';ˆ{versionIDcode}†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']OFinteger;†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(varf:text):ˆfilename;ƒFORWARD; ƒFUNCTION0†p$lookup(varf:filename):ƒfilestatus;FORWARD; ƒFUNCTION†p$comline:“comline;„FORWARD; ƒPROCEDURE$†p$options(varf:options);FORWARD; ƒPROCEDURE†p$force(varf:text);”FORWARD; ƒPROCEDURE#†p$setdiag(val:integer);FORWARD; ƒPROCEDURE$†p$swpfil(varf1,f2:text);‘FORWARD; ƒ{$A=2-Do2-bytearithmetic})ƒ{$H=20480-Setdefaultstack/heapsize} ƒPROCEDUREget_lins; †VAR‰cur_line:ƒline; †PROCEDUREget_lin‚(VAR‚f:…text;šVAR‚eofl:‚boolean;šVAR‚lin:ƒline); ‰BEGIN{get_lin} Œlin‚:='';Œeofl:=eof(f);ŒIFNOTeoflTHENBEGIN’readln(f,lin);#’IFlength(lin)=0THEN‚lin‚:='' END{THEN}‰END;{get_lin}  †PROCEDUREput_line(…lin:ƒline;šVAR‚tail:‚link); ‰VAR Œpnt:‚link; ‰BEGIN{put_line}ŒIFavl_head=NILTHEN‚new(pnt) ELSE‚BEGIN˜pntˆ:=avl_head;˜avl_headƒ:=avl_head^.next •END;{ELSE} ŒWITHpnt^DOBEGIN’number:=tail^.number+1;’lngth‚:=length(lin); ’dataƒ:=lin; ’nextƒ:=NIL; END;{WITH} Œtail^.next‚:=pnt; Œtailˆ:=pnt‰END;{put_line} †BEGIN{get_lins} ‰IFNOTeof1ŒTHENBEGIN’get_lin(file1,eof1,cur_line);’put_line(cur_line,tail1);’count1‚:=count1+1;6’IFcount1>equal_linesTHEN‚middle1‚:=middle1^.next END;{THEN} ‰IFNOTeof2ŒTHENBEGIN’get_lin(file2,eof2,cur_line);’put_line(cur_line,tail2);’count2‚:=count2+1;6’IFcount2>equal_linesTHEN‚middle2‚:=middle2^.next END{THEN}†END;{get_lins}  1ƒFUNCTIONcheck_fname(fname:filename):ƒboolean; †VAR‰i,pc:‰integer;‰null_name:„boolean; †BEGIN{check_fname}‰null_name:=false;‰IFfname[1]<>'#'THENŒBEGINi‚:=1; pc:=0;REPEAT’IFfname[i]='.'THEN•pc‚:=pc+1; •iƒ:=i+1;UNTILpc=2;IFfname[i]='&'THEN’null_name:=true;ŒEND;‰check_fname:=null_name;†END;{check_fname}  -ƒFUNCTIONcmp_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}  ƒFUNCTIONcmp_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)ANDNOTequalDOBEGIN’start2:=begin2; '’WHILE(start2<>NIL)ANDNOTequalDO•BEGIN˜equal_count:=0;˜stop1:=start1;˜stop2:=start2; ˜REPEAT›IFcmp_lin(stop1,stop2)žTHEN¡BEGIN¤IFstop1^.lngth=0 §THENequal_count:=equal_lines%§ELSEequal_count:=equal_count+1;"¤done:=equal_count=equal_lines ¡END{THEN}žELSE¡done:=true; ›IFNOTdonežTHEN¡BEGIN¤stop1:=stop1^.next;¤stop2:=stop2^.next ¡END{THEN}.˜UNTIL(stop1=NIL)OR(stop2=NIL)ORdone; $˜equal:=equal_count=equal_lines; ˜IFNOTequal›THENstart2:=start2^.next •END;{WHILE} ’IFNOTequal•THENstart1:=start1^.next END{WHILE}‰END;{compare} †BEGIN{cmp_lins}‰compare(middle1,head2^.next);1‰IFNOTequalTHEN‚compare(head1^.next,middle2);‰cmp_lins‚:=equal†END;{cmp_lins}  3ƒPROCEDUREwrite_differences(equal1,equal2:‚link);  7†PROCEDUREwrt_lins(head,tail:link;‚file_char:char); ‰BEGIN{wrt_lins}ŒREPEAThead:=head^.next;IFhead^.lngth>0THEN6’writeln(outfile,head^.number:5,file_char,head^.data)ŒUNTILhead=tail‰END;{wrt_lins}  †BEGIN{write_differences}6‰IF(equal1<>head1^.next)OR(equal2<>head2^.next)ŒTHENBEGIN’writeln(outfile,separator);#’wrt_lins(head1,equal1,file1char);’writeln(outfile,separator);#’wrt_lins(head2,equal2,file2char);’writeln(outfile,separator); END{THEN}†END;{write_differences}  -ƒPROCEDUREfree(VARhead:link;‚tail:link); †VAR ‰old:‚link; †BEGIN{free}‰WHILEhead<>tailDOŒBEGIN oldˆ:=head;head‡:=head^.next;old^.next‚:=avl_head;avl_headƒ:=old ŒEND{WHILE} †END;{free}  ƒPROCEDUREinitialize; †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('SourceCompare:‚',version);†{printutilityIDstamp}†error:=false;†cmdline:=p$comline;†p$options(opts);†equal_lines:=3;†FORc:='A'TO'Z'DO‰IFopts[c]<>0THENŒBEGINi:=opts[c]; CASEcOF1’'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;&žUNTILNOT(cmdline[i]IN['0'..'9']);žIFval<=0THEN¡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); †IFerror=trueTHEN‰BEGIN4Œwriteln(output,'Invalidoptionfield!',chr(bell));Œp$setdiag(16#8004);Œgotofinished;‰END; †nullƒ:=check_fname(fname1);†IFnull=trueTHEN‰BEGIN4Œwriteln(output,'File#1namemissing!',chr(bell));Œp$setdiag(16#8001);Œgotofinished;‰END; †nullƒ:=check_fname(fname2);†IFnull=trueTHEN‰BEGIN4Œwriteln(output,'File#2namemissing!',chr(bell));Œp$setdiag(16#8002);Œgotofinished;‰END; †nullƒ:=check_fname(outname);†IFnull=trueTHENŒoutname:='#'‰ELSEŒBEGINstatus:=p$lookup(outname);.IF(status=found)AND(opts['Y']<=0)THEN’BEGIN'•write(output,'Outputfile(',outname,'˜')alreadyexists!‚Overwrite(Y/N)?', ˜chr(bell));•p$force(output);•readln(answer);,•IF(answer<>'Y')AND(answer<>'y')THEN˜BEGIN›p$setdiag(16#8003);›gotofinished;˜END’ENDŒEND; †rewrite(outfile,outname); 2†IF(outname[1]='#')AND(outname[2]='')THEN‰p$swpfil(output,outfile); †status:=p$lookup(fname1);†IFstatus<>foundTHEN‰BEGINCŒwriteln(output,'File#1(',fname1,')doesnotexist!',chr(bell));Œp$setdiag(16#8001);ŒgotoF finished;‰END; †status:=p$lookup(fname2);†IFstatus<>foundTHEN‰BEGINCŒwriteln(output,'File#2(',fname2,')doesnotexist!',chr(bell));Œp$setdiag(16#8002);Œgotofinished;‰END; 9†initialize;‚{resettoget&print1stlineofeachfile}<†fname1‚:=p$fname(file1);‡{getfullfilenamesforlistings}†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;‚{resettostartactualcomparison}†stop1:=head1;†stop2:=head2; †REPEAT ‰count1‚:=0; ‰count2‚:=0; ‰get_lins;‰stop1:=stop1^.next;‰stop2:=stop2^.next;"‰IFNOTcmp_lin(stop1,stop2)THENŒBEGIN count1ƒ:=1; count2ƒ:=1; middle1‚:=stop1;middle2‚:=stop2; REPEAT ’get_linsUNTILcmp_lins; "write_differences(start1,start2) ŒEND;{THEN}‰free(head1,stop1);‰free(head2,stop2)†UNTILeof1ANDeof2; 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ƒ=ARGSYMBUG.LS=/ENDIF=/*(=ASM SYMBUG.SA,SYMBUG.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;Y=/*4=ASM SYMBUG.SIMBO.SA,SYMBUG.SIMBO.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;A=/*2=ASM SYMBUG.IODB.SA,SYMBUG.IODB.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;A=/*.=ASM SYMBUG.MM.SA,SYMBUG.MM.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;A=/*2=ASM SYMBUG.MBSR.SA,SYMBUG.MBSR.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;A=/*6=PASCAL SYMBUG.SYMSUBII.SA,SYMBUG.SYMSUBII.PC,TEMP1.LS=/*{ Included files are:=/*ƒ--none--=/*}=/*.ƒ=POPTIMSYMBUG.SYMSUBII.PC,SYMBUG.SYMSUBII.PO4ƒ=PASCAL2SYMBUG.SYMSUBII.PO,SYMBUG.SYMSUBII.RO;Z=50ƒ=COPYTEMP1.LS,TEMP2.LS;A=/*8=ASM SYMBUG.UTILITY.SA,SYMBUG.UTILITY.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;A=/*8=ASM SYMBUG.CODE68K.SA,SYMBUG.CODE68K.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;A=/*:=ASM SYMBUG.DCODE68K.SA,SYMBUG.DCODE68K.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;A=/*8=ASM SYMBUG.ERRMSGS.SA,SYMBUG.ERRMSGS.RO,TEMP1.LS;RZ=130=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;Aƒ=COPYTEMP2.LS,\1;Yƒ=DELTEMP1.LSG ƒ=DELTEMP2.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ƒ=ARGSYMBUG.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‡MultitaskingSymbolicDebugger*F*‚SYMBUG:ƒEXCEPTIONMONITORTASK(MULTI-TASKVERSION-MAX.19TASKS)**ˆSYMBUGMODIFICATIONHISTORY**ˆREVISIONCODE‡0218854:*’PROCESSORTYPECODESWEREINCORRECT(68000/68008/68010).**’THESEWERECHANGEDTO68000/68010/68020.*5*’INCORRECTERRORMESSAGEWHENMEMORYWASUNAVAILABLE$*’ONAGTASQCALL(D0=8)ATIN.TASK.*7*’SYMBUGGINGATASKWITHANEXCEPTIONVIOLATIONASSUMED9*’THATABREAKPOINTHADBEENTHERE,ANDIFTHEREWEREN'T,5*’SYMBUGWOULDTRAPLOOKINGFORANENTRY.‚CHANGEDTHE4*’NOTRACEROUTINETOSEEIFANYBREAKPOINTSHADBEEN6*’ENTEREDBEFORESEARCHINGATABLEWITHNOTHINGINIT.*éé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*ˆREVISIONCODE‡01258547*’CHANGEDPARAMETERBLOCKFORLOADERSOTHATATTRIBUTES*’ARETAKENFROMTHETASKLIB.**ˆREVISIONCODE‡01168548*’ChangedDCODE68KtooutputthedisplacementofaMOVEP*’instructionindecimal.**ˆREVISIONCODE‡01048548*’CHANGEDASQMESSAGEEVENTSIZEFROM12TO24SOASNOT2*’TOOVERWRITEPARTOF"PRINTFHS"PARAMETERBLOCK.**ˆREVISIONCODE‡11148446*’UPGRADE1-LINEASSEMBLER/DISASSEMBLERTOHANDLELOAD"*’MODULESFORTHE68010PROCESSOR.* ‰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ˆREQUIREDBYEDITFILE0‰XDEF†.PLJSR,.PALSTS,.PALSTSLƒREQUIREDBYPASCAL%‰XDEF†PROMPT,WHAT‰REQUIREDBYMM3/82*‰XDEF†KEYIN,DO7OUTR,ERLL,MSG00,MSGADR“3/82#‰XDEF†ADRELOŽREQUIREDBYMBSRŽ11/83 *Â<<111484*’DATALOCATIONS†REQUIREDBY*‰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†CURTCNTSIMBO‰XDEF†DMOUTAŽ-†-…MM‰XDEF†EOL_FLG-†-…-ƒMBSR‰XDEF†ERR_NMBRŒ-†-…MM‚MBSR‰XDEF†FHSDB0ŽSIMBO‰XDEF†FHSDB1ŽSIMBO‰XDEF†FHSOPENSIMBO‚IODB‰XDEF†FORTASKSIMBO‚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†IOUTSIMBO‚-…-ƒ-…UTILITY‰XDEF†MODNAMESIMBO‰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_MDSIMBO‚-…-ƒMBSR‰XDEF†PTR_INP-†-…-ƒMBSR‰XDEF†RCVADDRSIMBO‰XDEF†RCVBLKŽSIMBO‰XDEF†RCVBUFŽSIMBO‰XDEF†RCVSEGŽSIMBO‰XDEF†REVISIONŒSIMBO‰XDEF†SEGADDR-†IODB‰XDEF†SEGENDŽSIMBO‰XDEF†SYM_BUF-†-…MM ‰XDEF†SYMNAMESIMBO‚IODB‚MM‚MBSR‰XDEF†TOKEN-†-…MM‰XDEF†UTLWORD-†-…MM**ˆIOS&TR1EQUATES* 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 *ˆDATAAREAS* ‰SECTIONƒ0/BˆEQU‡*‰USEA6FORSOURCEFIELDDATAADDRESSING:‰DC.B†'0116854'ƒUTILITYCONTROLDATE&VERSAdosRELEASE#*$*ˆVERSAdos‚CONTROLBLOCKSBEGINHERE* STOPTASK:!‰DC.L†0,0‡*TASKNAMEANDSESSION STARTTSK: ‰DC.L†0,0-‰DC.W†$A000…*MONITORTASKANDREGSSPECIFIED‰DC.L†0,0‡*MONITORTASK=MBUG=TASKREGSDS.L†16ˆREGSAVEAREAISPARTOFSTARTTSKPARMBLOCKDREG6„EQU‡TASKREGS+$18**ˆLOADERPARAMETERBLOCK*TASKLDR‚DC.L†'TASK'„*TASKNAME8SESSION‚DC.L†0‰*STANDARDSESSIONID(ALLTASKS&EXMON)/‰DC.W†$8000…*CRTCBOPTIONS-MONITORSPECIFIED)‰DC.L†0,0‡*MONITORTASKNAMEANDSESSION)‰DC.B†50,100„*INITIALANDFINALPRIORITY‰DC.W†0‰*TASKATTRIBUTES‰DC.L†0‰*TASKENTRYADDRESS‰DC.W†0‰*USERIDDLOADOPT‚DC.W†$600E…*USELIBFORTASKINFO&ATTRS(CHGDBIT6)1/85$LOADCLL‚DC.B†0‰*COMMANDLINELENGTH‰DC.B†0‰*LUNOFLOADFILE‰DC.L†0,0‡*RESERVED%LOADCLA‚DC.L†0‰*COMMANDLINEADDRESS*J* FHS PARAMETER BLOCK BEGINS - DO NOT SEPARATE THIS FROM ABOVE DEFINITIONS*FHSTASK:‰DC.B†0‰*CODE‰DC.B†0‰*COMMAND=CHECKPOINT*‰DC.W†0‰*OPTIONS:CONTIGUOUS,PUBLICREAD‰DC.B†$FF‡*STATUS ‰DC.B†0‰*LUNLDVOL$L‚EQU‡*-TASKLDR‰DC.L†0LDUID$W‚EQU‡*-TASKLDR‰DC.W†0‰*USERNUMBERLDCAT$L‚EQU‡*-TASKLDR‰DC.L†0,0‡*CATALOGFILENAMEDC.L†0,0‡*FILENAMEEXTENTƒDC.W†'LO'‰*EXTENSION‰DC.W†0‰*RESERVED‰DC.B†0,0‡*PROTECTCODES‰DC.W†0‰*RECORDLENGTH‰DC.L†0‰*SIZE/POINTER**ˆGETASQPARAMETERBLOCK*"ASQB…EQU‚*‹GETASQPARAMETERBLOCK ‰DC.L‚0…TASK‰DC.L‚0ŠSESSION.‰DC.B‚5ŠSTATUS‚ASQ-MESSAGEENABLED-ASRENABLED"‰DC.B‚24‰MAXMESSAGELENGTH…010485‰DC.L‚120ˆ10MESSAGESMAX6ASQASRV‚DC.L‚0ŠASRSERVICEROUTINEVECTOR‚(EXASR)ˆ1/82‰DC.L‚0*(*ˆATTACHTARGETTASKTOEXMONPARMBLOCK*)EXMONBƒEQUƒ*†ATTACHEXMONPARAMETERBLOCK‰DC.L‚'„'†TARGETTASKNAME‰DC.L‚0‹SESSION)EXMONAMEDC.L‚0‡NAMEOFEXCEPTIONMONITOR‰DC.L‚0ŠSESSION*$*ˆEXMONMASKMODIFICATIONPARMééééééééH ééééééééééééééééI ééééééééééééééééI ééééééééééééééééJ ééééééééééééééééJ ééééééééééééééééK ééééééééééééééééK ééééééééééééééééL ééééééééééééééééL ééééééééééééééééM ééééééééééééééééM ééééééééééééééééN ééééééééééééééééN ééééééééééééééééO ééééééééééééééééO éééééééééééééééé