.TITLE MTGET .LIST MEB ; ; CALL MTGET(LUN,IARRAY,ISIZE,IERR,IBYTES) ; CALL MTPUT(LUN,IARRAY,ISIZE,IERR,IBYTES) ; ; THIS READS OR WRITES INTO IARRAY AND RETURNS THE ERROR CODE + ; THE NUMBER OF BYTES READ ; .MCALL QIOW$S ISTAT: .BLKW 2 MTGET:: MOV #IO.RVB,R1 FIN: MOV #5,R0 ; NUMBER OF PARAM JSR PC,R5CHEK ; CHECK THEM QIOW$S R1,@(R5),#1,,#ISTAT,,<2(R5),@4(R5)> BCC 1$ ; No error CALL ERROR 1$: MOV ISTAT,@6(R5) ; ERROR TO USER MOV ISTAT+2,@10(R5) ; NUMBER OF BYTES TO USER RETURN MTPUT:: MOV #IO.WVB,R1 ; WRITE FUNCTION TO PERFORM BR FIN ERROR: MOVB $DSW,ISTAT ; GET ERROR CODE MOVB #377,ISTAT+1 ; MARK IT CLR ISTAT+2 ; CLEAR COUNT RETURN ; ; CALL MTRWD(LUN,IERR) ! rewind a tape ; CALL MTRWU(LUN,IERR) ! Rewind a tape and unload it ; CALL MTEOF(LUN,IERR) ! Write an end-of-file on tape ; MTRWD:: MOV #IO.RWD,R1 ; Rewind the tape RWD: MOV #2,R0 ; Number of params CALL R5CHEK ; CHECK THEM QIOW$S R1,@(R5),#1,,#ISTAT BCC 1$ ; No error CALL ERROR 1$: MOV ISTAT,@2(R5) ; ERROR TO USER RETURN MTRWU:: MOV #IO.RWU,R1 BR RWD MTEOF:: MOV #IO.EOF,R1 BR RWD ; ; CALL MTSPB(LUN,ICOUNT,IERR,IACTUAL) ! Skip over ICOUNT blocks ; CALL MTSPF(LUN,ICOUNT,IERR,IACTUAL) ! Skip over ICOUNT files ; ; IACTUAL = Actual number of blocks/files skipped ; ICOUNT < 0 backspaces over blocks/files ; MTSPB:: MOV #IO.SPB,R1 SPB: MOV #4,R0 ; Number of params CALL R5CHEK ; CHECK THEM QIOW$S R1,@(R5),#1,,#ISTAT,,<@2(R5)> BCC 1$ ; No error CALL ERROR 1$: MOV ISTAT,@4(R5) ; ERROR TO USER MOV ISTAT+2,@6(R5) ; NUMBER OF BYTES TO USER RETURN BR SPB MTSPF:: MOV #IO.SPF,R1 BR SPB .END