PROCEDURE ,010000 ;+ ; ABSTRACT: THIS MODULE USES MO.... TO DISPLAY ERROR ; MESSAGES FOR RUNOFF. This module will emulate ; the features of MO.... if it is built for ; RSX-11M or RSTS. ; ; WRITTEN: 15-JAN-80,-1.0.0-, HENRY R. TUMBLIN ; ; MODIFIED: ; ; VERIFIED: ;- .SBTTL MCALLS AND RUNOFF DEFINITIONS .MCALL DIR$,SAVE,UNSAVE,WTSE$S,EXIT$S .IF DF I$$AS!R$$11D .MCALL MOUT$,MODF$ MODF$ ; DEFINE MO.... SYMBOLS .IFF .MCALL QIOW$ .ENDC ;I$$AS!R$$11D .GLOBL APNDN ; CURRENT APPENDIX NUMBER .GLOBL CHPTN ; CURRENT CHAPTER NUMBER .GLOBL PAGCNT ; TOTAL PAGE COUNT .GLOBL PAGENO ; CURRENT PAGE NUMBER .GLOBL MOLUN ; LUN FOR MO.... .GLOBL RNOERR ; MODULE ENTRY POINT .SBTTL DATA AREA DATA RNOERD .IF DF I$$AS!R$$11D MOUT: MOUT$ RNOERF,PLIST,0,CONT,SY$STM,0,0,0,MOLUN .IFF QIOW: QIOW$ IO.WVB,5,30.,,,,<0,0,40,0,0,0> .ENDC ;I$$AS!R$$11D RNOERF: .WORD RFSZ,RFIL QIOSYM: .WORD QFSZ,QFIL RNOSTR: .WORD ERSZ,ERS JSTERR: .WORD JSTZ,JST RFIL: .ASCIZ "LB0:[1,2]RNOERR.MSG" RFSZ=.-RFIL QFIL: .ASCIZ "LB0:[1,2]QIOSYM.MSG" QFSZ=.-QFIL ERS: .ASCIZ "Command reads as [.%VA]" ERSZ=.-ERS JST: .ASCIZ "Line contains '%VA'" JSTZ=.-JST .EVEN PLIST: .BLKW 12. ; PARAMETER LIST PCANO: .BLKB 14. ; CHAPTER/APPENDIX-PAGE NUMBER .SBTTL START MAINLINE ; ALL ERROR DISPATCH IS ACCOMPLISHED VIA THE TRAP ; INSTRUCTION. ON ENTRY, THE TRAP CODE * 2 IS ; THE FIRST WORD ON THE STACK. FOLLOWED BY THE PS AND PC ; CODE RNOERR RNOERR: SAVE R0,R1,R2 ; SAVE OUR REGISTERS MOV 6(SP),R2 ; GET TRAP CODE ASR R2 ; Get message number CMP #EXIT,R2 ; EXIT ? BNE 3$ ; NE - SKIP EXIT CODE MOV PAGCNT,PLIST ; INC R2 ; Increment message number. MOV #RNOERF,R1 ; Point to file string. CALL OUTMO ; SEND TO MO.... EXIT$S ; EXIT GRACEFULLY(ALWAYS) 3$: CMP #TPAGES,R2 ; PAGE NUMBERS ? BNE 4$ ; NE - NO MOV PAGCNT,PLIST ; INC R2 ; Get message number MOV #RNOERF,R1 ; POINT TO RNO ERROR FILE CALL OUTMO ; SEND TO MO.... JMP RTNERR ; AND RETURN 4$: CMP #USRMSG,R2 ; User message (.MSG ) BNE 5$ ; NE - no MOV BF.LEN(R4),PLIST ; Get buffer length MOV BF.ADR(R4),PLIST+2 ; Get buffer address MOV #RNOERF,R1 ; Point to file string INC R2 ; Bump up counter CALL OUTMO ; Output the string JMP RTNERR ; Return to caller .SBTTL PROCESS MESSAGE 5$: BIT #FCSERR,R2 ; FCS ERROR ? BNE 40$ ; NE - YES, SET UP PLIST DIFFERENT ; DISPLAY THE CURRENT PAGE NUMBER MOV #PCANO,R0 ; POINT TO BUFFER MOV R0,PLIST ; ... MOV R0,PLIST+2 ; ... MOV APNDN,R2 ; GET APPENDIX # BEQ 10$ ; EQ - THEN CHECK CHAPTER ADD #100,R2 ; CONVERT TO ASCII CHARACTER MOVB R2,(R0)+ ; MOVE INTO POSITION BR 20$ ; GO TO COMMON CODE 10$: CLR R1 ; CLEAR TRASH MOVB CHPTN,R1 ; GET CHAPTER -> R1 BEQ 25$ ; EQ - THEN JUST PAGE # CLR R2 ; ZERO SUPPRESS CALL $CBDMG ; GET CHAPTER # 20$: MOVB #'-,(R0)+ ; INSERT A DASH 25$: MOV PAGENO,R1 ; GET PAGE # TSTEQ $NUMLW,26$ ; NUMBERS ON BOTTOM OF PAGE ? INC R1 ; ADD ONE TO IT 26$: CLR R2 ; SET ZERO SUPPRESS CALL $CBDMG ; CONVERT TO DECIMAL SUB #PCANO,R0 ; GET LENGTH MOV R0,PLIST ; SET LENGTH BR 50$ ; GO TO COMMON CODE 40$: MOV 14(SP),R0 ; GET FDB ADDRESS CLR R1 ; FOR SIGN EXTEND MOVB F.ERR(R0),R1 ; GET ERROR, SIGN EXTENDED MOV R1,PLIST ; MOVE INTO PARAMETER LIST 50$: MOV 6(SP),R2 ; GET TRAP CODE AGAIN ASR R2 ; GET MESSAGE NUMBER BIC #FTLERR!FCSERR,R2 ; CLEAR ANY INDICATORS INC R2 ; Get message number MOV #RNOERF,R1 ; POINT TO RNO ERROR FILE CALL OUTMO ; SEND TO MO.... BIT #FCSERR*2,6(SP) ; FCS ERROR ? BEQ 60$ ; EQ - NO MOV #QIOSYM,R1 ; POINT TO QIOSYM MOVB F.ERR(R0),R2 ; Get FCS error code. NEG R2 ; MAKE ERROR CODE POSITIVE TSTB F.ERR+1(R0) ; FCS OR DSW ? BEQ 55$ ; EQ - THEN IT'S FCS ADD #128.,R2 ; SET UP FOR A DSW ERROR 55$: CALL OUTMO ; SEND TO MO.... 60$: MOV 6(SP),R1 ; GET THE TRAP CODE. ASR R1 ; SHIFT BACK BIC #FCSERR!FTLERR,R1 ; CLEAR ERROR BITS ; Special processing -- Invalid command CLR R2 ; Indicate format string CMP #ILCMM,R1 ; Illegal command ? BNE 65$ ; NE - no MOV #RNOSTR,R1 ; Point to format string MOV CMBF+BF.ADR,PLIST+2 ; Point to error string MOV CMBF+BF.LEN,PLIST ; Set up for ; DEC PLIST ; Minus the CR BR 70$ ; Go to common code ; Special processing -- Unable to justify line 65$: CMP R1,#JUSRM1 ; Justify error ? BNE RTNERR ; NE - then skip it MOV #JSTERR,R1 ; Set format string MOV LOBUF+BF.ADR,PLIST+2 ; Point to error string MOV LOBUF+BF.LEN,PLIST ; Set up for ; Output the string to the user 70$: SUB #2,PLIST ; Length is actually 3 less CALL OUTMO ; SEND TO MO.... MOV CMBF+BF.ADR,CMBF+BF.PTR ; Reset command pointers RTNERR: UNSAVE R0,R1,R2 ; RESTORE REGISTERS BIT #FTLERR*2,(SP) ; FATAL ERROR ? BEQ 90$ ; EQ - NO JMP RUNOFF ; AND RESTART 90$: BIT #FCSERR*2,(SP)+ ; FCS ERROR ? BEQ 95$ ; EQ - NO, RETURN MOV 2(SP),4(SP) ; POP STACK MOV (SP)+,(SP) ; FOR FCS ARGUMENT 95$: RTI ; RETURN FROM TRAP .SBTTL INTERR -- SEVERE ERROR HANDLER INTERR:: DIAG SEVERR ; Severe error BPT ; obtain a crash dump .SBTTL OUTMO -- COMMON OUTPUT ROUTINE ;+ ; OUTMO -- Output an error message for RUNOFF. This procedure ; was designed for MO.... under IAS, but will work with ; RSX-11M and RSTS by emulating the execution of MO.... ; with $EDMSG and FCS. ; ; On entry: ; ; R1 = format string (or file string) ; R2 = record number in file to print, or 0 if R1 is ; a format string. ; OUTMO: .IF DF I$$AS!R$$11D ; If on IAS, use MO.... MOV R1,MOUT+M.OSTR ; Set the string. MOV R2,MOUT+M.ONUM ; And the numeric item. DIR$ #MOUT ; OUTPUT THE MESSAGE WTSE$S #30. ; WAIT FOR MO TO OUTPUT THE MESSAGE RETURN ; RETURN TO CALLER .IFF ; Otherwise, ... MOV R1,-(SP) ; SAVE R1 MOV (R1)+,QIOW+Q.IOPL+2 ; Set up length. MOV (R1)+,QIOW+Q.IOPL ; And buffer address. DIR$ #QIOW ; And do I/O (primitive, but effective) MOV (SP)+,R1 ; Recover R1 RETURN ; And return .ENDC ;I$$AS!R$$11D .END