	PROGRAM MAGSKP
C
C THIS PROGRAM IS USED TO POSITION A MAGTAPE. THE FORMS THIS COMMAND
C  MAY TAKE ARE:
C
C	$SKIP dev: x FILES - SKIP x FILES FROM THE CURRENT POSITION
C	$SKIP dev: x RECORDS - SKIP x BLOCKS FROM THE CURRENT POSITION
C	$SKIP dev: x BLOCKS - SAME AS SKIP RECORD COMMAND
C	$SKIP dev: EOT - SKIP TO LOGICAL END OF TAPE MARK
C
	IMPLICIT INTEGER (A-Z)
C
C SOME USEFUL CONSTANTS
C
	PARAMETER IO$_SKIPFILE='25'X	!SKIP FILES
	PARAMETER IO$_SKIPRECORD='26'X	!SKIP BLOCKS
	PARAMETER IO$_READVBLK='31'X	!READ A BLOCK
	PARAMETER SS$_DATAOVERUN='838'X	!DATA OVER RUN ERROR
	PARAMETER SS$_ENDOFFILE='870'X	!EOF SEEN
	PARAMETER SS$_ENDOFTAPE='878'X	!EOT SEEN
C
C SOME OTHER USEFUL THINGS
C
	INTEGER*2 IOSB(4)
	BYTE ICMD(100)
	CHARACTER CMDLIN*100,DEV*10,OPTION*10,FWRD*5,RWRD*7,BWRD*6
	CHARACTER SPACE*5,EWRD*3
	EQUIVALENCE (ICMD,CMDLIN)
	DATA FWRD/'FILES'/,RWRD/'RECORDS'/,BWRD/'BLOCKS'/
	DATA SPACE/'     '/,EWRD/'EOT'/
C
C START THINGS ROLLING
C
	CMDLEN=IGETCMD(ICMD,100)
	LCHR=LIB$LOCC(' ',CMDLIN)-1
	DEVLEN=LCHR
	LOCOLN=LIB$LOCC(':',CMDLIN)
	IF(LOCOLN.NE.0.AND.LOCOLN.LE.LCHR) GOTO 10
	DEV(LCHR+1:LCHR+1)=':'
	DEVLEN=LCHR+1
10	DEV(1:LCHR)=CMDLIN(1:LCHR)
	FCHR=LCHR+2
	LCHR=LIB$LOCC(' ',CMDLIN(FCHR:CMDLEN))+FCHR-2
	IF(LCHR.EQ.FCHR-2) GOTO 70
	OPTLEN=LCHR-FCHR+1
	OPTION(1:OPTLEN)=CMDLIN(FCHR:LCHR)
	IF(OPTION(1:OPTLEN).NE.EWRD(1:OPTLEN)) GOTO 40
	STS=SYS$ASSIGN(%DESCR(DEV(1:DEVLEN)),CHAN,,)
	IF((STS.AND.1).NE.1) CALL EXIT(STS)
20	STS=SYS$QIOW(,%VAL(CHAN),%VAL(IO$_SKIPFILE),IOSB,,,%VAL(1),,,,,)
	IF((IOSB(1).AND.1).NE.1) CALL EXIT(IOSB(1))
	STS=SYS$QIOW(,%VAL(CHAN),%VAL(IO$_READVBLK),IOSB,,,
     1		      %REF(CMDLIN),%VAL(100),,,,)
	IF(IOSB(1).EQ.SS$_ENDOFFILE) GOTO 30
	IF(IOSB(1).EQ.SS$_DATAOVERUN.OR.(IOSB(1).AND.1).EQ.1) GOTO 20
	CALL EXIT(IOSB(1))
30	STS=SYS$QIOW(,%VAL(CHAN),%VAL(IO$_SKIPFILE),IOSB,,,%VAL(-1),,,,,)
	IF((IOSB(1).AND.1).NE.1) CALL EXIT(IOSB(1))
	STS=SYS$DASSGN(%VAL(CHAN))
	CALL EXIT(STS)
40	IF(OPTLEN.LT.5) OPTION(1:5)=SPACE(1:5-OPTLEN)//OPTION(1:OPTLEN)
	OPTLEN=5
	DECODE(5,1001,OPTION(1:OPTLEN),ERR=70)SPACNT
1001	FORMAT(I5)
	FCHR=LCHR+2
	LCHR=LIB$LOCC(' ',CMDLIN(FCHR:CMDLEN))+FCHR-2
	IF(LCHR.EQ.FCHR-2) LCHR=CMDLEN
	OPTLEN=LCHR-FCHR+1
	OPTION(1:OPTLEN)=CMDLIN(FCHR:LCHR)
	IF(OPTION(1:OPTLEN).NE.FWRD(1:OPTLEN)) GOTO 50
	STS=SYS$ASSIGN(%DESCR(DEV(1:DEVLEN)),CHAN,,)
	IF((STS.AND.1).NE.1) CALL EXIT(STS)
	STS=SYS$QIOW(,%VAL(CHAN),%VAL(IO$_SKIPFILE),IOSB,,,%VAL(SPACNT),,,,,)
	IF((IOSB(1).AND.1).NE.1) CALL EXIT(IOSB(1))
	IF(SPACNT.GE.0) CALL EXIT(1)
	STS=SYS$QIOW(,%VAL(CHAN),%VAL(IO$SKIPFILE),IOSB,,,%VAL(1),,,,,)
	IF((IOSB(1).AND.1).NE.1) CALL EXIT(IOSB(1))
	CALL EXIT(1)
50	IF(OPTION(1:OPTLEN).EQ.BWRD(1:OPTLEN)) GOTO 60
	IF(OPTION(1:OPTLEN).NE.RWRD(1:OPTLEN)) GOTO 70
60	STS=SYS$ASSIGN(%DESCR(DEV(1:DEVLEN)),CHAN,,)
	IF((STS.AND.1).NE.1) CALL EXIT(STS)
	STS=SYS$QIOW(,%VAL(CHAN),%VAL(IO$_SKIPRECORD),IOSB,,,
     1		      %VAL(SPACNT),,,,,)
	IF((IOSB(1).AND.1).EQ.1.OR.IOSB(1).EQ.SS$ENDOFFILE) CALL EXIT(1)
	CALL EXIT(IOSB(1))
70	CALL EXIT('14'X)
	END
