Gestione impianto d'allarme con PC tramite porta parallela

Indirizzi I/O della porta parallela:

LPT 1 da 378h a 37Fh
LPT 2 da 278h a 27Fh
LPT 3 da 3BCh a 3B0h

Nel caso, per esempio della LPT1 si avrÓ:

378

D7

D6

D5

D4

D3

D2

D1

D0

379

Busy

ACK

Pap.end

Sel-in

Error

X

X

X

37A

X

X

X

X

Select

Init

Auto-fd

Strobe

37B

               

37C

               

37D

               

37E

               

37F

               

Sorgente in assembly

title Antifurto ;Titolo del programma
.model small ;Modello di utilizzo della memoria

portao = 378h ;Indirizzo uscita porta parallela
portai = 379h ;Indirizzo ingresso porta parallela

BSala = 08h ;Bit Sensore Sala
BCucina = 10h ;Bit Sensore Cucina
BIngresso = 20h ;Bit Sensore Ingresso
BAbilit = 40h ;Bit abilitazione impianto 


.stack ;Occupazione del segmento di stack


.data ;Segmento dati qui si definiscono le variabili utilizzate

StImpInser db "Impianto inserito",10,13,'$'
StImpDisin db "Impianto disinserito",10,13,'$'
StAllSala db "Allarme sala",10,13,7,'$'
StAllCucina db "Allarme cucina",10,13,7,'$'
StAllIngr db "Allarme ingresso",10,13,7,'$'

Sportai db 0

.code ;Segmento codice: da quindi si scrive il programma


.startup ;Modulo di inizializzazione prima dello start del programma


;-----------------Blocco eseguito da dinserito---------------------------- 
;------------------------------------------------------------------------
CicloDisin:
mov dx,portai 
LNoCamb: 
call SubContrUscita ;Controllo se bisogna uscire
in al,dx
cmp al,Sportai ;Controllo se ci sono dei cambiamenti sugli ingressi
je LNoCamb
mov Sportai,al

;-----------------Controllo se inserito------------------------------- 
ContImpIns:
mov ah,al
and ah,BAbilit
jnz CicloDisin

mov dx,offset StImpInser
call ScriviMess


;-----------------Blocco eseguito da inserito---------------------------- 
;------------------------------------------------------------------------
CicloInser: 
mov dx,portai 
LNoCamb1: 
call SubContrUscita
in al,dx
cmp al,Sportai
je LNoCamb1
mov Sportai,al

;-----------------Controllo se disinserito------------------------------- 
ContImpDis:
mov ah,al
and ah,BAbilit
jz ContSala

mov dx,offset StImpDisin
call ScriviMess
jmp CicloDisin

;-----------------Controllo allarme sala---------------------------------
ContSala: 
mov ah,al
and ah,BSala
jz VisAllSala
jmp ContAllCucina
VisAllSala:
mov dx,offset StAllSala
call ScriviMess
;-----------------Controllo allarme cucina-------------------------------- 
ContAllCucina:
mov ah,al
and ah,BCucina
jz VisAllCucina
jmp ContAllIngr
VisAllCucina:
mov dx,offset StAllCucina
call ScriviMess
;-----------------Controllo allarme ingresso------------------------------- 
ContAllIngr:
mov ah,al
and ah,BIngresso
jz VisAllIngr
jmp ContrUscita 

VisAllIngr: 
mov dx,offset StAllIngr
call ScriviMess

ContrUscita: 
call SubContrUscita;
jmp CicloInser


;################### Subroutines ######################################## 
;------------------Sub uscita con tasto premuto--------------------------- 
SubContrUscita:
mov ah,0bh 
int 21h
cmp al,0FFH
jne ritorna 

.exit ;Modulo di chiusura del programma
ritorna:
ret

;-----------------Subroutine scrittura messaggi-----------------
ScriviMess:
push ax
mov ah,9 
int 21h
pop ax
ret

end