IMD 1.17: 11/11/2014 11:11:37 82VKXSVRDOS B* VERSADOS/RMS68K SRC/OBJ 4.4 (NOT BOOTABLE) SN=49367 11 0F 30  SR11q82VKXSVRDOS 0420¤h-qqROMIOI90AFqqROMIOI90SA¥qqSCTSASR AFqqSCTSASR SA((’qqSECURE AF99qqSECURE SABB;HqqSYSCNTRLAFƒƒqqSYSCNTRLSAŒŒpØqqUSM AFqqŠPAGEŠNOLISTŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.EXE.EQŠINCLUDE9995.&.NIO.EQŠINCLUDE9995.&.TR1.EQŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.FME.EQŠINCLUDE9995.&.FMI.EQŠLIST*‰INCLUDE9995.&.IOE.EQ*‰INCLUDE9995.&.EXE.EQ*‰INCLUDE9995.&.NIO.EQ*‰INCLUDE9995.&.TR1.EQ*‰INCLUDE9995.&.TR1RTCD.EQ*‰INCLUDE9995.&.FME.EQ*‰INCLUDE9995.&.FMI.EQ*ŠPAGE**FMS I/O MANAGEMENT* ŠSECTION0* *04/05/84 SCBD*‚CorrectedbuginthreeplacesinFIOM.‚AtlabelsGPTSAT,GPTDBand@*‚GPTSDBwehadBSRstoDOIO.‚WhentheseBSRswereexecuted,theE*‚IOSparameterblockindicated'I/Owait'.‚DOIO,howeverwasturningC*‚ontheproceedbit,makingan'I/Oproceed'outthecall.‚AteachC*‚ofthesepoints,BSRDOIOwasreplacedbyBSRDOIO2.‚AchangewasF*‚madeintheFUTYmodule(addedDOIO2entrypoint)whichwouldhandleF*‚theI/Oasan'I/Owait'asoriginallyintended.‚ThesymptomofthisE*‚bugwasasystemhangupwhenevermanytaskswereterminatedatthe9*‚sametimeandeachonrequiredtheloadingofTASKDUMP. *12/28/83 SCBC*‚CorrectedbugwhichcausedextraFABtobecreatedwhensplittingC*‚FABanddatablockonafullypackedfile.‚Correctioninthearea *‚ofCMBF10. ŠDC.Bƒ'FIOM'ŠDC.Lƒ'0405844'IOM‡IDNTƒ4,2FHSI/OMANAGE. ŠXDEFƒDIRDEL ŠXDEFƒDIRINS ŠXDEFƒDIRNME ŠXDEFƒDSNME ŠXDEFƒDSNXT ŠXDEFƒGETVIDŠXDEFƒGPTSEC6/24/83MLBŠXDEFƒISTAIERR ŠXDEFƒPUTALL ŠXDEFƒPUTALL2 ŠXREFƒC7ADDR ŠXREFƒCEADDR ŠXREFƒCHKAP ŠXREFƒCHKMA ŠXREFƒDOIO ŠXREFƒDOIO2 ŠXREFƒFATEND ŠXREFƒFATSTR ŠXREFƒFMSSTR ŠXREFƒFTL.EQ ŠXREFƒFTL.HI ŠXREFƒFTL.NE ŠXREFƒFTL.T ŠXREFƒSEGBLKO ŠXREFƒSEGBLKS ŠXREFƒSMOVE4 ŠXREFƒTDBLK ŠXREFƒVDTEND ŠXREFƒVDTSTRŠIFGTƒFMSLEVEL-1 XDEFƒDBCHG XDEFƒFABCHG XDEFƒFSALLC XDEFƒFSDEAL XDEFƒGETFDB XDEFƒPUTDAT XDEFƒRLNFAT XDEFƒRLNFT3 XDEFƒUPCFAB XREFƒATTIOBO XREFƒCALSEC XREFƒGETIOB XREFƒUPDEOFŠENDCŠIFEQƒFMSLEVEL-3 XDEFƒCMPRDB XDEFƒEXPNDB XDEFƒFNDKEY XDEFƒPUTKEYŠENDCŠPAGE](O0N8N@GHKPJX>`RhHpAx9€BˆAB˜E :¨M°R¸TÀ6È=ÐCØNàLèEðLø>FM !*CALBIT 1.00 6/18/79 L. STEINHOFF*B*CALBIT CALCULATES THS SAT SECTOR, MEMORY ADDR. AND BIT NO. IN THE+*…SATMEMORYBLOCKFORTHEREQUESTEDSECTOR**<*MEMORY ADDR. IS ON LONG WORD BOUNDARY TO ALLOW USE OF 'BIT'**…INSTRUCTIONSONREGISETERSUSING32BITS* *ON CALL:*…A6=VDTADDRESS*†A1=SECTORADDRESSREQUESTED *…BSRCALBIT* *ON RETURN:*…A6=UNCHANGED*…A1=UNCHANGED'*…A2=MEMORYADDRESSCONTAINGSECTORBIT*…A3=A1*†D0.L=0IFNOERROR,*…D0.B=ISTAALIFNOSATFORREQUESTEDSECTOR*‰=80+IFI/OERROR*ˆMEMORYBUFFER,*†D2.B=BITNO(0-31)CORRESPONDINGTOSECTOR0*…D6=LONGWORDFROMMEMORYCONTAININGSECTORBIT*…Z=1IFNOERROR *†=0IFERROR** CALBIT„EQU„*<*GET SECTOR IN MEMORY THAT CONTAINS BIT FOR REQUESTED SECTOR ŠMOVE.LA1,A3 ŠMOVE.LA1,D2ŠDIVUƒ#2048,D25*D2.W=RELATIVE SECTOR IN SAT. MAKE SURE NOT TOO LARGEŠCMP.W‚VDTVID+VIDSAL(A6),D2ŠBCS.S‚CALB10SECTORINRANGE0ŠMOVE.L#NL+ISTAAL,D0†FILESPACEALLOC.CONFLICT CALBRT„RTSCALB10„MOVE.LA1,-(A7)*ŠMOVE.LVDTVID+VIDSAT(A6),A1GETSATSTART"ŠADD.W‚D2,A1ŽGETPSNOFSATSECTOR ŠBSR„GETSAT"ŠMOVE.L(A7)+,A1‹RESTOREA1SECTOR#ŠBNE.S‚CALBRTMAKEI/OERRORRETURN8*USE REMAINDER (0-2047) OF PREVIOUS DIVISON TO DETERMINE*…MEMORYADDR. ŠCLR.W‚D2ŠSWAPƒD2‘D2.L=REMAINDER ŠMOVE.LD2,D0'ŠLSR.L‚#5,D0ŽDIVIDEBY32TOGETOFFSETŠLSL.L‚#2,D0ŽMULTIPLYBY4,ŠMOVE.LVDTSMA(A6),A2†GETSTARTOFSATINA2ŠADD.L‚D0,A2ŽADDOFFSET*NOW CALCULTE BIT WITHIN WORDŠMOVE.L#$1F,D0&ŠAND.L‚D0,D2ŽSAVELOW4BITSASMOD32)ŠSUB.B‚D0,D2ŽFORCEMSBTOBEBITCOUNT15 ŠNEG.B‚D2ŠMOVE.L(A2),D6ŒGETDATAINREG ŠCLR.L‚D0ŠRTSŠPAGE!*DSALLC 1.00 6/18/79 L. STEINHOFF*.*DSALLC ALLOCATES THE REQUESTED NO. OF SECTORS* *ON CALL:*…A6=VDTADDRESS*…A4=FATADDR.(=0IFNONE)*…D1=NO.OFSECTORS *†BSRDSALLC* *ON RETURN:*…A6=UNCHANGED"*…A1=STARTINGSECTORFORALLOCATED*†D0.L=0IFNOERROR)*ˆD0.B=ISTAIDSIFINSUFFICIENTDISKSPACE *‰=ISTAALIF0SECTORSREQUESTED*ˆ=8O+IFI/OERROR*…D1=NOOFSECTORSALLOCATED*…Z=0IFNOERROR *†=1IFERROR***INDENTED LIST9* DSALLC ALLOCATES REQUESTED NUMBER OF SEQUENTIAL SECTORS!*DSALLC PASS-PSN AND-SECTOR COUNT* FIND AND-MARK SECTORS' BITS!*‚CALL$CALBIT,$CHKBITS,$NXTBIT* SPACE FOUND? *‚NO,RETURNINSUFFICDISK-SPACE!*‚YES,RETURNPSN-ANDSECTORCOUNT*INDENTED LIST END* DSALLC„EQU„* ŠTST.L‚D1 ŠBNE.S‚DSAL05ŠMOVE.L#NL+ISTAAL,D0ŠRTS DSAL05„EQU„*ŠMOVEM.LA2-A3/A5/D2-D6,-(A7)ŠMOVE.LD1,D5ŽSAVESECTORCOUNT*.*ˆTRYTOALLOCATESPACEINSATBLOCKINMEMORY8*ˆ1ST,THENCONTINUETOENDANDWRAPAROUNDIFNECESSARY+ŠMOVE.LVDTSMB(A6),D0†SATSECTORINMEMORY?ŠBNE.S‚DSAL80YES***NO - START AT BEGINNING**SET A5=END OF SAT+1ŠMOVE.LVDTVID+VIDSAT(A6),A5ŠADD.W‚VDTVID+VIDSAL(A6),A5 DSAL41„EQU„*ŠSUB.L‚A1,A1ŽSETA1=0"ŠBSR„CALBITGETCORRECTSATSECTOR&DSAL42„CLR.L‚D3‘0COUNTFORTHISBLOCK7*IF SAT SECTOR IS BEYOND WHERE 1ST SEARCH STARTED, STOPŠCMP.L‚VDTSMB(A6),A5ŠBLS.S‚DSAL72ALLDONE-NOSPACE,ŠMOVE.LA3,A1ŽSAVEPOTENTIALSTARTOFAVAIL.&ŠBSR„CHKBITSŒSTARTOFAVAILABLEBLOCK?'ŠBCS.S‚DSAL60NOSEARCHFORAVAILBLOCKDSAL44„CMP.L‚D3,D5ŠBLS.S‚DSAL25SPACEFOUND!ŠBSR.S‚NXTBITGETNEXTSECTORBIT ŠBNE.S‚DSAL50 ŠBSR„CHKBITS ŠBCS.S‚DSAL50 ŠBRA.S‚DSAL44*2*ˆAVAILABLESPACEEXISTSWHEREREQUESTEDMARKBITS *ˆALLOCATED*ˆA1=STARTINGADDR.*ˆD5=NO.OFBITSTOALLOCATE* DSAL25„EQU„*!ŠMOVE.LD5,D1ŽSAVENO.OFSECTORS+ŠBSR„CALBITCALCULATEBIT/OFFSETFORSECTORŠBNE.S‚DSALRTRETURNERROR%DSAL28„BSETƒD2,D6ŽSETAPPROPRIATEBIT.ŠBSETW‚#VDFLSB,VDTFLG(A6)SETSATCHANGEDFLAGŠSUB.L‚#1,D5ŽDONE?ŠBEQ.S‚DSAL30YESŠBSR.S‚NXTBITNO-GETNEXTBITŠBRA.S‚DSAL28CONTINUEDSAL30„MOVE.LD6,(A2)ŠCLR.L‚D0‘SETGOODRETURNFLAGSŠBRA.S‚DSALRTRETURN*,*DON'T GO ON IF AT END OF BLOCK OR I/O ERRORDSAL50„CMP.B‚#ISTAAL,D0ŠBEQ.S‚DSAL72DONE ŠTST.B‚D0ŠBNE.S‚DSALRTI/OERROR DSAL60„BSR.S‚NXTBITGETNEXTBITŠBEQ.S‚DSAL42GETNEXTBIT ŠCMP.B‚#ISTAAL,D0ŠBNE.S‚DSALRTI/OERROR$*MAKE INSUFFICIENT DISK SPACE RETURNDSAL72„MOVE.L#NL+ISTAIDS,D01DSALRT„MOVEM.L(A7)+,D2-D6/A2-A3/A5RESTOREREGS.ŠRTS DSAL80„EQU„*&ŠMOVE.LD0,A5ŽSAVESTARTINGSATSECTORŠSUB.L‚VDTVID+VIDSAT(A6),D0ŠMULUƒ#2048,D04*A1=1ST SECTOR CORRESPONDING TO SAT SECTOR IN MEMORY ŠMOVE.LD0,A1 ŠBSR„CALBIT&DSAL82„CLR.L‚D3‘0COUNTFORTHISBLOCK2ŠMOVE.LA3,A1ŽSAVEPOTENTIALSTARTOFAVAIL.BLOCKŠBSR.S‚CHKBITS$ŠBCS.S‚DSAL90NOTSTARTOFNEWBLOCKDSAL84„CMP.L‚D3,D5ŠBLS„DSAL25SPACEFOUND!ŠBSR.S‚NXTBITGETNEXTSECTORBIT ŠBNE.S‚DSAL86ŠBSR.S‚CHKBITS ŠBCS.S‚DSAL86 ŠBRA.S‚DSAL84,*DON'T GO ON IF AT END OF BLOCK OR I/O ERRORDSAL86„TST.B‚D0*ŠBNE„DSAL41GOLOOKFORSPACEATBEGINNINGDSAL90„BSR.S‚NXTBIT ŠBEQ.S‚DSAL82*ŠBRA„DSAL41GOLOOKFORSPACEATBEGINNINGŠPAGE!*NXTBIT 1.00 6/18/78 L. STEINHOFF*+*NXTBIT SETS SECTOR BIT POINTER TO NEXT BIT* *ON CALL:*…A6=VDTADDRESS"*…A2=MEMORYADDRESSOFCURRENTBIT%*…A3=SECTORADDRCORRESPONDINGTOBIT*†D2.L=BITNOFORSECTOR-*…D6=LONGWORDCORRESPOTODINGINMEMORYADDR. *…BSRNXTBIT* *ON RETURN:*…Z=1IFNOERROR *†=0IFERROR*…D0.B=0IFNOERROR*‰=ISTAALIFATENDOFSAT*‰=80+IFI/OERROR*…A6-UNCHANGED,*…A2=A2+4ONLYIFD2.BWAS0,ELSEUNCHANGED *…A3=A3+1&*…D2.L=31IFPASSEDVALUD=0,ELSE=D2-1:*…D6=LONGWORDCORRESPONDINGTOMEMORYADDR.IFA2CHANGED'*…CARRY=0IFNOTATENDOFMEMORYBLOCK*ˆ=1IFNOMOREBITSTOCHECK* NXTBIT„EQU„*!ŠADD.L‚#1,A3ŽINCREMENTSECTORNO.ŠTST.B‚D2‘BITNO.=0?ŠBNE.S‚NXTB20NOŠMOVE.LD6,(A2)ŒSAVELONGWORDŠTST.L‚(A2)+ŽPOINTTONEXTWORD*ŠCMP.L‚VDTSMD(A6),A2†BEYONDENDOFMEMORY?ŠBLS.S‚NXTB10NO(*YES-SEE IF ANOTHER SECTOR IN SAT EXISTSŠMOVE.LA1,-(A7)‹SAVEA1!ŠMOVE.LA3,A1ŽA1=REQUESTEDSECTOR ŠBSR„CALBITŠMOVE.L(A7)+,A1ŠRTSNXTB10„MOVE.L#31,D2BITNO=31 ŠMOVE.L(A2),D6ŒGETDATAINREG.NXTB15„CLR.L‚D0ŠRTS#NXTB20„SUB.B‚#1,D2ŽBITNO=BITNO-1 ŠBRA.S‚NXTB15ŠPAGE3*CHKBITSCHECKSFORAVAILABLEBITINSAT.‚IFBITISA*…ONLONGWORDBOUNDARYAND32BITSARE0,THEYAREALLRETURNED.*…SAMEIFWORDORBYTEBOUNADRY6*A NOT FOUND RETURN CAN BE MADE FOR MULITPLE BITS ALSO* *ON CALL: *…A2=MEMORYADDR.OFCURRENTBIT-*…A3=PSNCORRESPOONDINGTOBIT(NOTIFCALLED-*ˆFROMATTEMPTTOALLOOATEATSPECIFIADDR.))*…A6=VDTADDR.!*†D2=BITNO.CORRESPONDINGTOPSN(*…D3=NO.OFCONTIGUOUSAVAILABLESECTORS.*…D6=LONGWORDATMEMORYLOC.POINTEDTOBYA2* *ON RETURN:%*…CARRY=0IFBIT=0(SECTORAVAILABLE) *…CARRY=1IFBIT=1(UNAVAILABLE)*†A2=UNCHANGED8*…A3=PSNCORRESPONDINGTOLASTBITOFGROUP(32,16,OR8)*…A6=UNCHANGED+*…D2=BITCORRESPONDINGTOLASTBITOFGROUP&*…D3=D3+NO.OFAVAILABLESECTORSFOUND*…D6=UNCHANGED CHKBITSƒEQU„*(ŠCMP.B‚#31,D2ATBEGINNINGOFLONGWORD?ŠBNE.S‚CHKB30NO *YES-SEE IF 32 SECTORS AVAILABLE ŠTST.L‚D6 ŠBEQ.S‚CHKB108*IF ENTIRE 32 BITS IS UNAVAILABLE, MAKE NOT FOUND RETURN*…BPUTPOINTTOBIT0ŠCMP.L‚#$FFFFFFFF,D6ŠBNE.S‚CHKB50NOTALLUNAVIL.*32, 16, OR 8 BITS UNAVAIL.#CHKB05„ADD.L‚D2,A3ŽSETTOBIT0PSNŠCLR.L‚D2‘SETFORBIT0ŠBRA.S‚CHKBERMAKEERROR1*YES-UPDATE COUNTS BASED ON 32 OR 16 OR 8 SECTORSCHKB10„ADD.L‚D2,D3+ŠADD.L‚D2,A3ŽSETA3TOCORRESPOINDTOBIT0ŠCLR.L‚D2‘SETBITNO.TO0#CHKBRT„ADD.L‚#1,D3ŽD3=D3+32(OR16)ŠAND.B‚#$FE,SRŒMAKEGOODRETURNŠRTS*SEE IF AT BEGGINING OF WORDCHKB30„CMP.B‚#15,D2"ŠBNE.S‚CHKB40NOTONWORDBOUNDARYŠTST.W‚D6‘16SECTORSAVAILABLE?ŠBEQ.S‚CHKB10YES%ŠCMP.W‚#$FFFF,D6ŠALL16BITSUNAVAIL?ŠBEQ.S‚CHKB05YES ŠBRA.S‚CHKB50*SEE IF AT BEGINNING OF BYTECHKB40„CMP.B‚#7,D2ŠBNE.S‚CHKB50NOŠTST.B‚D6‘8SECTORSAVAILABLE?ŠBEQ.S‚CHKB10YESŠCMP.B‚#$FF,D6Œ8BITSUNAVAIL.?ŠBEQ.S‚CHKB05YES-*NOT ON LONG WORD, WORD, OR LOW BYTE BOUNADRY*…MUSTCHECKBITCHKB50„BTSTW‚D2,D6 ŠBEQ.S‚CHKBRTCHKBER„OR.Bƒ#1,SRŠRTSŠPAGE!*DSDEAL 1.00 6/19/79 L. STEINHOFF*.*DSDEAL DEALLOCATES THE REQUESTED SECTOR BLOCK* *ON CALL: *…A6=VDTADDRESS&*„A1=SECTORSTARTINGADDRESSFORBLOCK*…A4=FATADDR.(=0IFNONE)*…D1=LENGTHOFSEGMENT *…BSRDSDEAL* *ON RETURN:*…A6=UNCHANGED*…A1,D1=ALTERED*…D0.L=0IFNOERROR-*‰=ISTAALIFFILESPACEDEALLOCATIONCONFLICT3*Œ(D1=0ORSECTORSBEINGDE-ALLOCATEDNOTINRANGE)*ˆ=80+IFI/OERROR*/*DSDEAL MAKES SURE SECTOR BLOCK PASSED IS VALID9*…FORDISK(BASEDONDCBINFO.).‚IFNOERRORISDETECTED,B*†THECORRESPONDINGBITSARECLEAREDANDTHESATMARKEDASCHANGED0*‡IFTHESECTORRANGEISINVALID,THESATISNOT *…EFFECTED**INITIALLY SAT IS ONLY 1 SECTOR**INDENTED LIST;* DSDEAL DEALLOCATES REQUESTED NUMBER OF SEQUENTIAL SECTORS!*DSDEAL PASS-PSN AND-SECTOR COUNT* FIND AND-MARK SECTORS' BITS*‚CALL$CALBIT,$NXTBIT* RETURN*INDENTED LIST END* DSDEAL„EQU„*ŠMOVEM.LD2/D6/A2-A3,-(A7)+*MAKE SURE SECTOR RANGE IS VALID FOR DEVICE#ŠMOVE.LVDTDCB(A6),A2†GETDCBADDR.ŠCMP.L‚DCBSEC(A2),A1!ŠBCS.S‚DSDE08STARTINGADDR.OKAY5DSDE05„MOVE.L#NL+ISTAAL,D0†MAKEINVALIDSECTORRANGEŠBRA.S‚DSDERTRETURNDSDE08„MOVE.LA1,A3 ŠADD.L‚D1,A3ŽGETENDINGSECTOR+1'ŠCMP.L‚DCBSEC(A2),A3†MAKESUREINRANGEŠBHI.S‚DSDE05ERROR ŠTST.L‚D1ŠBEQ.S‚DSDE05ERROR-LENGTH=0E*CONVERT SECTOR ADDRESS TO OFFSET/BIT AND READ SAT SECTOR INTO MEMORY ŠBSR„CALBIT ŠBEQ.S‚DSDE152DSDERT„MOVEM.L(A7)+,A2-A3/D2/D6MAKEERRORRETURNŠRTS#*NOW CLEAR BITS FOR BLOCK SPECIFIEDDSDE15„BCLRƒD2,D6.ŠBSETW‚#VDFLSB,VDTFLG(A6)INDICATESATCHANGED ŠSUB.L‚#1,D1ŠBEQ.S‚DSDE25ALLDONEŠBSR„NXTBITPOINTTONEXTBIT ŠBNE.S‚DSDERT ŠBRA.S‚DSDE15DSDE25„MOVE.LD6,(A2)ŠCLR.L‚D0‘INDICATENOERRORŠBRA.S‚DSDERTANDRETURNŠPAGE!*GETSAT 1.00 6/15/79 L. STEINHOFF*+*GETSAT READS THE REQUESTED SAT INTO MEMORY*IF REQUESTED BLOCK IS'*ALREADY IN MEMORY, NO I/O IS PERFORMED1*IF I/O ERROR OCCURS, BLOCK IN MEMORY IS SET TO 0 *ON CALL:*…A6=ADDRESSOFVDTENTRY#*…A1=ADDRESSOFREQUESTEDSATBLOCK *…BSRGETSAT* *ON RETURN:*…A6=UNCHANGED*…A1=UNCHANGED*…D0.L=0IFNOERROR*‡DO.B=80+IFI/OERROR*…Z=1IFNOERROR *†=0IFERROR* GETSAT„EQU„*ŠMOVE.LA0,-(A7)‹SAVEREGISTER(ŠCMP.L‚VDTSMB(A6),A1†ISBLOCKINMEMORY?ŠBEQ.S‚GETS20YES&*READ REQUESTED SAT INTO MEMORY BUFFER9ŠBSR.S‚PUTSATŒUPDATECURRENTSATONDISKFIRSTIFCHANGEDŠBNE.S‚GETS30IOERRORŠMOVE.LA1,D0ŽSETUPPSN4ŠCLR.L‚VDTSMB(A6)‰0BLOCKINMEMORYUNTILAFTERREADBŠSETFO‚IOREAD,IOPRAN+IOPIMG+IOPWAT,VDTIOS(A6)SETFUNCTION,OPTIONSŠBSR.S‚GPTSATREADBLOCKIN ŠBNE.S‚GETS30DISKERRORONREAD&ŠMOVE.LA1,VDTSMB(A6)†SAVESATADDRESS&GETS20„CLR.L‚D0‘RESTORECONDITIONCODE'GETS30„MOVE.L(A7)+,A0‹RESTOREREGISTERŠRTS**GPTSAT„MOVE.LD0,VDTIOS+IOSRRN(A6)SETPSN5ŠMOVE.LVDTSMA(A6),VDTIOS+IOSSAD(A6)STARTINGADDRESS3ŠMOVE.LVDTSME(A6),VDTIOS+IOSEAD(A6)ENDINGADDRESS ŠBSR„DOIO2ŠRTSŠPAGE!*PUTSAT 1.00 6/15/79 L. STEINHOFF*2*PUTSAT WRITES THE SAT CURRENTLY IN MEMORY TO DISKA*IF NO BLOCK IN MEMORY OR CHANGE FLAG NOT SET, REQUEST IS IGNORED* *ON CALL:*…A6=ADDRESSOFVDTENTRY *…BSRPUTSAT* *ON RETURN:*…A6=UNCHANGED*…D0.L=0IFNOERROR*ˆD0.B=8O+IFI/OERROR3*ˆ=ISTAIEIFCHANGEFLAGSETBUTNOBLOCKINMEMORY*ˆZ=1IFNOERROR *ˆ=0IFERROR* *REGISTERS USED: 0 1 2 3 4 5 6 7*ŠD*ŠA…P*&*PUTSAT USES INFORMATION IN VDT PASSED*G*COMMENTS INITIALLY SAT IS ONLY 1 SECTOR SO PUTSAT DOESNT HAVE TO WORRY$*…ABOUTVARIABLESECTORBLOCKUPDATE* PUTSAT„EQU„*ŠMOVE.LA0,-(A7)‹SAVEREGISTER$ŠCLR.L‚D0‘CLEARINCASECALLIGNORED*ŠBTSTW‚#VDFLSB,VDTFLG(A6)CHANGEFLAGSET?ŠBEQ.S‚PUTS20NO,IGNORECALL$ŠMOVE.LVDTSMB(A6),D0†SATINMEMORY?ŠBNE.S‚PUTSIE.1‹YES,OKŠBSR„ISTAIERR‹NO,ERRORŠBRA.S‚PUTS20ERRORRETURN*SET UP TO WRITE SAT TO DISK%*DO WRITE WITH WAIT FOR RANDOM, IMAGE5PUTSIE.1‚SETFO‚IOWRIT,IOPRAN+IOPIMG+IOPWAT,VDTIOS(A6)ŠBSR.S‚GPTSATWRITESAT!ŠBNE.S‚PUTS20ERRORFROMI/OCALL+ŠBCLRW‚#VDFLSB,VDTFLG(A6)CLEARCHANGEFLAG ŠTST.L‚D0PUTS20„MOVE.L(A7)+,A0ŠRTSŠPAGE* !*GETVID 1.00 6/28/79 L. STEINHOFF*,*GETVID READS VID FROM DISK AND MOVES TO VDT* *ON CALL:*…A6=ADDRESSOFVDTENTRY *…BSRGETVID* *ON RETURN:*…Z=1IFNOERROR *†=0IFERROR*…A6=UNCHANGED*…D0.L=0IFNOERROR*…D0.B=80+IFI/OERROR/*‰=FSTAVOLIFFOREIGNDISKORDUPLICATEOR0OR!*SPACESVOLUMEID(VOLUMEERROR)*0*GETVID READS VID INTO FMS BUFFER AND THEN MOVES*…DATATOVDTUNLESSERROR(*…IFERROR,VOLUMEIDINVDTISSETTO0* GETVID„EQU„*&ŠMOVEM.LD1/A0-A2,-(A7)„SAVEREGISTERS.*SET UP TO DO READ WITH WAIT FOR RANDOM, IMAGE ŠMOVE.L#VIDDA,D0ŠSECTORTOREADŠMOVE.L#IOREAD,D1‰READ4ŠBSR.S‚GPTSECREADINSECTORTOTEMPORARYVIBBUFFERA*NotethefollowingclearinstructionmustfollowtheBSR‚GPTSECC*ƒinordertoavoidclearingtheVIDandthenrespondingtoanotherD*ƒeventpriortocomingbackfromGPTSEC.‚ThisinstructionwasmovedB*ƒon10/11/83bySCB.‚tosolveaproblemofmountingtwodiskettesE*ƒwiththesamevolumeIDandhavingthe1stonemountedbecomingthe.*ƒforeigndiskinsteadofthe2ndonemounted.5ŠCLR.L‚VDTVID+VIDVOL(A6)‚0VOLUMEIDINCASEOFERROR"* A1 POINTS TO SECTOR JUST READ IN.ŠTST.B‚D0‘TestI/Oreturnstatus10/11/83SCB.!ŠBNE.S‚GETVRTRETURNIFI/OERROR1*DETERMINE IF VOLUME ID CONTAINS MACSS INIT. DATAŠCMP.L‚#MACSCDE1,VIDMAC(A1)ŠBNE.S‚GETV20FOREIGNDISKŠCMP.L‚#MACSCDE2,VIDMAC+4(A1)ŠBNE.S‚GETV20FOREIGNDISK*SEE IF VOLUME ID IS VALID#ŠMOVE.LVIDVOL(A1),D0†GETVOLUMEIDŠBEQ.S‚GETV20ERRORSINCEID=0ŠCMP.L‚#'„',D0#ŠBEQ.S‚GETV20ERRORSINCEID=SPACES%*ERROR IF VOLUME ID=ANOTHER VOLUME ID$*…OR=RANDOMACCESSDEVICEMNEMONICŠMOVE.LVDTSTR,A0!GETV05„CMP.L‚VDTVID+VIDVOL(A0),D0ŠBEQ.S‚GETV20DUPLICATE-ERROR#ŠMOVE.LVDTDCB(A6),A2†GETDCBADDR.)ŠCMP.L‚DCBAID(A2),D0†DEVICEID=VOLUMEID?ŠBEQ.S‚GETV20YES-ERROR!ŠLEA„VDTLEN(A0),A0†GETNEXTENTRYŠCMP.L‚VDTEND,A0ŠDONE?ŠBLS.S‚GETV05NO*VOLUME ID LOOKS GOOD*MOVE VID TO VDTŠLEA„VDTVID(A6),A0)ŠMOVE.L#VIDEOD/2,D0‡NO.OFBYTESTOMOVEGETV10„MOVE.W(A1)+,(A0)+ŠDCNTƒD0,GETV10ŠCLR.L‚D0‘SETGOODRETURNFLAGS/GETVRT„MOVEM.L(A7)+,D1/A0-A2„RESTOREREGISTERSŠRTS$GETV20„MOVE.L#FSTAVOL,D0ˆVOL.ERROR ŠBRA.S‚GETVRTŠPAGE*&*ˆ**************************************ŒGPTSEC‚1.00‚10/15/79‚HBN6*&*ˆ*************************************?*‚GPTSECREADS/WRITESONESECTORFROM/TODISKFORTEMPORARYUSE%*ˆTEMPORARYVIB-SECTOR-BUFFERISUSED* *‚ONCALL:*ˆA6=VDTADDRESS*ˆD0=PSNOFSECTORTOBEREAD'*ˆD1=IOSCOMMANDCODE(READORWRITE)* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD1-UNKNOWN*ˆA1=TEMPORARYBUFFERADDR.*ˆD0.L=0IFNOERROR"*ˆD0.B=80+IFERRORFROMIOCALL*ˆZ=1IFNOERROR *Œ0IFERROR4*VDTFLG-VDFLTB SET TO INDICATE TEMPORARY BUFFER USED* GPTSEC„EQU„**ŠMOVE.LA0,-(A7)‹SAVEREGISTERS4ŠBSETW‚#VDFLTB,VDTFLG(A6)SETTEMP.BUFFERUSEDFLAGŠMOVE.LVDTTMA(A6),A0ŠMOVE.LVDTTME(A6),A19ŠSETRFOD1,IOPIMG+IOPRAN,VDTIOS(A6)SETFUNCTION,OPTIONS4ŠSETSBAD0,A0,A1,VDTIOS(A6)PSN,BUFFERSTARTANDENDŠMOVE.LA0,A1ŽRETURNA1 ŠBSR„DOIO"ŠMOVE.L(A7)+,A0‹RESTOREREGISTERSŠRTSŠPAGE!*PUTVID 1.00 6/28/79 L. STEINHOFF**PUTVID UPDATES VID ON DISK* *ON CALL:*…A6=ADDRESSOFVDTENTRY *…BSRPUTVID* *ON RETURN:*…Z=1IFNOERROR *†=0IFERROR*…A6=UNCHANGED*…D0.L=0IFNOERROR*ˆD0.B=80+IFI/OERROR*D*PUTVID READS VID INTO TEMP BUFFER AND THEN MOVES FMS DATA TO BUFFER*…ANDWRITESTODISK* PUTVID„EQU„*&ŠMOVEM.LA0-A1/D1,-(A7)„SAVEREGISTERS>*READ VID INTO TEMPORARY BUFFER AND THEN OVERLAY WITH FMS DATAŠMOVE.L#VIDDA,D0ŠMOVE.L#IOREAD,D13ŠBSR„GPTSECA1RETURNSPOINTINGTOSECTORJUSTREAD ŠBNE.S‚PUTV20ŠLEA„VDTVID(A6),A1ŠMOVE.LVDTTMA(A6),A0)ŠMOVE.L#VIDEOD/2,D0‡NO.OFBYTESTOMOVEPUTV10„MOVE.W(A1)+,(A0)+ˆSAVEŠDCNTƒD0,PUTV10*MUST CALCULATE CHECKSUM"ŠMOVE.LVDTTMA(A6),A0†STARTOFVIDŠMOVE.LVDTTME(A6),A1†ENDŠCLR.W‚VIDCHK(A0)‰ZEROCHECKSUMŠMOVE.L#$FFFFFFFF,D0PUTV15„MOVE.B(A0)+,D1  ŠEOR.B‚D1,D0ŠSWAPƒD0ŠMOVE.B(A0)+,D1 ŠEOR.B‚D1,D0ŠSWAPƒD0ŠCMP.L‚A1,A0ŽDONEALLBYTES?ŠBLS.S‚PUTV15NO'ŠMOVE.LVDTTMA(A6),A0†YES-SAVECHECKSUMŠMOVE.BD0,VIDCHK(A0)ŠSWAPƒD0ŠMOVE.BD0,VIDCHK+1(A0)A*DATA IS NOW IN VID BUFFER WITH UNUSED PORTION ZERO-WRITE TO DISK"ŠMOVE.L#VIDDA,D0ŠWRITEVIDSECTOR%*DO WRITE WITH WAIT FOR RANDOM, IMAGEŠMOVE.L#IOWRIT,D1‰WRITEŠBSR.S‚GPTSECWRITE/PUTV20„MOVEM.L(A7)+,A0-A1/D1„RESTOREREGISTERSŠRTSŠPAGE* *DSNME 1.00 6/25/79 L. STEINHOFF*?*DSNME SEARCHES THE DIRECTORIES FOR THE REQUESTED FILE NAME; IF4*FOUND ITS DIRECTORY ENTRY INFO. IS RETURNED ELSE AN *ERROR OCCURS* *ON CALL:*„A6=VDTADDRESS*„A2=ADDRESSOFFCB-LIKEBLOCK*…A4=FATADDR.(=0IFNONE) *„BSRDSNME* *ON RETURN:*„Z=1IFNOERROR *…=0IFERROR*„D0.L=0IFNAMEFOUND(*ˆD0.B=FSTANNMIFNON-EXISTENTFILENAME*ˆ=80+IFIOERROR7*ALLOTHERREGISTERSAREPRESERVEDUNLESSA"NOT‚FOUND"D*RETURN IS MADE; IN THAT CASE, THE FOLLOWING REGISTERS ARE RETURNED:*D*„D6=PSNOFFIRSTPRIMARYDIRECTORYBLOCKWITHEMPTYSLOTIFCATALOG@*†=PSNOF1STSECONDARYDIR.BLOCKWITHEMPTYSLOTIFNOCATALOG*†=0IFNONEOFTHEABOVE:*„D7=PSNOFLASTPRIMARYDIRECTORYBLOCKIFCATALOGEXISTS7*†=PSNOFLASTSECONDARYDIRBLOCKIFNOCATALOGEXISTS*†=0IFNONEOFTHEABOVE*„D1.W=OFFSETOFEMPTYSLOTB*„D1BITS31-16=0IFCATALOGFOUNDBUTFILENAMENOT(D0=FSTANNM)-*=-1IFNOCATALOGENTRYEXISTS(D0=FSTANNM)*0*THE FOLLOWING INFORMATION IS PASSED IN THE FCB:*„VDTENTRYADDRESS *„USERNO.*„CATALOGNAME *„FILENAME *„EXTENSION1*THE FOLLOWING INFORMATION IS RETURNED IN THE FCB*„ALLDIRECTORYINFO.*„SECONDARYDIR.DISKADDRESS*„SECONDARYDIR.BLOCKOFFSET*„DIRBLOCKDISKADDRESS*„DIR.BLOCKOFFSET**INDENTED LIST(* DSNME SEARCHES FOR REQUESTED FILE NAME*DSNME PASS-FILE NAME-IN FCB* FIND CATALOG#*‚SECONDARYDIR-SEARCHCALL$GETSDB* FIND FILE NAME *‚PRIMARYDIR-SEARCHCALL$GETDB * FILE FOUND?!*‚NO,RETURN-1STEMPTY-SLOTFOUND*‚YES,RETURNDIRECTORYENTRY*INDENTED LIST END* DSNME…EQU„**/ŠMOVEM.LA0/A1/A3/A5/D2-D5,-(A7)SAVEREGISTERSŠMOVEM.LD6-D7/D1,-(A7)*'*ˆINITIALIZENOTFOUNDRETURNREGISTERS* ŠCLR.L‚D1 ŠCLR.L‚D6 ŠCLR.L‚D77ŠMOVE.LVDTVID+VIDSDS(A6),D0ARETHEREANYDIR.BLOCKS?ŠBNE.S‚DSNM10YES*;*ˆNOSECONDARYDIRECTORYBLOCKSEXIST-MAKENOTFOUNDRETURN*DDSNMNC„MOVE.WD1,D0ˆSETD1='-1,OFFSET'FORNOCATALOGENTRYFOUND ŠCLR.L‚D1‘.ŠSUB.L‚#1,D1Ž.ŠMOVE.WD0,D1Ž.5DSNMNF„LEA„12(A7),A7ŠREMOVESAVEDD6,D7+D1FROMSTACKŠMOVE.L#FSTANNM,D04DSNMRT„MOVEM.L(A7)+,D2-D5/A1/A3/A5/A0RESTOREREGS.ŠRTS*-*ˆSEARCHFORUSER#/CATALOGNAMEINSDBCHAIN*DSNM10„CLR.L‚D4‘CLEARFLAGS ŠCLR.L‚D5$ŠMOVE.LVDTSDA(A6),A0†SDBBUFFERFWA&ŠMOVE.LVDTSDB(A6),D2†ASDBINMEMORY?%ŠBEQ.S‚DSNM20NO,GOGETFIRSTONEIN(ŠCMP.L‚D2,D0ŽISCURRENTSDBTHE1STONE?@ŠBEQ.S‚DSNM25…YES,D4=0ASAFLAGFORSEARCHBEGINSFROM1STSDBBŠMOVE.LD2,D5„SAVECURRENTSBD'SPSNTOSKIPITLATERIFNECESSARY$ŠMOVE.L(A0),A3ŒANDSAVEIT(SDBFPT)CŠSUB.L‚#1,D4‚SETFLAGFORSEARCHSTARTSINTHEMIDDLEOFTHECHAINN ŠBRA.S‚DSNM255DSNM20„MOVE.LD0,A1ŽGETTHEREQUESTEDSDBINTOMEMORYDSNM21„BSR„GETSDBŠBNE„DSNMERIOERROR1DSNM25„MOVE.L#SDBSTR-SDBLEN,D0‚INITIALIZEOFFSET)DSNM30„ADD.W‚#SDBLEN,D0‰NEXTENTRYOFFSET%ŠLEA„0(A0,D0),A1ˆA1->NEXTSDBENTRY%ŠCMP.L‚VDTSDE(A6),A1†ENDOFTHISSDB?ŠBCC.S‚DSNM40YESŠTST.L‚SDBPDP(A1)‰EMPTYENTRY?ŠBEQ.S‚DSNM55YES-SKIP1ŠMOVE.L#(USNLEN+CLGLEN)/2,D2WORDCOUNTTOMATCH?ŠLEA„FCBSDB+SDBUSN(A2),A5A5->USER#/CATALOGNAMETOBEFOUND ŠIFNEƒSDBUSN:ŠADD.L‚#SDBUSN,A1‰A1->USER#/CATALOGNAMEINCURRENTENTRYŠENDC DSNM35„CMPM.W(A1)+,(A5)+ˆMATCH?ŠBNE.S‚DSNM30NOŠDCNTƒD2,DSNM35**ˆFOUNDCATALOGENTRYFORFILE*5ŠMOVE.LVDTSDB(A6),FCBSDBP(A2)SAVECATALOG'SSDBPSN9ŠMOVE.WD0,FCBSDBO(A2)…SAVEOFFSETOFCATALOGENTRYFOUNDAŠCLR.L‚D1„RESETNOTFOUNDREGISTERSFORNO-FILE-NAME-FOUNDRETURN  ŠCLR.L‚D6 ŠCLR.L‚D73ŠBRA.S‚DSNM60GOSEARCHPDBCHAINFORTHEFILENAME**ˆSETUPTOSEARCHNEXTSDB*:DSNM40„TST.L‚D4‘SEARCHSTARTEDINMIDDLEOFTHESDBCHAIN?ŠBNE.S‚DSNM45YES4DSNM41„MOVE.L(A0),D0ŒNO,ENDOFSDBCHAIN?(SDBFPT))ŠBEQ.S‚DSNM48YES,NOCATALOGENTRYFOUND ŠBRA.S‚DSNM20GOSEARCHNEXTSDB*…IFREQUESTEDBLOCKISALREADYINMEMORY,NOI/OISPERFORMED8*…UPDATEDIRBLOCKCURRENTLYINMEMORYIFITHASCHANGED2*…IFI/OERROROCCURS,BLOCKINMEMORYISSETTO0* *ON CALL:*…A6=ADDRESSOFVDTENTRY$*…A1=ADDRESSOFREQUESTEDDIR.BLOCK *…BSRGETDB* *ON RETURN:*…A6=UNCHANGED*…A1=UNCHANGED*…D0.L=0IFNOERROR*ˆD0.B=80+IFI/OERROR*…Z=1IFNOERROR *†=0IFERROR** GETDB USES VDT* GETDB…EQU„*ŠMOVE.LA0,-(A7)‹SAVEREGISTER(ŠCMP.L‚VDTDMB(A6),A1†ISBLOCKINMEMORY?ŠBEQ.S‚GETD20YES&*READ REQUESTED DIR INTO MEMORY BUFFER*,*UPDATE BLOCK IN MEMORY ON DISK IF NECESSARY ŠBSR.S‚PUTDB ŠBNE.S‚GETD30ŠMOVE.LA1,D0ŽSETUPPSN+*SET UP TO DO READ WITH WAIT, RANDOM, IMAGE-ŠSETFO‚IOREAD,IOPRAN+IOPIMG+IOPWAT,VDTIOS(A6)4ŠCLR.L‚VDTDMB(A6)‰0BLOCKINMEMORYUNTILAFTERREADŠBSR.S‚GPTDBŽREAD ŠBNE.S‚GETD30DISKERRORONREAD'ŠMOVE.LA1,VDTDMB(A6)†SAVEDIR.ADDRESS%GETD20„CLR.L‚D0‘RESTORECONDITONCODE'GETD30„MOVE.L(A7)+,A0‹RESTOREREGISTERŠRTS*%GPTDB…MOVE.LD0,VDTIOS+IOSRRN(A6)PSN5ŠMOVE.LVDTDMA(A6),VDTIOS+IOSSAD(A6)STARTINGADDRESS3ŠMOVE.LVDTDME(A6),VDTIOS+IOSEAD(A6)ENDINGADDRESS ŠBSR„DOIO2ŠRTSŠPAGE *PUTDB 1.00 6/25/79 L. STEINHOFF*8*PUTDB WRITES THE DIR. BLOCK CURRENTLY IN MEMORY TO DISK'*…CALLIGNOREDIFBLOCKHASNOTCHANGED* *ON CALL:*…A6=ADDRESSOFVDTENTRY *…BSRPUTDB* *ON RETURN:*…A6=UNCHANGED*…D0.L=0IFNOERROR6*…D0.B=ISTAIEIFNOBLOCKINMEMORYBUTMARKEDCHANGED*ˆ=80+IFI/OERROR*…Z=1IFNOERROR *†=0IFERROR*%*PUTDB USES INFORMATION IN VDT PASSED* PUTDB…EQU„*ŠMOVE.LA0,-(A7)‹SAVEREGISTER!ŠCLR.L‚D0‘CLEARINCASESKIPCALL/ŠBTSTW‚#VDFLDB,VDTFLG(A6)DBINMEMORYCHANGED?ŠBEQ.S‚PUTDRTNO,ŠMOVE.LVDTDMB(A6),D0†ISASECTORINMEMORY?ŠBNE.S‚PUTDB.1ŒYES,OK!ŠBSR„ISTAIERR‹NO-INTERNALERROR ŠBRA.S‚PUTDRT%*DO WRITE WITH WAIT FOR RANDOM, IMAGE4PUTDB.1ƒSETFO‚IOWRIT,IOPIMG+IOPWAT+IOPRAN,VDTIOS(A6)ŠBSR.S‚GPTDBŽWRITE!ŠBNE.S‚PUTDRTERRORFROMI/OCALL+ŠBCLRW‚#VDFLDB,VDTFLG(A6)CLEARCHANGEFLAG ŠTST.L‚D0PUTDRT„MOVE.L(A7)+,A0ŠRTSŠPAGE*"*ˆ**********************************ŒGETSDB1.008/21/79HBN6*"*ˆ*********************************<*‚GETSDBREADSTHEREQUESTEDSECONDARYDIRBLOCKINTOMEMORY>*ˆIFREQUESTEDBLOCKISALREADYINMEMORY,NOI/OISPERFORMED>*ˆIFCURRENTSDBMUSTBEOVERWRITTEN,ITISUPDATEDONDISKIF *ˆCHANGED9*ˆIFI/OERROROCCURS,PSNOFBLOCKINMEMORYISSETTO0* *‚ONCALL:*ˆA6=ADDRESSOFVDTENTRY0*ˆA1=ADDRESSOFREQUESTEDSECONDARYDIR.BLOCK *ˆBSRGETSDB* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR*ˆD0.B=80+IFI/OERROR*ˆZ=1IFNOERROR *Œ0IFERROR*#*‚GETSDBREFERENCESANDUPDATESVDT* GETSDB„EQU„**-*ˆRETURNIFREQUESTEDBLOCKALREADYINMEMORY*ŠMOVE.LA0,-(A7)‹SAVEREGISTER(ŠCMP.L‚VDTSDB(A6),A1†ISBLOCKINMEMORY?ŠBEQ.S‚GTSD10YES*.*ˆWRITEPREVIOUSSDBTODISKIFITHASCHANGED*'ŠBSR.S‚PUTSDBUPDATESDBANDASSOCIATESŠBNE.S‚GTSDRTERROR*6*ˆREADREQUESTEDSECONDARYDIRECTORYBLOCKINTOMEMORY*ŠMOVE.LA1,D0ŽPSNTOREAD<ŠSETFO‚IOREAD,IOPRAN+IOPIMG+IOPWAT,VDTIOS(A6)READWITHWAIT$ŠCLR.L‚VDTSDB(A6)‰0INCASEOFERRORŠBSR.S‚GPTSDBDOIOCALL ŠBNE.S‚GTSDRTDISKERRORONREAD-ŠMOVE.LA1,VDTSDB(A6)†SAVESECONDARYDIR.PSN>SD10„CLR.L‚D0‘RESTORECONDITIONCODE'GTSDRT„MOVE.L(A7)+,A0‹RESTOREREGISTERŠRTS*1*ˆCOMMONIOCALLSUBROUTINEFORGETSDBANDPUTSDB*&GPTSDB„MOVE.LD0,VDTIOS+IOSRRN(A6)PSN5ŠMOVE.LVDTSDA(A6),VDTIOS+IOSSAD(A6)STARTINGADDRESS3ŠMOVE.LVDTSDE(A6),VDTIOS+IOSEAD(A6)ENDINGADDRESS ŠBSR„DOIO2ŠRTSŠPAGE*"*ˆ**********************************ŒPUTSDB1.008/21/79HBN6*"*ˆ*********************************D*‚PUTSDBWRITESTHESECONDARYDIR.BLOCKCURRENTLYINMEMORYTODISK/*ˆCALLISIGNOREDIFBLOCKHASNOTBEENCHANGED* *‚ONCALL:*ˆA6=VDTADDRESS *ˆBSRPUTSDB* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR 9*ˆD0.B=ISTAIEIFBLOCKNOTINMEMORYBUTMARKEDCHANGED*80+IFI/OERROR*ˆZ=1IFNOERROR *Œ0IFERROR*#*‚PUTSDBREFERENCESANDUPDATESVDT* PUTSDB„EQU„**+*ˆIGNORECALLIFBLOCKHASNOTBEENCHANGED*ŠMOVE.LA0,-(A7)‹SAVEREGISTERS!ŠCLR.L‚D0‘CLEARINCASESKIPCALLŠBTSTW‚#VDFLCB,VDTFLG(A6)ŠBEQ.S‚PTSDRTCHANGED?.ŠMOVE.LVDTSDB(A6),D0†YES,ISASDBINMEMORY?ŠBNE.S‚PTSD05YES,OK!ŠBSR„ISTAIERR‹NO-INTERNALERROR ŠBRA.S‚PTSDRT**ˆUPDATESDBONDISK*CPTSD05„SETFO‚IOWRIT,IOPIMG+IOPRAN+IOPWAT,VDTIOS(A6)WRITEWITHWAITŠBSR.S‚GPTSDBWRITE!ŠBNE.S‚PTSDRTERRORFROMI/OCALLŠBCLRW‚#VDFLCB,VDTFLG(A6) ŠTST.L‚D0(PTSDRT„MOVE.L(A7)+,A0‹RESTOREREGISTERSŠRTSŠPAGE** *ˆ********************************ŒDSNXT1.008/3/79HBN6* *ˆ********************************0*‚DSNXTRETRIEVESTHENEXT,ORFIRST,ACCESSIBLE/*ˆDIRECTORYENTRY.‚ANENDOFDIRECTORY‚ERRORIS+*ˆGIVENIFENDOFDIRECTORYISENCOUNTERED.* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA2=FCBADDRESS*…A4=FATADDR.(=0IFNONE)*ˆD1.W=TASKUSERNUMBER* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR4*ˆD0.B=FSTAEODIFENDOFDIRECTORYORNODIRECTORY*80+IFIOERROR*ˆZ=1IFNOERROR *Œ0IFERROR***‚DSNXTREFERENCESANDUPDATESFCBANDVDT**INDENTED LIST/* DSNXT RETRIEVES FIRST OR NEXT DIRECTORY ENTRY)*DSNXT-PASS DIR-ENTRY IN-FCB-IF WANT-NEXT* SEARCH FOR CATALOG*‚CALL$GETSDB,$MATCH* SEARCH FOR FILE NAME*‚CALL$GETDB,$MATCH * FILE FOUND?*‚YES,RETURNDIRECTORYENTRY*‚NO,RETURNEND-OFDIRECTORY*INDENTED LIST END** DSNXT…EQU„***=*ˆSETFLAGSFORWHICHUSERNUMBERSANDREADCODESAREALLOWED*/ŠMOVEM.LD2-D5/A0/A1/A3/A5,-(A7)SAVEREGISTERS6ŠMOVE.WFCBSDB+SDBUSN(A2),D0GETREQUESTEDUSERNUMBERŠCLR.L‚D4‘CLEARFLAGŠMOVE.WD1,D4ŽSAVETASKUSER#$ŠMOVE.LD4,D1ŽD1.L=USER#FORTASKŠSWAPƒD4%ŠBEQ.S‚DSNX00SUPERVISOR-TASK#=0>ŠCMP.W‚VDTVID+VIDUSN(A6),D1TASKUSER#SAMEASVOLUMEUSER#?;ŠBEQ.S‚DSNX00ŠYES,RETURNFILESWITHUSER#0ANDOWNFILES-ŠMOVE.W#1,D4ŽTASKLOOKINGFOR‚ITSOWNFILES?ŠCMP.W‚D0,D1Ž.%ŠBEQ.S‚DSNX10YES,D4=TASKUSER#,1@ŠMOVE.W#2,D4†NO,RETURNALLOWNFILESORTHOSEWITHREADCODE=0?ŠCMP.W‚#-2,D0.&ŠBEQ.S‚DSNX10YES,D4=TASKUSER#,2>ŠMOVE.W#3,D4ˆNO,ONLYTHOSEWITHREQ.USER#ANDREADCODE=0 ŠBRA.S‚DSNX05*!DSNX00„EQU„*’CALLERISSUPERVISOR!ŠCMP.W‚#-2,D0REQUESTSANYFILES?ŠBEQ.S‚DSNX10YES,D4=01ŠMOVE.W#1,D4ŽNO,ONLYFILESFORREQ.USERNUMBERBDSNX05„SWAPƒD4ˆSETREQ.USERNUMBERINFLAGINSTEADOFTASKUSER#ŠMOVE.WD0,D4Ž.ŠSWAPƒD4*DSNX10„SWAPƒD4‘SWITCHORDERTOFLAG,USER#*9*ˆD4=0IFTORETURNFILESMATCHINGCATALOG/FILENAME/EXT1*Š0,USER#IFMUSTMATCHGIVENUSER#ORUSER#0**Š1,USER#IFMUST‚MATCHGIVENUSERNUMBER7*Š2,USER#IFMUST‚MATCHUSER#ORFILE'SREADCODE=07*Š3,USER#IFMUST‚MATCHUSER#ANDREADCODEMUSTBE0***ˆFINDAPPROPRIATEENTRYINSDBFORUSER#*-ŠMOVE.LFCBDBP(A2),D0†DIRECTORYENTRYINFCB?0ŠBNE.S‚DSNX45YES,GOSEARCHCATALOG'SPDBCHAIN6ŠMOVE.LVIDSDS+VDTVID(A6),D0STARTSEARCHFROM1STSDB ŠBEQ„DSNX60ERROR-NODIRECTORYSDBBUFFER$ŠMOVE.LVDTSDE(A6),D3†SDBBUFFERENDŠMOVE.L#2,D5ŽSETTESTFLAG ŠSWAPƒD5‘.ŠMOVE.WD4,D5ŽD5=2,USER#+DSNX25„ADD.W‚#SDBLEN,D2‰NEXTENTRY'SOFFSET%ŠLEA„0(A1,D2),A5ˆA5->NEXTSDBENTRYŠCMP.L‚A5,D3ŽENDOFSDB? ŠBLS„DSNX95YES,GOTRYNEXTSDBŠTST.L‚SDBPDP(A5)‰EMPTYENTRY?!ŠBEQ.S‚DSNX25YES,TRYNEXTENTRYŠTST.L‚D4‘MATCHUSER?!ŠBEQ.S‚DSNX35NO,RETURNANYFILE+ŠCMP.W‚(A5),D4ŒUSERNUMBERSMATCH?(SDBUSN)ŠBEQ.S‚DSNX35YES-ŠCMP.L‚D1,D4ŽRETURNALSOFILESWITHUSER#0?ŠBNE.S‚DSNX30NO %ŠTST.W‚(A5)YES,USER#=0?(SDBUSN)ŠBNE.S‚DSNX25NOŠBRA.S‚DSNX35YES,USER#ISOK*1DSNX30„CMP.L‚D4,D5ŽRETURNFILESIFREADCODE=0?(ŠBNE.S‚DSNX25NO,MUSTMATCHUSERNUMBER*#*ˆUSER#ISOK,MATCHCATALOGNAMES*@DSNX35„LEA„SDBCLG(A1,D2),A5ƒA5->SDBENTRY'SCATALOGNAMEFIELDDŠLEAƒFCBSDB+SDBCLG(A2),A0RESTOREA0TOPOINTTOCATALOGNAMEWANTEDŠMOVE.L#CLGLEN,D0‰BCTTOMATCH ŠBSR„MATCH'ŠBNE.S‚DSNX25CATALOGNAMESDON'TMATCH8ŠMOVE.LSDBPDP(A1,D2),D0ƒD0=PSNOF1STPDBFORCATALOG?ŠMOVE.WD2,FCBSDBO(A2)…SAVESDBBUFFEROFFSETFORCATALOGENTRY***ˆSEARCHPDBCHAINFORFILENAME/EXTENSION*>DSNX40„MOVE.W#DIRSTR-DIRLEN,FCBDBO(A2)INITPDBBUFFEROFFSET3DSNX45„MOVE.WFCBSDBO(A2),D2…CATALOGENTRY'SOFFSET$ŠMOVE.LVDTSDA(A6),A1†SDBBUFFERFWA4ŠMOVE.WSDBUSN(A1,D2),D5ƒGETUSER#FORTHISCATALOG,ŠMOVE.LD0,A1ŽA1=PSNOFPDBTOSEARCHNEXTŠBSR„GETDBŽGETITINTOMEMORYŠBNE„DSNXRTIOERROR*MAKE SURE SDB IS IN MEMORYŠMOVE.LA1,-(A7)ŠMOVE.LFCBSDBP(A2),A1 ŠBSR„GETSDBŠMOVE.L(A7)+,A1 ŠBNE„DSNXRT'ŠMOVE.WFCBDBO(A2),D2†GETOFFSETINPDB!ŠMOVE.LVDTDMA(A6),A3†GETPDBFWA-DSNX50„MOVE.LVDTDME(A6),D3†ENDOF‚PDBBUFFER*!*ˆFINDNEXTVALIDDIRECTORYENTRY*)ŠADD.W‚#DIRLEN,D2‰D2=OFFSETTONEXTENTRY(ŠLEA„0(A3,D2),A5ˆENDOFTHISDBREACHED?ŠCMP.L‚A5,D3Ž.ŠBHI.S‚DSNX70NO$ŠMOVE.L(A3),D0ŒYES,NEXTDBEXISTS?)ŠBNE.S‚DSNX40YES-GOGETITINTOMEMORY*&*ˆENDOF‚PDBCHAINFORCURRENTCATALOG0*ˆSEARCHFORNEXTUSERNO./CATALOGIFAPPLICABLE*0*A -2 UER NO. MEANS ANOTHER SDB ENTRY MAY APPLEYŠCMP.W‚#-2,FCBSDB+SDBUSN(A2) ŠBEQ.S‚DSNX65@ŠLEA„FCBSDB+SDBCLG(A2),A1AN'*'MEANSANOTHERCATALOGMAYAPPLYŠMOVE.L#CLGLEN,D0,DSNX55„CMP.B‚#'*',(A1)+‰ANYWILDCHARACTERS?7ŠBEQ.S‚DSNX65YES,GOSEARCHSDBCHAINFORNEXTCATALOGŠDCNTƒD0,DSNX552DSNX60„CLR.L‚FCBDBP(A2)‰NO,ENDOFDIRECTORYERROR/ŠCLR.W‚FCBDBO(A2)‰CLEARDBPSNANDENTRYOFFSET/ŠCLR.L‚FCBSDBP(A2)ˆANDCLEARSDBPSNANDOFFSETŠCLR.W‚FCBSDBO(A2)ˆ."ŠMOVE.L#FSTAEOD,D0ˆSETERRORCODEŠBRA„DSNXRTRETURN*9DSNX65„MOVE.WFCBSDBO(A2),D2…GETCURRENTCATALOG'SOFFSET"ŠMOVE.LFCBSDBP(A2),D0…ANDITSPSN/ŠBRA„DSNX20GOLOOKFORNEXTAPPLICABLECATALOG*2DSNX70„LEA„DIRFIL(A3,D2),A5ƒVALIDDIRECTORYENTRY? ŠTST.B‚(A5)#ŠBEQ.S‚DSNX50NO,GOTRYNEXTENTRY**ˆTESTFILENAMEISOK*,ŠLEA„FCBDIR+DIRFIL(A2),A0A0->REQUESTEDFILE8ŠMOVE.L#FILLEN,D0‰FILENAMEFIELDLENGTHTOBESEARCHED ŠBSR.S‚MATCHŠBNE.S‚DSNX50NOMATCH**ˆTESTEXTENSIONISOK**ŠMOVE.L#EXTLEN,D0‰CHECKEXTENSIONMATCHESŠLEA„FCBDIR+DIREXT(A2),A0ŠLEA„DIREXT(A3,D2),A5 ŠBSR.S‚MATCHDSNX72„BNE.S‚DSNX50NOMATCH*#*ˆTESTFILEISACCESSIBLETOCALLER*8ŠMOVE.LD4,D3ŽRETURNDIR.ENTRYREGARDLESSOFREADCODE? ŠSWAPƒD3‘.ŠCMP.W‚#2,D3Ž.ŠBLT.S‚DSNX75YES,ŠMOVE.BDIRRCD(A3,D2),D0ƒNO,ISREADCODE0?$ŠBEQ.S‚DSNX75YES,RETURNDIR.ENTRY7ŠCMP.W‚#3,D3ŽDIDYOUHAVETOHAVEREADCODEEQUALTO0?,ŠBEQ„DSNX50YES,THENTHISENTRYWILLNOTDO*ŠCMP.W‚D5,D4ŽRETURNALLCALLER'SOWNFILES(ŠBNE„DSNX72NOGOOD,TRYNEXTDIR.ENTRYŠPAGE*(*ˆRETURNDIRECTORYENTRYTOCALLER'SFCB*:DSNX75„MOVE.WD2,FCBDBO(A2)†SAVEOFFSETTODIRECTORYENTRY!ŠMOVE.LA1,FCBDBP(A2)†SAVEDBPSN0ŠLEA„0(A3,D2),A3ˆA3->DIRECTORYENTRYFOUNDIN‚DB%ŠMOVE.L#DIRLEN/2,D0‡MOVEITINTOFCBŠLEA„FCBDIR(A2),A0DSNX80„MOVE.W(A3)+,(A0)+ŠDCNTƒD0,DSNX80FŠCMP.WD4,D1LEAVEWRITECODEONLYFORFILE/VOLUMEOWNERORSUPERVISOR ŠBEQ.S‚DSNX85ŠTST.W‚D1‘SUPERVISOR?ŠBEQ.S‚DSNX85YES1ŠMOVE.B#-1,FCBDIR+DIRWCD(A2)MASKOFFWRITECODE=DSNX85„MOVE.LVDTSDA(A6),A1†ALSORETURNUSER#&CATALOGNAMEŠMOVE.WFCBSDBO(A2),D06ŠLEA„SDBUSN(A1,D0),A1ƒA1->USER#,CATALOGNAMEFIELD)ŠMOVE.L#(SDBFLN)/2,D0…WORDCOUNTTOMOVEŠLEA„FCBSDB(A2),A3†MOVE-TOADRDSNX90„MOVE.W(A1)+,(A3)+ŠDCNTƒD0,DSNX90ŠCLR.L‚D0‘SETGOODRETURNFLAGS8DSNXRT„MOVEM.L(A7)+,D2-D5/A0/A1/A3/A5RESTOREREGISTERSŠRTS/DSNX95„MOVE.L(A1),D0ŒNEXTSBDEXISTS?(SDBFPT)ŠBNE„DSNX15YES,GOGETIT(ŠBRA„DSNX60NO,ENDOFDIRECTORYREACHED* * DSNXT SUBROUTINE*<* MATCH - STRING MATCH SUBROUTINE WITH '*' MATCHING ANYTHING** ENT: D0 = BCT TO MATCH?*†A0->FIELDTOBEMATCHED,AN'*'=>ANYCHARACTERWILLMATCH*†A5->2NDFIELDFORMATCH** RET: D0,A0,A5 UNKNOWN*†Z=1IFMATCH*Š0IFNOMATCH* MATCH…EQU„*ŠCMPM.B(A0)+,(A5)+ ŠBEQ.S‚MATCH1"ŠCMP.B‚#'*',-1(A0)ˆMATCHANYTHING?ŠBNE.S‚MATCH2NO,NOMATCHMATCH1„DCNTƒD0,MATCHŠCLR.L‚D0‘SETEQUALFLAGS MATCH2„RTS*ŠPAGE*!*ˆ*********************************ŒDIRDEL1.008/6/79HBN6*!*ˆ********************************@*‚DIRDELDELETESADIRECTORYENTRYANDOPTIONALLYALLFILESPACE*‰ALLOCATEDTOTHEFILE. *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS-*ˆD0=0IFFILESPACEDEALLOCATIONREQUESTED5*1IFDELETEDIRECTORYENTRYONLY(DIRENTRYINFCB)8*-1IFFILESPACEDEALLO.BUTDIR.ENTRYALREADYINFCB* *‚ONRETURN:%*ˆALLREGISTERSAREUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR**ˆD0.B=FSTANNMIFNON-EXISTENTFILENAME%*FSTASSIFINSUFFICIENTSYSTEMSPACE*FSTAIEIFDELETEBUFFERERROR!*FSTAPCIFDELETEPROTECTEDFILE"*–ORREAD/WRITECODESDONOTMATCH*80+IFI/OERROR*ˆZ=1IFNOERROR *Œ0IFERROR*0*‚DIRDELREFERENCESANDUPDATESFCB,FATANDVDT**INDENTED LISTE* DIRDEL DELETES FILE'S DIRECTORY ENTRY AND OPTIONALLY ITS FILE SPACE*DIRDEL PASS-FILE ENTRY-IN FCB* FIND DIRECTORY ENTRY FOR-FILE *‚CALL$DSNME* ENTRY FOUND? *‚NO,RETURNFILE-NAMENOT-FOUND* YES, DEALLOCATE FILE SPACE?*‚YES,-CALL$DSDEALOR$FSDEAL* NO,-ZERO OUT DIRECTORY ENTRY *‚CALL$GETDB* RETURN*INDENTED LIST END* DIRDEL„EQU„**6*ˆFINDFILENAMEINDIRECTORY,CHECKACCESSPROTECTION*DŠMOVEM.LD1-D2/A1/D6-D7,-(A7)SAVEREGISTERS(D1,D6,D7MAYBECHGED) ŠTST.L‚D0 ŠBEQ.S‚DRDL05LOOKUPDIR.ENTRY?ŠSUB.L‚#1,D0†DIR.ENTRYALREADYINFCB-FILESPACEDEALLOCATION?ŠBEQ.S‚DRDL20NOŠBRA.S‚DRDL00YES9DRDL05„MOVE.BFCBDIR+DIRWCD(A2),D1SAVEWRITEACCESSCODE,ŠBSR„DSNMEŽSEARCHFORFILENAMEINDIRECTORYŠBNE.S‚DRDLRTERROR6ŠMOVE.BFCBDIR+DIRWCD(A2),D0ISFILEDELETEPROTECTED?ŠBEQ.S‚DRDL00NO ŠCMP.B‚#-1,D0 ŠBEQ.S‚DRDL07PROTECTCODEERROR&ŠCMP.B‚D1,D0ŽNO,DOWRITECODESMATCH?ŠBEQ.S‚DRDL00YES/DRDL07„MOVE.L#FSTAPC,D0‰NO,PROTECTCODEERROR ŠBRA.S‚DRDLRT**ˆDEALLOCATEFILESPACE*)DRDL00„MOVE.L#-1,D0SETDELETEFILEFLAG0ŠMOVE.BFCBDIR+DIRATT(A2),D1GETFILEATTRIBUTESŠAND.B‚#DFTBIT,D1"ŠCMP.B‚#DATCON,D1‰CONTIGUOUSFILE?ŠIFGTƒFMSLEVEL-1ŠBNE.S‚DRDL10NOŠENDCŠIFEQƒFMSLEVEL-1 ŠBEQ.S‚DRDL02DRDL01„MOVE.L#FSTAFT,D0 ŠBRA.S‚DRDLRT DRDL02„EQU„*ŠENDC/ŠMOVE.LFCBDIR+DIRFE(A2),D1YES,GETITSSIZE-1,ŠMOVE.LFCBDIR+DIRFS(A2),A1ANDSTARTINGPSN/ŠCLR.L‚FCBDIR+DIRFS(A2)ƒCLEARFILESTARTINGPSN5ŠMOVE.LD0,FCBDIR+DIRFE(A2)CLEARPHSYCIALENDINGLSN:ŠMOVE.LD0,FCBDIR+DIREOF(A2)CLEARLOGICALENDOFFILELSN(ŠADD.L‚#1,D1ŽD1=#OFSECTORSTODELETE!ŠBSR„DSDEALDEALLOCATEFILESPACEŠIFGTƒFMSLEVEL-1'ŠBRA.S‚DRDL20GODELETEDIRECTORYENTRY DRDL10„EQU„*ŠIFEQƒFMSLEVEL-2ŠCMP.B‚#DATSEQ,D1 ŠBEQ.S‚DRDL11ŠMOVE.L#FSTAFT,D0 ŠBRA.S‚DRDLRT DRDL11„EQU„*ŠENDC-ŠBSR„FSDEALDEALLOCATEFABSANDFILESEGMENTS?*CLEAR FCB CHANGED FLAG-DON'T WANT INFO. MOVED FROM FCB TO DIR. *…BLOCKSINCEDBISBEINGZEROEDŠBCLRW‚#FCFLDB,FCBFLG(A2)ŠENDC*5*ˆDELETEDIRECTORYENTRYFROMPRIMARYDIRECTORYBLOCK*%DRDL20„MOVE.LD0,D2ŽSAVERETURNFLAGS ŠMOVE.LFCBDBP(A2),A1†GETDBPSNŠBSR„GETDBŽGETDBINTOMEMORYŠBNE.S‚DRDLRTERROR;ŠMOVE.LVDTDMA(A6),A1†CLEARFILEENTRYINDBTODELETEFILEŠMOVE.WFCBDBO(A2),D1"ŠCLR.B‚0(A1,D1)‹ONLY01ST4BYTESŠBSR„SETVFDBŒFLAGTOUPDATEPDBŠMOVE.LD2,D0ŽRESTORERETFLAG5DRDLRT„MOVEM.L(A7)+,D1-D2/D6-D7/A1RESTOREREGISTERSŠRTSŠPAGE**%*ˆ*************************************ŒDIRNME‚1.00‚9/18/79‚HBN6*%*ˆ*************************************4*‚DIRNMECHANGESTHENAMEOFAFILEINTHEDIRECTORY* *‚ONCALL:*ˆA6=VDTADDRESS *ˆA2=OLDFILEFCBADDRESS*ˆA3=NEWFILEFCBADDRESS*…A4=FATADDR.(=0IFNONE)* *‚ONRETURN: *ˆALLREGISTERSUNCHANGEDEXCEPT*ˆD0.L=0IFNAMECHANGEDOK0*ˆD0.B=FSTADNMIFNEWFILENAMEALREADYEXISTS*80+IFIOERROR*ˆZ=1IFNOERROR *Œ0IFERROR**INDENTED LIST* DIRNME CHANGES FILE NAME"*DIRNME PASS-OLD AND-NEW FILE-FCBS#* CALL-DSNME, NEW FILE-NAME EXISTS?*‚YES,RETURNWITHERROR* NO,-CHANGE DIR.-ENTRY ONLY?*‚YES,CALL$UPTDIR,RETURN* NO, CHANGE CATALOGS*‚CALL$DIRDEL,$DIRINS* RETURN*INDENTED LIST END* DIRNME„EQU„**,*ˆCHECKNEWNAMEISNOTALREADYINDIRECTORY*ŠMOVEM.LD1/D6-D7/A0-A1,-(A7)+ŠEXG„A2,A3ŽSEARCHFORNEWNAMEINDIRECTORY ŠBSR„DSNMEŠEXG„A2,A3ŽRESTOREFCBPOINTERS2ŠBEQ.S‚DIRN30ERROR,DUPLICATEFILENAMEATTEMPTEDŠCMP.B‚#FSTANNM,D0ˆIOERROR?ŠBNE.S‚DIRNRTYES*>*ˆCHANGEPRIMARYDIRECTORYENTRYONLY:USER#/CATALOGNAMESAME*6ŠLEA„FCBSDB+SDBUSN(A2),A0USER#/CATALOGNAMECHANGED?ŠLEA„FCBSDB+SDBUSN(A3),A1ŠMOVE.L#(USNLEN+CLGLEN)/2,D0DIRN10„CMPM.W(A0)+,(A1)+*ŠBNE.S‚DIRN20YES,HAVETOCHANGECATALOGSŠDCNTƒD0,DIRN10@ŠLEA„FCBDIR+DIRFIL(A3),A0PUTNEWFILENAMEINTODIRECTORYENTRYŠLEA„FCBDIR+DIRFIL(A2),A1ŠMOVE.L#(FILLEN+EXTLEN)/2,D0DIRN15„MOVE.W(A0)+,(A1)+ŠDCNTƒD0,DIRN154ŠBSR„UPTDIRUPDATEDIRECTORYBLOCKWITHENTRYINFCB#DIRNRT„MOVEM.L(A7)+,D1/D6-D7/A0-A1ŠRTS**ˆCATALOGORUSER#CHANGED9*ˆDELETEFILENAMEFROMTHISCATALOGANDPUTINTONEWONE*GDIRN20„MOVE.L#1,D0…DELETEPRIMARYDIRECTORYENTRY,NOSPACEDEALLOCATI ŠBSR„DIRDELŠBNE.S‚DIRNRTIOERRORŠLEA„FCBSDB+SDBUSN(A2),A0ŠLEA„FCBSDB+SDBUSN(A3),A1BŠMOVE.L#(USNLEN+CLGLEN+FILLEN+EXTLEN)/2,D0NEWFILENAMEINTOFCBDIRN25„MOVE.W(A1)+,(A0)+ŠDCNTƒD0,DIRN25FŠMOVE.WFCBSDBO(A3),FCBSDBO(A2)SETPDBANDSDBINFOFORNEWFILENAME!ŠMOVE.LFCBSDBP(A3),FCBSDBP(A2).ŠMOVE.WFCBDBO(A3),FCBDBO(A2).ŠMOVE.LFCBDBP(A3),FCBDBP(A2).BŠMOVE.L#1,D0„INSERTFILENAMEINTODIRECTORY,NOSPACEALLOCATION?ŠBSR„DIRINS„DON'TSEARCHFORFILENAME-JUSTPUTFILEINTONEWŠBRA.S‚DIRNRT.CATALOG*6DIRN30„MOVE.L#FSTADNM,D0ˆNEWFILENAMEEXISTSALREADY ŠBRA.S‚DIRNRTŠPAGEŠIFGTƒFMSLEVEL-1**"*ˆ**********************************ŒFSALLC1.007/24/79HBN6*"*ˆ**********************************<*‚FSALLCALLOCATESSPACETOAFILE(WITHFAB'S)BYEXTENDING*ˆSPACEATTHEENDOFAFILE.9*ˆ(#OFSECTORSREQUESTEDISINDATABLOCKSIZE'DIRDAT')* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR+*ˆD0.B=ISTAIDSIFINSUFFICIENTDISKSPACE!*ISTAALIFINTERNALSYSTEMERROR*80+IFIOERROR*ˆZ=1IFNOERROR *Œ0IFERROR**INDENTED LIST>* FSALLC EXTENDS FILE SPACE AT THE END OF A NONCONTIGUOUS FILE*FSALLC* GET-LAST FAB-INTO MEMORY*‚CALL$GETFDB,FABFOUND?"*ƒNO,ALLOCFIRST-FAB:CALL$FBALLC* ALLOCATE NEW DATA BLOCK*‚CALL$PUTDAT,$DSALLC* GET NEW FAB ENTRY *‚FAB-FULL?*ƒYES,CALL$FBALLC* RETURN EMPTY DATA BLOCK*INDENTED LIST END** FSALLC„EQU„**4*ˆGETLASTFABINTOMEMORYORGET-ALLOCATEFIRSTFAB*,ŠMOVEM.LD1-D6/A0-A1/A3,-(A7)SAVEREGISTERSEŠGET2‚FCBDIR+DIREOF(A2),D5,D6GETSTARTINGLSN/LRNFORNEWDATABLOCKŠADD.L‚#1,D6Ž.ŠMOVE.LD5,D0Ž.GETLASTFABINŠADD.L‚#1,D5Ž.ŠMOVE.L#LSNFDB,D1‰. ŠBSR„GETFDB.<ŠBEQ.S‚FSAL15‰ERROR?-NO=FILEHASATLEASTONEDATABLOCK#ŠCMP.B‚#ISTAEOF,D0ˆYES,EMPTYFILE?FSAL10„BNE„FSALRTERROR.ŠBRA.S‚FSAL20GOALLOCATE1STSEGMENTFORFILE*/*ˆWRITEOUTCURRENTDATABLOCKIFNECESSARYAND2*ˆTRYTOALLOCATEDISKSPACECLOSETOLASTSEGMENT*"FSAL15„CLR.L‚D0‘NOKEYUPDATEFLAG2ŠBSR„PUTDATUPDATECURRENTDATABLOCKIFNECESSARYŠBNE.S‚FSAL10ERROR$ŠCLR.L‚D0‘GETNEXTFABENTRYPOINTER%ŠMOVE.BFABKEY(A0),D0†.KEYFIELDBCT@ŠLEA„FABSSL(A0,D0),A0‚.A0->‚FABENTRYLOCATIONFORNEWSEGMENT/FSAL20„MOVE.LFATFAE(A4),D4†GETFABENDADDRESSŠCLR.L‚D1‘GETDATABLOCKSIZE ŠMOVE.BFCBDIR+DIRDAT(A2),D1.?ŠBSR„DSALLC„ALLOCATESPACE(RET:A1=PSNOFSEGMENTALLOCATED)ŠBNE.S‚FSALRTERROR?*&*ˆALLOCATENEWFABIFCURRENTFABFULL*ŠCLR.L‚D2‘GETKEYLENGTHŠMOVE.BFCBDIR+DIRKEY(A2),D2.6ŠTST.L‚D5D5=STARTINGLSNOFDATABLOCK,0=1STBLOCK!ŠBEQ.S‚FSAL281STSEGMENTOFFILEAŠLEA„FABSSL(A0,D2),A3‚ANYROOMTOADDNEWENTRYINTOCURRENTFAB?ŠADD.L‚#1,D4Ž. ŠCMP.L‚D4,A3ŠBLS.S‚FSAL35YES,FORMNEWSD FSAL28„EQU„*:ŠBSR„FBALLC‰NO,ALLOCATEANDLINKNEWFABTOTHEFABCHAINŠBEQ.S‚FSAL30ERROR?%ŠMOVE.LD0,-(A7)‹YES,SAVEERRORCODEŠBSR„DSDEALDEALLOCATESEGMENT,ŠMOVE.L(A7)+,D0‹RESTOREORIGINALERROR‚CODEŠBRA.S‚FSALRTERROREXIT**ˆUPDATEFAT,FAB*:FSAL30„SAVE2‚D5,D6,FATFLS(A4)ƒSETFABSTARTINGLSN/LRN=0=FSAL35„MOVE.LA1,(A0)ŒSETSTARTINGPSNOFSEGMENTINTOFABPSNFŠMOVE.BFCBDIR+DIRKEY(A2),FABKEY(A0)FIELDLENGTH=KEYSIZEFORLASTFA@ŠMOVE.LDIREOF+FCBDIR(A2),FATLLS(A4)UPDATEFABENDINGLSN(=EOF)7ŠMOVE.LFCBDIR+DIREOR(A2),FATLLR(A4)FABENDINGLRN=EOR+ŠLEA„FABKEY(A0),A1†SETLASTFABKEYPOINTER:ŠSAVE2‚A0,A1,FATCFP(A4)ƒSAVECURRENTENTRY&LASTKEYPNTR%ŠMOVE.BD2,(A1)+‹SETKEYFIELDLENGTHŠBEQ.S‚FSAL41.NULLORNOKEYSFSAL40„CLR.B‚(A1)+ŽAND!ŠDCNTƒD2,FSAL40Š.CLEARKEYFIELD@FSAL41„SUB.L‚#4,D4‹CLEARLONGWORDATENDOFNEWENTRYIFNOTATŠCMP.L‚D4,A1Ž.ENDOFFABŠBHI.S‚FSAL45OK*ŠCLR.L‚(A1)CLEARFORENDOFFABINDICATOR0FSAL45„CLR.W‚FABREC(A0)‰CLEARRECORDCOUNTFIELD*ŠCLR.B‚FABSGS(A0)‰CLEARSECTORCOUNTFIELD7ŠSAVE2‚D5,D6,FATSLS(A4)ƒSEGMENT'S1STAVAILABLELSN/LRN ŠBSR„FABCHGSETFABCHANGEDFLAG ŠCLR.L‚D05FSALRT„MOVEM.L(A7)+,D1-D6/A0-A1/A3RESTOREREGISTERSŠRTSŠPAGE**#*ˆ***********************************ŒFSDEAL1.007/25/79‚HBN6*#*ˆ***********************************(*‚FSDEALDEALLOCATESALLSPACEINAFILEC*…FSDEALALLOCATESANDATTACHESTOSEGMENTFORFABIFANYFILESPAC:*…EXISTSANDSEGMENTNOTALREADYALLOCATED.‚SEGMENTISNOT*…RELEASEDWHENFSDEALISDONE* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR*80+IFIOERROR%*FSTASSIFINSUFFICIENTSYSTEMSPACE*ˆZ=1IFNOERROR *Œ0IFERROR**INDENTED LIST6* FSDEAL DEALLOCATES ALL SPACE IN A NONCONTIGUOUS FILE*FSDEAL"* FIND-FIRST DATA-BLOCK FOR-DELETE*‚CALL$GETIOB,$GETFDB* DEALLOCATE ALL BLOCKS IN-FAB*‚CALL$DSDEAL* DEALLOCATE FAB WHEN EMPTY*‚CALL$FBDEAL* RETURN EMPTY FILE*INDENTED LIST END** FSDEAL„EQU„**"*ˆFINDFIRSTSEGMENTTOBEDELETED*/ŠMOVEM.LD1-D4/A0-A1/A3/A5,-(A7)SAVEREGISTERS0ŠCLR.L‚D0‘SETFORGOODRETURNANDTOGET1STFAB#ŠTST.L‚FCBDIR+DIRFS(A2)ƒEMPTYFILE?-ŠBEQ.S‚FSDEERYES,RETURNSINCENOTHINGTODO,ŠTST.L‚FATBSN(A4)‰SEGMENTALREADYALLOCATED?ŠBNE.S‚FSDE10YESŠMOVE.B#$80,D0ŠBSR„GETIOBALLOCATEFABBUFFER'ŠBNE.S‚FSDEERINSUFFICIENTSYSTEMSPACE.FSDE10„MOVE.L#LSNFDB,D1‰.IGNORELSNCONFLICT6ŠBSR„GETFDBGET1STFABWHEREDEALLOCATIONISTOSTART8ŠBNE.S‚FSDE55ERROR-GOSETDIR.ENTRYFOREMPTYSTATUS*+ŠMOVE.LA0,A3ŽA3->FABENTRYTOBEDELETED$ŠMOVE.LFATFAE(A4),D4†FABBUFFEREND(ŠSUB.L‚#3,D4ŽD4->LASTLONGWORDINFAB!ŠBRA.S‚FSDE30DELETEALLSEGMENTS FSDEER„BRA.S‚FSDERTERRORRETURN!FSDE25„CMP.L‚D4,A3ŽNEEDNEXTFAB?ŠBCC.S‚FSDE50YES* *ˆDELETEALLSUBSEQUENTSEGMENTS*/FSDE30„MOVE.L(A3),A1ŒDATASEGMENTPSN(FABPSN)&ŠCLR.L‚D2‘GETFABENTRYLENTGHINTOD2(ŠMOVE.BFABKEY(A3),D2†.KEYFIELDLENGTHŠADD.L‚#FABSSL,D2‰.-ŠLEA„0(A3,D2),A5ˆA5->NEXT‚FABENTRYPOINTER+ŠCLR.B‚D3‘CLEARFLAGFORNOTLASTFABENTRY2ŠCMP.L‚D4,A5ŽTODEALLOCATEFILE'SLASTDATABLOCK?'ŠBCC.S‚FSDE35.YESIFTHISISLASTFAB.ŠTST.L‚(A5).ATENDOFFABIFNEXTFABPSN=0$ŠBNE.S‚FSDE40.NOTLASTFABSEGMENT@FSDE35„MOVE.L#1,D3Œ.SETFLAGFORLASTFABENTRYINFABDELETEDFSDE40„BSR„DEALDBŠBNE.S‚FSDE55ERROR*%*ˆCLEARFABENTRYFORDELETEDSEGMENT*$ŠLSR„#1,D2ŽD2=FABENTRYWORDCOUNTFSDE45„CLR.W‚(A3)+ ŠDCNTƒD2,FSDE45.ŠTST.B‚D3‘DELETEDLASTFABENTRY=>DELETEFAB#ŠBEQ.S‚FSDE25DELETENEXTFABENTRY**ˆDELETECURRENTFAB*#FSDE50„MOVE.LFATFAA(A4),A5†FABFWA5ŠMOVE.L(A5),D3ŒGETFORWARDLINK(FABFLK)TONEXTFABŠBSR„FBDEALDEALLOCATEFABŠBNE.S‚FSDE55ERROR ŠMOVE.L#-1,D2LASTFABDELETED?ŠMOVE.LFATLLS(A4),D0†.ŠADD.L‚#1,D0Ž.ŠTST.L‚D3‘.FORWARDLINK=0?3ŠBNE„FSDE10NO,GODELETEALLSEGMENTSINNEXTFABSŠCLR.L‚D0‘SETGOODRETURNFLAGS*FSDE55„MOVE.LD0,D1ŽSAVERETURNCONDITIONS ŠBSR.S‚RLNFT3RESETFABFATINFO&ŠMOVE.LD0,FCBDIR+DIREOF(A2)RESETEOF$ŠMOVE.LD0,FCBDIR+DIREOR(A2)ANDEOR0ŠCLR.L‚DIRFS+FCBDIR(A2)ƒDELETEFILESTARTINGPSN&ŠCLR.L‚DIRFE+FCBDIR(A2)ƒANDENDINGPSN@ŠBSETW‚#FCFLDB,FCBFLG(A2)FLAGFCBFORUPDATEINDIRECTORYBLOCK+ŠCLR.L‚FATCFP(A4)‰INDICATENOFABINMEMORY.ŠMOVE.LD1,D0ŽNO,RESTOREPREVIOUSRETURNCODE8FSDERT„MOVEM.L(A7)+,D1-D4/A0-A1/A3/A5RESTOREREGISTERSŠRTSŠPAGE*$*ˆ************************************ŒRLNFAT1.0011/4/79HBN6*$*ˆ***********************************=*‚RLNFATSETSFATLSNANDLRNFIELDSTO-1TOINDICATENOFAB#*ˆRLNFT3ALSOCLEARSFATFAB/CFP/KEY*ˆRLNFT2CLEARSFATCFP/KEY* *‚ONENTRY:*ˆA4=FATADDRESS* *‚ONRETURN:$*ˆD0=-1,OTHERREGISTERSUNCHANGED* RLNFT3„EQU„*"ŠCLR.L‚FATFAB(A4)‰NOFABINMEMORY RLNFT2„EQU„*&ŠCLR.L‚FATCFP(A4)‰NOCURRENTFABENTRY!ŠCLR.L‚FATKEY(A4)‰NOLASTFABKEY RLNFAT„EQU„*!ŠMOVE.L#-1,D0SETNOLSNFORFABŠMOVE.LD0,FATFLS(A4)†.ŠMOVE.LD0,FATLLS(A4)†.ŠMOVE.LD0,FATFLR(A4)†.ŠMOVE.LD0,FATLLR(A4)†.CŠBSR.S‚SETFSL‚SETFABSTARTINGLSN/LRNFORSEGMENTSTARTINGLSN/LRNŠRTS**$*ˆ************************************ŒSETFSL1.001/30/80HBN6*$*ˆ***********************************@*‚SETFSLSETSSEGMENTSTARTINGLSNANDLRNEQUALTOFABSTARTING *‰LSNANDLRN**‚ONENTRY:A4=FATADDRESS*$*‚ONRETURN:ALLREGISTERSUNCHANGED*'SETFSL„MOVE.LFATFLS(A4),FATSLS(A4)LSN!ŠMOVE.LFATFLR(A4),FATSLR(A4)LRNŠRTSŠPAGE*%*ˆ*************************************ŒFBALLC‚1.00‚7/23/79‚HBN6*%*ˆ*************************************E*‚FBALLCALLOCATESANDLINKSANEWFABTOENDOFFABCHAIN.‚THEPRIOR?*ˆFABISUPDATEDONDISK.‚THENEWFABISINITIALIZEDINMEMORY.6*ˆEITHERTHELASTFABISINMEMORYORFILEHASNOFABS%*ˆFABBUFFERMUSTHAVEBEENALLOCATED* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS* *‚ONRETURN:%*ˆALLREGISTERSAREUNCHANGEDEXCEPT:"*ˆA0->FIRSTFABENTRYINNEWFAB*ˆD0.L=0IFNOERROR+*ˆD0.B=ISTAIDSIFINSUFFICIENTDISKSPACE3*FSTAIEIFINTERNALSYSTEMERROR-LASTFABNOTIN*80+IFIOERROR*ˆZ=1IFNOERROR *Œ0IFERROR**INDENTED LIST:* FBALLC ALLOCATES AND LINKS A NEW FAB TO END OF FAB CHAIN*FBALLC PASS LAST-FAB IF-ANY* ALLOCATE DISK-SPACE FOR-FAB*‚CALL$DSALLC* SET FORWARD LINK-IN CURR.-FAB#*‚CALL$PUTFAB(LAST-FABIN-MEMORY)* SET-UP-FOR NEW-FAB IN-MEMORY*‚CALL$RLNFT2,CLEARFAB* UPDATE FILE-END IN-FCB* RETURN*INDENTED LIST END* FBALLC„EQU„**)ŠMOVEM.LD1-D5/A1/A3,-(A7)SAVEREGISTERS*ŠMOVE.LFATFAA(A4),A3†GETFABBUFFERSTART$ŠMOVE.LFATFAE(A4),D5†FABBUFFERENDŠMOVE.LFATFAB(A4),D4†FABPSNŠBEQ.S‚FBAL00NO*ŠMOVE.L(A3),D2ŒYES,LASTFAB?(FABFLK=0?)ŠBEQ.S‚FBAL05YES=FBAL00„MOVE.LFCBDIR+DIRFS(A2),D2ELSETOALLOCATEFIRSTFAB?ŠBEQ.S‚FBAL10."FBALIE„MOVE.L#FSTAIE,D0‰NO,ERRORFBALER„BRA.S‚FBALRT**ˆALLOCATEFABSPACEONDISK*5FBAL05„ADD.L‚#1,D2ŽSETFLAGFORLASTFABIN(D2<>0)FBAL10„BSR„ALLOFBALLOCATEFABŠBNE.S‚FBALERERROR**ˆLINKFABTOFABCHAIN*ŠTST.L‚D2‘WASTHISFIRSTFAB?6ŠBNE.S‚FBAL15NO,NEWFABTOBELINKEDTOENDOFCHAINCŠMOVE.LA1,FCBDIR+DIRFS(A2)YES,SETFILESTARTINGPSNINDIRECTORY ŠCLR.L‚D4‘SETBACKWARDLINKTO0 ŠBRA.S‚FBAL20*>FBAL15„MOVE.LA1,(A3)ŒSETFORWARDLINK'FABFLK'INCURRENTFABŠBSR„FABCHGSETFLAGTO&ŠBSR„PUTFABUPDATECURRENTFABONDISKŠBNE.S‚FBALRTERROR*!*ˆSETUPNEWFABBUFFERINMEMORY   'KK!K)L1K9EAFI?Q;YAa;i8q8yQ@‰B‘H™I¡N©L±F¹BÁ:É6Ñ^ÙLá5é?ñKù7*AFBAL20„MOVE.LA1,FCBDIR+DIRFE(A2)LASTFABPOINTERINTODIRECTORY=ŠBSETW‚#FCFLDB,FCBFLG(A2)FLAGFCBTOBECHANGEDINDIRECTORY(ŠCLR.L‚(A3)+ŽCLEARFORWARDLINK'FABFLK'+ŠMOVE.LD4,(A3)+‹SETBACKWARDLINK'FABBLK'!ŠCLR.B‚(A3)+ŽCLEAR'FABRES'FIELD)ŠMOVE.LA1,FATFAB(A4)†SETCURRENTFABPSN!ŠCLR.W‚D0‘SETFABPKYFIELDLENGTHŠMOVE.BFCBDIR+DIRKEY(A2),D0.8ŠMOVE.BD0,(A3)+‹.FULLKEYSONLYTOSIMPLIFYEVERYTHING ŠBEQ.S‚FBAL30.NULLORNOKEYS?ŠMOVE.LFATKEY(A4),A1†.ŠTST.L‚D2‘.FIRSTFAB?*ŠBEQ.S‚FBAL40.YES,GOSETHEADERKEY=09ŠCMP.B‚(A1)+,D0‹MOVEPREVIOUSFAB'SLASTKEYINTONEWFAB8ŠBNE.S‚FBALIE.LASTKEYSHOULDBEFULLLENGTHFORNOW*FBAL25„MOVE.B(A1)+,(A3)+ˆ.ŠDCNTƒD0,FBAL25Š.&FBAL30„BSR„RLNFT2RESETLSN/LRNINFATDŠMOVE.LA3,A0‚CLEARDATAPORTIONOFFABRETURNFIRSTSDPOINTERINA0'ŠSUB.L‚A3,D5Ž.GETFABDATAPORTIONBCTŠADD.L‚#1,D5Ž.#ŠLSR.L‚#1,D5Ž.D0=LONGWORDCOUNTFBAL35„CLR.W‚(A3)+ŽCLEARŠDCNTƒD5,FBAL35Š.&ŠBSR„FABCHGSETFLAGTOUPDATENEWFABŠCLR.L‚D0‘FLAGGOODRETURN2FBALRT„MOVEM.L(A7)+,D1-D5/A1/A3RESTOREREGISTERSŠRTS*@FBAL40„LSR.W‚#1,D0‹SETKEY=0FOR1STFABTOMAKETHINGSEASIERFBAL45„CLR.W‚(A3)+Ž.ŠDCNTƒD0,FBAL45Š.ŠBRA„FBAL30CONTINUEŠPAGE**%*ˆ*************************************ŒFBDEAL‚1.00‚7/25/79‚HBN6*%*ˆ*************************************5*‚FBDEALDEALLOCATESDISKSPACEFORTHEFABINMEMORY* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS* *‚ONRETURN:%*ˆALLREGISTERSAREUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR *ˆD0.B=ISTAFABIFNO-FABERROR*ˆZ=1IFNOERROR *Œ0IFERROR**‚FBDEALCALLSDSDEAL*ˆREFERENCESFCBANDFAT** FBDEAL„EQU„*#ŠMOVEM.LD1/A1,-(A7)‡SAVEREGISTERS(ŠMOVE.LFATFAB(A4),D1†ANYFABINMEMORY?ŠBNE.S‚FBDE00YES ŠMOVE.L#NL+ISTAFAB,D0…NO,ERROR ŠBRA.S‚FBDERT*0FBDE00„MOVE.LD1,A1ŽPSNOFFABTOBEDEALLOCATED'ŠBSR„DEALFBDEALLOCATEFAB'SDISKSPACE,FBDERT„MOVEM.L(A7)+,D1/A1‡RESTOREREGISTERSŠRTSŠPAGE*$*ˆ************************************ŒDELFAB1.0011/6/79HBN6*$*ˆ***********************************<*‚DELFABDEALLOCATESCURRENTFAB,FORWARDANDBACKWARDLINKS1*ˆAREUPDATEDINPRIORANDNEXTFABORDIRECTORY."*ˆNOCURRENTFABEXISTSONRETURN.* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR*ˆD0.B=ERRORCODE*ˆZ=1IFNOERROR *Œ0IFERROR**INDENTED LIST;* DELFAB DEALLOCATES AND REMOVES CURRENT FAB FROM FAB CHAIN*DELFAB PASS CURRENT FAB* UPDATE NEXT FAB HEADER*‚CALL$NXTFHD* UPDATE PREVIOUS FAB-HEADER*‚CALL$PRVFHD* FIRST-OR LAST-FAB DELETED?*‚YESUPDATEFCB* DEALLOCATE FAB'S DISK SPACE*‚CALL$FBDEAL* RETURN*INDENTED LIST END* DELFAB„EQU„**&*ˆUPDATENEXTFABHEADERIFONEEXISTS*,ŠMOVEM.LA0-A1/A3/D1-D5,-(A7)SAVEREGISTERS!ŠMOVE.LFATFAB(A4),D2†CURRENTFABŠBNE.S‚DELF00AFABINMEMORY? ŠBSR„ISTAIERR‹NO,INTERNALERROR ŠBRA.S‚DELFRT,DELF00„MOVE.LFATFAA(A4),A0†FABBUFFERSTART2ŠLEA„FABPKY(A0),A1†ADDROFPREVFABLASTKEYVALUE)ŠMOVE.LA1,FATKEY(A4)†DUMMYUPFORNXTFHD)ŠMOVE.LFABBLK(A0),D4†BACKWARDLINKVALUE0ŠMOVE.L#2,D0ŽTELLNXTFHDTOUPDATEKEYANDLINKŠMOVE.L(A0),D3ŒNEXTFABŠBSR.S‚NXTFHD.ŠBNE.S‚DELFRTERROR?*)*ˆSETFORWARDLINKINPREVIOUSFABIFANY$*ˆUPDATEDIRENTRYIFDELETE1STFAB*,ŠBSR„PRVFHDUPDATEFORWARDLINKINPRIORFABŠBNE.S‚DELFRTERROR?*5*ˆUPDATEDIRECTORYENTRYIFDELETED‚LASTORFIRSTFAB*ŠTST.L‚D3‘ANYNEXTFAB?ŠBNE.S‚DELF30YESAŠMOVE.LD4,FCBDIR+DIRFE(A2)NO,PREVIOUSFABISNOWLASTINCHAIN=ŠBSETW‚#FCFLDB,FCBFLG(A2)SETFLAGTHATDIRENTRYGOTCHANGEDDELF30„TST.L‚D4‘ANYPRIORFAB?ŠBNE.S‚DELF35YESBŠMOVE.  LD3,FCBDIR+DIRFS(A2)NO,NEXTFABISNOWFIRSTINFABCHAIN0ŠBSETW‚#FCFLDB,FCBFLG(A2)FLAGDIRENTRYCHANGED**ˆDEALLOCATEFAB'SDISKSPACE*-DELF35„BSR„FBDEALDEALLOCATEFAB'SDISKSPACE+ŠCLR.L‚FATFAB(A4)‰NOFABINMEMORYANYMORE0ŠBCLRW‚#FAFLFB,FATFLG(A4)CLEARFABCHANGEDFLAG5DELFRT„MOVEM.L(A7)+,A0-A1/A3/D1-D5RESTOREREGISTERSŠTST.B‚D0‘RESETCOND.CODEŠRTSŠPAGE#*ˆ***********************************ŒNXTFHD1.0011/27/79HBN6*#*ˆ**********************************>*‚NXTFHDUPDATESNEXTFAB'SHEADER:BACKWARDLINKANDLASTKEY* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS*ˆD3=PSNOFNEXTFAB*ˆD4=BACKWARDLINKTOBEUSED*ˆD0=0IFLINKONLY*-1IFKEYONLY-*1IFUPDATELINKANDZEROOUTKEYINHEADER*2IFUPDATELINKANDKEY<*ˆFATKEY(A4)-‚ADDRESSOFKEYLENGTH(0IFNONE)FOLLOWEDBY *–KEYVALUE* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR*ˆD0.B=80+IFIOERROR*ˆZ=1IFNOERROR *Œ0IFERROR* NXTFHD„EQU„**:*ˆREAD1STSECTOROFNEXTFABINTOTEMPORARYSECTORBUFFER*,ŠMOVEM.LD1-D2/A1/A3/A5,-(A7)SAVEREGISTERSŠMOVE.LD0,D2ŽSAVEFLAGBŠMOVE.LD3,D0„READIN1STSECTOROFNEXTFABTOUPDATELINKS&KEY&ŠBEQ.S‚NXTFRTSKIPCALLIFNONEXTFABŠMOVE.L#IOREAD,D1‰READ3ŠBSR„GPTSECA1RETURNSPOINTINGTOSECTORJUSTREADŠBNE.S‚NXTFRTERROR?**ˆUPDATEHEADERINFO(D0=0)*-ŠLEA„FABPKY(A1),A5†MOVETOADRFORHEADERKEYŠCMP.B‚#2,D2ŽKEYANDLINK?ŠBEQ.S‚NXTF05YES*ŠTST.L‚D2‘SKIPKEYUPDATEIFNOTREQUESTEDŠBPL.S‚NXTF20NOTREQUESTED-NXTF05„MOVE.LFATKEY(A4),A3†GETMOVEFROMADR!ŠMOVE.B(A3)+,D0‹GETFIELDLENGTH(ŠMOVE.BD0,(A5)+‹SAMELENGTHINNEXTFABŠLSR.W‚#1,D0ŽANYKEYTHERE?ŠBEQ.S‚NXTF15NO&NXTF10„MOVE.W(A3)+,(A5)+ˆYES,SAVEITŠDCNTƒD0,NXTF10Š. NXTF15„SUB.L‚#2,D2ŽKEYANDLINK?ŠBEQ.S‚NXTF25YESŠBRA.S‚NXTF30NO,KEYONLY NXTF20„SUB.L‚#1,D2ŽZEROOUTKEY?ŠBEQ.S‚NXTF35YES1NXTF25„MOVE.LD4,FABBLK(A1)†NO,SETBACKWARDLINK**ˆWRITETHESECTORBACKTODISK* NXTF30„MOVE.LD3,D0ŽWRITEITOUTŠMOVE.L#IOWRIT,D1‰WRITE3ŠBSR„GPTSECA1RETURNSPOINTINGTOSECTORJUSTREAD5NXTFRT„MOVEM.L(A7)+,D1-D2/A1/A3/A5RESTOREREGISTERSŠRTS**ˆCLEARKEY(D2=0)*'NXTF35„MOVE.B(A5)+,D2‹GETBCTTOCLEARŠBEQ.S‚NXTF25SKIPIFNULLKEYSNXTF40„CLR.B‚(A5)+ŠDCNTƒD2,NXTF40ŠBRA„NXTF25GOUPDATELINKŠPAGE*#*ˆ***********************************ŒPRVFHD1.0011/27/79HBN6*#*ˆ**********************************4*‚PRVFHDUPDATESFORWARDLINKINPREVIOUSFABHEADER* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS*ˆD4=PSNOFPREVIOUSFAB*ˆD3=FORWARDLINKTOBEUSED* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR*ˆD0.B=80+IFIOERROR*ˆZ=1IFNOERROR *Œ0IFERROR* PRVFHD„EQU„**!*ˆREADIN1STSECTOROFPRIORFAB*#ŠMOVEM.LD1/A1,-(A7)‡SAVEREGISTERSŠMOVE.LD4,D0ŽANYPREVIOUSFAB?ŠBEQ.S‚PRVF00NO,JUSTRETURNŠMOVE.L#IOREAD,D1‰READ3ŠBSR„GPTSECA1RETURNSPOINTINGTOSECTORJUSTREADŠBNE.S‚PRVFRTERROR?**ˆUPDATEFABHEADERINFORMATION*)ŠMOVE.LD3,(A1)ŒSETFORWARDLINK(FABFLK)**ˆWRITETHESECTORBACKTODISK*+ŠMOVE.LD4,D0ŽRESTORESECTOR'SPSNFORCALLŠMOVE.L#IOWRIT,D1‰WRITE ŠBSR„GPTSEC. ŠBRA.S‚PRVFRT>PRVF00„MOVE.LD3,FCBDIR+DIRFS(A2)SETNEW1STFABINDIRECTORY4ŠBSETW‚#FCFLDB,FCBFLG(A2)SETDIRENTRYCHANGEDFLAGŠTST.B‚D0‘SETGOODRETURNFLAGS,PRVFRT„MOVEM.L(A7)+,D1/A1‡RESTOREREGISTERSŠRTSŠPAGE*%*ˆ*************************************ŒGETFDB‚1.00‚7/25/79‚HBN6*%*ˆ*************************************1*‚GETFDBFINDSTHESEGMENTCORRESPONDINGTOGIVEN:*ˆLSN,LRN,ORKEY.‚THENEWCURRENTSEGMENTISESTABLISHED?*ˆANDIFREADISREQUESTED,THENEWSEGMENTISREADINTOMEMORY=*ˆIFTHECURRENTSEGMENTISSWITCHEDCURRENTBLOCKISUPDATED!*ˆONDISKIFITHASBEENCHANGED.=*ˆNOTHINGACTUALLYHAPPENSIFCURRENTBLOCKSATISFIESREQUEST.*ˆIFA  FABHASTOBEREPLACEDALLCHANGEDDISK*ˆBLOCKSAREWRITTENTODISK.=*ˆONRETURN,FORLSNANDLRNTHECURRENTSEGMENTCONTAINSTHE7*ˆREQUESTEDSECTORORRECORD.‚FORKEYS,THERECORDWITH:*ˆTHEGIVENKEYMUSTBEINCURRENTSEGMENTORELSEITDOES.*ˆNOTEXIST(THISCHECKISNOTMADEBYGETFDB);*ˆNOTE:D1MUSTBEONTOPOFSTACKWHENREGISTERSARESAVED* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS2*ˆD0.L=LSN,LRN,ORKEYPOINTERWHEREAPPLICABLE?*ˆD1.L=GETFDBDIRECTIVEANDREAD&IGNORELSN-EOFCONFLICTFLAG$*ˆD2.L=KEYLENGTHWHEREAPPLICABLE* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:#*ˆA0=ADDRESSOFCURRENTFABENTRY*ˆD0.L=0IFNOERROR>*ˆD0.B=ISTAIEIFLSNFDB/LRNFDBANDLSN/LRN=-1ORDIRECTIVE *’TOOLARGE/*ISTAEOFIFLSNFDB/LRNFDB‚ANDLSN/LRNPASTEOF*’ORKEYFDBANDEMPTYFILE#*ISTAFDIFFAB-DATABLOCKCONFLICT*80+IFIOERROR*ˆZ=1IFNOERROR *Œ0IFERROR**INDENTED LIST7* GETFDB FINDS DATA BLOCK FOR SPECIFIED LSN, LRN OR KEY*GETFDB PASS-LSN, LRN-OR KEY* LSN-OR-LRN OUT-OF RANGE?*‚YES,RETURNEND-OFFILE-ERROR * NO,-RECORD IN CURRENT SEGMENT?(*‚YES,RETURN(READ-DBIF-USERSHARES-DB)* NO,FIND FAB-AND SEGMENT"*‚SAVE-CURR.DATA-BLKCALL$PUTDAT*ƒDATABLOCKWITHINCURR.-FAB?*„NO,-FINDPROPERFABCALL$*…$GTFNSR,$GTFPSR,$GTFLSR,$GTFFSR%*…ALSO-CALL$CHKKEY,$DPLKEY,$LASTSG* DB READ REQUESTED?"*‚YES,DBIN-MEMORYFOR-OTHERUSER?*ƒYES,MOVEDB-INMEMORY*„ADJUSTFATSBL*ƒNO,REQDBLOCKFROM-DISK$DOIO*„ADJUSTFATSBL** IF-GOT-NEW FAB-OR-DB TRY-MERGE WITH-NEXT*‚CALL$CMBNDB,$CMBNFB* RETURN SEGMENT FOUND*INDENTED LIST END* GETFDB„EQU„***ˆGETDIRECTIVEBRANCHADDRESS*AŠMOVEM.LD1-D7/A3/A1/A5,-(A7)SAVEREGISTERS(D1ATTOPOFSTACK)9ŠAND.W‚#$3F,D1ŒANDOFFFLAGBITS(LEAVEDIRECTIVENUMBER)%ŠCMP.B‚#NODIR,D1ŠDIRECTIVETOOLARGE?!ŠBLT.S‚GTFBIE.1‹BRANCHIFNO-OKŠBSR„ISTAIERR‹YES-ERROR ŠBRA.S‚GTFBEX7GTFBIE.1‚MOVE.LD0,D3ŽSAVELSN,LRNORKEYPOINTERINFO$ŠMOVE.LD2,D4ŽSAVEKEYLENGTHIFANY&ŠCLR.L‚D0‘GETDIRECTIVEBRANCHADDRESSŠLEA„GTFBAD,A0Š.ŠLSL.W‚#1,D1Ž.D1*2ŠMOVE.W0(A0,D1),D0ˆ.-ŠADD.L‚#FMSSTR,D0‰MAKEINTOPHYSICALADDRESS. ŠMOVE.LD0,A1ŠPAGE*(*ˆDOCOMMONREGISTERSETUPFORALLCASES*.ŠBCLRW‚#FAFLIB,FATFLG(A4)CLEARFABINPUTFLAG&ŠMOVE.LFATFAA(A4),A3†FABBUFFERSTART ŠMOVE.LFATFAE(A4),A5†BUFFERENDŠMOVE.LFATFAB(A4),D1†FABPSN/ŠMOVE.LFATCFP(A4),A0†CURRENTFABENTRYPOINTERŠCLR.L‚D0‘CLEARRETURNFLAG'ŠCLR.L‚D5‘CLEARREGISTERFORBYTEMOVES$ŠJMP„(A1)BRANCHTOHANDLEDIRECTIVE**ˆGETFDBDIRECTIVEJUMPTABLE*NOCURRENTFABENTRY ŠTST.L‚D0 ŠBRA.S‚GTFBRTŠPAGE**7*ˆGETFAB/SEGMENTCORRESPONDINGTOLRNIN‚D3‚**LRNFDB****GTFR00„EQU„*’LRNFDB*$ŠMOVE.LFCBDIR+DIREOR(A2),D2EOFLRN:ŠMOVE.L#FATFLR+(FATSLR*$10000),D61STLRNFORCURRENTFAB6ŠMOVE.L#FATLLR+(0*$10000),D7LASTLRNFORCURRENTFAB7ŠBRA.S‚GTFSRCGODOCOMMONPROCESSINGFORLRNFAB/LSNFAB**;*ˆGETFABANDSEGMENTCORRESPONDINGTOLSNIND3‚**LSNFDB***  *GTFS00„EQU„*’LSNFDB*=ŠMOVE.LFCBDIR+DIREOF(A2),D2SETUPCALLPARAMETERSFORLSNFDB$ŠMOVE.L#FATFLS+(FATSLS*$10000),D6. ŠMOVE.L#FATLLS+(-1*$10000),D7.9ŠMOVE.L(A7),D0ŒCHECKIFEOF/LSNRANGETESTTOBEIGNOREDŠBTSTW‚#EOFFLGB,D0ˆ.ŠBNE.S‚GTFC00YES*;GTFSRC„EQU„*ŽCOMMONCODETOFINDFAB/SEGMENTFORLSNORLRN*%*ˆCHECKLSN/LRNFORERRORORPASTEOF*ŠMOVE.L#-1,D0ŠCMP.L‚D0,D3ŽLSN/LRN=-1?ŠBEQ„GTFBEFYES,NOFABSEXISTŠADD.L‚#1,D2ŽEMPTYFILE?(ŠBEQ„GTFBEFYES,LSN/LRNISOUTOFRANGE ŠSUB.L‚#1,D2"ŠCMP.L‚D2,D3ŽLSN/LRNOUTOFRANGE?ŠBHI„GTFBEFYES,ERROR*>*ˆJUSTRETURNIFCURRENTSEGMENTSATISFIESREQUESTANDFMSHAS@*ˆBUFFER,IFNOTMUSTREADDATABLOCKTOMAKESUREUSERBUFFERO* GTFC00„EQU„*ŠTST.L‚D1‘AFABINMEMORY?FŠBEQ.SGTFC40NO-STARTSEARCHFROM1STFABUNLESSLASTLSN/LRNWANTE8ŠCMP.L‚A0,D5YES,ANYCURRENTSEGMENT?(A0=FATCFP=0)ŠBEQ.S‚GTFC20NO<ŠMOVE.LFATSLS(A4),D0†YES,COMPARELSN/LRNTOSEGMENTBOUNDS8ŠMOVE.BFABSGS(A0),D5†#OFSECTORSINCURRENTDATABLOCKŠTST.L‚D7‘LSNFDB?ŠBMI.S‚GTFC10YES ŠMOVE.LFATSLR(A4),D0†NO,LSRFDB1ŠMOVE.WFABREC(A0),D5†GET#OFRECORDSINSEGMENTGTFC10„ADD.L‚D0,D5ŽUPPERBOUND ŠCMP.L‚D3,D0$ŠBHI.S‚GTFC15NOTINCURRENTSEGMENTŠCMP.L‚D5,D3ŽLOWERBOUND$ŠBCC.S‚GTFC15NOTINCURRENTSEGMENTEŠBTSTW‚#FAFLSB,FATFLG(A4)JUSTRETURNUNLESSFMSDOESNOTHAVEBUFFER ŠBNE„GTFBGRFMSOWNSBUFFER-DONE3ŠBRA„GTFBR0MUSTREADSINCEUSERCANSWITCHBUFFERS*#*ˆFINDFABCORRESPONDINGTOLSN/LRN*"GTFC15„CLR.L‚D0‘NOKEYUPDATEFLAG;ŠBSR„PUTDATˆSWITCHBLOCKS,WRITEOUTCURRENTONEIFCHANGEDŠBNE„GTFBRTERROR5ŠCLR.L‚FATCFP(A4)‰SETNOCURRENTSEGMENTTILLFINDITŠCLR.L‚D5‘D5.L=0AGAIN!GTFC20„TST.L‚D3‘FIRSTFABWANTED?ŠBEQ.S‚GTFC25YESŠCMP.L‚D2,D3ŽLASTFABWANTED?ŠBEQ.S‚GTFC30YES3ŠBRA.S‚GTFC45NO,GOCHECKCURRENTFABFOR/LSN/LRN*-GTFC25„BSR„GTFFSRGETFIRSTFAB/FIRSTSEGMENT ŠBRA.S‚GTFC35>FC30„BSR„GTFLSRGETLASTFAB/SEGMENT1GTFC35„BEQ„GTFBR0GOREADDATABLOCKIFREQUESTEDŠBRA.S‚GTFCERERRORORNOFAB!GTFC40„CMP.L‚D2,D3ŽWANTLASTFAB?ŠBEQ.S‚GTFC30YESAŠBSR„GTFFSR‚NO,STARTSEARCHWITHFIRSTFABWHENNOFABINMEMORYŠBNE.S‚GTFCERERROR?*%*ˆCHECKCURRENTFABFORLSN/LRNRANGE*2GTFC45„EQU„*’STARTLOOKINGFROM1STSEGMENTINFABŠMOVE.BFABPKY(A3),D5†.ŠLEA„FABSEG(A3,D5),A0ƒ./GTFC50„MOVE.LFATFAB(A4),D1†GETCURRENTFABPSN?ŠCMP.L‚0(A4,D6),D3†CHECKLOWERBOUNDFORLSN/LRN-INTHISFAB?8ŠBCS.S‚GTFC55.NO,GOGETPREVIOUSFAB-BACKWARDSEARCH3ŠCMP.L‚0(A4,D7),D3ˆCHECKUPPERBOUND-INTHISFAB?ŠBLS.S‚GTFC65.YES,FOUNDFAB/ŠBSR„GTFNSR.NO,GETNEXTFAB-FORWARDSEARCH ŠBRA.S‚GTFC60GTFC55„BSR„GTFPSRPREVIOUSFAB4GTFC60„BEQ.S‚GTFC50GOSEEIFLSN/LRNISINTHISFABGTFCER„BRA„GTFBERERROR*5*ˆFABFOUND-FINDSEGMENTCORRESPONDINGTOLSNORLRN*5GTFC65„MOVE.L0(A4,D6),D0ˆGETSTARTINGLSN/LRNOFFAB?ŠBSR„SETFSL„INITIALIZEFORSEGMENTSTARTINGLSN/LRNCALCULATION&ŠCLR.L‚D1‘CLEARD1FORBYTE/WORDMOVES&ŠCLR.L‚D4‘CLEARD4FORBYTE/WORDMOVESŠSWAPƒD6‘SWITCHOFFSETS ŠSWAPƒD7‘.AGTFC70„MOVE.BFABKEY(A0),D5†KEYFIELDLENGTHOFCURRENTFABENTRY=ŠLEA„FABSSL(A0,D5),A5ƒA5->NEXTFABENTRY,A0->CURRENTONEŠCMP.L‚D0,D3ŽEQUAL?!ŠBEQ.S‚GTFBRDYES,THISISTHESDŠBCC.S‚GTFCIE.1‹BRANCHIFOK.ŠBSR„ISTAUFRR‹.LT.=>UNRECOVERABLEFILEERRORGTFBEX.1‚BRA„GTFBEXGTFCIE.1‚EQU„****ˆGETLSN/LRNUPPERBOUNDFORTHISSEGMENT*.ŠMOVE.BFABSGS(A0),D4†GETSECTORCOUNTINTOD4.ŠMOVE.WFABREC(A0),D1†ANDRECORDCOUNTINTOD1ŠTST.W‚D7‘D7.W=0IFLRNFDBŠBEQ.S‚GTFC75LRNFDB!ŠADD.L‚D4,D0ŽLSNFDB:COMPARELSNS ŠBRA.S‚GTFC80'GTFC75„ADD.L‚D1,D0ŽLRNFDB:COMPARELRNS.GTFC80„CMP.L‚D3,D0ŽISLSN/LRNINTHISSEGMENT?ŠBHI.S‚GTFBRDYESFŠADD.LD4,FATSLS(A4)NO,TRYNEXTSEGMENT-UPDATESEGMENTLSNANDLRNŠADD.L‚D1,FATSLR(A4)†./ŠMOVE.LA5,A0Ž.A0->NEXTSEGMENTTOBETESTED.ŠMOVE.LFATFAE(A4),A5†PASTENDOFFABENTRIES?ŠSUB.L‚#3,A5Ž.ŠCMP.L‚A5,A0Ž.ŠBCS.S‚GTFCIE.2‹BRANCHIFNOT,ŠBSR„ISTAUFRR‹YES  -UNRECOVERABLEFILEERRORGTFBEX.2‚BRA.S‚GTFBEX.1+GTFCIE.2‚TST.L‚(A0)ORNOMOREFABENTRIES?ŠBNE„GTFC70YES ŠBSR„ISTAUFRR‹NO,INTERNALERRORGTFBEX.3‚BRA.S‚GTFBEX.2ŠPAGE*!*ˆREADINDATABLOCKIFREQUESTED*AGTFBRD„MOVE.LA0,FATCFP(A4)†SETCURRENTSEGMENTFABENTRYPOINTER*GTFBR0„MOVE.L(A7),D0ŒGETREADFLAGSTATUSŠBTSTW‚#RDBFLGB,D0ˆ.ŠBEQ„GTFBGRNOREADREQUESTED#ŠCLR.L‚D5‘D5CLEAREDFORBYTYMOVES7ŠMOVE.L(A0),D0ŒGETFABPSN=PSNOFDATABLOCKTOBEREAD-ŠMOVE.LFATSBS(A4),A3†BUFFERSTARTINGADDRESS(ŠMOVE.BFABSGS(A0),D5†GETENDINGADDRESSŠMULUƒ#SECSZE,D5‰.ŠSUB.L‚#1,D5Ž.*ŠADD.L‚A3,D5ŽGETENDINGADDRESSFORBUFFER,ŠMOVE.LD5,FATSBL(A4)†ANDSETASLOGICALEND&ŠMOVE.LA3,D1Ž(GETREGODERFORMACRO)@ŠSETSBAD0,D1,D5,VDTIOS(A6)SETPSN,BUFFERSTARTANDENDADDRESS>ŠSETFO‚IOREAD,IOPRAN+IOPIMG,VDTIOS(A6)SETCOMMANDANDOPTIONS7*FIRST CHECK TO SEE IF DATA BLOCK IS IN ANOTHER SEGMENT ŠBSR„CHKMA!ŠBEQ„GTFBR0LŒNOOTHERASSIGNMENTS ŠMOVE.LA0,D0%ŠSUB.L‚FATFAA(A4),D0†D0=OFFSETTOCFP*GO THROUHG OTHER FATSŠMOVE.LFATSTR,A1GTFBR0BƒCMP.L‚A4,A1&ŠBEQ.S‚GTFBR0CŒSKIPOVERCURRENTENTRY*DOES FMS OWN DB FOR THIS USER?ŠBTSTW‚#FAFLSB,FATFLG(A1)ŠBEQ.S‚GTFBR0CŒNO-SKIP*FAT'S MUST HAVE SAME FCBŠMOVE.LFATFCB(A1),D1ŠCMP.L‚FATFCB(A4),D1ŠBNE.S‚GTFBR0CŠMOVE.LFATFAB(A1),D1ŠCMP.L‚FATFAB(A4),D1ŠBNE.S‚GTFBR0CŒNOTRIGHTFABŠMOVE.LFATCFP(A1),D1ŠSUB.L‚FATFAA(A1),D1ŠCMP.L‚D0,D1ŽSAMECFP?ŠBEQ.S‚GTFBR0EŒYES-USEGTFBR0CƒLEA„FATLEN(A1),A1ŠCMP.L‚FATEND,A1ŠBLS.S‚GTFBR0BŒCHECKNEXTFATŠBRA.S‚GTFBR0LŒDBNOTINMEMORY&*DB IS IN MEMORY-TRANSFER TO THIS USERGTFBR0EƒMOVE.LA0,-(A7)‹SAVEA0/ŠMOVE.LVDTIOS+IOSSAD(A6),D1D1=STARTOFBUFFER#ŠBSR„GETOSGATTACHTOOTHERSEGMENT-*IF DB IS IN FMS SEGMENT, MOVE BYTES DIRECTLYŠBTSTW‚#FAFLSB,FATFLG(A4) ŠBEQ.S‚GTFBR0HŒNOTINFMSBUFFERŠMOVE.LD1,A0ŽSTARTOFTHISDB'ŠMOVE.LFATSBS(A1),A1†STARTOFOTHERDBGTFBR0GƒMOVE.L(A1)+,(A0)+ŠCMP.L‚D5,A0ŽATEND?ŠBLS.S‚GTFBR0GŒNOŠBRA.S‚GTFBR0K*MUST DO L-L MOVEGTFBR0HƒBSR„SMOVE41ŠMOVE.LFATSBS(A1),MVSADD(A0)SETUPSOURCEZDDR.ŠMOVE.LD1,MVDADD(A0) ŠMOVE.LD5,D0 ŠSUB.L‚D1,D0 ŠADD.L‚#1,D0ŠMOVE.LD0,MVLENG(A0)ŠERQ.MOVELL(A0) ŠBSR„FTL.NE;*DATA HAS BEEN TRANSFERRED-RE-ATTACH TO COMMON DATA SEGMENT+GTFBR0KƒBSR„GETCSGATTACHTOCOMMONSEGMENTŠMOVE.L(A7)+,A0‹RESTOREA0ŠBRA.S‚GTFBR1A0GTFBR0LƒBTSTW‚#FAFLSB,FATFLG(A4)FMSHASBUFFER?ŠBNE.S‚GTFBR1YESCŠMOVE.LFATTSK(A4),VDTIOS+IOSTSK(A6)NO,DOTRANSFERTOUSERBUFFERCŠMOVE.LFATSES(A4),VDTIOS+IOSSES(A6)SETUSERTASKIDANDSESSION#?ŠBSETW‚#IOPTSKB,VDTIOS+IOSOPT(A6)SETFLAGFORTASKIDSUPPLIEDGTFBR1„MOVE.LA0,-(A7)‹SAVE ŠBSR„DOIOŠMOVE.L(A7)+,A0 ŠBNE.S‚GTFBR9 GTFBR1AƒEQU„**5*ˆADJUSTLOCICALENDPOINTERIFFRLORFMSHASBUFFER*.ŠMOVE.WFCBDIR+DIRLRL(A2),D0GETRECORDLENGTH%ŠBEQ.S‚GTFBR4VARIABLERECORDLENGTH?,ŠMULUƒFABREC(A0),D0†NO,FRL-GETBUFFERBCT+ŠADD.L‚D0,A3ŽGETENDOFLASTRECORDPOINTERGTFBR2„SUB.L‚#1,A3Ž.4GTFBR3„MOVE.LA3,FATSBL(A4)†ITISBUFFERLOGICALEND GTFBR3AƒEQU„*ŠIFEQƒFMSLEVEL-35ŠBSR„CMBNDBTRYTOCOMBINEBLOCKWITHNEXTDATABLOCK ŠBEQ„GTFBGRŠBRA.S‚GTFBR9ERRORŠENDCŠIFEQƒFMSLEVEL-2 ŠBRA„GTFBGRŠENDC*/GTFBR4„BTSTW‚#FAFLSB,FATFLG(A4)FMSHASBUFFER?4ŠBEQ.S‚GTFBR3AŒNO,LOGICALENDATENDOFLASTSECTOR;ŠCMP.L‚FATSBE(A4),D5†YES,JUSTREADINLASTPAGEOFBUFFER?ŠBEQ.S‚GTFBR4AŒYES:ŠMOVE.LD5,A1ŒNO,SETNEXTWORDAFTERLASTSECTORREAD=0DŠADD.L‚#1,A1.SOSHAREDBUFFERUSERSKNOWWHEREBUFFERENDSWITHOUT"ŠCLR.W‚(A1).PROBLEMSIFVRLFILE1GTFBR4AƒCLR.L‚D1‘COUNTRECORDS-INITIALIZECOUNT ŠCLR.L‚D0‘.,GTFBR5„CMP.L‚FATSBL(A4),A3†ATENDOFBUFFER?ŠBHI.S‚GTFBR2YES$ŠMOVE.W(A3)+,D0‹GETNEXTRECORDBCTŠBEQ.S‚GTFBR8ENDOFRECORDS?ŠBTSTW‚#0,D0ŽODDLENGTHRECORDŠBEQ.S‚GTFBR6NO"ŠADD.L‚#1,D0ŽYES,SKIPFILLERBYTE-GTFBR6„ADD.W‚#1,D1ŽNO,INCREMENTRECORDCOUNTŠADD.L‚D0,A3ŽGETNEXTRECORDŠBRA.S‚GTFBR5SKIPNEXTRECORD*AGTFBR8„SUB.L‚#3,  A3ŠGETA3->INGTOENDOFLASTRECORD(LASTBYTE)6ŠCMP.W‚FABREC(A0),D1†FABINFOMATCHESWITHDATABLOCK?ŠBEQ.S‚GTFBR3YES/ŠMOVE.L#NL+ISTAFD,D0†NO,RECORDCOUNTCONFLICTGTFBEX.4‚EQU„*NEXTFABENTRY-ŠCMP.L‚FATFAE(A4),A1†PASTTHEENDOFTHEFAB?ŠBLO.S‚GTFK16BRANCHIFNO-OKŠBSR„ISTAUFRR‹HANDLECEERRORGTFBEX.7‚BRA.S‚GTFBEX.66GTFK17„BSR„CHKKEYNOWCOMPAREWITHPRIORDB'SLASTKEYFŠBEQ.SGTFK25EQUALKEYS=>WANTEDKEYINPRIORDBUNLESSCURR.DB=1<ŠBRA.S‚GTFK20‰KEYSNOTEQUAL,1STRECORDOFCURRENTDBISITGGTFK19„MOVE.LD1,A0…LOWERBOUNDOK,TESTUPPERBOUNDFORKEYSINSEGMENAŠADD.L‚#FABKEY,A0„.A0->LASTKEYINSEGMENTASSAVEDINFABENTRY ŠBSR„CHKKEY.4ŠBLS.S‚GTFK20KEYISINCURRENTSEGMENT,JUSTRETURN4ŠBSR„LASTSGISCURRENTSEGMENTTHELASTONEINFILE?"ŠBNE.S‚GTFK30NO,GOSWITCHBLOCKS=GTFK20„BRA„GTFBGRŒYES,KEYINSERTPOSITIONISATENDOFBLOCK=GTFK25„TST.L‚FATSLS(A4)‰INSERT1STKEYIFCURRENTSEGIS1ST?ŠBEQ.S‚GTFK20YES,JUSTRETURN*!*ˆKEYINCURRENTFAB'SKEYRANGE?*"GTFK30„CLR.L‚D0‘NOKEYUPDATEFLAG3ŠBSR„PUTDATWRITEOUTCURRENTDATABLOCKIFCHANGEDŠBNE„GTFBRTERROR5ŠCLR.L‚FATCFP(A4)‰SETNOCURRENTSEGMENTTILLFINDIT5GTFK35„LEA„FABPKY(A3),A0†SETA0->1STKEYFIELDOFFAB ŠBSR„CHKKEY.3ŠBLS„GTFK70KEYISINAPRIORFAB-BACKWARDSEARCH&ŠMOVE.LFATKEY(A4),A0†TESTUPPERBOUND ŠBSR„CHKKEY.6ŠBHI„GTFK75KEYINSOMEFABAFTERTHIS,FORWARDSEARCH**ˆYES,FINDSEGMENTFORKEY*,GTFK40„CLR.W‚D5‘GETA3->INGTO1STFABENTRYŠMOVE.BFABPKY(A3),D5†.ŠLEA„FABSEG(A3,D5),A3ƒ./ŠBSR„SETFSLINITIALIZESEGMENTSTARTINGLSN/LRN*ŠBRA.S‚GTFK50GOSEEIFKEYIS1STSEGMENTCGTFK45„MOVE.BFABSGS(A3),D5†INCREMENTSTARTINGLSNFORNEXTSEGMENTŠADD.L‚D5,FATSLS(A4)†.=ŠMOVE.WFABREC(A3),D5†INCREMENTSTARTINGLRNFORNEXTSEGMENTŠADD.L‚D5,FATSLR(A4)†.ŠCLR.W‚D5‘D5=0(ŠADD.L‚#FABKEY,A3‰GETNEXTENTRYPOINTER#ŠMOVE.B(A3)+,D5‹.KEYFIELDLENGTHŠBNE.S‚GTFBIE.4‹BRANCHIFOK7ŠBSR„ISTAIERR‹INTERNALERROR-KEYLGTH.MUSTBE.GE.4GTFBEX.8‚BRA„GTFBEX.7)GTFBIE.4‚ADD.L‚D5,A3ŽA3->NEXTFABENTRYŠLEA„-3(A5),A0ŠCMP.L‚A0,A3ŽATENDOFFABŠBCC.S‚GTFK55YES/ŠTST.L‚(A3)ERRORIFCAN'TFINDSEGMENTFORKEYŠBEQ.S‚GTFK55.>FK50„EQU„*’CURRENTFABENTRYPOINTER*ŠLEA„FABKEY(A3),A0†ISKEYINTHISSEGMENT?9ŠMOVE.LA3,FATCFP(A4)†.SAVEENTRYADRINCASETHISISIT ŠBSR„CHKKEY."ŠBHI.S‚GTFK45NO,TRYNEXTSEGMENT#ŠBRA.S‚GTFK60GOREADDATABLOCKIN/GTFK55„M  OVE.LFCBDIR+DIRFE(A2),D0LASTSEGMENT?ŠCMP.L‚FATFAB(A4),D0†.ŠBEQ.S‚GTFBIE.5‹BRANCHIFERRORŠBSR„ISTAIERR‹NO,ERROR ŠBRA„GTFBEX.8CGTFBIE.5‚SUB.L‚D5,A3ŠYES,INSERTTOENDOFFILE,GETLASTFABENTRY#ŠSUB.L‚#FABSSL,A3‰.POINTERINTOA38ŠMOVE.BFABSGS(A3),D5†RESETLRNANDLSNFORLASTSEGMENTŠSUB.L‚D5,FATSLS(A4)ŠMOVE.WFABREC(A3),D5ŠSUB.L‚D5,FATSLR(A4) ŠCLR.W‚D5GTFK60„MOVE.LA3,A0#ŠBRA„GTFBR0GOREADINLASTSEGMENT*3*ˆKEYISINAPREVIOUSFABORINAFABTHATFOLLOWS*"GTFK70„TST.L‚FATFLS(A4)‰FIRSTFAB?0ŠBEQ„GTFK40YES,KEYBELONGSTOFIRSTDATABLOCK ŠBSR„GTFPSRNO,GETPREVIOUSFAB ŠBRA.S‚GTFK80GTFK75„TST.L‚(A3)LASTFAB?#ŠBEQ„GTFK40YES,KEYATENDOFFILEŠBSR„GTFNSRNO,GETNEXTFAB)GTFK80„BEQ„GTFK30GOCHECKNEWFAB'SKEYS0ŠBRA„GTFBRTNOFABORERROR,KEYCANNOTBEFOUND GTGT00„EQU„* GTGE00„EQU„* GTLT00„EQU„*(ŠMOVE.L#NL+ISTAIF,D0†NOACTIONHEREYET ŠBRA„GTFBRTŠPAGEŠENDC**‚GETFDBSUBROUTINES**'* FABINP GETS SPECIFIED FAB INTO MEMORY&*ˆCHANGEDFABBLOCKISUPDATEDIFNEC.** ENT: D1 PSN OF FAB TO GET*…A4=FATADDR.*†A3=FABBUFFERFWA*†A5=FABBUFFERLWA*…A6=VDTADDRESS*/* RET: D0 = 0 IF NO ERROR, ELSE IO ERROR STATUS*†A0->1STSDOFFAB*†D1-UNKNOWN*†Z-1IFNOERROR&*†Z-0IFERRORANDD0=ERRORSTATUS***INDENTED LIST$* FABINP GETS SPECIFIC FAB IN MEMORY*FABINP* UPDATE CURREN FAB $PUTFAB* FAB-IN OTHER USER'S BUFFER?*‚YES,MOVEFAB-INMEMORY *‚NO,READFAB-FROMDISK$IOSREAD* MARK FAB-IN MEMORYY* ERROR-IF EMPTY FAB*INDENTED LIST END* FABINP„EQU„**ŠMOVE.LA1,-(A7)+ŠBSR„PUTFABUPDATECURRENTFABIFNECESSARYŠBNE.S‚FABIRTI/OERRORCŠSETSBAD1,A3,A5,VDTIOS(A6)SETPSN,BUFFERSTARTANDENDADDRESSES-ŠCLR.L‚FATFAB(A4)‰CLEARFABPSNINCASEERROR0*SEE IF FAB CAN BE TRANSFERRED FROM ANOTHER USER ŠBSR„CHKMAŠBEQ.S‚FABI50NOOTHERASSIGN.*GO THROUGH OTHER FATSŠMOVE.LFATSTR,A1FABI10„CMP.L‚A1,A4#ŠBEQ.S‚FABI15SKIPOVERCURRENTFAT*FAT'S MUST HAVE SAME FCBŠMOVE.LFATFCB(A1),D0ŠCMP.L‚FATFCB(A4),D0 ŠBNE.S‚FABI15ŠCMP.L‚FATFAB(A1),D1 ŠBEQ.S‚FABI20FABI15„LEA„FATLEN(A1),A1ŠCMP.L‚FATEND,A1ŠBLS.S‚FABI10CHECKNEXTFATŠBRA.S‚FABI50NOTINMEMORY'*FAB IS IN MEMORY-TRANSFER TO THIS USER*FABI20„BSR„GETOSGATTACHTOOTHERESEGMENT3*MOVE DATA FROM OTHER FAB TO THIS USER'S FAB BUFFER"ŠMOVE.LA3,A0ŽSTARTOFCURRENTFAB(ŠMOVE.LFATFAA(A1),A1†STARTOFOTHERFABFABI30„MOVE.L(A1)+,(A0)+ŠCMP.L‚A5,A0ŽATEND?ŠBLS.S‚FABI30NO#*DATA HAS BEEN MOVED FROM OTHER FAB1*…TOTHISUSER'SFAB-DE-ATTACHFROMOTHERSEGMENT!*…ANDRE-ATTACHTOSHAREDSEGMENT$ŠBSR„GETCSGATTACHTOCOMMONSEGMENT ŠBRA.S‚FABI55!FABI50„BSR„IOSREADŒREADWITHWAITŠBNE.S‚FABIRTYES/FABI55„MOVE.LD1,FATFAB(A4)†SETCURRENTFABPSN#ŠCLR.L‚D0‘GET1STFABENTRYPOINTERŠMOVE.BFABPKY(A3),D0†.+ŠLEA„FABSEG(A3,D0),A0ƒA0->FIRSTSDOFFAB'ŠCMP.L‚FATFAE(A4),A0†BEYONDENDOFFAB?!ŠBLO.S‚FABI55.1‹BRANCHIFNO-OK&ŠBSR„ISTAUFRR‹UNRECOVERABLEFILEERROR ŠBRA.S‚FABIRT)FABI55.1‚MOVE.L#NL+ISTAFAB,D0…EMPTYFAB? ŠTST.L‚(A0).ŠBEQ.S‚FABIRTYESFŠBSETW#FAFLIB,FATFLG(A4)SETFABINPUTFLAG(=>TRYTOCOMBINEWITHN2ŠBCLRW‚#FAFLMB,FATFLG(A4)FLAGOFFFORMERGEFAB'SŠCLR.L‚D0‘SETGOODRETURNFLAGS FABIRT„EQU„*ŠMOVE.L(A7)+,A1ŠRTSŠPAGE*?*ˆGETNEXT,PRIOR,LAST,ANDFIRSTFABROUTINESUSESAMERETURN%*ˆINSTRUCTIONSASGETFDBTOSAVECODE**ˆGETNEXTFAB*2GTFNSR„MOVEM.LD1-D7/A3/A1/A5,-(A7)SAVEREGISTERS* ŠCLR.L‚D0'ŠMOVE.LFATFAB(A4),D1†NOFABINMEMORY?)ŠBEQ.S‚GTFIERNO-FABNOTFOUND-RETURN,ŠMOVE.L(A3),D1ŒFORWARDLINK(FABFLK)EXISTS?"ŠBEQ.S‚GTFIERNO-ERROR-NOFABS*#*ˆGETNEXTFABINCHAININTOMEMORY*-GTFN05„BSR„FABINPREADINFABWITHPSN=D1.LŠBNE.S‚GTFIRTERROR***ˆSETUPFIRSTSDASCURRENTSEGMENTINFAB*9ŠMOVE.LFATLLS(A4),D0†GETNEWFAB'S1STLSNFROMLASTFABŠADD.L‚#1,D0Ž.ŠMOVE.LD0,FATFLS(A4)†.5ŠMOVE.LD0,FATSLS(A4)†ITISALSOSEGMENTSTARTING  LSNBŠMOVE.LFATLLR(A4),D1„GETNEWFAB'S1STLRNFROMPREVIOUSFABINFOŠADD.L‚#1,D1Ž.$ŠMOVE.LD1,FATFLR(A4)†1STLRNOFFAB5ŠMOVE.LD1,FATSLR(A4)†STARTINGLRNOFCURRENTSEGMENT7ŠBSR„GLLSFBŒGETLASTLSNANDLRNFORFABINTOD0ANDD1ŠSUB.L‚#1,D0Ž.ŠSUB.L‚#1,D1Ž.4ŠSAVE2‚D0,D1,FATLLS(A4)ƒSAVELASTLSNANDLSROFFAB ŠBRA.S‚GTFIOKNOERRORS-‚RETURNGTFIER„BRA„GTFBERŠPAGE**ˆGETPREVIOUSFAB*2GTFPSR„MOVEM.LD1-D7/A3/A1/A5,-(A7)SAVEREGISTERS* ŠCLR.L‚D0'ŠMOVE.LFATFAB(A4),D1†NOFABINMEMORY?ŠBEQ.S‚GTFIERNO,FABNOTFOUND,ŠMOVE.LFABBLK(A3),D1†YES,GETBACKWARDLINK#ŠBEQ.S‚GTFIERERRORNOPREVIOUSFAB(ŠBSR„FABINPGETPREVIOUSFABINTOMEMORYGTFIRT„BNE„GTFBRTERROR*-*ˆSETUP1STSEGMENTOFFABASCURRENTSEGMENT*.ŠMOVE.LFATFLS(A4),D0†GETLASTLSNFORNEWFABŠMOVE.LD0,D3Ž.SAVE'ŠSUB.L‚#1,D0Ž.D0=LASTLSNOFNEWFAB.ŠMOVE.LFATFLR(A4),D1†GETLASTLRNFORNEWFABŠMOVE.LD1,D4Ž.SAVEŠSUB.L‚#1,D1Ž.9ŠSAVE2‚D0,D1,FATLLS(A4)ƒSAVELASTLSNANDLRNFORNEWFAB ŠCLR.L‚D0 ŠCLR.L‚D1/ŠBSR„GLLSFBGET#OFSECTORSANDRECORDSINFAB1ŠSUB.L‚D0,D3ŽD3=STARTINGLSNOFFABANDSEGMENT-ŠSUB.L‚D1,D4ŽGETSTARTINGLRNFORSEGMENT/FAB5ŠSAVE2‚D3,D4,FATFLS(A4)ƒSAVEFABSTARTINGLSNANDLRN9ŠSAVE2‚D3,D4,FATSLS(A4)ƒSAVESEGMENTSTARTINGLSNANDLRN9GTFIOK„BRA„GTFBOK1STSEGMENTISCURRENTSEGMENT-RETURNŠPAGE**ˆGETFIRSTFAB*2GTFFSR„MOVEM.LD1-D7/A3/A1/A5,-(A7)SAVEREGISTERS*-ŠMOVE.LFCBDIR+DIRFS(A2),D0GET1STFAB'SPSN"ŠBEQ.S‚GTFIERDOESFILEHAVEFABS?ŠMOVE.LFATFAB(A4),D10ŠCMP.L‚D0,D1ŽYES,FIRSTFABCURRENTLYINMEMORY?*ŠBEQ.S‚GTFF05YES,SETFIRSTSD=CURRENTSD)ŠMOVE.LD0,D1ŽNO,GET1STFABINTOMEMORYŠMOVE.L#-1,D0%ŠMOVE.LD0,FATLLS(A4)†SETNOLASTLSN%ŠMOVE.LD0,FATLLR(A4)†SETNOLASTLRN"ŠBRA„GTFN05CONTINUEASFORNXTFAB*GTFF05„CLR.W‚D0‘GETŠMOVE.BFABPKY(A3),D0†.-ŠLEA„FABSEG(A3,D0),A0ƒFIRSTFABENTRYPOINTER3ŠTST.L‚FATSLS(A4)‰ISCURRENTSEGMENTTHEFIRSTONE?ŠBEQ.S‚GTFIOKYES,JUSTRETURNŠCLR.L‚D0‘FLAGNOKEYUPDATE?ŠBSR„PUTDAT„NO,UPDATECURRENTDATABLOCKSINCESWITCHSEGMENTSŠBNE.S‚GTFLERERRORAŠBSR„SETFSL‚SETSEGMENTSTARTINGLSN/LRN=FAB'SSTARTINGLSN/LRNŠBRA.S‚GTFIOKRETURNŠPAGE**ˆGETLASTFAB*2GTFLSR„MOVEM.LD1-D7/A3/A1/A5,-(A7)SAVEREGISTERS* ŠCLR.L‚D0$ŠMOVE.LFATFAB(A4),D1†FABINMEMORY?ŠBEQ.S‚GTFL10NO.ŠMOVE.LFATFAA(A4),A1†YES,ISITTHELASTFAB?ŠTST.L‚(A1).FORWARDLINK=0ŠBEQ.S‚GTFL25YES2GTFL10„MOVE.LFCBDIR+DIRFE(A2),D1ANYFABSATALL? ŠBEQ„GTFIERŠBSR„FABINPYES,GETLASTFABGTFLER„BNE„GTFBRTERROR*7*ˆFOUNDLASTFAB‚-‚LASTSEGMENTWILLBETHECURRENTONE*'GTFL15„CLR.L‚D0‘FLAGNOKEYUPDATEFLAG2ŠBSR„PUTDATUPDATECURRENTDATABLOCKIFNECESSARYŠBNE„GTFLERERROR ŠCLR.L‚D1 ŠCLR.W‚D3‘GETŠMOVE.BFABPKY(A3),D3†.)ŠLEA„FABSEG(A3,D3),A0ƒA0->1STFABENTRY<ŠBSR„GLLSFB‡GETFAB'SSECTORANDRECORDCOUNTS(A5->LASTKEY):ŠGET2ƒFCBDIR+DIREOF(A2),D3,D4GETLASTLSNANDLRNOFFILE4ŠSAVE2‚D3,D4,FATLLS(A4)ƒSAVELASTLSNANDLRNOFFABŠADD.L‚#1,D3ŽGET1STLSNOFFABŠMOVE.LD3,D5Ž.ŠSUB.L‚D0,D3Ž.ŠADD.L‚#1,D4ŽGET1STLRNOFFABŠMOVE.LD4,D6Ž.ŠSUB.L‚D1,D4Ž. ŠCLR.L‚D09ŠMOVE.B-(A5),D0‹GETSTARTINGLSNOFSEGMENT(D0.B=FABSGS)ŠSUB.L‚D0,D5Ž.6ŠMOVE.W-(A5),D0‹GETSEGMENTSTARTINGLRN(D0.W=FABREC)ŠSUB.L‚D0,D6Ž.5ŠTST.L‚-(A5)ŽSETA5->INGTOFABPSNOFLASTFABENTRY'ŠMOVE.LA5,A0ŽCURRENTFABENTRYPOINTER@ŠSAVE4‚D3,D4,D5,D6,FATFLS(A4)FABSTARTINGLSN,LRN,FATSLS,FATSLRŠBRA„GTFBOKRETURN*-GTFL25„EQU„*’ISCURRENTSEGMENTTHELASTONE?*ŠMOVE.LFATCFP(A4),D1†ANYCURRENTSEGMENT?ŠBEQ.S‚GTFL15NOŠBSR„LASTSGYES,ISITLAST?ŠBEQ„GTFBGRYES,JUSTRETURN9ŠBRA.S‚GTFL15ŒNO,UPDATECURRENTSEGMENT,GETLASTONEINŠPAGE**!*ˆ*********************************ŒPUTFAB1.008/6/79HBN6*!*ˆ*********************************@*‚PUTFABUPDATESCURRENTFABONDISK,ERRORIFNOFABINMEMORY.7*ˆNEXTFAB'SFABPKYISUPDATEDIFLASTFABKEYCHANGED.+*ˆCALLISIGNORED  IFCHANGEFLAGISNOTSET* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR$*ˆD0.B=ISTAFABIFNOFABINMEMORY*ˆZ=1IFNOERROR *Œ0IFERROR*/*‚PUTFABREFERENCESFATANDVDT,CHANGESVDTIOS"*ˆUSESTEMPORARYVIB-SECTORBUFFER**INDENTED LIST$* PUTFAB UPDATES CURRENT FAB ON DISK*PUTFAB PASS CURRENT FAB* FAB CHANGED FLAG SET?*‚NO,SKIPCALL,RETURN!* YES,-GET FRACTION OF-FAB IN-USE* WRITE CURRENT FAB TO-DISK *‚$IOSWRITE* LAST FAB KEY CHANGED?#*‚YES,UPDATEKEY-INNEXT-FABHEADER*ƒCALL$NXTFHD* RETURN*INDENTED LIST END* PUTFAB„EQU„**,ŠMOVEM.LA0-A1/A3/D1-D3,-(A7)SAVEREGISTERS$ŠCLR.L‚D0‘CLEARINCASECALLSKIPPED&ŠBCLRW‚#FAFLFB,FATFLG(A4)FABCHANGED?ŠBEQ.S‚PTFBRTNO,IGNORECALL*?ŠGET3ƒFATFAA(A4),A0,A1,A3GETFABBUFFERSTART,ENDANDFABPSNŠMOVE.LA3,D0ŽFABINMEMORY?ŠBNE.S‚PTFB10YES ŠMOVE.L#NL+ISTAFAB,D0…NO,ERROR ŠBRA.S‚PTFBRT*0*ˆGETFAB'SSECTORS-IN-USECOUNTINTOFABHEADER* PTFB10„EQU„*FŠSETSBAD0,A0,A1,VDTIOS(A6)SETPSN,FABBUFFERSTARTANDENDFORWRITŠCLR.L‚D2‘INITFABUSAGECOUNTŠMOVE.LA0,A3ŽFATFAAŠCLR.L‚D1‘TESTFABEMPTYŠMOVE.BFABPKY(A3),D1†.ŠLEA„FABSEG(A3,D1),A1ƒ. ŠTST.L‚(A1)ŠBNE.S‚PTFB11EMPTYFAB?@ŠCLR.L‚FATFAB(A4)…YES,CLEARFABINMEMORYPOINTERFOREMPTYFAB#ŠCLR.L‚FATCFP(A4)‰NOSEGMENTEITHER ŠBRA.S‚PTFB155PTFB11„LEA„FABKEY(A1),A1†GETPOINTERTOLASTFABBYTEŠMOVE.B(A1)+,D1ŠLEA„2(A1,D1),A1ŠCMP.L‚FATFAE(A4),A1†FOUNDEND?$ŠSUB.L‚#2,A1ŽCONDCODENOTDESTROYEDŠBCC.S‚PTFB13YES ŠTST.L‚(A1)ŠBNE.S‚PTFB11NOPTFB13ŠSUB.L‚A3,A1ŽGETBCTINUSE1ŠMOVE.BFCBDIR+DIRFAB(A2),D2SECTORCOUNTFORFAB5ŠMULUƒ#SECSZE/16,D2†ONE16THOFBCTAVAILABLEFORFAB8ŠMOVE.LA1,D0ŽNOWCALCULATEHOWMANY1/16INUSEFORFAB ŠDIVUƒD2,D0Ž.ŠMOVE.BD0,D2Ž.ŠSWAPƒD0!ŠTST.W‚D0‘.USEDFRACTIONOFONE?ŠBEQ.S‚PTFB15NO&ŠADD.B‚#1,D2ŽYES,COUNTITASONEALSOGPTFB15„MOVE.BD2,FABUSE(A3)…SETCOUNTINFABHEADERFORCOMBINEFABSBR**ˆWRITEFABINTODISK@*ˆNOTE:CANNOTCLEARUNUSEDFABSPACEHERESINCECALLEDBYNEWFB*!ŠBSR„IOSWRITE‹WRITEFABWITHWAITŠIFEQƒFMSLEVEL-3 ŠBNE.S‚PTFBRT+ŠBCLRW‚#FAFLKB,FATFLG(A4)LASTKEYCHANGED?ŠBEQ.S‚PTFBRTNO,DONE*1*ˆUPDATEFAB'SLASTKEYINNEXTFABIFONEEXISTS*ŠTST.B‚D1‘ANYKEYSATALL?7ŠBEQ.S‚PTFBRTNOKEYS,IGNORETHATBITWASSET(D0=0)$ŠMOVE.L(A3),D3ŒGETNEXTFABPOINTER5ŠMOVE.L#-1,D0UPDATEKEY(ONLY)INNEXTFAB'SHEADER ŠBSR„NXTFHD.ŠENDC5PTFBRT„MOVEM.L(A7)+,D1-D3/A0-A1/A3RESTOREREGISTERSŠRTSŠPAGEŠENDCƒFMSLEVEL-1**%*ˆ*************************************ŒUPTDIR‚1.00‚8/3/79‚HBN6*%*ˆ************************************9*‚UPTDIRUPDATESCURRENTDIRECTORYENTRYINFCBINMEMORY* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA2=FCBADDRESS* *‚ONRETURN:%*ˆALLREGISTERSAREUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR0*ˆD0.B=ISTAIEIFDIRECTORYENTRYNOTINMEMORY*80+IFIOERROR*ˆZ=1IFNOERROR *Œ0IFERROR* UPTDIR„EQU„**1ŠMOVE.LFCBDBP(A2),D0†ANYDIRECTORYENTRYINFCB?ŠBNE.S‚UPDR00YESŠBSR„ISTAIERR‹NO,ERRORŠRTS)UPDR00„MOVEM.LA0-A1,-(A7)‡SAVEREGISTERS*4*ˆMOVEDIRENTRYINFCBTODIRECTORYBLOCKINMEMORY*2ŠMOVE.LD0,A1ŽGETDIRECTORYENTRY'SDBINTOMEMORY ŠBSR„GETDBŽ.ŠBNE.S‚UPDRRTERROR.ŠMOVE.WFCBDBO(A2),D0†GETENTRY'SOFFSETINDB'ŠMOVE.LVDTDMA(A6),A1†DBBUFFERADDRESS(ŠADD.L‚D0,A1ŽA1->DIRECTORYENTRYINDB/ŠLEA„FCBDIR(A2),A0†A0->DIRECTORYENTRYINFCB4ŠMOVE.L#DIRLEN/2,D0‡D0=DIRECTORYENTRYWORDCOUNT3UPDR10„MOVE.W(A0)+,(A1)+ˆMOVEENTRYFROMFCBTODBŠDCNTƒD0,UPDR104ŠBSETW‚#VDFLDB,VDTFLG(A6)SETPDBTOBEUPDATEDFLAGBŠBCLRW‚#FCFLDB,FCBFLG(A2)FCBDIRECTORYENTRYUPDATED-CLEARFLAGŠCLR.L‚D0‘SETGOODRETURNFLAGS,UPDRRT„MOVEM.L(A7)+,A0-A1‡RESTOREREGISTERSŠRTSŠPAGEŠIFGTƒFMSLEVEL-1**#*ˆ***********************************ŒPUTDAT1.0010/16/79HBN6*#*ˆ*********************************  *A*‚PUTDAT‚UPDATESORCKECKSCURRENTFABENTRYASSOCIATEDWITHDATA8*ˆBLOCK,THENITWRITESCURRENTDATABLOCKTODISK.‚CALL8*ˆISIGNOREDIFCURRENTDATABLOCKHASNOTBEENCHANGED.* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS!*ˆD0=0IFNOTTOUPDATEFABKEY*1IFUPDATEREQUESTED* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR!*ˆD0.B=ISTAIEIFINTERNALERROR8*ISTANZ,ISTARWB,ISTAFD,ORISTAROIFDATABLOCKERROR*ˆZ=1IFNOERROR *Œ0IFERROR**‚PUTDATCALLSUPCFAB,BLKWRT!*ˆREFERENCESANDUPDATESFAT,VDT* PUTDAT„EQU„**+*ˆIGNORECALLIFDATABLOCKHASNOTCHANGED*)ŠBCLRW‚#FAFLDB,FATFLG(A4)CHANGEFLAGSETŠBNE.S‚PTDT00YESŠCLR.L‚D0‘NO,IGNORECALLŠRTS*=*ˆUPDATEORCHANGEFABENTRYACCORDINGTODATABLOCKCONTENTS*8PTDT00„SUB.L‚#1,D0ŽINUPCFAB,FLAGREVERSED(0=>-1,1=>0)+ŠBSR„UPCFABERRORIFNOCURRENTFABSEGMENT%ŠBNE.S‚PTDTRTORDATABLOCKMESSEDUP**ˆWRITECURRENTBLOCKTODISK* ŠBSR.S‚BLKWRT PTDTRT„RTSŠPAGE*#*ˆ***********************************ŒBLKWRT1.0010/16/79HBN6*#*ˆ**********************************3*‚BLKWRTWRITESDATABLOCK'SSECTORSINUSETODISK?*ˆTHEDATABLOCK'SSEGMENTISEXPANDEDIFITISNOTDIRDATSIZE>*ˆ(THISISNOTDONENOWSINCEALLBLOCKSAMESIZE).IFINDEXED1*ˆFILEKEYSARECHECKEDTOBEINASCENDINGORDER.*ˆUNUSEDBUFFERSPACEISZEROED**…SHOULDN'TCALLBLKWRTIFCONTIGUOUSFILE* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS* *‚ONRETURN:*ˆD0.L=0IFNOERROR"*ˆD0.B=ISTAIEIFCONTIGUOUSFILE*80+IFIOERROR*ˆZ=1IFNOERROR *Œ0IFERROR* BLKWRT„EQU„**/ŠMOVEM.LA0-A1/A3/D1/D3/D4,-(A7)SAVEREGISTERS7ŠGET2ƒFATSBS(A4),A0,A1ƒGETBUFFERSTARTANDLOGICALENDŠMOVE.LA1,D0Ž.;ŠADD.L‚#1,D0ŠADJUSTENDOFBUFFERIFNOTATSECTORBOUNDARY!ŠSUB.L‚A0,D0Ž.D0=BCTOFBUFFER-ŠAND.W‚#$FF,D0Œ.LENGTHOFLASTSECTORBUFFER.ŠBEQ.S‚BWRT10.LOGICALENDATSECTORBOUNDARYŠMOVE.W#SECSZE,D1‰.9ŠSUB.W‚D0,D1Œ.D1=REMAININGUNUSEDBYTESINLASTSECTOR*>*ˆCLEARREMAINDEROFDATABUFFER(UNUSEDSPACEINLASTSECTOR)*)ŠADD.L‚#1,A1ŽA1->1STBYTETOBECLEARED*ŠLSR.W‚#1,D1ŽD1=WORDCOUNTTOBECLEAREDBWRT05„CLR.W‚(A1)+ŠDCNTƒD1,BWRT05'ŠSUB.L‚#1,A1ŽA1->ENDOFSECTORBUFFER>BWRT10„MOVE.LFATCFP(A4),A3†GETDATABLOCK'SFABENTRYPOINTER3ŠMOVE.L(A3),D0ŒGETSTARTINGSECTORNUMBER(FABPSN)CŠSETSBAD0,A0,A1,VDTIOS(A6)SETPSN,BUFFERSTARTANDENDFORWRITE*8*ˆCHECKTHATKEYSAREINASCENDINGORDERIFINDEXEDFILE**ŠMOVE.BFCBDIR+DIRATT(A2),D0INDEXEDFILE?ŠAND.B‚#DFTBIT,D0‰.ŠCMP.B‚#DATSEQ,D0‰.ŠBEQ.S‚BWRT40NO,SEQUENTIALŠIFEQƒFMSLEVEL-3ŠCLR.L‚D4‘YES,GETKEYSIZEŠMOVE.BFCBDIR+DIRKEY(A2),D4.,ŠMOVE.WFCBDIR+DIRLRL(A2),D1FRLORVRLFILE,BWRT15„MOVE.LD4,D0ŽKEYSIZEFORCHKKEYCALLŠCLR.L‚D3‘1/13/81‚D.VŠMOVE.WD1,D3ŽFRLFILE?ŠBNE.S‚BWRT20YES&ŠMOVE.W(A0)+,D3‹NO,GETRECORDLENGTHŠBNE.S‚BWRTIE.1‹BRANCHIFOKŠBSR„ISTAIERR‹ERRORIF0 ŠBRA.S‚BWRTRT BWRTIE.1‚BTSTW‚#0,D3ŽODDLENGTH?ŠBEQ.S‚BWRT20NO"ŠADD.W‚#1,D3ŽYES,SKIPFILLERBYTEŠBNE.S‚BWRT20BRANCHIFOKŠBSR„ISTAIERR‹ERROR ŠBRA.S‚BWRTRT0BWRT20„LEA„0(A0,D3.L),A3†GETNEXTRECORDPOINTERŠMOVE.LA3,D3Ž.ŠTST.W‚D1‘FRL?ŠBNE.S‚BWRT25YES.ŠADD.L‚#BCTFLD,D3‰NO,SKIPRECORDLENGTHFIELD BWRT25„CMP.L‚FATSBL(A4),D3†DONE?ŠBHI.S‚BWRT40YES,ŠBSR„CHKKEY1ŒNO,CHECKTHESETWOKEYSAREOKŠBHI.S‚BWRT35OKŠBNE.S‚BWRT30NOTOK4ŠBSR„DPLKEYEQUALKEYSOKONLYINDUPLICATEKEYFILEŠBEQ.S‚BWRT35OK%BWRT30„MOVE.B#NL+ISTAKY,D0†KEYERROR ŠBRA.S‚BWRTRT&BWRT35„MOVE.LA3,A0ŽGOCHECKNEXTPAIR ŠBRA.S‚BWRT15ŠENDCƒFMSLEVEL-38BWRTRT„MOVEM.L(A7)+,A0-A1/A3/D1/D3/D4RESTOREREGISTERSŠRTS**ˆWRITEBLOCKTODISK*1BWRT40„BSR„IOSWRITE‹UPDATEBLOCK:WRITEWITHWAITŠBNE„BWRTRTERROR7ŠBCLRW‚#FAFLDB,FATFLG(A4)CLEARDATABLOCKCHANGEDFLAG!ŠCLR.L‚D0‘RESETGOODRETURNFLAGSŠBRA„BWRTRTRETURNŠPAGE* *#*ˆ***********************************ŒUPCFAB1.0010/16/79HBN6*#*ˆ**********************************8*‚UPCFABUPDATESORCHECKSCURRENTFABENTRYINFORMATION.*ˆACCORDINGTODATABLOCKCONTENTSTOPRESERVE.*ˆDATABASEINTEGRITY.‚RECORDSMUSTBEALIGNED*ˆATWORDBOUNDARY.8*ˆUPDATEFABENTRY:#OFSECTORSINUSEAND#OFRECORDS<*ˆANDANYLASTKEYINDATABLOCKAREDERIVEDFROMDATABLOCK9*ˆCONTENTSANDFAT/FCBINFORMATION.‚THELASTKEYMUSTNOT**ˆCONFLICTWITHADJACENTFABENTRIES'KEYS=*ˆCKECKFABENTRY:CURRENTDATABLOCK'SCONTENTMUSTCOINCIDE7*ˆWITHINFORMATIONINCURRENTFABENTRYANDINFAT/FCB.* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS5*ˆD0.B=0IFREQUESTUPDATELASTKEYWHENFAFLUBSET*NONZEROIFTOLEAVEKEYALONE4*UNLESSDUPLICATEKEYFILEANDKEYINFABLESSTHAN*DATABLOCK'SLASTKEY* *‚ONRETURN:%*ˆALLREGISTERSAREUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR0*ˆD0.B=ISTAFDIFFABENTRY/DATABLOCKCONFLICT'*ISTAROIFRECORDOVERFLOWSDATABLOCK*ˆZ=1IFNOERROR *Œ0IFERROR**INDENTED LISTA* UPCFAB UPDATES FAB FROM DATA BLOCK OR CHECKS FOR DATA INTEGRITY*UPCFAB PASS-FAB AND-DATA BLOCK* CHECK DATA-BLOCK SIZE*‚CALL$CALSEC"* CHECK FATSBL AT-END-OF LAST-REC.* UPDATE FAB-ENTRY KEY?*‚YES,CALL$PUTKEY* UPDATE REST-OF FAB-ENTRY?*‚YES,CALL$UPDEOF#*ƒSET-NUMBEROF-SECTORSANDRECORDS*„RETURN%*‚NO,CHECKFAB-ENTRY&-DATA-BLKMATCH*ƒCALL$CHKKEY,$DPLKEY*„RETURN*INDENTED LIST END* UPCFAB„EQU„**@*ˆCHECKLOGICALBUFFEREND->TOLASTRECORD,RECORDSALIGNEDAN*ˆFITINTOTHEBUFFEREXACTLY*/ŠMOVEM.LA0-A1/A3/A5/D1-D7,-(A7)SAVEREGISTERS"ŠMOVE.BD0,D2ŽSAVEKEYUPDATEFLAG7ŠGET2ƒFATSBS(A4),A0,A1ƒGETBUFFERSTARTANDLOGICALEND"ŠADD.L‚#1,A1Ž1STBYTEAFTERBUFFER2ŠMOVE.LFATCFP(A4),A3†A3->DATABLOCK'SFABENTRY#ŠMOVE.LA3,D0ŽNOCURRENTFABENTRY?ŠBNE.S‚UPCFIE.1‹BRANCHIFOKŠBSR„ISTAIERR‹YES,ERRORŠBRA.S‚UPCFER.12UPCFIE.1‚MOVE.BFCBDIR+DIRATT(A2),D7GETFILETYPEŠAND.B‚#DFTBIT,D7‰. ŠCLR.L‚D6 ŠCLR.L‚D5 ŠCLR.L‚D4ŠCLR.L‚D3‘FLAGBUFFEREND)ŠMOVE.BFCBDIR+DIRKEY(A2),D6GETKEYSIZE.ŠMOVE.WFCBDIR+DIRLRL(A2),D5GETRECORDLENGTHŠBNE.S‚UPCF15FRLFILE?NEXTRECORD#ŠADD.L‚#1,D4ŽINCREMENTRECORDCOUNT(ŠCMP.L‚A1,A0ŽPASTLOGICALENDOFBUFFER?ŠBHI.S‚UPCF25YES,ERRORRETURN;ŠBNE.S‚UPCF00ŠNO,GOSKIPRECORDSTILLGETTOENDOFBUFFER1ŠBRA.S‚UPCF20DONE,D4.W=#OFRECORDSINBUFFER$UPCF10„CMP.L‚A1,A0ŽATENDOFBUFFER?ŠBEQ.S‚UPCF20YES ŠTST.W‚(A0)+ŽRESTOFBUFFER=0?ŠBNE.S‚UPCF25NO,ERROR-ŠBRA.S‚UPCF10TESTTILLENDOFBUFFERREACHED*.*ˆGETRECORDCOUNTFORDATABLOCKFORFRLFILE*4UPCF15„MOVE.LA1,D4ŽGETRECORDCOUNTFROMBUFFERBCTŠSUB.L‚A0,D4Ž. ŠDIVUƒD5,D4Ž.!ŠMOVE.L#1,D3ŽSETBUFFERENDFLAG-ŠMOVE.LA1,A5ŽGETLASTRECORDPOINTERINTOA5ŠSUB.L‚D5,A5Ž.5UPCF20„SWAPƒD4‘RECORDSDON'TFITORTOOMANYRECORDS? ŠTST.W‚D4‘.UPCF25„BNE„UPCFROYES,ERROR ŠSWAPƒD4‘NO5ŠBSR„CALSECGET#OFSECTORSNEEDEDFORBLOCKINTOD13ŠCLR.W‚D0‘SECTORCOUNTMUSTBELESSTHANBLOCKSIZEŠMOVE.BFCBDIR+DIRDAT(A2),D0.ŠCMP.W‚D0,D1Ž.ŠBLS.S‚UPCFIE.2‹BRANCHIFOKŠBSR„ISTAIERR‹ERRORUPCFER.1‚BRA.S‚UPCFER3UPCFIE.2‚BTSTW‚#FAFLUB,FATFLG(A4)UPDATEFABENTRY?ŠBEQ.S‚UPCF45NO*,*ˆUPDATEFABENTRYANDFAT&FCBINFORMATION*ŠIFEQƒFMSLEVEL-3ŠTST.B‚D6‘NULLKEYS?"ŠBEQ.S‚UPCF35YES,SKIPKEYUPDATE)ŠCMP.B‚#DATISD,D7‰NO,DUPLICATEKEYFILE?ŠBNE.S‚UPCF31NOFŠMOVEM.LD3-D4/A0/A5,-(A7)YES,CKECKTHATFABKEY.GE.LASTKEYINDB%ŠMOVE.LA5,A0Ž.SETUPFORCHKKEYCALL>ŠLEA„FABKEY(A3),A5….A0->LASTKEYINDATABLOCK,D3->FABKEY ŠCLR.L‚D4‘.#ŠMOVE.B(A5)+,D4‹.D4 =FABKEYBCTŠMOVE.LA5,D3Ž. ŠMOVE.LD6,D0ŠBSR„CHKKEY1Œ.COMPARE.ŠMOVEM.L(A7)+,D3-D4/A0/A5.RESTOREREGISTERS5ŠBCS.S‚UPCF32.FABKEY.LT.LASTDBKEY=>UPDATEKEY)ŠBEQ.S‚UPCF35..EQ.=>NONEEDTOUPDATE0UPCF31„TST.B‚D2‘KEYUPDATETOBESKIPPEDANYWAY?"ŠBNE.S‚UPCF35YES,LEAVEKEYALONECUPCF32„BSR„PUTKEY†NO,PUTKEYINTOFABENTRY(A5->LASTKEYINDB)ŠBNE.S‚UPCFERERRORŠENDC+UPCF35„CLR.L‚D0‘RESETFAB/FILELASTLSN/LRNŠMOVE.WFABREC(A3),D0†LRNŠSUB.L‚D0,FATLLR(A4)†.ŠSUB.L‚D0,FCBDIR+DIREOR(A2).0ŠMOVE.WD4,FABREC(A3)†SET#OFRECORDSINBUFFERCŠADD.L‚D4,FATLLR(A4)‚LASTLRNANDLSNOFFABANDFILETOBEUPDATEDŠADD.L‚D4,FCBDIR+DIREOR(A2).8ŠBSR„UPDEOF‹GETSECTORCOUNT,UPDATEEOFLSNINFOINFAT0ŠBEQ.S‚UPCF40BUFFERENDWASATSECTORBOUNDARY?ŠTST.W‚D3‘NO,SHOULDHAVEBEEN?ŠBEQ.S‚UPCFROYES,ERROR4UPCF40„BSETW‚#FCFLDB,FCBFLG(A2)SETFCBGHANGEDFLAG ŠBSR„FABCHGSETFABCHANGEDFLAGGUPCFRT„AND.W‚#$FFFF-(FAFLUBV+FAFLCBV),FATFLG(A4)CLEARFLAGBITSFORFAŠCLR.L‚D0‘SETGOODRETURNFLAGS8UPCFER„MOVEM.L(A7)+,A0-A1/A3/A5/D1-D7RESTOREREGISTERSŠRTSGUPCFRO„MOVE.L#NL+ISTARO,D0…RECORDSDON'TFITINTOBUFFERASTHEYSHOUL ŠBRA.S‚UPCFER*;*ˆCHECKTHATFABENTRYREFLECTSCURRENTDATABLOCKCONTENTS*2UPCF45„BTSTW‚#FAFLCB,FATFLG(A4)BITSETFORCHECK?ŠBEQ.S‚UPCFRTNO,RETURN1ŠCMP.B‚FABSGS(A3),D1†YES,CHECK#OFSECTORSSAMEŠBNE.S‚UPCFFDERROR,ŠCMP.W‚FABREC(A3),D4†CHECK#OFRECORDSSAMEŠIFEQƒFMSLEVEL-3ŠBNE.S‚UPCFFDERRORŠMOVE.LA5,D3ŽKEYSMATCH?ŠMOVE.WD6,D4Ž.'ŠBEQ.S‚UPCFRT.SKIPCHECKIFNULLKEYSŠLEA„FABKEY(A3),A0†. ŠBSR„CHKKEY.%ŠBEQ.S‚UPCFRTYESDATABLOCKLOOKSOKBŠBCC.S‚UPCFFDƒLASTKEYLESSTHANKEYINFABENTRY:CHECKPRIORKEY*>*ˆFINDPRIORFABENTRY'SKEYTOCHECKTHATKEYGREATERTHANIT*+ŠMOVE.LFATFAA(A4),A1†A1->FABBUFFERSTART$ŠCLR.L‚D0‘FIND1STFABENTRYPOINTERŠLEA„FABPKY(A1),A0†.ŠMOVE.B(A0),D0=ŠLEA„FABSEG(A1,D0),A1ƒA0->FABPKYFIELD,A1->1STFABENTRY2UPCF55„CMP.L‚A1,A3ŽA1=CURRENTFABSEGMENTENTRY?.ŠBEQ.S‚UPCF60YES,A0->PRIORFABENTRY'SKEY.ŠMOVE.BFABKEY(A1),D0†NO,CHECKNEXTFABENTRY*ŠMOVE.LA1,A0ŽSAVEFORPRIORENTRYPOINTER*ŠLEA„FABSSL(A1,D0),A1ƒA1->NEXTFABENTRY'ŠCMP.L‚FATFAE(A4),A1†BEYONDENDOFFAB?ŠBLO.S‚UPCF55BRANCHIFNO,ŠBSR„ISTAUFRR‹YES-UNRECOVERABLEFILEERROR ŠBRA.S‚UPCFER>UPCF60„BSR.S‚CHKKEYKEYMUSTBEGREATERTHANPRIORENTRY'SKEYŠBHI.S‚UPCFRTOK+ŠBSR„DPLKEYERRORUNLESSDUPLICATEKEYFILEŠBEQ.S‚UPCFRTOKŠBRA.S‚UPCFFDERRORŠNOPŠENDCŠIFEQƒFMSLEVEL-2 ŠBRA„UPCFRTŠENDCFUPCFFD„MOVE.L#NL+ISTAFD,D0†ERROR,CONFLICTBETWEENDATABLOCKANDFAB ŠBRA.S‚UPCFERŠENDCƒFMSLEVEL-1*"*PUTALL1.0010/22/79ƒL.STEINHOFF***PUTALL UPDATES ALL CHANGED TABLES ON DISK&*‡(INCLUDINGANYINFO.CHANGEDINFCB)*<*PUTALL2 DOES SAME AS PUTALL BUT NO FAB OR DATA BLOCK UPDATE*+*ALL TABLES UPDATED, EVEN IF ERROR DETECTED* *ON CALL:*…A2=FCBADDRESS*…A4=FATADDR.(PUTALLONLY)*…A6=VDTADDRESS *…BSRPUTALL* *ON RETURN:*…Z=1IFNOERROR *†=0IFERROR*…D0.L=0IFNOERROR*ˆD0.B=80+IFIOERROR*Š(LASTERRORENCOUNTERED)* PUTALL„EQU„*ŠMOVE.LD1,-(A7) ŠCLR.L‚D1/*MOVE FCB DIR. INFO. TO DIR. BLOCK IF NECESSARYŠBTSTW‚#FCFLDB,FCBFLG(A2)ŠBEQ.S‚PUTA10NOTCHANGED$ŠBSR„UPTDIRMOVEINFO.TODIR.BLOCKŠMOVE.LD0,D1ŽSAVEERRORSTATUS PUTA10„EQU„*ŠIFGTƒFMSLEVEL-1ŠCLR.L‚D0‘NOKEYUPDATEŠBSR„PUTDATUPDATEDATABLOCK ŠBEQ.S‚PUTA12 ŠMOVE.LD0,D1 PUTA12„EQU„*ŠBSR„PUTFABUPDATEFAB ŠBEQ.S‚PUTA15 ŠMOVE.LD0,D1ŠENDC PUTA15„EQU„*'ŠBSR„PUTSDBUPDATESECONDARYDIR.BLOCK ŠBEQ.S‚PUTA20 ŠMOVE.LD0,D1 PUTA20„EQU„*$ŠBSR„PUTDBŽUPDATEPRIMARYDIR.BLOCK ŠBEQ.S‚PUTA25 ŠMOVE.LD0,D1 PUTA25„EQU„*ŠBSR„PUTSATUPDATESAT ŠBNE.S‚PUTART ŠMOVE.LD1,D0'PUTART„MOVEM.L(A7)+,D1ŠDON'TCHANGECCŠRTS* PUTALL2ƒEQU„*ŠMOVE.LD1,-(A7) ŠCLR.L‚D1 ŠBRA.S‚PUTA15ŠPAGEŠIFEQƒFMSLEVEL-3*#*ˆ***********************************ŒCHKKEY 1.0010/25/79HBN6*#*ˆ**********************************'*‚CHKKEYCOMPARESTWOKEYSBYTEBYBYTE* *‚ONCALL:@*ˆA0->1STKEYBCT,KEYFOLLOWS(->KEYIFCHKKEY1&D0.W=KEYBCT*ˆD3->2NDKEY*ˆD4.B=2NDKEY'SLENGTH *‚ONRETURN: *ˆALLREGISTERSUNCHANGEDEXCEPT4*ˆCONDITIONCODESSETACCORDINGTOLASTBYTECOMPARE*ˆA0,D0-UNKNOWN* CHKKEY„EQU„**ŠCLR.W‚D0‘GET1STKEY'SLENGTHŠMOVE.B(A0)+,D0‹.&CHKKEY1ƒMOVE.LA5,-(A7)‹SAVEREGISTERSŠMOVE.LD3,A5ŽA5->2NDKEYŠTST.B‚D0‘ZEROLENGTHKEY?ŠBEQ.S‚CHKK15YES2ŠCMP.B‚D4,D0ŽGETMINIMUMKEYLENGTHFORCOMPARISONŠBCS.S‚CHKK00.ŠMOVE.BD4,D0Ž.&ŠBEQ.S‚CHKK10.IGNORECALLIFBCT=0KEYTOBEINSERTED(FULLKEY)* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR*ˆD0.B=ISTAKYIFKEYERROR*ISTAIEIFINTERNALERROR*ˆZ=1IFNOERROR *Œ0IFERROR**INDENTED LIST$* PUTKEY UPDATES FAB ENTRY KEY FIELD$*PUTKEY PASS-KEY &-CURRENT FAB-ENTRY!* CHECK PREVIOUS FAB-ENTRY KEY-OK*‚CALL$CHKKEY,$DPLKEY)*ƒKEY-.LT.(.LE.-IFDUPL.KEYS)PRIOR-KEY?*„NO,RETURNKEYERROR* CHECK NEXT FAB-ENTRY KEY-OK *‚CALL$CHKKEY,$DPLKEY,$GPTSEC(*ƒKEY-.GT.(.GE.-IFDUPL.KEYS)NEXT-KEY?*„NO,RETURNKEYERROR* KEY-IS OK,-SET-IN FAB-ENTRY*‚SAMEKEYASBEFORE?*ƒYES,LEAVEAS-ISRETURN* UPDATED LAST KEY OF-FAB?'*‚YES,FLAGTO-UPDATEIN-NEXTFAB-HEADER* RETURN AND-FLAG FAB CHANGED*INDENTED LIST END* PUTKEY„EQU„**7*ˆTESTPRIORFABENTRY'SKEYDOESNOTCONFLICTWITHKEY*/ŠMOVEM.LD1-D5/A0-A1/A3/A5,-(A7)SAVEREGISTERS/ŠMOVE.LFATCFP(A4),A1†CURRENTFABENTRYPOINTERŠMOVE.LA1,D0Ž.ERRORIFNONEŠBNE.S‚PUTK.1BRANCHIFOKŠBSR„ISTAIERR‹ERRORIFNONEŠBRA.S‚PUTKRT.1PUTK.1„CLR.L‚D5‘GETKEYSIZEŠMOVE.BFCBDIR+DIRKEY(A2),D5$ŠBEQ„PUTKGRIGNORECALLIFNULLKEYS;ŠLEA„FABKEY(A1),A3†A3->KEYFIELDBCTINCURRENTFABENTRYŠCLR.L‚D0‘GETFIELDBCT(ŠMOVE.B(A3)+,D0‹.(A3->FIELDFORKEY)"ŠBNE.S‚PUTK.2OKIFNOTNULLFIELD!ŠBSR„ISTAIERR‹ERRORIFNULLFIELDPUTKRT.1‚BRA.S‚PUTKRT.2)PUTK.2„CMP.B‚D0,D5ŽFULLKEYFIELDINFAB?ŠBEQ.S‚PUTK.3BRANCHIFOKBŠBSR„ISTAUFRR‚ERRORFORNOW,LATERALLOWPARTIALKEYS*************PUTKRT.2‚BRA.S‚PUTKRT.3/*ˆD5TOCONTAINCURRENTFABENTRY'SKEYFLDBCT.PUTK.3„MOVE.LFATFAA(A4),A0†FABMEMORYADDRESS%ŠCLR.L‚D2‘GETPRIORFABENTRYPOINTER1ŠMOVE.L#FABPKY,D3‰LASTKEYOFPREVIOUSFABFIELD4ŠADD.L‚A0,D3ŽD3POINTSTOLGHOFPREVFAB'SLASTKEYŠMOVE.BFABPKY(A0),D2†.+ŠLEA„FABSEG(A0,D2),A0ƒ.A0->1STFABENTRY-PUTK00„CMP.L‚FATFAE(A4),A0†BEYONDENDOFFAB?ŠBLO.S‚PUTK00.1‹NO-OK+ŠBSR„ISTAUFRR‹YES!UNRECOVERABLEFILEERRORŠBRA.S‚PUTKRT.32PUTK00.1‚CMP.L‚A0,A1Ž.FINDPREVIOUSENTRYPOINTERŠBEQ.S‚PUTK10.FOUNDITDŠMOVE.LA0,D3‚.SAVETHISINCASEITISTHEENTRYBEFORECURRENTONEŠADD.L‚#FABKEY,D3‰..ŠMOVE.BFABKEY(A0),D2†.GETNEXTENTRYPOINTERŠLEA„FABSSL(A0,D2),A0ƒ.ŠBNE.S‚PUTK00.2ŠBSR„ISTAUFRR‹INTERNALERRORIFFABKEYFIELDZEROPUTKRT.3‚BRA.S‚PUTKRT/PUTK10„MOVE.LD3,A0ŽA0=>PRIORFABENTRY'SKEY,ŠMOVE.LA5,D3ŽSETUPREGISTERSTOCALLCHKKEY8ŠMOVE.LD5,D4Ž.D5=PROPOSEDLENGTHOFKEYINFABENTRY;ŠBSR„CHKKEYˆCOMPAREPREVIOUSFABENTRY'SKEYTOCURRENTONEŠBHI.S‚PUTK20OK$ŠBCS.S‚PUTK45CONFLICTWITHFABKEYS@ŠBSR„DPLKEYƒEQUALKEYS,(F ULLKEYS),ERRORUNLESSDUPLICATEKEYSŠBEQ.S‚PUTK20OK#ŠTST.L‚FATSLS(A4)‰OKIF1STSEGMENTŠBNE.S‚PUTK45ERROR*5*ˆCKECKNEXTFABENTRY'SKEYGREATERTHANCURRENTONE*'PUTK20„EQU„*’GETNEXTFABENTRYPOINTER<ŠLEA„0(A3,D5),A0‡.D5=BCTOFCURRENTFABENTRY'SKEYFIELD5ŠMOVE.LFATFAE(A4),D2†ENDOFFABENTRIESINTHISFAB?ŠSUB.L‚#3,D2Ž.ŠCMP.L‚D2,A0Ž. ŠBCC.S‚PUTK55.PASTENDOFFAB?#ŠTST.L‚(A0).NO,MOREFABENTRIES?!ŠBEQ.S‚PUTK55.NO,NEEDNEXTFAB2ŠADD.L‚#FABKEY,A0‰A0->NEXTFABENTRY'SKEYFIELD*ŠCLR.L‚D2‘FLAGFORNOTLASTFABKEYCHANGEPUTK25„BSR„CHKKEYCOMPAREKEYSŠBCS.S‚PUTK30.LT.ISOK!ŠBHI.S‚PUTK45ERROR,KEYCONFLICT#ŠBSR.S‚DPLKEYUNLESSDUPLICATEKEYS-ŠBEQ.S‚PUTK30ORCHECKING1STKEYOFNEXTFAB ŠTST.B‚D2‘PUTLASTKEYINTOFAB?ŠBEQ.S‚PUTK45NO,ERROR6ŠCLR.B‚D2RESETFLAGSODON'TSETFAFLKBUNNECESSARILY*;*ˆLEAVEKEYALONEIFNEWKEY=OLDONE(DUPLICATEKEYFILE)*'PUTK30„BSR.S‚DPLKEYDUPLICATEKEYFILE?ŠBNE.S‚PUTK35NO&ŠMOVEM.LD5/A3/A5,-(A7)„SAVEREGISTERS*PUTK31„MOVE.B(A5)+,D0‹SAMEKEYASBEFORE?ŠCMP.B‚(A3)+,D0‹.ŠBNE.S‚PUTK32NOŠDCNTƒD5,PUTK31/PUTK32„MOVEM.L(A7)+,D5/A3/A5„RESTOREREGISTERS/ŠBEQ.S‚PUTKGRYES,SAMEKEYS,LEAVEFIELDALONE*!*ˆKEYISOK,MOVEITTOFABENTRY*PUTK35„MOVE.B(A5)+,(A3)+-ŠDCNTƒD5,PUTK35ŠD5=ENTRY'SKEYFIELDLENGTH ŠBSR„FABCHGSETFABCHAGNEDFLAG"ŠTST.L‚D2‘LASTKEYINFABCHANGED?ŠBEQ.S‚PUTKGRNOFŠBSETW#FAFLKB,FATFLG(A4)YES,SETFLAGTOUPDATEITINNEXTFABHEADEPUTKGR„CLR.L‚D0‘GOODRETURN8PUTKRT„MOVEM.L(A7)+,A0-A1/A3/A5/D1-D5RESTOREREGISTERSŠRTS*%PUTK45„MOVE.L#NL+ISTAKY,D0†KEYERROR ŠBRA.S‚PUTKRT*2*ˆREADIN1STSECTOROFNEXTFABTOCHECKNEXTKEY*5PUTK55„MOVE.LFATFAA(A4),A0†GETNEXTFABSTARTINGPSN4ŠMOVE.L#1,D2ŽFLAGFORLASTKEYFIELDINFABCHANGEDŠMOVE.L(A0),D0Œ.FABFLKŠBEQ.S‚PUTK30NONEXTFAB?ŠMOVE.L#IOREAD,D1‰READ3ŠBSR„GPTSECA1RETURNSPOINTINGTOSECTORJUSTREADŠBNE.S‚PUTKRTERROR?:ŠLEA„FABPKY(A1),A0†GETA0->INGTOFABPKYFIELDOFNEXTFABŠBRA.S‚PUTK25GOCHECKKEYŠPAGE*6*‚DPLKEYCHECKSIFFILECONTAINSDUPLICATEKEYSORNOT *‚ONRETURN:'*ˆZ=1IFFILEMAYHAVEDUPLICATEKEYS*"DPLKEY„MOVE.BFCBDIR+DIRATT(A2),D0ŠAND.B‚#DFTBIT,D0‰GETFILETYPEŠCMP.B‚#DATISD,D0ŠRTSŠPAGE**#*ˆ***********************************ŒFNDKEY1.0011/6/79HBN6*#*ˆ**********************************<*‚FNDKEYFINDSTHERECORDWITHTHEGIVENKEYIFITEXISTSIN;*ˆTHEFILE,OTHERWISETHEINSERTPOSITIONFORTHEGIVENKEY*ˆISRETURNED.* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS$*ˆA3=KEYPOINTER(KEYTOBEFOUND)*ˆD2=LENGTHOFKEY* *‚ONRETURN:%*ˆALLREGISTERSAREUNCHANGEDEXCEPT:#*ˆD0.B=ISTARNIFNORECORDEXISTS*ISTAREIFRECORDEXISTS*ISTAIEIFINTERNALERROR*80+IFIOERROR*ˆZ-FLAG-UNKNOWN0*ˆA1=POINTERTORECORDINDATABLOCKIFISTARE)*ORPOINTERTOINSERTPOSITIONIFISTARN<*ˆD1.L=LRNOFRECORDFOUNDORINSERTPOSITION(NEXTRECORD)**INDENTED LIST-* FNDKEY FINDS FILE POSITION ACCORDING TO KEY*FNDKEY PASS KEY* GET-DATA BLOCK-FOR KEY*‚CALL$GETFDB* FIND KEY-OR INSERT POSITION*‚CALL$CHKKEY* RECORD FOUND?*‚NO,RETURNRECORDNOT-FOUND*‚YES,RETURNRECORDFOUND*INDENTED LIST END* FNDKEY„EQU„**:*ˆGETDATABLOCKWHEREKEYSHOULDBEORSHOULDBEINSERTED*&ŠMOVEM.LA0/D2-D6,-(A7)„SAVEREGISTERS;ŠTST.B‚FCBDIR+DIRKEY(A2)‚MAKESURENOTCALLEDFORNULLKEYSŠBNE.S‚FNDKIE.1‹BRANCHIFOKŠBSR„ISTAIERR‹ERROR ŠBRA.S‚FNDKRT*FNDKIE.1‚MOVE.LA3,D0ŽSETUPTOCALLGETFDB=ŠMOVE.L#KEYFDB+RDBFLG+NL,D1.READBLOCKIFFINDONEFORKEYŠBSR„GETFDBFOUNDDATABLOCK?ŠBNE.S‚FNDKRTNO,ERROR**ˆSEARCHFORKEYINDATABLOCK*<ŠMOVE.LFATSLR(A4),D6†KEEPTRACKOFCURRENTLOGICALRECORD#2ŠCLR.L‚D4‘GETKEYLENGTHINDATABLOCK(FULLKEYS)ŠMOVE.BFCBDIR+DIRKEY(A2),D4.-ŠMOVE.LFATSBS(A4),A1†STARTINGSEARCHADDRESS"ŠCLR.L‚D5‘COMPARERECORDBYRECORD,ŠMOVE.W FCBDIR+DIRLRL(A2),D5VRLORFRLFILEŠMOVE.LD5,D1Ž.ŠTST.L‚D2‘.CAN'THAVENULLKEYŠBNE.S‚FNDK00BRANCHIFOKŠBSR„ISTAIERR‹ERROR ŠBRA.S‚FNDKRT+FNDK00„CMP.L‚FATSBL(A4),A1†EMPTYDATABLOCK"ŠBCC.S‚FNDK25ORATENDOFBUFFER?ŠTST.W‚D5‘NO,VRLFILE?ŠBNE.S‚FNDK05NO,FRL'ŠMOVE.W(A1)+,D1‹YES,GETRECORDLENGTHŠBNE.S‚FNDKIE.2‹BRANCHIFOKŠBSR„ISTAIERR‹ERROR ŠBRA.S‚FNDKRT$FNDKIE.2‚BTSTW‚#0,D1ŽODDBYTECOUNT?ŠBEQ.S‚FNDK05NO'ŠADD.L‚#1,D1ŽYES,SKIPFILLERBYTEALSOFNDK05„MOVE.LA3,A0ŽKEYTOFINDŠMOVE.WD2,D0ŽANDITSBCT1ŠMOVE.LA1,D3ŽCURRENTRECORD'SKEY(D4=ITSBCT)ŠBSR„CHKKEY1ŒCOMPAREORMATCHŠBEQ.S‚FNDK20FOUNDKEY?"ŠBCS.S‚FNDK15NO,CONTINUESEARCH?FFNDK10„MOVE.L#NL+ISTARN,D0†NO,KEYNOTFOUND,BUTCANINSERTINFRONT?FNDKOK„MOVE.LD6,D1OFCURRENTKEY-RETURNLRNOFRECORDIND11ŠTST.W‚D5‘GETA1POINTINGTOCURRENTRECORDSTARTŠBNE.S‚FNDKRT.ITALREADYISFŠTST.W-(A1).FORVRLFILESSKIPPEDRECORDBYTECOUNTFIELD,RESTORE/FNDKRT„MOVEM.L(A7)+,A0/D2-D6„RESTOREREGISTERSŠRTS*)*ˆCONTINUESEARCH-CURRENTKEYTOO‚SMALL*;FNDK15„ADD.L‚D1,A1ŽNEXTRECORDPOINTER(D1=RECORDLENGTH)ŠADD.L‚#1,D6ŽINCREMENTCLR%ŠBRA.S‚FNDK00CHECKNECTRECORD'SKEY**ˆFOUNDRECORDWITHGIVENKEY*-FNDK20„MOVE.L#NL+ISTARE,D0†FLAGRECORDFOUND1ŠBRA.S‚FNDKOKRETURNWITHA1->INGTORECORDFOUND*4FNDK25„MOVE.L#1,D5ŽATENDOFBUFFER:LEAVEA1THERE9ŠBRA.S‚FNDK10Œ(WILLNOTSUBTRACT2FROMITBEFORERETURN)ŠPAGE**"*ˆ**********************************ŒEXPNDB1.0011/7/79HBN6*"*ˆ*********************************D*‚EXPNDBEXPANDSTHECURRENTDATABLOCKBYGIVENNUMBEROFBYTESFOR6*ˆRECORDINSERTIONORUPDATING(NEWRECORDLONGERTHAN9*ˆTHEEXISTINGONE).‚IFTHEREISNOTSUFFICIENTROOMLEFT>*ˆINTHEBLOCKTHEBLOCKMUSTBESPLITASFOLLOWS:‚THESMALLER=*ˆHALFISUSEDIFITCANACCOMODATETHEEXPANSION.‚THELARGER;*ˆHALFISWRITTENTODISKASTHECURRENTSEGMENT.‚ANEWFAB>*ˆENTRYISCREATEDFORTHESMALLERHALFWHICHWILLCONTAINTHE<*ˆEXPANSION(ATTHEBEGINNINGORENDDEPENDINGONWHICHPART:*ˆOFTHEOLDBLOCKITWAS).‚IFNEITHERHALFHASSUFFICIENT?*ˆROOMBOTHPARTSAREWRITTENTODISK(ANEWFABENTRYANDDATA?*ˆBLOCKISALLOCATEDFORONEHALF)AND‚ANEWFABENTRYANDDATA=*ˆBLOCKISCREATEDFORTHEEXPANSION(BETWEENTHEBLOCKSJUST *ˆWRITTEN).=*…EXPNDBALLOCATESMAXIMUMNO.OFDATABLOCKSANDFABSBEFORE>*…STARTINGSPLIT.‚THISISDOWNTOINSURESUFFICIENTDISKSPACE* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS=*ˆA0=STARTOFNEXTRECORDIFUPDATE(1STBYTETOMOVEDOWN)*‹A0=A1IFINSERT *ˆA1=STARTOFRECORDIFUPDATE9*‹INSERTPOSITIONIFINSERT(->NEXTRECORDTOMOVEDOWN)3*‹INEITHERCASEA1->1STBYTEMOVEDFOREXPANSION&*ˆ(NOTE:A1&A0MUSTBEEVENADDRESSES)*ˆD0=BYTECOUNTTOEXPAND**‹IFODDBYTECOUNTWILLEXPANDD0+1BYTES* *‚ONRETURN:%*ˆALLREGISTERSAREUNCHANGEDEXCEPT:*ˆD0.L=0IFNOERROR*ELSEERRORCODEIND0.B*ˆZ=1IFNOERROR *Œ0IFERROR:*ˆA1=STARTOFRECORDOR1STAVAILABLEBYTEFORINSERTION0*ˆD1=0IFFAB/FAT/FCBCORRESPONDTODATABLOCK3*1IFLASTKEYOFDATABLOCKCHANGED(CALLPUTKEY)7*2IFDATABLOCKCONTENTSTOBEUPDATEDINFAB/FAT/FCB#*BYCALLINGUPCFABWITHKEYUPDATE7*3IFDATABLOCKCONTENTSTOBEUPDATEDINFAB/FAT/FCB&*BYCALLINGUPCFABWITHNOKEYUPDATE*ˆA0-UNKNOWN**INDENTED LISTG* EXPNDB CREATES SPACE IN FILE FOR INSERTED RECORD OR EXPANSION(UPDATE)$*EXPNDB PASS-BCT &-POSITION IN-BLOCK!* RECORD FITS-INTO CURRENT BLOCK?*‚YES,EXPANDDATABLOCK*ƒCALL$MOVEBD,$UPDEOF*„RETURNNEWFATSBL* NO, SPLIT DATA-BLOCK!*‚TOP-HALFOF-DATABLOCKSMALLER?#*ƒNO,MOVE-LOWERHALF-DOWN:$MOVEBD!*„WRITETOP-HALFTO-DISK:$WRTUHF'*ƒYES,WRITELOWER-HALFTO-DISK:$WRTLHF+*„MOVE-LOWERHALF-UP,LEAVE-ROOMFOR-RECORD* GET-NEW FAB-ENTRY FOR-NEW-DB*‚CALL$NEWFBD* RETURN NEW-DATA BLOCK, FATSBL*INDENTED LIST END* EXPNDB „EQU„**:*ˆEXPANDCURRENTBUFFERIFPOSSIBLE(MOVELOGICALENDDOWN)*)ŠMOVEM.LA3/A5/D2-D7,-(A7)SAVEREGISTERS5*USE STACK FOR SAVING PSN'S OF ALLOCATED DB'S AND FAB*…(A7)=PSNOFFAB*…4(A7)=PSNOF1STDB#*…8(A7)=PSNOF2NDDB(IFREQUIRED)= DE:";*D24::B;JAR:Z9bBj6rDzL‚@Š>’JšJ¢2ªN²hºIÂ@ ŠCLR.L‚-(A7)Ž0PSNINFOONSTACK ŠCLR.L‚-(A7) ŠCLR.L‚-(A7)&ŠMOVE.LA0,D6ŽSAVENEXTRECORDPOINTER1ŠBTSTW‚#0,D0ŽODDBCT=>ROUNDUPTONEXTEVENBCT ŠBEQ.S‚EXPN00 ŠADD.L‚#1,D0'EXPN00„MOVE.LD0,D4ŽSAVEEXPANSIONSIZEŠBNE.S‚EXPNIE.1‹BRANCHIFOKŠBSR„ISTAIERR‹ERRORIFZERO ŠBRA.S‚EXPNRT5EXPNIE.1‚MOVE.LA1,D1ŽTESTEVENADRPARAMETERSPASSED ŠOR.BƒD6,D1Ž.ŠBTSTW‚#0,D1Ž.ŠBEQ.S‚EXPNIE.2‹BRANCHIFOKŠBSR„ISTAIERR‹INTERNALERROR ŠBRA.S‚EXPNRT4EXPNIE.2‚MOVE.LFATSBL(A4),A3†GETBUFFERLOGICALEND&ŠMOVE.LFATSBE(A4),D7†ANDPHYSICALENDŠCLR.L‚D1‘INSERTINTHEMIDDLE?ŠCMP.L‚A3,A1Ž./ŠBLS.S‚EXPN05YES(ORATTOPORTHISISUPDATE)BŠMOVE.L#1,D1„NO,INSERTATENDOFDATABLOCK,SETKEYUPDATEFLAG2EXPN05„EQU„*’TRYTOMOVEBUFFERDOWNFOREXPANSION)ŠMOVE.LD7,D3ŽSAVEPHYSICALENDOFBUFFERŠBSR.S‚MOVEBDEXPAND0ŠBNE.S‚EXPN10NOTENOUGHROOM-MUSTSPLITBLOCK*;*ˆSETNEWLOGICALENDPOINTER,CLEARWORDAFTERLOGICALEND *ˆTOSUPPORTSHAREDBUFFERUSAGE*7EXPNOK„MOVE.LA5,FATSBL(A4)†SETENDOFBUFFERINDICATOR?ŠBSR„UPDEOF„UPDATELOGICALSECTORINFO.INFAT,FCB-DIRANDFABŠCMP.L‚FATSBE(A4),A5†ATEND?ŠBEQ.S‚EXPN07YES3ŠBSR„FTL.HI.MUSTNOTGETPASTPHYSICALBUFFEREND,ŠCLR.L‚1(A5)ŽNO,SETENDOFBUFFERINDICATOR,EXPN07„BSR„DBCHGŽSETDATABLOCKCHANGEDFLAGŠCLR.L‚D0‘EXPANDEDOK EXPNRT„EQU„*"*DEALLOCATE ANY UNUSED FAB OR DB'S4ŠMOVE.LD0,D2ŽSAVEREGISTERSTHATARETOBERETURNED ŠMOVE.LD1,D3 ŠMOVE.LA1,A0 ŠCLR.L‚D4ŠMOVE.L(A7)+,A1ŠMOVE.LA1,D5ŽSKIPIFPCN=0ŠBEQ.S‚EXPNRTAŠBSR„DEALFBDEALLOCATEFABŠMOVE.LD0,D4ŽSAVEERRORSTATUSEXPNRTAƒMOVE.L(A7)+,A1 ŠMOVE.LA1,D5ŠBEQ.S‚EXPNRTBŠBSR„DEALDBDEALLOCATEDBŠBEQ.S‚EXPNRTB"ŠMOVE.LD0,D4ŽNO-SAVEERRORSTATUSEXPNRTBƒMOVE.L(A7)+,A1 ŠMOVE.LA1,D5ŠBEQ.S‚EXPNRTCŠBSR„DEALDBDEALLOCATEDBŠBEQ.S‚EXPNRTC ŠMOVE.LD0,D4"EXPNRTCƒMOVE.LD3,D1ŽRESTOREREGS. ŠMOVE.LA0,A1 ŠMOVE.LD2,D0(ŠBNE.S‚EXPNRTDŒERRORBEFOREDEALLOCATION#ŠMOVE.LD4,D0ŽSAVENEWERRORSTATUS EXPNRTDƒEQU„*,ŠMOVEM.L(A7)+,A3/A5/D2-D7RESTOREREGISTERSŠRTS*%*‚MOVEBDSUBROUTINEMOVESBUFFERDOWN*ˆENT:D0=BCTTOMOVE*A3=CURRENTENDOFBUFFER*A1=MOVEFROMADR*ˆRET:A5=NEWEND*D0,A0,A3CHANGED*Z=1IFMOVEDOK4*‘0IFNOTMOVEDBECAUSE‚WOULDENDPASTPHYSICALEND*‘OFDATABUFFER*‘(ANDA3NOTCHANGED)* MOVEBD„EQU„**!ŠMOVE.LD0,A0ŽGETNEWENDPOINTERŠADD.L‚A3,A0Ž.ŠMOVE.LA0,A5Ž.RETURNITINA5>ŠCMP.L‚D7,A0‡ERRORIFWOULDENDUPPASTPHYSICALENDOFBUFFER"ŠBHI.S‚MOVEB9ERROR-MOVENOTHING%ŠADD.L‚#1,A3ŽADJUSTPOINTERSFORMOVE ŠADD.L‚#1,A06MOVEB1„CMP.L‚A3,A1ŽNOTHINGTOMOVEIFATENDOFBUFFERŠBEQ.S‚MOVEB8.ŠMOVE.W-(A3),-(A0)ˆMOVEŠBRA.S‚MOVEB1.MOVEB8„CLR.L‚D0‘FLAGOKMOVE MOVEB9„RTS*2*ˆENOUGHROOMINEITHERPARTTOUSEFOREXPANSION?8*ˆD6->NEXTRECORD,D4=BCTTOEXPAND,D1=KEY/FABFLAG*ˆA3=FATSBL,D7=D3=FATSBE*+EXPN10„MOVE.LFATSBS(A4),A0†TOPOF1STHALFBŠMOVE.LD3,D0„CALCULATEMAXSIZEOFPARTIALBUFFERFORFIT(D3=SBE)ŠSUB.L‚A0,D0Ž. ŠADD.L‚#1,D0ŠSUB.L‚D4,D0Ž.FŠMOVE.LD6,D2GETBCTOFUPPERHALF(COUNTPARTIALREC.ASPARTOFBOTHŠSUB.L‚A0,D2Ž.HALVES)#ŠMOVE.LA3,D3ŽGETBCTOFLOWERHALFŠSUB.L‚A1,D3Ž.ŠADD.L‚#1,D3Ž./ŠMOVE.LFATCFP(A4),D5†GETCURRENTFABENTRYPTRŠBNE.S‚EXPNIE.3‹BRANCHIFOKŠBSR„ISTAIERR‹ERRORIFNONEEXPNRT.2‚BRA„EXPNRT7EXPNIE.3‚CMP.L‚D2,D0ŽEXPANSIONCOULDFITINUPPERHALF?ŠBCC.S‚EXPN15YES"ŠCMP.L‚D0,D3ŽNO,INTOSECONDHALF?,ŠBHI„EXPN65NO,CAN'TFITITINTOEITHERONE*3*ˆYES, USETHESMALLERPARTFORINSERTION/EXPANSION**ALLOCATE 1 FAB AND 1 DBEXPN15„MOVE.LA7,D0 ŠBSR„ALDBFŠBNE.S‚EXPNRT.2#ŠCMP.L‚D2,D3ŽWHICHPARTISSMALLER?ŠBCC.S‚EXPN60UPPERHALF?*@*ˆLOWERHALFISSMALLER,WRITEOUTTOPHALFASCURRENTDATABLOC?*ˆMOVELOWERHALFDOWNSOCANCLEARTOPHALFTOSECTORBOUNDARY*-ŠMOVE.LA1,D1ŽGETSTARTOFLOWERHALFINTOD1ŠTST.L‚D3‘NOLOWERHALF?ŠBEQ.S‚EXPN20NOAŠMOVE.LA3,A5…FINDENDOF2NDHALF(=FATSBLIFATSECTORBOUNDARY)6ŠTST.B‚D1.ISSECONDHALFALREADYATSECTORBOUNDARY?;ŠBEQ.S‚EXPN20Š.YES,SBL=ENDOF2NDHALFASLO(SECSZE=100):ŠCLR.L‚D0‹.NO,HAVETOMOVELOWERHALFTOSECTORBOUNDARY&ŠSUB.B‚D1,D0Ž.GETBCTTOMOVEDOWNBY5ŠADD.L‚D0,D1Ž.NOWD1=TOPOFSECONDHALFAFTERMOVEBŠADD.L‚#SECSZE,D7ƒ.NEWPHYSICALENDOFBUFFERUSINGOVERFLOWAREA8ŠBSR.S‚MOVEBDMOVEBUFFERDOWN,A5=NEWENDOF2NDHALFŠBEQ.S‚EXPN20BRANCHIFOK3ŠBSR„ISTAIERR‹THISSHOULDN'THAPPEN-WHAT'SWRONG?ŠBRA.S‚EXPNRT.20EXPN20„MOVE.LFATSBS(A4),A0†RESTOREBUFFERSTART2ŠBSR„WRTUHFWRITEUPPERHALFASCURRENTDATABLOCKŠBNE„EXPNRTERROR*%*ˆMOVELOWERHALFTOENDOFEXPANSION*:ŠMOVE.LA0,A1ŒMOVELOWERHALFUPTOENDOFINSERTLOCATIONŠADD.L‚D4,A0ŽMOVETOADR#ŠLEA„-1(A0,D3.L),A5…NEWLOGICALENDŠMOVE.LD1,A3ŽMOVEFROMADRŠLSR.W‚#1,D3ŽWORDCOUNTTOMOVEŠBEQ.S‚EXPN45NOTHINGTOMOVE?ŠCMP.L‚A3,A0Ž.ŠBEQ.S‚EXPN45.NOŠBHI.S‚EXPN35YES,MOVEDOWN?GEXPN30„MOVE.W(A3)+,(A0)+…NO,MOVECOMPLETELOWERHALFUPTOENDOFEXPŠDCNTƒD3,EXPN30Š.ŠBRA.S‚EXPN45.$EXPN35„MOVE.LA3,D1ŽMOVEBUFFERDOWNŠLSL.W‚#1,D3Ž.ŠADD.L‚D3,A3Ž."ŠADD.L‚D3,A0Ž.MOVEFROMBOTTOMUPEXPN40„MOVE.W-(A3),-(A0)ˆ.!ŠCMP.L‚A3,D1Ž.DONEIFATTHETOPŠBNE.S‚EXPN40.-EXPN45„MOVE.LD5,A3ŽCURRENTFABENTRYPOINTER*4*ˆCREATENEWDATABLOCKANDFABENTRYFORLOWERHALF*DEXPN46„CLR.W‚D0‡GETNEWFABENTRYFORLOWERHALFAFTERCURRENTENTRYŠMOVE.BFABKEY(A3),D0†.3ŠLEA„FABSSL(A3,D0),A3ƒPOINTTOGETNEWFABENTRYAT'ŠCMP.L‚FATFAE(A4),A3†BEYONDENDOFFAB?ŠBLO.S‚EXPN50.1‹BRANCHIFNO#ŠBSR„ISTAIERR‹INTERNALERRORIFYES ŠBRA.S‚EXPN55BEXPN50.1‚MOVE.L#2,D1ŒSETUPDATEKEYFLAG,NEWFBDWILLNOTSETKEY ŠMOVE.LA7,D0=ŠBSR.S‚NEWFBDˆGETNEWDATABLOCKANDFABENTRYFORLOWERHALFEXPN51„BEQ„EXPNOKNOERRORSEXPN55„BRA„EXPNRTRETURN**ˆTOPHALFISSMALLER?*ˆWRITEOUTLOWERHALFANDCREATENEWDATABLOCKOUTOFTHETOP*EXPN608ŠBSR.S‚WRTLHFWRITEOUTLOWERHALFASCURRENTDATABLOCKŠBNE.S‚EXPN55ERROR?.ŠMOVE.LD6,A0ŽNO,A0->1STRECORDOFLOWERHALF=ŠLEA„-1(A0,D4.L),A5…EXPANDUPPERHALFATTHEEND(GETNEWSBL)7ŠMOVE.LD5,A3ŽGETNEWFABENTRYINFRONTOFCURRENTONEDŠMOVE.L#3,D1‚RETURNDON'T-UPDATE-FAB-ENTRY'S-KEY-FIELDSINCENEWFBD ŠMOVE.LA7,D09ŠBSR.S‚NEWFBDŒWILLSETKEYFIELDTOPREVENTFRAGMENTATIONŠBNE„EXPN55ERROR>ŠBSR„DPLKEY…IFDUPLICATEKEYFILECANNOTLEAVESAMEKEYINNEW>ŠBNE.S‚EXPN61‡.FABENTRYSINCECOULDBEINSERTINGSMALLERKEY.ŠMOVE.L#2,D1ŽDUPL.KEYS=>FLAGTOUPDATEKEYEXPN61„CLR.L‚D0‘SETGOODRETURN ŠBRA„EXPN51*8*ˆNEITHERPARTISEMPTYENOUGH;WRITEOUTBOTHHALFSAND-*ˆCREATENEWDATABLOCKBETWEENTHETWOHALFS**ALLOCATE 1 FAB AND 2 DB'SEXPN65„MOVE.LA7,D0 ŠBSR„AL2DBF ŠBNE.S‚EXPN558ŠBSR.S‚WRTLHFWRITEOUTLOWERHALFASCURRENTDATABLOCK ŠBNE.S‚EXPN551ŠMOVE.LA1,FATSBL(A4)†SETUPPERHALF'SBUFFEREND;ŠMOVE.LD5,A3‹GETNEWFABENTRY&DATABLOCKFORUPPERHALF$ŠCLR.L‚D1‘SETFLAGNOTTOUPDATEKEY ŠMOVE.LA7,D0ŠBSR.S‚NEWFBD.ŠBNE.S‚EXPN55ERRORŠBSR.S‚WRTUHFWRITEUPPERHALFŠBNE.S‚EXPN55ERROR=ŠSUB.L‚A1,D6ˆIFUPDATEACCOUNTFORINITIALRECORDLENGTHALSOFŠADD.LD6,D4.BCTOFNEWDATABLOCK(BCTOFEXPANSION+OLDRECORDLENG#ŠLEA„-1(A0,D4.L),A5…A5->ENDOFDBŠMOVE.LA0,A1ŽINSERTLOCATION8ŠBRA.S‚EXPN46CREATENEWDBBETWEENTHETWOJUSTWRITTENŠPAGE**‚EXPNDBSUBROUTINES*F*‚WRTUHFANDWRTLHFWRITEPARTOFTHEDATABLOCKTODISKASTHECURREN.*“DATABLOCK,FABENTRYISUPDATEDACCORDINGLY**‚ENT:A1=ENDOF 1STHALF+1'*‡D6=STARTOF2NDHALFATNEXTRECORD*‡A0=DATABUFFERSTART *‡A3=FATSBL*7*‚RET:ALLREGISTERSUNCHANGEDEXCEPTD0=ERRORSTATUS* WRTUHF„EQU„*AŠMOVE.LA1,FATSBL(A4)…WRITEUPPERHALF,POINTOFEXPANSIONISITSŠSUB.L‚#1,FATSBL(A4)†.LWA+1 ŠMOVE.L#1,D0ŽFLAGTOUPDATEKEY ŠBRA.S‚WRTHLF WRTLHF„EQU„*6ŠMOVE.LD6,FATSBS(A4)†LOWERHALFSTARTSATNEXTRECORD!ŠCLR.L‚D0‘FLAGTOLEAVEKEYALONE,WRTHLF„BSETW‚#FAFLUB,FATFLG(A4)FORCEUPDATEŠBSR„DBCHGŽINDICATEDBCHANGED ŠBSR„PUTDAT.9ŠMOVE.LA0,FATSBS(A4)†RESTORENORMALBUFFERSTARTANDENDŠTST.B‚D0‘RETURNFLAGSŠRTS*ŠPAGE**#*ˆ***********************************ŒNEWFBD1.0011/10/79HBN6*#*ˆ***********************************D*‚NEWFBDCREATESANEWFABENTRYANDALLOCATESANEWDATABLOCK.‚FAB=*ˆENTRYCREATEDBECOMESNEWCURRENTFABENTRY,ITISSETUPTO*ˆINDICATENULLDATABLOCK.=*ˆIFANEWFABENTRYCANNOTBEINSERTEDINTOTHECURRENTFAB,3*ˆTHETOPHALFOFTHEFABISWRITTENOUTASCURRENT=*ˆFAB,&ANEWFABISLINKEDINTOTHEFABCHAINFORTHELOWER7*ˆHALF.‚THISNEWFABWILLCONTAINNEWFAB‚ENTRY(ATTHE4*ˆSTARTORENDOFTHEFAB)TOGETHERWITHTHEENTRIES,*ˆFROMTHESMALLERHALFOFTHEORIGINALFAB.* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS;*ˆA3=LOCATIONTOINSERTNEWFABENTRYINTOINCURRENTFAB0*…D0=POINTERTOALLOCATEDSECTORSTABLEONSTACK0*ˆD1.L=3IFTOSETNEWENTRY'SKEYFIELDUSING5*‘KEYPOINTEDTOBYD6,(USEKEY-1ACTUALLY),DOTHIS"*‘TOHELPAVOIDFILEFRAGMENTATION+*ANYTHINGELSE=>CLEARKEYFIELD,ITWILL*‘BESETLATERBYUPCFAB8*ˆD6->1STRECORDOFDISCARDEDLOWERHALFOFDATABLOCK2*ŽKEYISUSEDWHENNEEDTOCREATENEWFABINFRONT*ŽOFCURRENTFAB* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:**ˆA3=NEWFATCFP,‚FABENTRYJUSTINSERTED*ˆD0.L=0IFNOERROR*ˆD0.B=ERRORCODEOTHERWISE*ˆZ=1IFNOERROR *Œ0IFERROR**INDENTED LISTA* NEWFBD ALLOCATES NEW DATA BLOCK AND GETS A NEW FAB ENTRY FOR IT *NEWFBD PASS FAB-ENTRY LOC.&-KEY* ALLOCATE DATA BLOCK*‚CALL$DSALLC* GET-NEW FAB ENTRY *‚FABFULL?*ƒYES,SPLITFAB *„CALL$DSALLC,$PRVFHD,$NXTFHD!*ƒNO,-MOVEENTRIESTO-GETNEW-ONE* SET-UP FOR-NEW DATA-BLOCK*‚CALL$GLLSFB,$SETFSL* RETURN NEW CURRENT FAB-ENTRY*INDENTED LIST END* NEWFBD„EQU„**7*ˆFINDENDOFFABENTRIESANDPRIORENTRY'SKEYPOINTER*@ŠMOVEM.LA0-A1/A5/D0-D7,-(A7)SAVEREGS,POSITIONOFD6CRITICAL'*…PSNTABLEPOINTERNOWONTOPOFSTACK/ŠMOVE.LA3,D7ŽSAVEPTRTOINSERTENTRYLOCATION ŠCLR.L‚D0.ŠCLR.L‚D2‘CLEARFORLASTKEYFIELDOFTOPHALF'ŠMOVE.LFATCFP(A4),A1†CURRENTFABENTRYŠCMP.L‚D0,A1Ž.ŠBNE.S‚NEWFIE.1‹BRANCHIFOKŠBSR„ISTAIERR‹ERRORIFNONEŠBRA.S‚NEWFRT.1*NEWFIE.1‚TST.L‚(A1).ERRORIFEMPTYENTRYŠBNE.S‚NEWFIE.2‹BRANCHIFOK2ŠBSR„ISTAIERR‹NONZERO=>ATLEASTONEENTRYINFABNEWFRT.1‚BRA„NEWFRT.NEWFIE.2‚MOVE.LFATFAA(A4),A1†GETFORWARDLINKŠMOVE.L(A1),D3Œ.FABFLK'ŠMOVE.LFABBLK(A1),D4†ANDBACKWARDLINK+ŠMOVE.BFABPKY(A1),D0†GET1STENTRYPOINTERŠLEA„FABSEG(A1,D0),A1ƒ.'ŠMOVE.LFATFAE(A4),D5†ENDOFFABBUFFER;NEWF00„LEA„FABKEY(A1),A5†A5->KEYFIELDOFFABENTRYATHAND,ŠMOVE.B(A5),D0ŒGETENTRY'SKEYFIELDLENGTH*ŠLEA„FABSSL(A1,D0),A1ƒA1->NEXTFABENTRY ŠMOVE.LD5,D6*ŠSUB.L‚#1,D6ŽD6->LASTWORDINFABBUFFER:ŠCMP.L‚A3,A1‹GETTOPHALF'SLASTKEYFIELDPOINTERINTOD2ŠBHI.S‚NEWF05INSECONDHALF?5ŠMOVE.LA5,D2ŽNO,SAVEFORLASTKEYFIELDOFTOPHALF$NEWF05„CMP.L‚D6,A1ŽATENDOFBUFFER?-ŠBCC.S‚NEWF10PASTENDOFFAB(=FABISFULL)ŠTST.L‚(A1)NO,ENDOFENTRIES?ŠBNE.S‚NEWF00NOCNEWF10„MOVE.BFCBDIR+DIRKEY(A2),D0GETENDOFFABIFADDEDANENTRY/ŠLEA„FABSSL(A1,D0),A5ƒ.A1,A5->BYTEAFTEREND)ŠCMP.L‚D6,A5ŽDOESONEMOREFABENTRYFIT?ŠBHI„NEWF55NO*>*ˆEXPANDFABTOINSERTNEWFABENTRYSINCEROOMINCURRENTFAB<*ˆD2=0IFNOTOPHALF,ELSE=LASTKEYPOINTERINTOPHALF.*ˆA5=NEWENDOFFABIFADDNEWENTRY(LWA+1)7*ˆD5=ENDO FFABBUFFER,A1->ENDOFLASTFABENTRY+16*ˆD3=NEXTFABPSN,D4=PRIORFABPSN,A3=INSERT.*6ŠBEQ.S‚NEWF15CLEARTRAILINGLONGWORDIFFABNOTFULL0ŠCLR.L‚(A5).TOINDICATENEWENDOFFABENTRIES1NEWF15„ADD.L‚#FABSSL,D0‰D0=BCTTOEXPANDFABBY,ŠCLR.L‚D6‘FLAGSOFFFOREXPAND,NOSPLITTING4ŠCMP.L‚A1,A3ŽNOTHINGTOMOVEIFINSERTATENDOFFABŠBNE.S‚NEWF25MOVE2NEWF20„LEA„FABKEY(A3),A1†GETNEWENTRY'SKEYFIELD.ŠMOVE.LA1,FATKEY(A4)†ITISTHEFAB'SLASTKEY ŠBRA.S‚NEWF30*9NEWF25„MOVE.B-(A1),-(A5)ˆEXPANDSOMOVEBOTTOMHALFDOWNŠCMP.L‚A1,A3Ž. ŠBNE.S‚NEWF250ŠADD.L‚D0,FATKEY(A4)†ADJUSTLASTFABKEYPOINTERMOVETOADDRESS.*ˆA5->RECORDWITHNEWKEYTOSUBTRACT1FROM*ˆD4=BCTTOMOVE'*ˆD6=-2IFNOTTOSUBTRACT1,ELSEDO"ŠTST.W‚FCBDIR+DIRLRL(A2)‚VRLFILE?ŠBNE.S‚GKMN00NO,FRL+ŠADD.L‚#BCTFLD,A5‰YES,ADDBCTFIELDLENGTHGKMN00„CLR.L‚D0+ŠMOVE.BFCBDIR+DIRKEY(A2),D0GETKEYLENGTHŠCMP.L‚#-2,D6SKIPSUBTRACTION?ŠBEQ.S‚GKMN10.YES ŠLEA„0(A5,D0.L),A0†NO,GETKEY-1 ŠCLR.W‚D1ŠSUB.W‚#1,-(A0)‹.GKMN05„MOVE.W-(A0),D0‹.ŠSUBX.WD1,D0Ž.ŠMOVE.WD0,(A0)Œ.%ŠCMP.L‚A0,A5Ž.SUBTRACTIONCOMPLETED?2ŠBNE.S‚GKMN05NO,CONTINUETOCARRYBORROWTHROUGH"GKMN10„MOVE.B(A5)+,(A3)+ˆMOVEKEYŠDCNTƒD4,GKMN10Š.ŠRTS** *ˆHAVETOSPLITFAB:THREECASES)*ˆCASE1:INSERTATTHETOPOFCURRENTFAB=*ˆALLOCATENEWFABANDLINKITINFRONTOFCURRENTFAB;WRITE?*ˆCURRENTFABTODISK,NEWFABWILLCONTAINONLYNEWFABENTRY.,*ˆCASE2:INSERTINTHEMIDDLEOFCURRENTFAB7*ˆALLOCATENEWFABANDLINKITAFTERCURRENTFAB;WRITE>*ˆTOPHALFOFCURRENTFABASCURRENTFABTODISK,NEWFABWILL9*ˆCONTAINNEWFABENTRYFOLLOWEDBYRESTOFORIGINALFAB.)*ˆCASE3:INSERTATTHEENDOFCURRENTFAB;*ˆSAMEASCASE2EXCEPTNEWFABWILLCONTAINONLYNEWENTRY.<*ˆD2=0ORLASTKEYINTOPHALF,D3,D4=NEXT/PRIORFABPSN4*ˆA3=INSERTPOSITION,A1=E NDOFLASTFABENTRY+1* NEWF55„EQU„*)ŠCLR.L‚D6‘D6=0=>INSERTATTOP-CASE1$ŠMOVE.LFATFAA(A4),A0†FABBUFFERFWA1ŠMOVE.LA1,D5ŽSAVELASTFABENTRYPOINTER(LWA+1)ŠTST.L‚D2‘ANYTOPHALF?ŠBEQ.S‚NEWF60NOŠSUB.L‚#1,D6ŽINSERTCASE3ŠCMP.L‚A1,A3ŽATENDOFFAB?ŠBEQ.S‚NEWF65YES>ŠMOVE.L(A3),D6ˆNO,SAVE1STLONGWORDAFTERTOPHALF-CASE2ŠBGT.S‚NEWFIE.3‹BRANCHIFOKŠBSR„ISTAIERR‹ERRORIF<=0 ŠBRA.S‚NEWFRT.NEWFIE.3‚CLR.L‚(A3)ANDSETZEROASENDOFFAB ŠBRA.S‚NEWF65CNEWF60„MOVE.LFATKEY(A4),D2†D2TOCONTAINTOPPART'SLASTKEYFIELD:ŠBSETW‚#FAFLMB,FATFLG(A4)FLAGNEXTFABTOOFULLFORMERGE**…GETPSNFORNEWFAB*,NEWF65„MOVE.L(A7),A1ŒGETADDR.OFPSNTABLEŠMOVE.L(A1),D1ŒGETFABPSNŠBNE.S‚NEWFIE.4‹BRANCHIFOK#ŠBSR„ISTAIERR‹ERRORIFALREADYUSEDNEWFRT.4‚BRA„NEWFRT!NEWFIE.4‚CLR.L‚(A1)INDICATEUSEDŠMOVE.LD1,A1ŽA1=FABPSNŠTST.L‚D6‘CASE1?ŠBEQ„NEW120YES*9*ˆCASE2OR3:UPDATEBACKWARDLINKOFNEXTFABANDWRITE *ˆTOPHALFOFFABASCURRENTFAB*=ŠMOVE.LA1,(A0)‰SETCURRENTFABFORWARDLINK->INGTONEWFAB#ŠCLR.L‚D0‘UPDATEBACKWARDLINKONLY>ŠMOVE.LA1,D4ˆD4=NEXTFAB'SBACKWARDLINK(=PSNOFNEWFAB)ŠBSR„NXTFHDUPDATENEWFER„BNE.S‚NEWFRT.4‹ERROR?)ŠMOVE.WFATFLG(A4),-(A7)ƒSAVEFLAGSTATUS-ŠBCLRW‚#FAFLKB,FATFLG(A4)CLEARLASTKEYFLAGŠBSR„FABCHGFABCHANGED9ŠBSR„PUTFABŠANDUPDATETHETOPHALFOFFABASCURRENTFAB&ŠMOVE.W(A7)+,FATFLG(A4)ƒRESTOREFLAGSŠTST.B‚D0‘ERROR?ŠBNE„NEWFERYES*)*ˆSETUPFORNEWFABTOFOLLOWCURRENTONE*:ŠMOVE.LFATFAB(A4),FABBLK(A0)SETBACKWARDLINKTOOLDFAB3ŠMOVE.LD3,(A0)ŒSAMEFABFLKASINOLDFAB(RESTORE)-ŠMOVE.LD4,FATFAB(A4)†THISISNEWCURRENTFAB.ŠMOVE.LD2,A1ŽOLDFAB'SLASTKEYFIELDPOINTER*$*ˆADJUSTFABINFOFORNEWFABINFAT*?ŠCLR.L‚D0†CALCULATE#OFSECTORSANDRECORDSLOSTWITHTOPHALF ŠCLR.L‚D1‘.)ŠLEA„FABPKY(A0),A0†FABHEADERKEYPOINTERŠMOVEM.LD5/A0-A1,-(A7)+ŠCLR.L‚D5‘GET1STFABENTRYPOINTERINTOA0ŠMOVE.B(A0)+,D5 ŠADD.L‚D5,A0!ŠBSR„GLLSFB.A0->1STFABENTRYŠMOVEM.L(A7)+,D5/A0-A17ŠADD.L‚D0,FATFLS(A4)†SETNEWFAB'SSTARTINGLSNANDLRNŠADD.L‚D1,FATFLR(A4)†.ŠGET2ƒFATFLS(A4),D2,D3ƒ.*/*ˆMOVEOLDFAB'SLASTKEYINTONEWFAB'SHEADER* ŠCLR.L‚D0(ŠMOVE.B(A1)+,D0‹LASTKEYFIELD'SLENGTH&ŠMOVE.BD0,(A0)+‹SAMEKEYFIELDLENGTHŠBEQ.S‚NEWF75SKIPIFNULLKEY0NEWF70„MOVE.B(A1)+,(A0)+ˆMOVETHEKEYTOHEADERŠDCNTƒD0,NEWF70Š.*)*ˆMOVERESTOFFABUPTOENDOFNEWENTRY*ˆA0->1STFABENTRYLOCATION*!NEWF75„CLR.L‚D4‘GETFULLKEYSIZEŠMOVE.BFCBDIR+DIRKEY(A2),D4.GNEWF80„LEA„FABSSL(A0,D4),A1‚A1=2NDENTRYPOINTER:LEAVEROOMFORNEWENTŠMOVE.LA1,A5ŽSAVEŠTST.L‚D6‘CASE3?"ŠBMI.S‚NEW100YES,NOTHINGTOMOVE7ŠMOVE.LD6,(A3)ŒNO-CASE2,RESTORESTARTOF2NDENTRYEŠMOVE.LA3,D0GETBCTOFGAPBETWEENNEWENTRY'SENDANDSTARTOF2NDŠSUB.L‚A1,D0Ž.ENTRY0ŠCMP.L‚A1,A3ŽMOVELOWERHALFTOENDOFNEWENTRY0ŠBEQ.S‚NEWF95.NOTHINGTOMOVEIFALREADYTHERE)ŠBHI.S‚NEWF85.ENOUGHROOMFORFULLKEY?;ŠADD.L‚D0,D4Š.NO,D4=NEWSHORTERKEYFIELDTHATWILLFIT:ŠBHI.S‚NEWF80‹.NOWNEWENTRYRIGHTINFRONTOFLOWERHALF&ŠBSR„ISTAIERR‹INTERNALERRORIF.LE.0NEWFRT.5‚BRA„NEWFRT2NEWF85„SUB.L‚A3,D5Ž.MOVE:GETBCTOFRESTOFFABŠLSR.W‚#1,D5Ž.WORDCOUNTŠBNE.S‚NEWF90BRANCHIFOKŠBSR„ISTAIERR‹ERRORIFNULLNEWFRT.6‚BRA.S‚NEWFRT.5CNEWF90„MOVE.W(A3)+,(A1)+ˆ.MOVERESTOFFABUPTOENDOFNEWENTRYŠDCNTƒD5,NEWF90Š.*ŠCLR.L‚(A1)CLEARFORENDOFFABINDICATOR**ˆGETFAB'SLASTLSNANDLRN*NEWF95„MOVE.LA0,A3ŽNEWFATCFPDŠMOVE.LA5,A0‚CALCULATE#OFRECORDSANDSECTORSINREMAINDEROFFABŠCLR.L‚D0‘.IGNORENEWENTRY ŠCLR.L‚D1‘. ŠCLR.L‚D5‘.<ŠBSR„GLLSFB‡.CALLSETSALSOFATKEYFIELDFORFABINTHEFAT ŠSUB.L‚#1,D0ŽGETLASTLSNOFFABŠADD.L‚D0,D2Ž. ŠSUB.L‚#1,D1ŽGETLASTLRNOFFABŠADD.L‚D1,D3Ž.NEW100„MOVE.LA3,D0ŽSAVE/ŠMOVE.LFATFAA(A4),A3†CURRENTFABTHELASTONE?ŠTST.L‚(A3).YESIFFABFLK=0ŠMOVE.LD0,A3Ž.RESTOREŠBNE.S‚NEW105NO@ŠMOVE.LFATFAB(A4),FCBDI R+DIRFE(A2)YES,NEWFABISTHELASTNOW.ŠBSETW‚#FCFLDB,FCBFLG(A2)SETFCBCHANGEDFLAG;NEW105„SAVE2‚D2,D3,FATLLS(A4)ƒSAVELASTLSNANDLRNFORFAB%ŠBSR„SETFSLNEWSEGMENTATTOPOFFAB**ˆRETURNFORCASE2&3*ŠTST.L‚D6‘CASE2?ŠBPL„NEWF40YES,ŠMOVE.LA0,A3ŽCASE3:FABHASONLYNEWENTRY*ŠCLR.L‚(A5)CLEARFORENDOFFABINDICATORDŠMOVE.LA3,FATCFP(A4)‚SETSODON'TTRYTOUPDATESLS&SLRAGAINLATER ŠBRA„NEWF20*7*ˆCASE1:NEWFABTOBECREATEDINFRONTOFCURRENTONE*NEW120„EQU„*’A1=NEWFABPSN*>*ˆSAVEOLDFAB'SHEADERFORNEWFABINDBOVERFLOWSPACE,THEN?*ˆSETOLDFAB'SHEADERKEY=1STKEY-1OFLOWERHALF,THATWILL!*ˆALSOBETHENEWFABENTRY'SKEY?*ˆIFDUPLICATEKEYSSETFIELDTO'KEY'SOWILLNOTHAVE'KEY-1'*ˆANDUSERINSERTS'KEY'*#ŠBSR„DPLKEYDUPLICATEKEYSALLOWED?ŠBNE.S‚NEW121NO6ŠMOVE.L#-2,D6YES,FLAGTOENTER'KEY'INTONEWFIELD5NEW121„CLR.L‚D4‘SAVECURRENTFAB'SHEADERFORNEWFAB0ŠMOVE.BFCBDIR+DIRKEY(A2),D4.GETHEADERLENGTHŠADD.L‚#FABSEG,D4‰.'ŠMOVE.LFATSBE(A4),A5†.MOVETOADDRESSŠADD.L‚#1,A5Ž.1ŠMOVEM.LD4/A0/A5/A3,-(A7).SAVEFORMOVINGBACK%NEW125„MOVE.B(A0)+,(A5)+ˆSAVEHEADERŠDCNTƒD4,NEW125Š.CŠMOVE.L10*4(A7),A5ƒGETNEWKEY=1STKEYOFFAB-1(A5=ORIGINALD6))ŠMOVE.LFATFAA(A4),A3†GETMOVE-TOADDRESSŠADD.L‚#FABPKY,A3‰.ŠMOVE.B(A3)+,D4‹.!ŠBEQ.S‚NEW129.SKIPIFNULLKEYS+ŠBSR„GKMNS1GETKEYMINUS1INTOFABHEADER*@*ˆSETBACKWARDLINK=NEWFABPSNANDUPDATECURRENTFABONDISK*NEW129„MOVE.LFATFAA(A4),A09ŠMOVE.LA1,FABBLK(A0)†SETNEWBACKWARDLINKINTOOLDFABŠBSR„FABCHGUPDATECUURENTFAB ŠBSR„PUTFAB.,ŠMOVEM.L(A7)+,D4/A0/A5/A3RESTOREREGISTERSNEWFRT1ƒBNE„NEWFRT.6‹IOERROR?* *ˆRESTOREFABHEADERFORNEWFAB*8NEW130„MOVE.B(A5)+,(A0)+ˆMOVEHEADERBACKTOFABBUFFERŠDCNTƒD4,NEW130Š.&ŠMOVE.LFATFAA(A4),A0†A0->FABBUFFER=ŠMOVE.LFATFAB(A4),(A0)„SETFORWARDLINKFORNEWFAB(FABFLK),ŠMOVE.LA1,FATFAB(A4)†NEWFABISCURRENTFAB*6*ˆADJUSTFORWARDLINKINPRIORFABTOPOINTTONEWFAB*)ŠMOVE.LFABBLK(A0),D4†GETPRIORFAB'SPSN(ŠMOVE.LA1,D3ŽFORWARDLINKFORPRIORFAB9ŠBSR„PRVFHDŠUPDATELINKANDSETFCBDIR+DIRFSIFNECESSARYŠBNE„NEWFRT1ŒERROR**ˆSETUPFATINFOFORNEWFAB*#ŠCLR.L‚D0‘GETNEWFABENTRYPOINTERFŠMOVE.BFABPKY(A0),D0.LEAVESAMEHEADERKEYLENGTHASINORIGINALFAŠLEA„FABSEG(A0,D0),A0ƒ.=ŠGET2ƒFATFLS(A4),D2,D3ƒADJUSTSTARTINGLSNANDLRNOFSEGMENTŠSUB.L‚#1,D2Ž.DŠSUB.L‚#1,D3.ADJUSTSINCEUPCFABWILLADD#OFRECORDSANDSECTORS1ŠMOVE.L#-2,D6CONTINUEASIFADDEDTOENDOFFAB8ŠBRA„NEWF75‹ANDFLAGNOTTOSUBTRACT1FROMKEYANYMOREŠPAGE**#*ˆ***********************************ŒCMPRDB1.0011/16/79HBN6*#*ˆ**********************************C*‚CMPRDBCOMPRESSESTHECURRENTDATABLOCKBYGIVENNUMBEROFBYTES>*ˆFORRECORDDELETIONORUPDATING(NEWRECORDSHORTERTHANTHE?*ˆEXISTINGONE).‚LSNINFOINFAT&FCBDIR&FABAREUPDATEDTO;*ˆREFLECTANYCHANGE.‚IFTHEDATABLOCKBECOMESEMPTYITIS>*ˆDELETEDTOGETHERWITHITSFABENTRY-NOCURRENTSEGMENTWILL7*ˆEXIST.‚IFTHEFABBECOMESEMPTYITISDELETED.‚IFTHE?*ˆFAB(ORDATABLOCK)BECOMESMARGINALLYFULLANATTEMPTISMADE6*ˆTOCOMBINEITWITHANYNEXTFAB(ORNEXTDATABLOCK).* *‚ONCALL:*ˆA6=VDTADDRESS*ˆA4=FATADDRESS*ˆA2=FCBADDRESS@*ˆA1=POINTOFDELETION(1STBYTETOBEDELETED,MUSTBEEVENA *‹->BYTEAFTERRECORDIFUPDATE*‹->STARTOFRECORDIFDELETE*ˆD0=BYTECOUNTTOCOMPRESS%*ˆIFODDBCTWILLCOMPRESSD0+1BYTES* *‚ONRETURN:!*ˆALLREGISTERSUNCHANGEDEXCEPT:*ˆA1=UNKNOWN*ˆD0.L=0IFNOERROR*ˆD0.B=ERRORCODEOTHERWISE**INDENTED LIST@* CMPRDB DELETES SPACE IN DATA BLOCK FOR RECORD DELETE OR UPDATE$*CMPRDB PASS-BCT &-POINT-OF DELETION%* DELETION RESULTS IN-EMPTY DATA-BLK?!*‚NO,-UPDATEDB-INFOCALL$UPDEOF"*ƒTRY-MERGEWITH-NEXTCALL$CMBNDB*„DELETEDLASTRECORD?*…YES,CALL$DPLKEY,$PUTKEY*†RETURNNEWFATSB L*…NO,RETURNNEWFATSBL"*‚YES,DELETEDATA-BLOCK&FAB-ENTRY *ƒCALL$DSDEAL,$GLLSFB,$DELFAB*„EMTPTYFABRESULTS?*…YES,DEALLOCATEIT*‡RETURNNODATA-BLKOR-FAB*…NO,-TRYMERGE-WITHNEXT-FAB*†CALL$CMBNFB,RETURN*INDENTED LIST END* CMPRDB„EQU„***ˆCHECKTHATPARAMETERSAREOK*,ŠMOVEM.LA0/A3/A5/D1-D5,-(A7)SAVEREGISTERS.ŠBTSTW‚#0,D0ŽODDBCT=>D0+1BYTESTOCOMPRESSŠBEQ.S‚CMPR05.ŠADD.L‚#1,D0Ž.%CMPR05„TST.L‚D0‘ERRORIFNULLBCTNOWŠBNE.S‚CMPRIE.1‹BRANCHIFOKŠBSR„ISTAIERR‹ERRORIFNULL ŠBRA.S‚CMPRRTGCMPRIE.1‚GET2ƒFATSBS(A4),A0,A5ƒGETBUFFERSTARTANDCURRENTLOGICALEND4ŠCMP.L‚A1,A5ŽDELETEPOSITIONMUSTBEINFRONTOFEND5ŠBHI.S‚CMPRIE.2‹...ANDAFTERBUFFSTARTBRANCHIFOKŠBSR„ISTAIERR‹ERROR ŠBRA.S‚CMPRRTCMPRIE.2‚CMP.L‚A1,A0Ž.ŠBLS.S‚CMPRIE.3‹BRANCHIFOKŠBSR„ISTAIERR‹ERROR ŠBRA.S‚CMPRRTFCMPRIE.3‚MOVE.LA5,D1ˆGETNEWDATABLOCKLOGICALENDAFTERCOMPRESSIONŠSUB.L‚D0,D1Ž.4ŠMOVE.LD1,FATSBL(A4)†SAVESECTORBUFFERLOGICALEND@ŠADD.L‚#1,D1…WILLANEMPTYDATABLOCKBETHERESULTOFCOMPRESS?ŠCMP.L‚D1,A0Ž.ŠBEQ.S‚CMPR20YES?ŠCLR.W‚(A1)†NO,CLEARFORENDOFBUFFERIFDELLASTRECANDVRLŠBSR„DBCHGŽDATABLOCKCHANGED0ŠCMP.L‚A1,D1ŽDELETERECORDATENDOFDATABLOCK? ŠBEQ„CMPR45YES,NOTHINGTOMOVE*)*ˆCOMPRESSDATABLOCK:MOVELOWERPARTUP0*ˆD0=BCTTOCOMPRESS,A0=FATSBS,A5=FATSBL:*ˆA1=POINTOFDELETION,D1=NEWFATSBL+1AFTERDELETION*ŠMOVE.LA1,A3ŽA1=MOVETOADRŠADD.L‚D0,A3ŽA3=MOVEFROMADR0CMPR10„MOVE.W(A3)+,(A1)+ˆDELETEREQUESTEDBYTESŠCMP.L‚D1,A1ŽDONE?ŠBNE.S‚CMPR10. ŠCLR.W‚(A1)ZERONEXTBYTECOUNT*@*ˆUPDATEFABENTRYANDDIRECTORYINFCBTOREFLECTNEWDATABLOC*=CMPR15„BSR„UPDEOFŒUPDATELSNINFOINFATANDFCB-DIR,ANDFAB;ŠBSR„CMBNDBˆTRYTOCOMBINEDATABLOCKWITHNEXTIFPOSSIBLE5CMPRRT„MOVEM.L(A7)+,A0/A3/A5/D1-D5RESTOREREGISTERSŠRTS*+*ˆDELETEEMPTYDATABLOCKANDITSFABENTRY**CMPR20„MOVE.LFATFAE(A4),A3†FABBUFFEREND&ŠMOVE.LFATFAA(A4),D3†FABBUFFERSTART/ŠMOVE.LFATCFP(A4),A1†CURRENTFABENTRYPOINTER6ŠBCLRW‚#FAFLDB,FATFLG(A4)NODATABLOCK=>NOTCHANGED7ŠMOVE.L(A1),D2ŒSAVEFABPSNFORDATABLOCKDEALLOCATION!ŠCLR.L‚D1‘ANDGETDATABLOCKSIZE(ŠMOVE.BFABSGS(A1),D1†ADJUSTLLSANDEOF3ŠSUB.L‚D1,FATLLS(A4)†ADJUSTLASTLSNOFCURRENTFAB<ŠSUB.L‚D1,FCBDIR+DIREOF(A2)ADJUSTEOFLSNINPRIMDIRIMAGE=ŠSUB.L‚#3,A3ˆGETFABBUFFEREND-3(->LASTLONGWORDOFFAB)6ŠCLR.L‚D0DELETEFABENTRY:GETNEXTFABENTRYPOINTERŠMOVE.BFABKEY(A1),D0†.,ŠLEA„FABSSL(A1,D0),A5ƒ.A5->NEXTFABENTRY#ŠCMP.L‚A3,A5ŽDELETELASTFABENTRY?ŠBCC.S‚CMPR28YES)ŠTST.L‚(A5)DELETELASTFABENTRYINFAB?ŠBEQ.S‚CMPR28YES(ŠADD.L‚#4,A3ŽA3->BYTEAFTERFABBUFFER.CMPR25„MOVE.W(A5)+,(A1)+ˆNO,DELETEFABENTRY-ŠCMP.L‚A3,A5ŽBYMOVINGRESTOFFABENTRIESUP ŠBNE.S‚CMPR25 ŠBRA.S‚CMPR30=CMPR28„BSETW‚#FAFLKB,FATFLG(A4)SETLASTFABKEYCHANGEDFLAG6CMPR30„CLR.L‚(A1)DELETELASTFABENTRYINCURRENTFAB$ŠCLR.L‚FATCFP(A4)‰NOCURRENTSEGMENT#ŠMOVE.LD2,A1ŽDEALLOCATEDATABLOCK"ŠBSR„DEALDB.D1=DATABLOCKSIZE!ŠMOVE.LD0,-(A7)‹SAVERETURNCODEŠMOVE.LD3,A0ŽFABBUFFERSTART%ŠCLR.L‚D0‘FIND1STFABENTRYPOSITIONŠMOVE.BFABPKY(A0),D0†.ŠLEA„FABSEG(A0,D0),A0ƒ.#ŠBSR„GLLSFBSETFATKEYFIELDINFAT#* RETURNS WITH D0 = LAST LSN OF FAB*ŽD1=LASTLRNOFFAB$ŠMOVE.L(A7)+,D0‹RESTORERETURNCODEŠBNE.S‚CMPRR1ERROR?ŠPAGE*#*ˆDEALLOCATEFABIFITBECAMEEMPTY*ŠTST.L‚(A0)EMPTYFAB?ŠBNE.S‚CMPR40NO%ŠBSR„DELFABYES,DEALLOCATEFABSPACECMPRRT.1‚EQU„*CMPRR1„BRA.S‚CMPRRT**ˆTRYTOCOMBINEWITHNEXTFAB* CMPR40„EQU„*(ŠBSR„CMBNFBTRYTOCOMBINEFABWITHNEXTŠBNE„CMPRR1ERROR ŠBSR„FABCHGSETFABCHANGEDFLAGŠCLR.L‚D0‘GOODRETURNFLAGS ŠBRA.S‚CMPRR1*'*ˆDELETEDLASTRECORDINTHEDATABLOCK&*ˆNSERTNEWLASTRECORD'SKEYINTOFAB*.CMPR45„TST.B‚FCBDIR+DIRKEY(A2)‚YES,NULLKEYS?!ŠBEQ.S‚CMPR70YES,SKIPKEYSTUFF$ŠCLR.L‚D5‘NO,FINDLASTRECORDINDB!ŠMOVE.WFCBDIR+DIRLRL(A2),D5FRL?ŠBNE.S‚CMPR60YESŠCLR.L ‚D0‘NO,VRL2CMPR50„MOVE.W(A0)+,D0‹SKIPRECORDSTILLFINDLASTŠBNE.S‚CMPRIE.4‹BRANCHIFOKŠBSR„ISTAIERR‹ERRORŠBRA.S‚CMPRRT.10CMPRIE.4‚MOVE.LA0,A5Ž.SAVEINCASELASTRECORDŠBTSTW‚#0,D0Ž.ODDBCT?ŠBEQ.S‚CMPR55NO$ŠADD.L‚#1,D0Ž.YES,SKIPFILLERBYTE$CMPR55„ADD.L‚D0,A0ŽA0->NEXTRECORDŠCMP.L‚D1,A0ŽLASTRECORD?ŠBNE.S‚CMPR50NOŠBRA.S‚CMPR65YES,A5->IT3CMPR60„MOVE.LD1,A5ŽGETLASTRECORDPOINTERINTOA5ŠSUB.L‚D5,A5Ž.+CMPR65„BSR„PUTKEYSAVEDB'SLASTKEYINFABCMPR70„BEQ„CMPR15PUTOKŠBNE„CMPRR1ERRORŠPAGE*$*ˆ************************************ŒSKPCMB1.002/18/80HBN6*!*ˆ********************************C*‚SKPCMBWILLCKECKIFFILEISSEQUENTIALORONLYASSIGNEDFORREAD**‚ONEXIT:Z=1IFSKIP*0IFINDEXEDANDWRITEASSIGN*‹D0,D1,D2-UNKNOWN SKPCMB„EQU„*3ŠMOVE.WFATASN(A4),D1†GETCURRENTACCESSPROTECTION%ŠAND.W‚#FAPBIT,D1‰MASKOFFOTHERBITS ŠBSETW‚#6,D1ŠBSR„CHKAPŽGETREAD/WRITETYPESŠBSR„FTL.NEUNEXPECTEDERROR.ŠTST.W‚D2‘WRITEACCESS?(D2.L=READ/WRITETYPE)ŠBEQ.S‚SKPRTNNO,SKIPCOMBINE,ŠMOVE.BFCBDIR+DIRATT(A2),D1CHECKFILETYPEŠAND.B‚#DFTBIT,D1‰.ŠCMP.B‚#DATSEQ,D1#SKPRTN„RTS„OTHERWISEŠTRYTOCOMBINEŠPAGE**#*‰***********************************CMBNDB1.001/17/80HBN6*#*‰**********************************B*‚CMBNDBTRIESTOCOMBINECURRENTDATABLOCKWITHNEXTONEIFBOTH*‰ARESUFFICIENTLYEMPTY**‚ONENTRY:A6=VDTADDRESS*ŒA4=FATADDRESS*ŒA2=FCBADDRESS,*‚ONRETURN:ALLREGISTERSUNCHANGEDEXCEPT:*ŒD0.L=0IFNOERROR*ŒD0.B=80+IFIOERROR*ŒZ=1IFNOERROR *0IFERROR**INDENTED LIST4* CMBNDB TRIES TO MERGE CURRENT DATA BLOCK WITH NEXT*CMBNDB PASS CURRENT DATA-BLK* POSSIBLE TO MERGE?*‚CALL$SKPCMB*ƒNO,RETURNUNCHANGEDDATA-BLK * YES,MERGE!*‚CALL$IOSREAD,$GLLSFB,$UPCFAB* DEALLOCATE MERGED DATA-BLOCK*‚CALL$DSDEAL* RETURN*INDENTED LIST END* CMBNDB„EQU„**6*ˆSKIPCALLIFCURRENTDATABLOCKTOOFULLORFMSDOES>*ˆNOTHAVEBUFFER,ORFILEISSEQUENTIALORONLYREADASSIGNED*5ŠMOVEM.LD1-D2/D5-D7/A0-A1/A3/A5,-(A7)SAVEREGISTERSFŠBSR.SSKPCMBSKIPCOMBINEATTEMPTIFSEQUENTIALFILEORREADONLYASSŠBEQ.S‚CMBNG1SKIP)ŠBTSTW‚#FAFLSB,FATFLG(A4)FMSHASBUFFER?ŠBEQ.S‚CMBNG1NO,SKIPCALL8ŠMOVE.LFATCFP(A4),A5†YES,GETCURRENTFABENTRYPOINTER)ŠMOVE.LA5,D0ŽERRORIFNOCURRENTSEGMENTŠBEQ.S‚CMBNI1.:ŠMOVE.LFATSBL(A4),A3†GET#OFBYTESINUSEFORDATABLOCKŠMOVE.LA3,D1Ž.ŠSUB.L‚FATSBS(A4),D1†.ŠADD.L‚#1,D1Ž. ŠCLR.L‚D2‘.<ŠMOVE.BFCBDIR+DIRDAT(A2),D2GET1/DATFRCOFDATABLOCKSIZEŠMOVE.LD2,D0Ž.ŠMULUƒ#SECSZE/DATFRC,D0‚.0ŠCMP.W‚D0,D1ŽDATABLOCKMORETHAN1/DATFRCFULL?ŠBHI.S‚CMBNG1YES,SKIPCALL*3*ˆCHECKNEXTDATABLOCKNOTMORETHAN1/DATFRNFULL* ŠCLR.L‚D10ŠMOVE.BFABKEY(A5),D1†GETNEXTFABENTRYPOINTERŠLEA„FABSSL(A5,D1),A1ƒ.3ŠMOVE.LFATFAE(A4),D7†GETENDOFFABBUFFERADDRESS!ŠSUB.L‚#1,D7Ž.POINTTOLASTWORD3ŠCMP.L‚D7,A1ŽCURRENTFABENTRYTHELASTONEOFFAB?ŠBCC.S‚CMBNG1.YES,SKIPCALLDŠTST.L‚(A1).BECAUSECOMBININGBETWEENTWOFABSISTOOMUCHTOCODEŠBEQ.S‚CMBNG1YESEŠMOVE.BFABSGS(A1),D1NO,GET#OFSECTORSINUSEFORNEXTDATABLOCK"CMBNI1„BNE.S‚CMBNIE.1‹BRANCHIFOKŠBSR„ISTAIERR‹ERRORŠBRA.S‚CMBNRT.1=CMBNIE.1‚MULUƒ#SECSZE,D1‰#OFBYTESINUSEINNEXTDATABLOCK-ŠMOVE.LD2,D0ŽGET1/DATFRNOFDATABLOCKSIZEŠMULUƒ#SECSZE/DATFRN,D0‚.5ŠCMP.W‚D0,D1ŽNEXTDATABLOCKMORETHAN1/DATFRNFULL?ŠBLS.S‚CMBN05NO CMBNG1„BRA„CMBNGRYES,SKIPCALLŠPAGE*'*ˆCOMBINECURRENTDATABLOCKWITHNEXT:=*ˆREADINNEXTDATABLOCKSSECTORSAFTERLASTBYTEOFCURRENT *ˆDATABLOCK<*ˆA3=FATSBL,A5=FATCFP,A1=NEXTFABENTRYPOINTER,D2=DIRDAT *ˆD7=FATFAE-1*8CMBN05„MOVE.L(A1),D6ŒGETNEXTDATABLOCK'SPSN(FABPSN)ŠMOVE.LA3,D0Ž.ŠADD.L‚#1,D0Ž.ŠADD.L‚A3,D1ŽGETENDADDRESSŠMOVE.LD6,VDTIOS+IOSRRN(A6)ŠMOVE.LD0,VDTIOS+IOSSAD(A6)ŠMOVE.LD1,VDTIOS+IOSEAD(A6)6ŠMOVE.LD1,A0ŽCLEARLONGWORDATENDOFNEWBUFFEREND  ŠCLR.L‚1(A0)ŠBSR„IOSREADŒREADŠBNE„CMBNRTIOERROR**ˆGETNEWLOGICALBUFFEREND*&ŠMOVE.WFCBDIR+DIRLRL(A2),D0VRLFILE?ŠBEQ.S‚CMBN11YESŠCLR.L‚D1‘NO,FRL;ŠMOVE.WFABREC(A1),D1†GETBUFFERENDFROM#OFRECORDSREADŠMULUƒD1,D0Ž.BCTOFRECORDS-ŠADD.L‚D0,A3ŽNEWBUFFERADDRESSFORFRLFILES ŠBRA.S‚CMBN25;CMBN10„MOVE.W(A3)+,D0‹SKIPRECORDSTILLGETTOENDOFFILE)ŠBEQ.S‚CMBN20.ENDOFRECORDSIFBCT=0ŠADD.L‚D0,A3Ž.SKIPRECORDŠBTSTW‚#0,D0ŽODDBCTRECORD?ŠBEQ.S‚CMBN15NO(CMBN11„ADD.L‚#1,A3ŽYES,SKIPFILLERBYTE7CMBN15„CMP.L‚FATSBE(A4),A3†GETTINGBEYONDBUFFERLIMIT?.ŠBLS.S‚CMBN10NO,GOCHECKNEXTRECORDORDONE ŠBSR„ISTAIERRCMBNRT.1‚BRA.S‚CMBNRT.2/CMBN20„SUB.L‚#3,A3ŽNEWBUFFERENDFORVRLFILES7CMBN25„MOVE.LA3,FATSBL(A4)†SAVENEWLOGICALBUFFEREND*0*ˆADJUSTFABANDFATFORNEWDATABLOCKCONTENTS* ŠCLR.L‚D09ŠMOVE.BFABSGS(A1),D0†REMOVESECTORSFORADDEDDATABLOCKŠSUB.L‚D0,FATLLS(A4)ŠSUB.L‚D0,FCBDIR+DIREOF(A2)CŠMOVE.WFABREC(A1),D0ƒREMOVERECORDSASSOCIATEDWITHTHEDATABLOCK;ŠSUB.L‚D0,FATLLR(A4)†.THEYWILLBEACCOUNTEDFORBYUPCFABŠSUB.L‚D0,FCBDIR+DIREOR(A2)*7*ˆSETCURRENTFABENTRYKEYFROMNEXTENTRY'SKEYFIELD* ŠCLR.L‚D0ŠMOVEM.LA1/A5,-(A7)#ŠADD.L‚#FABKEY,A1‰MOVEFROMADDRESS!ŠADD.L‚#FABKEY,A5‰MOVETOADDRESS8ŠMOVE.B(A1)+,D0‹FULLKEYSINFABFORNOWSOSAMELENGTH!ŠBEQ.S‚CMBN31.SKIPIFNULLKEYS*ŠCMP.B‚(A5)+,D0‹.ERRORIFNOTSAMELENGTHŠBEQ.S‚CMBN30BRANCHIFOK:ŠBSR„ISTAIERR‰LATERIFHANDLEPARITALFABKEYSCHANGETHISCMBNRT.2‚BRA.S‚CMBNRT&CMBN30„MOVE.B(A1)+,(A5)+ˆMOVETHEKEYŠDCNTƒD0,CMBN30GCMBN31„MOVEM.L(A7)+,A1/A5…RESTOREFATCFP,NEXTFABENTRYPOINTERINA5ŠPAGE*1*ˆDELETETHEFABENTRYFORDATABLOCKJUSTMERGED'*ˆA1->FABENTRYTOBEDELETED,D0=0*>ŠMOVE.BFABKEY(A1),D0†ISTHEENTRYTOBEDELETEDTHELASTONE?.ŠLEA„FABSSL(A1,D0),A3ƒ.A3->ENTRYAFTERNEXTŠCMP.L‚D7,A3Ž.ŠBCC.S‚CMBN40. ŠTST.L‚(A3).1ŠBEQ.S‚CMBN40.YES,NEEDNOTMOVERESTOFFABUPFCMBN35„MOVE.W(A3)+,(A1)+†NO,MOVERESTOFFABUPTODELETENEXTENTRYŠCMP.L‚D7,A3Ž. ŠBLS„CMBN35.CMBN40„MOVE.LA1,A30CMBN45„CLR.W‚(A3)+ŽCLEARUNUSEDFABSPACEATEND ŠCMP.L‚D7,A3 ŠBLS„CMBN45.!ŠCLR.L‚D5‘GETNEWFATKEYINTOFATŠMOVE.LA5,A0Ž.ŠBSR.S‚GLLSFB.*;*ˆDEALLOCATETHEDATABLOCKTHATWASAPPENDEDTOCURRENTDB*-ŠMOVE.LD6,A1ŽPSNOF1STSECTORTODEALLOCATE$ŠMOVE.LD2,D1Ž#OFSECTORSTODELETEŠBSR„DSDEALDEALLOCATEŠBNE.S‚CMBNRTERROR?*0*ˆADJUSTFAT/FAB/FCBFORNEWDATABLOCKCONTENTS*ŠBSETW‚#FAFLUB,FATFLG(A4)'ŠBSR„DBFCHGINDICATEFABANDDBCHANGED;ŠMOVE.L#1,D0‹LEAVEFABENTRY'SKEYALONESINCEALREADYSETŠBSR„UPCFABUPDATEŠBNE.S‚CMBNRTERRORCMBNGR„CLR.L‚D0‘OK>CMBNRT„MOVEM.L(A7)+,D1-D2/D5-D7/A0-A1/A3/A5RESTOREREGISTERSŠRTS*ŠPAGEŠENDCƒFMSLEVEL-3ŠIFGTƒFMSLEVEL-1**$*ˆ************************************ŒGLLSFB1.0012/13/79HBN6*$*ˆ************************************* GLLSFB GETS LAST LSN+1 AND LRN+1 FOR FAB&*ˆ(OR#OFSECTORSANDRECORDSINFAB)*&* ON ENTRY: D0 = 1ST LSN OF FAB (OR 0)*‹D1=1STLRNOFFAB(OR0)*‹D5=ONEBYTEVALUE%*‹A0->1STSEGMENTDESCRIPTORINFABA* ON RETURN: D0 = LAST LSN+1 OF FAB (OR # OF SECTORS IF D0 WAS 0)6*‹D1=LASTLRN+1OFFAB(OR#OFRECORDSIFD1WAS0)*‹A0,D5=UNCHANGED*‹A1->ENDOFFABENTRIES+1!*‹A5->LASTKEYBCTFIELDOFFAB+*‹IFEMPTYFABD0,D1,A1,ANDA5MEANINGLESS*)GLLSFB„MOVEM.LD5-D6,-(A7)‡SAVEREGISTERS ŠCLR.L‚D6 ŠMOVE.LA0,A1ŠTST.L‚(A0)EMPTYFAB?ŠBEQ.S‚GLLSFRYES:GLLSF0„MOVE.BFABSGS(A1),D5†#OFSECTORSINUSEINSEGMENTŠADD.L‚D5,D0ŽADDTHEMTOLSN-ŠMOVE.WFABREC(A1),D6†#OFRECORDSINSEGMENTŠADD.L‚D6,D1ŽADDTHEMTOLRN$ŠLEA„FABKEY(A1),A5†A5->KEYBCTFIELD ŠMOVE.B(A5),D5ŒGETFIELDLENGTH1ŠLEA„FABSSL+2(A1,D5),A1POINTERTONEXTFABENTRY ŠCMP.L‚FATFAE(A4),A1†ENDOFFAB?%ŠSUB.L‚#2,A1ŽCOND.CODENOTDESTROYEDŠBCC.S‚GLLSF5YES#ŠTST.L‚(A1)NO,ENDOFFABENTRIES?"ŠBNE.S‚GLLSF0NO ,COUNTNEXTENTRYGLLSF5„MOVE.LA5,FATKEY(A4)†.,GLLSFR„MOVEM.L(A7)+,D5-D6‡RESTOREREGISTERSŠRTS*$*ˆ************************************ŒLASTSG1.0012/13/79HBN6*$*ˆ***********************************A*‚LASTSGFINDSOUTIFCURRENTSEGMENTISTHELASTONEOFTHEFILE* *‚ONCALL:(*ˆD1=CURRENTSEGMENTFABENTRYPOINTER *‚ONRETURN: *ˆA0=CURRENTFABENTRYPOINTER*ˆD1=CURRENTSEGMENTLASTLSN-*ˆZ=1IFSEGMENTISTHELASTONE(D1=EOF) *Œ0IFNOT* LASTSG„EQU„*.ŠMOVE.LD1,A0ŽGETCURRENTSEGMENT'SENDINGLSNŠMOVE.LFATSLS(A4),D1†. ŠCLR.L‚D0‘.7ŠMOVE.BFABSGS(A0),D0†.#OFSECTORSINCURRENTSEGMENTŠADD.L‚D0,D1Ž.%ŠSUB.L‚#1,D1ŽD1=LASTLSNOFSEGMENT5ŠCMP.L‚FCBDIR+DIREOF(A2),D1ISTHISTHELASTSEGMENT?ŠRTSŠPAGEŠENDCŠIFEQƒFMSLEVEL-3**$*ˆ************************************‹CMBNFB1.001/17/80HBN6*$*ˆ***********************************?*‚CMBNFBTRIESTOCOMBINECURRENTFABWITHNEXTONEIFBOTHARE.*‰SUFFICIENTLYEMPTY(ANDANEXTFABEXISTS)*#*‚ENTRYANDEXITSAMEASFORCMBNDB**INDENTED LIST-* CMBNFB TRIES TO MERGE CURRENT FAB WITH NEXT*CMBNFB PASS CURRENT FAB* POSSIBLE TO MERGE?*‚CALL$SKPCMB,$GPTSEC*ƒNO,RETURNUNCHANGEDFAB * YES, MERGE!*‚CALL$IOSREAD,$GLLSFB,$NXTFHD* DEALLOCATE MERGED FAB*‚CALL$DSDEAL* RETURN*INDENTED LIST END* CMBNFB„EQU„**/ŠMOVEM.LD1-D7/A0-A1/A3/A5,-(A7)SAVEREGISTERS*<*ˆSKIPCALLIFSEQUENTIALFILEORASSIGNEDFORREADONLY,OR#*ˆALREADYKNOWNEXTFABISTOOFULL*EŠBSR‚SKPCMBSKIPCALLIFSEQUENTIALFILEORREADONLYTYPEASSIGNMENTŠBEQ.S‚CMBFG1SKIP/ŠBTSTW‚#FAFLMB,FATFLG(A4)ISNEXTFABTOOFULL?ŠBNE.S‚CMBFG1YES-RETURN*$*ˆISCURRENTFABSUFFICIENTLYEMPTY?*0ŠMOVE.LFATKEY(A4),A1†GETLASTFABENTRYPOINTER2ŠMOVE.LA1,D0Ž.ERRORIFNOLASTKEYFIELDPOINTERŠBNE.S‚CMBF00.ŠBSR„ISTAIERR‹ERRORCMBFR1„BRA„CMBFRT CMBF00„EQU„*(ŠCLR.L‚D0‘GETENDOFFABENTRIESPOINTERŠMOVE.B(A1)+,D0‹LENGTHOFKEYŠADD.L‚D0,A1Ž.'ŠMOVE.LA1,D7Ž.SAVEENDOFFABPOINTER(ŠMOVE.LFATFAA(A4),A3†.FABBUFFERSTART#ŠSUB.L‚A3,A1ŽA1=BCTOFFABINUSE1ŠMOVE.BFCBDIR+DIRFAB(A2),D0GETFABSECTORCOUNTŠMOVE.LD0,D6Ž.SAVE,ŠMULUƒ#SECSZE/FABFRC,D0‚GET1/FABFRCFABBCTŠMOVE.LD0,D5Ž.SAVE,ŠCMP.L‚D0,A1ŽISFABMORETHAN1/FABFRCFULL?ŠBHI.S‚CMBFG1YES,SKIPCALL*6*ˆYES,READINNEXTFAB'S1STSECTORTOCHECKITSSIZE6*ˆD7->ENDOFFABENTRIESINCURRENTFAB,A3=FATFAA)*ˆD6=FABSIZE,D5=BCTOFFABFRACTION*.ŠMOVE.L(A3),D0ŒGETNEXTFAB'SPSNFROMFABPSNŠMOVE.LD0,D4ŽSAVE&ŠBEQ.S‚CMBFG1SKIPCALLIFNONEXTFABŠMOVE.L#IOREAD,D1‰READ3ŠBSR„GPTSECA1RETURNSPOINTINGTOSECTORJUSTREADŠBNE.S‚CMBFR1IOERROR,ŠMOVE.L#ISTAFAB+NL,D0…EMPTYFABMEANSERROR.ŠMOVE.LA1,D2ŽSaveaddressoftemporarybuffer ŠCLR.L‚D3‘./ŠMOVE.BFABUSE(A1),D3†.GETFABUSEFORNEXTFABŠBEQ„CMBFRTERROR6ŠCMP.B‚#FABFRN,D3‰NEXTFABLESSTHANFABFRN/16THFULL?ŠBLS.S‚CMBF05YES>ŠBSETW‚#FAFLMB,FATFLG(A4)SETNEXTFABTOOFULLFORMERGEFLAG7CMBFG1„BRA„CMBFGRTOOMUCHSTUFF,DON'TBOTHERTOMERGE*8*ˆMOVEFABENTRIESFROM1STSECTORTOENDOFCURRENTFAB;*ˆD4=NEXTFABPSN,D3=NEXTFABUSAGECOUNT,D2=VIBSTR*CMBF05„BSR„FABCHG ŠCLR.L‚D0ŠMOVE.LD7,A0ŽMOVETOADDRESS$ŠMOVE.BFABPKY(A1),D0†GETFABPKYBCT.ŠLEA„FABSEG(A1,D0),A1ƒTOGETMOVEFROMADDRESS* vvvvvvvvv Changed 9/3/83 SCB.1* Merge first sector of next FAB with current one<ŠMOVE.LFATFAA(A4),D1†NextFABmemoryblockstartingaddress7ŠADD.L‚#SECSZE,D1‰Endingaddressof1stsectornextFAB+CMBF10„MOVE.B(A1)+,(A0)+ˆMovestufftoFAB ŠCMP.L‚D1,A0ŽArewedonemoving?ŠBNE.S‚CMBF10Branchifno%* See if FAB was longer than 1 sector ŠSUB.L‚#1,D67ŠBEQ.S‚CMBF30Branchifonesectorlong-mergeisdoneH* We need to read in extra sectors from next FAB to merge with this one.F*ƒA0pointstothememoryaddressweneedtoreadinto.‚ConstructtheG*ƒlargestpossibleblockreadofthenextFAB(startingwith2ndsectorD*ƒsince1stsectorall readymerged)intothisonewithoutexceeding+*ƒbufferboundariesforthisFABofcourse!*6ŠMOVE.LA0,VDTIOS+IOSSAD(A6)Startingaddressforread<ŠMOVE.LFATFAE(A4),VDTIOS+IOSEAD(A6)Endingaddressforread?ŠMOVE.BVDTIOS+IOSSAD+3(A6),D0Forceintegralblockreadby....ŠSUB.L‚#1,D0Ž...adjustingendingreadaddressŠMOVE.BD0,VDTIOS+IOSEAD+3(A6)*^^^^^^^^^^ Changed 9/3/83 SCB.-ŠADD.L‚#1,VDTIOS+IOSRRN(A6)READNEXTSECTORSŠBSR.S‚IOSREADŒREADWITHWAITŠBNE.S‚CMBFRTIOERROR*9*ˆGET#OFRECORDSANDSECTORSADDEDFROMNEXTFABTOFAT*CMBF30„CLR.L‚D0 ŠCLR.L‚D1 ŠCLR.L‚D5'ŠMOVE.LD7,A0ŽA0->1STFABENTRYADDED8ŠBSR„GLLSFB‹GET#OFRECORDSANDSECTORS,SETNEWFATKEY*ŠADD.L‚D0,FATLLS(A4)†UPDATEFAB'SLASTLSNŠADD.L‚D1,FATLLR(A4)†ANDLRN*2*ˆDELETEANDDEALLOCATENEXTFAB(FABJUSTMERGED)*%ŠMOVE.LFATFAB(A4),D3†CURRENTFABPSNFŠMOVE.LD2,A5A5->NEXTFAB'SFIRSTSECTORAGAIN(DESTROYEDBYGLLSFB:ŠMOVE.L(A5),D5ŒGETFABFLKFORFABAFTERNEXT(3RDINROW)<ŠMOVE.LD5,(A3)ŠSETFORWARDLINKINCURRENTFABTOSKIPNEXT5ŠBNE.S‚CMBF35CURRENTFABLASTINCHAINAFTERDELETE?0ŠMOVE.LD3,FCBDIR+DIRFE(A2)SETLASTFABPOINTER&ŠBSETW‚#FCFLDB,FCBFLG(A2)INDIRECTORY&CMBF35„ADD.L‚#1,D6ŽD6=FABSIZEAGAIN(ŠMOVE.LD6,D1Ž#OFSECTORSTODEALLOCATEŠMOVE.LD4,A1ŽSTARTINGPSNŠBSR„DSDEALDEALLOCATEŠBNE.S‚CMBFRTERROR* *ˆUPDATEHEADERFORNEWNEXTFAB*:ŠMOVE.L#2,D0ŒUPDATEBACKWARDLINKANDKEYINNEWNEXTFABŠMOVE.LD3,D4ŽBACKWARDLINK(ŠMOVE.LD5,D3ŽNEXTFABPSN(THENEWONE)ŠBSR„NXTFHDUPDATEITSHEADERŠBNE.S‚CMBFRTERRORCMBFGR„CLR.L‚D0‘GOODRETURN8CMBFRT„MOVEM.L(A7)+,D1-D7/A0-A1/A3/A5RESTOREREGISTERSŠRTSŠPAGEŠENDC**$*ˆ************************************ŒIOSREAD1.001/30/80HBN6*$*ˆ***********************************9*‚IOSREADREADSFROMDISKWITHWAIT,IMAGE,RANDOMSECTOR3*ŠONCALLPARAMETERBLOCK(VDTIOS)ISSETUPEXCEPT*ŠFORFUNCTIONANDOPTIONCODES**‚ONCALL:A6=VDTADDRESS*0*‚ONRETURN:ALLREGISTERSAREUNCHANGEDEXCEPT:*‹A0->VDTIOS*‹D0=0IFNOERROR*‹D0.B=80+OTHERWISE*‹Z=1IFNOERROR *0IFERROR*IOSREADƒMOVE.L#IOREAD,D0ŠBRA.S‚IOSRDWR**$*ˆ************************************ŒIOSWRITE1.001/30/80HBN6*$*ˆ***********************************.*‚IOSWRITEISSAMEASIOSREADEXCEPTFORWRITE*IOSWRITE‚MOVE.L#IOWRIT,D0**IOSRDWRƒSETRFOD0,IOPIMG+IOPRAN,VDTIOS(A6) ŠBSR„DOIOŠRTSŠPAGEŠIFGTƒFMSLEVEL-1* *ALDBF 1.00 7/10/80 L. STEINHOFF*AL2DBF*;*ALDBF ALLOCATES DISK SPACE FOR FAB AND DATA BLOCK AND PUTS*…THEIRPSN'SINTABLEONSTACK(*AL2DBF ALLOCATES 2 DATA BLOCKS AND FABB* *ON CALL:*…D0=POINTERTOAREAONSTACK*…A2=FCBADDR.*…A6=VDTADDR.*…BSRALDBFORAL2DBF* *ON RETURN:*…Z=1IFNOERROR *†=0IFERROR*…D0.B=0IFNOERROR*‰=80+IFI/OERROR* AL2DBF„EQU„*ŠMOVEM.LA0-A1/D1,-(A7) ŠMOVE.LD0,A0 ŠBSR.S‚ALLODB$ŠBNE.S‚AL2DRTERRORONDBALLOCATION"ŠMOVE.LA1,8(A0)‹SAVEDBPSNADDR.AL2D10„BSR.S‚ALLODB ŠBNE.S‚AL2DRTŠMOVE.LA1,4(A0) ŠBSR.S‚ALLOFB ŠBNE.S‚AL2DRTŠMOVE.LA1,(A0)AL2DRT„MOVEM.L(A7)+,A0-A1/D1 ŠTST.B‚D0ŠRTS**ALLOCATE 1 DB AND 1 FAB* ALDBF…EQU„*ŠMOVEM.LA0-A1/D1,-(A7) ŠMOVE.LD0,A0 ŠBRA.S‚AL2D10ŠPAGE*!*ALLODB 1.00 7/10/80 L. STEINHOFF*ALLOFB*#*ALLODB CALLS DSALLC TO ALLOCATE DB*ALLOFB DOES SAME FOR FAB* *ON CALL:*…A2=FCBADDR.*…BSRALLODBORALLOFB* *ON RETURN:!*…SEEDSALLCFORRETURNREGISTERS* ALLODB„EQU„* ŠCLR.L‚D1(ŠMOVE.BFCBDIR+DIRDAT(A2),D1GETDBSIZE ALLOD10ƒEQU„* ŠBSR„DSALLCŠRTS ALLOFB„EQU„* ŠCLR.L‚D1)ŠMOVE.BFCBDIR+DIRFAB(A2),D1GETFABSIZEŠBRA.S‚ALLOD10ŠPAGE*!*DEALDB 1.00 7/10/80 L. STEINHOFF*DEALFB**DEALDB DEALLOCATES DB*DEALFB DOES SAME FOR FAB* *ON CALL:*…A1=PSNOFDATABLOCKFAB*…A2=FCBADDR.*…BSRDEALDBORDEALFB* *ON RETURN:!*…REGISTERSASRETURNEDBYDSDEAL* DEALDB„EQU„* ŠCLR.L‚D1,ŠMOVE.BFCBDIR+DIRDA T(A2),D1DATABLOCKSIZEDEALD10ƒBSR„DSDEALŠRTS DEALFB„EQU„* ŠCLR.L‚D1+ŠMOVE.BFCBDIR+DIRFAB(A2),D1FABBLOCKSIZEŠBRA.S‚DEALD10ŠPAGE* *DBCHG 1.00 6/16/80 L. STEINHOFF*FABCHG*DBFCHG*+*DBCHG SETS THE DATA BLOCK CHANGED FLAG AND&*…IFOTHERASSIGNMENTSEXISTFORFILE,+*…THEIRDATABLOCKSARECHECKED.‚IFSAMEDB,*…ISINMEMORY,ITISMARKEDASNON=EXISTENT-*…SONEWDBWILLBERETRIEVEEONNEXTREQUEST*FABCHG DOES SAME FOR FAB,*…EXCEPTCHANGEDFABISMOVEDTOOTHERUSERS-*DBFCHG DOES SAME FOR BOTH DATA BLOCK AND FAB* *ON CALL:*…A4=FATADDR.*…BSRDBCHGORFABCHGORDBFCHG* *ON RETURN:*…ALREGISTERSAREUNALTERED* DBCHG…EQU„*ŠMOVEM.LD0-D3/A0-A2,-(A7)ŠMOVE.L#FAFLDBV,D0ˆDBCHANGED ŠBRA.S‚DBFC10 FABCHG„EQU„*ŠMOVEM.LD0-D3/A0-A2,-(A7)ŠMOVE.L#FAFLFBV,D0ˆFABCHANGED ŠBRA.S‚DBFC10 DBFCHG„EQU„*ŠMOVEM.LD0-D3/A0-A2,-(A7).ŠMOVE.L#FAFLDBV+FAFLFBV,D0DBANDFABCHANGED-DBFC10„OR.WƒD0,FATFLG(A4)†SETCHANGEDFLAG(S)1*SEE IF MORE THAN ONE ASSIGNMENT EXISTS FOR FILE.(*…WCNT/RCNTINRANGE-1TO1IFONEUSER ŠBSR„CHKMAŠBEQ.S‚DBFC30ONLYONEASSIGN+*MORETHAN1ASSIGNMENTEXISTS.‚SEEIFDATA**…BLOCK/FABISINMEMORYFORANOTHERASSN.#ŠMOVE.LFATFAB(A4),D1†D1=PSNOFFAB,ŠMOVE.LFATCFP(A4),D2†POINTSTOD.B.POINTER%ŠSUB.L‚FATFAA(A4),D2†D2=OFFSETTOCFP$ŠMOVE.LFATSTR,A1ŠGETSTARTOFFAT'S*MUST BE SAME FCBDBFC20„MOVE.LFATFCB(A1),D3ŠCMP.L‚FATFCB(A4),D3 ŠBNE.S‚DBFC25"ŠCMP.L‚FATFAB(A1),D1†FORTHISFAB?ŠBNE.S‚DBFC25NO-SKIP ŠCMP.L‚A1,A4 ŠBEQ.S‚DBFC25SKIPCURRENTENTRY$ŠBTSTƒ#FAFLDB,D0‰DATABLOCKCHANGED?ŠBEQ.S‚DBFC22NOŠMOVE.LFATCFP(A1),D3ŠSUB.L‚FATFAA(A1),D3ŠCMP.L‚D2,D3ŽOOFSETSTHESAME?ŠBNE.S‚DBFC22NO%ŠCLR.L‚FATCFP(A1)‰INDICATENOCFPAND(ŠBCLRW‚#FAFLDB,FATFLG(A1)DBNOTCHANGED#DBFC22„BTSTƒ#FAFLFB,D0‰FABCHANGED?ŠBEQ.S‚DBFC25NO#*MOVE THIS FAB TO OTHER USER'S AREA%ŠBSR.S‚GETOSGATTACHOTOTHERSEGMENTŠMOVE.LFATFAA(A4),A0ŠMOVE.LFATFAA(A1),A2DBFC23„MOVE.L(A0)+,(A2)+ŠCMP.L‚FATFAE(A4),A0†ATEND?ŠBLS.S‚DBFC23NO4ŠMOVE.LFATKEY(A4),FATKEY(A1)UPDATEFABINFOINFATŠMOVE.LFATLLS(A4),FATLLS(A1)ŠMOVE.LFATLLR(A4),FATLLR(A1)*ŠBSR.S‚GETCSGYES-ATTACHTOCOMMONSEGMENT)ŠBCLRW‚#FAFLFB,FATFLG(A1)FABNOTCHANGEDDBFC25„LEA„FATLEN(A1),A1ŠCMP.L‚FATEND,A1!ŠBLS.S‚DBFC20GOCHEKCNEXTENTRY DBFC30„MOVEM.L(A7)+,D0-D3/A0-A2ŠRTSŠPAGE* *GETOSG 1.00 7/3/80 L. STEINHOFF*-*GETOSG DEATTACHES FROM SHARED COMMON SEGMENT+*…ANDATTACHESTOOTHERUSER'SDATASEGMENT* *ON CALL:*…A1=OTHERFATADDR.*…A4=FATADDR. *…BSRGETOSG*$* DOES TO FMSFTL IF ERROR FROM DESEG* GETOSG„EQU„*ŠMOVEM.LD0/A0,-(A7)ŠERQ.DESEGSEGBLKSGETOS10ƒBSR„FTL.NE ŠEXG„A4,A1 ŠBSR„ATTIOBO ŠEXG„A4,A1ŠMOVEM.L(A7)+,D0/A0ŠRTSŠPAGE* *GETCSG 1.00 7.3.80 L. STEINHOFF*)*GETCSG DEATTACHES FROM OTHER SEGMENT AND&*…RE-ATTACHESTOSHAREDCOMMONSEGMENT* *ON CALL: *…BSRGETCSG*+*GOES TO FMSFTL IF ERROR ON EXEC DIRECTIVES* GETCSG„EQU„*ŠMOVEM.LA0/D0,-(A7)ŠERQ.DESEGSEGBLKOŠBNE.S‚GETOS10ŒFATALŠERQ.ATTSEGSEGBLKSŠBNE.S‚GETOS10ŒFATALŠMOVEM.L(A7)+,D0/A0ŠRTSŠENDCƒFMSLEVEL-1%*************************************-* ISTAIERR SAVES ADDRESS OF ISTAIE ERROR (C7)(*ƒINFDTAATC7ERRFORUSEINDEBUGGING.**ENTRY:ƒBSR‚ISTAIERR**EXIT:„D0=#NL+ISTAIE/*ŠC7ADDR=ADDRESSOFINSTRUCTIONFOLLOWINGBSR*ISTAIERR‚EQU„*ŠMOVE.L(A7),C7ADDRŠMOVE.L#NL+ISTAIE,D0ŠRTS%*************************************-* ISTAUFRR SAVES ADDRESS OF ISTAUF ERROR (CE))*ƒINFDTAATCEADDRFORUSEINDEBUFFING.**ENTRY:‚BSR„ISTAUFRR**EXIT:ƒD0=#NL+ISTAUF/*‰CEADDR=ADDRESSIFINSTRUCTIONFOLLOWINGBSR*ISTAUFRR‚EQU„*ŠMOVE.L(A7),CEADDRŠMOVE.L#NL+ISTAUF,D0ŠRTSŠENDé éé=/* =/*†FIOS.AF=/*"=/* Chain file to assemble FIOS.SA=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to FIOS.LS=/*=/IFC \1 ƒ=ARGFIOS.LS=/ENDIF=/*&=ASM FMSI.SA/FIOS.SA,FIOS.RO,\1;RZ=186=/*{ Included files are:=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.FMI.EQ=/*}=/*=ENDééééééÊŠPAGEŠNOLISTŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.EXE.EQŠINCLUDE9995.&.NIO.EQŠINCLUDE9995.&.TR1.EQŠINCLUDE9995.&.FME.EQŠINCLUDE9995.&.FMI.EQŠLIST*‰INCLUDE9995.&.IOE.EQ*‰INCLUDE9995.&.TR1RTCD.EQ*‰INCLUDE9995.&.EXE.EQ*‰INCLUDE9995.&.NIO.EQ*‰INCLUDE9995.&.TR1.EQ*‰INCLUDE9995.&.FME.EQ*‰INCLUDE9995.&.FMI.EQ*ŠPAGE*E* 3/15/84 At label FMRW22B changed BCS IOSER6, BCS IOSER8 to indicate@*„invalidrandomrecordinsteadofendofvolumewhenthevolume)*„readbeginspasttheendofthevolume.*!*HANDLE IOS REQUEST FOR DISK FILE**„A1=ADDR.OFASQ1ENTRY ŠSECTION0 ŠDC.Bƒ'FIOS'ŠDC.Lƒ'0315844'‰IDENTIFICATIONIOS‡IDNTƒ4,2IOSHANDLER ŠXDEFƒFMRW15 ŠXDEFƒFMSIOS ŠXDEFƒIREWIND ŠXREFƒACKREQ ŠXREFƒCALREC ŠXREFƒCHKASN ŠXREFƒCHKWPD ŠXREFƒCLRIOP ŠXREFƒDEVBSY ŠXREFƒDOIO ŠXREFƒFMSBLK1 ŠXREFƒFMSF35 ŠXREFƒFMSREV ŠXREFƒFMSRTN ŠXREFƒFTL.EQ ŠXREFƒFTL.HI ŠXREFƒFTL.NE ŠXREFƒFTL.T ŠXREFƒGETVID ŠXREFƒICMDJPŠXREFƒISTAIERR ŠXREFƒMOVE2U ŠXREFƒPUTALL ŠXREFƒSETBEG ŠXREFƒSETPTR ŠXREFƒSMOVE4 ŠXREFƒSMOVEA ŠXREFƒZERPTRŠIFGTƒFMSLEVEL-1 XREFƒATTIOB XREFƒCMPSPC XREFƒDBCHG XREFƒFSALLC XREFƒFSDEAL XREFƒGETFDB XREFƒGETIOB XREFƒMVEDTA XREFƒMVEREC  XREFƒPUTDAT XREFƒUPCFAB XREFƒUPDEOF XREFƒUPDEORŠENDC*ŠIFGTƒFMSLEVEL-2 XREFƒCMPKEY XREFƒCMPRDB XREFƒEXPNDB XREFƒFNDKEY XREFƒMVEKEY XREFƒPUTKEYŠENDCF************************************************************************INDENTED LIST** FMSIOS HANDLES I/O FOR FILES AND VOLUMES*FMSIOS * WAIT ONLY?*‚YES,BLOCKTASK-UNTILI/ODONE* PROCEED I/O?*‚YES,ACKNOW.REQUEST$ACKREQ * ERROR-IF DEVICE STATUS CHANGED*‚CHECK-FORDEVICEBUSY$DEVBSY*ƒREAD-ORPOSITIONREQUEST?"*„NO,ERRORIF-DISKWRITEPROTECTED* FORMAT REQUEST?"*‚YES,FORMATVOLUME-ORTRACK$DOIO&*ƒINDICATENO-TABLESIN-MEMORY$ZERPTR*„READVOLUME-ID$GETVID*…MAKEGOODRETURN$FMSRTN* WRITE, DELETE, UPDATE? ÓfÜDä=ìIôEüAG <FB$J,>4B<HDCL>TB\IdKlKtE|H„RŒ(*‚YES,MAKESURE-FILENOT-WRITEPROTECTED* CALCULATE USER RECORD LENGTH* VOLUME OR-CONT. FILE?*‚YES,GO-TOBLOCK-I/O$FBLK*‚NO,ERRORIFSEC.MAP*ƒDATASEGMENTEXIST?*„NO,ALLOCATESEGMENT$GETIOB*„YES,ATTACHTO-SEG.$ATTIOB* READ OR POSITION?*‚NO,OVERWRITEREQUEST?*ƒYES,CLEAROVERWRITEFLAG*„ALREADYDONEOVERWRITE?*…NO,DEAL.FILESPACE$FSDEAL * RECORD I/O?*‚NO,GOTO-BLOCKI/O$FBLK*‚YES,GOTO-RECORDI/O$FREC*INDENTED LIST END* FMSIOS„EQU„*(ŠLEA„FMSBLK1,A5‰GETADDR.OFPARM.BLOCK*GET ADDR. OF FAT, FCB, AND VDT ŠBSR„SETPTR*A6=VDT, A4=FAT, A2=FCB ADDR.ŠMOVE.LA6,A3ŽSAVEVDTADDR.%ŠSUB.L‚A6,A6Ž0A6UNTILDEVBSYCALLED**IF WAIT ONLY REQUEST, MAKE SURE I/O STILL1*…PENDINGANDTHENBLOCKTASKUNTILI/OCOMPLETESŠCMP.W‚#IOWAIT,IOSFCT(A5) ŠBNE.S‚FMRW01*CLEAR PROCEED I/O BIT!ŠBCLRW‚#IOPWATB,FATIOS+IOSOPT(A4)ŠMOVE.LEVTLUE(A1),A0&ŠBTSTW‚#LUSFIO,LUTCAP(A0)I/OPENDING?ŠBEQ„IOSGRTNOŠBRA„FMSREVRETURNFROMEVENT FMRW01„EQU„*9ŠMOVE.LEVTRA0(A1),FATUPB(A4)SAVEUSERPARM.BLOCKADDR.ŠMOVE.W#IOSBLN/2,D0*MOVE USER PARM. BLOCK TO FATŠLEA„FATIOS(A4),A0FMRW02„MOVE.W(A5)+,(A0)+ŠDCNTƒD0,FMRW02*****************C*FROM HERE ON OUT IN IOS, NOTHING IS NEEDED FROM FMSASQ1 OR FMSBLK1*$*IF PROCEED I/O REQUEST, ACKNOWLEDGE*…REQUESTTOUSERNOWSOON#*…COMPLETIONORIFERRORLATER,I/O!*…COMPLETIONEVENTWILLBEQUEUED.ŠBTSTW‚#IOPWATB,FATIOS+IOSOPT(A4)PROCEEDI/O?ŠBEQ.S‚FMRW04NO$ŠCLR.L‚D1‘VALUETOBERETURNEDIND0ŠMOVE.LFATTSK(A4),D2ŠMOVE.LFATSES(A4),D3ŠMOVE.L#IOSTIN,D4ŠBSR„ACKREQACKNOWLEDGEREQUEST FMRW04„EQU„**ERROR IF DEVICE STATUS CHANGEDŠBTSTW‚#FCFLCB,FCBFLG(A2)(ŠBNE„IOSER13ŒDEVICESTATUSCHANGEDERRORŠMOVE.LA3,A6ŽRESTOREVDTADDR./ŠBSR„DEVBSYDON'TGOANYFURTHERIFDEVICEBUSY&*ONLY A2,A4, AND A6 ARE MEANINGFUL NOW/ŠTST.B‚FATIOS+IOSFCT(A4)‚DATATRANSFERREQUEST?ŠBEQ.S‚FMRW05YES/*NO-MUST BE COMMAND-JUMP TO APPROPRIATE ROUTINEŠMOVE.L#ICMDJP,A0ŠMOVE.WFATIOS+IOSFCT(A4),D0 ŠBRA„FMSF35 FMRW05„EQU„*:*UNLESS READ REQUEST, MAKE SURE DISK IS NOT WRITE PROECTED ŠCMP.W‚#IOREAD,FATIOS+IOSFCT(A4)ŠBEQ.S‚FMRW05A!ŠBSR„CHKWPDWRITEPROTECTEDDISK?ŠBNE„IOSERRYES-ERROR FMRW05AƒEQU„*0*IF REQUEST IS FORMAT, MUST BE EREW VOLUME ASSN.(ŠCMP.W‚#IOFRMT,FATIOS+IOSFCT(A4)FORMAT?ŠBNE.S‚FMRW06NOŠCMP.B‚#'',FCBDIR+DIRFIL(A2))ŠBNE.S‚FMRER4NOTVOLUME-INVALIDFUNCTIONŠMOVE.LFATLUE(A4),A0ŠCMP.B‚#FOPEREW,LUTCAP(A0)FMRER4„BNE„FMER4ŽNOTEREW&*GO AHEAD AND REQUEST FORMAT OF DEVICE;ŠMOVE.WFATIOS+IOSFCT(A4),VDTIOS+IOSFCT(A6)SETUPFUNCTION:ŠMOVE.WFATIOS+IOSOPT(A4),VDTIOS+IOSOPT(A6)SETUPOPTIONS%*RRN CONTAINS PSN IF FORMATTING TRACK+ŠMOVE.LFATIOS+IOSRRN(A4),VDTIOS+IOSRRN(A6)ŠBSR„DOIOISSUEI/O ŠBRA„PROS66 FMRW06„EQU„*F*IF WRITE/UPDATE/DELETE REQUEST, DON'T ALLOW IF WRITE PROTECT CODE=$FFŠMOVE.WFATIOS+IOSFCT(A4),D0ŠAND.W‚#IOWRIT+IODELR+IOUPDR,D0ŠBEQ.S‚FMRW15MUSTBEREAD-ŠCMP.B‚#$FF,FCBDIR+DIRWCD(A2)WRITECODE=$FF?ŠBEQ„IOSER1YES-PROTECTERROR% *DETERMINE IF BLOCK OR RECORD REQUEST5*IF VOLUME OR CONTIGUOUS FILE ASSIGN, FORCE BLOCK I/O**ENTRY POINT FOR POSITION *…D6=IOSSAD *…D7=IOSEAD**CALCULATE USER BUFFER LENGTH"FMRW15„MOVE.LFATIOS+IOSSAD(A4),D6ŠMOVE.LFATIOS+IOSEAD(A4),D7 ŠMOVE.LD7,D4 ŠSUB.L‚D6,D4 ŠADD.L‚#1,D4 ŠBSR„CHKASN*…D5.W=NEGIFCONTIGUOUS/VOLUME*‰=POSIFNON-CONTIGUOUSŠIFGTƒFMSLEVEL-1 ŠBMI.S‚FBLKCONTIGUOUSORVOLUMEI*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 10/08/84 >>>8*CAN'T HAVE SECONDARY MEMORY MAP FOR NON-CONTIGUOUS FILE"*‰BTSTW‚#IOPSMPB,FATIOS+IOSOPT(A4)*‰BNE„FMRER4INVALIDFUNCTIONI*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 10/08/84 >>><*ALLOCATE DATA BUFFER FOR NON-CONTIGUOUS FILE (IF IT DOESN'T*…EXIST)ANDATTACHTOITŠTST.L‚FATBSN(A4)(ŠBNE.S‚FMRW16CŒSEGMENTALREADYALLOCATED4*IFDOINGBLOCKI/O,NEEDFABONLY.‚RECORDI/ONEEDS*…FABANDDATABLOCK'ŠCLR.B‚D0‘SETUPFORFAB/DB,NOTGLOBAL-ŠBTSTW‚#IOPRECB,FATIOS+IOSOPT(A4)RECORDI/O?ŠBEQ.S‚FMRW16YES'ŠMOVE.B#$80,D0ŒBLOCKI/O-NEEDFABONLY"FMRW16„BSR„GETIOBALLOCATESEGMENT%ŠBNE„IOSERRINSUFFICIENTSYSTEMSPACEŠBRA.S‚FMRW16EŠIFGTƒFMSLEVEL-1$FMRW16CƒBSR„ATTIOBATTACHTOSEGMENTŠENDC+*IF OVERWRITE WAS REQUESTED AND THIS IS NOT8*…READORPOSITION,DE-ALLOCAATEALLEXISTINGFILESPACE=*OVERWRITE BIT CAN ONLY BE SPECIFIED FOR NON-CONTIGUOUS FILES FMRW16EƒEQU„* ŠCMP.W‚#IOREAD,FATIOS+IOSFCT(A4)ŠBEQ.S‚FMRW17READ ŠCMP.W‚#IOPOST,FATIOS+IOSFCT(A4) ŠBEQ.S‚FMRW17?ŠBCLRW‚#FOPOVRTB,FATASN(A4)WASOVERWRITESET?(ANDCLEARFLAG)ŠBEQ.S‚FMRW17NOB*YES-TO HANDEL CASE OF MULTIPLE WRITE ACCESSES, ONLY 1ST OVERWRITE*…ENCOUNTEREDISOPERATEDON1ŠBSETW‚#FCFLOB,FCBFLG(A2)OVERWRITEALREADYDONE?!ŠBNE.S‚FMRW17YES-IGNORETHISONE"ŠBSR„FSDEALDE-ALLOCATEFILESPACE ŠBNE„IOSERR FMRW17„EQU„*3ŠBTSTW‚#IOPRECB,FATIOS+IOSOPT(A4)RECORDRETRIEVAL? ŠBEQ„FRECYESŠENDCƒFMSLEVEL-1ŠPAGE**BLOCK I/O PROCESSING!*…D4=LENGTHOFUSERBUFFERPASSED*…D5.W=TYPEOFASSIGN *…D6=IOSSAD *…D7=IOSEAD*…A6=VDTADDR.*…A4=FATADDR.*…A2=FCBADDR.**MAKE SURE FUNCTION IS VALID FOR BLOCK I/O**…UPDATE,DELETE,ANDPOSITIONAREINVALID**INDENTED LIST * FBLK DOES BLOCK I/O PROCESSING*FBLK* BLOCK I/O VALID?*‚NO,INVALIDFUNCTION%* VALID-DATA BUFFER ADDR.-AND LENGTH?*‚NO,INVALIDDATABUFFERADDR.%* DETERMINE CURRENT LOG.SECT. $CALREC*‚ERROR-IFCLS-NOTIN-RANGE* VOLUME ASSN.?"*‚YES,ERRORIF-NOTRANDOMREC.REQ.)*ƒERROR-IFNOT-VOLUMEOWNER-ORSUPERVISOR* NON-CONT. FILE?*‚YES,GOTO$PROS70* DETERMINE PSN,NO. OF BYTES&* SET-UP-TO TRANSFER THROUGH USER-BUF."*‚SET-UP-FORSEC.MEM.IFREQUESTED*ƒTRANSFERDATA$DOIO* VOLUME WRITE?&*‚YES,IND.NO-TABLESIN-MEMORY$ZERPTR*ƒSECTOR-0WRITTEN?*„YES,READVOLUME-ID$GETVID* CALCULATE BYTES TRANSFERRED*‚GO-TOI/OCOMPLETION$FMRW31*INDENTED LIST END* FBLK†EQU„*ŠMOVE.WFATIOS+IOSFCT(A4),D0ŠCMP.W‚#IOPOST,D0 ŠBEQ.S‚FMER4ŠCMP.W‚#IODELR,D0ŠBEQ.S‚FMER4ŽINVALIDFUNCTIONŠCMP.W‚#IOUPDR,D0 ŠBEQ.S‚FMER4ŠIFGTƒFMSLEVEL-1 ŠTST.W‚D5ŠBMI.S‚FMRW18CONTIGUOUS/VOLUME8*CAN'T SWITCH BETWEEN RECORD AND BLOCK I/O UNLESS SHARED!*…BUFFERREQUESTEDATASSIGNTIME'ŠBTSTW‚#FOPABFB,FATASN(A4)SHAREDREQ.?!ŠBNE.S‚FMRW18AŒYES-OKAYTOSWITCH/*SEE IF A RECORD I/O HAS ALREADY BEEN PROCESSEDŠBTSTW‚#FAFLRB,FATFLG(A4)!ŠBNE.S‚FMER4ŽYES-INVALIDFUNCTION8*CAN'T DO WRITE BLOCK I/O FOR NON-CONTIGUOUS FILE UNLESS*…SHAREDBUFFER ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4) ŠBNE.S‚FMRW18!FMER4…BRA„IOSER4INVALIDFUNCTION-*SAVE DATA BUFFER START AND END ADDRS. IN FAT*DON'T DO IF SHARED BUFFERG*IF CONTIGUOUS FILE OR VOLUME ASSIGNMENT, BUFFER MUST BE MULTIPLE OF 25 FMRW18„EQU„* ŠTST.W‚D5ŠBPL.S‚FMRW18BŒNON-CONTIGUOUSŠENDCƒFMSLEVEL-1ŠAND.B‚#$FF,D45ŠBNE„IOSER2NOT256BYTEMULTIPLE-INVALIDDATABUFFERŠMOVE.LD7,FATSBL(A4)ŠIFGTƒFMSLEVEL-1ŠBRA.S‚FMRW18H5*SHARED BUFFER-MAKE SURE USER'S PASSED ADDRS ARE GOOD2*…STARTINGADDR.MUSTBESAMEASTHATSPECIFIEDAT*…ATASSIGNM ENTTIMEFMRW18AƒMOVE.LD6,D0ŠCMP.L‚FATSLA(A4),D0&ŠBNE.S‚FMER2ŽINVALIDDATABUFFERADDR.ŠMOVE.LFATSBE(A4),D0ŠSUB.L‚FATSBS(A4),D0$ŠADD.L‚#1,D0ŽD0=LENGTHOFFMSBUFFER ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)ŠBEQ.S‚FMRW18A2‹WRITEREQUEST9ŠCMP.L‚D0,D4ŒBUFFERMUSTBEFULLLENGTHFORREAD/POSITION!ŠBNE.S‚FMER2ŽINVALIDDATABBUFFERŠBRA.S‚FMRW190;*FOR WRITE, USER'S BUFFER CANNOT BE BIGGER THATN FMS BUFFERFMRW18A2‚CMP.L‚D0,D4ŠBHI.S‚FMER2ŽTOOBIGŠMOVE.WFCBDIR+DIRLRL(A2),D1ŠBEQ.S‚FMRW18CŒVRL0*FRL-MAKE SURE USER BUFFER LENGTH IS MULTIPLE OF*…RECORDLENGTH#ŠMOVE.LD4,D2ŽD2=USERRECORDLENGTH ŠDIVUƒD1,D2ŠSWAPƒD2 ŠTST.W‚D2 ŠBNE.S‚FMER2ŽINVALIDDATABUFFERŠBRA.S‚FMRW18F**VRL-CALCULATE NO. OF BYTES OF ACTUAL DATAFMRW18CƒCLR.L‚D1 ŠCLR.L‚D2ŠMOVE.LFATSBS(A4),A1+FMRW18DƒMOVE.W(A1)+,D2‹GETREC.BYTECOUNTŠBEQ.S‚FMRW18EŒALLDONE ŠBTSTW‚#0,D2ŠBEQ.S‚FMRW18D2 ŠADD.L‚#1,D2FMRW18D2‚EQU„* ŠADD.L‚D2,D1ŠADD.L‚#BCTFLD,D1*ŠADD.L‚D2,A1ŽPOINTTOSTARTOFNEXTRECORD*MAKE SURE HAVEN(T GONE TOO FAR ŠCMP.L‚D4,D1ŠBEQ.S‚FMRW18EŒATENDOFBUFFER/ŠBHI.S‚FMER2ŽGONEBEYONEND-INVALIDDATABUFFERŠBRA.S‚FMRW18D-FMRW18EƒMOVE.LD1,D4ŽSAVENEWLENGTHOFBLOCK*ERROR IF ONLY 0'S IN BUFFER ŠBEQ.S‚FMER2 FMRW18FƒEQU„*!*CALCULATE LOGICAL END OF BUFFEERŠADD.L‚FATSBS(A4),D4 ŠSUB.L‚#1,D4ŠMOVE.LD4,FATSBL(A4)ŠBRA.S‚FMRW190/*NON-CONTIGUOUS BLOCK I/O FOR NOT SHARED BUFFER5*…READMUSTHAVEBUFFERATLEASTASBIGASDATABLOCK**…SIZE.‚WRITEBLOCKREQUIRESSHAREDBUFFERFMRW18BƒCLR.W‚D1ŠMOVE.BFCBDIR+DIRDAT(A2),D1.ŠMULUƒ#SECSZE,D1‰D1=NO.OFBYTESINDATABLOCK ŠCMP.L‚D1,D4ŠBCC.S‚FMRW18H%FMER2…BRA„IOSER2INVALIDDATABBUFFERŠENDCƒFMSLEVEL-1"FMRW18HƒMOVE.LD6,FATSBS(A4)†STARTŠMOVE.LD7,FATSBE(A4)†ENDC*SET UP TO DETERMINE CLS BASED ON NEXT, PRIOR, CURRENT, RANDOM REQ. FMRW190ƒMOVE.LFATCLS(A4),D1†CLS*ŠMOVE.LFATBCT(A4),D2†VALUETOADDIFNEXTŠIFGTƒFMSLEVEL-12*IF NON-CONTIGUOUS FILE, NO. OF SECTORS TO ADD FOR1*…NEXTISDETERMINEDBYCURRENTDATABLOCK'SSIZE ŠTST.W‚D5 ŠBMI.S‚FMRW19CŒCONTIGUOUS/VOLUME-ŠMOVE.LFATCFP(A4),A1†GETCURRENTFABPOINTER"ŠCMP.L‚#0,A1ŽISTHERECURRENTFAB?"ŠBEQ.S‚FMRW19CŒNO-USEFATBCTVALUE ŠCLR.L‚D29ŠMOVE.BFABSGS(A1),D2†GETNO.OFSECTORSINCURRENTBLOCKŠENDCƒFMSLEVEL-1FMRW19CƒBSR„CALRECŠBCS„FMER4ŽINVALIDFUNCTIONŠIFGTƒFMSLEVEL-1*4*IF BLOCK WRITE FOR NON-CONTIGUOUS, MAKE SURE DB NOT2*…CHANGEDORIFITIS,BLOCKWRITEMUSTGOTOSAME*…DB ŠTST.W‚D5ŠBMI.S‚FMRW22CONTIGUOUS/VOLUME ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)ŠBNE.S‚FMRW22NOTWRITEŠBTSTW‚#FAFLDB,FATFLG(A4)ŠBEQ.S‚FMRW22DBNOTCHANGEDŠCMP.L‚FATSLS(A4),D1,ŠBNE„FMER4ŽBADDBREQUESTED-INVALIDFUNCTIONŠENDC FMRW22„EQU„***CHECK TO MAKE SURE CLS IS IN VALID RANGE.*…IFREADREQUEST8*…CLSMUSTBE.LE.EOF.‚IFWRITE,CLSMUSTBE.LE.EOF+1&*…(UNLESSCONTIGUOUSWRITEANDEOF=FE)?*…IFVOLUMEREAD/WRITE,CLSMUSTBE.LT.NO.OFSECTORSONDISK*…D1=CLSVALUEŠTST.B‚D5‘GETASSIGN.TYPEŠBPL.S‚PROS01FILEASSIGNMENT-*DON'T ALLOW VOLUME I/O UNLESS RANDOM REQUESTŠMOVE.WFATIOS+IOSOPT(A4),D0ŠAND.W‚#IOPPOS,D0ŠCMP.W‚#IOPRAN,D0ŠBNE„FMER4ŽINVALIDFUNCTION9*CAN'T DO VOLUME I/O UNLESS USER OWNS VOLUME OR USER ID=0ŠMOVE.LFATLUT(A4),A0"ŠMOVE.WLUTUNM(A0),D0†GETUSERNO.ŠBEQ.S‚FMRW22BŠCMP.W‚VDTVID+VIDUSN(A6),D0ŠBNE„IOSER1PROTECTCODEERROR FMRW22BƒEQU„*ŠMOVE.LVDTDCB(A6),A3'ŠMOVE.LDCBSEC(A3),D0†VOLUMEASSIGNMENT&ŠSUB.L‚#1,D0ŽGETMAX.NO.OFSECTORS-1 ŠCMP.L‚D1,D0*‰BCS„IOSER6Removed3/15/840ŠBCS„IOSER8InvalidRandomRecordnumber3/15/84 ŠBRA.S‚PROS08*ŠIFEQƒFMSLEVEL-1FMER4…BRA„IOSER4ŠENDC* PROS01„EQU„*ŠIFEQƒFMSLEVEL-1*CONTIGUOUS-USE PHYSICAL EOFŠMOVE.LFCBDIR+DIRFE(A2),D0ŠENDCŠIFGTƒFMSLEVEL-1"ŠCMP.B‚#DATCON,D5‰CONTIGUOUSFILE?ŠBNE.S‚PROS01CŒNO*YES-USE PHYSICAL EOFŠMOVE.LFCBDIR+DIRFE(A2),D0 ŠBRA.S‚PROS05 PROS01CƒEQU„*/*IF WRITE REQUEST, POINT ONE BEYOND END OF FILE,ŠMOVE.LFCBDIR+DIREOF(A2),D0GETLOGICALEOF+ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)WRI TEREQ?ŠBNE.S‚PROS05NO#*YES-MAKE EOF+1 UPPER BOUND FOR CLS ŠADD.L‚#1,D0ŠENDCƒFMSLEVEL-1 PROS05„CMP.L‚D1,D0ŽCLSINRANGE?ŠBCS„IOSER7NO-ENDOFFILE*DON'T ALLOW READ IF EOF=-1 ŠCMP.L‚#-1,D0 ŠBEQ„IOSER7)*CALCULATE MAXIMUM NO. OF SECTORS OF DATA*…=(SBE-SBS+1)/SECSZEFORREAD *…=((SBL-SBS+1)/SECSZEFORWRITE#PROS08„MOVE.LFATSBE(A4),D4†GETSBE/ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)WRITEREQUEST?ŠBNE.S‚PROS10NO!ŠMOVE.LFATSBL(A4),D4†YES-GETSBLPROS10„SUB.L‚FATSBS(A4),D4"ŠADD.L‚#1,D4ŽD4=TOTALNO.OFBYTES3ŠDIVUƒ#SECSZE,D4‰D4.W=NO.OFSECTORSINDATABUFFER2ŠBCLRW‚#FAFLLB,FATFLG(A4)CLEARDELETERECORDFLAG-*NOW MUST DETERMINE PSN CORRESPOINGING TO CLS ŠTST.B‚D5ŠBMI.S‚PROS15VOLUMEREAD/WRITEŠIFGTƒFMSLEVEL-1ŠCMP.B‚#DATCON,D5ŠBNE„PROS70NOTCONTIGUOUSŠENDC(*FOR CONTIGUOUS FILE, PSN=FILE START+CLSŠMOVE.LFCBDIR+DIRFS(A2),A3ŠADD.L‚D1,A3ŽA3=PSN%*CALCULATE NO. OF SECTORS TO TRANSFER+*ERROR IF WRITE REQUEST WOULD GO BEYOND END1*CALCULATE NO. OF SECTORS TO END OF FILE=FE-CLS+1ŠMOVE.LFCBDIR+DIRFE(A2),D6PROS12„SUB.L‚D1,D6 ŠADD.L‚#1,D6/ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)WRITEREQUEST?ŠBNE.S‚PROS44NO@*YES-MAKE SURE NO. OF SECTORS REQUESTED FOR TRANSFER .LE. NO. OF*…SECTORSREMAININGINFILE ŠCMP.L‚D4,D6ŠBCC.S‚PROS44OKAY*TOO MANY SECTORS TO WRITE(*GIVE EOF ERROR UNLESS VOLUME ASSIGNMENT ŠTST.B‚D5ŠBPL„IOSER7NOTVOLUMEŠBRA„IOSER6ENDOFVOLUME*VOLUME READ/WRITE-PSN=CLS&*…D0=LARGESTSECTORREFERENCEFORDISKPROS15„MOVE.LD1,A3+ŠMOVE.LD0,D6ŽD6=PSNOFLASTSECTORONDISK ŠBRA.S‚PROS12ŠPAGE*…D1=CLSVALUE"*…D4=NO.OFSECTORSLEFTINBUFFER(*…D6=NO.OFSECTORSLEFTINTHISSEGMENTPROS44„MOVE.LD4,D3(ŠMOVE.LD1,FATCLS(A4)†SAVENEWCLSVALUE ŠCMP.L‚D6,D3 ŠBCS.S‚PROS45 ŠMOVE.LD6,D3*D3=NO. OF SECTORS TO TRANSFER *…A3=PSNOFSECTORTOSTARTWITH*SET UP I/O CONTROL BLOCK PROS45„EQU„***SETUPREADANDOPTIONSFOR‚IMAGE,RANDOM&ŠSETFO‚IOREAD,IOPIMG+IOPRAN,VDTIOS(A6),ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)WRITEREQ.?ŠBNE.S‚PROS50NO+ŠMOVE.W#IOWRIT,VDTIOS+IOSFCT(A6)SETWRITE6PROS50„MOVE.LA3,VDTIOS+IOSRRN(A6)SETSTARTINGSECTOR3ŠMOVE.LFATSBS(A4),VDTIOS+IOSSAD(A6)STARTINGADDR.$ŠMOVE.LFATSBS(A4),VDTIOS+IOSEAD(A6)*CALCULATE ENDING ADDR. ŠMOVE.LD3,D0ŠMULUƒ#SECSZE,D0‰NO.OFBYTESŠSUB.L‚#1,D0Ž-1(ŠADD.L‚D0,VDTIOS+IOSEAD(A6)ENDINGADDR.<*FOR CONTIGUOUS FILES, TRANSFER ALWAYS GOES TO USER'S BUFFER$*SET UP TO DO CALL ON BEHAVE OF USER.ŠMOVE.LFATTSK(A4),VDTIOS+IOSTSK(A6)USERTASK1ŠMOVE.LFATSES(A4),VDTIOS+IOSSES(A6)USERSESSION(*SET OPTION TO INDICATE TASK ID SUPPLIED!ŠBSETW‚#IOPTSKB,VDTIOS+IOSOPT(A6)I*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 10/08/84 >>>2*IF USER REQUESTS SECONDARY MEMORY MAP, SET OPTION"*‰BTSTW‚#IOPSMPB,FATIOS+IOSOPT(A4)*‰BEQ.S‚PROS55"*‰BSETW‚#IOPSMPB,VDTIOS+IOSOPT(A6) *PROS55„EQU„*I*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FAM 10/08/84 >>>ŠBSR„DOIOSTARTI/O0*SAVENO.OFSECTORSTRANSFERRED‚(EVENIFERROR)ŠMOVE.LD3,FATBCT(A4)ŠTST.L‚D0‘CLEARCC'S.ŠBNE.S‚PROS68I/OERROR-CHECKFORVOLUMEWRITE9*IF INPUT REQUEST, SET SBL TO INDICATE END OF ACTUAL DATA ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)ŠBEQ.S‚PROS60WRITEŠMOVE.LIOSEAD(A0),FATSBL(A4)6PROS65„CMP.W‚#IOFRMT,FATIOS+IOSFCT(A4)FORMATREQUEST?ŠBEQ„IOSGRTYES-DONE ŠBRA„FMRW25PROS60„TST.B‚D5‘VOLUME?ŠBPL.S‚PROS65NO5*VOLUME WRITE SHOULD CAUSE ANY TABLES SAVED IN MEMORY*…TOBEREADBACKINNEXTTIME*…FILEI/ODONE*…ALSOCALLEDAFTERFORMAT?*…(SHOULDN'TBEANYINFO.INMEMORYNOTALREADYUPDATEDONDISK*…SINCEWRITEISEXCLUSIVE%PROS66„MOVE.LD0,D2ŽSAVEERRORSTATUS ŠBSR„ZERPTR/ŠBSETW‚#FCFLWB,FCBFLG(A2)INDICATEVOLUMEWRITE7*IF VOLUME WRITE TO SECTOR 0, MUST READ VOLUME ID AGAIN(ŠCMP.W‚#IOFRMT,FATIOS+IOSFCT(A4)FORMAT?ŠBEQ.S‚PROS66AŠTST.L‚FATCLS(A4)ŠBNE.S‚PROS67NOTSECTOR0PROS66AƒBSR„GETVID=*DON'T CHECK ERROR AFTER GETVID SINCE COULD BE INVALID VOLUME!PROS67„MOVE.L D2,D0ŽRESTOREERROR ŠBEQ.S‚PROS65PRERR…BRA„IOSERRI/OERROR0*I/O ERROR OCCURRED-CHECK TO SEE IF VOLUME WRITE&PROS68„CMP.W‚#IOWRIT,FATIOS+IOSFCT(A4) ŠBNE.S‚PRERR ŠTST.B‚D5 ŠBMI.S‚PROS66ŠBRA.S‚PRERRŽNOTVOLUMEWRITEŠPAGEŠIFGTƒFMSLEVEL-1*&*DO PROCESSING FOR NON-CONTIGUOUS FILE*…D1=NEWCLSVALUE***INDENTED LIST0* PROS70 DOES BLOCK I/O FOR NON-CONTIGUOUS FILES*PROS70* READ REQUEST? *‚YES,GETFAB,DATABLOCK$GETFDB*‚NO,GETFAB$GETFDB*ƒEND-OFFILE?*„YES,ALLOC.FILE-SPACE$FSALLC(* RANDOM-REQ. NOT-AT BEGINNING OF-BLOCK?&*‚YES,RETURNLOG.SEC.OF-STARTIF-READ*ƒSET-UPFORINVALIDRRN*‚NO,WRITEREQUEST?*ƒYES,WRITEDATA-TODISK*„$DBCHG,$PUTDAT* CALCULATE BYTES TRANSFERRED*‚GO-TOI/OCOMPLETION$FMRW31*INDENTED LIST END* PROS70„EQU„*$ŠMOVE.LD1,FATCLS(A4)†SAVECLSVALUEŠMOVE.LD1,D0ŽD0=CLSVALUEŠMOVE.L#LSNFDB,D1/ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)WRITEREQUEST?ŠBEQ.S‚PROS72YES.ŠBSETW‚#RDBFLGB,D1ˆNO-SETUPTOREADDATABLOCKPROS72„BSR„GETFDB ŠBEQ.S‚PROS75$ŠCMP.B‚#ISTAEOF,D0ˆCLSOUTOFRANGE?ŠBNE.S‚PRERRŽMUSTBEFATAL#*SHOULD ONLY GET EOF IF DOING WRITE ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)ŠBNE.S‚PRERRŽREADBEYONDEOF3*OUT OF RANGE MUST HAVE BEEN CAUSED BY WRITE BEYOND.*…ENDOFFILE-ALLOCATEDISKSPACEANDCONTINUE ŠBSR„FSALLC ŠBNE.S‚PRERR1*SET CURRENT LOG. RECORD=STARTING RECORD OF BLOCK PROS75„EQU„*ŠMOVE.LFATSLR(A4),FATCLR(A4)ŠMOVE.LFATSLS(A4),D1,*IF RANDOM RECORD REQUEST, MAKE SURE CLS=SLSŠMOVE.WFATIOS+IOSOPT(A4),D0ŠAND.W‚#IOPPOS,D0ŠCMP.W‚#IOPRAN,D0ŠBEQ.S‚PROS76RANDOM*NOT RANDOM-SET CLS=SLSŠMOVE.LD1,FATCLS(A4) ŠBRA.S‚PROS80PROS76„CMP.L‚FATCLS(A4),D1ŠBEQ.S‚PROS80OKAY*ERROR-BUT SET CLS=SLS ANYWAYŠMOVE.LD1,FATCLS(A4)=*RETURN STARTING LOGICAL SECTOR OF DATA BLOCK TO USER IF READŠCMP.W‚#IOWRIT,FATFCB(A4)1ŠBEQ„IOSER8WRITE-MAKEINVALIDRANDOMREC.RETURN ŠBSR„SMOVE4ŠLEA„FATCLS(A4),A1ŠMOVE.LA1,MVSADD(A0)ŠMOVE.LFATUPB(A4),MVDADD(A0)ŠADD.L‚#IOSRRN,MVDADD(A0)ŠMOVE.L#4,MVLENG(A0)<*MOVE LOGICAL SECTOR NO. CORRESPONDING TO 1ST SECTOR IN DATA*†BLOCKTOUSER'SRRN ŠBSR„MOVE2U ŠBNE.S‚FMRER3:ŠBSETW‚#FAFLBB,FATFLG(A4)INDICATEBLOCKTRANSFERCOMPLETEŠMOVE.LFATSBL(A4),D0ŠSUB.L‚FATSBS(A4),D0(ŠADD.L‚#1,D0ŽD0=NO.OFBYTESTRANSFERRED;ŠMOVE.L#NL+ISTARR,D2†D2=ERRORCODEFORINVALIDRANDOMREC. ŠBRA.S‚FMRW31&PROS80„CMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)&ŠBNE.S‚FMRW25DONEIFREADORPOSITION.*FINISH WRITE REQUEST-MUST UPDATE INFO. IN FABŠBCLRW‚#FAFLCB,FATFLG(A4)ŠBSETW‚#FAFLUB,FATFLG(A4)ŠBSR„DBCHGŽSETDBCHANGED$ŠMOVE.L#1,D0ŽUPDATELASTKEYINFAB ŠBSR„PUTDATUPDATEBLOCKONDISK ŠBEQ.S‚FMRW25ŠENDCFMERR…BRA„IOSERRI/OERROR;FMRW25„BSETW‚#FAFLBB,FATFLG(A4)INDICATEBLOCKI/OTRANSFER*-*REQUEST WAS COMPLLTED-CALCULATE ACUAL NO. OF *…BYTESTRANSFERRED(=SBL-SBS+1)ŠMOVE.LFATSBL(A4),D0ŠSUB.L‚FATSBS(A4),D0(ŠADD.L‚#1,D0ŽD0=NO.OFBYTESTRANSFERRED%ŠCLR.B‚D2‘INDICATENOBUFFEROVERFLOW*A*SET UP TO MOVE LENGTH OF DATA TRANSFER TO USER'S PARAMETER BLOCK?*…D0.L=NO.OFBYTESTRANSFERREDOROFFSETTORECORDIFPOSITIONA*…D2.B=0ORERRORCODEFORBUFFEROVERFLOWORINVALIDRANDOMREC.*…D5.W=TYPEOFASSIGNMENT**INDENTED LIST* FMRW31 DOES I/O COMPLETION*FMRW31* POSITION REQUEST?&*‚YES,RETURNREC.OFFSETIN-LEN$MOVELL!*ƒRETURNCLR-INRRN-FIELD.MOVELL#*‚NO,RETURNTRANSFERLENGTH.MOVELL* BUFFER.OVF OR-INVALID RRN?*‚YES,MAKEERRORRETURN*‚NO,CLEARI/OPENDING$CLRIOP*ƒMAKEGOODRETURN$FMSRTN*INDENTED LIST END* FMRW31„EQU„*ŠBSR„SMOVE4SETUPL-LMOVEŠMOVE.LD0,FATIOS+IOSLEN(A4)ŠLEA„FATIOS+IOSLEN(A4),A1ŠMOVE.LA1,MVSADD(A0)ŠMOVE.LFATUPB(A4),MVDADD(A0)ŠADD.L‚#IOSLEN,MVDADD(A0)(ŠMOVE.L#4,MVLENG(A0)†LENGTHOFTRANSFER ŠBSR„MOVE2U%FMRER3„BNE„IOSER3INVALIDPARM.BLOCK@*IF POSITION REQUEST, RETURN CURRENT LOGICAL RECORD IN RRN FIELD ŠCMP.W‚#IOPOST,FATIOS+IOSFCT(A4)ŠBNE.S‚FMRW34NOTPOSITION@ŠMOVE.LFATCLR(A4),FATIOS+IOSLEN(A4)SAVECURR ENTLOGICALRECORDŠMOVE.LFATUPB(A4),MVDADD(A0)ŠADD.L‚#IOSRRN,MVDADD(A0) ŠBSR„MOVE2U ŠBNE.S‚FMRER3?*IF NOT BUFFER OVERFLOW OR INVALID RANDOM RECORD NO., MAKE GOOD*…RETURNFMRW34„MOVE.BD2,D05ŠBNE.S‚FMERRŽBUFFEROVERFLOWORINVALIDRANDOMRECORDŠBRA„IOSGRTMAKEGOODRETURNŠIFGTƒFMSLEVEL-1ŠPAGE**PROCESSING FOR RECORD I/O*…D4=USERBUFFERLENGTH*…D5.W=TYPEOFASSIGNMENT *…D6=IOSSAD *…D7=IOSEAD*…A6=VDTADDR.*…A4=FATADDR.*…A2=FCBADDR.**INDENTED LIST!* FREC DOES RECORD I/O PROCESSING*FREC* RECORD I/O VALID?*‚NO,INVALIDFUNCTION* VALID USER BUFFER?*‚NO,INVALIDDATABUFFER* SPOOLER FILE?*‚YES-ADD2-TORECORDLENGTH* SPACES COMPRESSED?*‚YES,COUNTCOMPRESSEDDATA*ƒ$MVEREC,$CMPSPC* RANDOM RECORD REQUEST?*‚YES,GOTO$FREC150* DETERMINE CLR $CALREC*‚ERROR-IFOUT-OFRANGE* READ-FAB, DATA-BLOCK $GETFDB* END-OF FILE-ON WRITE?*‚YES,ALLOC.FILE-SPACE$FSALLC*ƒPOSITIONTO-BEG.OF-DB*‚NO,POS.TO-CORRECTRECORD* POSITION REQUEST? *‚YES,SETUPTO-RETURNREC.OFFSET*ƒDO-I/OCOMPLETION$FMRW31&*‚NO,GOFINISHREAD,WRITE,UPDATE,DEL.*INDENTED LIST END* FREC†EQU„***CAN'T SWITHC BETWEEN RECORD AND BLOCK I/O/*…UNLESSSHAREDBUFFERREQUESTEDATASSIGNTIME&ŠBTSTW‚#FOPABFB,FATASN(A4)SHAREDREQ?ŠBEQ.S‚FREC08NOC*IF POSITION OR DELETE REQUEST, DON'T CHECK BUFFER ADDRESSES UNLESS*…RANDOMKEYPOSITION ŠCMP.W‚#IODELR,FATIOS+IOSFCT(A4) ŠBEQ.S‚FREC01 ŠCMP.W‚#IOPOST,FATIOS+IOSFCT(A4)ŠBNE.S‚FREC04NOTPOSITION3FREC01„BTSTW‚#IOPLRNB,FATIOS+IOSOPT(A4)RANDOMKEY?"ŠBEQ.S‚FREC10NO-SKIPBUFFERCHECK FREC04„EQU„*8*FOR SHARED BUFFER, MAKE SURE USER'S RECORD ADDR. IS NOT%*…INCONFLICTWITHSHAREDBUFFERADDR3ŠMOVE.LFATSLA(A4),D0†USER'SSEGMENTSTARTINGADDR. ŠCLR.W‚D1ŠMOVE.BFCBDIR+DIRDAT(A2),D1ŠMULUƒ#SECSZE,D1 ŠSUB.L‚#1,D10ŠADD.L‚D0,D1ŽD1=USERENDINGADDR.OFSHAREDSEG. ŠCMP.L‚D6,D0 ŠBHI.S‚FREC06 ŠCMP.L‚D6,D1ŠBCS.S‚FREC10OKAYFRER2…BRA„IOSER2FREC06„CMP.L‚D7,D0ŠBLS.S‚FRER2ŽERROR ŠBRA.S‚FREC10 FREC08„EQU„*.*SEE IF A BLOCK I/O HAS ALREADY BEEN PROCESSEDŠBTSTW‚#FAFLBB,FATFLG(A4) ŠBNE„IOSER4YES-INVALIDFUNCTION(*DELETE REQUEST NOT VALID UNLESS INDEXEC0*IF RANDOM RECORD I/O, FILE TYPE MUST BE INDEXED'FREC10„BTSTW‚#IOPLRNB,FATIOS+IOSOPT(A4)ŠBEQ.S‚FREC12NOTRANDOMBŠTST.B‚FCBDIR+DIRKEY(A2)‚NORANDOMKEYACCESSTOFILESW/NULLKEYS!ŠBNE.S‚FREC17OKUNLESSSEQ.FILEŠBRA.S‚FREC18ERROR.FREC12„CMP.W‚#IODELR,FATIOS+IOSFCT(A4)DELETE?ŠBNE.S‚FREC20NO-OKAYFREC17„CMP.B‚#DATSEQ,D5/FREC18„BEQ„IOSER4SEQUENTIAL-INVALIDFUNCTION/*FOR WRITE/UPDATE RECORD REQUEST, RECORD LENGTH)*…PASSEDCANNOTBEBIGGERTHANDATABLOCK,*…SIZEIFVRLORMUST=RECORDLENGTHIFFRL5* FOR INDEXEC FILES, RECORD LENGTH MUST BE BIG ENOUGH*…TOACCOMODATEKEYSIZE FREC20„EQU„*/ŠCLR.L‚D1‘0D1INPREPARATIONFORRECORDLENGTH+*FOR RANDOM RECORD I/O, USER BUFFER MUST BE!*…BIGENOUGHTOCONTAINKEYFIELD+ŠMOVE.WFATIOS+IOSFCT(A4),D0D0=IOFUNCTIONŠIFEQƒFMSLEVEL-3!ŠBTSTW‚#IOPLRNB,FATIOS+IOSOPT(A4)"ŠBNE.S‚FREC20AŒKEYED‚RECORD‚ACCESSŠENDCŠCMP.W‚#IOWRIT,D0ŠBEQ.S‚FREC20BŠCMP.W‚#IOUPDR,D0 ŠBNE.S‚FREC24 FREC20BƒEQU„*ŠIFEQƒFMSLEVEL-3ŠCMP.B‚#DATSEQ,D5ŠBNE.S‚FREC20AŠENDC)*UPDATE/WRITE REQUEST FOR SEQUENTIAL FILE(*…ADD2TORECORDLENGTHIFSPOOLERFILE ŠCMP.B‚#SPOOLF,FCBDIR+DIRFIL(A2)ŠBNE.S‚FREC21NOTSPOOLER ŠADD.L‚#2,D4ŠIFEQƒFMSLEVEL-3ŠBRA.S‚FREC21SEQUENTIALFILE;*INDEXED FILE-MAKE SURE RECORD LENGTH ACCOMODATES KEY FIELD2FREC20AƒMOVE.BFCBDIR+DIRKEY(A2),D1GETKEYLENGTH ŠCMP.L‚D1,D4<ŠBCS.S‚FRER2‰RECORDTOOSMALL-GIVEINVALIDDATABUFFERERRORŠCMP.W‚#IOWRIT,D0 ŠBEQ.S‚FREC21ŠCMP.W‚#IOUPDR,D0!ŠBNE.S‚FREC24NOTWRITEORUPDATEŠENDC$*MAKE SURE RECORD BUFFER NOT TOO BIG"FREC21„MOVE.WFCBDIR+DIRLRL(A2),D1 ŠBEQ.S‚FREC221ŠCMP.L‚D1,D4ŽFRLBUFFERSIZEMUST=RECORDLENGTH&ŠBNE.S‚FRER2ŽINVALIDDATABUFFERADDR. ŠBRA.S‚FREC24 FREC22„EQU„*/*FOR VRL, RECORD BUFFER LENGTH CANNOT BE BIGGER+*…THANDBSIZE-2(TOACCOMOD ATEBYTECOUNT)ŠMOVE.BFCBDIR+DIRDAT(A2),D1ŠMULUƒ#SECSZE,D1ŠSUB.L‚#BCTFLD,D1 ŠCMP.L‚D1,D4:ŠBHI„FRER2‰RECORDBUFFERTOOBIG-INVALIDDATABUFFERADDR.*:*IF WRITE OR UPDATE REQUEST FOR VRL ASCII, FORMATTED, MOVE4*…RECORDTOTEMPORARYBUFFERSOACTUALRECORDLENGTH*…CANBECALCULATED&FREC24„MOVE.LD4,D7ŽSAVERECORDLENGTH ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)ŠBEQ.S‚FREC26AŒWRITEREQUEST ŠCMP.W‚#IOUPDR,FATIOS+IOSFCT(A4)"ŠBNE.S‚FREC26MŒNOTWRITEORUPDATE$FREC26AƒTST.W‚FCBDIR+DIRLRL(A2)‚VRL?ŠBNE.S‚FREC26MŒNO*FORCE IMAGE IF SPOOLER FILE ŠCMP.B‚#SPOOLF,FCBDIR+DIRFIL(A2)ŠBEQ.S‚FREC26MŒSPOOLER-ŠBTSTW‚#IOPFORB,FATIOS+IOSOPT(A4)FORMATREQ?ŠBNE.S‚FREC26MŒNO(ŠBTSTW‚#IOPASCB,FATIOS+IOSOPT(A4)ASCII? ŠBNE.S‚FREC26MŒNO-DON'TCOMPRESS+*ASCII FORMAT-MOVE DATA TO TEMPORARY BUFFER+*…SOACTUALRECORDLENGTHCANBEDETERMINED/*RECORD MUST BE ABLE TO FIT IN TEMPORARY BUFFERŠCMP.L‚#SECSZE,D44ŠBHI„IOSER2RECORDTOOBIG-INVALIDDATABUFFERADDR.ŠMOVE.LVDTTMA(A6),A1%ŠBSR„MVERECMOVEDATATOTEMP.BUFFERŠBNE„FREC71L-LMOVEERROR2ŠBCLRW‚#VDFLTB,VDTFLG(A6)INDICATEINTEMP.BUFFER&*RECORD HAS BEEN MOVED TO TEMP. BUFFER$*…CALCULATECOMPRESSEDRECORELENGTHŠMOVE.LVDTTMA(A6),A0*ŠCLR.B‚D0‘INDICATEDATASHOULDN'TBEMOVED ŠBSR„CMPSPC*…D7=COMPRESSEDRECORDLENGTH ŠEXG„D4,D7 *NOW D4=COMPRESSED RECORD LENGTH*…D7=USERREOCRDLENGTH FREC26MƒEQU„*ŠIFEQƒFMSLEVEL-3!ŠBTSTW‚#IOPLRNB,FATIOS+IOSOPT(A4)"ŠBNE„FREC150ŒRANDOMRECORDREQUESTŠENDC*NOW DETERMINE CLR VALUEŠMOVE.LFATCLR(A4),D1†D1=CLRŠMOVE.WFATIOS+IOSOPT(A4),D6ŠAND.W‚#IOPPOS,D6,*IF REQUEST IS WRITE PRIOR, DON'T CHANGE CLR ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)ŠBNE.S‚FREC27NOTWRITEŠCLR.B‚D3‘D3=0IFWRITEATEND;*IF SEQUENTIAL FILE, WRITE NEXT IS ALWAYS TREATED AS APPEND*„ANDCLRISSETTOEORVALUEŠIFEQƒFMSLEVEL-3ŠCMP.B‚#DATSEQ,D5ŠBNE.S‚FREC26PŠENDCŠCMP.W‚#IOPNXT,D6‰NEXTREQUEST?ŠBNE.S‚FREC26PŒNOŠMOVE.LFCBDIR+DIREOR(A2),D1ŠADD.L‚#1,D1ŽD1=CLR+1 ŠBRA.S‚FREC28 FREC26PƒEQU„* ŠCMP.W‚#IOPPRV,D6‰PRIORREQUEST?ŠBNE.S‚FREC27NO#ŠMOVE.B#-1,D3D3=-1IFWRITEPRIOR!ŠBRA.S‚FREC28YES-LEAVECLRALONE FREC27„EQU„*#ŠMOVE.L#1,D2ŽD2=AMTTOADDIFNEXT ŠBSR„CALRECŠBCS„IOSER4INVALIDFUNCTION2*NOW DETERMINE IF CLR IS IN CORRECT RANGE FOR FILE*„D1=CLR"FREC28„MOVE.LFCBDIR+DIREOR(A2),D06*FOR READ/UPDATE/DELETE REQUESTS, CLR MUST BE .LE. EOR/ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)WRITEREQUEST?ŠBEQ.S‚FREC30YESFREC29„CMP.L‚#-1,D0EOR=-1?ŠBEQ„IOSER7YES-GIVEEOFERROR ŠCMP.L‚D1,D0ŠBCS„IOSER7OUTOFRANGE-EOF ŠBRA.S‚FREC35(*FOR WRITE REQUEST, CLR MUST EQUAL EOR+1FREC30„TST.B‚D3‘WRITEPRIOR?ŠBMI.S‚FREC31YESŠSUB.L‚#1,D1ŽD1=CLR-1 ŠCMP.L‚D0,D1ŠBEQ.S‚FREC35OKAYTOWRITE4*OKAY TO HAVE NEXT, PRIOR WRITE REQUEST TO DUPLICATE&*…INDEXEDFILETHATISACTUALLYINSERT FREC31„EQU„*ŠIFEQƒFMSLEVEL-3ŠCMP.B‚#DATISD,D5 ŠBNE.S‚FREC33ŠTST.B‚D3‘WRITEPRIOR?ŠBMI.S‚FREC29YES*…D6=POSITIONBITSOFOPTIONS$ŠCMP.W‚#IOPNXT,D6‰WRITENEXTREQUESTŠBNE.S‚FREC33MUSTBEERROR%ŠMOVE.B#1,D3ŽD3=1IFWRITEINMIDDLE ŠBRA.S‚FREC29 FREC33„EQU„*ŠENDC.*CAN'T DO WRITE TO EXISTING RECORD-GIVE RECORD*…ALREADYEXISTSERRORŠCMP.L‚#-1,D0EOFIFEOR=-1 ŠBEQ„IOSER7&*IF CLR-1=-1, GIVE RECORD EXISTS ERROR ŠCMP.L‚#-1,D1ŠBEQ„IOSER10ŒRECORDEXISTSŠCMP.L‚D0,D1ŽCLR.GT.EOR?%ŠBCS„IOSER10ŒNO-RECORDALREADYEXISTSŠBRA„IOSER7CLRTOOBIG-EOF FREC35„EQU„*<*FOR WRITE AT END REQUEST, USE CLR-1 VALUE FOR RECORD TO GETŠMOVE.LD1,FATCLR(A4)*CLEAR DELETE RECORD FLAGŠBCLRW‚#FAFLLB,FATFLG(A4)ŠMOVE.LD1,D0ŽD0=RECORDTOGETŠMOVE.L#NL+LRNFDB+RDBFLG,D1 ŠBSR„GETFDB"ŠBEQ.S‚FREC50DBEXISTSFORRECORD#ŠCMP.B‚#ISTAEOF,D0ˆCLROUTOFRANGE ŠBNE„IOSERRNO-MUSTBEI/OERROR#*SHOULD ONLY GET EOF IF DOING WRITE ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)"ŠBNE„IOSERRREAD/UPDATEBEYONDEOF,*OUT OF RANGE MUST HAVE BEEN CAUSED BY WRITE *…BEYONDEOF-ALLOCATEDISKSPACE ŠBRA„FREC100(*SET CURRENT LSN=STARTING LSN OF SEGMENT#FREC50„MOVE.LFATSLS(A4),FATCLS( A4)ŠPAGE"*FIND POSITION OF REQUESTED RECORD**FOR FRL FILES, POSITION CAN BE CALCULATED*…D3.B=TYPEOFWRITE*…D4=USERRECORDLENGTH*…D5.W=TYPEOFFILEŠMOVE.LFATSBS(A4),A1+ŠMOVE.LFATCLR(A4),D1†CALCULATECLR-1STLOG ŠCLR.L‚D0ŠMOVE.WFCBDIR+DIRLRL(A2),D0ŠBEQ.S‚FREC55VRLŠSUB.L‚FATSLR(A4),D1(ŠMULUƒD0,D1ŽD1=OFFSETTOSTARTOFRECORDŠADD.L‚D1,A1ŽA1=STARTOFRECORD ŠBRA.S‚FREC60*FIND START OF RECORD FOR VRL9FREC55„MOVE.LFATSLR(A4),D2†GET1STLOG.RECORDOFBUFFER!FREC57„CMP.L‚D2,D1ŽFOUNDCLRYET?ŠBEQ.S‚FREC59YES ŠCLR.L‚D0/ŠMOVE.W(A1)+,D0‹ADJUSTA1FORBYTECOUNTFIELD ŠBTSTW‚#0,D0 ŠBEQ.S‚FREC58-ŠADD.L‚#1,D0ŽFORECEBYTECOUNTEVENSINCENOT'FREC58„ADD.L‚D0,A1ŽPOINTTONEXTRECORD/*INTERNAL ERROR IF GO BEYOND END OF DATA BUFFERŠCMP.L‚FATSBL(A4),A1 ŠBHI„IOSER11 ŠADD.L‚#1,D2 ŠBRA.S‚FREC57'FREC59„MOVE.W(A1),D0ŒGETRECORDLENGTH6ŠBEQ„IOSER11ŒINTERNALERRORIFFOUNDREC.HASLENGTH=0*…D0.L=RECORDLENGTHC*…A1=POINTERTOBEGINNINGOFRECORD(POINTSTOBYTECOUNTIFTHERE)*…D4=USERRECORDBUFFERLENGTH*FREC60„CLR.B‚D2‘D2=0IFNOBUFFEROVERFLOW ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)ŠBEQ„FREC90WRITEINMIDDLEŠIFEQƒFMSLEVEL-3 ŠCMP.W‚#IODELR,FATIOS+IOSFCT(A4)ŠBEQ„FREC120ŒGOPROCESSDELETEŠENDC ŠCMP.W‚#IOPOST,FATIOS+IOSFCT(A4)ŠBEQ„FREC69POSITION-DONE ŠCMP.W‚#IOREAD,FATIOS+IOSFCT(A4)ŠBNE„FREC70MUSTBEUPDATE/*THIS IS READ RQUEST-MOVE DATA TO USER'S BUFFER**INDENTED LIST* COMPLETE RECORD READ REQUEST#*ALREADY POINTING AT-RECORD TO-READ* EXPAND SPACES?*‚YES,EXPANDIN-TEMP.BUFFER$*„SET-FORBUFFEROVERFLOWIF-TOO-BIG* SHOULD KEY-BE RETURNED?*‚NO,POINTPASTKEY* WILL-REC. FIT-IN USER BUFFER? *‚NO,RETURNNO.OFBYTESTHAT-FIT*ƒSET-UPFORBUFFEROVERFLOW*‚YES,RETURNENTIRERECORD* GO-TO I/O COMPLETION $FMRW31*INDENTED LIST END*ŠTST.W‚FCBDIR+DIRLRL(A2)‚VRL?ŠBNE.S‚FREC62NO*ŠADD.L‚#BCTFLD,A1‰YES-SKIPOVERBYTECOUNT(*IF READ IS FOR ASCII, FORMATTED, EXPAND4*…SPACESBEFORETRANSFERRINGTOUSER'SRECORDBUFFER.ŠCMP.B‚#SPOOLF,FCBDIR+DIRFIL(A2)SPOOLERFILE? ŠBEQ.S‚FREC62YES-FORCETOIMAGE-ŠBTSTW‚#IOPFORB,FATIOS+IOSOPT(A4)FORMATREQ?ŠBNE.S‚FREC62NO(ŠBTSTW‚#IOPASCB,FATIOS+IOSOPT(A4)ASCII?ŠBNE.S‚FREC62NO-DON'TEXPAND3*ASCII FORMAT-EXPAND SPACES BY MOVING DATA TO TEMP. *…BUFFER1ST*…D0=COMPRESSESRECORDLENGTH!*…A1=STARTOFDATAINDATABUFFER ŠCLR.L‚D3ŠMOVE.BFCBDIR+DIRKEY(A2),D3(ŠSUB.L‚D0,D3ŽD3=RECORDLENGTH-KEYLENGTH ŠNEG.L‚D3ŠMOVE.LVDTTMA(A6),A07ŠBSETW‚#VDFLTB,VDTFLG(A6)INDICATETEMP.BUFFERCHANGED%FREC60AƒMOVE.B(A1)+,D1‹GETDATABYTE ŠBMI.S‚FREC60CŒSPACECOMPRESSION7*CHAR. IS NOT SPACE-MOVE TO TEMP. BUFFER IF IT WILL FITFREC60AA‚CMP.L‚VDTTME(A6),A04ŠBHI.S‚FREC61TEMP.BUFFERFULL-GIVEBUFFEROVERFLOWŠMOVE.BD1,(A0)+/FREC60BƒSUB.L‚#1,D0ŽADJUSTNO.OFBYTESTOMOVEŠBNE.S‚FREC60AŠBRA.S‚FREC61CŒALLBYTSMOVED6*SPACE-COMPRESSION CHAR FOUND-EXPAND INTO TEMP. BUFFER FREC60CƒEQU„*&ŠCMP.L‚D3,D0ŽDON'TDOEXPANSIONIFKEYŠBHI.S‚FREC60AAŠAND.W‚#$7F,D1ŠBEQ.S‚FREC60BŒ0SPACESFREC60EƒCMP.L‚VDTTME(A6),A0ŠBHI.S‚FREC61BUFFEROVERFLOWŠMOVE.B#'',(A0)+ŠDCNTƒD1,FREC60E"ŠBRA.S‚FREC60BŒALLSPACESEXPANDED-*ALL DATA CANNOT BE MOVED TO TEMPORARY BUFFER*…MUSTGIVEBUFFEROVERFLOWFREC61„MOVE.L#NL+ISTABO,D2'*CALCULATE NO. OF BYTES IN TEMP. BUFFERFREC61CƒMOVE.LVDTTMA(A6),A1 ŠSUB.L‚A1,A0ŠMOVE.LA0,D0ŽD0=LENGTHOFDATA FREC62„EQU„*ŠIFEQƒFMSLEVEL-33*IF INDEXED SEQUENTIAL FILE AND READ RECORD WITHOUT6*…KEYOPTIONSSET,ADJUSTPOINTERSSOKEYNOTRETURNEDŠCMP.B‚#DATSEQ,D5ŠBEQ.S‚FREC63SEQQUENTIALFILE-ŠBTSTW‚#IOPNOKB,FATIOS+IOSOPT(A4)RETURNKEY?ŠBNE.S‚FREC63YES*DON'T RETURN KEY ŠCLR.L‚D1+ŠMOVE.BFCBDIR+DIRKEY(A2),D1GETKEYLENGTH%*SUBTRACT KEY SIZE FROM RECORD LENGTH#ŠADD.L‚D1,A1ŽADDTOSTARTOFRECORD ŠSUB.L‚D1,D0 ŠBCC.S‚FREC63(*IF FEWER BYTES IN FILE THAN KEY LENGTH,*…SETLENGTHTO0 ŠCLR.L‚D0ŠENDCFREC63„CMP.L‚D0,D4ŠBCC.S‚F REC65BUFFERBIGENOUGH**ENTIRE RECORD WILL NOT FIT IN USER BUFFER'*…RETURNWHATWILLWITHBUFFEROVERFLOW*ŠMOVE.LD4,D0ŽD0=NO.OFCHARS.TOTRANSFER.ŠMOVE.L#NL+ISTABO,D2†INDICATEBUFFEROVERFLOW!FREC65„BSR„SMOVE4SETUPL-LMOVE2ŠMOVE.LD0,MVLENG(A0)†D0=NO.OFCHARS.TOTRANSFER ŠMOVE.LD0,D4ŠBEQ.S‚FREC68NODATATOMOVE#ŠMOVE.LA1,MVSADD(A0)†STARTOFREC.0ŠMOVE.LFATIOS+IOSSAD(A4),MVDADD(A0)USERBUFFERŠERQ.MOVELL(A0)!ŠBEQ.S‚FREC68MOVEWASSUCCESSFUL#ŠCMP.B‚#RTCDADR2,D0‡WRITEPROECTED?#ŠBEQ„IOSER2YES-INVALIDDATABUFFER ŠBSR„FTL.T*…D2.B=1IFRECORDOVERFLOW'*…D4.L=NO.OFBYTESTRANSFERRED/DELETED/FREC68„MOVE.LD4,D0ŽD0=NO.OFBYTESTRANSFERRED;FREC68BƒBSETW‚#FAFLRB,FATFLG(A4)INDIDATEREC.I/OCOMPLETE)ŠBRA„FMRW31GOUPDATEUSER'SLENGTHFIELD8*FOR POSITION REQUEST, RETURN OFFSET TO RECORD IN BUFFERFREC69„MOVE.LA1,D0ŠSUB.L‚FATSBS(A4),D0*…D0=OFFSETTORECORDŠBRA.S‚FREC68BŠPAGE**RECORD SHOULD BE UPDATED*„D0=OLDRECOREDLENGTH*…D4=NEWRECORDLENGTH6*…D7=USERRECORDLENGTH(.GT.D4IFSPACECOMPRESSION)*…D5.B=FILETYPE#*…A1=POINTERTOBEGINNINGOFRECORD**INDENTED LIST(* FREC70 COMPLETES RECORD UPDATE REQUEST*FREC70* SEQUENTIAL FILE? *‚YES,RECORDSMUST-BESAME-.LEN.*‚NO,KEYSMUSTBESAME* NEW-REC. LENGTH= OLD?*‚YES,UPDATERECORD$MVEDTA*ƒGOFINISH-I/OREQUEST$FMRW31!*‚NO,NEWRECORDSMALLERTHAN-OLD?*ƒYES,UPDATERECORD$MVEDTA*„REMOVEEXTRASPACE$CMPRDB"*…NO,GOFINISH-I/OREQUEST$FMRW31*ƒGO-TORECORDINSERT$FREC175*INDENTED LIST END* FREC70„EQU„*ŠIFEQƒFMSLEVEL-3ŠCMP.B‚#DATSEQ,D5ŠBNE.S‚FREC705ŒMUSTBEINDEXEDŠENDC *************-*MAKE SURE FILE ASSIGNED EREW IF DOING UPDATEŠMOVE.WFATASN(A4),D1ŠAND.W‚#FAPBIT,D1ŠCMP.B‚#FOPEREW,D1ŠBNE„IOSER4INVALIDFUNCTION ŠCMP.L‚D0,D45ŠBNE„IOSER2NOTSAMELENGTH-INVALIDDATABUFFERADDR. ŠBRA.S‚FREC75ŠIFEQƒFMSLEVEL-3'*INDEXED FILE-MAKE SURE NEW KEY=OLD KEY"*…MOVENEWKEYTOFMSTEMP.BUFFER0*FOR INDEXED FILE, NEW RECORD LENGTH NEED NOT BE*…SAMEASOLDRECORDLENGTH FREC705ƒEQU„*$ŠMOVE.LD0,D1ŽSAVEOLDRECORDLENGTHŠMOVE.LVDTTMA(A6),A0 ŠBSR„MVEKEY*…D2=KEYLENGTH*…A0=STARTOFKEY#ŠBEQ.S‚FREC72KEYMOVEDTOFMSAREAŠENDCFREC71„CMP.B‚#RTCDADR1,D0*ŠBEQ„IOSER2BUFFERNOTINUSERADDR.SPACE ŠBSR„FTL.TŠIFEQƒFMSLEVEL-3?*OKAY TO MOVE KEY TO TEMP. BUFFER AND NOT FLAG SINCE IT IS ONLY(*…OVERLAYINGITSELFIFSPACECOMPRESSIONFREC72„BSR„CMPKEYŠBNE„IOSER12ŒKEYSDON'TMATCH*…D2ANDA0ALTERED ŠBTSTW‚#0,D1 ŠBEQ.S‚FREC74,ŠADD.L‚#1,D1ŽFORCERECORDLENGTHEVENIFNOT)FREC74„MOVE.LD4,D6ŽGETNEWRECORDLENGTH ŠBTSTW‚#0,D6ŠBEQ.S‚FREC745ŠADD.L‚#1,D6ŽFORCEEVENFREC745ƒCMP.L‚D1,D6,ŠBEQ.S‚FREC75NOWREC.LENGTH=OLDRECLENGTH(ŠBHI.S‚FREC80NEWRECORDBIGGERTHANOLD**NEW RECORD SMALLER THAN OLD-MOVE NEW DATA)*…TODATABLOCKANDCOMPRESSUNUSEDBYTES ŠBSR„MVEDTAŠBNE.S‚FREC71ERRORONL-LMOVE&*CALCULATE NO. OF BYTES TO BE RELEASED ŠMOVE.LD1,D0&ŠSUB.L‚D6,D0ŽD0=NO.OFBYTESTODELETEŠADD.L‚#1,A1ŽPOINT1PASTEORŠBRA„FREC125ŒGOCOMPRESS)*OKAY TO UPDATE RECORD-MOVE TO DATA BLOCKŠENDCFREC75„BSR„MVEDTAŠBNE.S‚FREC71ERRORONL-LMOVE*INDICATE FAB SHOULD BE CHECKEDFREC78„BSETW‚#FAFLCB,FATFLG(A4)+ŠBCLRW‚#FAFLUB,FATFLG(A4)CLEARUPDATEFLAGŠCLR.B‚D2‘NOBUFFEROVERFLOW ŠBRA„FREC68ŠIFEQƒFMSLEVEL-32*NEW RECORD BIGGER THAN OLD-MUST EXPAND DATA BLOCK FREC80„EQU„* ŠMOVE.LD6,D00ŠSUB.L‚D1,D0ŽD0=NO.OFADDITIONALBYTESREQUIRED(*MUST CALCULATE BEGINNING OF NEXT RECORD ŠMOVE.LA1,A0ŠTST.W‚FCBDIR+DIRLRL(A2) ŠBNE.S‚FREC82ŠADD.L‚#BCTFLD,D1*FREC82„ADD.L‚D1,A0ŽA0=STARTOFNEXTRECORD ŠBRA„FREC175ŠENDCŠPAGE*(*RECORD WRITE REQUEST-SEE IF RECORD WILL*…FITINEXISTINGDATABLOCK$*…A1=POINTERTOSTARTOFLASTRECORD*…D0=RECORDLENGTH*…D3.B=TYPEOFWRITE*…D4=RECORDLENGTH*†D5.W=TYPEOFFILE6*…D7=USERRECORDLENGTH(.GT.D4IFSPACECOMPRESSION)2*CALCULATE NO. OF AVAILABLE BYTES IN DB (=SBE-SBL)+*MUST MAKE  SURE KEYS ARE IN ASCENDING ORDER**INDENTED LIST'* FREC90 COMPLETES RECORD WRITE REQUEST*FREC90* INDEXED SEQUENTIAL FILE?*‚YES,WRITEAT-ENDOF-FILE?*ƒYES,KEYSMUST-BEASCENDING*„$MVEKEY,$CMPKEY*…GO-TORECORDINSERT$FREC175*ƒNO,KEYSMUSTBESAME *„WRITENEXT?*…YES,POINTTO-NEXTRECORD*†GO-TORECORDINSERT$FREC175*‚NO,SUFF.ROOM-FORRECORD?*ƒNO,ALLOC.MORE-SPACE$FSALLC*‚MOVE-REC.TO-BUFFER$MVEDTA*ƒZERO-2BYTESAFTERRECORD*‚GOCOMPLETEREC.-I/O$FMRW31*INDENTED LIST END* FREC90„EQU„*ŠIFEQƒFMSLEVEL-3ŠCMP.B‚#DATSEQ,D5‰SEQUENTIAL?ŠBEQ.S‚FREC91BŒYES-NOKEYŠMOVE.LVDTTMA(A6),A0 ŠBSR„MVEKEY*…D2=KEYLENGTH*…A0=STARTOFMOVEDKEYŠBNE„FREC71L-LMOVEERRORH*KEY MOVED TO TEMP. BUFFER BUT JUST OVERLAYS RECORD IS DOING SPACE COMP. ŠTST.B‚D3ŠBNE„FREC190ŒWRITEINMIDDLE6*FOR WRITE AT END, MAKE SURE NEW KEY .GT. EXISTING KEYŠCMP.B‚#DATISD,D5ŠBEQ.S‚FREC91DUPLICATEINDEX ŠBSR„CMPKEY ŠBCC„IOSER12ŒKEYOUTOFSEQUENCEŠBRA.S‚FREC91B3*OKAY IF NEW KEY .GE. OLD KEY FOR DUPLICATE INDEXEDFREC91„BSR„CMPKEY ŠBHI„IOSER12ŠENDC FREC91BƒEQU„*B*FOR SEQUENTIAL FILE, MUST DETERMINE IF ENOUGH SPACE IN DATE BLOCK*…TOADDRECORDŠCMP.B‚#DATSEQ,D5ŠBNE.S‚FREC92AŠMOVE.LFATSBE(A4),D0ŠSUB.L‚FATSBL(A4),D0ŠBEQ.S‚FREC100ŒNOSPACELEFT.*IF VRL, ADJUST FOR LENGTH OF BYTE COUNT FIELDŠTST.W‚FCBDIR+DIRLRL(A2) ŠBNE.S‚FREC92ŠSUB.L‚#BCTFLD,D0FREC92„CMP.L‚D4,D0-ŠBCS.S‚FREC100ŒNOTENOUGHROOMINDATABUFFER FREC92AƒEQU„*ŠMOVE.LFATSBL(A4),A1)FREC93„ADD.L‚#1,A1ŽA1=STARTOFNEWRECORD2ŠADD.L‚#1,FATCLR(A4)†ADJUSTCLRFORRECORDWRITTENŠIFEQƒFMSLEVEL-3"ŠCMP.B‚#DATSEQ,D5‰SEQUENTIALFILE?ŠBNE„FREC173ŒNOŠENDC+*YES-RECORD WILL FIT IN DATA BUFFER-MOVE IN*…A1=WHERETOSTORERECORD*…D4=COMPRESSEDRECORDLENGTH*…D7=USERRECORDLENGTH ŠBSR„MVEDTAŠBNE„FREC71L-LMOVEERROR0*ZERO 2 BYTES BEYOND END OF RECORD UNLESS AT ENDŠCMP.L‚FATSBE(A4),A1ŠBCC.S‚FREC97ATEND'ŠCLR.W‚1(A1)ŽA1POINTSTOENDOFRECORD&FREC97„MOVE.LA1,FATSBL(A4)†UPDATESBL*UPDATE END OF FILE INFO. ŠMOVE.L#1,D0 ŠBSR„UPDEOR ŠBSR„UPDEOF*D0 ALTERED ON RETURN ŠBRA„FREC78<*NOT ENOUGH ROOM IN EXISTING DATA BLOCK-ALLOCATE ANOTHER ONEFREC100ƒBSR„FSALLC ŠBNE„IOSERR4ŠMOVE.LFATSLS(A4),FATCLS(A4)SETCLS=STARTOFBLOCKŠMOVE.LFATSBS(A4),A1 ŠSUB.L‚#1,A1ŠMOVE.LA1,FATSBL(A4)†INIT.SBLŠBRA„FREC93MOVERECORDTODBŠPAGEŠIFEQƒFMSLEVEL-3**DELETE LOGICAL RECORD REQUEST*…D0.L=RECORDLENGTH*…A1=POINTERTOSTARTOFRECORD:*SET UP TO REMOVE SPACE WHERE RECORD TO BE DELETED RESIDED**INDENTED LIST)* FREC120 COMPLETES DELETE RECORD REQUEST*FREC120* SUBTRACT ONE-FROM EOR $UPDEOR!* REMOVE SPACE FOR-RECORD $CMPRDB* GO-TO I/O COMPLETION $FMRW31*INDENTED LIST END* FREC120ƒEQU„*ŠMOVE.LD0,D4ŽSAVEBYTECOUNT+ŠMOVE.L#-1,D0SUBTRACT1FROMRECORDINFO. ŠBSR„UPDEOR1ŠBSETW‚#FAFLLB,FATFLG(A4)INDICATERECORDDELETED$*ACCOUNT FOR BYTE COUNT FIELD IF VRL ŠMOVE.LD4,D0ŠTST.W‚FCBDIR+DIRLRL(A2)ŠBNE.S‚FREC125ŒFRLŠADD.L‚#BCTFLD,D0<*COMMON PROCESSING FOR DELETE AND UPDATE WITH SHORTER RECORD0FREC125ƒBSR„CMPRDBREMOVERECORDFROMDATABLOCK ŠBNE.S‚FRERR ŠBRA„FREC78ŠPAGE*1*RANDOM RECORD REQUEST-FIND POSITION OF REQUESTED*…RECORDBASEDONKEY)*…FUNCTIONVALIDONLYFORKEYSIZE.GE.20*USER RECORD LENGTH ALREADY CHECKED TO MAKE SURE*…BIGENOUGHTOHOLDKEY*…MOVEKEYTOTEMPOARYBUFFER*…D4=RECORDLENGTH*…D5.W=TYPEOFASSIGNEMTN**INDENTED LIST)* FREC150 COMPLETES RANDOM RECORD REQUEST*FREC150* FIND-POS. FOR RECORD $FNDKEY* WRITE REQUEST?"*‚NO,ERRORIF-RECORDDOESN'TEXIST**ƒGO-COMPLETEREAD,UPDATEPOSITION,DELETE *‚YES,EOF? *ƒYES,MUST-ALLOC.SPACE$FSALLC*ƒNO,RECORDEXIST?*„YES,ERRORUNLESSDUPLICATES*‚GOFINISHINSERT$FREC175*INDENTED LIST END* FREC150ƒEQU„*.*MOVE KEY TO EXTRA SECTOR AT END OF DATA BLOCKŠMOVE.LFATSBE(A4),A0 ŠADD.L‚#1,A0 ŠBSR„MVEKEY*…D2=KEYLENGTHŠBNE„FREC71BADMOVEŠMOVE.LA0,A3ŽA3=ADDR.OFKEY ŠBSR„F NDKEYFINDRECORDWITHKEY#*…A1=POINTERTOBEGINNINGOFRECORD2* IF READ/DELETE/UPDATE REQUEST, RECORD MUST EXIST'ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)WRITE?ŠBEQ.S‚FREC170ŒYES;*SET CLR 1ST SO THAT IF RECORD DOESN'T EXIST, CLR POINTS TO*…NEXTRECORDINSEQUENCEŠMOVE.LFATSLS(A4),FATCLS(A4)ŠMOVE.LD1,FATCLR(A4)†SAVECLR0ŠBCLRW‚#FAFLLB,FATFLG(A4)CLEARREC.DELETEFLAGŠCMP.B‚#ISTARE,D0‰RECORDEXIST?ŠBNE.S‚FRERRŽNO-MAKEI/OERROR**GO PROCESS READ/UPDATE/ OR DELETE REQUEST ŠCLR.L‚D0.ŠMOVE.WFCBDIR+DIRLRL(A2),D0GETRECORDLENGTHŠBEQ„FREC59VRL ŠBRA„FREC60ŠPAGE=*RANDOM WRITE REQUEST-MAKE SURE RECORD WITH GIVEN KEY DOESN'T)*…ALREADYEXISTUNLESSDUPLICATESALLOWED*…D4=COMPRESSEDRECORDLENGTH*…D5.W=TYPEOFASSIGNMENT*…D7=USERRECORDLENGTH#*…A1=POINTERTOBEGINNINGOFRECORDFREC170ƒCMP.B‚#ISTAEOF,D00ŠBEQ„FREC100ŒNOTHINGINFILE-MUSTALLOCATESPACEŠCMP.B‚#ISTARE,D0‰RECORDEXIST?ŠBNE.S‚FREC171ŒNO#*YES:OKAY IF DUPLICATE KEYS ALLOWEDŠCMP.B‚#DATISD,D5ŠBEQ.S‚FREC172ŒDUPLICATESOKAY FREC171ƒEQU„*ŠCMP.B‚#ISTARN,D0ŠBEQ.S‚FREC172FRERR…BRA„IOSERR4FREC172ƒMOVE.LD1,FATCLR(A4)†SAVECLRFORNEWRECORDŠMOVE.LFATSLS(A4),FATCLS(A4)0ŠBCLRW‚#FAFLLB,FATFLG(A4)CLEARREC.DELETEFLAG5*COMMON PROCESSING FOR WRITE RANDOM AND WRITE LOGICAL*FREC173ƒMOVE.LA1,A0ŽA1,A0=INSERTPOSITION ŠMOVE.LD4,D0ŠTST.W‚FCBDIR+DIRLRL(A2)‚VRL?ŠBNE.S‚FREC175'ŠADD.L‚#BCTFLD,D0‰ADJUSTFORBYTECOUNT?*COMMON PROCESSING FOR RECORD WRITE AND UPDATE IF BIGGER RECORD*…D0=NO.OFBYTESTOEXPAND*…A0=POINTOFEXPANSION*…A1=STARTOFRECORD**INDENTED LIST0* FREC175 COMPLETES RECORD INSERT/UPDATE REQUEST*FREC175* MAKE-ROOM FOR-RECORD $EXPNDB* MOVE-DATA TO-RECORD $MVEDTA* WRITE REQUEST?*‚YES,ADD1-TO-EOR$UPDEOR!* UPDATE KEY-IF NECESSARY $PUTKEY!* UPDATE FAB-IF NECESSARY $UPCFAB* DO-I/O COMPLETION $FMRW31*INDENTED LIST END* FREC175ƒEQU„* ŠBSR„EXPNDB*ŠBNE.S‚FRERRŽCOULDN'TFINDROOMFORRECORD*MOVE RECORD INTO DATA BLOCK ŠBSR„MVEDTAŠBNE„FREC71ERRORONL-LMOVE.*ACCOUNT FOR ONE RECORD ADDED IF WRITE REQUEST ŠCMP.W‚#IOWRIT,FATIOS+IOSFCT(A4)ŠBNE.S‚FREC178ŒNOTWRITE ŠMOVE.L#1,D0 ŠBSR„UPDEOR(*DETERMINE TYPE OF UPDATE REQUIRED BASED*…OND1RETURNFROMEXPNDB FREC178ƒEQU„*%ŠCLR.B‚D2‘INDICATENOBUFFEROVERFLOW ŠTST.L‚D1ŠBEQ„FREC78UPDATEDONE#ŠSUB.B‚#1,D1ŽCALLPUTKEY?(D1=1?)ŠBNE.S‚FREC179ŒNO*MUST CALL PUTKEY ŠBSR„PUTKEY ŠBNE.S‚FRERR ŠBRA„FREC78.FREC179ƒCLR.L‚D0‘UPDATEDATABLOCK'SLASTKEY?ŠSUB.B‚#1,D1Ž.(D1=2?)ŠBEQ.S‚FREC180ŒYES8ŠMOVE.L#1,D0ŽNO,FLAGTOLEAVEKEYFIELDALONE(D1=3)7FREC180ƒBSETW‚#FAFLUB,FATFLG(A4)SETFLAGTOUPDATEFABŠBCLRW‚#FAFLCB,FATFLG(A4) ŠBSR„UPCFAB ŠBNE.S‚FRERR ŠBRA„FREC68ŠPAGE*'*LOGICAL RECORD WRITE TO MIDDLE OF FILE*…CLR=POINTERTOCURRENTRECORD>*…D0=RECORDLENGTHOFEXISTINGRECORDWHEREINSERTISTOOCCUR*…D3.B=TYPEOFWRITE*…D4=NEWRECORDLENGTH#*…A1=POINTERTOBEGINNINGOFRECORD2*MAKE SURE KEY IN NEW RECORD=KEY IN CURRENT RECORD FREC190ƒEQU„* ŠBSR„CMPKEYŠBNE„IOSER12ŒKEYSDON'TMATCH<*IF WRITE NEXT REQUEST, POSITION TO BEGINNING OF NEXT RECORD ŠCMP.B‚#1,D3 ŠBNE„FREC1732ŠADD.L‚#1,FATCLR(A4)†SETCURRENTRECORDTONEWONE ŠCLR.L‚D0.ŠMOVE.WFCBDIR+DIRLRL(A2),D0GETRECORDLENGTHŠBNE.S‚FREC195ŒFRL7ŠMOVE.W(A1)+,D0‹GETRECORDLENGTH-SKIPOVERBYTECOUNT ŠBTSTW‚#0,D0ŠBEQ.S‚FREC195$ŠADD.L‚#1,D0ŽFORCEEVENNO.OFBYTES(FREC195ƒADD.L‚D0,A1ŽPOINTTONEXTRECORD ŠBRA„FREC173ŠPAGEŠENDCƒFMSLEVEL-3ŠENDCƒFMSLEVEL-1*.*IREWIND-REWIND FILE-SET POINTERS TO BEGINNING*…A2=FCBADDR.*…A4=FATADDR.*…A6=VDTADDR.(*…A5=ADDR.OFUSERIOSBLOCKINFMSAREA**INDENTED LIST* IREWIND REWINDS FILE*IREWIND"* UPDATE ALL-INFO. ON-DISK $PUTALL$* SET-FILE PTRS.TO BEGINNING $SETBEG*INDENTED LIST END* IREWINDƒEQU„*ŠIFGTƒFMSLEVEL-1ŠBSR„ATTIOBATTACHTOSEGMENTŠENDC%ŠBSR„PUTALLUPDATEEVERYTHINGONDISK ŠBNE.S‚IOSERR**SET FILE POINTERS TO BEGINNING* ŠBSR„SETBEG*…D0=1ONRETURNŠBRA.S‚IOSGRT MAKEGOODRETURNŠNOPŠPAGE$*SET UP TO MAKE GOOD RETURN FROM IOS*…A2=FCBADDR.*…A4=FATADDR.*…A6=VDTADDR. IOSGRT„EQU„* ŠCLR.L‚D1#*COMMON GOOD/BAD PROCESSING FOR IOS(IOSRTN„BSR„CLRIOPCLEARI/OPENDINGFLAG*…A0ANDD0AREALTEREDŠMOVE.LFATTSK(A4),D2ŠMOVE.LFATSES(A4),D3ŠMOVE.L#IOSTIN,D4ŠMOVE.LFATUPB(A4),A1,ŠMOVE.BFATIOS+IOSSTA(A4),D5SAVEOLDSTATUSE*IF PROCEED I/O, STATUS MUST BE UPDATED SO SET TO $81 TO FORCE UPDATE!ŠBTSTW‚#IOPWATB,FATIOS+IOSOPT(A4)ŠBEQ.S‚IOSRT10ŒWAITI/O&ŠMOVE.L#NL+$81,D5‰FORCESTATUSUPDATE.IOSRT10ƒBRA„FMSRTNGOFINISHRETURNPROCESSINGŠPAGE*-*SET UP TO MAKE ERROR RETURN FROM IOS REQUEST*…A2=FCBADDR.*…A4=FATADDR.*…A6=VDTADDR.*.IOSER1„MOVE.L#NL+ISTAPC,D0†PROTECTCODEERRORIOSERR„CLR.L‚D1 ŠMOVE.BD0,D1 ŠBRA.S‚IOSRTN4IOSER2„MOVE.L#NL+ISTAADD,D0…INVALIDDATABUFFERADR ŠBRA.S‚IOSERR9IOSER3„MOVE.L#NL+ISTAIP,D0†INVALIDPARAMETERBLOCKADDR. ŠBRA.S‚IOSERR,IOSER4„MOVE.L#NL+ISTAIF,D0†INVALIDFUNCTION ŠBRA.S‚IOSERR*IOSER6„MOVE.L#NL+ISTAEOV,D0…ENDOFVOLUME ŠBRA.S‚IOSERR(IOSER7„MOVE.L#NL+ISTAEOF,D0…ENDOFFILE ŠBRA.S‚IOSERR1IOSER8„MOVE.L#NL+ISTARR,D0†INVALIDRANDOMRECORD ŠBRA.S‚IOSERR2IOSER10ƒMOVE.L#NL+ISTARE,D0†RECORDALREADYEXISTS ŠBRA.S‚IOSERR#IOSER11ƒBSR„ISTAIERR‹INTERNALERROR ŠBRA.S‚IOSERR&IOSER12ƒMOVE.L#NL+ISTAKY,D0†KEYERROR ŠBRA.S‚IOSERR2IOSER13ƒMOVE.L#NL+ISTASC,D0†DEVICESTATUSCHANGED ŠBRA.S‚IOSERR5IOSER14ƒMOVE.L#NL+ISTAUF,D0†UNRECOVERABLEFILEERROR ŠBRA.S‚IOSERRŠENDééééé**ˆCONDITIONALASSEMBLY*FMSLEVEL EQU 3 ALL FILE TYPESééé éééé”=/* =/*†FUTY.AF=/*"=/* Chain file to assemble FUTY.SA=/*:=/* If no output argument is specified for the listing the&=/* chain file will default to FUTY.LS=/*=/IFC \1 ƒ=ARGFUTY.LS=/ENDIF=/*&=ASM FMSI.SA/FUTY.SA,FUTY.RO,\1;RZ=186=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.FMI.EQ=/*ƒ9995.&.UTILITY.MC=/*}=/*=ENDééééééŠPAGE**ˆMODIFICATIONHISTORY* *ˆ03/05/84>*ˆMadeanextraentrypoint(DOIO2)intheDOIOroutine.‚DOIO2@*ˆwillnotforcetheproceedbiton,itwillleavethebitasit=*ˆwaswhenthecallwasmade.‚Afterthecall,theproceedbitC*ˆittested.‚IfconditionsindicatethatI/Owaitwasdesired,thenA*ˆreturnismadeimmediatelytopointofcallinsteadofstacking=*ˆregistersandwaitingforeventasisdoneforI/Oproceed.* *ˆ08/31/84A*ˆModificationsrequiredtoconvertFMSintoa RealTimeTask.‚In?*ˆthecaseofFUTY,thechangesrequiredaretheremovalofthe.*ˆWTEVNTdirectivefromtheDEVBSYsubroutine.*ŠPAGEŠNOLISTŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.EXE.EQŠINCLUDE9995.&.NIO.EQŠINCLUDE9995.&.TR1.EQŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.FME.EQŠINCLUDE9995.&.FMI.EQŠINCLUDE9995.&.UTILITY.MCŠLIST*‰INCLUDE9995.&.IOE.EQ*‰INCLUDE9995.&.EXE.EQ*‰INCLUDE9995.&.NIO.EQ*‰INCLUDE9995.&.TR1.EQ*‰INCLUDE9995.&.TR1RTCD.EQ*‰INCLUDE9995.&.FME.EQ*‰INCLUDE9995.&.FMI.EQ*‰INCLUDE9995.&.UTILITY.MC***FMS UTILITIES* ŠSECTION0 ŠDC.Bƒ'FUTY'ŠDC.Lƒ'0315844'UTY‡IDNTƒ4,2FMSUTILITIES ŠXDEFƒACKREQ ŠXDEFƒCALREC ŠXDEFƒCHKAP ŠXDEFƒCHKASC ŠXDEFƒCHKASN ŠXDEFƒCHKMA ŠXDEFƒCHKPRM ŠXDEFƒCHKRC ŠXDEFƒCHKSPL ŠXDEFƒCHKWAP ŠXDEFƒCHKWC ŠXDEFƒCHKWPD ŠXDEFƒCLRIOP ŠXDEFƒDEVBSY ŠXDEFƒDEVFRE ŠXDEFƒDMOVE ŠXDEFƒDOIO ŠXDEFƒDOIO2 ŠXDEFƒFMSASN ŠXDEFƒGENNME ŠXDEFƒGETATT ŠXDEFƒGETDCQ ŠXDEFƒGETFAT ŠXDEFƒGETFCB ŠXDEFƒGETFCBS ŠXDEFƒGETLUT ŠXDEFƒMOVE2UŠXDEFƒMOVENAME ŠXDEFƒMVEFNM ŠXDEFƒRELAPF ŠXDEFƒRELFAT ŠXDEFƒRELFCB ŠXDEFƒRELLUN ŠXDEFƒRELLUNR ŠXDEFƒSETBEG ŠXDEFƒSETPTR ŠXDEFƒSMOVE4 ŠXDEFƒSMOVEA ŠXDEFƒSRCDV ŠXDEFƒSRCFCB ŠXDEFƒSUASQ ŠXDEFƒUSNCHK ŠXDEFƒVALFNM ŠXDEFƒVALUSN ŠXDEFƒVALVOL ŠXDEFƒZERPTR ŠXREFƒACKBLK ŠXREFƒDTABLK ŠXREFƒDVEND ŠXREFƒDVSTR ŠXREFƒEXTSTR ŠXREFƒFATEND ŠXREFƒFATSTR ŠXREFƒFCBEND ŠXREFƒFCBSTR ŠXREFƒFHSFLG ŠXREFƒFHSQUE ŠXREFƒFMSAP ŠXREFƒFMSASQ ŠXREFƒFMSASQ1Ÿ¦h¯g·J¿UÇJÏR×VßHçHïY÷aÿ]ZZEJ'F/Q7V?NGVOZWK_Qg0o:w@K‡DO ŠXREFƒFMSASR ŠXREFƒFMSBLK ŠXREFƒFMSBLK1 ŠXREFƒFMSFCBA ŠXREFƒFMSREV ŠXREFƒFMSSEG ŠXREFƒFTL.EQ ŠXREFƒFTL.HI ŠXREFƒFTL.NE ŠXREFƒFTL.T ŠXREFƒGETVID ŠXREFƒGPTSEC ŠXREFƒIOCEVT ŠXREFƒIOCOMS ŠXREFƒMOVBLK ŠXREFƒQIOBLK ŠXREFƒSAVESP ŠXREFƒSEGBLK ŠXREFƒSEGBLK2 ŠXREFƒSEGBLK3 ŠXREFƒSEGBLKO ŠXREFƒSEGBLKS ŠXREFƒSYSPACE ŠXREFƒTDBLK ŠXREFƒVDTEND ŠXREFƒVDTSTR ŠXREFƒWUBLKŠIFGTƒFMSLEVEL-1 XDEFƒATTIOB XDEFƒATTIOBO XDEFƒCALSEC XDEFƒCMPSPC XDEFƒGETIOB XDEFƒMVEDTA XDEFƒMVEREC XDEFƒRELIOB XDEFƒUPDEOF XDEFƒUPDEOR XREFƒDBCHG XREFƒFABCHGŠENDCŠIFEQƒFMSLEVEL-3 XDEFƒCMPKEY XDEFƒMVEKEYŠENDCŠPAGE* *SRCDV 1.00 12/4/79 L. STEINHOFF*,*SRCDV SEARCHES FOR REQUESTED DEFAULT VOLUME* *ON CALL:*…D1=REQUESTEDDEFAULTVOLUME*‡('SYST'->SYSTEM*ˆ'SPOL'->SPOOLERFILE*ˆ'TEMP'->TEMPORARYFILE *ˆSESSIONNO. *…BSRSRCDV* *ON RETURN:*…CARRY=0IFENTRYFOUND*Š=1IFDEFAULTNOTFOUND*…D0=FOUNDVOLUMEID*…D1=UNCHANGED*…A0=ADDR.FORFOUNDENTRY&*…A0=ADDR.OFEMPTYENTRYIFNOTFOUND*‡=0IFNOAVAILABLEENTRY*INDENTED LIST-* SRCDV SEARCHES FOR REQUESTED DEFAULT VOLUME*SRCDV* REQUESTED DEFAULT FOUND?&*‚YES,RETURNVOLUME-IDAND-ENTRYADDR.*‚NO,EMPTYENTRYFOUND? *ƒYES,RETURNADDR.OFEMPTYENTRY*ƒNO,RETURNNO-EMPTYENTRIES*INDENTED LIST END SRCDV…EQU„*ŠMOVE.LA1,-(A7)&ŠSUB.L‚A1,A1ŽINIT.EMPTYENTRYPOINTER-ŠMOVE.LDVSTR,A0‹GETSTARTOFDEFAULTVOLUMES$SRCD05„TST.L‚DEFVOL(A0)‰EMPTYENTRY?ŠBNE.S‚SRCD10NOŠMOVE.LA0,A1ŽYES-SAVEADDR. ŠBRA.S‚SRCD20SRCD10„CMP.L‚DEFTYP(A0),D1ŠBNE.S‚SRCD20NOMATCH*DEFAULT FOUND-RETURN INFO.ŠMOVE.LDEFVOL(A0),D0ŠAND.B‚#$FE,SRŒCLEARCARRYSRCDRT„MOVE.L(A7)+,A1ŠRTSSRCD20„ADD.L‚#DVLEN,A0ŠCMP.L‚DVEND,A0‹DONE?ŠBLS„SRCD05NO*YES-MAKE ERROR RETURN$ŠMOVE.LA1,A0ŽA0=ADDR.OFEMTPRYSLOT ŠOR.Bƒ#1,SR ŠBRA.S‚SRCDRTŠPAGE *VALVOL 1.00 7-6-79 L. STEINHOFF*,*VALVOL CHECKS TO SEE IF SPECIFIED VOLUME ID*„ISDEFINEDINAVDT?*…AFTERLOOKINGUPDEFAULTVALUEIFVOLUMEPASSEDISALLSPACES<*IF DEFAULT IS TEMP. OR SPOOLER VOLUME AND IT DOESN'T EXIST, *TRY TO DEFAULT TO SYSTEM VOLUME3*…DEFAULTSTOUSERVOLUMEIFNOFILENAMESPECIFIEDB*DEFAULTS TO SYSTEM VOLUME IF USER NO. =0 UNLESS USER IS SUPERVISOR?*…INWHICHCASEDEFAULTSTOUSERVOLUME1ST,THENSYSTEMVOLUME* *ON CALL:*…A5=FHSPARAMETERBLOCK/*…A1=FMSASQADDR.WITHEVTSESANDEVTUNMSETUP *„BSRVALVOL* *ON RETURN*„Z=1IFVALIDVOLUMEID*…=0IFINVALIDVOLUMEID*„D0.B=0IFVALIDVOLUMEID*ˆ=FSTAVDLIFVOLUMENAMEERROR*…A5=UNCHANGED+*…FHSVOL(A5)=VOLUMEIDIFDEFAULTREQUESTED*…A6=VDTADDR.(=0IFNONE)***INDENTED LIST5* VALVOL VERIFIES THAT SPECIFIED VOLUME ID IS DEFINED*VALVOL* PASSED VOLUME-ID= SPACES?"*‚YES,GETDEFAULTVOLUME-ID$SRCDV* VOLUME-ID IN-VDT?*‚YES,RETURNVDT-ADDR.*‚NO,RETURNVOLUMENAME-ERROR*INDENTED LIST END* *‰FHSI/OEVENTMESSAGE(VALVOL)**‰----------------------*‰*”**‰----------------------**ƒ24„*‡EVTSES‡*‡REQUESTOR'SSESSIONNUMBER*‰*…(4BYTES)†**‰----------------------*ƒ28„*‡EVTUNM‡*‡USERNUMBER*‰----------------------*‡FHSPARAMETERBLOCK(VALVOL)*‰----------------------*‰*”**‰----------------------*ƒ6…*‡FHSVOL‡*‡VOLUMENAME*‰*…(4BYTES)†**‰----------------------*ƒ10„*‡FHSUSN‡*‡USERNUMBER*‰----------------------*‰*”**‰----------------------*ƒ20„*‡FHSFIL‡*‡FILENAME*‰*…(8BYTES)†**‰----------------------* VALVOL„EQU„*ŠMOVEM.LA0/D1,-(A7)ŠMOVE.LFHSVOL(A5),D0ŠBEQ„VALV20ERRORIFVOLUME=0ŠCMP.L‚#'„',D0ŠBNE.S‚VALV04A-*VOLUME IS ALL SPACES-MUST FIND DEFAULT VALUE#ŠCMP.B‚#'',FHSFIL(A5)„VOLUMEASSN?#ŠBEQ.S‚VALV01BŒYES-USEUSERDEFAULT'ŠCMP.B‚#TEMPF,FHSFIL(A5)‚TEMPORARYFILEŠBNE.S‚VALV01NO2ŠMOVE.L#TMPDEF,D1‰YES-SETUPTOFINDTEMP.VOLUMEVALV00„BSR„SRCDV*ŠBCS.S‚VALV01CŒNOTFOUND-USESYSTEMVOLUME ŠBRA.S‚VALV04-VALV01„CMP.B‚#SPOOLF,FHSFIL(A5)SPOOLERFILE?ŠBNE.S‚VALV01AŒNO2ŠMOVE.L#SPLDEF,D1‰YES-SETUPTOFINESPOOLERVOL. ŠBRA.S‚VALV00$VALV01AƒTST.W‚FHSUSN(A5)‰USERNO.=0?ŠBNE.S‚VALV01B+*USE DEFAULT SESSION NO. IF TASK USER NO.=0ŠTST.W‚EVTUNM(A1)ŠBEQ.S‚VALV01B0VALV01CƒMOVE.L#SYSDEF,D1‰YES-USESYSTEMDEFAULTŠBSR„SRCDVŽFINDSYSTEMDEFAULT ŠBCS.S‚VALV20 ŠBRA.S‚VALV04)VALV01BƒMOVE.LEVTSES(A1),D1†FINDDEFAULTŠBSR„SRCDVŽFINDDEFAULT ŠBCC.S‚VALV04=*USER DEFAULT NOT FOUND-USE SYSTEM DEFAULT IF TASK USER NO.=0ŠTST.W‚EVTUNM(A1)!ŠBEQ.S‚VALV01CŒTRYSYSTEMDEFAULTŠBRA.S‚VALV20NODEFAULT-ERROR*RETURN DEFAULT VALUE TO USERVALV04„MOVE.LD0,FHSVOL(A5) VALV04AƒEQU„*$ŠMOVE.LVDTSTR,A6ŠGETSTARTOFVDT'S2VALV05„CMP.L‚VDTVID+VIDVOL(A6),D0VOLUMEIDFOUND?ŠBNE.S‚VALV10N0*YES-MAKE GOOD RETURN ŠCLR.B‚D0VALVRT„MOVEM.L(A7)+,D1/A0ŠRTSVALV10„LEA„VDTLEN(A6),A6!ŠCMP.L‚VDTEND,A6ŠATENDOFTAB.E?ŠBLS.S‚VALV05NO*YES = MAKE ERROR RETURNVALV20„MOVE.L#FSTAVOL,D0ŠSUB.L‚A6,A6ŽINDICATENOVDT ŠBRA.S‚VALVRTŠPAGE *VALUSN 1.00 8/6/79 L. STEINHOFF*.*VALUSN SUBSTITUTES THE USERS LOGGED ON NUMBER'*„IFTHEUSERNO.PASSEDIS-1.‚IFTHE$*„USERNO.PASSEDIS-2,ANERRORIS *„RETURNED* *ON CALL:$*…A1=FMSASQADDR.WITHEVTUNMSETUP*„A5=FHSBLOCKPOINTER *„BSRVALUSN* *ON RETURN:*„Z=1IFNOERROR *…=0IFERROR*‚D0.B=0IFNOERROR5*…=FSTAFDIFINVALIDUSERNO.(FILEDESCRIPTORERROR)*„A5=UNCHANGED4*…FHSUSN(A5)=USERLOGGEDONNO.IFDEFAULTREQUESTED* *‰FHSI/OEVENTMESSAGE(VALUSN)**‰----------------------*‰*”**‰----------------------*ƒ28„*‡EVTUNM‡*‡USERNUMBER*‰----------------------*‡FHSPARAMETERBLOCK(VALUSN)*‰----------------------*‰*”**‰----------------------*ƒ10„*‡FHSUSN‡*‡USERNUMBER*‰----------------------** VALUSN„EQU„*ŠMOVE.WFHSUSN(A5),D0 ŠCMP.W‚#-1,D0 ŠBNE.S‚VALU10ŠMOVE.WEVTUNM(A1),FHSUSN(A5)VALURT„CLR.B‚D0ŠRTSVALU10„CMP.W‚#-2,D0 ŠBNE.S‚VALURT*USER NO. =-2 IS AN ERRORŠMOVE.L#FSTAFD,D0ŠRTSŠPAGE*D*USNCHK MAKES SURE FILE CAN BE ALLOCATED, WRITE ASSIGNED, OR DELETED*…ORRENAMEDFILE<*…BASEDONVOLUMEUSERNO.,TASKUSERNO.,ANDFILEUSERNO.* *RULES ARE:1*…1.‚IFVOLUMEUSERNO.=0,OKAYIFFILEUSERNO.="*‡TASKUSERNO.ORTASKUSERNO. =05*…2.‚IFVOLUMEUSERNO..NE.0OKAYIFTASKUSERNO.=8*‡VOLUMEUSERNO.ORTASKUSERNO.=0ANDFILEUSERNO.=0*‡ORVOLUMEUSERNO.* *ON CALL:*…D1.W=TASKUSERNO.*…A5=POINTERTOFHSBLOCK*…A6=POINTERTOVDT *…BSRUSNCHK* *ON RETURN:*…Z=1IFIFNOERROR *†=0IFERROR*…D0.B=0IFNOERROR*‰=FSTAPCIFPROTECTERROR*…D1,A5,A6=UNCHANGED**INDENTED LIST>* USNCHK MAKES SURE USER CAN ALLOCATE FILE ON VOLUME SPECIFIED*USNCHK* VOLUME USER NO.=0?*‚YES,OKAYIF-TASKUSER-NO.=0*ƒFILE-USERNO.=TASKUSERNO.?*„NO,RETURNPROTECTCODE-ERROR*‚NO,OKAYIF-TASKUSER-NO.=0!*ƒVOLUMEUSER-NO.=TASK-USERNO.?*„NO,RETURNPROTECTCODE-ERROR*„YES,OKAYIF-FILEUSER-NO.=0*…FILE-USERNO.=TASKUSER-NO.?*†NO,RETURNPROTECTCODE-ERROR*INDENTED LIST END**‡FHSPARAMETERBLOCK(USNCHK)**‰----------------------*‰*”**‰----------------------*ƒ10„*‡FHSUSN‡*‡USERNUMBER*‰----------------------* USNCHK„EQU„*/ŠMOVE.WVDTVID+VIDUSN(A6),D0D0=VOLUMEUSERNO. ŠBNE.S‚USNC058*VOLUME USER NO.=0--TASK 0 CAN PUT ANYTHING ON VOLUME 0.'*…OTHERUSERSCANPUTTHEIRFILESONITŠTST.W‚D1‘TASKUSERNO.=0?ŠBEQ.S‚USNGRTYES-OKAY)ŠCMP.W‚FHSUSN(A5),D1†FILEUSER=TASKUSER?ŠBEQ.S‚USNGRTYES-OKAYŠBRA.S‚USNERTNO-MUSTBEERROR3*VOLUME USER NO. .NE. 0--TASK USER NO. MUST BE 0 OR/*…=VOLUMEUSERNO.ANDFILEUSERNO.MUST=0OR*…VOLUMEUSERNO.USNC05„TST.W‚D1ŠBEQ.S‚USNC10TASKUSERNO.=0ŠCMP.W‚VDTVID+VIDUSN(A6),D1!ŠBNE.S‚USNERTNOTOWNEROFVOLUMEUSNC10„TST.W‚FHSUSN(A5)%ŠBEQ.S‚USNGRTFILEUSERNO.=0->OKAY3ŠCMP.W‚FHSUSN(A5),D0†FILEUSERNO.=VOLUMEUSERNO.?ŠBNE.S‚USNERTNO-NOTOWNERUSNGRT„CLR.B‚D0ŠRTSUSNERT„MOVE.L#FSTAPC,D0ŠRTSŠPAGE*-*MVEFNM MOVES USERNO. CATALOG, FILE NAME, AND!*„EXTENSIONFROMFHSBLOCKTOFCB* *ON CALL:*„A2=FCBADDR.*„A5=FHSADDR. *„BSRMVENME* *ON RETURN:*„A2,A5=UNCHANGED**‡FHSPARAMETERBLOCK(MVEFNM)**‰----------------------*‰*”**‰----------------------*ƒ10„*‡FHSUSN‡*‡USERNUMBER*‰----------------------*ƒ12„*‡FHSCLG‡*‡CATALOGNMAE*‰*…(8BYTES)†**‰----------------------*ƒ20„*‡FHSFIL‡*‡FILENAME*‰*…(8BYTES)†**‰----------------------*ƒ28„*‡FHSEXT‡*‡EXTENSION*‰----------------------** MVEFNM„EQU„*$ŠMOVE.WFHSUSN(A5),FCBSDB+SDBUSN(A2)$ŠMOVE.LFHSCLG(A5),FCBSDB+SDBCLG(A2)(ŠMOVE.LFHSCLG+4(A5),FCBSDB+SDBCLG+4(A2)$ŠMOVE.LFHSFIL(A5),FCBDIR+DIRFIL(A2)(ŠMOVE.LFHSFIL+4(A5),FCBDIR+DIRFIL+4(A2)$ŠMOVE.WFHSEXT(A5),FCBDIR+DIREXT(A2)ŠRTSŠPAGE *VALFNM 1.00 7-6-79 L. STEINHOFF*-*VALFNM CHECKS THE FILE NAME/EXTENSION FIELDS1*…FORVALIDITY.‚BOTHFIELDSMUSTBEALPHA-NUMERIC*…AND,NOTALLSPACES,*1ST CHAR OF FILE NAME MUST BE ALPHA,@, OR &$*1ST CHAR OF EXTENSION MUST BE ALPHA6*AND NO EMBEDDED SPACES (ONLY TRAILING SPACES ALLOWED)*8*CATALOG NAME IS ALSO CHECKED TO MAKE SURE ALPHA-NUMERIC*…ALLSPACESISVALID*…FIRSTCHAR.MUSTBEALPHAA-Z* *ON CALL:*„A5=FHSBLOCKPOINTER*„(DEFAULTSALREADYFILLEDIN) *„BSRVALFNM* *ON RETURN*„Z=1IFNOERROR *…=0IFERROR*„D0.B=0IFNOERROR*ˆ=FSTAFDIFSYNTAXERROR*…A5=UNCAHNGED**INDENTED LIST;* VALFNM CHECKS FOR LEGAL CATALOG, FILE NAME, AND EXTENSION*VALFNM* CHECK FOR VALID CATALOG*‚CATALOGALLSPACES?*ƒYES,GOODCATALOG*ƒNO,1STCHARALPHA?$CHKALP*„NO,RETURNFILE-DESC.ERROR%*„YES,CAT.ALL-ALPHANUMERIC?$CHKASC*…NO,RETURNFILE-DESC.ERROR* CHECK FOR VALID FILE-NAME"*‚1ST-CHAR=TEMP.-ORSPOOLERFILE?*ƒYES,MAKEGOODRETURN*ƒNO,1STCHAR.ALPHA?$CHKALP*„NO,RETURNFILE-DESC.ERROR%*„YES,FILENAME-ALLALPHANUM?$CHKASC*…NO,RETURNFILE-DESC.ERROR* CHECK-FOR VALID EXTENSION*‚1ST-CHAR.ALPHA?$CHKALP*ƒNO,RETURNFILE-DESC.ERROR%*ƒYES,EXT.ALL-ALPHANUMERIC?$CHKASC*„NO,RETURNFILE-DESC.ERROR*INDENTED LIST END***‡FHSPARAMETERBLOCK(VALFNM)**‰----------------------*‰*”**‰----------------------*ƒ12„*‡FHSCLG‡*‡CATALOGNMAE*‰*…(8BYTES)†**‰---------- ------------*ƒ20„*‡FHSFIL‡*‡FILENAME*‰*…(8BYTES)†**‰----------------------** VALFNM„EQU„*ŠMOVE.LA1,-(A7)ŠLEA„FHSCLG(A5),A1+ŠMOVE.W#CLGLEN,D0‰NO.OFBYTESFORCATALOGŠCMP.B‚#'',(A1)ŠBEQ.S‚VALF04CŒ1STCHAR=SPACE ŠBSR„CHKALP1STCHARMUSTBEA-Z ŠBRA.S‚VALF03VALF02„CMP.B‚#'',(A1)ŠSPACE?ŠBEQ.S‚VALF04CŒYES ŠBSR.S‚CHKASCVALF03„BCS.S‚VALFERŠDCNTƒD0,VALF02ŠBRA.S‚VALF04EVALF04CƒCMP.B‚#'',(A1)+ ŠBNE.S‚VALFERŠDCNTƒD0,VALF04C VALF04EƒEQU„*ŠLEA„FHSFIL(A5),A1,ŠMOVE.W#FILLEN,D0‰NO.OFBYTESINFILENAME*VALIDATE 1ST CHAR OF FILE NAMEŠCMP.B‚#SPOOLF,(A1)ŠBEQ.S‚VALFRTOKAYŠCMP.B‚#TEMPF,(A1)5ŠBEQ.S‚VALFRTOKAY-DON'TCHECKANYMOREFORTEMP.FILEŠBSR.S‚CHKALPMUSTBEA-Z ŠBRA.S‚VALF18'VALF10„CMP.B‚#'',(A1)ŠISCHARASPACE?ŠBEQ.S‚VALF25YES#ŠBSR.S‚CHKASCMAKESUREVALIDASCIIVALF18„BCS.S‚VALFERERROR)ŠDCNTƒD0,VALF10ŠFINISHCHECKINGFILENAME ŠBRA.S‚VALF30GOCHECKEXTENSION'VALF25„CMP.B‚#'',(A1)+‰CHECKFORSPACE&ŠBNE.S‚VALFERERRORIFNOTRESTSPACESŠDCNTƒD0,VALF25*NOW CHECK EXTENSION FIELDVALF30„MOVE.W#EXTLEN,D0"ŠBSR.S‚CHKALP1STCHARMUSTBEA-Z ŠBRA.S‚VALF40VALF35„CMP.B‚#'',(A1) ŠBEQ.S‚VALF45 ŠBSR.S‚CHKASCVALF40„BCS.S‚VALFERŠDCNTƒD0,VALF35**FILE NAME/EXTENSION OKAY-MAKE GOOD RETURNVALFRT„CLR.B‚D0VALFR0„MOVE.L(A7)+,A1ŠRTS*SPACE FOUND IN EXTENSION'VALF45„CMP.B‚#'',(A1)+‰CHECKFORSPACE ŠBNE.S‚VALFERŠDCNTƒD0,VALF45ŠBRA.S‚VALFRTMAKEGOODRETURN"*MAKE FILE DESCRIPTOR ERROR RETURNVALFER„MOVE.L#FSTAFD,D0 ŠBRA.S‚VALFR0ŠPAGE*8*CHKASC CHECKS TO SEE IF CHARACTER IS SPACE, 0-9, OR A-Z*CHKALP ALLOWS ONLY A-Z *ON CALL:*„A1=POINTERTOCHARACTER*„BSRCHKASCORCHKALP* *ON RETURN:*„CARRY=OIFNOERROR *‰=1IFERROR*„A1=A1+1IFNOERROR* CHKASC„EQU„*ŠCMP.B‚#'',(A1)ŠBEQ.S‚CHKAS0SPACE-OKŠCMP.B‚#'0',(A1)Š0-9?ŠBCS.S‚CHKAS1NO-ERRORŠCMP.B‚#'9',(A1)ŠBLS.S‚CHKAS0GOODCHKALP„CMP.B‚#'A',(A1)ŠA-Z?ŠBCS.S‚CHKAS1ERRORŠCMP.B‚#'Z',(A1)ŠCHECKLIMITŠBHI.S‚CHKAS1ERROR(CHKAS0„TST.B‚(A1)+ŽSETUPFORNEXTCHAR.*ŠAND.B‚#$FE,SRŒCLEARCARRYFORGOODRETURNŠRTS%CHKAS1„OR.Bƒ#1,SRŽSETCARRYFORERRORŠRTSŠPAGE *CHKAP 1.00 7/10/79 L. STEINHOFF*1*CHKAP CHECKS ACCESS PERMISSION PASSED AND EITHER)*„ASSIGNSACCESSPERMISSIONORDE-ASSIGNS* *ON CALL:*„A6=ADDRESSOFVDT *„(ONLYIFASSIGN/DE-ASSIGNREQ)*…A2=ADDRESSOFFCB *„(ONLYIFASSIGN/DE-ASSIGNREQI*„D1.B=ACCESSPERMISSIONCODE*„BIT7=0->ASSIGN*‰=1->DE-ASSIGN*…BIT6=0->ASSIGN,DE-ASSIGN*Š=1->GETREAD/WRITETYPESONLY *„BSR‚CHKAP* *ON RETURN:1*„Z=1IFACCESSPERMISSIONGRANTEDORDE-ASSIGNED*…=0IFINVALIDREQUEST*„D0.B=0IFSUCCESSFUL$*ˆ=FSTAAPIFACCESSPERMISSIONERROR'*…D1.B=UNCHANGED(BITS6AND7CLEARED)5*…D2.L=READTYPE(BITS31-16),WRITETYPE(BITS15-0)*+*CHKAP MAKES SURE THAT THE REQUESTED ACCESS,*„PERMISSIONISVALID;ONANASSIGNREQUEST,)*„ITISCHECKEDTOMAKESUREITISNOTIN)*„CONFLICTWITHEXISTINGVOLUMEANDFFILE*…PROTECTION.‚IFTHEACCESS,*„PERMISSIONISVALID,THEWRITE/READCOUNTS *…INTHEVDTANDFCBAREUPDATEDD*IF A VOLUME NAME ONLY IS PASSED IN FCB (FILE NAME FIELD IS SPACES),6*…AVOLUMEASSIGNMENT/DE-ASSIGNMENTISBEINGPROCESSED(*WRITE/READ COUNT HAS FOLLOWING MEANING:*„=-1->EXCLUSIVE*„=0->NOTINUSE*„=N->NO.OFSHAREDACCESSES-*ON REQUEST TO DE-ASSIGN, READ/WRITE COUNT IS*„SETTO0IFITHADBEENAN,*„EXCLUSIVEASSIGNMENT;COUNTISDECREMENTED**„(UNLESSALREADY0)FORPUBLICASSIGNMENT**INDENTED LIST,* CHKAP ASSIGNS/DE-ASSIGNS ACCESS PERMISSION*CHKAP* VALID ACCESS PERM?*‚NO,RETURNACCESSPERM.ERROR* ASSIGN/ DEASSIGN AP?*‚NO,RETURNREAD/WRITETYPES* EXCLUSIVE FILE ASSN?*‚YES,MAKEPUBLICVOLUMEASSN. * ASSIGN? *‚NO,DEASSN.AP-FORFILE,VOLUME*‚YES,CANAP-BEASSIGNED?*ƒNO,RETURNAP-ERROR,*ƒYES,UPDATEREAD/WRITECOUNTS-FORFILE/VOL.*INDENTED LIST END* CHKAP…EQU„*&ŠMOVEM.LD3-D7/A1,-(A7)„SAVEREGISTERS6ŠMOVE.L#APTBL,A1ŠGETSTARTOFACCESSPERMISSI ONTABLEŠMOVE.WD1,-(A7)‹SAVED1#ŠAND.B‚#$3F,D1ŒMASKOFFBIT6AND7,*SEARCH TABEL FOR MATCH ON ACCESS PERMISSION#CHKA05„CMP.B‚#-1,(A1)‹ENDOFTABLE?ŠBNE.S‚CHKA10NO!ŠTST.W‚(A7)+ŽREMOVED0FROMSTACK.*INVALID ACCESS PERMISSION - MAKE ERROR RETURNCHKAER„MOVE.L#FSTAAP,D0+CHKART„MOVEM.L(A7)+,A1/D3-D7„RESTOREREGS.ŠRTS(CHKA10„CMP.B‚(A1)+,D1‹ACCESSPERM.MATCHŠBEQ.S‚CHKA15YESŠTST.B‚(A1)+ŽSKIPOVERUNUSED ŠTST.L‚(A1)+ŽPOINTTONEXTENTRY ŠBRA.S‚CHKA05*SAVE READ/WRITE TYPES#CHKA15„TST.B‚(A1)+ŽSKIPOVERUNUSED%ŠMOVE.L(A1),D2ŒSAVEREAD/WRITETYPESŠBTSTW‚#6,(A7)ŒASSIGN/DE-ASSIGNŠBEQ.S‚CHKA14YESŠTST.W‚(A7)+ŽCLEANUPSTACKŠBRA„CHKANRRETURND2 CHKA14„EQU„*ŠMOVE.W(A1)+,D6‹FILEREADTYPEŠMOVE.W(A1),D7ŒFILEWRITETYPE%ŠCLR.B‚D5‘D5=0IFNOFILENAMEPASSEDŠCMP.B‚#'',FCBDIR+DIRFIL(A2) ŠBEQ.S‚CHKA16ŠMOVE.L#1,D5ŽFILENAMEPASSED CHKA16„EQU„*"ŠMOVE.WD6,D3ŽSAVEFORVOLUMEREAD ŠBPL.S‚CHKA17/*IF EXCLUSIVE READ FOR FILE, MAKE PUBLIC VOLUME *„ASSIGNMENT ŠTST.B‚D5!ŠBEQ.S‚CHKA17NOTFILEASSIGNMENT ŠNEG.W‚D3CHKA17„MOVE.WD7,D4 ŠBPL.S‚CHKA20,*IF EXCLUSIVE WRITE FOR FILE, VOLUME MUST BE*„ASSIGNEDPUBLICWRITE ŠTST.B‚D5!ŠBEQ.S‚CHKA20NOTFILEASSIGNMENT ŠNEG.W‚D4*D2=READ TYPE, WRITE TYPE*D6=READ TYPE FOR FILE*D7=WRITE TYPE FOR FILE*D3=READ TYPE FOR VOLUME*D4=WRITE TYPE FOR VOLUME"CHKA20„MOVE.W(A7)+,D1‹RETRIEVED1ŠBCLRW‚#7,D1ŽDE-ASSIGNREQUEST?ŠBNE„CHKA60YES*CHECK FOR FILE READ ACCESS ŠTST.W‚D6 ŠBEQ.S‚CHKA30NOFILEASSIGNMENT1*FILE CANNOT CURRENTLY BE ASSIGNED EXCLUSIVE READŠCMP.W‚#-1,FCBRCT(A2)ŠBEQ.S‚CHKAERERRORRETURNŠTST.W‚D6‘EXCLUSIVEREQUESTED?1*IF EXCLUSIVE ASSIGNMENT, CURRENT COUNT MUST BE 0ŠBPL.S‚CHKA27NOŠTST.W‚FCBRCT(A2) ŠBNE„CHKAER ŠBRA.S‚CHKA30 CHKA27„EQU„* *NO-SAVE VALUE OF NEW READ COUNTŠADD.W‚FCBRCT(A2),D6*CHECK FOR FILE WRITE ACCESSCHKA30„TST.W‚D7"ŠBEQ.S‚CHKA35NOFILEWRITEACCESSŠCMP.W‚#-1,FCBWCT(A2)ŠBEQ„CHKAERYES-ERRORŠTST.W‚D7‘EXC.REQUESTEDŠBPL.S‚CHKA33NOŠTST.W‚FCBWCT(A2) ŠBNE„CHKAER ŠBRA.S‚CHKA35 CHKA33„EQU„*)ŠADD.W‚FCBWCT(A2),D7†SAVENEWWRITECOUNT*CHECK FOR VOLUME READ ACCESSCHKA35„TST.W‚D3#ŠBEQ.S‚CHKA40NOVOLUMEREADACCESSŠCMP.W‚#-1,VDTRCT(A6)#ŠBEQ„CHKAERALREADYEXCLUSIVEERRORŠTST.W‚D3‘EXCLUSIVEREQUESTED?ŠBPL.S‚CHKA37NOŠTST.W‚VDTRCT(A6) ŠBNE„CHKAER ŠBRA.S‚CHKA40 CHKA37„EQU„*'ŠADD.W‚VDTRCT(A6),D3†NO-SAVEREADCOUNT**CHECK FOR VOLUME WRITE ACCESS*CHKA40„TST.W‚D4$ŠBEQ.S‚CHKA45NOVOLUMEWRITEACCESSŠCMP.W‚#-1,VDTWCT(A6)ŠBEQ„CHKAERALREADYEXCLUSIVEŠTST.W‚D4‘EXCLUSIVEREQUESTED? ŠBPL.S‚CHKA42ŠTST.W‚VDTWCT(A6) ŠBNE„CHKAER ŠBRA.S‚CHKA45 CHKA42„EQU„*(ŠADD.W‚VDTWCT(A6),D4†NO-SAVEWRITECOUNT*:*ACCESS PERMISSION CAN BE GRANTED-UPDATE READ/WRITE COUNTSCHKA45„TST.W‚D6 ŠBEQ.S‚CHKA47ŠMOVE.WD6,FCBRCT(A2)†FILEREADCHKA47„TST.W‚D7 ŠBEQ.S‚CHKA50 ŠMOVE.WD7,FCBWCT(A2)†FILEWRITECHKA50„TST.W‚D3 ŠBEQ.S‚CHKA52!ŠMOVE.WD3,VDTRCT(A6)†VOLUMEREADCHKA52„TST.W‚D4 ŠBEQ.S‚CHKANR"ŠMOVE.WD4,VDTWCT(A6)†VOLUMEWRITE CHKANR„CLR.B‚D0‘MAKEGOODRETURN ŠBRA„CHKARTŠPAGE*+*DE-ASSIGN REQUEST-ADJUST READ/WRITE COUNTS*!CHKA60„TST.W‚D6‘FILEREADACCESS?ŠBEQ.S‚CHKA65NO ŠBPL.S‚CHKA62'*IT WAS EXCLUSIVE READ ACCESS; SET TO 0ŠCLR.W‚FCBRCT(A2) ŠBRA.S‚CHKA654*IT WAS PUBLIC READ ACCESS; DECREMENT COUNT UNLESS 0CHKA62„TST.W‚FCBRCT(A2)ŠBEQ.S‚CHKA65ALREADY0ŠSUB.W‚#1,FCBRCT(A2)*CHECK FOR FILE WRITE ACCESSCHKA65„TST.W‚D7 ŠBEQ.S‚CHKA75 ŠBPL.S‚CHKA72ŠCLR.W‚FCBWCT(A2) ŠBRA.S‚CHKA75CHKA72„TST.W‚FCBWCT(A2) ŠBEQ.S‚CHKA75ŠSUB.W‚#1,FCBWCT(A2)*CHECK FOR VOLUME READ ACCESSCHKA75„TST.W‚D3 ŠBEQ.S‚CHKA80 ŠBPL.S‚CHKA77ŠCLR.W‚VDTRCT(A6) ŠBRA.S‚CHKA80CHKA77„TST.W‚VDTRCT(A6) ŠBEQ.S‚CHKA80ŠSUB.W‚#1,VDTRCT(A6)*CHECK FOR VOLUME WRITE ACCESSCHKA80„TST.W‚D4 ŠBEQ.S‚CHKA85 ŠBPL.S‚CHKA82ŠCLR.W‚VDTWCT(A6) ŠBRA.S‚CHKA85CHKA82„TST.W‚VDTWCT(A6) ŠBEQ.S‚CHKA85ŠSUB.W‚#1,VDTWCT(A6)$CHKA85„BRA„CHKANRMAKENORMALRETURNŠPAGE*  *ACCESS PERMISSION TABLE*"*EACH ENTRY IS 6 BYTES AS FOLLOWS:*„1=ACCESSPERMISSIONCODE *…2=UNUSED*„3-4=READTYPE*„5-6=WRITETYPE**„TY@E=0IFNONE*ˆ=1IFPUBLIC*ˆ=-1IFEXCLUSIVE* APTBL…EQU„*ŠDC.BƒFOPPR,0ŒPUBLICREAD ŠDC.Wƒ1,0ŠDC.BƒFOPER,0ŒEXCLUSIVEREAD ŠDC.Wƒ-1,0ŠDC.BƒFOPPW,0ŒPUBLICWRITE ŠDC.Wƒ0,1ŠDC.BƒFOPEW,0ŒEXCLUSIVEWRITE ŠDC.Wƒ0,-1(ŠDC.BƒFOPPRPW,0ŠPUBLICREAD/PUBLICWRITE ŠDC.Wƒ1,1&ŠDC.BƒFOPPREW,0ŠPUBLICREAD/EXC.WRITE ŠDC.Wƒ1,-1,ŠDC.BƒFOPERPW,0ŠEXCLUSIVEREAD/PPUBLICWRITE ŠDC.Wƒ-1,1"ŠDC.BƒFOPEREWŒEXC.READ/EXC.WRITE ŠDC.Wƒ-1,-1ŠDC.Bƒ-1,0ENDOFTABLEŠPAGE!*GETFCB 1.00 7/15/79 L. STEINHOFF*B*GETFCB SEARCHES FOR AN EMPTY FCB AND RETURNS ITS ADDRESS IF FOUND* *ON CALL:*…A6=VDTADDR. *…BSRGETFCB* *ON RETURN:*…Z=1IFFCBFOUND*†=0IFNONEAVAILABLE*…D0.B=0IFFCBFOUND*‰=FSTASSIFNONFCBAVAILABLE5*…A2=FCBADDRESSIFFOUND(VDTADDR.INSERTEDINFCB)*…A6=UNCHANGED* GETFCB„EQU„*ŠMOVE.LFCBSTR,A2GETF10„TST.L‚(A2)EMPTYFCB?ŠBEQ.S‚GETF20YES-RETURNADDR.&ŠLEA„FCBLEN(A2),A2†POINTTONEXTENTRY%ŠCMP.L‚FCBEND,A2ŠCHECKEDALLENTRIES?ŠBLS.S‚GETF10NO*YES-MAKE ERROR RETURN‰PUT_ADDR‚*,SYSPACE*œSETDIAGNOSTIC!*¡OUTOFFILECONTROLBLOCKSPACE,ŠMOVE.L#FSTASS,D0‰INSUFFICIENTSYSTEMSPACEŠRTS*GETF20„MOVE.LA6,FCBVDT(A2)†SAVEVDTADDR.ŠCLR.B‚D0‘MAKEGOODRETURNŠRTSŠPAGE!*RELFCB 1.00 7/15/79 L. STEINHOFF*8*RELFCB RETURNS FCB TO AVAILABLE BY ZEROING ENTIRE ENTRY)*…FABMEMORYISRELEASED1STIFITEXISTS* *ON CALL:*…A2=FCBADDR. *…BSRRELFCB* *ON RETURN: *…A2CHANGED* RELFCB„EQU„*ŠMOVE.WD0,-(A7) ŠMOVE.W#FCBLEN/2,D0‡NO.OFWRDSRELF10„CLR.W‚(A2)+ŠDCNTƒD0,RELF10ŠMOVE.W(A7)+,D0ŠRTSŠPAGE!*GETFAT 1.00 7/19/79 L. STEINHOFF*-*GETFAT SEARCHES FOR AN EMPTY FAT AND RETURNS*…ADDRESSIFFOUND.* *ON CALL:*…A2=FCBADDR. *…BSRGETFAB* *ON RETURN:*…Z=1IFFATFOUND*†=0IFNONEAVAILABLE*…D0.B=0IFFATFOUND*‰=FSTASSIFNOFATAVAILABLE*…A2=UNCHANGED3*…A4=FATADDR.IFFOUND(FCBADDR.INSERTEDINFAT)* GETFAT„EQU„*$ŠMOVE.LFATSTR,A4ŠGETSTARTOFFAT'SGETFA1„TST.L‚(A4)EMPTYFAT?ŠBEQ.S‚GETFA5YES)ŠLEA„FATLEN(A4),A4†NO-POINTTONEXTENTRYŠCMP.L‚FATEND,A4ŠCHECKEDALL?ŠBLS.S‚GETFA1NO‰PUT_ADDR‚*,SYSPACE*œSETDIAGNOSTIC*¡FATSPACEALLGONE(ŠMOVE.L#FSTASS,D0‰YES-MAKEERRORRETURNŠRTS*GETFA5„MOVE.LA2,FATFCB(A4)†SAVEFCBADDR. ŠCLR.B‚D0ŠRTSŠPAGE!*RELFAT 1.00 7/19/79 L. STEINHOFF*8*RELFAT RETURNS FAT TO AVAILABLE BY ZEROING ENTIRE ENTRY2*…DATABUFFERSEGMENTISRELEASED1STIFITEXISTS* *ON CALL:*…A4=FATADDR. *…BSRRELFAT* *ON RETURN:#*…A4=UNCHANGED(FOREOTPROCESSING)* RELFAT„EQU„*ŠMOVEM.LD0/A4,-(A7)ŠIFGTƒFMSLEVEL-1)ŠBSR„RELIOBRELEASESEGMENTIFONEEXISTSŠENDC!ŠMOVE.W#FATLEN/2,D0‡NO.OFWORDSRELFA1„CLR.W‚(A4)+ŽZEROŠDCNTƒD0,RELFA1ŠMOVEM.L(A7)+,D0/A4ŠRTSŠPAGE!*SRCFCB 1.00 7/15/79 L. STEINHOFF*=*SRCFCB SEARCHES FOR FCB FOR VOLUME, USER NO. FILE, EXTENSION*…PASSES* *ON CALL:*…A6=VDTADDRESS7*…A5=POINTERTOFHSBLOCKCONTAININGUSERNO.FILENAME*ˆANDEXTENSION *…BSRSRCFCB* *ON RETURN:*…CARRY=0IFFCBFOUND*Š=1IFNOTFOUND*…A6=UNCHANGED *…A5=UNCHAGED*…A2=FCBADDRESSIFFOUND**‡FHSPARAMETERBLOCK(SRCFCB)**‰----------------------*‰*”**‰----------------------*ƒ10„*‡FHSUSN‡*‡USERNUMBER*‰----------------------* SRCFCB„EQU„*ŠMOVEM.LD0/A3-A4,-(A7)ŠMOVE.LFCBSTR,A2+SRCF05„CMP.L‚FCBVDT(A2),A6†VDTADRS.MATCH?!ŠBNE.S‚SRCF30NO-GOTONEXTENTRY)*VOLUME ID'S ARE SAME-CHECK USER NO. ETC.*…GETSTARTOFBOTHUSERNOS.ŠLEA„FHSUSN(A5),A3ŠLEA„FCBSDB+SDBUSN(A2),A4ŠCMPM.W(A3)+,(A4)+ŠBNE.S‚SRCF30NOTRIGHTFCB$ŠMOVE.W#(CLGLEN+FILLEN+EXTLEN)/2,D0SRCF20„CMPM.W(A3)+,(A4)+ ŠBNE.S‚SRCF30ŠDCNTƒD0,SRCF20 *FCB FOUNDŠAND.B‚#$FE,SRŒCLEARCARRYSRCFRT„MOVEM.L(A7)+,A3-A4/D0ŠRTS*SRCF30„LEA„FCBLEN(A2),A2†POINTTONEXTFCBŠCMP.L‚FCBEND,A2ŠDONE?ŠBLS.S‚S  RCF05NO*YES-MAKE ERROR RETURNŠOR.Bƒ#1,SRŽSETCARRY ŠBRA.S‚SRCFRTŠPAGE!*RELAPF 1.00 7/23/79 L. STEINHOFF*1*RELAPF DE-ASSIGNS ACCESS PERMISSION AND RELEASES*…FCBIFNECESSARY* *ON CALL:9*…FMSAP=ACCESSPERMISSIONTOBEDE-ASSIGNED(=-1IFNONE))*…FMSFCBA=FCBTOBERELEASED(=0IFNONE)3*…A2=FCBASSOCIATEDWITHAP(ONLYIFFMSAP.NE.-1)3*…A6=VDTASSOCIATEDWITHAP(ONLYIFFMSAP.NE.-1) *…BSRRELAPF* *ON RETURN: *…FMSAP=-1 *…FMSFCBA=0*…A2=UNCHANGED*…A6=UNCHANGED* RELAPF„EQU„*ŠMOVEM.LD0-D2/A2,-(A7)-ŠMOVE.BFMSAP,D1‹HASACCESSPERM.BEENSETUP?ŠBMI.S‚RELA10NOŠBSETW‚#7,D1ŽREQUESTDE-ASSIGNŠBSR„CHKAPŽDE-ASSIGN+ŠMOVE.B#-1,FMSAPŠINDICATENOTHINGASSIGNED&RELA10„MOVE.LFMSFCBA,A2‰GETFCBADDR.ŠCMP.L‚#0,A2ŽFCBTORELEASE?ŠBEQ.S‚RELARTNOŠBSR„RELFCBYESŠCLR.L‚FMSFCBAŒINDICATENOFCBRELART„MOVEM.L(A7)+,D0-D2/A2ŠRTSŠPAGE*-*SETPTR INITIALIZES REGISTERS FOR VDT,FCB,AND *„FATTABLES* *ON CALL:*#*…FMSASQ1+EVTLUE=ADDR.OFLUNENTRY *„BSRSETPTR** *ON RETURN:*„A6=VDTADDR.*„A4=FATADDR.*„A2=FCBADDR.,*SETPTR GOES TO FMSFTL IF FAT DOES NOT EXIST* SETPTR„EQU„*ŠMOVEM.LD0/A0,-(A7)ŠLEA„FMSASQ1,A0ŠMOVE.LEVTLUE(A0),A2 ŠMOVE.LA2,D0#ŠMOVE.LLUTDCB(A2),A2†GETFCBADDR.ŠMOVE.LFATSTR,A4*LOOK FOR CORRECT FAT ADDR.SETP05„CMP.L‚FATLUE(A4),D0 ŠBNE.S‚SETP10*FAT HAS BEEN FOUNDŠMOVE.LFCBVDT(A2),A6†VDTADDR.ŠMOVEM.L(A7)+,D0/A0ŠRTSSETP10„LEA„FATLEN(A4),A4ŠCMP.L‚FATEND,A4 ŠBLS.S‚SETP05ŠBSR„FTL.TŽCAN'TFINDFATŠPAGE*.*RELLUN RELEASES LUN ENTRY BY DOING FOLLOWING:2*„LUT-COUNTOFACTIVELUASSIGNMENTSDECREMENTED-*„LUN-ACTIVE,ASSIGNMENTPENDING,ANDCLOSE*†PENDINGBITSCLEARED* *ON CALL:!*…FMSASQ+EVTLUT=ADDR.OFLUTABLE"*…FMSASQ+EVTLUE=ADDR.OFLUNENTRY *„BSRRELUN* *ON RETURN:*…REGISTERSUNCHANGED* RELLUN„EQU„*ŠMOVEM.LA0-A1/D0,-(A7)ŠMOVE.LFMSASQ+EVTLUT,A0ŠMOVE.LFMSASQ+EVTLUE,A1 RELL10„EQU„**DON'T DESTROY A0ŠMOVE.LA0,-(A7)ŠBSR„GETLUTGETLUTSEM.ŠMOVE.L(A7)+,A0'ŠSUB.B‚#1,LUTCAS(A0)†ADJUSTCURRENTNO.+ŠBCLRW‚#LUSFAC,LUTCAP(A1)CLEARACTIVEFLAG.ŠBCLRW‚#LUSFAS,LUTCAP(A1)CLEARASSIGNPENDING-ŠBCLRW‚#LUSFCP,LUTCAP(A1)CLEARCLOSEPENDINGŠMOVE.LIOCOMS,A0ŠCLR.B‚SVTSLUT(A0)ŠMOVEM.L(A7)+,A0-A1/D0ŠRTS**RELLUNR USED BY SEND LU*…D6=RECEIVER'SLUT*…D7=RECEIVER'SLUE RELLUNRƒEQU„*ŠMOVEM.LA0-A1/D0,-(A7) ŠMOVE.LD6,A0 ŠMOVE.LD7,A1 ŠBRA.S‚RELL10ŠPAGE*)*CLRIOP CLEARS I/O PENDING FLAG AND WAKES"*…UPFHSIFCLOSEPENDINGFLAGSET* *ON CALL:*…A4=FATADDR.*…FATLUE=LUENTRY *…BSRCLRIOP* *ON RETURN:*…A0,D0=CHANGED(*…GOESTOFMSFTLIFERRORONWAKEUPCALL* CLRIOP„EQU„*ŠMOVE.LFATLUE(A4),A0***************************2*…NONEEDTOLOCKLUTHERESINCEONLYCLEARINGBIT**********************+ŠBCLRW‚#LUSFIO,LUTCAP(A0)CLEARI/OPENDING(ŠBTSTW‚#LUSFCP,LUTCAP(A0)CLOSEPENDING?ŠBEQ.S‚CLRI10NO#*MUST WAKE UP FHS TO COMPLETE CLOSEŠERQ.WAKEUPWUBLK ŠBSR„FTL.NE CLRI10„RTSŠPAGE* *GETATT 1.00 10/9/79 L.STEINHOFF*(*GETATT FETCHES FILE ATTRIBUTES FROM FCB*…ANDMOVESTOFMS'SFHSBLOCK**…ANDSETSUPPARAMETERBLOCKFORMOVEL-L* *ON CALL:*…A2=FCBADDR.*…A5=FHSPARAMETERBLOCKADDR.*…A6=VDTADDR.*…FMSASQ+EVTRA0=USER'SA0VALUE!*…EVTTSK,EVTSES=USERTASK/SESSION *…BSRGETATT* *ON RETURN:/*…A0=ADDR.OFL-LMOVEPARAMETERBLOCK(MOVBLK)$*‡SOURCE,DEST,ANDLENGTHFILLEDIN2*…FOLLOWINGFIELDSOFFHSBLOCKHAVEBEENALTERED:*‡FHSOPT(1STBYTEONLY)*‡FHSSIZ*‡FHSLRL**INDENTED LIST'* GETATT GETS FILE OR VOLUME ATTRIBUTES*GETATT* VOLUME ASSN? *‚YES,MOVENO.OFSECTORSTO-SIZE*ƒMOVE-SECT.SIZE-TOLRL*„MOVE-DEV.TYPE-TOOPTIONS*‚NO,MOVEFILE-TYPETO-OPT*ƒCONTIGUOUSFILE?*„YES,MOVESECTORSIZE-TOLRL*…MOVEFILESIZETO-SIZE*„NO,MOVERECORDLENGTH-TOLRL*…MOVE-FAB,DB,KEYSIZE-TOSIZE*INDENTED LIST END***‡FHSPARAMETERBLOCK(GETATT)**‰----------------! ------*‰*”**‰----------------------*ƒ2…*‡FHSOPT‡*‡OPTIONS*‰----------------------*‰*”**‰----------------------%*ƒ34„*‡FHSLRL‡*‡LOGICALRECORDLENGTH*‰----------------------$*ƒ36„*‡FHSSIZ‡*‡CONTIGUOUSFILESIZE*‰*…(4BYTES)†**‰----------------------* GETATT„EQU„*ŠMOVEM.LD0-D1/A1,-(A7) ŠCLR.L‚D1*ŠCMP.B‚#'',FCBDIR+DIRFIL(A2)VOLUMEASSN?ŠBEQ.S‚GETA30YES*ASSIGNMENT FOR FILE+ŠMOVE.BFCBDIR+DIRATT(A2),D0GETATTRIBUTES1*ATTRIBUTES RETURNED IN 1ST BYTE OF OPTIONS FIELDŠMOVE.BD0,FHSOPT(A5)1*RECORD LENGTH OF FILE IS DETERMINED BY FILE TYPEŠAND.B‚#DFTBIT,D0"ŠCMP.B‚#DATCON,D0‰CONTIGUOUSFILE?ŠBNE.S‚GETA22NO3ŠMOVE.W#SECSZE,FHSLRL(A5)YES-REOCRDLENGTHIS256!*SET SIZE FIELD TO LENGTH OF FILE(ŠMOVE.LFCBDIR+DIRFE(A2),D1GETFILEEND ŠADD.L‚#1,D1ŠMOVE.LD1,FHSSIZ(A5) ŠBRA.S‚GETA40-*FOR OTHER FILE TYPES, SETUP SIZE FIELD WITH,)*„FABSIZE,DATABLOCKSIZE,ANDKEYSIZE*GETA22„MOVE.LFCBDIR+DIRRS2(A2),FHSSIZ(A5)$ŠMOVE.WFCBDIR+DIRLRL(A2),FHSLRL(A5) ŠBRA.S‚GETA40@*VOLUME ASSIGNMENT-SET UP DEVICE TYPE AND NO. OF SECTORS ON DISK)GETA30„MOVE.LVDTDCB(A6),A1†GETDCBADDR.,ŠMOVE.LDCBSEC(A1),FHSSIZ(A5)NO.OFSECTORS'ŠMOVE.WDCBLEN(A1),FHSLRL(A5)REC.LEN.)ŠMOVE.BDCBFLG(A1),FHSOPT(A5)DEVICETYPE*SET UP PARAMETERS FOR L-L MOVE!GETA40„BSR„SMOVEASETUPL-LMOVE&ŠLEA„FHSOPT(A5),A1†GETSTARTOFSOURCEŠMOVE.LA1,MVSADD(A0)2ŠMOVE.LFMSASQ+EVTRA0,A1ƒGETSTARTOFUSER'SBLOCK#ŠLEA„FHSOPT(A1),A1†POINTTOOPTIONS ŠMOVE.LA1,MVDADD(A0)†DESTADDR..ŠMOVE.L#FHSBLN-FHSOPT,MVLENG(A0)NO.OFBYTESŠMOVEM.L(A7)+,D0-D1/A1ŠRTSŠPAGEŠIFGTƒFMSLEVEL-1* *GETIOB 1.00 10/9/79 L.STEINHOFF*/*GETIOB ALLOCATES A SEGMENT FOR DATA BUFFER/FAB<*…ANDTHENMAKESSEGMENTPERMANENTANDSHARABLEIFREQUESTED* *ON CALL:*„A2=FCBADDRESS*…A4=FATADDRESS*…A6=VDTADDRESS.*…D0-BIT7=0/1->ALLOCATEDBANDFAB/FABONLY6*ˆBIT6=0/1->NOTGLOBALLYSHARABLE/GLOABLLYSHARABLE *…BSRGETIOB* *ON RETURN:*…Z=1IFNOERROR *†=0IFERROR*…D0.B=0IFNOERROR&*‰=FSTASSIFINSUFFICIENTSYSTEMSPACE*5*GETIOB GOES TO FMSFTL IF UNEXPECTED ERROR ON SEGMENT&*…DIRECTIVEESORBITS6AND7BOTHSET0*IF SUCCESSFUL, FAT HAS BEEN UPDATED AS FOLLOWS: *…SBS=STARTOFDB(IFALLOCATED)*…SBEANDSBL=ENDOFDB*…FAA=STARTOFFAB*…FAE=ENDOFFAB*…BSN=SEGMENTNAME*…FAFLSB=1IFDBALLOCATED5*…FMSSEG(SEGMENTNAME)INCREMENTEDBEFOREGTSEGCALL7*…SEGNAMINSEGBLK2=ALLOCATEDANDATTACHEDSEGMENTNAME!*…SEGNAM=0IFINSUFFICIENTMEMORY%*SEGMENT IS ATTACHED TO FMS ON RETURN*0*GETIOB USES DTABLK AND SEGBLK2 PARAMETER BLOCKS**INDENTED LIST** GETIOB ALLOCATES A SEGMENT FOR FILE DATA*GETIOB"* DEATTACH EXISTING SEGMENT .DESEG* ALLOCATE NEW SEGMENT .GTSEG* SAVE-FAB, DB-ADDRS. IN-FAT * MAKE SEGMENT PERMANENT .DCLSHR*INDENTED LIST END* GETIOB„EQU„**SET UP TO ALLOCATE SEGMENTŠMOVEM.LA0/D1-D3,-(A7)ŠMOVE.BD0,D3ŽSAVEOPTIONS-*ERROR IF SHARED SEGMENT REQUEST FOR FAB ONLY ŠBTSTW‚#6,D3ŠBEQ.S‚GETI05NOTSHARED ŠBTSTW‚#7,D3ŠBNE.S‚GETER1FATALERROR GETI05„EQU„*8*IF ANOTHER SEGMENT IS ALLOCATED, IT MUST BE DE-ATTACHEDŠLEA„SEGBLK2,A0ŠTST.L‚SEGNAM(A0)ŠBEQ.S‚GETI07NONEATTACHED%ŠCLR.W‚SEGOPT(A0)‰SETUPTODE-ATTACHŠERQ.DESEG(A0)ŠCLR.L‚SEGNAM(A0) GETI07„EQU„*$ŠLEA„DTABLK,A0ŠGETPARM.BLOCKADDR.'ŠADD.L‚#1,FMSSEGŠINCREMENTSEGMENTNAME%*CALCULATE LENGTH OF SEGMENT REQUIRED ŠCLR.W‚D1%ŠMOVE.BFCBDIR+DIRFAB(A2),D1FABSIZEŠBTSTW‚#7,D3ŽALLOCATEDB?ŠBNE.S‚GETI10NO*YES-ADD DB SIZE TO FAB SIZE ŠCLR.W‚D2ŠMOVE.BFCBDIR+DIRDAT(A2),D22*ADD 1 TO DB SIZE TO ACCOUNT FOR INSERT PROCESSING ŠADD.W‚#1,D2ŠADD.W‚D2,D1ŽD1=NO.OFSECTORS&GETI10„MULUƒ#SECSZE,D1‰D1*NO.OFBYTESŠMOVE.LD1,SEGLEN(A0)ŠERQ.GTSEG(A0)!ŠBEQ.S‚GETI20ALLOCATESUCCESSFUL0*DETERMINE IF ERROR CAUSED BY UNAVAILABLE MEMORYŠCMP.B‚#RTCDNMEM,D0 ‰BEQ‡GETI45*MUST BE UNEXPECTED ERROR!GETER1„BSR„FTL.TŽMAKEFATALABORT2GETER2„MOVE.L#FSTASS,D0‰INSUFFICIENTSYSTEMSPACE! GETRTN„MOVEM.L(A7)+,A0/D1-D3ŠRTS*SEGMENT WAS ALLOCATED*…A0=PHYSICAL/LOGICALADDR.(*SAVE INFO. IN FAT BEFORE TRYING TO MAKE*…SEGMENTPERMANENT/SHARABLE GETI20„EQU„*ŠBTSTW‚#7,D3ŽFABONLY?ŠBNE.S‚GETI30YES-*DB WAS ALLOCATED-SAVE BUFFER START/END ADDR.ŠMOVE.LA0,FATSBS(A4) ŠCLR.W‚D2ŠMOVE.BFCBDIR+DIRDAT(A2),D2'ŠMULUƒ#SECSZE,D2‰CALCULATELENGTHOFDB ŠSUB.L‚#1,D2 ŠADD.L‚D2,A06*ENDING ADDR. DOES NOT INCLUDE EXTRA SECTOR FOR INSERT'ŠMOVE.LA0,FATSBE(A4)†SAVEENDINGADDR.ŠMOVE.LA0,FATSBL(A4)#ŠADD.L‚#SECSZE+1,A0‡A0=STARTOFFAB/ŠBSETW‚#FAFLSB,FATFLG(A4)INDICATEDBALLOCATED(GETI30„MOVE.LA0,FATFAA(A4)†STARTOFFAB ŠCLR.W‚D2ŠMOVE.BFCBDIR+DIRFAB(A2),D2ŠMULUƒ#SECSZE,D2 ŠSUB.L‚#1,D2 ŠADD.L‚D2,A0 ŠMOVE.LA0,FATFAE(A4)†ENDOFFAB&ŠMOVE.LFMSSEG,FATBSN(A4)‚SEGMENTNAME'*NOW MAKE SEGMENT PERMANET AND SHARABLEŠLEA„SEGBLK2,A0*ŠMOVE.LFMSSEG,SEGNAM(A0)‚GETSEGMENTNAME)ŠMOVE.W#SGOPSP,SEGOPT(A0)MAKEPERMANENT4ŠMOVE.W#SGATSS,SEGATT(A0)INDICATESESSIONSHARABLE&ŠBTSTW‚#6,D3ŽSHOULDSEGMENTBEGLOBAL?ŠBEQ.S‚GETI35NOŠMOVE.W#SGATGS,SEGATT(A0)YES$*MAKE SEGMENT PERMANENT AND SHARABLEGETI35„ERQ.DCLSHR(A0)ŠBEQ„GETRTNSUCCESSFUL#ŠCMP.B‚#RTCDDPRQ,D0‡DUPLICATENAME?ŠBEQ.S‚GETI40YESŠBSR.S‚RELIOBRELEASESEGMENT-ŠCMP.B‚#RTCDTFUL,D0‡GLOBALSYMBOLTABLEFULL?$‰BEQ.S…GETI50YES-TREATASNOMEMORY$ŠBRA„GETER1MUSTBEUNEXPECTEDERROR'*GOT DUPLICATE NAME WHEN MADE PERMANENT#GETI40„BSR.S‚RELIOBRELEASESEGMENTŠBRA„GETI05GOTRYAGAINGETI45:‰PUT_ADDR‚*,SYSPACE*œSETDIAGNOSTIC.*¡INSUFFICIENTSPACETOOBTAINDATABUFFER/FAB ‰BRA‡GETER2 GETI50:‰PUT_ADDR‚*,SYSPACE*œSETDIAGNOSTIC**¡TRIEDTOMAKESEGMENTALLOCATEDGLOBALLY'*¡SHARABLEBUTGLOBALSYMBOLTABLEFULL ‰BRA‡GETER2ŠPAGE* *RELIOB 1.00 10/9/79 L.STEINHOFF*&*RELIOB DE-ALLOCATES AN FMS I/O BUFFER* *ON CALL:*…A4=FATADDRESS2*…FATBSN=SEGMENTNAME(=0IFNOSEGMENTALLOCATED)* *ON RETURN:.*…POSSIBLEERRORSFROMDESEGIGNORED(COULDBE0*‡ATTEMPTTODE-ATTACHFROMNON-ATTACHEDSEGMENT *…FATBSN=0*…SEGNAM=0INSEGBLK2*$*RELIOB USES SEGBLK2 PARAMETER BLOCK**INDENTED LIST,* RELIOB DEALLOCATES A SEGMENT FOR FILE DATA*RELIOB* SEGMENT EXIT? *‚NO,RETURN(*‚YES,ATTACHTO-SEG.IFNECESSARY$ATTIOB*ƒDEALLOCATESEGMENT.DESEG*INDENTED LIST END RELIOB„EQU„*ŠMOVEM.LD0/A0,-(A7)ŠLEA„SEGBLK2,A0ŠMOVE.LFATBSN(A4),D0#ŠBEQ.S‚RELRTNNOSEGMENTTORELEASE/ŠBSR.S‚ATTIOBMAKESUREATTACHEDTOSEGMENT1ST4*SET BIT IN OPTIONS FIELD TO REMOVE PERMANENT STATUSŠMOVE.W#SGOPRP,SEGOPT(A0)'ŠCLR.L‚FATBSN(A4)‰0SEGMENTNAMEINFATŠERQ.DESEG(A0).ŠCLR.L‚SEGNAM(A0)‰INDICATENOSEGMENTATTACHEDRELRTN„MOVEM.L(A7)+,A0/D0ŠRTSŠPAGE*"*ATTIOB 1.00 10/12/79 L. STEINHOFF*4*ATTIOB ATTACHES FMS TO AN I/O BUFFER IF IT OWNS ONE1*…IFSEGMENTISALREADYATTACHED,NOTHINGISDONE9*…IFDIFFERENTSEGMENTISATTACHED,ITISDE-ATTACHED1ST* *ON CALL:*…A4=FATADDRESS!*…FATBSN=SEGMENTNAME(0IFNONE)* *ON RETURN:*…A4=UNCHANGED)*…SEGNAMINSEGBLK2=ATTACHEDSEGMENTNAME*+*ATTIOB GOES TO FMSFTL IF ERROR FROM ATTSEG*$*ATTIOB USES SEGBLK2 PARAMETER BLOCK**INDENTED LIST** ATTIOB ATTACHES FMS TO FILE DATA SEGMENT*ATTIOB* SEGMENT ALREADY ATTACHED? *‚YES,RETURN%*‚NO,DEATTACHEXISTINGSEGMENT.DESEG*ƒATTACHSEGMENT.ATTSEG*INDENTED LIST END* ATTIOB„EQU„*ŠMOVEM.LA0/D0,-(A7)ŠLEA„SEGBLK2,A0ŠMOVE.LFATBSN(A4),D0ŠBEQ.S‚ATTIRTNOSEGMENTŠCMP.L‚SEGNAM(A0),D0ŠBEQ.S‚ATTIRTALREADYATTACHEDŠCLR.W‚SEGOPT(A0)-ŠTST.L‚SEGNAM(A0)‰DIFFERENTSEGMENTATTACHED?ŠBEQ.S‚ATTI05NO%*YES-MUST DE-ATTACH OTHER SEGMENT 1STŠERQ.DESEG(A0)4ATTI05„MOVE.LFATBSN(A4),SEGNAM(A0)GETSEGMENTNAME5ŠMOVE.W#SGATSS,SEGATT(A0)SETUPASSESSIONSHARABLE*ŠBTSTW‚#FOPABFB,FATASN(A4)SHAREDSEGMENT?ŠBEQ.S‚ATTI10NO8ŠMOVE.W#SGATGS,SEGATT(A0)YES-SEG.ISGLOBALLYSHARABLE!*SET LOGICAL ADDR.=PHYSICAL ADDR. ATTI10„MOVE.W#SGOPPA,SEGOPT(A0)ŠERQ.ATTSEG(A0)*…A0=LOGICALADDR.ŠBSR„FTL.NEFATALERROR" ATTIRT„MOVEM.L(A7)+,A0/D0ŠRTS*B*ATTIOBO ATTACHES TEMPORARILY TO OTHER SEGMENT TO DO DATA TRANSFER*…FROMFABORDATABLOCK ATTIOBOƒEQU„*ŠMOVEM.LA0/D0,-(A7)ŠLEA„SEGBLKO,A0 ŠBRA.S‚ATTI05ŠPAGEŠENDCƒFMSLEVEL-1*"*CHKASN 1.00 10/12/79 L. STEINHOFF*?*CHKASN DETERMINES TYPE OF ASSIGNMENT AND SETS FLAG ACCORDINGLY* *ON CALL:*…A2=FCBADDR. *…BSRCHKASN* *ON RETURN:/*…CONDITIONCODESETACCORDINGTOVALUEIND5.W$*…D5.W(MSB)=-1IFCONTIGUOUS/VOLUME *0IFOTHER*…D5.B=-1IFVOLUMEASSIGNEMTN*‰=FILETYPEOTHERWISE* CHKASN„EQU„*ŠMOVE.W#-1,D58*GOES TO FMSFTL IF UNEXPECTED ERROR FROM ASSIGN OR CLOSE*ŠCMP.B‚#'',FCBDIR+DIRFIL(A2)VOLUMEASSN?ŠBEQ.S‚CHKASN4ŒYESŠMOVE.BFCBDIR+DIRATT(A2),D5"ŠAND.B‚#DFTBIT,D5‰RETURNFILETYPEŠCMP.B‚#DATCON,D5‰CONTIGUOUS?ŠBEQ.S‚CHKASN4ŒYES'*ZERO HIGH BYTE FOR NON=CONTIGUOUS FILEŠAND.W‚#$FF,D5CHKASN4ƒTST.W‚D5ŠRTSŠPAGE*!*CALREC 1.00 10/23/79 L.STEINHOFF*5*CALREC DETERMINES IF I/O REQUEST IS FOR NEXT, PRIOR,-*…CURRENTORRANDOMANDADJUSTSCLS/CLRVALUE*…PASSEDACCORDINGLY* *ON CALL:*…A2=FCBADDR.*…A4=FATADDR.*…D1=CLSORCLRVALUE,*…D2=AMOUNTTOADDTOGETTONEXTBLOCK/REC. *…BSRCALREC* *ON RETURN:*…CARRY=0IFNOERROR*Š=1IFINVALIDFUNCTION*…D1=UPDATEDVALUE*…ALLOTHERREGISTERSUNCHANGED***INDENTED LIST,* CALREC DETERMINES NEW VALUE FOR CLR OR CLS*CALREC* CURRENT REQUEST?"*‚YES,1STI/O-ORLAST-REQ.DELETE?*ƒYES,MAKEERRORRETURN*ƒNO,KEEPCURRENTPOINTER*‚NO,NEXTREQUEST?*ƒYES,LASTREQUESTDELETE?*„YES,KEEPCURRENTPOINTER*„NO,UPDATEPOINTERFOR-NEXT*ƒNO,PREVIOUSREQUEST?*„YES,ATBEGINNING?*…YES,ERRORRETURN*…NO,POINTER=POINTERMINUS-1*„NO,RANDOMRECORDREQUEST*…POSITIONREQUESTFORMINUS-1?*†YES,POINTER=LOG.EOR*†NO,POINTER=RRN*INDENTED LIST END* CALREC„EQU„*ŠMOVEM.LD0,-(A7)ŠMOVE.WFATIOS+IOSOPT(A4),D0ŠAND.W‚#IOPPOS,D0"ŠCMP.W‚#IOPCUR,D0‰CURRENTREQUEST? ŠBNE.S‚CALR10#*YES-DON'T ALLOW IF THIS IS 1ST I/O*…ORLASTI/OWASDELETEŠBTSTW‚#FAFLLB,FATFLG(A4)ŠBNE.S‚CALRERLASTWASDELETEŠBTSTW‚#FAFLBB,FATFLG(A4)ŠBNE.S‚CALGRTNOT1STI/OŠBTSTW‚#FAFLRB,FATFLG(A4)ŠBNE.S‚CALGRTNOT1STI/O#*INVALID FUNCTION-MAKE ERROR RETURNCALRER„OR.Bƒ#1,SRCALRTN„MOVEM.L(A7)+,D0ŠRTS%CALGRT„AND.B‚#$FE,SRŒMAKEGOODRETURN ŠBRA.S‚CALRTN%CALR10„CMP.W‚#IOPNXT,D0‰NEXTREQUEST?ŠBNE.S‚CALR20NO.*YES-SET RECORD POSITION AHEAD BASED ON NO. OF,*…BLOCKS/RECORDTRANSFERREDONLASTREQUEST9*IF LAST REQUEST WAS DELETE, CLR ALREADY POINTING AT NEXTŠBTSTW‚#FAFLLB,FATFLG(A4) ŠBNE.S‚CALGRT ŠADD.L‚D2,D1 ŠBRA.S‚CALGRT)CALR20„CMP.W‚#IOPPRV,D0‰PREVIOUSREQUEST?ŠBNE.S‚CALR30NO*YES-DON'T ALLOW IF D1=0 OR -1 ŠTST.L‚D1ŠBEQ.S‚CALRERMAKEERRORRETURN ŠCMP.L‚#-1,D1 ŠBEQ.S‚CALRER$ŠSUB.L‚#1,D1ŽSUBTRACT1FROMCLS/CLR ŠBRA.S‚CALGRT5CALR30„MOVE.LFATIOS+IOSRRN(A4),D1RANDOMRECORDREQ.3*IF FUNCTION IS POSITION AND RRN=-1 AND RECORD I/O, *…PICKUPEOR ŠCMP.W‚#IOPOST,FATIOS+IOSFCT(A4)ŠBNE.S‚CALGRTNOTPOSITION ŠCMP.L‚#-1,D1ŠBNE.S‚CALGRTNOT-1RRN!ŠBTSTW‚#IOPRECB,FATIOS+IOSOPT(A4)ŠBNE.S‚CALGRTBLOCKI/O$ŠMOVE.LFCBDIR+DIREOR(A2),D1GETEOR ŠBRA.S‚CALGRTŠPAGEŠIFGTƒFMSLEVEL-1*!*UPDEOF 1.00 11/7/79 L. STEINHOFF*2*UPDEOF INCREMENTS/DECREMENTS NO. OF SECTORS INFO.*…ASSOCIATEDWITHFILEANDFAB* *ON CALL:*…A2=FCBADDR.*…A4=FATADDR.*…FATSBS=STARTOFDATABUFFER+*…FATSBL=POINTERTOLASTDATABYTEINBLOCK *…BSRUPDEOF* *ON RETURN:*…A2,A4=UNCHANGED(*…D0.W=REMAINDERFROMSECTORCALCULATION$*ˆ(=0IFSBLFALLSATENDOFSECTOR),*…Z=1IFEXACTLYFILLSSECTOR(NOREMAINDER)"*†=0IFPARTIALSECTOR(REMAINDER)*…DIREOF=DIREOF+N*…FATLLS=FATLLS+N*…FABSGS=FABSGS+N'*‡WHEREN=NEWCALCULATEDNO.OFSECTORS.*OLDNO.OFSECTORSINUSE(OLDFABSGSVALUE)0*…FABANDFCBCHANGEDFLAGSSETIFINFO.CHANGED**INDENTED LIST&* UPDEOF UPDATES SECTOR INFO. FOR FILE*UPDEOF*‚GETSECTORSIN-USE$CALSEC*‚GETCHANGEI" N-SECTORSIN-USE*‚UPDATEDIREOF,FATLLS,FABSGS*INDENTED LIST END* UPDEOF„EQU„*ŠMOVEM.LD1-D2/A3,-(SP) ŠBSR.S‚CALSECŠMOVE.LFATCFP(A4),A3 ŠCLR.L‚D2>ŠMOVE.BFABSGS(A3),D2†D1=NEWNO.OFSECTORS-OLDNO.OFSECTORS ŠSUB.L‚D2,D1ŠBEQ.S‚UPDE20NOCHANGEŠADD.L‚D1,FCBDIR+DIREOF(A2)ŠADD.L‚D1,FATLLS(A4)ŠADD.B‚D1,FABSGS(A3)<ŠBSETW‚#FCFLDB,FCBFLG(A2)INDICATEDIR.INFO.INFCBCHANGED ŠBSR„FABCHGINDICATEFABCHANGEDUPDE20„MOVEM.L(A7)+,D1-D2/A3#ŠTST.W‚D0‘SETCCBASEDONREMAINDERŠRTSŠPAGE*!*UPDEOR 1.00 11/7/79 L. WTEINHOFF*,*UPDEOR INCREMENTS/DECREMENTS NO. OF RECORDS$*…INFO.ASSOCIATEDWITHFILEANDFAB* *ON CALL:*…A2=FCBADDR.*…A4=FATADDR.*…D0.L=1IFINCREMENT*‰=-1IFDECREMENT *…BSRUPDEOR* *ON RETURN:*…ALLREGISTERSUNCHANGED*…DIREOR=DIREOR+1(-1)*…FATLLR=FATLLR+1(-1)*…FABREC=FABREC+1(-1)'*…FABCHANGEDANDFCBCHANGEDFLAGSSET* UPDEOR„EQU„*ŠADD.L‚D0,FCBDIR+DIREOR(A2)ŠADD.L‚D0,FATLLR(A4)ŠMOVE.LA3,-(SP)ŠMOVE.LFATCFP(A4),A3ŠADD.W‚D0,FABREC(A3)ŠMOVE.L(SP)+,A3<ŠBSETW‚#FCFLDB,FCBFLG(A2)INDICATEDIR.INFO.INFCBCHANGED ŠBSR„FABCHGINDICATEFABCHANGEDŠRTSŠPAGE*!*CALSEC 1.00 11/8/79 L. STEINHOFF*(*CALSEC CALCULATES NO. OF SECTORS IN USE* *ON CALL:*…A4=FATADDR.*…FATSBS=STARTOFBUFFER'*…FATSBL=POINTERTOLASTBYTEINBUFFER *…BSRCALSEC* *ON RETURN:*…D1=NO.OFSECTORSINUSE(*…D0.W=REMAINDERFROMSECTORCALCULATION* CALSEC„EQU„*ŠMOVE.LFATSBL(A4),D1ŠSUB.L‚FATSBS(A4),D1ŠADD.L‚#1,D1ŽGETNO.OFBYTES#ŠDIVUƒ#SECSZE,D1‰GETNO.OFSECTORS/*IF THERE IS A REMAINDER, ADD 1 TO SECTOR COUNT!ŠSWAPƒD1‘REMAINDERINLOW16BITSŠMOVE.WD1,D0ŽD0.W=REMAINDER ŠCLR.W‚D1ŠSWAPƒD1‘D1.L=NO.OFSECTORS ŠTST.W‚D0ŠBEQ.S‚CALS10NOREMAINDER(ŠADD.L‚#1,D1ŽD1.L=CORRECTNO.OFSECTORS CALS10„RTSŠPAGEŠIFEQƒFMSLEVEL-3*"*MVEKEY 1.00 11/20/79 L. STEINHOFF*5*MVEKEY MOVES KEY FROM USER BUFFER TO TEMPOARY BUFFER*…PASSED* *ON CALL:*…A0=ADDR.OFTEMPORARYBUFFER*…A2=FCBADDR.*…A4=FATADDR.#*…FATRSB=ADDROFUSERRECORDBUFFER *…BSRMVEKEY* *ON RETURN:*…Z=1IFNOERRORONL-LMOVE *†=0IFERROR!*…D0=ERRORSTATUSSETFROMMOVELL*…D2.L=NO.OFBYTESMOVED*…A2,A4=UNCHANGED *…A0=STARTINGADDR.OFMOVEDKEY* MVEKEY„EQU„* ŠCLR.L‚D0ŠMOVE.LA0,MOVBLK+MVDADDŠBSR„DMOVEŽSETUPL-LMOVE ŠCLR.L‚D2ŠMOVE.BFCBDIR+DIRKEY(A2),D2ŠBEQ.S‚MVEK10SKIPIFNULLKEY7ŠMOVE.LD2,MVLENG(A0)†PUTKEYLENGTHINPARAMETERBLOCK$ŠMOVE.LFATIOS+IOSSAD(A4),MVSADD(A0)ŠERQ.MOVELL(A0)%ŠMOVE.LMVDADD(A0),A0†A0=ADDR.OFKEY ŠTST.L‚D0 MVEK10„RTSŠPAGE*"*CMPKEY 1.00 12/16/79 L. STEINHOFF*(*CMPKEY COMPARES RECORD KEYS AND RETURNS$*…ANINDICATOROFEQUALORNOTEQUAL* *ON CALL:*…A0=POINTERTOKEY9*…A1=STARTOFRECORDWHICHINCLUDESBYTECOUNTIFPRESENT*…A2=FCBADDR.*…D2=KEYLENGTH*…DIRLRL=DIR.RECORDLENGTH *…BSRCMPKEY* *ON RETURN: *…A0=ALTERED*…A1=UNCHANGED*…A2=UNCHANGED *…D2=ALTERED<*…CONDITIONCODESETACCORDINGTOCOMPAREVALUEOFLASTBYTE*ŠOFKEY‚A0:A1* CMPKEY„EQU„*ŠMOVE.LA1,-(A7)ŠTST.B‚D2‘NULLKEYSŠBEQ.S‚CMPK17YES,SKIPCALLŠTST.W‚FCBDIR+DIRLRL(A2)‚VRL?ŠBNE.S‚CMPK15NO*ŠADD.L‚#BCTFLD,A1‰YES-SKIPOVERBYTECOUNT)CMPK15„CMPM.B(A0)+,(A1)+ˆCHECKFORMATCH ŠBNE.S‚CMPKRTŠDCNTƒD2,CMPK15*KEYS MATCH-MAKE GOOD RETURNCMPK17„CLR.L‚D0CMPKRT„MOVE.L(A7)+,A1ŠRTSŠPAGEŠENDCƒFMSLEVEL-3*"*MVEREC 1.00 11/21/79 L. STEINHOFF*7*MVEREC MOVES USER RECORD TO DATA BLOCK OR TEMP. BUFFER*3*BEFORE CALLING MVEREC, DATA BLOCK HAS BEEN CHECKED3*…TOGUARANTEESUFFICIENTROOMINDBFORRECORDAND*…BYTECOUNT(IFVRL)+*IF MOVING TO TEMP. BUFFER, ALREADY CHECKED/*…THATDATAFITSINTEMP.BUFFERW/OBYTECOUNT* *ON CALL:/*…A1=STARTOFAVAILABLESPACEBEYONDBYTECOUNT*…A2=FCBADDR.*…A4=FATADDR.*…D4=USERRECORDLENGTH)*‡(INCLUDESOPTIONSWORDIFSPOOLERFILE)$*…FATIOS+IOSSAD=STARTOFUSERRECORD *…BSRMVEREC* *ON RETURN:*…Z=1IFNOERROR*†=0IFERRO# RFROML-LMOVE*…D0=STATUSFROMMOVELL*…D4=UNCHANGED6*…A1=LASTBYTEOFRECORD(NOTADJUSTEDFOREVENBYTES) *ˆIFODD)*…A2=FCBADDR.*…A4=FATADDR.* MVEREC„EQU„*ŠMOVE.LA0,-(A7)ŠBSR„DMOVEŽSETUPL-LMOVEŠMOVE.LD4,MVLENG(A0)$ŠMOVE.LFATIOS+IOSSAD(A4),MVSADD(A0)ŠMOVE.LA1,MVDADD(A0).ŠCMP.B‚#SPOOLF,FCBDIR+DIRFIL(A2)SPOOLERFILE?ŠBNE.S‚MVER10NO;*YES-PUT OPTIONS FIELD IN RECORD AND ADJUST DATA BYTE COUNTŠMOVE.WFATIOS+IOSOPT(A4),(A1).ŠSUB.L‚#2,MVLENG(A0)†ADJUSTLENGTHFOROPTIONS3ŠADD.L‚#2,MVDADD(A0)†ADJUSTDEST.ADDR.FOROPTIONS MVER10„EQU„*ŠERQ.MOVELL(A0) ŠBNE.S‚MVERRT$*UPDATE A1 TO POINT TO END OF RECORD)ŠADD.L‚D4,A1ŽPOINT1BEYONDENDOFRECORD'ŠSUB.L‚#1,A1ŽPOINTTOLASTBYTEOFDATAMVERRT„MOVE.L(A7)+,A0ŠRTS„CONDITIONŠCODENOTCHANGEDŠPAGE*!*MVEDTA 1.00 1/18/80 L. STEINHOFF***MVEDTA MOVES USER'S RECORD TO DATA BLOCK,*…EITHERDIRECTLYORTHROUGH<*…TEMP.BUFFERIFSPACECOMPRESSIONANDTEMP.BUFFERALTERED&*BEFORE CALLING MVEDTA, DATA BLOCK HAS1*…BEENCHECKEDTOGUARANTEESUFFICIENTROOMINDB"*…FORRECORDANDBYTECOUNTIFVRL* *ON CALL:+*…A1=STARTOFAVAILABELSPACEINDATABLOCK*…A2=FCBADDR.*…A4=FATADDR.*…D4=COMPRESSEDRECORDLENGTH+*‡(INDLUDES2BYTESFOROPTIONSIFSPOOLER)*…D7=ACTUALUSERRECORDLENGTH*‰D4=D7IFNOSPACECOMPRESSION%*…FATIOS+IOSSAD=STARTOOFUSERRECORD*…DIRLRL=FILERECORDLENGTH *…BSRMVEDTA* *ON RETURN:*…Z=1IFNOERROR*†=0IFERRORFROML-LMOVE*…D0=STATUSFROMMOVE.LL *…D4=UNCHGNED*…D7=UNCHANGED0*…A1=ENDOFRECORD(AZEROBYTEWASADDEDTOEND*ˆOFRECORDIFODD)*…A2=FCBADDR.*…A4=FATADDR."*…A5=STARTOFRECORDINDATABLOCK*‡(BEYONDBYTECOUNTIFPRESET)#*…FAFLDBSETTOINDICATEDBCHANGED*3* NOTE: CAN'T HAVE SPACE COMPRESION IF SPOOLER FILE**INDENTED LIST** MVEDTA MOVES USER'S RECORD TO DATA BLOCK*MVEDTA* VARIABLE LENGTH RECORD?*‚YES,SAVEBYTE-COUNT* COMPRESS SPACES?&*‚NO,MOVERECORD-TODATA-BLOCK$MVEREC$*‚YES,MOVEDATA-TOTEMP.BUF.$MVEREC#*ƒCOMPRESSSPACES,MVETO-DB$CMPSPC* ADJUST FOR-ODD BYTE-COUNT*INDENTED LIST END* MVEDTA„EQU„*ŠMOVEM.LA0/D4/D7,-(A7)ŠTST.W‚FCBDIR+DIRLRL(A2)‚VRL?ŠBNE.S‚MVED10NO'ŠMOVE.WD4,(A1)+‹YES-MOVEINBYTECOUNT MVED10„EQU„*"ŠMOVE.LA1,A5ŽSAVESTARTOFRECORDŠCMP.L‚D4,D7ŽSPACECOMPRESSION?ŠBNE.S‚MVED25YES=*RECORD IS NOT COMPRESSED-OKAY TO MOVE DIRECTLY TO DATA BLOCK ŠBSR„MVERECŠBNE.S‚MVED17ERRORONL-LMOVE$MVED15„BSR„DBCHGŽINDICATEDBCHANGED7*ADJUST END OF RECORD POINTER IF NECESSARY FOR ODD BYTE *…A1POINTSTOLASTBYTEOFDATA ŠMOVE.LA1,D0 ŠBTSTW‚#0,D0)ŠBNE.S‚MVED16EVENNO.OFBYTESINRECORD(ŠADD.L‚#1,A1ŽODDNO.OFBYTES-ADD0BYTE ŠCLR.B‚(A1) MVED16„EQU„* ŠCLR.L‚D0MVED17„MOVEM.L(A7)+,A0/D4/D7ŠRTS>*SET UP TO MOVE RECORD TO TEMP. BUFFER AND THEN SPACE COMPRESS&MVED25„EXG„D4,D7ŽD4=USERRECORDLENGTH+ŠBTSTW‚#VDFLTB,VDTFLG(A6)RECORDDESTROYED?ŠBEQ.S‚MVED28NOŠMOVE.LVDTTMA(A6),A1 ŠBSR„MVEREC ŠBNE.S‚MVED17MVED28„MOVE.LVDTTMA(A6),A0 ŠMOVE.LA5,A1 ŠMOVE.L#1,D04ŠBSR„CMPSPCCOMPRESSESSPACESANDMOVETODATABLOCK ŠBRA.S‚MVED15ŠPAGEŠENDCƒFMSLEVEL-1*/*SETBEG SETS FILE POINTERS AT BEGINNING OF FILE* *ON CALL:*…A4=FATADDRESS *…BSRSETBEG* *ON RETURN:*…D0=1 *…FATCLS=-1 *…FATCLR=-1 *…FATBCT=1 *…FATCFP=0* SETBEG„EQU„*ŠMOVE.L#-1,D0ŠMOVE.LD0,FATCLS(A4)ŠMOVE.LD0,FATCLR(A4) ŠNEG.L‚D0ŠMOVE.LD0,FATBCT(A4)ŠCLR.L‚FATCFP(A4)ŠRTSŠPAGE*"*FMSASN 1.00 12/12/79 L. STEINHOFF#*‡1.016/21/83‚M.BRIEL¥6/24/83MLB:*•AddedcodetocontroltheWriteProtectflag6/24/83MLB5*•intheDCBfordiskdevicesthatdonot†6/24/83MLB7*•generateastatuschangeevent.Anewbit„6/24/83MLB9*•wasalsodefinedintheVDTFLGfieldofthe‚6/24/83MLB4*•theVDTentryforthedevice.Thisbit‡6/24/83MLB8*•saysthatthediskisnotwritable(thoughƒ6/24/83MLB9*•notnecessarilywriteprotected).‚FMSASNis6/24/83MLB8*•calledtoassignthe# device,readsector0ƒ6/24/83MLB7*•ofthedisk,anddetermineifsectorzero„6/24/83MLB7*•containsaVERSADOSVolumeIdentification„6/24/83MLB8*•Block.Ifthesubroutinereturnseithernoƒ6/24/83MLB8*•errororanInvalidVolumeerror,sector0ƒ6/24/83MLB9*•wasreadablesoanattemptismadetowrite‚6/24/83MLB:*•sectorzerobacktothediskasread.Ifany6/24/83MLB5*•erroroccurs,theVDFLNWbitoftheVDT†6/24/83MLB7*•flagsissettoindicatethatthediskis„6/24/83MLB6*•notwritable.Iftheerrorreturnedisa…6/24/83MLB9*•WriteProtecterror,thewriteprotectflag‚6/24/83MLB4*•oftheDCBflags(DFLGWP)isalsoset.‡6/24/83MLB9*•VDFLNWandDFLGSCarebothclearedpriorto‚6/24/83MLB*•callingFMSASN.ž6/24/83MLB2*•OncetheVIDhasbeenreadcorrectly,theDCBis/*•flaggedtoindicatedisknotwriteprotected.*•(DFLGWPcleared).** S. C. BALL 9/23/83E*ƒAddedcodetoconfigurediskafterreadingVID.‚ThiswillenableusB*…bootthesystemwithdiskettesinthedrives.‚FMSwillmounttheE*…diskettesandissueaconfiguredirectivetoconfigurethedisketteH*…accordingtotheconfigurationinformationthathasbeenwrittenthere>*…byINITinsteadofthedefaultsysgenvalueforthatdevice.*.*FMSASN ASSIGNS DISK DEVICE TO FMS IF POSSIBLE1*…IFVOLUMEIDISNOTVALID,ASSIGNMENTISCLOSED* *ON CALL:*…A6=VDTADDR. *…BSRFMSASN* *ON RETURN:*…A6=UNCHANGED#*GOES TO FMSFTL IF UNEXPECTED ERROR**INDENTED LIST#* FMSASN ASSIGNS DISK DEVICE TO FMS*FMSASN* ATTEMP EREW ASSN.TO DISK-.FHS* CLEAR STATUS CHANGED FLAG *ClearVDFLNW‚flag®6/24/83MLB** GET VOLUME-ID $GETVID&*CouldSector0beread?ª6/24/83MLB*N*‚Yes,attempttowriteVIDbacktodisk.Ifanyerroroccurs,settheVDFLNW*F*†flagintheVDTentrysoFMSwillnotattempttowriteaccessdate…*E*†informationtothedisk.IfthespecificerrorreturnedwasWrite†*1*†Protect,alsosettheDFLGWPflagintheDCB.š**ValidVolumeID?¼*J*‚Yes,indicatethattherearenodiskstructurescurrentlyinmemoryby…**†callingsubroutineZERPTR.­*A*‚No,‚closethedeviceassignmentviaacalltoFHS.6/24/83MLB**INDENTED LIST END**‡FHSPARAMETERBLOCK(FMSASN)**‰----------------------*ƒ0…*‡FHSCMD‡*‡COMMAND*‰----------------------*ƒ2…*‡FHSOPT‡*‡OPTIONS*‰----------------------*‰*”**‰----------------------*ƒ6…*‡FHSVOL‡*‡VOLUMENAME*‰*…(4BYTES)†**‰----------------------*‰*”**‰----------------------*ƒ30„*‡FHSGEN‡*‡RESERVED*‰----------------------* FMSASN„EQU„*&ŠMOVEM.LA0-A2/D0-D2,-(A7) 6/24/83MLB*SET UP TO ASSIGN DEVICEŠLEA„FMSBLK1,A0+ŠMOVE.BVDTIOS+IOSLUN(A6),FHSLUN(A0)GETLU!ŠMOVE.W#FHASGN,FHSCMD(A0)ASSIGN+ŠMOVE.W#FOPEREW,FHSOPT(A0)EXC.READ/WRITE$ŠCLR.W‚FHSGEN(A0)‰ZERORESERVEDDATA#ŠMOVE.LVDTDCB(A6),A2†GETDCBADDR.-ŠMOVE.LDCBAID(A2),FHSVOL(A0)GETDEVICECODEŠLEA„FHSCLG(A0),A1$ŠMOVE.W#(CLGLEN+FILLEN+EXTLEN)/2,D0-FMSA10„MOVE.W#'‚',(A1)+ˆSPACE-FILLFILENAMEŠDCNTƒD0,FMSA10 ŠFHSCALL(A0)ŠBEQ.S‚FMSA15NOERROR*ŠCMP.B‚#FSTAAP,D0‰ASSIGNEDBYSOMEONEELSEŠBEQ.S‚FMSA30YES,ŠCMP.B‚#FSTAAS,D0‰FMSALREADYHAVEASSIGNED?ŠBSR„FTL.NENO(*CLEAR DEVICE STATUS CHANGED FLAG IN DCB$***********************¬6/24/83MLB*J*DON'TNEEDSEMAPHORESINCEONLYREAD-MODIFY-WRITEINSTRUCTIONSAREUSED†************************·*:FMSA15„BCLRW‚#DFLGSC,DCBFLG(A2)‚Clearthestatuschange.‘*=ŠBCLRW‚#DFLGWP,DCBFLG(A2)‚FlagsDCBdisknotwriteprotected.;ŠBCLRW‚#VDFLNW,VDTFLG(A6)writableflagintheVDTentry.‹*ŠSPC„2±6/24/83MLB** * S.C.B. vvvvM* Generate a mask to clear all bits in the attributes and parameters that areH*ƒnotmediarelated,areunmodifiablevalues,returnonlyvalues,orare,*ƒvaluesrelatedtothephysicaldiskdrive. 9MSKUNATM‚EQU„1<THEN.S*C*‹WehadagoodreadofVIDandthevolumeisVERSAdosrecognizable:*‹GotrytowriteoutVIDsettingappropriatenotwritable/*‹(VDFLNW)and/orwriteprotect(DFLGWP)flags.ŒBSR.SFMSAGWŒGowriteVIDŒBSR.SFMSADCŒGodoconfigureŒIFTHEN.S*ŽBSRƒZERPTRŠGoindicatenotableinmemoryŒELSE.S!ŽBSR.LFMSACAŠGocloseassignmentŒENDIŠELSE.S B*‹WehadabadreadofVIDorthereadwasgoodbutwedonothave!*‹aVERSAdosrecognizablevolume.ŒIF.BD0#FSTAVOLTHEN.S<*Wehadanunrecognizablevolume-gowriteoutVIDsetting=*appropriatenotwritable(VDFLNW)orwriteprotect(DFLGWP)*flags."ŽBSR.SFMSAGWŠGowriteouttheVIDŒELSE.S9*Wehadanerrorotherthanavolumeerror(probablywas(*anI/Oerror).‚Godismountthedevice. *assignment. ŽBSR.LFMSADMŠGodismountdeviceŒENDI1*‹ClosetheassignmentforanyerrorfromGETVID.%ŒBSR.LFMSACAŒGoclosetheassignmentŠENDI FMSA30„MOVEM.L(A7)+,A0-A2/D0-D2ŠRTS H* Routine to write VID back and set VDFLNW if the disk is unwritable and,*ƒsetDFLGWPifthediskiswriteprotected.*.FMSAGW„MOVE.L#VIDDA,D0ŠSectornumbertowrite'ŠMOVE.L#IOWRIT,D1‰I/Ofunction(write)ŠBSR„GPTSECGodotheI/OŠIFTHEN.S7ŒBSETW#VDFLNW,VDTFLG(A6)Setnot-writableflaginVDT.ŒIF.BD0#ISTAWPTHEN.S8ŽBSETW#DFLGWP,DCBFLG(A2)Setwrite-protectflaginDCB.ŒELSE.S:ŽBCLRW#DFLGWP,DCBFLG(A2)Clearwrite-protectflaginDCB.ŒENDIŠELSE.S:ŒBCLRW#VDFLNW,VDTFLG(A6)Clearnot-writeableflaginVDT.:ŒBCLRW#DFLGWP,DCBFLG(A2)Clearwrite-protectflaginDCB.ŠENDIŠRTS‰PAGE* Routine to do configure.(*‚VIDassumedtobeintemporarybuffer.H*‚Onexit,D0containsstatuscode,contitioncodesreflectD0contents.*‚Statusof0=good.*‰Mountingmadness:<*‰IntheIOSparameterblockonatype0180call(configure)1*‹theoptionsbitstakeonthefollowingmeaning:*Allbitszero‰-Mount*Bit12setŒ-Dismount(*Otherthanbit12set-Configureonly**FMSADC: *%*‰Issueconfiguration/statusrequest.*6ŠMOVE.W#IOSTAT,VDTIOS+IOSFCT(A6)Configuration/status/ŠMOVE.LVDTTMA(A6),A1†Temporarybufferaddress.4ŠMOVE.LVIDCAS(A1),D1†Saveaddressofconfigsector.>ŠMOVE.LA1,VDTIOS+IOSDBP(A6)Statuscomesbackintempbuffer.ŠIOSCALLVDTIOS(A6)*A- ŠIFTHENŒMOVE.LIOSATM(A1),D2*5*‹Wehadagoodstatusbackfromconfiguration/status%*‹Saveattributesandparametersmask**B-$ŒIF.BIOSDTP(A1)#XDSRDKTHEN.S *#*Wehaveavaliddevicetypecode.**C-$ŽIF.BIOSCTP(A1)#XTDIPCTHEN.S *WehaveanIPCtypedevice.:*IPCtypedevicesneednoconfiguratrion-treatasgood.* CLR.LD0ŽELSE.S*-C TST.L‚D1*D-IFTHEN.S -*‘Aconfigurationsectorexistsonthisdisk.<*‘Issuemountrequesttothedriver.‚Setboththeattributes<*‘andparametersmaskstozerotopreventanyofthecurrent<*‘configurationdatafrombeingchanged.‚Themountoptionis;*‘set(allbitszero)tocausethedrivertoputthedevice7*‘on-lineandtoallowI/Orequeststobeprocessed.‚No+*‘errorshouldbereturnedonthisrequest.*’CLR.L‚IOSATM(A1)$*Clearattributes¶metersmask.’MOVE.L#(IOCNFG<<16)+IOPMNT,VDTIOS+IOSFCT(A6)’IOSCALLVDTIOS(A6)/*œIssuemountrequestviaconfiguremumbojumbo ’BSR„FTL.NE*œKillitiferroroccurs*E-’IFTHEN.S *(*“Wehavesuccessfullymountedthedisk.7*“Readtheconfigurationparameterblockintotemporary *“buffer.* ”MOVE.LD1,D0&*œD0=Addressofconfigurationsector”MOVE.L#IOREAD,D1*œD1=Readfunction!”BSR„GPTSEC…GoDOIO-DestroysA1"*œReadintheconfigurationsector*F-”IFTHEN.S 4*•Wehavesuccessfullyreadtheconfigurationsector*•intomemory.5*•Configurethedevice.‚Forcetozeroallbitsinthe5*•attributesandparametersmaskofthenewconfigure7*•parame$ terblockthatdonotcorrespondtovaluesthat7*•describethemedia.‚Thevaluesthatcorrespondtothe *•zeroedbitswillbeunchanged.*;*•Ifthediskisaharddiskthedefaultconfigurationwill7*•bemodifiedalsotoreflecttheconfigurationrequest*–MOVE.LVDTTMA(A6),A1#*œA1=Addressoftemporarybuffer.–MOVE.LD2,IOSATM(A1)#*œPlugmaskfromconfigstatuscall O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>11/28/84>>*O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<THEN.S*—MOVE.L#MSKDRIV,D1*•ELSE.S*—MOVE.L#$FFFFF,D1*•ENDIO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 9/18/84>>>>>>>>>*•AND.L‚D1,IOSATM(A1)2*•MOVE.LA1,VDTIOS+IOSDBP(A6)PointtoconfigP.B.1*•MOVE.L#(IOCNFG<<16)+IOPCONLY,VDTIOS+IOSFCT(A6) ”MOVE.LƒA1,VDTIOS+IOSDBP(A6)4*œEstablishaddressofconfigurationparameterblock *œinIOCB”MOVE.Lƒ#MSKDRIV,D11*œD1=Configurationmasktouseforfloppydrive"*¡Wewillassumemediaisafloppy”BTSTW„#IOARDISC,IOSATW(A1)4*œEdittoseeifthisisafloppyorharddiskmedia*G-”IFTHEN.S *šWehaveaharddisk.*œEstablishconfigurationmaskforaharddisk-*œChangetheharddiskconfigurationdefaults*›MOVE.L†#$FFFFF,D1›AND.L‡D1,IOSATM(A1)3*œEstablishconfigurationmasktouseforharddisk'›MOVE.L†#(IOCHDC<<16),VDTIOS+IOSFCT(A6)2*œEstablishthefunctioncodetoachangedefaults›IOSCALL…VDTIOS(A6)*¦Changetheharddiskdefault*¦configuration”ENDI*-G *H-”IFTHEN.S *šWehaveafloppydisk*œOR**šWehavesuccessfullychangedthedefault *œconfigurationoftheharddisk*3*™Nowwewillconfigurethemediaweareprocessing*–AND.L‡D1,IOSATM(A1)-*œEstablishtheconfigurationmasktousefor*œtheconfigurationrequest0–MOVE.L#(IOCNFG<<16)+IOPCONLY,VDTIOS+IOSFCT(A6)2*œEstablishtheI/Ocallforconfigurationrequest–IOSCALLVDTIOS(A6)!*œIssuetheconfigurationrequest*”ENDI*-HO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<11/28/84<< ”ENDI*-F’ENDI*-EELSE.S*-D8*‘Wedon'thaveanyconfigurationsector-returnagood4*“statussincethismaybeanIPCdiskthatwasmade5*“beforeconfigurationsectorsexisted.‚11/16/84SCB.*‘MOVE.L#3,D0’CLR.L‚D0 11/16/84SCB.ENDI*-DŽENDI*-CŒELSE.S*-B%*Wehadaninvaliddevicetypecode. ŽMOVE.L#2,D0ŒENDI*-BŠENDI*-A(ŠTST.L‚D0‘SetconditioncodesforreturnŠRTS (* Routine to do configure with dismount.G*ƒIssueaconfigurerequestwithdismountoption(bitotherthan12setH*ƒinIOSoptionsfield)andzerosintheattributesandparametersmask.J*ƒThiswillnotchangeanyconfigurationdatabutwillcausethedrivertoD*ƒrejectallfurtherI/OrequestsonthedeviceuntilconfigurewithD*ƒthemountoptionisussued.‚Noerrorshouldoccuronthisrequest.*2FMSADM„MOVE.LVDTTMA(A6),A0†Addressoftempbuffer:ŠMOVE.LA0,VDTIOS+IOSDBP(A6)Usetempbufferasdummyloc./ŠMOVE.L#(IOCNFG<<16)+IOPDMNT,VDTIOS+IOSFCT(A6)6ŠCLR.L‚IOSATM(A0)‰ClearattributesandparametersmaskŠIOSCALLVDTIOS(A6)ŠRTS (* Routine to close assignment to device.*FMSACA„LEA„FMSBLK1(PC),A0(ŠMOVE.W#FHCLOS,FHSCMD(A0)Closecommand8ŠMOVE.BVDTIOS+IOSLUN(A6),FHSLUN(A0)Logicalunitnumber(ŠCLR.W‚FHSGEN(A0)‰ZerooutreservedbyteŠTRAPƒ#3#ŠBSR„FTL.NEAbortiferrorincloseŠRTS * S.C.B. ^^^^ŠPAGE*"*ZERPTR 1.00 12/20/79 L. STEINHOFF*?*ZERPTR ZEROES POINTERS IN VDT TO INDICATE NO SAT, SDB, AND PDB *„INMEMORY* *ON CALL:*…A6=VDTADDR. *…BSRZERPTR* *ON RETURN:*…ALLREGISTERSUNCHANGED* ZERPTR„EQU„*ŠCLR.L‚VDTSMB(A6)‰0SATPSN ŠCLR.L‚VDTDMB(A6)‰0PRIM.DBPSNŠCLR.L‚VDTSDB(A6)‰0SEC.DBPSN *Â6/24/83MLBCŠAND.W‚#1<DON'TMOVEDATA/MOVEDATA*…D4=USERRECORDLENGTH *…FCBDIR+DIRKEY=KEYFIELDLENGTH *…BSRCMPSPC* *ON RETURN: *…A0=CHANGED6*…A1=ENDOFRECORDIFMOVED(DOESNOTADDBYTEIFODD)*…A2=UNCHANGED *…D4=UNCHGNED*…D7=COMPRESSBYTECOUNT**INDENTED LIST3* CMPSPC DETERMINES SPACE COMPRESSED SIZE OF RECORD*CMPSPC* GET-DATA BYTE-OF RECORD* BYTE-IN KEY?*‚NO,BYTEA-SPACE?*ƒYES,COUNTCONSECUTIVESPACES!* ADJUST COMPRESSED RECORD LENGTH* MOVE DATA BYTE?*‚YES,MOVEDATA-TODATA-BLOCK* GO-GET NEXT-BYTE IF-ANY*INDENTED LIST END* CMPSPC„EQU„*ŠMOVEM.LD1-D4,-(A7)$ŠCLR.L‚D7‘ZEROCOMPRESSEDBYTECOUNT ŠMOVE.LD4,D2ŽSAVERECORDLENGHT ŠCLR.L‚D3,ŠMOVE.BFCBDIR+DIRKEY(A2),D3SAVEKEYLENGTH$CMPS05„MOVE.B(A0)+,D1‹GETDATABYTE ŠSUB.L‚#1,D2(*DON'T TRY TO COMPRESS IF BYTE IS IN KEY ŠCMP.L‚D3,D7%ŠBCS.S‚CMPS10KEYBYTE-DON'TCOMPRESSŠCMP.B‚#'',D1ŠBEQ.S‚CMPS30SPACEFOUND*NOT A SPACE-ADJUST COUNTS*CMPS10„ADD.L‚#1,D7ŽCOMPRESSEDRECORDCOUNT ŠTST.B‚D0ŠBEQ.S‚CMPS15DON'TMOVEBYTEŠMOVE.BD1,(A1)+CMPS15„TST.L‚D2‘DONE? ŠBNE.S‚CMPS05'*ALL DATA CHECK - SEE IF DATA WAS MOVED ŠTST.B‚D0ŠBEQ.S‚CMPS25DATANOTMOVED'ŠSUB.L‚#1,A1ŽPOINTTOLASTBYTEOFDATACMPS25„MOVEM.L(A7)+,D1-D4ŠRTS,*SPACE FOUND-COMPRESS ALL CONSECUTIVE SPACESCMPS30„CLR.B‚D4‘0NO.OFSPACESCMPS32„ADD.B‚#1,D4%ŠCMP.B‚#$7F,D4ŒMAX.NO.OFSPACES=$7F ŠBNE.S‚CMPS40!*MUST WRITE OUT SPACE COMPRESSIONCMPS33„ADD.L‚#1,D7 ŠTST.B‚D0 ŠBEQ.S‚CMPS15 ŠBSETW‚#7,D4ŠMOVE.BD4,(A1)+ ŠBRA.S‚CMPS15CMPS40„TST.L‚D2)ŠBEQ.S‚CMPS33ATEND-WRITEOUTLASTSPACEŠMOVE.B(A0)+,D1 ŠSUB.L‚#1,D2ŠCMP.B‚#'',D1ŠBEQ.S‚CMPS32ANOTHERSPACE% $ŠTST.B‚-(A0)ŽPOINTBACKTONON-SPACE ŠADD.L‚#1,D2ŠBRA.S‚CMPS33OUTPUTSPACESŠPAGEŠENDCƒFMSLEVEL-1* *CHKWC 1.00 2/11/80 L. STEINHOFF**#*CHKWC CHECKS TO MAKE SURE IF WRITE"*…ACCESSISREQUESTED,ITISVALID* *ON CALL:*…D1.W=TASKUSERNO.*…D2.W=WRITETYPE(FROMCHKAP)*…A2=FCBADDR.*…A4=FATADDR.4*…A5=ADDR.OFFHSBLOCK(USERNO,WRITECODEPASSED)*…A6=VDTAADDR.* *ON RETURN:*…Z=1IFPROTECTCODEOKAY*†=0IFPROTECTCODEERROR*…D0.B=0IFNOERROR*ŠFSTAPCIFPROTECTCODEERROR*…OTHERREGISTERSUNCHANGED*INDENTED LIST(* CHKWC MAKES SURE WRITE ACCESS IS VALID*CHKWC* WRITE ACCESS PERM.?*‚NO,MAKEGOODRETURN&*‚YES,MAKESURE-VALIDUSER-NO.$USNCHK*ƒWRITECODE=0? *„YES,RETURN*„NO,MAKESURECODESMATCH*INDENTED LIST END**‡FHSPARAMETERBLOCK(CHKWC)**‰----------------------*‰*”**‰----------------------$*ƒ32„*‚FHSWCD‚*‰*‡WRITEPROTECTCODE*‰----------------------** CHKWC…EQU„* ŠTST.W‚D2)ŠBEQ.S‚CHKWGRTŒWRITEACCESSNOTREQUESTED@*USER SHOULD BE ABLE TO WRITE INTO FILES HE WAS ABLE TO ALLOCATE ŠBSR„USNCHK!ŠBNE.S‚CHKWERTŒPROTECTCODEERROR*CHECK WRITE CODEŠMOVE.BFCBDIR+DIRWCD(A2),D0#ŠBEQ.S‚CHKWGRTŒ0MATCHESEVERYTHING7*ALLOW ASSIGNMENT EVEN IF FILE IS WRITE PROTECTED ($FF)**…SOASTOALLOWUSERTOCHANGEPROTECTIONŠCMP.B‚FHSWCD(A5),D0!ŠBNE.S‚CHKWERTŒPROTECTCODEERRORCHKWGRTƒCLR.L‚D0ŠRTSCHKWERTƒMOVE.L#FSTAPC,D0ŠRTSŠPAGE* *CHKRC 1.00 2/11/80 L. STEINHOFF*)*CHKRC CHECKS TO MAKE SURE IF READ ACCESS*…ISREQUESTEED,IT'SVALID* *ON CALL:*…D1.W=TASKUSERNO.*…D2.W=READTYPE(FROMCHKAP)*…A2=FCBADDR.*…A4=FATADDR.4*…A5=ADDR.OFFHSBLOCK(USERNO.,READCODEPASSED)*…A6=VDTADDR. *ON RETURN:*…Z=1IFPROTECTCODEOKAY*…=0IFPROTECTCODEERROR*…D0.B=0IFNOERROR*ŠFSTAPCISPROTECTCODEERROR*…OTHERREGISTERSUNCHANGED**INDENTED LIST'* CHKRC MAKES SURE READ ACCESS IS VALID*CHKRC* READ ACCESS PERM.?*‚NO,MAKEGOODRETURN*‚YES,FILEOWNER-ORSUPERVISOR?*ƒYES,MAKEGOODRETURN*ƒNO,TASKUSER-NO.=VOLUME?*„YES,FILEUSER-NO.=0?*…YES,MAKEGOODRETURN* FILE READ CODE=0? *‚YES,OKAY*‚NO,READCODE=MINUS-1?*ƒYES,PROTECTCODEERROR*ƒNO,READCODESMATCH? *„YES,OKAY*„NO,PROTECTCODEERROR*INDENTED LIST END**‡FHSPARAMETERBLOCK(CHKRC)**‰----------------------*‰*”**‰----------------------*ƒ10„*‡FHSUSN‡*‡USERNUMBER*‰----------------------*‰*”**‰----------------------$*ƒ32„*Š*‚FHSRCD*‡WRITEPROTECTCODE*‰----------------------* CHKRC…EQU„* ŠTST.W‚D2'ŠBEQ.S‚CHKWGRTŒREADACCESNOTREQUESTED@*IF USER IS FILE OWNER OR SUPERVISOR, NO NEED TO MATCH READ CODE ŠTST.W‚D1ŠBEQ.S‚CHKWGRTŒTASKUSERNO.=0ŠCMP.W‚FHSUSN(A5),D1*ŠBEQ.S‚CHKWGRTŒTASKUSERNO.=FILEUSERNO.7*IF TASK USER NO,,=VOLUME USER NO. AND FILE USER NO.=0.*…NONEEDTOMATCHŠCMP.W‚VDTVID+VIDUSN(A6),D1ŠBNE.S‚CHKR10MUSTMATCHŠTST.W‚FHSUSN(A5)ŠBEQ.S‚CHKWGRTŒNONEEDTOMATCH*READ CODE SHOULD BE CHECKED"CHKR10„MOVE.BFCBDIR+DIRRCD(A2),D0#ŠBEQ.S‚CHKWGRTŒ0MATCHESEVERYTHING ŠCMP.B‚#-1,D0%ŠBEQ.S‚CHKWERTŒFILEISREADPROTECTEDŠCMP.B‚FHSRCD(A5),D0&ŠBNE.S‚CHKWERTŒREADCODEDOESN'TMATCHŠBRA.S‚CHKWGRTŠPAGE**GETLUT WAITS FOR LUT SEMPAHORE* *ON CALL: *…BSRGETLUT* *ON RETURN:*…A0=ADDR.OFIOSG *„D0=ALTERED* GETLUT„EQU„*ŠMOVE.LIOCOMS,A0ŠTAS„SVTSLUT(A0)ŠBNE.S‚GETLU2LOCKED ŠRTS„OKAYGETLU2„ERQ.RELINQ ŠBRA.S‚GETLUTŠPAGE**GETDCQ WAITS FOR DCQ SEMAPHORE* *ON CALL: *…BSRGETDCQ* *ON RETURN:*…A0=ADDR.OFIOSG *„D0=ALTERED* GETDCQ„EQU„*ŠMOVE.LIOCOMS,A0ŠTAS„SVTSDCQ(A0)ŠBNE.S‚GETDC2LOCKED ŠRTS„OKAYGETDC2„ERQ.RELINQ ŠBRA.S‚GETDCQŠPAGE* *GETFCBS WAITS FOR FCB SEMAPHORE* *ON CALL: *‚BSRGETFCBS* *ON RETURN:*…A0=ADDR.OFIOSG *…D0=ALTERED GETFCBSƒEQU„*ŠMOVE.LIOCOMS,A0ŠTAS„SVTSFCB(A0)ŠBNE.S‚GETFCALOCKED ŠRTS„OKAYGETFCA„ERQ.RELINQŠBRA.S‚GETFCBSŠPAGE *ACKREQ 1.00 4/1/80 L. STEINHOFF*& )*ACKREQ SENDS ACKNOWLEDGE REQUEST TO USER-*…SETTINGCONDITIONCODEBASEDONVALUEIND1* *ON CALL:"*…D1.L=STATUSTOBERETURNEDIND0*…D2.L=USERTASK*…D3.L=USERSESSION*…D4.B=TRAPNO. *…BSRACKREQ* *ON RETURN:*…A0,D0,ANDD1ALTERED3*…ACKREQGOESTOFMSFTLIFERRORRETURNFROMAKRQST ACKREQ„EQU„*ŠLEA„ACKBLK,A0ŠMOVE.LD2,ACKTSK(A0)ŠMOVE.LD3,ACKSES(A0)CŠMOVE.W#AKOPSC+AKOPRT+AKOPSD,ACKOPT(A0)SETCCANDD0,RESUMETASKŠMOVE.BD4,ACKTIN(A0)8*IF ERROR OCCURRED, MOVE TRAP NO. INTO D0 VALUE RETURNED ŠTST.L‚D1 ŠBNE.S‚ACKR05(ŠMOVE.B#4,ACKCCD(A0)†Z=1SINCENOERROR ŠBRA.S‚ACKR10 ACKR05„EQU„*!ŠCLR.B‚ACKCCD(A0)‰Z=0SINCEERRORŠSWAPƒD1"ŠMOVE.BD4,D1ŽGETTRAPNO.OFCALLŠASL.W‚#8,D1ŽMOVETOBITS11-14 ŠASL.W‚#3,D1ŠSWAPƒD1-ACKR10„MOVE.LD1,ACKRD0(A0)†RETURNEDD0VALUEŠERQ.AKRQST(A0) ŠBSR„FTL.NEŠRTSŠPAGE!*CHKWPD 1.00 4/23/80 L. STEINHOFF*0*CHKWPD CHECKS TO SEE IF DISK IS WRITE PROTECTED* *ON CALL:*…A6=VDTADDR. *…BSRCHKWPD* *ON RETURN:*…Z=1IFNOTWRITEPROTECTED*†=0IFWRITEPROTECTED*…D0.L=0IFNOTWRITEPROTECTED!*‰=ISTAWPIFWRITEPROTECTEDDISK* CHKWPD„EQU„*ŠMOVE.LA0,-(A7) ŠCLR.L‚D0ŠMOVE.LVDTDCB(A6),A0*ŠBTSTW‚#DFLGWP,DCBFLG(A0)WRITEPROTECTED?ŠBEQ.S‚CHKWPRTŠMOVE.L#ISTAWP+NL,D0†YESCHKWPRTƒMOVE.L(A7)+,A0ŠRTSŠPAGE*!*CHKPRM 1.00 L. STEINHOFF 4/23/80*0*CHKPRM CHECKS FILE NAME PARAMETERS FOR ALLOCATE6*…ANDDELETEREQUESTS.‚ALSORETURNSDEFAULTVOLUEMAND7*…USERNO.IFNECESSARYANDMAKESSUREDISKISN'TWRITE *…PROTECTED* *ON CALL:*…A5=ADDR.OFUSERFHSBLOCK*…FMSASQ+EVTUNM=TASKUSERNO.(*…FMSASQ+EVTRA0=USER'SPARM.BLOCKADDR./*…FMSASQ+EVTTSK/EVTSES=USERTASK/SESSIONNUMBER *…BSRCHKPRM* *ON RETURN:*…Z=1IFNOERROR *†=0IFERROR*…D0.B=0IFNOERROR*‰=ERRORCODEOTHERWISE *…A6=VDTADDR.(=0IFANYERROR)1*…D1,D2ANDA0AATEREDSOASTOKEEPCOMMONSTACK*‡USAGEASLOWASPOSSIBLE$*GOES TO FMSFTL IF ERROR ON L-L MOVE***INDENTED LIST$* CHKPRM CHECKS FILE NAME PARAMETERS*CHKPRM&* CHECK-USER NO.,VOLUME, AND-FILE NAME*‚$VALUSN,$VALVOL,$VALFNM'* MAKE-SURE DISK-NOT WRITE-PROT $CHKWPD!* MAKE-SURE OWNER-OF FILE $USNCHK* DEFAULT VOLUME-OR USER-NO.?#*‚YES,RETURNVALUES-TOUSER$MOVE2U*INDENTED LIST END**‡FHSPARAMETERBLOCK(CHKPRM)**‰----------------------*‰*”**‰----------------------*ƒ6…*‡FHSVOL‡*‡VOLUMENAME*‰*…(4BYTES)†**‰----------------------*ƒ10„*‡FHSUSN‡*‡USERNUMBER*‰----------------------* CHKPRM„EQU„*ŠMOVE.LA1,-(A7)(*SEE IF DEFAULT USER OR VOLUME SPECIFIED ŠCLR.L‚D2ŠCMP.W‚#-1,FHSUSN(A5)ŠBEQ.S‚CHKPR10ŠCMP.L‚#'„',FHSVOL(A5)ŠBNE.S‚CHKPR15$CHKPR10ƒMOVE.L#1,D2ŽDEFAULTENTERED!CHKPR15ƒBSR„VALUSNCHECKUSERNO. ŠBNE.S‚CHKPRRTŒMAKEERRORRETURN"ŠBSR„VALVOLCHECKFORVALIDVOLUMEŠBNE.S‚CHKPRRTŒINVALIDVOLUME*…A6=VDTADDR.ŠBSR„VALFNMCHECKFILENAME ŠBNE.S‚CHKPRRTŒINVALIDFILENAME!ŠBSR„CHKWPDWRITEPROTECTEDDISK?ŠBNE.S‚CHKPRRTŒYES-ERROR+*MAKE SURE FILE IS OWNED BY USER OR TASK IS*…SUPERVISORORFILEUSERNO.=0*…ONOWNER'SVOLUME*ŠMOVE.WFMSASQ+EVTUNM,D1ƒGETTASKUSERNO. ŠBSR„USNCHK!ŠBNE.S‚CHKPRRTŒPROTECTCODEERROR+*NOW UPDATE DEFAULT PARAMETERS IF NECESSARY ŠTST.L‚D2ŠBEQ.S‚CHKPGRTŒNODEFAULT ŠBSR.S‚SMOVEAŠLEA„FHSVOL(A5),A1ŠMOVE.LA1,MVSADD(A0)ŠMOVE.LFMSASQ+EVTRA0,A1ŠLEA„FHSVOL(A1),A1ŠMOVE.LA1,MVDADD(A0)!ŠMOVE.L#VOLLEN+USNLEN,MVLENG(A0) ŠBSR„MOVE2UŠBEQ.S‚CHKPGRT,ŠMOVE.L#FSTAIP,D0‰INVALIDPARM.BLOCKADDR.$CHKPRRTƒSUB.L‚A6,A6ŽA6=0SINCEERRORCHKPGRTƒMOVE.L(A7)+,A1ŠRTSŠPAGE*!*SMOVE4 1.00 L. STEINHOFF 4/28/80*7*SMOVE4 SETS UP L-L BLOCK TO MOVE FROM FMS TO USER AREA* *ON CALL:*…A4=FATADDR.*…FATTSK,FATSESSETUP *…BSRSMOVE4* *ON RETURN:%*…A0=ADDR.OFL-LMOVEBLOCK(MOVBLK))*…SOURCEANDDEST.TASK/SESSIONFILLEDIN* SMOVE4„EQU„*ŠLEA„MOVBLK,A0ŠMOVE.LFATTSK(A4),MVDTSK(A0)ŠMOVE.LFATSES(A4),MVDSES(A0)SMOVE40ƒCLR.L‚MVSTSK(A0)ŠRTSŠPAGE*& !*SMOVEA 1.00 4/28/80 L. STEINHOFF*9*SMOVEA IS LIKE SMOVE4 EXCEPT THAT TASK/SESSION IS PICKED *…UPFROMASQ* *ON CALL:*…FMSASQ+EVTTSK=USERTASK*…FMSASQ+EVTSES=USERSESSION *…BSRSMOVEA* SMOVEA„EQU„*ŠLEA„MOVBLK,A0 ŠMOVE.LFMSASQ+EVTTSK,MVDTSK(A0) ŠMOVE.LFMSASQ+EVTSES,MVDSES(A0)ŠBRA.S‚SMOVE40ŠPAGE* *DMOVE 1.00 4/28/80 L. STEINHOFF*6*DMOVE SETS UP L-L BLOCK TO MOVE FROM USER TO FMS AREA* *ON CALL:*„A4=FATADDR.*…FATTSKANDFATSESSETUP *„BSRDMOVE* *ON RETURN%*„A0=ADDR.OFL-LMOVEBLOCK(MOVBLK))*…SOURCEANDDEST.TASK/SESSIONFILLEDIN* DMOVE…EQU„*ŠLEA„MOVBLK,A0ŠMOVE.LFATTSK(A4),MVSTSK(A0)ŠMOVE.LFATSES(A4),MVSSES(A0)ŠCLR.L‚MVDTSK(A0)ŠRTSŠPAGE* *SUASQ 1.00 5/19/80 L. STEINHOFF*8*SUASQ MOVES INFO. FROM DCQ TO ASQ AND DELETES DCQ ENTRY:*…DCQSEMAPHOREISLOCKEDATBEGINNINGANDUNLOCKEDATEND** *ON CALL:!*…A2=FCBADDR.ORADDR.OFFHSQUE* *…BSRSUASQ* *ON RETURN:*…A0=ADDR.OFIOSG*…A1=FMSASQ1ADDR.*…A2=UNCHANGED*…A3,A4,D0ALTERED***‰FHSI/OEVENTMESSAGE(EOT)**‰----------------------*‰*”**‰----------------------*ƒ8…*‚EVTKOD‚*‰*‡SUB-CODE*‰----------------------(*ƒ10„*‡EVTLUE‡*‡LOGICALUNITTABLEENTRY*‰*…(4BYTES)†**‰----------------------"*ƒ14„*‡EVTLUT‡*‡LOGICALUNITTABLE*‰*…(4BYTES)†**‰----------------------7*ƒ18„*‚EVTTIN‚*‚EVTPRI*‡TRAPINST#/REQUESTORPRIORITY*‰----------------------%*ƒ20„*‡EVTTSK‡*‡REQUESTOR'STASKNAME*‰*…(4BYTES)†**‰----------------------**ƒ24„*‡EVTSES‡*‡REQUESTOR'SSESSIONNUMBER*‰*…(4BYTES)†**‰----------------------*ƒ28„*‡EVTUNM‡*‡USERNUMBER*‰----------------------*ƒ30„*‡EVTRD0‡*‡REQUESTOR'SD0*‰----------------------*‰*”**‰----------------------*ƒ38„*Š*‚EVTPSZ*ˆ/PBLENGTH*‰----------------------* SUASQ…EQU„*ŠBSR„GETDCQLOCKDCQSEM.ŠLEA„FMSASQ1,A1ŠCMP.L‚#FHSQUE,A2‰FHSQUEUE?ŠBNE.S‚SUAS05NO*YES-GET DCQ ADDR.ŠMOVE.L(A2),A3ŠMOVE.LDCQNXT(A3),D0 ŠBCLRƒ#31,D0$ŠMOVE.B#FHLEVT,EVTKOD(A1)FHSEVENT'ŠMOVE.LD0,(A2)ŒMASKOFFHIGHORDERBIT ŠBRA.S‚SUAS08*DCQ IS HANGING OFF FCBSUAS05„MOVE.LFCBDCQ(A2),A3ŠMOVE.LDCQNXT(A3),D0 ŠBCLRƒ#31,D0$ŠMOVE.B#IOLEVT,EVTKOD(A1)IOSEVENTŠMOVE.LD0,FCBDCQ(A2)SUAS08„BEQ.S‚SUAS10 ŠMOVE.LD0,A0ŠBSETW‚#15,DCQNXT(A0)*MOVE INFO. TO ASQ FROM DCQ,SUAS10„MOVE.BDCQPRI(A3),EVTPRI(A1)PRIORITYŠMOVE.BDCQTIN(A3),D0"ŠMOVE.L#IOSESS,EVQSES(A1)SESSION2*RESET MESSAGE LENGTH FOR POSSIBLE CALL TO SPOOLER!ŠMOVE.B#EVTLEN+FHSNLN,EVLENG(A1)%ŠMOVE.B#EVCQUE,EVCODE(A1)EVENTCODEŠMOVE.BD0,EVTTIN(A1)†TRAPNO.ŠBTSTƒ#EVTNEOT,D0ˆEOT?ŠBEQ.S‚SUAS15NO%ŠMOVE.LDCQLUT(A3),EVTTSK(A1)TASKID%ŠMOVE.LDCQLUE(A3),EVTSES(A1)SESSION ŠBRA.S‚SUAS25 SUAS15„EQU„*'ŠMOVE.LDCQLUE(A3),EVTLUE(A1)LUNENTRYŠMOVE.LDCQLUT(A3),A4ŠMOVE.LA4,EVTLUT(A1)†LUTADDR.&ŠMOVE.WLUTUNM(A4),EVTUNM(A1)USERNO.ŠMOVE.LLUTTID(A4),D0ŠMOVE.LLUTSES(A4),D1ŠLEA„MOVBLK,A0$ŠMOVE.LD0,EVTTSK(A1)†SAVEUSERTASKŠMOVE.LD0,MVSTSK(A0)'ŠMOVE.LD1,EVTSES(A1)†SAVEUSERSESSIONŠMOVE.LD1,MVSSES(A0)ŠCLR.L‚MVDTSK(A0)‰MOVETOFMSŠMOVE.LDCQLAD(A3),A4'ŠMOVE.LA4,EVTRA0(A1)†PARM.BLOCKADDR."ŠMOVE.LA4,MVSADD(A0)†SOURCEADDR.'ŠMOVE.L#FMSBLK1,MVDADD(A0)DEST.ADDR. ŠCLR.L‚D0(ŠMOVE.BDCQPLN(A3),D0†PARM.BLOCKLENGTHŠMOVE.BD0,EVTPSZ(A1)ŠMOVE.LD0,MVLENG(A0)ŠERQ.MOVELL(A0) ŠBSR„FTL.NE0SUAS25„CLR.L‚DCQDCB(A3)‰INDICATEDCQENTRYEMPTYŠMOVE.LIOCOMS,A0#ŠCLR.B‚SVTSDCQ(A0)ˆRELEASEDCQSEM.ŠRTSŠPAGE**DOIO 1.00 5/20/80 L. STEINHOFF*0*DOIO STARTS UP PROCEED I/O, SAVES REGISTERS AND'*…STACKPOINTERANDRESETSCOMMONSTACK** 5 March 1984 - SCB.D*DOIO2 Performs same function as DOIO except that the proceed bit isA*‚notset.‚WewilldoanI/Oandproceed.‚StackwillnotberesetB*‚wewillreturntothesamepointinthecodeafterI/Owithwait *‚isdone* *ON CALL:*…A4=FATADDR.(=0IFNONE)*…A6=VDTADDR. *…BSRDOIO* *ON RETURN:*…D0=ERRORSTATUS*…A0=IOCBADDR.*'  DOIO†EQU„*ŠOR.Wƒ#IOPPRO,VDTIOS+IOSOPT(A6)/DOIO2…EQU„*’AlternateentrypointforI/Owait.ŠIOSCALLVDTIOS(A6) ŠBNE.S‚DOIO20:ŠBTSTW‚#IOPWATB,VDTIOS+IOSOPT(A6)DowewantI/Oandwait?4ŠBEQ.S‚DOIO20Branchifyes-returncauseI/Odone.7ŠMOVEM.LA1-A5/D1-D7,-(A7)No-I/Oproceed,saveregs.ŠMOVE.LA7,VDTSSP(A6)+ŠMOVE.LSAVESP,A7ŠRESTORECOMMONSTACKPTR.ŠBRA„FMSREVGOWAITFOREVENT DOIO20„RTSŠPAGE*"*DEVBSY 1.00 5/23/80 L. DSTEINHOFF*5*DEVBSYCHECKSTOSEEIFDEVICEISBUSY.‚IFITIS,IT:*…DOESAWAITFOREVENT.‚IFNOT,DEVICEISSETBUSY,STACK7*…MOVEDTOVDTAREAANDRETURNADDR.MOVEDTONEWSTACK*:*NOTE: MUST BE CALLED FROM LEVEL 0 (NOT WITHIN SUBROUTINE)* *ON CALL:*…A6=VDTADDR. *…BSRDEVBSY* *ON RETURN:*…A1=FMSASQADDR.*…A5=FMSBLKADDR.*…A2,A4,A6=UNCHANGED *…VDFLBBSET*…A7=VDTSTACKAREA*…ALLOTHERREGISTERSALTERED* DEVBSY„EQU„*&ŠBSETW‚#VDFLBB,VDTFLG(A6)DEVICEBUSY?ŠBEQ.S‚DEVB10NOO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 10/3/84>>>>>>>>>*YES-GET EVENT AND RECHECKŠMOVE.Lƒ#GTEVNT,D0ŠTRAP…#1*œGETTHEEVENT ŠBSR†FMSASR*œPROCESSTHEEVENTREAD ŠBRA.S„DEVBSYO*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FAM 10/03/84>>>>>>>>/DEVB10„MOVE.L(A7)+,VDTSTK(A6)ƒGETRETURNADDR.(ŠMOVE.LA7,SAVESPŠSAVECOMMONSTACKPTR.ŠLEA„VDTSTK(A6),A7ŠLEA„FMSBLK,A5ŠLEA„FMSASQ,A1ŠRTSŠPAGE*!*DEVFRE 1.00 5/27/80 L. STEINHOFF*,*DEVFRE CLEARS DEVICE BUSY FLAG (IF SET) AND*…RESTORESCOMMONSTACKPOINTER*"*NOTE: MUST BE CALLED FROM LEVEL 0* *ON CALL:*…A6=VDTADDR.(=0IFNONE) *…BSRDEVFRE* *ON RETURN:*…A6=UNCHANGED*…VDFLBBCLEARED#*…A7=RESTOREDCOMMONSTACCKPOINTER* DEVFRE„EQU„* ŠCMP.L‚#0,A6 ŠBNE.S‚DEVF10DEVF05„RTS„NO‘VDTADDR.DEVF10„BCLRW‚#VDFLBB,VDTFLG(A6)!ŠBEQ.S‚DEVF05DEVICEWASNOTBUSY:*SINCE DEVICE WAS BUSY, COMMON STACK PTR. MUST BE RESTORED)ŠMOVE.L(A7)+,VDTSSP(A6)ƒGETRETURNADDR.+ŠMOVE.LSAVESP,A7ŠPUTRETURNADDR.ONSTACKŠMOVE.LVDTSSP(A6),-(A7)ŠRTSŠPAGE*!*CHKWAP 1.00 6/13/80 L. STEINHOFF*4*…CHKWAPCHECKSTOSEEIFWRITEACCESSISREQUESTED.2*…IFITIS,APISFORCEDTOEREWUNLESSSEQUENTIAL*…FILE* *ON CALL:*…D1.B=ACCESSPERMISSION*…D5.W=FILETYPE *…BSRCHKWAP* *ON RETURN:*…Z=1IFNOERROR *†=0IFERROR*…D0.B=0IFNOERROR*‰=FSTAAPIFACCESSPERM.ERROR,*…D1=ACCESSPERM.(SETTOEREWIFNECESSARY)*…D2=READ/WRITETYPES*…D5=UNALTERED* CHKWAP„EQU„* ŠBSETƒ#6,D1ŠBSR„CHKAPŽGETREAD/WRITETYPESŠBNE.S‚CHKWA30ŒERROR!ŠTST.W‚D2‘WRITEACCESSREQUESTED?ŠBEQ.S‚CHKWA30ŒNOTHINGTODO#*IF NOT SEQUENTIAL FILE, FORCE EREWŠCMP.B‚#DATSEQ,D5ŠBLE.S‚CHKWA30ŒSEQUENTIAL******************************+*ALL VOLUME WRITES MUST BE EREW SINCE DON'T'*…WANTFILEI/OIFVOLUMEBEINGUPDATEDŠMOVE.B#FOPEREW,D1ˆSETTOEREWCHKWA30ƒTST.B‚D0‘SETCOND.CODEŠRTSŠPAGE* *CHKMA 1.00 6/18/80 L. STEINHOFF*1*CHKMA DEETERMINES IF MORE THAN 1 ASSIGN. TO FILE* *ON CALL:*…A2=FCBADDR.*…A4=FATADDR.*…A6=VDTADDR. *…BSRCHKMA* *ON RETURN:*…Z=1IFONEASSIGNEMENT*†=0IFMORETHAN1ASSIGN.* CHKMA…EQU„*#ŠMOVEM.LD0-D2,-(A7)‡SAVEREGISTERSŠMOVE.WFATASN(A4),D1ŠAND.W‚#FAPBIT,D1 ŠBSETƒ#6,D1ŠBSR„CHKAPŽGETREAD/WRITETYPES ŠBSR„FTL.NEŠCMP.W‚FCBWCT(A2),D2$ŠBNE.S‚CHKM10MORETHAN1ASSIGNMENTŠSWAPƒD2#ŠCMP.W‚FCBRCT(A2),D2†SETCOND.CODECHKM10„MOVEM.L(A7)+,D0-D2ŠRTSŠPAGE* *MOVE2U 1.00 7/3/80 L. STEINHOFF**MOVE2U MOVES DATA TO USER AREA* *ON CALL:%*…A0=ADDR.OFMOVELLPARM.BLOCKWITH*‰ALLPARAMETERSSETUP *…BSRMOVE2U* *ON RETURN:*…Z=1IFNOERRORFROML-L *†=0IFERROR*„D0=ERRORCODEFROMMOVELL9*GOES TO FATAL IF ERROR OTHER THAN RTCDADR2 (DEST. BUFFER8*…NOTINUSERSPACE)ORRTCDLGCF(MOVEFROMEVENTOODD)* MOVE2U„EQU„*ŠERQ.MOVELL(A0)ŠBEQ.S‚MOVE220ŒGOODMOVEŠCMP.B‚#RTCDADR2,D0ŠBEQ.S‚MOVE210ŠCMP.B‚#RTCDLGCF,D0 ŠBSR„FTL.NE!MOVE210ƒTST.B‚D0‘SETCCFORERROR MOVE220ƒRTSŠPAGE*' :*MOVENAME MOVES FILE NAME FROM FCB TO USER PARAMETER BLOCK* *ON CALL:*…A2=FCBADDR.*…A5=FHSPARAMETERBLOCKADDR.*…A6=VDTADDR.*…BSRMOVENAME** *‡FHSPARAMETERBLOCK(MOVENAME)**‰----------------------*‰*”**‰----------------------*ƒ6…*‡FHSVOL‡*‡VOLUMENAME*‰*…(4BYTES)†**‰----------------------*ƒ10„*‡FHSUSN‡*‡USERNUMBER*‰----------------------*ƒ12„*‡FHSCLG‡*‡CATALOGNAME*‰*…(8BYTES)†**‰----------------------*ƒ20„*‡FHSFIL‡*‡FILENAME*‰*…(8BYTES)†**‰----------------------*ƒ28„*‡FHSEXT‡*‡EXTENSION*‰----------------------*MOVENAME2ŠMOVE.LVDTVID+VIDVOL(A6),FHSVOL(A5)GETVOLUMEIDŠBNE.S‚MOVEN10*-*ˆIFVOLUMEI.D.=0(FOREIGNDEVICE),RETURN*ˆDEVICENAMEINSTEAD*ŠMOVE.LA0,-(A7)‹SAVEA0%ŠMOVE.LVDTDCB(A6),A0†GETDCBPOINTER1ŠMOVE.LDCBAID(A0),FHSVOL(A5)PUTIDINFHSBLOCKŠMOVE.L(A7)+,A0‹RESTOREA0 MOVEN10ƒEQU„*$ŠMOVE.WFCBSDB+SDBUSN(A2),FHSUSN(A5)$ŠMOVE.LFCBSDB+SDBCLG(A2),FHSCLG(A5)(ŠMOVE.LFCBSDB+SDBCLG+4(A2),FHSCLG+4(A5)$ŠMOVE.LFCBDIR+DIRFIL(A2),FHSFIL(A5)(ŠMOVE.LFCBDIR+DIRFIL+4(A2),FHSFIL+4(A5)$ŠMOVE.WFCBDIR+DIREXT(A2),FHSEXT(A5)ŠRTSŠPAGE*B*CHKSPLCHECKSTOSEEIFREQUESTIFFORSPOOLERFILE.‚ITISISANDF*…REQUESTORISNOTSPOOLERTASK,EVENTISSETUPTOBESENTTOSPOOLER* *ON CALL:*…A1=FMSASQADDR.*…A2=FCBADDR. *…BSRCHKSPL* *ON RETURN:&*…D0=0IFSPOOLERSHOULDBESENTEVENT *‡=1IFNOT*…ZSETACCORDINGTOD0* *‰FHSI/OEVENTMESSAGE(CHKSPL)*‰FHSI/OEVENTMESSAGE(EOT)**‰----------------------*‰*”**ƒ8…*‚EVTKOD‚*‰*‡SUB-CODE*‰----------------------*‰*”**‰----------------------**ƒ24„*‡EVTSES‡*‡REQUESTOR'SSESSIONNUMBER*‰*…(4BYTES)†**‰----------------------*CHKSPLE*IF SPOOLER FILE, EVENT MUST BE QUEUED TO SPOOLER TASK WITH FILE NAME *INCLUDED ŠCMP.B‚#SPOOLF,FCBDIR+DIRFIL(A2)ŠBNE.S‚CHKSPRTŒNOTSPOOLERFILE/*DON'T SEND EVENT IF SPOOLER TASK IS DOING CALL,ŠCMP.L‚#IOSESS,EVTSES(A1)CHECKSESSIONONLYŠBEQ.S‚CHKSPRT/*EVENT DOES NOT INCLUDE SENDER TASK/SESSION, SO*…MOVESTARTOFEVENTDOWN ŠMOVE.BEVLENG(A1),D0†GETLENGTH$ŠSUB.B‚#8,D0ŽADJUSTFORTASK/SESSIONŠMOVE.BD0,EVLENG+8(A1)>ŠMOVE.BEVCODE(A1),EVCODE+8(A1)MOVECODEDOWN8(D.V.2/3/81)1ŠMOVE.B#SPLEVT,EVTKOD(A1)SETUPSPOOLERSUBCODE ŠCLR.L‚D0ŠRTSCHKSPRTƒMOVE.L#1,D0ŠRTSŠENDéééééé( =/*=/*†INIT316.AF=/*%=/* Chain file to assemble INIT316.SA=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to INIT316.LS=/*=/IFC \1ƒ=ARGINIT316.LS=/ENDIF=/*=ASM INIT316.SA,INIT316.RO,\1;R=/*{ Included files are:=/*ƒ9995.&.VME316.EQ=/*}=/*=ENDééééééøŠINCLUDE9995.&.VME316.EQ ŠSECTION8*H*‚ThisistheinlinecodetoinitializetheVME316I/OchanneltoVMEbusJ*‚adapterboard.‚Itwasdesignedtobeincluded(notcalled)bytheINITIO *‚module.*  *init_VME316: proc;  *ˆassertIOREStoI/Ochannel;*ˆwait1/2seconds;*ˆnegateIOREStoI/Ochannel; *ˆvector_register_0<==$50;*ˆvector_register_1<==$51;*ˆvector_register_2<==$52;*ˆvector_register_3<==$53; ?*ˆcontrol_register_0<==enable_interrupts+interrupt_level_3;@*ˆcontrol_register_1<==disable_interrupts+interrupt_level_0;?*ˆcontrol_register_2<==enable_interrupts+interrupt_level_5;@*ˆcontrol_register_3<==disable_interrupts+interrupt_level_0;  *end init_VME316;ŠPAGE*I*‚FirstresetalldevicesontheI/Ochannel.‚(Thiswillalsodisableany"*‚interruptsfromtheI/Ochannel.*ŠLEA„VME316_EXIT(PC),A0*ŠMOVE.LA0,-(A7)‹WheretogoforbuserrorAŠMOVE.W#'BE',-(A7)‚Codetotellexecwe'retestingforbuserror 4ŠMOVE.B#$01,IORES_316…AssertIORES*toI/Ochannel. 0ŠMOVE.L#65101,D0ŠWaitapproximately1/2second. IORES_LOOP: ŠSUBI.L#1,D0ŠBNE.S‚IORES_LOOP 4ŠMOVE.B#$00,IORES_316…NegateIORES*toI/Ochannel.  *J*‚Now,initializetheVBIMtointerrupttheVMEbusonvectorsassysgened.*/ŠMOVE.B#$50,VBIM_VR0†Vector_reg_0<==IOCVEC1;/ŠMOVE.B#$51,VBIM_VR1†Vector_reg_1<==IOCVEC2;/ŠMOVE.B#$52,VBIM_VR2†Vector_reg_2<==IOCVEC3;/ŠMOVE.B#$53,VBIM_VR3†Vector_reg_3<==IOCVEC4; *K*‚Now,initializetheVBIMcontrolregisterstointerrupttheVMEbusinthe7*‚non-auto-resetmodeattheinterruptlevelssysgened.*=ŠMOVE.B#$10+2,VBIM_CR0Control_reg_0<==enable_interrupts+*µinterrupt_level;=ŠMOVE.B#$10+3,VBIM_CR1Co( ntrol_reg_1<==enable_interrupts+*µinterrupt_level;=ŠMOVE.B#$10+4,VBIM_CR2Control_reg_2<==enable_interrupts+*µinterrupt_level;=ŠMOVE.B#$10+5,VBIM_CR3Control_reg_3<==enable_interrupts+*µinterrupt_level; D ,ŒADD.L#6,A7BypassbuserrorstuffonstackVME316_EXITEQUƒ* B*Note:‚ThereisnoRTSattheendofthisfilebecauseitwillbe?*Šlinkedwithmorecode(either600leveldriverinitialization,*Šcodeorsimplyamodulewith'RTS'init). ŠENDéééééé=/* =/*†IOI.AF=/**=/* Chain file to assemble I/O Initializer=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to IOI.LS=/*=/IFC \1 ƒ=ARGIOI.LS=/ENDIF=/*=ASM IOI.SA,IOI.RO,\1;RZ=120=/*{ Included files are:=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.EXE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.FME.EQ=/*ƒ9995.&.FMI.EQ=/*ƒ9995.&.LV5.EQ=/*ƒ9995.&.UTILITY.MC=/*ƒTEMPLATE.IOI.AI=/*}=/*=ENDéééé) ééEIOI‡IDNTƒ4,0ƒVERSAdosI/OInitializationSystemTaskV4.1-09/13/82ŠOPT„CREF***********************************************************************&*VERSADOSOPERATINGSYSTEM-OEMRTOS* *—I/OMODULE**IOII/OMODULEINITILIZATION*$*COPYRIGHTED1980BYMOTOROLA,INC.*F************************************************************************PROGRAMNAME:‚.IOI**REV.‚1.00‚8/01/79ƒ(JIMSMITH)D*REV.‚2.00‚7/28/81ƒ(DICKVANDERLIN)-ADDITIONOFI/OWITHTIME-OUT**FUNCTION:‚I/OINITIALIZATION**CALLINGSEQUENCE:‚EXECINIT.*+*SUPPORTTABLES:‚CHANNELDATABLOCKS(CDB)*’DEVICECONTROLBLOCKS(DCB)/*ˆCDB'sandDCB'sarefoundinIOC.SA,whichis*ˆassembledatSYSGENtime.*F********************************************************************** **‚Includedequatefiles:*ˆTR1 *ˆTR1RTCD*ˆIOE*ˆEXE*ˆNIO*ˆFME*ˆFMI*ˆLV5*ŠNOLISTŠINCLUDE9995.&.TR1.EQŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.EXE.EQŠINCLUDE9995.&.NIO.EQŠINCLUDE9995.&.FME.EQŠINCLUDE9995.&.FMI.EQŠINCLUDE9995.&.LV5.EQŠINCLUDE9995.&.UTILITY.MCŠLISTŠINCLUDEƒTEMPLATE.IOI.AIŠPAGE*„ASRADDRESSES ‰XDEF†KILL‰XDEF†INITROMR ŠXREFƒCCSEGŠXREFƒEETSTARTŠXREFƒFMSIOI01 ŠXREFƒIOCOME ŠXREFƒIOCOMS ŠXREFƒOESIZE ŠXREFƒOSMEND ŠXREFƒOSMTBL ŠXREFƒROMIOI1 **IOCOMNŽSEGMENTNAME ŠSECTION1**ˆPARAMETERBLOCKS* GSEGPBLK:‰DC.L†0,*œTASKNAME=0==>USEREQUESTINGTASKNAME‰DC.L†0*œTASKSESSIONNUMBER ‰DC.W†$2000*œDIRECTIVEOPTIONS-*BIT13-LOGICALADDRESS=PHYSICALADDRESS‰DC.W†$0*œSEGMENTATTRIBUTES ‰DC.B†'DIOI'*œSEGMENTNAME‰DC.L†$0 *œPHYSICALADDRESSIFAPPLICABLE‰DC.L†GSEGSIZE*œSEGMENTBYTESIZE‰PAGE **IOIIDSEGMENTNAME**'*ˆWALKCDBCHAINANDALLOCATEALLKNOWN%*ˆI/OCHANNELS.‚STARTALLOSMODULES.****‰PAGEINIT: ‰SUB.L…A5,A5 *œA5=ZERO‰MOVE.L„#IOCOMS,A63*œA6=ADDRESSOFI/OCOMMONDATASEGMENTATSYSGENm$K,N4Q<]DfLD*¦TIME ‰BRA‡ROMIOI14*œPERFORMREQUIREDFUNCTIONSIFTHISISAROMSYSTEM(*¤*IFTHISISNOTAROMBASEDSYSTEMAN(*¦IMMEDIATE'BRANCH'WILLBEEXECUTEDTO *¦'INITROMR''*¤*IFTHISISAROMBASEDSYSTEMARAM&*¦DATASEGMENTWILLBEOBTAINED--THE&*¦ADDRESSOFTHERAMDATASEGMENTWILL*¦BERETURNEDINREGISTERA5)*¤*THEROMDATASEGMENTWILLBEMOVEDTO*¦THERAMDATASEGMENT**¤*ADDRESSESINTHERAMDATASEGMENTWILL *¦BEADJUSTED&*¤*CONTROLWILLTHENBETRANSFEREDTO *¦'INITROMR'**¤*ABRANCHTOANDFROMTHEPOTENTIALROM$*¦LOGICWASUSEDBECAUSEITKEPTRAM*¦FRAGMENTATION)*¦INOBTAININGDATASEGMENTSATAMINIMUM*‰PAGE ****** ****…UPONRETURNA5FROMROMIOI1>*****ŽEQUALZERO…WHICHIMPLIESTHATTHISISARAMBASEDSYSTEMA****EQUALNON-ZEROWHICHIMPLIESTHATTHISISAROMBASEDSYSTEM/***ŸA5=ADDRESSOFI/OCOMMONDATASEGMENTFOR**¥RAMBASEDSYSTEM.* INITROMR:‰LEA‡GSEGPBLK(PC),A0-*œA0=ADDRESSOFGETSEGMENTPARAMETERBLOCK‰MOVE.L„#GTS) EG,D0*œD0=DIRECTIVENUMBER‰TRAP†#1*œGETDATASEGMENTFORTASK ‰BNE‡INIT9999*œBRANCHIFERROROCCURRED ‰MOVE.L„A0,A3,*œA3=ADDRESSOFDATASEGMENTFORTHISTASK‰MOVE.L„#GSEGSIZE,D0$*œD0=NUMBEROFBYTESFORTHISLOOPINIT02: ‰CLR.B…(A0)+ ‰SUB.L…#1,D0 ‰BNE.S…INIT020*œCLEARTHEDATASEGMENTFORTHISTASKTOZERO'S*œBRANCHIFNOTDONE *œINITIALIZE‰LEA‡STACK(A3),A7*œA7=TASKSTACKPOINTER‰MOVE.L„#IOCOMS,A03*œA0=ADDRESSOFI/OCOMMONDATASEGMENTATSYSGEN*¦TIME‰MOVE.L„A5,REGA0(A3) ‰BNE.S…INIT04*œBRANCHIFAROMBASEDSYSTEM‰MOVE.L„A0,REGA0(A3))*œA0=IMPLIESWEHAVEARAMBASEDSYSTEM2*œREGA0=STARTADDRESSOFI/OCOMMONDATASEGMENT(*¦IOSGWHICHWILLBEPASSEDTOOPERATING*¦SYSTEMTASKSATSTARTUPTIMEINIT04:‰MOVE.L„REGA0(A3),A6*œA6=I/OCOMMONADDRESS ‰BSR‡TEMPLATE"*œINITIALIZETHETASKDATASEGMENT,ŠMOVE.L#CCSEG,A1ŠSETUPPOINTERTOCDBLISTŠTST.L‚XCDBPTR(A1) ŠBEQ.S‚INIT19*œJMPIFTHEREARENOCDB'S0‰LEA‡ALLBLK(A3),A0‰SETUPPOINTERTOPARAMBLOCK *D*‚MOVEDATAFROMTHECHANNELDATABLOCK(WITHINIOC)TOOURALLOCATEB*‚PARAMETERBLOCK.‚NOTETHATXIOOPTISANOLDEQUATEFROMTHEDAYSA*‚WHENTHEOPTIONSFIELDWASONLYTHESECONDBYTEOFTHEWORD,SO7*‚XIOOPT-1REFERSTOTHEBEGINNINGOFTHEOPTIONSWORD.*INIT10:‰MOVE.L„A3,-(A7)*œSAVEREGISTER=ŠMOVE.WXCDBOPT(A1),XIOOPT-1(A0)SETUPOPTIONSFORALLOCATE.6ŠMOVE.LXCDBAID(A1),XIOCID(A0)SETUPCHANNELMNEMONIC3ŠMOVEM.LXCDBPRM(A1),D0-D5/A2-A4PICKUPPARAMETERS=ŠMOVEM.LD0-D5/A2-A4,XIOPRM(A0)MOVEPARAMETERSTOPARAMBLOC‰MOVE.L„(A7)+,A3*œRESTOREREGISTER *>*‚IFTHISISANIPCCHANNEL,SETOPTIONSFORCHPI(XOPEXC)AND*‚EXCLUSIVEVECTORING(XOPDIR).*"ŠIF.BƒXIOCTP(A0)…#XTDIPCƒOR.BXIOCTP(A0)‹#XTMIPCƒTHEN.SOR.Bƒ#XOPEXC+XOPDIR,XIOOPT(A0)ŠENDI *,*‚NOWCALLTHEEXECTOALLOCATETHECHANNEL.*)ŠMOVE.L#XCCMR,D0ŠSETUPDIRECTIVENUMBERŠTRAPƒ#1‘ALLOCATECHANNELŠBEQ.S‚INIT17OK"ŠCMP.B‚#XSTCAD,D0‰CHANNELMISSING? *‰BNE„KILLERROR,CAN'TCONTINUE ‰BSRNE‡KILL *<*‚CHANNELALLOCATEDOK--IFTHEREAREMORETOALLOCATE,LOOP.*)INIT17„MOVE.LXCDBPTR(A1),A1…GETNEXTCDB ŠTST.L‚(A1)ŠBNE.S‚INIT10NOTFINISHED‰PAGE**ˆNOWSETUPOSMODULES*INIT19: ‰BSR‡FMSIOI01-*œPERFORMANYFMSCALCULATIONSTHATMAYEXIST.*œIFFMSISNOTPRESENTINTHESYSTEMAN'RTS'*¡INSTRUCTIONWILLBEEXECUTED*œELSE,*¡THEAPPROPRIATEFMSLOGICWILLBEEXECUTED*¡D0=FMSASQLENGTH‰MOVE.L„D0,REGA0-4(A3)*œD7=REGA0-4(A3)1*œD7=FMSASQLENGTHIFFMSISPRESENTINSYSTEM*¢ELSE*¡VALUEIND7ISMEANINGLESS‰MOVE.L„#DCLSHR,D0*œD0=DIRECTIVENUMBER‰LEA‡SEGBLK(A3),A0*œA0=PARAMETERBLOCKADDRESS‰TRAP†#1!*œDECLARECOMMONSEGMENTSHARABLE *‰BNE„KILL ‰BSRNE‡KILL ‰BSR‡GETLHSV*œGETLOW/HIGHSTARTVALUE ‰BNE‡INIT50!*œBRANCHIFOSLISTTABLEISEMPTY*"*ˆSTARTPROCESSINGOFOSLISTTABLE*INIT30: ‰BSR‡GANE#*œGETADDRESSNEXTENTRYTOPROCESS$*œA1=ADDRESSNEXTENTRYTOPROCESS‰MOVE.W„(A1)+,STARTVAL(A3)*œSAVE *¦STARTVALUE *¦BITNUMBER*°FORENTRYPROCESSING*0‰LEA‡STRBLK(A3),A0‰SETUPPOINTERTOPARAMBLOCK,ŠMOVEM.L(A1)+,D0-D1‡SETUPTASKANDSESSIONŠMOVEM.LD0-D1,STRTSK(A0) ŠMOVEM.LD0-D1,SEGBLK+SEGTCB(A3) ŠMOVEM.LD0-D1,ASQBLK+ASQTSK(A3)ŠMOVEM.L(A1)+,D0-D2 ŠMOVEM.LD0-D2,ASQBLK+ASQSTA(A3)ŠMOVEM.L(A1)+,D0-D3!ŠMOVEM.LD0-D3,CSEGBLK+SEGOPT(A3)‰PAGE*0*ˆGRANTSHAREDACCESSTOI/OCOMMONDATASEGMENT*‰MOVE.L„#SHRSEG,D0*œD0=DIRECTIVENUMBER‰LEA‡SEGBLK(A3),A0*œA0=PARAMETERBLOCKADDRESS‰TRAP†#10*œGRANTSHAREDACCESSTOI/OCOMMONDATASEGMENTŠBEQ.S‚INIT30BŒOK"*ˆIGNOREENTRYIFTASKNOTPRESENTŠCMP.B‚#RTCDTASK,D0ŠBEQ„INIT46SKIPENTRY *‰BNE„KILL ‰BSRNE‡KILL‰PAGEH*IF TASK GETS DATA SEGMENT, ITS LOG. ADDR. IS PASSED IN A1;ELSE SET TO 0INIT30BƒCLR.L‚REGA0+4(A3)**ˆALLOCATEASQ1‰TST.L‚ASQBLK+ASQQLN(A3)‚CHECKLENGTHOFTHISASQ‰BEQ.S…INIT30C'*œBRANCHIFTHEREISNOASQTOALL* OCATE*‰MOVE.L„#GTASQ,D0*œD0=DIRECTIVENUMBER‰LEA‡ASQBLK(A3),A0*œA0=PARAMETERBLOCKADDRESS‰TRAP†#1 *œGETANASQ*‰BNE„KILLERROR ‰BSRNE‡KILL‰PAGE**ˆALLOCATETASKDATASEGMENT*INIT30C:-ŠTST.L‚CSEGBLK+SEGLEN(A3)NEEDDATASEGMENT?ŠBEQ.S‚INIT35NO**ˆGETTASKADATASEGMENT*'ŠCLR.L‚CSEGBLK+SEGTCB(A3)CLEARTASKIDŠCLR.L‚CSEGBLK+SEGSES(A3)‰MOVE.L„#GTSEG,D0*œD0=DIRECTIVENUMBER‰LEA‡CSEGBLK(A3),A0*œA0=PARAMETERBLOCKADDRESS‰TRAP†#1 *œGETSEGMENTFORSPECIFIEDTASK*‰BNE„KILLERROR ‰BSRNE‡KILL**IF LOG. ADDR=PHY. ADDR, A0 CONTAINS ADDR.ŠMOVE.WCSEGBLK+SEGOPT(A3),D0ŠAND.W‚#SGOPPA,D0 ŠBNE.S‚INIT315ŠMOVE.LCSEGBLK+SEGLAD(A3),A0‚PICKUPLOGICALADDRESSINIT31„MOVE.LA0,REGA0+4(A3)4ŠMOVE.LCSEGBLK+SEGLEN(A3),D1‚PICKUPSEGMENTLENGTH$INIT32„CLR.L‚(A0)+ŽZERODATASEGMENTŠSUB.L‚#4,D1ŽFINISHED?ŠBGT.S‚INIT32NO4ŠMOVE.L#IOSID,CSEGBLK+SEGTCB(A3)ƒSETUPIOSTASKID5ŠMOVE.L#IOSESS,CSEGBLK+SEGSES(A3)‚SETUPI/OSESSION‰MOVE.L„#DCLSHR,D0*œD0=DIRECTIVENUMBER‰LEA‡CSEGBLK(A3),A0*œA0=PARAMETERBLOCKADDRESS‰TRAP†#1*œDECLARESEGMENTSHARABLE *‰BNE.S‚KILL ‰BSRNE…KILL‰MOVE.L„#SHRSEG,D0*œD0=DIRECTIVENUMBER‰LEA‡CSEGBLK(A3),A0*œA0=PARAMETERBLOCKADDRESS‰TRAP†#1*œDECLARESEGMENTSHARABLE *‰BNE.S‚KILL ‰BSRNE…KILLBŠMOVE.LSEGBLK+SEGTCB(A3),CSEGBLK+SEGTCB(A3)‚SETUPTARGETTASKID,ŠMOVE.LSEGBLK+SEGSES(A3),CSEGBLK+SEGSES(A3)‰MOVE.L„#TRSEG,D0*œD0=DIRECTIVENUMBR‰LEA‡CSEGBLK(A3),A0*œA0=PARAMETERBLOCKADDRESS‰TRAP†#1*œTRANSFERSEGMENT *‰BNE.S‚KILL ‰BSRNE.SƒKILL‰PAGE***ˆSTARTTASK-A0=ADDR.OFSTARTOFIOCOMS*INIT35:‰MOVE.L„#START,D0*œD0=DIRECTIVE‰LEA‡STRBLK(A3),A0*œA0=PARAMETERBLOCKADDRESS‰TRAP†#1 *œSTARTTASK"*‰BNE.S‚KILLERROR,CAN'TCONTINUE ‰BSRNE.SƒKILLINIT38: ‰MOVE.L„A1,A0‰SUB.L…#OESIZE,A0,*œA0=STARTADDRESSOFENTRYJUSTPROCESSED‰CMP.B…#$FF,1(A0) ‰BEQ.S…INIT46&*œBRANCHIFWEDOnotHAVETOWAITFOR)*¡THISTASKTOCOMLETEITSINITIALIZATION ‰CLR.L…D1‰MOVE.B„1(A0),D1*œD1=BITNUMBERTOEDITFORINIT44:‰MOVE.L„#RELINQ,D0 *œD0=RELINQUISHDIRECTIVECODE‰TRAP†#1*œRELINQUISHCONTROL‰BTST†D1,SVTSTCF(A6) ‰BEQ.S…INIT44-*œBRANCHIFSTARTEDTASKHASNOTFINISHEDITS*¡INITIALIZATIONPROCESSINIT46:‰MOVE.B„HSV+3(A3),D0*œD0.B=HIGHSTARTVALUE‰CMP.B…STARTVAL(A3),D0 ‰BNE‡INIT30#*œBRANCHIFMOREENTRIESTOPROCESSINIT48: ‰BSR‡EETSTART*œGOSTARTEETTASKIFITEXIST**ˆALLDONE-GOAWAY*INIT50„ERQ.TERM‰PAGE* *ˆROUTINETO&*’INITILIZETHETASKDATASEGMENTAREA**ˆINPUT8*’A0=ADDRESSOFI/0COMMONDATASEGMENTATSYSGENTIME(*’A3=ADDRESSOFTASKDATASEGMENTAREA *’A5=…ZERO-->RAMBASEDSYSTEM*—NON-ZERO-->ROMBASEDSYSTEM**ˆOUTPUT*’N/A**ˆREGISTERALTERATION* TEMPLATE:#‰MOVE.W„#STOPMP+STOPRG,STRBLK+8(A3)#*œINITIALIZESTRBLKPARAMETERBLOCK‰MOVE.B„#XDCALL,ALLBLK(A3)‰MOVE.B„#XOPEXC,ALLBLK+3(A3)#*œINITIALIZEALLBLKPARAMETERBLOCK‰MOVE.W„#SGATSS,SEGBLK+10(A3)‰MOVE.L„#IOCOMN,SEGBLK+12(A3)$‰MOVE.L„#IOCOME-IOCOMS,SEGBLK+20(A3)‰MOVE.L„A5,SEGBLK+16(A3)‰BNE.S…TEMPL9999*œBRANCHIFROMBASEDSYSTEM‰MOVE.L„A0,SEGBLK+16(A3)#*œINITIALIZESEGBLKPARAMETERBLOCK TEMPL9999:‰RTS‰PAGE**ˆABORT* KILL†EQU„*'ŠMOVEM.LD0/A0,-(A7)‡SAVEREGD0ANDA0ŠERQ.ABORT#0ŽABORTSELF ************************* INIT9999: ‰DC.W†$4AFC)*œTHISISCODEFORANILLEGALINSTRUCTION *œWE'REBRINGINGTHESYSTEMDOWNŠPAGE* *ˆRoutineto/*’Obtainandsavethelowandhighstartvalues+*’InitializetheLASTVALUEPROCESSEDfield**ˆINPUT,*’A3=ADDRESSOFDATASEGMENTFORTHISTASK**ˆOUTPUT,*’A3-ADDRESSOFDATASEGMENTFORTHISTASK**ˆREGISTERALTERATION**’A0=DESTROYED*’D0=DESTROYED**ˆCONDITIONCODES**’EQUAL-->TABLEENTRIESˆEXIST**ŽNOTEQUAL-->TABLEENTRIESDONOTEXIST* *ˆEQUATES*MAXVALUEEQU‡$FFMINVAL* UEEQU‡$00*GETLHSV:‰MOVE.L„#OSMTBL,A0*œA0=STARTOFOSLISTTABLE‰CMP.L…#OSMEND,A0‰BEQ.S…GLHSV040-*œBRANCHIFTHEREARENOENTRIESINTHETABLE‰MOVE.L„#MAXVALUE+1,LSV(A3)*œINITIALIZELOWSTARTVALUE‰MOVE.L„#MINVALUE-1,HSV(A3)*œINITIALIZEHIGHSTARTVALUE GLHSV010: ‰CLR.L…D0*œD0=INITIALIZED‰MOVE.B„(A0),D0!*œD0=STARTVALUEFORTHISENTRY‰CMP.L…LSV(A3),D0‰BGE.S…GLHSV020&*œBRANCHIFSTARTVALUEFORTHISENTRY*¦IS>OR=TOLOWSTARTVALUE‰CLR.L…LSV(A3)‰MOVE.B„D0,LSV+3(A3)*œESTABLISHNEWLOWVALUE‰MOVE.L„D0,LVP(A3)‰SUB.L…#1,LVP(A3)#*œESTABLISHLASTVALUEPROCESSEDTO*¡LOWVALUEMINUSONE GLHSV020:‰CMP.L…HSV(A3),D0‰BLE.S…GLHSV030&*œBRANCHIFSTARTVALUEFORTHISENTRY*¦IS*‚*4BYTESSUCCESSFULRETURNADDRESSIFREQUESTORTOPROCEED‰9*‚*4BYTESERRORRETURNADDRESSIFREQUESTORTOPROCEEDŽ2*‚*4BYTESREQUESTORCOMMANDLINEBUFFERADDRESS•;*‚THELOADERRETURNSTHECOMPLETEDTCBPRIMERBLOCKTOTHEŒ;*‚CALLER'SPARAMETERBLOCK.‚ALSO,IFTHECALLERWAITEDFOR‹<*‚LOADTOCOMPLETE,UPONRETURNHISZ-FLAGISSETOROFFTO‹@*‚INDICATESUCCESSORFAILUREANDD0CONTAINSTHEERRORSTATUS.‡*Æ *‚LOADMODULEFORMATVSLOADER:§;*‚THEFIRSTLOGICALSECTORCONTAINSTHELOADERINFORMATIONŒA*‚BLOCK(LIB).‚SUBSEQUENTLOGICALSECTORSCONTAINMEMORYIMAGE…:*‚BLOCKS.‚AMEMORYIMAGEBLOCKCANBELOADED(IOSREAD)Œ TB]9eFmLuJ}A…G<•AH¥H­=µ:½;Å=Í<Õ8Ý@åBí=õ17*‚WITHONEBLOCKTRANSFER,THEREFOREITMUSTBESTOREDD*‚CONTIGUOUSLYONTHEDISKINASMANYSECTORSASREQUIRED.‚THETASK‚@*‚DESCRIPTORINFORMATIONINTHELIBISUSEDTOCOMPLETETHETCB‡=*‚PRIMERFORTCBALLOCATION.‚ASEGMENTALLOCATIONDESCRIPTOR‰C*‚ISUSEDTOALLOCATEASEGMENTOFGIVENLENGTHTEMPORARILYTOTHE„B*‚LOADER,THENTHEMEMORYIMAGEDESCRIPTORSAREUSEDTODETERMINE…C*‚WHETHERORNOTTHESEGMENTHASMEMORYIMAGEBLOCKSTOBELOADED.„?*‚AFTERTHEBLOCKSOFTHESEGMENTHAVEBEENLOADEDTHESEGMENTˆ<*‚ISTRANSFERREDTOTHETASKWITHPROPERLOGICALADDRESSES,‹*‚ATTRIBUTESANDSEGMENTNAME.¨*Æ*‚REV1.20‚8/14/80‚HLD6*ÆE********************************************************************ƒ‚PAGEÁF*********************************************************************‚*Æ*ˆ****EQUATES****­*ÆF*********************************************************************‚*Æ*ˆ**TRAP4ƒEQUATES**¨*Æ?STRPNOƒEQU4SERVERTRAPNUMBER=4,MUSTHAVEDIRECTIVEIND0‡*ÆLDRDIRƒEQU1‚LOADERDIRECTIVE$ERRDIRƒEQU2‚ERRORHANDLERDIRECTIVE*Æ5TRMMSGF‚EQU6‚BITSETINTRAP#FIELDOFEVENT(TERM)CCZ†EQU4‚CONDITIONCODEZ=1CCN†EQU8‚CONDITIONCODEN=1*Æ*ˆ**LOADEREQUATES**ª*Æ,LMFLUNƒEQU4LOADMODULEFILELUNFORLOADER*Æ*ˆ**‚EXECEQUATES‚***Æ%ACKLENƒEQU$14‚ACKTSK-ACKRA0LENGTH!CTOPMPB‚EQU‚14‚MONITORPROPOGATED2EVTSYSƒEQU‚EVTNOS+8‚SYSTEMTASKBITINTRAPNUMBER0SEGAGLBLEQU‚12‚ATTRBITFORGLOBALLYSHAREDSEG/SEGALOCLEQU‚13‚ATTRBITFORLOCALLYSHAREDSEG+CXACRIT‚EQU‚$4000ƒTASKATTR-CRITICALTASK*Æ3*‚RESERVEDATTRIBUTEBITUSEDBYLOADER(LIBSATR):”*Æ.ALLOCSGEQU15BIT15SET=>ALLOCATESEGMENTš*¦OFF=>ALLSEGMENTSDONEˆPAGEÂ*Æ*‚LOADEROPTIONS(PARLDO):¬*ÆELOPPROEQU15BIT15SET=>LETREQUESTORTASKPROCEEDWHILELOADINGƒ8*‚REQUESTORSUPPLIESRETURNADDRESSES(PARROK&PARRER)D*‚BITOFF=>WAITTASKTILLDONELOADING,NORETURNADDRESSESGIVENƒ2LOPCLFEQU14BIT14SET=>LOADERMUSTOPENFILE–(*‚BITOFF=>CLOSELOADMODULEFILELUNŸELOPRCLEQU13BIT13=>REQUESTCMDLINETRANSFERREDTOADRSUPPLIEDƒ*Æ>*‚THEFOLLOWINGBITSSETINDICATETHEASSOCIATEDFIELDINTCB‰7*‚PRIMERPARAMETERBLOCKISSUPPLIEDBYTHEREQUESTOR:+*‚NOTE:USERIDMUSTBESUPPLIEDBYCALLERœ*Æ!LOPENTEQU7LOGICALENTRYPOINT§LOPATTEQU6TASKATTRIBUTES«!LOPLPREQU5TASKLIMITPRIORITY§#LOPIPREQU4TASKINITIALPRIORITY¥-LOPMONEQU3MONITORNAMEANDSESSIONNUMBER›$LOPOPTEQU2TCBALLOCATIONOPTIONS¤!LOPSESEQU1TASKSESSIONNUMBER§LOPTSKEQU0TASKNAME±*Æ,*‚LOADERRETURNCONDITIONSTOWAITINGTASK:›$*‚Z=1,D0=0=>LOADSUCCESSFULL£$*†0,D0=ERRORCODE=>LOADFAILEDŸ8*‚A0->PARAMETERBLOCK,TCBNOWASALLOCATEDBYLOADER*Æ+ $*‚LOADERERRORSTATUSRETURNCODES:£*ÆELERSABEQU18LOADSEGMENTLOGICALADDRESSNOTINSEGMENTBOUNDARIESƒ8LERDIREQU1‚IND0UNDEFINEDDIRECTIVEFORTRAP'STRPNO'(LERLMDEQU19FILEISNOTALOADMODULE LEROPNEQU14OPENERROR¯*Æ(*†LOADERINFORMATIONBLOCK(LIB)EQUATES*KLIBSADEQU$30‚IndextoBeginningofSegmentAllocationDescriptors(SAD's)5LIBSSAEQU8„PositioninLIBofsegmentstartaddress/LIBSLNEQU$CƒPositioninLIBofsegmentlength.LIBNTRYEQU$16‚PositioninLIBofentrypoint6LIBCLAEQU$1A‚PositioninLIBofCommandLineAddress*0*†LOADERINFORMATIONBLOCK-TASKATTRIBUTEBITS**ATPOSIEQU11ƒTaskisPositionIndependent‡PAGE* ‰SECTION0**%*ˆPUBLICREFERENCESFROMTHISPROGRAM***‰XDEF†A0BLK,ATTRCOD,ATTRFHS‰XDEF†CHLUFHS,CLSFHS,CLUFHS<‰XDEF†EPBLDF,EPBLTH,EPBOPT,EPBPLUGB,EPBPLUGE,EPBQUERY,EPBRA0‰XDEF†EPBRD0,ERQMPB‰XDEF†LIBBUF,LDRBEG,LDRRTN‰XDEF†MOVASC1,MOVEBLK‰XDEF†POOLTABL,PLUGPOOL‰XDEF†TAKELUN,TAKELUN2,TASKLIST****ŠEXTERNALREFERENCES**‰XREF†BI2HEX4,ERRMSGHA**†OPT…PCSG********************************************************************** *Æ*STARTOFDATASEGMENT°*ÆG********************************************************************** *#*‚EXECDIRECTIVEPARAMETERBLOCKS:¤*Æ(LDRDPB‚EQU‚*‡GETDATASEGMENTFORLOADER!ˆDC.L0,0…TASKANDSESSION(SELF),ˆDC.W$2000ƒOPTIONS-SUPPLYLOGICALADDRESSˆDC.W0‡ATTRIBUTESˆDC.L'DLDR'‚SEGMENTNAME ˆDC.L0‡ADDRESSWILLBERETURNEDˆDC.LDSEGLNGLENGTHOFSEGMENT*Æ@*†PARAMETERBLOCKSNEEDEDTOSTARTUSERDUMPATTASKTERMINATIONƒ*Æ#*ˆPARAMETERBLOCKPASSEDTOLOADERž*Æ DMPBLKƒEQUƒ*·+‰DC.L‚'TDMP'ˆTASKNAME-ALWAYSSETBYTERM&‰DC.L‚0ŽSESSIONSAMEASABORTINGTASKŒ‰DC.W‚0TCBOPTIONS-NONE˜ ‰DC.L‚0,0‹MONITORNOTSPECIFIED•‰DC.B‚$88,$C8‡PRIORITIES 2‰DC.W‚CTATST+CXACRITƒTASKATTRIBUTES-SYSTEMTASK!‰DC.L‚0ENTRYFOUNDINLOADFILE’,‰DC.W‚0USERID-SETSAMEASABORTINGTASK‡‰DC.W‚$6077‰LOADEROPTIONS‰DC.B‚22ŒEVENTMESSAGELENGTH–‰DC.B‚LMFLUNˆLOGICALUNITž‰DC.L‚0,0‹NOTUSED¢*‰DC.L‚EVNTBUF‡EVENTBUFFER-COMMANDLINE*Æ3*…FHSPARAMETERBLOCK-DEFINESUSERDUMPLOADFILE‘*CLSFHS‚DC.WƒFHCLOS²ˆDC.Wƒ0· ˆDC.Bƒ0,6µ&ˆDC.L‚'„'†VOLUME-USESYSTEMDEFAULT’ˆDC.Wƒ0ŠUSERID¦ˆDC.L‚'„','„'ƒCATALOGˆDC.B‚'TASKDUMP'ƒFILENAME£ˆDC.W‚'SY'‰EXTENT¦ˆDC.W‚0¸ ˆDC.B‚0,0¶ˆDC.W‚0¸ˆDC.L‚0¸ˆDS.W‚0** TASKLISTDC.Lƒ'&SCT','&BCT',0,-1**†ERRORMESSAGEFORTASKTERM*/DERMSG‚DC.Bƒ'SRV4:UNABLETOLOADTASKDUMP.SY'–ˆDC.Bƒ$0D,$0A,$0A­DERMSGEEQU„*-1*ˆDS.Wƒ0ˆPAGE*D*ƒTHEFOLLOWINGPARAMETERSAREMODELSFORPARAMETERSINDATASEGMENT*G************************************************************************Æ.*…FHSPARAMETERBLOCKFORCHANGELOGICALUNIT–*"XCLUFHSDC.B‚$01,$10ˆCOMMAND=CLU!ˆDC.W‚$8001ŠRECEIVELOGICALUNIT–ˆDC.B‚0,6,6,0ˆLU=6¤"ˆDC.L‚0ŽTASKNAMEOFABORTINGTASK ˆDC.L‚0ŽSESSIONOFABORTINGTASK*Æ(XERQSRV EQU * ESTABLISH TASK AS A SERVER"ˆDC.LASRESVC„SERVICECALLADDRESS7ˆDC.BSTRPNO+$60‚TRAPNUMBER+TERMMESSAGE+PBOPTION-ˆDC.BPARLEN+FHSBLN†LENGTHOFPARAMETERBLOCK*Æ-*‚LOADMODULEFILEIOSREADPARAMETERBLOCK:š*ÆJIOPT„SETIOPBIN+IOPWAT+IOPNOC+IOPBLK+IOPRANBINARY,WAIT,NOCOMPLADR,BLOCK&ˆIOS.XLMFIOREAD,IOPT,LMFLUN,0,0,0,0,0*Æ-*†IOSPARAMETERBLOCKTOWRITEERRORMESSAGE–*6ˆIOS.XDPERIOWRIT,IOPIMG+IOPUNP,6,0,0,DERMSG,DERMSGE,0*ÆXMSGABRTDC.B‚$0D,$0A,$20,0 ‰DC.L‚'„'‰DC.B‚':‚ABORTEDBY' ‰DC.L‚'„' ‰DC.B‚'=' ‰DC.B‚'„' ‰DC.B‚$0D,$0AXSEGLNG‚EQUƒ*-XCLUFHS‰PAGE ‰OFFSET0‰DS.Bƒ148‡STACK STACK„EQU„**1ERQMPBƒEQUƒ*ŠMOVEPARAMETERBLOCKBACKTOCALLERŠ'‰DS.L‚2ŠTASK+SESSIONOFSENDER(SELF),‰DS.L‚1ŠLOGADDRESSOFBLOCKTOSEND(PARBLK)+‰DS.L‚2ŠDESTINATIONTASK+SESSION(FILLIN)‰DS.L‚1ŠDESTINATIONADDRESS)‰DS.L‚1ŠLENGTHOFPARAMETERBLOCK(PARLEN)*Æ*Æ*GTSEGPB‚EQUƒ*ŠAL, LOCATESEGMENTFORLOADING'‰DS.L‚2ŠALLOCSEGTOLOADERTEMPORARILY‰DS.W‚1ŠOPTIONS($8000)‰DS.W‚1ŠSEGATTR:READ/WRITE‰DS.L‚1ŠSEGMENTNAME.TSLADRƒDS.L‚1ŠLOGICALADR*****=PHYSICAL******‰DS.L‚1ŠSEGMENTLENGTH*Æ9ERQMCLƒEQUƒ*†PARAMETERBLOCKTOMOVECOMMANDLINETOUSER,ERQXFRƒEQUƒ*†TRANSFERLOADEDSEGMENTTOTASK*‰DS.L‚2†RECEIVERTASKNAME/SESSIONNUMBER-‰DS.W‚1†CHANGEATTRIBUTES,LOGICALADR($C000)‰DS.W‚1†SEGATTRIBUTES‰DS.L‚1†SEGMENTNAME‰DS.L‚1†LOGICALADR%‰DS.L‚2†RESERVEDFORMOVEM.LTRANSFER**…SETPRIORITYPARAMETERBLOCK*BSETPPB‚DS.B‚10*Æ*…STARTTASKPARAMETERBLOCK§*Æ$STRTDMP‚DS.L‚2†TASKNAMEANDSESSION ‰DS.W‚1†MONITORSPECIFIED($8000)‰DS.L‚2†MONITORISSELF*.*…STOP/START&SCTPARAMETERBLOCK(FORABORTS)*?STSTSCT‚DS.L‚2†TASKNAME&SESSION(&SCTFORTHEGIVENSESSION)‰DS.W‚1†OPTIONS(0=NONE)‰PAGE@***************************************************************ˆ*Æ)*‚LOADERINFORMATIONBLOCK(LIB)EQUATESž*Æ LIBBUFƒEQUƒ*·*ÆA*1STPARTOFTHETASKDESCRIPTORHASSAMEFORMATASTCBPRIMER:‡*ÆLIBTSKƒDS.L‚1‡TASKNAME§"LIBSESƒDS.L‚1‡TASKSESSIONNUMBER%LIBOPTƒDS.W‚1‡TCBALLOCATIONOPTIONSš3LIBMONƒDS.L‚2‡TASK'SMONITOR(NAME/SESSIONNUMBER)Œ$LIBIPRƒDS.B‚1‡TASKINITIALPRIORITY›"LIBLPRƒDS.B‚1‡TASKLIMITPRIORITYLIBATTƒDS.W‚1‡TASKATTRIBUTES¡LIBENTƒDS.L‚1‡TASKENTRYPOINT 'LIBCMLƒDS.L‚1ˆCOMMANDLINEPUTADDRESS—)LIBCMCƒDS.B‚1ˆCOMMANDLINEBUFFERLENGTH•‰DS.B‚17‡RESERVED§*Æ!*„SEGMENTALLOCATIONDESCRIPTORS¤*ÆLIBSBASƒEQUƒ*¶ŠDS.B‚2ˆRESERVED"LIBSATRƒDS.W‚1ˆSEGMENTATTRIBUTESœLIBSNAMƒDS.L‚1ˆSEGMENTNAME¢(LIBSLSAƒDS.L‚1ˆLOGICALSTARTINGADDRESS–)LIBSLENƒDS.L‚1ˆSEGMENTLENGTH(INBYTES)•)LIBSSIZƒEQUƒ*-LIBSBASƒSIZEOFLIBSENTRY™%LIBSCNTƒEQUƒ8ˆNUMBEROFLIBSENTRIES˜ŠDS.B‚(LIBSCNT-1)*LIBSSIZ*Æ*…MEMORYIMAGEDESCRIPTORS©*Æ'LIBMBASƒEQUƒ*ˆMEMORYIMAGEDESCRIPTORS– LIBMSLAƒDS.W‚1ˆSRARTINGADDRESSžLIBMELAƒDS.W‚1ˆENDINGADDRESS #LIBMSIZƒEQUƒ*-LIBMBAS…SIZEOFENTRY!LIBMCNTƒEQUƒ20‡NUMBEROFENTRIESŠDS.B‚(LIBMCNT-1)*LIBMSIZ#LIBMENDƒEQUƒ$0000FFFFƒENDOFLIBM'DLIBEND„EQUƒ*-1**&MIDMOV„DS.W‚0‡BitmapforbiasedMIDs.*ÆG************************************************************************ÆEVNTBUFƒEQUƒ*‡READEVENTBUFFEREVNTLNGƒDS.B‚1‡EVENTLENGTH-EVNTCODƒDS.B‚1‡EVENTCODE(7FORUSER/SERVER)(EVNTTINƒDS.B‚1‡TRAPNUMBER(SHOULDBE4)EVNTPRIƒDS.B‚1‡TASKPRIORITYEVNTTSKƒDS.L‚1‡TASKNAME"EVNTSESƒDS.L‚1‡TASKSESSIONNUMBEREVNTUNMƒDS.W‚1‡USERNUMBEREVNTRD0ƒDS.L‚1‡USER'SD0EVNTRA0ƒDS.L‚1‡USER'SA0'ŠDS.B‚2‡PARAMETERBLOCKSTATUSANDSIZEEVNTACOD‚EQUƒEVNTRD0ƒABORTCODE&EVNTATTR‚EQUƒEVNTRD0+2TASKATTRIBUTES/EVNTATSK‚EQUƒEVNTRA0ƒTASKRESPONSIBLEFORABORT*Æ*‚REQUESTORPARAMETERBLOCK«*Æ9PARBLK„EQUƒ*‡LOADER'SCOPYOFREQUESTOR'SPARAMETERBLOCKPARTSK„DS.L‚1‡TASKNAME!PARSES„DS.L‚1‡TASKSESSIONNUMBER"PAROPT„DS.W‚1‡ALLOCATETCBOPTIONS2PARMON„DS.L‚2‡TASK'SMONITOR(NAME/SESSIONNUMBER)#PARIPR„DS.B‚1‡TASKINITIALPRIORITY!PARLPR„DS.B‚1‡TASKLIMITPRIORITYPARATT„DS.W‚1‡TASKATTRIBUTESPARENT„DS.L‚1‡TASKENTRYPOINT*PARUID„DS.W‚1‡USERIDOFTASKTOBELOADED&PARLDO„DS.W‚1‡LOADEROPTIONS(2BYTES)9PARCLL„DS.B‚1‡REQUESTORCOMMANDLINELENGTH(LESSCOMMAND);PARLUN„DS.B‚1‡LOGICALUNITNUMBEROFLOADMODULEFILE(1BY;PARROK„DS.L‚1‡RETURNADDRESSTOREQUESTORIFSUCCESSFULLOA*PARRER„DS.L‚1‡RETURNADDRESSIFLOADFAILS9PARCLA„DS.L‚1‡PARAMETERBLOCKCOMMANDLINEBUFFERADDRESS-PARLEN„EQUƒ*-PARBLK‚LENGTHOFPARAMETERBLOCK*Æ:*†FHSPARAMETERBLOCKMUSTFOLLOWPARBLK(PARTOFPARBLK)‰*ÆA*†FHSPARAMETERBLOCKFOROPEN-CHANGELUN-ORCLOSELOADFILE‚*ÆLFLFHSƒDS.BƒFHSBLN‰BTST‚#LOPPRO,PARLDO(A6)CALLERWANTSTOPROCEEDWHILELOADING&‰BEQ.SLOADGONO,CALLERWANTSTOWAIT>‰ERQ.AKRQSTACKNPB(A6)„YES,SENDREQUESTACKNOWLEDGED/REACTIVA1‰MOVE.W‚#-1,ACKNOPT(A6)‚FLAGACKNOWLEDGECOMPLETE*Æ/*‡READLOADERINFORMATIONBLOCKFROMLOADFILE“*ÆLOADGO‚BSR„READLIBˆBNE„ASRERR2†BRANCHIFERRORœ*+*‡CHECKFORTASKBEINGPOSITIONINDEPENDENT*ˆBTSTW‚#ATPOSI,LIBATT(A6)1ˆBEQ.S‚LOADCRT‘BRANCHIFNOTPOSITIONINDEPENDENT*5*‡POSITIONINDEPENDENT-FIXLOADERINFORMATIONBLOCK* ˆBSR„LOFIX*Æ*‡CREATENEWTASK*Æ LOADCRTEQU„*ˆBSR„BLDNWTSK°ˆBNE„ASRERR2…BRANCHIFERROR*Æ=*‚ALLOCATE/LOADONESEGMENTATATIME,THENTRANSFERSEGMENTŠ;*‚TOLOADEDTASKWITHPROPERSEGMENTNAME,ATTRIBUTES,ANDŒ*‚LOGICALADDRESSES³*Æ7ˆLEA„LIBSBAS(A6),A3‚ADDRESSOF1STSEGALLOCDESCRIPTOR:ˆLEA„LIBMBAS(A6),A2‚ADDRESSOF1STMEMORYIMAGEDESCRIPTOR*Æ-*‚PROCESSNEXTSEGMENTALLOCATIONDESCRIPTORš*Æ;LOADSEGMOVEM.L(A3),D0-D3…SEGATR,NAME,STARTADR,LENGTH-ˆBTST„#ALLOCSG,D0„ISTHEREASEGMENTDEFINED?-ˆBEQ.SƒLOADDONE‡NO,ALLDONELOADINGSEGMENTS*ƉBSRƒNEWSEGŠGOGETNEWSEG- MENT–‰BNEƒASRERR3‰BRANCHIFERROR*Æ/*‚SEGMENTALLOCATED,ANYTHINGTOLOADINTOIT?˜*Æ0ŠADD.LƒD2,D3…STARTADDR+LENGTH=ENDADDR+1‰ŠSUB.Lƒ#1,D3…ENDADDRESS +ŠMOVE.B‚#$FF,D3ƒALWAYSENDATPAGEBOUNDRY‘ŠBSR…RD1SEG„GOREADONESEGMENTŠBNE…ASRERR3ƒBRANCHIFERROR*Æ9*‚SEGMENTLOADED/ALLOCATED,NOWTRANSFERITTOLOAD-TASKŽ*Æ ŠBSR„TRANSFERŠBNE„ASRERR3‰BRANCHIFERROR,ŠLEA„LIBSSIZ(A3),A3‚NEXTSEGMENTDESCRIPTOR?#ŠLEA„LIBMBAS(A6),A0‚ENDOFSEGLIST$ŠCMP.L‚A0,A3‹ISA3PASTENDOFLIST?ŠBCS„LOADSEG‰BRANCHIFNO*Æ(*‚LOADCOMPLETE-CLOSELOADMODULEFILE*ÆLOADDONEBSR.SƒCLSLFILE*Æ*‚MOVECOMMANDLINEREQUESTED?*ÆŠBSR„MOVECMD‰MOVECOMMANDLINEŠBNE„ASRERR3‰BRANCHIFERRORŠRTSŠPAGE¹*Æ7*„SUBROUTINESTOOPENLOADFILEORCHANGELOGICALUNITŽ*Æ5*…CHECKOPTION--WASFILEALREADYOPENEDBYCALLER?*ÆCOPNLFILE‚CLR.W‚LFLFHS+FHSGEN(A6)‚CLEARRESERVEDWORDINPARAMBLOCK)ŠBTSTƒ#LOPCLF,PARLDO(A6)TESTOPENOPTION"ŠBEQ.S‚CHANGLUŒBRANCHIFFILEOPEN*Æ*„OPENLOADMODULEFILE­*Æ7ŠMOVE.L‚#FHASGN<<16+FOPER,LFLFHS(A6)‚OPENCMD+OPTIONS.ŠMOVE.B‚#LMFLUN,LFLFHS+FHSLUN(A6)…LOGICALUNITŠFHSCALLLFLFHS(A6)ŽOPENFILE"ŠBEQ.SƒOPNLCHK‘BRANCHIFGOODOPEN,ŠMOVE.L‚D0,ACKNRD0(A6)ŠERRORCODE-BADOPENŠRTS….‰ERRORRETURNŸ*Æ<*‚TRANSFERLOGICALUNITNUMBEROFASSIGNEDLOADMODULEFILE‹*‚FROMCALLERTOLOADER¯*ÆCCHANGLUƒMOVE.B‚PARLUN(A6),LFLFHS+FHSLUB(A6)REQUESTEDLUNOFCALLER>ŠMOVE.L‚#GETLUN,LFLFHS+FHSCMD(A6)„SETCMD/OPTIONSFORFHSCALL.ŠMOVE.B‚#LMFLUN,LFLFHS+FHSLUN(A6)„LOGICALUNIT6ŠMOVEM.LD6-D7,LFLFHS+FHSTSK(A6)†TASKNAMEANDSESSION+ŠFHSCALLLFLFHS(A6)“REQUESTLUNFROMCALLER!ŠBEQ.SƒOPNLCHK–BRANCHIFNOERROR,ŠMOVE.L‚D0,ACKNRD0(A6)SETLOADERERRORCODEŠRTS¢ERRORRETURN*Æ8*„CHECKLUNHASPROPERATTRIBUTES,ACCESSPERMISSIONETC*Æ5OPNLCHKƒMOVE.W‚LFLFHS+FHSOPT(A6),D1ƒGETOPTIONSFIELD ŠAND.Wƒ#FFTBIT,D1MASKFILETYPE#ŠCMP.Wƒ#FOPCON,D1ISITCONTIGUOUS?ŠBEQ.SƒSUBROK‘BRANCHIFYES7ŠMOVE.L‚#LERLMD,ACKNRD0(A6)„NO-ERROR,NOTLOADMODULEŠRTSœERRORRETURN*Æ#*†NOERRORSONOPEN--GOODRETURN *Æ)SUBROK„MOVE„#4,CCR‘SETCCFORGOODRETURN ŠRTSœRETURN*ÆG********************************************************************** *Æ *†SUBROUTINETOCLOSELOADFILE£*Æ4CLSLFILE‚MOVE.L‚#FHCLOS<<16,LFLFHS(A6)CLOSECOMMANDŠFHSCALLLFLFHS(A6) ŠRTSšRETURN‰PAGEº*Æ1*…SUBROUTINETOREADINLOADERINFORMATIONBLOCK“*Æ4READLIBƒCLR.LƒLMFIOS+IOSRRN(A6)„RANDOMRECORDNUMBER*ŠLEA…LIBBUF(A6),A0ˆBUFFERSTARTINGADDRESS4ŠMOVE.L‚A0,LMFIOS+IOSSAD(A6)SAVEINIOSPARAMBLOCK(ŠLEA…LIBEND(A6),A0ˆBUFFERENDINGADDRESS4ŠMOVE.L‚A0,LMFIOS+IOSEAD(A6)SAVEINIOSPARAMBLOCKŠIOSCALLLMFIOS(A6)‹READINLIB$ŠBNE.SƒREADLBEŽBRANCHIFGOODRETURN)ŠADD.Lƒ#1,LMFIOS+IOSRRN(A6)INCREMENTRRN*READLBEƒMOVE.L‚D0,ACKNRD0(A6)‡ERROR--I/OŠRTSšERRORRETURNG********************************************************************** *Æ7*„SUBROUTINETOCREATETASKCONTROLBLOCKFORNEWTASKŽ*Æ*Æ**GETTASKDESCRIPTORPARAMETERSFROMLIBž*ÆG*Privelagedattributesmask.‚AllnonsystemtaskswhicharecallingonD*ƒtheloaderareallowedtoaffectonlythosebitsintheattributes-*ƒfieldoftheTCBwhicharesetinPRIVMASK. PRIVMASK‚SET„0APRIVMASK‚SET„PRIVMASK!1<THEN.SCallerwasnotasystemtask.3MOVE.L‚EVNTSES(A6),PARSES(A6)ƒUsecaller'ssession3MOVE.W‚EVNTUNM(A6),PARUID(A6)ƒUsecaller'suserID=AND.Wƒ#PRIVMASK,PARATT(A6)…Don'tallowpriviledgedattributeTHEN.S;MOVE.L‚LIBTSK(A6),PARTSK(A6)„No,sogettaskna. mefromLIBŠENDI +ŠBTST„#LOPSES,D0Didcallersupplysession?ŠIFTHEN.S?MOVE.L‚EVNTSES(A6),PARSES(A6)ƒNosousesamesessionascallerŠENDI 3ŠBTST„#LOPOPT,D0DidcallersupplyoptionsforTCB?ŠIFTHEN.S9MOVE.W‚LIBOPT(A6),PAROPT(A6)„No,sogetoptionsfromLIBŠENDI +ŠBTST„#LOPMON,D0Didcallersupplymonitor?ŠIFTHEN.S5MOVEM.LLIBMON(A6),D1-D2‰No,sogetmonitorfromLIBMOVEM.LD1-D2,PARMON(A6)ŠENDI 4ŠBTST„#LOPIPR,D0Didcallersupplyinitialpriority?ŠIFTHEN.S:MOVE.B‚LIBIPR(A6),PARIPR(A6)„No,sogetpriorityfromLIBŠENDI 4ŠBTST„#LOPLPR,D0Didcallersupplymaximumpriority?ŠIFTHEN.S5MOVE.B‚LIBLPR(A6),PARLPR(A6)„No,sogetitfromLIB.*F* Note: If this is a user zero task then we are allowed to affect onlyE*‰PRIVMASKattributesifweselectedtheoptiontousetheattributesB*‰fromtheLIB(LoaderInformationBlock).‚If,however,weelected@*‰topasstheattributesourselves,wecansetanyattributesweB*‰desire.‚Notethatifwearenotasystemtask,wehaveallready?*‰hadtheattributesfromthecallingparameterblockmaskedto*‰thebitsdefinedinPRIVMASK. ŠENDI 2ŠMOVE.W‚LIBATT(A6),D1ŒGetattributesfromLIBfile!ŠTST.WƒPARUID(A6)Isthisuser0?ŠIFTHEN.S6AND.Wƒ#PRIVMASK,D1ŠNo,maskbitsusertaskcannotsetŠENDI 3ŠBTST„#LOPATT,D0Didcallersupplytaskattributes?ŠIFTHEN.S9MOVE.W‚PARATT(A6),D1‰Yes,setcallersuppliedattributesŠENDI -ŠMOVE.W‚D1,PARATT(A6)ŒMovetoparameterfield/ŠBTST„#LOPENT,D0Didcallersupplyentrypoint?ŠIFTHEN.S4MOVE.L‚LIBENT(A6),PARENT(A6)„No,sogetitfromLIBŠENDI .ŠBTST„#EVTSYS,PARATT(A6)‡ISTHISASYSTEMTASKŠBEQ.SƒBLDNT18B‘BRANCHIFNO*ŠTST.LƒLIBSES(A6)WANTTOSETOWNSESSION?ŠBEQ.SƒBLDNT18A‘BRANCHIFNO2ŠMOVE.L‚LIBSES(A6),PARSES(A6)„SETSESSIONFROMLIB3BLDNT18A‚TST.WƒLIBIPR(A6)WANTTOSETOWNPRIORITY?ŠBEQ.SƒBLDNT18B‘BRANCHIFNO3ŠMOVE.W‚LIBIPR(A6),PARIPR(A6)„SETPRIORITYFROMLIB)BLDNT18B‚TST.LƒPARSES(A6)ISSESSION=0?ŠBNE.SƒBLDNT19’BRANCHIFNO2ŠMOVE.L‚EVNTSES(A6),PARSES(A6)ƒYES--USECALLER'S9BLDNT19ƒBCLR„#CTOPMPB,PAROPT(A6)†CANNOTPROPAGATEMONITOR*8*…CHECKSIZE--IFPRIORITY=0-->USECALLER'SPRIORITY*"ŠTST.BƒPARIPR(A6)ISPRIORITY=0?ŠBNE.SƒBLDNT25’BRANCHIFNO+ŠMOVEM.LD6-D7,BSETPPB(A6)ˆTASKANDSESSION1ŠMOVE.B‚#255,BSETPPB+8(A6)‡MAXVALUEFORPRIORITY3ŠERQ.SETPRIBSETPPB(A6)‹FINDMAXFORLIMITPRIORITY+ŠMOVE.L‚A0,D0”CALLINGTASK'SLIMITPRIORITY,ŠMOVE.B‚D0,PARLPR(A6)ŒSETLIMITFORNEWTASK;ŠMOVE.B‚EVNTPRI(A6),PARIPR(A6)ƒSETINITIALPRIFORNEWTASK%BLDNT25ƒCLR.LƒD5—D5ISUSEDFORFLAGS ŠIFNE„MMUFLAG*:*‡DETERMINELOADTYPE-RELOCATABLEORATPHYSICALADDRESS*/ŠLEA…LIBSLSA(A6),A0‹POINTERTOSTARTOF1STSEG*BLDNT24ƒBTST„#7,-6(A0)DOESSEGMENTEXIST?ŠBEQ.SƒBLDNT30’BRANCHIFNO!ŠTST.Lƒ(A0)•ISSTARTADDRESS=0?/ŠBEQ.SƒBLDNT26’BRANCHIFYES-RELOCATABLETASK+ŠLEA…LIBSSIZ(A0),A0‹INCREMENTTONEXTENTRY'ŠBRA…BLDNT24’GOBACKTOTESTNEXTENTRY1BLDNT26ƒBSET„#31,D5“SETFLAGFORRELOCATABLETASK&ŠBSET„#11,PARATT(A6)‹SETATTRIBUTEBITŠENDC *Æ*…ALLOCATETCBFORTHETASK*Æ'BLDNT30ƒERQ.CRTCB‚PARBLK(A6)ŒCREATETCB!ŠBEQ„SUBROK”BRANCHIFGOODRETURN-ŠMOVE.LD0,ACKNRD0(A6)ŒERROR-SETERRORCODE ŠRTSžRETURN‰PAGEº*Æ-*ƒSUBROUTINETOGETNEWSEGMENTTOLOADINTO™*Æ<*ƒD0=ATTRIBUTES,D1=NAME,D2=STARTADDRESS,D3=LENGTHŠ*Æ0NEWSEG„MOVE.LD1,GTSEGPB+SEGNAM(A6)„SEGMENTNAMECŠMOVE.W#$2000,GTSEGPB+SEGOPT(A6)OPTION-RETURNLOGADDR=PHYSICAL,ŠMOVE.LD3,GTSEGPB+SEGLEN(A6)„SEGMENTLENGTH*ŠCLR.W‚GTSEGPB+SEGATT(A6)‡CLEARATTRIBUTES*Æ4*‡PUTVALUESINTOTRANSFERSEGMENTPARAMBLOCKALSOŽ*Æ'ŠMOVE.W‚D0,ERQXFR+SEGATT(A6)„ATTRIBUTES)ŠMOVE.L‚D1,ERQXFR+SEGNAM(A6)„SEGMENTNAME,ŠMOVE.L‚D2,ERQXFR+SEGLAD(A6)„LOGICALADDRESS.ŠMOVE.L‚PARTSK(A6),ERQXFR+SEGTCB(A6)TASKNAME,ŠMOVE.L‚PARSES(A6),ERQXFR+SEGSES(A6)SESSION(ŠMOVE.W‚#$C000,ERQXFR+SEGOPT(A6)OPTIONS. *Æ*†CHECKFORSHAREABLESEGMENT¥*Æ-ŠBTST„#SEGAGLBL,D0ISSEGGLOBALLYSHAREABLE?ŠBNE.SƒNEWSEGSH‘BRANCHIFYES,ŠBTST„#SEGALOCL,D0ISSEGLOCALLYSHAREABLE?ŠBEQ.SƒNEWSEGG’BRANCHIFNO:NEWSEGSH‚MOVE.W‚#1,D5FLAGREADROUTINETHATSEGMENTFOUNDŠERQ.SHRSEG‚ERQXFR(A6)ŠBEQ„SUBROK”FOUNDSEGTOSHARE*Æ$*„NOTSHAREDSEG-MUSTGETNEWONE¡*Æ NEWSEGG‚EQU…* ‰IFNE„MMUFLAG+‰TST.LƒD5’TESTFORLOADATPHYSICALADDRESS-‰BMI.SƒNEWSEGGBŒBRANCHIFTASKISRELOCATABLE@‰MOVE.W‚#$0100,GTSEGPB+SEGOPT(A6)OPTION-ALLOCATEATPHYSADDR2‰MOVE.L‚D2,GTSEGPB+SEGLAD(A6)„SETPHYSICALADDRESSNEWSEGGBEQU…*‰ENDC=‰ERQ.GTSEGGTSEGPB(A6)‡ALLOCATESEGMENTTEMPORARILYTOLOADER$‰BEQ.SƒNEWSEGXBRANCHIFGOODRETURN'‰MOVE.L‚D0,ACKNRD0(A6)†SETERRORSTATUS‰RTS™ERRORRETURN*Æ$*„IFSHAREABLESEGMENT-PUTINGST¡*Æ2NEWSEGX‚MOVE.L‚A0,A5SAVESEGMENTSTARTINGADDRESS‰TST.WƒD5’ISSEGMENTSHAREABLE?‰BEQ…SUBROKŽBRANCHOUTIFNO+‰CLR.WƒD5’CLEARFLAG-MUSTREADINSEGMENT<‰MOVE.W‚ERQXFR+SEGATT(A6),GTSEGPB+SEGATT(A6)‚NEEDATTRIBUTES3‰MOVE.W‚#$8000,GTSEGPB+SEGOPT(A6)‚OPTIONFORDCLSHR‰ERQ.DCLSHRGTSEGPB(A6) ‰BRA…SUBROK*ÆD*******************************************************************„*Æ5*ƒTRANSFER--SUBROUTINETOGIVESEGMENTTONEWTASK‘*Æ+TRANSFERTST.WƒD5WASSHAREDSEGMENTFOUND?'‰BNE…SUBROK‰IFYES,NOTHINGTOTRANSFER&‰ERQ.TRSEG‚ERQXFR(A6)‚TRANSFERSEGMENT!‰BEQ…SUBROK‰BRANCHIFGOODRETURN0‰MOVE.L‚D0,ACKNRD0(A6)IFERROR-SETERRORCODE ‰RTS”RETURN‰PAGEº*Æ-*„SUBROUTINETOREADINTOONEMEMORYSEGMENT˜,*„A2POINTSTONEXTMEMORYIMAGEDESCRIPTOR™1*„D2=STARTADDRESSƒD3=ENDADDRESSƒOFSEGMENT9*ˆIFD5NOT=0,THENSEGMENTFOUNDINGST--UPDATERRNˆ*Æ1RD1SEG‚LEA†LIBEND+1(A6),A0‚ADDRESSOFENDOFLIST!ˆCMP.L„A0,A2ŒISTHISENDOFLIST?ˆBCC†SUBROK‹BRANCHIFYESˆMOVE.Lƒ(A2),D4ŠGETNEXTMIDˆCMP.L„#LIBMEND,D4†ENDOFLIST?ˆBEQ†SUBROK‹BRANCHIFYESˆCLR.L„D1CLEARFORSHORTLOAD$ˆMOVE.WƒD4,D1ŒGETSTART/ENDIND0/D1 ˆCLR.W„D4CLEARENDADDRFROMD0ˆLSR.L„#8,D4ŒGET24BITADDRESSˆLSL.L„#8,D1Œ24BITENDADDRESSˆMOVE.Bƒ#$FF,D1ŠENDOFPAGE9ˆCMP.L„D4,D2ŒTESTADDRESSESINCURRENTSEGMENTBOUNDARIES$ˆBHI†SUBROK‹BRANCHIFNOTINSEGMENT#ˆCMP.L„D4,D3ŒCOMPARESTARTWITHEND$ˆBLS†SUBROK‹BRANCHIFNOTINSEGMENT)ˆCMP.L„D1,D3ŒISENDINGADDRESSINBOUNDS?&ˆBCC.S„RD1S10‹BRANCHIFWITHINSEGMENT*Æ*œERROR-MIDOVERLAPSSAD’(ˆMOVE.Lƒ#LERSAB,ACKNRD0(A6)ERRORRETURNˆRTS*Æ*‡READMEMORYIMAGE®*Æ/RD1S10‚LEA†LIBMSIZ(A2),A2ƒA2POINTSTONEXTMID+ˆTST.W„D5IFSHAREDSEGFOUND-DONOTREADˆBNE.S„RD1S20‹BRANCHIFSHARED&ˆSUB.L„D2,D4ŒSUBTRACTSTARTINGADDRESS&ˆSUB.L„D2,D1ŒSUBTRACTSTARTINGADDRESS"ˆADD.L„A5,D4ŒADDSTARTOFLOADSEG"ˆADD.L„A5,D1ŒADDSTARTOFLOADSEG*ˆMOVE.LƒD4,LMFIOS+IOSSAD(A6)STARTADDRESS(ˆMOVE.LƒD1,LMFIOS+IOSEAD(A6)ENDADDRESS"ˆIOSCALL‚LMFIOS(A6)‡READMEMIMAGE'ˆBEQ.S„RD1S20‹GOBACKTOCHECKNEXTMID&ˆMOVE.LƒD0,ACKNRD0(A6)ƒSAVEERRORCODE ˆRTS—RETURN*Æ5*…THISISSHAREDSEGMENT--UPDATERANDOMRECNUMBER*Æ5RD1S20‚SUB.L„D4,D1ŒSUBTRACTSTARTINGADDRFROMENDING#ˆADD.L„#1,D1ŒADD1TOGETFULLPAGE!ˆLSR.L„#8,D1ŒCONVERTTO#SECTORS)ˆADD.L„D1,LMFIOS+IOSRRN(A6)‚INCREMENTRRN"ˆBRA†RD1SEG‹GOBACKFORNEXTPIECEˆPAGE*Æ9*‡SUBROUTINETOMOVECOMMANDLINEFROMCALLERTONEWTASK‰*Æ3MOVECMDTST.L„LIBCML(A6)‡DOESNEWTASKHAVEBUFFER?ˆBMI†SUBROK‹BRANCHIFNO>ˆBTST…#LOPRCL,PARLDO(A6)DOESREQUESTERHAVECMDLINETOXFER?ˆBEQ†SUBROK‹BRANCHIFNOˆCLR.L„D0CLEARFORSHORTLOAD&ˆMOVE.BƒLIBCMC(A6),D0„GETUSERBUFLEN6ˆCMP.B„PARCLL(A6),D0„COMPARETOREQUESTORSLINELENGTHˆBLS.S„MOVEC10ŠBRANCHIFYES,ˆMOVE.BƒPARCLL(A6),D0„USESHORTERCMDLENGTH(MOVEC10TST.B„D0ISCMDLINELENGTH=0?ˆBEQ†SUBROK‹BRANCHIFYES*Æ*ˆMOVECOMMANDLINETOUSER*ÆEˆMOVEM.L‚D6-D7,ERQMCL+MVSTSK(A6)‚CALLER'STASK,ERQMCL+SESNOISSOURCE?ˆMOVE.LƒPARCLA(A6),ERQMCL+MVSADD(A6)PARBLKHASSOURCEADDRESS3ˆMOVE.LƒPARTSK(A6),ERQMCL+MVDTSK(A/ 6)USERTASKNAME3ˆMOVE.LƒPARSES(A6),ERQMCL+MVDSES(A6)SESSIONNUMBER8ˆMOVE.LƒLIBCML(A6),ERQMCL+MVDADD(A6)DESTINATIONADDRESS+ˆMOVE.LƒD0,ERQMCL+MVLENG(A6)‰MESSAGELENGTH(ˆERQ.MOVELLERQMCL(A6)‘MOVECOMMANDLINEˆBEQ†SUBROK—BRANCHIFGOODMOVE&ˆMOVE.LƒD0,ACKNRD0(A6)SAVEERRORCODE ˆRTS£RETURNˆPAGE*Æ8*„TASKISTERMINATING--IFABORTING,CHECKDUMPOPTION*Æ1TASKTERMBTST„#1,EVNTATTR+1(A6)ˆISTASKABORTING?‰BEQ…TASKTRTN‘BRANCHIFNO$‰TST.WƒEVNTACOD(A6)ISABORTCODE0?‰BEQ…TASKTRTN‘BRANCHIFYES)‰CLR.LƒD7—SETFLAGFORABORTMESSAGEONLY9‰CMP.Lƒ#'&SCT',EVNTATSK(A6)…ISSESSIONCNTRLRESPONSIBLE?‰BEQ…TASKTMSG‘BRANCHIFYES*J*„WE'REGOINGTOTRYTOLOADTASKDUMP.‚FIRSTSTOPHIS&SCTSOTASKDUMPCANI*„PRINTTHEABORTMESSAGEWITHOUTINTERFERENCE.‚TASKDUMPWILLSTART&SCT.*>‰MOVE.L‚EVNTSES(A6),STSTSCT+4(A6)‡PUTSESSION#INPARAMBLOCK$‰ERQ.STOP‚STSTSCT(A6)“ANDSTOP&SCT.*Æ&*„MOVEPARAMETERBLOCKTOLOADERAREAŸ*Æ#ŠLEA„PARBLK(A6),A2ŒLOADER'SPBLOCKŠLEA„DMPBLK,A1DUMP'SPBLOCK/ŠMOVE.W#(PARLEN+FHSBLN)/2-1,D0‚#BYTESTOMOVE%TASKT2„MOVE.W(A1)+,(A2)+ŽMOVE1WORD$ŠDBRAƒD0,TASKT2LOOPUNTILALLMOVED+ŠMOVE.WEVNTUNM(A6),PARUID(A6)ƒMOVEUSERID2ŠMOVE.LEVNTSES(A6),PARSES(A6)ƒMOVESESSIONNUMBER+ŠLEA„EVNTBUF(A6),A0‹ADDRESSOFEVENTBUFFER0ŠMOVE.LA0,PARCLA(A6)ŒUSEASCOMMANDLINEBUFFER<ŠBSETƒ#EVTSYS,EVNTTIN(A6)†SETSYSTASKBITSOATTRIBUTESSET*ŠMOVE.W#8,D7”COUNT#TIMESTOTRYTOLOAD**†LOADTASKDUMP*!TASKT4„MOVE.WD7,-(A7)‘SAVECOUNTŠCLR.L‚D6—OWNTASKNAMEŠCLR.L‚D7—OWNSESSIONNUMBER6ŠMOVE.B#CCZ,ACKNCCD(A6)‰PRE-SETRETURNCONDITIONCODEŠBSR„LOADTASK‘GOLOADUSERDUMP*Æ*†RETURNFROMLOADER®*ÆŠMOVE.W‚(A7)+,D7(ŠCMP.Bƒ#CCZ,ACKNCCD(A6)ˆANYLOADERRORS?ŠBEQ.SƒTASKT8’BRANCHIFNO1ŠCMP.Wƒ#RTCDDPRQ,ACKNRD0+2(A6)DUPLICATEREQUEST?ŠBNE.SƒTASKTLERBRANCHIFNO%ŠADD.Lƒ#1,PARTSK(A6)‹CHANGETASKNAMEŠSUB.Wƒ#1,D7“DECREMENTCOUNTŠBNE…TASKT4’GOTRYAGAINŠBRA.SƒTASKTLERCTASKT8„MOVE.L‚PARTSK(A6),STRTDMP(A6)‚TASKNAMETOSTARTPARAMBLOCK=ŠMOVE.L‚PARSES(A6),STRTDMP+4(A6)SESSION‚TOSTARTPARAMBLOCK!ŠERQ.START‚STRTDMP(A6)ŠSTARTTASK&ŠBNE.SƒTASKTLERBRANCHIFERRORRETURN6ŠMOVE.W‚#DAKOP,ACKNOPT(A6)†SETOPTIONSTOSUSPENDTASK1ŠERQ.SUSPNDƒ.ŽSUSPENDSELF-TASKDUMPWILLRESUME*Æ*…ACKNOWLEDGEANDRETURN«*Æ2TASKTRTN‚ERQ.AKRQST‚ACKNPB(A6)ŠACKNOWLEDGEREQUEST‰BEQ.S…TASKTRZ*œJMPIFGOODRETURN#ŠLEA$84,A0ŒBESUREREQUESTENABLED ŠERQ.DERQST,TASKTRZƒERQ.RTEVNT‚#RVOPENRETURNFROMEVENT*Æ*…ERROR-TRYTOINFORMUSER§*ÆDTASKTLER‚ERQ.START‚STSTSCT(A6)‡RESTARTHIS&SCTSINCETASKDUMPISN'T *§GOINGTO. ŠMOVE.L„#1,D7TASKTMSG‚MOVE.L„#-1,TASKLIST+8+*œASAFETYPRECAUTIONTOPREVENTTHELOADER,*œFROMACCIDENTLYTRYINGTOFINDANERRORMSG*œFILEANDOBTAINITSLUN‰BSR.S…TAKELUN*œGETLUN#6FROMCALLER*Æ*„SENDABORTMESSAGETOUSER¨*Æ%TSKTLER2LEA…EVNTTSK(A6),A0ŠTASKNAME!‰LEA…MGTSK(A6),A1ŒMESSAGEADDRESS&‰BSR.SƒMOVASC’PUTTASKNAMEINMESSAGE%‰LEA…EVNTATSK(A6),A0‰WHOCAUSEDABORT"‰LEA…MGTSK2(A6),A1‹MESSAGEADDRESS‰BSR.SƒMOVASC’PUTINTOMESSAGE"‰MOVE.L‚EVNTACOD(A6),D0‰ABORTCODE"‰LEA…MGACOD(A6),A4‹MESSAGEADDRESS(‰BSR‡BI2HEX4PUTABORTCODEINTOMESSAGE)TSKTLER6LEA…MSGABRT(A6),A0ŠMESSAGESTART5‰MOVE.L‚A0,DPERIOS+IOSSAD(A6)ƒSAVEINIOSPARAMBLOCK ‰LEA…MSGABRTE(A6),A0‰MESSAGEEND5‰MOVE.L‚A0,DPERIOS+IOSEAD(A6)ƒSAVEINIOSPARAMBLOCK‰IOSCALLDPERIOS(A6)"‰TST.LƒD7–ISERRORMESSAGENEEDED?‰BEQ.SƒTSKTLER9BRANCHIFNO‰LEA…DERMSG,A0MESSAGESTART5‰MOVE.L‚A0,DPERIOS+IOSSAD(A6)ƒSAVEINIOSPARAMBLOCK‰LEA…DERMSGE,A0ŽMESSAGEEND5‰MOVE.L‚A0,DPERIOS+IOSEAD(A6)ƒSAVEINIOSPARAMBLOCK‰IOSCALLDPERIOS(A6)TSKTLER9 FHSCALL CLSFHS‰BRA…TASKTRTNRETURN**ˆCHANGELOGICALUNITROUTINE*4*ˆTAKELUN2ISASECONDENTRYPOINTINTOTHISROUTINE+*’IFTHISENTRYPOINTISUSEDTHEUSERMUST1*’SUPPLYTHEADDRESSOFTHETABLETOBEPROCESSED*’INREGISTERA1**1TAKELUN‚LEA‡TASKLIST,A1ƒADDRESSOFTASKNAMELIST&TAKELUN2MOVE.L„EVNT/ SES(A6),CLUSES(A6))*œTXSESSIONTOCHANGELOGICALUNIT(CLU)*œPARAMETERBLOCK TAKELUN1MOVE.L„(A1)+,CLUTSK(A6)#*œTXTASKIDTOCLUPARAMETERBLOCK1‰BMI.S…TAKERETƒJMPIFFAILEDTOFINDCALLERSTASK-*œINOTHERWORDSTHETABLEHASBEENPROCESSED‰FHSCALLƒCLUFHS(A6)6‰BNE‡TAKELUN1‚JMPIFFAILEDTOCHANGELOGICALUNITNBR TAKERET‚RTS‰PAGE*Æ*ƒMOVEASCIISUBROUTINE®*Æ%MOVASCƒMOVE.W‚#4,D1“MOVE4CHARACTERS'MOVASC1‚MOVE.B‚(A0)+,D0GET1CHARACTER+‰CMP.Bƒ#$1F,D0‘ISITLESSTHANPRINTRANGE?‰BLS.SƒMOVASC2‘BRANCHIFYES.‰CMP.Bƒ#$7B,D0‘ISITGREATERTHANPRINTRANGE?‰BLS.SƒMOVASC4‘BRANCHIFNO3MOVASC2‚MOVE.B‚#'',D0‘REPLACECHARACTERWITHBLANK'MOVASC4‚MOVE.BƒD0,(A1)+SAVEINMESSAGE‰SUB.Wƒ#1,D1“DECREMENTCOUNT'‰BNE…MOVASC1‘GOBACKFORNEXTCHARACTER ‰RTSRETURN*Æ*ƒCONVERTHEXTOASCII¯*Æ,CVHEX„ROL.Lƒ#4,D0“PUTNEXTDIGITINBITS0-3"‰MOVE.B‚D0,D1“MOVEONEDIGITTOD1‰AND.Bƒ#$0F,D1‘ISOLATE4BITS‰ADD.Bƒ#$30,D1‘CONVERTTOASCII$‰CMP.Bƒ#$3A,D1‘ISITGREATERTHAN9?‰BLT.SƒCVHEXB’BRANCHIFNO‰ADD.Lƒ#7,D1“ADD7TOGETA-F)CVHEXBƒMOVE.B‚D1,(A1)+SAVEINOUTPUTBUF‰SUB.Wƒ#1,D2“DECREMENTCOUNT%‰BNE…CVHEX“BRANCHBACKFORNEXTDIGIT ‰RTSRETURN‰PAGE*&*ˆFIXLOADERINFORMATIONBLOCKROUTINE* LOFIX„EQU†*2‰MOVEM.L‚D0-D7/A3-A5,-(A7)‚SaveLOADER'sregisters‰LEA†LIBBUF(A6),A5,‰LEA†LIBSAD(A5),A4†A4pointstobeginningof(*¥Segmentallocationdescriptors(SADs).‰CLR.L„D4‘InitializeforADJSAD ‰CLR.L„D5 ‰CLR.L„D6 ‰CLR.L„D7*$‰WHILE.L‚12(A4)#$FFFFFFFFDO.S#ŒBSR.SƒADJSADŒAdjustSADboundaries#*¥OldboundariescomebackinD6-D7#*¥NewboundariescomebackinD4-D53ŒBSR.SƒADJCLINEŠAdjustCLINEandSTARTaddressesif *¥weneedto.$ŒBSR.SƒADJMIDŒAdjustMIDboundaries. ŒLEA…$10(A4),A4‰ENDW5‰MOVEM.L‚(A7)+,D0-D7/A3-A5ƒRestoreLOADER'sregisters‰RTS*F*RoutinetoadjustSADboundaries.‚OldboundariescomebackinD6-D7.D*ƒNewboundariescomebackinD4-D5.‚D4-D7arebothinputandoutputC*ƒparameterstothisroutine.‚TheoutputfromthelastcallmustbeB*ƒtheinputtothenextcall.‚A4isinputandpointstotheSADwe*ƒcurrentlywanttoadjust.F*…Inthiscode8(A4)referstopositionofthissegmentsstartaddress=*ˆintheLIB(LoaderInformationBlock).‚$C(A4)referstothe3*ˆpositionintheLIBofthesegment'slength.‚Both*ˆvaluesare4byteslong.* ADJSADƒEQU‡* <‰MOVEM.LƒLIBSSA(A4),D6-D7‡Thissegment'spreviousboundaries&*£=inthenextinstruction.*£D5=previoussegslength2‰MOVE.LƒD4,D0Previoussegment'snewstartaddress5‰ADD.L„D5,D0Previoussegment'snewendingaddressin?‰IF.L…LIBSSA(A4)D0‚THEN.S‚Ifstartaddrthisseg=,= ‰MOVE.LƒD6,D0(‰ADD.L„D7,D0ŽEndaddressofthissegment:‰IF.L…LIBNTRY(A5)D6AND.LLIBNTRY(A5)D0THEN.SŒADD.L‚D4,LIBNTRY(A5)†Bias...&ŒSUB.L‚D6,LIBNTRY(A5)†...entrypoint.‰ENDI8‰IF.L…LIBCLA(A5)D6AND.LLIBCLA(A5)D0THEN.SŒADD.LƒD4,LIBCLA(A5)†Bias....ŒSUB.LƒD6,LIBCLA(A5)†...commandlineaddress.‰ENDI‰RTS  B* Routine to adjust MIDs based on information returned from ADJSAD**ƒMIDsusedtofindsegmentsplitonfile.**ˆD6=Segmentstartingaddress*ˆD7=Segmentlength* ADJMIDƒEQU†* "‰MOVE.LƒD6,D2ŽOldstartingaddress‰MOVE.LƒD2,D3ŽOldlength‰ADD.L„D7,D3ŽOldendingaddress$‰LSR.L„#8,D2ŽChopinsignificantbyte$‰LSR.L„#8,D3ŽChopinsignificantbyte‰MOVE.LƒD4,D0 1ŽNewstartaddress+‰SUB.L„D6,D1ŽMinusoldstartaddress=bias.‰LSR.L„#8,D1ŽAdjustbiasforwordsignificance$*¤D2=Oldstartaddress(wordsig.)**¤D3=Oldendaddress(wordsignificance)*‰LEA†$B0(A5),A3‰PointtobeginningofMIDs‰MOVE.Lƒ#-1,D0MIDcounter"‰WHILE.L‚(A3)#$0000FFFFDO.SŒADD.Lƒ#1,D0ŽIndextonextMID-ŒIF.W(A3)D2AND.W2(A3)D3THEN.S/BSETƒD0,MIDMOV(A6)IndicatethisMIDisbiasedIFTHEN.S.’ADD.W‚D1,(A3)+ˆBiasMIDonlyifithasn't...*’ADD.W‚D1,(A3)+ˆ...previouslybeenbiasedENDIŒELSE.S!LEA„4(A3),A3ˆAdvancetonextMIDŒENDI‰ENDW‰RTS.PSEGLNG‚EQU…*-LDRBEGLENGTHOFPROGRAMSEGMENT ‰END…LDRBEGéé=/*=/*†ROMIOI90.AF=/*&=/* Chain file to assemble ROMIOI90.SA=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to ROMIOI90.LS=/*=/IFC \1ƒ=ARGROMIOI90.LS=/ENDIF=/*&=ASM ROMIOI90.SA,ROMIOI90.RO,\1;R,Z=75=/*{ Included files are:=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.NIO.EQ=/*ƒ9995.&.TR1.EQ=/*}=/*=ENDééééééý ‰NOLIST‰INCLUDEƒ9995.&.IOE.EQ‰INCLUDEƒ9995.&.NIO.EQ‰INCLUDEƒ9995.&.TR1.EQ‰LIST ‰SECTIONƒ1 *ˆINCLUDEƒ9995.&.IOE.EQ*ˆINCLUDEƒ9995.&.NIO.EQ*ˆINCLUDEƒ9995.&.TR1.EQ ‰XDEF†ROMIOI90 ‰XREF†IOCOME ‰XREF†IOCOMS ‰XREF†IOCOMN‰XREF†ROMIOI02 ‰PAGE* *ˆRoutineto *’ObtainaramdatasegmentIOSG=*’MovetheromdatasegmentIOSFtotheramdatasegmentIOSG3*’AdjusttheaddressesintheramdatasegmentIOSG**ˆInput *’A5=Zero%*’A6=AddressofIOSFat0 SYSGENtime**ˆOutput%*’A5=AddressofIOSGforROMsystem*’A6=Sameasinput**ˆRegisterAlteration**’A0=DESTROYED*’A1=DESTROYED*’A2=DESTROYED*’A5=DESTROYED*’D0=DESTROYED*’D1=DESTROYED* *ˆComments:.*’Thiscodewillbeuseasalibraryfunction.6*’ItisreferencedbythesysteminitializerIOIwhich*—executesatboottime*‰PAGE GSEGIOSG:‰DC.L†0 *œTASKNAME ‰DC.L†IOSESS*œTASKSESSIONNUMBER ‰DC.W†$2000*œDIRECTIVEOPTIONS-*BIT13-LOGICALADDRESS=PHYSICALADDRESS‰DC.W†$0*œSEGMENTATTRIBUTES ‰DC.L†IOCOMN*œSEGMENTNAME‰DC.L†$0 *œPHYSICALADDRESSIFAPPLICABLE‰DC.L†IOCOME-IOCOMS*œSEGMENTBYTESIZEŠPAGE ROMIOI90:‰MOVE.L„#GTSEG,D0*œD0=DIRECTIVENUMBER‰LEA‡GSEGIOSG,A0!*œA0=ADDRESSOFPARAMETERBLOCK‰TRAP†#1/*œOBTAINTHERAMI/OCOMMONDATASEGMENT(IOSG) ‰BNE‡ROMIOI99*œBRANCHIFERROROCCURRED(*¡WEWEREUNABLETOOBTAINRAMNECESSARY%*¡FORTHERAMI/OCOMMONDATASEGMENT**¡SOWEWILLSHUTTHESYSTEMDOWN--CAN'T*¡DOANYTHINGANYWAY ‰MOVE.L„A0,A5'*œA5=ADDRESSOFRAMDATASEGMENTIOSG‰MOVE.L„#IOCOME-IOCOMS,D0+*œD0=NUMBEROFBYTESINDATASEGMENTIOSG ROMIOI91: ‰CLR.B…(A0)+ ‰SUB.L…#1,D0‰BNE.S…ROMIOI91+*œSETTHEIOSGDATASEGMENTEQUALTOZERO'S*œBRANCHIFNOTDONE ‰MOVE.L„A5,A0*œA0=ADDRESSOFIOSGINRAM*¦ADDRESSMOVETO ‰MOVE.L„A6,A1 ‰MOVE.L„A1,A2*œA2=ADDRESSOFIOSFINROM*¦ADDRESSMOVEFROM‰MOVE.L„SVTDND(A1),A1bD*œA1=ENDADDRESSOFDCBSPACE*¦LOOPTERMINATOR ROMIOI92:‰MOVE.B„(A2)+,(A0)+ ‰CMP.L…A1,A2‰BLO.S…ROMIOI925*›MOVEROMDATASEGMENTIOSFTORAMDATASEGMENTIOSG*œBRANCHIFNOTDONE ‰MOVE.L„A6,A0+*œA0=ADDRESSOFI/OCOMMONATSYSGENTIME ‰MOVE.L„A5,D0 ‰SUB.L…A0,D03*œD0=Deltausedtoadjustaddressintheramdata*¦segmentIOSG ‰MOVE.L„A5,A0-*œA0=StartaddressoframdatasegmentIOSG‰MOVE.L„SVTQST(A0),D1 ‰ADD.L…D0,D1‰MOVE.L„D1,SVTQST(A0)'*œD1=AdjustedDCQstartaddressspace‰MOVE.L„SVTQND(A0),D1 ‰ADD.L…D0,D1‰MOVE.L„D1,SVTQND(A0)%*œD1=AdjustedDCQendƒaddressspace‰MOVE.L„SVTLST(A0),D1 ‰ADD.L…D0,D1‰MOVE.L„D1,SVTLST(A0)'*œD1=AdjustedLUTstartaddressspace‰MOVE.L„SVTLND(A0),D1 ‰ADD.L…D0,D1‰MOVE.L„D1,SVTLND(A0)%*œD1=AdjustedLUTendƒaddressspace‰MOVE.L„SVTDST(A0),D1 ‰ADD.L…D0,D1‰MOVE.L„D1,SVTDST(A0)'*œD1=AdjustedDCBstartaddressspace‰MOVE.L„SVTDND(A0),D1 ‰ADD.L…D0,D1‰MOVE.L„D1,SVTDND(A0)%*œD1=AdjustedDCBendƒaddressspace‰MOVE.L„SVTDCB(A0),D1 ‰ADD.L…D0,D1‰MOVE.L„D1,SVTDCB(A0)'*œD1=AdjustedDCBfirstentryaddress ‰MOVE.L„D1,A0*œA0=AddressfirstDCBentry ROMIOI93: ‰TST.L…(A0)‰BEQ.S…ROMIOI94'*œBranchifDCBlisthasbeenprocessed‰MOVE.L„(A0),D1 ‰ADD.L…D0,D1‰MOVE.L„D1,(A0)#*œD1=AdjustedDCBforwardpointer ‰MOVE.L„D1,A0*œA0=AddressnextDCBpointer‰BRA.S…ROMIOI93*œRepeattheloop ROMIOI94: ‰BRA‡ROMIOI02*œReturntouser‰PAGE ROMIOI99: ‰DC.W†$4AFC)*œTHISISCODEFORANILLEGALINSTRUCTION *œWE'REBRINGINGTHESYSTEMDOWN‰PAGE‰ENDé=/*=/*†SCTSASR.AF=/*%=/* Chain file to assemble SCTSASR.SA=/*:=/* If no output argument is specified for the listing the)=/* chain file will default to SCTSASR.LS=/*=/IFC \1ƒ=ARGSCTSASR.LS=/ENDIF=/*$=ASM SCTSASR.SA,SCTSASR.RO1 ,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.USM.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.EXE.EQ=/*}=/*=ENDéééééé5SCTSASRƒIDNTƒ4,008112111315SCTASYNCHRONOUSROUTINE*‰INCLUDE9995.&.USM.EQ*‰INCLUDE9995.&.TR1.EQ*‰INCLUDE9995.&.IOE.EQ*‰INCLUDE9995.&.EXE.EQŠNOLISTŠINCLUDE9995.&.USM.EQŠINCLUDE9995.&.TR1.EQŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.EXE.EQŠLIST ŠXDEFƒABORTSKŠXDEFƒREADEVNTŠXDEFƒRETRNVNT ŠXDEFƒSCTSASR ŠXDEFƒSCTSBNO ŠXDEFƒSCTSBRKŠXDEFƒSCTSQACK H************************************************************************$*‚SCTASYNCHRONOUSROUTINE-SCTSASR**‚ENTRYPOINTS:,*‚SCTSASR-1STENTRYPOINT(STARTOFASR)(*Š-GENERALENTRYPOINT-SUBTASKEVENTS7*‚SCTSBRK-UNSOLICITEDBREAKFROMUSERATTHETERMINAL*‚HBR8H************************************************************************ ŠXREFƒBYEBYEŠXREFƒEMSGCALL ŠXREFƒERRCALL ŠXREFƒLOGOFF ŠXREFƒMSGCALLŠXREFƒSHAREOPT ŠXREFƒSQRBŠXREFƒSTDERROR ŠXREFƒUCBBNOŠXREFƒUCBMSWAT ŠXREFƒUCBREGAŠXREFƒUCBREGA6 ŠXREFƒUCBREGD ŠXREFƒUCBSESS ŠXREFƒUCBTUT ŠXREFƒUCBUTN ŠXREFƒUSRTSK*ŠPAGE ŠSECTION8‰DC.B†'SCTSASR'‰DC.B†'1210844'7SCTSASRƒEQU„*’STARTOFASRFORSCT,GENERALENTRYPOINTŠBSR.S‚READEVNT‹READEVENTŠCMP.B‚#EVCSUB,EVCODE(A0) ŠBEQ.S‚SA50 ********* ABORTSKƒEQU„*"ŠBSR„STDERROR‹OUTPUTERRORMESSAGEŠBRA„LOGOFFNOWEXIT ********* SCTSBRKƒEQU„*,ŠBSR.S‚READEVNT‹READEVENT(REMOVEFROMASQ)/ŠCLR.B‚UCBMSWAT(A3)‡RESETMESSAGEWAITINGCOUNT ŠBSETƒ#BTUSBRK,D7ˆSETBREAKFLAG)ŠBNE.S‚SCTSD7BRANCHMESSAGEALREADYSENT'ŠMOVE.LUSRTSK(A3),-(A7)‡SAVEUSERTASK*ŠMOVE.L#EM_BREAK,D0‡BREAKMESSAGEADDRESSŠBSR„EMSGCALL‹OUTPUTMESSAGE*ŠMOVE.L(A7)+,USRTSK(A3)ƒRESTORETASKNAME*ˆ(USERNUMBERMUSTFIRSTBEVALIDUSINGTHEVALIDATECOMMAND)*O*******************************************************************************ŠXREFƒASGNFILEŠXREFƒADDLAPSEŠXREFƒEMSGCALLŠXREFƒEMSGCAL1 ŠXREFƒERRCALL ŠXREFƒECHOE ŠXREFƒECHOTŠXREFƒGETLAPSEŠXREFƒLOGTRYNO ŠXREFƒLOGPRU ŠXREFƒLG95ŠXREFƒLEFTMARG ŠXREFƒMSGCALL ŠXREFƒOFHS ŠXREFƒPASSKEYŠXREFƒPASSBUFFŠXREFƒPASSBUFEŠXREFƒREADLINEŠXREFƒSTDERRORŠXREFƒSTDTRAP1 ŠXREFƒSCTDSL ŠXREFƒSYSDFLT ŠXREFƒSCTINB ŠXREFƒSCTDAT ŠXREFƒSYSDPAR ŠXREFƒUSERNO ŠXREFƒUCBTSOŠXREFƒUCBLDCNT ŠXREFƒUCBSNO ŠXREFƒUCBLEN ŠXREFƒUCBTID ŠXREFƒX10100ŠXREFƒUCBLDCNA*‰PAGE***ˆVERSACOMPUTERCHANGEHISTORY**C*‰1.REGISTERA3UPONENTRYWILLCONTAINSCT'SDATASEGMENTADDRESS*A*‰2.ALLLABELSINTHESCTDATASEGMENTWEREREDEFINEDTOREFLECT>*ŒOFFSETSANDASSUCHSHOULDNOWBEREFERENCEDOFFOFTHEBASE0*ŒREGISTERCONTAININGSCT'SDATASEGMENTADDRESS*@*‰3.REGISTERA3INSECURE.SAWILLBEUSEDTOREFELCTSCT'SDATA,*ŒSEGMENTADDRESSUNLESSSPECIFIEDOTHERWISE*ŠPAGE ŠSECTION8‰DC.B†'SECURE'‰DC.B†'1210844'ŠNOLIST PASS0…EQU„*ŠCMP.L‚#$2D3A5D5F,(A0) ŠBNE.S‚PAS0ŠMOVE.LUCBTID(A3),D0ŠCMP.L‚4(A0),D0O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?*ˆThefollowinglogicistheretonegatetheskeletonkeylogon=*ˆToactivatetheskeletonkeylogonNOP(4E71)thefollowing *ˆinstruction* ŠTST.L‚(A7)O*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<PAS0†RTSŠLIST PASS†EQU„***ˆ**CAUTIONUSER=0*:^CRKESH[KcJk]sŠTST.L‚USERNO(A3)‰USER=0?ŠBNE.S‚PASS5ŽNO,CONTINUE$ŠMOVE.L#EM_CTION,D0‡CAUTIONMESSAGEŠBSR„ERRCALLŒOUTPUTMESSAGE PASS5…EQU„***ˆ**READPASSWORDENTRY*.ŠMOVE.BLOGTRYNO,UCBLEN(A3)SETUPERRORCOUNTŠBSR„READPASS‹READPASSWORDŠBTSTƒ#BTCHNABT,D7‡ERROR?!ŠBNE.S‚PASS20YES,CLOSEANDEXIT**ˆ**PASSWORDNOWREQUIRED?*ŠTST.B‚(A1)PASSWORDNOW?ŠBEQ.S‚PASS10NO**ˆ**CHECKPASSWORDENTERED*ŠBSR„PWVALP10‹CHECKPASSWORD PASS10„EQU„*5ŠMOVEM.LPWPARN,D3-D5†REQUESTNEWPASSWORDPARAMETERS ‰ADD.L…A3,D30*œA3=ADDRESSFORPASSBUFFWHICHFORMERALYWASAN*ŸOFFSETŠBSR„PWINPUTŒINPUTNEWŠBEQ.S‚PASS15SKIPGOODŠBSR„LEFTMARG‹SETLEFTMARGINŠBRA.S‚PASS20SKIPUPDATE PASS15„EQU„*‰MOVEM.LƒD1-D5,-(A7)*œSAVEREGISTERS‰MOVEM.LƒPASSUPDA,D0-D5#*œESTABLISHPARAMETERSINREGISTERS ‰BSR‡X10100 *œESTABLISHOFFSETSASADDRESSES‰MOVEM.LƒD0-D5,OFHS(A3)$*œMOVEPARAMETERSTOPARAMETERBLOCK‰MOVEM.Lƒ(A7)+,D1-D5*œRESTOREREGISTERS‰LEA‡OFHS(A3),A0*œA0=ADDRESSPARAMETERBLOCKŠTRAPƒ#2ŠBEQ.S‚PASS20UPDATEOK"ŠBSR„EMSGCALL‹OUTPUTERRORMESSAGE PASS20„EQU„*(ŠLEA„OFHS(A3),A0ŒPARAMETERBLOCKADDRESSŠMOVE.W#FHCLOS,(A0)‡OPERATION ŠCLR.W‚2(A0)ŠMOVE.W#1,4(A0)‹LUNŠTRAPƒ#3‘CLOSEŠRTSŠPAGEO********2 *************************************************************************ˆSWORD**ˆCHANGESSYSTEMSECURITYWORD*O******************************************************************************* SWORD…EQU„*"ŠTST.L‚USERNO(A3)‰PRIVELEGEDUSER?ŠBNE„LOGPRUNO,ERROREXIT.ŠMOVE.BLOGTRYNO,UCBLEN(A3)SETUPERRORCOUNT!ŠMOVEM.LPWPARW,D3-D5†REQUESTNEW ‰ADD.L…A3,D30*œD3=ADDRESSFORPASSBUFFWHICHFORMERALYWASAN*ŸOFFSETŠBSR„PWINPUTŒGETINPUTŠBEQ.S‚SWORD2SKIPIFGOOD SWORD1„EQU„*ŠBSR„LEFTMARG‹SETLEFTMARGINŠRTS SWORD2„EQU„* ‰MOVE.L„A3,A0*œA0=SCTDATASEGMENTADDRESS"ŠLEA„UCBTSO(A0),A3ŠADDRESSPOINTERŠMOVE.L(A3),-(A7)‰TEMPSAVEŠMOVE.L(A2)+,(A3)+ˆPUTSW1ŠMOVE.L(A3),-(A7)‰TEMPSAVEŠMOVE.L(A2),(A3)+‰PUTSW2/ŠMOVEM.LSYSDPAR,D0-D6…PARBLOCKTOMOVETOEET ‰ADD.L…A0,D3 *ˆADD.L…A0,D6-*œADJUSTOFFSETS(UCBTSO)INREGD3ANDD6TO*œREFLECTADDRESSES'ŠMOVE.L#8,OFHS+24(A0)…COUNTTOBESENT‰MOVE.L„A3,-(A7)*œSAVECURRENTA3VALUE ‰MOVE.L„A0,A3*œA3=SCTDATASEGMENTADDRESSŠBSR„STDTRAP1‹SENDNEWTOEET‰MOVE.L„(A7)+,A6&*œA6=WHATWASTHEA3VALUESAVEDABOVEŠMOVE.L(A7)+,-(A6)ˆRESTORE2ŠMOVE.L(A7)+,-(A6)ˆRESTORE1ŠBTSTƒ#BTREAD5,D7ˆCHAINMODE?**œREGARDLESSOFTHEEXITPATH*œA3=SCTDATASEGMENTADDRESS* ŠBNE„SWORD1YES,SETLEFTMARGINŠRTSŠPAGE READPAS0: ‰MOVE.L„A3,A0*œA0=SCTDATASEGMENTADDRESS‰LEA‡OFHS(A0),A3 ‰MOVE.L„A3,A1,*œA3=A1=STARTPARAMETERBLOCKADDRESS(OFHS)‰ADD.L…#FHSBLN,A3$*œA3=ENDPARAMETERBLOCKADDRESS+1*ŸADDRESSMOVETO:ŠLEA„ASSIPASS+FHSBLN,A2ENDOFASSIGNPASSWORDMODELBLOCK*£ADDRESSMOVEFROMREADPAS1‚EQU„*)ŠMOVE.L-(A2),-(A3)ˆMOVEMODELTOEXECUTEŠCMP.L‚A1,A3ŽTESTDONEŠBNE„READPAS1‹CONTINUE8ŠMOVE.LSYSDFLT(A0),FHSVOL(A1)PUTSYSTEMDEFAULTVOLUME ‰MOVE.L„A0,A3*œA3=SCTDATASEGMENTADDRESSREADPAS2‚EQU„*(‰LEA‡OFHS(A3),A0†PARAMETERBLOCKADDRESSŠTRAPƒ#3‘ASSIGN‰RTSO*******************************************************************************(*ˆ**ASSIGNANDREADPASSWORDSUBROUTINEO*******************************************************************************READPASS‚EQU„*‰BSR.S…READPAS0.*œATTEMPTTOASSIGNTHE'PRIV.ACCOUNT.PW'FILE READPASA:ŠBEQ.S‚READPA10‹ASSIGNEDOK8ŠCMP.B‚#FSTAAP,D0‰FILEINUSE(ACCESSPERMISSIONERROR)?ŠBNE.S‚READEOUT‹NO,ERROREXITREADPAS3‚EQU„*ŠMOVE.L#233,A0Œ233MILLISECONDŠMOVE.L#DELAY,D0ŠDELAYCOMMAND ŠTRAPƒ#1‘WAIT‰BSR.SƒREADPAS2*œTRYTOASSIGNITAGAIN‰BRA.S…READPASA)*œEDITRESULTSOFATTEMPTTOASSIGNAGAINREADPA10‚EQU„*.ŠMOVE.LUSERNO(A3),PASSKEY(A3)GETUSERNUMBER+ŠMOVEM.LPASSREAD,D0-D6„GETPARAMETERBLOCK ‰BSR‡X101001*œADJUSTSTART/ENDOFFSETSTOSTART/ENDADDRESSES4ŠLEA„OFHS+28(A3),A0‰ENDOFEXECUTIONPARAMETERBLOCK#ŠMOVEM.LD0-D6,-(A0)‡PUTPARAMETERS ŠTRAPƒ#2‘READŠBEQ.S‚READPA20‹GOODŠCMP.B‚#ISTARN,D0‰RECORDEXIST?&ŠBNE.S‚READEOUT‹EXISTS,BUTREADERROR(ŠMOVE.L#EM_NUSER,D0‡NOTAUTHORIZEDUSERREADEOUT‚EQU„*"ŠBSR„EMSGCAL1‹OUTPUTERRORMESSAGEŠBRA„PASS20CLOSEANDEXITREADPA20‚EQU„*-ŠLEA„PASSBUFF(A3),A1ˆADDRESSOFPASSWORDREADŠRTS%ASSIPASS‚DC.WƒFHASGN,FOPPRPW+FOPISK,1PASSNAME‚DC.LƒPWVOL ŠDC.WƒPWUSR!ŠDC.LƒPWCAT1,PWCAT2,PWFIL1,PWFIL2)ŠDC.WƒPWEXT,0,PWPROT,PWRECL,PWKSIZ,PWFBLK4PASSREAD‚DC.WƒIOREAD,IOPRTK+IOPBIN+IOPIMG+IOPRRN,1,0ŠDC.Lƒ0,PASSKEY,PASSBUFE,0-PASSUPDA‚DC.WƒIOUPDR,IOPBIN+IOPIMG+IOPRRN,1,0ŠDC.Lƒ0,PASSKEY,PASSBUFE,0ŠPAGEO********************************************************************************"*ˆ**PASSWORDVALIDTIONSUBROUTINE*O*******************************************************************************0PWVAL…MOVE.BUCBLDCNT(A3),D5ˆFETCHSECURITYFLAGŠMOVE.BD5,SCTDAT(A3)†SAVEŠTST.L‚D0‘USER=0?ŠBNE.S‚PWVAL5BRANCHNOT0ŠLSR.B‚#4,D5ŽSHIFTUSER=0TOLS PWVAL5„EQU„*$ŠCMP.L‚#'0001',UCBSNO(A3)SESSION=1?ŠBNE.S‚PWVAL10ŒBRANCHNO"ŠLSR.B‚#2,D5ŽSHIFTSESSION=1TOLS PWVAL10ƒEQU„*#ŠAND.B‚#3,D5ŽEXTRACTSECURITYLEVELŠBEQ„PWEXITBRANCHNONEŠMOVE.BD5,UCBLDCNT(A3)„SAVEŠBTSTƒ#0,D5ŽSECURITYW3 ORD?ŠBNE.S‚PWVALSWŒYES**ˆ**USER/PASSWORD* PWVALPWƒEQU„*!ŠBSR„READPASS‹GETPASSWORDRECORDŠBTSTƒ#BTCHNABT,D7‡ERROR?ŠBNE„LG95YES,REJECTLOGON+ŠBSR„PASS20CLOSELUN1,NOLONGERREQUIRED"ŠTST.B‚(A1)TESTPASSWORDREQUIREDŠBEQ.S‚PWEXITNONEREQUIREDPWVALP10‚EQU„*1ŠMOVEM.LPWPARP,D3-D5†REQUESTPASSWORDPARAMETERS ‰ADD.L…A3,D3#*œADJUSTOFFSETTOADDRESS(SCTINB)ŠBSR.S‚PWINPUTŒINPUTPASSWORDŠBNE.S‚PWVALPER‹BADINPUT ŠLEA„SCTINB(A3),A0ŠADDRESSINPUTŠNOLIST ŠBSR„PASS0ŠBEQ.S‚PWEXITOKŠLIST%‰LEA‡PASSBUFF(A3),A1…ADDRESSPASSWORD‰LEA‡PASSKEY(A3),A6‰ADD.L…#PWRECL,A6*œA6=ENDINGADDRESSPWVALP15‚EQU„*ŠCMP.L‚A6,A1DONE?ŠBEQ.S‚PWEXITYES,GOODŠCMP.B‚(A0)+,(A1)+ˆCOMPARE1ŠBEQ.S‚PWVALP15‹BRANCHOKPWVALPER‚EQU„*#ŠBSR„LGPASSER‹INCREMENTERRORCOUNT ŠBRA„PWVALP10‹COUNTNOTEXCEEDED**ˆ**SECURITYWORD*$PWVALSWƒEQU„*’VALIDATESECURITYWORDŠTST.L‚UCBTSO(A3)‰REQUIRED?ŠBEQ.S‚PWVALSWG‹NONEREQUIRED2ŠMOVEM.LPWPARS,D3-D5†SECURITYWORDPARAMETRBLOCK ‰ADD.L…A3,D3#*œADJUSTOFFSETTOADDRESS(SCTINB)ŠBSR.S‚PWINPUTŒGETINPUTŠBNE.S‚PWVALSWE‹BADINPUT ŠLEA„SCTINB(A3),A0ŠADDRESSINPUTŠNOLIST ŠBSR„PASS0ŠBEQ.S‚PWVALSWGŠLIST(ŠLEA„UCBTSO(A3),A1ŠADDRESSSECURITYWORD%ŠCMP.L‚(A1)+,(A0)+ˆCOMPAREFIRSTPARTŠBEQ.S‚PWVALSW1‹BRANCHGOODPWVALSWE‚EQU„*ŠBSR.S‚LGPASSER‹BADŠBRA„PWVALSWŒTRYAGAINPWVALSW1‚EQU„*&ŠCMP.L‚(A1)+,(A0)+ˆCOMPARESECONDPARTŠBNE„PWVALSWE‹BRANCHERRORPWVALSWG‚EQU„**ŠBTST.B#1,UCBLDCNT(A3)„PASSWORDREQUIRED?ŠBNE„PWVALPWŒYES PWEXIT„EQU„*ŠRTS* PWINPUTƒEQU„**ŠMOVEM.LPWOUT,D1-D2‡OUTPUTI/OPARAMETERS*ŠLEA„OFHS+20(A3),A0‰ENDOFPARAMETERBLOCK#ŠMOVEM.LD1-D5,-(A0)‡TRANSFERMODELŠTRAPƒ#2‘OUTPUTPROMPT(ŠMOVEM.LPWIN,D1-D2ˆINPUTI/OPARAMETERS(ŠMOVE.LD3,D4ŽSTARTINPUTBUFFERADDRESSŠMOVE.L#PWRECL,D6‰INPUTLENGTHŠMOVE.LD3,D5ŽGETSTARTŠADD.L‚D6,D5ŽENDBUFFERADDRESS*ŠLEA„OFHS+20(A3),A0‰ENDOFPARAMETERBLOCK#ŠMOVEM.LD1-D5,-(A0)‡TRANSFERMODELŠTRAPƒ#2‘GETINPUTŠBNE.S‚PWINPUTX‹EXITBADPWINPUT1‚EQU„*ŠMOVE.LD3,A2ŽGETSTARTADDRESS&ŠMOVE.LIOSLEN(A0),D5†GETINPUTLENGTHPWINPUT2‚EQU„*"ŠCLR.B‚0(A2,D5)‹CLEARUNUSEDINPUTŠADD.L‚#1,D5ŽINCREMENTPOINTERŠCMP.L‚D5,D6ŽTESTDONEŠBCC„PWINPUT2‹CONTINUEŠCLR.L‚D0‘GOODSTATUSPWINPUTX‚EQU„*ŠRTS'PWOUT…DC.LƒIOWRIT<<16+IOPIMG,LDFLUN<<16-PWIN†DC.LƒIOREAD<<16+IOPBRK+IOPNEC,CDFLUN<<16*LGPASSER‚EQU„*ŠCMP.B‚#$C6,D0ŒBREAK?(ŠBNE.S‚LGPASSES‹NO,RETURNNOTNECESSARYŠMOVEM.LD1-D6,-(A7)‡SAVEREGSŠBSR„LEFTMARG‹SETLEFTMARGIN!ŠMOVEM.L(A7)+,D1-D6‡RESTOREREGSLGPASSES‚EQU„*$ŠSUB.B‚#1,UCBLEN(A3)†INCREMENTCOUNT ŠBEQ„LG95TOOMANY,REJECTLOGONŠRTS—OKTORETURN*!PWPARS„DC.LƒSCTINB,PWMSGS,PWMSGSE!PWPARP„DC.LƒSCTINB,PWMSGP,PWMSGPE#PWPARN„DC.LƒPASSBUFF,PWMSGN,PWMSGNE#PWPARW„DC.LƒPASSBUFF,PWMSGW,PWMSGWE*!PWMSGS„DC.Bƒ'ENTERSECURITYWORD'PWMSGSEƒEQU„*-1ŠDS0%PWMSGW„DC.Bƒ'ENTERNEWSECURITYWORD'PWMSGWEƒEQU„*-1ŠDS0%PWMSGP„DC.Bƒ'ENTEREXISTINGPASSWORD'PWMSGPEƒEQU„*-1ŠDS0 PWMSGN„DC.Bƒ'ENTERNEWPASSWORD'PWMSGNEƒEQU„*-1ŠDS…0*ŠPAGEO*********************************************************************************ˆSECURE**ˆSETSYSTEMSUCURITYLEVEL*O******************************************************************************* SECURE„EQU„*"ŠTST.L‚USERNO(A3)‰PRIVELEGEDUSER?ŠBNE„LOGPRUNO,ERROREXIT&ŠLEA„SECLVL,A6ŠSECURITYLEVELSMESSAGEŠBSR„MSGCALLŒOUTPUTMESSAGE;ŠMOVEM.LFETCHSEC,D0-D6„PARAMTOFETCHCURRENTSECURELEVEL *ˆADD.L…A3,D3 ‰ADD.L…A3,D6 *œESTABLISHOFFSETSASADDRESSES!ŠBSR.S‚XFERSECŒFETCHSECURELEVEL#ŠLEA„U0SN1,A6‹GETUSER=0,SESSION<>1ŠBSR.S‚SECPROCŒGET,PROCESS%ŠLEA„UN0SN1,A6ŠGETUSER<>0,SESSION<>1ŠBSR.S‚SECPROCŒGET,PROCESS1ŠMOVEM.LSENDSEC,D0-D6…PARAMTOSENDSECURELEVEL ‰ADD.L…A3,D3 *ˆADD.L…A3,D6 *œESTABLISHOFFSETSASADDRESSES XFERSECƒEQU„*ŠMOVE.L#1,OFHS+24(A3)…COUNTŠBRA„STDTRAP1‹MOVESECURELEVEL* SECPROCƒEQU**ŠMOVE.BUCBLDCNT(A3),D0ˆFETCHSECURELEVELŠROL.B‚#4,D03 ŽSWAPNIBBLES ŠMOVE.BD0,UCBLDCNT(A3)„PUTBACK#ŠCLR.B‚D7‘RESETCOMMANDSTATUSBITSŠBSR„READLINE‹GETINPUTŠBEQ.S‚SECPRO2ŒOK SECPRO1ƒEQU„*%ŠMOVE.BUCBLDCNT(A3),D0ˆFETCHCURRENT"ŠAND.B‚#3,D0ŽEXTRACTCURRENTLEVELŠOR.Bƒ#'0',D0ŒCONVERTTODIGIT+ŠMOVE.BD0,SCTINB(A3)†PUTINTOINPUTBUFFER$ŠLEA„SCTINB+2(A3),A5ˆPUTENDADDRESSŠBSR„ECHOTŽFORCEECHO SECPRO2ƒEQU„*ŠMOVE.BSCTINB(A3),D3ŠGETINPUTŠCMP.B‚#'4',D3ŒTESTTOOBIGŠBCC„SECPRO1ŒBRANCHTOOBIGŠCMP.B‚#'0',D3ŒTESTTOOSMALLŠBCS„SECPRO1ŒBRANCHTOOSMALL‰CMP.B…#'2',D3‰BHS.S…SEC_0200#*œJMPIFLEVEL2OR3WASREQUESTED SEC_0100:ŠAND.B‚#3,D3ŽEXTRACTLEVEL&ŠMOVE.BUCBLDCNT(A3),D0ˆFETCHPREVIOUSŠAND.B‚#$FC,D0ŒREMOVEOLDŠOR.BƒD3,D0ŽINSERT ŠMOVE.BD0,UCBLDCNT(A3)„PUTBACK(ŠBSRECHOE‘ECHOIFNOTPREVIOUSLYECHOEDŠRTS*+*ˆEDITFOR'PRIV.ACCOUNT.PW'FILEEXISTENCE*ˆ.*ˆ.*ˆV *ˆCLOSEFILE*ˆ.*ˆ.*ˆV*ˆFILEEXIST---YES--->SEC_0100*ˆ|*ˆ|*ˆV4*ˆFILEEXISTBUTCURRENTLYINUSE---YES--->SEC_0100*ˆ|*ˆ|*ˆV *ˆREMOVERETURNFROMBSRREQUEST*ˆ|*ˆ|*ˆV*ˆOUTPUTANERRORMESSAGE*ˆ|*ˆ|*ˆV*ˆGIVEUSERANOTHERCHANCE*ˆ|*ˆ|*ˆV*ˆSECURE*** SEC_0200: ‰BSR‡READPAS0-*œEDITTOSEEIF'PRIV.ACCOUNT.PW'FILEEXIST‰MOVE.L„D0,-(A7)*œSAVERESULTSOFASSIGN ‰BSR‡PASS20 *œCLOSEFILE‰MOVE.L„(A7)+,D0*œRESTORERESULTSOFASSIGN‰BEQ.S…SEC_0100*œJMPIFFILEEXIST‰CMP.B…#FSTAAP,D0‰BEQ.S…SEC_0100*œJMPIFFILEEXISTBUTINUSE*œ(ACCESSPERMISSIONERROR) ‰TST.L…(A7)+*œREMOVERETURNFORBSRREQUEST ‰BSR‡EMSGCAL1*œOUTPUTERRORMESSAGEž ‰BRA‡SECURE*œGIVEREQUESTORANOTHERCHANCE9SECLVL„DC.Bƒ'LEVELSARE:0/NONE,1/SWORD,2/PWORD,3/BOTH',0ŠDS…0U0SN1…DC.Bƒ'USER=0:',0ŠDS…0UN0SN1„DC.Bƒ'USERNOT0:',0ŠDS…0;FETCHSEC‚DC.LƒMOVELL,EETPNAM,EETSESNO,UCBLDCNA,0,0,UCBLDCNT*œFETCHSECURITYFROMEET:SENDSECƒDC.LƒMOVELL,0,0,UCBLDCNT,EETPNAM,EETSESNO,UCBLDCNA*œMOVESECURITYTOEETŠPAGEO*********************************************************************************ˆUSERACCOUNTING*H*ˆENTRYPOINT'''ACCTINN''''WILLALREADYHAVEA6=SCTDATASEGMENTADDRS*O*********************************************************************************ˆ**SESSIONEND* ACCTENDƒEQU„* ‰MOVE.L„A3,A6*œA6=SCT'SDATASEGMENTADDRESSACCTINN:‰MOVE.W„#FOPPRPW,D1*œD1=PUBLICREAD/WRITEOPTION!ŠBSR„ASGNFILE‹ATTEMPTASSIGNFILE+*œA3=SCT'SDATASEGMENTADDRESSUPONRETURN(ŠBNE.S‚ACCTEXIT‹UNABLETOASSIGN,IGNORE5ŠMOVE.LUSERNO(A3),SCTINB(A3)‚FETCHKEY(USERNUMBER)+ŠMOVEM.LACCTREAD,D0-D6„GETPARAMETERBLOCK ‰ADD.L…A3,D3 ‰ADD.L…A3,D4 *œESTABLISHOFFSETSASADDRESSES&ŠLEA„OFHS+28(A3),A0‰ENDOFPUTADDRESSŠMOVEM.LD0-D6,-(A0)‡PUTMODEL ŠTRAPƒ#2‘READ ŠBNE.S‚ACCTEXIT‹BADREAD,IGNORE4ŠLEA„SCTINB+OWLLOFFS(A3),A0PUTLOGOFFTIMEADDRESS(ŠMOVE.L#GTDTIM,D0‰GETDATE,TIMECOMMANDŠTRAPƒ#1)ŠLEA„UCBTSO(A3),A2ŠPOINTTOSTARTADDRESSŠBSR„GETLAPSE‹GETELAPSEDTIME:ŠLEA„SCTINB+OWCTIMS(A3),A1‚ADDRESSCUMULATIVETIMETODATE9ŠBSR„ADDLAPSEŠADDSESSIONELAPSEDTIMETOCUMULATIVETIME!ŠLEA„SCTINB(A3),A1ŠBUFFERADDRESS-ŠADD.L‚#1,OWSCNTS(A1)…INCREMENTSESSIONCOUNT2ŠMOVEM.LACCTUPDA,D0-D6„GETMODELTOUPDATERECORD ‰ADD.L…A3,D3 ‰ADD.L…A3,D4 *œESTABLISHOFFSETSASADDRESSES,ŠLEA„OFHS+28(A3),A0‰ENDOFPARBLOCKADDRESS"ŠMOVEM.LD0-D6,-(A0)‡PUTPARBLOCKŠTRAPƒ#2 ACCTEXIT‚RTS*4ACCTREAD‚DC.WƒIOREAD,IOPRTK+IOPBIN+IOPIMG+IOPRRN,1,0 ŠDC.Lƒ0,SCTINB,SCTINB+OWRECL-1,0-ACCTUPDA‚DC.WƒIOUPDR,IOPBIN+IOPIMG+IOPRRN,1,0 ŠDC.Lƒ0,SCTINB,SCTINB+OWRECL-1,0ŠENDé4 ééé=/*=/*†SYSCNTRL.AF=/*&=/* Chain file to assemble SYSCNTRL.SA=/*:=/* If no output argument is specified for the listing the*=/* chain file will default to SYSCNTRL.LS=/*=/IFC \1ƒ=ARGSYSCNTRL.LS=/ENDIF=/*&=ASM SYSCNTRL.SA,SYSCNTRL.RO,\1;RZ=106=/*{ Included files are:=/*ƒ9995.&.USM.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.EXE.EQ=/*}=/*=ENDéééééé{',D0ŒENDOFSTRING?ŠBEQ.S‚SUBSGGTŒENDOFSTRING"SUBSGPUT‚MOVE.BD0,(A1)+‹SAVECHARŠBRA„SUBSGLOP‹CONTINUE%SUBSCOMA‚TST.B‚D1‘STRINGINPROGRESS?ŠBNE„SUBSGPUT‹YESŠCLR.B‚D0‘SUBSTITUTE0/NULLŠMOVE.LA1,D2ŽGETPUTPOINTER‰MOVE.L„A6,-(A7)‰MOVE.L„A1,-(A7)*œSAVEREGA1ANDA6‰MOVE.L„UCBREGA6(A3),A6 *œA6=ADDRESS'.ARG'DATASEGMENT‰LEA‡CHAINBUF-1(A6),A1*œA1=CHAINADDRESSOFSOMEKIND(*‰SUB.L‚#CHAINBUF-1,D2…COMPUTEINCREMENT‰SUB.L…A1,D2ŒCOMPUTEINCREMENT‰MOVE.L„(A7)+,A1‰MOVE.L„(A7)+,A6*œRESTOREREGA6ANDA1ŠMOVE.BD2,(A2)+‹SAVEINCREMENT$ŠCMP.L‚CHAINPTR(A3),A2ˆTESTOVERFLOW'ŠBCS„SUBSGPUT‹PUTNULLINSTEADOFCOMMA&ŠBSETƒ#BTARGNOE,D7‡NO.ARGUMENTSERROR#ŠBRA.S‚SUBSGEOL‹PROCESSENDOFLINE SUBSGLTƒEQU„*%ŠTST.B‚D1‘STRINGALREADYINPROGRESS?#ŠBEQ.S‚SUBSGLT1‹NO,IGNORETHISONEŠMOVE.BD0,(A1)+‹SAVETHISONE!SUBSGLT1‚ADD.B‚#1,D1ŽNOWTHEREISŠBRA„SUBSGLOP‹CONTINUE SUBSGGTƒEQU„*ŠSUB.B‚#1,D1ŽDECREMENTCOUNT%ŠBNE„SUBSGPUT‹STILLPROCESSINGSTRINGŠBRA„SUBSGLOP‹CONTINUESUBSGEOL‚EQU„*ŠCLR.B‚(A1)SETNULLŠMOVE.B#$D,1(A1)ŠPUTCR&ŠMOVE.LA2,D0ŽCHANGEREGTOMANIPULATE‰MOVE.L„A6,-(A7)‰MOVE.L„UCBREGA6(A3),A6 *œSAVEREGA6+*œA6=ADDRESS'.ARG'DATASEGMENT(CHPOSNUM) ‰ADD.L…#1,A6/*œA6=ADDRESSEQUIVALENTOFCHPOSNUM+1SINCETHE*ŸCHPOSNUMOFFSET=0)*‰SUB.L‚#CHPOSNUM+1,D0…GETNO.OFENTRIES*‰SUB.L…A6,D0ŒGETNO.OFENTRIES ‰SUB.L…#1,A6+*œA6=ADDRESS'.ARG'DATASEGMENT(CHPOSNUM),ŠMOVE.BD0,CHPOSNUM(A6)„SAVEMAXNO.ENTRIES‰MOVE.L„(A7)+,A6*œRESTOREREGA6#ŠTST.B‚D1‘STRINGSTILLINPROGRESS?ŠBNE.S‚SUBSEROR‹YES SUBSEXIT‚RTS*SUBSEROR‚EQU„* ŠMOVE.L#EM_ARGX,D0ˆMESSAGETYEPŠBRA„ERRCALLŒOUTPUTANDRETURNŠPAGEH************************************************************************(*ˆ**SUBROUTINETODISPLAYARGUMENTLISTH************************************************************************ SUBDISPK:‰MOVE.L„(A7)+,A6*œRESTOREREGA6SUBDISPL‚EQU„*.ŠMOVE.L#1,D4ŽINITIALIZETOFIRSTSUBSTITUTION,*‰LEA„CHPOSNUM,A2ˆADDRESSSUBSTITUTIONTABLE2‰MOVE.L„UCBREGA6(A3),A2‚ADDRESSSUBSTITUTIONTABLESUBDISP1‚EQU„*ŠCMP.B‚(A2),D4ŒTESTDONEŠBGT.S‚SUBDISPX‹DONE*ŠLEA„SCTINB(A3),A5ŠBUFFERTOBUILDMESSAGE$ŠMOVE.B#'\',(A5)+‰SUBSTITUTIONCHAR$ŠMOVE.LD4,D0ŽNUMBERTOBECONVERTED$ŠBSR„BDCONVCONVERTTOASCIIDECIMALŠROL.W‚#8,D0ŽPOSITIONHICHARŠMOVE.BD0,(A5)+‹PUTCHARŠROL.W‚#8,D0ŽGETOTHERCHARŠMOVE.BD0,(A5)+‹PUTCHARŠMOVE.B#':',(A5)+&ŠCLR.W‚D0‘INITIALIZEFORWORDINDEXING7ŠMOVE.B0(A2,D4),D0ˆGETINCREMENTTOSTARTSUBSTITUTION0ŠLEA„$50(A2,D0),A6†ADDRESSSTARTOFSUBSTITUTIONŠMOVE.LD4,-(A7)‹SAVED42ŠCLR.B‚D5‘SETMESSAGETERMINATORFORMESSAGEBUILD*ŠBSR„BUILDMSG‹TRANSFERSUBSTITUTIONSTRINGŠBSR„WRITEINB‹OUTPUTTOLUN6ŠMOVE.L(A7)+,D4‹REFETCHD4%ŠADD.L‚#1,D4ŽINCREMENTTONEXTSTRINGŠBRA„SUBDISP1‹CONTINUESUBDISPX‚EQU„*$ŠBCLRƒ#BTARGNOE,D7‡RESET,TESTERRORŠBEQ„SUBSEXIT‹OK!ŠMOVE.L#EM_ARGNO,D0‡MESSAGETYPE'ŠBRA„EMSGCALL‹OUTPUTMESSAGEANDRETURN*ŠENDéé8 ééééé=/* =/*†USM.AF=/*!=/* Chain file to assemble USM.SA=/*:=/* If no output argument is specified for the listing the%=/* chain file will default to USM.LS=/*=/IFC \1 ƒ=ARGUSM.LS=/ENDIF=/*=ASM USM.SA,USM.RO,\1;RZ=110=/*{ Included files are:=/*ƒ9995.&.TR1RTCD.EQ=/*ƒ9995.&.USM.EQ=/*ƒ9995.&.TR1.EQ=/*ƒ9995.&.IOE.EQ=/*ƒ9995.&.EXE.EQ=/*}=/*=ENDééééééý >' USM SAêÎqqUSMLIB CF qqSYSGEN CF  ÒqqCMDLIST AG--qqINITDAT AGNN¹qqROMIOI1 AG__3qqVERSADOSCDhhQqqINITGEN CIÁÁqqROGEN CIÊÊqqIOI CIÓÓ9qq8 VALPAR CIÜÜqqIFTASK CIííqqIOCGEN CIööqqSYSINIT CIÿÿOqqCNFGTASKCI   qqM316DEF CI  qqEET LG " "qqFHS LG + +qqFMS LG 4 4qqIOCGEN LG = = qq=USM‡IDNTƒ4,00Š8107190816USERSESSIONMANAGEMENTCONTROLTASK**‰INCLUDE9995.&.TR1RTCD.EQ*‰INCLUDE9995.&.USM.EQ*‰INCLUDE9995.&.TR1.EQ*‰INCLUDE9995.&.IOE.EQ*‰INCLUDE9995.&.EXE.EQ*ŠNOLISTŠINCLUDE9995.&.TR1RTCD.EQŠINCLUDE9995.&.USM.EQŠINCLUDE9995.&.TR1.EQŠINCLUDE9995.&.IOE.EQŠINCLUDE9995.&.EXE.EQŠLISTŠXDEFƒASGNFILEŠXDEFƒADDLAPSEŠXDEFƒBLANKOUTŠXDEFƒBUILDINB ŠXDEFƒBCTRAP1ŠXDEFƒBUILDMSG ŠXDEFƒCLOCDF ŠXDEFƒCKDEV ŠXDEFƒCKNODEV ŠXDEFƒECHOE ŠXDEFƒECHOS ŠXDEFƒECHOTŠXDEFƒEMSGCALLŠXDEFƒEMSGCAL1 ŠXDEFƒERRCALLŠXDEFƒEDITSESSŠXDEFƒEDITSPAC ŠXDEFƒFHOPEN ŠXDEFƒFHCLOSEŠXDEFƒFHEXOPENŠXDEFƒFHEXCLOSŠXDEFƒFHOPNTIDŠXDEFƒGETLAPSEŠXDEFƒGETNOSPAŠXDEFƒGETLJSFYŠXDEFƒGETLEFT4 ŠXDEFƒICALL ŠXDEFƒLG95 ŠXDEFƒLOGPRU ŠXDEFƒLOGMESG ŠXDEFƒLDRCALL ŠXDEFƒLMARGINŠXDEFƒLEFTMARG ŠXDEFƒMSGCALL ŠXDEFƒOPNCDF ŠXDEFƒPROC ŠXDEFƒPROC120 ŠXDEFƒPROC206 ŠXDEFƒPROC210 ŠXDEFƒPROC255 ŠXDEFƒPROC260 ŠXDEFƒPROC320 ŠXDEFƒPROMPT ŠXDEFƒPRTFILEŠXDEFƒREADLINE ŠXDEFƒSCTBEG ŠXDEFƒSC18ŠXDEFƒSTDERRORŠXDEFƒSTDTRAP1ŠXDEFƒSTDTRAP2DŠXDEFƒSTDTRAP3ŠXDEFƒSKIPSPAC ŠXDEFƒSYSDPARŠXDEFƒWRITEINB ŠXDEFƒX10100 ŠSECTION8H*************************************************************************=*‚SCTCODESECTIONISREENTRANT.‚SCTISINITIATEDBYTHEEET.**‚REVX3.00‚HBR8D*‚INCLUDESSHARED.ARGW/OPTIONSA-OANDERRORMESSAGEHANDLERCALLS*H************************************************************************** ŠXREFƒBYEBYEŠXREFƒCMDPWVALŠXREFƒCLASCODE ŠXREFƒCVT2 ŠXREFƒCHAIN ŠXREFƒCHAIN2ŠXREFƒCHPOSNUMŠXREFƒCHAINBUF ŠXREFƒCMDENDŠXREFƒCHAINPTR ŠXREFƒDATEŠXREFƒDELAYSEC ŠXREFƒDELAYSŠXREFƒEDITFILEŠXREFƒENABLASQŠXREFƒENDQUEUEŠXREFƒJOBQUEUE ŠXREFƒLOGMŠXREFƒLOGTRYNO ŠXREFƒLOGBYE ŠXREFƒLOGOFF ŠXREFƒLDRFILL ŠXREFƒLDRCLL ŠXREFƒLDRABUF ŠXREFƒLDRLDOŠXREFƒLODRETRY ŠXREFƒOFHSŠXREFƒPRTIMDAT ŠXREFƒPROC400ŠXREFƒREGCHAIN ŠXREFƒSTOPALL ŠXREFƒSTOP1 ŠXREFƒSTRUTN ŠXREFƒSTRUOPTŠXREFƒSTARTMON tQ@#5+F3E;1CCK@SC[JcQkIsF{EƒH‹?“@›B£B«@³=»3Ã5Ë>Ó@ÛFã@ëRó ŠXREFƒSCTEXB ŠXREFƒSYSOPT ŠXREFƒSYSCMDS ŠXREFƒSCTINB ŠXREFƒSCTINBE ŠXREFƒSYSDFLT ŠXREFƒSCTSTKŠXREFƒSHAREOPT ŠXREFƒTIME ŠXREFƒTERM5 ŠXREFƒTERMALL ŠXREFƒTIMECNTŠXREFƒUCBPRILIŠXREFƒUCBPRICHŠXREFƒUCBPRIBT ŠXREFƒUSE ŠXREFƒUSRTSK ŠXREFƒUCBTSK ŠXREFƒUCBUTN ŠXREFƒUCBTSO ŠXREFƒUCBSNO ŠXREFƒUSERNOŠXREFƒUCBMSWAT ŠXREFƒUCBBNAMŠXREFƒUCBCMDNDŠXREFƒUCBCMDLG ŠXREFƒUCBLUS ŠXREFƒUCBTID ŠXREFƒUCBKEEP ŠXREFƒUCBREGD ŠXREFƒUCBREGXŠXREFƒUCBLDCNTŠXREFƒUCBCMDST ŠXREFƒUCBTUT ŠXREFƒUCBTEMP ŠXREFƒUCBSESS ŠXREFƒUCBUNO ŠXREFƒUTTCBP ŠXREFƒUCBLENŠXREFƒUCBREGA6 ŠXREFƒUCBTSOA ŠXREFƒDEFAULTŠXREFƒEET_GFLGŠXREFƒOFHSFILL*‰PAGE****ˆVERSACOMPUTERCHANGEHISTORY*5*‰1.ENTRYTOTHE'SCT'TASKWILLHAVETHEFOLLOWING:"*’A5=ADDRESS'.ARG'DATASEGMENT$*’A6=ADDRESSSCTTASKDATASEGMENT*F*‰2.INITIALIZETHE'USER'TASKENTRYREGISTERSA5ANDA6RESPECTIVELY *’A5=ZERO"*’A6=ADDRESS'.ARG'DATASEGMENT*B*‰3.THECODINGSECTION'USM'OFTHESCTTASKWILLUSEREGISTERA3@*ŒTOCONTAINTHE'SCT'TASKDATASEGMENTADDRESSUNLESSSPCIFIED *ŒOTHERWISE*B*‰4.PRE-DEFINEDPARAMETERSTHATONCEREFERENCEDADDRESSESBUTNOW?*ŒREPRESENTOFFSETSAREADJUSTEDBYADDINGTHESCTDATASEGMENT$*ŒADDRESS9 (A3)TOREFLECTANADDRESS** Changes 7/83 SCB.*=*‰1.FixedsothatusermayelecttohaveEEThandlecomplete9*Žlogonincludingenteringofsystemdefaultvolume,user:*Žnumber,catalog,date,andtimesothatwhenbooting,no>*Žmanualentriesneedbemadepriortothefirstsessionbeing9*Žloggedon.‚Thisoptionisselectedbysettingbit#1in>*Žthesysgenparameter'AUTOLOGN'.‚Atthetimeofthischange,<*Žbitposition0inAUTOLOGNwasusedtoindicateauto-break*Žafterinitialboot.;*‰2.FixedproblemofEETtryingtoaccessPRIV.UPSYSTEM.CF9*Žpriortothesystemdefaultvolumebeingestablishedby<*ŽFMSonbootup.‚Thetechniqueusedistotrytoaccessthe6*Žfile0.&.ERRORMSG.SY.‚Ifthefileisunavailablefor9*Žassignment,thenthesystemdefaultvolumehasnotbeen6*Žestablishedyet.‚EETwillattempttoassignthefile8*Žatonesecondintervalsforaperiodof10seconds.‚If8*Žatanytimeinthisloop,thefileisassignedwithno8*Žerrorthenprocessingcontinuesnormally.‚If,however,>*Žthefilecanneverbeassignedduringthecourseoftheloop,*Žtheauserfriendlyerrormessageappears:@*Ž'**ERROR-unabletoassign0.&.ERRORMSG.SYonsystemvolume'9*Žandprocessingwouldcontinuenormally.‚0.&.ERRORMSG.SY:*Žwaspickedasthetestfileinthiscasesinceitisthe&*Žonlyrequiredfileonasystemdisk.* ŠPAGE ‰DC.B†'USM'‰DC.B†'1210844'=SCTBEG„EQU„*ŒENTRYPOINTFROMEET(STARTOFSCTCODESEGMENT)**ˆ**INITIALIZESCT***‰MOVE.L„A5,UCBREGA6(A6)*œA5=ADDROF'.ARG'SEGMENT1*ŸUPONENTRYTOUSERTASK-A6='.ARG'SEGMENTADR ‰MOVE.L„A6,A3*œA3=SCTDATASEGMENTADDRESS+ŠLEA„SCTSTK(A3),A7ŠINITIALIZESTACKPOINTER5ŠCLR.B‚CHPOSNUM(A5)‡INITIALIZEPARAMETERSUBSTITUTION1ŠMOVE.W#$D,CHAINBUF(A5)ƒINITIALIZEARGUMENTLIST**ˆ**ENABLEASQ&ASR* ŠBSR„ENABLASQ***‚ASSIGNLUNTOSCT'SINTERACTIVETERMINAL*0ŠLEA„OPNSCT,A1ŠPARAMETERSFORSCTLUNOPEN/ASSIGN(ŠBSR„FHOPNTID‹OPENFORPUBLICREAD/WRITE* *ˆ**OPENCDFLUNFORPUBLICREAD* ŠBSR„FHOPEN*!*ˆ**OPENLDFLUNFORPUBLICWRITE* ŠBSR„FHOPEN**ˆ**INITIALIZEFORLOGON***0ŠMOVE.BLOGTRYNO,UCBLEN(A3)INITIALIZETRYCOUNT#ŠLEA„LOGM,A6ŒIDENTIFICATIONMESSAGEŠBSR„BUILDINB‹OUTPUTMESSAGEH*************************************************************************ˆ**USERLOGONH************************************************************************ LOGON…EQU„*ŠCLR.B‚D7‘RESETFLAGS‰MOVE.L„UCBREGA6(A3),A6 *œA6=ADDRESS'.ARG'DATASEGMENTK„MOVE.W#(1<ŠBTSTƒ#BTCHNOVR&7,(SHAREOPT+1-(BTCHNOVR/8))(A6)ERROROVERIDE?!ŠBNE.S‚RDPRCMD2‹YES,IGNOREERRORRDPRABR1‚EQU„*$ŠLEA„CHANABRT,A6ˆCHAINABORTMESSAGEŠBSR„MSGCALLŒOUTPUTMESSAGEŠBTSTƒ#BTBATCH,D7ˆBATCHMODE?O*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>01/21/85>>*E*ˆPerinstructionsthisSPRfixhasbeenbackedout.ItwillnotworkF*ˆforanMMUtypesystem.Theoriginalinstructionhasbeenre-invokedA*ˆWewillhavetolookatthisagainforamorecorrectsolution.'*ˆThiscurrentfixwillre-openSPR876* *‰BNE„X10200*œJMPIFBATCHMODE*œFIXFORSPR876* ‰BNE‡LOGOFF *œTERMINATEO*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<01/21//85< .ŠBCLRƒ#BTREAD5,D7ˆRESETTOINTERACTIVE(LUN0)&ŠBSETƒ#0,UCBLUS+3(A3)„ALSOINLUNMASK‰MOVE.L„UCBREGA6(A3),A6*œA6=ADDRESS'ARG'DATASEGMENT,ŠBSETƒ#0,SHAREOPT+1(A6)‚ALSOINOPTIONSMASKRDPRCMD2‚EQU„*1ŠBCLRƒ#BTUSBRK,D7ˆ(IFSETDURINGCHAINABORTMSG)&ŠBCLRƒ#BTCMDABT,D7‡RESETCOMMANDABORT*ŠBCLRƒ#BTCHNABT,D7‡RESETCHAINERRORABORTŠBCLRƒ#BTEOF,D7ŠPREVIOUSEOF?ŠBEQ.S‚RDPRCMD3‹NO; ,PROCEED"ŠBSR„LEFTMARG‹RESETTOLEFTMARGINRDPRCMD3‚EQU„**ŠCLR.B‚UCBLDCNT(A3)‡CLEARLOADTRYCOUNTER**ˆ**READNEXTCOMMANDLINE* READCMDƒEQU„*ŠCLR.B‚D7‘RESETCOMMANDFLAGSŠLEA„PROMPT,A6 ŠBTSTƒ#BTCDFILE,D7‡LUN5=FILE?ŠBEQ.S‚READCMD1‹NO,CONTINUE%ŠLEA„ABPROMPT,A6ˆCHAINABORTEDPROMPTREADCMD1‚EQU„*"ŠBSR„READLINE‹READNEXTINPUTLINE*%*ˆ**DECODE,ANDBRANCHTOPROCESSIT* PROC†EQU„*ŠTST.L‚D0‘TESTSTATUSŠBEQ.S‚PROC10BRANCHI/OOKŠCMP.B‚#ISTATO,D0‰TIMEOUT?ŠBEQ.S‚PROC3ŽYES%ŠCMP.B‚#ISTANR,D0‰TERMINALNOTREADY? ŠBNE.S‚PROC5ŽNOTRYOTHERERRORS(ŠADD.B‚#1,UCBLDCNT(A3)„INCREMENTCOUNTERŠBEQ„BYEBYETERMINATETASKŠBSR„DELAYSEC‹WAITŠBRA„READCMDŒTRYAGAIN PROC3…EQU„*(ŠADD.B‚#1,UCBLDCNT(A3)„INCREMENTCOUNTER#ŠMOVE.BUCBLDCNT(A3),D1ˆFETCHCOUNT"ŠCMP.B‚TIMECNT,D1‰TIMETOLOGOFF?ŠBCS.S‚PROC4ŽNO PROC3A„EQU„*ŠBSR„ERRCALLŒOUTPUTMESSAGE&ŠBSETƒ#BTBATCH,D7ˆ(DON'TBLANKSCREEN)ŠBRA„LOGOFFTERMINATETASK PROC4…EQU„*9ŠLEA„PROMPT-2,A6ˆPROMPTWITHBELL,REGARDLESSOFOPTIONBŠBRA„READCMD1‹TRYAGAIN PROC5…EQU„*$ŠBTSTƒ#BTUSBRK,D7ˆBREAKTERMINATION?ŠBNE.S‚PROC26BRANCHYESŠBTSTƒ#BTEOF,D7ŠEOF?ŠBNE„CMDENDYESŠBRA„RDPRCMDŒTRYAGAIN PROC10„EQU„*"ŠCMP.B‚#$D,(A0)‹FIRSTCHARRETURN?ŠBEQ.S‚PROC26CRALONE=NULLŠCLR.L‚D1‘INITIALIZE**ˆ**SKIPLEADINGSPACES* PROC20„EQU„*'ŠCMP.B‚#'',(A0)ŠTESTFORLEADINGSPACEŠBNE.S‚PROC22PROCEEDŠADD.L‚#1,A0ŽADVANCEPOINTERŠSUB.L‚#1,D6ŽDECREMENTCOUNTŠBGT„PROC20CONTINUESKIPPING ŠBRA„RDPRCMD*#*ˆ**FILEINPUTMUSTSTARTWITH"="* PROC22„EQU„*'ŠBTSTƒ#BTREAD5,D7ˆFILEORDEVICEINPUT?ŠBEQ.S‚PROC30BRANCHDEVICE ŠCMP.B‚#'=',(A0)ŠFIRSTCHAR"="?ŠBNE.S‚PROC26NO,IGNORE!ŠCMP.B‚#'@',1(A0)‰COMMANDOPTION?ŠBNE.S‚PROC25NO,CONTINUEŠBSETƒ#BTATSIGN,D7‡SETFLAGŠADD.L‚#1,A0ŽADVANCEPOINTER&ŠSUB.L‚#1,D6ŽDECREMENTREMAININGCOUNTŠBLE„PROC300ŒENDOFLINEERROR PROC25„EQU„*)ŠBTSTƒ#BTENDSKP,D7‡CONDITIONALSKIPMODE?ŠBEQ.S‚PROC27TESTECHOINPUT/ŠCMP.B‚#'/',1(A0)‰NEXTCHARCONDTIONALCOMMAND?ŠBNE.S‚PROC26NO,IGNORE‰MOVE.L„A6,-(A7)‰MOVE.L„UCBREGA6(A3),A6 *œSAVEREGA6 *œA6=ADDRESS'.ARG'DATASEGMENTG‰BTST#BTPRTSKP&7,(SHAREOPT+1-(BTPRTSKP/8))(A6)PRINTCONDITIONALDURIN*µSKIP?ŠBEQ.S‚PROC29NO&ŠMOVE.B#'/',(A0)+‰FLAGSKIPCONDITIONŠBRA.S‚PROC29AŒGOLISTIT*9*ˆ**RETURNFORSHORTLINE,CONDITIONALSKIP,LACKOF"="* PROC26„EQU„*5ŠBCLRƒ#BTSUBSER,D7‡IGNOREPOSSIBLESUBSTITUTIONERRORŠRTS.*ˆ**TESTWHETHERTOPRINTCONDITIONALCOMMAND PROC27„EQU„*-ŠCMP.B‚#'/',1(A0)‰ISITACONDITIONALCOMMANDŠBNE.S‚PROC30NO,GOECHO‰MOVE.L„A6,-(A7)‰MOVE.L„UCBREGA6(A3),A6DŠBTSTƒ#BTPRTIF&7,(SHAREOPT+1-(BTPRTIF/8))(A6)PRINTCONDITONALCMDS?‰BNE.S…PROC29AƒYESPROC29:‰MOVE.L„(A7)+,A6*œRESTOREREGA6 ‰BRA.S…PROC35PROC29A:‰MOVE.L„(A7)+,A6*œRESTOREREGA6***ˆ**FILE-ECHOINPUTTOLDF* PROC30„EQU„*)ŠBSR„ECHOSŽECHOIFNOTPREVIOUSLYPRINTED PROC35„EQU„*ŠCMP.B‚#'=',(A0)Š"="/ŠBNE.S‚PROC38OKŠADD.L‚#1,A0ŽINCREMENTPOINTER&ŠSUB.L‚#1,D6ŽDECREMENTREMAININGCOUNT PROC38„EQU„*'ŠCMP.B‚#'@',(A0)ŠDEVICEOPTIONPOSITIONŠBNE.S‚PROC40CONTINUE#ŠBSETƒ#BTATSIGN,D7‡"@"OPTIONFOUNDŠADD.L‚#1,A0ŽINCREMENTPOINTER&ŠSUB.L‚#1,D6ŽDECREMENTREMAININGCOUNT* *ˆ**ABORTIFSUBSTITUTIONERROR* PROC40„EQU„*ŠCMP.B‚#$D,(A0)‹ENDOFLINE?ŠBEQ„PROC26IGNORE*ŠBTSTƒ#BTSUBSER,D7‡TESTSUBSTITUTIONERRORŠBEQ.S‚PROC45NO,PROCEEDŠBRA„ECHOEŽECHOASIS*$*ˆ**INITIALIZEFORENTRYMATCH-TEST* PROC45„EQU„*‰PAGE*!*ˆThefollowingcodefixesSPR495**ˆThefollowingcodewasadded4*’toeleminateleadingspacesbetweenthe'='prompt*’andthestartofthecommand*‰CMP.B…#'',(A0) ‰BNE.S…PROC47.*œJMPIFTHISISNOTALEADINGSPACECHARACTER ‰TST.B…(A0)+*œADJUSTTONEXTCHARACTER ‰BRA.S…PROC45 *œREPEATLOOPPROC47:‰PAGE+ŠMOVE.LA0,UCBCMDST(A3)„SAVESTARTINGPOINT4ŠCLR.L‚D2‘INITIALIZEMATCH/CONTINUEFLAGTOCONTINUE#ŠCMP.B‚#'/',(A0)ŠCHAINCONDITIONAL?ŠBEQ„PROC400ŒYES6ŠMOVE.L#SYS; CMDS,A6ˆGETSTARTOFSYSTEMCOMMANDSTABLE PROC50„EQU„*8ŠMOVE.LUCBCMDST(A3),A0ˆGETSEARCHSTRINGSTARTINGPOINT*"*ˆ**COMPAREENTRYTOINPUTSTRING* PROC55„EQU„*ŠMOVE.B(A6)+,D1‹GETTABLECHARŠBMI.S‚PROC58MAYBEENDŠBNE.S‚PROC60NOTEND,CONTINUE)ŠCMP.B‚#'',(A0)ŠINPUTSTRINGTERMINATOR?ŠBGT.S‚PROC65NO,NOMATCHŠNOT.B‚D2‘SETMATCHFLAG&ŠBRA.S‚PROC70GOGETPROCEDUREADDRESS PROC58„EQU„*)ŠCMP.B‚#'',(A0)ŠINPUTSTRINGTERMINATOR?ŠBLE„PROC55YES"ŠAND.B‚#$7F,D1ŒREMOVEHIORDERBITŠCMP.B‚#$60,D1ŒLOWERCASE?ŠBCS.S‚PROC60NOŠSUB.B‚#$20,D1ŒFORCEUPPERCASE;PROC60„CMP.B‚(A0)+,D1‹TABLEENTRYWITHINPUTCHAR(ADVPTR).ŠBEQ„PROC55CONTINUECHECKINGTHISTABLEENTRY*5*ˆ**ENTRY-STRINGNOCOMPARE,ADVANCETOENDOFENTRY* PROC65„EQU„*(ŠTST.B‚(A6)+ŽLOOKFORENDOFTABLEENTRYŠBNE„PROC65CONTINUELOOKING***ˆ**ADJUSTENTRYADDRESSTOWORDBOUNDARY* PROC70„EQU„*4ŠMOVE.LA6,D0ŽMOVETODATAREGISTERFORMANIPULATIONŠADD.L‚#1,D0ŽROUNDUPŠBCLRƒ#0,D0ŽFORCEWORDBOUNDARY&ŠMOVE.LD0,A6ŽBACKTOADDRESSREGISTER&ŠMOVE.L(A6)+,D0‹GETPROCEDUREADDRESS!ŠBEQ.S‚PROC120Œ(NOTFOUND)RETURNŠTST.B‚D2‘MATCH/CONTINUE?ŠBEQ„PROC50CONTINUE**ˆ**MATCHFOUND*!ŠBSR„REMLENFINDREMAININGLENGTH!ŠMOVE.LD0,A1ŽTRANSFERTOADRREGŠJMP„(A1)GOTOPROCEDURE*&*ˆ**NOTASYSTEMCOMMAND,SEEIFFILE* PROC120ƒEQU„*,ŠMOVE.LUCBCMDST(A3),A0ˆADRSTARTOFCOMMANDŠBSR„LDRFILLŒGETDEFAULTS+ŠMOVE.W#'LO',FHSEXT(A6)ƒASSUME"LO"EXTENTŠMOVE.L#'„',D0‰BLANKINGSPACESŠMOVE.LD0,FHSFIL(A6)†FILENAMEŠMOVE.LD0,FHSFIL+4(A6)„"**ˆFORMATFILENAME*‰MOVE.L„A3,-(A7)*œA3=SCTDATASEGMENTADDRESS'ŠBSR„EDITFILE‹TREATCOMMANDASFILENAME‰MOVE.L„(A7)+,A3*œA3=SCTDATASEGMENTADDRESSŠBPL.S‚PROC125ŒOK*ŠMOVE.L#EM_FILNA,D0‡FILEDESCRIPTORERROR"ŠBRA„EMSGCALL‹OUTPUTERRORMESSAGE PROC125ƒEQU„*ŠTST.B‚D0‘*,/,#NOTALLOWED!ŠBNE„PROC320ŒCOMMANDSYNTAXERROR$ŠCMP.B‚#';',D1ŒSEMICOLONTERMINATOR? ŠBEQ„PROC320ŒYES,COMMANDSYNTAX ŠCMP.B‚#',',D1ŒCOMMATERMINATOR? ŠBEQ„PROC320ŒYES,COMMANDSYNTAX(ŠCMP.B‚#'/',D1ŒCONCATINATIONTERMINATOR? ŠBEQ„PROC320ŒYES,COMMANDSYNTAX&ŠCMP.B‚#'&',FHSFIL(A6)„TEMPORARYFILE?*ŠBEQ„PROC300ŒTEMPFILECANNOTBEACOMMAND‰MOVE.L„A6,-(A7)‰MOVE.L„UCBREGA6(A3),A6 *œSAVEREGA6 *œA6=ADDRESS'.ARG'DATASEGMENT"ŠMOVE.LD0,UCBTEMP(A6)…SAVESTATUS‰MOVE.L„(A7)+,A6*œRESTOREREGA6&ŠCMP.W‚#'CF',FHSEXT(A6)ƒIMPLIEDCHAIN?ŠBEQ„CHAIN2YES*'*ˆFINDREMAININGLENGTHOFCOMMANDLINE*!ŠBSR„REMLENFINDREMAININGLENGTH2ŠMOVE.BD6,LDRCLL(A3)†LINELENGTHTOLDRPARBLOCK?ŠBEQ.S‚PROC135†REMAININGLENGTHZERO(NONETOMOVETOEVENADR)*)*ˆRELOCATEREMAININGCMDLINETOEVENADR*7‰LEA†SCTINB(A3),A1‰GETSTARTOFINPUTBUFFER(EVENADR)-ŠMOVE.LA1,LDRABUF(A3)…LOADERPARAMETERBLOCK PROC130ƒEQU„*1ŠMOVE.B(A0)+,(A1)+ˆMOVETOSTARTOFINPUTBUFFERŠSUB.L‚#1,D6ŽDECREMENTCOUNTŠBNE„PROC130ŒCONTINUE* *ˆCALLLOADER* PROC135ƒEQU„*ŠBSR„LDRCALLŒCALLTOLOADERŠBEQ„PROC200ŒBRANCHGOODLOAD**ˆFOUNDINUSERVOLUME?*"ŠCMP.B‚#FSTANNM,D0ˆFILENOTFOUND? ŠBEQ.S‚PROC140ŒYES,TRYSYSVOLN$ŠCMP.B‚#FSTAVOL,D0ˆVOLUMENOTFOUND?#ŠBEQ.S‚PROC140ŒGOTRYSYSTEMVOLUMEŠBSR.S‚LODMODEŒTESTMODEŠBRA„PROC135ŒTRYAGAIN*.*ˆNOTFOUNDINUSERVOLUME-TRYSYSTEMVOLUME* PROC140ƒEQU„*‰MOVE.L„UCBREGA6(A3),A0 *œA0=ADDRESS'.ARG'DATASEGMENT.ŠMOVE.LUCBTEMP(A0),D0…REFETCHEDITFILESTATUS*ŠAND.L‚#$700000,D0ˆVOL,USER,ORCATFOUND?ŠBNE„PROC300ŒCOMMANDNOTFOUND/ŠLEA„OFHS+FHSVOL(A3),A0ˆPARAMETERBLOCKADDRESSŠMOVE.L#'„',D0‰FETCHSPACES&ŠMOVE.LD0,(A0)+‹SYSTEMDEFAULTVOLUMEŠCLR.W‚(A0)+ŽUSERZERO0ŠMOVE.LD0,(A0)+‹SYSTEMDEFAULTCATALOG1STPART/ŠMOVE.LD0,(A0)+‹SYSTEMDEFAULTCATALOG2DPART*$*ˆRECALLLOADERTOTRYSYSTEMVOLUME* PROC145ƒEQU„*ŠBSR„LDRCALLŒCALLAGAINŠBEQ„PROC200ŒFOUND"ŠCMP.B‚#FSTANNM,D0ˆFILENOTFOUND?ŠBEQ„PROC300ŒFILENOTFOUND$ŠCMP.B‚#FSTAVOL,D0ˆVOLUMENOTFOUND?ŠBEQ.S‚PROC150ŒVOLUMEERRORMSGŠBSR.S‚LODMODEŒTESTMODEŠBRA< „PROC145ŒTRYAGAIN* LODMODEƒEQU„*ŠBTSTƒ#BTUSBRK,D7ˆBREAK?ŠBEQ.S‚LODMODE1‹NO,CONTINUEŠTST.L‚(A7)+ŽPOPRETURNŠRTSLODMODE1‚EQU„*ŠBTSTƒ#BTBATCH,D7ˆBATCHMODE?ŠBEQ.S‚LODERRBRANCHNOTBATCH:ŠCMP.B‚#RTCDDPRQ,D0‡DUPREQUEST?(NOMEM,TCBNOTRELEASED)ŠBEQ.S‚LODWAITŒYES,JUSTWAIT#ŠCMP.B‚#RTCDNMEM,D0‡LACKOFMEMORY?%ŠBEQ.S‚LODWAITŒYES,WAITTOTRYAGAIN LODERR„EQU„*:ŠADD.L‚#4,A7‹POPRETURNSOFFSTACK(BACKTOCOMMANDINPUT)"ŠCMP.L‚#$20000000,D0†TRAP4ERROR?ŠBCC„STDERROR‹YES,PROCESSCŠADD.L‚#$2C,A0‚ASSUMETRAP3-POINTTOFHSPARAMETERBLOCKSECTION"ŠCMP.L‚#$18000000,D0†TRAP3ERROR?ŠBCC„STDERROR‹YES,PROCESS-ŠMOVE.L#0,A0ŽINHIBITERRORMESSAGEEXPANSION!ŠBRA„STDERROR‹ISSUEERRORMESSAGE LODWAITƒEQU„*&ŠMOVE.LLODRETRY,A0ˆFETCHDELAYLENGTH*ŠADD.B‚#1,UCBLDCNT(A3)„INCREMENTTRYCOUNTŠBNE„DELAYSWAITTOTRYAGAIN$ŠMOVE.L#EETDIAGN,D0‡DIAGNOSTIC(RD))ŠMOVE.L#ABTNOMEM<<16,D3ƒNOMEMORYREASON+ŠBSR„TERMALLŒTERMINATEANYOTHERUSERTASKS ŠMOVE.L#ABORT,D0ŠDIRECTIVETYPEŠMOVE.W#ABTNOMEM,A0‡ABORTCODEŠTRAPƒ#1*ˆ**VOLUMENOTFOUND* PROC150ƒEQU„*ŠLEA„OFHS(A3),A0ŒSETUPPOINTER0ŠMOVE.LSYSDFLT(A3),FHSVOL(A0)FETCHVOLUMENAME(ŠMOVE.L#EM_VOLX,D0ˆVOLUMEERRORMESSAGE-ŠBRA„EMSGCALL‹OUTPUTERRORMESSAGEANDRETURNŠPAGE**ˆCOMPLETEDGOODLOAD* PROC200ƒEQU„*7ŠMOVEM.LUSRTSK(A3),D1-D2†GETTASKNAME,SESSIONLOADED%ŠMOVE.LD1,UCBUTN(A3)†SETTASKLOADED*ŠMOVE.LD2,UCBSESS(A3)…SAVELOADEDSESSION PROC206ƒEQU„*ŠCLR.L‚D6‘CLEARUPPERPART,ŠMOVE.BLDRCLL(A3),D6ŠGETLENGTHFROMLOADER*ŠMOVE.LD6,UCBLEN(A3)†SAVECMDLINELENGTH**ˆ**TESTWHETHERTOSTART*$ŠBTSTƒ#BTUSBRK,D7ˆBREAKDURINGLOAD?ŠBEQ.S‚PROC209ŒNO,PROCEEDŠRTS PROC209ƒEQU„*'ŠBTSTƒ#BTLODGO,D7ˆTESTWHETHERTOSTARTŠBEQ.S‚PROC210ŒYES,START ŠLEA„UCBUTN(A3),A0ŠPOINTTOTASK#ŠMOVE.L#EM_LODED,D0‡LOADEDMESSAGE(ŠCMP.L‚#'0000',D2‰TESTASCIISESSIONNO.ŠBCC.S‚PROC209A‹OK#ŠMOVE.L#EM_LODEB,D0‡BINARYVERSIONPROC209A‚EQU„*ŠBSR„ERRCALLŒOUTPUT#ŠBSETƒ#7,UCBUTN(A3)†SETNOTSTARTEDŠRTS**,*ˆTRANSFEREXISTINGLOGICALUNITASSIGNMENTS* PROC210ƒEQU„*#ŠLEA„OFHS(A3),A0ŒFHSPARBLOCKADDR!ŠMOVE.LD2,FHSSES(A0)†SESSIONNO.(ŠMOVE.W#FHCHLU,FHSCMD(A0)CHANGELUCMD"ŠBCLRƒ#31,D1RESETNOTSTARTEDBIT,ŠMOVE.LD1,FHSTSK(A0)†PUTTASKNAMEINBLOCK*ŠMOVE.LD1,UCBUTN(A3)†BECOMESDEFAULTTASK(ŠMOVE.LUCBLUS(A3),D6ŠFETCHLUNBITMASKŠBTSTƒ#5,D6ŽLUN5ASSIGNED?ŠBEQ.S‚PROC235ŒNO,ERRORŠBTSTƒ#6,D6ŽLUN6ASSIGNED?ŠBEQ.S‚PROC236ŒNO,ERROR*ŠMOVE.LUCBKEEP(A3),D4‰FETCHLUNKEEPMASKŠCLR.L‚D5‘INITIALIZECOUNTER$PROC215ƒBCLRƒD5,D6ŽCLEARBITINMASKŠTST.L‚D6‘TESTDONEŠBEQ.S‚PROC250ŒBRANCHDONE2PROC220ƒADD.L‚#1,D5ŽINCREMENTTONEXTBITPOSITION%ŠBTSTƒD5,D6ŽTESTCURRENTBITPOSITIONŠBEQ„PROC220ŒNO,CONTINUE ŠMOVE.BD5,FHSLUA(A0)†LUNINSCTŠCMP.B‚#5,D5ŽISTHISTHECDF?ŠBNE.S‚PROC225ŒNO,PROCEED!ŠBTSTƒ#BTREAD5,D7ˆCHAINORBATCH?'ŠBNE.S‚PROC225ŒCHAIN/BATCHTRANSFER5/51ŠCLR.B‚FHSLUA(A0)‰TRANSFERINTERACTIVEREAD/WRITE PROC225ƒEQU„*'ŠMOVE.BD5,FHSLUB(A0)†SAMEINUSERTASK4ŠMOVE.W#FOPKEP+FOPSLU,FHSOPT(A0)ASSUMEKEEPOPTIONŠTST.B‚FHSLUA(A0)‰SENDING0?ŠBEQ.S‚PROC230ŒKEEP!ŠBTSTƒD5,D4ŽKEEP?&ŠBNE.S‚PROC230ŒYES,ASSUMPTIONCORRECT-ŠMOVE.W#FOPSLU,FHSOPT(A0)ALLOTHERSNOKEEP PROC230ƒEQU„*ŠTRAPƒ#3‘GOCHANGEITŠBEQ„PROC215ŒGOOD,CONTINUEŠBSR„STDERROR‹REPORTERRORŠMOVE.LD0,D3ŽSETABORTCODEŠSWAPƒD31ŠBRA„TERM5ŽTERMINATETASKTHATCANNOTBESTARTED**ˆ**LUN5AND/OR6MISSING* PROC235ƒEQU„*ŠMOVE.B#'5',OFHS(A3)†LUNNO.5 ŠBRA.S‚PROC240ŒCOMMONPROCESSING PROC236ƒEQU„*ŠMOVE.B#'6',OFHS(A3)†LUNNO.6 PROC240ƒEQU„*$ŠLEA„OFHS(A3),A0ŒPOINTTOERRORTEXT(ŠMOVE.L#EM_LUNER,D0‡BASICERRORMESSAGEŠBRA„STDERROR‹ERROREXIT**ˆ**STARTUSERTASK* PROC250ƒEQU„*!ŠMOVE.L#GTDTIM,D0‰DIRECTIVETYPEŠLEA„UCBTUT(A3),A0ŠPUTADDRESSŠTRAPƒ#1$ŠBTSTƒ#BTREAD5,D7ˆCHAIN(BATCH)MODE?ŠBEQ.S‚PROC252ŒNO,SKIP2ŠAND.W‚#$7000,UCBREGD(A3)RESETABORT,ERRORCOUNT PROC252ƒEQU„*&ŠLEA„STRUTN(A3< ),A0ŠPARAMETERBLOCKADR9ŠMOVEM.LD1-D2,(A0)ˆTASKNAME,SESSIONTOSTARTPARBLOCKŠMOVE.L#START,D0ŠTRAPTYPE)ŠBSR„PARTRAP1‹FIXEDPARMETERBLOCKTRAP1ŠBNE.S‚PROC299ŒERRORRETURN"ŠMOVE.LUCBLUS(A3),D6ŠGETBITMASK&ŠMOVE.LUCBKEEP(A3),D4‰FETCHKEEPMASK&ŠBSETƒ#0,D4ŽFORCEINTERACTIVETERMINAL'ŠAND.L‚D4,D6ŽRESETONETIMEASSIGNMENTSŠMOVE.LD6,UCBLUS(A3)†SAVE2PROC255ƒBTSTƒ#BTATSIGN,D7‡TESTRETURNTOCMDINPUTŠBNE.S‚PROC299 PROC260ƒEQU„*!ŠMOVE.L#WTEVNT,D0‰DIRECTIVETYPEŠTRAPƒ#1*œWAITFORANEVENT‰TST.L…UCBUTN(A3)‰BEQ.S…PROC270*œANEVENTOCCURRED *¦BRANCHIFTHEEVENTWASFORME‰BTST†#BTUSBRK,D7‰BEQ.S…PROC260*œJMPIFNOTABREAKEVENTPROC270: ‰TST.L…D0$*œESTABLISHRETURNSTATUSFORANYONE*œWHOISSEEKINGIT PROC299ƒRTS‰PAGE**ˆ**COMMANDNOTFOUND*** PROC300ƒEQU„*2ŠLEA„OFHS+FHSFIL(A3),A0…ADDRESSOFPARAMETERBLOCK3ŠMOVE.L#EM_CMDX,D0ˆBASICCOMMANDNOTFOUNDMESSAGEŠBRA„EMSGCALL‹OUTPUTMESSAGE* PROC320ƒEQU„*)ŠMOVE.L#EM_CMDER,D0‡SYNTAXERRORMESSAGEŠBRA„EMSGCALL‹OUTPUTMESSAGEBLANKOUT‚DC.Bƒ$D8,0,0LMARGINƒDC.Bƒ'',0CHANABRT‚DC.Bƒ'CHAINABORTED',0ŠDC.Bƒ7’(BELL)ABPROMPT‚DC.Bƒ'(CHAIN)=',0ŠDC.Bƒ$AŠDC.Bƒ7’(BELL)PROMPT„DC.Bƒ$D,'=',0ŠDS…03IDSY†DC.Bƒ'ENTERDEFAULTSYSTEMVOLUME:USERNO.=',0LOGB†DC.Bƒ'ENTERUSERNO.=',0ŠPAGEH*************************************************************************ˆ**TRAP1SUPPORTROUTINESH************************************************************************;BCTRAP1ƒMOVEM.LUCBBNAM(A3),D1-D2…GETBCTPNAM&SESSIONNO.3STDTRAP1‚LEA„OFHS+24(A3),A0‰PARAMETERBLOCKADDRESS#ŠMOVEM.LD1-D6,-(A0)‡PUTPARAMETERSPARTRAP1‚EQU„*ŠTRAPƒ#1‘EXECUTETRAP"ŠBNE„STDERROR‹OUTPUTERRORMESSAGEŠRTSŠPAGEH*************************************************************************ˆ**TRAP2SUPPORTROUTINESH************************************************************************!*ˆ**READNEXTCOMMANDINPUTLINEH************************************************************************READLINE‚EQU„*0ŠLEA„CLASCODE,A4ˆINITIALIZEVALIDATIONTABLEADR!ŠBTSTƒ#BTREAD5,D7ˆTESTLUN5OR0ŠBEQ.S‚ICALLŽBRANCHDEVICE(ŠMOVEM.LSTDIO+8,D3-D5…COMMONPARAMETERS ‰BSR‡X10000)*œADJUSTOFFSETSTOADDRESSESIND3,D4,D5&ŠMOVE.L#PCIO,D1‹CODE,FUNCTION,OPTIONS(ŠMOVE.L#PCLU,D2‹STATUS,LUN,RESERVED(0)#ŠBCLRƒ#BTREREAD,D7‡CURRENTORNEXT?ŠBEQ.S‚READCALL‹NEXT+ŠOR.Wƒ#IOPCUR,D1‰READCURRENTRECORDOPTION"ŠBRA.S‚READCALL‹COMMONCALLTOI/O ICALL…EQU„*‰MOVE.L„UCBREGA6(A3),A5 *œA5=ADDRESS'.ARG'DATASEGMENT=ŠBTSTƒ#BTBELL&7,(SHAREOPT+1-(BTBELL/8))(A5)RINGBELLOPTION?ŠBEQ.S‚ICALL1NOŠSUB.L‚#1,A6ŽINCLUDEBELL ICALL1„EQU„*"ŠMOVE.B#$80,D5ŒMESSAGETERMINATOR'ŠLEA„SCTINB(A3),A5ŠSTARTOFBUFFERADDR%ŠBSR„BUILDMSG‹GENERATEOUTPUTMESSAGE'ŠMOVEM.LSTDIO,D1-D6‡GETI/OPARAMETERS ‰BSR‡X10000)*œADJUSTOFFSETSTOADDRESSESIND3,D4,D5 ŠMOVE.LA5,D5ŽENDBUFFERADDRESSREADCALL‚BSR„STDTRAP2‹I/OCALLŠBEQ.S‚READCAL1‹OK#ŠCMP.B‚#ISTAIF,D0‰INVALIDFUNCTION?ŠBNE„STDERROR‹NO,ERRORPROCESS5ŠBCLRƒ#5,OFHS+2(A3)†READCURRENT(BEGINNINGOFFILE?)&ŠBEQ„EMSGCALL‹NO,OUTPUTERRORMESSAGE#ŠBSR„STETRAP2‹GOBACKANDREADNEXTREADCAL1‚EQU„*ŠBTSTƒ#BTEOF,D7ŠEOF?ŠBNE„READEXIT‹YES,OK-EXIT%ŠMOVE.LD0,-(A7)‹PUSHSTATUSONSTACK ŠMOVE.LIOSLEN(A0),D6†GETLENGTH1ŠLEA„SCTINB(A3),A0ŠGETADDRESSOFSTARTOFBUFFER ŠLEA„0(A0,D6),A1ˆENDOFCMDLINE ŠMOVE.B#$D,(A1)+ŠPUTTERMINATOR%ŠMOVE.B#$A,(A1)+ŠLINEFEEDFOLLOWING,ŠLEA„SCTINBE+1(A3),A0ƒALLOWFORPREDECREMENTŠADD.L‚#1,D6ŽADJUSTCOUNT READRELƒEQU„*$ŠMOVE.B-(A1),-(A0)ˆMOVEENDOFLINEŠDBRAƒD6,READREL‰CONTINUE(ŠLEA„SCTINB(A3),A5ŠGETREADYTOPUTBACK+ŠCLR.L‚D1‘INITIALIZEUPPERPARTOFREGISTERSUBST…MOVE.B(A0)+,D1‹GETCHARŠCMP.B‚#$61,D1ŒLOWERCASE?ŠBCS.S‚SUBST0NO"ŠCMP.B‚#$7B,D1ŒSPECIALCHARACTERS?ŠBCC.S‚SUBST0YES‰MOVE.L„A6,-(A7)‰MOVE.L„UCBREGA6(A3),A6 *œSAVEREGA6 *œA6=ADDRESS'.ARG'DATASEGMENTDŠBTSTƒ#BTNOLOHI&7,(SHAREOPT+1-(BTNOLOHI/8))(A6)INHIBITTRANSLATION?#ŠB= NE.S‚SUBST00ŒYES,DON'TTRANSLATEŠSUB.B‚#$20,D1ŒFORCEUPPERCASESUBST00:‰MOVE.L„(A7)+,A6*œRESTOREREGA6 SUBST0„EQU„*ŠCMP.B‚#'=',D1Œ"="?ŠBNE.S‚SUBST1NO,PROCEED4ŠCMP.B‚#'/',(A0)ŠFOLLOWEDBY"/"(CHAINCONDITIONAL)ŠBNE.S‚SUBST1NO,PROCEED&ŠBSETƒ#BTSLASH,D7ˆSETCONDITIONALFLAG SUBST1„EQU„*$ŠCMP.B‚#'\',D1ŒSUBSTITUTEFOLLOWING?ŠBEQ.S‚SUBSTUTE‹YESSUBST2„CMP.L‚A5,A0ŽROOM?ŠBLS„SUBSOVFL‹ERROR-OVERFLOWŠMOVE.BD1,(A5)+‹PUTCHARŠCMP.B‚#$D,D1ENDOFLINE?ŠBNE„SUBSTŽCONTINUEŠMOVE.B(A0),(A5)ŠMOVETHELF ŠMOVE.LA5,UCBCMDND(A3)„SAVEENDŠMOVE.LA5,D6ŽGETENDADDR$ŠLEA„SCTINB(A3),A0ŠSETUPSTARTADDR"ŠSUB.L‚A0,D6ŽEXPANDEDINPUTLENGTH#ŠMOVE.LD6,UCBCMDLG(A3)„SAVELENGTH+ŠMOVE.L(A7)+,D0‹POPSAVEDSTATUSOFFSTACKŠTST.B‚D0‘RETESTSTATUS READEXIT‚RTS2STDIO…DC.LƒPIIO,PILU,SCTINB,SCTINB,SCTINBE,SCTINBL(PIIO†EQU„IOOWIN<<16+IOPIMG+IOPBRK+IOPUNPPILU†EQU„SCTLUN<<16PCIO†EQU„IOREAD<<16PCLU†EQU„CDFLUN<<16PLIO†EQU„IOWRIT<<16PLLU†EQU„LDFLUN<<16ŠPAGEH*************************************************************************ˆ**ARGUMENTSUBSTITUTIONH************************************************************************SUBSTUTE‚EQU„*#ŠMOVE.LA0,A6ŽSAVESTARTINGADDRESS%ŠMOVE.B(A0),D1ŒFETCHFIRSTCHARACTERŠCMP.B‚#'(',D1ŒINDIRECTRX?–++(ŠBEQ.S‚SUBSINDR‹YES,INDIRECTTHRURX++&ŠMOVE.B0(A4,D1),D2ˆGETITSCLASSCODEŠBTSTƒ#0,D2ŽDECIMALDIGIT?ŠBNE.S‚SUBSTUT0‹BRANCHYES**ˆ**SEARCHFORTAG*6ŠBCLRƒ#BTSUBPOS,D7‡RESETPOSITIONALSUBSTITUTION(TAG)‰MOVE.L„UCBREGA6(A3),A0 *œA0=ADDRESS'.ARG'DATASEGMENT+ŠLEA„CHAINBUF(A0),A2ˆSTARTOFARGUMENTLISTSUBFIND1‚EQU„*$ŠMOVE.LA6,A0ŽREFETCHSTARTINGPOINTSUBFIND2‚EQU„*)ŠMOVE.B(A2)+,D1‹FETCHARGUMENTCHARACTER'ŠBEQ„SUBFIND1‹BRANCHENDOFANARGUMENT#ŠCMP.B‚#$D,D1ENDOFARGUMENTLIST?ŠBEQ„SUBSTERR‹YES,ERROR$ŠCMP.B‚#'=',D1ŒENDOFARGUMENTNAME?ŠBEQ.S‚SUBFIND4‹YES+ŠCMP.B‚(A0)+,D1‹INPUT=ARGUMENTCHARACTER?$ŠBEQ„SUBFIND2‹YES,CONTINUEMATCHINGSUBFIND3‚EQU„*'ŠTST.B‚(A2)+ŽADVANCETOENDOFARGUMENT(ŠBNE„SUBFIND3‹BRANCHNOTENDOFARGUMENTŠBRA„SUBFIND1‹TRYAGAINSUBFIND4‚EQU„*(ŠCMP.B‚#'=',(A0)+‰DIDINPUTCONTAIN"="?#ŠBEQ.S‚SUBSTUT1‹YES,ARGUMENTFOUND"ŠBRA„SUBFIND3‹NO,CONTINUELOOKING*Å++*ˆ**INDIRECTTHROUGHRX§++*Å++SUBSINDR‚EQU„*´++&ŠCMP.B‚#'R',1(A0)‰VERIFYPSEUDOREG‘++ŠBNE„SUBSTERR‹NO,ERROR™++ŠCMP.B‚#'X',2(A0)‰VERIFYRX™++ŠBNE.S‚SUBSTERR‹NO,ERROR™++'ŠCMP.B‚#')',3(A0)‰VERIFYCLOSEPAREN++ŠBNE.S‚SUBSTERR‹NO,ERROR™++ŠADD.L‚#4,A0ŽUPDATEPOINTER”++)ŠBSETƒ#BTSUBPOS,D7‡SETPOSITIONALTYPE++,ŠMOVE.WUCBREGX(A3),D0…FETCHPSEUDOREGX++ŠBEQ.S‚SUBSTERR‹ZEROILLEGAL–++ŠBRA.S‚SUBSTUTA‹CONTINUEš++**ˆ**GETPOSITIONALNUMBER*SUBSTUT0‚EQU„*3ŠBSETƒ#BTSUBPOS,D7‡SETPOSITIONALSUBSTITUTIONFLAG ŠBSR„CVT2CONVERTCHARTOBINARYŠTST„D0‘TESTZEROSUBSTUTA‚EQU„*´++'ŠBEQ.S‚SUBNOARG‹NO.ARGUMENTSREQUEST+)*‰LEA„CHPOSNUM(A3),A2ˆTABLEOFINCREMENTS‰MOVE.L„UCBREGA6(A3),A2*œA2=ADDR'.ARG'DATASEGMENT8ŠCMP.B‚(A2),D0ŒCOMPAREMAXNOENTRIESTOREQUESTEDENTRY%ŠBGT.S‚SUBSTERR‹PARAMETERNO.TOOBIG!ŠMOVE.B0(A2,D0),D0ˆGETINCREMENT-ŠLEA„$50(A2,D0),A2†FETCHSUBSTITUTIONADDRESSSUBSTUT1‚EQU„*'ŠBSETƒ#BTSUBSTU,D7‡SETSUBSTITUTEDFLAG ŠTST.B‚(A2)ENDOFSUBSTITUTION?#ŠBEQ„SUBSTŽYES,ENDOFSUBSTITUTIONŠCMP.L‚A5,A0ŽROOM? ŠBLS.S‚SUBSOVFL‹ERROR-OVERFLOWŠMOVE.B(A2)+,(A5)+ˆMOVECHARŠBRA„SUBSTUT1‹CONTINUESUBNOARG‚EQU„*´+‰MOVE.L„A2,-(A7)‰MOVE.L„UCBREGA6(A3),A2 *œSAVEREGA2 *œA2=ADDRESS'.ARG'DATASEGMENT+ŠMOVE.BCHPOSNUM(A2),D0ˆGETNO.ARGUMENTS‘+‰MOVE.L„(A7)+,A2*œRESTOREREGA2ŠDIVUƒ#10,D0GETTENS,UNITS“+ŠBSR.S‚SUBSPUTŒPUTTENSš+ŠSWAPƒD0‘MOVEUNITS˜+ŠBSR.S‚SUBSPUTŒPUTUNITS™+(ŠBSETƒ#BTSUBSTU,D7‡SETSUBSITUTEDFLAG+ŠBRA„SUBSTŽCONTINUEš+SUBSPUTƒEQU„*´+ŠCMP.L‚A5,A0ŽROOM?+ŠBLS.S‚SUBSPUTE‹NOROOMERROR•+ŠOR.Bƒ#'0',D0ŒFORCEDIGIT—+ŠMOVE.BD0,(A5)+‹TOBUFFER™+ŠRTS¹+SUBSPUTE‚EQU„*´+ŠMOVE.L(A7)+,D0‹POPRETURN˜+SUBSOVFL‚EQU„*%ŠMOV= E.L(A7)+,D0‹POPSTATUSOFFSTACK#ŠMOVE.L#EM_SCBO,D0ˆBUFFEROVERFLOWŠBRA.S‚STDERROR‹ERROREXITSUBSTERR‚EQU„*$ŠMOVE.LA6,A0ŽREFETCHSTARTINGPOINT8ŠBTSTƒ#BTSLASH,D7ˆINHIBITERRORMESSAGESONCONDITIONAL?&ŠBNE.S‚SUBSKIPŒSKIPTOENDOFARGUMENTŠSUB.L‚#1,A0ŽBACKUPTO"/"ŠMOVE.B(A0)+,D1‹FETCHSLASH.ŠBSETƒ#BTSUBSER,D7‡SETSUBSTITUTIONERRORFLAG)ŠBRA„SUBST2RETURNTOCOPYERRORARGUMENT SUBSKIPƒEQU„*ŠMOVE.B#NOSUB,(A5)+‡EMPTYFLAG:ŠBCLRƒ#BTSUBPOS,D7‡RESET/TESTPOSITIONALSUBSTITUTIONFLAGSUBSKIP1‚EQU„*#ŠMOVE.B(A0)+,D1‹GETNEXTCHARACTER$ŠCMP.B‚#'\',D1ŒANOTHERSUBSTITUTION?ŠBEQ„SUBSTUTE‹GOTRYITŠCMP.B‚#'=',D1ŒENDOFARGUMENT?ŠBEQ„SUBSTŽYES,RETURNŠCMP.B‚#'!',D1ŒENDOFTERM?ŠBEQ„SUBST2YESŠCMP.B‚#'&',D1ŒENDOFTERM?ŠBEQ„SUBST2YES"ŠMOVE.B0(A4,D1),D2ˆGETCLASSCODEŠBMI„SUBST2RETURNŠBRA„SUBSKIP1‹CONTINUEŠPAGEH************************************************************************4*ˆ**BUILDSTANDARDERRORMESSAGEWITHTYPEANDCODEH************************************************************************STDERROR‚EQU„*!ŠBTSTƒ#BTMSGI,D7‰MESSAGEINHIBIT?ŠBNE.S‚STDERROX‹YES,EXITŠBTSTƒ#BTUSBRK,D7ˆBREAK?"ŠBNE.S‚STDERROX‹SKIPERRORMESSAGEŠCMP.B‚#ISTATO,D0‰TIMEOUT?&ŠBEQ.S‚STDERROX‹YESSKIPERRORMESSAGEŠBTSTƒ#BTEOF,D7ŠEOF?"ŠBNE.S‚STDERROX‹SKIPERRORMESSAGE1ŠBSR.S‚ECHOEŽECHOINPUTIFNOTPREVIOUSLYPRINTEDŠBRA.S‚EMSGCAL1STDERROX‚EQU„*ŠTST.B‚D0‘RETESTSTATUSŠRTSH*************************************************************************ˆ**ECHOINPUTTOLDFH************************************************************************ ECHOS…EQU„*‰MOVE.L„A6,-(A7)‰MOVE.L„UCBREGA6(A3),A6 *œSAVEREGA6 *œA6=ADDRESS'.ARG'DATASEGMENT<ŠBTSTƒ#BTNOECHO&7,(SHAREOPT+1-(BTNOECHO/8))(A6)TESTNOECHOŠBEQ.S‚ECHOEXECHO‰MOVE.L„(A7)+,A6*œRESTOREREGA6 ‰BRA.S…ECHOSXECHOEX:‰MOVE.L„(A7)+,A6*œRESTOREREGA6'ECHOE…BTSTƒ#BTECHO,D7‰WASINPUTECHOED?ŠBNE.S‚ECHOSXYES6ŠBTSTƒ#BTREAD5,D7ˆWASINPUTFROMINTERACTIVETERMINAL?ŠBNE.S‚ECHOTŽNODISPLAYIT&ŠBTSTƒ#BTSUBSER,D7‡SUBSTITUTIONERROR?ŠBNE.S‚ECHOTŽYES,ECHOŠBTSTƒ#BTSUBSTU,D7‡SUBSITUTION?$ŠBEQ.S‚ECHOSXNO,NONEEDTODISPLAY ECHOT…EQU„*$ŠMOVEM.LD0-D6/A0-A5,-(A7)SAVEREGSŠSUB.L‚#2,A5ŽADJUSTFORCR,LFŠBSR„WRITEINB‹OUTPUTBUFFER'ŠMOVEM.L(A7)+,D0-D6/A0-A5RESTOREREGSŠBSETƒ#BTECHO,D7‰SETECHOEDNOW ECHOSX„EQU„*ŠRTSH************************************************************************9*ˆ**BUILDMESSAGE,PUTINSERTSINMESSAGE,OUTPUTTOLDFH************************************************************************EMSGCALL‚EQU„*%ŠBTSTƒ#BTMSGI,D7‰TESTMESSAGEINHIBITŠBNE.S‚STDRTNYES,RETURNEMSGCAL1‚EQU„*3ŠBSETƒ#BTCHNABT,D7‡SETFLAGTOABORTCHAINORBATCH ŠBRA„ERRCALL MSGCALLƒEQU„*'ŠLEA„SCTEXB(A3),A5†STARTOFBUFFERADDR%ŠCLR.L‚D5‘SETCR,LFASMSGTERMINATOR ŠBSR.S‚BUILDMSG‹GENERATEMESSAGEH************************************************************************#*ˆ**WRITEMESSAGEINBUFFERTOLDFH************************************************************************‰LEA‡SCTEXB(A3),A0‰MOVE.L„A0,D4‰BUFFERADDRESSWRITELIN‚EQU„*&ŠMOVE.L#PLIO,D1‹CODE,FUNCTION,OPTIONS(ŠMOVE.L#PLLU,D2‹STATUS,LUN,RESERVED(0) ŠMOVE.LA5,D5ŽBUFFERENDADDRESS-ŠBTSTƒ#LDFLUN,UCBLUS+3(A3)‚ISLUN6ASSIGNED?ŠBNE.S‚STDTRAP2‹YES,OKŠCLR.L‚D2‘SETLUN=0H************************************************************************1*ˆ**STANDARDTRAP2USINGCOMMONPARAMETERBLOCKH************************************************************************3STDTRAP2‚LEA„OFHS+24(A3),A0‰PARAMETERBLOCKADDRESS#ŠMOVEM.LD1-D6,-(A0)‡PUTPARAMETERSSTETRAP2‚TRAPƒ#2ŠBEQ.S‚STDRTNGOOD,EXITŠCMP.B‚#ISTANR,D0‰NOTREADY?ŠBNE.S‚STDTRBP2‹NO,CONTINUE%ŠTST.L‚UCBTUT(A3)‰TESTLOGONCOMPLETE!ŠBMI„BYEBYENO,TERMINATESESSIONSTDTRBP2‚EQU„*)ŠCMP.B‚#ISTABRK,D0ˆTESTBREAKTERMINATIONŠBNE.S‚STDTRAQ2‹NO,GOEXIT%*œJMPIFOTHERTHANBREAKTERMINATION‰TST.L…UCBTUT(A3) ‰BMI‡BYEBYE *œJUMPIF*¦BREAKTERMINATION*žBEFORE*¦LOGONCOMPLETED>  ŠBSETƒ#BTUSBRK,D7ˆSETBREAKFLAGŠBTSTƒ#BTREAD5,D7ˆCHAINMODE?ŠBEQ.S‚STDTRAT2‹NO,EXIT'ŠBSETƒ#BTCHNABT,D7‡YES,SETCHAINABORTŠBRA.S‚STDTRAT2‹EXITSTDTRAQ2‚EQU„*ŠCMP.B‚#ISTAEOF,D0ˆENDOFFILE?ŠBNE.S‚STDTRAT2‹NO,EXITŠBSETƒ#BTEOF,D7ŠSETEOFFLAGSTDTRAT2‚TST.B‚D0‘RETESTSTATUS STDRTN„RTSŠPAGEH*************************************************************************ˆ**WRITEINPUTBUFFERH************************************************************************BUILDINB‚EQU„*'ŠLEA„SCTINB(A3),A5ŠINPUTBUFFERADDRESS!ŠCLR.L‚D5‘ENDMESSAGEWITHRETURNŠBSR.S‚BUILDMSG‹BUILDMESSAGEWRITEINB‚EQU„*‰LEA‡SCTINB(A3),A0"ŠMOVE.LA0,D4ŽINPUTBUFFERADDRESS"ŠBRA„WRITELIN‹FORMATTEDWRITELINE*ŠPAGE@*****************************************************************‚SUBROUTINETOBUILDMESSAGES*…CALLINGSEQUENCE:*ˆLEA,A5#*ˆLEA,A6(*ˆMOVE.BCR,LF),D5*ˆBSRBUILDMSG*E*********************************************************************+BUILDMSG‚MOVE.LA5,A0ŽSAVESTARTINGADDRESSŠMOVE.LD0,-(A7)‹SAVED0)BUILDMS1‚MOVE.B(A6)+,(A5)+ˆGETNEXTCHAR'ŠBNE„BUILDMS1‹BRANCHNOTENDOFMESSAGE5ŠMOVE.BD5,-(A5)‹SUBSTITUTETERMINATINGCHARFORNULL*ŠBGT.S‚BUILDENX‹BRANCHTERMINATINGCHAROKŠSUB.L‚#1,A5ŽBACKUP#BUILDENX‚MOVE.L(A7)+,D0‹RESTORED0ŠRTSH************************************************************************4*ˆ**SUBROUTINETOLOADD2WITHPRINTABLECHARACTERSH************************************************************************GETNOSPA‚EQU„*!ŠCMP.B‚#'',(A0)ŠISCHARASPACE?ŠBLE.S‚GETNOSPX‹YES,EXIT ŠROL.L‚#8,D2ŽMAKEROOMTOINSERTŠMOVE.B(A0)+,D2‹GETCHAR GETNOSPX‚RTSH************************************************************************8*ˆ**SUBROUTINETOFETCHFOURPRINTABLECHARACTERSIND2H************************************************************************EDITSPAC‚EQU„*ŠCLR.L‚D2‘CLEARACCUMULATOR+EDITSESS‚BSR„GETNOSPA‹GETCHARIFNOTSPACEŠBSR„GETNOSPA‹"ŠBSR„GETNOSPA‹"ŠBRA„GETNOSPA‹"(ANDRETURN)H************************************************************************4*ˆ**SUBROUTINETOLEFTJUSTIFYPRINTABLECHARIND2H************************************************************************&GETLJSFY‚ROL.L‚#8,D2ŽMOVETOMAKEROOMŠCMP.B‚#'',(A0)ŠSPACEORCR?ŠBLE.S‚GETLJSFX‹YES,EXITŠMOVE.B(A0)+,D2‹TRANSFERCHAR GETLJSFX‚RTSH************************************************************************$*ˆ**GET4CHARACTERSLEFTJUSTIFIEDH************************************************************************GETLEFT4‚EQU„*ŠMOVE.L#'„',D2‰INITIALIZE#ŠBSR„GETLJSFY‹GETCHARIFNOTSPACE#ŠBSR„GETLJSFY‹GETCHARIFNOTSPACE#ŠBSR„GETLJSFY‹GETCHARIFNOTSPACE#ŠBRA„GETLJSFY‹GETCHARIFNOTSPACE*ŠPAGEH*************************************************************************ˆ**TRAP3SUPPORTROUTINESH************************************************************************9*ˆ**ASSIGNFILE/DEVICETOLUNANDSETBITIND7BITMASKH************************************************************************FHOPNTID‚EQU„*2ŠMOVE.LUCBTID(A3),OFHS+FHSVOL(A3)…GETTERMINALID FHOPEN„EQU„*(ŠMOVEM.W(A1)+,D1-D3‡GETCMD,OPTIONS,LUNFHEXOPEN‚BSR.S‚STDTRAP3ŠBNE„EMSGCALL‹ABORTIFBAD%ŠMOVE.LUCBLUS(A3),D4ŠGETLUNBITMAP!ŠBSETƒD3,D4ŽSETCORRESPONDINGBIT%FHOPENCƒMOVE.LD4,UCBLUS(A3)†PUTBACKŠTST.B‚D0‘TESTSTATUSŠRTS*H************************************************************************+*ˆ**CLOSELUNANDRESETBITIND7BITMASKH************************************************************************ FHCLOSEƒEQU„*(ŠMOVEM.W(A1)+,D1-D3‡GETCMD,OPTIONS,LUN%FHEXCLOS‚BSR.S‚STDTRAP3‹CLOSECOMMANDŠBNE„EMSGCALL‹ABORTIFBAD&ŠMOVE.LUCBKEEP(A3),D4‰FETCHKEEPMASK#ŠBCLRƒD3,D4ŽRESETCORRESPONDINGBIT$ŠMOVE.LD4,UCBKEEP(A3)…PUTBACKMASK%ŠMOVE.LUCBLUS(A3),D4ŠGETLUNBITMAP#ŠBCLRƒD3,D4ŽRESETCORRESPONDINGBITŠBRA„FHOPENCŒCOMMONEXIT*H******> ******************************************************************1*ˆ**STANDARDTRAP3USINGCOMMONPARAMETERBLOCKH************************************************************************2STDTRAP3‚LEA„OFHS+6(A3),A0†PARAMETERBLOCKADDRESS#ŠMOVEM.WD1-D3,-(A0)‡PUTPARAMETERS"ŠCLR.W‚30(A0)CLEARRESERVEDSPACEŠTRAPƒ#3ŠRTSŠPAGEH*************************************************************************ˆ**TRAP4SUPPORTROUTINESH*************************************************************************ˆ**LOADERCALLH************************************************************************ LDRCALLƒEQU„*%ŠMOVE.LUCBSNO(A3),D0ŠCURRENTSESSION*ŠMOVEM.LSTRUOPT(A3),D1-D3…OPTION,MONITOR%ŠBCLRƒ#29,D1RESETREGISTERSSUPPLIEDŠCLR.L‚D4‘SETATTRIBUTES‰MOVE.L„UCBREGA6(A3),A0 *œA0=ADDRESS'.ARG'DATASEGMENT/…BTST#BTABTDMP&7,(SHAREOPT+1-(BTABTDMP/8))(A0)#*­ABORTDUMPREQUESTED?[OPTION'I'ŠBEQ.S‚LDRCAL0ŒNO%ŠBSETƒ#28,D4SETABORTDUMPREQUESTED LDRCAL0ƒEQU„*-ŠMOVE.WUCBPRILI,D3ˆASSUMEONLINEPRIORITIESŠBTSTƒ#BTBATCH,D7ˆBATCH?ŠBEQ.S‚LDRCAL1ŒNO*ŠMOVE.WUCBPRIBT,D3ˆFETCHBATCHPRIORITIESŠBRA.S‚LDRCAL2ŒCONTINUE LDRCAL1ƒEQU„*ŠBTSTƒ#BTREAD5,D7ˆCHAINMODE?!ŠBEQ.S‚LDRCAL2ŒASSUMPTIONCORRECT-ŠMOVE.WUCBPRICH,D3ˆUSECHAINMODEPRIORITIES LDRCAL2ƒEQU„*%ŠMOVE.LUSERNO(A3),D5ŠGETUSERNUMBER"ŠLEA„LDRLDO(A3),A0ŠGETPUTADDRESS(ŠMOVEM.LD0-D5,-(A0)‡PUTPARAMETERBLOCK(ŠMOVE.W#$603E,LDRLDO(A3)‚LOADEROPTIONS)ŠMOVE.L#LDRDIR,D0‰SERVERFUNCTIONNUMBER'ŠLEA„UTTCBP(A3),A0ŠPARAMETERBLOCKADDR!ŠCLR.W‚74(A0)CLEARRESERVEDWORDŠTRAPƒ#4ŠRTSH*************************************************************************ˆ**ERRORMESAGECALLH************************************************************************ ERRCALLƒEQU„*'ŠMOVEM.LD0/A0,SCTEXB(A3)‚SAVEPOINTERS ŠMOVE.L‚#2,D0‰LEA‡SCTEXB(A3),A0*œSETRESPECTIVELY*œD0=DIRECTIVE$*œA0=MESSAGEPARAMETERBLOCKADDRESS0ŠMOVE.L#(LDFLUN<<16+CDFLUN),8(A0)LOGICALUNITS%ŠBTSTƒ#6,UCBLUS+3(A3)„LUN6ASSIGNED?ŠBNE.S‚ERRCALLS‹YES,PROCEEDŠCLR.L‚8(A0)ŽUSELUN0ERRCALLS‚EQU„*ŠTRAPƒ#4&ŠMOVEM.LSCTEXB(A3),D0/A0†RESTOREREGS ŠTST.L‚D0ŠRTSŠPAGEH************************************************************************ *ˆ**GENERALSUPPORTSUBROUTINESH************************************************************************5*ˆ**SUPPORTSUBROUTINETOPUTDATE/TIMEINREGISTERS*TOMESSAGEBUFFER;*ˆREQUIRESPUTADDRESSINA0WHICHISINCREMENTEDONRETURN#*ˆREQUIRESSEPARATORCHARATERIND5 *ˆPUTSSPACEFOLLOWING3RDGROUP*H************************************************************************ŠBSR.S‚PUTHHORMMŠSWAPƒD0‘GETOTHERHALFŠBSR.S‚PUTMMORDD ŠMOVE.B#'',D5ŒSPACETERMINATORŠMOVE.LD1,D0ŽGET3RDPARTŠBSR.S‚PUTSSORYYŠRTSPUT‡ROL.W‚#8,D0ŽGETMSCHARŠMOVE.BD0,(A0)+‹TOBUFFERŠROL.W‚#8,D0ŽGETLSCHARŠMOVE.BD0,(A0)+‹TOBUFFER$ŠMOVE.BD5,(A0)+‹SEPARATORTOBUFFERŠRTSH************************************************************************4*ˆ**SUBROUTINETOFINDREMAININGLENGTHOFCMDLINEH************************************************************************ REMLEN„EQU„*ŠCMP.B‚#$D,D1RETURN?ŠBNE.S‚REMLEN0ŒNOŠSUB.L‚#1,A0ŽBACKUPŠCLR.L‚D6‘ZEROLENGTHŠBRA.S‚REMLEN3ŒEXIT REMLEN0ƒEQU„*"ŠMOVE.B0(A4,D1),D2ˆGETCLASSCODE/ŠBMI.S‚REMLEN2ŒFIELDTERMINATOROFINPUTSTRING%REMLEN1ƒMOVE.B(A0)+,D1‹GETNEXTCHARŠBRA„REMLENCONTINUE*REMLEN2ƒCMP.B‚#'',(A0)ŠNEXTCHAR=SPACE?$ŠBEQ„REMLEN1ŒYES,CONTINUEADVANCING!ŠMOVE.LUCBCMDND(A3),D6ˆGETEND+1ŠSUB.L‚A0,D6ŽGETDIFFERENCE REMLEN3ƒEQU„*2ŠMOVE.LD6,UCBCMDLG(A3)„SAVEFORINITIALUSERREGS/ŠMOVE.LA0,UCBCMDST(A3)„SAVENEWSTARTINGPOINTŠRTSK****************************************************************************ˆ**INCREMENTPASTSPACESK***************************************************************************INCPOINT‚ADD.L‚#1,A0ŽINCREMENTSKIPSPAC‚EQU„*ŠCMP.B‚#'',(A0)ŠSPACE?ŠBEQ„INCPOINT‹YES,INCREMENTŠRTS*ŠPAGEO************************? *******************************************************;*ˆ**ASSIGNFILEIFPOSSIBLE-NOTANERRORIFNOTPOSSIBLEO**********************************************************************************ˆVERSACOMPUTERREQUIREMENT*&*’A6=SCTDATASEGMENTADDRESSONINPUT*'*’A3=SCTDATASEGMENTADDRESSONOUTPUT**’D1=OPTIONSFORTHEREQUEST*ASGNFILE‚EQU„* ‰MOVE.L„D1,D2*œD2=USER'SREQUSTEDOPTIONS‰MOVE.L„A6,-(A7)*œA6=SCTDATASEGMENTADDRESS,ŠMOVE.LSYSDFLT(A6),D1‰SYSTEMDEFAULTVOLUME(ŠLEA„OFHS(A6),A0ŒPARAMETERBLOCKADDRESSŠMOVE.LA0,A6ŽSAVESTART$ŠMOVE.W#FHASGN,(A6)+†ASSIGNCOMMANDL**************************************************************************** *‰MOVE.W#FOPPRPW,(A6)+…OPTION¡***£THISINSTREMOVEDPERARNOLD'SREQUEST***£REPLACEDBYHAVINGREGISTERD1CONTAIN**£THEDESIREDOPTIONS”*L****************************************************************************‰MOVE.W„D2,(A6)+*£SETUSER'SREQUESTEDOPTIONSŠMOVE.WD3,(A6)+‹LUNŠMOVE.LD1,(A6)+‹PUTVOLUMEŠCLR.W‚(A6)+ŽUSER=0ŠMOVE.L#'„',D2‰BLANKŠMOVE.L#'PRIV',(A6)+†CATALOGŠMOVE.LD2,(A6)+‹"ŠMOVE.L(A3)+,(A6)+ˆFILEŠMOVE.L(A3)+,(A6)+ˆ"ŠMOVE.W(A3)+,(A6)+ˆEXTENTŠCLR.W‚(A6)+ŽRESERVED ŠCLR.L‚(A6)+‰MOVE.L„(A7)+,A3*œA3=SCTDATASEGMENTADDRESSŠTRAPƒ#3‘ASSIGNŠRTSŠPAGEO*******************************************************************************(*ˆ**PRINTFILEIFPOSSIBLETOASSIGNITO**********************************************************************************ˆVERSACOMPUTERREQUIREMENT*&*’A6=SCTDATASEGMENTADDRESSONINPUT*'*’A3=SCTDATASEGMENTADDRESSONOUTPUT** PRTFILEƒEQU„*(ŠCLR.B‚UCBLDCNT(A6)‡INITIALIZETRYCOUNTŠMOVE.WD3,-(A7)‹SAVELUN‰MOVE.W„#FOPPR,D1*œD1=PUBLICREADOPTIONŠBSR„ASGNFILE‹ASSIGNFILE3*œUPONRETURNA3WILLCONTAINSCTDATASEGMENTADDRPRTFILEA‚EQU„*ŠBEQ.S‚PRTFILE1‹ASSIGNED-ŠCMP.B‚#FSTAAP,D0‰INUSE?(ACCESSPERMISSION)ŠBNE„PRTFILEX‹NO*ŠADD.B‚#4,UCBLDCNT(A3)„INCREMENTTRYCOUNT!ŠBEQ.S‚PRTFILEX‹OVERFLOW,GIVEUPŠMOVE.L#500,A0ŒHALFSECONDŠMOVE.L#DELAY,D0ŠDELAYCOMMAND ŠTRAPƒ#1‘WAIT(ŠLEA„OFHS(A3),A0ŒPARAMETERBLOCKADDRESSŠTRAPƒ#3‘TRYAGAINŠBRA„PRTFILEA‹TRYAGAINPRTFILE1‚EQU„*$ŠMOVE.B#-20,UCBLDCNT(A3)‚LINECOUNTPRTFILE2‚EQU„*#ŠMOVE.L#IOREAD<<16,D1…READCOMMANDŠMOVE.L#1<<16,D2ŠLUN'ŠMOVEM.LSTDIO+8,D3-D5…BUFFERADDRESSES ‰BSR‡X10000)*œADJUSTOFFSETSTOADDRESSESIND3,D4,D5+ŠLEA„OFHS+24(A3),A0‰PARAMETERBLOCKADDRESS#ŠMOVEM.LD1-D6,-(A0)‡PUTPARAMETERS ŠTRAPƒ#2‘READ!ŠBNE.S‚PRTFILEX‹EXITONANYERROR(ŠMOVE.LIOSLEN(A0),D5†GETLENGTHOFREAD‰LEA‡SCTINB-1(A3),A0ŠADD.L‚A0,D5ŽENDOFOUTPUT$ŠMOVE.L#IOWRIT<<16,D1…WRITECOMMANDŠMOVE.L#6<<16,D2ŠLUN+ŠLEA„OFHS+24(A3),A0‰PARAMETERBLOCKADDRESS#ŠMOVEM.LD1-D6,-(A0)‡PUTPARAMETERSŠTRAPƒ#2‘WRITEŠBNE.S‚PRTFILEX‹EXITONERROR&ŠADD.B‚#1,UCBLDCNT(A3)„INCREMENTCOUNTŠBMI„PRTFILE2‹CONTINUE‰BTST†#BTREAD5,D7‰BNE.S…PRTFILE1*œJMPIFLUNASSIGNEDTOAFILEŠLEA„PRTMORE,A6‰MOREMESSAGEŠBSR„READLINE‹OUTPUTW/INPUTŠBEQ„PRTFILE1‹CONTINUEIFGOOD"ŠBSETƒ#BTEOF,D7ŠSETFLAGFORCR,LFPRTFILEX‚EQU„*&ŠMOVE.W#FHCLOS,OFHS(A3)ƒCLOSECOMMANDŠCLR.W‚OFHS+2(A3)$ŠMOVE.W(A7)+,OFHS+4(A3)ƒREFETCHLUNŠTRAPƒ#3‘CLOSEŠRTS3PRTMOREƒDC.Bƒ'',0ŠDS…0ŠPAGEH************************************************************************%*ˆ**TEST,SETERRORIF"*"ORDEVICEH************************************************************************!CKNODEVƒTST.B‚D0‘TEST"*","/","#"ŠBNE.S‚CKNODERŒBRANCHERRORŠBTSTƒ#19,D0TESTFILEFOUNDŠBNE.S‚CKNODEXŒOK,EXIT!CKNODERƒBSETƒ#31,D0SETERRORBITCKNODEXƒTST.L‚D0ŠRTSH************************************************************************/*ˆ**CHECKFOR"#"ANDSUBSTITUTETERMINALI.D.H************************************************************************CKDEV…BTSTƒ#1,D0ŽDEVICEFLAG?ŠBEQ.S‚CKEXITNO,OK"ŠBTSTƒ#14,D0NULLVOLUME(DEVICE)?ŠBEQ.S‚CKEXITBRAN? CHNOTNULL6ŠMOVE.LUCBTID(A3),OFHS+6(A3)‚NULL,SUPPLYTERMINALID CKEXIT„RTSŠPAGEO********************************************************************************ˆ**GET/COMPUTEELAPSEDTIME*-*ˆCOMPUTESTHEDATE/TIMEDIFFERENCE(A0)-(A2)%*ˆTHEDIFFERENCEISPUTIND1ANDD2.**ˆCALLINGSEQUENCE:*LEA,A0*LEA,A2*BSRGETLAPSE****O*******************************************************************************GETLAPSE‚EQU„*4ŠMOVEM.L(A0),D1-D2ˆTRANSFERLATERTIMETOREGISTERS;ŠSUB.L‚4(A2),D2ŠSUBTRACTTIME(MILLISECONDSSINCEMIDNIGHT)ŠBPL.S‚GETLAPS1‹NOROLLOVER%ŠADD.L‚#1000*60*60*24,D2‚ADDROLLOVER!ŠSUB.L‚#1,D1ŽDECREMENTDATECOUNTGETLAPS1‚EQU„*$ŠSUB.L‚(A2),D1ŒSUBTRACTORDINALDAYSŠRTSO*********************************************************************************ˆADD/CUMULATEELAPSEDTIME*B*ˆADDSTHEELAPSEDTIMEINREGSD1ANDD2TOTHEADDRESSSPECIFIED *ˆINREGA1.*O*******************************************************************************ADDLAPSE‚EQU„*ŠADD.L‚4(A1),D2‹ADDTIME&ŠCMP.L‚#1000*60*60*24,D2‚TESTROLLOVERŠBCS.S‚ADDLAPS1‹NOROLLOVER'ŠSUB.L‚#1000*60*60*24,D2‚SUBTRACT1DAY ŠADD.L‚#1,D1ŽINCREMENTDAYCOUNTADDLAPS1‚EQU„*ŠADD.L‚(A1),D1ŒADDDAYSŠMOVE.LD1,(A1)+‹PUTDAYSBACK#ŠMOVE.LD2,(A1)ŒPUTCUMULATIONBACKŠRTS*‰PAGE** *ˆRTNETO9*’ADJUSTTHEOFFSETSINREGISTERSD3,D4,D5TOADDRESSES*’INSCT'SDATASEGMENT**ˆINPUT!*’A3=ADDRESSSCT'SDATASEGMENT**ˆOUTPUT *’D3=D3+A3 *’D4=D4+A3 *’D5=D5+A3*’A3=UNCHANGED*X10000: ‰ADD.L…A3,D5X10100: ‰ADD.L…A3,D4 ‰ADD.L…A3,D3.*œADJUSTOFFSETSIN'D?'REGISTERTOADDRESSES‰RTS‰PAGE*,*ˆThefollowingcodewasaddedtofixSPR876*0*ˆTheoriginalinstructionthatwasreplacedwas *’BNE‡LOGOFF*:*ˆTheproblemthatresultedforSPR876isthatachainwas:*ˆprocessingin'batch'modebutataskthatwascalledin5*ˆthechainfileabortedandterminatedthebatchjob?*ˆhowever,ifaquerywasperformeditsaidthatjobterminated<*ˆnormally.Sothislogicwillfindtheapproriatebatchjob4*ˆandchangeitsstatustoterminatedwhilerunning.**X10200:‰MOVE.L„UCBSNO(A3),D1+*œD1=SESSIONNUMBEROFBATCHJOBTOLOGOFF ‰BSR.S…X10300 *œFINDSESSIONNUMBERINJOBQUE ‰BNE‡LOGOFF*œJMPIFUNABLETOFIND4*œTHISISNODIFFERENTTHANTHEORIGINALINSTRUCTION‰MOVE.W„#$C006,(A0)1*œCHANGEBATCHJOBSTATUSFROMNORMALTERMINATION*œTOTERMINATEDWHILERUNNING ‰BRA‡LOGOFF* *ˆROUTINETO5*’FINDTHEENTRYINTHEBATCHJOBQUEFORTHESESSION*’NUMBERFOUNDINREGISTERD1**ˆINPUT0*’D1-CONTAINSTHESESSIONNUMBERSEARCHINGFOR**ˆOUTPUT*’STATUS'*œNON-ZERO-->SESSIONNUMBERNOTFOUND* ZERO-->SESSIONNUMBER…FOUND*4*’A0-CONTAINSADDRESSINBATCHJOBQUEFORSESSION'*—NUMBERSEARCHINGFORIFSTATUS=ZERO***ˆREGISTERSALTERED**’A0X10300:‰LEA‡JOBQUEUE,A0X10400:‰CMP.L…ENDQUEUE,A0 ‰BPL.S…X105002*œJMPIFSESSIONNUMBERNOTFOUNDINBATCHJOBQUE‰CMP.L…4(A0),D1 ‰BEQ.S…X10600.*œJMPIFSESSIONNUMBERFOUNDINBATCHJOBQUE ‰ADD.L…#8,A0 *œADJUSTTONEXTBATCHJOBENTRY ‰BRA.S…X10400 *œREPEATLOOP X10500: ‰TST.L…D1*œSETNOTFOUNDSTATUSX10600:‰RTSŠEND éé@ ééé=/* =/*†USMLIB.CF=/* =OPTION O=DEL USMOPT.RO=LIB USMOPT.RO A CMDOPT1.RO A SECURE.RO A CHAINBAT.ROLQ=/*=ENDéééééééû =/***************=/* &.SYSGEN.CF *=/***************=OPT K,NM=/***************************************************************************#=/*Chainfiletoperformsysgen:«*H=/*„Torestartasysgen,addthe"S"optiontothesysgencommandlineƒ*G=/*„below("=SYSGEN\5,\6,\7;CT=nnn")andinsertthepatternmatching„*D=/*„restarttextonanewlineimmediatelyafterthisline.‚Ifyou†*I=/*„wanttokeepyourASM/LINKlistingfile(arg5),youmustdeletethe‚*=/*„"=DEL\5"linebelow.°*=/*É*=/*Callingsequence:·*=/*É*=/*ƒ=USEvol:nbr.system³*(=/*ƒ=sys:9998..COPYSGEN.CF‚vol,vol,nbr£*+=/*ƒ=&.SYSGEN.CFarg1,arg2,arg3,arg4,arg5¡*8=/*†where:‚vol=volumenamewheresysgenistobedone*"=/*Žnbr=usernumberƒ"…"„"‚"‚"ƒ"’*?=/*‹system=systemtosysgenfor:EXORMACS,VM01,VM02,VM03,…*=/*“VMES10,VME110,etc.¢*2=/*Žsys=volumenamewhereSYSGENfilesarekept*=/*É*E=/*‡Example:‚ForVM02sysgenonharddiskSYS:inusernumber9100,‚*=/*‘enterthefollowing:¤*=/*“@ =USESYS:9100.VM02¤**=/*“=MSTR:9998..COPYSGEN.CF‚SYS,SYS,9100‘*!=/*“=&.SYSGEN.CF,,L1.LS,,L2.LS›*=/*—or°*=/*“=USESYS:9100.VM02¤**=/*“=MSTR:9998..COPYSGEN.CF‚SYS,SYS,9100‘*=/*“=STD.SYSGEN.CF¨*=/*É*7=/*„Notalloftheargumentsneedtobeenteredsince”*$=/*†theyeachhaveadefaultvalue¥*=/*É*<=/*„arg1-commandfilename(defaultsto'&.VERSADOS.CD')*=/*É*,=/*„arg2-Tempvolanduserno./BootfileŸ*9=/*Temp.vol.anduserno.defaultstovolumenameand‰*)=/*usernumberofcommandfile(arg1).—*3=/*Bootfiledefaultsto'.VERSADOS.SY'.*=/*É*=/*É*9=/*„arg3-Listdeviceorfilenameforsysgenmessages’*'=/*(defaultsto.SYSLIST.LS)›*;=/*‹Iffilename-sysgenuses'.LS'asdefaultextension‰*=/*É*9=/*‡NOTE:Thefirstthreeargumentsarethesameasthe*4=/*threecommandlinefieldsusedininvokingtheŽ*=/*sysgenutilitydirectly.¤*=/*É*$=/*„arg4-Reservedforfutureuse§*=/*É*6 GJ ?=/*‹Reference0.PRIV.NEWS.NWtoseehowtosysgenanEXORMACS…*6=/*‹foraFLOPPYonlysystemoraSINGLE-HARDsystemŽ*=/*É*E=/*„arg5-Listingdeviceorfile(Defaultsto.SYSASML.LS)†*A=/*Legaldevicesare#,#PR,#PR1,#PR2,#PR3,#NULLorafilename.*==/*Allassemblylistingsandlinkmapswillbedirectedto…*>=/*thespecifieddeviceorfileusingthecopyutilitywith„*>=/*appendoption.‚SYSGEN.TFisusedasanintermediatefileƒ*2=/*tocontaintheassemblyorlinklistoutput.*A=/*Duetorestrictionsinsysgenliteralsubstitutionprocess,*8=/*thisfieldcannotcontainmorethan30characters.Š*M=/***************************************************************************=/*F=/* Make sure they have CNFGDRVR.CI in the catalog they have selected.:=/* This is to make sure they are not in the Null catalog.=DIR CNFGDRVR.CI=/IF RD (12) = 1ƒ=OPT-Nƒ=/******ERROR*****Cƒ=/*YouMUSThavethecatalogsettotheyouaregoingto*ƒ=/*sysgenfor.‚Pleasesetandtryagain.ƒ=@END=/ENDIF=/*5=/* Insure that no more than 5 arguments are defined:=/*=/RX=\0 =/IF RX>5ƒ=OPT-N<ƒ=/*Error-chainfilestartedwithmorethan5arguments-ƒ=/*@ƒ=/*‚Pleaselistthisfile,"&.SYSGEN.CF",formoreinformation.ƒ=/*ƒ=@END=/ENDIF=/*2=/* Force the definition of 5 exactly 5 arguments.=/* =/IF RX=0+ƒ=ARG&.VERSADOS.CD,,SYSLIST.LS,,SYSASML.LS=/ENDIF =/IF RX=1 ƒ=ARG\1,,SYSLIST.LS,,SYSASML.LS=/ENDIF =/IF RX=2"ƒ=ARG\1,\2,SYSLIST.LS,,SYSASML.LS=/ENDIF =/IF RX=3ƒ=ARG\1,\2,\3,,SYSASML.LS=/ENDIF =/IF RX=4ƒ=ARG\1,\2,\3,\4,SYSASML.LS=/ENDIF=/*8=/* We have 5 arguments - now default any null arguments=/*=/IFC \1ƒ=ARG&.VERSADOS.CD,\2,\3,\4,\5=/ENDIF=/*=/IFC \3ƒ=ARG\1,\2,SYSLIST.LS,\4,\5=/ENDIF=/*=/IFC \5ƒ=ARG\1,\2,\3,\4,SYSASML.LS=/ENDIF=/*G=/* If arg5 is not #PR,#PR1,#PR2,#PR3,# or #NULL then treat as file and:=/*ƒsetswitch(arg6)to1forprinterdevice,0forfile.=/*0=ARG \1,\2,\3,\4,\5,0,#PR,#PR1,#PR2,#PR3,#,#NULL =/FOR 7,\0ƒ=/IFEQ"\5"\(RX)1†=ARG\1,\2,\3,\4,\5,1,#PR,#PR1,#PR2,#PR3,#,#NULLƒ=/ENDIF=/ENDFOR=/RX=\6 =/IF RX=0ƒ=DEL\5ƒ=DELXVERSAPT.LS=/ENDIF=/*#=ARG \1,\2,\3,\4,\5,\6,\7,SYSGEN.TF=/*3=/* The argument list now looks like the following:=/* =/*ƒarg1ƒ-ƒNameofcommandfile.=/*0=/*ƒarg2ƒ-ƒTemporaryvolume/bootfile(ornull).=/*3=/*ƒarg3ƒ-ƒListdeviceorfileforsysgenmessages.=/*"=/*ƒarg4ƒ-ƒReservedforfutureuse=/*@=/*ƒarg5ƒ-ƒListingfileordeviceforassembliesandlink-edits.4=/*SYSGEN.TFisthetemporaryfilewhichisusedin1=/*conjunctionwith=COPY;Atoproduceasingle=/*listingfile.=/*(seearg6)=/*=/*ƒarg6ƒ-ƒSwitch-"=/*0A =‚arg5specifiesafilename=/*1=‚arg5specifiesadevice=/*(seearg5)=/*"=/*ƒarg7ƒ-ƒReservedforfutureuse=/*8=/*ƒarg8ƒ-ƒSYSGEN.TFtemporaryfileforusewithcopyin+=/*creatinglistingfilespecifiedbyarg3=/*=/*9=/* Justify argument positions and invoke sysgen utility.=/*=ARG \5,\6,\7,\8,\1,\2,\3,\4=/*)=/* Turn off echo of sysgen command lines =OPT J,-N=TIME=SYSGEN \5,\6,\7;CT=350=TIME =OPT -J,N=/*H=/* The following SGSYMBL utility will produce a cross reference listingG=/*ofallthesysgenparameters.‚Thelistingwillshowthesymbol,theE=/* value, the file(s) that define the parameter and the file(s) thatI=/*referencetheparameter.‚TheinputfileforthisutilityisSGSYMS.SYG=/* which is created from sysgen if the 'C' option was specified on theI=/*sysgencommandline.‚TheoutputfilefromthisutilityisSYMBOLS.LS.=/*=SGSYMBL=OPT -N=/**C=/**‚Applyingpatchesfrom".XVERSAPT.CF"tothebootfile.=/**=/@ XVERSAPT.CF=/RX=\2 =/IF RX=0ƒ=LISTXVERSAPT.CF,XVERSAPT.LSƒ=COPYXVERSAPT.LS,\1;Aƒ=DEL‚XVERSAPT.LS=/ELSEƒ=LISTXVERSAPT.CF,\1=/ENDIFM=/***************************************************************************M=/***************************************************************************=/**=/**‚SysgenCompleted--=/**1=/**„Sysgencommandlistinghasbeenoutputto\7=/**6=/**„Assemblyandlinklistingshavebeenoutputto\1=/**M=/***************************************************************************M=/***************************************************************************=OPT -K=ENDéééééé**ˆ&.CMDLIST.AG*.CMDLISTƒIDNTƒ3,27SESSIONCONTROLCOMMANDLIST ŠSECTION8ŠXDEFƒCMDACCTTŠXDEFƒCMDPWVALŠXDEFƒCOMTSKNO ŠXDEFƒDEFAULTŠXDEFƒEET_GFLG ŠXDEFƒEETSBATŠXDEFƒINDFVOLN ŠXDEFƒINITPAR ŠXDEFƒINSWORDŠXDEFƒLODRETRY ŠXDEFƒLOGMŠXDEFƒLOGNTERMŠXDEFƒLOGTRYNO ŠXDEFƒPATCH ŠXDEFƒSYSCMD ŠXDEFƒSYSCMDS ŠXDEFƒSYSOPTŠXDEFƒSYSTBEND ŠXDEFƒTIMECNTŠXDEFƒUCBMAXLUŠXDEFƒUCBPRIBTŠXDEFƒUCBPRICHŠXDEFƒUCBPRILI* *ˆ**EQUATES*SPCCMD„EQU„\SPCCMDCHAINBAT‚EQU„\CHAINBATSECURITY‚EQU„\SECURITYTOTTERMƒEQU„\TOTTERMCONBATCH‚EQU„\CONBATCHBATCHPGE‚EQU„\BATCHPGENOLOGONƒEQU„\NOLOGONMAXLU…EQU„\MAXLUTERMOCNT‚EQU„\TERMOCNTBATDLY„EQU„\BATDLYNOLOGONS‚EQU„\NOLOGONS*EETPNAMƒEQU„'&EET'DCLSHR„EQU„7’DECLARESHAREABLEA GTASQ…EQU„31‘GETASQSGATRO„EQU„$4000ŽREADONLY$SGATGS„EQU„$1000ŽGLOBALLYSHAREBABLE AQSTQE„EQU„16SOSYSMSG‚EQU„1’BITPOSITIONFORINITIALIZINGCHAINFILE'IOUCBK„EQU„$8001ŽCLAIMUNCLAIMEDBREAKS+ISECLVLƒEQU„0’INITIALSECURITYLEVEL(NONE)*ISWORD1ƒEQU„0’INITIALSECURITYWORDPART1*ISWORD2ƒEQU„0’INITIALSECURITYWORDPART2*MAXVNTLN‚EQU„26‘NO.BYTESSCTEVENTS(MAX)DMAXTSKNO‚EQU„8‡MAXNO.TASKSCOMMUNICATINGWITHSCT(TERM,ABORT,ATTN)#IPRIUTSK‚EQU„66‘INITIAL„"ƒUSERTASKLPRIUTSK‚EQU„127LIMIT…"…"ƒ".IPRICTSK‚EQU„66‘INITIAL„"„CHAINMODEUSERTASK-LPRICTSK‚EQU„127LIMIT…"„CHAINMODEUSERTASK.IPRIBTSK‚EQU„65‘INITIAL„"„BATCHMODEUSERTASK,LPRIBTSK‚EQU„65‘LIMIT†"„BATCHMODEUSERTASK*2*ˆ**OPTIONBITSFORSYSOPT(1=INCLUDE,0=EXCLUDE)*KINITFILE‚EQU„1ACTIVATEINITIALIZINGCHAINFILE(PRIV.UPSYSTEM.NW)SESSION1*ŠPAGE*ˆ**IDENTIFICATIONMESSAGE.LOGM†DC.Bƒ$D8,'\LOGMSG1\REVNUMBR‹\$DATE\$TIME'ŠDS.W†0ŠDS.BƒLOGM+80-***ˆ**INITIALIZATIONINFORMATION*"INITPARƒDC.BƒTOTTERMŒNO.TERMINALS2ŠDC.BƒCONBATCH‹NO.CONCURRENTBATCHJOBSEXECUTING9ŠDC.BƒBATCHPGE‹NO.PAGESBATCHQUEUING(32JOBSPERPAGE)$ŠDC.BƒISECLVLŒINITIALSECURITYLEVEL1INSWORDƒDC.LƒISWORD1ŒINITIALSYSTEMSECURITYWORD ŠDC.LƒISWORD2%Q.H6g>6INDFVOLN‚DC.Lƒ'„'Systemdefaultvolumename(dynamic)ŠDC.Lƒ0’RESERVEDŠDC.Lƒ0’RESERVED?COMTSKNO‚DC.BƒMAXTSKNO‹MAXIMUMNO.TASKSCOMMUNICATINGWITHSCT9LOGTRYNO‚DC.BƒNOLOGONŒNO.LOGONTRIESBEFOREREJECTLOGONFUCBPRILI‚DC.BƒIPRIUTSK,LPRIUTSK‚PRIORITIESFORONLINEMODEUSERTASKSDUCBPRICH‚DC.BƒIPRICTSK,LPRICTSK‚PRIORITIESFORCHAINMODEUSERTASKSDUCBPRIBT‚DC.BƒIPRIBTSK,LPRIBTSK‚PRIORITIESFORBATCHMODEUSERTASKS,UCBMAXLU‚DC.BƒMAXLUŽNUMBERMAXLUNSPERTASK;TIMECNTƒDC.BƒTERMOCNT‹LOGOFFAFTERSPECIFIEDNO.TIMEOUTS1SYSOPT„DC.BƒINITFILE<LODRETRY‚DC.LƒBATDLYWAITTORETRYLOADIFNOMEMORYAVAILABLEŠDC.Lƒ0,0RESERVEDPATCH…DS.Bƒ$80PATCHAREA.DEFAULTƒDC.Bƒ'\DEFAULT'‰Defaultvolume:usn.catŠDC.Bƒ$0D,$0AŒCr,LfŠDS…0’ForceevenbyteboundaryŠPAGE**:*ˆGENERALUSAGEFLAGFOR'YES'OR'NO'TYPECONSIDERATIONS** EET_GFLG:‰DC.W†\AUTOLOGN *œBIT‡MEANING *ž0‡AUTOLOGN*¦0-->Autobreakdenied*¦1-->Autobreakrequested*ž1*¦0-->Autovol:usn.catdenied"*¦1-->Autovol:usn.catrequested**œ2-15†Availableforuse* LOGNTERM:‰DC.B†\AUTOTERM'*œTERMINALIDAUTOLOGONISTOOCCURONŠPAGEH************************************************************************&*ˆ**TABLEOFSESSIONCONTROLCOMMANDS*”========================H************************************************************************ SYSCMDSƒEQU„***ˆ**BASICCONTROLCOMMANDS*/ŠXREFƒLOGOFF,LOGBYE,LOAD,USTRT,STOPTASK,CONTINU&ŠXREFƒTRMINATE,PROC260,LOGDATE,LOGTIMEŠXREFƒUSE,DEFAULTS,ARG,NOARGŠXREFƒBREAKS,BREAKT,OPTCMDŠXREFƒEETSXT,EETSBATESYSCMD„DC.Bƒ'LOGOF',$E6,0…F ŠDC.LƒLOGOFFŠDC.Bƒ'LOGOF',$E6,0†F ŠDC.LƒLOGOFF ŠDC.Bƒ'OFF',0 ŠDC.LƒLOGOFF ŠDC.Bƒ'BYE',0 ŠDC.LƒLOGBYEŠDC.Bƒ'LOAD',0 ŠDC.LƒLOADŠDC.Bƒ'STAR',$F4,0‡T ŠDC.LƒUSTRTŠDC.Bƒ'STOP',0ŠDC.LƒSTOPTASK#ŠDC.Bƒ'CONT',$E9,$EE,$F5,$E5,0INUE ŠDC.LƒCONTINU(ŠDC.Bƒ'TERM',$E9,$EE,$E1,$F4,$E5,0INATEŠDC.LƒTRMINATEŠDC.Bƒ'^',0ŽHALTTERMINALINPUTŠDC.LƒPROC260ŒGOWAITFOREVENTŠDC.Bƒ'DATE',0 ŠDC.LƒLOGDATEŠDC.Bƒ'TIME',0 ŠDC.LƒLOGTIME ŠDC.Bƒ'USE',0 ŠDC.LƒUSE'ŠDC.Bƒ'DEF',$E1,$F5,$EC,$F4,$F3,0AULTSŠDC.LƒDEFAULTS,ŠDC.Bƒ'ARG',$F5,$ED,$E5,$EE,$F4,$F3,0UMENTS ŠDC.LƒARG.ŠDC.Bƒ'NOARG',$F5,$ED,$E5,$EE,$F4,$F3,0UMENTS ŠDC.LƒNOARGŠDC.Bƒ'BSTO',$F0,0‡P ŠDC.LƒBREAKSŠDC.Bƒ'BTER',$ED,0‡M ŠDC.LƒBREAKT"ŠDC.Bƒ'OPT',$E9,$EF,$EE,$F3,0IONS ŠDC.LƒOPTCMD*ˆ**OPTIONALCOMMANDS ŠIFNEƒSPCCMDŠXREFƒNEWS,HELP,ASSIGN,CLOSEŠDC.Bƒ'NEWS',0 B ŠDC.LƒNEWSŠDC.Bƒ'HELP',0 ŠDC.LƒHELPŠDC.Bƒ'ASSI',$E7,$EE,0ƒGN ŠDC.LƒASSIGNŠDC.Bƒ'CLOS',$E5,0‡E ŠDC.LƒCLOSEŠENDC"*ˆ**CHAIN/BATCHOPTIONALCOMMANDSŠIFNEƒCHAINBAT)ŠXREFƒCHAIN,CMDEND,RETRY,PROCEED,REGCHAINŠDC.Bƒ'CHAI',$EE,0‡N ŠDC.LƒCHAIN ŠDC.Bƒ'END',0 ŠDC.LƒCMDENDŠDC.Bƒ'RETR',$F9,0‡Y ŠDC.LƒRETRYŠDC.Bƒ'PROC',$E5,$E5,$E4,0EED ŠDC.LƒPROCEED ŠDC.Bƒ'R?',0ŠDC.LƒREGCHAINŠXREFƒBATCH,CANCEL,ELIM,QUERYŠDC.Bƒ'BATC',$E8,0‡H ŠDC.LƒBATCHŠDC.Bƒ'CANC',$E5,$EC,0ƒEL ŠDC.LƒCANCELŠDC.Bƒ'QUER',$F9,0‡Y ŠDC.LƒQUERY(ŠDC.Bƒ'ELIM',$E9,$EE,$E1,$F4,$E5,0INATE ŠDC.LƒELIMŠENDC*ˆ**SECURITYOPTIONALCOMMANDSŠIFNEƒSECURITY%ŠXREFƒPASS,SWORD,SECURE,PWVAL,ACCTINNŠDC.Bƒ'PASS',$F7,$EF,$F2,$E4,0 ŠDC.LƒPASSŠDC.Bƒ'SWORD',0 ŠDC.LƒSWORDŠDC.Bƒ'SECURE',0 ŠDC.LƒSECUREŠENDCSYSTBEND‚DC.Wƒ0,0,0*#*ˆ**TRANSFERFORBATCHTERMINATION*ŠIFEQƒCHAINBATEETSBATƒBRA„EETSXTIGNOREŠENDCŠIFNEƒCHAINBATEETSBATƒBRA„EETSBATEŠENDC*%*ˆ**TRANSFERFORPASSWORDVALIDATION*ŠIFEQƒSECURITY CMDPWVAL‚RTS**D*ˆENTRYPOINT''''CMDACCTT''''MUSTHAVEA6=SCTDATASEGMENTADDRESS*C*ˆEXITFROM''''CMDACCTT''''WILLHAVEA3=SCTDATASEGMENTADDRRESS** CMDACCTT: ‰MOVE.L„A6,A3*œA3=SCTDATASEGMENTADDRRESSŠRTSŠENDCŠIFNEƒSECURITYCMDPWVAL‚BRA„PWVAL**D*ˆENTRYPOINT''''CMDACCTT''''MUSTHAVEA6=SCTDATASEGMENTADDRESS*C*ˆEXITFROM''''CMDACCTT''''WILLHAVEA3=SCTDATASEGMENTADDRRESS**CMDACCTT‚BRA„ACCTINNŠENDC*ŠDS.BƒLOGM+$300-* ŠSECTION19ŠXDEFƒBEGQUEUE,ENDQUEUE,STTABL,STTABLND,JOBQUEUE,JOBQUEND&ŠXDEFƒTESEGPGM,TESEGSTT,TASQPAR,BRKPAR ŠXREFƒEETASRBEGQUEUE‚DC.LƒJOBQUEUEENDQUEUE‚DC.LƒJOBQUEND STTABL„EQU„* STTABLND‚EQU„STTABL+(8*NOLOGONS)JOBQUEUE‚EQU„STTABLND*:*ˆ**FOLLOWINGEXEC&FHSCALLSEXECUTEDATINITIALIZATION9*ˆ**THENCLEAREDTOBECOMESTTTABLEANDBATCHJOBQUEUE*@TESEGPGM‚DC.LƒDCLSHR,0,0,SGATRO+SGATGS,EETPNAMDECLARESHAREABLE?TESEGSTT‚DC.LƒDCLSHR,0,0,SGATRO+SGATGS,'.STT'DECLARESHAREABLE$TASQPARƒDC.LƒGTASQ,EETPNAM,0„GETASQŠDC.BƒAQSTQE,MAXVNTLN,ŠDC.Lƒ0’QUEUELENGTHINITIALIZEDATSTARTUPŠDC.LƒEETASR,0BRKPAR„DC.WƒIOUCBK,0ŠDC.Lƒ0ŠDS.BƒBEGQUEUE+$100-*ŠDS.BƒBATCHPGE*$100JOBQUEND‚EQU„*ŠENDééééé-INITDATƒIDNTƒ3,1SystemInitializerDATAArea*-*„THEFOLLOWINGEQUATESAREUSEDFORBUILDING%*„AMEMORYTABLEFORTHEINITROUTINE*MTYP0…EQU„0’RAMMEMORYTYPE0 MTYP1…EQU„1*16RAMMEMORYTYPE1 MTYP2…EQU„2*16RAMMEMORYTYPE2 MTYP3…EQU„3*16RAMMEMORYTYPE3 MTYP4…EQU„4*16RAMMEMORYTYPE4 MTYP5…EQU„5*16RAMMEMORYTYPE5 MTYP6…EQU„6*16RAMMEMORYTYPE6 MTYP7…EQU„7*16RAMMEMORYTYPE7*PART0…EQU„0’PARTITIONNUMBER0PART1…EQU„1’PARTITIONNUMBER1PART2…EQU„2’PARTITIONNUMBERB 2PART3…EQU„3’PARTITIONNUMBER3PART4…EQU„4’PARTITIONNUMBER4PART5…EQU„5’PARTITIONNUMBER5PART6…EQU„6’PARTITIONNUMBER6PART7…EQU„7’PARTITIONNUMBER7PART8…EQU„8’PARTITIONNUMBER8PART9…EQU„9’PARTITIONNUMBER9!PART10„EQU„10‘PARTITIONNUMBER10!PART11„EQU„11‘PARTITIONNUMBER11!PART12„EQU„12‘PARTITIONNUMBER12!PART13„EQU„13‘PARTITIONNUMBER13!PART14„EQU„14‘PARTITIONNUMBER14!PART15„EQU„15‘PARTITIONNUMBER15 (* Get board specific memory type equates INCLUDE MTYPE.SIŠPAGE*#*†MACROTOBUILDMEMORYTABLEENTRY* MTENTRYƒMACRO \@A‡SET„0ŠIFC„'\1','RAM' DC.Bƒ\4+\5,0 DC.Lƒ\2,\3DC.Bƒ\6DC.Bƒ0 \@AŠSET„1ŠENDCŠIFC„'\1','ROM' DC.Bƒ$FF,0 DC.Lƒ\2,\3DC.Wƒ0 \@AŠSET„1ŠENDC ŠIFEQƒ\@A FAILƒ2000ŠENDCŠENDM* MTEND…MACRO ŠDC.Wƒ$FFFFŠENDM ŠPAGE ŠSECTION8*4*ˆISSUERETURNFORSYSTEMINITIALIZEREXECUTIONCODE*‰RTS  *%*ˆDATAREQUIREDBYSYSTEMINITIALIZER*ŠPAGE ŠXDEFƒASN ŠXDEFƒCACHEFŠXDEFƒCLOCKFRQŠXDEFƒDISPATCHŠXDEFƒDUMMYPTR ŠXDEFƒEEND ŠXDEFƒENDMEMT ŠXDEFƒESTACK ŠXDEFƒESTART ŠXDEFƒGSTSIZ ŠXDEFƒIOVSIZ ŠXDEFƒMEMTABL ŠXDEFƒMEMTYPA ŠXDEFƒMEMTYPS ŠXDEFƒMEMTYPT ŠXDEFƒMEMTYPUŠXDEFƒPAGESIZE ŠXDEFƒPANELA ŠXDEFƒPATSIZ ŠXDEFƒRDYHEAD ŠXDEFƒSMEMHI ŠXDEFƒSMEMLO ŠXDEFƒTCBHEAD ŠXDEFƒTIMERAŠXDEFƒTIMINTVA ŠXDEFƒTIMSLIC ŠXDEFƒTRCFLAG ŠXDEFƒTRCSIZ ŠXDEFƒUDRSIZ ŠXDEFƒUSTSIZŠXDEFƒWHERLOADŠPAGETCBHEADƒDC.Lƒ\$TCBLST‹TCBHD RDYHEADƒDC.Lƒ\$TCBRDY‹READYHD FmOM#ESTART„DC.Lƒ\STARTRMSŠSTARTOFEXEC EEND†DC.Lƒ\MEMBEGŒENDOFEXEC %ESTACK„DC.Lƒ\STACKEXECSTACKADDRESS &PANELA„DC.Lƒ\PANELFRONTPANELADDRESS SMEMLO„DC.Lƒ0’SECMEMLO SMEMHI„DC.Lƒ0’SECMEMHI "DISPATCH‚DC.Lƒ\STARTRMSŠDISPATCHER GSTSIZ„DC.Lƒ\GSTGST#OFPAGES USTSIZ„DC.Lƒ\USTUST#OFPAGES UDRSIZ„DC.Lƒ\UDRUDR#OFPAGES PATSIZ„DC.Lƒ\PATPAT#OFPAGES )TRCSIZ„DC.Lƒ\TRACETRACETABLE#OFPAGES TRCFLAGƒDC.Wƒ\TRCFLAG #TIMERA„DC.Lƒ\TIMERADDRESSOFTIMER ;TIMINTVA‚DC.Wƒ\TIMINTV‹#MILLISECSBETWEENTIMERINTERRUPTS ?TIMSLICƒDC.Wƒ\TIMSLIC‹#TIMERINTERRUPTSBEFORETASKRELINQUISH 1CLOCKFRQ‚EQU„\CLOCKFRQŠ#CLOCKTICKSPERMILLISEC $IOVSIZ„DC.Lƒ\IOVSIZEOFIOVCTTABLE 0MEMTYPAƒDC.BƒMTYP0ŽDEFAULTMEMORYTYPEFORASQ'S 0MEMTYPTƒDC.BƒMTYP0ŽDEFAULTMEMORYTYPEFORTCB'S MMEMTYPS‚DC.BMTYPE$SRO,MTYPE$SRWDEFAULTMEMORYTYPEFORSYSTEMTASKS(RO,RW) KMEMTYPU‚DC.B‚MTYPE$URO,MTYPE$URWDEFAULTMEMORYTYPEFORUSERTASKS(RO,RW) ADUMMYPTR‚EQU„$A00‹USEASDUMMYPOINTERFORNON-EXISTANTADDRESSES /WHERLOAD‚DC.Lƒ\WHERLOADŠWHEREMACSBUGWILLLOAD 7PAGESIZE‚DC.Lƒ\PAGESIZEŠPAGESIZEFORSEGMENTALLOCATION ;ASN‡DC.Lƒ\ASNNUMBEROFADDRESSSPACES(CURRENTLY0OR127) ACACHEF„DC.Lƒ\CACHEFŠAdresstouseforselectivelyflushingbank1, *œbank2,orbothbanksofcache.ŠPAGE*9*‚MEMORYTABLE-USEDBYINITTOSETUPFREEMEMORYLISTS* ŠSECTION8 ŠOPT„NOCL* TOP‡SET„0 BOTTOM„SET„1* MEMTABLƒEQU„* /ŠMTENTRYRAM,$00000,\MEMEND1,MTYPE$P0,PART0,TOPŠIFNEƒ\MEMEND24MTENTRYRAM,\MEMEND2,\MEMEND3,MTYPE$P1,PART1,BOTTOMŠENDC ŠIFNEƒ\$ROPT MTENTRYROM,\ROMSADDR,\ROMEADDRŠENDCŠMTENDŠDS.Lƒ10 ENDMEMTƒEQU„*ŠENDé**ˆ&.ROMIOI1.AG*=*ˆTHISROUTINEISREFERENCEDFROMTHESYSTEMINITIALIZERIOI.* *ˆROUTINETO*’PERFORMSPECIFIEDFUNCTIONS7*’IFAROMBASEDSYSTEMTHEDESIREDROMROUTINEWILLBE *—EXECUTED*’ELSE&*—ANIMMEDIATERETURNWILLBEEXECUTEDC **ˆINPUT *’A5=ZERO8*’A6=ADDRESSOFI/OCOMMONDATASEGMENTATSYSGENTIME**ˆOUTPUT$*’A5=NON-ZERO-->ROMBASEDSYSTEM*›ZERO-->RAMBASEDSYSTEM**ˆREGISTERALTERATION**’IFROMBASEDSYSTEM*—A0=DESTROYED*—A1=DESTROYED*—A2=DESTROYED*—A5=DESTROYED*—D0=DESTROYED*—D1=DESTROYED*’ELSE*—NOREGISTERALTERATION* ‰XDEF†ROMIOI1‰XDEF†ROMIOI02 ‰XREF†INITROMR ‰SECTIONƒ1 ROMIOI1: „IFNE‹\$ROPT‰XREF†ROMIOI90 ‰BRA‡ROMIOI90.*œROUTINETOPERFORMTHOSEFUNCTIONSTHATWILL-*œESTABLISHTHEREQUIREDRAMWITHTHEDESIRED*œINITIALIZATION„ENDC ROMIOI02: ‰BRA‡INITROMR‰ENDééééW4FMSG‰******************************************************************6MSG‰**„---‚GenericSYSGENcommandfile‚---‹02/28/85‚**MSG‰**&.VERSADOS.CD¢** MSG‰**¾**5MSG‰**‚Setsysgenparametersfrompassedarguments‘**FMSG‰*******************************************************************E*ƒUseinconjunctionwith"STD.SYSGEN.CF"or"&.SYSGEN.CF"orexecute(*ƒdirectlywiththefollowingarguments:*=*†ARG1-listingfileordeviceforassembliesandlinkedits*(*†ARG2-switch:ƒ0=ARG1isafilename*—1=ARG1isadevicename* *†ARG3-Reservedforfutureuse*?*†ARG4-workingfileforusewith"COPY;A"toproducelisting*G*ƒNOTE:‚ArgumentsarenotinthesameorderasfortheSYSGEN.CFfiles!N******************************************************************************"**”------‚CAUTION‚-------˜**G**…SYSGENnowassumesthecatalogwassettothepropersystemtype,„**(**…i.e.EXORMACS,VMES10,VM02,etc.!£**N******************************************************************************  (ASMLSW„=\2‹Assemblylistingfileswitch*›0=ASMLSisafile*›1=ASMLSisadevice%LINKLSWƒ=\2‹Linklistingfileswitch*›0=LINKLSisafile*›1=LINKLSisadevice IFEQˆ\ASMLSW#ƒASMLS…="\4"‰ASMlistingworkfileENDC IFNEˆ\ASMLSW ƒASMLS…="\1"‰ASMlistingdeviceENDC IFEQˆ\LINKLSW%ƒLINKLS„="\4"‰LINKlistingworkfileENDC IFNEˆ\LINKLSW"ƒLINKLS„="\1"‰LINKlistingdeviceENDC )WORKLS„="\1"‰Overalllistingfile/device FMSG‰******************************************************************EMSG‰**‚Initialize.VERSAPT.CFand.OSLIST.AGfiles**AMSG‰**‚sowecandynamicallybuildthemwithCOPY;Acommands.…**FMSG‰******************************************************************#=COPY‡VERSAPT.BEGIN.CF,VERSAPT.CF;Y!=COPY‡OSLIST.BEGIN.AG,OSLIST.AG;Y  2&TOTDSKƒ=0ŒTotalnumberofdisks(floppy&hard):5*˜ThisredefinableparameterisbuiltasdiskdriversC `<i.q0y;2‰-‘4™,¡1©0± ,*˜areincluded.‚Eachvolumedefinedrequires%*˜approximately2.25bytesofmemory.6&TOTTERM‚=0ŒTotalnumberofterminals(local&MCCM):6*˜Thisredefinableparameterisbuiltasterminalsare *˜included.4&TOTPRTƒ=0ŒTotalnumberofprinters(local&MCCM):6*˜Thisredefinableparameterisbuiltasterminalsare *˜included.@&PIAFLAG‚=0ŒFlagtoincludePIADRV.‚Ifnon-zerothenPIADRVhas*˜alreadybeenincluded.>&SERFLAG‚=0ŒFlagtodefinethenumberofserialportdrivers.@&SPRFLAG‚=0ŒFlagtoincludeSPRdriver.‚Ifnon-zeroMPSCSPRhas*˜alreadybeenincluded.@&SUPFLAG‚=0ŒFlagtoincludeSUPdriver.‚Ifnon-zeroMPSCSUPhas*˜alreadybeenincluded.A&MPSCFLG‚=0ŒFlagtoincludeMPSCdriver.‚Ifnon-zeroMPSCDRVhas*˜alreadybeenincluded.B&M420FLG‚=0ŒFlagtoincludeM420DRV.‚Ifnon-zerothenM420DRVhas*˜alreadybeenincluded.'&PCDRV„=0ŒProcessControlDriverFlag:8*˜ThisredefinableparameterisbuiltasProcessControl+*˜Drivers(VME6xx,RAD,RIO)areprocessed.<&CRTDV„=$434E3030„StartingCRTTerminalDeviceCode='CN00"*˜(CN01,CN02,CN03,etc.)6&PRTDV„=$50522020„StartingPrinterDeviceCode='PR‚'*˜(PR1,PR2,PR3,etc.)2*˜(Mustbeuniquein1stthreecharactersandsame *˜format.)I&DSKDV„=$00002F00„StartingDiskDeviceNumber='__/_'(1lessthan__0_)0*˜(getsbuiltintoHD00,HD01,...,FD14,FD15,...)*D*ƒThefollowingparametersareusedinthediskcontrollerIOCfiles)*ƒtodeterminethestartingdrivenumber.+ZERO†="0"ŠStartingdisknumberfordrive0*TWO‡="2"ŠStartingdisknumberfordrive2+FOUR†="4"ŠStartingdisknumberfordrive4*SIX‡="6"ŠStartingdisknumberfordrive6 3MSG‰***********************************************+MSG‰**ƒSYSGENparametersfortablesizes‡**3MSG‰*********************************************** 3DCQPGE„=2ŒNumberofpagesofmemoryforthedevice,*˜connectionqueue(DCQ).‚Minimumof1page,)*˜maximumof10pages.‚TheDCQisusedto.*˜saveconcurrentrequeststothesamefileor-*˜device.‚EachpageoftheDCQcanaccomodate*˜approximately9entries.*4UST‡=2ŒNumberofpagesintheusersemaphoretable.,*˜Minimumof1,maximumof10.‚Eachpagecan&*˜accomodateapproximately11entries.*5TRACE…=0Œ*No.ofpagesintracetable.‚TRACEmustbe**˜nonzeroifTRCFLAGisnonzero.‚Eachpage**˜canaccomodateapproximately10entries.*1UDR‡=1ŒNumberofpagesinuser-defineddirective**˜table,minimumof0,maximumof10.‚Each/*˜pagecanaccomodateapproximately25entries.*5IOV‡=1Œ#ofpagesinI/Ovectortable,minimumof1.4*˜Eachpagecanaccomodateapproximately12entries.2*˜ForeachvectorclaimedbyataskusingtheCISR3*˜directive(ConfigureInterruptServiceRoutine)a4*˜separateentryismadeintothistable.‚Thesystem1*˜imposesnomaximumsizeforthisparameter.‚For5*˜efficientuseofsystemspace,however,theformula)*˜forcomputingthetablesizeshouldbe:7*˜1+(C/12)where'C'isthenumberofdifferentvectors4*˜thattheuserexpectstoclaimviaCISRdirective.*!PAT‡=1+(3+\TOTTERM)/7#ofpages-*˜inperiodicactivationtable.‚Eachpagecan%*˜accomodateapproximately8entries.*šPATsizeis\PAT.*GNOTASKSƒ=6+(3*\TOTTERM)Maximumnumberoftasksinsystematonetime,0*˜minimumof1.‚VERSAdoscontainsamaximumof63*˜residenttasks.‚Allowingforthat,plusthreefor.*˜eachterminalwillaccomodatemostrequests.*šNOTASKS=\NOTASKS*CLUMAX…=\TOTDSK+3„Logicalunitnumbermaximum.‚LUMAXisatemporary5*˜symbolusedtosetthevalueofMAXLU,whichisthe2*˜maximumlogicalunitnumberthatcanbeassigned0*˜foreachtaskinthesystem.‚Restrictionsare:(*œ8<=LUMAX<=31‡(rangecheckedbelow)*œLUMAX>=TOTDSK3*˜NOTE:‚IfyouhaveanyVME300(GPIB)D boardsinthe)*Ÿsystemyouwillwanttoadd14toLUMAX/*ŸforeachVME300boardyouhaveinthesystem.7*˜ThemaximumlogicalunitnumberallowedinaVERSAdos3*˜systemis254.‚NotethatthePASCALcompilerwill6*˜onlygeneratecodethatuseslogicalunitnumbersas6*˜highas31.‚(Youmayhavemorelogicalunitsdefined7*˜foryoursystemhoweverevenifyouareusingPASCAL.*1*˜MAXLUiskepttotheminimumvaluetoallowour/*˜standardsysgenstoworkin384K.‚Ifyouwant2*˜more,changethe"+3"toaddwhateveradditional4*˜amountyouneed,orassignittoaspecificvalue.#*˜(The"+3"wasarbitarilychosen).1*˜MAXLUandNOTASKdeterminetheamountofmemory,*˜requiredforthelogicalunittable(LUT)./*˜ThealgorithmfordeterminingtheLUTsizeis *˜asfollows:&*œLUT=16*NOTASKS+8*NOTASKS*(MAXLU+1)+*˜TheremustbeoneLUforeachdiskvolume+*˜(FMSassignsadifferentlogicalunitfor+*˜eachdisk.)‚ThismeansthatMAXLUmustbe"*˜greaterthanorequaltoTOTDSK.IFGTˆ\LUMAX-254ƒMSG‰5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰LUMAXmustbe<=254.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFLTˆ\LUMAX-8ƒMSG‰5ƒMSG‰--------‚SYSGENparametersizewarning‚---------ƒMSG‰LUMAXmustbe>=8.'ƒMSG‰ForcingMAXLU=8andcontinuing... ƒMAXLU…=8ENDC IFGEˆ\LUMAX-8ƒMAXLU…=\LUMAXENDC**BNOFILESƒ=2*\NOTASKSƒMaximumnumberoffilesthatcanbeopenedin'*˜thesystematonetime.‚Limitof200.*@NODIFFIL‚=2*\NOTASKSƒMaximumnumberDIFFERENTfilesthatcanbe,*˜openedatonetime.‚Cannotbegreaterthan+*˜NOFILES.‚Foreverythreedifferentfiles,+*˜approximately1Kofmemoryisrequired.‚A$*˜ratioof5filesforeachterminal*˜accomodatesmostrequests.*>GST‡=(\NOFILES/14)+1Numberofpagesinglobalsegmenttable.(*˜Minumumof1,maximumof10.‚Eachpage**˜canaccomodateapproximately14entries.*F&DEFVOLƒ=2*\TOTTERMƒCompute#defaultvolumesforthesystem,minimum*˜is4.ƒ(SeeNODEFVOLbelow.)IFGTˆ\&DEFVOL-(\NOTASKS+3)5ƒMSG‰--------‚SYSGENparametersizewarning‚---------!ƒMSG‰&DEFVOLmustbe<=NOTASKS+31ƒMSG‰Forcing&DEFVOL=NOTASKS+3andcontinuing...ƒ&DEFVOLƒ=\NOTASKS+3ENDCIFLTˆ\&DEFVOL-45ƒMSG‰--------‚SYSGENparametersizewarning‚---------ƒMSG‰&DEFVOLmustbe>=4.)ƒMSG‰Forcing&DEFVOL=4andcontinuing... ƒ&DEFVOLƒ=4ENDC*ANODEFVOL‚=\&DEFVOL…Maximumnumberofdefaultvolumesthatcanbe,*˜defined.‚CannotbegreaterthanNOTASKS+3.*8DEFFAB„=1ŒDefaultFileAllocationBlock(FAB)lengthin.*˜sectors(256bytespersector).‚Usedbyfile,*˜handlerwhennoFABsizeisgiven.‚Minimum *˜sizeis1,maximumsizeis20.*:DEFDAT„=4ŒDefaultdatablocklengthinsectors(256bytes0*˜persector).‚Usedbyfilehandlerwhennodata.*˜blocksizeisgivenatfileallocationtime.)*˜Minumumsizeis4,maximumsizeis255. 3MSG‰***********************************************(MSG‰**ƒSYSGENparametersforterminalŠ**-MSG‰**ƒConfigurationparameters/attributes…**-MSG‰**ƒ(TCP=TerminalConfig.Parameters)…**3MSG‰***********************************************MSG‰FMSG‰******************************************************************EMSG‰**NOTE:‚Tomodifyasingleport(s),usethe"CONFIG"utility.**FMSG‰*******************************************************************1TCP$RECƒ=80‹Widthofterminal(characters/line).,TCP$RSZƒ=24‹Depthofterminal(lines/page).BTCP$WTOƒ=900000‡(15minutes)#ofmillisectoallowbeforetiming*˜outawrite.BTCP$RTOƒ=900000‡(15minutes)#ofmillisectoallowbeforetiming *˜outaread.=TCP$XOFƒ=$13ŠXOFFchar;whenreceived,suspendstransmission *˜(0=none).>TCP$XONƒ=0ŒXONchar;whenreceived,cancelsapriorXOFFchar*˜(0=anychar).?TCP$BRCƒ=$03ŠChartobeinterpretedlikeabreakwhenreceived *˜(0=none).;TCP$DOPƒ=$0FŠCharwhichcausesoutputtobediscardedwhen*˜received(0=none).9TCP$RLNƒ=$1AŠCharwhichcauseslinetoberD eprintedwhen*˜received(0=none).@TCP$CLCƒ=$18ŠCharwhichcauseslinetobedeletedwhenreceived *˜(0=none)..TCP$RTVƒ=$0DDE0000„Readterminators(CR,$DE)./TCP$EOLƒ=$0D0A0000„Endoflinestring(CR,LF).;TCP$BRTƒ=$0EŠBaudratecode($0E=9600baud).‚Thefollowing1*˜codesmaybeusedtosetthedesiredbaudrate.)*›Code‚RateƒCodeRateƒCodeRateƒCodeRate"*›$00ƒ50…$05‚300„$09‚2000ƒ$0E‚9600#*›$01ƒ75…$06‚600„$0A‚2400ƒ$0F‚19200#*›$02ƒ110„$07‚1200ƒ$0C‚4800ƒ$10-$FF&*›$03ƒ134.5‚$08‚1800ƒ$0D‚7200ƒReserved>TCP$NLSƒ=0Œ#ofASCIINULchar'stosendaftereachCRorLF.*TCP$TRCƒ=$00ŠTerminatorclass($0X=none).-TCP$TTPƒ=$00ŠTerminaltype(0=EXORterm155).I*‚Eachofthefollowingisaflag--theonlyallowablevaluesare0and1.=TCP$HCPY‚=0Œ1meanstheterminalisahardcopydevice,nota*˜CRT.7TCP$XCTL‚=0Œ1meansuseXON/XOFFtocontrolterminal's*˜transmission,notCTS.?TCP$BITS‚=0Œ1meanstransmit&receive7bits/charratherthan*˜8.;TCP$STPB‚=0Œ1meansfolloweachcharsentwith2stopbits*˜ratherthan1..RMS.LO *AMSG‰*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*INCLUDE…RMS.CIPROCESS…RMS.LOEND‰EXEC IFEQˆ\LINKLSWƒ=COPY‡RMS.LL,\WORKLS;AENDC IFNEˆ\SERFLAGAƒMSG‰************************************************************ƒMSG‰**‰Driverlibrary¡**AƒMSG‰************************************************************ƒINCLUDE…&.DRVLIB.CIAƒMSG‰************************************************************#ƒMSG‰**‰Genericterminallibrary—**E AƒMSG‰************************************************************ƒINCLUDE…&.TERMLIB.CIENDC @MSG‰************************************************************?MSG‰**‚MakeIOCgeneratorlinkchainfile(&.XIOCGEN.LG)for**?MSG‰**‚thissysgen(1timehereinsteadofforeachdriver).**@MSG‰************************************************************SUBSˆ&.IOCGEN.LG*M*----------------------------------------------------------------------------G*NOTE:‚Therestartoptiononsysgenshouldnotbesetfromheretothe?*ˆdefinitionofMEMBEG.‚ThisisbecausetheIOCfilegetsbuilt;*ˆdynamicallyandcannotbesplitupbytherestartoption.MSG‰@MSG‰************************************************************0MSG‰**‚Producestarting.IOC.ROfile.**:MSG‰**„Relocatablemodulesaddedasdriversareneeded.„**;MSG‰**„ASM&LINKlistingsbuiltaswegobeforeputtingƒ**#MSG‰**„inoutputfile(\WORKLS).›**@MSG‰************************************************************SUBSˆIOC.BEGIN.AG)ASM‰IOC.BEGIN.AG,IOC.RO,IOC.LIST.TF;RZ=70(*‚Abovecreates1stpartofASMlisting!*M*---------------------------------------------------------------------------- @MSG‰************************************************************+MSG‰**‹INCLUDEBOARD/SYSTEMDEPENDENCIESŒ**1MSG‰**‚Thisfilecontainsalltheboard/system**5MSG‰**‚dependenciesforthesystembeingsysgened.‹** MSG‰**¸**.SYSTEM.CIƒProcessorboard/system‹**&MSG‰**—dependenciesincludinglocal…**!MSG‰**—terminalsandprinters.Š**@MSG‰************************************************************INCLUDE…SYSTEM.CI @MSG‰************************************************************=MSG‰**‚Validateparametersabouttablesizes,etc.definedƒ**%MSG‰**‚in.SYSTEM.CIfile.›**@MSG‰************************************************************INCLUDE…&.VALPAR.CI FMSG‰******************************************************************DMSG‰**ƒINCLUDEDRIVERCONFIGURATIONfile-".CNFGDRVR.CI"**@MSG‰**Thissystemdependentfilecontainstheflagsthatare‡**BMSG‰**setupastowhichdrivers(anddevices)willbeincluded…***MSG‰**viathedriverconditionalfile.** MSG‰**¾**EMSG‰**Theusercaneditthisfiletocontrolwhichdevicedrivers‚**,MSG‰**willbebeincludedinthesysgen.›** MSG‰**¾**FMSG‰**Allitemspertainingtoindividualdriversareinindividual**EMSG‰**driverfilesoftype&.nnnnDRV.CIwhere"nnnn"istheboard‚**DMSG‰**numberordrivertype,i.e."M605"or"IPC".‚Thisfilecan‚**DMSG‰**beeditedbytheusertocustomconfigurefornon-standardƒ**MSG‰**hardware.´**FMSG‰******************************************************************INCLUDE…CNFGDRVR.CI FMSG‰******************************************************************@MSG‰**…INCLUDEDRIVERCONDITIONALfile-".IFDRVR.CI"ƒ**EMSG‰**‚Thisfileoperatesontheflagssetupinthedriverconfig-**?MSG‰**‚urationfiletoconditionallyincludespecificdevice‡**MSG‰**‚drivers.´**7MSG‰**‚Theusershouldneverhavetoeditthisfile.**FMSG‰******************************************************************INCLUDE…IFDRVR.CI M*----------------------------------------------------------------------------FMSG‰******************************************************************EMSG‰**‚ProduceendingIOC.ROfileandmergeintofinalIOC.ROfile**-MSG‰**…-NULLdrivermustbethelastone!–**FMSG‰******************************************************************MSG‰SUBSˆIOC.END.AG"ASM‰IOC.END.AG,NEW.RO,\ASMLS;RZ=70 IFEQˆ\ASMLSWƒ=COPY‡\ASMLS,IOC.LIST.TF;AENDC2*‚GeneratemergedIOC.RObyappendingnew.ROfileINCLUDE…&.IOCGEN.CI IFEQˆ\LINKLSWƒ=COPY‡\LINKLS,IOC.LIST.TF;AENDCIFEQˆ\ASMLSW+\LINKLSWƒ=COPY‡IOC.LE IST.TF,\WORKLS;AENDC=DELˆTEMP.RO/IOC.LIST.TF=DELˆ*.NEW.RO;Y*O*------------------------------------------------------------------------------$MEMBEG„=*ŒStartofavailablememory @MSG‰************************************************************;MSG‰**„INCLUDETASKCONFIGURATIONfile-"&.CNFGTASK.CI"ƒ**.VERSAPT.CFandmakeŠ**.MSG‰**‚substitutionswithsysgenparameters˜**FMSG‰******************************************************************!=COPY‡VERSAPT.END.CF,VERSAPT.CF;ASUBSˆVERSAPT.CF CMSG‰***************************************************************+MSG‰**‰ENDƒOFƒ"&.VERSADOS.CD"‚FILEŒ**CMSG‰**-----------------------------------------------------------**AMSG‰**‚Nowgoingtoprocess&build.VERSADOS.SYfile.‚**MSG‰**“Haveaniceday!˜**CMSG‰****************************************************************D*‚Defineabsoluteparametersfromtheredefineableoneswe'vebuilt.IOCBASEƒ=\&IOCBASETOTDSK„=\&TOTDSKTOTTERMƒ=\&TOTTERMPCDRV…=\&PCDRVSERFLAGƒ=\&SERFLAG END‰SYSGENéééééF é**ˆ&.INITGEN.CI*(* Build SYSINIT.RO in relocatable piecesLINKˆ&.SYSINGEN.LG=COPY‡TEMP.RO,SYSINIT.RO;Yééééééé¹* *ˆ&.ROGEN.CI*&* Build .RO file in relocatable piecesLINKˆ&.ROGEN.LG=COPY‡TEMP.RO,ROGEN.RO;Y IFEQˆ\LINKLSWƒ=COPY‡\LINKLS,\WORKLS;AENDCéééééF éé * *ˆ&.IOI.CI*?MSG‰***********************************************************MSG‰**ˆIOCOM&IOI¤**?MSG‰*********************************************************** 5* Build VERSAdos patch chain file .VERSAPT.CF!=COPY‡VERSAPT.IOI.CF,VERSAPT.CF;A TASKˆ&.IOI.LO,.IOISTATE…='READ'ATTRIB„='CRIT'ATTRIB„='SYST' SESSIONƒ=1PRIORITY‚=$DA IOCSTR„=* =COPY‡OSLIST.END.AG,OSLIST.AG;ASUBSˆOSLIST.AG#ASM‰OSLIST.AG,OSLIST.RO,\ASMLS;Z=80 IFEQˆ\ASMLSWƒ=COPY‡\ASMLS,\WORKLS;AENDC SUBSˆFMS.IOI.AG&ASM‰FMS.IOI.AG,FMS.IOI.RO,\ASMLS;RZ=83 IFEQˆ\ASMLSWƒ=COPY‡\ASMLS,\WORKLS;AENDC SUBSˆEET.START.AG&ASM‰EET.START.AG,EET.START.RO,\ASMLS;R IFEQˆ\ASMLSWƒ=COPY‡\ASMLS,\WORKLS;AENDC SUBSˆ&.ROMIOI1.AG'ASM‰&.ROMIOI1.AG,.&.ROMIOI1.RO,\ASMLS;R IFEQˆ\ASMLSWƒ=COPY‡\ASMLS,\WORKLS;AENDC IFNE…\$ROPT…IOCM="IOSF"…SUBSˆ&.IOI.LG ENDC IFEQ…\$ROPT…IOCM="IOSG"…SUBSˆ&.IOI.LG ENDC LINKˆ&.IOI.LG IFEQˆ\LINKLSWƒ=COPY‡\LINKLS,\WORKLS;AENDCEND‰IOIéééË:* *ˆ&.VALPAR.CI*-* Validate parameters about table sizes, etc.*IFLTˆ\DCQPGE-1ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰DCQPGEmustbe>=1.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDCIFGTˆ\DCQPGE-10ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰DCQPGEmustbe<=10.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFLTˆ\GST-1ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰GSTmustbe>=1.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFGTˆ\GST-20ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰GSTmustbe<=20.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFLTˆ\UST-1ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰USTmustbe>=1.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFGTˆ\UST-10ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚G -----------ƒMSG‰USTmustbe<=10.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFNEˆ\TRCFLAG ƒIFEQˆ\TRACE†MSG5†MSG‰--------‚SYSGENparametersizeerror‚-----------.†MSG‰TRACEmustbe>whenTRCFLAGisnon-zero.5†MSG‰Pleaseadjustparametersandstartsysgenagain.†ABORTƒENDCENDC IFLTˆ\UDR-0ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰UDRmustbe>=0.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFGTˆ\UDR-10ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰UDRmustbe<=10.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFLEˆ\IOVƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰IOVmustbe>0.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFLEˆ\NOTASKSƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰NOTASKSmustbe>0.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ÔXÝFƒABORT‡ENDC IFLTˆ\NOFILES-1ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰NOFILESmustbe>=1.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDCIFGTˆ\NOFILES-200ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰NOFILESmustbe<=200.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFLEˆ\NODIFFILƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰NODIFFILmustbe>0.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDCIFGTˆ\NODIFFIL-\NOFILESƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------!ƒMSG‰NODIFFILmustbe<=NOFILES.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFGTˆ\NODEFVOL-(\NOTASKS+3)ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------#ƒMSG‰NODEFVOLmustbe<=NOTASKS+3.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFLTˆ\DEFFAB-1ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰DEFFABmustbe>=1.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDCIFGTˆ\DEFFAB-20ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰DEFFABmustbe<=20.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDC IFLTˆ\DEFDAT-4ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰DEFDATmustbe>=4.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDCIFGTˆ\DEFDAT-255ƒMSG5ƒMSG‰--------‚SYSGENparametersizeerror‚-----------ƒMSG‰DEFDATmustbe<=255.5ƒMSG‰Pleaseadjustparametersandstartsysgenagain.ƒABORT‡ENDCé* *ˆ&.IFTASK.CI*FMSG‰******************************************************************$MSG‰**‚ProcessO/StasksasrequiredFMSG‰******************************************************************IFNEˆ\FHS$IOS$+\FMS$ƒSUBSˆGET.TASKID.AG)ƒASM‰GET.TASKID.AG,GET.TASKID.RO,\ASMLS;R ƒIFEQˆ\ASMLSW†=COPY‡\ASMLS,\WORKLS;AƒENDCENDCIFNEˆ\FHS$IOS$ƒINCLUDE…FHSIOS.VERSADOS.CIENDC IFNEˆ\FMS$ƒINCLUDE…FMS.VERSADOS.CIENDC IFNEˆ\EET$ƒINCLUDE…EET.VERSADOS.CIENDC IFNEˆ\LDR$ ƒIFNEˆ\MMU†INCLUDE…MMULDR.VERSADOS.CIƒENDC ƒIFEQˆ\MMU†INCLUDE…NOMMULDR.VERSADOS.CIƒENDCENDCG éééééå* *ˆ&.IOCGEN.CI*$* Build IOC.RO in relocatable piecesLINKˆ&.IOCGEN.LG=COPY‡TEMP.RO,IOC.RO;Yéééééééî**ˆ&.SYSINIT.CI*=*‹***********************************************************5*‹**‚SYSINIT--SystemInitializerforallsystemsˆ**=*‹*********************************************************** 5* Build VERSAdos patch chain file H .VERSAPT.CF%=COPY‡VERSAPT.SYSINIT.CF,VERSAPT.CF;A PROCESS…SYSINIT.LO INTSTR„=* '* SUBS the link files before using them*SUBSˆ&.ROGEN.LGSUBSˆ&.ROGEN.CI )*‚Assembleboarddependentinitialization=*….ROGEN.ROwillbelink/mergedtoproduceSYSINIT.LO*SUBSˆINITIO1.AG'ASM‰INITIO1.AG,INITIO1.RO,\ASMLS;RMZ=70 IFEQˆ\ASMLSWƒ=COPY‡\ASMLS,\WORKLS;AENDC H*‚Producestarting.ROGEN.ROmodule.‚All.NEW.ROmodulesI*‚willbelink/mergedintotheROGENmodulewhenthenbecomesSYSINIT.LO.*SUBSˆ&.INITIO1.LGLINKˆ&.INITIO1.LG IFEQˆ\LINKLSWƒ=COPY‡\LINKLS,\WORKLS;AENDC FMSG‰******************************************************************5MSG‰**‚CheckforVME316I/OChannel:‡Addinitializer?FMSG‰****************************************************************** IFNEˆ\NVME316ƒ=COPY‡&.INIT316.RO,NEW.RO;YƒINCLUDE…&.ROGEN.CIENDC FMSG‰******************************************************************:MSG‰**‚CheckforProcessControlDrivers:‚Addinitializer?FMSG‰****************************************************************** IFNEˆ\PCDRVƒIFEQˆ\IOCBASE6†MSG‰****FAIL:‚SYSTEMREQUIRESI/OCHANNELTORUNI/O(†MSG•CHANNELBOARDS!!‚FIND"&IOCBASE"IN%†MSG•.SYSTEM.CIFORMOREINFO†ABORT‡ƒENDCEƒ*„ChangebelowtotestindividualVME6xxbds.&mergeintheir.RO's0ƒ*„to&.ROGEN.ROtobuildSYSINIT.ROaswego!!!ƒINCLUDE…&.PCDRV.CIENDC MSG‰FMSG‰******************************************************************=MSG‰**‚AddendingINITcodeRTSanddata:‚Thismustbelast!!FMSG‰******************************************************************SUBSˆ&.INITDAT.AG&ASM‰&.INITDAT.AG,&.INITDAT.RO,\ASMLS;R IFEQˆ\ASMLSWƒ=COPY‡\ASMLS,\WORKLS;AENDC÷D SUBSˆSYSINIT.LGLINKˆSYSINIT.LG IFEQˆ\LINKLSWƒ=COPY‡\LINKLS,\WORKLS;AENDC END‰SYSINIT * Delete files no longer needed =DELˆROGEN.RO =DELˆTEMP.RO =DELˆNEW.RO éééééééH **ˆ&.CNFGTASK.CI*7MSG‰***************************************************(MSG‰**‚OPERATINGSYSTEMTASKSWITCHES**7MSG‰****************************************************AFHS$IOS$‚=1ŒSet=0forskipFHS/IOSmodule,not=0toincludeit9FMS$†=1ŒSet=0forskipƒFMSƒmodule,not=0toincludeit9EET$†=1ŒSet=0forskipƒEETƒmodule,not=0toincludeit9LDR$†=1ŒSet=0forskipƒLDRƒmodule,not=0toincludeitéééééé  **ˆ&.M316DEF.CI*GMSG‰*******************************************************************7MSG‰**…MVME316DRIVER-VMEbustoI/OChannelInterfaceGMSG‰******************************************************************* H*NOTE:‚WedonotdirectlysupportusageoftheVME316boardasasecond=*ˆI/OchannelwhentheCPUcardalreadyhasone.‚Youwillget?*ˆduplicateparametererrorson"CMULT","IOCBASE",andallthe:*ˆ"Lxxx$nn"'sinthe"IOC.ADDRESS.CI"fileifyoudothis.<*ˆ(Theotherreferenceisinthe".SYSTEM.CI"file).**ˆToaddasecondI/Ochannel::*Œ1.Remove"CMULT"and"IOC.ADDRESS.CI"linesfrombelow.A*Œ2.Change"IOCBASE"to"IOC316"andsettotheaddressdesired.@*Œ3.Changethe"IOC.ADDRESS.CI"filetouse"IOC316"insteadof*"IOCBASE"wheredesired. 6CMULT…=2ŒI/Ochannelmultiplier(seeIOC.ADDRESS.CI):,*œ=1forIOCrundirectlyontheMC68020or,* MC68008addressbusofauser'scustomCPU$* board(becauseofbyteaddressing).*œ=2forallotherswherebyteaddressisnot,* available(onlyoddaddressesareused)or(* ifrunningtheIOCfromaVME316board*9&IOCBASE‚=$FFE000†BaseaddressofI/OchannelforVME3168INCLUDE…IOC.ADDRESS.CIgetI/OchanneladdressesoffsetsééI é =/* =/*†&.EET.LG=/*2=/* Link chain file run at sysgen time to link EET=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*G=/* Sysgen parameter EETSTR = \EETSTR = address at which to link driver=/*=LINK ,&.EET.LO,\LINKLS;HAMIXSSEGMENT .EET:0 \EETSTRSEGMENT .STT(G):1SEGMENT &EET(RG):8,14INPUT &.DAT.ROINPUT &.CMDLIST.ROINPUT &.EET.ROINPUT &.SCTSASR.ROINPUT &.USM.ROINPUT &.SYSCNTRL.ROLIB &.USMOPT.ROLIB &.UTILIB.ROEND=/*=ENDééééé =/* =/*†&.FHS.LG=/*2=/* Link chain file run at sysgen time to link FHS=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*G=/* Sysgen parameter FHSSTR = \FHSSTR = address at which to link driver=/*=LINK ,&.FHS.LO,\LINKLS;HAMIXSSEGMENT .FHS:0 \FHSSTRINPUT DEVICE.FHS.ROINPUT FILE.FHS.ROINPUT GET.TASKID.ROINPUT FHS.IXR.ROEND=/*=ENDéééI ééé #=/* =/*†&.FMS.LG=/*2=/* Link chain file run at sysgen time to link FMS=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*G=/* Sysgen parameter FMSSTR = \FMSSTR = address at which to link driver=/*=LINK ,&.FMS.LO,\LINKLS;HAMIXSEGMENT .FMS:0 \FMSSTRINPUT &.FFHS.ROINPUT &.FIOS.ROINPUT &.FUTY.ROINPUT &.FIOM.ROINPUT &.FDTA.ROINPUT FMS.IXR.ROINPUT GET.TASKID.ROEND=/*=ENDéééééé ,=/*=/*†&.IOCGEN.LG=/*K=/* Link chain file run at sysgen time to link IOC.RO in relocatable pieces=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*=LINK ,TEMP.RO,\LINKLS;RI INPUT IOC.RO INPUT NEW.ROEND=/*=ENDéJ ééééé 5' IOI LG J JqqIOS LG S SqqROGEN LG \ \ qqINITIO1 LG e e qqSYSINIT LG n nqqMTYPE SI w w qqF5DDDSI SI € €qqF8DDDSI SI ‰ ‰qqF8SDDSM SI ’ ’qqF8SDSSI SI › ›qqF8SDSSM SI ¤ ¤qqFXCMD16 SI ­ ­qqFXCMD80 SI ¶ ¶qqFXLRK08 SI ¿ ¿qqFXLRK25 SI È ÈqqH5WIN05 SI Ñ ÑqqH5WIN10 SI Ú ÚqqH5WIN15 SI ã ãqqH5WIN40 SI ì ìqqH8WIN10 SI õ õqq=/* =/*†&.IOI.LG=/*2=/* Link chain file run at sysgen time to link IOI=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*G=/* Sysgen parameter IOCSTR = \IOCSTR = address at which to link driver=/*=LINK ,&.IOI.LO,\LINKLS;HAMIXSSEGMENT \IOCM:0 \IOCSTRSEGMENT .IOI:1 INPUT IOC.ROINPUT &.IOI.ROINPUT OSLIST.ROINPUT FMS.IOI.ROINPUT &.ROMIOI1.ROINPUT EET.START.ROLIB &.ROMIOI90.ROEND=/*=ENDééééJ éé B=/* =/*†&.IOS.LG=/*2=/* Link chain file run at sysgen time to link IOS=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*G=/* Sysgen parameter IOSSTR = \IOSSTR = address at which to link driver=/*=LINK ,&.IOS.LO,\LINKLS;HAMIXSSEGMENT .IOS:0 \IOSSTRINPUT DEVICE.IOS.ROINPUT FILE.IOS.ROINPUT GET.TASKID.ROEND=/*=ENDéééééé K=/*=/*†&.ROGEN.LG=/*J=/* Link chain file run at sysgen time to link new .RO modules to ROGEN.RO=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*=LINK ,TEMP.RO,\LINKLS;RIINPUT ROGEN.RO INPUT NEW.ROEND=/*=ENDééK éééé T=/*=/*†&.INITIO1.LG=/*E=/*Importantnote:‚TheorderoftheINPUTmodulesforthisLINKmust=/*’beasspecifiedbelow.=/*=LINK ,ROGEN.RO,\LINKLS;IXHMRINPUT M68XXX.INIT.ROINPUT INITIO1.ROEND=/*=ENDééééééé ] =/*=/*†&.SYSINIT.LG=/*L=/* Link chain file run at sysgen time to link SYSINIT.LO with no PREINIT.RO=/*D=/* Sysgen parameter LINKLS = \LINKLS = file/device to which to send=/* the linker listing=/*?=/* Sysgen parameter PC = \PC = address at which to link driver=/* =LINK ,SYSINIT.LO,\LINKLS;HAMIXSSEG .INT:8 \PCINPUT ROGEN.ROINPUT &.INITDAT.ROINPUT &.SYSPAR.ROEND=/*=ENDK éééééé f;* &.MTYPE.SI - Memory type assignments for standard systems**‚SystemmemoryMTYPE$SRO‚EQUMTYP0readonlyMTYPE$SRW‚EQUMTYP0read/write* *‚UsermemoryMTYPE$URO‚EQUMTYP0readonlyMTYPE$URW‚EQUMTYP0read/write**‚PartitiontypesMTYPE$P0ƒEQUMTYP0partition#0MTYPE$P1ƒEQUMTYP0partition#1éééééé o L O******************************************************************************* *ƒF5DDDSI.SI*J*ƒDCBvaluesfor51/4"Floppydisk,doubledensity,doublesided,IBMfmtO********************************************************************************ATT_WORD‹SET‡$004FSECT_PER_TRACK…SET‡16NUM_HEADSŠSET‡2CYL_DISK‹SET‡80SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡80PRE_COMP‹SET‡40SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡0éééééé xO******************************************************************************* *ƒF8DDDSI.SI*F*ƒDCBvaluesfor8"Floppydisk,doubledensity,doublesided,IBMfmtO********************************************************************************ATT_WORD‹SET‡$020DSECT_PER_TRACK…SET‡26NUM_HEADSŠSET‡2CYL_DISK‹SET‡77SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡77PRE_COMP‹SET‡38SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡44éééééL é O******************************************************************************* *ƒF8SDDSM.SI*K*ƒDCBvaluesfor8"Floppydisk,singledensity,doublesided,MotorolafmtO********************************************************************************ATT_WORD‹SET‡$0204SECT_PER_TRACK…SET‡26NUM_HEADSŠSET‡2CYL_DISK‹SET‡77SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡128START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡77PRE_COMP‹SET‡38SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡44éééééé ŠO******************************************************************************* *ƒF8SDSSI.SI*F*ƒDCBvaluesfor8"Floppydisk,singledensity,singlesided,IBMfmtO********************************************************************************ATT_WORD‹SET‡$0208SECT_PER_TRACK…SET‡26NUM_HEADSŠSET‡2CYL_DISK‹SET‡77SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡128START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡77PRE_COMP‹SET‡38SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡44éééM ééé “O******************************************************************************* *ƒF8SDSSM.SI*K*ƒDCBvaluesfor8"Floppydisk,singledensity,singlesided,MotorolafmtO********************************************************************************ATT_WORD‹SET‡$0200SECT_PER_TRACK…SET‡26NUM_HEADSŠSET‡2CYL_DISK‹SET‡77SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡128START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡77PRE_COMP‹SET‡38SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡44éééééé œO******************************************************************************* *ƒFXCMD16.SI*5*ƒDCBvaluesforfixedCMDdisk,16megabytecapacityO********************************************************************************ATT_WORD‹SET‡$10SECT_PER_TRACK…SET‡64NUM_HEADSŠSET‡1CYL_DISK‹SET‡823SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡16CYL_DRIVEŠSET‡823PRE_COMP‹SET‡0SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡0éM ééééé ¥O******************************************************************************* *ƒFXCMD80.SI*5*ƒDCBvaluesforfixedCMDdisk,80megabytecapacityO********************************************************************************ATT_WORD‹SET‡$10SECT_PER_TRACK…SET‡64NUM_HEADSŠSET‡5CYL_DISK‹SET‡823SPIRAL_OFF‰SET‡2BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡16CYL_DRIVEŠSET‡823PRE_COMP‹SET‡0SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡0éééééé ®O******************************************************************************* *ƒFXLRK08.SI*5*ƒDCBvaluesforfixedLARKdisk,8megabytecapacityO********************************************************************************ATT_WORD‹SETN ‡$90SECT_PER_TRACK…SET‡64NUM_HEADSŠSET‡2CYL_DISK‹SET‡206SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡2CYL_DRIVEŠSET‡206PRE_COMP‹SET‡0SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡0éééééé ·O******************************************************************************* *ƒFXLRK25.SI*6*ƒDCBvaluesforfixedLARKdisk,25megabytecapacityO********************************************************************************ATT_WORD‹SET‡$90SECT_PER_TRACK…SET‡64NUM_HEADSŠSET‡2CYL_DISK‹SET‡624SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡2CYL_DRIVEŠSET‡624PRE_COMP‹SET‡0SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡0ééééééN  ÀO******************************************************************************* *ƒH5WIN05.SI*A*ƒDCBvaluesfor51/4"Winchesterharddisk,5megabytecapacityO********************************************************************************ATT_WORD‹SET‡$0010SECT_PER_TRACK…SET‡32NUM_HEADSŠSET‡2CYL_DISK‹SET‡306SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡306PRE_COMP‹SET‡153SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡307éééééé ÉO******************************************************************************* *ƒH5WIN10.SI*B*ƒDCBvaluesfor51/4"Winchesterharddisk,10megabytecapacityO********************************************************************************ATT_WORD‹SET‡$0010SECT_PER_TRACK…SET‡32NUM_HEADSŠSET‡4CYL_DISK‹SET‡306SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡306PRE_COMP‹SET‡153SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡307ééééO éé ÒO******************************************************************************* *ƒH5WIN15.SI*B*ƒDCBvaluesfor51/4"Winchesterharddisk,15megabytecapacityO********************************************************************************ATT_WORD‹SET‡$0010SECT_PER_TRACK…SET‡32NUM_HEADSŠSET‡6CYL_DISK‹SET‡306SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡306PRE_COMP‹SET‡153SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡307éééééé ÛO******************************************************************************* *ƒH5WIN40.SI*B*ƒDCBvaluesfor51/4"Winchesterharddisk,40megabytecapacityO********************************************************************************ATT_WORD‹SET‡$0010SECT_PER_TRACK…SET‡32NUM_HEADSŠSET‡6CYL_DISK‹SET‡830SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡830PRE_COMP‹SET‡400SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡831ééO éééé äO******************************************************************************* *ƒH8WIN10.SI*>*ƒDCBvaluesfor8"Winchesterharddisk,10megabytecapacityO********************************************************************************ATT_WORD‹SET‡$0210SECT_PER_TRACK…SET‡32NUM_HEADSŠSET‡4CYL_DISK‹SET‡256SPIRAL_OFF‰SET‡0BYTES_PER_SECTORƒSET‡256START_HEAD_NUM…SET‡0CYL_DRIVEŠSET‡256PRE_COMP‹SET‡128SECT_DRIVE‰SET‡0STEP_RATEŠSET‡0R_W_PRE_COMP‡SET‡257éééééé íéé