; ; THIS PROGRAM IS USED FOR OPENING AND READING A FILE ; THAT WAS NOT CREATED BY FCS. THIS MEANS THAT THE EOF ; INFORMATION MUST BE OBTAINED FROM THE I/O STATISTICS ; BLOCK AND THEN MOVED INTO THE FDB. ; ; ; CALLING SEQUENCE: ; ; CALL OPENI(LUN,UIC,FILENAME,STATUS) ; WHERE LUN IS A LOGICAL UNIT NUMBER ; UIC IS A UNIT ID CODE (MUST BE 9 BYTES LONG) ; FILEID IS A FILE DESCRIPTOR ARRAY ; STATUS IS A STATUS RETURN CODE ; 1 = SUCCESSFUL COMPLETION ; -26 = OPEN FILE ERROR ; ; ; CALL READI(LUN,BUFFER,VBN,NBYTES,STATUS) ; WHERE LUN IS A LOGICAL UNIT NUMBER ; ; BUFFER IS AN INPUT DATA BUFFER ARRAY (256 WORDS) ; VBN IS THE VIRTUAL BLOCK NUMBER TO READ (1 WORD) ; NBYTES IS THE NUMBER OF BYTES ACTUALLY READ ; STATUS IS A STATUS RETURN ; 1 = SUCCESSFUL COMPLETION ; <0 = READ ERROR ; ; ; CALL CLOSEI(LUN) ; WHERE LUN IS THE LOGICAL UNIT NUMBER ; ; .PAGE .MCALL FDBDF$,FDRC$A,FDBK$A,FDOP$A,OPEN$,CLOSE$,READ$,WAIT$ .MCALL FCSBT$ FCSBT$ ; ; OPENI:: MOV #INFILE,R0 ;GET FDB ADDRESS MOVB @2(R5),F.LUN(R0) ;SET UNIT NUMBER JSR PC,FPARSE ;GET FILENAME, ETC. MOV #STBLK,F.STBK(R0) ;SET STATISTICS BLOCK ADDRESS OPEN$ ;OPEN FILE BCS 100$ ;ERROR ; MOV #1,@8.(R5) ;SET SUCCESSFUL COMPLETION TST F.EFBK(R0) ;IS EOF COUNT = 0? BNE 900$ ;NO - FORGET IT TST F.EFBK+2(R0) ;IS REST OF EOF COUNT = 0? BNE 900$ ;NO - FORGET IT ; MOV STBLK+4,F.EFBK(R0) ;SET MOV STBLK+6,F.EFBK+2(R0) ;EOF ADD #1,F.EFBK+2(R0) ;COUNT ADC F.EFBK(R0) ;IN CLR F.FFBY(R0) ;FDB BR 900$ ; 100$: MOV #-26.,@8.(R5) ;SET OPEN FAILURE ; 900$: RTS PC ;RETURN .PAGE ;+ ; FPARSE DOES A PRELIMINARY PARSE ON THE FILE SPECIFIER ; INPUT, AND CREATES A FILENAME BLOCK. ;- FPARSE: MOV #FNBLK,R1 ;GET FILE NAME BLOCK ADDRESS MOV #4,DEVL.F(R1) ;SET DEVICE NAME LENGTH MOV #SY0,DEVA.F(R1) ;SET DEVICE NAME ADDRESS MOV #9.,UICL.F(R1) ;SET UIC RECORD SIZE MOV 4(R5),UICA.F(R1);SET UIC ADDRESS MOV 6(R5),R3 ;GET FILE NAME ADDRESS MOV R3,FNA.F(R1) ;SET FILE NAME ADDRESS 100$: CMPB #0,(R3)+ ;TERMINATE SCANNING WITH A ZERO BNE 100$ DEC R3 MOV R3,FNL.F(R1) ;SET END OF FILENAME SPEC SUB FNA.F(R1),FNL.F(R1);TO COMPUTE LENGTH RTS PC .PAGE .SBTTL VIRTUAL BLOCK READ ROUTINE ; READI:: MOV #INFILE,R0 ;GET FDB ADDRESS MOV @6(R5),F.BKVB+2(R0) ;GET VIRTUAL BLOCK NUMBER (L.O.) CLR F.BKVB(R0) ;CLEAR H.O. WORD OF VBN READ$ R0,4(R5) BCS 100$ ;BRANCH IF READ ERROR ; WAIT$ ; ; 100$: MOVB F.ERR(R0),R0 ;GET COMPLETION STATUS MOV R0,IOSTAT MOV IOSTAT+2,@8.(R5) ;SET NUMBER OF BYTES READ MOV IOSTAT,@10.(R5) ;SET COMPLETION STATUS CODE RTS PC ; ; .SBTTL CLOSE FILE ; CLOSEI:: CLOSE$ #INFILE RTS PC .PAGE .SBTTL DATA SECTION ; INFILE: FDBDF$ ;GENERATE FDB FDRC$A FD.RWM FDBK$A ,512.,,,IOSTAT FDOP$A ,FNBLK,,FO.RD!FA.SHR ; ; ; FNBLK: ZZ = . DEVL.F = . - ZZ .WORD 0 DEVA.F = . - ZZ .WORD 0 UICL.F = . - ZZ .WORD 0 UICA.F = . - ZZ .WORD 0 FNL.F = . - ZZ .WORD 0 FNA.F = . - ZZ .WORD 0 ; SY0: .ASCII /SY0:/ ; IOSTAT: .WORD 0,0 ; STBLK: .BLKW 5 ; .END