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Œbe�returned�by�the�Fetch�Device�Mnemonics*£call. ** Miscellaneous equates*7INPUTLUƒEQU„1”This�logical�unit�number�is�used�for�disk *£device�I/O. 2LGOUTLUƒEQU„6”This�logical�unit�number�is�used�for**£message�output�to�the�log�output�device. :NOUTFLDƒEQU„$40�Value�returned�in�bits�8-31�of�D0�by�PARSE+*£when�the�output�field�of�the�command�line *£is�blank. *5* Messages that can be output by the DISMOUNT utility* 'VERMSG„DC.Wƒ'DISMOUNT�Version�122084�4'VERMSGEƒEQU„*-1ŠPAGE*0*‚Error�Message�Handler�request�parameter�block.*4EMHBLK„EQU„*’Error�Message�Handler�request�parameter)*£block�equates�(not�contained�in�IOE.SA) .EMHKEY„DC.Lƒ0”Key�returned�in�D0�by�the�server 7EMHPBA„DC.Lƒ0”Address�of�server�request�parameter�block ŠDC.Bƒ0”Reserved 5EMHLUN„DC.Bƒ0”LUN�to�which�the�error�message�is�to�be *¥output.ŠDC.Wƒ0&EMHPPSAƒDC.Lƒ0”Plug�pool�start�address $EMHPPEAƒDC.Lƒ0”Plug�pool�end�address 9EMHBLN„EQU„*-EMHBLK�Error�Message�Handler�Parameter�Block *£length.9ŠTTL�VERSAdos�Dismount�Utility�Ver.�4.00�(Main-line�code)ŠPAGE ŠSECTION‚1ŠXREFƒEDITFILE ŠXREFƒPARSE  *DISMOUNT‚EQU„*’Entry�point�for�the�utility 1ŠLEA.L‚STACK(PC),A7‰Initialize�the�stack�pointer.ŠSPC„2;ŠLEA.L‚VERMSG(PC),A5ˆSend�the�utility�signon�message�to�the(ŠLEA.L‚VERMSGE(PC),A6…log�output�device. ŠBSR.L‚MSGOUTŠSPC„23ŠTST.L‚D6“If�the�input�field�of�the�command�line�is6ŠBNE„DMT010�null,�give�a�command�line�syntax�error�and*£exit.ŠSPC„2ADMTCLE„MOVE.L�#EM_CLSE,D0ŠSend�a�command�line�syntax�error�to�the/ŠBRA.L‚EXITERRŒlog�output�device�and�terminate.ŠSPC„2EDMT010„LEA.L‚COMAND(PC),A0‡Save�the�command�line�start�address�on�the<ŠMOVE.L�A0,-(A7)‹stack�and�call�PARSE�to�analyse�the�commandŠBSR„PARSEŽline.ŠSPC„23ŠMOVE.L�D0,D1�Check�that�there�are�no�errors�in�the7ŠLSR.L‚#8,D0Žcommand�line,�the�input�field�is�not�null,<ŠCMP.L‚#NOUTFLD,D0ˆand�that�the�output�field�is�null.�If�one5ŠBNE.S‚DMTCLE�of�these�conditions�is�not�met,�issue�a*£command�line�syntax�error.ŠSPC„24ŠLSL.B‚#2,D1�If�the�options�field�is�not�null,�issue$ŠBCS„DMT015�an�invalid�option�error.ŠSPC„2;DMTOPTEƒMOVE.L�#EM_NVO,D0‹Output�a�invalid�options�error�to .ŠBRA.L‚EXITERRŒthe�log�output�device�and�exit.ŠSPC„2ADMT015„LEA.L‚FHSBLK(PC),A6ˆRestore�the�command�line�start�address4ŠMOVE.L�(A7)+,A0‹from�the�stack�and�call�EDITFILE�to&ŠBSR„EDITFILE‹analyse�the�input�field.ŠSPC„28ŠBTST.L�#22,D0�If�a�device�mnemonic�was�found�and�placed7ŠBEQ„DMTCLE�in�the�FHS�parameter�block�proceed�with�the-*£device�assignment.�If�an�error�was�detected$*£issue�a�command�line�syntax�error.ŠPAGE5ŠMOVE.L�A6,A0�Save�the�device�mnemonic�or�volume�name=ŠMOVE.L�FHSVOL(A0),D1†passed�on�the�invoking�command�line�andCŠMOVE.W�#FHFDMN,FHSCMD(A0)�initialize�the�FHS�parameter�block�for�a*£Fetch�Device�Mnemonics�call.ŠSPC„2:ŠLEA.L‚FDMNBLK(PC),A2ˆSet�up�the�address�and�length�of�the>ŠMOVE.L�A2,FHSPTR(A0)‡buffer�where�the�device�information�willBŠMOVE.L�#FDMNBLN,FHSLEN(A0)�be�returned�and�issue�the�call�for�all?ŠMOVE.W�#FOPFRA,FHSOPT(A0)‚random�access�device�mnemonics.�This1ŠTRAPƒ#3’request�should�never�result�in�an�error.ŠBNE.L‚EXITERRŠSPC„2CŠMOVE.B�#INPUTLU,FHSLUN(A0)‚Initialize�the�FHS�parameter�block.�The4ŠMOVE.L�#'„',D0‰device�will�be�assigned�to�the�inputAŠMOVE.L�D0,FHSCLG(A0)†logical�unit�number.�The�catalog,�filename,?ŠMOVE.L�D0,FHSCLG+4(A0)„and�extension�fields�are�initialized�to?ŠMOVE.L�D0,FHSFIL(A0)†blanks�as�required�for�device�assignment.ŠMOVE.L�D0,FHSFIL+4(A0)ŠMOVE.W�D0,FHSEXT(A0)ŠSPC„2?ŠMOVE.W�FHSLEN(A0),D2ˆInitialize�D2.W�to�the�offset�of�the�last,ŠMULUƒ#FDVLEN,D2‰device�entry�in�the�buffer.ŠSPC„2GDMT020„CMP.L‚FDVDEV(A2,D2.W),D1ƒIf�the�ID�passed�on�the�command�line�is4ŠBEQ„DMT030�the�device�mnemonic�of�the�current�table*£entry,�exit�the�search�loop.ŠSPC„2AŠCMP.L‚FDVVOL(A2,D2.W),D1ƒIf�the�ID�passed�on�the�command�line�is7ŠBEQ„DMT030�the�volume�name�of�the�current�table�entry,*£exit�the�search�loop.ŠSPC„2:ŠSUB.W‚#FDVLEN,D2‹Since�no�match�was�found�for�the�current3ŠBPL„DMT020�entry,�update�the�index�register�to�the(*£next�previous�entry�and�repeat�until�a)*£match�is�found�or�all�entries�have�been *£checked.ŠSPC„2>ŠMOVE.L�D1,FHSVOL(A0)ˆIf�no�matching�device�mnemonic�or�volume1ŠBRA„DMT040�name�was�found,�attempt�to�assign�the)*£device�as�specified�on�the�command�line*£and�let�an�error�occur.ŠSPC„2HDMT030„MOVE.L�FDVVOL(A2,D2.W),D1ƒTest�the�volume�name�field�of�the�entry3ŠBEQ„DMT035�containing�the�matching�device�mnemonic**£or�volume�name.�If�the�volume�name�field'*£is�zero,�FMS�does�not�have�the�device(*£assigned�so�skip�the�volume�assignment*£step.ŠPAGE>ŠMOVE.W�#FHASGN,FHSCMD(A0)„Make�an�exclusive�read/write�volumeDŠMOVE.W�#FOPEREW,FHSOPT(A0)�assignment�using�the�volume�name.�If�the>ŠMOVE.L�D1,FHSVOL(A0)†request�is�rejected,�the�disk�is�assumed0ŠTRAPƒ#3‘to�be�in�use�by�another�task�so�performŠBNE„EXITERRŒan�error�exit.ŠSPC„2@ŠMOVE.W�#FHCLOS,FHSCMD(A0)ƒClose�the�volume�assignment.�FMS�will4ŠTRAPƒ#3‘attempt�to�read�the�VID�(sector�0)�and�will8ŠBNE„EXITERRŒreceive�an�error�if�the�device�is�off-line.,*£This�will�cause�FMS�to�close�its�exclusive*£assignment�on�the�device.ŠSPC„2JDMT035„MOVE.L�FDVDEV(A2,D2.W),FHSVOL(A0)ƒMove�the�device�mnemonic�obtained!*«from�the�fetch�device�mnemonics%*«request�to�the�FHS�parameter�block.ŠSPC„2=DMT040„MOVE.W�#FHASGN,FHSCMD(A0)‹Make�an�exclusive�read/write+ŠTRAPƒ#3™device�assignment�using�the�device-ŠBNE„EXITERR”mnemonic�corresponding�to�the�ID#*«specified�on�the�command�line.�If%*«an�error�is�returned�the�device�was*«not�off-line�when�the�volume"*«assignment�was�closed�so�perform*«an�error�exit.ŠSPC„2=ŠLEA.L‚IOSBLK(PC),A0‰Initialize�the�IOS�parameter�block�for�a@ŠMOVE.B�#INPUTLU,IOSLUN(A0)�device�configuration�status�request.ŠLEA.L‚CNFGBLK(PC),A1ŠMOVE.L�A1,IOSDBP(A0)ŠSPC„2AŠMOVE.W�#IOSTAT,IOSFCT(A0)ƒPerform�a�configuration�status�request/ŠTRAPƒ#2‘to�determine�the�device�type.�No�error0ŠBNE„EXITERRŒshould�be�returned�on�this�request.ŠSPC„2<ŠMOVE.L�#EM_NVDEV,D0‰If�the�device�type�is�not�for�a�hard�orDŠCMP.B‚#XDSRDK,IOSDTP(A1)�floppy�disk,�issue�an�invalid�device�errorŠBHI„EXITERRŒmessage�and�exit. ŠSPC„2CŠMOVE.W�#IOCNFG,IOSFCT(A0)„Issue�a�configure�request�for�the�deviceEŠMOVE.W�#IOPDMNT,IOSOPT(A0)�with�the�dismount�option�and�zeros�in�the;ŠCLR.L‚IOSATM(A1)Šattributes�and�parameters�mask.�This�will.ŠTRAPƒ#2’not�change�any�configuration�data�but0ŠBNE„EXITERR�will�cause�the�driver�to�reject�all**¤further�I/O�requests�on�the�device�until,*¤configure�with�the�mount�option�is�issued.(*¤No�error�should�occur�on�this�request.ŠPAGE;ŠLEA.L‚FHSBLK(PC),A0ˆClose�the�device�assignment.�The�close<ŠMOVE.W�#FHCLOS,FHSCMD(A0)�processing�will�cause�the�current/ŠTRAPƒ#3‘configuration�to�revert�to�the�default7ŠBNE„EXITERRŒconfiguration.�No�error�should�ever�occur.ŠSPC„2-ŠERQ.TERM�#0,#0ŽPerform�a�normal�termination.ŠSPC„2;EXITERRƒBSR„EMHOUT�Call�the�error�message�handler�to�inform9ŠERQ.TERM�#0,#$C000ˆthe�user�of�the�terminating�error�and)*£terminate�with�a�code�that�will�cause�a+*£chain�file�invoking�the�utility�to�abort.AŠTTL�VERSAdos�Dismount�Utility�Ver.�4.00�(Message�Output�Subrtn.)ŠPAGEN********************************************************************************™Message�Output�Subroutine*™-------�------�----------*H*ƒThis�subroutine�outputs�the�message�pointed�to�by�A5�and�A6�to�the�logL* output device. These messages may be informative in nature or may be errorC* messages that are no available through the Error Message Handler.*&*�A5�=�Start�address�of�message�buffer$*�A6�=�End�address�of�message�buffer*M***************************************************************************** ?MSGOUT„MOVE.L�A0,-(A7)�Save�A0�on�the�stack�and�get�the�address8ŠLEA.L‚MSGBLK(PC),A0†of�the�message�I/O�parameter�block.ŠSPC„2DŠMOVE.W�#IOWRIT,IOSFCT(A0)ƒInitialize�the�parameter�block�to�perform?ŠMOVE.B�#LGOUTLU,IOSLUN(A0)�a�formatted�write�to�the�log�outputŠCLR.W‚IOSOPT(A0)Šdevice.ŠSPC„2BŠMOVEM.L�A5-A6,IOSSAD(A0)„Write�the�message�start�and�end�addreses1ŠTRAPƒ#2‘to�the�parameter�block�and�issue�the�I/O/ŠBNE„EXITERRŒrequest.�No�error�should�occur�but+*£terminate�the�utility�if�an�error�occurs.ŠSPC„27ŠMOVE.L�(A7)+,A0�Restore�the�original�A0�from�the�stack'ŠRTS—and�return�to�the�calling�routine.@ŠTTL�VERSAdos�Dismount�Utility�Ver.�4.00�(Error�Message�Subrtn.)ŠPAGEO**********************************************************************************�Error�Message�Handler�Request�Subroutine**�-----�-------�-------�-------�----------*C*ƒThis�subroutine�is�called�when�D0�contains�a�non-zero�return�codeN* following a trap request to VERSAdos. The Error Message Handler is called to1* output an message to the logical output device.*<*‰Entry�conditions�:�A0�=�address�of�the�IOS�parameter�block-*œD0�=�error�code�returned�by�the�TRAP�2�call*+*‰Exit�conditions‚:�All�registers�preserved*N****************************************************************************** EEMHOUT„MOVEM.L�D0/A0/A5,-(A7)†Save�the�registers�that�will�be�used�on *£the�stack.ŠSPC„24ŠMOVE.L�A0,A5�Copy�the�trap�parameter�block�address.ŠSPC„2<ŠLEA.L‚EMHBLK(PC),A0ˆCopy�the�error�code�and�parameter�block<ŠMOVEM.L�D0/A5,(A0)ˆaddress�into�the�EMH�parameter�block�and&ŠMOVE.L�#2,D0Žissue�the�error�message.ŠTRAPƒ#4ŠSPC„2<ŠMOVEM.L�(A7)+,D0/A0/A5†Restore�the�entry�registers�from�the-ŠRTS—stack�and�return�to�the�calling�routine. ŠEND„DISMOUNTéé D TTL Vdos Disk Config. Subrtns. V 4.01 (Validate Configur.) 010485 4ŠPAGE*‰INCLUDE�DSKCFGCD M******************************************************************************%*—Configuration�Validation�Subroutine%*—-------------�----------�----------*H*ƒAfter�the�driver�has�been�configured�sucessfully,�the�configuration�isJ* 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*ƒIf�any�error�is�returned�on�the�either�read�request,�the�configurationN* 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*„Entry�conditions�:�A0�=�address�of�IOS�parameter�block6*—A3�=�address�of�configure�parameter�block�containing *œthe�current�disk�configuration*E*‰Note�:�Entry�point�CNFGCHKB�should�be�called�whenever�an�I/O�buffer?*�other�than�TEMPBUF�is�to�be�used.�The�start�and�end�addresses@*�of�a�256�byte�buffer�must�be�placed�in�the�IOS�parameter�block;*�prior�to�entry.�Also,�256�bytes�immediately�following�the5*�buffer�end�address�must�be�available�for�use�by�the *�subroutine.*;*„Exit�conditions�:‚D0�=�0�if�the�validation�was�successful X'a/i,q)y3�/‰3‘2™6¡2©1±.¹5Á/É +*š=�IOS�error�code�if�an�I/O�error�occurred+*—All�registers�are�preserved�except�for�D0*N********************************************************************************ˆMODIFICATION�HISTORY*E*ˆAdded�lines�of�code�dated�11/04/83�which�puts�a�carriage�return�and8*ˆline�feed�at�the�end�of�each�pass�of�the�configuration%*ˆinformation�provided�on�the�screen.*B*ˆLines�of�code�dated�1/05/84�modified�those�of�11/04/83�to�use�anG*ˆinternal�carriage�return-line�feed�constant�instead�of�depending�upon!*ˆthe�using�program�for�the�data.*O*******************************************************************************ŠDS.Wƒ0µ1/05/84CRLF†DC.Wƒ$0D0A±1/05/84=CNFGCHKƒPEA.L‚TEMPBUF(PC)�Load�the�start�and�end�addresses�of;ŠMOVE.L�(A7)+,IOSSAD(A0)ˆthe�temporary�buffer�to�be�used�to)ŠPEA.L‚TEMPBUFE(PC)Œread�the�last�sector.ŠMOVE.L�(A7)+,IOSEAD(A0)ŠSPC„2ACNFGCHKB‚MOVE.L�D1,-(A7)�Save�the�entry�value�of�D1�on�the�stack.ŠSPC„2BŠMOVE.W�#IOREAD,IOSFCT(A0)ƒObtain�the�number�of�the�last�sector�byCŠMOVE.W�#IOPRAN,IOSOPT(A0)�decrementing�the�total�number�of�sectors=ŠMOVE.L�IOSRSZ(A3),D1†returned�from�the�configure�request�and6ŠSUB.L‚#1,D1Žmake�the�read�request.�If�an�error�status>ŠMOVE.L�D1,IOSRRN(A0)†is�returned,�the�configuration�is�faulty3ŠTRAPƒ#2‘so�return�without�performing�the�track�0-1ŠBNE.S‚CNFGCHKR‹boundary�check.ŠSPC„2BŠCMP.B‚#XTDIPC,IOSCTP(A3)ƒIf�the�disk�whose�configuration�is�being7ŠBEQ.S‚CNFGCHKR‹checked�is�on�an�IPC�controller,�do�not)*£perform�the�track�0-1�boundary�check�as**£the�track�and�sector�size�information�is!*£not�returned�by�the�IPC�driver.ŠSPC„21ŠCLR.W‚D1“Multiply�the�physical�sectors�per�track>ŠMOVE.B�IOSSPT(A3),D1†by�the�physical�sector�size�to�determine2ŠMULUƒIOSPSM(A3),D1†the�numb er�of�bytes�per�track.ŠSPC„2FDDFLPY„EQU„1<*‰Entry�Conditions�:�A1� =�Address�of�Configure�parameter�block3*œD1�(bits�16-31)�=�Mask�of�attributes�that�will�be*­opened�for�user�changes.2*œD1�(bits�0-15)‚=�Mask�of�parameters�that�will�be*­opened�for�user�changes.*3*‰Exit�Conditions‚:�All�registers�preserved�on�exit,*œUser�changes�have�been�incorporated�in�the*›Configure�parameter�block.*"*‰Display�Configuration�Subroutine"*‰--------------------------------*D*ƒThis�alternate�entry�point�is�used�when�the�mask�of�attributes�andH* 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.**‡Revision�History*>*‰4.01ƒ6/30/83‚MLBƒAdded�code�to�handle�Parameters�Mask�bit�150*Ÿbeing�used�to�specify�two�parameters�insead�of-*Ÿthe�ususl�single�parameter.�Also�added�code,*Ÿto�display�a�information�message�about�the**Ÿspecial�response�characters�'C'�and�'Q'.*N******************************************************************************ŠPAGE´MLB�6/30/83*HMODCNFGƒMOVEM.L�D0-D7/A0/A2-A3/A5-A6,-(A7)�Save�all�registers�that�are…*,ŠCLR.B‚D6™used�by�the�subroutine�and�clear�*$*«D6.B�to�indicate�that�the�display**«and�change�entry�was�used.‡*ŠSPC„2°MLB�6/30/83*>ŠLEA.L‚MSGINST(PC),A5‡Output�a�message�to�the�user�describing*@ŠLEA.L‚MSGINSTE(PC),A6„the�special�response�characters�'C'�and‚*ŠBSR„MSGOUT�'Q'.¥*ŠSPC„2»*7ŠBRA.S‚MOD003ŽBranch�to�the�start�of�the�display�loop.*ŠSPC„2°MLB�6/30/83*KDSPCNFGƒMOVEM.L�D0-D7/A0/A2-A3/A5-A6,-(A7)�Save�all�registers�that�are�used*ŠST…D6™used�by�the�subroutine�and�set�D6.B#*«to�indicate�that�the�display�only*«entry�was�used.ŠSPC„23MOD003„MOVE.L�D1,D7�Save�the�mask�of�parameters�and'*£attributes�to�display�or�change�in�D7(*£since�D1�is�used�by�some�of�the�system*£subroutines�used�later.ŠSPC„24MOD005„MOVE.L�D7,D4�Get�the�mask�of�attributes�to�be(ŠSWAPƒD4‘displayed�or�changed�in�to�D4.WŠSPC„27ŠLEA.L‚ATWTBL(PC),A2ˆLoad�the�address�of�the�attributes*£display/change�control�table.ŠSPC„2-ŠCLR.L‚D5“D5.w�contains�the�bit�number�of�the,*£attribute�being�displayed/changed.�Set�the*£bit�number�to�zero�initially.ŠSPC„2*J*ƒThis�is�the�start�of�the�attributes�update/display�loop.�Each�bit�of�theG* 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)+‰and�another�trailing�blank�following�the9ŠMOVE.B�#'�',(A6)Šconverted�number.�Update�A6�to�point�to&*£blank�folloing�the�prompt�character.ŠSPC„26ŠBSR.S‚OUTWINPŽOutput�the�prompt�and�input�a�new�value*£for�the�parameter.*ŠSPC„27ŠCMP.B‚#'C',(A5)ŒIf�the�user�input�a�'C'�for�configure,4ŠBNE.S‚MOD050�prepare�to�return�from�the�subroutine.ŠSPC„2JMODRTN„MOVEM.L�(A7)+,D0-D7/A0/A2-A3/A5-A6‚Restore�all�registers�and�returnŠRTSŸto�the�calling�routine.ŠSPC„2:MOD050„CMP.B‚#'Q',(A5)ŒIf�the�user�entered�a�'Q'�for�quit,3ŠBEQ„MTABRT�terminate�the�utility�by�jumping�to�the*£error�exit�routine.ŠSPC„22ŠCMP.B‚#CR,(A5)�If�a�CR�only�was�input,�retain�the8ŠBEQ.S‚MOD070�current�value�of�the�parameter�and�prepare *£to�process�the�next�parameter.ŠSPC„26ŠMOVE.L�A5,A0�Call�system�subroutine�ASCVAL�to�convert&ŠBSR„ASCVAL�the�input�value�to�binary.ŠSPC„2/ŠCMP.B‚#CR,D1�If�the�conversion�process�was�not4ŠBNE„MOD040�terminated�by�a�CR,�an�invalid�digit�was(*£entered�so�reissue�the�same�prompt�and*£solicit�new�input.ŠSPC„25ŠMOVE.L�D3,D2�Check�the�number�of�significant�bits�in3ŠCLR.L‚D1‘the�input�value�by�multiplying�the�lengthAŠMOVE.B�IPRMLEN(A2),D1…of�the�parameter,�in�bytes,�by�8�to�obtain8ŠLSL.L‚#3,D1Žthe�maximum�number�of�significant�bits�that7ŠLSR.L‚D1,D2Žwill�fit�in�the�parameter.�Shift�the�input6ŠBNE„MOD040�value�by�this�number�to�isolate�any�excess-*£significant�bits.�If�any�of�the�excess�bits**£are�set,�the�input�value�is�too�large�so+*£reissue�the�same�prompt�and�solicit�a�new*£value.ŠSPC„23ŠLSR.L‚#3,D1�Restore�the�length�of�the�parameter�in*£bytes.ŠSPC„2EMOD060„MOVE.B�D3,-1(A3,D1.L)‡Copy�the�new�value�of�the�parameter�into2ŠLSR.L‚#8,D3Žthe�configure�block�a�byte�at�a�time. ŠSUB.L‚#1,D1 ŠBNE„MOD060ŠPAGE9MOD070„CLR.L‚D1“Increase�the�configure�block�index�(D5.W)@ŠMOVE.B�IPRMLEN(A2),D1…by�the�length�of�the�current�parameter�so8ŠADD.W‚D1,D5Žthe�next�parameter�will�be�indexed.�Add�the<ŠADD.W‚#IPRMELN,A2ˆcontrol�table�entry�length�to�the�control+*£table�pointer�(A2)�to�index�the�entry�for*£the�next�parameter.ŠSPC„2/ŠTST.W‚D4“Continue�in�the�parameter�change�loop4ŠBNE„MOD030�until�all�of�the�parameters�specified�by**£the�calling�routine�have�been�opened�for *£change.ŠSPC„21ŠTST.B‚D6“If�the�display�only�flag�is�set,�return2ŠBNE„MODRTN�to�the�calling�routine�once�all�of�the)*£selected�attributes�and�parameters�have*£been�displayed.ŠSPC„2 *Ä11/04/837*‰Put�a�CR�LF�before�next�series�of�questions.�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„MOD005�Return�to�the�attributes�word�prompt.�The)*£sequence�of�prompts�continues�to�repeat+*£until�the�user�enters�either�a�'C'�or�'Q'$*£in�response�to�one�of�the�prompts.: TTL Vdos Disk Config. Subrtns. V 4.00 (Output with Input)ŠPAGEL*******************************************************************************˜Output�With�Input�Subroutine*K*ƒThis�subroutine�outputs�in�image�mode�to�the�log�output�device�the�bufferK* 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.* ?*‚Entry�Conditions�:�A5�=�starting�address�of�the�output�buffer**•A6�=�ending�address�of�the�output�buffer*=*‚Exit�Conditions‚:�A5�=�starting�address�of�the�input�buffer)*•A6�=�ending�address�of�the�input�buffer*M***************************************************************************** ?OUTWINPƒMOVE.L�A0,-(A7)�Save�the�entry�value�of�A0�and�load�the9ŠLEA.L‚MSGBLK(PC),A0†message�IOS�parameter�block�address.ŠSPC„2CŠMOVE.W�#IOWRIT,IOSFCT(A0)„Set�the�IOCB�for�an�image�mode�output�toEŠMOVE.B�#LGOUTLU,IOSLUN(A0)�the�log�output�device.�Image�mode�is�usedEŠMOVE.W�#IOPIMG,IOSOPT(A0)‚to�allow�the�input�to�follow�the�output�on *¤the�same�line�of�the�terminal.ŠSPC„2@ŠMOVEM.L�A5-A6,IOSSAD(A0)„Write�the�buffer�addresses�to�the�IOCB.ŠTRAPƒ#2‘and�output�the�buffer.�If�an�error�is,ŠBNE„EXITERRŒreturned�terminate�the�utility.ŠSPC„28ŠLEA.L‚INPBUF(PC),A5ˆStore�the�input�buffer�starting�and<ŠLEA.L‚INPBUFE(PC),A6…ending�buffer�addresses�into�A5�and�A6BŠMOVEM.L�A5-A6,IOSSAD(A0)‚respectively�and�copy�the�addresses�into*£the�message�IOCB.ŠSPC„2@ŠMOVE.W�#IOREAD,IOSFCT(A0)„Perform�a�formatted�read�from�the�logBŠMOVE.B�#LGINPLU,IOSLUN(A0)�input�device.�If�an�error�is�returned,(ŠCLR.W‚IOSOPT(A0)Šterminate�the�utility.ŠTRAPƒ#2 ŠBNE„EXITERRŠSPC„2/ŠBSR„SBARG�Call�the�SBARG�subroutine�to�perform7ŠBNE.S‚EXITERRŒargument�substitution�and�lower�to�upper&*£case�conversion�on�the�input�buffer.ŠSPC„24ŠMOVE.L�A5,A6�Adjust�the�input�buffer�end�address�in<ŠADD.L‚IOSLEN(A0),A6†A6�to�point�to�the�last�input�character(*£after�arguments�have�been�substituted.ŠSPC„29ŠMOVE.L�(A7)+,A0�Restore�the�entry�value�of�A0�and�returnŠRTS—to�the�calling�routine.7 TTL Vdos Disk Config. Subrtns. V 4.00 (Message Output)ŠPAGEN********************************************************************************™Message�Output�Subroutine*™-------�------�----------*H*ƒThis�subroutine�outputs�the�message�pointed�to�by�A5�and�A6�to�the�logL* output device. These messages may be informative in nature or may be errorC* messages that are no available through the Error Message Handler.*&*�A5�=�Start�address�of�message�buffer$*�A6�=�End�address�of�message�buffer*M***************************************************************************** ?MSGOUT„MOVE.L�A0,-(A7)�Save�A0�on�the�stack�and�get�the�address8ŠLEA.L‚MSGBLK(PC),A0†of�the�message�I/O�parameter�block.ŠSPC„2DŠMOVE.W�#IOWRIT,IOSFCT(A0)ƒInitialize�the�parameter�block�to�perform?ŠMOVE.B�#LGOUTLU,IOSLUN(A0)�a�formatted�write�to�the�log�outputŠCLR.W‚IOSOPT(A0)Šdevice.ŠSPC„2BŠMOVEM.L�A5-A6,IOSSAD(A0)„Write�the�message�start�and�end�addreses1ŠTRAPƒ#2‘to�the�parameter�block�and�issue�the�I/O1ŠBNE.S‚EXITERRŒrequest.�No�error�should�occur�but+*£terminate�the�utility�if�an�error�occurs.ŠSPC„27ŠMOVE.L�(A7)+,A0�Restore�the�original�A0�from�the�stack'ŠRTS—and�return�to�the�calling�routine. = TTL Vdos Disk Config. Subrtns. V 4.00 (ASCII Decimal Output)ŠPAGEL*****************************************************************************$*–Binary�to�ASCII�Decimal�Conversion *žSubroutine*J*ƒThis�suborutine�converts�a�binary�value�to�ASCII�decimal.�The�address�ofN* 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*„Entry�conditions�:�A0�=�address�of�the�binary�value�to�be�converted8*—A6�=�address�where�the�converted�value�is�to�be�stored9*—D0.B�=�the�number�of�bytes�in�the�value�to�be�converted*H*„Exit�conditions‚:�A6�=�address�of�the�byte�following�the�last�digit�of*œthe�converted�number-*˜All�other�registers�are�preserved�on�return*K*************************************************************************** DDECTOASC‚MOVEM.L�D0-D2,-(A 7)‰Save�the�all�the�registers�that�will�be4ŠCLR.L‚D1‘changed�on�the�stack�for�later�restoration)ŠCLR.W‚D2‘and�zero�the�working�registers.ŠSPC„29DEC010„LSL.L‚#8,D1�Move�the�value�to�be�converted�into�D1=ŠMOVE.B�0(A0,D2.W),D1†a�byte�at�a�time�starting�with�the�mostŠADD.W‚#1,D2Žsignificant�byte. ŠSUB.B‚#1,D0 ŠBNE„DEC010ŠSPC„20ŠCLR.B‚-(A7)�Save�a�byte�of�zero�on�the�stack�to"*£serve�as�an�end�of�string�markerŠSPC„2*K*ƒThe�number�conversion�loop�begins�with�the�least�significant�digit�of�theM* 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,D1�Divide�the�value�by�10.�Generate�the3ŠSWAPƒD1‘ASCII�decimal�digit�by�adding�an�ASCII�'0'9ŠADD.B‚#$30,D1Œto�the�reminder�and�store�the�digit�on�theŠMOVE.B�D1,-(A7)‹stack.ŠSPC„20ŠCLR.W‚D1“Zero�the�remainder�and�continue�in�the1ŠSWAPƒD1‘loop�until�the�value�is�reduced�to�zero. ŠBNE„DEC020ŠPAGE@DEC030„MOVE.B�(A7)+,(A6)+ŠMove�the�ASCII�decimal�string�from�the3ŠBNE„DEC030�stack�to�the�storage�area�pointed�to�by)*£A6.�The�digts�are�pulled�from�the�stack&*£in�order�of�decreasing�significance.(*£The�move�loop�terminates�when�the�zero"*£end-of-string�byte�is�retrieved.ŠSPC„25ŠTST.B‚-(A6)�Adjust�A6�to�point�to�the�byte�following(*£the�last�digit�of�the�converted�value.ŠSPC„26ŠMOVEM.L�(A7)+,D0-D2‰Restore�the�original�value�of�the*ŠRTS—modified�registers�from�the�stack�and *£return�to�the�calling�routine.= TTL Vdos Disk Config. Subrtns. V 4.00 (Error Message Output)ŠPAGEO**********************************************************************************�Error�Message�Handler�Request�Subroutine**�-----�-------�-------�-------�----------*C*ƒThis�subroutine�is�called�when�D0�contains�a�non-zero�return�codeN* following a trap request to VERSAdos. The Error Message Handler is called to1* output an message to the logical output device.*<*‰Entry�conditions�:�A0�=�address�of�the�IOS�parameter�block-*œD0�=�error�code�returned�by�the�TRAP�2�call*+*‰Exit�conditions‚:�All�registers�preserved*N****************************************************************************** EEMHOUT„MOVEM.L�D0/A0/A5,-(A7)†Save�the�registers�that�will�be�used�on *£the�stack.ŠSPC„24ŠMOVE.L�A0,A5�Copy�the�trap�parameter�block�address.ŠSPC„2<ŠLEA.L‚EMHBLK(PC),A0ˆCopy�the�error�code�and�parameter�block<ŠMOVEM.L�D0/A5,(A0)ˆaddress�into�the�EMH�parameter�block�and&ŠMOVE.L�#2,D0Žissue�the�error�message.ŠTRAPƒ#4ŠSPC„2<ŠMOVEM.L�(A7)+,D0/A0/A5†Restore�the�entry�registers�from�the-ŠRTS—stack�and�return�to�the�calling�routine.= TTL Vdos Disk Config. Subrtns. Ver. 4.00 (Error Termination)ŠPAGEL******************************************************************************–Error�Termination�Routine*–-----�-----------�-------*L*ƒThis�routine�is�called�whenever�a�fatal�error�was�detected�by�the�utility.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.*@*‰Entry�conditions‚:�A0�=�Address�of�an�IOS�parameter�block�that+*¡contains�the�LUN�to�which�the�disk�device*¡is�assigned.7*‰Exit�conditions�:�This�routine�terminates�the�utility*N******************************************************************************  9EXITERRƒBSR„EMHOUT�Output�the�error�message�for�the�error*£that�caused�termination.ŠSPC„2>MTABRT„LEA.L‚CNFGBLK(PC),A1ˆLoad�the�configure�parameter�block;ŠLEA.L‚IOSBLK(PC),A0†and�the�IOS�param eter�block�addresses.ŠSPC„2=ŠMOVE.W�#IOCNFG,IOSFCT(A0)„Issue�a�configure�request�with�theCŠMOVE.W�#IOPDMNT,IOSOPT(A0)�dismount�option�and�zero�attributes�and7ŠMOVE.L�A1,IOSDBP(A0)‡parameters�masks.�When�the�device3ŠCLR.L‚IOSATM(A1)Šassignment�is�closed,�the�default/ŠTRAPƒ#2’configuration�will�be�restored�and�the$*¤driver�will�reject�any�further�I/O *¤requests.ŠSPC„2?MTABRT10‚ERQ.TERM�#0,#$C000‹Terminate�the�utility�with�an�error,*£code�that�will�cause�a�chain�file�invoking*£the�utility�to�abort.ŠSPC„2ééééééE TTL Vdos Disk Configure Subrtns. V 4.02 (Data Declarations) 11/09/84ŠPAGE*‰INCLUDE�DSKCFGDT*4* Parameter Block storage for VERSAdos system calls.*)IOSBLK„DCB.B‚IOSBLN,0‹IOS�parameter�block 0CNFGBLKƒDCB.B‚IOSDLN,0‹Configure�parameter�blockCNFGBLKE‚EQU„*-1*‰INCLUDE�EMHOUT*0*‚Error�Message�Handler�request�parameter�block.*4EMHBLK„EQU„*’Error�Message�Handler�request�parameter)*£block�equates�(not�contained�in�IOE.SA) .EMHKEY„DC.Lƒ0”Key�returned�in�D0�by�the�server 7EMHPBA„DC.Lƒ0”Address�of�server�request�parameter�block ŠDC.Bƒ0”Reserved 5EMHLUN„DC.Bƒ0”LUN�to�which�the�error�message�is�to�be *¥output.ŠDC.Wƒ0&EMHPPSAƒDC.Lƒ0”Plug�pool�start�address $EMHPPEAƒDC.Lƒ0”Plug�pool�end�address 9EMHBLN„EQU„*-EMHBLK�Error�Message�Handler�Parameter�Block *£length.ŠSPC„2*3*‚Parameter�block�storage�for�VERSAdos�system�calls*@MSGBLK„DCB.B‚IOSBLN,0‹IOS�parameter�block�for�output�messages�to*£the�log�output�device.ŠSPC„2**‚Miscellaneous�storage*1INPBUF„DS.Bƒ82“Buffer�to�contain�interactive�user8INPBUFEƒEQU„*-2�responses.�The�end�buffer�address�passed**£to�IOS�is�one�less�than�the�physical�end)*£of�the�buffer�because�SBARG�places�a�CR%*£at�the�buffer�end�address�plus�one.ŠSPC„2°6/30/83�MLB*JMSGINSTƒDC.Wƒ$0A,'Configuration�change-to�exit�enter�C�(configure)�or�Q'�*"ŠDC.Wƒ'�(terminate�utility)',$0A¢*MSGINSTE‚EQU„*-1®6/30/82�MLB*ŠPAGE*A*ƒThe�following�table�controls�the�operation�of�the�ConfigurationH* 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/83�MLB*LATWTBL�DC.Bƒ'S','D','Data�Density�of�media�(S-single,D-double)�' ,*-*,'�>�'�*F‡DC.Bƒ'S','D','Track�Density�of�media�(S-single,D-double)',*-*,'�>�'�*@‡DC.Bƒ'S','D','S-Single�or�D-Double�sided�diskette‡',*-*,'�>�'�*E‡DC.Bƒ'M','I','Media�format�(M-Motorola,I-IBM�standard)‚',*-*,'�>�'�*Ñ>Ú2â.=‡DC.Bƒ'F','H','F-Floppy�diskette�or�H-Hard�diskŠ',*-*,'�>�'�*F‡DC.Bƒ'S','D','Data�Density�of�drive�(S-single,D-double)�',*-*,'�>�'�*F‡DC.Bƒ'S','D','Track�Density�of�drive�(S-single,D-double)',*-*,'�>�'�*F‡DC.Bƒ'N','Y','Seek�required�w/�head�change�(Y-Yes,�N-No)',*-*,'�>�'�*E‡DC.Bƒ'W','R','W=Pre-write�or�R=Post-read�precomp.�cyl.‚',*-*,'�>�'�*B‡DC.Bƒ'5','8','5-1/4"�or�8"�disk�size�(enter�5�or�8)…',*-*,'�>�'�*@‡DC.Bƒ'N','Y','Alternate�Track�usage�(Y-Yes,�N-No)‡',*-*,'�>�'�*‡DC.Bƒ0ƒspace�for�attribute�11‡DC.Bƒ0ƒspace�for�attribute�12‡DC.Bƒ0ƒspace�for�attribute�13‡DC.Bƒ0ƒspace�for�attribute�14‡DC.Bƒ0ƒspace�for�attribute�15‡DS.Wƒ0*À11/09/84�sml*ŠSPC„2*J*ƒThese�equates�define�the�offsets�of�the�various�fields�of�the�Attributes* control table. 4ATWBCLRƒEQU„0”This�is�the�offset�of�the�input/output**£mnemonic�for�an�attribute�value�of�zero.ŠSPC„24ATWBSETƒEQU„1”This�is�the�offset�of�the�input/output)*£mnemonic�for�an�attribute�value�of�one.ŠSPC„2-ATWBPRMT‚EQU„2”This�is�the�offset�of�the�text*£description�of�the�attribute.ŠSPC„28ATWBCVAL‚EQU„44“This�is�the�offset�of�where�the�mnemonic+*£for�the�current�attribute�value�is�stored *£for�output.ŠSPC„29ATWBPLN1‚EQU„44“This�is�the�length-1�of�the�output�buffer,*£when�the�display�only�entry�point�is�used.ŠSPC„29ATWBPLN2‚EQU„47“This�is�the�length-1�of�the�output�buffer,*£when�the�display�and�change�entry�point�is*£used.ŠPAGE*H*ƒThe�following�table�controls�the�operation�of�the�Configuration�ChangeI* 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/83�MLB*/PRMTBL�DC.B‚IOSRSZ-IOSREC,'Vdos�sector�size�'ƒ*+‡DC.B‚IOSWTO-IOSRSZ,'Total�Vdos�sectors›'ƒ*+‡DC.B‚IOSRTO-IOSWTO,'Write�timeout�(ms)›'ƒ**‡DC.B‚IOSSPT-IOSRTO,'Read�timeout�(ms)œ'ƒ*@‡DC.B‚IOSHDS-IOSSPT,'Physical�sectors/track�on�media(8�bits)†'ƒ*9‡DC.B‚IOSTRK-IOSHDS,'Number�of�heads�on�drive(8�bits)�'ƒ*>‡DC.B‚IOSILV-IOSTRK,'Number�of�cylinders�on�media(16�bits)ˆ'ƒ*;‡DC.B‚IOSSOF-IOSILV,'Interleave�factor�on�media(8�bits)‹'ƒ*7‡DC.B‚IOSPSM-IOSSOF,'Spiral�offset�on�media(8�bits)�'ƒ*@‡DC.B‚IOSSHD-IOSPSM,'Bytes/physical�sector�on�media(16�bits)†'ƒ*@‡DC.B‚IOSTRKD-IOSSHD,'Starting�head�number�on�drive(16�bits)‡'‚*E‡DC.B‚IOSPCOM-IOSTRKD,'Max.�number�of�cylinders�on�drive(16�bits)ƒ'�*E‡DC.B‚IOSSPTD-IOSPCOM,'Precomp.�cylinder�number�on�drive(16�bits)ƒ'�*B‡DC.B‚IOSSRTD-IOSSPTD,'Physical�sectors/track�on�drive(8�bits)†'�*7‡DC.B‚IOSEWCC-IOSSRTD,'Head�step�rate�code�(8�bits)‘'�*F‡DC.B‚IOSECC-IOSEWCC,'Reduced�write�current�cylinder�no.�(16�bits)�'‚*9‡DC.B‚IOSDRSV-IOSECC,'ECC�data�burst�length�(16�bits)Ž'‚*‡SPC„2³9/20/83�MLB**J*ƒThese�offsets�define�offsets�within�an�entry�in�the�configuration�change* control table.* 5IPRMLENƒEQU„0”Offset�of�start�of�the�prompt�field�and8IPRMTXTƒEQU„1’the�length�of�the�field�within�a�parameterIPRMTLNƒEQU„45‘field�entry. †DISPLAYS�NEXT�SECTOR�IN�SUCCESSION*.*‹^…DISPLAYS�PREVIOUS�SECTOR�IN�SUCCESSION*4*‹R�$20…CAUSES�SECTOR�$20�TO�BE�READ�INTO�THE�CHANGE *•BUFFER.*3*‹S‰CAUSES�THE�SECTOR�CHANGE�BUFFER�TO�BE�DISPLAYED*9*‹F�55†CAUSES�THE�HEX�PATTERN�55�TO�BE�PLACED�IN�ALL�BYTE3*•POSITIONS�OF�THE�SECTOR�CHANGE�BUFFER.‚THE�NUMBER/*•IS�ALWAYS�ASSUMED�TO�BE�HEX.‚A�LEADING�'$'�IS*•OPTIONAL�BUT�HAS�NO�EFFECT.*4*‹M�32†OPENS�UP�CHANGE�MODE�AT�OFFSET�32(HEX)�IN�THE1*•SECTOR�CHANGE�BUFFER.‚A�LEADING�'$'�IS�OPTIONAL *•SIMILAR�TO�THE�'F'�SUBCOMMAND.*1*‹W‰WRITES�OUT�THE�SECTOR�CHANGE�BUFFER�TO�SECTOR*•FROM�WHICH�IT�WAS�READ*6*‹W�$10…WRITES�OUT�SECTOR�CHANGE�BUFFER�TO�SECTOR�$10.8*‹OUT�NAME‚CHANGES�LISTING�FILE/DEVICE�TO�THAT�SPECIFIED *•IN�'NAME'**‹Q‰TERMINATES�DUMP�TASK.***ˆMODIFICATION�HISTORY* *ˆ101684�4=*ˆWHEN�AN�ASSIGN�IS�MADE�FOR�A�DEVICE�WHICH�FAILS�BECAUSE�THEA*ˆDEVICE�DOES�NOT�HAVE�A�VOLUME�ASSOCIATED�AND�THE�SHARED�SEGMENT@*ˆBIT�IS�SET,�DUMP�WILL�CLEAR�THAT�BIT�AND�RETRY�THE�ASSIGNMENT.*H************************************************************************* DUMP DATA AREAH*************************************************************************!ŠXREFƒEDITFILE,OPTION,PARSE,SBARGŠNOLISTŠINCLUDE�9995.&.TR1.EQõüDD @Xj%J-D5G==EAMGU8]Be:mAuF}8…@�;•9�L¥@­MµG½\Å:Í=Õ@ÝFåHŠINCLUDE�9995.&.FME.EQŠINCLUDE�9995.&.IOE.EQŠLIST*‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.FME.EQ*‰INCLUDE�9995.&.IOE.EQ* ŠSECTION�0B‰EQU„*&ŠDC.Bƒ'122084�4'‰DATE/REV�CODE/VERSION** DUMP DATA AREA* ŠDS.Lƒ$20 STACK…EQU„*-SAVSTACK‚DS.Lƒ1’SAVE�FOR�STACK�POINTER�ON�ASQ*#CLGH†EQU„$A0�LENGTH�OF�COMMAND�LINE-CLINE…COMLINE�CLGHŽCOMMAND�LINE�INPUT�TO�TASK*)INITREGƒEQU„*’REGS�SAVED�ON�INITIAL�ENTRY-STSKNAMƒDS.Lƒ1’D0�=�TASK�NAME�THAT�STARTED�ME1SESNUM„DS.Lƒ1’D1�=�SESSION�NUMBER�THAT�STARTED�ME&VOLNAM„DS.Lƒ1’D2�=�DEFAULT�VOLUME�NAME'USERNUMƒDS.Lƒ1’D3�=�DEFAULT�USER�NUMBER'CATNAM„DS.Lƒ1’D4�=�DEFAULT�CATALOG�NAME-ŠDS.Lƒ1’D5�=�2ND�HALF�OF�DEFAULT�CATALOG�NAME,ŠDS.Lƒ1’D6�=�#�OF�CHARACTERS�IN�COMMAND�LINESAVD7…DS.L ƒ1’D7�=�LU�MASKINITA0„DS.Lƒ1’A0�=�TASK�NAME INITA1„DS.Lƒ1*!* PARAMETER BLOCK TO ALLOCATE ASQASQ1†DC.Lƒ'DUMP'�TASK�NAME(ŠDC.Lƒ0’SESSION�CODE�(N/A�FOR�USER�TASK)$ŠDC.Bƒ8’DISABLE�REG�STACKING,ASR,ASQ#ŠDC.Bƒ20‘LONGEST�MESSAGE�ACCEPTABLE ŠDC.Lƒ$100�QUEUE�LENGTH�IF�BYTES,ŠDC.Lƒ0’ALTERNATE�SERVICE�ADDRESS�(NOT�USED)$ŠDC.Lƒ0’ASR�RECEIVING�AREA�(DYNAMIC)** ASR RECEIVING AREAASQBUFFƒDS.Bƒ20*'* ERROR MESSAGE HANDLER PARAMETER BLOCK*4ERRPBLKƒDC.Lƒ0’USER�REG�D0�CONTAINS�ERRMSG�KEY�VALUE-ŠDC.Lƒ0’USER�REG�A0�POINTS�AT�I/O�CONTROL�BLK3ERRPOPTƒDC.Bƒ0’ERROR�OPTIONS�[BIT�0=QUERY�RESPONSE].ERRPLDFƒDC.BƒLDFLUN�USER�LDFLUN�LUN�FOR�SCREEN%ERRPQUYƒDC.Bƒ0’QUERY�RETURN�CHARACTER,ERRPCDFƒDC.BƒCDFLUN�USER�CDFLUN�FOR�KEYBOARD0ERRPLUGB‚DC.Lƒ0’BEGINNING�OF�USER�TEXT�PLUG�POOL*ERRPLUGE‚DC.Lƒ0’END�OF�USER�TEXT�PLUG�POOL** TIME PARAMETER BLOCK*TIMBLK„DS.Lƒ1’DATE ŠDS.Lƒ1’TIME*&TMPDATEƒDS.Lƒ1’TEMPORARY�HOLD�FOR�DATEHOLDDATE‚DS.Lƒ1*/PARSAREG‚EQU„*’SAVED�A-REGS�AFTER�CALL�TO�PARSE3OUTPSRTƒDS.Lƒ1’A1�=�OUTPUT�FIELD�ADDRESS�FROM�PARSE3OPTSRT„DS.Lƒ1’A2�=�OPTIONS�FIELD�ADDRESS�FROM�PARSE+NONCONTG‚DC.Wƒ0’FLAG�FOR�NONCONTIGUOUS�FILE1EDITRTNƒDC.Lƒ0’SAVE�FOR�FLAG�RETURN�FROM�EDITFILE0EDITOUTƒDC.Lƒ0’SAVE�FOR�EDITFILE�OF�OUTPUT�FIELD*EDITSVA0‚DC.Lƒ0’SAVE�FOR�A0�AFTER�EDITFILE%ASQDUN„DC.Wƒ-1‘FLAG�FOR�ASQ�ALLOCATED2BKCNT…DS.Wƒ1’HOLDS�NUMBER�OF�BLOCKS�IN�SHARED�SEG.* * LU EQUATES*(INPLUN„EQU„1’ASSOCIATED�WITH�INPUT�FIELD4LISTLUNƒEQU„3’ASSOCIATED�WITH�LISTING�(OUTPUT�FIELD)*** PROMPT MESSAGE*"PROMPTCƒDC.Bƒ'>�'�PROMPT�CHARACTERPROMPTCE‚EQU„*-1***'* INPUT BUFFER FOR INTERACTIVE DIALOGUE*OPINLGHƒEQU„60‘LENGTH(BYTES)OPINPBUF‚DS.BƒOPINLGHŒBUFFER,TERMCHRƒDC.Bƒ'Q'�TERMINATION�INPUT�CHARACTER+DUMPCHRƒDC.Bƒ'D'�INTERACTIVE�DUMP�CHARACTER*+* SAVE AREAS FOR DECODING INTERACTIVE INPUT* INTRACTƒDC.Lƒ0’INTTERACTIVE�FLAG-DUMPED„DC.Lƒ0’FIRST�TIME�THRU�FLAG�FOR�DUMPED)STOPT…DC.Lƒ0’LIMIT�OPTIONS�SPECIFIED�FLAG SRTSEC„DC.Lƒ-1‘STARTING�SECTOR�#*ENDSEC„DC.Lƒ$7FFFFFFFŠENDING�SECTOR�NUMBERCHRPTR„DS.Lƒ1’CHARACTER�POINTER,RSEC†DC.Lƒ-1‘HOLDS�SECTOR�#�IN�CHANGE�BUFFER6RCHG†DC.Wƒ$FFFFŽCHANGED�FLAG�(<>0�IMPLIES�NOT�CHANGED)8GOTCHG„DC.Wƒ$FFFFŽGOT�CHANGE�BUFFER�(<>0�IMPLIES�NO�GOT)"RFRRN…DS.Lƒ1’1ST�RRN�IN�SHARED�SEG3RSEG†DS.Lƒ1’SAVED�ADDR�IN�SEG�OF�SECTOR�OF�INTEREST*SAVDEC„DS.Lƒ1’SAVE�FOR�DECNUM&MODEC…DC.Lƒ$F‘MODE�(0=�IN�CHANGE�MODE).INCNUM„DC.Lƒ0’INCREMENT�FOR�UP�OR�DOWN�DISPLAY0DECNUM„DC.Lƒ-1‘BINARY�NUMBER�INPUT�FROM�OPERATOR/GETIDXNM‚DS.Lƒ1’VALUE�TO�PUT�INTO�CHANGE�BUFFER4QFIRST„DS.Lƒ1’FIRST�PASS�FLAG�FOR�STRING�CONVERSIONS2QSAVA0„DS.Lƒ2’SAVE�FOR�A0-A1�ON�STRING�CONVERSIONS7STGCHR„DS.Wƒ1’SAVE�FOR�CHARACTER�ON�NUMERIC�STRING�CONV(RADIX…DS.Wƒ1’NUMBER�BASE�RADIX�TEMP�SAVE*"SAVD†DS.Lƒ2’FORMATS�SAVE�FOR�D1,D2+BYTENUMƒDS.Lƒ1’FORMATS�SAVE�FOR�BYTE�NUMBER*&*ƒCHANGE�LU�ASSIGNMENT�PARAMETER�BLOCK*.LDFLSTLU‚EQU„*’CHANGE�LU�ROM�LDFLUN�TO�LISTLUN2ŠDC.WƒFHCHLU�CODE=1,�COMMAND=$10�(CHANGE�LU�ASSGN)ŠDC.WƒFOPKEP+FOPSLU†KEEP,SENDŠDC.Bƒ0’STATUS%ŠDC.BƒLDFLUN�SEND�LOGICAL�UNIT�NUMBER)ŠDC.BƒLISTLUNŒRECEIVE�LOGICAL�UNIT�NUMBERŠDC.Bƒ0’RESERVEDŠDC.Lƒ0’TASK�ID�(0=SELF)ŠDC.Lƒ0’SESSION�#(0=SELF)*7*ƒASSIGN�LISTING�LU�TO�DEVICE�SPECIFIED�IN�OUTPUT�FIELD*&ŠFHS.LIST�FHASGN,FOPPW,LISTLUN,0,0,$00*4*ƒASSIGN�INPUT�LU�TO�DEVICE�SPECIFIED�ON�INPUT�FIELD**ŠFHS.INP�FHASGN,FOPPR+FOPABF+FOPADR,INPLUN'ŠDC.Lƒ0’SHARED�SEG�LOG�STARTING�ADDRESS$ŠDC.Lƒ0’FHS�FILLS�IN�ENDING�BUF�ADDR(ŠDC.Lƒ0’FHS�FILLS�IN�SHARED�SEGMENT�NAME*(* FETCH DEVICE MNEMONICS PARAMETER BLOCK* FCHFHS„EQU„*#ŠDC.WƒFHFDMN�FETCH�DEVICE�MNEMONICS0ŠDC.WƒFOPFRA�FETCH�RANDOM�ACCESS�DEVICES�OPTIONSŠDC.Wƒ0’FILLER ŠDC.Lƒ0’BUFFER�ADDRESS�(DYNAMIC)-ŠDC.LƒBUFL*2�BUFFER�LENGTH‚(use�both�buffers)**2*‚I/O�PARAMETER�BLOCK�FOR�GENERAL�MESSAGES�(INPUT)*&ŠIOS.MSGI�IOREAD,,CDFLUN,,,0,0,OPINLGH*+*�I/O�PARAMETER�BLOCK�FOR‚MESSAGES�(OUTPUT)*ŠIOS.MSG�IOWRIT,IOPIMG,LDFLU  N* * I/O PARAMETER BLOCK FOR OUTPUT*ŠIOS.LST�IOWRIT,IOPCNP,LISTLUN*(* I/O PARAMETER BLOCK TO INPUT FROM FILE*INPOPT„EQU„IOPIMG+IOPBLK+IOPRAN)ŠIOS.INP�IOREAD,INPOPT,INPLUN,0,,0,0,BUFL*DEVES…DC.Bƒ'Invalid�device' ŠDC.Bƒ$0D ŠDC.Bƒ$0A DEVEE…EQU„*-1ŠDS…0*+IOPTMSGS‚DC.Bƒ'Only�''I''�option�processed' ŠDC.Bƒ$0D ŠDC.Bƒ$0AIOPTMSGE‚EQU„*-1ŠDS…0*6NONCS…DC.Bƒ'Invalid�subcommand�for�noncontiguous�file' ŠDC.Bƒ$0D ŠDC.Bƒ$0A NONCE…EQU„*-1ŠDS…0**#* MESSAGE FOR INVALID INPUT COMMAND*3SXERR…DC.Bƒ'Legal�options�in�interactive�mode�are:' ŠDC.Bƒ$0D ŠDC.Bƒ$0A ŠDC.Bƒ$0D ŠDC.Bƒ$0A4ŠDC.Bƒ'''D�S,T''…To�dump�from�sector�S�to�sector�T,' ŠDC.Bƒ$0D ŠDC.Bƒ$0A%ŠDC.Bƒ'�a�leading�''$''�implies�hex.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A3ŠDC.Bƒ'ˆTo�dump�the�next�sector�in�succession.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A*ŠDC.Bƒ'^‡To�dump�the�previous�sector.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A4ŠDC.Bƒ'''R�S''‡To�read�sector�S�into�change�buffer.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A2ŠDC.Bƒ'''S''‰To�display�the�sector�change�buffer.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A8ŠDC.Bƒ'''F�S''‡To�fill�the�sector�change�buffer�with�S,' ŠDC.Bƒ$0D ŠDC.Bƒ$0A$ŠDC.Bƒ'�S�assumed�to�be�1-byte�hex.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A1ŠDC.Bƒ'''M�S''‡To�enter�change�mode�at�offset�S,' ŠDC.Bƒ$0D ŠDC.Bƒ$0A2ŠDC.Bƒ'�S�in�the�range�from�0�to�FF�(always�hex).' ŠDC.Bƒ$0D ŠDC.Bƒ$0A9ŠDC.Bƒ'''W''‰To�write�the�previously�read�sector�change�'ŠDC.Bƒ'buffer.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A=ŠDC.Bƒ'''W�N''‡To�write�out�to�sector�N�a�change�buffer�that' ŠDC.Bƒ$0D ŠDC.Bƒ$0A3ŠDC.Bƒ'�has�not�previously�been�read�in.‚Cannot�be' ŠDC.Bƒ$0D ŠDC.Bƒ$0A'ŠDC.Bƒ'�used�with�noncontiguous�files.' ŠDC.Bƒ$0D ŠDC.Bƒ$0A@ŠDC.Bƒ'''OUT�NAME''‚To�redirect�listing�to�file�or�device�NAME.' ŠDC.Bƒ$0D ŠDC.Bƒ$0AŠDC.Bƒ'''QUIT''†To�quit.' ŠDC.Bƒ$0D ŠDC.Bƒ$0ASXERRE„EQU„*-1ŠDS…0’EVEN�BYTE�BOUNDARY* NOCHGS„EQU„*,ŠDC.Bƒ'Sector�change�buffer�not�read�in�yet' ŠDC.Bƒ$0D ŠDC.Bƒ$0ANOCHGE„EQU„*-1ŠDS…0* SCHGBS„EQU„*ŠDC.Bƒ'Sector�change�buffer:' ŠDC.Bƒ$0D ŠDC.Bƒ$0ASCHGBE„EQU„*-1ŠDS…0*BADBYTES‚DC.Wƒ$0D0AŠDC.Bƒ'End�of�sector�reached' ŠDC.Bƒ$0D ŠDC.Bƒ$0ABADBYTEE‚EQU„*-1ŠDS…0**"CHGAOUTS‚EQU„*’CHANGE�DISPLAY�LINE)ADRAOUTƒDS.Lƒ1’HOLDS�MODIFICATION�ADDRESS ŠDC.Bƒ'‚'VALAOUTƒDS.Wƒ1’HOLDS�VALUE ŠDC.Bƒ'‚' ŠDC.Bƒ'�' ŠDC.Bƒ''''QAOUT…DC.Bƒ1’HOLDS�ASCII�VALUE ŠDC.Bƒ'''' ŠDC.Bƒ'ƒ'CHGAOUTE‚EQU„*-1ŠDS…0* * HEADER LINE* MSGHDR„EQU„* ŠDC.Bƒ'„SN=$'#HEXSEC„DS.Bƒ8’FOR�HEX�SECTOR�NUMBER ŠDC.Bƒ'‚''DECSEC„DS.Bƒ8’FOR�DECIMAL�SECTOR�NUMBER Š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ŽNONZERO�FOR�NO�PRINTER�OUTPUT-BLKOUT„DC.Wƒ0’COUNT�OF�BLOCKS�PRINTED�ON�PAGE.BLKMAX„DC.Wƒ0’MAX�#�OF�BLOCKS�TO�PRINT�ON�PAGE'EJCT†DC.Wƒ$FFFFŽFLAG�FOR�EJECTED�OR�NOT** HEADING AREA*PRHDGS„EQU„*’PRINTER�HEADINGŠDC.Bƒ'DUMP�VERSION‚'VERSIONƒDS.Bƒ8’FOR�VERSION ŠDC.Bƒ'‚'&VDATE…DC.Bƒ'XX/XX/XX‚'‡DATE�OF�LISTING&VTIME…DC.Bƒ'XX:XX:XX‚'‡TIME�OF�LISTINGŠDC.Bƒ'DUMP�OF�'PRHDG2„DCB.B‚132-(*-PRHDGS),'�'-PRHDGELƒDC.Lƒ0’END�ADDRESS�OF�PRINTER�HEADING*;OVRMSGSƒDC.Bƒ'Output�file�exists�-�OK�to�overwrite(Y/N)�?‚'OVRMSGEƒEQU„*-1ŠDS…0*9INOUTS„DC.Bƒ'Error�-�Input�and�output�names�are�the�same' ŠDC.Bƒ$0D ŠDC.Bƒ$0AINOUTE„EQU„*-1ŠDS…0* * I/O BUFFER*5ŠDS.Bƒ16-((*-B)-((*-B)/16)*16)�FORCE�16-BYTE�BOUNDARY BUFL†EQU„256"BUFS†DS.BƒBUFL�PRIMARY�DUMP�BUFFERBUFE†EQU„BUFS+BUFL-1"RBUF†DS.Bƒ256�SECTOR�CHANGE�BUFFER&BUFBEG„DC.Lƒ0’POINTS�TO�WORKING�BUFFER.BUFDUMPƒDS.Lƒ1’HOLDS�BUFFER�ADDRESS�FOR�FORMAT* DATAENDƒEQU„*ŠPAGEŠOPT„MEX ŠOPT„NOCLH************************************************************************* DUMP CODE AREAH******  ******************************************************************** DUMP†EQU„**ŠLEA„STACK(PC),A7‹INITIALIZE�STACK�POINTERŠLEA„B(PC),A5‹BASE�REGISTER4ŠMOVEM.L�D0-D7/A0-A1,INITREG-B(A5)�INITIAL�REGISTERSŠMOVEM.L�(A5),D0-D1ˆVERSION7ŠMOVEM.L�D0-D1,VERSION-B(A5)�SET�UP�FOR�VERSION�MESSAGEŠLEA„BUFS-B(A5),A0ŠLEA„BUFE-B(A5),A1FŠMOVEM.L�A0/A1,INPIOS+IOSSAD-B(A5)�SET�UP�BUFFER�BOUNDARIES�IN�I/O�P.BŠLEA„BUFS-B(A5),A09ŠMOVE.L�A0,BUFBEG-B(A5)„POINT�TO�BUFBEG�TO�WORKING�BUFFER** INITIALIZE PARAMETER BLOCKSŠLEA„BUFS-B(A5),A0ŠMOVE.L�A0,FCHFHS+6-B(A5)ŠLEA„OPINPBUF-B(A5),A0ŠMOVE.L�A0,MSGIIOS+12-B(A5)ŠADD.L‚#OPINLGH-1,A0ŠMOVE.L�A0,MSGIIOS+16-B(A5)%**************************************.* GET DATE AND TIME SET UP FOR VERSION MESSAGE*%*************************************ŠMOVE.L�#GTDTIM,D0ŠLEA„TIMBLK(PC),A0ŠTRAPƒ#1ŠMOVE.L�TIMBLK,D0ŠBSR„DATEOJ�CONVERT�TO�JULIAN ŠBSR„DATEJG�CONVERT�TO�GREGORIAN*ŠMOVE.L�D0,TMPDATE-B(A5)ƒSAVE�ORDINAL�DATEŠAND.L‚#$FF,D0ŒMASK�TO�DAY ŠMOVE.L�#2,D1ŠLEA„VDATE+3(PC),A0,ŠBSR„BINDECFJ‹CONVERT�DAY�TO�ASCII�AND�STUFFŠMOVE.B�TMPDATE+2,D0‡GET�MONTHŠLEA„VDATE(PC),A0.ŠBSR„BINDECFJ‹CONVERT�MONTH�TO�ASCII�AND�STUFFŠMOVE.W�TMPDATE,D0‰YEARŠLEA„HOLDDATE(PC),A0+ŠBSR„BINDEC�CONVERT�YEAR�TO�ASCII�AND�STUFF&ŠMOVE.W�HOLDDATE+2-B(A5),VDATE+6-B(A5) * CONVERT TIME OF DAY INTO ASCII$ŠMOVE.L�TIMBLK+4,D1ˆMS�PAST�MIDNIGHTŠCLR.L‚D0‘HOUR�COUNTERTL1‡SUB.L‚#1000*60*60,D1&ŠBCS.S‚TL2�BRANCH�IF�HOURS�ALL�COUNTEDŠADD.L‚#1,D0ŽACCUMULATE�HOURS ŠBRA.S‚TL1/TL2‡ADD.L‚#1000*60*60,D1…TOTAL�#�HOURS�IS�IN�D0 ŠMOVE.L�D1,D3+ŠLEA„HOLDDATE(PC),A0ˆWHERE�TO�DEPOSIT�ASCII,ŠBSR„BINDEC�CONVERT�HOUR�TO�BINARY�AND�STUFF$ŠMOVE.W�HOLDDATE+2-B(A5),VTIME-B(A5)&ŠDIVUƒ#60*1000,D3ˆ#�OF�MINUTES�IN�D3.W ŠCLR.L‚D0%ŠMOVE.W�D3,D0ŽNUMBER�OF�MINUTES�IN�D0ŠLEA„HOLDDATE(PC),A0.ŠBSR„BINDEC�CONVERT�MINUTES�TO�BNARY�AND�STUFF&ŠMOVE.B�HOLDDATE+2-B(A5),VTIME+3-B(A5)&ŠMOVE.B�HOLDDATE+3-B(A5),VTIME+4-B(A5) ŠCLR.W‚D3ŠSWAPƒD3(ŠDIVUƒ#1000,D3‹NUMBER�OF�SECONDS�IN�D3.W ŠMOVE.W�D3,D0ŠLEA„HOLDDATE(PC),A0/ŠBSR„BINDEC�CONVERT�SECONDS�TO�BINARY�AND�STUFF&ŠMOVE.W�HOLDDATE+2-B(A5),VTIME+6-B(A5)ŠPAGE** DISPLAY VERSION MESSAGE*ŠLEA„PRHDGS-B(A5),A0ŠLEA„VERSION+7-B(A5),A1 ŠBSR„MSGOUT�DISPLAY�DUMP�VERSIONŠLEA„LF2-B(A5),A0ŠLEA„LF2+1-B(A5),A1 ŠBSR„MSGOUT** PARSE THE COMMAND LINE*,ŠLEA„CLINE(PC),A0‹INPUT�COMMAND�LINE�ADDRESS ŠBSR„PARSE'ŠLEA„B(PC),A5‹REESTABLISH�BASE�REGISTER ŠTST.L‚D0ŠBPL.S‚CMLOKŽBRANCH�ON�NO�ERROR/ŠMOVE.L�#EM_NVE,D0‰COMPLAIN�ON�BAD�COMMAND�LINE ŠBSR„ERRMSGŠBRA.S‚DUMPEREX CMLOK…EQU„*9ŠMOVEM.L�A1-A2,PARSAREG-B(A5)�SAVE�RETURN�REGS�FROM�PARSE*@* ON RETURN FROM PARSE, A1=ADDR OF OUTPUT FIELD OR 0, A2=ADDR OF*‚OPTIONS�FIELD�OR�0.*=* GET US SET UP SO THAT LU LISTLU (3) POINTS TO PROPER OUTPUT*)ŠMOVE.L�A1,D0ŽJUST�TO�SET�CONDITION�CODES7ŠBNE.S‚GETOUT�BRANCH�IF�WE�HAVE�OUTPUT�DEVICE�SPECIFIED/ŠBSR„SETLSTLU‹CHANGE�LDFLUN�TO�LISTLUN�AND�KEEPŠBRA.S‚DOINPUT GETOUT„EQU„*5ŠBSR.S‚CKINOUTŒCHECK�FOR�INPUT/OUTPUT�NAMES�DIFFERENTŠBNE.S‚DUMPEREX‹BRANCH�IF�ERROR,ŠBSR„NEWOUT�SET�UP�OPERATOR�SPECIFIED�OUTPUTŠBMI.S‚DUMPEREX‹BRANCH�IF�ERROR/ŠBHI.S‚DUMPEXIT‹BRANCH�ON�NO�OVERWRITE�SELECTED#ŠBSR„PRTSET�GO�HANDLE�PRINT�HEADING*<* GET US SET UP SO THAT LU INPUTLU(1) POINTS TO PROPER INPUT* DOINPUTƒEQU„* ŠBSR„NEWINŠBMI.S‚DUMPEREX‹BRANCH�ON�ERROR** 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ˆERROR�EXIT�FROM�THIS�POINTŠPAGE%*************************************G* SUBROUTINE TO SEE IF ANY INPUT FILE NAME MATCHES THE OUTPUT FILE NAME*9*ƒEXITS�WITH�ZERO�CONDITION�CODES�IS�NO�MATCH,�NONZERO�IFF*ƒINPUT�OR�OUTPUT�FIELD�CONTAINS�MORE�THAN�ONE�FILE�NAME�OR�IF�A�MATCH,*ƒBETWEEN�INPUT�FILE�AND�OUTPUT�FILE�EXISTS. CKINOUTƒEQU„*(ŠLEA„LISTFHS(PC),A6‰POINT�TO�PARAM�TABLE2ŠMOVE.W�#'LS',FHSEXT(A6)ƒDEFAULT�EXTENSI  ON�IS�'LS'-ŠBSR„DEFAULTS‹START�OF�OUTPUT�FIELD�CMND�LINE2ŠMOVE.L�OUTPSRT,A0‰START�OF�OUTPUT�FIELD�CMND�LINE*/* DO EDITFILE TO FILL REMAINING PARAMETER BLOCK ŠBSR„EDITFILE ŠTST.L‚D0 ŠBMI.S‚CMLER1ŠBTSTƒ#0,D0ŽIS�THERE�ANOTHER�FILE�ON�OUTPUT�PART?"ŠBNE.S‚CMLERŽBRANCH�IF�YES�-�ERROR2ŠMOVE.L�D0,EDITOUT-B(A5)ƒSAVE�RETURN�FROM�EDITFILEŠBTSTƒ#1,D0ŽDEVICE?ŠBNE.S‚NMCH�BRANCH�IF�YES*&ŠLEA„CLINE(PC),A0‹COMMAND�LINE�ADDRESSŠLEA„INPFHS(PC),A6 ŠBSR„DEFAULTS ŠBSR„EDITFILE'ŠLEA„B(PC),A5‹REESTABLISH�BASE�REGISTERŠMOVE.L�A0,EDITSVA0-B(A5)ŠMOVE.L�D0,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‚NMCH�BRANCH�IF�NO�MATCH ŠCMP.L‚A0,A1ŠBLS.S‚CMPINOUT*%* INPUT FILE = OUTPUT FILE - COMPLAIN8ŠLEA„INOUTS(PC),A0Š'ERROR�-�INPUT�AND�OUTPUT�NAMES�SAME'ŠLEA„INOUTE(PC),A1 ŠBSR„MSGOUT#ŠBSR„CHAINCHK‹EXIT�IF�IN�CHAIN�MODE)ŠMOVE.L�#1,D0ŽSET�UNEQUAL�CONDITION�CODESŠBRA.S‚CKINRTS*,NMCH†CLR.L‚D0‘ESTABLISH�GOOD�CONDITION�CODESBŠBTSTW‚#0,EDITRTN+2-B(A5)�IS�THERE�ANOTHER�FILE�ON�THE�INPUT�LINE?ŠBEQ.S‚CKINRTS'CMLER…MOVE.L�#EM_NVE,D0‰NON�VALID�ENTRY0ŠBSR„ERRMSG�GO�PUT�OUT�ERROR�MESSAGE�VIA�HANDLER#ŠBSR„CHAINCHK‹EXIT�IF�IN�CHAIN�MODE'ŠMOVE.L�#1,D0ŽSET�ERROR�CONDITION�CODES#ŠBSR„CHAINCHK‹EXIT�IF�IN�CHAIN�MODE CKINRTSƒRTSŠPAGE%*************************************B* SUBROUTINE TO SET UP LISTLUN (NORMALLY 3) TO DEVICE SPECIFIED ON*ƒOUTPUT�PARAMETER.*D*ƒEXITS�WITH�ZERO�CONDITION�CODES�IF�LU�TRANSFER�IS�SUCCESSFUL,�PLUSE*ƒCONDITION�CODES�IF�FILE�EXISTS�AND�OVERWRITE�IS�NOT�SELECTED,�MINUS *ƒCONDITION�CODES�FOR�FHS�ERROR.* NEWOUT„EQU„*-ŠMOVE.W�#-1,PRINTER-B(A5)‚FLAG�AS�NOT�PRINTER6ŠMOVE.L�EDITOUT,D0‰SAVED�FROM�EDITFILE�OF�OUTPUT�FIELDŠBTSTƒ#1,D0ŽIS�OUTPUT�A�DEVICE?ŠBNE.S‚YESDEV�BRANCH�IF�YES* TRY TO ASSIGN OUTPUT FILE;NEW05…MOVE.W�#FHASGN,LISTFHS+FHSCMD-B(A5)�SET�UP�FOR�ASSIGN3ŠMOVE.W�#FOPEW,LISTFHS+FHSOPT-B(A5)�EXCLUSIVE�WRITEŠLEA„LISTFHS(PC),A0ŠTRAPƒ#3%ŠBEQ.S‚OVRWRITE‹BRANCH�IF�GOOD�ASSIGN=* ASSIGN FAILED - SEE IF NONEXISTENT FLE AND IF NOT, COMPLAINŠCMP.B‚#FSTANNM,D0$ŠBEQ.S‚ASGALLOŒBRANCH�IF�NONEXISTENT%ŠCMP.B‚#FSTAAS,D0‰INVALID�ASSIGNMENT?'ŠBNE„ASGERRMŒBRANCH�IF�NO�-�GO�COMPLAIN!ŠBSR„OUTFREEŒFREE�THE�OUTPUT�FILEŠBNE„NEWERR�BRANCH�IF�ERROR'ŠBRA„NEW05ŽGO�BACK�FOR�ASSIGNMENT�AGAIN** ASK IF THEY WISH TO OVERWRITE7OVRWRITE‚LEA„OVRMSGS(PC),A0‰'DO�YOU�WISH�TO�OVERWRITE?'ŠLEA„OVRMSGE(PC),A1 ŠBSR„MSGOUT ŠBSR„POUTIN2"ŠBNE„NEWERR�BRANCH�ON�PROMPT�ERRORŠMOVE.B�OPINPBUF,D0ˆANSWERŠCMP.B‚#'Y',D0'ŠBNE„NEWAGN�BRANCH�IF�ANSWER�IS�NOT�YES*B*�THEY�WISH�TO�OVERWRITE�A�FILE�THAT�ALREADY�EXISTS.‚FREE�THE�FILE1*ƒAND�DELETE�IT,�THEN�REALLOCATE�IT�AND�ASSIGN�ITŠBSR.S‚OUTFREE ŠBEQ.S‚DELETE�BRANCH�IF�NO�ERROR ŠBRA.S‚NEWERR*9DELETE„MOVE.W�#FHDELT,LISTFHS+FHSCMD-B(A5)�DELETE�COMMANDŠTRAPƒ#3"ŠBEQ.S‚ASGALLOŒBRANCH�IF�DELETE�OK-ŠBSR„ERRMSG�PUT�OUT�ERROR�MESSAGE�VIA�HANDLER ŠBRA.S‚NEWERR** ALLOCATE AND ASSIGN FILE2ASGALLOƒMOVE.W�#FHASGN+FHALLO,LISTFHS+FHSCMD-B(A5).ŠCLR.L‚LISTFHS+FHSWCD-B(A5)�CLEAR�KEYS�AND�LRL3ŠCLR.L‚LISTFHS+FHSSIZ-B(A5)�VARIABLE�LENGTH�RECORDS?ŠMOVE.W�#FOPSEQ+FOPEW,LISTFHS+FHSOPT-B(A5)�SEQ,�EXCLUSIVE�WRITE ŠBRA.S‚ASGIT*7* NOW DO THE EDITFILE TO FILL REMAINING PARAMETER BLOCK*=YESDEV„AND.W‚#(1<<14+1<<1),D0ƒSEE�IF�JUST�'#'�IF�OUTPUT�FIELDŠCMP.W‚#(1<<14+1<<1),D0!ŠBEQ.S‚YESDEV2ŒBRANCH�IF�JUST�'#'2ŠMOVE.W�#FHASGN,LISTFHS+FHSCMD-B(A5)�SET�UP�ASSIGN7ŠMOVE.W�#FOPPW,LISTFHS+FHSOPT-B(A5)�SET�UP�PUBLIC�WRITEŠBRA.S‚ASGITŽGO�ASSIGN�IT)YESDEV2ƒBSR„SETLSTLU‹GO�CHANGE�LISTING�LU ŠBRA.S‚ASGOK1** ASSIGN TO LISTLU*ASGIT…LEA„LISTFHS(PC),A0ŠTRAPƒ#3'ŠBEQ.S‚ASGOK1�BRANCH�IF�NO�ASSIGN�ERROR%ŠCMP.B‚#FSTAAS,D0‰INVALID�ASSIGNMENT?ŠBNE.S‚ASGERRMŒBRANCH�IF�NOŠBSR.S‚OUTFREEŒFREE�OUTPUT�FILEŠBNE.S‚NEWERR�BRANCH�IF�ERROR$ŠBRA.S‚ASGITŽGO�FOR�ASSIGNMENT�AGAIN*&* FREE (CLOSE) THE FORMER OUTPUT FILE) OUTFREEƒEQU„*0ŠMOVE.W�LISTFHS+FHSCMD-B(A5),-(A7)�SAVE�  FUNCTION2ŠMOVE.W�#FHCLOS,LISTFHS+FHSCMD-B(A5)�CLOSE�COMMANDŠLEA„LISTFHS-B(A5),A0ŠTRAPƒ#33ŠMOVE.W�(A7)+,LISTFHS+FHSCMD-B(A5)�RESTORE�FUNCTIONŠTST.B‚D0‘TEST�RETURN�STATUSŠRTS*ASGERRMƒBSR„ERRMSGŠBRA.S‚NEWERR�GET�OUT�NOW ASGOK1„EQU„**ŠCLR.L‚D0‘SET�EQUAL�(GOOD)�CONDITION�CODES NEWRTS„RTS5NEWAGN„MOVE.L�#1,D0ŽSET�PLUS�(REPEAT�CONDITION�CODES) ŠBRA.S‚NEWRTS.NEWERR„MOVE.L�#-1,D0�SET�ERROR�CONTITION�CODES ŠBRA.S‚NEWRTSŠPAGE%*************************************:* SUBROUTINE TO ASSIGN INPUT DEVICE TO INPLUN (NORMALLY 1)9*ƒRETURNS�WITH�ZERO�CONDITION�CODES�IF�SUCCESSFULL,�MINUS=*ƒCODES�OTHERWISE.‚IN�CASE�OF�ERROR,�ERROR�MESSAGE�HANDLER�IS*ƒCALLED�BEFORE�RETURNING.* NEWIN…EQU„*"ŠLEA„INPFHS(PC),A6ŠINPUT�FHS�BLOCK ŠBSR„DEFAULTS)ŠLEA„CLINE(PC),A0‹POINT�TO�INPUT�FILENAME ŠBSR„EDITFILEŠMOVE.L�D0,EDITRTN-B(A5) ŠBPL.S‚NEWIN2�BRANCH�IF�NO�ERROR"ŠMOVE.L�#EM_NVE,D0‰NON�VALID�ENTRY0ŠBSR„ERRMSG�GO�PUT�OUT�ERROR�MESSAGE�VIA�HANDLERŠBRA„NEWERR�TAKE�ERROR�EXIT*(* NOW BUILD HEADING LINE BASE UPON INPUT8NEWIN2„LEA„PRHDG2-B(A5),A0„WHERE�TO�PUT�CONVERTED�STRING8ŠLEA„INPFHS+FHSVOL-B(A5),A6�WHERE�TO�PICK�UP�INFORMATIONŠBTSTƒ#1,D0ŽIS�THIS�A�DEVICE?ŠBEQ.S‚NEWIN3�BRANCH�IF�NO#ŠMOVE.B�#'#',(A0)+‰MOVE�DEVICE�NAMEŠMOVE.B�(A6)+,(A0)+ŠMOVE.B�(A6)+,(A0)+ŠMOVE.B�(A6)+,(A0)+ŠMOVE.B�(A6)+,(A0)+%ŠBRA.S‚NEWIN4.5‹DONE�WITH�NAME�MOVING*NEWIN3„MOVE.L�#4,D0ŠBSR.S‚MOVB�MOVE�VOLUME�NAMEŠMOVE.W�(A6)+,D0‹USER�NUMBER1ŠMOVE.L�#1,D1ŽSET�UP�CORRECT�FIELD�LENGTH�FOR�...(ŠCMP.W‚#10,D0�...�USER�NUMBER�1,2,3�OR�4 Š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)+‰SEPARATOR�FROM�VOLUME�NAME+ŠBSR„BINDECFJ‹CONVERT�AND�STORE�USER�NUMBER ŠADD.L‚D1,A0ŠMOVE.B�#'.',(A0)+ ŠMOVE.L�#8,D0ŠBSR.S‚MOVB�MOVE�CATALOG�NAMEŠMOVE.B�#'.',(A0)+ ŠMOVE.L�#8,D0ŠBSR.S‚MOVB�MOVE�FILE�NAMEŠMOVE.B�#'.',(A0)+ ŠMOVE.L�#2,D0ŠBSR.S‚MOVB�MOVE�EXTENSION�NAMENEWIN4.5‚EQU„*0ŠMOVE.B�#$0D,(A0)ŠTERMINATE�WITH�CARRIAGE�RETURN4ŠMOVE.L�A0,PRHDGEL-B(A5)ƒSAVE�END�OF�HEADING�ADDRESSŠBRA.S‚NEWIN9.5*6MOVB†CMP.B‚#'�',(A6)ŠMOVE�EVERYTHING�EXCEPT�BLANKS�...-ŠBEQ.S‚MOVADVA6‹...�FROM�(A6)�TO�(A0)�FOR�...$ŠMOVE.B�(A6),(A0)+‰...�A�COUNT�OF�D0MOVADVA6‚ADD.L‚#1,A6 ŠSUB.L‚#1,D0 ŠBNE.S‚MOVBŠRTS** NOW ASSIGN THE INPUT DEVICE*2NEWIN9.5‚LEA„INPFHS(PC),A0ŠPARAMETER�BLOCK�ADDRESSŠTRAPƒ#37ŠBNE.S‚CKDEVICE‹BRANCH�ON�BAD�ASSIGN�-�CHECK�FOR�DEVICE+ŠMOVE.L�EDITRTN,D1‰SEE�IF�DEVICE�ASSIGNMENT'ŠAND.B‚#$2,D1�WAS�IT�DEVICE�ASSIGNMENT?ŠBNE.S‚DEVICE�BRANCH�IF�YES"ŠBRA„ASGOKŽBRANCH�ON�OK�ASSIGNMENT*C* ASSIGNMENT WAS IN ERROR, IF THIS WAS A DEVICE ASSIGNMENT, WE MUST;*ƒTRY�TO�CONVERT�THE�ASSIGNMENT�TO�A�VOLUME�TYPE�ASSIGNMENT*.CKDEVICE‚MOVE.L�EDITRTN,D1‰FLAGS�FROM�EDITFILE)ŠAND.B‚#$2,D1�WAS�IT�A�DEVICE�ASSIGNMENT?+ŠBNE.S‚NEWIN9.8‹BRANCH�IF�DEVICE�ASSIGNMENTŠBSR„ERRMSG�COMPLAINŠBRA„DUMPEREX‹ERROR�EXIT*<* CONVERT DEVICE ASSIGNMENT TO VOLUME ASSIGNMENT IF POSSIBLE7*ƒFIRST�GET�THE�VOLUME�NAME�ASSOCIATED�WITH�THE�DEVICE.*1NEWIN9.8‚LEA„FCHFHS(PC),A0ŠFETCH�DEVICE�MNEMONICS(ŠTRAPƒ#3‘GO�GET�LIST�OF�DEVICE�VS�VOLUMEŠBNE„NEWERR�BRANCH�ON�ERROR*,ŠMOVE.L�INPFHS+FHSVOL,D0ƒPICK�UP�DEVICE�NAME'ŠMOVE.W�FHSLEN(A0),D1†NUMBER�OF�ENTRIES+ŠLEA„BUFS(PC),A0ŒBEGINNING�OF�RETURN�BUFFER2CHKDEV„CMP.L‚FDVDEV(A0),D0†SEE�IF�THIS�ONE�MATCHESŠBEQ.S‚FOUNDVOL-ŠADD.L‚#FDVLEN,A0‰NO,�SEE�IF�ANY�MORE�ENTRIES ŠSUB.W‚#1,D1*ŠBNE.S‚CHKDEV�BRANCH�IF�MORE�LIST�TO�CHECK2ŠLEA„DEVES(PC),A0‹COMPLAIN�OF�BAD�DEVICE�SPECIFIEDŠLEA„DEVEE(PC),A1 ŠBSR„MSGOUT&ŠBSR„CHAINCHK‹EXIT�IF�CHAIN�PROCESSINGŠBRA„NEWERR�GET�OUT�NOW*6FOUNDVOL‚CMP.L‚#0,FDVVOL(A0)†ANY�VOLUME�THERE�?…101684(ŠBNE.S‚FOUNDVL1‹YES,�USE�VOL�NAME†101684CŠAND.W�#$FFFF-FOPABF,INPFHS+FHSOPT-B(A5)�NO�CLEAR�SHARED�BIT�101684ŠBRA.S‚DEVONLY5FOUNDVL1‚MOVE.L�FDVVOL(A0),INPFHS+FHSVOL-B(A5)Œ1016847DEVONLYƒLEA„INPFHS(PC),A0ŠGO�TRY�ASSIGNMENT�AGAIN101684ŠTRAPƒ#3!ŠBNE„ASGERRMŒGO�COMPLAIN�IF�ERROR*  *‚DEVICE�BETTER�SUPPORT�RANDOM*DEVICE„LEA„INPFHS(PC),A0+ŠMOVE.W�(A0),-(A7)‰SAVE�OLD�COMMAND/OPTIONS5ŠMOVE.W�#FHRATT,(A0)‡FETCH�ATTRIBUTES�COMMAND/OPTIONSŠTRAPƒ#3!ŠBEQ.S‚DEVICE2ŒBRANCH�IF�NO�ERROR ŠBSR„ERRMSG ŠBRA„NEWERR5DEVICE2ƒMOVE.W�(A7)+,(A0)‰RESTORE�OLD�COMMAND/OPTIONS,ŠBTSTW‚#3,FHSWCD(A0)†DOES�IT�SUPPORT�RANDOM?7ŠBNE.S‚CONTGŽBRANCH�IF�YES�-�DEV�ASGN�ALWAYS�CONTIGUOUS4ŠMOVE.L�#EM_NVE,D0‰NO�-�SO�COMPLAIN�OF�INVALID�ENTRY ŠBSR„ERRMSGŠBRA„NEWERR�ERROR�EXIT* ASGOK…EQU„*,ŠMOVE.B�INPFHS+FHSFIL,D0ƒTEST�FOR�CONTIGUOUS2ŠCMP.B‚#'�',D0ŒIF�1ST�CHAR�OF�FILE�='�'�THEN�CONTG!ŠBEQ.S‚CONTGŽBRANCH�IF�CONTIGUOUS ŠMOVE.W�INPFHS+FHSOPT,D0ƒOPTIONS-ŠAND.W‚#FFTBIT,D0‰CHECK�FOR�CONTIGUOUS�OR�NOTŠCMP.W‚#FOPCON,D0!ŠBEQ.S‚CONTGŽBRANCH�IF�CONTIGUOUS-ŠMOVE.B�#1,NONCONTG-B(A5)‚FLAG�NON�CONTIGUOUS*:ŠMOVE.L�INPFHS+FHSSAD,INPIOS+IOSSAD-B(A5)�SHARED�SEG�START<ŠMOVE.L�INPFHS+FHSEAD,INPIOS+IOSEAD-B(A5)�BUFFER�END�ADDRESS*D* COMPUTE NUMBER OF BLOCKS (256 BYTE) IN THE SEGMENT - SAVE IN BKCNT5ŠMOVE.L�INPFHS+FHSEAD,D0ƒADDR�OF�LAST�BYTE�OF�SEGMENT#ŠADD.L‚#1,D0ŽROUND�TO�PAGE�BOUNDARY<ŠSUB.L‚INPFHS+FHSSAD,D0ƒSUBTRACT�STARTING�ADDRESS�OF�SEGMENT.ŠLSR.L‚#8,D0ŽCONVERT�BYTE�COUNT�TO�BLOCK�COUNT0ŠMOVE.W�D0,BKCNT-B(A5)…SAVE�FOR�FUTURE�REFERENCE* CONTG…EQU„**)ŠCLR.L‚D0‘MAKE�SUCCESSFUL�CONDITION�CODESŠRTS%*************************************F* SUBROUTINE TO PUT DEFAULT VALUES INTO FHS PARAMETER BLOCK POINTED TO*ƒBY�A6.*DEFAULTS‚EQU„*-ŠMOVE.W�USERNUM+2,FHSUSN(A6)�DEFAULT�USER�NUM%ŠMOVE.L�VOLNAM,FHSVOL(A6)‚VOLUME�NAME&ŠMOVE.L�CATNAM,FHSCLG(A6)‚CATALOG�NAME2ŠMOVE.L�CATNAM+4,FHSCLG+4(A6)�2ND�PART�OF�CAT�NAMEŠRTS%*************************************A* SUBROUTINE TO CHANGE LOGICAL UNIT NUMBER FROM LDFLUN TO LISTLUN *ƒWITH�KEEP.*SETLSTLU‚EQU„*ŠBSR„OUTFREEŒFREE�LU�#3ŠLEA„LDFLSTLU(PC),A0ŠTRAPƒ#3 ŠBEQ.S‚SETRTS&ŠBSR„ERRMSG�COMPLAIN�AND�EXIT�IF�ERROR ŠBRA„DUMPEREXSETRTS„RTS„BACK�TO�CALLER** PROCESS OPTIONS FIELD* PROCOPTƒEQU„*(ŠMOVE.L�OPTSRT,A2ŠSTART�OF�OPTIONS�FIELD$ŠMOVE.L�A2,D0ŽTO�SET�CONDITION�CODES"ŠBEQ.S‚OPTOVR�BRANCH�IF�NO�OPTIONS NXTOPT„EQU„* ŠBSR„OPTION1ŠCMP.B‚#$40,D0ŒHAVE�WE�FINISHED�WITH�THE�OPTIONS?'ŠBEQ.S‚OPTOVR�BRANCH�IF�NO�MORE�OPTIONSŠBTSTƒ#7,D0ŽOPTION�ERROR?ŠBEQ.S‚NXT0�BRANCH�IF�NO*ŠMOVE.L�#EM_NVO,D0‰COMPLAIN�OF�BAD�OPTIONS!ŠBSR„ERRMSG�PUT�OUT�ERROR�MESSAGEŠBRA„DUMPEREX‹ERROR�EXIT,NXT0†CMP.B‚#'I',D1ŒIS�INTERACTIVE�SPECIFIED?(ŠBNE.S‚NXT1�BRANCH�IF�NOT�ON�THIS�OPTION2ŠMOVE.L�D1,INTRACT-B(A5)ƒFLAG�FOR�INTERACTIVE�MODE%ŠBGE.S‚NXTOPT�BRANCH�IF�NO�MINUS�SIGN6ŠCLR.L‚INTRACT-B(A5)†-I�WAS�SPECIFIED�-SAME�AS�DEFAULT ŠBRA„NXTOPT NXT1†EQU„**ŠCMP.B‚#'S',D1ŒWAS�START�SECTOR�SPECIFIED?(ŠBNE.S‚NXT2�BRANCH�IF�NOT�ON�THIS�OPTION2ŠMOVE.L�D3,SRTSEC-B(A5)„INITIALIZE�STARTING�SECTOR6ŠMOVE.L�D1,STOPT-B(A5)…FLAG�START�OPTIONS�AS�SPECIFIED ŠBRA„NXTOPT NXT2†EQU„*.ŠCMP.B‚#'T',D1ŒWAS�TERMINATE�SECTOR�SPECIFIED?*ŠBNE.S‚BADOPT�BRANCH�IF�NOT�ON�THIS�OPTION0ŠMOVE.L�D3,ENDSEC-B(A5)„INITIALIZE�ENDING�SECTOR3ŠMOVE.L�D1,STOPT-B(A5)…FLAG�END�OPTION�AS�SPECIFIEDŠBRA„NXTOPT�GO�FOR�NEXT�OPTION BADOPT„EQU„*ŠMOVE.L�#EM_NVO,D0 ŠBSR„ERRMSG�DISPLAY�'BAD�OPTION'ŠBRA„DUMPEREX‹ERROR�EXIT5OPTOVR„TST.L‚INTRACT-B(A5)†WAS�INTERACTIVE�SPECIFIED?ŠBEQ.S‚OPTRTS�BRANCH�IF�NO3ŠTST.L‚STOPT-B(A5)ˆYES�-�WAS�S�OR�T�ALSO�SPECIFIED?ŠBEQ.S‚OPTRTS�BRANCH�IF�NO:ŠLEA„IOPTMSGS(PC),A0ˆYES�-�TELL�THEM�ONLY�'I'�WAS�ACCEPTEDŠLEA„IOPTMSGE(PC),A1ŠBSR„MSGOUT�PUT�OUT�MESSAGE,ŠMOVE.L�#-1,SRTSEC-B(A5)ƒUNINITIALIZE�SRTSEC1ŠMOVE.L�#$7FFFFFFF,ENDSEC-B(A5)�UNITIALIZE�ENDSECŠCLR.L‚STOPT-B(A5) OPTRTS„RTS%*************************************=* SUBROUTINE TO FETCH DEVICE ATTRIBUTES AND SET UP PARAMETERS;*ƒFOR�PRETTY�PRINT�IF�OUTPUT�DEVICE�SPECIFIED�WAS�A�PRINTER* PRTSET„EQU„*9ŠMOVE.W�#FHRATT,LISTFHS-B(A5)�MAKE�CODE�AND�OPTIONS�RIGHT&ŠLEA„LISTFHS(PC),A0‰RECEIVE�ATTRIBUTESŠTRAPƒ#3%ŠBEQ.S‚PRTSETOK‹BRANCH�ON�GOOD�RETURN-ŠBSR„ERRMSG�DISPLAY�ERRO  R�MESSAGE�VIA�HANDLER ŠBRA„DUMPEREX*1PRTSETOK‚MOVE.W�LISTFHS+FHSWCD,D0‚ATTRIBUTES�WORDŠBTSTƒ#9,D0ŽWAS�IT�A�PRINTER?"ŠBEQ.S‚PRTSETXŒEXIT�IF�NOT�PRINTER$ŠCLR.W‚PRINTER-B(A5)†FLAG�AS�PRINTER-ŠMOVE.L�LISTFHS+FHSSIZ,D0‚LINE�COUNT�PER�PAGE(ŠSUB.L‚#2,D0ŽACCOUNT�FOR�PRINTER�HEADINGŠDIVUƒ#19,D0�BLOCK�SIZEŠSUB.W‚#1,D0ŽMAKE�ZERO�RELATIVE7ŠMOVE.W�D0,BLKMAX-B(A5)„NUMBER�OF�PRINT�BLOCKS�PER�PAGE.ŠMOVE.W�D0,BLKOUT-B(A5)„FORCE�LATER�PAGE�EJECT(ŠLEA„PRHDGS(PC),A0†HEADING�START�ADDRESS,ŠMOVE.L�PRHDGEL-B(A5),D0ƒHEADING�END�ADDRESS(ŠSUB.L‚A0,D0ŽD0�=�OUR�HEADING�LENGTH�-�15ŠSUB.L‚LISTFHS+FHSLRL(PC),D0�IS�MAX�LGTH�>�OUR�LGTH�?!ŠBLT.S‚PRTSETXŒBRANCH�IF�YES�-�OK ŠADD.L‚#1,D07ŠSUB.L‚D0,PRHDGEL-B(A5)ƒCORRECT�OUR�HEADING�END�ADDRESS PRTSETXƒRTSŠPAGE***-* DRIVER FOR INTERACTIVE DIALOGUE AND DUMPING* DOIT†EQU„*+ŠMOVE.L�SRTSEC,D1ŠINITIALIZE�REG�PARAMETERS(ŠMOVE.L�ENDSEC,D2ŠWITH�SECTOR�BOUNDARIESDOITLOOP‚EQU„*4ŠTST.L‚INTRACT-B(A5)†WAS�INTERACTIVE�MODE�SPECIFIED?ŠBNE.S‚CKSTOPTŒBRANCH�IF�YES.ŠTST.L‚DUMPED-B(A5)‡HAVE�WE�DUMPED�ONCE�BEFOREŠBNE„OKEX�BRANCH�IF�SO3ŠMOVE.L�#1,DUMPED-B(A5)„MARK�AS�NOT�FIRST�TIME�THRU4ŠCMP.L‚#-1,SRTSEC-B(A5)ƒHAS�SRTSEC�BEEN�INITIALIZED?ŠBNE„FILLIT�BRANCH�IF�YES&ŠCLR.L‚SRTSEC-B(A5)‡NO�-�SO�INITIALIZE ŠCLR.L‚D1ŠBRA„FILLIT�GO�FILL�BUFFER CKSTOPTƒEQU„*0ŠTST.L‚STOPT-B(A5)ˆWERE�SECTOR�LIMITS�SPECIFIED?3ŠBEQ.S‚PROMPT�BRANCH�IF�DEALT�WITH�OR�NOT�SPECIFIED+ŠCLR.L‚STOPT-B(A5)ˆCLEAR�FOR�NEXT�TIME�THRUŠBRA„FILLIT�GO�FILL�BUFFER:*********************************************************** BREAK SERVICE COMES HERE* BREAKSVƒEQU„*ŠLEA„B(PC),A5‹REBASE�A5-ŠMOVE.L�SAVSTACK-B(A5),A7‚RESET�STACK�POINTER%ŠTST.L‚INTRACT-B(A5)†INTERACTVE�MODE?'ŠBEQ„DUMPEREX‹BRANCH�IF�NO�-�ERROR�EXITŠLEA„ASQBUFF-B(A5),A0!ŠMOVE.L�#RDEVNT,D0‰READ�THE�EVENTŠTRAPƒ#1ŠLEA„LF2-B(A5),A0 ŠMOVE.L�A0,A1 ŠADD.L‚#1,A1 ŠBSR„MSGOUTŠBRA.S‚PROMPTA*:********************************************************** PROMPT„EQU„*/ŠTST.B‚ASQDUN-B(A5)‡HAVE�WE�ALLOACATED�THE�ASQ?ŠBEQ.S‚PROMPTAŒYES�-�SO�BRANCH*6* ALLOCATE ASQ AND CLAIM BREAK SERVICE FIRST TIME THRU,ŠBTSTƒ#0,SAVD7+3-B(A5)ƒIS�INPUT�INTERACTIVE?8ŠBEQ.S‚PROMPTAŒBRANCH�IF�YES�-�NO�BREAK�SERVICE�REQUIRED<ŠMOVE.L�INITA0-B(A5),ASQ1-B(A5)�INITIALIZE�TASK�NAME�IN�P.B.)ŠCLR.B‚ASQDUN-B(A5)‡MARK�ASQ�AS�ALLOCATEDŠLEA„ASQ1-B(A5),A0ŠLEA„ASQBUFF-B(A5),A1"ŠMOVE.L�A1,18(A0)ŠPLUG�IN�ASQ�ADDRŠMOVE.L�#GTASQ,D0ŠTRAPƒ#1'ŠBEQ.S‚ASQOKŽBRANCH�IF�ASK�ALLOCATED�OK ŠBSR„ERRMSGŠBRA„DUMPEREX‹ERROR�EXITASQOK…LEA„MSGIIOS-B(A5),A08ŠMOVE.L�#(IOBRKS<<16)+IOPCAD,(A0)�BREAK�SVC,�SVC�ADDRESSŠLEA„BREAKSV(PC),A1‰ASR�ADDRESSŠMOVE.L�A1,24(A0)ŠTRAPƒ#2‘CLAIM�BREAK�SERVICE#ŠBEQ.S‚BREAKOKŒBRANCH�IF�GOOD�CLAIM.ŠBSR„ERRMSG�COMPLAIN�VIA�ERROR�MESSAGE�HANDLER ŠBRA„DUMPEREX BREAKOKƒEQU„*5ŠMOVE.W�#IOREAD,MSGIIOS-B(A5)�RESTORE�FORMER�FUNCTION,ŠMOVE.L�A7,SAVSTACK-B(A5)‚SAVE�STACK�POINTER*/PROMPTAƒBSR„POUTIN�OUTPUT�PROMPT-WAIT�FOR�INPUT(ŠBSR„DECODE�DECODE�INPUT�OF�FORM�$10,$13ŠBRA.S‚INPOKŽOK�RETURNŠBRA.S‚OKEX�TERMINATION�RETURN'ŠBRA„PROMPT�GIVE�ANOTHER�CHNCE�TO�INPUT*OKEX.ŠBRA.S‚DOITEXGD‹EXIT�WITH�GOOD�COMPLETION�CODE0INPOK…MOVE.W�BLKMAX,BLKOUT-B(A5)�FORCE�FORM�FEED*C* D1 CONTAINS BEGINNING SECTOR ADDRESS, D2 CONATINS ENDING SEC ADDR* FILLIT„EQU„*0ŠBSR„FILLBUFŒFILL�THE�I/O�BUFFER�WITH�ONE�SECTORŠCMP.B‚#ISTACRC,D0ˆCRC�ERROR?ŠBNE.S‚FILLIT23ŠBSR„ERRMSG�COMPLAIN�OF�CRC�ERROR�BUT�TREAT�AS�GOODŠBRA.S‚FILLIT4FILLIT2ƒTST.B‚D0*ŠBNE.S‚FILLCHKŒGO�HANDLE�IF�BAD�I/O�STATUS;FILLIT4ƒTST.B‚NONCONTG-B(A5)…WAS�THIS�A�NONCONTIGUOUS�FILE?ŠBNE.S‚FILLRRNŒBRANCH�IF�YESŠBRA.S‚FILLOK�NO�SO�WE'RE�OK* FILLCHKƒEQU„*&ŠCMP.B‚#ISTAEOF,D0ˆWAS�IT�END�OF�FILE?ŠBNE.S‚NOTEOF�BRANCH�IF�NO-ŠBSR„ERRMSG�DISPLAY�'END�OF�FILE'�VIA�HANDLER ŠBRA„DOITLOOP NOTEOF„EQU„*(ŠCMP.B‚#ISTARR,D0‰WAS�IT�AN�INVALID�RRN?/ŠBNE.S‚FILLERRŒBRANCH‚IF�NOT�-�CANT�HELP�US�NOW*/*�DEAL�WITH�INVALID�RANDOM‚RECORD�NUMBER�ERROR.;*ƒIF�WE�ARE�DE  ALING�WITH�A�NONCONTIGUOUS�FILE,�THEN�CORRECT%*ƒBUFBEG�TO�POINT�TO�THE�CORRECT�RRN.*0ŠTST.B‚NONCONTG-B(A5)…IS�THIS�A�CONTIGUOUS�FILE?.ŠBEQ.S‚FILLERRŒBRANCH�IF�SO�-�A�REAL�RRN�ERROR* FILLRRNƒEQU„*ŠMOVE.L�D1,D3ŽRRN�TO�DUMPŠDIVUƒBKCNT(PC),D3 ŠCLR.W‚D3ŠSWAPƒD3‘D3.L�=�RRN�MOD�BKCNT%ŠLSL.L‚#8,D3Ž*256�FOR�BYTE�SKIP�COUNT+ŠADD.L‚INPFHS+FHSSAD,D3ƒADD�SHARED�SEG�BASE<ŠMOVE.L�D3,BUFBEG-B(A5)„THE�REAL�BEGINNING�OF�WORKING�BUFFERŠBRA.S‚FILLOK�PROCEED�NORMALLY*FILLERRƒEQU„*’A�REAL�ERRORŠBSR„ERRMSG�GO�TELL�OF�BAD�I/OŠBRA„DOITLOOP‹GET�OUT�OF�HERE* FILLOK„EQU„*5ŠMOVE.L�BUFBEG,BUFDUMP-B(A5)�ADDRESS�OF�BUFFER�TO�USE-ŠBSR„FORMAT�GO�PUT�FORMATTED�OUTPUT�ON�SCREEN(ŠBNE.S‚DOITEXBD‹GET�OUT�OF�HERE�ON�ERROR FORMOK„EQU„*!ŠADD.L‚#1,D1ŽBUMP�FOR�NEXT�SECTORŠCMP.L‚D2,D1ŽARE�WE�DONEŠBLS„FILLIT�GO�FOR�MORE�IF�NOT ŠBRA„DOITLOOP‹GO�ASK�FOR�ANOTHERDOITEXBD ŠMOVE.L�D0,-(A7)‹SAVE�ERROR�CODE$ŠBSR.S‚PAPEJCTŒEJECT�PAPER�IF�NEEDED'ŠMOVE.L�(A7)+,D0‹RESTORE�CONDITION�CODEŠRTS—EXIT�WITH�ERRORDOITEXGD‚EQU„*$ŠBSR.S‚PAPEJCTŒEJECT�PAPER�IF�NEEDEDŠCLR.L‚D0‘GOOD�EXITŠRTSPAPEJCT$ŠTST.W‚EJCT-B(A5)‰DO�WE�EJECT�PAPER?ŠBNE.S‚DEXITŽBRANCH�IF�NOTŠLEA„FFS(PC),A0�EJECT�THE�PAPERŠLEA„FFE(PC),A1 ŠBSR„IMGOUT DEXIT…EQU„*ŠRTS%*************************************;* SUBROUTINE TO DECODE OPERATOR INPUT OF THE FORM 'D 12,15'3*ƒOR�R�15,�OR�W,�OR�M�33�66FF99.‚IN�CASE�OF�DISPLAY@*ƒSTARTING�SECTOR�#�PLACED�INTO�SRTSEC�AND�D1,�END�SECTOR�#�INTO=*ƒD2.‚STATUS�RETURNED�IN�D0�WILL�BE�0�FOR�GOOD�STATUS,�-1�FOR:*ƒTERMINATION�(INPUT�OF�'Q').‚IN�CASE�OF�R,�W,�M�OR�'HELP''*ƒTHE�RETURN�IS�ALWAYS�TO�LABEL�PROMPT.* DECODE„EQU„*5ŠCLR.L‚CHRPTR-B(A5)‡SET�US�TO�BEGINNING�OF�INPUT�LINEŠLEA„OPINPBUF(PC),A0ŠLEA„OPINPBUF+OPINLGH(PC),A1(ŠCMP.B‚#$0D,(A0)ŠJUST�A�CARRIAGE�RETURN?+ŠBNE.S‚CHKUPA�NO�-�SO�GO�CHECK�FOR�UP�ARROW+ŠADD.L‚#1,SRTSEC-B(A5)„BUMP�STARTING�SECTOR4GODUMP„MOVE.L�SRTSEC,ENDSEC-B(A5)�GO�DUMP�ONE�SECTOR ŠBRA„CMPSTED#CHKUPA„CMP.B‚#'^',(A0)ŠIS�IT�A�'^'?ŠBNE.S‚NOTUPŽBRANCH�IF�NO0ŠCMP.L‚#-1,SRTSEC-B(A5)ƒUP�ARROW�NOT�ALLOWED�...$ŠBEQ„NVE�...�IF�SECTOR�CURRENTLY�..."ŠTST.L‚SRTSEC-B(A5)‡...�IS�0�OR�-1ŠBEQ„NVE6ŠSUB.L‚#1,SRTSEC-B(A5)„SET�UP�FOR�PREVIOUS�SECTOR�DUMP2ŠBRA.S‚GODUMP�DON'T�LET�SECTOR�NUMBER�DROP�BELOW�0*NOTUP…BSR„BLNKSKP ŠCLR.L‚D1ŠMOVE.L�#'„',D0?DECODE1ƒCMP.B‚#'�',0(A0,D1)†MOVE�COMMAND�INTO�D0�-�BLANK�FILLED-ŠBEQ.S‚DECODE3ŒBRANCH�IF�AT�END�OF�SUBCOMMAND3ŠCMP.B‚#$0D,0(A0,D1)†ARE�WE�AT�THE�END�OF�THE�LINE?ŠBEQ.S‚DECODE3ŒBRANCH�IF�YESŠROL.L‚#8,D0ŽNO�-�SO�...2ŠMOVE.B�0(A0,D1),D0ˆ...�MOVE�NEW�CHARACTER�INTO�D0 ŠADD.W‚#1,D1$ŠBRA.S‚DECODE1ŒGO�FOR�NEXT�CHARACTER7DECODE3ƒSUB.L‚#1,D1ŽD1�POINTS�TO�LAST�LETTER�OF�COMMANDŠMOVE.L�D1,CHRPTR-B(A5)ŠCMP.L‚#'HELP',D0ŠBNE.S‚NOTHELP'ŠLEA„SXERR(PC),A0‹TELL�THEM�THE�OPTIONSŠLEA„SXERRE(PC),A1 ŠBSR„MSGOUTŠBRA„DECPRMPT‹RETURN�TO�PROMPT*-NOTHELPƒCMP.L‚#'�OUT',D0‰IS�IT�'OUT'�COMMAND?ŠBNE.S‚NOTOUT�BRANCH�IF�NO<ŠLEA„OPINPBUF+3-B(A5),A0�PREPARE�FOR�PROCESSING�OUTPUT�FIELDOUTC4…ADD.L‚#1,A0%ŠCMP.B‚#$0D,(A0)ŠCARRIAGE�RETURN�YET?!ŠBEQ„DECERR�BRANCH�IF�YES�-�ERROR*ŠCMP.B‚#'�',(A0)ŠBYPASS�INTERVENING�BLANKS ŠBEQ.S‚OUTC43ŠMOVE.L�A0,OUTPSRT-B(A5)ƒSAVE�START�OF�OUTPUT�FIELD,ŠBSR„CKINOUTŒCHECK�FOR�INPUT/OUTPUT�THE�SAMEŠBNE„DECPRMPT‹BRANCH�IF�ERRORŠBSR„NEWOUT�ASSIGN�NEW�OUTPUTŠBEQ.S‚OUTC6ŽBRANCH�IF�OK.ŠBPL„DECPRMPT‹BRANCH�IF�OVERWRITE�NOT�SELECTEDŠBSR„CHAINCHK‹EXIT�ON�CHAIN ŠBRA„DECPRMPT'OUTC6…BSR„PRTSET�SET�PRINTER�ATTRIBUTES%ŠBRA„DECPRMPT‹BRANCH�IF�GOOD�OR�ERROR*NOTOUT„CMP.B‚#'Q',(A0)ŠBNE.S‚DCHECK�BRANCH�IF�NO!ŠADD.L‚#2,(A7)ŒTERMINATION�RETURN%ŠBRA„DECODEXT‹GET�OUT�OF�THIS�ROUTINE* DCHECK„EQU„**ŠCMP.B‚DUMPCHR,D0‰ARE�WE�SUPPOSED�TO�DUMP?ŠBNE„RCHECK�BRANCH�IF�NO-ŠADD.L‚#1,CHRPTR-B(A5)„BUMP�CHARACTER�POINTER)ŠCLR.L‚SRTSEC-B(A5)‡STARTING�SECTOR�INPUT'ŠCLR.L‚ENDSEC-B(A5)‡ENDING�SECTOR�INPUT4ŠMOVE.W�#10,RADIX-B(A5)„DEFAULT�RADIX�FOR�CONVERSION,ŠMOVE.L�#-2,A1�A1�IS�NOT�USED�AS�END�POINTER#ŠBSR„ASCBIN�CONVERT�ASCII�TO�BINARYŠBNE.S  ‚DECERR�BRANCH�IF�ERROR/ŠMOVE.L�D1,SRTSEC-B(A5)„DEPOSIT�CONVERTED�VALUE:ŠLEA„OPINPBUF(PC),A1ˆINPUT�BUFFER�FOR�INTERACTIVE�DIALOGUE)ŠADD.L‚CHRPTR,A1ŠADD�IN�CHARACTER�POINTER*ŠCMP.B‚#',',(A1)ŠSEPARATOR�BETTER�BE�COMMAŠBEQ.S‚COMMAOK-ŠCMP.B‚#'�',(A1)ŠSPACE�IS�OK�INSTEAD�OF�COMMAŠBNE.S‚DCHECK44ŠMOVE.B�#',',(A1)ŠFORCE�COMMA�IF�DELIMETER�WAS�SPACEŠBRA.S‚COMMAOK'DCHECK4ƒLEA„OPINPBUF-B(A5),A0‚NOT�COMMA ŠSUB.L‚A0,A13ŠSUB.L‚MSGIIOS+IOSLEN,A1‚IS�THERE�MORE�IN�THE�LINE? ŠCMPA.W�#0,A1ŠBNE.S‚DECERR�ERROR�IF�SOŠMOVE.L�D1,ENDSEC-B(A5) ŠBRA.S‚DECOK COMMAOKƒEQU„*-ŠADD.L‚#1,CHRPTR-B(A5)„BUMP�CHARACTER�POINTER4ŠMOVE.W�#10,RADIX-B(A5)„DEFAULT�RADIX�FOR�CONVERSION,ŠMOVE.L�#-2,A1�A1�IS�NOT�USED�AS�END�POINTER#ŠBSR„ASCBIN�CONVERT�ASCII�TO�BINARY ŠBNE.S‚DECERR2ŠMOVE.L�D1,ENDSEC-B(A5)„STUFF�ENDING�SECTOR�NUMBER&ŠBSR„EXGRBG2ŒSEE�IF�OK�TO�END�OF�INPUTŠBEQ.S‚CMPSTEDŒBRANCH�IF�YESDECERR„MOVE.L�#EM_NVE,D0 ŠBSR„ERRMSGŠADD.L‚#4,(A7)ŒERROR�EXIT#ŠBSR„CHAINCHK‹EXIT�IF�IN�CHAIN�MODEŠBRA.S‚DECODEXT CMPSTEDƒEQU„*ŠMOVE.L�SRTSEC,D0 ŠCMP.L‚ENDSEC,D0ŠIS�START�<=�ENDŠBLS.S‚DECOKŽBRANCH�IF�YESŠBRA.S‚DECERR�ERROR�EXIT DECOK…EQU„*8ŠMOVEM.L�SRTSEC,D1-D2†INITIALIZE�D1,D2�WITH�BINARY�INPUT DECODEXT‚RTS* RCHECK„EQU„*/ŠCMP.B‚#'R',D0ŒDO�WE�READ�SECTOR�CHANGE�BUFFER?ŠBNE„SCHECK�BRANCH�IF�NOŠADD.L‚#1,CHRPTR-B(A5)ŠMOVE.L�CHRPTR,A0ŠLEA„OPINPBUF-B(A5),A14ŠADD.L‚A1,A0ŽA0�POINTS�TO�BEGINNING�OF�SPACE�TO�SCAN8ŠLEA„OPINLGH(A0),A1…A1�POINTS�TO�ENDING�OF�SPACE�TO�SCAN#ŠBSR„BLNKSKPŒADVANCE�A0�TO�NONBLANKŠMOVE.L�A0,D7ŽTEMPORARYŠLEA„OPINPBUF-B(A5),A1 ŠSUB.L‚A1,D74ŠMOVE.W�#10,RADIX-B(A5)„DEFAULT�RADIX�FOR�CONVERSION,ŠMOVE.L�#-2,A1�A1�IS�NOT�USED�AS�END�POINTER+ŠBSR„ASCBIN�CONVERT�SECTOR�NUMBER�TO�BINARYŠBNE.S‚NVE�BRANCH�IF�ERROR$ŠBSR„EXGRBG2ŒSEE�IF�TRAILING�GARBAGEŠBNE.S‚NVE�BRANCH�IF�SO.ŠCMP.L‚CHRPTR,D7ŠSEE�IF�ANY�NUMBER�WAS�ENTERED!ŠBNE.S‚RCHECK1ŒBRANCH�IF�YES�-�OK0NVE‡MOVE.L�#EM_NVE,D0‰TELL�THEM�OF�INVALID�INPUT ŠBSR„ERRMSG ŠBSR„CHAINCHK ŠBRA„DECPRMPT;RCHECK1ƒMOVE.L�D1,RSEC-B(A5)†SECTOR�NUMBER�OF�CHANGE�BUFFER*"* READ IN THE SECTOR CHANGE BUFFER0ŠTST.B‚NONCONTG-B(A5)…IS�THIS�A�CONTIGUOUS�FILE?ŠBEQ.S‚RCNTGŽBRANCH�IF�YES&ŠBSR„FILLBUFŒREAD�USING�SHARED�SEGMENTŠCMP.B‚#ISTACRC,D0%ŠBNE.S‚RTSTIO�BRANCH�IF�NOT�CRC�ERROR3ŠBSR„ERRMSG�COMPLAIN�OF�CRC�ERROR�BUT�TREAT�AS�GOOD ŠBRA.S‚RSTIO1*RCNTG…LEA„RBUF-B(A5),A1>ŠMOVE.L�A1,INPIOS+IOSSAD-B(A5)�SET�UP�BUFFER�BEGINNING�ADDRESSŠADD.L‚#BUFL-1,A1-ŠMOVE.L�A1,INPIOS+IOSEAD-B(A5)�ENDING�ADDRESS ŠBSR„FILLBUFŠLEA„BUFS-B(A5),A1>ŠMOVE.L�A1,INPIOS+IOSSAD-B(A5)�RESTORE�OLD�BUFFER�BASE�ADDRESSŠLEA„BUFE-B(A5),A1?ŠMOVE.L�A1,INPIOS+IOSEAD-B(A5)�RESTORE�OLD�BUFFER�LIMIT�ADDRESSŠCMP.B‚#ISTACRC,D0%ŠBNE.S‚RTSTIO�BRANCH�IF�NOT�CRC�ERROR'ŠBSR„ERRMSG�COMPLAIN�OF�CRC�VIA�HANDLERŠBRA.S‚RSTIO1�BUT�TREAT�AS�GOOD*"RTSTIO„TST.B‚D0‘TEST�STATUS�OF�I/O*ŠBNE.S‚RRNOKŽBRANCH�IF�I/O�STATUS�NOT�GOOD6RSTIO1„TST.B‚NONCONTG-B(A5)…IS�THIS�A�CONTIGUOUS�FILE?ŠBNE.S‚RRRN�BRANCH�IF�NOŠBRA.S‚RROK�BRANCH�IF�YES*7* I/O STATUS BAD - CHECK FOR END OF FILE OR INVALID RRN+RRNOK…CMP.B‚#ISTAEOF,D0ˆWAS�IT�END�OF�FILE?ŠBNE.S‚RNOTEOFŒBRANCH�IF�NO-ŠBSR„ERRMSG�DISPLAY�'END�OF�FILE'�VIA�HANDLER ŠBRA„DECPRMPT/RNOTEOFƒCMP.B‚#ISTARR,D0‰WAS�IT�AN�INVALID�RRN?ŠBNE„DFLERR�BRANCH�IF�NO*&* DEAL WITH RANDOM RECORD NUMBER ERROR>*ƒIF�WE�ARE�DEALING�WITH�A�NONCONTIGUOUS�FILE�THEN�MOVE�SECTOR*ƒIMAGE�INTO�RBUF0ŠTST.B‚NONCONTG-B(A5)…IS�THIS�A�CONTIGUOUS�FILE?,ŠBEQ„FILLERRŒBRANCH�IF�SO�-�A�REAL�RRN�ERROR/RRRN†MOVE.L�INPIOS+IOSRRN,D3ƒFIRST�RRN�OF�BLOCK.ŠMOVE.L�D3,RFRRN-B(A5)…SAVE�FOR�FUTURE�COMPARE5ŠSUB.L‚RSEC,D3Œ#�OF�RECORDS�WE�NEED�TO�SKIP�IN�BUFFERŠNEG.L‚D3‘INSURE�SIGN�IS�RIGHT%ŠLSL.L‚#8,D3Ž*256�FOR�BYTE�SKIP�COUNT+ŠADD.L‚INPFHS+FHSSAD,D3ƒADD�SHARED�SEG�BASE7ŠMOVE.L�D3,RSEG-B(A5)†SAVE�ADDRESS�IN�SEGMENT�OF�SECTOR#ŠLEA„RBUF(PC),A1ŒADDRESS�TO�MOVE�TO#ŠMOVE.L�D3,A0ŽADDRESS�IN�SHARED�SEGŠLEA„RBUF+256-B(A5),A2RMOVLP„MOVE.L�(A0)+,(A1)+#ŠCMP.L‚A  2,A1ŽARE�WE�DONE�WITH�MOVE? Š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)‡FLAG�THAT�CHANGE�BUFFER�IS�READ:ŠMOVE.W�#-1,RCHG-B(A5)…FLAG�THAT�NO�CHANGES�HAVE�BEEN�MADE ŠBRA„DECPRMPT*0* SEE IF WE ARE TO SHOW THE SECTOR CHANGE BUFFER SCHECK„EQU„*3ŠCMP.B‚#'S',D0ŒDO�WE�SHOW�THE�SECTOR�CHANGE�BUFFER?ŠBNE.S‚FCHECK�BRANCH�IF�NO,ŠBSR.S‚EXGARBGE‹INSURE�NO�EXTRANEOUS�GARBAGEŠBNE„NVE�BRANCH�IF�BAD�ENTRY*)ŠLEA„SCHGBS(PC),A0Š'SECTOR�CHANGE�BUFFER'ŠLEA„SCHGBE(PC),A1 ŠBSR„LSTOUTŠMOVE.L�RSEC,D1ŒSECTOR�NUMBERŠLEA„RBUF-B(A5),A02ŠMOVE.L�A0,BUFDUMP-B(A5)ƒADDRESS�OF�BUFFER�TO�DUMP ŠBSR„FORMAT ŠBRA„DECPRMPT%*************************************:* SUBROUTINE TO CHECK FOR EXTRANEOUS GARBAGE ON INPUT LINE*ƒFOR�SINGLE�LETTER�SUBCOMMANDS*EXGARBGE‚EQU„*2ŠADD.L‚#1,A0ŽPOINT�A0�ONE�BEYOND�SUBCOMMAND�LETTER ŠMOVE.L�A0,A1ŠADD.L‚MSGIIOS+IOSLEN,A12ŠSUB.L‚#1,A1ŽA1�POINTS�TO�END�OF�INTERACTIVE�INPUT ŠBSR„BLNKSKP#ŠCMP.L‚A0,A1ŽRETURN�.NE.�IF�GARBAGEŠRTS%*************************************8* SUBROUTINE TO CHECK FOR TRAILING GARBAGE ON INPUT LINE*ƒAFTER�CONVERSION�BY�ASCBIN* RETURNS EQ IF NO GARBAGE*‰NE�IF�GARBAGE* 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ŒDO�WE�FILL�SECTOR�CHANGE�BUFFER?ŠBNE.S‚MCHECK�BRANCH�IF�NO*ŠADD.L‚#1,CHRPTR-B(A5)4ŠMOVE.W�#16,RADIX-B(A5)„DEFAULT�RADIX�FOR�CONVERSION,ŠMOVE.L�#-2,A1�A1�IS�NOT�USED�AS�END�POINTER#ŠBSR„ASCBIN�CONVERT�ASCII�TO�BINARYŠBNE„NVE�BRANCH�IF�BAD�ENTRY$ŠBSR„EXGRBG2ŒSEE�IF�TRAILING�GARBAGEŠBNE„NVE�BRANCH�IF�SO(ŠCMP.L‚#$FF,D1ŒWAS�BYTE�VALUE�TOO�LARGE?ŠBLS.S‚FCHECK.1‹BRANCH�IF�NO(ŠMOVE.L�#EM_NVE,D0‰COMPLAIN�OF�BAD�ENTRY ŠBSR„ERRMSG#ŠBSR„CHAINCHK‹EXIT�IF�IN�CHAIN�MODE*$* FILL CHANGE BUFFER WITH BYTE IN D1FCHECK.1‚LEA„RBUF(PC),A1ŠLEA„RBUF+256-B(A5),A0FCHGLP„MOVE.B�D1,(A1)+ ŠCMP.L‚A0,A1 ŠBCS.S‚FCHGLP(ŠCLR.W‚RCHG-B(A5)‰MARK�BUFFER�AS�CHANGED ŠBRA„DECPRMPT*$* SEE IF WE ARE TO ENTER CHANGE MODE MCHECK„EQU„*'ŠCMP.B‚#'M',D0ŒDO�WE�ENTER�CHANGE�MODE?ŠBNE„WCHECK�BRANCH�IF�NO6ŠTST.W‚GOTCHG-B(A5)‡DO�WE�HAVE�A�SECTOR�CHANGE�BUFFER?ŠBEQ.S‚PROMPT1ŒBRANCH�IF�YES:ŠLEA„NOCHGS(PC),A0Š'MUST�READ�IN�SECTOR�CHANGE�BUFFER�FIRSŠLEA„NOCHGE(PC),A1 ŠBSR„MSGOUT&ŠBSR„CHAINCHK‹EXIT�IF�CHAIN�PROCESSINGŠBRA„DECPRMPT‹GO�OUT�AND�PROMPT*9PROMPT1ƒMOVE.L�#-1,MODEC-B(A5)„MARK�AS�NOT�IN�CHANGE�MODEŠBRA.S‚PRMPTIN NXTOPINƒEQU„* ŠBSR„MSGOUTŠLEA„MSGIIOS(PC),A0ŠTRAPƒ#2"ŠBEQ.S‚NXTOPIN1‹BRANCH�IF�NO�ERRORŠCMP.B‚#ISTABRK,D0ŠBEQ„BREAKSVŒHANDLE�BREAK1NXTOPIN1‚BSR„SBARGŽCALL�FOR�ARGUMENT�SUBSTITUTIONPRMPTINƒLEA„OPINPBUF(PC),A03ŠMOVE.L�MSGIIOS+IOSLEN,A1‚CALC�ENDING�INPUT�ADDRESS ŠADD.L‚A0,A1(ŠSUB.L‚#1,A1ŽA1�HAS�ENDING�INPUT�ADDRESS*ŠBRA„DECINP�DECODE�THE�INPUT** NN WAS ENTERED* NUM‡EQU„*(ŠMOVE.L�#1,INCNUM-B(A5)„SET�UP�INCREMENT ŠBRA.S‚NUM06NUMUP…MOVE.L�#-1,INCNUM-B(A5)ƒSET�UP�DISPLAY�INCREMENT$ŠSUB.L‚#1,A1ŽPOINT�TO�END�OF�NUMERIC NUM0†EQU„*+ŠTST.L‚MODEC-B(A5)ˆARE�WE�IN�A�CHANGE�MODE?ŠBEQ.S‚CHGMOD�BRANCH�IF�YES)ŠCLR.L‚MODEC-B(A5)ˆMARK�US�IN�CHANGE�MODE&ŠBSR„ASCSCANŒCHECK�FOR�ALL�ASCII�INPUT'ŠBRA.S‚NOADDR�BRANCH�FOR�NOT�GOOD�INPUTŠNOP„SPACEŽFILLER#ŠMOVE.L�A0,D0ŽADDRESS�TO�BEGIN�SCANŠLEA„OPINPBUF-B(A5),A2&ŠSUB.L‚A2,D0ŽRELATIVE�OFFSET�IN�BUFFERŠMOVE.L�D0,CHRPTR-B(A5)4ŠMOVE.W�#16,RADIX-B(A5)„DEFAULT�RADIX�FOR�CONVERSION)ŠBSR„ASCBIN�GET�BINARY�EQUIVALENT�INTO�D1ŠBNE„NVE�BRANCH�IF�BAD�ENTRYŠCMP.L‚#$FF,D1ŒRANGE�(0-$FF) ŠBLS.S‚BYTEOK3BADBYTEƒLEA„BADBYTES(PC),A0ˆCOMPLAIN�OF�BAD�ADDRESSŠLEA„BADBYTEE(PC),A1 ŠBSR„MSGOUTŠBRA„DECPRMPT‹GET�OUTBYTEOK„MOVE.L�D1,D0'ŠMOVE.L�D0,DECNUM-B(A5)„DISPLAY�ADDRESSŠLEA„RBUF(PC),  A0'ŠMOVE.B�0(A0,D0),D1ˆVALUE�OF�BYTE�IN�D1 ŠBRA.S‚OPINOK*NOADDR„BRA„NVE OPINOK„EQU„*)ŠMOVE.L�D1,GETIDXNM-B(A5)‚SAVE�BYTE�VALUE ŠBRA„DISPLAY* CHGMOD„EQU„*'ŠBSR„ASCSCANŒSCAN�FOR�LEGAL�ASCII�INPUT!ŠBRA.S‚BADIN1�BRANCH�IF�BAD�INPUTŠNOP„SPACEŽFILLERŠBRA.S‚CHGMOK1BADIN1„BRA„NVE*7CHGMOK1ƒMOVE.L�DECNUM,SAVDEC-B(A5)�SAVE�DISPLAY�ADDRESS:ŠCLR.L‚QFIRST-B(A5)‡FLAG�AS�FIRST�TIME�THRU�(SYNTAX�CHECK)'ŠCMP.B‚#'$',(A0)ŠBYPASS�LEADING�'$'�...ŠBNE.S‚NO$1�...�IF�ENTERED ŠADD.L‚#1,A0=NO$1†MOVEM.L�A0-A1,QSAVA0-B(A5)�SAVE�NUMERIC�INPUT�BOUNDARIES NLOOP1„EQU„*"ŠMOVE.L�A1,D1ŽEND�NUMERIC�BOUNDARY/ŠSUB.L‚A0,D1ŽD1�HAS�#�OF�INPUT�NUMERIC�CHARS�-13ŠMOVE.L�A0,A1ŽSET�UP�FOR�ASCII�CONVERSION�OF�1�CHAR+ŠBTSTƒ#0,D1ŽNE�IMPLIES�EVEN,�EQ�IMPLIES�ODD'ŠBEQ.S‚NBIN�BRANCH�IF�ODD�#�CHARS�INPUT-ŠADD.L‚#1,A1ŽMUST�CONVERT�TWO�IF�EVEN�#�CHARS*'NBIN†MOVE.L�A0,D1ŽADDRESS�TO�BEGIN�SCANŠLEA„OPINPBUF-B(A5),A2&ŠSUB.L‚A2,D1ŽRELATIVE�OFFSET�IN�BUFFERŠMOVE.L�D1,CHRPTR-B(A5)ŠMOVE.W�#16,RADIX-B(A5)#ŠBSR„ASCBIN�CONVERT�A0-A1�TO�BINARYŠBNE„NVE�BRANCH�IF�BAD�ENTRY5ŠMOVE.B�D1,STGCHR-B(A5)„SET�UP�FOR�DEPOSIT�SUBROUTINE*ŠLEA„STGCHR(PC),A0ŠPOINT�A0�TO�INSERT�BYTE"ŠBSR„DEPITŽGO�DEPOSIT�THE�NEW�BYTE+ŠADD.L‚#2,A1ŽSET�UP�TO�PICK�UP�NEXT�2�BYTES ŠMOVE.L�A1,A0 ŠSUB.L‚#1,A0(ŠCMP.L‚QSAVA0+4-B(A5),A1‚ARE�WE�THROUGH?ŠBLE„NBIN�BRANCH�IF�NOT7ŠSUB.L‚#1,DECNUM-B(A5)„CORRECT�FROM�FINAL�DEPIT�ADVANCE-ŠTST.L‚QFIRST-B(A5)‡WAS�THIS�PASS�1�(SYNTAX?)ŠBNE.S‚NDUN�BRANCH�IF�NO/ŠMOVE.L�#-1,QFIRST-B(A5)ƒSET�UP�FOR�REAL�CHANGE.ŠMOVEM.L�QSAVA0-B(A5),A0-A1�RESTORE�VITAL�REGS+ŠMOVE.L�SAVDEC,DECNUM-B(A5)�RESTORE�ADDRESS ŠBRA„NLOOP1* NDUN†EQU„*ŠTST.L‚INCNUM-B(A5) ŠBPL.S‚NOCHGŠMOVE.L�SAVDEC,DECNUM-B(A5)*5NOCHG…MOVE.L�INCNUM,D1ŠGO�TO�NEXT�ADDRESS�FOR�DISPLAYŠADD.L‚D1,DECNUM-B(A5)ŠMOVE.L�DECNUM,D0ŠCMP.L‚#$FF,D0ŒRANGE�(0-$FF)(ŠBHI„BADBYTEŒBRANCH�IF�BYTE�OUT�OF�RANGEŠLEA„RBUF(PC),A1 ŠCLR.L‚D1!ŠMOVE.B�0(A1,D0),D1ˆVALUE�OF�BYTE*;ŠMOVE.L�D1,GETIDXNM-B(A5)‚VALUE�OF�BYTE�AT�DISPLAY�LOCATIONDISPLAYƒEQU„*’CONSTRUCT�DISPLAYŠLEA„ADRAOUT(PC),A15ŠBSR„ASCII8�CONVERT�BYTE�ADDRESS�TO�ASCII�AND�DEPOSITŠMOVE.L�GETIDXNM,D0ˆOLD�VALUE*ŠBSR„BINASCII‹CONVERT�TO�ASCII�AND�DEPOSITŠMOVE.W�D1,VALAOUT-B(A5)&ŠCMP.B‚#$1F,D0ŒCONSTRUCT�ASCII�DISPLAY%ŠBLS.S‚DPRD�BRANCH�IF�NOT�DISPLAYABLEŠCMP.B‚#$7E,D0!ŠBLS.S‚DPRC�BRANCH�IF�DISPLAYABLE2DPRD†MOVE.B�#'.',D0ŒDISPLAY�'.'�FOR�NONDISPLAYABLEDPRC†MOVE.B�D0,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.*‚RETURNS�TO�PC�IF�ILLEGAL�HEX�CHARACTER�FOUND1*ƒRETURNS�TO�PC+4�IF�ALL�CHARACTERS�ARE�LEGAL�HEX* ASCSCANƒEQU„*ŠMOVE.L�A0,-(A7).ŠCMP.B‚#'$',(A0)ŠBYPASS�LEADING�'$'�IF�ENTERED ŠBNE.S‚ASCCMP ŠADD.L‚#1,A0ASCCMP„CMP.B‚#'0',(A0)ŠBLT.S‚ASCB�BRANCH�IF�NOT�ASCIIŠCMP.B‚#'9',(A0)ŠBLS.S‚ASCX�BRANCH�IF�ASCIIŠCMP.B‚#'A',(A0)ŠBLT.S‚ASCB�BRANCH�IF�NOT�ASCIIŠCMP.B‚#'F',(A0)ŠBGT.S‚ASCB�BRANCH�IF�NOT�ASCII*ASCX†ADD.L‚#1,A0 ŠCMP.L‚A1,A0+ŠBLS.S‚ASCCMP�BRANCH�IF�NOT�THRU�STRING�YES$ŠADD.L‚#4,4(A7)‹BIAS�FOR�GOOD�RETURN*ASCB†MOVE.L�(A7)+,A0ŠRTS„0*** CR1‡EQU„*(ŠTST.L‚MODEC-B(A5)ˆARE�WE�IN�CHANGE�MODEŠBNE„DECPRMPT‹BRANCH�IF�NOŠMOVE.L�#1,INCNUM-B(A5) ŠBRA„NOCHG*UPˆEQU„*’OPERATOR�ENTERED�^ŠTST.L‚MODEC-B(A5) ŠBNE„DECPRMPTŠMOVE.L�#-1,INCNUM-B(A5) ŠBRA„NOCHG* PERIOD„EQU„*-ŠMOVE.L�#1,MODEC-B(A5)…GO�INTO�NO�CHANGE�MODE ŠBRA„DECPRMPT* QUOTE…EQU„*’HANDLE�QUOTE�STRINGSŠTST.L‚MODEC-B(A5)ŠBEQ.S‚QUOTOK1ŠBRA„NVE�BRANCH�ON�BAD�ENTRY*QUOTOK1ƒMOVE.L�#1,INCNUM-B(A5)4ŠCLR.L‚QFIRST-B(A5)‡INDICATE�1ST�PASS�(SYNTAX�CHECK)0ŠMOVEM.L�A0-A1,QSAVA0-B(A5)�SAVE�STRING�POINTERS*0ŠMOVE.L�DECNUM,SAVDEC-B(A5)�SAVE�DISPLAY�ADDRESS(QBUMP…ADD.L‚#1,A0ŽBUMP�CHARACTER�POINTER ŠCMP.L‚A1,A0/ŠBGT.S‚QUOTEDUN‹BRANCH�IF�QUOTE�STRING�FINISHED*,ŠCMP.B‚#'''',(A0)‰DO�WE�HAVE�EMBEDDED�QUOTE?.ŠBNE.S‚DEPCHR�NO�-�GO�DEPOSIT�NORMAL�CHARACTERB* ENCOUNTERED A QUOTE IN THE STRING, MAY BE END QUOTE OR EMBEDDED. ŠADD.L‚#1, A0 ŠCMP.L‚A1,A0#ŠBGT.S‚QUOTEDUN‹BRANCH�IF�END�QUOTE1ŠCMP.B‚#'''',(A0)‰CHECK�FOR�DOUBLE�EMBEDDED�QUOTEŠBNE.S‚CHKUPŽIF�NOT�CHECK�FOR�^ŠBRA.S‚DEPCHR�DEPOSIT�QUOTE*CHKUP…CMP.B‚#'^',(A0)&ŠBNE.S‚QUOTERRŒBRANCH�IF�ERROR�(NOT�^),ŠMOVE.L�#-1,INCNUM-B(A5)ƒSET�DECREMENT�COUNT#ŠADD.L‚#1,A0ŽBUMP�CHARACTER�POINTER ŠCMP.L‚A1,A0ŠBGE.S‚QUOTEDUNŠBRA.S‚QUOTERR* DEPCHR„EQU„*ŠBSR.S‚DEPITŽDEPOSIT�CHARACTER ŠBRA„QBUMP*%QUOTEDUN‚EQU„*’DONE�WITH�QUOTE�STRING.ŠSUB.L‚#1,DECNUM-B(A5)„ADJUST�FROM�FINAL�DEPIT*ŠTST.L‚QFIRST-B(A5)‡WAS�THIS�THE�1ST�PASS?ŠBNE.S‚QDUN�BRANCH�IF�NOT)ŠMOVE.B�#-1,QFIRST-B(A5)ƒMARK�AS�2ND�PASS3ŠMOVEM.L�QSAVA0-B(A5),A0-A1�RESTORE�VITAL�REGISTERS3ŠMOVE.L�SAVDEC,DECNUM-B(A5)�RESTORE�DISPLAY�ADDRESS'ŠBRA„QBUMPŽGO�REALLY�PUT�THE�CHANGES�IN QDUN†EQU„*ŠTST.L‚INCNUM-B(A5) ŠBPL„NOCHG<ŠMOVE.L�SAVDEC,DECNUM-B(A5)�ADJUST�TO�DISPLAY�PRIOR�LOCATION ŠBRA„NOCHG*2QUOTERRƒEQU„*’COMPLAIN�OF�BAD�QUOTE�STRING�ENTEREDŠBRA„NVE*.DEPIT…EQU„*’DEPOSIT�CHARACTER�POINTED�AT�BY�A0+ŠTST.L‚QFIRST-B(A5)‡IS�THIS�THE�FIRST�PASS?&ŠBEQ.S‚QRTS�BRANCH�IF�YES�-�NO�CHANGES%ŠMOVE.L�A1,-(A7)‹SAVE�VITAL�REGISTERS!ŠMOVE.L�DECNUM,D0ŠDISPLAY�ADDRESS#ŠCMP.L‚#$FF,D0ŒARE�WE�OUT�OF�RANGE?ŠBLS.S‚DEPIT2�BRANCH�IF�NOŠMOVE.L�(A7)+,A1#ŠLEA„4(A7),A7‹BYPASS�RETURN�ADDRESS ŠBRA„BADBYTE*,DEPIT2„LEA„RBUF(PC),A1ŒCHANGE�BUFFER�ADDRESSŠMOVE.B�(A0),D1ŒNEW�BYTE�VALUEŠCMP.B‚0(A1,D0),D12ŠBEQ.S‚QNOCHG�BRANCH�IF�BYTE�DID�NOT�REALLY�CHANGE*ŠMOVE.B�D1,0(A1,D0)ˆMAKE�BYTE�MODIFICATION!ŠCLR.W‚RCHG-B(A5)‰FLAG�AS�CHANGED.QNOCHG„MOVE.L�(A7)+,A1‹RESTORE�VITAL�REGISTERS7QRTS†ADD.L‚#1,DECNUM-B(A5)„BUMP�TO�NEXT�DISPLAY�ADDRESSŠRTS„0**M‰EQU„*)ŠADD.L‚#1,A0ŽBYPASS�SUBCOMMAND�LETTER�'M'%ŠBSR„BLNKSKPŒSKIP�BLANKS�UNTIL�NUMBER2ŠMOVE.L�#-1,MODEC-B(A5)„MARK�AS�NOT�IN�CHANGE�MODEŠBRA„NUM*Q‰EQU„*%ŠBRA„DECPRMPT‹JUST�GO�BACK�AND�PROMPT*** DECODE OPERATOR INPUT*#*�INPUT:‚A0�=�ADDRESS�OF�INPUT�LINE!*‰A1=ENDING�ADDRESS�OF�INPUT�LINE(* OUTPUT: D0 = NUMBER IN BINARY (IF ANY) *‰RETURN�TO:*‰NUM„FOR�NN*‰CR1„FOR�*‰NUMUP‚FOR�NN^*‰UP…FOR�^*‰QUOTE‚FOR�'*‰PERIOD�FOR�. *‰Q†FOR�Q*‰M†FOR�M�NN* DECINP„EQU„* ŠBSR„BLNKSKP** CHECK FOR BY ITSELF*ŠMOVE.L�A1,D0ŽENDING�ADDRESS ŠCMP.L‚A0,D0"ŠBLT„CR1�BRANCH�IF�CARRIAGE�RETURN*!* SEE IF TERMINATOR CHARACTER 'Q'*(ŠMOVE.B�TERMCHR,D1‰TERMINATING�CHARACTERŠCMP.B‚(A0),D1&ŠBEQ„Q’BRANCH�IF�TERMINATING�CHARACTER** SEE IF PERIOD*ŠCMP.B‚#'.',(A0)ŠBEQ„PERIOD�BRANCH�IF�PERIOD* * SEE IF '^'*ŠCMP.B‚#'^',(A0)ŠIS�IT�A�'^'ŠBEQ„UP‘BRANCH�IF�^** 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ŽBRANCH�FOR�NN^ŠBRA„NUM�BRANCH�FOR�NN**5* SEE IF WE ARE TO WRITE THE SECTOR CHANGE BUFFER OUT WCHECK„EQU„*0ŠCMP.B‚#'W',D0ŒDO�WE�WRITE�SECTOR�CHANGE�BUFFER?ŠBNE„DECERR�IF�NO,�THEN�BRANCH'ŠBSR„EXGARBGE‹SEE�IF�EXTRANEOUS�GARBAGE.ŠBEQ.S‚WCHECK1ŒBRANCH�IF�ONLY�'W'�WAS�KEYED�IN/ŠMOVE.W�#10,RADIX-B(A5)„SET�DEFAULT�RADIX�TO�103ŠADD.L‚#1,CHRPTR-B(A5)„CHARACTER�POINTER�FOR�ASCBINŠBSR„ASCBIN�CONVERT�TO�BINARYŠBNE„NVE�BRANCH�ON�BAD�ENTRY$ŠBSR„EXGRBG2ŒSEE�IF�TRAILING�GARBAGEŠBNE„NVE�BRANCH�IF�SOBŠMOVE.L�D1,INPIOS+IOSRRN-B(A5)�SAVE�SECTOR�NUMBER�REC�NUM�TO�WRITE3ŠTST.B‚NONCONTG-B(A5)…IS�THIS�A�NONCONTIGUOUS�FILE?+ŠBEQ.S‚NONC4ŽBRANCH�IF�NO�(IT'S�CONTIGUOUS)8ŠLEA„NONCS(PC),A0‹COMPLAIN�OF�THIS�OPTION�WITH�NONCONTIGŠLEA„NONCE(PC),A1 ŠBSR„MSGOUT&ŠBSR„CHAINCHK‹EXIT�ON�CHAIN�PROCESSING ŠBRA„DECPRMPT,NONC4…BSR„ASGPRW�GO�ASSIGN�PUBLIC�READ�WRITE1ŠBNE„DECPRMPT‹BRANCH�IF�WE�CANNOT�ASSIGN�THIS�WAYŠBSR„WROK�GO�WRITE�IT�OUT!ŠBRA„DECPRMPT‹GO�FOR�NEXT�COMMAND*6WCHECK1ƒTST.W‚GOTCHG-B(A5)‡DO�WE�HAVE�A�CHANGE�BUFFER?ŠBEQ.S‚WCHECK8ŒBRANCH�IF�YES:ŠLEA„NOCHGS(PC),A0Š'MUST�READ�IN�SECTOR�CHANGE�BUFFER�FIRSŠLEA„NOCHGE(PC),A1 ŠBSR„MSGOUT ŠBRA„DECPRMPT+WCHECK8ƒBSR„ASGPRW�ASSIGN� PUBLIC�READ/WRITE1ŠBNE„DECPRMPT‹BRANCH�IF�WE�CANNOT�ASSIGN�THIS�WAY*H* GET CORRECT SEGMENT INTO MEMORY BY READING THE SECTOR CORRESPONDING TO*ƒTHE�SECTOR�NUMBER�IN�RSEC3GOTPRPWƒMOVE.L�RSEC,D1ŒRANDOM�RECORD�NUMBER�TO�READŠBSR„FILLBUFŒREAD�ITŠCMP.B‚#ISTACRC,D0ˆCRC�ERROR?ŠBNE.S‚GOTPRPW2‹BRANCH�IF�NO3ŠBSR„ERRMSG�COMPLAIN�OF�CRC�ERROR�BUT�TREAT�AS�GOODŠBRA.S‚GOTPRW4GOTPRPW2‚TST.B‚D0ŠBNE.S‚WRNOKŽBRANCH�IF�BAD�READ:GOTPRW4ƒTST.B‚NONCONTG-B(A5)…IS�THIS�A�NONCONTIGUOUS�FILE?ŠBNE.S‚WRRN�BRANCH�IF�YES.ŠBSR.S‚WROK�WRITE�THE�RECORD�OUT�ON�CONTIGUOUSŠBRA.S‚WIOOKEX*,WRNOK…CMP.B‚#ISTARR,D0‰BETTER�BE�INVALID�RRNŠBNE„DFLERR�BRANCH�IF�NOTE* INSURE THAT THIS IS THE SAME BLOCK WE FIRST READ INTO CHANGE BUFFER/WRRN†MOVE.L�INPIOS+IOSRRN,D3ƒFIRST�RRN�OF�BLOCK*3* MOVE THE CHANGE SECTOR BACK TO THE SHARED SEGMENT$ŠLEA„RBUF(PC),A0Œ'MOVE�FROM'�ADDRESS!ŠMOVE.L�RSEG,A1Œ'MOVE�TO'�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.L�INPFHS+FHSSAD-B(A5),D0�BASE�ADDRESS�OF�SEGMENT�TO�WRITEŠMOVE.L�D0,INPIOS+IOSSAD-B(A5).ŠADD.L‚INPIOS+IOSLEN,D0ƒCOMPUTE�ENDING�ADDRESS ŠSUB.L‚#1,D0:ŠMOVE.L�D0,INPIOS+IOSEAD-B(A5)�SAVE�ROUNDED�ENDING�ADDRESSŠBSR.S‚WRITBUFCŠMOVE.L�INPFHS+FHSSAD,INPIOS+IOSSAD-B(A5)�RESTORE�FORMER�BOUNDARIES)ŠMOVE.L�INPFHS+FHSEAD,INPIOS+IOSEAD-B(A5)*EWIOOKEXƒMOVE.W�#-1,GOTCHG-B(A5)ƒFLAG�THAT�WE�DON'T�HAVE�CHANGE�BUFFERŠMOVE.L�#-1,RSEC-B(A5)*ŠMOVE.W�#-1,RCHG-B(A5)…FLAG�AS�NOT�CHANGED"ŠBRA.S‚DECPRMPT‹GET�OUT�AND�PROMPT* * SUBROUTINE/* CONTIGUOUS FILE - OUTPUT SECTOR CHANGE BUFFER WROK†EQU„*ŠLEA„RBUF-B(A5),A06ŠMOVE.L�A0,INPIOS+IOSSAD-B(A5)�SECTOR�STARTING�ADDRESSŠADD.L‚#BUFL-1,A0-ŠMOVE.L�A0,INPIOS+IOSEAD-B(A5)�ENDING�ADDRESSŠBSR.S‚WRITBUFŠLEA„BUFS-B(A5),A08ŠMOVE.L�A0,INPIOS+IOSSAD-B(A5)�RESTORE�FORMER�BOUNDARIESŠLEA„BUFE-B(A5),A0ŠMOVE.L�A0,INPIOS+IOSEAD-B(A5)ŠRTS* * SUBROUTINEWRITBUFƒLEA„INPIOS(PC),A05ŠMOVE.L�(A0),A1ŒSAVE�FUNCTION�AND�OPTIONS�FOR�RESTORE4ŠMOVE.W�#IOWRIT,INPIOS+IOSFCT-B(A5)�CONVERT�TO�WRITEŠTRAPƒ#2ŠBEQ.S‚WRITBOK ŠBSR„ERRMSG#ŠBSR„CHAINCHK‹EXIT�IF�IN�CHAIN�MODE8WRITBOKƒMOVE.L�A1,INPIOS-B(A5)„RESTORE�PREVIOUS�FUNCTIONŠ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),D0�PUBLIC�READ/WRITE�OPTIONS!ŠMOVE.L�FHSCMD(A0),D2†OLD�OPTIONS0ŠCMP.B‚D2,D0ŽWAS�THIS�ALREADY�DONE�SUCCESSFULLY?ŠBEQ.S‚ASGPRWXŒBRANCH�IF�SO7ŠMOVE.L�D0,FHSCMD(A0)†PLUG�PUBLIC�READ/WRITE�OPTIONS�INŠTRAPƒ#3#ŠBEQ.S‚ASGPRWXŒBRANCH�IF�SUCCESSFUL-ŠBSR„ERRMSG�DISPLAY�ERROR�MESSAGE�VIA�HANDLER#ŠBSR„CHAINCHK‹EXIT�IF�IN�CHAIN�MODE ASGPRWXƒRTS*'DFLERR„BSR„ERRMSG�COMPLAIN�OF�BAD�INPUT#ŠBSR„CHAINCHK‹EXIT�IF�IN�CHAIN�MODE*4DECPRMPT‚LEA„4(A7),A7‹BYPASS�RETURN�ADDRESS�ON�STACK ŠBRA„PROMPT*%*************************************:*�SUBROUTINE�TO�CONVERT�ASCII�TO�BINARY.‚INPUT�AT�OPINPBUF6*ƒOFFSET�BY�CHRPTR.‚BINARY�OUTPUT�RETURNED�IN�D1.‚SCAN9*ƒCONTINUES�UNTIL�NON-NUMERIC�CHARACTER�IS�ENCOUNTERED�OR>*ƒUNITL�THE�SCAN�REACHES�ONE�BYTE�BEYOND�WHERE�A1�IS�POINTING.*ƒLEADING�BLANKS�ARE�IGNORED.B*ƒA�'$'�IS�LEGAL�AS�FIRST�CHARACTER�TO�INDICATE�HEX�INTERPRETATION;*ƒOF�SUCCEEDING�NUMERIC�CHARACTERS.‚THE�'DEFAULT'�RADIX�FOR>*ƒCONVERSION�(10�OR�16)�MUST�BE�SUPPLIED�AS�INPUT.‚THIS�ALLOWS:*ƒA�HEX�INTERPRETATION�EVEN�IF�THE�LEADING�'$'�IS�MISSING.B*ƒEQUAL�CONDITION�CODES�ARE�RETURNED�FOR�GOOD�CONVERSION,�NE�CODES *ƒFOR�ERROR.** ASCBIN„EQU„*(ŠMOVE.L�A1,-(A7)‹SAVE�A1�THRU�CONVERSION ŠMOVE.L�A1,D0,ŠADD.L‚#1,D0ŽCOMPARE�FOR�TERMINATION�OF�SCANŠLEA„OPINPBUF(PC),A0 ŠMOVE.L�A0,D1ŠADD.L‚CHRPTR,A0ŠLEA„OPINPBUF+OPINLGH(PC),A1 ŠBSR„BLNKSKPŒSKIP�LEADING�BLANKS ŠSUB.L‚D1,A01ŠMOVE.L�A0,CHRPTR-B(A5)„UPDATE�CHRPTR�PAST�BLANKSŠCLR.L‚D1‘RETURN�VALUE/ŠMOVE.L�A0,D2ŽCHARACTER�POINTER�TO�D2�FOR�INDEX/ŠLEA„OPINPBUF(PC),A1ˆINPUT�BUFF�TO�A1�FOR�INDEXŠCLR.L‚D4‘FOR�WORKING�CHARACTER* INSURE 1ST CHARACTER GOOD ŠCMP.B‚#'$',0(A1,D2) ŠBEQ.S‚CV2+ŠCMP.W‚#10,RADIX-B(A5)„IS�DEFAULT�RADIX�10?3ŠBEQ.S‚CV4�YES�-�SO�GO�CHECK�FOR�BASE�10�LEGAL�CHAR ŠBRA.S‚CV38CV2‡MOVE.W�#16,RADIX-B(A5)„FORCE�BASE�16�FOR�LEADING�'$' ŠADD.L‚#1,D2CV3‡CMP.B‚#'A',0(A1,D2) ŠBLO.S‚CV4ŠCMP.B‚#'F',0(A1,D2)'ŠBLS.S‚CNVRTŽBRANCH�IF�GOOD�HEX�'A'-'F'CV4‡CMP.B‚#'0',0(A1,D2)&ŠBLO.S‚ASCBRTSŒBRANCH�ON�BAD�CHARACTERŠCMP.B‚#'9',0(A1,D2)&ŠBHI.S‚ASCBRTSŒBRANCH�ON�BAD�CHARACTER CNVRT…EQU„*ŠPEA„0(A1,D2)‹SEE�IF�THRU�SCANŠCMP.L‚(A7)+,D0#ŠBLS.S‚ASCBINEX‹BRANCH�IF�SCAN�THRU)ŠMOVE.B�0(A1,D2),D4ˆINPUT�ASCII�CHARACTER!ŠSUB.L‚#$30,D4ŒCONVERT�TO�DECIMAL(ŠCMP.W‚#16,RADIX-B(A5)„IS�IT�REALLY�HEX?ŠBNE.S‚RADIX10ŒBRANCH�IF�NO'ŠCMP.B‚#$10,D4ŒDO�WE�NEED�TO�BIAS�AGAINŠBLS.S‚RNGTST�BRANCH�IF�NO"ŠSUB.L‚#7,D4ŽFINISH�CONVERT�IF�HEX RNGTST„EQU„*0RADIX10ƒCMP.W‚RADIX,D4‹IS�CHARACTER�OUT�OF�RANGE'ŠBCC.S‚ASCBINEX‹BRANCH�FOR�OUT�OF�RANGE ŠTST.W‚D4'ŠBCS.S‚ASCBINEX‹BRANCH�FOR�OUT�OF�RANGEŠMOVE.L�D1,-(A7)ŠROL.L‚#3,D1ŽTIMES�8ŠCMP.W‚#16,RADIX-B(A5)!ŠBNE.S‚RD10�BRANCH�IF�RADIX�IS�10 ŠLEA„4(A7),A7*ŠROL.L‚#1,D1ŽCOMPLETE�MULTIPLICATION�BY�16 ŠBRA.S‚ADDCHR0RD10†ADD.L‚(A7),D1ŒCOMPLETE�MULTIPLICATION�BY�10ŠADD.L‚(A7)+,D1'ADDCHR„ADD.L‚D4,D1ŽADD�IN�NEW�CHARACTER,ŠADD.L‚#1,D2ŽBUMP�REGISTER�CHARACTER�POINTER'ŠBRA„CNVRTŽGO�CONVERT�ANOTHER�CHARACTERASCBINEX‚MOVE.L�(A7)+,A10ŠMOVE.L�D2,CHRPTR-B(A5)„UPDATE�CHARACTER�POINTER0ŠCMP.L‚D0,D0ŽRETURN�EQUAL�(GOOD)�CONDITION�CODESŠRTSASCBRTSƒMOVE.L�(A7)+,A10ŠMOVE.L�D2,CHRPTR-B(A5)„UPDATE�CHARACTER�POINTER*ŠTST.L‚(A7)�RETURN�UNEQUAL�CONDITION�CODESŠRTS%*************************************/* SUBROUTINE TO FILL I/O BUFFER WITH ONE SECTOR* FILLBUFƒEQU„*3ŠMOVE.L�D1,INPIOS+IOSRRN-B(A5)�SET�UP�RECORD�NUMBERŠLEA„INPIOS(PC),A0ŠTRAPƒ#2ŠRTS%*************************************A* SUBROUTINE TO PLACE FORMATTED OUTPUT ON SPECIFIED OUTPUT DEVICE**ƒENTRY:‚D1�=�SECTOR�NUMBER5*‹BUFDUMP�CONTAINS�ADDRESS�OF�SECTOR�IMAGE�TO�DISPLAY* FORMAT„EQU„*5ŠMOVEM.L�D1-D2,SAVD-B(A5)‚SAVE�THE�VOLATILE�REGISTERS** FORMAT HEADER LINE*ŠMOVE.L�D1,D0ŽSECTOR�NUMBER Š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ŠWHERE�TO�DEPOSIT�CONVERTED�ASCII#ŠBSR„ASCII8�CONVERT�TO�8-CHAR�ASCII%ŠMOVE.L�SAVD,D0ŒRECOVER�SECTOR�NUMBER$ŠBSR„HEXDEC�CONVERT�TO�DECIMAL�ASCII-* IF PRINTER DEAL WITH PAGE EJECT AND HEADING*FM4‡TST.W‚PRINTER-B(A5)†OUTPUT�TO�PRINTER?ŠBNE.S‚NOFF�BRANCH�IF�NOTŠMOVE.W�BLKOUT,D0$ŠCMP.W‚BLKMAX,D0ŠTIME�FOR�FORM�FEED?ŠBNE.S‚NOFF�BRANCH�IF�NOT(* EJECT PAGE AND PUT OUT PRINTER HEADING&*„DON'T�EJECT�PAPER�IF�FIRST�TIME�THRUŠTST.W‚EJCT-B(A5)‰DO�WE�EJECT?$ŠBNE.S‚EJCT3ŽBRANCH�IF�1ST�TIME�THRUŠLEA„FFS(PC),A0ŠLEA„FFE(PC),A1�EJECT ŠBSR„IMGOUTŠBNE„FORMEXTŒBRANCH�IF�ERROR:EJCT3…CLR.W‚EJCT-B(A5)‰CLEAR�EJECT�FLAG�FOR�NEXT�TIME�THRU"ŠLEA„PRHDGS(PC),A0ŠPRINTER�HEADING0ŠMOVE.L�PRHDGEL,A1‰LENGTH�OF�HEADING�FOR�PRINTER ŠBSR„LSTOUT NOFF†EQU„**%* PRINT OUT SECTOR NUMBER HEADER LINE*!ŠLEA„MSGHDR(PC),A0ŠBEGINNING�ADDRŠLEA„MSGHDRE(PC),A1‰ENDING�ADDRŠBSR„LSTOUT�GO�PUT�IT�OUTŠBNE„FORMEXTŒBRANCH�ON�ERROR*"* SET UP TO DISPLAY BODY OF SECTOR*1FORM10„MOVE.L�BUFDUMP,A3‰BUFFER�BEGINNING�ADDRESS8ŠCLR.L‚BYTENUM-B(A5)†RUNNING�BYTE�NUMBER�FOR�LEFT�COLUMN*3* CONVERT BYTENUM TO ASCII AND PLACE IN OUTPUT LINE*?NXTLINEƒLEA„FRMLINE-B(A5),A2ƒPOSITION�A2�AS�POINTER�INTO�OUTBUFŠMOVE.L�BYTENUM,D0 ŠBSR„BINASCII'ŠMOVE.W�D1,(A2)ŒPLACE�IT�IN�OUTPUT�LINE*5* CONVERT 16 BYTES OF BUFS AND PLACE INTO OUTPUT LINE*)ŠMOVE.L�#6,D2ŽWHERE�TO�START�BODY�OF�LINE*'NXTBYTEƒMOVE.B�(A3)+,D0‹BYTE�TO�CONVERT%ŠBSR„BINASCII‹CONVERT�TO�2-BYTE�ASCII(ŠMOVE.B�D1,1(A2,D2)ˆPLACE�LOW�ORDER�BYTE%ŠROR.L‚#8,D1ŽPOSITION�HIGH�ORDER�BYTE+ŠMOVE.B�D1,0(A2,D2)ˆPLACE�IT�IN�OUTPUT�LINE,ŠADD.L‚#3,D2ŽINDEX�TO�DEPOSIT�NEXT�CONVERTEDŠMOVE.L�A3,D0ŽBUFS�INDEXŠAND.B‚#$0F,D00ŠBEQ.S‚ASIS�BRANCH�IF�NO�MORE�TO�CONVERT �IN�LINE*ŠCMP.B‚#8,D0ŽARE�WE�HALF�WAY�THROUGH�LINE?ŠBNE.S‚NXTBYTEŒBRANCH�IF�NOT1ŠADD.L‚#1,D2ŽYES�SO�INSERT�EXTRA�SPACE�FOR�PRETTY"ŠBRA.S‚NXTBYTEŒGO�FOR�REST�OF�LINE*-* INITIALIZE LINE DISPLAY FOR "AS IS" PORTION* ASIS†EQU„*.ŠLEA„58(A2),A4ŠWHERE�TO�DEPOSIT�UNALTERED�DATA(ŠMOVE.L�A3,A6ŽUPPER�LIMIT�IN�BUFS�SO�FAR ŠSUB.W‚#16,A3*"* JIMMY THE UNPRINTABLE CHARACTERS* CMPCHR„EQU„*!ŠCMP.B‚#$7E,(A3)ŠIS�IT�PRINTABLE?ŠBHI.S‚PRD�BRANCH�IF�NO!ŠCMP.B‚#$20,(A3)ŠIS�IT�PRINTABLE?ŠBCC.S‚CHROKŽBRANCH�IF�YES,PRD‡MOVE.B�#'.',(A4)+‰NO�SO�REPLACE�WITH�'.'#ŠADD.L‚#1,A3ŽBUMP�CHARACTER�POINTER ŠBRA.S‚JNXT1CHROK…MOVE.B�(A3)+,(A4)+ˆPUT�CHAR�INTO�OUTPUT�BUF,JNXT†CMP.L‚A3,A6ŽARE�WE�DONE�WITH�THIS�LINE?ŠBNE„CMPCHR�BRANCH�IF�NOT*#* 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)‚BUMP�BYTENUM�TO�NEXT�LINEŠCMP.L‚#256,BYTENUM-B(A5)ŠBLT„NXTLINEŒBRANCH�IF�NOT�DONE** SKIP 2 LINES*!ŠLEA„LF2(PC),A0�BEGINNING�ADDRESSŠMOVE.L�A0,A1ŽENDING�ADDRESS ŠBSR„LSTOUTŠBNE.S‚FORMEXT ŠBSR„LSTOUTŠBNE.S‚FORMEXT.* UPDATE BLKOUT COUNT FOR PRINTER PRETTY PRINTŠMOVE.W�BLKOUT,D0 ŠADD.W‚#1,D0ŠCMP.W‚BLKMAX,D0%ŠBLE.S‚BLKOUTOK‹BRANCH�IF�NO�ROLLOVERŠCLR.L‚D0‘ROLLOVER�BLKOUT�COUNTBLKOUTOK‚MOVE.W�D0,BLKOUT-B(A5)$ŠCLR.L‚D0‘SET�"GOOD"�CONDITION�CODES;FORMEXTƒMOVEM.L�SAVD-B(A5),D1-D2‚RESTORE�VOLATILE�REGISTERSŠRTS%*************************************5* SUBROUTINE TO CONVERT BINARY(HEX) TO DECIMAL ASCII.C*ƒSTOPS�WHEN�8�DEC�CHARS�HAVE�BEEN�COMPUTED.�NO�CHECK�FOR�OVERFLOW.*"*…ENTRY:‚D0�=�HEX�VALUE�TO�CONVERT4*…EXIT�:‚DECIMAL�CONVERTED�VALUE�DEPOSITED�IN�DECSEC*�LEFT�JUSTIFIED,�BLANK�FILLED* HEXDEC„EQU„*6ŠMOVEM.L�D0/D2/A0/A1,-(A7)�SAVE�ALL�VOLATILE�REGISTERS3ŠLEA„DECSEC(PC),A0ŠWHERE�TO�DEPOSIT�CONVERTED�VALUE5ŠMOVEM.L�BLANKS8-B(A5),D2/A1�BLANK�OUT�RECEIVING�AREAŠMOVEM.L�D2/A1,(A0),ŠLEA„TENS(PC),A1ˆADDRESS�OF�CONVERSION�TABLE%HEXDEC0ƒMOVE.W�#'‚',D2‹FOR�BLANK�FILL$HEXDEC1ƒSUB.L‚(A1),D0ŒSUBTRACT�10**N ŠBCS.S‚HEXDEC2ŒBRANCH�IF�TOO�BIGŠADD.W‚#1,D2ŽCONTNUEŠBRA.S‚HEXDEC1+HEXDEC2ƒADD.L‚(A1)+,D0‹RESTORE,�ADV�POINTER#ŠTST.L‚(A1)�IS�THE�CONVERSION�DONE?ŠBEQ.S‚HEXDEC4ŒBRANCH�IF�YES%ŠTST.L‚D2‘ARE�WE�STILL�LEADING�BLANKS-ŠBMI.S‚HEXDEC6ŒBRANCH�TO�FORCE�NONBLANK�DIGIT ŠCMP.W‚#'‚',D2‹LEADING�ZERO�TEST#ŠBEQ.S‚HEXDEC3ŒBRANCH�IF�STILL�ZERO*HEXDEC6ƒADD.B‚#$10,D2ŒBRING�TO�ASCII�DIGIT*ŠBSETƒ#31,D2�MAKE�NEGATIVE�FOR�FUTURE�TESTHEXDEC3ƒTST.L‚D2$ŠBPL.S‚HEXDEC0ŒINSURE�LEFT�JUSTIFIEDŠMOVE.B�D2,(A0)+‹DEPOSIT�CHAR"ŠBRA.S‚HEXDEC0ŒCONTINUE�CONVERSION3HEXDEC4ƒADD.B‚#$10,D2ŒLAST�ONE�ALWAYS�BECOMES�DIGIT'ŠMOVE.B�D2,(A0)+‹DEPOSIT�LAST�CHARACTER,ŠMOVEM.L�(A7)+,D0/D2/A0/A1�RESTORE�REGISTERSŠRTS*BLANKS8ƒDC.Bƒ'ˆ'-*********************************************&*ˆ**CONVERT�BINARY�TO�ASCII�ROUTINE�**-*********************************************$*ˆBINARY�TO�DECIMAL�ASCII�SUBROUTINE*�REV�1.00‚3/27.79�GAT*�**�16�BIT�BINARY�INPUT�**4****************************************************6*ˆCONVERTS�BINARY�QUANTITY�IN�D0�TO�ASCII�STRING�WHICH *ˆIS�DEPOSITED�AT�LOCATION�(A0)+**ˆCALLING�SEQUENCE:'*‹LOAD�D0�WITH�QUANTITY�TO�BE�CONVERTEDí:öGþGRX.*‹LOAD�A0�WITH�ADDRESS�TO�DEPOSIT�ASCII�STRING *‹JSR�BINDEC*!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*“D„*�* *“A„*�*�***ˆA1�POINTS�AT�BINARY�TABLE*ˆA2�POINTS�AT�ASCII�TABLE*ˆD1�IS�WORK�REGISTER*BINEQS„DC.Wƒ0,1,10,100,1000(BINASC„DC.Bƒ'0123456789ABCDEF'�HEX�TABLE*'BINDEC„LEA„BINEQS+8-B(A5),A1‚ADDR�10**5,BINDE1„LEA„BINASC-B(A5),A2„BASE�ADDR�ASCII�0#BINDE2„SUB.W‚(A1),D0ŒSUBTRACT�10**NŠBCS.S‚BINDE3�BRANCH�OVERBORROW&ŠADD.L‚#1,A2ŽINCREMENT�NEXT�ASCII�CHARŠBRA„BINDE2�CONTINUE 'BINDE3„ADD.W‚(A1),D0ŒRESTORE�OVERBORROW!ŠMOVE.B�(A2),(A0)+‰PUT�ASCII�CHARŠMOVE.W�-(A1),D1‹TEST�DONEŠBNE„BINDE1�BRANCH�NOT�DONEŠRTS*-*********************************************+*‚32�BIT�BINARY�TO�DECIMAL�ASCII�SUBROUTINE-**********************************************,*‚CONVERTS�BINARY�IN�D0�AND�PUTS�ASCII�DIGIT(*…CHARACTERS�AT�ADDRESS�SPECIFIED�IN�A0.(*…LEADING�ZEROS�ARE�CONVERTED�TO�SPACES.+*…THE�FIELD�LENGTH�(NO.�CHARS)�IS�SPECIFIED *…IN�D1�IN�THE�CALLING�SEQUENCE.**‚CALLING�SEQUENCE:!*…MOVE.L�,�D0*…MOVE.L�,D11*…MOVE.L�,A0*…BSR�BINDECFJ* *‚RETURNS:*…D0�=�0�=>GOOD�CONVERSION**‚REGS�USED:‚0�1�2�3�4�5�6�7 *ŠDƒ*�P�P*ŠAƒP�P*"BINDECFJ‚MOVEM.L�D1/D2/A0/A1,-(A7)ŠMOVE.L�#8,D2ŽMAX�NO.�DIGITSŠSUB.L‚D1,D2ŽNO.�DIGITS�TO�SKIP!ŠBMI.S‚BINDECF5‹BRANCH�ERROR�EXITŠLSL.L‚#2,D2ŽDOUBLE�WORD�LENGTHŠLEA„TENS(PC),A1ˆSTART�OF�TABLE"ŠADD.L‚D2,A1ŽADJUST�FOR�DIFFERENCE&ŠMOVE.W�#'‚',D2‹INITIALIZE�ACCUMULATOR%BINDECF1‚SUB.L‚(A1),D0ŒSUBTRACT�10**NŠBCS.S‚BINDECF2‹BRANCH�TOO�BIG*ŠADD.W‚#1,D2ŽINCREMENT�CURRENT�DIGIT�COUNTŠBRA„BINDECF1‹CONTINUE)BINDECF2‚ADD.L‚(A1)+,D0‹RESTORE,�ADV�PNTRŠTST.L‚(A1)�TEST�DONEŠBEQ.S‚BINDECF4‹BRANCH�DONE ŠCMP.W‚#'‚',D2‹LEADING�ZERO�TEST!ŠBEQ.S‚BINDECF3‹BRANCH�STILL�ZERO#ŠADD.B‚#$10,D2ŒBRING�TO�ASCII�DIGIT%BINDECF3‚MOVE.B�D2,(A0)+‹DEPOSIT�CHARŠLSL„#8,D2ŽSAVE�CHAR�DEPOSITED#ŠMOVE.B�#$20,D2ŒRESTORE�LS�TO�SPACEŠBRA„BINDECF1‹CONTINUE4BINDECF4‚ADD.B‚#$10,D2ŒLAST�ONE�BECOMES�DIGIT�ALWAYS"ŠMOVE.B�D2,(A0)+‹DEPOSIT�LAST�CHAR'ŠTST.L‚D0‘SET�CONDITION�CODE,�0�IF�GOOD"BINDECF5‚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�=�BEGINNING�ADDRESS�OF�MESSAGE *ŠA1�=�ENDING�ADDRESS�OF�MESSAGE* MSGOUT„EQU„*6ŠMOVEM.L�A0-A1,MSGIOS+IOSSAD-B(A5)�BEGIN/END�ADDRESSESŠLEA„MSGIOS(PC),A0ŠTRAPƒ#2"ŠBEQ.S‚MSGOUT.5‹BRANCH�ON�NO�ERROR ŠCMP.B‚#ISTABRK,D0ˆWAS�IT�BREAK?ŠBEQ„BREAKSVŒBRANCH�IF�YES$ŠBSR.S‚ERRMSG�NO�-�COMPLAIN�OF�ERROR#ŠBSR„CHAINCHK‹EXIT�IF�IN�CHAIN�MODE ŠTST.L‚D08MSGOUT.5‚MOVEM.L�MSGIOS+IOSSAD-B(A5),A0-A1�RESTORE�A0/A1ŠCMP.B‚#ISTABRK,D0ŠBEQ„BREAKSVŒHANDLE�BREAK ŠTST.B‚D0ŠRTS„GET�OUT�OF�HERE%*************************************,* SUBROUTINE TO OUTPUT PROMPT AND THEN INPUT* POUTIN„EQU„*/ŠLEA„PROMPTC(PC),A0‰PROMPT�CHARACTTER�BEGIN�MSG-ŠLEA„PROMPTCE(PC),A1ˆLAST�CHAR�ADDR�TO�OUTPUTŠBSR„MSGOUT�OUTPUT�PROMPTŠBNE.S‚POUTINER‹BRANCH�IF�ERROR,POUTIN2ƒLEA„MSGIIOS(PC),A0‰INPUT�PARAM�BLOCKŠTRAPƒ#2!ŠBEQ.S‚POUTIN4ŒBRANCH�IF�NO�ERRORPOUTINER‚CMP.B‚#ISTABRK,D0ŠBEQ„BREAKSVŒHANDLE�BREAK'PERR†BSR.S‚ERRMSG�COMPLAIN�IF�ERROR�...ŠBRA„DUMPEREX‹...�AND�EXIT*0POUTIN4ƒBSR„SBARGŽCALL�FOR�ARGUMENT�SUBSTITUTION ŠBNE„PERRŠRTS%*************************************)* SUBROUTINE TO USE ERROR MESSAGE HANDLER*ƒD0�-�MESSAGE�CODE'*ƒA0�-�POINTS�TO�PARAMETER�BLOCK�IF�ANY* ERRMSG„EQU„*ŠMOVEM.L�D0/A0,ERRPBLK-B(A5)*‰MOVE.W�SR,-(A7) ŠMOVE.L�#2,D0ŠLEA„ERRPBLK-B(A5),A0ŠTRAPƒ#4*‰MOVE.W�(A7)+,CCRŠMOVEM.L�ERRPBLK-B(A5),D0/A0ŠRTS%*************************************7* SUBROUTINE TO PRINT OUT LISTING LINE - FORMATTED MODE* LSTOUT„EQU„*ŠMOVEM.L�A0/A1,-(A7),ŠMOVE.L�A0,LSTIOS+IOSSAD-B(A5)�BEGIN�ADDRESS*ŠMOVE.L�A1,LSTIOS+IOSEAD-B(A5)�END�ADDRESS%ŠLEA„LSTIOS(PC),A0ŠI/O�PACKET�ADDRESSŠTRAPƒ#2"ŠBEQ.S‚LSTOUT.5‹BRANCH�ON�NO�ERROR$ŠCMP.B‚#ISTABRK,D0ˆWAS�THIS�A�BREAK?ŠBEQ„BREAKSVŒBRANCH�IF�YES!ŠBSR„ERRMSG�COMPLAIN�OF�I/O�ERROR%ŠBSR.S‚CHAINCHK‹EXIT�IF�IN�CHAIN�MODE ŠTST.L‚D0LSTOUT.5‚MOVEM.L�(A7)+,A0/A1ŠCMP.B‚#ISTABRK,D0ŠBEQ„BREAKSVŒHANDLE�BREAK ŠTST.B‚D0ŠRTS%*************************************"* SUBROUTINE TO LIST IN IMAGE MODE* IMGOUT„EQU„*4ŠOR.Wƒ#IOPIMG,LSTIOS+IOSOPT-B(A5)�SET�IMAGE�MODE�BIT ŠBSR„LSTOUT=ŠAND.W‚#$FFFF-IOPIMG,LSTIOS+IOSOPT-B(A5)�CLEAR�IMAGE�MODE�BIT ŠTST.B‚D0ŠRTS%*************************************'* CHAINCHK ERR OR EXITS IF IN CHAIN MODE*ƒELSE�JUST�RETURNS*CHAINCHK‚BTSTƒ#0,SAVD7+3-B(A5) ŠBEQ„DUMPEREXŠRTS%************************************** SUBROUTINE TO SKIP BLANKS1*ƒINPUT:‚A0�POINTS�TO�BEGINNING�OF�STRING�TO�SCAN$*‹A1�POINTS�TO�END�OF�STRING�TO�SCAN0*ƒOUTPUT:�A0�POINTS�TO�FIRST�NON-BLANK�CHARACTER BLNKSKPƒEQU„* ŠCMP.L‚A0,A1'ŠBLT.S‚BLNKSKPX‹BRANCH�IF�DONE�SCANNINGŠ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�-�BINARY�BYTE�(LOW�ORDER).*ƒEXIT:ƒD1�-�HEX�ASCII�VALUE�IN�LOW�ORDER�WORD*BINASCII‚EQU„* ŠCLR.L‚D1 ŠMOVE.B�D0,D1 ŠROR.L‚#4,D1*ŠADD.B‚#'0',D1ŒCONVERT�AS�IF�DECIMAL�(0-9)ŠCMP.B‚#'9',D1ŠBLE.S‚BIN2�BRANCH�IF�OK*ŠADD.B‚#'A'-'9'-1,D1†CONVERT�FOR�HEX�(A-F) BIN2†EQU„* ŠLSL.W‚#4,D1 ŠROL.L‚#4,D1*ŠADD.B‚#'0',D1ŒCONVERT�AS�IF�DECIMAL�(0-9)"ŠCMP.B‚#'9',D1ŒSEE�IF�DECIMAL�TYPEŠBLE.S‚BIN4�BRANCH�IF�YES*ŠADD.B‚#'A'-'9'-1,D1†CONVERT�FOR�HEX�(A-F) BIN4†EQU„*ŠRTS%*************************************4* SUBROUTINE TO CONVERT BINARY INTO 8 BYTES OF ASCII*‰LEFT�JUSTIFIED�-�BLANK�FILLED**ƒENTRY:�D0�=�BINARY�TO�CONVERT**ƒEXIT�:�A1�=�ADDRESS�IN�MEMORY�TO�DEPOSIT* ASCII8„EQU„*ŠMOVEM.L�D1/D3/A1-A4,-(A7) ŠBSR„BINASCIIŠMOVE.W�D1,6(A1) ŠROR.L‚#8,D0 ŠBSR„BINASCIIŠMOVE.W�D1,4(A1) ŠROR.L‚#8,D0 ŠBSR„BINASCIIŠMOVE.W�D1,2(A1) ŠROR.L‚#8,D0 ŠBSR„BINASCIIŠMOVE.W�D1,(A1)*)ŠMOVE.L�#8,D3ŽLEFT�JUSTIFY�AND�BLANK�FILL ŠLEA„7(A1),A4LJH0†CMP.B‚#$30,(A1) ŠBNE.S‚LJH5 ŠSUB.L‚#1,D3 ŠBEQ.S‚LJH4 ŠMOVE.L�A1,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-LEAP�DAYS�BEFORE�TABLE*'PROMPTCE‚EQU„*-1ŠDS.Wƒ0ŠXDEFƒREENTERS,REENTERE8REENTERS‚DC.Bƒ$D,$A,'DMPA:�REENTER�OUTPUT�DEVICE�NAME�>'REENTERE‚EQU„*-1ŠDS.Wƒ0ŠXDEFƒOUTERRS,OUTERRD0,OUTERRE;OUTERRSƒDC.Bƒ'DMPA:�ERROR�WRITING�TO�OUTPUT�DEVICE�-�D0�=�'OUTERRD0‚DC.Bƒ'00000000�'ŠDC.Bƒ'RETRY?�(Y/N)>'OUTERREƒEQU„*-1ŠDS.Wƒ0 BRKRCV„DC.Bƒ'DMPA:�BREAK�RVCD!!'BRKRCVEƒEQU„*-1ŠDS.Wƒ0ŠXDEFƒTSKNFND,TSKNFNDE#TSKNFNDƒDC.Bƒ'DMPA:�TASK�NOT�FOUND'TSKNFNDE‚EQU„*-1ŠPAGE* *…MESSAGES�SENT�TO�OUTPUT�DEVICE*)ŠXDEFƒPAGSLEWS,PDATE,PTIME,PTASK,PAGSLEWEPAGSLEWS‚DC.Wƒ$200C-ŠDC.Bƒ'�M�E�M�O�R�YƒD�U�M�PƒA�N�A�L�Y�S�I�S‚'Š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**ƒOPERATOR�INPUT�COMMANDS*Š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ˆ-�Crash�dump�analysis�-�DUMPANALŠPAGE9**********************************************************�INCLUDE�FILE:�DUMPRMCD.AI�*9***********************************************************ŠREAD�COMMAND�LINE*ŠOPEN�INPUT�FILE*ŠREDIRECT�OUTPUT�IF�REQUESTED* ŠXREFƒPARSE-COMMANDL‚LEA„CLINE(PC),A0‹COMMAND�LINE�BUFFERŠBSR„PARSEŽPARSE�COMMAND�LINEŠTST.L‚D0‘CHECK�FOR�ERRORSŠBPL.S‚COMDL8�BRANCH�IF�NONE#COMDL4„MESGƒCMLERS(PC),CMLERE(PC),X ŠBRA„QUITACOMDL8„MOVEM.L�A1-A2,PARSAREG-MBD(A6)�SAVE�CLINE�AS�OUTPUT�SOURCE**‡SET�UP�OUTPUT�DEVICE*(ŠMOVE.L�A1,D0ŽIS�THERE�AN�OUTPUT�DEVICE?ŠBEQ.S‚COMDL12ŒBRANCH�IF�NO'ŠBSR„NEWOUT�GO�TO�OUTPUT�CHANGE�ROUTINE**‡SET�UP�INPUT�DEVICE*!COMDL12ƒBSR.S‚NEWINŽGO�OPEN�INPUT"ŠBEQ.S‚COMDL16ŒBRANCH�IF�NO�ERRORS"ŠBMI„COMDL4�BRANCH�IF�SYNTAX�ERRORŠLEA„ASGERRS+6(PC),A0'ŠMOVE.L�#'�INP',(A0)‡INPUT�ASSIGN�ERRORŠLEA„ASGERRD0(PC),A1„SAVE�D0 ŠBSR„CONVHEX4ŠMESGƒASGERRS(PC),ASGERRE(PC),X ŠBRA„QUIT*7COMDL16ƒMOVE.L�OPTSRT-MBD(A6),D0‚Start�of�options�field"ŠBEQ.S‚CMDL99�Branch�if�no�options#ŠMOVE.L�D0,A6ŽFor�OPTION�subroutine ŠXREFƒOPTION ŠBSR„OPTIONŠLEA„BEGDATA(PC),A6‰Restore�A6,ŠCMP.B‚#$40,D0ŒAre�we�done�with�the�options?ŠBEQ.S‚CMDL99�Branch�if�yes!ŠBTSTƒ#7,D0ŽAny�error�in�options?ŠBEQ.S‚OPOK1ŽBranch�if�no0OPTERR„MOVE.L�#EM_NVO,D0‰Complain�on�bad�options ŠBSR„ERRMSGŠBRA„QUIT�Quit�on�bad�options*&OPOK1…CMP.B‚#'S',D1ŒIs�the�option�'S'? ŠBNE„OPTERR�Branch�if�no�-�errorŠMOVE.L�D3,SYSPAROF-MBD(A6) ŠBLE„OPTERR* CMDL99„RTSŠPAGE**…SET�UP�INPUT�DEVICE*NEWIN…MOVE.L�A6,-(A7)‹Save�A6'ŠLEA„CLINE(PC),A0‹START�OF�COMMAND�LINE"ŠLEA„INPFHS(PC),A6†FHS�PARAM�BLOCK&ŠMOVE.L�#'„',FHSVOL(A6)�DEFAULT�VOLUMEŠCLR.W‚FHSUSN(A6)‰DEFAULT�USER$ŠMOVE.L�#'DUMP',FHSFIL(A6)�FILE�NAMEŠMOVE.L�#'„',FHSFIL+4(A6)"ŠMOVE.W�#'SY',FHSEXT(A6)ƒEXTENTION ŠBSR„EDITFILEŠLEA„INPFHS(PC),A0ŠTRAPƒ#3‘ASSIGN�INPUT�DEVICEŠTST.L‚D0‘SET�CONDITION�CODESŠMOVE.L�(A7)+,A6‹Restore�A6ŠRTS*[Ld  ŠSECTION�0**…ASSIGN�INPUT�PARAMETER�BLOCK*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ˆ-�Crash�dump�analysis�-�DUMPANALŠPAGE DUMPREGS‚IDNTƒ4,2�Dump�registersŠPAGE*‰INCLUDE�ANALMACR.AIŠINCLUDE�ANALMACR.AI ŠXREFƒMBD**‡REGISTER�OFFSETS* ŠOFFSET�0 CRSPC…DS.Lƒ1ŠDS.Wƒ1 CRSSR…DS.Wƒ1 CRSD0…DS.Lƒ8 CRSA0…DS.Lƒ8 ŠSECTION�0* BEGDATAƒEQU„*BDˆEQU„** * HEADINGS*TCHREG„ENDLINESPACE…DC.Bƒ'�'2SPACEE„DC.Bƒ'‡REGISTERS�SAVED�WHEN�SYSTEM�CRASHED'ŠENDLINE+ŠDC.Bƒ'ˆ----------------------------------'ŠENDLINETCHREGEƒEQU„*-1ŠDS.Wƒ0**…SYSTEM�REGISTERS* 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ƒ'ˆSYSTEM�STACK�AREA'ŠENDLINEŠDC.Bƒ'ˆ-----------------'ŠENDLINETCHSTKEƒEQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8*!ŠXREF.S�PDSKERR,CONVDEC2,CONVDEC3ŠXREF.S�CRASHSAVŠXREF.S�ERMSG1,ERMSG1E ŠXREF.S�RDBUF***‡PRINT�REGISTERS* Š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**‡DUMP�SYSTEM�STACK*ŠXREF.S�EXCSTACKlhu ŠXREF.S�ADROFST2,ADRBGND,CNTBYTEŠXREF.S�PMDUMP* ŠXDEFƒPRSTAK*PRSTAK„MOVE.L�EXCSTACK(A3),D4ŠBEQ.S‚PRSTAK9 ŠPRINT‚TCHSTKŠSUB.L‚#$200,D4,ŠMOVE.L�D4,ADROFST2-MBD(A6)�STARTING�ADDRESS#ŠCLR.L‚ADRBGND-MBD(A6)„COUNT�FROM�0ŠMOVE.L�#$200,CNTBYTE-MBD(A6) ŠBSR„PMDUMP PRSTAK9ƒRTSŠENDé ééééé1ŠTTL„DUMPRESP.SAˆ-�Crash�dump�analysis�-�DUMPANALŠPAGE*DUMPRESP‚IDNTƒ4,2�RESPOND�TO�INPUT�REQUEST ŠXREFƒMBD*‰INCLUDE�ANALMACR.AI*‰INCLUDE�9995.&.TR1.EQ*‰INCLUDE�9995.&.IOE.EQ*‰INCLUDE�DUMPMOVM.AI*‰INCLUDE�ANALPDMP.AIŠNOLISTŠINCLUDE�ANALMACR.AIŠINCLUDE�9995.&.TR1.EQŠINCLUDE�9995.&.IOE.EQŠLISTŠINCLUDE�DUMPMOVM.AIŠINCLUDE�ANALPDMP.AI2ŠTTL„DUMPRESP.SAˆ-�Crash�dump�analaysis�-�DUMPANALŠPAGE ŠSECTION�0*$*†DATA�SECTION�--�RESPOND�TO�COMMAND*SAVTNAMƒDC.Lƒ0’SAVE�TASK�NAMESAVTSESƒDC.Lƒ0’SAVE�SESSIONSAVENUMƒDC.Lƒ0’SAVE�PARTITION�#* ŠOFFSET�0TASKTNAM‚DS.Lƒ1TASKTSES‚DS.Lƒ1TASKTADR‚DS.Lƒ1TASKTESZ‚EQU„*-TASKTNAMŠPAGE ŠSECTION�8*!ŠXREF.S�BLDTASKT,TASKTCNT,TASKTBLŠXREF.S�CONVAORHŠXREF.S�CMDPRO,NEWPAGEŠXREF.S�TSKNFND,TSKNFNDE*ŠXDEFƒPONETASK PONETASK‚MOVE.L�A0,-(A7)‹SAVE�A0ŠBSR„BLDTASKT‹BUILD�TASK�TABLEŠMOVE.L�(A7)+,A0‹RESTORE�A0*!*…GET�TASK�NAME�FROM�COMMAND�LINE*ŠLEA„SAVTNAM(PC),A1ŠBSR„CONVAORH‹CONVERT�TASK�NAME)ŠBMI.S‚ONETK6�BRANCH�IF�ILLEGAL�CHARACTERŠLEA„SAVTSES(PC),A1ŠBSR„CONVAORH‹CONVERT�SESSION)ŠBMI.S‚ONETK6�BRANCH�IF�ILLEGAL�CHARACTER**…FIND�TASK�IN�TABLE*ŠLEA„TASKTBL(PC),A5ŠLEA„BEGDATA(PC),A63ŠMOVEM.L�SAVTNAM-BD(A6),D0-D1…TASK�NAME�AND�SESSION2ŠMOVE.W�TASKTCNT(PC),D4„NUMBER�OF�ENTRIES�IN�TABLE ŠBRA.S‚ONETK55ONETK2„CMP.L‚TASKTNAM(A5),D0„IS�THIS�THE�ONE�WE�WANT?ŠBNE.S‚ONETK4�BRANCH�IF�NOŠTST.L‚D1‘WAS�SESSION�GIVEN)ŠBEQ.S‚ONETK10ŒBRANCH�IF�NO�-�FOUND�ENTRY*ŠCMP.L‚TASKTSES(A5),D1„DOES�SESSION�MATCH?)ŠBEQ.S‚ONETK10ŒBRANCH�IF�GOOD�ENTRY�FOUND%ONETK4„LEA„TASKTESZ(A5),A5„NEXT�ENTRYONETK5„DBRAƒD4,ONETK2=ONETK6„MESGƒTSKNFND(PC),TSKNFNDE(PC)�TELL�USER�TASK�NOT�FOUND ŠBRA„CMDPRO1ONETK10ƒMOVE.L�TASKTADR(A5),A5„GET�ADDRESS�OF�TCBŠXREF.S�ONETASKŠBSR„ONETASKŒGO�PRINT�TASK�INFO ŠBRA„CMDPRO* ŠXDEFƒPTCBSŠXREF.S�TCBCHNPTCBS…BSR„NEWPAGEŠBSR„TCBCHN�PRINT�TCB�CHAIN ŠBRA„CMDPRO* ŠXDEFƒPSTCBŠXREF.S�STCBCHNPSTCB…BSR„NEWPAGE}T†uŽZ#ŠBSR„STCBCHNŒPRINT�SYSTEM�TCB�CHAIN ŠBRA„CMDPRO* ŠXDEFƒPUTCBŠXREF.S�UTCBCHNPUTCB…BSR„NEWPAGE!ŠBSR„UTCBCHNŒPRINT�USER�TCB�CHAIN ŠBRA„CMDPRO* ŠXDEFƒPTRACEŠXREF.S�TRACSUBPTRACE„BSR„NEWPAGEŠBSR„TRACSUBŒPRINT�TRACE�TABLE ŠBRA„CMDPRO* ŠXDEFƒPSTAKŠXREF.S�PRSTAKPSTAK…BSR„NEWPAGEŠBSR„PRSTAK�PRINT�STACK ŠBRA„CMDPRO* ŠXDEFƒPGST ŠXREF.S�GSTBLPGST†BSR„NEWPAGE%ŠBSR„GSTBLŽPRINT�GLOBAL�SEGMENT�TABLE ŠBRA„CMDPRO* ŠXDEFƒPNNTBL ŠXREF.S�NNTBLPNNTBL„BSR„NEWPAGE #ŠBSR„NNTBLŽPRINT�NETWORK�NAME�TABLE ŠBRA„CMDPRO* ŠXDEFƒPNATBL ŠXREF.S�NATBLPNATBL„BSR„NEWPAGE&ŠBSR„NATBLŽPRINT�NETWORD�ADDRESS�TABLE ŠBRA„CMDPRO* ŠXDEFƒPLCTBL ŠXREF.S�LCTBLPLCTBL„BSR„NEWPAGE&ŠBSR„LCTBLŽPRINT�LOGICAL�CONNECT�TABLE ŠBRA„CMDPRO* ŠXDEFƒPPCBTBLŠXREF.S�PCBTBL ŠXREFƒMEMOFFPPCBTBLƒTST.L‚MEMOFF(A3)ŠBNE.S‚PPCBTBL1 ŠBSR„NEWPAGE'ŠBSR„PCBTBL�PRINT�PRIMARY�CONTROL�BLOCKPPCBTBL1‚BRA„CMDPRO* ŠXDEFƒPSCBTBLŠXREF.S�SCBTBL ŠXREFƒMEMOFFPSCBTBLƒTST.L‚MEMOFF(A3)ŠBNE.S‚PSCBTBL1 ŠBSR„NEWPAGE)ŠBSR„SCBTBL�PRINT�SECONDARY�CONTROL�BLOCKPSCBTBL1‚BRA„CMDPRO* ŠXDEFƒPUDRTBLŠXREF.S�UDRTBLPUDRTBLƒBSR„NEWPAGE&ŠBSR„UDRTBL�PRINT�USER�DIRECTIVE�TABLE ŠBRA„CMDPRO* ŠXDEFƒPHELP ŠXREFƒHELPPHELP…BSR„NEWPAGEŠBSR„HELP�PRINT�COMMANDS ŠBRA„CMDPRO* ŠXDEFƒPFREQ ŠXREF.S�FREQ ŠXREFƒMEMOFFPFREQ…TST.L‚MEMOFF(A3) ŠBNE.S‚PFREQ1 ŠBSR„NEWPAGEŠBSR„FREQ�PRINT�SDLC�FREE�QUEUEPFREQ1„BRA„CMDPRO* ŠXDEFƒPUSRQ ŠXREF.S�USRQ ŠXREFƒMEMOFFPUSRQ…TST.L‚MEMOFF(A3) ŠBNE.S‚PUSRQ1 ŠBSR„NEWPAGEŠBSR„USRQ�PRINT�SDLC�USER�QUEUEPUSRQ1„BRA„CMDPRO* ŠXDEFƒPRECVQ ŠXREF.S�RECVQ ŠXREFƒMEMOFFPRECVQ„TST.L‚MEMOFF(A3)ŠBNE.S‚PRECVQ1 ŠBSR„NEWPAGE#ŠBSR„RECVQŽPRINT�SDLC�RECEIVE�QUEUEPRECVQ1ƒBRA„CMDPRO* ŠXDEFƒPTMITQ ŠXREF.S�TMITQ ŠXREFƒMEMOFFPTMITQ„TST.L‚MEMOFF(A3)ŠBNE.S‚PTMITQ1 ŠBSR„NEWPAGE ŠBSR„TMITQPTMITQ1ƒBRA„CMDPRO* ŠXDEFƒPUST ŠXREF.S�USTBLPUST†BSR„NEWPAGE%ŠBSR„USTBLŽPRINT�USER�SEMAPHORE�TABLE ŠBRA„CMDPRO* ŠXDEFƒPSYSPŠXREF.S�SYSPARMPSYSP…BSR„NEWPAGE$ŠBSR„SYSPARMŒPRINT�SYSTEM�PARAMETERS ŠBRA„CMDPRO* ŠXDEFƒPCCBSŠXREF.S�CRCCBS-PCCBS…BSR„CRCCBS�PRINT�CHANNEL�CONTROL�BLOCKS ŠBRA„CMDPRO* ŠXDEFƒPTIATŠXREF.S�CTRAPASGPTIAT…BSR„NEWPAGE*ŠBSR„CTRAPASG‹PRINT�TRAP�ASSIGNMENT�TABLES ŠBRA„CMDPRO* ŠXDEFƒPMAP ŠXREF.S�PRMAPPMAP†BSR„NEWPAGEŠBSR„PRMAPŽPRINT�MEMORY�MAP ŠBRA„CMDPRO* ŠXDEFƒPFREEŠXREF.S�PRFREE-PFREE…LEA„SAVENUM(PC),A1‰PLACE�TO�SAVE�PART�#ŠBSR„CONVAORH‹GET�NUMBERŠCLR.L‚D7‘DEFAULT�#�IS�0 ŠCLR.L‚D0ŠLEA„SAVENUM(PC),A1ŠMOVE.B�(A1),D0ŠCMP.B‚#$30,D0ŒIS�CHAR�<�0?ŠBLT.S‚PFREEG�IF�YES�-�USE�0ŠCMP.B‚#$39,D0ŒIS�CHAR�>�9?ŠBGT.S‚PFREEG�IF�YES�-�USE�0ŠAND.B‚#$0F,D0ŒSAVE�NUMBER�ONLYŠMOVE.L�D0,D7ŽSAVE�CHARŠLEA„SAVENUM(PC),A1ŠMOVE.B�1(A1),D0ŠCMP.B‚#$30,D0ŒIS�CHAR�<�0?ŠBLT.S‚PFREEG�IF�YES�-�USE�0ŠCMP.B‚#$39,D0ŒIS�CHAR�>�9?ŠBGT.S‚PFREEG�IF�YES�-�USE�0ŠAND.B‚#$0F,D0ŒSAVE�NUMBER�ONLY ŠMULUƒ#10,D7 ŠADD.L‚D0,D7(PFREEG„BSR„PRFREE�PRINT�FREE�MEMORY�LIST ŠBRA„CMDPRO* ŠXDEFƒPREADYŠXREF.S�READYLPREADY„BSR„NEWPAGEŠBSR„READYL�PRINT�READY�LIST ŠBRA„CMDPRO* ŠXDEFƒPDELAYŠXREF.S�DELAYLPDELAY„BSR„NEWPAGEŠBSR„DELAYL�PRINT�DELAY�LIST ŠBRA„CMDPRO* ŠXDEFƒPREGSŠXREF.S�PRREGSPREGS…BSR„NEWPAGEŠBSR„PRREGS�PRINT�REGISTERS ŠBRA„CMDPRO ŠPAGE1**************************************************¯**�ALLTBL�-�PRINT�EXEC�TABLES”**¯*1************************************************** ŠXDEFƒALLTBLALLTBL„BSR„NEWPAGEŠBSR„SYSPARMŒPRINT�SYSPAR�TABLEŠBSR„PRSTAK�PRINT�STACKŠBSR„PRREGS�PRINT�REGISTERS*ŠBSR„CTRAPASG‹PRINT�TRAP�ASSIGNMENT�TABLES!ŠBSR„PRMAPŽPRINT�MEMORY�MAP�TABLEŠBSR„TCBCHN�PRINT�TCB�CHAIN"ŠBSR„READYL�PRINT�READY�LIST�CHAIN"ŠBSR„DELAYL�PRINT�DELAY�LIST�CHAINŠBSR„USTBLŽPRINT�USTŠBSR„GSTBLŽPRINT�GSTŠBSR„CRCCBS�PRINT�CCBSŠBSR„TRACSUBŒPRINT�TRACE�TABLE"ŠBRA„CMDPRO�RETURN�TO�COMMAND�LOOPŠEND;ŠTTL„DUMPTRAC.SAˆ-�Crash/System�analysis�-�DUMPANAL/SYSANAL&DUMPTRAC‚IDNTƒ4,2�LIST�THE�TRACE�TABLE ŠXREFƒMBDŠNOLIST*‰INCLUDE�ANALMACR.AIŠINCLUDE�ANALMACR.AIŠLIST2ŠTTL„DUMPTRAC.SAˆ-�Crash�dump�analaysis�-�DUMPANALŠINCLUDE�9995.&.TRACE.EQŠPAGE ŠSECTION�0 BEGDATAƒEQU„*BDˆEQU„*&SAVETIM1‚DC.Lƒ0’SAVE�TIME�TO�CALC�DIFF&SAVETIM2‚DC.Lƒ0’SAVE�TIME�TO�CALC�DIFF6TRCTOP„DS.Lƒ1’Last�entry�+�1�in�trace�table�(mem�addr).TRCNOW„DS.Lƒ1’Entry�we're�doing�now�(mem�addr)**ˆT�R�A�C�EƒT�A�B�L� E*TRTBHD„ENDLNLFŠDC.Bƒ'ˆTRACE�TABLE'ŠENDLINEŠDC.Bƒ'ˆ-----------'ŠENDLINE!ŠFLD„TRHDPR,<'TRCPTRƒ'>,8�POINTER ŠFLD„TRHDLN,<'TRCLNGƒ'>,8�LENGTHŠENDLINE%ŠDC.Bƒ'�CODE‚SR…PC…A0-PC2…A6‡D0†TIME'ŠDC.Bƒ'‹TIME�DIFF'ŠENDLINETRTBHDEƒEQU„*-1**ƒTRACE�TABLE�DETAIL�LINE*Š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‚TIME�DIFFŠDC.Bƒ':XX:XX.XXX'ŠFLD„TRHDDF2,<'�'>,3 TRTBE…EQU„*-1ŠDS.Wƒ0ŠPAGE ŠSECTION�8*#*‚*�*�*ƒPRINT�THE�TRACE�TABLEƒ*�*�** ŠXDEFƒTRACSUB$ŠXREF.S�RDBUF,ERMSG1,ERMSG1E,PDSKERR*ŠXREF.S�CONVTIME,CONVDEC3,NEWPAGE,TRACEBEG*TRACSUBƒBEGSUBŠMOVE.L�TRACEBEG(A3),D0,ŠBEQ„CTTR50�Branch�if�no�trace�table�defined%ŠRD…#8,TRACEBEG(A3),RDBUF(PC),PDSKERR ŠLEA„RDBUF(PC),A5‡BUFFER�ADDRESS ŠBSR„NEWPAGE&ŠMVHEX‚4,TRCPTR(A5),TRHDPR(PC)‚POINTER%ŠMVHEX‚4,TRCLNG(A5),TRHDLN(PC)‚LENGTH%ŠPRINT‚TRTBHD�PRINT�THE�TRACE�HEADING"ŠMOVE.L�TRCPTR(A5),A4†SAVE�POINTER*EŠMOVE.L�TRCLNG(A5),TRCTOP-BD(A6)�One�beyond�last�entry�in�trace�table0ŠMOVE.L�TRACEBEG(A3),A4„Beginning�of�trace�table/ŠADD.L‚#TRCENTRS,A4‡Point�to�1st�physical�entry@ŠMOVE.L�A4,TRCNOW-BD(A6)ƒThis�is�the�entry�we're�currently�doing!ŠWHILE.L�A4��TRCTOP-BD(A6)�DO?�RD…#TRCENTSZ,A4,RDBUF(PC),PDSKERR�Read�the�next�entry�in�trace�LEA„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)‚D0�MOVE.L�TRCTIME(A4),D0…TIME�MOVE.L�D0,D6ŽSAVE�FOR�DIFF�LEA„TRHDTM(PC),A1&�BSR„CONVTIME‹CONV�TO�HRS,MIN,SEC,MSEC�SWAPƒD3‘MILLISECS �MOVE.L�D3,D0 �LEA„1(A1),A1�BSR„CONVDEC3‹CONVERT�TO�DEC �CLR.L‚D0 �MOVE.W�TRCTIM2(A4),D0…MICROSECS�MOVE.L�D0,D7ŽSAVE�FOR�DIFF �LEA„1(A1),A1 �BSR„CONVDEC3‹CONVERT�TO�DECIMAL �MOVE.L�D7,D0+�SUB.L‚SAVETIM2-BD(A6),D0ˆDIFF�IN�MICROSECS �BPL.S‚CTTR34"�ADD.L‚#1000,D0‹ADJUST�IF�NEGATIVE�ADD.L‚#1,SAVETIM1-BD(A6) CTTR34‡MOVE.L�D7,SAVETIM2-BD(A6)�LEA„TRHDDF2(PC),A1 �BSR„CONVDEC3‹CONVERT�TO�DECIMAL �MOVE.L�D6,D0-�SUB.L‚SAVETIM1-BD(A6),D0ˆMILLISEC�DIFFERENCE�MOVE.L�D6,SAVETIM1-BD(A6)�LEA„TRHDDF1(PC),A1%�BSR„CONVTIME‹CONVERT�TO�HRS,MIN,SECS�SWAPƒD3�MOVE.L�D3,D0ŽMILLISEC �LEA„1(A1),A1 �BSR„CONVDEC3‹CONVERT�TO�DECIMAL�MOVE.B�#'�',TRHDDF1-BD(A6) �PRINT‚TRTB�PRINT�THE�TRACE�LINE�MOVE.L�TRCNOW-BD(A6),A4)�LEA.L‚TRCENTSZ(A4),A4„Bump�to�next�entry�MOVE.L�A4,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ƒ=ARG�EDITOR.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ƒ=ARG�EDITOR.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‰TTL�CRT�EDITOR�REL‚4.40�02/22/85�(COPYRIGHT�1982�BY�MOTOROLA,�INC.)MEDIT�IDNT�4,4�CRT�EDITOR�REL‚4.40�02/22/85�(COPYRIGHT�1982�BY�MOTOROLA,�INC.)*ˆINCLUDE�9995.&.TR1.EQ*ˆINCLUDE�9995.&.IOE.EQ*‰NOLISTƒINCLUDE�9995.&.TR1.EQƒINCLUDE�9995.&.IOE.EQ‰LISTB********************************************************************ˆEQUATES�FOR�M68000�CRT�EDITOR*B******************************************************************* CRT MACRO- LEA \1-DATASG(A5),A0 PARAMETER BLOCK ADDRESS�MOVE.L�A1,-(A7)†SAVE�A1* 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 ADDRESS�MOVE.L�(A7)+,A1…RESTORE�A1 BSR CRT\0 DO THE INPUT/OUTPUT ENDM**ŠMACROS�FOR�FMSINT** SFHSCO PARAMETERS: * 1. COMMAND * 2. OPTIONS0*�3.�ADDRESS�REGISTER�(�->‚FHS�PARAMETER�BLOCK�)*>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**‚PRINTER�EQUATES*"LFCHAR EQU $0A LINE FEED CHARACTER¹MÂ?Ê;ÒDÚ5"FFCHAR EQU $0C FORM FEED CHARACTER**‚RECORD�EQUATES*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 FILE4MXRECL�EQU�LINEBL‚MAXIMUM�RECORD�LENGTH�IN�EDIT�FILE**‚FILE�NAME�EQUATES*4FILNML EQU 24 FULLY QUALIFIED FILE NAME FIELD LENGTH%VOLNML EQU 4 VOLUME NAME FIELD LENGTH**‚DATA�BLOCK�EQUATES*BDEFSIZ EQU $108 1 SECTOR FAB/8 SECTOR DATA BLK(DEFAULT ALLOCATION)?DBMAX EQU 20 MAXIMUM DATA BLOCK SIZE FOR EDIT - LARGER FILES TO**‚BE�EDITED�WITH�DEFAULT�SIZE�SCRATCH�FILE*:*‚FMS�LOGICAL�ADDRESSES�FOR�SEGMENTS�TO�BE�USED�AS�BUFFERS*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**‚DATA�SECTION**‚DEFINE�DATA�LAYOUTS*:*‚********************************************************:*‚FMSINT�PARAMETER�BLOCK�(USED�BETWEEN�FMSINT�AND�EDITOR)::*‚*********************************************************1�OFFSET�0‚POINTED�TO�BY�A3�(A0�ON�CALL�TO�FMSINT)*FMSTAT DS.B 1 STATUSFMSCMD DS.B 1 COMMANDFMSREC�DS.L�1…LRN7FMSBUF�DS.L�1…FWA�OF�LINE�BUFFER,�POINTER�TO�FILE�NAMES$FMSRECN�DS.W�1‡#�OF�RECORDS�AFFECTED*FMSEFS�DS.B�1‡EDIT�FILE�STATUS*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* FMSOFS�DS.B�1‡OUTP UT�FILE�STATUS*$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,...AFMSADR�DS.L�1�POINTER�TO�STRING�ADDRESSES�(START�AND�END:‚DS.L�2)'FMSBRK�DS.B�1‚BREAK�=�$FF,�NO�BREAK�=�0*!*‚*******************************!*‚FILENAME1,�FILENAME2�PARAMETERS!*‚********************************;�OFFSET„0„POINTED�TO�BY�FMSBUF�IN�OPENCMD,�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*;OPTIONS�DS.B�1‚OPTIONS�(PASSED�PARAM.�-�THIS�AND�NEXT�BYTE)*‚BIT�INTERPRETATION:AOFSEQ�EQU�1‚BIT�1�SET�=�S�-�SEQUENTIAL�OUTPUT�FORMAT�FOR�NEW�FILEIOFISQ�EQU�2‚BIT�2�SET�=�I�-�INDEXED�SEQUENTIAL�OUTPUT�FORMAT�FOR�NEW�FILEAOFDEF�EQU�0‚BIT�0�SET�=�DEFAULT�FORMAT�(INDEXED/FILENAME1�FORMAT)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'�IS�FOR�OUTPUT�-�RETURN�PARAMETER)*‚DS.W�1�READ/WRITE�CODES‚PAGE**‚***************************‚MAP�FOR�FMSINT�SCRATCH�PAD*‚***************************(�OFFSET�0ƒPOINTED�TO�BY�A6�DURING�FMSINT**‚MAP�FOR�UNINITIALIZED�DATA*"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�=>�NO�CHANGES�ALLOWED�-�'K'�OPTION�ON*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/CLOSE�SOURCE/OUTPUT�FILE�PARAMETER�BLOCK�FOR�FHS�CALLS*3AACFHS DS.B FHSNLN ASSIGN WITH SHARED BUFFER ACCESS*,*‚INPUT/OUTPUT�PARAMETER�BLOCK�FOR�IOS�CALLS*IOPIOS DS.B IOSBLN*3RECBUF�DS.B‚MXRECL�RECORD�BUFFER,�MAX�SOURCE�RECORDCFMSDBL 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*?DATASGL�EQU�*‚END�OF�UNINITIALIZED�DATA�(ZEROED�OUT�BY�OPENCMD) PAGE**‚MAP�FOR�INITIALIZED�DATA*.SRCDBS DS.L 1 SOURCE FILE LOGICAL BUFFER START*;LRECRDƒDS.L�1�LRN�OF�LAST�RECORD�READ(-1�IF�NONE�AVAILABLE)*5STKPTR DS.L 1 STACK POINTER FOR ABORT FROM SUBROUTINE* *‚EXTRACT�BUFFER�PARAMETER�BLOCK*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*"*‚SCRATCH�FILE�FHS�PARAMETER�BLOCK*;EDTFHS…DS.B�FHSNLN�SCRATCH�FILE�ASSIGNED�WITH�SHARED�BUFFER*=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„79�BYTE�RECORD�LENGTH�FOR�CRTIO�AND�FMSIO0EDITLNG‚EQU‚RECLNG„RECORD�LENGTH�OF�DISK�RECORDS0SCRNLNG�EQU�79*20‡#�BYTES�FOR�FULL�SCREEN�OUTPUT*.* CHANGED WHEN NOT DEBUGGING CRTLUN EQU CDFLUN*5CRTLUN‚EQU‚5„CRT�LOGICAL�UNIT�NUMBER=1‚*FOR�DEBUGGING*;************************************************************/*‡CRT�RECORD�FOR�CRT.IN�OFFSETS�BYE�BYTE�NUMBER*;**************** ********************************************%CRTSOT‚EQU‚0†START�OF�TEXT�FOR�PACKETCRTRES‚EQU‚1†RESERVED�BYTECRTCHG‚EQU‚2†CHANGE�FLAG"CRTERM‚EQU‚3†TERMINATING�CHARACTER CRTLINE‚EQU‚4…CURSOR�LINE�NUMBER!CRTCOL‚EQU‚5…CURSOR�COLUMN�NUMBER$CRTDATA‚EQU‚6„COLUMN�1-80�CHARACTERS$CRTEXT‚EQU‚85‚END�OF�TEXT�FOR�PACKET"CRTLEN‚EQU‚86…LENGTH�OF�CRT�PACKET* *‡FMS�EQUATES*#OPENCMD‚EQU‚1ˆFMS-OPEN�FILE�COMMAND$CLOSCMD‚EQU‚2‡FMS-CLOSE�FILE�COMMAND#RDCMD‚EQU‚3ˆFMS-READ�RECORD�COMMAND&DELCMD‚EQU‚4‰FMS-DELETE�RECORD�COMMAND(INSRTCMD‚EQU‚5†FMS-INSERT�RECORD�COMMAND(REPLCMD‚EQU‚6ˆFMS-REPLACE�RECORD�COMMAND+SRCHCMD‚EQU‚7ˆFMS-SEARCH�FOR�STRING�COMMAND+PRNTCMD‚EQU‚8ˆFMS-PRINT�TO�THE�LINE�PRINTER)SAVNCMD‚EQU‚9…FMS-SAVE�IN�NEW�OUTPUT�FILEMRGCMDƒEQU‚10„FMS-MERGE�FILES(MOVCMDƒEQU‚11„FMS-MOVE�TO�EXTRACT�BUFFER*EXTCMDƒEQU‚12„FMS-MOVE�FROM�EXTRACT�BUFFER(DEXTCMD‚EQU‚13„FMS-DELETE�EXTRACT�BUFFER8CKPTCMD‚EQU‚14„FMS-CHECKPOINT-SAVE�CURRENT�FILE�CONTENTS**‡SCREEN�COMMAND�EQUATES*1CLRSCRN‚EQU‚$D8ƒCLEAR�SCREEN�AND�HOME�CURSOR�CODE LOADCUR‚EQU‚$C5ƒLOAD�CURSOR�CODEBLANK„EQU‚$20ƒBLANK6WRAPVAL‚EQU‚19ƒNO.�LINES�AFFECTED�BY�SCREEN�WRAPAROUND*FULSCRN‚EQU‚20„NO.�LINES�OF�FILE�ON�SCREEN0POSONE‚EQU‚$20„CURSOR�POSITION=LINE�AND�COLUMN�1#POS5 EQU $24 SCREEN COLUMN 5 011985&BOTDIS‚EQU‚$CA„SET�BOTTOM�DISPLAY�CODE#TOPDIS‚EQU‚$C9„SET�TOP�DISPLAY�CODE,LEFTDIS‚EQU‚$CBƒSET�LEFT�COLUMN�DISPLAY�CODECOLTWO‚EQU‚$21„SCREEN�COLUMN�2 PROMPT‚EQU‚$3E„SCREEN�PROMPT�'>'"LINE20‚EQU‚$33„SCREEN�LINE�20�CODE"LINE21‚EQU‚$34„SCREEN�LINE�21�CODE"LINE22‚EQU‚$35„SCREEN�LINE�22�CODE"LINE23‚EQU‚$36„SCREEN�LINE�23�CODE"LINE24‚EQU‚$37„SCREEN�LINE�24�CODE,WRTABS‚EQU‚$CE„WRITE�TO�ABSOLUTE�SCREEN�CODESTRT„EQU‚$DD„START�OF�DATA�CODEENDODƒEQU‚$DE„END�OF�DATA�CODESTABSƒEQU‚$DC„SET�TABS�CODELF1…EQU‚$0A„LINE�FEED$HTS…EQU‚$09„HORIZONTAL�TAB�STOP�CODE$CANCELT�EQU‚$18„CANCEL�TAB�STOP�CODEWRAPKEY‚EQU‚19 FULKEY‚EQU„20 DELLINE‚EQU‚$D7ƒDELETE�LINE�CODE INSRTLN‚EQU‚$D6ƒINSERT�LINE�CODE 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ƒ=ARG�EMFGEN.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ƒ=ARG�EMFGEN.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 LF��rrIB SAŠ {oÒrr �OUTPUT�NBR�OF�RECORDS�IN�.SY�FILE'*¦1�-->�DO�NOT�OUTPUT�NBR�OF�RECORDS�IN *¬.SY�FILE ‰PAGE‰DS.W†0**ˆEXECUTABLE�CODE�BEGINS�HERE*EMFGEN:‰LEA‡PB(PC),A6*œA6=PROGRAM�START�BASE�ADDR‰MOVE.L„D2,SAVOL-PB(A6)‰MOVE.L„D2,SYVOL-PB(A6)1*œINITIALIZE�THE�'.SA'�AND�'.SY'�PARAMETER�BLOCKS*œWITH�THE�DEFAULT�VOLUME�NAME‰MOVE.W„D3 ,SAUSRNBR-PB(A6)‰MOVE.W„D3,SYUSRNBR-PB(A6)1*œINITIALIZE�THE�'.SA'�AND�'.SY'�PARAMETER�BLOCKS*œWITH�THE�DEFAULT�USER�NUMBER‰MOVEM.LƒD4-D5,SACATLOG-PB(A6)‰MOVEM.LƒD4-D5,SYCATLOG-PB(A6)1*œINITIALIZE�THE�'.SA'�AND�'.SY'�PARAMETER�BLOCKS*œWITH�THE�DEFAULT�CATALOG�NAME‰CLR.W…TERM_FLG-PB(A6)"*œSET�FLAG�-�TERMINATION�IS�NORMAL'‰MOVE.L„REV_CODE-PB(A6),COUNTBEG-PB(A6)+‰MOVE.L„REV_CODE+4-PB(A6),COUNTBEG+4-PB(A6)'*œINITIALIZE‚REV�CODE�IN�OUTPUT�MESSAGE‰LEA‡ERMSGKEY(PC),A4‰MOVE.L„A4,EDTIOS-PB+IOSSAD(A6)*œA4=START�BUFFER�ADDR *œSET�START�BUFR�ADDR�IN�IOS.EDT‰LEA‡ERMSGEND(PC),A4‰MOVE.L„A4,EDTIOS-PB+IOSEAD(A6)*œA4=END�BUFFER�ADDR*œSET�END�BUFR�ADDR�IN�IOS.EDT‰LEA…STACK(PC),A7$‰FHSCALL�EDTFHS(PC)�OPEN�ERRORMSG.SA ‰BNE…FAULT1&‰FHSCALL�EMFFHS(PC)�DELETE�ERRORMSG.SY*‰BEQ.SƒREADLOOP‚JUMP�IF�FILE�ALREADY�EXIST*šELSE�CREATE�AND�OPEN�THE�FILE$‰MOVE.W‚#FHALLO+FHASGN,EMFFHS-PB(A6)*œALLOCATE�AND�ASSIGN�NEW�FILE/‰FHSCALL�EMFFHS(PC)‚ASSIGN/ALLOCATE�ERRORMSG.SY7‰BNE…FAULT0†JMP�IF�ASSIGN/ALLOCATE�ERROR�FOR�'.SY'�FILE READLOOP:‰CLR.L…ERMSGKEY-PB(A6)‰CLR.L…ERMSGKEY-PB+4(A6)1*œINITIALIZE�THE�KEY�VALUE�FIELD�PRIOR�TO�READING5‰IOSCALL�EDTIOS(PC)�READ�UNKEYED�RECORD�FROM�EDITFILE‰BEQ.SƒFORMKEYƒGOT�ONE!‰CMP.Bƒ#ISTAEOF,IOSSTA(A0)‚EOF?+‰BNE…FAULT0†JMP�IF�READ�ERROR�ON�'.SA'�FILE!EXIT…MOVE.W‚#FHCLOS,EDTFHS-PB(A6)*œCHANGE�FHS�COMMAND�TO�CLOSE$‰FHSCALL�EDTFHS(PC)�CLOSE�INPUT�FILE‰MOVE.W‚#FHCLOS,EMFFHS-PB(A6)*œCHANGE�FHS�COMMAND�TO�CLOSE%‰FHSCALL�EMFFHS(PC)�CLOSE�OUTPUT�FILE‰LEA‡COUNTBEG(PC),A4‰MOVE.L‚A4,EPBPLUGB-PB(A6)/*œA4=USER�START�PLUG�ADDR�SAVED�IN�ERR�PARM�BLK‰LEA‡COUNTEND(PC),A4‰MOVE.L„A4,EPBPLUGE-PB(A6)-*œA4=USER�END�PLUG�ADDR�SAVED�IN�ERR�PARM�BLK‰CLR.LƒD0ˆNULL�ERROR�MESSAGE‰BTSTW…#0,X00400-PB(A6)‰BNE.S…TERMINAT,*œJMP�IF�NBR�OF�RECORDS�IN�'.SY'�FILE�NOT�TO *œBE�OUTPUT‰BSR…ERRGEN„LET�EMH�DO�THE�WORK**2*ˆALL�UTILITIES�WILL�TERMINATE�BY�CALLINGƒERQ.TERM:*ˆHOWEVER�-�AN�INDICATION�AS�TO�WHETHER�THERE�WAS�AN�ERROR5*ˆWHICH�MIGHT�CAUSE�CHAIN�PROCESSING�TO�ABORT�MUST�BE9*ˆSPECIFIED�AT�THE�TIME�OF�THE�TERMINATION.�THE�FOLLOWING8*ˆWILL�DEFINE�THE�TYPE�OF�TERMINATION�THAT�ARE�CURRENTLY *ˆPOSSIBLE:*8*’NORMAL�TERMINATION‚-�IMPLIES�THAT�UTILITY�SUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM�#0,#0**:*’ERROR�TERMINATIONƒ-�IMPLIES�THAT�UTILITY�TERMINATED�WITH *¨AN�ERROR**¦ERQ.TERM�#0,#$C000*<*’WARNING�TERMINATION�-�IMPLIES�THAT�UTILITY�TERMINATED�WITH*¨A�WARNING�(ie.�ASSEMBLY)**¦ERQ.TERM�#0,#$1000***** TERMINAT:‰ERQ.TERM‚#0,TERM_FLG-PB(A6) TERM_FLG:‰DC.W†0‰TERMINATION�FLAG0*œWILL�CONTAIN�THE�APPROPRIATE�TERMINATION�VALUE *œFOR‡GOOD†#0*¦ERROR…#$C000*¦WARNINGƒ#$1000*2FORMKEY‚LEA…ERMSGKEY(PC),A3�START�OF�INPUT�MESSAGE‰CMP.Bƒ#'*',(A3)ƒCOMMENT�ENTRY?!‰BEQ…READLOOP„YES�-�THROW�IT�AWAY ‰BSR‡X10500 ‰BNE‡X05000*œEDIT�OFFSETS�IN�MESSAGE*œJMP�IF�ERROR�EXIST*‰MOVE.L‚IOSLEN(A0),D2‚INPUT�MESSAGE�LENGTH'‰CMP.Wƒ#84,D2„MAX�LENGTH�ERROR�MESSAGE?&‰BLS.SƒLTHOK…MESSAGE�WILL�BE�TRUNCATED'‰MOVE.L‚#84,D2„TO�MAXIMUM�RECORD�LENGTH/‰MOVE.L‚#$2FF,D0ƒERROR�MESSAGE�#�IN�ERRORMSG.SY ‰BSR‡X10000)*œINITIALIZE�KEYVALUE�IN�PLUGPOOL�MESSAGE**œINITIALIZE�ERROR�MESSAGE�PARAMETER�BLOCK‰BSR.SƒERRGEN„TELL�HIM�ABOUT�IT:LTHOK„SUB.Lƒ#1,D2†LENGTH�-�1�IS�OFFSET�OF�LAST�CHAR�IN�MSG1‰ADD.LƒA3,D2†A(LAST�CHAR�IN�INPUT�MSG�FOR�IOSEAD)‰MOVE.L‚#7,D0†LOOP�COUNT�-1‰CLR.LƒD5‰RESULT�REG8KEYSTRIP�MOVE.B‚(A3)+,D1ƒCONVERT�HEX�ASCII�KEY�TO�BINARY‰CMP.Bƒ#'0',D1„LEGAL�HEX�DIGIT?$‰BLO‡X05000„JMP�IF�ILLEGAL�HEX�DIGIT‰CMP.Bƒ#'9',D1„NUMBER�DIGIT?‰BLS.SƒKHEXNUM„YES‰CMP.B…#'A',D1 ‰BLO.S…X05000*œJMP�IF�ILLEGAL�HEX�DIGIT‰CMP.Bƒ#'F',D1 ‰BHI.S…X05000*œJMP�IF�ILLEGAL�HEX�DIGIT%KHEXLET‚ADD.Bƒ#9,D1†ADJUST�FOR�LETTER#KHEXNUM‚AND.Bƒ#$0F,D1„MASK�OFF�ZONE‰LSL.Lƒ#4,D5†PRIOR�RESULT�*�16‰OR.B„D1,D5†INCLUDE�NEW�DIGITCKEYLOOP‚DBF…D0,KEYSTRIP‚CONTINUE�UNTIL�DELIMITER�OR�COUNT�EXHAUSTEDBKHEXITƒMOVE.L‚A3,D3†A3�AT�TAIL�OF�ASCII�KEY�VALUE�IN�INPUT�MESSAGE ‰LSR.Lƒ#1,D3†IS�IT�ODD�ADDRESS?‰BCC.SƒEVENADDRƒNO6‰MOVE.B‚#'�',-(A3)�INSERT�BLANK�AT�FRONT�OF�ERROR�TEXT@EVENADDR�MOVE.L‚D5,-(A3)ƒCONVERTED�BINARY�KEY�OVERLAYS�ASCII�KEY‰LEA…EMFIOS(PC),A07‰MOVE.L‚A3,IOSSAD(A0)�START�OUTPUT�BUFFER�AT�BINARY�KEY7‰MOVE.L‚D2,IOSEAD(A0)�SAME�END�ADDRESS�AS�INPUT�MESSAGE&‰TRAP„#2‰CALL�IOS�TO�WRITE�ERRORMSG.SY‰BEQ.SƒIOOK‡WRITE�SUCCESSFUL2‰BSR.SƒERRGEN…PRINT�WRITE�ERROR�MESSAGE�&�CONTINUE-‰BRA…READLOOPƒDON'T�COUNT�RECORDS�NOT�WRITTENIOOK…LEA…COUNTOUT+4-PB(A6),A1=ASCARRY‚ADD.Bƒ#1,-(A1)ƒINCREMENT�OUTPUT�RECORD�COUNT�IN�ASCII‰CMP.Bƒ#'9',(A1)‚CARRY?1‰BLS…READLOOPƒNO�-�CONTINUE�UNTIL�EOF�ON�EDITFILE%‰MOVE.B‚#'0',(A1)‚REPLACE�ON�OVERFLOW*‰BRA…ASCARRY„AVOIDS�CONVERSION�SUBROUTINES"ERRGENƒMOVEM.L�D0/A0,EPBRD0-PB(A6)!*œREGS�TO�USER�ERROR�MSG�PARM�BLK&‰LEA…EPBRD0(PC),A0ƒA(ERROR�PARM�BLOCK)-‰MOVE.L‚#2,D0†ERROR�MESSAGE�HANDLER�DIRECTIVE‰TRAP„#4‰GENERATE�ERROR�MESSAGE"*œERROR�CONDITIONS�ARE�DISREGARDED ‰CLR.L…D0‰MOVE.L„D0,EPBPLUGB-PB(A6)‰MOVE.L„D0,EPBPLUGE-PB(A6)!*œINITIALIZE�PLUG�POOL�ADDRESS�IN$*œERROR�MSG�PARM�BLOCK�TO�NULL�STATE ‰RTS�RETURN‰PAGEFAULT1:!*œFHS�ASSIGN�ERROR�ON�ERRORMSG.SA‰BSETW…#0,X00400-PB(A6),*œSET�FLAG�-�DO�NOT�OUTPUT�NBR�OF�RECORDS�IN *§'.SY'�FILEFAULT0:‰MOVE.W„#$C000,TERM_FLG-PB(A6)#*œSET�FLAG�-�TERMINATION�WITH�ERROR,‰BSR„ERRGEN†PRINT�FATAL�FAULT�MESSAGE�&�QUIT*œFAULT0�ERRORS&*¦ASSIGN/ALLOCATE�ERROR�ON�ERRORMSG.SY*¦READ�ERROR�ON�ERRORMSG.SA ‰BRA„EXITX05000:‰MOVE.L„#$2FE,D0 *œD0=KEY�VALUE�FOR�ERROR�MESSAGE ‰BSR.S…X10000*œINITIALIZE�PLUG�POOL�MESSAGE"*œINITIALIZE�ERROR�PARAMETER�BLOCK ‰BSR.S…ERRGEN*œOUTPUT�MESSAGE ‰BRA‡READLOOP‰PAGE* *ˆRTNE�TO5*’INITIALIZE�THE�PLUG�POOL�MESSAGE�WITH�THE�KEY�VALUE7*’INITIALIZE�THE�ERROR�MESSAGE�PARAMETER�BLOCK�WITH�THE*œPLUG�POOL�ADDRESSES**ˆCALL†BSR‡X10000**ˆREGISTER�ALTERNATION�-�NONE**X10000:‰MOVEM.LƒA4-A5,-(A7) *œSAVE�REGS‰LEA‡ERMSGKEY(PC),A5*œA5=ADDR�OF�KEY�VALUE‰LEA‡X00100(PC),A4‰MOVE.L„A4,EPBPLUGB-PB(A6)*œA4=START�PLUG�POOL�ADDRESS ‰MOVE.B„#8,D6*œD6.B=LOOP�CONTROLX10100:‰MOVE.B„(A5)+,(A4)+ ‰SUB.B…#1,D6 ‰BNE.S…X10100%*œMOVE�KEY�VALUE�TO�PLUG�POOL�MESSAGE*œJMP�IF�MORE�TO�MOVE‰LEA‡X00199(PC),A5‰MOVE.L„A5,EPBPLUGE-PB(A6)*œA5=END�PLUG�POOL�ADDRESS‰MOVEM.Lƒ(A7)+,A4-A5*œRESTORE�REGISTERS‰RTS‰PAGE** *ˆRTNE�TO$*’EDIT�RECORD�READ�FOR�VALID�OFFSETS**ˆCALL†BSR‡X10500**ˆINPUT*’A3=ADDRESS�RECORD�READ�INTO"*’A6=PROGRAM�BASE�ADDRESS�REGISTER,*’A0=ADDRESS�PARAMETER�BLOCK�FOR�RECORD�READ**ˆOUTPUT *’CONDITIONS-*œNOT�EQUAL�-->�ERROR�EXIST�IN�RECORD�OFFSETS!* EQUAL�-->�RECORD�OFFSETS�ARE�OK**ˆREGISTER�ALTERATION�-�NONE**X10500:‰MOVEM.LƒA3-A5/D0/D2-D5,-(A7) *œSAVE�REGS‰MOVE.L„IOSLEN(A0),D3!*œD3=RECORD�LENGTH�OF�RECORD�READX10600:‰CMP.B…#'\',(A3)+ ‰BNE.S…X10800*œJMP�IF�NOT�SENTINEL�FLAG‰MOVE.B„(A3),D5*œD5=SETINEL�TO�PROCESS‰LEA‡X00200(PC),A4*œA4=ADDR�SENTINEL�TABLE‰MOVE.L„#X00299,D6+*œD6=RELATIVE�NBR�OF�SENTINEL�TABLE�ENTRIESX10700:‰CMP.B…0(A4,D6),D5 ‰BEQ.S…X11000'*œJMP�IF�THIS�IS�SENTINEL�SEARCHING�FOR ‰SUB.L…#1,D6 ‰BPL.S…X10700 *œJMP�IF�MORE�ENTRIES�TO�PROCESSX10800: ‰SUB.L…#1,D3X10810: ‰BNE.S…X10600%*œJMP�IF�RECORD�READ�HAS�MORE�TO�EDITX10900:O*------------------------------------------------------------------------------=*ˆSTATUS�CODES�REFLECTING�EXIT�CONDITIONS�MUST�BE�ESTABLISHEDO*------------------------------------------------------------------------------‰MOVEM.Lƒ(A7)+,D0/D2-D5/A3-A5*œRESTORE�REGS‰RTS*X11000: ‰ASL.L…#2,D6*œD6=NDX�TIMES�4‰LEA‡X00300(PC),A4"*œA4=ADDRESS�SENTINEL�VECTOR�TABLE‰MOVE.L„0(A4,D6),A5 ‰ADD.L…A6,A5*œA5=ADDR�TRANSFER�CONTROL�TO ‰ADD.L…#1,A3 *œA3=ADDR�OF�OFFSET�FOR�SENTINEL‰CMP.B…#'K',D5 ‰BEQ.S…X11100*œJMP�IF�'K'�SENTINEL‰BSR.S…ASC2BIN *œD5=BINARY�CONVERSION�OF�OFFSET ‰BNE.S…X10900*œJMP�IF�INVALID�OFFSETX11100: ‰JMP‡(A5)'*œTRANSFER�CONTROL�TO�ADDRESS�SPECIFIED *œIN�REG�A5**‰PAGE **ˆPROCESS�'C'�SENTINEL*X12000: ‰MOVE.L„D5,D6*œD6=OFFSET�VALUE‰BSR.S…ASC2BIN**œD5=CONVERSION�VALUE�OF�NBR�BYTES�TO�MOVE ‰BNE.S…X10900*œJMP�IF�INVALID�INPUT ‰TST.L…D5 ‰BNE.S…X12100%*œJMP�IF�USER�WANTS�TO�MOVE�SOME�DATA ‰ADD.L…#1,D5 ‰BRA.S…X10900*œFORCE�ERROR�CONDITIONSX12100: ‰ADD.L…D6,D5%*œD5=TOTAL�NBR�BYTES�INVOLVED�IN�MOVE ‰SUB.L…#2,D31*œD3=ADJUSTED�FOR�THE�NUMBER�OF�BYTES�TO�BE�MOVED ‰BRA.S…X30300*‰PAGE**ˆPROCESS�'A'�AND�'D'�SENTINEL*X13000: ‰TST.L…D5 ‰BNE.S…X10900*œJMP�IF�INVALID�OFFSET ‰BRA.S…X30000‰PAGE**ˆPROCESS�'K'�SENTINTEL*X14000: ‰MOVE.L„#4,D5*œD5=LOOP�CONTROLX14100:‰CMP.B…#'0',(A3) ‰BLO.S…X10900‰CMP.B…#'F',(A3)+ ‰BHI.S…X10900*œJMP�IF�KEY�VALUE�ERROR ‰SUB.L…#1,D5 ‰BNE.S…X14100*œJMP�IF�DEY�VALUE�NOT�EDITED ‰SUB.L…#2,D3*œADJUST�FOR�\K�IN�LOOP�COUNT ‰BRA.S…X30400#*œADJUST�FOR�'K'�SENTINEL�KEY�VALUE‰PAGEX30000: ‰ADD.L…#2,D5 *œADJUST�NBR�BYTES�INVOLVED�BY�2X30100: ‰ADD.L…#1,D5 *œADJUST�NBR�BYTES�INVOLVED�BY�1X30200: ‰ADD.L…#1,D5 *œADJUST�NBR�BKTES�INVOLVED�BY�1X30300: ‰CMP.L…#48,D5 ‰BGT.S…X10900#*œJMP�IF�INVALID�OFFSET�INVOLVEMENTX30400: ‰SUB.L…#4,D3(*œADJUST�FOR�SENTINEL�PLUS�OFFSET�(\Sxx)"*œOR�'K'�SENTINEL�KEY�VALUE�(yyyy) ‰BRA.S…X10810‰PAGE* *ˆRTNE�TO+*’CONVERT�A�2�BYTE�DECIMAL�STRING�TO�BINARY**ˆCALL†BSR‡ASC2BIN**ˆINPUT**’A3�=�ADDRS�OF�DECIMAL�STRING**ˆOUTPUT* *’A3�=�A3+2"*’D5.L�=�BINARY�CONVERSION�RESULTS* *ˆCONDITIONS**’NOT�EQUAL�-->�INVALID�INPUT*–EQUAL�-->ƒVALID�INPUTASC2BIN:‰MOVE.L�#2,D2…NBR�CHTRS�PROCESS‰CLR.LƒD5‡RESULT�RETURNED�IN�D5ASCNXTƒCMP.Bƒ#'9',(A3)‰BGT.SƒASCXITƒCHAR�OUT�OF�RANGE‰CMP.Bƒ#'0',(A3)‰BLT.SƒASCXITƒCHAR�OUT�OF�RANGE$ASCDIGƒMULS„#10,D5ƒPRIOR�RESULT�*�10‰MOVE.B‚(A3)+,D0‰AND.Lƒ#$0000000F,D0"‰ADD.LƒD0,D5„RESULT�WITH�NEW�DIGIT ‰SUB.Wƒ#1,D2 ‰BNE.SƒASCNXT ASCXITƒRTS* ‰END„EMFGEN  é PAGE**�FMSINT�1.00�12/12/1979�HBN6**3*‚FMSINT�INFERFACES�THE�EDITOR�TO�FHS�AND�IOS�CALLS*/*‚ON�ENTRY:�A0�=�FMSINT�PARAMETER�BLOCK�ADDRESS *ŒBSR�FMSINT**ŒA5=BASE�ADDRESS�REGISTER�OF�DATA�SEGMENT)*‚ON�EXIT:‚ALL�REGISTERS�UNCHANGED�EXCEPT*ŒD0�=�0�IF�NO�IO�ERROR,�OR+*‘NONZERO�IF�IO�ERROR�(�=�IO�ERROR�STATUS�)*ŒZ-FLAG�SET�ACCORDINGLY*ŒRTS* FMSINT EQU **3*ŠGET�BRANCH�ADDRESS�FOR�FUNCTION�REQUESTED�INTO�A1*7‚MOVEM.L�D1-D7/A0-A6,-(A7)�SAVE�ALL�REGISTERS�EXCEPT�D00‚MOVE.L�A0,A3�KEEP�PARAMETER�BLOCK�ADDRESS�IN�A36‚CLR.L�D0�GET�COMMAND�CODE�FOR�INDEX�INTO�BRANCH�TABLE‚MOVE.B�FMSCMD(A3),D0�. SUB.L #1,D0 . ORG TO 04 CMP.B #NOCMD,D0 CHECK THAT COMMAND NOT OUT OF RANGE2 BCC.S FMSER1 . ERROR, NO SUCH COMMAND CODE (.GE.) CMP.B #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‚BRANCH�ADDRESS�TABLE9 ADD.L D0,A1 FINALLY A1 = SUBROUTINE ADDRESS TO BRANCH TO*0*ŠDO�COMMON�REGISTER�SETUP:�USE�D6�-�D7,�A2�-�A6*ŠSET�RETURN�STATUS�TO�ZERO*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.B�FMSTAT(A3)�CLEAR�STATUS�FOR�GOOD�RETURNS4‚CLR.B�BOFLG(A5)�NO�RECORD�OVERFLOW�YET�FOR�ANY�CALL: MOVE.L A7,STKPTR(A5) SAVE CURRENT STACK POINTER FOR ABORT**ŠBRANCH�TO�SUBROUTINE* JMP (A1) PAGE*7*ŠSUBROUTINE�BRANCH�ADDRESS�TABLE,�FMSCMD�USED�AS�INDEX*FMSBRA BRA OPENCD 1 OPEN FILES�BRA‚CLOSCD�2�CLOSE�FILES�BRA‚RDCD�3�READ�RECORDS�BRA ‚DELCD�4�DELETE�RECORDS�BRA‚INSRTCD�5�INSERT�RECORD�BRA‚REPLCD�6�REPLACE�RECORD�BRA‚SRCHCD�7�SEARCH�FOR�STRING$�BRA‚PRNTCD�8�OUTPUT�TO�LINE�PRINTER,�BRA‚SAVECMD�9�SAVE�PART�OR�ALL�OF�EDIT�FILE)�BRA‚MERGECMD�A�MERGE�FILE�INTO�EDIT�FILE*1?:HB-J9R9ZHb9j5r0z>‚=Š?’KšD¢@ªN²BºGÂ@ÊCÒNÚ7âEêEò6úD7 UBB3�BRA‚DUPMCMD�B�DUPLICATE�AND�MOVE�TO�EXTRACT�BUFFER/�BRA‚EXTRCMD�C�COPY�EXTRACT�BUFFER�TO�EDIT�FILE$�BRA‚DELBCMD�D�DELETE�EXTRACT�BUFFER�BRA‚CKPTCD�E�CHECKPOINT*2NOCMD EQU (*-FMSBRA)/4 NO COMMAND CAN BE .GE. THIS**ŠERROR�RETURNS*HFMSER1 MOVE.L #FSTAIF,D0 INVALID FMSCMD CODE: NOT IMPLEMENTED OR TOO BIG4‚BRA.S�FMSERR�OR�INVALID�PARAMETERS�PASSED�TO�FMSINT3FMSER3 MOVE.L #ISTABO+MN,D0 SOURCE RECORD TOO LARGE*ŠOR�EDIT�FILE�RECORD�TOO�SMALL ‚BRA.S�FMSERR6FMSER4 MOVE.L #ISTARR+MN,D0 INVALID KEY IN SOURCE FILE BRA.S FMSERR=FMSER5 MOVE.L #ISTAIE+MN,D0 INTERNAL ERROR - UNEXPECTED VALUE7FMSERR MOVE.B D0,FMSTAT(A3) SET RETURN CODE FROM FMSINT**ŠRETURN�FROM�FMSINT*FMSOKR TST.B FMSTAT(A3) ERROR?‚BNE.S�FMSOKR1�YESC 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****&*Š**************************************ŽOPENCMD�1.00�12/12/1979�HBN6*&*Š*************************************2*ŠON�ENTRY:�A2�=�FHS�PARAMETER�BLOCK�FOR�EDIT�FILE%*”A3�=�FMSINT�PARAMETER�BLOCK�ADDRESS9*”A4�=�FHS�PARAMETER�BLOCK�ADDRESS�FOR�SOURCE/OUTPUT�FILE"*”A6�=�IOS�PARAMETER�BLOCK�ADDRESS*”D6�=�LINE�BUFFER�SIZE*”D7.B�=�SPACE *”BRA�OPENCMD*-*ŠON�EXIT:‚ALL�REGISTERS�USED/UNKNOWN�EXCEPT:!*”D0�=�LAST�IOS/FHS�ERROR�STATUS,* OPENCD EQU **"*ŠZERO�OUT�UNINITIALIZED�DATA�AREA*) MOVE.L #DATASGL/2,D0 WORD COUNT TO CLEAR MOVE.L A5,A0 STARTING ADDRESSOPEN01 CLR.W (A0)+ SUB.W #1,D0 �BNEƒOPEN01*;*ŠSETUP�TO�ASSIGN�SOURCE�FILE�WITH�SHARED�BUFFER�(FOR�COPY)*E�MOVE.L�#FMSSRA,FHSSAD(A4)‚STARTING�SHARED�BUFFER�ADR�FOR�SOURCE�FILE* *ŠSETUP�TO6*ŠALLOCATE�TEMPORARY�FILE�ON�SAME�VOLUME�AS�INPUT�FILE*0‚MOVE.L�FMSBUF(A3),A0�GET�INPUT�FILE�VOLUME�NAMEE�MOVE.L‚(A0),FHSVOL(A2)�PUT�IT�IN�SCRATCH�FILE�FHS�BLOCK�FOR�ALLOCATE*>*ŠSAVE�LOGICAL�UNIT�NUMBERS�AVAILABLE�TO�FMSINT�FOR�FILENAME1,*ŠFILENAME2,�AND�EDIT�FILE.?*ŠNEED�TWO�LOGICAL�UNIT�NUMBERS:�ONE�FOR�EDIT�FILE�WHICH�IS�THE<*ŠTHE�FILE�THAT�IS�CHANGED�(EDITED)�DIRECTLY�-�IT�CAN�BE�THE@*ŠSOURCE�FILE,�OUTPUT�FILE�OR�A�TEMPORARY�SCRATCH�FILE�(USED�BE--*ŠCAUSE�OUTPUT�FILE�IS�NOT�IN�PROPER�FORMAT).A*ŠONE�LUN�IS�NEEDED�FOR�SOURCE�FILE�TO�COPY�IT�INTO�THE�EDIT�FILEA*ŠWHEN�NECESSARY�-�THE�SOURCE�FILE�IS�CLOSED�AFTER�OPEN.�THE�SAME5*ŠLUN�IS�USED�FOR�THE�OUTPUT�FILE�LUN�DURING�CLOSCMD.*C‚MOVE.W�FMSRECN(A3),EFLUN(A5)�EDIT�FILE�LUN,�SOURCE/OUTPUT�FILE�LUN‚PAGE*A*ŠPART�1:�ASSIGN�SOURCE�FILE�'FILENAME1'�FOR�READ�W/SHARED�BUFFER*C*ŠASSIGN�THE�SOURCE�FILE�(AND�ALLOCATE�IF�NECESSARY)�WITH�EXCLUSIVE5*ŠREAD�ACCESS�(SINCE�MAY�NEED�TO�COPY�INTO�EDIT�FILE);*ŠDETERMINE�ATTRIBUTES�FOR�NEW�FILE�IF�NEED�TO�ALLOCATE�ONE*K‚SFHSCO�FHASGN,FOPER+FOPABF+FOPADR,A4ƒASSIGN�EXCLUSIVE�READ�W/SHARED�BUFFERA 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.W�OPTIONS(A1),D4�GET�OUTPUT�FILE�OPTIONS‚(KEEP�IT�IN�D4) 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‚BSR�ASAFIL�ASSIGN�(�ALLOCATE�IF�NON-EXISTENT�FILE�NAME�)ŠBNEƒOPNERR�IO�ERROR?*+*ŠSAVE�SOURCE�FILE�ATTRIBUTES�FOR�LATER�USE*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.L�D6�KEEP�'FILENAME1'‚KEY�LENGTH 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.W�FHSLRL(A4),D2‰RECORD�SIZE�TOO�LARGE CMP.W #MXRECL,D2 BGT FMSER3 YES* MOVE.W D2,SRCRCZ(A5) NO, SAVE RECORD SIZE MOVE.W D2,OUTRCZ(A5) .**>‰CLR.B�FMSOFS(A3)�SET�SAVE�OUTPUT�FILE�STATUS�FOR�NOW�(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.B�D1�. BEQ.S OPEN20 YES' MOVE.L #FSTANNM,D0 NO, NEW SOURCE FILE= MOVE.B D1,FMSOFS(A3) DELETE IT IF ABORT BEFORE SAVE (OFSDEL) TST.B KEEP(A5) K-OPTION ON? BEQ.S OPEN20 NO-�MOVE.B�#FSTANNM,FMSTAT(A3)‚NEW�NAME�IS�ERROR1OPENDLƒSFHSCO�FHCLOS+FHDELT,0,A4‚DELETE�FILENAME1 ‚FHSCALL�(A4)‚BNE�FMSRET�IO�ERROR%‚BRA�FMSABRT�RETURN�AND�RESTORE�STACK@OPEN20 MOVE.B D0,FMSTAT(A3) RETURN SOURCE FILE STATUS FOR EDITOR*:*ŠNOW�HAVE�FILENAME1�ALLOCATED�FOR�READ�W/SHARED�BUFFER�ON<*ŠOSLUN�AND�FMSOFS�=�0�AND�FMSTAT�=�FSTADNM�IF�OLD�FILENAME18*ŠELSE�FMSOFS�=�1�AND�FMSTAT�=�FSTANNM�FOR�NEW�FILENAME1* PAGE*2*ŠPART�2:�ASSIGN�'FILENAME2'�(IF�GIVEN)�FOR�OUTPUT*6*ŠDETERMINE�IF�OUTPUT�IS�TO�BE�DIRECTED�TO�'FILENAME2'A*ŠA1�->�FILENAME1,�FILENAME2,�D1�=�0�IF�OLD,�=�1�IF�NEW�FILENAME1*ŠD4�=�OUTPUT�FILE�OPTIONS*H�MOVE.L�#FMSDBA,FHSSAD(A4)…SET�SHARED�BUFFER�START�ADDRESS�FOR�EDIT�FILE8 CLR.B OFSTAT(A1) SET 'FILENAME1' AS OUTPUT FILE FOR NOW&�LEA�FLNM2(A1),A1†OUTPUT�TO�FILENAME2? MOVE.L A1,A0 .(‚MOVE.L�#FILNML/2,D0�.�TEST�IF�NULL�NAMEOPEN25 TST.W (A1)+ .4�BNE.S�OPEN30‚.�SOMETHING�THERE,�SO�TRY�TO�ASSIGN�IT�SUB.W�#1,D0‚. �BNE�OPEN25„.,�BSRƒTSTFTP�NO,�CHECK�FILENAME1�FILE�TYPE�OK,�BEQ.S�OPEN31‚'FILENAME1'�IS�THE�OUTPUT�FILEOPNER0‡BRAƒOPNERRŒERROR"OPEN30 TST.B KEEP(A5) K-OPTION ON?'‚BNE.S�OPEN37�YES,�FILENAME2�IS�IGNORED TST.B D1 NEW FILENAME1?�BEQ.S‚OPEN32�NO+‚LEA�IGNRF2(PC),A0�START�ADDRESS�OF�MESSAGE8‚MOVE.L�A0,IOSSAD(A6)�YES,�SEND�IGNORE�FILENAME2�MESSAGE)‚LEA�IGNRFN(PC),A0�ENS�ADDRESS�OF�MESSAGE‚MOVE.L�A0,IOSEAD(A6)�. BSR CRTMGR GET RESPONSE BNE.S OPNER0 ERROR*OPEN31 BRA OPEN50 FILENAME1 IS OUTPUT FILE*<*ŠOUTPUT�TO�FILENAME2:�DETERMINE�ATTRIBUTES�FOR�FILE�IN�CASE*ŠHAVE�TO�ALLOCATE�IT*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‹SFATTR�FOPISD,VRLFIL,DEFSIZ,KEYSIZ,A4�INDEXED�WITH�NO�LINE�NUMBERS? BTST #OFISQ,D4 .$ BNE.S OPEN36 YES, GO OPEN FILENAME2DˆAND.W�#-FFTBIT-1,FHSOPT(A4)�NO,�SEQUENTIAL�-�CLEAR�OTHER�FILE�TYPES4ŠSFATTR�FOPSEQ,VRLFIL,DEFSIZ,0,A4�AND�SET�SEQUENTIAL.ƒBTST�#OFSEQ,D4�WAS�SEQUENTIAL�FILE�REQUESTED?(OPEN36�BNEƒOPEN40�YES,�GO�OPEN�FILENAME2 BRA FMSER5 NO, ERROR*!*ˆK-OPTION�AND�FILENAME2�IS�GIVEN*-OPEN37 LEA KPIF2(PC),A0 MESSAGE START ADDRESS�MOVE.L‚A0,IOSSAD(A6))‚LEA�KPIF2N(PC),A0�END�ADDRESS�OF�MESSAGE‚MOVE.L�A0,IOSEAD(A6)+‚BSR.S�CRTMGR�SE ND�MESSAGE�AND�GET�RESPONSE‚BNE�OPNER0�IO�ERROR'‚BRA�OPEN50�CONTINUE�-�IGNORE�FILENAME2 PAGE* *ŠSUBROUTINE:A*ŠTSTFTP�TESTS�THAT�FILE�TYPE�IS�OK�AND�GIVES‚'OUTPUT�FILE�OPTION5*‘IGNORED'�MESSAGE�IF�TYPES�DON'T�MATCH�AND�WAITS�FOR*‘RESPONSE�'Y'�OR�'N'#*‘ON�RETURN�D0�=�0�IF�OK�ELSE�ERROR-*›BRA�FMSABRT�IF�USER�WANTS�TO�QUIT,�ELSE�RTS* TSTFTP EQU *# MOVE.W FHSOPT(A4),D0 GET FILE TYPE AND.W #FFTBIT,D0 ." CMP.W #FOPSEQ,D0 SEQUENTIAL FILE?�BEQƒTSTF04�YES CMP.W #FOPCON,D0 CONTIGUOUS? BNE.S TSTF01 NO/ MOVE.B #FSTAFT,FMSTAT(A3) YES, FILE TYPE ERROR BRA.S SUBAB00/TSTF01ƒBTST�#OFSEQ,D4�WANTED�SEQUENTIAL�OUTPUT?TSTF02 BNE.S TSTF03 YES CLR.L D0 NO, FILE TYPE OK RTS TSTF03 EQU *(‚LEA�IGNROP(PC),A0�MESSAGE�START�ADDRESSH‚MOVE.L�A0,IOSSAD(A6)�NO,�SQUIRT�MESSAGE�TO�TELL�USER�THAT�OPTION�IGNORE‚LEA�IGNRND(PC),A0�END�ADDRESS‚MOVE.L�A0,IOSEAD(A6)�.* *ŠWRITE�MESSAGE�AND�GET�RESPONSE**0CRTMGR EQU * CRT MESSAGE AND RESPONSE SUBROUTINE*%‚MOVE.B�#LDFLUN,IOSLUN(A6)�MSG�TO�CRT CRTM10 EQU *‚SIOSCO�IOWRIT,IOPIMG,A6‚IOSCALL�(A6)‚WRITE BNE.S CRTRTS* ‚LEA�RECBUF(A5),A0�READ�RESPONSE 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 YESE�CMP.B�#FSTANNM,FMSTAT(A3)‚INPUT=NOT�Y,�QUIT�-�DELETE�NEW�SOURCE�FILE�BNE.S‚SUBAB0„NOT�NEW%�MOVE.B�#-1,FMSTAT(A3)‚SET�ABORT�CODE BRA OPENDL AND DELETE NEW FILE+SUBAB0ƒMOVE.B�#-1,FMSTAT(A3)ƒSET�ABORT�CODESUBAB00‚BRA�FMSABRT 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**ŠOUTPUT�TO�FILENAME2:@*ŠASSIGN�'FILENAME2'�FOR�EXCLUSIVE�READ/WRITE�WITH�SHARED�BUFFER@*ŠAND�OVERWRITE�SINCE�IT�IS�POSSIBLE�IT�WILL�BE�EDITED�DIRECTLY;*ŠUSE�EDIT�FILE�LUN*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 .A�MOVE.B‚EFLUN(A5),D0�USE�EDIT�FILE�LUN�FOR�NOW�(A0�->�OUTPUT�FILE7�BSR„ASAFIL�ASSIGN�(ALLOCATE�IF�NON-EXISTENT�FILENAME2)OPN4ER BNE OPNERR ERROR(�BSRƒTSTFTP�CHECK�FILENAME2�FILE�TYPE�OK BNE.S OPN4ER IO ERROR MOVE.L FMSBUF(A3),A1 MOVE.L #FSTADNM,D0 TST.B D1 NEW OUTPUT FILE?;�BEQ.S�OPEN45‚NO,�LEAVE�OUTPUT�FILE�STATUS�AS�IS�(OLD�FILE)J MOVE.B D1,FMSOFS(A3) YES, DELETE OUTPUT FILE IF ABORT BEFORE SAVE, OFSDEL2�MOVE.L�#FSTANNM,D0‰AND�SET�NEW�OUTPUT�FILE�STATUS2OPEN45 MOVE.B D0,OFSTAT(A1) SET 'FILENAME2' STATUS*>*ŠCHECK�TO�SEE�IF�USER�WANTS�TO�OVERWRITE�EXISTING�'FILENAME2'* TST.B D1 NEW FILE? BNE.S OPEN50 YES, SKIP CHECK(‚LEA�OVRMSG(PC),A0�MESSAGE�START�ADDRESS#‚MOVE.L�A0,IOSSAD(A6)�MESSAGE�START‚LEA�OVRMND(PC),A0�END�ADDRESS!�MOVE.L�A0,IOSEAD(A6)†MESSAGE�END*�BSRƒCRTMGR�WRITE�MESSAGE�AND�GET�RESPONSE 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*ŠPART�3:�DETERMINE�FILE�TO�BE�EDITED�-�FILENAME1�OR�2�OR�SCRATCH.*>*ŠNOW�HAVE�'FILENAME1'�ASSIGNED�FOR�EXCLUSIVE�READ�WITH�SHAREDE*ŠBUFFER,�'FILENAME2',�IF�GIVEN,�FOR�EXCLUSIVE�READ/WRITE�WITH�SHARED?*ŠBUFFER�AND�OVERWRITE�OPTIONS.�DETERMINE�NEXT�IF�NEED�TO�ALLO-=*ŠCATE�SCRATCH�EDIT�FILE�OR�IF�CAN�EDIT�OUTPUT�FILE�DIRECTLY.&*ŠD2�=�SOURCE�FILE�TYPE,�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.S�OPEN53…DUPL.�KEYS�=>�ANY�KEY�SIZE�IS�OK/ TST.B FHSKEY(A4) OTHERWISE MUST HAVE NULL KEYS BEQ.S OPEN53 OK MOVE.L #FSTAKY,D0 KEY ERROR �BRA�FMSERR‚.+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ƒOPEN75�NO,�FILENAME2�IS�FOR�OUTPUT-OPEN55†CMP.W�#FOPSEQ,D2�YES,�SEQUENTIAL�FILE? BNE.S OPEN70 NO6 TST.B KEEP(A5) YES, OK TO EDIT DIRECTLY IF 'K' OPTION" BNE.S OPEN71 GO CHECK FILE FORMAT*>*ŠCASE�1:�'FILENAME1'�FOR�OUTPUT�AND�IT'S�SEQUENTIAL;�ALLOCATE4*ŠSCRATCH�FILE�FOR�EDIT�AND�COPY�'FILENAME1'�INTO�IT* OPEN60 EQU * TST.B KEEP(A5) K-OPTION? BEQ.S OPEN61 NO1‚MOVE.B�#FSTAFT,FMSTAT(A3)�YES,�FILE�FORMAT�ERROR BRA FMSABRT QUITIOPEN61�SFHSCO�FHASGN,FOPEREW+FOPABF+FOPADR,A2‚NEED�TO�ASSIGN�SCRATCH�FILED‹SFATTR�FOPISD,VRLFIL,DEFSIZ,KEYSIZ,A2�ATTRIBUTES�IF�NO�LINE�NUMBERS?‚MOVE.B�EFLUN(A5),FHSLUN(A2)�USE�EDIT�FILE�LUN�FOR�SCRATCH�FILE3†FHSCALL�(A2)�ASSIGN�AND�ALLOCATE�SCRATCH�EDIT�FILE BNE.S OPNER14 MOVE.B #-1,EFFLG(A5) FLAG SCRATCH FILE AS EDIT FILE?‚BRA�OPN100�GO�COPY�'FILENAME1'�INTO�SCRATCH�FILE�(RECORD�COPY) PAGE*E*ŠCASE�2:�'FILENAME1'�FOR�OUTPUT�AND�IT'S�INDEXED:�REOPEN�IT�FOR�EDIT3*ŠIF�IT�IS�IN�PROPER�FORMAT�(ELSE�USE�SCRATCH�FILE)*+OPEN70 CMP.W #FOPISD,D2 DUPLICATE KEY FILE?# BNE OPEN60 NO, GO USE SCRATCH FILE(�TST.BŠFHSKEY(A4)�YES,�CKECK�KEY�SIZE�OK0 BNE OPEN60 NOT COMBATIBLE - GO USE SCRATCH FILE.OPEN71ƒTST.W�FHSLRL(A4)�MUST�HAVE�VRL�FILE�TOO& BNE OPEN60 FRL => GO USE SCRATCH FILE= CMP.B #DBMAX,FHSDAT(A4) IF TOO LARGE BLOCKS USE SCRATCH FILE BHI OPEN60 .0ŒSFHSCO�FHCLOS,0,A4�FILE�OK,�CLOSE�SO�CAN�REOPEN FHSCALL (A4) BNE.S OPNER1C‚SFHSCO�FHASGN,FOPEREW+FOPABF+FOPADR,A4�ASSIGN�FOR�EDITING�DIRECTLY. 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*ŠCASE�3:�FILENAME2�FOR�OUTPUT;�SEQUENTIAL=>GET�SCRATCH�FILE�FOR�EDIT/*ŠAND�COPY�'FILENAME1'�INTO�IT,�CLOSE�FILENAME2*-OPEN75 CMP.W #FOPSEQ,D1 FILENAME2 SEQUENTIAL? BNE.S OPEN90 NO0OPEN80…SFHSCO�FHCLOS,0,A4�YES,�CLOSE�'FILENAME2' FHSCALL (A4)OPNER1†BNE�OPNERRƒIO�ERROR*>*ŠIF�'FILENAME1'�IS�IN�COMBATIBLE�FORMAT�ALLOCATE�SCRATCH�FILE8*ŠWITH�'FILENAME1'�ATTRIBUTES�AND�DO�BLOCK�BY�BLOCK�COPY*7‚MOVE.B�#-1,EFFLG(A5)�FLAG�SCRATCH�FILE�IN�USE�FOR�EDIT:‚MOVE.B�EFLUN(A5),FHSLUN(A2)�USE�EDIT�FILE�LUN�IN�ANY�CASEA‚SFHSCO�FHASGN,FOPEREW+FOPABF+FOPADR,A2�ASSIGN�WITH�SHARED�BUFFER= CMP.W #FOPISD,D2 FILENAME1 HAS SAME FILE TYPE AS EDIT FILES? BNE.S OPEN85 NO8�TST.B‚D6‚KEY�SIZE�MUST�BE�EQUAL�TO�EDIT�FILE'S�KEY�SIZE 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)�ASSIGN�SCRATCH�FILE�IN�SAME�FORMAT�AS�'FILENAME1' BNE.S OPNER1 IO ERROR% BRA OPN145 GO DO BLOCK BY BLOCK COPY*A*ŠOTHERWISE�ALLOCATE�SCRATCH�FILE�IN�DEFAULT�FORMAT�AND�DO�RECORD*ŠBY�RECORD�COPY*7OPEN85 AND.W #-FFTBIT-1,FHSOPT(A2) CLEAR FILE TYPE BITSEƒSFATTR�FOPISD,VRLFIL,DEFSIZ,KEYSIZ,A2�DEFAULT�ATTRIBUTES�FOR�SCRATCH' FHSCALL (A2) . FILE, ALLOCATE & ASSIGN BNE OPNER1) BRA.S OPN100 GO DO RECORD BY RECORD COPY PAGE*;*ŠCASE�4:�'FILENAME2'�IS�DUPLICATE�KEY�INDEXED,�TRY�TO�EDIT%*ŠDIRECTLY�(COPY�'FILENAME1'�INTO�IT)@*ŠUSE�SCRATCH�FILE�IF�'FILENAME2'�FORMAT�NOT�COMBATIBLE�FOR�EDIT*.OPEN90„CMP.W�#FOPISD,D1…DUPLICATE�KEY�INDEXED?# 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.L�FHSEAD(A4),FMSDBE(A5)�SAVE‚'FILENAME2'�SHARED�BUFFER�END�ADRF‚MOVE.L�FHSSAD(A4),FMSDBS(A5)�SAVE‚'FILENAME2'�SHARED�BUFFER�START�ADR*�TST.B�D6�CHECK�KEY�SIZE�&�DATA�BLOCK�SIZE<�BNE.S�OPN100‚.�DO�RECORD�COPY�SINCE�MIGHT�WANT�TO�DROP�KEYS MOVE.B FHSDAT(A2),D0 . CMP.B FHSDAT(A4),D0 . BNE.S OPN100 . FORMAT NOT SAME0�TST.W�FHSLRL(A2)‚AND�BOTH�MUST�HAVE�VRL�RECORDS�BEQƒOPN145�YES,�DO�BLOCK�COPY PAGEB*ŠPART�4:�COPY�SOURCE�FILE�TO�EDIT�FILE�(EITHER�TO�SCRATCH�FILE�OR*ŠTO�'FILENAME2')*A*ŠCASE�1:�RECORD�BY�RECORD�COPY�(THE�TWO�FILES�ARE�NOT�COMBATIBLE*ŠFOR�A�BLOCK�BY�BLOCK�COPY)*>OPN100�CLR.L†D3�INITIALIZE�FOR�LOGICAL�RECORD�COUNT�(D3�=�LRN)7‚MOVE.L�D4,TEMP(A5)�SAVE�OPTIONS�FOR�RECORD�SUBROUTINES*A*ŠREAD�1ST�BLOCK�OF�SOURCE�FILE�TO�POSITION�TO�1ST�RECORD�OF�FILE*- 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 ADDRESS2�ADD.L�IOSLEN(A0),A2ŠSET�SHARED�BUFFER�LOGICAL�END SUB.L #1,A2 . MOVE.L A2,SRCDBL(A5)9 BSR SGETCRC GET CURRENT RECORD POINTER AND RECORD LENGTH BRA.S OPN110*4*ŠREAD�NEXT�RECORD�FROM�SOURCE�FILE�-�IGNORE�ANY�KEY*-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,D0�YES,�RECORD�NOT�AVAILABLE�=>�INTERNAL�ERROR ‚BEQ�FMSER5 BRA.S OPN140 EOF OR ERROR+OPN115 MOVE.L A0,A2 STARTING RECORD ADDRESS*@*…CHECK�RECORD�FOR�SPACES�AND�DELETE�TRAILING�SPACES�FROM�RECORD*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.S�OPN130‚NOH MOVE.W #IOPRAN+IOPASC+IOPFOR,D6 YES, WRITE FORMATTED TO COMPRESS SPACES BRA.S OPN131DOPN130�MOVE.L�D0,D1ƒSAVE�CURRENT�RECORD�LENGTH�IN�CASE�LAST�NONBLANK!OPN131�ADD.L�#1,D0ƒNEXT�CHARACTER SUB.W #1,D4 BNE OPN125 MOVE.L D1,D4 BLANK LINE? BNE.S OPN135 NO! MOVE.L #1,D4 YES, SAVE ONE SPACE**ŠWRITE�RECORD�TO�EDIT�FILE*/OPN135�MOVE.B‚EFLUN(A5),D0�WRITE�INTO�EDIT�FILE+ BSR WRITLRO WRITE WITH OPTIONS GIVEN IN D6- BEQ.S OPN105 GO COPY NEXT RECORD IF NO ERROR"OPNERR BRA FMSRET IO ERROR, RETURN**ŠCOPY�DONE�OR�COPY�NEXT�RECORD*(OPN140 CMP.B #ISTAEOF,D0 AT END OF FILE? BEQ.S OPN141 YES CMP.B #ISTARN,D0 .OPN141„BEQƒOPN170�YES' CMP.B #ISTABO,D0 NO, RECORD TOO LARGE? BEQ FMSER3 YES, ABORT&OPN142ƒBRA.S�OPNERR�NO,�OTHER�IO�ERROR***ŠCASE�2:�COPY�BLOCK�BY�BLOCK�TO�EDIT�FILE*4OPN145 MOVE.B OSLUN(A5),FHSLUN(A4) CLOSE SOURCE FILE SFHSCO FHCLOS,0,A4 . FHSCALL (A4) .�BNEƒOPN142�.�IO�ERRORI 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.L�FMSDBS(A5),IOSSAD(A6)�BUFFER�START OPN150 EQU *=‹SIOSCO�IOREAD,IOPBIN+IOPIMG+IOPBLK+IOPNXT,A6�READ�NEXT�BLOCK2 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**ŠDONE�BLOCK�COPY,�OR�IO�ERROR*$OPN155 CMP.B #ISTAEOF,D0 END OF FILE BNE OPNERR NO, IO ERROR  PAGE*A*‡PART�5:�EDIT�FILE�READY,�ESTABLISH�#�OF�RECORDS�IN�IT�AND�CLOSE/*‡SOURCE�FILE�(IF�IT�IS�NOT�EQUAL�TO�EDIT�FILE)* OPN160 EQU *EƒSIOSCO�IOPOST,IOPREC+IOPRAN,A6�POSITION�AT�END�OF�FILE�(GET�EOF�LRN).�MOVE.B�EFLUN(A5),IOSLUN(A6)�USE‚EDIT�FILE�LUN6 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.L�IOSRRN(A6),D3ƒNO,�GET�LAST�LRN�OF�FILE7�BRA.S‚OPN175�AND�RETURN�TO�EDITOR,GO�CLOSE�SOURCE�FILE,OPN165 CMP.B #ISTAEOF,D0 NO RECORDS IN FILE? BNE.S OPNER2 IO ERROR?�BRA.S�OPN175‚RETURN�EMPTY�FILE�TO�EDITOR,�GO�CLOSE�SOURCE�FILE*8*ŠSAVE�LOGICAL�RECORD�NUMBER�OF�LAST�RECORD�IN�EDIT�FILE*-OPN170 SUB.L #1,D3 D3 = LAST LRN OF EDIT FILE1OPN175 MOVE.L D3,EOFLRN(A5) SAVE LAST LRN OF FILE6‚MOVE.L�D3,FMSREC(A3)�RETURN�IT�IN�THE�PARAMETER�BLOCK*1*ŠCLOSE�SOURCE�FILE�(LEAVING�ONLY�EDIT�FILE�OPEN)*)‡TST.B�EFFLG(A5)�SOURCE�FILE�=�EDIT�FILE?G BEQ.S OPN190 YES, LEAVE SOURCE FILE OPEN (SINCE ASSIGNED AS EDIT FILE),ŠMOVE.B�OSLUN(A5),FHSLUN(A4)�'FILENAME1'�LUN)‹SFHSCO�FHCLOS,0,A4‡CLOSE�WITH�NO�OPTIONS FHSCALL (A4) BNE.S OPNER2 ERROR ON CLOSE*@*ŠPART�6:�REOPEN�OUTPUT�FILE�FOR�OVERWRITE�IF�USING�SCRATCH�FILE*ŠAND�RETURN�TO�EDITOR*4OPN190„TST.B�EFFLG(A5)�EDITING�OUTPUT�FILE�DIRECTLY?: BPL.S OPNOKR YES, IT IS ASSIGNED ALREADY AS THE EDIT FILE-�MOVE.B�OSLUN(A5),D0‰NO,�ASSIGN�FOR�OVERWRITE‹SFHSCO�FHASGN,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.S�ASAFIL�OPEN�OUTPUT�FOR�OVERWRITEOPNER2†BNE�OPNERR'OPNOKR BRA FMSOKR GOOD RETURN FROM OPEN PAGE%*Š*************************************ŽASAFIL�1.00�12/12/1979�HBN6*%*Š************************************C*ŠSUBROUTINE�ASAFIL�ASSIGNS�GIVEN�FILE�IF�IT�EXISTS,�ELSE�A�FILE�IS*•ALSO�ALLOCATED***ŠON�ENTRY:�A0�->�FILE�NAME�TO�BE�ASSIGNED2*”A4�->�FHS�PARAMETER�BLOCK;�SETUP�FOR�CALL�EXCEPT)*šFOR�FILE�NAME,�LUN�AND�READ/WRITE�CODES *”D0�=�LUN *”BSR�ASAFIL**ŠON�EXIT:‚ALL�REGISTERS�UNCHANGED�EXCEPT:&*”D0�=�LAST�IOS/FMS�CALL�RETURN�STATUS*™Z-FLAG�SET�ACCORDINGLY%*”D1�=�0�IF�ASSIGNED�AT�FIRST�TRY,�OR.*™1�(�=�OFSDEL�)‚IF�HAD�TO�ALLOCATE�FILE�FIRST*”RTS* ASAFIL EQU **)*ŠMOVE�FILE�NAME�INTO�FHS�PARAMETER�BLOCK*# MOVEM.L A0-A1,-(A7) SAVE REGISTERS MOVE.B D0,FHSLUN(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**ŠSET�READ�AND�WRITE�CODE* TST.W (A0)+ SKIP RESERVED WORD1 MOVE.W (A0)+,FHSWCD(A4) SET READ AND WRITE CODES**ŠTRY�TO�ASSIGN�GIVEN�FILE*- 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*ŠHAVE�TO�ALLOCATE�NEW�FILE�BEFORE�CAN�HOPE�TO�ASSIGN*. MOVE.L #OFSDEL,D1 INDICATE NEW FILE ALLOCATED- OR.W #FHALLO,FHSCMD(A4) TRY TO ALLOCATE FILE�FHSCALL�(A4)ƒAND�THEN�ASSIGN,ASARET MOVEM.L (A7)+,A0-A1 RESTORE REGISTERS RTS PAGE**"*Š**********************************ŽRDCMD�1.00�01/07/79�HBN6*"*Š*********************************/*ŠENTRY�AND�EXIT�CONDITIONS�SAME�AS�FOR�OPENCMD** RDCD EQU ** *ŠINITIALIZE*2 MOVE.L FMSBUF(A3),A1 STARTING LINE BUFFER ADDRESS CLR.L D1/ MOVE.W FMSRECN(A3),D1 GET # OF RECORDS TO READ+‚CLR.W�D2�0�#�OF�RECORDS�TRANSFERRED‚SO�FAR/ MOVE.L FMSREC(A3),D3 LRN OF 1ST RECORD TO READ/ MOVE.L EOFLRN(A5),D4 GET LAST LRN IN EDIT FILE�BMIƒRD40�EMPTY�FILE? �TST.L�D3ƒNO- BMI.S RD35 READ N LAST RECORDS OF FILE IF -11 CMP.L D4,D3 NO, DOES 1ST RECORD REQUESTED EXIST?1�BGTƒRD40�NO,�RETURN�WITH�RECORD�NOT�FOUND�STATUS**ŠGET�ONE�RECORD�AT�A�TIME*"RD01 CMP.L EOFLRN(A5),D3 PAST EOF? BHI.S RD25 YES, DONE READING/�BSR�GETNRC‹NO,�READ�NEXT�RECORD�FROM�EDIT�FILE BEQ .S RD01A CMP.B #-1,D0 MUST CALL POSTRC?RDERR„BNE�FMSRET�NO,�IO�ERROR1�CLR.L�D0…YES,�GET�RECORD�POSITION‚AND�SET�LRECRD; BSR POSTLR BY READING IN BLOCK CONTAINING REQUESTED RECORD�BNE.S�RDERR‚ERROR4RD01A ADD.W #1,D2 INCREMENT # OF RECORDS TRANSFERRED**ŠMOVE�RECORD�TO�LINE�BUFFER*$‚MOVE.W�D6,D5�GET�#�OF�SPACES�TO�PAD 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*-*ŠSPACE�FILL�REST�OF�LINE�BUFFER�IF�NECESSARY*( 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**ŠREAD�NEXT�RECORD*RD15 SUB.L #1,D1 DONE? BEQ.S RD20 YES6 ADD.L #1,D3 NO, READ NEXT RECORD, GET ITS LRN INTO D3RD19‡BRA.S�RD01�.**ŠSET�RETURN�PARAMETERS*+RD20�CLR.L�D0„GOOD�RETURN�UNLESS�FIND�ERROR.…CMP.L�EOFLRN(A5),D3�READ�LAST�RECORD�OF�FILE? BNE.S RD30 NO1RD25�MOVE.L�#ISTAEOF+MN,D0‚YES,�RETURN�EOF�STATUS2‚MOVE.L�EOFLRN(A5),D3�EOF�LRN�FOR�LAST�RECORD�READ3RD30 MOVE.W D2,FMSRECN(A3) RETURN # OF RECORDS READ4 MOVE.L D3,FMSREC(A3) RETURN LRN OF LAST RECORD READ# MOVE.B D0,FMSTAT(A3) RETURN STATUS BRA FMSOKR GOOD RETURN*!*ŠREAD�N�LAST�RECORDS�OF�THE�FILE*.RD35 MOVE.L D4,D0 GET STARTING LRN FOR READING8 CLR.L D3 READ FROM TOP OF FILE IF REQUESTED ALL OR MORE) ADD.L #1,D0 . RECORDS THAN FILE CONTAINS CMP.L D0,D1 . BGE.S RD19 READ FROM TOP?. SUB.L D1,D0 NO, START READING FROM EOFLRN+1-N MOVE.L D0,D3 .†BRAƒRD19�GO�READ*=RD40�MOVE.L�#ISTARN+MN,D0ƒ1ST�RECORD�REQUESTED�DOES�NOT�EXIST BRA.S RD30 RETURN PAGE**ŽGETNRC�1.00�04/09/80�HBN6*>*ŠGETNRC�GETS�NEXT�RECORD�POINTER�IN�SHARED�BUFFER,�READS�NEXT2*‘BLOCK�IF�RECORD�NOT�IN�CURRENT�BLOCK.‚IF�CURRENT7*‘RECORD�DOES�NOT�EXIST�OR�DOES�NOT�IMMEDIATELY�PRECEDE6*‘WANTED�RECORD�A�RECORD�NOT�AVAILABLE�RETURN�IS�MADE.*%*ŠON�ENTRY:�D3�=�LRN�OF�RECORD�WANTED3*”LRECRD�=�LRN�OF�CURRENT�RECORD,�-1�=>�NONE�EXISTS(*”LRECBA�=�CURRENT�RECORD�BUFFER�ADDRESS0*ŠON�EXIT:‚D0�=�0�IF�RECORD�POINTER�RETURNED,�OR *™-1�IF�RECORD�NOT�AVAILABLE,�OR*™ERROR�CODE�OTHERWISE0*”D4�=�RECORD�LENGTH�(ANY�KEY�SKIPPED)�IF�D0�=�0*™TRUNCATED�IF�TOO�LONG8*”A0�->�RECORD�(ANY�KEY�SKIPPED)�IF�D0�=�0,�ELSE�UNKNOWN*#SGETNRC�EQU�*„READ�FROM�SOURCE�FILE/ 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.B�SRCKYZ(A5),D7…SKIP�ALL�SOURCE�KEYS% 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* GETNRC�EQU�*‡READ�FROM�EDIT�FILE/ MOVEM.L D1/D6-D7/A1-A2/A4,-(A7) SAVE REGISTERS)�CLR.L�D6…RECORD�LENGTH�=�0�FOR�EDIT�FILE$�CLR.L�D7…KEY�SIZE�=�0�FOR�EDIT�FILE% 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)**ŠRECORD�POSITION�AVAILABLE?*2GETN00„MOVE.L�LRECRD(A5),D1�GET�CURRENT�RECORD�LRN 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,�GET�RECORD�POINTER*,�MOVE.L�LRECBA(A5),A0…CURRENT�RECORD�POINTER 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�*‰SKIP�ANY�KEY 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.S�GETRTN13GETRTN CMP.W #MXRECL,D4 TRUNCATE RECORD IF TOO LONG‚BLE.S�GETRTN1�OK‚MOVE.L�#MXRECL,D4.‚MOVE.B�#ISTABO,BOFLG(A5)�FLAG�BUFFER�OVERFLOW*GETRTN1 TST.L D0 RESTORE RETURN CONDITIONS2‚MOVEM.L�(A7)+,D1/D6-D7/A1-A2/A4�RESTORE�REGISTERS RTS!GETN05�CLR.L�D1ˆCLEAR�ANY�GARBAGE(‡MOVE.W�(A0)+,D1�GET�NEXT�RECORD�POINTER& 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.GETN11�MOVE.L�A0,LRECBA(A5)ƒSAVE�IN�CASE�IT�IS" CMP.L (A1),A0 PAST END OF BUFFER? BHI.S GETN15 YES( MOVE.W (A0)+,D4 NO, NEXT RECORD EXISTS? BNE.S GETNOK YES*?*ŠNEXT�RECORD�IN�NEXT�DATA�BLOCK,�READ�BLOCK�INTO�SHARED�BUFFER* 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ƒGETRER�ERROR* 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) .GETN20�TST.W�D6‰VRL�FILE? BEQ.S GETN11 YES�BRAƒGETNOK�NO,�FRL/GETNIE MOVE.B #ISTAIE,FMSTAT(A3) INTERNAL ERROR CLR.L D0 BRA FMSABRT ABORT PAGE*#*Š***********************************�SGETCRC�1.00�04/09/80�HBN6*#*Š**********************************4*ŠSGETCRC�GETS�CURRENT�RECORD�POINTER�AND�ITS�LENGTH*%*ŠON�ENTRY:�D3�=�LRN�OF�RECORD�WANTED/*ŠON�EXIT:‚SAME�RETURN�CONDITIONS�AS�FOR�GETNRC*<*ŠNOTE:�PUSH�SAME�REGISTERS�ON�STACK�AS�IN�GETNRC�SINCE�WILL *�JUMP�THERE**"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.W�SRCRCZ(A5),D6 LEA SRCDBS(A5),A2 LEA SRCDBE(A5),A4 LEA SRCDBL(A5),A1 MOVE.B OSLUN(A5),IOSLUN(A6)**ŠCHECK�NEXT�RECORD�EXISTS*+†CMP.L�LRECRD(A5),D3�CURRENT�RECORD�EXISTS?�BNEƒGETRET�NO7 MOVE.L LRECBA(A5),A0 GET CURRENT RECORD BUFFER ADDRESS" BRA.S GETN20 GO GET RECORD LENGTH PAGE*ŽDELCMD�1.00�01/07/79�HBN6**/*ŠENTRY�AND�EXIT�CONDITIONS�SAME�AS�FOR�OPENCMD* DELCD EQU ** *ŠINITIALIZE*&‚TST.B�KEEP(A5)�ERROR�IF�'K'�OPTION�ON‚BNE�FMSABMN�. 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**ŠDELETE�ONE�RECORD�AT�A�TIME*.‹SIOSCO�IODELR,IOPRAN,A6�DELETE�RANDOM�LOGICAL2�MOVE.B‚EFLUN(A5),IOSLUN(A6)�DELETE�FROM�EDIT�FILE DEL00 EQU *†IOSCALL�(A6)�DELETE$ BNE.S DEL10 IO ERROR OR END OF FILE**ŠDELETE�NEXT�RECORD*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‚GO�DELETE�NEXT�RECORD BNE DEL00*/*ŠSET�EOF�STATUS�IF�DELETED�LAST�RECORD�OF�FILE*1DEL05‚MOVE.L�EOFLRN(A5),D0�GET�LRN�OF�LAST�RECORD> CMP.L FMSREC(A3),D0 LAST RECORD DELETED IF EOFLRN .LT. FMSREC% BLT.S DEL20 LAST RECORD STILL THERE? BRA.S DEL15 NO'DEL10 CMP.B #ISTAEOF,D0 AT END OF FILE? BNE FMSRET NO, IO ERROR9DEL15 MOVE.B #ISTAEOF,FMSTAT(A3) YES, DELETED LAST RECORD**ŠSET�RETURN�PARAMETERS*7DEL20 MOVE.W D2,FMSRECN(A3) RETURN # OF RECORDS DELETED: MOVE.L EOFLRN(A5),FMSREC(A3) RETURN LAST LSN IN EDIT FILE: MOVE.B #EFSCHG,FMSEFS(A3) SET EDIT FILE STATUS AS CHANGED�BRA�FMSOKR‚GOOD�RETURN 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.S�CLS01‚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�(�AND�DELETE�)�SCRATCH�FILE*/CLS05„MOVE.B‚EFLUN(A5),FHSLUN(A4)�EDIT�FILE�LUN‹SFHSCO�FHCLOS,0,A4�CLOSE FHSCALL (A4)CLSERRƒBNE�FMSRET�IO�ERRORCLSRET BRA FMSOKR GOOD RETURN PAGE*#*‹***********************************�CKPTCMD�1.00�7/9/80�HBN6*#*‹********************************** CKPTCD EQU *% TST.B KEEP(A5) SKIP IF 'K' OPTION ON ‚BNE�FMSOKR*‚CLR.W�FMSRECN(A3)�SET�NO�RENAME�EXTENSION?CKPT00 MOVE.B EFLUN(A5),FHSLUN(A4) DO A CHECKPOINT ON EDIT FILE MOVE.W #FHCKPT,FHSCMD(A4) ‚FHSCALL�(A4)‚BNE�FMSRET�I/O�ERROR�RETURN*‚CLR.W�CHKPCT-DATASG(A5)�CLEAR�THE�COUNTER‚BRA�FMSOKR�GOOD�RETURN PAGE**$*Š************************************ŽREPLCMD�1.00�01/08/80�HBN6*$*Š***********************************/*ŠENTRY�AND�EXIT�CONDITIONS�SAME�AS�FOR�OPENCMD* REPLCD EQU **/*ŠSETUP�TO�DO�ABOUT�THE�SAME�CODE�AS�FOR�INSERT*&‚TST.B�KEEP(A5)�ERROR�IF�'K'�OPTION�ON‚BNE�FMSABMN�.5‹SIOSCO�IOUPDR,IOPRAN,A6�UPDATE�RANDOM�LOGICAL�RECORD+ CLR.L D1 FLAG TO REPLACE INSTEAD OF INSERT+ƒTST.L‚EOFLRN(A5)�EOFLRN�=�-1�=>�EMPTY�FILE/ BMI INSR35 RETURN RECORD DOES NOT EXIST STATUS‚BRA.S�INSREPL‚GO�REPLACE*;*ŠLATER�ADD�CODE�TO�REPLACE�RECORD�WITH�BCT�LT�OLD�RECORD'S;*ŠBCT�AND�OLD�RECORD'S�BCT�>�80�(LEAVE�OLD�RECORD�BCT�ALONE*ŠJUST�OVERLAY�START�OF�RECORD)=*ŠNOTE:�NOW�CAN�ONLY�HANDLE�RECORDS�OF�UPTO�80�CHARACTERS�AND5*ŠTHE�EDITOR�WILL�TRUNCATE�LONGER�RECORDS�IF�UPDATED.**!*Š*********************************�INSRTCMD�1.00�01/07/80*!*Š********************************6*ŠENTRY�AND�EXIT�CONDITIONS�SAME�AS�FOR�OPENCMD‚EXCEPT8*ŠON�ENTRY:�D1�=�0‚IF�INSREPL�ENTRY�ELSE�WILL�SET�D1�=�1* INSRTCD EQU ** *ŠINITIALIZE*&‚TST.B�KEEP(A5)�ERROR�IF�'K'�OPTION�ON‚BNE�FMSABMN�. 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 CHANGESG�MOVE.L�FMSREC(A3),D3‚INSERT�AFTER�RECORD�WITH�THIS�LRN,OR�AT�TOP�IF�-1= MOVE.L FMSBUF(A3),A0 A0 -> RECORD TO BE INSERTED OR 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*,*ŠGET�RECORD�LENGTH�-�IGNORE�TRAILING�SPACES*'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 NO5�CLR.L�D4ƒYES,�HAVE�TO�HAVE�AT�LEAST�ONE�BYTE�RECORDS*!*ŠPOSITION�AT�LRN�GIVEN�TO�INSERT* INSR10 EQU *2ƒMOVE.B‚EFLUN(A5),IOSLUN(A6)�INSERT�INTO�EDIT�FILE 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‚INSR20�YES,�SKIP�POSITIONING8 CMP.L EOFLRN(A5),D3 WRITE FIRST OR LAST RECORD OF FILE? BEQ.S INSR40 YES, GO WRITE>‹SIOSCO�IOPOST,IOPRAN,A6�NO,�POSITION�AT�RANDOM�LOGICAL�RECORD TST.L D3 INSERT AT TOP OF FILE? BGE.S INSR15 NO/ CMP.L #-1,D3 . INVALID LRN => RECORD NOT FOUND BNE.S INSR35 .5 CLR.L IOSRRN(A6) YES, POSITION AT 1ST RECORD OF FILE INSR15 EQU *‡IOSCALL�(A6)�POSITION�BNE.S�INSERR‚IO�ERROR*:*ŠINSERT�RECORD�AFTER�CURRENT�POSITION�OR�IN�FRONT�OF�FILE*ŠOR�REPLACE�GIVEN�RECORD*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ˆSIOSCO�IOWRIT,IOPNXT+IOPASC+IOPFOR,A6�NO,�WRITE�NEXT4INSR20�ADD.L�D4,IOSEAD(A6)ƒSET�END�OF�RECORD�ADDRESS. IOSCALL (A6) WRITE = INSERT, UPDATE = REPLACE BEQ.S INSR25 IO ERROR?INSERR„TST.B�D0‚YES BRA FMSRET IO ERROR RETURN PAGE**ŠSET�RETURN�PARAMETERS*=INSR25‚MOVE.B�#EFSCHG,FMSEFS(A3)�SET�EDIT�FILE�CHANGED�STATUS TST.L D1 REPLACED RECORD? BEQ.S INSR30 YES, RETURN/ ADD.L #1,D3 NO, INSERTED, GET NEW RECORD'S LRN MOVE.L D3,FMSREC(A3) .( ADD.L #1,EOFLRN(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‚BRA�FMSOKR�GOOD�RETURNBINSR35 MOVE.B #ISTARN,FMSTAT(A3) SET LRN OUT OF BOUNDS RETURN FLAG BRA.S INSRET*$*ŠWRITE�FIRST�OR�LAST�RECORD�OF�FILE* INSR40 EQU *%‡SIOSCO�IOWRIT,IOPRAN,A6�WRITE�RANDOM&�ADD.L�#1,IOSRRN(A6)�LRN�IS‚0�OR�EOF+1 BRA INSR20 GO WRITE PAGE%*Š*************************************�POSTLR�1.00�01/07/80�HBN6*%*Š************************************C*ŠSUBROUTINE�POSTLR�POSITIONS�TO�RECORD�WITH�GIVEN�LRN�IN�EDIT�FILE7*•SHARED�BUFFER�AND�SETS�LRECRD�AND�LRECBA�IF�REQUESTED,*•(TO�BE�CALLED�FOR�EDIT�FILE�POSITION�ONLY)*F*ŠON�ENTRY:�D0�=�1�IF�TO�LEAVE�LRECRD�ALONE,�0�IF�TO�SET�LRECRD/LRECBA *”D3�=�LRN *”BSR�POSTLR**ŠON�EXIT:‚ALL�REGISTERS�UNCHANGED�EXCEPT:;*”A0�->�RECORD�IN�SHARED�BUFFER,�BCT�AND�KEY�FIELDS�SKIPPED#*”D4�=�RECORD�LENGTH�(IGNORING�KEY)*”D0�=�IOS�CALL�STATUS*”Z-FLAG�SET�ACCORDINGLY*”RTS* POSTLR EQU **'*ŠSET�PARAMETERS�IN�IOS�PARAMETER�BLOCK* MOVE.L D0,D4 SAVE LRECRD FLAG0�SIOSCO�IOPOST,IOPRAN,A6†RANDOM�LOGICAL�POSITION, 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.B�D4‚UPDATE�LRECRD/LRECBA�REQUESTED? 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)+,D4�GET�RECORD�BCT!POSTL1ƒTST.L�D0�RESTORE�IO�STATUS‡RTS PAGE*#*Š***********************************ŽWRITLR�1.00�01/07/80�HBN6*#*Š**********************************)*ŠSUBROUTINE�WRITLR�WRITES/INSERTS�RECORD*(*ŠON�ENTRY:�A2�=�STARTING�BUFFER�ADDRESS *”D0�=�LUN*”D4�=�RECORD�LENGTH�TO�WRITE*”D3�=�LRN�TO�USE�IF�RANDOM**ŠON�EXIT:‚ALL�REGISTERS�UNCHANGED�EXCEPT: *”A0�=�A6*”D0�=�ERROR�STATUS WRITLR EQU **#*ŠSET�IOS�PARAMETER�BLOCK�FOR�WRITE*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*$*Š************************************ŽPRNTCMD�1.00�05/06/80�HBN6*$*Š*********************************** PRNTCD EQU ***ŠASSIGN�PRINTER*' MOVE.B FMSTRANS(A3),D5 GET PRINTER LUN9 MOVE.L FMSBUF(A3),FHSVOL(A4) SET PRINTER DEVICE MNEMONIC�MOVE.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**ŠGET�PRINTER�ATTRIBUTES*" 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*&*ŠPOSITION�TO�1ST�RECORD�TO�BE�PRINTED*=‚BSR�CHKREC�GET�LRN�OF�1ST�RECORD�INTO�D3�AND�CHECK�IT�EXISTS‚BNEƒPRINT60�ERRORE‚BSR�POSTLR�POSITION�TO�CURRENT�RECORD�(D0�=�0�SO�WILL�UPDATE�LRECRD) BNE.S PRNTER ERROR**ŠEXPAND�RECORD*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„SAVING�ACTUAL‚LENGTH�IN�D1"�CLR.L‚D6„COMPRESSED�RECORD�LENGTH 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&PRINT15�MOVE.B�#'�',(A1)+‚MOVE�A�SPACE 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‚DECREMENT�NUMBER�OF�SPACES% BNE.S PRINT15 BRANCH IF MORE TO MOVE# CMP.L D4,D6 REACHED END OF RECORD?' BNE PRINT10 BRANCH IF NO,GET NEXT BYTE6�BRA�PRINT30‚ALL�CHARACTERS�MOVED-GO�WRITE�THIS�RECORD2PRINT20 MOVE.B D0,(A1)+ CHARACTER TO OUTPUT BUFFER ADD.L #1,D1 COUNT IT$ CMP.L #MXRECL,D1 REACHED MAX COUNT?*�BGE.S�PRINT30…BRANCH�IF�REACHED�MAX�COUNT# 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*%*ŠRECORD�EXPANDED,�SEND�IT�TO�PRINTER*: 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.S�PRINTER�ERROR 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*(*ŠREAD�NEXT�RECORD�AND�PRINT�IF�REQUIRED*#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 RECORD�BEQƒPRINT05�GO�PRINT�IT" CMP.B #ISTAEOF,D0 AT END OF FILE? BNE.S PRINTER NO, OTHER ERROR**ŠDONE�PRINTING,�CLOSE�PRINTER*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#�BNE�PRINTERR‚IO�ERROR�BEFORE�CLOSEˆBRA�FMSOKR�GOOD�RETURN* *ŠTOP�OF�FORM*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*#*Š***********************************ŽSAVECMD�1.00�5/16/80�HBN6*#*Š********************************** SAVECMD EQU **?*ŠALLOCATE�AND�ASSIGN�GIVEN�FILE�USING�EDIT�FILE�DEFAULT�FORMAT*&‚TST.B�KEEP(A5)�ERROR�IF�'K'�OPTION�ON‚BNE�FMSABMN�. * 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*$*ŠPOSITION�TO�1ST�RECORD�TO�BE�SAVED*@SAVE00ƒBSR�CHKREC�GET�LRN�OF�RECORD�INTO�D3,�CHECK�LRN�FOR�ERROR 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.S�SAVEER**ŠWRITE�RECORD�TO�SAVE�FILE*&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* *‰NEXT�RECORD*' 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(�BSR�GETNRCŠGET�NEXT�RECORD�IN�EDIT�FILE! BEQ.S SAVE10 GO SAVE IF NO ERROR( CMP.B #ISTAEOF,D0 ERROR OR END OF FILE? BNE.S SAVEER ERROR1SAVE30‚CLR.L�D0�AT�END�OF�FILE�SET�GOOD�IO�STATUS*.*‰DONE�-�CLOSE�SAVE�FILE�(ALSO�CLOSE�IF�ERROR)*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ˆBEQ�FMSOKRƒGOOD�RETURN BRA SAVEIO PAGE**ŽMERGECMD�1.00�05/16/80�HBN6**5MERGECMD�EQU�*‚FIRST�ASSIGN�GIVEN�FILE-EXCLUSIVE�READ&‚TST.B�KEEP(A5)�ERROR�IF�'K'�OPTION�ON‚BNE�FMSABMN�.( 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 MERGE05�CMP.B�#FSTANNM,D0…NEW�FILE?�BNE�MERGEIO‚NO!�BRA�FMSERR…YES,�NEW�FILE�-�ERROR**ŠPOSITION�TO�RECORD�FOR�INSERT*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ƒMERGE35�GO�CLOSE�FILE�AND�RETURNCMERGE10‚BSR�CHKREC�GET�REQUESTED�LRN�INTO�D3�AND�CHECK�IT�FOR�ERROR�BNEƒMERGE35�ERROR/ 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‚MERGERR�ERROR**ŠSETUP�TO�MERGE�1ST�RECORD*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*ŠREAD�A�RECORD�FROM�MERGE�FILE�&�WRITE�IT�INTO�EDIT�FILE*?MERGE20�MOVE.L�D2,IOSRRN(A6)‚MERGE�FILE�LRN�TO�BE�USED�FOR�READ$ 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,D2�NEXT�LRN�IN�MERGE�FILE6 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**ŠSETUP�TO�GET�NEXT�RECORD  *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 FILE7�ADD.W�#1,CHKPCT-DATASG(A5)…BUMP�NUMBER�OF�FILE�CHANGES#‚CMP.W�#-1,D7�MERGE�TO�END�OF�FILE?& 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*#*ŠMERGE�COMPLETED,�CLOSE�MERGE�FILE*MERGE35 CLR.L D0+MERGERR SFHSCO FHCLOS,0,A4 CLOSE MERGE FILEˆMOVE.B�D5,FHSLUN(A4)�. MOVE.L D0,D5 SAVE ERROR STATUS FHSCALL (A4) .MERGEIO…BNEƒFMSRET**ŠRETURN�REQUIRED�PARAMETERS*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ˆBRA�FMSOKR�NO PAGE*$*Š************************************ŽDUPMCMD�1.00�5/16/80�HBN6*$*Š*********************************** DUPMCMD EQU ****ŠGET�1ST�RECORD�(AND�MAKE�SURE�IT�EXISTS)*&‚TST.B�KEEP(A5)�ERROR�IF�'K'�OPTION�ON‚BNE�FMSABMN�.1 BSR CHKREC GET LRN OF 1ST RECORD TO MOVE INTO D3�BNEƒDUPMERR�LRN�ERROR6 BSR POSTLR POSITION/READ FIRST RECORD (UPDATE LRECRD) �BNEƒDUPMERR* *ŠGET�EXTRACT�BUFFER�FOR�RECORDS*! 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�#�OF�RECORDS�TO�MOVE*MAX�RECORD�LENGTHB 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ƒMULU�FMSRECN(A3),D6„GET�MAXIMUM�BUFFER�SIZE&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.L�D6,EXBEAD(A5)�BUFFER�LENGTH>�LEA‚EXBSEG(A5),A0�ALLOCATE�SEGMENT�FOR�EXTRACT�BUFFER-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* *ŠMOVE�RECORDS�TO�EXTRACT�BUFFER* 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.W�FMSRECN(A3),D6�GET�NUMBER�OF�RECORDS�TO�MOVE, MOVE.W (A0)+,D4 GET EDIT FILE RECORD LENGTH5DUPM11‚CMP.W�#LINEBL,D4�ONLY�TRANSFER�MAX�RECORD�SIZE& 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.W�D4,(A2)+�SET�RECORD�LENGTH%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*DUPM30�ADD.L�#1,D3ŠNO,�GO�MOVE�NEXT�RECORD 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 RECORDSDUPMOK1�BRA�FMSOKR†DONE*;*ˆAPPEND�RECORDS�TO�EXISTING�EXTACT�BUFFER�IF�THERE�IS�ROOM*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*%*Š*************************************ŽDELBCMD�1.00�5/16/80�HBN6*%*Š************************************ DELBCMD EQU **.*ŠDELETE�EXTRACT�BUFFER�-�ERROR�IF�NONE�EXISTS* BSR.S DELBUF DELETE BUFFER BEQ FMSOKR OK OR NO BUFFER! BRA FMSRET ERROR FROM DEALLOCATE*#*Š***********************************�DELBUF�1.00�5/16/80�HBN6*#*Š**********************************;*ŠSUBROUTINE�DELBUF�RELEASES�EXTRACT�BUFFER,�ERROR�IS�GIVEN*•IN�FMSTAT�IF�NO�BUFFER�EXISTS*,*–ON�RETURN:�D0�=�0�IF�NO�ERROR�OR�NO�BUFFER*¦ERROR�CODE�OTHERWISE*¡FMSTAT�=�-1�IF�NO�BUFFER* 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>DELBF0�LEA�EXBSEG(A5),A0‚DELETE�BUFFER-PARAMETER�BLOCK�ADDRESS �MOVE.L�#DESEG,D0‚EXEC�DIRECTIVE TRAP #1 DEALLOCATE THE BUFFER$ CLR.B BUFFLG(A5) INDICATE NO BUFFER TST.B D0 RTS*#*Š***********************************ŽCHKREC�1.00�5/16/80�HBN6*#*Š**********************************A*ŠSUBROUTINE�CHKREC�GETS�LRN�FROM�FMSREC�AND�CHECKS�IT�EXISTS�AND*•IS�OK**•ON�RETURN:�D3�=�FMSREC * D1�=�EOFLRN* D0�=�0�IF�RECORD�OK!*¥ISTARN�IF�RECORD�DOES�NOT�EXIST*¥ISTAIE�IF�FMSREC�=�-1* CHKREC EQU **‡MOVE.L�FMSREC(A3),D3�GET�LRN4‚MOVE.L�EOFLRN(A5),D1�GET�LRN�OF�LAST�RECORD�OF�FILE& 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#*Š***********************************ŽEXTRCMD�1.00�5/16/80�HBN6*#*Š**********************************4EXTRCMD�EQU�*„FIRST�CHECK�THAT�EXTRACT�BUFFER�EXISTS! 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*%*ŠGET�RECORD�WHERE�MUST�INSERT�BUFFER*>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‚BNE�FMSRET�IO�ERROR*0*ŠINSERT�1ST�RECORD�IN�FRONT�OF�CURRENT�POSITION* MOVE.W #IOPPRV+IOPASC,D6*:*ŠINSERT�EXTRACT�BUFFER�RECORDS�1�AT�A�TIME�INTO�EDIT�FILE*, 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*/*ŠWRITE�ANY�OTHER�RECORD�AFTER�LAST�ONE�WRITTEN*" 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,D6�INSERT�NEXT BRA E! XTR05**ŠDONE,�RETURN�PARAMETERS*�MOVE.W�#'EA',FHSEXT(A2)‚USE�NEW�EXTENSION�TO�AVOID�DUPL.�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%SAVERR4�CMP.B�#FSTADNM,D0„DUPL.�NAME? BNE SVERT NO, OTHER ERROR,�ADD.W�#1,FHSEXT(A2)†YES,�TRY�NEXT�EXTENSION BRA SAVERR3*?*ŠJUST�SET�RETURN�PARAMETERS�FOR�'SAVED'�IF�EDITING�OUTPUT�FILE*.SAV00‚TST.B�EFFLG(A5)�OUTPUT�FILE�=�EDIT�FILE?‚BPLƒSAV35�YES*$*ŠSAVE�SCRATCH�FILE�INTO�OUTPUT�FILE*ŠCOPY�RECORD�BY�RECORD* 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 BUFFER�BNEƒSAV25�ERROR�OR�END�OF�FILE BRA.S SAV06 SAV05‚BSR�GETNRC�GET�NEXT�RECORD! 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.L�D4,D0ƒSAVE�RECORD�LENGTH�IN�D0( MOVE.W OUTRCZ(A5),D4 WRITE AS IS IF VRL BEQ.S SAV15 VRL? SUB.L D6,D4 NO�CMP.W�D0,D4…FRL�-�TRUNCATE? BLS.S SAV20 YES MOVE.L D6,D1 NO%�ADD.L�D4,D1…BLANK�PAD�REST�OF�RECORD. 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ƒLEA�RECBUF(A5),A1�MOVE�ACTUAL�RECORD6 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 RECORD7SAV21�MOVE.B‚OSLUN(A5),D0�WRITE�RECORD�INTO�OUTPUT�FILE BSR WRITLR .�BNEƒSAVERR1�IO�ERROR ADD.L #1,D3 COPY NEXT RECORD& CMP.L EOFLRN(A5),D3 READ LAST RECORD? BHI.S SAV30 YES, DONE COPY�BRAƒSAV05�NO,�COPY�NEXT�RECORD*"*ŠEND�OF�FILE�=�DONE�ELSE�IO�ERROR*SAV25‚CMP.B�#ISTAEOF,D0�DONE?�BNEƒSAVERR1�NO,�ERROR**ŠCLOSE�OUTPUT�FILE* SAV30 EQU *‹SFHSCO�FHCLOS,0,A4�CLOSE, MOVE.B OSLUN(A5),FHSLUN(A4) OUTPUT FILE LUN FHSCALL (A4)�BNEƒSAVERR1�IO�ERROR?�TST.B�TEMP(A5)‚REOPEN? BNE.S SAV40 YES**ŠSET�RETURN�PARAMETERS*:SAV35 CLR.B FMSEFS(A3) SCRATCH FILE = OUTPUT FILE (EFSUCH)! 6 CLR.B FMSOFS(A3) SET SAVE OUTPUT FILE STATUS (OFSSAV)D�MOVE.L‚EOFLRN(A5),FMSREC(A3)�RETURN�LRN�OF�LAST�RECORD�IN�EDIT�FILE0 CLR.B FMSTAT(A3) GOOD RETURN, SET SAVED OK FLAG CLR.L D0 RTS**‹REOPEN�OUTPUT�FOR�OVERWRITE*(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.S�SAV45(�SFHSCO�FHASGN,FOPEREW+FOPOVRT,A4‚REOPEN FHSCALL (A4)�BNE�SAVERRžERROR ƒBRA�SAV35¢SET�RETURN�PARAMETERS PAGE**9"M+D3I;6C0K8S&*Š**************************************�SRCHCMD�1.00‚03/07/80�HBN6*&*Š*************************************/*ŠENTRY�AND�EXIT�CONDITIONS�SAME�AS�FOR�OPENCMD**ŠREGISTER�USAGE:*ŠA0�->�RECORD*ŠA1�->�STRING*ŠA4�->�SHARED�BUFFER�START1*ŠD1�=�#�OF�RECORDS�TO�SCAN,�-1�=>�TO�END�OF�FILE*ŠD2�=�OCCURENCE�COUNT*ŠD4�=�STRING�BCT *ŠD5�=�LRN** SRCHCD EQU **'*ŠPOSITION�AT�STARTING�RECORD�SPECIFIED*( 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 *‹SIOSCO�IOPOST,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**ŠSCAN�RECORD�TO�FIND�STRING*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)�CHECK�A�RECORD�THERE�WITH�PROPER�LENGTH�RANGE BLS FMSER5 . ERROR‡BSRƒSCNREC�SCAN�RECORD' BNE.S SRCH40 STRING NOT FOUND, D0 = -1**ŠFOUND�STRING,�RETURN�RECORD* ‚CLR.L�D0 ‚CLR.L�D26 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 TRANSFERRED�CMP.W�D6,D2ƒTOO�LONG�RECORD? BHI.S SRCHOK YES# MOVE.B D0,(A1)+ NO, MOVE NEXT BYTE$SRCH35�SUB.W�#1,D3‚AT�END�OF�RECORD?�BNE�SRCH20ƒNO* *ŠSPACE�FILL�REST�OF�LINE�BUFFER* 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 SRCH36SRCHOK�BRA�FMSOKR†RETURN* STRING NOT FOUND6SRCH55 MOVE.W (A0)+,D0 GET NEXT RECORD POINTER INTO A0 BTST #0,D0 . ODD RECORD BCT?�BEQ.S�SRCH60‚.�NO ADD.W #1,D0 . YES( BEQ.S S" RCHBO . ERROR IF RECORD TOO LONGSRCH60�LEA‚(A0,D0),A0�.( CMP.L FMSDBE(A5),A0 PAST END OF BUFFER?�BHI.S�SRCH65ƒYES) TST.W (A0) NO, END OF RECORDS IN BUFFER?) BNE SRCH16 NO, GO SCAN RECORD FOR STRING*7*ŠRUN�OUT�OF�RECORDS�IN�BUFFER,�READ�IN�NEXT�DATA�BLOCK* SRCH65 EQU *-‡SIOSCO�IOREAD,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*%*Š*************************************�SCNREC�1.00‚03/07/80�HBN6*%*Š************************************3*ŠSUBROUTINE�SCNREC�SEARCHES�GIVEN�RECORD�FOR�GIVEN+*•STRING�BY�TRYING�TO�MATCH�STRING�STARTING*•WITH�EACH�BYTE�IN�THE�RECORD*9*ŠON�ENTRY:�A0�->�RECORD�(BCT,�DATA)�IN�SHARED�FMS�BUFFER*”A1�->�STRING*”D4�=�STRING�LENGTH*”D2�=�N'TH�OCCURENCE�WANTED***ŠON�EXIT:�ALL�REGISTERS�UNCHANGED�EXCEPT:&*“D0�=�0�AND�Z�=�1�IF�STRING�FOUND,�OR"*˜-1�AND�Z�=�0�IF�STRING�NOT�FOUND**ŠREGISTER�USAGE:*ŠA0�->�BYTE�TO�MATCH�IN�RECORD*ŠA1�->�FIRST�BYTE�OF�STRING*ŠA2�->�BYTE�TO�MATCH�IN�STRING#*ŠA4�->�FIRST�BYTE�IN�CURRENT�MATCH)*ŠD0.B�=�TRANSPARENT�CHARACTER,�0�=>�NONE(*ŠD1.B�=�CURRENT�BYTE�IN�STRING�TO�MATCH*ŠD2�=�OCCURENCE�COUNT*ŠD3,�D4�=�STRING�BYTE�COUNTF*ŠD5�=�REMAINING�RECORD�BYTE�COUNT�(MATCH�STARTING�BCT�IN�FMSREC�(.W))*ŠD6�=�LINE�BUFFER�SIZEA*ŠD7.B�=�CURRENT�BYTE�IN�RECORD�TO�MATCH,�OR�SPACE�COUNT�(W.B.B�-?*‘ACTUAL�RECORD�BCT.STARTING�SPACE�COUNT.REMAINING�SPACE�COUNT)* SCNREC EQU ** *ŠINITIALIZE*,‚MOVEM.L�A0-A2/A4/D1-D7,-(A7)�SAVE�REGISTERS? 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‚CLEAR�RECORD�ACTUAL�LENGTH�&�SET�NO�COMPRESS�CHAR8 MOVE.B FMSTRANS(A3),D0 GET TRANSPARENT CHARACTER IF ANY0�MOVE.L�A0,A4ƒSAVE�STARTING�MATCH�LOCATION�IN�A4*5*ŠTRY�TO�MATCH�STRING�WITH�CURRENT�POSITION�IN�RECORD*?SCNR00�TST.B�D7‚SPOT�STARTS�IN�THE�MIDDLE�OF�SPACE�COMPRESSION?< BNE.S SCNR02 YES, A4 -> SPACE COMPR. CHAR., A0 -> NEXT CHAR5�MOVE.L�A4,A0‚NO,�GET�STARTING�MATCH�LOCATION�FROM�A4G�MOVE.B�(A4),D7†GET�STARTING�BYTE�AND�SEE�IF�IT'S�A�SPACE�COMPRESS�CHAR 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…ONE�LESS�BYTE�IN�STRING�TO�MATCH< 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*ŠCHARACTERS�DON'T�MATCH,�CHECK�FOR�TRANSPARENT�CHARACTER**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**ŠSTRING�MATCHES�S" O�FAR*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‚REMAINDER�OF�STRING�MUST�BE�SPACES�FOR�MATCH1 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 MATCHSCNR35�SUB.W�#1,D3ƒSO�FAR�OK BNE SCNR306 BRA.S SCNRSF STRING FOUND AND OCCURENCE COUNT MATCHES*-*ŠSTRING�FOUND,�IS�THIS�THE�OCCURENCE�WANTED?*,SCNR40�SUB.W�#1,D2ˆTRY�TO�FIND�STRING�AGAIN? BNE.S SCNR50 YES+SCNRSF CLR.L D0 NO, STRING FOUND, SET FLAGS5SCNRET�MOVEM.L�(A7)+,D1-D7/A0-A2/A4‚RESTORE�REGISTERS RTS*:*ŠSTRING�MATCHES,�BUT�OCCURENCE�DOESN'T,�FIND�STRING�AGAIN*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ƒSCNR00�NO,�TRY�AGAIN, 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*ŠSTRING�DOES�NOT�MATCH,�MOVE�TO�NEXT�BYTE�IN�RECORD�FOR�NEXT�MATCH*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.W�D7�INDICATE�NO�SPACE�COMPRESSION& 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 ƒ=ARG�FREE.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 ƒ=ARG�FREE.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‡VERSAdos�FREE�utility…LIST „LLEN�120<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**’FREE…MODIFICATION�HISTORY**ˆREVISION�CODE‡011185�47*’FREE�was�changed�to�compare�the�length�of�the�segment4*’it�obtained�from�the�GETSEG�call�with�the�value�it4*’requested.‚If�it�got�more�memory�(like�on�a�VME120-*’system)�it�will�only�use�what�it�requested.**ˆREVISION�CODE‡122084�4*6*’FREE�is�modified�to�force�position�independent�code.**ˆREVISION�CODE‡030984�4*6*’FREE�is�modified�to�read�the�number�of�VERSAdos�disk8*’sectors�from�the�configuration�table�on�the�disk.‚This8*’assures�that�the�computation�of�the�percentage�of�free8*’sectors�will�be�correct�for�the�various�configurations3*’allowable�on�the�VME/10.‚If�an�old�disk�without�a9*’configuration�table�is�used,�the�number�of�sectors�will:*’still�be�obtained�from�the�configuration�SYSGENed�on�the*’drive.¢Peggy�Hassett*;**************************************************************‰PROGRAM�NAME�ISƒF�R�E�E‚.�L�O***ˆ***‡FREE�COMMANDƒ******,*ˆTHIS�COMMAND�IS�USED�TO�DISPLAY�THE�NUMBER)*ˆOF�AVAILABLE�PAGES�(256�BYTE�SEGEMENTS)*ˆAND�THE�LARGEST�CONTIGUOUS**ˆNUMBER�OF�AVAILABLE�PAGES�ON�THE�DISK�OR*ˆDISKETTE�VOLUME*!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*’D…*�*�*�*�*�*�**’A…*�*�*�*�*�*�***=*************************************************************=*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++‰PAGE=**************************************************************ˆINCLUDES�OF�SYSTEM�FILES*ˆINCLUDE�TR1RTCD.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(*ˆDATA�SEGMENT�***‚F�R�E�E‚COMMANDƒ******ˆ****‚EQUATE�AREA‚******* BEGDATA‚EQU�0#STKLENƒEQU�25‹STACK�LENGTH�IN�WORDS)BUFSIZE‚EQU�160‰INPUT�COMMAND�BUFFER�SIZE DSKLU„EQU�1 mGvU~G†^ŽS–\žG¦8®4¶Z¾RÆKÎNÖOÞEæ!LISTLUƒEQU�3‹LISTING�LOGICAL�UNITTSKNAMƒEQU�'FREE'†MY�TASK�NAME* ‰SECTIONƒ0‰XREFƒEDITFILE,PARSE,OPTION‰PAGE;**************************************************************ˆ***ƒDATA�AREA‚*****:*********************************************************** PBA†EQU‡**&REVIS„DC.B†'011185'‚DATE�LAST�MODIFIED(‰DC.B†'�'‡BLANK�INDICATES�CLEAN�ASSEMBLY‰DC.B†'4'‡MAJOR�REVISION�NUMBER** ‰DS.W�STKLEN PROGSTK‚EQU�**‰DC.L�08*+++++++++++++++++++++++++++++++++++++++$ ++++++++++++++++*,*ˆ***ƒBUFFIN�IS�THE�AREA�THE�COMMAND�LINE�IS.*ˆ***ƒREAD�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*5*******************************************************BUFFINƒCOMLINE�BUFSIZE‚***‚INPUT�BUFFER‚***5******************************************************+*ˆ**‚IOS�PARAMETER�TABLE�FOR�DISK�READS‚***6*ˆ**‚REFER�TO�IOS�EQUATES�UNDER�IOS�PARAMETER�BLOCK‚***5******************************************************‰DS.W�02‰IOS.DSK�IOREAD,IOPWAT+IOPRAN+IOPIMG,DSKLU,0,0,0,0**"***********************************8*ˆFHS�PARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT6*ˆCHANGE�IS�FROM�6�TO�3�--�SEND�SOURCE�IS�LU�A�IN�MASK*ˆAND�RECEIVE�IS�LU�B�IN�MASK3*ˆLU3�IS�USED�FOR�LISTING�AND�LU6�FOR�ERROR�LOGGING**4*ˆPARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT,*ˆIS�DIFFERENT�FROM�STANDARD�PARAMETER�TABLE*%************************************** LU3AFHSƒEQU�*'‰DC.W�FHCHLU„COMMAND�(CHANGE�LU�ASSIGN)‰DC.W�FOPKEP…OPTION�KEEP�ASSIGN‰DC.B�0ŠSTATUS‰DC.B�LDFLUNŠSEND�LU�NUMBER‰DC.B�LISTLUŠRECEIVE�LU�NUM‰DC.B�0ŠRESERVED&‰DC.L�0ŠTASK-ID�(0�MEANS�USE�YOURSELF)(‰DC.L�0ŠSESSION�#�(0�MEANS�USE�YOURSELF)*‰DS.W�0**!***********************************ˆSET�UP�IOS�FOR�LISTING�LU3*‹IOS�PARM�TABLE*!**********************************/‰IOS.OUT3�IOWRIT,IOPASC+IOPFOR+IOPWAT,3,0,0,0,0**)******************************************?*ˆLU3FHS�IS�PARM�TABLE�FOR�LU3�WHICH�IS�USED�FOR�OUTPUT�LISTING*********************************************‰FHS.LU3�0,0,LISTLU,0,0,0,0,0**#************************************ *ˆBUILD�PARM�BLOCK�TO�ASSIGN�VOL*#************************************!‰FHS.VOL�FHASGN,0,DSKLU,0,0,0,0,0‰PAGEJ****************************************************************************’ERROR�MESSAGE�PARAMETER�BLOCK*J**************************************************************************EM_PBLK:.EM_D0:ƒDC.L‚0‚D0�-�IOS/FHS�RETURN�ERROR�STATUS*œ(ERROR�MSG�KEYVALUE).EM_A0:ƒDC.L‚0‚A0�-�ADDR�OF�I/O�PARAMETER�BLOCKEM_OPT:‚DC.B‚0‚OPTIONS�FLAG*œBIT‡MEANING�IF�SET*�0ˆQUERY�RESPONSE�DESIRED,EM_TLUN:�DC.B‚0‚USER�TERMINAL�LUN�-�(LDFLUN)%EM_QRC:‚DC.B‚0‚QUERY�RETURN�CHARACTER,EM_KLUN:�DC.B‚0‚USER�KEYBOARD�LUN�-�(CDFLUN)4EM_SPA:‚DC.L‚0‚START�ADDRESS�FOR�USER�TEXT�PLUG�POOL2EM_EPA:‚DC.L‚0‚ENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL*9**********************************************************(*ˆ***ƒPARAMETER�BLOCK�TO�GET�SEGMENTƒ***%*ˆ***ƒFOR�BUFFER�TO�READ�SAT�INTO†****9**********************************************************!SEGPBLK‚DC.L†0‰TASK�NAME�(USE�ME)‰DC.L†0‰SESSION�#�(USE�ME)#‰DC.W†1<<13+1<<9‚DIRECTIVE�OPTIONS:*¨USE�PHYSICAL�ADDRESS;*¨WILL�TAKE�LESS�THAN�REQUESTED‰DC.W†0‰SEGMENT�ATTRIBUTES‰DC.L†'BUFF'„SEGMENT�NAME+SEGSADƒDC.L†0‰RECEIVES�PHYS�ADDR�OF�SEGMENT-SEGLENƒDC.L†0‰RECEIVES�SEGMENT�LENGTH�(BYTES)**‰MOVE.L„FHSSIZ(A6),VOLSECTS-PBA(A4)�SAVE�THE�NUMBER�OF�SECTORS*°IN�THE�VOLUME**‰RTSŽ.�RETURN�FROM�ROUTINE‰PAGEF***********************************************************************9*ˆROUTINE�TO�READ�THE�VID�OF�THE�SPECIFIED�VOLUME,�LOCATE4*ˆTHE�SAT,�AND�SET�UP�A�BUFFER�TO�READ�THE�SAT�INTO.*F************************************************************************ GETVIDƒEQU�**F************************************************************************ˆSET�UP�FOR�RANDOM�READ�OF�VID*F***********************************************************************(‰LEA‡DSKIOS(PC),A2‡ADDR�OF�IOS�READ�PARM***ˆLEA‡VIDDA,A0ŒRANDOM�RECORD�NUMBERŽ1217845‰MOVE.L„#VIDDA,IOSRRN(A2)ƒRANDOM�RECORD�NUMBERŽ121784*‰LEA‡SECBUF(PC),A0‡BUFFER�STARTING�ADDRESS‰MOVE.L„A0,IOSSAD(A2))‰LEA‡SECBUFE(PC),A0†BUFFER�ENDINGƒADDRESS‰MOVE.L„A0,IOSEAD(A2)*F************************************************************************ˆRANDOM�READ�OF�VID*F***********************************************************************‰IOSCALL�DSKIOS(PC) ‰BNE‡FATALERR* ‰LEA�SECBUF(PC),A3•LOAD�BUF�ADDR*D‰MOVE.L„VIDCAS(A3),CASSEC-PBA(A4)�SAVE�CFGA�STARTING�SECTOR�#�030984;‰MOVE.L„VIDSAT(A3),SATSSEC-PBA(A4)‚SAVE�SAT�STARTING�SECTOR * ‰CLR.L…D0–SAVE�SAT�ENDINGƒSECTOR-‰MOVE.W„VIDSAL(A3),D0Ž=�SAT�LENGTH�IN�SECTORS*‰ADD.L…VIDSAT(A3),D0�+�SAT�STARTING�SECTOR‰SUB.L…#1,D0˜-�1‰MOVE.L„D0,SATESEC-PBA(A4)*F************************************************************************�***ƒSET�UP�BUFFER�FOR�SATƒ****F***********************************************************************?*ˆATTEMPT�TO�ALLOCATE�A�BUFFER�SEGMENT�LARGE�ENOUGH�TO�HOLD�THE=*ˆENTIRE�SAT�FOR�THE�ASSIGNED�VOLUME.‚IF�NOT�ENOUGH�MEMORY�IS:*ˆAVAILABLE,�GTSEG�WILL�GET�AS�MUCH�AS�POSSIBLE.‚MEMORY�IS;*ˆALLOCATED�IN�CHUNKS�OF�256�BYTES.‚IF�WE�AREN'T�GIVEN�ANY,;*ˆJUST�USE�THE�VID�SECTOR�BUFFER�(WHICH�IS�256�BYTES�LONG).*'‰CLR.L…D0’CALCULATE�THE�NUMBER�OF�BYTES3‰MOVE.W„VIDSAL(A3),D0‡IN�THE�SAT�BY�MULTIPLYING�THE+‰ASL.L…#8,D0�NUMBER�OF�SECTORS�BY�256.‚THEN8‰MOVE.L„D0,SEGLEN-PBA(A4)ƒPUT�IT�IN�THE�PARAMETER�% BLOCK.*"‰ERQ.GTSEG�SEGPBLK�BEG�FOR�MEMORY.*.*‘***‚A0�=�ADDRESS,�A1�=�LENGTH�OF�SEGMENT‚*****¦WAS�THERE�AN�ERROR?‰IF‚‚THEN.S5ŒCMP.W‚#RTCDNMEM,D0ƒIF�IT'S�ANYTHING�BUT�'NO�MEMORY',,ŒBNE„FATALERR‡LET�THE�ERROR�HANDLER�HAVE�IT.*0ŒLEA„SECBUF(PC),A0†THE�ERROR�WAS�'NO�MEMORY',�SO/ŒMOVE.L�#256,A1ˆDUMMY�IN�THE�VID�SECTOR�BUFFER.ŒENDI* *‘***‚SAVE�THE�NEEDED�VALUES‚****8‰CMP.L…SEGLEN-PBA(A4),A1ƒGET�MORE�THAN�REQUESTED?�011185,‰BLE.S…GETVID1�NO,�USE�RETURNED�VALUEƒ011185;‰MOVE.L„SEGLEN-PBA(A4),A1ƒYES,�USE�ONLY�WHATS�NEEDED�0111859GETVID1‚MOVE.L„A0,SEGSAD-PBA(A4)ƒSEGMENT�STARTING�ADDRESS1‰MOVE.L„A1,SEGLEN-PBA(A4)ƒSEGMENT�LENGTH�IN�BYTES,‰LEA‡-1(A0,A1.L),A0†SEGMENT�ENDING�ADDRESS�=-‰MOVE.L„A0,SEGEAD-PBA(A4)„SEGSAD�+�SEGLEN�-�1*-‰MOVE.L„A1,D0�CALCULATE�THE�NUMBER�OF�SECTORS,‰ASR.L…#8,D0�BY�DIVIDING�THE�LENGTH�IN�BYTES7‰MOVE.L„D0,SEGSECTS-PBA(A4)�BY�256�(SHIFT�RIGHT�8�BITS)*-*’***‚NOW�TELL�IOS�PARAM�BLK�ABOUT�BUFFER‚****‰LEA‡DSKIOS(PC),A2!‰MOVE.L„SEGSAD-PBA(A4),IOSSAD(A2)!‰MOVE.L„SEGEAD-PBA(A4),IOSEAD(A2)* ‰RTSŒ.�RETURN‰PAGED*********************************************************************>*ˆTHIS�ROUTINE,�ADDED�ON�030984,�READS�THE�CONFIGURATION�TABLE<*ˆFROM�THE�DISK�INTO�THE�SECTOR�BUFFER�IN�MEMORY�(DESTROYING9*ˆTHE�VID�INFORMATION�IN�THAT�BUFFER�IN�THE�PROCESS).‚THE?*ˆTOTAL�NUMBER�OF�VERSADOS�SECTORS�ON�THE�DISK�IS�OBTAINED�FROM>*ˆTHE�CONFIGURATION�TABLE�TO�BE�USED�LATER�FOR�THE�CALCULATION*ˆOF�THE�%�OF�FREE�SECTORS.** GETCFGA‚EQU‡**F*********************************************************************** *ˆSET�UP�FOR�RANDOM�READ�OF�CFGA*G************************************************************************/‰LEA‡DSKIOS(PC),A2‡ADDR�OF�IOS�READ�PARM‹O30984.‰MOVE.L„CASSEC,A0‹SECTOR�NUMBER�OF�CFGA‹030984/‰CMP‡#0,A0�IF�CFGA�DOESN'T�EXIST,�SECTORƒ030984 ‰BEQ.S…ENDCFGA�NUMBER�=�0–030984<‰MOVE.L„A0,IOSRRN(A2)‡PARM�BLK<==RANDOM�RECORD�NUMBER�0309841‰LEA‡SECBUF(PC),A0‡BUFFER�STARTING�ADDRESS‰0309846‰MOVE.L„A0,IOSSAD(A2)‡PARM�BLK<==BUF�START�ADDR‡0309840‰LEA‡SECBUFE(PC),A0†BUFFER�ENDING�ADDRESS‹0309845‰MOVE.L„A0,IOSEAD(A2)‡PARM�BLK<==�BUF�END�ADDRˆ030984*I***************************************************************************ˆRANDOM�READ�OF�CFGA*J***************************************************************************0‰IOSCALLƒDSKIOS(PC)ŠREAD�CFGA�INTO�BUFFER‹030984‰BNE‡FATALERR¬030984**‰LEA‡SECBUF(PC),A3‡LOAD�BUFFER�ADDR�030984@‰MOVE.L„IOSRSZ(A3),VOLSECTS-PBA(A4)�#�SECTORS�IN�CFGA�TBLƒ030984ENDCFGA‚RTS›.RETURN™030984*‰PAGED*********************************************************************=*ˆROUTINE�TO�COUNT�UNALLOCATED�SECTORS�BY�CHECKING�FOR�0�BITS9*ˆIN�THE�SAT.‚NOTICE�THAT�WE�ARE�CHECKING�ALL�THE�SECTORS<*ˆIN�THE�SAT�AREA�ON�THE�VOLUME.‚NOT�ALL�THE�BITS�IN�THE�SAT=*ˆAREA�ACTUALLY�REPRESENT�SECTORS�(E.G.�IF�THERE�ARE�900�SEC-:*ˆTORS,�THERE�IS�STILL�A�256-BYTE=2048-BIT�SAT),�BUT�THOSE;*ˆBITS�(AT�THE�END�OF�THE�SAT)�NOT�REPRESENTING�SECTORS�ARE:*ˆSET�TO�1�(ALLOCATED).‚HENCE,�EVEN�THOUGH�WE�LOOK�THROUGH<*ˆTHEM�WE�NEVER�FIND�ANYTHING.‚IT�IS�VITAL�TO�USE�THE�ACTUAL;*ˆNUMBER�OF�SECTORS�(AND�NOT�THE�BITS�IN�THE�SAT)�TO�CALCU- *ˆLATE�THE�%�ALLOCATED,�HOWEVER!*D*********************************************************************‰OPT‡BRS*3*’THIS�MACRO�IS�CALLED�WHENEVER�AN�ALLOCATED�SECTOR4*’IS�FOUND�IN�THE�SAT.‚IF�THIS�IS�THE�END�OF�A�BLOCK5*’OF�FREE�SECTORS�(�D6�>�0�),�IT�CALLS�THE�ROUTINE�TO+*’UPDATE�THE�LARGEST�CONTIGUOUS�FREE�BLOCK.*UPDATE_CONT_SECTƒMACRO “TST.L…D6 “IF‚‚THEN •BSR…CONTSET•ENDI“ENDM** BLDSIZE‚EQU�*6‰CLR.L�D4†HOLDS�SIZE�OF�LARGEST�CONTIGUOUS�FREE�BLOCK.6‰CLR.L�D6†HOLDS�SIZE�OF�CURRENT�CONTIGUOUS�FREE�BLOCK.#‰CLR.L�D7†HOLDS�TOTAL�FREE�SECTORS.*B‰FOR.L�A6�=�SATSSEC-PBA(A4)�TO�SATESEC-PBA(A4)�BY�SEGSECTS-PBA(A4)‘DO*+*Œ***�READ�FROM�SAT�INTO�BUFFER�SEGMENT�****‹LEA…DSKIOS(PC),A2:‹MOVE.L‚SEGSECTS-PBA(A4),D5�CHECK�TO�SEE�IF�THIS�REA& D�WILL-‹ADD.LƒA6,D5�TAKE�US�PAST�THE�END�OF�THE�SAT. ‹SUB.Lƒ#1,D5‹SUB.LƒSATESEC-PBA(A4),D5-‹IF��THEN�IF�SO,�THEN�MULTIPLY�THE�NUMBER+�ASL.L�#8,D5�OF�SECTORS�PAST�BY�256�AND�CUT4�SUB.L�D5,IOSEAD(A2)‡THE�BUFFER�BACK�TO�FIT�THE�SAT.�ENDI*4‹MOVE.L‚A6,IOSRRN(A2)‡LOAD�THE�SECTOR�NUMBER�AND�GET ‹IOSCALL�DSKIOS(PC)ŠA�BUFFERFUL.‹BNE.LƒFATALERR*<‹MOVE.L‚SEGSAD-PBA(A4),A3ƒA3�IS�START�OF�SAT�SEGMENT�BUFFER..‹MOVE.L‚SEGEAD-PBA(A4),A5ƒA5�IS�END�OF�BUFFER.*4*Œ***�EXTRACT�WORDS�ONE�AT�A�TIME�AND�ANALYZE�TO�***.*Œ***�UPDATE�HOLDCONT�&�HOLDTOT‚(D6�&�D7).†****‹REPEAT,�MOVE.L�(A3)+,D1‹GET�A�WORD�FROM�THE�BUFFER.!*¦IF�ALL�32�SECTORS�ALLOCATED....�IF.LƒD1��#$FFFFFFFF‚THEN�UPDATE_CONT_SECT�ELSE*&*�***�CHECK�EACH�BYTE�INDIVIDUALLY�****%�MOVE.Lƒ#3,D3Š(FOR�D3�=�#3�DOWNTO�#0)-FORD3ŒROL.L‚#8,D1ŠPUT�THE�BYTE�IN�LOW�8�BITS. *¦IF�ALL�8�SECTORS�ALLOCATED....‘IF.B‚D1��#$FF‚THEN“UPDATE_CONT_SECT‘ELSE#“TST.B‚D1‹IF�ALL�8�SECTORS�FREE.... “IF‚‚THEN •ADD.L‚#8,D6“ELSE*%*–***�CHECK�EACH�BIT�INDIVIDUALLY�****%•MOVE.L‚#7,D5Ž(FOR�D5�=�#7�DOWNTO�#0)(FORD5’BTST‚D5,D1ŽIF�THIS�SECTOR�FREE.... —IF‚‚THEN ™ADD.L‚#1,D6—ELSE™UPDATE_CONT_SECT™ENDI—DBF‚D5,FORD5Œ(ENDF�ON�D5)**•ENDI“ENDI‘DBF‚D3,FORD3’(ENDF�ON�D3)**�ENDI�UNTIL.L‚A3��A5** ‹ENDF�(�A6�)**‰UPDATE_CONT_SECT2‰MOVE.L„D4,HOLDCONT-PBA(A4)‡SAVE�LARGEST�BLOCK�AND1‰MOVE.L„D7,HOLDTOT-PBA(A4)ˆTOTAL�FOR�LATER�PRINT.*‰OPT‡BRL* ‰RTS�.�RETURN‰PAGEA******************************************************************.*ˆCHECK�AND�SAVE�CONTIGUOUS�SIZE�IF�NECESSARY.*ˆALWAYS�RESET�REG�D6.*A****************************************************************** CONTSET‚EQU�*+‰ADD.L…D6,D7‘UPDATE�THE�TOTAL�FREE�SECTORS.:‰IF.L‚D6��D4‚THEN.SˆIF�THIS�CONTIGUOUS�BLOCK�IS�BIGGER+‹MOVE.L‚D6,D4‘THAN�THE�OTHERS,�REMEMBER�IT.‹ENDI+‰CLR.L‚D6—RESET�D6�(SIZE�OF�CURRENT�BLOCK).* ‰RTS�.�RETURN‰PAGE*.***********************************************#*ˆ**�BUILD�DIRECTORY�PRINT�LINES‚***.***********************************************BUILDLIN EQU **********************************************!*ˆPRINT�FIRST�LINE�WITH�VOLUME�ID*********************************************3‰LEA‡VOLMSG(PC),A0‹LOAD�EXTENT�OF�VOLUME�ID�MESSAGE+‰LEA‡VOLMSGE(PC),A1ŠAND�CALL�PRINT�ROUTINE. ‰BSR‡PRINTLIN**)*******************************************CONVERT TOTAL TO ASCII*)******************************************‰MOVE.L�HOLDTOT-PBA(A4),D0‰MOVE.L�#8,D1„SIZE3‰LEA�PRTL1D(PC),A0‚WHERE�TO�DEPOSIT�CONVERDED�VALUE'‰BSR�BINDECFJ„GO�TO�CONV�TO�DEC�ROUTINE*,‰MOVE.L�HOLDTOT-PBA(A4),D0‚INIT�FOR�HEX�CONV ‰LEA�PRTL1H(PC),A0†RECEIVE�FIELD‰BSR�BHLCVT†GO�TO�CONV�ROUTINE*-‰LEA‡PRTL1(PC),A0ŒLOAD�EXTENT�OF�'TOTAL'�LINE*‰LEA‡PRTL1E(PC),A1‹AND�CALL�PRINT�ROUTINE.‰BSR.S…PRINTLIN**#************************************ *ˆSET�UP�LARGEST�CONTIGUOUS�LINE*#************************************'‰MOVE.L�HOLDCONT-PBA(A4),D0‚AMT�TO�CONV‰MOVE.L�#8,D1„SIZE#‰LEA�PRTL2D(PC),A0‚WHERE�TO�DEPOSIT ‰BSR�BINDECFJ*-‰MOVE.L�HOLDCONT-PBA(A4),D0‚INIT�BINARY�VALUE‰LEA�PRTL2H(PC),A0†LOAD�RECEIVE‰BSR�BHLCVT†GO�TO�CONV�ROUTINE*2‰LEA‡PRTL2(PC),A0ŒLOAD�EXTENT�OF�'CONTIGUOUS'�LINE*‰LEA‡PRTL2E(PC),A1‹AND�CALL�PRINT�ROUTINE.‰BSR.S…PRINTLIN**2****************************************************ˆSET�UP�'%�AVAILABLE'�LINE*2***************************************************3*’Prepare�to�print�the�%�of�sectors�available.‚What)*’we�really�want�is�the�rounded�result�of4*”TOTAL�AVAILABLE�SECTORS�/�TOTAL�SECTORS�IN�VOLUME.3*’In�order�to�calculate�a�percentage,�we�would�need5*’to�multiply�the�numerator�by�100.‚Since�we�want�the5*’result�rounded,�multiply�by�200�instead�and�use�the7*’low�order�bit�of�the�result�of�the�division�to�round.*8‰MOVE.L„HOLDTOT-PBA(A4),D1ƒGET�TOTAL�AVAILABLE�SECTORS�&4‰MOVE.L„VOLSECTS& -PBA(A4),D0‚TOTAL�SECTORS�IN�VOLUME.*‰WHILE.LƒD0��#$FFFF‚OR.L“D1��#$FFFF‚DO.S+ŒASR.L…#1,D0�MULU�REQUIRES�THAT�D1�FIT�INTO,ŒASR.L…#1,D1�16�BITS,�AND�DIVU�REQUIRES�THAT$ŒENDWšD0�FIT�INTO�16�BITS.‚IF�EITHER *§IS�TOO�LARGE,�DIVIDE�BOTH�BY�2!*§(APPROXIMATELY)�UNTIL�THEY�FIT.* ‰MULU†#200,D1&‰DIVU†D0,D1�DO�THE�DIVISION�AND�ROUND. ‰ASR.W…#1,D1‰IFƒ‚THEN.S ŒADD.W…#1,D1ŒENDI**‰CLR.L…D0’CONVERT�THE�ANSWER�TO�DECIMAL�IN‰MOVE.W„D1,D0�THE�PRINT�LINE. ‰MOVE.L„#3,D1‰LEA‡PRTL3D(PC),A0 ‰BSR‡BINDECFJ*/‰LEA‡PRTL3(PC),A0ŒLOAD�EXTENT�OF�'%�AVAIL'�LINE*‰LEA‡PRTL3E(PC),A1‹AND�CALL�PRINT�ROUTINE.‰BSR.S…PRINTLIN**‰RTS�.�RETURN�TO�DRIVER**2****************************************************ˆPRINT�LINE�SUBROUTINE*2*************************************************** PRINTLIN:8‰MOVE.L„A0,OUT3IOS+IOSSAD-PBA(A4)…MOVE�EXTENT�OF�LINE�TO6‰MOVE.L„A1,OUT3IOS+IOSEAD-PBA(A4)…I/O�PARAMETER�BLOCK.*‰IOSCALLƒOUT3IOS(PC) ‰BNE‡FATALERR* ‰RTS‡.�RETURN‰PAGE-**********************************************.*ˆROUTINE�TO�ASSIGN�LOGICAL�UNIT�3�TO�TERMINAL+*ˆBY�SETTING�IT�UP�THE�SAME�AS�LU6�WHICH�IS"*ˆALREADY�ASSIGNED�TO�THE�TERMINAL*.***********************************************SETLU3:‰FHSCALLƒLU3AFHS(PC) ‰BNE‡FATALERR* ‰RTSŒ.�RETURN‰PAGE8*********************************************************=***‚ROUTINE�TO�DIRECT�OUTPUT�TO�SOMETHING�OTHER�THAN�TERMINAL*9********************************************************** NEWOUTƒEQU�**,‰LEA�LU3FHS(PC),A6ƒLU3�PARM�TABLE�ADDR�TO�A6A‰MOVE.B�#0,FHSWCD(A6)�LOAD�WRITE�PASSWORD�(USER�CAN�ALWAYS�WRITE)?‰MOVE.B�#$FF,FHSRCD(A6)‚LOAD�READ�PASSWORD�(ONLY�USER�CAN�READ)3‰MOVE.W�USERNUM-PBA(A4),FHSUSN(A6)‚DEFAULT�USER�NUM-‰MOVE.L�VOLNAM-PBA(A4),FHSVOL(A6)‚VOLUME�NAME0‰MOVE.L�CATNAM-PBA(A4),FHSCLG(A6)‚CATALOGUE�NAME%‰MOVE.L�CATNAM+4-PBA(A4),FHSCLG+4(A6)‰MOVE.W�#'LS',FHSEXT(A6)'‰MOVE.L�A1,A0‡A1�HAD�ADDR�OF�SCAN�START*)******************************************&*ˆSET�UP�A0�WITH�ADDR�OF�START�OF�SCAN'*ˆSET�UP�A6�WITH�ADDR�OF�FHS�PARM�BLOCK*‰CALL�EDITFILE�ROUTINE�****)****************************************** ‰BSR‡EDITFILE ‰TST.L…D0‰BMI.S…PINVALER*#‰BTST†#1,D0…CHECK�TO�SEE�WHETHER�OR#‰BEQ.S…NOTDEV„NOT�THIS�IS�A�DEVICE.*)*******************************************ˆ****ƒASSIGN�LOGICAL�UNIT�3*'****************************************-‰MOVE.W�#FHASGN,FHSCMD(A6)‚SET�ASSIGN�COMMAND4‰MOVE.W�#FOPEW,FHSOPT(A6)‚SET�EXCLUSIVE�WRITE�OPTION ‰FHSCALL�(A6)‰BNE.S…FATALERR*!NEWOUTE‚RTSŒ.�RETURN�FROM�ROUTINE****)******************************************"*ˆ**‚OUTPUT�IS�A�FILE�NOT�A�DEVICE.*ˆ**‚A6�CONTAINS�ADDR�OF�OUTPUT�FHS�PARM�BLOCK*)******************************************NOTDEV:%‰TST.B…D0ˆIF�FAMILY�INDICATOR�IS�SET,!‰BNE.S…PINVALER‚THAT�IS�AN�ERROR.*4‰MOVE.W�#FHALLO+FHASGN,FHSCMD(A6)‚SET�ALLOC�&�ASSIGN**Š***‚OPTIONS�SET*'‰MOVE.W�#FOPEW+FOPEND+FOPSEQ,FHSOPT(A6)+‰CLR.W�FHSLRL(A6)‚SET�LOGIC�REC�LENGTH�TO�0&‰MOVE.L�#0,FHSSIZ(A6)‚SIZE�CODE�=�ZERO*"NOTDEV1‚FHSCALL�(A6)‡MAKE�FHS�CALL ‰BEQ�NEWOUTE‰CMP.B�#5,D0‰DUP‰BNE.S�FATALERR‰MOVE.W�#FHASGN,(A6) ‰BRA�NOTDEV1‰PAGEJ****************************************************************************ˆPRINT�'INVALID�ENTRY'�ERROR*J*************************************************************************** PINVALER:*‰MOVE.L„#EM_NVE,D0ŠSET�ERROR�MESSAGE�CODE.***J***************************************************************************2*ˆROUTINE�TO�CALL�ERROR�MESSAGE�HANDLER,�THEN�DIE.*J*************************************************************************** FATALERR:#‰MOVE.L„#6,D1�OUTPUT�ERROR�TO�LU�6.‰BSR.S…C_EM_PGM+‰ERQ.TERM‚#0,#$C000‹EXIT�WITH�ERROR�STATUS.***M*******************************************************************************’CALL�TO�ERROR�MESSAGE�HAND' LER**ˆCALL†BSR‡C_EM_PGM*2*ˆINPUTS„D1�=�USER�LOGICAL�UNIT�NUMBER�FOR�OUTPUT.#*’D0�AND�A0�SET�BY�IOS�OR�FHS�CALL.*"*ˆOUTPUTSƒNO�REGISTER�PRESERVATION*N******************************************************************************* C_EM_PGM:C‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A4)ƒSAVE�D0,A0�IN�ERROR�MSG�PARAM�BLOCK.4‰LEA‡EM_PBLK(PC),A0ŠPOINT�A0�TO�THE�PARAMETER�BLOCK.5‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)‚SET�THE�LU�FOR�OUTPUT. ‰MOVE.L„#2,D0‰TRAP†#4‰RTS‰PAGE.***********************************************%*ˆCONVERT�BINARY�TO�HEX�ASCII�ROUTINE*(*ˆRIGHT�JUSTIFY�&�BLANK�FILL�ON�THE�LEFT,*ˆTHE�LEAST�SIGNIFICANT�DIGIT�IS�NOT�BLANKED* *ˆD0�=�HEX�VALUE�TO�BE�CONVERTED *ˆD1�=�LENGTH�OF�RECEIVING�FIELD7*ˆA0�=�ADDRESS�OF�LEFT�MOST�POSITION�OF�RECEIVING�FIELD* *ˆREGISTERS�USED‚0�1�2�3�4�5�6�7 *’A…*�*�* *’D…*�*ƒ*.***********************************************(BINASCƒDC.B�'0123456789ABCDEF'‚HEX�TABLE BINHEXƒEQU�*‰LEA�BINASC(PC),A1ƒINIT�ADDR‰LEA�0(A0,D1),A2‚END�LOCATION*BINLOPƒMOVE.B�D0,D3„GET�BYTE%‰ASR.L�#4,D0†SHIFT�OFF�LAST�HEX�VALUE!‰AND.L�#$F,D3„MASK�OFF�OTHER�BITS2‰MOVE.B�0(A1,D3),-(A2)‚MOVE�FROM�TABLE�TO�REC�AREA‰CMP.L�A2,A0…ARE�WE�DONE‰BLT�BINLOP†NO*‰CMP.W�#1,D1…ONLY�ONE�CHAR‰BEQ.S�BINOUT„YES*ˆDO�ZERO�SUPPRESSION*‰LEA�0(A0,D1),A2‚INIT�END�LOC‰SUB.L�#1,A2…FIX�END�LOC!BINSP„CMP.B�#'0',(A0)‚ASCII�ZERO?‰BNE.S�BINOUT†NO�GET�OUT%‰MOVE.B�#'�',(A0)+‚REPLACE�WITH�BLANK‰CMP.L�A0,A2…ARE�WE�DONE ‰BGT�BINSP‡NO**BINOUTƒRTS�.�RETURN‰PAGE-*********************************************+*‚32�BIT�BINARY�TO�DECIMAL�ASCII�SUBROUTINE-**********************************************,*‚CONVERTS�BINARY�IN�D0�AND�PUTS�ASCII�DIGIT(*…CHARACTERS�AT�ADDRESS�SPECIFIED�IN�A0.(*…LEADING�ZEROS�ARE�CONVERTED�TO�SPACES.+*…THE�FIELD�LENGTH�(NO.�CHARS)�IS�SPECIFIED *…IN�D1�IN�THE�CALLING�SEQUENCE.**‚CALLING�SEQUENCE:!*…MOVE.L�,�D0*…MOVE.L�,D11*…MOVE.L�,A0*…BSR�BINDECFJ* *‚RETURNS:*…D0�=�0�=>GOOD�CONVERSION**‚REGS�USED:‚0�1�2�3�4�5�6�7 *ŠDƒ*�*�**ŠAƒ*�*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�#'‚',D2�INITIALIZE�ACCUMULATOR%BINDECF1 SUB.L (A1),D0 SUBTRACT 10**N BCS.S BINDECF2 BRANCH TOO BIG* ADD.W #1,D2 INCREMENT CURRENT DIGIT COUNT BRA BINDECF1 CONTINUE)BINDECF2 ADD.L (A1)+,D0 RESTORE, ADV PNTR TST.L (A1) TEST DONE BEQ.S BINDECF4 BRANCH DONE �CMP.W�#'‚',D2�LEADING�ZERO�TEST! BEQ.S BINDECF3 BRANCH STILL ZERO# ADD.B #$10,D2 BRING TO ASCII DIGIT%BINDECF3 MOVE.B D2,(A0)+ DEPOSIT CHAR LSL #8,D2 SAVE CHAR DEPOSITED# MOVE.B #$20,D2 RESTORE LS TO SPACE BRA BINDECF1 CONTINUE4BINDECF4 ADD.B #$10,D2 LAST ONE BECOMES DIGIT ALWAYS" MOVE.B D2,(A0)+ DEPOSIT LAST CHAR' TST.L D0 SET CONDITION CODE, 0 IF GOOD BINDECF5 RTS‰PAGE2***************************************************!*ˆCONVERT�BINARY�TO�ASCII�ROUTINE*5*ˆBINARY�TO�HEX�CONVERSION�FOR�LONG�WORD�(FOUR�BYTES)**ŠCONVERT�BINARY�VALUE�IN�D0�TO�HEX�STRING*‹D0‚=‚VALUE�TO�BE�CONVERTED *‹D1‚=‚LENGTH�OF�RECEIVING�FIELD'*‹A0‚=‚START�ADDRESS�OF�RECEIVING�FIELD**!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7 *“D„*�*�**“A„**3****************************************************+BHLCVTƒMOVE.L�#'„',(A0)‚BLANK�RECEIVE�FIELD‰MOVE.L�#'„',4(A0) ‰MOVE.L�#8,D1‰MOVE.W�#$2000,D2‚INITBHLCU1ƒROL.L�#4,D0†GET�4�BITS‰MOVE.B�D0,D2„SAVE�D0)‰AND.B�#$F,D2„CLEAR�ALL�EXCEPT�LOW�4�BITS"‰ADD.B�#$20,D2ƒSET�FOR�SPACE�CHECK ‰CMP.W�#$2020,D2‚LEADING�SPACE�?‰BEQ.S�BHLCU3„YES‰ADD.B�#$10,D2ƒCONVERT�TO�NUM‰CMP.B�#$39,D2ƒIS�IT�A�NUM‰BLE.S�BHLCU2„YES‰ADD.B�#7,D2…GET�TO�LETTERSBHLCU2ƒMOVE.B�D2,(A0)+BHLCU3ƒASL.W�#8,D2†MOV' E�WORD‰SUB.B�#1,D1…REDUCE�COUNT‰BHI�BHLCU1†BR�NOT�ZERO ‰RTS�.�RETURN*‰PAGE ‰END�BEGPROCééééé=/* =/*†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 ƒ=ARG�INIT.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 ƒ=ARG�INIT.LL=/ENDIF=/*=LINK ,INIT.LO,\1;AHMIX ATTRIBUT( ES PSEG SEG0:0-15 $0 INPUT INIT.ROLIB 0.&.UTILIB.ROEND=/*=ENDéééééé÷‰PAGE6ˆTTLƒINITIALIZE�DISK�&�DISKETTE�UTILITY�-�Rev�022585�4(INIT„IDNT‚1,8‚INIT�&�FORMAT�DISK�UTILITY<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;**************************************************************‹PROGRAM�NAME�IS‚I�N�I�T�.�L�O**,*†*****ƒINITIALIZATION�OF�DISK�COMMANDƒ******)*ˆTHIS�PROGRAM�WILL�INITIALIZE�THE�VOLUME)*ˆIDENTIFICATION�BLOCK�ON�SECTOR�ZERO�AND+*ˆTHE�SECTOR�ALLOCATION�TABLE�ON�SECTOR�ONE,*ˆTHE�INPUT�MUST�BE�A�DEVICE�BUT�AN�OLD�DISK+*ˆCAN�BE�USED.�THE�EFFECT�WILL�BE�TO�SET�IT*ˆUP�AS�IF�IT�IS�A�NEW�DISK.+*ˆTHE�FORMAT�OPTION�WILL�RESULT�IN�THE�DISK*ˆBEING�REFORMATTED2*ˆFOR�A�USER�0�DISK�OR�DISKETTE�THE�BOOTSTRAP�FILE *ˆAND�THE�DUMP�FILE�CAN�BE�ADDED.*ˆFOR�THE�HARD�DISK�THE�LOCK�OUT�TABLE�AND�THE'*ˆDIAGNOSTIC�TABLE�&�AREAS�CAN�BE�ADDED** *ˆREV�1.00!*ˆREGISTERS�USED:�0�1�2�3�4�5�6�7*’D…*�*�*�*�*�*�*�**’A…*�*�*�*�*�*�*�***H**************************************************************************’MODIFICATION�HISTORY**ˆREVISION�031385�46*’In�SLTUP,�if�a�lockout�entry�cannot�be�used,�because5*’it's�a�dup,�location�LASTALT�had�gotten�incremented4*’so�that�the�next�time�SLTUP�is�entered�we�may�look*’off�the�end�of�the�disk.*ˆREVISION�031285�44*’In�DSKALTA,�if�an�error�were�found�while�searching4*’the�alternate�area,�INIT�would�begin�rereading�the4*’area�immediately�after�the�error,�instead�of�skip-*’ping�to�the�next�track.*ˆREVISION�022585�4éé( ù/ *+!J)V1h9fAbI?QJY\aFi,qyf�‰6‘ ™L¡V©?±8¹NÁJÉFÑ:ÙFá=éD5*’If�printer�is�unavailable�when�trying�to�output�the3*’SLT�list�in�procedure�PRTSLT,�instead�of�aborting5*’INIT�will�output�a�message�to�the�terminal�and�skip1*’the�output.‚Also,�when�entering�SLT�entries�and4*’too�many�entries�are�entered�(when�using�alternate4*’track�capability),�the�correct�message�of�TOO�MANY *’ERRORS�ON�DISK�will�be�output.*ˆREVISION�011085�47*’Two�problems�were�found�during�testing�of�INIT�during5*’development�of�V4.4.‚If�a�user�used�the�S�option�on6*’a�floppy,�the�volume�ID�would�get�wiped�out.‚Problem5*’traced�to�bad�value�store�in�A3�on�entry�to�UPDVOL.5*’Second�problem�was�that�the�count�of�used�alternate5*’tracks�was�not�initialized�before�adding�a�new�one;3*’permitting�a�user�to�enter�more�than�the�maximum.**ˆREVISION�010485�44*’During�testing�of�V4.4,�INIT�was�found�to�zero�out6*’the�volume�of�a�disk(ette)�if�an�error�condition�was8*’detected�after�the�Request�Status�command�was�reached.7*’Also,�if�the�user�tried�to�lock�out�a�sector�that�was7*’greater�than�the�disk,�the�utility�would�hang�and�not5*’finish�if�the�S�option�were�used,�or�get�an�INVALID1*’RANDOM�SECTOR�if�a�normal�init�were�being�done.**ˆREVISION�111384�42*’During�development�of�VERSAdos�4.4�the�number�of2*’random�access�devices�was�increased�to�the�pointéé/*’that�the�Fetch�Device�Mnemonics�call�caused�a-*’buffer�overflow.‚Therefore,�the�size�of�the2*’buffer�length�in�the�FHS�call�was�increased.‚The2*’buffer�area,�itself,�was�not�increased.‚So,�when5*’the�fetch�is�done,�part�of�the�first�part�of�INIT's4*’instruction�area�is�overwritten,�which�has�already*’executed,�causing�no�problem.*ˆREVISION�101984�47*’SPR�839�had�users�unable�to�enter�load�addresses�with5*’the�normal�hexadecimal�prefix�'$'.‚INIT�now�permits5*’this�address�(which�is�always�assumed�to�be�in�hex)6*’the�user�the�luxury�of�using�the�dollar�sign�or�not. *’Change�was�inserted�in�NUMCVT.*7*’SPR�1023�indicated�that�since�INIT�only�looked�at�the7*’first�four�characters�entered�for�the�volume�ID,�INIT8*’should�tell�the�user�of�that�fact.‚Therefore,�a�change-*’was�made�to�the�message�output�to�the�user.*4*ˆREVISION�092184�4‚(all�changes�marked�by�'ALTTRK')(*’A�change�was�installed�to�have�INIT�be5*’able�to�take�advantage�of�some�controller's�ability5*’to�map�bad�tracks�to�alternates.‚Thus,�an�extensive:*’change�was�installed�to�detect�certain�errors�during�the;*’validation�portion�of�INIT�and�if�found,�map�those�tracks9*’to�an�available�alternate.‚In�addition,�those�known�bad:*’tracks�which�are�manually�entered�will�also�be�mapped�to5*’an�alternate.‚All�of�the�detected�bad�spots�will�be9*’written�onto�the�disk�in�the�SLT�and�saved�from�init�to8*’init�if�the�user�desires.‚For�complete�details�see�the1*’engineering�spec�"VERSAdos�Bad�Block�Handling".*ˆREVISION�040384�44*’If�a�bad�spot�was�found�during�disk�validation,�in5*’routine�DSKSAT�register�D6�was�destroyed�so�that�on+*’to�the�DSKVAL�area,�instead�of�having�the7*’increment�to�obtain�the�next�track�to�look�at,�D6�had7*’the�last�bad�secto) r�found.‚The�correction�was�to�save2*’and�restore�all�registers�in�the�DSKSAT�routine.*ˆREVISION�030584�4;*’A�path�was�overlooked�with�the�revision�of�011784�for�the(*’delay.‚It�was�corrected�with�this�fix.*ˆREVISION�030184�4;*’If�you�tried�to�initialize�a�raw�diskette�which�was�write9*’protected�you�would�get�an�invalid�error�message.�Logic=*’was�added�to�give�the�correct�errormsg.‚In�addition�to�this;*’on�the�EXORMACS�the�IPC�driver�would�hang�up.�The�IPC�bug8*’needs�to�be�resolved.‚The�errormsg�fix�happens�to�be�a8*’work�around�for�the�IPC�problem�but�is�not�a�true�fix.I****************ƒTHIS�LOGIC�WAS�COMMENTED�OUT�AS�THE�PROPER�FIX�WAS�FOUND1****************ƒTO�BEW�IN�FUTY.SA�AND�WAS�SO�PUT*ˆREVISION�012684�4;*’A�bug�existed�which�caused�a�'C5'�error�'invalid�transfer>*’for�device'�(LU6)�to�be�displayed�if�incorrect�configuration9*’had�been�previously�entered.‚It�seems�that�INIT�was�not9*’setting�up�the�IOS�function�codes�and�options�correctly7*’on�the�second�pass�thru�configuration.‚Instead�it�was7*’leaving�the�old�configuration�command�code�in�the�IOS=*’parameter�block�and�applying�it�to�LU�6�(The�same�parameter:*’block�was�being�used�to�do�configures�as�well�as�message5*’displays).‚The�fix�was�to�go�into�SENDMSG�and�force8*’the�command�and�options�fields�to�their�correct�values *’before�trying�to�do�the�write.*ˆREVISION�011784-4*5*’The�validation�sequence�was�incorrectly�calculating2*ˆthe�bit�to�be�set�if�it�encountered�bad�sectors.8*’If�a�user�requested�Sector�Lockout�Table�the�parameterA*ˆblock�that�was�used�for�a�read�was�also�use�for�a�write�and�the?*ˆwrite�was�altering�values�in�the�parameter�block�and�when�the?*ˆvalidation�sequence�started�it�was�using�the�wrong�parameters>*ˆand�caused�invalid�results.�(ie�destroying�the�VID�which�was<*ˆlater�restored,�telling�you�there�were�no�bad�sectors�when*ˆin�fact�there�was)0*’Put�in�a�loop�delay�for�5�1/4�inch�floppy�if�a/*ˆvolume�error�is�encountered�(LOOP514‚LPCT514)**ˆREVISION‚010584�4*7*’Made�a�modification�to�include�file�DSKCFGCD.AI�so�as:*’not�to�use�internal�tags�VOLMMTDE�and�SENDMSG�since�this8*’include�file�is�also�used�by�MT�and�those�tags�are�not*’available�there.**ˆREVISION‚121583�4*6*’Commented�out�the�line�dated�12/15/83�which�branched>*ˆalways�to�DSKRD.�This�corrected�the�problem�of�repeated�READ**ˆERROR�message�for�same�bad�sector�found.**ˆREVISION‚102483�4*+*’Init�modified�to�eliminate�error�$E4�when1*’initializing�single�sided�floppy�for�128�bytes.**ˆREVISION‚101083-4‚RJ1*’Modified�INIT�to�correct�problem�of�overwriting8*ˆthe�VID�of�any�'system�recognized'�media�on�the�system5*ˆwhose�volume�name�corresponds�to�that�bieng�used�to9*ˆname�media�bieng�initialized.�INIT�now�issues�a�message=*ˆindicating�that�the�volume�name�requested�is�already�on�the;*ˆsystem,�and�allows�a�new�volume�name�to�be�given.�This�is=*ˆdone�repeatedly�until�the�volume�name�chosen�does�not�match,*ˆone�already�in�the�device�mnemonics�table.**H************************************************************************H*************************************************************************“ENHANCEMENTS�SINCE�3.0*4*‚1.�OPTION�V�HAS�BEEN�ADDED�FOR�THE�USER�TO�SPECIFY$*…THE�LOAD�ADDRESS�OF�THE�BOOT�FILE.**…EXAMPLE�CALL:**�INIT�#FD05;V*7*‚2.�DIAGNOSTIC�DATA�IS�WRITTEN�ONTO�THE�HARD�DISK�WHEN$*…DIAGNOSTIC�TEST�AREA�IS�ASKED�FOR.*7*‚3.�ALTERNATE�SECTOR�CAPABILITY�ADDED�FOR�VERSAdos�4.44*…SEE�ENGINEERING�SPEC�"VERSAdos�Bad�Block�Handling"*=*************************************************************=**************************************************************‰PAGE***ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ*ˆINCLUDE�&.DSKCFGDT.AI*ˆINCLUDE�&.DSKCFGCD.AI**‰NOLIST‰INCLUDE�9995.&.FME.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.TR1.EQ‰LIST**‰PAGE‰LIST ‰LLEN�120*2**************************) **************************…***ƒI�N�I�T‚COMMANDƒ*******„DATA�SEGMENT�(DSEG)ƒ****1**************************************************ˆH�A�R�DƒD�I�S�K*ˆ256�BYTES�/SECTOR*ˆ64�SECTORS/TRACK*ˆ823�TRACKS/SURFACE*ˆ16�MEGA�BYTES�=�52672�SECTORS***ˆ****‚EQUATE�AREA‚******* BEGDATA‚EQU�0CR‡EQU�$0DŠCARRAGE�RETRUNLF‡EQU�$0AŠLINE�FEED$STKLENƒEQU�050ŠSTACK�LENGTH�IN�WORDS*COMMSIZE‚EQU�160‰INPUT�COMMAND�BUFFER�SIZE*LOCKSN„EQU�8‹#�OF�SECTORS�IN�LOCKOUT�TABLE,LOCKSE„EQU�42Š#�OF�LOCKOUT‚ENTRIES�IN�SECTOR DSKLUI„EQU�1(DSKLUOƒEQU�2‹DISK�LOG�UNIT�ASSIGN�OUTPUT!LISTLUƒEQU�3‹LISTING�LOGICAL�UNITDSKLUVI‚EQU�4‹LOG�UNIT�4DSKLUVO‚EQU‚7ŠLOG�UNIT�7TSKNAMƒEQU�'INIT'†MY�TASK�NAMESECLENƒEQU�256‰SECTOR�LENGTHEVIDOSL‚EQU�0‹OS�LENGTH�EQUATE#EVIDOSE‚EQU�$0ŠOS�EXECUTION�ADDRESS*ƒSEE�DATA�SECTION�FOR�EVIDVNO'SIZ1DSK‚EQU�1001ˆSINGLE�SIDED�DISK�SIZE'SIZ2DSK‚EQU�2002ˆDOUBLE�SIDED�DISK�SIZEDHDSECTRK�EQU�64ŠNUMBER�OF�SECTOR�PER�TRACK�ON�A�HARD�DISK�(IPC�TYPE)BN00…EQU�0‹BIT�NBR�0&CFIGSEC‚EQU�1…CONFIGURE�SECTOR�ADDRESS/CFIGLEN‚EQU�1…CONFIGURE�BLOCK�LENGTH�IN�SECTORS>*+********************************************ˆIOS�PAR�TABLE�FOR�DISK�READ*ˆFOR�VALIDATE�OF�DISK�SECTORS+******************************************** RDSKIOS‚EQU�* ‰DC.W�IOREAD‰DC.W�IOPBLK+IOPRAN‰DC.B�0 ‰DC.B�DSKLUO‰DC.B�0‰DC.B�0‰DC.L�0 RDSKS„DC.L�0 RDSKE„DC.L�0‰DC.L�0‰DC.L�07********************************************************ˆFILE�IOS�TABLE‚INPUT7******************************************************* FILEIOS‚EQU�* ‰DC.W�IOREAD‰DC.W�IOPBLK+IOPNXT‰DC.B�0 ‰DC.B�DSKLUVI‰DC.B�0‰DC.B�0‰DC.L�0 FILESAƒDC.L�0 FILESBƒDC.L�0 FILELIƒDC.L�0‰DC.L�0*1**************************************************’FILE�PARM�TAB�OUTPUT1************************************************* FILEOOS‚EQU�* ‰DC.W�IOWRIT‰DC.W�IOPBLK+IOPNXT‰DC.B�0 ‰DC.B�DSKLUO‰DC.B�0‰DC.B�0‰DC.L�0FILEOOS1 DC.L 0 FILEEOƒDC.L�0‰DC.L�0‰DC.L�0*/*************************************************ˆFORMAT�DISK�PARAMETER�BLOCK*.***********************************************#‰IOS.FORM�IOFRMT,0,DSKLUO,0,0,0,0,0‰DS.W�0*3*****************************************************ŒIOS�PARAMETER�TABLE(*ˆSET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK*3**************************************************** OUT6IOS‚EQU�* ‰DC.W�IOWRIT‰DC.W�0‰DC.B�0 ‰DC.B�LDFLUN‰DC.B�0‰DC.B�0‰DC.L�0OUT6SAD‚DC.L�0OUT6EAD‚DC.L�0‰DC.L�0‰DC.L�0*0‰IOS.OUT6I�IOWRIT,IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0*;***********************************************************,*ŠMEMORY�SEGMENT�BLOCK�FOR�DIAGNOSTIC�BUFFER;************************************************************MSBDIAG‚DC.L„0’TASK�NAME‰DC.L„0’SESSION�NUMBER‰DS.W„1’DIRECTIVE�OPTION‰DC.W„0’SEGMENT�ATTRIBUTES‰DC.L„'DIAG'�SEGMENT�NAME‰DC.L„0’LOGICAL�ADDRESS‰DS.L„1’SEGMENT�LENGTH‰PAGE5******************************************************2*ˆIOS�PARAMETER�BLOCK�FOR�CONFIGURATION�VALIDATION* CHCKIOS‚EQU�* ‰DC.W�IOREAD ‰DC.W�IOPRAN‰DC.B�0 ‰DC.B�DSKLUO‰DC.B�0‰DC.B�0‰DC.L�0‰DC.L�0‰DC.L�0‰DC.L�0‰DC.L�0‰DS.W�0+********************************************ˆIOS�PARAMETER�FOR�CONFIGURE *ˆREQUESTS+******************************************** CONFIOS‚EQU�* ‰DC.W�IOSTAT‰DC.W�0‰DC.B�0 ‰DC.B�DSKLUO‰DC.B�0‰DC.B�0 ‰DC.L�0„*CONFIGURE�BLOCK�ADDRESS‰DC.L�0‰DC.L�0‰DC.L�0‰DC.L�0-**********************************************$*ˆDISK�CONFIGURATION�PARAMETER�BLOCK*DCPBLK‰DC.B†0‰DEVICE�STATUS‰DC.B†0‰CHANNEL�TYPE‰DC.B†0‰DEVICE�TYPE‰DC.B†0‰DRIVER�CODE‰DC.W†0‰ATTRIBUTES�MASK‰DC.W†0‰PARAMETERS�MASK‰DC.W†0‰ATTRIBUTES�WORD‰DC.W†0‰RE* CORD�LENGTH‰DC.L†0‰DEVICE�SIZE‰DC.L†0‰WRITE�TIMEOUT‰DC.L†0‰READ�TIMEOUT‰DC.B†0‰SECTORS�PER�TRACK ‰DC.B†0‰NUMBER�OF�HEADS�ON�DRIVE$‰DC.W†0‰NUMBER�OF�CYLINDERS�ON�MEDIA"‰DC.B†0‰INTERLEAVE�FACTOR�ON�MEDIA‰DC.B†0‰SPIRAL�OFFSET�ON�MEDIA%‰DC.W†0‰PHYSICAL�SECTOR�SIZE�OF�MEDIA%‰DC.W†0‰PHYSICAL�SECTOR�SIZE�OF�DRIVE$‰DC.W†0‰NUMBER�OF�CYLINDERS�ON�DRIVE9‰DC.W†0‰PRECOMPENSATION�CYLINDER�#�(USUALLY�.5�TOTAL�CYL)+‰DC.B†0‰PHYSICAL�SECTORS�PER�TRACK�ON�DRIVE‰DS.B†7‰RESERVEDD*********************************************************** <>‰PAGE;************************************************************+*ˆLOOK-UP�TABLE�AN�CONFIGURATION�BLOCKS�FOR'*ˆIPC�DOUBLE�AND�SINGLE�SIDED�DISKETTES*;************************************************************/*ˆCONFIGURATION�BLOCK�FOR�SINGLE�SIDED�DISKETTE*SSCONF‰DC.B†0‰DEVICE�STATUS‰DC.B†XTDIPC„CHANNEL�TYPE‰DC.B†XDSFDK„DEVICE�TYPE‰DC.B†IODIPC„DRIVER�CODE‰DC.W†$FFFF…ATTRIBUTES�MASK‰DC.W†$FFFF…PARAMETERS�MASK.‰DC.W†1<>*$*ˆFHS�PARAMETER�BLOCK�FOR�DISK�INPUT* INFHSƒEQU�*‰DC.W�FHASGNŠCOMMAND*‰DC.W�FOPEREWŠOPTIONS-EXCLUSIVE�RE+ AD/WRITE‰DC.B�0ŠSTATUS‰DC.B�DSKLUI…LOGICAL�UNIT�NUM‰DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUM‰DC.L�$20202020ˆCAT�NAME‰DC.L�$20202020‰DC.L�$20202020ˆFILE�NAME‰DC.L�$20202020 ‰DC.W�$2020‰DC.W�0‰DC.L�0,0,0,0,0,0*%*ˆFHS�PARAMETER�BLOCK�FOR�DISK�OUTPUT* OUTFHSƒEQU�*‰DC.W�FHASGNŠCOMMAND1OUTOPTS‚DC.W�FOPEREWŠOPTIONS-EXCLUSIVE�READ/WRITE‰DC.B�0ŠSTATUS‰DC.B�DSKLUO…LOGICAL�UNIT�NUM!OUTVOLƒDC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUM‰DC.L�$20202020ˆCAT�NAME‰DC.L�$20202020‰DC.L�$20202020ˆFILE�NAME‰DC.L�$20202020 ‰DC.W�$2020‰DC.W�0‰DC.B�0ŠWRITE�PROT�CODE‰DC.B�0‰DC.W�0OUTDIRƒDC.L�0ŠCONT�FILE�SIZE ‰DC.L�0,0,0*‰DS.W�0*0*************************************************’DIRECTORY�TABLE'***************************************DIRBLKƒDS.B„FDLEN‰DS.W�0* BUFPARƒEQU�*‰DC.L�0,0‡TASK�(0=SELF)+‰DC.W�$2000…OPTIONS�(LOGICAL�ADR�=�PHYS�ADR‰DC.W�0Š(RAM�SEGMENT)‰DC.L�'BUFR'…NAME�OF�SEGMENTBUFADRƒDC.L�0ŠSTART�OF�BUFFERBUFPARS‚DC.L�0ŠLENGTH�OF�BUFFER*7********************************************************,*ˆPARAMETER�TABLE�FOR�FETCH�DEVICE�NMENONICS*7*******************************************************FETDEVƒDC.W�FHFDMN…CMD‰DC.W�FOPFRA…OPTIONS‰DC.W�0ŠSTATUS�&�RESERVED‰DC.L�0ŠBUFFER#‰DC.L�SECLEN*2ƒBUFFER�LENGTHƒ111384‰DS.W�0LOCKPAR‰DC.L�0,0ˆTASK�(0=SELF),‰DC.W�$2000†OPTIONS�(LOGICAL�ADR�=�PHYS�ADR)‰DC.W�0Š(RAM�SEGMENT)‰DC.L�'LOCK'†NAME�OF�SEGMENT‰DC.L�$FFˆLENGTH�OF�SEGMENT‰PAGE***’ERROR�MESSAGE�PARAMETER�BLOCK**EM_PBLK: EM_DO:ƒDC.L†0"*œD0�-�IOS/FHS�RETURN�ERROR�STATUS*œ(ERROR�MSG�KEYVALUE) EM_A0:ƒDC.L†0"*œA0�-�ADDR�OF�I/O�PARAMETER�BLOCKEM_OPT:‚DC.B†0*œOPTIONS�FLAG*œBIT‡MEANING�IF�SET*�0ˆQUERY�RESPONSE�DESIREDEM_TLUN:�DC.B†0*œUSER�TERMINAL�LUN�-�(LDFLUN)EM_QRC:‚DC.B†0*œQUERY�RETURN�CHARACTEREM_KLUN:�DC.B†0*œUSER�KEYBOARD�LUN�-(CDFLUN)EM_SPA:‚DC.L†0'*œSTART�ADDRESS�FOR�USER�TEXT�PLUG�POOLEM_EPA:‚DC.L†0%*œENDƒADDRESS�FOR�USER�TEXT�PLUG�POOL‰DS.W�0*‰PAGE*<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<*****************************************************************ˆ***ƒWORK‚AREAƒ******9************************************************************‚OPTION�V�WORK�AREA*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84 LOOP514‚EQU‡4,*œNUMBER�OF�1/2�SECOND�DELAYS�TO�PERFORM�FOR(*œ5�1/4�INCH�FLOPPY�IF�A�VOLUME�ERROR�IS *œENCOUNTEREDLPCT514‚EQU‡500!*œNUMBER�OF�MILLISECONDS�TO�DELAY ISSEVALUE:2‰DC.L†0‰INITIAL�SAT�START/END�VALUE�FOR�VALIDATION‰DC.L†0‰PROCESSING *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<5VOPT…EQU…0’'V�'�OPTION�(OFFSET�ADDRESS�FOR�BOOT�FILE)1VOPTR„EQU…1’'V'‚OPTION�ROUTINE�IS�CALLING�ROUTINEOPTFLGƒDC.B„0’OPTION�FLAG,LDWD…EQU…$B0�LOAD�ADDRESS�LOCATION�IN�L.I.P.*EXCWD„EQU…$104�OFFSET�TO�EXECUTION�ADDRESS,STKWD„EQU…$100�OFFSET�TO�INITIAL�STACK�VALUE9ENTRPTƒEQU…$16�OFFSET�TO�ENTRY�POINT�IN�L.I.P.(EXECUTION)!LDADR„DC.L„0’INITIAL�LOAD�ADDRESS-ENTADRƒDC.L„0’BUFFER�FOR�ENTERED�LOAD�ADDRESS)BIAS…DC.L„0’BUFFER�FOR�ADDRESS�BIAS�VALUE**ƒDIAGNOSTIC�BUFFER�AREA*4DIASTRT‚DS.L„1’STARTING�ADDRESS�OF�DIAGNOSTIC�BUFFER.DIAENDƒDS.L„1’END�ADDRESS�OF�DIAGNOSTIC�BUFFER0SEED…DC.L„$092855ŒSEED�FOR�RANDOM�NUMBER�ROUTINE** BUFDUMƒEQU�* ‰DS.B�SECLENBUFDUME‚EQU�*-1STSKNAMƒDC.L�0‰SAVE�TASK�NAMESESNUMƒDC.L�0ˆSAVE�SESSION�NUM#VOLNAMƒDC.L�0‰SAVE�VOL�DEFAULT�NAME‰DC.W�0/USERNUM‚DC.W�0ŠDEFAULT�USER�NUM�(16�BIT�BINARY)*CATNAMƒDC.L�0,0ˆSAVE�DEFAULT�CATAGORY�NAMEREGD6„DC.L�0ŒSAVE�REG�6 ‰DC.L�0ŠREG�7ADDREGƒDS.L�1ŠADDRESS�REG'S‰DS.L�1‰DC.W�0ŠTOP�HALF�OF�REG�2ADDREG2‚DC.W�0ŠLOG�ON�USER�NUM‰DS.L�6ŠOTHER�REGS+LOCKPSN‚DC.L�0ŠSTART�PSN�NUMBER�FOR�LOCKOUTLOCKRNG‚DC.W�0ŠRANGE�OF�LOCKOUT/SUBFLAG‚DC.B�0ŠFLAG�FOR�CHKBITS/SET�BITE�IN�SAT*‰DS.W�0OKANS„DC.B�'„'‡OK�MSG�ANSWEROKANSEƒE+ QU�*-2‰DS.W�0#FORMANS‚DC.B�'„'‡FORMAT�DISK�ANSWERFORMANSE EQU *-2‰DS.W�0DESCAN$‚DC.B�'�$'-DESCANS‚DC.B�'Š'‚AREA�FOR�DESCRIPTION�20�CHAR ‰DC.B�'‹'DESCANSE�EQU�*-2‰END�OF�AREA!‰DC.B�'‚'‡HOLD�LAST�CR�AFTER�DESC*‰DS.W�0.TABDATE‚DC.B�'ˆ'‚DATE�FROM�SYSTEM�(DATE�&TIME)*(INFORNƒDC.B�0ŠDISK�HAS�NO�VOL�NAME�ON�IT!FORMFLAG�DC.B�0ŠFORMATT�DISK�FLAG&ONESECT‚DC.B�0ŠONE�SECTOR�FOR�SAT�FLAG(ZEROFLAG�DC.B�0ŠINIT�DISK�HAS�USE�#�ZEROFLOPPYƒDC.B�0ŠFLOPPY�DISK>LOCKWRT‚DC.B�0ŠWRITE�OUT�SECTOR�LOCKOUT�TABLE�INDICATOR„ALTTRK*WSATFLAG�DC.B�0ŽWRITE�SAT�FLAG�FOR�LOCKOUT7POSITION�DC.B�0ŽFLAG�FOR�DIAG�ROUT�START�OR�END�OF�SIDE,BSTFLAG‚DC.B�0ŽFLAG�FOR�BIT�TEST�OR�SET�PASS‰DS.W�0 SAVOUT‚DC.L�0,SAVSIDE‚DC.L�0ŠTOTAL�SECTORS�ON�ONE�SIDE�(D)#FPSN…DC.L�0ŠFIRST�PSN�OF�CYLINDER�1&LPSN…DC.L�0ŠFIRST�PSN�OF�LAST�CYLINDER1SATADDR‚DC.L�0ŠWORKING�ADDR�OF�SAT�(LOGICAL�ADDR)#SAVEREM‚DC.W�0ŠBITS�IN�LAST�SECTION+SAVESATL�DC.W�0‰NUM�OF�SECTORS�IN�SAT�TABLE SAVCYLƒDC.W�0‰#�OF�CYLINDERS�(C)%SAVSECƒDC.W�0„#�OF�SECTORS�/TRACK�(B)SAVHEAD‚DC.W�0†#�OF�HEADS‚(E)IPCFLAG‚DC.B†0‰IPC-NON�IPC�INDICATOR�--�00�IF�WORKING�WITH�IPC*µFF�IF�NON�-�IPC7ALTCONF‚DC.B†0‰ALTERNATE�SECTOR�CAPABLE�DRIVER‚<PRMSGFLG�DC.B†0‰PRINTER�UNAVAILABLE�MSG�PRINTED�TO�TERM‚022585‰DS.W†0+TOTSECS‚DC.L†0‰TOTAL�SECTORS�ON�DISK‚0104856ALTLAST‚DC.L†0�LAST�SECTOR�TO�BE�WRITTEN�IF�ALT�DRIVER9ALTSAVE‚DC.L†0�CURRENT�TRACK�BEING�READ�DURING�VALIDATION2LASTALT‚DC.L†0�LAST�ALTERNATE�SECTOR�USED‚ALTTRK>>@VLTBFLAG�DC.B†0‰VOLUME�NAME�IN�TABLE�FLAG.--�01�IF�NAME�IN�TABLE *¹00�IF�NOTééééé, é*‰DS.W�05DIAGPAT1 DC.L $0F1E2D3C,$4B5A6978,$8796A5B4,$C3D2E1F0-‰DC.L�$0F1E2D3C,$4B5A6978,$8796A5B4,$C3D2E1F0-‰DC.L�$F1F2F4F8,$F9FAFCFE,$FF7FBFDF,$EF6FAFCF-‰DC.L�$4F8F0F07,$0B0D0E06,$0A0C0408,$04020100.***********************************************"*ˆSTART�OF�PRINT�HEADERS�&�BUFFERS*.**********************************************‰DS.W�0*$BITSONƒDC.B�$FF,$7F,$3F,$1F,$F,7,3,1‰DS.W�0#BIT1…DC.B�0,$C0,$E0,$F0,$F8,$FC,$FE*‰DS.W�0'BIT2…DC.B�0,$80,$C0,$E0,$F0,$F8,$FC,$FE***‰DS.W�0 OKM†EQU�*‰DC.B�'OK�TO�INITIALIZE�#'DEVM1„DC.L�'„'‰DC.B�'‚(Y/N)�?�' OKMES„EQU�*-1‰DC.B�'ƒVOLUME�'$VOLM1„DC.L�'„'…VOLUME�NAME�GOES�HERE OKME…DC.B�'�'*‰DS.W�0 SATERMƒEQU�*)‰DC.B�'ERROR�SECTOR�ALLOC�TABLE�EXCEEDED'SATERME‚EQU�*-1*‰DS.W�0*BADSM„DC.B�'„'‰DC.B�'�ENTRIES�ARE�IN�SLT�'BADSMEƒEQU�*-1‰DS.W�0*0NAMM…DC.B‚'FILE�NAME�IS:�'ˆGET�NAME�FOR�BOOT�MSG PRTBUFƒEQU�* ‰DC.L„'”' ‰DC.L„'”'#PRTBEND‚EQU�*-1‹END�OF�PRINT�BUFFER NAMME„EQU�*-1‰DS.W�0*&NAMMR„DC.B�'ENTER�NEW�NAME�IF�NEEDED‚'NAMMREƒEQU�*-1*‰DS.W�0*3DESCM„DC.B�'ENTER�DESCRIPTION�(MAX�20�CHARACTERS)�'DESCMEƒEQU�*-1*‰DS.W�0* VALMSGƒEQU�*/‰DC.B�'DO�YOU�WANT�TO�VALIDATE�SECTORS�(Y/N)?�'VALMSGE‚EQU�*-1*‰DS�0&VALMSG2‚DC.B�'ƒVALIDATING�SECTORS....'VALMSG2E EQU *-1‰DS.W�0*VOLR…DC.L�'†'…HOLD�VOLUME�NAME VOLRE„EQU�*-1‰DC.B�'�'ŒDEADSPACE�FOR�SBARG*‰DS�0GVOLMSGƒDC.B�'ENTER�NEW�VOLUME�NAME�(only�the�first�4�characters'ƒ101984‰DC.B�'�are�used)�'ª101984VOLMSGE‚EQU�*-1‰DS.W�0* FORMSGƒEQU�*+‰DC.B�'DO�YOU�WANT�TO�FORMAT�DISK�(Y/N)�?‚'FORMSGE‚EQU�*-1‰DS.W�0 FORSMSG‚EQU�*‰DC.B�'START�FORMAT'FORSMSGE EQU *-1‰DS.W�0 USNM…EQU�*‰DC.B�'ENTER�USER�NUMBER�' USNME„EQU�*-1‰DS.W�0WORKUSN‚DC.B�'†' ‰DC.B�'‚'‰DS.W�0/LOCKQ„DC.B�'ENTER�LOCKOUT�START�SECTOR�NUMBER�'LOCKQEƒEQU�*-1‰DS.W�00LOCKN„DC.B�'ENTER�NUMBER�OF�CONTIGUOUS�SECTORS�'LOCKNEƒEQU�*-1‰DS.W�07LOCKM„DC.B�'DO�YOU�HAVE�LOCKOUT�TABLE�ENTRIES�(Y/N)�?�'LOCKMEƒEQU�*-1‰DS.W�0:DUPLOCK‚DC.B�'ƒLOCK�TABLE�ENTRY�ALREADY�ALLOCATED,'�ALTTRK‰DC.B�'�ENTRY�NOT�ALLOWED.'DUPLOCKE EQU *-1‰DS.W�0¬<>‰DS.W�08DIAGM„DC.B�'DO�YOU�WANT�A�DIAGNOSTIC�TEST�AREA�(Y/N)�?�'DIAGMEƒEQU�*-1‰DS.W�0>‰DS.W�0LNOALTSƒDC.B�'ALL�ALTERNATE�TRACKS�HAVE�BEEN�USED,�VALIDATION�BEGINS�'�022585NOALTSE‚EQU�*-1ƒ022585‰DS.W�0ééééé- é*LDMSG„DC.B„'THE�CURRENT�LOAD�ADDRESS�IS‚$'LDMSG1ƒDC.B„'00000000'LDMSGEƒEQU…*-1‰DC.W„0&NEWADRƒDC.B„'ENTER�NEW�LOAD�ADDRESS�$'NEWADRE‚EQU…*-1‰DC.W„0*DIRMSGƒEQU�*ŒSTART�OF�DIR�MSG%VOLPRTƒDC.L�'„'…VOLUME�NAME�GOES�HERE ‰DC.W�':�'L1USN„DC.L�0ŠUSER�NUM ‰DC.W�'.�'L1CAT„DC.L�'„'…CATALOGUE ‰DC.L�'„' ‰DC.W�'.�'L1FIL„DC.L�'„'…FILE�NAME ‰DC.L�'„' ‰DC.W�'.�'L1EXT„DC.W�'‚'‡EXTENSION!DIRMSGEƒEQU�*-1‰END�OF�MSG�LINE�1‰DS.W�0"BADSECƒDC.B�'READ�ERROR�SECTOR�#�'BADSECN‚DC.B�'ˆ'BADSECE‚EQU�*-1‰DS.W‚0%CNFERRƒDC.B‚'CONFIGURATION�ERROR�--�'CNFERRN‚DC.B‚'ˆ'CNFERRE‚EQUƒ*-1‰DS.W�07BADDUPƒDC.B�'WARNING--BAD�SECTOR�IN�USER�LOCK-OUT�AREA'BADDUPE‚EQU�*-1‰DS.W�0,TRKMSGƒDC.B�'TRACK�BY�TRACK�FORMAT‚(Y/N)�?�'TRKMSGE‚EQU‚*-1‰DS.W�0ENOFLOPƒDC.B�'MEDIA�NOT�DEFINED--BAD�TOTAL�NUMBER�OF�SECTORS�RETURNED'‰DC.B�'�FROM�THE�IPC'NOFLOPE‚EQU‚*-1‰DS.W�0VOLMMTD‚DC.B�'VOLUME�' ‰DC.B�''''$VOLMM„DC.L�'„'„VOLUME�NAME�GOES�HERE ‰DC.B�''''8‰DC.B�'�ALREADY�ON�THIS�SYSTEM,�USE�ANOTHER�VOLUME�NAME' ‰DC.B�CR,LFVOLMMTDE�EQU‚*-1‰DS.W�0,********************************************!*ˆBUFFER�TO�RECEIVE�Y/N�RESPONSES,********************************************‰DS�0ANSWERƒDC.B�'„'ANSWERE‚EQU�*-1‰DC.B�'�'ŒDEAD�BYTE�FOR�SBARG*3**************************************************** *ˆBUFFER�AREA�FOR�I/O�OPERATIONS*ˆBUFFER�SIZE�IS�1�SECTORS*ˆUSED�TO�BUILD�INITIAL�SAT3****************************************************‰DS�0 BUFFIO‚EQU�* ‰DS.B�SECLENBUFFIOE‚EQU�*-1*‰DS.W�0* ENDDATA EQU * ‰OFFSET�00*************************************************†BUFFER�AREA�FOR�LOCK�TABLE *ˆALSO�USED�FOR�DIAGNOSTIC�TABLE0************************************************éLOCKIO�DS.B�SECLEN‹BUFFERLOCKIOE‚EQU�*-10**************************************************ˆCONFIGURATION�SECTOR0************************************************CONFSEC‚DS.B†SECLENCONFSECE�EQU‡*-1*(*****************************************ŠBUFFER�FOR�VID�SECTOR&*‹VOL�IDENT�REMAINS�THROUGHOUT�PROGRAM(****************************************VIDIO„DS.B�SECLENVIDIOEƒEQU�*-1*5*ˆSECTION�USED�FOR�DISK�VALIDATION�AND�SAT�GENERATION*VALBUFƒDS.B�SECLENVALBUFE‚EQU�*-1HARDBUF‚DS.L�SECLEN ‰DS.L�SECLEN ‰DS.L�SECLENVALENDƒEQU�*-1*)*ˆREST�OF�BUFFER�USED�FOR�TRACK�READ�ONLY*‰PAGE ‰SECTIONƒ0*<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<**************************************************************2*ˆ***‚PROCEDURE�SECTION�FOR�INIT�DISK�COMMAND‚******<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;*************************************************************STARPROG EQU *‰LEA�PBA(PC),A7ŠPRG�BASE�ADDR*&***************************************.*ˆ**ƒSAVE�DEFAULT�VALUE�PASSED�FROM�SYSTEM�****'****************************************;‰MOVEM.L�D0-D7/A0-A7,STSKNAM-PBA(A7)�SAVE�REGISTER�CONTENTS(‰LEA‡PROGSTK(PC),A7‚SET�UP�STACK�POINTER+*ˆD0�TO�STSKNAM�=�TASK�NAME�THAT�STARTED�ME*ˆD1�TO�SESNUM‚=�SESSION�NUM$*ˆD2�TO�VOLNAM‚=�DEFAULT�VOLUME�NAME*ˆD3�TO�USERNUM�=�USER�NUMBER*ˆD4�TO�CATNAM‚=�CATALOGUE�NAME*ˆD5�TO�CATNAM�+4**ˆD6�=‚LENGTH�OF�COMMAND�LINE)*ˆD7�=�BIT�MASK�OF�LOGICAL�UNITS�ASSIGNED*ˆA0�=�YOUR�TASK�NAME*ˆA1�=�TERMINAL�ID*ˆA2�=�ACTUAL�USER�NUMBER(*ˆA3�=�SYSTEM�VOLUME�DEFAULE(ALL�SPACES)*ˆA4�=�SYSTEM�USER�NUMBER*ˆA5�=�SYSTEM�CATALOGUE*ˆA6�=�SYSTEM�CAT�PART�2***�***„DRIVER‚BLOCK„******#****- ********************************&*‰*****�CALL�COMMAND�PARSE�ROUTINE‚****#**************************************"‰LEA�PBA(PC),A4ŠINIT�PGM�BASE�ADDR *ƒSET�UP�POINTERS�IN�PARM�BLOCKS*‰STORE�BUFFIO(PC),WDSKIOS1‰STORE�BUFFIOE(PC),WDSKIOS2‰STORE�VOLR(PC),INP1IOS+IOSSAD‰STORE�VOLRE(PC),INP1IOS+IOSEAD ‰STORE�ANSWER(PC),INP3IOS+IOSSAD!‰STORE�ANSWERE(PC),INP3IOS+IOSEAD‰STORE�OKANS(PC),INP4IOS+IOSSAD ‰STORE�OKANSE(PC),INP4IOS+IOSEAD!‰STORE�DESCANS(PC),INP5IOS+IOSSAD"‰STORE�DESCANSE(PC),INP5IOS+IOSEAD!‰STORE�FORMANS(PC),INP6IOS+IOSSAD"‰STORE�FORMANSE(PC),INP6IOS+IOSEAD!‰STORE�WORKUSN(PC),INP7IOS+IOSSAD#‰STORE�WORKUSN+4(PC),INP7IOS+IOSEAD‰STORE�BUFFIO(PC),FETDEV+FHSPTRC‰STORE�DCPBLK(PC),CONFIOS+IOSDBPƒPUT�CONFIGURE�BLOCK�ADDRESS�IN�IOS*ªPARAMETER�BLOCK"‰STORE�TOTSLT(PC),WDSKSL1š<>*‰TST.L�REGD6-PBA(A4)…IS�COMMAND�LINE�EMPTY‰BNE.S�LBUFF‡NO#‰BRA�INVALERR„NO�INPUT/OUTPUT�ERROR*/LBUFF„LEA�COMMLIN(PC),A0ƒSAVE�BUFFER�START�ADDR,‰BSR�PARSE‡GO�TO�DISECT�COMMAND�LINE�ROUTINE‰TST.L�D0‡CK�F0R�ANY�ERR0RS‰BMI�INVALERRƒBR�IF�ERR0R*:‰BTST.L�#22,D0‡IF�NULL�INPUT�BIT�IS�SET,�THAT'S�AN�INVALID‰BNE�INVALERRˆENTRY�ERROR. 7‰BTST.L�#14,D0‡IF�NULL�OUTPUT�BIT�IS�NOT�SET,�THAT'S�AN"‰BEQ�INVALERRˆINVALID�ENTRY�ERROR.  ,‰MOVE.L�A1,SAVOUT-PBA(A4)‚SAVE�LOC�OF�OUTPUT** DETECT OPTION SPECIFIED*%‰MOVE.L‚A2,D0ŽADDRESS�OF�OPTION�FIELD!‰BEQ.SƒNOOPTŽBRANCH�IF�NO�OPTIONS ‰BSR…OPTION"‰CMP.Bƒ#$40,D0ŒNO�OPTION�SPECIFIED‰BEQ.SƒNOOPTŽBRANCH�IF�YES(‰TST.BƒD0‘WERE�THERE�OPTION�ERRORS�FOUND"‰BNE…ER_NVO�BRANCH�IF�ERRORS�FOUND)‰CMP.Bƒ#'S',D1ŒUPDATE�SLT�ONLY�?†<>.‰BNE…ER_NVO�BRANCH�IF�'V'�OPTION�NOT�SPECIFIED+‰BCHG„#VOPT,OPTFLG-PBA(A4)ƒMARK�OPTION�FLAG*‰BNE…ER_NVO�BRANCH�IF�V�OPTION�ALREADY�SET 6NOOPT„BSR�INITIN†GO�TO�INPUT�INIT�ROUT�(INIT�&PRT�MSG)**‰BWN‚1/25/84:#*‰Note�on�the�function�of�INITIN�--=*‰INITIN�makes�a�status�call�with�the�CONFIOS�parameter�block?*‰Since�this�is�the�first�call�made�using�this�parameter�block,E*‰and�it�initially�has�a�IOSTAT�($0140)�function�DC'd�in,�this�works.;*‰Upon�return,�the�attributes�mask�for�the�device�is�in�the+*‰DCPBLK‚parameter�block�and�is�used�below.**0‰TST.B…IPCFLAG-PBA(A4)…CHECK�FOR�IPC�TYPE�DRIVER‰BNE.S…NONIPC„NON�IPC—<>*$*ˆMUST�MOUNT�THE�NON-IPC�DRIVER�DISK*2NONIPCƒLEA‡DCPBLK(PC),A1�CONFIGURE�PARAMETER�BLOCK1‰LEA‡CONFIOS(PC),A0ŠCONFIGURE�IOS�PARAMETER�BLOCK#‰MOVE.W„#IOCNFG,IOSFCT(A0)‚FUNCTION/‰AND.L…#MSKDRV,IOSATM(A1)�MASK�DRIVE�ATTRIBUTES** *‰BWN‚1/25/84*‰Note�on�MSKDRV:***‰MSKDRV�upper�word:�$000F�attributes�mask**‰MSKDRV�lower�word:�$03D0�parameters�mask<*‰This�mask�masks�out�all�but�the�media-relevant�bits�in�the*‰attributes�mask.=*‰This�is�a�good�thing‚because�we�do�NOT�want�any�change�made-*‰to�bit�9�of�the�attributes�word�for�a�disk.**‰Why�not,�you�ask?B*‰In�4.3�VERSAdos,�bit�9�being�set�means�we�have�an�8"�disk�drive,4*‰and�being�clear�means�we�have�a�5�1/4"�disk�drive.*>*‰In�4.2�VERSAdos,bit�9�is�always‚clear.�We�need�to�be�careful=*‰not�to�tell�the�SASI�driver�to�read�an�5�1/4"�diskette�when**‰what�we�really�have�is�an�8"�diskette!!!*;*‰So,�to�avoid�incompatibility,�don't�mess�with�bit�9�here.*)‰MOVE.B„IOSDTP(A1),D0†FLOPPY�OR�HARD�DISK‰CMP.B…#XDSFDK,D0‰*(‰BEQ.S…MNTDEV�IF�FLOPPY�MOUNT�THE�DEVICE)‰CLR.W…IOSATM(A1)‰CLEAR�FLOPPY�ATTRIBUTESMNTDEV+‰MOVE.W„#IOPMNT,IOSOPT(A0)‚SET�OPTION=MOUNT‰IOSCALLƒCONFIOS(PC)ƒDO�MOUNT%‰BNE�IOERPRT‰BRANCH�IF�ERROR�ON�. MOUNT*1‰TST.B…SLTONLY-PBA(A4)…SLT-ONLY�UPDATE�?ƒ<>***ˆDO�CONFIGURE�CHANGE�REQUEST*CHNGCFIG9‰MOVE.L„IOSATM(A1),D1‡SET�ATTRIBUTES�AND�OPTIONS�FOR�CALL.‰BSR‡MODCNFG�MODIFY�CONFIGURATION�IF�NECESSARY**ˆCONFIGURE�THE�DEVICE*?‰MOVE.W„#IOCNFG,IOSFCT(A0)‚GIVE�CONFIGURE�IOS�BLOCK�IT�FUNCTION;‰MOVE.W„#IOPCONLY,IOSOPT(A0)�SET�CONFIGURE�DISK�ONLY�OPTION*‰IOSCALLƒCONFIOS(PC)ƒTRY�TO�CONFIGURE�DISK ‰BEQ.S…FORMIT+‰MOVEM.LƒA1-A2,-(A7)�SAVE�NEEDED�ADDRESSESS‰MOVE.L„#8,D1…ONE�CHARACTER ‰CLR.L…D0$‰MOVE.B„IOSDST(A1),D0‡GET�ERROR�CODE-‰LEA‡CNFERRN(PC),A0ŠADDRESS�TO�DEPOSIT�STRING$‰BSR‡BINHEXŽCONVERT�THE�ERROR�NUMBER#‰LEA‡CNFERR(PC),A0�SEND�THE�MESSAGE‰LEA‡CNFERRE(PC),A1�* ‰BSR‡SENDMSG+‰MOVEM.Lƒ(A7)+,A1-A2‰RESTORE�USED�REGISTERS‰BRA.S…CHNGCFIG‚TRY�AGAIN*-*********************************************#*ˆCHECK�FOR�FORMAT�MESSAGE�&�ANSWER*FORMIT/‰LEA�DCPBLK(PC),A0‚CURRENT�CONFIGURATION�STATUS)‰BSR‚SETPARMƒSET�UP�PARAMETERS�FOR�FORMAT!‰STORE�FORMSG(PC),OUT6IIOS+IOSSAD"‰STORE�FORMSGE(PC),OUT6IIOS+IOSEAD"‰IOSCALL�OUT6IIOS(PC)‚SEND�MESSAGE‰BNE�IOERPRT…ERROR**ˆRECEIVE�ANSWER‰IOSCALL�INP6IOS(PC)‰BNE�IOERPRT…ERROR&‰BSR�SBARG‡DO�ARG�SUB/FORCE�UPPER�CASE‰BNE�IOERPRT…BRIF�ERROR*.**********************************************&‰CMP.B�#'Y',FORMANS-PBA(A4)‚ANSWER�YES ‰BNE.S�DOINIT+‰MOVE.B�#1,FORMFLAG-PBA(A4)‚SET�FORMAT�FLAG ‰BSR�DOFORM**8**********************************************************“GO�TO�INIT�DISK�ROUTINE*2***************************************************DOINIT*'*ˆCHECK�CONFIGURATION�BEFORE�CONTINUING*0‰LEA�CHCKIOS(PC),A0�POINT�TO�IOS�PARAMETER�BLOCKF‰MOVE.L�CNFBKADR-PBA(A4),A3�CURRENT�CONFIGURATION�PARAMETER�BLOCK�ADDR!‰BSR‚CNFGCHK�GO�CHECK�THE�GUY�OUT$‰BEQ.S�DOINIT1ƒBRANCH�IF�ALL�IS�WELL6‰BSR.L�EMHOUT„CALL�ERROR�MESSAGE�HANDLER‹9/27/83�MLB�*8‰TST.B�IPCFLAG-PBA(A4)ƒDID�ERROR�OCCUR�ON�IPC�TYPE�DRIVE6‰BNE�CHNGCFIGˆOK�TO�CHANGE�CONFIGURATION�IF�NOT�AN�IPC!‰BRA�IOERPRT‰GO�DISPLAY�THE�ERRORDOINIT1%‰BSR�GETMEM†GO�GET�THE�MEMORY�SEGMENT$‰BSR�INITDSK…GO�TO�INITIALIZATION�RT!‰TST.B�FLOPPY-PBA(A4)�FLOPPY�DISK‰BEQ.S�STOPITˆNO*ˆSEND�VALIDATE�MSG!‰STORE�VALMSG(PC),OUT6IIOS+IOSSAD"‰STORE�VALMSGE(PC),OUT6IIOS+IOSEAD‰IOSCALL�OUT6IIOS(PC) ‰BNE�IOERPRT**ˆRECEIVE�ANSWER‰IOSCALL�INP6IOS(PC) ‰BNE�IOERPRT&‰BSR�SBARG‹DO�ARG�SUB/FORCE�UPPER�CASE ‰BNE�IOERPRT‰CMP.B�#'Y',FORMANS-PBA(A4) ‰BNE.S�STOPIT ‰BSR�DSKVAL* *ˆSTOP�THE�PROGRAM�AT�THIS�POINT STOPITƒEQU�*‰BSR.S�CLOOUT‡CLOSE�OUTPUT* ‰BRA�STOPE*$CLOOUTƒMOVE.W�#FHCLOS,OUTFHS-PBA(A4)‰FHSCALL�OUTFHS(PC) ‰BNE�CLOSERR‰RTS‰PAGE/************************************************%*ˆ**‚INITIALIZATION�OF�INPUT�DISK‚***3*ˆ***‚SET�UP�FHS�PARM�BLOCK�BASED�ON�CMD�LINE�INPUT1*ˆTHIS�ROUTINE�WILL�DO�ASSIGN�AND�ATTRIBUTE�CALLS*/************************************************ INITIN EQU *"‰LEA�OUTFHS(PC),A6ƒINIT�PARM�BLOCK-‰LEA�COMMLIN(PC),A0‚INIT�COMMAND�LINE�POINTER*'*****************************************ˆCALL�EDIT�FILE�FOR�INPUT**ˆ**ƒCALL�EDITFILE�ROUTINE�***ˆA0�=�INPUT�COMMAND�START*ˆA6�=�ADDR�OF�PARM�BLOCK*&***************************************!‰BSR�EDITFILE„MAKE�EDIT�FILE�CALL‰BMI�INVALERR‡ERR0R 9‰BTST.L�#22,D0‡IF�A�VOLUME/DEVICE�WAS�NOT�ENTERED,�THAT'S%‰BEQ�INVALER. RˆAN�INVALID�ENTRY�ERROR. ;‰MOVE.L�#$003F0081,D1ŠIF�ANYTHING�PART�OF�A�FILE�DESCRIPTOR2‰AND.L�D0,D1“OTHER�THAN�VOLUME/DEVICE�WAS�ENTERED,1‰BNE�INVALERR’OR�'*'�WAS�USED,�OR�'/'�WAS�USED�TO%*§TERMINATE,�THAT'S�AN�INVALID�ENTRY. ‰BTST�#1,D0„CK�FOR�DEVICE‰BEQ.S�INASGN†NO‰CLR.L�D0ƒSET�DEVICE�FLAG*0INASGNƒMOVE.L�OUTVOL-PBA(A4),D4…SAVE�FOR�COMPARE-‰BSR�CKTAB‡GO�TO�DEV�ROUTINE�GET�NAME�FOR�MSG*(*****************************************ˆASSIGN�INPUT�VOLUME�OR�DEVICE+*******************************************‰FHSCALL�OUTFHS(PC) ‰BNE…IOERPRT *º<> *-**********************************************‰OK�TO�INITIALIZE�MSG�&�ANSWER-**********************************************/INIT…CMP.L�#'„',VOLM1-PBA(A4)‚VOL�IN�MSG‹ALTTRK‰BNE.S�INIT1‚YES1‰STORE�OKMES(PC),OUT6IIOS+IOSEADƒSET�UP�SHORT�END‰BRA.S�INIT2ŠCONTINUE4INIT1„STORE�OKME(PC),OUT6IIOS+IOSEAD„END�OF�LONG�MSG INIT2„EQU�*‰STORE�OKM(PC),OUT6IIOS+IOSSAD *ˆPRINT�MSG‰IOSCALL�OUT6IIOS(PC) ‰BNE�IOERPRT*$‰IOSCALL�INP4IOS(PC)‚CALL�FOR�ANSWER ‰BNE�IOERPRT ‰BSR�SBARG‰BNE�IOERPRT‰BRIF�ERROR$‰CMP.B�#'Y',OKANS-PBA(A4)‚ANSWER�YES‰BNE�STOPIT†ABORT*2*ˆIF�MEDIA�IS�FOREIGN�CONTINUE�THE�INITIALIZATION.4*ˆIF�MEDIA�HAS�A�VOLUME�NAME�THE�VID�MUST�BE�CLEARED*ˆAND�A�DEVICE�ASSIGNMENT�MADE.*-‰TST.B…INFORN-PBA(A4)ƒCHECK�FOR�FOREIGN�MEDIA1‰BNE‡INIT4…BRANCH�IF�MEDIA�DOES�NOT�HAVE�A�VOLUME*>*ˆA�VOLUME�ASSIGNMENT�HAS�BEEN�MADE,‚FORCE�A�DEVICE�ASSIGNMENT*(INITA„STORE�BUFFIO(PC),RDSKVID1™<>'‰BSR‡WVID†WIPE�OUT�THE�VID�ON�THE�MEDIA'‰BSR‡CLOOUT„CLOSE�THE�VOLUME�ASSIGNMENT/‰MOVE.B„#1,INFORN-PBA(A4)‚MARK�MEDIA�AS�FOREIGN*3*ˆPREPARE�FHS�PARAMETER�BLOCK�FOR�DEVICE�ASSIGNMENT*‰MOVE.W„#10,D7„LOOP�CONTROL8‰MOVE.L„D4,OUTVOL-PBA(A4)ƒMOVE�DEVICE�NAME�TO�PARM�BLOCKINIT33‰MOVE.W„#FHASGN,OUTFHS-PBA(A4)ƒCOMMAND�IS�AN�ASSIGN?‰MOVE.W„#FOPEREW,OUTOPTS-PBA(A4)�OPTIONS�-�EXCLUSIVE�READ/WRITE(‰FHSCALLƒOUTFHS(PC)„TRY�TO�ASSIGN�DEVICE"‰BEQ.S…INIT4…BRANCH�IF�SUCCESSFULL3‰CMP.B…#FSTAAP,D0ƒCHECK�FOR�ACCESS�PERMISSION�ERROR#‰BNE‡IOERPRTƒBRANCH�IF�A�REAL�ERROR‰DBRA†D7,INIT3‚TRY�AGAIN8‰BRA‡IOERPRTƒA�REAL�ACCESS�PERMISSION�ERROR�GO�REPORT�ITINIT4:O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*º3/1/84*ˆMOVE.L„WDSKVID1-PBA(A4),-(A7)*ˆMOVE.L„WDSKVID2-PBA(A4),-(A7)*œSAVE�ORIGINAL�VALUES*ˆSTORE…ZEROVID,WDSKVID1*ˆSTORE…ZEROVIDE,WDSKVID2*œPLACE�IN�NEW�VALUES*ˆIOSCALL�WDSKVID*œATTEMPT�TO�WRITE�TO�DISK*ˆMOVE.L„(A7)+,WDSKVID2-PBA(A4)*ˆMOVE.L„(A7)+,WDSKVID1-PBA(A4)*œRESTORE�ORIGINAL�VALUES*ˆCMP.B…#ISTAWP,D0 *ˆBEQ‡IOERPRT*œJMP�IF�WRITE�PROTECTED�MEDIA*º3/1/84O*<<<<<<<<<<<<</ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<=‰BRA‡GETCONFƒGO�GET�CONFIGURATION�STATUS�--�USE�THAT�ROUTINES!*žRTS�TO�GET�BACK�TO�MAIN�PROGRAM‰PAGE6*******************************************************&*ˆROUTINE�TO�DO�FETCH�DEVICE�MNEMONICS *ˆAND�GET�VOLUME�NAME�IF�PRESENT7*ˆD4�CONTAINS�THE�DEVICE�BEING�CHECKED�FOR�IN�THE�TABLE*5****************************************************** CKTAB„EQU�*-‰LEA�FETDEV(PC),A0ƒINIT�POINTER�TO�PARM�BLOCK)‰LEA�BUFFIO(PC),A1ƒINIT�POINTER�TO�BUFFER‰MOVE.L�D0,D2„INIT�DEVICE�FLAG*‰FHSCALL�FETDEV(PC)‚GET�TABLE‰BNE�IOERPRT…ERROR'„MOVE.W�FHSLEN(A0),D1‚SAVE�#�OF�ENTRIES* CKTAB2ƒEQU�*‰TST.L�D2ˆIS�THIS�A�DEVICE‰BEQ.S�CKTAB3„YES*ˆPROCESS�VOLUME$‰CMP.L�FDVVOL(A1),D4‚CK�FOR�VOL�NAME‰BEQ.S�CKTABV†YES ‰BRA.S�CKTAB4 CKTAB3ƒEQU�*"‰CMP.L�FDVDEV(A1),D4‚CK�FOR�DEVICE‰BEQ.S�CKTABF†FOUND CKTAB4ƒEQU�*‰SUB.W�#1,D1…REDUCE�COUNT9‰BLE.S�CKTABNFƒIF�AT�END,�THERE�IS�NO�SUCH�DEVICE/VOLUME.‰ADD.L�#FDVLEN,A1‚ADD�SIZE ‰BRA�CKTAB2* CKTABFƒEQU�*+‰MOVE.L�D4,DEVM1-PBA(A4)‚MOVE�DEVICE�TO�MSG%‰TST.L„FDVVOL(A1)‚CK�FOR�FOREIGN�DISK‰BEQ.S�CKTABN†YES0‰MOVE.L�FDVVOL(A1),VOLM1-PBA(A4)‚MOVE�VOL�TO�MSG;‰MOVE.L�VOLM1-PBA(A4),OUTVOL-PBA(A4)‚MOVE�VOL�TO�PARM�TABLE‰BRA.S�CKTABEXƒEXIT CKTABNƒEQU�*,‰MOVE.B�#1,INFORN-PBA(A4)‚INPUT�FOREIGN�DISK‰BRA.S�CKTABEX*3CKTABVƒMOVE.L�D4,VOLM1-PBA(A4)‚MOVE�VOL�NAME�TO�MSG3‰MOVE.L�FDVDEV(A1),DEVM1-PBA(A4)‚MOVE�DEVICE�TO�MSG2‰MOVE.L�FDVDEV(A1),D4ŠSAVE�DEVICE�NUMBER�FOR�LATER*CKTABEX‚RTS�.�RETURN  )*’***�DEVICE/VOLUME�NAME�NOT�IN�TABLE�***?CKTABNF‚TST.L�D2ŒIF�IT�WAS�A�DEVICE,�PRINT�'INVALID�DEVICE'�AND;‰BEQƒER_NVDEV†TERMINATE.‚OTHERWISE,�JUST�RETURN�AND�LET�THE*‰RTS‘ASSIGN�FAIL�AND�PRINT�'VOLUME�ERROR'.‰PAGE2****************************************************ˆROUTINE�TO�INITIALIZE�DISK*2*************************************************** INITDSKƒEQU�**8‰MOVE.L�BUFADR-PBA(A4),A3‚RESTORE�MEMORY�SEGMENT�ADDRESS‰BSR�BUFFCLR…GO�CLEAR�SECTOR‰BSR�VIDCLR†CLEAR�VID�AREA;‰BSR�CFIGCLR…CLEAR�CONFIGURE�SECTOR�BUFFER�AND�MOVE�CURRENT*œCONFIGURATION�INTO�IT‰BSR�GETVOLN…GET�VOLUME�NAME‰LEA�VIDIO(A3),A5�RESET3‰MOVE.W�ADDREG2-PBA(A4),VIDUSN(A5)‚MOVE�USER�NUMBER ‰TST.W�ADDREG2-PBA(A4)ƒUSER�ZERO‰BNE.S�INITBLD…NO GETUSNƒEQU�*$‰LEA�VIDIO(A3),A5…USER�#�REQUEST�MSG‰LEA�USNM(PC),A0‰LEA�USNME(PC),A1 ‰BSR�SENDMSGI‰IOSCALL�INP7IOS(PC) ‰BSR�SBARG ‰BNE�IOERPRT!‰MOVE.L�INP7IOS+IOSSAD-PBA(A4),A0 ‰ADD.L‚INP7IOS+IOSLEN-PBA(A4),A0‰MOVE.B�#CR,(A0)�MOVE�CR�TO�END‰CMP.B�#$0D,WORKUSN-PBA(A4)‰BEQ.S�INITBLD‰LEA�WORKUSN(PC),A0†FROM�LOC‰LEA�VIDUSN(A5),A6ƒREC�LOC‰SUB.L�#10,A6„RESET�FOR�OFFSETG***********************************************************************;*‹THE�EDITFILE�ROUTINE�IS�BEING�USED�TO�VALIDATE�THE�USER�#G***********************************************************************‰BSR�EDITFILE„VALIDATE�USER�NUM ‰BMI�GETUSN‰BTST�#21,D0…ERROR ‰BEQ�GETUSN*.***********************************************ˆBUILD�SECTOR�ZERO.*********************************************** INITBLD‚EQU�*/‰LEA�VIDIO(A3),A5ƒINIT�BECAUSE�OF�EDITFILE�CALL‰TST.W�VIDUSN(A5)�USER�0‰BNE.S�INITB1…NO3‰MOVE.B�#1,ZEROFLAG-PBA(A4)ƒSET�USER�ZERO�DISK�FLAGINITB1D‰MOVE.L�#CFIGSEC,VIDCAS(A5)ƒSET�CONFIGURATION�SECTOR,�SECTOR�ADDRESSA‰MOVE.B�#CFIGLEN,VIDCAL(A5)‚CONFIGURATION�BLOCK�LENGTH�IN�SECTORS=‰MOVE.L�CNFBKADR-PBA(A4),A0�CONFIGURE�PARAMETER�BLOCK�ADDRESS,‰MOVE.L�#SATSTRT,VIDSAT(A5)‚SAT�START�SECTOR1‰MOVE.L�#SATSTRT,SATADDR-PBA(A4)‚INIT�SAT�ADDRESS4‰MOVE.L�IOSRSZ(A0),D0ŠGET�NUMBER�OF�VERSADOS�SECTORS+‰DIVU�#2048,D0ƒDIV�BY�#�OF�BITS�IN�A�SECTOR‰CLR.L�D1ˆINIT‰MOVE.W�D0,D1„SAVE�QUOTIENT$‰SWAP�D0‰GET�REMAINDER�IN�LOWER�HALF;‰MOVE.W�D0,SAVEREM-PBA(A4)‚CNT�OF�SECTOR�BITS�IN�LAST�BLOCK‰MOVE.B�IOSDTP(A0),D2"‰CMP.B‚#XDSFDK,D2�CHECK�FOR�FLOPPY‰BNE.S�INITB2�NO)‰MOVE.B�#1,FLOPPY-PBA(A4)ƒSET�FLOPPY�FLAG%INITB2ƒTST.W�D0ˆANYTHING�IN�REMAINDER‰BEQ.S�IMOV†NO#‰ADD.W�#1,D1…ADD�FOR�PART�OF/ �SECTOR IMOV…EQU�*9‰MOVE.W�D1,SAVESATL-PBA(A4)‚SAVE�LENGTH�OF�SAT�IN�SECTORS0‰MOVE.W�D1,VIDSAL(A5)‚LENGTH�OF�SECT�ALLOC�TABLE‰LEA�VIDVNO(A5),A0„INIT%‰MOVE.W�EVIDVNO-PBA(A4),(A0)+ƒVERSION'‰MOVE.W�EVIDVNO+2-PBA(A4),(A0)ƒREVISION*.*ˆIF�INITTING�A�HARD�DISK�WHOSE�CONTROLLER�HAS0*ˆALTERNATE�SECTOR�CAPABILITY�AND�THE�USER�WANTS(*ˆTO�USE�THAT�CAPABILITY,�SET�BIT�IN�VID*'‰TST.B�FLOPPY-PBA(A4)�FLOPPY�?•<INITB3ƒMOVE.L�#'EXOR',VIDMAC(A5)‚MACSS�DISC�INDICATORƒALTTRK>>‰MOVE.L�#'MACS',VIDMAC+4(A5)*/***********************************************!*ˆGET�GENERATION�DATE�FROM�SYSTEM/************************************************6‰ERQ.GTDTIM�TABDATE(PC)‚GET�DATE�(DATE�&�TIME)�8�BYTES3‰MOVE.L�TABDATE-PBA(A4),VIDDTE(A5)‚MOVE�DATE�TO�VID'‰BSR�GETDESC…ROUTINE�TO�GET�DESCRIPTION*‰BSR.S�WVID�WRITE�PARTIAL�VID'‰BSR.S�WCFIG�WRITE�CONFIGURATION�SECTOR*/***********************************************+*‰CALL�ROUTINE�TO�SET�UP�SECTOR�ALLOC�TABLE/************************************************ ‰BSR�DOSAT*+‰TST.B�FLOPPY-PBA(A4)�IS�THIS�A�FLOPPY�DISK‰BNE.S�INITC1ˆYES**‰LEA�VIDIO(A3),A5ˆINIT‰MOVE.L�#SATSTRT,D7ˆINIT:‰ADD.W�SAVESATL-PBA(A4),D7�POSITION�AT�LOCKOUT�TABLE�STARTB‰MOVE.L�D7,LOCKIOS+IOSRRN-PBA(A4)�INIT�START�IN�LOCKOUT�PARM�TABLE;‰MOVE.L�D7,WDSKSLT+IOSRRN-PBA(A4)�INIT�START�IN�WSLT‚ALTTRK+‰MOVE.L�D7,VIDSLT(A5)‚MOVE�START�PSN�TO�VID-‰MOVE.W�#LOCKSN,VIDSLL(A5)�MOVE�LENGTH�TO�VID*#‰BSR�LOCKOUT‰GO�BUILD�LOCKOUT�TABLE*$‰BSR�DSKVALŠVALIDATE�SECTORS�ROUTINE*;‰BSR.S�WCFIG‰WRITE�CONF�SEC�IN�CASE�TRK�0�WAS�LOCKED�ALTTRK* ‰BSR�DIAGAREA*** INITC1ƒEQU�**9*’CHANG�ACCESS�PERMISSION�ON�OUTPUT�TO�PUB�READ�EXC�WRITE*)‰BSR.S�TESTPAT‰SET�UP�TEST�PATTERN�IN�VID**%‰BSR�VERSAREAˆGO�ADD�VERSADOS�TO�DISK*‰BSR�DUMPAREAˆSET�UP�DUMP�AREA*‰BSR�CHECKSUMˆGO�CALC�CHECKSUM* *‚DO�UPDATE�OF�VID�FOR�LAST�TIME*.‰BSR.S�WVID„*****ƒWRITE�OUT�VOL�ID�BLOCK‚******‰RTS�.�RETURN�FROM�INITDSK*****7********************************************************+*ˆWRITE�OUT‚VID�TO�GET�VOL�NAME�INTO�SYSTEM*7******************************************************* WVID…EQU�*‰IOSCALL�WDSKVID(PC) ‰BNE�IOERPRT‰RTS*,*********************************************ˆREAD�VID�INTO�BUFFER,******************************************** RVID…EQU�*‰IOSCALL�RDSKVID(PC) ‰BNE‚IOERPRT‰RTS,********************************************$*ˆWRITE�CONFIGURATION�BLOCK�TO�MEDIA,********************************************WCFIG‰IOSCALL�WDSKCFIG(PC) ‰BNE�IOERPRT‰RTS5********************************************�<>,*********************************************BUILD TEST PATTER IN VID,********************************************* TESTPAT‚EQU�*$‰LEA�DIAGPAT1(PC),A0…START�OF�PATTER#‰LEA�VIDIO+VIDDTP(A3),A1‚LOC�IN�VID‰MOVE.B�#16,D0‡WORDS�IN�PATTERTESTPATL MOVE.L (A0)+,(A1)+ ‰SUB.B�#1,D0 ‰BNEƒTESTPATL‰RTS‡RETURN�FROM�TESTPAT7**********************************************ƒ<<010485 *ˆINSERT�THE�VOLUME�INTO�THE�VID*ŠA3�POINTS�TO�VID�BUFFER.********************************************** UPDVOLƒEQU�* ‰BSR.S�RVID4‰MOVE.L�VOLNAM-PBA(A4),VIDIO(A3)�RESTORE�VOLUME�NAME ‰BSR.S�WVID‰RTS‚RETURN�010485>>‰PAGE.************************************************ˆDO�WRI0 TE�TO�OUTPUT�VOLUME*.***********************************************9IOSWRITE�IOSCALL�WDSKIOS(PC)‹WRITE�A�SECTOR�AND�INCREMENT%‰BNEƒIOERPRT‘SECTOR�#�IN�PARAM�BLOCK.‰ADD.L�#1,IOSRRN(A0)‹* ‰RTS***ˆROUTINE�TO�ZERO�OUT�BUFFERêñVúSB INS"<*52;:CB J#R;ZFb(jrMzM‚=Š,’ š/¢FªQ²:º@ÂIÊCÒDÚO BUFFCLR‚EQU�*‰LEA�BUFFIO(PC),A5ƒINIT�START‰LEA�BUFFIOE(PC),A6‚INIT�ENDCLOP…CLR.L�(A5)+‰CMP.L�A6,A5‚AT�END ‰BCS�CLOPˆNO ‰RTS�RETURN *º<>* *‹ROUTINE�TO�ZERO�OUT�VID�BUFFER VIDCLRƒEQU�*‰LEA�VIDIO(A3),A5ƒINIT�START‰LEA�VIDIOE(A3),A6‚INIT�ENDVLOP…CLR.L�(A5)+‰CMP.L�A6,A5‚AT�END ‰BCS�VLOPˆNO ‰RTS�RETURN*ˆROUTINE�TO�ZERO�OUT�BUFFER LOCKCLR‚EQU�*‰LEA�LOCKIO(A3),A5ƒINIT�START‰LEA�LOCKIOE(A3),A6‚INIT�ENDLLOP…CLR.L�(A5)+‰CMP.L�A6,A5‚AT�END ‰BCS�LLOPˆNO ‰RTS�RETURN***’ROUTINE�TO�ZERO�OUT�100�CHAR�OF�VAL�BUFFVALCLRƒLEA�VALBUF(A3),A5‰LEA�VALBUFE(A3),A6VALOP„CLR.L�(A5)+‰CMP.L�A6,A5‚AT�END ‰BCS�VALOP‡NO ‰RTS�RETURN*;*ˆCLEAR�CONFIGURATION�BUFFER�AND�COPY�CURRENT�CONFIGURATION *ˆINTO�BUFFER*CFIGCLR0‰LEA‡CONFSEC(A3),A5†GET�MEMORY�ADDRESS�OF�BUFFER$‰LEA‡CONFSECE(A3),A6…SET�END�ADDRESSCFIGCLR1‰CLR.L…(A5)+…CLEAR�MEMORY‰CMP.L…A6,A5…END�OF�BUFFER-‰BCS.S…CFIGCLR1‚BRANCH�IF�STILL�IN�THE�BUFFER*!*ˆMOVE�CURRENT�CONFIGURATION�INFO*(‰LEA‡CONFSEC(A3),A5†RESET�MEMORY�ADDRESSA‰MOVE.L„CNFBKADR-PBA(A4),A6�CURRENT�CONFIGURATION�PARAMETER�BLOCK8‰MOVE.L„#IOSDLN,D7ŠLENGTH�OF�CONFIGURATION�PARAMETER�BLK‰BRA.S…CFIGMOV1CFIGMOV$‰MOVE.B„(A6)+,(A5)+‰MOVE�INTO�MEMORYCFIGMOV1‰DBRA†D7,CFIGMOV ‰RTS›RETURN‰PAGE;************************************************************1*ƒROUTINE�TO�REQUEST�VOLUME�NAME�&�MOVE�TO�BUFFER*;*********************************************************** GETVOLNƒEQU�*?ŠCLR.B‚VLTBFLAG-PBA(A4)ƒInitialize�"VOLUME�NAME�IN�TABLE"�flag.#ŠLEA„VIDIO(A3),A5‡POINTER�TO�BUFFER'ŠSTORE‚VOLMSG(PC),OUT6IIOS+IOSSAD‚START"ŠSTORE‚VOLMSGE(PC),OUT6IIOS+IOSEAD*ŠIOSCALL�OUT6IIOS(PC)†PRINT�MSG ŠBNE„IOERPRT*#ŠIOSCALL�INP1IOS(PC)‡RECEIVE�VOLUME&ŠBSR„SBARGŽDO�ARG�SUB/FORCE�UPPER�CASEŠBNE„IOERPRTŒERROR*,*‰RT�TO�CK�AND�BLANK�CARRAGE�RET�IN�VOL�NAME!ŠMOVE.B�#1,D0�SET�1ST�TIME�SWITCHŠLEA„VOLR(PC),A1ŠLEA„VOLR+4(PC),A2$ŠLEA„VIDVOL(A5),A3…START�OF�REC�AREA ŠMOVE.L�#'„',(A3)†BLANK�REC�AREAFIR1†CMP.B‚#$0D,(A1)ŠBEQ.S‚FIRSTEXŒYESŠCMP.B‚#$3A,(A1)ŠCK�FOR�:ŠBEQ.S‚FIRSTEXŒYESŠCMP.B‚#'#',(A1)ŠBEQ.S‚FIRERP�ERRORŠCMP.B‚#'Z',(A1) ŠBHI.S‚FIRERP&ŠCMP.B‚#'A',(A1)ŠCK�OUT�OF�ALPHA�RANGEŠBCC.S‚FIRMOV�GOODŠTST.B‚D0‘1ST�TIMEŠBNE.S‚FIRERP�NOŠCMP.B‚#'*',(A1) ŠBEQ.S‚FIRMOVŠCMP.B‚#'&',(A1) ŠBEQ.S‚FIRMOVŠCMP.B‚#'@',(A1) ŠBEQ.S‚FIRMOV,ŠCMP.B‚#'�',(A1)ŠTREAT�BLANK�LIKE�TERMINATORŠ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‘TURN�OFF�SWITCHŠCMP.L‚A2,A1ŽAT�END ŠBCS„FIR1�N0FIRSTEXƒTST.B‚D0‘SWITCH�OFFŠBNE.S‚FIRERP�NO;ŠLEA„VIDVOL(A5),A3†Save�the�Volume�name�for�use�by�VLTAB.../ŠMOVE.L�(A3),D4Œsubroutine�in�table�comparison.2ŠBSR.S‚VLTABŽGo�check�if�OK�to�use�this�VOL.�name.9ŠTST.B‚VLTBFLAG-PBA(A4)ƒIs�Volume�Name�already�in�table�?ŠBNE.S‚FIRERPSŒYes.2ŠMOVE.L�BUFADR-PBA(A4),A3‚RESTORE�SEGMENT�BASE�ADR ŠRTS—.�RETURN*FIRERP„BSR„INVALE9FIRERPSƒMOVE.L�BUFADR-PBA(A4),A3‚RESTORE�SEGMENT�BASE�ADRŠBRA„GETVOLNŒTRY�AGAINL**************************************************************************** *‰10/10/83‚RJ>*‰Routine�to�do�'FETCH�DEVICE�MNEMONICS'�and�check�volume�name=*‰provided�against�the�device�table.�If�the�volume�name�given@*‰compares�with�any�on�the�table,�a�message�indicating�t0 hat�thisD*‰volume�name�should�not�be�used�and�a�new�volume�name�is�requested.C*‰This�is�done�continuously�until�a�volume�name�that�is�not�already*‰in�the�table�is�entered.8*‰D4�contains�the�volume�bieng�checked�for�in�the�table.*L***************************************************************************** VLTAB…EQU�*3ŠLEA„FETDEV(PC),A0ŠInit�pointer�to�Paramater�Block.*ŠLEA„BUFFIO(PC),A1ŠInit�pointer�to�buffer.*ŠFHSCALL�FETDEV(PC)ˆGet�table.ŠBNE�IOERPRT�Error.(ŠMOVE.W�FHSLEN(A0),D1†Save�#�of�entries.******…PROCESS�VOLUME�NAME‡*** VLTAB2„EQU„*(ŠCMP.L‚FDVVOL(A1),D4†Ck�for�volume�name.ŠBEQ.S‚VLTABV�Yes.ŠSUB.W‚#1,D1ŽReduce�count.5ŠBLE.S‚VLTABNFŒIf�at�end,�ok�to�use�this�volume�name.ŠADD.L‚#FDVLEN,A1‰Add�size. ŠBRA„VLTAB2*#*********�VOLUME�NAME�IN�TABLE.…***;VLTABV„MOVE.L�D4,VOLMM-PBA(A4)ƒMove�volume�name�to�message."ŠSTORE‚VOLMMTD(PC),OUT6IIOS+IOSSAD#ŠSTORE‚VOLMMTDE(PC),OUT6IIOS+IOSEADŠIOSCALL�OUT6IIOS(PC) ŠBNE„IOERPRT<ŠMOVE.B�#1,VLTBFLAG-PBA(A4)‚Set�"Volume�name�in�table"�flag.*&*********�VOLUME�NAME�NOT�IN�TABLE‚*** VLTABNFƒEQU„*ŠRTS‰PAGE;************************************************************3*ˆROUTINE�TO�REQUEST�DESCRIPTION�AND�MOVE�TO�BUFFER*;************************************************************ GETDESC‚EQU�* ‰STORE�DESCM(PC),OUT6IIOS+IOSSAD!‰STORE�DESCME(PC),OUT6IIOS+IOSEAD‰IOSCALL�OUT6IIOS(PC)‰BNE�IOERPRT…ERROR*"‰IOSCALL�INP5IOS(PC)‚REQUEST�INPUT‰BNE�IOERPRT…ERROR&‰BSR�SBARG‡DO�ARG�SUB/FORCE�UPPER�CASE ‰BNE�IOERPRT ‰BSR.S�END5*"‰LEA�DESCANS(PC),A2‚START�OF�INPUT%‰LEA�VIDVD(A5),A3‚LOAD�BUFF�DESC�ADDR‰LEA�19(A3),A4ƒEND�OF�AREA ANSLOPƒEQU�*"‰CMP.B�#$0D,(A2)‚FOUND�CARRAGE�RET‰BEQ.S�ANSBLK†YES‰MOVE.B�(A2)+,(A3)+‚MOVE�DATA‰CMP.L�A4,A3…AT�END ‰BLE�ANSLOP‰BRA.S�ANSEX…EXIT*!ANSBLKƒMOVE.B�#'�',(A3)+‚BLANK�IT‰CMP.L�A4,A3…AT�END‰BLE�ANSBLK†CONT�BLANK)ANSEX„LEA�PBA(PC),A4‚RESTORE�PGM�BASE�ADR2‰MOVE.L�BUFADR-PBA(A4),A3�RESTORE�SEGMENT�BASE�ADR ‰RTS�.�RETURN*3END5…MOVE.L�INP5IOS+IOSSAD-PBA(A4),A0†START�OF�BUFF'‰ADD.L�INP5IOS+IOSLEN-PBA(A4),A0‡LENGTH‰MOVE.B�#CR,(A0)�MOVE�CR‰RTS‰PAGE6*******************************************************1*ˆROUTINE�TO�SET�UP�SECTOR�ALLOCATION�TABLE�WHICH/*ˆRESIDES�ON�PHYSICAL�SECTOR�2�OF�DISK�(ADDR�1)*7*ˆTHE�CORRECT�BITS�MUST�BE�TURNED�ON�OR�OFF�TO�INDICATE*ˆWHICH�SECTORS�ARE�AVAILABLE5*ˆTHIS�ROUTINE�IS�FOR�SINGLE�&�DOUBLE�SIDED�DISKETTES/*ˆLOCKOUT�TABLE�BITS�ARE�SET�ON�IN�THIS�ROUTINE*6******************************************************* DOSAT„EQU�**‰BSR�BUFFCLR…CLEAR�SECTOR**0************************************************!*ˆSET�UP�SIDE�ONE�OF�THE�DISKETTE,**********************************************‰MOVE.L�CNFBKADR-PBA(A4),A0(‰MOVE.L�IOSRSZ(A0),D6‚GET�NUM�OF�SECTORS$‰DIVU�#2048,D6ƒ#�POF�BITS�PER�SECTOR‰CLR.L�D7ˆINIT‰MOVE.W�D6,D7ˆSIZE�IN�SECTORS ‰MOVE.L�D7,D2:‰MOVE.L�#SATSTRT,WDSKIOS+IOSRRN-PBA(A4)‚INIT�AT�SAT�SECTOR‰TST.W�D6ˆOVER�2�SIDES‰BNE.S�BIGLOP†YES@‰MOVE.B�#1,ONESECT-PBA(A4)‚SET�FLAG�ONLY�ONE�SECTOR�WILL�BE�USED ‰BRA.S�DOREM**&*ˆROUTINE�FOR�>�THAN�DOUBLE�SIDED�DISK* BIGLOPƒEQU�*‰BSR�IOSWRITE„WRITE�SECTOR$‰SUB.W�#1,D7…AT�END�OF�WHOLE�SECTORS‰BNE�BIGLOP†NO* DOREM„EQU�*‰SWAP�D6‰GET�REMAINDER‰TST.W�D6ˆIS�IT�0‰BEQ.S�DOFIRST…YES*‰CLR.L�D7ˆINIT******************************************* *ˆPROCESS�REMAINDER�OF�LAST�SIDE*******************************************‰MOVE.W�D6,D7‰GET�REMAINDER‰DIVU�#8,D7‹GET�TOTAL�BYTES ‰CLR.L�D6 ‰MOVE.W�D7,D6‰LEA�BUFFIO(PC),A0‰ADD.L�D6,A0…ADD�OFF�SET‰SWAP�D7‰GET�REMAINDER‰MOVE.W�D7,D6‰GET�REMAINDER‰LEA�BITSON(PC),A1ˆINIT�TABLE‰MOVE.B�0(A1,D6),D60‰MOVE.B�D6,(A0)+†SET�BIT�FOR�LAST�BYTE�AVAILABLE‰LEA�BUFFIOE(PC),A2‡INIT�END BITLOOP‚EQU�*‰CMP.L�A0,A2ŠAT�END‰BCS.S�LSTWRTŠYES‰MOVE.B�#$FF,(A0)+„SET�BITS�ON ‰BRA�BITLOOP%LSTWRTƒBSR�IOSWRITE‰WRITE�LAST�SECTOR ‰ADD.W�#1,D2ŠINC�FOR�LAST�SECTOR*-******************************************1 ***&*ˆTURN�ON�BITS�IN�SAT�FOR�SECTORS�USED-********************************************* DOFIRST‚EQU�*)‰TST.B�ONESECT-PBA(A4)ƒONLY�ONE�SECT�USED‰BNE.S�SETRRN„YES‰BSR�BUFFCLR…CLEAR�SECTOR&‰TST.B�FLOPPY-PBA(A4)�IS�THIS�A�FLOPPY‰BNE.S�SETRRNˆYESA‰ADD.W�#LOCKSN,D2‚TOTAL�SECTORS�IN�LOCKOUT�TABLE�(BITS�TURNED�ON)(*’CLEAR�SECTORS�FOR�LOCKOUT�&�DIAG�TABLE‰MOVE.W�#LOCKSN,D7BIGLOOP1 BSR IOSWRITE ‰SUB.W�#1,D7 ‰BNEƒBIGLOOP1 SETRRNƒEQU�*7‰MOVE.L�#SATSTRT,WDSKIOS+IOSRRN-PBA(A4)�SET�UP�SECTOR�#$‰LEA�BUFFIO(PC),A0ƒINIT�BUFF�POINTERD‰ADD.W�#CFIGLEN,D2‚ADJUST�USED�SECTOR�COUNT�TO�REFLECT�CONFIGURE�BLK ‰CMP.W�#7,D2 ‰BCS.S�BITL ‰BHI.S�BITH*ˆEQUAL BITE…EQU�*‰MOVE.B�#$FF,(A0)‰BRA.S�DOSATEX…EXIT *ˆLESS�THEN�7 BITL…EQU�*‰LEA�BIT1(PC),A1…INIT�TABLE BITM…EQU�*‰MOVE.B�0(A1,D2),D2‚GET�BITS‰MOVE.B�D2,(A0)‰BRA.S�DOSATEX/***********************************************&*ˆGREATER�THAN�7�-�1ST�BYTE�PROCESSING.********************************************** BITH…EQU�* ‰SUB.W�#7,D2 BITH1„EQU�*‰MOVE.B�#$FF,(A0)+ BITC…EQU�* ‰CMP.W�#8,D2‰BEQ�BITEˆEQUAL ‰BHI.S�BIT8H******************* *ˆLESS�THEN�8*******************‰LEA�BIT2(PC),A1 ‰BRA�BITM**********************ˆGREATER�THAN�8********************* BIT8H„EQU�* ‰SUB.W�#8,D2 ‰BRA�BITH1** DOSATEX‚EQU�*‰BSR�IOSWRITE„GO�WRITE�SECTOR* ‰RTS�RETURN**‰PAGE7********************************************************0*ˆROUTINE�TO�SET�UP�AND�CALL�DISK�FORMAT�ROUTINE*7******************************************************** DOFORMƒEQU�*‰STORE�FORSMSG(PC),OUT6SAD‰STORE�FORSMSGE(PC),OUT6EAD‰IOSCALL�OUT6IOS(PC)*0‰TST.B…IPCFLAG-PBA(A4)�CHECK�FOR�IPC�TYPE�DRIVER/‰BNE.S…DOFORM1ƒBRANCH�IF�NOT�AN�IPC�TYPE�DRIVERDOFORMA(‰IOSCALL�FORMIOS(PC)‚CALL�TO�FORMAT�DISK‰BEQƒFORMEXIT„GOOD‰BRA�IOERPRT…GO�TO�ERROR�RTDOFORM17‰LEA‡DCPBLK(PC),A1‡ADDRESS�OF�CONFIGURE�PARAMETER�BLOCK5‰CMP.B…#XDSRDK,IOSDTP(A1)‚CHECK�FOR�NON-IPC�HARD�DISK8‰BNE.S…FORMTRKƒBRANCH�IF�FLOPPY�TO�FORMAT�TRACK�BY�TRACK=‰STORE…TRKMSG(PC),OUT6IIOS+IOSSAD†ASK�FOR�FAST�FORMAT�OF�HARD$‰STORE…TRKMSGE(PC),OUT6IIOS+IOSEAD…*‰IOSCALLƒOUT6IIOS(PC) ‰BNE‡IOERPRT‰IOSCALLƒINP6IOS(PC)ƒGET�ANSWER ‰BNE‡IOERPRT‰BSR‡SBARG…FORCE�UPPER�CASE$‰BNE�IOERPRT‰BRANCH�IF�ERROR�OCCURED,‰CMP.B…#'Y',FORMANS-PBA(A4)ŠCHECK�THE�ANSWER-‰BNE.S…DOFORMAƒDO�FORMAT�DISK�IF�ANSWER�IS�NO**ˆDO�FORMAT�TRACK*FORMTRK@‰MOVE.W„#IOPTRK,(FORMIOS+IOSOPT)-PBA(A4)�SET�FORMAT�TRACK�OPTION5‰MOVE.L„#0,(FORMIOS+IOSRRN)-PBA(A4)ƒSTART�AT�SECTOR�0‰CLR.L…D7ˆINIT�REGISTER/‰CMP.B„#XDSFDK,IOSDTP(A1)…WORKING�ON�A�FLOPPY�?%‰BNE.S…FORMTRKAŽBRANCH�IF�A�HARD�DISK5‰BTSTW…#IOADDEN,IOSATW(A1)‚IS�FLOPPY�DOUBLE�DENSITY�?(‰BEQ.S…FORMTRKAŽBRANCH�IF�SINGLE�DENSITY*G*„TRACK�0�IS�SINGLE�DENSITY�128�BYTE�SECTORS�FOR�DOUBLE�SIDED�DISKETTES*#‰IOSCALLƒFORMIOS(PC)‹FORMAT�TRACK�0‰BNE‡IOERPRT�REPORT�ERROR>‰MOVE.L„VDOSSEC-PBA(A4),D0„GET�#�OF�VERSADOS�SECTORS�PER�TRACK‰LSR.W…#1,D0‘DIVIDE�BY�23‰MOVE.L„D0,FORMIOS+IOSRRN-PBA(A4)�BUMP�PAST�TRACK�0FORMTRKA6‰MOVE.L„VDOSSEC-PBA(A4),D7„SET�NUMBER�SECTORS/TRACK�SO*°IT�CAN�BE�ADDED�LATERFORMTRK1%‰IOSCALLƒFORMIOS(PC)ƒFORMAT�THE�TRACK*‰BNE.S…FORMTRK2‚BRANCH�IF�AN�ERROR�OCCURED4‰ADD.L…D7,(FORMIOS+IOSRRN)-PBA(A4)�FORMAT�NEXT�TRACK‰BRA.S…FORMTRK1”*FORMTRK26‰CMP.B…#ISTARR,D0ŠEND�OF�DISK�IS�ONLY�ACCEPTABLE�ERROR&‰BNE‡IOERPRTƒBRANCH�IF�NOT�END�OF�DISKFORMEXIT�RTS�.�RETURN‰PAGE4*****************************************************.*ˆROUTINE�TO�READ�EACH�SECTOR�ON�DISK�AND�MARK2*ˆSECTOR�ALLOCATION�TABLE�BIT�ON�IF�READ�INDICATES*ˆTHAT�THE�SECTOR�IS�BAD*5***************************************************** DSKVALƒEQU�* >‰LEA�VALMSG2(PC),A0†NOTIFY�USER�THAT�WE'RE�VALIDATING�SECTORS.‰LEA�VALMSG2E(PC),A1 ‰BSR�SENDMSG ‰CLR.L�D6;‰CLR.L‚RDSKIOS+IOSRRN-PBA(A4)�MAKE�SURE�WE�START�ON�TRACK�03‰MOVE.L�CNFBKADR-PBA(A4),A0�PARAMETER�BLOCK�ADDRESS-‰CMP.B‚#XDSFDK1 ,IOSDTP(A0)‚WORKING�ON�A�FLOPPY"‰BNE.S‚DSKRD�BRANCH�IF�A�HARD�DISK3‰BTSTW‚#IOADDEN,IOSATW(A0)‚IS�FLOPPY�DOUBLE�DENSITY‰BEQ.S‚DSKRD�BRANCH�IF�NOT*A*‚THIS�IS�A�DOUBLE�DENSITY�FLOPPY--ADJUST�READ�BUFFER�END�ADDRESS *‚FOR�TRACK�0*=‰MOVE.L�RDSKIOS+IOSEAD-PBA(A4),-(A7)‚SAVE�ORIGINAL�BUFFER�END**‚FIND�LENGTH�OF�BUFFER*7‰MOVE.L�RDSKIOS+IOSEAD-PBA(A4),D0‚DIVIDE�BUFFER�IN�HALF"‰SUB.L‚RDSKIOS+IOSSAD-PBA(A4),D0‚*‰LSR.L‚#1,D0–**:*ˆADJUST�END�OF�READ�BUFFER�FOR�FULL�TRACK�READ�OF�TRACK�0*:‰ADD.L‚RDSKIOS+IOSSAD-PBA(A4),D0‚NEW�END�OF�BUFFER�ADDRESS#‰MOVE.L�D0,RDSKIOS+IOSEAD-PBA(A4)‚*!‰IOSCALL�RDSKIOS(PC)‡READ�TRACK�0$‰BEQ.SƒDSKVAL1�BRANCH�IF�ALL�IS�WELL(‰BSR…DSKRDCK�CHECK�FOR�SECTOR�TYPE�ERROR ‰TST.BƒD0†*,‰BNE…PRTIOƒNONRECOVERABLE--PRINT�&�TERMINATE3‰BSR…DSKSAT‚UPDATE�SAT�BECAUSE�OF�SECTOR�TYPE�ERRORDSKVAL10‰MOVE.L‚VDOSSEC-PBA(A4),D0�ADJUST�FOR�NEXT�TRACK>‰LSR.L‚#1,D0ƒDIVIDE�BY�2�BECAUSE�TRACK�ZERO�IS�HALF�AS�LONG�AS *§THE�REST/‰MOVE.L‚D0,RDSKIOS+IOSRRN-PBA(A4)�DO�NEXT�TRACKC‰MOVE.L‚(A7)+,RDSKIOS+IOSEAD-PBA(A4)�RESTORE�ORIGINAL�END�OF�BUFFERDSKRD,‰MOVE.L�VDOSSEC-PBA(A4),D6‚NEXT�TRACK�OFFSETO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84‰MOVE.W„#IOREAD,RDSKIOS-PBA(A4)*¦SET�COMMAND,FUNCTION�FOR�READ+‰OR.W†#IOPECC,RDSKIOS+IOSOPT-PBA(A4)ŠALTTRK!*¦SET�OPTION�TO�NO�RETRIES†ALTTRK'‰MOVE.L„ISSEVALUE-PBA(A4),RDSKS-PBA(A4)*¦SET�START�ADDRESS�FOR�READ)‰MOVE.L„ISSEVALUE-PBA+4(A4),RDSKE-PBA(A4)*¦SET�END�ADDRESSƒFOR�READ *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;‰BSR�DSKALT�CHECK�FIRST�ABOUT�THE�ALTERNATE�TRACKS‚<>+‰IOSCALL�RDSKIOS(PC)�READ�ONE�TRACK�OF�DISK ‰BEQ.S�DSKAD#‰CMP.B�#ISTAEOV,D0‚AT�END�OF�VOLUME ‰BEQ�DSKEXIT=‰CMP.B�#ISTARR,D0ƒILLEGAL�RANDOM�RECORD�INDICATES�END�OF�DISK ‰BEQ�DSKEXIT*8‰TST.B�ALTUSE-PBA(A4)�ARE�WE�USING�ALTERNATES�?„<>DSKRD1/‰BSR�DSKRDCK“CHECK�WHETHER�ERROR�IS�RECOVERABLE,‰TST.B�D0–(BAD�SECTOR).‚IF�IT�ISN'T,�BRANCH. ‰BNEƒPRTIO“*‰BSR.S‚DSKSAT‘UPDATE�THE�SAT1*ˆBRA.S�DSKRD“12/15/83�(BAD�BRANCH�COMMENTED�OUT)‰BRA.S�DSKADA¦<>*,******************************************** *ˆENCOUNTERED�BAD�SECTOR�ON�READ$*ˆTURN�ON�BIT�IN�SAT�CORRESP�TO�ADDR-**********************************2 *********** DSKSATƒEQU�*4‰MOVEM.L�D0-D7/A0-A7,-(A7)�SAVE�ALL�REGISTERS†ALTTRK ‰CLR.L�D4<‰MOVE.L�RDSKIOS+IOSRRN-PBA(A4),D6‚SAVE�BAD�PHYSICAL�SECTOR�# ‰MOVE.L�D6,D0ŠSET�UP�FOR�CONVERT‰MOVE.L�#8,D1Š*‰LEA�BADSECN(PC),A0‰*‰BSR�BINDECFJŠCONVERT�PSN*‰LEA�BADSEC(PC),A0‰SET�UP�FOR�SEND�MESSAGE‰LEA�BADSECE(PC),A1ˆ*‰BSR�SENDMSG‹TELL�THE�USER ‰MOVE.L�D6,D5‰MOVE.L�#1,D1Š#�OF�BAD�SECTORS*‰DIVU�#2048,D5ƒGET�SAT�SECTOR�#‰MOVE.W�D5,D4„GET�PRIMEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84,*ˆADD.W‡#1,D4‡POS�OF�OFFSET�OF�SAT�FROM�BASE1‰ADD.W‡#SATSTRT,D4�POS�OF�OFFSET�OF�SAT�FROM�BASE *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<#‰CMP.L�SAVESATL-PBA(A4),D4‚ERROR�CK‰BLS.S�DSKSATX ‰BSR�DSKERR ‰BRA�STOPE&DSKSATX‚MOVE.W�#IOREAD,WDSKIOS-PBA(A4)!‰MOVE.L�D4,WDSKIOS+IOSRRN-PBA(A4)*‰IOSCALL�WDSKIOS(PC)‚READ�SAT�TABLE�SECTOR ‰BNEƒSATERR*DSKSATOK EQU *#‰SWAP�D5‰GET�REMAINDER�IN�LOW�WORDS ‰MOVE.W�D5,D4‰AND.L�#31,D4„SAVE�LOW�31 ‰SUB.W�#31,D4‰NEG.L�D4ˆPOS�FROM�RIGHT�(31-0) ‰CLR.L�D2‰MOVE.W�D5,D2„GET�REMAINDER‰LSR.W�#5,D2…DIV�BY�32‰LSL.W�#2,D2…WORD�POS�IN�SECTOR‰LEA�BUFFIO(PC),A0ƒINIT�START ‰MOVE.L�0(A0,D2),D3‚EXTRACT�WORD‰BSET.L�D4,D3„TURN�ON�BIT(‰BEQ.S�DSKSATGD‚BRIF�BIT�NOT�ALREADY�SET%‰LEA�BADDUP(PC),A0ƒSET�UP�FOR�DUP�MSG‰LEA�BADDUPE(PC),A1‚*‰BSR�SENDMSG…DISPLAY�MSG1‰ADD.L�#1,RDSKIOS+IOSRRN-PBA(A4)�BUMP�PAST�SECTOR‰BRA.S�DSKSATQT¤ALTTRKDSKSATGD%‰MOVE.L�D3,0(A0,D2)‚MOVE�BACK�TO�BUFF‰MOVE.W�#IOWRIT,WDSKIOS-PBA(A4)‰IOSCALL�WDSKIOS(PC) ‰BNEƒSATERR*&‰BSR�LOCKT‡ADD�SECTOR�TO�LOCKOUT�TABLE1‰ADD.L‚#1,RDSKIOS+IOSRRN-PBA(A4)�BUMP�PAST�SECTOR;DSKSATQT�MOVEM.L�(A7)+,D0-D7/A0-A7�RESTORE�REGISTERS‡ALTTRK‰RTS�GO�READ�NEXT�GROUP* DSKEXIT‚EQU�*%‰TST.B�FLOPPY-PBA(A4)‚FLOPPY�?”ALTTRK"‰BNE.S�DSKEXX‚YES,�EXIT�NOW—ALTTRK2‰TST.B�LOCKWRT-PBA(A4)‚ANYTHING�TO�WRT�IN�LOCK�TAB‰BEQ.S�DSKEX‰NO‰BSR�WRTSLT¨ALTTRKDSKEX„BSR�PRTSECT…PRINT�TOTAL$‰BSR�PRTSLTƒPRINT�SLT�ENTRIES”ALTTRK,DSKEXXƒRTS‡RETURN�FROM�DISK�VALIDATE�ROUTINE*5*****************************************************,*ˆCK�FOR�D2�D3�E3�E5�EC�ED�&�EF�ERRORS�IN�D0(*ˆTHESE�ERRORS�CONTAIN�SECTOR�#�I�IOSRRN*ˆFOR�OTHERS�PRINT�MSG5****************************************************** DSKRDCK‚EQU�*‰CMP.B�#$D2,D0‰BCS.S�DSKRDEX…PRT�ERR�MSG1‰BEQ.S�DSKRDS†PROC�BFLAG�SAT�TABLE�FOR�BAD�SECTOR‰CMP.B�#$D3,D0 ‰BEQ.S�DSKRDS‰CMP.B�#$E3,D0‰BCS.S�DSKRDEX ‰BEQ.S�DSKRDS‰CMP.B�#$E5,D0‰BCS.S�DSKRDEX ‰BEQ.S�DSKRDS‰CMP.B�#$EC,D0‰BCS.S�DSKRDEX ‰BEQ.S�DSKRDS‰CMP.B�#$ED,D0 ‰BEQ.S�DSKRDS‰CMP.B�#$EF,D0‰BNE.S�DSKRDEXDSKRDSƒCLR.B�D0 DSKRDEX‚RTS@*******************************************************„<DSKALTA‚MOVE.L�RDSKIOS+IOSRRN-PBA(A4),D0„SAVE�TRACK�NO.�031285!‰MOVE.L�D0,ALTSAVE-PBA(A4)…031285‰IOSCALL�RDSKIOS(PC)éé2 éé‰BEQ.S�DSKALTB�GOOD�READ"‰CMP.B�#ISTAEOV,D0�END�OF�VOLUME�?‰BEQ.S�DSKALTD�YES8‰CMP.B�#ISTARR,D0�ILLEGAL�RANDOM�RECORD�MEANS�WE'RE�DONE‰BEQ.S�DSKALTD�YES)‰CMP.B�#ISTADME,D0�ALREADY�AN�ALTERNATE�?‰BEQ.S�DSKALTB�YES,�ADD�TO�LIST$‰BSR�DSKRDCK�NO,�CHECK�ON�ERROR�TYPE‰TST.B�D0�IS�IT�RECOVERABLE�? ‰BNE�PRTIO�NO2‰BSR�DSKSAT�YES,�BUT�MAKE�IT�UNAVAILABLE�TO�SYSTEM‰BRA.S�DSKALTC;DSKALTB‚MOVE.L�RDSKIOS+IOSRRN-PBA(A4),(A1)+�ADD�TRK�TO�LIST:DSKALTC‚MOVE.L�ALTSAVE-PBA(A4),D0‚RESTORE�TRACK�NO.‚031285(‰MOVE.L�D0,RDSKIOS+IOSRRN-PBA(A4)‚0312853‰ADD.L�D6,RDSKIOS+IOSRRN-PBA(A4)�BUMP�TO�NEXT�TRACK ‰BRA�DSKALTA*=DSKALTD‚MOVE.B�ALTHDS-PBA(A4),D0�NOW�BACK�OFF�NUMBER�OF�HEADS7DSKALTE‚CLR.L�-(A1)�LAST�CYLINDER�SAVED�FOR�DIAGNOSTICS ‰SUB.B�#1,D0‰BNE�DSKALTE�NOT�DONE/‰BSR�BTTLOCK�SET�SAT�BITS�FOR�ALL�OF�ALTERNATES2‰BSR.S�BTTMAP�FORMAT�ALL�SLT�ENTRIES�TO�ALTERNATES<*ƒSET�STARTING�TRACK�NUMBER�BACK�TO�0�FOR�MAIN�PART�OF�DISK.‰CLR.L�RDSKIOS+IOSRRN-PBA(A4)DSKALTX‚RTS�RETURN�TO�DSKVAL*>**************************************************************<*ƒFOR�EACH�NON-ZERO�ENTRY�IN�THE�SECTOR�LOCKOUT�TABLE�FOUND,;*ƒA�FORMAT�COMMAND�WILL�BE�ISSUED�TO�POINT�TO�AN�ALTERNATE.9*…A1�SHOULD�BE�POINTING�TO�THE�END�OF�THE�ALTERNATE�TABLE *…SEE�DSKALTB>************************************************************** BTTMAPƒEQU�*éé‰LEA�TOTSLT(PC),A3‰LEA�ALTTBL(PC),A26*ƒSET�UP�D7�TO�BE�PSN�OF�LAST�SECTOR�OF�TRACK�SAT�USES‰MOVE.L�#SATSTRT,D6‰ADD.W�SAVESATL-PBA(A4),D6 ‰SUB.L�#1,D6 ‰BSR�SLTTRK‰ADD.L�VDOSSEC-PBA(A4),D6 ‰SUB.L�#1,D6 ‰MOVE.L�D6,D7<‰MOVE.W�#IOPBAD,(FORMIOS+IOSOPT)-PBA(A4)�SET�OPT�BIT�FOR�ALT(BTTMAPA‚TST.L�(A3)�THIS�SLT�ENTRY�ZERO�?‰BEQ.S�BTTMAPX�YES,�DONE"‰CMP.L�A2,A1�ANY�ALTERNATES�LEFT�?"‰BLE.S�BTTMAPC�NO,�ISSUE�ERROR�MSG>*ƒFIND�OUT�IF�SLT�ENTRY�IN�THE�SPACE�NEEDED�BY�THE�SAT.�IF�SO,;*ƒSKIP�ENTRY.‚IT�MUST�HAVE�GOTTEN�IN�SLT�BY�USER�PREVIOUSLY'*ƒWHEN�ALTERNATE�HANDLING�WAS�NOT�USED.‰CMP.L�(A3),D7)‰BLT.S�BTTMAPAA�OK,�ENTRY�NOT�IN�SAT�AREA‰ADD.L�#6,A3�SKIP�ENTRY ‰BRA�BTTMAPA?*ƒBEFORE�USING�AN�ALTERNATE,�SEE�IF�SLT�IS�IN�THE�ALTERNATE�TRK:BTTMAPAA�MOVE.L�(A3),D6‚SET�UP�REGISTER�USED�IN�SUBROUTINE+‰BSR�SLTTRK‚COMPUTE�BEG�OF�TRK�SLT�ENTRY�IN3‰CMP.L�(A2),D6‚SLT�ENTRY�IN�SAME�TRK�AS�ALTERNATE�?‰BNE.S�BTTMAPB�NO,�CONTINUE8*ƒSWAP�ALT�ENTRIES�SO�WE�DONT�FORMAT�ONE�TRACK�TO�ITSELF‰MOVE.L�4(A2),D0‰MOVE.L�(A2),4(A2)‰MOVE.L�D0,(A2)7BTTMAPB‚MOVE.L�(A3)+,(FORMIOS+IOSRRN)-PBA(A4)�BAD�TRACK/‰MOVE.L�(A2),(FORMIOS+IOSALT)-PBA(A4)�ALT�TRACK6‰CLR.L�(A2)+�NOW�CLEAR�IT�SO�CAN'T�BE�USED�AGAIN�LATER$‰ADD.L�#2,A3�SKIP�RANGE�IN�SLT�ENTRY3‰IOSCALL�FORMIOS(PC)�FORMAT�BAD�TRK�TO�POINT�TO�ALT‰BNE�IOERPRT�REPORT�ERROR‰BRA�BTTMAPA�GET�NEXT�ENTRY*5*ƒPREPARE�ERROR�MESSAGE--NO�MORE�ALTERNATES�AVAILABLE*2BTTMAPC‚BSR.S�ALTMSGOT‚TO�TO�OUTPUT�MESSAGE‚010485‰BRA�STOPIT‚QUIT„010485 #AL3 TMSGOT�LEA�ALTMSG(PC),A0¡<>‰RTS‚RETURN‚010485*+BTTMAPX‚MOVE.L�BUFADR-PBA(A4),A3�RESTORE�A3 ‰RTS�RETURN0**************************************************ƒMAKE�EACH�ALTERNATE�TRACK�UNAVAILABLE�TO)*ƒSYSTEM�BY�ENTERING�EACH�SECTOR�INTO�SAT0************************************************ BTTLOCK‚EQU�*-‰MOVEM.L�D0-D7/A0-A7,-(A7)�SAVE�ALL�REGISTERS9‰MOVE.L�BUFADR-PBA(A4),A3�SET�A3�TO�POINT�TO�INPUT�BUFFER‰LEA�ALTTBL(PC),A2%BTTLOCKA MOVE.L (A2)+,LOCKPSN-PBA(A4)&‰MOVEM.L�D6/A1-A2,-(A7)�SAVE�REGISTERS‰MOVE.W�D6,LOCKRNG-PBA(A4) ‰BSR�UPDSAT)‰MOVEM.L�(A7)+,D6/A1-A2�RESTORE�REGISTERS‰CMP.L�A2,A1�ALL�DONE�?‰BGT�BTTLOCKA�NO,‰MOVEM.L�(A7)+,D0-D7/A0-A7�RESTORE�REGISTERS-‰MOVE.L�D0,RDSKIOS+IOSRRN-PBA(A4)�RESTORE�RRN9‰MOVE.L�ISSEVALUE-PBA(A4),RDSKS-PBA(A4)�START�LOC�OF�READ9‰MOVE.L�ISSEVALUE-PBA+4(A4),RDSKE-PBA(A4)�END�LOC�OF�READ,‰MOVE.W�#IOREAD,RDSKIOS-PBA(A4)�READ�COMMAND‰RTS�RETURN¨ALTTRK>>‰PAGE.***********************************************(*†ENTER‚LOCKOUT�ENTRIES�IN�LOCKOUT�TABLE*.*********************************************** LOCKOUT‚EQU�*)‰TST.B�ZEROFLAG-PBA(A4)…IS�DISK�USER�ZERO‰BEQ‚LOCKOEX‡NO‰LEA�LOCKST(PC),A0¡<> LOCK2„LEA�LOCKM(PC),A0‰LEA�LOCKME(PC),A1*‰BSR�SENDMSGI…DO�THEY�WANT�A�LOCKOUT�ENTRY‰IOSCALL�INP3IOS(PC) ‰BNE�IOERPRT ‰BSR�SBARG ‰BNE�IOERPRT‰CMP.B�#'Y',ANSWER-PBA(A4)‰BNEƒLOCKOEX�NO ‰BSR�VALCLR7‰MOVE.L�CNFBKADR-PBA(A4),A0‚GET�CONFIG�POINTER�<<0104855‰MOVE.L�IOSRSZ(A0),TOTSECS-PBA(A4)‚SAVE�TOTAL�SECTORS ‰CLR.L�D0‰MOVE.B�IOSHDS(A0),D0‰MULU�#MAXBAD,D09‰MOVE.B�D0,TOTALTS-PBA(A4)�SAVE�TOTAL�ALTERNATES‚010485>>$‰BSR�CNTSLTŠCOUNT�SLT�ENTRIES‚011085LOCKOUT1 LEA LOCKQ(PC),A0‰LEA�LOCKQE(PC),A1‰BSR�SENDMSGIŽGET�START�SECTOR‰BSR�NUMCVT�REC�ANSWER ‰TST.L�D11‰BPL.S�LOCKCHK‡GOOD�CONVERSION,�CHECK�SIZE�010485‰CMP.B�#CR,D1ˆCARRAGE�RETURN‰BEQ�LOCKSATEˆEXIT$‰CMP.B�#'�',D1‡SPACE�TERMINATES�ALSO‰BEQ�LOCKSATEˆEXIT"LOCKERƒBSR�INVALE�SEND�INVALID�MSG‰BRA�LOCKOUT1ŽTRY�AGAIN :LOCKCHK‚CMP.L�TOTSECS-PBA(A4),D3‚NUMBER�TOO�BIG�?ƒ<<010485%‰BGE.S�LOCKER‚YES,�TRY�AGAIN‚010485>>#‰MOVE.L�D3,LOCKPSN-PBA(A4)�SAVE�PSN8‰TST.B�ALTUSE-PBA(A4)�ARE�WE�USING�ALTERNATES�?„<>#LOCKGONE�LEA�NOALTS(PC),A0ƒ<<022585‰LEA�NOALTSE(PC),A1!‰BSR�SENDMSG‰OUTPUT�ERROR�MESSAGE‰BRA.S�LOCKSATE†EXIT‚022585>>**LOCKOUT2 LEA LOCKN(PC),A0 GET # OF SECTORS‰LEA�LOCKNE(PC),A1‰BSR�SENDMSGIŽSEND�MSG‰BSR�NUMCVT�REC�ANSWER(‰TST.WƒD3”0�SECTORS�IS�AN�INVALID�ENTRY. ‰BEQ…LOCKER‰CMP.B�#'�',D1‰BHI�LOCKER�BAD*‰MOVE.W�D3,LOCKRNG-PBA(A4)�SET�UP�FOR�CALL‰BSR�UPDSATŠDO�SAT�UPDATE$‰BEQ.S�DOLOCKˆBRIF�UPDATED�CORRECTLY ‰BSR.S�LOCKMSG‰SET�UP�MSG’ALTTRK ‰BRA�LOCKOUT1ˆASK�FOR�NEXT�ENTRYDOLOCK;‰MOVE.L�LOCKPSN-PBA(A4),D6‚SET�UP�FOR�ENTRY�INTO�LOCK�TABLE‰MOVE.W�LOCKRNG-PBA(A4),D1ˆ*+‰BSR�LOCKTŠ****‚PUT�ENTRY�IN�LOCK�TABLE‚***%‰BEQ�LOCKOUT1‚GET�NEXT�ENTRY–<> 1LOCKSATE�TST.B�WSATFLAG-PBA(A4)†ANYTHING�TO�WRITE‰BEQ.S�LOCKOEXX†NO&‰BSR�SATWRIT‰WRITE�OUT�LAST�SAT�SECTOR3LOCKOEXX�TST.B�LOCKWRT-PBA(A4)‡ANYTHING�IN�LOCK�TAB‰BEQ.S�LOCKOEX‡NO‰BSR�WRTSLT¨ALTTRK* LOCKOEX‚EQU�*‰RTS‘***ƒEXIT�LOCKOUTƒ****-*ˆ*****ƒROUTINE�TO�TURN�OFF�BITS�IN�SAT�TABLE* LOCKSAT‚EQU�*‰BSR�SATSECT‰GET�SAT�IN�BUFFER‰LEA�VALBUF(A3),A09LOCKSAT1 TST.B SUBFLAG-PBA(A4) SET UP FOR SUBROUTINE CALL)‰BEQ.S�CALCHKŠBRIF�CALL�TO�CHECK�SAT�BITS)‰BSR.S�SATSETB‰GO�TO�SET�SAT�BITS�ROUTINE‰BRA.S�LOCKCONTCALCHK‰BSR.S�CHKBITSLOCKCONT‰BNE.S�LCKSATEXˆBRIF�ALREADY�ON‰SUB.W�#1,D1‰DEC�TOTAL•ALTTRK‰BNE.S‚LOCKSAT3ˆGET�NEXT!‰BSR�SATWRIT‰WRITE�OUT�S4 AT�SECTORLCKSATEX ‰RTS‘EXITLOCKSAT3‚EQU�*‰ADD.L�#1,D6‰ADD�TO�PSN%‰CMP.W�#2047,D5†AT�LAST�BIT�OF�SECTOR‰BCS.S�LOCKSAT2†NO*…WRITE�OUT�SAT ‰BSR�SATWRIT‰BRA�LOCKSAT‰DO�NEXT�BITLOCKSAT2‰ADD.W�#1,D5‰INC�FOR�NEXT�BIT‰BRA.S�LOCKSAT1** *‡UPDATE�SAT**UPDSAT#‰MOVE.L�LOCKPSN-PBA(A4),D6ˆINIT�PSN%‰MOVE.W�LOCKRNG-PBA(A4),D1ˆINIT�RANGE/‰CLR.B�SUBFLAG-PBA(A4)�SET�CHKBITS�ROUTINE�CALL%‰BSR�LOCKSAT‰CHECK�RANGE�OF�NEW�ENTRY-‰BNE.S�UPDSAT1‰BRIF�SECTORS�ALREADY�ALLOCATED#‰MOVE.L�LOCKPSN-PBA(A4),D6ˆINIT�PSN%‰MOVE.W�LOCKRNG-PBA(A4),D1ˆINIT�RANGE:‰MOVE.B�#$FF,SUBFLAG-PBA(A4)�SET�SET�SAT�BITS�ROUTINE�CALL ‰BSR�LOCKSAT‰CLR.L�D2ŒSET�GOOD�RETURNUPDSAT1 ‰RTS‘EXIT*4****************************************************%*ˆROUTINE�TO�SET�BITS�ON�IN�SAT�TABLE4*****************************************************SATSETB‚CLR.L�D3 ‰MOVE.W�D5,D3‰DIVU�#8,D3ŠGET�BYTE‰MOVE.W�D3,A1ˆSAVE�LOC‰SWAP�D3�GET�REMAINDER‰MOVE.L�#8,D4ˆINIT ‰ADD.W�#1,D3(‰SUB.W�D3,D4‰NEGATE�FOR�REV�NUMB�OF�BITS‰BSET‚D4,0(A0,A1.W)ƒTURN�ON�BIT‰RTS**$*…CHECK�FOR�SECTOR�ALREADY�ALLOCATED**CHKBITS‚CLR.L�D3 ‰MOVE.W�D5,D3‰DIVU�#8,D3ŠGET�BYTE‰MOVE.W�D3,A1ˆSAVE�LOC‰SWAP�D3�GET�REMAINDER‰MOVE.L�#8,D4ˆINIT ‰ADD.W�#1,D3(‰SUB.W�D3,D4‰NEGATE�FOR�REV�NUMB�OF�BITS ‰BTST‚D4,0(A0,A1.W)ƒTEST�THE�BIT‰RTS8********************************************************(*ˆROUTINE�TO�READ�THE�CORRECT�SAT�SECTOR*ˆD6�HAS�THE�PSN�OF�THE�SECTOR)*ˆINTO�VALBUF‰RETURN�WITH�REMAINDER�IN�D5*ˆD0�=�-1�MEANS�ERROR*ˆD6�IS�NOT�CHANGED-*ˆD5�CONTAINS�POSITION�IN�SECTOR�UPON�LEAVING8*********************************************************+SATSECT‚MOVE.B�#1,WSATFLAG-PBA(A4)‚SET�FLAG ‰CLR.L�D4 ‰MOVE.L�D6,D5‰DIVU�#2048,D5‡GET�WHOLE�SAT ‰MOVE.W�D5,D4!‰ADD.W�#SATSTRT,D4‰ADD�FOR�OFFSET.‰CMP.L�SAVESATL-PBA(A4),D4ƒCK�FOR�OUT�OF�RANGE‰BLS.S�SATS1‹GOOD‰BSR�DSKERRŠPRT�ERR�MSG‰BRA.S�SATEX‹EXITSATS1‰SWAP�D5�GET�REMAINDER2‰BSR.S�SATREAD‰READ�SECTOR�OF�SAT�D4�MUST�HAVE�PSN* SATEX„RTS*1*************************************************'*ˆD4�MUST�CONTAIN�PSN�FOR�START�OF�READ1**************************************************3SATREAD‚MOVE.L�D4,RDSKIOS+IOSRRN-PBA(A4)„PSN�OF�SAT‰MOVE.W�#IOREAD,RDSKIOS-PBA(A4)&‰STORE�VALBUFE(A3),RDSKE‰ESTABLISH�END‰STORE�VALBUF(A3),RDSKS‰IOSCALL�RDSKIOS(PC)‚READ�SAT ‰BNEƒSATERR‰RTS #************************************ˆSUBROUTINE�TO�WRITE�SAT*ˆRRN�MUST�BE�ALREADY�SET�UP#***********************************-SATWRIT‚CLR.B�WSATFLAG-PBA(A4)ˆCLR�WRITE�FLAG‰MOVE.W�#IOWRIT,RDSKIOS-PBA(A4)‰STORE�VALBUF(A3),RDSKS‰STORE�VALBUFE(A3),RDSKE‰IOSCALL�RDSKIOS(PC) ‰BNEƒSATERR‰RTS*9*********************************************************5*…ROUTINE�TO�GET�RESPONSE�AND�CONVERT�INPUT�TO�BINARY9**********************************************************/*‰THIS�ROUTINE�INPUTS�A�HEX�OR�DECIMAL�NUMBER�,+*‰CONVERTS�IT�INTO�BINARY.�UPON�RETURN,IF�A-*‰SPACE�OF�CR�FOLLOWED�THE�ENTERED�INPUT�THEN4*‰D1�WILL�CONTAIN�THE�CHARACTER�FOUND�ON�TERMINATION4*‰IN�LOWER�WORD.�IF�OTHER�THAN�A�SPACE�OF�CR,OR�JUST5*‰A�CR�WAS�ENTERED,�THEN�BIT�31�WILL�BE�SET,�WITH�THE *‰CHARACTER�STILL�IN�LOWER�WORD.** NUMCVTƒEQU�*ŠIOSCALL�INP5IOS(PC) ŠBNE�IOERPRT ŠBSR�SBARG ŠBNE�IOERPRT ŠBSR�END50ŠLEA�DESCANS(PC),A0ŒFIRST�LOCATION�OF�ENTRY�DATA*ŠCMP.B�#'�',(A0)‹IS�FIRST�INPUT�A�'SPACE'?ŠBNE.S�NORM’BRANCH�IF�NO/ŠMOVE.L�#$FFFFFFFF,D1†MOVE�ERROR�TO�D1�AND�EXIT ŠBRA.S�OUTTJNORM†BTST�#VOPTR,OPTFLG-PBA(A4)�IS�THE�V�OPTION�ROUTINE�USING�THIS�ROUTINEŠBEQ.S�CNVT’BRANCH�IF�NO:ŠCMP.B�#'$',(A0)„DOLLAR�SIGN�THERE�ALREADY�?ƒSPR839�101984'ŠBEQ.S�CNVT‰YES,�CONTINUE‘SPR839�101984=ŠLEA�DESCAN$+1(PC),A0ŠSINCE�V�OPTION�USING,�INPUT�IS�ALWAYS�H&*£SO�STUFF�A�'$'�BEFORE�ENTERED�STRING)CNVT†BSR�ASCVAL�CALL�ASCII�TO�DEC�ROUTINE1ŠCMP.B�#CR,D1ŽWAS�A�CR�THE�TERMINATION�CHARACTER?ŠBEQ.S�OUTT’BRANCH�IF�YES7ŠCMP.B�#'�',D1�WAS�A�'SPACE'�THE�TERMINATION�CHARACTER?ŠBEQ.S�OUTT’BRANCH�IF�YE4 S:ŠOR.L�#$80000000,D1ˆSET�BIT�31�TO�SHOW�INVALID�TERMINATIONOUTT†RTS<****************************************************<<011085*!*ˆROUTINE�TO�COUNT�ENTRIES�IN�SLT#*ŠResult�(ALTSUSED)�needed�by�LOCKT#*Šwhen�dealing�with�alternate�track *Šentries.*4****************************************************CNTSLT:‰LEA�TOTSLT(PC),A0 ‰CLR.B�D0 CNTSLTA‚TST.L�(A0)+‰EMPTY�ENTRY?‰BEQ.S�CNTSLTB‡YES,�DONE‰ADD.B�#1,D0‰ADD�1�TO�COUNTER!‰ADD.L�#2,A0‰SKIP�LENGTH�OF�ENTRY‰BRA�CNTSLTA‰CHECK�NEXT�ENTRY4CNTSLTB‚MOVE.B�D0,ALTSUSED-PBA(A4)‚UPDATE�TOTAL�USED‰RTS‘RETURN‚011085>>‰PAGEJ*****************************************************************‚<SLTUPCƒMOVE.L�ALTSAVE-PBA(A4),FORMIOS+IOSRRN-PBA(A4)�BAD�TRACK6‰MOVE.W�#IOPBAD,FORMIOS+IOSOPT-PBA(A4)�OPT�BIT�FOR�ALT3‰IOSCALL�FORMIOS(PC)‚FORMAT�BAD�TRK�TO�POINT�TO�ALT‰BNE�IOERPRT‰ERROR:*…NOW�WRITE�OUT�BUFFER�TO�OLD�TRACK�(REALLY�THE�ALTERNATE)0‰MOVE.W�#IOWRIT,RDSKIOS-PBA(A4)‚PREPARE�TO�WRITE5‰MOVE.L�ISSEVALUE-PBA(A4),RDSKS-PBA(A4)‚BEG�OF�BUFFER9‰MOVE.L�ALTSAVE-PBA(A4),RDSKIOS+IOSRRN-PBA(A4)�BEG�OF�TRK‰IOSCALL�RDSKIOS(PC)‰BNE�IOERPRT‰ERROR‰BRA�LOCKOUT1ˆGET�NEXT�ENTRY*-*…COMPUTE�BEGINNING�OF�THE�TRACK�SLT�ENTRY�INé%*ˆENTER:�D6�CONTAINS�PSN�OF�SLT�ENTRY3*ˆEXIT�:�D6�CONTAINS�PSN�OF�BEG�OF�TRK�SLT�ENTRY�IN* SLTTRKƒEQU�*‰MOVE.L�D3,-(A7)�SAVE�D3 ‰MOVE.L�D6,D3‰DIVU�VDOSSEC+2-PBA(A4),D6‰MOVE.W�#0,D6‚CLEAR�QUOTIENT‰SWAP�D6‚GET�REMAINDER ‰NEG.L�D6"‰ADD.L�D3,D6‚SUB�QUOTIENT�FROM�PSN‰MOVE.L�(A7)+,D3‚RESTORE�D3 ‰RTS‚RETURNŠPAGE8********************************************************0*‰ROUTINE�TO�PUT�AN�ENTRY�IN�THE�LOCK�OUT�TABLE..*‰IF�USING�ALTERNATE�SECTOR�CAPABILITY,�NO�SAT-*‰INDICATORS�WILL�BE�SET.�INSTEAD,�SEARCH�FOR.*‰DUPLICATE�OR�OVERLAPPING�SLT�ENTRIES�WILL�BE!*‰DONE�HERE�BEFORE�ADDING�TO�SLT.*‹D6�CONTAINS�PSN�START*‹D1�CONTAINS�NUMBER�OF�SECTORS*‰ALL�REGS�SAVED�AND�RESTORED-*‹NON-ZERO�INDICATOR�SET�ON�EXIT�IF�DUPLICATE *‹OR�OVERLAP�CONDITION�IS�FOUND.8********************************************************* LOCKT„EQU�*-‰MOVEM.L�D0-D7/A0-A7,-(A7)�SAVE�ALL�REGISTERS!‰CLR.L�D0‚INIT�D0�FOR�GOOD�RETURN!‰TST.B�FLOPPY-PBA(A4)†FLOPPY�DISK‰BNE.S�LOCKTEX�YES*‰LEA�TOTSLT(PC),A01‰TST.B�ALTUSE-PBA(A4)‚USING�ALTERNATES�?‚<<010485‰BEQ.S�LOCKT1‚NO,�CONTINUE‰MOVE.B�ALTSUSED-PBA(A4),D2)‰CMP.B�TOTALTS-PBA(A4),D2‚USED�THEM�ALL�?‰BLT.S�LOCKT1‚NO,�CONTINUE‰MOVE.B�#$FF,D0‚YES,�SET�FLAG‰BRA.S�LOCKTEX‚EXIT—010485>>LOCKT1ƒMOVE.L�(A0)+,D0�OLD�LOW"‰BEQ.S�LOCKT2�EMPTY,�ADD�NEW�ENTRY ‰CLR.L�D2‰MOVE.W�(A0)+,D2 ‰ADD.L�D0,D2‰SUB.L�#1,D2�OLD�HIGH ‰CMP.L�D2,D62‰BGT�LOCKT1�NEW�LOW�GT�OLD�HIGH,�OK�CHK�NEXT�ENTRY*!‰MOVE.L�D6,D3‚PRESEVER�D6,�USE�D3 ‰ADD.L�D1,5 D3‰SUB.L�#1,D3�NEW�HIGH ‰CMP.L�D0,D32‰BLS�LOCKT1�NEW�HIGH�LT�OLD�LOW,�OK�CHK�NEXT�ENTRY*%‰MOVE.B�#1,D0�SET�ERROR�FLAG�AND�EXIT‰BRA.S�LOCKTEX*+LOCKT2ƒSUB.L�#4,A0�POINT�TO�AVAILABLE�ENTRY)‰MOVE.B�#1,LOCKWRT-PBA(A4)�SET�WRITE�FLAG‰MOVE.L�D6,(A0)‰PSN‰MOVE.W�D1,4(A0)ˆNUMBER.‰ADD.B�#1,ALTSUSED-PBA(A4)‚UPDATE�COUNT‚010485‰CLR.B�D0�GOOD�EXIT* LOCKTEX‚EQU�*,‰MOVEM.L�(A7)+,D0-D7/A0-A7�RESTORE�REGISTERS‰RTS—RETURN�FROM�LOCKT�ROUTINE‰PAGE/************************************************ˆWRITE�ENTIRE�SLT/************************************************ WRTSLTƒEQU�*‰IOSCALL�WDSKSLT(PC) ‰BNE�IOERPRT'‰CLR.B�LOCKWRT-PBA(A4)�CLEAR�WRITE�FLAG ‰RTS¯ALTTRK>>/************************************************ˆWRITE�OUT�LOCKIO�SECTOR/************************************************ WRTLOCK‚EQU�*‰IOSCALL�LOCKIOS(PC) ‰BNE�IOERPRT‰RTS‰PAGE /*************************************************ˆDIAGNOSTIC�AREA�PROCESSING*’A�=�TOTAL�SECTORS*’B�=�SECTORS�PER�TRACK*’C�=�#�OF�CYLINDERS*’D�=�B*C�=�SECTORS�PER�SIDE*’E�=…A/D�NO�OF�SIDES=*ˆHEADS�OR�SIDES�=�TOTAL�SECTOR/SECTORS�PER�TRACK�*�CYLINDERS*’E„=†A†/‡BŠ*…C*’F„=‚SECTORS/CYLINDER�=�E�*�B$*’G„=‚1ST�PSN�OF�CYLƒ=‚CYL�#�*�E�*�B)*’H„=‚1ST�PSN�OF�LAST�CYL�=�(C-1)�*�E�*�B**’SAT�USES�VALBUF*’TRACKWRITE�USES�HARDBUF*’VID�USES�VIDIO�BUFF*’DIAGNOSTIC�TABLE�USES�LOCKIO0*************************************************DIAGAREA EQU *$‰TST.B�ZEROFLAG-PBA(A4)‚IS�DISK�ZERO‰BEQ�DIAGEXŠNOŠLEA�DIAGM(PC),A0ŠLEA�DIAGME(PC),A1,ŠBSR�SENDMSGI…DO�THEY�WANT�A�DIAGNOSTIC�AREAŠIOSCALL�INP3IOS(PC) ŠBNE�IOERPRT ‰BSR�SBARG ‰BNE�IOERPRTŠCMP.B�#'Y',ANSWER-PBA(A4)ŠBNE�DIAGEX�NOŠBSR�LOCKCLRˆDIAG�TABLE�AREA DIAG…EQU�*#‰LEA�CYLM(PC),A0‰REQ�#�OF�CYLINDERS‰LEA�CYLME(PC),A1 ‰BSR�SENDMSGI ‰BSR�NUMCVT‰TST.L�D3ŒCK�FOR�ZERO ‰BEQ�DIAGŒYES‰TST.L�D1ŒCK�FOR�ERR‰BPL.S�DIA2ŒGOODDIAER„BSR�INVALEŠERROR�MSG ‰BRA�DIAG1DIA2…MOVE.W�D3,SAVCYL-PBA(A4)„SAVE�#�OF�CYLINDERS*'‰LEA�SECNM(PC),A0ˆREQ�SECTORS/TRACK�MSG‰LEA�SECNME(PC),A1 ‰BSR�SENDMSGI ‰BSR�NUMCVT ‰TST.L�D3 ‰BEQ�DIAER ‰TST.L�D1‰BPL.S�DIA4ŒGOOD‰BRA�DIAER‹ERROR5DIA4…MOVE.W�D3,SAVSEC-PBA(A4)„SAVE�#�OF�SECTORS/TRACK)‰MOVE.W�SAVCYL-PBA(A4),D6„RESET�CYLINDERS‰MULU�D3,D6ŠSECTORS�PER�HEAD.‰MOVE.L�D6,SAVSIDE-PBA(A4)ƒSECTORS�ON�ONE�SIDE2‰MOVE.L�DCPBLK+IOSRSZ-PBA(A4),D3‚GET�TOTAL�SECTORS(‰DIVU�D6,D3ŠLOW�WORD�CONTAINS�#�OF�HEADS‰SWAP�D3�IF�A�REMAINDER�EXISTS ‰TST.W�D3ŒTHE�INPUT�WAS�IN�ERROR‰BEQ.S�DIAGINPGˆBRIF�OK‰BSR�INVALEŠINVALID�INPUT!‰BRA.S�DIAGŠGET�THE�CORRECT�INPUTDIAGINPG‰SWAP�D3�RESTORE�REGISTER5‰MOVE.W�D3,SAVHEAD-PBA(A4)ƒ#�OF�SIDES�FOR�DISK�SYSTEM ‰CLR.L�D0‰MOVE.W�D3,D0ˆINIT�HEAD�# ‰CLR.L�D1$‰MOVE.W�SAVSEC-PBA(A4),D1„SECT/TRACK ‰MULU‚D0,D1,‰MOVE.L‚D1,SAVSECCY-PBA(A4)ƒSECTORS/CYLINDER6‰MOVE.L‚D1,FPSN-PBA(A4)‡1ST�PSN�OF�CYLINDER�1(2ND�CYL) ‰CLR.L‚D2‰MOVE.W�SAVCYL-PBA(A4),D2‰SUB.W�#1,D2“POS�FOR�LAST�CYL ‰MULU�D2,D10‰MOVE.L�D1,LPSN-PBA(A4)ˆ1ST�POS�OF�LAST�CYLINDER*C*******************************************************************;*ƒALLOCATE�DIAGNOSTIC�BUFFER�AND�FILL�WILTH�DIAGNOSTIC�DATA/*ƒTO�BE�READ�INTO�DIAGNOSTIC�TEST�AREA�ON�DISK.C********************************************************************>*‚CALCULATE�AMOUNT�OF�MEMORY�NEEDED�FOR�BUFFER�AND�GET�MEMORY.*E‰MOVE.W‚#$2000,MSBDIAG+8-PBA(A4)‚SEG.�DIRECTIVE�(NO�MEMORY�AVAIL�RET),‰MOVE.W‚SAVSEC-PBA(A4),D0Š#�OF�SECTORS/TRACK.‰MULU.W‚#SECLEN,D0‰PRODUCT�GIVES�MEMORY�LENGTH%‰MOVE.L‚D0,DIAEND-PBA(A4)‚SAVE�LENGTH7‰MOVE.L‚D0,MSBDIAG+20-PBA(A4)†STUFF�LENGTH�IN�MSB�TABLEDIABUFF3�MOVE.L‚#GTSEG,D0)‰LEA…MSBDIAG(PC),A0‰GET�SEGMENT�OF�MEMORY‰TRAP„#1+‰BEQ.SƒDIABUFF1‹BRANCH�IF�NO�ERRORS�OCCURED#‰CMP.Wƒ#8,D0ŽPHYSICAL�MEMORY�ERROR?‰BEQ.SƒDIABUFF2‹BRANCH�IF�YES9‰LEA…SEGAL(PC),A0‹OUTPUT�SEGMEMT�ALLOCATION�ERROR�MESSAGE‰LEA…SEGALE(PC),A1 ‰BSR…SENDMSG‰BRA…STOPIT�****EXIT*****3DIABUFF2�LEA…TMSG(PC),A0ŒMEMORY�UNAVAILABLE�MESSAGE‰LEA…TMS6 GE(PC),A1 ‰BSR…SENDMSGA‰MOVE.W‚#$2400,MSBDIAG+8-PBA(A4)‚SEG�DIR.�(WAIT�FOR�MEMORY�AVAIL) ‰BRA…DIABUFF3@DIABUFF1�CMP.Wƒ#$2000,MSBDIAG+8-PBA(A4)‚IS�FIRST�TIME�ALLOCATED?‰BEQ.SƒDIABUFF4‹BRANCH�IF�YES1‰LEA…T1MSG(PC),A0‹OUTPUT�MEMORY�ALLOCATED�MESSAGE‰LEA…T1MSGE(PC),A1 ‰BSR…SENDMSGIDIABUFF4�MOVE.L‚A0,DIASTRT-PBA(A4)�SAVE�BASE�ADDRESS�OF�DIAGNOSTIC�BUFFER*"*‚FILL�DIAGNOSTIC�BUFFER�WITH�DATA*-‰MOVE.L‚A0,D0ŽCALCULATE�END�ADDRESS�OF�BUFFER‰ADD.LƒDIAEND-PBA(A4),D0"‰SUB.Lƒ#1,D0ŽEND�ADDRESS�OF�BUFFER4‰MOVE.L‚D0,DIAEND-PBA(A4)‚SAVE�END�ADDRESS�OF�BUFFER.RNDNUMƒMOVE.L‚#$FFFFFFFF,D1†SET�MAXIMUM�NUMBER$‰BSR…RANDOM�DO�RANDOM�NUMBER�ROUTINE'‰MOVE.L‚D0,(A0)+‹STORE�NUMBER�IN�BUFFER)‰CMP.LƒDIAEND-PBA(A4),A0ŠBUFFER�FULL�YET?‰BLE.SƒRNDNUM�BRANCH�IF�NO*,*‚SET�UP�VID�WITH�DIAGNOSTIC�TABLE�DIRECTORY*‰LEA�VIDIO(A3),A5*‰MOVE.L�VIDSLT(A5),D5…PSN�OF�LOCKOUT�TABLE-‰ADD.L�#LOCKSN,D5ŽESTAB�SECTOR�LOCK�FOR�TABLE‰MOVE.L�#SATSTRT,D4’PSN�OF�SAT‰BSR�SATREAD“READ�SAT�START&‰LEA�VALBUF(A3),A0‡START�OF�BUF�OF�SAT4DIAGGSƒBSR�SATSETBŠPUT�BIT�ON�IN�SAT�FOR�DIAG�SECTOR&‰BEQ.S�DIAGBOK‰GOOD�-�BIT�NOT�PREV�SET‰ADD.L�#1,D5‰SET�FOR�NEXT&‰CMP.L�#2048,D5†HAVE�WE�EXCEEDED�TRACK‰BCS�DIAGGSŠNO‰LEA�BADSM+4(PC),A0 ‰BSR�PRTSECTEˆPRT�BAD�SECTOR�MSG‰BRA�STOPIT…**‚EXIT�***ˆGOOD/DIAGBOK‚MOVE.L�D5,VIDDTA(A5)ŠPSN�OF�DIAG�DIRECT5‰MOVE.L�D5,LOCKIOS+IOSRRN-PBA(A4)�PSN�TO�PARM�FOR�WRT‰BSR�SATWRIT‰WRT�OUT�THE�SAT*1*ˆALLOCATE�2�TRACKS�PER�SIDE�FOR�DIAGNOSTIC�NEEDS,*ˆMUST�BE�CLOSEST�TO�START�&�END�AS�POSSIBLE%*ˆALL�BITS�MUST�BE�OFF�FOR�THIS�TRACK*‰MOVE.W�SAVSEC-PBA(A4),D2*DIALOPƒTST.B�POSITION-PBA(A4)†SIDE�POINTER‰BNE.S�DIASŠSIDE�2&‰MOVE.L�FPSN-PBA(A4),D6†INIT�1ST�TRACK‰BRA.S�DIANXTˆCK�BIT�IN�SAT+DIAS…MOVE.L�LPSN-PBA(A4),D6†INIT�LAST�TRACK*-**********************************************ˆTEST�BITS�IN�SAT�FOR�TRACK-********************************************* DIANXTƒEQU�**ˆD6�=�START�PSN ‰BSR�DIASATB ‰TST.L�D0‰BPL.S�DIA5ŒGOOD)DIANXT1‚TST.B�POSITION-PBA(A4)ƒWHICH�PART‰BNE.S�DIANXT2‡LAST)‰ADD.L�SAVSECCY-PBA(A4),D6ƒGET�NEXT�TRACK ‰BRAƒDIANXT)DIANXT2‚SUB.L�SAVSECCY-PBA(A4),D6ƒBACK�UP ‰BRAƒDIANXT2DIA5…MOVE.L�D6,RDSKIOS+IOSRRN-PBA(A4)‚PSN�TO�TABLE2‰BSR�WRTTRK”**�WRITE�TRACK�OF�DIAG.�DATA�TO�DISK**‰BEQ.S�DIASB‰DO�NEXT"‰CMP.B�#ISTAEOV,D0ƒHIT�END�OF�FILE‰BEQ�IOERPRT‰YES#‰BSR�DSKRDCK‰GO�TO�CK�ERROR�ROUTINE‰TST.B�D0ŒCK�FOR�ERROR�TYPE‰BEQ�DIANXT1‰GET�NEXT�TRACK"‰BRA�PRTIO‹PRINT�ERROR�&�TERMINATE *‰TURN�ON�BITS�IN�SAT�TABLE DIASB„EQU�*‰MOVE.B�#1,BSTFLAG-PBA(A4)‰BSR.S�DIASATB‰CLR.B�BSTFLAG-PBA(A4)0*************************************************’PUT�ENTRY�IN�DIAGNOSTIC�TABLE0*************************************************’DO�NEXT�TRACK‰LEA�LOCKIO(A3),A0‡TAB�START)‰MOVE.W�DIAIP-PBA(A4),D0…LOC�WITHIN�TABLE*"*ƒSTOP�IF�ENTRY�WON'T�FIT�IN�TABLE**‰LEA�5(A0,D0.W),A1…A1=ADDR�OF�END�OF�ENTRY#‰LEA�LOCKIOE(A3),A2ˆA2=END�OF�TABLE ‰CMP.L�A2,A1‰BHI.S�DIAS3�WON'T�FIT"‰MOVE.L�D6,0(A0,D0.W)‚MOVE�POINTER'‰MOVE.W�D2,4(A0,D0.W)‚MOVE�SECTOR/TRACK#‰ADD.W‚#6,DIAIP-PBA(A4)…INC�POINTER"‰TST.B�POSITION-PBA(A4)†WHICH�SIDE1‰BNE.S�DIAS2‰SIDE2�FLAG�SET(JUST�FINISHED�SIDE�1) *’DO�SIDE�2/‰ADD.L�D2,FPSN-PBA(A4)ƒRESET�FPSN�FOR�NEXT�SIDE6‰MOVE.B�#1,POSITION-PBA(A4)„SET�END�TRACK�OF�SIDE�FLAG‰BRA�DIALOP’CONTINUE2DIAS2„CLR.B�POSITION-PBA(A4)ˆSET�FOR�START�OF�SIDE/‰ADD.L�D2,LPSN-PBA(A4)�RESET�LPSN�FOR�NEXT�SIDE‰SUB.W�#1,SAVHEAD-PBA(A4)‰BNE‚DIALOP‘GET�NEXT,DIAS3„BSR�WRTLOCK‰WRITE�OUT�DIAGNOSTIC�TABLE*&DIAGEXƒRTS‘***‚EXIT�FROM�DIAGAREA‚*****0************************************************-*ˆROUTINE�TO�CHECK�FOR�NO�BITS�ON�FOR�A�TRACK*ˆAND�IN‚PASS�2�TURN�ON�BIT*ˆD2�=�SECTORS/TRACK*ˆD6�=�START�PSN2*************************************************** DIASATB‚EQU�* ‰BSR�SATSECT‰GET�SAT�INTO�MEMORY$*’D5�=�POSITION�WITHIN�TRACK�IN�WORD‰AND.L�#$FFFF,D5ˆCLEAR�HI�WORD ‰MOVE.L�D2,D1‰LEA�VALBUF(A3),A0DIASATL‚MOVE.L�D5,D3 ‰DIVU�#8,D3‰MOVE.W�D3,A1ˆBASE�POSIT6 ION‰SWAP�D3 ‰MOVE.L�#8,D4 ‰ADD.W�#1,D3‰SUB.W�D3,D4‰BEG�FOR�BIT'‰TST.B�BSTFLAG-PBA(A4)�TEST�OR�SET�COND‰BEQ.S�DIASATBT*‰SET�BIT�IN�SAT‰BSET�D4,0(A0,A1.W)‰BRA.S�DIASATT‡CONT*�TEST�BIT�IN�SATDIASATBT EQU *‰BTST�D4,0(A0,A1.W)‰BEQ.S�DIASATT‡BIT�WAS�CLR*‰ERROR�CONDITION‰MOVE.L�#-1,D0‰BRA.S�DIASATEXˆEXIT!DIASATT‚SUB.L�#1,D1‰DEC�BIT�COUNT‰BNE.S�DIASATC‰OK�GET�NEXT*�DONE‰TST.B�BSTFLAG-PBA(A4)‡PASS�ONE!‰BEQ.S�DIACLD0‡YES�DO�NOT�WRT�SAT‰BSR�SATWRIT‰WRITE�OUT�SATDIACLD0‚CLR.L�D0‰BRA.S�DIASATEXˆEXIT!DIASATC‚ADD.L�#1,D5‰MOVE�UP�TRACK‰CMP.L�#2048,D5†AT�END�OF�A�SAT‰BCS�DIASATL‰NO�CONT'‰TST.B�BSTFLAG-PBA(A4)�TEST�BITS�PASS�1‰BEQ.S�DIAW2‰YES‰BSR�SATWRIT‰WRITE�SAT*ŽGET�NEXT�SAT�IN�BUFF&DIAW2„MOVE.L�RDSKIOS+IOSRRN-PBA(A4),D4‰ADD.L�#1,D4‰INC�FOR�NEXT�SAT‰BSR�SATREAD‰READ�NEXT�SAT$‰LEA�VALBUF(A3),A0‡RESET�BUF�POINTER‰BRA�DIASATL�CONTINUE*DIASATEX�RTS‘RETURN*-*********************************************2*ˆROUTINE�TO�WRITE�DIAGNOSTIC�BUFFER�TO�DIAGNOSTIC*ˆTRACKS�ON�THE�HARD�DISK.-**********************************************%WRTTRKƒMOVE.W�#IOWRIT,RDSKIOS-PBA(A4)@‰MOVE.L�DIASTRT-PBA(A4),RDSKS-PBA(A4)‡STARTING�ADDRESS�OF�BUFFER=‰MOVE.L�DIAEND-PBA(A4),RDSKE-PBA(A4)ˆENDING�ADDRESS�OF�BUFFER‰IOSCALL�RDSKIOS(PC)‰RTS‰PAGE/*************************************************ˆVERSADOS�PROCESSING*/************************************************VERSAREA EQU *$‰TST.B�ZEROFLAG-PBA(A4)�IS�DISK�ZERO‰BEQ�VERSEXŠNO‰BSR�WVIDŒWRITE�OUT�PARTIAL�VID‰BSR�CLOOUTŠCLOSE�VOLUME�ASSIGN6‰MOVE.W�#FHFDV,INFHS-PBA(A4)ƒWHERE�IS�SYSTEM�DISK�CALL&‰MOVE.W�#FOPDSY,INFHS+2-PBA(A4)‚OPTION‰FHSCALL�INFHS(PC) ‰BNEƒIOERPRT%*************************************#*‡****‚TEMP�PLUG�OF�SYS�VOLUME‚****%*************************************,VERSAN0‚MOVE.B�#DSKLUVI,INFHS+FHSLUN-PBA(A4)(‰MOVE.W�#FHASGN,INFHS-PBA(A4)‚SET�ASSIGN7‰MOVE.W�#FHALLO+FHASGN,OUTFHS-PBA(A4)‚ALLOCATE�&�ASSIGN*‰MOVE.W�#FOPPR,INFHS+2-PBA(A4)�PUBLIC�READ8‰MOVE.L�VIDIO(A3),OUTFHS+FHSVOL-PBA(A4)�VOLUME�OF�OUTPUT‰BSR�VEROK‹CK�IF�BOOT�WANTED‰BNE�VERSEXE‰NO#‰LEA�INFHS+FHSUSN(PC),A0‹SEND�START‰LEA�OUTFHS+FHSUSN(PC),A1 ‰CLR.W�(A0)+ ‰CLR.W�(A1)+4‰MOVE.L�INFHS+FHSVOL-PBA(A4),VOLPRT-PBA(A4)„VOL�NAME‰MOVE.L�#'0000',L1USN-PBA(A4)!‰MOVE.L�#'„',(A0)‹BLANK�CATALOGUE‰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.L�BOOTFILE-PBA(A4),(A0)‹FILE�NAME‰MOVE.L�(A0),(A1)+‰MOVE.L�(A0)+,L1FIL-PBA(A4)‰MOVE.L�BOOTFILE+4-PBA(A4),(A0)‰MOVE.L�(A0),(A1)+‰MOVE.L�(A0)+,L1FIL+4-PBA(A4)%‰MOVE.W�BOOTEX-PBA(A4),(A0)ƒEXTENSION‰MOVE.W�(A0),(A1)‰MOVE.W�(A0),L1EXT-PBA(A4)‰MOVE.L�#34,D1‡SEND�SIZE‰LEA�VOLPRT(PC),A0‡SEND�LINE‰LEA�PRTBUF(PC),A1ˆREC�LINE ‰BSR�SPCOMP*’SEND�MSG�SHOWING�SYS�VOL‰LEA�NAMM(PC),A0 ‰BSR�SENDMSG‰LEA�NAMMR(PC),A0‰LEA�NAMMRE(PC),A1 ‰BSR�SENDMSGI‰IOSCALL�INP8IOS(PC) ‰BNE�IOERPRT ‰BSR�SBARG ‰BNE�IOERPRT'‰CMP.B�#CR,HARDBUF(A3)…CARR�RET�ENTEREDO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º03/05/84*ˆBEQ.S�VERSAN2“YES‰BEQ.S�VERSAN15’YES *º03/05/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<&‰LEA�HARDBUF(A3),A0†PREP�FOR�EDIT�CALL‰LEA�INFHS(PC),A6 ‰BSR�EDITFILE‰BPL.S�VERSAN1‡GOOD ‰BSR�INVALE ‰BRA�VERSAN0VERSAN1‚LEA�HARDBUF(A3),A0‰LEA�OUTFHS(PC),A6 ‰BSR�EDITFILEO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º03/05/84 VERSAN15: *º03/05/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84‰MOVE.L„#LOOP514,D1,*œEstablish�loop�count�for�5�1/4�inch�floppy*œin�case�volume�error�occurs *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 2VERSAN2‚FHSCALL�INFHS(PC)ƒASSIGN�SYSTEM�FILE�INPUT‰IF‚‚THEN.S $*’***�ERROR�ASSIGN7 ING�INPUT�FILE�***:‰CMP.B�#FSTAFD,D0„IF�THE�ERROR�IS�'FILE�DESCRIPTOR�ERROR',<‰BEQ.S�VERSAN3‡'VOLUME�ERROR',�OR�'FILENAME�DOES�NOT�EXIST',?‰CMP.B�#FSTAVOL,D0ƒWE�CAN�HANDLE�IT--OTHERWISE�JUST�PRINT�ERRORO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84*ˆBEQ.S�VERSAN3‡AND�TERMINATE.‰BEQ.S�VERSAN33†AND�TERMINATE. *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰CMP.B�#FSTANNM,D0ƒ*‰BNE�IOERPRT‰* IVERSAN3‚MOVE.L�#LDFLUN,D1ƒCALL�ERROR�MESSAGE�HANDLER�TO�PRINT�APPROPRIATE"‰BSR�PRTERMŠMESSAGE�AND�ASK�AGAIN.‰BRA�VERSAN0‰* O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84 VERSAN33: ‰SUB.B…#1,D1$*œADJUST�LOOP�COUNT�FOR�VOLUME�ERROR‰BMI.S…VERSAN3*œJUMP�IF�LOOP�COUNT�EXPIRED‰MOVE.L„#LPCT514,A0‰MOVE.L„#DELAY,D0‰TRAP†#1 *œESTABLISH*œA0�-�TIME�TO�DELAY*œD0�-�DIRECTIVE*œINITIATE�DELAY‰BRA.S…VERSAN2 *œREPEAT�LOOP *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ‰ENDI ‰LEA�INFHS(PC),A0‰LEA�OUTFHS(PC),A18‰MOVE.L�VIDIO(A3),OUTFHS+FHSVOL-PBA(A4)„VOLUME�OF�OUTPUT&‰MOVE.W�FHSWCD(A0),FHSWCD(A1)‚PASSWORD‰MOVE.W�FHSLRL(A0),FHSLRL(A1)‰MOVE.L�FHSSIZ(A0),FHSSIZ(A1)‰MOVE.B�FHSOPT(A0),FHSOPT(A1)O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º03/05/84 *ˆMOVE‚#20,D7‰MOVE.L„#LOOP514,D1,*œEstablish�loop�count�for�5�1/4�inch�floppy*œincase�volume�error�occurs *º03/05/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< VERSANX$‰FHSCALL�OUTFHS(PC)†ASGN�FILE�OUTPUT ‰BEQ.S�VERSR>‰CMP.B�#FSTAVOL,D0ƒASSIGNMENT�ERROR�ON�VOLUME�LEGAL�FOR�AWHILE ‰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�=�LOOP�COUNT**ˆOUTPUT*’A0�=�DESTROYED*’D0�=�DESTROYED* *ˆCONDITIONS*’MINUS‚-�LOOP�COUNT�EXPIRED!*’ZEROƒ-�DELAY�REQUEST�SUCCESSFULLDELAY: ‰SUB.B…#1,D1$*œADJUST�LOOP�COUNT�FOR�VOLUME�ERROR‰BMI.S…LDELAY10*œJUMP�IF�LOOP�COUNT�EXPIRED‰MOVE.L„#LPCT514,A0‰MOVE.L„#DELAY,D0‰TRAP†#1 *œESTABLISH*œA0�-�TIME�TO�DELAY*œD0�-�DIRECTIVE*œINITIATE�DELAY LDELAY10:‰RTS *º03/05/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<* *ˆDO�READ�&�WRITE�OF�SYSTEM�FILE*#VERSR„IOSCALL�FILEIOS(PC)…READ�FILE‰BEQ.S�VERSGOˆGOOD‰CMP.B�#ISTAEOF,D0ƒEND�OF�FILE‰BEQƒVERSE‹YES ‰BRA�IOERPRT** EXECUTION OF V OPTION*1VERSGOƒBTST„#VOPT,OPTFLG-PBA(A4)�IS�V�OPTION�SET? ‰BEQ…VERSGO1A‰BCHG„#VOPTR,OPTFLG-PBA(A4)‚MARK�THAT�V�OPTION�ROUTINE�IS�CALLING2‰MOVEM.L�A0/A2/D0/D3,-(A7)‚SAVE�REGISTERS�ON�STACK8‰MOVE.L‚FILESA-PBA(A4),A0ŠSTART�OF�FILE�BEING�TRANSFERED,‰MOVE.W‚LDWD(A0),D0ˆD0�CONTAINS�LOAD�ADDRESS ‰LSL.Lƒ#8,D0ŽACCOUNT�FOR�MOD�256*‰MOVE.L‚D0,LDADR-PBA(A4)ƒSAVE�LOAD�ADDRESS=‰MOVE.L‚D0,ENTADR-PBA(A4)‚INITIALIZE�ENTERED�ADDRESS,�FOR�CR.‰BSR…BHLCVT�CONVERT�TO�ASCII‰LEA…LDMSG1(PC),A0(‰MOVE.L‚D2,(A0)ŒSTUFF�FOR�MESSAGE�OUTPUT‰MOVE.L‚D3,4(A0)‰LEA…LDMSG(PC),A02‰LEA…LDMSGE(PC),A1ŠOUTPUT�LOAD�ADDRESS�TO�TERMINAL ‰BSR…SENDMSGVOPT02ƒLEA…NEWADR(PC),A0‰LEA…NEWADRE(PC),A1&‰BSR…SENDMSGI‹ASK�FOR�NEW�LOAD�ADDRESS‰BSR…NUMCVT�CONVERT�TO�BINARY ‰TST.LƒD1!‰BPL.SƒVOPT01�BRANCH�IF�NEW�ENTRY‰CMP.Bƒ#CR,D1�WAS�A�CR�INPUT‰BEQ.SƒVOPTEX�EXIT'‰BSR…INVALE�PRINT�INVALID�ERROR�MESSAGE‰BRA…VOPT02�TRY�AGAIN3VOPT01ƒMOVE.L‚D3,ENTADR-PBA(A4)‚SAVE�ENTERED�VALUE.:‰SUB.LƒLDADR-PBA(A4),D3ŒACTUAL�LOAD�ADDRESS-ENTERED�ADDRES/‰MOVE.L‚D3,BIAS-PBA(A4)„SAVE�ADDRESS�BIAS�VALUE*5*‚ENTERING�NEW�LOAD�AND�EXECUTION�ADDRESSES�INTO�FILE*‰MOVE.L‚FILESA-PBA(A4),A0)‰MOVE.L‚STKWD(A0),D0‡ORIGINAL�STACK�VALUE&‰ADD.LƒBIAS-PB7 A(A4),D0ŒSTACK�PLUS�BIAS(‰MOVE.L‚D0,STKWD(A0)‡PLACE�BACK�IN�TABLE/‰MOVE.L‚EXCWD(A0),D0‡ORIGINAL�EXECUTION�ADDRESS%‰ADD.LƒBIAS-PBA(A4),D0ŒEXEC�ADDR+BIAS(‰MOVE.L‚D0,EXCWD(A0)‡PLACE�BACK�IN�TABLE=‰MOVE.L‚ENTRPT(A0),D0†ENTRY�POINT�IN�LOADER�INFORMATION�BLOCK0‰ADD.LƒBIAS-PBA(A4),D0ŒOLD�ENTRY�POINT�PLUS�BIAS$‰MOVE.L‚D0,ENTRPT(A0)†REPLACE�IN�LIB.‰MOVE.L‚ENTADR-PBA(A4),D0ŠENTERED�LOAD�ADDRESS,‰LSR.Lƒ#8,D0ŽADDRESS�SPECIFIED�AS�MODULO�2560‰MOVE.W‚D0,LDWD(A0)ˆPLACE�IN�LOAD�ADDRESS�OF�LIBù â<ëJóQûO8 @\`#J+3?; CJKJS-VOPTEXƒCLR.BƒOPTFLG-PBA(A4)…CLEAR�OPTION�FLAG6‰MOVEM.L�(A7)+,A0/A2/D0/D3‚RESTORE�STACK�AND�REGISTERS2VERSGO1‚MOVE.L�FILESA-PBA(A4),D0„GET�START�OF�FILE+‰ADD.L�FILELI-PBA(A4),D0†ADD�LENGTH�OF�FILE‰SUB.L�#1,D0‰ADJ�END-‰MOVE.L�D0,FILEEO-PBA(A4)„MOVE�TO�OUTPUT�PARM*’WRITE�OUTPUT‰IOSCALL�FILEOOS(PC) ‰BEQ‚VERSR ‰BRA�IOERPRT*'*’DO�DIR�CALL�TO�GET�NEW�START�&�LENGTH VERSE„EQU�*‰BSR�CLOOUTŠCLOSE�OUTPUT"‰BSR.S�ASGOUTŠASSIGN�OUTPUT�TO�VOL"‰BSR�RVIDŠGET�VID�BACK�INTO�BUFFER‰BSRƒDIRGETŠGET�START�&�LENGTH‰MOVE.L�D0,VIDIO+VIDOSS(A3)‰MOVE.W�D1,VIDIO+VIDOSL(A3)'‰MOVE.L‚ENTADR-PBA(A4),VIDIO+VIDOSA(A3) ‰BRA.SƒVERSEXVERSEXE#‰BSR.S‚ASGOUT‚ASSIGN�THE�NEW�VOLUMEVERSEX‰RTS*:***********************************************************ˆROUTINE�TO�SPACE�COMPRESS&*ŠA0�CONTAINS�THE�SENDING�LINE�ADDRESS(*ŠA1�CONTAINS�THE�RECEIVING�LINE�ADDRESS,*ŠD1�CONTAINS�THE�LENGTH�OF�THE�SENDING�LINE;************************************************************"SPCOMP…CMP.B�#'�',(A0)‚IS�IT�BLANK‰BEQ.S�SPCOMP3ˆYES&‰MOVE.B�(A0)+,(A1)+‚MOVE�TO�PRINT�LINE"BLDECK„SUB.W�#1,D1…IS�THIS�THE�END‰BGT�SPCOMPˆNO‰SUB.L�#1,A1…ESTABLISH�END ‰RTS�RETURN*$SPCOMP3…ADD.W�#1,A0‡INC�ADDR�OF�SEND ‰BRA�BLDECK*1**************************************************ˆROUTINE�TO�PRINT�BOOT�MSG1************************************************* VEROK„EQU�*‰LEA�OPERM(PC),A0…MESSAGE‰LEA�OPERME(PC),A1 ‰BSR�SENDMSGI!‰IOSCALL�INP3IOS(PC)…GET�RESPONSE ‰BNE�IOERPRT ‰BSR�SBARG ‰BNE�IOERPRT'‰CMP.B�#'Y',ANSWER-PBA(A4)ƒYES�RESPONSE ‰RTS‘RETURN**"*‹ROUTINE�TO�VOLUME�ASSIGN�OUTFILEASGOUTƒLEA�OUTFHS+FHSCLG(PC),A0‰MOVE.L�#'„',D0$‰MOVE.L�D0,(A0)+„BLANK�CATALOG�FIELD‰MOVE.L�D0,(A0)+ ‰MOVE.L�D0,(A0)+„BLANK�FILE�NAME‰MOVE.L�D0,(A0)+‰MOVE.W�D0,(A0)„BLANK�EXT‰MOVE.W�#FHASGN,OUTFHS-PBA(A4) ‰MOVE�#20,D7ASGOUT1‰FHSCALL�OUTFHS(PC)‰BEQ.S�ASGOUT2>‰CMP.B�#FSTAVOL,D0ƒASSIGNMENT�ERROR�ON�VOLUME�LEGAL�FOR�AWHILE.‰BNE‚IOERPRTˆDISPLAY�ERROR�IF�NOT�VOLUME�ERROR?*�8/12/83�SCB.�vvvvŠChanges�made�so�INIT�works�from�chain�file.(‰MOVE.L�A0,-(A7)…Save�A0�thru�delay�call$‰MOVE.L�#250,A0†Delay�time�=�250�ms.‰MOVE.L�#DELAY,D0‰TRAPƒ#1‹Do�the�delay‰MOVE.L�(A7)+,A0…Restore�A0* 8/12/83 SCB. ^^^^&‰DBRA�D7,ASGOUT1…LOOP�TRYING�TO�ASSIGN,‰BRA‚IOERPRTˆMUST�BE�A�REAL�ASSIGNMENT�ERRORASGOUT2 ‰RTS‡RETURN0*************************************************’ROUTINE�TO�CALL�DIRECTORY*’AND�GET�FILE�START�&�LENGTH*’START�IN�D0�&�LENGTH�IN�D1* DIRGETƒEQU�*‰STORE�DIRBLK(PC),OUTDIR&‰LEA�INFHS+FHSCLG(PC),A0‹GET�FILE�NAME‰LEA�OUTFHS+FHSCLG(PC),A1'‰MOVE.L�(A0)+,(A1)+ŒMOVE�CATALOGE�FIELD‰MOVE.L�(A0)+,(A1)+"‰MOVE.L�(A0)+,(A1)+ŒMOVE�FILE�NAME‰MOVE.L�(A0)+,(A1)+‰MOVE.W�(A0),(A1)�EXTENSION‰MOVE.W�#FHFDEN,OUTFHS-PBA(A4)‰FHSCALL�OUTFHS(PC) ‰BNE�IOERPRT‰LEA�DIRBLK(PC),A0‰MOVE.L�FDFS(A0),D0‹FILE�START ‰ADD.L�#1,D0‰MOVE.L�FDFE(A0),D1‹LENGTH ‰RTS›RETURN*‰PAGE0**************************************************ˆBUILD�DUMP�AREA�PROCESSING*0*************************************************DUMPAREA EQU **‰TST.B�ZEROFLAG-PBA(A4)…DISK�0‰BEQ‡DUMPEX„NO*‰LEA�DUMPM(PC),A0‰LEA�DUMPME(PC),A1 ‰BSR�SENDMSGI‰IOSCALL�INP3IOS(PC) ‰BNE�IOERPRT ‰BSR�SBARG ‰BNE�IOERPRT8 ‰CMP.B�#'Y',ANSWER-PBA(A4)‰BNE�DUMPEX”EXIT‰BSR�WVIDŒWRITE�OUT�PARTIAL�VID#DUMP1„LEA�LOCKN(PC),A0ˆGET�SIZE�MSG‰LEA�LOCKNE(PC),A1 ‰BSR�SENDMSGI ‰BSR�NUMCVT ‰TST.L�D1‰BPL.S�DUMP2‹GOODDUMPERƒBSR�INVALE ‰BRA�DUMP1 DUMP2„TST.L�D3ŒZERO�VALUE‰BEQ�DUMPERŠYES‰BSR�CLOOUTŠCLOSE�VOL�ASGN‰LEA�OUTFHS(PC),A0'‰MOVE.L�D3,FHSSIZ(A0)ŠSIZE�OF�DUMP�AREA ‰MOVE.L�D3,D7’SAVE�LENGTH�OF�VID%‰MOVE.W�#FHALLO+FHASGN,OUTFHS-PBA(A4)7‰MOVE.B�#FOPCON,OUTFHS+2-PBA(A4)�SET�CONTIG�FILE�OPTION‰LEA�OUTFHS+FHSVOL(PC),A0‰MOVE.L�VIDIO(A3),(A0)+…VOLUME‰CLR.W‚(A0)+ˆUSER�#‰BSR.S�IDUMPFILˆLOAD�PARM�BLOCK=‰MOVE.B�#$FF,OUTFHS+FHSWCD-PBA(A4)�WRITE�PROTECT�ON�DUMP�FILE*‰FHSCALL�OUTFHS(PC) ‰BNE�IOERPRT2‰CLR.B�OUTFHS+FHSWCD-PBA(A4)ƒCLEAR�PROT�FROM�TABLE*‰BSR�CLOOUTŠCLOSE�FILE‰BSR�ASGOUTŠASSIGN�VOL‰BSR�RVIDŒREREAD�VID‰STORE�DIRBLK(PC),OUTDIR/‰MOVE.W�#FHFDEN,OUTFHS-PBA(A4)�DIR�CALL�COMMAND%‰LEA�OUTFHS+FHSCLG(PC),A0ŠINIT�AT�CAT‰BSR.S�IDUMPFIL#‰FHSCALL�OUTFHS(PC)‚ALLOC�FILE�DUMP ‰BNE�IOERPRT‰LEA�DIRBLK(PC),A03‰MOVE.L�FDFS(A0),VIDIO+VIDDAS(A3)‚DUMP�START�TO�VID.‰MOVE.W�D3,VIDIO+VIDDAL(A3)„DUMP�LENGTH�TO�VID* DUMPEX‚RTS*.************************************************ˆROUTINE�TO�SET�PARM�BLOCK�WITH�DUMP�FILE.**********************************************IDUMPFIL EQU *‰MOVE.L�#'„',D0‰MOVE.L�D0,(A0)+…CATALOGUE‰MOVE.L�D0,(A0)+‰MOVE.L�#'DUMP',(A0)+ƒFILE�NAME‰MOVE.L�D0,(A0)+‰MOVE.W�#'SY',(A0)+ŒEXTENSION ‰CLR.L�(A0)ˆRTS‰PAGE/*************************************************ˆCALCULATE�CHECKSUM�PROCESSING*0*************************************************CHECKSUMƒEQU�**‰LEA�VIDIO(A3),A0ˆLOAD�START‰LEA�VIDIOE(A3),A1ŒEND‰CLR.W�VIDCHK(A0)„ZERO�CHECKSUM‰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ˆFIN�ALL�BYTES?‰BLS.S‚CHECK1‡NO#‰LEA‚VIDIO(A3),A0‡YES�SAVE�CHECKSUM‰MOVE.B‚D0,VIDCHK(A0)‰SWAP‚D0‰MOVE.B‚D0,VIDCHK+1(A0)*‰RTS‰PAGE.************************************************ˆGET�CURRENT�CONFIGURATION*GETCONF-‰IOSCALLƒCONFIOS(PC)ƒGET�CONFIGURATION�STATUS ‰BNE‡IOERPRT2‰LEA‡DCPBLK(PC),A0�POINT�TO�THE�CONFIGURATION�INFO4‰CMP.B…#IODIPC,IOSDRC(A0)‚ARE�WE�TALKING�TO�AN�IPC�?$‰BNE.S…GETCONF1‚BRANCH�IF�NOT�AN�IPC;‰CLR.B…IPCFLAG-PBA(A4)ƒINDICATE�WE�ARE�WORKING�WITH�AND�IPC‰BRA.S…GETCONF2ŠAND�EXITGETCONF17‰OR.B†#$FF,IPCFLAG-PBA(A4)‚INDICATE�NON-IPC�TYPE�DRIVER?‰BTSTW…#IOAALT,IOSATW(A0)�CONTROLLER�HAVE�CAPABILITY�?�<>GETCONF2 ‰RTS‡EXIT‰PAGEJ***************************************************************************H*‚SETPARM�-�SET�UP�PARAMETER�BLOCK�AND�SECTOR�INFORMATION�FOR�GET�MEMORY*ŒSEGMENT�AND�FORMAT*5*‹ENT:ƒA0�--�ADDRESS�OF�CONFIGURATION�PARAMETER�BLOCK3*‹EXITƒD1�--�LENGTH�OF�BUFFER�NEEDED�FOR�FULL�TRACK-*˜READ�+�SPACE�FOR�LOCKIO,�VID,�CONFIG�SECTOR*SETPARM5‰TST.B…IPCFLAG-PBA(A4)…WORKING�WITH�IPC�TYPE�DRIVER�?‰BNE.S…SETPAR4�BRANCH�IF�NOT7‰CMP.B…#XDSFDK,IOSDTP(A0)‚IPC�TYPE�--�CHECK�IF�A�FLOPPY‰BNE.S…SETPAR3�IPC--HARD�DISK9‰MOVE.L„IOSRSZ(A0),D0‡GET�TOTAL�NUMBER�OF�SECTORS�ON�THIS*ªFLOPPY:‰LEA‡FLPYTABL(PC),A0�FIND�THE�CONFIGURATION�PARAMTER�BLOCK,*ŸFOR�THIS�FLOPPY�BASED�ON�NUMBER�OF�SECTORS**ˆA�TABLE�ENTRY�IS�DEFINED:#*’DC.L†XXXX†TOTAL�NUMBER�OF�SECTORS8*’DC.L†XXXXXXXX‚OFFSET�FROM�THE�BEGINNING�ADDRESS�OF�THE *ªPROGRAM�TO�THE�PARAMETER�BLOCK*”.*”.*’DC.L†0‰END�OF�TABLESETPAR1!‰CMP.L…(A0)+,D0‚IS�THIS�THE�ENTRY8‰BEQ.S…SETPAR2ƒBRANCH�IF�WE�FOUND�THE�CONFIGURATION�INFO0‰ADD.L…#4,A0…GO�PAST�THE�PARAMETER�BLOCK�ADDRESS‰TST.L…(A0)†END�OF�TABLE‰BNE.S…SETPAR1ƒGO�TO�NEXT�ENTRY8‰LEA‡NOFLOP(PC),A0�REPORT�NO�FLOPPY�DEFINED�IN�IPC�TABLE‰LEA‡NOFLOPE(PC),A1�*‰BSR‡SENDMSG„*'‰BRA‡TERM0200‚TERMINATE�THIS�INITIALIZESETPAR2=‰MOVE.L„(A0),A0ƒPOINT�TO�FLOPPY�CONFIGURATION�PARAMETER�BLOCK6‰ADD.L…A4,A0…ADJUST�THE�AD8 DRESS�OF�THE�PARAMETER�BLOCK‰BRA.S…SETPAR4SETPAR3?‰MOVE.L„#SECLEN,D2�IPC�WITH�A�HARD�DISK�SET�SECTOR�LENGTH�=�2569‰MOVE.L„#HDSECTRK,D1ˆCURRENTLY�THERE�ARE�64�SECTORS/TRACK‰BRA.S…SETPAR5SETPAR4‰CLR.L…D1ˆINIT�REGISTERS ‰CLR.L…D2ˆ*<‰MOVE.B„IOSSPT(A0),D1‡GET�PHYSICAL�SECTOR�LENGTH�FROM�STATUS *ªINFORMATION6‰MOVE.W„IOSPSM(A0),D2‡GET�SECTOR�PER�TRACK�INFORMATIONSETPAR5/‰MULU†D2,D1…CALCULATE�NUMBER�OF�BYTES�PER�TRACK#‰MOVE.L„D1,D2…NEED�THE�NUMBER�AGAIN5‰DIVU†#SECLEN,D2�GET�NUMBER�OF�VERSADOS�SECTORS/TRACK0‰MOVE.L„D2,VDOSSEC-PBA(A4)‚SAVE�IT�FOR�THE�WORLD<‰ADD.L…#3*SECLEN,D1�ADD�THREE�SECTORS�WORTH�TO�BE�USED�LATER*B*ˆREGISTER�D1�SHOULD�NOW�CONTAIN�THE�LENGTH�OF�THE�BUFFER�REQUIRED?*ˆOUT�OF�MEMORY�TO�ACCOMODATE�A�FULL�TRACK�READ�PLUS�ADDITIONAL+*ˆSPACE�FOR�LOCKIO,VID,AND�CONFIGURE�SECTOR*8‰MOVE.L„A0,CNFBKADR-PBA(A4)�SAVE�PARAMETER�BLOCK�POINTER 4‰MOVE.L�D1,BUFPARS-PBA(A4)‚SET�MEMORY�SEGMENT�LENGTH *º<>‰PAGE8*********************************************************’MAKE�CALL�FOR�BUFFER�AREA8********************************************************>GETMEMƒERQ.GTSEG�BUFPAR(PC)‚CALL�TO�GET�I/O�BUFFER�FROM�SYSTEM‰BNE�IOERPRT‰BRIF�ERROR‰MOVE.L�A0,BUFADR-PBA(A4) ‰MOVE.L�A0,A3#‰ADD.L‚D1,A0ˆPOINT�TO�END�OF�BUFFER‰SUB.L‚#1,A0ˆ**ƒINIT�PARM�BLOCKS‰STORE�LOCKIO(A3),LOCKIOS1‰STORE�LOCKIOE(A3),LOCKIOS2‰STORE�VIDIO(A3),WDSKVID1‰STORE�VIDIOE(A3),WDSKVID2‰STORE�VIDIO(A3),RDSKVID1‰STORE�VIDIOE(A3),RDSKVID2‰STORE�VALBUF(A3),RDSKS‰STORE�CONFSEC(A3),WDSKCF1‰STORE�CONFSECE(A3),WDSKCF2/‰MOVE.L�A0,RDSKE-PBA(A4)†SET�BUFFER�END�ADDRESSO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> *º1/17/84'‰MOVE.L„RDSKS-PBA(A4),ISSEVALUE-PBA(A4))‰MOVE.L„RDSKE-PBA(A4),ISSEVALUE-PBA+4(A4)'*¦SAVE�THE�INITIAL�SAT�START/END�VALUES *º1/17/84O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<‰STORE�VALBUF(A3),FILESA *Ä10/24/83"‰MOVE.L„A0,FILESB-PBA(A4)¡10/24/83 *Ä10/24/83‰STORE�VALBUF(A3),FILEOOS1 *Ä10/24/83"‰MOVE.L„A0,FILEEO-PBA(A4)¡10/24/83*!‰STORE�HARDBUF(A3),INP8IOS+IOSSAD$‰STORE�HARDBUF+49(A3),INP8IOS+IOSEAD ‰RTSŒ.�RETURN‰PAGE/*********************************************** *ˆPRINT�ERROR�MSG�&�CK�FOR�RETRY/************************************************ PRTIO„EQU�*‰MOVE.L�#LDFLUN,D1 ‰BSR�PRTERM ‰BRA�STOPIT**(****************************************"*ˆERROR�ROUTINE�FOR�SAT�PROCESSING(*****************************************-SATERRƒMOVE.L�#LDFLUN,D1ƒLUN�FOR�ERR�MSG�CALL‰BSR�PRTERMŠDISPLAY�ERROR ‰BRA�STOPIT‰PAGE** CLOSERR‚EQU�*'‰MOVE.L�#LDFLUN,D1ƒLUN�FOR�ERR�MSG�CALL‰BSR�PRTERMŠPRINT�MSG ‰BRA.S�STOPE**,*********************************************ˆPRT�SAT�EXCEEDED�ERROR,********************************************* DSKERRƒEQU�*‰LEA�SATERM(PC),A0‰LEA�SATERME(PC),A1 ‰BSRƒSENDMSG ‰MOVE�#-1,D0‰RTS** ER_NVDEV:;‰MOVE.L�#EM_NVDEV,D0‹PRINT�OUT�'INVALID�DEVICE�FOR�REQUEST'3‰MOVE.L�#LDFLUN,D1�MESSAGE�TO�LIST�LOGICAL�UNIT�AND‰BSR„PRTERM‘TERMINATE. ‰BRA.S‚STOPE**ER_NVO:5‰MOVE.L�#EM_NVO,D0�PRINT�OUT�'INVALID�OPTION'�MESSAGE0‰MOVE.L�#LDFLUN,D1�TO�LIST�DEVICE�AND�TERMINATE. ‰BSR„PRTERM ‰BRA.S‚STOPE** INVALEƒEQU�*)‰MOVE.L�#EM_NVE,D0ƒSET�INVALID�ERROR�CODE.‰MOVE.L�#LDFLUN,D1ƒSET�LUN�FOR�ERR9 �MSG�HANDLER ‰BSR.S�PRTERM‰RTS**INVALERR EQU * ‰BSR�INVALE ‰BRA.S�STOPE** IOERPRT‚EQU�*.‰MOVE.L�#LDFLUN,D1ƒSET�LUN�FOR�ERR�MSG�HANDLER‰BSR.S�PRTERMˆDISPLAY�ERROR ‰BRA.S�STOPE*2*ˆALL�UTILITIES�WILL�TERMINATE�BY�CALLINGƒERQ.TERM:*ˆHOWEVER�-�AN�INDICATION�AS�TO�WHETHER�THERE�WAS�AN�ERROR5*ˆWHICH�MIGHT�CAUSE�CHAIN�PROCESSING�TO�ABORT�MUST�BE9*ˆSPECIFIED�AT�THE�TIME�OF�THE�TERMINATION.�THE�FOLLOWING8*ˆWILL�DEFINE�THE�TYPE�OF�TERMINATION�THAT�ARE�CURRENTLY *ˆPOSSIBLE:*8*’NORMAL�TERMINATION‚-�IMPLIES�THAT�UTILITY�SUCCESSFULLY *¨COMPLETED**œEITHER„ERQ.TERM*œORˆERQ.TERM�#0,#0**:*’ERROR�TERMINATIONƒ-�IMPLIES�THAT�UTILITY�TERMINATED�WITH *¨AN�ERROR**¦ERQ.TERM�#0,#$C000*<*’WARNING�TERMINATION�-�IMPLIES�THAT�UTILITY�TERMINATED�WITH*¨A�WARNING�(ie.�ASSEMBLY)**¦ERQ.TERM�#0,#$1000** TERM_FLG:‰DC.W†0‰TERMINATION�FLAG *œBIT‡MEANING*ž0‡0�-->�NORMAL‚TERMINATION*¦1�-->�ERRORƒTERMINATION**ž1‡1�-->�WARNING�TERMINATION**STOPE:‰LEA‡TERM_FLG(PC),A0*œA0=ADDR�OF�TERMINATION�FLAG ‰BTST†#1,(A0)‰BNE.S…TERM0100*œJMP�IF�WARNING�TERMINATION ‰BTST†#0,(A0)‰BNE.S…TERM0200*œJMP�IF�ERROR�TERMINATION ‰ERQ.TERM*œEXIT�NORMAL�TERMINATION TERM0100:‰ERQ.TERM�#0,#$1000*œEXIT�WARNING�TERMINATION TERM0200:‰ERQ.TERM�#0,#$C000  SENDMSGI EQU *"‰MOVE.L�A0,OUT6IIOS+IOSSAD-PBA(A4)"‰MOVE.L�A1,OUT6IIOS+IOSEAD-PBA(A4)‰IOSCALL�OUT6IIOS(PC) ‰BNE�IOERPRT ‰RTS�.�RETURN* SENDMSG‚EQU�*‰MOVE.L�A0,OUT6SAD-PBA(A4)‰MOVE.L�A1,OUT6EAD-PBA(A4)A‰MOVE.L�#IOWRIT<<16!IOPFOR,OUT6IOS-PBA(A4)�Force�correct�function‰IOSCALL�OUT6IOS(PC) ‰BNE�IOERPRT‰RTS*.************************************************…ERROR�MSG�HANDLER�CALL*.*************************************************’ERROR�MESSAGE�CALLING�ROUTINE**ˆCALL†BSR‡PRTERM**ˆINPUT!*’D0�=�AS�RETURNED�FROM�TRAP�CALL,*’D1�=�USER�LOGICAL�UNIT�NUMBER�TO�OUTPUT�TO!*’A0�=�AS�RETURNED�FROM�TRAP�CALL**ˆOUTPUT*’NO�REGISTER�PRESERVATION* EM_XCEPT:‰DC.W†$0000…TABLE�TERMINATOR*PRTERM:‰MOVEM.LƒD0/A0,EM_PBLK-PBA(A4)+*œSAVE�D0�AND�A0�IN�ERROR�MSG�PARAMETER�BLK‰AND.L…#$00FF,D0*œISOLATE�ERROR�STATUS�RETURN‰LEA‡EM_XCEPT(PC),A00*œA0=ADDR�OF�TBL�CONTAINING�ERROR�MSG�CODES�THAT-*ŸWILL�NOT�BE�CONSIDERED�AS�ERROR�TERMINATION *ŸCONDITIONS CEMP0100: ‰TST.W…(A0)‰BEQ.S…CEMP0200 *œJMP�IF�TABLE�HAS�BEEN�EXAMINED‰CMP.W…(A0)+,D0‰BEQ.S…CEMP0300'*œJMP�IF�ERROR�CODE�RETURN�IS�ONE�WHICH/*œWILL�RESULT�IN�BEING�AN�EXCEPTION�-�THIS�CASE**œWILL�NOT�BE�CONSIDERED�FOR�AN�ERROR�TYPE *œTERMINATION‰BRA.S…CEMP0100 *œREPEAT�LOOP CEMP0200:‰LEA‡TERM_FLG(PC),A0‰BSET†#BN00,(A0),*œSET�FLAG�TO�TERMINATE�WITH�ERROR�CONDITION CEMP0300:‰LEA‡EM_PBLK(PC),A0&*œA0=ADDR�USER�ERROR�MSG�PARAMETER�BLK‰MOVE.B„D1,EM_TLUN-EM_PBLK(A0)*œSET�THE�USER�LUN�TO�OUTPUT�TO ‰MOVE.L„#2,D0*œERROR�MSG�PRGM�INPUT�RQMNT‰TRAP†#4$*œISSUE�REQUEST�TO�ERROR�MSG�HANDLER‰RTS‰PAGE.***********************************************&*ˆROUTINE�TO�PRINT�TOTAL�NUMBER�OF�SLT *ˆENTRIES."*ŠEXIT:�D3�=�NUMBER�ENTRIES�IN�SLT*.***********************************************PRTSECT‚CLR.L�D0ª<>éééééé*+PRTSLT2‚LEA�LOCKHD2(PC),A0†HEADER�2�TO�USER‰LEA�LOCKHD2E(PC),A1 ‰BSR�SENDMSG‰BNE�IOERPRT‰ERROR&‰TST.B�PRINTER-PBA(A4)‰USING�PRINTER�?‰BEQ.S�PRTSLT3‡NO‰STORE�LOCKHD2(PC),OUT3SAD‰STORE�LOCKHD2E(PC),OUT3EAD(‰IOSCALL�OUT3IOS(PC)�HEADER�2�TO�PRINTER‰BEQ.S�PRTSLT3‡ALL�OK‚<<0225859‰BSET.B�#1,PRMSGFLG-PBA(A4)‚TEST/SET�FLAG�MSG�TO�TERMINAL&‰BNE.S�PRTSLT3‡MSG�ALREADY�BEEN�OUTPUT‰LEA�LOCKPR2(PC),A0‰LEA�LOCKPR2E(PC),A13‰BSR�SENDMSG‰TELL�USER�PRINTER�UNAVAILABLE‚022585>>*%PRTSLT3‚TST.L�D3ŒANY�ENTRIES�IN�SLT�?!‰BEQ�PRTSLT6‰NO,�TELL�USER�'NONE'‰LEA�TOTSLT(PC),A2%‰MOVE.L�#0,D2ˆINITIALIZE�ENTRY�NUMBERPRTSLT4‚ADD.L�#1,D2‰MOVE.L�(A2)+,D0…SLT�PSN!‰MOVE.L�#6,D1ˆLENGTH�OF�REC�FIELD)‰LEA�LCKBAD(PC),A0‡ADDRESS�OF�REC�FIELD�A‰BTST�#0,D2ŠENTRY�NUMBER�EVEN�?‰BEQ.S�PRTSLT4A†YES)‰LEA�LCKAAD(PC),A0‡ADDRESS�OF�REC�FIELD�BPRTSLT4A�BSR�BINDECFJˆCONVERT4‰MOVE.L�#5,D1ˆLENGTH�OF�REC�FIELD�FOR�HEX�ADD�0104858‰LEA�LCKBADX(PC),A0†ADDRESS�OF�REC�FIELD�A�FOR�HEX�VALUE‰BTST�#0,D2ŠENTRY�NUMBER�EVEN�?‰BEQ.S�PRTSLT4X†YES8‰LEA�LCKAADX(PC),A0†ADDRESS�OF�REC�FIELD�B�FOR�HEX�VALUEPRTSLT4X�BSR�BINHEXŠCONVERT* ‰CLR.L�D0‰MOVE.W�(A2)+,D0…SLT�LENGTH!‰MOVE.L�#4,D1ˆLENGTH�OF�REC�FIELD*‰LEA�LCKBLEN(PC),A0†ADDRESS�OF�REC�FIELD�A: ‰BTST�#0,D2ŠENTRY�NUMBER�EVEN�?‰BEQ.S�PRTSLT4BˆYES*‰LEA�LCKALEN(PC),A0†ADDRESS�OF�REC�FIELD�BPRTSLT4B�BSR�BINDECFJˆCONVERT*‰SUB.L�#1,D3‰DECREMENT�COUNTER‰BNE.S�PRTSLT4CˆNOT�DONE'‰BTST�#0,D2ŠFINISHED�ON�AN�EVEN�ENTRY�?#‰BEQ.S�PRTSLT4D†YES,�PRINT�AND�QUIT‰MOVE.L�#'„',D09‰MOVE.L�D0,LCKBAD-PBA(A4)�CLEAR�B�ENTRY�FOR�14�CHARACTERS‰MOVE.L�D0,LCKBAD+4-PBA(A4)‰MOVE.L�D0,LCKBAD+8-PBA(A4)‰MOVE.W�D0,LCKBAD+12-PBA(A4))‰MOVE.L�D0,LCKBLEN-PBA(A4)�CLEAR�B�LENGTH‰BRA.S�PRTSLT4D‚GO�PRINT*,PRTSLT4C�BTST�#0,D2ŠJUST�DID�AN�EVEN�ENTRY�?‰BNE�PRTSLT4‰NO,�DO�NEXT-PRTSLT4D�LEA�LOCKENT(PC),A0†SLT�ENTRY�TO�USER‰LEA�LOCKENTE(PC),A1 ‰BSR�SENDMSG‰BNE�IOERPRT‰ERROR&‰TST.B�PRINTER-PBA(A4)‰USING�PRINTER�?‰BEQ.S�PRTSLT5‡NO‰LEA�LOCKENT(PC),A0‰MOVE.L�A0,OUT3SAD-PBA(A4)‰LEA�LOCKENTE(PC),A0‰MOVE.L�A0,OUT3EAD-PBA(A4))‰IOSCALL�OUT3IOS(PC)�SLT�ENTRY�TO�PRINTER‰BEQ.S�PRTSLT5‡ALL�OK‚<<0225859‰BSET.B�#1,PRMSGFLG-PBA(A4)‚TEST/SET�FLAG�MSG�TO�TERMINAL&‰BNE.S�PRTSLT5‡MSG�ALREADY�BEEN�OUTPUT‰LEA�LOCKPR2(PC),A0‰LEA�LOCKPR2E(PC),A13‰BSR�SENDMSG‰TELL�USER�PRINTER�UNAVAILABLE‚022585>>éééééé*PRTSLT5‚TST.L�D3ŒALL�DONE�?‰BNE�PRTSLT4‰NO,�NEXT�ENTRYPRTSLTX‚RTS‘RETURN*/PRTSLT6‚LEA�LOCKHD3(PC),A0†TELL�USER�NO�ENTRIES‰LEA�LOCKHD3E(PC),A1 ‰BSR�SENDMSG‰BNE�IOERPRT‰ERROR&‰TST.B�PRINTER-PBA(A4)‰USING�PRINTER�?‰BEQ.S�PRTSLTX‡NO,�EXIT‰STORE�LOCKHD3(PC),OUT3SAD‰STORE�LOCKHD3E(PC),OUT3EAD*‰IOSCALL�OUT3IOS(PC)�NO�ENTRIES�TO�PRINTER‰BEQ.S�PRTSLTX‡ALL�OK‚<<0225859‰BSET.B�#1,PRMSGFLG-PBA(A4)‚TEST/SET�FLAG�MSG�TO�TERMINAL&‰BNE.S�PRTSLTX‡MSG�ALREADY�BEEN�OUTPUT‰LEA�LOCKPR2(PC),A0‰LEA�LOCKPR2E(PC),A13‰BSR�SENDMSG‰TELL�USER�PRINTER�UNAVAILABLE‚022585>>‰BRA�PRTSLTX‰EXITšALTTRK>>‰PAGE.***********************************************%*ˆCONVERT�BINARY�TO�HEX�ASCII�ROUTINE*(*ˆRIGHT�JUSTIFY�&�BLANK�FILL�ON�THE�LEFT,*ˆTHE�LEAST�SIGNIFICANT�DIGIT�IS�NOT�BLANKED* *ˆD0�=�HEX�VALUE�TO�BE�CONVERTED *ˆD1�=�LENGTH�OF�RECEIVING�FIELD7*ˆA0�=�ADDRESS�OF�LEFT�MOST�POSITION�OF�RECEIVING�FIELD* *ˆREGISTERS�USED‚0�1�2�3�4�5�6�7 *’A…*�*�* *’D…*�*ƒ*.***********************************************(BINASCƒDC.B�'0123456789ABCDEF'…HEX�TABLE* BINHEXƒEQU�*)‰MOVEM.L�D0-D3/A0-A2,-(A7)‚SAVE�REGISTERS‰LEA�BINASC(PC),A1ƒINIT�ADDR‰LEA�0(A0,D1),A2‚END�LOCATION*BINLOPƒMOVE.B�D0,D3„GET�BYTE%‰ASR.L�#4,D0†SHIFT�OFF: �LAST�HEX�VALUE!‰AND.L�#$F,D3„MASK�OFF�OTHER�BITS2‰MOVE.B�0(A1,D3),-(A2)‚MOVE�FROM�TABLE�TO�REC�AREA‰CMP.L�A2,A0…ARE�WE�DONE‰BLT�BINLOP†NO*‰CMP.W�#1,D1…ONLY�ONE�CHAR‰BEQ.S�BINOUT„YES**„DO�ZERO�SUPPRESSION*‰LEA�0(A0,D1),A2‚INIT�END�LOC‰SUB.L�#1,A2…FIX�END�LOC!BINSP„CMP.B�#'0',(A0)‚ASCII�ZERO?‰BNE.S�BINOUT†NO�GET�OUT%‰MOVE.B�#'�',(A0)+‚REPLACE�WITH�BLANK‰CMP.L�A0,A2…ARE�WE�DONE ‰BGT�BINSP‡NO*2BINOUTƒMOVEM.L�(A7)+,D0-D3/A0-A2‚RESTORE�REGISTERS ‰RTS�.�RETURN‰PAGE-*********************************************+*‚32�BIT�BINARY�TO�DECIMAL�ASCII�SUBROUTINE-**********************************************,*‚CONVERTS�BINARY�IN�D0�AND�PUTS�ASCII�DIGIT(*…CHARACTERS�AT�ADDRESS�SPECIFIED�IN�A0.(*…LEADING�ZEROS�ARE�CONVERTED�TO�SPACES.+*…THE�FIELD�LENGTH�(NO.�CHARS)�IS�SPECIFIED *…IN�D1�IN�THE�CALLING�SEQUENCE.**‚CALLING�SEQUENCE:!*…MOVE.L�,�D0*…MOVE.L�,D11*…MOVE.L�,A0*…BSR�BINDECFJ* *‚RETURNS:*…Z�BIT�SET�=>�GOOD�CONVERSION**‚REGS�USED:‚0�1�2�3�4�5�6�7 *ŠDƒ*�*�**ŠAƒ*�**7TENS DC.L 10000000,1000000,100000,10000,1000,100,10,1,0*BINDECFJ EQU *)�MOVEM.L�D0-D2/A0-A1,-(A7)‚SAVE�REGISTERS MOVE.L #8,D2 MAX NO. DIGITS SUB.L D1,D2 NO. DIGITS TO SKIP! BMI.S BINDECF5 BRANCH ERROR EXIT LSL.L #2,D2 DOUBLE WORD LENGTH�LEA‚TENS(PC),A1�START�OF�TABLE" ADD.L D2,A1 ADJUST FOR DIFFERENCE&�MOVE.W�#'‚',D2�INITIALIZE�ACCUMULATOR%BINDECF1 SUB.L (A1),D0 SUBTRACT 10**N BCS.S BINDECF2 BRANCH TOO BIG* ADD.W #1,D2 INCREMENT CURRENT DIGIT COUNT BRA BINDECF1 CONTINUE)BINDECF2 ADD.L (A1)+,D0 RESTORE, ADV PNTR TST.L (A1) TEST DONE BEQ.S BINDECF4 BRANCH DONE �CMP.W�#'‚',D2�LEADING�ZERO�TEST! BEQ.S BINDECF3 BRANCH STILL ZERO# ADD.B #$10,D2 BRING TO ASCII DIGIT%BINDECF3 MOVE.B D2,(A0)+ DEPOSIT CHAR LSL #8,D2 SAVE CHAR DEPOSITED# MOVE.B #$20,D2 RESTORE LS TO SPACE BRA BINDECF1 CONTINUE4BINDECF4 ADD.B #$10,D2 LAST ONE BECOMES DIGIT ALWAYS" MOVE.B D2,(A0)+ DEPOSIT LAST CHAR' TST.L D0 SET CONDITION CODE, 0 IF GOOD4BINDECF5�MOVEM.L�(A7)+,D0-D2/A0-A1‚RESTORE�REGISTERS RTS‰PAGE**&*‚RANDOM‚-�GENERATE�NEXT�RANDOM�NUMBER*#*‚ENTER:‚D1.L=�MAXIMUM�NUMBER�VALUE* *‚EXIT:ƒD0.L=�NEXT�RANDOM�NUMBER*ŠD1.L=�MAXIMUM�NUMBER�VALUE* RANDOMƒEQU�*:‰MOVEM.L�D1/D2,-(A7)ˆSAVE�MAXIMUM�NUMBER�VALUE�AND�USER�D2$‰CLR.LƒD0‘HSKP�WORKING�DATA�REGISTER.‰MOVE.B‚SEED+3-PBA(A4),D0ŠSTARTING�SEED�NUMBER‰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‘IS�D1�GREATER�THAN�16�BITS? ‰TST.WƒD1‰BNE.SƒRAND32�YEP ‰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ˆRESTORE�MAN�NUMBER�VALUE‰RTS˜RETURN�TO�CALLER RAND32ƒEQU…*‰SWAP„D1‰MOVE.L‚SEED-PBA(A4),D0 RAND4„EQU…*2‰SUB.LƒD1,D0ŽMAXIMUM�NUMBER�FROM�NEW�RANDON�NUMBER‰BCC.SƒRAND4ŽSTILL�TOO�MUCH"‰ADD.LƒD1,D0ŽRESTORE�TO�LAST�VALUE(‰MOVEM.L�(A7)+,D1/D2ˆRESTORE�INPUT�VALUE#‰RTS˜RETURN�TO�USER�WITH�NEW�NUMBER*‰PAGE‰INCLUDE�&.DSKCFGDT.AI‰INCLUDE�&.DSKCFGCD.AI „END�STARPROGéé; ééé=/* =/*†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 ƒ=ARG�IPL.LS=/ENDIF=/*"=ASM IPL.SA,IPL.RO,TEMP1.LS;RZ=176=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Y=/*=ASM IPL2.SA,IPL2.RO,TEMP1.LS=/*{ Included files are:=/*ƒ--�none�--=/*}=/*ƒ=COPY�TEMP1.LS,TEMP2.LS;Aƒ=COPY�TEMP2.LS,\1;Yƒ=DEL�TEMP1.LS;Yƒ=DEL�TEMP2.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 ƒ=ARG�IPL.LL=/ENDIF=/*-=/* Note that section 1 must be linked at the-=/*ƒhighest�address�in�the�IPL.SY�load�module=/*=LINK ,IPL.SY,\1;HAMIXSSEG SEG0:0,14,1 $0000 INPUT IPL.RO INPUT IPL2.ROLIB 0.&.UTILIB.ROEND=/*=ENDéé; ééééd+IPL‡IDNTƒ4,6�Initial�Program�Load�Procedure#ŠTTL„Initial�Program�Load�ProcedureB‰EQU„*’SEGMENT�BASE*ŠXREFƒPARSE,OPTION,EDITFILE,BHLCVT,ENDLINK ŠSECTION�0ŠOPT„MEXM******************************************************************************$*ˆ680xx�INITIAL�PROGRAM�LOADER�(IPL)* *ŒVERSION�4.4*0*’COPYRIGHTED�1980,�1981,�1982,�1983,�1984,�1985**šBY�MOTOROLA,�INC.***š*************¢**F*…IPL�IS�AN�INITIAL�PROGRAM�LOAD�MODULE,�USED�TO�LOAD�IN�A�680XX-BASEDB*…OPERATING�SYSTEM.‚IPL�ITSELF�IS�BROUGHT�INTO�MEMORY�FROM�DISK�BYD*…THE�BOOT�COMMAND�OF�THE�RESIDENT�FIRMWARE�DEBUGGER�(e.g.,�MACSbug,0*…VERSAbug,�VMCbug,�VMEbug,�TENbug�and�020bug�).**…TYPICAL�BOOT�COMMAND:*‡BO�0,1,VERSATST;HL=$E00**‡0�=�DEVICE�NUMBER*‡1�=�CONTROLLER�NUMBERD*‡VERSATST�=�FILE�NAME�-�FULLY�QUALIFIED�FILE�NAME�EXCEPT�FOR�VOLUME:*’FIELD.‚IF�VOLUME�IS�SPECIFIED�IT�IS�AN�ERROR.�SINCE�FILE8*’IS�ALWAYS�BOOTED�FROM�SPECIFIED�CONTROLLER�AND�DEVICE.<*’USER�NUMBER�DEFAULTS�TO�0,�CATALOG�DEFAULTS�TO�BLANK,�FILE:*’NAME�DEFAULTS�TO�'VERSADOS',�EXTENSION�DEFAULTS�TO�'SY'.***š*************** ***„ENTRY‚SR�=�$2700*‹PC�=�FROM�LOCATION�4*‹A0�=�CHANNEL�ADDRESS4*‹A2�=�POINTER�TO�CONFIGURATION�DATA�WITHIN�DEBUGGERC*‹A3�=�DEBUGGERS'�INTERNAL�DISK�READ�ROUTINE�ADDRESS�(NON�TRAP�#15)*‹A4�=�DEBUGGER�ENTRY�POINT,*‹A5�=�BEGINNING�OF�COMMAND�LINE�-�FILE�NAME*•(FOLLOWING�BO�0,0,)*‹A6�=�END�OF�COMMAND�LINE%*‹D0�=�DEVICE�NUMBER�(LOW�ORDER�BYTE))*‹D1�=�CONTROLLER�NUMBER�(LOW�ORDER�BYTE)(*‹D2�=�CONFIGURATION�CODE�(BYTE�5�VALUE)>*‹D3�=�FLAG�FOR�IPL�FROM�DEBUGGER:‚CODE�'ME4U'�TELLS�IPL�IT�IS6*�OK�TO�USE�THE�DEBUGGERS'�INTERNAL�DISK�READ�ROUTINE.<*‹D4�=�FLAG(s)�for�IPL�if�we�have�new�bug�interface�(AUG�84)&*“D4�=�'IPLx'�where�x�=�bits�7654�3210 *“Bits‰Status$*”0‹Firmware�supports�TRAP�#15�calls&*”1‹Firmware�is�to�do�disk�I/O�for�IPL*¢(Old�'ME4U'�in�D3)+*”2‹Firmware�supports�an�alternate�TRAP�#15 * protocol'*”3‹Firmware�supports�TRAP�#15�disk�I/O*”4-7‰Reserved�PAGEfm;v<~(†Ž#–$ž&¦;®F¶L¾MÆ9ÎÖ?Þ>æ7î*ö5þ?;D<5&0./65>6FDNbV9*…EXIT:„SR�=�$2700*6*ŽCONTROL�IS�PASSED�TO�THE�PROGRAM�THAT�WAS�BOOTED�IN.*=*ŽLOAD�ADDRESS,�START�ADDRESS�AND�STACK�ADDRESS�COMPUTED�FROM*ŽTHE�FOLLOWING�ALGORITHM:**ŽIF�NO�'L'�OPTION�SPECIFIED*ŽTHEN8*”LOAD�ADDRESS�=�ADDRESS�SPECIFIED�IN�LOADER�INFORMATION3*—BLOCK.�(LOCATION�$38�OF�SECTOR�0�OF�LOAD�MODULE).*4*”START�ADDRESS�=�ADDRESS�SPECIFIED�IN�LOCATION�4�OF*—SECTOR�1�OF�THE�LOAD�MODULE.*4*”STACK�ADDRESS�=�ADDRESS�SPECIFIED�IN�LOCATION�0�OF*—SECTOR�1�OF�THE�LOAD�MODULE.< *�ELSE5*”LOAD�ADDRESS�=�ADDRESS�SPECIFIED�ON�THE�'L'�OPTION.*4*”START�ADDRESS�=�ADDRESS�SPECIFIED�IN�LOCATION�4�OF%*—SECTOR�1�OF�THE�LOAD�MODULE�+�BIAS.*4*”STACK�ADDRESS�=�ADDRESS�SPECIFIED�IN�LOCATION�0�OF%*—SECTOR�1�OF�THE�LOAD�MODULE�+�BIAS.**9*�BIAS�=�ADDRESS�SPECIFIED�ON�'L'�OPTION�MINUS�THE�LOADER**˜INFORMATION�BLOCK�ADDRESS�LOAD�ADDRESS�-,*˜(LOCATION�$38�OF�SECTOR�0�OF�LOAD�MODULE).*ŠPAGEM*****************************************************************************7* THE FOLLOWING INFORMATION IS USEFUL WHEN PATCHING VID*ƒOFFSET‰LENGTH‹DESCRIPTION*2*†$14Ž4‹IPL�DISK�ADDRESS�(SECTOR�1�OF�LOAD�MODULE)&*¥NOTE�THAT�SECTOR�0�OF�LOAD�MODULE�IS)*¥THE�LOADER�INFORMATION�BLOCK�AND�IS�NOT&*¥BOOTED�IN�WITH�THE�REST�OF�THE�FILE.**†$18Ž2‹IPL�LENGTH�IN�SECTORS.*,*†$1AŽ4‹IPL�EXECUTION�ADDRESS.‚ACTUALLY�THIS$*¥FIELD�IS�NEVER�USED.‚THE�EXECUTION#*¥ADDRESS�IS�ACTUALLY�OBTAINED�FROM#*¥THE�4-BYTE�FILED�AT�LOCATION�4�OF*¥SECTOR�1�OF�THE�LOAD�MODULE.*/*†$1EŽ4‹IPL�LOAD�ADDRESS�-�IGNORED�IF�A�MACSbug"*¥SYSTEM.‚ON�A�MACSbug�SYSTEM,�IPL#*¥IS�ALWAYS�LOADED�INTO�LOCATION�0.*E* IF A NEW IPL FILE IS PLACED ON THE DISK WITHOUT USING INIT, THE VIDE*ƒMUST�BE�PATCHED�TO�POINT�TO�THE�CORRECT�BOOT�ADDRESS.‚THE�FOLLOWING*ƒSTEPS�ACCOMPLISH�THIS.*A*ƒ1.‚PERFORM�A�DIR�ON�THE�IPL�FILE�USING�THE�'A'�OPTION�TO�OBTAIN*‰START,�END,�AND�SIZE.<*ƒ2.‚ADD�1�TO�START�&�PLACE�AS�4-BYTE�FIELD�INTO�VID�AT�$14.B*ƒ3.‚SUBTRACT�1�FROM�SIZE�&�PLACE�AS�2-BYTE�FIELD�INTO�VID�AT�$18.C*ƒ4.‚STUFF�DESIRED�LONG-WORD�LOAD�ADDRESS�AS�4-BYTE�FIELD�INTO�$1E.*J*ƒNOTE�THAT�THE�LOAD�ADDRESS�(LOCATION�$1E�OF�VID)�IS�NOT�USED�BY�MACSbug.B*…MACSbug�WILL�ALWAYS�BOOT�IPL�INTO�LOCATION�0.‚VERSAbug,�HOWEVER,A*…DOES�USE�THE�LOAD�ADDRESS�AS�IT�APPEARS�IN�LOCATION�$1E�OF�VID.*?* THE ABOVE STEPS WILL INSURE THAT IPL FILE IS CORRECTLY BOOTED<*ƒIN.‚TO�INSURE�THAT�THE�INITIAL�EXECUTION�ADDRESS�IN�IPL�IS'*ƒCORRECT,�PERFORM�THE�FOLLOWING�STEPS.*A*ƒ1.‚USING�DUMP,�EXAMINE�THE�CONTENTS�OF�LOCATION�$16�(LONG�WORD)<*‰OF�SECTOR�0�(LOADER�INFORMATION�BLOCK)�OF�IPL.‚THIS�IS�THE:*‰EXECUTION�ADDRESS�OF�IPL.‚FROM�THIS�NUMBER,�SUBTRACT�THE;*‰NUMBER�FOUND�AT�LOCATION�$38�(LONG�WORD)�OF�SECTOR�0.‚THE<*‰NUMBER�YOU�ARE�SUBTRACTING�IS�THE�LOAD�ADDRESS�OF�IPL.‚THE?*‰DIFFERENCE�OBTAINED�IS�THE�ZERO�RELATIVE�EXECUTION�ADDRESS�OF;*‰IPL.‚(THE�EXECUTION�ADDRESS�OF�IPL�IF�IT�WERE�LOADED�INTO9*‰MEMORY�LOCATION�0).‚THIS�NUMBER�WILL�BE�USED�IN�STEP�2.C*ƒ2.‚TO�THE�VALUE�OBTAINED�IN�STEP�1,‚ADD�THE�DESIRED�BOOT�LOCATION;*‰FOR�IPL.‚FOR�EXAMPLE,‚IF�IT�IS�DESIRED�TO�HAVE�IPL�LOADEDA*‰IN�AT�ADDRESS�$2000,�ADD�$2000�TO�THE�VALUE�OBTAINED�IN�STEP�1.@*ƒ3.‚THE�VALUE�OBTAINED�IN�STEP�2�SHOULD�BE�PLACED�INTO�LOCATION7*‰4�OF�IPL�AS�A�LONG�WORD.‚THIS�IS�THE�ADDRESS�THAT�THE>*‰FIRMWARE�DEBUGGER�WILL�JUMP�TO�WHEN�IPL�IS�INITIALLY�LOADED. ‰PAGEB*�IF�INIT�WAS�USED�TO�PLACE�IPL�ONTO�A�DISK,‚IT�WILL�AUTOMATICALLY:*ƒPERFORM�THE�ABOVE�STEPS�TO�LOCATE�IPL�AT�ADDRESS�$0.‚THE@*ƒONLY�TIME�THE�ABOVE�MANUAL�PROCEDURE�IS�REQUIRED,�IS�TO�CHANGE<*ƒTHE�LOAD�ADDRESS�OF�IPL�FROM�$0�TO�SOME�OTHER�VALUE.‚NOTE:>*ƒBE�SURE�NOT�TO�ALTER�LOCATION�8�OF�IPL�SINCE�THIS�VALUE�MUST)*ƒBE�USED�IF�IPL�IS�EVER�RELOCATED�AGAIN.*D*�NOTE:‚A�LATER�VERSION�OF�INIT�WILL�AUTOMATICALLY�PERFORM�THE�ABOVEB*ƒPROCEDURE�IF�USED�WITH�THE�;V�OPTION.‚SEE�DOCUMENTATION�FOR�INIT$*ƒUTILITY�IN�VERSADOS�DOCUMENTATION.*ŠPAGE M******************************************************************************'*’M�O�D�I�F�I�C�A�T�I�O�NƒH�I�S�T�O�R�Y*M*****************************************************************************.*‚Changes�to�IPL,�February�1985‚(IDNT�4,6)‚sml*I*�1.�If�'IPL'�is�found�in�D4�bits�2�and�3�will�be�examined�also.‚In�otherI*„words,�if�bits�0-3�are�used,�'IPL'�must�exist�in�the�other�bytes�of�D4.*M*****************************************************************************.*‚Changes�to< �IPL,�February�1985‚(IDNT�4,5)‚sml*I* 1. Changed the comparison to a word instead of a long word to determine)*„if�program�is�booting�from�an�EXORmacs.*H* 2. If booting from an EXORmacs, via the panel, MACSbug (at the currentI*„time�(V2.3))�does�not�set�up�D4�correctly.‚Therefore,�after�determining2*„that�we're�using�an�EXORmacs�D4�will�be�cleared.*ééééM*****************************************************************************-*‚Changes�to�IPL,�Janruary�1985‚(IDNT�4,4)‚rj*C* 1. Modified to handle an alternate TRAP #15 communication method.G*„The�codes�used�in�making�the�TRAP�#15�calls�are�different.�The�changeE*„was�made�primarily�to�accomodate�the�debugger�in�the�Benchmark�020.*M******************************************************************************‚Changes�to�IPL,�December�1984*H* 1. Modified to force position independent code. There were 8 occasionsE*„of�MOVE�x(PC)�which�were�not�changed.‚2�are�macros�which�are�calledK*„at�times�when�the�base�register�has�changed.‚2�are�in�a�routine�currentlyE*„not�used.‚4�are�in�the�error�handling-message�routines�which�use�A5A*„to�hold�the�message.�These�places�are�all�marked�by�'12/20/84'.*M******************************************************************************‚Changes�to�IPL,�August�1984*G* 1. Modified to conform to new interface with firmware debuggers whichB*†tell�if�bug�supports�TRAP�#15�I/O�and�disk�I/O.‚IPL�will�displayF*†user�friendly�messages�if�the�bug�indicates�that�they�are�supported.*N* 2. Modified to put out error messages if the bugs disk I/O routine indicatedF*†an�error�during�the�disk�access.‚The�messages�will�be�displayed�only)*†if�TRAP�#15�I/O�is�supported�of�course.M*****************************************************************************7*‚ADDITIONAL�CHANGES�TO�IPL�NOVEMBER�1983�(IDNT�4,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*‚ADDITIONAL�CHANGES�TO�IPL�SEPTEMBER�1983�(IDNT�4,3)ƒrj*M* 1. Changed IPL to now check only 'are we on a MACsbug type system?' insteadI*†of�also�checking�for�pannel�lights�on�the�system.�The�assumption�now�isD*†that�if�it's�a�MACsbug�system�then�pannel�lights�are�available�andG*†also�TRAP�#15�support.�All�other�type�systems�are�assumed�to�not�have$*†pannel�lights�or�TRAP�#15�support.*‡PAGEM*****************************************************************************1*‚ADDITIONAL�CHANGES�TO�IPL�APRIL�1983�(IDNT�4,2)*J* 1. Changed IPL to allo= w loading files from the RWIN1 and MVME420-SA1403DF*†disk�controller�boards�while�maintaining�compatibility�with�existingF*†bugs�who�load�files�from�the�IPC.‚The�boot�command�within�VMEbug�andA*†TENbug�were�modified�to�supply�additional�information�to�IPL�to@*†allow�IPL�to�use�the�bugs'�internal�disk�read�routine.‚IPL�wasB*†modified�to�(1)�save�this�information,�(2)�to�test�a�flag�set�byC*†the�bug�(code�to�tell�IPL�that�the�controller�board�is�not�an�IPCC*†type�and�IPL�should�use�the�bugs'�disk�read�routine),�and�(3)�setB*†up�defined�registers�before�calling�the�bugs'�disk�read�routine.*M*****************************************************************************$*‚CHANGES�TO�ORIGINAL�IPL�MARCH�1982*>*�1.�Changed�command�line�syntax�by�adding�new�'L'�option.‚New=*†syntax�is�compatable�with�standard�VERSAdos�utilities.‚Used:*†standard�parse�and�editfile�routines.�The�new�'L'�option=*†will�automatically�bias�the�start�address�and�stack�pointerC*†value�when�loading�a�file�at�a�location�other�than�that�specified&*†in�the�LIB.‚See�above�documentation.*B* 2. Included test to determine if we are on a MACSbug type system6*†that�supports�TRAP�#15�terminal�I/O.‚If�we�are,�then;*†user�friendly�messages�are�put�up�at�the�terminal.‚Other-;*†wise,�no�such�messages�are�displayed.‚In�case�of�any�type=*†of�abnormal�error,�a�message�is�displayed�if�possible.‚When@*†IPL�errors�it�always�ends�up�at�a�point�that�branches�to�self.?*†If�the�system�does�not�support�TRAP�#15�I/O,�the�message�willH*†not�be�displayed�but�the�type�of�error�can�be�determined�by�performing>*†software�abort�and�displaying�the�stack.‚The�first�long�wordC*†on�the�stack�(directly�pointed�at�by�A7)�will�contain�the�addressC*†of�a�user�friendly�message�that�would�have�appeared�if�the�systemF*†supported�TRAP�#15�I/O.‚The�next�long�word�on�the�stack�will�contain>*†in�the�low�order�byte,�the�panel�light�value�that�would�have3*†appeared�on�an�EXORmacs�system�with�panel�lights.*@* 3. Added macros and subroutines that support bus error and bus;*†error�recovery.‚These�are�useful�since�a�bus�error�occurs9*†when�trying�to�access�panel�light�registers�on�a�system2*†that�does�not�have�panel�lights�(e.g.,�VMC68/2).*C* 4. Enhanced so that the user number, catalog and extension can be;*†specified�as�part�of�the�boot�file�name.‚Previously,�only7*†the�file�name�could�be�specified�-�the�file�had�to�be9*†under�user�number�0,�have�a�blank�catalog,�and�the�only"*†extension�searched�for�was�'SY'.*ŠPAGE*E* 5. Fixed so that IPL will perform tests before it tries to relocate8*†itself.‚IPL�will�not�attempt�to�relocate�itself�if�the<*†file�it�is�booting�in�will�not�overlap�any�of�its�code.‚If=*†IPL�must�relocate,�it�tests�the�memory�where�the�relocation5*†would�normally�take�place.‚The�test�is�performed�by?*†reading�and�writing�long�words�of�memory�throughout�the�space?*†required�to�relocate�IPL.‚If�memory�is�unavailable�(signalled:*†by�a�bus�error)�IPL�will�attempt�to�relocate�itself�to�a;*†higher�location�in�memory.‚Succesive�tests�are�made�until=*†IPL�either�finds�a�contiguous�area�of�RAM�to�relocate�to�or8*†until�the�test�proceeds�past�the�memory�address�set�in=*†location�HIGHMEM�(relative�location�0�in�IPL).‚If�no�memory=*†can�be�found�to�relocate�IPL�it�will�hang�with�error�status *†indicated�in�the�panel�lights.*@* 6. Fixed so that any unexpected exception vector taken will be@*†trapped�in�IPL.‚The�exception�vector�number�will�be�determined+*†and�displayed�in�a�user�friendly�message.*,* 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.‚This�is�because�you�can't�boot�on�a�newly�powered�up�systemE*†if�memory�has�not�been�initialized.‚A�read�in�this�case�will�always*†result�in�a�bus�error.*** DEBUGGING INFORMATION:*7*„WHEN�DEBUGGING�IPL�IT�IS�POSSIBLE�TO�DISABLE�SOFTWARE8*†AB= ORT�IF�THE�FILE�YOU�ARE�BOOTING�IN�CHANGES�THE�VALUE8*†OF�THE�VECTOR�THAT�IS�TIED�TO�THE�SOFTWARE�ABORT.‚ON�A7*†MACSBUG�3.1�SYSTEM,�THIS�VECTOR�IS�AT�ADDRESS�$24�AND6*†HAS�A�VALUE�OF�$FE8808�(TRACE�VECTOR).‚ON�A�VERSAbug7*†SYSTEM,�THE�VECTOR�IS�AT�LOCATION�$7C�(USER�INTERRUPT4*†LEVEL�7�VECTOR).‚IF�YOU�ARE�DEBUGGING�AND�SOFTWARE5*†ABORT�DOES�NOT�RESPOND,�YOU�PROBABLY�WIPPED�OUT�THE$*†VECTOR�TIED�TO�THE�SOFTWARE�ABORT.* ŠPAGEM*******************************************************************************‡SYSTEM�EQUATES*M******************************************************************************1FAILGT„EQU„$FE0002ŒMACSbug�WATCHDOG�TIMER�ADDRESS.TTOR†EQU„$FE0004ŒMACSbug�TEST�TIMEOUT�REGISTER$IPCVECTA‚EQU„$3FC�IPC�VECTOR�ADDRESS*K* MVALUE AND MADDR ARE USED TO DETERMINE IF WE ARE ON A MACSbug TYPE SYSTEMG*ƒIF�THE�VALUE�AT�MADDR�=�MVALUE�THEN�IT�IS�ASSUMED�WE�ARE�ON�A�MACSbugD*ƒSYSTEM.‚IF�WE�ARE�ON�A�MACSbug�SYSTEM�THEN�WE�WILL�PUT�ISSUE�ERROR *ƒMESSAGES�TO�THE�PANNEL�LIGHTS.*MVALUE„EQU„$4AFBMADDR…EQU„$FE9800** FHS PARAMETER BLOCK EQUATES FHSUSN„EQU„$A FHSCLG„EQU„$CFHSFIL„EQU„$14FHSEXT„EQU„$1CM*******************************************************************************‡DISK�STRUCTURE�EQUATES*M******************************************************************************"VIDSDS„EQU„$C‘SECONDARY�DIR.�START*"SDBUSN„EQU„0’SEC.�DIR.�USER�NUMBERSDBCLG„EQU„2’SEC.�DIR.�CATALOG-SDBPDP„EQU„$A‘PSN�OF�FIRST�PRIMARY�DIR.�BLOCK(SDBLEN„EQU„$10�LENGTH�OF�SEC.�DIR.�ENTRY$SDBBEG„EQU„$10�OFFSET�TO�FIRST�ENTRY*DIRFIL„EQU„0’FILENAMEDIREXT„EQU„8’FILE�EXTENSIONDIRFS…EQU„$C‘PSN�OF�FILE�STARTDIRFE…EQU„$10�FILE�SIZEDIRATT„EQU„$1E�FILE�ATTRIBUTES(DIRLEN„EQU„$32�LENGTH�OF�PRI.�DIR.�ENTRY$DIRBEG„EQU„$10�OFFSET�TO�FIRST�ENTRY*%DATCON„EQU„0’CONTIGUOUS�ATTRIBUTE�BITDFTBIT„EQU„7’ATTRIBUTE�MASK*"SDBLK…EQU„256�SEC.�DIR.�BLOCK�SIZE#PDBLK…EQU„1024�PRI.�DIR.�BLOCK�SIZE*2SEG0ADDR‚EQU„$38�OFFSET�INTO�LIB�OF�SEG�START�ADDRŠPAGEM*******************************************************************************ˆCHANNEL�EQUATES*M******************************************************************************,IPCINT„EQU„$0D�68000�TO�IPC�INTERRUPT�OFFSET'IPCIMB1ƒEQU„$101�68000�TO�IPC�WRITE�BOX)IPCIMA1ƒEQU„$103�68000�TO�IPC�ACK/NAK�BOX#IPCIM1„EQU„$105�68000�COMMAND�WRITE'IPCIMB2ƒEQU„$181�IPC�TO�68000�WRITE�BOX%IPCIAB2ƒEQU„$183�IPC�TO�68000�ACK�BOX!IPCIM2„EQU„$185�IPC�COMMAND�WRITE M****************************************************************************** *‰ALTERNATE�TRAP�#15�I/O�EQUATES*M******************************************************************************6.OUTSTRƒEQU„$21�Output�string‚(pointer/pointer�format)3.OUTLN„EQU„$22�Output�line„(pointer/pointer�format)".RETURNƒEQU„$63�Return�to�debugger4.DSKRD„EQU„$10�Read�block(s)�from�device�into�memory ŠPAGE%**************************************†<<�MACROS�>>**** 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)�PUSH�RETURN�ADDRESS�FOR�BUS�ERROR!ŠBSR.L‚SETBUSER‹SET�FOR�BUS�ERRORŠENDM*=* MACRO USED TO CLEAN UP AFTER SET UP FOR POSSIBLE BUS ERROR.7*ƒIT�MUST�BE�USED�WHETHER�THE�BUS�ERROR�OCCURRED�OR�NOTBUSEROUT‚MACROŠMOVE.W�SR,-(A7)@ŠMOVE.L�OLDBSERR(PC),-(A7)�CANT'T�CHANGE:�BASE�A1�OR�A5…12/20/84/ŠMOVE.L�(A7)+,$8‹RESTORE�ORIGINAL�ABORT�ADDRESSŠMOVE.W�(A7)+,SRŠENDM*<* MACRO TO PUT OUT MESSAGE FOLLOWED BY LIGHTING PANEL LIGHTS*ƒCALLING�SEQUENCE:*ƒMSGL‚MSGS,MSGE,CODE'*†WHERE�MSGS�=�ERROR�NUMBER�IN‚GE�START*ŒMSGE�=�ADDRESS�OF�MESSAGE�END=*ŒCODE�=�PANEL�LIGHT�CODE�TO�BE�PLACED�BACK�INTO�PANEL�LIGHTS*•AFTER�MESSAGE�IS�OUTPUT* MSGL†MACROŠMOVEM.L�A5-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:*ƒERRTBL�NUM,CODE> *…WHERE�NUM‚=�ERROR�NUMBER*‹CODE�=�ERROR�CODE* 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*ƒINSTRUCTIONS�TO�MOVE�DATA�TO�A�LOCATION�IF�PROGRAM!*ƒBASE�REGISTER�IS�NOT�AVAILABLE.* CALLING SEQUENCE EXAMPLE:**‰MOVEPI.W�A0,D3,TAG*K*�WHERE�A0‚=�SCRATCH�REGISTER�(PRESERVED�AFTER�MOVE)�-�MUST�BE�'A'�REGISTER*‡D3‚=�DATA�TO�MOVE*‡TAG�=�WHERE�TO�MOVE�DATA* MOVEPI„MACRO7ŠMOVE.L�\1,-(A7)‹SAVE�SCRATCH�REGISTER�ON�STACK�FOR�NOW8ŠLEA„SCRSAV(PC),\1†ADDRESS�OF�WHERE�TO�SAVE�SCRATCH�REG.+ŠMOVE.L�(A7)+,(\1)‰SAVE�SCR�REG�&�FIX�STACK0ŠLEA„\3(PC),\1ŠGET�ADDRESS�OF�WHERE�TO�MOVE�DATAŠMOVE.\0�\2,(\1)‹MOVE�DATAAŠMOVE.L�SCRSAV(PC),\1†RESTORE�SCRATCH�REGISTER�(NO�CHNG�12/20/84)ŠENDM** MACRO TO REPEAT AN ENTRY*ƒCALLING�SEQUENCE:*…RPT�NUM,,*‡WHERE�NUM�IS�THE�NUMBER�OF�TIMES�TO�REPEAT"*�PATTERN�IS�THE�PATTERN�TO�REPEAT* RPT‡MACRO T1ˆSET„\1ŠIFNEƒT1\2 T2ˆSET„T1-1 ŠRPT„T2,<\2>ŠENDCŠENDMŠPAGE** DEBUGGER REQUIRED VALUES=*ƒWHEN�FIRMWARE�DEBUGGER�LOADS�IPL,�IT�SETS�THE�STACK�POINTERJ*…TO�THE�VALUE�FOUND�IN�LOCATION�0�OF�THE�LOAD�MODULE�PORTION�OF�THE�FILE.D*…IT�TRANSFERS�CONTROL�TO�THE�ADDRESS�SPECIFIED�IN�LOCATION�4�OF�THE*…LOAD�MODULE�FILE.*D*ƒSINCE�IPL�SETS�ITS�OWN�STACK�POINTER�UPON�EXECUTION,�LOCATION�0�OFC*…THE�LOAD�MODULE�FILE�IS�NOT�REQUIRED�TO�HAVE�ANY�SPECIAL�VALUE�IN>*…IT.‚WE�ARE�THEREFOR�FREE�TO�PLACE�THE�HIGHMEM�VALUE�(HIGHEST=*…RAM�LOCATION�TO�SEARCH�FOR�IPL�RELOCATION)�INTO�LOCATION�0.*8*ƒLOCATION�4�MUST�CONTAIN�THE�INITIAL�EXECUTION�ADDRESS.*E*ƒLOCATION�8�CONTAINS�AN�ASCII�STRING�IDENTIFYING�THE�VERSION�OF�IPL.*…8�CHARACTERS�LONG.*@*ƒSPACE�IS�RESERVED�FOR�ALL�OF�THE�REMAINING�VECTORS.‚THIS�SPACE9*…IS�REQUIRED�IF�IPL�IS�LOADED�INTO�LOCATION�0�OF�MEMORY.*6HIGHMEMƒDC.Lƒ$40000�RESET:�INITIAL�SSP,�SINCE�IPL�SETS&*£...�ITS�OWN�STACK,�THIS�ENTRY�IS�NOT&*£...�REQUIRED�SO�WE�CAN�PLACE�HIGHMEM*£...�VALUE�HERE.ŠDC.LƒENTRYŽRESTART<ŠDC.Lƒ'022685�4'‰VERSION�COVERS�BUS�ERROR�&�ADDR�ERROR�VECTS#ŠDC.Lƒ$00FE9E6EŠILLEGAL�INSTRUCTION* * VECTORS* ŠDCB.L‚4,0"ŠDC.Lƒ$FE8808ŒMACSbug�TRACE�VECTOR ŠDCB.L‚22,0* TRAP VECTORS BEGIN HERE ŠDCB.L‚15,0'ŠDC.Lƒ$00FE9F7CŠMACSbug�TRAP�#15�VECTOR(ŠDS.Bƒ$400-(*-B)‰ALLOW�SPACE�FOR�VECTORSŠPAGEM*******************************************************************************ˆRAM�DEFINITIONS*M********************************************************************************‡DISK�I/O�BUFFER*IOBUF…DS.Bƒ$400�4�SECTOR�BUFFER*4* FMS PARAMETER BLOCK USED BY EDITFILE FOR FILE NAME*ƒDEFAULT�VALUES�ARE�SHOWN INPFHS„EQU„*ŠDS.Bƒ10‘COMMAND�->�VOLUMEŠDC.Wƒ0’USER�NUMBERŠDC.Bƒ'ˆ'‰CATALOGŠDC.Bƒ'VERSADOS'‰FILE�NAMEŠDC.Bƒ'SY'�EXTENSION%ŠDS.Bƒ10‘REMAINDER�OF�PARAMETER�BLOCK** COMMAND LINE$CLINE…COMLINE�82�COMMAND�LINE�BUFFER*CLENGTHƒEQU„*-CLINEŒLENGTH�OF�COMMAND�LINE+HMEM†DS.Lƒ1’SAVE�FOR�VALUE�IN�LOC�$0�OF�IPL*ŠPAGE** COMMAND PACKET IMAGE* PKOUTS„EQU„* ŠDC.Bƒ$02�STX ŠDC.Bƒ$55�ID IPCPKSZƒEQU„*-PKOUTS‹PACKET�SIZEŠDC.BƒPKOUTE-PKOUTS(IPCDEVNƒEQU„*-PKOUTS‹DEVICE�NUMBER�(VAR)ŠDC.Bƒ0ŠDC.Bƒ$10�READ‚COMMAND#ŠDC.Bƒ$01�DEVICE�COMMAND�(WITH�CRC)IPCBLKNM‚EQU„*-PKOUTSŠDC.Wƒ$01�#BLKS�TO�XFR�(VAR)*ŠDC.Wƒ$100�BLOCK�SIZE�(VAR)IPCMEMAD‚EQU„*-PKOUTSŠDC.Lƒ0’STARTING�MEM�ADDR�(VAR)*ŠDS.Wƒ1’CHECKSUMIPCSECNM‚EQU„*-PKOUTSŠDC.Lƒ0’STARTING�SEC�NUM�(VAR) ŠDC.Bƒ$03�ETXPKOUTE„EQU„*’END�OF�PACKETŠDS…0 ŠPAGEM********************************************************************************‡PROGRAM�SEGMENT**M******************************************************************************* ENTRY:„EQU„**.* SET REGISTERS AND SAVE IMPORTANT INFORMATION)ŠMOVE.W�#$2700,SRŠMAKE�SURE�NO�INTERRUPTSŠLEA„STACK(PC),A7‡SET�UP�STACK ŠLEA„B(PC),A1)ŠMOVE.L�A1,SAVA5-B(A1)…SAVE�A5�BASE�VALUE ŠMOVE.L�> HIGHMEM-B(A1),HMEM-B(A1)AŠMOVE.L�A2,DSKCONF-B(A1)ƒ*SAVE�ADDRESS�OF�DISK�CONFIGURATION�DATA@ŠMOVE.L�A3,DSKOUT-B(A1)„*SAVE�ADDRESS�OF�BUGS'�DISK�READ�ROUTINE6ŠMOVE.B�D2,DSKCODE-B(A1)ƒ*SAVE�DISK�CONFIGURATION�CODE5ŠMOVE.L�D3,IPCFLAG-B(A1)ƒ*SAVE�IPC�FLAG�FROM�DEBUGGER !ŠLEA„IOBUF(PC),A2‡DISK�I/O�BUFFER%ŠLEA„PKOUTS(PC),A3†IPC�COMMAND�PACKET.ŠMOVE.L�A2,IPCMEMAD(A3)„PLUG�IN�BUFFER�ADDRESS1ŠMOVE.L�A4,MACSBUG-B(A1)ƒSAVE�MACSBUG�ENTRY�POINT+ŠMOVE.B�D0,IPCDEVN(A3)…SET�UP�DEVICE�NUMBER,ŠMOVE.L�A0,IPCADR-B(A1)„SAVE�CHANNEL�ADDRESS6ŠMOVE.L�$BC,MACST15-B(A1)‚SAVE�MACSBUG�TRAP�#15�VECTOR !ŠLEA„IOBUF(PC),A2‡Disk�I/O�buffer-ŠLEA„T15DIOPK(PC),A3„TRAP�#15�disk�I/O�packet1ŠMOVE.L�A2,T15DMADR(A3)„Insert�I/O�buffer�address+ŠMOVE.B�D0,T15DDRVN(A3)„Insert�drive�number0ŠMOVE.B�D1,T15DCTRN(A3)„Insert�controller�numberŠPAGE4**************************************************** *12/08/83I* We cannot use the TRAP #15 support on an EXORmacs system because of theD*ƒpossibility�of�being�booted�in�from�the�front�panel�(not�using�theE*ƒboot�command).‚In�this�case�the�serial�port�will�not�be�initializedA*ƒproperly�and�we�will�be�hung�out�to�dry�if�we�try�TRAP�#15�I/O.*E*�See�if�we�are�on�a�MACSbug�type�system.‚If�not�then�set�flag�for�no*ƒpanel�lights. 8ŠBSETƒ#T15IO,FLAGS-B(A1)�Set�for�no�TRAP�#15�I/O�support"ŠBUSERIN�TPLITE1‹Set�for�bus�error:ŠCMP.W‚#MVALUE,MADDR†Are�we�on�an�EXORmacs�system�?�021385ŠBNE.S‚TPLITE1ŒNo.. *Œ021385�4,5@*†MACSbug�V2.3�does�not�correctly�set�up�D4.‚If�this�gets�fixed,&*†the�next�instruction�can�be�deleted.ŠCLR.L‚D4‘Yes..‚021385 ŠBRA.S‚TPLITE ééééééé9TPLITE1ƒBSETƒ#NOLITE,FLAGS-B(A1)„Indicate�no�panel�lightsTPLITE„BUSEROUT $ŠMOVE.L�D4,D0ŽNew�I/O�interface�flag7ŠAND.L‚#$FFFFFF00,D0†Mask�to�high�order�test�for�'IPLx'D4MASK„EQU„'IPL�'&$FFFFFF00ŠIF.L�D0��#D4MASK�THEN.S7�BTST‚#0,D4ŒNew�bug�interface�-�see�if�TRAP�#15�support�IF��THEN.S8�BCLR‚#T15IO,FLAGS-B(A1)�Indicate�TRAP�#15�I/O�supported�ENDI �BTST‚#1,D4ŒUse�BUG's�disk�I/O�?�IF��THEN.S8�MOVE.L�#'ME4U',IPCFLAG-B(A1)�YES..use�disk�I/O�from�BUG�ENDI ,�BTS? T‚#2,D4ŒAlternate�TRAP�#15�I/O�support�?�IF��THEN.S�BSET�#ALT15IO,FLAGS-B(A1)�ENDI '�BTST‚#3,D4ŒTRAP�#15�disk�I/O�support�?�IF��THEN.S�BSET�#T15DSKIO,FLAGS-B(A1)8�MOVE.L�#'ME4U',IPCFLAG-B(A1)�YES..use�disk�I/O�from�BUG�ENDI ŠENDI�022685ŠPAGE*>* MOVE COMMAND LINE FROM DEBUGGER'S BUFFER TO MINE FOR PARSING7ŠLEA„CLINE(PC),A0‡FIRST�BYTE�AVAILABLE�FOR�COMMAND�LINE@ŠLEA„CLINE+CLENGTH-2(PC),A1�LAST�BYTE�AVAILABLE�FOR�COMMAND�LINECL2‡CMP.L‚A6,A5+ŠBHS.S‚CL4�BRANCH�IF�COMMAND�LINE�ALL�MOVED ŠCMP.L‚A1,A0.ŠBHI.S‚CL4�BRANCH�IF�NO�MORE�ROOM�IN�MY�BUFFER4ŠMOVE.B�(A5)+,(A0)+ˆMOVE�BYTE�FROM�DEBUGGER'S�BUFFER ŠBRA.S‚CL28CL4‡MOVE.B�#$0D,(A0)ŠMOVE�IN�CARRIAGE�RETURN�TO�MARK�END ŠMOVE.L�A0,D6*=* PARSE THE COMMAND LINE - FIRST PROCESSING THE OPTIONS FIELD&ŠLEA„CLINE(PC),A0‡COMMAND�LINE�ADDRESS#ŠSUB.L‚A0,D6ŽLENGTH�OF�COMMAND�LINE.ŠADD.L‚#1,D6ŽINCLUDE�CARRIAGE�RETURN�FOR�PARSE ŠBSR„PARSE1ŠLEA„B(PC),A5‹REBASE�A5�'CAUSE�PARSE�WIPES�IT�OUT@* ON RETURN FROM PARSE, A1=ADDR OF OUTPUT FIELD OR 0, A2=ADDR OF*ƒOPTIONS�FIELD�OR�0.+ŠTST.L‚D0‘DID�WE�HAVE�A�COMMAND�LINE�ERROR? ŠBPL.S‚OPT2 ŠBSR„ERROR1�'COMMAND�LINE�ERROR'/OPT2†MOVE.L�A2,D0ŽDID�WE�HAVE�AN�OPTIONS�FIELD?ŠBEQ.S‚OPT8�BRANCH�IF�NO(ŠCLR.W‚-(A7)ŽCLEAR�A�TEMPORARY�FLAG�AREAOPTNXT„BSR„OPTION"ŠLEA„B(PC),A5‹RELOAD�BASE�REGISTER1ŠCMP.B‚#$40,D0ŒHAVE�WE�FINISHED�WITH�THE�OPTIONS?ŠBEQ.S‚OPT7�BRANCH�IF�SOŠBTSTƒ#7,D0ŽOPTION�ERROR?ŠBEQ.S‚OPT3�BRANCH�IF�NO'OPTERR„BSR„ERROR2�'OPTIONS�FIELD�ERROR'0OPT3†MOVE.L�#HFLG,D0‹BIT�TO�SET�IF�'H'�OPTION�ONŠCMP.B‚#'H',D1$ŠBNE.S‚OPTL�BRANCH�IF�NOT�'H'�OPTION$ŠBSR.S‚OPTEST�GO�SET�'H'�OPTION�FLAG,ŠBNE.S‚OPTERR�BRANCH�IF�'H'�OPTION�SET�TWICE ŠBRA.S‚OPTNXT�GO�FOR�NEXT�OPTION0OPTL†MOVE.L�#LFLG,D0‹BIT�TO�SET�IF�'L'�OPTION�ONŠCMP.B‚#'L',D1-ŠBNE.S‚OPTERR�BRANCH�IF�NOT�'H'�OR�'L'�OPTION$ŠBSR.S‚OPTEST�GO�SET�OPTION�'L'�FLAG,ŠBNE.S‚OPTERR�BRANCH�IF�OPTION�'L'�SET�TWICEŠBTSTƒ#0,D3ŽODD�ADDRESS?#ŠBNE.S‚OPTERR�BRANCH�IF�YES�-�ERROR8ŠMOVE.L�D3,LOADADDR-B(A5)‚MOVE�IN�SPECIFIED�LOAD�ADDRESS ŠBRA.S‚OPTNXTŠPAGE*OPTEST„BSETƒD0,4(A7)1ŠBNE.S‚OPTESTXŒBRANCH�IF�OPTION�ALREADY�SPECIFIED%ŠBSETƒD0,FLAGS-B(A5)…SET�OPTIONS�FLAG ŠTST.L‚D1ŠBPL.S‚OPTESTOK0ŠBCLRƒD0,FLAGS-B(A5)…CLEAR�FLAG�IF�'-'�OPTION�ON(OPTESTOK‚CLR.L‚D0‘SET�OK�CONDITION�CODES OPTESTXƒRTSOPT7†ADD.L‚#2,A7ŽCLEAN�UP�STACK OPT8†EQU„**E* PERFORM EDIT FILE TO FILL PARAMETER BLOCK WITH FILE NAME FOR SEARCH-ŠLEA„INPFHS-B(A5),A6„FHS�PARAMETER�BLOCK�ADDR&ŠLEA„CLINE(PC),A0‡ADDRESS�OF�FILE�NAME ŠBSR„EDITFILE ŠTST.L‚D02ŠBPL.S‚EDFL2ŽBRANCH�IF�NO�ERROR�IN�FILE�NAME�PARSE&ŠBSR„ERROR3�'ERROR�IN�FILE�NAME�PARSE''EDFL2…BTSTƒ#22,D0�WAS�VOLUME�SPECIFIED?%ŠBEQ.S‚EDFL8ŽBRANCH�IF�NO�-�OK�SO�FAR)ŠBTSTƒ#14,D0�VOL�SPECIFIED�-�WAS�IT�NULL?ŠBNE.S‚EDFL8ŽBRANCH�IF�YES�-�OK!ŠBSR„ERROR4�'VOLUME�NAME�ILLEGAL' EDFL8…EQU„** *ˆREAD�VID*1READVIDƒMOVE.L�IPCADR-B(A5),A4„SET�UP�IPC�ADDRESS+ŠLEA„PKOUTS(PC),A3†SET�UP�POINTER�TO�PACKETŠBSR„DISKIO�READ�VID$ŠLEA„IOBUF(PC),A1‡SET�UP�VID�POINTER4ŠMOVE.L�VIDSDS(A1),IPCSECNM(A3)�SET�UP�SEC.�DIR.�PSN**ˆLOOK�UP�SECONDARY�DIRECTORY*&SEC000„BSR„DISKIO�READ�SEC.�DIR.�BLOCK3ŠLEA„IOBUF+SDBBEG(PC),A1�SET�UP�FIRST�ENTRY�POINTER1ŠLEA„IOBUF+SDBLK(PC),A6�END�IF�SEC�DIR�BLOCK�ADDR8SEC010„MOVE.W�INPFHS+FHSUSN-B(A5),D0�DESIRED�USER�NUMBERŠCMP.W‚SDBUSN(A1),D0†MATCH?ŠBNE.S‚SEC020�NO,�SKIP�ENTRY7ŠMOVEM.L�INPFHS+FHSCLG-B(A5),D0-D1�DESIRED�CATALOG�NAMEŠCMP.L‚SDBCLG(A1),D0-ŠBNE.S‚SEC020�BRANCH�IF�CATALOG�DOESN'T�MATCHŠCMP.L‚SDBCLG+4(A1),D1 ŠBNE.S‚SEC0204ŠMOVE.L�SDBPDP(A1),IPCSECNM(A3)�SET�UP�PRI.�DIR.�PSN ŠBRA.S‚PRI000*SEC020„ADD.L‚#SDBLEN,A1‰BUMP�TO�NEXT�ENTRY%ŠCMP.L‚A6,A1ŽEND�OF�SEC.�DIR.�BLOCK�?ŠBLT.S‚SEC010�NO?ŠMOVE.L�IOBUF-B(A5),IPCSECNM(A3)�YES,�SET�UP�PSN�FOR�NEXT�BLOCK ŠBNE.S‚SEC021ŠBSR„ERROR6�FILE�NOT�FOUND/SEC021„BRA.S‚SEC000�GO�GET�NEXT�SEC.�DIR.�BLOCK*-*ˆFOUND�SEC.�DIR.,�NOW�LOOK�UP�PRI.�DIRECTORY*:PRI000„MOVE.L�SDBPDP(A1),IPCSECNM(A3)�SET�UP�PRI.�DIR.�PSN3ŠMOVE.W�#4,IPCBLKNM(A3)„SET�UP�PRI.�DIR.�BLOCK? �SIZE&PRI010„BSR„DISKIO�READ�PRI.�DIR.�BLOCK3ŠLEA„IOBUF+DIRBEG(PC),A1�SET�UP�FIRST�ENTRY�POINTER4ŠMOVEM.L�INPFHS+FHSFIL-B(A5),D0-D1�DESIRED�FILE�NAMEŠLEA„IOBUF+PDBLK(PC),A6!PRI020„CMP.L‚DIRFIL(A1),D0†MATCH?ŠBNE.S‚PRI030�NOŠCMP.L‚DIRFIL+4(A1),D1ŠBNE.S‚PRI030�NO0ŠMOVE.W�INPFHS+FHSEXT-B(A5),D3ƒDESIRED�EXENTSIONŠCMP.W‚DIREXT(A1),D3†MATCH?ŠBEQ.S‚CHK000�YES,�FOUND�EM�!4PRI030„ADD.L‚#DIRLEN,A1‰BUMP�TO�NEXT�PRI.�DIR.�ENTRY%ŠCMP.L‚A6,A1ŽEND�OF�PRI.�DIR.�BLOCK�?ŠBLT.S‚PRI020�NO?ŠMOVE.L�IOBUF-B(A5),IPCSECNM(A3)�YES,�SET�UP�PSN�FOR�NEXT�BLOCK ŠBNE.S‚PRI010ŠBSR„ERROR6�FILE�NOT�FOUND*3*ˆFOUND�THE�PRIMARY�DIR.�ENTRY,�CHECK�THE�FILE�TYPE*0CHK000„MOVE.B�DIRATT(A1),D1†PICK�FILE�ATTRIBUTES ŠAND.B‚#DFTBIT,D1‰MASK�FILE�TYPE(ŠCMP.B‚#DATCON,D1‰CONTIGUOUS�FILE�TYPE�? ŠBEQ.S‚CHK001ŠBSR„ERROR7�INVALID�FILE�TYPE=CHK001„MOVE.L�DIRFS(A1),IPCSECNM(A3)�SET�UP�START�PSN�OF�FILE*.* READ LOADER INFORMATION BLOCK (LIB) FOR BIAS3ŠMOVE.W�DIRFE+2(A1),-(A7)‚SAVE�FILE�SIZE�TILL�LATER6ŠMOVE.W�#1,IPCBLKNM(A3)„SET�TO�READ�ONE�BLOCK�FROM�LIBŠBSR„DISKIO�READ�THE�DISK4ŠBTSTƒ#LFLG,FLAGS-B(A5)‚WAS�AN�'L'�OPTION�SPECIFIED?5ŠBNE.S‚LSPC�BRANCH�IF�YES,�ADDR�SPECIFIED�IN�LOADADDRFŠMOVE.L�IOBUF+SEG0ADDR-B(A5),LOADADDR-B(A5)�NO,USE�LIB�ADDR�AS�'L'ADDRLSPC†MOVE.L�LOADADDR-B(A5),D0+ŠSUB.L‚IOBUF+SEG0ADDR-B(A5),D0�COMPUTE�BIASŠMOVE.L�D0,BIAS-B(A5)<ŠADD.L‚#1,IPCSECNM(A3)„ADJUST�READ�ADDR�TO�SEC�1,�BEYOND�LIB9ŠMOVE.W�(A7)+,IPCBLKNM(A3)�SET�UP�FILE�SIZE�FOR�NEXT�READ*?*�SEE�IF�WE�HAVE�TO�RELOCATE�DISK�ROUTINE.‚WE�DON'T�IF�THE�FILE7*ƒWE�ARE�BOOTING�IN�DOES�NOT�OVERLAP�OUR�ADDRESS�SPACE.C*ƒIF�RELOCATION�TAKES�PLACE,�ONLY�THE�CODE�BETWEEN�LINK�AND�ENDLINK*ƒIS�ACTUALLY�RELOCATED.* REL‡CLR.L‚D07ŠMOVE.W�IPCBLKNM(A3),D0„#�OF�256�BYTE�BLOCKS�TO�READ�IN4ŠLSL.L‚#8,D0ŽZERO�RELATIVE�END�BYTE�+�1�OF�BOOT�FILE=ŠMOVE.L�LOADADDR-B(A5),D1‚D1=BOOT�FILE�BEGINNING�LOAD�ADDRESS6ŠADD.L‚D1,D0ŽD0=BOOT�FILE�ENDING�LOAD�ADDRESS�+�1�BYTE-ŠLEA„LINK(PC),A1ˆCURRENT�ADDRESS�OF�LINK�BASE)ŠMOVE.L�A1,D2ŽSET�UP�FOR�BRANCH�TO�MOVDUN:ŠLEA„ENDLINK(PC),A6…CURRENT�END�OF�IPL�SECTION�TO�RELOCATE2ŠLEA„$100(A6),A6ˆROUND�UP�TO�NEAREST�$100�BOUNDARY ŠMOVE.L�A6,D3 ŠLSR.L‚#8,D3 ŠLSL.L‚#8,D3 ŠMOVE.L�D3,A6>* CURRENTLY D0 = BOOT FILE ENDING MEMORY LOAD ADDRESS + 1 BYTE.*‹D1�=�BOOT�FILE�BEGINNING�MEMORY�LOAD�ADDRESS?*‹D2�=�MEMORY�ADDRESS�OF�LABEL�'LINK'�-�BEGINNING�OF�RELOCATION$*‹A5�=�MEMORY�ADDRESS�OF�BASE�OF�IPL?*‹A6�=�MEMORY�ADDRESS�OF�END�OF�IPL�ROUNDED�UPT�TO�NEAREST�$100C* SEE IF FILE WE ARE BOOTING WILL OVERLAP ANY OF IPL'S CODE FORCING*ƒUS�TO�RELOCATE�FIRST.*,ŠCMP.L‚A5,D1ŽBOOT�BEG.�ADDR�<�IPL�BEG.�ADDR?8ŠBLO.S‚REL007�BRANCH�IF�YES�-�FURTHER�CHECKING�NECESSARY+ŠCMP.L‚A6,D1ŽBOOT�BEG.�ADDR�<�IPL�END�ADDR?9ŠBLO.S‚FINDSLOT‹BRANCH�IF�YES�-�MUST�FIND�SLOT�&�RELOCATE*ŠBRA„MOVDUN�NO�-�SO�NO�RELOCATION�REQUIRED1REL007„CMP.L‚A5,D0ŽBOOT�END�ADDR�<�IPL�BEG.�ADDR?2ŠBLO„MOVDUN�BRANCH�IF�YES�-�NO�RELOCATION�REQUIRED*B* FINDSLOT WILL TRY TO FIND A SLOT OF RAM IN WHICH TO RELOCATE THEF*ƒREQUIRED�PORTION�OF�IPL.‚IT�BEGINS�LOOKING�AT�THE�ADDRESS�SPACE�JUSTE*ƒBEYOND�THE�END�OF�THE�FILE�THAT�WILL�SHORTLY�BE�BOOTED�IN‚OR�AT�THE@*ƒADDRESS�OF�THE�FIRST�BLOCK�BEYOND�IPL,�WHICHEVER�IS�LARGER.‚ITC*ƒTESTS�AN�ADDRESS�SPACE�OF�REQUIRED�SIZE�BY�READING�LONG�WORDS�ANDC*ƒWRITING�THEM�BACK.‚IF�A�BUS�ERROR�OCCURS,�AN�ATTEMPT�IS�INITIATEDA*ƒBEGINNING�WITH�THE�NEXT�$100�BYTE�BLOCK�BOUNDARY�PAST�WHERE�THE@*ƒBUS�ERROR�WAS�ENCOUNTERED.‚ATTEMPTS�ARE�CONTINUED�UNTIL�EITHER<*ƒA�FREE�AREA�OF�RAM�IS�FOUND�OR�UNTIL�THE�SEARCH�PROGRESSESD*ƒBEYOND�THE�ADDRESS�SPECIFIED�IN�HMEM�(VALUE�OBTAINED�FROM�RELATIVEE*ƒADDRESS�$0�OF�IPL).‚IF�NO�RAM�IS�FOUND,�A�BRANCH�TO�ERROR5�IS�MADE.*,* ON ENTRY D0 = BASE ADDRESS TO START SEARCH*FINDSLOT‚EQU„*/ŠLEA„ENDLINK(PC),A0…One�byte�beyond�end�of�IPL.1ŠADD.L‚#$FF,A0ŒRound�up�to�nearest�$100�boundary.0ŠMOVE.L�A0,D1Ž...�Force�highest�address�into�...1ŠLSR.L‚#8,D1Ž...�D0�(either�next�block�beyond�...1ŠLSL.L‚#8,D1Ž...�IPL�or�next�blo@ ck�beyond�the�...)ŠCMP.L‚D1,D0Ž...�file�we�are�booting�in). ŠBHS.S‚FI05 ŠMOVE.L�D1,D0-FI05†LEA„LINK(PC),A0ˆBASE�ADDRESS�TO�RELOCATE.ŠLEA„ENDLINK(PC),A1…ENDING�ADDRESS�TO�RELOCATE+ŠSUB.L‚A0,A1ŽA1=NUMBER�OF�BYTES�TO�RELOCATE-ŠMOVE.L�A1,D1ŽADD�TO�A1�TO�MAKE�MULTIPLE�OF�4 ŠAND.L‚#$3,D1+ŠBEQ.S‚FI10�BRANCH�IF�ALREADY�MULTIPLE�OF�4'ŠADD.L‚#2,A1ŽA1=NUMBER�OF�BYTES�TO�MOVE2FI10†MOVE.L�D0,A2ŽA2=POSSIBLE�BASE�ADDR�TO�MOVE�TO8ŠMOVE.L�HMEM-B(A5),A3†A3=TOP�OF�MEMORY�FOR�CONSIDERATION8FI20†LEA„0(A1,A2.L),A4†A4=HIGHEST�ADDRESS�TO�MOVE�TO�+�1&ŠCMP.L‚A3,A4ŽHAVE�WE�EXHAUSTED�MEMORY?ŠBLO.S‚FI70�BRANCH�IF�NOŠBSR„ERROR5�BRANCH�IF�YESH* SEE IF WE CAN FIT IN THE SLOT POINTED AT BY A2 FOR THE NUMBER OF BYTESA*ƒSPECIFIED�IN�A1.‚IF�SO�-�THEN�A2�POINTS�TO�THE�DESIRED�ADDRESS.?*ƒIF�NOT�THEN�ADVANCE�A2�TO�POINT�TO�NEXT�POSSIBLE�PLACE�AND�GO*ƒBACK�TO�FI20�TO�TRY�AGAIN.)FI70†MOVE.L�A1,D1ŽNUMBER�OF�BYTES�TO�MOVE,ŠBUSERIN�FI100�SET�UP�FOR�POSSIBLE�BUS�ERROR&*FI80†MOVE.L�0(A2,D1.L),D2†READ�MEMORYFI80†NOPŠNOP"ŠMOVE.L�D2,0(A2,D1.L)†WRITE�MEMORY ŠSUB.L‚#4,D1(ŠBHI.S‚FI80�TRY�FOR�ENTIRE�ADDRESS�SPACEŠBRA.S‚FI200ŽFOUND�SLOT8* BUS ERROR - SET A2 TO NEXT PAGE BOUNDARY AND TRY AGAIN8FI100…LEA„0(A2,D1.L),A2†ADDRESS�WHERE�BUS�ERROR�OCCURRED ŠMOVE.L�A2,D2ŠADD.L‚#$100,D2(ŠLSR.L‚#8,D2ŽROUND�TO�NEXT�PAGE�BOUNDARY ŠLSL.L‚#8,D2!ŠMOVE.L�D2,A2ŽUPDATE�BASE�POINTER&ŠCMP.L‚A3,A2ŽHAVE�WE�EXHAUSTED�MEMORY?ŠBLO.S‚FI80�BRANCH�IF�NO%ŠBSR„ERROR5�ERROR�ON�EXHAUSTED�MEMORY** WE FOUND A MEMORY SLOT FI200…EQU„* ŠBUSEROUT*2* NOW WE CAN RELOCATE THE REQUIRED PORTION OF IPL.@*ƒIF�WE�RELOCATE,�WE�WILL�ALWAYS�BE�RELOCATING�TO�HIGHER�MEMORY.C*ƒTHEREFORE�WE�MUST�MOVE�THE�HIGH�ADDRESSES�FIRST�TO�AVOID�POSSIBLY*ƒWRITING�OVER�OUR�OWN�CODE.*2ŠLEA„ENDLINK(PC),A4…A4=END�ADDRESS�+�1�TO�RELOCATE6ŠLEA„LINK(PC),A1ˆA1=ADDRESS�TO�MOVE�FROM�(LOW�ADDRESS)1ŠMOVE.L�A2,D2ŽD2=ADDRESS�TO�MOVE�TO�(LOW�ADDRESS)*1TMOV†ADD.L‚A4,A2ŽBIAS�REGISTERS�FOR�TOP�DOWN�MOVE ŠSUB.L‚A1,A2+TMOV2…MOVE.L�-(A4),-(A2)ˆMOVE�FROM�TOP�DOWN ŠCMP.L‚A1,A4 ŠBHI.S‚TMOV2*A* IPL CRITICAL CODE HAS BEEN RELOCATED - GIVE CONTROL TO NEW CODE6MOVDUN„LEA„PKOUTS(PC),A3†ADDRESS�OF�IPC�COMMAND�PACKET7ŠMOVE.L�LOADADDR-B(A5),IPCMEMAD(A3)�MEMORY�LOAD�ADDRESS4ŠMOVE.L�IPCADR-B(A5),A4„ADDRESS�OF�IPC�SHARED�MEMORY1ŠMOVE.L�MACSBUG-B(A5),A6ƒSAVE�MACSBUG�ENTRY�POINTŠLEA„LINK(PC),A1&ŠMOVE.L�D2,A0ŽWHERE�WE�MOVED�IT�ALL�TO#ŠSUB.L‚A1,D2ŽD2=HOW�FAR�WE�MOVED�IT.ŠADD.L‚D2,A5ŽBIAS�P.�INDEPENDENT�BASE�REGISTERŠADD.L‚D2,A7ŽBIAS�STACK�POINTERŠMOVE.L�A5,SAVA5-B(A5)ŠJMP„(A0)�LETS�GO�THERE!ŠPAGE** *ˆLINK�MODULE*/*�THIS�CODE�WILL�EXECUTE�AT�A�RELOCATED�ADDRESS*** LINK:…EQU„*$* PUT OUT MESSAGE 'BOOT IN PROGRESS'ŠMSGLƒMSG1S,MSG1E,B0*ŠBSR„DISKIO�READ�IN�BOOT�FILE*B* SET UP TO TAKE IPC INTERRUPT - UNMASK INTERRUPTS TO TAKE (CLEAR)*ƒIPC�INTERRUPT..ŠBSR„SAVVECTŒSAVE�VECTOR�VALUES�JUST�BOOTED�IN1ŠLEA„INTADDR(PC),A0…ADDRESS�TO�GO�TO�ON�EXCEPTION+ŠCLR.L‚D0‘AMOUNT�TO�BIAS�SUCCESSIVE�VECTORS8ŠBSR.S‚INITVECT‹INITIALIZE�ALL�VECTORS�TO�BE�SURE�OF�IPC0ŠMOVE.W�#$2000,SRŠALLOW�INTERRUPT�ON�IPC�TO�TAKE*INTADDRƒMOVE.W�#$2700,SRŠREMASK�INTERRUPTS*1* INITIALIZE ALL UNUSED VECTORS TO POINT TO ABORT5*‰MOVE.L�#4,D0ŽAMOUNT�TO�INCREMENT�SUCCEEDING�VECTORS7*‰LEA„ABORT(PC),A0‡ADDRESS�TO�STUFF�INTO�UNUSED�VECTORS#*‰BSR.S‚INITVECT‹INITIALIZE�VECTORS1*‰MOVE.W�#$2000,SRŠALLOW�INTERRUPT�ON�IPC�TO�TAKE$*‰MOVE.W�#$2700,SRŠREMASK�INTERRUPTS 2ŠBSR„RSTRVECT‹RESTORE�VECTOR�VALUES�JUST�BOOTED�IN*!* PUT OUT MESSAGE 'BOOT COMPLETE'ŠMSGLƒMSG2S,MSG2E,BF*BŠMOVE.L�LOADADDR-B(A5),A0‚'L'�OPTION�LOAD�ADDRESS�OR�LIB�LOAD�ADDR!ŠMOVE.L�4(A0),A1‹TRANSFER�ADDRESSŠADD.L‚BIAS-B(A5),A13ŠTST.L‚(A0)�Make�sure�we�are�not�using�a�SP�of�zero ŠBEQ.S‚NOBIAS�Branch�if�its�zero!ŠMOVE.L�(A0),A7ŒSET�STACK�POINTERŠADD.L‚BIAS-B(A5),A7+NOBIAS„BTSTƒ#HFLG,FLAGS-B(A5)‚Halt�option�?1ŠBEQ.S‚GO‘NO....go�jump�to�routine�just�loaded�in <ŠBTSTƒ#ALT15IO,FLAGS-B(A5)�Alternate�trap�#15�I/O�capabilityŠBNE.S‚ALTSE@ RVŒYes.. 1ŠBTSTƒ#T15IO,FLAGS-B(A5)�Primary�TRAP�#15�support#ŠBNE.S‚GOMACS�NO..return�to�MACSbug ŠSYSCALL�$00 0GO:‡JMP„(A1)�JUMP�TO�ROUTINE�THAT�WE�JUST�LOADED GOMACS„JMP„(A6)�Jump�to�MACSbug AALTSERVƒSYSCALL�.RETURN‹Yes..�return�to�debugger�&�save�all�regs. ŠJMP„(A1)ŠPAGE>**************************************************************)* SUBROUTINE TO INITIALIZE UNUSED VECTORS:*ƒENTRY�:�A0�=�ADDRESS�TO�STUFF�INTO�VECTOR�#0�IF�REQUIRED4*‹FOR�EACH�SUCCESSIVE�VECTOR�UNDER�CONSIDERATION,�A00*‹IS�INCREMENTED�BY�VALUE�THAT�WAS�PASSED�IN�D0.1*‹(UNUSED�VECTOR�NUMBERS�APPEAR�IN�IMGVECT�TABLE.*INITVECT‚EQU„*ŠMOVEM.L�D0-D1/A1-A2,-(A7)3ŠLEA„IMGVECTS(PC),A1„A1�POINTS�TO�VECT�#�SKIP�TABLE&ŠSUB.L‚A2,A2ŽA2�POINTS�TO�REAL�VECTORS/ŠCLR.L‚D1‘D1�WILL�CONTAIN�CURRENT�VECTOR�NUMBER0ŠMOVE.B�(A1)+,D0‹D0�=�NEXT�VECTOR�NUMBER�TO�SKIP*9VMV3†CMP.B‚D0,D1ŽDOES�CURRENT�VECTOR�#�MATCH�TABLE�ENTRY?ŠBNE.S‚VMV4�BRANCH�IF�NO6ŠMOVE.B�(A1)+,D0‹YES�-�D0�=�NEXT�VECTOR�NUMBER�TO�SKIP0ŠBRA.S‚VMV5�BYPASS�INITIALIZATION�OF�THIS�VECTOR.VMV4†MOVE.L�A0,(A2)ŒNO�-�INITIALIZE�THE�VECTOR VMV5†ADD.L‚(A7),A0ŒADD�PASSED�D0*ŠADD.L‚#4,A2ŽPOSITION�TO�STUFF�NEXT�VECTORŠADD.L‚#1,D1ŽBUMP�VECTOR�NUMBER.ŠCMP.L‚#$400,A2‹HAVE�WE�PROCESSED�ALL�VECTORS?ŠBLO.S‚VMV3�BRANCH�IF�NOŠMOVEM.L�(A7)+,D0-D1/A1-A2ŠRTSŠPAGE%*************************************,* SUBROUTINE TO SAVE VECTOR VALUES (SAVVECT)0* SUBROUTINE TO RESTORE VECTOR VAULES (RSTRVECT)*ƒALL�REGISTERS�PRESERVED*SAVVECTƒMOVEM.L�D0/A1-A2,-(A7)-ŠSUB.L‚A1,A1ŽPOINT�A1�TO�BEGINNING�OF�VECTORS9ŠLEA„VSAV(PC),A2ˆPOINT�A2�TO�AREA�WHERE�VECTORS�ARE�SAVED GOMOV…BSR.S‚MOVVECTŒMOVE�VECTORSVMOVRTSƒMOVEM.L�(A7)+,D0/A1-A2ŠRTS*RSTRVECT‚MOVEM.L�D0/A1-A2,-(A7)-ŠSUB.L‚A2,A2ŽPOINT�A2�TO�BEGINNING�OF�VECTORS9ŠLEA„VSAV(PC),A1ˆPOINT�A1�TO�AREA�WHERE�VECTORS�ARE�SAVEDŠBRA„GOMOVŽGO�MOVE�VECTORS*MOVVECTƒMOVE.L�#$100-1,D0MVLOOP„MOVE.L�(A1)+,(A2)+ŠDBRAƒD0,MVLOOPŠRTSM****************************************************************************** VECTOR CLAIM TABLE FOLLOWS.:*ƒIF�THE�NUMBER�APPEARS�IN�THE�TABLE,�THEN�DON'T�ALTER�THE0*…VECTOR,�ELSE�THE�VECTOR�IS�AVAILABLE�TO�CLAIM.0*…VECTOR�NUMBERS�MUST�APPEAR�IN�ASCENDING�ORDER.7*…ANY�ENTRY�OUT�OF�ASCENDING�ORDER�TERMINATES�THE�TABLE*IMGVECTS‚EQU„**)ŠDC.Bƒ0’POSSIBLE�STACK�VALUE�FOR�VERSADOS(ŠDC.Bƒ1’POSSIBLE�START�ADDR�FOR�VERSADOS,ŠDC.Bƒ4’VECTOR�#4ƒ=�ILLEGAL�INSTRUCTION�(BR)*ŠDC.Bƒ9’VECTOR�#9ƒ=�MACSbug�TRACE/SW�ABORT/ŠDC.Bƒ$1E�VECTOR�#$1E�=�VME115/120/128�SW�ABORT*ŠDC.Bƒ$1F�VECTOR�#$1F�=�VMC�SOFTWARE�ABORT/ŠDC.Bƒ$2F�VECTPR�#$2F�=�MACSbug�TRAP�#15�VECTOR,ŠDC.Bƒ$4E�VECTPR�#$4E�=�VME10�SOFTWARE�ABORT+ŠDC.Bƒ0’SPACE�FOR�PATCHING�IN�OTHER�VECTORS+ŠDC.Bƒ0’SPACE�FOR�PATCHING�IN�OTHER�VECTORS+ŠDC.Bƒ0’SPACE�FOR�PATCHING�IN�OTHER�VECTORS*£TABLE�TERMINATOR�IS�BYTE�=�0ŠDS…0*G* NOTE THAT SOFTWARE ABORT IS NOT AT THE SAME LOCATION FOR VMC AS IT IS*ƒFOR�VERSAbug.*#IMGVECTE‚EQU„*’END�OF�IMAGE�VECTORSŠPAGE%************************************* * ABORT -$* GENERATE 256 TIMES THE INSTRUCTION *‰BSR„ABORTP&*ƒFOR�USE�AS�PSEUDO�VECTORS�TO�COMPUTE!*…VECTOR�NUMBER�IN�CASE�OF�VECTOR *…EXCEPTION.* ABORT…EQU„*ŠBSR„ABORTP�BSR�#1*‰.*‰.*‰.#*‰RPT„254,<�BSR�ABORTP>‚BSR�#2-#255ŠNOLISTŠRPT„254,<�BSR�ABORTP>ŠLISTŠBSR„ABORTP�BSR�#256ŠPAGE%************************************* * SETBUSER*ƒSETS�UP�FOR�BUS�ERROR$*…SAVES�CONTENTS�OF�BUS�ERROR�VECTOR*‡FOR�FUTURE�RESTORATION!*…SAVES�RETURN�ADDRESS�AND�RETURN*‡STACK�POINTER�VALUE�FOR *‡BUSERR�TO�RESTORE�IN�THE�EVENT*‡OF�A�BUS�ERROR*ƒCALLING�SEQUENCE:#*…PEA‚*…BSR.L�SETBUSER*SETBUSER‚EQU„*;ŠMOVEPI.L�A0,$8,OLDBSERRƒSAVE�OLD�BUS�ERROR�VECTOR�CONTENTS3ŠMOVEPI.L�A0,4(A7),BRTN„RETURN�ADDRESS�ON�BUS�ERROR ŠPEA„8(A7),ŠMOVEPI.L�A0,(A7)+,BSTK„RETURN�STACK�POINTERŠPEA„BUSERR(PC),ŠMOVE.L�(A7)+,$8‹INITIALIZE�BUS�ERROR�VECTOR!ŠMOVE.L�(A7)+,(A7)‰SET�UP�FOR�RTSŠRTS%****************A ********************** BUSERR*ƒGETS�CONTROL�ON�BUS�ERROR#*ƒSETS�STACK�POINTER�AND�RETURNS�TO!*…PREVIOUSLY�ESTABLISHED�ADDRESS.#*ƒALSO�RESTORES�BUS�ERROR�VECTOR�TO*…POINT�TO�HANG�ABORT�ADDRESS* BUSERR„EQU„*7ŠMOVE.L�BSTK(PC),A7‹THIS�ROUTINE�NOT�CALLED...…12/20/84>ŠMOVE.L�BRTN(PC),-(A7)ˆMOVE.L�X(PC)�CODE�LEFT�AS�IS..�12/20/84ŠRTSŠPAGEL**************************************************************************** *�DISKIO:Â**�DISK�CONTROL�ROUTINE...²**Ê*>*ŒTHIS�ROUTINE�CHECKS�IPCFLAG�TO�DETERMINE�IF�THE�CONTROLLER„*C*‡IS�AN�IPC.‚IF�IT�IS,�IPL�WILL�USE�THE�FOLLOWING�DISKIO�ROUTINE.ƒ*F*‡IF�IT�ISN'T,�IPC�MUST�SET�UP�SOME�REGISTERS�AND�USE�THE�DEBUGGERS'�**‡INTERNAL�DISK�READ�ROUTINE.¨**Ê*;*ŒTHERE�ARE�NO�INTERRUPTS�RECOGNIZED�BY�THE�68000�IN�THIS‡*>*‡ROUTINE.‚AS�A�RESULT�ALL�COMMUNICATION�BETWEEN�THE�IPC�ANDˆ*B*‡THE�68000�MUST�BE�HANDLED�BY�A�POLLING�TECHNIQUE,�RE-EXAMINING…*D*‡COMMUNICATION�"FLAGS"�UNTIL�THE�EVENTS�REQUESTED�HAVE�COMPLETED.ƒ*=*‡NOTE�HOWEVER,THAT�THE�IPC�MUST�STILL�BE�GIVEN�INTERRUPTS.Š**Ê*!*‡UPON�ENTRY�TO�THIS�ROUTINE...¦*8*‰A3ˆ=�THE�ADDRESS�OF�THE�COMMAND�PACKET�BEING�SENT�TO†**•THE�SPECIFIED�"IPC".¡*$*‰A4ˆ=�THE�ADDRESS�OF�THE�CHANNEL.š**Ê**Ê*>*‡SHARED�MEMORY�USED�FOR�COMMUNICATION�BETWEEN�THE�68000�AND‰*2*‡THE�REQUESTED�IPC�IS�LOCATED�BY�THE�FOLLOWING:•*"*�FF0000�+�(�IPC�NUMBER�*�$200�)œ**Ê*K***************************************************************************** DISKIO„EQU„*ŠMOVE.L�IPCFLAG-B(A5),D09ŠCMP.L‚#'ME4U',D0‰THIS�ROUITNE�OR�THE�DEBUGGERS'�ROUTINE?0ŠBNE„DISKIPCŒ'ME4U'�MEANS�USE�DEBUGGERS'�ROUTINE******************************�SET�UP�REGS�FOR�DEBUGGER‚******************************.DISKEXTƒCLR.W‚RETRY-B(A5)ˆClear�the�retry�type5DISKEXT1‚MOVEM.L�A3-A5,-(A7)‡THESE�MUST�BE�MAINTAINED ŠCLR.L‚D01ŠMOVE.W�IPCBLKNM(A3),D0„NUMBER�BLOCKS�TO�TRANSFER ŠCLR.L‚D19ŠMOVE.B�DSKCODE-B(A5),D1ƒDISK�CONFIGURATION�CODE�(BYTE�5)+ŠMOVE.L�IPCMEMAD(A3),D2„MEMORY�LOAD�ADDRESS(ŠMOVE.L�IPCSECNM(A3),D3„STARTING�BLOCK�#ŠMOVE.L�A4,A0ŽCHANNEL�ADDRESS;ŠMOVE.L�DSKCONF-B(A5),A2ƒADDRESS�OF�DISK�CONFIGURATION�DATA:ŠMOVE.L�DSKOUT-B(A5),A1„ADDRESS�OF�BUGS'�DISK�READ�ROUTINE0ŠBTSTƒ#3,FLAGS-B(A5)…TRAP�#15�disk�I/O�supportedŠBNE.S‚DSKT15�Yes...-ŠJSR„(A1)�JUMP�TO�THE�BUGS'�DISK�READ�ROUTINEŠBRA.S‚DSKT15A@DSKT15„LEA.L‚T15DIOPK-B(A5),A1‚Point�to�TRAP�#15�disk�I/O�packet<ŠMOVE.L�IPCMEMAD(A3),T15DMADR(A1)ƒInsert�memory�load�address?ŠMOVE.L�IPCSECNM(A3),T15DSECN(A1)ƒInsert�starting�sector�numberAŠMOVE.W�IPCBLKNM(A3),T15DSCNT(A1)ƒInsert�#�of�sectors�to�transfer-ŠMOVE.L�A1,-(A7)‹Point�debugger�to�I/O�packet/ŠSYSCALL�.DSKRDŒGo�read�from�device�into�memory 1DSKT15AƒMOVEM.L�(A7)+,A3-A5‡RESTORE�THE�REGISTERS"ŠBEQ„GOODIO�DISKIO�COMPLETE...EXIT ŠIF.Wƒ#4��RETRY-B(A5)�THEN.S�MOVE.B�D6,D0ŽError�status!�BSR„BHLCVT�Convert�binary�to�hex2�MOVE.W�D3,ERR15V1-B(A5)ƒPut�into�displayable�form�MOVEM.L�A5,-(A7)=�LEA„ERROR15E-B(A5),A6‚Bracket�the�message�to�display�with...#�LEA„ERROR15S-B(A5),A5‚...A5�and�A6'�BSR„MSGOUT�Display�nasty�error�message�MOVEM.L�(A7)+,A5(�ADD.W‚#1,RETRY-B(A5)…Bump�retry�counterŠELSE.S4�BRA„ERROR15ŒPut�out�final�error�message�and�give�upŠENDIŠBRA„DISKEXT1‹Go�try�I/O�again******************************�DELAY�FOR�IPC�TIMING†******************************DISKIPCƒMOVE.L�#$100,D0DELAY…SUB.L‚#1,D0 ŠBNE.S‚DELAYŠPAGE****************************** SEE IF SHARED MEMORY FREE ******************************0ŠTST.B‚IPCIMB1(A4)ˆTEST�IF�SHARED�MEMORY�IS�FREE!ŠBEQ.S‚OK1�YES...FINE,�KEEP�GOING(ŠBSR„ERROR8�'IPC�SHARED�MEMORY�NOT�FREE'>**************************************************************<*�SHARED�MEMORY�FREE�-�MOVE�REQUESTED�COMMAND�PACKET�THEREƒ*(*—NOTE:�SHARED�MEMORY�FOR�THE�IPC�ONLY�**�USES�EVERY�OTHER�BYTE.‰*>************************************************************** OK1‡EQU„*/ŠMOVE.B�IPCPKSZ(A3),D1…COMMAND�PKT�SIZE�(1-REL)7ŠLEA„IPCIM1(A4),A1†A1�-�ADDR�OF�1ST�BYTE�OF�68000�WRITE+ŠCA LR.L‚D2‘BYTE�POS�IN�PASSED�COMMAND�PACKET&ŠCLR.L‚D3‘BYTE�POS�IN�MEM�MAPPED�SPACE IPCLP2„EQU„*7ŠMOVE.B�0(A3,D2),0(A1,D3)‚PLACE�BYTE�INTO�SHARED�MEMORY&ŠMOVE.B�0(A1,D3),D5ˆBYTE�WE�JUST�MOVED5ŠCMP.B‚0(A3,D2),D5ˆIS�IT�THE�SAME�IN�MEM�MAPPED�SPACEŠBEQ.S‚OK2�BRANCH�FOR�NO�ERROR/ŠBSR„ERROR9�'SHARED�MEMORY�READ/WRITE�MISMATCH' OK2‡EQU„* ŠADD.L‚#1,D2ŽINCR�"FROM"�POINTERŠADD.L‚#2,D3ŽINCR�"TO"ƒPOINTER ŠSUB.B‚#1,D1ŽDECR�COUNT�OF�BYTES ŠBGT„IPCLP2�LOOP�IF�MORE�DATA...3***************************************************3* TELL "IPC" COMMAND IS WAITING AND INTERRUPT HIM *3***************************************************(ŠMOVE.B�#$80,IPCIMB1(A4)ƒMESSAGE�WAITING%ŠMOVE.B�#$80,IPCINT(A4)„INTERRUPT�IPC-*********************************************-* POLLING LOOP - HAS IPC SENT AN "ACK" YET? *-********************************************* ACKYET„EQU„*4ŠMOVE.B�IPCIAB2(A4),D2…LOOK�TO�SEE�IF�WE�HAVE�AN�ACKŠCMP.B‚#6,D2Ž*2ŠBEQ.S‚ISITCOMP‹YES...�GO�WAIT�FOR�I/O�TO�COMPLETEŠBTSTƒ#NOLITE,FLAGS-B(A5)2ŠBNE.S‚ACKYETBŒBRANCH�IF�NO�PANEL�LIGHTS�ON�SYSTEM&ŠMOVE.W�D0,FAILGTŠNO....�KEEP�LIGHT�ON$ACKYETBƒEQU„*’RECOVER�FROM�BUS�ERROR ŠCMP.B‚#$15,D2ŒDID�WE�GET�A�NAK?$ŠBNE„ACKYET�NO....�THEN�KEEP�WAITING$ŠBSR„ERROR10Œ'NAK�RECEIVED�FROM�IPC'ŠPAGE5*****************************************************4*�POLLING�ROUTINE‚-�SET�UP�AND�WAIT�FOR�COMPLETION�*5*****************************************************>ISITCOMP‚CLR.B‚IPCIAB2(A4)ˆFREE�UP�ACK�BOX,�AND�WAIT�FOR�COMP.9COMPYETƒTST.B‚IPCIMB2(A4)ˆDID�WE�GET�AN�I/O�COMPLETE�YET?-ŠBNE.S‚CHK4STXŒYES...�GO�VERIFY�RETURN�PACKET7ŠBTSTƒ#NOLITE,FLAGS-B(A5)�SEE�IF�PANEL�LIGHTS�ON�SYSTEM3ŠBNE.S‚COMPYETB‹BRANCH�IF�NO�PANEL�LIGHTS�ON�SYSTEM,ŠMOVE.W�D0,FAILGTŠNO....�KEEP�FAIL�LIGHT�OFF%COMPYETB‚EQU„*’RECOVER�FROM�BUS�ERROR+ŠBRA„COMPYETŒKEEP�LOOKING�FOR�COMPLETED�I/O!*********************************!* SEE IF STX WHERE IT SHOULD BE *!*********************************;CHK4STXƒCLR.B‚IPCIMB2(A4)ˆCLEAR�MAIL�BOX�FOR�"I/O�COMPLETE"3ŠCMP.B‚#$02,IPCIM2(A4)„IS�"STX"�WHERE�IT�SHOULD�BE?*ŠBEQ.S‚SAVESTAT‹YES...�THEN�GO�SAVE�STATUS2ŠBSR„ERROR11Œ'INCORRECTLY�FORMATTED�RETURN�PACKET'8********************************************************8* SAVE STATUS FROM PACKET PLACE ACK INTO SHARED MEMORY,**�CLEAR�BOX�AND�INTERRUPT’*8********************************************************$SAVESTAT‚EQU„*’SAVE�STATUS�FOR�LATER'ŠMOVE.B�IPCIM2+(2*5)(A4),D6�D6=xx�xx�XX)ŠMOVEP.L�IPCIM2+(2*4)(A4),D7�D7=�XX�YY�ZZ(ŠCLR.B‚IPCIAB2(A4)ˆFREE�UP�SHARED�MEMORY(ŠMOVE.B�#6,IPCIMA1(A4)…SEND�"ACK"�TO�IPC%ŠMOVE.B�#$80,IPCINT(A4)„AND�INTERRUPTŠPAGEG***********************************************************************7*ˆVERIFY�THE�STATUS�PACKET,�(JUST�RECEIVED),�IS�OURS.Š*F*�IF�A�FLOPPY�DISK�DRIVE�DOOR�IS�OPENED,�FOR�EXAMPLE,�AN�UNSOLICETED‚*D*�STATUS�PACKET�WILL�BE�CREATED.‚THESE�PACKETS�CAN�BE�DETECTED�ANDƒ*@*�BYPASSED.‚STATUS�WAS�SAVED�IN�D0�BEFORE�PACKET�WAS�RELEASED.‡*G*********************************************************************** 4ŠMOVE.B�D6,D2ŽIS�THIS�AN�UNSOLICITED�STATUS�PACKET�?2ŠAND.B‚#$F0,D2ŒEXAMINE�COMMAND�STATUS�TO�FIND�OUT.+ŠCMP.B‚#$80,D2ŒIT�IS�UNSOLICITED�IF�IT'S�8X(ŠBEQ„COMPYETŒIF�ITS�8X�GO�BACK�AND�WAIT. **************************** CHECK STATUS OF OUT I/O **************************** 3ŠCMP.B‚#$70,D6ŒNORMAL�I/O�COMMAND�COMPLETE�STATUS�? ŠBEQ.S‚IONC ŠCLR.L‚D0 ŠMOVE.B�D6,D0!ŠBSR„BHLCVT�CONVERT�BINARY�TO�HEX4ŠMOVE.W�D3,ERR12V1-B(A5)ƒSAVE�IN�MESSAGE�FOR�DISPLAY3ŠBSR„ERROR12Œ'BAD�RETURN�STATUS�CMD.�FROM�IPC�=�XX'#IONC†TST.B‚D7‘"ZERO"�STATUS�(GOOD)?*ŠBEQ.S‚GOODIO�YES...�EXIT�DISK�I/O�ROUTINE-ŠCMP.B‚#$B,D7�NO....�WAS�IT�A�CHECKSUM�ERROR?$ŠBEQ.S‚GOODIO�.†YES...�IT�IS�OK�THEN ŠCLR.L‚D0 ŠMOVE.B�D7,D0!ŠBSR„BHLCVT�CONVERT�BINARY�TO�HEX4ŠMOVE.W�D3,ERR13V1-B(A5)ƒSAVE�IN�MESSAGE�FOR�DISPLAY.ŠBSR„ERROR13Œ'BAD�RETURN�STATUS�FROM�IPC�=�XX' GOODIO„EQU„*)ŠCLR.L‚D6‘D6�ADVERTISED�AS�ZERO�WHEN�DONEŠRTS„EXIT�DISK�I/O�ROUTINE.ŠPAGE%**************************B ************ VECTOR CATCH ALL)*ƒCOME�HERE�FOR�ANY�EXCEPTION�VECTOR�THAT%*…IS�UNCLAIMED.‚COMPUTE�VECTOR�NUMBER&*…AND�DISPLAY�IN�USER�FRIENDLY�MESSAGE*.ABORTP„MOVE.L�SAVA5(PC),A5‡RESTORE�A5—12/20/84*ŠPEA„ABORT(PC)ŠBASE�OF�PSEUDO�VECTOR�TABLE ŠMOVE.L�4(A7),A0‹RETURN�BSR�ADDR3ŠSUB.L‚(A7)+,A0‹SUBTRACT�ADDRESS+4�OF�PSEUDO�VECTOR5ŠSUB.L‚#4,A0ŽA0=0�REL�ADDRESS�OF�BSR�THAT�GOT�US�HERE ŠMOVE.L�A0,D0,ŠLSR.L‚#2,D0ŽCONVERT�TO�VECTOR�NUMBER�IN�HEX&ŠBSR„BHLCVT�CONVERT�FROM�BINARY�TO�HEX8ŠMOVE.W�D3,ERR14V1-B(A5)ƒMOVE�INTO�USER�FRIENDLY�MESSAGE ŠBSR„ERROR14>*************************************************************** HANG<*ƒON�ERROR�CONDITION,�STACK�ADDRESS�OF�USER�FRIENDLY�MESSAGE+*ƒAND�PANEL�LIGHT�VALUE�AND�BRANCH�TO�SELF.* HANG†EQU„*8ŠMOVEM.L�MSGAD(PC),D0-D1ƒA5�USED�FOR�MESSAGE...‹12/20/84ŠMOVEM.L�D0-D1,-(A7).ŠBRA.S‚*’"STOP"...�"RESET"�REQUIRED�TO�RESTARTŠPAGEF***********************************************************************�-PANEL�LIGHT�VALUES-¯*$*ˆBIT�POSITIONS....7�6�5�4�3�2�1�0œ* *ŒCONTENTS.....U�U�M�L�8�4�2�1œ*!*ŒWHERE........„U�U�=�UNDEFINED˜*%*ŸM�=�MOST‚SIGNIFICANT�DIGIT�(LEFT)ƒ*'*ŸL�=�LEAST�SIGNIFICANT�DIGIT�(RIGHT)‚*.*™8�4�2�1�=�HEX�CHARACTER�REQUIRED�(1'S�COMP)**Ä*=*ˆNOTE:�THE�"M"�OR�"L"�LATCH�MUST�BE�IN�THE�ZERO�STATE�WHENƒ*5*ŽTHE�HEX�DIGIT�IS�MOVED�IN.�THE�LATCH�MUST�THEN�BE…*9*ŽTURNED�ON�TO�"CAPTURE�THE�DIGIT�IN�THE�DESIRED�LIGHT.�*5*ŽNOTE�THAT�THE�1'S�COMPLIMENT�OF�THE�HEX�NUMBER�IS…*9*ŽREQUIRED.�THIS�REGISTER�IS�LOCATED�AT�$FE0004�"TTORM".*0*ŽIT�SHOULD�BE�NOTED�THAT�ONLY�MACSbug�SYSTEMSŠ*/*ŽHAVE�PANEL�LIGHTS,�VERSAbug�SYSTEMS�DO�NOT.‹*4*ŽFOR�THIS�REASON,�DUMMY�LOCATIONS�FOR�PANEL�LIGHT†*9*ŽREGISTERS�ARE�SET�UP�AT�INITIALIZATION�TIME�IF�WE�ARE�*#*ŽOPERATING�ON�A�VERSAbug�SYSTEM.—**Ä*<*ˆSAMPLE:ƒMOVE.B�#$14,TTORM�"M"�LATCH�IS�ZERO�BITS�128�OFF‚*2*’MOVE.B�#$34,TTORM�"M"�LATCH�IS�ONE‚CHAR�"B"�ONƒ*4*’MOVE.B�#$2F,TTORM�"L"�LATCH�IS�ZERO�BITS�ALL�OFF‚*2*’MOVE.B�#$3F,TTORM�"L"�LATCH�IS�ONE‚CHAR�"0"�ONƒ**Ä*@*�THE�FOLLOWING�CHARACTERS�ARE�DISPLAYED�IN�PANEL�LIGHT�DIGITS‡* *…"$B0"‚(BOOT�COMMAND�ENTERED)¢**…"$B8"‚(NO�"BOOT"�FILE)¨**…"$BE"‚(BOOT�IN�PROGRESS)¦*F**********************************************************************%* SUBROUTINE TO REFRESH PANEL LIGHTS.)*ƒINPUT�IS�TAKEN�FROM�D7�(LOW�ORDER�BYTE),*ƒIS�DISPLAYED�IN�ASCII�HEX�ON�PANEL�LIGHTS..*ƒIF�WE�ARE�NOT�ON�A�SYSTEM�WITH�PANAL�LIGHTS,*ƒTHEN�JUST�RETURN.*ƒA0�AND�D7�ARE�DESTROYED.* LITPANAƒEQU„*<ŠBTSTƒ#NOLITE,FLAGS-B(A5)�DO�WE�HAVE�PANEL�LIGHTS�ON�SYSTEM?ŠBNE.S‚LITPANAR‹BRANCH�IF�NO%ŠAND.L‚#$FF,D7ŒISOLATE�LOW�ORDER�BYTE<ŠMOVE.L�D7,PLITE-B(A5)…SAVE�PANEL�LIGHT�VALUE�FOR�FUTURE�REF.*‰LEA„TTOR,A0ŒADDRESS�OF�PANEL�LIGHTSŠ12/20/841ŠMOVE.L�#TTOR,A0‹ADDRESS�OF�PANEL�LIGHTSŠ12/20/84ŠROR.L‚#4,D7ŽSPLIT�DIGITS'ŠNOT.L‚D7‘COMPLEMENT�REQUIRED�FOR�LITESŠAND.L‚#$F000000F,D77ŠOR.Lƒ#$00020010,D7†SET�LSD�FLAGS�IN�LOW�AND�HIGH�ORDER(ŠMOVE.W�D7,(A0)ŒMOVE�IN�HIGH�ORDER�DIGIT*ŠOR.Wƒ#$30,D7ŒSET�LATCH�BIT�FOR�HIGH�ORDER(ŠMOVE.W�D7,(A0)ŒLATCH�IT�IN�PANEL�LIGHTSŠSWAPƒD7&ŠROL.W‚#4,D7ŽPOSITION�LOW�ORDER�DIGITS'ŠMOVE.W�D7,(A0)ŒMOVE�IN�LOW�ORDER�DIGIT)ŠOR.Wƒ#$30,D7ŒSET�LATCH�BIT�FOR�LOW�ORDER(ŠMOVE.W�D7,(A0)ŒLATCH�IT�IN�PANEL�LIGHTS LITPANAR‚RTSŠPAGE%************************************** ERROR HANDLER)*‚1.�DISPLAYS�USER�FRIENDLY�ERROR�MESSAGE!*‚2.�PUTS�VALUE�INTO�PANEL�LIGHTS*‚3.�BRANCHES�TO�HANG* ERRORA„EQU„*ŠMOVE.L�A5,-(A7)4ŠMOVE.L�4(A7),A5‹A5=ADDR�OF�REL�POINTER�TO�MSG�START*ŠMOVE.L�4(A5),A6‹A6=REL�POINTER�TO�MSG�END-ŠLEA„4(A5,A6.L),A6†A6=ABS.�POINTER�TO�MSG�END+ŠADD.L‚(A5),A5ŒA5=ABS.�POINTER�TO�MSG�START ŠBSR.S‚MSGOUTŠMOVE.L�(A7)+,A5ŠMOVE.L�(A7),A0ŠADD.L‚#8,A0ŽADDR�OF�LITE�CODES)ŠMOVE.W�(A0),D7ŒSET�TO�LIGHT�PANEL�LIGHTS ŠBSR„LITPANA ŠBRA„HANGŠRTS%************************************** MSGOUT&*ƒDISPLAY�MESSAGE�BOUNDED�BY�A5�AND�A6+*…WITH�STANDARD�MACSBUG�TYPE�I/O�(TRAP�#15)$*…JUST�RETURN�IF�ON�VERSAbug�SYSTEM.* MSGOUT„EQU„*1ŠMOVE.L�$BC,D1�SAVB E�WHATEVER�WAS�AT�TRAP�#15�SLOT=ŠMOVE.L�MACST15(PC),$BC„MAKE�SURE�TRAP�#15�VECTOR�OK…12/20/84ŠLEA„MSGAD(PC),A02ŠMOVE.L�A5,(A0)ŒSAVE�ADDR�OF�USER�FRIENDLY�MESSAGE5ŠMOVE.B�FLAGS(PC),D0‡A5�USED�FOR�MESSAGE....Š12/20/847ŠBTSTƒ#T15IO,D0ŠOn�system�supporting�primary�TRAP�#15�?-ŠBNE.S‚CHKALT�NO..�see�if�alternate�supportedŠBRA.S‚DOPRIMEŒYES..ACHKALT„BTSTƒ#ALT15IO,D0ˆOn�system�supporting�alternate�TRAP�#15�?7ŠBEQ.S‚MSGOUTXŒNO..therefore�no�TRAP�#15�support�at�all0ŠADD.L‚#1,A6ŽYES..output�line�A5=start,�A6+1=endŠMOVEM.L�A5/A6,-(A7)ŠSYSCALL�.OUTLNŠBRA.S‚MSGOUTXDOPRIMEƒTRAPƒ#15ŠDC.Wƒ2;MSGOUTXƒMOVE.L�D1,$BC�RESTORE�WHATEVER�WAS�AT�TRAP�#15�SLOTŠRTSŠPAGE%************************************** TEST15/*ƒTEST�TO�SEE�IF�WE�ARE�ON�SYSTEM�THAT�SUPPORTS&*†TRAP�#15�OUTPUT�-�IF�SO�RETURN�EQUAL'*†CONDITION�CODES�-�ELSE�RETURN�UNEQUAL*†CONDITION�CODES.* TEST15„EQU„*ŠMOVE.L�D0,-(A7)5ŠMOVE.B�FLAGS(PC),D0‡A5�USED�FOR�MESSAGE....Š12/20/840ŠBTSTƒ#T15IO,D0ŠDO�WE�HAVE�TRAP�#15�I/O�SUPPORT?ŠBNE.S‚T15R�BRANCH�IF�NO+ŠCMP.L‚D0,D0ŽJUST�SET�EQUAL�CONDITION�CODES:T15R†MOVEM.L�(A7)+,D0ŠMOVEM.L�DOES�NOT�DESTROY�COND.�CODESŠRTS** ERROR ROUTINES*)ERROR1„ERRTBL�1,B8�'INVALID�COMMAND�LINE'**ERROR2„ERRTBL�2,B8�'INVALID�OPTIONS�FIELD'*&ERROR3„ERRTBL�3,B8�'INVALID�FILE�NAME'*5ERROR4„ERRTBL�4,B8�'VOLUME�SPECIFICATION�NOT�ALLOWED'*4ERROR5„ERRTBL�5,BD�'RAM�UNAVAILABLE�TO�RELOCATE�IPL'*#ERROR6„ERRTBL�6,B8�'FILE�NOT�FOUND'*&ERROR7„ERRTBL�7,B8�'INVALID�FILE�TYPE'*/ERROR8„ERRTBL�8,BD�'IPC�SHARED�MEMORY�NOT�FREE'*:ERROR9„ERRTBL�9,BD�'IPC�SHARED�MEMORY�READ/WRITE�MISMATCH'*,ERROR10ƒERRTBL�10,BDŽ'NAK�RECEIVED�FROM�IPC'*:ERROR11ƒERRTBL�11,BDŽ'INCORRECTLY�FORMATTED�RETURN�PACKET'*4ERROR12ƒERRTBL�12,BDŽ'BAD�STATUS�CMD.�FROM�IPC�=�XX'*/ERROR13ƒERRTBL�13,BDŽ'BAD�STATUS�FROM�IPC�=�XX'*'ERROR14ƒERRTBL�14,B1Ž'VECTOR�EXCEPTION'*>ERROR15ƒERRTBL�15,B1Ž'BAD�STATUS�FROM�EXTERNAL�DISKIO�ROUTINE'** USER FRIENDLY MESSAGES*"MSG1S…DC.Bƒ'Boot�in�progress�...�'ŠDS…0MSG1E…DC.Wƒ$0D0A*MSG2S…DC.Bƒ'Boot�complete�'ŠDS…0MSG2E…DC.Wƒ$0D0A*$ERROR1SƒDC.Bƒ'Invalid�command�line�'ŠDS…0ERROR1EƒDC.Wƒ$0D0A*%ERROR2SƒDC.Bƒ'Error�in�option�field�'ŠDS…0ERROR2EƒDC.Wƒ$0D0A*+ERROR3SƒDC.Bƒ'Error�in�file�specification�'ŠDS…0ERROR3EƒDC.Wƒ$0D0A*(ERROR4SƒDC.Bƒ'Volume�field�not�allowed�'ŠDS…0ERROR4EƒDC.Wƒ$0D0A*EERROR5SƒDC.Bƒ'Bus�error�accessing�RAM�-�initialize�RAM�and�try�again'ŠDS…0ERROR5EƒDC.Wƒ$0D0A*ERROR6SƒDC.Bƒ'File�not�found�'ŠDS…0ERROR6EƒDC.Wƒ$0D0A*!ERROR7SƒDC.Bƒ'Invalid�file�type�'ŠDS…0ERROR7EƒDC.Wƒ$0D0A**ERROR8SƒDC.Bƒ'IPC�shared�memory�not�free�'ŠDS…0ERROR8EƒDC.Wƒ$0D0A*5ERROR9SƒDC.Bƒ'IPC�shared�memory�read/write�mismatch�'ŠDS…0ERROR9EƒDC.Wƒ$0D0A*&ERROR10S‚DC.Bƒ'NAK�received�from�IPC�'ŠDS…0ERROR10E‚DC.Wƒ$0D0A*=ERROR11S‚DC.Bƒ'Incorrectly�formatted�return�packet�from�IPC�'ŠDS…0ERROR11E‚DC.Wƒ$0D0A*,ERROR12S‚DC.Bƒ'Bad�status�cmd.�from�IPC�=�$'ERR12V1ƒDC.Bƒ'„'ŠDS…0ERROR12E‚DC.Wƒ$0D0A*'ERROR13S‚DC.Bƒ'Bad�status�from�IPC�=‚$'ŠDS…0ERR13V1ƒDC.Bƒ'„'ŠDS…0ERROR13E‚DC.Wƒ$0D0A*=ERROR14S‚DC.Bƒ'Unclaimed�vector�exception,�vector�number�=‚$'ERR14V1ƒDC.Bƒ'„'ŠDS…0ERROR14E‚DC.Wƒ$0D0A*;ERROR15S‚DC.Bƒ'Bad�status�from�external�DISKIO�routine‚=�$'ŠDS…0ERR15V1ƒDC.Bƒ'„'ŠDS…0ERROR15E‚DC.Wƒ$0D0A** STACKŠDS.Bƒ$80�SYSTEM�STACK STACK…EQU„**E* THE FOLLOWING DATA MUST BE MOVED WITH THE RELOCATED SECTION OF IPL.1*ƒIT�IS�REFERENCED�OFF�THE�SEGMENT�BASE�REGISTER.FLAGS…DC.Bƒ0’FLAG�BYTEŠDS…0’FORCE�WORD�BOUNDARY6LOADADDR‚DC.Lƒ0’LOAD�ADDRESS�SPECIFIED�WITH�'L'�OPTION5BIAS†DC.Lƒ0’BIAS�TO�ADD�TO�START�ADDR�&�STACK�POINTER *‰FLAG�BYTE�BIT�REPRESENTATION‚*2T15IO…EQU„0’SET�IF�NO�PRIMARY�TRAP�#15�I/O�SUPPORT2NULFLG1ƒEQU„1’-------�NOT�YET�IMPLEMENTED‚--------4ALT15IOƒEQU„2’SET�IF�ALTERENATE�TRAP�#15�I/O�SUPPORT'T15DSKIO‚EQU„3’SET�IF�TRAP�#15�DISK�I/O-LFLG†EQU„4’BIT�TO�SET�IF�'L'�OPTION�SPECIFIED-HFLG†EQUC „5’BIT�TO�SET�IF�'H'�OPTION�SPECIFIED2NOLITE„EQU„6’BIT�TO�SET�IF�NO�PANEL�LIGHTS�ON�SYS.2NULFLG2ƒEQU„7’------�NOT�YET�IMPLEMENTED‚---------*8*‡VARIABLES�TO�USE�DEBUGGERS'�INTERNAL�DISK�READ�ROUTINE*&DSKCODEƒDC.Bƒ0’DISK�CONFIGURATION�CODEŠDC.Bƒ0’FORCE�WORD�BOUNDARY7IPCFLAGƒDC.Lƒ0’INTERNAL(IPC)/EXTERNAL(BUGS)�DISKIO�FLAG1DSKCONFƒDC.Lƒ0’ADDRESS�OF�DISK�CONFIGURATION�DATA0DSKOUT„DC.Lƒ0’ADDRESS�OF�BUGS'�DISK�READ�ROUTINE3T15DPKAD‚DC.Lƒ0’ADDRESS�OF�TRAP�#15�DISK�I/O�PACKET**‡MISC.�VARIABLES*IPCADR„DC.Lƒ0’CHANNEL�ADDRESS#MACSBUGƒDC.Lƒ0’DEBUGGER�ENTRY�POINT8MACST15ƒDC.Lƒ0’INITIAL�CONTENTS�OF�MACSBUG�TRAP�#15�VECT0OLDBSERR‚DC.Lƒ0’OLD�CONTENTS�OF�BUS�ERROR�VECTOR,BSTK†DC.Lƒ0’RESTORE�STACK�VALUE�ON�BUS�ERROR)BRTN†DC.Lƒ0’RETURN�ADDRESS�FROM�BUS�ERRORSAVA5…DC.Lƒ0’SAVE�FOR�A5'SCRSAV„DC.Lƒ0’SAVE�FOR�SCRATCH�REGISTER+RETRY…DC.Wƒ0’Retry�count�for�bug�disk�error2* THE FOLLOWING TWO LONG WORDS MUST BE CONSECUTIVE+MSGAD…DC.Lƒ0’ADDRESS�OF�LAST�MESSAGE�OUTPUT&PLITE…DC.Lƒ0’CURRENT�PANEL�LIGHT�VALUE**VSAV†DS.Lƒ$100�VECTOR�SAVE�AREAPATCH…DS.Bƒ50‘PATCH�AREA*"*‰TRAP�#15�DISK�1/O�COMMAND�PACKETŠDS…0T15DIOPK:�EQU„*)�RATHER�THAN�(!)�FOR�THE�PROMPT***‰PAGE**ˆRED VISION�CODE‡090281�3*3*’RE-LINKED�SO�ALL�SECTIONS�WILL�BE�IN�SEGMENT�ZERO*‰PAGE**ˆREVISION�CODE‡112081�3*2*’CORRECT�PROBLEM‚LIB�X,Y,Z„WHERE�',Z'�WAS�IGNORED*’CORRECT�PROBLEM‚LIB�X,#CNXX!*£LIB�X,#†WHERE�XX�IS�TERMINAL�ID/*’CORRECT�PROBLEM‚LIB�XˆWHERE�X�HAS�NO�.RO�FILE7*’CORRECT�PROBLEM�OF�NOT�EDITING�FOR�SBARG�ERROR�IF�ONE *¢RETURNED:*’CORRECT�PROBLEM�OF�TERMINATING�IMMEDIATELY�IF�PROCESSING*¢A�CHAIN�FILE0*’CORRECT�PROBLEM‚>LISTˆWHERE�THE�LIBRARY�HAS�NO *°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*’CORRECT�PROBLEM�OF�INVALID�CMD�WHEN�CHANGING�REVISION*¢NUMBER�OR�CODE**‰PAGE***ˆREVISION�CODE‡113081�3**0*’CORRECT�PROBLEM‚LIB�X,Y†WHERE�X�DOES�NOT�EXIST *£>�LIST‡THE�MESSAGE�DOES�NOT�GO*°TO�THE�LIST�FILE**‰PAGE***ˆREVISION�CODE‡122281�3**8*’DISPLAY�ADDITIONAL�INFORMATION�WITH�THE�'LIST'�COMMAND(*’CORRECT�THE�FOLLOWING�COMMAND�SEQUENCE*œLIST�(ALL�MODULES)*œLIST�(SECIFIC�MODULE)*œLIST�(ALL�MODULES)****‰PAGE***ˆINCLUDE�FILES***ˆINCLUDE�9995.&.FME.EQ*ˆINCLUDE�9995.&.IOE.EQ*ˆINCLUDE�9995.&.TR1.EQ**‰NOLIST‰INCLUDE�9995.&.FME.EQ‰INCLUDE�9995.&.IOE.EQ‰INCLUDE�9995.&.TR1.EQ‰LIST**‰PAGE<*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;**************************************************************ˆ***†L�I�B‚C�O�M�M�A�N�Dƒ*******ˆ***‰DATAƒSEGMENT„*******=****************************************************************ˆ****‚EQUATE�AREA‚******* BEGDATA‚EQU�0#STKLENƒEQU�25‹STACK�LENGTH�IN�WORDS)BUFSIZE‚EQU�160‰INPUT�COMMAND�BUFFER�SIZE DSKLUIƒEQU�1(DSKLUOƒEQU�2‹DISK�LOG�UNIT�ASSIGN�OUTPUT!LISTLUƒEQU�3‹LISTING�LOGICAL�UNIT,DSKLUI2‚EQU�4‹DISK�LOG�UNIT�FOR�SOURCE�INPUTSECLENƒEQU�256‰SECTOR�LENGTH CR‡EQU�$0D LF‡EQU�$0A SPACE„EQU�$20 SLASH„EQU�$2F COMMA„EQU�$2C*‰PAGE* ‰OFFSET�$0000 STARBUF‚EQU�*&***************************************ˆLIBRARY�COMMAND�LINE�BUFFER&*************************************** WORKBUF‚EQU�*‰DS.B�80WORKBUFE EQU *-1‰DS.L�1*.***********************************************ˆLIBRARY�BUFFER.**********************************************LIBBUFƒDS.B�SECLENLIBBUFE‚EQU�*-1‰DS.L�1*SOURBUF‚DS.B�SECLENSOURBUFE EQU *-1‰DS.L�1*3******************************************************ˆBUFFER�AREA�TO�READ�CONTIGUOUG�FILE�INTO*ŠWILL�HOLD�292�MODULE�ENTRIES*3**************************************************** DIRLIBƒEQU�* ‰DS.L�SECLEN ‰DS.L�SECLEN ‰DS.L�SECLEN ‰DS.L�SECLENDIRLIBEƒEQU�*-1‰DS.L�3* BUFENDƒEQU�*BUFSIZƒEQU‚BUFEND-STARBUF‰PAGE ‰SECTION�0(‰XREF�PARSE,OPTION,EDITFILE,SBARG,DATEOJ**ˆNEXT�WORD�BOUNDRY�MACRO***2*******************************************************„DATA�SEGMENT�(DSEG)ƒ****1*************************************************** PBA†EQU�** REV_CODE:‰DC.B†'122084�4'&*œWHERE�REV_CODE�IS�DEFINED�AS�FOLLOWS *œMMDDYYXZ*3*œMMDDYY�=�MONTH�DAY�YEAR�OF�LAST�ASSEMBLY�OR�PATCH*œX†=�REVISION�TYPE�CODE*¦SPACE�=�CLEAN�ASSEMBLY *¦P…=�PATCHED*¦C…=�CUSTOMIZED�PATCHED**#*œZ†=�VERSADOS�MAJOR�REVISION�FIELD*‰PAGE:************************************************************ ‰DS.L�STKLEN PROGSTK‚EQU�**‰DC.L�08*+++++++++++++++++++++++++++++++++++++++++++++++++++++++*,*ˆ***ƒBUFFIN�IS�THE�AREA�THE�COMMAND�LINE�IS.*ˆ***ƒREAD�INTO�WHEN�THIS�PROGRAM�IS�CALLED�IN*8*+++++++++++++++++++++++++++++++++++++++++++++++++++++++**BUFFINƒCOMLINE�BUFSIZE‚***‚INPUT�BUFFER‚***-**********************************************‰DS.W�0*,********************************************(*ˆPARAMETER�TABLE�FOR�GET�SEG�FOR�BUFFER,******************************************** BUFPARƒEQU�*%‰DC.L�0,0ƒTASK�(E 0=SELF),SESSION�(N/A) SEG_OPTS:‰DC.W�0…OPTIONS‰DC.W�0�(RAM�SEGMENT)‰DC.L�'BUFR'ŠNAME�OF�SEGMENT‰DC.L�0�START�OF�SEGMENT‰DC.L�BUFSIZŠLENGTH�OF�BUFFER*AS_ADDR:‰DC.L†0*œADDR�OF�ALLOCATED�SEGMENT5******************************************************+*ˆ**‚IOS�PARAMETER�TABLE�FOR�DISK�READS‚***6*ˆ**‚REFER�TO�IOS�EQUATES�UNDER�IOS�PARAMETER�BLOCK‚***5******************************************************‰DS.W�0 LIBRIOS‚EQU�* ‰DC.W�IOREAD‰DC.W�IOPWAT+IOPREC‰DC.B�0 ‰DC.B�DSKLUI‰DC.B�0‰DC.B�0‰DC.L�0LIBRSAD‚DC.L�0LIBREAD‚DC.L�0‰DC.L�0‰DC.L�0&**************************************%*ˆIOS�PARAMENTER�TABLE�FOR�DISK�WRITE*$************************************* TEMPIOS‚EQU�* ‰DC.W�IOWRIT ‰DC.W�IOPREC‰DC.B�0 ‰DC.B�DSKLUO‰DC.B�0‰DC.B�0‰DC.L�0TEMPSAD‚DC.L�0TEMPEAD‚DC.L�0‰DC.L�0‰DC.L�0*%*ˆIOS�PARAMETER�BLOCK�FOR�SOURCE�FILE* SOURIOS‚EQU�* ‰DC.W�IOREAD‰DC.W�IOPWAT+IOPREC‰DC.B�0 ‰DC.B�DSKLUI2‰DC.B�0‰DC.B�0‰DC.L�0SOURSAD‚DC.L�0SOUREAD‚DC.L�0‰DC.L�0‰DC.L�0*3*****************************************************ŒIOS�PARAMETER�TABLE(*ˆSET�UP�IOS�(ERR0R-LOG)‚PARAMETER�BLOCK*3****************************************************6‰IOS.OUT6�IOWRIT,IOPASC+IOPFOR+IOPWAT,LDFLUN,0,0,0,0,0‰DS.W�07‰IOS.OUT6I�IOWRIT,IOPASC+IOPIMG+IOPWAT,LDFLUN,0,0,0,0,0‰DS.W�0**ˆSET�UP�IOS�FOR�LISTING�LU3*6‰IOS.OUT3�IOWRIT,IOPASC+IOPFOR+IOPWAT,LISTLU,0,0,0,0,0‰DS.W�0"***********************************8*ˆFHS�PARAMETER�TABLE�FOR�CHANGE�LOGICAL�UNIT�ASSIGNMENT6*ˆCHANGE�IS�FROM�6�TO�3�--�SEND�SOURCE�IS�LU�A�IN�MASK*ˆAND�RECEIVE�IS�LU�B�IN�MASK4*ˆLU3�IS�USED�F0R�LISTING�AND�LU6�FOR�ERR0R�/LOGGING**3*ˆPARAMETER�TABLE�FOR�CHANG�LOGICAL�UNIT�ASSIGNMENT,*ˆIS�DIFFERENT�FROM�STANDART�PARAMETER�TABLE*%************************************** LU3AFHSƒEQU�*'‰DC.W�FHCHLU„COMMAND�(CHANGE�LU�ASSIGN)‰DC.W�FOPKEP…OPTION�KEEP�ASSIGN‰DC.B�0ŠSTATUS‰DC.B�LDFLUNŠSEND�LU�NUMBER‰DC.B�LISTLUŠRECEIVE�LU�NUM‰DC.B�0ŠRESERVED%‰DC.L�0ŠTASK-ID�(0�MEANS�USE�YOURSELF(‰DC.L�0ŠSESSION�#�(0�MEANS�USE�YOURSELF)**,*********************************************&*ˆPARAMETER�BLOCK�FOR‚INPUT�(TERMINAL)*,*********************************************( IOS.OUTIN IOREAD,IOPFOR,CDFLUN,,,0,0,80**)******************************************?*ˆLU3FHS�IS�PARM�TABLE�FOR�LU3�WHICH�IS�USED�FOR�OUTPUT�LISTING*********************************************‰FHS.LU3�0,0,LISTLU,0,0,0,0,0 ‰DC.L�0,0,0*;************************************************************:*ˆ***�DSKFHS�IS�THE�PARAMETER�TABLE�FOR�THE�FHS�INPUT�FILE*;***********************************************************LIBFHS„DC.W�FHASGNŒCOMMAND!‰DC.W�FOPPREWŠOPTIONS�PUBLIC�READ‰DC.B�0ŠSTATUS ‰DC.B�DSKLUI†LOGICAL�UNIT�NUMBER!LIBVOL„DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUMBER"LIBCATƒDC.L�$20202020ˆCATALOG�NAME‰DC.L�$20202020 LIBNAME‚DC.L�$20202020‚FILE�NAME‰DC.L�$20202020LIBEXTƒDC.W�$2020†EXTENSION‰DC.W�0ŠRESERVED‰DC.B�0ŠWRITE�PROTECT�CODE‰DC.B�0ŠREAD�PROTECT�CODE‰DC.W�$100ŠLOGICAL�RCORD�LENGTH0‰DC.L�0ŠCONTIGUOUS�FILE�SIZE�/�DIR�ENTRY�POINTER6*ˆFOLLOWING�FHS�PARAMENTERS�FOR�SHARED�SEGMENT�REQUEST(‰DC.L�0ŠSEGMENT�STARTING�LOGICAL�ADDRESS$‰DC.L�0ŠSEGMENT�ENDING�LOGICAL�ADDR.3‰DC.L�0ŠLENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUESTLIBFHSE‚EQU�*-1‰DC.L�0*;************************************************************:*ˆ***�TMPFHS�IS�THE�PARAMETER�TABLE�FOR�THE�FHS�INPUT�FILE*;***********************************************************!TMPFHS„DC.W�FHALLO+FHASGNŒCOMMAND3‰DC.W�FOPEREW+FOPSEQŠOPTIONS�PUBLIC�READ�&�SEQ�FILE‰DC.B�0ŠSTATUS ‰DC.B�DSKLUO†LOGICAL�UNIT�NUMBER!TMPVOL„DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUMBER"TMPCATƒDC.L�$20202020ˆCATALOG�NAME‰DC.L�$20202020 TMPNAME‚DC.L�$20202020‚FILE�NAME‰DC.L�$20202020TMPEXTƒDC.W�$2020†EXTENSIONƒDC.W�0ŠRESERVED‰DC.B�0ŠWRITE�PROTECT�CODE‰DC.B�0ŠREAD�PROTEE CT�CODE‰DC.W�0ŠLOGICAL�RCORD�LENGTH1‰DC.L�0ŠCONTIGUOUS�FILE�SIZE�/�DIR�ENTRY�POIN2TER6*ˆFOLLOWING�FHS�PARAMENTERS�FOR�SHARED�SEGMENT�REQUEST(‰DC.L�0ŠSEGMENT�STARTING�LOGICAL�ADDRESS$‰DC.L�0ŠSEGMENT�ENDING�LOGICAL�ADDR.3‰DC.L�0ŠLENGTH�OF�PARM�BLOCK�FOR�SHARED�SEG�REQUEST‰DC.L�0*/***********************************************5*ˆPARM�BLOCK�FOR�CHANGE�LOGICAL�UNIT�FROM�TEMP�TO�LIB/************************************************CHGLUFHS EQU *‰DC.W�FHCHLU…CHANG�LOG�UNIT�NUM‰DC.W�0‰OPTIONS‰DC.B�0ŠSTATUS‰DC.B�DSKLUOŠCHG�LU�A‰DC.B�DSKLUIŠCHG�LUB ‰DC.B�0ŠRES‰DC.L�0‰DC.L�0‰DC.L�0*$*ˆFHS�PARAMETER�BLOCK�FOR�LIB�SORUCE SOURFHSƒEQU�*‰DC.W�FHASGNŠCOMMAND‰DC.W�FOPPRPWŠOPTIONS-‰DC.B�0ŠSTATUS‰DC.B�DSKLUI2…LOGICAL�UNIT�NUM‰DC.L�$20202020‚VOLUME�NAME‰DC.W�0ŠUSER�NUM‰DC.L�$20202020ˆCAT�NAME‰DC.L�$20202020‰DC.L�$20202020ˆFILE�NAME‰DC.L�$20202020 ‰DC.W�$2020‰DC.W�0‰DC.B�0ŠWRITE�PROT�CODE‰DC.B�0‰DC.W�0‰DC.L�0ŠCONT�FILE�SIZE ‰DC.L�0,0,0*8*ˆTABLE�OF�VALID�CHARACTER�FOR�THE�MODULE�VERIFY�ROUTINE* MODTABƒEQU�**�LINE�1�HEX�00�-�0F'‰DC.B�0,0,0,0,0,0,0,0,0,0,0,0,0,'T',0,0*ŒLINE�2‚HEX�10�-�1F%‰DC.B�0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*ŒLINE�3‚HEX�20�-�2F"*‘SP�!�"�#�$�%�&�'�(�)�*�+‚,‚-�.‚/+‰DC.B�'T',0,0,0,2,0,0,0,0,0,0,0,'T',0,1,'T'*‰LINE„4�HEX‚30�-�3F!*�0�1�2�3�4�5�6�7�8�9�:�;�<�=�>�?%‰DC.B�2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0*‰LINE„5�HEX�40�-�4F!*�@�A�B�C�D�E�F�G�H�I�J�K�L�M�N�O%‰DC.B�0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1*‰LINE„6‚HEX�50�-�5F*�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]%‰DC.B�1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,2%‰DC.B�0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0%‰DC.B�0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0‰DS.W�08**********************************************************ˆ***ƒWORK‚AREAƒ******9**********************************************************STSKNAM‚DC.L�0‰SAVE�TASK�NAMESESNUMƒDC.L�0ˆSAVE�SESSION�NUM#VOLNAMƒDC.L�0‰SAVE�VOL�DEFAULT�NAME‰DC.W�0‰TOP�HALF�OF�D3"USERNUM‚DC.W�0ŠDEFAULT�USER�NUMBER*CATNAMƒDC.L�0,0‡SAVE�DEFAULT�CATAGORY�NAME‰DS.L†1‰REG�D6REGD7„DS.L†1‰REG�D7‰DS.L†1‰REG�A0&TIDLOGON‚DC.L�0‰TERM�ID�AT�LOG�ON�TIME‰DC.W�0�TOP�HALF�OF�A2‰DC.W�0ŠLOG�ON�USER�NUMBER‰DS.L�8‰SAVE�OTHERS�REGISTERS*‰DS.W�0&DIRF…DC.L�0…DIRECTORY�SWITCH�&�POINTER.PREVDIRF�DC.L�0…PREV�DIR�FINE�(USED�IN�CHANGE) DNRR…DC.B�'‚'‡NOT�READY�RESPONSEAFLAG„DC.B�0ŠADD�FLAGDFLAG„DC.B�0ŠDELETE�FLAGCFLAG„DC.B�0ŠCOPY�FLAGCHFLAGƒDC.B�0…CHANGE�FLAGLFLAG„DC.B�0ŠLIST�FLAGQFLAG„DC.B�0…QUIT�FLAG"RFLAG„DC.B�0‰RETURN�TO�GETDIR�FLAGEXFLAGƒDC.B�0ŠEND�OF�INPUT�FLAG1FILENDƒDC.B�0…REACHED�END�OF�FILE�ON‚LIBRARY�FLAG"PASSS2„DC.B�0…SET�WHEN�IN�2ND�PASS‰DS.W�00SAVOADD„DC.L�0Š1ST�TIME�FLAG�FOR�PRT�DETAIL�LINE"HOLDLOCM�DC.L�0ŒLOCATION�OF�MODULEFLAGH„DC.B�0ŠPRINT�HEADER�FLAG+ADDMORE‚DC.B�0ŠMORE�MODULES�FOR�ADD�COMMAND-MORECHA‚DC.B�0‰MORE�ITEMS�FOR�CHANGE�CMD�FLAG#THRUMOD‚DC.B�0ŠMOD�READ�THRU�SWITCH%ATMOD„DC.B�0‚FLAG�FOR�BLD1HAF�ROUTINE,RLMSG„DC.B�0‚PRINT�ERROR�MSG�IN�READLIB�FLAG7NAMSAME‚DC.B�0ŠFLAG�FOR�REPLACE�CK�SAME�NAMES�OLD�&�NEW2BLD1END‚DC.B�0ŠREACHED�END�OF�FILE�IN�BLD1HAF�ROUT+FLAGCND‚DC.B�0ŠNO�LIB�CHANGE�ROUTINE�OPTION.RD1ST„DC.B�0ŠUSED�IN�BLD2HAF�ROUTINE�AS�A�FLAGNPFLAGƒDC.B�0…NO�PRINT�FLAGLASTLAST DS.B 5‰DS.W�0!DIRFULL‚DC.B�0‚SET�IF�DIR�IS�FULL*NEWLIBƒDC.B�0…NEW�LIBRARY�WAS�CREATED�FLAGDIREXIST�DC.B�0ŠDIR�EXISTS�FLAGLIBGOOD‚DC.B�1%DIROPTƒDC.B�0ŠDO�NOT�BUILD�DIR�OPTION!LIBPREV‚DC.B�0ŠINPUT�WAS�ASSIGNED#DIRCHGƒDC.B�0ŠCHANGE�DIRECTORY�FLAG*8TEMPIOSF�DC.B�0Šflag�to�check�temp�file�createdƒ10/24/83.***********************************************"*ˆSTART�OF�PRINT�HEADERS�&�BUFFERS.***********************************************‰DS.W�0QUESTM:‚DC.B�$0D,$0A‰DC.B†'LIBRARY�VERSION�' VERS_NBR: ‰DC.B†'ˆ' ‰DC.B†CR,LF‰DC.B�'LIBRARY�COMMANDS' ‰DC.B�$0D,$0A?‰DC.B�'ƒ(F�=�FILE�NAME„M�=�MODULE�NAME„DEFAULT�EXTENSION�=�RO)'‰DC.B�$0D,$0A,$0A;‰DC.B�'‚Add…=�(A�F)�OR�(A�F/)�OR�(A�F/M)�OR�(A�F,F/....,F)' ‰DC.B�$0D,$0A-‰DC.B�'‚CHange‚=�(F CH�M)�OR�(CH�M,M,M,....,M)' ‰DC.B�$0D,$0A1‰DC.B�'‚COpy„=�(CO�F/M)�OR�(CO�F/M,F/M,....,F/M)' ‰DC.B�$0D,$0A/‰DC.B�'‚DELete‚=�(DEL�M)�OR�(DEL�M,M,M,....,M)' ‰DC.B�$0D,$0A/‰DC.B�'‚List„=�(L)‚OR‚(L�M)�OR�(L�M,M,M....,M)' ‰DC.B�$0D,$0A‰DC.B�'‚Quit„=�(Q)�OR�(QUIT)' ‰DC.B�$0D,$0A2‰DC.B�'‚Replace�=�(R�F/M)�OR�(R�F/M,F/M,....,F/M)'‰DC.B�$0D,$0A,LFQUESTME‚EQU�*-1‰DS.W�0DIRLOCƒDC.L�0�DIR�POINTERRLIBLOCƒDC.B�'Œ'‚LOC�IN�LIBRARY‰DS.W�0SECTCNT‚DC.W�0ŠCOUNT�OF�SECTORS0DIRENDƒDC.L�0ŠPOINTER�AT�NEXT�AVAIL�SPACE�IN�DIR+TOTMODƒDC.W�0ŠTOTAL�COUNT�OF�MODULES�IN�LIB‰DS.W�0*(LISTTITL�DC.B�'MODULE†VER‚REV‚LNGƒDESC…'LT_DATE: ‰DC.B†'Š'LT_TIME: ‰DC.B†'Š'LISTTITE EQU *-1‰DS.W†0**ˆDATA�AREA�FOR�LIST�FUNCTION*LISTDATA EQU *LISTMOD‚DC.B�'Š'‚MODULE�NAME ‰DC.B�'‚'LISTVER‚DC.B�'ƒ'†VERSION ‰DC.B�'‚'LISTREV‚DC.B�'ƒ'†REVISION ‰DC.B�'ƒ'LISTLANG DC.B ' ' ‰DC.B�'„'LISTDESC�DC.B�'Š' ‰DC.B�'Š' ‰DC.B�'Š' ‰DC.B�'Š' ‰DC.B�'Š'LISTDESE EQU *-1‰DS.W�0*"PROMPTM‚DC.B�'>�'‡PROMPT�CHARACTER*‰DS.W�0*PRTTOTM‚DC.B�'TOTAL�MODULES�'PRTTOTN‚DC.B�'„'PRTTOTME EQU *-1‰DS.W�0*INVMSGƒDC.B�'‚INVALID�'INV_XX: ‰DC.B†'CMD„' ‰DC.B†CR,LFINVMSGE‚EQU�*-1‰DS.W�0*X00100: ‰DC.B†'Š'*œSPACE�FOR�FILE�NAME‰DC.B†'IS�AN�INVALID�FILE�TYPE' ‰DC.B†CR,LFX00199:‚EQU‡*-1‰DS.W†0* ENTM…EQU�*‰DC.B�'ENTER�SOURCE�FILE�NAME‚' ENTME„EQU�*-1‰DS.W�0****‰DS.W�0 NOLIBMƒEQU�*‰DC.B�'LIBRARY�DOES�NOT�EXIST'NOLIBME‚EQU�*-1‰DS.W�0* MODMSGƒDC.B�'Œ'‚HOLD�MODULE�NAME*‰DC.B�'MODULE�NOT�FOUND'NOMODME‚EQU�*-1*‰DS.W�0 MODALMƒEQU�*‰DC.B�'MODULE‚'MODALMI‚DC.B�'Œ'‰DC.B�'ALREADY�IN�THE�LIBRARY'MODALME‚EQU�*-1‰DS.W�0* MODMISM‚EQU�*‰DC.B�'NO�MODULE�NAME'MODMISME‚EQU�*-1‰DS.W�0* INSM…EQU�**‰DC.B�'INSERT�AFTER�MODULE�NAME�NOT�FOUND' INSME„EQU�*-1‰DS.W�0* LIBFULM‚EQU�**‰DC.B�'**‚WARNING�DIRECTORY�WAS�FILLED�**'LIBFULME EQU *-1‰DS.W�0* INSENDM‚EQU�*!ééééééééF ééééééééééééééééG ééééééééééééééééG ééééééééééééééééH ééééééééééééééééH ééééééééééééééééI ééééééééééééééééI ééééééééééééééééJ ééééééééééééééééJ ééééééééééééééééK ééééééééééééééééK ééééééééééééééééL ééééééééééééééééL ééééééééééééééééM ééééééééééééééééM ééééééééééééééééN ééééééééééééééééN ééééééééééééééééO ééééééééééééééééO éééééééééééééééé