cwmaddy,
I think your biggest problems are in the Interrupts.
1) You've only created 1 wsave variable. But there should be 1 for each bank of ram, usually at addresses $20,$A0,$120 and $1A0.
The PIC cannot change banks before saving the W reg., because that would change W reg. So it has to be saved in whichever bank is currently selected when the interrupt occurs.
Without the other wsave variables, the ISR will be saving and restoring the wrong values, and could be overwriting other variables that have nothing to do with the ISR.
2) Even worse. You're using Basic language statements inside ASM type interrupts, which will corrupt PBP's system variables and can cause just about anything to happen, including jumping to routines that aren't supposed to be running. It also causes other variables to be overwritten with random values, which just causes more random actions.
If you want to use Basic language statements in your ASM interrupts, the easiest way to do it is ...
DT_INTS - Instant Interrupts
http://www.darreltaylor.com/DT_INTS-14/intro.html
hth,
Bookmarks