	.PAGE
	.TITLE FTOUTPUT SUBROUTINE FOR WRITING OUTPUT BLOCKS.
	.IDENT	/30-APR-1984  V01.D/
;
;	V01.D	TWD	30-APR-1984	Add check of output device type to
;				see if the buffer should be truncated as with
;				a terminal or line printer.
;
;	Subroutine for writing completed blocks to the output device.
;	This handles both foreign tape and disk I/O.
;
;	Calling procedure is -
;		PUSHL	# Records in output block.
;		PUSHL	# Bytes remaining in output block.
;		CALLS	#2,^GFT_OUTPUT
;
;	REGISTER USAGE:
;	All registers are kept and used by this subroutine as they are used
;	in the calling routines.  The values in the FT control block are
;	also used.
;	Specific register usage:
;		R0 - Used for status from system I/O routines.
;		R1 - Used as a scratch register - points to the current RAB.
;		     The contents of R0 and R1 must be saved prior to calling
;		     this routine.
;		R2-R9 - Not used.
;		R10 - Pointer to FTCB.
;		R11 - Pointer to FTIO.
;
;
	FTCBDEF		; FT CONTROL BLOCK DEFINITIONS.
	$SSDEF
	$RABDEF
;
OUT_BYTE:	.LONG	0	; # BYTES WRITTEN TO FOREIGN TAPE.
;
	.PAGE
	.ENTRY	FT_OUTPUT,^M<>		; NO REGISTERS SAVED.
;
;		CHECK TO SEE IF THIS IS A FOREIGN TAPE OUTPUT OR NOT.
;		IF RMS, BRANCH TO THE PROPER PLACE TO START.
;
20$:	BBS	#FLAG_V_FTOUT,FTCB_W_FLAG(R10),30$
	BRB	RMS_OUT_PUT		; GO DO THE RMS WRITE.
;
;		WRITE THE BLOCK USING THE TAPE SUB CALL.
;
30$:	PUSHAL	FTCB+FTCB_Q_ISTAT	; PUSH THE ADDR. OF I/O STATUS BLOCK
	PUSHAL	OUT_BYTE			; PUSH THE ADDR OF THE # BYTES WRITTEN
	PUSHAL	FTCB+FTCB_L_ACT_OUTBLK	; PUSH ADDR. OF # BYTES TO WRITE.
	PUSHAL	FT_OUT_DATA		; ADDR. OF OUTPUT DATA.
	PUSHAL	FTCB+FTCB_L_OUTLUN	; ADDR. OF OUTPUT LOGICAL UNIT NUMBER.
	CALLS	#5,G^WITAPE
;
	BRW	FT_ERRORS		; CHECK ON THE ERRORS.
;
;
;		SET FLAG INDICATING THAT OUTPUT HAS JUST COMPLETED.
RESET:	BBSS	#FLAG_V_OUT_COMP,FTCB_W_FLAG(R10),5$	
;
5$:	INCL	FTCB_L_BLK_WRIT(R10)	; INCREMENT THE COUNT OF BLOCKS WRITTEN
;
	RET
;
	.PAGE
	.SUBTITLE USE THE RMS PUT TO GET THE DATA OUT.
;
RMS_OUT_PUT:
	MOVL	FTCB_L_OUT_RAB(R10),R1	; GET THE ADDRESS OF THE OUTPUT RAB.
;
;		CHECK THE "CHECK BUFFER" FLAG TO SEE IF THE BUFFER SIZE
;		SHOULD BE CHECKED FOR TERMINALS AND LINE PRINTERS.
;
	BBC	#FLAG_V_CKBUF,FTCB_W_FLAG(R10),30$	; IF CLEAR - CONTINUE.
	CMPW	FTCB_L_ACT_OUTBLK(R10),FTCB_W_OUT_BUF(R10)	; CHECK SIZE.
	BLEQ	30$			; IF SIZE IS OK, CONTINUE.
;
;		TRUNCATE THE SIZE OF THE RECORD TO BE WRITTEN TO THE
;		SIZE OF THE DEVICE'S BUFFER.
;
	MOVZWL	FTCB_W_OUT_BUF(R10),FTCB_L_ACT_OUTBLK(R10)
	BBCC	#DEFS_V_BUFMSG,FTCB_W_DEFS(R10),30$	; CHECK TO SEE IF
					; SHOULD BE WRITTEN - ONLY WRITE IT
					; ONCE PER EXECUTION.
;
	CALL_MSG	PUT_SYS,#FTC_BIGRECS,#0,#FTC_TRUNC,#1,-
			FTCB_L_ACT_OUTBLK(R10)		; WRITE TRUNC. MESSAGE
;
30$:	MOVW	FTCB_L_ACT_OUTBLK(R10),RAB$W_RSZ(R1)	; SET "RECORD" SIZE.
;
	$PUT	RAB=R1			; PUT THE RECORD.
;
	BLBS	R0,RESET		; IF OK, RETURN.
;
; 		EXIT WITH RMS STUFF.
	MOVAL	OUT_NAM,R1		; GET OUT NAM BLOCK
	MOVZBL	NAM$B_ESL(R1),TMP_LONG	; GET EXPANDED STRING LENGTH.
	CALL_MSG	EXIT_SYS,#FTC_RMSERROR,#4,MSG_13,MSG_13+4,-
		TMP_LONG,NAM$L_ESA(R1),R0,RAB$L_STV(R1)
;
	.PAGE
	.SUBTITLE HANDLE THE FT_ERRORS
;
FT_ERRORS:
	CMPL	#SS$_NORMAL,FTCB_Q_ISTAT(R10)	; CHECK FOR NORMAL.
	BNEQ	5$			; NON-NORMAL RETURN.
;
	BRW	RESET		; EVERYTHING OK!!
;
;		AN ERROR TO HANDLE.
;
5$:	CMPL	#10,FTCB_Q_ISTAT(R10)		; CHECK ON SYSTEM AND NON-
					; HANDLED ERRORS.
	BGTR	10$			; BRANCH TO HANDLE LESSER ERRORS.
;
; 		EXIT WITH ERROR MESSAGE.
7$:	CALL_MSG	EXIT_SYS,#FTC_FTERROR,#2,MSG_13,MSG_13+4,-
		#FTC_ERRCODE,#1,FTCB_Q_ISTAT(R10),FTCB_Q_ISTAT(R10)
;
;		LOOK FOR DATA CHECK AND E-O-T SPECIFICALLY.
;
10$:	CMPB	#5,FTCB_Q_ISTAT(R10)	; CHECK FOR DATA CHECK.
	BNEQ	30$			; NOT DATA CHECK - LOOK FOR MORE.
;
; 		DATA CHECK.
	CALL_MSG	EXIT_SYS,#FTC_FTERROR,#2,MSG_13,MSG_13+4,-
		#SS$_DATACHECK
;
;
30$:	CMPB	#3,FTCB_Q_ISTAT(R10)	; CHECK FOR END-OF-TAPE.
	BNEQ	7$			; SOME THING ELSE.
;
; 		E-O-T FOUND
	CALL_MSG	PUT_SYS,#FTC_FTEOT,#2,MSG_13,MSG_13+4,-
		#FTC_OPERTERM,#0
	CALLS	#0,G^FT_COP_MSG		; MESSAGE ABOUT THE COPY.
	CALLS	#0,G^FT_STOP		; EXIT FROM PROGRAM.
;
TMP_LONG:	.LONG	0
	.END
