.TITLE ERROR ; JEFFREY KODOSKY ARL NOV75 ; ; SUBR ; ENTRY: 1 ARG ; EXIT: N/A ; ERRORS: GENERATES A RECOVERABLE ERROR ; (KILL--NON-RECOVERABLE) ; CALLS: PRNT ; PRIN1 ; MAINLOOP ; OCO ; TRANSFERRS TO GENERAL ERROR AND TRACEBACK HANDLER .GLOBL ADERST,ADPROG,QPRNT,QPRIN1,QMAINLOOP,LASTPR .GLOBL ERROR,ZERROR,KILL,ZKILL,ENDLSP,SSTART,LSPXT .GLOBL FCTLOW,FCTDTL,FCTATM,FCTSIZ,QOCO,OUTSYS,INSYS,$ALIST ERROR: MOV (R5)+,-(SP) ;SAVE ARG MOV #BUFE,-(SP) ;BLANK BUFFER BR ERRORH ZERROR=.-ERROR ; KILL: MOV (R5)+,-(SP) ;SAVE ARG MOV #BUFE,-(SP) ;BLANK BUFFER KILLH: MOV #BUFK,-(SP) MOV ENDLSP,R5 ;FLUSH ARG STACK TST -(R5) ;(LEAVE OBLIST ON?) MOV #3,FLAG ;FORCE EXIT AND PRINTING BR ERR02 ZKILL=.-KILL .PAGE ERRORH: MOV #7,FLAG ;INIT TO ALLOW RE-ENTRY AND PRINTING MOV #BUF,-(SP) MOV R4,R0 ;LOOK FOR MARKED ARG WITH ERRSET PC ERR01: BIT #1,(R5)+ BNE ERR03 ;JUMP IF MARKED ARG FOUND CMP R5,ENDLSP ;HIT TOP OF ARG STACK? BLO ERR01 ;NO: LOOP BACK BHI T2ERR ;JUMP IF OVER TOP (SHOULD NEVER HAPPEN!) TST -(R5) ;LEAVE OBLIST ON STACK ERR02: MOV SSTART,R0 ;R0 POINTS TO 1ST ITEM TO REMAIN CMP @R0,#LSPXT ;ON SUBR STACK (SHOULD ALWAYS BNE T2ERR ;BE LSPXT...IF NOT THEN FATAL ERROR) JMP ERR10 ERR03: CMP -(R0),#ADERST ;LOOK FOR ERRSET RETURN PC BEQ ERR04 ;JUMP IF FOUND CMP @R0,#ADPROG BEQ ERR01 ;JUMP IF IT WAS PROG AND CONTINUE CMP R0,SSTART ;TO LOOK FOR ERRSET BHI ERR03 BR T3ERR ;JUMP IF HIT BOTTOM OF SUBR STACK ERR04: TST -(R0) ;POP ERRSET ADDR OFF SUBR STACK TST -(R5) ;POINT TO ASR FLAG ;NO RESTART FLAG:=3 DEC (R5)+ BNE ERR05 ;JUMP IF :=T CLR FLAG ;FLAG NO PRINTING OF ERROR MSG OR TRACEBK ERR05: TST (R5)+ BNE ERR10 ;JUMP IF :=T BIC #2,FLAG ;FLAG NO PRINT TRACEBACK BR ERR10 ; FATAL SYSTEM ERRORS .GLOBL T1ERR,T2ERR,T3ERR,O1ERR,O2ERR T1ERR: CLR -(SP) ;ILLEGAL TRAP CODE MOV #BUFT1,-(SP) BR KILLH T2ERR: MOV SSTART,R0 ;CORRUPTED STACKS MOV #LSPXT,@R0 TST (R0)+ CMP R4,R0 BHIS .+4 MOV R0,R4 CLR -(SP) MOV #BUFT2,-(SP) BR KILLH T3ERR: CLR -(SP) ;MARKED ITEM OCCURS WITHOUT MOV #BUFT3,-(SP) ;PROG OR ERRSET BR KILLH O1ERR: CLR -(SP) ;INPUT ERROR MOV #BUFO1,-(SP) BR KILLH O2ERR: CLR -(SP) ;OUTPUT ERROR MOV #BUFO2,-(SP) BR KILLH ; RECOVERABLE ERRORS .GLOBL A1ERR,A2ERR,A3ERR,A4ERR,A5ERR,A6ERR,A7ERR,A8ERR .GLOBL A9ERR,A10ERR,F1ERR,F2ERR,G1ERR,G2ERR,GC1ERR .GLOBL GC2ERR,I1ERR,I2ERR,I3ERR,I4ERR,I5ERR,R1ERR,R2ERR .GLOBL R3ERR,R4ERR,R5ERR,R6ERR .GLOBL IO1ERR,IO2ERR,IO3ERR,IO4ERR A1ERR: BR T1ERR ; A2ERR: MOV #BUFA2,-(SP) ;FUNCTION OBJECT HAS NO BR ERRARG ;DEFINITION--APPLY A3ERR: BR T1ERR ; A4ERR: MOV #BUFA4,-(SP) ;RETURN OCCURS OUTSIDE PROG BR ERRNOA ;CONTEXT A5ERR: MOV #BUFA5,-(SP) ;GO OCCURS OUTSIDE PROG CONTEXT BR ERRNOA A6ERR: MOV #BUFA6,-(SP) ;GO REFERS TO UNASSIGNED LABEL BR ERRARG A7ERR: MOV #BUFA7,-(SP) ;ILLEGAL FIRST ARG TO SET BR ERRARG A8ERR: MOV #BUFA8,-(SP) ;UNBOUND VARIABLE--EVAL BR ERRARG A9ERR: MOV #BUFA9,-(SP) ;FUNCTION OBJECT HAS NO BR ERRARG ;DEFINITION--EVAL A10ERR: MOV #BUFA10,-(SP) ;CAR OR CDR OF ATOM BR ERRARG F1ERR: MOV #BUFF1,-(SP) ;IMPROPER NUMBER OF SUBR ARGS BR ERRNOA F2ERR: MOV #BUFF2,-(SP) ;IMPROPER NUMBER OF EXPR ARGS BR ERRARG ;? G1ERR: BR T1ERR ; G2ERR: MOV #BUFG2,-(SP) ;RECURSION LIMIT EXCEEDED BR ERRNOA ERRARG: MOV @SP,-(SP) ;INSERT ARG MOV (R5)+,2(SP) BR ERRORH ERRNOA: MOV @SP,-(SP) ;NO ARG CLR 2(SP) BR ERRORH GC1ERR: BR T1ERR ; GC2ERR: MOV #BUFGC2,-(SP) ;FREE SPACE EXHAUSTED BR ERRNOA I1ERR: MOV #BUFI1,-(SP) ;ARRAY SPACE EXHAUSTED BR ERRARG I2ERR: MOV #BUFI2,-(SP) ;IMPROPER ARG FOR NUMERIC BR ERRARG ;FUNCTION I3ERR: BR T1ERR ; I4ERR: MOV #BUFI4,-(SP) ;UNDEFINED ARITHMETIC OPERATION BR ERRNOA I5ERR: MOV #BUFI5,-(SP) ;IMPROPER ARGUMENT TO ARRAY BR ERRARG ;FUNCTION IO1ERR: MOV #BUFIO1,-(SP) ;ILLEGAL FILE SPECIFICATION OR BR ERRARG ;CHANNEL NUMBER IO2ERR: MOV #BUFIO2,-(SP) ;ATTEMPT TO OPEN TOO MANY CHANNELS BR ERRNOA IO3ERR: MOV #BUFIO3,-(SP) ;DEVICE HANDLER AND I/O BUFFER BR ERRNOA ;SPACE EXHAUSTED IO4ERR: MOV #BUFIO4,-(SP) ;ATTEMPT TO CLOSE SYSOUT BR ERRNOA R1ERR: MOV #BUFR1,-(SP) ;,)] OUT OF CONTEXT BR ERRNOA R2ERR: MOV #BUFR2,-(SP) ;. OUT OF CONTEXT BR ERRNOA R3ERR: MOV #BUFR3,-(SP) ;UNMATCHED ( BR ERRNOA R4ERR: MOV #BUFR4,-(SP) ;TOO MANY ( OR [ BR ERRNOA R5ERR: MOV #BUFR5,-(SP) ;UNDECODABLE NUMBER BR ERRNOA R6ERR: MOV #BUFR6,-(SP) ;STRING OR PNAME TOO LONG BR ERRNOA ERR10: MOV R0,R0TMP ;SAVE STACK RESET MOVB #-1,OUTSYS+1 ;RESTORE SYSIN AND SYSOUT MOVB #-1,INSYS+1 ASR FLAG BCC ERR12 ;JUMP IF NO PRINT ERROR MESSAGE MOV (SP)+,R3 QPRNT ;PRINT HEADER MOV (SP)+,R3 QPRNT ;PRINT ERROR CODE MOV (SP)+,-(R5) BEQ ERR11 CLR LASTPR ;FORCE A DELIMITER TO BE PRINTED QPRIN1 ;PRINT NON-NULL ARG ERR11: TST (R5)+ ;POP RESULT OF PRINT MOV #BUFCLS+1,R3 ;PRINT CRLF QPRNT BR ERR13 ERR12: ADD #6,SP ;POP ARGS ERR13: ASR FLAG BCC ERR20 ;JUMP IF NO PRINT TRACEBACK MOV #BUFOPN,R3 ;PRINT ( QPRNT MOV #1,LASTPR ;NO DELIMITER NOW ERR15: MOV -(R4),R0;POP ANOTHER RETURN PC CMP R4,R0TMP BEQ ERR19 ;JUMP IF DONE BHIS .+6 JMP T2ERR MOV #FCTLOW,R1 MOV #FCTSIZ,R2 ERR16: CMP R0,@R1 ;CHECK AGAINST FCT LO LIMIT BLO ERR17 ;JUMP IF TOO LOW MOV @R2,-(SP) ADD @R1,@SP CMP R0,(SP)+;CHECK AGAINST HI LIMIT BLO ERR18 ;JUMP IF WITHIN LIMITS ERR17: CMP (R1)+,(R2)+ ;BUMP TO NEXT FCT CMP R1,#FCTDTL ;END OF TABLE? BLO ERR16 MOV #BUFOCT,-(SP) ;YES: PRINT ADDRESS IN OCTAL MOV #6,-(SP) MOV R0,-(SP) QOCO MOV #BUFOCT,R3 QPRNT BR ERR15 ERR18: SUB #FCTLOW,R1 ;GET FCT ATOM POINTER ADD #FCTATM,R1 MOV @R1,-(R5) QPRIN1 ;PRINT IT TST (R5)+ ;POP IT BR ERR15 ERR19: TST (R4)+ ;LEAVE LSPXT OR ERRSET CALLER ON STACK MOV #BUFCLS,R3 ;PRINT ) CR-LF QPRNT ERR20: MOV @#42,SP ;RESET SP STACK CMP -(SP),-(SP) ASR FLAG ;RESTART? BCS ERR21 CLR -(R5) ;NO: RETURN A NIL JMP @-(R4) ;JUMP TO ERRSET CALLER OR LSPXT ERR21: CLR $ALIST QMAINLOOP ;YES: RECALL MAINLOOP .WORD 0 .NLIST BEX FLAG: .WORD 0 R0TMP: .WORD 0 BUF: .BYTE 15,12 .ASCIZ /***** ERROR / BUFE=.-2 BUFK: .BYTE 15,12 .ASCIZ /***** KILLED / BUFT1: .ASCIZ /T1/ BUFT2: .ASCIZ /T2/ BUFT3: .ASCIZ /T3/ BUFO1: .ASCIZ /O1/ BUFO2: .ASCIZ /O2/ BUFA1: .ASCIZ /A1/ BUFA2: .ASCIZ /A2/ BUFA3: .ASCIZ /A3/ BUFA4: .ASCIZ /A4/ BUFA5: .ASCIZ /A5/ BUFA6: .ASCIZ /A6/ BUFA7: .ASCIZ /A7/ BUFA8: .ASCIZ /A8/ BUFA9: .ASCIZ /A9/ BUFA10: .ASCIZ /A10/ BUFF1: .ASCIZ /F1/ BUFF2: .ASCIZ /F2/ BUFG1: .ASCIZ /G1/ BUFG2: .ASCIZ /G2/ BUFGC1: .ASCIZ /GC1/ BUFGC2: .ASCIZ /GC2/ BUFI1: .ASCIZ /I1/ BUFI2: .ASCIZ /I2/ BUFI3: .ASCIZ /I3/ BUFI4: .ASCIZ /I4/ BUFI5: .ASCIZ /I5/ BUFIO1: .ASCIZ /IO1/ BUFIO2: .ASCIZ /IO2/ BUFIO3: .ASCIZ /IO3/ BUFIO4: .ASCIZ /IO4/ BUFR1: .ASCIZ /R1/ BUFR2: .ASCIZ /R2/ BUFR3: .ASCIZ /R3/ BUFR4: .ASCIZ /R4/ BUFR5: .ASCIZ /R5/ BUFR6: .ASCIZ /R6/ BUFCLS: .BYTE '),15,12,0 BUFOPN: .BYTE '(,0 BUFOCT: .BLKB 6 BUFSPC: .ASCIZ / / .EVEN .LIST BEX .END