;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003B ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7  ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2  ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003B ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFD ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿÿWC ÿ=10 ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿ ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000  ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 PTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24  ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿDCN .GLOBL ÿDCN ; ÿEMT ÿ51 ;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;; STACK ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿDEL .GLOBL ÿDEL ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;UP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿLUK .GLOBL ÿLUK ; ÿTHIS ÿROUTINE IS THE FILE LOOKUP ROUTINE FOR DISK AND ; ÿDECTAPE. CALLING SEQUENCE: ; ÿMOV ÿ#FNBADR,-(R6) ; ÿMOV ÿ#LNKBLKADR,-(R6) ; ÿMOV ÿ@LINKBLK,R0 ; ÿMOV ÿR6,R1 ; ÿSUB ÿ#14,R6 ÿ ; ÿEMT ÿ46 ; ÿIT IS NECESSARY TO SUB 14 FROM THE STACK BECAUSE LUKUP ; ÿRÿ.DELETE ÿ=21 ÿ.WRITMAP=50 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿALO .GLOBL ÿALO ÿ ÿ; ALLOC ÿFIB ÿ=R2 ALLOC: ÿ177400 ÿ ÿ ÿ;COMMON CODE TO MOVE CODE ÿ ÿ ÿ ÿ; FLAG FOR SAM.....NON REENTRANT,0 ALO: ÿADD ÿPC,R5 ÿ ÿ; R5=177776 VIA SAM ÿTST ÿ-(R5) ÿ ÿ; LOOK  FOR A CONTIGUOUS DISK DELETE ; ÿ ÿBM BLOCK OR 0 ; ÿ ÿBM BUF OR 0 ; ÿ ÿNEW BM BUFFER ; ÿ ÿRTN PC ; ÿ ÿRTN STATUS ; ÿ ÿORIG BLOCK (DIR) ; ÿ ÿORIG BUFADR (DIR) ; ÿ ÿADR DIR ENTRY ; ÿ ÿFIL ; ÿ ÿNAM ; ÿ ÿEXT ÿ ÿ;UIC ; ÿ ÿPCODE/MODE ; ÿ ÿ;RTN TO MON DELCONTIG: 177400 ÿ ÿ ÿ; FLAG FOR MON DCN: ÿTST ÿ6(R6) ÿ ÿ;IS IT DECTAPE? ÿBPL ÿDCN00 ÿ ÿ;NO - BRANCH ÿJMP ÿDTDCN ÿ ÿ;GO TO DECTAPE DELETE DCN00: ÿMOV ÿ@#S.RRES,R5 ÿJSR ÿR5,@R5 ÿ ÿ ÿ; RESTORE REGS ÿMOV ÿR2,-(R6) ÿ ÿ; PUSH ADR BM BUFFER;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; DELETE ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DELETE: ÿ177400 ÿ ÿ ÿ;COMMON CODE TO MOVE CODE ÿ ÿ ÿ ÿ; FLAG FOR SAM.....NON REENTRANT,0 DEL: ÿADD ÿPC,R5 ÿ ÿ; R5=177776 VIA SAM ÿSUB ÿ#14,R6 ÿ ÿ; MAKE ROOM FOR ARGS ÿTST ÿ-(R5) ÿ ÿ; LOOK AT FIRST WRD OF CODE ÿTSTB ÿ@R5 ÿ ÿ; IN SWAP BUFFER? ÿETURNS ARGUMENTS THERE AS FOLLOWS: ; ÿIF ÿ@R6=-1.....THEN NO UIC ; ÿIF ÿ@R6=-2 ÿ...THEN NO FILE ; ÿIF ÿ@R6=-3.....THEN NO UFD ; ÿIF @R6 EQ ANYTHING ELSE, THEN IT POINTS TO THE CORE ADR ; ÿOF THE DIR ENTRY. ; ÿ ÿ2(R6)=FIL ; ÿ ÿ4(R6)=NAM ; ÿ ÿ6(R6)=EXT ; ÿ ÿ10(R6)=UIC ; ÿ ÿ12(R6)=PCODE ; ÿFUTURE VERSIONS OF THIS ROUTINE WILL MODIFY THE FNB ; ÿTHOSE USERS WHO DON'T FEEL LIKE DECODING THE DIR ENTRY ; ÿSHOULD DO A DIRECTORY SEARCH (EMT 14) INSTEAD OF A LUKUP ; EMT44 AT FIRST WRD OF CODE ÿTSTB ÿ@R5 ÿ ÿ; IN SWAP BUFFER? ÿBEQ ÿAOPNO ÿ ÿ ÿ; IF RESIDENT THEN SKIP ÿMOV ÿ#20,-(R6) ÿ; DISK RESIDENT. GET A BUFFER ÿMOV ÿ@#GETBUF,R4 ÿJSR ÿR5,@R4 ÿMOV ÿ(R6)+,R3 ÿ; PUT ADR INTO R3 ÿBEQ ÿANOBUF ÿ ÿ; NO BUFFER ÿMOV ÿR3,R4 ÿ ÿ; LOOP TO DO THE MOVE ÿMOV ÿR5,R2 ÿMOV ÿ(R2)+,(R3)+ ÿINC ÿ@R4 ÿBLE ÿ.-4 ÿSUB ÿR2,R3 ÿ ÿ ÿ; FIRST WORD NOW EQ 1 ÿADD ÿR3,PC ÿ ÿ; GO BABY ÿCLR ÿ@R5 ÿCLR ÿ-(R5) AOPNO: ÿMOV ÿ-(R0),R4 ÿ ÿ; IMMED EXIT IF NOT FS DEV ÿCMP ÿ(R0)+,(R ÿMOV ÿR0,R1 ÿ ÿ ÿ; R1 POINTS TO 6(R6) ÿADD ÿ#6,R1 ÿCLR ÿ@R2 ÿ ÿ ÿ; ZERO THE LINK WORD ÿMOV ÿR2,(R1)+ ÿ ÿ; SET BUFADR IN DDB ÿMOV ÿ@R1,14(R6) ÿ ÿ;SAVE ORIG WC ÿMOV ÿ#-2,@R1 ÿ ÿ;SET TO XFR TWO WORDS (RP) ÿCMP ÿ-(R1),-(R1) ÿ;POINTER DDB+BLOCK ÿMOV ÿ12(R6),R5 ÿ ÿ; GET ADR DIR ENTRY ÿMOV ÿ12(R5),@R1 ÿ ÿ; SET BLOCK = START BLK ÿMOV ÿ14(R5),R4 ÿ ÿ; R4 = LENGTH ÿBEQ ÿDCDUN1 ÿ ÿ;EXIT IF LENGTH = 0 DECLUP: ÿJSR ÿPC,DCWRIT1 ÿ ÿ; BAM ÿINC ÿ@R1 ÿ ÿ ÿ; INC BLK COUNTER ÿDEC ÿR4 ÿ ÿ ÿ; DEC COUÿBEQ ÿDELET1 ÿ ÿ ÿ; IF RESIDENT THEN SKIP ÿMOV ÿ#20,-(R6) ÿ; DISK RESIDENT. GET A BUFFER ÿMOV ÿ@#GETBUF,R4 ÿJSR ÿR5,@R4 ÿMOV ÿ(R6)+,R3 ÿ; PUT ADR INTO R3 ÿBNE ÿDEL00 DNOBUF: ÿMOV ÿ@R1,R4 ÿMOV ÿ#NOBUFR,R3 ÿ;PUT ERROR CODE IN R3 ÿBR ÿDERX2 DEL00: ÿMOV ÿR3,R4 ÿ ÿ; LOOP TO DO THE MOVE ÿMOV ÿR5,R2 ÿMOV ÿ(R2)+,(R3)+ ÿINC ÿ@R4 ÿBLE ÿ.-4 ÿSUB ÿR2,R3 ÿ ÿ; FIRST WORD NOW EQ 1 ÿADD ÿR3,PC ÿ ÿ; GO BABY ÿCLR ÿ@R5 ÿCLR ÿ-(R5) DELET1: ÿTSTB ÿ12(R0) ÿ ÿ;IS DATASET BUSY? ÿBMI ÿDERR14 ÿ LOOKUP: ÿ177400 ÿ ÿ ÿ; FLAG FOR SAM...NON REENTRANT,0 LUK: ÿMOV ÿ@R6,R0 ÿ ÿ ÿ; RESTORE R0 ÿMOV ÿ2(R6),R1 ÿ;GET POINTER TO ARGS ÿ ÿ ÿ ÿ; FIND ORIG R1 ÿTST ÿ(R1)+ ÿ ÿ; PUSH F.N.BLK ÿMOV ÿ@R1,R5 ÿ ÿ ÿ; GET THE ADDRESS ÿMOV ÿR6,R2 ÿADD ÿ#22,R2 ÿMOV ÿ(R5)+,(R2)+ ÿ ÿ; FIL ÿMOV ÿ(R5)+,(R2)+ ÿ ÿ; NAM ÿMOV ÿ(R5)+,(R2)+ ÿ ÿ; EXT ÿMOV ÿ(R5)+,(R2)+ ÿ ÿ; UIC ÿMOV ÿ(R5)+,(R2)+ ÿ ÿ; P CODE ÿSUB ÿ#12,R2 ÿMOV ÿDATPTR(BIBREG),DATREG ÿ; IS THERE AN ASSIGNMENT? ÿ ÿBEQ ÿNONE ÿ ÿ ÿ; NOPE ÿCMP ÿ4)+ ÿ;SET PROPER POINTERS ÿMOV ÿ@R4,R4 ÿBMI ÿALO1 ÿMOV ÿ#-1,24(R6) ÿ;SET SUCCESS CODE ÿJMP ÿAEXIT ALO1: ÿMOV ÿ#1,-(R6) ÿ ÿ; GET A FIB AND A BUFFER ÿEMT ÿ.SETUPFIB ÿMOV ÿFIBLNK(R0),FIB ÿBEQ ÿANOBUF ÿ ÿ ÿ; TOO BAD ÿSUB ÿ#14,R6 ÿ ÿ ÿ; MAKE ROOM FOR ARGS ÿEMT ÿ.LOOKUP ÿ ÿ ÿ; LOOKUP ÿMOV ÿ(R6)+,R5 ÿ ÿ; GET RTN ARG FROM LUKUP ÿMOV ÿR6,R3 ÿ ÿ ÿ; CK FOR ILLEGAL FNAME ÿMOV ÿ(R3)+,-(R6) ÿBIS ÿ(R3)+,@R6 ÿBIS ÿ(R3)+,(R6)+ ÿBEQ ÿAERR15 ÿ ÿ ÿ; BR IF ERROR ÿMOV ÿR0,R3 ÿ ÿ ÿ; SET R3NTER ÿBNE ÿDECLUP ÿ ÿ ÿ; LOOP IF NOT DONE DCZBM: ÿMOV ÿ-2(R0),R4 ÿMOV ÿMFDPTR(R4),(R1)+ ÿMOV ÿ14(R6),WC(R0) ÿJSR ÿPC,DCREAD1 ÿ;READ 1ST MFD BLOCK ÿMOV ÿ#177700,WC(R0) ÿ;SET FOR 64 WORD XFRS ÿMOVB ÿUNIT(R0),R5 ÿBIC ÿ#177770,R5 ÿASL ÿR5 ÿADD ÿ#BMPTR,R5 ÿ;POINTER PROPER FIB CHAIN ÿADD ÿR4,R5 ÿMOV ÿ@R5,R5 ÿ ÿ;IS A BIT MAP IN CORE? ÿBNE ÿDCBMIN ÿ ÿ;YES - BRANCH ÿCLR ÿ-(R6) ÿCLR ÿ-(R6) ÿ ÿ;INDICATE NO BIT MAP ÿTST ÿ-(R1) ÿ ÿ;POINTER DDB+BLOCK ÿBR ÿDCZGO DCBMIN: ÿMOV ÿ-(R5),R5ÿ ÿ;YES - ERROR #14 ÿMOV ÿ-(R0),R3 ÿ;IMMEDIATE EXIT IF DEVICE IS ÿCMP ÿ(R0)+,(R3)+ ÿ;NOT FILE STRUCTURED ÿMOV ÿ@R3,R3 ÿ ÿ;IS THIS THE CASE? ÿBPL ÿDELEXIT ÿ ÿ;YES - BRANCH ÿMOV ÿ#1,-(R6) ÿ ÿ; GET A FIB AND A BUFFER ÿEMT ÿ.SETUPFIB ÿTST ÿFIBLNK(R0) ÿ ÿ; GET ONE? ÿBEQ ÿDNOBUFF ÿ ÿ; NOPE ÿEMT ÿ.LOOKUP ÿ ÿ; LOOKUP...FILE EXIST? ÿMOV ÿ#2,R5 ÿ ÿ;PREPARE ERROR CODE #2 ÿCMP ÿ@R6,#-3 ÿBHIS ÿDERXIT ÿ ÿ; TOO BAD ÿCMP ÿ(R5)+,(R5)+ ÿ;PREPARE ERROR CODE #6 ÿMOV ÿ@R6,R4 ÿ ÿ ÿ; CHECK ACCEÿ(DATREG)+,(DATREG)+ ÿ; GET WD CNT FROM DAT ÿMOVB ÿ@DATREG,R5 ÿBEQ ÿNONE ÿ ÿ ÿ; IF NONE NO FILE ASS. ÿTST ÿ(DATREG)+ ÿ ÿ; MOVE TO FILNAM ÿMOV ÿR2,-(R6) ÿ ÿ; SAVE FOR NOW ÿTST ÿ@DATREG ÿ ÿ;IS FIRST WORD NULL? ÿBNE ÿLOOK1 ÿ ÿ;NO - THEN HAVE A FILENAME ÿMOV ÿ6(DATREG),6(R2) ÿ;ONLY A UIC IS THERE ÿBR ÿLOOK3 LOOK1: ÿCLR ÿ2(R2) ÿ ÿ;DEFAULT REST OF FILENAME ÿCLR ÿ4(R2) ÿ ÿ;AND EXTENT LOOK2: ÿMOV ÿ(DATREG)+,(R2)+ ÿ;MOVE THE SPECIFIED STUFF IN ÿDEC ÿR5 ÿBNE ÿLOOK2 LOOK3: ÿMOV ÿ(R6)+,R2 ÿ;R EQ #DDB+4 ÿCMP ÿ(R3)+,(R3)+ ÿCMP ÿR5,#-3 ÿ ÿ ÿ; SEE IF FILE EXISTS ÿBLO ÿAERR2 ÿ ÿ ÿ; ERR #2 IF IT DOES ÿCMP ÿR5,#-2 ÿ ÿ ÿ; SEE IF NO UIC ÿBHI ÿAERR13 ÿ ÿ ÿ; ERR #13 IF NO UIC ÿBEQ ÿASEMPTY ÿ ÿ ÿ; ALL SET .FIND A SLOT ÿJSR ÿPC,AGTBLK ÿ;GET FIRST UFD BLOCK ÿMOV ÿ@R2,@MYWORD(R0) ÿ;PUT UFD BLOCK IN ÿJSR ÿPC,AOPNOWRIT1 ÿ ÿ; NOW WRITE MFD BLOCK ÿMOV ÿ@R2,@R3 ÿ ÿ;GET AT UFD BLOCK ÿBR ÿAADDTWO ASEMPTY: MOV ÿMYWORD(R0),R5 ÿ ÿ; GET BLK NUM OF EMPTY SLOT ÿBEQ ÿAADDONE ÿ ÿ ÿ; TOO BAD.! ÿ;GET BIT MAP BUF ADDR ÿMOV ÿR5,-(R6) ÿ;SAVE IT ÿMOV ÿR5,@R1 ÿ ÿ;PUT IN DDB ÿMOV ÿ2(R5),R4 ÿADD ÿ6(R5),R4 ÿDEC ÿR4 ÿ ÿ;GET BIT MAP BLOCK ÿMOV ÿR4,-(R6) ÿ;SAVE IT ÿMOV ÿR4,-(R1) ÿ;PUT IN DDB ÿJSR ÿPC,DCWRIT1 ÿ;WRITE THE MAP ÿ ÿ; COMPUTE THE MAP NUMBER CORRESPONDING TO THE ÿ ÿ; STARTING BLOCK OF THE FILE DCZGO: ÿMOV ÿ16(R6),R4 ÿ ÿ; GET FILE DIR ADR ÿMOV ÿ12(R4),-(R6) ÿ ÿ; PUSH START BLK ÿ ÿ; ÿMOV ÿR2,R3 ÿADD ÿ#6,R3 ÿ ÿ ÿ;R3 NOW POINTS TO BLOCK ÿ ÿ ÿ ÿ ÿ;ADR OF FIRST MAP "SS PRIVELEGE ÿ ÿ ÿ ÿ; PUSH ARGS.... ÿMOV ÿ10(R6),-(R6) ÿ;UIC ÿMOV ÿ20(R4),-(R6) ÿ;PROTECT CODE ÿCLR ÿ-(R6) ÿ ÿ;TYPE ACCESS DESIRED ÿCLR ÿ-(R6) ÿ ÿ; FLG ÿEMT ÿ.CKACSP ÿ ÿ; CK AXS PRIV ÿTST ÿ(R6)+ ÿBNE ÿDERXIT ÿ ÿ; BAD GUY ÿTSTB ÿ10(R4) ÿ ÿ;IS FILE OPEN? ÿBNE ÿDERR14 ÿ ÿ;YES - ERROR #14 ÿMOV ÿ#20,-(R6) ÿ ÿ; GET A BUFFER ÿMOV ÿ@#GETBUF,R5 ÿJSR ÿR5,@R5 ÿMOV ÿ(R6)+,R2 ÿBEQ ÿDNOBUFF ÿMOV ÿBUFADR(R0),-(R6) ÿMOV ÿBLOCK(R0),-(R6) ÿASL ÿR3 ÿ ÿ ÿ; IS THIS DT? ÿBMI ÿDELDTA ÿ ÿ;#ESTORE R2 NONE: ÿTST ÿ6(R2) ÿ ÿ ÿ; SET UIC IF NECESSARY ÿBNE ÿNONE0 ÿMOV ÿ@#UIC,6(R2) ÿBEQ ÿNOUIC ÿ ÿ ÿ; IF UIC ON STACK IS STILL ÿ ÿ ÿ ÿ ÿ; ZERO,THEN HE DIDN'T LOGIN NONE0: ÿMOV ÿR2,R4 ÿ ÿ;GO TO NO FILE IF THE ÿMOV ÿ(R4)+,-(R6) ÿ;FILE NAME IS 00.0 ÿBIS ÿ(R4)+,@R6 ÿBIS ÿ@R4,(R6)+ ÿBNE ÿ.+6 ÿJMP ÿNOFIL2 ÿMOV ÿ-2(BIBREG),R4 ÿMOV ÿMFDPTR(R4),R5 ÿ ÿ; GET ADR MFD. THE FOLLOWING ÿ ÿ ÿ ÿ; SPECIAL CASE LOGIC ELIMINATES TWO ÿ ÿ ÿ ÿ; DT READS ON MFD#1. FOR THOSE USERS ÿ ÿ ÿ ÿ; WHO DO$GO GET ONE ÿ ÿ ÿ ÿ ÿ; REMEMBER THAT LUKUP ÿ ÿ ÿ ÿ ÿ; SETS MYWORD AND MINE2 ÿMOV ÿR5,@R3 ÿ ÿ; GET THE BLK NUM ÿMOV ÿMINE2(R0),R2 ÿ ÿ; SET R2 EQ ADR ENTRY ÿJSR ÿPC,AOPNOREAD1 ÿ ÿ; READ IT ÿBR ÿAOP03 ÿÿ ÿ ÿ; SET UP AN ENTRY AADDONE: ASL ÿR4 ÿ ÿ ÿ; R4 STILL EQ DRIVER+2 ÿ ÿ ÿ ÿ ÿ; SEE IF THIS ID DT ÿBMI ÿAERR12 ÿ ÿ ÿ; ERR #12 IF IT IS ÿJSR ÿPC,AGTBLK ÿ;GET ANOTHER UFD BLOCK ÿMOV ÿ@FIB,@BUFADR(R0) ÿ; LINK IT ÿJSR ÿPC,AOPNOWRIT1 ÿMOV ÿ@FIB,@R3 ÿMOV ÿR1,@FIB ÿ; SAVE R1. USED AS A POINTE%ÿCMP ÿ@R6,#960. ÿBLO ÿDCZG1 ÿSUB ÿ#960.,@R6 ÿTST ÿ(R3)+ ÿBR ÿ.-14 DCZG1: ÿMOV ÿ@R3,(R1)+ ÿMOV ÿR2,@R1 ÿJSR ÿPC,DCREAD1 ÿ ÿ;READ MAP ÿ ÿ ÿ ÿ ÿ;@R6=WORD ÿMOV ÿ@R6,R4 ÿ ÿ ÿ;CONVERT BLOCK TO A BIT ÿBIC ÿ#177760,R4 ÿMOV ÿ#1,R5 ÿDEC ÿR4 ÿBMI ÿ.+6 ÿASL ÿR5 ÿBR ÿ.-6 ÿMOV ÿ(R6)+,R4 ÿASR ÿR4 ÿASR ÿR4 ÿASR ÿR4 ÿ ÿ;COMPUTE STARTING WORD ÿASR ÿR4 ÿ ÿ;WITHIN THE MAP ÿASL ÿR4 ÿADD ÿ#10,R4 ÿADD ÿ@R1,R4 ÿ ÿ ÿ;R5& BR IF YES... ÿ ÿ;DELETE DISK FILE ÿ ÿ ÿ ÿ ÿ; CONTIG FILE? DELDSK: ÿTST ÿ6(R4) ÿ ÿ ÿ;R5=ADR DIR ENTR ÿBPL ÿ.+6 ÿEMT ÿ.DELCONTIG ÿ ÿ; DELETE CONTIGUOUS BLOCKS ÿBR ÿ.+4 ÿEMT ÿ.DELNK ÿ ÿ ÿ; DELETE LINKED BLOCKS ÿMOV ÿ(R6)+,BLOCK(R0) ÿMOV ÿ(R6)+,BUFADR(R0) ÿMOV ÿ@R6,R5 ÿ ÿ ÿ; GET ADR DIR ENTRY ÿCLR ÿ(R5)+ ÿCLR ÿ(R5)+ ÿCLR ÿ(R5)+ ÿJSR ÿPC,DELWRIT1 ÿ ÿ; WRITE THE DIR BLOCK DELEXIT: ÿADD ÿ#14,R6 DELX1: ÿCLR ÿ@R0 ÿTST ÿFIBLNK(R0) ÿBEQ ÿ.+6 ÿ ÿ ÿ; BR IF NO FIB ÿMOV ÿ@P'N'T WANT ANY DT MFD PROTECTION, ÿ ÿ ÿ ÿ; THE INC R5 INSTRUCTION BELOW SHOULD ÿ ÿ ÿ ÿ; BE CHANGED TO A CMP (R5)+,(R5)+ ÿMOV ÿ2(R4),-(R6) ÿASL ÿ(R6)+ ÿ ÿ;IS THIS DECTAPE? ÿBPL ÿ.+4 ÿ ÿ;NO - BRANCH ÿINC ÿR5 ÿMOV ÿR5,BLOCK(R0) NONE1: ÿJSR ÿPC,LREAD1 ÿ ÿ ÿ;GET THE MFD ÿCMP ÿBLOCK(BIBREG),MFDPTR(R4) ÿBNE ÿDUN1 ÿMOV ÿ@BUFADR(BIBREG),BLOCK(BIBREG) ÿBR ÿNONE1 ÿ ÿ ÿ; SCAN MFD LOOKING FOR A MATCH ON UIC DUN1: ÿMOVB (R TO ARGS LATER AADDTWO: ÿJSR ÿPC,ACLRBUF ÿBR ÿAOP03 AERR2: AERR3A: ÿMOV ÿ#-2,R2 ÿ ÿ ÿ; FILE ALREADY EXISTS ERR2 AERR3B: ÿNEG ÿR2 ÿ ÿ; NO UIC ÿTST ÿ(R1)+ ÿMOV ÿ@R1,R5 ÿMOVB ÿR2,-(R5) ÿÿTSTB ÿ-(R5) ÿMOV ÿ#ILFSOP,R3 ÿ ÿ; SET ERR CODE ÿADD ÿ#12,R6 ÿBR ÿAERR3C ANOBUF: ÿMOV ÿ#NOBUFR,R3 ÿMOV ÿ@R1,R5 ÿ ÿ ÿ; NO BUFFER ERROR AERR3C: ÿMOV ÿ-(R5),14(R6) ÿBNE ÿAEXIT ÿ ÿ; EXIT IF NON-ZERO ADR ALDIAG: ÿMOV ÿ@R0,-(R6) ÿ ÿ; OTHERWISE CALL DIAG PRINT ÿMOV ÿR3,-(R6) ÿIOT AERR12: )=MASK ÿADD ÿ#200,R2 ÿ ÿ ÿ;R2=HI WORD THIS MAP ÿMOV ÿ16(R6),R1 ÿ ÿ;R1=LENGTH ÿMOV ÿ14(R1),R1 ÿBEQ ÿDCZDUN ÿ ÿ ÿ; LOOP HERE,CLEARING THE BITS IN THE MAP DCZLUP: ÿBIC ÿR5,@R4 ÿ ÿ ÿ;CLEAR A BIT ÿDEC ÿR1 ÿ ÿ ÿ;DEC COUNTER ÿBEQ ÿDCZDONE ÿ ÿ ÿ;DONE? ÿASL ÿR5 ÿBNE ÿDCZLUP ÿ ÿ ÿ;STAY IN LOOP UNTIL ÿ ÿ ÿ ÿ ÿ;THIS WORD DONE ÿTST ÿ(R4)+ ÿ ÿ;STEP TO NEXT WORD DCZL2: ÿCMP ÿR4,R2 ÿ ÿ;PAST THE END OF THE BIT MAP? ÿBLO ÿDCZL3 ÿ ÿ;NO - BRANCH ÿJSR ÿPC,DCWRIT1 ÿ;WRITE THIS MAP ÿMOV ÿ@BUFADR(R0)*C,-(R6) ÿEMT ÿ.RLSFIB ÿMOV ÿR6,R5 ÿ ÿ;REMOVE USER CALL ARGUEMENTS ÿADD ÿ#20,R5 DELX2: ÿMOV ÿ-(R5),4(R5) ÿCMP ÿR5,R6 ÿBNE ÿDELX2 ÿCMP ÿ(R6)+,(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ ÿ; SET R5 TO THE ADR OF THE RRES ÿ ÿ ÿ ÿ ÿ; CALL IN THE COMMON EXIT ROUTINE ÿCMP ÿ(R5)+,(R5)+ ÿTSTB ÿDELETE ÿ ÿ ÿ; CORE RESIDENT? ÿBNE ÿ.+4 ÿ ÿ ÿ; NOPE ÿMOV ÿR5,PC ÿ ÿ ÿ; YUP...GO TO RRES ÿMOV ÿPC,-(R6) ÿ ÿ; PUSH ABS ADR OF THE BUFFER ÿADD ÿ#DELETE-.,@R6 ÿMOV ÿ#20,-(R6) ÿ ÿ; PUSH BUF SIZE ÿMOV ÿR5,-(R6) ÿ ÿ; F+ÿSBS(R4),R5 ÿ ÿ; COMPUTE NUM 4 WD ÿ ÿ ÿ ÿ ÿ; ENTRIES PER MFD BLK ÿBIC ÿ#177400,R5 ÿASL ÿR5 ÿASL ÿR5 ÿDEC ÿR5 DUN2: ÿMOV ÿBUFADR(BIBREG),ADR ÿ; GET ADR BUFFER DUN3: ÿTST ÿ(ADR)+ ÿ ÿ ÿ;SKIP OVER LINK SCAN1: ÿCMP ÿ(ADR)+,6(R2) ÿ ÿ;HIT? ÿ ÿ ÿ ÿ; REMEMBER THAT UIC FROM FN BLK ÿ ÿ ÿ ÿ; IS ON STACK ÿBEQ ÿGOTUIC ÿ ÿ ÿ;YES ÿADD ÿ#6,ADR ÿ ÿ ÿ;NO...BUMP POINTER ÿDEC ÿR5 ÿ ÿ ÿ;DEC COUNTER ÿBNE ÿSCAN1 ÿ ÿ ÿ;KEEP GOING IF MORE ÿMOV ÿ@BUFADR(BIBREG),BLOCK(BIBREG) ÿ;GET NEXT BLOCK OF MFD ,ÿMOV ÿ#-12,R2 ÿ ÿ ÿ; DT DIR FULL ÿBR ÿAERR3B AERR13: ÿMOV ÿ#-13,R2 ÿ ÿ; USER OTHER THAN OWNER ÿBR ÿAERR3B ÿ ÿ ÿ; ATTEMPTED TO WRITE ON ÿ ÿ ÿ ÿ ÿ; THIS DT AERR15: MOV ÿ#-15,R2 ÿ ÿ ÿ; ILLEGAL FILE NAME ÿBR ÿAERR3B AOP03: ASETENTRY: ÿMOV ÿ(R6)+,(R2)+ ÿ; FILE ÿMOV ÿ(R6)+,(R2)+ ÿ ÿ; NAME ÿMOV ÿ(R6)+,(R2)+ ÿ ÿ; EXT ÿMOV ÿ#103,-(R6) ÿ ÿEMT ÿ.DATE MOV (R6)+,@R2 ; DATE ÿBIC ÿ#170000,@R2 ÿ ÿ; TYPE ÿBIS ÿ#100000,(R2)+ ÿCLR ÿ(R2)+ ÿ ÿ ÿ; USAGE-,BLOCK(R0) ÿ;AND READ NEXT ÿJSR ÿPC,DCREAD1 ÿ;(THERE MUST BE ONE) ÿMOV ÿBUFADR(R0),R4 ÿADD ÿ#10,R4 ÿ ÿ;INITIALIZE MAP POINTER DCZL3: ÿSUB ÿ#20,R1 ÿ ÿ;16. OR MOR BLOCKS LEFT? ÿBCS ÿDCZL4 ÿ ÿ;NO - BRANCH ÿCLR ÿ(R4)+ ÿ ÿ;CLEAR BITS ÿBR ÿDCZL2 ÿ ÿ;GO AGAIN DCZL4: ÿMOV ÿ#1,R5 ÿ ÿ;RESET BIT MASK WORD ÿADD ÿ#20,R1 ÿ ÿ;FIX BLOCK COUNT ÿBNE ÿDCZLUP ÿ ÿ;CONTINUE DCZDONE: JSR ÿPC,DCWRIT1 DCZDUN: ÿMOV ÿ(R6)+,BLOCK(BIBREG) ÿ;READ BM IF IT WAS IN CORE ÿMOV ÿ(R6)+,BUFADR(BIBREG) ÿBEQ ÿDCDUN1 .AKE A JSR TO RBUF ÿMOV ÿ@#S.RBUF,PC ÿ ÿ; AND RETURN TO S.EXIT DERR14: MOV ÿ#14,R5 ÿ ÿ; ILLEGAL ACTION TO AN OPEN FILE DERXIT: TST ÿ(R1)+ ÿMOV ÿ@R1,R4 ÿ ÿ ÿ; GET ERR CODE ADR ÿMOV ÿ#ILFSOP,R3 ÿ ÿ; SET R2 IN CASE 0 ERR RTN ADR DERX1: ÿMOVB ÿR5,-(R4) ÿTSTB ÿ-(R4) DERX2: ÿMOV ÿ-(R4),30(R6) ÿBNE ÿDELEXIT ÿ ÿ; CALL DIAG PRNT IF ZERO ERROR ADR DELDIAG: ÿMOV ÿ@R0,-(R6) ÿMOV ÿR3,-(R6) ÿIOT DELDTA: ÿMOV ÿR6,R5 ÿCMP ÿ(R5)+,(R5)+ ÿMOV ÿ@R5,-(R6) ÿ;DIR IDX ONTO STACK ÿSUB ÿ-(R5),/ÿBEQ ÿNOUIC ÿ ÿ ÿ;TOO BAD ÿMOV ÿ-2(BIBREG),R4 ÿBR ÿNONE1 GOTUIC: ÿTST ÿ@ADR ÿ ÿ;UFD IN EXISTENCE? ÿBEQ ÿNOUFD ÿ ÿ;IF NOT NO SCAN! ÿMOV ÿ@ADR,BLOCK(BIBREG) ÿ; GET ADR UFD ÿCLR ÿMYWORD(R0) ÿ ÿ; BLK NUM OF AN EMPTY SLOT ÿCLR ÿMINE2(R0) ÿ ÿ; ADR OF AN EMPTY SLOT ÿMOV ÿ2(ADR),-(R6) ÿ ÿ; PUT DIR LENGTH ÿ ÿ ÿ ÿ ÿ; ON STACK. NOTE THAT TOP 3 ÿ ÿ ÿ ÿ ÿ; ELEMENTS OF STACK ARE: ÿ ÿ ÿ ÿ ÿ; DIR ENTRY LENGTH ÿ ÿ ÿ ÿ ÿ; THE UIC ÿ0 COUNT ASETSTRT: CLR (R2)+ ; START CLR (R2)+ ; LENGTH CLR (R2)+ ; END ÿTST ÿ(R6)+ ÿ ÿ ÿ; SKIP OVER UIC MOVB (R6)+,@R2 ; PROTECT CODE ÿBNE ÿASTS05 ÿMOV ÿ#233,@R2 ÿ;USE DEFAULT PTCT IF NONE GIVEN ASTS05: ÿJSR ÿPC,AOPNOWRIT1 ÿ; BECAUSE GETCONTIG USES THE BUFFER ÿMOV ÿPC,R4 ÿ ÿ; SET R4 EQ ADR WRITE ROUTINE ÿADD ÿ#AOPNOWRIT1-.,R4 ÿMOV ÿPC,R5 ÿ ÿ; SET R5 EQ ADR READ ROUTINE ÿADD ÿ#AO1ÿJSR ÿPC,DCREAD1 DCDUN1: ÿMOV ÿ14(R6),WC(R0) ÿ ÿ; RESTORE ORIG WC DCDUNX: ÿMOV ÿ#20,-(R6) ÿMOV ÿ@#S.RBUF,R5 ÿJSR ÿR5,@R5 DCDUN2: ÿMOV ÿ@#S.RSAV,R5 ÿJSR ÿR5,@R5 ÿ ÿ; SET UP STACK FOR EXIT THRU MON DCDUN3: ÿMOV ÿ@#S.EXIT,R5 ÿTSTB ÿDELCONTIG ÿBNE ÿ.+4 ÿCMP ÿ(R5)+,(R5)+ ÿMOV ÿR5,PC ÿ ÿ ÿ; GO BABY DTDCN: ÿMOV ÿ2(R6),R0 ÿCMP ÿ(R0)+,(R0)+ ÿMOV ÿ(R0)+,R1 ÿ;STARTING BLOCK IN R1 ÿMOV ÿ@R0,R0 ÿ ÿ;LENGTH IN R0 ÿBEQ ÿDCDUN3 ÿMOV ÿR1,R3 ÿBIC ÿ#177760,R3 ÿMOV ÿ#1,R4 DTDC00: ÿDEC ÿR32@R6 FBMCALC: MOV ÿ#70,R3 ÿ ÿ ÿ; COMPUTE THE BLOCK NUMBER OF ÿCMP ÿ-(R5),#103 ÿBNE ÿ.+4 ÿ ÿ ÿ; OF THE DIR ENTRY ÿCMP ÿ(R3)+,(R3)+ ÿ ÿ; ...IT IS EITHER 70 OR 74 PLUS N ÿMOV ÿ#2,R5 ÿ ÿ ÿ; SKIP OVER LINK CALCF4: CLR ÿR4 ÿ ÿ ÿ; R4=FBM IDX CALCF5: CMP ÿR5,@R6 ÿ ÿ ÿ; R5=DIR IDX? ÿBEQ ÿCALCF6 ÿADD ÿ#22,R5 ÿ ÿ ÿ; NOPE. GET THE NEXT ITEM ÿADD ÿ#110,R4 ÿCMP ÿR4,#662 ÿ ÿ ÿ; TOO HI? ÿBLO ÿCALCF5 ÿ ÿ ÿ; NO ÿINC ÿR3 ÿ ÿ ÿ; YES...INC FBM BLOCK NUM ÿBR ÿCALCF4 ÿ ÿ ÿ; RESET POINTERS CALCF6: MOV 3ÿ ÿ ÿ ÿ ÿ; ADR ON STACK OF FIL GOT1: ÿJSR ÿPC,LREAD1 ÿ ÿ;GET FIRST BLOCK UFD ÿBR ÿUFDSCAN ÿ ÿ ÿ; NOUFD: ÿMOV ÿ#-3,-(R2) ÿ ÿ; NO UFD ÿMOV ÿADR,MYWORD(R0) ÿ ÿ; SAVE STUFF FOR SETUPMFD ROUTINE ÿBR ÿEXIT NOUIC: ÿMOV ÿ#-1,-(R2) ÿ ÿ; PUT THE ERROR ON EXIT: ÿMOV ÿ@#S.EXIT,R5 ÿ ÿ; GET ADR COMMON EXIT ÿTSTB ÿLOOKUP ÿ ÿ; SEE IF IN SWAP BUFFER ÿBNE ÿ.+4 ÿ ÿ ÿ; YUP ÿCMP ÿ(R5)+,(R5)+ ÿ ÿ; NOPE..DONT DECB MSB+2 ÿMOV ÿR5,PC ÿ ÿ 4PNOREAD1-.,R5 ÿMOV ÿFIBLNK(R0),R3 ÿMOV ÿR1,(R3)+ ÿ ÿ; SAVE R1 ÿMOV ÿBLOCK(R0),(R3)+ ÿ ÿ; SAVE BLK NUM OF ENTRY ÿMOV ÿR2,(R3)+ ÿ ÿ ÿ; SAVE R2...VERY IMPORTANT LATER ÿEMT ÿ.GETCONTIG ÿ ÿ; GO GET EM AOPNOEXIT: ÿ ÿ ÿ ÿ; NOTE THAT GETCONTIG RETURNS ÿ ÿ ÿ ÿ; R1 EQ NUM NEEDED AND R2 ÿ ÿ ÿ ÿ; EQ THAT NUM OR THE BIGGEST HOLE ÿMOV ÿ#-1,R5 ÿCMP ÿR1,R2 ÿ ÿ; DID I FIND THE BLOCKS? ÿBEQ ÿAGOTEM ÿ ÿ; YES ÿ ANOTENUF: MOV ÿR2,R5 ÿ ÿ; NO.SET UP RTN ARG ÿ AGOTEM: ÿMOV ÿR5,24(R6) ÿ; SET RTN AR5 ÿBMI ÿDTDC05 ÿ ÿ;CONVERT BLOCK TO BIT ÿASL ÿR4 ÿBR ÿDTDC00 DTDC05: ÿASR ÿR1 ÿASR ÿR1 ÿASR ÿR1 ÿASR ÿR1 ÿASL ÿR1 ÿADD ÿ#10,R1 ÿ ÿ;R1 POINTS TO FIRST BIT MAP ÿADD ÿ4(R6),R1 ÿ ÿ;TO BE ALTERED DTDC10: ÿBIC ÿR4,@R1 ÿDEC ÿR0 ÿBEQ ÿDCDUN3 ÿASL ÿR4 ÿBNE ÿDTDC10 ÿ ÿ;CLEAR BITS IN DT PBM ÿTST ÿ(R1)+ DTDC15: ÿSUB ÿ#20,R0 ÿBCS ÿDTDC20 ÿCLR ÿ(R1)+ ÿBR ÿDTDC15 DTDC20: ÿADD ÿ#20,R0 ÿBEQ ÿDCDUN3 ÿMOV ÿ#1,R4 ÿBR ÿDTDC10 ÿ;THE ABOVE DUPLICATES A LOT OF CODE FOR DISK ÿ;CONT6ÿR4,@R6 ÿ ÿ ÿ; REPLACE TOP ELEMENT OF STACK WITH FBM IDX ÿMOV ÿR3,-(R6) ÿ ÿ ÿ; PUSH BLOCK IDX ÿMOV ÿ10(R6),R1 ÿCLR ÿ(R1)+ ÿ ÿ ÿ; CLR ENTRY ÿCLR ÿ(R1)+ ÿCLR ÿ(R1)+ ÿJSR ÿPC,DELWRIT1 ÿ;WRITE THE BLOCK ÿMOV ÿR0,R4 ÿCMP ÿ(R4)+,(R4)+ ÿMOV ÿ#104,(R4)+ ÿMOV ÿR2,@R4 ÿ ÿ;READ PBM INTO R2 BUFFER ÿJSR ÿPC,DELREAD1 ÿMOV ÿ@R1,R3 ÿ ÿ;IS THE FILE LINKED? ÿBPL ÿDTLNKD ÿ ÿ;YES - BRANCH ÿEMT ÿ.DELCONTIG ÿADD ÿ#6,R6 ÿ ÿ;CLEAN UP STACK FOR EXIT ÿBR ÿDTLK05 DTLNKD: ÿMOV ÿ6(R6),@R4 ÿ;READ FBM 7ÿ;SCAN UFD LOOKING FOR FILNAM.EXT UFDSCAN: MOV ÿBUFADR(BIBREG),ADR ÿ; R1=ITEM ADR ÿTST ÿ(ADR)+ ÿMOV ÿADR,R1 UFD1: ÿMOV ÿ-2(BIBREG),R5 ÿ ÿ; COMPUTE # ENTRIES ÿ ÿ ÿ ÿ ÿ; PER BLOCK OF UFD ÿMOVB ÿSBS(R5),R5 ÿASL ÿR5 ÿASL ÿR5 ÿASL ÿR5 ÿASL ÿR5 ÿBNE ÿUFD1A ÿMOV ÿ#400,R5 UFD1A: ÿDEC ÿR5 ÿCLR ÿR3 UFD1B: ÿINC ÿR3 ÿSUB ÿ@R6,R5 ÿBEQ ÿUFD1C ÿCMP ÿ@R6,R5 ÿBLOS ÿUFD1B UFD1C: ÿ ÿ ÿ ÿ ÿ; R3=NUM ENTRIES/BLOCK ÿBR ÿUFD3 UFD2: ÿADD ÿ@R6,R1 ÿADD ÿ@R6,R1 ÿMOV ÿR1,ADR UFD3: HG ONTO STACK ÿ TST ÿFIBLNK(R0) ÿ ÿ; IS THERE A FIB? ÿBEQ ÿAEXIT ÿMOV ÿ@PC,-(R6) ÿ ÿ; RLS THE FIB ÿEMT ÿ.RLSFIB AEXIT: ÿCLR ÿ@R0 ÿMOV ÿR6,R5 ÿ ÿ ÿ; REMOVE USER CALL ARGS ÿADD ÿ#20,R5 ÿMOV ÿ-(R5),4(R5) ÿCMP ÿR5,R6 ÿBNE ÿ.-6 ÿ ÿ ÿ; LOOP AROUND ÿCMP ÿ(R6)+,(R6)+ ÿ ÿ; DIDDLE SP ÿ MOV ÿ@#S.EXIT,R5 ÿ ÿ; SET R5 TO THE ADR OF THE RRES ÿ ÿ ÿ ÿ ÿ; CALL IN THE COMMON EXIT ROUTINE ÿCMP ÿ(R5)+,(R5)+ ÿTSTB ÿALLOC ÿ ÿ ÿ; CORE RESIDENT? ÿBNE ÿ.+4 ÿ ÿ ÿ; NOPE ÿMOV ÿR5,PC ÿ ÿ ÿ; YUP...GOEIG DELETE. IF YOU EVER NEED MORE SPACE, ÿ;MAKE A SUBROUTINE OUT OF IT ;FILE STRUCTURES READ/WRITE SUBROUTINE DCWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 DCREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(FINTO MFD BUFFER ÿMOV ÿ(R6)+,-(R4) ÿJSR ÿPC,DELREAD1 ÿMOV ÿR2,R5 ÿ ÿ ÿ; BIC FBM,PBM ÿADD ÿ#10,R5 ÿMOV ÿ(R6)+,R3 ÿTST ÿ(R6)+ ÿADD ÿ@R6,R3 ÿ ÿ;R3 POINTS TO THIS FBM ÿMOV ÿ#36.,R1 ÿBIC ÿ@R3,(R5)+ ÿCLR ÿ(R3)+ ÿ ÿ ÿ; CLR ÿFBM ÿDEC ÿR1 ÿBNE ÿ.-6 ÿJSR ÿPC,DELWRIT1 ÿ;WRITE FBM ÿMOV ÿ#104,(R4)+ ÿ;WRITE PBM ÿMOV ÿR2,@R4 DTLK05: ÿJSR ÿPC,DELWRIT1 ÿMOV ÿ(R6)+,@R4 ÿ;RESTORE ORIGINAL BUFADR(R0) ÿMOV ÿR2,-(R6) ÿ ÿ; RLS THE R2 BUFFER ÿMOV ÿ#20,-(R6) ÿMOV ÿ@#S.RBUF,R5 ÿJSR ÿR5,@R5 GÿTST ÿMYWORD(R0) ÿ ÿ; ALREADY FIND AN EMPTY SLOT? ÿBNE ÿUFD3A ÿ ÿ; YES ÿMOV ÿADR,R5 ÿMOV ÿ(R5)+,-(R6) ÿ ÿ; IS THIS AN EMPTY SLOT? ÿBIS ÿ(R5)+,@R6 ÿBIS ÿ(R5)+,(R6)+ ÿ ÿBNE ÿUFD3A ÿ ÿ ÿ; NO ÿMOV ÿBLOCK(R0),MYWORD(R0) ÿ; YES...SAVE BLK NUM ÿMOV ÿADR,MINE2(R0) ÿ ÿ; SAVE THE ADR TOO UFD3A: ÿMOV ÿR2,R5 ÿ;MATCH ON FIRST WORD? ÿCMP ÿ(ADR)+,(R5)+ ÿBNE ÿUFD4 ÿCMP ÿ(ADR)+,(R5)+ ÿ;MATCH ON SECOND WORD? ÿBNE ÿUFD4 ÿCMP ÿ(ADR)+,(R5)+ ÿ;MATCH ON THIRD WORD? ÿBEQ ÿGOTFIL ÿ ÿ;WHOOPPEE UFD4: """"""" DDDDDDD@Dˆˆˆˆˆˆˆ€ˆ """"""""DDDDDDˆˆˆˆˆˆˆ@DDDDDDDDˆˆˆˆˆˆˆˆˆ""""""""@DDDDDDDDD """"""ˆˆˆˆˆˆ""""""ADDB C†4d©I›Ô4d©N›ÈL4d©O›/4d©T›4d©M�›QK4d©R ‚›z4d©S‡›î4d©X”›è'4d©†Ê› &4d©‹Ó›�4d©‘Ñ›É-4d©˜ È›&4d©Ì›Ð4d©Î›à4d©Õ ›Vq4d© H›ßf4d©ã ›oT4d©  5›© H›$Dÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ7333ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ8ŽIR3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿDCREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#J ÿBR ÿDELEXIT ;FILE STRUCTURES READ/WRITE SUBROUTINE DELWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 DELREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP KÿDEC ÿR3 ÿBNE ÿUFD2 ÿMOV ÿ@BUFADR(R0),R5 ÿ ÿ; GET NXT BLK ÿBEQ ÿNOFILE ÿ ÿ ÿ; END OF CHAIN ÿMOV ÿR5,BLOCK(R0) ÿ ÿ; GO. ÿBR ÿGOT1 GOTFIL: ÿTST ÿ(R6)+ ÿMOV ÿR1,-(R2) ÿBR ÿEXIT NOFILE: ÿTST ÿ(R6)+ NOFIL2: ÿMOV ÿ#-2,-(R2) ÿBR ÿEXIT ;FILE STRUCTURES READ/WRITE SUBROUTINE LWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 LREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿL TO RRES ÿMOV ÿPC,-(R6) ÿ ÿ; PUSH ABS ADR OF THE BUFFER ÿADD ÿ#ALLOC-.,@R6 ÿMOV ÿ#20,-(R6) ÿ ÿ; PUSH BUF SIZE ÿMOV ÿR5,-(R6) ÿ ÿ; FAKE A JSR TO RBUF ÿMOV ÿ@#S.RBUF,PC ÿ ÿ; AND RETURN TO S.EXIT ;FILE STRUCTURES READ/WRITE SUBROUTINE AOPNOWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 AOPNOREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONS.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE CAT ÿ=.-DELCONTIG ÿ.END ÿ ÿ; END OF DCN NCOMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿDELREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5OÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(PTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PAREQ ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE ÿCAT ÿ=.-DELETE ÿ.END R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿLREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE ÿCAT= ÿ.-LOOKUP ÿ.END ÿ ÿ; END OF LUK @ TRR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿAOPNOREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE AGTBLK: ÿMOV ÿ@R3,-(R6) ÿEMT ÿ.GETMAP ÿ ÿ;GET A MAP IN CORE ÿEMT ÿ.BALLOC ÿ ÿ;GET A BLOCK ÿMOV ÿR3,-(R6) ÿCLR ÿR3 ÿEMT ÿ.WRITMAP ÿ;WRITE THE MAP ÿMOV ÿ(R6)+,R3 ÿMOV ÿ(R6)+,@R3 ÿJSR ÿPC,AOPNOREAD1 ÿ;READ IN THE BLOCK TO WHICH ÿ ÿ ÿ ÿ;WE'LL LINK THIS NU ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 V ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003B ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=W ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 EW BLOCK ÿRTS ÿPC ACLRBUF: ÿMOV ÿBUFADR(R0),R4 ÿMOV ÿR4,R2 ÿTST ÿ(R2)+ ÿMOV ÿWC(R0),R5 ÿCLR ÿ(R4)+ ÿINC ÿR5 ÿBNE ÿ.-4 ÿRTS ÿPC ÿCAT ÿ=.-ALLOC ÿ.END ÿ ÿ; END OF ALL  Y ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ZR5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPT[ ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 \ ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003B ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ] ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿCBA .GLOBL ÿCBA ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;^R ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 _ ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ` ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 a ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ÿ ÿ;CONTIGUOUS BLOCK ALLOCATOR ÿ ÿ; PART 1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GETCONTIG: ÿ177400 ÿ ÿ ÿ; FLAG FOR SAM...NON REENTRANT,0 CBA: ÿ MOV ÿ@#S.RRES,R5 ÿJSR ÿR5,@R5 ÿMOV ÿR4,#CBAWRIT1 ÿ ÿ; GET THE ADRS OF THE R/W ROUTINES CBAWRIT1=.-2 ÿMOV ÿR5,#CBAREAD1 CBAREAD1=.-2 ÿ ÿ ÿ ÿ ÿ; WHEN POSITION OF THE STACK Ib ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿLBA .GLOBL ÿLBA BALLOC: ÿ.WORD ÿ0 LBA: ÿMOV ÿ@R6,R0 ÿ ÿ;POINTER THE DDB ÿMOV ÿR0,R3 ÿCMP ÿ(R3)+,(R3)+ ÿMOV ÿ(R3)+,-(R6) ÿ;SAVE OLD BLc ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿDIR .GLOBL ÿDIR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;d ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 eS ÿ ÿ ÿ ÿ ÿ; SECURE, THE ABOVE TWO STATEMENTS ÿ ÿ ÿ ÿ ÿ; CAN BE CHANGED ÿMOV ÿ-2(R0),R1 ÿ ÿ; SET R1 EQ ADR DRVR ÿMOV ÿ@FIBLNK(R0),R2 ÿMOV ÿ4(R2),R4 ÿ ÿ; NOTE HERE THAT R2 WAS ÿ ÿ ÿ ÿ ÿ; CAREFULLY PRESERVED. ÿMOVB ÿSBS(R1),R5 ÿ; COMPUTE # WDS REQUIRED ÿCLR ÿ-(R6) ÿASR ÿR5 ÿASR ÿR5 LABL00: ÿASR ÿR5 ÿBCS ÿLABL05 ÿASR ÿR4 ÿBCC ÿLABL00 ÿMOV ÿ#1,@R6 ÿBR ÿLABL00 LABL05: ÿADD ÿ(R6)+,R4 LABL10: ÿMOV ÿBUFADR(R0),R3 ÿMOV ÿWC(R0),-(R6) ÿ;SAVE OLD WD COUNT ÿMOV ÿMFDPTR(R1),BLOCK(fOCK,BUFADR,WC ÿMOV ÿ(R3)+,-(R6) ÿMOV ÿ@R3,-(R6) ÿMOV ÿ#-64.,@R3 ÿ;SET FOR 64. WORD XFRS ÿMOV ÿFIBLNK(R0),R1 ÿMOV ÿCBMPTR(R1),R1 ÿ;GET CURRENT BIT MAP ÿMOV ÿR1,-(R3) ÿ;UPDATE BUFADR ÿMOV ÿ2(R1),-(R6) ÿ;COMPUTE THE BLOCK NUMBER ÿADD ÿ6(R1),@R6 ÿ;OF THIS BIT MAP ÿDEC ÿ@R6 ÿMOV ÿ(R6)+,-(R3) ÿ;UPDATE BLOCK ÿCLR ÿ-(R6) ÿ ÿ;SET FIRST TIME THROUGH GETLOW: ÿMOV ÿR1,R5 ÿ ÿ;GETS LOWEST BLOCK IN THIS ÿTST ÿ(R5)+ ÿ ÿ;BIT MAP ÿMOV ÿ(R5)+,R3 ÿ;GET MAP NUMBER ÿMOV ÿ@R5,R4 ÿ ÿ;GET MAP SIZEg ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; DIRECTORY SEARCH ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DIRS: ÿ177400 ÿ ÿ ÿ;COMMON CODE TO MOVE CODE ÿ ÿ ÿ ÿ; FLAG FOR SAM.....NON REENTRANT,0 DIR: ÿADD ÿPC,R5 ÿ ÿ; R5=177776 VIA SAM ÿTST ÿ-(R5) ÿ ÿ; LOOK AT FIRST WRD OF CODE ÿTSTB ÿ@R5 ÿ ÿ; IN SWAP BUFFER? ÿBEQ ÿDIRBEG ÿ ÿ; IF RESIDENh ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿDLN .GLOBL ÿDLN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;iBIBREG) ÿJSR ÿPC,@CBAREAD1 ÿ ÿ;READ MFD BLOCK ÿ ÿ ÿ ÿ ÿ; CALCULATE ADR IN DRVR OF ÿ ÿ ÿ ÿ ÿ; FIB CHAIN,IF ANY. TO SEE ÿ ÿ ÿ ÿ ÿ; IF A BIT MAP IS ÿMOVB ÿUNIT(BIBREG),R5 ÿ ÿ; ALREADY IN CORE? ÿBIC ÿ#177770,R5 ÿASL ÿR5 ÿ ÿ ÿ; MULT UNIT NUM BY 2 ÿADD ÿ#BMPTR,R5 ÿ ÿ; ADD OFFSET ÿADD ÿR1,R5 ÿMOV ÿ@R5,R5 ÿ ÿ ÿ;R5=ADR OF POINTER OR 0 ÿBNE ÿCBA1A ÿCLR ÿ-(R6) ÿCLR ÿ-(R6) ÿBR ÿCBA1 CBA1A: ÿMOV ÿBUFADR(R0),MYWORD(R0) ÿ ÿ; SAVE BUFADR...ALL REGS ÿ ÿ ÿ ÿ ÿ ÿ; IN USE,UNFORTUNATELY ÿMOV ÿj ÿASL ÿR4 ÿASL ÿR4 ÿASL ÿR4 ÿ ÿ;MULTIPLY BY 16. THUS GET ÿASL ÿR4 ÿ ÿ;THE NUMBER OF BLOCKS ÿCLR ÿR2 ÿ ÿ;DESCRIBED BY THIS MAP. GETL00: ÿDEC ÿR3 ÿBEQ ÿGETBIT ÿ ÿ;THIS PART PUTS THE LOWEST ÿADD ÿR4,R2 ÿ ÿ;BLOCK IN THIS MAP IN R2 ÿBR ÿGETL00 GETBIT: ÿMOV ÿ@R5,R3 ÿ ÿ;GET MAP SIZE ÿCMP ÿ(R5)+,(R5)+ ÿ;POINTER FIRST WORD OF MAP GTBT00: ÿCMP ÿ@R5,#-1 ÿ ÿ;ANY FREE BITS IN THIS WORD? ÿBNE ÿGTBT05 ÿ ÿ;YES - GOT A FREE BLOCK ÿTST ÿ(R5)+ ÿ ÿ;POINTER NEXT WORD ÿADD ÿ#16.,R2 ÿ ÿ;UPDATE BLkT THEN SKIP ÿMOV ÿ#20,-(R6) ÿ; DISK RESIDENT. GET A BUFFER ÿMOV ÿ@#GETBUF,R4 ÿJSR ÿR5,@R4 ÿMOV ÿ(R6)+,R3 ÿ; PUT ADR INTO R3 ÿBNE ÿ.+6 ÿJMP ÿDIRRATS ÿ ÿ; TOO BAD ÿMOV ÿR3,R4 ÿ ÿ; LOOP TO DO THE MOVE ÿMOV ÿR5,R2 ÿMOV ÿ(R2)+,(R3)+ ÿINC ÿ@R4 ÿBLE ÿ.-4 ÿSUB ÿR2,R3 ÿ ÿ; FIRST WORD NOW EQ 1 ÿADD ÿR3,PC ÿ ÿ; GO BABY ÿCLR ÿ@R5 ÿCLR ÿ-2(R5) DIRBEG: ÿBIT ÿ#200,12(R0) ÿ ÿ; TEST DATASET BUSY ÿBEQ ÿDIRNBSY ÿ ÿ; BR IF NOT DIRBSY: ÿCLR ÿ20(R6) ÿ ÿ;CLEAR LENGTH WORD ÿTST ÿ22(R6)l;;;;;;; ÿ ÿ ÿ ÿ ÿ;;;;;;;;;;;; ;;;;;;;;;;;;;; FOR DTA STACK LOOKS LIKS THIS ;;;;;;;;;;;; ;;;;;;;;;;;;;; ;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ÿ ÿBUF ADR FOR PBM ; ÿ ÿBUF ADR FOR FBM ; ÿ ÿDIR BLOCK\FBM BLOCK ; ÿ ÿDIR IDX\FBM IDX ; ÿ ÿORIG BLOCK ; ÿ ÿORIG BUFADR ; ÿ ÿRTN; ÿ ÿADR DIR ENTRY ; ÿ ÿFIL ; ÿ ÿNAM ; ÿ ÿEXT ; ÿ ÿUIC ; ÿ ÿPCODE MODE ; ÿ ÿRTN TO MON DELNK: 177400 DLN: ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)mÿ-(R5),BUFADR(BIBREG) ÿ ÿ; YES...THEN WRITE IT ÿMOV ÿ@R5,-(R6) ÿ ÿ ÿ; PUSH BUFADR ÿMOV ÿR3,R2 ÿCMP ÿ(R2)+,(R2)+ ÿ ÿ; LOOK DOWN THE LIST ÿ ÿ ÿ ÿ ÿ; OF MAPS UNTIL YOU FIND ÿ ÿ ÿ ÿ ÿ; THE CURRENT ONE.THEN, ÿ ÿ ÿ ÿ ÿ; WRITE IT AND SAVE ITS ÿ ÿ ÿ ÿ ÿ; CORE ADR AND BLOCK # ÿMOV ÿ@R5,R5 ÿ ÿ; R5= MAP ADR ÿMOV ÿ2(R5),R1 ÿ ÿ; R1 =MAP NUM TIMES 2 ÿASL ÿR1 ÿADD ÿR1,R2 ÿMOV ÿ@R2,BLOCK(R0) ÿMOV ÿ@R2,-(R6) ÿ ÿ ÿ; PUSH BLK NUM ÿMOV ÿ#177700,WC(R0) ÿ;SET FOR 64 WORD XFRS ÿJSR ÿPC,@CBAWRIT1nOCK NUMBER ÿDEC ÿR3 ÿ ÿ;AT THE END OF THE MAP? ÿBNE ÿGTBT00 ÿ ÿ;NO - KEEP LOOKING GTNXT: ÿJSR ÿPC,LWRIT1 ÿ;WRITE THE CURRENT MAP ÿTST ÿ@R6 ÿ ÿ;ON PASS ONE? ÿBEQ ÿGTNX00 ÿ ÿ;YES - BRANCH ÿMOV ÿ@R1,BLOCK(R0) ÿ;GET LINK TO NEXT MAP ÿBEQ ÿDVFULL ÿ ÿ;FAILURE IF NO MORE ÿBR ÿGTNX05 GTNX00: ÿINC ÿ@R6 ÿ ÿ;SET PASS TWO ÿMOV ÿ6(R1),BLOCK(R0) ÿ;GET AT FIRST MAP GTNX05: ÿJSR ÿPC,LREAD1 ÿ;READ IN THE PROPER MAP ÿBR ÿGETLOW ÿ ÿ;GO BACK TO MAINLINE GTBT05: ÿMOV ÿ#1,R3 ÿ ÿ;START THE MASK GTo ÿ ÿ;DID HE WANT START BLOCK? ÿBNE ÿDRBS00 ÿ ÿ;NO - BRANCH ÿMOV ÿ#40,24(R6) ÿ;INSERT CODE WORD ÿJMP ÿDIRG01 ÿ ÿ;AT THE RIGHT PLACE DRBS00: ÿMOV ÿ#40,22(R6) ÿ;START BLOCK ALREADY CLEAR ÿJMP ÿDIRG01 ÿ ÿ;GO EXIT DIRNBSY: MOV ÿ#1,-(R6) ÿ ÿ; GET A BUFFER AND A FIB ÿEMT ÿ.SETUPFIB ÿTST ÿFIBLNK(R0) ÿ ÿ; GET ONE? ÿBNE ÿDIRN00 ÿ ÿ;YES - BRANCH ÿJMP ÿDIRNOBUF ÿ;NO BUFFER ERROR DIRN00: ÿCLR ÿR2 ÿCLR ÿR3 ÿMOV ÿ-2(R0),R5 ÿ ÿ; SEE IF FS DEVICE ÿMOV ÿ2(R5),R4 ÿBMI ÿDIRFS ÿ ÿ; IT IS DIRNFS: p+ ÿMOV ÿWC(R0),-(R6) ÿ;SAVE ORIGINAL WORD COUNT ÿMOV ÿR2,-(R6) ÿ ÿ; PUSH HALF OF R2 BUFFER ÿADD ÿ#256.,R2 ÿMOV ÿ-2(BIBREG),R1 ÿ ÿ;READ MFD #1 ÿMOV ÿMFDPTR(R1),BLOCK(R0) ÿMOV ÿ@R6,BUFADR(BIBREG) ÿMOV ÿ#-128.,WC(R0) ÿ;USE MAX MFD#1 SIZE ÿJSR ÿPC,DREAD1 ÿMOV ÿ#-64.,WC(R0) ÿ;NOW SET FOR 64 WORD XFRS ÿ ÿ ÿ ÿ ÿ;IF A BIT MAP IS IN CORE ÿ ÿ ÿ ÿ ÿ;WRITE IT AND PUT ÿMOVB ÿUNIT(R0),R5 ÿBIC ÿ#177770,R5 ÿASL ÿR5 ÿADD ÿ#BMPTR,R5 ÿADD ÿR1,R5 ÿ ÿ;POINTER PROPER FIB CHAIN ÿMOV ÿ@R5,R5q ÿ ÿ ;NOW WRITE IT ÿMOV ÿMYWORD(R0),BUFADR(R0) ÿ ÿ; RESTORE BUFADR CBA1: ÿTST ÿ(R3)+ ÿ ÿ ÿ;READ THE LAST MAP ÿBNE ÿ.-2 ÿTST ÿ-(R3) ÿMOV ÿ-(R3),BLOCK(BIBREG) ÿJSR ÿPC,@CBAREAD1 ÿCLR ÿ-(R6) ÿ ÿ ÿ; HIGHEST COUNT TO DATE ÿMOV ÿR4,-(R6) ÿ ÿ ÿ; NUM NEEDED ÿMOV ÿBUFADR(R0),R1 ÿ ÿ; R1=ADR MAP BLK ÿMOV ÿR1,R4 ÿ ÿ ÿ; SO DOES R4 FOR NOW ÿTST ÿ(R4)+ ÿMOV ÿ(R4)+,R5 ÿ ÿ; R5=MAP NUM ÿMOV ÿ(R4)+,R3 ÿ ÿ; R3=SIZE ÿMOV ÿR4,-(R6) ÿ ÿ; @R6= ADR MAP BLK ÿASL ÿR3 ÿASL ÿR3 ÿASL ÿR3 ÿASL ÿR3 rBT10: ÿBIT ÿR3,@R5 ÿ ÿ;THIS BLOCK FREE? ÿBEQ ÿGTBT15 ÿ ÿ;YES - BRANCH ÿINC ÿR2 ÿ ÿ;UPDATE THE BLOCK NUMBER ÿASL ÿR3 ÿ ÿ;SHIFT THE MASK ÿBR ÿGTBT10 ÿ ÿ;TRY AGAIN GTBT15: ÿBIS ÿR3,@R5 ÿ ÿ;SET THE BIT EXIT: ÿMOV ÿR2,@FIBLNK(R0) ÿ;RETURN THE BLOCK NUMBER ÿTST ÿ(R6)+ ÿ ÿ;POP OFF THE PASS FLAG ÿADD ÿ#10,R0 ÿ ÿ;RESTORE THE DDB: ÿMOV ÿ(R6)+,@R0 ÿ; WC ÿMOV ÿ(R6)+,-(R0) ÿ; BUFADR ÿMOV ÿ(R6)+,-(R0) ÿ; BLOCK ÿMOV ÿ@#S.EXIT,R5 ÿ;TAKE COMMON EXIT ÿTSTB ÿBALLOC ÿ ÿ;IN THE SWAP BUFFER? ÿBsÿBIS ÿ#200,R3 ÿRORB ÿR4 ÿRORB ÿR4 ÿ ÿ ÿ; OUTPUT BIT SET IN DRVR? ÿBCC ÿDRNF05 ÿ ÿ;NO - BRANCH ÿBIS ÿ#5,R3 ÿ ÿ ÿ; OK FOR OPENC ÿBIC ÿ#200,R3 DRNF05: ÿRORB ÿR4 ÿBCC ÿ.+6 ÿ ÿ ÿ; BR IF INPUT BIT OFF ÿBIS ÿ#2,R3 ÿCLR ÿR5 ÿ ÿ;SET START BLOCK = 0 ÿBR ÿDIREXIT DIRFS: ÿMOV ÿ22(R6),-(R6) ÿBNE ÿDRFS00 ÿMOV ÿ26(R6),@R6 DRFS00: ÿMOV ÿ22(R6),-(R6) ÿMOV ÿR6,R1 ÿSUB ÿ#14,R6 ÿEMT ÿ.LOOKUP ÿ ÿ ÿ; CHECK FILE ÿMOV ÿR6,R5 ÿ ÿ ÿ; CHECK FOR FILE 00.0 ÿTST ÿ(R5)+ ÿ ÿ ÿ; SKIP OVER ADR ÿMOVt ÿ ÿ;IS A BIT MAP IN CORE? ÿBNE ÿDLN00 ÿ ÿ;YES - BRANCH ÿCLR ÿ-(R6) ÿCLR ÿ-(R6) ÿ ÿ;INDICATE NO MAP ÿBR ÿDEL1 DLN00: ÿMOV ÿ-(R5),R5 ÿ;GET BIT MAP BUF ADDR ÿMOV ÿR5,-(R6) ÿ;SAVE IT ÿMOV ÿR5,BUFADR(R0) ÿ;PUT IN DDB ÿMOV ÿ2(R5),R3 ÿADD ÿ6(R5),R3 ÿDEC ÿR3 ÿ ÿ;GET BIT MAP BLOCK ÿMOV ÿR3,-(R6) ÿ;SAVE IT ÿMOV ÿR3,BLOCK(R0) ÿ;PUT IN DDB ÿJSR ÿPC,DWRIT1 ÿ;WRITE THE BIT MAP ÿ ÿ ÿ ÿ ÿ;START SETTING UP DEL1: ÿMOV ÿ#1,-(R6) ÿ ÿ;CURRENT BM # EQ 1 ÿMOV ÿR2,-(R6) ÿ ÿ; PUSH ADR MAP BUFFER. u ÿMOV ÿR3,R2 CBA2: ÿDEC ÿR5 ÿBEQ ÿCBA3 ÿADD ÿR2,R3 ÿBR ÿCBA2 CBA3: ÿDEC ÿR3 ÿ ÿ ÿ;R3=HIGHEST BLOCK # IN SYSTEM ÿMOV ÿR4,R2 ÿ ÿ ÿ; COMPUTE R2=ADR HI WORD ÿADD ÿ-(R4),R2 ÿADD ÿ@R4,R2 ÿCLR ÿR4 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; CONTIG BLK ALLOCATOR ;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;; PART 2 vNE ÿEXIT00 ÿ ÿ;YES - BRANCH ÿCMP ÿ(R5)+,(R5)+ EXIT00: ÿJMP ÿ@R5 DVFULL: ÿ ÿ ÿ ÿ;DEVICE FULL ÿCMP ÿ(R6)+,(R6)+ ÿ;POP PASS FLAG AND WORD COUNT ÿMOV ÿ-2(R0),R5 ÿCLR ÿ-(R6) ÿBISB ÿSBS(R5),@R6 ÿ;RELEASE THE DATA BUFFER ÿMOV ÿ@#S.RBUF,-(R6) ÿJSR ÿR5,@(R6)+ ÿCLR ÿBUFADR(R0) ÿ;SO INDICATE IN THE DDB ÿBIC ÿ#200,12(R0) ÿ;SHUT OFF OPEN INDICATOR ÿMOV ÿFIBLNK(R0),R4 ÿADD ÿ#FLINK,R4 ÿ;R4 POINTERS THIS FIB+32 ÿMOVB ÿUNIT(R0),R3w ÿ(R5)+,-(R6) ÿBIS ÿ(R5)+,@R6 ÿBIS ÿ(R5)+,(R6)+ ÿBEQ ÿDIER15 ÿ ÿ ÿ; ILLEGAL NAME ÿCLR ÿR5 ÿ ÿ;SET BLOCK 0 IN CASE NO FILE ÿCMP ÿ@R6,#-3 ÿBHIS ÿDIRX00 ÿ ÿ;NO FILE, ETC. ÿMOV ÿ@R6,R5 ÿ ÿ;POINT TO ENTRY IN CORE ÿMOV ÿ10(R6),-(R6) ÿMOV ÿ20(R5),-(R6) ÿMOV ÿ#3,-(R6) ÿCLR ÿ-(R6) ÿEMT ÿ.CKACSP ÿ ÿ;CHECK FOR READ ACCESS ÿTST ÿ(R6)+ ÿBNE ÿDIRX00 ÿ ÿ;NO INFO AT ALL IF READ DENIED ÿBIS ÿ#200,R3 ÿ ÿ;FILE EXISTS ÿTST ÿ6(R5) ÿBPL ÿDRFS05 ÿBIS ÿ#100,R3 ÿ ÿ;SET CONTIGUOUS DRFS05: ÿMOV xÿ ÿ ÿ ÿ ÿ; NOTE THAT THIS IS THE OTHER HALF ÿ ÿ ÿ ÿ ÿ; OF THE BUFFER GOTTEN AT THE EMT CALL ÿMOV ÿPC,R4 ÿBR ÿDEL1A ÿ ÿ;GET ADDR OF A TWO WRD BUFFER ÿ.WORD ÿ0,0 DEL1A: ÿTST ÿ(R4)+ ÿMOV ÿR4,-(R6) ÿMOV ÿ12(R6),R3 ÿ ÿ;READ MAP 1 ÿMOV ÿ6(R3),BLOCK(BIBREG) ÿ; R3 IS ADR OF THE MAP ÿMOV ÿ6(R3),-(R6) ÿ ÿ; PUSH ÿFIRST BLOCK NUM ÿ ÿ ÿ ÿ ÿ; USE IT LATER AS CUR BLK NUM ÿMOV ÿ4(R6),BUFADR(R0) ÿJSR ÿPC,DREAD1 ÿ ÿ;READ MAP #1 ÿMOV ÿ30(R6),R2 ÿ ÿ; GET ADR DIR ENTRY ÿMOV ÿ12(R2),-(R6) ÿ ÿ; Sy ;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;AT THIS TIME REGISTER STATUS IS AS FOLLOWS: ; ÿ4(R6) = HIGHEST COUNT TO DATE ; ÿ2(R6) = NUM NEEDED ; ÿ@(R6) = ADR-2 OF BOTTOM WORD ; ÿR1 = ADR FIRST WORD OF MAP ; ÿR2 = ADR OF HI WORD ; ÿR3 = HIGH BLOCK # ; ÿR4 = COUNTER ; ÿR5 = MASK CBAP2: CBLUP1: ÿMOV ÿ#100000,R5 ÿ ÿ;SET MASK CBLOOP: ÿBIT ÿR5,@R2 ÿ ÿ ÿ;BIT FREE ÿBNE ÿCBAON ÿ ÿ ÿ;NO---IT ON ÿINC ÿR4 ÿ ÿ ÿ;YES---INC COUNT ÿCMP ÿR4,2(R6) ÿ z ÿBIC ÿ#177770,R3 ÿASL ÿR3 ÿADD ÿR3,R5 ÿADD ÿ#BMPTR,R5 ÿ;@R5 IS THE ADDRESS OF THE ÿ ÿ ÿ ÿ;1ST FIB IN THIS CHAIN DVFL00: ÿCMP ÿ@R5,R4 ÿBEQ ÿDVFL05 ÿ ÿ;UNLINK THIS FIB ÿMOV ÿ@R5,R5 ÿBR ÿDVFL00 DVFL05: ÿMOV ÿ@R4,@R5 ÿMOV ÿFIBLNK(R0),-(R6) ÿMOV ÿ#1,-(R6) ÿ;RELEASE THE FIB ÿMOV ÿ@#S.RBUF,-(R6) ÿJSR ÿPC,@(R6)+ ÿCLR ÿFIBLNK(R0) ÿ;SO INDICATE IN THE DDB ÿMOV ÿ@R0,-(R6) ÿ;OUTPUT THE CALL ADDRESS ÿMOV ÿ#1406,-(R6) ÿ;AND F006 ÿIOT {ÿ10(R5),R4 ÿBIC ÿ#177700,R4 ÿBEQ ÿDRFS10 ÿ ÿ;FILE NOT OPEN ÿBIS ÿ#20,R3 ÿ ÿ;SET FILE OPEN ÿCMP ÿR4,#76 ÿBHIS ÿDIREX DRFS10: ÿBIS ÿ#2,R3 ÿ ÿ;SET OPENI ALLOWED ÿMOV ÿ10(R6),-(R6) ÿMOV ÿ20(R5),-(R6) ÿMOV ÿ#1,-(R6) ÿ;CHECK FOR WRITE ACCESS ÿCLR ÿ-(R6) ÿEMT ÿ.CKACSP ÿTST ÿ(R6)+ ÿBNE ÿDIREX ÿ ÿ;CAN'T WRITE ÿBIT ÿ#300,10(R5) ÿ;IF FILE IS LOCKED, THEN ÿBNE ÿDIREX ÿ ÿ;CAN'T WRITE ÿTST ÿ6(R5) ÿ ÿ;IS FILE CONTIGUOUS? ÿBPL ÿDRFS15 ÿ ÿ;NO - BRANCH ÿBIS ÿ#11,R3 ÿ ÿ;OPENU & OPENC ALLOW|TART BLOCK DEL2: ÿMOV ÿ#-2,WC(R0) ÿMOV ÿ4(R6),BUFADR(BIBREG) ÿ;READ A BLOCK ÿMOV ÿ@R6,BLOCK(BIBREG) ÿJSR ÿPC,DREAD1 ÿMOV ÿ@BUFADR(BIBREG),R1 ÿ;SAVE LINK ÿCLR ÿ@BUFADR(BIBREG) ÿJSR ÿPC,DWRIT1 ÿ ÿ;ZERO THE LINK WORD ÿMOV ÿ#-64.,WC(R0) DEL3: ÿMOV ÿ@R6,R2 ÿ ÿ ÿ;DOES THE MAP IN CORE ÿMOV ÿ#1,R3 DEL3A: ÿCMP ÿR2,#960. ÿBLO ÿDEL3B ÿSUB ÿ#960.,R2 ÿ ÿ;R2=BLOCK # ÿINC ÿR3 ÿBR ÿDEL3A DEL3B: ÿCMP ÿR3,10(R6) ÿBEQ ÿDEL7 ÿ ÿ ÿ;YES ÿ ÿ ÿ ÿ ÿ;NO - IT DOESNT SO ÿMOV ÿ2(R6),BLOCK(BIBRE}ÿ;COUNT=NUM REQUIRED? ÿBEQ ÿZONKO NOTYET: ÿDEC ÿR3 ÿCLC ÿROR ÿR5 ÿ ÿ;NO - SHIFT THE MASK ÿBNE ÿCBLOOP ÿ ÿ ÿ;MASK 0? ÿTST ÿ-(R2) ÿ ÿ ÿ;YES ÿCMP ÿR2,@R6 ÿ ÿ ÿ;BOTTOM ÿBNE ÿCBLUP1 ÿBR ÿCBNXT CBAON: ÿCMP ÿR4,4(R6) ÿ ÿ;COMPARE AGAINST PREVIOUS HIGH ÿBLO ÿ.+6 ÿMOV ÿR4,4(R6) ÿCLR ÿR4 ÿ ÿ ÿ;CLEAR COUNTER ÿDEC ÿR3 ÿ ÿ ÿ; DEC OTHER COUNTER ÿCLC ÿROR ÿR5 ÿ ÿ;SHIFT THE MASK ÿBNE ÿCBLOOP CBLUP2: ÿTST ÿ-(R2) ÿ ÿ ÿ;LOOP HERE, LOOKING FOR A ÿCMP ÿR2,@R6 ÿ ÿ ÿ;WORD NE -1 ÿBEQ ÿGRUNCH~ ;FILE STRUCTURES READ/WRITE SUBROUTINE LWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 LREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETIED ÿBR ÿDIREX DRFS15: ÿBIS ÿ#4,R3 ÿ ÿ;OPENE ALLOWED DIREX: ÿSWAB R3 ÿBISB ÿ20(R5),R3 ÿSWAB ÿR3 ÿMOV ÿ14(R5),R2 ÿ ÿ; SET R2=LENGTH ÿMOV ÿ12(R5),R5 ÿ;SET R5=START BLOCK DIRX00: ÿADD ÿ#20,R6 DIREXIT: DIREX1: ÿMOV ÿR2,20(R6) ÿTST ÿ22(R6) ÿ ÿ;STARTING BLOCK REQUIRED? ÿBNE ÿDIREX2 ÿ ÿ;NO - BRANCH ÿMOV ÿR5,20(R6) ÿ;PUT START BLOCK AT HEAD ÿMOV ÿR2,22(R6) ÿ;FOLLOWED BY LENGTH AND ÿMOV ÿR3,24(R6) ÿ;STATUS/PROTECT WORD ÿBR ÿDIRGO DIREX2: ÿMOV ÿR3,22(R6) DIRGO: ÿTST ÿFIBLNK(R0)€G) ÿ;WRITE THE CURRENT AP ÿMOV ÿ6(R6),BUFADR(BIBREG) ÿJSR ÿPC,DWRIT1 DEL4: ÿMOV ÿR3,10(R6) ÿ ÿ;DETERMINE THE PROPER MAP # ÿMOV ÿ16(R6),R4 ÿCMP ÿ(R4)+,(R4)+ ÿTST ÿ(R4)+ ÿDEC ÿR3 ÿBNE ÿ.-4 ÿMOV ÿ@R4,2(R6) ÿMOV ÿ@R4,BLOCK(BIBREG) ÿMOV ÿ6(R6),BUFADR(BIBREG) ÿJSR ÿPC,DREAD1 ÿ ÿ; READ THE PROPER MAP ÿ ÿ ÿ ÿ;THE CURRENT MAP REPRESENTS THIS BLOCK ÿ ÿ ÿ ÿ;CLEAR THE BIT ÿ ÿ ÿ ÿ;REGISTER STATUS IS ÿ ÿ ÿ ÿ;R0=BIB ÿ ÿ ÿ ÿ;R1=L INT. ÿ ÿ ÿ ÿ;@R6=CLEAR BLOCK # DEL7: ÿMOV ÿ@R6,R4 ÿ� ÿCMP ÿ@R2,#-1 ÿBNE ÿCBLUP1 ÿSUB ÿ#20,R3 ÿBR ÿCBLUP2 GRUNCH: CBNXT: ÿCMP ÿ-4(R2),#1 ÿ ÿ; ANY MORE MAPS? ÿBEQ ÿTOOBAD ÿ ÿ ÿ; YOU LOSE ÿDEC ÿBLOCK(R0) ÿJSR ÿPC,@CBAREAD1 ÿMOV ÿ-2(R2),R5 ÿ ÿ;RESET R2 ÿADD ÿR5,R2 ÿADD ÿR5,R2 ÿBR ÿCBLUP1 ZONKO: ÿMOV ÿR4,4(R6) ÿ ÿ;HI CNT EQ NUM REQ ÿMOV ÿ4(R1),R1 ÿASL ÿR1 ÿADD ÿ@R6,R1 ÿTST ÿ(R1)+ ÿ ÿ ÿ; SET R1 = LAST WRD OF MAP ZONK1: ÿBIS ÿR5,@R2 ÿ ÿ ÿ;AND MASK ONTO WORD ÿDEC ÿR4 ÿ ÿ ÿ;DEC COUNT ÿBEQ ÿCBADONE ÿASL ÿR5 ÿBNE ÿ‚ON RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿLREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEAƒ ÿ ÿ; IS THERE A FIB? ÿBEQ ÿDIRG01 ÿ ÿ ÿ; NO ÿMOV ÿ@PC,-(R6) ÿ ÿ; RELEASE FIB AND BUFFER ÿEMT ÿ.RLSFIB DIRG01: ÿCLR ÿ@R0 ÿ ÿ;MARK DDB FREE ÿMOV ÿ@#S.EXIT,R5 ÿ ÿ; SET R5 TO THE ADR OF THE RRES ÿ ÿ ÿ ÿ ÿ; CALL IN THE COMMON EXIT ROUTINE ÿCMP ÿ(R5)+,(R5)+ ÿTSTB ÿDIRS ÿ ÿ ÿ; CORE RESIDENT? ÿBNE ÿ.+4 ÿ ÿ ÿ; NOPE ÿMOV ÿR5,PC ÿ ÿ ÿ; YUP...GO TO RRES ÿMOV ÿPC,-(R6) ÿ ÿ; PUSH ABS ADR OF THE BUFFER ÿADD ÿ#DIRS-.,@R6 ÿMOV ÿ#20,-(R6) ÿ ÿ; PUSH BUF SIZE ÿMOV ÿR5,-(R6) ÿ ÿ; FAKE A JSR TO RBUF„ÿ ÿ;CONVERT BLOCK # TO A WORD ÿBIC ÿ#177760,R4 ÿMOV ÿ#1,R5 ÿ ÿ;R5=MASK ÿDEC ÿR4 ÿBMI ÿ.+6 ÿASL ÿR5 ÿBR ÿ.-6 ÿMOV ÿR2,R4 ÿASR ÿR4 ÿASR ÿR4 ÿASR ÿR4 ÿBIC ÿ#1,R4 ÿ ÿ ÿ; MAKE R4 EVEN ÿADD ÿ#10,R4 ÿADD ÿ6(R6),R4 ÿBIC ÿR5,@R4 ÿ ÿ;CLEAR IT ÿMOV ÿR1,@R6 ÿ ÿ;LINK BECOMES NEXT BLOCK ÿBNE ÿDEL2 ÿ ÿ;MORE TO GO? DELSOS: ÿTST ÿ(R6)+ ÿ ÿ; SKIP OVER TOP ELEMENT ÿMOV ÿ(R6)+,BLOCK(R0) ÿ; GET BLK NUM CUR BIT MAP ÿTST ÿ(R6)+…ÿZONK1 ÿ ÿ ÿ;MASK EQ 0 ÿTST ÿ(R2)+ ÿ ÿ ÿ;YES---WORD=WORD+2 ZONK2: ÿCMP ÿR2,R1 ÿ ÿ ÿ;TOO HI? ÿBLO ÿZONK2A ÿ ÿ;NO - BRANCH CBW1: ÿJSR ÿPC,@CBAWRIT1 ÿ;WRITE THE MAP ÿMOV ÿ@BUFADR(BIBREG),BLOCK(BIBREG) ÿJSR ÿPC,@CBAREAD1 ÿ;READ THE NEXT ONE ÿMOV ÿ@R6,R2 ÿ ÿ;WORD=START ÿTST ÿ(R2)+ ÿ ÿ;KEEP GOING ZONK2A: ÿCMP ÿR4,#20 ÿ ÿ ÿ;NO---IF COUNT GT 16, THEN SET ÿBHIS ÿZONK3 ÿ ÿ ÿ;THE NEXT WORD TO -1, ETC ÿMOV ÿ#1,R5 ÿ ÿ; RESET MASK ÿBNE ÿZONK1 ZONK3: ÿMOV ÿ#-1,(R2)+ ÿSUB ÿ#20,R4 ÿBNE ÿZONK2 RS DDB, SO RESTORE ABOVE CAT ÿ=.-BALLOC ÿ.END ÿ ÿ; END OF LBA ‡ ÿMOV ÿ@#S.RBUF,PC ÿ ÿ; AND RETURN TO S.EXIT ÿ DIER15: ÿMOV ÿ#15,R2 ÿ ÿ ÿ;; ILLEGAL NAME DIERR: ÿTST ÿ(R1)+ ÿ ÿ ÿ; BUMP R1 TO FNB ÿTST ÿ@R1 ÿBNE ÿDIERR1 ÿ ÿ;IN CASE BLOCK WAS REQUESTED ÿTST ÿ(R1)+ DIERR1: ÿMOV ÿ@R1,R5 ÿ ÿ ÿ; GET ADR ERROR CODE ÿADD ÿ#20,R6 ÿMOVB ÿR2,-(R5) ÿ ÿ; SET ERROR CODE ÿTSTB ÿ-(R5) ÿ ÿ ÿ; BUMP POINTER ÿMOV ÿ#ILFSOP,R4 ÿ ÿ; SET R4 EQ ERR CODE ÿBR ÿDIRAT1 DIRNOBUF: DIRRATS: MOV ˆ ÿ ÿ ÿ; SKIP OVER TOP ELEMENT ÿMOV ÿ(R6)+,BUFADR(R0) ÿ; SET BUFADR IN DDB ÿJSR ÿPC,DWRIT1 ÿ ÿ; WRITE IT ÿTST ÿ(R6)+ ÿ ÿ ÿ; SKIP OVER TOP ELEMENT ÿMOV ÿ(R6)+,BLOCK(R0) ÿ ÿ; IF A BIT MAP WAS ORIG IN ÿMOV ÿ(R6)+,BUFADR(R0) ÿ; CORE, THEN READ IT BACK ÿBEQ ÿDELS1 ÿJSR ÿPC,DREAD1 DELS1: ÿMOV ÿ#20,-(R6) ÿ ÿ; RELEASE THE BUF ÿMOV ÿ@#S.RBUF,R5 ÿJSR ÿR5,@R5 ÿMOV ÿ(R6)+,WC(R0) ÿ;RESTORE ORIGINAL WORD COUNT ÿMOV ÿ@#S.RSAV,R5 ÿJSR ÿR5,@R5 ÿ ÿ; SET UP STACK FOR EXIT THRU MON ÿMOV ÿ@#S.EXI‰CBADONE: JSR ÿPC,@CBAWRIT1 CBADUN: MOV ÿFIBLNK(BIBREG),R4 ÿMOV ÿR0,R2 ÿ ÿ;GET A FLOATING DDB PTR ÿCMP ÿ(R2)+,(R2)+ ÿMOV ÿ6(R6),(R2)+ ÿ; READ BACK ORIG MAP IF ORIG IN CORE ÿMOV ÿ10(R6),@R2 ÿBEQ ÿ.+6 ÿJSR ÿPC,@CBAREAD1 ÿSUB ÿ#6,@R6 ÿ ÿ ÿ; CALC ADR OF ORIG BUFADR ÿMOV ÿ(R6)+,@R2 ÿMOV ÿ2(R4),-(R2) ÿMOV ÿ10(R6),WC(R0) ÿ ÿ; RESTORE ORIG WC ÿJSR ÿPC,@CBAREAD1 ÿ ÿ; READ BACK DIR ENTRY BLK ÿMOV ÿ4(R4),R2 ÿMOV ÿR3,-(R2) ÿADD ÿ@R6,@R2 ÿ ÿ ÿ; SET LAST BLK ÿDEC ÿ@R2 ÿMOV ÿ@R6,-(R2) ÿ ÿŠ ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ;   DISK FILE STRUCTURE PROGRAM ;   V003B ;  DIGITAL EQUIPMENT CORP. ;  COPYRIGHT 1971 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 R7=%7 PC=%7 MAPREG =R1 BLKREG =R2 FIB =R2 BIBREG=R0 DRVREG=ÿ#NOBUFR,R4 ÿ ÿ; SET R4 EQ ERR CODE ÿMOV ÿ@R1,R5 DIRAT1: ÿMOV ÿ-(R5),14(R6) ÿ ÿ; SET ERR RTN ÿBNE ÿDIRGO ÿ ÿ ÿ; BR IF NONZERO ADR ÿMOV ÿ@R0,-(R6) ÿ ÿ; OTHERWISE CALL DIAG PRINT ÿMOV ÿR4,-(R6) ÿIOT ÿ.END ŒT,R5 ÿTSTB ÿDELNK ÿBNE ÿ.+4 ÿCMP ÿ(R5)+,(R5)+ ÿMOV ÿR5,PC ÿ ÿ ÿ; GO BABY ÿ ÿ;STACK LOOKS LIKE THIS FOR ÿ ÿ;DELETION OF LINKED FILES ; ÿ ÿCUR BLOCK ÿ ÿ0 ; ÿ ÿCUR BM BLOCK ÿ ÿ2 ; ÿ ÿBUFADR FILE ÿ ÿ4 ; ÿ ÿBUFADR MAP ÿ ÿ6 ; ÿ ÿCURRENT BM# ÿ ÿ10 ; ÿ ÿHIS PBM BLOCK# ÿ ÿ12 ; ÿ ÿHIS PBM BUFADR ÿ ÿ14 ; ÿ ÿBUFADR MFD #1 ÿ ÿ16 ; ÿ ÿDIR BLOCK ÿ ÿ20 ; ÿ ÿDIR BUFADR ; ÿ ÿADR DIR ENTRY ; ÿ ÿFIL ; ÿ ÿNAM ; ÿ ÿEXT ; ÿ ÿUIC ; ÿ ÿP/MODE ; ÿ ÿRTN ADR ;FILE STRUCTURES READ/WRITE SUBROUT�ÿ; LENGTH ÿMOV ÿR3,-(R2) ÿ ÿ; START ÿJSR ÿPC,@CBAWRIT1 ÿ ÿ; NOW WRITE IT CBARTN: MOV ÿR0,-(R6) ÿ ÿ; YUK YUK YUK ÿMOV ÿ@#S.EXIT,R5 ÿ ÿ; GET ADR COMMON EXIT ÿTSTB ÿGETCONTIG ÿ ÿ; SEE IF IN SWAP BUFFER ÿBNE ÿ.+4 ÿ ÿ ÿ; YUP ÿCMP ÿ(R5)+,(R5)+ ÿ ÿ; NOPE..DONT DECB MSB+2 ÿMOV ÿR5,PC TOOBAD: ÿMOV ÿFIBLNK(R0),R4 ÿTST ÿ(R4)+ ÿMOV ÿ(R4)+,BLOCK(R0) ÿMOV ÿ12(R6),WC(R0) ÿ ÿ; RESTORE ORIG WC ÿJSR ÿPC,@CBAREAD1 ÿMOV ÿ@R4,R2 ÿSUŽR5 DATREG=R4 RTMP=R5 ADR=R4 OPNIFLG=4 OPNUFLG =1 OPNEFLG =3 OPNOFLG =2 OPNAFLG =5 OPNCFLG=13 LOGNAM=2 IN=4 OUT=2 EOF=40000  ; FIB ASSIGNMENTS NXTBLK =0 HOWOPEN =2 BEGEXT =4 TYPE =6 STRT =12 LENGTH =14 LAST =16 DIRITM =20 DIRBLK =22 IF =26 CBMPTR =30 FLINK =32  ; BIB ASSIGNMENTS UFDPTR =2 MYWORD =2 BLOCK =4 BUFADR =6 WC =10 STATUS =12 UNIT =13 DEVNO =13 DUNRTN =14 BUFP� ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ;   DISK FILE STRUCTURE PROGRAM ;   V003B ;  DIGITAL EQUIPMENT CORP. ;  COPYRIGHT 1971 R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 R6=%6 R7=%7 PC=%7 �INE DWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 DREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;B ÿ#20,R2 ÿCLR ÿ(R2)+ ÿCLR ÿ(R2)+ ÿCLR ÿ(R2)+ ÿCLR ÿR2 ÿMOV ÿ-2(R0),R5 ÿBISB ÿSBS(R5),R2 ÿASR ÿR2 ÿASR ÿR2 TBD05: ÿASR ÿR2 ÿ ÿ;CONVERT BLOCKS REQ'D ÿBCS ÿCBADONE ÿ ÿ;AND BLOCKS AVAILABLE TO ÿASL ÿ4(R6) ÿ ÿ;64 WORD SEGMENTS REQ'D ÿASL ÿ2(R6) ÿ ÿ;AND 64 WORD SEGMENTS ÿBR ÿTBD05 ÿ ÿ;AVAILABLE, RESPECTIVELY ÿCAT ÿ=.-GETCONTIG .END ’TR =16 BC =20 CKSUM =22 MINE2 =22 DATPTR =24 FIBLNK =26  ; DRIVER ASSIGNMENTS SBS =4 DSKTFR =10 MFDPTR =16 BMPTR =20 ; OTHER ASSIGNMENTS S.EXIT=42 S.RSAV=44 S.RRES=46 S.CDB=50 S.CDQ=52 GETBUF=54 S.RBUF=56  DKDRVR=1540 DTDRVR=4100 DKFULL =1406 PARERR =1417 BADOPN =1412 NOBUFR =1407 ILFSOP =1423 DFMFD=1 DTMFD=100 BCKWRD =4000 ; EMT ASSIGNMENTS .DATE =41 .INIT =6 .RLS =7 “ MAPREG =R1 BLKREG =R2 FIB =R2 BIBREG=R0 DRVREG=R5 DATREG=R4 RTMP=R5 ADR=R4 OPNIFLG=4 OPNUFLG =1 OPNEFLG =3 OPNOFLG =2 OPNAFLG =5 OPNCFLG=13 LOGNAM=2 IN=4 OUT=2 EOF=40000  ; FIB ASSIGNMENTS NXTBLK =0 HOWOPEN =2 BEGEXT =4 TYPE =6 STRT =12 LENGTH =14 LAST =16 DIRITM =20 DIRBLK =22 IF =26 CBMPTR =30 FLINK =32  ; BIB ASSIGNMENTS UFDPTR =2 MYWORD =2 BLOCK =4 BUFADR =6 WC =10 ”CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿDREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE CAT ÿ=.-DELNK ÿ.EN• ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 – .ALLOC =15 .RENAM =20 .APPEND =22 .PROTECT =24 .DELETE =21 .WRITMAP=50 .GETMAP =50 .BALLOC =47 .GETCONTIG =51 .LOOKUP =46 .CKACSP =52 .DELNK =53 .DELCONTIG =54 .SETUPFIB =52 .RLSFIB =52 .APNDP2=55 .DIRECT=14 UIC=440 DAT=432 .TITLE FOP .GLOBL FOP ;////////////////////////— STATUS =12 UNIT =13 DEVNO =13 DUNRTN =14 BUFPTR =16 BC =20 CKSUM =22 MINE2 =22 DATPTR =24 FIBLNK =26  ; DRIVER ASSIGNMENTS SBS =4 DSKTFR =10 MFDPTR =16 BMPTR =20 ; OTHER ASSIGNMENTS S.EXIT=42 S.RSAV=44 S.RRES=46 S.CDB=50 S.CDQ=52 GETBUF=54 S.RBUF=56  DKDRVR=1540 DTDRVR=4100 DKFULL =1406 PARERR =1417 BADOPN =1412 NOBUFR =1407 ILFSOP =1423 DFMFD=1 DTMFD=100 BCKWRD =4000 D ÿ ÿ; END OF DLN ™ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTSš// ;///////////////////////// COMMON FILE STRUCTURES OPENER FSOPEN: 177400   ;COMMON CODE TO MOVE CODE    ; FLAG FOR SAM.....NON REENTRANT,0 FOP: ADD PC,R5  ; R5=177776 VIA SAM TST -(R5)  ; LOOK AT FIRST WRD OF CODE TSTB @R5  ; IN SWAP BUFFER? BEQ OPEN  ; IF RESIDENT THEN SKIP MOV #20,-(R6) ; DISK RESIDENT. GET A BUFFER MOV @#GETBUF,R4 JSR R5,@R4 MOV (R6)+,R3 ; PUT ADR INTO R3 BNE .+6 JMP NOBUF MOV R3,R4  ; LOOP TO DO THE MOVE MOV › ; EMT ASSIGNMENTS .DATE =41 .INIT =6 .RLS =7 .ALLOC =15 .RENAM =20 .APPEND =22 .PROTECT =24 .DELETE =21 .WRITMAP=50 .GETMAP =50 .BALLOC =47 .GETCONTIG =51 .LOOKUP =46 .CKACSP =52 .DELNK =53 .DELCONTIG =54 .SETUPFIB =52 .RLSFIB =52 .APNDP2=55 .DIRECT=14 UIC=440 DAT=432 .TITLE FCR .Gœ ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1� ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=žR5,R2 MOV (R2)+,(R3)+ INC @R4 BLE .-4 SUB R2,R3  ; FIRST WORD NOW EQ 1 ADD R3,PC  ; GO BABY CLR @R5 CLR -2(R5) OPEN: MOV (R6)+,R0 ; GET DDB PTR MOV (R6)+,R1 ; ... & ONE TO ARGS    ; THEN LEAVES 6 WORDS ON STACK    ; FOR LOOK UP EMT .LOOKUP  ; LOOKUP CLR R5  ; NOT USED UNTIL ALL ERRORS    ; FOUND SO USE AS FLAG MOV (R6)+,R2 CMP R2,#-3   ; FILE EXIST? BHIS ŸLOBL FCR ; OPENO ; INPUTS ; 2(R0)=NEGATIVE IF THIS IS DT ; WHEN CALLED BY COMMON OPEN PREPROCESSOR THE REGS ARE: ;  R0=ADR DDB ;  R1 POINTS TO THE FIRST ARGUMENT(NOW IN DDB+16)  FIB=R2 OPENO: 177400   ;COMMON CODE TO MOVE CODE    ; FLAG FOR SAM.....NON REENTRANT,0 FCR: ADD PC,R5  ; R5=177776 VIA SAM TST -(R5)  ; LOOK AT FIRST WRD OF CODE MOV (R6)+,R0 ; POP STACK INTO R0 MOV (R6)+,R1 ; POP STACK INTO R1.THIS LEAVES     ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=20000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿF¡1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿCKX .GLOBL ÿCKX ¢ERR2   ; TOO BAD MOVB 10(R2),R3  ; DOES OPEN FIELD IN THE     ; DIR EQ 76 OR 77? BIC #177700,R3 CMP R3,#76 BHIS ERR3   ; TOO BAD MOV FIBLNK(R0),R4 MOV HOWOPEN(R4),R3 CMP R3,#OPNIFLG  ; THIS AN OPENI? BEQ OPEN1   ; YES CMP R3,#OPNCFLG  ; CK AGAIN BNE .+10 TST 6(R2)   ; OPENC TO A LINKED FILE? BPL ERR10   ; ASS BIT #300,10(R2)  ; NO...CK LOCK BITS BNE ERR4   ; WISE GUY BIS #100,10(R2)  ; LOCK FILE FOR EXT. AND UPD£ ; 6 WORDS ON STACK FOR LUKUP.    ; NEAT, HUH? TSTB @R5  ; IN SWAP BUFFER? BEQ OPNO  ; IF RESIDENT THEN SKIP MOV #20,-(R6) ; DISK RESIDENT. GET A BUFFER MOV @#GETBUF,R4 JSR R5,@R4 MOV (R6)+,R3 ; PUT ADR INTO R3 BEQ NOBUF  ; TOO BAD MOV R3,R4  ; LOOP TO DO THE MOVE MOV R5,R2 MOV (R2)+,(R3)+ INC @R4 BLE .-4 SUB R2,R3  ; FIRST WORD NOW EQ 1 ADD R3,PC  ; GO BABY CLR @R5 CLR -2(R5) ¤IBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1423 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ¥ ; ÿTHIS ROUTINE IS A UTILITY PROGRAM OF THREE PARTS: ; ÿ ÿ CHECK ACCESS PRIVELEGE ; ÿ ÿSETUP FIB ; ÿ ÿRELEASE FIB ; ; ÿTO CALL THE PROGRAM ,PUSH A 0,+1, OR -1 RESPECIVELY ; ÿONTO THE STACK BEFORE THE EMT CALL IS MADE ; ÿ THE PROGRAM WILL THEN DISPATCH TO THE PROPER SEGMENT ; ; ÿN.B. THE EMT CODES FOR CKACSP,SETUPFIB,AND RELEASEFIB ARE ; ÿTHE SAME ÿ ÿ ÿ ÿ ÿ; ROUTINE TO CHECK ACCESS PRIVELEGE ÿ ÿ ÿ ÿ; INPUTS ÿ ÿ ÿ ÿ; ÿSTACK ÿ ÿ ÿ ÿ; ÿ ÿRTN ADR ÿ ÿ ÿ ÿ; ÿ ÿTYPE ACCESS DESIRED ¦ATE TST 6(R2)   ; REMEMBER THAT R2 HOLDS     ; ADR OF THE DIR ENTRY     ; OPENE TO A CONTIG FILE? BPL OPEN1 CMP R3,#OPNEFLG BEQ ERR5   ; ZONKO OPEN1: MOV #1,-(R6)  ; SET FLG EMT .SETUPFIB   ; SET UP FIB INC 10(R2)   ; INC THE OPEN FIELD OF THE     ; DIRECTORY ENTRY. IF EVERY-     ; THING GOES OK IT WILL BE     ; WRITTEN OUT LATER MOV 6(R6),-(R6)  ; UIC MO§OPNO: MOV 2(R0),R4  ; SET R4 EQ DT INDICATOR CLRB R4   ; USE BOTTOM AS ERR FLG MOV FIBLNK(R0),FIB  ; SET R2 EQ ADR FIB EMT .LOOKUP   ; SEE IF FILE EXISTS MOV (R6)+,R5  ;SET R5 EQ RTN ARG FROM LUK     ; IF R5 EQ -1,THEN NO UIC    ; IF R5 EQ -2,THEN NO FILE    ; IF R5 EQ -3,THEN NO UFD.    ; OTHERWISE,THE FILE EXISTS MOV R6,R3  ; CHECK TO SEE IF FILE IS    ; NAMED 00.0 MOV (R3)+,-(R6) BIS (R3)+,@R6 BIS (R3¨ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.WRITMAP=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿGMA .GLOBL ÿGMA ÿ; ROUTINE TO GET BIT MAP ÿ; FOR OPEN FUNCTIONS ÿ; CAN BE CORE OR DISK RESIDENT ÿ; CALLING SEQUENCE ÿ; ÿEMT ÿ.GETMAP ÿ; USES USER DDB ÿ; RETURNS WITH FIB+0© ÿ ÿ ÿ ÿ; ÿ ÿP CODE ÿ ÿ ÿ ÿ; ÿ ÿUIC ÿ ÿ ÿ ÿ; OUTPUTS TOP OF STACK ÿ ÿ ÿ ÿ; ÿ0....OK ÿ ÿ ÿ ÿ; ÿ-1...ERROR ÿ ÿ ÿ ÿ; CALLED BY JSR PC ÿ ÿ ÿ ÿ; DESTROYS R5,R3 ÿ; RULES ÿ; ÿ ÿ; ÿOWNER CAN'T WRITE IT BIT 6 IS SET ÿ; ÿ; ÿFRIENDS CAN'T READ IF FRIENDS FIELD IS GT 3 ÿ; ÿ; ÿFRIENDS CAN'T WRITE IF FRIENDS FIELD IS GT 1 ÿ; ÿ; ÿENEMIES HAVE THE SAME PROBLEM CKACSP: ÿ177400 ÿ ÿ ÿ; FLAG FOR SAM...NON REENTRANT,0 CKX: ÿMOV ÿ@R6,R0 ÿ ÿ ÿ; RESTORE R0 ÿTST ÿ20(R6) ÿ ÿ; SEE WHY WE AªV 20(R2),-(R6)  ; GET PCODE FROM DIR ENTRY MOV #3,-(R6)  ; FOR OPENI, PUSH A 1 CMP R3,#OPNIFLG  ; OTHERWISE,PUSH A 3 BEQ .+4 ASR @R6 CLR -(R6) EMT .CKACSP   ; CHECK ACCESS PRIV TST (R6)+ BNE ERR6 OPNEXIT: CMP R3,#OPNEFLG  ; IS THIS AN OPENE? BHI OPNEX3   ; SKIP IF OPENI BNE OPNEX2    ; NO MOV BLOCK(BIBREG),-(R6) ; SAVE BLK NUM OF DIR ENTRY EMT .GETMAP  ; GETMAP MOV 16(R2),BLOCK(R0) ; RESTORE BLK NUM OF DIR ENTRY TST @R4 «)+,(R6)+ BEQ ERR15  ; ILLEGAL NAME MOV R0,R3  ; SET PTR AT DDB+2 TST (R3)+  ; (SET BY LOOKUP) INC R5  ; ARG EQ -1 OR ABOVE? BGT ERR2  ; IF SO FILE EXISTS ... BEQ ERR13  ; .... OR NO UIC INC R5  ; ARG EQ -2? BEQ SEMPTY  ; IF SO CHECK FOR MT SLOT INC R5  ; IF ARG EQ -3 ... BNE ERR2  ; THERE'S NO UFD SO ... BR ADDTWO  ; ... GO GET ONE SEMPTY: MOV (R3)+,R5  ; PICK UP BLK NUM OF     ; AN EMPTY SLOT.PUT THERE BY LUK BNE OP02   ¬: ÿ=0 IF MAP SET UP ÿ; ÿ ÿ ÿ=+1 IF NO BUFFER AVAILABLE ÿ; ÿ ÿ ÿ=-1 IF FILE ALREADY OPEN ON DT GETMAP: ÿ177400 ÿ ÿ ÿ; FLAG FOR SAM...NON REENTRANT,0 GMA: ÿMOV ÿ@R6,R0 ÿ ÿ ÿ; RESTORE R0 ÿMOV ÿFIBLNK(R0),R2 ÿ ÿ; GET ADR OF FIB ÿMOV ÿR2,R1 ÿ ÿ ÿ; ... & OF MAP PTR IN FIB ÿADD ÿ#CBMPTR,R1 ÿMOV ÿWC(R0),-(R6) ÿ;SAVE ORIGINAL WORD COUNT ÿMOV ÿ#-64.,WC(R0) ÿ;SETUP FOR 64 WORD XFRS ÿTST ÿ10(R6) ÿ ÿ ÿ; LOOK AT ORIG R3.IF ÿ ÿ ÿ ÿ ÿ; R3=0 ,THEN WRITMAP ÿ ÿ ÿ ÿ ÿ; IF R3 NE 0,THEN GETMAP ÿBNE ÿGE­RE HERE ÿBMI ÿTORLSFIB ÿBNE ÿSETUPFIB ÿCMP ÿ26(R6),@#UIC ÿ; CALLER THE OWNER? ÿBNE ÿCKAP1 ÿ ÿ; NO ÿCMP ÿ22(R6),#1 ÿ; YES...THEN THE ONLY THING ÿBHI ÿCKAOK ÿ ÿ; HE CAN'T DO IS WRITE ON ÿBIT ÿ#100,24(R6) ÿ; HIS FILE IF HE PROTECTED ÿBNE ÿCKERR1 ÿ ÿ; HIMSELF ÿBR ÿCKAOK CKAP1: ÿMOV ÿ24(R6),R5 ÿ; P CODE IN R5 ÿMOV ÿ22(R6),R3 ÿ; ACCESS DESIRED IN R3 ÿCMPB ÿ27(R6),@#UIC+1 ÿBEQ ÿCKAPFRND ÿ ÿ ÿ ÿ; CHECK TO SEE IF ACCESS ÿ ÿ ÿ ÿ; DESIRED IS LOWER (HIGHER) CKAPWRLD: MOV ÿ#177770,-(R®  ; OK? BMI ERR11  ; IDIOT BNE NOBUF2 EMT .BALLOC  ; BALLOC MOV (R6)+,BLOCK(BIBREG) MOV @R4,BEGEXT(R4)  ; SAVE BLK NUM OF FRST BLK OF EXT BEQ ERR7   ; ERROR SOMEWHERE OPNEX2: JSR PC,OPNWRIT1 OPNEX3: MOV R0,R1   ; SET VARIABLE DDB PTR CMP (R1)+,(R1)+  ; ... & MOVE TO BLOCK MOV @R4,(R1)+  ; STORE FIRST CLR R2   ; CLEAR A FLAG TST 6(R4)   ; ... FOR CONTIG FILE BMI OPNEX4 ¯; CONTINUE LATER IF ONE AVAIL.     ; ADD A BLOCK TO DIR THEN ADDONE:     ; N.B. R3 STILL POINTS TO BLK TST R4   ; IS THIS A DT? BMI ERR12   ; WHY ME GOD? MOV BUFADR(R0),-(R3) ; SET UP FOR LINK BELOW ADDTWO: EMT .GETMAP MOV @FIB,-(R6)  ; IF NO MAP ... BNE NOBUF   ; ... CAN'T GO ON EMT .BALLOC MOV R3,@R6  ; SAVE DDB PTR CLR R3   ; R3 MUST EQ 0 FOR WRITMAP EMT .WRITMAP  ; WRITE THE PBM MOV (R6)+,R3  ; RESTORE PTR MOV @FIB,@(R3)°TM0 WRITMAP: MOV ÿR0,R3 ÿ ÿ ÿ; SET R3 EQ ADR BLOCK(R0) ÿCMP ÿ(R3)+,(R3)+ ÿMOV ÿ(R3)+,-(R6) ÿ ÿ; SAVE ORIG BLK NUM ÿMOV ÿ@R3,-(R6) ÿ ÿ; SAVE BUFADR ÿMOV ÿ@R1,R5 ÿ ÿ ÿ; GET MAPADR ÿMOV ÿR5,@R3 ÿ ÿ ÿ; SET BUFADR EQ MAPADR ÿMOV ÿ6(R5),-(R3) ÿ ÿ; SET BLK(R0) EQ 1ST BLK-1 ÿADD ÿ2(R5),@R3 ÿ ÿ ÿDEC ÿ(R3)+ ÿ ÿ ÿ; DEC BLOCK NUM ÿJSR ÿPC,GETMWRIT1 ÿ ÿ; WRITE THE MAP ÿMOV ÿ(R6)+,@R3 ÿ ÿ; RESTORE BUFADR ÿMOV ÿ(R6)+,-(R3) ÿ ÿ; RESTORE BLK NUM ÿBR ÿGETM2 ÿ ÿ ÿ; EXIT ±6) ÿBR ÿCKAPW1 CKAPFRND: MOV ÿ#177707,-(R6) ÿASL ÿR3 ÿASL ÿR3 ÿASL ÿR3 CKAPW1: BIC ÿ(R6)+,R5 ÿCMP ÿR3,R5 ÿBLO ÿCKERR1 CKAOK: ÿCLR ÿ26(R6) ÿBR ÿCKOUT CKERR1: ÿMOV ÿ#-1,26(R6) CKOUT: ÿMOV ÿ@#S.RRES,R5 ÿ ÿ; RESTORE REGS ÿJSR ÿR5,@R5 ÿMOV ÿ(R6)+,4(R6) ÿ ÿ; MOVE PC DOWN ÿMOV ÿ(R6)+,4(R6) ÿ ÿ; MOVE ST DOWN ÿTST ÿ(R6)+ CKEXIT: ÿMOV ÿ@#S.RSAV,-(R6) ÿ; PUT REGS BACK ON STACK ÿJSR ÿR5,@(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ ÿ; GET ADR COMMON EXIT ÿTSTB ÿCKACSP ÿ ÿ; SEE IF IN SWAP BUFFER² MOV (R1)+,R2  ; OTHERWISE CLEAR BUFFER SUB @R1,R2   ; ... FROM BOTTOM UP SUB (R1)+,R2 CLR -(R2) CMP R2,-4(R1) BNE .-6 CMP R3,#OPNIFLG  ; THIS AN OPENI? BNE OPNEX4-2   ; NO JSR PC,OPNREAD1  ; YES...READ FIRST BLK OF FILE MOV @R2,@R4  ; GET LINK TO NEXT BNE .+6   ; SET EOF IF NECESSARY BIS #EOF,@R1 TST (R2)+  ; SET BUFFER POINTER OPNEX4: MOV R2,BUFPTR(R0) BIS #200,STATUS(R0)  ;SET OPEN SWITCH OPNEX5: ADD #12,R6 CLR @R0  ³+  ; LINK UFD AS REQD JSR PC,OPNOWRIT1  ; WRITE OUT PREV BLK MOV @FIB,@R3  ; STORE BLK NO FOR LATER JSR PC,CLRBUF JSR PC,OPNOWRIT1  ; ... & CLEAR NEW BLOCK BR OP03   ; R3=ADR OF BUFF+2 ERR15: ADD #2,R4   ; ILLEGAL FILE NAME ERR13: INC R4   ; UNKNOWN UIC ERR12: INC R4   ; DT DIRECTORY FULL ERR11: ADD #7,R4   ; 2ND FILE ON DT UNIT ERR2: ADD #2,R4   ; FILE EXISTS ALREADY CMP (R1)+´GETM0: ÿCLR ÿ@R2 ÿ ÿ ÿ; SET SW FOR RTN STATE ÿTST ÿ(R1)+ ÿ ÿ ÿ; MAP ALREADY IN? ÿBNE ÿGETM2 ÿ ÿ ÿ; THEN EXIT ÿCLR ÿ@R1 ÿ ÿ ÿ; OTHERWISE CLEAR LINK ÿMOVB ÿDEVNO(R0),R3 ÿ ÿ; GET DEVICE UNIT ÿBIC ÿ#177770,R3 ÿASL ÿR3 ÿ ÿ ÿ; GET ITS MAP PTR ÿADD ÿ-2(R0),R3 ÿADD ÿ#BMPTR,R3 ÿMOV ÿ@R3,R4 ÿ ÿ ÿ; MAP IN CORE? ÿBEQ ÿGETM1 ÿ ÿ ÿ; IF NOT GO FETCH ÿMOV ÿ-(R0),R5 ÿ ÿ; OTHERWISE LOOK FOR DT ÿCMP ÿ(R0)+,(R5)+ ÿ ÿ; ... VIA DRIVER TABLE ÿBIT ÿ#40000,@R5 ÿ ÿµ ÿBNE ÿ.+4 ÿ ÿ ÿ; YUP ÿCMP ÿ(R5)+,(R5)+ ÿ ÿ; NOPE..DONT DECB MSB+2 ÿMOV ÿR5,PC TORLSFIB: JMP ÿRLSFIB ÿ ÿ;ROUTINE TO SET UP FIB ; ÿWHEN THIS ROUTINE IS CALLED A FIB MAY OR ; ÿMAY NOT BE IN EXISTENCE. IF IT IS,THEN THERE MAY ; ÿALREADY BE A MAP ASSOCIATED WITH IT. WHEN IT IS ; ÿNECESSARY TO ACTUALLY GET A BUFFER FOR THE FIB,IT ; ÿWILL BE CLEARED. ; ÿIT WILL BE NECESSARY TO GET A BUFFER WHEN CALLED BY DELET¶ ; FREE DATASET MOV @#S.EXIT,R5  ; SET R5 TO THE ADR OF THE RRES CMP (R5)+,(R5)+  ; CALL IN THE COMMON EXIT ROUTINE TSTB FSOPEN   ; CORE RESIDENT? BNE .+4   ; NOPE MOV R5,PC   ; YUP...GO TO RRES MOV PC,-(R6)  ; PUSH ABS ADR OF THE BUFFER ADD #FSOPEN-.,@R6 MOV #20,-(R6)  ; PUSH BUF SIZE MOV R5,-(R6)  ; FAKE A JSR TO RBUF MOV @#S.RBUF,PC  ; AND RETURN TO S.EXIT ;ERROR H·,-(R6)  ; GET FILE BLOCK MOV @R1,R3   ; STORE ERROR CODE MOVB R4,-(R3) TSTB -(R3)   ; MOVE TO ERR RTN MOV #BADOPN,R5  ; BUT ALLOW FOR NONE CLRB 12(R0)   ; CLEAR OPEN SW. MOV @PC,-(R6)  ; RELEASE BUFFS FOR OPEN EMT .RLSFIB     ; IF NO BUFFER, THIS MAY     ; BE IN SWAP BUFFER, SO     ; CANNOT DO IT THIS WAY BR ERRGO NOBUF: MOV @R1,R3   ; SO IN THAT CASE .... MOV #NOBUFR,R5  ; USE LINK ERR RTN MOV @#S.RBUF,R4  ; FIRST RELEA¸ÿ; IF FOUND IT'S AN ERROR ÿBNE ÿGETMERR ÿ ÿ ÿ; (ALREADY OUT FILE OPEN) ÿMOV ÿR4,R3 ÿ ÿ ÿ; FOR DISK TRACE CHAIN ÿMOV ÿ@R4,R4 ÿBNE ÿ.-4 ÿMOV ÿR1,@R3 ÿ ÿ ÿ; INSERT THIS FIB AT END ÿMOV ÿ-(R3),-(R1) ÿ ÿ; STORE MAP ADDRESS ÿMOV ÿ-(R3),-(R1) ÿ ÿ; ... & INTERLEAVE ÿBR ÿGETM2 ÿ ÿ ÿ; THEN EXIT GETMERR: COM ÿ@FIB ÿ ÿ ÿ; FOR 2ND DT OUT OPEN ÿBR ÿGETM2 ÿ ÿ ÿ; SET SWITCH & EXIT GETM1: ÿMOV ÿ#4,-(R6) ÿ ÿ; IF NO MAP YET GET BUFF ÿMOV ¹E,ETC. ; ÿIT WILL BE NECESSARY TO ACTUALLY SET UP A FIB AND LINK IT ; ÿWHEN CALLED BY OPEN SETUPFIB: MOV ÿFIBLNK(R0),R5 ÿ ÿ; CK TO SEE IF ALREADY A FIB ÿBEQ ÿSETUP1 ÿ ÿ ÿ; NOPE ÿMOV ÿR5,-(R6) ÿ ÿ; YUP ÿBR ÿSETUP2 SETUP1: ÿ ÿ; ÿCODE TO GET A BUFFER,SET AND WC IN DDB AND SET FIB ÿMOV ÿ-2(R0),R2 ÿCLR ÿ-(R6) ÿBISB ÿSBS(R2),@R6 ÿMOV ÿ#20000,R5 ÿSUB ÿ@R6,R5 ÿASL ÿR5 ÿBCC ÿ.-2 ÿMOV ÿR5,WC(R0) ÿINC ÿ@R6 ÿMOV ÿ@#GETBUF,R5 ÿJSR ÿR5,@R5 ÿMOV ÿ(R6)+,R5 ÿBEQ ÿSETERR ÿMOV ÿºANDLING: R5 = 0 ON ENTRY, CONTAINS CODE TO BE RETURNED ; TO USER AFTER APPROPRIATE BUILD ERR11: TST (R6)+  ; TIDY STACK FOR OPENE ... INC R5  ; ... ON DT WITH FILE OPENO ALRDY ERR10: CMPB (R5)+,(R5)+ ; OPENC ON LINKED FILE ERR6: INC R5  ; IMPROPER ACCESS ERR5: INC R5  ; OPENE ON CONTIG FILE ERR4: INC R5  ; FILE LOCKED ERR3: INC R5  ; TOO MANY USERS ALREADY ERR2: CMPB (R5)+,(R5)+ ; FILE DOESN'T EXIST TST (R1)+  ; GET FILE BLOCK PTR MOV @R1,R2  ; ... & ST»SE OPN BUFFS MOV 26(R0),-(R6)  ; ... FIB FIRST CLR 26(R0)   ; ... & ITS DDB PTR MOV #1,-(R6) JSR R5,@R4 MOV 6(R0),-(R6)  ; ... THEN DATA BUFFER CLR 6(R0) MOV -2(R0),R2  ; REQS SBS FROM DVR CLR -(R6) MOVB 4(R2),@R6 JSR R5,@R4 CLRB 12(R0)   ; ALSO CLEAR OPEN SW. ERRGO: ADD #14,R6   ; CLEAR GARBAGE MOV -(R3),14(R6)  ; SET ERROR RTN BNE OPNOEXIT DEVERR: MOV @R0,-(R6)  ; IF NONE CALL EDP MOV R5,-(R6)  ; WITH CALL AS EVIDENCE ¼ÿ@#GETBUF,-(R6) ÿJSR ÿR5,@(R6)+ ÿMOV ÿ(R6)+,-(R1) ÿ ÿ; STORE ADR IN FIB ÿBEQ ÿGETMNOBUF ÿ ÿ; UNLESS NONE AVAILABLE ÿMOV ÿR0,R4 ÿ ÿ ÿ; SET VARIABLE DDB PTR ÿMOV ÿ-(R4),R5 ÿ ÿ; USE TO GET DVR ADDR ÿADD ÿ#6,R4 ÿ ÿ ÿ; THEN MOVE TO BLOCK ÿMOV ÿ@R4,-(R6) ÿ ÿ; SAVE CURRENT CONTENT ÿMOV ÿMFDPTR(R5),(R4)+ ÿ; REPLACE WITH MFD#1 ÿMOV ÿ@R4,-(R6) ÿ ÿ; SIMILARLY SET MAP BUFF ÿMOV ÿ@R1,(R4)+ ÿJSR ÿPC,GETMREAD1 ÿ ÿ; GET MFD#1 IN ÿMOV ÿ-(R4),R5 ÿ ÿ; FROM IT, EXTRACT .. ÿCMP ÿ(R5)+,-(R4) ÿMOV ÿ(½ÿR5,FIBLNK(R0) ÿ ÿ; LINK THE FIB ÿMOV ÿ#20,R4 ÿCLR ÿ(R5)+ ÿ ÿ ÿ; CLEAR THE FIB ÿDEC ÿR4 ÿBNE ÿ.-4 ÿ ÿ ÿ ÿ ÿ; R5 NOW EQUALS ADR OF BUFFER ÿMOV ÿR5,BUFADR(R0) ÿ ÿ; INSERT BUFFER ADR INTO DDB ÿBR ÿSETUPFIB SETUP2: ÿMOV ÿ(R6)+,ADR ÿMOV ÿ4(R6),R2 ÿMOV ÿR2,R5 ÿ ÿ;GET ADR FILE NAME IN DIR ÿMOV ÿ12(R5),(ADR)+ ÿ;NXT BLK IS THE FIRST ÿTST ÿ(ADR)+ ÿ ÿ;HOW OPEN INDICATOR ÿADD ÿ#6,R5 ÿCLR ÿ(ADR)+ ÿ ÿ;NEXT WD IS A SPARE ÿMOV ÿ(R5)+,(ADR)+ ÿ;TYPE ÿMOV ÿ(R5)+,(ADR)+ ÿ;SPARE/M/O ÿMOV ÿ(R5)¾ORE CODE MOVB R5,-(R2) TSTB -(R2)  ; MOVE TO ERR RTN MOV #BADOPN,R3 ; SET R3 IN CASE 0 RTN ADR CLRB 12(R0)  ; CLEAR OPEN SW. MOV @PC,-(R6) ; RETURN BUFFERS FOR OPEN EMT .RLSFIB BR ERRXT1 ;IF NO BUFFERS AVAILABLE, FCR MAY STILL BE IN SWAP BUFFER ; SO CANNOT CALL RLSFIB TO RETURN BUFFERS, SO .... NOBUF: MOV (R6)+,R0 ; GET DDB PTR MOV (R6)+,R1 ; ... & ONE TO ARGS NOBUF2: TST (R6)+  ; MAKE STACK SAME AS ABOVE MOV @R1,R2  ; GET NO BUFF ERR RTN MOV ¿IOT OP02: MOV R5,@R3   ; IF MT SLOT IN DIR ... MOV MINE2(R0),R3  ; SET POINTER TO IT JSR PC,OPNOREAD1  ; ... & GET BLOCK IN OP03: EMT .GETMAP   ; GET BIT MAP MOV @FIB,-(R6)  ; IF NOT IN ... BGT NOBUF   ; MAYBE NO BUFFER TST (R6)+   ; OR 2ND OUT OPEN ON DT BMI ERR11 EMT .BALLOC   ; OTHERWISE GET 1ST BLOCK MOV R3,R5   ; NOW SET UP DIRECTORY MOV (R6)+,(R5)+  ; FIRST FILE NAMÀR5)+,-(R1) ÿ ÿ; ... INTERLEAVE ÿMOV ÿ(R5)+,(R4)+ ÿ ÿ; ... & 1ST MAP BLOCK ÿJSR ÿPC,GETMREAD1 ÿ ÿ; GET MAP IN ÿCMP ÿ(R1)+,(R1)+ ÿ ÿ; LINK TO DVR PTR ÿMOV ÿR1,@R3 ÿ ÿ ÿ ÿ;RESTORE ORIGINAL DDB ÿMOV ÿ(R6)+,@R4 ÿMOV ÿ(R6)+,-(R4) ÿBR ÿGETM2 GETMNOBUF: INC ÿ@R2 ÿ ÿ ÿ; IF NO BUFFER ... ÿ ÿ ÿ ÿ ÿ; SET SWITCH TO SHOW GETM2: ÿMOV ÿ(R6)+,WC(R0) ÿ;RESTORE ORIGINAL WORD COUNT ÿMOV ÿ@#S.EXIT,R5 ÿ ÿ; GET ADR COMMON EXIT ÿTSTB ÿGETMAP ÿ ÿ ÿ; IN SWAP BUFFER? ÿBNE ÿ.+4 ÿ ÿ ÿ; YUP ÿCMP ÿ(R5)+,(R5)Á+,(ADR)+ ÿ;START ÿMOV ÿ(R5)+,(ADR)+ ÿ;LENGTH ÿMOV ÿ(R5)+,(ADR)+ ÿ;END ÿMOV ÿR2,@ADR ÿ ÿ;ITEM ADR ÿSUB ÿBUFADR(BIBREG),(ADR)+ ÿMOV ÿBLOCK(BIBREG),(ADR)+ ÿ;BLOCK ÿMOV ÿ@R5,@ADR ÿ; PROTECTION CODE SETEXIT: MOV ÿ@#S.RRES,R5 ÿ ÿ; RESTORE REGS ÿJSR ÿR5,@R5 ÿMOV ÿ2(R6),4(R6) ÿ ÿ; MOVE PC DOWN ÿMOV ÿ(R6)+,@R6 ÿ ÿ; MOVE STATUS DOWN ÿBR ÿCKEXIT SETERR: CLR ÿFIBLNK(R0) ÿBR ÿSETEXIT ; CODE TO RELEASE A FIB. ; ; TÂ#NOBUFR,R3 ; SET R3 IN CASE 0 ERR RTN ADR MOV @#S.RBUF,R5  ; RELEASE BUFFERS HERE MOV 26(R0),-(R6) ; FIRST FIB ... CLR 26(R0)  ; ... & CLEAR ITS DDB LINK MOV #1,-(R6) JSR R5,@R5 MOV 6(R0),-(R6) ; THEN DATA BUFFER CLR 6(R0)  ; LIKEWISE EXCEPT ... CLR -(R6) MOV -2(R0),R4 ; MUST GET SBS FROM DVR MOVB 4(R4),@R6 JSR R5,@R5 ERRXT1: CLRB 12(R0)  ; CLR FILE OPEN BIT MOV -(R2),26(R6) ; STORE ERROR RTN ADR BNE OPNEX5 ERRXT2: MOV @R0,-(R6)  ; ÃE MOV (R6)+,(R5)+ MOV (R6)+,(R5)+  ; ... & EXTENSION MOV #103,@R6  ; GET DATE .... EMT .DATE MOV (R6)+,@R5  ; & STORE WITH OK TYPE BIC #170000,(R5)+ MOV #77,(R5)+  ; SHOW OPEN FOR OUTPUT MOV @FIB,(R5)+  ; STORE START BLOCK CLR (R5)+   ; EMPTY LENGTH & END CLR (R5)+ MOV (R6)+,@R5  ; STORE PROTECTION BNE .+6 MOV #233,@R5  ; OR ITS DEFAULT MOV @FIB,R4   ; SAVE START BLOCK MOV R3,R2   ; FINALISE FIB MOV #1,-(R6) EMT .SEÄ+ ÿ ÿ; NOPE..DONT DECB MSB+2 ÿMOV ÿR5,PC ;FILE STRUCTURES READ/WRITE SUBROUTINE GETMWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 GETMREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12ÅO START...IN THE DRIVER IS A LIST OF POINTERS TO DDBS. THE LIST ; BEGINS AT DDB+20. THESE POINTERS POINT TO A CHAIN OF FIBS.SO ; -2(R0)=ADR DRIVER ; DRIVER+20+2TIMES THE UNIT IS THE ADR OF THE LIST ; THIS TELLS ALL THE FIBS HAVING A BIT MAP ON THIS DEVICE ; THE FORMAT OF THE FIB IS ; ; ÿFIB+0 ÿ NEXT BLOCK ; ÿFIB+2 ÿ HOWOPEN CODE ; ÿFIB+4 ÿSPARE THE FIRST BLK OF THE EXT ; ÿFIB+6 ÿTYPE ; ÿFIB+10 ; ÿFIB+12 ÿSTART BLK ; ÿFIB+14 ÿLENGTH ; ÿFIB+16 ÿLAST ; ÿFIB+20 ÿINDEX INTO THE DIRECTORY BLOÆNO ERR RTN SPECIFIED.CALL MOV R3,-(R6) ; PUSH ERR CODE & CALL DIAG PRNT IOT ERR7: MOV #1406,R3 ; IF NO BLOCK FOR OPENE BR ERRXT2  ; MAKE IT FATAL!! ;FILE STRUCTURES READ/WRITE SUBROUTINE OPNWRIT1: MOV #OUT,R5  ;SET FOR WRITE BR .+6 OPNREAD1: MOV #IN,R5  ;SET FOR READ MOV @#S.RSAV,-(R6) JSR R5,@(R6)+ ;SAVE REGISTERS MOV R0,-(R6) ;SAVE DDB ADDRESS MOV R6,R2  ;AND POINTER THERETO MOV ÇTUPFIB JSR PC,OPNOWRIT1  ; OUTPUT TO DEVICE MOV R4,BLOCK(R0)  ; SET START BLOCK IN DDB JSR PC,CLRBUF  ; REMOVE GARBAGE MOV R3,BUFPTR(R0)  ; SET BUFFER PTR BIS #200,STATUS(R0)  ; ... & OPEN SWITCH OPNOEXIT: MOV @#S.EXIT,R5  ; SET R5 TO THE ADR OF THE RRES CMP (R5)+,(R5)+ CLR @R0     ; CALL IN THE COMMON EXIT ROUTINE TSTB OPENO   ; CORE RESIDENT? BNE .+4   ; NOPE MOV R5,PC   È,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿGETMREAD1+2 ÿÉCK TO GET ; ÿ ÿTHIS ENTRY. ADD THIS NUMBER TO THE CORE ADR ; ÿ ÿOF THE BLOCK TO GET THE ENTRY ; ÿFIB+22 ÿDIRECTORY BLK NUM ; ÿFIB+24 ÿP CODE ; ÿFIB+26 ÿINTERLEAVE FACTOR ; ÿFIB+30 ÿPOINTER TO THE BIT MAP ; ÿFIB+32 ÿLINK TO NEXT FIB IN THE CHAIN ; ÿIT IS FIB+32 THAT IS POINTED TO BY THE DRIVER ; ; ÿTO RELEASE A FIB,YOU HAVE TO FIRST CHECK TO SEE IF IT ÿ ; ÿIS IN THE DRIVER CHAIN.IF IT IS, THEN YOU HAVE TO FIND ; ÿTHE FIB IN THE CHAIN THAT POINTS TO THIS FIB+32,AND ; ÿMAKE IT POINT TO THE Ê@R0,-(R6) ;SAVE DDB CONTENT MOV R2,-(R6) ;FOR WAIT BELOW MOV #10,R1  ;FOR DRIVER CALL MOV R0,R3 ADD #12,R3 BIC #6,@R3 BIS 20(R6),(R3)+ ;ENTER FUNCTION IN DDB MOV PC,@R3  ;SET UP COMPLETION RETURN ADD #RETN-.,@R3 MOV @#S.CDB,-(R6) ;CALL DRIVER JSR PC,@(R6)+ EMT 1  ;WAIT FOR COMPLETION MOV (R6)+,@(R6)+ ;RESTORE (DDB)-DESTROYED AT RETN MOV @#S.RRES,-(R6) JSR R5,@(R6)+ ;RESTORE REGISTERS RTS PC RETN: MOV @R0,-(R6) ;DRIVER COMPLETION CË; YUP...GO TO RRES MOV PC,-(R6)  ; PUSH ABS ADR OF THE BUFFER ADD #OPENO-.,@R6 MOV #20,-(R6)  ; PUSH BUF SIZE MOV R5,-(R6)  ; FAKE A JSR TO RBUF MOV @#S.RBUF,PC  ; TO RTN TO S.XIT CLRBUF: MOV BUFADR(R0),R5  ; GET BUFF START MOV R5,R3   ; ... & HOLD IT MOV WC(R0),-(R6)  ; GET SIZE CLR (R5)+   ; ... & CLEAR INC @R6 BNE .-4 CMP (R6)+,(R3)+  ; SKIP LINK IN BUFF RTS PC ;ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE CAT ÿ=.-GETMAP ÿ.END ÿ ÿ; END OF GMA  ÍNEXT FIB IN THE CHAIN RLSFIB: ÿTSTB ÿ12(R0) ÿ ÿ;CHECK TO SEE IF DATASET OPEN ÿBMI ÿSETEXIT ÿ ÿ; SHOULDN'T BE HERE MOV ÿ-2(R0),R3 ÿ ÿ; R3=ADR DRIVER ÿMOVB ÿUNIT(R0),R5 ÿ ÿ; R5=UNIT NUMBER TIMES TWO ÿBIC ÿ#177770,R5 ÿASL ÿR5 ÿADD ÿR5,R3 ÿ ÿ ÿ; SET R3=ADR PROPER POINTER ÿADD ÿ#BMPTR,R3 ÿMOV ÿ@R3,R4 ÿ ÿ ÿ; SET R4 =ADR FIRST FIB LINK ÿBEQ ÿRLSF4 ÿMOV ÿFIBLNK(R0),R5 ÿBEQ ÿRLSF4 ÿ ÿ; BR IF NO FIB ÿADD ÿ#FLINK-2,R5 ÿTST ÿ(R5)+ ÿ ÿ ÿ; CHECK TO MAKE SURE THAT ÿ ÿ ÿ ÿ ÿ; THE FIB HAS A OMES HERE MOV #PARERR,-(R6) ;SET UP FOR PARITY ERROR TST STATUS(R0) ;IF THERE IS ONE, GO TO BMI OPNREAD1+2  ;#IN=4=IOT TST (R6)+ MOV @#S.EXIT,R5 ;USE SAM RTN TO DEQUEUE DRVR JMP -12(R5)  ;CLEARS DDB, SO RESTORE ABOVE CAT =.-FSOPEN .END  ; END OF FOP _ ÏFILE STRUCTURES READ/WRITE SUBROUTINE OPNOWRIT1: MOV #OUT,R5  ;SET FOR WRITE BR .+6 OPNOREAD1: MOV #IN,R5  ;SET FOR READ MOV @#S.RSAV,-(R6) JSR R5,@(R6)+ ;SAVE REGISTERS MOV R0,-(R6) ;SAVE DDB ADDRESS MOV R6,R2  ;AND POINTER THERETO MOV @R0,-(R6) ;SAVE DDB CONTENT MOV R2,-(R6) ;FOR WAIT BELOW MOV #10,R1  ;FOR DRIVER CALL MOV R0,R3 ADD #12,R3 BIC #6,@R3 BIS 20(R6),(R3)+ ;ENTER FUNCTION IN DDB MOV PC,@R3  ;SET UP COMPLETION RETURN AÐ ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ÑMAP ÿBEQ ÿRLSF4 ÿ ÿ ÿ; SKIP IF IT DOESNT RLSF2: CMP ÿR5,R4 ÿBEQ ÿRLSF3 ÿMOV ÿR4,R3 ÿMOV ÿ@R4,R4 ÿBR ÿRLSF2 RLSF3: MOV @R5,@R3 ÿ ÿ ÿ; UNLINK THE FIB ÿ ÿ; IF THERE ARE NO FIBS LEFT IN THE CHAIN THEN RELEASE ÿ ÿ; THE ASSOCIATED MAP. NOTE THAT THE MAP WAS WRITTEN ÿ ÿ; EARLIER,SO NO NEED TO DO IT AGAIN ÿMOV ÿ-2(R0),-(R6) ÿMOVB ÿUNIT(R0),R4 ÿBIC ÿ#177770,R4 ÿASL ÿR4 ÿADD ÿR4,@R6 ÿADD ÿ#BMPTR,@R6 ÿTST ÿ@(R6)+ ÿBNE ÿRLSF4 ÿ ÿ; MORE FIBS ÿMOV ÿ-(R5),-(R6) ÿ; NO MORE FIBS.GET TÒ ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV000A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿRÓDD #RETN-.,@R3 MOV @#S.CDB,-(R6) ;CALL DRIVER JSR PC,@(R6)+ EMT 1  ;WAIT FOR COMPLETION MOV (R6)+,@(R6)+ ;RESTORE (DDB)-DESTROYED AT RETN MOV @#S.RRES,-(R6) JSR R5,@(R6)+ ;RESTORE REGISTERS RTS PC RETN: MOV @R0,-(R6) ;DRIVER COMPLETION COMES HERE MOV #PARERR,-(R6) ;SET UP FOR PARITY ERROR TST STATUS(R0) ;IF THERE IS ONE, GO TO BMI OPNOREAD1+2 ;#IN=4=IOT TST (R6)+ MOV @#S.EXIT,R5 ;USE SAM RTN TO DEQUEUE DRVR JMP -12(R5)  ;CLEARS DDB, SO REÔ ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 HE ADR OF THE MAP ÿMOV ÿ#4,-(R6) ÿ ÿ; RELEASE IT ÿMOV ÿ@#S.RBUF,R5 ÿJSR ÿR5,@R5 RLSF4: ÿMOV ÿBUFADR(R0),-(R6) ÿ; RELEASE THE BUFFER ÿCLR ÿBUFADR(R0) ÿMOV ÿ-2(R0),R5 ÿCLR ÿ-(R6) ÿBISB ÿSBS(R5),@R6 ÿMOV ÿ@#S.RBUF,R4 ÿJSR ÿR5,@R4 ÿ ÿ; RELEASE THE BUFFER ÿMOV ÿFIBLNK(R0),-(R6) ÿ; RELEASE THE FIB ÿCLR ÿFIBLNK(R0) ÿMOV ÿ#1,-(R6) ÿJSR ÿR5,@R4 ÿBR ÿSETEXIT ÿCAT ÿ=.-CKACSP ÿ.END ÿ ÿ; END OF CKX P Ö2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS STORE ABOVE CAT=.-OPENO .END Ø ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1423 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 Ù ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV000A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 Ú ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=14Û ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV000A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 Ü ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿFCL ÿ.GLOBL ÿFCL ÿ; INPUTS 2(R0)=NEGATIVE IF DECTAPE ÿ; ÿ ÿR0=ADR Ý ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBÞ07 ÿILFSOP ÿ=1423 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿAPP .GLOBL ÿAPP ;;ß ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 àDDB ÿ; ÿ ÿR2=ADR FIB ÿ; ÿ ÿR3=ADR ÿDRIVER ÿ; ÿ ÿR4=HOWOPEN CODE -2 ÿ; ÿ ÿCOMMON CLOSE ROUTINE WILL PUT THE ABOVE THINGS ÿ; ÿ ÿINTO THE REGS AND EMT TO FS CLOSE. NOTE THE ÿ; ÿ ÿCOOL WAY HE GETS HERE . I.E. BY EXECUTING ÿ; ÿ ÿCODE IN THE DDB ÿ; ÿ; ÿ ÿTHIS ROUTINE ASSUMES THAT THE FILE IS OPEN. ÿ; ÿ ÿSUGGEST YOU SAY THREE HAIL MARYS IF IT ISN'T. CLOSE: ÿ177400 ÿ ÿ ÿ; FLAG FOR SAM...NON REENTRANT,0 FCL: ÿMOV ÿ@#S.RRES,R5 ÿ ÿ; RESTORE REGS ÿJSR ÿR5,@R5 ÿCMP ÿ(R6)+,(R6)+ ÿ ÿ; REMOVáLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1423 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.Dâ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; APPEND ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ÿ ÿ; CALLING SEQUENCE: ÿ ÿ; ÿMOV ÿ#LB,-(R6) ÿ ÿ; ÿEMT ÿ.INIT ÿ ÿ ÿ; ÿMOV ÿ#FILEA,-(R6) ÿ ÿ; ÿMOV ÿ#FILEB,-(R6) ÿ ÿ; ÿMOV ÿ#LB,-(R6) ÿ ÿ; ÿEMT ÿ.APPEND ÿ ÿ; THE ROUT ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1423 ÿDFMFD=1 ÿDTMFD=100 äE ROGERS PC&STATUS ÿ ÿ ÿ ÿ ÿ; ONLY THIN ON STACK NOW IS ÿ ÿ ÿ ÿ ÿ; USER REGS,PC,&STATUS ÿTST ÿR4 ÿ ÿ; LOOK AT HOWOPEN CODE-2 ÿBEQ ÿCLDK0 ÿ ÿ ÿ; OPNEO? ÿDEC ÿR4 ÿBMI ÿCLOSE5 ÿ ÿ ÿ; BR IF OPENU ÿBNE ÿCLOSE7 ÿ ÿ ÿ; BR IF OPENI CLOSDK: ÿMOV ÿLAST(FIB),BLOCK(R0) ÿ; DIDDLE FOR LAST BLOCK BCKWRD ÿBPL ÿCL111D ÿBIS ÿ#4000,STATUS(R0) ÿNEG ÿBLOCK(R0) CL111D: JSR ÿPC,CLREAD1 ÿMOV ÿBEGEXT(FIB),@BUFADR(BIBREG) ÿJSR ÿPC,CLWRIT1 ÿBIC ÿ#4000,STATUS(R0) ÿ ÿ; CLR BCKWRD BIT CLDK0: ÿMOV ÿ@FIB,LAåELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 ÿ.TITLE ÿAP2 ÿ.GLOBL ÿAP2 ÿ ÿ ÿ ÿ;APPEND, PART2 APNDP2: ÿ177400 ÿ ÿ ÿ; FLAG FOR SAM,...NON REENTRANT AP2: ÿMOV ÿ@#S.RRES,R5 ÿ;RESTORE REGS ÿJSR ÿR5,@R5 ÿ ÿ ÿ ÿ;R0=ADR DDB ÿ ÿ ÿ ÿ; FIB+0=FILEA BLOCK NUM ÿ ÿ ÿ ÿ; FæINE WILL THEN APPEND LINKED FILE A T0 ÿ ÿ; LINKED FILE B. IF THIS ALSO HAPPENS TO ÿ ÿ; TO BE A DT FILE, THEN ROUTINE AP2 WILL BE ÿ ÿ; CALLED INTO THE SWAP BUFFER TO DIDDLE THE ÿ ÿ; DT BIT MAPS. NOTE THAT IN THE PROCESS OF ÿ ÿ; APPENDING , FILEA CEASES TO EXIST AS A SEPARATE ÿ ÿ; ENTITY...ITS BLOCKS ARE NOW PART OF B. APPEND: ÿ177400 ÿ ÿ ÿ;COMMON CODE TO MOVE CODE ÿ ÿ ÿ ÿ; FLAG FOR SAM.....NON REENTRANT,0 APP: ÿADD ÿPC,R5 ÿ ÿ; R5=177776 VIA SAM ÿTST ÿ-(R5) ÿ ÿ; LOOK AT FIRST WRD OF CODE ç ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV003A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 èST(FIB) ÿ; SET END=LAST BLK WRITTEN ÿMOVB ÿUNIT(R0),R5 ÿ ÿ; CALC BM ADR ÿBIC ÿ#177760,R5 ÿASL ÿR5 ÿADD ÿR5,R3 ÿADD ÿ#BMPTR,R3 ÿMOV ÿFIB,R5 ÿADD ÿ#FLINK,R5 ÿTST ÿ2(R0) ÿ ÿ; ÿ; IS THIS DT? ÿBMI ÿCLOSDT CLDK1: ÿMOV ÿCBMPTR(FIB),MAPREG ÿ;GET SET TO WRITE CBM ÿMOV ÿ6(MAPREG),BLOCK(BIBREG) ÿADD ÿ2(MAPREG),BLOCK(BIBREG) ÿDEC ÿBLOCK(BIBREG) ÿMOV ÿBUFADR(BIBREG),-(R6) ÿMOV ÿMAPREG,BUFADR(BIBREG) CLDK2: ÿCMP ÿR5,@R3 ÿ ÿ;SEARCH BIT MAP CHAIN ÿBEQ ÿCLDK3 ÿMOV ÿ@R3,R3 ÿBR ÿCLDéIB +2=FILEA ADR ÿ ÿ ÿ ÿ;R2=FILEB BLOCK NUMBER ÿSUB ÿ#14,R3 ÿ ÿ;NOW R3=FILB ADR ÿMOV ÿFIBLNK(R0),R4 ÿ;R4=ADR FIB ÿ ÿ ÿ ÿ;CALCULATE BLOCK & ENTRY OF FBM A ÿMOV ÿ2(R4),-(R6) ÿ; PUSH DIR ADR ÿSUB ÿ6(R0),@R6 ÿ; SUB BUF ADR FROM IT ÿMOV ÿ@R4,-(R6) ÿ; PUSH BLOCK NUM FILA ÿJSR ÿPC,CALCFBM ÿ ÿMOV ÿ@R6,BLOCK(R0) ÿ; ÿ ÿ ÿ ÿ; ÿJSR ÿPC,APREAD1 ÿ;READ FBM A ÿMOV ÿBUFADR(R0),-(R6) ;SAVE FILA BUFADR ÿMOV ÿ26(R6),BUFADR(R0) ;GET BUFADR FILB ÿ ÿ ÿ ÿ; CALC FBM ADR OF FILB ÿMOV ÿR3,-(R6) ÿ; PUSHê ÿTSTB ÿ@R5 ÿ ÿ; IN SWAP BUFFER? ÿBEQ ÿAPPBEG ÿ ÿ; SKIP OVER IF RESIDENT. ÿMOV ÿ#20,-(R6) ÿ; DISK RESIDENT. GET A BUFFER ÿMOV ÿ@#GETBUF,R4 ÿJSR ÿR5,@R4 ÿMOV ÿ(R6)+,R3 ÿ; PUT ADR INTO R3 ÿBNE ÿ.+6 ÿJMP ÿAPRATS ÿ ÿ; TOO BAD ÿMOV ÿR3,R4 ÿ ÿ; LOOP TO DO THE MOVE ÿMOV ÿR5,R2 ÿMOV ÿ(R2)+,(R3)+ ÿINC ÿ@R4 ÿBLE ÿ.-4 ÿSUB ÿR2,R3 ÿ ÿ; FIRST WORD NOW EQ 1 ÿADD ÿR3,PC ÿ ÿ; GO BABY ÿCLR ÿ@R5 ÿCLR ÿ-2(R5) APPBEG: ÿTSTë ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 ìK2 CLDK3: ÿMOV ÿ@R5,@R3 ÿ ÿ;REMOVE CHAIN LINK CLDK3A: ÿJSR ÿPC,CLWRIT1 ÿ ÿ; WRITE CBM NOW ÿMOV ÿ(R6)+,BUFADR(BIBREG) ÿMOV ÿ-2(BIBREG),R3 ÿTST ÿBMPTR(R3) ÿ;ARE THERE NO FIBS NOW? ÿBNE ÿCLDK4 ÿ ÿ;NO CLDK4A: ÿMOV ÿCBMPTR(FIB),-(R6) ÿ;YES...RELEASE BIT MAP BUF ÿMOV ÿ#4,-(R6) ÿMOV ÿ@#S.RBUF,R5 ÿJSR ÿR5,@R5 CLDK4: CLOSE5: ÿMOV ÿDIRBLK(FIB),BLOCK(BIBREG) ÿ;UPDATE DIR ÿJSR ÿPC,CLREAD1 ÿMOV ÿBUFADR(BIBREG),R5 ÿADD ÿDIRITM(FIB),R5 ÿADD ÿ#10,R5 ÿMOV ÿ@R5,R4 ÿBIT ÿHOWOPEN(FIB),#1 ÿ í ADR FILB ENTRY ÿSUB ÿBUFADR(R0),@R6 ÿ; SUB BUF ADR FILB FROM IT ÿMOV ÿR2,-(R6) ÿ; PUSH ÿBLK NUM FILB ÿJSR ÿPC,CALCFBM ÿMOV ÿ@R6,BLOCK(R0) ÿJSR ÿPC,APREAD1 ÿ;READ FBM B ÿ ÿ ÿ ÿ;BIS FBMA, FBMB ÿ ÿ ÿ ÿ;CLR FBMA ÿ ÿ ÿ ÿ;WRITE FBMB ÿMOV ÿ10(R6),R4 ÿ; GET ADR FILEA BUFFER ÿADD ÿ4(R6),R4 ÿ; ADD FILEA FBM IDX ÿ ÿ ÿ ÿ; R4 EQ ADR FILEA FBM ÿMOV ÿBUFADR(R0),R3 ÿ; GET ADR FILEB BUFFER ÿADD ÿ2(R6),R3 ÿ; ADD FILEB FBM IDX ÿ ÿ ÿ ÿ; R3 EQ ADR FILEB FBM ÿMOV ÿ#36.,R5 ÿ ÿ;MAP = 36 WORDS ÿBî ÿDATPTR(R0) ÿ ÿ; ERR IF ASSIGNMENT MADE ÿBNE ÿAPPERJ ÿ ÿ ÿ; ON THIS LINK BLK ÿBIT ÿ#200,12(R0) ÿ ÿ; SEE IF DATASET BSY ÿBEQ ÿ.+6 APPERJ: ÿJMP ÿAP14ER ÿ ÿ ÿ; YUP...ERR # 14 ÿMOV ÿ#1,-(R6) ÿ ÿ; GET A BUFFER AND A FIB ÿEMT ÿ.SETUPFIB ÿTST ÿFIBLNK(R0) ÿ ÿ; GET ONE? ÿBEQ ÿAPNOBUF ÿ ÿ ÿ; NOPE ÿMOV ÿ#20,-(R6) ÿ ÿ; GET A 256 WD BUFFER FOR LATER ÿMOV ÿ@#GETBUF,R5 ÿJSR ÿR5,@R5 ÿMOV ÿ@R6,R5 ÿ ÿ; SUCCESSFUL? ÿ ÿ ÿ ÿ;KEEP BUFADR ON STACK ÿBEQ ÿAPNOBUF ÿ ÿ ÿ; NO ÿMOV ÿ-(R0),R5 ÿ ÿ; LOOï ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1424 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ðÿ; CLR LOCK BIT IF THIS ÿBEQ ÿ.+6 ÿ ÿ ÿ; IS OPENE OR OPENU ÿBIC ÿ#300,@R5 ÿBIC ÿ#77,@R5 ÿ ÿ ÿ; DEC USAGE COUNT ÿBIC ÿ#177700,R4 ÿDEC ÿR4 ÿCMP ÿR4,#76 ÿBNE ÿCLOSE6 ÿCLR ÿR4 CLOSE6: ÿBIS ÿR4,(R5)+ ÿTST ÿ(R5)+ ÿMOV ÿLENGTH(FIB),(R5)+ ÿMOV ÿLAST(FIB),(R5)+ ÿJSR ÿPC,CLWRIT1 CLOSE7: ÿMOV ÿFIB,-(R6) ÿ ÿ; RELEASE FIB ÿCLR ÿFIBLNK(R0) ÿMOV ÿ#1,-(R6) ÿMOV ÿ@#S.RBUF,R5 ÿJSR ÿR5,@R5 ÿMOV ÿBUFADR(R0),-(R6) ÿ ÿ; RELñIS ÿ@R4,(R3)+ ÿCLR ÿ(R4)+ ÿDEC ÿR5 ÿBNE ÿ.-6 ÿCMP ÿ@R6,6(R6) ÿ;FBMA BLK # SAME AS FBMA? ÿBNE ÿAPX1 ÿ ÿ;NO ÿ ÿ ÿ ÿ;YES...CLR ENTRY IN FBMB ÿMOV ÿ#36.,R5 ÿMOV ÿBUFADR(R0),R4 ÿ;CALC NEW ADR FBMA ÿADD ÿ10(R6),R4 ÿCLR ÿ(R4)+ ÿDEC ÿR5 ÿBNE ÿ.-4 APX1: ÿMOV ÿBUFADR(R0),R4 ÿ;SAVE BUFADR ÿMOV ÿ4(R6),BUFADR(R0) ÿ; WRITE BLOCK FBM A ÿMOV ÿ6(R6),BLOCK(R0) ÿCMP ÿ@R6,6(R6) ÿ;DON'T WRITE IF BOTH SAME BLOCKS ÿBEQ ÿ.+6 ÿJSR ÿPC,APWRIT1 ÿMOV ÿR4,BUFADR(R0) òK IN DRVR TO SEE IF ÿCMP ÿ(R0)+,(R5)+ ÿ ÿ; THIS IS A FS DEV ÿTST ÿ@R5 ÿ ÿBPL ÿAPEX2 ÿ ÿ ÿ; IMMED EXIT IF NOT ÿCLR ÿR4 ÿ ÿ ÿ; R4 = FIRST TIME FLG ÿSUB ÿ#14,R6 ÿ ÿ ÿ; MAKE ROOM FOR ARGS APLUP: ÿEMT ÿ.LOOKUP ÿ ÿ ÿ; SEE IF FILB EXISTS ÿCMP ÿ@R6,#-3 ÿ ÿBHIS ÿAPER2 ÿ ÿ ÿ; IT DOESN'T ÿMOV ÿ@R6,R5 ÿ ÿ ÿ; CK TO SEE IF CONTIG ÿTST ÿ6(R5) ÿ ÿ ÿBMI ÿAPER5 ÿ ÿ ÿ; ERROR ÿTSTB ÿ10(R5) ÿ ÿ ÿ; IS FILE OPEN? ÿBNE ÿAPER14 ÿ ÿ ÿ; ERROR ÿMOV ÿ10(R6),-(R6) ÿ ÿ; CHECK ACCES PRIV...PUSH UIC ÿó ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿPRO .GLOBL ÿPRO ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;ôEASE BUFFER ÿCLR ÿ@R0 ÿMOV ÿ-(R0),R1 ÿCLR ÿ-(R6) ÿ ÿ; DUMB MACHINE ÿBISB ÿSBS(R1),@R6 ÿJSR ÿR5,@R5 ÿ ÿ ÿCLR ÿBUFADR+2(R0) CLOSRTN: MOV ÿ@#S.EXIT,R5 ÿ ÿ; GET ADR COMMON EXIT ÿTSTB ÿCLOSE ÿ ÿ ÿ; SEE IF IN SWAP BUFFER ÿBNE ÿ.+4 ÿ ÿ ÿ; YUP ÿCMP ÿ(R5)+,(R5)+ ÿ ÿ; NOPE..DONT DECB MSB+2 ÿMOV ÿR5,PC ÿ; ÿDECTAPE CLOSE ÿ; ÿ; ÿ ÿ ÿ;DEPENDENT CODE TO UPDATE ÿ ÿ ÿ ÿ;THE FILE BIT MAP ÿ ÿFIB=R2 ÿ ÿFBMWRD=R3 ÿ ÿUFDWRõ ÿMOV ÿ@R6,BLOCK(R0) ÿJSR ÿPC,APWRIT1 ÿMOV ÿ4(R6),BUFADR(R0) ;GET ORIG BUFADR APNDEXIT: ÿADD ÿ#12,R6 ÿ; CLEAN UP STACK ÿMOV ÿ@#S.RSAV,R5 ÿJSR ÿR5,@R5 ÿMOV ÿ@#S.EXIT,R5 ÿ;GET ADR COMMON EXIT ÿTSTB ÿAPNDP2 ÿ ÿ;SEE IF IN SWAP BUFFER ÿBNE ÿ.+4 ÿ ÿ;YUP ÿCMP ÿ(R5)+,(R5)+ ÿ;NOPE..DON'T DECB MSB+2 ÿMOV ÿR5,PC ;ROUTINE TO CALCULATE BLOCK & ADR OF FILE BIT MAP ;INPUTS ÿ ÿ ÿ2(R6)=DIR BLOCK ; ÿ ÿ ÿ4(R6)=IDX INTO DIR ;OUTPUTS ÿ ÿ2(R6)=RBM BLOCK ; ÿ ÿ ÿ4(RöÿMOV ÿ14(R6),-(R6) ÿ ÿ; PUSH PCODE ÿMOV ÿ#1,-(R6) ÿ ÿ; PUSH WRITE ACCESS CODE ÿCLR ÿ-(R6) ÿ ÿ ÿ; SET FLAG ÿEMT ÿ.CKACSP ÿ ÿ ÿ; CHECK ÿTST ÿ(R6)+ ÿ ÿ ÿ; OK? ÿBNE ÿAPER6 ÿ ÿ ÿ; PROTECTION VIOLATION ÿTST ÿR4 ÿ ÿ ÿ; FIRST TIME THRU? ÿBNE ÿAPCK2 ÿ ÿ ÿ; NO ÿINC ÿR4 ÿMOV ÿ@R6,R3 ÿ ÿ ÿ; YES... R3=FILB DIR ADR ÿMOV ÿBLOCK(R0),R2 ÿ ÿ; SAVE R2= FILB BLK NUM ÿTST ÿ(R1)+ ÿ ÿ ÿ; POP R1 TO NEXT ARG ÿBR ÿAPLUP APCK2: CMP ÿ@R6,R3 ÿ ÿ ÿ; CHECK TO SEE IF BOTH FILES ÿBNE ÿAPCK3 ÿ ÿ ÿ; ARE T÷;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;; PROTECT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ÿROUTINE TO SET PROTECT BIT ; ÿIN USER'S FILES ; ; ÿCALLING SEQUENCE ; ÿMOV ÿ#FILE,-(R6) ; ÿMOV ÿ#DATASET,-(R6) ; ÿEMT ÿøD=R4 ÿ ÿMAPBLK=R5 ÿ; ÿ ÿ ÿ;THE METHOD IS: ÿ; ÿ ÿ ÿ READ PBM ÿ; ÿ ÿ ÿ WRITE CBM AS NEW PBM ÿ; ÿ ÿ ÿ BIC PBM,CBM ÿ; ÿ ÿ ÿ READ FBM ÿ; ÿ ÿ ÿ BIS CBM,FBM ÿ; ÿ ÿ ÿ WRITE FBM CLOSDT: ÿMOV ÿR3,-(R6) ÿ ÿ; PUSH POINTER. USE IT AT CLDT3 ÿMOV ÿ#104,BLOCK(BIBREG) ÿMOV ÿBUFADR(BIBREG),-(R6) ;SAVE BUF ADR ÿJSR ÿPC,CLREAD1 ÿMOV ÿ@R3,R1 ÿ ÿ ÿ; WRITE CBM INTO PBM ÿMOV ÿ-(R1),BUFADR(BIBREG) ÿJSR ÿPC, CLWRIT1 ÿMOV ÿ#110,R5 ÿ ÿ;BIC PBM,CBM ÿMOV ÿ@R6,R4 ÿADD ÿ#10,R4ù6)=FDX INTO FBM ;DESTROYS R4,R5 CALCFBM: CMP ÿ2(R6),#102 ÿBNE ÿ.+12 ÿMOV ÿ#70,2(R6) ÿBR ÿ.+10 ÿMOV ÿ#74,2(R6) ÿMOV ÿ#2,R5 CALCF1: ÿCLR ÿR4 CALCF2: ÿCMP ÿR5,4(R6) ÿBEQ ÿCALCF3 ÿADD ÿ#22,R5 ÿADD ÿ#110,R4 ÿCMP ÿR4,#662 ÿBLO ÿCALCF2 ÿINC ÿ2(R6) ÿBR ÿCALCF1 CALCF3: ÿMOV ÿR4,4(R6) ÿRTS ÿPC ;FILE STRUCTURES READ/WRITE SUBROUTINE APWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 APREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGúHE SAME ÿCMP ÿBLOCK(R0),R2 ÿ ÿ ÿBEQ ÿAPEX1 ÿ ÿ ÿ; THEY ARE APCK3: ÿMOV ÿ@R6,R1 ÿCLR ÿ(R1)+ ÿ ÿ ÿ; CLR FIL ÿCLR ÿ(R1)+ ÿ ÿ ÿ; CLR NAM ÿCLR ÿ(R1)+ ÿ ÿ ÿ; CLR EXT APWA: ÿJSR ÿPC,APWRIT1 ÿ ÿ; WRITE FILA BLK ÿMOV ÿFIBLNK(R0),R4 ÿCMP ÿ(R1)+,(R1)+ ÿMOV ÿBLOCK(R0),(R4)+ ÿ ÿ; SAVE BLK FILA ÿMOV ÿ@R6,(R4)+ ÿ ÿ; SAVE DIR ADR FILA ÿMOV ÿ(R1)+,(R4)+ ÿ ÿ; SAVE START FILA ÿMOV ÿ(R1)+,(R4)+ ÿ ÿ; SAVE LENGTH FILA ÿMOV ÿ(R1)+,(R4)+ ÿ ÿ; SAVE END FILA ÿMOV ÿR2,BLOCK(R0) APRDB: ÿJSR ÿPC,APREAûÿ+PROTECT ; ;FILE: ÿFIL ; ÿNAM ; ÿEXT ; ÿUIC ; ;ERROR RETURN: ; ÿ FILE DOESN'T EXIST ; ÿ CALLER IS NOT OWNER ; ÿ FILE IS OPEN PROTECT: ÿ177400 ÿ ÿ ÿ;COMMON CODE TO MOVE CODE ÿ ÿ ÿ ÿ; FLAG FOR SAM.....NON REENTRANT,0 PRO: ÿADD ÿPC,R5 ÿ ÿ; R5=177776 VIA SAM ÿTST ÿ-(R5) ÿ ÿ; LOOK AT FIRST WRD OF CODE ÿTSTB ÿ@R5 ÿ ÿ; IN SWAP BUFFER? ÿBEQ ÿPROT1 ÿ ÿ; IF RESIDENT THEN SKIP ÿMOV ÿ#20,-(R6) ÿ; DISK RESIDENT. GET A BUFFER ÿMOV ÿ@#GETBUF,R4 ÿJSR ÿR5,@R4 ÿMOV ÿ(R6)+,ü ÿMOV ÿ@R1,R1 ÿADD ÿ#10,R1 ÿBICB ÿ(R4)+,(R1)+ ÿDEC ÿR5 ÿBNE ÿ.-4 ÿMOV ÿ(R6)+,BUFADR(BIBREG) ;RESTORE ORIG BUFADR ÿMOV ÿ#70,MAPBLK ÿ;CALCULATE BLOCK + ITEM ÿCMP ÿDIRBLK(FIB),#102 ;OF FBM ÿBEQ ÿ.+4 ÿCMP ÿ(MAPBLK)+, (MAPBLK)+ ÿMOV ÿ#2,UFDWRD CLDT1: ÿCLR ÿFBMWRD CLDT2: ÿCMP ÿUFDWRD,DIRITM(FIB) ÿBEQ ÿCLDT3 ÿADD ÿ#22,UFDWRD ÿ ÿ; BUMP POINTER TO NXT ENTRY ÿADD ÿ#110,FBMWRD ÿCMP ÿFBMWRD,#770 ÿBNE ÿCLDT2 ÿINC ÿMAýISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJþD1 ÿ ÿ; READ FILB BLK ÿADD ÿ#16,R3 ÿ ÿMOV ÿ@R3,R1 ÿMOV ÿ-(R4),@R3 ÿ ÿ; SET NEW END. R1 =OLD END ÿADD ÿ-(R4),-(R3) ÿ ÿ; SET NEW LENGTH ÿJSR ÿPC,APWRIT1 APLNK: ÿMOV ÿ-2(R0),R5 ÿ ÿ; IS THIS A DT? ÿMOV ÿ2(R5),-(R6) ÿASL ÿ@R6 ÿBPL ÿAPLNK2 ÿ ÿ ÿ; NO ÿTST ÿR1 ÿ ÿ ÿ; IS BLK NUM NEG? ÿBPL ÿAPLNK2 ÿNEG ÿR1 ÿ ÿ ÿ; YES...MAKE IT POS ÿBIS ÿ#4000,STATUS(R0) ÿ; SET DT REVERSE BIT APLNK2: ÿMOV ÿR1,BLOCK(R0) ÿ ÿ; SET BLK NUM ÿJSR ÿPC,APREAD1 ÿ ÿ; READ FILB END ÿMOV ÿ-(R4),@BUFADR(R0) ÿ;ÿR3 ÿ; PUT ADR INTO R3 ÿBNE ÿ.+6 ÿJMP ÿPNOBUF ÿ ÿ; TOO BAD ÿMOV ÿR3,R4 ÿ ÿ; LOOP TO DO THE MOVE ÿMOV ÿR5,R2 ÿMOV ÿ(R2)+,(R3)+ ÿINC ÿ@R4 ÿBLE ÿ.-4 ÿSUB ÿR2,R3 ÿ ÿ; FIRST WORD NOW EQ 1 ÿADD ÿR3,PC ÿ ÿ; GO BABY ÿCLR ÿ@R5 ÿCLR ÿ-2(R5) PROT1: ÿBIT ÿ#200,12(R0) ÿ; CK DATASET BUSY ÿBNE ÿPRER14 ÿ ÿ;TOO BAD ÿ ÿ ÿ ÿ; GET A FIB AND A BUFFER ÿMOV ÿ#1,-(R6) ÿEMT ÿ.SETUPFIB ÿTST ÿFIBLNK(R0) ÿ ÿ; GET ONE? ÿBEQ ÿPNOBUF ÿMOV ÿ-2(R0),R5 ÿ ÿ; IMMED EXIT IF NOT FS DEVICE ÿTST ÿ2(R5) PBLK ÿBR ÿCLDT1 CLDT3: ÿMOV ÿMAPBLK,BLOCK(BIBREG) ;READ FBM ÿJSR ÿPC,CLREAD1 ÿMOV ÿ@R6,R4 ÿ ÿ;BIS CBM, FBM ÿMOV ÿ@R4,R4 ÿMOV ÿ-(R4),R4 ÿ;SET R4 TO ADR MAP ÿMOV ÿ#36.,R5 ÿ ÿ;R5=MAP SIZE ÿADD ÿBUFADR(BIBREG),FBMWRD ÿADD ÿ#10,R4 ÿBIS ÿ(R4)+,(FBMWRD)+ ÿ;DO IT ÿDEC ÿR5 ÿBNE ÿ.-4 ÿJSR ÿPC,CLWRIT1 ÿ;WRITE THE NEW FBM CLDT4: ÿMOV ÿ(R6)+,R3 ÿ;UNLINK THE FIB ÿCLR ÿ@R3 ÿ ÿ ÿ; CLR POINTER TO MAP IN THE DRVR ÿ ÿJMP ÿCLDK4A ÿ ÿ ÿ; REJOIN DK CLOSE ;FILE STRUCTURES READ/WRITE SUBROUSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿAPREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE ÿ.END ÿBPL ÿ.+12 ÿMOV ÿ@R0,-(R6) ÿMOV ÿ#PARERR,-(R6) ÿIOT ÿTST ÿ-(R6) ÿMOV ÿ@#S.CDQ,R5 ÿJSR ÿPC,@R5 ÿADD ÿ#22,R6 ÿMOV ÿ@#S.RRES,R5 ÿJSR ÿR5,@R5  LINK IT ÿJSR ÿPC,APWRIT1 ÿBIC ÿ#4000,STATUS(R0) ÿ; CLR DT REVERSE BIT ÿTST ÿ(R6)+ ÿ ÿ ÿ; IS THIS A DT? ÿBPL ÿAPEX1 ÿ ÿ;NO ÿEMT ÿ.APNDP2 ÿ ÿ; DIDDLE DT BIT MAPS APEX1: ÿADD ÿ#14,R6 ÿ ÿ ÿ; RESTORE STACK APEX2: ÿBR ÿAPEXIT ÿ ÿ ÿ; GO TO EXIT HANDLER APRATS: ÿ APNOBUF: MOV ÿ@R1,R5 ÿ ÿ ÿ; SET R5 EQ ERR ADR ÿMOV ÿ#NOBUFR,R3 ÿ ÿ; SET R3 EQ CODE ÿBR ÿAPERX1 APERXIT: MOV ÿ#ILFSOP,R3 ÿ ÿ; SET R3 EQ CODE ÿADD ÿ#14,R6 ÿ ÿ ÿ; RESTORE STACK APERX1: ÿMOV ÿ-(R5),16(R6) ÿ ÿ; SET ERR AÿBPL ÿPEXIT ÿSUB ÿ#14,R6 ÿ ÿ; MAKE ROOM FOR ARGS ÿEMT ÿ.LOOKUP ÿ ÿ; FILE EXIST? ÿCMP ÿ@R6,#-3 ÿBHIS ÿPROER2 ÿ ÿ;NO - ERROR ÿMOV ÿ@R6,R5 ÿ ÿ;FILE OPEN ÿMOV ÿ10(R5),-(R6) ÿBIC ÿ#177700,(R6)+ ÿBNE ÿPROER14 ÿ ÿ;YUP ÿBIS ÿ#200,20(R5) ÿ;SET PROTECT BIT ÿADD ÿ#14,R6 ÿJSR ÿPC,PROWRIT1 PEXIT: ÿTST ÿFIBLNK(R0) ÿ ÿ ÿ; IS THERE A FIB? ÿBEQ ÿ.+6 ÿ ÿ ÿ ÿ; NO ÿMOV ÿ@PC,-(R6) ÿ ÿ ÿ; RLS FIB ÿEMT ÿ.RLSFIB PEX05: ÿCLR ÿ@R0 ÿ ÿ ÿ ÿ; RLS DDB ÿMOV ÿ@#S.RRES,R5 ÿJSR ÿR5,@R5 ÿMOV ÿ(R6TINE CLWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 CLREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿRTS ÿPC ÿ.END ÿ ÿ ÿ;END OF AP2 DR ONTO SP ÿBNE ÿAPEXIT ÿ ÿ ÿ; BR IF NE APDIAG: ÿMOV ÿ@R0,-(R6) ÿ ÿ; TOO BAD...CALL ÿMOV ÿR3,-(R6) ÿ ÿ; DIAG PRNT ÿIOT APER2: ÿMOV ÿ#2,R2 ÿ ÿ ÿ; FILE DOESN'T EXIST ÿBR ÿAPERZ APER5: ÿMOV ÿ#5,R2 ÿBR ÿAPERZ ÿ ÿ ÿ; ILLEGAL ACTION TO CONTIG FILE APER6: ÿMOV ÿ#6,R2 ÿBR ÿAPERZ ÿ ÿ ÿ; PROTECTION VIOLATION AP14ER: ÿSUB ÿ#14,R6 ÿ ÿ;FIX UP THE STACK FOR EXIT ÿ ÿ ÿ ÿ ÿ; ILLEGAL ACTION TO AN OPEN FILE APER14: ÿMOV ÿ#14,R2 ÿ ÿ ÿ; FILE OPEN APERZ: ÿTST ÿ(R1)+ ÿ ÿ; BUMP R1 TO ADR FNB ÿM)+,2(R6) ÿMOV ÿ(R6)+,2(R6) ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ ÿ; SET R5 TO THE ADR OF THE RRES ÿ ÿ ÿ ÿ ÿ; CALL IN THE COMMON EXIT ROUTINE ÿCMP ÿ(R5)+,(R5)+ ÿTSTB ÿPROTECT ÿ ÿ ÿ; CORE RESIDENT? ÿBNE ÿ.+4 ÿ ÿ ÿ; NOPE ÿMOV ÿR5,PC ÿ ÿ ÿ; YUP...GO TO RRES ÿMOV ÿPC,-(R6) ÿ ÿ; PUSH ABS ADR OF THE BUFFER ÿADD ÿ#PROTECT-.,@R6 ÿMOV ÿ#20,-(R6) ÿ ÿ; PUSH BUF SIZE ÿMOV ÿR5,-(R6) ÿ ÿ; FAKE A JSR TO RBUF ÿMOV ÿ@#S.RBUF,PC ÿ ÿ; AND RETURN TO S.EXIT PROER2: ÿMOV ÿ ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿCLREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE CAT ÿ=.-CLOSE OV ÿ@R1,R5 ÿMOVB ÿR2,-(R5) ÿTSTB ÿ-(R5) ÿBR ÿAPERXIT APEXIT: ÿCLR ÿ@R0 ÿ ÿ ÿ; RELEASE DDB ÿTST ÿFIBLNK(R0) ÿ ÿ; IS THERE A FIB? ÿBEQ ÿ.+6 ÿ ÿ ÿ; NO ÿMOV ÿ@PC,-(R6) ÿ ÿ; RELEASE FIB AND BUFFER ÿEMT ÿ.RLSFIB ÿMOV ÿ#20,-(R6) ÿ ÿ; RELEASE THE OTHER BUFFER ÿMOV ÿ@#S.RBUF,R5 ÿJSR ÿR5,@R5 ÿMOV ÿ@#S.RRES,-(R6) ÿ ÿ; REMOVE USER CALL ARGS ÿJSR ÿR5,@(R6)+ ÿMOV ÿ(R6)+,4(R6) ÿMOV ÿ(R6)+,4(R6) ÿTST ÿ(R6)+ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ ÿ; SET R5 TO TH ÿ#2,R2 ÿBR ÿPER1Z PRER14: ÿSUB ÿ#14,R6 ÿ ÿ; DIDDLE STACK ÿ ÿ ÿ ÿ; DATASET BUSY ERROR PROER14: MOV ÿ#14,R2 ÿBR ÿPER1Z PER1Z: ÿTST ÿ(R1)+ ÿMOV ÿ@R1,R5 ÿMOVB ÿR2,-(R5) ÿTSTB ÿ-(R5) ÿADD ÿ#14,R6 ÿMOV ÿ#ILFSOP,R3 ÿ; SET R3 EQ ERROR CODE ÿBR ÿPER2Z PNOBUF: MOV ÿ@R1,R5 ÿMOV ÿ#NOBUFR,R3 ÿ; SET R3 EQ ERR CODE ÿCLR ÿR2 PER2Z: ÿMOV ÿ-(R5),14(R6) ÿBNE ÿPEXIT ÿ ÿ ÿ; EXIT IF NON-ZERO ADR ÿMOV ÿ@R0,-(R6) ÿ ÿ; OTHERWISE,CALL DIAG PRINT ÿMOV ÿR3,-(R6) ÿIOT ;FILE STRUCTURESÿ.END ÿ ÿ; END OF FCL ;COPYRIGHT:- DIGITAL EQUIPMENT CORP., MAYNARD, MASS. ;   1971 ; ; VERSION NO. V003B ; .TITLE MTO .GLOBL MTO .CSECT ; ; THIS IS THE OPEN ROUTINE FOR MAG TAPE ; R0=%0 ;DDB ADDR R1=%1 R2=%2 ;FILE NAME BLOCK ADDR R3=%3 R4=%4 ;DEVICE DRIVER ADDR R5=%5 SP=%6 PC=%7 ; ; .WORD 0   ;SWAP FLAG ; PS=177776 ; ; ; LBLSIZ=7 ;SIZE OF LABEL RECORD IN WORDS LBLEN=LBLSIZ+LBLSIZ ;SIZE OF LABEL IN BYTES ; ; LABEL FMT = 7 WORDS ;  FILE ;  NAME ;  EXT ;  UIC(DE ADR OF THE RRES ÿ ÿ ÿ ÿ ÿ; CALL IN THE COMMON EXIT ROUTINE ÿCMP ÿ(R5)+,(R5)+ ÿTSTB ÿAPPEND ÿ ÿ ÿ; CORE RESIDENT? ÿBNE ÿ.+4 ÿ ÿ ÿ; NOPE ÿMOV ÿR5,PC ÿ ÿ ÿ; YUP...GO TO RRES ÿMOV ÿPC,-(R6) ÿ ÿ; PUSH ABS ADR OF THE BUFFER ÿADD ÿ#APPEND-.,@R6 ÿMOV ÿ#20,-(R6) ÿ ÿ; PUSH BUF SIZE ÿMOV ÿR5,-(R6) ÿ ÿ; FAKE A JSR TO RBUF ÿMOV ÿ@#S.RBUF,PC ÿ ÿ; AND RETURN TO S.EXIT ÿ ;FILE STRUCTURES READ/WRITE SUBROUTINE APWRIT1: ÿ READ/WRITE SUBROUTINE PROWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 PROREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3  ;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; ÿ ÿ DISK FILE STRUCTURE PROGRAM ; ÿ ÿ ÿV000A ; ÿ ÿDIGITAL EQUIPMENT CORP. ; ÿ ÿCOPYRIGHT 1971 ÿR0=%0 ÿR1=%1 ÿR2=%2 ÿR3=%3 ÿR4=%4 ÿR5=%5 ÿR6=%6 ÿR7=%7 ÿPC=%7 EFAULT = LOGIN) ;  0/PRTCT CODE(DEFAULT = 233) ;  DATE CREATED ;  UNUSED ; ; BSP=5 SKP=4 RWD=3 WEOF=2 RWU=1 TUSTAT=7 ; ; ; MTO: MOV @#46,-(SP)  ;RESTORE REGS JSR R5,@(SP)+ CMP (SP)+,(SP)+  ;REMOVE PC,PS MOV 10(R0),-(SP)  ;SAVE BUFF LEN TST -(R2) MOV R2,-(SP)  ;SAVE ADDR OF FILE NAME BLK-2 MOV #-LBLSIZ,10(R0)  ;SET WORD COUNT OF LABEL ; ; ; MOVB 13(R0),R1 ADD R4,R1 ADD #16,R1   ;CALC ADDR TO TEST OPEN IN DRIVER MOV R1,-(SP)  ;ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 APREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER  ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿPROREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE  ÿMAPREG ÿ=R1 ÿBLKREG ÿ=R2 ÿFIB ÿ=R2 ÿBIBREG=R0 ÿDRVREG=R5 ÿDATREG=R4 ÿRTMP=R5 ÿADR=R4 ÿOPNIFLG=4 ÿOPNUFLG =1 ÿOPNEFLG =3 ÿOPNOFLG =2 ÿOPNAFLG =5 ÿOPNCFLG=13 ÿLOGNAM=2 ÿIN=4 ÿOUT=2 ÿEOF=40000 ÿ ÿ; FIB ASSIGNMENTS ÿNXTBLK ÿ=0 ÿHOWOPEN =2 ÿBEGEXT ÿ=4 ÿTYPE ÿ=6 ÿSTRT ÿ=12 ÿLENGTH ÿ=14 ÿLAST ÿ=16 ÿDIRITM ÿ=20 ÿDIRBLK ÿ=22 ÿIF ÿ=26 ÿCBMPTR ÿ=30 ÿFLINK ÿ=32 ÿ ÿ; BIB ASSIGNMENTS ÿUFDPTR ÿ=2 ÿMYWORD ÿ=2 ÿBLOCK ÿ=4 ÿBUFADR ÿ=6 ÿWC ÿ=10 SAVE ADDR OF OPEN FLAG CLR -(SP)   ;BUILD SFBLK - RESIDUE COUNT MOV #-1,-(SP)  ;RECORD COUNT(65K FOR SKP) CMP -(SP),-(SP)  ;STATUS AND CMMD MOV SP,2(R0)  ;SET SFBLK ADDR IN DDB TSTB (R1)   ;CHECK IF DEVICE OPEN BEQ MTOPN3   ;BRANCH IF NOT MOVB #11,(R0)   ;SET FILE ALREADY OPEN BR OPFB   ;GO TO FAIL EXIT ; MTOPN3: MOV #RWD+1400,(SP)  ;SET SP FUNC = REWIND JSR PC,SFCALL  ;GO EXEC ; CMPB (R2),#4  ;CHECK IF OUTPUT OPEN BEQ MTOPN2    ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿAPREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE .END  CAT ÿ=.-PROTECT ÿ.END ÿ ÿ; END OF PRO  ÿSTATUS ÿ=12 ÿUNIT ÿ=13 ÿDEVNO ÿ=13 ÿDUNRTN ÿ=14 ÿBUFPTR ÿ=16 ÿBC ÿ=20 ÿCKSUM ÿ=22 ÿMINE2 ÿ=22 ÿDATPTR ÿ=24 ÿFIBLNK ÿ=26 ÿ ÿ; DRIVER ASSIGNMENTS ÿSBS ÿ=4 ÿDSKTFR ÿ=10 ÿMFDPTR ÿ=16 ÿBMPTR ÿ=20 ÿ; OTHER ASSIGNMENTS ÿS.EXIT=42 ÿS.RSAV=44 ÿS.RRES=46 ÿS.CDB=50 ÿS.CDQ=52 ÿGETBUF=54 ÿS.RBUF=56 ÿ ÿDKDRVR=1540 ÿDTDRVR=4100 ÿDKFULL ÿ=1406 ÿPARERR ÿ=1417 ÿBADOPN ÿ=1412 ÿNOBUFR ÿ=1407 ÿILFSOP ÿ=1423 ÿDFMFD=1 ÿDTMFD=100 ÿBCKWRD ÿ=4000 ;BRANCH IF NOT BIT #2000,2(SP)  ;CHECK IF WRITE LOCK ON BEQ MTOPN2   ;BRANCH IF NOT MOV 14(R4),-(SP)  ;PUSH 'MT ' MOV #402,-(SP)  ;ISSUE ACTION DIAGNOSTIC IOT BR MTOPN3   ;GO CHECK AGAIN MTOPN2: MOV 6(R0),R3 ;CALC ADDR OF AREA FOR LABEL BUILD ADD #LBLEN,R3 MOV R3,R1 TST (R2)+ MOV (R2)+,(R3)+  ;MOVE FILE NAME, EXT, UIC, PC MOV (R2)+,(R3)+  ;TO LABEL AREA MOV (R2)+,(R3)+ MOV (R2)+,(R3)+ MOV @#40,R5 MOVB (R2),(R3) BNE MRG1  ÿ; EMT ASSIGNMENTS ÿ.DATE ÿ=41 ÿ.INIT ÿ=6 ÿ.RLS ÿ=7 ÿ.ALLOC ÿ=15 ÿ.RENAM ÿ=20 ÿ.APPEND ÿ=22 ÿ.PROTECT ÿ=24 ÿ.DELETE ÿ=21 ÿ.GETMAP ÿ=50 ÿ.BALLOC ÿ=47 ÿ.GETCONTIG =51 ÿ.LOOKUP ÿ=46 ÿ.CKACSP ÿ=52 ÿ.DELNK ÿ=53 ÿ.DELCONTIG =54 ÿ.SETUPFIB =52 ÿ.RLSFIB ÿ=52 ÿ.APNDP2=55 ÿ.DIRECT=14 UIC=440 DAT=432 .TITLE ÿREN .GLOBL ÿREN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MOV #233,(R3)  ;SET DEFAULT PC IF NONE MRG1: MOV 32(R5),2(R3)  ;SET DATE TST -(R3)   ;IF NO UIC SET LOGIN UIC BNE MRG2 MOV 40(R5),(R3) MRG2: MOV 24(R0),R2  ;GET ASSIGNMENT POINTER BEQ MRGDNE   ;IF NONE - DONE CMP (R2)+,(R2)+ MOVB (R2),R5   ;GET WORD COUNT BEQ MRGDNE   ;BRANCH IF NONE TST (R2)+ TST (R2)   ;CHECK IF NAME OVERRIDE BEQ MRG4   ;BRANCH IF NOTE MOV (R2)+,(R1)+  ;OVERRIDE NAME,EXT,UIC CLR (R1)+ CLR (R1) TST  ;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RENAME ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ÿCALLING SEQUENCE ; ; ÿMOV ÿ#NEWNAM,-(R6) ; ÿMOV ÿ#OLDNAM,-(R6) ; ÿMOV ÿ#DATASET,-(R6) ;OLDNAM:FILA ; ÿNAMA ; ÿEXTA ; ÿUIC ;NEWNAM:FILB ; ÿNAMB ; ÿEXTB ; ÿUIC ; ÿPCODE,MODE ;THIS ROUTINE IS TH!-(R1) ; MRG3: DEC R5 BEQ MRGDNE MOV (R2)+,(R1)+ BR MRG3 ; MRG4: MOV 6(R2),6(R1)  ;OVERRIDE UIC ; MRGDNE: MOV #4,R1   ;SET READ REQUEST JSR PC,IOCALL  ;GO READ CMP 10(R0),16(R0)  ;IF NO BYTES READ BEQ LEOT   ;BRANCH TO LOGICAL EOT TST 12(R0)   ;CHECK IF ERROR BGE OPN1   ;BRANCH IF NOT CLR -(SP)   ;SEND STATUS=0 MOV #410,-(SP)  ;PUSH ACTION REQUEST CODE IOT BIC #100000,12(R0)  ;CLEAR ERR BIT OPN1: MOV 6(R0),R2 MOV #5$E METHOD BY WHICH A ;PERSON CAN CHANGE HIS PROTECTION CODE ;ERROR RETURNS: ; ÿ ÿFILA DOESN'T EXIST ; ÿ ÿFILB ALREADY EXISTS ; ÿ ÿFILB IS THE NAME 00.0 RENAME: ÿ177400 ÿ ÿ ÿ;COMMON CODE TO MOVE CODE ÿ ÿ ÿ ÿ; FLAG FOR SAM.....NON REENTRANT,0 REN: ÿADD ÿPC,R5 ÿ ÿ; R5=177776 VIA SAM ÿSUB ÿ#14,R6 ÿ ÿ; DIDDLE STACK FOR LUKUP ÿTST ÿ-(R5) ÿ ÿ; LOOK AT FIRST WRD OF CODE ÿTSTB ÿ@R5 ÿ ÿ; IN SWAP BUFFER? ÿBEQ ÿRENBGIN ÿ ÿ; IF RESIDENT THEN SKIP ÿMOV ÿ#20,-(R6) ÿ; DISK RESIDENT. GET A BUFFER ÿMOV %,R3  ;CHECK IF LABEL FOUND(NME,EXT,UIC ONLY) OPN2: DEC R3 BEQ LBLFND CMP LBLEN(R2),(R2)+ BEQ OPN2  ;FALL THRU IF NOT MATCHED ; SKIPF: JSR PC,SKPCAL  ;GO SKIP FILE BR MRGDNE   ;DO READ LABEL RECORD ; LEOT: BIT #1000,2(SP)  ;CHECK IF AFTER EOT BEQ LEOT1   ;BRANCH IF NOT MOVB #12,(R0)   ;SET EOM EXIT OPFB: BR OPFAIL   ;EXIT LEOT1: JSR PC,BSPCAL CMPB #4,@12(SP)  ;CHECK IF OPENI BNE LEOT2   ;BRANCH IF NOT MOVB #2,(R0)   ;SET-FILE (ÿ@#GETBUF,R4 ÿJSR ÿR5,@R4 ÿMOV ÿ(R6)+,R3 ÿ; PUT ADR INTO R3 ÿBNE ÿ.+6 ÿJMP ÿRENOBUF ÿ ÿ; TOO BAD ÿMOV ÿR3,R4 ÿ ÿ; LOOP TO DO THE MOVE ÿMOV ÿR5,R2 ÿMOV ÿ(R2)+,(R3)+ ÿINC ÿ@R4 ÿBLE ÿ.-4 ÿSUB ÿR2,R3 ÿ ÿ; FIRST WORD NOW EQ 1 ÿADD ÿR3,PC ÿ ÿ; GO BABY ÿCLR ÿ@R5 ÿCLR ÿ-2(R5) RENBGIN: BIT ÿ#200,12(R0) ÿ; CK DATASET BUSY ÿBNE ÿRENER14 ÿ ÿ; WISE GUY ÿMOV ÿ#1,-(R6) ÿ ÿ; GET A FIB ÿEMT ÿ.SETUPFIB ÿTST ÿFIBLNK(R0) ÿ ÿ; GET ONE? ÿBEQ ÿRENOBUF ÿ ÿ; TOO BAD ÿMOV ÿ-2(R0),R5 ÿ ÿ; I)NOT FOUND BR OPFAIL   ;EXIT LEOT2: ADD #LBLEN,6(R0) ;SET ADDR OF LABEL TO WRITE MOV #2,R1 JSR PC,IOCALL  ;GO WRITE LABEL SUB #LBLEN,6(R0)  ;RESTORE BUFFER ADDR ; SETOPN: INCB @10(SP)   ;SET OPEN FLAG BISB #200,12(R0)  ;... & DDB OPEN FLAG ; EXIT: ADD #14,SP ;REMOVE SFBLK,OPNFLG ADDR AND FNBLK ADDR MOV (SP)+,10(R0)  ;RESTORE BUFF LEN CLR 16(R0) ;CLEAR RESIDUE TO FORCE READ OR BUFF CLR CLR (R0)  ;CLEAR BUSY STATUS MOV @#42,R5   ;ADDR OF S.,MMED EXIT IF NOT FS DEV ÿTST ÿ2(R5) ÿBPL ÿRENEXIT ÿEMT ÿ.LOOKUP ÿ ÿ ÿ; FILE EXIST? ÿMOV ÿ@R6,R4 ÿ ÿ ÿ; R4=DIR ADR ÿMOV ÿBLOCK(R0),R3 ÿ ÿ; R3= BLOCK NUM ÿCMP ÿ@R6,#-3 ÿ ÿ ÿBHIS ÿRENER2 ÿ ÿ ÿ; FILE DOESN'T EXIST ÿCMP ÿ10(R6),@#UIC ÿ ÿ; CALLER THE OWNER? ÿBNE ÿRENER6 ÿ ÿ ÿ; NO ÿBIT ÿ#77,10(R4) ÿ ÿ; FILE OPEN? ÿBNE ÿRENER14 ÿ ÿ ÿ; ERRROR IF USAGE COUNT SET ÿTST ÿ(R1)+ ÿ ÿ ÿ; POP R1 SO IT POINTS TO NXT FNB ÿEMT ÿ.LOOKUP ÿ ÿ ÿ; SEE IF NEW NAME IN USE ÿMOV ÿR6,R5 ÿ ÿ ÿ; CHECK -EXIT TSTB MTO-2  ;CHECK IF IN SWAP AREA BNE .+4   ;BRANCH TO FREE CMP (R5)+,(R5)+   ;SKIP FREEING JMP @R5   ;EXIT ; OPFAIL: MOV 6(R0),-(SP)  ;FREE BUFFER CLR 6(R0)  ;CLEAR BUFF ADDR MOVB 4(R4),-(SP) MOV @#56,-(SP) JSR R5,@(SP)+ MOV 12(SP),R2  ;ADDR FNBLK-2 MOVB (R0),1(R2)  ;SET RET CODE MOV 32(SP),R3  ;GET CALL ADDR MOV -(R2),32(SP)  ;SET ERR RET ADDR BNE EXIT   ;BRANCH IF PRESENT MOV R3,-(SP) MOV #1412,-(SP) ;SET C0FOR ILLEGAL FNAME ÿTST ÿ(R5)+ ÿMOV ÿ(R5)+,-(R6) ÿ ÿ; PUSH NAME ONTO SP ÿBIS ÿ(R5)+,@R6 ÿBIS ÿ(R5)+,(R6)+ ÿ ÿ; POP IT OFF ÿBEQ ÿRNER15 ÿ ÿ ÿ; ILLEGAL NAME ÿCMP ÿ@R6,#-3 ÿBHIS ÿREN1 ÿ ÿ ÿ; ALL SET ÿCMP ÿBLOCK(R0),R3 ÿ ÿ; IT IS. SEE IF THE IDIOT ÿBNE ÿRENER2 ÿ ÿ ÿ; USED THE SAME FILE NAME ÿCMP ÿR4,@R6 ÿBNE ÿRENER2 REN1: ÿCMP ÿ10(R6),@#UIC ÿ ÿ; IS CALLER THE OWNER? ÿBNE ÿRENER6 ÿ ÿ ÿ; WISE GUY ÿMOV ÿR6,R5 ÿ ÿ ÿ; FILE NAME LEGAL? ÿTST ÿ(R5)+ ÿMOV ÿ(R5)+,R2 ÿBIS ÿ(R5)+,R2 1ALL ADDR AND F12 ABORT IOT ; LBLFND: MOVB @12(SP),R1 SUB #3,R1 BMI OPENO   ;BRANCH IF OPENO BNE SETOPN   ;BR IF OPENI OR OPENC OPENE: JSR PC,SKPCAL  ;IS OPENE, SKIP TO EOF JSR PC,BSPCAL  ;BSP OVER EOF BR SETOPN   ;GO EXIT OPENO: MOV 32(SP),-(SP)  ;DIAGNOSE LABEL FOUND ON OPONO MOV #407,-(SP) IOT MOV #TUSTAT+1400,(SP)  ;GET STATUS JSR PC,SFCALL BIT #400,2(SP)  ;IS NEW TAPE UP BEQ SETOPN   ;IF NOT - DONE, ELSE BR MRGDNE   ;4 ÿBIS ÿ(R5)+,R2 ÿBEQ ÿRNER15 ÿ ÿ; NO ÿMOV ÿR3,BLOCK(R0) ÿ ÿ; RESTORE BLOCK NUM ÿJSR ÿPC,RENREAD1 ÿ ÿ; READ THE ORIG BLK ÿTST ÿ(R6)+ ÿ ÿ ÿ; BUMP R6 ÿMOV ÿ(R6)+,(R4)+ ÿ ÿ; MOVE FIL ÿMOV ÿ(R6)+,(R4)+ ÿ ÿ; MOVE NAM ÿMOV ÿ(R6)+,(R4)+ ÿ ÿ; MOVE EXT ÿTST ÿ(R6)+ ÿMOV ÿ(R6)+,12(R4) ÿ ÿ; MOVE PCODE ÿJSR ÿPC,RENWRITE RENEXIT: ÿTST ÿFIBLNK(R0) ÿ ÿ; IS THERE A FIB? ÿBEQ ÿ.+6 ÿ ÿ ÿ; NO MOV ÿ@PC,-(R6) ÿ ÿ ÿ; RLS FIB ÿEMT ÿ.RLSFIB ÿCLR ÿ@R0 ÿCLR ÿBUFADR(R0) ÿMOV ÿ@#S.RRES,R5 ÿJSR ÿR5,5GO SEARCH THIS TAPES LABELS ; ; IOCALL: MOVB R1,12(R0)  ;SET CMMD MOV #10,R1   ;TRAN DISP BR IOEXEC   ;GO READ/WRITE ; BSPCAL: MOV #BSP+1400,2(SP) BR SFCALL ; SKPCAL: MOV #SKP+1400,2(SP) ; SFCALL: MOV #12,R1   ;SET SPECIAL FUNCTION CALL DISP ; IOEXEC: MOV (R0),-(SP)  ;SAVE DDB BUSY FLAG MOV @#PS,-(SP)  ;SIMULATE INT CALL JSR PC,IO RET: MOV (R0),-(SP)  ;COMPLETION COMES HERE MOV @#42,R5 JMP -12(R5)  ;CALL S.EXIT TO CLEAR DDB IOD: MOV 8@R5 ÿMOV ÿ(R6)+,4(R6) ÿMOV ÿ(R6)+,4(R6) ÿTST ÿ(R6)+ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ ÿ; SET R5 TO THE ADR OF THE RRES ÿ ÿ ÿ ÿ ÿ; CALL IN THE COMMON EXIT ROUTINE ÿCMP ÿ(R5)+,(R5)+ ÿTSTB ÿRENAME ÿ ÿ ÿ; CORE RESIDENT? ÿBNE ÿ.+4 ÿ ÿ ÿ; NOPE ÿMOV ÿR5,PC ÿ ÿ ÿ; YUP...GO TO RRES ÿMOV ÿPC,-(R6) ÿ ÿ; PUSH ABS ADR OF THE BUFFER ÿADD ÿ#RENAME-.,@R6 ÿMOV ÿ#20,-(R6) ÿ ÿ; PUSH BUF SIZE ÿMOV ÿR5,-(R6) ÿ ÿ; FAKE A JSR TO RBUF ÿMOV ÿ@#S.RBUF,PC ÿ ÿ; AND RETURN TO S.E(SP)+,(R0)  ;RESTORE DDB BUSY FLAG RTS PC   ;RETURN TO CALLER IO: MOV (SP),14(R0)  ;SET RET ADDR IN DDB ADD #IOD-RET,(SP)  ;SET RTI COMPLETION MOV @#44,-(SP)  ;SAVE REGS JSR R5,@(SP)+ MOV @#50,-(SP) JSR PC,@(SP)+  ;CALL S.CDB MOV SP,R5  ;SIMULATE LINK BLK ON STACK MOV R5,-(SP) EMT 1   ;WAIT FOR COMPLETION MOV @#46,-(SP)  ;RESTORE REGS JSR R5,@(SP)+ RTI   ;RETURN ; .END <XIT RENER2: ÿMOV ÿ#2,R2 ÿ ÿ ÿ; FILE DOESNT EXIST ÿBR ÿRERZ1 RENER6: ÿMOV ÿ#6,R2 ÿ ÿ ÿ; IMPROPER ACCESS PRIV ÿBR ÿRERZ1 RENER14: MOV ÿ#14,R2 ÿ ÿ ÿ; ILLEGAL ACTION TO AN OPEN FILE ÿBR ÿRERZ1 RNER15: MOV ÿ#15,R2 ÿ ÿ ÿ; ILLEGAL FILE NAME ÿBR ÿRERZ1 RERZ1: ÿTST ÿ(R1)+ ÿMOV ÿ@R1,R5 ÿMOVB ÿR2,-(R5) ÿTSTB ÿ-(R5) ÿMOV ÿ#ILFSOP,R3 ÿ ÿ; SET ERROR CODE ÿBR ÿRER2Z RENOBUF: MOV ÿ#NOBUFR,R3 ÿ ÿ; SET ERROR CODE ÿMOV ÿ@R1,R5 ÿ ÿ ÿ; PICK UP LB POINTER RER2Z: ÿADD ÿ#14,R6 ÿ ÿ ÿ; REST=c|j½V“@ ™dzKÑ€‚ DtdK&«�9MLšP‚Ú¡h˜È‘ ‚¯Dt‚FÈL\Ä@Éœ˜Õ"E‘P^‰ƒ\0É–Î9ªODdŠBŒøRˆÎH¨ÓaŠÈ† ÁdФ– v»¶øJzÃv»@¶É–ÎëŠè – &«²úJ¦E ¢¦Î*¥¨ÃùL 9LÁøJzÃV“6šPˆA¶j²‘�‚¯Ö`0‚’L·t±šP˜Ú¡h´ÓÑ� Ae^‰è Œ ™ ¤Uä*†A9ªODdŠB¡h‰{`0 rœI ZžÈȬ„ *ŠÎ¥hœÁ "¦E¢�9L@AÉ HM@Ä&[j²•H†Á&ëj² œIÖ[ L@D&[j²•HŠÔD�œIJ�†U™¤ΘP‚É•H†ÁVëf5¡h‚Ô "j²Q“^‰5 `°ƒ˜ éLz Š©� ;MA™P¨L•HœÁ"’AXd@.¦ úDˆÌ(�‘H`¯ƒ@.™d@K‰œ˜Õ"@Eè|®ÑPd/ ‚œÉH­¨ ØLÒ˜P‚Ì9LšPˆAA‰šP‚Ð9AúJ’Õ´ŠV˜”~Y¡hšÊ‚œO•(ŠÙäšžGIˆ è|�HM@Ä™¤Åé|@®Z<¨ @ORE STACK ÿMOV ÿ-(R5),14(R6) ÿ ÿ; PUT ERR RETURN ON SP RERZ2: ÿBNE ÿRENEXIT ÿ ÿ ÿ; EXIT IF NONZERO ADR ÿMOV ÿ@R0,-(R6) ÿMOV ÿR3,-(R6) ÿ ÿ; OTHERWISE,CALL DIAG PRINT ÿIOT ;FILE STRUCTURES READ/WRITE SUBROUTINE RENWRIT1: ÿMOV ÿ#OUT,R5 ÿ ÿ;SET FOR WRITE ÿBR ÿ.+6 RENREAD1: ÿMOV ÿ#IN,R5 ÿ ÿ;SET FOR READ ÿMOV ÿ@#S.RSAV,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;SAVE REGISTERS ÿMOV ÿR0,-(R6) ÿ;SAVE DDB ADDRESS ÿMOV ÿR6,R2 ÿ ÿ;AND POINTER THERETO ÿMOV ÿ@R0,-(R6) ÿ;SAVE DDB CONTENT ÿMOV ÿR2,-(R6) ÿ;FOJcØL† Y}T™P†Á•HˆÁ "ŠÎI¨ TDžCê¬ HL@Á™¤Å }@ÔDM®A‘ Ф¨ ØL^‰Z<¨ ØL† Y}TšP‚Ú9AøJ¤ID�’TTlžC꬈ è|¿™P M:¤A¶¢^‰õtˆ z¦E¢‚ÇáLФ¨ ØLÅx|@Ô™¤ŠÅ9œÕÑ ’ 1 ^‰H ž TtžTI@Eú¨Î¡h†Ä šIQ, ¯D­¨I²Á¡h‚Ô "šIQ,ޝD-’TXl† Y}TšP‚Ú9AöJ@0™l¨U4- UÑø” m¨S* f+ùJ\OI¨ :-‚ <ΙP MIŠÎûJ¦År@Ïô¤žDQtŠÑP$ÀPDR WAIT BELOW ÿMOV ÿ#10,R1 ÿ ÿ;FOR DRIVER CALL ÿMOV ÿR0,R3 ÿADD ÿ#12,R3 ÿBIC ÿ#6,@R3 ÿBIS ÿ20(R6),(R3)+ ÿ;ENTER FUNCTION IN DDB ÿMOV ÿPC,@R3 ÿ ÿ;SET UP COMPLETION RETURN ÿADD ÿ#RETN-.,@R3 ÿMOV ÿ@#S.CDB,-(R6) ÿ;CALL DRIVER ÿJSR ÿPC,@(R6)+ ÿEMT ÿ1 ÿ ÿ;WAIT FOR COMPLETION ÿMOV ÿ(R6)+,@(R6)+ ÿ;RESTORE (DDB)-DESTROYED AT RETN ÿMOV ÿ@#S.RRES,-(R6) ÿJSR ÿR5,@(R6)+ ÿ;RESTORE REGISTERS ÿRTS ÿPC RETN: ÿMOV ÿ@R0,-(R6) ÿ;DRIVER COMPLETION COMES HERE ÿMOV ÿ#PARERR,-(R6) ÿ;SET UP FOR PARITEc € hh°�¸ hf¶ º› ˆ*k ˆ*s ˆ*ƒ þˆ*“ ˆìò~5@°4œp0†˜© ˆìò~5@°4œr0†˜© ˆìò~5@°4œ`1†˜© þˆìò~5@°4œb1†˜©Œýˆxˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøŒ€ hh°�¸ hHY ERROR ÿTST ÿSTATUS(R0) ÿ;IF THERE IS ONE, GO TO ÿBMI ÿRENREAD1+2 ÿ ÿ;#IN=4=IOT ÿTST ÿ(R6)+ ÿMOV ÿ@#S.EXIT,R5 ÿ;USE SAM RTN TO DEQUEUE DRVR ÿJMP ÿ-12(R5) ÿ ÿ;CLEARS DDB, SO RESTORE ABOVE CAT ÿ=.-RENAME ÿ.END ÿ ÿ; END OF REN   ` L`p%DJ._.5 ÿ<dvN6Ne& Ic±ŒºcŒˆ*3Œˆ*CŒˆ*SŒþˆ*[Œˆì:5@±Š-„ @Œˆìò~5@94¥f0†�©Œˆì5@·-¦ Ä,HŒþˆì5@9‚@0CÈŒ5@·(¥¦ÎZ@B`‰°ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló‰°€ hh°ˆˆ h&±‰°,ºƒ‰°ˆ*s‰Ðˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �Mc  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø‰Ð€ hhˆ˜˜ h&°‰Ðºs‰Ðˆ*c‰Ðˆ*k‰Ðˆ‰Ðˆì5@²5ƒ F ‰Ð5@·(¥¦ÎZ@B ‚uˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøu€ hhˆ˜¨Hc/ ø‚ ò� €œøÏd€ hhˆˆ� hf¹Ïdº 3Ïdˆ* #Ïdˆ* +Ïdˆìà~5@¹š$Š Å@P`Ïdˆì(5@·Yœ„ ÀÃdˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÃd€ hhˆˆ� hf¹ÃdºQc h64uº«uˆ*ƒuˆ*“uˆ*›uˆìò~5@³$Md1†�©uˆì(5@±Š-„ €uˆì5@±H ¦+$¬Hs ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Lós € hh°ˆˆ hF3s ,º Ss ˆ* Cs ,5@·É œÇ[@Pä,Hs|ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ �LcL5@3êL� ݨˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Lóݨ€ hh°ˆˆ hV9ݨ,ºÝ¨ˆ* ݨˆì5@3ÚT¦ Ä,Lݨ,5@3ÚT¦ Ä,HÏdˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�Uc � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøs|€ hhˆ˜˜ h&7s|º 3s|ˆ* #s|ˆ* +s|ˆs|ˆì5@94¥@1CÈs|5@·ˆ–ÃY˜ _ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøPc € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ùÔ~´Lóò¼€ hh°ˆˆ hf0ò¼,º cò¼ˆ* [ò¼,5@3êL˜ ßĈxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøßÄ€ hhˆ˜˜ hf1ßĺ3ßĈ*#ßĈ*+ßĈìò~5@±ÚLd †�©ßĈìYc_€ hhˆˆ� h&8_º s_ˆ* c_ˆ* k_ˆìò~5@·ˆ–ÃY˜ _ˆìjlb3ئ Ä,L_5@·l�C9,� Rˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøR€ hhˆˆ� h&8RºTc � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øõd€ hh°�¸ h2õdº ƒõdˆ* [õdˆ* cõdˆ* kõdþˆ* sõdˆìà~5@3š$ˆI*R1`õdˆì5@3j}P ™Šõdˆì5@3è¬P ™ŠõdþˆìÎ~5@55¤T b(ÀLõd5@3êL� ò¼ˆxˆ¤  þ þ ü�]c ›Rˆ* ƒRˆ* “Rˆìò~5@·ˆ–ÃY˜ Rˆìjlb3ئ Ä,LR5@·$l�C9,� F0ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøF0€ hhˆ˜˜ hf2F0º sF0ˆ* cF0ˆ* kF0ˆì5@°4œl1$HF0ˆì5@°4œn1$HCdþˆxÀ'x�'òþˆfð'~Xc ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøèd€ hhˆˆ� h†4èdº 3èdˆ* #èdˆ* +èdjlf4:¤O *ŒÐ€õdþˆxÀ'x�'òþˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šxˆpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ €acð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šxˆpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øCd€ hh°�¸ h¹Cdº+Cdˆ* Cdˆ*Cdˆ*Cdþˆ*#\c5@±Ê4  ¢õ„ ˆìò~5@³$Mb1†�)Þ„ ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÞ„ € hhˆ˜˜ h†7Þ„ º 3Þ„ ˆ* #Þ„ ˆ* +Þ„ ˆì¼~5@3j}¦ èÌP ™‚Þ„ ˆì¼~5@3謦 èÌP ™‚èdˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð'ecCdˆCdˆìò~5@°4œf1†˜)Cdˆìò~5@°4œh1†˜)Cdþˆìò~5@°4œj1†˜)A ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøA € hhˆ˜¨ h&9A ºSA ˆ*+A ˆ*3A ˆ*CA ˆA ˆìò~jl`38b ’� A ˆìò~5@·É ž Zt� A 5@·Š-ž Zt˜ õÀ`cBl ˆ*[Bl ˆ*cBl ˆ*kBl ˆì(5@±út„ €Bl ˆBl ˆì¼~5@3j}¦ èÌP ™ŠBl 5@3Zœž $µLõ„ ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøõ„ € hhˆ˜¨ h†°õ„ º ›õ„ ˆ* sõ„ ˆ* ƒõ„ ˆ* “õ„ ˆì(5@±I�ŠÒ€õ„ ˆìic|õ¤�ÚäPÔ ôÉ Pt<h²ÔðbèXVèDV,Khh`¨�H$ 0ˆ|I4ÌGh@y´y8à�X�ȸ£T£\°\ÁTÓ„ ´ñ¬ Œñ8ùÓ8è ÈèhüâÐŒâØ|óXxóÐÝÐÐxÚ¨ (”$Ûü$l}€”ÿl}€ý”l}€”ÿl}€ý”l}€”ÿl}€ý”œûüû4~ûü”Z”¦IùLSýz~‰®ˆˆŽÎ *\O´Z”.&¦ mˆOdcß'òþÿ'¶@ p € þ úO ø*  € hhˆ˜¨ h†8*  ºS*  ˆ*+*  ˆ*3*  ˆ*C*  ˆì¼~5@3j}¦ èÌP ™Š*  ˆ*  ˆìL5@°Ê˜ *  5@3j}¦ èÌP ™‚Bl ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøBl € hhˆ˜¨ h†8Bl ºsmc8¬@Ä”�T*¨ÕØ|ŠÔ"‚RI5ŽÎ;¨ÓÕ,€J„j1¨ ò0Zƒ@ˆˆ  mˆ«dMžCJu˜OÀ5ZµÖ‚¹îXˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøîX€ hhˆ˜˜ h67îXºîXˆ* îXˆ*îXˆìL5@± m� îXˆì5@±Y5P ™ŠîX5@¸ mŒªä¬Lìˆ`ð'~ð'hc�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø?t € hhˆ˜¨ h†8?t º#?t ˆ* ?t ˆ*?t ˆ*?t ˆ?t ˆì˜~5@3Ymˆ+dM¬O ’˜ ?t ˆì¼~5@3j}¦ èÌP ™‚*  ˆpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|qc ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló쀠hh°ˆˆ h66ì,ºìˆ* ñ”ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøñ”€ hhˆ˜˜ h67ñ”º3ñ”ˆ*#ñ”ˆ*+ñ”ˆìò~5@94¥b0†�©ñ”ˆñ”lc � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø*䀠hhˆ˜˜ h†7*些*äˆ*ƒ*äˆ*“*äˆì5@±Š-P ™‚*äˆìÎ~jln1Z@Aƒ„(€L?t ˆpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' øuc5@¸ m¦ ¼˜ îð ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Lóîð € hh°ˆˆ h66îð ,º+îð ˆ*#ó$ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøó$€ hhˆ˜˜ h67ó$º[ó$ˆ*Có$ˆ*Só$ˆpc üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ýˆxþ f€ˆöî€þˆÿxñˆ4 j} ˆ–àhh�€¨ h†µ4 ðº34 ðº+4ðº34ðº+4=  4 ˆ*4ˆ*4ù= #4=ìLþ4[bHf­� 4 ˆ4ˆì5@²-ª  ‚4ù=ìLþ5@°Ê˜ *äˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ �ycìò~5@9„„f0†�©ó$ˆó$5@¸ m¦ ¼  À×”ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø×”€ hhˆ˜˜ h67×”ºs×”ˆ*c×”ˆ*k×”ˆìò~5@94¥d0†�©×”ˆ×”5@¸ m¦ Ä,LÄ”ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð'tc=4º s=4ˆ* c=4ˆ* k=4ˆìÎ~jln1Z@Aƒ„(€L=4ˆì¼~5@3謦 èÌP ™‚4 € öîþèÿˆxˆ `ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' óx<û üÿ þÿð'þ~ð'ð'~ð' ÿ € � �   þ þ ü� €ä � �   þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ €ûÄ ðˆxý  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ôð  þ þ ü� €}c ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÄ”€ hhˆ˜¨ h64Ä”º#Ä”ˆ* Ä”ˆ*Ä”ˆ*Ä”ˆìò~5@³$Md1†�)Ä”ˆìò~5@94¥f0†�©Ä”ˆ´”ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø´”xc0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøgl € hhˆ˜¨ h†8gl º«gl ˆ*ƒgl ˆ*“gl ˆ*›gl ˆì(5@±út„ €gl ˆgl ˆì¼~5@3謦 èÌP ™Šgl 5@3Zœª DtL=4ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø=4€ hhˆ˜˜ h†7�c€ hhˆ˜˜ h67´”º [´”ˆ* C´”ˆ* S´”ˆì5@94¥@3CÈ´”ˆì5@¸š$Œ*ä¬H¥”ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø¥”€ hhˆ˜˜ h67¥”º ³¥”ˆ* £¥”ˆ* «¥”ˆì5@¹²RH¥”ˆ¥”5@¸š$  À–”|c üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øVt € hh°�¸ h±Vt º+Vt ˆ* Vt ˆ*Vt ˆ*Vt þˆ*#Vt ˆì¼~5@3謦 èÌP ™ŠVt ˆVt ˆìL5@°Ê˜ Vt þˆìà~5@0ÊŠ „@P`Vt 5@3謦 èÌP ™‚gl ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 …cˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø–”€ hhˆ˜¨ h64–”ºs–”ˆ*[–”ˆ*c–”ˆ*k–”ˆìò~5@¹mb0†�©–”ˆì:5@¹ú@Ô@–”ˆ–”5@¸I� ÐI@Ö`‡”ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ€cO øe` € hhˆ˜¨ h†8e` º³e` ˆ* £e` ˆ* «e` ˆ* ³e` ˆe` ˆì˜~5@3Ymˆ+dMœU "˜ e` ˆì¼~5@3謦 èÌP ™‚Vt þˆxÀ'x�'òþˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šxˆpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� €‰c € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø‡”€ hhˆ˜¨ h64‡”º C‡”ˆ* #‡”ˆ* +‡”ˆ* 3‡”ˆì5@¹H ` ‚‡”ˆìò~5@94¥d0†�©‡”ˆ‡”5@¸š$‚ „œLx”ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚„c? ü„? þ þ þ � þ�/ ø‚ ò� €œøV€ hhˆ˜˜ h†6Vº3Vˆ*#Vˆ*+Vˆì5@±Š-P ™‚Vˆìà~5@·-` ‚R1@e` ˆpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ ú�c ò� €œøx”€ hhˆ˜˜ h68x”º3x”ˆ*#x”ˆ*+x”ˆìò~5@94¥b0†�©x”ˆx”5@¸m˜ _”ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø_”€ hhˆ˜¨ h65_”º#_”ˆ* _”ˆ*_”ˆ*_”ˆìjlr1ˆcCÈGˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøG€ hhˆ˜˜ h¦´Gº[Gˆ*CGˆ*SGˆìà~5@·-` ‚R1@GˆVˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ‘c@DƒH_”ˆìò~5@94¥d0†�©_”ˆ_”5@¸š$‚ D$�SÀI”ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøI”€ hhˆ˜˜ h68I”ºsI”ˆ*cI”ˆ*kI”ˆìò~5@94¥d0†�©I”ˆI”5@¸š$š Š@È`¯Lˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~Œcc¿T ˆ*[¿Tˆ*S¿Tù= C¿T=ìÊþ:[¿T ˆ¿Tˆì5@0út@M ‚¿Tù=¿T ð謆 XD@ËCÈ¿T ðgTˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøgT€ hhˆ˜˜ h†6gTºgTˆ* gTˆ*gTˆìÎ~jln1Z@Aƒ„(€LgTˆì謆 XD@Ë•cð' ¤ˆxùÔ~´Ló¯L€ hh°ˆˆ h66¯L,º[¯Lˆ*S±ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø±€ hhˆ˜˜ h67±º 3±ˆ* #±ˆ* +±ˆì(5@±¬I€±ˆì5@±Y5P ™ŠuP ˆ`ð'~ð' ÿ € � � �cû üÿ þÿð'þ~ð'ð'~ð' ÿ € � �   þ þ ü� €ä � �   þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ €ûÄ ðˆxý  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ôð  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ýˆxþ f€ˆöî€þˆÿxñˆ¿T è¬ ˆ–àhh�€¨ h†µ¿T ðºk¿T ðºs¿Tðºk¿Tðºs¿T= ™c  þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´LóuP € hh°ˆˆ h66uP ,º›uP ˆ*“uø ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøuø € hhˆ˜˜ h68uø º[uø ˆ*Cuø ˆ*Suø ˆìL5@¸m� uø ˆìò~5@9„„d0†�©uø ”c´Ló²$€ hh°ˆˆ h†5²$,º²$ˆ* È$ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÈ$€ hhˆ˜˜ h†7È$º ›È$ˆ* ƒÈ$ˆ* “È$ˆìà~5@·-` ‚R1@È$ˆì¼~5@3j}¦ èÌP ™‚¿T € öîþèÿˆxˆ xˆóx<�c5@¸m  À\P ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló\P € hh°ˆˆ h66\P ,º«\P ˆ*³\À ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø\À € hhˆ˜¨ h65\À ºS\À ˆ*+\À ˆ*3\À ˜c}¬5@3êL† XD@Ë ’˜ µl ˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øµl € hhˆ˜˜ hf·µl º›µl ˆ*ƒµl ˆ*“µl ˆìL5@°Ê˜ µl ˆì5@0ÊŠ „L²$ˆxˆ¤  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ùÔ~¡cˆ*C\À ˆìÎ~5@¸š$‚ D$�S€\À ˆì5@¹²RH\À ˆ\À 5@¸š$’ 4t@P`20 € öîþèÿˆxˆ `ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' óx<û üÿ þÿð'þ~ð'ð'~ð' ÿ € � �   þ þ ü� €ä � �   þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ €ûÄ ðˆxý  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ôð  þ þ ü� € üÿœc*+‰¬ˆ*3‰¬ˆ*C‰¬ˆìà~5@3êL† XD@Ë@‰¬ˆ‰¬ˆì5@¹H ` ‚‰¬5@3êL† XD@Ë Š˜ }¬ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø}¬€ hhˆ˜¨ h†¸}¬ºs}¬ˆ*[}¬ˆ*c}¬ˆ*k}¬ˆ}¬ˆ}¬ˆìà~5@3Ø4b ÂR1@¥c þÿð'þ~ð'ð'~ð' ÿ € � �  `ýˆxþ f€ˆöî€þˆÿxñˆ20  hh�€¨ h&320 𺠳20 𺠫20 𺠳20 𺠫20 = ƒ20 ˆ*›20 ˆ*“20 ù= £20 =ìLþ4[dCV½� 20 ˆ20 ˆì5@¹²RL20 ù=ìò~þ5@±Z4�C†˜©¿P ˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € c€ƒ¼ˆƒ¼5@3êL† XD@Ë`€´ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló€´€ hh°ˆˆ hf0€´,º›€´ˆ*“‰¬ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø‰¬€ hhˆ˜¨ h†¸‰¬ºS‰¬ˆ©c üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø¿P € hhˆ˜˜ h67¿P º s¿P ˆ* c¿P ˆ* kÀìˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÀ쀠hhˆ˜˜ h67Àìº ›Àìˆ* ƒÀìˆ* “Àìˆìò~¤cøžÐ€ hhˆ˜˜ hf2žÐº 3žÐˆ* #žÐˆ* +žÐˆžÐˆìò~5@9„„f0†�©žÐ5@3Š-† XD@Ë ‚ƒ¼ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøƒ¼€ hhˆ˜¨ h†¸ƒ¼º#ƒ¼ˆ* ƒ¼ˆ*ƒ¼ˆ*ƒ¼ˆì(5@±I�ŠÒ­c5@9„„f0†�©ÀìˆÀì5@¸š$¦ ¼  ÀÍ$ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÍ$€ hhˆˆ� h¦³Í$º ³Í$ˆ* £Í$ˆ* «Í$ˆì5@0út¦ Ä,LÍ$ˆìjlb34’D ²Ï˜ˆxˆx¨cI�ŠÒ€¡lˆì(5@±Y5„ €¡lˆì5@94¥@2CÈ¡lþˆìò~5@³$Md1†�©¡l5@3Š-† XD@Ë`¡dˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló¡d€ hh°ˆˆ hf0¡d,ºƒ¡dˆ*sžÐˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œ±cø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÏ˜€ hhˆ˜˜ h6Ϙº ³Ï˜ˆ* £Ï˜ˆ* «Ï˜ˆìà~jlb3ÚVYx�@Ð@ϘˆÜTˆ€€û€€þx¦ þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  Züè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øÜT€ hhˆˆ¬c[Àäˆìà~5@3I�ŠÒ:@F@Àäˆìà~5@²út¨*ª’@3@Àäˆìò~5@°4œ`0†�)ÀäþˆÀä5@3I�ŠÒú@R ‚¡lýˆxˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø¡l€ hh°�¸ hf¶¡lº ƒ¡lˆ* [¡lˆ* c¡lˆ* k¡lþˆ* s¡lˆì(5@±µc� h&8ÜTºÜTˆ* ÜTˆ*ÜTˆìò~5@1›4¦ ØD� ÜTˆì5@·Ø P ™‚ÜȈpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øÜÈ€ hhˆ˜¨ h&6ÜȺ kÜȰcˆ˜¨ h†°»Œº k»Œˆ* S»Œˆ* [»Œˆ* c»Œˆ»Œˆìò~5@°4œp0†˜©»Œˆìò~5@·-` ʘ Àäýˆxˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÀ䀠hh°�¸ h†¹ÀäºcÀäˆ*3Àäˆ*CÀäˆ*SÀäþˆ*¹cˆ* SÜȈ* [ÜȈ* cÜȈì5@¸ m¦ Ä,LÜȈ٨ˆxˆ¤  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ùÔ~´LóÙ¨€ hh°ˆˆ h3Ù¨,º SÙ¨ˆ* CÙ¨,5@¸Øl˜ ´¸ ˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p ´c þÿð'þ~ð'ð'~ð' ÿ € � �  `ùÔ~´Ló»¼€ hh°ˆˆ h†±»¼,º c»¼ˆ* [»¼ˆìÎ~5@·4œZ0 ºŠÎ€»Œˆpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø»Œ€ hh½c€ þ úO ø´¸ € hhˆ˜˜ h¦°´¸ º›´¸ ˆ*ƒ´¸ ˆ*“´¸ ˆì5@¹êLˆ dML´¸ ˆì5@3êLš ”…L±Øˆ€€û€€þx¦ þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  Züè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø±Ø€ hhˆˆ� h&4±Øº s±Øˆ* c±Øˆ* k±Ø5@¸š$š Š´¬ˆxˆ¤  þ þ ü� € üÿ þÿð'þ~¸cˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÒ䀠hh°�¸ h†¹Òäº+Òäˆ* Òäˆ*Òäˆ*Òäþˆ*#ÒäˆÒäˆìò~5@°4œ`0†�©Òäˆìà~5@3I�ŠÒ:@F@Òäþˆìà~5@²út¨*ª’@3@Òä5@3I�ŠÒY@D ‚»¼ˆxˆ¤  þ þ ü� € üÿÁcð'ð'~ð' ÿ € � �  `ùÔ~´L󴬀 hh°ˆˆ h66´¬,ºk´¬ˆ*c´¬,5@¸š$¦ ¼˜ ›À ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø›À € hhˆ˜˜ h†9›À º ››À ˆ* ƒ›À ˆ* “›À ˆ›À ˆì5@9‚@3CÈ›À 5@¸¼cpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øÔŒ€ hhˆ˜¨ h†°ÔŒº CÔŒˆ* #ÔŒˆ* +ÔŒˆ* 3ÔŒˆÔŒˆìò~5@°4œp0†˜)ÔŒˆìà~5@·-` ÊR0`ÒäýˆxÅcš$¦ *E˜ ˜0ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló˜0€ hh°ˆˆ h66˜0,ºƒ˜0ˆ*s� ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø� € hhˆ˜˜ h68� º� ˆ* � ˆ*� ˆìò~Àcð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøç4€ hhˆ˜˜ h†7ç4ºsç4ˆ*cç4ˆ*kç4ˆç4ˆì5@²5ƒ F ç45@3êLš ”…¬O ’Ô¼ˆxˆ¤  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ùÔ~´LóÔ¼€ hh°ˆˆ h†±Ô¼,º[Ô¼ˆ*SÔ¼ˆì¼~5@·4œZ0 º¤E zÔŒˆÉc5@9„„d0†�©� ˆ� 5@¸š$¦ *E  À}øˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø}ø€ hhˆ˜˜ h¦°}øº [}øˆ* C}øˆ* S}øˆì5@´èL@ ‚}øˆìà~5@µlžMT´@P`~hˆxˆxø  þ þ ü� € üÿ þÿÄc錈`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøéŒ€ hhˆˆ� h†4錺[錈*C錈*S錈ì5@3êLš ”…L錈ì:jln2@Â`ç4ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~Ícð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø~h€ hhˆ˜˜ h¦°~hº[~hˆ*C~hˆ*S~hˆì(5@±¬I€~hˆ~h5@¸¬I™@T ‚dˆˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œÈc”�T*¨ÕØ|ŠÔ"‚RI5ŽÎ;¨ÓÕ,€J„j1¨ ò0Zƒ@ˆˆ *-¤O9†EXÀ5ZµÖ‚4켈xˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøì¼€ hhˆ˜¨ h†8켺 ›ì¼ˆ* s켈* ƒì¼ˆ* “켈ìL5@± m� ì¼ˆì5@²út¨* Šì¼ˆìò~5@³$Md1†�)Ñcødˆ€ hhˆ˜¨ h&6dˆº Cdˆˆ* #dˆˆ* +dˆˆ* 3dˆˆì5@± mˆ«dMHdˆˆì5@±Š-P ™dˆˆì5@94¥@2CÈdˆ5@¸ mˆ«dMˆO "˜ Kˆˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøKˆ€ hhˆ˜¨ h&9KˆºsKˆˆÌcÿöÿìÿ €/ €ð'þÿ'ü€ € À'0 þ~’8Hs805Ülç`˜yçhÒ( Ò0ОH¨yHy`éjHðj8ö`8<NH<[\]\N„ [„ð?Hd?¬X¬ÈV`÷N`4[bFVÅ� M`ðF€ ,F¬ ê.(¸.p=pX(”$Ûü$l}€”ÿl}€ý”l}€”ÿl}€ý”l}€”ÿl}€ý”œûüû4~ûü”Z”¦IùLSýz~‰®ˆˆŽÎ *\O´Z”.&¦ mˆO8¬@ÄÕc*[Kˆˆ*cKˆˆ*kKˆˆì5@± mˆ«dMHKˆˆì5@±Š-P ™KˆˆìL5@¶H|� Kˆ5@¸ mˆ«dMˆO "ò\@òòÓÝàPØ(ÊàPÈàPÅ(µ ܵd̵•«àP¦(œàP™àP—(�àPŠàPˆ(~àPy(eàPbàP`(PàPK(õ˜ôõ ¸{˜T{T Tb˜TbT ]H Õ3H °Ð(4ÓˆÈÓP ßX ßÌxȬýŬ@·¬À¬@ÃT  ·¼ ¸Ðc›4¦ ØD� }ôˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø}ô€ hhˆ˜¨ h¦±}ôº k}ôˆ* S}ôˆ* [}ôˆ* c}ôˆì5@±ˆŽÎ *}ôˆì5@±(†Î B}ôˆìà~5@1(†ÎB@Î@}ô5@1(†Î B¦E ¢óŒïãŒdÙP Áà¢8¸Á8@�ÜÀ&ì ÙcÃH ÞºH ²H ,žÄž4€üÃtþ>¸ À&ì ÿöÿìÿ €/ €ð'þÿ'ü€ € À'0 þ~(”$Ûü$l}€”ÿl}€ý”l}€”ÿl}€ý”l}€”ÿl}€ý”œûüû4~ûü”Z”¦IùLSýz~‰®ˆˆŽÎ *\O´Z”.&¦ mˆO8¬@Ä”�T*¨ÕØ|ŠÔ"‚RI5ŽÎ;¨ÓÕ,€J„j1¨ ò0Zƒ@ˆˆ út‚M›d@Eù¤TÀ|À5ZµÖ‚1ÞŒˆxˆxø  þ þ ü� €Ôcð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø›D€ hhˆ˜˜ hF9›Dº[›Dˆ*C›Dˆ*S›Dˆìª~5@1›4† Y}@TCÈ›Dˆìò~5@94¥d0†�©›D5@1›4¦ ØD˜ ˜,ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló˜,€ hh°ˆˆ hV4˜,,º+˜,ˆ*#˜,,5@1Ýc üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÞŒ€ hhˆ˜˜ hf2ÞŒº›ÞŒˆ*ƒÞŒˆ*“ÞŒˆì5@±Y5P ™ŠÞŒˆì(5@²4£fP€ÞŒ5@0DdžNÔ”žC꬘ Á\ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þØc ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øWØ€ hhˆ˜È hf¸Wغ ƒWØ ˆ*3W؈*CW؈*SW؈*[W؈* [WØþˆ* cWØüˆ* kWØùˆ* sWØ5@1(†ÎB@Î@›Dˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ác þ � þ�/ ø‚ ò� €œøÁ\€ hhˆ˜¨ hF±Á\º#Á\ˆ* Á\ˆ*Á\ˆ*Á\ˆì5@±Ê4  ¢Á\ˆÁ\5@0út¦ Ä,L¿,ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló¿,€ hh°ˆˆ h66¿,,º c¿,ˆ* [¿,,5@0út¦ Ä,H´ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �Üc þ þ ü� € üÿ þÿð'þ~ð'�üx@ p € þûòˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'š÷xùˆþx@ p € þ úO øˆpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šxˆpð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'�ýfð'~ð'åc  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø´€ hhˆ˜˜ h†9´º´ˆ* ´ˆ*´ˆ´ˆì5@²úl¨* J«üˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø«ü€ hhˆ˜˜àcº[KDˆ*CKDˆ*SKDˆìò~5@³$Mh1†�©KDˆìà~5@² ¤EzR0@<Dˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø<D€ hhˆ˜˜ h†²<Dº [<Dˆ* C<Dˆ* S<Dˆì5@³&M@³CÈ<Dˆìò~5@0X=ˆÒ†�©W؈pð'~ð' ÿ € � �  éc h†6«üº ³«üˆ* £«üˆ* «™lˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø™l€ hhˆ˜˜ h†9™lº3™lˆ*#™lˆ*+™lˆì5@²Y5¨* Š™lˆ„lˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € �äc `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøWD€ hhˆ˜˜ h†²WDº 3WDˆ* #WDˆ* +WDˆì5@³&M@µCÈWDˆìò~5@²9 œÇ†�)KDˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøKD€ hhˆ˜˜ h†²KDíc �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø„l€ hhˆ˜˜ h†9„lº 3„lˆ* #„lˆ* +„lˆì:5@±I@Ö`„lˆì(5@±I�ŠÒÀ‚Ĉxˆ¤  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ùÔ~´Ló‚Ä€ hh°ˆˆ hf5‚Ä,ºC‚Ĉ*3¥¬ýˆxˆxˆxècò~5@³$Mn1†�©uDˆìà~5@² ¤EzR1@fDˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøfD€ hhˆ˜˜ h†²fDº3fDˆ*#fDˆ*+fDˆìò~5@³$Ml1†�©fDˆìò~5@²9 œÇ†�©WDˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � � ñcˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø¥¬€ hh°�¸ h±¥¬º›¥¬ˆ*k¥¬ˆ*s¥¬ˆ*ƒ¥¬þˆ*“¥¬ˆì5@0út¦ Ä,H¥¬ˆì5@0jD@CCÈ¥¬ˆìL5@95� ¥¬þˆìà~jlr1i@Áƒ@B@¥¬5@0út@M ‚¢¤ ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿìc˜¨ hF±„Dº k„Dˆ* S„Dˆ* [„Dˆ* c„DˆìL5@95� „Dˆì5@0jD@CCÈ„Dˆìò~5@1›4¦ ØD� „D5@1›4¦ ØD  ÀuDˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøuD€ hhˆ˜˜ h†²uDºuDˆ* uDˆ*uDˆìõc þÿð'þ~ð' ¤ˆxùÔ~´Ló¢¤ € hh°ˆˆ h&¸¢¤ ,º«¢¤ ˆ*³¢¤ ,5@0út@M ‚Œ¬ýˆxˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøŒ¬€ hh°�¸ h±Œ¬º ³Œ¬ˆ* “Œ¬ˆ* ›Œ¬ˆ* £Œ¬þˆ* «Œ¬ˆðc �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø¯d€ hhˆ˜¨ hF±¯dº«¯dˆ*ƒ¯dˆ*“¯dˆ*›¯dˆìª~5@1›4† Y}@TCȯdˆìò~5@9„„b0†�©¯dˆ¯d5@1›4  À„Dˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø„D€ hhˆùcì5@0út¦ Ä,HŒ¬ˆì5@0jD@CCÈŒ¬ˆìL5@95� Œ¬þˆìà~5@¹Ø4` ŠR1@Œ¬5@0út@Mù$@E`>t €PöîXþèÿý8x€ýˆÿxˆÈ8þx€ÿˆÿxˆîÈ þ8xˆxˆþÈ þ þ þ ü þ� þ� ø� €Îü2 � � � ‚    ùˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ùxþ8xˆxˆþÈ þ þ þ ü þ� þ� ø� €Îü2 � � � ‚    þôc ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøËd€ hh°�¸ hV5Ëdº SËdˆ* #Ëdˆ* +Ëdˆ* 3Ëdþˆ* CËdˆËdˆì:jlb3@Â@Ëdˆìò~5@9„„f0†�©ËdþˆìL4[dEV­� Ëd5@1ZœŒ „MžC꬘ ¯dˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � �ýc<û üÿ þÿð'þ~ð'ð'~ð' ÿ € � �   þ þ ü� €ä � �   þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ €ûÄ ðˆxý  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ôð  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ýˆxþ f€ˆöî€þˆÿxñˆ>t jDC hh� � h6±>t ðº >t ðº S>t ðº >t ðº S>t = øc¨ hF±Î\ ºsÎ\ ˆ*[Î\ ˆ*cÎ\ ˆ*kÎ\ ˆìL5@±›4� Î\ ˆì5@±Y5P ™ŠÎ\ ˆìà~jln1Z@Aƒ@B@Î\ 5@1›4¦ Ä,LɈ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´LóÉ€ hh°ˆˆ hF8É,ºÉˆ* É,5@1›4¦ ļHËdýˆxˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð'c #>t 8* +>t 8* 3>t 8* C>t ˆ*+>t 8*>t 8*>t ý8*#>t ù= 3>t =>t 8ìL4[dCVÍ� >t 8>t 8>t ˆ>t 8>t 8>t ý8>t ù=ìLþ4[dCVÍ� W”ˆ€€û€€þx¦ þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  Züè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øW”€ hhˆˆ� h&4W”º ³W”ˆ* £W”ˆ* «üc �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøæÔ€ hhˆ˜˜ h69æÔº sæÔˆ* cæÔˆ* kæÔˆìò~5@9„„f0†�©æÔˆæÔ5@1É4¨Á8@Ì ‚Î\ ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÎ\ € hhˆ˜cW”ˆì5@98•@ÔCÈW”ˆì¼~5@9D��P8 P ™‚Ù�ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÙ�€ hhˆ˜¨ h4Ù�º kÙ�ˆ* SÙ�ˆ* [Ù�ˆ* cÙ�ˆì5@±útP ™ŠÙ�ˆì5@94¥@2CÈÙ�ˆìò~5@0X=ˆÒ†�)׈ˆ`ð'~ð' ÿ € � � c  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøã\ € hhˆ˜˜ h69ã\ º [ã\ ˆ* Cã\ ˆ* Sã\ ˆì(5@±É4¨Á€ã\ ˆì5@²Y5¨* Šã\ 5@1É4¨Á8@Ì`áˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Lóဠhh°ˆˆ h66á,º ³áˆ* «æÔˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � c  þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø×ˆ€ hhˆˆ� h&8׈º 3׈ˆ* #׈ˆ* +׈ˆ×ˆˆìL5@±Ø ˜ Ôôˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � � cð'~ð' ÿ € � �  `ýˆxþ f€ˆöî€þˆÿxñˆ¢\ ›4 ú¨Î hh�€¨ h&3¢\ ðº+¢\ ðº3¢\ ðº+¢\ ðº3¢\ = #¢\ ˆ*¢\ ˆ*¢\ ù=  ¢\ =ì˜~þ5@1ZœŒ „MžC꬘ ¢\ ˆ¢\ ˆ¢\ ù=ìò~þjlb4i@ØYœ˜ ã\ ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡ c 0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøÔô€ hhˆ˜˜ h6Ôôº3Ôôˆ*#Ôôˆ*+ÔôˆÔôˆìò~5@9„„f0†�©Ôô5@0ÊŠ „@P`ìˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló쀠hh°ˆˆ h&±ì,º«ìˆ*³ìˆì5@0ÊŠ „Lì,5@0ÊŠ „H¶€ˆxˆxˆxø c7,€ hhˆˆ� h†47,ºs7,ˆ*c7,ˆ*k7,ˆ7,ˆìò~5@±êLd †�©7,5@1‰-@ÔêL„+”�CÀ¢\ € öîþèÿˆxˆ xˆóx<û üÿ þÿð'þ~ð'ð'~ð' ÿ € � �   þ þ ü� €ä � �   þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ €ûÄ ðˆxý  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ôð  þ þ ü� € üÿ þÿð'þ~ð'c þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø¶€€ hhˆ˜¨ h&9¶€º ›¶€ˆ* s¶€ˆ* ƒ¶€ˆ* “¶€ˆì5@7H f ª¶€ˆìò~5@9„„f0†�©¶€ˆìL5@¶*=� ª$ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ c¨ hV8*$º³*$ˆ* £*$ˆ* «*$ˆ* ³*$ˆ*$ˆì5@±ˆŽÒ **$ˆì5@±(†Î B(Dˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló(D€ hh°ˆˆ h†5(D,º[(Dˆ*S7,ˆ€€û€€þx¦ þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  Züè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øcð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøª$€ hhˆˆ� h†4ª$º›ª$ˆ*ƒª$ˆ*“ª$ˆìL5@±ÚT˜ ª$ˆìà~5@8Øb ÊR1`�$ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þcˆìò~5@9„„d0†�©/¬5@1›4´ )-  À?| ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló?| € hh°ˆˆ hV9?| ,º«?| ˆ*³?| ˆìÎ~jlb4*œA„œEÀ*$ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø*$€ hhˆ˜c? ü„? þ þ þ � þ�/ ø‚ ò� €œø�$€ hhˆˆ� h†4�$º s�$ˆ* c�$ˆ* k�$ˆì:jlb3©@Ó`�$ˆìò~5@¹Ú4` Š˜ “ðˆ€€û€€þx¦ þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  Züè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø“ð€ hhˆˆ� h¦³“ðº s“ðˆ* c“ðˆ* k‡Üˆfð'~ð' ÿ € � �  cð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´Ló/Ä€ hh°ˆˆ h†±/Ä,º S/Ĉ* C/Ĉìò~5@1›4´ )-˜ /¬ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø/¬€ hhˆ˜˜ h†7/¬º/¬ˆ* /¬ˆ*/¬ˆ/¬c þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø‡Ü€ hhˆ˜˜ h¦°‡Üº ›‡Üˆ* ƒ‡Üˆ* “‡Üˆì5@1DdšJ š‡Üˆ‰p € öîþèÿˆxˆ `ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' óx<û üÿ þÿð'þ~ð'ð'~ð' ÿ € � �   þ þ ü� €c € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øKü€ hhˆ˜˜ hV3Küº ³Küˆ* £Küˆ* «Küˆì(5@°èl–BÀKüˆì(]@6‚¤ÌÀHˆxˆ¤  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ùÔ~´LóH€ hh°ˆˆ hV4H,ºCHˆ*3H,5@1j¤ÌÀ/Ĉ`ð'~!cä � �   þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ €ûÄ ðˆxý  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ôð  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ýˆxþ f€ˆöî€þˆÿxñˆ‰p X=ˆÒ hh�€¨ hV6‰p 𺠛‰p 𺠓‰p𺠛‰p𺠓‰p= c‰p ˆ* s‰pˆ* k‰pù= ƒxðˆxc úO øo4€ hhˆ˜˜ h69o4º 3o4ˆ* #o4ˆ* +o4ˆì5@1›4¦ Ä,Lo4ˆìà~5@1É4¨Á8@Ì`o45@1›4Œ+ød@ÔYœ� l¤ˆxˆ¤  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ùÔ~´Lól¤€ hh°ˆˆ h66l¤,º £l¤ˆ* ›l¤,5@1›4Œ+ød@ÔYœ˜ Küˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ%cˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøxð€ hhˆ˜˜ h6x𺠛xðˆ* ƒxðˆ* “xðˆì5@±Š-P ”Hxðˆì:5@² 5@B@„0ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ c 0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø4€ hhˆ˜¨ hF±4º C4ˆ* #4ˆ* +4ˆ* 34ˆìL5@±›4� 4ˆì5@²Y5¨* Š4ˆìà~5@·-` ‚R1@45@1›4´ )-˜ o4ˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ)c? ü„? þ þ þ � þ�/ ø‚ ò� €œø„0€ hhˆ˜¨ hF±„0ºS„0ˆ*+„0ˆ*3„0ˆ*C„0ˆì5@0ÊŠ „H„0ˆìà~5@0É4¨Ái\@Ø@„0ˆs ˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øs € hhˆ˜˜ h68s $c h69Ž4ºsŽ4ˆ*cŽ4ˆ*kŽ4ˆìL5@±ÚT� Ž4ˆìò~5@³$M`1†�©Ž45@1I�ŠÒ¨@Á`Œäˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆxùÔ~´LóŒä€ hh°ˆˆ h3Œä,ºCŒäˆ*3Œä,5@1I�ŠÒ¨@Á@4ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � � -cº›s ˆ*ƒs ˆ*“s ˆìL5@±›4˜ s ˆnH ˆxˆ¤  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ùÔ~´LónH € hh°ˆˆ hV4nH ,ºnH ˆ* nH ˆì5@± mˆ«dMHF´ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøF´(c  þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøœT€ hhˆˆ� h&4œTº[œTˆ*CœTˆ*SœT5@1DdšJ š� Ž4ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøŽ4€ hhˆ˜˜1c€ hhˆ˜¨ h°F´º kF´ˆ* SF´ˆ* [F´ˆ* cF´ˆì5@±útP ™F´ˆì5@94¥@2CÈF´ˆìò~5@0X=ˆÒ†�©F´5@0ú”ˆÎÀC°ˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøC°€ hh,c  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøž4€ hhˆ˜¨ hF±ž4º³ž4ˆ* £ž4ˆ* «ž4ˆ* ³ž4ˆìL5@±ÚT� ž4ˆì5@²Y5¨* Šž4ˆì¼~5@³$M`1†`Ï Jž45@1DdšJ š˜ œTˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � � 5cˆˆ� h&8C°º3C°ˆ*#C°ˆ*+C°ˆC°ˆìò~5@³$Mh1†˜)C°5@0è”� / ˆfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šûfð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð'šþxŽrüè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO ø/ € hhˆ˜˜ h9/ º ³/ ˆ* £/ ˆ* «/ ˆìò~5@³$Md1†˜©/ ˆìL0cxùÔ~´Ló»Ü€ hh°ˆˆ h&±»Ü,º “»Üˆ* ƒ»\ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø»\€ hhˆ˜˜ h69»\º[»\ˆ*C»\ˆ*S»\ˆ»\ˆìò~5@9„„f0†�©»\5@1x�@Ðm@P`ž4ˆxˆxˆxø9c5@±›4˜ 2°ˆxˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø2°€ hhˆ˜¨ h°2°º ›2°ˆ* s2°ˆ* ƒ2°ˆ* “2°ˆìL5@0è”� 2°ˆìò~5@9„„f0†�©2°ˆìà~5@0É4¨Ái\@Ø@2°5@0ú”ˆÎØ  ÀFÐ5@95� FÐTP„<P¬ìÅ`hÃäü¿äD¿(4c×Tˆ×Tù=ì(þ5@1j¤ÌÀ¾4ˆxˆxø  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `üè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œø¾4€ hhˆ˜˜ h69¾4º3¾4ˆ*#¾4ˆ*+¾4ˆì:5@±x�@Ð@¾4ˆì5@²Y5¨* о45@1x�@ÐmL»Üˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' ¤ˆ=cï¯(Ø· d·„ù¬„ñ›ôø“ôô“èôˆpðˆ@ôˆÈx}@`z} =º ¨° ¤Ý€¤Ý„ò„0ÚŒt`Ü[° è~v�(v¸ˆ XI¸¨3¤¼ŒôŒôþ––�¬º¬Ø™x­x°”Œ°”< [° ÷(”$Ûü$l}€”ÿl}€ý”l}€”ÿl}€ý”l}€”ÿl}€ý”œûüû4~ûü”Z”¦IùLSýz~‰®ˆˆŽÎ *\O´Z”.8c  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ €ûÄ ðˆxý  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ôð  þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  `ýˆxþ f€ˆöî€þˆÿxñˆ×T l¨Î©hˆÏ( hh�€¨ hV6×T ðº+×T ðº3×Tðº+×Tðº3×T= #×T ˆ*×Tˆ*×Tù=  ×T=ìLþ4[dDf¥� ×T ˆAc&¦ mˆO8¬@Ä”�T*¨ÕØ|ŠÔ"‚RI5ŽÎ;¨ÓÕ,€J„j1¨ ò0Zƒ@ˆˆ šl@ÃêL@Ôù¤TÀ|À5ZµÖ‚2ðtˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xˆ`ð'~ð' ÿ € � �   þ þ ü� € üÿ þÿð'þ~ð' xøˆxüè~d � ‚ � � �  0 0 ‡  þ? ü„? þ þ þ � þ�/ ø‚ ò� €œøðt€ hhˆˆ� hf¹ðtºðtˆ* ðtˆ*ðtˆìò~<cˆ�È hF7Õ`º Õ` * cÕ` *Õ`*CÕ`*SÕ`þ* [Õ`ü* SÕ`ù*[Õ` ìL5@±l� Õ` ì(5@²%£bP€Õ`ìò~5@±Z4�Cˆ�)Õ`ì>~5@1l¨ÎÙŠÄيĆ�©Õ`þì˜~5@1l¨ÎيĆ�)Õ`üì5@±útP ™ŠÕ`ùì(5@²5£fP€×T € öîþèÿˆxˆ xˆóx<û üÿ þÿð'þ~ð'ð'~ð' ÿ € � �   þ þ ü� €ä � � @c5@³$Mb1†˜©ðtˆìà~5@18­@Òøl@E`Õ` þ þ þ ü þ� þ� ø� €Îü2 � � � ‚    þ°ÿû€` ` ` Ä ÄØý(Øý(Øý(Øý(Ȱÿûû€ˆxˆxˆxˆxøP þ þ þ ü þ� þ� ø� €Îü2 � � � ‚    ø¦ þ þ ü� € üÿ þÿð'þ~ð'ð'~ð' ÿ € � �  Züè~ ÿà'ýÀ' û�' ø�'òy¿'ò|ß'òþÿ'¶@ p € þ úO øÕ`€ hh