	.TITLE	TCOPY - TAPE COPY PROGRAM
	.IDENT	/3.13/


	.SUBTITLE MACRO AND SYMBOL DEFINITIONS
;*****************************************************************
;
; THIS PROGRAM WILL MAKE AN IDENTICAL COPY OF A MAGNETIC TAPE.
; IT COPIES PHYSICAL RECORDS USING A DOUBLE BUFFERING SCHEME.
; IT WILL STOP WHEN IT ENCOUNTERS A DOUBLE EOF, BUT WILL GIVE THE
; OPTION TO CONTINUE.  ALL ERRORS ARE REPORTED, BUT THE PROGRAM WILL
; GIVE THE OPTION TO CONTINUE IN SPITE OF ERRORS.
;
;*****************************************************************
;
; LOCAL MACRO DEFINITIONS
;
;*****************************************************************

	.MACRO	IFABORT	_DEST,?OKLBL
	BLBS	CONTINUE,OKLBL			;;;; IS ABORT FLAG ON?
	.IF	IDN,_DEST,RETURN
	RSB					;;;; YES - RETURN TO CALLER
	.IFF
	BRW	_DEST				;;;; YES - JUMP
	.ENDC
OKLBL:						;;;; NO - CONTINUE
	.ENDM


;*****************************************************************
;
; DEFINE MACRO SYMBOLS
;
;*****************************************************************

	$MTDEF					; MT$ SYMBOL DEFINITIONS
	$MNTDEF					; VOLUME MOUNT SYMBOL DEFINITIONS

	.PAGE
	.SUBTITLE I/O BUFFERS
;*****************************************************************
;
; THIS PSECT CONTAINS THE TWO I/O BUFFERS.
;
;*****************************************************************

	.PSECT	BUFFERS,NOEXE,PAGE

IO_BUF_SIZE=65534				; I/O BUFFER SIZE

	.ALIGN	PAGE
BUFFER1:
	.BLKB	IO_BUF_SIZE

	.ALIGN	PAGE
BUFFER2:
	.BLKB	IO_BUF_SIZE

	.PAGE
	.SUBTITLE READ/WRITE DATA
;*****************************************************************
;
; THIS PSECT CONTAINS READ/WRITE DATA
;
;*****************************************************************

	.PSECT	READ_WRITE,NOEXE

READ_EFN=1					; EVENT FLAG NUMBER USED FOR READS
WRITE_EFN=2					; EVENT FLAG NUMBER USED FOR WRITES

LF=^X0A						; LINE FEED CHARACTER
CR=^X0D						; CHARRIAGE RETURN CHARACTER
BELL=^X07					; FOR RINGING TERMINAL BELL 

PRINT_NUM_RECS:
	.BLKB	1				; PRINT NUMBER OF RECS IN EACH RECORD? Y/N

NUM_FILES:
	.BLKL	1				; NUMBER OF FILES TO COPY

FILES_READ:
	.LONG	1				; NUMBER OF FILES COPIED

READ_IO_STATUS_BLOCK:				; READ STATUS RETURN
	.BLKQ	1

WRITE_IO_STATUS_BLOCK:				; WRITE STATUS RETURN
	.BLKQ	1

FORCE_PROMPT:
	.LONG	1				; TO FORCE PROMPTING FROM LIB$GET_FOREIGN


; NOTE!!  THE CONTENTS OF THE FOLLOWING TWO POINTERS ARE EXCHANGED
; AFTER EACH READ!!

IN_BUF_PTR:
	.ADDRESS BUFFER1			; INPUT BUFFER POINTER
OUT_BUF_PTR:
	.ADDRESS BUFFER2			; OUTPUT BUFFER POINTER


READ_CHAN:
	.BLKL	1				; READ I/O CHANNEL NUMBER

WRITE_CHAN:
	.BLKL	1				; WRITE I/O CHANNEL NUMBER

CONTINUE:
	.LONG	1				; CONTINUE FLAG: 1=CONTINUE, 0=ABORT

READ_LENGTH:
	.BLKL	1				; NUMBER OF BYTES LAST READ

WRAPUP_ACTION_DESCR:				; DESCRIPTOR OF WRAPUP_ACTION
	.LONG	1
	.ADDRESS WRAPUP_ACTION

WRAPUP_ACTION:
	.BLKB	1

INDEV_DESCR:					; DESCRIPTOR OF INPUT DEVICE REPLY STRING
	.LONG	20				; LENGTH OF NAME
	.ADDRESS INDEV				; ADR OF NAME

INDEV:	.BLKB	20				; INPUT DEVICE NAME

OUTDEV_DESCR:					; DESCRIPTOR OF OUTPUT DEVICE REPLY STRING
	.LONG	20				; LENGTH OF NAME
	.ADDRESS OUTDEV				; ADR OF NAME

OUTDEV:	.BYTE	^A/ /[20]			; OUTPUT DEVICE NAME (INIT TO BLANKS)

PRINT_NUM_RECS_LEN:
	.BLKW	1				; LENGTH LENGTH OF REPLY

NUM_FILES_REPLY:
	.BLKB	8				; PUT ASCII REPLY HERE

NUM_FILES_LEN:
	.BLKL	1				; NUM CHARS PUT IN NUM_FILES_REPLY

OUT_DENS_DESCR:					; DESCRIPTOR OF OUTPUT_DENSITY
	.LONG	4
	.ADDRESS OUTPUT_DENSITY

OUTPUT_DENSITY:					; ACTUAL DENSITY
	.ASCII	/    /

OUT_DENS_PROMPT:				; PROMPT DESCRIPTOR
	.LONG	ODP_END-OUT_DENS_PROMPT-8	; PROMPT LENGTH
	.ADDRESS .+4				; PROMPT ADDRESS
	.ASCII	<BELL>/** CAUTION ** Be sure output tape density is set to software /
	.ASCII	<CR><LF>/select or the correct density before continuing!/
	.ASCII	<CR><LF>/Enter output tape density [D: /
IN_DENS:					; FILL IN INPUT DENSITY AS DEFAULT
	.BLKB	4
	.ASCII	/]: /				; REST OF PROMPT
ODP_END:

SET_MODE_CHAR_BUF:				; CHARACTERISTICS TO BE SET
	.LONG	4				;   BUFFER LENGTH
	.BLKL	1				;   BUFFER CONTENTS

NUMBER_OF_EOFS:
	.BYTE	0				; COUNTS NUMBER OF CONSECUTIVE EOFS

NUMBER_OF_RECORDS:
	.LONG	0				; NUMBER OF RECORDS IN EACH FILE

BUFFER_DESCR:					; DESCRIPTOR OF UNFORMATTED BUFFER
	.LONG	80
	.ADDRESS FORMATTED_BUFFER

FORMATTED_BUFFER:
	.BLKB	80

FORMATTED_DESCR:				; DESCRIPTOR OF FORMATTED OUTPUT
	.BLKW	1				; LENGTH OF FORMATTED OUTPUT
	.BLKW	1				; UNUSED
	.ADDRESS FORMATTED_BUFFER

IN_MOUNT_LIST:					; ITEM LIST FOR MOUNTING INPUT DEVICE
	.BLKW	1				; LENGTH OF INPUT DEVICE NAME (FILLED IN LATER)
	.WORD	MNT$_DEVNAM			; DEVICE NAME CODE
	.ADDRESS INDEV				; LOCATION OF INPUT DEVICE NAME
	.LONG	0				; UNUSED

	.WORD	4				; FLAGS LENGTH
	.WORD	MNT$_FLAGS			; MOUNT FLAGS CODE
	.ADDRESS IN_MOUNT_FLAGS			; ADR OF FLAGS
	.LONG	0				; UNUSED

	.WORD	4				; BLOCKSIZE LENGTH
	.WORD	MNT$_BLOCKSIZE			; BLOCKSIZE CODE
	.ADDRESS MOUNT_BLOCKSIZE		; ADR OF BLOCKSIZE
	.LONG	0				; UNUSED

	.WORD	IN_COMMENT_LEN			; LENGTH OF MOUNT COMMENT
	.WORD	MNT$_COMMENT			; MOUNT COMMENT FLAG
	.ADDRESS IN_COMMENT			; ADR OF COMMENT
	.LONG	0				; UNUSED
	.LONG	0				; END OF LIST

OUT_MOUNT_LIST:					; ITEM LIST FOR MOUNTING OUTPUT DEVICE
	.BLKW	1				; LENGTH OF OUTPUT DEVICE NAME (FILLED IN LATER)
	.WORD	MNT$_DEVNAM			; DEVICE NAME CODE
	.ADDRESS OUTDEV				; LOCATION OF OUTPUT DEVICE NAME
	.LONG	0				; UNUSED

	.WORD	4				; FLAGS LENGTH
	.WORD	MNT$_FLAGS			; MOUNT FLAGS CODE
	.ADDRESS OUT_MOUNT_FLAGS		; ADR OF FLAGS
	.LONG	0				; UNUSED

	.WORD	4				; BLOCKSIZE LENGTH
	.WORD	MNT$_BLOCKSIZE			; BLOCKSIZE CODE
	.ADDRESS MOUNT_BLOCKSIZE		; ADR OF BLOCKSIZE
	.LONG	0				; UNUSED

	.WORD	OUT_COMMENT_LEN			; LENGTH OF MOUNT COMMENT
	.WORD	MNT$_COMMENT			; MOUNT COMMENT FLAG
	.ADDRESS OUT_COMMENT			; ADR OF COMMENT
	.LONG	0				; UNUSED
	.LONG	0				; END OF LIST

IN_COMMENT:
	.ASCII	/Please mount input tape for TCOPY on /
IN_COMMENT_DEV:
	.BLKB	5				; NAME OF DRIVE GOES HERE
IN_COMMENT_LEN=.-IN_COMMENT

OUT_COMMENT:
	.ASCII	/Please mount output tape for TCOPY on /
OUT_COMMENT_DEV:
	.BLKB	5				; NAME OF DRIVE GOES HERE
OUT_COMMENT_LEN=.-OUT_COMMENT

CONT_REPLY:
	.ASCID	/ /				; FOR THE Y OR N

	.PAGE
	.SUBTITLE READ ONLY DATA
;*****************************************************************
;
; READ ONLY DATA
;
;*****************************************************************

	.PSECT	READ_ONLY,NOEXE,NOWRT

WRAPUP_PROMPT_DESCR:				; DECRIPTOR OF WRAPUP_PROMPT
	.LONG	WRAPUP_PROMPT_LEN
	.ADDRESS WRAPUP_PROMPT

WRAPUP_PROMPT:
	.ASCII	<CR><LF>/Type one of the following numbers to indicate /
	.ASCII	<CR><LF>/what you want done with the tapes:/
	.ASCII	<CR><LF><LF>/  1 - Rewind input, Dismount output (default)/
	.ASCII	<CR><LF>/  2 - Dismount both tapes/
	.ASCII	<CR><LF>/  3 - Rewind both tapes and leave online/
	.ASCII	<CR><LF>/  4 - Leave tapes at current positions /
WRAPUP_PROMPT_LEN=.-WRAPUP_PROMPT		; LENGTH OF WRAPUP_PROMPT

IN_REWIND_ERROR:
	.ASCID	<CR><LF>/Error while rewinding input tape/

OUT_REWIND_ERROR:
	.ASCID	<CR><LF>/Error while rewinding output tape/

IN_DISMOUNT_ERROR:
	.ASCID	<CR><LF>/Error while dismounting input tape/

OUT_DISMOUNT_ERROR:
	.ASCID	<CR><LF>/Error while dismounting output tape/

IN_DEASSIGN_ERROR:
	.ASCID	<CR><LF>/Error while deassiging input tape/

OUT_DEASSIGN_ERROR:
	.ASCID	<CR><LF>/Error while deassiging output tape/

WELCOME_MSG:
	.ASCID	<CR><LF>/TCOPY - TAPE COPY PROGRAM/

IN_DEV_PROMPT:
	.ASCID	<CR><LF>/Enter input device [D: IN - MFA0:, OUT - MMA0:]: /

MFA0:	.ASCII	/MFA0:/
MFA0_LEN=.-MFA0

MMA0:	.ASCII	/MMA0:/
MMA0_LEN=.-MMA0

OUT_DEV_PROMPT:
	.ASCID	/Enter output device (Eg. MMA0:): /

OUT_DEV_ERROR:
	.ASCID	<CR><LF>/Input and output devices must be different/


PRINT_NUM_RECS_DESCR:				; DESCRIPTOR OF REPLY STRING
	.LONG	1				; LENGTH OF REPLY STRING
	.ADDRESS PRINT_NUM_RECS			; ADR OF REPLY STRING

PRINT_NUM_RECS_PROMPT:
	.ASCID	#Print number of records in each file? (Y/N) [D: N] #

NUM_FILES_DESCR:				; DESCRIPTOR OF REPLY STRING
	.LONG	8				; LENGTH OF REPLY STRING
	.ADDRESS NUM_FILES_REPLY		; ADR OF REPLY STRING

NUM_FILES_PROMPT:
	.ASCID	/How many (more) files do you want to copy? [D: All files] /

IN_ASN_MSG:
	.ASCID	<CR><LF>#Error while assigning I/O channel to input device:#

OUT_ASN_MSG:
	.ASCID	<CR><LF>#Error while assigning I/O channel to output device:#

SENSE_MODE_ERROR:
	.ASCID	<CR><LF>/Error while reading input tape characteristics:/

OUTPUT_SENSE_MODE_ERROR:
	.ASCID	<CR><LF>/Error while reading output tape characteristics:/

SET_MODE_ERROR:
	.ASCID	<CR><LF>/Error while setting output tape characteristics:/

BAD_DENSITY:
	.ASCID	/Illegal density.  Legal values are 6250, 1600 and 800./

READ_ERROR:
	.ASCID	<CR><LF>/Read error:/

WRITE_ERROR:
	.ASCID	<CR><LF>/Write error:/

DOUBLE_EOF_MSG:
	.ASCID	<CR><LF>/Double EOF encountered on input tape.  Possible end of data./

NUM_RECS_MSG:
	.ASCID	/File number !UL contained !UL record!%S./
IN_MOUNT_FLAGS:
	.LONG	<MNT$M_FOREIGN!MNT$M_NOWRITE>	; INPUT FLAGS

OUT_MOUNT_FLAGS:
	.LONG	MNT$M_FOREIGN			; OUTPUT FLAGS

MOUNT_BLOCKSIZE:
	.LONG	IO_BUF_SIZE			; IO BLOCK SIZE

IN_MOUNT_ERROR:
	.ASCID	<CR><LF>/Error mounting input tape/

OUT_MOUNT_ERROR:
	.ASCID	<CR><LF>/Error mounting output tape/

CONT_MSG:
	.ASCID	%Do you want to continue? (Y/N) [D: N] %

	.PAGE
	.SUBTITLE AA - MAIN CODE
;*****************************************************************
;
; BACK TO OUR MAIN PSECT
; START OF CODE
;
;*****************************************************************

	.PSECT

TCOPY::	.WORD	0

	JSB	BA_SETUP			; SET THINGS UP FOR THE COPY
	IFABORT	AA_EXIT
	JSB	BB_COPY				; COPY THE TAPE
AA_EXIT:
	JSB	BC_WRAPUP			; CLEAN THINGS UP
	$EXIT_S					; TELL VMS WE WANT TO STOP

	.PAGE
	.SUBTITLE BA - SETUP
;*****************************************************************
;
; SETUP SUBROUTINE - 
;	GET PARAMETERS FROM USER
;	INITIALIZE I/O DEVICES
;	INITIALIZE INPUT BUFFER
;
;*****************************************************************

BA_SETUP:

	JSB	CA_PRINT_WELCOME_MESSAGE	; TELL USER WHO WE ARE

	JSB	CB_GET_INPUT_DEVICE		; GET INPUT DEVICE NAME

	JSB	CC_GET_OUTPUT_DEVICE		; GET OUTPUT DEVICE NAME
	IFABORT	RETURN

	JSB	CD_GET_PRINT_NUM_RECS		; PRINT NUMBER OF RECORDS?

	JSB	CE_GET_NUM_FILES		; GET NUMBER OF FILES TO COPY

	JSB	CF_ASSIGN_CHANNELS		; ASSIGN CHANNELS TO I/O TAPES
	IFABORT	RETURN

	JSB	CM_MOUNT_TAPES			; MOUNT TAPES
	IFABORT	RETURN

	JSB	CH_READ				; INITIALIZE INPUT BUFFER
	IFABORT	RETURN
	JSB	CJ_READ_WAIT			; WAIT FOR READ TO COMPLETE
	IFABORT	RETURN

	JSB	CG_SET_OUTPUT_DENSITY		; SET DENSITY OF OUTPUT DRIVE

	RSB					; RETURN TO CALLER

	.PAGE
	.SUBTITLE BB - COPY TAPES
;*****************************************************************
;
; COPY SUBROUTINE - COPY THE TAPES
;
;*****************************************************************

BB_COPY:
	JSB	CI_WRITE			; START A WRITE
	IFABORT	RETURN
	JSB	CH_READ				; START A READ
	IFABORT	RETURN
	JSB	CK_WRITE_WAIT			; WAIT FOR THE WRITE TO COMPLETE
	IFABORT	RETURN
	JSB	CJ_READ_WAIT			; WAIT FOR THE READ TO COMPLETE
	IFABORT	RETURN
	JSB	CL_EOF_CHECK			; CHECK FOR EOFS
	IFABORT	RETURN

	CMPL	FILES_READ,NUM_FILES		; HAVE WE READ ENOUGH YET?
	BLEQ	BB_COPY				; NO - DO IT AGAIN
	RSB					; YES - RETURN TO CALLER

	.PAGE
	.SUBTITLE BC - WRAPUP
;*****************************************************************
;
; WRAP THINGS UP AND STOP THIS PROGRAM
;
;*****************************************************************

BC_WRAPUP:

	PUSHAL	FORCE_PROMPT			; ALWAYS PROMPT
	PUSHAL	WRAPUP_ACTION_DESCR		; WHERE TO PUT ANSWER LENGTH
	PUSHAQ	WRAPUP_PROMPT_DESCR		; PROMPT
	PUSHAQ	WRAPUP_ACTION_DESCR		; DECRIPTION OF ANSWER BUFFER
	CALLS	#4,G^LIB$GET_FOREIGN		; WHAT TO DO WITH THE TAPE?

	CMPB	#^A/ /,WRAPUP_ACTION		; DEFAULT ACTION? (#1)
	BNEQU	BC_CASE				; NO
	MOVB	#^A/1/,WRAPUP_ACTION		; YES - MAKE ACTION "1"

BC_CASE:
	CASEB	WRAPUP_ACTION,#^A/1/,#3		; GO TO PROPER SECTION
BC_CASE_TBL:
	.WORD	BC_CASE_1-BC_CASE_TBL		; IF 1
	.WORD	BC_CASE_2-BC_CASE_TBL		; IF 2
	.WORD	BC_CASE_3-BC_CASE_TBL		; IF 3
	.WORD	BC_CASE_4-BC_CASE_TBL		; IF 4
	BRB	BC_WRAPUP			; ASK AGAIN IF NONE OF THE ABOVE

BC_CASE_1:
	JSB	BC_REWIND_IN			; OPTION 1 - REWIND IN, DISMOUNT OUT
	JSB	BC_DEASSIGN_BOTH
	JSB	BC_DISMOUNT_OUT
	BRB	BC_EXIT

BC_CASE_2:
	JSB	BC_DEASSIGN_BOTH		; OPTION 2 - DISMOUNT BOTH
	JSB	BC_DISMOUNT_IN
	JSB	BC_DISMOUNT_OUT
	BRB	BC_EXIT

BC_CASE_3:
	JSB	BC_REWIND_IN			; OPTION 3 - REWIND BOTH
	JSB	BC_REWIND_OUT
	JSB	BC_DEASSIGN_BOTH
	BRB	BC_EXIT

BC_CASE_4:
	JSB	BC_DEASSIGN_BOTH		; OPTION 4 - LEAVE BOTH TAPES ALONE

BC_EXIT:
	$EXIT_S					; TELL VMS WE WANT TO STOP


;*****************************************************************
;
; MINI-SUBROUTINES USED BY BC_WRAPUP
;
;*****************************************************************

BC_REWIND_IN:
	$QIO_S	EFN=#READ_EFN,-			; REWIND INPUT TAPE
		FUNC=#IO$_REWIND,-
		CHAN=READ_CHAN,-
		IOSB=READ_IO_STATUS_BLOCK
	BLBS	R0,10$				; DID REWIND GO OK?
	MOVAL	IN_REWIND_ERROR,R1		; NO - GET OUR ERROR MESSAGE
	JSB	DA_ERROR			; ASK USER WHAT TO DO
10$:	RSB					; RETURN TO CALLER

;*****************************************************************

BC_REWIND_OUT:
	$QIO_S	EFN=#WRITE_EFN,-		; REWIND OUTPUT TAPE
		FUNC=#IO$_REWIND,-
		CHAN=WRITE_CHAN,-
		IOSB=WRITE_IO_STATUS_BLOCK
	BLBS	R0,10$				; DID REWIND GO OK?
	MOVAL	OUT_REWIND_ERROR,R1		; NO - GET OUR ERROR MESSAGE
	JSB	DA_ERROR			; ASK USER WHAT TO DO
10$:	RSB					; RETURN TO CALLER

;*****************************************************************

BC_DEASSIGN_BOTH:
	$DASSGN_S CHAN=READ_CHAN		; DEASSIGN INPUT CHANNEL
	BLBS	R0,BC_DEASSIGN_OUT		; DID DEASSIGN GO OK?
	MOVAL	IN_DEASSIGN_ERROR,R1		; NO - GET OUR ERROR MESSAGE
	JSB	DA_ERROR			; ASK USER WHAT TO DO
BC_DEASSIGN_OUT:
	$DASSGN_S CHAN=WRITE_CHAN		; DEASSIGN OUTPUT CHANNEL
	BLBS	R0,10$				; DID DEASSIGN GO OK?
	MOVAL	OUT_DEASSIGN_ERROR,R1		; NO - GET OUR ERROR MESSAGE
	JSB	DA_ERROR			; ASK USER WHAT TO DO
10$:	RSB					; RETURN TO CALLER

;*****************************************************************

BC_DISMOUNT_IN:
	$DISMOU_S INDEV_DESCR			; DISMOUNT INPUT TAPE
	BLBS	R0,10$				; DID DISMOUNT GO OK?
	MOVAL	IN_DISMOUNT_ERROR,R1		; NO - GET OUR ERROR MESSAGE
	JSB	DA_ERROR			; ASK USER WHAT TO DO
10$:	RSB					; RETURN TO CALLER

;*****************************************************************

BC_DISMOUNT_OUT:
	$DISMOU_S OUTDEV_DESCR			; DISMOUNT OUTPUT TAPE
	BLBS	R0,10$				; DID MOUNT GO OK?
	MOVAL	OUT_DISMOUNT_ERROR,R1		; NO - GET OUR ERROR MESSAGE
	JSB	DA_ERROR			; ASK USER WHAT TO DO
10$:	RSB					; RETURN TO CALLER

	.PAGE
	.SUBTITLE CA - PRINT WELCOME MESSAGE
;*****************************************************************
;
; PRINT WELCOME MESSAGE
;
;*****************************************************************

CA_PRINT_WELCOME_MESSAGE:

	PUSHAL	WELCOME_MSG
	CALLS	#1,G^LIB$PUT_OUTPUT		; WELCOME MESSAGE
	RSB

	.PAGE
	.SUBTITLE CB - GET INPUT DEVICE
;*****************************************************************
;
; CB_GET_INPUT_DEVICE
;
; IF DEFAULT IS RETURNED, THEN SET INPUT TO MFA0 AND OUTPUT TO MMAO
;
;*****************************************************************

CB_GET_INPUT_DEVICE:

	PUSHAL	FORCE_PROMPT			; ALWAYS PROMPT
	PUSHAL	INDEV_DESCR			; WHERE TO PUT ANSWER LENGTH
	PUSHAQ	IN_DEV_PROMPT			; WHAT TO PROMPT
	PUSHAQ	INDEV_DESCR			; WHERE TO PUT ANSWER
	CALLS	#4,G^LIB$GET_FOREIGN		; GET INDEV

	TSTL	INDEV_DESCR			; DEFAULT?
	BNEQ	CB_EXIT				; NO - USE WHAT WE HAVE

	MOVC3	#MFA0_LEN,MFA0,INDEV		; DEFAULT INPUT DEVICE
	MOVL	#MFA0_LEN,INDEV_DESCR		; DEFAULT INPUT DEVICE'S LENGTH
	MOVC3	#MMA0_LEN,MMA0,OUTDEV		; DEFAULT OUTPUT DEVICE
	MOVL	#MMA0_LEN,OUTDEV_DESCR		; DEFAULT OUTPUT DEVICE'S LENGTH

CB_EXIT:
	RSB

	.PAGE
	.SUBTITLE CC - GET OUTPUT DEVICE
;*****************************************************************
;
; CC_GET_OUTPUT_DEVICE
;
; IF OUTDEV IS NOT BLANKS, THEN WE PROBABLY GOT THE DEVICE AS
; DEFAULT FROM CB_GET_INPUT_DEVICE.
;
;*****************************************************************

CC_GET_OUTPUT_DEVICE:

	CMPL	#^A/    /,OUTDEV		; IS IT BLANK?
	BNEQU	CC_CHECK_FOR_SAME		; NO - LEAVE IT AS IS

CC_ASK_AGAIN:
	PUSHAL	FORCE_PROMPT			; ALWAYS PROMPT
	PUSHAL	OUTDEV_DESCR			; WHERE TO PUT ANSWER LENGTH
	PUSHAQ	OUT_DEV_PROMPT			; WHAT TO SAY
	PUSHAQ	OUTDEV_DESCR			; WHERE TO PUT ANSWER
	CALLS	#4,G^LIB$GET_FOREIGN		; GET OUTDEV

CC_CHECK_FOR_SAME:
	CMPC5	INDEV_DESCR,INDEV,#^A/ /,-	; ARE IN AND OUT DIFFERENT?
		OUTDEV_DESCR,OUTDEV
	BNEQU	CC_EXIT				; YES - THATS WHAT