hola, como va eso, mira hace tiempo que no toco el assembler pero creo que he notado algo, seguro alguien mas en el tema y que este bien canchero te lo sepa asegurar.
Cuando dices que haces el loop infinito creo te refieres cuando ves el estado de PORTB,L y creo aqui es donde podrías poner el antirrebote.
A partir de la etiqueta activada llamas a unas subrutinas, primero estado, luego tZ1 y así, pero veo que en estado es donde vuelves a ver el estado de PORTB,L y sales con un goto hacia desactivada, y aqui es donde creo esta el error, porque si usas la llamada a una funcion con call, debes volver con return.
El por qué de esto es que por cada llamada con call, el pic guarda esa posición para volver con return, y si sales con un goto en el proximo return que encuentre quien sabe lo que hara el pic, ademas de que si no me equivoco el stack tiene solo 8 niveles, es decir, puedes hacer solo 8 llamadas con call.
Esto es algo muy simple, y veo que en tu programa usas muchos goto, y justamente es lo que deberias evitar.
Y con respecto a esto de los call y los goto, creo que deberias escribir tu código así:
inicio
bcf PORTB,si ;Apaga las sirenas
bcf PORTB,se ;^^^^^ ^^^ ^^^^^^^
bcf PORTB,led ; y el led
btfsc PORTB,L ;L=0 -> Activada
goto inicio ;podria ir un delay anti rebote
activada
bsf PORTB,led ;Enciende el led
btfss PORTB,Z1 ;Testea si se abrio la zona 1 y actua en consecuencia, Z1=0 -> Activada
call Zona1Act ;en Zona1Act haces lo que corresponda, prender un led, activar la sirena,
;lo que corresponda y vuelves con return
btfss PORTB,Z2 ;
call Zona2Act ;Idem Zona1Act
btfss PORTB,Z3 ;
call Zona3Act ;Idem Zona1Act
btfss PORTB,L ;L=1 -> Desactivada va hacia el inicio donde apaga las sirenas y comienza otra ves
goto activada ;L=0 -> Activada sigue en este bucle
goto inicio
Es muy simple el código que he hecho, pero seria el comienzo.
Y ahora una pregunta, este programa lo estas probando en un circuito físico?
Si es así, estas poniendo las entradas con resistencias de pull-up o pull-down?
Los sensores de las puertas tipo magneticos son normal cerrado, o deberian, para evitar que te corten el cable y no se active.