~~ I>~~~~~~~~ I>~~~~  ; ; FILE SYSTEM MODULE. ; .TITL FILSYS .NREL .ENT CREATE,CRINI ;CREATE AN ENTRY .ENT DELFIL ;DELETE AN ENTRY .ENT RENFIL ;CHANGE NAME .ENT STATUS ;FETCH FILE STATUS INFO .ENT UPDATE ;CHANGE FILE STATUS INFO .ENT DELBK,DESBK ;DELETE BLOCKS .EXTN MVWD .EXTN SETMOD .EXTN CMPWD .EXTN RDBNO ;READ THE NTH BLOCK .EXTN RDNBK ;READ THE NEXT BLOCK .EXTN DEBLK ;DEPOSIT BLOCK .EXTN RDLBK ;READ LAST BLOCK .EXTN IDCB,FIDCB;INIT DCB .EXTN SDCB ;SYSTEM DCB .EXTN FLUSH ;FLUSH SYSTEM BUFFERS .EXTN RDCBK ;READ CURRENT BLOCK .EXTN XOR ;EXCLUSIVE OR .EXTN DDCB ;DEFAULT DCB ; ; CREATE FILE ENTRY. ; ; AC0: UFD ENTRY ADDRESS ; AC2: DCB ADDRESS OF SYS.DR ; JSR CREATE ; -ERROR (CODE IN AC2) ; -NORMAL RETURN ; SBAD=TMP ;BUFFER ADDRESS EXSW=TMP+1 ;EXTEND SWITCH STMP=TMP+2 ;TEMPORARY ON STACK CREATE: STA@ 3,CSP SAVE LDA 1,SFLK,2 ;MAP LINK WORD COM# 1,1,SZR ;-1 THEN IGNORE CREATES JMP NOMT MOV 0,3  ;UFD ADDRESS LDA 1,UFTEX,3 ;EXTENSION LDA 3,CSP ;STACK POINTER MOV# 1,1,SNR ;IS THERE AN EXT. JMP CRET ;NO - BAG IT LDA@ 2,.DDCB ;YES - USE DDCB STA 2,OAC2,3 ;STUFF BACK NOMT: LDA 3,DCBDC,2 LDA 1,DCDCL,3 MOV 0,3 STA 1,UFTDL,3 SUB 1,1 STA 1,UFTAT,3 STA 1,UFTBK,3 STA 1,UFTBC,3 STA 1,UFTAD,3 LDA 3,CSP JMP CRINI+3 CRINI: STA@ 3,CSP SAVE  ;SAVE REGISTERS SUB 1,1 ISZ ORTN,3 ;NORMAL RETURN STA 1,EXSW,3 ;EXTEND SYS.DR SWITCH. JSR@ .SRUF ;SEARCH FILE DIRECTORY JMP CFNF ;NOT THERE ALREADY SUB 0,0 STA 0,BQTLA,2 ;GET RID OF BUFFER MOV 1,2  ;ENTRY ADDRESS LDA 0,UFTBK,2 ;LOOK FOR ZERO LENGTH LDA 1,UFTBC,2 ADDZ 0,1 INCR 1,1,SNR RTRN  ;ZERO LENGTH - NO ERROR LDA 0,CRTER ;CREATE ERROR DSZ ORTN,3 ;ABNORMAL RETURN STA 0,OAC2,3 RTRN CFNF: STA 0,STMP,3 ;SAVE BLOCK NUMBER IN TEMP. LDA 2,OAC2,3 ;SYS.DR DCB ADDRESS LDA 2,DCBDC,2 ;DCT LINK WORD LDA 0,DCDCL,2 ;FORM DCT LDA 3,OAC0,3 ;UFD ADDRESS LDA 1,UFTDL,3 ;DCT LINK OF FILE LDA 3,CSP SUB# 0,1,SZR ;SAME ? JMP NOADR ;NO - DONT ALLOCATE DEVICE ADDRESS LDA 1,OAC2,3 ;SYS.DR DCB ADDRESS LDA 2,.SDCB ;-> SDCB SUB 0,0 JSR@ .FIDCB ;INIT DCB JSR@ .RDNBK ;READ NEXT BLOCK (BLOCK ZERO) LDA 3,NXLK ;LINK OWRD OFFSET ADD 1,3  ;LINK ADDRESS STA 0,0,3 ;CLEAR LINK LDA 0,DCBFA,2 ;DEVICE ADDRESS WORD MOV 1,2  ;BUFFER ADDRESS JSR@ SETM ;MODIFY BUFFER LDA 2,OAC0,3 ;UFD ADDRESS AGAIN STA 0,UFTAD,2 ;SET ADDRESS IN UFDE NOADR: LDA 0,STMP,3 ;BLOCK NUMBER LDA 2,OAC2,3 ;SYS.DR DCB ADDRESS LDA 1,SFBK,2 ;LAST BLOCK NUMBER SUBZ# 0,1,SNC ;SLE 0,1 ISZ EXSW,3 ;MUST EXTEND SYS.DR JSR@ .RDBN ;READ BLOCK NUMBER IN AC0 MOV 0,2  ;BUFFER ADDRESS ISZ 0,2  ;ONE MORE ENTRY STA 2,SBAD,3 ;SAVE BUFFER ADDRESS LDA 1,ENTLG ;ENTRY LENGTH INC 2,2,SKP ;POINTS TO FIRST ENTRY ADD 1,2 LDA 0,UFTFN,2 ;FIRST WORD OF FILE NAME MOV# 0,0,SZR ;VACANT ? JMP .-3  ;NO MOV 2,0 MOV 1,2 MOV 0,1 LDA 0,OAC0,3 ;ENTRY ADDRESS JSR@ .MVWD ;MOVE ENTRY INTO BUFFER LDA 2,SBAD,3 ;BUFFER ADDRSS CRETN: JSR@ SETM ;SET BUFFER MODIFIED CNRET: SUB 0,0 STA 0,BQTLA,2 ;USE ME FIRST DSZ EXSW,3 ;EXTEND FILE ? JMP CDON ;NO LDA 2,OAC2,3 ;DCB ADDRESS ISZ SFBK,2 ;INRECMENT IN CORE VERSION LDA 0,SYSNM ;DIRECTORY NAME JSR@ .SRUF ;SERACH FOR IT JMP .  ;GAK. MOV 1,3  ;ENTRY ADDRESS ISZ UFTBK,3 ;MODIFY BUFFER VERSION JMP CRETN ;NOW GO MODIFY BUFFER .SRUF: SRUFD .RDBN: RDBNO CRTER: ERCRE  ;FILE ALREADY EXISTS .DDCB: DDCB ; ; FILE STATUS/UPDATE STATUS ; ; AC0: UFD ADDRESS (WITH NAME) ; AC2: SYS.DR DCB ADDRESS ; -ERROR (CODE IN AC2) ; -NORMAL RETURN ; STATUS: STA@ 3,CSP ;SAVE RETURN SAVE  ;SAVE REGISTERS LDA 1,SFLK,2 COM 1,1,SZR JMP NOMT1 MOV 0,3 LDA 1,UFTEX,3 LDA 3,CSP MOV# 1,1,SNR JMP MTDEV LDA@ 2,.DDCB STA 2,OAC2,3 ;RETURN NEW DCB ADDRESS NOMT1: JSR@ .SRUF ;SEARCH UFD JMP FNFER ;ERROR STA 2,SBAD,3 ;SAVE BUFFER ADDRESS MOV 1,0 LDA 1,OAC0,3 LDA 2,ENTLG ;ENTRY LENGTH JSR@ .MVWD ;MOVE ENTRY INFO LDA 2,SBAD,3 ;BUFFER ADDRESS UMRET: SUB 0,0 STA 0,BQTLA,2 ;USE ME FIRST CRET: ISZ ORTN,3 ;TAKE SUCCESSFUL RETURN RTRN UPDATE: STA@ 3,CSP ;SAVE RETURN SAVE JSR@ .SRUF JMP FNFER STA 2,SBAD,3 MOV 1,2  ;ENTRY ADDRESS LDA 0,UFTAT,2 ;ATTRIBUTES LDA 1,UPAD ;MASK AND# 0,1,SZR JMP PRER ;ERROR - CANT CHANGE FILE ENTRY MOV 2,1 LDA 0,OAC0,3 LDA 2,ENTLG JSR@ .MVWD MDRET: LDA 2,SBAD,3 JSR@ SETM JSR@ .FLUSH JMP UMRET UPAD: ATCHA .FLUSH: FLUSH ; ; RENAME ; ; AC0: OLD NAME ADDR ; AC1: NEW NAME ADDRESS ; AC2: DCB ADDRESS OF SYS.DR ; JSR RENFIL ; -ERROR (CODE IN AC2) ; -NORMAL RETURN ; RENFIL: STA@ 3,CSP SAVE LDA 1,SFLK,2 COM# 1,1,SNR JMP ILDEV LDA 0,OAC1,3 ;NEW NAME POINTER JSR@ .SRUF ;LOOK FOR IT JMP REN1 ;NOT THERE - GOOD SUB 0,0 STA 0,BQTLA,2 ;BAG BUFFER LDA 0,CRTER ;ERROR CODE JMP ERET ;TAKE ERROR EXIT REN1: LDA 0,OAC0,3 ;NEW NAME POINTER JSR@ .SRUF JMP FNFER ;NOT THERE - ERROR STA 2,SBAD,3 ;SAVE BUFFER ADDRESS MOV 1,2  ;ENTRY ADDRESS LDA 0,UFTAT,2 ;ATTRIBUTES LDA 1,PERM ;IS IT PERM AND# 0,1,SZR JMP PRER ;YES - ERROR MOV 2,1 LDA 0,OAC1,3 LDA 2,FNL ;NAME LENGTH JSR@ .MVWD JMP MDRET .CMPWD: CMPWD .MVWD: MVWD ENTLG: UFDEL PFEC: ERDE1  ;PERMANENT FILE FNFC: ERDLE  ;FILE NOT FOUND PERM: ATPER .RDNBK: RDNBK .XDCB: .SDCB: SDCB .FIDCB: FIDCB SETM: SETMOD NXLK: BQNXL FNFER: LDA 0,FNFC JMP ERET PRER: LDA 2,SBAD,3 SUB 0,0 STA 0,BQTLA,2 ILDEV: LDA 0,PFEC ERET: STA 0,OAC2,3 ;RETURN CODE RTRN SYSNM: .+1 "S*400+"Y "S*400 0 0 0 "D*400+"R CDON: JSR@ .FLUSH RTRN MTDEV: ISZ ORTN,3 ;NORMAL RETURN LDA 3,DCBDC,2 ;DCT ADDRESS LDA 3,DCDCL,3 ;DCT LINK MOV 0,2  ;UFT ADDRESS TO INDEX STA 1,UFTBC,2 ;SLEAR COUNTS STA 1,UFTBK,2 STA 1,UFTAT,2 STA 3,UFTDL,2 ;INTO UFT RTRN ; ; DELETE FILE DIRECTORY ENTRY. ; ; AC0: NAME ADDRESS ; AC2: DCB ADDRESS OF SYS.DR ; JSR DELFIL ; -ERROR (CODE IN AC2) ; -NORMAL RETURN ; DELFIL: STA@ 3,CSP ;SAVE RETURN SAVE  ;SAVE REGISTERS LDA 1,SFLK,2 COM# 1,1,SZR JMP NOMT2 MOV 0,3 LDA 1,UFTEX,3 LDA 3,CSP MOV# 1,1,SNR JMP ILDEV LDA@ 2,.DDCB STA 2,OAC2,3 NOMT2: JSR SRUFD ;SEARCH FOR NAME JMP FNFER ;NOT THERE - TAKE ERROR RETURN STA 2,SBAD,3 ;SAVE BUFFER ADDRESS MOV 1,2  ;ENTRY ADDRESS LDA 0,UFTAT,2 ;ATTRIBUTES LDA 1,PERM AND 0,1,SZR JMP PRER ;ERROR LDA 0,UFTAD,2 ;FIRST DEVICE ADDRESS STA 1,UFTFN,2 ;CLEAR NAME TO VACATE ENTRY STA 1,EXSW,3 ;SHRINK DIRECTORY SW. LDA 2,SBAD,3 ;BUFFER ADDRESS DSZ 0,2  ;DECREMENT ENTRY COUNT ISZ EXSW,3 ;DONT SHRINK JSR@ SETM ;BUFFER IS MODIFIED STA 1,BQTLA,2 ;USE ME FIRST LDA 1,OAC2,3 ;SYS.DR DCB ADDRESS LDA 2,.XDCB JSR@ .FIDCB JSR DELBK ;DELETE ALL FILE SPACE DSZ EXSW,3 ;SHRINK ? JMP .+2 JMP CRET ;NO - RETURN LDA 2,OAC2,3 ;DCB ADDRESS LDA 0,DCBCB,2 LDA 1,SFBK,2 SUB# 0,1,SZR ;WAS IT LAST BLOCK ? JMP CRET  ;NO LDA 0,DCBNA,2 MOV# 0,0,SZR JSR@ .DEBK ;GET RID OF NEXT JSR@ .RDCBK MOV 1,3 DLP2: SUB 0,0 STA 0,BQTLA,3 ;RELEASE STA 0,BQDCT,3 ;GONE FOR GOOD DSZ SFBK,2 ;YES - CHOP OFF A BLOCK JMP .+1 LDA 0,DCBCA,2 JSR@ .DEBK ;DEPOSIT A BLOCK STA 0,TMP+2,3 ;SAVE ADDRESS FOR LATER JSR@ .RDLB ;READ LAST BLOCK SUB 0,0 STA 0,DCBNA,2 ;DESTROY LINK LDA 0,TMP+2,3 ;LINK WORD MOV 1,3 LDA 1,0,3 ;ENTRY COUNT MOV# 1,1,SNR JMP DLP2 MOV 3,2  ;SAVE BUFFER ADDRESS JSR@ SETM ;MODIFY BUFFER LDA 1,NXLK ADD 1,2 LDA 1,0,2 ;LINK WORD JSR@ .XOR ;BUILD BACKWARD LINK STA 1,0,2 ;NEW LINK WORD LDA 2,OAC2,3 ;DCB ADDRESS LDA 0,SYSNM ;SYS.DR JSR SRUFD JMP . STA 2,SBAD,3 ;SAVE VUFFER ADDRESS LDA 2,OAC2,3 ;DCB ADDRESS LDA 0,SFBK,2 ;NEW BLOCK COUNT MOV 1,2 STA 0,UFTBK,2 JMP@ .+1 MDRET .XOR: XOR .RDCBK: RDCBK .DEBK: DEBLK FNL: SCFNL .RDLB: RDLBK ; ENTRY TO DELETE SPACE ; ; AC2: DCB ADDRESS OF FILE ; JSR DELBK/DESBK ; DELBK: STA@ 3,CSP SAVE DLP: LDA 0,DCBNA,2 MOV# 0,0,SNR JMP CDON JSR@ .RDNB MOV 1,3 SUB 0,0 STA 0,BQTLA,3 STA 0,BQDCT,3 ;REMOVE BLOCK FROM BUFFER STA 0,BQST,3 ; CLEAR STATUS LDA 0,DCBCA,2 JSR@ .DEBK JMP DLP DESBK: STA@ 3,CSP SAVE SUB 0,0  ;START WITH BLOCK 0 JSR@ .RDB1 LDA 2,LKOF ;OFFSET TO LINK WORD ADD 0,2  ;ADDRESS OF LINK SUB 1,1 STA 1,0,2 ;CLEAR FOREWAROD LINK MOV 0,2 JSR@ SETM1 ;SET BUFFER MODIFIED LDA 2,OAC2,3 ;DCB ADDRESS AGAIN JMP DLP .RDB1: RDBNO .IDCB: IDCB LKOF: BQNXL .RDN1: RDNBK SETM1: SETMOD ; ; ROUTINE TO SEARCH SYS.DR FOR A MATCH ON FILE NAME. ; ; IN  OUT(FOUND) OUT(FAIL) ; AC0: NAME ADDR "  BLK# LOW VACENT ; AC1: X  BLK ENT ADR X ; AC2: DCB ADDR  BUFFER ADDRESS X ; ; JSR SRUFD ; -FAIL RETURN ; -FOUND RETURN ; NMAD=OAC0 ;NAME ADDRESS DCBAD=OAC2 ;DCB ADDRESS(SYSTEM FILE BLOCK) MNVBK=TMP ;MIN VAC BLOCK NUMBER ECNT=TMP+1 ;ENTRY COUNT IN BLOCK BFAD=TMP+2 ;BUFFER ADDRESS SRUFD: STA@ 3,CSP ;SAVE RETURNS SAVE  ;SAVE REGISTERS ADC 1,1  ;-1 STA 1,MNVBK,3 ;SET TO -1 LDA 0,DCBFA,2 ;FIRST ADDRESS JSR@ .IDCB SRLOOP: JSR@ .RDN1 ;READ NEXT BLOCK STA 1,BFAD,3 ;SAVE BUFFER ADDRESS LDA@ 0,BFAD,3 ;BLOCK ENTRY COUNT LDA 1,MUFEC ;MAX ENTRY COUNT ADCZ# 0,1,SNC ;FULL ? JMP BFULL ;YES LDA 1,DCBCB,2 ;CURRENT BLOCK HAS VACENCIES LDA 0,MNVBK,3 ;IS THERE A LOWEST ? COM# 0,0,SNR STA 1,MNVBK,3 ;NOW THERE IS. BFULL: LDA 2,BFAD,3 ;BUFFER ADDRESS LDA 0,0,2 ;ENTRY COUNT AGAIN MOV# 0,0,SNR ;EMPTY ? JMP NEXTB ;YES - GET NEXT BLOCK STA 0,ECNT,3 ;STORE ENTRY COUNT LDA 0,NMAD,3 ;NAME ADDRESS INC 2,1  ;POINTS TO FIRST ENTRY SRLP: MOV 1,2  ;ENTRY ADDRESS LDA 2,0,2 ;IS IT VACANT MOV# 2,2,SNR JMP NEXTN ;YES - TRY NEXT ENTRY LDA 2,FNL ;COMPARE LENGTH JSR@ .CMP1 JMP ENTF ;ENTRY FOUND DSZ ECNT,3 ;DONE WITH BLOCK ? JMP NEXTN ;NO - LOOP BACK NEXTB: LDA 2,BFAD,3 ;BUFFER ADDRESS SUB 0,0 STA 0,BQTLA,2 ;UES ME FIRST LDA 2,BQDCB,2 ;DCB ADDRESS LDA 0,DCBCB,2 ;CURRENT BLOCK NUMBER LDA 1,SFBK,2 ;BLOCK NUMBER OF LAST BLOCK SUB# 0,1,SZR ;EOF ? JMP SRLOOP ;NO - GO FOR NEXT BLOCK LDA 0,MNVBK,3 COM# 0,0,SNR INC 1,0 STA 0,OAC0,3 ;RETURN LOWEST VACENT BLOCK RTRN NEXTN: LDA 2,ENTL1 ;UFD ENTRY LENGTH ADD 2,1  ;POINT TO NEXT ENTRY JMP SRLP ;SEARCH NEXT ENTRY ENTF: STA 1,OAC1,3 ;RETURN ENTRY ADDRESS THAT MATCHES LDA 1,BFAD,3 ;BUFFER ADDRESS STA 1,OAC2,3 ;RETURN TO CALLER ISZ ORTN,3 ;SUCCESS RETURN RTRN MUFEC: SCWPB-1/UFDEL ENTL1: UFDEL .CMP1: CMPWD .END *U*U*U*U03