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

