;///////////////////////////////////////////// ; ;//////////////////////////////////////////// ; ; ; ; 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 COUBEQ 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 #AO1JSR 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 ;CONT6R4,@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 GTST 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 C4dI4dNL4dO/4dT4dMQK4dR z4dS4dX'4d &4d4d-4d &4d4d4d Vq4d Hf4d oT4d  5 H$D73338IR3)+ ;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 KDEC 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(R5OMOV 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? BsBIS #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.EXICBADONE: 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 SUR5 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 F1407 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 MOOPNO: 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 AV 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 GERE 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  ; ... & STSE 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 NAMR5)+,-(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 #12O 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 BLONO 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 RDD #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 FIB07 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)+ ; REMOVLNK =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,LAELETE =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 ; FINE 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 CLDIB +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) ; RELIS @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(RMOV 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,R46)=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 REGHE 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 MAISTERS 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) JD1 ; 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 ABPL 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|jV@ dzKр DtdK&9MLPڡhȑDtFL\@É"EP^\09ODdBRHad vJzv@ &JE *L 9LJzV6PAj`0LtPڡh Ae^ U*A9ODdBh{`0 rI ZȬ *Υh "E9L@A HM@&[jH&j I[ L@D&[jHDIJUΘPɕHVf5h "jQ^5 ` Lz ;MAPLH"AXd@.D(H`@.d@K"@E|Pd/ HLҘP9LPAAP9AJմV~YhO(䚞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) ;FOJcLY}TPH "ITDC HL@ }@DMA  L^Z< LY}TP9AJIDTTlC꬈ |PM:A^t zEL Lx|@ԙ9Ѡ 1 ^H TtTI@EΡh IQ,DIh "IQ,D-TXlY}TP9AJ@0lU4-U mS* f+J\OI:- <ΙPMIJr@DQtP$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 PARITEchhhf*k*s**~5@4p0~5@4r0~5@4`1~5@4b1xxxx      '~''~'     `~d      0 0   ? ?     /   hhhHY 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& Icc*3*C*S*[:5@- @~5@94f05@- ,H5@9@0CȌ5@(Z@B``'~'           '~'x~Lhhh&,*sxx      '~''~'   Mc  `~d      0 0   ? ?     /   hhh&s*c*k5@5F 5@(Z@B uxxx      '~''~'     `~d      0 0   ? ?     /   uhhHc/   dhhhfd 3d* #d* +d~5@$ @P`d(5@Y d`'~'           '~'x`'~'           '~'xx~d      0 0   ? ?     /   dhhhfdQch64uu*u*u*u~5@$Md1u(5@- u5@H +$Hs `'~'           '~'x~Ls hhhF3s , Ss * Cs ,5@ [@P,Hs|xx      '~''~'     `~d   LcL5@3L `'~'           '~'x~LhhhV9,* 5@3T,L,5@3T,Hd`'~'           '~'x`'~'           '~'xx~d      0 0   ? ?     Uc   0 0   ? ?     /   s|hhh&7s| 3s|* #s|* +s|s|5@94@1Cs|5@Y _`'~'           '~'x`'~'           '~'xx~d      0 0   ? ?     /   Pc   '~''~'     `~Lhhhf0, c* [,5@3L xx      '~''~'     `~d      0 0   ? ?     /   hhhf13*#*+~5@Ld Yc_hhh&8_ s_* c_* k_~5@Y _jlb3 ,L_5@lC9,R`'~'           '~'x`'~'           '~'xx~d      0 0   ? ?     /   Rhhh&8RTc          '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O dhhh2d d* [d* cd* kd* sd~5@3$I*R1`d5@3j}P d5@3P d~5@55T b(Ld5@3L x   ]c R* R* R~5@Y Rjlb3,LR5@$lC9,F0xx      '~''~'     `~d      0 0   ? ?     /   F0hhhf2F0 sF0* cF0* kF05@4l1$HF05@4n1$HCdx'x'f'~Xc           '~'xx~d      0 0   ? ?     /   dhhh4d 3d* #d* +djlf4:O *Ѐdx'x'f'~'           '~'xp'~'           '~'f'~'  ac'           '~'xp'~'           '~'f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O CdhhhCd+Cd* Cd*Cd*Cd*#\c5@4  ~5@$Mb1) xx      '~''~'     `~d      0 0   ? ?     /    hhh7  3 * # * + ~5@3j} P ~5@3謦 Pd`'~'           '~'x`'~'ecCdCd~5@4f1)Cd~5@4h1)Cd~5@4j1)A xxx      '~''~'     `~d      0 0   ? ?     /   A hhh&9A SA *+A *3A *CA A ~jl`38b A ~5@ ZtA 5@- Zt`cBl *[Bl *cBl *kBl (5@t Bl Bl ~5@3j} PBl 5@3Z $L xxx      '~''~'     `~d      0 0   ? ?     /    hhh   * s *  *  (5@IҀ ic|P  Pt<hbXVDV,Khh`H$ 0|I4Gh@yy8XT\\T  88h|Xxx($$l}l}l}l}l}l}4~ZILSz~ *\OZ.& mOdc''@ p   O * hhh8* S* *+* *3* *C* ~5@3j} P* * L5@ * 5@3j} PBl xxx      '~''~'     `~d      0 0   ? ?     /   Bl hhh8Bl smc8@ĔT*|"RI5;,Jj1 0Z@  mdMCJuO5ZւXxx      '~''~'     `~d      0 0   ? ?     /   Xhhh67XX* X*XL5@ mX5@Y5P X5@ mL`'~'hc'y'|''@ p   O ?t hhh8?t #?t * ?t *?t *?t ?t ~5@3Ym+dMO ?t ~5@3j} P* p'~'           '~'f'~'           '~'f'~'           '~'xr~ '' ' 'y'|qc           '~'x~Lhhh66,* xx      '~''~'     `~d      0 0   ? ?     /   hhh673*#*+~5@94b0lc   0 0   ? ?     /   *hhh7******5@-P *~jln1Z@A(L?t p'~'           '~'f'~'           '~'f'~'           '~'xr~ '' ' uc5@ m  `'~'           '~'x~L hhh66 ,+ *#$xx      '~''~'     `~d      0 0   ? ?     /   $hhh67$[$*C$*S$pc  '~''~'     `x fx4 j} àhhh4 34 +434+4=  4 *4*4= #4=L4[bHf4 45@- 4=L5@ *xx      '~''~'     `~d   yc~5@9f0$$5@ m xx      '~''~'     `~d      0 0   ? ?     /   hhh67s*c*k~5@94d05@ m,Lxxx      '~''~'tc=4 s=4* c=4* k=4~jln1Z@A(L=4~5@3謦 P4  x `'~'           '~'x<  '~''~'                   '~''~'   x      '~''~'     `    }c     `~d      0 0   ? ?     /   hhh64#* **~5@$Md1)~5@94f0xx      '~''~'     `~d      0 0   ? ?     /   xc0   ? ?     /   gl hhh8gl gl *gl *gl *gl (5@t gl gl ~5@3謦 Pgl 5@3Z DtL=4xx      '~''~'     `~d      0 0   ? ?     /   =4hhh7chhh67 [* C* S5@94@3Cȴ5@$*Hxx      '~''~'     `~d      0 0   ? ?     /   hhh67 * * 5@RH5@$ |c  '~'xr~ '' ' 'y'|''@ p   O Vt hhhVt +Vt * Vt *Vt *Vt *#Vt ~5@3謦 PVt Vt L5@ Vt ~5@0 @P`Vt 5@3謦 Pgl xxx      '~''~'     `~d      0 cxxx      '~''~'     `~d      0 0   ? ?     /   hhh64s*[*c*k~5@mb0:5@@@5@II@`xxx      '~''~' cO e` hhh8e` e` * e` * e` * e` e` ~5@3Ym+dMU " e` ~5@3謦 PVt x'x'f'~'           '~'xp'~'           '~'f'~'           '~'f'~'         c    `~d      0 0   ? ?     /   hhh64 C* #* +* 35@H ` ~5@94d05@$ Lxxx      '~''~'     `~d      0 0   ? ?     / c? ?     /   Vhhh6V3V*#V*+V5@-P V~5@-`R1@e` p'~'           '~'f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   c  xhhh68x3x*#x*+x~5@94b0xx5@m _xxx      '~''~'     `~d      0 0   ? ?     /   _hhh65_#_* _*_*_jlr1cCGxx      '~''~'     `~d      0 0   ? ?     /   GhhhG[G*CG*SG~5@-`R1@GVxx      '~''~'     `~d      0 0   c@DH_~5@94d0__5@$ D$SIxx      '~''~'     `~d      0 0   ? ?     /   Ihhh68IsI*cI*kI~5@94d0II5@$ @`L`'~'           '~ccT *[T*ST= CT=:[T T5@0t@M T=T 謆 XD@CȿT gTxx      '~''~'     `~d      0 0   ? ?     /   gThhh6gTgT* gT*gT~jln1Z@A(LgT謆 XD@˕c'x~LLhhh66L,[L*Sxx      '~''~'     `~d      0 0   ? ?     /   hhh67 3* #* +(5@I5@Y5P uP `'~'    c  '~''~'                   '~''~'   x      '~''~'     `      '~''~'     `x fxT  àhhhT kT sTkTsT= c       '~'x~LuP hhh66uP ,uP *u xx      '~''~'     `~d      0 0   ? ?     /   u hhh68u [u *Cu *Su L5@m u ~5@9d0u cL$hhh5$,$* $xx      '~''~'     `~d      0 0   ? ?     /   $hhh7$ $* $* $~5@-`R1@$~5@3j} PT  x xx<c5@m \P `'~'           '~'x~L\P hhh66\P ,\P *\ xxx      '~''~'     `~d      0 0   ? ?     /   \ hhh65\ S\ *+\ *3\ c}5@3L XD@ l f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O l hhhfl 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@3L XD@@5@H ` 5@3L XD@ }xxx      '~''~'     `~d      0 0   ? ?     /   }hhh}s}*[}*c}*k}}}~5@34bR1@c '~''~'     `x fx20 hhh&320  20  20  20  20 = 20 *20 *20 = 20 =L4[dCV20 20 5@RL20 =~5@Z4CP f'~'           '~'f'~'         c5@3L XD@``'~'           '~'x~Lhhhf0,*xxx      '~''~'     `~d      0 0   ? ?     /   hhhSc  '~'xr~ '' ' 'y'|''@ p   O P hhh67P  sP * cP * kxx      '~''~'     `~d      0 0   ? ?     /   hhh67 * * ~chhhf2 3* #* +~5@9f05@3- XD@ xxx      '~''~'     `~d      0 0   ? ?     /   hhh#* **(5@Iҭc5@9f05@$  $`'~'           '~'x`'~'           '~'xx~d      0 0   ? ?     /   $hhh$ $* $* $5@0t ,L$jlb34D xxcIҀl(5@Y5 l5@94@2Cȡl~5@$Md1l5@3- XD@`d`'~'           '~'x~Ldhhhf0d,d*sxx      '~''~'     `~d      0 0   ? ?     /   c      '~''~'     `~d      0 0   ? ?     /   hhh6 * * ~jlb3VYx@@Tx      '~''~'     Z~ '' ' 'y'|''@ p   O Thhc[~5@3I:@F@~5@t*@3@~5@4`0)5@3I@R lxxxx      '~''~'     `~d      0 0   ? ?     /   lhhhfl l* [l* cl* kl* sl(5@ch&8TT* T*T~5@14 DT5@ P p'~'           '~'f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O hhh&6 kch k* S* [* c~5@4p0~5@-`ʘ xxxx      '~''~'     `~d      0 0   ? ?     /   hhhc*3*C*S*c* S* [* c5@ m,Lx      '~''~'     `~Lhhh3, S* C,5@l f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p c '~''~'     `~Lhhh, c* [~5@4Z0 ΀p'~'           '~'f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O hhc  O  hhh  * * 5@L dML 5@3L Lx      '~''~'     Z~ '' ' 'y'|''@ p   O hhh&4 s* c* k5@$ x      '~cxxx      '~''~'     `~d      0 0   ? ?     /   hhh+* ***#~5@4`0~5@3I:@F@~5@t*@3@5@3IY@D x     c''~'     `~Lhhh66,k*c,5@$   xx      '~''~'     `~d      0 0   ? ?     /    hhh9   *  *   5@9@3Cț 5@cp'~'           '~'f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O hhh C* #* +* 3~5@4p0)~5@-`R0`xc$ *E 0`'~'           '~'x~L0hhh660,0*sxx      '~''~'     `~d      0 0   ? ?     /   hhh68* *~c'     `~d      0 0   ? ?     /   4hhh74s4*c4*k445@5F 45@3L O x      '~''~'     `~Lhhh,[*S~5@4Z0 E zc5@9d05@$ *E }f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O }hhh} [}* C}* S}5@L@ }~5@lMT@P`~hxx      c`'~'           '~'x`'~'           '~'xx~d      0 0   ? ?     /   hhh4[*C*S5@3L L:jln2@`4xx      '~''~c'~''~'     `~d      0 0   ? ?     /   ~hhhh~h[~h*C~h*S~h(5@I~h~h5@I@T dxxx      '~''~'     `~d      0 0   ? ?     /   cT*|"RI5;,Jj1 0Z@ *-O9EX5Zւ4xxx      '~''~'     `~d      0 0   ? ?     /   hhh8 * s* * L5@ m5@t* ~5@$Md1)cdhhh&6d Cd* #d* +d* 3d5@ mdMHd5@-P d5@94@2Cd5@ mdMO " Kxxx      '~''~'     `~d      0 0   ? ?     /   Khhh&9KsKc / '' '0 ~8Hs805l`yh(0HyHy`jHj8`8<NH<[\]\N [?Hd?XV`N`4[bFVŐM`F ,F .(.p=pX($$l}l}l}l}l}l}4~ZILSz~ *\OZ.& mO8@c*[K*cK*kK5@ mdMHK5@-P KL5@H| K5@ mdMO "\@P(PP( dP(PP(PP(~Py(ePbP`(PPK( {T{T TbTbT ]H 3H (4P X x@@T   c4 D}xxx      '~''~'     `~d      0 0   ? ?     /   }hhh} k}* S}* [}* c}5@ *}5@( B}~5@1(B@@}5@1( BE dP88@& cH H H ,4t> &  / '' '0 ~($$l}l}l}l}l}l}4~ZILSz~ *\OZ.& mO8@ĔT*|"RI5;,Jj1 0Z@ tMd@ET|5Zւ1xx    c'~'     `~d      0 0   ? ?     /   DhhhF9D[D*CD*SD~5@14 Y}@TCțD~5@94d0D5@14 D,`'~'           '~'x~L,hhhV4,,+,*#,,5@1c  '~''~'     `~d      0 0   ? ?     /   hhhf2**5@Y5P (5@4fP5@0DdNԔC꬘ \xxx      '~''~'     `~d      0 0   ? ?  c           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O WhhhfW W *3W*CW*SW*[W* [W* cW* kW* sW5@1(B@@Dxx      '~'c   /   \hhhF\#\* \*\*\5@4 \\5@0t ,L,`'~'           '~'x~L,hhh66,, c,* [,,5@0t ,Hxx      '~''~'   c      '~'x@ p  f'~'           '~'xx@ p   O p'~'           '~'f'~'           '~'f'~'           '~'xp'~'           '~'f'~'c  `~d      0 0   ? ?     /   hhh9* *5@l* Jf'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O hhc[KD*CKD*SKD~5@$Mh1KD~5@ EzR0@<Dxx      '~''~'     `~d      0 0   ? ?     /   <Dhhh<D [<D* C<D* S<D5@&M@C<D~5@0X=҆Wp'~'     ch6 * * lxx      '~''~'     `~d      0 0   ? ?     /   lhhh9l3l*#l*+l5@Y5* llf'~'           '~'f'~'  c `~d      0 0   ? ?     /   WDhhhWD 3WD* #WD* +WD5@&M@CWD~5@9 dž)KDxx      '~''~'     `~d      0 0   ? ?     /   KDhhhKDc         '~'xr~ '' ' 'y'|''@ p   O lhhh9l 3l* #l* +l:5@I@`l(5@Ix      '~''~'     `~Lhhhf5,C*3xxxc~5@$Mn1uD~5@ EzR1@fDxx      '~''~'     `~d      0 0   ? ?     /   fDhhhfD3fD*#fD*+fD~5@$Ml1fD~5@9 džWDxx      '~''~'    cx      '~''~'     `~d      0 0   ? ?     /   hhh*k*s**5@0t ,H5@0jD@CCȥL5@95~jlr1i@@B@5@0t@M  `'~'          chFD kD* SD* [D* cDL5@95D5@0jD@CCȄD~5@14 DD5@14 DuDxx      '~''~'     `~d      0 0   ? ?     /   uDhhhuDuD* uD*uDc '~'x~L hhh& , * ,5@0t@M xxxx      '~''~'     `~d      0 0   ? ?     /   hhh * * * * c   0 0   ? ?     /   dhhhFdd*d*d*d~5@14 Y}@TCȯd~5@9b0dd5@14 Dxxx      '~''~'     `~d      0 0   ? ?     /   Dhhc5@0t ,H5@0jD@CCȌL5@95~5@4`R1@5@0t@M$@E`>t PX8xx8xx 8xx        2        `'~'           '~'x8xx        2        c     `~d      0 0   ? ?     /   dhhhV5d Sd* #d* +d* 3d* Cdd:jlb3@@d~5@9f0dL4[dEVd5@1Z MC꬘ dxxx      '~''~'     `~d    c<  '~''~'                   '~''~'   x      '~''~'     `      '~''~'     `x fx>t jDChhh6>t  >t  S>t  >t  S>t = chF\ s\ *[\ *c\ *k\ L5@4 \ 5@Y5P \ ~jln1Z@A@B@\ 5@14 ,L`'~'           '~'x~LhhhF8,* ,5@14 ļHdxxxx      '~''~'c #>t 8* +>t 8* 3>t 8* C>t *+>t 8*>t 8*>t 8*#>t = 3>t =>t 8L4[dCV͐>t 8>t 8>t >t 8>t 8>t 8>t =L4[dCV͐Wx      '~''~'     Z~ '' ' 'y'|''@ p   O Whhh&4W W* W* c   `~d      0 0   ? ?     /   hhh69 s* c* k~5@9f05@148@ \ xxx      '~''~'     `~d      0 0   ? ?     /   \ hhcW5@98@CW~5@9DP8 Pxxx      '~''~'     `~d      0 0   ? ?     /   hhh4 k* S* [* c5@tP 5@94@2C~5@0X=҆)`'~'    c  ? ?     /   \ hhh69\  [\ * C\ * S\ (5@4\ 5@Y5* \ 5@148@``'~'           '~'x~Lhhh66, * xx      '~''~'   c       '~'x`'~'           '~'xx~d      0 0   ? ?     /   hhh&8 3* #* +L5@ xx      '~''~'     `~d     c'~'     `x fx\ 4 Πhhh&3\ +\ 3\ +\ 3\ = #\ *\ *\ =  \ =~5@1Z MC꬘ \ \ \ =~jlb4i@Y \ xx      '~''~'     `~d      0 0  c 0 0   ? ?     /   hhh63*#*+~5@9f05@0 @P``'~'           '~'x~Lhhh&,*5@0 L,5@0 Hxxxc7,hhh47,s7,*c7,*k7,7,~5@Ld 7,5@1-@L+C\  x xx<  '~''~'                   '~''~'   x      '~''~'     `      '~'c      '~''~'     `~d      0 0   ? ?     /   hhh&9 * s* * 5@7H f ~5@9f0L5@*= $`'~'           '~'x`'~'           '~ chV8*$*$* *$* *$* *$*$5@ **$5@( B(D`'~'           '~'x~L(Dhhh5(D,[(D*S7,x      '~''~'     Z~ '' ' 'y'|''@ p   O c'xx~d      0 0   ? ?     /   $hhh4$$*$*$L5@T$~5@8b R1`$`'~'           '~'x`'~'           '~'xx~d      0 0   c~5@9d0/5@14 )-?| `'~'           '~'x~L?| hhhV9?| ,?| *?| ~jlb4*AE*$xxx      '~''~'     `~d      0 0   ? ?     /   *$hhc? ?     /   $hhh4$ s$* c$* k$:jlb3@`$~5@4` x      '~''~'     Z~ '' ' 'y'|''@ p   O hhh s* c* kf'~'     c'           '~'x~L/hhh/, S/* C/~5@14 )-/xx      '~''~'     `~d      0 0   ? ?     /   /hhh7//* /*//c      '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O hhh * * 5@1DdJ p  x `'~'           '~'x<  '~''~'         c          '~'xr~ '' ' 'y'|''@ p   O KhhhV3K K* K* K(5@lBK(]@6Hx      '~''~'     `~LHhhhV4H,CH*3H,5@1j/`'~!c          '~''~'   x      '~''~'     `      '~''~'     `x fxp X=ҠhhhV6p  p  p p p= cp * sp* kp= xxc O o4hhh69o4 3o4* #o4* +o45@14 ,Lo4~5@148@`o45@14+d@Y lx      '~''~'     `~Llhhh66l, l* l,5@14+d@Y Kf'~'           '~'f'~' %cx      '~''~'     `~d      0 0   ? ?     /   xhhh6x x* x* x5@-P Hx:5@ 5@B@0xxx      '~''~'     `~d      0 0    c 0 0   ? ?     /   4hhhF4 C4* #4* +4* 34L5@4 45@Y5* 4~5@-`R1@45@14 )-o4f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p  )c? ?     /   0hhhF0S0*+0*30*C05@0 H0~5@04i\@@0sf'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O shhh68s$ch694s4*c4*k4L5@T4~5@$M`145@1IҨ@``'~'           '~'x~Lhhh3,C*3,5@1IҨ@@4xxx      '~''~'     `~d     -cs*s*sL5@4 snH x      '~''~'     `~LnH hhhV4nH ,nH * nH 5@ mdMHFxxx      '~''~'     `~d      0 0   ? ?     /   F(c       '~'xx~d      0 0   ? ?     /   Thhh&4T[T*CT*ST5@1DdJ 4xx      '~''~'     `~d      0 0   ? ?     /   4hh1chhhF kF* SF* [F* cF5@tP F5@94@2CF~5@0X=҆F5@0C`'~'           '~'x`'~'           '~'xx~d      0 0   ? ?     /   Chh,c      '~''~'     `~d      0 0   ? ?     /   4hhhF44* 4* 4* 4L5@T45@Y5* 4~5@$M`1` J45@1DdJ T`'~'           '~'x`'~'    5ch&8C3C*#C*+CC~5@$Mh1)C5@0蔐 /f'~'           '~'f'~'           '~'xr~ '' ' 'y'|''@ p   O /hhh9/ /* /* /~5@$Md1/L0cx~Lhhh&, * \xx      '~''~'     `~d      0 0   ? ?     /   \hhh69\[\*C\*S\\~5@9f0\5@1x@m@P`4xxx9c5@4 2xxx      '~''~'     `~d      0 0   ? ?     /   2hhh2 2* s2* 2* 2L5@0蔐 2~5@9f02~5@04i\@@25@0F5@95FTP<P`hD(4cTT=(5@1j4xx      '~''~'     `~d      0 0   ? ?     /   4hhh69434*#4*+4:5@x@@45@Y5* 45@1x@mL`'~'           '~'=c( dp@x}@`z}= 0t`[ ~v(v XI3xx< [ ($$l}l}l}l}l}l}4~ZILSz~ *\OZ.8c       '~''~'   x      '~''~'     `      '~''~'     `x fxT lΩh(hhhV6T +T 3T+T3T= #T *T*T=  T=L4[dDfT Ac& mO8@ĔT*|"RI5;,Jj1 0Z@ l@L@T|5Zւ2t`'~'           '~'x`'~'           '~'xx~d      0 0   ? ?     /   thhhftt* t*t~<chF7` ` * c` *`*C`*S`* [`* S`*[` L5@l ` (5@%bP`~5@Z4C)`>~5@1lĆ`~5@1lĆ)`5@tP `(5@5fPT  x xx<  '~''~'            @c5@$Mb1t~5@18@l@E``        2        ``` ((((xxxxP        2              '~''~'     Z~ '' ' 'y'|''@ p   O `hh