;
; **********************************************************************
		.TITLE	REWIND
;
; this is a program to rewind a magtape from command line
; it works for both foreign and ansi tapes
;
;***********************************************************************
;
.LIBRARY /SYS$LIBRARY:LIB.MLB/
$DSCDEF
$FIBDEF
$DEVDEF
$SSDEF
.MACRO CHECK,?A
	BLBS	R0,A
	PUSHL	R0
	CALLS	#1,LIB$SIGNAL
A:
.ENDM
.PSECT DATA
FIB_DESC::	.LONG FIB$L_EXSZ
		.LONG FIB
FIB:	.BLKB FIB$L_EXSZ
DEV_DESC:	.LONG 4,DEV_CHAR
DEV_CHAR:	.LONG 0
IOSB::	.LONG 0,0
TAPECHAN::	.LONG 0
GETCMD: $CLIREQDESC-
		RQTYPE = CLI$K_GETCMD
DESCRIPTOR::	.BLKL 2
PROMPT: .ASCID /$_Device:/
;
; table to convert lower case letters to upper case
;
UPPER:
	.ASCII /.........	/	;hex 00-09
	.BYTE ^X0A,^X0B,^X0C,^X0D,^X0E,^X0F	;hex 0a-0f
	.ASCII /................/	;hex 10-1f
	.ASCII A !"#$%&'()*+,-./A	;hex 20-2f
	.ASCII /0123456789:;<=>?/	;hex 30-3f
	.ASCII /@ABCDEFGHIJKLMNO/	;hex 40-4f
	.ASCII /PQRSTUVWXYZ[\]^_/	;hex 50-5f
	.ASCII /`ABCDEFGHIJKLMNO/	;hex 60-6f
	.ASCII /PQRSTUVWXYZ{|}~./	;hex 70-7f
;
BUFFER::	.BLKB 30
.PSECT CODE
START::
	.WORD 0
	PUSHAB	W^GETCMD
	CALLS	#1,@CLI$A_UTILSERV(AP)
	MOVQ	W^GETCMD+CLI$Q_RQDESC,DESCRIPTOR
	TSTL	DESCRIPTOR
	BNEQ	GOT_IT
;
; prompt for it
;
	CLRQ	DESCRIPTOR
	MOVB	#DSC$K_CLASS_D,DESCRIPTOR+DSC$B_CLASS
	PUSHAL	PROMPT
	PUSHAL	DESCRIPTOR
	CALLS	#2,LIB$GET_INPUT
	CHECK
	CLRB	DESCRIPTOR+DSC$B_CLASS
	MOVZWL	DESCRIPTOR,R0
	MOVTC	R0,@DESCRIPTOR+4,#^A/./,UPPER,R0,BUFFER
	MOVAL	BUFFER,DESCRIPTOR+4
GOT_IT:
	$ASSIGN_S	DEVNAM=DESCRIPTOR,CHAN=TAPECHAN
	CHECK
	$GETCHN_S	CHAN=TAPECHAN,PRIBUF=DEV_DESC
	CHECK
	BITL	#DEV$M_SQD,DEV_CHAR
	BNEQ	1$
	BRW	NOT_TAPE
1$:	BITL	#DEV$M_FOR,DEV_CHAR
	BNEQ	FOREIGN
;
; if it is mounted foreign do a qio with func=rewind
; if it is an ansi tape do a qio with func=acp_control and cntrlfunc=rewind
;
	MOVW	#FIB$C_REWINDVOL,FIB+FIB$W_CNTRLFUNC
	$QIOW_S CHAN=TAPECHAN,IOSB=IOSB,FUNC=#IO$_ACPCONTROL,P1=FIB_DESC
	BRB	COMMON
FOREIGN:
	$QIOW_S	CHAN=TAPECHAN,IOSB=IOSB,FUNC=#IO$_REWIND!IO$M_NOWAIT
COMMON:
	CHECK
	CMPL	#SS$_NORMAL,IOSB
	BEQL	OK
	PUSHL	IOSB
	CALLS	#1,LIB$SIGNAL
OK:
	$DASSGN_S	CHAN=TAPECHAN
	RET
NOT_TAPE:
	PUSHL	#SS$_NOTSQDEV
	CALLS	#1,LIB$SIGNAL
	RET
.END START
