Hola fartet.
Si bien creo comprender tu intencion, no comprendo por qué utilizas dos registros para guardar temporalmente el valor del registro STATUS. Por lo que veo uno de ellos posee Z en alto y el otro Z en bajo, pero no es necesario. Solo hace falta 1 registro para salvar el STATUS.
Remontemonos a la pregunta original que ha sido mencionada en otro hilo: ¿Por que utilizan SWAPF en lugar de MOVF para guardar ciertos registros especiales?
Bien.
Ahora veamos por que tu programa parece funcionar.
Tu programa se comporta siempre de manera identica. Ese es el primer error. Lo primero que haces es:
clrw
Lo que provoca que siempre Z va a valer 1 luego de eso. Esto no es lo que se pretende lograr(ni es correcto) a la hora de guardar los registros especiales dentro de la rutina de interrupcion.
Te armo un programa donde podes apreciar el problema de los movf:
org 0x0000
goto INICIO
org 0x0004
movwf W_TEMP
movf STATUS,W
movwf STATUS_TEMP
nop
nop
movf STATUS_TEMP,W
movwf STATUS
movf W_TEMP,W
return
INICIO
movlw 0x10
clrf Registro ;Registro=0
movf Registro,f ;Z=1
call 0x0004 ;Simular interrupcion
goto INICIO
Veamos como afecta ese codigo a las variables:
al momento de ejecutarse la instruccion call 0x0004 el valor de:
Registro = 0
W = 0x10
STATUS = b'XXXXX1XX' es decir, Z= 1 debido al movf Registro,F
Ahora veamos como guarda los registros calve:
movwf W_TEMP
W_TEMP = 0x10 = W esto esta OK.
Ahora se ejecuta:
movf STATUS,W
STATUS recordemos que valia antes de esta instruccion: b'XXXXX1XX'
al ejecutarse movf STATUS,W sucede que STATUS es distinto de cero(el bit Z vale 1, por lo que es suficiente para que STATUS sea distinto a cero), por lo que Z se pone en bajo entonces ahora:
W = b'XXXXX0XX'
y continua con:
movwf STATUS_TEMP
por lo que STATUS_TEMP = b'XXXXX0XX'
Y alli esta el error.
STATUS ingresó a la rutina de interrupcion valiendo b'XXXXX1XX' y STATUS_TEMP deberia contener el mismo valor para poder luego reestablecerlo, pero no lo contiene. STATUS_TEMP contiene b'XXXXX0XX'
Alli esta el error de utilizar la movf que afecta el flaf Z en lugar de la SWAPF.
Saludos.