; PROGRAMMA DIMOSTRATIVO SULL'USO DEI DEVICES
; Una periferica di input invia dati in un buffer di 1byte con il meccanismo degli
; interrupt, la periferica di output preleva il dato dal suddetto buffer
; Nel simulatore è necessario installare due periferiche:
;
; INPUT:	I/O=I, ind=30h, IVN=2
; OUTPUT:	I/O=O, ind=56h, IVN=7



	org 400h 	;INIZIO PROGRAMMA 

input	equ 30h		;indirizzo periferica input
output	equ 56h		;indiririzzo periferica output
flag	db 0		;flag =0 buffer vuoto, flag=1 buffer pieno
buffer	equ 500h	;indirizzo buffer di scambio

	
	code		;inizio istruzioni
	
	seti		;abilita PD32 ad accettare interruzioni
	setim input	;abilita periferica di input ad accettare interruzioni
	setim output	;abilita periferica di output ad accettare interruzioni

main:	movb r0,r1	;inizio progr. principale
	jmp main
			;fine progr. principale


;DRIVER DI INPUT
;Invia dati al buffer se questo e' pieno pone in attesa la periferica
;di input   0->IM, sblocca (se in attesa) la periferica di output 1->IM
	
	driver 2, 600h 		;Il driver della periferica con IVN=2
				;inizia dall'ind. 600h

pinput:	push r0			;salva contenuto di R0
	movb flag,r0		;carica flag in R0
	cmpb #1,r0		;controlla se buffer pieno
	jz inibisci		;se pieno pongo in attesa la periferica di input
accetta:			;altrimenti invia dato
	movb #1,flag		;pongo il flag=1 (buffer pieno)
	inb input,buffer	;carico dato nel buffer 
	start input		;abilito periferica di input a generare un nuovo dato
	jnim output,sbloccao	;se periferica di output e' in attesa la sblocco	
	jmp fineinp		;termina
inibisci:clrim input		;pone perif. input in attesa (buffer pieno)
fineinp:pop r0			;fine driver
	rti			;ritorno da interruzione	

sbloccao:setim output		;sblocco periferica output
	jmp fineinp
 
;FINE DRIVER DI INPUT


;DRIVER DI OUTPUT
;Preleva dati dal buffer se questo e' vuoto pone in attesa la periferica
;di output   0->IM, sblocca (se in attesa) la periferica di input 1->IM

	driver 7,700h		;Il driver della periferica di IVN=7
				;inizia dall'indirizzo 700h

poutput:push r0			;salva contenuto di R0
	movb flag,r0		;carica flag in R0
	cmpb #0,r0		;il buffer e' vuoto?
	jz blocca		;se vuoto pongo in attesa la periferica di output
consuma:
	outb buffer,output	;altrimenti invio dato alla periferica di output
	movb #0,flag		;pongo flag=0 (buffer vuoto)
	start output		;abilito perif. output a consumare il dato
	jnim input,sblocca	;se perif. di input 'in attesa' la sblocco
	jmp esci		;termina
blocca:	clrim output		;blocco perif. output (buffer vuoto)
esci:	pop r0			;termina prog.		
	rti			;ritorna da interruzione

sblocca:setim input		;sblocco input
	jmp esci

;FINE DRIVER DI OUTPUT


	end		;FINE PROGRAMMA
		