; ERROVL - ERROR AND TRACE PROCESSING OVERLAY FOR CLONE ; LAST EDIT: 19-NOV-81 ; .NLIST .LIST TTM .NLIST BEX .TITLE ERROVL .LIST ; .PSECT ERROVL ; ; ERROR PROCESSOR ROUTINE ; ENTERED WITH CODE ON TOP OF STACK ; NEGATIVE CODES ARE INTERPRETED AS RSX ERRORS AND THE CODE ; IS PRINTED. POSITIVE ERROR CODES INDEX THE ERROR MESSAGE ; TABLE. ; ; ; THE FOLLOWING TABLE DEFINES THE MESSAGE STRING ADDRESSES ; IF A NEW MESSAGE IS ADDED IT MAY REQUIRE LENGTHENING NERRMS=30. ERMSTB: .BLKW NERRMS ; .MACRO ERRMES SYMBOL,STRING .IF LT .ERROR ;ERROR TABLE OVERFLOW .ENDC SYMBOL==$NERR $SAVE=. .=ERMSTB+<$NERR*2> .WORD $SAVE .=$SAVE .ASCIZ /STRING/ $NERR=$NERR+1 .ENDM ; $NERR=0 ; ERRMES E.MSQ, ERRMES E.IDP, ERRMES E.ISM, ERRMES E.OPP, ERRMES E.SYN, ERRMES E.ITC, ERRMES E.UND, ERRMES E.END, ERRMES E.VDB, ERRMES E.BOO, ERRMES E.THEN, ERRMES E.ELSE, ERRMES E.IMAC, ERRMES E.FILE, ERRMES E.STAK, ERRMES E.RUN, ERRMES E.GET, ERRMES E.IIV, ERRMES E.NSF, ERRMES E.BFS, ERRMES E.EOF, ERRMES E.BSS, ERRMES E.SPA, ERRMES E.ARG, ERRMES E.FUN, ERRMES E.BFA, ERRMES E.TMFA, ; .EVEN ; ; ERROR:: MOV 2(SP),ERRCD MOV (SP)+,(SP) ;POP CODE MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV 6(SP),R1 ;GET ADDRESS OF CALLER MOV #ERRADR,R0 ;CONVERSION BUFFER MOV #1,R2 ;DONT SUPPRESS LEADING ZEROS CALL $CBOMG ;CONVERT ADDRESS OF ERROR CALL MOV #ERRMES,R2 CALL OUTP ;PRINT INITIAL MESSAGE MOV ERRCD,R2 BMI RSXERR ;SYSTEM ERROR CODE ASL R2 ;FORM WORD OFFSET MOV ERMSTB(R2),R2 ;GET STRING ADDRESS CALL OUTC ;PRINT IT CALL TRACE ;PRINT OFFENDING LINE CALL CPOINT ;AND CHARACTER POINTER ; ERREX: MOV STREAM,R1 BEQ 1$ ;SKIP IF NO STREAM MOV #EX.ERR,EXEC ;SET EXECUTION STATUS MOV #EX.ERR,SL.EXS(R1); IN CASE WE ARE ON THE SYSTEM STACK 1$: MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; RSXERR: MOV #RSXNUM,R0 ;POINT TO CONVERSION BUFFER MOV R2,R1 ;ERROR CODE TO CONVERT CLR R2 ;NO LEADING ZERO SUPPRESSION CALL $CBDSG ;CONVERT BINARY TO DECIMAL SIGNED CLRB (R0) ;TERMINATE STRING MOV #RSXMES,R2 CALL OUTC BR ERREX ; ; CPOINT - DISPLAY CHARACTER POINTER UNDER CURRENT LINE ; CPOINT::MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV STREAM,R1 ;GET STREAM POINTER BEQ 5$ ;SKIP IF NULL MOV SL.CLH(R1),R2 ;GET CONTROL DESCRIPTOR BEQ 5$ ;SKIP IF NULL MOV CD.CMA(R2),R1 ;POINT TO CURRENT LINE BEQ 5$ ;SKIP IF NONE TST CD.FID(R2) ;FILE INPUT BNE 1$ ;IF SO NO BUFFER HEADER ADD #10,R1 ;ELSE SKIP HEADER 1$: MOV CD.CHP(R2),R2 ;GET CHARACTER POINTER CLR R0 ;INIT LINE OFFSET 2$: TSTB (R1) ;END OF LINE ? BEQ 3$ INC R0 ;ASSUME SINGLE CHAR CMPB (R1)+,#TAB ;BUT WAS IT A TAB ? BNE 4$ ;IF NOT NO PROBS ADD #7,R0 ;OTHERWISE GO A BIT FURTHER 4$: SOB R2,2$ ;LOOP TO END OF LINE OR CHP. ; 3$: MOVB #'^,EMPTY(R0) ;SET MARKER CLRB EMPTY+1(R0) MOV #EMPTY,R2 CALL OUT ;PRINT MARKER LINE MOVB #' ,EMPTY(R0) ;AND RESET MARKER MOVB #' ,EMPTY+1(R0) 5$: MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; ; CR=15 TAB=11 LF=12 SPACH=40 ERRMES: .ASCII /CLONE - ** ERROR ** AT / ERRADR: .ASCIZ / / EMPTY: .REPT 80. .BYTE SPACH .ENDR ; RSXMES: .ASCII /RSX SYSTEM ERROR / RSXNUM: .BLKB 6 .EVEN ERRCD: .WORD 0 ; ; ; TRACE - ROUTINE TO PRINT THE CURRENT LINE ; TRACE:: MOV R1,-(SP) MOV R2,-(SP) MOV STREAM,R1 BEQ 2$ ;SKIP IF NULL MOV SL.CLH(R1),R1 BEQ 2$ ;JUST IN CASE MOV CD.CMA(R1),R2 BEQ 2$ TST CD.FID(R1) ;FILE INPUT ? BNE 1$ ;SKIP IF SO ADD #10,R2 ;OTHERWISE SKIP BUFFER LINKAGE 1$: CALL OUT ;PRINT LINE 2$: MOV (SP)+,R2 MOV (SP)+,R1 RETURN ; ; .END