; 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