I forgot to modify Tim Box's routine.

Here is the modified version. I went ahead and used movff instructions for ALL the registers, even the PBP ones.

The code below has some strange behavior: It prints
"secsecsecsecsecsec..." on the screen at one second intervals which proves that the interrupt is still running, but HSEROUT apparently gets trashed when an interrupt occurs.

Also, I have added a USART interrupt to the mix. Hitting any key kills the routine.

I'm stuck!

Here is the updated code
---------------------------------------------------------------------


DEFINE OSC 20 ' Set for 20Mhz operation
DEFINE NO_CLRWDT 1
DEFINE _18F8720 1
DEFINE HSER_RCSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
DEFINE LOADER_USED 1 ' Bootloader
Define USE_LFSR 1
DEFINE ADC_BITS 10
DEFINE ADC_SAMPLEUS 50


TRISA = %11111111 'AUX1,VM12,V12,V3,V5
TRISB = %11111111 'PDAT,PCLK,TACH6,TACH5,TACH4,TACH3,TACH2,TACH1
TRISC = %10010001 'RX1,TX1,SDO,SDA,LEDTG,PWMOUT,LEDFG,TACH7
TRISD = %00111000 'LED5R,LED3R,TACH8,TACH9,CTS1,RTS1,LED12G,LEDM12G
TRISE = %00000000 'LEDV2R,LEDV2G,LED3G,LED5G,LEDFR,LEDTR,LEDM12R,LED 12R
TRISF = %01111111 'OPTO1,FlowSig,POT2,POT1,Temp4,Temp3,Temp2,Temp1
TRISG = %11111100 'NC,NC,NC,XPGP3,XPCP1,RX2,TX2,OPTO2
TRISH = %00000000 'PINT2,PINT1,LCDRS,LCDRW,LCDDB7,LCDDB6,LCDDB5,LCDD B4
TRISJ = %10010000 'SWitchIN,LEDout,LEDout,XCTSin,XPReset,LCDe,RLY,PI NT3




ADCON2 = %10000010 ' Right justify 10 bit output, Clock = Fosc/32

ADCON1 = %00010011 ' Set Vref on RA3, 12 chan A/D (AN0-AN11)

ADCON0 = %00000001 ' Set A/D to ON, chan 0

PSPCON = %00000000 ' No PSP
MEMCON = %10000000 ' No External Memory
CMCON = %00000111 ' No Comparator used, turn it off

T0CON = %10001000
INTCON = %11100000 ' Timer0 and Peripheral interrupts enabled
PIE1 = %00100000 ' USART 1 receive buffer int enable

CCPR1L = %00010000
CCPR1H = %00000000 ' Initialize to 0, PWM register
PR2 = $1F ' PWM register,158 Khz@20Mhz, 7 bits
T2CON = %00000100 ' Prescale 1 - Needed for PWM
CCP1CON= %00001100 ' Set up for PWM



'************************************************* ***************************************
'* *
'* Declare variables *
'* *
'************************************************* ***************************************




wsave VAR BYTE BANKA SYSTEM ' Save location for the W register if in BANKA

ssave VAR BYTE BANKA SYSTEM ' Save location for the STATUS register


R0_2 var WORD BANKA ' PBP VARS TO SAVE
R1_2 VAR WORD BANKA
R2_2 VAR WORD BANKA
R3_2 VAR WORD BANKA
R4_2 VAR WORD BANKA
R5_2 VAR WORD BANKA
R6_2 VAR WORD BANKA
R7_2 VAR WORD BANKA
R8_2 VAR WORD BANKA
FLAGS_2 VAR BYTE BANKA
GOP_2 VAR BYTE BANKA
RM1_2 VAR BYTE BANKA
RM2_2 VAR BYTE BANKA
RR1_2 VAR BYTE BANKA
RR2_2 VAR BYTE BANKA

TIMER VAR WORd
X VAR WORD
Y VAR BYTE

SecondsCounter VAR BYTE
TimerFlag VAR BIT
KeyHitFlag VAR BIT

DEFINE INTHAND INT_CODE 'Tell PBP Where your code starts on an interrupt

T0CON = %10001000
INTCON = %11100000 ' Timer0 and Peripheral interrupts enabled
PIE1 = %00100000 ' Usart1 int enabled


TimerFlag = 0
Timer = 0
X = 0
SecondsCounter = 0
KeyHitFlag = 0

GOTO OVER_INT_CODE

asm
MOVFF WREG,wsave ; copy W to wsave register
MOVFF STATUS,ssave
CLRF STATUS ; change to bank 0 regardless of current bank

INT_CODE

MOVFF R0,_R0_2
MOVFF R0+1,_R0_2+1
MOVFF R1,_R1_2
MOVFF R1+1,_R1_2+1
MOVFF R2,_R2_2
MOVFF R2+1,_R2_2+1
MOVFF R3,_R3_2
MOVFF R3+1,_R3_2+1
MOVFF R4,_R4_2
MOVFF R4+1,_R4_2+1
MOVFF R5,_R5_2
MOVFF R5+1,_R5_2+1
MOVFF R6,_R6_2
MOVFF R6+1,_R6_2+1
MOVFF R7,_R7_2
MOVFF R7+1,_R7_2+1
MOVFF R8,_R8_2
MOVFF R8+1,_R8_2+1


IFDEF T2
MOVFF T2,_T2_2
ENDIF
IFDEF FLAGS
MOVFF FLAGS,_FLAGS_2
ENDIF
IFDEF GOP
MOVFF GOP,_GOP_2
ENDIF
IFDEF RM1
MOVFF RM1,_RM1_2
ENDIF
IFDEF RM2
MOVFF RM2,_RM2_2
ENDIF
IFDEF RR1
MOVFF RR1,_RR1_2
ENDIF
IFDEF RR2
MOVFF RR2,_RR2_2
ENDIF


endasm
;%%%%%%%%%%%%%%%%%%%%%%%%% Interrupt handler written in PBP %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
IF INTCON.2 = 1 THEN
TMR0H = $EC ; Reload TMR0 to 65535 - 5000
TMR0L = $77
Timer = Timer + 1
IF Timer >= 1000 THEN
TimerFlag = 1
ENDIF

ENDIF

IF PIR1.5 = 1 THEN
KeyHitFlag = 1
ENDIF
INTCON.2 = 0 ; Clear the timer flag
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%``

ASM

MOVFF _R0_2,R0
MOVFF _R0_2 + 1,R0 + 1
MOVFF _R1_2,R1
MOVFF _R1_2 + 1,R1 + 1
MOVFF _R2_2,R2
MOVFF _R2_2 + 1,R2 + 1
MOVFF _R3_2,R3
MOVFF _R3_2 + 1,R3 + 1
MOVFF _R4_2,R4
MOVFF _R4_2 + 1,R4 + 1
MOVFF _R5_2,R5
MOVFF _R5_2 + 1,R5 + 1
MOVFF _R6_2,R6
MOVFF _R6_2 + 1,R6 + 1
MOVFF _R7_2,R7
MOVFF _R7_2 + 1,R7 + 1
MOVFF _R8_2,R8
MOVFF _R8_2 + 1,R8 + 1

IFDEF FLAGS
MOVFF _FLAGS_2,FLAGS
ENDIF
IFDEF FLAGS
MOVFF _GOP_2,FLAGS
ENDIF
IFDEF RM1
MOVFF _RM1_2,RM1
ENDIF
IFDEF RM2
MOVFF _RM2_2,RM2
ENDIF
IFDEF RR1
MOVFF _RR1_2,RR1
ENDIF
IFDEF RR2
MOVFF _RR2_2,RR2
ENDIF

IFDEF T2
MOVFF _T2_2,T2
ENDIF


MOVFF ssave,STATUS ; Restore the STATUS reg
MOVFF wsave,W ; Restore W reg
Retfie ; Exit the interrupt routine

ENDASM

OVER_INT_CODE:

Topp:
IF TimerFlag = 1 THEN
SecondsCounter = SecondsCounter + 1
HSEROUT ["Seconds = ",#SecondsCounter,13,10]
TimerFlag = 0
Timer = 0
ENDIF
IF KeyHitFlag = 1 THEN
HSERIN [Y]
HSEROUT[Y]
KeyHitFlag = 0
ENDIF

INTCON.7 = 1 ; Turn global Ints back on
Goto Topp