This example should show how you can use multiple ON INTERRUPTS.
But it's not much use for anything else.
The key thing to remember here, is that the assignments of the Interrupt Handlers only happens at Compile-Time. Attempting to execute an ON INTERRUPT statement at Run-Time to change the handler will not work.
As the program gets compiled, starting from the top, the interrupts are considered DISABLED, and no interrupt checks will be placed between the PBP lines of code.
When it encounters an ON INTERRUPT statement, the status changes to ENABLED, and in between every PBP statement, it will place an Interrupt Check, that jumps to the last assigned Handler.
In the example below, if an interrupt occurs while the program flow is within the Main loop, then the Handler0 will be jumped to.
Then when it encounters the second ON INTERRUPT statement, all lines following that assignment will interrupt to Handler1.
It does not matter if they are subroutines, main routines, or whatever, ANY lines following an ON INTERRUPT will jump to the last known handler (if interrupted).
It really does get tricky, because then each handler must be capable of handling any interrupt, which leads to multiple copies of the same handler or gosubs to common handlers. Or you have to make sure that before switching modes, ONLY the interrupts that the next mode can handle are enabled, I mean SERIOUSLY Tricky!
Just remember, It all happens at Compile-Time.
Code:
Mode VAR BYTE
Mode = 0
ON INTERRUPT GOTO Handler0
Main:
R0 = R0 ; just some stuff to put int checks between
R1 = R1
IF Mode = 1 then DoMode1
IF Mode = 2 then DoMode2
GOTO Main
DISABLE
Handler0:
; Interrupt handler for the Main Loop
RESUME
ENABLE
;--------------------------------------------------------
ON INTERRUPT GOTO Handler1
DoMode1:
; Do Mode 1 tasks here
IF Mode = 0 then Main
IF Mode = 2 then DoMode2
GOTO DoMode1
DISABLE
Handler1:
; Interrupt handler for Mode 1
RESUME
ENABLE
;--------------------------------------------------------
ON INTERRUPT GOTO Handler2
DoMode2:
; Do Mode 2 tasks here
IF Mode = 0 then Main
IF Mode = 1 then DoMode1
GOTO DoMode2
DISABLE
Handler2:
; Interrupt handler for Mode 2
RESUME
ENABLE
hth,
Bookmarks