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.
hth,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




Bookmarks