.LIST TTM .TITLE GETFIL .NLIST SYM .ENABL LC ; .MCALL .PRINT,.EXIT,.PURGE,.CSISPC,.DSTATU .MCALL .LOOKUP,.READW,.LOCK,.UNLOCK .GLOBL IGETC,IFREEC,IFETCH ; .MACRO .ERROR,MSG ;ERROR MACRO .PRINT MSG ;PRINT MESSAGE .EXIT ;ABORT .ENDM ; GETFIL::MOV (R5)+,R0 ;GET MOVB R0,R0 ; #ARGS MOV (R5)+,NAMER ;STORE NAMER ADDRESS MOV (R5)+,(PC)+ ;STORE ADDRESS NAMEA: .WORD 0 ; OF NAMEA MOV @(R5)+,DEFEXT ;STORE INPUT EXTENSION MOV (R5)+,(PC)+ ;STORE ADDRESS IRET: .WORD 0 ; OF IRET SUB #4,R0 ;INTERESTED IN ARG #5 JSR R4,GETADR ;CALL ADDRESS ROUTINE IOPT: .WORD 0 ; SPACE FOR IOPT ADDRESS JSR R4,GETADR ;CALL ADDRESS ROUTINE DATE: .WORD 0 ; SPACE FOR DATE ADDRESS ; GO: MOV SP,SPSAVE ;SAVE STACK POINTER JSR PC,IGETC ;REQUEST A CHANNEL MOV R0,ICHAN ;STORE CHANNEL BGE 1$ ;CHANNEL OK .ERROR #MSG1 ;IGETC FAILED 1$: MOV #-4,@IRET ;SET IRET TO -4 .CSISPC #OSPEC,#DEFEXT,NAMEA ;CALL CSI BCC 11$ ;NO ERRORS JMP GEXIT ;INVALID COMMAND LINE 11$: MOV NAMER,R0 ;GET NAMER ADDRESS MOV #ISPEC,R1 ;GET ISPEC ADDRESS 2$: MOV (R1)+,(R0)+ ;COPY CMP R1,#ISPECE ;FINISHED ? BNE 2$ ;NOT YET TST ISPEC ;NULL RESPONSE ? BEQ GEXIT ;YES - REJECT IT INC @IRET ;SET IRET TO -3 MOV #ARG2,R5 ;POINT TO ARG2 JSR PC,IFETCH ;CALL IFETCH(NAMER) CMP R0,#2 ;FETCH ERROR ? BNE 3$ ;NO .ERROR #MSG2 ;SAY FETCH ERROR 3$: TST R0 ;NORMAL FETCH ? BNE GEXIT ;NO - ALL DONE TST IOPT ;IOPT SPECIFIED ? BEQ 4$ ;NO CLR @IOPT ;CLEAR IT TST (SP)+ ;OPTIONS SPECIFIED ? BEQ 4$ ;NO CMPB (SP)+,#'Y ;WAS IT '/Y' BNE 4$ ;NOPE INC @IOPT ;OPTION SPECIFIED 4$: .DSTATU #ISPECE,NAMER ;GET DSTATUS BIT #100000,ISPECE ;RANDOM ACCESS DEVICE ? BEQ 5$ ;NO MOV ISPEC,NAMNFS ;COPY DEVICE NAME .LOOKUP #AREA,ICHAN,#NAMNFS ;NFS LOOKUP MOV #-5,@IRET ;SET IRET TO -5 .READW #AREA,ICHAN,#OSPEC,#1,#0 ;READ BLOCK ZERO BCS GEXIT ;COULDN'T .PURGE ICHAN ;CALL PURGE(ICHAN) 5$: .LOCK ;LOCK THE USR .LOOKUP #AREA,ICHAN,NAMER ;ORDINARY LOOKUP BCC 7$ ;FILE FOUND TSTB @#52 ;ZERO ERROR ? BNE 6$ ;NO - THAT'S GOOD .ERROR #MSG3 ;LOOKUP FAILED 6$: MOV #-1,@IRET ;SET IRET TO -1 BR GEXIT ;THAT'S IT 7$: MOV R0,@IRET ;STORE #BLOCKS WE HOPE BLE 10$ ;WE DIDN'T JSR PC,FDATE ;GET THE FILE DATE BR GEXIT ;ALL DONE 10$: CLR @IRET ;SET IRET TO ZERO TST ISPECE+6 ;TEST DEVICE SIZE BEQ GEXIT ;NFS TO SQUENTIAL DEVICE OK MOV #-2,@IRET ;SET IRET TO -2 TST ISPEC+2 ;NULL FILENAME ? BNE GEXIT ;NO MOV #-4,@IRET ;REJECT NFS LOOKUP GEXIT: .UNLOCK ;UNLOCK THE USR .PURGE ICHAN ;CALL PURGE(ICHAN) MOV #ARG1,R5 ;POINT TO ARG1 JSR PC,IFREEC ;CALL IFREEC(ICHAN) MOV SPSAVE,SP ;RESTORE STACK POINTER RTS PC ;RETURN ; ARG1: .WORD 1 ;#ARGS .WORD ICHAN ;CHANNEL ADDRESS ARG2: .WORD 1 ;#ARGS NAMER: .WORD 0 ;NAMER ADDRESS ; DEFEXT: .WORD 0,0,0,0 ;DEFAULT EXTENSIONS NAMNFS: .WORD 0,0,0,0 ;NON FILE STRUCTURED NAME ; .NLIST BEX MSG1: .ASCIZ /DSLIB-F-IGETC failed in GETFIL/ MSG2: .ASCIZ /DSLIB-F-FETCH failed in GETFIL/ MSG3: .ASCIZ /DSLIB-F-LOOKUP failed in GETFIL/ ; ; SUBROUTINE TO FIND THE DATE ASSOCIATED WITH A PARTICULAR ; FILE USING THE USR BUFFER ; FDATE: TST DATE ;DATE OPTION SPECIFIED ? BEQ 4$ ;NO MOV @#46,R1 ;ALT USR LOAD ADDRESS ? BNE 11$ ;ONE WAS SPECIFIED MOV @#54,R0 ;RMON BASE MOV 266(R0),R1 ;USR BUFFER ADDRESS 11$: MOV R1,R2 ;COPY IT ADD #2000,R2 ;END ADDRESS MOV #16,R3 ;#BYTES PER ENTRY ADD 6(R1),R3 ;#EXTRA BYTES PER ENTRY ADD #12,R1 ;POINT TO FIRST ENTRY 1$: MOV NAMER,R4 ;ADDRESS OF FILE NAME TST (R4)+ ;SKIP DEVICE MOV R1,R5 ;COPY R1 MOV (R5)+,R0 ;STATUS WORD CMP #4000,R0 ;END OF SEGMENT ? BEQ 4$ ;YES BIT #2000,R0 ;PERMANENT FILE ? BEQ 3$ ;NO MOV #3,R0 ;#WORDS TO CHECK 2$: CMP (R5)+,(R4)+ ;COMPARE FIRST WORD BNE 3$ ;NOT EQUAL DEC R0 ;ALL CHECKED ? BNE 2$ ;NOT YET MOV 4(R5),@DATE ;STORE DATE WORD BR 4$ ;DONE 3$: ADD R3,R1 ;POINT TO NEXT ENTRY CMP R1,R2 ;AT THE END ? BLO 1$ ;NOT YET 4$: RTS PC ; ; SUBROUTINE TO GET AN ARGUMENT ADDRESS FROM A FORTRAN ; PARAMETER LIST ; ; CALL IS OF THE FORM: ; JSR R4,GETADR ; ADDR: .WORD 0 ;SPACE FOR ADDRESS ; ; R0 SHOULD CONTAIN THE NUMBER OF ARGUMENTS ORIGINALLY SUPPLIED TO THE ; SUBROUTINE IN (R5). IF THE ARGUMENT WAS SUPPLIED IN THE FORTRAN CALL ; THE SUBROUTINE PUTS IT'S ADDRESS IN ADDR. OTHERWISE THE WORD REMAINS ; NULL. ; GETADR: DEC R0 ;ARG PRESENT ? BGE 2$ ;YES 1$: CLR (R4)+ ;ADDRESS IS ZERO RTS R4 ;THAT'S IT; 2$: MOV (R5)+,R1 ;GET ADDRESS CMP #-1,R1 ;OMITTED ? BEQ 1$ ;YES MOV R1,(R4)+ ;STORE ADDRESS RTS R4 ;RETURN ; .EVEN .LIST BEX ; .PSECT DSBUFF,RW,D,GBL,REL,OVR ; ICHAN: .WORD 0 ;I/O CHANNEL OSPEC: .BLKW 3.*5. ;OUTPUT FILE SPECS ISPEC: .BLKW 4. ;INPUT FILE SPEC ISPECE: .BLKW 4.*4. ;OTHER INPUT FILES AREA: .BLKW 5. ;5 WORD EMT AREA SPSAVE: .WORD 0 ;SP SAVE WORD ; .END