org 400h ;INIZIO PROGRAMMA sensore1 equ 0h ; indirizzo sensore1 sensore2 equ 1h ; indirizzo sensore2 sensore3 equ 2h ; indirizzo sensore3 sensore4 equ 3h ; indirizzo sensore4 alarm equ 4h ; indiririzzo periferica allarme lowbound equ 200 ; T-min espresso in decimi di gradi Celsius upbound equ 300 ; T-min espresso in decimi di gradi Celsius media dl 0 ; valore medio della temperatura rilevato baseadd equ 2000h ; buffer contenente la temperatura misurata device dl 0 switch db 0 state db 0 code ;inizio istruzioni main: ;... jsr init ;... loop: jmp loop ; subroutine di inizializzazione delle periferiche e avvio acquisizione init: push r0 push r1 ; calcola il centro dell'intervallo [Tmin-Tmax] ... movl #lowbound, R0 ; addl #upbound, R0 ; asrl #1, R0 ; e lo memorizza in R0 movl #baseadd,R1 movl R0, (R1) ; movl R0, 4(R1) ; movl R0, 8(R1) ; movl R0, 12(R1) ; ; movl R0, media ; movb #0,state ; state memorizza lo stato (IN=0, OUT=1) SETIM sensore1 SETIM sensore2 SETIM sensore3 SETIM sensore4 SETIM alarm SETI START sensore1; START sensore2; START sensore3; START sensore4; pop r1 pop r0 ret ; DRIVER Sensore1 driver 0, 1600h movl #sensore1, device jsr GET rti driver 1, 1650h movl #sensore2, device jsr GET rti driver 2, 1700h movl #sensore3, device jsr GET rti driver 3, 1750h movl #sensore4, device jsr GET rti ;... driver 4, 1800h OUTB SWITCH, alarm start alarm clrim alarm rti ; SUBROUTINE GET: ACQUISIZIONE DATI DALLA PERIFERICA IL CUI INDIRIZZO E' SPECIFICATO ; IN R5. AGGIORNAMENTO MEDIA TRAMITE SUBROUTINE NEWMEDIA E INVIO SEGNALI D'ALLARME GET: PUSH r0 push r4 push r5 movl #baseadd, R0 movl device,r5 asll #2,r5 ; r5=device*4 ADDL r5, R0 ; r0=baseadd+device*4 asrl #2,r5 INL r5, (R0); lo prelieva e lo mette in RAM nel corrispondente buffer START r5 JSR NEWMEDIA MOVL media, R5 ; carico la media aggiornata in R5 movb state, R4 CMPL #upbound , R5 JNC OUT ; upbound <= R5 CMPL #lowbound, R5; JC OUT ;lowbound > R5 ; altrimenti siamo nell'intervallo [TMIN-TMAX]... CMPb #0, R4 ; verifico se lo stato era IN=0 o OUT=1 JNZ eraout ; exit: pop r5 pop r4 pop r0 RET eraout: MOvb #0 ,switch SETIM alarm movb #0, state jmp exit OUT: CMPb #0, R4 ; verifico se lo stato era IN=0 o OUT=1 JZ erain ; jmp exit erain: MOVb #1 ,switch SETIM alarm movb #1, state jmp exit ; aggiorna la media in base ai valori presenti nelle 4 longwords a partire da baseadd NEWMEDIA: PUSH R0 PUSH R1 MOVL #baseadd,R1 XORL R0,R0 ADDL (R1),R0 ADDL 4(R1), R0 ADDL 8(R1), R0 ADDL 12(r1), R0 ASRL #2, R0 MOVL R0, media POP R1 POP R0 RET end