MT_TRAPV/SMS.EXV - Set the TRAP Vectors in RAM

Set the TRAP Vector table in RAM for the specified job.

Call Parameters Return Register Return Parameter
D0.B $07 D0.L Error code.
D1.L Id of the job for which the TRAP table is to be redirected. D1.L Preserved.
A0.L Unused A0.L Base of job whose id was passed in D1.L.
A1.L Ponter to new TRAP table. A1.L Corrupted.

Errors

Error Code Description
ERR_NJ Invalid job id.

Notes

  • All registers not shown above are not used on entry and are preserved on exit.
  • This trap allows a job to redirect the TRAP #5 to TRAP #15 calls and exception handlers, //but not all of them//, which are normally unused by QDOS/SMS.
  • Different jobs can have different vector tables, but a job is given the same table as its parent when first created. See the example code for full details of the format of the table etc.

Example

This example code, shows the use of this trap to create an exception handler for an original QL only. Later processors have different stack frames for the Address exception.

*==============================================================================
* This code adds a 'protective barrier' to the QL so that silly programming
* errors can be intercepted and hopefully handled before the QL crashes out.
*
* This code should only be run on a 68000 or 68008 as the exception stack
* frame is (probably) different on 68010 and above.
*==============================================================================

start       lea exceptions,a1       ; Table of exceptions (empty !)
            lea x_address,a2        ; Routine for address exceptions
            move.l a2,(a1)+         ; Save in table

            lea x_illegal,a2        ; Routine for illegal exceptions
            move.l a2,(a1)+         ; Save in table

            lea x_divide,a2         ; Divide by zero
            move.l a2,(a1)+         ; Save in table

            lea x_check,a2          ; CHK instruction
            move.l a2,(a1)+         ; Save in table

            lea x_trapv,a2          ; TRAPV instruction
            move.l a2,(a1)+         ; Save in table

            lea x_priv,a2           ; Privilege violation
            move.l a2,(a1)+         ; Save in table

            lea x_trace,a2          ; Trace exception
            move.l a2,(a1)+         ; Save in table

            lea x_int_7,a2          ; Interrupt level 7
            move.l a2,(a1)+         ; Save in table

            lea x_trap,a2           ; TRAP #5 to TRAP #15
            moveq #10,d0            ; There are 11 entries to fill

trap_loop   move.l a2,(a1)+         ; Save one in table
            dbra d0,trap_loop       ; Then do the rest

            lea exceptions,a1       ; Exceptions table again - full
            moveq #-1,d1            ; Job id = 'this job'
            moveq #mt_trapv,d0      ; Routine to set exception table
            trap #1                 ; And do it
            rts                     ; Return to SuperBasic with error code in D0

*==============================================================================
* Now the actual exception handlers themselves. Apart from the ADDRESS 
* exception, all have 3 words on the stack when called. ADDRESS has more.
*==============================================================================

x_address   lea t_address,a1    ; Message to print
            bsr message_0       ; Print the message
            addq.l #8,A7        ; Tidy extra data off the stack
            rte                 ; Attempt to continue

t_address   dc.w 15
            dc.b 'ADDRESS error.'
            dc.b 10

x_illegal   lea t_illegal,a1    ; Message to print
            bsr message_0       ; Print the message
            addq.l #2,2(a7)     ; Don't execute this instruction again !
            rte                 ; Attempt the next instruction

t_illegal   dc.w 21
            dc.b 'ILLEGAL instruction.'
            dc.b 10


x_divide    lea t_divide,a1     ; Message to print
            bsr message_0       ; Print the message
            rte                 ; Attempt to carry on

t_divide    dc.w 16
            dc.b 'DIVIDE BY ZERO.'
            dc.b 10


x_check     lea t_check,a1      ; Message to print
            bsr message_0       ; Print the message
            rte                 ; Attempt to carry on

t_check     dc.w 17
            dc.b 'CHK instruction.'
            dc.b 10


x_trapv     lea t_trapv,a1      ; Message to print
            bsr message_0       ; Print the message
            rte                 ; Attempt to carry on

t_trapv     dc.w 19
            dc.b 'TRAPV instruction.'
            dc.b 10


x_priv      lea t_priv,a1       ; Message to print
            bsr message_0       ; Print the message
            rte                 ; Attempt to carry on

t_priv      dc.w 21
            dc.b 'PRIVILEGE VIOLATION.'
            dc.b 10


x_trace lea t_trace,a1          ; Message to print
            bsr message_0       ; Print the message
            rte                 ; Attempt to carry on

t_trace     dc.w 25
            dc.b 'TRACE - not implemented.'
            dc.b 10


x_int_7 lea t_int_7,a1          ; Message to print
            bsr message_0       ; Print the message
            rte                 ; Attempt to carry on

t_int_7     dc.w 26
            dc.b 'DO NOT PRESS CTRL ALT 7 !'
            dc.b 10


x_trap      lea t_trap,a1       ; Message to print
            bsr message_0       ; Print the message
            rte                 ; Attempt to carry on

t_trap      dc.w 39
            dc.b 'TRAP #5 to TRAP #15 - not implemented.'
            dc.b 10


*==============================================================================
* This routine prints a message to channel 0. The message is at 0(A1) in the 
* usual QDOS format of a size word followed by the text. The UT_ERR0 routine
* expects an error code in D0 -or- the address of a user defined error message
* in D0 with bit 31 set to show that it is user defined.
*==============================================================================
message_0   move.l a1,d0        ; Address of user defined error message
            bset #31,d0         ; Mark as user defined
            move.w ut_err0,a2   ; The required routine is vectored
            jsr (a2)            ; Do the routine & print the message
            moveq #0,d0         ; Clear error flag
            rts

exceptions  ds.l    19          ; There are 19 exceptions to define