	.TITLE	FTEXIT EXIT AND MESSAGE ROUTINES FOR FTCOPY.
	.IDENT	/01-MAY-1984  V01.D/
;
;	T.W. Danforth
;	V01.D	TWD	01-MAY-1984	Check the value of the 1st message to
;				see if it is the copyright notice and set the
;				message flags so that only the text is printed.
;	V01.B	TWD	12-DEC-1983	Remember to save R0 & R1 if this is
;				just a PUT_SYS since they may be needed by
;				FT_TRANS for a copy routine.
;	V01.A	initial release
;
;	These routines are combined into one object module to take
;	advantage of common code in the use of the PUTMSG system service.
;	The routines are EXIT_SYS which issues an error message and
;	exits the program, and PUT_SYS which puts an error message to the
;	user's message file (SYS$OUTPUT) and returns to the program.
;
;	There is the possibility of issuing messages, even though fatal, and
;	returning to the program to continue checking syntax and I/O
;	structure.
;
;	The routines are called by pushing any arguments onto the stack and
;	then branching to the routines.  It is assumed that the following
;	registers may contain useful information -
;		R10 - the address of the FTCB block.
;		R11 - the address of the FTIO block.
;		All other registers, except R0 and R1, are saved on entry into
;		this subroutine.  Usage of registers within this routine is:
;		R0 - Status from $PUTMSG.
;		R1 - Not used.
;		R2 - Not used.
;		R3 - Used to control return to calling routine or exit on error
;		R4 - Used as a counter of messages.
;		R5 - Used for index into arguments.
;		R6 - Used for a pointer into $PUTMSG arguments.
;		R7 - Used as an argument counter.
;		R8 - Not used.
;		R9 - Not used.
;		R10 - Pointer to FTCB.
;		R11 - Pointer to FTIO block.
;
;
	FTCBDEF
	$STSDEF
;
	.PAGE
	.SUBTITLE EXIT WITH SYSTEM SERVICE MESSAGE.
;
	.ENTRY EXIT_SYS,^M<R2,R3,R4,R5,R6,R7,R8,R9>
;
	MOVL	#1,R3		; SET FLAG FOR EXIT ??? POSSIBLE.
;
	BRW	SAVE_SEVERITY		; GO TO SAVE THE SEVERITY.
;
	.PAGE
	.SUBTITLE PUT A SYSTEM MESSAGE.
;
	.ENTRY PUT_SYS,^M<R2,R3,R4,R5,R6,R7,R8,R9>
;
	MOVQ	R0,SAVE_R0		; SAVE CONTENTS OF R0 & R1
	CLRL	R3		; CLEAR THE POSSIBLE EXIT FLAG.
;
SAVE_SEVERITY:
;
;		SAVE THE MOST SEVERE SEVERITY TO EXIT WITH THAT STATUS.
;
;		EXTRACT THE SEVERITY OF THE FIRST MESSAGE SO WE CAN
;		WORK WITH IT.
	EXTZV	#STS$V_SEVERITY,#STS$S_SEVERITY,4(AP),R2
;
;		COMPARE THE SEVERITY OF THE CURRENT MESSAGE WITH THE
;		SAVED VALUE.
;
	CMPB	R2,FTCB_L_SEVERITY(R10)
	BEQL	BLD_MSG			; IF EQUAL, NO CHANGE.
;
;		CHECK THE STATUS OF EACH FOR SUCCESS/INFO OR ERROR.
;
	BLBS	R2,20$		; CURRENT IS SUCCESS/INFO.  --  BRANCH
;
;		CURRENT IS ERROR  --  CHECK SAVED VALUE.
	BLBS	FTCB_L_SEVERITY(R10),15$	; BRANCH IF SUCCESS/INFO
	BRB	25$				; CHECK FURTHER.
;
;		WE NEED TO SAVE THE CURRENT VALUE.
;
15$:	MOVL	R2,FTCB_L_SEVERITY(R10)		; CURRENT VALUE SAVED.
	BRB	BLD_MSG			; GET OUT OF THIS MESS.
;
;
;		CURRENT IS SUCCESS/INFO - CHECK SAVED VALUE.
;
20$:	BLBC	FTCB_L_SEVERITY(R10),BLD_MSG	; IF CLEAR - GO BUILD MESSAGE.
;
;
;		NEED TO SAVE THE GREATEST VALUE OF CURRENT AND SAVED.
;
25$:	CMPB	R2,FTCB_L_SEVERITY(R10)		; WHICH IS GREATEST?
	BGTR	15$			; KEEP THE CURRENT VALUE.
;
;		KEEP THE OLD VALUE AND JUST CONTINUE.
;
;
	.PAGE
	.SUBTITLE START TO BUILD THE MESSAGE.
;
BLD_MSG:
	CLRW	ARG_COUNT
	MOVZWL	(AP),R4		; GET THE NUMBER OF ARGUMENTS.
	ADDL3	#4,AP,R5	; USE FOR INDEX INTO THE ARGUMENTS.
;
;		CHECK THE VALUE OF THE MESSAGE AND IF = FTC_NOTICE, SET THE
;		MESSAGE FLAGS FOR THIS RUN SO THAT ONLY THE TEXT IS SENT TO
;		SYS$ERROR OR SYS$OUTPUT.
;
	CMPL #FTC_NOTICE,(R5)	; THE MESSAGE IS THE FIRST IN THE ARG LIST.
	BNEQ	10$		; BRANCH AROUND IF NOT NOTICE.
	MOVW	#1,DEF_MSG_FLAG		; CHANGE THE DEFAULT.
;
10$:	MOVAL	MSG_1_ID,R6	; USE FOR INDEX INTO $PUTMSG ARGUMENTS.
;
;
;		CHECK THE FACILITY CODE TO DETERMINE HOW MANY MESSAGES TO
;		PUT TO THE OUTPUT DEVICE.
;
BLD_1:	CMPZV	#STS$V_FAC_NO,#STS$S_FAC_NO,(R5),#1	; ? SYSTEM, RMS, FTCOPY
	BGTR	FT_MSG			; AN FTCOPY MESSAGE - BRANCH.
	BLSS	SYS_MSG			; A SYSTEM MESSAGE - BRANCH
	BRW	RMS_MSG			; AN RMS MESSAGE
;
;
;		FTCOPY MESSAGE, MOVE THE ID INTO THE ARGUMENTS AND THEN
;		GET ANY FAO ARGUMENTS.  LOOP FOR EXTRA MESSGES.
;
FT_MSG:	JSB	MOV_ARG		; MOVE THE INITIAL MESSAGE.
;
	MOVL	(R5),R7		; GET COUNT OF FAO ARGUMENTS.
	JSB	MOV_ARG		; MOVE THE FAO COUNT.
;
;
;		SUBTRACT ONE FROM THE FAO COUNT AND MOVE IN AN ARGUMENT IF
;		ONE EXISTS.  LOOP THROUGH THIS DECREMENT UNTIL ALL ARGS.
;		ARE INTO THE $PUTMSG CALL.
;
MSG_LOOP:
	SOBGEQ	R7,5$		; IF >= 0, MOVE IN AN FAO ARGUMENT.
	BRB	MSG_COUNT	; BRANCH TO CHECK THE COUNT OF MESSAGES.
;
5$:	JSB	MOV_ARG		; MOVE AN FAO ARGUMENT.
	BRB	MSG_LOOP
;
;
;		SYSTEM MESSAGES - THIS DOES NOT GET FAO ARGUMENTS.
;
SYS_MSG:
	JSB	MOV_ARG		; MOVE THE SYSTEM MESSAGE ID.
;
;		CHECK TO SEE IF THERE ARE ANY MORE MESSAGES.
;
MSG_COUNT:
	TSTL	R4		; MORE MESSAGES?
	BEQL	PUT_MSG		; NO MORE - GO PUT THE MESSAGE.
	BRW	BLD_1		; MORE AVAILABLE.
;
;
;		RMS MESSAGES - JUST PUT THIS INTO THE $PUTMSG CALL
;		AND PUT THE MESSAGE.  CHECK LATER FOR ANOTHER MESSAGE.
;
RMS_MSG:
	JSB	MOV_ARG		; MOVE THE RMS MESSAGE.
	JSB	MOV_ARG		; MOVE THE STV VALUE FROM THE CALL.
;
;
;		PUT THE MESSAGE OUT AND THEN CHECK FOR MORE.
;
PUT_MSG:
	$PUTMSG_S	MSGVEC=ARG_COUNT
;
	BLBS	R0,10$		; PUT DONE OK?
;
	$EXIT_S	R0		; BAD PUT.
;
;		MORE MESSAGES?
10$:	CLRW	DEF_MSG_FLAG	; RESET THE MESSAGE FLAGS BACK TO ORIGINAL.
	TSTL	R4
	BEQL	20$		; NO MORE MESSAGES.
	BRW	BLD_1		; MORE AVAILABLE.
;
20$:	TSTL	R3		;CHECK FOR EXIT OR RETURN TO PROG.
	BNEQ	30$
;
	MOVQ	SAVE_R0,R0	; RESTORE CONTENTS OF R0 & R1 BEFORE RETURN.
	RET
;
30$:	CALLS	#0,G^FT_STOP	; CALL THE EXIT ROUTINE TO CLEAN UP.
;
	.PAGE
	.SUBTITLE SUBROUTINE FOR MOVING ARGUMENTS.
;
MOV_ARG:
	MOVL	(R5)+,(R6)+	; MOVE FROM THE AP INTO THE ARGUMENT LIST.
	INCW	ARG_COUNT	; INCREMENT ARGUMENT COUNTER.
	DECL	R4		; DECREMENT THE # OF SUBROUTINE ARGUMENTS.
	RSB
;
	.PAGE
	.SUBTITLE DATA FOR EXIT ROUTINE.
;
SAVE_R0:	.LONG	0	; SAVE FOR R0
		.LONG	0	; SAVE FOR R1
;
ARG_COUNT:	.WORD	0
DEF_MSG_FLAG:	.WORD	0
;
MSG_1_ID:	.BLKL	16	; BLOCK OF 16 LONG WORDS FOR THE $PUTMSG LIST.
;
TST_DESC:	.LONG	TST_LEN
		.LONG	TST_DESC+8
		.ASCII	/exit/
TST_LEN=.-TST_DESC-8
		.EVEN
MSG_DESC:	.LONG	MSG_LEN
		.LONG	MSG_DESC+8
		.ASCII	/message/
MSG_LEN=.-MSG_DESC-8
;
	.END
