.TITLE TAPEIO ;TAPE HANDLING ROUTINE ; ;FORTRAN CALLABLE ROUTINE TO PERFORM ;LOGICAL BLOCK FUNCTIONS ON UNMOUNTED ;MAG TAPES ; ;THE CALLING SEQUENCE IS AS FOLLOWS: ; ;CALL TAPEIO(IFUNC,LUN,ISTAT,IBUFF,ISIZE) ; ;WHERE: ;IFUNC RANGES FROM 1-10 ;LUN IS THE LOGICAL UNIT ASSIGNED TO THE MAG TAPE ;ISTAT IS AN INTEGER ARRAY OF TWO WORDS ;IBUFF IS AN INTEGER ARRAY ADDRESS OR AN ; INTEGER VALUE ;ISIZE IS A BYTE COUNT OF THE NUMBER OF BYTES ; TO BE READ OR WRITTEN ; ; FUNCTION LIST ; ; ; WRITTEN BY JEFF HAMILTON ; ;FUNCTION 1--- READ TAPE BLOCK ; IFUNC=1 ; IBUFF=ARRAY ; ISIZE=NUMBER OF BYTES TO BE READ FROM THE TAPE ; ;FUNCTION 2--- WRITE TAPE BLOCK ; IFUNC=2 ; IBUFF=ARRAY ; ISIZE=NUMBER OF BYTES IN THE BLOCK TO BE WRITTEN ; ;FUNCTION 3--- REWIND ; IFUNC=3 ; IBUFF AND ISIZE ARE NOT NEEDED ; ;FUNCTION 4--- READ REVERSE ; IFUNC=4 ; FUNCTION THE SAME AS 1 EXCEPT THE PRECEEDING ; TAPE BLOCK IS THE ONE READ ; ;FUNCTION 5--- WRITE EOF MARK ; IFUNC=5 ; IBUFF AND ISIZE NOT NEEDED ; ;FUNCTION 6--- SET TAPE CHARACTERISTICS ; IFUNC=6 ; IBUFF=0 FOR 800 BPI ; IBUFF=2048 FOR 1600 BPI ; ISIZE NOT NEEDED ; ;FUNCTION 7--- SENSE TAPE CHARACTERISTICS ; IFUNC=7 ; ISTAT(2) CONTAINS THE TAPE MASK WORD ; ON COMPLETION ; ;FUNCTION 8--- SPACE TAPE BLOCKS ; IFUNC=8 ; IBUFF= NUMBER OF BLOCKS TO SPACE ; (POSITIVE=FORWARD ,NEGATIVE=REVERSE) ; ;FUNCTION 9--- SPACE FILE MARKS ; IFUNC=9 ; IBUFF= NUMBER OF FILEMARKS TO SPACE ; (POS.=FORWARD ,NEG =REVERSE) ; ;FUNCTION 10--- REWIND AND TURN OFF LINE ; IFUNC=10 ; NO OTHER ARGUMENTS NEEDED ; ; IFUNC WILL BE NEGATIVE IF A BAD OR MISSING ; PARAMETER IS SUPPLIED TO THE ROUTINE. ; THE NEGATIVE NUMBER RETURNED POINTS TO ; THE BAD PARAMETER. (I.E. -5 MEANS THAT ; THE ISIZE PARAMETER IS MISSING) ; COMMAS MUST BE SUPPLIED FOR MISSING PARAMETERS ; .PAGE .SBTTL LOCAL DATA .MCALL QIOW$S ; ;EQUATES FUNC=2 ;OFFSET TO FUNCTION CODE LUN=4 ;OFFSET TO THE LOGICAL UNIT NUMBER ISTAT=6 ;OFFSET TO THE STATUS BLOCK IBUF=10 ;OFFSET TO THE BUFFER ADDRESS ISIZE=12 ;SIZE OFFSET ; IOSTAT: .BLKW 2 ;INTERNAL I/O STATUS BLOCK BLKSTA: .WORD IOSTAT ;I/O STATUS BLOCK POINTER ; ;TABLE OF FUNCTIONS ; TABLE: .WORD RTAPE,WTAPE,REWIND,RREV,WEOF,SETTPE,SENTPE .WORD SPCBLK,SPCEOF,REWOFF ; .PAGE .SBTTL MAIN FUNCTION DISPATCHER ; ; TAPEIO:: ;MAIN PROCESSOR ; MOV @FUNC(R5),R0 ;GET FUNCTION CODE TST R0 ;ZERO OR LESS? BGT 10$ ;NO MOV #-1,@FUNC(R5) ;SET ERROR CODE JMP END ;GET OUT ; 10$: CMP #10.,R0 ;GREATER THAN MAX? BGE 20$ ;NO;JLH001 MOV #-1,@FUNC(R5) ;SET ERROR JMP END ;GET OUT ; 20$: ;MAKE FUNCTION AN INDEX DEC R0 ASL R0 ;R0 IS NOW AN INDEX FOR THE FUNCTION ;TEST ENTRY PARAMETERS FOR NULLS ; CMP #-1,LUN(R5) ;LUN INPUT? BNE 30$ ;YES MOV #-2,@FUNC(R5) ;SET NO LUN PRESENT JMP END ;GET OUT ; 30$: CMP #-1,ISTAT(R5) ;STATUS BLOCK PRESENT? BNE 40$ ;YES MOV #IOSTAT,BLKSTA ;NO,THEN SUBSTITUTE INTERNAL ONE BR 50$ ;GO CALL FUNCTION 40$: MOV ISTAT(R5),BLKSTA ;GET ADDR OF USER I/O STAT BLK 50$: JSR PC,@TABLE(R0) ;CALL PROPER FUNCTION ; ;THE FUNCTION IS COMPLETE NOW RETURN END: RETURN ;RETURN TO CALLER .PAGE .SBTTL FUNCTION ROUTINES ; ; ;FUNCTION 1 -- READ TAPE BLOCK ; RTAPE: ; CALL VLDATE ;VLDATE USER BUFFER AND SIZE BCS 99$ ; BR IF NO PARAMETER ; ;READ THE TAPE QIOW$S #IO.RLB,@LUN(R5),#15.,,BLKSTA,, ; 99$: RETURN ;RETURN TO MAIN ; ; ; ; ;FUNCTION 2 -- WRITE TAPE BLOCK ; WTAPE: ; CALL VLDATE ;VALIDATE USER BUFFER AND SIZE BCS 99$ ;BR IF BAD PARAMETER ; ;WRITE THE TAPE BLOCK QIOW$S #IO.WLB,@LUN(R5),#15.,,BLKSTA,, ; 99$: RETURN ; ; ; ;FUNCTION 3 -- REWIND FUNCTION REWIND: QIOW$S #IO.RWD,@LUN(R5),#15.,,BLKSTA RETURN ;RETURN TO CALLER ; .PAGE ; ; ;FUNCTION 4 -- READ REVERSE FUNCTION ; RREV: ; CALL VLDATE ;VALIDATE PARAMETERS BCS 99$ ;BR IF BAD ; ;READ THE TAPE QIOW$S #IO.RLV,@LUN(R5),#15.,,BLKSTA,, ; 99$: RETURN ; ; ; ;FUNCTION 5 -- WRITE FILE MARK ; WEOF: QIOW$S #IO.EOF,@LUN(R5),#15.,,BLKSTA RETURN ; ; ; ;FUNCTION 6 -- SET TAPE CHARACTERISTICS ; SETTPE: CMP #-1,IBUF(R5) ;PARAMETER ENTERED? BNE 10$ ;YES MOV #-4,@FUNC(R5) ;SET ERROR BR 99$ ;GET OUT 10$: ;SET THE TAPE QIOW$S #IO.STC,@LUN(R5),#15.,,BLKSTA,,<@IBUF(R5)> 99$: RETURN ; ; ; ;FUNCTION 7 -- SENSE TAPE CHARACTERISTICS ; SENTPE: QIOW$S #IO.SEC,@LUN(R5),#15.,,BLKSTA RETURN ; ;FUNCTIONS 8 AND 9 ; 8-- SPACE FILE BLOCKS, 9-- SPACE FILE MARKS ; SPCBLK: MOV #IO.SPB,R1 ;GET QIO FUNCTION CODE BR A ;GO DO THE REST SPCEOF: MOV #IO.SPF,R1 ;SET FUNCTION CODE A: CMP #-1,IBUF(R5) ;PARAMETER ENTERED? BNE 20$ ;YES MOV #-4,@FUNC(R5) ;SET ERROR BR 99$ ;LEAVE 20$: ;SPACE THE TAPE QIOW$S R1,@LUN(R5),#15.,,BLKSTA,,<@IBUF(R5)> 99$: RETURN ; ;FUNCTION 10--- REWIND AND TURN OFF LINE ; REWOFF: QIOW$S #IO.RWU,@LUN(R5),#15.,,BLKSTA RETURN ; ; .PAGE .SBTTL VLDATE --- PARAMETER VALIDATION ROUTINE ; ; ;VLDATE ;CARRY SET ON RETURN IF BUFFER OR SIZE PARAMETER ;IS MISSING ; VLDATE: CMP #-1,IBUF(R5) ;USER BUFFER? BNE 10$ ;YES,CHECK SIZE MOV #-4,@FUNC(R5) ;SET ERROR BR 30$ ;GET OUT 10$: CMP #-1,ISIZE(R5) ;SIZE PARAMETER? BEQ 20$ ;NO, GO SET ERROR CLC ;CLEAR ERROR FLAG RETURN ;GET OUT ; 20$: MOV #-5,@FUNC(R5) ;SET ERROR CODE 30$: SEC ;SET ERROR FLAG RETURN ;GET OUT ; .END