.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 ; 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 ; 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