; ADAPTED FROM [300,52] RECIO BY RNS ; MOD. JAN 82 TO ADD .MARK OPTION ; ;$IO RECIO SEQUENTIAL I/O AT THE RECORD LEVEL ;. 13-SEPT-76 P. CANNON ;. THIS MODULE PROVIDES THE FORTRAN PROGRAMMER WITH ACCESS ;. TO THE GET$ (READ SEQUENTIAL) AND PUT$ (WRITE SEQUENTIAL) ;. MACROS. THE USER IS PERMITTED TO ACCESS THE RECORDS IN A ;. FILE IN SEQUENTIAL ORDER. THE RECORDS MAY BE OF ARBITRARY ;. LENGTH. ;. THESE PROGRAMS RETURN WHEN THE I/O OPERATION IS COMPLETE, ;. A CALL TO THE WAIT MODULE MUST NOT BE ISSUED. ;. ;. CALL RDFDB (LUN,BUF,LB,/NBT/,/IER/,/LOC/) ;. CALL WRTFDB(LUN,BUF,NB,/NBT/,/IER/) ;. ;. LUN FORTRAN LOGICAL UNIT ;. BUF USER SUPPLIED BUFFER FOR THE RECORD TO BE READ OR ;. WRITTEN ;. LB LENGTH OF BUFFER ON A READ OPERATION ;. NB NUMBER OF BYTES TO WRITE ;. NBT NUMBER OF BYTES TRANSFERRED. ;. IER ERROR FLAG ;. POSITIVE IMPLIES NO ERROR ;. ZERO IMPLIES END OF FILE ;. NEGATIVE IMPLIES HARDWARE I/O ERROR ;. ; ; THE GENERAL FORM OF THE GET$ MACRO IS : ; GET$ FDB,URBA,URBS,ERR ; ; WHERE: ; FDB ADDRESS OF FILE DESCRIPTOR BLOCK. ; URBA ADDRESS OF USER RECORD BUFFER. ; URBS NUMERIC VALUE DEFINING THE SIZE (IN BYTES) OF THE ; USER RECORD BUFFER. ; ERR THE SYMBOLIC ADDRESS OF AN OPTIONAL USER-CODED ; ERROR-HANDLING ROUTINE. ; .TITLE RECIO - SEQUENTIAL I/O AT THE RECORD LEVEL .IDENT /V01/ .PSECT .GLOBL RDFDB,WRTFDB .GLOBL FDBERR .MCALL GET$,PUT$ .SBTTL RDFDB - READ A RECORD AND RETURN WHEN I/O IS COMPLETE EF: .WORD 0 ;ADDRESS OF PARAMETER LIST .WORD 0 ;NBR OF TIMES CALLED RDFDB: MOV R5,EF ;SAVE ADDRESS OF PARAMETER LIST INC EF+2 ;ADD ONE TO THE NBR OF TIMES CALLED MOV (R5)+,R4 ;R4= NBR OF PARAMETERS MOV @(R5)+,R2 ;R2 = LUN MOV @#$OTSV,R3 CALL $FCHNL ADD #14,R0 ;R0 -> FCS FDB CMP #6,R4 ;1-82 CHECK # ARGS BLT 5$ CALL .MARK ;1-82 BCS 10$ ;1-82 B ON ERROR MOV 10(R5),R1 ;1-82 ADDRESS LOC MOV R2,(R1)+ ;1-82 MOVE L.O. BLOCK NO. MOV R3,(R1)+ ;1-82 MOVE BYTE OFFSET 5$: MOV (R5)+,R1 ;R1= ADDRESS OF DATA BUFFER MOV @(R5)+,R2 ;R2= NBR OF BYTES TO READ GET$ R0,R1,R2 ;PERFORM A SEQUENTIAL READ 10$: SUB #3,R4 ;COMPUTE THE NBR OF OPTIONAL PARAMETERS JSR PC,NBTRIO ;TRY TO UPDATE THE NUMBER OF BYTES ;TRANSFERRED FROM THE "F.NBRD" ;OFFSET IN THE FDB. JSR PC,FDBERR ;TEST THE F.ERR OFFSET IN ;THE FDB AND RETURN THE STATUS TO ;THE CALLING FORTRAN PROGRAM. RTS PC ;EXIT .PAGE ; ; ; THE GENERAL FORM OF THE PUT$ MACRO IS : ; PUT$ FDB,NRBA,NRBS,ERR ; ; WHERE: ; FDB ADDRESS OF FILE DESCRIPTOR BLOCK ; NRBA ADDRESS OF THE NEXT RECORD BUFFER TO BE WRITTEN ; NRBS A NUMERIC VALUE SPECIFYING THE SIZE (IN BYTES) ; OF THE NEXT RECORD BUFFER,I.E., THE LENGTH OF ; THE RECORD TO BE WRITTEN. ; ERR THE SYMBOLIC ADDRESS OF AN OPTIONAL USER-CODED ; ERROR-HANDLING ROUTINE. ; .SBTTL WRTFDB - WRITE A RECORD AND RETURN WHEN I/O IS COMPLETE EF1: .WORD 0 ;ADDRESS OF PARAMETER LIST .WORD 0 ;NBR OF TIMES CALLED WRTFDB: MOV R5,EF1 ;SAVE ADDRESS OF PARAMETER LIST INC EF1+2 ;ADD ONE TO THE NBR OF TIMES CALLED MOVB (R5)+,R4 ;R4= NBR OF PARAMETERS MOV @(R5)+,R2 ;R2 = LUN MOV @#$OTSV,R3 CALL $FCHNL ADD #14,R0 ;R0 -> FCS FDB MOV (R5)+,R1 ;R1= ADDRESS OF DATA BUFFER MOV @(R5)+,R2 ;R2= NBR OF BYTES TO WRITE PUT$ R0,R1,R2 ;PERFORM A SEQUENTIAL WRITE SUB #3,R4 ;COMPUTE THE NBR OF OPTIONAL PARAMETERS JSR PC,NBTRIO ;TRY TO UPDATE THE NUMBER OF BYTES ;TRANSFERRED FROM THE "F.NBRD" ;OFFSET IN THE FDB. JSR PC,FDBERR ;TEST THE F.ERR OFFSET IN ;THE FDB AND RETURN THE STATUS TO ;THE CALLING FORTRAN PROGRAM. RTS PC .PAGE .SBTTL NBTRIO - UPDATE THE NBT FOR RECORD I/O ;ENTER ; R5 POINTS TO THE ADDRESS IN THE ARGUMENT LIST, AT WHICH ; THE CALLING FORTRAN PROGRAM WISHES THE NUMBER OF BYTES ; TRANSFERRED (NBT) TO BE STORED. ; R4 CONTAINS THE NUMBER OF OPTIONAL PARAMETERS REMAINING ; IN THE ARGUMENT LIST ;EXIT ; THE WBT SPECIFIED IN THE "F.NBRD" OFFSET OF THE FDB ARE ; RETURNED TO THE CALLING PROGRAM. ; ; IF THE ADDRESS POINTED TO BY R5 IS EQUAL TO -1, NO STORAGE ; TAKES PLACE. ; IN EITHER CASE R5 IS INCREMENTED BY 2. ; R4 IS DECREMENTED NBTRIO: DEC R4 ;DECREMENT THE NUMBER OF PARAMETERS ;ARE THERE ANY PARAMETERS LEFT ? BLT 1$ ;YES-THEN EXIT CMP (R5),#-1 ;IS THE ADDRESS SPECIFIED EQUAL TO -1 ? BEQ 1$ ;YES- THEN EXIT MOV F.NRBD(R0),@(R5);NO-STORE THE NBR OF BYTES TRANSFERRED 1$: TST (R5)+ ;ADVANCE R5 TO THE NEXT PARAMETER RTS PC ;EXIT .END