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 ADDOUT equ 1000h; ADDIN EQU 404H; code ;inizio istruzioni main: ; calcola il centro dell'intervallo [Tmin-Tmax] ... movl #lowbound, R0 ; movl #upbound, R1 ; addl R1, R0 ; asrl #1, R0 ; e lo memorizza in R0 movl R0, R1 ; i registri R0.. R3 saranno utilizzati movl R0, R2 ; per memorizzare le temperature acquisite movl R0, R3 ; dalle periferiche e sono inizializzati al ; valor medio dell'intervallo [Tmin-Tmax] movl R0, media ; XORL R4, R4 ; R4 memorizza lo stato (IN=0, OUT=1) JSR init1; ; avvia i 4 sensori ; POLLING sui 4 sensori POLL1: JR sensore1 , IN1 POLL2: JR sensore2 , IN2 POLL3: JR sensore3 , IN3 POLL4: JR sensore4 , IN4 JMP POLL1 IN1: movl #sensore1, R5 JSR GET; JMP POLL2 IN2: movl #sensore2, R5 JSR GET; JMP POLL3 IN3: movl #sensore3, R5 JSR GET; JMP POLL4 IN4: movl #sensore4, R5 JSR GET; JMP POLL1 HALT ; NB. questa istruzione non è mai raggiungibile ; Subroutine che avvia i 4 sensori di temperatura init1: START sensore1 ; avvia l'acquisizione della temperatura sul sensore 1 START sensore2 ; avvia l'acquisizione della temperatura sul sensore 2 START sensore3 ; avvia l'acquisizione della temperatura sul sensore 3 START sensore4 ; avvia l'acquisizione della temperatura sul sensore 4 RET ; SUBROUTINE GET: ACQUISIZIONE DATI DALLA PERIFERICA IL CUI INDIRIZZO E' SPECIFICATO ; IN R5. AGGIORNAMENTO MEDIA TRAMITE SUBROUTINE NEWMEDIA E INVIO SEGNALI D'ALLARME GET: INL R5, R6 ; preleva dalla periferica indirizzata da R5 e lo mette in R6 START R5 ; riavvia la periferica indirizzata da R5 per l'acquisizione di un nuovo dato JSR NEWMEDIA MOVL media, R5 ; carico la media aggiornata in R5 CMPL #upbound , R5 JNC OUT ; upbound <= R5 CMPL #lowbound, R5; JC OUT ;lowbound > R5 ; altrimenti siamo nell'intervallo [TMIN-TMAX]... CMPL #0, R4 ; verifico se lo stato era IN=0 o OUT=1 JNZ eraout ; RET eraout: MOVL #0,R4 ; ora diventa IN here2: JNR alarm, here2 OUTL #0, alarm START alarm RET OUT: CMPL #0, R4 ; verifico se lo stato era IN=0 o OUT=1 JZ erain ; RET erain: MOVL #1,R4; ora diventa OUT here: JNR alarm, here OUTL #1, alarm START alarm RET ; aggiorna la media in base al valore acquisito dalla periferica indirizzata da R5 e memorizzato in R6. ; prevede che in R0...R3 ci siano i valori precedentemente acquisiti dai sensori NEWMEDIA: PUSH R6 PUSH R4 MOVL MEDIA, R4 CMPL #sensore1, R5 JZ D1 CMPL #sensore2, R5 JZ D2 CMPL #sensore3, R5 JZ D3 CMPL #sensore4, R5 JZ D4 D1: ASRL #2, R6 ASRL #2, R0 SUBL R0, R4 ADDL R6, R4 MOVL R4, media POP R4 POP R0 ; notare a PUSH r6, corrisponde POP R0 => sovascrivo in R0 il nuovo valore rilevato RET D2: ASRL #2, R6 ASRL #2, R1 SUBL R1, R4 ADDL R6, R4 MOVL R4, media POP R4 POP R1 ; notare a PUSH r6, corrisponde POP R0 => sovascrivo in R0 il nuovo valore rilevato RET D3: ASRL #2, R6 ASRL #2, R2 SUBL R2, R4 ADDL R6, R4 MOVL R4, media POP R4 POP R2 ; notare a PUSH r6, corrisponde POP R0 => sovascrivo in R0 il nuovo valore rilevato RET D4: ASRL #2, R6 ASRL #2, R3 SUBL R3, R4 ADDL R6, R4 MOVL R4, media POP R4 POP R3 ; notare a PUSH r6, corrisponde POP R0 => sovascrivo in R0 il nuovo valore rilevato RET end