A lot of effort has gone into making the HC08 do what it can to preserve the context (registers) during an interrupt. You don't want to work against what the MCU and compiler does for you autmotically, because you're just looking for trouble. A general rule of thumb for ISR code is: you want to enter the ISR without doing any funny stuff (consequently defeating the context saving efforts of the hardware), and exit the ISR using its "return from interrupt instruction" so that the hardware then cleans up the context properly. Stated more tersely: you want only one entry point into the ISR, and only one exit point. In your case, I'd do the following, as pseudo-code:
SWI_ISR() {
char mode;
mode = Check_mode();
if (mode == monitor_mode)
Do_monitor_stuff();
else
Do_user_mode stuff();
} // implicit RTI if using C
Don't jump out of the middle of the ISR, to never return! Certain registers might be left with bogus values in them, which is going to create hard to track down bugs elsewhere. Also, if another interrupt fires in the midde of your ISR (assuming interrupts aren't disabled), it's going to jigger the stack and registers before returning control to your ISR. If you're *lucky*, your ISR will die a quick and horrible death. HTH.
---Tom