; CL1FIL - CLONE FILES ROUTINES ; LAST EDIT: 19-NOV-81 .NLIST .LIST TTM .NLIST BEX .TITLE CL1FIL .LIST ; ; THIS MODULE AND THE OVERLAY FILOVL ACCESS RSX FILES. ; THE FOLLOWING ENTRY POINTS ARE CONTAINED IN CL1FIL: ; OPEN - TO OPEN A FILE SPECIFIED BY A CONTROL ; DESCRIPTOR ; NEXT - TO UPDATE POINTERS TO THE NEXT RECORD IN A FILE ; POINT- TO UPDATE POINTERS TO A SPECIFIED RECORD ; IN A FILE ; CLOSE- TO RELEASE A FILE DESCRIPTOR ; GETLUN- TO ALLOCATE A LUN AS IN USE ; ENDLUN- TO FREE A LUN AFTER USE ; ; MOST ROUTINES TAKE A CONTROL DESCRIPTOR AS AN ARGUMENT ; RELEVANT 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 CL1FIL ; ; THIS PARAMETER DETERMINES THE NUMBER OF SIMULTAINIOUSLY ; OPEN FILES. INCREASING IT WILL IMPROVE THROUGHPUT MAXFIL=3 ; ; THIS PARAMETER DEFINES THE NUMBER OF LUNS AVAILABLE ; IT SHOULD BE AT LEAST MAXFIL+NT+1 WHERE NT IS THE NUMBER ; OF TERMINALS IN THE SYSTEM. MAXLUN=MAXFIL+4+1 ; ; THIS PARAMETER DEFINES THE MAXIMUM NUMBER OF ; SYSTEM MACRO FILES. MAXMAC=100. ; ; ; ; THESE PARAMETERS DETERMINE THE DEVICE AND UNIT ON WHICH CLONE ; LOOKS FOR SYSTEM LIBRARY MACROS. CL1DN=="ML CL1DU==0 ; ; ; ; .MCALL FDOF$L,FDBDF$,OFID$R,GET$,NMBLK$,FCSBT$ .MCALL CLOSE$,FDAT$A,FDRC$A,FDOP$A,FDBF$A,FSRSZ$ .MCALL ALUN$S FDOF$L FCSBT$ ; ; DEFINE FCS ROUTINES .GLOBL .MARK,.POINT ; ; DEFINE SOME CONSTANTS EOF=-1 ;END OF FILE CHAR. EOL=0 ;END OF LINE CHAR. RECL=80.;MAX RECORD LENGTH IN BYTES ; ; ; ; ; ; ; ; ; ; OPEN - OPEN A FILE REFERANCED BY A DESCRIPTOR ; INPUT: R2=ADDRESS OF DESCRIPTOR ; OUTPUT: C CLEAR ; FILE IS OPENED, FDB POINTER IS SET ; IN DESCRIPTOR. ; C SET ; FILE OPEN FAIL ; ; REGISTERS MODIFIED: NONE ; OPEN:: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) CLC ;INIT RETURN STATUS TST CD.FDB(R2) ;IS FILE ALREADY OPEN ? BNE FILEX ;RETURN IF SO CALL GETFDB ;RETURN A FREE FDB TO R0 MOV R0,R1 ;OFFSET TO FNB ADD #F.FNB,R1 MOV #CL1DN,N.DVNM(R1);ASSUME DEFAULT DEVICE NAME MOV #CL1DU,N.UNIT(R1);AND DEFAULT UNIT TST CD.DEV(R2) ;DO WE HAVE AN EXPLICIT DEVICE ? BEQ 1$ ;SKIP IF NOT MOV CD.DEV(R2),N.DVNM(R1) MOV CD.DEV+2(R2),N.UNIT(R1) 1$: CALL .ASLUN ;ASSIGN LUN BCS OPNERR ;SKIP ON ERROR MOV R0,R1 ;POINT TO ID AREA OF FNB ADD #F.FNB+N.FID,R1 MOV CD.FID(R2),(R1)+;STORE ID FIELD MOV CD.FID+2(R2),(R1)+ MOV CD.FID+4(R2),(R1)+ OFID$R ;OPEN THE FILE BCS OPNERR ; NOW SET POINTER TO CURRENT POSITION IN FILE CLR R1 ;ZERO HIGH ORDER BLOCK POINTER MOV CD.PNT+2(R2),R3 ;SET BYTE OFFSET MOV CD.PNT(R2),R2 ;SET LOW ORDER BLOCK POINTER CALL .POINT ;POINT FILE TO SAVED POSITION FILEX: MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; OPNERR: MOVB F.ERR(R0),R0 ERROR$ R0,FATAL SEC BR FILEX ; ; ; NEXT - READ NEXT RECORD FROM FILE ; INPUT: R2=CONTROL DESCRIPTOR ; OUTPUT: BUFFER IS LOADED AND TERMINATED BY ZERO ; FIRST BYTE IS -1 FOR END OF FILE. ; IF NO FILE IS OPEN FOR DESCRIPTOR POINT IS CALLED ; TO OPEN THE FILE AND UPDATE POINTERS ; NEXT:: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) NEXT1: CALL OPEN ;OPEN FILE IF NESESCARY BCS ERR1 MOV @CD.FDB(R2),R0 ;GET ADDRESS OF FDB CALL .MARK ;GET THIS RECORD POSITION MOV 2(SP),R1 ;GET BACK COMMAND DESCRIPTOR MOV R2,CD.PNT(R1) ;SAVE RECORD POINTER MOV R3,CD.PNT+2(R1) GET$ ;READ RECORD TO BUFFER BCC 2$ CMPB F.ERR(R0),#IE.EOF;HIT END OF FILE ? BEQ ERR1 ;IF SO RETURN FLAG BR ERR ;ELSE FATAL ERROR 2$: MOV F.NRBD(R0),R2 ;GET BUFFER LENGTH MOV F.NRBD+2(R0),R1 ;AND BUFFER ADDRESS ADD R1,R2 ;GET END OF BUFFER MOVB #EOL,(R2) ;FLAG END OF LINE NEX: MOV 2(SP),R2 ;GET BACK CONTROL DESCRIPTOR MOV R1,CD.CMA(R2) ;RETURN BUFFER ADDRESS BR FILEX ; ERR: MOV 2(SP),R2 ;POINT TO CONTROL DESCRIPTOR CLR CD.CMA(R2) ;SO WE CANNOT PRINT IT MOVB F.ERR(R0),R0 ERROR$ R0 ERROR$ #E.FILE,FATAL ;ISSUE I/O ERROR MESSAGE ERR1: MOV #EOFCH,R1 ;RETURN EOF BR NEX ; EOFCH: .BYTE EOF,0 ; ; ; ; POINT - RESET POINTER TO A SPECIFIED RECORD ; INPUT: R2=CONTROL DESCRIPTOR ; OUTPUT: CD.CMA(R2) IS UPDATED ; POINT:: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) TST CD.FDB(R2) ;IS FILE OPEN ? BEQ NEXT1 ;OPEN IT IF SO MOV @CD.FDB(R2),R0 ;GET ADDRESS OF FDB CLR R1 ;ZERO HIGH ORDER ADDRESS MOV CD.PNT+2(R2),R3 ;GET BYTE OFFSET MOV CD.PNT(R2),R2 ;GET LOW ORDER BLOCK OFFSET CALL .POINT BCS ERR MOV 2(SP),R2 ;RESTORE CONTROL DESCRIPTOR BR NEXT1 ;GO READ THE LINE ; ; ; CLOSE - CLOSE FILE OPEN ON DESCRIPTOR ; INPUT: R2=CONTROL DESCRIPTOR ; CLOSE:: MOV R0,-(SP) MOV CD.FDB(R2),R0 ;GET FDBTAB TABLE ENTRY BEQ 1$ ;NO FILE ATTACHED CLR CD.FDB(R2) ;CLEAR POINTER IN DESCRIPTOR CLR 2(R0) ;AND MARK TABLE ENTRY FREE MOV (R0),R0 ;GET THE FDB CLOSE$ BCC 1$ MOVB F.ERR(R0),R0 ERROR$ R0,FATAL 1$: MOV (SP)+,R0 RETURN ; ; ; ; ; ; ; GETFDB - ALLOCATE AN FDB ; INPUT: R2=CONTROL DESCRIPTOR ; OUTPUT: R0=FDB ADDRESS ; IF NESESCARY A FILE IS CLOSE TO FREE AN FDB ; GETFDB::MOV #FDBTAB,R0 ;GET TABLE POINTER 1$: TST 2(R0) ;FREE ENTRY BEQ 2$ ;OK WEVE GOT SOMETHING ADD #4,R0 ;ELSE TRY NEXT ENTRY TST (R0) ;END OF TABLE BNE 1$ ;IF NOT KEEP SEARCHING ;HERE WE HAVE TO FREE UP AN FDB MOV R2,-(SP) ;SAVE THE CONTROL DESCRIPTOR MOV FDBTP,R0 ;GET TABLE POINTER MOV 2(R0),R2 ;GET DESCRIPTOR CALL CLOSE ;AND CLOSE THE FILE MOV (SP)+,R2 ADD #4,FDBTP ;ROTATE POINTER TST @FDBTP ;END OF TABLE ? BNE 1$ ;GO TRY AGAIN IF NOT MOV #FDBTAB,FDBTP ;ELSE RESET POINTER BR 1$ ;AND ROUND AGAIN 2$: MOV R2,2(R0) ;CLAIM POINTER MOV R0,CD.FDB(R2) ;AND SET IN DESCRIPTOR MOV (R0),R0 ;GET FDB ADDRESS RETURN ; FDBTP: .WORD FDBTAB ; ; ; GETLUN - ALLOCATE A FREE LUN ; OUTPUT: R2=LOGICAL UNIT NUMBER ; R2=0 IF NO LUNS AVAILABLE ; GETLUN::MOV #LUNTAB,R2 1$: TSTB (R2)+ BNE 1$ SUB #LUNTAB,R2 ;FORM LUN NUMBER CMP R2,#MAXLUN ;TOO BIG ? BGT 2$ ;SKIP IF SO INCB LUNTAB-1(R2) ;FLAG LUN IN USE CLC RETURN 2$: CLR R2 ;NO LUN AVAILABLE SEC RETURN ; ; ENDLUN - DE-ALLOCATE A LUN ; INPUT: R2=LUN ; ENDLUN::TST R2 ;ANYTHING TO DO BEQ 1$ CLRB LUNTAB-1(R2) ;FLAG LUN FREE ALUN$S R2,#"SY,#0 ;ASSIGN LUN AWAY FROM TERMINAL 1$: RETURN ; ; LUNTAB: .BYTE 1 ;LUN 1 IS USED INTERNALY .REPT MAXLUN .BYTE 0 .ENDR .BYTE .EVEN ; ; ; ; THIS IS THE MACRO SYMBOL TABLE LISTHEAD AND ID TABLE MACTAB:: .WORD 0,0,0 ;MACRO SYMBOL TABLE LISTHEAD IDTAB:: .BLKW 4*MAXMAC ;3 WORDS OF ID AND THE VERSION IDTABE==. ; ; ; NOW ALLOCATE THE FDBS AND RECORD BUFFERS .PSECT CL1FDB ; FDBTAB::.BLKW 2*MAXFIL .WORD 0 ; RECBUF: .BLKB RECL*MAXFIL .EVEN BUFP=RECBUF TABP=FDBTAB ; ; ALLOCATE THE FDBS ; .REPT MAXFIL SAVE=. .=TABP .WORD SAVE ;SET FDB POINTER .WORD 0 ;SET DESCRIPTOR POINTER TABP=. .=SAVE ;BACK TO FDB ALLOCATION FDBDF$ ;ALLOCATE THE FDB FDAT$A R.VAR,FD.CR ;SET ATRIBUTES FDRC$A ,BUFP,RECL ;SET RECORD AREA (MOVE MODE) BUFP=BUFP+RECL ;UPDATE RECORD BUFFER ALLOCATION FDOP$A ,,,FO.RD ;FILE OPEN SECTION FDBF$A ;AND BUFFER SECTION .ENDR ; ; NOW ALLOCATE $$FSR1 BUFFER SPACE ; FSRSZ$ MAXFIL ; ; .END ; ;