Google
 

Trailing-Edge - PDP-10 Archives - tops20tools_v6_9-jan-86_dumper - tools/dumper2/mtio.for
There are 3 other files named mtio.for in the archive. Click here to see a list.
	SUBROUTINE MTOPEN(NAME,CHANNEL,STATUS)
C
C	This subroutine will use the VAX/VMS system services
C	to open a magtape drive and return the channel number
C	assigned to it.  If an error occurs, the STATUS code
C	will be even.
C
	CHARACTER*64 DEVNAME
	INTEGER*2 DEVLEN
	CHARACTER*(*) NAME
	INTEGER*4 CHANNEL,STATUS
	INTEGER*4 SYS$ASSIGN
C
	CALL STR$UPCASE(DEVNAME,NAME)
	DEVLEN = MIN(64,LEN(NAME))
	STATUS = SYS$ASSIGN(DEVNAME(1:DEVLEN),CHANNEL,,)
	RETURN
	END
	SUBROUTINE MTCLOS(CHANNEL,STATUS)
C
C	This subroutine will use the VAX/VMS system services
C	to close the magtape drive previously opened by MTOPEN.
C	If an error occurs, the STATUS code will be even.
C
	INTEGER*4 CHANNEL,STATUS
	INTEGER*4 SYS$DASSGN
C
	STATUS = SYS$DASSGN(%VAL(CHANNEL))
	RETURN
	END
	SUBROUTINE MTSKPF(CHANNEL,COUNT,STATUS)
C
C	This subroutine will use the VAX/VMS system services
C	to skip the magtape the specified number of files for
C	a tape drive previously opened by MTOPEN.  If an error
C	occurs, the STATUS code will be even.
C
	INTEGER*4 CHANNEL,COUNT,STATUS
	INTEGER*4 IOSB(2)
	INTEGER*2 IOSB2(4)
	EQUIVALENCE (IOSB,IOSB2)
C
	EXTERNAL IO$_SKIPFILE,MT$M_BOT
C
	IF (COUNT.LE.0) THEN
	 CALL MTCONT(CHANNEL,IO$_SKIPFILE,COUNT-1,IOSB,STATUS)
10	FORMAT(' Skipped',I5,' Save-sets')
	 IF (IAND(%LOC(MT$M_BOT),IOSB(2)).EQ.0) THEN
	  TYPE 10, MIN(0,-IOSB2(2)+1)
	  CALL MTCONT(CHANNEL,IO$_SKIPFILE,1,IOSB,STATUS)
	 ELSE
	  TYPE 10, MIN(0,-IOSB2(2))
	 ENDIF
	ELSE
	 CALL MTCONT(CHANNEL,IO$_SKIPFILE,COUNT,IOSB,STATUS)
	 TYPE 10, IOSB2(2)
	ENDIF
	CALL MTSTAT(IOSB)
	RETURN
	END
	SUBROUTINE MTSKPR(CHANNEL,COUNT,STATUS)
C
C	This subroutine will use the VAX/VMS system services
C	to skip the magtape the specified number of records for
C	a tape drive previously opened by MTOPEN.  If an error
C	occurs, the STATUS code will be even.
C
	INTEGER*4 CHANNEL,COUNT,STATUS
	INTEGER*4 IOSB(2)
	INTEGER*2 IOSB2(4)
	EQUIVALENCE (IOSB,IOSB2)
C
	EXTERNAL IO$_SKIPRECORD
C
	CALL MTCONT(CHANNEL,IO$_SKIPRECORD,COUNT,IOSB,STATUS)
	TYPE 10, SIGN(IOSB2(2),COUNT)
10	FORMAT(' Skipped',I5,' records')
	CALL MTSTAT(IOSB)
	RETURN
	END
	SUBROUTINE MTCONT(CHANNEL,ACTION,COUNT,IOSB,STATUS)
C
C	This subroutine is used by MTSKPF and MTSKPR to
C	do the actual work of skipping on the magtape.
C	This will interpret the system and magtape status
C	codes and print the appropriate messages.
C
	INTEGER*4 CHANNEL,ACTION,COUNT,STATUS
	INTEGER*2 IOSB(4)
C
C
	INTEGER*4 SYS$QIOW
	EXTERNAL IO$_SENSEMODE
C
	STATUS = SYS$QIOW(,%VAL(CHANNEL),ACTION,IOSB,,
	1 ,%VAL(COUNT),,,,,)
	IF (.NOT.STATUS) THEN
	 CALL ERRORM(STATUS)
	ELSE IF (.NOT.IOSB(1)) THEN
	 STATUS = IOSB(1)
	 CALL ERRORM(STATUS)
	ENDIF
	RETURN
	END
	SUBROUTINE MTSTAT(IOSB)
C
C	This subroutine will examine the I/O status block
C	supplied and print the appropriate messages.
C
	INTEGER*4 IOSB(2)
C
	EXTERNAL MT$M_LOST,MT$M_EOT,MT$M_BOT
	EXTERNAL MTIO_LOST,MTIO_EOT,MTIO_BOT
C
	IF (IAND(%LOC(MT$M_LOST),IOSB(2)).NE.0)
	1 CALL ERRORM(%LOC(MTIO_LOST))
	IF (IAND(%LOC(MT$M_EOT),IOSB(2)).NE.0)
	1 CALL ERRORM(%LOC(MTIO_EOT))
	IF (IAND(%LOC(MT$M_BOT),IOSB(2)).NE.0)
	1 CALL ERRORM(%LOC(MTIO_BOT))
C
	RETURN
	END
	SUBROUTINE MTREAD(CHANNEL,BUFFER,BUFLEN,ACTLEN,STATUS)
C
C	This subroutine will read a magtape that has been opened
C	by the MTOPEN subroutine.  It will read in one record from
C	the tape into BUFFER, and set ACTLEN to the number of bytes
C	actually read.  STATUS will get the return status from the
C	VAX/VMS $QIOW call.
C
	INTEGER*4 CHANNEL,BUFLEN,ACTLEN,STATUS
	BYTE BUFFER(1)
C NB: BUFFER is dimensioned 1 due to FORTRAN problems...it should be
C dimensioned to BUFLEN.
C
	INTEGER*4 SYS$QIOW
	INTEGER*2 IOSB(4)
	EXTERNAL IO$_READLBLK
C
	STATUS = SYS$QIOW(,%VAL(CHANNEL),IO$_READLBLK,IOSB,,
	1 ,BUFFER,%VAL(BUFLEN),,,,)
	ACTLEN = IOSB(2)
	IF (.NOT.STATUS) THEN
	 CALL ERRORM(STATUS)
	ELSE
	 IF (.NOT.IOSB(1)) THEN
	  STATUS = IOSB(1)
	  CALL ERRORM(STATUS)
	 ENDIF
	ENDIF
	CALL MTSTAT(IOSB)
	RETURN
	END
	SUBROUTINE MTWRIT(CHANNEL,BUFFER,BUFLEN,ACTLEN,STATUS)
C
C	This subroutine will write a magtape that has been opened
C	by the MTOPEN subroutine.  It will write out one record from
C	BUFFER to the tape, and set ACTLEN to the number of bytes
C	actually written.  STATUS will get the return status from the
C	VAX/VMS $QIOW call.
C
	INTEGER*4 CHANNEL,BUFLEN,ACTLEN,STATUS
	BYTE BUFFER(1)
C NB: BUFFER is dimensioned 1 due to FORTRAN problems...it should be
C dimensioned to BUFLEN.
C
	INTEGER*4 SYS$QIOW
	INTEGER*2 IOSB(4)
	EXTERNAL IO$_WRITELBLK
C
	STATUS = SYS$QIOW(,%VAL(CHANNEL),IO$_WRITELBLK,IOSB,,
	1 ,BUFFER,%VAL(BUFLEN),,,,)
	ACTLEN = IOSB(2)
	IF (.NOT.STATUS) THEN
	 CALL ERRORM(STATUS)
	ELSE
	 IF (.NOT.IOSB(1)) THEN
	  STATUS = IOSB(1)
	  CALL ERRORM(STATUS)
	 ENDIF
	ENDIF
	CALL MTSTAT(IOSB)
	RETURN
	END