//reserva posiciones de memoria para salvar contexto
#reserve 0x70, 0x71, 0x72, 0x73
//Constantes ASM
#define W 0
#define F 1
#define INDF 0x00
#define STATUS 0x03
#define PCLATH 0x0A
#define FSR 0x04
#define PIR1 0x0C
#define PIE1 0x8C
#define TMR1IF 0
#define CCP1IF 5
#define TMR1IE 0
#define CCP1IE 5
#define W_AUX 0x70 //W
#define S_AUX 0x71 //STATUS
#define P_AUX 0x72 //PCLATH
#define F_AUX 0x73 //FSR
#int_GLOBAL
void ISR(void){
#asm
//Guardar contexto
MOVWF W_AUX //guardo el contenido de W
SWAPF W_AUX, F //swap a W
SWAPF STATUS, W //cargo W con STATUS
MOVWF S_AUX //guardo STATUS en 0x71
MOVF PCLATH, W //cargo W con PCLATH
MOVWF P_AUX //guardo PCLATH en 0x72
CLRF PCLATH //borro PCLATH
MOVF FSR, W //cargo W con FSR
MOVWF F_AUX //guardo FSR en 0x73
MOVLW PIE1 //puntero de PIE1...
MOVWF FSR //...en FSR
TIMER1: //--------------------
BTFSS INDF, TMR1IE //si esta habilitada la int, salta...
GOTO CCP1 //...sino continua hacia la siguiente int a comprobar
BTFSC PIR1, TMR1IF //si esta desactivado el flag, salta...
GOTO TMR1_INT //...sino ejecuta la interrupcion
CCP1: //--------------------
BTFSS INDF, CCP1IE //si esta habilitada la int, salta...
GOTO RESTAURAR //...sino va a restaurar contexto y sale del ISR
BTFSC PIR1, CCP1IF //si esta desactivado el flag, salta...
GOTO CCP1_INT //...sino ejecuta la interrupcion
GOTO RESTAURAR //sale del ISR
TMR1_INT:
//codigo de INT_TIMER1
//......
BCF PIR1, TMR1IF//resetea el flag
BCF PCLATH, 3 //
GOTO RESTAURAR //restaura el contexto
CCP1_INT:
//codigo de INT_CCP1
//......
BCF PIR1, CCP1IF //resetea el flag
BCF PCLATH, 3
GOTO RESTAURAR //restaura el contexto
RESTAURAR: //Restaurar contexto
MOVF F_AUX, W //cargo W con F_AUX
MOVWF FSR //restauro valor de FSR
MOVF P_AUX, W //cargo W con P_AUX
MOVWF PCLATH //restauro valor de PCLATH
SWAPF S_AUX, W //cargo W con S_AUX
MOVWF STATUS //restauro valor de STATUS
SWAPF W_AUX, W //restauro valor de W
#endasm
}