.TITLE ONFATL .ENABL LC ; ; CALL ONFATL( FINISH ) -- This subroutine will call the user supplied ; subroutine FINISH prior to the execution of a FATAL OTS error. ; Note: FINISH must be declared EXTERNAL. ; ; CALL NOTSER( IERR ) -- This subroutine disables the default ; OTS error processing for the specified error number. To ; re-enable normal error processing, call with no arguments. ; .PSECT ONFATL ONFATL::TST (R5) ;ARGUMENT PRESENT? BNE 2$ ;BRANCH IF SO ; TST SAVED ;WAS TRAP SAVED? BEQ 1$ ;BRANCH IF NOT MOV SAVED,$SST+14 ;RESTORE NORMAL ERROR PROCESSING. 1$: RTS PC ;RETURN ; 2$: MOV $SST+14,SAVED ;SAVE OTS TRAP ADDRESS MOV #INTCEP,$SST+14 ;REPLACE WITH OUT OWN ; MOV 2(R5),FINISH ;SAVE ADDRESS OF FINISH ROUTINE. RTS PC ;RETURN ; INTCEP: MOV R1,-(SP) ;SAVE R1 MOV 2(SP),R1 ;GET ERROR NUMBER MOV R0,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) ;SAVE ALL REGS SUB #400,R1 ;REMOVE OFFSET ASR R1 ;DIVIDE BY TWO MOV R1,IERR ;SAVE ERROR NUMBER ; CLR R0 ;CLEAR OTHER HALF DIV #16.,R0 ;DIVIDE BY 16. MOV #1,R2 ;SET POINTER ASH R1,R2 ;SHIFT BY REMAINDER MOV R2,INDEX ;SAVE INDEX INTO WORD ASL R0 ;MAKE INTO OFFSET MOV R0,REMAIN ;SAVE INDEX ONTO TABLE BIT R2,WARN(R0) ;IS BIT SET? BNE DONE ;BRANCH IF SET (WARNING). ; MOV SAVED,$SST+14 ;RESTORE NORMAL ERROR PROCESSING MOV R5,-(SP) ;SAVE R5 MOV #ARG,R5 ;SET ARGUMENT LIST JSR PC,@FINISH ;EXECUTE SUBROUTINE MOV (SP)+,R5 ;RESTORE R5 MOV #INTCEP,$SST+14 ;RESTORE INTERRUPTED ERROR PROCESSING ; DONE: MOV REMAIN,R0 ;GET BACK REMAINDER BIT INDEX,MESSY(R0) ;NO OTS ERROR FLAG SET? BNE 1$ ;BRANCH IF SO ; MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R0 MOV (SP)+,R1 JMP @SAVED 1$: MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R0 MOV (SP)+,R1 TST (SP)+ ;DISCARD TRAP NUMBER AND RESTORE REG RTI ;RETURN FROM INTERRUPT ; NOTSER::TST (R5) ;ANY ARGUMENTS? BNE 2$ ;BRANCH IF ANY ; MOV #8.,R0 ;SET 8 WORDS. MOV #MESSY,R1 ;SET ADDRESS 1$: CLR (R1)+ ;CLEAR WORD SOB R0,1$ ;CONTINUE UNTIL DONE. RTS PC ;RETURN ; 2$: MOV @2(R5),R1 ;GET ERROR CODE CLR R0 ;CLEAR OTHER HALF DIV #16.,R0 ;DIVIDE BY 16. MOV #1,R2 ;SET POINTER ASH R1,R2 ;SHIFT BY REMAINDER ASL R0 ;MAKE INTO OFFSET BIS R2,MESSY(R0) ;SET NO OTS ERROR FLAG RTS PC ;RETURN ARG: .WORD 1,IERR IERR: .WORD 0 SAVED: .WORD 0 ;LOCATION TO SAVE $SST+14 FINISH: .WORD 0 ;LOCATION TO SAVE ADDRESS OF FINISH WARN: .WORD 0,0,0,100000,7700,74177,4,1 MESSY: .BLKW 8. INDEX: .WORD 0 REMAIN: .WORD 0 .END