; FILOVL - CLONE OVERLAY FOR FILES PROCESSING ; LAST EDIT: 29-SEP-81 .NLIST .LIST TTM .NLIST BEX .TITLE FILOVL .LIST ; ; THIS MODULE CONTAINS ROUTINES USED FOR FILES SYSTEM INITIALIZATION ; AND INITIAL FILE OPEN OPERATIONS. ONCE A MACRO FILE HAS BEEN ; OPENED SUBSEQUENT OPENS ARE PERFORMED BY ID IN THE MODULE CL1FIL. ; ; THE FOLLOWING ENTRY POINTS ARE CONTAINED IN THIS OVERLAY: ; INIFIL-TO INITIALISE THE FILES SYSTEM ; FIND - TO CREATE THE CLONE MACRO DIRECTORY ; PRSFIL -TO LOOKUP AN EXPLICIT USER FILE SPECIFICATION ; ; RELEVANT CONTROL DESCRIPTOR FIELDS ARE: ; CD.FDB - POINTER TO FDB ALLOCATION TABLE NTRY ; CD.DEV - ASCII DEVICE NAME (0=DEFAULT ESTABLISHED HERE) ; CD.DEV+2- BINARY DEVICE UNIT NUMBER ; CD.FID+0- FILE ID INFORMATION ; +2 ; +4 ; CD.PNT+0- BLOCK OFFSET TO RECORD ; +2- BYTE OFFSET IN BLOCK TO RECORD. ; ; .PSECT FILOVL ; ; ; ; ; ; .MCALL FDOF$L,FINIT$,FCSBT$,NMBLK$ FDOF$L FCSBT$ ; ; DEFINE FCS ROUTINES .GLOBL .PARSE,.FIND ; ; ; ; INIFIL - INITIALISE EVERYTHING ; INIFIL::MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) FINIT$ ;INIT FCS MOV #FDBTAB,R1 ;POINT TO ALLOCATION TABLE 1$: MOV (R1),R0 ;GET THE FDB CALL GETLUN ;ALLOCATE A LUN TO R2 MOVB R2,F.LUN(R0) ;SAVE IN FDB MOVB R2,F.EFN(R0) ;USE AS EVENTFLAG ADD #4,R1 ;NEXT TABLE ENTRY TST (R1) ;END OF TABLE ? BNE 1$ MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; ; ; ; ; ; FIND - CREATE A SYSTEM MACRO TABLE ; OUTPUT: R2=ADDRESS OF TABLE ; ; THE VALUE ASSOCIATED WITH EACH TABLE ENTRY IS ; THE ADDRESS OF A FOUR WORD BLOCK CONTAINING ; THREE WORDS OF THE FILE ID. AND THE VERSION # ; FIND:: MOV R0,-(SP) MOV R1,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) 20$: MOV MACTAB,R0 ;CLEAR THE OLD MACRO TABLE BEQ 21$ CMP R0,#MACTAB ;END OF LIST ? BEQ 21$ MOV 4(R0),MACTAB ;GET SUCCESSOR CALL FREESP ;DE-ALLOCATE TABLE SEGMENT BR 20$ ; 21$: CLR MACTAB ;CLEAR TABLE POINTER CLR MACTAB+2 CLR MACTAB+4 MOV #TMPCTL,R2 ;GET DUMMY CONTROL DESCRIPTOR CALL GETFDB ;ALLOCATE AN FDB MOV R0,R1 ;OFFSET TO FNB ADD #F.FNB,R1 MOV #DSPT1,R2 MOV #DFNB1,R3 MOV #CL1DN,N.DVNM(R3) ;SET DEVICE NAME MOV #CL1DU,N.UNIT(R3) ;AND SET UNIT CALL .PARSE BCS 10$ ; NOW FIND ALL THE MACRO FILES MOV #IDTAB,R5 ;POINT TO ID TABLE ; 1$: CALL .FIND BCS 10$ ;END OF TABLE MOV R0,-(SP) ;SAVE FDB AND FNB MOV R1,-(SP) MOV N.FVER(R1),VER ;SAVE VERSION NUMBER MOV #NAMBUF,R0 ;BUFFER FOR ASCII NAME MOV R1,R3 ;POINT TO NAME FIELD ADD #N.FNAM,R3 MOV (R3)+,R1 ;FIRST RAD50 WORD CALL $C5TA ;CONVERT IT MOV (R3)+,R1 ;SECOND CALL $C5TA MOV (R3)+,R1 ;THIRD CALL $C5TA 2$: CMPB -(R0),#' ;STRIP TRAILING SPACES BEQ 2$ INC R0 ;WE WENT ONE TOO FAR MOV R0,R1 ;SAVE END OF STRING MOV #NAMBUF,R0 ;AND GET BACK START SUB R0,R1 ;AND COMPUTE LENGTH ; NOW SEE IF NAME IS ALREADY DEFINED MOV MACTAB+4,R2 ;TABLE POINTER CALL LOOKUP BCC 3$ ;SKIP IF WE FIND IT MOV #MACTAB,R2 ;ELSE ALLOCATE A NEW ENTRY CALL ENTER MOV R5,(R2) ;STORE ID TABLE POINTER MOV R5,R2 ;ADDRESS TO LOAD ID ADD #10,R5 ;AND CLAIM ID TABLE SPACE BR 4$ ;AND COPY VALUES 3$: MOV (R2),R2 ;GET ID POINTER CMP 6(R2),VER ;GREATER THAN CURRENT VERSION ? BHI 5$ ;IF SO DO NOTHING 4$: MOV (SP)+,R1 MOV (SP)+,R0 MOV R1,R3 ;POINT TO ID ADD #N.FID,R3 MOV (R3)+,(R2)+ ;AND SAVE NEW ID MOV (R3)+,(R2)+ MOV (R3)+,(R2)+ MOV N.FVER(R1),(R2)+;AND VERSION BR 6$ 5$: MOV (SP)+,R1 MOV (SP)+,R0 6$: CMP R5,#IDTABE ;END OF ID TABLE ? BLO 1$ MOV #FULEM,R2 CALL OUT BR 11$ ; 10$: CMPB F.ERR(R0),#IE.NSF;END OF DIRECTORY ? BEQ 11$ MOVB F.ERR(R0),R0 MOV #FNDEM,R2 CALL OUT 11$: MOV TMPCTL+CD.FDB,R0;GET FDBTAB ENTRY CLR 2(R0) ;CLEAR IN USE FLAG MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV MACTAB+4,R2 ;RETURN TABLE ADDRESS MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; ; ; ; ; PRSFIL - PARSE A FULL FILE SPECIFICATION ; INPUT: R0=NAME STRING ADDRESS ; R1=NAME STRING LENGTH ; OUTPUT: C CLEAR: FILE HAS BEEN FOUND ; R2= CONTROL DESCRIPTOR INITIALIZED ; WITH DEVICE AND ID INFORMATION. ; CF.LIT IS CLEAR IF EXTENSION IS .CL1 ; ELSE SET. ; C SET: ERROR LOOKING UP FILE ; R0=0 NOT FOUND ; R0<0 SPECIFICATION ERROR ; R2=0 ; ; ; REGISTERS MODIFIED: R0,R2 ; ; IF NO EXPLICIT FILE EXTENTION IS GIVEN THE FILE IS FIRST ; LOOKED UP AS .EXT1 AND IF NOT FOUND AS .EXT2 EXT1=^RCL1 EXT2=^RCMD ; PRSFIL::MOV R1,-(SP) MOV R3,-(SP) MOV R4,-(SP) CLR DSPT ;ASSUME NO DEVICE CLR DSPT+4 ;OR DIRECTORY MOV R0,-(SP) ;SAVE START OF STRING ADD R0,R1 ;POINT TO END OF STRING 1$: CMP R0,R1 ;SEARCH FOR DEVICE NAME BHIS 2$ CMPB (R0)+,#': BNE 1$ MOV (SP),DSPT+2 ;SAVE DEVICE NAME POINTER MOV R0,DSPT ;END ADDRESS SUB (SP),DSPT ;COMPUTE LENGTH MOV R0,(SP) ;UPDATE START ADDRESS 2$: MOV (SP)+,R0 ;GET BACK POINTER CMPB (R0),#'[ ;DIRECTORY SPECIFICATION ? BNE 5$ MOV R0,DSPT+6 ;SET START ADDRESS 3$: CMP R0,R1 ;CHECK FOR END OF STRING BHIS 4$ CMPB (R0)+,#'] ;END OF DIRECTORY SPECIFICATION ? BNE 3$ 4$: MOV R0,DSPT+4 ;SET END ADDRESS SUB DSPT+6,DSPT+4 ;COMPUTE LENGTH 5$: MOV R0,DSPT+12 ;SET ADDRESS OF NAME SUB R0,R1 ;GET LENGTH MOV R1,DSPT+10 ;AND STORE ; ; NOW PARSE INFORMATION INTO FNB 10$: MOV PROC,R0 ;GET CURRENT PROCESS MOV PL.UIC(R0),R1 ;GET UIC WORD CALL .WDFUI ;SET AS NEW DEFAULT UIC MOV #TMPCTL,R2 ;DUMMY CONTROL DESCRIPTOR CALL GETFDB MOV R0,R1 ;COPY FDB ADDRESS ADD #F.FNB,R1 ;POINT TO FNB MOV #DSPT,R2 ;SET DSPT MOV #DFNB,R3 ;AND DFNB CALL .PARSE ;PARSE FILE SPECIFICATION BCS ERR BIT #NB.SVR!NB.STP!NB.SNM,N.STAT(R1) ;ANY WILD CARDS ? BEQ 11$ ;IF SO ITS AN ERROR MOVB #IE.BNM,F.ERR(R0) ;RETURN AN ERROR CODE BR ERR 11$: BIT #NB.TYP,N.STAT(R1) ;EXPLICIT FILE TYPE ? BNE 12$ MOV #EXT1,N.FTYP(R1) ;SET DEFAULT FILE TYPE CALL .FIND ;LOOKUP FILE BCC 20$ CMPB F.ERR(R0),#IE.NSF ;CHECK NO SUCH FILE BNE ERR ;IF NOT ERROR MOV #EXT2,N.FTYP(R1) ;TRY AS .CMD 12$: CALL .FIND BCC 20$ CMPB F.ERR(R0),#IE.NSF ;CHECK NO SUCH FILE BNE ERR 13$: CLR R0 ;RETURN FILE NOT FOUND CLR R2 ;NULL CONTROL DESCRIPTOR SEC BR PRSEX ; 20$: CALL NEWCTL ;ALLOCATE A CONTROL DESCRIPTOR BCS 13$ ;RETURN ON ALLOCATION FAIL MOV N.DVNM(R1),CD.DEV(R2) ;RETURN DEVICE NAME MOV N.UNIT(R1),CD.DEV+2(R2) ;AND UNIT NUMBER MOV N.FID(R1),CD.FID(R2) MOV N.FID+2(R1),CD.FID+2(R2) MOV N.FID+4(R1),CD.FID+4(R2) MOV #1,CD.PNT(R2) ;SET POINTER TO FIRST BLOCK OF FILE CLR CD.PNT+2(R2) ;AND POINT TO FIRST BYTE CLC ;SUCCESS STATUS BIC #CF.LIT,CD.FLG(R2) ;ASSUME CLONE MODE CMP N.FTYP(R1),#EXT1 ;BUT IS IT ? BEQ PRSEX ;SKIP IF SO BIS #CF.LIT,CD.FLG(R2) ;ELSE SET LITERAL MODE INPUT PRSEX: MOV R2,-(SP) MOV TMPCTL+CD.FDB,R2 MOV #0,2(R2) ;FREE THE FDB WEVE BEEN USING ;MOV #0 SO WE DONT TOUCH CARRY MOV (SP)+,R2 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R1 RETURN ; ERR: MOVB F.ERR(R0),R0 CLR R2 SEC BR PRSEX ; ; ; TMPCTL: .BLKW 5 ;JUST UP TO CD.FDB VER: .WORD 0 NAMBUF: .BLKB 10. ;BUFFER FOR MACRO FILE NAMES ; DSPT: .WORD 0,0,0,0,0,0 DSPT1: .WORD 0,0 .WORD DIRNL,DIRN .WORD FILNL,FILN ; DFNB: NMBLK$ ,,,SY,0 DFNB1: NMBLK$ ,CL1,,, ; DIRN: .ASCII /[100,100]/ DIRNL=.-DIRN FILN: .ASCII /*.CL1;*/ FILNL=.-FILN ; FNDEM: .ASCII /CLONE -- FAILED TO FIND MACRO LIBRARY ON DEVICE / .WORD CL1DN .BYTE CL1DU+'0,': .BYTE 0 FULEM: .ASCII /CLONE -- SYSTEM MACRO TABLE FULL/ .EVEN ; .END ; ;