.TITLE MSGGEN - MESSAGE TRAP ROUTINE .IDENT /02.00/ .LIST MEB .PSECT MSGGEN ; ; AUTHOR: H. L. COLEMAN ; MILLIKEN AND COMPANY ; P. O. BOX 1926 ; MAIL STOP M-103 ; SPARTANBURG, S. C. 29304 ; (803)573-2556 ; ; DATE: 23-JAN-78 ; ; VERSION: 02.00 ; ; MODIFIED: ; ; FUNCTION: THIS ROUTINE IS CALLED TO CONSTRUCT A MESSAGE FROM ; SEVERAL NON CONTIGUOUS PIECES, PRINT THE MESSAGE ON ; THE TERMINAL SPECIFIED, AND OPTIONALLY READ A RESPONSE ; FROM THAT TERMINAL. THE FORMAT OF THE MESSAGE IS: ; ; PREFIX < !WARNING!SERIOUS! FATAL !>TEXT [RESPONSE] ; ; EACH MESSAGE IS PRECEEDED BY A CARRIAGE RETURN LINE ; FEED, AND THE MESSAGE (OR RESPONSE) IS FOLLOWED BY ; A CARRIAGE RETURN LINE FEED. THE TERMINAL IS ATTACHED ; BEFORE THE MESSAGE IS WRITTEN AND DETACHED AFTER THE ; RETURNING TO THE USER IF IT WAS NOT ATTACHED PRIOR TO ; ENTRY. IF A REPLY IS REQUESTED, THE READ AFTER PROMPT ; I/O FUNCTION IS USED. ; ; TWO MACROS ARE PROVIDED TO INTERFACE WITH THIS ROUTINE. ; THE FIRST IS USED TO INITILIZE THIS ROUTINE OR TO CHANGE ; THE INITILIZATION PARAMETERS. THE FORMAT OF THIS MACRO ; IS: ; ; MINIT$S LUN,EFN ; ; EXPANSION: ; ; MOV LUN,$TMLUN ;SET LUN ; MOV EFN,$TMEFN ;SET EFN ; ; WHERE: ; ; LUN IS THE LOGICAL UNIT NUMBER WHICH IS ASSIGNED TO ; TO THE TERMINAL DEVICE ON WHICH MESSAGES ARE TO ; APPEAR. ; ; DEFAULT: 5 ; ; ; EFN IS AN EVENT FLAG NUMBER WHICH MAY BE USED BY THIS ; ROUTINE. ; ; DEFAULT: 24. ; ; IF THE DEFAULTS FOR LUN AND EFN ARE ACCEPTABLE, THE ; MINIT$ MACRO DOES NOT HAVE TO BE ISSUED. ; ; ; THE SECOND MACRO IS USED TO ISSUE THE TRAP INSTRUCTION ; AND GENERATE THE APPROPRIATE PARAMETER LIST. ; THE FORMAT OF THIS MACRO IS: ; ; MSGN$S [PFX],[SEV],[MSG],[REP],[LEN],[ERR] ; ; EXPANSION: ; ; JSR R5,$MSGEN ;GO TO MESSAGE GEN ROUTINE ; .WORD PFX ;A(MESSAGE PREFIX) ; .WORD SEV ;SEVERITY CODE ; .WORD MSG ;A(MESSAGE TEXT) ; .WORD REP ;A(REPLY AREA) ; .WORD LEN ;REPLY LENGTH ; BCC .+N ;BRANCH IF NO ERRORS ; CALL ERR ;CALL USER ERROR ROUTINE ; ; WHERE: ; ; PFX IS THE ADDRESS OF THE MESSAGE PREFIX. THE FORMAT ; OF THE MESSAGE PREFIX IS: ; ; .BYTE LEN ;LENGTH OF MESSAGE ; .ASCII /MESSAGE TEXT/ ; ; SEV IS THE SEVERITY LEVEL OF THIS MESSAGE. SEV MUST BE ; IN THE RANGE 0-3. THE VARIOUS SEVERITY LEVELS AND THEIR ; MEANINGS ARE: ; ; 0 - NO SEVERITY TEXT APPEARS IN MESSAGE. ; 1 - "WARNING", APPEARS IN MESSAGE. ; 2 - "SERIOUS" APPEARS IN MESSAGE ; 3 - "FATAL" APPEARS IN MESSAGE. ; ; MSG IS THE ADDRESS OF THE MESSAGE TEXT PROPER. THE ; FORMAT OF THE MESSAGE TEXT IS IDENTICAL TO THE MESSAGE ; PREFIX. ; ; REP IS THE ADDRESS OF THE REPLY BUFFER. IF REP IS ; SPECIFIED, THEN LEN MUST BE SPECIFIED, AND BE GREATER ; THAN ZERO. REP MUST BE ONE BYTE LONGER THAN LEN TO ALLOW ; FOR THE TERMINATOR (BINARY ZERO). ; ; LEN IS THE REPLY LENGTH. ; ; ; ERR IS THE ADDRESS OF THE ROUTINE TO BE GIVEN CONTROL ; IF ANY ERROR (RETURN WITH CS) IS DETECTED. IF NOT ; SPECIFIED, RETURN IS IN LINE. ; .PAGE .MCALL WSIG$S,QIOW$S,QIO$S $TMLUN::.WORD 5 ;LUN LUN=$TMLUN $TMEFN::.WORD 24. ;EVENT FLAG EFN=$TMEFN $TIOSB::.WORD 0,0 ;IOSB FOR TERMINAL I/O ATTFLG: .WORD 0 ;ATTACH FLAG BUF: .ASCII <15><12> ;MESSAGE BUFFER BUF1: .BLKW 66. WARN: .ASCII /WARNING / .ASCII /SERIOUS / .ASCII /*FATAL* / .PAGE ; ; MSGGEN ROUTINE ; ; FUNCTION: GENERATE AND PRINT THE MESSAGE, AND OPTIONALLY READ A ; RESPONSE. ; ; INPUT: ; ; R5+ 0 = A(PREFIX) ; R5+ 2 = SEVERITY CODE ; R5+ 4 = MESSAGE TEXT ; R5+ 6 = A(REPLY BUFFER) ; R5+10 = REPLY LENGTH ; ; OUTPUT: ; ; MESSAGE IS PRINTED, AND REPLY READ IF REQUESTED. ; ; IF CC, NO ERRORS DETECTED, $TIOSB CONTAINS STATUS OF IO.WLB ; OR IO.RPR. ; ; IF CS, ERROR DETECTED, $DSW OR $TIOSB CONTAINS ERROR STATUS. $MSGEN::CLR -(SP) ;CLEAR ERROR INDICATOR MOV R0,-(SP) ;SAVE REGISTERS MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV #BUF1,R0 ;R0 = A(MESSAGE BUFFER) MOV (R5)+,R1 ;R1 = A(MESSAGE PREFIX) BEQ 1200$ ;IF EQ, NO PREFIX MOVB (R1)+,R2 ;R2 = PREFIX LENGTH 1100$: MOVB (R1)+,(R0)+ ;MOVE PREFIX SOB R2,1100$ ;LOOP UNTIL DONE MOVB #' ,(R0)+ ;INSERT BLANK 1200$: MOV (R5)+,R1 ;R1 = SEVERITY LEVEL BEQ 1400$ ;IF EQ, LEVEL ZERO - NOTHING TO DO DEC R1 ;MINUS ONE ASL R1 ;TIMES 2 ASL R1 ;TIMES 4 ASL R1 ;TIMES 8 ADD #WARN,R1 ;R1 = A(SEVERITY TEXT) MOV #7,R2 ;R2 = COUNT 1300$: MOVB (R1)+,(R0)+ ;MOVE SEVERITY TEXT SOB R2,1300$ ;LOOP UNTIL DONE MOVB #' ,(R0)+ ;INSERT BLANK 1400$: MOV (R5)+,R1 ;R1 = A(MESSAGE TEXT) BEQ 1600$ ;IF EQ, NO TEXT MOVB (R1)+,R2 ;R2 = LENGTH 1500$: MOVB (R1)+,(R0)+ ;COPY MESSAGE TEXT SOB R2,1500$ ;LOOP UNTIL DONE 1600$: MOV (R5)+,R1 ;R1 = A(REPLY BUFFER) MOV (R5)+,R2 ;R2 = REPLY LENGTH SUB #BUF,R0 ;R0 = MESSAGE LENGTH QIOW$S #IO.ATT,LUN,EFN,,#$TIOSB ;ATTACH TERMINAL CLR ATTFLG ;CLEAR FLAG CMPB #IE.DAA,$TIOSB ;DEVICE ALREADY ATTACHED? BEQ 1700$ ;IF EQ, YES - DON'T DETACH WHEN THROUGH DEC ATTFLG ;SET FLAG 1700$: TST R1 ;REPLY REQUESTED? BNE 2000$ ;IF NE, YES - GO DO IT QIOW$S #IO.WVB,LUN,EFN,,#$TIOSB,,<#BUF,R0> ;SEND MSG. 1800$: BCC 2100$ ;IF CC, NO DIRECTIVE ERROR CMP #IE.UPN,$DSW ;INSUFFICIENT DYNAMIC MEMORY? BEQ 1900$ ;IE EQ, YES - TRY AGAIN BIS #1,10.(SP) ;SET CARRY IN RETURN PS BR 2300$ ;EXIT 1900$: WSIG$S ;REST A SECOND BR 1700$ ;TRY AGAIN 2000$: QIOW$S #IO.RPR,LUN,EFN,,#$TIOSB,, ;SEND MSG. BR 1800$ ;GO CHECK STATUS 2100$: TSTB $TIOSB ;SUCESSFULL? BPL 2200$ ;IF PL, YES - LEAVE CARRY CLEAR CMPB #IE.EOF,$TIOSB ;CTRL/Z ENTERED? BEQ 2200$ ;IF EQ, YES - CONSIDER SUCESSFULL BIS #1,10.(SP) ;SET CARRY IN RETURN PS 2200$: QIO$S #IO.WVB,LUN,,,,,<#BUF,#2> ;SEND CR/LF TST R1 ;REPLY REQUESTED? BEQ 2300$ ;IF EQ, NO ADD $TIOSB+2,R1 ;R1 = A(OF TERMINATOR) CLRB (R1) ;INSERT TERMINATOR INC $TIOSB+2 ;ACCOUNT FOR TERMINATOR IN LENGTH 2300$: QIOW$S #IO.DET,LUN,EFN ;DETACH TERMINAL MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 ROR (SP)+ ;SET CARRY IF ERROR OCCURED RTS R5 ;RETURN TO USER .END