When I tested this it was good some help.... sometimes is enough to save W register. -- interrupt settings var byte w_temp var byte status_temp procedure push is assembler movwf w_temp swapf status, w movwf status_temp end assembler end procedure procedure pop is assembler swapf status_temp, w movwf status swapf w_temp, f swapf w_temp, w end assembler end procedure procedure interrupt is pragma interrupt -- disable all interrupts intcon_gie = low -- save w register and status push -- check sources of interrupt port_b on change if intcon_rbif then -- do your job -- restore status and w pop -- asm retfie -- prepare for next interrupt port_b on change intcon_rbif = low end procedure