IMD 1.17: 11/11/2014 11:55:55 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 24 OF 30  SR24q82VKXSVRDOS 0420§m-FDMNBLKƒDS.BƒFDMNBLNŒbereturnedbytheFetchDeviceMnemonics*£call. ** Miscellaneous equates*7INPUTLUƒEQU„1”Thislogicalunitnumberisusedfordisk *£deviceI/O. 2LGOUTLUƒEQU„6”Thislogicalunitnumberisusedfor**£messageoutputtothelogoutputdevice. :NOUTFLDƒEQU„$40Valuereturnedinbits8-31ofD0byPARSE+*£whentheoutputfieldofthecommandline *£isblank. *5* Messages that can be output by the DISMOUNT utility* 'VERMSG„DC.Wƒ'DISMOUNTVersion1220844'VERMSGEƒEQU„*-1ŠPAGE*0*‚ErrorMessageHandlerrequestparameterblock.*4EMHBLK„EQU„*’ErrorMessageHandlerrequestparameter)*£blockequates(notcontainedinIOE.SA) .EMHKEY„DC.Lƒ0”KeyreturnedinD0bytheserver 7EMHPBA„DC.Lƒ0”Addressofserverrequestparameterblock ŠDC.Bƒ0”Reserved 5EMHLUN„DC.Bƒ0”LUNtowhichtheerrormessageistobe *¥output.ŠDC.Wƒ0&EMHPPSAƒDC.Lƒ0”Plugpoolstartaddress $EMHPPEAƒDC.Lƒ0”Plugpoolendaddress 9EMHBLN„EQU„*-EMHBLKErrorMessageHandlerParameterBlock *£length.9ŠTTLVERSAdosDismountUtilityVer.4.00(Main-linecode)ŠPAGE ŠSECTION‚1ŠXREFƒEDITFILE ŠXREFƒPARSE  *DISMOUNT‚EQU„*’Entrypointfortheutility 1ŠLEA.L‚STACK(PC),A7‰Initializethestackpointer.ŠSPC„2;ŠLEA.L‚VERMSG(PC),A5ˆSendtheutilitysignonmessagetothe(ŠLEA.L‚VERMSGE(PC),A6…logoutputdevice. ŠBSR.L‚MSGOUTŠSPC„23ŠTST.L‚D6“Iftheinputfieldofthecommandlineis6ŠBNE„DMT010null,giveacommandlinesyntaxerrorand*£exit.ŠSPC„2ADMTCLE„MOVE.L#EM_CLSE,D0ŠSendacommandlinesyntaxerrortothe/ŠBRA.L‚EXITERRŒlogoutputdeviceandterminate.ŠSPC„2EDMT010„LEA.L‚COMAND(PC),A0‡Savethecommandlinestartaddressonthe<ŠMOVE.LA0,-(A7)‹stackandcallPARSEtoanalysethecommandŠBSR„PARSEŽline.ŠSPC„23ŠMOVE.LD0,D1Checkthattherearenoerrorsinthe7ŠLSR.L‚#8,D0Žcommandline,theinputfieldisnotnull,<ŠCMP.L‚#NOUTFLD,D0ˆandthattheoutputfieldisnull.Ifone5ŠBNE.S‚DMTCLEoftheseconditionsisnotmet,issuea*£commandlinesyntaxerror.ŠSPC„24ŠLSL.B‚#2,D1Iftheoptionsfieldisnotnull,issue$ŠBCS„DMT015aninvalidoptionerror.ŠSPC„2;DMTOPTEƒMOVE.L#EM_NVO,D0‹Outputainvalidoptionserrorto .ŠBRA.L‚EXITERRŒthelogoutputdeviceandexit.ŠSPC„2ADMT015„LEA.L‚FHSBLK(PC),A6ˆRestorethecommandlinestartaddress4ŠMOVE.L(A7)+,A0‹fromthestackandcallEDITFILEto&ŠBSR„EDITFILE‹analysetheinputfield.ŠSPC„28ŠBTST.L#22,D0Ifadevicemnemonicwasfoundandplaced7ŠBEQ„DMTCLEintheFHSparameterblockproceedwiththe-*£deviceassignment.Ifanerrorwasdetected$*£issueacommandlinesyntaxerror.ŠPAGE5ŠMOVE.LA6,A0Savethedevicemnemonicorvolumename=ŠMOVE.LFHSVOL(A0),D1†passedontheinvokingcommandlineandCŠMOVE.W#FHFDMN,FHSCMD(A0)initializetheFHSparameterblockfora*£FetchDeviceMnemonicscall.ŠSPC„2:ŠLEA.L‚FDMNBLK(PC),A2ˆSetuptheaddressandlengthofthe>ŠMOVE.LA2,FHSPTR(A0)‡bufferwherethedeviceinformationwillBŠMOVE.L#FDMNBLN,FHSLEN(A0)bereturnedandissuethecallforall?ŠMOVE.W#FOPFRA,FHSOPT(A0)‚randomaccessdevicemnemonics.This1ŠTRAPƒ#3’requestshouldneverresultinanerror.ŠBNE.L‚EXITERRŠSPC„2CŠMOVE.B#INPUTLU,FHSLUN(A0)‚InitializetheFHSparameterblock.The4ŠMOVE.L#'„',D0‰devicewillbeassignedtotheinputAŠMOVE.LD0,FHSCLG(A0)†logicalunitnumber.Thecatalog,filename,?ŠMOVE.LD0,FHSCLG+4(A0)„andextensionfieldsareinitializedto?ŠMOVE.LD0,FHSFIL(A0)†blanksasrequiredfordeviceassignment.ŠMOVE.LD0,FHSFIL+4(A0)ŠMOVE.WD0,FHSEXT(A0)ŠSPC„2?ŠMOVE.WFHSLEN(A0),D2ˆInitializeD2.Wtotheoffsetofthelast,ŠMULUƒ#FDVLEN,D2‰deviceentryinthebuffer.ŠSPC„2GDMT020„CMP.L‚FDVDEV(A2,D2.W),D1ƒIftheIDpassedonthecommandlineis4ŠBEQ„DMT030thedevicemnemonicofthecurrenttable*£entry,exitthesearchloop.ŠSPC„2AŠCMP.L‚FDVVOL(A2,D2.W),D1ƒIftheIDpassedonthecommandlineis7ŠBEQ„DMT030thevolumenameofthecurrenttableentry,*£exitthesearchloop.ŠSPC„2:ŠSUB.W‚#FDVLEN,D2‹Sincenomatchwasfoundforthecurrent3ŠBPL„DMT020entry,updatetheindexregistertothe(*£nextpreviousentryandrepeatuntila)*£matchisfoundorallentrieshavebeen *£checked.ŠSPC„2>ŠMOVE.LD1,FHSVOL(A0)ˆIfnomatchingdevicemnemonicorvolume1ŠBRA„DMT040namewasfound,attempttoassignthe)*£deviceasspecifiedonthecommandline*£andletanerroroccur.ŠSPC„2HDMT030„MOVE.LFDVVOL(A2,D2.W),D1ƒTestthevolumenamefieldoftheentry3ŠBEQ„DMT035containingthematchingdevicemnemonic**£orvolumename.Ifthevolumenamefield'*£iszero,FMSdoesnothavethedevice(*£assignedsoskipthevolumeassignment*£step.ŠPAGE>ŠMOVE.W#FHASGN,FHSCMD(A0)„Makeanexclusiveread/writevolumeDŠMOVE.W#FOPEREW,FHSOPT(A0)assignmentusingthevolumename.Ifthe>ŠMOVE.LD1,FHSVOL(A0)†requestisrejected,thediskisassumed0ŠTRAPƒ#3‘tobeinusebyanothertasksoperformŠBNE„EXITERRŒanerrorexit.ŠSPC„2@ŠMOVE.W#FHCLOS,FHSCMD(A0)ƒClosethevolumeassignment.FMSwill4ŠTRAPƒ#3‘attempttoreadtheVID(sector0)andwill8ŠBNE„EXITERRŒreceiveanerrorifthedeviceisoff-line.,*£ThiswillcauseFMStocloseitsexclusive*£assignmentonthedevice.ŠSPC„2JDMT035„MOVE.LFDVDEV(A2,D2.W),FHSVOL(A0)ƒMovethedevicemnemonicobtained!*«fromthefetchdevicemnemonics%*«requesttotheFHSparameterblock.ŠSPC„2=DMT040„MOVE.W#FHASGN,FHSCMD(A0)‹Makeanexclusiveread/write+ŠTRAPƒ#3™deviceassignmentusingthedevice-ŠBNE„EXITERR”mnemoniccorrespondingtotheID#*«specifiedonthecommandline.If%*«anerrorisreturnedthedevicewas*«notoff-linewhenthevolume"*«assignmentwasclosedsoperform*«anerrorexit.ŠSPC„2=ŠLEA.L‚IOSBLK(PC),A0‰InitializetheIOSparameterblockfora@ŠMOVE.B#INPUTLU,IOSLUN(A0)deviceconfigurationstatusrequest.ŠLEA.L‚CNFGBLK(PC),A1ŠMOVE.LA1,IOSDBP(A0)ŠSPC„2AŠMOVE.W#IOSTAT,IOSFCT(A0)ƒPerformaconfigurationstatusrequest/ŠTRAPƒ#2‘todeterminethedevicetype.Noerror0ŠBNE„EXITERRŒshouldbereturnedonthisrequest.ŠSPC„2<ŠMOVE.L#EM_NVDEV,D0‰IfthedevicetypeisnotforahardorDŠCMP.B‚#XDSRDK,IOSDTP(A1)floppydisk,issueaninvaliddeviceerrorŠBHI„EXITERRŒmessageandexit. ŠSPC„2CŠMOVE.W#IOCNFG,IOSFCT(A0)„IssueaconfigurerequestforthedeviceEŠMOVE.W#IOPDMNT,IOSOPT(A0)withthedismountoptionandzerosinthe;ŠCLR.L‚IOSATM(A1)Šattributesandparametersmask.Thiswill.ŠTRAPƒ#2’notchangeanyconfigurationdatabut0ŠBNE„EXITERRwillcausethedrivertorejectall**¤furtherI/Orequestsonthedeviceuntil,*¤configurewiththemountoptionisissued.(*¤Noerrorshouldoccuronthisrequest.ŠPAGE;ŠLEA.L‚FHSBLK(PC),A0ˆClosethedeviceassignment.Theclose<ŠMOVE.W#FHCLOS,FHSCMD(A0)processingwillcausethecurrent/ŠTRAPƒ#3‘configurationtoreverttothedefault7ŠBNE„EXITERRŒconfiguration.Noerrorshouldeveroccur.ŠSPC„2-ŠERQ.TERM#0,#0ŽPerformanormaltermination.ŠSPC„2;EXITERRƒBSR„EMHOUTCalltheerrormessagehandlertoinform9ŠERQ.TERM#0,#$C000ˆtheuseroftheterminatingerrorand)*£terminatewithacodethatwillcausea+*£chainfileinvokingtheutilitytoabort.AŠTTLVERSAdosDismountUtilityVer.4.00(MessageOutputSubrtn.)ŠPAGEN********************************************************************************™MessageOutputSubroutine*™-----------------------*H*ƒThissubroutineoutputsthemessagepointedtobyA5andA6tothelogL* output device. These messages may be informative in nature or may be errorC* messages that are no available through the Error Message Handler.*&*A5=Startaddressofmessagebuffer$*A6=Endaddressofmessagebuffer*M***************************************************************************** ?MSGOUT„MOVE.LA0,-(A7)SaveA0onthestackandgettheaddress8ŠLEA.L‚MSGBLK(PC),A0†ofthemessageI/Oparameterblock.ŠSPC„2DŠMOVE.W#IOWRIT,IOSFCT(A0)ƒInitializetheparameterblocktoperform?ŠMOVE.B#LGOUTLU,IOSLUN(A0)aformattedwritetothelogoutputŠCLR.W‚IOSOPT(A0)Šdevice.ŠSPC„2BŠMOVEM.LA5-A6,IOSSAD(A0)„Writethemessagestartandendaddreses1ŠTRAPƒ#2‘totheparameterblockandissuetheI/O/ŠBNE„EXITERRŒrequest.Noerrorshouldoccurbut+*£terminatetheutilityifanerroroccurs.ŠSPC„27ŠMOVE.L(A7)+,A0RestoretheoriginalA0fromthestack'ŠRTS—andreturntothecallingroutine.@ŠTTLVERSAdosDismountUtilityVer.4.00(ErrorMessageSubrtn.)ŠPAGEO**********************************************************************************ErrorMessageHandlerRequestSubroutine**------------------------------------*C*ƒThissubroutineiscalledwhenD0containsanon-zeroreturncodeN* following a trap request to VERSAdos. The Error Message Handler is called to1* output an message to the logical output device.*<*‰Entryconditions:A0=addressoftheIOSparameterblock-*œD0=errorcodereturnedbytheTRAP2call*+*‰Exitconditions‚:Allregisterspreserved*N****************************************************************************** EEMHOUT„MOVEM.LD0/A0/A5,-(A7)†Savetheregistersthatwillbeusedon *£thestack.ŠSPC„24ŠMOVE.LA0,A5Copythetrapparameterblockaddress.ŠSPC„2<ŠLEA.L‚EMHBLK(PC),A0ˆCopytheerrorcodeandparameterblock<ŠMOVEM.LD0/A5,(A0)ˆaddressintotheEMHparameterblockand&ŠMOVE.L#2,D0Žissuetheerrormessage.ŠTRAPƒ#4ŠSPC„2<ŠMOVEM.L(A7)+,D0/A0/A5†Restoretheentryregistersfromthe-ŠRTS—stackandreturntothecallingroutine. ŠEND„DISMOUNTéé D TTL Vdos Disk Config. Subrtns. V 4.01 (Validate Configur.) 010485 4ŠPAGE*‰INCLUDEDSKCFGCD M******************************************************************************%*—ConfigurationValidationSubroutine%*—---------------------------------*H*ƒAfterthedriverhasbeenconfiguredsucessfully,theconfigurationisJ* checked by attempting to read the last sector of the disk. The number ofL* the last sector is obtained from the total VERSAdos sectors field returnedL* in the configure parameter block upon completion of the configure request.O* If the last sector read is sucessful, a two sector read is performed startingM* with the last VERSAdos sector on track 0. This read performs two functions.N* First, it cross checks the specified format attribute because tracks 0 and 1M* are on the same side for a Motorola format disk and on opposite sides on anH* IBM format disk. This will result in a track/sector address error if aG* mismatch occurs. Second, for double data density disks, the track 0-1M* boundary marks the transition from single density to double density. If theC* specified density attribute is incorrect, on error should result.*H*ƒIfanyerrorisreturnedontheeitherreadrequest,theconfigurationN* is assumed to be faulty. The subroutine returns immediately after completionN* of the errored trap 2 request to allow error handling to be performed by the* calling routine.*8*„Entryconditions:A0=addressofIOSparameterblock6*—A3=addressofconfigureparameterblockcontaining *œthecurrentdiskconfiguration*E*‰Note:EntrypointCNFGCHKBshouldbecalledwheneveranI/Obuffer?*otherthanTEMPBUFistobeused.Thestartandendaddresses@*ofa256bytebuffermustbeplacedintheIOSparameterblock;*priortoentry.Also,256bytesimmediatelyfollowingthe5*bufferendaddressmustbeavailableforusebythe *subroutine.*;*„Exitconditions:‚D0=0ifthevalidationwassuccessful X'a/i,q)y3/‰3‘2™6¡2©1±.¹5Á/É +*š=IOSerrorcodeifanI/Oerroroccurred+*—AllregistersarepreservedexceptforD0*N********************************************************************************ˆMODIFICATIONHISTORY*E*ˆAddedlinesofcodedated11/04/83whichputsacarriagereturnand8*ˆlinefeedattheendofeachpassoftheconfiguration%*ˆinformationprovidedonthescreen.*B*ˆLinesofcodedated1/05/84modifiedthoseof11/04/83touseanG*ˆinternalcarriagereturn-linefeedconstantinsteadofdependingupon!*ˆtheusingprogramforthedata.*O*******************************************************************************ŠDS.Wƒ0µ1/05/84CRLF†DC.Wƒ$0D0A±1/05/84=CNFGCHKƒPEA.L‚TEMPBUF(PC)Loadthestartandendaddressesof;ŠMOVE.L(A7)+,IOSSAD(A0)ˆthetemporarybuffertobeusedto)ŠPEA.L‚TEMPBUFE(PC)Œreadthelastsector.ŠMOVE.L(A7)+,IOSEAD(A0)ŠSPC„2ACNFGCHKB‚MOVE.LD1,-(A7)SavetheentryvalueofD1onthestack.ŠSPC„2BŠMOVE.W#IOREAD,IOSFCT(A0)ƒObtainthenumberofthelastsectorbyCŠMOVE.W#IOPRAN,IOSOPT(A0)decrementingthetotalnumberofsectors=ŠMOVE.LIOSRSZ(A3),D1†returnedfromtheconfigurerequestand6ŠSUB.L‚#1,D1Žmakethereadrequest.Ifanerrorstatus>ŠMOVE.LD1,IOSRRN(A0)†isreturned,theconfigurationisfaulty3ŠTRAPƒ#2‘soreturnwithoutperformingthetrack0-1ŠBNE.S‚CNFGCHKR‹boundarycheck.ŠSPC„2BŠCMP.B‚#XTDIPC,IOSCTP(A3)ƒIfthediskwhoseconfigurationisbeing7ŠBEQ.S‚CNFGCHKR‹checkedisonanIPCcontroller,donot)*£performthetrack0-1boundarycheckas**£thetrackandsectorsizeinformationis!*£notreturnedbytheIPCdriver.ŠSPC„21ŠCLR.W‚D1“Multiplythephysicalsectorspertrack>ŠMOVE.BIOSSPT(A3),D1†bythephysicalsectorsizetodetermine2ŠMULUƒIOSPSM(A3),D1†thenumb erofbytespertrack.ŠSPC„2FDDFLPY„EQU„1<*‰EntryConditions:A1 =AddressofConfigureparameterblock3*œD1(bits16-31)=Maskofattributesthatwillbe*­openedforuserchanges.2*œD1(bits0-15)‚=Maskofparametersthatwillbe*­openedforuserchanges.*3*‰ExitConditions‚:Allregisterspreservedonexit,*œUserchangeshavebeenincorporatedinthe*›Configureparameterblock.*"*‰DisplayConfigurationSubroutine"*‰--------------------------------*D*ƒThisalternateentrypointisusedwhenthemaskofattributesandH* passed in D1 specifeds the current configuration values that are to beK* displayed but no changes to the values are obtained by the user. The textI* prompt and current value for each attribute or parameter is exactly theI* same as is used for the Modify Configuration entry point. The entry and%* exit conditions are also identical.**‡RevisionHistory*>*‰4.01ƒ6/30/83‚MLBƒAddedcodetohandleParametersMaskbit150*Ÿbeingusedtospecifytwoparametersinseadof-*Ÿtheususlsingleparameter.Alsoaddedcode,*Ÿtodisplayainformationmessageaboutthe**Ÿspecialresponsecharacters'C'and'Q'.*N******************************************************************************ŠPAGE´MLB6/30/83*HMODCNFGƒMOVEM.LD0-D7/A0/A2-A3/A5-A6,-(A7)Saveallregistersthatare…*,ŠCLR.B‚D6™usedbythesubroutineandclear*$*«D6.Btoindicatethatthedisplay**«andchangeentrywasused.‡*ŠSPC„2°MLB6/30/83*>ŠLEA.L‚MSGINST(PC),A5‡Outputamessagetotheuserdescribing*@ŠLEA.L‚MSGINSTE(PC),A6„thespecialresponsecharacters'C'and‚*ŠBSR„MSGOUT'Q'.¥*ŠSPC„2»*7ŠBRA.S‚MOD003ŽBranchtothestartofthedisplayloop.*ŠSPC„2°MLB6/30/83*KDSPCNFGƒMOVEM.LD0-D7/A0/A2-A3/A5-A6,-(A7)Saveallregistersthatareused*ŠST…D6™usedbythesubroutineandsetD6.B#*«toindicatethatthedisplayonly*«entrywasused.ŠSPC„23MOD003„MOVE.LD1,D7Savethemaskofparametersand'*£attributestodisplayorchangeinD7(*£sinceD1isusedbysomeofthesystem*£subroutinesusedlater.ŠSPC„24MOD005„MOVE.LD7,D4Getthemaskofattributestobe(ŠSWAPƒD4‘displayedorchangedintoD4.WŠSPC„27ŠLEA.L‚ATWTBL(PC),A2ˆLoadtheaddressoftheattributes*£display/changecontroltable.ŠSPC„2-ŠCLR.L‚D5“D5.wcontainsthebitnumberofthe,*£attributebeingdisplayed/changed.Setthe*£bitnumbertozeroinitially.ŠSPC„2*J*ƒThisisthestartoftheattributesupdate/displayloop.EachbitoftheG* mask of selected attributes is tested. When a mask bit is set, a textK* description is sent to the log output device followed by the mnemonic forJ* the current value of the attribute. If the display only flag is not set,L* the user is prompted to enter a new value for the attribute. The new valueL* is input in the same mnemonic form as specified by the control table. WhenI* the mask is reduced to zero, control proceedes to the parameter update/* display routine. ',(A6)+‰andanothertrailingblankfollowingthe9ŠMOVE.B#'',(A6)Šconvertednumber.UpdateA6topointto&*£blankfolloingthepromptcharacter.ŠSPC„26ŠBSR.S‚OUTWINPŽOutputthepromptandinputanewvalue*£fortheparameter.*ŠSPC„27ŠCMP.B‚#'C',(A5)ŒIftheuserinputa'C'forconfigure,4ŠBNE.S‚MOD050preparetoreturnfromthesubroutine.ŠSPC„2JMODRTN„MOVEM.L(A7)+,D0-D7/A0/A2-A3/A5-A6‚RestoreallregistersandreturnŠRTSŸtothecallingroutine.ŠSPC„2:MOD050„CMP.B‚#'Q',(A5)ŒIftheuserentereda'Q'forquit,3ŠBEQ„MTABRTterminatetheutilitybyjumpingtothe*£errorexitroutine.ŠSPC„22ŠCMP.B‚#CR,(A5)IfaCRonlywasinput,retainthe8ŠBEQ.S‚MOD070currentvalueoftheparameterandprepare *£toprocessthenextparameter.ŠSPC„26ŠMOVE.LA5,A0CallsystemsubroutineASCVALtoconvert&ŠBSR„ASCVALtheinputvaluetobinary.ŠSPC„2/ŠCMP.B‚#CR,D1Iftheconversionprocesswasnot4ŠBNE„MOD040terminatedbyaCR,aninvaliddigitwas(*£enteredsoreissuethesamepromptand*£solicitnewinput.ŠSPC„25ŠMOVE.LD3,D2Checkthenumberofsignificantbitsin3ŠCLR.L‚D1‘theinputvaluebymultiplyingthelengthAŠMOVE.BIPRMLEN(A2),D1…oftheparameter,inbytes,by8toobtain8ŠLSL.L‚#3,D1Žthemaximumnumberofsignificantbitsthat7ŠLSR.L‚D1,D2Žwillfitintheparameter.Shifttheinput6ŠBNE„MOD040valuebythisnumbertoisolateanyexcess-*£significantbits.Ifanyoftheexcessbits**£areset,theinputvalueistoolargeso+*£reissuethesamepromptandsolicitanew*£value.ŠSPC„23ŠLSR.L‚#3,D1Restorethelengthoftheparameterin*£bytes.ŠSPC„2EMOD060„MOVE.BD3,-1(A3,D1.L)‡Copythenewvalueoftheparameterinto2ŠLSR.L‚#8,D3Žtheconfigureblockabyteatatime. ŠSUB.L‚#1,D1 ŠBNE„MOD060ŠPAGE9MOD070„CLR.L‚D1“Increasetheconfigureblockindex(D5.W)@ŠMOVE.BIPRMLEN(A2),D1…bythelengthofthecurrentparameterso8ŠADD.W‚D1,D5Žthenextparameterwillbeindexed.Addthe<ŠADD.W‚#IPRMELN,A2ˆcontroltableentrylengthtothecontrol+*£tablepointer(A2)toindextheentryfor*£thenextparameter.ŠSPC„2/ŠTST.W‚D4“Continueintheparameterchangeloop4ŠBNE„MOD030untilalloftheparametersspecifiedby**£thecallingroutinehavebeenopenedfor *£change.ŠSPC„21ŠTST.B‚D6“Ifthedisplayonlyflagisset,return2ŠBNE„MODRTNtothecallingroutineonceallofthe)*£selectedattributesandparametershave*£beendisplayed.ŠSPC„2 *Ä11/04/837*‰PutaCRLFbeforenextseriesofquestions.11/04/83 *Ä11/04/83ŠLEA„CRLF(PC),A5ª1/05/84ŠLEA„CRLF(PC),A6ª1/05/84ŠBSR.S‚MSGOUT¯1/05/84 *Ä11/04/835ŠBRA„MOD005Returntotheattributeswordprompt.The)*£sequenceofpromptscontinuestorepeat+*£untiltheuserenterseithera'C'or'Q'$*£inresponsetooneoftheprompts.: TTL Vdos Disk Config. Subrtns. V 4.00 (Output with Input)ŠPAGEL*******************************************************************************˜OutputWithInputSubroutine*K*ƒThissubroutineoutputsinimagemodetothelogoutputdevicethebufferK* whose beginning and ending addresses are given by A5 and A6 respectively.I* The output is followed by an image mode input from the log input deviceK* System subroutine SBARG is called to perform argument substitution, lowerL* to upper case character conversion. SBARG also echoes the input to the logH* output device if the utility is being run in chain mode. On return theG* starting and ending addresses of the SBARG processed input buffer are%* returned in A5 and A6 respectively.* ?*‚EntryConditions:A5=startingaddressoftheoutputbuffer**•A6=endingaddressoftheoutputbuffer*=*‚ExitConditions‚:A5=startingaddressoftheinputbuffer)*•A6=endingaddressoftheinputbuffer*M***************************************************************************** ?OUTWINPƒMOVE.LA0,-(A7)SavetheentryvalueofA0andloadthe9ŠLEA.L‚MSGBLK(PC),A0†messageIOSparameterblockaddress.ŠSPC„2CŠMOVE.W#IOWRIT,IOSFCT(A0)„SettheIOCBforanimagemodeoutputtoEŠMOVE.B#LGOUTLU,IOSLUN(A0)thelogoutputdevice.ImagemodeisusedEŠMOVE.W#IOPIMG,IOSOPT(A0)‚toallowtheinputtofollowtheoutputon *¤thesamelineoftheterminal.ŠSPC„2@ŠMOVEM.LA5-A6,IOSSAD(A0)„WritethebufferaddressestotheIOCB.ŠTRAPƒ#2‘andoutputthebuffer.Ifanerroris,ŠBNE„EXITERRŒreturnedterminatetheutility.ŠSPC„28ŠLEA.L‚INPBUF(PC),A5ˆStoretheinputbufferstartingand<ŠLEA.L‚INPBUFE(PC),A6…endingbufferaddressesintoA5andA6BŠMOVEM.LA5-A6,IOSSAD(A0)‚respectivelyandcopytheaddressesinto*£themessageIOCB.ŠSPC„2@ŠMOVE.W#IOREAD,IOSFCT(A0)„PerformaformattedreadfromthelogBŠMOVE.B#LGINPLU,IOSLUN(A0)inputdevice.Ifanerrorisreturned,(ŠCLR.W‚IOSOPT(A0)Šterminatetheutility.ŠTRAPƒ#2 ŠBNE„EXITERRŠSPC„2/ŠBSR„SBARGCalltheSBARGsubroutinetoperform7ŠBNE.S‚EXITERRŒargumentsubstitutionandlowertoupper&*£caseconversionontheinputbuffer.ŠSPC„24ŠMOVE.LA5,A6Adjusttheinputbufferendaddressin<ŠADD.L‚IOSLEN(A0),A6†A6topointtothelastinputcharacter(*£afterargumentshavebeensubstituted.ŠSPC„29ŠMOVE.L(A7)+,A0RestoretheentryvalueofA0andreturnŠRTS—tothecallingroutine.7 TTL Vdos Disk Config. Subrtns. V 4.00 (Message Output)ŠPAGEN********************************************************************************™MessageOutputSubroutine*™-----------------------*H*ƒThissubroutineoutputsthemessagepointedtobyA5andA6tothelogL* output device. These messages may be informative in nature or may be errorC* messages that are no available through the Error Message Handler.*&*A5=Startaddressofmessagebuffer$*A6=Endaddressofmessagebuffer*M***************************************************************************** ?MSGOUT„MOVE.LA0,-(A7)SaveA0onthestackandgettheaddress8ŠLEA.L‚MSGBLK(PC),A0†ofthemessageI/Oparameterblock.ŠSPC„2DŠMOVE.W#IOWRIT,IOSFCT(A0)ƒInitializetheparameterblocktoperform?ŠMOVE.B#LGOUTLU,IOSLUN(A0)aformattedwritetothelogoutputŠCLR.W‚IOSOPT(A0)Šdevice.ŠSPC„2BŠMOVEM.LA5-A6,IOSSAD(A0)„Writethemessagestartandendaddreses1ŠTRAPƒ#2‘totheparameterblockandissuetheI/O1ŠBNE.S‚EXITERRŒrequest.Noerrorshouldoccurbut+*£terminatetheutilityifanerroroccurs.ŠSPC„27ŠMOVE.L(A7)+,A0RestoretheoriginalA0fromthestack'ŠRTS—andreturntothecallingroutine. = TTL Vdos Disk Config. Subrtns. V 4.00 (ASCII Decimal Output)ŠPAGEL*****************************************************************************$*–BinarytoASCIIDecimalConversion *žSubroutine*J*ƒThissuborutineconvertsabinaryvaluetoASCIIdecimal.TheaddressofN* the value is contained in A0 and the length of the value in bytes is in D0.BJ* on entry. The converted value with leading zeros suppressed is stored inJ* consecutive bytes starting with the address contained in A6 on entry. OnL* return, A6 is updated to point to the byte following the last digit of the* converted value.*E*„Entryconditions:A0=addressofthebinaryvaluetobeconverted8*—A6=addresswheretheconvertedvalueistobestored9*—D0.B=thenumberofbytesinthevaluetobeconverted*H*„Exitconditions‚:A6=addressofthebytefollowingthelastdigitof*œtheconvertednumber-*˜Allotherregistersarepreservedonreturn*K*************************************************************************** DDECTOASC‚MOVEM.LD0-D2,-(A 7)‰Savethealltheregistersthatwillbe4ŠCLR.L‚D1‘changedonthestackforlaterrestoration)ŠCLR.W‚D2‘andzerotheworkingregisters.ŠSPC„29DEC010„LSL.L‚#8,D1MovethevaluetobeconvertedintoD1=ŠMOVE.B0(A0,D2.W),D1†abyteatatimestartingwiththemostŠADD.W‚#1,D2Žsignificantbyte. ŠSUB.B‚#1,D0 ŠBNE„DEC010ŠSPC„20ŠCLR.B‚-(A7)Saveabyteofzeroonthestackto"*£serveasanendofstringmarkerŠSPC„2*K*ƒThenumberconversionloopbeginswiththeleastsignificantdigitoftheM* value and proceeds in order of increasing significance. When no significantF* digits remain to be converted, the loop terminates causing automatic* supression of leading zeros.* 7DEC020„DIVUƒ#10,D1Dividethevalueby10.Generatethe3ŠSWAPƒD1‘ASCIIdecimaldigitbyaddinganASCII'0'9ŠADD.B‚#$30,D1ŒtothereminderandstorethedigitontheŠMOVE.BD1,-(A7)‹stack.ŠSPC„20ŠCLR.W‚D1“Zerotheremainderandcontinueinthe1ŠSWAPƒD1‘loopuntilthevalueisreducedtozero. ŠBNE„DEC020ŠPAGE@DEC030„MOVE.B(A7)+,(A6)+ŠMovetheASCIIdecimalstringfromthe3ŠBNE„DEC030stacktothestorageareapointedtoby)*£A6.Thedigtsarepulledfromthestack&*£inorderofdecreasingsignificance.(*£Themoveloopterminateswhenthezero"*£end-of-stringbyteisretrieved.ŠSPC„25ŠTST.B‚-(A6)AdjustA6topointtothebytefollowing(*£thelastdigitoftheconvertedvalue.ŠSPC„26ŠMOVEM.L(A7)+,D0-D2‰Restoretheoriginalvalueofthe*ŠRTS—modifiedregistersfromthestackand *£returntothecallingroutine.= TTL Vdos Disk Config. Subrtns. V 4.00 (Error Message Output)ŠPAGEO**********************************************************************************ErrorMessageHandlerRequestSubroutine**------------------------------------*C*ƒThissubroutineiscalledwhenD0containsanon-zeroreturncodeN* following a trap request to VERSAdos. The Error Message Handler is called to1* output an message to the logical output device.*<*‰Entryconditions:A0=addressoftheIOSparameterblock-*œD0=errorcodereturnedbytheTRAP2call*+*‰Exitconditions‚:Allregisterspreserved*N****************************************************************************** EEMHOUT„MOVEM.LD0/A0/A5,-(A7)†Savetheregistersthatwillbeusedon *£thestack.ŠSPC„24ŠMOVE.LA0,A5Copythetrapparameterblockaddress.ŠSPC„2<ŠLEA.L‚EMHBLK(PC),A0ˆCopytheerrorcodeandparameterblock<ŠMOVEM.LD0/A5,(A0)ˆaddressintotheEMHparameterblockand&ŠMOVE.L#2,D0Žissuetheerrormessage.ŠTRAPƒ#4ŠSPC„2<ŠMOVEM.L(A7)+,D0/A0/A5†Restoretheentryregistersfromthe-ŠRTS—stackandreturntothecallingroutine.= TTL Vdos Disk Config. Subrtns. Ver. 4.00 (Error Termination)ŠPAGEL******************************************************************************–ErrorTerminationRoutine*–-----------------------*L*ƒThisroutineiscalledwheneverafatalerrorwasdetectedbytheutility.I* The first entry point is called when the Error Message Handler is to beE* called prior to terminating. A configure request is issued with theJ* dismount option and zero attribute and parameters masks. When the deviceL* assignment is closed, the current device configuration will change back toK* the default and the driver will block any I/O requests to the device. TheJ* utility then terminates. If the utility was invoked from chain mode, the* chain file will abort.*@*‰Entryconditions‚:A0=AddressofanIOSparameterblockthat+*¡containstheLUNtowhichthediskdevice*¡isassigned.7*‰Exitconditions:Thisroutineterminatestheutility*N******************************************************************************  9EXITERRƒBSR„EMHOUTOutputtheerrormessagefortheerror*£thatcausedtermination.ŠSPC„2>MTABRT„LEA.L‚CNFGBLK(PC),A1ˆLoadtheconfigureparameterblock;ŠLEA.L‚IOSBLK(PC),A0†andtheIOSparam eterblockaddresses.ŠSPC„2=ŠMOVE.W#IOCNFG,IOSFCT(A0)„IssueaconfigurerequestwiththeCŠMOVE.W#IOPDMNT,IOSOPT(A0)dismountoptionandzeroattributesand7ŠMOVE.LA1,IOSDBP(A0)‡parametersmasks.Whenthedevice3ŠCLR.L‚IOSATM(A1)Šassignmentisclosed,thedefault/ŠTRAPƒ#2’configurationwillberestoredandthe$*¤driverwillrejectanyfurtherI/O *¤requests.ŠSPC„2?MTABRT10‚ERQ.TERM#0,#$C000‹Terminatetheutilitywithanerror,*£codethatwillcauseachainfileinvoking*£theutilitytoabort.ŠSPC„2ééééééE TTL Vdos Disk Configure Subrtns. V 4.02 (Data Declarations) 11/09/84ŠPAGE*‰INCLUDEDSKCFGDT*4* Parameter Block storage for VERSAdos system calls.*)IOSBLK„DCB.B‚IOSBLN,0‹IOSparameterblock 0CNFGBLKƒDCB.B‚IOSDLN,0‹ConfigureparameterblockCNFGBLKE‚EQU„*-1*‰INCLUDEEMHOUT*0*‚ErrorMessageHandlerrequestparameterblock.*4EMHBLK„EQU„*’ErrorMessageHandlerrequestparameter)*£blockequates(notcontainedinIOE.SA) .EMHKEY„DC.Lƒ0”KeyreturnedinD0bytheserver 7EMHPBA„DC.Lƒ0”Addressofserverrequestparameterblock ŠDC.Bƒ0”Reserved 5EMHLUN„DC.Bƒ0”LUNtowhichtheerrormessageistobe *¥output.ŠDC.Wƒ0&EMHPPSAƒDC.Lƒ0”Plugpoolstartaddress $EMHPPEAƒDC.Lƒ0”Plugpoolendaddress 9EMHBLN„EQU„*-EMHBLKErrorMessageHandlerParameterBlock *£length.ŠSPC„2*3*‚ParameterblockstorageforVERSAdossystemcalls*@MSGBLK„DCB.B‚IOSBLN,0‹IOSparameterblockforoutputmessagesto*£thelogoutputdevice.ŠSPC„2**‚Miscellaneousstorage*1INPBUF„DS.Bƒ82“Buffertocontaininteractiveuser8INPBUFEƒEQU„*-2responses.Theendbufferaddresspassed**£toIOSisonelessthanthephysicalend)*£ofthebufferbecauseSBARGplacesaCR%*£atthebufferendaddressplusone.ŠSPC„2°6/30/83MLB*JMSGINSTƒDC.Wƒ$0A,'Configurationchange-toexitenterC(configure)orQ'*"ŠDC.Wƒ'(terminateutility)',$0A¢*MSGINSTE‚EQU„*-1®6/30/82MLB*ŠPAGE*A*ƒThefollowingtablecontrolstheoperationoftheConfigurationH* Display/Change subroutine. Each entry contains a text description of aL* configuration attribute and one character mnemonics to describe the values(* of the attribute for output and input.*Á9/20/83MLB*LATWTBLDC.Bƒ'S','D','DataDensityofmedia(S-single,D-double)' ,*-*,'>'*F‡DC.Bƒ'S','D','TrackDensityofmedia(S-single,D-double)',*-*,'>'*@‡DC.Bƒ'S','D','S-SingleorD-Doublesideddiskette‡',*-*,'>'*E‡DC.Bƒ'M','I','Mediaformat(M-Motorola,I-IBMstandard)‚',*-*,'>'*Ñ>Ú2â.=‡DC.Bƒ'F','H','F-FloppydisketteorH-HarddiskŠ',*-*,'>'*F‡DC.Bƒ'S','D','DataDensityofdrive(S-single,D-double)',*-*,'>'*F‡DC.Bƒ'S','D','TrackDensityofdrive(S-single,D-double)',*-*,'>'*F‡DC.Bƒ'N','Y','Seekrequiredw/headchange(Y-Yes,N-No)',*-*,'>'*E‡DC.Bƒ'W','R','W=Pre-writeorR=Post-readprecomp.cyl.‚',*-*,'>'*B‡DC.Bƒ'5','8','5-1/4"or8"disksize(enter5or8)…',*-*,'>'*@‡DC.Bƒ'N','Y','AlternateTrackusage(Y-Yes,N-No)‡',*-*,'>'*‡DC.Bƒ0ƒspaceforattribute11‡DC.Bƒ0ƒspaceforattribute12‡DC.Bƒ0ƒspaceforattribute13‡DC.Bƒ0ƒspaceforattribute14‡DC.Bƒ0ƒspaceforattribute15‡DS.Wƒ0*À11/09/84sml*ŠSPC„2*J*ƒTheseequatesdefinetheoffsetsofthevariousfieldsoftheAttributes* control table. 4ATWBCLRƒEQU„0”Thisistheoffsetoftheinput/output**£mnemonicforanattributevalueofzero.ŠSPC„24ATWBSETƒEQU„1”Thisistheoffsetoftheinput/output)*£mnemonicforanattributevalueofone.ŠSPC„2-ATWBPRMT‚EQU„2”Thisistheoffsetofthetext*£descriptionoftheattribute.ŠSPC„28ATWBCVAL‚EQU„44“Thisistheoffsetofwherethemnemonic+*£forthecurrentattributevalueisstored *£foroutput.ŠSPC„29ATWBPLN1‚EQU„44“Thisisthelength-1oftheoutputbuffer,*£whenthedisplayonlyentrypointisused.ŠSPC„29ATWBPLN2‚EQU„47“Thisisthelength-1oftheoutputbuffer,*£whenthedisplayandchangeentrypointis*£used.ŠPAGE*H*ƒThefollowingtablecontrolstheoperationoftheConfigurationChangeI* subroutine. Each entry contains the length of a configuration parameterG* in bytes and the text portion of the change prompt for the parameter.*Á9/20/83MLB*/PRMTBLDC.B‚IOSRSZ-IOSREC,'Vdossectorsize'ƒ*+‡DC.B‚IOSWTO-IOSRSZ,'TotalVdossectors›'ƒ*+‡DC.B‚IOSRTO-IOSWTO,'Writetimeout(ms)›'ƒ**‡DC.B‚IOSSPT-IOSRTO,'Readtimeout(ms)œ'ƒ*@‡DC.B‚IOSHDS-IOSSPT,'Physicalsectors/trackonmedia(8bits)†'ƒ*9‡DC.B‚IOSTRK-IOSHDS,'Numberofheadsondrive(8bits)'ƒ*>‡DC.B‚IOSILV-IOSTRK,'Numberofcylindersonmedia(16bits)ˆ'ƒ*;‡DC.B‚IOSSOF-IOSILV,'Interleavefactoronmedia(8bits)‹'ƒ*7‡DC.B‚IOSPSM-IOSSOF,'Spiraloffsetonmedia(8bits)'ƒ*@‡DC.B‚IOSSHD-IOSPSM,'Bytes/physicalsectoronmedia(16bits)†'ƒ*@‡DC.B‚IOSTRKD-IOSSHD,'Startingheadnumberondrive(16bits)‡'‚*E‡DC.B‚IOSPCOM-IOSTRKD,'Max.numberofcylindersondrive(16bits)ƒ'*E‡DC.B‚IOSSPTD-IOSPCOM,'Precomp.cylindernumberondrive(16bits)ƒ'*B‡DC.B‚IOSSRTD-IOSSPTD,'Physicalsectors/trackondrive(8bits)†'*7‡DC.B‚IOSEWCC-IOSSRTD,'Headstepratecode(8bits)‘'*F‡DC.B‚IOSECC-IOSEWCC,'Reducedwritecurrentcylinderno.(16bits)'‚*9‡DC.B‚IOSDRSV-IOSECC,'ECCdataburstlength(16bits)Ž'‚*‡SPC„2³9/20/83MLB**J*ƒTheseoffsetsdefineoffsetswithinanentryintheconfigurationchange* control table.* 5IPRMLENƒEQU„0”Offsetofstartofthepromptfieldand8IPRMTXTƒEQU„1’thelengthofthefieldwithinaparameterIPRMTLNƒEQU„45‘fieldentry. †DISPLAYSNEXTSECTORINSUCCESSION*.*‹^…DISPLAYSPREVIOUSSECTORINSUCCESSION*4*‹R$20…CAUSESSECTOR$20TOBEREADINTOTHECHANGE *•BUFFER.*3*‹S‰CAUSESTHESECTORCHANGEBUFFERTOBEDISPLAYED*9*‹F55†CAUSESTHEHEXPATTERN55TOBEPLACEDINALLBYTE3*•POSITIONSOFTHESECTORCHANGEBUFFER.‚THENUMBER/*•ISALWAYSASSUMEDTOBEHEX.‚ALEADING'$'IS*•OPTIONALBUTHASNOEFFECT.*4*‹M32†OPENSUPCHANGEMODEATOFFSET32(HEX)INTHE1*•SECTORCHANGEBUFFER.‚ALEADING'$'ISOPTIONAL *•SIMILARTOTHE'F'SUBCOMMAND.*1*‹W‰WRITESOUTTHESECTORCHANGEBUFFERTOSECTOR*•FROMWHICHITWASREAD*6*‹W$10…WRITESOUTSECTORCHANGEBUFFERTOSECTOR$10.8*‹OUTNAME‚CHANGESLISTINGFILE/DEVICETOTHATSPECIFIED *•IN'NAME'**‹Q‰TERMINATESDUMPTASK.***ˆMODIFICATIONHISTORY* *ˆ1016844=*ˆWHENANASSIGNISMADEFORADEVICEWHICHFAILSBECAUSETHEA*ˆDEVICEDOESNOTHAVEAVOLUMEASSOCIATEDANDTHESHAREDSEGMENT@*ˆBITISSET,DUMPWILLCLEARTHATBITANDRETRYTHEASSIGNMENT.*H************************************************************************* DUMP DATA AREAH*************************************************************************!ŠXREFƒEDITFILE,OPTION,PARSE,SBARGŠNOLISTŠINCLUDE9995.&.TR1.EQõüDD @Xj%J-D5G==EAMGU8]Be:mAuF}8…@;•9L¥@­MµG½\Å:Í=Õ@ÝFåHŠINCLUDE9995.&.FME.EQŠINCLUDE9995.&.IOE.EQŠLIST*‰INCLUDE9995.&.TR1.EQ*‰INCLUDE9995.&.FME.EQ*‰INCLUDE9995.&.IOE.EQ* ŠSECTION0B‰EQU„*&ŠDC.Bƒ'1220844'‰DATE/REVCODE/VERSION** DUMP DATA AREA* ŠDS.Lƒ$20 STACK…EQU„*-SAVSTACK‚DS.Lƒ1’SAVEFORSTACKPOINTERONASQ*#CLGH†EQU„$A0LENGTHOFCOMMANDLINE-CLINE…COMLINECLGHŽCOMMANDLINEINPUTTOTASK*)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'CATNAM„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*!* PARAMETER BLOCK TO ALLOCATE ASQASQ1†DC.Lƒ'DUMP'TASKNAME(ŠDC.Lƒ0’SESSIONCODE(N/AFORUSERTASK)$ŠDC.Bƒ8’DISABLEREGSTACKING,ASR,ASQ#ŠDC.Bƒ20‘LONGESTMESSAGEACCEPTABLE ŠDC.Lƒ$100QUEUELENGTHIFBYTES,ŠDC.Lƒ0’ALTERNATESERVICEADDRESS(NOTUSED)$ŠDC.Lƒ0’ASRRECEIVINGAREA(DYNAMIC)** ASR RECEIVING AREAASQBUFFƒDS.Bƒ20*'* ERROR MESSAGE HANDLER PARAMETER BLOCK*4ERRPBLKƒDC.Lƒ0’USERREGD0CONTAINSERRMSGKEYVALUE-ŠDC.Lƒ0’USERREGA0POINTSATI/OCONTROLBLK3ERRPOPTƒDC.Bƒ0’ERROROPTIONS[BIT0=QUERYRESPONSE].ERRPLDFƒDC.BƒLDFLUNUSERLDFLUNLUNFORSCREEN%ERRPQUYƒDC.Bƒ0’QUERYRETURNCHARACTER,ERRPCDFƒDC.BƒCDFLUNUSERCDFLUNFORKEYBOARD0ERRPLUGB‚DC.Lƒ0’BEGINNINGOFUSERTEXTPLUGPOOL*ERRPLUGE‚DC.Lƒ0’ENDOFUSERTEXTPLUGPOOL** TIME PARAMETER BLOCK*TIMBLK„DS.Lƒ1’DATE ŠDS.Lƒ1’TIME*&TMPDATEƒDS.Lƒ1’TEMPORARYHOLDFORDATEHOLDDATE‚DS.Lƒ1*/PARSAREG‚EQU„*’SAVEDA-REGSAFTERCALLTOPARSE3OUTPSRTƒDS.Lƒ1’A1=OUTPUTFIELDADDRESSFROMPARSE3OPTSRT„DS.Lƒ1’A2=OPTIONSFIELDADDRESSFROMPARSE+NONCONTG‚DC.Wƒ0’FLAGFORNONCONTIGUOUSFILE1EDITRTNƒDC.Lƒ0’SAVEFORFLAGRETURNFROMEDITFILE0EDITOUTƒDC.Lƒ0’SAVEFOREDITFILEOFOUTPUTFIELD*EDITSVA0‚DC.Lƒ0’SAVEFORA0AFTEREDITFILE%ASQDUN„DC.Wƒ-1‘FLAGFORASQALLOCATED2BKCNT…DS.Wƒ1’HOLDSNUMBEROFBLOCKSINSHAREDSEG.* * LU EQUATES*(INPLUN„EQU„1’ASSOCIATEDWITHINPUTFIELD4LISTLUNƒEQU„3’ASSOCIATEDWITHLISTING(OUTPUTFIELD)*** PROMPT MESSAGE*"PROMPTCƒDC.Bƒ'>'PROMPTCHARACTERPROMPTCE‚EQU„*-1***'* INPUT BUFFER FOR INTERACTIVE DIALOGUE*OPINLGHƒEQU„60‘LENGTH(BYTES)OPINPBUF‚DS.BƒOPINLGHŒBUFFER,TERMCHRƒDC.Bƒ'Q'TERMINATIONINPUTCHARACTER+DUMPCHRƒDC.Bƒ'D'INTERACTIVEDUMPCHARACTER*+* SAVE AREAS FOR DECODING INTERACTIVE INPUT* INTRACTƒDC.Lƒ0’INTTERACTIVEFLAG-DUMPED„DC.Lƒ0’FIRSTTIMETHRUFLAGFORDUMPED)STOPT…DC.Lƒ0’LIMITOPTIONSSPECIFIEDFLAG SRTSEC„DC.Lƒ-1‘STARTINGSECTOR#*ENDSEC„DC.Lƒ$7FFFFFFFŠENDINGSECTORNUMBERCHRPTR„DS.Lƒ1’CHARACTERPOINTER,RSEC†DC.Lƒ-1‘HOLDSSECTOR#INCHANGEBUFFER6RCHG†DC.Wƒ$FFFFŽCHANGEDFLAG(<>0IMPLIESNOTCHANGED)8GOTCHG„DC.Wƒ$FFFFŽGOTCHANGEBUFFER(<>0IMPLIESNOGOT)"RFRRN…DS.Lƒ1’1STRRNINSHAREDSEG3RSEG†DS.Lƒ1’SAVEDADDRINSEGOFSECTOROFINTEREST*SAVDEC„DS.Lƒ1’SAVEFORDECNUM&MODEC…DC.Lƒ$F‘MODE(0=INCHANGEMODE).INCNUM„DC.Lƒ0’INCREMENTFORUPORDOWNDISPLAY0DECNUM„DC.Lƒ-1‘BINARYNUMBERINPUTFROMOPERATOR/GETIDXNM‚DS.Lƒ1’VALUETOPUTINTOCHANGEBUFFER4QFIRST„DS.Lƒ1’FIRSTPASSFLAGFORSTRINGCONVERSIONS2QSAVA0„DS.Lƒ2’SAVEFORA0-A1ONSTRINGCONVERSIONS7STGCHR„DS.Wƒ1’SAVEFORCHARACTERONNUMERICSTRINGCONV(RADIX…DS.Wƒ1’NUMBERBASERADIXTEMPSAVE*"SAVD†DS.Lƒ2’FORMATSSAVEFORD1,D2+BYTENUMƒDS.Lƒ1’FORMATSSAVEFORBYTENUMBER*&*ƒCHANGELUASSIGNMENTPARAMETERBLOCK*.LDFLSTLU‚EQU„*’CHANGELUROMLDFLUNTOLISTLUN2ŠDC.WƒFHCHLUCODE=1,COMMAND=$10(CHANGELUASSGN)ŠDC.WƒFOPKEP+FOPSLU†KEEP,SENDŠDC.Bƒ0’STATUS%ŠDC.BƒLDFLUNSENDLOGICALUNITNUMBER)ŠDC.BƒLISTLUNŒRECEIVELOGICALUNITNUMBERŠDC.Bƒ0’RESERVEDŠDC.Lƒ0’TASKID(0=SELF)ŠDC.Lƒ0’SESSION#(0=SELF)*7*ƒASSIGNLISTINGLUTODEVICESPECIFIEDINOUTPUTFIELD*&ŠFHS.LISTFHASGN,FOPPW,LISTLUN,0,0,$00*4*ƒASSIGNINPUTLUTODEVICESPECIFIEDONINPUTFIELD**ŠFHS.INPFHASGN,FOPPR+FOPABF+FOPADR,INPLUN'ŠDC.Lƒ0’SHAREDSEGLOGSTARTINGADDRESS$ŠDC.Lƒ0’FHSFILLSINENDINGBUFADDR(ŠDC.Lƒ0’FHSFILLSINSHAREDSEGMENTNAME*(* FETCH DEVICE MNEMONICS PARAMETER BLOCK* FCHFHS„EQU„*#ŠDC.WƒFHFDMNFETCHDEVICEMNEMONICS0ŠDC.WƒFOPFRAFETCHRANDOMACCESSDEVICESOPTIONSŠDC.Wƒ0’FILLER ŠDC.Lƒ0’BUFFERADDRESS(DYNAMIC)-ŠDC.LƒBUFL*2BUFFERLENGTH‚(usebothbuffers)**2*‚I/OPARAMETERBLOCKFORGENERALMESSAGES(INPUT)*&ŠIOS.MSGIIOREAD,,CDFLUN,,,0,0,OPINLGH*+*I/OPARAMETERBLOCKFOR‚MESSAGES(OUTPUT)*ŠIOS.MSGIOWRIT,IOPIMG,LDFLU  N* * I/O PARAMETER BLOCK FOR OUTPUT*ŠIOS.LSTIOWRIT,IOPCNP,LISTLUN*(* I/O PARAMETER BLOCK TO INPUT FROM FILE*INPOPT„EQU„IOPIMG+IOPBLK+IOPRAN)ŠIOS.INPIOREAD,INPOPT,INPLUN,0,,0,0,BUFL*DEVES…DC.Bƒ'Invaliddevice' ŠDC.Bƒ$0D ŠDC.Bƒ$0A DEVEE…EQU„*-1ŠDS…0*+IOPTMSGS‚DC.Bƒ'Only''I''optionprocessed' ŠDC.Bƒ$0D ŠDC.Bƒ$0AIOPTMSGE‚EQU„*-1ŠDS…0*6NONCS…DC.Bƒ'Invalidsubcommandfornoncontiguousfile' ŠDC.Bƒ$0D ŠDC.Bƒ$0A NONCE…EQU„*-1ŠDS…0**#* MESSAGE FOR INVALID INPUT COMMAND*3SXERR…DC.Bƒ'Legaloptionsininteractivemodeare:' ŠDC.Bƒ$0D ŠDC.Bƒ$0A ŠDC.Bƒ$0D ŠDC.Bƒ$0A4ŠDC.Bƒ'''DS,T''…TodumpfromsectorStosectorT,' ŠDC.Bƒ$0D ŠDC.Bƒ$0A%ŠDC.Bƒ'aleading''$''implieshex.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A3ŠDC.Bƒ'ˆTodumpthenextsectorinsuccession.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A*ŠDC.Bƒ'^‡Todumptheprevioussector.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A4ŠDC.Bƒ'''RS''‡ToreadsectorSintochangebuffer.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A2ŠDC.Bƒ'''S''‰Todisplaythesectorchangebuffer.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A8ŠDC.Bƒ'''FS''‡TofillthesectorchangebufferwithS,' ŠDC.Bƒ$0D ŠDC.Bƒ$0A$ŠDC.Bƒ'Sassumedtobe1-bytehex.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A1ŠDC.Bƒ'''MS''‡ToenterchangemodeatoffsetS,' ŠDC.Bƒ$0D ŠDC.Bƒ$0A2ŠDC.Bƒ'Sintherangefrom0toFF(alwayshex).' ŠDC.Bƒ$0D ŠDC.Bƒ$0A9ŠDC.Bƒ'''W''‰Towritethepreviouslyreadsectorchange'ŠDC.Bƒ'buffer.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A=ŠDC.Bƒ'''WN''‡TowriteouttosectorNachangebufferthat' ŠDC.Bƒ$0D ŠDC.Bƒ$0A3ŠDC.Bƒ'hasnotpreviouslybeenreadin.‚Cannotbe' ŠDC.Bƒ$0D ŠDC.Bƒ$0A'ŠDC.Bƒ'usedwithnoncontiguousfiles.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A@ŠDC.Bƒ'''OUTNAME''‚ToredirectlistingtofileordeviceNAME.' ŠDC.Bƒ$0D ŠDC.Bƒ$0AŠDC.Bƒ'''QUIT''†Toquit.' ŠDC.Bƒ$0D ŠDC.Bƒ$0ASXERRE„EQU„*-1ŠDS…0’EVENBYTEBOUNDARY* NOCHGS„EQU„*,ŠDC.Bƒ'Sectorchangebuffernotreadinyet' ŠDC.Bƒ$0D ŠDC.Bƒ$0ANOCHGE„EQU„*-1ŠDS…0* SCHGBS„EQU„*ŠDC.Bƒ'Sectorchangebuffer:' ŠDC.Bƒ$0D ŠDC.Bƒ$0ASCHGBE„EQU„*-1ŠDS…0*BADBYTES‚DC.Wƒ$0D0AŠDC.Bƒ'Endofsectorreached' ŠDC.Bƒ$0D ŠDC.Bƒ$0ABADBYTEE‚EQU„*-1ŠDS…0**"CHGAOUTS‚EQU„*’CHANGEDISPLAYLINE)ADRAOUTƒDS.Lƒ1’HOLDSMODIFICATIONADDRESS ŠDC.Bƒ'‚'VALAOUTƒDS.Wƒ1’HOLDSVALUE ŠDC.Bƒ'‚' ŠDC.Bƒ'' ŠDC.Bƒ''''QAOUT…DC.Bƒ1’HOLDSASCIIVALUE ŠDC.Bƒ'''' ŠDC.Bƒ'ƒ'CHGAOUTE‚EQU„*-1ŠDS…0* * HEADER LINE* MSGHDR„EQU„* ŠDC.Bƒ'„SN=$'#HEXSEC„DS.Bƒ8’FORHEXSECTORNUMBER ŠDC.Bƒ'‚''DECSEC„DS.Bƒ8’FORDECIMALSECTORNUMBER ŠDC.Bƒ$0DMSGHDREƒEQU„*-1ŠDS…0*.* BUFFER WHERE BODY OF DUMP IMAGE IS FORMATTED* FRMLINEƒEQU„* ŠDC.Bƒ'¦' ŠDC.Bƒ'¦'FRMLGH„EQU„*-FRMLINE* * A LINE FEED* LF2‡DC.Bƒ$0D ŠDC.Bƒ$0AŠDS…0* * FORM FEED*FFS‡DC.Wƒ$200C FFE‡EQU„*-1*"* PRINTER CONTROL FOR PRETTY PRINT*0PRINTERƒDC.Wƒ$FFFFŽNONZEROFORNOPRINTEROUTPUT-BLKOUT„DC.Wƒ0’COUNTOFBLOCKSPRINTEDONPAGE.BLKMAX„DC.Wƒ0’MAX#OFBLOCKSTOPRINTONPAGE'EJCT†DC.Wƒ$FFFFŽFLAGFOREJECTEDORNOT** HEADING AREA*PRHDGS„EQU„*’PRINTERHEADINGŠDC.Bƒ'DUMPVERSION‚'VERSIONƒDS.Bƒ8’FORVERSION ŠDC.Bƒ'‚'&VDATE…DC.Bƒ'XX/XX/XX‚'‡DATEOFLISTING&VTIME…DC.Bƒ'XX:XX:XX‚'‡TIMEOFLISTINGŠDC.Bƒ'DUMPOF'PRHDG2„DCB.B‚132-(*-PRHDGS),''-PRHDGELƒDC.Lƒ0’ENDADDRESSOFPRINTERHEADING*;OVRMSGSƒDC.Bƒ'Outputfileexists-OKtooverwrite(Y/N)?‚'OVRMSGEƒEQU„*-1ŠDS…0*9INOUTS„DC.Bƒ'Error-Inputandoutputnamesarethesame' ŠDC.Bƒ$0D ŠDC.Bƒ$0AINOUTE„EQU„*-1ŠDS…0* * I/O BUFFER*5ŠDS.Bƒ16-((*-B)-((*-B)/16)*16)FORCE16-BYTEBOUNDARY BUFL†EQU„256"BUFS†DS.BƒBUFLPRIMARYDUMPBUFFERBUFE†EQU„BUFS+BUFL-1"RBUF†DS.Bƒ256SECTORCHANGEBUFFER&BUFBEG„DC.Lƒ0’POINTSTOWORKINGBUFFER.BUFDUMPƒDS.Lƒ1’HOLDSBUFFERADDRESSFORFORMAT* DATAENDƒEQU„*ŠPAGEŠOPT„MEX ŠOPT„NOCLH************************************************************************* DUMP CODE AREAH******  ******************************************************************** DUMP†EQU„**ŠLEA„STACK(PC),A7‹INITIALIZESTACKPOINTERŠLEA„B(PC),A5‹BASEREGISTER4ŠMOVEM.LD0-D7/A0-A1,INITREG-B(A5)INITIALREGISTERSŠMOVEM.L(A5),D0-D1ˆVERSION7ŠMOVEM.LD0-D1,VERSION-B(A5)SETUPFORVERSIONMESSAGEŠLEA„BUFS-B(A5),A0ŠLEA„BUFE-B(A5),A1FŠMOVEM.LA0/A1,INPIOS+IOSSAD-B(A5)SETUPBUFFERBOUNDARIESINI/OP.BŠLEA„BUFS-B(A5),A09ŠMOVE.LA0,BUFBEG-B(A5)„POINTTOBUFBEGTOWORKINGBUFFER** INITIALIZE PARAMETER BLOCKSŠLEA„BUFS-B(A5),A0ŠMOVE.LA0,FCHFHS+6-B(A5)ŠLEA„OPINPBUF-B(A5),A0ŠMOVE.LA0,MSGIIOS+12-B(A5)ŠADD.L‚#OPINLGH-1,A0ŠMOVE.LA0,MSGIIOS+16-B(A5)%**************************************.* GET DATE AND TIME SET UP FOR VERSION MESSAGE*%*************************************ŠMOVE.L#GTDTIM,D0ŠLEA„TIMBLK(PC),A0ŠTRAPƒ#1ŠMOVE.LTIMBLK,D0ŠBSR„DATEOJCONVERTTOJULIAN ŠBSR„DATEJGCONVERTTOGREGORIAN*ŠMOVE.LD0,TMPDATE-B(A5)ƒSAVEORDINALDATEŠAND.L‚#$FF,D0ŒMASKTODAY ŠMOVE.L#2,D1ŠLEA„VDATE+3(PC),A0,ŠBSR„BINDECFJ‹CONVERTDAYTOASCIIANDSTUFFŠMOVE.BTMPDATE+2,D0‡GETMONTHŠLEA„VDATE(PC),A0.ŠBSR„BINDECFJ‹CONVERTMONTHTOASCIIANDSTUFFŠMOVE.WTMPDATE,D0‰YEARŠLEA„HOLDDATE(PC),A0+ŠBSR„BINDECCONVERTYEARTOASCIIANDSTUFF&ŠMOVE.WHOLDDATE+2-B(A5),VDATE+6-B(A5) * CONVERT TIME OF DAY INTO ASCII$ŠMOVE.LTIMBLK+4,D1ˆMSPASTMIDNIGHTŠCLR.L‚D0‘HOURCOUNTERTL1‡SUB.L‚#1000*60*60,D1&ŠBCS.S‚TL2BRANCHIFHOURSALLCOUNTEDŠADD.L‚#1,D0ŽACCUMULATEHOURS ŠBRA.S‚TL1/TL2‡ADD.L‚#1000*60*60,D1…TOTAL#HOURSISIND0 ŠMOVE.LD1,D3+ŠLEA„HOLDDATE(PC),A0ˆWHERETODEPOSITASCII,ŠBSR„BINDECCONVERTHOURTOBINARYANDSTUFF$ŠMOVE.WHOLDDATE+2-B(A5),VTIME-B(A5)&ŠDIVUƒ#60*1000,D3ˆ#OFMINUTESIND3.W ŠCLR.L‚D0%ŠMOVE.WD3,D0ŽNUMBEROFMINUTESIND0ŠLEA„HOLDDATE(PC),A0.ŠBSR„BINDECCONVERTMINUTESTOBNARYANDSTUFF&ŠMOVE.BHOLDDATE+2-B(A5),VTIME+3-B(A5)&ŠMOVE.BHOLDDATE+3-B(A5),VTIME+4-B(A5) ŠCLR.W‚D3ŠSWAPƒD3(ŠDIVUƒ#1000,D3‹NUMBEROFSECONDSIND3.W ŠMOVE.WD3,D0ŠLEA„HOLDDATE(PC),A0/ŠBSR„BINDECCONVERTSECONDSTOBINARYANDSTUFF&ŠMOVE.WHOLDDATE+2-B(A5),VTIME+6-B(A5)ŠPAGE** DISPLAY VERSION MESSAGE*ŠLEA„PRHDGS-B(A5),A0ŠLEA„VERSION+7-B(A5),A1 ŠBSR„MSGOUTDISPLAYDUMPVERSIONŠLEA„LF2-B(A5),A0ŠLEA„LF2+1-B(A5),A1 ŠBSR„MSGOUT** PARSE THE COMMAND LINE*,ŠLEA„CLINE(PC),A0‹INPUTCOMMANDLINEADDRESS ŠBSR„PARSE'ŠLEA„B(PC),A5‹REESTABLISHBASEREGISTER ŠTST.L‚D0ŠBPL.S‚CMLOKŽBRANCHONNOERROR/ŠMOVE.L#EM_NVE,D0‰COMPLAINONBADCOMMANDLINE ŠBSR„ERRMSGŠBRA.S‚DUMPEREX CMLOK…EQU„*9ŠMOVEM.LA1-A2,PARSAREG-B(A5)SAVERETURNREGSFROMPARSE*@* ON RETURN FROM PARSE, A1=ADDR OF OUTPUT FIELD OR 0, A2=ADDR OF*‚OPTIONSFIELDOR0.*=* GET US SET UP SO THAT LU LISTLU (3) POINTS TO PROPER OUTPUT*)ŠMOVE.LA1,D0ŽJUSTTOSETCONDITIONCODES7ŠBNE.S‚GETOUTBRANCHIFWEHAVEOUTPUTDEVICESPECIFIED/ŠBSR„SETLSTLU‹CHANGELDFLUNTOLISTLUNANDKEEPŠBRA.S‚DOINPUT GETOUT„EQU„*5ŠBSR.S‚CKINOUTŒCHECKFORINPUT/OUTPUTNAMESDIFFERENTŠBNE.S‚DUMPEREX‹BRANCHIFERROR,ŠBSR„NEWOUTSETUPOPERATORSPECIFIEDOUTPUTŠBMI.S‚DUMPEREX‹BRANCHIFERROR/ŠBHI.S‚DUMPEXIT‹BRANCHONNOOVERWRITESELECTED#ŠBSR„PRTSETGOHANDLEPRINTHEADING*<* GET US SET UP SO THAT LU INPUTLU(1) POINTS TO PROPER INPUT* DOINPUTƒEQU„* ŠBSR„NEWINŠBMI.S‚DUMPEREX‹BRANCHONERROR** NOW PROCESS OPTIONS FIELD* ŠBSR„PROCOPT*,* NOW GO HANDLE THE USERS REQUEST, THEN EXIT* ŠBSR„DOITŠBNE.S‚DUMPEREXDUMPEXIT‚EQU„* ŠCLR.L‚D0 ŠERQ.TERM6DUMPEREX‚ERQ.TERM#0,#$C000ˆERROREXITFROMTHISPOINTŠPAGE%*************************************G* SUBROUTINE TO SEE IF ANY INPUT FILE NAME MATCHES THE OUTPUT FILE NAME*9*ƒEXITSWITHZEROCONDITIONCODESISNOMATCH,NONZEROIFF*ƒINPUTOROUTPUTFIELDCONTAINSMORETHANONEFILENAMEORIFAMATCH,*ƒBETWEENINPUTFILEANDOUTPUTFILEEXISTS. CKINOUTƒEQU„*(ŠLEA„LISTFHS(PC),A6‰POINTTOPARAMTABLE2ŠMOVE.W#'LS',FHSEXT(A6)ƒDEFAULTEXTENSI  ONIS'LS'-ŠBSR„DEFAULTS‹STARTOFOUTPUTFIELDCMNDLINE2ŠMOVE.LOUTPSRT,A0‰STARTOFOUTPUTFIELDCMNDLINE*/* DO EDITFILE TO FILL REMAINING PARAMETER BLOCK ŠBSR„EDITFILE ŠTST.L‚D0 ŠBMI.S‚CMLER1ŠBTSTƒ#0,D0ŽISTHEREANOTHERFILEONOUTPUTPART?"ŠBNE.S‚CMLERŽBRANCHIFYES-ERROR2ŠMOVE.LD0,EDITOUT-B(A5)ƒSAVERETURNFROMEDITFILEŠBTSTƒ#1,D0ŽDEVICE?ŠBNE.S‚NMCHBRANCHIFYES*&ŠLEA„CLINE(PC),A0‹COMMANDLINEADDRESSŠLEA„INPFHS(PC),A6 ŠBSR„DEFAULTS ŠBSR„EDITFILE'ŠLEA„B(PC),A5‹REESTABLISHBASEREGISTERŠMOVE.LA0,EDITSVA0-B(A5)ŠMOVE.LD0,EDITRTN-B(A5)ŠLEA„INPFHS+FHSVOL(PC),A1ŠLEA„LISTFHS+FHSVOL(PC),A2ŠLEA„INPFHS+FHSEXT-B(A5),A0CMPINOUT‚CMPM.W(A1)+,(A2)+ŠBNE.S‚NMCHBRANCHIFNOMATCH ŠCMP.L‚A0,A1ŠBLS.S‚CMPINOUT*%* INPUT FILE = OUTPUT FILE - COMPLAIN8ŠLEA„INOUTS(PC),A0Š'ERROR-INPUTANDOUTPUTNAMESSAME'ŠLEA„INOUTE(PC),A1 ŠBSR„MSGOUT#ŠBSR„CHAINCHK‹EXITIFINCHAINMODE)ŠMOVE.L#1,D0ŽSETUNEQUALCONDITIONCODESŠBRA.S‚CKINRTS*,NMCH†CLR.L‚D0‘ESTABLISHGOODCONDITIONCODESBŠBTSTW‚#0,EDITRTN+2-B(A5)ISTHEREANOTHERFILEONTHEINPUTLINE?ŠBEQ.S‚CKINRTS'CMLER…MOVE.L#EM_NVE,D0‰NONVALIDENTRY0ŠBSR„ERRMSGGOPUTOUTERRORMESSAGEVIAHANDLER#ŠBSR„CHAINCHK‹EXITIFINCHAINMODE'ŠMOVE.L#1,D0ŽSETERRORCONDITIONCODES#ŠBSR„CHAINCHK‹EXITIFINCHAINMODE CKINRTSƒRTSŠPAGE%*************************************B* SUBROUTINE TO SET UP LISTLUN (NORMALLY 3) TO DEVICE SPECIFIED ON*ƒOUTPUTPARAMETER.*D*ƒEXITSWITHZEROCONDITIONCODESIFLUTRANSFERISSUCCESSFUL,PLUSE*ƒCONDITIONCODESIFFILEEXISTSANDOVERWRITEISNOTSELECTED,MINUS *ƒCONDITIONCODESFORFHSERROR.* NEWOUT„EQU„*-ŠMOVE.W#-1,PRINTER-B(A5)‚FLAGASNOTPRINTER6ŠMOVE.LEDITOUT,D0‰SAVEDFROMEDITFILEOFOUTPUTFIELDŠBTSTƒ#1,D0ŽISOUTPUTADEVICE?ŠBNE.S‚YESDEVBRANCHIFYES* TRY TO ASSIGN OUTPUT FILE;NEW05…MOVE.W#FHASGN,LISTFHS+FHSCMD-B(A5)SETUPFORASSIGN3ŠMOVE.W#FOPEW,LISTFHS+FHSOPT-B(A5)EXCLUSIVEWRITEŠLEA„LISTFHS(PC),A0ŠTRAPƒ#3%ŠBEQ.S‚OVRWRITE‹BRANCHIFGOODASSIGN=* ASSIGN FAILED - SEE IF NONEXISTENT FLE AND IF NOT, COMPLAINŠCMP.B‚#FSTANNM,D0$ŠBEQ.S‚ASGALLOŒBRANCHIFNONEXISTENT%ŠCMP.B‚#FSTAAS,D0‰INVALIDASSIGNMENT?'ŠBNE„ASGERRMŒBRANCHIFNO-GOCOMPLAIN!ŠBSR„OUTFREEŒFREETHEOUTPUTFILEŠBNE„NEWERRBRANCHIFERROR'ŠBRA„NEW05ŽGOBACKFORASSIGNMENTAGAIN** ASK IF THEY WISH TO OVERWRITE7OVRWRITE‚LEA„OVRMSGS(PC),A0‰'DOYOUWISHTOOVERWRITE?'ŠLEA„OVRMSGE(PC),A1 ŠBSR„MSGOUT ŠBSR„POUTIN2"ŠBNE„NEWERRBRANCHONPROMPTERRORŠMOVE.BOPINPBUF,D0ˆANSWERŠCMP.B‚#'Y',D0'ŠBNE„NEWAGNBRANCHIFANSWERISNOTYES*B*THEYWISHTOOVERWRITEAFILETHATALREADYEXISTS.‚FREETHEFILE1*ƒANDDELETEIT,THENREALLOCATEITANDASSIGNITŠBSR.S‚OUTFREE ŠBEQ.S‚DELETEBRANCHIFNOERROR ŠBRA.S‚NEWERR*9DELETE„MOVE.W#FHDELT,LISTFHS+FHSCMD-B(A5)DELETECOMMANDŠTRAPƒ#3"ŠBEQ.S‚ASGALLOŒBRANCHIFDELETEOK-ŠBSR„ERRMSGPUTOUTERRORMESSAGEVIAHANDLER ŠBRA.S‚NEWERR** ALLOCATE AND ASSIGN FILE2ASGALLOƒMOVE.W#FHASGN+FHALLO,LISTFHS+FHSCMD-B(A5).ŠCLR.L‚LISTFHS+FHSWCD-B(A5)CLEARKEYSANDLRL3ŠCLR.L‚LISTFHS+FHSSIZ-B(A5)VARIABLELENGTHRECORDS?ŠMOVE.W#FOPSEQ+FOPEW,LISTFHS+FHSOPT-B(A5)SEQ,EXCLUSIVEWRITE ŠBRA.S‚ASGIT*7* NOW DO THE EDITFILE TO FILL REMAINING PARAMETER BLOCK*=YESDEV„AND.W‚#(1<<14+1<<1),D0ƒSEEIFJUST'#'IFOUTPUTFIELDŠCMP.W‚#(1<<14+1<<1),D0!ŠBEQ.S‚YESDEV2ŒBRANCHIFJUST'#'2ŠMOVE.W#FHASGN,LISTFHS+FHSCMD-B(A5)SETUPASSIGN7ŠMOVE.W#FOPPW,LISTFHS+FHSOPT-B(A5)SETUPPUBLICWRITEŠBRA.S‚ASGITŽGOASSIGNIT)YESDEV2ƒBSR„SETLSTLU‹GOCHANGELISTINGLU ŠBRA.S‚ASGOK1** ASSIGN TO LISTLU*ASGIT…LEA„LISTFHS(PC),A0ŠTRAPƒ#3'ŠBEQ.S‚ASGOK1BRANCHIFNOASSIGNERROR%ŠCMP.B‚#FSTAAS,D0‰INVALIDASSIGNMENT?ŠBNE.S‚ASGERRMŒBRANCHIFNOŠBSR.S‚OUTFREEŒFREEOUTPUTFILEŠBNE.S‚NEWERRBRANCHIFERROR$ŠBRA.S‚ASGITŽGOFORASSIGNMENTAGAIN*&* FREE (CLOSE) THE FORMER OUTPUT FILE) OUTFREEƒEQU„*0ŠMOVE.WLISTFHS+FHSCMD-B(A5),-(A7)SAVE  FUNCTION2ŠMOVE.W#FHCLOS,LISTFHS+FHSCMD-B(A5)CLOSECOMMANDŠLEA„LISTFHS-B(A5),A0ŠTRAPƒ#33ŠMOVE.W(A7)+,LISTFHS+FHSCMD-B(A5)RESTOREFUNCTIONŠTST.B‚D0‘TESTRETURNSTATUSŠRTS*ASGERRMƒBSR„ERRMSGŠBRA.S‚NEWERRGETOUTNOW ASGOK1„EQU„**ŠCLR.L‚D0‘SETEQUAL(GOOD)CONDITIONCODES NEWRTS„RTS5NEWAGN„MOVE.L#1,D0ŽSETPLUS(REPEATCONDITIONCODES) ŠBRA.S‚NEWRTS.NEWERR„MOVE.L#-1,D0SETERRORCONTITIONCODES ŠBRA.S‚NEWRTSŠPAGE%*************************************:* SUBROUTINE TO ASSIGN INPUT DEVICE TO INPLUN (NORMALLY 1)9*ƒRETURNSWITHZEROCONDITIONCODESIFSUCCESSFULL,MINUS=*ƒCODESOTHERWISE.‚INCASEOFERROR,ERRORMESSAGEHANDLERIS*ƒCALLEDBEFORERETURNING.* NEWIN…EQU„*"ŠLEA„INPFHS(PC),A6ŠINPUTFHSBLOCK ŠBSR„DEFAULTS)ŠLEA„CLINE(PC),A0‹POINTTOINPUTFILENAME ŠBSR„EDITFILEŠMOVE.LD0,EDITRTN-B(A5) ŠBPL.S‚NEWIN2BRANCHIFNOERROR"ŠMOVE.L#EM_NVE,D0‰NONVALIDENTRY0ŠBSR„ERRMSGGOPUTOUTERRORMESSAGEVIAHANDLERŠBRA„NEWERRTAKEERROREXIT*(* NOW BUILD HEADING LINE BASE UPON INPUT8NEWIN2„LEA„PRHDG2-B(A5),A0„WHERETOPUTCONVERTEDSTRING8ŠLEA„INPFHS+FHSVOL-B(A5),A6WHERETOPICKUPINFORMATIONŠBTSTƒ#1,D0ŽISTHISADEVICE?ŠBEQ.S‚NEWIN3BRANCHIFNO#ŠMOVE.B#'#',(A0)+‰MOVEDEVICENAMEŠMOVE.B(A6)+,(A0)+ŠMOVE.B(A6)+,(A0)+ŠMOVE.B(A6)+,(A0)+ŠMOVE.B(A6)+,(A0)+%ŠBRA.S‚NEWIN4.5‹DONEWITHNAMEMOVING*NEWIN3„MOVE.L#4,D0ŠBSR.S‚MOVBMOVEVOLUMENAMEŠMOVE.W(A6)+,D0‹USERNUMBER1ŠMOVE.L#1,D1ŽSETUPCORRECTFIELDLENGTHFOR...(ŠCMP.W‚#10,D0...USERNUMBER1,2,3OR4 ŠBLO.S‚NEWIN4 ŠMOVE.L#2,D1ŠCMP.W‚#100,D0 ŠBLO.S‚NEWIN4 ŠMOVE.L#3,D1ŠCMP.W‚#1000,D0 ŠBLO.S‚NEWIN4 ŠMOVE.L#4,D13NEWIN4„MOVE.B#':',(A0)+‰SEPARATORFROMVOLUMENAME+ŠBSR„BINDECFJ‹CONVERTANDSTOREUSERNUMBER ŠADD.L‚D1,A0ŠMOVE.B#'.',(A0)+ ŠMOVE.L#8,D0ŠBSR.S‚MOVBMOVECATALOGNAMEŠMOVE.B#'.',(A0)+ ŠMOVE.L#8,D0ŠBSR.S‚MOVBMOVEFILENAMEŠMOVE.B#'.',(A0)+ ŠMOVE.L#2,D0ŠBSR.S‚MOVBMOVEEXTENSIONNAMENEWIN4.5‚EQU„*0ŠMOVE.B#$0D,(A0)ŠTERMINATEWITHCARRIAGERETURN4ŠMOVE.LA0,PRHDGEL-B(A5)ƒSAVEENDOFHEADINGADDRESSŠBRA.S‚NEWIN9.5*6MOVB†CMP.B‚#'',(A6)ŠMOVEEVERYTHINGEXCEPTBLANKS...-ŠBEQ.S‚MOVADVA6‹...FROM(A6)TO(A0)FOR...$ŠMOVE.B(A6),(A0)+‰...ACOUNTOFD0MOVADVA6‚ADD.L‚#1,A6 ŠSUB.L‚#1,D0 ŠBNE.S‚MOVBŠRTS** NOW ASSIGN THE INPUT DEVICE*2NEWIN9.5‚LEA„INPFHS(PC),A0ŠPARAMETERBLOCKADDRESSŠTRAPƒ#37ŠBNE.S‚CKDEVICE‹BRANCHONBADASSIGN-CHECKFORDEVICE+ŠMOVE.LEDITRTN,D1‰SEEIFDEVICEASSIGNMENT'ŠAND.B‚#$2,D1WASITDEVICEASSIGNMENT?ŠBNE.S‚DEVICEBRANCHIFYES"ŠBRA„ASGOKŽBRANCHONOKASSIGNMENT*C* ASSIGNMENT WAS IN ERROR, IF THIS WAS A DEVICE ASSIGNMENT, WE MUST;*ƒTRYTOCONVERTTHEASSIGNMENTTOAVOLUMETYPEASSIGNMENT*.CKDEVICE‚MOVE.LEDITRTN,D1‰FLAGSFROMEDITFILE)ŠAND.B‚#$2,D1WASITADEVICEASSIGNMENT?+ŠBNE.S‚NEWIN9.8‹BRANCHIFDEVICEASSIGNMENTŠBSR„ERRMSGCOMPLAINŠBRA„DUMPEREX‹ERROREXIT*<* CONVERT DEVICE ASSIGNMENT TO VOLUME ASSIGNMENT IF POSSIBLE7*ƒFIRSTGETTHEVOLUMENAMEASSOCIATEDWITHTHEDEVICE.*1NEWIN9.8‚LEA„FCHFHS(PC),A0ŠFETCHDEVICEMNEMONICS(ŠTRAPƒ#3‘GOGETLISTOFDEVICEVSVOLUMEŠBNE„NEWERRBRANCHONERROR*,ŠMOVE.LINPFHS+FHSVOL,D0ƒPICKUPDEVICENAME'ŠMOVE.WFHSLEN(A0),D1†NUMBEROFENTRIES+ŠLEA„BUFS(PC),A0ŒBEGINNINGOFRETURNBUFFER2CHKDEV„CMP.L‚FDVDEV(A0),D0†SEEIFTHISONEMATCHESŠBEQ.S‚FOUNDVOL-ŠADD.L‚#FDVLEN,A0‰NO,SEEIFANYMOREENTRIES ŠSUB.W‚#1,D1*ŠBNE.S‚CHKDEVBRANCHIFMORELISTTOCHECK2ŠLEA„DEVES(PC),A0‹COMPLAINOFBADDEVICESPECIFIEDŠLEA„DEVEE(PC),A1 ŠBSR„MSGOUT&ŠBSR„CHAINCHK‹EXITIFCHAINPROCESSINGŠBRA„NEWERRGETOUTNOW*6FOUNDVOL‚CMP.L‚#0,FDVVOL(A0)†ANYVOLUMETHERE?…101684(ŠBNE.S‚FOUNDVL1‹YES,USEVOLNAME†101684CŠAND.W#$FFFF-FOPABF,INPFHS+FHSOPT-B(A5)NOCLEARSHAREDBIT101684ŠBRA.S‚DEVONLY5FOUNDVL1‚MOVE.LFDVVOL(A0),INPFHS+FHSVOL-B(A5)Œ1016847DEVONLYƒLEA„INPFHS(PC),A0ŠGOTRYASSIGNMENTAGAIN101684ŠTRAPƒ#3!ŠBNE„ASGERRMŒGOCOMPLAINIFERROR*  *‚DEVICEBETTERSUPPORTRANDOM*DEVICE„LEA„INPFHS(PC),A0+ŠMOVE.W(A0),-(A7)‰SAVEOLDCOMMAND/OPTIONS5ŠMOVE.W#FHRATT,(A0)‡FETCHATTRIBUTESCOMMAND/OPTIONSŠTRAPƒ#3!ŠBEQ.S‚DEVICE2ŒBRANCHIFNOERROR ŠBSR„ERRMSG ŠBRA„NEWERR5DEVICE2ƒMOVE.W(A7)+,(A0)‰RESTOREOLDCOMMAND/OPTIONS,ŠBTSTW‚#3,FHSWCD(A0)†DOESITSUPPORTRANDOM?7ŠBNE.S‚CONTGŽBRANCHIFYES-DEVASGNALWAYSCONTIGUOUS4ŠMOVE.L#EM_NVE,D0‰NO-SOCOMPLAINOFINVALIDENTRY ŠBSR„ERRMSGŠBRA„NEWERRERROREXIT* ASGOK…EQU„*,ŠMOVE.BINPFHS+FHSFIL,D0ƒTESTFORCONTIGUOUS2ŠCMP.B‚#'',D0ŒIF1STCHAROFFILE=''THENCONTG!ŠBEQ.S‚CONTGŽBRANCHIFCONTIGUOUS ŠMOVE.WINPFHS+FHSOPT,D0ƒOPTIONS-ŠAND.W‚#FFTBIT,D0‰CHECKFORCONTIGUOUSORNOTŠCMP.W‚#FOPCON,D0!ŠBEQ.S‚CONTGŽBRANCHIFCONTIGUOUS-ŠMOVE.B#1,NONCONTG-B(A5)‚FLAGNONCONTIGUOUS*:ŠMOVE.LINPFHS+FHSSAD,INPIOS+IOSSAD-B(A5)SHAREDSEGSTART<ŠMOVE.LINPFHS+FHSEAD,INPIOS+IOSEAD-B(A5)BUFFERENDADDRESS*D* COMPUTE NUMBER OF BLOCKS (256 BYTE) IN THE SEGMENT - SAVE IN BKCNT5ŠMOVE.LINPFHS+FHSEAD,D0ƒADDROFLASTBYTEOFSEGMENT#ŠADD.L‚#1,D0ŽROUNDTOPAGEBOUNDARY<ŠSUB.L‚INPFHS+FHSSAD,D0ƒSUBTRACTSTARTINGADDRESSOFSEGMENT.ŠLSR.L‚#8,D0ŽCONVERTBYTECOUNTTOBLOCKCOUNT0ŠMOVE.WD0,BKCNT-B(A5)…SAVEFORFUTUREREFERENCE* CONTG…EQU„**)ŠCLR.L‚D0‘MAKESUCCESSFULCONDITIONCODESŠRTS%*************************************F* SUBROUTINE TO PUT DEFAULT VALUES INTO FHS PARAMETER BLOCK POINTED TO*ƒBYA6.*DEFAULTS‚EQU„*-ŠMOVE.WUSERNUM+2,FHSUSN(A6)DEFAULTUSERNUM%ŠMOVE.LVOLNAM,FHSVOL(A6)‚VOLUMENAME&ŠMOVE.LCATNAM,FHSCLG(A6)‚CATALOGNAME2ŠMOVE.LCATNAM+4,FHSCLG+4(A6)2NDPARTOFCATNAMEŠRTS%*************************************A* SUBROUTINE TO CHANGE LOGICAL UNIT NUMBER FROM LDFLUN TO LISTLUN *ƒWITHKEEP.*SETLSTLU‚EQU„*ŠBSR„OUTFREEŒFREELU#3ŠLEA„LDFLSTLU(PC),A0ŠTRAPƒ#3 ŠBEQ.S‚SETRTS&ŠBSR„ERRMSGCOMPLAINANDEXITIFERROR ŠBRA„DUMPEREXSETRTS„RTS„BACKTOCALLER** PROCESS OPTIONS FIELD* PROCOPTƒEQU„*(ŠMOVE.LOPTSRT,A2ŠSTARTOFOPTIONSFIELD$ŠMOVE.LA2,D0ŽTOSETCONDITIONCODES"ŠBEQ.S‚OPTOVRBRANCHIFNOOPTIONS NXTOPT„EQU„* ŠBSR„OPTION1ŠCMP.B‚#$40,D0ŒHAVEWEFINISHEDWITHTHEOPTIONS?'ŠBEQ.S‚OPTOVRBRANCHIFNOMOREOPTIONSŠBTSTƒ#7,D0ŽOPTIONERROR?ŠBEQ.S‚NXT0BRANCHIFNO*ŠMOVE.L#EM_NVO,D0‰COMPLAINOFBADOPTIONS!ŠBSR„ERRMSGPUTOUTERRORMESSAGEŠBRA„DUMPEREX‹ERROREXIT,NXT0†CMP.B‚#'I',D1ŒISINTERACTIVESPECIFIED?(ŠBNE.S‚NXT1BRANCHIFNOTONTHISOPTION2ŠMOVE.LD1,INTRACT-B(A5)ƒFLAGFORINTERACTIVEMODE%ŠBGE.S‚NXTOPTBRANCHIFNOMINUSSIGN6ŠCLR.L‚INTRACT-B(A5)†-IWASSPECIFIED-SAMEASDEFAULT ŠBRA„NXTOPT NXT1†EQU„**ŠCMP.B‚#'S',D1ŒWASSTARTSECTORSPECIFIED?(ŠBNE.S‚NXT2BRANCHIFNOTONTHISOPTION2ŠMOVE.LD3,SRTSEC-B(A5)„INITIALIZESTARTINGSECTOR6ŠMOVE.LD1,STOPT-B(A5)…FLAGSTARTOPTIONSASSPECIFIED ŠBRA„NXTOPT NXT2†EQU„*.ŠCMP.B‚#'T',D1ŒWASTERMINATESECTORSPECIFIED?*ŠBNE.S‚BADOPTBRANCHIFNOTONTHISOPTION0ŠMOVE.LD3,ENDSEC-B(A5)„INITIALIZEENDINGSECTOR3ŠMOVE.LD1,STOPT-B(A5)…FLAGENDOPTIONASSPECIFIEDŠBRA„NXTOPTGOFORNEXTOPTION BADOPT„EQU„*ŠMOVE.L#EM_NVO,D0 ŠBSR„ERRMSGDISPLAY'BADOPTION'ŠBRA„DUMPEREX‹ERROREXIT5OPTOVR„TST.L‚INTRACT-B(A5)†WASINTERACTIVESPECIFIED?ŠBEQ.S‚OPTRTSBRANCHIFNO3ŠTST.L‚STOPT-B(A5)ˆYES-WASSORTALSOSPECIFIED?ŠBEQ.S‚OPTRTSBRANCHIFNO:ŠLEA„IOPTMSGS(PC),A0ˆYES-TELLTHEMONLY'I'WASACCEPTEDŠLEA„IOPTMSGE(PC),A1ŠBSR„MSGOUTPUTOUTMESSAGE,ŠMOVE.L#-1,SRTSEC-B(A5)ƒUNINITIALIZESRTSEC1ŠMOVE.L#$7FFFFFFF,ENDSEC-B(A5)UNITIALIZEENDSECŠCLR.L‚STOPT-B(A5) OPTRTS„RTS%*************************************=* SUBROUTINE TO FETCH DEVICE ATTRIBUTES AND SET UP PARAMETERS;*ƒFORPRETTYPRINTIFOUTPUTDEVICESPECIFIEDWASAPRINTER* PRTSET„EQU„*9ŠMOVE.W#FHRATT,LISTFHS-B(A5)MAKECODEANDOPTIONSRIGHT&ŠLEA„LISTFHS(PC),A0‰RECEIVEATTRIBUTESŠTRAPƒ#3%ŠBEQ.S‚PRTSETOK‹BRANCHONGOODRETURN-ŠBSR„ERRMSGDISPLAYERRO  RMESSAGEVIAHANDLER ŠBRA„DUMPEREX*1PRTSETOK‚MOVE.WLISTFHS+FHSWCD,D0‚ATTRIBUTESWORDŠBTSTƒ#9,D0ŽWASITAPRINTER?"ŠBEQ.S‚PRTSETXŒEXITIFNOTPRINTER$ŠCLR.W‚PRINTER-B(A5)†FLAGASPRINTER-ŠMOVE.LLISTFHS+FHSSIZ,D0‚LINECOUNTPERPAGE(ŠSUB.L‚#2,D0ŽACCOUNTFORPRINTERHEADINGŠDIVUƒ#19,D0BLOCKSIZEŠSUB.W‚#1,D0ŽMAKEZERORELATIVE7ŠMOVE.WD0,BLKMAX-B(A5)„NUMBEROFPRINTBLOCKSPERPAGE.ŠMOVE.WD0,BLKOUT-B(A5)„FORCELATERPAGEEJECT(ŠLEA„PRHDGS(PC),A0†HEADINGSTARTADDRESS,ŠMOVE.LPRHDGEL-B(A5),D0ƒHEADINGENDADDRESS(ŠSUB.L‚A0,D0ŽD0=OURHEADINGLENGTH-15ŠSUB.L‚LISTFHS+FHSLRL(PC),D0ISMAXLGTH>OURLGTH?!ŠBLT.S‚PRTSETXŒBRANCHIFYES-OK ŠADD.L‚#1,D07ŠSUB.L‚D0,PRHDGEL-B(A5)ƒCORRECTOURHEADINGENDADDRESS PRTSETXƒRTSŠPAGE***-* DRIVER FOR INTERACTIVE DIALOGUE AND DUMPING* DOIT†EQU„*+ŠMOVE.LSRTSEC,D1ŠINITIALIZEREGPARAMETERS(ŠMOVE.LENDSEC,D2ŠWITHSECTORBOUNDARIESDOITLOOP‚EQU„*4ŠTST.L‚INTRACT-B(A5)†WASINTERACTIVEMODESPECIFIED?ŠBNE.S‚CKSTOPTŒBRANCHIFYES.ŠTST.L‚DUMPED-B(A5)‡HAVEWEDUMPEDONCEBEFOREŠBNE„OKEXBRANCHIFSO3ŠMOVE.L#1,DUMPED-B(A5)„MARKASNOTFIRSTTIMETHRU4ŠCMP.L‚#-1,SRTSEC-B(A5)ƒHASSRTSECBEENINITIALIZED?ŠBNE„FILLITBRANCHIFYES&ŠCLR.L‚SRTSEC-B(A5)‡NO-SOINITIALIZE ŠCLR.L‚D1ŠBRA„FILLITGOFILLBUFFER CKSTOPTƒEQU„*0ŠTST.L‚STOPT-B(A5)ˆWERESECTORLIMITSSPECIFIED?3ŠBEQ.S‚PROMPTBRANCHIFDEALTWITHORNOTSPECIFIED+ŠCLR.L‚STOPT-B(A5)ˆCLEARFORNEXTTIMETHRUŠBRA„FILLITGOFILLBUFFER:*********************************************************** BREAK SERVICE COMES HERE* BREAKSVƒEQU„*ŠLEA„B(PC),A5‹REBASEA5-ŠMOVE.LSAVSTACK-B(A5),A7‚RESETSTACKPOINTER%ŠTST.L‚INTRACT-B(A5)†INTERACTVEMODE?'ŠBEQ„DUMPEREX‹BRANCHIFNO-ERROREXITŠLEA„ASQBUFF-B(A5),A0!ŠMOVE.L#RDEVNT,D0‰READTHEEVENTŠTRAPƒ#1ŠLEA„LF2-B(A5),A0 ŠMOVE.LA0,A1 ŠADD.L‚#1,A1 ŠBSR„MSGOUTŠBRA.S‚PROMPTA*:********************************************************** PROMPT„EQU„*/ŠTST.B‚ASQDUN-B(A5)‡HAVEWEALLOACATEDTHEASQ?ŠBEQ.S‚PROMPTAŒYES-SOBRANCH*6* ALLOCATE ASQ AND CLAIM BREAK SERVICE FIRST TIME THRU,ŠBTSTƒ#0,SAVD7+3-B(A5)ƒISINPUTINTERACTIVE?8ŠBEQ.S‚PROMPTAŒBRANCHIFYES-NOBREAKSERVICEREQUIRED<ŠMOVE.LINITA0-B(A5),ASQ1-B(A5)INITIALIZETASKNAMEINP.B.)ŠCLR.B‚ASQDUN-B(A5)‡MARKASQASALLOCATEDŠLEA„ASQ1-B(A5),A0ŠLEA„ASQBUFF-B(A5),A1"ŠMOVE.LA1,18(A0)ŠPLUGINASQADDRŠMOVE.L#GTASQ,D0ŠTRAPƒ#1'ŠBEQ.S‚ASQOKŽBRANCHIFASKALLOCATEDOK ŠBSR„ERRMSGŠBRA„DUMPEREX‹ERROREXITASQOK…LEA„MSGIIOS-B(A5),A08ŠMOVE.L#(IOBRKS<<16)+IOPCAD,(A0)BREAKSVC,SVCADDRESSŠLEA„BREAKSV(PC),A1‰ASRADDRESSŠMOVE.LA1,24(A0)ŠTRAPƒ#2‘CLAIMBREAKSERVICE#ŠBEQ.S‚BREAKOKŒBRANCHIFGOODCLAIM.ŠBSR„ERRMSGCOMPLAINVIAERRORMESSAGEHANDLER ŠBRA„DUMPEREX BREAKOKƒEQU„*5ŠMOVE.W#IOREAD,MSGIIOS-B(A5)RESTOREFORMERFUNCTION,ŠMOVE.LA7,SAVSTACK-B(A5)‚SAVESTACKPOINTER*/PROMPTAƒBSR„POUTINOUTPUTPROMPT-WAITFORINPUT(ŠBSR„DECODEDECODEINPUTOFFORM$10,$13ŠBRA.S‚INPOKŽOKRETURNŠBRA.S‚OKEXTERMINATIONRETURN'ŠBRA„PROMPTGIVEANOTHERCHNCETOINPUT*OKEX.ŠBRA.S‚DOITEXGD‹EXITWITHGOODCOMPLETIONCODE0INPOK…MOVE.WBLKMAX,BLKOUT-B(A5)FORCEFORMFEED*C* D1 CONTAINS BEGINNING SECTOR ADDRESS, D2 CONATINS ENDING SEC ADDR* FILLIT„EQU„*0ŠBSR„FILLBUFŒFILLTHEI/OBUFFERWITHONESECTORŠCMP.B‚#ISTACRC,D0ˆCRCERROR?ŠBNE.S‚FILLIT23ŠBSR„ERRMSGCOMPLAINOFCRCERRORBUTTREATASGOODŠBRA.S‚FILLIT4FILLIT2ƒTST.B‚D0*ŠBNE.S‚FILLCHKŒGOHANDLEIFBADI/OSTATUS;FILLIT4ƒTST.B‚NONCONTG-B(A5)…WASTHISANONCONTIGUOUSFILE?ŠBNE.S‚FILLRRNŒBRANCHIFYESŠBRA.S‚FILLOKNOSOWE'REOK* FILLCHKƒEQU„*&ŠCMP.B‚#ISTAEOF,D0ˆWASITENDOFFILE?ŠBNE.S‚NOTEOFBRANCHIFNO-ŠBSR„ERRMSGDISPLAY'ENDOFFILE'VIAHANDLER ŠBRA„DOITLOOP NOTEOF„EQU„*(ŠCMP.B‚#ISTARR,D0‰WASITANINVALIDRRN?/ŠBNE.S‚FILLERRŒBRANCH‚IFNOT-CANTHELPUSNOW*/*DEALWITHINVALIDRANDOM‚RECORDNUMBERERROR.;*ƒIFWEAREDE  ALINGWITHANONCONTIGUOUSFILE,THENCORRECT%*ƒBUFBEGTOPOINTTOTHECORRECTRRN.*0ŠTST.B‚NONCONTG-B(A5)…ISTHISACONTIGUOUSFILE?.ŠBEQ.S‚FILLERRŒBRANCHIFSO-AREALRRNERROR* FILLRRNƒEQU„*ŠMOVE.LD1,D3ŽRRNTODUMPŠDIVUƒBKCNT(PC),D3 ŠCLR.W‚D3ŠSWAPƒD3‘D3.L=RRNMODBKCNT%ŠLSL.L‚#8,D3Ž*256FORBYTESKIPCOUNT+ŠADD.L‚INPFHS+FHSSAD,D3ƒADDSHAREDSEGBASE<ŠMOVE.LD3,BUFBEG-B(A5)„THEREALBEGINNINGOFWORKINGBUFFERŠBRA.S‚FILLOKPROCEEDNORMALLY*FILLERRƒEQU„*’AREALERRORŠBSR„ERRMSGGOTELLOFBADI/OŠBRA„DOITLOOP‹GETOUTOFHERE* FILLOK„EQU„*5ŠMOVE.LBUFBEG,BUFDUMP-B(A5)ADDRESSOFBUFFERTOUSE-ŠBSR„FORMATGOPUTFORMATTEDOUTPUTONSCREEN(ŠBNE.S‚DOITEXBD‹GETOUTOFHEREONERROR FORMOK„EQU„*!ŠADD.L‚#1,D1ŽBUMPFORNEXTSECTORŠCMP.L‚D2,D1ŽAREWEDONEŠBLS„FILLITGOFORMOREIFNOT ŠBRA„DOITLOOP‹GOASKFORANOTHERDOITEXBD ŠMOVE.LD0,-(A7)‹SAVEERRORCODE$ŠBSR.S‚PAPEJCTŒEJECTPAPERIFNEEDED'ŠMOVE.L(A7)+,D0‹RESTORECONDITIONCODEŠRTS—EXITWITHERRORDOITEXGD‚EQU„*$ŠBSR.S‚PAPEJCTŒEJECTPAPERIFNEEDEDŠCLR.L‚D0‘GOODEXITŠRTSPAPEJCT$ŠTST.W‚EJCT-B(A5)‰DOWEEJECTPAPER?ŠBNE.S‚DEXITŽBRANCHIFNOTŠLEA„FFS(PC),A0EJECTTHEPAPERŠLEA„FFE(PC),A1 ŠBSR„IMGOUT DEXIT…EQU„*ŠRTS%*************************************;* SUBROUTINE TO DECODE OPERATOR INPUT OF THE FORM 'D 12,15'3*ƒORR15,ORW,ORM3366FF99.‚INCASEOFDISPLAY@*ƒSTARTINGSECTOR#PLACEDINTOSRTSECANDD1,ENDSECTOR#INTO=*ƒD2.‚STATUSRETURNEDIND0WILLBE0FORGOODSTATUS,-1FOR:*ƒTERMINATION(INPUTOF'Q').‚INCASEOFR,W,MOR'HELP''*ƒTHERETURNISALWAYSTOLABELPROMPT.* DECODE„EQU„*5ŠCLR.L‚CHRPTR-B(A5)‡SETUSTOBEGINNINGOFINPUTLINEŠLEA„OPINPBUF(PC),A0ŠLEA„OPINPBUF+OPINLGH(PC),A1(ŠCMP.B‚#$0D,(A0)ŠJUSTACARRIAGERETURN?+ŠBNE.S‚CHKUPANO-SOGOCHECKFORUPARROW+ŠADD.L‚#1,SRTSEC-B(A5)„BUMPSTARTINGSECTOR4GODUMP„MOVE.LSRTSEC,ENDSEC-B(A5)GODUMPONESECTOR ŠBRA„CMPSTED#CHKUPA„CMP.B‚#'^',(A0)ŠISITA'^'?ŠBNE.S‚NOTUPŽBRANCHIFNO0ŠCMP.L‚#-1,SRTSEC-B(A5)ƒUPARROWNOTALLOWED...$ŠBEQ„NVE...IFSECTORCURRENTLY..."ŠTST.L‚SRTSEC-B(A5)‡...IS0OR-1ŠBEQ„NVE6ŠSUB.L‚#1,SRTSEC-B(A5)„SETUPFORPREVIOUSSECTORDUMP2ŠBRA.S‚GODUMPDON'TLETSECTORNUMBERDROPBELOW0*NOTUP…BSR„BLNKSKP ŠCLR.L‚D1ŠMOVE.L#'„',D0?DECODE1ƒCMP.B‚#'',0(A0,D1)†MOVECOMMANDINTOD0-BLANKFILLED-ŠBEQ.S‚DECODE3ŒBRANCHIFATENDOFSUBCOMMAND3ŠCMP.B‚#$0D,0(A0,D1)†AREWEATTHEENDOFTHELINE?ŠBEQ.S‚DECODE3ŒBRANCHIFYESŠROL.L‚#8,D0ŽNO-SO...2ŠMOVE.B0(A0,D1),D0ˆ...MOVENEWCHARACTERINTOD0 ŠADD.W‚#1,D1$ŠBRA.S‚DECODE1ŒGOFORNEXTCHARACTER7DECODE3ƒSUB.L‚#1,D1ŽD1POINTSTOLASTLETTEROFCOMMANDŠMOVE.LD1,CHRPTR-B(A5)ŠCMP.L‚#'HELP',D0ŠBNE.S‚NOTHELP'ŠLEA„SXERR(PC),A0‹TELLTHEMTHEOPTIONSŠLEA„SXERRE(PC),A1 ŠBSR„MSGOUTŠBRA„DECPRMPT‹RETURNTOPROMPT*-NOTHELPƒCMP.L‚#'OUT',D0‰ISIT'OUT'COMMAND?ŠBNE.S‚NOTOUTBRANCHIFNO<ŠLEA„OPINPBUF+3-B(A5),A0PREPAREFORPROCESSINGOUTPUTFIELDOUTC4…ADD.L‚#1,A0%ŠCMP.B‚#$0D,(A0)ŠCARRIAGERETURNYET?!ŠBEQ„DECERRBRANCHIFYES-ERROR*ŠCMP.B‚#'',(A0)ŠBYPASSINTERVENINGBLANKS ŠBEQ.S‚OUTC43ŠMOVE.LA0,OUTPSRT-B(A5)ƒSAVESTARTOFOUTPUTFIELD,ŠBSR„CKINOUTŒCHECKFORINPUT/OUTPUTTHESAMEŠBNE„DECPRMPT‹BRANCHIFERRORŠBSR„NEWOUTASSIGNNEWOUTPUTŠBEQ.S‚OUTC6ŽBRANCHIFOK.ŠBPL„DECPRMPT‹BRANCHIFOVERWRITENOTSELECTEDŠBSR„CHAINCHK‹EXITONCHAIN ŠBRA„DECPRMPT'OUTC6…BSR„PRTSETSETPRINTERATTRIBUTES%ŠBRA„DECPRMPT‹BRANCHIFGOODORERROR*NOTOUT„CMP.B‚#'Q',(A0)ŠBNE.S‚DCHECKBRANCHIFNO!ŠADD.L‚#2,(A7)ŒTERMINATIONRETURN%ŠBRA„DECODEXT‹GETOUTOFTHISROUTINE* DCHECK„EQU„**ŠCMP.B‚DUMPCHR,D0‰AREWESUPPOSEDTODUMP?ŠBNE„RCHECKBRANCHIFNO-ŠADD.L‚#1,CHRPTR-B(A5)„BUMPCHARACTERPOINTER)ŠCLR.L‚SRTSEC-B(A5)‡STARTINGSECTORINPUT'ŠCLR.L‚ENDSEC-B(A5)‡ENDINGSECTORINPUT4ŠMOVE.W#10,RADIX-B(A5)„DEFAULTRADIXFORCONVERSION,ŠMOVE.L#-2,A1A1ISNOTUSEDASENDPOINTER#ŠBSR„ASCBINCONVERTASCIITOBINARYŠBNE.S  ‚DECERRBRANCHIFERROR/ŠMOVE.LD1,SRTSEC-B(A5)„DEPOSITCONVERTEDVALUE:ŠLEA„OPINPBUF(PC),A1ˆINPUTBUFFERFORINTERACTIVEDIALOGUE)ŠADD.L‚CHRPTR,A1ŠADDINCHARACTERPOINTER*ŠCMP.B‚#',',(A1)ŠSEPARATORBETTERBECOMMAŠBEQ.S‚COMMAOK-ŠCMP.B‚#'',(A1)ŠSPACEISOKINSTEADOFCOMMAŠBNE.S‚DCHECK44ŠMOVE.B#',',(A1)ŠFORCECOMMAIFDELIMETERWASSPACEŠBRA.S‚COMMAOK'DCHECK4ƒLEA„OPINPBUF-B(A5),A0‚NOTCOMMA ŠSUB.L‚A0,A13ŠSUB.L‚MSGIIOS+IOSLEN,A1‚ISTHEREMOREINTHELINE? ŠCMPA.W#0,A1ŠBNE.S‚DECERRERRORIFSOŠMOVE.LD1,ENDSEC-B(A5) ŠBRA.S‚DECOK COMMAOKƒEQU„*-ŠADD.L‚#1,CHRPTR-B(A5)„BUMPCHARACTERPOINTER4ŠMOVE.W#10,RADIX-B(A5)„DEFAULTRADIXFORCONVERSION,ŠMOVE.L#-2,A1A1ISNOTUSEDASENDPOINTER#ŠBSR„ASCBINCONVERTASCIITOBINARY ŠBNE.S‚DECERR2ŠMOVE.LD1,ENDSEC-B(A5)„STUFFENDINGSECTORNUMBER&ŠBSR„EXGRBG2ŒSEEIFOKTOENDOFINPUTŠBEQ.S‚CMPSTEDŒBRANCHIFYESDECERR„MOVE.L#EM_NVE,D0 ŠBSR„ERRMSGŠADD.L‚#4,(A7)ŒERROREXIT#ŠBSR„CHAINCHK‹EXITIFINCHAINMODEŠBRA.S‚DECODEXT CMPSTEDƒEQU„*ŠMOVE.LSRTSEC,D0 ŠCMP.L‚ENDSEC,D0ŠISSTART<=ENDŠBLS.S‚DECOKŽBRANCHIFYESŠBRA.S‚DECERRERROREXIT DECOK…EQU„*8ŠMOVEM.LSRTSEC,D1-D2†INITIALIZED1,D2WITHBINARYINPUT DECODEXT‚RTS* RCHECK„EQU„*/ŠCMP.B‚#'R',D0ŒDOWEREADSECTORCHANGEBUFFER?ŠBNE„SCHECKBRANCHIFNOŠADD.L‚#1,CHRPTR-B(A5)ŠMOVE.LCHRPTR,A0ŠLEA„OPINPBUF-B(A5),A14ŠADD.L‚A1,A0ŽA0POINTSTOBEGINNINGOFSPACETOSCAN8ŠLEA„OPINLGH(A0),A1…A1POINTSTOENDINGOFSPACETOSCAN#ŠBSR„BLNKSKPŒADVANCEA0TONONBLANKŠMOVE.LA0,D7ŽTEMPORARYŠLEA„OPINPBUF-B(A5),A1 ŠSUB.L‚A1,D74ŠMOVE.W#10,RADIX-B(A5)„DEFAULTRADIXFORCONVERSION,ŠMOVE.L#-2,A1A1ISNOTUSEDASENDPOINTER+ŠBSR„ASCBINCONVERTSECTORNUMBERTOBINARYŠBNE.S‚NVEBRANCHIFERROR$ŠBSR„EXGRBG2ŒSEEIFTRAILINGGARBAGEŠBNE.S‚NVEBRANCHIFSO.ŠCMP.L‚CHRPTR,D7ŠSEEIFANYNUMBERWASENTERED!ŠBNE.S‚RCHECK1ŒBRANCHIFYES-OK0NVE‡MOVE.L#EM_NVE,D0‰TELLTHEMOFINVALIDINPUT ŠBSR„ERRMSG ŠBSR„CHAINCHK ŠBRA„DECPRMPT;RCHECK1ƒMOVE.LD1,RSEC-B(A5)†SECTORNUMBEROFCHANGEBUFFER*"* READ IN THE SECTOR CHANGE BUFFER0ŠTST.B‚NONCONTG-B(A5)…ISTHISACONTIGUOUSFILE?ŠBEQ.S‚RCNTGŽBRANCHIFYES&ŠBSR„FILLBUFŒREADUSINGSHAREDSEGMENTŠCMP.B‚#ISTACRC,D0%ŠBNE.S‚RTSTIOBRANCHIFNOTCRCERROR3ŠBSR„ERRMSGCOMPLAINOFCRCERRORBUTTREATASGOOD ŠBRA.S‚RSTIO1*RCNTG…LEA„RBUF-B(A5),A1>ŠMOVE.LA1,INPIOS+IOSSAD-B(A5)SETUPBUFFERBEGINNINGADDRESSŠADD.L‚#BUFL-1,A1-ŠMOVE.LA1,INPIOS+IOSEAD-B(A5)ENDINGADDRESS ŠBSR„FILLBUFŠLEA„BUFS-B(A5),A1>ŠMOVE.LA1,INPIOS+IOSSAD-B(A5)RESTOREOLDBUFFERBASEADDRESSŠLEA„BUFE-B(A5),A1?ŠMOVE.LA1,INPIOS+IOSEAD-B(A5)RESTOREOLDBUFFERLIMITADDRESSŠCMP.B‚#ISTACRC,D0%ŠBNE.S‚RTSTIOBRANCHIFNOTCRCERROR'ŠBSR„ERRMSGCOMPLAINOFCRCVIAHANDLERŠBRA.S‚RSTIO1BUTTREATASGOOD*"RTSTIO„TST.B‚D0‘TESTSTATUSOFI/O*ŠBNE.S‚RRNOKŽBRANCHIFI/OSTATUSNOTGOOD6RSTIO1„TST.B‚NONCONTG-B(A5)…ISTHISACONTIGUOUSFILE?ŠBNE.S‚RRRNBRANCHIFNOŠBRA.S‚RROKBRANCHIFYES*7* I/O STATUS BAD - CHECK FOR END OF FILE OR INVALID RRN+RRNOK…CMP.B‚#ISTAEOF,D0ˆWASITENDOFFILE?ŠBNE.S‚RNOTEOFŒBRANCHIFNO-ŠBSR„ERRMSGDISPLAY'ENDOFFILE'VIAHANDLER ŠBRA„DECPRMPT/RNOTEOFƒCMP.B‚#ISTARR,D0‰WASITANINVALIDRRN?ŠBNE„DFLERRBRANCHIFNO*&* DEAL WITH RANDOM RECORD NUMBER ERROR>*ƒIFWEAREDEALINGWITHANONCONTIGUOUSFILETHENMOVESECTOR*ƒIMAGEINTORBUF0ŠTST.B‚NONCONTG-B(A5)…ISTHISACONTIGUOUSFILE?,ŠBEQ„FILLERRŒBRANCHIFSO-AREALRRNERROR/RRRN†MOVE.LINPIOS+IOSRRN,D3ƒFIRSTRRNOFBLOCK.ŠMOVE.LD3,RFRRN-B(A5)…SAVEFORFUTURECOMPARE5ŠSUB.L‚RSEC,D3Œ#OFRECORDSWENEEDTOSKIPINBUFFERŠNEG.L‚D3‘INSURESIGNISRIGHT%ŠLSL.L‚#8,D3Ž*256FORBYTESKIPCOUNT+ŠADD.L‚INPFHS+FHSSAD,D3ƒADDSHAREDSEGBASE7ŠMOVE.LD3,RSEG-B(A5)†SAVEADDRESSINSEGMENTOFSECTOR#ŠLEA„RBUF(PC),A1ŒADDRESSTOMOVETO#ŠMOVE.LD3,A0ŽADDRESSINSHAREDSEGŠLEA„RBUF+256-B(A5),A2RMOVLP„MOVE.L(A0)+,(A1)+#ŠCMP.L‚A  2,A1ŽAREWEDONEWITHMOVE? ŠBCS„RMOVLP)* THE CORRECT SECTOR IMAGE IS NOW IN RBUF** THE CORRECT SECTOR NUMBER IS NOW IN RSEC2* THE ADDRESS WITHIN THE SHARED SEGMENT IS IN RSEGB* THE RANDOM RECORD # OF THE FIRST RECORD OF THE BLOCK IS IN RFRRN7RROK†CLR.W‚GOTCHG-B(A5)‡FLAGTHATCHANGEBUFFERISREAD:ŠMOVE.W#-1,RCHG-B(A5)…FLAGTHATNOCHANGESHAVEBEENMADE ŠBRA„DECPRMPT*0* SEE IF WE ARE TO SHOW THE SECTOR CHANGE BUFFER SCHECK„EQU„*3ŠCMP.B‚#'S',D0ŒDOWESHOWTHESECTORCHANGEBUFFER?ŠBNE.S‚FCHECKBRANCHIFNO,ŠBSR.S‚EXGARBGE‹INSURENOEXTRANEOUSGARBAGEŠBNE„NVEBRANCHIFBADENTRY*)ŠLEA„SCHGBS(PC),A0Š'SECTORCHANGEBUFFER'ŠLEA„SCHGBE(PC),A1 ŠBSR„LSTOUTŠMOVE.LRSEC,D1ŒSECTORNUMBERŠLEA„RBUF-B(A5),A02ŠMOVE.LA0,BUFDUMP-B(A5)ƒADDRESSOFBUFFERTODUMP ŠBSR„FORMAT ŠBRA„DECPRMPT%*************************************:* SUBROUTINE TO CHECK FOR EXTRANEOUS GARBAGE ON INPUT LINE*ƒFORSINGLELETTERSUBCOMMANDS*EXGARBGE‚EQU„*2ŠADD.L‚#1,A0ŽPOINTA0ONEBEYONDSUBCOMMANDLETTER ŠMOVE.LA0,A1ŠADD.L‚MSGIIOS+IOSLEN,A12ŠSUB.L‚#1,A1ŽA1POINTSTOENDOFINTERACTIVEINPUT ŠBSR„BLNKSKP#ŠCMP.L‚A0,A1ŽRETURN.NE.IFGARBAGEŠRTS%*************************************8* SUBROUTINE TO CHECK FOR TRAILING GARBAGE ON INPUT LINE*ƒAFTERCONVERSIONBYASCBIN* RETURNS EQ IF NO GARBAGE*‰NEIFGARBAGE* EXGRBG2ƒEQU„*ŠLEA„OPINPBUF-B(A5),A0ŠADD.L‚CHRPTR,A0EXBG2.1ƒCMP.B‚#$0D,(A0)ŠBEQ.S‚EXGRBG2XŠCMP.B‚#'',(A0)+ŠBEQ.S‚EXBG2.1 EXGRBG2X‚RTS*0* SEE IF WE ARE TO FILL THE SECTOR CHANGE BUFFER FCHECK„EQU„*/ŠCMP.B‚#'F',D0ŒDOWEFILLSECTORCHANGEBUFFER?ŠBNE.S‚MCHECKBRANCHIFNO*ŠADD.L‚#1,CHRPTR-B(A5)4ŠMOVE.W#16,RADIX-B(A5)„DEFAULTRADIXFORCONVERSION,ŠMOVE.L#-2,A1A1ISNOTUSEDASENDPOINTER#ŠBSR„ASCBINCONVERTASCIITOBINARYŠBNE„NVEBRANCHIFBADENTRY$ŠBSR„EXGRBG2ŒSEEIFTRAILINGGARBAGEŠBNE„NVEBRANCHIFSO(ŠCMP.L‚#$FF,D1ŒWASBYTEVALUETOOLARGE?ŠBLS.S‚FCHECK.1‹BRANCHIFNO(ŠMOVE.L#EM_NVE,D0‰COMPLAINOFBADENTRY ŠBSR„ERRMSG#ŠBSR„CHAINCHK‹EXITIFINCHAINMODE*$* FILL CHANGE BUFFER WITH BYTE IN D1FCHECK.1‚LEA„RBUF(PC),A1ŠLEA„RBUF+256-B(A5),A0FCHGLP„MOVE.BD1,(A1)+ ŠCMP.L‚A0,A1 ŠBCS.S‚FCHGLP(ŠCLR.W‚RCHG-B(A5)‰MARKBUFFERASCHANGED ŠBRA„DECPRMPT*$* SEE IF WE ARE TO ENTER CHANGE MODE MCHECK„EQU„*'ŠCMP.B‚#'M',D0ŒDOWEENTERCHANGEMODE?ŠBNE„WCHECKBRANCHIFNO6ŠTST.W‚GOTCHG-B(A5)‡DOWEHAVEASECTORCHANGEBUFFER?ŠBEQ.S‚PROMPT1ŒBRANCHIFYES:ŠLEA„NOCHGS(PC),A0Š'MUSTREADINSECTORCHANGEBUFFERFIRSŠLEA„NOCHGE(PC),A1 ŠBSR„MSGOUT&ŠBSR„CHAINCHK‹EXITIFCHAINPROCESSINGŠBRA„DECPRMPT‹GOOUTANDPROMPT*9PROMPT1ƒMOVE.L#-1,MODEC-B(A5)„MARKASNOTINCHANGEMODEŠBRA.S‚PRMPTIN NXTOPINƒEQU„* ŠBSR„MSGOUTŠLEA„MSGIIOS(PC),A0ŠTRAPƒ#2"ŠBEQ.S‚NXTOPIN1‹BRANCHIFNOERRORŠCMP.B‚#ISTABRK,D0ŠBEQ„BREAKSVŒHANDLEBREAK1NXTOPIN1‚BSR„SBARGŽCALLFORARGUMENTSUBSTITUTIONPRMPTINƒLEA„OPINPBUF(PC),A03ŠMOVE.LMSGIIOS+IOSLEN,A1‚CALCENDINGINPUTADDRESS ŠADD.L‚A0,A1(ŠSUB.L‚#1,A1ŽA1HASENDINGINPUTADDRESS*ŠBRA„DECINPDECODETHEINPUT** NN WAS ENTERED* NUM‡EQU„*(ŠMOVE.L#1,INCNUM-B(A5)„SETUPINCREMENT ŠBRA.S‚NUM06NUMUP…MOVE.L#-1,INCNUM-B(A5)ƒSETUPDISPLAYINCREMENT$ŠSUB.L‚#1,A1ŽPOINTTOENDOFNUMERIC NUM0†EQU„*+ŠTST.L‚MODEC-B(A5)ˆAREWEINACHANGEMODE?ŠBEQ.S‚CHGMODBRANCHIFYES)ŠCLR.L‚MODEC-B(A5)ˆMARKUSINCHANGEMODE&ŠBSR„ASCSCANŒCHECKFORALLASCIIINPUT'ŠBRA.S‚NOADDRBRANCHFORNOTGOODINPUTŠNOP„SPACEŽFILLER#ŠMOVE.LA0,D0ŽADDRESSTOBEGINSCANŠLEA„OPINPBUF-B(A5),A2&ŠSUB.L‚A2,D0ŽRELATIVEOFFSETINBUFFERŠMOVE.LD0,CHRPTR-B(A5)4ŠMOVE.W#16,RADIX-B(A5)„DEFAULTRADIXFORCONVERSION)ŠBSR„ASCBINGETBINARYEQUIVALENTINTOD1ŠBNE„NVEBRANCHIFBADENTRYŠCMP.L‚#$FF,D1ŒRANGE(0-$FF) ŠBLS.S‚BYTEOK3BADBYTEƒLEA„BADBYTES(PC),A0ˆCOMPLAINOFBADADDRESSŠLEA„BADBYTEE(PC),A1 ŠBSR„MSGOUTŠBRA„DECPRMPT‹GETOUTBYTEOK„MOVE.LD1,D0'ŠMOVE.LD0,DECNUM-B(A5)„DISPLAYADDRESSŠLEA„RBUF(PC),  A0'ŠMOVE.B0(A0,D0),D1ˆVALUEOFBYTEIND1 ŠBRA.S‚OPINOK*NOADDR„BRA„NVE OPINOK„EQU„*)ŠMOVE.LD1,GETIDXNM-B(A5)‚SAVEBYTEVALUE ŠBRA„DISPLAY* CHGMOD„EQU„*'ŠBSR„ASCSCANŒSCANFORLEGALASCIIINPUT!ŠBRA.S‚BADIN1BRANCHIFBADINPUTŠNOP„SPACEŽFILLERŠBRA.S‚CHGMOK1BADIN1„BRA„NVE*7CHGMOK1ƒMOVE.LDECNUM,SAVDEC-B(A5)SAVEDISPLAYADDRESS:ŠCLR.L‚QFIRST-B(A5)‡FLAGASFIRSTTIMETHRU(SYNTAXCHECK)'ŠCMP.B‚#'$',(A0)ŠBYPASSLEADING'$'...ŠBNE.S‚NO$1...IFENTERED ŠADD.L‚#1,A0=NO$1†MOVEM.LA0-A1,QSAVA0-B(A5)SAVENUMERICINPUTBOUNDARIES NLOOP1„EQU„*"ŠMOVE.LA1,D1ŽENDNUMERICBOUNDARY/ŠSUB.L‚A0,D1ŽD1HAS#OFINPUTNUMERICCHARS-13ŠMOVE.LA0,A1ŽSETUPFORASCIICONVERSIONOF1CHAR+ŠBTSTƒ#0,D1ŽNEIMPLIESEVEN,EQIMPLIESODD'ŠBEQ.S‚NBINBRANCHIFODD#CHARSINPUT-ŠADD.L‚#1,A1ŽMUSTCONVERTTWOIFEVEN#CHARS*'NBIN†MOVE.LA0,D1ŽADDRESSTOBEGINSCANŠLEA„OPINPBUF-B(A5),A2&ŠSUB.L‚A2,D1ŽRELATIVEOFFSETINBUFFERŠMOVE.LD1,CHRPTR-B(A5)ŠMOVE.W#16,RADIX-B(A5)#ŠBSR„ASCBINCONVERTA0-A1TOBINARYŠBNE„NVEBRANCHIFBADENTRY5ŠMOVE.BD1,STGCHR-B(A5)„SETUPFORDEPOSITSUBROUTINE*ŠLEA„STGCHR(PC),A0ŠPOINTA0TOINSERTBYTE"ŠBSR„DEPITŽGODEPOSITTHENEWBYTE+ŠADD.L‚#2,A1ŽSETUPTOPICKUPNEXT2BYTES ŠMOVE.LA1,A0 ŠSUB.L‚#1,A0(ŠCMP.L‚QSAVA0+4-B(A5),A1‚AREWETHROUGH?ŠBLE„NBINBRANCHIFNOT7ŠSUB.L‚#1,DECNUM-B(A5)„CORRECTFROMFINALDEPITADVANCE-ŠTST.L‚QFIRST-B(A5)‡WASTHISPASS1(SYNTAX?)ŠBNE.S‚NDUNBRANCHIFNO/ŠMOVE.L#-1,QFIRST-B(A5)ƒSETUPFORREALCHANGE.ŠMOVEM.LQSAVA0-B(A5),A0-A1RESTOREVITALREGS+ŠMOVE.LSAVDEC,DECNUM-B(A5)RESTOREADDRESS ŠBRA„NLOOP1* NDUN†EQU„*ŠTST.L‚INCNUM-B(A5) ŠBPL.S‚NOCHGŠMOVE.LSAVDEC,DECNUM-B(A5)*5NOCHG…MOVE.LINCNUM,D1ŠGOTONEXTADDRESSFORDISPLAYŠADD.L‚D1,DECNUM-B(A5)ŠMOVE.LDECNUM,D0ŠCMP.L‚#$FF,D0ŒRANGE(0-$FF)(ŠBHI„BADBYTEŒBRANCHIFBYTEOUTOFRANGEŠLEA„RBUF(PC),A1 ŠCLR.L‚D1!ŠMOVE.B0(A1,D0),D1ˆVALUEOFBYTE*;ŠMOVE.LD1,GETIDXNM-B(A5)‚VALUEOFBYTEATDISPLAYLOCATIONDISPLAYƒEQU„*’CONSTRUCTDISPLAYŠLEA„ADRAOUT(PC),A15ŠBSR„ASCII8CONVERTBYTEADDRESSTOASCIIANDDEPOSITŠMOVE.LGETIDXNM,D0ˆOLDVALUE*ŠBSR„BINASCII‹CONVERTTOASCIIANDDEPOSITŠMOVE.WD1,VALAOUT-B(A5)&ŠCMP.B‚#$1F,D0ŒCONSTRUCTASCIIDISPLAY%ŠBLS.S‚DPRDBRANCHIFNOTDISPLAYABLEŠCMP.B‚#$7E,D0!ŠBLS.S‚DPRCBRANCHIFDISPLAYABLE2DPRD†MOVE.B#'.',D0ŒDISPLAY'.'FORNONDISPLAYABLEDPRC†MOVE.BD0,QAOUT-B(A5)ŠLEA„CHGAOUTS(PC),A0ŠLEA„CHGAOUTE(PC),A1 ŠBRA„NXTOPIN*6* SUBROUTINE TO SCAN FROM A0 TO A1 FOR LEGAL HEX INPUT.*‚RETURNSTOPCIFILLEGALHEXCHARACTERFOUND1*ƒRETURNSTOPC+4IFALLCHARACTERSARELEGALHEX* ASCSCANƒEQU„*ŠMOVE.LA0,-(A7).ŠCMP.B‚#'$',(A0)ŠBYPASSLEADING'$'IFENTERED ŠBNE.S‚ASCCMP ŠADD.L‚#1,A0ASCCMP„CMP.B‚#'0',(A0)ŠBLT.S‚ASCBBRANCHIFNOTASCIIŠCMP.B‚#'9',(A0)ŠBLS.S‚ASCXBRANCHIFASCIIŠCMP.B‚#'A',(A0)ŠBLT.S‚ASCBBRANCHIFNOTASCIIŠCMP.B‚#'F',(A0)ŠBGT.S‚ASCBBRANCHIFNOTASCII*ASCX†ADD.L‚#1,A0 ŠCMP.L‚A1,A0+ŠBLS.S‚ASCCMPBRANCHIFNOTTHRUSTRINGYES$ŠADD.L‚#4,4(A7)‹BIASFORGOODRETURN*ASCB†MOVE.L(A7)+,A0ŠRTS„0*** CR1‡EQU„*(ŠTST.L‚MODEC-B(A5)ˆAREWEINCHANGEMODEŠBNE„DECPRMPT‹BRANCHIFNOŠMOVE.L#1,INCNUM-B(A5) ŠBRA„NOCHG*UPˆEQU„*’OPERATORENTERED^ŠTST.L‚MODEC-B(A5) ŠBNE„DECPRMPTŠMOVE.L#-1,INCNUM-B(A5) ŠBRA„NOCHG* PERIOD„EQU„*-ŠMOVE.L#1,MODEC-B(A5)…GOINTONOCHANGEMODE ŠBRA„DECPRMPT* QUOTE…EQU„*’HANDLEQUOTESTRINGSŠTST.L‚MODEC-B(A5)ŠBEQ.S‚QUOTOK1ŠBRA„NVEBRANCHONBADENTRY*QUOTOK1ƒMOVE.L#1,INCNUM-B(A5)4ŠCLR.L‚QFIRST-B(A5)‡INDICATE1STPASS(SYNTAXCHECK)0ŠMOVEM.LA0-A1,QSAVA0-B(A5)SAVESTRINGPOINTERS*0ŠMOVE.LDECNUM,SAVDEC-B(A5)SAVEDISPLAYADDRESS(QBUMP…ADD.L‚#1,A0ŽBUMPCHARACTERPOINTER ŠCMP.L‚A1,A0/ŠBGT.S‚QUOTEDUN‹BRANCHIFQUOTESTRINGFINISHED*,ŠCMP.B‚#'''',(A0)‰DOWEHAVEEMBEDDEDQUOTE?.ŠBNE.S‚DEPCHRNO-GODEPOSITNORMALCHARACTERB* ENCOUNTERED A QUOTE IN THE STRING, MAY BE END QUOTE OR EMBEDDED. ŠADD.L‚#1, A0 ŠCMP.L‚A1,A0#ŠBGT.S‚QUOTEDUN‹BRANCHIFENDQUOTE1ŠCMP.B‚#'''',(A0)‰CHECKFORDOUBLEEMBEDDEDQUOTEŠBNE.S‚CHKUPŽIFNOTCHECKFOR^ŠBRA.S‚DEPCHRDEPOSITQUOTE*CHKUP…CMP.B‚#'^',(A0)&ŠBNE.S‚QUOTERRŒBRANCHIFERROR(NOT^),ŠMOVE.L#-1,INCNUM-B(A5)ƒSETDECREMENTCOUNT#ŠADD.L‚#1,A0ŽBUMPCHARACTERPOINTER ŠCMP.L‚A1,A0ŠBGE.S‚QUOTEDUNŠBRA.S‚QUOTERR* DEPCHR„EQU„*ŠBSR.S‚DEPITŽDEPOSITCHARACTER ŠBRA„QBUMP*%QUOTEDUN‚EQU„*’DONEWITHQUOTESTRING.ŠSUB.L‚#1,DECNUM-B(A5)„ADJUSTFROMFINALDEPIT*ŠTST.L‚QFIRST-B(A5)‡WASTHISTHE1STPASS?ŠBNE.S‚QDUNBRANCHIFNOT)ŠMOVE.B#-1,QFIRST-B(A5)ƒMARKAS2NDPASS3ŠMOVEM.LQSAVA0-B(A5),A0-A1RESTOREVITALREGISTERS3ŠMOVE.LSAVDEC,DECNUM-B(A5)RESTOREDISPLAYADDRESS'ŠBRA„QBUMPŽGOREALLYPUTTHECHANGESIN QDUN†EQU„*ŠTST.L‚INCNUM-B(A5) ŠBPL„NOCHG<ŠMOVE.LSAVDEC,DECNUM-B(A5)ADJUSTTODISPLAYPRIORLOCATION ŠBRA„NOCHG*2QUOTERRƒEQU„*’COMPLAINOFBADQUOTESTRINGENTEREDŠBRA„NVE*.DEPIT…EQU„*’DEPOSITCHARACTERPOINTEDATBYA0+ŠTST.L‚QFIRST-B(A5)‡ISTHISTHEFIRSTPASS?&ŠBEQ.S‚QRTSBRANCHIFYES-NOCHANGES%ŠMOVE.LA1,-(A7)‹SAVEVITALREGISTERS!ŠMOVE.LDECNUM,D0ŠDISPLAYADDRESS#ŠCMP.L‚#$FF,D0ŒAREWEOUTOFRANGE?ŠBLS.S‚DEPIT2BRANCHIFNOŠMOVE.L(A7)+,A1#ŠLEA„4(A7),A7‹BYPASSRETURNADDRESS ŠBRA„BADBYTE*,DEPIT2„LEA„RBUF(PC),A1ŒCHANGEBUFFERADDRESSŠMOVE.B(A0),D1ŒNEWBYTEVALUEŠCMP.B‚0(A1,D0),D12ŠBEQ.S‚QNOCHGBRANCHIFBYTEDIDNOTREALLYCHANGE*ŠMOVE.BD1,0(A1,D0)ˆMAKEBYTEMODIFICATION!ŠCLR.W‚RCHG-B(A5)‰FLAGASCHANGED.QNOCHG„MOVE.L(A7)+,A1‹RESTOREVITALREGISTERS7QRTS†ADD.L‚#1,DECNUM-B(A5)„BUMPTONEXTDISPLAYADDRESSŠRTS„0**M‰EQU„*)ŠADD.L‚#1,A0ŽBYPASSSUBCOMMANDLETTER'M'%ŠBSR„BLNKSKPŒSKIPBLANKSUNTILNUMBER2ŠMOVE.L#-1,MODEC-B(A5)„MARKASNOTINCHANGEMODEŠBRA„NUM*Q‰EQU„*%ŠBRA„DECPRMPT‹JUSTGOBACKANDPROMPT*** DECODE OPERATOR INPUT*#*INPUT:‚A0=ADDRESSOFINPUTLINE!*‰A1=ENDINGADDRESSOFINPUTLINE(* OUTPUT: D0 = NUMBER IN BINARY (IF ANY) *‰RETURNTO:*‰NUM„FORNN*‰CR1„FOR*‰NUMUP‚FORNN^*‰UP…FOR^*‰QUOTE‚FOR'*‰PERIODFOR. *‰Q†FORQ*‰M†FORMNN* DECINP„EQU„* ŠBSR„BLNKSKP** CHECK FOR BY ITSELF*ŠMOVE.LA1,D0ŽENDINGADDRESS ŠCMP.L‚A0,D0"ŠBLT„CR1BRANCHIFCARRIAGERETURN*!* SEE IF TERMINATOR CHARACTER 'Q'*(ŠMOVE.BTERMCHR,D1‰TERMINATINGCHARACTERŠCMP.B‚(A0),D1&ŠBEQ„Q’BRANCHIFTERMINATINGCHARACTER** SEE IF PERIOD*ŠCMP.B‚#'.',(A0)ŠBEQ„PERIODBRANCHIFPERIOD* * SEE IF '^'*ŠCMP.B‚#'^',(A0)ŠISITA'^'ŠBEQ„UP‘BRANCHIF^** SEE IF SINGLE QUOTE*ŠCMP.B‚#'''',(A0) ŠBEQ„QUOTE* * SEE IF 'M'*ŠCMP.B‚#'M',(A0)ŠBEQ„M** IT MUST BE NN OR NN^**ŠCMP.B‚#'^',(A1)ŠBEQ„NUMUPŽBRANCHFORNN^ŠBRA„NUMBRANCHFORNN**5* SEE IF WE ARE TO WRITE THE SECTOR CHANGE BUFFER OUT WCHECK„EQU„*0ŠCMP.B‚#'W',D0ŒDOWEWRITESECTORCHANGEBUFFER?ŠBNE„DECERRIFNO,THENBRANCH'ŠBSR„EXGARBGE‹SEEIFEXTRANEOUSGARBAGE.ŠBEQ.S‚WCHECK1ŒBRANCHIFONLY'W'WASKEYEDIN/ŠMOVE.W#10,RADIX-B(A5)„SETDEFAULTRADIXTO103ŠADD.L‚#1,CHRPTR-B(A5)„CHARACTERPOINTERFORASCBINŠBSR„ASCBINCONVERTTOBINARYŠBNE„NVEBRANCHONBADENTRY$ŠBSR„EXGRBG2ŒSEEIFTRAILINGGARBAGEŠBNE„NVEBRANCHIFSOBŠMOVE.LD1,INPIOS+IOSRRN-B(A5)SAVESECTORNUMBERRECNUMTOWRITE3ŠTST.B‚NONCONTG-B(A5)…ISTHISANONCONTIGUOUSFILE?+ŠBEQ.S‚NONC4ŽBRANCHIFNO(IT'SCONTIGUOUS)8ŠLEA„NONCS(PC),A0‹COMPLAINOFTHISOPTIONWITHNONCONTIGŠLEA„NONCE(PC),A1 ŠBSR„MSGOUT&ŠBSR„CHAINCHK‹EXITONCHAINPROCESSING ŠBRA„DECPRMPT,NONC4…BSR„ASGPRWGOASSIGNPUBLICREADWRITE1ŠBNE„DECPRMPT‹BRANCHIFWECANNOTASSIGNTHISWAYŠBSR„WROKGOWRITEITOUT!ŠBRA„DECPRMPT‹GOFORNEXTCOMMAND*6WCHECK1ƒTST.W‚GOTCHG-B(A5)‡DOWEHAVEACHANGEBUFFER?ŠBEQ.S‚WCHECK8ŒBRANCHIFYES:ŠLEA„NOCHGS(PC),A0Š'MUSTREADINSECTORCHANGEBUFFERFIRSŠLEA„NOCHGE(PC),A1 ŠBSR„MSGOUT ŠBRA„DECPRMPT+WCHECK8ƒBSR„ASGPRWASSIGN PUBLICREAD/WRITE1ŠBNE„DECPRMPT‹BRANCHIFWECANNOTASSIGNTHISWAY*H* GET CORRECT SEGMENT INTO MEMORY BY READING THE SECTOR CORRESPONDING TO*ƒTHESECTORNUMBERINRSEC3GOTPRPWƒMOVE.LRSEC,D1ŒRANDOMRECORDNUMBERTOREADŠBSR„FILLBUFŒREADITŠCMP.B‚#ISTACRC,D0ˆCRCERROR?ŠBNE.S‚GOTPRPW2‹BRANCHIFNO3ŠBSR„ERRMSGCOMPLAINOFCRCERRORBUTTREATASGOODŠBRA.S‚GOTPRW4GOTPRPW2‚TST.B‚D0ŠBNE.S‚WRNOKŽBRANCHIFBADREAD:GOTPRW4ƒTST.B‚NONCONTG-B(A5)…ISTHISANONCONTIGUOUSFILE?ŠBNE.S‚WRRNBRANCHIFYES.ŠBSR.S‚WROKWRITETHERECORDOUTONCONTIGUOUSŠBRA.S‚WIOOKEX*,WRNOK…CMP.B‚#ISTARR,D0‰BETTERBEINVALIDRRNŠBNE„DFLERRBRANCHIFNOTE* INSURE THAT THIS IS THE SAME BLOCK WE FIRST READ INTO CHANGE BUFFER/WRRN†MOVE.LINPIOS+IOSRRN,D3ƒFIRSTRRNOFBLOCK*3* MOVE THE CHANGE SECTOR BACK TO THE SHARED SEGMENT$ŠLEA„RBUF(PC),A0Œ'MOVEFROM'ADDRESS!ŠMOVE.LRSEG,A1Œ'MOVETO'ADDRESSŠLEA„RBUF+256-B(A5),A2SMOVLP„MOVE.L(A0)+,(A1)+ ŠCMP.L‚A2,A0 ŠBCS.S‚SMOVLP*(* NOW WRITE OUT THE SHARED SEGMENT BLOCK?ŠMOVE.LINPFHS+FHSSAD-B(A5),D0BASEADDRESSOFSEGMENTTOWRITEŠMOVE.LD0,INPIOS+IOSSAD-B(A5).ŠADD.L‚INPIOS+IOSLEN,D0ƒCOMPUTEENDINGADDRESS ŠSUB.L‚#1,D0:ŠMOVE.LD0,INPIOS+IOSEAD-B(A5)SAVEROUNDEDENDINGADDRESSŠBSR.S‚WRITBUFCŠMOVE.LINPFHS+FHSSAD,INPIOS+IOSSAD-B(A5)RESTOREFORMERBOUNDARIES)ŠMOVE.LINPFHS+FHSEAD,INPIOS+IOSEAD-B(A5)*EWIOOKEXƒMOVE.W#-1,GOTCHG-B(A5)ƒFLAGTHATWEDON'THAVECHANGEBUFFERŠMOVE.L#-1,RSEC-B(A5)*ŠMOVE.W#-1,RCHG-B(A5)…FLAGASNOTCHANGED"ŠBRA.S‚DECPRMPT‹GETOUTANDPROMPT* * SUBROUTINE/* CONTIGUOUS FILE - OUTPUT SECTOR CHANGE BUFFER WROK†EQU„*ŠLEA„RBUF-B(A5),A06ŠMOVE.LA0,INPIOS+IOSSAD-B(A5)SECTORSTARTINGADDRESSŠADD.L‚#BUFL-1,A0-ŠMOVE.LA0,INPIOS+IOSEAD-B(A5)ENDINGADDRESSŠBSR.S‚WRITBUFŠLEA„BUFS-B(A5),A08ŠMOVE.LA0,INPIOS+IOSSAD-B(A5)RESTOREFORMERBOUNDARIESŠLEA„BUFE-B(A5),A0ŠMOVE.LA0,INPIOS+IOSEAD-B(A5)ŠRTS* * SUBROUTINEWRITBUFƒLEA„INPIOS(PC),A05ŠMOVE.L(A0),A1ŒSAVEFUNCTIONANDOPTIONSFORRESTORE4ŠMOVE.W#IOWRIT,INPIOS+IOSFCT-B(A5)CONVERTTOWRITEŠTRAPƒ#2ŠBEQ.S‚WRITBOK ŠBSR„ERRMSG#ŠBSR„CHAINCHK‹EXITIFINCHAINMODE8WRITBOKƒMOVE.LA1,INPIOS-B(A5)„RESTOREPREVIOUSFUNCTIONŠRTS* * SUBROUTINE?* SEE IF ASSIGNED PUBLIC READ/WRITE AND IF NOT ATTEMPT TO DO SOASGPRW„LEA„INPFHS(PC),A0AŠMOVE.L#FOPPRPW+FOPABF+(FHCHNG<<16),D0PUBLICREAD/WRITEOPTIONS!ŠMOVE.LFHSCMD(A0),D2†OLDOPTIONS0ŠCMP.B‚D2,D0ŽWASTHISALREADYDONESUCCESSFULLY?ŠBEQ.S‚ASGPRWXŒBRANCHIFSO7ŠMOVE.LD0,FHSCMD(A0)†PLUGPUBLICREAD/WRITEOPTIONSINŠTRAPƒ#3#ŠBEQ.S‚ASGPRWXŒBRANCHIFSUCCESSFUL-ŠBSR„ERRMSGDISPLAYERRORMESSAGEVIAHANDLER#ŠBSR„CHAINCHK‹EXITIFINCHAINMODE ASGPRWXƒRTS*'DFLERR„BSR„ERRMSGCOMPLAINOFBADINPUT#ŠBSR„CHAINCHK‹EXITIFINCHAINMODE*4DECPRMPT‚LEA„4(A7),A7‹BYPASSRETURNADDRESSONSTACK ŠBRA„PROMPT*%*************************************:*SUBROUTINETOCONVERTASCIITOBINARY.‚INPUTATOPINPBUF6*ƒOFFSETBYCHRPTR.‚BINARYOUTPUTRETURNEDIND1.‚SCAN9*ƒCONTINUESUNTILNON-NUMERICCHARACTERISENCOUNTEREDOR>*ƒUNITLTHESCANREACHESONEBYTEBEYONDWHEREA1ISPOINTING.*ƒLEADINGBLANKSAREIGNORED.B*ƒA'$'ISLEGALASFIRSTCHARACTERTOINDICATEHEXINTERPRETATION;*ƒOFSUCCEEDINGNUMERICCHARACTERS.‚THE'DEFAULT'RADIXFOR>*ƒCONVERSION(10OR16)MUSTBESUPPLIEDASINPUT.‚THISALLOWS:*ƒAHEXINTERPRETATIONEVENIFTHELEADING'$'ISMISSING.B*ƒEQUALCONDITIONCODESARERETURNEDFORGOODCONVERSION,NECODES *ƒFORERROR.** ASCBIN„EQU„*(ŠMOVE.LA1,-(A7)‹SAVEA1THRUCONVERSION ŠMOVE.LA1,D0,ŠADD.L‚#1,D0ŽCOMPAREFORTERMINATIONOFSCANŠLEA„OPINPBUF(PC),A0 ŠMOVE.LA0,D1ŠADD.L‚CHRPTR,A0ŠLEA„OPINPBUF+OPINLGH(PC),A1 ŠBSR„BLNKSKPŒSKIPLEADINGBLANKS ŠSUB.L‚D1,A01ŠMOVE.LA0,CHRPTR-B(A5)„UPDATECHRPTRPASTBLANKSŠCLR.L‚D1‘RETURNVALUE/ŠMOVE.LA0,D2ŽCHARACTERPOINTERTOD2FORINDEX/ŠLEA„OPINPBUF(PC),A1ˆINPUTBUFFTOA1FORINDEXŠCLR.L‚D4‘FORWORKINGCHARACTER* INSURE 1ST CHARACTER GOOD ŠCMP.B‚#'$',0(A1,D2) ŠBEQ.S‚CV2+ŠCMP.W‚#10,RADIX-B(A5)„ISDEFAULTRADIX10?3ŠBEQ.S‚CV4YES-SOGOCHECKFORBASE10LEGALCHAR ŠBRA.S‚CV38CV2‡MOVE.W#16,RADIX-B(A5)„FORCEBASE16FORLEADING'$' ŠADD.L‚#1,D2CV3‡CMP.B‚#'A',0(A1,D2) ŠBLO.S‚CV4ŠCMP.B‚#'F',0(A1,D2)'ŠBLS.S‚CNVRTŽBRANCHIFGOODHEX'A'-'F'CV4‡CMP.B‚#'0',0(A1,D2)&ŠBLO.S‚ASCBRTSŒBRANCHONBADCHARACTERŠCMP.B‚#'9',0(A1,D2)&ŠBHI.S‚ASCBRTSŒBRANCHONBADCHARACTER CNVRT…EQU„*ŠPEA„0(A1,D2)‹SEEIFTHRUSCANŠCMP.L‚(A7)+,D0#ŠBLS.S‚ASCBINEX‹BRANCHIFSCANTHRU)ŠMOVE.B0(A1,D2),D4ˆINPUTASCIICHARACTER!ŠSUB.L‚#$30,D4ŒCONVERTTODECIMAL(ŠCMP.W‚#16,RADIX-B(A5)„ISITREALLYHEX?ŠBNE.S‚RADIX10ŒBRANCHIFNO'ŠCMP.B‚#$10,D4ŒDOWENEEDTOBIASAGAINŠBLS.S‚RNGTSTBRANCHIFNO"ŠSUB.L‚#7,D4ŽFINISHCONVERTIFHEX RNGTST„EQU„*0RADIX10ƒCMP.W‚RADIX,D4‹ISCHARACTEROUTOFRANGE'ŠBCC.S‚ASCBINEX‹BRANCHFOROUTOFRANGE ŠTST.W‚D4'ŠBCS.S‚ASCBINEX‹BRANCHFOROUTOFRANGEŠMOVE.LD1,-(A7)ŠROL.L‚#3,D1ŽTIMES8ŠCMP.W‚#16,RADIX-B(A5)!ŠBNE.S‚RD10BRANCHIFRADIXIS10 ŠLEA„4(A7),A7*ŠROL.L‚#1,D1ŽCOMPLETEMULTIPLICATIONBY16 ŠBRA.S‚ADDCHR0RD10†ADD.L‚(A7),D1ŒCOMPLETEMULTIPLICATIONBY10ŠADD.L‚(A7)+,D1'ADDCHR„ADD.L‚D4,D1ŽADDINNEWCHARACTER,ŠADD.L‚#1,D2ŽBUMPREGISTERCHARACTERPOINTER'ŠBRA„CNVRTŽGOCONVERTANOTHERCHARACTERASCBINEX‚MOVE.L(A7)+,A10ŠMOVE.LD2,CHRPTR-B(A5)„UPDATECHARACTERPOINTER0ŠCMP.L‚D0,D0ŽRETURNEQUAL(GOOD)CONDITIONCODESŠRTSASCBRTSƒMOVE.L(A7)+,A10ŠMOVE.LD2,CHRPTR-B(A5)„UPDATECHARACTERPOINTER*ŠTST.L‚(A7)RETURNUNEQUALCONDITIONCODESŠRTS%*************************************/* SUBROUTINE TO FILL I/O BUFFER WITH ONE SECTOR* FILLBUFƒEQU„*3ŠMOVE.LD1,INPIOS+IOSRRN-B(A5)SETUPRECORDNUMBERŠLEA„INPIOS(PC),A0ŠTRAPƒ#2ŠRTS%*************************************A* SUBROUTINE TO PLACE FORMATTED OUTPUT ON SPECIFIED OUTPUT DEVICE**ƒENTRY:‚D1=SECTORNUMBER5*‹BUFDUMPCONTAINSADDRESSOFSECTORIMAGETODISPLAY* FORMAT„EQU„*5ŠMOVEM.LD1-D2,SAVD-B(A5)‚SAVETHEVOLATILEREGISTERS** FORMAT HEADER LINE*ŠMOVE.LD1,D0ŽSECTORNUMBER ŠCMP.L‚#-1,D0 ŠBNE.S‚FM2ŠMOVE.L#'??',HEXSEC-B(A5)ŠMOVE.L#'„',HEXSEC+4-B(A5)ŠMOVE.L#'„',DECSEC-B(A5)ŠMOVE.L#'„',DECSEC+4-B(A5) ŠBRA.S‚FM46FM2‡LEA„HEXSEC(PC),A1ŠWHERETODEPOSITCONVERTEDASCII#ŠBSR„ASCII8CONVERTTO8-CHARASCII%ŠMOVE.LSAVD,D0ŒRECOVERSECTORNUMBER$ŠBSR„HEXDECCONVERTTODECIMALASCII-* IF PRINTER DEAL WITH PAGE EJECT AND HEADING*FM4‡TST.W‚PRINTER-B(A5)†OUTPUTTOPRINTER?ŠBNE.S‚NOFFBRANCHIFNOTŠMOVE.WBLKOUT,D0$ŠCMP.W‚BLKMAX,D0ŠTIMEFORFORMFEED?ŠBNE.S‚NOFFBRANCHIFNOT(* EJECT PAGE AND PUT OUT PRINTER HEADING&*„DON'TEJECTPAPERIFFIRSTTIMETHRUŠTST.W‚EJCT-B(A5)‰DOWEEJECT?$ŠBNE.S‚EJCT3ŽBRANCHIF1STTIMETHRUŠLEA„FFS(PC),A0ŠLEA„FFE(PC),A1EJECT ŠBSR„IMGOUTŠBNE„FORMEXTŒBRANCHIFERROR:EJCT3…CLR.W‚EJCT-B(A5)‰CLEAREJECTFLAGFORNEXTTIMETHRU"ŠLEA„PRHDGS(PC),A0ŠPRINTERHEADING0ŠMOVE.LPRHDGEL,A1‰LENGTHOFHEADINGFORPRINTER ŠBSR„LSTOUT NOFF†EQU„**%* PRINT OUT SECTOR NUMBER HEADER LINE*!ŠLEA„MSGHDR(PC),A0ŠBEGINNINGADDRŠLEA„MSGHDRE(PC),A1‰ENDINGADDRŠBSR„LSTOUTGOPUTITOUTŠBNE„FORMEXTŒBRANCHONERROR*"* SET UP TO DISPLAY BODY OF SECTOR*1FORM10„MOVE.LBUFDUMP,A3‰BUFFERBEGINNINGADDRESS8ŠCLR.L‚BYTENUM-B(A5)†RUNNINGBYTENUMBERFORLEFTCOLUMN*3* CONVERT BYTENUM TO ASCII AND PLACE IN OUTPUT LINE*?NXTLINEƒLEA„FRMLINE-B(A5),A2ƒPOSITIONA2ASPOINTERINTOOUTBUFŠMOVE.LBYTENUM,D0 ŠBSR„BINASCII'ŠMOVE.WD1,(A2)ŒPLACEITINOUTPUTLINE*5* CONVERT 16 BYTES OF BUFS AND PLACE INTO OUTPUT LINE*)ŠMOVE.L#6,D2ŽWHERETOSTARTBODYOFLINE*'NXTBYTEƒMOVE.B(A3)+,D0‹BYTETOCONVERT%ŠBSR„BINASCII‹CONVERTTO2-BYTEASCII(ŠMOVE.BD1,1(A2,D2)ˆPLACELOWORDERBYTE%ŠROR.L‚#8,D1ŽPOSITIONHIGHORDERBYTE+ŠMOVE.BD1,0(A2,D2)ˆPLACEITINOUTPUTLINE,ŠADD.L‚#3,D2ŽINDEXTODEPOSITNEXTCONVERTEDŠMOVE.LA3,D0ŽBUFSINDEXŠAND.B‚#$0F,D00ŠBEQ.S‚ASISBRANCHIFNOMORETOCONVERT INLINE*ŠCMP.B‚#8,D0ŽAREWEHALFWAYTHROUGHLINE?ŠBNE.S‚NXTBYTEŒBRANCHIFNOT1ŠADD.L‚#1,D2ŽYESSOINSERTEXTRASPACEFORPRETTY"ŠBRA.S‚NXTBYTEŒGOFORRESTOFLINE*-* INITIALIZE LINE DISPLAY FOR "AS IS" PORTION* ASIS†EQU„*.ŠLEA„58(A2),A4ŠWHERETODEPOSITUNALTEREDDATA(ŠMOVE.LA3,A6ŽUPPERLIMITINBUFSSOFAR ŠSUB.W‚#16,A3*"* JIMMY THE UNPRINTABLE CHARACTERS* CMPCHR„EQU„*!ŠCMP.B‚#$7E,(A3)ŠISITPRINTABLE?ŠBHI.S‚PRDBRANCHIFNO!ŠCMP.B‚#$20,(A3)ŠISITPRINTABLE?ŠBCC.S‚CHROKŽBRANCHIFYES,PRD‡MOVE.B#'.',(A4)+‰NOSOREPLACEWITH'.'#ŠADD.L‚#1,A3ŽBUMPCHARACTERPOINTER ŠBRA.S‚JNXT1CHROK…MOVE.B(A3)+,(A4)+ˆPUTCHARINTOOUTPUTBUF,JNXT†CMP.L‚A3,A6ŽAREWEDONEWITHTHISLINE?ŠBNE„CMPCHRBRANCHIFNOT*#* DISPLAY THE LINE JUST CONSTRUCTED*ŠLEA„FRMLINE-B(A5),A0ŠLEA„FRMLINE+FRMLGH-B(A5),A1 ŠBSR„LSTOUTŠBNE.S‚FORMEXT*4* IF WE ARE NOT DONE, INITIALIZE TO FORMAT NEXT LINE*2ŠADD.L‚#16,BYTENUM-B(A5)‚BUMPBYTENUMTONEXTLINEŠCMP.L‚#256,BYTENUM-B(A5)ŠBLT„NXTLINEŒBRANCHIFNOTDONE** SKIP 2 LINES*!ŠLEA„LF2(PC),A0BEGINNINGADDRESSŠMOVE.LA0,A1ŽENDINGADDRESS ŠBSR„LSTOUTŠBNE.S‚FORMEXT ŠBSR„LSTOUTŠBNE.S‚FORMEXT.* UPDATE BLKOUT COUNT FOR PRINTER PRETTY PRINTŠMOVE.WBLKOUT,D0 ŠADD.W‚#1,D0ŠCMP.W‚BLKMAX,D0%ŠBLE.S‚BLKOUTOK‹BRANCHIFNOROLLOVERŠCLR.L‚D0‘ROLLOVERBLKOUTCOUNTBLKOUTOK‚MOVE.WD0,BLKOUT-B(A5)$ŠCLR.L‚D0‘SET"GOOD"CONDITIONCODES;FORMEXTƒMOVEM.LSAVD-B(A5),D1-D2‚RESTOREVOLATILEREGISTERSŠRTS%*************************************5* SUBROUTINE TO CONVERT BINARY(HEX) TO DECIMAL ASCII.C*ƒSTOPSWHEN8DECCHARSHAVEBEENCOMPUTED.NOCHECKFOROVERFLOW.*"*…ENTRY:‚D0=HEXVALUETOCONVERT4*…EXIT:‚DECIMALCONVERTEDVALUEDEPOSITEDINDECSEC*LEFTJUSTIFIED,BLANKFILLED* HEXDEC„EQU„*6ŠMOVEM.LD0/D2/A0/A1,-(A7)SAVEALLVOLATILEREGISTERS3ŠLEA„DECSEC(PC),A0ŠWHERETODEPOSITCONVERTEDVALUE5ŠMOVEM.LBLANKS8-B(A5),D2/A1BLANKOUTRECEIVINGAREAŠMOVEM.LD2/A1,(A0),ŠLEA„TENS(PC),A1ˆADDRESSOFCONVERSIONTABLE%HEXDEC0ƒMOVE.W#'‚',D2‹FORBLANKFILL$HEXDEC1ƒSUB.L‚(A1),D0ŒSUBTRACT10**N ŠBCS.S‚HEXDEC2ŒBRANCHIFTOOBIGŠADD.W‚#1,D2ŽCONTNUEŠBRA.S‚HEXDEC1+HEXDEC2ƒADD.L‚(A1)+,D0‹RESTORE,ADVPOINTER#ŠTST.L‚(A1)ISTHECONVERSIONDONE?ŠBEQ.S‚HEXDEC4ŒBRANCHIFYES%ŠTST.L‚D2‘AREWESTILLLEADINGBLANKS-ŠBMI.S‚HEXDEC6ŒBRANCHTOFORCENONBLANKDIGIT ŠCMP.W‚#'‚',D2‹LEADINGZEROTEST#ŠBEQ.S‚HEXDEC3ŒBRANCHIFSTILLZERO*HEXDEC6ƒADD.B‚#$10,D2ŒBRINGTOASCIIDIGIT*ŠBSETƒ#31,D2MAKENEGATIVEFORFUTURETESTHEXDEC3ƒTST.L‚D2$ŠBPL.S‚HEXDEC0ŒINSURELEFTJUSTIFIEDŠMOVE.BD2,(A0)+‹DEPOSITCHAR"ŠBRA.S‚HEXDEC0ŒCONTINUECONVERSION3HEXDEC4ƒADD.B‚#$10,D2ŒLASTONEALWAYSBECOMESDIGIT'ŠMOVE.BD2,(A0)+‹DEPOSITLASTCHARACTER,ŠMOVEM.L(A7)+,D0/D2/A0/A1RESTOREREGISTERSŠRTS*BLANKS8ƒDC.Bƒ'ˆ'-*********************************************&*ˆ**CONVERTBINARYTOASCIIROUTINE**-*********************************************$*ˆBINARYTODECIMALASCIISUBROUTINE*REV1.00‚3/27.79GAT***16BITBINARYINPUT**4****************************************************6*ˆCONVERTSBINARYQUANTITYIND0TOASCIISTRINGWHICH *ˆISDEPOSITEDATLOCATION(A0)+**ˆCALLINGSEQUENCE:'*‹LOADD0WITHQUANTITYTOBECONVERTEDí:öGþGRX.*‹LOADA0WITHADDRESSTODEPOSITASCIISTRING *‹JSRBINDEC*!*ˆREGISTERSUSED:01234567*“D„** *“A„*****ˆA1POINTSATBINARYTABLE*ˆA2POINTSATASCIITABLE*ˆD1ISWORKREGISTER*BINEQS„DC.Wƒ0,1,10,100,1000(BINASC„DC.Bƒ'0123456789ABCDEF'HEXTABLE*'BINDEC„LEA„BINEQS+8-B(A5),A1‚ADDR10**5,BINDE1„LEA„BINASC-B(A5),A2„BASEADDRASCII0#BINDE2„SUB.W‚(A1),D0ŒSUBTRACT10**NŠBCS.S‚BINDE3BRANCHOVERBORROW&ŠADD.L‚#1,A2ŽINCREMENTNEXTASCIICHARŠBRA„BINDE2CONTINUE 'BINDE3„ADD.W‚(A1),D0ŒRESTOREOVERBORROW!ŠMOVE.B(A2),(A0)+‰PUTASCIICHARŠMOVE.W-(A1),D1‹TESTDONEŠBNE„BINDE1BRANCHNOTDONEŠRTS*-*********************************************+*‚32BITBINARYTODECIMALASCIISUBROUTINE-**********************************************,*‚CONVERTSBINARYIND0ANDPUTSASCIIDIGIT(*…CHARACTERSATADDRESSSPECIFIEDINA0.(*…LEADINGZEROSARECONVERTEDTOSPACES.+*…THEFIELDLENGTH(NO.CHARS)ISSPECIFIED *…IND1INTHECALLINGSEQUENCE.**‚CALLINGSEQUENCE:!*…MOVE.L,D0*…MOVE.L,D11*…MOVE.L,A0*…BSRBINDECFJ* *‚RETURNS:*…D0=0=>GOODCONVERSION**‚REGSUSED:‚01234567 *ŠDƒ*PP*ŠAƒPP*"BINDECFJ‚MOVEM.LD1/D2/A0/A1,-(A7)ŠMOVE.L#8,D2ŽMAXNO.DIGITSŠSUB.L‚D1,D2ŽNO.DIGITSTOSKIP!ŠBMI.S‚BINDECF5‹BRANCHERROREXITŠLSL.L‚#2,D2ŽDOUBLEWORDLENGTHŠLEA„TENS(PC),A1ˆSTARTOFTABLE"ŠADD.L‚D2,A1ŽADJUSTFORDIFFERENCE&ŠMOVE.W#'‚',D2‹INITIALIZEACCUMULATOR%BINDECF1‚SUB.L‚(A1),D0ŒSUBTRACT10**NŠBCS.S‚BINDECF2‹BRANCHTOOBIG*ŠADD.W‚#1,D2ŽINCREMENTCURRENTDIGITCOUNTŠBRA„BINDECF1‹CONTINUE)BINDECF2‚ADD.L‚(A1)+,D0‹RESTORE,ADVPNTRŠTST.L‚(A1)TESTDONEŠBEQ.S‚BINDECF4‹BRANCHDONE ŠCMP.W‚#'‚',D2‹LEADINGZEROTEST!ŠBEQ.S‚BINDECF3‹BRANCHSTILLZERO#ŠADD.B‚#$10,D2ŒBRINGTOASCIIDIGIT%BINDECF3‚MOVE.BD2,(A0)+‹DEPOSITCHARŠLSL„#8,D2ŽSAVECHARDEPOSITED#ŠMOVE.B#$20,D2ŒRESTORELSTOSPACEŠBRA„BINDECF1‹CONTINUE4BINDECF4‚ADD.B‚#$10,D2ŒLASTONEBECOMESDIGITALWAYS"ŠMOVE.BD2,(A0)+‹DEPOSITLASTCHAR'ŠTST.L‚D0‘SETCONDITIONCODE,0IFGOOD"BINDECF5‚MOVEM.L(A7)+,D1/D2/A0/A1ŠRTS*7TENS†DC.Lƒ10000000,1000000,100000,10000,1000,100,10,1,0%************************************** SUBROUTINE TO OUTPUT MESSAGES**ƒENTRY:A0=BEGINNINGADDRESSOFMESSAGE *ŠA1=ENDINGADDRESSOFMESSAGE* MSGOUT„EQU„*6ŠMOVEM.LA0-A1,MSGIOS+IOSSAD-B(A5)BEGIN/ENDADDRESSESŠLEA„MSGIOS(PC),A0ŠTRAPƒ#2"ŠBEQ.S‚MSGOUT.5‹BRANCHONNOERROR ŠCMP.B‚#ISTABRK,D0ˆWASITBREAK?ŠBEQ„BREAKSVŒBRANCHIFYES$ŠBSR.S‚ERRMSGNO-COMPLAINOFERROR#ŠBSR„CHAINCHK‹EXITIFINCHAINMODE ŠTST.L‚D08MSGOUT.5‚MOVEM.LMSGIOS+IOSSAD-B(A5),A0-A1RESTOREA0/A1ŠCMP.B‚#ISTABRK,D0ŠBEQ„BREAKSVŒHANDLEBREAK ŠTST.B‚D0ŠRTS„GETOUTOFHERE%*************************************,* SUBROUTINE TO OUTPUT PROMPT AND THEN INPUT* POUTIN„EQU„*/ŠLEA„PROMPTC(PC),A0‰PROMPTCHARACTTERBEGINMSG-ŠLEA„PROMPTCE(PC),A1ˆLASTCHARADDRTOOUTPUTŠBSR„MSGOUTOUTPUTPROMPTŠBNE.S‚POUTINER‹BRANCHIFERROR,POUTIN2ƒLEA„MSGIIOS(PC),A0‰INPUTPARAMBLOCKŠTRAPƒ#2!ŠBEQ.S‚POUTIN4ŒBRANCHIFNOERRORPOUTINER‚CMP.B‚#ISTABRK,D0ŠBEQ„BREAKSVŒHANDLEBREAK'PERR†BSR.S‚ERRMSGCOMPLAINIFERROR...ŠBRA„DUMPEREX‹...ANDEXIT*0POUTIN4ƒBSR„SBARGŽCALLFORARGUMENTSUBSTITUTION ŠBNE„PERRŠRTS%*************************************)* SUBROUTINE TO USE ERROR MESSAGE HANDLER*ƒD0-MESSAGECODE'*ƒA0-POINTSTOPARAMETERBLOCKIFANY* ERRMSG„EQU„*ŠMOVEM.LD0/A0,ERRPBLK-B(A5)*‰MOVE.WSR,-(A7) ŠMOVE.L#2,D0ŠLEA„ERRPBLK-B(A5),A0ŠTRAPƒ#4*‰MOVE.W(A7)+,CCRŠMOVEM.LERRPBLK-B(A5),D0/A0ŠRTS%*************************************7* SUBROUTINE TO PRINT OUT LISTING LINE - FORMATTED MODE* LSTOUT„EQU„*ŠMOVEM.LA0/A1,-(A7),ŠMOVE.LA0,LSTIOS+IOSSAD-B(A5)BEGINADDRESS*ŠMOVE.LA1,LSTIOS+IOSEAD-B(A5)ENDADDRESS%ŠLEA„LSTIOS(PC),A0ŠI/OPACKETADDRESSŠTRAPƒ#2"ŠBEQ.S‚LSTOUT.5‹BRANCHONNOERROR$ŠCMP.B‚#ISTABRK,D0ˆWASTHISABREAK?ŠBEQ„BREAKSVŒBRANCHIFYES!ŠBSR„ERRMSGCOMPLAINOFI/OERROR%ŠBSR.S‚CHAINCHK‹EXITIFINCHAINMODE ŠTST.L‚D0LSTOUT.5‚MOVEM.L(A7)+,A0/A1ŠCMP.B‚#ISTABRK,D0ŠBEQ„BREAKSVŒHANDLEBREAK ŠTST.B‚D0ŠRTS%*************************************"* SUBROUTINE TO LIST IN IMAGE MODE* IMGOUT„EQU„*4ŠOR.Wƒ#IOPIMG,LSTIOS+IOSOPT-B(A5)SETIMAGEMODEBIT ŠBSR„LSTOUT=ŠAND.W‚#$FFFF-IOPIMG,LSTIOS+IOSOPT-B(A5)CLEARIMAGEMODEBIT ŠTST.B‚D0ŠRTS%*************************************'* CHAINCHK ERR OR EXITS IF IN CHAIN MODE*ƒELSEJUSTRETURNS*CHAINCHK‚BTSTƒ#0,SAVD7+3-B(A5) ŠBEQ„DUMPEREXŠRTS%************************************** SUBROUTINE TO SKIP BLANKS1*ƒINPUT:‚A0POINTSTOBEGINNINGOFSTRINGTOSCAN$*‹A1POINTSTOENDOFSTRINGTOSCAN0*ƒOUTPUT:A0POINTSTOFIRSTNON-BLANKCHARACTER BLNKSKPƒEQU„* ŠCMP.L‚A0,A1'ŠBLT.S‚BLNKSKPX‹BRANCHIFDONESCANNINGŠCMP.B‚#'',(A0)ŠBNE.S‚BLNKSKPX ŠADD.W‚#1,A0ŠBRA.S‚BLNKSKP BLNKSKPX‚RTS%*************************************0* SUBROUTINE TO CONVERT BINARY TO ASCII (1-BYTE)*ƒENTRY:…BSRƒBINASCII*‹D0-BINARYBYTE(LOWORDER).*ƒEXIT:ƒD1-HEXASCIIVALUEINLOWORDERWORD*BINASCII‚EQU„* ŠCLR.L‚D1 ŠMOVE.BD0,D1 ŠROR.L‚#4,D1*ŠADD.B‚#'0',D1ŒCONVERTASIFDECIMAL(0-9)ŠCMP.B‚#'9',D1ŠBLE.S‚BIN2BRANCHIFOK*ŠADD.B‚#'A'-'9'-1,D1†CONVERTFORHEX(A-F) BIN2†EQU„* ŠLSL.W‚#4,D1 ŠROL.L‚#4,D1*ŠADD.B‚#'0',D1ŒCONVERTASIFDECIMAL(0-9)"ŠCMP.B‚#'9',D1ŒSEEIFDECIMALTYPEŠBLE.S‚BIN4BRANCHIFYES*ŠADD.B‚#'A'-'9'-1,D1†CONVERTFORHEX(A-F) BIN4†EQU„*ŠRTS%*************************************4* SUBROUTINE TO CONVERT BINARY INTO 8 BYTES OF ASCII*‰LEFTJUSTIFIED-BLANKFILLED**ƒENTRY:D0=BINARYTOCONVERT**ƒEXIT:A1=ADDRESSINMEMORYTODEPOSIT* ASCII8„EQU„*ŠMOVEM.LD1/D3/A1-A4,-(A7) ŠBSR„BINASCIIŠMOVE.WD1,6(A1) ŠROR.L‚#8,D0 ŠBSR„BINASCIIŠMOVE.WD1,4(A1) ŠROR.L‚#8,D0 ŠBSR„BINASCIIŠMOVE.WD1,2(A1) ŠROR.L‚#8,D0 ŠBSR„BINASCIIŠMOVE.WD1,(A1)*)ŠMOVE.L#8,D3ŽLEFTJUSTIFYANDBLANKFILL ŠLEA„7(A1),A4LJH0†CMP.B‚#$30,(A1) ŠBNE.S‚LJH5 ŠSUB.L‚#1,D3 ŠBEQ.S‚LJH4 ŠMOVE.LA1,A2 ŠLEA„1(A2),A3LJH1†MOVE.B(A3)+,(A2)+ ŠCMP.L‚A4,A3 ŠBLS.S‚LJH1ŠMOVE.B#'',7(A1) ŠBRA.S‚LJH0LJH4†MOVE.B#'0',(A1)LJH5†MOVEM.L(A7)+,D1/D3/A1-A4ŠRTSŠPAGE****ˆNON-LEAPDAYSBEFORETABLE*'PROMPTCE‚EQU„*-1ŠDS.Wƒ0ŠXDEFƒREENTERS,REENTERE8REENTERS‚DC.Bƒ$D,$A,'DMPA:REENTEROUTPUTDEVICENAME>'REENTERE‚EQU„*-1ŠDS.Wƒ0ŠXDEFƒOUTERRS,OUTERRD0,OUTERRE;OUTERRSƒDC.Bƒ'DMPA:ERRORWRITINGTOOUTPUTDEVICE-D0='OUTERRD0‚DC.Bƒ'00000000'ŠDC.Bƒ'RETRY?(Y/N)>'OUTERREƒEQU„*-1ŠDS.Wƒ0 BRKRCV„DC.Bƒ'DMPA:BREAKRVCD!!'BRKRCVEƒEQU„*-1ŠDS.Wƒ0ŠXDEFƒTSKNFND,TSKNFNDE#TSKNFNDƒDC.Bƒ'DMPA:TASKNOTFOUND'TSKNFNDE‚EQU„*-1ŠPAGE* *…MESSAGESSENTTOOUTPUTDEVICE*)ŠXDEFƒPAGSLEWS,PDATE,PTIME,PTASK,PAGSLEWEPAGSLEWS‚DC.Wƒ$200C-ŠDC.Bƒ'MEMORYƒDUMPƒANALYSIS‚'ŠDC.Bƒ'DATE:'PDATE…DC.Bƒ'XX/XX/XXƒ'ŠDC.Bƒ'TIME:'PTIME…DC.Bƒ'XX:XX:XX'PTASK…DC.Bƒ'„'ŠENDLNLFPAGSLEWE‚EQU„*-1ŠDS…0BLNKLINS‚DC.Bƒ'',CRBLNKLINE‚EQU„*-1ŠPAGE**ƒOPERATORINPUTCOMMANDS*ŠXDEFƒCMDTBL,CMDTBLE CMDTBL„EQU„* ŠXREFƒPADMPŠDC.Lƒ'ADRD',PADMP-CMDTBL ŠXREFƒPCCBSŠDC.Lƒ'CCBS',PCCBS-CMDTBL ŠXREFƒPDELAYŠDC.Lƒ'DELA',PDELAY-CMDTBL ŠXREFƒPFREEŠDC.Lƒ'FREE',PFREE-CMDTBL ŠXREFƒPFREQŠDC.Lƒ'FREQ',PFREQ-CMDTBL ŠXREFƒPGSTŠDC.Lƒ'GST',PGST-CMDTBL ŠXREFƒPHELPŠDC.Lƒ'HELP',PHELP-CMDTBLJYS4 ŠXREFƒPLCTBLŠDC.Lƒ'LCT',PLCTBL-CMDTBL ŠXREFƒPMAPŠDC.Lƒ'MAP',PMAP-CMDTBL ŠXREFƒPMDMPŠDC.Lƒ'MD‚',PMDMP-CMDTBLŠDC.Lƒ'MEM',PMAP-CMDTBL ŠXREFƒPNATBLŠDC.Lƒ'NAT',PNATBL-CMDTBL ŠXREFƒPNNTBLŠDC.Lƒ'NNT',PNNTBL-CMDTBLŠDC.Lƒ'OFFS',OFFSET-CMDTBLŠDC.Lƒ'OUTP',CHGOUT-CMDTBLŠDC.Lƒ'PAT',PDELAY-CMDTBL ŠXREFƒPPCBTBLŠDC.Lƒ'PCB',PPCBTBL-CMDTBLŠDC.Lƒ'QUIT',QUIT-CMDTBL ŠXREFƒPRECVQŠDC.Lƒ'RCVQ',PRECVQ-CMDTBL ŠXREFƒPREADYŠDC.Lƒ'READ',PREADY-CMDTBL ŠXREFƒPREGSŠDC.Lƒ'REGS',PREGS-CMDTBL ŠXREFƒPSCBTBLŠDC.Lƒ'SCB',PSCBTBL-CMDTBL ŠXREFƒPSTAKŠDC.Lƒ'STAC',PSTAK-CMDTBL ŠXREFƒPSTCBŠDC.Lƒ'STCB',PSTCB-CMDTBL ŠXREFƒPSYSPŠDC.Lƒ'SYSP',PSYSP-CMDTBL ŠXREFƒALLTBLŠDC.Lƒ'TABL',ALLTBL-CMDTBLŠXREFƒPONETASKŠDC.Lƒ'TASK',PONETASK-CMDTBL ŠXREFƒPTCBSŠDC.Lƒ'TCBS',PTCBS-CMDTBL ŠXREFƒPTRACEŠDC.Lƒ'TRAC',PTRACE-CMDTBL ŠXREFƒPTIATŠDC.Lƒ'TRAP',PTIAT-CMDTBL ŠXREFƒPUDRTBLŠDC.Lƒ'UDR',PUDRTBL-CMDTBL ŠXREFƒPUSRQŠDC.Lƒ'USRQ',PUSRQ-CMDTBL ŠXREFƒPUSTŠDC.Lƒ'UST',PUST-CMDTBL ŠXREFƒPUTCBŠDC.Lƒ'UTCB',PUTCB-CMDTBL ŠXREFƒPTMITQŠDC.Lƒ'XMTQ',PTMITQ-CMDTBL CMDTBLEƒEQU„* ééé1ŠTTL„DUMPRCMD.AIˆ-Crashdumpanalysis-DUMPANALŠPAGE9**********************************************************INCLUDEFILE:DUMPRMCD.AI*9***********************************************************ŠREADCOMMANDLINE*ŠOPENINPUTFILE*ŠREDIRECTOUTPUTIFREQUESTED* ŠXREFƒPARSE-COMMANDL‚LEA„CLINE(PC),A0‹COMMANDLINEBUFFERŠBSR„PARSEŽPARSECOMMANDLINEŠTST.L‚D0‘CHECKFORERRORSŠBPL.S‚COMDL8BRANCHIFNONE#COMDL4„MESGƒCMLERS(PC),CMLERE(PC),X ŠBRA„QUITACOMDL8„MOVEM.LA1-A2,PARSAREG-MBD(A6)SAVECLINEASOUTPUTSOURCE**‡SETUPOUTPUTDEVICE*(ŠMOVE.LA1,D0ŽISTHEREANOUTPUTDEVICE?ŠBEQ.S‚COMDL12ŒBRANCHIFNO'ŠBSR„NEWOUTGOTOOUTPUTCHANGEROUTINE**‡SETUPINPUTDEVICE*!COMDL12ƒBSR.S‚NEWINŽGOOPENINPUT"ŠBEQ.S‚COMDL16ŒBRANCHIFNOERRORS"ŠBMI„COMDL4BRANCHIFSYNTAXERRORŠLEA„ASGERRS+6(PC),A0'ŠMOVE.L#'INP',(A0)‡INPUTASSIGNERRORŠLEA„ASGERRD0(PC),A1„SAVED0 ŠBSR„CONVHEX4ŠMESGƒASGERRS(PC),ASGERRE(PC),X ŠBRA„QUIT*7COMDL16ƒMOVE.LOPTSRT-MBD(A6),D0‚Startofoptionsfield"ŠBEQ.S‚CMDL99Branchifnooptions#ŠMOVE.LD0,A6ŽForOPTIONsubroutine ŠXREFƒOPTION ŠBSR„OPTIONŠLEA„BEGDATA(PC),A6‰RestoreA6,ŠCMP.B‚#$40,D0ŒArewedonewiththeoptions?ŠBEQ.S‚CMDL99Branchifyes!ŠBTSTƒ#7,D0ŽAnyerrorinoptions?ŠBEQ.S‚OPOK1ŽBranchifno0OPTERR„MOVE.L#EM_NVO,D0‰Complainonbadoptions ŠBSR„ERRMSGŠBRA„QUITQuitonbadoptions*&OPOK1…CMP.B‚#'S',D1ŒIstheoption'S'? ŠBNE„OPTERRBranchifno-errorŠMOVE.LD3,SYSPAROF-MBD(A6) ŠBLE„OPTERR* CMDL99„RTSŠPAGE**…SETUPINPUTDEVICE*NEWIN…MOVE.LA6,-(A7)‹SaveA6'ŠLEA„CLINE(PC),A0‹STARTOFCOMMANDLINE"ŠLEA„INPFHS(PC),A6†FHSPARAMBLOCK&ŠMOVE.L#'„',FHSVOL(A6)DEFAULTVOLUMEŠCLR.W‚FHSUSN(A6)‰DEFAULTUSER$ŠMOVE.L#'DUMP',FHSFIL(A6)FILENAMEŠMOVE.L#'„',FHSFIL+4(A6)"ŠMOVE.W#'SY',FHSEXT(A6)ƒEXTENTION ŠBSR„EDITFILEŠLEA„INPFHS(PC),A0ŠTRAPƒ#3‘ASSIGNINPUTDEVICEŠTST.L‚D0‘SETCONDITIONCODESŠMOVE.L(A7)+,A6‹RestoreA6ŠRTS*[Ld  ŠSECTION0**…ASSIGNINPUTPARAMETERBLOCK*INPFHS„DC.WƒFHASGNŠDC.WƒFOPER+FOPCON+IOPRANŠDC.Wƒ1 ŠDC.Bƒ'„'ŠDC.Wƒ0 ŠDC.Bƒ''ŠDC.Lƒ0,0,0,0,0,0ééé éééé1ŠTTL„DUMPREGS.SAˆ-Crashdumpanalysis-DUMPANALŠPAGE DUMPREGS‚IDNTƒ4,2DumpregistersŠPAGE*‰INCLUDEANALMACR.AIŠINCLUDEANALMACR.AI ŠXREFƒMBD**‡REGISTEROFFSETS* ŠOFFSET0 CRSPC…DS.Lƒ1ŠDS.Wƒ1 CRSSR…DS.Wƒ1 CRSD0…DS.Lƒ8 CRSA0…DS.Lƒ8 ŠSECTION0* BEGDATAƒEQU„*BDˆEQU„** * HEADINGS*TCHREG„ENDLINESPACE…DC.Bƒ''2SPACEE„DC.Bƒ'‡REGISTERSSAVEDWHENSYSTEMCRASHED'ŠENDLINE+ŠDC.Bƒ'ˆ----------------------------------'ŠENDLINETCHREGEƒEQU„*-1ŠDS.Wƒ0**…SYSTEMREGISTERS* TCREG…ENDLINEŠFLD„PPC,<'PC'>,8,CŠFLD„PSR,<'SR'>,4ŠFLD„PD0,<'D0'>,8,CŠFLD„PD1,<'D1'>,8,CŠFLD„PD2,<'D2'>,8,CŠFLD„PD3,<'D3'>,8ŠFLD„PD4,<'D4'>,8,CŠFLD„PD5,<'D5'>,8,CŠFLD„PD6,<'D6'>,8,CŠFLD„PD7,<'D7'>,8ŠFLD„PA0,<'A0'>,8,CŠFLD„PA1,<'A1'>,8,CŠFLD„PA2,<'A2'>,8,CŠFLD„PA3,<'A3'>,8ŠFLD„PA4,<'A4'>,8,CŠFLD„PA5,<'A5'>,8,CŠFLD„PA6,<'A6'>,8,CŠFLD„PA7,<'A7'>,8 TCREGE„EQU„*ŠDS.Wƒ0TCHSTK„ENDLINEŠDC.Bƒ'ˆSYSTEMSTACKAREA'ŠENDLINEŠDC.Bƒ'ˆ-----------------'ŠENDLINETCHSTKEƒEQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION8*!ŠXREF.SPDSKERR,CONVDEC2,CONVDEC3ŠXREF.SCRASHSAVŠXREF.SERMSG1,ERMSG1E ŠXREF.SRDBUF***‡PRINTREGISTERS* ŠXDEFƒPRREGS*PRREGS„LEA„RDBUF(PC),A4ŠRD…#$60,#CRASHSAV,(A4),PDSKERRŠLEA„RDBUF(PC),A4 ŠPRINT‚TCHREGŠMVHEX‚4,CRSPC(A4),PPC(PC)ŠMVHEX‚2,CRSSR(A4),PSR(PC)ŠMVHEX‚4,CRSD0(A4),PD0(PC)ŠMVHEX‚4,CRSD0+4(A4),PD1(PC)ŠMVHEX‚4,CRSD0+8(A4),PD2(PC)ŠMVHEX‚4,CRSD0+12(A4),PD3(PC)ŠMVHEX‚4,CRSD0+16(A4),PD4(PC)ŠMVHEX‚4,CRSD0+20(A4),PD5(PC)ŠMVHEX‚4,CRSD0+24(A4),PD6(PC)ŠMVHEX‚4,CRSD0+28(A4),PD7(PC)ŠMVHEX‚4,CRSA0+00(A4),PA0(PC)ŠMVHEX‚4,CRSA0+04(A4),PA1(PC)ŠMVHEX‚4,CRSA0+08(A4),PA2(PC)ŠMVHEX‚4,CRSA0+12(A4),PA3(PC)ŠMVHEX‚4,CRSA0+16(A4),PA4(PC)ŠMVHEX‚4,CRSA0+20(A4),PA5(PC)ŠMVHEX‚4,CRSA0+24(A4),PA6(PC)ŠMVHEX‚4,CRSA0+28(A4),PA7(PC) ŠPRINT‚TCREGŠRTSŠPAGE**‡DUMPSYSTEMSTACK*ŠXREF.SEXCSTACKlhu ŠXREF.SADROFST2,ADRBGND,CNTBYTEŠXREF.SPMDUMP* ŠXDEFƒPRSTAK*PRSTAK„MOVE.LEXCSTACK(A3),D4ŠBEQ.S‚PRSTAK9 ŠPRINT‚TCHSTKŠSUB.L‚#$200,D4,ŠMOVE.LD4,ADROFST2-MBD(A6)STARTINGADDRESS#ŠCLR.L‚ADRBGND-MBD(A6)„COUNTFROM0ŠMOVE.L#$200,CNTBYTE-MBD(A6) ŠBSR„PMDUMP PRSTAK9ƒRTSŠENDé ééééé1ŠTTL„DUMPRESP.SAˆ-Crashdumpanalysis-DUMPANALŠPAGE*DUMPRESP‚IDNTƒ4,2RESPONDTOINPUTREQUEST ŠXREFƒMBD*‰INCLUDEANALMACR.AI*‰INCLUDE9995.&.TR1.EQ*‰INCLUDE9995.&.IOE.EQ*‰INCLUDEDUMPMOVM.AI*‰INCLUDEANALPDMP.AIŠNOLISTŠINCLUDEANALMACR.AIŠINCLUDE9995.&.TR1.EQŠINCLUDE9995.&.IOE.EQŠLISTŠINCLUDEDUMPMOVM.AIŠINCLUDEANALPDMP.AI2ŠTTL„DUMPRESP.SAˆ-Crashdumpanalaysis-DUMPANALŠPAGE ŠSECTION0*$*†DATASECTION--RESPONDTOCOMMAND*SAVTNAMƒDC.Lƒ0’SAVETASKNAMESAVTSESƒDC.Lƒ0’SAVESESSIONSAVENUMƒDC.Lƒ0’SAVEPARTITION#* ŠOFFSET0TASKTNAM‚DS.Lƒ1TASKTSES‚DS.Lƒ1TASKTADR‚DS.Lƒ1TASKTESZ‚EQU„*-TASKTNAMŠPAGE ŠSECTION8*!ŠXREF.SBLDTASKT,TASKTCNT,TASKTBLŠXREF.SCONVAORHŠXREF.SCMDPRO,NEWPAGEŠXREF.STSKNFND,TSKNFNDE*ŠXDEFƒPONETASK PONETASK‚MOVE.LA0,-(A7)‹SAVEA0ŠBSR„BLDTASKT‹BUILDTASKTABLEŠMOVE.L(A7)+,A0‹RESTOREA0*!*…GETTASKNAMEFROMCOMMANDLINE*ŠLEA„SAVTNAM(PC),A1ŠBSR„CONVAORH‹CONVERTTASKNAME)ŠBMI.S‚ONETK6BRANCHIFILLEGALCHARACTERŠLEA„SAVTSES(PC),A1ŠBSR„CONVAORH‹CONVERTSESSION)ŠBMI.S‚ONETK6BRANCHIFILLEGALCHARACTER**…FINDTASKINTABLE*ŠLEA„TASKTBL(PC),A5ŠLEA„BEGDATA(PC),A63ŠMOVEM.LSAVTNAM-BD(A6),D0-D1…TASKNAMEANDSESSION2ŠMOVE.WTASKTCNT(PC),D4„NUMBEROFENTRIESINTABLE ŠBRA.S‚ONETK55ONETK2„CMP.L‚TASKTNAM(A5),D0„ISTHISTHEONEWEWANT?ŠBNE.S‚ONETK4BRANCHIFNOŠTST.L‚D1‘WASSESSIONGIVEN)ŠBEQ.S‚ONETK10ŒBRANCHIFNO-FOUNDENTRY*ŠCMP.L‚TASKTSES(A5),D1„DOESSESSIONMATCH?)ŠBEQ.S‚ONETK10ŒBRANCHIFGOODENTRYFOUND%ONETK4„LEA„TASKTESZ(A5),A5„NEXTENTRYONETK5„DBRAƒD4,ONETK2=ONETK6„MESGƒTSKNFND(PC),TSKNFNDE(PC)TELLUSERTASKNOTFOUND ŠBRA„CMDPRO1ONETK10ƒMOVE.LTASKTADR(A5),A5„GETADDRESSOFTCBŠXREF.SONETASKŠBSR„ONETASKŒGOPRINTTASKINFO ŠBRA„CMDPRO* ŠXDEFƒPTCBSŠXREF.STCBCHNPTCBS…BSR„NEWPAGEŠBSR„TCBCHNPRINTTCBCHAIN ŠBRA„CMDPRO* ŠXDEFƒPSTCBŠXREF.SSTCBCHNPSTCB…BSR„NEWPAGE}T†uŽZ#ŠBSR„STCBCHNŒPRINTSYSTEMTCBCHAIN ŠBRA„CMDPRO* ŠXDEFƒPUTCBŠXREF.SUTCBCHNPUTCB…BSR„NEWPAGE!ŠBSR„UTCBCHNŒPRINTUSERTCBCHAIN ŠBRA„CMDPRO* ŠXDEFƒPTRACEŠXREF.STRACSUBPTRACE„BSR„NEWPAGEŠBSR„TRACSUBŒPRINTTRACETABLE ŠBRA„CMDPRO* ŠXDEFƒPSTAKŠXREF.SPRSTAKPSTAK…BSR„NEWPAGEŠBSR„PRSTAKPRINTSTACK ŠBRA„CMDPRO* ŠXDEFƒPGST ŠXREF.SGSTBLPGST†BSR„NEWPAGE%ŠBSR„GSTBLŽPRINTGLOBALSEGMENTTABLE ŠBRA„CMDPRO* ŠXDEFƒPNNTBL ŠXREF.SNNTBLPNNTBL„BSR„NEWPAGE #ŠBSR„NNTBLŽPRINTNETWORKNAMETABLE ŠBRA„CMDPRO* ŠXDEFƒPNATBL ŠXREF.SNATBLPNATBL„BSR„NEWPAGE&ŠBSR„NATBLŽPRINTNETWORDADDRESSTABLE ŠBRA„CMDPRO* ŠXDEFƒPLCTBL ŠXREF.SLCTBLPLCTBL„BSR„NEWPAGE&ŠBSR„LCTBLŽPRINTLOGICALCONNECTTABLE ŠBRA„CMDPRO* ŠXDEFƒPPCBTBLŠXREF.SPCBTBL ŠXREFƒMEMOFFPPCBTBLƒTST.L‚MEMOFF(A3)ŠBNE.S‚PPCBTBL1 ŠBSR„NEWPAGE'ŠBSR„PCBTBLPRINTPRIMARYCONTROLBLOCKPPCBTBL1‚BRA„CMDPRO* ŠXDEFƒPSCBTBLŠXREF.SSCBTBL ŠXREFƒMEMOFFPSCBTBLƒTST.L‚MEMOFF(A3)ŠBNE.S‚PSCBTBL1 ŠBSR„NEWPAGE)ŠBSR„SCBTBLPRINTSECONDARYCONTROLBLOCKPSCBTBL1‚BRA„CMDPRO* ŠXDEFƒPUDRTBLŠXREF.SUDRTBLPUDRTBLƒBSR„NEWPAGE&ŠBSR„UDRTBLPRINTUSERDIRECTIVETABLE ŠBRA„CMDPRO* ŠXDEFƒPHELP ŠXREFƒHELPPHELP…BSR„NEWPAGEŠBSR„HELPPRINTCOMMANDS ŠBRA„CMDPRO* ŠXDEFƒPFREQ ŠXREF.SFREQ ŠXREFƒMEMOFFPFREQ…TST.L‚MEMOFF(A3) ŠBNE.S‚PFREQ1 ŠBSR„NEWPAGEŠBSR„FREQPRINTSDLCFREEQUEUEPFREQ1„BRA„CMDPRO* ŠXDEFƒPUSRQ ŠXREF.SUSRQ ŠXREFƒMEMOFFPUSRQ…TST.L‚MEMOFF(A3) ŠBNE.S‚PUSRQ1 ŠBSR„NEWPAGEŠBSR„USRQPRINTSDLCUSERQUEUEPUSRQ1„BRA„CMDPRO* ŠXDEFƒPRECVQ ŠXREF.SRECVQ ŠXREFƒMEMOFFPRECVQ„TST.L‚MEMOFF(A3)ŠBNE.S‚PRECVQ1 ŠBSR„NEWPAGE#ŠBSR„RECVQŽPRINTSDLCRECEIVEQUEUEPRECVQ1ƒBRA„CMDPRO* ŠXDEFƒPTMITQ ŠXREF.STMITQ ŠXREFƒMEMOFFPTMITQ„TST.L‚MEMOFF(A3)ŠBNE.S‚PTMITQ1 ŠBSR„NEWPAGE ŠBSR„TMITQPTMITQ1ƒBRA„CMDPRO* ŠXDEFƒPUST ŠXREF.SUSTBLPUST†BSR„NEWPAGE%ŠBSR„USTBLŽPRINTUSERSEMAPHORETABLE ŠBRA„CMDPRO* ŠXDEFƒPSYSPŠXREF.SSYSPARMPSYSP…BSR„NEWPAGE$ŠBSR„SYSPARMŒPRINTSYSTEMPARAMETERS ŠBRA„CMDPRO* ŠXDEFƒPCCBSŠXREF.SCRCCBS-PCCBS…BSR„CRCCBSPRINTCHANNELCONTROLBLOCKS ŠBRA„CMDPRO* ŠXDEFƒPTIATŠXREF.SCTRAPASGPTIAT…BSR„NEWPAGE*ŠBSR„CTRAPASG‹PRINTTRAPASSIGNMENTTABLES ŠBRA„CMDPRO* ŠXDEFƒPMAP ŠXREF.SPRMAPPMAP†BSR„NEWPAGEŠBSR„PRMAPŽPRINTMEMORYMAP ŠBRA„CMDPRO* ŠXDEFƒPFREEŠXREF.SPRFREE-PFREE…LEA„SAVENUM(PC),A1‰PLACETOSAVEPART#ŠBSR„CONVAORH‹GETNUMBERŠCLR.L‚D7‘DEFAULT#IS0 ŠCLR.L‚D0ŠLEA„SAVENUM(PC),A1ŠMOVE.B(A1),D0ŠCMP.B‚#$30,D0ŒISCHAR<0?ŠBLT.S‚PFREEGIFYES-USE0ŠCMP.B‚#$39,D0ŒISCHAR>9?ŠBGT.S‚PFREEGIFYES-USE0ŠAND.B‚#$0F,D0ŒSAVENUMBERONLYŠMOVE.LD0,D7ŽSAVECHARŠLEA„SAVENUM(PC),A1ŠMOVE.B1(A1),D0ŠCMP.B‚#$30,D0ŒISCHAR<0?ŠBLT.S‚PFREEGIFYES-USE0ŠCMP.B‚#$39,D0ŒISCHAR>9?ŠBGT.S‚PFREEGIFYES-USE0ŠAND.B‚#$0F,D0ŒSAVENUMBERONLY ŠMULUƒ#10,D7 ŠADD.L‚D0,D7(PFREEG„BSR„PRFREEPRINTFREEMEMORYLIST ŠBRA„CMDPRO* ŠXDEFƒPREADYŠXREF.SREADYLPREADY„BSR„NEWPAGEŠBSR„READYLPRINTREADYLIST ŠBRA„CMDPRO* ŠXDEFƒPDELAYŠXREF.SDELAYLPDELAY„BSR„NEWPAGEŠBSR„DELAYLPRINTDELAYLIST ŠBRA„CMDPRO* ŠXDEFƒPREGSŠXREF.SPRREGSPREGS…BSR„NEWPAGEŠBSR„PRREGSPRINTREGISTERS ŠBRA„CMDPRO ŠPAGE1**************************************************¯**ALLTBL-PRINTEXECTABLES”**¯*1************************************************** ŠXDEFƒALLTBLALLTBL„BSR„NEWPAGEŠBSR„SYSPARMŒPRINTSYSPARTABLEŠBSR„PRSTAKPRINTSTACKŠBSR„PRREGSPRINTREGISTERS*ŠBSR„CTRAPASG‹PRINTTRAPASSIGNMENTTABLES!ŠBSR„PRMAPŽPRINTMEMORYMAPTABLEŠBSR„TCBCHNPRINTTCBCHAIN"ŠBSR„READYLPRINTREADYLISTCHAIN"ŠBSR„DELAYLPRINTDELAYLISTCHAINŠBSR„USTBLŽPRINTUSTŠBSR„GSTBLŽPRINTGSTŠBSR„CRCCBSPRINTCCBSŠBSR„TRACSUBŒPRINTTRACETABLE"ŠBRA„CMDPRORETURNTOCOMMANDLOOPŠEND;ŠTTL„DUMPTRAC.SAˆ-Crash/Systemanalysis-DUMPANAL/SYSANAL&DUMPTRAC‚IDNTƒ4,2LISTTHETRACETABLE ŠXREFƒMBDŠNOLIST*‰INCLUDEANALMACR.AIŠINCLUDEANALMACR.AIŠLIST2ŠTTL„DUMPTRAC.SAˆ-Crashdumpanalaysis-DUMPANALŠINCLUDE9995.&.TRACE.EQŠPAGE ŠSECTION0 BEGDATAƒEQU„*BDˆEQU„*&SAVETIM1‚DC.Lƒ0’SAVETIMETOCALCDIFF&SAVETIM2‚DC.Lƒ0’SAVETIMETOCALCDIFF6TRCTOP„DS.Lƒ1’Lastentry+1intracetable(memaddr).TRCNOW„DS.Lƒ1’Entrywe'redoingnow(memaddr)**ˆTRACEƒTABL E*TRTBHD„ENDLNLFŠDC.Bƒ'ˆTRACETABLE'ŠENDLINEŠDC.Bƒ'ˆ-----------'ŠENDLINE!ŠFLD„TRHDPR,<'TRCPTRƒ'>,8POINTER ŠFLD„TRHDLN,<'TRCLNGƒ'>,8LENGTHŠENDLINE%ŠDC.Bƒ'CODE‚SR…PC…A0-PC2…A6‡D0†TIME'ŠDC.Bƒ'‹TIMEDIFF'ŠENDLINETRTBHDEƒEQU„*-1**ƒTRACETABLEDETAILLINE*ŠDS.Wƒ0 TRTB†EQU„*TRHDCO„DC.Bƒ0,0,0,0ŒCODEŠFLD„TRHDSR,<''>,4,CƒSRŠFLD„TRHDPC,<''>,8,CƒPCŠFLD„TRHDA0,<''>,8,CƒA0ŠFLD„TRHDA6,<''>,8,CƒA6ŠFLD„TRHDD0,<''>,8,CƒD0ŠFLD„TRHDTM,<''>,2,CƒTIMEŠDC.Bƒ':XX:XX.XXX'ŠFLD„TRHDMC,<''>,3,C ŠFLD„TRHDDF1,<''>,2,C‚TIMEDIFFŠDC.Bƒ':XX:XX.XXX'ŠFLD„TRHDDF2,<''>,3 TRTBE…EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION8*#*‚***ƒPRINTTHETRACETABLEƒ**** ŠXDEFƒTRACSUB$ŠXREF.SRDBUF,ERMSG1,ERMSG1E,PDSKERR*ŠXREF.SCONVTIME,CONVDEC3,NEWPAGE,TRACEBEG*TRACSUBƒBEGSUBŠMOVE.LTRACEBEG(A3),D0,ŠBEQ„CTTR50Branchifnotracetabledefined%ŠRD…#8,TRACEBEG(A3),RDBUF(PC),PDSKERR ŠLEA„RDBUF(PC),A5‡BUFFERADDRESS ŠBSR„NEWPAGE&ŠMVHEX‚4,TRCPTR(A5),TRHDPR(PC)‚POINTER%ŠMVHEX‚4,TRCLNG(A5),TRHDLN(PC)‚LENGTH%ŠPRINT‚TRTBHDPRINTTHETRACEHEADING"ŠMOVE.LTRCPTR(A5),A4†SAVEPOINTER*EŠMOVE.LTRCLNG(A5),TRCTOP-BD(A6)Onebeyondlastentryintracetable0ŠMOVE.LTRACEBEG(A3),A4„Beginningoftracetable/ŠADD.L‚#TRCENTRS,A4‡Pointto1stphysicalentry@ŠMOVE.LA4,TRCNOW-BD(A6)ƒThisistheentrywe'recurrentlydoing!ŠWHILE.LA4TRCTOP-BD(A6)DO?RD…#TRCENTSZ,A4,RDBUF(PC),PDSKERRReadthenextentryintraceLEA„RDBUF(PC),A4–NŸ,$MVHEX‚2,TRCCODE(A4),TRHDCO(PC)‚CODE MVHEX‚2,TRCSR(A4),TRHDSR(PC)‚SR MVHEX‚4,TRCPC(A4),TRHDPC(PC)‚PC MVHEX‚4,TRCA0(A4),TRHDA0(PC)‚A0 MVHEX‚4,TRCA6(A4),TRHDA6(PC)‚A6 MVHEX‚4,TRCD0(A4),TRHDD0(PC)‚D0MOVE.LTRCTIME(A4),D0…TIMEMOVE.LD0,D6ŽSAVEFORDIFFLEA„TRHDTM(PC),A1&BSR„CONVTIME‹CONVTOHRS,MIN,SEC,MSECSWAPƒD3‘MILLISECS MOVE.LD3,D0 LEA„1(A1),A1BSR„CONVDEC3‹CONVERTTODEC CLR.L‚D0 MOVE.WTRCTIM2(A4),D0…MICROSECSMOVE.LD0,D7ŽSAVEFORDIFF LEA„1(A1),A1 BSR„CONVDEC3‹CONVERTTODECIMAL MOVE.LD7,D0+SUB.L‚SAVETIM2-BD(A6),D0ˆDIFFINMICROSECS BPL.S‚CTTR34"ADD.L‚#1000,D0‹ADJUSTIFNEGATIVEADD.L‚#1,SAVETIM1-BD(A6) CTTR34‡MOVE.LD7,SAVETIM2-BD(A6)LEA„TRHDDF2(PC),A1 BSR„CONVDEC3‹CONVERTTODECIMAL MOVE.LD6,D0-SUB.L‚SAVETIM1-BD(A6),D0ˆMILLISECDIFFERENCEMOVE.LD6,SAVETIM1-BD(A6)LEA„TRHDDF1(PC),A1%BSR„CONVTIME‹CONVERTTOHRS,MIN,SECSSWAPƒD3MOVE.LD3,D0ŽMILLISEC LEA„1(A1),A1 BSR„CONVDEC3‹CONVERTTODECIMALMOVE.B#'',TRHDDF1-BD(A6) PRINT‚TRTBPRINTTHETRACELINEMOVE.LTRCNOW-BD(A6),A4)LEA.L‚TRCENTSZ(A4),A4„BumptonextentryMOVE.LA4,TRCNOW-BD(A6)ŠENDW CTTR50„ENDSUBŠENDééé=/*=/*†E.AF=/*.=/* Chain file to assemble the VERSAdos Editor=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to EDITOR.LS=/*=/IFC \1ƒ=ARGEDITOR.LS=/ENDIF=/*=ASM E.SA,E.RO,\1;R-WZ=226 =/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ =/*ƒCRTD.AI =/*ƒCRTE11.AI =/*ƒCRTE2.AI =/*ƒFMSINT.AI=/*}=/*=ENDéééééé§=/*=/*†E.LF=/*"=/* Link chain file to create E.LO=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to EDITOR.LL=/*=/IFC \1ƒ=ARGEDITOR.LL=/ENDIF=/*=LINK ,E.LO,\1;MIXAHS SEG EDTD:0 $0SEG EDIT(GR):8,14 TASK EDIT INPUT E.ROLIB 0.&.UTILIB.ROATTR D PEND=/*=ENDéééééé °ƒLISTD‰TTLCRTEDITORREL‚4.4002/22/85(COPYRIGHT1982BYMOTOROLA,INC.)MEDITIDNT4,4CRTEDITORREL‚4.4002/22/85(COPYRIGHT1982BYMOTOROLA,INC.)*ˆINCLUDE9995.&.TR1.EQ*ˆINCLUDE9995.&.IOE.EQ*‰NOLISTƒINCLUDE9995.&.TR1.EQƒINCLUDE9995.&.IOE.EQ‰LISTB********************************************************************ˆEQUATESFORM68000CRTEDITOR*B******************************************************************* CRT MACRO- LEA \1-DATASG(A5),A0 PARAMETER BLOCK ADDRESSMOVE.LA1,-(A7)†SAVEA1* LEA \2-DATASG(A5),A1 BUFFER START ADDRESS/ MOVE.L A1,IOSSAD(A0) SAVE START BUFFER ADDRESS/ MOVE.L A1,IOSEAD(A0) SET-UP END BUFFER ADDRESS" ADD.L \3,IOSEAD(A0) ADD IN LENGTH' SUB.L #1,IOSEAD(A0) ACTUAL END ADDRESSMOVE.L(A7)+,A1…RESTOREA1 BSR CRT\0 DO THE INPUT/OUTPUT ENDM**ŠMACROSFORFMSINT** SFHSCO PARAMETERS: * 1. COMMAND * 2. OPTIONS0*3.ADDRESSREGISTER(->‚FHSPARAMETERBLOCK)*>SFHSCO MACRO * SETS COMMAND AND OPTIONS IN FHS PARAMETER BLOCK MOVE.L #((\1)*$10000)+\2,(\3) ENDM** SIOSCO PARAMETERS: * 1. COMMAND * 2. OPTIONS0* 3. ADDRESS REGISTER ( -> IOS PARAMETER BLOCK )*>SIOSCO MACRO * SETS COMMAND AND OPTIONS IN IOS PARAMETER BLOCK MOVE.L #((\1)*$10000)+\2,(\3) ENDM** SFATTR PARAMETERS:1* 1. OPTIONS: FILE TYPE, OR'ED INTO OPTIONS FIELD* 2. RECORD SIZE ( 0 => VRL )/* 3. FAB AND DATA BLOCK SIZE, 2 ONE BYTE VALUES * 4. KEY SIZE0* 5. ADDRESS REGISTER ( -> FHS PARAMETER BLOCK )*9SFATTR MACRO * SETS FILE ATTRIBUTES FOR FHS ALLOCATE CALLƒOR.W#\1,FHSOPT(\5)OPTIONS IFNE \2$ MOVE.W #\2,FHSLRL(\5) RECORD LENGTH ENDC IFEQ \2 CLR.W FHSLRL(\5) ENDC< MOVE.L #(\4)*$10000+\3,FHSSIZ(\5) KEY, FAB, DATA BLOCK SIZE ENDM PAGE*"*Š*********************************FMSINT-EQUATES"*Š**********************************CMN EQU $FFFFFF00 USED FOR MOVE.L $80-$FF TO GEN 2 BYTE INSTRUCTIONS**‚PRINTEREQUATES*"LFCHAR EQU $0A LINE FEED CHARACTER¹MÂ?Ê;ÒDÚ5"FFCHAR EQU $0C FORM FEED CHARACTER**‚RECORDEQUATES*3LINEBL EQU 79 RECORD'S LINE BUFFER LENGTH IN EDITOR/KEYSIZ EQU 0 NULL KEYS FOR UNLINENUMBERED FILES0VRLFIL EQU 0 VARIABLE RECORD LENGTH IN EDIT FILE4MXRECLEQULINEBL‚MAXIMUMRECORDLENGTHINEDITFILE**‚FILENAMEEQUATES*4FILNML EQU 24 FULLY QUALIFIED FILE NAME FIELD LENGTH%VOLNML EQU 4 VOLUME NAME FIELD LENGTH**‚DATABLOCKEQUATES*BDEFSIZ EQU $108 1 SECTOR FAB/8 SECTOR DATA BLK(DEFAULT ALLOCATION)?DBMAX EQU 20 MAXIMUM DATA BLOCK SIZE FOR EDIT - LARGER FILES TO**‚BEEDITEDWITHDEFAULTSIZESCRATCHFILE*:*‚FMSLOGICALADDRESSESFORSEGMENTSTOBEUSEDASBUFFERS*NFMSDBA EQU $10000 LOGICAL BUFFER START FOR EDIT FILE DATA BLOCK (SHARED W/FMS)NFMSSRA EQU FMSDBA+DBMAX*$100 BUFFER START FOR SOURCE FILE DB OR EXTRACT BUFFER*‚PAGE**‚DATASECTION**‚DEFINEDATALAYOUTS*:*‚********************************************************:*‚FMSINTPARAMETERBLOCK(USEDBETWEENFMSINTANDEDITOR)::*‚*********************************************************1OFFSET0‚POINTEDTOBYA3(A0ONCALLTOFMSINT)*FMSTAT DS.B 1 STATUSFMSCMD DS.B 1 COMMANDFMSRECDS.L1…LRN7FMSBUFDS.L1…FWAOFLINEBUFFER,POINTERTOFILENAMES$FMSRECNDS.W1‡#OFRECORDSAFFECTED*FMSEFSDS.B1‡EDITFILESTATUS*DEFSUCH EQU 0 EDIT FILE STATUS UNCHANGED (EDIT FILE .EQ. OUTPUT FILE)BEFSCHG EQU 1 EDIT FILE STATUS CHANGED (EDIT FILE .NE. OUTPUT FILE)$EFSABR EQU -1 EDIT FILE STATUS ABORT* FMSOFSDS.B1‡OUTP UTFILESTATUS*$OFSSAV EQU 0 OUTPUT FILE STATUS SAVE&OFSDEL EQU 1 OUTPUT FILE STATUS DELETE* NONE>FMSCNT DS.B 1 N'TH STRING OCCURENCE TO BE FOUND, N = 1,2,3,...AFMSADRDS.L1POINTERTOSTRINGADDRESSES(STARTANDEND:‚DS.L2)'FMSBRKDS.B1‚BREAK=$FF,NOBREAK=0*!*‚*******************************!*‚FILENAME1,FILENAME2PARAMETERS!*‚********************************;OFFSET„0„POINTEDTOBYFMSBUFINOPENCMD,SAVECMD,MERGCMD*+FLNM1 DS.B FILNML FULLY QUALIFIED FILENAME1 DS.W 1 RESERVED DS.W 1 READ/WRITE CODES+FLNM2 DS.B FILNML FULLY QUALIFIED FILENAME2*;OPTIONSDS.B1‚OPTIONS(PASSEDPARAM.-THISANDNEXTBYTE)*‚BITINTERPRETATION:AOFSEQEQU1‚BIT1SET=S-SEQUENTIALOUTPUTFORMATFORNEWFILEIOFISQEQU2‚BIT2SET=I-INDEXEDSEQUENTIALOUTPUTFORMATFORNEWFILEAOFDEFEQU0‚BIT0SET=DEFAULTFORMAT(INDEXED/FILENAME1FORMAT)HKPSAME EQU 3 BIT 3 SET => KEEP FILE SAME - NO CHANGES ALLOWED (INPUT CANL* BE SEQUENTIAL, VRL FILE OR FILE WITH LONGER THAN 79 BYTE RECORDS - RECORDS* ARE NOT TRUNCATED AS USUAL.*AOFSTAT DS.B 1 OUTPUT FILE STATUS (FSTADNM/FSTANNM IF 'FILENAME2',4*‚0=>'FILENAME1'ISFOROUTPUT-RETURNPARAMETER)*‚DS.W1READ/WRITECODES‚PAGE**‚***************************‚MAPFORFMSINTSCRATCHPAD*‚***************************(OFFSET0ƒPOINTEDTOBYA6DURINGFMSINT**‚MAPFORUNINITIALIZEDDATA*"EOFLRN DS.L 1 EDIT FILE'S LAST LRNEFLUN DS.B 1 EDIT FILE LUN'OSLUN DS.B 1 OUTPUT AND SOURCE FILE LUNEFFLG DS.B 1 EDIT FILE FLAG'* EFFLG = 0 => 'FILENAME1' IS EDIT FILE'* EFFLG = 1 => 'FILENAME2' IS EDIT FILE)* EFFLG = -1 => SCRATCH FILE IS EDIT FILE*/KEEP DS.B 1 0 => CHANGE FILE OK (NO 'K' OPTION))*Œ1=>NOCHANGESALLOWED-'K'OPTIONON*HBOFLG DS.B 1 BUFFER OVERFLOW FLAG (0 => NONE, ISTABO IF RECORD TOO LONG)HBUFFLG DS.B 1 EXTRACT BUFFER FLAG, 0 => NO BUFFER, 1 => BUFFER AVAILABLE*&TEMP DS.L 1 TEMPORARY REGISTER STORAGE**LRECBA DS.L 1 LAST RECORD'S BUFFER ADDRESS*H*‚ALLOCATE/ASSIGN/CLOSESOURCE/OUTPUTFILEPARAMETERBLOCKFORFHSCALLS*3AACFHS DS.B FHSNLN ASSIGN WITH SHARED BUFFER ACCESS*,*‚INPUT/OUTPUTPARAMETERBLOCKFORIOSCALLS*IOPIOS DS.B IOSBLN*3RECBUFDS.B‚MXRECLRECORDBUFFER,MAXSOURCERECORDCFMSDBL DS.L 1 LOGICAL BUFFER END FOR CURRENT BLOCK IN SHARED BUFFER%OUTRCZ DS.W 1 OUTPUT FILE RECORD SIZE"OUTKYZ DS.B 1 OUTPUT FILE KEY SIZE"SRCKYZ DS.B 1 SOURCE FILE KEY SIZE'SRCRCZ DS.W 1 SOURCE FILE RECORD LENGTHSRCDBE DS.L 1 BUFFER END SRCDBL DS.L 1 BUFFER LOGICAL END*5OUTFLN DS.B FILNML+4 OUTPUT FILENAME PACKET SAVE AREA*?DATASGLEQU*‚ENDOFUNINITIALIZEDDATA(ZEROEDOUTBYOPENCMD) PAGE**‚MAPFORINITIALIZEDDATA*.SRCDBS DS.L 1 SOURCE FILE LOGICAL BUFFER START*;LRECRDƒDS.L1LRNOFLASTRECORDREAD(-1IFNONEAVAILABLE)*5STKPTR DS.L 1 STACK POINTER FOR ABORT FROM SUBROUTINE* *‚EXTRACTBUFFERPARAMETERBLOCK*EXBSEG DS.L 1 TASK NAME DS.L 1 SESSION DS.W 1 OPTIONS DS.W 1 ATTRIBUTES DS.L 1 SEGMENT NAME.EXBSAD DS.L 1 SEGMENT STARTING LOGICAL ADDRESS(EXBEAD DS.L 1 LENGTH/LOGICAL END ADDRESS*"*‚SCRATCHFILEFHSPARAMETERBLOCK*;EDTFHS…DS.BFHSNLNSCRATCHFILEASSIGNEDWITHSHAREDBUFFER*=EFVOL EQU EDTFHS+FHSVOL SCRATCH FILE VOLUME NAME FIELD OFFSET-EFKEY EQU EDTFHS+FHSKEY KEY SIZE FIELD OFFSET*DFMSDBS EQU EDTFHS+FHSSAD SHARED BUFFER STARTING ADDRESS FIELD OFFSET?FMSDBE EQU EDTFHS+FHSEAD SHARED BUFFER END ADDRESS FIELD OFFSET*7RECLNG‚EQU‚79„79BYTERECORDLENGTHFORCRTIOANDFMSIO0EDITLNG‚EQU‚RECLNG„RECORDLENGTHOFDISKRECORDS0SCRNLNGEQU79*20‡#BYTESFORFULLSCREENOUTPUT*.* CHANGED WHEN NOT DEBUGGING CRTLUN EQU CDFLUN*5CRTLUN‚EQU‚5„CRTLOGICALUNITNUMBER=1‚*FORDEBUGGING*;************************************************************/*‡CRTRECORDFORCRT.INOFFSETSBYEBYTENUMBER*;**************** ********************************************%CRTSOT‚EQU‚0†STARTOFTEXTFORPACKETCRTRES‚EQU‚1†RESERVEDBYTECRTCHG‚EQU‚2†CHANGEFLAG"CRTERM‚EQU‚3†TERMINATINGCHARACTER CRTLINE‚EQU‚4…CURSORLINENUMBER!CRTCOL‚EQU‚5…CURSORCOLUMNNUMBER$CRTDATA‚EQU‚6„COLUMN1-80CHARACTERS$CRTEXT‚EQU‚85‚ENDOFTEXTFORPACKET"CRTLEN‚EQU‚86…LENGTHOFCRTPACKET* *‡FMSEQUATES*#OPENCMD‚EQU‚1ˆFMS-OPENFILECOMMAND$CLOSCMD‚EQU‚2‡FMS-CLOSEFILECOMMAND#RDCMD‚EQU‚3ˆFMS-READRECORDCOMMAND&DELCMD‚EQU‚4‰FMS-DELETERECORDCOMMAND(INSRTCMD‚EQU‚5†FMS-INSERTRECORDCOMMAND(REPLCMD‚EQU‚6ˆFMS-REPLACERECORDCOMMAND+SRCHCMD‚EQU‚7ˆFMS-SEARCHFORSTRINGCOMMAND+PRNTCMD‚EQU‚8ˆFMS-PRINTTOTHELINEPRINTER)SAVNCMD‚EQU‚9…FMS-SAVEINNEWOUTPUTFILEMRGCMDƒEQU‚10„FMS-MERGEFILES(MOVCMDƒEQU‚11„FMS-MOVETOEXTRACTBUFFER*EXTCMDƒEQU‚12„FMS-MOVEFROMEXTRACTBUFFER(DEXTCMD‚EQU‚13„FMS-DELETEEXTRACTBUFFER8CKPTCMD‚EQU‚14„FMS-CHECKPOINT-SAVECURRENTFILECONTENTS**‡SCREENCOMMANDEQUATES*1CLRSCRN‚EQU‚$D8ƒCLEARSCREENANDHOMECURSORCODE LOADCUR‚EQU‚$C5ƒLOADCURSORCODEBLANK„EQU‚$20ƒBLANK6WRAPVAL‚EQU‚19ƒNO.LINESAFFECTEDBYSCREENWRAPAROUND*FULSCRN‚EQU‚20„NO.LINESOFFILEONSCREEN0POSONE‚EQU‚$20„CURSORPOSITION=LINEANDCOLUMN1#POS5 EQU $24 SCREEN COLUMN 5 011985&BOTDIS‚EQU‚$CA„SETBOTTOMDISPLAYCODE#TOPDIS‚EQU‚$C9„SETTOPDISPLAYCODE,LEFTDIS‚EQU‚$CBƒSETLEFTCOLUMNDISPLAYCODECOLTWO‚EQU‚$21„SCREENCOLUMN2 PROMPT‚EQU‚$3E„SCREENPROMPT'>'"LINE20‚EQU‚$33„SCREENLINE20CODE"LINE21‚EQU‚$34„SCREENLINE21CODE"LINE22‚EQU‚$35„SCREENLINE22CODE"LINE23‚EQU‚$36„SCREENLINE23CODE"LINE24‚EQU‚$37„SCREENLINE24CODE,WRTABS‚EQU‚$CE„WRITETOABSOLUTESCREENCODESTRT„EQU‚$DD„STARTOFDATACODEENDODƒEQU‚$DE„ENDOFDATACODESTABSƒEQU‚$DC„SETTABSCODELF1…EQU‚$0A„LINEFEED$HTS…EQU‚$09„HORIZONTALTABSTOPCODE$CANCELTEQU‚$18„CANCELTABSTOPCODEWRAPKEY‚EQU‚19 FULKEY‚EQU„20 DELLINE‚EQU‚$D7ƒDELETELINECODE INSRTLN‚EQU‚$D6ƒINSERTLINECODE LIST**ˆINCLUDE&.CRTD.AI*ˆINCLUDE&.CRTE11.AI*ˆINCLUDE&.CRTE2.AI*ˆINCLUDE&.FMSINT.AI*‰INCLUDE&.CRTD.AI‰INCLUDE&.CRTE11.AI‰INCLUDE&.CRTE2.AI‰INCLUDE&.FMSINT.AIé=/* =/*†EMFGEN.AF=/*)=/* Chain file to assemble EMFGEN utility=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to EMFGEN.LS=/*=/IFC \1ƒ=ARGEMFGEN.LS=/ENDIF=/*!=ASM EMFGEN.SA,EMFGEN.RO,\1;RZ=70=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDéééé ééâ=/* =/*†EMFGEN.LF=/*'=/* Link chain file to create EMFGEN.LO=/*:=/* If no output argument is specified for the listing the(=/* chain file will default to EMFGEN.LL=/*=/IFC \1ƒ=ARGEMFGEN.LL=/ENDIF=/*=LINK ,EMFGEN.LO,\1;AHMIXATTRIBUTES D PSEG SEG0:0,14 $0000INPUT EMFGEN.ROLIB 0.&.UTILIB.ROEND=/*=ENDééééééë' EMFGEN SA6DrrFMSINT AI9* rrFREE AFccrrFREE LFllrrFREE SAuuz“rrINIT AFöörrINIT LFÿÿrrINIT SAêdrrIPL AFccrrIPL LFllrrIPL SAufæmrrIPL2 SAoo rrLIB AFxxrrLIB LFrrIB SAŠ {oÒrr OUTPUTNBROFRECORDSIN.SYFILE'*¦1-->DONOTOUTPUTNBROFRECORDSIN *¬.SYFILE ‰PAGE‰DS.W†0**ˆEXECUTABLECODEBEGINSHERE*EMFGEN:‰LEA‡PB(PC),A6*œA6=PROGRAMSTARTBASEADDR‰MOVE.L„D2,SAVOL-PB(A6)‰MOVE.L„D2,SYVOL-PB(A6)1*œINITIALIZETHE'.SA'AND'.SY'PARAMETERBLOCKS*œWITHTHEDEFAULTVOLUMENAME‰MOVE.W„D3 ,SAUSRNBR-PB(A6)‰MOVE.W„D3,SYUSRNBR-PB(A6)1*œINITIALIZETHE'.SA'AND'.SY'PARAMETERBLOCKS*œWITHTHEDEFAULTUSERNUMBER‰MOVEM.LƒD4-D5,SACATLOG-PB(A6)‰MOVEM.LƒD4-D5,SYCATLOG-PB(A6)1*œINITIALIZETHE'.SA'AND'.SY'PARAMETERBLOCKS*œWITHTHEDEFAULTCATALOGNAME‰CLR.W…TERM_FLG-PB(A6)"*œSETFLAG-TERMINATIONISNORMAL'‰MOVE.L„REV_CODE-PB(A6),COUNTBEG-PB(A6)+‰MOVE.L„REV_CODE+4-PB(A6),COUNTBEG+4-PB(A6)'*œINITIALIZE‚REVCODEINOUTPUTMESSAGE‰LEA‡ERMSGKEY(PC),A4‰MOVE.L„A4,EDTIOS-PB+IOSSAD(A6)*œA4=STARTBUFFERADDR *œSETSTARTBUFRADDRINIOS.EDT‰LEA‡ERMSGEND(PC),A4‰MOVE.L„A4,EDTIOS-PB+IOSEAD(A6)*œA4=ENDBUFFERADDR*œSETENDBUFRADDRINIOS.EDT‰LEA…STACK(PC),A7$‰FHSCALLEDTFHS(PC)OPENERRORMSG.SA ‰BNE…FAULT1&‰FHSCALLEMFFHS(PC)DELETEERRORMSG.SY*‰BEQ.SƒREADLOOP‚JUMPIFFILEALREADYEXIST*šELSECREATEANDOPENTHEFILE$‰MOVE.W‚#FHALLO+FHASGN,EMFFHS-PB(A6)*œALLOCATEANDASSIGNNEWFILE/‰FHSCALLEMFFHS(PC)‚ASSIGN/ALLOCATEERRORMSG.SY7‰BNE…FAULT0†JMPIFASSIGN/ALLOCATEERRORFOR'.SY'FILE READLOOP:‰CLR.L…ERMSGKEY-PB(A6)‰CLR.L…ERMSGKEY-PB+4(A6)1*œINITIALIZETHEKEYVALUEFIELDPRIORTOREADING5‰IOSCALLEDTIOS(PC)READUNKEYEDRECORDFROMEDITFILE‰BEQ.SƒFORMKEYƒGOTONE!‰CMP.Bƒ#ISTAEOF,IOSSTA(A0)‚EOF?+‰BNE…FAULT0†JMPIFREADERRORON'.SA'FILE!EXIT…MOVE.W‚#FHCLOS,EDTFHS-PB(A6)*œCHANGEFHSCOMMANDTOCLOSE$‰FHSCALLEDTFHS(PC)CLOSEINPUTFILE‰MOVE.W‚#FHCLOS,EMFFHS-PB(A6)*œCHANGEFHSCOMMANDTOCLOSE%‰FHSCALLEMFFHS(PC)CLOSEOUTPUTFILE‰LEA‡COUNTBEG(PC),A4‰MOVE.L‚A4,EPBPLUGB-PB(A6)/*œA4=USERSTARTPLUGADDRSAVEDINERRPARMBLK‰LEA‡COUNTEND(PC),A4‰MOVE.L„A4,EPBPLUGE-PB(A6)-*œA4=USERENDPLUGADDRSAVEDINERRPARMBLK‰CLR.LƒD0ˆNULLERRORMESSAGE‰BTSTW…#0,X00400-PB(A6)‰BNE.S…TERMINAT,*œJMPIFNBROFRECORDSIN'.SY'FILENOTTO *œBEOUTPUT‰BSR…ERRGEN„LETEMHDOTHEWORK**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***** TERMINAT:‰ERQ.TERM‚#0,TERM_FLG-PB(A6) TERM_FLG:‰DC.W†0‰TERMINATIONFLAG0*œWILLCONTAINTHEAPPROPRIATETERMINATIONVALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*2FORMKEY‚LEA…ERMSGKEY(PC),A3STARTOFINPUTMESSAGE‰CMP.Bƒ#'*',(A3)ƒCOMMENTENTRY?!‰BEQ…READLOOP„YES-THROWITAWAY ‰BSR‡X10500 ‰BNE‡X05000*œEDITOFFSETSINMESSAGE*œJMPIFERROREXIST*‰MOVE.L‚IOSLEN(A0),D2‚INPUTMESSAGELENGTH'‰CMP.Wƒ#84,D2„MAXLENGTHERRORMESSAGE?&‰BLS.SƒLTHOK…MESSAGEWILLBETRUNCATED'‰MOVE.L‚#84,D2„TOMAXIMUMRECORDLENGTH/‰MOVE.L‚#$2FF,D0ƒERRORMESSAGE#INERRORMSG.SY ‰BSR‡X10000)*œINITIALIZEKEYVALUEINPLUGPOOLMESSAGE**œINITIALIZEERRORMESSAGEPARAMETERBLOCK‰BSR.SƒERRGEN„TELLHIMABOUTIT:LTHOK„SUB.Lƒ#1,D2†LENGTH-1ISOFFSETOFLASTCHARINMSG1‰ADD.LƒA3,D2†A(LASTCHARININPUTMSGFORIOSEAD)‰MOVE.L‚#7,D0†LOOPCOUNT-1‰CLR.LƒD5‰RESULTREG8KEYSTRIPMOVE.B‚(A3)+,D1ƒCONVERTHEXASCIIKEYTOBINARY‰CMP.Bƒ#'0',D1„LEGALHEXDIGIT?$‰BLO‡X05000„JMPIFILLEGALHEXDIGIT‰CMP.Bƒ#'9',D1„NUMBERDIGIT?‰BLS.SƒKHEXNUM„YES‰CMP.B…#'A',D1 ‰BLO.S…X05000*œJMPIFILLEGALHEXDIGIT‰CMP.Bƒ#'F',D1 ‰BHI.S…X05000*œJMPIFILLEGALHEXDIGIT%KHEXLET‚ADD.Bƒ#9,D1†ADJUSTFORLETTER#KHEXNUM‚AND.Bƒ#$0F,D1„MASKOFFZONE‰LSL.Lƒ#4,D5†PRIORRESULT*16‰OR.B„D1,D5†INCLUDENEWDIGITCKEYLOOP‚DBF…D0,KEYSTRIP‚CONTINUEUNTILDELIMITERORCOUNTEXHAUSTEDBKHEXITƒMOVE.L‚A3,D3†A3ATTAILOFASCIIKEYVALUEININPUTMESSAGE ‰LSR.Lƒ#1,D3†ISITODDADDRESS?‰BCC.SƒEVENADDRƒNO6‰MOVE.B‚#'',-(A3)INSERTBLANKATFRONTOFERRORTEXT@EVENADDRMOVE.L‚D5,-(A3)ƒCONVERTEDBINARYKEYOVERLAYSASCIIKEY‰LEA…EMFIOS(PC),A07‰MOVE.L‚A3,IOSSAD(A0)STARTOUTPUTBUFFERATBINARYKEY7‰MOVE.L‚D2,IOSEAD(A0)SAMEENDADDRESSASINPUTMESSAGE&‰TRAP„#2‰CALLIOSTOWRITEERRORMSG.SY‰BEQ.SƒIOOK‡WRITESUCCESSFUL2‰BSR.SƒERRGEN…PRINTWRITEERRORMESSAGE&CONTINUE-‰BRA…READLOOPƒDON'TCOUNTRECORDSNOTWRITTENIOOK…LEA…COUNTOUT+4-PB(A6),A1=ASCARRY‚ADD.Bƒ#1,-(A1)ƒINCREMENTOUTPUTRECORDCOUNTINASCII‰CMP.Bƒ#'9',(A1)‚CARRY?1‰BLS…READLOOPƒNO-CONTINUEUNTILEOFONEDITFILE%‰MOVE.B‚#'0',(A1)‚REPLACEONOVERFLOW*‰BRA…ASCARRY„AVOIDSCONVERSIONSUBROUTINES"ERRGENƒMOVEM.LD0/A0,EPBRD0-PB(A6)!*œREGSTOUSERERRORMSGPARMBLK&‰LEA…EPBRD0(PC),A0ƒA(ERRORPARMBLOCK)-‰MOVE.L‚#2,D0†ERRORMESSAGEHANDLERDIRECTIVE‰TRAP„#4‰GENERATEERRORMESSAGE"*œERRORCONDITIONSAREDISREGARDED ‰CLR.L…D0‰MOVE.L„D0,EPBPLUGB-PB(A6)‰MOVE.L„D0,EPBPLUGE-PB(A6)!*œINITIALIZEPLUGPOOLADDRESSIN$*œERRORMSGPARMBLOCKTONULLSTATE ‰RTSRETURN‰PAGEFAULT1:!*œFHSASSIGNERRORONERRORMSG.SA‰BSETW…#0,X00400-PB(A6),*œSETFLAG-DONOTOUTPUTNBROFRECORDSIN *§'.SY'FILEFAULT0:‰MOVE.W„#$C000,TERM_FLG-PB(A6)#*œSETFLAG-TERMINATIONWITHERROR,‰BSR„ERRGEN†PRINTFATALFAULTMESSAGE&QUIT*œFAULT0ERRORS&*¦ASSIGN/ALLOCATEERRORONERRORMSG.SY*¦READERRORONERRORMSG.SA ‰BRA„EXITX05000:‰MOVE.L„#$2FE,D0 *œD0=KEYVALUEFORERRORMESSAGE ‰BSR.S…X10000*œINITIALIZEPLUGPOOLMESSAGE"*œINITIALIZEERRORPARAMETERBLOCK ‰BSR.S…ERRGEN*œOUTPUTMESSAGE ‰BRA‡READLOOP‰PAGE* *ˆRTNETO5*’INITIALIZETHEPLUGPOOLMESSAGEWITHTHEKEYVALUE7*’INITIALIZETHEERRORMESSAGEPARAMETERBLOCKWITHTHE*œPLUGPOOLADDRESSES**ˆCALL†BSR‡X10000**ˆREGISTERALTERNATION-NONE**X10000:‰MOVEM.LƒA4-A5,-(A7) *œSAVEREGS‰LEA‡ERMSGKEY(PC),A5*œA5=ADDROFKEYVALUE‰LEA‡X00100(PC),A4‰MOVE.L„A4,EPBPLUGB-PB(A6)*œA4=STARTPLUGPOOLADDRESS ‰MOVE.B„#8,D6*œD6.B=LOOPCONTROLX10100:‰MOVE.B„(A5)+,(A4)+ ‰SUB.B…#1,D6 ‰BNE.S…X10100%*œMOVEKEYVALUETOPLUGPOOLMESSAGE*œJMPIFMORETOMOVE‰LEA‡X00199(PC),A5‰MOVE.L„A5,EPBPLUGE-PB(A6)*œA5=ENDPLUGPOOLADDRESS‰MOVEM.Lƒ(A7)+,A4-A5*œRESTOREREGISTERS‰RTS‰PAGE** *ˆRTNETO$*’EDITRECORDREADFORVALIDOFFSETS**ˆCALL†BSR‡X10500**ˆINPUT*’A3=ADDRESSRECORDREADINTO"*’A6=PROGRAMBASEADDRESSREGISTER,*’A0=ADDRESSPARAMETERBLOCKFORRECORDREAD**ˆOUTPUT *’CONDITIONS-*œNOTEQUAL-->ERROREXISTINRECORDOFFSETS!* EQUAL-->RECORDOFFSETSAREOK**ˆREGISTERALTERATION-NONE**X10500:‰MOVEM.LƒA3-A5/D0/D2-D5,-(A7) *œSAVEREGS‰MOVE.L„IOSLEN(A0),D3!*œD3=RECORDLENGTHOFRECORDREADX10600:‰CMP.B…#'\',(A3)+ ‰BNE.S…X10800*œJMPIFNOTSENTINELFLAG‰MOVE.B„(A3),D5*œD5=SETINELTOPROCESS‰LEA‡X00200(PC),A4*œA4=ADDRSENTINELTABLE‰MOVE.L„#X00299,D6+*œD6=RELATIVENBROFSENTINELTABLEENTRIESX10700:‰CMP.B…0(A4,D6),D5 ‰BEQ.S…X11000'*œJMPIFTHISISSENTINELSEARCHINGFOR ‰SUB.L…#1,D6 ‰BPL.S…X10700 *œJMPIFMOREENTRIESTOPROCESSX10800: ‰SUB.L…#1,D3X10810: ‰BNE.S…X10600%*œJMPIFRECORDREADHASMORETOEDITX10900:O*------------------------------------------------------------------------------=*ˆSTATUSCODESREFLECTINGEXITCONDITIONSMUSTBEESTABLISHEDO*------------------------------------------------------------------------------‰MOVEM.Lƒ(A7)+,D0/D2-D5/A3-A5*œRESTOREREGS‰RTS*X11000: ‰ASL.L…#2,D6*œD6=NDXTIMES4‰LEA‡X00300(PC),A4"*œA4=ADDRESSSENTINELVECTORTABLE‰MOVE.L„0(A4,D6),A5 ‰ADD.L…A6,A5*œA5=ADDRTRANSFERCONTROLTO ‰ADD.L…#1,A3 *œA3=ADDROFOFFSETFORSENTINEL‰CMP.B…#'K',D5 ‰BEQ.S…X11100*œJMPIF'K'SENTINEL‰BSR.S…ASC2BIN *œD5=BINARYCONVERSIONOFOFFSET ‰BNE.S…X10900*œJMPIFINVALIDOFFSETX11100: ‰JMP‡(A5)'*œTRANSFERCONTROLTOADDRESSSPECIFIED *œINREGA5**‰PAGE **ˆPROCESS'C'SENTINEL*X12000: ‰MOVE.L„D5,D6*œD6=OFFSETVALUE‰BSR.S…ASC2BIN**œD5=CONVERSIONVALUEOFNBRBYTESTOMOVE ‰BNE.S…X10900*œJMPIFINVALIDINPUT ‰TST.L…D5 ‰BNE.S…X12100%*œJMPIFUSERWANTSTOMOVESOMEDATA ‰ADD.L…#1,D5 ‰BRA.S…X10900*œFORCEERRORCONDITIONSX12100: ‰ADD.L…D6,D5%*œD5=TOTALNBRBYTESINVOLVEDINMOVE ‰SUB.L…#2,D31*œD3=ADJUSTEDFORTHENUMBEROFBYTESTOBEMOVED ‰BRA.S…X30300*‰PAGE**ˆPROCESS'A'AND'D'SENTINEL*X13000: ‰TST.L…D5 ‰BNE.S…X10900*œJMPIFINVALIDOFFSET ‰BRA.S…X30000‰PAGE**ˆPROCESS'K'SENTINTEL*X14000: ‰MOVE.L„#4,D5*œD5=LOOPCONTROLX14100:‰CMP.B…#'0',(A3) ‰BLO.S…X10900‰CMP.B…#'F',(A3)+ ‰BHI.S…X10900*œJMPIFKEYVALUEERROR ‰SUB.L…#1,D5 ‰BNE.S…X14100*œJMPIFDEYVALUENOTEDITED ‰SUB.L…#2,D3*œADJUSTFOR\KINLOOPCOUNT ‰BRA.S…X30400#*œADJUSTFOR'K'SENTINELKEYVALUE‰PAGEX30000: ‰ADD.L…#2,D5 *œADJUSTNBRBYTESINVOLVEDBY2X30100: ‰ADD.L…#1,D5 *œADJUSTNBRBYTESINVOLVEDBY1X30200: ‰ADD.L…#1,D5 *œADJUSTNBRBKTESINVOLVEDBY1X30300: ‰CMP.L…#48,D5 ‰BGT.S…X10900#*œJMPIFINVALIDOFFSETINVOLVEMENTX30400: ‰SUB.L…#4,D3(*œADJUSTFORSENTINELPLUSOFFSET(\Sxx)"*œOR'K'SENTINELKEYVALUE(yyyy) ‰BRA.S…X10810‰PAGE* *ˆRTNETO+*’CONVERTA2BYTEDECIMALSTRINGTOBINARY**ˆCALL†BSR‡ASC2BIN**ˆINPUT**’A3=ADDRSOFDECIMALSTRING**ˆOUTPUT* *’A3=A3+2"*’D5.L=BINARYCONVERSIONRESULTS* *ˆCONDITIONS**’NOTEQUAL-->INVALIDINPUT*–EQUAL-->ƒVALIDINPUTASC2BIN:‰MOVE.L#2,D2…NBRCHTRSPROCESS‰CLR.LƒD5‡RESULTRETURNEDIND5ASCNXTƒCMP.Bƒ#'9',(A3)‰BGT.SƒASCXITƒCHAROUTOFRANGE‰CMP.Bƒ#'0',(A3)‰BLT.SƒASCXITƒCHAROUTOFRANGE$ASCDIGƒMULS„#10,D5ƒPRIORRESULT*10‰MOVE.B‚(A3)+,D0‰AND.Lƒ#$0000000F,D0"‰ADD.LƒD0,D5„RESULTWITHNEWDIGIT ‰SUB.Wƒ#1,D2 ‰BNE.SƒASCNXT ASCXITƒRTS* ‰END„EMFGEN  é PAGE**FMSINT1.0012/12/1979HBN6**3*‚FMSINTINFERFACESTHEEDITORTOFHSANDIOSCALLS*/*‚ONENTRY:A0=FMSINTPARAMETERBLOCKADDRESS *ŒBSRFMSINT**ŒA5=BASEADDRESSREGISTEROFDATASEGMENT)*‚ONEXIT:‚ALLREGISTERSUNCHANGEDEXCEPT*ŒD0=0IFNOIOERROR,OR+*‘NONZEROIFIOERROR(=IOERRORSTATUS)*ŒZ-FLAGSETACCORDINGLY*ŒRTS* FMSINT EQU **3*ŠGETBRANCHADDRESSFORFUNCTIONREQUESTEDINTOA1*7‚MOVEM.LD1-D7/A0-A6,-(A7)SAVEALLREGISTERSEXCEPTD00‚MOVE.LA0,A3KEEPPARAMETERBLOCKADDRESSINA36‚CLR.LD0GETCOMMANDCODEFORINDEXINTOBRANCHTABLE‚MOVE.BFMSCMD(A3),D0. SUB.L #1,D0 . ORG TO 04 CMP.B #NOCMD,D0 CHECK THAT COMMAND NOT OUT OF RANGE2 BCC.S FMSER1 . ERROR, NO SUCH COMMAND CODE (.GE.) CMP.B #2,D0 READ COMMAND? BEQ.S FMSI00 YESN MOVE.L #-1,(DATASG+LRECRD)-DATASG(A5) NO, OTHER CMDS MUST SET LAST RECORD NOT4FMSI00 LSL.W #2,D0 D0 = BRANCH ADDRESS OFFSET (D0*4)'LEA…FMSBRA(PC),A1‚BRANCHADDRESSTABLE9 ADD.L D0,A1 FINALLY A1 = SUBROUTINE ADDRESS TO BRANCH TO*0*ŠDOCOMMONREGISTERSETUP:USED6-D7,A2-A6*ŠSETRETURNSTATUSTOZERO*H LEA AACFHS(A5),A4 ASSIGN/ALLOCATE/CLOSE PARAMETER BLOCK FOR SOURCE/OUTPF LEA EDTFHS(A5),A2 ASSIGN/ALLOCATE/CLOSE PARAMETER BLOCK FOR EDIT FILE= LEA IOPIOS(A5),A6 INPUT/OUTPUT PARAMETER BLOCK FOR IOS CALLS# MOVE.L #LINEBL,D6 LINE BUFFER SIZE MOVE.B #' ',D7 SPACE/‚CLR.BFMSTAT(A3)CLEARSTATUSFORGOODRETURNS4‚CLR.BBOFLG(A5)NORECORDOVERFLOWYETFORANYCALL: MOVE.L A7,STKPTR(A5) SAVE CURRENT STACK POINTER FOR ABORT**ŠBRANCHTOSUBROUTINE* JMP (A1) PAGE*7*ŠSUBROUTINEBRANCHADDRESSTABLE,FMSCMDUSEDASINDEX*FMSBRA BRA OPENCD 1 OPEN FILESBRA‚CLOSCD2CLOSEFILESBRA‚RDCD3READRECORDSBRA ‚DELCD4DELETERECORDSBRA‚INSRTCD5INSERTRECORDBRA‚REPLCD6REPLACERECORDBRA‚SRCHCD7SEARCHFORSTRING$BRA‚PRNTCD8OUTPUTTOLINEPRINTER,BRA‚SAVECMD9SAVEPARTORALLOFEDITFILE)BRA‚MERGECMDAMERGEFILEINTOEDITFILE*1?:HB-J9R9ZHb9j5r0z>‚=Š?’KšD¢@ªN²BºGÂ@ÊCÒNÚ7âEêEò6úD7 UBB3BRA‚DUPMCMDBDUPLICATEANDMOVETOEXTRACTBUFFER/BRA‚EXTRCMDCCOPYEXTRACTBUFFERTOEDITFILE$BRA‚DELBCMDDDELETEEXTRACTBUFFERBRA‚CKPTCDECHECKPOINT*2NOCMD EQU (*-FMSBRA)/4 NO COMMAND CAN BE .GE. THIS**ŠERRORRETURNS*HFMSER1 MOVE.L #FSTAIF,D0 INVALID FMSCMD CODE: NOT IMPLEMENTED OR TOO BIG4‚BRA.SFMSERRORINVALIDPARAMETERSPASSEDTOFMSINT3FMSER3 MOVE.L #ISTABO+MN,D0 SOURCE RECORD TOO LARGE*ŠOREDITFILERECORDTOOSMALL ‚BRA.SFMSERR6FMSER4 MOVE.L #ISTARR+MN,D0 INVALID KEY IN SOURCE FILE BRA.S FMSERR=FMSER5 MOVE.L #ISTAIE+MN,D0 INTERNAL ERROR - UNEXPECTED VALUE7FMSERR MOVE.B D0,FMSTAT(A3) SET RETURN CODE FROM FMSINT**ŠRETURNFROMFMSINT*FMSOKR TST.B FMSTAT(A3) ERROR?‚BNE.SFMSOKR1YESC MOVE.B BOFLG(A5),FMSTAT(A3) SET BUFFER OVERFLOW IF RECORD TOO LONG(FMSOKR1 CLR.L D0 INDICATE GOOD IO RETURN2FMSRET MOVEM.L (A7)+,D1-D7/A0-A6 RESTORE REGISTERS‚RTS*3FMSABMN MOVE.B #-1,FMSTAT(A3) -1 RETURN FROM FMSINT2FMSABRT MOVE.L STKPTR(A5),A7 RESTORE STACK POINTER CLR.L D0 BRA.S FMSRET RETURN‚PAGE****&*Š**************************************ŽOPENCMD1.0012/12/1979HBN6*&*Š*************************************2*ŠONENTRY:A2=FHSPARAMETERBLOCKFOREDITFILE%*”A3=FMSINTPARAMETERBLOCKADDRESS9*”A4=FHSPARAMETERBLOCKADDRESSFORSOURCE/OUTPUTFILE"*”A6=IOSPARAMETERBLOCKADDRESS*”D6=LINEBUFFERSIZE*”D7.B=SPACE *”BRAOPENCMD*-*ŠONEXIT:‚ALLREGISTERSUSED/UNKNOWNEXCEPT:!*”D0=LASTIOS/FHSERRORSTATUS,* OPENCD EQU **"*ŠZEROOUTUNINITIALIZEDDATAAREA*) MOVE.L #DATASGL/2,D0 WORD COUNT TO CLEAR MOVE.L A5,A0 STARTING ADDRESSOPEN01 CLR.W (A0)+ SUB.W #1,D0 BNEƒOPEN01*;*ŠSETUPTOASSIGNSOURCEFILEWITHSHAREDBUFFER(FORCOPY)*EMOVE.L#FMSSRA,FHSSAD(A4)‚STARTINGSHAREDBUFFERADRFORSOURCEFILE* *ŠSETUPTO6*ŠALLOCATETEMPORARYFILEONSAMEVOLUMEASINPUTFILE*0‚MOVE.LFMSBUF(A3),A0GETINPUTFILEVOLUMENAMEEMOVE.L‚(A0),FHSVOL(A2)PUTITINSCRATCHFILEFHSBLOCKFORALLOCATE*>*ŠSAVELOGICALUNITNUMBERSAVAILABLETOFMSINTFORFILENAME1,*ŠFILENAME2,ANDEDITFILE.?*ŠNEEDTWOLOGICALUNITNUMBERS:ONEFOREDITFILEWHICHISTHE<*ŠTHEFILETHATISCHANGED(EDITED)DIRECTLY-ITCANBETHE@*ŠSOURCEFILE,OUTPUTFILEORATEMPORARYSCRATCHFILE(USEDBE--*ŠCAUSEOUTPUTFILEISNOTINPROPERFORMAT).A*ŠONELUNISNEEDEDFORSOURCEFILETOCOPYITINTOTHEEDITFILEA*ŠWHENNECESSARY-THESOURCEFILEISCLOSEDAFTEROPEN.THESAME5*ŠLUNISUSEDFORTHEOUTPUTFILELUNDURINGCLOSCMD.*C‚MOVE.WFMSRECN(A3),EFLUN(A5)EDITFILELUN,SOURCE/OUTPUTFILELUN‚PAGE*A*ŠPART1:ASSIGNSOURCEFILE'FILENAME1'FORREADW/SHAREDBUFFER*C*ŠASSIGNTHESOURCEFILE(ANDALLOCATEIFNECESSARY)WITHEXCLUSIVE5*ŠREADACCESS(SINCEMAYNEEDTOCOPYINTOEDITFILE);*ŠDETERMINEATTRIBUTESFORNEWFILEIFNEEDTOALLOCATEONE*K‚SFHSCOFHASGN,FOPER+FOPABF+FOPADR,A4ƒASSIGNEXCLUSIVEREADW/SHAREDBUFFERA MOVE.L FMSBUF(A3),A0 SAVE INPUT FILE NAME IN CASE ITS FOR OUTPUT% LEA OUTFLN(A5),A1 . PLACE TO SAVE IT MOVE.L #(FILNML+4)/2,D0 . OPEN05 MOVE.W (A0)+,(A1)+ . MOVE SUB.W #1,D0 . BNE OPEN05 .( MOVE.B OSLUN(A5),D0 GET SOURCE FILE LUN8 MOVE.L FMSBUF(A3),A1 A1 -> FILENAME1, FILENAME2 PACKETS0 MOVE.L A1,A0 A0 -> SOURCE FILE NAME (FILENAME1)>MOVE.WOPTIONS(A1),D4GETOUTPUTFILEOPTIONS‚(KEEPITIND4) BTST #KPSAME,D4 'K' OPTION ON? BEQ.S OPEN06 NO. MOVE.B #1,KEEP(A5) YES, FLAG IT F OR LATER USEMOPEN06 SFATTR FOPISD,VRLFIL,DEFSIZ,KEYSIZ,A4 DEFAULT ATTRIBUTES IF MUST ALLOC BTST #OFDEF,D4 DEFAULT FORMAT?6 BNE.S OPEN10 YES, => DUPL. KEY INDEXED WITH NULL KEYS BTST #OFISQ,D4 INDEXED? BNE.S OPEN10 YES BTST #OFSEQ,D4 NO, SEQUENTIAL?* BEQ FMSER5 NO, NONE OF THE ABOVE IS ERROR8 AND.W #-FFTBIT-1,FHSOPT(A4) YES, CLEAR OTHER FILE TYPESM SFATTR FOPSEQ,VRLFIL,DEFSIZ,0,A4 SET SEQUENTIAL, VARIABLE RECORD LENGTH FILE?OPEN10‚BSRASAFILASSIGN(ALLOCATEIFNON-EXISTENTFILENAME)ŠBNEƒOPNERRIOERROR?*+*ŠSAVESOURCEFILEATTRIBUTESFORLATERUSE*D MOVE.L FHSEAD(A4),SRCDBE(A5) SOURCE FILE SHARED BUFFER PHYSICAL ENDF MOVE.L FHSSAD(A4),SRCDBS(A5) SOURCE FILE SHARED BUFFER PHYSICAL STARTO MOVE.L FHSSIZ(A4),FHSSIZ(A2) SET KEY, FAB AND DATA BLOCK SIZE FOR SCRATCH FILE; MOVE.W FHSLRL(A4),FHSLRL(A2) ALSO SET VRL OR FRL INDICATOR%CLR.LD6KEEP'FILENAME1'‚KEYLENGTH MOVE.B FHSKEY(A4),D6 . IN D6# MOVE.B D6,SRCKYZ(A5) SAVE KEY SIZE MOVE.B D6,OUTKYZ(A5) . CMP.L #MXRECL,D6 KEY ERROR? BGE FMSER4+MOVE.WFHSLRL(A4),D2‰RECORDSIZETOOLARGE CMP.W #MXRECL,D2 BGT FMSER3 YES* MOVE.W D2,SRCRCZ(A5) NO, SAVE RECORD SIZE MOVE.W D2,OUTRCZ(A5) .**>‰CLR.BFMSOFS(A3)SETSAVEOUTPUTFILESTATUSFORNOW(OFSSAV)* MOVE.W FHSOPT(A4),D2 GET SOURCE FILE TYPE" AND.W #FFTBIT,D2 . AND KEEP IN D2" MOVE.L #FSTADNM,D0 EDIT OLD FILE? ‚TST.BD1. BEQ.S OPEN20 YES' MOVE.L #FSTANNM,D0 NO, NEW SOURCE FILE= MOVE.B D1,FMSOFS(A3) DELETE IT IF ABORT BEFORE SAVE (OFSDEL) TST.B KEEP(A5) K-OPTION ON? BEQ.S OPEN20 NO-MOVE.B#FSTANNM,FMSTAT(A3)‚NEWNAMEISERROR1OPENDLƒSFHSCOFHCLOS+FHDELT,0,A4‚DELETEFILENAME1 ‚FHSCALL(A4)‚BNEFMSRETIOERROR%‚BRAFMSABRTRETURNANDRESTORESTACK@OPEN20 MOVE.B D0,FMSTAT(A3) RETURN SOURCE FILE STATUS FOR EDITOR*:*ŠNOWHAVEFILENAME1ALLOCATEDFORREADW/SHAREDBUFFERON<*ŠOSLUNANDFMSOFS=0ANDFMSTAT=FSTADNMIFOLDFILENAME18*ŠELSEFMSOFS=1ANDFMSTAT=FSTANNMFORNEWFILENAME1* PAGE*2*ŠPART2:ASSIGN'FILENAME2'(IFGIVEN)FOROUTPUT*6*ŠDETERMINEIFOUTPUTISTOBEDIRECTEDTO'FILENAME2'A*ŠA1->FILENAME1,FILENAME2,D1=0IFOLD,=1IFNEWFILENAME1*ŠD4=OUTPUTFILEOPTIONS*HMOVE.L#FMSDBA,FHSSAD(A4)…SETSHAREDBUFFERSTARTADDRESSFOREDITFILE8 CLR.B OFSTAT(A1) SET 'FILENAME1' AS OUTPUT FILE FOR NOW&LEAFLNM2(A1),A1†OUTPUTTOFILENAME2? MOVE.L A1,A0 .(‚MOVE.L#FILNML/2,D0.TESTIFNULLNAMEOPEN25 TST.W (A1)+ .4BNE.SOPEN30‚.SOMETHINGTHERE,SOTRYTOASSIGNITSUB.W#1,D0‚. BNEOPEN25„.,BSRƒTSTFTPNO,CHECKFILENAME1FILETYPEOK,BEQ.SOPEN31‚'FILENAME1'ISTHEOUTPUTFILEOPNER0‡BRAƒOPNERRŒERROR"OPEN30 TST.B KEEP(A5) K-OPTION ON?'‚BNE.SOPEN37YES,FILENAME2ISIGNORED TST.B D1 NEW FILENAME1?BEQ.S‚OPEN32NO+‚LEAIGNRF2(PC),A0STARTADDRESSOFMESSAGE8‚MOVE.LA0,IOSSAD(A6)YES,SENDIGNOREFILENAME2MESSAGE)‚LEAIGNRFN(PC),A0ENSADDRESSOFMESSAGE‚MOVE.LA0,IOSEAD(A6). BSR CRTMGR GET RESPONSE BNE.S OPNER0 ERROR*OPEN31 BRA OPEN50 FILENAME1 IS OUTPUT FILE*<*ŠOUTPUTTOFILENAME2:DETERMINEATTRIBUTESFORFILEINCASE*ŠHAVETOALLOCATEIT*3OPEN32 MOVE.W #FHASGN,FHSCMD(A4) ASSIGN 'FILENAME2'I OR.W #FOPEREW+FOPOVRT+FOPABF+FOPADR,FHSOPT(A4) (OR KEEPS FILENAME1 TYPE)= BTST #OFDEF,D4 DEFAULT FORMAT => SAME FORMAT AS 'FILENAME1'?< BNE.S OPEN36 YES, ATTRIBUTES ALREADY IN FHS PARAMETER BLOCKM MOVE.W #FOPEREW+FOPOVRT+FOPABF,FHSOPT(A4) NO, OVERWRITE & SHARE BUFFER W/FMSD‹SFATTRFOPISD,VRLFIL,DEFSIZ,KEYSIZ,A4INDEXEDWITHNOLINENUMBERS? BTST #OFISQ,D4 .$ BNE.S OPEN36 YES, GO OPEN FILENAME2DˆAND.W#-FFTBIT-1,FHSOPT(A4)NO,SEQUENTIAL-CLEAROTHERFILETYPES4ŠSFATTRFOPSEQ,VRLFIL,DEFSIZ,0,A4ANDSETSEQUENTIAL.ƒBTST#OFSEQ,D4WASSEQUENTIALFILEREQUESTED?(OPEN36BNEƒOPEN40YES,GOOPENFILENAME2 BRA FMSER5 NO, ERROR*!*ˆK-OPTIONANDFILENAME2ISGIVEN*-OPEN37 LEA KPIF2(PC),A0 MESSAGE START ADDRESSMOVE.L‚A0,IOSSAD(A6))‚LEAKPIF2N(PC),A0ENDADDRESSOFMESSAGE‚MOVE.LA0,IOSEAD(A6)+‚BSR.SCRTMGRSE NDMESSAGEANDGETRESPONSE‚BNEOPNER0IOERROR'‚BRAOPEN50CONTINUE-IGNOREFILENAME2 PAGE* *ŠSUBROUTINE:A*ŠTSTFTPTESTSTHATFILETYPEISOKANDGIVES‚'OUTPUTFILEOPTION5*‘IGNORED'MESSAGEIFTYPESDON'TMATCHANDWAITSFOR*‘RESPONSE'Y'OR'N'#*‘ONRETURND0=0IFOKELSEERROR-*›BRAFMSABRTIFUSERWANTSTOQUIT,ELSERTS* TSTFTP EQU *# MOVE.W FHSOPT(A4),D0 GET FILE TYPE AND.W #FFTBIT,D0 ." CMP.W #FOPSEQ,D0 SEQUENTIAL FILE?BEQƒTSTF04YES CMP.W #FOPCON,D0 CONTIGUOUS? BNE.S TSTF01 NO/ MOVE.B #FSTAFT,FMSTAT(A3) YES, FILE TYPE ERROR BRA.S SUBAB00/TSTF01ƒBTST#OFSEQ,D4WANTEDSEQUENTIALOUTPUT?TSTF02 BNE.S TSTF03 YES CLR.L D0 NO, FILE TYPE OK RTS TSTF03 EQU *(‚LEAIGNROP(PC),A0MESSAGESTARTADDRESSH‚MOVE.LA0,IOSSAD(A6)NO,SQUIRTMESSAGETOTELLUSERTHATOPTIONIGNORE‚LEAIGNRND(PC),A0ENDADDRESS‚MOVE.LA0,IOSEAD(A6).* *ŠWRITEMESSAGEANDGETRESPONSE**0CRTMGR EQU * CRT MESSAGE AND RESPONSE SUBROUTINE*%‚MOVE.B#LDFLUN,IOSLUN(A6)MSGTOCRT CRTM10 EQU *‚SIOSCOIOWRIT,IOPIMG,A6‚IOSCALL(A6)‚WRITE BNE.S CRTRTS* ‚LEARECBUF(A5),A0READRESPONSE MOVE.L A0,IOSSAD(A6) ADD.L #10,A0 MOVE.L A0,IOSEAD(A6)) SIOSCO IOREAD,0,A6 SET TO READ FORMATTED‚MOVE.B#CRTLUN,IOSLUN(A6)LUN ‚IOSCALL(A6) BNE.S CRTRTS CMP.B #'Y',RECBUF(A5) CONTINUE? BEQ.S CRTRTS YES CMP.B #'y',RECBUF(A5) CONTINUE? BEQ.S CRTRTS BRANCH IF YESECMP.B#FSTANNM,FMSTAT(A3)‚INPUT=NOTY,QUIT-DELETENEWSOURCEFILEBNE.S‚SUBAB0„NOTNEW%MOVE.B#-1,FMSTAT(A3)‚SETABORTCODE BRA OPENDL AND DELETE NEW FILE+SUBAB0ƒMOVE.B#-1,FMSTAT(A3)ƒSETABORTCODESUBAB00‚BRAFMSABRT CRTRTS„RTS*2TSTF04 BTST #OFISQ,D4 INDEXED FILE WANTED INSTEAD? BRA.S TSTF02*GIGNROP DC.B 'OUTPUT FILE EXISTS - OPTION S/I IGNORED - CONTINUE (Y/N)?'IGNRND EQU *-1! DS 0 ALIGN AT NEXT WORD BOUNDARY0OVRMSG DC.B 'FILENAME2 EXISTS, OVERWRITE (Y/N)?'OVRMND EQU *-1 DS 0AIGNRF2 DC.B 'NEW FILENAME1 - FILENAME2 IGNORED - CONTINUE (Y/N)?'IGNRFN EQU *-1 DS 0;KPIF2 DC.B 'K-OPTION - FILENAME2 IGNORED - CONTINUE (Y/N)?'KPIF2N EQU *-1 DS 0 PAGE**ŠOUTPUTTOFILENAME2:@*ŠASSIGN'FILENAME2'FOREXCLUSIVEREAD/WRITEWITHSHAREDBUFFER@*ŠANDOVERWRITESINCEITISPOSSIBLEITWILLBEEDITEDDIRECTLY;*ŠUSEEDITFILELUN*0OPEN40 MOVEM.L A0-A1,-(A7) SAVE OUTPUT FILE NAME# LEA OUTFLN(A5),A1 PLACE TO SAVE IT+ MOVE.L #(FILNML+4)/2,D0 . LENGTH OF PACKETOPEN41 MOVE.W (A0)+,(A1)+ . SUB.W #1,D0 . BNE OPEN41 . MOVEM.L (A7)+,A0-A1 .AMOVE.B‚EFLUN(A5),D0USEEDITFILELUNFORNOW(A0->OUTPUTFILE7BSR„ASAFILASSIGN(ALLOCATEIFNON-EXISTENTFILENAME2)OPN4ER BNE OPNERR ERROR(BSRƒTSTFTPCHECKFILENAME2FILETYPEOK BNE.S OPN4ER IO ERROR MOVE.L FMSBUF(A3),A1 MOVE.L #FSTADNM,D0 TST.B D1 NEW OUTPUT FILE?;BEQ.SOPEN45‚NO,LEAVEOUTPUTFILESTATUSASIS(OLDFILE)J MOVE.B D1,FMSOFS(A3) YES, DELETE OUTPUT FILE IF ABORT BEFORE SAVE, OFSDEL2MOVE.L#FSTANNM,D0‰ANDSETNEWOUTPUTFILESTATUS2OPEN45 MOVE.B D0,OFSTAT(A1) SET 'FILENAME2' STATUS*>*ŠCHECKTOSEEIFUSERWANTSTOOVERWRITEEXISTING'FILENAME2'* TST.B D1 NEW FILE? BNE.S OPEN50 YES, SKIP CHECK(‚LEAOVRMSG(PC),A0MESSAGESTARTADDRESS#‚MOVE.LA0,IOSSAD(A6)MESSAGESTART‚LEAOVRMND(PC),A0ENDADDRESS!MOVE.LA0,IOSEAD(A6)†MESSAGEEND*BSRƒCRTMGRWRITEMESSAGEANDGETRESPONSE BNE.S OPN4ER ERROR MOVE.B FHSKEY(A4),D0 CMP.B #MXRECL,D0 BGE FMSER4/ MOVE.B D0,OUTKYZ(A5) SAVE OUTPUT FILE KEY SIZE MOVE.W FHSLRL(A4),D0( CMP.W #MXRECL,D0 RECORD SIZE TOO LARGE? BGT FMSER3 MOVE.W D0,OUTRCZ(A5) SAVE‚PAGE*B*ŠPART3:DETERMINEFILETOBEEDITED-FILENAME1OR2ORSCRATCH.*>*ŠNOWHAVE'FILENAME1'ASSIGNEDFOREXCLUSIVEREADWITHSHAREDE*ŠBUFFER,'FILENAME2',IFGIVEN,FOREXCLUSIVEREAD/WRITEWITHSHARED?*ŠBUFFERANDOVERWRITEOPTIONS.DETERMINENEXTIFNEEDTOALLO-=*ŠCATESCRATCHEDITFILEORIFCANEDITOUTPUTFILEDIRECTLY.&*ŠD2=SOURCEFILETYPE,D6=SRCKYZ.B* OPEN50 EQU  *7 MOVE.W FHSOPT(A4),D1 CHECK IF DUPL. KEY INDEXED OUTPUT AND.W #FFTBIT,D1 . CMP.W #FOPISD,D1 ..BEQ.SOPEN53…DUPL.KEYS=>ANYKEYSIZEISOK/ TST.B FHSKEY(A4) OTHERWISE MUST HAVE NULL KEYS BEQ.S OPEN53 OK MOVE.L #FSTAKY,D0 KEY ERROR BRAFMSERR‚.+OPEN53 MOVE.L FMSBUF(A3),A0 A0 -> FILENAMES: MOVE.W FHSOPT(A4),D1 GET ATTRIBUTES OF FILE LAST ASSIGNED AND.W #FFTBIT,D1 ., TST.B OFSTAT(A0) 'FILENAME1' = OUTPUT FILE?'BNEƒOPEN75NO,FILENAME2ISFOROUTPUT-OPEN55†CMP.W#FOPSEQ,D2YES,SEQUENTIALFILE? BNE.S OPEN70 NO6 TST.B KEEP(A5) YES, OK TO EDIT DIRECTLY IF 'K' OPTION" BNE.S OPEN71 GO CHECK FILE FORMAT*>*ŠCASE1:'FILENAME1'FOROUTPUTANDIT'SSEQUENTIAL;ALLOCATE4*ŠSCRATCHFILEFOREDITANDCOPY'FILENAME1'INTOIT* OPEN60 EQU * TST.B KEEP(A5) K-OPTION? BEQ.S OPEN61 NO1‚MOVE.B#FSTAFT,FMSTAT(A3)YES,FILEFORMATERROR BRA FMSABRT QUITIOPEN61SFHSCOFHASGN,FOPEREW+FOPABF+FOPADR,A2‚NEEDTOASSIGNSCRATCHFILED‹SFATTRFOPISD,VRLFIL,DEFSIZ,KEYSIZ,A2ATTRIBUTESIFNOLINENUMBERS?‚MOVE.BEFLUN(A5),FHSLUN(A2)USEEDITFILELUNFORSCRATCHFILE3†FHSCALL(A2)ASSIGNANDALLOCATESCRATCHEDITFILE BNE.S OPNER14 MOVE.B #-1,EFFLG(A5) FLAG SCRATCH FILE AS EDIT FILE?‚BRAOPN100GOCOPY'FILENAME1'INTOSCRATCHFILE(RECORDCOPY) PAGE*E*ŠCASE2:'FILENAME1'FOROUTPUTANDIT'SINDEXED:REOPENITFOREDIT3*ŠIFITISINPROPERFORMAT(ELSEUSESCRATCHFILE)*+OPEN70 CMP.W #FOPISD,D2 DUPLICATE KEY FILE?# BNE OPEN60 NO, GO USE SCRATCH FILE(TST.BŠFHSKEY(A4)YES,CKECKKEYSIZEOK0 BNE OPEN60 NOT COMBATIBLE - GO USE SCRATCH FILE.OPEN71ƒTST.WFHSLRL(A4)MUSTHAVEVRLFILETOO& BNE OPEN60 FRL => GO USE SCRATCH FILE= CMP.B #DBMAX,FHSDAT(A4) IF TOO LARGE BLOCKS USE SCRATCH FILE BHI OPEN60 .0ŒSFHSCOFHCLOS,0,A4FILEOK,CLOSESOCANREOPEN FHSCALL (A4) BNE.S OPNER1C‚SFHSCOFHASGN,FOPEREW+FOPABF+FOPADR,A4ASSIGNFOREDITINGDIRECTLY. MOVE.B EFLUN(A5),FHSLUN(A4) USE EDIT FILE LUN0 FHSCALL (A4) REOPEN FOR EDIT WITH SHARED BUFFER BNE.S„OPNER1. CLR.B EFFLG(A5) FLAG 'FILENAME1' AS EDIT FILE6 MOVE.L FHSEAD(A4),FMSDBE(A5) SAVE PHYSICAL BUFFER END1 MOVE.L FHSSAD(A4),FMSDBS(A5) SAVE PHYSICAL START BRA OPN160 GO FIND EOF LRN PAGE*E*ŠCASE3:FILENAME2FOROUTPUT;SEQUENTIAL=>GETSCRATCHFILEFOREDIT/*ŠANDCOPY'FILENAME1'INTOIT,CLOSEFILENAME2*-OPEN75 CMP.W #FOPSEQ,D1 FILENAME2 SEQUENTIAL? BNE.S OPEN90 NO0OPEN80…SFHSCOFHCLOS,0,A4YES,CLOSE'FILENAME2' FHSCALL (A4)OPNER1†BNEOPNERRƒIOERROR*>*ŠIF'FILENAME1'ISINCOMBATIBLEFORMATALLOCATESCRATCHFILE8*ŠWITH'FILENAME1'ATTRIBUTESANDDOBLOCKBYBLOCKCOPY*7‚MOVE.B#-1,EFFLG(A5)FLAGSCRATCHFILEINUSEFOREDIT:‚MOVE.BEFLUN(A5),FHSLUN(A2)USEEDITFILELUNINANYCASEA‚SFHSCOFHASGN,FOPEREW+FOPABF+FOPADR,A2ASSIGNWITHSHAREDBUFFER= CMP.W #FOPISD,D2 FILENAME1 HAS SAME FILE TYPE AS EDIT FILES? BNE.S OPEN85 NO8TST.B‚D6‚KEYSIZEMUSTBEEQUALTOEDITFILE'SKEYSIZE BNE.S OPEN85 NOT SAME! TST.W FHSLRL(A2) VRL FILE A MUST8 BNE.S OPEN85 FRL => NEED SCRATCH FILE IN DEFAULT FORMAT- CMP.B #DBMAX,FHSDAT(A2) DATA BLOCKS TOO BIG?3 BHI.S OPEN85 YES, GET SCRATCH FILE IN DEFAULT SIZE; OR.W D2,FHSOPT(A2) OK TO USE SAME FILE TYPE AS 'FILENAME1'?‚FHSCALL(A2)ASSIGNSCRATCHFILEINSAMEFORMATAS'FILENAME1' BNE.S OPNER1 IO ERROR% BRA OPN145 GO DO BLOCK BY BLOCK COPY*A*ŠOTHERWISEALLOCATESCRATCHFILEINDEFAULTFORMATANDDORECORD*ŠBYRECORDCOPY*7OPEN85 AND.W #-FFTBIT-1,FHSOPT(A2) CLEAR FILE TYPE BITSEƒSFATTRFOPISD,VRLFIL,DEFSIZ,KEYSIZ,A2DEFAULTATTRIBUTESFORSCRATCH' FHSCALL (A2) . FILE, ALLOCATE & ASSIGN BNE OPNER1) BRA.S OPN100 GO DO RECORD BY RECORD COPY PAGE*;*ŠCASE4:'FILENAME2'ISDUPLICATEKEYINDEXED,TRYTOEDIT%*ŠDIRECTLY(COPY'FILENAME1'INTOIT)@*ŠUSESCRATCHFILEIF'FILENAME2'FORMATNOTCOMBATIBLEFOREDIT*.OPEN90„CMP.W#FOPISD,D1…DUPLICATEKEYINDEXED?# BNE OPEN80 NO, GO USE SCRATCH FILE TST.B FHSKEY(A4) NULL KEYS?# BNE OPEN80 NO , GO USE SCRATCH FILE) TST.W FHSLRL(A4) FRL => USE SCRATCH FILE BNE OPEN80 .. CMP.B #DBMAX,FHSDAT(A4) DATA BLOCK TOO LARGE?F BHI OPEN80 YES, USE DEFAULT SIZE SCRATCH FILE (OR 'FILENAME1' FORMAT)2 MOVE.B #1,EFFLG(A5) FLAG 'FILENAME2' IS EDIT FILED‚MOVE.LFHSEAD(A4),FMSDBE(A5)SAVE‚'FILENAME2'SHAREDBUFFERENDADRF‚MOVE.LFHSSAD(A4),FMSDBS(A5)SAVE‚'FILENAME2'SHAREDBUFFERSTARTADR*TST.BD6CHECKKEYSIZE&DATABLOCKSIZEOPN100CLR.L†D3INITIALIZEFORLOGICALRECORDCOUNT(D3=LRN)7‚MOVE.LD4,TEMP(A5)SAVEOPTIONSFORRECORDSUBROUTINES*A*ŠREAD1STBLOCKOFSOURCEFILETOPOSITIONTO1STRECORDOFFILE*- SIOSCO IOREAD,IOPBLK+IOPRAN+IOPIMG+IOPBIN,A64 MOVE.B OSLUN(A5),IOSLUN(A6) SET LOGICAL UNIT NUMBER CLR.L IOSRRN(A6) LSN = 0. MOVE.L SRCDBS(A5),A2 SOURCE DATA BUFFER START" MOVE.L A2,IOSSAD(A6) BUFFER START( MOVE.L SRCDBE(A5),IOSEAD(A6) BUFFER END ‚IOSCALL(A6)" BNE.S OPN140 ERROR OR END OF FILE! CLR.L LRECRD(A5) SET CURRENT LRN/ MOVE.L A2,LRECBA(A5) SET RECORD BUFFER ADDRESS2ADD.LIOSLEN(A0),A2ŠSETSHAREDBUFFERLOGICALEND SUB.L #1,A2 . MOVE.L A2,SRCDBL(A5)9 BSR SGETCRC GET CURRENT RECORD POINTER AND RECORD LENGTH BRA.S OPN110*4*ŠREADNEXTRECORDFROMSOURCEFILE-IGNOREANYKEY*-OPN105 ADD.L #1,D3 D3 = LRN OF RECORD TO COPY BSR SGETNRC GET NEXT RECORD)OPN110 BEQ.S OPN115 ERROR OR END OF FILE?9ƒCMP.L#-1,D0YES,RECORDNOTAVAILABLE=>INTERNALERROR ‚BEQFMSER5 BRA.S OPN140 EOF OR ERROR+OPN115 MOVE.L A0,A2 STARTING RECORD ADDRESS*@*…CHECKRECORDFORSPACESANDDELETETRAILINGSPACESFROMRECORD*9 MOVE.W #IOPRAN+IOPBIN+IOPIMG,D6 WRITE AS IS IF NO SPACES+ MOVE.L #1,D0 GET NEW RECORD LENGTH INTO D4 CLR.L D1OPN125†CMP.B(A0)+,D7ƒSPACE?BNE.SOPN130‚NOH MOVE.W #IOPRAN+IOPASC+IOPFOR,D6 YES, WRITE FORMATTED TO COMPRESS SPACES BRA.S OPN131DOPN130MOVE.LD0,D1ƒSAVECURRENTRECORDLENGTHINCASELASTNONBLANK!OPN131ADD.L#1,D0ƒNEXTCHARACTER SUB.W #1,D4 BNE OPN125 MOVE.L D1,D4 BLANK LINE? BNE.S OPN135 NO! MOVE.L #1,D4 YES, SAVE ONE SPACE**ŠWRITERECORDTOEDITFILE*/OPN135MOVE.B‚EFLUN(A5),D0WRITEINTOEDITFILE+ BSR WRITLRO WRITE WITH OPTIONS GIVEN IN D6- BEQ.S OPN105 GO COPY NEXT RECORD IF NO ERROR"OPNERR BRA FMSRET IO ERROR, RETURN**ŠCOPYDONEORCOPYNEXTRECORD*(OPN140 CMP.B #ISTAEOF,D0 AT END OF FILE? BEQ.S OPN141 YES CMP.B #ISTARN,D0 .OPN141„BEQƒOPN170YES' CMP.B #ISTABO,D0 NO, RECORD TOO LARGE? BEQ FMSER3 YES, ABORT&OPN142ƒBRA.SOPNERRNO,OTHERIOERROR***ŠCASE2:COPYBLOCKBYBLOCKTOEDITFILE*4OPN145 MOVE.B OSLUN(A5),FHSLUN(A4) CLOSE SOURCE FILE SFHSCO FHCLOS,0,A4 . FHSCALL (A4) .BNEƒOPN142.IOERRORI SFHSCO FHASGN,FOPER,A4 AND REOPEN WITHOUT SHARED BUFFER SO CAN READ INTO/ MOVE.L FMSBUF(A3),A0 . EDIT FILE SHARED BUFFER MOVE.B OSLUN(A5),D0 . BSR ASAFIL . BNE OPN142 . IO ERROR*‡MOVE.LFMSDBS(A5),IOSSAD(A6)BUFFERSTART OPN150 EQU *=‹SIOSCOIOREAD,IOPBIN+IOPIMG+IOPBLK+IOPNXT,A6READNEXTBLOCK2 MOVE.B OSLUN(A5),IOSLUN(A6) READ FROM SOURCE FILE( MOVE.L FMSDBE(A5),IOSEAD(A6) BUFFER END* MOVE.L FMSDBS(A5),IOSSAD(A6) BUFFER START IOSCALL (A6) READ" BNE.S OPN155 ERROR OR END OF FILE: MOVE.W #IOWRIT,IOSFCT(A6) WRITE WITH SAME OPTIONS AS READ/ MOVE.B EFLUN(A5),IOSLUN(A6) WRITE TO EDIT FILEJ MOVE.L IOSSAD(A6),A0 GET END ADDRESS SO DON'T HAVE TO ZERO REST OF BUFFER ADD.L IOSLEN(A6),A0 . SUB.L #1,A0 . MOVE.L A0,IOSEAD(A6) . IOSCALL (A6) BEQ.S OPN150 GO COPY NEXT BLOCK BRAƒOPNERR**ŠDONEBLOCKCOPY,ORIOERROR*$OPN155 CMP.B #ISTAEOF,D0 END OF FILE BNE OPNERR NO, IO ERROR  PAGE*A*‡PART5:EDITFILEREADY,ESTABLISH#OFRECORDSINITANDCLOSE/*‡SOURCEFILE(IFITISNOTEQUALTOEDITFILE)* OPN160 EQU *EƒSIOSCOIOPOST,IOPREC+IOPRAN,A6POSITIONATENDOFFILE(GETEOFLRN).MOVE.BEFLUN(A5),IOSLUN(A6)USE‚EDITFILELUN6 MOVE.L #-1,D3 A -1 LRN WITH POSITION MEANS EOF WANTED MOVE.L D3,IOSRRN(A6) .A IOSCALL (A6) POSITION WILL RETURN LAST LRN IN FILE OR EOF STATUS BNE.S OPN165 ERROR OR EOF?.MOVE.LIOSRRN(A6),D3ƒNO,GETLASTLRNOFFILE7BRA.S‚OPN175ANDRETURNTOEDITOR,GOCLOSESOURCEFILE,OPN165 CMP.B #ISTAEOF,D0 NO RECORDS IN FILE? BNE.S OPNER2 IO ERROR?BRA.SOPN175‚RETURNEMPTYFILETOEDITOR,GOCLOSESOURCEFILE*8*ŠSAVELOGICALRECORDNUMBEROFLASTRECORDINEDITFILE*-OPN170 SUB.L #1,D3 D3 = LAST LRN OF EDIT FILE1OPN175 MOVE.L D3,EOFLRN(A5) SAVE LAST LRN OF FILE6‚MOVE.LD3,FMSREC(A3)RETURNITINTHEPARAMETERBLOCK*1*ŠCLOSESOURCEFILE(LEAVINGONLYEDITFILEOPEN)*)‡TST.BEFFLG(A5)SOURCEFILE=EDITFILE?G BEQ.S OPN190 YES, LEAVE SOURCE FILE OPEN (SINCE ASSIGNED AS EDIT FILE),ŠMOVE.BOSLUN(A5),FHSLUN(A4)'FILENAME1'LUN)‹SFHSCOFHCLOS,0,A4‡CLOSEWITHNOOPTIONS FHSCALL (A4) BNE.S OPNER2 ERROR ON CLOSE*@*ŠPART6:REOPENOUTPUTFILEFOROVERWRITEIFUSINGSCRATCHFILE*ŠANDRETURNTOEDITOR*4OPN190„TST.BEFFLG(A5)EDITINGOUTPUTFILEDIRECTLY?: BPL.S OPNOKR YES, IT IS ASSIGNED ALREADY AS THE EDIT FILE-MOVE.BOSLUN(A5),D0‰NO,ASSIGNFOROVERWRITE‹SFHSCOFHASGN,FOPEW+FOPOVRT,A4+ MOVE.L FMSBUF(A3),A0 FILENAME1 FOR OUTPUT? TST.B OFSTAT(A0) . BEQ.S OPN195 YES LEA FLNM2(A0),A0 NO, FILENAME2-OPN195‚BSR.SASAFILOPENOUTPUTFOROVERWRITEOPNER2†BNEOPNERR'OPNOKR BRA FMSOKR GOOD RETURN FROM OPEN PAGE%*Š*************************************ŽASAFIL1.0012/12/1979HBN6*%*Š************************************C*ŠSUBROUTINEASAFILASSIGNSGIVENFILEIFITEXISTS,ELSEAFILEIS*•ALSOALLOCATED***ŠONENTRY:A0->FILENAMETOBEASSIGNED2*”A4->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.L A0-A1,-(A7) SAVE REGISTERS MOVE.B D0,FHSLUN(A4) SET LUN" LEA FHSVOL(A4),A1 MOVE TO ADDRESS' MOVE.L #FILNML/2,D0 WORD COUNT TO MOVEASA00 MOVE.W (A0)+,(A1)+ SUB.W #1,D0 BNE ASA00**ŠSETREADANDWRITECODE* TST.W (A0)+ SKIP RESERVED WORD1 MOVE.W (A0)+,FHSWCD(A4) SET READ AND WRITE CODES**ŠTRYTOASSIGNGIVENFILE*- CLR.L D1 ANTICIPATE GOOD ASSIGN AT FIRST TRY8 FHSCALL (A4) ASSIGN CALL (AND ALLOCATE IF SO INDICATED) BEQ.S ASARET ASSIGN OK?+ CMP.B #FSTANNM,D0 NO, FILE DOES NOT EXIST? BNE.S ASARET NO, OTHER ERROR*5*ŠHAVETOALLOCATENEWFILEBEFORECANHOPETOASSIGN*. MOVE.L #OFSDEL,D1 INDICATE NEW FILE ALLOCATED- OR.W #FHALLO,FHSCMD(A4) TRY TO ALLOCATE FILEFHSCALL(A4)ƒANDTHENASSIGN,ASARET MOVEM.L (A7)+,A0-A1 RESTORE REGISTERS RTS PAGE**"*Š**********************************ŽRDCMD1.0001/07/79HBN6*"*Š*********************************/*ŠENTRYANDEXITCONDITIONSSAMEASFOROPENCMD** RDCD EQU ** *ŠINITIALIZE*2 MOVE.L FMSBUF(A3),A1 STARTING LINE BUFFER ADDRESS CLR.L D1/ MOVE.W FMSRECN(A3),D1 GET # OF RECORDS TO READ+‚CLR.WD20#OFRECORDSTRANSFERRED‚SOFAR/ MOVE.L FMSREC(A3),D3 LRN OF 1ST RECORD TO READ/ MOVE.L EOFLRN(A5),D4 GET LAST LRN IN EDIT FILEBMIƒRD40EMPTYFILE? TST.LD3ƒNO- BMI.S RD35 READ N LAST RECORDS OF FILE IF -11 CMP.L D4,D3 NO, DOES 1ST RECORD REQUESTED EXIST?1BGTƒRD40NO,RETURNWITHRECORDNOTFOUNDSTATUS**ŠGETONERECORDATATIME*"RD01 CMP.L EOFLRN(A5),D3 PAST EOF? BHI.S RD25 YES, DONE READING/BSRGETNRC‹NO,READNEXTRECORDFROMEDITFILE BEQ .S RD01A CMP.B #-1,D0 MUST CALL POSTRC?RDERR„BNEFMSRETNO,IOERROR1CLR.LD0…YES,GETRECORDPOSITION‚ANDSETLRECRD; BSR POSTLR BY READING IN BLOCK CONTAINING REQUESTED RECORDBNE.SRDERR‚ERROR4RD01A ADD.W #1,D2 INCREMENT # OF RECORDS TRANSFERRED**ŠMOVERECORDTOLINEBUFFER*$‚MOVE.WD6,D5GET#OFSPACESTOPAD SUB.W D4,D5 . RD02 CLR.W D0* MOVE.B (A0)+,D0 NEED TO EXPAND ANY SPACES BPL.S RD05 NO BCLR #7,D0 YES, GET SPACE COUNT SUB.W #1,D0= SUB.W D0,D5 NO, SUBTRACT ADDITIONAL BYTES FROM END OF RECORDRD03 MOVE.B D7,(A1)+ EXPAND SUB.W #1,D0 BMI.S RD06 BRA.S RD03RD05 MOVE.B D0,(A1)+ MOVE0RD06 MOVE.L FMSBUF(A3),D0 QUIT IF BUFFER IS FULL ADD.L D6,D0 CMP.L A1,D0$ BLE.S RD15 BRANCH IF BUFFER IS FULL SUB.W #1,D4 BNE RD02*-*ŠSPACEFILLRESTOFLINEBUFFERIFNECESSARY*( TST.W D5 ANY BYTES LEFT IN LINE BUFFER? BLE.S RD15 NO1RD10 MOVE.B D7,(A1)+ YES, BLANK FILL TO NEXT LINE SUB.W #1,D5 BNE RD10**ŠREADNEXTRECORD*RD15 SUB.L #1,D1 DONE? BEQ.S RD20 YES6 ADD.L #1,D3 NO, READ NEXT RECORD, GET ITS LRN INTO D3RD19‡BRA.SRD01.**ŠSETRETURNPARAMETERS*+RD20CLR.LD0„GOODRETURNUNLESSFINDERROR.…CMP.LEOFLRN(A5),D3READLASTRECORDOFFILE? BNE.S RD30 NO1RD25MOVE.L#ISTAEOF+MN,D0‚YES,RETURNEOFSTATUS2‚MOVE.LEOFLRN(A5),D3EOFLRNFORLASTRECORDREAD3RD30 MOVE.W D2,FMSRECN(A3) RETURN # OF RECORDS READ4 MOVE.L D3,FMSREC(A3) RETURN LRN OF LAST RECORD READ# MOVE.B D0,FMSTAT(A3) RETURN STATUS BRA FMSOKR GOOD RETURN*!*ŠREADNLASTRECORDSOFTHEFILE*.RD35 MOVE.L D4,D0 GET STARTING LRN FOR READING8 CLR.L D3 READ FROM TOP OF FILE IF REQUESTED ALL OR MORE) ADD.L #1,D0 . RECORDS THAN FILE CONTAINS CMP.L D0,D1 . BGE.S RD19 READ FROM TOP?. SUB.L D1,D0 NO, START READING FROM EOFLRN+1-N MOVE.L D0,D3 .†BRAƒRD19GOREAD*=RD40MOVE.L#ISTARN+MN,D0ƒ1STRECORDREQUESTEDDOESNOTEXIST BRA.S RD30 RETURN PAGE**ŽGETNRC1.0004/09/80HBN6*>*ŠGETNRCGETSNEXTRECORDPOINTERINSHAREDBUFFER,READSNEXT2*‘BLOCKIFRECORDNOTINCURRENTBLOCK.‚IFCURRENT7*‘RECORDDOESNOTEXISTORDOESNOTIMMEDIATELYPRECEDE6*‘WANTEDRECORDARECORDNOTAVAILABLERETURNISMADE.*%*ŠONENTRY:D3=LRNOFRECORDWANTED3*”LRECRD=LRNOFCURRENTRECORD,-1=>NONEEXISTS(*”LRECBA=CURRENTRECORDBUFFERADDRESS0*ŠONEXIT:‚D0=0IFRECORDPOINTERRETURNED,OR *™-1IFRECORDNOTAVAILABLE,OR*™ERRORCODEOTHERWISE0*”D4=RECORDLENGTH(ANYKEYSKIPPED)IFD0=0*™TRUNCATEDIFTOOLONG8*”A0->RECORD(ANYKEYSKIPPED)IFD0=0,ELSEUNKNOWN*#SGETNRCEQU*„READFROMSOURCEFILE/ MOVEM.L D1/D6-D7/A1-A2/A4,-(A7) SAVE REGISTERS CLR.L D6 GET RECORD LENGTH MOVE.W SRCRCZ(A5),D6 . CLR.L D7 GET KEY SIZE*MOVE.BSRCKYZ(A5),D7…SKIPALLSOURCEKEYS% LEA SRCDBL(A5),A1 LOGICAL BUFFER END LEA SRCDBS(A5),A2 BUFFER START LEA SRCDBE(A5),A4 BUFFER END MOVE.B OSLUN(A5),IOSLUN(A6) BRA.S GETN00* GETNRCEQU*‡READFROMEDITFILE/ MOVEM.L D1/D6-D7/A1-A2/A4,-(A7) SAVE REGISTERS)CLR.LD6…RECORDLENGTH=0FOREDITFILE$CLR.LD7…KEYSIZE=0FOREDITFILE% LEA FMSDBL(A5),A1 LOGICAL BUFFER END LEA FMSDBS(A5),A2 BUFFER START LEA FMSDBE(A5),A4 BUFFER END MOVE.B EFLUN(A5),IOSLUN(A6)**ŠRECORDPOSITIONAVAILABLE?*2GETN00„MOVE.LLRECRD(A5),D1GETCURRENTRECORDLRN ADD.L #1,D1 ONE EXISTS? BEQ.S GETRET NO, RETURN D0 = -15 CMP.L D1,D3 REQUESTED RECORD NEXT AFTER CURRENT ONE? BNE.S GETRET NO**ŠYES,GETRECORDPOINTER*,MOVE.LLRECBA(A5),A0…CURRENTRECORDPOINTER CLR.L D4 MOVE.W D6,D4 VRL FILE? BEQ.S GETN05 YESA ADD.L D4,A0 NO, FRL, NOW A0 -> NEXT RECORD IF IT'S IN THE BUFFER( MOVE.L A0,LRECBA(A5) SAVE IN CASE IT ISGETNOK‚EQU*‰SKIPANYKEY ADD.L D7,A0 . SUB.W D7,D4 . CMP.L (A1),A0 PAST BUFFER END? BHI.S GETN15 YES* MOVE.L A0,D0 TEST END OF RECORD IN BUFFER ADD.L D4,D0 . SUB.L #1,D0 . CMP.L (A1),D0 ./ BHI.S GETNIE INTERNAL ERROR IF PAST BUFFER  END1 MOVE.L D3,LRECRD(A5) SET LRN OF RECORD LAST READA CLR.L D0 NO, RECORD OK (CHECK YET THAT RECORD END WITHIN FMSBDL) BRA.S GETRTN0GETRET MOVE.L #-1,D0 RETURN RECORD NOT AVAILABLE/GETRER MOVE.L #-1,LRECRD(A5) NO LAST RECORD NOW‚BRA.SGETRTN13GETRTN CMP.W #MXRECL,D4 TRUNCATE RECORD IF TOO LONG‚BLE.SGETRTN1OK‚MOVE.L#MXRECL,D4.‚MOVE.B#ISTABO,BOFLG(A5)FLAGBUFFEROVERFLOW*GETRTN1 TST.L D0 RESTORE RETURN CONDITIONS2‚MOVEM.L(A7)+,D1/D6-D7/A1-A2/A4RESTOREREGISTERS RTS!GETN05CLR.LD1ˆCLEARANYGARBAGE(‡MOVE.W(A0)+,D1GETNEXTRECORDPOINTER& BEQ.S GETNIE . INTERNAL ERROR IF ZERO BTST #0,D1 ODD LENGTH RECORD? BEQ.S GETN10 NO" ADD.L #1,D1 YES, SKIP FILLER BYTEJGETN10 ADD.L D1,A0 NOW A0 -> NEXT RECORD'S BCT FIELD IF IT'S IN THE BUFFER.GETN11MOVE.LA0,LRECBA(A5)ƒSAVEINCASEITIS" CMP.L (A1),A0 PAST END OF BUFFER? BHI.S GETN15 YES( MOVE.W (A0)+,D4 NO, NEXT RECORD EXISTS? BNE.S GETNOK YES*?*ŠNEXTRECORDINNEXTDATABLOCK,READBLOCKINTOSHAREDBUFFER* GETN15 EQU *= SIOSCO IOREAD,IOPBLK+IOPNXT+IOPIMG+IOPBIN,A6 READ NEXT BLOCK? MOVE.L (A2),IOSSAD(A6) SET SHARED BUFFER START AND END ADDRESS MOVE.L (A4),IOSEAD(A6) . IOSCALL (A6)BNEƒGETRERERROR* MOVE.L (A2),A0 BLOCK'S 1ST RECORD POINTER$ MOVE.L A0,D0 GET BUFFER LOGICAL END ADD.L IOSLEN(A6),D0 . SUB.L #1,D0 . MOVE.L D0,(A1) .GETN20TST.WD6‰VRLFILE? BEQ.S GETN11 YESBRAƒGETNOKNO,FRL/GETNIE MOVE.B #ISTAIE,FMSTAT(A3) INTERNAL ERROR CLR.L D0 BRA FMSABRT ABORT PAGE*#*Š***********************************SGETCRC1.0004/09/80HBN6*#*Š**********************************4*ŠSGETCRCGETSCURRENTRECORDPOINTERANDITSLENGTH*%*ŠONENTRY:D3=LRNOFRECORDWANTED/*ŠONEXIT:‚SAMERETURNCONDITIONSASFORGETNRC*<*ŠNOTE:PUSHSAMEREGISTERSONSTACKASINGETNRCSINCEWILL *JUMPTHERE**"SGETCRC EQU * GET FROM SOURCE FILE MOVEM.L D1/D6-D7/A1-A2/A4,-(A7) CLR.L D6 CLR.L D7* MOVE.B SRCKYZ(A5),D7 SKIP ALL SOURCE KEYSƒMOVE.WSRCRCZ(A5),D6 LEA SRCDBS(A5),A2 LEA SRCDBE(A5),A4 LEA SRCDBL(A5),A1 MOVE.B OSLUN(A5),IOSLUN(A6)**ŠCHECKNEXTRECORDEXISTS*+†CMP.LLRECRD(A5),D3CURRENTRECORDEXISTS?BNEƒGETRETNO7 MOVE.L LRECBA(A5),A0 GET CURRENT RECORD BUFFER ADDRESS" BRA.S GETN20 GO GET RECORD LENGTH PAGE*ŽDELCMD1.0001/07/79HBN6**/*ŠENTRYANDEXITCONDITIONSSAMEASFOROPENCMD* DELCD EQU ** *ŠINITIALIZE*&‚TST.BKEEP(A5)ERRORIF'K'OPTIONON‚BNEFMSABMN. CLR.L D1 CLEAR FOR USE1 MOVE.W FMSRECN(A3),D1 GET # OF RECORDS TO DELETE@ ADD.W D1,CHKPCT-DATASG(A5) KEEP TRACK OF NUMBER OF FILE CHANGES' CLR.W D2 0 # OF RECORDS DELETED SO FAR6 MOVE.L FMSREC(A3),IOSRRN(A6) LRN OF RECORDS TO DELETE2 MOVE.L EOFLRN(A5),D0 EMPTY FILE? ( EOFLRN = -1 ?)' BMI.S DEL25 YES, CAN'T DELETE ANYTHING# CMP.L FMSREC(A3),D0 RECORD EXISTS?4 BLT.S DEL25 NO, RETURN WITH RECORD NOT FOUND STATUS**ŠDELETEONERECORDATATIME*.‹SIOSCOIODELR,IOPRAN,A6DELETERANDOMLOGICAL2MOVE.B‚EFLUN(A5),IOSLUN(A6)DELETEFROMEDITFILE DEL00 EQU *†IOSCALL(A6)DELETE$ BNE.S DEL10 IO ERROR OR END OF FILE**ŠDELETENEXTRECORD*1 SUB.L #1,EOFLRN(A5) UPDATE LAST LRN OF EDIT FILE+ ADD.W #1,D2 INCREMENT # OF RECORDS DELETED TST.B FMSBRK(A3) A BREAK INPUT?+ BMI.S DEL05 BRANCH IF YES,RETURN TO CALLER"SUB.W#1,D1‚GODELETENEXTRECORD BNE DEL00*/*ŠSETEOFSTATUSIFDELETEDLASTRECORDOFFILE*1DEL05‚MOVE.LEOFLRN(A5),D0GETLRNOFLASTRECORD> CMP.L FMSREC(A3),D0 LAST RECORD DELETED IF EOFLRN .LT. FMSREC% BLT.S DEL20 LAST RECORD STILL THERE? BRA.S DEL15 NO'DEL10 CMP.B #ISTAEOF,D0 AT END OF FILE? BNE FMSRET NO, IO ERROR9DEL15 MOVE.B #ISTAEOF,FMSTAT(A3) YES, DELETED LAST RECORD**ŠSETRETURNPARAMETERS*7DEL20 MOVE.W D2,FMSRECN(A3) RETURN # OF RECORDS DELETED: MOVE.L EOFLRN(A5),FMSREC(A3) RETURN LAST LSN IN EDIT FILE: MOVE.B #EFSCHG,FMSEFS(A3) SET EDIT FILE STATUS AS CHANGEDBRAFMSOKR‚GOODRETURN SFHSCO FHCLOS+FHDELT,0,A4 DELETE OUTPUT FILE (FILENAME1 OR 2)K LEA FHSVOL(A4),A1 MOVE OUTPUT FILENAME INTO FHS PARAMETER BLOCK FOR DELETE LEA OUTFLN(A5),A0 . MOVE.L #(FILNML+4)/2,D0 .CLS0A MOVE.W (A0)+,(A1)+ . SUB.W #1,D0 . BNE CLS0A .)CLS00 MOVE.B EFLUN(A5),FHSLUN(A4) SET LUN5 TST.B EFFLG(A5) EDITING 'FILENAME1' OR 'FILENAME2' ?BPL.SCLS01‚YES,4 MOVE.B OSLUN(A5),FHSLUN(A4) NO, USE OUTPUT FILE LUN CLS01 EQU * ˆFHSCALL(A4) BNE.S CLSERR IO ERROR" TST.B EFFLG(A5) ALL FILES CLOSED? BPL.S CLSRET YES*#*ŠCLOSE(ANDDELETE)SCRATCHFILE*/CLS05„MOVE.B‚EFLUN(A5),FHSLUN(A4)EDITFILELUN‹SFHSCOFHCLOS,0,A4CLOSE FHSCALL (A4)CLSERRƒBNEFMSRETIOERRORCLSRET BRA FMSOKR GOOD RETURN PAGE*#*‹***********************************CKPTCMD1.007/9/80HBN6*#*‹********************************** CKPTCD EQU *% TST.B KEEP(A5) SKIP IF 'K' OPTION ON ‚BNEFMSOKR*‚CLR.WFMSRECN(A3)SETNORENAMEEXTENSION?CKPT00 MOVE.B EFLUN(A5),FHSLUN(A4) DO A CHECKPOINT ON EDIT FILE MOVE.W #FHCKPT,FHSCMD(A4) ‚FHSCALL(A4)‚BNEFMSRETI/OERRORRETURN*‚CLR.WCHKPCT-DATASG(A5)CLEARTHECOUNTER‚BRAFMSOKRGOODRETURN PAGE**$*Š************************************ŽREPLCMD1.0001/08/80HBN6*$*Š***********************************/*ŠENTRYANDEXITCONDITIONSSAMEASFOROPENCMD* REPLCD EQU **/*ŠSETUPTODOABOUTTHESAMECODEASFORINSERT*&‚TST.BKEEP(A5)ERRORIF'K'OPTIONON‚BNEFMSABMN.5‹SIOSCOIOUPDR,IOPRAN,A6UPDATERANDOMLOGICALRECORD+ CLR.L D1 FLAG TO REPLACE INSTEAD OF INSERT+ƒTST.L‚EOFLRN(A5)EOFLRN=-1=>EMPTYFILE/ BMI INSR35 RETURN RECORD DOES NOT EXIST STATUS‚BRA.SINSREPL‚GOREPLACE*;*ŠLATERADDCODETOREPLACERECORDWITHBCTLTOLDRECORD'S;*ŠBCTANDOLDRECORD'SBCT>80(LEAVEOLDRECORDBCTALONE*ŠJUSTOVERLAYSTARTOFRECORD)=*ŠNOTE:NOWCANONLYHANDLERECORDSOFUPTO80CHARACTERSAND5*ŠTHEEDITORWILLTRUNCATELONGERRECORDSIFUPDATED.**!*Š*********************************INSRTCMD1.0001/07/80*!*Š********************************6*ŠENTRYANDEXITCONDITIONSSAMEASFOROPENCMD‚EXCEPT8*ŠONENTRY:D1=0‚IFINSREPLENTRYELSEWILLSETD1=1* INSRTCD EQU ** *ŠINITIALIZE*&‚TST.BKEEP(A5)ERRORIF'K'OPTIONON‚BNEFMSABMN. MOVE.L #1,D1 SET FLAG TO INSERT*9INSREPL EQU * ENTRY POINT IF TO REPLACE INSTEAD OF INSERT*@ ADD.W #1,CHKPCT-DATASG(A5) KEEP TRACK OF NUMBER OF FILE CHANGESGMOVE.LFMSREC(A3),D3‚INSERTAFTERRECORDWITHTHISLRN,ORATTOPIF-1= MOVE.L FMSBUF(A3),A0 A0 -> RECORD TO BE INSERTED OR REPLACEDC MOVE.L A0,A2 . SAVE ADDRESS SO CAN RESTORE BEFORE BEFORE RETURNING1 MOVE.L A0,IOSSAD(A6) SET STARTING RECORD ADDRESS4 MOVE.L A0,IOSEAD(A6) PREPARE FOR BUFFER END ADDRESS$ MOVE.L #-1,D5 INITIALIZE RECORD BCT MOVE.L #-1,D4 . PAGE*,*ŠGETRECORDLENGTH-IGNORETRAILINGSPACES*'INSR00 ADD.L #1,D5 INCREMENT RECORD BCT CMP.B (A0)+,D7 SPACE? BEQ.S INSR05 YESI MOVE.L D5,D4 NO, SAVE RECORD BCT IN CASE THIS IS LAST NONBLANK CHARACTERINSR05 SUB.W #1,D6 DONE? BNE INSR00 TST.L D4 YES,BLANK LINE? BPL.S INSR10 NO5CLR.LD4ƒYES,HAVETOHAVEATLEASTONEBYTERECORDS*!*ŠPOSITIONATLRNGIVENTOINSERT* INSR10 EQU *2ƒMOVE.B‚EFLUN(A5),IOSLUN(A6)INSERTINTOEDITFILE MOVE.L D3,IOSRRN(A6) SET LRN) CMP .L EOFLRN(A5),D3 GIVEN RECORD EXISTS?) BGT.S INSR35 NO, RETURN RECORD NOT FOUND+ TST.L D1 REPLACE RECORD INSTEAD OF INSERT?#BEQ.S‚INSR20YES,SKIPPOSITIONING8 CMP.L EOFLRN(A5),D3 WRITE FIRST OR LAST RECORD OF FILE? BEQ.S INSR40 YES, GO WRITE>‹SIOSCOIOPOST,IOPRAN,A6NO,POSITIONATRANDOMLOGICALRECORD TST.L D3 INSERT AT TOP OF FILE? BGE.S INSR15 NO/ CMP.L #-1,D3 . INVALID LRN => RECORD NOT FOUND BNE.S INSR35 .5 CLR.L IOSRRN(A6) YES, POSITION AT 1ST RECORD OF FILE INSR15 EQU *‡IOSCALL(A6)POSITIONBNE.SINSERR‚IOERROR*:*ŠINSERTRECORDAFTERCURRENTPOSITIONORINFRONTOFFILE*ŠORREPLACEGIVENRECORD*K SIOSCO IOWRIT,IOPPRV+IOPASC+IOPFOR,A6 WRITE PRIOR IF INSERT AT TOP OF FILE TST.L D3 INSERT 1ST RECORD? BMI.S INSR20 YES5ˆSIOSCOIOWRIT,IOPNXT+IOPASC+IOPFOR,A6NO,WRITENEXT4INSR20ADD.LD4,IOSEAD(A6)ƒSETENDOFRECORDADDRESS. IOSCALL (A6) WRITE = INSERT, UPDATE = REPLACE BEQ.S INSR25 IO ERROR?INSERR„TST.BD0‚YES BRA FMSRET IO ERROR RETURN PAGE**ŠSETRETURNPARAMETERS*=INSR25‚MOVE.B#EFSCHG,FMSEFS(A3)SETEDITFILECHANGEDSTATUS TST.L D1 REPLACED RECORD? BEQ.S INSR30 YES, RETURN/ ADD.L #1,D3 NO, INSERTED, GET NEW RECORD'S LRN MOVE.L D3,FMSREC(A3) .( ADD.L #1,EOFLRN(A5) INSERTED ONE RECORDDINSR30 CMP.L EOFLRN(A5),D3 INSERTED OR REPLACED LAST RECORD OF FILE? BNE.S INSRET NO- MOVE.B #ISTAEOF,FMSTAT(A3) SET STATUS TO EOFINSRET‚BRAFMSOKRGOODRETURNBINSR35 MOVE.B #ISTARN,FMSTAT(A3) SET LRN OUT OF BOUNDS RETURN FLAG BRA.S INSRET*$*ŠWRITEFIRSTORLASTRECORDOFFILE* INSR40 EQU *%‡SIOSCOIOWRIT,IOPRAN,A6WRITERANDOM&ADD.L#1,IOSRRN(A6)LRNIS‚0OREOF+1 BRA INSR20 GO WRITE PAGE%*Š*************************************POSTLR1.0001/07/80HBN6*%*Š************************************C*ŠSUBROUTINEPOSTLRPOSITIONSTORECORDWITHGIVENLRNINEDITFILE7*•SHAREDBUFFERANDSETSLRECRDANDLRECBAIFREQUESTED,*•(TOBECALLEDFOREDITFILEPOSITIONONLY)*F*ŠONENTRY:D0=1IFTOLEAVELRECRDALONE,0IFTOSETLRECRD/LRECBA *”D3=LRN *”BSRPOSTLR**ŠONEXIT:‚ALLREGISTERSUNCHANGEDEXCEPT:;*”A0->RECORDINSHAREDBUFFER,BCTANDKEYFIELDSSKIPPED#*”D4=RECORDLENGTH(IGNORINGKEY)*”D0=IOSCALLSTATUS*”Z-FLAGSETACCORDINGLY*”RTS* POSTLR EQU **'*ŠSETPARAMETERSINIOSPARAMETERBLOCK* MOVE.L D0,D4 SAVE LRECRD FLAG0SIOSCOIOPOST,IOPRAN,A6†RANDOMLOGICALPOSITION, MOVE.L D3,IOSRRN(A6) SET LRN TO POSITION TO MOVE.B EFLUN(A5),IOSLUN(A6) LUN IOSCALL (A6)& BNE.S POSTL1 BRANCH IF ERROR RETURNED MOVE.L FMSDBS(A5),A0! ADD.L IOSLEN(A6),A0 A0 -> RECORD)TST.BD4‚UPDATELRECRD/LRECBAREQUESTED? BNE.S POSTL1 NO9 MOVE.L D3,LRECRD(A5) YES, UPDATE CURRENT RECORD POSITION1 MOVE.L A0,LRECBA(A5) SET RECORD'S BUFFER ADDRESSA MOVE.L FMSDBE(A5),FMSDBL(A5) SET LOGICAL END AT END OF BUFFER (0„MOVE.W(A0)+,D4GETRECORDBCT!POSTL1ƒTST.LD0RESTOREIOSTATUS‡RTS PAGE*#*Š***********************************ŽWRITLR1.0001/07/80HBN6*#*Š**********************************)*ŠSUBROUTINEWRITLRWRITES/INSERTSRECORD*(*ŠONENTRY:A2=STARTINGBUFFERADDRESS *”D0=LUN*”D4=RECORDLENGTHTOWRITE*”D3=LRNTOUSEIFRANDOM**ŠONEXIT:‚ALLREGISTERSUNCHANGEDEXCEPT: *”A0=A6*”D0=ERRORSTATUS WRITLR EQU **#*ŠSETIOSPARAMETERBLOCKFORWRITE*C SIOSCO IOWRIT,IOPRAN,A6 WRITE RANDOM LOGICAL(WRITE TO END OF FILE)*WRTL00 LEA -1(A2,D4),A0 RECORD END POINTER MOVE.L A0,IOSEAD(A6) MOVE.L D3,IOSRRN(A6) MOVE.L A2,IOSSAD(A6) MOVE.B D0,IOSLUN(A6) IOSCALL (A6) RTS*8WRITLRO EQU * SAME AS WRITLR BUT WITH D6 = WRITE OPTIONS MOVE.W #IOWRIT,IOSFCT(A6)' MOVE.W D6,IOSOPT(A6) SET OPTIONS GIVEN BRA WRTL00 PAGE*$*Š************************************ŽPRNTCMD1.0005/06/80HBN6*$*Š*********************************** PRNTCD EQU ***ŠASSIGNPRINTER*' MOVE.B FMSTRANS(A3),D5 GET PRINTER LUN9 MOVE.L FMSBUF(A3),FHSVOL(A4) SET PRINTER DEVICE MNEMONICMOVE.L#'„',D4.  MOVE.L D4,FHSCLG(A4) . MOVE.L D4,FHSCLG+4(A4) . MOVE.L D4,FHSFIL(A4) . MOVE.L D4,FHSFIL+4(A4) . MOVE.W D4,FHSEXT(A4) .% MOVE.B D5,FHSLUN(A4) SET PRINTER LUN/ SFHSCO FHASGN,FOPPW,A4 ASSIGN FOR PUBLIC WRITE2 MOVE.W #$00FF,FHSWCD(A4) SET WRITE AND READ CODES FHSCALL (A4)BNEƒFMSRETƒERROR**ŠGETPRINTERATTRIBUTES*" SFHSCO FHRATT,0,A4 GET ATTRIBUTES FHSCALL (A4) . BNE.S PRNTER . ERROR# MOVE.L FHSSIZ(A4),D7 GET ROW COUNT5 SUB.L #6,D7 ADJUST MARGIN FOR TOP AND BOTTOM OF PAGE3 MOVE.L D7,D2 KEEP ROW COUNT IN D2 FOR CURRENT PAGE*&*ŠPOSITIONTO1STRECORDTOBEPRINTED*=‚BSRCHKRECGETLRNOF1STRECORDINTOD3ANDCHECKITEXISTS‚BNEƒPRINT60ERRORE‚BSRPOSTLRPOSITIONTOCURRENTRECORD(D0=0SOWILLUPDATELRECRD) BNE.S PRNTER ERROR**ŠEXPANDRECORD*1PRINT05 TST.B FMSBRK(A3) RETURN IF BREAK FLAG SET BPL.S PRINT06 NO BREAK0 MOVE.B #1,FMSTAT(A3) RETURN WITH BREAK FLAG SET BRAƒPRINT60,PRINT06 CMP.W FHSLRL(A4),D4 RECORD TOO LONG? BLE.S PRINT07 NO= MOVE.W FHSLRL(A4),D4 YES, PRINT ONLY MAXIMUM NUMBER OF BYTES=PRINT07 LEA RECBUF(A5),A2 MOVE RECORD TO BUFFER SO CAN EXPAND! MOVE.L A2,A1 . SAVE RECORD START$CLR.L‚D1„SAVINGACTUAL‚LENGTHIND1"CLR.L‚D6„COMPRESSEDRECORDLENGTH CLR.L D0'PRINT10 MOVE.B (A0)+,D0 . GET NEXT BYTE ADD.L #1,D6 COUNT THIS BYTE+ TST.B D0 SEE IF A SPACE COMPRESS CHARACTER3 BPL.S PRINT20 . BRANCH IF NOT A COMPRESS CHARACTER= BCLR #7,D0 . SPACE COMPRESS, MOVE INDICATED NUMBER OF SPACES&PRINT15MOVE.B#'',(A1)+‚MOVEASPACE ADD.L #1,D1 COUNT IT" CMP.L #MXRECL,D1 REACHED MAX YET?= BGE.S PRINT30 BRANCH IF REACHED THE MAX NUMBER OF CHARACTERS'SUB.B#1,D0‚DECREMENTNUMBEROFSPACES% BNE.S PRINT15 BRANCH IF MORE TO MOVE# CMP.L D4,D6 REACHED END OF RECORD?' BNE PRINT10 BRANCH IF NO,GET NEXT BYTE6BRAPRINT30‚ALLCHARACTERSMOVED-GOWRITETHISRECORD2PRINT20 MOVE.B D0,(A1)+ CHARACTER TO OUTPUT BUFFER ADD.L #1,D1 COUNT IT$ CMP.L #MXRECL,D1 REACHED MAX COUNT?*BGE.SPRINT30…BRANCHIFREACHEDMAXCOUNT# CMP.L D6,D4 REACHED END OF RECORD?/ BGT PRINT10 BRANCH IF NOT AT END OF THE RECORD)PRINT30 MOVE.L D1,D4 ACTUAL RECORD LENGTH*%*ŠRECORDEXPANDED,SENDITTOPRINTER*: MOVE.L #IOPNXT+IOPFOR,D6 WRITE RECORD AND FORCE LINE FEED MOVE.B D5,D0 PRINTER LUN% BSR WRITLRO WRITE WITH OPTIONS IN D6PRNTER‚BNE.SPRINTERERROR SUB.W #1,D2 USED UP ONE LINE! BLE.S PRINT80 AT BOTTOM OF PAGE? MOVE.L #1,D4 NO, NOT YET0 MOVE.W #LFCHAR*$100+LFCHAR,(A2) DOUBLE SPACING? CMP.B #1,FMSCNT(A3) ./ BLT.S PRINT50 NO, SINGLE - ALREADY SEND ONE LF1 BEQ.S PRINT40 YES, GO PUT OUT ONE MORE LINE FEED5 ADD.L #1,D4 NO, TRIPLE SPACING - SEND TWO LINE FEEDS3PRINT40 SUB.W D4,D2 ACCOUNT FOR BLANK LINES IN PAGE! BLE.S PRINT80 GO DO TOF INSTEAD? PRINT45 MOVE.B D5,D0 NO, SET LUN MOVE.L #IOPNXT+IOPIMG,D6+ BSR WRITLRO PRINT LINE FEEDS OR FORM FEEDS BNE.S PRINTER*(*ŠREADNEXTRECORDANDPRINTIFREQUIRED*#PRINT50 ADD.L #1,D3 NEXT RECORD LRN, CMP.W #-1,FMSRECN(A3) PRINT TO END OF FILE? BEQ.S PRINT55 YESD SUB.W #1,FMSRECN(A3) NO, DONE PRINTING REQUESTED NUMBER OF RECORDS? BEQ.S PRINT60 YES(PRINT55 BSR GETNRC NO, PRINT NEXT RECORDBEQƒPRINT05GOPRINTIT" CMP.B #ISTAEOF,D0 AT END OF FILE? BNE.S PRINTER NO, OTHER ERROR**ŠDONEPRINTING,CLOSEPRINTER*PRINT60 CLR.L D0(PRINTER MOVE.B D5,FHSLUN(A4) PRINTER LUN SFHSCO FHCLOS,0,A4 MOVE.L D0,D5 SAVE ERROR STATUS FHSCALL (A4)PRINTERR BNE FMSRET ERROR MOVE.L D5,D0#BNEPRINTERR‚IOERRORBEFORECLOSEˆBRAFMSOKRGOODRETURN* *ŠTOPOFFORM*2PRINT80 MOVE.L D7,D2 RESET ROW COUNT FOR NEXT PAGE( MOVE.L #1,D4 SEND TOF CHARACTER TO PAGE MOVE.B #FFCHAR,(A2) BRA PRINT45 PAGE*#*Š***********************************ŽSAVECMD1.005/16/80HBN6*#*Š********************************** SAVECMD EQU **?*ŠALLOCATEANDASSIGNGIVENFILEUSINGEDITFILEDEFAULTFORMAT*&‚TST.BKEEP(A5)ERRORIF'K'OPTIONON‚BNEFMSABMN. * MOVE.B FMSCNT(A3),D0 GET LUN OF SAVE FILE MOVE.B D0,D5 . KEEP IT IN D5% MOVE.L FMSBUF(A3),A0 A0 -> FILE NAME@ SFHSCO FHALLO+FHASGN,FOPEREW,A4 ASSIGN FOR EXCLUSIVE READ/WRITEM SFATTR FOPISD,VRLFIL,DEFSIZ,KEYSIZ,A4 ALLOCATE WITH EDIT FILE DEFAULT FORMAT BSR ASAFIL ALLOCATE AND ASSIGN BEQ.S SAVE00 GOOD RETURN BRA.S SAVEIO NO, IO ERROR*$*ŠPOSITIONTO1STRECORDTOBESAVED*@SAVE00ƒBSRCHKRECGETLRNOFRECORDINTOD3,CHECKLRNFORERROR BNE.S SAVE30' MOVE.L #-1,D2 INITIALIZE SAVE FILE LRN4 MOVE.W FMSRECN(A3),D6 GET NUMBER OF RECORDS TO SAVE< BSR POSTLR POSITION/READ FIRST RECORD WANTED AND SET LRECRD ‚BNE.SSAVEER**ŠWRITERECORDTOSAVEFILE*&SAVE10 MOVE.L D3,D7 SAVE EDIT FILE LUN( MOVE.L A0,A2 STARTING ADDRESS OF RECORD MOVE.B D5,D0 SAVE FILE LUN- ADD.L #1,D2 WRITE NEXT RECORD INTO SAVE FILE( MOVE.L D2,D3 SET LRN OF RECORD TO WRITE BSR WRITLR WRITE BNE.S SAVEER* *‰NEXTRECORD*' CMP.W #-1,D6 SAVE TO END OF EDIT FILE?& BEQ.S SAVE20 YES, GO SAVE NEXT RECORD- SUB.W #1,D6 NO, SAVED ALL REQUESTED RECORDS?% BEQ.S SAVE30 YES, GO CLOSE SAVE FILE5SAVE20 MOVE.L D7,D3 NO, SAVE NEXT RECORD IN EDIT FILE ADD.L #1,D3 GET ITS LRN(BSRGETNRCŠGETNEXTRECORDINEDITFILE! BEQ.S SAVE10 GO SAVE IF NO ERROR( CMP.B #ISTAEOF,D0 ERROR OR END OF FILE? BNE.S SAVEER ERROR1SAVE30‚CLR.LD0ATENDOFFILESETGOODIOSTATUS*.*‰DONE-CLOSESAVEFILE(ALSOCLOSEIFERROR)*0SAVEER MOVE.B D5,FHSLUN(A4) SET LUN OF SAVE FILE' MOVE.L D0,D5 SAVE CURRENT ERROR STATUS SFHSCO FHCLOS,0,A4 CLOSE FHSCALL (A4) .!SAVEIO BNE FMSRET IO ERROR RETURN) MOVE.L D5,D0 SET PRIOR ERROR CODE IF ANYˆBEQFMSOKRƒGOODRETURN BRA SAVEIO PAGE**ŽMERGECMD1.0005/16/80HBN6**5MERGECMDEQU*‚FIRSTASSIGNGIVENFILE-EXCLUSIVEREAD&‚TST.BKEEP(A5)ERRORIF'K'OPTIONON‚BNEFMSABMN.( MOVE.B FMSCNT(A3),D0 GET MERGE FILE LUN MOVE.B D0,D5 AND KEEP IT IN D53 MOVE.L FMSBUF(A3),A0 A0 -> FILE NAME OF MERGE FILE SFHSCO FHASGN,FOPER,A4 ASSIGN MOVE.B D5,FHSLUN(A4) LEA FHSVOL(A4),A1 MOVE FILENAME) MOVE.L #FILNML/2,D0 . WORD COUNT TO MOVEMERGE00 MOVE.W (A0)+,(A1)+ . SUB.W #1,D0 . BNE MERGE00 .% TST.W (A0)+ SET READ AND WRITE CODES MOVE.W (A0)+,FHSWCD(A4) . FHSCALL (A4) ASSIGN BEQ.S MERGE05CMP.B#FSTANNM,D0…NEWFILE?BNEMERGEIO‚NO!BRAFMSERR…YES,NEWFILE-ERROR**ŠPOSITIONTORECORDFORINSERT*8MERGE05 MOVE.W FHSOPT(A4),D2 CHECK MERGE FILE TYPE IS OK AND.W #FFTBIT,D2 .+ CMP.W #FOPCON,D2 . CONTIGUOUS FILE NO GOOD BNE.S MERGE10 OK* MOVE.B #FSTAFT,FMSTAT(A3) FILE TYPE ERROR%BRAƒMERGE35GOCLOSEFILEANDRETURNCMERGE10‚BSRCHKRECGETREQUESTEDLRNINTOD3ANDCHECKITFORERRORBNEƒMERGE35ERROR/ MOVE.L FMSADR(A3),D2 INITIALIZE MERGE FILE LRN5 MOVE.B #EFSCHG,FMSEFS(A3) SET FILE STATUS TO CHANGED& MOVE.L #1,D0 DON'T UPDATE LRECRD WHEN BSR POSTLR POSITION TO LRN‚BNE‚MERGERRERROR**ŠSETUPTOMERGE1STRECORD*H MOVE.W FMSRECN(A3),D7 NUMBER OF RECORDS TO MERGE (-1 => TO END OF FILE)A MOVE.W #IOPPRV+IOPASC+IOPFOR,D6 SET WRITE OPTIONS FOR 1ST RECORD*9*ŠREADARECORDFROMMERGEFILE&WRITEITINTOEDITFILE*?MERGE20MOVE.LD2,IOSRRN(A6)‚MERGEFILELRNTOBEUSEDFORREAD$ MOVE.B D5,IOSLUN(A6) MERGE FILE LUN1 LEA RECBUF(A5),A2 READ INTO FMSINT RECORD BUFFER MOVE.L A2,IOSSAD(A6) .+ LEA MXRECL-1(A2),A0 GET RECORD END ADDRESS MOVE.L A0,IOSEAD(A6) .& SIOSCO IOREAD,IOPRAN+IOPASC+IOPFOR,A6" IOSCALL (A6) READ FROM MERGE FILE BEQ.S MERGE25 NO ERROR" CMP.B #ISTABO,D0 BUFFER OVERFLOW?, BNE.S MERGE30 NO, READ ERROR OR END OF FILE< MOVE.B D0,BOFLG(A5) YES, IGNORE - SET FLAG TRUNCATED RECORD*MERGE25‚ADD.L#1,D2NEXTLRNINMERGEFILE6 MOVE.B EFLUN(A5),IOSLUN(A6) WRITE RECORD TO EDIT FILE MOVE.W #IOWRIT,IOSFCT(A6) . MOVE.W D6,IOSOPT(A6) ./ MOVE.L IOSSAD(A6),A0 GET END OF RECORD POINTER ADD.L IOSLEN(A6),A0 . SUB.L #1,A0 . MOVE.L A0,IOSEAD(A6) . IOSCALL (A6) WRITE BNE.S MERGERR IO ERROR**ŠSETUPTOGETNEXTRECORD  *J MOVE.W #IOPNXT+IOPASC+IOPFOR,D6 INSERT NEXT RECORD AFTER LAST ONE WRITTEN3 ADD.L #1,D3 MOVE LRN OF CURRENT EDIT FILE POSITION2 ADD.L #1,EOFLRN(A5) ADDED ONE RECORD TO EDIT FILE7ADD.W#1,CHKPCT-DATASG(A5)…BUMPNUMBEROFFILECHANGES#‚CMP.W#-1,D7MERGETOENDOFFILE?& BEQ.S MERGE20 YES, GO GET NEXT RECORD; SUB.W #1,D7 NO, MERGE REQUESTED NUMBER OF RECORDS ALREADY?# BNE.S MERGE20 NO, CONTINUE MERGING BRA.S MERGE35 YES, DONE/MERGE30 CMP.B #ISTAEOF,D0 AT END OF MERGE FILE?ˆBNE.S‚MERGERR‚NO,ERRORI CMP.W #IOPPRV+IOPASC+IOPFOR,D6 FIRST RECORD DID NOT EXIST IN MERGE FILE? BNE.S MERGE35 YES) MOVE.B #ISTARN,FMSTAT(A3) NO, FLAG ERROR*#*ŠMERGECOMPLETED,CLOSEMERGEFILE*MERGE35 CLR.L D0+MERGERR SFHSCO FHCLOS,0,A4 CLOSE MERGE FILEˆMOVE.BD5,FHSLUN(A4). MOVE.L D0,D5 SAVE ERROR STATUS FHSCALL (A4) .MERGEIO…BNEƒFMSRET**ŠRETURNREQUIREDPARAMETERS*6 MOVE.L D3,FMSADR(A3) LRN OF NEW CURRENT FILE POSITION= MOVE.L EOFLRN(A5),FMSREC(A3) LRN OF LAST RECORD IN EDIT FILE% MOVE.L D5,D0 IO ERROR BEFORE CLOSE ? BNE MERGEIOˆBRAFMSOKRNO PAGE*$*Š************************************ŽDUPMCMD1.005/16/80HBN6*$*Š*********************************** DUPMCMD EQU ****ŠGET1STRECORD(ANDMAKESUREITEXISTS)*&‚TST.BKEEP(A5)ERRORIF'K'OPTIONON‚BNEFMSABMN.1 BSR CHKREC GET LRN OF 1ST RECORD TO MOVE INTO D3BNEƒDUPMERRLRNERROR6 BSR POSTLR POSITION/READ FIRST RECORD (UPDATE LRECRD) BNEƒDUPMERR* *ŠGETEXTRACTBUFFERFORRECORDS*! TST.B BUFFLG(A5) ANY BUFFER NOW? BEQ.S DUPM00 NO TST.B FMSCNT(A3) APPEND OPTION?# BMI DUPM40 BRANCH IF APPEND OPTION" BSR DELBUF YES, DELETE OLD BUFFER BNEƒDUPMERR=DUPM00‚ADD.L#3,D6‹GET#OFRECORDSTOMOVE*MAXRECORDLENGTHB CMP.W #-1,FMSRECN(A3) . TO GET MAXIMUM BUFFER SIZE FOR ALLOCATION" BNE.S DUPM05 MOVE TO END OF FILE?: MOVE.L EOFLRN(A5),D0 YES, GET # OF RECORDS TO END OF FILE SUB.L D3,D0 . ADD.L #1,D0 . MULU D0,D6 GET MAX BUFFER SIZE BRA.S DUPM072DUPM05ƒMULUFMSRECN(A3),D6„GETMAXIMUMBUFFERSIZE&DUPM07 TST.B FMSCNT(A3) APPEND OPTION? BEQ.S DUPM10 BRANCH IF NO9 MULU #10,D6 USING APPEND,MAKE THE BUFFER 10 TIMES LARGER)DUPM10‚MOVE.LD6,EXBEAD(A5)BUFFERLENGTH>LEA‚EXBSEG(A5),A0ALLOCATESEGMENTFOREXTRACTBUFFER-ADDRESS MOVE.L #GTSEG,D0 EXEC DIRECTIVE TRAP #1 ALLOCATE SEGMENT BNE.S DUPMERR .3 MOVE.B #1,BUFFLG(A5) SET FLAG FOR BUFFER ALLOCATED9 MOVE.L A0,EXBSAD(A5) SAVE SEGMENT PHYSICAL START ADDRESS* *ŠMOVERECORDSTOEXTRACTBUFFER* CLR.L D1 CLEAR FOR LATER% MOVE.L EXBSAD(A5),A2 MOVE TO ADDRESS' MOVE.L LRECBA(A5),A0 MOVE FROM ADDRESS. SUB.L #1,D6 GET END OF EXTRACT BUFFER ADDRESS ADD.L A2,D6 . MOVE.L D6,EXBEAD(A5) .:DUPM12‚MOVE.WFMSRECN(A3),D6GETNUMBEROFRECORDSTOMOVE, MOVE.W (A0)+,D4 GET EDIT FILE RECORD LENGTH5DUPM11‚CMP.W#LINEBL,D4ONLYTRANSFERMAXRECORDSIZE& CMP.L EXBEAD(A5),A2 AT END OF BUFFER?" BGE.S DUPM60 BRANCH IF AT THE END$ MOVE.L A2,-(A7) SAVE A2 FOR A WHILE# ADD.L D4,A2 POINT TO END OF RECORD. CMP.L EXBEAD(A5),A2 ROOM FOR COMPLETE RECORD? BGE.S DUPM55 BRANCH IF NOT ROOM MOVE.L (A7)+,A2 RESTORE POINTER BLS.S DUPM15 . MOVE.W #LINEBL,D4 .(DUPM15‚MOVE.WD4,(A2)+SETRECORDLENGTH%DUPM20 MOVE.W (A0)+,(A2)+ MOVE RECORD SUB.W #2,D4 . BGT.S DUPM20 . ADD.L #1,D1 COUNT THIS RECORD% CMP.W #-1,D6 DUPMOVE TO END OF FILE?& BEQ.S DUPM30 YES, GO MOVE NEXT RECORD+ SUB.W #1,D6 MOVED GIVEN NUMBER OF RECORDS? BEQ.S DUPMOK YES, DONE*DUPM30ADD.L#1,D3ŠNO,GOMOVENEXTRECORD BSR GETNRC . BEQ.S DUPM11 .' CMP.B #ISTAEOF,D0 AT END OF EDIT FILE?"DUPMERR BNE FMSRET NO, OTHER ERRORBDUPMOK CMP.L EXBEAD(A5),A2 YES, DONE - ZERO WORD AFTER LAST RECORD, BCC.S DUPMOK1 . UNLESS FILL COMPLETE BUFFER# CLR.W (A2) NOW KNOW END OF RECORDSDUPMOK1BRAFMSOKR†DONE*;*ˆAPPENDRECORDSTOEXISTINGEXTACTBUFFERIFTHEREISROOM*8DUPM40 MOVE.L EXBSAD(A5),A2 EXTRACT BUFFER START ADDRESSDUPM45 CLR.L D4 CLEAR FOR USE" MOVE.W (A2)+,D4 GET RECORD LENG  TH& BEQ.S DUPM70 BRANCH IF END OF RECORDS BTST #0,D4 ODD LENGTH? BEQ.S DUPM50 BRANCH IF NOT ODD# ADD.L #1,A2 ODD-ADD IN FILLER BYTE$DUPM50 ADD.L D4,A2 ADD IN THE LENGTH+ CMP.L EXBEAD(A5),A2 REACHED END OF BUFFER?- BLT DUPM45 BRANCH IF NOT THE END-SEARCH MORE2 MOVE.L #2,D0 SET ERROR CODE FOR NO ROOM IN BUFFER3DUPMERR1 BRA FMSERR GO RETURN WITH FMSTAT ERROR SET,DUPM55 MOVE.L (A7)+,A2 RESTORE STACK POINTER:DUPM60 MOVE.L #1,D0 SET NOT ROOM FOR ALL RECORDS IN BUFFER< MOVE.L D1,FMSREC(A3) SAVE NUMBER OF RECORDS MOVED TO BUFFER BRA DUPMERR1 RETURN1DUPM70 MOVE.L LRECBA(A5),A0 GET MOVE FROM ADDRESS% SUB.L #2,A2 POINT TO MOVE TO ADDRESS CLR.L D1 CLEAR RECORD COUNTER. BRA DUPM12 GO PUT RECORDS INTO EXTRACT BUFFER PAGE*%*Š*************************************ŽDELBCMD1.005/16/80HBN6*%*Š************************************ DELBCMD EQU **.*ŠDELETEEXTRACTBUFFER-ERRORIFNONEEXISTS* BSR.S DELBUF DELETE BUFFER BEQ FMSOKR OK OR NO BUFFER! BRA FMSRET ERROR FROM DEALLOCATE*#*Š***********************************DELBUF1.005/16/80HBN6*#*Š**********************************;*ŠSUBROUTINEDELBUFRELEASESEXTRACTBUFFER,ERRORISGIVEN*•INFMSTATIFNOBUFFEREXISTS*,*–ONRETURN:D0=0IFNOERRORORNOBUFFER*¦ERRORCODEOTHERWISE*¡FMSTAT=-1IFNOBUFFER* DELBUF EQU * CLR.L D0 TST.B BUFFLG(A5) BUFFER EXISTS BNE.S DELBF0 YES! MOVE.B #$FF,FMSTAT(A3) NO, ERROR TST.B D0 RTS>DELBF0LEAEXBSEG(A5),A0‚DELETEBUFFER-PARAMETERBLOCKADDRESS MOVE.L#DESEG,D0‚EXECDIRECTIVE TRAP #1 DEALLOCATE THE BUFFER$ CLR.B BUFFLG(A5) INDICATE NO BUFFER TST.B D0 RTS*#*Š***********************************ŽCHKREC1.005/16/80HBN6*#*Š**********************************A*ŠSUBROUTINECHKRECGETSLRNFROMFMSRECANDCHECKSITEXISTSAND*•ISOK**•ONRETURN:D3=FMSREC * D1=EOFLRN* D0=0IFRECORDOK!*¥ISTARNIFRECORDDOESNOTEXIST*¥ISTAIEIFFMSREC=-1* CHKREC EQU **‡MOVE.LFMSREC(A3),D3GETLRN4‚MOVE.LEOFLRN(A5),D1GETLRNOFLASTRECORDOFFILE& MOVE.L #-1,D0 CHECK FILE IS NOT EMPTY CMP.L D1,D0 .. BEQ.S CHKRNR . IT IS, THEN FMSREC CAN'T EXIST CMP.L D3,D0 LRN CAN'T BE -1 BEQ.S CHKRIE . CMP.L D1,D3 LRN PAST EOF? BHI.S CHKRNR YES, ERROR CLR.L D0 RECORD OK RTS*%CHKRNR MOVE.L #ISTARN+MN,D0 NO RECORD BRA.S CHKRET**CHKRIE MOVE.L #ISTAIE+MN,D0 INTERNAL ERRORCHKRET MOVE.B D0,FMSTAT(A3) RTS PAGE#*Š***********************************ŽEXTRCMD1.005/16/80HBN6*#*Š**********************************4EXTRCMDEQU*„FIRSTCHECKTHATEXTRACTBUFFEREXISTS! MOVE.L #-1,D0 ERROR IF NO BUFFER TST.B BUFFLG(A5) . BNE.S EXTR00 OK/EXTRER BRA FMSERR ERROR - GO SET FMSTAT FROM D0*%*ŠGETRECORDWHEREMUSTINSERTBUFFER*>EXTR00 BSR CHKREC GET LRN OF RECORD INTO D3 AND CHECK IT IS OK BNE EXTRER5 MOVE.B #EFSCHG,FMSEFS(A3) SET FILE STATUS TO CHANGED& MOVE.L #1,D0 DON'T UPDATE LRECRD WHENK BSR POSTLR POSITION TO RECORD SPECIFIED FOR INSERT (INSERT IN FRONT OF IT)EXTRIO‚BNEFMSRETIOERROR*0*ŠINSERT1STRECORDINFRONTOFCURRENTPOSITION* MOVE.W #IOPPRV+IOPASC,D6*:*ŠINSERTEXTRACTBUFFERRECORDS1ATATIMEINTOEDITFILE*, MOVE.L EXBSAD(A5),A1 A1 -> RECORD IN BUFFER5EXTR05 CMP.L EXBEAD(A5),A1 DONE IF PAST END OF BUFFER BCC.S EXTR15 . CLR.L D4 GET RECORD LENGTH* MOVE.W (A1)+,D4 DONE IF RECORD LENGTH = 0 BEQ.S EXTR15 .E MOVE.L A1,A2 INSERT RECORD INTO EDIT FILE, A2 = RECORD START ADDRESS BTST #0,D4 ODD LENGTH RECORD? BEQ.S EXTR10 NO" ADD.L #1,A1 YES, SKIP FILLER BYTE8EXTR10 ADD.L D4,A1 GET A1 ->ING TO NEXT RECORD IN BUFFER MOVE.B EFLUN(A5),D0& BSR WRITLRO WRITE RECORD TO EDIT FILE BNE EXTRIO*/*ŠWRITEANYOTHERRECORDAFTERLASTONEWRITTEN*" ADD.L #1,D3 NEXT LRN IN EDIT FILE2 ADD.L #1,EOFLRN(A5) ADDED ONE RECORD TO EDIT FILE7 ADD.W #1,CHKPCT-DATASG(A5) BUMP NUMBER OF FILE CHANGES%‚MOVE.W#IOPNXT+IOPASC,D6INSERTNEXT BRA E! XTR05**ŠDONE,RETURNPARAMETERS*MOVE.W#'EA',FHSEXT(A2)‚USENEWEXTENSIONTOAVOIDDUPL.NAME* MOVE.W #FHRENM,FHSCMD(A2) RENAME FUNCTIONSAVERR3 FHSCALL (A2) DO IT BNE.S SAVERR4 MOVE.L D1,D0 RESTORE ERROR CODE3 MOVE.W FHSEXT(A2),FMSRECN(A3) RETURN NEW EXTENSIONSVERT RTS RETURN%SAVERR4CMP.B#FSTADNM,D0„DUPL.NAME? BNE SVERT NO, OTHER ERROR,ADD.W#1,FHSEXT(A2)†YES,TRYNEXTEXTENSION BRA SAVERR3*?*ŠJUSTSETRETURNPARAMETERSFOR'SAVED'IFEDITINGOUTPUTFILE*.SAV00‚TST.BEFFLG(A5)OUTPUTFILE=EDITFILE?‚BPLƒSAV35YES*$*ŠSAVESCRATCHFILEINTOOUTPUTFILE*ŠCOPYRECORDBYRECORD* CLR.L D3 D3 = LRN TO COPY NEXT, CLR.L D0 READ FROM EDIT FILE AND SET LRECRD@ BSR POSTLR POSITION TO 1ST RECORD OF EDIT FILE IN SHARED BUFFERBNEƒSAV25ERRORORENDOFFILE BRA.S SAV06 SAV05‚BSRGETNRCGETNEXTRECORD! BNE.S SAV25 ERROR OR END OF FILE'SAV06 CLR.L D6 GET OUTPUT FILE KEY SIZE MOVE.B OUTKYZ(A5),D6 .# CMP.L #MXRECL,D4 RECORD TOO LARGE? BLE.S SAV07 MOVE.L #MXRECL,D4 YES, TRUNCATE+SAV07„MOVE.LD4,D0ƒSAVERECORDLENGTHIND0( MOVE.W OUTRCZ(A5),D4 WRITE AS IS IF VRL BEQ.S SAV15 VRL? SUB.L D6,D4 NOCMP.WD0,D4…FRL-TRUNCATE? BLS.S SAV20 YES MOVE.L D6,D1 NO%ADD.LD4,D1…BLANKPADRESTOFRECORD. SUB.L D0,D1 . D1 = BCT OF REMAINDER OF RECORD LEA RECBUF(A5,D0),A1 .SAV10 MOVE.B D7,(A1)+ . SUB.W #1,D1 . BNE SAV10 .*SAV08ƒLEARECBUF(A5),A1MOVEACTUALRECORD6 MOVE.L A1,A2 . SAVE STARTING RECORD ADDRESS FOR WRITE! TST.B D6 ANY KEY IN OUTPUT FILE? BEQ.S SAV11 NO/ ADD.L D6,D4 YES, ADD KEY LENGTH TO RECORD SIZE# CMP.L #MXRECL,D4 RECORD TOO LARGE? BLE.S SAV09 NO SUB.L #MXRECL,D4 TRUNCATE SUB.L D4,D0 . MOVE.L #MXRECL,D4 .BSAV09 MOVE.B #' ',(A1)+ YES, PUT BLANK KEY FOR DUPLICATE KEY FILES SUB.B #1,D6 . BNE.S SAV09 . TST.W D0 BLE.S SAV21 NO RECORD$SAV11 MOVE.B (A0)+,(A1)+ MOVE RECORD SUB.W #1,D0 . BNE.S SAV11 . BRA.S SAV21 .$SAV15 MOVE.W D0,D4 VRL - WRITE AS IS*SAV20 MOVE.L A0,A2 STARTING RECORD ADDRESS TST.B D6 ANY KEYS FOR OUTPUT5 BNE.S SAV08 YES, GO PUT DUMMY KEY IN FRONT OF RECORD7SAV21MOVE.B‚OSLUN(A5),D0WRITERECORDINTOOUTPUTFILE BSR WRITLR .BNEƒSAVERR1IOERROR ADD.L #1,D3 COPY NEXT RECORD& CMP.L EOFLRN(A5),D3 READ LAST RECORD? BHI.S SAV30 YES, DONE COPYBRAƒSAV05NO,COPYNEXTRECORD*"*ŠENDOFFILE=DONEELSEIOERROR*SAV25‚CMP.B#ISTAEOF,D0DONE?BNEƒSAVERR1NO,ERROR**ŠCLOSEOUTPUTFILE* SAV30 EQU *‹SFHSCOFHCLOS,0,A4CLOSE, MOVE.B OSLUN(A5),FHSLUN(A4) OUTPUT FILE LUN FHSCALL (A4)BNEƒSAVERR1IOERROR?TST.BTEMP(A5)‚REOPEN? BNE.S SAV40 YES**ŠSETRETURNPARAMETERS*:SAV35 CLR.B FMSEFS(A3) SCRATCH FILE = OUTPUT FILE (EFSUCH)! 6 CLR.B FMSOFS(A3) SET SAVE OUTPUT FILE STATUS (OFSSAV)DMOVE.L‚EOFLRN(A5),FMSREC(A3)RETURNLRNOFLASTRECORDINEDITFILE0 CLR.B FMSTAT(A3) GOOD RETURN, SET SAVED OK FLAG CLR.L D0 RTS**‹REOPENOUTPUTFOROVERWRITE*(SAV40 LEA FHSVOL(A4),A1 RESTORE FILENAME LEA OUTFLN(A5),A0 MOVE.L #(FILNML+4)/2,D0SAV45 MOVE.W (A0)+,(A1)+ SUB.W #1,D0 ‚BNE.SSAV45(SFHSCOFHASGN,FOPEREW+FOPOVRT,A4‚REOPEN FHSCALL (A4)BNESAVERRžERROR ƒBRASAV35¢SETRETURNPARAMETERS PAGE**9"M+D3I;6C0K8S&*Š**************************************SRCHCMD1.00‚03/07/80HBN6*&*Š*************************************/*ŠENTRYANDEXITCONDITIONSSAMEASFOROPENCMD**ŠREGISTERUSAGE:*ŠA0->RECORD*ŠA1->STRING*ŠA4->SHAREDBUFFERSTART1*ŠD1=#OFRECORDSTOSCAN,-1=>TOENDOFFILE*ŠD2=OCCURENCECOUNT*ŠD4=STRINGBCT *ŠD5=LRN** SRCHCD EQU **'*ŠPOSITIONATSTARTINGRECORDSPECIFIED*( MOVE.L FMSREC(A3),D5 FIRST RECORD'S LRN MOVE.L D5,IOSRRN(A6) .# CMP.L EOFLRN(A5),D5 RECORD EXISTS? BLS.S SRCH00 YES= MOVE.B #ISTARN,FMSTAT(A3) NO, RETURN RECORD NOT FOUND STATUS BRA FMSOKR SRCH00 EQU *‹SIOSCOIOPOST,IOPREC+IOPRAN,A62 MOVE.B EFLUN(A5),IOSLUN(A6) POSITION IN EDIT FILE IOSCALL (A6) BNE FMSRET IO ERRORA MOVE.L FMSDBE(A5),FMSDBL(A5) END OF BUFFER=LOGICAL END SINCE DON**ŠSCANRECORDTOFINDSTRING*B MOVE.L FMSDBS(A5),A4 GET A4->ING TO START OF RECORD POSITIONED TO> ADD.L IOSLEN(A6),A4 . ADD OFFSET FROM BUFFER START FOR RECORD* MOVE.L FMSADR(A3),A2 GET STRING ADDRESSES MOVE.L (A2)+,A1 . START MOVE.L (A2),D4 . END SUB.L A1,D4 GET STRING LENGTH' BMI FMSER1 . ERROR IF END BEFORE START ADD.L #1,D4 . D4 = STRING BCT CMP.L D6,D4 . STRING TOO LONG?; BHI FMSER1 . YES, MUST NOT BE LONGER THAN LINE BUFFER SIZE/ MOVE.W FMSRECN(A3),D1 GET # OF RECORDS TO SCAN CLR.L D2 GET OCCURENCE COUNT MOVE.B FMSCNT(A3),D2 .(SRCH15 MOVE.L A4,A0 A0 -> RECORD TO SCAN/ MOVE.L D5,LRECRD(A5) SAVE FOR LAST RECORD READ MOVE.L A4,LRECBA(A5) .?SRCH16‚TST.W‰(A0)CHECKARECORDTHEREWITHPROPERLENGTHRANGE BLS FMSER5 . ERROR‡BSRƒSCNRECSCANRECORD' BNE.S SRCH40 STRING NOT FOUND, D0 = -1**ŠFOUNDSTRING,RETURNRECORD* ‚CLR.LD0 ‚CLR.LD26 MOVE.L D5,FMSREC(A3) RETURN LRN OF RECORD WITH STRING, MOVE.L FMSBUF(A3),A1 RECORD MOVE-TO-ADDRESS" MOVE.W (A0)+,D3 GET RECORD LENGTH1SRCH20 MOVE.B (A0)+,D0 MOVE RECORD TO LINE BUFFER BPL.S SRCH30 SPACE COMPRESSED? BCLR #7,D0 YES, EXPAND,SRCH25 ADD.L #1,D2 . COUNT BYTES TRANSFERRED+ CMP.W D6,D2 . ERROR IF TOO MANY CHARACTERS BHI.S SRCHOK ." MOVE.B D7,(A1)+ . EXPAND = SPACES SUB.W #1,D0 BNE SRCH25 BRA.S SRCH35 .*SRCH30 ADD.L #1,D2 COUNT BYTES TRANSFERREDCMP.WD6,D2ƒTOOLONGRECORD? BHI.S SRCHOK YES# MOVE.B D0,(A1)+ NO, MOVE NEXT BYTE$SRCH35SUB.W#1,D3‚ATENDOFRECORD?BNESRCH20ƒNO* *ŠSPACEFILLRESTOFLINEBUFFER* SUB.W D2,D6 ANY ROOM LEFT?SRCH36 BLE.S SRCHOK NO MOVE.B D7,(A1)+ YES, SPACE FILL  SUB.W #1,D6 BRA.S SRCH36SRCHOKBRAFMSOKR†RETURN* STRING NOT FOUND6SRCH55 MOVE.W (A0)+,D0 GET NEXT RECORD POINTER INTO A0 BTST #0,D0 . ODD RECORD BCT?BEQ.SSRCH60‚.NO ADD.W #1,D0 . YES( BEQ.S S" RCHBO . ERROR IF RECORD TOO LONGSRCH60LEA‚(A0,D0),A0.( CMP.L FMSDBE(A5),A0 PAST END OF BUFFER?BHI.SSRCH65ƒYES) TST.W (A0) NO, END OF RECORDS IN BUFFER?) BNE SRCH16 NO, GO SCAN RECORD FOR STRING*7*ŠRUNOUTOFRECORDSINBUFFER,READINNEXTDATABLOCK* SRCH65 EQU *-‡SIOSCOIOREAD,IOPBLK+IOPNXT+IOPIMG+IOPBIN,A6" MOVE.L FMSDBS(A5),A4 BUFFER START* MOVE.L A4,IOSSAD(A6) SET BUFFER ADDRESSES MOVE.L FMSDBE(A5),IOSEAD(A6) . IOSCALL (A6) READ BLOCK IN BEQ SRCH15 IO ERROR? BRA FMSRET YES*4SRCHBRK MOVE.B #1,FMSTAT(A3) SET TERMINATED BY BREAK BRA FMSOKR RETURN‚PAGE*%*Š*************************************SCNREC1.00‚03/07/80HBN6*%*Š************************************3*ŠSUBROUTINESCNRECSEARCHESGIVENRECORDFORGIVEN+*•STRINGBYTRYINGTOMATCHSTRINGSTARTING*•WITHEACHBYTEINTHERECORD*9*ŠONENTRY:A0->RECORD(BCT,DATA)INSHAREDFMSBUFFER*”A1->STRING*”D4=STRINGLENGTH*”D2=N'THOCCURENCEWANTED***ŠONEXIT:ALLREGISTERSUNCHANGEDEXCEPT:&*“D0=0ANDZ=1IFSTRINGFOUND,OR"*˜-1ANDZ=0IFSTRINGNOTFOUND**ŠREGISTERUSAGE:*ŠA0->BYTETOMATCHINRECORD*ŠA1->FIRSTBYTEOFSTRING*ŠA2->BYTETOMATCHINSTRING#*ŠA4->FIRSTBYTEINCURRENTMATCH)*ŠD0.B=TRANSPARENTCHARACTER,0=>NONE(*ŠD1.B=CURRENTBYTEINSTRINGTOMATCH*ŠD2=OCCURENCECOUNT*ŠD3,D4=STRINGBYTECOUNTF*ŠD5=REMAININGRECORDBYTECOUNT(MATCHSTARTINGBCTINFMSREC(.W))*ŠD6=LINEBUFFERSIZEA*ŠD7.B=CURRENTBYTEINRECORDTOMATCH,ORSPACECOUNT(W.B.B-?*‘ACTUALRECORDBCT.STARTINGSPACECOUNT.REMAININGSPACECOUNT)* SCNREC EQU ** *ŠINITIALIZE*,‚MOVEM.LA0-A2/A4/D1-D7,-(A7)SAVEREGISTERS? CLR.B FMSCNT(A3) RETURN BYTE # OF 1ST CHAR OF STRING IN RECORD" MOVE.W (A0)+,D5 GET RECORD LENGTHB MOVE.W D5,FMSREC(A3) . KEEP STARTING RECORD BCT BEFORE EACH MATCH;‚CLR.L†D7‚CLEARRECORDACTUALLENGTH&SETNOCOMPRESSCHAR8 MOVE.B FMSTRANS(A3),D0 GET TRANSPARENT CHARACTER IF ANY0MOVE.LA0,A4ƒSAVESTARTINGMATCHLOCATIONINA4*5*ŠTRYTOMATCHSTRINGWITHCURRENTPOSITIONINRECORD*?SCNR00TST.BD7‚SPOTSTARTSINTHEMIDDLEOFSPACECOMPRESSION?< BNE.S SCNR02 YES, A4 -> SPACE COMPR. CHAR., A0 -> NEXT CHAR5MOVE.LA4,A0‚NO,GETSTARTINGMATCHLOCATIONFROMA4GMOVE.B(A4),D7†GETSTARTINGBYTEANDSEEIFIT'SASPACECOMPRESSCHAR BCLR #7,D7 . BNE.S SCNR01 YES, IT IS& CLR.B D7 NO, IT'S NOT, CLEAR FOR NONE3SCNR01 ROR.W #8,D7 SAVE STARTING SPACE COUNT IF ANY? CLR.B D7 . MAKE SURE D7.B IS ZERO AFTER SWAP 2 LOW ORDER BYTES)SCNR02 MOVE.L A1,A2 RESET START OF STRING MOVE.W D4,D3 AND STRING LENGTH.SCNR05 MOVE.B (A2)+,D1 GET NEXT BYTE IN STRING-SUB.W#1,D3…ONELESSBYTEINSTRINGTOMATCH< TST.B D7 IN THE MIDDLE OF A COMPRESSED CHARACTER IN RECORD?6 BNE.S SCNR10 YES, D7.B CONTAINS REMAINING SPACE COUNT, MOVE.B (A0)+,D7 NO, GET NEXT BYTE IN RECORD- SUB.W #1,D5 ONE LESS BYTE IN RECORD TO MATCH CMP.B D7,D1 CHARACTERS MATCH?? BEQ.S SCNR25 YES, SO FAR SO GOOD, GO MATCH NEXT TWO CHARACTERS. BCLR #7,D7 NO, SPACE COMPRESS SPEC IN RECORD?A BEQ.S SCNR20 NO, STRING DOES NOT MATCH (UNLESS TRANSPARENT CHAR)9SCNR10 CMP.B #' ',D1 YES, FIND SPACES IN STRING TO MATCH? BEQ.S SCNR15 MAYBE* TST.B D0 OR TRANSPARENT CHARACTER WILL DO- BEQ.S SCNR21 . NONE EXISTS - STRING NOT HERE CMP.B D0,D1 .9 BNE.S SCNR22 NOT TRANSPARENT, STRING DOES NOT MATCH HERE!SCNR15 TST.W D3 AT END OF STRING? BEQ.S SCNR40 YES, STRING FOUND! SUB.B #1,D7 NO, END OF COMPRESS?H BEQ.S SCNR25 YES, SO FAR STRING MATCHES, GO COMPARE NEXT TWO CHARACTERSJ MOVE.B (A2)+,D1 NO, CHECK NEXT BYTE IN STRING A SPACE OR TRANSPARENT CHAR/ SUB.W #1,D3 . ONE BYTE LESS TO CHECK IN STRING BRA.S SCNR10*9*ŠCHARACTERSDON'TMATCH,CHECKFORTRANSPARENTCHARACTER**SCNR20 TST.B D0 ANY TRANSPARENT CHARACTER?2SCNR21 BEQ.S SCNR65 NO, STRING DOES NOT MATCH HERE9 CMP.B D0,D1 YES, IS STRING CHARACTER = TRANSPARENT CHAR? SCNR22 BNE.S SCNR65 NO, NO MATCH**ŠSTRINGMATCHESS" OFAR*6SCNR25 CLR.B D7 CLEAR TO INDICATE NO SPACE COMPRESSION TST.W D3 AT END OF STRING? BEQ.S SCNR40 YES, STRING FOUND TST.W D5 NO, AT END OF RECORD?? BNE.S SCNR05 NO, MOVE ONE BYTE IN RECORD TO MATCH STRING AGAIN?SCNR26„SUB.W#1,D2‚REMAINDEROFSTRINGMUSTBESPACESFORMATCH1 BNE.S SCNRNF . OCCURENCE # WOULDN'T MATCH ANYWAY$ SWAP D7 D7.W = RECORD LENGTH SO FAR< SUB.W D7,D6 GET # OF SPACES IN RECORD TO END OF LINE BUFFER BLS.S SCNRNF . NO SPACES LEFTB CMP.W D6,D3 . MORE CHARACTERS LEFT IN STRING THAN IN LINE BUFFER? BHI.S SCNRNF . YES, NO MATCH6SCNR30 MOVE.B (A2)+,D1 . TEST REST OF STRING IS SPACES CMP.B #' ',D1 . BEQ.S SCNR35 . SPACE0 TST.B D0 . ALSO A TRANSPARENT CHARACTER WILL DO BEQ.S SCNRNF . NO MATCH CMP.B D0,D1 . BNE.S SCNRNF . NO MATCHSCNR35SUB.W#1,D3ƒSOFAROK BNE SCNR306 BRA.S SCNRSF STRING FOUND AND OCCURENCE COUNT MATCHES*-*ŠSTRINGFOUND,ISTHISTHEOCCURENCEWANTED?*,SCNR40SUB.W#1,D2ˆTRYTOFINDSTRINGAGAIN? BNE.S SCNR50 YES+SCNRSF CLR.L D0 NO, STRING FOUND, SET FLAGS5SCNRETMOVEM.L(A7)+,D1-D7/A0-A2/A4‚RESTOREREGISTERS RTS*:*ŠSTRINGMATCHES,BUTOCCURENCEDOESN'T,FINDSTRINGAGAIN*DSCNR50 SWAP D7 MOVE TO SCAN RECORD AFTER SPOT WHERE STRING WAS FOUND6 ADD.W D4,D7 ADD STRING LENGTH TO ACTUAL RECORD LENGTH SWAP D7 .? ADD.B D4,FMSCNT(A3) MOVE STRING STARTING BYTE # IN RECORD ALSO* MOVE.W D5,FMSREC(A3) REMAINING RECORD BCT6 SUB.B #1,D7 ENDED IN THE MIDDLE OF SPACE COMPRESSION?< MOVE.B D7,D1 . SAVE FOR STARTING SPACE COUNT FOR NEXT MATCH ROR.W #8,D7 . MOVE.B D1,D7 . BGT.S SCNR60 YESB CLR.W D7 NO, SET NO SPACE COMPRESSION IN STARTING MATCH CHARACTER MOVE.L A0,A4 START AT NEXT BYTE BRA.S SCNR62ASCNR60 MOVE.L A0,A4 SET STARTING MATCH SPOT AT COMPRESS CHARACTER SUB.L #1,A4 .C*ADD.W #1,FMSREC(A3) REMAINING REC BCT TO INCLUDE SPACE COMPR. CHAR-SCNR62 MOVE.W FMSREC(A3),D5 AT END OF RECORD?BNEƒSCNR00NO,TRYAGAIN, MOVE.W D4,D3 YES, GO SEE IF STRING IS BLANK MOVE.L A1,A2 . BRA SCNR26 .*1SCNRNF MOVE.L #-1,D0 YES, RETURN STRING NOT FOUND BRA.S SCNRET*C*ŠSTRINGDOESNOTMATCH,MOVETONEXTBYTEINRECORDFORNEXTMATCH*3SCNR65 ADD.L #$10000,D7 ADD TO ACTUAL RECORD LENGTH: ADD.B #1,FMSCNT(A3) MOVE STRING STARTING BYTE # IN RECORD7 ROR.W #8,D7 LAST MATCH STARTED WITH SPACE COMPRESSION? SUB.B #1,D7 .; BGT.S SCNR75 YES, CONTINUE WITH ONE LESS SPACE IF ANY LEFT9 ADD.L #1,A4 NO SPACE COMPRESSION, JUST MOVE TO NEXT BYTE SUB.W #1,FMSREC(A3) .'‡CLR.WD7INDICATENOSPACECOMPRESSION& BRA.S SCNR62 CONTINUE WITH NEXT MATCH>SCNR75 MOVE.B D7,D1 SAVE REMAINING SPACE COUNT FOR NEXT SEARCH‚ROR.W#8,D7./ MOVE.B D1,D7 AND KEEP FOR STARTING SPACE COUNT4 MOVE.L A4,A0 SET A0 -> TO BYTE AFTER SPACE COMPRESS ADD.L #1,A0 .& BRA.S SCNR62 CONTINUE WITH NEXT MATCH END EDITSTRTéééé# ééé=/* =/*†FREE.AF=/*'=/* Chain file to assemble FREE utility=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to FREE.LS=/*=/IFC \1 ƒ=ARGFREE.LS=/ENDIF=/*=ASM FREE.SA,FREE.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDéééééé[=/* =/*†FREE.LF=/*%=/* Link chain file to create FREE.LO=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to FREE.LL=/*=/IFC \1 ƒ=ARGFREE.LL=/ENDIF=/*=LINK ,FREE.LO,\1;AHMIX ATTRIBUTES PSEG SEG0:0-14 $0 INPUT FREE.ROLIB 0.&.UTILIB.ROEND=/*=ENDéé# ééééd#FREE…IDNT†4,1‡VERSAdosFREEutility…LIST „LLEN120<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**’FREE…MODIFICATIONHISTORY**ˆREVISIONCODE‡01118547*’FREEwaschangedtocomparethelengthofthesegment4*’itobtainedfromtheGETSEGcallwiththevalueit4*’requested.‚Ifitgotmorememory(likeonaVME120-*’system)itwillonlyusewhatitrequested.**ˆREVISIONCODE‡1220844*6*’FREEismodifiedtoforcepositionindependentcode.**ˆREVISIONCODE‡0309844*6*’FREEismodifiedtoreadthenumberofVERSAdosdisk8*’sectorsfromtheconfigurationtableonthedisk.‚This8*’assuresthatthecomputationofthepercentageoffree8*’sectorswillbecorrectforthevariousconfigurations3*’allowableontheVME/10.‚Ifanolddiskwithouta9*’configurationtableisused,thenumberofsectorswill:*’stillbeobtainedfromtheconfigurationSYSGENedonthe*’drive.¢PeggyHassett*;**************************************************************‰PROGRAMNAMEISƒFREE‚.LO***ˆ***‡FREECOMMANDƒ******,*ˆTHISCOMMANDISUSEDTODISPLAYTHENUMBER)*ˆOFAVAILABLEPAGES(256BYTESEGEMENTS)*ˆANDTHELARGESTCONTIGUOUS**ˆNUMBEROFAVAILABLEPAGESONTHEDISKOR*ˆDISKETTEVOLUME*!*ˆREGISTERSUSED:01234567*’D…********’A…*********=*************************************************************=*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‰PAGE=**************************************************************ˆINCLUDESOFSYSTEMFILES*ˆINCLUDETR1RTCD.EQ *ˆINCLUDEƒFME *ˆINCLUDEƒIOE *ˆINCLUDEƒTR1=*************************************************************‰NOLIST‰INCLUDEƒ9995.&.TR1RTCD.EQ‰INCLUDEƒ9995.&.FME.EQ‰INCLUDEƒ9995.&.IOE.EQ‰INCLUDEƒ9995.&.TR1.EQ‰LIST‰PAGE(*ˆDATASEGMENT***‚FREE‚COMMANDƒ******ˆ****‚EQUATEAREA‚******* BEGDATA‚EQU0#STKLENƒEQU25‹STACKLENGTHINWORDS)BUFSIZE‚EQU160‰INPUTCOMMANDBUFFERSIZE DSKLU„EQU1 mGvU~G†^ŽS–\žG¦8®4¶Z¾RÆKÎNÖOÞEæ!LISTLUƒEQU3‹LISTINGLOGICALUNITTSKNAMƒEQU'FREE'†MYTASKNAME* ‰SECTIONƒ0‰XREFƒEDITFILE,PARSE,OPTION‰PAGE;**************************************************************ˆ***ƒDATAAREA‚*****:*********************************************************** PBA†EQU‡**&REVIS„DC.B†'011185'‚DATELASTMODIFIED(‰DC.B†''‡BLANKINDICATESCLEANASSEMBLY‰DC.B†'4'‡MAJORREVISIONNUMBER** ‰DS.WSTKLEN PROGSTK‚EQU**‰DC.L08*+++++++++++++++++++++++++++++++++++++++$ ++++++++++++++++*,*ˆ***ƒBUFFINISTHEAREATHECOMMANDLINEIS.*ˆ***ƒREADINTOWHENTHISPROGRAMISCALLEDIN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*5*******************************************************BUFFINƒCOMLINEBUFSIZE‚***‚INPUTBUFFER‚***5******************************************************+*ˆ**‚IOSPARAMETERTABLEFORDISKREADS‚***6*ˆ**‚REFERTOIOSEQUATESUNDERIOSPARAMETERBLOCK‚***5******************************************************‰DS.W02‰IOS.DSKIOREAD,IOPWAT+IOPRAN+IOPIMG,DSKLU,0,0,0,0**"***********************************8*ˆFHSPARAMETERTABLEFORCHANGELOGICALUNITASSIGNMENT6*ˆCHANGEISFROM6TO3--SENDSOURCEISLUAINMASK*ˆANDRECEIVEISLUBINMASK3*ˆLU3ISUSEDFORLISTINGANDLU6FORERRORLOGGING**4*ˆPARAMETERTABLEFORCHANGELOGICALUNITASSIGNMENT,*ˆISDIFFERENTFROMSTANDARDPARAMETERTABLE*%************************************** LU3AFHSƒEQU*'‰DC.WFHCHLU„COMMAND(CHANGELUASSIGN)‰DC.WFOPKEP…OPTIONKEEPASSIGN‰DC.B0ŠSTATUS‰DC.BLDFLUNŠSENDLUNUMBER‰DC.BLISTLUŠRECEIVELUNUM‰DC.B0ŠRESERVED&‰DC.L0ŠTASK-ID(0MEANSUSEYOURSELF)(‰DC.L0ŠSESSION#(0MEANSUSEYOURSELF)*‰DS.W0**!***********************************ˆSETUPIOSFORLISTINGLU3*‹IOSPARMTABLE*!**********************************/‰IOS.OUT3IOWRIT,IOPASC+IOPFOR+IOPWAT,3,0,0,0,0**)******************************************?*ˆLU3FHSISPARMTABLEFORLU3WHICHISUSEDFOROUTPUTLISTING*********************************************‰FHS.LU30,0,LISTLU,0,0,0,0,0**#************************************ *ˆBUILDPARMBLOCKTOASSIGNVOL*#************************************!‰FHS.VOLFHASGN,0,DSKLU,0,0,0,0,0‰PAGEJ****************************************************************************’ERRORMESSAGEPARAMETERBLOCK*J**************************************************************************EM_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)4EM_SPA:‚DC.L‚0‚STARTADDRESSFORUSERTEXTPLUGPOOL2EM_EPA:‚DC.L‚0‚ENDƒADDRESSFORUSERTEXTPLUGPOOL*9**********************************************************(*ˆ***ƒPARAMETERBLOCKTOGETSEGMENTƒ***%*ˆ***ƒFORBUFFERTOREADSATINTO†****9**********************************************************!SEGPBLK‚DC.L†0‰TASKNAME(USEME)‰DC.L†0‰SESSION#(USEME)#‰DC.W†1<<13+1<<9‚DIRECTIVEOPTIONS:*¨USEPHYSICALADDRESS;*¨WILLTAKELESSTHANREQUESTED‰DC.W†0‰SEGMENTATTRIBUTES‰DC.L†'BUFF'„SEGMENTNAME+SEGSADƒDC.L†0‰RECEIVESPHYSADDROFSEGMENT-SEGLENƒDC.L†0‰RECEIVESSEGMENTLENGTH(BYTES)**‰MOVE.L„FHSSIZ(A6),VOLSECTS-PBA(A4)SAVETHENUMBEROFSECTORS*°INTHEVOLUME**‰RTSŽ.RETURNFROMROUTINE‰PAGEF***********************************************************************9*ˆROUTINETOREADTHEVIDOFTHESPECIFIEDVOLUME,LOCATE4*ˆTHESAT,ANDSETUPABUFFERTOREADTHESATINTO.*F************************************************************************ GETVIDƒEQU**F************************************************************************ˆSETUPFORRANDOMREADOFVID*F***********************************************************************(‰LEA‡DSKIOS(PC),A2‡ADDROFIOSREADPARM***ˆLEA‡VIDDA,A0ŒRANDOMRECORDNUMBERŽ1217845‰MOVE.L„#VIDDA,IOSRRN(A2)ƒRANDOMRECORDNUMBERŽ121784*‰LEA‡SECBUF(PC),A0‡BUFFERSTARTINGADDRESS‰MOVE.L„A0,IOSSAD(A2))‰LEA‡SECBUFE(PC),A0†BUFFERENDINGƒADDRESS‰MOVE.L„A0,IOSEAD(A2)*F************************************************************************ˆRANDOMREADOFVID*F***********************************************************************‰IOSCALLDSKIOS(PC) ‰BNE‡FATALERR* ‰LEASECBUF(PC),A3•LOADBUFADDR*D‰MOVE.L„VIDCAS(A3),CASSEC-PBA(A4)SAVECFGASTARTINGSECTOR#030984;‰MOVE.L„VIDSAT(A3),SATSSEC-PBA(A4)‚SAVESATSTARTINGSECTOR * ‰CLR.L…D0–SAVESATENDINGƒSECTOR-‰MOVE.W„VIDSAL(A3),D0Ž=SATLENGTHINSECTORS*‰ADD.L…VIDSAT(A3),D0+SATSTARTINGSECTOR‰SUB.L…#1,D0˜-1‰MOVE.L„D0,SATESEC-PBA(A4)*F***************************************************************************ƒSETUPBUFFERFORSATƒ****F***********************************************************************?*ˆATTEMPTTOALLOCATEABUFFERSEGMENTLARGEENOUGHTOHOLDTHE=*ˆENTIRESATFORTHEASSIGNEDVOLUME.‚IFNOTENOUGHMEMORYIS:*ˆAVAILABLE,GTSEGWILLGETASMUCHASPOSSIBLE.‚MEMORYIS;*ˆALLOCATEDINCHUNKSOF256BYTES.‚IFWEAREN'TGIVENANY,;*ˆJUSTUSETHEVIDSECTORBUFFER(WHICHIS256BYTESLONG).*'‰CLR.L…D0’CALCULATETHENUMBEROFBYTES3‰MOVE.W„VIDSAL(A3),D0‡INTHESATBYMULTIPLYINGTHE+‰ASL.L…#8,D0NUMBEROFSECTORSBY256.‚THEN8‰MOVE.L„D0,SEGLEN-PBA(A4)ƒPUTITINTHEPARAMETER% BLOCK.*"‰ERQ.GTSEGSEGPBLKBEGFORMEMORY.*.*‘***‚A0=ADDRESS,A1=LENGTHOFSEGMENT‚*****¦WASTHEREANERROR?‰IF‚‚THEN.S5ŒCMP.W‚#RTCDNMEM,D0ƒIFIT'SANYTHINGBUT'NOMEMORY',,ŒBNE„FATALERR‡LETTHEERRORHANDLERHAVEIT.*0ŒLEA„SECBUF(PC),A0†THEERRORWAS'NOMEMORY',SO/ŒMOVE.L#256,A1ˆDUMMYINTHEVIDSECTORBUFFER.ŒENDI* *‘***‚SAVETHENEEDEDVALUES‚****8‰CMP.L…SEGLEN-PBA(A4),A1ƒGETMORETHANREQUESTED?011185,‰BLE.S…GETVID1NO,USERETURNEDVALUEƒ011185;‰MOVE.L„SEGLEN-PBA(A4),A1ƒYES,USEONLYWHATSNEEDED0111859GETVID1‚MOVE.L„A0,SEGSAD-PBA(A4)ƒSEGMENTSTARTINGADDRESS1‰MOVE.L„A1,SEGLEN-PBA(A4)ƒSEGMENTLENGTHINBYTES,‰LEA‡-1(A0,A1.L),A0†SEGMENTENDINGADDRESS=-‰MOVE.L„A0,SEGEAD-PBA(A4)„SEGSAD+SEGLEN-1*-‰MOVE.L„A1,D0CALCULATETHENUMBEROFSECTORS,‰ASR.L…#8,D0BYDIVIDINGTHELENGTHINBYTES7‰MOVE.L„D0,SEGSECTS-PBA(A4)BY256(SHIFTRIGHT8BITS)*-*’***‚NOWTELLIOSPARAMBLKABOUTBUFFER‚****‰LEA‡DSKIOS(PC),A2!‰MOVE.L„SEGSAD-PBA(A4),IOSSAD(A2)!‰MOVE.L„SEGEAD-PBA(A4),IOSEAD(A2)* ‰RTSŒ.RETURN‰PAGED*********************************************************************>*ˆTHISROUTINE,ADDEDON030984,READSTHECONFIGURATIONTABLE<*ˆFROMTHEDISKINTOTHESECTORBUFFERINMEMORY(DESTROYING9*ˆTHEVIDINFORMATIONINTHATBUFFERINTHEPROCESS).‚THE?*ˆTOTALNUMBEROFVERSADOSSECTORSONTHEDISKISOBTAINEDFROM>*ˆTHECONFIGURATIONTABLETOBEUSEDLATERFORTHECALCULATION*ˆOFTHE%OFFREESECTORS.** GETCFGA‚EQU‡**F*********************************************************************** *ˆSETUPFORRANDOMREADOFCFGA*G************************************************************************/‰LEA‡DSKIOS(PC),A2‡ADDROFIOSREADPARM‹O30984.‰MOVE.L„CASSEC,A0‹SECTORNUMBEROFCFGA‹030984/‰CMP‡#0,A0IFCFGADOESN'TEXIST,SECTORƒ030984 ‰BEQ.S…ENDCFGANUMBER=0–030984<‰MOVE.L„A0,IOSRRN(A2)‡PARMBLK<==RANDOMRECORDNUMBER0309841‰LEA‡SECBUF(PC),A0‡BUFFERSTARTINGADDRESS‰0309846‰MOVE.L„A0,IOSSAD(A2)‡PARMBLK<==BUFSTARTADDR‡0309840‰LEA‡SECBUFE(PC),A0†BUFFERENDINGADDRESS‹0309845‰MOVE.L„A0,IOSEAD(A2)‡PARMBLK<==BUFENDADDRˆ030984*I***************************************************************************ˆRANDOMREADOFCFGA*J***************************************************************************0‰IOSCALLƒDSKIOS(PC)ŠREADCFGAINTOBUFFER‹030984‰BNE‡FATALERR¬030984**‰LEA‡SECBUF(PC),A3‡LOADBUFFERADDR030984@‰MOVE.L„IOSRSZ(A3),VOLSECTS-PBA(A4)#SECTORSINCFGATBLƒ030984ENDCFGA‚RTS›.RETURN™030984*‰PAGED*********************************************************************=*ˆROUTINETOCOUNTUNALLOCATEDSECTORSBYCHECKINGFOR0BITS9*ˆINTHESAT.‚NOTICETHATWEARECHECKINGALLTHESECTORS<*ˆINTHESATAREAONTHEVOLUME.‚NOTALLTHEBITSINTHESAT=*ˆAREAACTUALLYREPRESENTSECTORS(E.G.IFTHEREARE900SEC-:*ˆTORS,THEREISSTILLA256-BYTE=2048-BITSAT),BUTTHOSE;*ˆBITS(ATTHEENDOFTHESAT)NOTREPRESENTINGSECTORSARE:*ˆSETTO1(ALLOCATED).‚HENCE,EVENTHOUGHWELOOKTHROUGH<*ˆTHEMWENEVERFINDANYTHING.‚ITISVITALTOUSETHEACTUAL;*ˆNUMBEROFSECTORS(ANDNOTTHEBITSINTHESAT)TOCALCU- *ˆLATETHE%ALLOCATED,HOWEVER!*D*********************************************************************‰OPT‡BRS*3*’THISMACROISCALLEDWHENEVERANALLOCATEDSECTOR4*’ISFOUNDINTHESAT.‚IFTHISISTHEENDOFABLOCK5*’OFFREESECTORS(D6>0),ITCALLSTHEROUTINETO+*’UPDATETHELARGESTCONTIGUOUSFREEBLOCK.*UPDATE_CONT_SECTƒMACRO “TST.L…D6 “IF‚‚THEN •BSR…CONTSET•ENDI“ENDM** BLDSIZE‚EQU*6‰CLR.LD4†HOLDSSIZEOFLARGESTCONTIGUOUSFREEBLOCK.6‰CLR.LD6†HOLDSSIZEOFCURRENTCONTIGUOUSFREEBLOCK.#‰CLR.LD7†HOLDSTOTALFREESECTORS.*B‰FOR.LA6=SATSSEC-PBA(A4)TOSATESEC-PBA(A4)BYSEGSECTS-PBA(A4)‘DO*+*Œ***READFROMSATINTOBUFFERSEGMENT****‹LEA…DSKIOS(PC),A2:‹MOVE.L‚SEGSECTS-PBA(A4),D5CHECKTOSEEIFTHISREA& DWILL-‹ADD.LƒA6,D5TAKEUSPASTTHEENDOFTHESAT. ‹SUB.Lƒ#1,D5‹SUB.LƒSATESEC-PBA(A4),D5-‹IFTHENIFSO,THENMULTIPLYTHENUMBER+ASL.L#8,D5OFSECTORSPASTBY256ANDCUT4SUB.LD5,IOSEAD(A2)‡THEBUFFERBACKTOFITTHESAT.ENDI*4‹MOVE.L‚A6,IOSRRN(A2)‡LOADTHESECTORNUMBERANDGET ‹IOSCALLDSKIOS(PC)ŠABUFFERFUL.‹BNE.LƒFATALERR*<‹MOVE.L‚SEGSAD-PBA(A4),A3ƒA3ISSTARTOFSATSEGMENTBUFFER..‹MOVE.L‚SEGEAD-PBA(A4),A5ƒA5ISENDOFBUFFER.*4*Œ***EXTRACTWORDSONEATATIMEANDANALYZETO***.*Œ***UPDATEHOLDCONT&HOLDTOT‚(D6&D7).†****‹REPEAT,MOVE.L(A3)+,D1‹GETAWORDFROMTHEBUFFER.!*¦IFALL32SECTORSALLOCATED....IF.LƒD1#$FFFFFFFF‚THENUPDATE_CONT_SECTELSE*&****CHECKEACHBYTEINDIVIDUALLY****%MOVE.Lƒ#3,D3Š(FORD3=#3DOWNTO#0)-FORD3ŒROL.L‚#8,D1ŠPUTTHEBYTEINLOW8BITS. *¦IFALL8SECTORSALLOCATED....‘IF.B‚D1#$FF‚THEN“UPDATE_CONT_SECT‘ELSE#“TST.B‚D1‹IFALL8SECTORSFREE.... “IF‚‚THEN •ADD.L‚#8,D6“ELSE*%*–***CHECKEACHBITINDIVIDUALLY****%•MOVE.L‚#7,D5Ž(FORD5=#7DOWNTO#0)(FORD5’BTST‚D5,D1ŽIFTHISSECTORFREE.... —IF‚‚THEN ™ADD.L‚#1,D6—ELSE™UPDATE_CONT_SECT™ENDI—DBF‚D5,FORD5Œ(ENDFOND5)**•ENDI“ENDI‘DBF‚D3,FORD3’(ENDFOND3)**ENDIUNTIL.L‚A3A5** ‹ENDF(A6)**‰UPDATE_CONT_SECT2‰MOVE.L„D4,HOLDCONT-PBA(A4)‡SAVELARGESTBLOCKAND1‰MOVE.L„D7,HOLDTOT-PBA(A4)ˆTOTALFORLATERPRINT.*‰OPT‡BRL* ‰RTS.RETURN‰PAGEA******************************************************************.*ˆCHECKANDSAVECONTIGUOUSSIZEIFNECESSARY.*ˆALWAYSRESETREGD6.*A****************************************************************** CONTSET‚EQU*+‰ADD.L…D6,D7‘UPDATETHETOTALFREESECTORS.:‰IF.L‚D6D4‚THEN.SˆIFTHISCONTIGUOUSBLOCKISBIGGER+‹MOVE.L‚D6,D4‘THANTHEOTHERS,REMEMBERIT.‹ENDI+‰CLR.L‚D6—RESETD6(SIZEOFCURRENTBLOCK).* ‰RTS.RETURN‰PAGE*.***********************************************#*ˆ**BUILDDIRECTORYPRINTLINES‚***.***********************************************BUILDLIN EQU **********************************************!*ˆPRINTFIRSTLINEWITHVOLUMEID*********************************************3‰LEA‡VOLMSG(PC),A0‹LOADEXTENTOFVOLUMEIDMESSAGE+‰LEA‡VOLMSGE(PC),A1ŠANDCALLPRINTROUTINE. ‰BSR‡PRINTLIN**)*******************************************CONVERT TOTAL TO ASCII*)******************************************‰MOVE.LHOLDTOT-PBA(A4),D0‰MOVE.L#8,D1„SIZE3‰LEAPRTL1D(PC),A0‚WHERETODEPOSITCONVERDEDVALUE'‰BSRBINDECFJ„GOTOCONVTODECROUTINE*,‰MOVE.LHOLDTOT-PBA(A4),D0‚INITFORHEXCONV ‰LEAPRTL1H(PC),A0†RECEIVEFIELD‰BSRBHLCVT†GOTOCONVROUTINE*-‰LEA‡PRTL1(PC),A0ŒLOADEXTENTOF'TOTAL'LINE*‰LEA‡PRTL1E(PC),A1‹ANDCALLPRINTROUTINE.‰BSR.S…PRINTLIN**#************************************ *ˆSETUPLARGESTCONTIGUOUSLINE*#************************************'‰MOVE.LHOLDCONT-PBA(A4),D0‚AMTTOCONV‰MOVE.L#8,D1„SIZE#‰LEAPRTL2D(PC),A0‚WHERETODEPOSIT ‰BSRBINDECFJ*-‰MOVE.LHOLDCONT-PBA(A4),D0‚INITBINARYVALUE‰LEAPRTL2H(PC),A0†LOADRECEIVE‰BSRBHLCVT†GOTOCONVROUTINE*2‰LEA‡PRTL2(PC),A0ŒLOADEXTENTOF'CONTIGUOUS'LINE*‰LEA‡PRTL2E(PC),A1‹ANDCALLPRINTROUTINE.‰BSR.S…PRINTLIN**2****************************************************ˆSETUP'%AVAILABLE'LINE*2***************************************************3*’Preparetoprintthe%ofsectorsavailable.‚What)*’wereallywantistheroundedresultof4*”TOTALAVAILABLESECTORS/TOTALSECTORSINVOLUME.3*’Inordertocalculateapercentage,wewouldneed5*’tomultiplythenumeratorby100.‚Sincewewantthe5*’resultrounded,multiplyby200insteadandusethe7*’loworderbitoftheresultofthedivisiontoround.*8‰MOVE.L„HOLDTOT-PBA(A4),D1ƒGETTOTALAVAILABLESECTORS&4‰MOVE.L„VOLSECTS& -PBA(A4),D0‚TOTALSECTORSINVOLUME.*‰WHILE.LƒD0#$FFFF‚OR.L“D1#$FFFF‚DO.S+ŒASR.L…#1,D0MULUREQUIRESTHATD1FITINTO,ŒASR.L…#1,D116BITS,ANDDIVUREQUIRESTHAT$ŒENDWšD0FITINTO16BITS.‚IFEITHER *§ISTOOLARGE,DIVIDEBOTHBY2!*§(APPROXIMATELY)UNTILTHEYFIT.* ‰MULU†#200,D1&‰DIVU†D0,D1DOTHEDIVISIONANDROUND. ‰ASR.W…#1,D1‰IFƒ‚THEN.S ŒADD.W…#1,D1ŒENDI**‰CLR.L…D0’CONVERTTHEANSWERTODECIMALIN‰MOVE.W„D1,D0THEPRINTLINE. ‰MOVE.L„#3,D1‰LEA‡PRTL3D(PC),A0 ‰BSR‡BINDECFJ*/‰LEA‡PRTL3(PC),A0ŒLOADEXTENTOF'%AVAIL'LINE*‰LEA‡PRTL3E(PC),A1‹ANDCALLPRINTROUTINE.‰BSR.S…PRINTLIN**‰RTS.RETURNTODRIVER**2****************************************************ˆPRINTLINESUBROUTINE*2*************************************************** PRINTLIN:8‰MOVE.L„A0,OUT3IOS+IOSSAD-PBA(A4)…MOVEEXTENTOFLINETO6‰MOVE.L„A1,OUT3IOS+IOSEAD-PBA(A4)…I/OPARAMETERBLOCK.*‰IOSCALLƒOUT3IOS(PC) ‰BNE‡FATALERR* ‰RTS‡.RETURN‰PAGE-**********************************************.*ˆROUTINETOASSIGNLOGICALUNIT3TOTERMINAL+*ˆBYSETTINGITUPTHESAMEASLU6WHICHIS"*ˆALREADYASSIGNEDTOTHETERMINAL*.***********************************************SETLU3:‰FHSCALLƒLU3AFHS(PC) ‰BNE‡FATALERR* ‰RTSŒ.RETURN‰PAGE8*********************************************************=***‚ROUTINETODIRECTOUTPUTTOSOMETHINGOTHERTHANTERMINAL*9********************************************************** NEWOUTƒEQU**,‰LEALU3FHS(PC),A6ƒLU3PARMTABLEADDRTOA6A‰MOVE.B#0,FHSWCD(A6)LOADWRITEPASSWORD(USERCANALWAYSWRITE)?‰MOVE.B#$FF,FHSRCD(A6)‚LOADREADPASSWORD(ONLYUSERCANREAD)3‰MOVE.WUSERNUM-PBA(A4),FHSUSN(A6)‚DEFAULTUSERNUM-‰MOVE.LVOLNAM-PBA(A4),FHSVOL(A6)‚VOLUMENAME0‰MOVE.LCATNAM-PBA(A4),FHSCLG(A6)‚CATALOGUENAME%‰MOVE.LCATNAM+4-PBA(A4),FHSCLG+4(A6)‰MOVE.W#'LS',FHSEXT(A6)'‰MOVE.LA1,A0‡A1HADADDROFSCANSTART*)******************************************&*ˆSETUPA0WITHADDROFSTARTOFSCAN'*ˆSETUPA6WITHADDROFFHSPARMBLOCK*‰CALLEDITFILEROUTINE****)****************************************** ‰BSR‡EDITFILE ‰TST.L…D0‰BMI.S…PINVALER*#‰BTST†#1,D0…CHECKTOSEEWHETHEROR#‰BEQ.S…NOTDEV„NOTTHISISADEVICE.*)*******************************************ˆ****ƒASSIGNLOGICALUNIT3*'****************************************-‰MOVE.W#FHASGN,FHSCMD(A6)‚SETASSIGNCOMMAND4‰MOVE.W#FOPEW,FHSOPT(A6)‚SETEXCLUSIVEWRITEOPTION ‰FHSCALL(A6)‰BNE.S…FATALERR*!NEWOUTE‚RTSŒ.RETURNFROMROUTINE****)******************************************"*ˆ**‚OUTPUTISAFILENOTADEVICE.*ˆ**‚A6CONTAINSADDROFOUTPUTFHSPARMBLOCK*)******************************************NOTDEV:%‰TST.B…D0ˆIFFAMILYINDICATORISSET,!‰BNE.S…PINVALER‚THATISANERROR.*4‰MOVE.W#FHALLO+FHASGN,FHSCMD(A6)‚SETALLOC&ASSIGN**Š***‚OPTIONSSET*'‰MOVE.W#FOPEW+FOPEND+FOPSEQ,FHSOPT(A6)+‰CLR.WFHSLRL(A6)‚SETLOGICRECLENGTHTO0&‰MOVE.L#0,FHSSIZ(A6)‚SIZECODE=ZERO*"NOTDEV1‚FHSCALL(A6)‡MAKEFHSCALL ‰BEQNEWOUTE‰CMP.B#5,D0‰DUP‰BNE.SFATALERR‰MOVE.W#FHASGN,(A6) ‰BRANOTDEV1‰PAGEJ****************************************************************************ˆPRINT'INVALIDENTRY'ERROR*J*************************************************************************** PINVALER:*‰MOVE.L„#EM_NVE,D0ŠSETERRORMESSAGECODE.***J***************************************************************************2*ˆROUTINETOCALLERRORMESSAGEHANDLER,THENDIE.*J*************************************************************************** FATALERR:#‰MOVE.L„#6,D1OUTPUTERRORTOLU6.‰BSR.S…C_EM_PGM+‰ERQ.TERM‚#0,#$C000‹EXITWITHERRORSTATUS.***M*******************************************************************************’CALLTOERRORMESSAGEHAND' LER**ˆCALL†BSR‡C_EM_PGM*2*ˆINPUTS„D1=USERLOGICALUNITNUMBERFOROUTPUT.#*’D0ANDA0SETBYIOSORFHSCALL.*"*ˆOUTPUTSƒNOREGISTERPRESERVATION*N******************************************************************************* C_EM_PGM:C‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A4)ƒSAVED0,A0INERRORMSGPARAMBLOCK.4‰LEA‡EM_PBLK(PC),A0ŠPOINTA0TOTHEPARAMETERBLOCK.5‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)‚SETTHELUFOROUTPUT. ‰MOVE.L„#2,D0‰TRAP†#4‰RTS‰PAGE.***********************************************%*ˆCONVERTBINARYTOHEXASCIIROUTINE*(*ˆRIGHTJUSTIFY&BLANKFILLONTHELEFT,*ˆTHELEASTSIGNIFICANTDIGITISNOTBLANKED* *ˆD0=HEXVALUETOBECONVERTED *ˆD1=LENGTHOFRECEIVINGFIELD7*ˆA0=ADDRESSOFLEFTMOSTPOSITIONOFRECEIVINGFIELD* *ˆREGISTERSUSED‚01234567 *’A…*** *’D…**ƒ*.***********************************************(BINASCƒDC.B'0123456789ABCDEF'‚HEXTABLE BINHEXƒEQU*‰LEABINASC(PC),A1ƒINITADDR‰LEA0(A0,D1),A2‚ENDLOCATION*BINLOPƒMOVE.BD0,D3„GETBYTE%‰ASR.L#4,D0†SHIFTOFFLASTHEXVALUE!‰AND.L#$F,D3„MASKOFFOTHERBITS2‰MOVE.B0(A1,D3),-(A2)‚MOVEFROMTABLETORECAREA‰CMP.LA2,A0…AREWEDONE‰BLTBINLOP†NO*‰CMP.W#1,D1…ONLYONECHAR‰BEQ.SBINOUT„YES*ˆDOZEROSUPPRESSION*‰LEA0(A0,D1),A2‚INITENDLOC‰SUB.L#1,A2…FIXENDLOC!BINSP„CMP.B#'0',(A0)‚ASCIIZERO?‰BNE.SBINOUT†NOGETOUT%‰MOVE.B#'',(A0)+‚REPLACEWITHBLANK‰CMP.LA0,A2…AREWEDONE ‰BGTBINSP‡NO**BINOUTƒRTS.RETURN‰PAGE-*********************************************+*‚32BITBINARYTODECIMALASCIISUBROUTINE-**********************************************,*‚CONVERTSBINARYIND0ANDPUTSASCIIDIGIT(*…CHARACTERSATADDRESSSPECIFIEDINA0.(*…LEADINGZEROSARECONVERTEDTOSPACES.+*…THEFIELDLENGTH(NO.CHARS)ISSPECIFIED *…IND1INTHECALLINGSEQUENCE.**‚CALLINGSEQUENCE:!*…MOVE.L,D0*…MOVE.L,D11*…MOVE.L,A0*…BSRBINDECFJ* *‚RETURNS:*…D0=0=>GOODCONVERSION**‚REGSUSED:‚01234567 *ŠDƒ****ŠAƒ**0*************************************************7TENS…DC.L†10000000,1000000,100000,10000,1000,100,10,1,0*$BINDECFJ MOVE.L #8,D2 MAX NO. DIGITS SUB.L D1,D2 NO. DIGITS TO SKIP! BMI.S BINDECF5 BRANCH ERROR EXIT LSL.L #2,D2 DOUBLE WORD LENGTH LEA TENS(PC),A1 START OF TABLE" ADD.L D2,A1 ADJUST FOR DIFFERENCE&MOVE.W#'‚',D2INITIALIZEACCUMULATOR%BINDECF1 SUB.L (A1),D0 SUBTRACT 10**N BCS.S BINDECF2 BRANCH TOO BIG* ADD.W #1,D2 INCREMENT CURRENT DIGIT COUNT BRA BINDECF1 CONTINUE)BINDECF2 ADD.L (A1)+,D0 RESTORE, ADV PNTR TST.L (A1) TEST DONE BEQ.S BINDECF4 BRANCH DONE CMP.W#'‚',D2LEADINGZEROTEST! BEQ.S BINDECF3 BRANCH STILL ZERO# ADD.B #$10,D2 BRING TO ASCII DIGIT%BINDECF3 MOVE.B D2,(A0)+ DEPOSIT CHAR LSL #8,D2 SAVE CHAR DEPOSITED# MOVE.B #$20,D2 RESTORE LS TO SPACE BRA BINDECF1 CONTINUE4BINDECF4 ADD.B #$10,D2 LAST ONE BECOMES DIGIT ALWAYS" MOVE.B D2,(A0)+ DEPOSIT LAST CHAR' TST.L D0 SET CONDITION CODE, 0 IF GOOD BINDECF5 RTS‰PAGE2***************************************************!*ˆCONVERTBINARYTOASCIIROUTINE*5*ˆBINARYTOHEXCONVERSIONFORLONGWORD(FOURBYTES)**ŠCONVERTBINARYVALUEIND0TOHEXSTRING*‹D0‚=‚VALUETOBECONVERTED *‹D1‚=‚LENGTHOFRECEIVINGFIELD'*‹A0‚=‚STARTADDRESSOFRECEIVINGFIELD**!*ˆREGISTERSUSED:01234567 *“D„****“A„**3****************************************************+BHLCVTƒMOVE.L#'„',(A0)‚BLANKRECEIVEFIELD‰MOVE.L#'„',4(A0) ‰MOVE.L#8,D1‰MOVE.W#$2000,D2‚INITBHLCU1ƒROL.L#4,D0†GET4BITS‰MOVE.BD0,D2„SAVED0)‰AND.B#$F,D2„CLEARALLEXCEPTLOW4BITS"‰ADD.B#$20,D2ƒSETFORSPACECHECK ‰CMP.W#$2020,D2‚LEADINGSPACE?‰BEQ.SBHLCU3„YES‰ADD.B#$10,D2ƒCONVERTTONUM‰CMP.B#$39,D2ƒISITANUM‰BLE.SBHLCU2„YES‰ADD.B#7,D2…GETTOLETTERSBHLCU2ƒMOVE.BD2,(A0)+BHLCU3ƒASL.W#8,D2†MOV' EWORD‰SUB.B#1,D1…REDUCECOUNT‰BHIBHLCU1†BRNOTZERO ‰RTS.RETURN*‰PAGE ‰ENDBEGPROCééééé=/* =/*†INIT.AF=/*'=/* Chain file to assemble INIT utility=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to INIT.LS=/*=/IFC \1 ƒ=ARGINIT.LS=/ENDIF=/*=ASM INIT.SA,INIT.RO,\1;RZ=156=/*{ Included files are:=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ&.DSKCFGDT.AI=/*ƒ&.DSKCFGCD.AI=/*}=/*=ENDééééééî=/* =/*†INIT.LF=/*%=/* Link chain file to create INIT.LO=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to INIT.LL=/*=/IFC \1 ƒ=ARGINIT.LL=/ENDIF=/*=LINK ,INIT.LO,\1;AHMIX ATTRIBUT( ES PSEG SEG0:0-15 $0 INPUT INIT.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé÷‰PAGE6ˆTTLƒINITIALIZEDISK&DISKETTEUTILITY-Rev0225854(INIT„IDNT‚1,8‚INIT&FORMATDISKUTILITY<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;**************************************************************‹PROGRAMNAMEIS‚INIT.LO**,*†*****ƒINITIALIZATIONOFDISKCOMMANDƒ******)*ˆTHISPROGRAMWILLINITIALIZETHEVOLUME)*ˆIDENTIFICATIONBLOCKONSECTORZEROAND+*ˆTHESECTORALLOCATIONTABLEONSECTORONE,*ˆTHEINPUTMUSTBEADEVICEBUTANOLDDISK+*ˆCANBEUSED.THEEFFECTWILLBETOSETIT*ˆUPASIFITISANEWDISK.+*ˆTHEFORMATOPTIONWILLRESULTINTHEDISK*ˆBEINGREFORMATTED2*ˆFORAUSER0DISKORDISKETTETHEBOOTSTRAPFILE *ˆANDTHEDUMPFILECANBEADDED.*ˆFORTHEHARDDISKTHELOCKOUTTABLEANDTHE'*ˆDIAGNOSTICTABLE&AREASCANBEADDED** *ˆREV1.00!*ˆREGISTERSUSED:01234567*’D…*********’A…**********H**************************************************************************’MODIFICATIONHISTORY**ˆREVISION03138546*’InSLTUP,ifalockoutentrycannotbeused,because5*’it'sadup,locationLASTALThadgottenincremented4*’sothatthenexttimeSLTUPisenteredwemaylook*’offtheendofthedisk.*ˆREVISION03128544*’InDSKALTA,ifanerrorwerefoundwhilesearching4*’thealternatearea,INITwouldbeginrereadingthe4*’areaimmediatelyaftertheerror,insteadofskip-*’pingtothenexttrack.*ˆREVISION0225854éé( ù/ *+!J)V1h9fAbI?QJY\aFi,qyf‰6‘ ™L¡V©?±8¹NÁJÉFÑ:ÙFá=éD5*’Ifprinterisunavailablewhentryingtooutputthe3*’SLTlistinprocedurePRTSLT,insteadofaborting5*’INITwilloutputamessagetotheterminalandskip1*’theoutput.‚Also,whenenteringSLTentriesand4*’toomanyentriesareentered(whenusingalternate4*’trackcapability),thecorrectmessageofTOOMANY *’ERRORSONDISKwillbeoutput.*ˆREVISION01108547*’TwoproblemswerefoundduringtestingofINITduring5*’developmentofV4.4.‚IfauserusedtheSoptionon6*’afloppy,thevolumeIDwouldgetwipedout.‚Problem5*’tracedtobadvaluestoreinA3onentrytoUPDVOL.5*’Secondproblemwasthatthecountofusedalternate5*’trackswasnotinitializedbeforeaddinganewone;3*’permittingausertoentermorethanthemaximum.**ˆREVISION01048544*’DuringtestingofV4.4,INITwasfoundtozeroout6*’thevolumeofadisk(ette)ifanerrorconditionwas8*’detectedaftertheRequestStatuscommandwasreached.7*’Also,iftheusertriedtolockoutasectorthatwas7*’greaterthanthedisk,theutilitywouldhangandnot5*’finishiftheSoptionwereused,orgetanINVALID1*’RANDOMSECTORifanormalinitwerebeingdone.**ˆREVISION11138442*’DuringdevelopmentofVERSAdos4.4thenumberof2*’randomaccessdeviceswasincreasedtothepointéé/*’thattheFetchDeviceMnemonicscallcauseda-*’bufferoverflow.‚Therefore,thesizeofthe2*’bufferlengthintheFHScallwasincreased.‚The2*’bufferarea,itself,wasnotincreased.‚So,when5*’thefetchisdone,partofthefirstpartofINIT's4*’instructionareaisoverwritten,whichhasalready*’executed,causingnoproblem.*ˆREVISION10198447*’SPR839hadusersunabletoenterloadaddresseswith5*’thenormalhexadecimalprefix'$'.‚INITnowpermits5*’thisaddress(whichisalwaysassumedtobeinhex)6*’theusertheluxuryofusingthedollarsignornot. *’ChangewasinsertedinNUMCVT.*7*’SPR1023indicatedthatsinceINITonlylookedatthe7*’firstfourcharactersenteredforthevolumeID,INIT8*’shouldtelltheuserofthatfact.‚Therefore,achange-*’wasmadetothemessageoutputtotheuser.*4*ˆREVISION0921844‚(allchangesmarkedby'ALTTRK')(*’AchangewasinstalledtohaveINITbe5*’abletotakeadvantageofsomecontroller'sability5*’tomapbadtrackstoalternates.‚Thus,anextensive:*’changewasinstalledtodetectcertainerrorsduringthe;*’validationportionofINITandiffound,mapthosetracks9*’toanavailablealternate.‚Inaddition,thoseknownbad:*’trackswhicharemanuallyenteredwillalsobemappedto5*’analternate.‚Allofthedetectedbadspotswillbe9*’writtenontothediskintheSLTandsavedfrominitto8*’initiftheuserdesires.‚Forcompletedetailsseethe1*’engineeringspec"VERSAdosBadBlockHandling".*ˆREVISION04038444*’Ifabadspotwasfoundduringdiskvalidation,in5*’routineDSKSATregisterD6wasdestroyedsothaton+*’totheDSKVALarea,insteadofhavingthe7*’incrementtoobtainthenexttracktolookat,D6had7*’thelastbadsecto) rfound.‚Thecorrectionwastosave2*’andrestoreallregistersintheDSKSATroutine.*ˆREVISION0305844;*’Apathwasoverlookedwiththerevisionof011784forthe(*’delay.‚Itwascorrectedwiththisfix.*ˆREVISION0301844;*’Ifyoutriedtoinitializearawdiskettewhichwaswrite9*’protectedyouwouldgetaninvaliderrormessage.Logic=*’wasaddedtogivethecorrecterrormsg.‚Inadditiontothis;*’ontheEXORMACStheIPCdriverwouldhangup.TheIPCbug8*’needstoberesolved.‚Theerrormsgfixhappenstobea8*’workaroundfortheIPCproblembutisnotatruefix.I****************ƒTHISLOGICWASCOMMENTEDOUTASTHEPROPERFIXWASFOUND1****************ƒTOBEWINFUTY.SAANDWASSOPUT*ˆREVISION0126844;*’Abugexistedwhichcauseda'C5'error'invalidtransfer>*’fordevice'(LU6)tobedisplayedifincorrectconfiguration9*’hadbeenpreviouslyentered.‚ItseemsthatINITwasnot9*’settinguptheIOSfunctioncodesandoptionscorrectly7*’onthesecondpassthruconfiguration.‚Insteaditwas7*’leavingtheoldconfigurationcommandcodeintheIOS=*’parameterblockandapplyingittoLU6(Thesameparameter:*’blockwasbeingusedtodoconfiguresaswellasmessage5*’displays).‚ThefixwastogointoSENDMSGandforce8*’thecommandandoptionsfieldstotheircorrectvalues *’beforetryingtodothewrite.*ˆREVISION011784-4*5*’Thevalidationsequencewasincorrectlycalculating2*ˆthebittobesetifitencounteredbadsectors.8*’IfauserrequestedSectorLockoutTabletheparameterA*ˆblockthatwasusedforareadwasalsouseforawriteandthe?*ˆwritewasalteringvaluesintheparameterblockandwhenthe?*ˆvalidationsequencestarteditwasusingthewrongparameters>*ˆandcausedinvalidresults.(iedestroyingtheVIDwhichwas<*ˆlaterrestored,tellingyoutherewerenobadsectorswhen*ˆinfacttherewas)0*’Putinaloopdelayfor51/4inchfloppyifa/*ˆvolumeerrorisencountered(LOOP514‚LPCT514)**ˆREVISION‚0105844*7*’MadeamodificationtoincludefileDSKCFGCD.AIsoas:*’nottouseinternaltagsVOLMMTDEandSENDMSGsincethis8*’includefileisalsousedbyMTandthosetagsarenot*’availablethere.**ˆREVISION‚1215834*6*’Commentedoutthelinedated12/15/83whichbranched>*ˆalwaystoDSKRD.ThiscorrectedtheproblemofrepeatedREAD**ˆERRORmessageforsamebadsectorfound.**ˆREVISION‚1024834*+*’Initmodifiedtoeliminateerror$E4when1*’initializingsinglesidedfloppyfor128bytes.**ˆREVISION‚101083-4‚RJ1*’ModifiedINITtocorrectproblemofoverwriting8*ˆtheVIDofany'systemrecognized'mediaonthesystem5*ˆwhosevolumenamecorrespondstothatbiengusedto9*ˆnamemediabienginitialized.INITnowissuesamessage=*ˆindicatingthatthevolumenamerequestedisalreadyonthe;*ˆsystem,andallowsanewvolumenametobegiven.Thisis=*ˆdonerepeatedlyuntilthevolumenamechosendoesnotmatch,*ˆonealreadyinthedevicemnemonicstable.**H************************************************************************H*************************************************************************“ENHANCEMENTSSINCE3.0*4*‚1.OPTIONVHASBEENADDEDFORTHEUSERTOSPECIFY$*…THELOADADDRESSOFTHEBOOTFILE.**…EXAMPLECALL:**INIT#FD05;V*7*‚2.DIAGNOSTICDATAISWRITTENONTOTHEHARDDISKWHEN$*…DIAGNOSTICTESTAREAISASKEDFOR.*7*‚3.ALTERNATESECTORCAPABILITYADDEDFORVERSAdos4.44*…SEEENGINEERINGSPEC"VERSAdosBadBlockHandling"*=*************************************************************=**************************************************************‰PAGE***ˆINCLUDEFILES***ˆINCLUDE9995.&.FME.EQ*ˆINCLUDE9995.&.IOE.EQ*ˆINCLUDE9995.&.TR1.EQ*ˆINCLUDE&.DSKCFGDT.AI*ˆINCLUDE&.DSKCFGCD.AI**‰NOLIST‰INCLUDE9995.&.FME.EQ‰INCLUDE9995.&.IOE.EQ‰INCLUDE9995.&.TR1.EQ‰LIST**‰PAGE‰LIST ‰LLEN120*2**************************) **************************…***ƒINIT‚COMMANDƒ*******„DATASEGMENT(DSEG)ƒ****1**************************************************ˆHARDƒDISK*ˆ256BYTES/SECTOR*ˆ64SECTORS/TRACK*ˆ823TRACKS/SURFACE*ˆ16MEGABYTES=52672SECTORS***ˆ****‚EQUATEAREA‚******* BEGDATA‚EQU0CR‡EQU$0DŠCARRAGERETRUNLF‡EQU$0AŠLINEFEED$STKLENƒEQU050ŠSTACKLENGTHINWORDS*COMMSIZE‚EQU160‰INPUTCOMMANDBUFFERSIZE*LOCKSN„EQU8‹#OFSECTORSINLOCKOUTTABLE,LOCKSE„EQU42Š#OFLOCKOUT‚ENTRIESINSECTOR DSKLUI„EQU1(DSKLUOƒEQU2‹DISKLOGUNITASSIGNOUTPUT!LISTLUƒEQU3‹LISTINGLOGICALUNITDSKLUVI‚EQU4‹LOGUNIT4DSKLUVO‚EQU‚7ŠLOGUNIT7TSKNAMƒEQU'INIT'†MYTASKNAMESECLENƒEQU256‰SECTORLENGTHEVIDOSL‚EQU0‹OSLENGTHEQUATE#EVIDOSE‚EQU$0ŠOSEXECUTIONADDRESS*ƒSEEDATASECTIONFOREVIDVNO'SIZ1DSK‚EQU1001ˆSINGLESIDEDDISKSIZE'SIZ2DSK‚EQU2002ˆDOUBLESIDEDDISKSIZEDHDSECTRKEQU64ŠNUMBEROFSECTORPERTRACKONAHARDDISK(IPCTYPE)BN00…EQU0‹BITNBR0&CFIGSEC‚EQU1…CONFIGURESECTORADDRESS/CFIGLEN‚EQU1…CONFIGUREBLOCKLENGTHINSECTORS>*+********************************************ˆIOSPARTABLEFORDISKREAD*ˆFORVALIDATEOFDISKSECTORS+******************************************** RDSKIOS‚EQU* ‰DC.WIOREAD‰DC.WIOPBLK+IOPRAN‰DC.B0 ‰DC.BDSKLUO‰DC.B0‰DC.B0‰DC.L0 RDSKS„DC.L0 RDSKE„DC.L0‰DC.L0‰DC.L07********************************************************ˆFILEIOSTABLE‚INPUT7******************************************************* FILEIOS‚EQU* ‰DC.WIOREAD‰DC.WIOPBLK+IOPNXT‰DC.B0 ‰DC.BDSKLUVI‰DC.B0‰DC.B0‰DC.L0 FILESAƒDC.L0 FILESBƒDC.L0 FILELIƒDC.L0‰DC.L0*1**************************************************’FILEPARMTABOUTPUT1************************************************* FILEOOS‚EQU* ‰DC.WIOWRIT‰DC.WIOPBLK+IOPNXT‰DC.B0 ‰DC.BDSKLUO‰DC.B0‰DC.B0‰DC.L0FILEOOS1 DC.L 0 FILEEOƒDC.L0‰DC.L0‰DC.L0*/*************************************************ˆFORMATDISKPARAMETERBLOCK*.***********************************************#‰IOS.FORMIOFRMT,0,DSKLUO,0,0,0,0,0‰DS.W0*3*****************************************************ŒIOSPARAMETERTABLE(*ˆSETUPIOS(ERR0R-LOG)‚PARAMETERBLOCK*3**************************************************** OUT6IOS‚EQU* ‰DC.WIOWRIT‰DC.W0‰DC.B0 ‰DC.BLDFLUN‰DC.B0‰DC.B0‰DC.L0OUT6SAD‚DC.L0OUT6EAD‚DC.L0‰DC.L0‰DC.L0*0‰IOS.OUT6IIOWRIT,IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0*;***********************************************************,*ŠMEMORYSEGMENTBLOCKFORDIAGNOSTICBUFFER;************************************************************MSBDIAG‚DC.L„0’TASKNAME‰DC.L„0’SESSIONNUMBER‰DS.W„1’DIRECTIVEOPTION‰DC.W„0’SEGMENTATTRIBUTES‰DC.L„'DIAG'SEGMENTNAME‰DC.L„0’LOGICALADDRESS‰DS.L„1’SEGMENTLENGTH‰PAGE5******************************************************2*ˆIOSPARAMETERBLOCKFORCONFIGURATIONVALIDATION* CHCKIOS‚EQU* ‰DC.WIOREAD ‰DC.WIOPRAN‰DC.B0 ‰DC.BDSKLUO‰DC.B0‰DC.B0‰DC.L0‰DC.L0‰DC.L0‰DC.L0‰DC.L0‰DS.W0+********************************************ˆIOSPARAMETERFORCONFIGURE *ˆREQUESTS+******************************************** CONFIOS‚EQU* ‰DC.WIOSTAT‰DC.W0‰DC.B0 ‰DC.BDSKLUO‰DC.B0‰DC.B0 ‰DC.L0„*CONFIGUREBLOCKADDRESS‰DC.L0‰DC.L0‰DC.L0‰DC.L0-**********************************************$*ˆDISKCONFIGURATIONPARAMETERBLOCK*DCPBLK‰DC.B†0‰DEVICESTATUS‰DC.B†0‰CHANNELTYPE‰DC.B†0‰DEVICETYPE‰DC.B†0‰DRIVERCODE‰DC.W†0‰ATTRIBUTESMASK‰DC.W†0‰PARAMETERSMASK‰DC.W†0‰ATTRIBUTESWORD‰DC.W†0‰RE* CORDLENGTH‰DC.L†0‰DEVICESIZE‰DC.L†0‰WRITETIMEOUT‰DC.L†0‰READTIMEOUT‰DC.B†0‰SECTORSPERTRACK ‰DC.B†0‰NUMBEROFHEADSONDRIVE$‰DC.W†0‰NUMBEROFCYLINDERSONMEDIA"‰DC.B†0‰INTERLEAVEFACTORONMEDIA‰DC.B†0‰SPIRALOFFSETONMEDIA%‰DC.W†0‰PHYSICALSECTORSIZEOFMEDIA%‰DC.W†0‰PHYSICALSECTORSIZEOFDRIVE$‰DC.W†0‰NUMBEROFCYLINDERSONDRIVE9‰DC.W†0‰PRECOMPENSATIONCYLINDER#(USUALLY.5TOTALCYL)+‰DC.B†0‰PHYSICALSECTORSPERTRACKONDRIVE‰DS.B†7‰RESERVEDD*********************************************************** <>‰PAGE;************************************************************+*ˆLOOK-UPTABLEANCONFIGURATIONBLOCKSFOR'*ˆIPCDOUBLEANDSINGLESIDEDDISKETTES*;************************************************************/*ˆCONFIGURATIONBLOCKFORSINGLESIDEDDISKETTE*SSCONF‰DC.B†0‰DEVICESTATUS‰DC.B†XTDIPC„CHANNELTYPE‰DC.B†XDSFDK„DEVICETYPE‰DC.B†IODIPC„DRIVERCODE‰DC.W†$FFFF…ATTRIBUTESMASK‰DC.W†$FFFF…PARAMETERSMASK.‰DC.W†1<>*$*ˆFHSPARAMETERBLOCKFORDISKINPUT* INFHSƒEQU*‰DC.WFHASGNŠCOMMAND*‰DC.WFOPEREWŠOPTIONS-EXCLUSIVERE+ AD/WRITE‰DC.B0ŠSTATUS‰DC.BDSKLUI…LOGICALUNITNUM‰DC.L$20202020‚VOLUMENAME‰DC.W0ŠUSERNUM‰DC.L$20202020ˆCATNAME‰DC.L$20202020‰DC.L$20202020ˆFILENAME‰DC.L$20202020 ‰DC.W$2020‰DC.W0‰DC.L0,0,0,0,0,0*%*ˆFHSPARAMETERBLOCKFORDISKOUTPUT* OUTFHSƒEQU*‰DC.WFHASGNŠCOMMAND1OUTOPTS‚DC.WFOPEREWŠOPTIONS-EXCLUSIVEREAD/WRITE‰DC.B0ŠSTATUS‰DC.BDSKLUO…LOGICALUNITNUM!OUTVOLƒDC.L$20202020‚VOLUMENAME‰DC.W0ŠUSERNUM‰DC.L$20202020ˆCATNAME‰DC.L$20202020‰DC.L$20202020ˆFILENAME‰DC.L$20202020 ‰DC.W$2020‰DC.W0‰DC.B0ŠWRITEPROTCODE‰DC.B0‰DC.W0OUTDIRƒDC.L0ŠCONTFILESIZE ‰DC.L0,0,0*‰DS.W0*0*************************************************’DIRECTORYTABLE'***************************************DIRBLKƒDS.B„FDLEN‰DS.W0* BUFPARƒEQU*‰DC.L0,0‡TASK(0=SELF)+‰DC.W$2000…OPTIONS(LOGICALADR=PHYSADR‰DC.W0Š(RAMSEGMENT)‰DC.L'BUFR'…NAMEOFSEGMENTBUFADRƒDC.L0ŠSTARTOFBUFFERBUFPARS‚DC.L0ŠLENGTHOFBUFFER*7********************************************************,*ˆPARAMETERTABLEFORFETCHDEVICENMENONICS*7*******************************************************FETDEVƒDC.WFHFDMN…CMD‰DC.WFOPFRA…OPTIONS‰DC.W0ŠSTATUS&RESERVED‰DC.L0ŠBUFFER#‰DC.LSECLEN*2ƒBUFFERLENGTHƒ111384‰DS.W0LOCKPAR‰DC.L0,0ˆTASK(0=SELF),‰DC.W$2000†OPTIONS(LOGICALADR=PHYSADR)‰DC.W0Š(RAMSEGMENT)‰DC.L'LOCK'†NAMEOFSEGMENT‰DC.L$FFˆLENGTHOFSEGMENT‰PAGE***’ERRORMESSAGEPARAMETERBLOCK**EM_PBLK: EM_DO:ƒDC.L†0"*œD0-IOS/FHSRETURNERRORSTATUS*œ(ERRORMSGKEYVALUE) EM_A0:ƒDC.L†0"*œA0-ADDROFI/OPARAMETERBLOCKEM_OPT:‚DC.B†0*œOPTIONSFLAG*œBIT‡MEANINGIFSET*0ˆQUERYRESPONSEDESIREDEM_TLUN:DC.B†0*œUSERTERMINALLUN-(LDFLUN)EM_QRC:‚DC.B†0*œQUERYRETURNCHARACTEREM_KLUN:DC.B†0*œUSERKEYBOARDLUN-(CDFLUN)EM_SPA:‚DC.L†0'*œSTARTADDRESSFORUSERTEXTPLUGPOOLEM_EPA:‚DC.L†0%*œENDƒADDRESSFORUSERTEXTPLUGPOOL‰DS.W0*‰PAGE*<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<*****************************************************************ˆ***ƒWORK‚AREAƒ******9************************************************************‚OPTIONVWORKAREA*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84 LOOP514‚EQU‡4,*œNUMBEROF1/2SECONDDELAYSTOPERFORMFOR(*œ51/4INCHFLOPPYIFAVOLUMEERRORIS *œENCOUNTEREDLPCT514‚EQU‡500!*œNUMBEROFMILLISECONDSTODELAY ISSEVALUE:2‰DC.L†0‰INITIALSATSTART/ENDVALUEFORVALIDATION‰DC.L†0‰PROCESSING *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5VOPT…EQU…0’'V'OPTION(OFFSETADDRESSFORBOOTFILE)1VOPTR„EQU…1’'V'‚OPTIONROUTINEISCALLINGROUTINEOPTFLGƒDC.B„0’OPTIONFLAG,LDWD…EQU…$B0LOADADDRESSLOCATIONINL.I.P.*EXCWD„EQU…$104OFFSETTOEXECUTIONADDRESS,STKWD„EQU…$100OFFSETTOINITIALSTACKVALUE9ENTRPTƒEQU…$16OFFSETTOENTRYPOINTINL.I.P.(EXECUTION)!LDADR„DC.L„0’INITIALLOADADDRESS-ENTADRƒDC.L„0’BUFFERFORENTEREDLOADADDRESS)BIAS…DC.L„0’BUFFERFORADDRESSBIASVALUE**ƒDIAGNOSTICBUFFERAREA*4DIASTRT‚DS.L„1’STARTINGADDRESSOFDIAGNOSTICBUFFER.DIAENDƒDS.L„1’ENDADDRESSOFDIAGNOSTICBUFFER0SEED…DC.L„$092855ŒSEEDFORRANDOMNUMBERROUTINE** BUFDUMƒEQU* ‰DS.BSECLENBUFDUME‚EQU*-1STSKNAMƒDC.L0‰SAVETASKNAMESESNUMƒDC.L0ˆSAVESESSIONNUM#VOLNAMƒDC.L0‰SAVEVOLDEFAULTNAME‰DC.W0/USERNUM‚DC.W0ŠDEFAULTUSERNUM(16BITBINARY)*CATNAMƒDC.L0,0ˆSAVEDEFAULTCATAGORYNAMEREGD6„DC.L0ŒSAVEREG6 ‰DC.L0ŠREG7ADDREGƒDS.L1ŠADDRESSREG'S‰DS.L1‰DC.W0ŠTOPHALFOFREG2ADDREG2‚DC.W0ŠLOGONUSERNUM‰DS.L6ŠOTHERREGS+LOCKPSN‚DC.L0ŠSTARTPSNNUMBERFORLOCKOUTLOCKRNG‚DC.W0ŠRANGEOFLOCKOUT/SUBFLAG‚DC.B0ŠFLAGFORCHKBITS/SETBITEINSAT*‰DS.W0OKANS„DC.B'„'‡OKMSGANSWEROKANSEƒE+ QU*-2‰DS.W0#FORMANS‚DC.B'„'‡FORMATDISKANSWERFORMANSE EQU *-2‰DS.W0DESCAN$‚DC.B'$'-DESCANS‚DC.B'Š'‚AREAFORDESCRIPTION20CHAR ‰DC.B'‹'DESCANSEEQU*-2‰ENDOFAREA!‰DC.B'‚'‡HOLDLASTCRAFTERDESC*‰DS.W0.TABDATE‚DC.B'ˆ'‚DATEFROMSYSTEM(DATE&TIME)*(INFORNƒDC.B0ŠDISKHASNOVOLNAMEONIT!FORMFLAGDC.B0ŠFORMATTDISKFLAG&ONESECT‚DC.B0ŠONESECTORFORSATFLAG(ZEROFLAGDC.B0ŠINITDISKHASUSE#ZEROFLOPPYƒDC.B0ŠFLOPPYDISK>LOCKWRT‚DC.B0ŠWRITEOUTSECTORLOCKOUTTABLEINDICATOR„ALTTRK*WSATFLAGDC.B0ŽWRITESATFLAGFORLOCKOUT7POSITIONDC.B0ŽFLAGFORDIAGROUTSTARTORENDOFSIDE,BSTFLAG‚DC.B0ŽFLAGFORBITTESTORSETPASS‰DS.W0 SAVOUT‚DC.L0,SAVSIDE‚DC.L0ŠTOTALSECTORSONONESIDE(D)#FPSN…DC.L0ŠFIRSTPSNOFCYLINDER1&LPSN…DC.L0ŠFIRSTPSNOFLASTCYLINDER1SATADDR‚DC.L0ŠWORKINGADDROFSAT(LOGICALADDR)#SAVEREM‚DC.W0ŠBITSINLASTSECTION+SAVESATLDC.W0‰NUMOFSECTORSINSATTABLE SAVCYLƒDC.W0‰#OFCYLINDERS(C)%SAVSECƒDC.W0„#OFSECTORS/TRACK(B)SAVHEAD‚DC.W0†#OFHEADS‚(E)IPCFLAG‚DC.B†0‰IPC-NONIPCINDICATOR--00IFWORKINGWITHIPC*µFFIFNON-IPC7ALTCONF‚DC.B†0‰ALTERNATESECTORCAPABLEDRIVER‚<PRMSGFLGDC.B†0‰PRINTERUNAVAILABLEMSGPRINTEDTOTERM‚022585‰DS.W†0+TOTSECS‚DC.L†0‰TOTALSECTORSONDISK‚0104856ALTLAST‚DC.L†0LASTSECTORTOBEWRITTENIFALTDRIVER9ALTSAVE‚DC.L†0CURRENTTRACKBEINGREADDURINGVALIDATION2LASTALT‚DC.L†0LASTALTERNATESECTORUSED‚ALTTRK>>@VLTBFLAGDC.B†0‰VOLUMENAMEINTABLEFLAG.--01IFNAMEINTABLE *¹00IFNOTééééé, é*‰DS.W05DIAGPAT1 DC.L $0F1E2D3C,$4B5A6978,$8796A5B4,$C3D2E1F0-‰DC.L$0F1E2D3C,$4B5A6978,$8796A5B4,$C3D2E1F0-‰DC.L$F1F2F4F8,$F9FAFCFE,$FF7FBFDF,$EF6FAFCF-‰DC.L$4F8F0F07,$0B0D0E06,$0A0C0408,$04020100.***********************************************"*ˆSTARTOFPRINTHEADERS&BUFFERS*.**********************************************‰DS.W0*$BITSONƒDC.B$FF,$7F,$3F,$1F,$F,7,3,1‰DS.W0#BIT1…DC.B0,$C0,$E0,$F0,$F8,$FC,$FE*‰DS.W0'BIT2…DC.B0,$80,$C0,$E0,$F0,$F8,$FC,$FE***‰DS.W0 OKM†EQU*‰DC.B'OKTOINITIALIZE#'DEVM1„DC.L'„'‰DC.B'‚(Y/N)?' OKMES„EQU*-1‰DC.B'ƒVOLUME'$VOLM1„DC.L'„'…VOLUMENAMEGOESHERE OKME…DC.B''*‰DS.W0 SATERMƒEQU*)‰DC.B'ERRORSECTORALLOCTABLEEXCEEDED'SATERME‚EQU*-1*‰DS.W0*BADSM„DC.B'„'‰DC.B'ENTRIESAREINSLT'BADSMEƒEQU*-1‰DS.W0*0NAMM…DC.B‚'FILENAMEIS:'ˆGETNAMEFORBOOTMSG PRTBUFƒEQU* ‰DC.L„'”' ‰DC.L„'”'#PRTBEND‚EQU*-1‹ENDOFPRINTBUFFER NAMME„EQU*-1‰DS.W0*&NAMMR„DC.B'ENTERNEWNAMEIFNEEDED‚'NAMMREƒEQU*-1*‰DS.W0*3DESCM„DC.B'ENTERDESCRIPTION(MAX20CHARACTERS)'DESCMEƒEQU*-1*‰DS.W0* VALMSGƒEQU*/‰DC.B'DOYOUWANTTOVALIDATESECTORS(Y/N)?'VALMSGE‚EQU*-1*‰DS0&VALMSG2‚DC.B'ƒVALIDATINGSECTORS....'VALMSG2E EQU *-1‰DS.W0*VOLR…DC.L'†'…HOLDVOLUMENAME VOLRE„EQU*-1‰DC.B''ŒDEADSPACEFORSBARG*‰DS0GVOLMSGƒDC.B'ENTERNEWVOLUMENAME(onlythefirst4characters'ƒ101984‰DC.B'areused)'ª101984VOLMSGE‚EQU*-1‰DS.W0* FORMSGƒEQU*+‰DC.B'DOYOUWANTTOFORMATDISK(Y/N)?‚'FORMSGE‚EQU*-1‰DS.W0 FORSMSG‚EQU*‰DC.B'STARTFORMAT'FORSMSGE EQU *-1‰DS.W0 USNM…EQU*‰DC.B'ENTERUSERNUMBER' USNME„EQU*-1‰DS.W0WORKUSN‚DC.B'†' ‰DC.B'‚'‰DS.W0/LOCKQ„DC.B'ENTERLOCKOUTSTARTSECTORNUMBER'LOCKQEƒEQU*-1‰DS.W00LOCKN„DC.B'ENTERNUMBEROFCONTIGUOUSSECTORS'LOCKNEƒEQU*-1‰DS.W07LOCKM„DC.B'DOYOUHAVELOCKOUTTABLEENTRIES(Y/N)?'LOCKMEƒEQU*-1‰DS.W0:DUPLOCK‚DC.B'ƒLOCKTABLEENTRYALREADYALLOCATED,'ALTTRK‰DC.B'ENTRYNOTALLOWED.'DUPLOCKE EQU *-1‰DS.W0¬<>‰DS.W08DIAGM„DC.B'DOYOUWANTADIAGNOSTICTESTAREA(Y/N)?'DIAGMEƒEQU*-1‰DS.W0>‰DS.W0LNOALTSƒDC.B'ALLALTERNATETRACKSHAVEBEENUSED,VALIDATIONBEGINS'022585NOALTSE‚EQU*-1ƒ022585‰DS.W0ééééé- é*LDMSG„DC.B„'THECURRENTLOADADDRESSIS‚$'LDMSG1ƒDC.B„'00000000'LDMSGEƒEQU…*-1‰DC.W„0&NEWADRƒDC.B„'ENTERNEWLOADADDRESS$'NEWADRE‚EQU…*-1‰DC.W„0*DIRMSGƒEQU*ŒSTARTOFDIRMSG%VOLPRTƒDC.L'„'…VOLUMENAMEGOESHERE ‰DC.W':'L1USN„DC.L0ŠUSERNUM ‰DC.W'.'L1CAT„DC.L'„'…CATALOGUE ‰DC.L'„' ‰DC.W'.'L1FIL„DC.L'„'…FILENAME ‰DC.L'„' ‰DC.W'.'L1EXT„DC.W'‚'‡EXTENSION!DIRMSGEƒEQU*-1‰ENDOFMSGLINE1‰DS.W0"BADSECƒDC.B'READERRORSECTOR#'BADSECN‚DC.B'ˆ'BADSECE‚EQU*-1‰DS.W‚0%CNFERRƒDC.B‚'CONFIGURATIONERROR--'CNFERRN‚DC.B‚'ˆ'CNFERRE‚EQUƒ*-1‰DS.W07BADDUPƒDC.B'WARNING--BADSECTORINUSERLOCK-OUTAREA'BADDUPE‚EQU*-1‰DS.W0,TRKMSGƒDC.B'TRACKBYTRACKFORMAT‚(Y/N)?'TRKMSGE‚EQU‚*-1‰DS.W0ENOFLOPƒDC.B'MEDIANOTDEFINED--BADTOTALNUMBEROFSECTORSRETURNED'‰DC.B'FROMTHEIPC'NOFLOPE‚EQU‚*-1‰DS.W0VOLMMTD‚DC.B'VOLUME' ‰DC.B''''$VOLMM„DC.L'„'„VOLUMENAMEGOESHERE ‰DC.B''''8‰DC.B'ALREADYONTHISSYSTEM,USEANOTHERVOLUMENAME' ‰DC.BCR,LFVOLMMTDEEQU‚*-1‰DS.W0,********************************************!*ˆBUFFERTORECEIVEY/NRESPONSES,********************************************‰DS0ANSWERƒDC.B'„'ANSWERE‚EQU*-1‰DC.B''ŒDEADBYTEFORSBARG*3**************************************************** *ˆBUFFERAREAFORI/OOPERATIONS*ˆBUFFERSIZEIS1SECTORS*ˆUSEDTOBUILDINITIALSAT3****************************************************‰DS0 BUFFIO‚EQU* ‰DS.BSECLENBUFFIOE‚EQU*-1*‰DS.W0* ENDDATA EQU * ‰OFFSET00*************************************************†BUFFERAREAFORLOCKTABLE *ˆALSOUSEDFORDIAGNOSTICTABLE0************************************************éLOCKIODS.BSECLEN‹BUFFERLOCKIOE‚EQU*-10**************************************************ˆCONFIGURATIONSECTOR0************************************************CONFSEC‚DS.B†SECLENCONFSECEEQU‡*-1*(*****************************************ŠBUFFERFORVIDSECTOR&*‹VOLIDENTREMAINSTHROUGHOUTPROGRAM(****************************************VIDIO„DS.BSECLENVIDIOEƒEQU*-1*5*ˆSECTIONUSEDFORDISKVALIDATIONANDSATGENERATION*VALBUFƒDS.BSECLENVALBUFE‚EQU*-1HARDBUF‚DS.LSECLEN ‰DS.LSECLEN ‰DS.LSECLENVALENDƒEQU*-1*)*ˆRESTOFBUFFERUSEDFORTRACKREADONLY*‰PAGE ‰SECTIONƒ0*<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<**************************************************************2*ˆ***‚PROCEDURESECTIONFORINITDISKCOMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************STARPROG EQU *‰LEAPBA(PC),A7ŠPRGBASEADDR*&***************************************.*ˆ**ƒSAVEDEFAULTVALUEPASSEDFROMSYSTEM****'****************************************;‰MOVEM.LD0-D7/A0-A7,STSKNAM-PBA(A7)SAVEREGISTERCONTENTS(‰LEA‡PROGSTK(PC),A7‚SETUPSTACKPOINTER+*ˆ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„******#****- ********************************&*‰*****CALLCOMMANDPARSEROUTINE‚****#**************************************"‰LEAPBA(PC),A4ŠINITPGMBASEADDR *ƒSETUPPOINTERSINPARMBLOCKS*‰STOREBUFFIO(PC),WDSKIOS1‰STOREBUFFIOE(PC),WDSKIOS2‰STOREVOLR(PC),INP1IOS+IOSSAD‰STOREVOLRE(PC),INP1IOS+IOSEAD ‰STOREANSWER(PC),INP3IOS+IOSSAD!‰STOREANSWERE(PC),INP3IOS+IOSEAD‰STOREOKANS(PC),INP4IOS+IOSSAD ‰STOREOKANSE(PC),INP4IOS+IOSEAD!‰STOREDESCANS(PC),INP5IOS+IOSSAD"‰STOREDESCANSE(PC),INP5IOS+IOSEAD!‰STOREFORMANS(PC),INP6IOS+IOSSAD"‰STOREFORMANSE(PC),INP6IOS+IOSEAD!‰STOREWORKUSN(PC),INP7IOS+IOSSAD#‰STOREWORKUSN+4(PC),INP7IOS+IOSEAD‰STOREBUFFIO(PC),FETDEV+FHSPTRC‰STOREDCPBLK(PC),CONFIOS+IOSDBPƒPUTCONFIGUREBLOCKADDRESSINIOS*ªPARAMETERBLOCK"‰STORETOTSLT(PC),WDSKSL1š<>*‰TST.LREGD6-PBA(A4)…ISCOMMANDLINEEMPTY‰BNE.SLBUFF‡NO#‰BRAINVALERR„NOINPUT/OUTPUTERROR*/LBUFF„LEACOMMLIN(PC),A0ƒSAVEBUFFERSTARTADDR,‰BSRPARSE‡GOTODISECTCOMMANDLINEROUTINE‰TST.LD0‡CKF0RANYERR0RS‰BMIINVALERRƒBRIFERR0R*:‰BTST.L#22,D0‡IFNULLINPUTBITISSET,THAT'SANINVALID‰BNEINVALERRˆENTRYERROR. 7‰BTST.L#14,D0‡IFNULLOUTPUTBITISNOTSET,THAT'SAN"‰BEQINVALERRˆINVALIDENTRYERROR.  ,‰MOVE.LA1,SAVOUT-PBA(A4)‚SAVELOCOFOUTPUT** DETECT OPTION SPECIFIED*%‰MOVE.L‚A2,D0ŽADDRESSOFOPTIONFIELD!‰BEQ.SƒNOOPTŽBRANCHIFNOOPTIONS ‰BSR…OPTION"‰CMP.Bƒ#$40,D0ŒNOOPTIONSPECIFIED‰BEQ.SƒNOOPTŽBRANCHIFYES(‰TST.BƒD0‘WERETHEREOPTIONERRORSFOUND"‰BNE…ER_NVOBRANCHIFERRORSFOUND)‰CMP.Bƒ#'S',D1ŒUPDATESLTONLY?†<>.‰BNE…ER_NVOBRANCHIF'V'OPTIONNOTSPECIFIED+‰BCHG„#VOPT,OPTFLG-PBA(A4)ƒMARKOPTIONFLAG*‰BNE…ER_NVOBRANCHIFVOPTIONALREADYSET 6NOOPT„BSRINITIN†GOTOINPUTINITROUT(INIT&PRTMSG)**‰BWN‚1/25/84:#*‰NoteonthefunctionofINITIN--=*‰INITINmakesastatuscallwiththeCONFIOSparameterblock?*‰Sincethisisthefirstcallmadeusingthisparameterblock,E*‰anditinitiallyhasaIOSTAT($0140)functionDC'din,thisworks.;*‰Uponreturn,theattributesmaskforthedeviceisinthe+*‰DCPBLK‚parameterblockandisusedbelow.**0‰TST.B…IPCFLAG-PBA(A4)…CHECKFORIPCTYPEDRIVER‰BNE.S…NONIPC„NONIPC—<>*$*ˆMUSTMOUNTTHENON-IPCDRIVERDISK*2NONIPCƒLEA‡DCPBLK(PC),A1CONFIGUREPARAMETERBLOCK1‰LEA‡CONFIOS(PC),A0ŠCONFIGUREIOSPARAMETERBLOCK#‰MOVE.W„#IOCNFG,IOSFCT(A0)‚FUNCTION/‰AND.L…#MSKDRV,IOSATM(A1)MASKDRIVEATTRIBUTES** *‰BWN‚1/25/84*‰NoteonMSKDRV:***‰MSKDRVupperword:$000Fattributesmask**‰MSKDRVlowerword:$03D0parametersmask<*‰Thismaskmasksoutallbutthemedia-relevantbitsinthe*‰attributesmask.=*‰Thisisagoodthing‚becausewedoNOTwantanychangemade-*‰tobit9oftheattributeswordforadisk.**‰Whynot,youask?B*‰In4.3VERSAdos,bit9beingsetmeanswehavean8"diskdrive,4*‰andbeingclearmeanswehavea51/4"diskdrive.*>*‰In4.2VERSAdos,bit9isalways‚clear.Weneedtobecareful=*‰nottotelltheSASIdrivertoreadan51/4"diskettewhen**‰whatwereallyhaveisan8"diskette!!!*;*‰So,toavoidincompatibility,don'tmesswithbit9here.*)‰MOVE.B„IOSDTP(A1),D0†FLOPPYORHARDDISK‰CMP.B…#XDSFDK,D0‰*(‰BEQ.S…MNTDEVIFFLOPPYMOUNTTHEDEVICE)‰CLR.W…IOSATM(A1)‰CLEARFLOPPYATTRIBUTESMNTDEV+‰MOVE.W„#IOPMNT,IOSOPT(A0)‚SETOPTION=MOUNT‰IOSCALLƒCONFIOS(PC)ƒDOMOUNT%‰BNEIOERPRT‰BRANCHIFERRORON. MOUNT*1‰TST.B…SLTONLY-PBA(A4)…SLT-ONLYUPDATE?ƒ<>***ˆDOCONFIGURECHANGEREQUEST*CHNGCFIG9‰MOVE.L„IOSATM(A1),D1‡SETATTRIBUTESANDOPTIONSFORCALL.‰BSR‡MODCNFGMODIFYCONFIGURATIONIFNECESSARY**ˆCONFIGURETHEDEVICE*?‰MOVE.W„#IOCNFG,IOSFCT(A0)‚GIVECONFIGUREIOSBLOCKITFUNCTION;‰MOVE.W„#IOPCONLY,IOSOPT(A0)SETCONFIGUREDISKONLYOPTION*‰IOSCALLƒCONFIOS(PC)ƒTRYTOCONFIGUREDISK ‰BEQ.S…FORMIT+‰MOVEM.LƒA1-A2,-(A7)SAVENEEDEDADDRESSESS‰MOVE.L„#8,D1…ONECHARACTER ‰CLR.L…D0$‰MOVE.B„IOSDST(A1),D0‡GETERRORCODE-‰LEA‡CNFERRN(PC),A0ŠADDRESSTODEPOSITSTRING$‰BSR‡BINHEXŽCONVERTTHEERRORNUMBER#‰LEA‡CNFERR(PC),A0SENDTHEMESSAGE‰LEA‡CNFERRE(PC),A1* ‰BSR‡SENDMSG+‰MOVEM.Lƒ(A7)+,A1-A2‰RESTOREUSEDREGISTERS‰BRA.S…CHNGCFIG‚TRYAGAIN*-*********************************************#*ˆCHECKFORFORMATMESSAGE&ANSWER*FORMIT/‰LEADCPBLK(PC),A0‚CURRENTCONFIGURATIONSTATUS)‰BSR‚SETPARMƒSETUPPARAMETERSFORFORMAT!‰STOREFORMSG(PC),OUT6IIOS+IOSSAD"‰STOREFORMSGE(PC),OUT6IIOS+IOSEAD"‰IOSCALLOUT6IIOS(PC)‚SENDMESSAGE‰BNEIOERPRT…ERROR**ˆRECEIVEANSWER‰IOSCALLINP6IOS(PC)‰BNEIOERPRT…ERROR&‰BSRSBARG‡DOARGSUB/FORCEUPPERCASE‰BNEIOERPRT…BRIFERROR*.**********************************************&‰CMP.B#'Y',FORMANS-PBA(A4)‚ANSWERYES ‰BNE.SDOINIT+‰MOVE.B#1,FORMFLAG-PBA(A4)‚SETFORMATFLAG ‰BSRDOFORM**8**********************************************************“GOTOINITDISKROUTINE*2***************************************************DOINIT*'*ˆCHECKCONFIGURATIONBEFORECONTINUING*0‰LEACHCKIOS(PC),A0POINTTOIOSPARAMETERBLOCKF‰MOVE.LCNFBKADR-PBA(A4),A3CURRENTCONFIGURATIONPARAMETERBLOCKADDR!‰BSR‚CNFGCHKGOCHECKTHEGUYOUT$‰BEQ.SDOINIT1ƒBRANCHIFALLISWELL6‰BSR.LEMHOUT„CALLERRORMESSAGEHANDLER‹9/27/83MLB*8‰TST.BIPCFLAG-PBA(A4)ƒDIDERROROCCURONIPCTYPEDRIVE6‰BNECHNGCFIGˆOKTOCHANGECONFIGURATIONIFNOTANIPC!‰BRAIOERPRT‰GODISPLAYTHEERRORDOINIT1%‰BSRGETMEM†GOGETTHEMEMORYSEGMENT$‰BSRINITDSK…GOTOINITIALIZATIONRT!‰TST.BFLOPPY-PBA(A4)FLOPPYDISK‰BEQ.SSTOPITˆNO*ˆSENDVALIDATEMSG!‰STOREVALMSG(PC),OUT6IIOS+IOSSAD"‰STOREVALMSGE(PC),OUT6IIOS+IOSEAD‰IOSCALLOUT6IIOS(PC) ‰BNEIOERPRT**ˆRECEIVEANSWER‰IOSCALLINP6IOS(PC) ‰BNEIOERPRT&‰BSRSBARG‹DOARGSUB/FORCEUPPERCASE ‰BNEIOERPRT‰CMP.B#'Y',FORMANS-PBA(A4) ‰BNE.SSTOPIT ‰BSRDSKVAL* *ˆSTOPTHEPROGRAMATTHISPOINT STOPITƒEQU*‰BSR.SCLOOUT‡CLOSEOUTPUT* ‰BRASTOPE*$CLOOUTƒMOVE.W#FHCLOS,OUTFHS-PBA(A4)‰FHSCALLOUTFHS(PC) ‰BNECLOSERR‰RTS‰PAGE/************************************************%*ˆ**‚INITIALIZATIONOFINPUTDISK‚***3*ˆ***‚SETUPFHSPARMBLOCKBASEDONCMDLINEINPUT1*ˆTHISROUTINEWILLDOASSIGNANDATTRIBUTECALLS*/************************************************ INITIN EQU *"‰LEAOUTFHS(PC),A6ƒINITPARMBLOCK-‰LEACOMMLIN(PC),A0‚INITCOMMANDLINEPOINTER*'*****************************************ˆCALLEDITFILEFORINPUT**ˆ**ƒCALLEDITFILEROUTINE***ˆA0=INPUTCOMMANDSTART*ˆA6=ADDROFPARMBLOCK*&***************************************!‰BSREDITFILE„MAKEEDITFILECALL‰BMIINVALERR‡ERR0R 9‰BTST.L#22,D0‡IFAVOLUME/DEVICEWASNOTENTERED,THAT'S%‰BEQINVALER. RˆANINVALIDENTRYERROR. ;‰MOVE.L#$003F0081,D1ŠIFANYTHINGPARTOFAFILEDESCRIPTOR2‰AND.LD0,D1“OTHERTHANVOLUME/DEVICEWASENTERED,1‰BNEINVALERR’OR'*'WASUSED,OR'/'WASUSEDTO%*§TERMINATE,THAT'SANINVALIDENTRY. ‰BTST#1,D0„CKFORDEVICE‰BEQ.SINASGN†NO‰CLR.LD0ƒSETDEVICEFLAG*0INASGNƒMOVE.LOUTVOL-PBA(A4),D4…SAVEFORCOMPARE-‰BSRCKTAB‡GOTODEVROUTINEGETNAMEFORMSG*(*****************************************ˆASSIGNINPUTVOLUMEORDEVICE+*******************************************‰FHSCALLOUTFHS(PC) ‰BNE…IOERPRT *º<> *-**********************************************‰OKTOINITIALIZEMSG&ANSWER-**********************************************/INIT…CMP.L#'„',VOLM1-PBA(A4)‚VOLINMSG‹ALTTRK‰BNE.SINIT1‚YES1‰STOREOKMES(PC),OUT6IIOS+IOSEADƒSETUPSHORTEND‰BRA.SINIT2ŠCONTINUE4INIT1„STOREOKME(PC),OUT6IIOS+IOSEAD„ENDOFLONGMSG INIT2„EQU*‰STOREOKM(PC),OUT6IIOS+IOSSAD *ˆPRINTMSG‰IOSCALLOUT6IIOS(PC) ‰BNEIOERPRT*$‰IOSCALLINP4IOS(PC)‚CALLFORANSWER ‰BNEIOERPRT ‰BSRSBARG‰BNEIOERPRT‰BRIFERROR$‰CMP.B#'Y',OKANS-PBA(A4)‚ANSWERYES‰BNESTOPIT†ABORT*2*ˆIFMEDIAISFOREIGNCONTINUETHEINITIALIZATION.4*ˆIFMEDIAHASAVOLUMENAMETHEVIDMUSTBECLEARED*ˆANDADEVICEASSIGNMENTMADE.*-‰TST.B…INFORN-PBA(A4)ƒCHECKFORFOREIGNMEDIA1‰BNE‡INIT4…BRANCHIFMEDIADOESNOTHAVEAVOLUME*>*ˆAVOLUMEASSIGNMENTHASBEENMADE,‚FORCEADEVICEASSIGNMENT*(INITA„STOREBUFFIO(PC),RDSKVID1™<>'‰BSR‡WVID†WIPEOUTTHEVIDONTHEMEDIA'‰BSR‡CLOOUT„CLOSETHEVOLUMEASSIGNMENT/‰MOVE.B„#1,INFORN-PBA(A4)‚MARKMEDIAASFOREIGN*3*ˆPREPAREFHSPARAMETERBLOCKFORDEVICEASSIGNMENT*‰MOVE.W„#10,D7„LOOPCONTROL8‰MOVE.L„D4,OUTVOL-PBA(A4)ƒMOVEDEVICENAMETOPARMBLOCKINIT33‰MOVE.W„#FHASGN,OUTFHS-PBA(A4)ƒCOMMANDISANASSIGN?‰MOVE.W„#FOPEREW,OUTOPTS-PBA(A4)OPTIONS-EXCLUSIVEREAD/WRITE(‰FHSCALLƒOUTFHS(PC)„TRYTOASSIGNDEVICE"‰BEQ.S…INIT4…BRANCHIFSUCCESSFULL3‰CMP.B…#FSTAAP,D0ƒCHECKFORACCESSPERMISSIONERROR#‰BNE‡IOERPRTƒBRANCHIFAREALERROR‰DBRA†D7,INIT3‚TRYAGAIN8‰BRA‡IOERPRTƒAREALACCESSPERMISSIONERRORGOREPORTITINIT4:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*º3/1/84*ˆMOVE.L„WDSKVID1-PBA(A4),-(A7)*ˆMOVE.L„WDSKVID2-PBA(A4),-(A7)*œSAVEORIGINALVALUES*ˆSTORE…ZEROVID,WDSKVID1*ˆSTORE…ZEROVIDE,WDSKVID2*œPLACEINNEWVALUES*ˆIOSCALLWDSKVID*œATTEMPTTOWRITETODISK*ˆMOVE.L„(A7)+,WDSKVID2-PBA(A4)*ˆMOVE.L„(A7)+,WDSKVID1-PBA(A4)*œRESTOREORIGINALVALUES*ˆCMP.B…#ISTAWP,D0 *ˆBEQ‡IOERPRT*œJMPIFWRITEPROTECTEDMEDIA*º3/1/84O*<<<<<<<<<<<<</ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=‰BRA‡GETCONFƒGOGETCONFIGURATIONSTATUS--USETHATROUTINES!*žRTSTOGETBACKTOMAINPROGRAM‰PAGE6*******************************************************&*ˆROUTINETODOFETCHDEVICEMNEMONICS *ˆANDGETVOLUMENAMEIFPRESENT7*ˆD4CONTAINSTHEDEVICEBEINGCHECKEDFORINTHETABLE*5****************************************************** CKTAB„EQU*-‰LEAFETDEV(PC),A0ƒINITPOINTERTOPARMBLOCK)‰LEABUFFIO(PC),A1ƒINITPOINTERTOBUFFER‰MOVE.LD0,D2„INITDEVICEFLAG*‰FHSCALLFETDEV(PC)‚GETTABLE‰BNEIOERPRT…ERROR'„MOVE.WFHSLEN(A0),D1‚SAVE#OFENTRIES* CKTAB2ƒEQU*‰TST.LD2ˆISTHISADEVICE‰BEQ.SCKTAB3„YES*ˆPROCESSVOLUME$‰CMP.LFDVVOL(A1),D4‚CKFORVOLNAME‰BEQ.SCKTABV†YES ‰BRA.SCKTAB4 CKTAB3ƒEQU*"‰CMP.LFDVDEV(A1),D4‚CKFORDEVICE‰BEQ.SCKTABF†FOUND CKTAB4ƒEQU*‰SUB.W#1,D1…REDUCECOUNT9‰BLE.SCKTABNFƒIFATEND,THEREISNOSUCHDEVICE/VOLUME.‰ADD.L#FDVLEN,A1‚ADDSIZE ‰BRACKTAB2* CKTABFƒEQU*+‰MOVE.LD4,DEVM1-PBA(A4)‚MOVEDEVICETOMSG%‰TST.L„FDVVOL(A1)‚CKFORFOREIGNDISK‰BEQ.SCKTABN†YES0‰MOVE.LFDVVOL(A1),VOLM1-PBA(A4)‚MOVEVOLTOMSG;‰MOVE.LVOLM1-PBA(A4),OUTVOL-PBA(A4)‚MOVEVOLTOPARMTABLE‰BRA.SCKTABEXƒEXIT CKTABNƒEQU*,‰MOVE.B#1,INFORN-PBA(A4)‚INPUTFOREIGNDISK‰BRA.SCKTABEX*3CKTABVƒMOVE.LD4,VOLM1-PBA(A4)‚MOVEVOLNAMETOMSG3‰MOVE.LFDVDEV(A1),DEVM1-PBA(A4)‚MOVEDEVICETOMSG2‰MOVE.LFDVDEV(A1),D4ŠSAVEDEVICENUMBERFORLATER*CKTABEX‚RTS.RETURN  )*’***DEVICE/VOLUMENAMENOTINTABLE***?CKTABNF‚TST.LD2ŒIFITWASADEVICE,PRINT'INVALIDDEVICE'AND;‰BEQƒER_NVDEV†TERMINATE.‚OTHERWISE,JUSTRETURNANDLETTHE*‰RTS‘ASSIGNFAILANDPRINT'VOLUMEERROR'.‰PAGE2****************************************************ˆROUTINETOINITIALIZEDISK*2*************************************************** INITDSKƒEQU**8‰MOVE.LBUFADR-PBA(A4),A3‚RESTOREMEMORYSEGMENTADDRESS‰BSRBUFFCLR…GOCLEARSECTOR‰BSRVIDCLR†CLEARVIDAREA;‰BSRCFIGCLR…CLEARCONFIGURESECTORBUFFERANDMOVECURRENT*œCONFIGURATIONINTOIT‰BSRGETVOLN…GETVOLUMENAME‰LEAVIDIO(A3),A5RESET3‰MOVE.WADDREG2-PBA(A4),VIDUSN(A5)‚MOVEUSERNUMBER ‰TST.WADDREG2-PBA(A4)ƒUSERZERO‰BNE.SINITBLD…NO GETUSNƒEQU*$‰LEAVIDIO(A3),A5…USER#REQUESTMSG‰LEAUSNM(PC),A0‰LEAUSNME(PC),A1 ‰BSRSENDMSGI‰IOSCALLINP7IOS(PC) ‰BSRSBARG ‰BNEIOERPRT!‰MOVE.LINP7IOS+IOSSAD-PBA(A4),A0 ‰ADD.L‚INP7IOS+IOSLEN-PBA(A4),A0‰MOVE.B#CR,(A0)MOVECRTOEND‰CMP.B#$0D,WORKUSN-PBA(A4)‰BEQ.SINITBLD‰LEAWORKUSN(PC),A0†FROMLOC‰LEAVIDUSN(A5),A6ƒRECLOC‰SUB.L#10,A6„RESETFOROFFSETG***********************************************************************;*‹THEEDITFILEROUTINEISBEINGUSEDTOVALIDATETHEUSER#G***********************************************************************‰BSREDITFILE„VALIDATEUSERNUM ‰BMIGETUSN‰BTST#21,D0…ERROR ‰BEQGETUSN*.***********************************************ˆBUILDSECTORZERO.*********************************************** INITBLD‚EQU*/‰LEAVIDIO(A3),A5ƒINITBECAUSEOFEDITFILECALL‰TST.WVIDUSN(A5)USER0‰BNE.SINITB1…NO3‰MOVE.B#1,ZEROFLAG-PBA(A4)ƒSETUSERZERODISKFLAGINITB1D‰MOVE.L#CFIGSEC,VIDCAS(A5)ƒSETCONFIGURATIONSECTOR,SECTORADDRESSA‰MOVE.B#CFIGLEN,VIDCAL(A5)‚CONFIGURATIONBLOCKLENGTHINSECTORS=‰MOVE.LCNFBKADR-PBA(A4),A0CONFIGUREPARAMETERBLOCKADDRESS,‰MOVE.L#SATSTRT,VIDSAT(A5)‚SATSTARTSECTOR1‰MOVE.L#SATSTRT,SATADDR-PBA(A4)‚INITSATADDRESS4‰MOVE.LIOSRSZ(A0),D0ŠGETNUMBEROFVERSADOSSECTORS+‰DIVU#2048,D0ƒDIVBY#OFBITSINASECTOR‰CLR.LD1ˆINIT‰MOVE.WD0,D1„SAVEQUOTIENT$‰SWAPD0‰GETREMAINDERINLOWERHALF;‰MOVE.WD0,SAVEREM-PBA(A4)‚CNTOFSECTORBITSINLASTBLOCK‰MOVE.BIOSDTP(A0),D2"‰CMP.B‚#XDSFDK,D2CHECKFORFLOPPY‰BNE.SINITB2NO)‰MOVE.B#1,FLOPPY-PBA(A4)ƒSETFLOPPYFLAG%INITB2ƒTST.WD0ˆANYTHINGINREMAINDER‰BEQ.SIMOV†NO#‰ADD.W#1,D1…ADDFORPARTOF/ SECTOR IMOV…EQU*9‰MOVE.WD1,SAVESATL-PBA(A4)‚SAVELENGTHOFSATINSECTORS0‰MOVE.WD1,VIDSAL(A5)‚LENGTHOFSECTALLOCTABLE‰LEAVIDVNO(A5),A0„INIT%‰MOVE.WEVIDVNO-PBA(A4),(A0)+ƒVERSION'‰MOVE.WEVIDVNO+2-PBA(A4),(A0)ƒREVISION*.*ˆIFINITTINGAHARDDISKWHOSECONTROLLERHAS0*ˆALTERNATESECTORCAPABILITYANDTHEUSERWANTS(*ˆTOUSETHATCAPABILITY,SETBITINVID*'‰TST.BFLOPPY-PBA(A4)FLOPPY?•<INITB3ƒMOVE.L#'EXOR',VIDMAC(A5)‚MACSSDISCINDICATORƒALTTRK>>‰MOVE.L#'MACS',VIDMAC+4(A5)*/***********************************************!*ˆGETGENERATIONDATEFROMSYSTEM/************************************************6‰ERQ.GTDTIMTABDATE(PC)‚GETDATE(DATE&TIME)8BYTES3‰MOVE.LTABDATE-PBA(A4),VIDDTE(A5)‚MOVEDATETOVID'‰BSRGETDESC…ROUTINETOGETDESCRIPTION*‰BSR.SWVIDWRITEPARTIALVID'‰BSR.SWCFIGWRITECONFIGURATIONSECTOR*/***********************************************+*‰CALLROUTINETOSETUPSECTORALLOCTABLE/************************************************ ‰BSRDOSAT*+‰TST.BFLOPPY-PBA(A4)ISTHISAFLOPPYDISK‰BNE.SINITC1ˆYES**‰LEAVIDIO(A3),A5ˆINIT‰MOVE.L#SATSTRT,D7ˆINIT:‰ADD.WSAVESATL-PBA(A4),D7POSITIONATLOCKOUTTABLESTARTB‰MOVE.LD7,LOCKIOS+IOSRRN-PBA(A4)INITSTARTINLOCKOUTPARMTABLE;‰MOVE.LD7,WDSKSLT+IOSRRN-PBA(A4)INITSTARTINWSLT‚ALTTRK+‰MOVE.LD7,VIDSLT(A5)‚MOVESTARTPSNTOVID-‰MOVE.W#LOCKSN,VIDSLL(A5)MOVELENGTHTOVID*#‰BSRLOCKOUT‰GOBUILDLOCKOUTTABLE*$‰BSRDSKVALŠVALIDATESECTORSROUTINE*;‰BSR.SWCFIG‰WRITECONFSECINCASETRK0WASLOCKEDALTTRK* ‰BSRDIAGAREA*** INITC1ƒEQU**9*’CHANGACCESSPERMISSIONONOUTPUTTOPUBREADEXCWRITE*)‰BSR.STESTPAT‰SETUPTESTPATTERNINVID**%‰BSRVERSAREAˆGOADDVERSADOSTODISK*‰BSRDUMPAREAˆSETUPDUMPAREA*‰BSRCHECKSUMˆGOCALCCHECKSUM* *‚DOUPDATEOFVIDFORLASTTIME*.‰BSR.SWVID„*****ƒWRITEOUTVOLIDBLOCK‚******‰RTS.RETURNFROMINITDSK*****7********************************************************+*ˆWRITEOUT‚VIDTOGETVOLNAMEINTOSYSTEM*7******************************************************* WVID…EQU*‰IOSCALLWDSKVID(PC) ‰BNEIOERPRT‰RTS*,*********************************************ˆREADVIDINTOBUFFER,******************************************** RVID…EQU*‰IOSCALLRDSKVID(PC) ‰BNE‚IOERPRT‰RTS,********************************************$*ˆWRITECONFIGURATIONBLOCKTOMEDIA,********************************************WCFIG‰IOSCALLWDSKCFIG(PC) ‰BNEIOERPRT‰RTS5********************************************<>,*********************************************BUILD TEST PATTER IN VID,********************************************* TESTPAT‚EQU*$‰LEADIAGPAT1(PC),A0…STARTOFPATTER#‰LEAVIDIO+VIDDTP(A3),A1‚LOCINVID‰MOVE.B#16,D0‡WORDSINPATTERTESTPATL MOVE.L (A0)+,(A1)+ ‰SUB.B#1,D0 ‰BNEƒTESTPATL‰RTS‡RETURNFROMTESTPAT7**********************************************ƒ<<010485 *ˆINSERTTHEVOLUMEINTOTHEVID*ŠA3POINTSTOVIDBUFFER.********************************************** UPDVOLƒEQU* ‰BSR.SRVID4‰MOVE.LVOLNAM-PBA(A4),VIDIO(A3)RESTOREVOLUMENAME ‰BSR.SWVID‰RTS‚RETURN010485>>‰PAGE.************************************************ˆDOWRI0 TETOOUTPUTVOLUME*.***********************************************9IOSWRITEIOSCALLWDSKIOS(PC)‹WRITEASECTORANDINCREMENT%‰BNEƒIOERPRT‘SECTOR#INPARAMBLOCK.‰ADD.L#1,IOSRRN(A0)‹* ‰RTS***ˆROUTINETOZEROOUTBUFFERêñVúSB INS"<*52;:CB J#R;ZFb(jrMzM‚=Š,’ š/¢FªQ²:º@ÂIÊCÒDÚO BUFFCLR‚EQU*‰LEABUFFIO(PC),A5ƒINITSTART‰LEABUFFIOE(PC),A6‚INITENDCLOP…CLR.L(A5)+‰CMP.LA6,A5‚ATEND ‰BCSCLOPˆNO ‰RTSRETURN *º<>* *‹ROUTINETOZEROOUTVIDBUFFER VIDCLRƒEQU*‰LEAVIDIO(A3),A5ƒINITSTART‰LEAVIDIOE(A3),A6‚INITENDVLOP…CLR.L(A5)+‰CMP.LA6,A5‚ATEND ‰BCSVLOPˆNO ‰RTSRETURN*ˆROUTINETOZEROOUTBUFFER LOCKCLR‚EQU*‰LEALOCKIO(A3),A5ƒINITSTART‰LEALOCKIOE(A3),A6‚INITENDLLOP…CLR.L(A5)+‰CMP.LA6,A5‚ATEND ‰BCSLLOPˆNO ‰RTSRETURN***’ROUTINETOZEROOUT100CHAROFVALBUFFVALCLRƒLEAVALBUF(A3),A5‰LEAVALBUFE(A3),A6VALOP„CLR.L(A5)+‰CMP.LA6,A5‚ATEND ‰BCSVALOP‡NO ‰RTSRETURN*;*ˆCLEARCONFIGURATIONBUFFERANDCOPYCURRENTCONFIGURATION *ˆINTOBUFFER*CFIGCLR0‰LEA‡CONFSEC(A3),A5†GETMEMORYADDRESSOFBUFFER$‰LEA‡CONFSECE(A3),A6…SETENDADDRESSCFIGCLR1‰CLR.L…(A5)+…CLEARMEMORY‰CMP.L…A6,A5…ENDOFBUFFER-‰BCS.S…CFIGCLR1‚BRANCHIFSTILLINTHEBUFFER*!*ˆMOVECURRENTCONFIGURATIONINFO*(‰LEA‡CONFSEC(A3),A5†RESETMEMORYADDRESSA‰MOVE.L„CNFBKADR-PBA(A4),A6CURRENTCONFIGURATIONPARAMETERBLOCK8‰MOVE.L„#IOSDLN,D7ŠLENGTHOFCONFIGURATIONPARAMETERBLK‰BRA.S…CFIGMOV1CFIGMOV$‰MOVE.B„(A6)+,(A5)+‰MOVEINTOMEMORYCFIGMOV1‰DBRA†D7,CFIGMOV ‰RTS›RETURN‰PAGE;************************************************************1*ƒROUTINETOREQUESTVOLUMENAME&MOVETOBUFFER*;*********************************************************** GETVOLNƒEQU*?ŠCLR.B‚VLTBFLAG-PBA(A4)ƒInitialize"VOLUMENAMEINTABLE"flag.#ŠLEA„VIDIO(A3),A5‡POINTERTOBUFFER'ŠSTORE‚VOLMSG(PC),OUT6IIOS+IOSSAD‚START"ŠSTORE‚VOLMSGE(PC),OUT6IIOS+IOSEAD*ŠIOSCALLOUT6IIOS(PC)†PRINTMSG ŠBNE„IOERPRT*#ŠIOSCALLINP1IOS(PC)‡RECEIVEVOLUME&ŠBSR„SBARGŽDOARGSUB/FORCEUPPERCASEŠBNE„IOERPRTŒERROR*,*‰RTTOCKANDBLANKCARRAGERETINVOLNAME!ŠMOVE.B#1,D0SET1STTIMESWITCHŠLEA„VOLR(PC),A1ŠLEA„VOLR+4(PC),A2$ŠLEA„VIDVOL(A5),A3…STARTOFRECAREA ŠMOVE.L#'„',(A3)†BLANKRECAREAFIR1†CMP.B‚#$0D,(A1)ŠBEQ.S‚FIRSTEXŒYESŠCMP.B‚#$3A,(A1)ŠCKFOR:ŠBEQ.S‚FIRSTEXŒYESŠCMP.B‚#'#',(A1)ŠBEQ.S‚FIRERPERRORŠCMP.B‚#'Z',(A1) ŠBHI.S‚FIRERP&ŠCMP.B‚#'A',(A1)ŠCKOUTOFALPHARANGEŠBCC.S‚FIRMOVGOODŠTST.B‚D0‘1STTIMEŠBNE.S‚FIRERPNOŠCMP.B‚#'*',(A1) ŠBEQ.S‚FIRMOVŠCMP.B‚#'&',(A1) ŠBEQ.S‚FIRMOVŠCMP.B‚#'@',(A1) ŠBEQ.S‚FIRMOV,ŠCMP.B‚#'',(A1)ŠTREATBLANKLIKETERMINATORŠBEQ.S‚FIRSTEXŠCMP.B‚#'0',(A1) ŠBCS.S‚FIRERPŠCMP.B‚#'9',(A1) ŠBHI.S‚FIRERP FIRMOV„EQU*ŠMOVE.B(A1)+,(A3)+ŠCLR.B‚D0‘TURNOFFSWITCHŠCMP.L‚A2,A1ŽATEND ŠBCS„FIR1N0FIRSTEXƒTST.B‚D0‘SWITCHOFFŠBNE.S‚FIRERPNO;ŠLEA„VIDVOL(A5),A3†SavetheVolumenameforusebyVLTAB.../ŠMOVE.L(A3),D4Œsubroutineintablecomparison.2ŠBSR.S‚VLTABŽGocheckifOKtousethisVOL.name.9ŠTST.B‚VLTBFLAG-PBA(A4)ƒIsVolumeNamealreadyintable?ŠBNE.S‚FIRERPSŒYes.2ŠMOVE.LBUFADR-PBA(A4),A3‚RESTORESEGMENTBASEADR ŠRTS—.RETURN*FIRERP„BSR„INVALE9FIRERPSƒMOVE.LBUFADR-PBA(A4),A3‚RESTORESEGMENTBASEADRŠBRA„GETVOLNŒTRYAGAINL**************************************************************************** *‰10/10/83‚RJ>*‰Routinetodo'FETCHDEVICEMNEMONICS'andcheckvolumename=*‰providedagainstthedevicetable.Ifthevolumenamegiven@*‰compareswithanyonthetable,amessageindicatingt0 hatthisD*‰volumenameshouldnotbeusedandanewvolumenameisrequested.C*‰Thisisdonecontinuouslyuntilavolumenamethatisnotalready*‰inthetableisentered.8*‰D4containsthevolumebiengcheckedforinthetable.*L***************************************************************************** VLTAB…EQU*3ŠLEA„FETDEV(PC),A0ŠInitpointertoParamaterBlock.*ŠLEA„BUFFIO(PC),A1ŠInitpointertobuffer.*ŠFHSCALLFETDEV(PC)ˆGettable.ŠBNEIOERPRTError.(ŠMOVE.WFHSLEN(A0),D1†Save#ofentries.******…PROCESSVOLUMENAME‡*** VLTAB2„EQU„*(ŠCMP.L‚FDVVOL(A1),D4†Ckforvolumename.ŠBEQ.S‚VLTABVYes.ŠSUB.W‚#1,D1ŽReducecount.5ŠBLE.S‚VLTABNFŒIfatend,oktousethisvolumename.ŠADD.L‚#FDVLEN,A1‰Addsize. ŠBRA„VLTAB2*#*********VOLUMENAMEINTABLE.…***;VLTABV„MOVE.LD4,VOLMM-PBA(A4)ƒMovevolumenametomessage."ŠSTORE‚VOLMMTD(PC),OUT6IIOS+IOSSAD#ŠSTORE‚VOLMMTDE(PC),OUT6IIOS+IOSEADŠIOSCALLOUT6IIOS(PC) ŠBNE„IOERPRT<ŠMOVE.B#1,VLTBFLAG-PBA(A4)‚Set"Volumenameintable"flag.*&*********VOLUMENAMENOTINTABLE‚*** VLTABNFƒEQU„*ŠRTS‰PAGE;************************************************************3*ˆROUTINETOREQUESTDESCRIPTIONANDMOVETOBUFFER*;************************************************************ GETDESC‚EQU* ‰STOREDESCM(PC),OUT6IIOS+IOSSAD!‰STOREDESCME(PC),OUT6IIOS+IOSEAD‰IOSCALLOUT6IIOS(PC)‰BNEIOERPRT…ERROR*"‰IOSCALLINP5IOS(PC)‚REQUESTINPUT‰BNEIOERPRT…ERROR&‰BSRSBARG‡DOARGSUB/FORCEUPPERCASE ‰BNEIOERPRT ‰BSR.SEND5*"‰LEADESCANS(PC),A2‚STARTOFINPUT%‰LEAVIDVD(A5),A3‚LOADBUFFDESCADDR‰LEA19(A3),A4ƒENDOFAREA ANSLOPƒEQU*"‰CMP.B#$0D,(A2)‚FOUNDCARRAGERET‰BEQ.SANSBLK†YES‰MOVE.B(A2)+,(A3)+‚MOVEDATA‰CMP.LA4,A3…ATEND ‰BLEANSLOP‰BRA.SANSEX…EXIT*!ANSBLKƒMOVE.B#'',(A3)+‚BLANKIT‰CMP.LA4,A3…ATEND‰BLEANSBLK†CONTBLANK)ANSEX„LEAPBA(PC),A4‚RESTOREPGMBASEADR2‰MOVE.LBUFADR-PBA(A4),A3RESTORESEGMENTBASEADR ‰RTS.RETURN*3END5…MOVE.LINP5IOS+IOSSAD-PBA(A4),A0†STARTOFBUFF'‰ADD.LINP5IOS+IOSLEN-PBA(A4),A0‡LENGTH‰MOVE.B#CR,(A0)MOVECR‰RTS‰PAGE6*******************************************************1*ˆROUTINETOSETUPSECTORALLOCATIONTABLEWHICH/*ˆRESIDESONPHYSICALSECTOR2OFDISK(ADDR1)*7*ˆTHECORRECTBITSMUSTBETURNEDONOROFFTOINDICATE*ˆWHICHSECTORSAREAVAILABLE5*ˆTHISROUTINEISFORSINGLE&DOUBLESIDEDDISKETTES/*ˆLOCKOUTTABLEBITSARESETONINTHISROUTINE*6******************************************************* DOSAT„EQU**‰BSRBUFFCLR…CLEARSECTOR**0************************************************!*ˆSETUPSIDEONEOFTHEDISKETTE,**********************************************‰MOVE.LCNFBKADR-PBA(A4),A0(‰MOVE.LIOSRSZ(A0),D6‚GETNUMOFSECTORS$‰DIVU#2048,D6ƒ#POFBITSPERSECTOR‰CLR.LD7ˆINIT‰MOVE.WD6,D7ˆSIZEINSECTORS ‰MOVE.LD7,D2:‰MOVE.L#SATSTRT,WDSKIOS+IOSRRN-PBA(A4)‚INITATSATSECTOR‰TST.WD6ˆOVER2SIDES‰BNE.SBIGLOP†YES@‰MOVE.B#1,ONESECT-PBA(A4)‚SETFLAGONLYONESECTORWILLBEUSED ‰BRA.SDOREM**&*ˆROUTINEFOR>THANDOUBLESIDEDDISK* BIGLOPƒEQU*‰BSRIOSWRITE„WRITESECTOR$‰SUB.W#1,D7…ATENDOFWHOLESECTORS‰BNEBIGLOP†NO* DOREM„EQU*‰SWAPD6‰GETREMAINDER‰TST.WD6ˆISIT0‰BEQ.SDOFIRST…YES*‰CLR.LD7ˆINIT******************************************* *ˆPROCESSREMAINDEROFLASTSIDE*******************************************‰MOVE.WD6,D7‰GETREMAINDER‰DIVU#8,D7‹GETTOTALBYTES ‰CLR.LD6 ‰MOVE.WD7,D6‰LEABUFFIO(PC),A0‰ADD.LD6,A0…ADDOFFSET‰SWAPD7‰GETREMAINDER‰MOVE.WD7,D6‰GETREMAINDER‰LEABITSON(PC),A1ˆINITTABLE‰MOVE.B0(A1,D6),D60‰MOVE.BD6,(A0)+†SETBITFORLASTBYTEAVAILABLE‰LEABUFFIOE(PC),A2‡INITEND BITLOOP‚EQU*‰CMP.LA0,A2ŠATEND‰BCS.SLSTWRTŠYES‰MOVE.B#$FF,(A0)+„SETBITSON ‰BRABITLOOP%LSTWRTƒBSRIOSWRITE‰WRITELASTSECTOR ‰ADD.W#1,D2ŠINCFORLASTSECTOR*-******************************************1 ***&*ˆTURNONBITSINSATFORSECTORSUSED-********************************************* DOFIRST‚EQU*)‰TST.BONESECT-PBA(A4)ƒONLYONESECTUSED‰BNE.SSETRRN„YES‰BSRBUFFCLR…CLEARSECTOR&‰TST.BFLOPPY-PBA(A4)ISTHISAFLOPPY‰BNE.SSETRRNˆYESA‰ADD.W#LOCKSN,D2‚TOTALSECTORSINLOCKOUTTABLE(BITSTURNEDON)(*’CLEARSECTORSFORLOCKOUT&DIAGTABLE‰MOVE.W#LOCKSN,D7BIGLOOP1 BSR IOSWRITE ‰SUB.W#1,D7 ‰BNEƒBIGLOOP1 SETRRNƒEQU*7‰MOVE.L#SATSTRT,WDSKIOS+IOSRRN-PBA(A4)SETUPSECTOR#$‰LEABUFFIO(PC),A0ƒINITBUFFPOINTERD‰ADD.W#CFIGLEN,D2‚ADJUSTUSEDSECTORCOUNTTOREFLECTCONFIGUREBLK ‰CMP.W#7,D2 ‰BCS.SBITL ‰BHI.SBITH*ˆEQUAL BITE…EQU*‰MOVE.B#$FF,(A0)‰BRA.SDOSATEX…EXIT *ˆLESSTHEN7 BITL…EQU*‰LEABIT1(PC),A1…INITTABLE BITM…EQU*‰MOVE.B0(A1,D2),D2‚GETBITS‰MOVE.BD2,(A0)‰BRA.SDOSATEX/***********************************************&*ˆGREATERTHAN7-1STBYTEPROCESSING.********************************************** BITH…EQU* ‰SUB.W#7,D2 BITH1„EQU*‰MOVE.B#$FF,(A0)+ BITC…EQU* ‰CMP.W#8,D2‰BEQBITEˆEQUAL ‰BHI.SBIT8H******************* *ˆLESSTHEN8*******************‰LEABIT2(PC),A1 ‰BRABITM**********************ˆGREATERTHAN8********************* BIT8H„EQU* ‰SUB.W#8,D2 ‰BRABITH1** DOSATEX‚EQU*‰BSRIOSWRITE„GOWRITESECTOR* ‰RTSRETURN**‰PAGE7********************************************************0*ˆROUTINETOSETUPANDCALLDISKFORMATROUTINE*7******************************************************** DOFORMƒEQU*‰STOREFORSMSG(PC),OUT6SAD‰STOREFORSMSGE(PC),OUT6EAD‰IOSCALLOUT6IOS(PC)*0‰TST.B…IPCFLAG-PBA(A4)CHECKFORIPCTYPEDRIVER/‰BNE.S…DOFORM1ƒBRANCHIFNOTANIPCTYPEDRIVERDOFORMA(‰IOSCALLFORMIOS(PC)‚CALLTOFORMATDISK‰BEQƒFORMEXIT„GOOD‰BRAIOERPRT…GOTOERRORRTDOFORM17‰LEA‡DCPBLK(PC),A1‡ADDRESSOFCONFIGUREPARAMETERBLOCK5‰CMP.B…#XDSRDK,IOSDTP(A1)‚CHECKFORNON-IPCHARDDISK8‰BNE.S…FORMTRKƒBRANCHIFFLOPPYTOFORMATTRACKBYTRACK=‰STORE…TRKMSG(PC),OUT6IIOS+IOSSAD†ASKFORFASTFORMATOFHARD$‰STORE…TRKMSGE(PC),OUT6IIOS+IOSEAD…*‰IOSCALLƒOUT6IIOS(PC) ‰BNE‡IOERPRT‰IOSCALLƒINP6IOS(PC)ƒGETANSWER ‰BNE‡IOERPRT‰BSR‡SBARG…FORCEUPPERCASE$‰BNEIOERPRT‰BRANCHIFERROROCCURED,‰CMP.B…#'Y',FORMANS-PBA(A4)ŠCHECKTHEANSWER-‰BNE.S…DOFORMAƒDOFORMATDISKIFANSWERISNO**ˆDOFORMATTRACK*FORMTRK@‰MOVE.W„#IOPTRK,(FORMIOS+IOSOPT)-PBA(A4)SETFORMATTRACKOPTION5‰MOVE.L„#0,(FORMIOS+IOSRRN)-PBA(A4)ƒSTARTATSECTOR0‰CLR.L…D7ˆINITREGISTER/‰CMP.B„#XDSFDK,IOSDTP(A1)…WORKINGONAFLOPPY?%‰BNE.S…FORMTRKAŽBRANCHIFAHARDDISK5‰BTSTW…#IOADDEN,IOSATW(A1)‚ISFLOPPYDOUBLEDENSITY?(‰BEQ.S…FORMTRKAŽBRANCHIFSINGLEDENSITY*G*„TRACK0ISSINGLEDENSITY128BYTESECTORSFORDOUBLESIDEDDISKETTES*#‰IOSCALLƒFORMIOS(PC)‹FORMATTRACK0‰BNE‡IOERPRTREPORTERROR>‰MOVE.L„VDOSSEC-PBA(A4),D0„GET#OFVERSADOSSECTORSPERTRACK‰LSR.W…#1,D0‘DIVIDEBY23‰MOVE.L„D0,FORMIOS+IOSRRN-PBA(A4)BUMPPASTTRACK0FORMTRKA6‰MOVE.L„VDOSSEC-PBA(A4),D7„SETNUMBERSECTORS/TRACKSO*°ITCANBEADDEDLATERFORMTRK1%‰IOSCALLƒFORMIOS(PC)ƒFORMATTHETRACK*‰BNE.S…FORMTRK2‚BRANCHIFANERROROCCURED4‰ADD.L…D7,(FORMIOS+IOSRRN)-PBA(A4)FORMATNEXTTRACK‰BRA.S…FORMTRK1”*FORMTRK26‰CMP.B…#ISTARR,D0ŠENDOFDISKISONLYACCEPTABLEERROR&‰BNE‡IOERPRTƒBRANCHIFNOTENDOFDISKFORMEXITRTS.RETURN‰PAGE4*****************************************************.*ˆROUTINETOREADEACHSECTORONDISKANDMARK2*ˆSECTORALLOCATIONTABLEBITONIFREADINDICATES*ˆTHATTHESECTORISBAD*5***************************************************** DSKVALƒEQU* >‰LEAVALMSG2(PC),A0†NOTIFYUSERTHATWE'REVALIDATINGSECTORS.‰LEAVALMSG2E(PC),A1 ‰BSRSENDMSG ‰CLR.LD6;‰CLR.L‚RDSKIOS+IOSRRN-PBA(A4)MAKESUREWESTARTONTRACK03‰MOVE.LCNFBKADR-PBA(A4),A0PARAMETERBLOCKADDRESS-‰CMP.B‚#XDSFDK1 ,IOSDTP(A0)‚WORKINGONAFLOPPY"‰BNE.S‚DSKRDBRANCHIFAHARDDISK3‰BTSTW‚#IOADDEN,IOSATW(A0)‚ISFLOPPYDOUBLEDENSITY‰BEQ.S‚DSKRDBRANCHIFNOT*A*‚THISISADOUBLEDENSITYFLOPPY--ADJUSTREADBUFFERENDADDRESS *‚FORTRACK0*=‰MOVE.LRDSKIOS+IOSEAD-PBA(A4),-(A7)‚SAVEORIGINALBUFFEREND**‚FINDLENGTHOFBUFFER*7‰MOVE.LRDSKIOS+IOSEAD-PBA(A4),D0‚DIVIDEBUFFERINHALF"‰SUB.L‚RDSKIOS+IOSSAD-PBA(A4),D0‚*‰LSR.L‚#1,D0–**:*ˆADJUSTENDOFREADBUFFERFORFULLTRACKREADOFTRACK0*:‰ADD.L‚RDSKIOS+IOSSAD-PBA(A4),D0‚NEWENDOFBUFFERADDRESS#‰MOVE.LD0,RDSKIOS+IOSEAD-PBA(A4)‚*!‰IOSCALLRDSKIOS(PC)‡READTRACK0$‰BEQ.SƒDSKVAL1BRANCHIFALLISWELL(‰BSR…DSKRDCKCHECKFORSECTORTYPEERROR ‰TST.BƒD0†*,‰BNE…PRTIOƒNONRECOVERABLE--PRINT&TERMINATE3‰BSR…DSKSAT‚UPDATESATBECAUSEOFSECTORTYPEERRORDSKVAL10‰MOVE.L‚VDOSSEC-PBA(A4),D0ADJUSTFORNEXTTRACK>‰LSR.L‚#1,D0ƒDIVIDEBY2BECAUSETRACKZEROISHALFASLONGAS *§THEREST/‰MOVE.L‚D0,RDSKIOS+IOSRRN-PBA(A4)DONEXTTRACKC‰MOVE.L‚(A7)+,RDSKIOS+IOSEAD-PBA(A4)RESTOREORIGINALENDOFBUFFERDSKRD,‰MOVE.LVDOSSEC-PBA(A4),D6‚NEXTTRACKOFFSETO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84‰MOVE.W„#IOREAD,RDSKIOS-PBA(A4)*¦SETCOMMAND,FUNCTIONFORREAD+‰OR.W†#IOPECC,RDSKIOS+IOSOPT-PBA(A4)ŠALTTRK!*¦SETOPTIONTONORETRIES†ALTTRK'‰MOVE.L„ISSEVALUE-PBA(A4),RDSKS-PBA(A4)*¦SETSTARTADDRESSFORREAD)‰MOVE.L„ISSEVALUE-PBA+4(A4),RDSKE-PBA(A4)*¦SETENDADDRESSƒFORREAD *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;‰BSRDSKALTCHECKFIRSTABOUTTHEALTERNATETRACKS‚<>+‰IOSCALLRDSKIOS(PC)READONETRACKOFDISK ‰BEQ.SDSKAD#‰CMP.B#ISTAEOV,D0‚ATENDOFVOLUME ‰BEQDSKEXIT=‰CMP.B#ISTARR,D0ƒILLEGALRANDOMRECORDINDICATESENDOFDISK ‰BEQDSKEXIT*8‰TST.BALTUSE-PBA(A4)AREWEUSINGALTERNATES?„<>DSKRD1/‰BSRDSKRDCK“CHECKWHETHERERRORISRECOVERABLE,‰TST.BD0–(BADSECTOR).‚IFITISN'T,BRANCH. ‰BNEƒPRTIO“*‰BSR.S‚DSKSAT‘UPDATETHESAT1*ˆBRA.SDSKRD“12/15/83(BADBRANCHCOMMENTEDOUT)‰BRA.SDSKADA¦<>*,******************************************** *ˆENCOUNTEREDBADSECTORONREAD$*ˆTURNONBITINSATCORRESPTOADDR-**********************************2 *********** DSKSATƒEQU*4‰MOVEM.LD0-D7/A0-A7,-(A7)SAVEALLREGISTERS†ALTTRK ‰CLR.LD4<‰MOVE.LRDSKIOS+IOSRRN-PBA(A4),D6‚SAVEBADPHYSICALSECTOR# ‰MOVE.LD6,D0ŠSETUPFORCONVERT‰MOVE.L#8,D1Š*‰LEABADSECN(PC),A0‰*‰BSRBINDECFJŠCONVERTPSN*‰LEABADSEC(PC),A0‰SETUPFORSENDMESSAGE‰LEABADSECE(PC),A1ˆ*‰BSRSENDMSG‹TELLTHEUSER ‰MOVE.LD6,D5‰MOVE.L#1,D1Š#OFBADSECTORS*‰DIVU#2048,D5ƒGETSATSECTOR#‰MOVE.WD5,D4„GETPRIMEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84,*ˆADD.W‡#1,D4‡POSOFOFFSETOFSATFROMBASE1‰ADD.W‡#SATSTRT,D4POSOFOFFSETOFSATFROMBASE *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#‰CMP.LSAVESATL-PBA(A4),D4‚ERRORCK‰BLS.SDSKSATX ‰BSRDSKERR ‰BRASTOPE&DSKSATX‚MOVE.W#IOREAD,WDSKIOS-PBA(A4)!‰MOVE.LD4,WDSKIOS+IOSRRN-PBA(A4)*‰IOSCALLWDSKIOS(PC)‚READSATTABLESECTOR ‰BNEƒSATERR*DSKSATOK EQU *#‰SWAPD5‰GETREMAINDERINLOWWORDS ‰MOVE.WD5,D4‰AND.L#31,D4„SAVELOW31 ‰SUB.W#31,D4‰NEG.LD4ˆPOSFROMRIGHT(31-0) ‰CLR.LD2‰MOVE.WD5,D2„GETREMAINDER‰LSR.W#5,D2…DIVBY32‰LSL.W#2,D2…WORDPOSINSECTOR‰LEABUFFIO(PC),A0ƒINITSTART ‰MOVE.L0(A0,D2),D3‚EXTRACTWORD‰BSET.LD4,D3„TURNONBIT(‰BEQ.SDSKSATGD‚BRIFBITNOTALREADYSET%‰LEABADDUP(PC),A0ƒSETUPFORDUPMSG‰LEABADDUPE(PC),A1‚*‰BSRSENDMSG…DISPLAYMSG1‰ADD.L#1,RDSKIOS+IOSRRN-PBA(A4)BUMPPASTSECTOR‰BRA.SDSKSATQT¤ALTTRKDSKSATGD%‰MOVE.LD3,0(A0,D2)‚MOVEBACKTOBUFF‰MOVE.W#IOWRIT,WDSKIOS-PBA(A4)‰IOSCALLWDSKIOS(PC) ‰BNEƒSATERR*&‰BSRLOCKT‡ADDSECTORTOLOCKOUTTABLE1‰ADD.L‚#1,RDSKIOS+IOSRRN-PBA(A4)BUMPPASTSECTOR;DSKSATQTMOVEM.L(A7)+,D0-D7/A0-A7RESTOREREGISTERS‡ALTTRK‰RTSGOREADNEXTGROUP* DSKEXIT‚EQU*%‰TST.BFLOPPY-PBA(A4)‚FLOPPY?”ALTTRK"‰BNE.SDSKEXX‚YES,EXITNOW—ALTTRK2‰TST.BLOCKWRT-PBA(A4)‚ANYTHINGTOWRTINLOCKTAB‰BEQ.SDSKEX‰NO‰BSRWRTSLT¨ALTTRKDSKEX„BSRPRTSECT…PRINTTOTAL$‰BSRPRTSLTƒPRINTSLTENTRIES”ALTTRK,DSKEXXƒRTS‡RETURNFROMDISKVALIDATEROUTINE*5*****************************************************,*ˆCKFORD2D3E3E5ECED&EFERRORSIND0(*ˆTHESEERRORSCONTAINSECTOR#IIOSRRN*ˆFOROTHERSPRINTMSG5****************************************************** DSKRDCK‚EQU*‰CMP.B#$D2,D0‰BCS.SDSKRDEX…PRTERRMSG1‰BEQ.SDSKRDS†PROCBFLAGSATTABLEFORBADSECTOR‰CMP.B#$D3,D0 ‰BEQ.SDSKRDS‰CMP.B#$E3,D0‰BCS.SDSKRDEX ‰BEQ.SDSKRDS‰CMP.B#$E5,D0‰BCS.SDSKRDEX ‰BEQ.SDSKRDS‰CMP.B#$EC,D0‰BCS.SDSKRDEX ‰BEQ.SDSKRDS‰CMP.B#$ED,D0 ‰BEQ.SDSKRDS‰CMP.B#$EF,D0‰BNE.SDSKRDEXDSKRDSƒCLR.BD0 DSKRDEX‚RTS@*******************************************************„<DSKALTA‚MOVE.LRDSKIOS+IOSRRN-PBA(A4),D0„SAVETRACKNO.031285!‰MOVE.LD0,ALTSAVE-PBA(A4)…031285‰IOSCALLRDSKIOS(PC)éé2 éé‰BEQ.SDSKALTBGOODREAD"‰CMP.B#ISTAEOV,D0ENDOFVOLUME?‰BEQ.SDSKALTDYES8‰CMP.B#ISTARR,D0ILLEGALRANDOMRECORDMEANSWE'REDONE‰BEQ.SDSKALTDYES)‰CMP.B#ISTADME,D0ALREADYANALTERNATE?‰BEQ.SDSKALTBYES,ADDTOLIST$‰BSRDSKRDCKNO,CHECKONERRORTYPE‰TST.BD0ISITRECOVERABLE? ‰BNEPRTIONO2‰BSRDSKSATYES,BUTMAKEITUNAVAILABLETOSYSTEM‰BRA.SDSKALTC;DSKALTB‚MOVE.LRDSKIOS+IOSRRN-PBA(A4),(A1)+ADDTRKTOLIST:DSKALTC‚MOVE.LALTSAVE-PBA(A4),D0‚RESTORETRACKNO.‚031285(‰MOVE.LD0,RDSKIOS+IOSRRN-PBA(A4)‚0312853‰ADD.LD6,RDSKIOS+IOSRRN-PBA(A4)BUMPTONEXTTRACK ‰BRADSKALTA*=DSKALTD‚MOVE.BALTHDS-PBA(A4),D0NOWBACKOFFNUMBEROFHEADS7DSKALTE‚CLR.L-(A1)LASTCYLINDERSAVEDFORDIAGNOSTICS ‰SUB.B#1,D0‰BNEDSKALTENOTDONE/‰BSRBTTLOCKSETSATBITSFORALLOFALTERNATES2‰BSR.SBTTMAPFORMATALLSLTENTRIESTOALTERNATES<*ƒSETSTARTINGTRACKNUMBERBACKTO0FORMAINPARTOFDISK.‰CLR.LRDSKIOS+IOSRRN-PBA(A4)DSKALTX‚RTSRETURNTODSKVAL*>**************************************************************<*ƒFOREACHNON-ZEROENTRYINTHESECTORLOCKOUTTABLEFOUND,;*ƒAFORMATCOMMANDWILLBEISSUEDTOPOINTTOANALTERNATE.9*…A1SHOULDBEPOINTINGTOTHEENDOFTHEALTERNATETABLE *…SEEDSKALTB>************************************************************** BTTMAPƒEQU*éé‰LEATOTSLT(PC),A3‰LEAALTTBL(PC),A26*ƒSETUPD7TOBEPSNOFLASTSECTOROFTRACKSATUSES‰MOVE.L#SATSTRT,D6‰ADD.WSAVESATL-PBA(A4),D6 ‰SUB.L#1,D6 ‰BSRSLTTRK‰ADD.LVDOSSEC-PBA(A4),D6 ‰SUB.L#1,D6 ‰MOVE.LD6,D7<‰MOVE.W#IOPBAD,(FORMIOS+IOSOPT)-PBA(A4)SETOPTBITFORALT(BTTMAPA‚TST.L(A3)THISSLTENTRYZERO?‰BEQ.SBTTMAPXYES,DONE"‰CMP.LA2,A1ANYALTERNATESLEFT?"‰BLE.SBTTMAPCNO,ISSUEERRORMSG>*ƒFINDOUTIFSLTENTRYINTHESPACENEEDEDBYTHESAT.IFSO,;*ƒSKIPENTRY.‚ITMUSTHAVEGOTTENINSLTBYUSERPREVIOUSLY'*ƒWHENALTERNATEHANDLINGWASNOTUSED.‰CMP.L(A3),D7)‰BLT.SBTTMAPAAOK,ENTRYNOTINSATAREA‰ADD.L#6,A3SKIPENTRY ‰BRABTTMAPA?*ƒBEFOREUSINGANALTERNATE,SEEIFSLTISINTHEALTERNATETRK:BTTMAPAAMOVE.L(A3),D6‚SETUPREGISTERUSEDINSUBROUTINE+‰BSRSLTTRK‚COMPUTEBEGOFTRKSLTENTRYIN3‰CMP.L(A2),D6‚SLTENTRYINSAMETRKASALTERNATE?‰BNE.SBTTMAPBNO,CONTINUE8*ƒSWAPALTENTRIESSOWEDONTFORMATONETRACKTOITSELF‰MOVE.L4(A2),D0‰MOVE.L(A2),4(A2)‰MOVE.LD0,(A2)7BTTMAPB‚MOVE.L(A3)+,(FORMIOS+IOSRRN)-PBA(A4)BADTRACK/‰MOVE.L(A2),(FORMIOS+IOSALT)-PBA(A4)ALTTRACK6‰CLR.L(A2)+NOWCLEARITSOCAN'TBEUSEDAGAINLATER$‰ADD.L#2,A3SKIPRANGEINSLTENTRY3‰IOSCALLFORMIOS(PC)FORMATBADTRKTOPOINTTOALT‰BNEIOERPRTREPORTERROR‰BRABTTMAPAGETNEXTENTRY*5*ƒPREPAREERRORMESSAGE--NOMOREALTERNATESAVAILABLE*2BTTMAPC‚BSR.SALTMSGOT‚TOTOOUTPUTMESSAGE‚010485‰BRASTOPIT‚QUIT„010485 #AL3 TMSGOTLEAALTMSG(PC),A0¡<>‰RTS‚RETURN‚010485*+BTTMAPX‚MOVE.LBUFADR-PBA(A4),A3RESTOREA3 ‰RTSRETURN0**************************************************ƒMAKEEACHALTERNATETRACKUNAVAILABLETO)*ƒSYSTEMBYENTERINGEACHSECTORINTOSAT0************************************************ BTTLOCK‚EQU*-‰MOVEM.LD0-D7/A0-A7,-(A7)SAVEALLREGISTERS9‰MOVE.LBUFADR-PBA(A4),A3SETA3TOPOINTTOINPUTBUFFER‰LEAALTTBL(PC),A2%BTTLOCKA MOVE.L (A2)+,LOCKPSN-PBA(A4)&‰MOVEM.LD6/A1-A2,-(A7)SAVEREGISTERS‰MOVE.WD6,LOCKRNG-PBA(A4) ‰BSRUPDSAT)‰MOVEM.L(A7)+,D6/A1-A2RESTOREREGISTERS‰CMP.LA2,A1ALLDONE?‰BGTBTTLOCKANO,‰MOVEM.L(A7)+,D0-D7/A0-A7RESTOREREGISTERS-‰MOVE.LD0,RDSKIOS+IOSRRN-PBA(A4)RESTORERRN9‰MOVE.LISSEVALUE-PBA(A4),RDSKS-PBA(A4)STARTLOCOFREAD9‰MOVE.LISSEVALUE-PBA+4(A4),RDSKE-PBA(A4)ENDLOCOFREAD,‰MOVE.W#IOREAD,RDSKIOS-PBA(A4)READCOMMAND‰RTSRETURN¨ALTTRK>>‰PAGE.***********************************************(*†ENTER‚LOCKOUTENTRIESINLOCKOUTTABLE*.*********************************************** LOCKOUT‚EQU*)‰TST.BZEROFLAG-PBA(A4)…ISDISKUSERZERO‰BEQ‚LOCKOEX‡NO‰LEALOCKST(PC),A0¡<> LOCK2„LEALOCKM(PC),A0‰LEALOCKME(PC),A1*‰BSRSENDMSGI…DOTHEYWANTALOCKOUTENTRY‰IOSCALLINP3IOS(PC) ‰BNEIOERPRT ‰BSRSBARG ‰BNEIOERPRT‰CMP.B#'Y',ANSWER-PBA(A4)‰BNEƒLOCKOEXNO ‰BSRVALCLR7‰MOVE.LCNFBKADR-PBA(A4),A0‚GETCONFIGPOINTER<<0104855‰MOVE.LIOSRSZ(A0),TOTSECS-PBA(A4)‚SAVETOTALSECTORS ‰CLR.LD0‰MOVE.BIOSHDS(A0),D0‰MULU#MAXBAD,D09‰MOVE.BD0,TOTALTS-PBA(A4)SAVETOTALALTERNATES‚010485>>$‰BSRCNTSLTŠCOUNTSLTENTRIES‚011085LOCKOUT1 LEA LOCKQ(PC),A0‰LEALOCKQE(PC),A1‰BSRSENDMSGIŽGETSTARTSECTOR‰BSRNUMCVTRECANSWER ‰TST.LD11‰BPL.SLOCKCHK‡GOODCONVERSION,CHECKSIZE010485‰CMP.B#CR,D1ˆCARRAGERETURN‰BEQLOCKSATEˆEXIT$‰CMP.B#'',D1‡SPACETERMINATESALSO‰BEQLOCKSATEˆEXIT"LOCKERƒBSRINVALESENDINVALIDMSG‰BRALOCKOUT1ŽTRYAGAIN :LOCKCHK‚CMP.LTOTSECS-PBA(A4),D3‚NUMBERTOOBIG?ƒ<<010485%‰BGE.SLOCKER‚YES,TRYAGAIN‚010485>>#‰MOVE.LD3,LOCKPSN-PBA(A4)SAVEPSN8‰TST.BALTUSE-PBA(A4)AREWEUSINGALTERNATES?„<>#LOCKGONELEANOALTS(PC),A0ƒ<<022585‰LEANOALTSE(PC),A1!‰BSRSENDMSG‰OUTPUTERRORMESSAGE‰BRA.SLOCKSATE†EXIT‚022585>>**LOCKOUT2 LEA LOCKN(PC),A0 GET # OF SECTORS‰LEALOCKNE(PC),A1‰BSRSENDMSGIŽSENDMSG‰BSRNUMCVTRECANSWER(‰TST.WƒD3”0SECTORSISANINVALIDENTRY. ‰BEQ…LOCKER‰CMP.B#'',D1‰BHILOCKERBAD*‰MOVE.WD3,LOCKRNG-PBA(A4)SETUPFORCALL‰BSRUPDSATŠDOSATUPDATE$‰BEQ.SDOLOCKˆBRIFUPDATEDCORRECTLY ‰BSR.SLOCKMSG‰SETUPMSG’ALTTRK ‰BRALOCKOUT1ˆASKFORNEXTENTRYDOLOCK;‰MOVE.LLOCKPSN-PBA(A4),D6‚SETUPFORENTRYINTOLOCKTABLE‰MOVE.WLOCKRNG-PBA(A4),D1ˆ*+‰BSRLOCKTŠ****‚PUTENTRYINLOCKTABLE‚***%‰BEQLOCKOUT1‚GETNEXTENTRY–<> 1LOCKSATETST.BWSATFLAG-PBA(A4)†ANYTHINGTOWRITE‰BEQ.SLOCKOEXX†NO&‰BSRSATWRIT‰WRITEOUTLASTSATSECTOR3LOCKOEXXTST.BLOCKWRT-PBA(A4)‡ANYTHINGINLOCKTAB‰BEQ.SLOCKOEX‡NO‰BSRWRTSLT¨ALTTRK* LOCKOEX‚EQU*‰RTS‘***ƒEXITLOCKOUTƒ****-*ˆ*****ƒROUTINETOTURNOFFBITSINSATTABLE* LOCKSAT‚EQU*‰BSRSATSECT‰GETSATINBUFFER‰LEAVALBUF(A3),A09LOCKSAT1 TST.B SUBFLAG-PBA(A4) SET UP FOR SUBROUTINE CALL)‰BEQ.SCALCHKŠBRIFCALLTOCHECKSATBITS)‰BSR.SSATSETB‰GOTOSETSATBITSROUTINE‰BRA.SLOCKCONTCALCHK‰BSR.SCHKBITSLOCKCONT‰BNE.SLCKSATEXˆBRIFALREADYON‰SUB.W#1,D1‰DECTOTAL•ALTTRK‰BNE.S‚LOCKSAT3ˆGETNEXT!‰BSRSATWRIT‰WRITEOUTS4 ATSECTORLCKSATEX ‰RTS‘EXITLOCKSAT3‚EQU*‰ADD.L#1,D6‰ADDTOPSN%‰CMP.W#2047,D5†ATLASTBITOFSECTOR‰BCS.SLOCKSAT2†NO*…WRITEOUTSAT ‰BSRSATWRIT‰BRALOCKSAT‰DONEXTBITLOCKSAT2‰ADD.W#1,D5‰INCFORNEXTBIT‰BRA.SLOCKSAT1** *‡UPDATESAT**UPDSAT#‰MOVE.LLOCKPSN-PBA(A4),D6ˆINITPSN%‰MOVE.WLOCKRNG-PBA(A4),D1ˆINITRANGE/‰CLR.BSUBFLAG-PBA(A4)SETCHKBITSROUTINECALL%‰BSRLOCKSAT‰CHECKRANGEOFNEWENTRY-‰BNE.SUPDSAT1‰BRIFSECTORSALREADYALLOCATED#‰MOVE.LLOCKPSN-PBA(A4),D6ˆINITPSN%‰MOVE.WLOCKRNG-PBA(A4),D1ˆINITRANGE:‰MOVE.B#$FF,SUBFLAG-PBA(A4)SETSETSATBITSROUTINECALL ‰BSRLOCKSAT‰CLR.LD2ŒSETGOODRETURNUPDSAT1 ‰RTS‘EXIT*4****************************************************%*ˆROUTINETOSETBITSONINSATTABLE4*****************************************************SATSETB‚CLR.LD3 ‰MOVE.WD5,D3‰DIVU#8,D3ŠGETBYTE‰MOVE.WD3,A1ˆSAVELOC‰SWAPD3GETREMAINDER‰MOVE.L#8,D4ˆINIT ‰ADD.W#1,D3(‰SUB.WD3,D4‰NEGATEFORREVNUMBOFBITS‰BSET‚D4,0(A0,A1.W)ƒTURNONBIT‰RTS**$*…CHECKFORSECTORALREADYALLOCATED**CHKBITS‚CLR.LD3 ‰MOVE.WD5,D3‰DIVU#8,D3ŠGETBYTE‰MOVE.WD3,A1ˆSAVELOC‰SWAPD3GETREMAINDER‰MOVE.L#8,D4ˆINIT ‰ADD.W#1,D3(‰SUB.WD3,D4‰NEGATEFORREVNUMBOFBITS ‰BTST‚D4,0(A0,A1.W)ƒTESTTHEBIT‰RTS8********************************************************(*ˆROUTINETOREADTHECORRECTSATSECTOR*ˆD6HASTHEPSNOFTHESECTOR)*ˆINTOVALBUF‰RETURNWITHREMAINDERIND5*ˆD0=-1MEANSERROR*ˆD6ISNOTCHANGED-*ˆD5CONTAINSPOSITIONINSECTORUPONLEAVING8*********************************************************+SATSECT‚MOVE.B#1,WSATFLAG-PBA(A4)‚SETFLAG ‰CLR.LD4 ‰MOVE.LD6,D5‰DIVU#2048,D5‡GETWHOLESAT ‰MOVE.WD5,D4!‰ADD.W#SATSTRT,D4‰ADDFOROFFSET.‰CMP.LSAVESATL-PBA(A4),D4ƒCKFOROUTOFRANGE‰BLS.SSATS1‹GOOD‰BSRDSKERRŠPRTERRMSG‰BRA.SSATEX‹EXITSATS1‰SWAPD5GETREMAINDER2‰BSR.SSATREAD‰READSECTOROFSATD4MUSTHAVEPSN* SATEX„RTS*1*************************************************'*ˆD4MUSTCONTAINPSNFORSTARTOFREAD1**************************************************3SATREAD‚MOVE.LD4,RDSKIOS+IOSRRN-PBA(A4)„PSNOFSAT‰MOVE.W#IOREAD,RDSKIOS-PBA(A4)&‰STOREVALBUFE(A3),RDSKE‰ESTABLISHEND‰STOREVALBUF(A3),RDSKS‰IOSCALLRDSKIOS(PC)‚READSAT ‰BNEƒSATERR‰RTS #************************************ˆSUBROUTINETOWRITESAT*ˆRRNMUSTBEALREADYSETUP#***********************************-SATWRIT‚CLR.BWSATFLAG-PBA(A4)ˆCLRWRITEFLAG‰MOVE.W#IOWRIT,RDSKIOS-PBA(A4)‰STOREVALBUF(A3),RDSKS‰STOREVALBUFE(A3),RDSKE‰IOSCALLRDSKIOS(PC) ‰BNEƒSATERR‰RTS*9*********************************************************5*…ROUTINETOGETRESPONSEANDCONVERTINPUTTOBINARY9**********************************************************/*‰THISROUTINEINPUTSAHEXORDECIMALNUMBER,+*‰CONVERTSITINTOBINARY.UPONRETURN,IFA-*‰SPACEOFCRFOLLOWEDTHEENTEREDINPUTTHEN4*‰D1WILLCONTAINTHECHARACTERFOUNDONTERMINATION4*‰INLOWERWORD.IFOTHERTHANASPACEOFCR,ORJUST5*‰ACRWASENTERED,THENBIT31WILLBESET,WITHTHE *‰CHARACTERSTILLINLOWERWORD.** NUMCVTƒEQU*ŠIOSCALLINP5IOS(PC) ŠBNEIOERPRT ŠBSRSBARG ŠBNEIOERPRT ŠBSREND50ŠLEADESCANS(PC),A0ŒFIRSTLOCATIONOFENTRYDATA*ŠCMP.B#'',(A0)‹ISFIRSTINPUTA'SPACE'?ŠBNE.SNORM’BRANCHIFNO/ŠMOVE.L#$FFFFFFFF,D1†MOVEERRORTOD1ANDEXIT ŠBRA.SOUTTJNORM†BTST#VOPTR,OPTFLG-PBA(A4)ISTHEVOPTIONROUTINEUSINGTHISROUTINEŠBEQ.SCNVT’BRANCHIFNO:ŠCMP.B#'$',(A0)„DOLLARSIGNTHEREALREADY?ƒSPR839101984'ŠBEQ.SCNVT‰YES,CONTINUE‘SPR839101984=ŠLEADESCAN$+1(PC),A0ŠSINCEVOPTIONUSING,INPUTISALWAYSH&*£SOSTUFFA'$'BEFOREENTEREDSTRING)CNVT†BSRASCVALCALLASCIITODECROUTINE1ŠCMP.B#CR,D1ŽWASACRTHETERMINATIONCHARACTER?ŠBEQ.SOUTT’BRANCHIFYES7ŠCMP.B#'',D1WASA'SPACE'THETERMINATIONCHARACTER?ŠBEQ.SOUTT’BRANCHIFYE4 S:ŠOR.L#$80000000,D1ˆSETBIT31TOSHOWINVALIDTERMINATIONOUTT†RTS<****************************************************<<011085*!*ˆROUTINETOCOUNTENTRIESINSLT#*ŠResult(ALTSUSED)neededbyLOCKT#*Šwhendealingwithalternatetrack *Šentries.*4****************************************************CNTSLT:‰LEATOTSLT(PC),A0 ‰CLR.BD0 CNTSLTA‚TST.L(A0)+‰EMPTYENTRY?‰BEQ.SCNTSLTB‡YES,DONE‰ADD.B#1,D0‰ADD1TOCOUNTER!‰ADD.L#2,A0‰SKIPLENGTHOFENTRY‰BRACNTSLTA‰CHECKNEXTENTRY4CNTSLTB‚MOVE.BD0,ALTSUSED-PBA(A4)‚UPDATETOTALUSED‰RTS‘RETURN‚011085>>‰PAGEJ*****************************************************************‚<SLTUPCƒMOVE.LALTSAVE-PBA(A4),FORMIOS+IOSRRN-PBA(A4)BADTRACK6‰MOVE.W#IOPBAD,FORMIOS+IOSOPT-PBA(A4)OPTBITFORALT3‰IOSCALLFORMIOS(PC)‚FORMATBADTRKTOPOINTTOALT‰BNEIOERPRT‰ERROR:*…NOWWRITEOUTBUFFERTOOLDTRACK(REALLYTHEALTERNATE)0‰MOVE.W#IOWRIT,RDSKIOS-PBA(A4)‚PREPARETOWRITE5‰MOVE.LISSEVALUE-PBA(A4),RDSKS-PBA(A4)‚BEGOFBUFFER9‰MOVE.LALTSAVE-PBA(A4),RDSKIOS+IOSRRN-PBA(A4)BEGOFTRK‰IOSCALLRDSKIOS(PC)‰BNEIOERPRT‰ERROR‰BRALOCKOUT1ˆGETNEXTENTRY*-*…COMPUTEBEGINNINGOFTHETRACKSLTENTRYINé%*ˆENTER:D6CONTAINSPSNOFSLTENTRY3*ˆEXIT:D6CONTAINSPSNOFBEGOFTRKSLTENTRYIN* SLTTRKƒEQU*‰MOVE.LD3,-(A7)SAVED3 ‰MOVE.LD6,D3‰DIVUVDOSSEC+2-PBA(A4),D6‰MOVE.W#0,D6‚CLEARQUOTIENT‰SWAPD6‚GETREMAINDER ‰NEG.LD6"‰ADD.LD3,D6‚SUBQUOTIENTFROMPSN‰MOVE.L(A7)+,D3‚RESTORED3 ‰RTS‚RETURNŠPAGE8********************************************************0*‰ROUTINETOPUTANENTRYINTHELOCKOUTTABLE..*‰IFUSINGALTERNATESECTORCAPABILITY,NOSAT-*‰INDICATORSWILLBESET.INSTEAD,SEARCHFOR.*‰DUPLICATEOROVERLAPPINGSLTENTRIESWILLBE!*‰DONEHEREBEFOREADDINGTOSLT.*‹D6CONTAINSPSNSTART*‹D1CONTAINSNUMBEROFSECTORS*‰ALLREGSSAVEDANDRESTORED-*‹NON-ZEROINDICATORSETONEXITIFDUPLICATE *‹OROVERLAPCONDITIONISFOUND.8********************************************************* LOCKT„EQU*-‰MOVEM.LD0-D7/A0-A7,-(A7)SAVEALLREGISTERS!‰CLR.LD0‚INITD0FORGOODRETURN!‰TST.BFLOPPY-PBA(A4)†FLOPPYDISK‰BNE.SLOCKTEXYES*‰LEATOTSLT(PC),A01‰TST.BALTUSE-PBA(A4)‚USINGALTERNATES?‚<<010485‰BEQ.SLOCKT1‚NO,CONTINUE‰MOVE.BALTSUSED-PBA(A4),D2)‰CMP.BTOTALTS-PBA(A4),D2‚USEDTHEMALL?‰BLT.SLOCKT1‚NO,CONTINUE‰MOVE.B#$FF,D0‚YES,SETFLAG‰BRA.SLOCKTEX‚EXIT—010485>>LOCKT1ƒMOVE.L(A0)+,D0OLDLOW"‰BEQ.SLOCKT2EMPTY,ADDNEWENTRY ‰CLR.LD2‰MOVE.W(A0)+,D2 ‰ADD.LD0,D2‰SUB.L#1,D2OLDHIGH ‰CMP.LD2,D62‰BGTLOCKT1NEWLOWGTOLDHIGH,OKCHKNEXTENTRY*!‰MOVE.LD6,D3‚PRESEVERD6,USED3 ‰ADD.LD1,5 D3‰SUB.L#1,D3NEWHIGH ‰CMP.LD0,D32‰BLSLOCKT1NEWHIGHLTOLDLOW,OKCHKNEXTENTRY*%‰MOVE.B#1,D0SETERRORFLAGANDEXIT‰BRA.SLOCKTEX*+LOCKT2ƒSUB.L#4,A0POINTTOAVAILABLEENTRY)‰MOVE.B#1,LOCKWRT-PBA(A4)SETWRITEFLAG‰MOVE.LD6,(A0)‰PSN‰MOVE.WD1,4(A0)ˆNUMBER.‰ADD.B#1,ALTSUSED-PBA(A4)‚UPDATECOUNT‚010485‰CLR.BD0GOODEXIT* LOCKTEX‚EQU*,‰MOVEM.L(A7)+,D0-D7/A0-A7RESTOREREGISTERS‰RTS—RETURNFROMLOCKTROUTINE‰PAGE/************************************************ˆWRITEENTIRESLT/************************************************ WRTSLTƒEQU*‰IOSCALLWDSKSLT(PC) ‰BNEIOERPRT'‰CLR.BLOCKWRT-PBA(A4)CLEARWRITEFLAG ‰RTS¯ALTTRK>>/************************************************ˆWRITEOUTLOCKIOSECTOR/************************************************ WRTLOCK‚EQU*‰IOSCALLLOCKIOS(PC) ‰BNEIOERPRT‰RTS‰PAGE /*************************************************ˆDIAGNOSTICAREAPROCESSING*’A=TOTALSECTORS*’B=SECTORSPERTRACK*’C=#OFCYLINDERS*’D=B*C=SECTORSPERSIDE*’E=…A/DNOOFSIDES=*ˆHEADSORSIDES=TOTALSECTOR/SECTORSPERTRACK*CYLINDERS*’E„=†A†/‡BŠ*…C*’F„=‚SECTORS/CYLINDER=E*B$*’G„=‚1STPSNOFCYLƒ=‚CYL#*E*B)*’H„=‚1STPSNOFLASTCYL=(C-1)*E*B**’SATUSESVALBUF*’TRACKWRITEUSESHARDBUF*’VIDUSESVIDIOBUFF*’DIAGNOSTICTABLEUSESLOCKIO0*************************************************DIAGAREA EQU *$‰TST.BZEROFLAG-PBA(A4)‚ISDISKZERO‰BEQDIAGEXŠNOŠLEADIAGM(PC),A0ŠLEADIAGME(PC),A1,ŠBSRSENDMSGI…DOTHEYWANTADIAGNOSTICAREAŠIOSCALLINP3IOS(PC) ŠBNEIOERPRT ‰BSRSBARG ‰BNEIOERPRTŠCMP.B#'Y',ANSWER-PBA(A4)ŠBNEDIAGEXNOŠBSRLOCKCLRˆDIAGTABLEAREA DIAG…EQU*#‰LEACYLM(PC),A0‰REQ#OFCYLINDERS‰LEACYLME(PC),A1 ‰BSRSENDMSGI ‰BSRNUMCVT‰TST.LD3ŒCKFORZERO ‰BEQDIAGŒYES‰TST.LD1ŒCKFORERR‰BPL.SDIA2ŒGOODDIAER„BSRINVALEŠERRORMSG ‰BRADIAG1DIA2…MOVE.WD3,SAVCYL-PBA(A4)„SAVE#OFCYLINDERS*'‰LEASECNM(PC),A0ˆREQSECTORS/TRACKMSG‰LEASECNME(PC),A1 ‰BSRSENDMSGI ‰BSRNUMCVT ‰TST.LD3 ‰BEQDIAER ‰TST.LD1‰BPL.SDIA4ŒGOOD‰BRADIAER‹ERROR5DIA4…MOVE.WD3,SAVSEC-PBA(A4)„SAVE#OFSECTORS/TRACK)‰MOVE.WSAVCYL-PBA(A4),D6„RESETCYLINDERS‰MULUD3,D6ŠSECTORSPERHEAD.‰MOVE.LD6,SAVSIDE-PBA(A4)ƒSECTORSONONESIDE2‰MOVE.LDCPBLK+IOSRSZ-PBA(A4),D3‚GETTOTALSECTORS(‰DIVUD6,D3ŠLOWWORDCONTAINS#OFHEADS‰SWAPD3IFAREMAINDEREXISTS ‰TST.WD3ŒTHEINPUTWASINERROR‰BEQ.SDIAGINPGˆBRIFOK‰BSRINVALEŠINVALIDINPUT!‰BRA.SDIAGŠGETTHECORRECTINPUTDIAGINPG‰SWAPD3RESTOREREGISTER5‰MOVE.WD3,SAVHEAD-PBA(A4)ƒ#OFSIDESFORDISKSYSTEM ‰CLR.LD0‰MOVE.WD3,D0ˆINITHEAD# ‰CLR.LD1$‰MOVE.WSAVSEC-PBA(A4),D1„SECT/TRACK ‰MULU‚D0,D1,‰MOVE.L‚D1,SAVSECCY-PBA(A4)ƒSECTORS/CYLINDER6‰MOVE.L‚D1,FPSN-PBA(A4)‡1STPSNOFCYLINDER1(2NDCYL) ‰CLR.L‚D2‰MOVE.WSAVCYL-PBA(A4),D2‰SUB.W#1,D2“POSFORLASTCYL ‰MULUD2,D10‰MOVE.LD1,LPSN-PBA(A4)ˆ1STPOSOFLASTCYLINDER*C*******************************************************************;*ƒALLOCATEDIAGNOSTICBUFFERANDFILLWILTHDIAGNOSTICDATA/*ƒTOBEREADINTODIAGNOSTICTESTAREAONDISK.C********************************************************************>*‚CALCULATEAMOUNTOFMEMORYNEEDEDFORBUFFERANDGETMEMORY.*E‰MOVE.W‚#$2000,MSBDIAG+8-PBA(A4)‚SEG.DIRECTIVE(NOMEMORYAVAILRET),‰MOVE.W‚SAVSEC-PBA(A4),D0Š#OFSECTORS/TRACK.‰MULU.W‚#SECLEN,D0‰PRODUCTGIVESMEMORYLENGTH%‰MOVE.L‚D0,DIAEND-PBA(A4)‚SAVELENGTH7‰MOVE.L‚D0,MSBDIAG+20-PBA(A4)†STUFFLENGTHINMSBTABLEDIABUFF3MOVE.L‚#GTSEG,D0)‰LEA…MSBDIAG(PC),A0‰GETSEGMENTOFMEMORY‰TRAP„#1+‰BEQ.SƒDIABUFF1‹BRANCHIFNOERRORSOCCURED#‰CMP.Wƒ#8,D0ŽPHYSICALMEMORYERROR?‰BEQ.SƒDIABUFF2‹BRANCHIFYES9‰LEA…SEGAL(PC),A0‹OUTPUTSEGMEMTALLOCATIONERRORMESSAGE‰LEA…SEGALE(PC),A1 ‰BSR…SENDMSG‰BRA…STOPIT****EXIT*****3DIABUFF2LEA…TMSG(PC),A0ŒMEMORYUNAVAILABLEMESSAGE‰LEA…TMS6 GE(PC),A1 ‰BSR…SENDMSGA‰MOVE.W‚#$2400,MSBDIAG+8-PBA(A4)‚SEGDIR.(WAITFORMEMORYAVAIL) ‰BRA…DIABUFF3@DIABUFF1CMP.Wƒ#$2000,MSBDIAG+8-PBA(A4)‚ISFIRSTTIMEALLOCATED?‰BEQ.SƒDIABUFF4‹BRANCHIFYES1‰LEA…T1MSG(PC),A0‹OUTPUTMEMORYALLOCATEDMESSAGE‰LEA…T1MSGE(PC),A1 ‰BSR…SENDMSGIDIABUFF4MOVE.L‚A0,DIASTRT-PBA(A4)SAVEBASEADDRESSOFDIAGNOSTICBUFFER*"*‚FILLDIAGNOSTICBUFFERWITHDATA*-‰MOVE.L‚A0,D0ŽCALCULATEENDADDRESSOFBUFFER‰ADD.LƒDIAEND-PBA(A4),D0"‰SUB.Lƒ#1,D0ŽENDADDRESSOFBUFFER4‰MOVE.L‚D0,DIAEND-PBA(A4)‚SAVEENDADDRESSOFBUFFER.RNDNUMƒMOVE.L‚#$FFFFFFFF,D1†SETMAXIMUMNUMBER$‰BSR…RANDOMDORANDOMNUMBERROUTINE'‰MOVE.L‚D0,(A0)+‹STORENUMBERINBUFFER)‰CMP.LƒDIAEND-PBA(A4),A0ŠBUFFERFULLYET?‰BLE.SƒRNDNUMBRANCHIFNO*,*‚SETUPVIDWITHDIAGNOSTICTABLEDIRECTORY*‰LEAVIDIO(A3),A5*‰MOVE.LVIDSLT(A5),D5…PSNOFLOCKOUTTABLE-‰ADD.L#LOCKSN,D5ŽESTABSECTORLOCKFORTABLE‰MOVE.L#SATSTRT,D4’PSNOFSAT‰BSRSATREAD“READSATSTART&‰LEAVALBUF(A3),A0‡STARTOFBUFOFSAT4DIAGGSƒBSRSATSETBŠPUTBITONINSATFORDIAGSECTOR&‰BEQ.SDIAGBOK‰GOOD-BITNOTPREVSET‰ADD.L#1,D5‰SETFORNEXT&‰CMP.L#2048,D5†HAVEWEEXCEEDEDTRACK‰BCSDIAGGSŠNO‰LEABADSM+4(PC),A0 ‰BSRPRTSECTEˆPRTBADSECTORMSG‰BRASTOPIT…**‚EXIT***ˆGOOD/DIAGBOK‚MOVE.LD5,VIDDTA(A5)ŠPSNOFDIAGDIRECT5‰MOVE.LD5,LOCKIOS+IOSRRN-PBA(A4)PSNTOPARMFORWRT‰BSRSATWRIT‰WRTOUTTHESAT*1*ˆALLOCATE2TRACKSPERSIDEFORDIAGNOSTICNEEDS,*ˆMUSTBECLOSESTTOSTART&ENDASPOSSIBLE%*ˆALLBITSMUSTBEOFFFORTHISTRACK*‰MOVE.WSAVSEC-PBA(A4),D2*DIALOPƒTST.BPOSITION-PBA(A4)†SIDEPOINTER‰BNE.SDIASŠSIDE2&‰MOVE.LFPSN-PBA(A4),D6†INIT1STTRACK‰BRA.SDIANXTˆCKBITINSAT+DIAS…MOVE.LLPSN-PBA(A4),D6†INITLASTTRACK*-**********************************************ˆTESTBITSINSATFORTRACK-********************************************* DIANXTƒEQU**ˆD6=STARTPSN ‰BSRDIASATB ‰TST.LD0‰BPL.SDIA5ŒGOOD)DIANXT1‚TST.BPOSITION-PBA(A4)ƒWHICHPART‰BNE.SDIANXT2‡LAST)‰ADD.LSAVSECCY-PBA(A4),D6ƒGETNEXTTRACK ‰BRAƒDIANXT)DIANXT2‚SUB.LSAVSECCY-PBA(A4),D6ƒBACKUP ‰BRAƒDIANXT2DIA5…MOVE.LD6,RDSKIOS+IOSRRN-PBA(A4)‚PSNTOTABLE2‰BSRWRTTRK”**WRITETRACKOFDIAG.DATATODISK**‰BEQ.SDIASB‰DONEXT"‰CMP.B#ISTAEOV,D0ƒHITENDOFFILE‰BEQIOERPRT‰YES#‰BSRDSKRDCK‰GOTOCKERRORROUTINE‰TST.BD0ŒCKFORERRORTYPE‰BEQDIANXT1‰GETNEXTTRACK"‰BRAPRTIO‹PRINTERROR&TERMINATE *‰TURNONBITSINSATTABLE DIASB„EQU*‰MOVE.B#1,BSTFLAG-PBA(A4)‰BSR.SDIASATB‰CLR.BBSTFLAG-PBA(A4)0*************************************************’PUTENTRYINDIAGNOSTICTABLE0*************************************************’DONEXTTRACK‰LEALOCKIO(A3),A0‡TABSTART)‰MOVE.WDIAIP-PBA(A4),D0…LOCWITHINTABLE*"*ƒSTOPIFENTRYWON'TFITINTABLE**‰LEA5(A0,D0.W),A1…A1=ADDROFENDOFENTRY#‰LEALOCKIOE(A3),A2ˆA2=ENDOFTABLE ‰CMP.LA2,A1‰BHI.SDIAS3WON'TFIT"‰MOVE.LD6,0(A0,D0.W)‚MOVEPOINTER'‰MOVE.WD2,4(A0,D0.W)‚MOVESECTOR/TRACK#‰ADD.W‚#6,DIAIP-PBA(A4)…INCPOINTER"‰TST.BPOSITION-PBA(A4)†WHICHSIDE1‰BNE.SDIAS2‰SIDE2FLAGSET(JUSTFINISHEDSIDE1) *’DOSIDE2/‰ADD.LD2,FPSN-PBA(A4)ƒRESETFPSNFORNEXTSIDE6‰MOVE.B#1,POSITION-PBA(A4)„SETENDTRACKOFSIDEFLAG‰BRADIALOP’CONTINUE2DIAS2„CLR.BPOSITION-PBA(A4)ˆSETFORSTARTOFSIDE/‰ADD.LD2,LPSN-PBA(A4)RESETLPSNFORNEXTSIDE‰SUB.W#1,SAVHEAD-PBA(A4)‰BNE‚DIALOP‘GETNEXT,DIAS3„BSRWRTLOCK‰WRITEOUTDIAGNOSTICTABLE*&DIAGEXƒRTS‘***‚EXITFROMDIAGAREA‚*****0************************************************-*ˆROUTINETOCHECKFORNOBITSONFORATRACK*ˆANDIN‚PASS2TURNONBIT*ˆD2=SECTORS/TRACK*ˆD6=STARTPSN2*************************************************** DIASATB‚EQU* ‰BSRSATSECT‰GETSATINTOMEMORY$*’D5=POSITIONWITHINTRACKINWORD‰AND.L#$FFFF,D5ˆCLEARHIWORD ‰MOVE.LD2,D1‰LEAVALBUF(A3),A0DIASATL‚MOVE.LD5,D3 ‰DIVU#8,D3‰MOVE.WD3,A1ˆBASEPOSIT6 ION‰SWAPD3 ‰MOVE.L#8,D4 ‰ADD.W#1,D3‰SUB.WD3,D4‰BEGFORBIT'‰TST.BBSTFLAG-PBA(A4)TESTORSETCOND‰BEQ.SDIASATBT*‰SETBITINSAT‰BSETD4,0(A0,A1.W)‰BRA.SDIASATT‡CONT*TESTBITINSATDIASATBT EQU *‰BTSTD4,0(A0,A1.W)‰BEQ.SDIASATT‡BITWASCLR*‰ERRORCONDITION‰MOVE.L#-1,D0‰BRA.SDIASATEXˆEXIT!DIASATT‚SUB.L#1,D1‰DECBITCOUNT‰BNE.SDIASATC‰OKGETNEXT*DONE‰TST.BBSTFLAG-PBA(A4)‡PASSONE!‰BEQ.SDIACLD0‡YESDONOTWRTSAT‰BSRSATWRIT‰WRITEOUTSATDIACLD0‚CLR.LD0‰BRA.SDIASATEXˆEXIT!DIASATC‚ADD.L#1,D5‰MOVEUPTRACK‰CMP.L#2048,D5†ATENDOFASAT‰BCSDIASATL‰NOCONT'‰TST.BBSTFLAG-PBA(A4)TESTBITSPASS1‰BEQ.SDIAW2‰YES‰BSRSATWRIT‰WRITESAT*ŽGETNEXTSATINBUFF&DIAW2„MOVE.LRDSKIOS+IOSRRN-PBA(A4),D4‰ADD.L#1,D4‰INCFORNEXTSAT‰BSRSATREAD‰READNEXTSAT$‰LEAVALBUF(A3),A0‡RESETBUFPOINTER‰BRADIASATLCONTINUE*DIASATEXRTS‘RETURN*-*********************************************2*ˆROUTINETOWRITEDIAGNOSTICBUFFERTODIAGNOSTIC*ˆTRACKSONTHEHARDDISK.-**********************************************%WRTTRKƒMOVE.W#IOWRIT,RDSKIOS-PBA(A4)@‰MOVE.LDIASTRT-PBA(A4),RDSKS-PBA(A4)‡STARTINGADDRESSOFBUFFER=‰MOVE.LDIAEND-PBA(A4),RDSKE-PBA(A4)ˆENDINGADDRESSOFBUFFER‰IOSCALLRDSKIOS(PC)‰RTS‰PAGE/*************************************************ˆVERSADOSPROCESSING*/************************************************VERSAREA EQU *$‰TST.BZEROFLAG-PBA(A4)ISDISKZERO‰BEQVERSEXŠNO‰BSRWVIDŒWRITEOUTPARTIALVID‰BSRCLOOUTŠCLOSEVOLUMEASSIGN6‰MOVE.W#FHFDV,INFHS-PBA(A4)ƒWHEREISSYSTEMDISKCALL&‰MOVE.W#FOPDSY,INFHS+2-PBA(A4)‚OPTION‰FHSCALLINFHS(PC) ‰BNEƒIOERPRT%*************************************#*‡****‚TEMPPLUGOFSYSVOLUME‚****%*************************************,VERSAN0‚MOVE.B#DSKLUVI,INFHS+FHSLUN-PBA(A4)(‰MOVE.W#FHASGN,INFHS-PBA(A4)‚SETASSIGN7‰MOVE.W#FHALLO+FHASGN,OUTFHS-PBA(A4)‚ALLOCATE&ASSIGN*‰MOVE.W#FOPPR,INFHS+2-PBA(A4)PUBLICREAD8‰MOVE.LVIDIO(A3),OUTFHS+FHSVOL-PBA(A4)VOLUMEOFOUTPUT‰BSRVEROK‹CKIFBOOTWANTED‰BNEVERSEXE‰NO#‰LEAINFHS+FHSUSN(PC),A0‹SENDSTART‰LEAOUTFHS+FHSUSN(PC),A1 ‰CLR.W(A0)+ ‰CLR.W(A1)+4‰MOVE.LINFHS+FHSVOL-PBA(A4),VOLPRT-PBA(A4)„VOLNAME‰MOVE.L#'0000',L1USN-PBA(A4)!‰MOVE.L#'„',(A0)‹BLANKCATALOGUE‰MOVE.L(A0),(A1)+‰MOVE.L(A0)+,L1CAT-PBA(A4)‰MOVE.L#'„',(A0)‰MOVE.L(A0),(A1)+‰MOVE.L(A0)+,L1CAT+4-PBA(A4)'‰MOVE.LBOOTFILE-PBA(A4),(A0)‹FILENAME‰MOVE.L(A0),(A1)+‰MOVE.L(A0)+,L1FIL-PBA(A4)‰MOVE.LBOOTFILE+4-PBA(A4),(A0)‰MOVE.L(A0),(A1)+‰MOVE.L(A0)+,L1FIL+4-PBA(A4)%‰MOVE.WBOOTEX-PBA(A4),(A0)ƒEXTENSION‰MOVE.W(A0),(A1)‰MOVE.W(A0),L1EXT-PBA(A4)‰MOVE.L#34,D1‡SENDSIZE‰LEAVOLPRT(PC),A0‡SENDLINE‰LEAPRTBUF(PC),A1ˆRECLINE ‰BSRSPCOMP*’SENDMSGSHOWINGSYSVOL‰LEANAMM(PC),A0 ‰BSRSENDMSG‰LEANAMMR(PC),A0‰LEANAMMRE(PC),A1 ‰BSRSENDMSGI‰IOSCALLINP8IOS(PC) ‰BNEIOERPRT ‰BSRSBARG ‰BNEIOERPRT'‰CMP.B#CR,HARDBUF(A3)…CARRRETENTEREDO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º03/05/84*ˆBEQ.SVERSAN2“YES‰BEQ.SVERSAN15’YES *º03/05/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&‰LEAHARDBUF(A3),A0†PREPFOREDITCALL‰LEAINFHS(PC),A6 ‰BSREDITFILE‰BPL.SVERSAN1‡GOOD ‰BSRINVALE ‰BRAVERSAN0VERSAN1‚LEAHARDBUF(A3),A0‰LEAOUTFHS(PC),A6 ‰BSREDITFILEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º03/05/84 VERSAN15: *º03/05/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84‰MOVE.L„#LOOP514,D1,*œEstablishloopcountfor51/4inchfloppy*œincasevolumeerroroccurs *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 2VERSAN2‚FHSCALLINFHS(PC)ƒASSIGNSYSTEMFILEINPUT‰IF‚‚THEN.S $*’***ERRORASSIGN7 INGINPUTFILE***:‰CMP.B#FSTAFD,D0„IFTHEERRORIS'FILEDESCRIPTORERROR',<‰BEQ.SVERSAN3‡'VOLUMEERROR',OR'FILENAMEDOESNOTEXIST',?‰CMP.B#FSTAVOL,D0ƒWECANHANDLEIT--OTHERWISEJUSTPRINTERRORO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84*ˆBEQ.SVERSAN3‡ANDTERMINATE.‰BEQ.SVERSAN33†ANDTERMINATE. *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰CMP.B#FSTANNM,D0ƒ*‰BNEIOERPRT‰* IVERSAN3‚MOVE.L#LDFLUN,D1ƒCALLERRORMESSAGEHANDLERTOPRINTAPPROPRIATE"‰BSRPRTERMŠMESSAGEANDASKAGAIN.‰BRAVERSAN0‰* O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84 VERSAN33: ‰SUB.B…#1,D1$*œADJUSTLOOPCOUNTFORVOLUMEERROR‰BMI.S…VERSAN3*œJUMPIFLOOPCOUNTEXPIRED‰MOVE.L„#LPCT514,A0‰MOVE.L„#DELAY,D0‰TRAP†#1 *œESTABLISH*œA0-TIMETODELAY*œD0-DIRECTIVE*œINITIATEDELAY‰BRA.S…VERSAN2 *œREPEATLOOP *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰ENDI ‰LEAINFHS(PC),A0‰LEAOUTFHS(PC),A18‰MOVE.LVIDIO(A3),OUTFHS+FHSVOL-PBA(A4)„VOLUMEOFOUTPUT&‰MOVE.WFHSWCD(A0),FHSWCD(A1)‚PASSWORD‰MOVE.WFHSLRL(A0),FHSLRL(A1)‰MOVE.LFHSSIZ(A0),FHSSIZ(A1)‰MOVE.BFHSOPT(A0),FHSOPT(A1)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º03/05/84 *ˆMOVE‚#20,D7‰MOVE.L„#LOOP514,D1,*œEstablishloopcountfor51/4inchfloppy*œincasevolumeerroroccurs *º03/05/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< VERSANX$‰FHSCALLOUTFHS(PC)†ASGNFILEOUTPUT ‰BEQ.SVERSR>‰CMP.B#FSTAVOL,D0ƒASSIGNMENTERRORONVOLUMELEGALFORAWHILE ‰BNEƒIOERPRTO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º03/05/84*ˆDBRA†D7,VERSANX *ˆBRA‡IOERPRT ‰BSR.S…LDELAY ‰BMI‡IOERPRT‰BRA.S…VERSANX *º03/05/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º03/05/84*ˆINPUT*’D1=LOOPCOUNT**ˆOUTPUT*’A0=DESTROYED*’D0=DESTROYED* *ˆCONDITIONS*’MINUS‚-LOOPCOUNTEXPIRED!*’ZEROƒ-DELAYREQUESTSUCCESSFULLDELAY: ‰SUB.B…#1,D1$*œADJUSTLOOPCOUNTFORVOLUMEERROR‰BMI.S…LDELAY10*œJUMPIFLOOPCOUNTEXPIRED‰MOVE.L„#LPCT514,A0‰MOVE.L„#DELAY,D0‰TRAP†#1 *œESTABLISH*œA0-TIMETODELAY*œD0-DIRECTIVE*œINITIATEDELAY LDELAY10:‰RTS *º03/05/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* *ˆDOREAD&WRITEOFSYSTEMFILE*#VERSR„IOSCALLFILEIOS(PC)…READFILE‰BEQ.SVERSGOˆGOOD‰CMP.B#ISTAEOF,D0ƒENDOFFILE‰BEQƒVERSE‹YES ‰BRAIOERPRT** EXECUTION OF V OPTION*1VERSGOƒBTST„#VOPT,OPTFLG-PBA(A4)ISVOPTIONSET? ‰BEQ…VERSGO1A‰BCHG„#VOPTR,OPTFLG-PBA(A4)‚MARKTHATVOPTIONROUTINEISCALLING2‰MOVEM.LA0/A2/D0/D3,-(A7)‚SAVEREGISTERSONSTACK8‰MOVE.L‚FILESA-PBA(A4),A0ŠSTARTOFFILEBEINGTRANSFERED,‰MOVE.W‚LDWD(A0),D0ˆD0CONTAINSLOADADDRESS ‰LSL.Lƒ#8,D0ŽACCOUNTFORMOD256*‰MOVE.L‚D0,LDADR-PBA(A4)ƒSAVELOADADDRESS=‰MOVE.L‚D0,ENTADR-PBA(A4)‚INITIALIZEENTEREDADDRESS,FORCR.‰BSR…BHLCVTCONVERTTOASCII‰LEA…LDMSG1(PC),A0(‰MOVE.L‚D2,(A0)ŒSTUFFFORMESSAGEOUTPUT‰MOVE.L‚D3,4(A0)‰LEA…LDMSG(PC),A02‰LEA…LDMSGE(PC),A1ŠOUTPUTLOADADDRESSTOTERMINAL ‰BSR…SENDMSGVOPT02ƒLEA…NEWADR(PC),A0‰LEA…NEWADRE(PC),A1&‰BSR…SENDMSGI‹ASKFORNEWLOADADDRESS‰BSR…NUMCVTCONVERTTOBINARY ‰TST.LƒD1!‰BPL.SƒVOPT01BRANCHIFNEWENTRY‰CMP.Bƒ#CR,D1WASACRINPUT‰BEQ.SƒVOPTEXEXIT'‰BSR…INVALEPRINTINVALIDERRORMESSAGE‰BRA…VOPT02TRYAGAIN3VOPT01ƒMOVE.L‚D3,ENTADR-PBA(A4)‚SAVEENTEREDVALUE.:‰SUB.LƒLDADR-PBA(A4),D3ŒACTUALLOADADDRESS-ENTEREDADDRES/‰MOVE.L‚D3,BIAS-PBA(A4)„SAVEADDRESSBIASVALUE*5*‚ENTERINGNEWLOADANDEXECUTIONADDRESSESINTOFILE*‰MOVE.L‚FILESA-PBA(A4),A0)‰MOVE.L‚STKWD(A0),D0‡ORIGINALSTACKVALUE&‰ADD.LƒBIAS-PB7 A(A4),D0ŒSTACKPLUSBIAS(‰MOVE.L‚D0,STKWD(A0)‡PLACEBACKINTABLE/‰MOVE.L‚EXCWD(A0),D0‡ORIGINALEXECUTIONADDRESS%‰ADD.LƒBIAS-PBA(A4),D0ŒEXECADDR+BIAS(‰MOVE.L‚D0,EXCWD(A0)‡PLACEBACKINTABLE=‰MOVE.L‚ENTRPT(A0),D0†ENTRYPOINTINLOADERINFORMATIONBLOCK0‰ADD.LƒBIAS-PBA(A4),D0ŒOLDENTRYPOINTPLUSBIAS$‰MOVE.L‚D0,ENTRPT(A0)†REPLACEINLIB.‰MOVE.L‚ENTADR-PBA(A4),D0ŠENTEREDLOADADDRESS,‰LSR.Lƒ#8,D0ŽADDRESSSPECIFIEDASMODULO2560‰MOVE.W‚D0,LDWD(A0)ˆPLACEINLOADADDRESSOFLIBù â<ëJóQûO8 @\`#J+3?; CJKJS-VOPTEXƒCLR.BƒOPTFLG-PBA(A4)…CLEAROPTIONFLAG6‰MOVEM.L(A7)+,A0/A2/D0/D3‚RESTORESTACKANDREGISTERS2VERSGO1‚MOVE.LFILESA-PBA(A4),D0„GETSTARTOFFILE+‰ADD.LFILELI-PBA(A4),D0†ADDLENGTHOFFILE‰SUB.L#1,D0‰ADJEND-‰MOVE.LD0,FILEEO-PBA(A4)„MOVETOOUTPUTPARM*’WRITEOUTPUT‰IOSCALLFILEOOS(PC) ‰BEQ‚VERSR ‰BRAIOERPRT*'*’DODIRCALLTOGETNEWSTART&LENGTH VERSE„EQU*‰BSRCLOOUTŠCLOSEOUTPUT"‰BSR.SASGOUTŠASSIGNOUTPUTTOVOL"‰BSRRVIDŠGETVIDBACKINTOBUFFER‰BSRƒDIRGETŠGETSTART&LENGTH‰MOVE.LD0,VIDIO+VIDOSS(A3)‰MOVE.WD1,VIDIO+VIDOSL(A3)'‰MOVE.L‚ENTADR-PBA(A4),VIDIO+VIDOSA(A3) ‰BRA.SƒVERSEXVERSEXE#‰BSR.S‚ASGOUT‚ASSIGNTHENEWVOLUMEVERSEX‰RTS*:***********************************************************ˆROUTINETOSPACECOMPRESS&*ŠA0CONTAINSTHESENDINGLINEADDRESS(*ŠA1CONTAINSTHERECEIVINGLINEADDRESS,*ŠD1CONTAINSTHELENGTHOFTHESENDINGLINE;************************************************************"SPCOMP…CMP.B#'',(A0)‚ISITBLANK‰BEQ.SSPCOMP3ˆYES&‰MOVE.B(A0)+,(A1)+‚MOVETOPRINTLINE"BLDECK„SUB.W#1,D1…ISTHISTHEEND‰BGTSPCOMPˆNO‰SUB.L#1,A1…ESTABLISHEND ‰RTSRETURN*$SPCOMP3…ADD.W#1,A0‡INCADDROFSEND ‰BRABLDECK*1**************************************************ˆROUTINETOPRINTBOOTMSG1************************************************* VEROK„EQU*‰LEAOPERM(PC),A0…MESSAGE‰LEAOPERME(PC),A1 ‰BSRSENDMSGI!‰IOSCALLINP3IOS(PC)…GETRESPONSE ‰BNEIOERPRT ‰BSRSBARG ‰BNEIOERPRT'‰CMP.B#'Y',ANSWER-PBA(A4)ƒYESRESPONSE ‰RTS‘RETURN**"*‹ROUTINETOVOLUMEASSIGNOUTFILEASGOUTƒLEAOUTFHS+FHSCLG(PC),A0‰MOVE.L#'„',D0$‰MOVE.LD0,(A0)+„BLANKCATALOGFIELD‰MOVE.LD0,(A0)+ ‰MOVE.LD0,(A0)+„BLANKFILENAME‰MOVE.LD0,(A0)+‰MOVE.WD0,(A0)„BLANKEXT‰MOVE.W#FHASGN,OUTFHS-PBA(A4) ‰MOVE#20,D7ASGOUT1‰FHSCALLOUTFHS(PC)‰BEQ.SASGOUT2>‰CMP.B#FSTAVOL,D0ƒASSIGNMENTERRORONVOLUMELEGALFORAWHILE.‰BNE‚IOERPRTˆDISPLAYERRORIFNOTVOLUMEERROR?*8/12/83SCB.vvvvŠChangesmadesoINITworksfromchainfile.(‰MOVE.LA0,-(A7)…SaveA0thrudelaycall$‰MOVE.L#250,A0†Delaytime=250ms.‰MOVE.L#DELAY,D0‰TRAPƒ#1‹Dothedelay‰MOVE.L(A7)+,A0…RestoreA0* 8/12/83 SCB. ^^^^&‰DBRAD7,ASGOUT1…LOOPTRYINGTOASSIGN,‰BRA‚IOERPRTˆMUSTBEAREALASSIGNMENTERRORASGOUT2 ‰RTS‡RETURN0*************************************************’ROUTINETOCALLDIRECTORY*’ANDGETFILESTART&LENGTH*’STARTIND0&LENGTHIND1* DIRGETƒEQU*‰STOREDIRBLK(PC),OUTDIR&‰LEAINFHS+FHSCLG(PC),A0‹GETFILENAME‰LEAOUTFHS+FHSCLG(PC),A1'‰MOVE.L(A0)+,(A1)+ŒMOVECATALOGEFIELD‰MOVE.L(A0)+,(A1)+"‰MOVE.L(A0)+,(A1)+ŒMOVEFILENAME‰MOVE.L(A0)+,(A1)+‰MOVE.W(A0),(A1)EXTENSION‰MOVE.W#FHFDEN,OUTFHS-PBA(A4)‰FHSCALLOUTFHS(PC) ‰BNEIOERPRT‰LEADIRBLK(PC),A0‰MOVE.LFDFS(A0),D0‹FILESTART ‰ADD.L#1,D0‰MOVE.LFDFE(A0),D1‹LENGTH ‰RTS›RETURN*‰PAGE0**************************************************ˆBUILDDUMPAREAPROCESSING*0*************************************************DUMPAREA EQU **‰TST.BZEROFLAG-PBA(A4)…DISK0‰BEQ‡DUMPEX„NO*‰LEADUMPM(PC),A0‰LEADUMPME(PC),A1 ‰BSRSENDMSGI‰IOSCALLINP3IOS(PC) ‰BNEIOERPRT ‰BSRSBARG ‰BNEIOERPRT8 ‰CMP.B#'Y',ANSWER-PBA(A4)‰BNEDUMPEX”EXIT‰BSRWVIDŒWRITEOUTPARTIALVID#DUMP1„LEALOCKN(PC),A0ˆGETSIZEMSG‰LEALOCKNE(PC),A1 ‰BSRSENDMSGI ‰BSRNUMCVT ‰TST.LD1‰BPL.SDUMP2‹GOODDUMPERƒBSRINVALE ‰BRADUMP1 DUMP2„TST.LD3ŒZEROVALUE‰BEQDUMPERŠYES‰BSRCLOOUTŠCLOSEVOLASGN‰LEAOUTFHS(PC),A0'‰MOVE.LD3,FHSSIZ(A0)ŠSIZEOFDUMPAREA ‰MOVE.LD3,D7’SAVELENGTHOFVID%‰MOVE.W#FHALLO+FHASGN,OUTFHS-PBA(A4)7‰MOVE.B#FOPCON,OUTFHS+2-PBA(A4)SETCONTIGFILEOPTION‰LEAOUTFHS+FHSVOL(PC),A0‰MOVE.LVIDIO(A3),(A0)+…VOLUME‰CLR.W‚(A0)+ˆUSER#‰BSR.SIDUMPFILˆLOADPARMBLOCK=‰MOVE.B#$FF,OUTFHS+FHSWCD-PBA(A4)WRITEPROTECTONDUMPFILE*‰FHSCALLOUTFHS(PC) ‰BNEIOERPRT2‰CLR.BOUTFHS+FHSWCD-PBA(A4)ƒCLEARPROTFROMTABLE*‰BSRCLOOUTŠCLOSEFILE‰BSRASGOUTŠASSIGNVOL‰BSRRVIDŒREREADVID‰STOREDIRBLK(PC),OUTDIR/‰MOVE.W#FHFDEN,OUTFHS-PBA(A4)DIRCALLCOMMAND%‰LEAOUTFHS+FHSCLG(PC),A0ŠINITATCAT‰BSR.SIDUMPFIL#‰FHSCALLOUTFHS(PC)‚ALLOCFILEDUMP ‰BNEIOERPRT‰LEADIRBLK(PC),A03‰MOVE.LFDFS(A0),VIDIO+VIDDAS(A3)‚DUMPSTARTTOVID.‰MOVE.WD3,VIDIO+VIDDAL(A3)„DUMPLENGTHTOVID* DUMPEX‚RTS*.************************************************ˆROUTINETOSETPARMBLOCKWITHDUMPFILE.**********************************************IDUMPFIL EQU *‰MOVE.L#'„',D0‰MOVE.LD0,(A0)+…CATALOGUE‰MOVE.LD0,(A0)+‰MOVE.L#'DUMP',(A0)+ƒFILENAME‰MOVE.LD0,(A0)+‰MOVE.W#'SY',(A0)+ŒEXTENSION ‰CLR.L(A0)ˆRTS‰PAGE/*************************************************ˆCALCULATECHECKSUMPROCESSING*0*************************************************CHECKSUMƒEQU**‰LEAVIDIO(A3),A0ˆLOADSTART‰LEAVIDIOE(A3),A1ŒEND‰CLR.WVIDCHK(A0)„ZEROCHECKSUM‰MOVE.L#$FFFFFFFF,D0CHECK1ƒMOVE.B(A0)+,D1 ‰EOR.B‚D1,D0‰SWAPƒD0‰MOVE.B‚(A0)+,D1 ‰EOR.B‚D1,D0‰SWAP‚D0‰CMP.L‚A1,A0ˆFINALLBYTES?‰BLS.S‚CHECK1‡NO#‰LEA‚VIDIO(A3),A0‡YESSAVECHECKSUM‰MOVE.B‚D0,VIDCHK(A0)‰SWAP‚D0‰MOVE.B‚D0,VIDCHK+1(A0)*‰RTS‰PAGE.************************************************ˆGETCURRENTCONFIGURATION*GETCONF-‰IOSCALLƒCONFIOS(PC)ƒGETCONFIGURATIONSTATUS ‰BNE‡IOERPRT2‰LEA‡DCPBLK(PC),A0POINTTOTHECONFIGURATIONINFO4‰CMP.B…#IODIPC,IOSDRC(A0)‚AREWETALKINGTOANIPC?$‰BNE.S…GETCONF1‚BRANCHIFNOTANIPC;‰CLR.B…IPCFLAG-PBA(A4)ƒINDICATEWEAREWORKINGWITHANDIPC‰BRA.S…GETCONF2ŠANDEXITGETCONF17‰OR.B†#$FF,IPCFLAG-PBA(A4)‚INDICATENON-IPCTYPEDRIVER?‰BTSTW…#IOAALT,IOSATW(A0)CONTROLLERHAVECAPABILITY?<>GETCONF2 ‰RTS‡EXIT‰PAGEJ***************************************************************************H*‚SETPARM-SETUPPARAMETERBLOCKANDSECTORINFORMATIONFORGETMEMORY*ŒSEGMENTANDFORMAT*5*‹ENT:ƒA0--ADDRESSOFCONFIGURATIONPARAMETERBLOCK3*‹EXITƒD1--LENGTHOFBUFFERNEEDEDFORFULLTRACK-*˜READ+SPACEFORLOCKIO,VID,CONFIGSECTOR*SETPARM5‰TST.B…IPCFLAG-PBA(A4)…WORKINGWITHIPCTYPEDRIVER?‰BNE.S…SETPAR4BRANCHIFNOT7‰CMP.B…#XDSFDK,IOSDTP(A0)‚IPCTYPE--CHECKIFAFLOPPY‰BNE.S…SETPAR3IPC--HARDDISK9‰MOVE.L„IOSRSZ(A0),D0‡GETTOTALNUMBEROFSECTORSONTHIS*ªFLOPPY:‰LEA‡FLPYTABL(PC),A0FINDTHECONFIGURATIONPARAMTERBLOCK,*ŸFORTHISFLOPPYBASEDONNUMBEROFSECTORS**ˆATABLEENTRYISDEFINED:#*’DC.L†XXXX†TOTALNUMBEROFSECTORS8*’DC.L†XXXXXXXX‚OFFSETFROMTHEBEGINNINGADDRESSOFTHE *ªPROGRAMTOTHEPARAMETERBLOCK*”.*”.*’DC.L†0‰ENDOFTABLESETPAR1!‰CMP.L…(A0)+,D0‚ISTHISTHEENTRY8‰BEQ.S…SETPAR2ƒBRANCHIFWEFOUNDTHECONFIGURATIONINFO0‰ADD.L…#4,A0…GOPASTTHEPARAMETERBLOCKADDRESS‰TST.L…(A0)†ENDOFTABLE‰BNE.S…SETPAR1ƒGOTONEXTENTRY8‰LEA‡NOFLOP(PC),A0REPORTNOFLOPPYDEFINEDINIPCTABLE‰LEA‡NOFLOPE(PC),A1*‰BSR‡SENDMSG„*'‰BRA‡TERM0200‚TERMINATETHISINITIALIZESETPAR2=‰MOVE.L„(A0),A0ƒPOINTTOFLOPPYCONFIGURATIONPARAMETERBLOCK6‰ADD.L…A4,A0…ADJUSTTHEAD8 DRESSOFTHEPARAMETERBLOCK‰BRA.S…SETPAR4SETPAR3?‰MOVE.L„#SECLEN,D2IPCWITHAHARDDISKSETSECTORLENGTH=2569‰MOVE.L„#HDSECTRK,D1ˆCURRENTLYTHEREARE64SECTORS/TRACK‰BRA.S…SETPAR5SETPAR4‰CLR.L…D1ˆINITREGISTERS ‰CLR.L…D2ˆ*<‰MOVE.B„IOSSPT(A0),D1‡GETPHYSICALSECTORLENGTHFROMSTATUS *ªINFORMATION6‰MOVE.W„IOSPSM(A0),D2‡GETSECTORPERTRACKINFORMATIONSETPAR5/‰MULU†D2,D1…CALCULATENUMBEROFBYTESPERTRACK#‰MOVE.L„D1,D2…NEEDTHENUMBERAGAIN5‰DIVU†#SECLEN,D2GETNUMBEROFVERSADOSSECTORS/TRACK0‰MOVE.L„D2,VDOSSEC-PBA(A4)‚SAVEITFORTHEWORLD<‰ADD.L…#3*SECLEN,D1ADDTHREESECTORSWORTHTOBEUSEDLATER*B*ˆREGISTERD1SHOULDNOWCONTAINTHELENGTHOFTHEBUFFERREQUIRED?*ˆOUTOFMEMORYTOACCOMODATEAFULLTRACKREADPLUSADDITIONAL+*ˆSPACEFORLOCKIO,VID,ANDCONFIGURESECTOR*8‰MOVE.L„A0,CNFBKADR-PBA(A4)SAVEPARAMETERBLOCKPOINTER 4‰MOVE.LD1,BUFPARS-PBA(A4)‚SETMEMORYSEGMENTLENGTH *º<>‰PAGE8*********************************************************’MAKECALLFORBUFFERAREA8********************************************************>GETMEMƒERQ.GTSEGBUFPAR(PC)‚CALLTOGETI/OBUFFERFROMSYSTEM‰BNEIOERPRT‰BRIFERROR‰MOVE.LA0,BUFADR-PBA(A4) ‰MOVE.LA0,A3#‰ADD.L‚D1,A0ˆPOINTTOENDOFBUFFER‰SUB.L‚#1,A0ˆ**ƒINITPARMBLOCKS‰STORELOCKIO(A3),LOCKIOS1‰STORELOCKIOE(A3),LOCKIOS2‰STOREVIDIO(A3),WDSKVID1‰STOREVIDIOE(A3),WDSKVID2‰STOREVIDIO(A3),RDSKVID1‰STOREVIDIOE(A3),RDSKVID2‰STOREVALBUF(A3),RDSKS‰STORECONFSEC(A3),WDSKCF1‰STORECONFSECE(A3),WDSKCF2/‰MOVE.LA0,RDSKE-PBA(A4)†SETBUFFERENDADDRESSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84'‰MOVE.L„RDSKS-PBA(A4),ISSEVALUE-PBA(A4))‰MOVE.L„RDSKE-PBA(A4),ISSEVALUE-PBA+4(A4)'*¦SAVETHEINITIALSATSTART/ENDVALUES *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰STOREVALBUF(A3),FILESA *Ä10/24/83"‰MOVE.L„A0,FILESB-PBA(A4)¡10/24/83 *Ä10/24/83‰STOREVALBUF(A3),FILEOOS1 *Ä10/24/83"‰MOVE.L„A0,FILEEO-PBA(A4)¡10/24/83*!‰STOREHARDBUF(A3),INP8IOS+IOSSAD$‰STOREHARDBUF+49(A3),INP8IOS+IOSEAD ‰RTSŒ.RETURN‰PAGE/*********************************************** *ˆPRINTERRORMSG&CKFORRETRY/************************************************ PRTIO„EQU*‰MOVE.L#LDFLUN,D1 ‰BSRPRTERM ‰BRASTOPIT**(****************************************"*ˆERRORROUTINEFORSATPROCESSING(*****************************************-SATERRƒMOVE.L#LDFLUN,D1ƒLUNFORERRMSGCALL‰BSRPRTERMŠDISPLAYERROR ‰BRASTOPIT‰PAGE** CLOSERR‚EQU*'‰MOVE.L#LDFLUN,D1ƒLUNFORERRMSGCALL‰BSRPRTERMŠPRINTMSG ‰BRA.SSTOPE**,*********************************************ˆPRTSATEXCEEDEDERROR,********************************************* DSKERRƒEQU*‰LEASATERM(PC),A0‰LEASATERME(PC),A1 ‰BSRƒSENDMSG ‰MOVE#-1,D0‰RTS** ER_NVDEV:;‰MOVE.L#EM_NVDEV,D0‹PRINTOUT'INVALIDDEVICEFORREQUEST'3‰MOVE.L#LDFLUN,D1MESSAGETOLISTLOGICALUNITAND‰BSR„PRTERM‘TERMINATE. ‰BRA.S‚STOPE**ER_NVO:5‰MOVE.L#EM_NVO,D0PRINTOUT'INVALIDOPTION'MESSAGE0‰MOVE.L#LDFLUN,D1TOLISTDEVICEANDTERMINATE. ‰BSR„PRTERM ‰BRA.S‚STOPE** INVALEƒEQU*)‰MOVE.L#EM_NVE,D0ƒSETINVALIDERRORCODE.‰MOVE.L#LDFLUN,D1ƒSETLUNFORERR9 MSGHANDLER ‰BSR.SPRTERM‰RTS**INVALERR EQU * ‰BSRINVALE ‰BRA.SSTOPE** IOERPRT‚EQU*.‰MOVE.L#LDFLUN,D1ƒSETLUNFORERRMSGHANDLER‰BSR.SPRTERMˆDISPLAYERROR ‰BRA.SSTOPE*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** TERM_FLG:‰DC.W†0‰TERMINATIONFLAG *œBIT‡MEANING*ž0‡0-->NORMAL‚TERMINATION*¦1-->ERRORƒTERMINATION**ž1‡1-->WARNINGTERMINATION**STOPE:‰LEA‡TERM_FLG(PC),A0*œA0=ADDROFTERMINATIONFLAG ‰BTST†#1,(A0)‰BNE.S…TERM0100*œJMPIFWARNINGTERMINATION ‰BTST†#0,(A0)‰BNE.S…TERM0200*œJMPIFERRORTERMINATION ‰ERQ.TERM*œEXITNORMALTERMINATION TERM0100:‰ERQ.TERM#0,#$1000*œEXITWARNINGTERMINATION TERM0200:‰ERQ.TERM#0,#$C000  SENDMSGI EQU *"‰MOVE.LA0,OUT6IIOS+IOSSAD-PBA(A4)"‰MOVE.LA1,OUT6IIOS+IOSEAD-PBA(A4)‰IOSCALLOUT6IIOS(PC) ‰BNEIOERPRT ‰RTS.RETURN* SENDMSG‚EQU*‰MOVE.LA0,OUT6SAD-PBA(A4)‰MOVE.LA1,OUT6EAD-PBA(A4)A‰MOVE.L#IOWRIT<<16!IOPFOR,OUT6IOS-PBA(A4)Forcecorrectfunction‰IOSCALLOUT6IOS(PC) ‰BNEIOERPRT‰RTS*.************************************************…ERRORMSGHANDLERCALL*.*************************************************’ERRORMESSAGECALLINGROUTINE**ˆCALL†BSR‡PRTERM**ˆINPUT!*’D0=ASRETURNEDFROMTRAPCALL,*’D1=USERLOGICALUNITNUMBERTOOUTPUTTO!*’A0=ASRETURNEDFROMTRAPCALL**ˆOUTPUT*’NOREGISTERPRESERVATION* EM_XCEPT:‰DC.W†$0000…TABLETERMINATOR*PRTERM:‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A4)+*œSAVED0ANDA0INERRORMSGPARAMETERBLK‰AND.L…#$00FF,D0*œISOLATEERRORSTATUSRETURN‰LEA‡EM_XCEPT(PC),A00*œA0=ADDROFTBLCONTAININGERRORMSGCODESTHAT-*ŸWILLNOTBECONSIDEREDASERRORTERMINATION *ŸCONDITIONS CEMP0100: ‰TST.W…(A0)‰BEQ.S…CEMP0200 *œJMPIFTABLEHASBEENEXAMINED‰CMP.W…(A0)+,D0‰BEQ.S…CEMP0300'*œJMPIFERRORCODERETURNISONEWHICH/*œWILLRESULTINBEINGANEXCEPTION-THISCASE**œWILLNOTBECONSIDEREDFORANERRORTYPE *œTERMINATION‰BRA.S…CEMP0100 *œREPEATLOOP CEMP0200:‰LEA‡TERM_FLG(PC),A0‰BSET†#BN00,(A0),*œSETFLAGTOTERMINATEWITHERRORCONDITION CEMP0300:‰LEA‡EM_PBLK(PC),A0&*œA0=ADDRUSERERRORMSGPARAMETERBLK‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)*œSETTHEUSERLUNTOOUTPUTTO ‰MOVE.L„#2,D0*œERRORMSGPRGMINPUTRQMNT‰TRAP†#4$*œISSUEREQUESTTOERRORMSGHANDLER‰RTS‰PAGE.***********************************************&*ˆROUTINETOPRINTTOTALNUMBEROFSLT *ˆENTRIES."*ŠEXIT:D3=NUMBERENTRIESINSLT*.***********************************************PRTSECT‚CLR.LD0ª<>éééééé*+PRTSLT2‚LEALOCKHD2(PC),A0†HEADER2TOUSER‰LEALOCKHD2E(PC),A1 ‰BSRSENDMSG‰BNEIOERPRT‰ERROR&‰TST.BPRINTER-PBA(A4)‰USINGPRINTER?‰BEQ.SPRTSLT3‡NO‰STORELOCKHD2(PC),OUT3SAD‰STORELOCKHD2E(PC),OUT3EAD(‰IOSCALLOUT3IOS(PC)HEADER2TOPRINTER‰BEQ.SPRTSLT3‡ALLOK‚<<0225859‰BSET.B#1,PRMSGFLG-PBA(A4)‚TEST/SETFLAGMSGTOTERMINAL&‰BNE.SPRTSLT3‡MSGALREADYBEENOUTPUT‰LEALOCKPR2(PC),A0‰LEALOCKPR2E(PC),A13‰BSRSENDMSG‰TELLUSERPRINTERUNAVAILABLE‚022585>>*%PRTSLT3‚TST.LD3ŒANYENTRIESINSLT?!‰BEQPRTSLT6‰NO,TELLUSER'NONE'‰LEATOTSLT(PC),A2%‰MOVE.L#0,D2ˆINITIALIZEENTRYNUMBERPRTSLT4‚ADD.L#1,D2‰MOVE.L(A2)+,D0…SLTPSN!‰MOVE.L#6,D1ˆLENGTHOFRECFIELD)‰LEALCKBAD(PC),A0‡ADDRESSOFRECFIELDA‰BTST#0,D2ŠENTRYNUMBEREVEN?‰BEQ.SPRTSLT4A†YES)‰LEALCKAAD(PC),A0‡ADDRESSOFRECFIELDBPRTSLT4ABSRBINDECFJˆCONVERT4‰MOVE.L#5,D1ˆLENGTHOFRECFIELDFORHEXADD0104858‰LEALCKBADX(PC),A0†ADDRESSOFRECFIELDAFORHEXVALUE‰BTST#0,D2ŠENTRYNUMBEREVEN?‰BEQ.SPRTSLT4X†YES8‰LEALCKAADX(PC),A0†ADDRESSOFRECFIELDBFORHEXVALUEPRTSLT4XBSRBINHEXŠCONVERT* ‰CLR.LD0‰MOVE.W(A2)+,D0…SLTLENGTH!‰MOVE.L#4,D1ˆLENGTHOFRECFIELD*‰LEALCKBLEN(PC),A0†ADDRESSOFRECFIELDA: ‰BTST#0,D2ŠENTRYNUMBEREVEN?‰BEQ.SPRTSLT4BˆYES*‰LEALCKALEN(PC),A0†ADDRESSOFRECFIELDBPRTSLT4BBSRBINDECFJˆCONVERT*‰SUB.L#1,D3‰DECREMENTCOUNTER‰BNE.SPRTSLT4CˆNOTDONE'‰BTST#0,D2ŠFINISHEDONANEVENENTRY?#‰BEQ.SPRTSLT4D†YES,PRINTANDQUIT‰MOVE.L#'„',D09‰MOVE.LD0,LCKBAD-PBA(A4)CLEARBENTRYFOR14CHARACTERS‰MOVE.LD0,LCKBAD+4-PBA(A4)‰MOVE.LD0,LCKBAD+8-PBA(A4)‰MOVE.WD0,LCKBAD+12-PBA(A4))‰MOVE.LD0,LCKBLEN-PBA(A4)CLEARBLENGTH‰BRA.SPRTSLT4D‚GOPRINT*,PRTSLT4CBTST#0,D2ŠJUSTDIDANEVENENTRY?‰BNEPRTSLT4‰NO,DONEXT-PRTSLT4DLEALOCKENT(PC),A0†SLTENTRYTOUSER‰LEALOCKENTE(PC),A1 ‰BSRSENDMSG‰BNEIOERPRT‰ERROR&‰TST.BPRINTER-PBA(A4)‰USINGPRINTER?‰BEQ.SPRTSLT5‡NO‰LEALOCKENT(PC),A0‰MOVE.LA0,OUT3SAD-PBA(A4)‰LEALOCKENTE(PC),A0‰MOVE.LA0,OUT3EAD-PBA(A4))‰IOSCALLOUT3IOS(PC)SLTENTRYTOPRINTER‰BEQ.SPRTSLT5‡ALLOK‚<<0225859‰BSET.B#1,PRMSGFLG-PBA(A4)‚TEST/SETFLAGMSGTOTERMINAL&‰BNE.SPRTSLT5‡MSGALREADYBEENOUTPUT‰LEALOCKPR2(PC),A0‰LEALOCKPR2E(PC),A13‰BSRSENDMSG‰TELLUSERPRINTERUNAVAILABLE‚022585>>éééééé*PRTSLT5‚TST.LD3ŒALLDONE?‰BNEPRTSLT4‰NO,NEXTENTRYPRTSLTX‚RTS‘RETURN*/PRTSLT6‚LEALOCKHD3(PC),A0†TELLUSERNOENTRIES‰LEALOCKHD3E(PC),A1 ‰BSRSENDMSG‰BNEIOERPRT‰ERROR&‰TST.BPRINTER-PBA(A4)‰USINGPRINTER?‰BEQ.SPRTSLTX‡NO,EXIT‰STORELOCKHD3(PC),OUT3SAD‰STORELOCKHD3E(PC),OUT3EAD*‰IOSCALLOUT3IOS(PC)NOENTRIESTOPRINTER‰BEQ.SPRTSLTX‡ALLOK‚<<0225859‰BSET.B#1,PRMSGFLG-PBA(A4)‚TEST/SETFLAGMSGTOTERMINAL&‰BNE.SPRTSLTX‡MSGALREADYBEENOUTPUT‰LEALOCKPR2(PC),A0‰LEALOCKPR2E(PC),A13‰BSRSENDMSG‰TELLUSERPRINTERUNAVAILABLE‚022585>>‰BRAPRTSLTX‰EXITšALTTRK>>‰PAGE.***********************************************%*ˆCONVERTBINARYTOHEXASCIIROUTINE*(*ˆRIGHTJUSTIFY&BLANKFILLONTHELEFT,*ˆTHELEASTSIGNIFICANTDIGITISNOTBLANKED* *ˆD0=HEXVALUETOBECONVERTED *ˆD1=LENGTHOFRECEIVINGFIELD7*ˆA0=ADDRESSOFLEFTMOSTPOSITIONOFRECEIVINGFIELD* *ˆREGISTERSUSED‚01234567 *’A…*** *’D…**ƒ*.***********************************************(BINASCƒDC.B'0123456789ABCDEF'…HEXTABLE* BINHEXƒEQU*)‰MOVEM.LD0-D3/A0-A2,-(A7)‚SAVEREGISTERS‰LEABINASC(PC),A1ƒINITADDR‰LEA0(A0,D1),A2‚ENDLOCATION*BINLOPƒMOVE.BD0,D3„GETBYTE%‰ASR.L#4,D0†SHIFTOFF: LASTHEXVALUE!‰AND.L#$F,D3„MASKOFFOTHERBITS2‰MOVE.B0(A1,D3),-(A2)‚MOVEFROMTABLETORECAREA‰CMP.LA2,A0…AREWEDONE‰BLTBINLOP†NO*‰CMP.W#1,D1…ONLYONECHAR‰BEQ.SBINOUT„YES**„DOZEROSUPPRESSION*‰LEA0(A0,D1),A2‚INITENDLOC‰SUB.L#1,A2…FIXENDLOC!BINSP„CMP.B#'0',(A0)‚ASCIIZERO?‰BNE.SBINOUT†NOGETOUT%‰MOVE.B#'',(A0)+‚REPLACEWITHBLANK‰CMP.LA0,A2…AREWEDONE ‰BGTBINSP‡NO*2BINOUTƒMOVEM.L(A7)+,D0-D3/A0-A2‚RESTOREREGISTERS ‰RTS.RETURN‰PAGE-*********************************************+*‚32BITBINARYTODECIMALASCIISUBROUTINE-**********************************************,*‚CONVERTSBINARYIND0ANDPUTSASCIIDIGIT(*…CHARACTERSATADDRESSSPECIFIEDINA0.(*…LEADINGZEROSARECONVERTEDTOSPACES.+*…THEFIELDLENGTH(NO.CHARS)ISSPECIFIED *…IND1INTHECALLINGSEQUENCE.**‚CALLINGSEQUENCE:!*…MOVE.L,D0*…MOVE.L,D11*…MOVE.L,A0*…BSRBINDECFJ* *‚RETURNS:*…ZBITSET=>GOODCONVERSION**‚REGSUSED:‚01234567 *ŠDƒ****ŠAƒ***7TENS DC.L 10000000,1000000,100000,10000,1000,100,10,1,0*BINDECFJ EQU *)MOVEM.LD0-D2/A0-A1,-(A7)‚SAVEREGISTERS MOVE.L #8,D2 MAX NO. DIGITS SUB.L D1,D2 NO. DIGITS TO SKIP! BMI.S BINDECF5 BRANCH ERROR EXIT LSL.L #2,D2 DOUBLE WORD LENGTHLEA‚TENS(PC),A1STARTOFTABLE" ADD.L D2,A1 ADJUST FOR DIFFERENCE&MOVE.W#'‚',D2INITIALIZEACCUMULATOR%BINDECF1 SUB.L (A1),D0 SUBTRACT 10**N BCS.S BINDECF2 BRANCH TOO BIG* ADD.W #1,D2 INCREMENT CURRENT DIGIT COUNT BRA BINDECF1 CONTINUE)BINDECF2 ADD.L (A1)+,D0 RESTORE, ADV PNTR TST.L (A1) TEST DONE BEQ.S BINDECF4 BRANCH DONE CMP.W#'‚',D2LEADINGZEROTEST! BEQ.S BINDECF3 BRANCH STILL ZERO# ADD.B #$10,D2 BRING TO ASCII DIGIT%BINDECF3 MOVE.B D2,(A0)+ DEPOSIT CHAR LSL #8,D2 SAVE CHAR DEPOSITED# MOVE.B #$20,D2 RESTORE LS TO SPACE BRA BINDECF1 CONTINUE4BINDECF4 ADD.B #$10,D2 LAST ONE BECOMES DIGIT ALWAYS" MOVE.B D2,(A0)+ DEPOSIT LAST CHAR' TST.L D0 SET CONDITION CODE, 0 IF GOOD4BINDECF5MOVEM.L(A7)+,D0-D2/A0-A1‚RESTOREREGISTERS RTS‰PAGE**&*‚RANDOM‚-GENERATENEXTRANDOMNUMBER*#*‚ENTER:‚D1.L=MAXIMUMNUMBERVALUE* *‚EXIT:ƒD0.L=NEXTRANDOMNUMBER*ŠD1.L=MAXIMUMNUMBERVALUE* RANDOMƒEQU*:‰MOVEM.LD1/D2,-(A7)ˆSAVEMAXIMUMNUMBERVALUEANDUSERD2$‰CLR.LƒD0‘HSKPWORKINGDATAREGISTER.‰MOVE.B‚SEED+3-PBA(A4),D0ŠSTARTINGSEEDNUMBER‰OR.B„SEED+2-PBA(A4),D0‰OR.B„SEED+1-PBA(A4),D0‰OR.B„SEED-PBA(A4),D0 ‰BNE.SƒRAND3‰NOT.BƒSEED+3-PBA(A4) RAND3„EQU…*‰MOVE.B‚SEED+3-PBA(A4),D0 ‰LSR.Bƒ#3,D0‰MOVE.B‚SEED+3-PBA(A4),D2 ‰EOR.BƒD2,D0 ‰ASR.Bƒ#2,D0‰ROXR.W‚SEED-PBA(A4)‰ROXR.W‚SEED+2-PBA(A4)$‰SWAP„D1‘ISD1GREATERTHAN16BITS? ‰TST.WƒD1‰BNE.SƒRAND32YEP ‰SWAP„D1‘NO ‰CLR.LƒD0‰MOVE.W‚SEED-PBA(A4),D0 ‰DIVU„D1,D0 ‰CLR.WƒD0‰SWAP„D0-‰MOVEM.L(A7)+,D1/D2ˆRESTOREMANNUMBERVALUE‰RTS˜RETURNTOCALLER RAND32ƒEQU…*‰SWAP„D1‰MOVE.L‚SEED-PBA(A4),D0 RAND4„EQU…*2‰SUB.LƒD1,D0ŽMAXIMUMNUMBERFROMNEWRANDONNUMBER‰BCC.SƒRAND4ŽSTILLTOOMUCH"‰ADD.LƒD1,D0ŽRESTORETOLASTVALUE(‰MOVEM.L(A7)+,D1/D2ˆRESTOREINPUTVALUE#‰RTS˜RETURNTOUSERWITHNEWNUMBER*‰PAGE‰INCLUDE&.DSKCFGDT.AI‰INCLUDE&.DSKCFGCD.AI „ENDSTARPROGéé; ééé=/* =/*†IPL.AF=/*-=/* Chain file to assemble IPL.SA and IPL2.SA=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to IPL.LS=/*=/IFC \1 ƒ=ARGIPL.LS=/ENDIF=/*"=ASM IPL.SA,IPL.RO,TEMP1.LS;RZ=176=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;Y=/*=ASM IPL2.SA,IPL2.RO,TEMP1.LS=/*{ Included files are:=/*ƒ--none--=/*}=/*ƒ=COPYTEMP1.LS,TEMP2.LS;Aƒ=COPYTEMP2.LS,\1;Yƒ=DELTEMP1.LS;Yƒ=DELTEMP2.LS;Y=/*=ENDééééé[=/* =/*†IPL.LF=/*$=/* Link chain file to create IPL.SY=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to IPL.LL=/*=/IFC \1 ƒ=ARGIPL.LL=/ENDIF=/*-=/* Note that section 1 must be linked at the-=/*ƒhighestaddressintheIPL.SYloadmodule=/*=LINK ,IPL.SY,\1;HAMIXSSEG SEG0:0,14,1 $0000 INPUT IPL.RO INPUT IPL2.ROLIB 0.&.UTILIB.ROEND=/*=ENDéé; ééééd+IPL‡IDNTƒ4,6InitialProgramLoadProcedure#ŠTTL„InitialProgramLoadProcedureB‰EQU„*’SEGMENTBASE*ŠXREFƒPARSE,OPTION,EDITFILE,BHLCVT,ENDLINK ŠSECTION0ŠOPT„MEXM******************************************************************************$*ˆ680xxINITIALPROGRAMLOADER(IPL)* *ŒVERSION4.4*0*’COPYRIGHTED1980,1981,1982,1983,1984,1985**šBYMOTOROLA,INC.***š*************¢**F*…IPLISANINITIALPROGRAMLOADMODULE,USEDTOLOADINA680XX-BASEDB*…OPERATINGSYSTEM.‚IPLITSELFISBROUGHTINTOMEMORYFROMDISKBYD*…THEBOOTCOMMANDOFTHERESIDENTFIRMWAREDEBUGGER(e.g.,MACSbug,0*…VERSAbug,VMCbug,VMEbug,TENbugand020bug).**…TYPICALBOOTCOMMAND:*‡BO0,1,VERSATST;HL=$E00**‡0=DEVICENUMBER*‡1=CONTROLLERNUMBERD*‡VERSATST=FILENAME-FULLYQUALIFIEDFILENAMEEXCEPTFORVOLUME:*’FIELD.‚IFVOLUMEISSPECIFIEDITISANERROR.SINCEFILE8*’ISALWAYSBOOTEDFROMSPECIFIEDCONTROLLERANDDEVICE.<*’USERNUMBERDEFAULTSTO0,CATALOGDEFAULTSTOBLANK,FILE:*’NAMEDEFAULTSTO'VERSADOS',EXTENSIONDEFAULTSTO'SY'.***š*************** ***„ENTRY‚SR=$2700*‹PC=FROMLOCATION4*‹A0=CHANNELADDRESS4*‹A2=POINTERTOCONFIGURATIONDATAWITHINDEBUGGERC*‹A3=DEBUGGERS'INTERNALDISKREADROUTINEADDRESS(NONTRAP#15)*‹A4=DEBUGGERENTRYPOINT,*‹A5=BEGINNINGOFCOMMANDLINE-FILENAME*•(FOLLOWINGBO0,0,)*‹A6=ENDOFCOMMANDLINE%*‹D0=DEVICENUMBER(LOWORDERBYTE))*‹D1=CONTROLLERNUMBER(LOWORDERBYTE)(*‹D2=CONFIGURATIONCODE(BYTE5VALUE)>*‹D3=FLAGFORIPLFROMDEBUGGER:‚CODE'ME4U'TELLSIPLITIS6*OKTOUSETHEDEBUGGERS'INTERNALDISKREADROUTINE.<*‹D4=FLAG(s)forIPLifwehavenewbuginterface(AUG84)&*“D4='IPLx'wherex=bits76543210 *“Bits‰Status$*”0‹FirmwaresupportsTRAP#15calls&*”1‹FirmwareistododiskI/OforIPL*¢(Old'ME4U'inD3)+*”2‹FirmwaresupportsanalternateTRAP#15 * protocol'*”3‹FirmwaresupportsTRAP#15diskI/O*”4-7‰ReservedPAGEfm;v<~(†Ž#–$ž&¦;®F¶L¾MÆ9ÎÖ?Þ>æ7î*ö5þ?;D<5&0./65>6FDNbV9*…EXIT:„SR=$2700*6*ŽCONTROLISPASSEDTOTHEPROGRAMTHATWASBOOTEDIN.*=*ŽLOADADDRESS,STARTADDRESSANDSTACKADDRESSCOMPUTEDFROM*ŽTHEFOLLOWINGALGORITHM:**ŽIFNO'L'OPTIONSPECIFIED*ŽTHEN8*”LOADADDRESS=ADDRESSSPECIFIEDINLOADERINFORMATION3*—BLOCK.(LOCATION$38OFSECTOR0OFLOADMODULE).*4*”STARTADDRESS=ADDRESSSPECIFIEDINLOCATION4OF*—SECTOR1OFTHELOADMODULE.*4*”STACKADDRESS=ADDRESSSPECIFIEDINLOCATION0OF*—SECTOR1OFTHELOADMODULE.< *ELSE5*”LOADADDRESS=ADDRESSSPECIFIEDONTHE'L'OPTION.*4*”STARTADDRESS=ADDRESSSPECIFIEDINLOCATION4OF%*—SECTOR1OFTHELOADMODULE+BIAS.*4*”STACKADDRESS=ADDRESSSPECIFIEDINLOCATION0OF%*—SECTOR1OFTHELOADMODULE+BIAS.**9*BIAS=ADDRESSSPECIFIEDON'L'OPTIONMINUSTHELOADER**˜INFORMATIONBLOCKADDRESSLOADADDRESS-,*˜(LOCATION$38OFSECTOR0OFLOADMODULE).*ŠPAGEM*****************************************************************************7* THE FOLLOWING INFORMATION IS USEFUL WHEN PATCHING VID*ƒOFFSET‰LENGTH‹DESCRIPTION*2*†$14Ž4‹IPLDISKADDRESS(SECTOR1OFLOADMODULE)&*¥NOTETHATSECTOR0OFLOADMODULEIS)*¥THELOADERINFORMATIONBLOCKANDISNOT&*¥BOOTEDINWITHTHERESTOFTHEFILE.**†$18Ž2‹IPLLENGTHINSECTORS.*,*†$1AŽ4‹IPLEXECUTIONADDRESS.‚ACTUALLYTHIS$*¥FIELDISNEVERUSED.‚THEEXECUTION#*¥ADDRESSISACTUALLYOBTAINEDFROM#*¥THE4-BYTEFILEDATLOCATION4OF*¥SECTOR1OFTHELOADMODULE.*/*†$1EŽ4‹IPLLOADADDRESS-IGNOREDIFAMACSbug"*¥SYSTEM.‚ONAMACSbugSYSTEM,IPL#*¥ISALWAYSLOADEDINTOLOCATION0.*E* IF A NEW IPL FILE IS PLACED ON THE DISK WITHOUT USING INIT, THE VIDE*ƒMUSTBEPATCHEDTOPOINTTOTHECORRECTBOOTADDRESS.‚THEFOLLOWING*ƒSTEPSACCOMPLISHTHIS.*A*ƒ1.‚PERFORMADIRONTHEIPLFILEUSINGTHE'A'OPTIONTOOBTAIN*‰START,END,ANDSIZE.<*ƒ2.‚ADD1TOSTART&PLACEAS4-BYTEFIELDINTOVIDAT$14.B*ƒ3.‚SUBTRACT1FROMSIZE&PLACEAS2-BYTEFIELDINTOVIDAT$18.C*ƒ4.‚STUFFDESIREDLONG-WORDLOADADDRESSAS4-BYTEFIELDINTO$1E.*J*ƒNOTETHATTHELOADADDRESS(LOCATION$1EOFVID)ISNOTUSEDBYMACSbug.B*…MACSbugWILLALWAYSBOOTIPLINTOLOCATION0.‚VERSAbug,HOWEVER,A*…DOESUSETHELOADADDRESSASITAPPEARSINLOCATION$1EOFVID.*?* THE ABOVE STEPS WILL INSURE THAT IPL FILE IS CORRECTLY BOOTED<*ƒIN.‚TOINSURETHATTHEINITIALEXECUTIONADDRESSINIPLIS'*ƒCORRECT,PERFORMTHEFOLLOWINGSTEPS.*A*ƒ1.‚USINGDUMP,EXAMINETHECONTENTSOFLOCATION$16(LONGWORD)<*‰OFSECTOR0(LOADERINFORMATIONBLOCK)OFIPL.‚THISISTHE:*‰EXECUTIONADDRESSOFIPL.‚FROMTHISNUMBER,SUBTRACTTHE;*‰NUMBERFOUNDATLOCATION$38(LONGWORD)OFSECTOR0.‚THE<*‰NUMBERYOUARESUBTRACTINGISTHELOADADDRESSOFIPL.‚THE?*‰DIFFERENCEOBTAINEDISTHEZERORELATIVEEXECUTIONADDRESSOF;*‰IPL.‚(THEEXECUTIONADDRESSOFIPLIFITWERELOADEDINTO9*‰MEMORYLOCATION0).‚THISNUMBERWILLBEUSEDINSTEP2.C*ƒ2.‚TOTHEVALUEOBTAINEDINSTEP1,‚ADDTHEDESIREDBOOTLOCATION;*‰FORIPL.‚FOREXAMPLE,‚IFITISDESIREDTOHAVEIPLLOADEDA*‰INATADDRESS$2000,ADD$2000TOTHEVALUEOBTAINEDINSTEP1.@*ƒ3.‚THEVALUEOBTAINEDINSTEP2SHOULDBEPLACEDINTOLOCATION7*‰4OFIPLASALONGWORD.‚THISISTHEADDRESSTHATTHE>*‰FIRMWAREDEBUGGERWILLJUMPTOWHENIPLISINITIALLYLOADED. ‰PAGEB*IFINITWASUSEDTOPLACEIPLONTOADISK,‚ITWILLAUTOMATICALLY:*ƒPERFORMTHEABOVESTEPSTOLOCATEIPLATADDRESS$0.‚THE@*ƒONLYTIMETHEABOVEMANUALPROCEDUREISREQUIRED,ISTOCHANGE<*ƒTHELOADADDRESSOFIPLFROM$0TOSOMEOTHERVALUE.‚NOTE:>*ƒBESURENOTTOALTERLOCATION8OFIPLSINCETHISVALUEMUST)*ƒBEUSEDIFIPLISEVERRELOCATEDAGAIN.*D*NOTE:‚ALATERVERSIONOFINITWILLAUTOMATICALLYPERFORMTHEABOVEB*ƒPROCEDUREIFUSEDWITHTHE;VOPTION.‚SEEDOCUMENTATIONFORINIT$*ƒUTILITYINVERSADOSDOCUMENTATION.*ŠPAGE M******************************************************************************'*’MODIFICATIONƒHISTORY*M*****************************************************************************.*‚ChangestoIPL,February1985‚(IDNT4,6)‚sml*I*1.If'IPL'isfoundinD4bits2and3willbeexaminedalso.‚InotherI*„words,ifbits0-3areused,'IPL'mustexistintheotherbytesofD4.*M*****************************************************************************.*‚Changesto< IPL,February1985‚(IDNT4,5)‚sml*I* 1. Changed the comparison to a word instead of a long word to determine)*„ifprogramisbootingfromanEXORmacs.*H* 2. If booting from an EXORmacs, via the panel, MACSbug (at the currentI*„time(V2.3))doesnotsetupD4correctly.‚Therefore,afterdetermining2*„thatwe'reusinganEXORmacsD4willbecleared.*ééééM*****************************************************************************-*‚ChangestoIPL,Janruary1985‚(IDNT4,4)‚rj*C* 1. Modified to handle an alternate TRAP #15 communication method.G*„ThecodesusedinmakingtheTRAP#15callsaredifferent.ThechangeE*„wasmadeprimarilytoaccomodatethedebuggerintheBenchmark020.*M******************************************************************************‚ChangestoIPL,December1984*H* 1. Modified to force position independent code. There were 8 occasionsE*„ofMOVEx(PC)whichwerenotchanged.‚2aremacroswhicharecalledK*„attimeswhenthebaseregisterhaschanged.‚2areinaroutinecurrentlyE*„notused.‚4areintheerrorhandling-messageroutineswhichuseA5A*„toholdthemessage.Theseplacesareallmarkedby'12/20/84'.*M******************************************************************************‚ChangestoIPL,August1984*G* 1. Modified to conform to new interface with firmware debuggers whichB*†tellifbugsupportsTRAP#15I/OanddiskI/O.‚IPLwilldisplayF*†userfriendlymessagesifthebugindicatesthattheyaresupported.*N* 2. Modified to put out error messages if the bugs disk I/O routine indicatedF*†anerrorduringthediskaccess.‚Themessageswillbedisplayedonly)*†ifTRAP#15I/Oissupportedofcourse.M*****************************************************************************7*‚ADDITIONALCHANGESTOIPLNOVEMBER1983(IDNT4,3)ƒrj*J* Commented out code in the 'Link Module' section which initialized unusedK* vectors to point to ABORT. This was done to accomodate systems that has aF* pending interupt remaining after the IPC interupt has been serviced.M*****************************************************************************8*‚ADDITIONALCHANGESTOIPLSEPTEMBER1983(IDNT4,3)ƒrj*M* 1. Changed IPL to now check only 'are we on a MACsbug type system?' insteadI*†ofalsocheckingforpannellightsonthesystem.TheassumptionnowisD*†thatifit'saMACsbugsystemthenpannellightsareavailableandG*†alsoTRAP#15support.Allothertypesystemsareassumedtonothave$*†pannellightsorTRAP#15support.*‡PAGEM*****************************************************************************1*‚ADDITIONALCHANGESTOIPLAPRIL1983(IDNT4,2)*J* 1. Changed IPL to allo= w loading files from the RWIN1 and MVME420-SA1403DF*†diskcontrollerboardswhilemaintainingcompatibilitywithexistingF*†bugswholoadfilesfromtheIPC.‚ThebootcommandwithinVMEbugandA*†TENbugweremodifiedtosupplyadditionalinformationtoIPLto@*†allowIPLtousethebugs'internaldiskreadroutine.‚IPLwasB*†modifiedto(1)savethisinformation,(2)totestaflagsetbyC*†thebug(codetotellIPLthatthecontrollerboardisnotanIPCC*†typeandIPLshouldusethebugs'diskreadroutine),and(3)setB*†updefinedregistersbeforecallingthebugs'diskreadroutine.*M*****************************************************************************$*‚CHANGESTOORIGINALIPLMARCH1982*>*1.Changedcommandlinesyntaxbyaddingnew'L'option.‚New=*†syntaxiscompatablewithstandardVERSAdosutilities.‚Used:*†standardparseandeditfileroutines.Thenew'L'option=*†willautomaticallybiasthestartaddressandstackpointerC*†valuewhenloadingafileatalocationotherthanthatspecified&*†intheLIB.‚Seeabovedocumentation.*B* 2. Included test to determine if we are on a MACSbug type system6*†thatsupportsTRAP#15terminalI/O.‚Ifweare,then;*†userfriendlymessagesareputupattheterminal.‚Other-;*†wise,nosuchmessagesaredisplayed.‚Incaseofanytype=*†ofabnormalerror,amessageisdisplayedifpossible.‚When@*†IPLerrorsitalwaysendsupatapointthatbranchestoself.?*†IfthesystemdoesnotsupportTRAP#15I/O,themessagewillH*†notbedisplayedbutthetypeoferrorcanbedeterminedbyperforming>*†softwareabortanddisplayingthestack.‚ThefirstlongwordC*†onthestack(directlypointedatbyA7)willcontaintheaddressC*†ofauserfriendlymessagethatwouldhaveappearedifthesystemF*†supportedTRAP#15I/O.‚Thenextlongwordonthestackwillcontain>*†intheloworderbyte,thepanellightvaluethatwouldhave3*†appearedonanEXORmacssystemwithpanellights.*@* 3. Added macros and subroutines that support bus error and bus;*†errorrecovery.‚Theseareusefulsinceabuserroroccurs9*†whentryingtoaccesspanellightregistersonasystem2*†thatdoesnothavepanellights(e.g.,VMC68/2).*C* 4. Enhanced so that the user number, catalog and extension can be;*†specifiedaspartofthebootfilename.‚Previously,only7*†thefilenamecouldbespecified-thefilehadtobe9*†underusernumber0,haveablankcatalog,andtheonly"*†extensionsearchedforwas'SY'.*ŠPAGE*E* 5. Fixed so that IPL will perform tests before it tries to relocate8*†itself.‚IPLwillnotattempttorelocateitselfifthe<*†fileitisbootinginwillnotoverlapanyofitscode.‚If=*†IPLmustrelocate,itteststhememorywheretherelocation5*†wouldnormallytakeplace.‚Thetestisperformedby?*†readingandwritinglongwordsofmemorythroughoutthespace?*†requiredtorelocateIPL.‚Ifmemoryisunavailable(signalled:*†byabuserror)IPLwillattempttorelocateitselftoa;*†higherlocationinmemory.‚Succesivetestsaremadeuntil=*†IPLeitherfindsacontiguousareaofRAMtorelocatetoor8*†untilthetestproceedspastthememoryaddresssetin=*†locationHIGHMEM(relativelocation0inIPL).‚Ifnomemory=*†canbefoundtorelocateIPLitwillhangwitherrorstatus *†indicatedinthepanellights.*@* 6. Fixed so that any unexpected exception vector taken will be@*†trappedinIPL.‚Theexceptionvectornumberwillbedetermined+*†anddisplayedinauserfriendlymessage.*,* 7. Disabled TRAP #15 I/O but left code in.*J* 8. Fixed so that on checking memory for relocation, no read of memory isC*†done.‚Thisisbecauseyoucan'tbootonanewlypoweredupsystemE*†ifmemoryhasnotbeeninitialized.‚Areadinthiscasewillalways*†resultinabuserror.*** DEBUGGING INFORMATION:*7*„WHENDEBUGGINGIPLITISPOSSIBLETODISABLESOFTWARE8*†AB= ORTIFTHEFILEYOUAREBOOTINGINCHANGESTHEVALUE8*†OFTHEVECTORTHATISTIEDTOTHESOFTWAREABORT.‚ONA7*†MACSBUG3.1SYSTEM,THISVECTORISATADDRESS$24AND6*†HASAVALUEOF$FE8808(TRACEVECTOR).‚ONAVERSAbug7*†SYSTEM,THEVECTORISATLOCATION$7C(USERINTERRUPT4*†LEVEL7VECTOR).‚IFYOUAREDEBUGGINGANDSOFTWARE5*†ABORTDOESNOTRESPOND,YOUPROBABLYWIPPEDOUTTHE$*†VECTORTIEDTOTHESOFTWAREABORT.* ŠPAGEM*******************************************************************************‡SYSTEMEQUATES*M******************************************************************************1FAILGT„EQU„$FE0002ŒMACSbugWATCHDOGTIMERADDRESS.TTOR†EQU„$FE0004ŒMACSbugTESTTIMEOUTREGISTER$IPCVECTA‚EQU„$3FCIPCVECTORADDRESS*K* MVALUE AND MADDR ARE USED TO DETERMINE IF WE ARE ON A MACSbug TYPE SYSTEMG*ƒIFTHEVALUEATMADDR=MVALUETHENITISASSUMEDWEAREONAMACSbugD*ƒSYSTEM.‚IFWEAREONAMACSbugSYSTEMTHENWEWILLPUTISSUEERROR *ƒMESSAGESTOTHEPANNELLIGHTS.*MVALUE„EQU„$4AFBMADDR…EQU„$FE9800** FHS PARAMETER BLOCK EQUATES FHSUSN„EQU„$A FHSCLG„EQU„$CFHSFIL„EQU„$14FHSEXT„EQU„$1CM*******************************************************************************‡DISKSTRUCTUREEQUATES*M******************************************************************************"VIDSDS„EQU„$C‘SECONDARYDIR.START*"SDBUSN„EQU„0’SEC.DIR.USERNUMBERSDBCLG„EQU„2’SEC.DIR.CATALOG-SDBPDP„EQU„$A‘PSNOFFIRSTPRIMARYDIR.BLOCK(SDBLEN„EQU„$10LENGTHOFSEC.DIR.ENTRY$SDBBEG„EQU„$10OFFSETTOFIRSTENTRY*DIRFIL„EQU„0’FILENAMEDIREXT„EQU„8’FILEEXTENSIONDIRFS…EQU„$C‘PSNOFFILESTARTDIRFE…EQU„$10FILESIZEDIRATT„EQU„$1EFILEATTRIBUTES(DIRLEN„EQU„$32LENGTHOFPRI.DIR.ENTRY$DIRBEG„EQU„$10OFFSETTOFIRSTENTRY*%DATCON„EQU„0’CONTIGUOUSATTRIBUTEBITDFTBIT„EQU„7’ATTRIBUTEMASK*"SDBLK…EQU„256SEC.DIR.BLOCKSIZE#PDBLK…EQU„1024PRI.DIR.BLOCKSIZE*2SEG0ADDR‚EQU„$38OFFSETINTOLIBOFSEGSTARTADDRŠPAGEM*******************************************************************************ˆCHANNELEQUATES*M******************************************************************************,IPCINT„EQU„$0D68000TOIPCINTERRUPTOFFSET'IPCIMB1ƒEQU„$10168000TOIPCWRITEBOX)IPCIMA1ƒEQU„$10368000TOIPCACK/NAKBOX#IPCIM1„EQU„$10568000COMMANDWRITE'IPCIMB2ƒEQU„$181IPCTO68000WRITEBOX%IPCIAB2ƒEQU„$183IPCTO68000ACKBOX!IPCIM2„EQU„$185IPCCOMMANDWRITE M****************************************************************************** *‰ALTERNATETRAP#15I/OEQUATES*M******************************************************************************6.OUTSTRƒEQU„$21Outputstring‚(pointer/pointerformat)3.OUTLN„EQU„$22Outputline„(pointer/pointerformat)".RETURNƒEQU„$63Returntodebugger4.DSKRD„EQU„$10Readblock(s)fromdeviceintomemory ŠPAGE%**************************************†<>**** MACRO USED TO INTERFACE TRAP #15 HANDLER SYSCALLƒMACRO ŠTRAP#15ŠDC.Wƒ\1ŠENDM*,* MACRO USE TO SET UP FOR POSSIBLE BUS ERROR BUSERINƒMACRO-ŠPEA„\1(PC)PUSHRETURNADDRESSFORBUSERROR!ŠBSR.L‚SETBUSER‹SETFORBUSERRORŠENDM*=* MACRO USED TO CLEAN UP AFTER SET UP FOR POSSIBLE BUS ERROR.7*ƒITMUSTBEUSEDWHETHERTHEBUSERROROCCURREDORNOTBUSEROUT‚MACROŠMOVE.WSR,-(A7)@ŠMOVE.LOLDBSERR(PC),-(A7)CANT'TCHANGE:BASEA1ORA5…12/20/84/ŠMOVE.L(A7)+,$8‹RESTOREORIGINALABORTADDRESSŠMOVE.W(A7)+,SRŠENDM*<* MACRO TO PUT OUT MESSAGE FOLLOWED BY LIGHTING PANEL LIGHTS*ƒCALLINGSEQUENCE:*ƒMSGL‚MSGS,MSGE,CODE'*†WHEREMSGS=ERRORNUMBERIN‚GESTART*ŒMSGE=ADDRESSOFMESSAGEEND=*ŒCODE=PANELLIGHTCODETOBEPLACEDBACKINTOPANELLIGHTS*•AFTERMESSAGEISOUTPUT* MSGL†MACROŠMOVEM.LA5-A6,-(A7)ŠLEA„\1(PC),A5ŠLEA„\2(PC),A6 ŠBSR„MSGOUTŠMOVEM.L(A7)+,A5-A6ŠMOVE.L#$\3,D7 ŠBSR„LITPANAŠENDM*'* MACRO TO MAKE ENTRY INTO ERROR TABLE.* CALLING SEQUENCE:*ƒERRTBLNUM,CODE> *…WHERENUM‚=ERRORNUMBER*‹CODE=ERRORCODE* ERRTBL„MACRO ŠBSR„ERRORAŠDC.LƒERROR\1S-*ŠDC.LƒERROR\1E-* ŠDC.Wƒ$\2ŠENDMŠPAGE*6* MACRO TO GENERATE A POSITION INDEPENDENT SEQUENCE OF4*ƒINSTRUCTIONSTOMOVEDATATOALOCATIONIFPROGRAM!*ƒBASEREGISTERISNOTAVAILABLE.* CALLING SEQUENCE EXAMPLE:**‰MOVEPI.WA0,D3,TAG*K*WHEREA0‚=SCRATCHREGISTER(PRESERVEDAFTERMOVE)-MUSTBE'A'REGISTER*‡D3‚=DATATOMOVE*‡TAG=WHERETOMOVEDATA* MOVEPI„MACRO7ŠMOVE.L\1,-(A7)‹SAVESCRATCHREGISTERONSTACKFORNOW8ŠLEA„SCRSAV(PC),\1†ADDRESSOFWHERETOSAVESCRATCHREG.+ŠMOVE.L(A7)+,(\1)‰SAVESCRREG&FIXSTACK0ŠLEA„\3(PC),\1ŠGETADDRESSOFWHERETOMOVEDATAŠMOVE.\0\2,(\1)‹MOVEDATAAŠMOVE.LSCRSAV(PC),\1†RESTORESCRATCHREGISTER(NOCHNG12/20/84)ŠENDM** MACRO TO REPEAT AN ENTRY*ƒCALLINGSEQUENCE:*…RPTNUM,,*‡WHERENUMISTHENUMBEROFTIMESTOREPEAT"*PATTERNISTHEPATTERNTOREPEAT* RPT‡MACRO T1ˆSET„\1ŠIFNEƒT1\2 T2ˆSET„T1-1 ŠRPT„T2,<\2>ŠENDCŠENDMŠPAGE** DEBUGGER REQUIRED VALUES=*ƒWHENFIRMWAREDEBUGGERLOADSIPL,ITSETSTHESTACKPOINTERJ*…TOTHEVALUEFOUNDINLOCATION0OFTHELOADMODULEPORTIONOFTHEFILE.D*…ITTRANSFERSCONTROLTOTHEADDRESSSPECIFIEDINLOCATION4OFTHE*…LOADMODULEFILE.*D*ƒSINCEIPLSETSITSOWNSTACKPOINTERUPONEXECUTION,LOCATION0OFC*…THELOADMODULEFILEISNOTREQUIREDTOHAVEANYSPECIALVALUEIN>*…IT.‚WEARETHEREFORFREETOPLACETHEHIGHMEMVALUE(HIGHEST=*…RAMLOCATIONTOSEARCHFORIPLRELOCATION)INTOLOCATION0.*8*ƒLOCATION4MUSTCONTAINTHEINITIALEXECUTIONADDRESS.*E*ƒLOCATION8CONTAINSANASCIISTRINGIDENTIFYINGTHEVERSIONOFIPL.*…8CHARACTERSLONG.*@*ƒSPACEISRESERVEDFORALLOFTHEREMAININGVECTORS.‚THISSPACE9*…ISREQUIREDIFIPLISLOADEDINTOLOCATION0OFMEMORY.*6HIGHMEMƒDC.Lƒ$40000RESET:INITIALSSP,SINCEIPLSETS&*£...ITSOWNSTACK,THISENTRYISNOT&*£...REQUIREDSOWECANPLACEHIGHMEM*£...VALUEHERE.ŠDC.LƒENTRYŽRESTART<ŠDC.Lƒ'0226854'‰VERSIONCOVERSBUSERROR&ADDRERRORVECTS#ŠDC.Lƒ$00FE9E6EŠILLEGALINSTRUCTION* * VECTORS* ŠDCB.L‚4,0"ŠDC.Lƒ$FE8808ŒMACSbugTRACEVECTOR ŠDCB.L‚22,0* TRAP VECTORS BEGIN HERE ŠDCB.L‚15,0'ŠDC.Lƒ$00FE9F7CŠMACSbugTRAP#15VECTOR(ŠDS.Bƒ$400-(*-B)‰ALLOWSPACEFORVECTORSŠPAGEM*******************************************************************************ˆRAMDEFINITIONS*M********************************************************************************‡DISKI/OBUFFER*IOBUF…DS.Bƒ$4004SECTORBUFFER*4* FMS PARAMETER BLOCK USED BY EDITFILE FOR FILE NAME*ƒDEFAULTVALUESARESHOWN INPFHS„EQU„*ŠDS.Bƒ10‘COMMAND->VOLUMEŠDC.Wƒ0’USERNUMBERŠDC.Bƒ'ˆ'‰CATALOGŠDC.Bƒ'VERSADOS'‰FILENAMEŠDC.Bƒ'SY'EXTENSION%ŠDS.Bƒ10‘REMAINDEROFPARAMETERBLOCK** COMMAND LINE$CLINE…COMLINE82COMMANDLINEBUFFER*CLENGTHƒEQU„*-CLINEŒLENGTHOFCOMMANDLINE+HMEM†DS.Lƒ1’SAVEFORVALUEINLOC$0OFIPL*ŠPAGE** COMMAND PACKET IMAGE* PKOUTS„EQU„* ŠDC.Bƒ$02STX ŠDC.Bƒ$55ID IPCPKSZƒEQU„*-PKOUTS‹PACKETSIZEŠDC.BƒPKOUTE-PKOUTS(IPCDEVNƒEQU„*-PKOUTS‹DEVICENUMBER(VAR)ŠDC.Bƒ0ŠDC.Bƒ$10READ‚COMMAND#ŠDC.Bƒ$01DEVICECOMMAND(WITHCRC)IPCBLKNM‚EQU„*-PKOUTSŠDC.Wƒ$01#BLKSTOXFR(VAR)*ŠDC.Wƒ$100BLOCKSIZE(VAR)IPCMEMAD‚EQU„*-PKOUTSŠDC.Lƒ0’STARTINGMEMADDR(VAR)*ŠDS.Wƒ1’CHECKSUMIPCSECNM‚EQU„*-PKOUTSŠDC.Lƒ0’STARTINGSECNUM(VAR) ŠDC.Bƒ$03ETXPKOUTE„EQU„*’ENDOFPACKETŠDS…0 ŠPAGEM********************************************************************************‡PROGRAMSEGMENT**M******************************************************************************* ENTRY:„EQU„**.* SET REGISTERS AND SAVE IMPORTANT INFORMATION)ŠMOVE.W#$2700,SRŠMAKESURENOINTERRUPTSŠLEA„STACK(PC),A7‡SETUPSTACK ŠLEA„B(PC),A1)ŠMOVE.LA1,SAVA5-B(A1)…SAVEA5BASEVALUE ŠMOVE.L> HIGHMEM-B(A1),HMEM-B(A1)AŠMOVE.LA2,DSKCONF-B(A1)ƒ*SAVEADDRESSOFDISKCONFIGURATIONDATA@ŠMOVE.LA3,DSKOUT-B(A1)„*SAVEADDRESSOFBUGS'DISKREADROUTINE6ŠMOVE.BD2,DSKCODE-B(A1)ƒ*SAVEDISKCONFIGURATIONCODE5ŠMOVE.LD3,IPCFLAG-B(A1)ƒ*SAVEIPCFLAGFROMDEBUGGER !ŠLEA„IOBUF(PC),A2‡DISKI/OBUFFER%ŠLEA„PKOUTS(PC),A3†IPCCOMMANDPACKET.ŠMOVE.LA2,IPCMEMAD(A3)„PLUGINBUFFERADDRESS1ŠMOVE.LA4,MACSBUG-B(A1)ƒSAVEMACSBUGENTRYPOINT+ŠMOVE.BD0,IPCDEVN(A3)…SETUPDEVICENUMBER,ŠMOVE.LA0,IPCADR-B(A1)„SAVECHANNELADDRESS6ŠMOVE.L$BC,MACST15-B(A1)‚SAVEMACSBUGTRAP#15VECTOR !ŠLEA„IOBUF(PC),A2‡DiskI/Obuffer-ŠLEA„T15DIOPK(PC),A3„TRAP#15diskI/Opacket1ŠMOVE.LA2,T15DMADR(A3)„InsertI/Obufferaddress+ŠMOVE.BD0,T15DDRVN(A3)„Insertdrivenumber0ŠMOVE.BD1,T15DCTRN(A3)„InsertcontrollernumberŠPAGE4**************************************************** *12/08/83I* We cannot use the TRAP #15 support on an EXORmacs system because of theD*ƒpossibilityofbeingbootedinfromthefrontpanel(notusingtheE*ƒbootcommand).‚InthiscasetheserialportwillnotbeinitializedA*ƒproperlyandwewillbehungouttodryifwetryTRAP#15I/O.*E*SeeifweareonaMACSbugtypesystem.‚Ifnotthensetflagforno*ƒpanellights. 8ŠBSETƒ#T15IO,FLAGS-B(A1)SetfornoTRAP#15I/Osupport"ŠBUSERINTPLITE1‹Setforbuserror:ŠCMP.W‚#MVALUE,MADDR†AreweonanEXORmacssystem?021385ŠBNE.S‚TPLITE1ŒNo.. *Œ0213854,5@*†MACSbugV2.3doesnotcorrectlysetupD4.‚Ifthisgetsfixed,&*†thenextinstructioncanbedeleted.ŠCLR.L‚D4‘Yes..‚021385 ŠBRA.S‚TPLITE ééééééé9TPLITE1ƒBSETƒ#NOLITE,FLAGS-B(A1)„IndicatenopanellightsTPLITE„BUSEROUT $ŠMOVE.LD4,D0ŽNewI/Ointerfaceflag7ŠAND.L‚#$FFFFFF00,D0†Masktohighordertestfor'IPLx'D4MASK„EQU„'IPL'&$FFFFFF00ŠIF.LD0#D4MASKTHEN.S7BTST‚#0,D4ŒNewbuginterface-seeifTRAP#15supportIFTHEN.S8BCLR‚#T15IO,FLAGS-B(A1)IndicateTRAP#15I/OsupportedENDI BTST‚#1,D4ŒUseBUG'sdiskI/O?IFTHEN.S8MOVE.L#'ME4U',IPCFLAG-B(A1)YES..usediskI/OfromBUGENDI ,BTS? T‚#2,D4ŒAlternateTRAP#15I/Osupport?IFTHEN.SBSET#ALT15IO,FLAGS-B(A1)ENDI 'BTST‚#3,D4ŒTRAP#15diskI/Osupport?IFTHEN.SBSET#T15DSKIO,FLAGS-B(A1)8MOVE.L#'ME4U',IPCFLAG-B(A1)YES..usediskI/OfromBUGENDI ŠENDI022685ŠPAGE*>* MOVE COMMAND LINE FROM DEBUGGER'S BUFFER TO MINE FOR PARSING7ŠLEA„CLINE(PC),A0‡FIRSTBYTEAVAILABLEFORCOMMANDLINE@ŠLEA„CLINE+CLENGTH-2(PC),A1LASTBYTEAVAILABLEFORCOMMANDLINECL2‡CMP.L‚A6,A5+ŠBHS.S‚CL4BRANCHIFCOMMANDLINEALLMOVED ŠCMP.L‚A1,A0.ŠBHI.S‚CL4BRANCHIFNOMOREROOMINMYBUFFER4ŠMOVE.B(A5)+,(A0)+ˆMOVEBYTEFROMDEBUGGER'SBUFFER ŠBRA.S‚CL28CL4‡MOVE.B#$0D,(A0)ŠMOVEINCARRIAGERETURNTOMARKEND ŠMOVE.LA0,D6*=* PARSE THE COMMAND LINE - FIRST PROCESSING THE OPTIONS FIELD&ŠLEA„CLINE(PC),A0‡COMMANDLINEADDRESS#ŠSUB.L‚A0,D6ŽLENGTHOFCOMMANDLINE.ŠADD.L‚#1,D6ŽINCLUDECARRIAGERETURNFORPARSE ŠBSR„PARSE1ŠLEA„B(PC),A5‹REBASEA5'CAUSEPARSEWIPESITOUT@* ON RETURN FROM PARSE, A1=ADDR OF OUTPUT FIELD OR 0, A2=ADDR OF*ƒOPTIONSFIELDOR0.+ŠTST.L‚D0‘DIDWEHAVEACOMMANDLINEERROR? ŠBPL.S‚OPT2 ŠBSR„ERROR1'COMMANDLINEERROR'/OPT2†MOVE.LA2,D0ŽDIDWEHAVEANOPTIONSFIELD?ŠBEQ.S‚OPT8BRANCHIFNO(ŠCLR.W‚-(A7)ŽCLEARATEMPORARYFLAGAREAOPTNXT„BSR„OPTION"ŠLEA„B(PC),A5‹RELOADBASEREGISTER1ŠCMP.B‚#$40,D0ŒHAVEWEFINISHEDWITHTHEOPTIONS?ŠBEQ.S‚OPT7BRANCHIFSOŠBTSTƒ#7,D0ŽOPTIONERROR?ŠBEQ.S‚OPT3BRANCHIFNO'OPTERR„BSR„ERROR2'OPTIONSFIELDERROR'0OPT3†MOVE.L#HFLG,D0‹BITTOSETIF'H'OPTIONONŠCMP.B‚#'H',D1$ŠBNE.S‚OPTLBRANCHIFNOT'H'OPTION$ŠBSR.S‚OPTESTGOSET'H'OPTIONFLAG,ŠBNE.S‚OPTERRBRANCHIF'H'OPTIONSETTWICE ŠBRA.S‚OPTNXTGOFORNEXTOPTION0OPTL†MOVE.L#LFLG,D0‹BITTOSETIF'L'OPTIONONŠCMP.B‚#'L',D1-ŠBNE.S‚OPTERRBRANCHIFNOT'H'OR'L'OPTION$ŠBSR.S‚OPTESTGOSETOPTION'L'FLAG,ŠBNE.S‚OPTERRBRANCHIFOPTION'L'SETTWICEŠBTSTƒ#0,D3ŽODDADDRESS?#ŠBNE.S‚OPTERRBRANCHIFYES-ERROR8ŠMOVE.LD3,LOADADDR-B(A5)‚MOVEINSPECIFIEDLOADADDRESS ŠBRA.S‚OPTNXTŠPAGE*OPTEST„BSETƒD0,4(A7)1ŠBNE.S‚OPTESTXŒBRANCHIFOPTIONALREADYSPECIFIED%ŠBSETƒD0,FLAGS-B(A5)…SETOPTIONSFLAG ŠTST.L‚D1ŠBPL.S‚OPTESTOK0ŠBCLRƒD0,FLAGS-B(A5)…CLEARFLAGIF'-'OPTIONON(OPTESTOK‚CLR.L‚D0‘SETOKCONDITIONCODES OPTESTXƒRTSOPT7†ADD.L‚#2,A7ŽCLEANUPSTACK OPT8†EQU„**E* PERFORM EDIT FILE TO FILL PARAMETER BLOCK WITH FILE NAME FOR SEARCH-ŠLEA„INPFHS-B(A5),A6„FHSPARAMETERBLOCKADDR&ŠLEA„CLINE(PC),A0‡ADDRESSOFFILENAME ŠBSR„EDITFILE ŠTST.L‚D02ŠBPL.S‚EDFL2ŽBRANCHIFNOERRORINFILENAMEPARSE&ŠBSR„ERROR3'ERRORINFILENAMEPARSE''EDFL2…BTSTƒ#22,D0WASVOLUMESPECIFIED?%ŠBEQ.S‚EDFL8ŽBRANCHIFNO-OKSOFAR)ŠBTSTƒ#14,D0VOLSPECIFIED-WASITNULL?ŠBNE.S‚EDFL8ŽBRANCHIFYES-OK!ŠBSR„ERROR4'VOLUMENAMEILLEGAL' EDFL8…EQU„** *ˆREADVID*1READVIDƒMOVE.LIPCADR-B(A5),A4„SETUPIPCADDRESS+ŠLEA„PKOUTS(PC),A3†SETUPPOINTERTOPACKETŠBSR„DISKIOREADVID$ŠLEA„IOBUF(PC),A1‡SETUPVIDPOINTER4ŠMOVE.LVIDSDS(A1),IPCSECNM(A3)SETUPSEC.DIR.PSN**ˆLOOKUPSECONDARYDIRECTORY*&SEC000„BSR„DISKIOREADSEC.DIR.BLOCK3ŠLEA„IOBUF+SDBBEG(PC),A1SETUPFIRSTENTRYPOINTER1ŠLEA„IOBUF+SDBLK(PC),A6ENDIFSECDIRBLOCKADDR8SEC010„MOVE.WINPFHS+FHSUSN-B(A5),D0DESIREDUSERNUMBERŠCMP.W‚SDBUSN(A1),D0†MATCH?ŠBNE.S‚SEC020NO,SKIPENTRY7ŠMOVEM.LINPFHS+FHSCLG-B(A5),D0-D1DESIREDCATALOGNAMEŠCMP.L‚SDBCLG(A1),D0-ŠBNE.S‚SEC020BRANCHIFCATALOGDOESN'TMATCHŠCMP.L‚SDBCLG+4(A1),D1 ŠBNE.S‚SEC0204ŠMOVE.LSDBPDP(A1),IPCSECNM(A3)SETUPPRI.DIR.PSN ŠBRA.S‚PRI000*SEC020„ADD.L‚#SDBLEN,A1‰BUMPTONEXTENTRY%ŠCMP.L‚A6,A1ŽENDOFSEC.DIR.BLOCK?ŠBLT.S‚SEC010NO?ŠMOVE.LIOBUF-B(A5),IPCSECNM(A3)YES,SETUPPSNFORNEXTBLOCK ŠBNE.S‚SEC021ŠBSR„ERROR6FILENOTFOUND/SEC021„BRA.S‚SEC000GOGETNEXTSEC.DIR.BLOCK*-*ˆFOUNDSEC.DIR.,NOWLOOKUPPRI.DIRECTORY*:PRI000„MOVE.LSDBPDP(A1),IPCSECNM(A3)SETUPPRI.DIR.PSN3ŠMOVE.W#4,IPCBLKNM(A3)„SETUPPRI.DIR.BLOCK? SIZE&PRI010„BSR„DISKIOREADPRI.DIR.BLOCK3ŠLEA„IOBUF+DIRBEG(PC),A1SETUPFIRSTENTRYPOINTER4ŠMOVEM.LINPFHS+FHSFIL-B(A5),D0-D1DESIREDFILENAMEŠLEA„IOBUF+PDBLK(PC),A6!PRI020„CMP.L‚DIRFIL(A1),D0†MATCH?ŠBNE.S‚PRI030NOŠCMP.L‚DIRFIL+4(A1),D1ŠBNE.S‚PRI030NO0ŠMOVE.WINPFHS+FHSEXT-B(A5),D3ƒDESIREDEXENTSIONŠCMP.W‚DIREXT(A1),D3†MATCH?ŠBEQ.S‚CHK000YES,FOUNDEM!4PRI030„ADD.L‚#DIRLEN,A1‰BUMPTONEXTPRI.DIR.ENTRY%ŠCMP.L‚A6,A1ŽENDOFPRI.DIR.BLOCK?ŠBLT.S‚PRI020NO?ŠMOVE.LIOBUF-B(A5),IPCSECNM(A3)YES,SETUPPSNFORNEXTBLOCK ŠBNE.S‚PRI010ŠBSR„ERROR6FILENOTFOUND*3*ˆFOUNDTHEPRIMARYDIR.ENTRY,CHECKTHEFILETYPE*0CHK000„MOVE.BDIRATT(A1),D1†PICKFILEATTRIBUTES ŠAND.B‚#DFTBIT,D1‰MASKFILETYPE(ŠCMP.B‚#DATCON,D1‰CONTIGUOUSFILETYPE? ŠBEQ.S‚CHK001ŠBSR„ERROR7INVALIDFILETYPE=CHK001„MOVE.LDIRFS(A1),IPCSECNM(A3)SETUPSTARTPSNOFFILE*.* READ LOADER INFORMATION BLOCK (LIB) FOR BIAS3ŠMOVE.WDIRFE+2(A1),-(A7)‚SAVEFILESIZETILLLATER6ŠMOVE.W#1,IPCBLKNM(A3)„SETTOREADONEBLOCKFROMLIBŠBSR„DISKIOREADTHEDISK4ŠBTSTƒ#LFLG,FLAGS-B(A5)‚WASAN'L'OPTIONSPECIFIED?5ŠBNE.S‚LSPCBRANCHIFYES,ADDRSPECIFIEDINLOADADDRFŠMOVE.LIOBUF+SEG0ADDR-B(A5),LOADADDR-B(A5)NO,USELIBADDRAS'L'ADDRLSPC†MOVE.LLOADADDR-B(A5),D0+ŠSUB.L‚IOBUF+SEG0ADDR-B(A5),D0COMPUTEBIASŠMOVE.LD0,BIAS-B(A5)<ŠADD.L‚#1,IPCSECNM(A3)„ADJUSTREADADDRTOSEC1,BEYONDLIB9ŠMOVE.W(A7)+,IPCBLKNM(A3)SETUPFILESIZEFORNEXTREAD*?*SEEIFWEHAVETORELOCATEDISKROUTINE.‚WEDON'TIFTHEFILE7*ƒWEAREBOOTINGINDOESNOTOVERLAPOURADDRESSSPACE.C*ƒIFRELOCATIONTAKESPLACE,ONLYTHECODEBETWEENLINKANDENDLINK*ƒISACTUALLYRELOCATED.* REL‡CLR.L‚D07ŠMOVE.WIPCBLKNM(A3),D0„#OF256BYTEBLOCKSTOREADIN4ŠLSL.L‚#8,D0ŽZERORELATIVEENDBYTE+1OFBOOTFILE=ŠMOVE.LLOADADDR-B(A5),D1‚D1=BOOTFILEBEGINNINGLOADADDRESS6ŠADD.L‚D1,D0ŽD0=BOOTFILEENDINGLOADADDRESS+1BYTE-ŠLEA„LINK(PC),A1ˆCURRENTADDRESSOFLINKBASE)ŠMOVE.LA1,D2ŽSETUPFORBRANCHTOMOVDUN:ŠLEA„ENDLINK(PC),A6…CURRENTENDOFIPLSECTIONTORELOCATE2ŠLEA„$100(A6),A6ˆROUNDUPTONEAREST$100BOUNDARY ŠMOVE.LA6,D3 ŠLSR.L‚#8,D3 ŠLSL.L‚#8,D3 ŠMOVE.LD3,A6>* CURRENTLY D0 = BOOT FILE ENDING MEMORY LOAD ADDRESS + 1 BYTE.*‹D1=BOOTFILEBEGINNINGMEMORYLOADADDRESS?*‹D2=MEMORYADDRESSOFLABEL'LINK'-BEGINNINGOFRELOCATION$*‹A5=MEMORYADDRESSOFBASEOFIPL?*‹A6=MEMORYADDRESSOFENDOFIPLROUNDEDUPTTONEAREST$100C* SEE IF FILE WE ARE BOOTING WILL OVERLAP ANY OF IPL'S CODE FORCING*ƒUSTORELOCATEFIRST.*,ŠCMP.L‚A5,D1ŽBOOTBEG.ADDR**************************************************************)* SUBROUTINE TO INITIALIZE UNUSED VECTORS:*ƒENTRY:A0=ADDRESSTOSTUFFINTOVECTOR#0IFREQUIRED4*‹FOREACHSUCCESSIVEVECTORUNDERCONSIDERATION,A00*‹ISINCREMENTEDBYVALUETHATWASPASSEDIND0.1*‹(UNUSEDVECTORNUMBERSAPPEARINIMGVECTTABLE.*INITVECT‚EQU„*ŠMOVEM.LD0-D1/A1-A2,-(A7)3ŠLEA„IMGVECTS(PC),A1„A1POINTSTOVECT#SKIPTABLE&ŠSUB.L‚A2,A2ŽA2POINTSTOREALVECTORS/ŠCLR.L‚D1‘D1WILLCONTAINCURRENTVECTORNUMBER0ŠMOVE.B(A1)+,D0‹D0=NEXTVECTORNUMBERTOSKIP*9VMV3†CMP.B‚D0,D1ŽDOESCURRENTVECTOR#MATCHTABLEENTRY?ŠBNE.S‚VMV4BRANCHIFNO6ŠMOVE.B(A1)+,D0‹YES-D0=NEXTVECTORNUMBERTOSKIP0ŠBRA.S‚VMV5BYPASSINITIALIZATIONOFTHISVECTOR.VMV4†MOVE.LA0,(A2)ŒNO-INITIALIZETHEVECTOR VMV5†ADD.L‚(A7),A0ŒADDPASSEDD0*ŠADD.L‚#4,A2ŽPOSITIONTOSTUFFNEXTVECTORŠADD.L‚#1,D1ŽBUMPVECTORNUMBER.ŠCMP.L‚#$400,A2‹HAVEWEPROCESSEDALLVECTORS?ŠBLO.S‚VMV3BRANCHIFNOŠMOVEM.L(A7)+,D0-D1/A1-A2ŠRTSŠPAGE%*************************************,* SUBROUTINE TO SAVE VECTOR VALUES (SAVVECT)0* SUBROUTINE TO RESTORE VECTOR VAULES (RSTRVECT)*ƒALLREGISTERSPRESERVED*SAVVECTƒMOVEM.LD0/A1-A2,-(A7)-ŠSUB.L‚A1,A1ŽPOINTA1TOBEGINNINGOFVECTORS9ŠLEA„VSAV(PC),A2ˆPOINTA2TOAREAWHEREVECTORSARESAVED GOMOV…BSR.S‚MOVVECTŒMOVEVECTORSVMOVRTSƒMOVEM.L(A7)+,D0/A1-A2ŠRTS*RSTRVECT‚MOVEM.LD0/A1-A2,-(A7)-ŠSUB.L‚A2,A2ŽPOINTA2TOBEGINNINGOFVECTORS9ŠLEA„VSAV(PC),A1ˆPOINTA1TOAREAWHEREVECTORSARESAVEDŠBRA„GOMOVŽGOMOVEVECTORS*MOVVECTƒMOVE.L#$100-1,D0MVLOOP„MOVE.L(A1)+,(A2)+ŠDBRAƒD0,MVLOOPŠRTSM****************************************************************************** VECTOR CLAIM TABLE FOLLOWS.:*ƒIFTHENUMBERAPPEARSINTHETABLE,THENDON'TALTERTHE0*…VECTOR,ELSETHEVECTORISAVAILABLETOCLAIM.0*…VECTORNUMBERSMUSTAPPEARINASCENDINGORDER.7*…ANYENTRYOUTOFASCENDINGORDERTERMINATESTHETABLE*IMGVECTS‚EQU„**)ŠDC.Bƒ0’POSSIBLESTACKVALUEFORVERSADOS(ŠDC.Bƒ1’POSSIBLESTARTADDRFORVERSADOS,ŠDC.Bƒ4’VECTOR#4ƒ=ILLEGALINSTRUCTION(BR)*ŠDC.Bƒ9’VECTOR#9ƒ=MACSbugTRACE/SWABORT/ŠDC.Bƒ$1EVECTOR#$1E=VME115/120/128SWABORT*ŠDC.Bƒ$1FVECTOR#$1F=VMCSOFTWAREABORT/ŠDC.Bƒ$2FVECTPR#$2F=MACSbugTRAP#15VECTOR,ŠDC.Bƒ$4EVECTPR#$4E=VME10SOFTWAREABORT+ŠDC.Bƒ0’SPACEFORPATCHINGINOTHERVECTORS+ŠDC.Bƒ0’SPACEFORPATCHINGINOTHERVECTORS+ŠDC.Bƒ0’SPACEFORPATCHINGINOTHERVECTORS*£TABLETERMINATORISBYTE=0ŠDS…0*G* NOTE THAT SOFTWARE ABORT IS NOT AT THE SAME LOCATION FOR VMC AS IT IS*ƒFORVERSAbug.*#IMGVECTE‚EQU„*’ENDOFIMAGEVECTORSŠPAGE%************************************* * ABORT -$* GENERATE 256 TIMES THE INSTRUCTION *‰BSR„ABORTP&*ƒFORUSEASPSEUDOVECTORSTOCOMPUTE!*…VECTORNUMBERINCASEOFVECTOR *…EXCEPTION.* ABORT…EQU„*ŠBSR„ABORTPBSR#1*‰.*‰.*‰.#*‰RPT„254,‚BSR#2-#255ŠNOLISTŠRPT„254,ŠLISTŠBSR„ABORTPBSR#256ŠPAGE%************************************* * SETBUSER*ƒSETSUPFORBUSERROR$*…SAVESCONTENTSOFBUSERRORVECTOR*‡FORFUTURERESTORATION!*…SAVESRETURNADDRESSANDRETURN*‡STACKPOINTERVALUEFOR *‡BUSERRTORESTOREINTHEEVENT*‡OFABUSERROR*ƒCALLINGSEQUENCE:#*…PEA‚*…BSR.LSETBUSER*SETBUSER‚EQU„*;ŠMOVEPI.LA0,$8,OLDBSERRƒSAVEOLDBUSERRORVECTORCONTENTS3ŠMOVEPI.LA0,4(A7),BRTN„RETURNADDRESSONBUSERROR ŠPEA„8(A7),ŠMOVEPI.LA0,(A7)+,BSTK„RETURNSTACKPOINTERŠPEA„BUSERR(PC),ŠMOVE.L(A7)+,$8‹INITIALIZEBUSERRORVECTOR!ŠMOVE.L(A7)+,(A7)‰SETUPFORRTSŠRTS%****************A ********************** BUSERR*ƒGETSCONTROLONBUSERROR#*ƒSETSSTACKPOINTERANDRETURNSTO!*…PREVIOUSLYESTABLISHEDADDRESS.#*ƒALSORESTORESBUSERRORVECTORTO*…POINTTOHANGABORTADDRESS* BUSERR„EQU„*7ŠMOVE.LBSTK(PC),A7‹THISROUTINENOTCALLED...…12/20/84>ŠMOVE.LBRTN(PC),-(A7)ˆMOVE.LX(PC)CODELEFTASIS..12/20/84ŠRTSŠPAGEL**************************************************************************** *DISKIO:Â**DISKCONTROLROUTINE...²**Ê*>*ŒTHISROUTINECHECKSIPCFLAGTODETERMINEIFTHECONTROLLER„*C*‡ISANIPC.‚IFITIS,IPLWILLUSETHEFOLLOWINGDISKIOROUTINE.ƒ*F*‡IFITISN'T,IPCMUSTSETUPSOMEREGISTERSANDUSETHEDEBUGGERS'**‡INTERNALDISKREADROUTINE.¨**Ê*;*ŒTHEREARENOINTERRUPTSRECOGNIZEDBYTHE68000INTHIS‡*>*‡ROUTINE.‚ASARESULTALLCOMMUNICATIONBETWEENTHEIPCANDˆ*B*‡THE68000MUSTBEHANDLEDBYAPOLLINGTECHNIQUE,RE-EXAMINING…*D*‡COMMUNICATION"FLAGS"UNTILTHEEVENTSREQUESTEDHAVECOMPLETED.ƒ*=*‡NOTEHOWEVER,THATTHEIPCMUSTSTILLBEGIVENINTERRUPTS.Š**Ê*!*‡UPONENTRYTOTHISROUTINE...¦*8*‰A3ˆ=THEADDRESSOFTHECOMMANDPACKETBEINGSENTTO†**•THESPECIFIED"IPC".¡*$*‰A4ˆ=THEADDRESSOFTHECHANNEL.š**Ê**Ê*>*‡SHAREDMEMORYUSEDFORCOMMUNICATIONBETWEENTHE68000AND‰*2*‡THEREQUESTEDIPCISLOCATEDBYTHEFOLLOWING:•*"*FF0000+(IPCNUMBER*$200)œ**Ê*K***************************************************************************** DISKIO„EQU„*ŠMOVE.LIPCFLAG-B(A5),D09ŠCMP.L‚#'ME4U',D0‰THISROUITNEORTHEDEBUGGERS'ROUTINE?0ŠBNE„DISKIPCŒ'ME4U'MEANSUSEDEBUGGERS'ROUTINE******************************SETUPREGSFORDEBUGGER‚******************************.DISKEXTƒCLR.W‚RETRY-B(A5)ˆCleartheretrytype5DISKEXT1‚MOVEM.LA3-A5,-(A7)‡THESEMUSTBEMAINTAINED ŠCLR.L‚D01ŠMOVE.WIPCBLKNM(A3),D0„NUMBERBLOCKSTOTRANSFER ŠCLR.L‚D19ŠMOVE.BDSKCODE-B(A5),D1ƒDISKCONFIGURATIONCODE(BYTE5)+ŠMOVE.LIPCMEMAD(A3),D2„MEMORYLOADADDRESS(ŠMOVE.LIPCSECNM(A3),D3„STARTINGBLOCK#ŠMOVE.LA4,A0ŽCHANNELADDRESS;ŠMOVE.LDSKCONF-B(A5),A2ƒADDRESSOFDISKCONFIGURATIONDATA:ŠMOVE.LDSKOUT-B(A5),A1„ADDRESSOFBUGS'DISKREADROUTINE0ŠBTSTƒ#3,FLAGS-B(A5)…TRAP#15diskI/OsupportedŠBNE.S‚DSKT15Yes...-ŠJSR„(A1)JUMPTOTHEBUGS'DISKREADROUTINEŠBRA.S‚DSKT15A@DSKT15„LEA.L‚T15DIOPK-B(A5),A1‚PointtoTRAP#15diskI/Opacket<ŠMOVE.LIPCMEMAD(A3),T15DMADR(A1)ƒInsertmemoryloadaddress?ŠMOVE.LIPCSECNM(A3),T15DSECN(A1)ƒInsertstartingsectornumberAŠMOVE.WIPCBLKNM(A3),T15DSCNT(A1)ƒInsert#ofsectorstotransfer-ŠMOVE.LA1,-(A7)‹PointdebuggertoI/Opacket/ŠSYSCALL.DSKRDŒGoreadfromdeviceintomemory 1DSKT15AƒMOVEM.L(A7)+,A3-A5‡RESTORETHEREGISTERS"ŠBEQ„GOODIODISKIOCOMPLETE...EXIT ŠIF.Wƒ#4RETRY-B(A5)THEN.SMOVE.BD6,D0ŽErrorstatus!BSR„BHLCVTConvertbinarytohex2MOVE.WD3,ERR15V1-B(A5)ƒPutintodisplayableformMOVEM.LA5,-(A7)=LEA„ERROR15E-B(A5),A6‚Bracketthemessagetodisplaywith...#LEA„ERROR15S-B(A5),A5‚...A5andA6'BSR„MSGOUTDisplaynastyerrormessageMOVEM.L(A7)+,A5(ADD.W‚#1,RETRY-B(A5)…BumpretrycounterŠELSE.S4BRA„ERROR15ŒPutoutfinalerrormessageandgiveupŠENDIŠBRA„DISKEXT1‹GotryI/Oagain******************************DELAYFORIPCTIMING†******************************DISKIPCƒMOVE.L#$100,D0DELAY…SUB.L‚#1,D0 ŠBNE.S‚DELAYŠPAGE****************************** SEE IF SHARED MEMORY FREE ******************************0ŠTST.B‚IPCIMB1(A4)ˆTESTIFSHAREDMEMORYISFREE!ŠBEQ.S‚OK1YES...FINE,KEEPGOING(ŠBSR„ERROR8'IPCSHAREDMEMORYNOTFREE'>**************************************************************<*SHAREDMEMORYFREE-MOVEREQUESTEDCOMMANDPACKETTHEREƒ*(*—NOTE:SHAREDMEMORYFORTHEIPCONLY**USESEVERYOTHERBYTE.‰*>************************************************************** OK1‡EQU„*/ŠMOVE.BIPCPKSZ(A3),D1…COMMANDPKTSIZE(1-REL)7ŠLEA„IPCIM1(A4),A1†A1-ADDROF1STBYTEOF68000WRITE+ŠCA LR.L‚D2‘BYTEPOSINPASSEDCOMMANDPACKET&ŠCLR.L‚D3‘BYTEPOSINMEMMAPPEDSPACE IPCLP2„EQU„*7ŠMOVE.B0(A3,D2),0(A1,D3)‚PLACEBYTEINTOSHAREDMEMORY&ŠMOVE.B0(A1,D3),D5ˆBYTEWEJUSTMOVED5ŠCMP.B‚0(A3,D2),D5ˆISITTHESAMEINMEMMAPPEDSPACEŠBEQ.S‚OK2BRANCHFORNOERROR/ŠBSR„ERROR9'SHAREDMEMORYREAD/WRITEMISMATCH' OK2‡EQU„* ŠADD.L‚#1,D2ŽINCR"FROM"POINTERŠADD.L‚#2,D3ŽINCR"TO"ƒPOINTER ŠSUB.B‚#1,D1ŽDECRCOUNTOFBYTES ŠBGT„IPCLP2LOOPIFMOREDATA...3***************************************************3* TELL "IPC" COMMAND IS WAITING AND INTERRUPT HIM *3***************************************************(ŠMOVE.B#$80,IPCIMB1(A4)ƒMESSAGEWAITING%ŠMOVE.B#$80,IPCINT(A4)„INTERRUPTIPC-*********************************************-* POLLING LOOP - HAS IPC SENT AN "ACK" YET? *-********************************************* ACKYET„EQU„*4ŠMOVE.BIPCIAB2(A4),D2…LOOKTOSEEIFWEHAVEANACKŠCMP.B‚#6,D2Ž*2ŠBEQ.S‚ISITCOMP‹YES...GOWAITFORI/OTOCOMPLETEŠBTSTƒ#NOLITE,FLAGS-B(A5)2ŠBNE.S‚ACKYETBŒBRANCHIFNOPANELLIGHTSONSYSTEM&ŠMOVE.WD0,FAILGTŠNO....KEEPLIGHTON$ACKYETBƒEQU„*’RECOVERFROMBUSERROR ŠCMP.B‚#$15,D2ŒDIDWEGETANAK?$ŠBNE„ACKYETNO....THENKEEPWAITING$ŠBSR„ERROR10Œ'NAKRECEIVEDFROMIPC'ŠPAGE5*****************************************************4*POLLINGROUTINE‚-SETUPANDWAITFORCOMPLETION*5*****************************************************>ISITCOMP‚CLR.B‚IPCIAB2(A4)ˆFREEUPACKBOX,ANDWAITFORCOMP.9COMPYETƒTST.B‚IPCIMB2(A4)ˆDIDWEGETANI/OCOMPLETEYET?-ŠBNE.S‚CHK4STXŒYES...GOVERIFYRETURNPACKET7ŠBTSTƒ#NOLITE,FLAGS-B(A5)SEEIFPANELLIGHTSONSYSTEM3ŠBNE.S‚COMPYETB‹BRANCHIFNOPANELLIGHTSONSYSTEM,ŠMOVE.WD0,FAILGTŠNO....KEEPFAILLIGHTOFF%COMPYETB‚EQU„*’RECOVERFROMBUSERROR+ŠBRA„COMPYETŒKEEPLOOKINGFORCOMPLETEDI/O!*********************************!* SEE IF STX WHERE IT SHOULD BE *!*********************************;CHK4STXƒCLR.B‚IPCIMB2(A4)ˆCLEARMAILBOXFOR"I/OCOMPLETE"3ŠCMP.B‚#$02,IPCIM2(A4)„IS"STX"WHEREITSHOULDBE?*ŠBEQ.S‚SAVESTAT‹YES...THENGOSAVESTATUS2ŠBSR„ERROR11Œ'INCORRECTLYFORMATTEDRETURNPACKET'8********************************************************8* SAVE STATUS FROM PACKET PLACE ACK INTO SHARED MEMORY,**CLEARBOXANDINTERRUPT’*8********************************************************$SAVESTAT‚EQU„*’SAVESTATUSFORLATER'ŠMOVE.BIPCIM2+(2*5)(A4),D6D6=xxxxXX)ŠMOVEP.LIPCIM2+(2*4)(A4),D7D7=XXYYZZ(ŠCLR.B‚IPCIAB2(A4)ˆFREEUPSHAREDMEMORY(ŠMOVE.B#6,IPCIMA1(A4)…SEND"ACK"TOIPC%ŠMOVE.B#$80,IPCINT(A4)„ANDINTERRUPTŠPAGEG***********************************************************************7*ˆVERIFYTHESTATUSPACKET,(JUSTRECEIVED),ISOURS.Š*F*IFAFLOPPYDISKDRIVEDOORISOPENED,FOREXAMPLE,ANUNSOLICETED‚*D*STATUSPACKETWILLBECREATED.‚THESEPACKETSCANBEDETECTEDANDƒ*@*BYPASSED.‚STATUSWASSAVEDIND0BEFOREPACKETWASRELEASED.‡*G*********************************************************************** 4ŠMOVE.BD6,D2ŽISTHISANUNSOLICITEDSTATUSPACKET?2ŠAND.B‚#$F0,D2ŒEXAMINECOMMANDSTATUSTOFINDOUT.+ŠCMP.B‚#$80,D2ŒITISUNSOLICITEDIFIT'S8X(ŠBEQ„COMPYETŒIFITS8XGOBACKANDWAIT. **************************** CHECK STATUS OF OUT I/O **************************** 3ŠCMP.B‚#$70,D6ŒNORMALI/OCOMMANDCOMPLETESTATUS? ŠBEQ.S‚IONC ŠCLR.L‚D0 ŠMOVE.BD6,D0!ŠBSR„BHLCVTCONVERTBINARYTOHEX4ŠMOVE.WD3,ERR12V1-B(A5)ƒSAVEINMESSAGEFORDISPLAY3ŠBSR„ERROR12Œ'BADRETURNSTATUSCMD.FROMIPC=XX'#IONC†TST.B‚D7‘"ZERO"STATUS(GOOD)?*ŠBEQ.S‚GOODIOYES...EXITDISKI/OROUTINE-ŠCMP.B‚#$B,D7NO....WASITACHECKSUMERROR?$ŠBEQ.S‚GOODIO.†YES...ITISOKTHEN ŠCLR.L‚D0 ŠMOVE.BD7,D0!ŠBSR„BHLCVTCONVERTBINARYTOHEX4ŠMOVE.WD3,ERR13V1-B(A5)ƒSAVEINMESSAGEFORDISPLAY.ŠBSR„ERROR13Œ'BADRETURNSTATUSFROMIPC=XX' GOODIO„EQU„*)ŠCLR.L‚D6‘D6ADVERTISEDASZEROWHENDONEŠRTS„EXITDISKI/OROUTINE.ŠPAGE%**************************B ************ VECTOR CATCH ALL)*ƒCOMEHEREFORANYEXCEPTIONVECTORTHAT%*…ISUNCLAIMED.‚COMPUTEVECTORNUMBER&*…ANDDISPLAYINUSERFRIENDLYMESSAGE*.ABORTP„MOVE.LSAVA5(PC),A5‡RESTOREA5—12/20/84*ŠPEA„ABORT(PC)ŠBASEOFPSEUDOVECTORTABLE ŠMOVE.L4(A7),A0‹RETURNBSRADDR3ŠSUB.L‚(A7)+,A0‹SUBTRACTADDRESS+4OFPSEUDOVECTOR5ŠSUB.L‚#4,A0ŽA0=0RELADDRESSOFBSRTHATGOTUSHERE ŠMOVE.LA0,D0,ŠLSR.L‚#2,D0ŽCONVERTTOVECTORNUMBERINHEX&ŠBSR„BHLCVTCONVERTFROMBINARYTOHEX8ŠMOVE.WD3,ERR14V1-B(A5)ƒMOVEINTOUSERFRIENDLYMESSAGE ŠBSR„ERROR14>*************************************************************** HANG<*ƒONERRORCONDITION,STACKADDRESSOFUSERFRIENDLYMESSAGE+*ƒANDPANELLIGHTVALUEANDBRANCHTOSELF.* HANG†EQU„*8ŠMOVEM.LMSGAD(PC),D0-D1ƒA5USEDFORMESSAGE...‹12/20/84ŠMOVEM.LD0-D1,-(A7).ŠBRA.S‚*’"STOP"..."RESET"REQUIREDTORESTARTŠPAGEF***********************************************************************-PANELLIGHTVALUES-¯*$*ˆBITPOSITIONS....76543210œ* *ŒCONTENTS.....UUML8421œ*!*ŒWHERE........„UU=UNDEFINED˜*%*ŸM=MOST‚SIGNIFICANTDIGIT(LEFT)ƒ*'*ŸL=LEASTSIGNIFICANTDIGIT(RIGHT)‚*.*™8421=HEXCHARACTERREQUIRED(1'SCOMP)**Ä*=*ˆNOTE:THE"M"OR"L"LATCHMUSTBEINTHEZEROSTATEWHENƒ*5*ŽTHEHEXDIGITISMOVEDIN.THELATCHMUSTTHENBE…*9*ŽTURNEDONTO"CAPTURETHEDIGITINTHEDESIREDLIGHT.*5*ŽNOTETHATTHE1'SCOMPLIMENTOFTHEHEXNUMBERIS…*9*ŽREQUIRED.THISREGISTERISLOCATEDAT$FE0004"TTORM".*0*ŽITSHOULDBENOTEDTHATONLYMACSbugSYSTEMSŠ*/*ŽHAVEPANELLIGHTS,VERSAbugSYSTEMSDONOT.‹*4*ŽFORTHISREASON,DUMMYLOCATIONSFORPANELLIGHT†*9*ŽREGISTERSARESETUPATINITIALIZATIONTIMEIFWEARE*#*ŽOPERATINGONAVERSAbugSYSTEM.—**Ä*<*ˆSAMPLE:ƒMOVE.B#$14,TTORM"M"LATCHISZEROBITS128OFF‚*2*’MOVE.B#$34,TTORM"M"LATCHISONE‚CHAR"B"ONƒ*4*’MOVE.B#$2F,TTORM"L"LATCHISZEROBITSALLOFF‚*2*’MOVE.B#$3F,TTORM"L"LATCHISONE‚CHAR"0"ONƒ**Ä*@*THEFOLLOWINGCHARACTERSAREDISPLAYEDINPANELLIGHTDIGITS‡* *…"$B0"‚(BOOTCOMMANDENTERED)¢**…"$B8"‚(NO"BOOT"FILE)¨**…"$BE"‚(BOOTINPROGRESS)¦*F**********************************************************************%* SUBROUTINE TO REFRESH PANEL LIGHTS.)*ƒINPUTISTAKENFROMD7(LOWORDERBYTE),*ƒISDISPLAYEDINASCIIHEXONPANELLIGHTS..*ƒIFWEARENOTONASYSTEMWITHPANALLIGHTS,*ƒTHENJUSTRETURN.*ƒA0ANDD7AREDESTROYED.* LITPANAƒEQU„*<ŠBTSTƒ#NOLITE,FLAGS-B(A5)DOWEHAVEPANELLIGHTSONSYSTEM?ŠBNE.S‚LITPANAR‹BRANCHIFNO%ŠAND.L‚#$FF,D7ŒISOLATELOWORDERBYTE<ŠMOVE.LD7,PLITE-B(A5)…SAVEPANELLIGHTVALUEFORFUTUREREF.*‰LEA„TTOR,A0ŒADDRESSOFPANELLIGHTSŠ12/20/841ŠMOVE.L#TTOR,A0‹ADDRESSOFPANELLIGHTSŠ12/20/84ŠROR.L‚#4,D7ŽSPLITDIGITS'ŠNOT.L‚D7‘COMPLEMENTREQUIREDFORLITESŠAND.L‚#$F000000F,D77ŠOR.Lƒ#$00020010,D7†SETLSDFLAGSINLOWANDHIGHORDER(ŠMOVE.WD7,(A0)ŒMOVEINHIGHORDERDIGIT*ŠOR.Wƒ#$30,D7ŒSETLATCHBITFORHIGHORDER(ŠMOVE.WD7,(A0)ŒLATCHITINPANELLIGHTSŠSWAPƒD7&ŠROL.W‚#4,D7ŽPOSITIONLOWORDERDIGITS'ŠMOVE.WD7,(A0)ŒMOVEINLOWORDERDIGIT)ŠOR.Wƒ#$30,D7ŒSETLATCHBITFORLOWORDER(ŠMOVE.WD7,(A0)ŒLATCHITINPANELLIGHTS LITPANAR‚RTSŠPAGE%************************************** ERROR HANDLER)*‚1.DISPLAYSUSERFRIENDLYERRORMESSAGE!*‚2.PUTSVALUEINTOPANELLIGHTS*‚3.BRANCHESTOHANG* ERRORA„EQU„*ŠMOVE.LA5,-(A7)4ŠMOVE.L4(A7),A5‹A5=ADDROFRELPOINTERTOMSGSTART*ŠMOVE.L4(A5),A6‹A6=RELPOINTERTOMSGEND-ŠLEA„4(A5,A6.L),A6†A6=ABS.POINTERTOMSGEND+ŠADD.L‚(A5),A5ŒA5=ABS.POINTERTOMSGSTART ŠBSR.S‚MSGOUTŠMOVE.L(A7)+,A5ŠMOVE.L(A7),A0ŠADD.L‚#8,A0ŽADDROFLITECODES)ŠMOVE.W(A0),D7ŒSETTOLIGHTPANELLIGHTS ŠBSR„LITPANA ŠBRA„HANGŠRTS%************************************** MSGOUT&*ƒDISPLAYMESSAGEBOUNDEDBYA5ANDA6+*…WITHSTANDARDMACSBUGTYPEI/O(TRAP#15)$*…JUSTRETURNIFONVERSAbugSYSTEM.* MSGOUT„EQU„*1ŠMOVE.L$BC,D1SAVB EWHATEVERWASATTRAP#15SLOT=ŠMOVE.LMACST15(PC),$BC„MAKESURETRAP#15VECTOROK…12/20/84ŠLEA„MSGAD(PC),A02ŠMOVE.LA5,(A0)ŒSAVEADDROFUSERFRIENDLYMESSAGE5ŠMOVE.BFLAGS(PC),D0‡A5USEDFORMESSAGE....Š12/20/847ŠBTSTƒ#T15IO,D0ŠOnsystemsupportingprimaryTRAP#15?-ŠBNE.S‚CHKALTNO..seeifalternatesupportedŠBRA.S‚DOPRIMEŒYES..ACHKALT„BTSTƒ#ALT15IO,D0ˆOnsystemsupportingalternateTRAP#15?7ŠBEQ.S‚MSGOUTXŒNO..thereforenoTRAP#15supportatall0ŠADD.L‚#1,A6ŽYES..outputlineA5=start,A6+1=endŠMOVEM.LA5/A6,-(A7)ŠSYSCALL.OUTLNŠBRA.S‚MSGOUTXDOPRIMEƒTRAPƒ#15ŠDC.Wƒ2;MSGOUTXƒMOVE.LD1,$BCRESTOREWHATEVERWASATTRAP#15SLOTŠRTSŠPAGE%************************************** TEST15/*ƒTESTTOSEEIFWEAREONSYSTEMTHATSUPPORTS&*†TRAP#15OUTPUT-IFSORETURNEQUAL'*†CONDITIONCODES-ELSERETURNUNEQUAL*†CONDITIONCODES.* TEST15„EQU„*ŠMOVE.LD0,-(A7)5ŠMOVE.BFLAGS(PC),D0‡A5USEDFORMESSAGE....Š12/20/840ŠBTSTƒ#T15IO,D0ŠDOWEHAVETRAP#15I/OSUPPORT?ŠBNE.S‚T15RBRANCHIFNO+ŠCMP.L‚D0,D0ŽJUSTSETEQUALCONDITIONCODES:T15R†MOVEM.L(A7)+,D0ŠMOVEM.LDOESNOTDESTROYCOND.CODESŠRTS** ERROR ROUTINES*)ERROR1„ERRTBL1,B8'INVALIDCOMMANDLINE'**ERROR2„ERRTBL2,B8'INVALIDOPTIONSFIELD'*&ERROR3„ERRTBL3,B8'INVALIDFILENAME'*5ERROR4„ERRTBL4,B8'VOLUMESPECIFICATIONNOTALLOWED'*4ERROR5„ERRTBL5,BD'RAMUNAVAILABLETORELOCATEIPL'*#ERROR6„ERRTBL6,B8'FILENOTFOUND'*&ERROR7„ERRTBL7,B8'INVALIDFILETYPE'*/ERROR8„ERRTBL8,BD'IPCSHAREDMEMORYNOTFREE'*:ERROR9„ERRTBL9,BD'IPCSHAREDMEMORYREAD/WRITEMISMATCH'*,ERROR10ƒERRTBL10,BDŽ'NAKRECEIVEDFROMIPC'*:ERROR11ƒERRTBL11,BDŽ'INCORRECTLYFORMATTEDRETURNPACKET'*4ERROR12ƒERRTBL12,BDŽ'BADSTATUSCMD.FROMIPC=XX'*/ERROR13ƒERRTBL13,BDŽ'BADSTATUSFROMIPC=XX'*'ERROR14ƒERRTBL14,B1Ž'VECTOREXCEPTION'*>ERROR15ƒERRTBL15,B1Ž'BADSTATUSFROMEXTERNALDISKIOROUTINE'** USER FRIENDLY MESSAGES*"MSG1S…DC.Bƒ'Bootinprogress...'ŠDS…0MSG1E…DC.Wƒ$0D0A*MSG2S…DC.Bƒ'Bootcomplete'ŠDS…0MSG2E…DC.Wƒ$0D0A*$ERROR1SƒDC.Bƒ'Invalidcommandline'ŠDS…0ERROR1EƒDC.Wƒ$0D0A*%ERROR2SƒDC.Bƒ'Errorinoptionfield'ŠDS…0ERROR2EƒDC.Wƒ$0D0A*+ERROR3SƒDC.Bƒ'Errorinfilespecification'ŠDS…0ERROR3EƒDC.Wƒ$0D0A*(ERROR4SƒDC.Bƒ'Volumefieldnotallowed'ŠDS…0ERROR4EƒDC.Wƒ$0D0A*EERROR5SƒDC.Bƒ'BuserroraccessingRAM-initializeRAMandtryagain'ŠDS…0ERROR5EƒDC.Wƒ$0D0A*ERROR6SƒDC.Bƒ'Filenotfound'ŠDS…0ERROR6EƒDC.Wƒ$0D0A*!ERROR7SƒDC.Bƒ'Invalidfiletype'ŠDS…0ERROR7EƒDC.Wƒ$0D0A**ERROR8SƒDC.Bƒ'IPCsharedmemorynotfree'ŠDS…0ERROR8EƒDC.Wƒ$0D0A*5ERROR9SƒDC.Bƒ'IPCsharedmemoryread/writemismatch'ŠDS…0ERROR9EƒDC.Wƒ$0D0A*&ERROR10S‚DC.Bƒ'NAKreceivedfromIPC'ŠDS…0ERROR10E‚DC.Wƒ$0D0A*=ERROR11S‚DC.Bƒ'IncorrectlyformattedreturnpacketfromIPC'ŠDS…0ERROR11E‚DC.Wƒ$0D0A*,ERROR12S‚DC.Bƒ'Badstatuscmd.fromIPC=$'ERR12V1ƒDC.Bƒ'„'ŠDS…0ERROR12E‚DC.Wƒ$0D0A*'ERROR13S‚DC.Bƒ'BadstatusfromIPC=‚$'ŠDS…0ERR13V1ƒDC.Bƒ'„'ŠDS…0ERROR13E‚DC.Wƒ$0D0A*=ERROR14S‚DC.Bƒ'Unclaimedvectorexception,vectornumber=‚$'ERR14V1ƒDC.Bƒ'„'ŠDS…0ERROR14E‚DC.Wƒ$0D0A*;ERROR15S‚DC.Bƒ'BadstatusfromexternalDISKIOroutine‚=$'ŠDS…0ERR15V1ƒDC.Bƒ'„'ŠDS…0ERROR15E‚DC.Wƒ$0D0A** STACKŠDS.Bƒ$80SYSTEMSTACK STACK…EQU„**E* THE FOLLOWING DATA MUST BE MOVED WITH THE RELOCATED SECTION OF IPL.1*ƒITISREFERENCEDOFFTHESEGMENTBASEREGISTER.FLAGS…DC.Bƒ0’FLAGBYTEŠDS…0’FORCEWORDBOUNDARY6LOADADDR‚DC.Lƒ0’LOADADDRESSSPECIFIEDWITH'L'OPTION5BIAS†DC.Lƒ0’BIASTOADDTOSTARTADDR&STACKPOINTER *‰FLAGBYTEBITREPRESENTATION‚*2T15IO…EQU„0’SETIFNOPRIMARYTRAP#15I/OSUPPORT2NULFLG1ƒEQU„1’-------NOTYETIMPLEMENTED‚--------4ALT15IOƒEQU„2’SETIFALTERENATETRAP#15I/OSUPPORT'T15DSKIO‚EQU„3’SETIFTRAP#15DISKI/O-LFLG†EQU„4’BITTOSETIF'L'OPTIONSPECIFIED-HFLG†EQUC „5’BITTOSETIF'H'OPTIONSPECIFIED2NOLITE„EQU„6’BITTOSETIFNOPANELLIGHTSONSYS.2NULFLG2ƒEQU„7’------NOTYETIMPLEMENTED‚---------*8*‡VARIABLESTOUSEDEBUGGERS'INTERNALDISKREADROUTINE*&DSKCODEƒDC.Bƒ0’DISKCONFIGURATIONCODEŠDC.Bƒ0’FORCEWORDBOUNDARY7IPCFLAGƒDC.Lƒ0’INTERNAL(IPC)/EXTERNAL(BUGS)DISKIOFLAG1DSKCONFƒDC.Lƒ0’ADDRESSOFDISKCONFIGURATIONDATA0DSKOUT„DC.Lƒ0’ADDRESSOFBUGS'DISKREADROUTINE3T15DPKAD‚DC.Lƒ0’ADDRESSOFTRAP#15DISKI/OPACKET**‡MISC.VARIABLES*IPCADR„DC.Lƒ0’CHANNELADDRESS#MACSBUGƒDC.Lƒ0’DEBUGGERENTRYPOINT8MACST15ƒDC.Lƒ0’INITIALCONTENTSOFMACSBUGTRAP#15VECT0OLDBSERR‚DC.Lƒ0’OLDCONTENTSOFBUSERRORVECTOR,BSTK†DC.Lƒ0’RESTORESTACKVALUEONBUSERROR)BRTN†DC.Lƒ0’RETURNADDRESSFROMBUSERRORSAVA5…DC.Lƒ0’SAVEFORA5'SCRSAV„DC.Lƒ0’SAVEFORSCRATCHREGISTER+RETRY…DC.Wƒ0’Retrycountforbugdiskerror2* THE FOLLOWING TWO LONG WORDS MUST BE CONSECUTIVE+MSGAD…DC.Lƒ0’ADDRESSOFLASTMESSAGEOUTPUT&PLITE…DC.Lƒ0’CURRENTPANELLIGHTVALUE**VSAV†DS.Lƒ$100VECTORSAVEAREAPATCH…DS.Bƒ50‘PATCHAREA*"*‰TRAP#15DISK1/OCOMMANDPACKETŠDS…0T15DIOPK:EQU„*)RATHERTHAN(!)FORTHEPROMPT***‰PAGE**ˆRED VISIONCODE‡0902813*3*’RE-LINKEDSOALLSECTIONSWILLBEINSEGMENTZERO*‰PAGE**ˆREVISIONCODE‡1120813*2*’CORRECTPROBLEM‚LIBX,Y,Z„WHERE',Z'WASIGNORED*’CORRECTPROBLEM‚LIBX,#CNXX!*£LIBX,#†WHEREXXISTERMINALID/*’CORRECTPROBLEM‚LIBXˆWHEREXHASNO.ROFILE7*’CORRECTPROBLEMOFNOTEDITINGFORSBARGERRORIFONE *¢RETURNED:*’CORRECTPROBLEMOFTERMINATINGIMMEDIATELYIFPROCESSING*¢ACHAINFILE0*’CORRECTPROBLEM‚>LISTˆWHERETHELIBRARYHASNO *°MODULES {‚V‹p“e›Y£F«J³G»„ÃaËOÓSÛ[ãSëdódû; J E T M #P +G 3G ;D CH KJ SQ [b cW kY7*’CORRECTPROBLEMOFINVALIDCMDWHENCHANGINGREVISION*¢NUMBERORCODE**‰PAGE***ˆREVISIONCODE‡1130813**0*’CORRECTPROBLEM‚LIBX,Y†WHEREXDOESNOTEXIST *£>LIST‡THEMESSAGEDOESNOTGO*°TOTHELISTFILE**‰PAGE***ˆREVISIONCODE‡1222813**8*’DISPLAYADDITIONALINFORMATIONWITHTHE'LIST'COMMAND(*’CORRECTTHEFOLLOWINGCOMMANDSEQUENCE*œLIST(ALLMODULES)*œLIST(SECIFICMODULE)*œLIST(ALLMODULES)****‰PAGE***ˆINCLUDEFILES***ˆINCLUDE9995.&.FME.EQ*ˆINCLUDE9995.&.IOE.EQ*ˆINCLUDE9995.&.TR1.EQ**‰NOLIST‰INCLUDE9995.&.FME.EQ‰INCLUDE9995.&.IOE.EQ‰INCLUDE9995.&.TR1.EQ‰LIST**‰PAGE<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;**************************************************************ˆ***†LIB‚COMMANDƒ*******ˆ***‰DATAƒSEGMENT„*******=****************************************************************ˆ****‚EQUATEAREA‚******* BEGDATA‚EQU0#STKLENƒEQU25‹STACKLENGTHINWORDS)BUFSIZE‚EQU160‰INPUTCOMMANDBUFFERSIZE DSKLUIƒEQU1(DSKLUOƒEQU2‹DISKLOGUNITASSIGNOUTPUT!LISTLUƒEQU3‹LISTINGLOGICALUNIT,DSKLUI2‚EQU4‹DISKLOGUNITFORSOURCEINPUTSECLENƒEQU256‰SECTORLENGTH CR‡EQU$0D LF‡EQU$0A SPACE„EQU$20 SLASH„EQU$2F COMMA„EQU$2C*‰PAGE* ‰OFFSET$0000 STARBUF‚EQU*&***************************************ˆLIBRARYCOMMANDLINEBUFFER&*************************************** WORKBUF‚EQU*‰DS.B80WORKBUFE EQU *-1‰DS.L1*.***********************************************ˆLIBRARYBUFFER.**********************************************LIBBUFƒDS.BSECLENLIBBUFE‚EQU*-1‰DS.L1*SOURBUF‚DS.BSECLENSOURBUFE EQU *-1‰DS.L1*3******************************************************ˆBUFFERAREATOREADCONTIGUOUGFILEINTO*ŠWILLHOLD292MODULEENTRIES*3**************************************************** DIRLIBƒEQU* ‰DS.LSECLEN ‰DS.LSECLEN ‰DS.LSECLEN ‰DS.LSECLENDIRLIBEƒEQU*-1‰DS.L3* BUFENDƒEQU*BUFSIZƒEQU‚BUFEND-STARBUF‰PAGE ‰SECTION0(‰XREFPARSE,OPTION,EDITFILE,SBARG,DATEOJ**ˆNEXTWORDBOUNDRYMACRO***2*******************************************************„DATASEGMENT(DSEG)ƒ****1*************************************************** PBA†EQU** REV_CODE:‰DC.B†'1220844'&*œWHEREREV_CODEISDEFINEDASFOLLOWS *œMMDDYYXZ*3*œMMDDYY=MONTHDAYYEAROFLASTASSEMBLYORPATCH*œX†=REVISIONTYPECODE*¦SPACE=CLEANASSEMBLY *¦P…=PATCHED*¦C…=CUSTOMIZEDPATCHED**#*œZ†=VERSADOSMAJORREVISIONFIELD*‰PAGE:************************************************************ ‰DS.LSTKLEN PROGSTK‚EQU**‰DC.L08*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFINISTHEAREATHECOMMANDLINEIS.*ˆ***ƒREADINTOWHENTHISPROGRAMISCALLEDIN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++**BUFFINƒCOMLINEBUFSIZE‚***‚INPUTBUFFER‚***-**********************************************‰DS.W0*,********************************************(*ˆPARAMETERTABLEFORGETSEGFORBUFFER,******************************************** BUFPARƒEQU*%‰DC.L0,0ƒTASK(E 0=SELF),SESSION(N/A) SEG_OPTS:‰DC.W0…OPTIONS‰DC.W0(RAMSEGMENT)‰DC.L'BUFR'ŠNAMEOFSEGMENT‰DC.L0STARTOFSEGMENT‰DC.LBUFSIZŠLENGTHOFBUFFER*AS_ADDR:‰DC.L†0*œADDROFALLOCATEDSEGMENT5******************************************************+*ˆ**‚IOSPARAMETERTABLEFORDISKREADS‚***6*ˆ**‚REFERTOIOSEQUATESUNDERIOSPARAMETERBLOCK‚***5******************************************************‰DS.W0 LIBRIOS‚EQU* ‰DC.WIOREAD‰DC.WIOPWAT+IOPREC‰DC.B0 ‰DC.BDSKLUI‰DC.B0‰DC.B0‰DC.L0LIBRSAD‚DC.L0LIBREAD‚DC.L0‰DC.L0‰DC.L0&**************************************%*ˆIOSPARAMENTERTABLEFORDISKWRITE*$************************************* TEMPIOS‚EQU* ‰DC.WIOWRIT ‰DC.WIOPREC‰DC.B0 ‰DC.BDSKLUO‰DC.B0‰DC.B0‰DC.L0TEMPSAD‚DC.L0TEMPEAD‚DC.L0‰DC.L0‰DC.L0*%*ˆIOSPARAMETERBLOCKFORSOURCEFILE* SOURIOS‚EQU* ‰DC.WIOREAD‰DC.WIOPWAT+IOPREC‰DC.B0 ‰DC.BDSKLUI2‰DC.B0‰DC.B0‰DC.L0SOURSAD‚DC.L0SOUREAD‚DC.L0‰DC.L0‰DC.L0*3*****************************************************ŒIOSPARAMETERTABLE(*ˆSETUPIOS(ERR0R-LOG)‚PARAMETERBLOCK*3****************************************************6‰IOS.OUT6IOWRIT,IOPASC+IOPFOR+IOPWAT,LDFLUN,0,0,0,0,0‰DS.W07‰IOS.OUT6IIOWRIT,IOPASC+IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0‰DS.W0**ˆSETUPIOSFORLISTINGLU3*6‰IOS.OUT3IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU,0,0,0,0,0‰DS.W0"***********************************8*ˆFHSPARAMETERTABLEFORCHANGELOGICALUNITASSIGNMENT6*ˆCHANGEISFROM6TO3--SENDSOURCEISLUAINMASK*ˆANDRECEIVEISLUBINMASK4*ˆLU3ISUSEDF0RLISTINGANDLU6FORERR0R/LOGGING**3*ˆPARAMETERTABLEFORCHANGLOGICALUNITASSIGNMENT,*ˆISDIFFERENTFROMSTANDARTPARAMETERTABLE*%************************************** LU3AFHSƒEQU*'‰DC.WFHCHLU„COMMAND(CHANGELUASSIGN)‰DC.WFOPKEP…OPTIONKEEPASSIGN‰DC.B0ŠSTATUS‰DC.BLDFLUNŠSENDLUNUMBER‰DC.BLISTLUŠRECEIVELUNUM‰DC.B0ŠRESERVED%‰DC.L0ŠTASK-ID(0MEANSUSEYOURSELF(‰DC.L0ŠSESSION#(0MEANSUSEYOURSELF)**,*********************************************&*ˆPARAMETERBLOCKFOR‚INPUT(TERMINAL)*,*********************************************( IOS.OUTIN IOREAD,IOPFOR,CDFLUN,,,0,0,80**)******************************************?*ˆLU3FHSISPARMTABLEFORLU3WHICHISUSEDFOROUTPUTLISTING*********************************************‰FHS.LU30,0,LISTLU,0,0,0,0,0 ‰DC.L0,0,0*;************************************************************:*ˆ***DSKFHSISTHEPARAMETERTABLEFORTHEFHSINPUTFILE*;***********************************************************LIBFHS„DC.WFHASGNŒCOMMAND!‰DC.WFOPPREWŠOPTIONSPUBLICREAD‰DC.B0ŠSTATUS ‰DC.BDSKLUI†LOGICALUNITNUMBER!LIBVOL„DC.L$20202020‚VOLUMENAME‰DC.W0ŠUSERNUMBER"LIBCATƒDC.L$20202020ˆCATALOGNAME‰DC.L$20202020 LIBNAME‚DC.L$20202020‚FILENAME‰DC.L$20202020LIBEXTƒDC.W$2020†EXTENSION‰DC.W0ŠRESERVED‰DC.B0ŠWRITEPROTECTCODE‰DC.B0ŠREADPROTECTCODE‰DC.W$100ŠLOGICALRCORDLENGTH0‰DC.L0ŠCONTIGUOUSFILESIZE/DIRENTRYPOINTER6*ˆFOLLOWINGFHSPARAMENTERSFORSHAREDSEGMENTREQUEST(‰DC.L0ŠSEGMENTSTARTINGLOGICALADDRESS$‰DC.L0ŠSEGMENTENDINGLOGICALADDR.3‰DC.L0ŠLENGTHOFPARMBLOCKFORSHAREDSEGREQUESTLIBFHSE‚EQU*-1‰DC.L0*;************************************************************:*ˆ***TMPFHSISTHEPARAMETERTABLEFORTHEFHSINPUTFILE*;***********************************************************!TMPFHS„DC.WFHALLO+FHASGNŒCOMMAND3‰DC.WFOPEREW+FOPSEQŠOPTIONSPUBLICREAD&SEQFILE‰DC.B0ŠSTATUS ‰DC.BDSKLUO†LOGICALUNITNUMBER!TMPVOL„DC.L$20202020‚VOLUMENAME‰DC.W0ŠUSERNUMBER"TMPCATƒDC.L$20202020ˆCATALOGNAME‰DC.L$20202020 TMPNAME‚DC.L$20202020‚FILENAME‰DC.L$20202020TMPEXTƒDC.W$2020†EXTENSIONƒDC.W0ŠRESERVED‰DC.B0ŠWRITEPROTECTCODE‰DC.B0ŠREADPROTEE CTCODE‰DC.W0ŠLOGICALRCORDLENGTH1‰DC.L0ŠCONTIGUOUSFILESIZE/DIRENTRYPOIN2TER6*ˆFOLLOWINGFHSPARAMENTERSFORSHAREDSEGMENTREQUEST(‰DC.L0ŠSEGMENTSTARTINGLOGICALADDRESS$‰DC.L0ŠSEGMENTENDINGLOGICALADDR.3‰DC.L0ŠLENGTHOFPARMBLOCKFORSHAREDSEGREQUEST‰DC.L0*/***********************************************5*ˆPARMBLOCKFORCHANGELOGICALUNITFROMTEMPTOLIB/************************************************CHGLUFHS EQU *‰DC.WFHCHLU…CHANGLOGUNITNUM‰DC.W0‰OPTIONS‰DC.B0ŠSTATUS‰DC.BDSKLUOŠCHGLUA‰DC.BDSKLUIŠCHGLUB ‰DC.B0ŠRES‰DC.L0‰DC.L0‰DC.L0*$*ˆFHSPARAMETERBLOCKFORLIBSORUCE SOURFHSƒEQU*‰DC.WFHASGNŠCOMMAND‰DC.WFOPPRPWŠOPTIONS-‰DC.B0ŠSTATUS‰DC.BDSKLUI2…LOGICALUNITNUM‰DC.L$20202020‚VOLUMENAME‰DC.W0ŠUSERNUM‰DC.L$20202020ˆCATNAME‰DC.L$20202020‰DC.L$20202020ˆFILENAME‰DC.L$20202020 ‰DC.W$2020‰DC.W0‰DC.B0ŠWRITEPROTCODE‰DC.B0‰DC.W0‰DC.L0ŠCONTFILESIZE ‰DC.L0,0,0*8*ˆTABLEOFVALIDCHARACTERFORTHEMODULEVERIFYROUTINE* MODTABƒEQU**LINE1HEX00-0F'‰DC.B0,0,0,0,0,0,0,0,0,0,0,0,0,'T',0,0*ŒLINE2‚HEX10-1F%‰DC.B0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*ŒLINE3‚HEX20-2F"*‘SP!"#$%&'()*+‚,‚-.‚/+‰DC.B'T',0,0,0,2,0,0,0,0,0,0,0,'T',0,1,'T'*‰LINE„4HEX‚30-3F!*0123456789:;<=>?%‰DC.B2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0*‰LINE„5HEX40-4F!*@ABCDEFGHIJKLMNO%‰DC.B0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1*‰LINE„6‚HEX50-5F*PQRSTUVWXYZ[\]%‰DC.B1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2%‰DC.B0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0%‰DC.B0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‰DS.W08**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAM‚DC.L0‰SAVETASKNAMESESNUMƒDC.L0ˆSAVESESSIONNUM#VOLNAMƒDC.L0‰SAVEVOLDEFAULTNAME‰DC.W0‰TOPHALFOFD3"USERNUM‚DC.W0ŠDEFAULTUSERNUMBER*CATNAMƒDC.L0,0‡SAVEDEFAULTCATAGORYNAME‰DS.L†1‰REGD6REGD7„DS.L†1‰REGD7‰DS.L†1‰REGA0&TIDLOGON‚DC.L0‰TERMIDATLOGONTIME‰DC.W0TOPHALFOFA2‰DC.W0ŠLOGONUSERNUMBER‰DS.L8‰SAVEOTHERSREGISTERS*‰DS.W0&DIRF…DC.L0…DIRECTORYSWITCH&POINTER.PREVDIRFDC.L0…PREVDIRFINE(USEDINCHANGE) DNRR…DC.B'‚'‡NOTREADYRESPONSEAFLAG„DC.B0ŠADDFLAGDFLAG„DC.B0ŠDELETEFLAGCFLAG„DC.B0ŠCOPYFLAGCHFLAGƒDC.B0…CHANGEFLAGLFLAG„DC.B0ŠLISTFLAGQFLAG„DC.B0…QUITFLAG"RFLAG„DC.B0‰RETURNTOGETDIRFLAGEXFLAGƒDC.B0ŠENDOFINPUTFLAG1FILENDƒDC.B0…REACHEDENDOFFILEON‚LIBRARYFLAG"PASSS2„DC.B0…SETWHENIN2NDPASS‰DS.W00SAVOADD„DC.L0Š1STTIMEFLAGFORPRTDETAILLINE"HOLDLOCMDC.L0ŒLOCATIONOFMODULEFLAGH„DC.B0ŠPRINTHEADERFLAG+ADDMORE‚DC.B0ŠMOREMODULESFORADDCOMMAND-MORECHA‚DC.B0‰MOREITEMSFORCHANGECMDFLAG#THRUMOD‚DC.B0ŠMODREADTHRUSWITCH%ATMOD„DC.B0‚FLAGFORBLD1HAFROUTINE,RLMSG„DC.B0‚PRINTERRORMSGINREADLIBFLAG7NAMSAME‚DC.B0ŠFLAGFORREPLACECKSAMENAMESOLD&NEW2BLD1END‚DC.B0ŠREACHEDENDOFFILEINBLD1HAFROUT+FLAGCND‚DC.B0ŠNOLIBCHANGEROUTINEOPTION.RD1ST„DC.B0ŠUSEDINBLD2HAFROUTINEASAFLAGNPFLAGƒDC.B0…NOPRINTFLAGLASTLAST DS.B 5‰DS.W0!DIRFULL‚DC.B0‚SETIFDIRISFULL*NEWLIBƒDC.B0…NEWLIBRARYWASCREATEDFLAGDIREXISTDC.B0ŠDIREXISTSFLAGLIBGOOD‚DC.B1%DIROPTƒDC.B0ŠDONOTBUILDDIROPTION!LIBPREV‚DC.B0ŠINPUTWASASSIGNED#DIRCHGƒDC.B0ŠCHANGEDIRECTORYFLAG*8TEMPIOSFDC.B0Šflagtochecktempfilecreatedƒ10/24/83.***********************************************"*ˆSTARTOFPRINTHEADERS&BUFFERS.***********************************************‰DS.W0QUESTM:‚DC.B$0D,$0A‰DC.B†'LIBRARYVERSION' VERS_NBR: ‰DC.B†'ˆ' ‰DC.B†CR,LF‰DC.B'LIBRARYCOMMANDS' ‰DC.B$0D,$0A?‰DC.B'ƒ(F=FILENAME„M=MODULENAME„DEFAULTEXTENSION=RO)'‰DC.B$0D,$0A,$0A;‰DC.B'‚Add…=(AF)OR(AF/)OR(AF/M)OR(AF,F/....,F)' ‰DC.B$0D,$0A-‰DC.B'‚CHange‚=(F CHM)OR(CHM,M,M,....,M)' ‰DC.B$0D,$0A1‰DC.B'‚COpy„=(COF/M)OR(COF/M,F/M,....,F/M)' ‰DC.B$0D,$0A/‰DC.B'‚DELete‚=(DELM)OR(DELM,M,M,....,M)' ‰DC.B$0D,$0A/‰DC.B'‚List„=(L)‚OR‚(LM)OR(LM,M,M....,M)' ‰DC.B$0D,$0A‰DC.B'‚Quit„=(Q)OR(QUIT)' ‰DC.B$0D,$0A2‰DC.B'‚Replace=(RF/M)OR(RF/M,F/M,....,F/M)'‰DC.B$0D,$0A,LFQUESTME‚EQU*-1‰DS.W0DIRLOCƒDC.L0DIRPOINTERRLIBLOCƒDC.B'Œ'‚LOCINLIBRARY‰DS.W0SECTCNT‚DC.W0ŠCOUNTOFSECTORS0DIRENDƒDC.L0ŠPOINTERATNEXTAVAILSPACEINDIR+TOTMODƒDC.W0ŠTOTALCOUNTOFMODULESINLIB‰DS.W0*(LISTTITLDC.B'MODULE†VER‚REV‚LNGƒDESC…'LT_DATE: ‰DC.B†'Š'LT_TIME: ‰DC.B†'Š'LISTTITE EQU *-1‰DS.W†0**ˆDATAAREAFORLISTFUNCTION*LISTDATA EQU *LISTMOD‚DC.B'Š'‚MODULENAME ‰DC.B'‚'LISTVER‚DC.B'ƒ'†VERSION ‰DC.B'‚'LISTREV‚DC.B'ƒ'†REVISION ‰DC.B'ƒ'LISTLANG DC.B ' ' ‰DC.B'„'LISTDESCDC.B'Š' ‰DC.B'Š' ‰DC.B'Š' ‰DC.B'Š' ‰DC.B'Š'LISTDESE EQU *-1‰DS.W0*"PROMPTM‚DC.B'>'‡PROMPTCHARACTER*‰DS.W0*PRTTOTM‚DC.B'TOTALMODULES'PRTTOTN‚DC.B'„'PRTTOTME EQU *-1‰DS.W0*INVMSGƒDC.B'‚INVALID'INV_XX: ‰DC.B†'CMD„' ‰DC.B†CR,LFINVMSGE‚EQU*-1‰DS.W0*X00100: ‰DC.B†'Š'*œSPACEFORFILENAME‰DC.B†'ISANINVALIDFILETYPE' ‰DC.B†CR,LFX00199:‚EQU‡*-1‰DS.W†0* ENTM…EQU*‰DC.B'ENTERSOURCEFILENAME‚' ENTME„EQU*-1‰DS.W0****‰DS.W0 NOLIBMƒEQU*‰DC.B'LIBRARYDOESNOTEXIST'NOLIBME‚EQU*-1‰DS.W0* MODMSGƒDC.B'Œ'‚HOLDMODULENAME*‰DC.B'MODULENOTFOUND'NOMODME‚EQU*-1*‰DS.W0 MODALMƒEQU*‰DC.B'MODULE‚'MODALMI‚DC.B'Œ'‰DC.B'ALREADYINTHELIBRARY'MODALME‚EQU*-1‰DS.W0* MODMISM‚EQU*‰DC.B'NOMODULENAME'MODMISME‚EQU*-1‰DS.W0* INSM…EQU**‰DC.B'INSERTAFTERMODULENAMENOTFOUND' INSME„EQU*-1‰DS.W0* LIBFULM‚EQU**‰DC.B'**‚WARNINGDIRECTORYWASFILLED**'LIBFULME EQU *-1‰DS.W0* INSENDM‚EQU*!ééééééééF ééééééééééééééééG ééééééééééééééééG ééééééééééééééééH ééééééééééééééééH ééééééééééééééééI ééééééééééééééééI ééééééééééééééééJ ééééééééééééééééJ ééééééééééééééééK ééééééééééééééééK ééééééééééééééééL ééééééééééééééééL ééééééééééééééééM ééééééééééééééééM ééééééééééééééééN ééééééééééééééééN ééééééééééééééééO ééééééééééééééééO éééééééééééééééé