.TITLE FXIO - FILE I/O RTN FOR ESFLX ; ; ; AUTHOR: P. GANDHI ; ; ; DATED: AUG 1978 ; ; ; FUNCTION: TO DO DISC I/O FOR ESFLX ; ; ; ENTRY POINTS: FXVFY -- TO CHECK SYNTAX OF COMMAND STRING ; A MUST CALL BEFORE OPEN ; FXOPNI-- TO OPEN INPUT FILE ; FXOPNO-- TO OPEN OUTPUT FILE ; FXREAD-- TO READ A SECTOR FROM FILE ; FXWRIT-- TO WRITE A SECTOR ON OUTPUT FILE ; FXCLOS-- CLOSE INPUT OR OUTPUT FILE ; ; ; ; .MCALL CSI$,CSI$1,CSI$2,RETURN,CALL .MCALL FDBDF$,FDOP$A,FDBK$A,FDRC$A,FDOFF$,FCSBT$ .MCALL GTSK$S .MCALL FSRSZ$,OPEN$R,OPEN$W,CLOSE$,QIOW$S CSI$ ; COMMAND STRING INTER. DEFNS FDOFF$ DEF$L ; FIELDS DEFINITION IN FDB FCSBT$ DEF$L ; BIT DEFINITIONS IN FDB FSRSZ$ 0 ; ; ; THIS ENTRY POINT CHECKS THE COMMAND STRING FOR SYNTAX ; ERRORS. THIS CALL IS A MUST BEFORE ANY OPEN ; SINCE IT COMPRESES THE STRING AND INITIALIZES CSI BLOCK. ; ; .PSECT ; FXVFY:: CLR RTNCD CSI$1 #CSIBLK,CMDBAD,CMDCNT MOV CSIBLK+C.CMLD,CMDCNT ; RETURN COMMPRESSED STRING SIZE BCS 20$ ; IF SYNTAX ERROR BITB #CS.EQU,CSIBLK+C.STAT ; INPUT FILE PRESENT? BEQ 10$ ; YES RETURN ; NO SYNTAX ERROR ; 10$: MOV #1,RTNCD ; MISSING INPUT FILE RETURN ; 20$: MOV #2,RTNCD ; SYNTAX ERROR RETURN ; ; OPEN FILE FOR INPUT AND MOVE RECORD ATTRIBUTES TO FILE ; BUFFER FOR OUTPUT FILE OPEN. ; FXOPNI:: CLR RTNCD ; ZERO RETURN CODE CSI$2 #CSIBLK,INPUT ; FILL IN DATASET DESCRIPTOR BLK BCS CSERR TST CSIBLK+C.FILD BEQ CSERR ; ERROR IF NO FILE NAME SPECIFIED 20$: MOV #STBLK,FDB+F.STBK ; TO GET STATISTICS CLR STBLK CLR STBLK+2 CLR STBLK+4 CLR STBLK+6 OPEN$R #FDB BCS OPNERR ; BRANCH IF ERROR ; MOV DATBAD,R2 MOVB FDB+F.RTYP,(R2)+ ; 0 RECORD TYPE MOVB FDB+F.RATT,(R2)+ ; 1 RECORD ATTRIBUTES MOV FDB+F.RSIZ,(R2)+ ; 2 RECORD SIZE MOV FDB+F.HIBK,(R2)+ ; 4 MOV FDB+F.HIBK+2,(R2)+ ; 6 MOV FDB+F.EFBK,(R2)+ ; 10 MOV FDB+F.EFBK+2,EFBLK ; MOV FDB+F.FFBY,LBLKSZ ; MOV EFBLK,LSTRD ; LAST BLOCK TO BE READ TST LBLKSZ BNE 30$ DEC LSTRD 30$: MOV EFBLK,(R2)+ ; 12 MOV LBLKSZ,(R2)+ ; 14 MOV STBLK,(R2)+ ; 16 MOV STBLK+2,(R2)+ ; 20 MOV STBLK+6,(R2)+ ; 22 RETURN ; CSERR: MOV #2,RTNCD ; ERROR IN FILE STRING RETURN OPNERR: MOV #3,RTNCD ; ERROR ON OPEN RETURN ; ; ; OPEN INPUT FILE WITH ATTRIBUTES (F.RTYP TO F.FFBY) ; RECEIVED FROM INPUT FILE. ; ; FXOPNO::MOV #0,RTNCD ; ZERO OUT RETURN CODE CSI$2 #CSIBLK,INPUT ; TO GET INPUT FILE NAME @ MOV CSIBLK+C.FILD,DFNAML ; IN CASE WE NEED IT MOV CSIBLK+C.FILD+2,DFNADD ; CSI$2 #CSIBLK,OUTPUT BCS CSERR ; BRANCH IF ERROR TST CSIBLK+C.FILD BNE 50$ ; BRANCH IF NAME PRESENT MOV DFNAML,CSIBLK+C.FILD MOV DFNADD,CSIBLK+C.FILD+2 50$: MOV DATBAD,R2 ; MOV #7,R1 MOV #ATRBLK,R3 60$: MOV (R2)+,(R3)+ SOB R1,60$ TST (R2) ; TEST STATUS BLOCK 1ST WORD BNE 70$ ; CONTIG. FILE IF NOT ZERO TST 2(R2) ; TEST STBLK 2ND WORD BNE 70$ ; CONTIG. FILE IF NOT ZERO NEG 4(R2) ; NEGATE SIZE TO INDICATE NON-CONTIG FILE 70$: MOV 4(R2),FDB+F.CNTG ; TO ALLOCATE TOTAL SPACE FOR FILE ; OPEN$W #FDB BCS OPNERR ; ERROR IF COULD NOT OPEN FILE RETURN ; ; WRITE A SECTOR FROM FILE BUFFER (ADDRESS IN DATBAD) ; FXWRIT:: MOV #IO.WVB,FUN ; WRITE VIRTUAL BLK FUNCTION BR QIO ; ; READ A SECTOR FROM FILE TO BUFFER (ADDRESS IN DATBAD) ; FXREAD:: MOV #IO.RVB,FUN ; READ VIRTUAL BLK FUNCTION ; QIO: ADD #1,SCTNO ; NEXT SECTOR # FOR I/O QIOW$S FUN,#LUN,#10,,#IOSTAT,, CMPB #1,IOSTAT BNE 10$ ; IF NOT 1 ERROR MAYBE BITB #FA.RD,FDB+F.FACC ; WAS IT A READ? BEQ 5$ ; NO SKIP EOF DOUBLE CHECK CMP SCTNO,LSTRD BHI EOF ; EOF IF ALL USED BLOCKS READ ; 5$: CLR RTNCD ; SUCCESSFUL I/O RETURN ; 10$: CMPB IOSTAT,#IE.EOF ; END OF FILE? BEQ EOF ERROR: MOV #2,RTNCD ; ERROR RETURN EOF: MOV #1,RTNCD ; END-OF-FILE RETURN ; ; FXCLOS:: BITB #FA.RD,FDB+F.FACC ; TEST FILE ACCESSS BIT BNE 30$ ; IF OPEN FOR READ ONLY MOV #7,R1 ; LOOP COUNTER MOV #FDB,R2 ; TO FDB MOV #ATRBLK,R3 ; FROM INPUT FILE 20$: MOV (R3)+,(R2)+ SOB R1,20$ 30$: CLOSE$ #FDB ; CLOSE OPEN FILE CLR SCTNO ; CLEAR SECTOR # FOR NEXT TIME RETURN ; LUN = 3 ; LOGICAL UNIT NUMBER ; FDB:: FDBDF$ ; ALLOCATE SPACE FOR INPUT FDB FDRC$A FD.RWM ; VIRTUAL I/O FDBK$A ,512.,,10,IOSTAT FDOP$A LUN,CSIBLK+C.DSDS ; CSIBLK: .BLKB C.SIZE ;ALLOCATE SPACE FOR CSI BLK STBLK: .BLKB 10. ;ALLOCATE SPACE FOR STATISTICS BLOCK IOSTAT: .BLKW 2 ; I/O STATUS BLOCK SCTNO: .WORD 0 ; SECTOR NUMBER FUN: .BLKW 1 ; FUNCTION CODE FOR QIO LBLKSZ: .BLKW 1 ; LAST BLOCK SIZE EFBLK: .BLKW 1 ; END OF FILE BLOCK NUMBER LSTRD: .BLKW 1 ; LAST SECTOR TO BE READ DFNAML: .BLKW 1 ; DEFAULT FILE NAME LENGTH (FROM INPUT) DFNADD: .BLKW 1 ; FILE NAME STRING ADDRESS (IN INPUT) ; ATRBLK: .BLKW 7 ; ATTRIBUTE BLOCK ; ; ; COMMON AREA BETWEEN ESFLX AND FXIO ; .PSECT FBADCM,D,GBL,OVR,RW CMDBAD: .BLKW 1 ; COMMAND INPUT BUFFER ADDRESS DATBAD: .BLKW 1 ; DATA INPUT/OUTPUT BUFFER ADDRESS .BLKW 1 CMDCNT: .BLKW 1 ; LENGTH OF COMMAND STRING RTNCD: .BLKW 1 ; RETURN CODE ; ; .END