.TITLE MTGET .ident /BL1.0/ .mcall $STSDEF,$SSDEF $STSDEF $SSDEF ; ; This set of routines is designed to be compatible with routines ; written for the PDP-11. These routines manipulate mag tape directly. ; Each call specifies a logical unit number. Each logical unit number ; corresponds to the devices: ; Unit # Device ; 1 LU1: ; 2 LU2: ; 3 LU3: ; 4 LU4: ; ; Each call returns a 16 bit error code. Only the low order byte of ; the code has any meaning. The codes are: ; "310 Bad tape ; "363 Data overrun (buffer smaller than record requested) ; "366 End of file encountered ; "302 End of tape encountered ; "365 End of volume encountered ; 1 Success !!! no errors ; IE.BBE=-56 IE.DAO=-13 IE.EOF=-10 IE.EOT=-62 IE.EOV=-11 ; ; 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 ; .psect $VARS,NOEXE,CON,LCL,WRT CHANNO: .BLKL 8 LUNS: .LONG LUN1,LUN2,LUN3,LUN4,LUN5,LUN6,LUN7,LUN8 LUN1: .ASCID /LU1:/ LUN2: .ASCID /LU2:/ LUN3: .ASCID /LU3:/ LUN4: .ASCID /LU4:/ LUN5: .ASCID /LU5:/ LUN6: .ASCID /LU6:/ LUN7: .ASCID /LU7:/ LUN8: .ASCID /LU8:/ ISTAT: .BLKW 4 TERM: .BLKL 2 .psect MTGET,EXE,LCL,CON,NOWRT ERROR1: RET .ENTRY MTGET,^M MOVL #IO$_READVBLK,R2 FIN: MOVL AP,R5 ; Param list MOVL (R5)+,R4 ; Size of list BSBW UNIT ; Get channel address JSB TESTP ; Next param BEQL ERROR1 MOVL R3,R1 ; Array address JSB TESTP ; Next param BEQL ERROR1 ; No params ?? $QIOW_S EFN=#1,CHAN=R0,- IOSB=ISTAT,FUNC=R2,- P1=(R1),P2=(R3) ERRTST: JSB TESTP ; Next param BEQL ERROR MOVL #-1,R1 ; Code for abnormal termination CMPW R0,#SS$_NORMAL ; Normal termination ? BNEQ 100$ ; MOVW ISTAT,R1 ; Error to user CMPW R1,#SS$_NORMAL ; Normal termination ? BEQL 100$ CMPW R1,#SS$_DATAOVERUN BNEQ 10$ MOVZBL #IE.DAO,R1 BRB 100$ 10$: CMPW R1,#SS$_ENDOFFILE BNEQ 20$ MOVZBL #IE.EOF,R1 BRB 100$ 20$: CMPW R1,#SS$_ENDOFTAPE BNEQ 30$ MOVZBL #IE.EOT,R1 BRB 100$ 30$: CMPW R1,#SS$_ENDOFVOLUME BNEQ 40$ MOVZBL #IE.EOV,R1 BRB 100$ 40$: MOVZBL #IE.BBE,R1 ; Bad block error 100$: MOVZBL R1,(R3) ; Status to user JSB TESTP ; Next param BEQL ERROR MOVZWL ISTAT+2,(R3) ; And byte count ERROR: RET .ENTRY MTPUT,^M MOVL #IO$_WRITEVBLK,R2 ; Write function BRW FIN UNIT: JSB TESTP ; Get unit number BEQL ERROR MOVZBL (R3),R3 ; Unit number DECB R3 ; minus 1 TP1:: BICB #^O370,R3 ; Limit it to 8 luns TP4:: ASHL #2,R3,R3 ; Now is longword pointer TP2:: MOVL L^CHANNO(R3),R0 ; This chan exists ? TP3:: BNEQ 20$ ; Yes $ASSIGN_S DEVNAM=@L^LUNS(R3),CHAN=L^CHANNO(R3) MOVL L^CHANNO(R3),R0 ; Get channel number 20$: RSB ; ; 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 ; .ENTRY MTRWD,^M MOVL #IO$_REWIND,R2 ; Rewind the tape BRB RWU .ENTRY MTRWU,^M MOVL #IO$_REWINDOFF,R2 BRB RWU .ENTRY MTEOF,^M MOVL #IO$_WRITEOF,R2 RWU: MOVL AP,R5 ; Param list MOVL (R5)+,R4 ; Size of list BSBW UNIT ; Get channel address $QIOW_S EFN=#1,CHAN=R0,- IOSB=ISTAT,FUNC=R2 BRW ERRTST ; ; 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 ; .ENTRY MTSPB^M MOVL #IO$_SKIPRECORD,R2 BRB SPEC ERROR2: RET .ENTRY MTSPF^M MOVL #IO$_SKIPFILE,R2 SPEC: MOVL AP,R5 ; Param list MOVL (R5)+,R4 ; Size of list BSBW UNIT ; Get channel address JSB TESTP ; Next param BEQL ERROR2 $QIOW_S EFN=#1,CHAN=R0,- IOSB=ISTAT,FUNC=R2,- P1=@(R3) BRW ERRTST ; ; CALL IOrpr(LUN,OBUFF,[ISIZO],IBUFF,ISIZI,[TMO],[TERM],[IERR],[ISIZ], ; [ISIZT]) ; CALL IORPE - Read with escape terminator ; CALL IORPB - Read after binary prompt ; ; OBUFF,IBUFF are output and input buffers which must be type ; CHARACTER or passed by DESCRIPTOR ; ISIZO = Output buffer size ; ISIZI = Input buffer size ; TMO = Time out count in secs ; TERM = Longword mask with bits set for ea term char ; IERR = error param ; ISIZ = #of input chars data ; ISIZT = #of terminal chars data ; ERROR3: MOVL #-1,R0 RET .ENTRY IORPE,^M MOVL #IO$_READPROMPT!IO$M_TIMED!IO$M_ESCAPE,R9 ; Function BRB MTRPR .ENTRY IORPB,^M MOVL #IO$_READPROMPT!IO$M_TIMED!IO$M_NOFORMAT,R9 ; Function BRB MTRPR .ENTRY IORPR,^M MOVL #IO$_READPROMPT!IO$M_TIMED,R9 ; Set up function MTRPR: MOVL AP,R5 ; Param list MOVL (R5)+,R4 ; Size of list BSBW UNIT ; Get channel address CLRL TERM+4 ; Clear terminal count JSB TESTP ; Next param BEQL ERROR3 ; Error ? MOVL R3,R1 ; Save address JSB TESTP ; Next param BEQL 10$ ; Error ? MOVL (R3),R2 ; Get actual size BGTR 20$ ; Greater than 0 ? 10$: MOVZWL (R1),R2 ; Get size from array 20$: MOVL 4(R1),R1 ; Get array address JSB TESTP ; Next param BEQL ERROR3 ; Error ? MOVL R3,R6 ; Get output buffer JSB TESTP ; Next param BEQL 30$ ; Error ? MOVL (R3),R7 ; Get actual value BGTR 40$ ; Is it positive ? 30$: MOVZWL (R6),R7 ; No, get length from descriptor 40$: MOVL 4(R6),R6 ; Now get output address JSB TESTP ; Next param BEQL 50$ ; No more ? MOVL (R3),R8 ; Get Timeout count 50$: JSB TESTP ; Next param BEQL 60$ ; No more ? MOVL (R3),TERM+4 ; Get terminating mask 60$: $QIOW_S EFN=#1,CHAN=R0,- IOSB=ISTAT,FUNC=R9,- P1=(R6),P2=R7,P5=R1,P6=R2,P3=R8,P4=#term JSB TESTP BEQL 80$ MOVZWL ISTAT,(r3) 80$: JSB TESTP BEQL 90$ MOVzwl ISTAT+2,(R3) 90$: JSB TESTP ; Another param ? BEQL 100$ ; No ? MOVZWL ISTAT+6,(R3) ; Get prompt size 100$: RET ; ; CALL IORAL(LUN,BUFF,[ISIZE],IERR,IMAX) ; Read all into a buffer specified by user (no interpretation) ; CALL IOWAL(LUN,BUFF,[ISIZE],IERR,IMAX) ; Write all from specified buffer ; .END