;MAGTAPE READ/WRITE PACKAGE FOR RSX11D FORTRAN .TITLE MTQIO .IDENT /GCE002/ ;12/10/76 G. EVERHART .MCALL QIOW$S .MCALL QDPB$S ;ISSUES QIOW$S TO HACK READ/WRITE/SPECIAL QIO JUNK FOR RSX11D. ;ENTRIES: ;MSTAT(ISTAT) RETURNS ERROR CODE ;MSKIPR(NREC) SKIPS NREC (FWD OR BACK) ;MSKIPF(NREC) SKIPS N FILES (FWD/BACK) ;MEOF(NEOF) WRITES NEOF ENDFILES ;MSETCH(CHARACTERISTIC) SETS CHARACTERISTICS ;MGETCH(CHARACT.) READS CHARACTERISTICS ;MREWIND REWINDS TAPE ;MREAD(ADDR,BC,READCNT,FLAG) READS A BLOCK ; SETS READCNT TO # BYTES READ, FLAG TO COMPLETION CODE ;MWRITE(ADDR,BC,FLAG) WRITES A BLOCK. FLAG=COMPL. CODE. ;LUN USED IS GLOBAL "MAGLUN" .GLOBL MAGLUN ;DEFINE VIA TKB GBLDEF MSTAT:: MOV MAGIOS,@2(R5) ;COPY I/O STATUS OUT RTS PC MSKIPR:: QIOW$S #IO.SPB,#MAGLUN,#11,,#MAGIOS,,@2(R5) RTS PC MAGIOS: .WORD 0,0 ;I/O STATUS BLK MSKIPF:: QIOW$S #IO.SPF,#MAGLUN,#11,,#MAGIOS,,@2(R5) RTS PC MEOF:: MOV R0,-(SP) TSTB @R5 ;CHECK IF ANY ARGS WERE GIVEN BNE 1$ ;IF SO, BRANCH MOV #1,R0 ;IF NOT, ASSUME 1 EOF DESIRED BR LP ;AND GO DO IT 1$: ;CONTINUE IF HE HAS NO. EOF MOV @2(R5),R0 BIC #177700,R0 ;ALLOW AT MOST 63 ENDFILES! BNE LP INC R0 ;ENSURE AT LEAST 1 LP: QIOW$S #IO.EOF,#MAGLUN,#11,,#MAGIOS SOB R0,LP MOV (SP)+,R0 RTS PC MSETCH:: QIOW$S #IO.STC,#MAGLUN,#11,,#MAGIOS,,@2(R5) RTS PC MGETCH:: QIOW$S #IO.SEC,#MAGLUN,#11,,#MAGIOS ;FORMAT OK MOV MAGIOS+2,@2(R5) ;SEND CALLER THE STATUS RTS PC MREWIN:: QIOW$S #IO.RWD,#MAGLUN,#11,,#MAGIOS RTS PC MREAD:: ; NOTE-- BYTE COUNT MUST BE EVEN AND NONZERO. ; TO HELP USER, CLEAR 0 BIT TO ENSURE EVEN. (WOULD ROUND UP, ; BUT THAT MAY CORRUPT A BUFFER.) CLR MAGIOS CLR MAGIOS+2 ;PRESET STATI MOV R4,-(SP) MOV @4(R5),R4 ;GET BYTE-COUNT IN R4 BIC #1,R4 ;REMOVE LOW BIT BEQ RD.XIT ;NO-OP IF ZERO BYTES TO DO QIOW$S #IO.RLB,#MAGLUN,#11,,#MAGIOS,,<2(R5),R4> RD.XIT: MOV (SP)+,R4 ;RESTORE CALLER'S R4 MOV MAGIOS+2,@6(R5) MOV MAGIOS,@10(R5) ;SEND BYTECOUNT, STATUS RTS PC MWRITE:: CLR MAGIOS+2 CLR MAGIOS MOV R4,-(SP) ;ENSURE EVEN BYTE-COUNT AS ABOVE MOV @4(R5),R4 BIC #1,R4 BEQ WR.XIT QIOW$S #IO.WLB,#MAGLUN,#11,,#MAGIOS,,<2(R5),R4> WR.XIT: MOV (SP)+,R4 ;REPLACE R4 MOV MAGIOS,@6(R5); SET FLAG OUT RTS PC ;MAGTAPE STATUS BITS ARE: ; BIT MEANING ; 15 PAST EOV ; 14 AT EOV ; 13 AT BOT ; 12 7TRK TAPE ; 11 1600 BPI ; 10 MT WRITE LOCKED ; 9 MT REWINDING ; 8 MT SELECT ERR ; 7 INHIBIT WRITE/EXTENDED IRG ; 6 WRITE INHIBIT ; 5 SAW EOF AFTER READ/SKIP ; 4 PAST EOT ; 3 EVEN PARITY ; 2 CORE-DUMP MODE (7 TRK DEFAULT) ; 1 200 BPI ; 0 556 BPI ; ; ; AMONG ERROR RETURNS ARE: ; IE.BBE BAD BLK ; IE.BYT ODD ADDR (INHIBITED HERE) ; IE.DAO RECORD TRUNCATED ON READ-IN ; IE.EOF SAW EOF ON READ OR SKIP ; IE.EOT AT PHYSICAL EOT ; IE.WLK TAPE WRITE-LOCKED ; ERROR CODER CONVERSION TO MAKE SENSE OUT OF ERRORS RETURNED ERFLG:: MOV R0,-(SP) MOV @2(R5),R0 ;GET I/O STATUS WORD SAVED BY QIOW$ CLR @4(R5) ; DEFAULT TO ERROR CODE 0 (THINGS OK) ; DEFINE A MACRO TO SIMPLIFY THE TEST CODE .MACRO ETST CODE,FLAG,?LABEL CMPB R0,#CODE BNE LABEL ;IF WRONG ERCOD, SKIP MOV #FLAG,@4(R5) ;CODE GIVES FLAG OUTPUT WORD LABEL: .ENDM ETST IE.EOF,1 ;1 ENDFILE SEEN ETST IE.BAD,5 ;BAD CALL PARAMETERS FOR QIO ETST IE.DNR,11 ;DEVICE NOT RDY ETST IE.VER,4 ;PARITY ERR OD DEV ETST IE.EOV,2 ;END OF VOLUME (2 EOF ON TAPE) SEEN ETST IE.PRI,6 ;PRIVILEGE VIOLATION. (REMOUNT TAPE FOREIGN) ETST IE.BYT,7 ;BAD ADDR OR ODD BYTE COUNT ETST IE.BBE,10 ;BAD BLK ON DEV ETST IE.EOT,3 ;END OF TAPE SEEN ETST IE.OFL,12 ;TAPE OFFLINE ETST IE.BCC,13 ;CRC ERR ON DEV (OR SUCH) ETST IE.WLK,14 ;DEVICE WRITE PROTECTED ETST IE.DAO,15 ;DATA OVERRUN (THANKS, J. FOSTER) ETST IE.BLK,16 ;BLK # TOO BIG ETST IE.SPC,17 ;ILLEGAL USER BUFFER ;TEST FOR MISCELLANEOUS - ERR CODES NOT FOUND HERE TST @4(R5) ;GOT ERR ALREADY? BNE E.X ;YES, NOTHING TO DO HERE TSTB R0 ;NEGATIVE RETURN CODE? BPL E.X ;NO, NO FLAG TO DO MOV #40,@4(R5) ;YES, FLAG WITH BIG ERROR CODE E.X: MOV (SP)+,R0 ;RESTORE R0 THAT WE USED RTS PC ;RETURN TO CALLER ; CALL IS CALL ERFLG(INERR,IOUTERR) RETURNING IOUTERR ERROR FLAG .END