cblock 0x70
W_TEMP
STATUS_TEMP
PCLATH_TEMP
T0COUNT
endc
;***********************************************************************************
org 0x0000 ;reset vector
goto START
;***********************************************************************************
org 0x0004 ;interrupt vector
;interrupt handler
ISR movwf W_TEMP ;save W
swapf STATUS,W ;save STATUS
movwf STATUS_TEMP
banksel 0 ;bank 0
movfw PCLATH ;save PCLATH
movwf PCLATH_TEMP
;***********************************************************************************
btfsc INTCON,T0IF ;timer 0 interrupt?
call T0INT ;yes, service timer 0 interrupt
goto ISRExit ;no, exit isr
;***********************************************************************************
T0INT decfsz T0COUNT,F ;decrement post scale counter
goto T0INTExit
movlw 0x04 ;reload post scale counter
movwf T0COUNT
movlw b'00000100' ;toggle RB2
xorwf PORTB,F
bcf INTCON,T0IF ;clear timer 0 interrupt flag
T0INTExit return
;***********************************************************************************
ISRExit movfw PCLATH_TEMP ;restore PCLATH
movwf PCLATH
swapf STATUS_TEMP,W ;restore STATUS
movwf STATUS
swapf W_TEMP,F ;restore W
swapf W_TEMP,W
retfie ;return to main code
;***********************************************************************************
;initialization routine
START clrf PORTA ;clear port latches
clrf PORTB
banksel TRISA ;bank 1
clrf TRISB ;port b output
movlw 0xC8 ;init timer 0, set up as timer, 1:1 prescale
movwf OPTION_REG
banksel 0
movlw 0x04 ;load post scale counter
movwf T0COUNT
clrf TMR0 ;init timer 0
movlw b'10100000' ;clear timer interrupt flag, enable
movwf INTCON ;timer 0 interrupt
;continue with code here