Simulazione di un DMA controller
Transcript
Simulazione di un DMA controller
Simulazione di un DMA controller Nelle operazioni di I/O, quando la velocità del trasferimento dei dati assume un valore troppo alto, il metodo delle interruzioni non è più utilizzabile. Infatti, il tempo per lo svolgimento della sequenza d' interruzione e per l' esecuzione della routine, che serve l' interruzione, può essere maggiore di quello disponibile. In questi casi è d' obbligo l' uso di un DMA controller il quale è capace di diventare il padrone del bus e supervisionare un trasferimento tra la memoria ed un' interfaccia periferica o una memoria di massa senza l' intervento del processore. Mentre esegue un trasferimento, esso è capace di porre indirizzi di memoria sul bus e di spedire e ricevere i segnali necessari per l' effettuazione di operazioni di lettura e scrittura in memoria e sulle interfaccie periferiche. Lo scopo di un DMA controller è quindi quello di realizzare una sequenza di trasferimenti rubando cicli di bus al processore. E' chiaro che nello sforzo di completare il nostro ambiente di simulazione di architetture a microprocessore, questo tipo di dispositivo non poteva mancare. Il componente preso di riferimento per questa simulazione è l' Intel 8237. 92 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller 5.1 Generalità L' Intel 8237 è un controllore programmabile per l' accesso diretto in memoria (DMA) a 4 canali, dove il canale è una porzione del componente che serve una singola interfaccia; esso gestisce le richieste in arrivo sui vari canali attraverso una logica a priorità fissata o rotante. Il trasferimento dei dati può avvenire in 4 modi diversi: ♦ nel modo single il controllore dopo ogni trasferimento rilascerà il bus al processore per almeno un ciclo di bus, dopo inizierà di nuovo a testare la linea di richiesta e se attiva, procederà a 'rubare' un altro ciclo; ♦ nel modo block la linea di richiesta è sufficiente che sia attiva solo fino al riconoscimento, dopo il quale il bus non sarà rilasciato fino al trasferimento dell' intero blocco; ♦ il modo demand è simile a quello block con la diffe- renza che il trasferimento del blocco continua fin quando la linea di richiesta è attiva, ma, quando il trasferimento viene sospeso e poi ripreso esso inizia dal punto in cui era stato sospeso; ♦ il modo cascade permette di realizzare, collegando più controllori 8237 in cascata, sistemi DMA con più di 4 canali. Il blocco di dati che possiamo trasferire in una sola opera zione è di 65536 byte; all a f i ne del tra sf eri mento 93 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller viene avvisato il processore o la periferica che lo aveva richiesto attraverso una linea di fine conteggio posseduta dal controllore. Altre caratteristiche del dispositivo sono: ♦ autoinizializzazione, ♦ trasferimenti da memoria a memoria, ♦ richiesta di DMA programmata, ♦ inibizione di un canale. Figura 1 94 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller La differenza sostanziale, tra l' Intel 8237 e il componente da noi simulato, è il minor numero di canali, che sono stati ridotti da 4 a 2 ed i modi di trasferimento che sono i seguenti: single e block. In figura 1 è mostrato il suo modello con i registri e le linee fisiche simulate. 5.2 Configurazione I dispositivi a cui si collega un D.M.A. controller in una configurazione sono: ♦ un processore, che avendo accesso ai registri del di- spositivo, attraverso il sistema bus, permette la pro- grammazione del componente; ♦ delle periferiche alle quali vogliamo permettere l' ac- cesso diretto in memoria. 5.2.1 Collegamento al processore Le linee di collegamento al processore, sono mostrate sulla sinistra dello schema, in figura 1. D0-D7 sono 8 linee che vanno connesse al bus dati per il trasferimento dei dati da e verso il componente. La linea CS è utilizzata per la selezione del dispositivo, invece, i registri interni sono selezionati dai 4 bits meno significativi del bus indirizzo: A0-A3, e dai segnali di lettura-scrittura sul componente: IOW e IOR. 95 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller Come acccennato in precedenza, il controllore per eseguire un trasferimento deve spedire i segnali necessari per l' effettuazione di operazioni di lettura e scrittura in memoria (MEMR e MEMW) e sulle interfaccie periferiche (IOR e IOW). Sulle linee CLK e Reset arrivano rispettivamente il segnale dal generatore di clock e il segnale per cancellare tutti i registri del controllore. La linea HRQ è adoperata per spedire una richiesta di controllo del sistema bus. Essa normalmente è applicata all' ingresso HOLD della CPU. Figura 2 Invece, un segnale, in arrivo dalla CPU, sulla linea HLDA indica che è stato aquisito il sistema bus. Infine la linea d' interruzione EOP trasmette, al processore o ad un eventuale gestore delle interruzioni, un 96 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller interruzione per avvisare che il trasferimento di un blocco di memoria è stato completato. Un esempio di collegamento del controllore ad un processore è mostrato in figura 2. 5.2.2 Collegamento ad un device Sulla destra dello schema in figura 1 sono mostrate le linee fisiche che collegano il DMA controller a delle periferiche. DREQ0 e DREQ1 sono le linee di richieste, usate dalle periferiche collegate ai rispettivi canali, per ottenere dei cicli DMA. Le richieste che arrivano su DREQ0 hanno precedenza su quelle che arrivano su DREQ1. DACK1 e DACK2 informano la periferica, connessa a quel canale, che è stata selezionata per un ciclo DMA. Queste linee si comportano, nei confronti dei componenti periferici che richiedono questo servizio, come un "chip select". Un esempio di connessione di due interfaccie seriali è rappresentato in figura 3. 97 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller Figura 3 5.2.3 Collegamento software Per inserire questo componente in una nostra configurazione, bisogna attenersi alla stessa procedura seguita per gli altri componenti di tipo Device. I parametri presenti nella finestra Aggiungi Device mi permettono di gestire la connessione del controllore con gli altri componenti della configurazione.Viene ora specificato il significato dei singoli parametri. Nome Elemento è utilizzato per specificare il tipo di componente da inserire, nel nostro caso deve essere I8237DMA. Identificatore deve essere un numero compreso tra 01 ed FF e viene utilizzato dal programma per riferirsi a questo dispositivo. Indirizzo1 rappresenta l' indirizzo più basso per indirizzare il componente, nel caso del controllore per l' 98 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller accesso diretto in memoria esso deve essere un numero divisibile per 16. Indirizzo2 definisce l' indirizzo più alto per indirizzare il componente, esso deve essere uguale ad Indirizzo 1 + F. Questi ultimi due parametri permettono di definire per quali indirizzi il decodificatore d' indirizzi attiva la linea CS. Infatti, se l' indirizzo sul bus indirizzo è compreso tra Indirizzo1 e Indirizzo2 , il componente viene selezionato, cioè l' operazione di lettura o scrittura è eseguita su un suo registro. COM1 determina l' Identificatore del bus a cui è connesso il dispositivo. Quindi, scegliendo per COM1 l' identificatore di un componente MMU/BUS si connettono le linee D0-D7, A0-A7, IOR, IOW, MEMR, MEMW, CLK e Reset del DMA a quel sistema bus. COM2 definisce l' Identificatore della CPU alla quale richiedere il controllo del bus e quindi a quale processore collegare le linee HRQ e HLDA. COM4: specifica l' Identificatore del gestore delle interruzioni che può essere sia un componente di tipo CPU che di tipo PIC. COM3 viene utilizzato per specificare l' interruzione trasmessa al componente, specificato in COM4, quando termina un conteggio in un canale. Delle quattro cifre esadecimali, che definiscono COM3 la meno significativa individua la linea d'interruzione, la seconda definisce la 99 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller priorità e le due più significative specificano il "vector number" da trasmettere al processore che gestisce l' interruzione. Se le interruzioni sono gestite da un P.I.C., queste due cifre non devono essere specificate. I due parametri COM3 e COM4 permettono, quindi, di gestire la connessione della linea d' interruzioni EOP al processore o al P.I.C. COM5 le 2 cifre meno significative e le 2 più significative specificano rispettivamente l' Identificatore del componente collegato al canale 0 e al canale 1. Specificando il valore in COM5 si definisce a quali componenti collegare le coppie di linee (DREQ0, DACK0) e (DREQ1, DACK1). La finestra associata al modulo I8237DMA è quella in figura 4. 5.3 Modello di programmazione I registri programmabili del controllore sono quelli illustrati in figura 4. 100 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller Figura 4 Per accedere ad un registro occorre che esso sia compreso tra i valori Indirizzo1 ed Indirizzo2 (valori inseriti prima della creazione del dispositivo). La selezione dei registri nel DMA controller avviene attraverso i 4 bits meno significativi indirizzo relativo dell' indirizzo; questi formano l' con valore che va da 0 ad F esadeci- male. Nel nostro dispositivo ai registri appartenenti al canale 0 è stato dato un nome teminante con '0' mentre a quelli appartenenti al canale 1 un nome terminante con '1'. Iniziamo questa descrizione dai registri CADDR0 e CADDR1 cioè dai registri indirizzo corrente. Essi sono dei registri a 16 bits che hanno il compito di contenere l' indirizzo della prossima locazione di memoria che deve partecipare al trasferimento. Nel caso del trasferimento da memoria a memoria CADDR0 contiene l' indirizzo sorgente e CADDR1 l' indirizzo destinazione. In ogni caso entrambi i registri sono accessibili sia in lettura che in 101 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller scrittura ed il loro indirizzo relativo è 0 per CADDR0 ed è 2 per CADDR1. BADDR0 e BADDR1 sono i registri indirizzo di base ed hanno la funzione di conservare gli indirizzi iniziali rispettivamente di CADDR0 e CADDR1. Essi sono a 16 bits e sono accessibili solo in fase di scrittura; infatti, quando viene scritto un valore in un registro indirizzo corrente, questo vien copiato anche nel relativo registro di base ed il valore rimane immutato fino a quando non si verifica un' altra scrittura. I registri CCOUNT0 e CCOUNT1, detti registri di conteggio correnti, sono anch' essi dei registri a 16 bit e mantengono i l numero di byte che devono essere ancora trasferiti, sono accessibili in lettura e scrittura ed il loro indirizzo relativo è 1 per CCOUNT0 e 3 per CCOUNT1.Nel caso di trasferimento da memoria a memoria il conteggio viene effettuato da CCOUNT1. BCOUNT0 e BCOUNT1 sono i registri a 16 bit detti di conteggio di base ed hanno la funzione di conservare gli indirizzi iniziali rispettivamente di CCOUNT0 e CCOUNT1, essi sono accessibili solo in fase di scrittura. Infatti, quando viene scritto un valore in un registro di conteggio corrente questo vien copiato anhe nel relativo registro di base ed il valore rimane immutato fino a quando non si verifica un' altra scrittura. I registri, che contengono le informazioni relative al modo di funzionamento dei rispettivi canali, sono stati 102 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller chiamati MODE0 e MODE1. Essi possono essere accessi solo in scrittura ed hanno entrambi indirizzo relativo pari a B; la selezione tra i due avviene sul valore del bit meno significativo del dato: se 0, il dato viene scritto in MODE0 altrimenti in MODE1. Il significato dei bits dei registri MODE0 ed MODE1 sono illustrati nella tabella 1. RF0 e RF1 rappresentano i flags delle richieste, cioè i flags dove indirizzare richieste di tipo software al DMA, queste producono gli stessi effetti di quelle provenienti dalle interfacce dei dispositivi. Questi flags sono accessibili solo in scrittura e l' indirizzo relativo per entrambi è 9. Anche in questo caso la selezione del canale avviene sul bit meno significativo del dato: 0 per il canale 0 ed 1 per il canale 1. Il valore che deve assumere il flags deve essere posto sul bit numero 3 del dato. Alri flags presenti nel nostro componente sono MF0 e MF1. Questi mascherano le richieste dei rispettivi canali, cioè una richiesta non viene inoltrata al processore se il mask flags di quel canale è posto ad 1. MF0 ed MF1 sono accessibili solo in scrittura, per entrambi l' indirizzo relativo è A, il canale selezionato è pari al valore del bit 0 del dato ed infine il valore da inserire nel flag deve esssere posto sul bit 2 del dato. In un trasf eriment o da memoria a memoria il byte da spostare viene letto dalla locazione sorgente e spostato in un registro temporaneo, che è stato chiamato TEMP, a questo punto viene realizzata una scrittura col valore di 103 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller TEMP nella locazione di memoria di destinazione. Questo registro può essere solo letto ed ha indirizzo relativo pari a D. Tabella 1 : significato dei bits nei registri MODE bit significato 0 instrada il dato su un canale, è uguale a 0 per il canale 0 ed 1 per il canale 1 1/2 non utilizzati 3 indica la direzione di trasferimento: 0 per trasferimenti da memoria ad interfaccia, 1 da interfaccia a memoria 4 il valore 1 abilita l' autoinizializzazione, cioè al termine del conteggio i registri indirizzo e di conteggio correnti sono caricati con i valori dei rispettivi registri di base 5 il valore 1 abilita il decremento di una unità del valore contenuto in CADDR di quel canale dopo ogni trasferimento di un byte; deve essere posto a 0, se vogliamo l' incremento 6 non utilizzato 104 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller determina il modo del trasferimento: poniamo il va- 7 lore 0 per il modo Single ed 1 per il modo Block; nel primo caso il bus viene rilasciato al processore alla fine di ogni trasferimento, viceversa, nel modo block il bus viene rilasciato dopo il trasferimento dell' intero blocco L'ultimo registro da descrivere è CNTRL; esso è diviso in 2 parti: i 4 bits meno significativi rappresentano i bits di stato del componente, mentre quelli più significativi i bits di controllo. Su questo registro possono essere fatti accessi, all' indirizzo relativo 8, sia in lettura che in scrittura, queste ultime però non influenzano i 4 bit di stato. Il significato dei bits di CNTRL é specificato in tabella 2. Tabella 2 : significato dei bits di CNTRL bit azione svolta se il bit è posto ad 1 0 termine conteggio per il canale 0 1 termine conteggio per il canale 1 2 è stata inoltrata una richiesta al canale 0 3 è stata inoltrata una richiesta al canale 1 4 non utilizzato 5 abilita il trasferimento da memoria a memoria 105 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller 6 impone che in un trasferimento da memoria a memoria l' indirizzo sorgente deve rimanere costante per trasf erire un byte in pi ù locaz ioni di memori a 7 abilita il DMA controller Un quadro riassuntivo sull' indirizzamento dei registri e dei flags del componente è riportato in tabella 3. Tabella 3 : indirizzamento dei registri e dei flags del DMA controller Indirizzo relativo Indirizzo Tipo di Nome del registro o esadecimale relativo binario accesso del flag 0 0000 W/R CADDR0 1 0001 W/R CCOUNT0 2 0010 W/R CADDR1 3 0011 W/R CCOUNT1 8 1000 W/R CNTRL 9 1001 W RF0/RF1 A 1010 W MF0/MF1 B 1011 W MODE0/MODE1 D 1101 R TEMP 5.4 Descrizione dei comandi 106 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller I comandi disponibili sono: ♦ RESET che riporta il componente nello stato iniziale azzerando tutti i registri; per attivarlo basta accedere in scrittura all' indirizzo relativo D; ♦ Clear Mask Flags (CMF) che cancella tutti i flags MF, si attiva scrivendo all' indirizzo relativo E; ♦ Write All Mask Flags (WAMF) che permette di fissare contemporaneamente tutti i flags MF; la scrittura deve avvenire all' indirizzo relativo F ed il valore di MF0 deve essere posto nel bit 0 del dato, mentre il valore di MF1 nel bit 1. In tabella 4 sono presentati gli indirizzi di attivazione dei comandi. Tabella 4 : indirizzi dei comandi del DMA controller Indirizzo relativo Indirizzo Tipo di Nome del esadecimale relativo binario accesso comando D 1101 W RESET E 1110 W CMF F 1111 W WAMF 5.5 Programmazione Prima che sia effettuata la richiesta di un trasferimento dati tra la memoria ed una interfaccia periferica si 107 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller devono fissare i valori nei registri del canale interessato al trasferimento e nel registro di controllo. Nell' ipotesi che il canale adoperato sia quello '0', le operazioni da eseguire sono le seguenti: ♦ scrivere all' indirizzo relativo 0 (registro CADDR0) una w ord indi cante l ' i ndi rizzo del primo byt e, del bl occo in memoria, da trasferire; ♦ scrivere all' indirizzo relativo 1 (registro CCOUNT0) una word indicante il numero di byte che si vuole trasferire; ♦ scrivere all' indirizzo relativo B esadecimale (re gi st ro MODE0) un byte che indic hi i l modo di f unzionare del canale (direzione del trasferimento, autoinizializzazione, incremento o decremento di CADDR0, modo del trasferimento Single o Block); ♦ scrivere all' indirizzo relativo 8 (registro CNTRL) un byt e c he abil iti il control lore. Un primo esempio di inizializzazione è illustrato in figura 5; in esso si presuppone che A0 sia stato precedentemente caricato con l' indirizzo più basso associato al DMA controller. MOVE.W MOVE.B MOVE.B MOVE.B #$1000,0(A0) #$20,1(A0) #$10,11(A0) #$80,8(A0) Figura 5 108 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller Queste istruzioni abilitano il controllore a realizzare un trasferimento di tipo SINGLE dalla memoria all' interf a ccia coll egata al canal e 0. Il numero di byte da t rasf eri re è 32 (20 esad.), gli indirizzi sono quelli crescenti da 1000 esad. in poi. Infine è stata abilitata l' autoinizializzazione, che permette di ricaricare, al termine del trasferimento, i registri CADDR0 e CCOUNT0 con i rispettivi registri di base, rendendo così il componente pronto ad eseguire un nuovo trasferimento. Il trasferimento inizia, comunque, quando la periferica collegata al canale '0' spedisce una richiesta al DMA e quest' ultimo l' accetta. La richiesta potrebbe anche realizzarsi via software con la seguente istruzione: MOVE.B #$08,9(A0) Per un trasf erime nt o di un bl oc co di byte al l' interno della memoria le operazioni da eseguire sono le seguenti: ♦ scrivere all' indirizzo relativo 0 (registro CADDR0) e 2 (registro CADDR1) due word indicanti gli indirizzi del primo byte , del blocco in memoria, rispettivamente sorgente e destinazione; ♦ scrivere all' indirizzo relativo 3 (registro CCOUNT1) una word indicante il numero di byte che si vuole trasferire; ♦ scrivere due volte all' indirizzo relativo B esadeci- male (re gi st ri MOD E0 e MODE1) un byte che i ndi chi i l modo di funzionare del canale 0 (sorgente) e del canale 1 109 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller (destinazione) per quanto riguarda l' autoinizializzazione e l' incremento o il decremento di CADDR0 e CADDR1); ♦ byt e scrivere all' indirizzo relativo 8 (registro CNTRL) un che abiliti il controllore ed il trasferimento da memoria a memoria. Un esempio di inizializzazione su questo tipo trasferimento è riportato in figura 6; anche in questo esempio in A0 è presente l' indirizzo più basso associato al DMA controller. MOVE.W MOVE.W MOVE.B MOVE.B MOVE.B MOVE.B #$1000,0(A0) #$2000,2(A0) #$40,3(A0) #$00,11(A0) #$01,11(A0) #$A0,8(A0) Figura 6 Queste istruzioni abilitano il controllore a realizzare un t rasfe rimento in me mori a di un blocco di 64 byt e (40 esad.) a partire dall' indirizzo (sorgente) 1000 esad. in poi. Esso deve essere trasferito nella zona di memoria successiva all' indirizzo 2000 esad. (destinazione). Infine è stata disabilitata l' autoinizializzazione sia per il canale sorgente che per quello destinazione. 5.6 Il comportamento. 110 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller Un DMA controller è progettato per servire una o più interfaccie, nel nostro caso le interfaccie collegabili sono massimo 2. Questa scelta è dettata dall' esiguo numero di parametri che definiscono un Chip in ASIM. Una convenzione stabilita per le periferiche che si collegano a un canale di questo dispositivo è che i dati sono trasferiti riferendosi al suo indirizzo più basso, cioè al valore del parametro Indirizzo 1 di quella periferica. Il controllore quando richiede il bus ad un processore blocca le operazioni di quest' ultimo fino al momento del rilascio il bus. In questa descrizione, quando ci riferiremo ad un registro senza indicare il numero finale del suo nome, s' intenderà il registro relativo al canale sul quale si sta realizzando il trasferimento. Quando un device collegato ad un canale del D.M.A. manda una richiesta, e il flag MF di quel canale è uguale a zero, viene settato il bit corrispondente in CNTRL: il bit 2, se la richiesta è pervenuta sul canale 0, o il bit 3, se la richiesta soppraggiunge sul canale 1. Se poi il bit 7 del registro CNTRL (che abilita il dispositivo) è uguale a uno, il dispositivo spedisce al processore una richiesta di bus il quale nel nostro caso viene automaticamente concesso. La direzione del trasferimento dipende dal valore del bit 3 del registro MODE di quel canale, se pari a zero, il trasferimento si realizza dalla memoria al device, altri- 111 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller menti avviene nella direzione opposta. Se, invece, il bit 5 di CNTRL è uguale ad 1, il trasferimento si verifica da memoria a memoria. Una volta impossessatosi del bus il controllore effettua, per un trasferimento da Device a memoria, una lettura all' indirizzo più basso associato al device e una scrittura del dato letto all' indirizzo di memoria presente nel registro CADDR di quel canale, ovviamente, nel caso di trasferimento da memoria a device, le operazioni sono invertite. Comunque in entrambi i casi viene decrementato di una unità il registro CCOUNT del relativo canale mentre il registro CADDR viene incrementato o decrementato di una unità rispettivamente, se il bit 5 del registro MODE è pari a zero o ad uno. Il bus viene rilasciato al processore dopo il trasferi mento de l singolo byte o del l' intero blocco se rispett ivamente il valore del bit 7 di MODE è zero o uno. Al termine del trasferimento di un blocco, cioè quando il valore CCOUNT diventa nullo, ♦ viene cancellato il flag RF (è il flag dove un proces- sore può indirizzare le sue richieste ed hanno gli stessi effetti di quelle che arrivano dai device), ♦ è azzerato il bit 2 o 3 di CNTRL (bits delle richie- ste) se abbiamo utilizzato rispettivamente il canale zero o uno, 112 _________________________________________________________________________________ Capitolo 5: Simulazione di un DMA contoller ♦ è posto ad uno il bit 0 o 1 di CNTRL (bits di fine conteggio) rispettivamente per il canale zero e uno, ♦ infine viene inviata un' interruzione del tipo specifi- cato in COM3 al gestore delle interruzioni specificato in COM4. Per un trasferimento da memoria a memoria viene effettuata, prima una operazione di lettura all' indirizzo contenuto in CADDR0 ed il dato viene posto nel registro TEMP, poi questo valore viene scritto all' indirizzo di memoria contenuto in CADDR1. Dopo un trasferimento il registro CCOUNT1 viene decrementato di una unità mentre CADDR0 e CADDR1 vengono incrementati o decrementati di una unità, se il bit 5 dei rispettivi registri MODE è pari a zero o ad uno. Se però il bit 6 di CNTRL è posto ad 1 allora CADDR0 rimane costante durante il trasferimento. Il bus viene rilasciato al processore dopo il trasferimento dell' intero blocco, cioè quando il valore in CCOUNT1 diventa nullo. Alla fine del trasferimento viene azzerato il bit 5 di CNTRL, il quale attiva i trasferimenti da memoria a memoria. Qualunque sia il tipo di trasferimento, se il bit 4 di un registro MODE è fissato ad 1, allora al termine del trasferimento di un blocco i registri CADDR e CCOUNT di quel canale sono caricati con i valori rispettivamente di BADDR e BCOUNT; questi registri in fase di scrittura di CADDR e CCOUNT assumono il loro stesso valore. 113 _________________________________________________________________________________ Capitolo 6 Esempi di configurazioni In questo capitolo vengono presentati alcuni esempi al fine di chiarire meglio quanto esposto in precedenza sulla creazione di una configurazione e sul funzionamento dei singoli componenti. Per ciascuna configurazione sono anche descritti uno o più programmi assembler per il Motorola 68000 che, eseguiti durante la simulazione, consentono di verificare il corretto funzionamento della macchina (configurazioni e programmi di seguito presentati sono disponibili sul dischetto allegato). 6.1 Prova del simulatore dell' interfaccia seriale Per la prova dell' interfaccia seriale sono state realizzate due configurazioni i cui nomi sono usarfull.cfg e usarpart.cfg. Entrambe le configurazioni sono costituite da due macchine identiche che comunicano attraverso le loro interfaccie seriali. In questo paragrafo sarà descritto solo la configurazione usarfull.cfg, il cui schema è mostrato in figura 1, poichè usarpart.cfg si differenzia solo per la mancanza delle linee di handshaking. 114 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Figura 1 Il collegamento usarfull.cfg tra le due interfaccie seriali di è di tipo pieno, cioè, sono connesse sia attraverso le linee dati (Tx e Rx) che attraverso le linee di handshaking (DSR, DTR, CTS, RTS). Una descrizione più dettagliata sulla loro connessione è presentata in figura 2. 115 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Figura 2 Ogni macchina della configurazione usart.cfg è costituita da un bus/memoria (MEMORY), un processore (M68000), un video+tastiera (TERMINAL) e un' interfaccia seriale (I8251USART). Iniziamo la descrizione della prima macchina. Il bus/memoria (MEMORY, Identificatore = 1) ha una RA M da 16 Kbyte (C om3 = 10 e sad. ), a pa rtire dal l' indirizzo 8000 esad. (Indirizzo 1 = 8000) e ROM da 8 116 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni (Com4 K byte = 8 esad) a partire dall' indirizzo 0 (Indirizzo 2 = 0). Il processore è un Motorola 68000 (M68000, Identificatore = 2) con valore iniziale per l' "user stack pointer" pari a 9000 esad. (Indirizzo 1 = 9000) e valore iniziale per il "supervisor stack pointer" uguale a 9200 esad. (Indirizzo 2 = 9200); esso è collegato al bus (Com1 = 1, che è l' Identificatore del bus/memoria). Il terminale video+tastiera (TERMINAL, Identificatore = 3), con registro dato all' indirizzo 2000 esad. (Indirizzo 1 = 2000) e registro controllo all' indirizzo 2001 esad. (Indirizzo 2 = 2001), è connesso al bus (Com1 = 1, Identificatore del bus/memoria) ed ha come linee d' interruzione connesse al processore (Com2 = 2, che è il valore dell' Identificatore del processore) quelle di livello 1 (Com3 = 1) e 2 (Com4 = 2). L' interfaccia seriale è un Intel 8251A (I8251USART, Identificatore = 4) con gli indirizzi per accedere ai suoi registri pari (Indirizzo 2 (Indirizzo a 2004 = 2005), entrambi 1 = 2004) esadecimali. e 2005 Essa è connessa al bus (Com1 = 1, Identificatore del bus), ad un gestore delle interruzioni (Com2 = 2, Identificatore del processore) e all' altra interfaccia seriale in modo pieno (Com5 = 0008, le due cifre più significative: 00, indicano una connessione Identificatore piena, dell' le altre interfaccia due: seriale 08, indicano della l' seconda 117 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni macchina). Le linee di interruzione connesse al processore sono le linee 3 (Com3 = 3) e 4 (Com4 = 4). In questa configurazione, per tenere conto della minore velocità della frequenza di clock applicata all' interfaccia seriale (frequenza di trasmissione dei bit) rispetto a quella applicata al processore, si è posto a 3 il parametro Speed del menu Device. I parametri caratteristici dei dispositivi delle due macchine sono presentati nelle tabelle 1 e 2. Quanto detto per la prima macchina si può ripetere , tenendo conto dei diversi valori degli Identificatori, per la seconda. Tabella 1: parametri dei dispositivi della prima macchina della configurazione usart.cfg Nome Elemento MEMORY Nome Elemento M68000 Identificatore 01 Identificatore 02 Indirizzo 1 00008000 Indirizzo 1 00009000 Indirizzo 2 00000000 Indirizzo 2 00009200 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0000 0001 0000 0010 0008 0000 0000 0000 0000 0000 Nome Elemento TERMINAL Nome Elemento I8251USART Identificatore 03 Identificatore 04 Indirizzo 1 00002000 Indirizzo 1 00002004 Indirizzo 2 000020001 Indirizzo 2 00002005 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0001 0001 0002 0001 0002 0000 0002 0003 0004 0008 118 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Per la prova delle due configurazioni sono stati prodotti i seguenti programmi assembler asincro1.a68, : asincro2.a68, asincro3.a68, sincron1.a68, sincron2.a68 e sincron3.a68. Questi programmi implementano tutti lo stesso algoritmo, essi consentono di realizzare lo scambio di messaggi tra i due terminali, ma si differenziano nei formati di trasmissione. Tabella 2: parametri dei dispositivi della seconda macchina della configurazione usart.cfg Nome Elemento MEMORY Nome Elemento M68000 Identificatore 05 Identificatore 06 Indirizzo 1 00008000 Indirizzo 1 00009000 Indirizzo 2 00000000 Indirizzo 2 00009200 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0000 0005 0000 0010 0008 0000 0000 0000 0000 0000 Nome Elemento TERMINAL Nome Elemento I8251USART Identificatore 07 Identificatore 08 Indirizzo 1 00002000 Indirizzo 1 00002004 Indirizzo 2 000020001 Indirizzo 2 00002005 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0005 0005 0006 0001 0002 0000 0006 0003 0004 0004 A titolo d' esempio nelle figure 3 e 4 è mostrato il programma asincro1.a68. 119 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Per il trasferimento dei caratteri presenti nel buffer di tastiera all' interfaccia seriale, si è utilizzata la tecnica del polling dato che all' arrivo dell' interruzione ENTER dalla tastiera, tutti i caratteri da trasmettere sono già presenti nel buffer. Per il trasferimento dei caratteri ricevuti dall' interfaccia al video si è, invece, utilizzata la tecnica delle interruzioni. * usart ter * * int1 wait1 wait end org $8200 equ equ $2004 $2000 jmp begin move.l move.l move.l movea.w movea.w move.b andi.b beq move.b move.b cmpi.b #13,D0 beq move.b andi.b beq move.b move.b cmpi.b #13,D0 bne move.b move.l move.l move.l rte A0,-(A7) Salva nel Supervisor Stack Pointer i registri A1,-(A7) utilizzati nella subroutine che serve D0,-(A7) l' interruzione. #ter,A0 #usart,A1 1(A1),D0 Se è stato attivato il segnale DSR , #$80,D0 continua altrimenti attende. wait1 (A0),D0 D0,(A1) Estrae il primo carattere dal buffer della tastiera, lo manda all' interf. seriale, se è un end ENTER termina altrimenti continua. 1(A1),D0 Se l' interf. seriale è pronta per trasmettere #$01,D0 continua altrimenti aspetta. wait (A0),D0 D0,(A1) Estrai il successivo carattere e trasmetti Se è un ENTER termina altrimenti continua. wait #$3b,1(A0) Riabilita la tastiera senza cancellare il video, (A7)+,D0 e pulisce il buffer di tastiera. (A7)+,A1 Ripristina i registri salvati all' inizio. (A7)+,A0 * Figura 3 120 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni int2 move.l movea.w move.b move.l rte A0,-(A7) #ter,A0 #$3f,1(A0) (A7)+,A0 move.l A0,-(A7) Riinizializza il terminale. * int3 move.l move.l movea.w movea.w ricevi move.b andi.b beq move.b move.b stampa move.b move.l move.l move.l rte * int4 rte * begin movea.w move.b move.b * * * * movea.w * loop A1,-(A7) D0,-(A7) #ter,A0 #usart,A1 1(A1),D0 #$38,D0 stampa #$23,(A0) #$37,1(A1) (A1),(A0) (A7)+,D0 (A7)+,A1 (A7)+,A0 #usart,A0 #$5d,1(A0) #$37,1(A0) #ter,A0 move.b #$3f,1(A0) nop bcc loop Salva nel SSP i registri utilizzati. Se non c' è nessun errore nella trasmissione salta a 'stampa' altrimenti continua. Stampa '#' sul video e cancella errori nel registro di stato dell' interf. seriale. Stampa sul video il carattere ricevuto. Ripristina i registri salvati all' inizio. Inizializza l' interfaccia seriale: trasmissione asincrona, 8 bits informazione, bit parità dispari, 2 bits stop. Cancella flags errori , abilita trasmettitore e ricevitore. Attiva i segnali di handshaking DTR e RTS. Inizializza terminale: abilita tastiera, eco, interruzioni ENTER e BUFFER FULL ,cancella video e buffer tastiera Figura 4 Quando vogliamo simulare la configurazione dobbiamo caricare uno dei programmi su entrambe le macchine. Tutti 121 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni i programmi per poter essere eseguiti richiedono che siano preventivamente caricati nella memoria ROM di entrambe le macchine interruzioni; i ciò valori può degli essere "entry fatto point" leggendo il per le file di memoria usart.mem. Quando inizia la simulazione eseguendo uno dei programmi realizzati, ciascun processore inizializza i Device della propria macchina. L' interfaccia seriale viene inizializzata per trasmettere in un determinato modo. Quest' ultimo dipende dal programma scelto per l' esecuzione come è mostrato nelle tabelle 3 e 4. Tabella 3: modi di trasmissione nome pro- asincro1.a68 asincro2.a68 asincro3.a68 gramma tipo di asincrona asincrona asincrona 8 7 6 si si no dispari pari -- 2 1 1 trasmissione n.ro bits informazione presenza bit parità tipo di parità n.ro bits di stop 122 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Inoltre vengono STATUS, registro cancellati sono i bits degli abilitati il errori ricevitore nel ed il trasmettitore, ed attivati i segnali DTR e RTS. Tabella 4 : modi di trasmissione nome sincron1.a68 sincron2.a68 sincron3.a68 programma tipo di sincrona sincrona sincrona 8 7 6 si si no dispari pari -- 2 1 1 trasmissione n.ro bits informazione presenza bit parità tipo di parità n.ro caratteri sync L' inizializzazione del terminale consiste nell' abilitare la tastiera, l' eco e le interruzioni ENTER e BUFFER FULL, e nel cancellare il video e il buffer della tastiera. Dopo l' inizializzazione, ogni macchina si pone in un ciclo in cui non esegue nessuna operazione. Se l' utente scrive una frase sul terminale, alla pressione del tasto 123 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni invio esso lancia un' interruzione (di livello 1) al processore. La routine che serve l' interruzione controlla se è stato attivato DSR e in caso positivo estrae il primo carattere dal buffer e lo invia all' interfaccia seriale; questa, se pronta, trasmette il dato serialmente all' altra interfaccia seriale. Se il carattere estratto è diverso da un ENTER viene verificato se l' interfaccia ha completato la sua trasmissione. In quest' ultimo caso viene estratto un altro carattere ed è inviato all' interfaccia seriale dopo il quale il ciclo si ripete. Se invece un carattere non è stato ancora trasmesso il programma si inserisce in un ciclo d' attesa. Quando è stata trasmessa l' intera frase, cioè è stato estratto un ENTER, viene riabilitata la tastiera senza cancellare il video e pulito il buffer della tastiera. La seconda interfaccia seriale, quando ha ricevuto il carattere trasmesso, completo dei suoi bits di start, di parità e di stop, lancia un' interruzione (di livello 3) al suo processore. La routine che serve questa interruzione controlla se ci sono stati errori nella trasmissione. In loro assenza essa scrive il carattere ricevuto sul video, altrimenti viene scritto il carattere '#' e sono cancellati i bits degli errori nel registro STATUS. Avendo all' inizio abilitato sia il trasmettitore che il ricevitore di ogni interfaccia seriale, possiamo scrivere le 124 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni frasi contemporaneamente sulle due tastiere, realizzando così una trasmissione seriale in entrambi i sensi in modo "full duplex". 6.2 Prova dei simulatori dei terminali seriali e paralleli E' stato realizzata per questa prova un' unica configurazione, denominata ser_par.cfg (schema in figura 5). Figura 5 Si vuole (stampante con simulata questa dal configurazione modulo stampare TERMINALPAR) dei 125 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni caratteri digitati su una tastiera (simulata da TERMINALSER). Il collegamento tra l' interfaccia seriale e la tastiera è di tipo parziale , cioè, sono connesse solo attraverso le linee dati (Tx e Rx). I particolari di questa connessione sono riportati in figura 6, mentre, quelli tra la stampante e l' interfaccia parallela in figura 7. Figura 6 126 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni La configurazione bus/memoria ser_par.cfg (MEMORY), un è costituita processore da un (M68000), un terminale seriale video+tastiera (TERMINALSER), un' interfaccia seriale (I8251USART), una stampante (TERMINALPAR) e un' interfaccia parallela (M6821PIA). Il bus/memoria (MEMORY, Identificatore = 1) ha una RA M da 16 Kbyte (C om3 = 10 e sad. ), a pa rtire dal l' indirizzo 8000 esad. (Indirizzo1 = 8000) e ROM da 8 K byte (Com4 = 8 esad) a partire dall' indirizzo 0 (Indirizzo2 = 0). 127 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Figura 7 Il processore è un Motorola 68000 (M68000, Identificatore = 2) con valore iniziale per l' "user stack pointer" pari a 9000 esad. (Indirizzo1 = 9000) e valore iniziale per il "supervisor stack pointer" uguale a 9200 esad. 128 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni (Indirizzo2 = 9200); esso è collegato al bus (Com1 = 1, che è l' Identificatore del bus/memoria). Il terminale seriale video+tastiera (TERMINALSER, Identificatore = 3) è connesso solo all' interfaccia seriale (Com5 = 4, indica l' Identificatore dell' interfaccia seriale). L' interfaccia seriale è un Intel 8251A (I8251USART, Identificatore = 4) i cui indirizzi per accedere ai suoi registri sono pari a 2000 (Indirizzo1 = 2000) e 2001 (Indirizzo2 connessa = al 2001), bus entrambi (Com1 = esadecimali. 1, Essa Identificatore è del bus/memoria), ad un gestore delle interruzioni (Com2 = 2, Identificatore del processore) e al terminale seriale in modo parziale (Com5 = 0103, le due cifre più significative: 01, indicano una connessione parziale, le altre due: 03, indicano l' Identificatore dell' interfaccia seriale). Le linee di interruzione connesse al processore sono le linee 1 (Com3 = 1) e 2 (Com4 = 2). L' interfaccia parallela è una Motorola MC6821 P.I.A. (M6821PIA, Identificatore = 5) con registri compresi tra gli indirizzi 2004 (Indirizzo1 = 2004) e 2005 (Indirizzo2 = 2005).Essa è connessa al bus (Com1 = 1, Identificatore del bus/memoria) e alla stampante (Com5 = 0206, le due cifre più significative: 02, indicano che la connessione è quella in figura 5, le altre due: 06, indicano l' Identificatore della stampante). 129 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni La stampante (TERMINALPAR, Identificatore = 6) è all' interfaccia parallela (Com5 = 0205, le due collegata cifre più significative: 02, indicano che la connessione è quella in figura 5, le altre due: 05, indicano l' Identificatore dell' interfaccia parallela). I parametri caratteristici dei dispositivi sono presentati nella tabella 5 Per la prova di questa configurazione è stato realizzato il programma assembler ser_par.a68 (figura 8). * usart pia * * int1 * begin * loop org $8200 equ equ $2000 $2004 jmp begin move.w move.w movea.w movea.w move.b move.w move.w rte A0,-(A7) A1,-(A7) #usart,A0 #pia,A1 (A0),2(A1) (A7)+,A1 (A7)+,A0 movea.w move.b move.b movea.w move.b move.b move.b move.b #usart,A0 #$7d,1(A0) #$36,1(A0) #pia,A0 #$00,(A0) #$24,1(A0) #$ff,2(A0) #$24,3(A0) nop bcc loop Salva nel SSP i registri utilizzati nella routine che serve l' interruzione. Invia il carattere, ricevuto dall' interfaccia seriale, all' interfaccia parallela. Ripristina i registri salvati nel SSP. Inizializza l' interfaccia seriale: trasmissione asincrona, 8 bits d' informazione, 1 bit di parità pari e 2 bits di stop Inizializza l' interfaccia parallela Figura 8 130 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Tabella 5: parametri dei dispositivi della configurazione ser_par.cfg Nome Elemento MEMORY Nome Elemento M68000 Identificatore 01 Identificatore 02 Indirizzo 1 00008000 Indirizzo 1 00009000 Indirizzo 2 00000000 Indirizzo 2 00009200 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0000 0001 0000 0010 0008 0000 0000 0000 0000 0000 Nome Elemento TERMINALSER Nome Elemento I8251USART Identificatore 03 Identificatore 04 Indirizzo 1 00000000 Indirizzo 1 00002000 Indirizzo 2 000000000 Indirizzo 2 00002001 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0000 0001 0000 0000 0000 0004 0002 0001 0002 0103 Nome Elemento M6821PIA Nome Elemento TERMINALPAR Identificatore 05 Identificatore 06 Indirizzo 1 00002004 Indirizzo 1 00000000 Indirizzo 2 00002008 Indirizzo 2 00000000 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0001 0000 0000 0000 0000 0206 0000 0000 0000 0205 131 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Il programma per poter essere eseguito richiede che siano stati caricati in memoria ROM i valori degli "entry point" per le interruzioni; ciò può essere fatto leggendo il file di memoria ser_par.mem. Il primo compito svolto da ser_par.a68 è quello di inizializzare l' interfaccia seriale e quella parallela, in modo da uniformare rispettivamente a il quello loro del modo terminale di trasmissione seriale e della stampante, a cui sono collegate. L' modo: interfaccia seriale è inizializzata nel seguente trasmissione asincrona, 8 bits d' informazione, 1 bit di parità pari e 2 bits di stop. Inoltre vengono cancellati i bits degli errori nel registro STATUS, è abilitato il ricevitore e sono attivati i segnali DTR e RTS. L' inizializzazione dell' interfaccia parallela fissa il componente nel seguente modo: ♦ tutte le 8 linee dati A sono programmate come linee d'ingresso, ♦ tutte le 8 linee dati B sono programmate come linee d' uscita, ♦ le linee CA1 e CB1 sono sensibili alle variazioni high/low del segnale, ♦ le linee di richiesta interruzione IRQA e IRQB sono disabilitate, 132 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni ♦ gli accessi all' indirizzo relativo 0 e 2 sono realizzati rispettivamente sui registri PRA e PRB, ♦ la linea CA2 è una linea d' uscita che assume il valore basso in seguito ad un' operazione di lettura su PRA ed il valore alto su una variazione high/low di CA1, ♦ la linea CB2 è una linea d' uscita che assume il valore basso in seguito ad un' operazione di scrittura su PRB ed il valore alto su una variazione high/low di CB1. Dopo l' inizializzazione il processore viene posto in un ciclo in cui non esegue nessuna operazione. In seguito, quando viene digitato un carattere sulla tastiera, esso viene trasmesso serialmente all' interfaccia seriale, la quale nel momento in cui riceve il carattere lancia un' interruzione , sulla linea 1, al processore. La routine che serve l' interruzione non fa altro che inviare il carattere presente nel registro DATAIN dell' interfaccia seriale al registro PRB dell' interfaccia parallela. Quest' ultima, a sua volta, appena riceve il carattere lo trasmette alla stampante per stamparlo. 6.3 Prova dei simulatori dei bloccatori Stopper1.cfg e stopper2.cfg sono i nomi delle configurazioni realizzate per la prova dei simulatori dei bloccatori. Nella prima si prova un bloccatore programmabile, mentre, nella seconda un bloccatore fisso. 133 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni 6.3.1 La configurazione stopper1.cfg In questa configurazione, di cui è riportato lo schema in figura 9, l' interfaccia seriale riceve gli stessi caratteri che trasmette, poichè essi vengono rispediti indietro da un bloccatore fisso. Stopper1.cfg è costituita da una delle due macchine che compongono usart.cfg; questa volta, però, la configurazione i caratteri invece di essere trasmessi ad un' altra interfaccia seriale sono spediti ad un bloccatore. Figura 9 134 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Una descrizione più particolareggiata della connessione piena del bloccatore all' interfaccia seriale è presentata in figura 10. La configurazione è costituita da un bus/memoria (MEMORY), un processore (M68000), un video+tastiera (TERMINAL), un' interfaccia seriale (I8251USART), un bloccatore fisso (STOPPER). 135 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Figura 10 Come precisato all' inizio, i primi quattro dispositivi costituiscono la prima macchina di usart.cfg e quindi sono stati già descritti. Il componente nuovo è rappresentato dal bloccatore (STOPPER, Identificatore = 5). Per simulare il bloccatore 136 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni fisso bisogna lasciare a zero i parametri Indirizzo1 e Com1. Il bloccatore è connesso all' interfaccia seriale in modo pieno (Com5 = 4, Identificatore dell' interfaccia seriale). I parametri caratteristici dei dispositivi di stopper1.cfg sono riportati nella tabella 6. Tabella 6: parametri dei dispositivi di stopper1.cfg Nome Elemento MEMORY Nome Elemento M68000 Identificatore 01 Identificatore 02 Indirizzo 1 00008000 Indirizzo 1 00009000 Indirizzo 2 00000000 Indirizzo 2 00009200 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0000 0001 0000 0010 0008 0000 0000 0000 0000 0000 Nome Elemento TERMINAL Nome Elemento I8251USART Identificatore 03 Identificatore 04 Indirizzo 1 00002000 Indirizzo 1 00002004 Indirizzo 2 000020001 Indirizzo 2 00002005 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0001 0001 0002 0001 0002 0000 0002 Nome Elemento STOPPER Identificatore 05 Indirizzo 1 00000000 Indirizzo 2 00000000 0003 0004 0005 Com1 Com2 Com3 Com4 Com5 0000 0000 0000 0000 0004 137 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Per la prova di stopper1.cfg possono essere utilizzati tutti i programmi realizzati per usart.cfg. Questa configurazione permette, rispetto ad usart.cfg, di provare il completo funzionamento dell' interfaccia seriale utilizzando una sola macchina. Infatti, quando viene digitata una frase essa viene trasmessa, carattere per carattere, dalla linea Tx, attraverso il bloccatore, alla linea Rx, quindi attivando sia il trasmettitore che il ricevitore. Il dato ricevuto viene poi visualizzato sul video. 6.3.2 La configurazione stopper2.cfg Poichè il terminale seriale, da noi simulato, possiede solo le linee Tx e Rx, il suo collegamento ad un bloccatore deve essere del tipo parziale. A questa esigenza ci viene in aiuto il bloccatore programmabile che è idoneo sia nelle connessioni di tipo piena che in quelle di tipo parziale. In stopper2.cfg (shema in figura 11) il bloccatore programmabile è applicato direttamente ad un terminale seriale, invece che ad un' interfaccia seriale come nel caso di stopper1.cfg. In questo caso sul video del terminale seriale i caratteri vengono visualizzati due volte; infatti, quando viene digitato un carattere sulla tastiera, poichè è attiva la funzione di eco, esso viene immediatamente spedito al video. 138 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Il carattere contemporaneamente viene trasmesso, bit per bit sulla linea Tx, al bloccatore il quale ritrasmette questi bit sulla linea Rx. Quando il terminale riceve tutti i bit del carattere, esso viene inviato al video che lo visualizza nuovamente. Figura 11 I dettagli sul collegamento tra terminale seriale e bloccatore sono visibili in figura 12. La configurazione è costituita da un bus/memoria (MEMORY), un processore (M68000), un terminale seriale (TERMINALSER) e un bloccatore programmabile (STOPPER). 139 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Nelle configurazioni realizzate è stato utilizzato sempre lo stesso processore e lo stesso bus/memoria; da questo punto in poi, quindi, questi componenti non saranno più descritti. Il terminale seriale video+tastiera (TERMINALSER, Identificatore = 4) è connesso solo al bloccatore (Com5 = 3, indica l' Identificatore del bloccatore). Figura 12 Il bloccatore programmabile (STOPPER, Identificatore = 3) ha il suo unico registro all' indirizzo 140 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni 2000 esadecimale (Indirizzo1 = 2000). Inoltre, esso è connesso al bus/memoria) bus ed (Com1 al = Identificatore 1, terminale (Com5 seriale del = 4, Identificatore del terminale seriale). I parametri caratteristici dei dispositivi di stopper2.cfg sono riportati nella tabella 7. Tabella 7: parametri dei dispositivi di stopper2.cfg Nome Elemento MEMORY Nome Elemento M68000 Identificatore 01 Identificatore 02 Indirizzo 1 00008000 Indirizzo 1 00009000 Indirizzo 2 00000000 Indirizzo 2 00009200 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0000 0001 0000 0010 0008 0000 0000 0000 0000 0000 Nome Elemento STOPPER Nome Elemento TERMINALSER Identificatore 03 Identificatore 04 Indirizzo 1 00002000 Indirizzo 1 00000000 Indirizzo 2 00002000 Indirizzo 2 00000000 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0001 0000 0000 0000 0000 0004 0000 0000 0000 0003 141 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Per la prova di questa configurazione è stato realizzato il programma assembler stopper2.a68 riportato in figura 13. loop org $8200 move.b #$01,$2000 nop bcc loop Inizializza il bloccatore Figura 13 Il programma inizia con l' inizializzazione del bloccatore. Il valore 1 esadecimale scritto nel registro MODE attiva la connessione della linea Tx alla linea Rx. Successivamente il programma si porta in un ciclo nel quale non viene svolta nessuna operazione. 6.4 Prova del simulatore programmabile delle interruzioni del gestore Il controller programmabile delle interruzioni gestisce, nella sua configurazione di prova pic.cfg (schema in figura 14), l' insieme di interruzioni che arrivano dai generatori di interruzioni, dai timer e dal terminale. I dispositivi bus/memoria della (MEMORY), configurazione un processore sono: (M68000), un un video+tastiera (TERMINAL), due dispositivi generatori di 142 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni interruzioni e timer (1TO4INTGEN), ed un gestore delle interruzioni programmabile (I82591PIC). Il bus/memoria ed il processore sono quelli utilizzati nelle configurazioni precedenti, quindi, a MEMORY e a M68000 sono associati gli stessi parametri fissati in precedenza. Il terminale video+tastiera (TERMINAL, Identificatore = 3) con registro dato all' indirizzo 2000 esad. (Indirizzo 1 = 2000) e registro controllo all' indirizzo 2001 esad. (Indirizzo 2 = 2001) è connesso al bus (Com1 = 1, Identificatore del bus/memoria) ed ha come linee d' interruzione connesse al P.I.C. (Com2 = 6, che è il valore dell' Identificatore del gestore programmabile delle interruzioni) quelle di livello 6 (Com3 = 6) e 7 (Com4 = 7). 143 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Figura 14 Il primo dispositivo generatore di interruzioni e timer Identificatore (1TO4INTGEN, = 4) ha i registri localizzati agli indirizzi compresi tra 2004 (Indirizzo 1 = 2004) e 2017 (Indirizzo 2 = 2017) esadecimali ed è connesso al Identificatore bus del (Com1 = 1, che bus/memoria). Le è il valore quattro dell' linee di interruzioni programmabili sono tutte connesse al P.I.C. (Com2 = Com3 = Com4 = Com5 = 6, che è il valore dell' Identificatore del P.I.C.). 144 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Il secondo dispositivo generatore di interruzioni e timer si differenzia dal primo solo per il valore dell' Identificatore pari a 5 e per l' intervallo degli indirizzi per accedere ai registri: compresi tra 2018 (Indirizzo 1 = 2018) e 202B (Indirizzo 2 = 202B) esadecimali. Il P.I.C. è un modello semplificato dell' Intel 8259A (I8259PIC, Identificatore = 6) con indirizzi per accedere ai suoi registri pari a 202C (Indirizzo 1 = 202C) e 202D (Indirizzo 2 = 202D), entrambi esadecimali. Inoltre è connesso al bus (Com1 = 1, Identificatore del bus) ed ha come linea d' interruzione connessa al processore (Com2 = 2, che è il valore dell' Identificatore del processore Motorola 68000) quella di livello 1 (Com3 = 1). I parametri caratteristici dei dispositivi sono presentati nella tabella 8. Tabella 8 : parametri dei dispositivi della configurazione pic.cfg 145 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Nome Elemento MEMORY Nome Elemento M68000 Identificatore 01 Identificatore 02 Indirizzo 1 00008000 Indirizzo 1 00009000 Indirizzo 2 00000000 Indirizzo 2 00009200 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0000 0001 0000 0010 0008 0000 0000 0000 0000 0000 Nome Elemento TERMINAL Identificatore 03 Identificatore 04 Indirizzo 1 00002000 Indirizzo 1 00002004 Indirizzo 2 000020001 Indirizzo 2 00002017 Nome Elemento 1TO4INTGEN Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0001 0001 0006 0006 0007 0000 0006 0006 0006 0006 Nome Elemento 1TO4INTGEN Nome Elemento I8259PIC Identificatore 05 Identificatore 06 Indirizzo 1 00002018 Indirizzo 1 0000202C Indirizzo 2 0000202B Indirizzo 2 0000202D Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0001 0006 0001 0006 Per 0006 la 0006 prova di questa 0002 0001 configurazione 0000 0000 è stato realizzato il programma assembler pic.a68, riportato in figura 15-16-17. * ter intg1 intg2 org $8200 equ equ equ $2000 $2004 $2018 146 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni pic i c tr1 tr2 tr3 tr4 mask1 mask2 mask3 mask4 * * int0 * int1 * int2 * int3 * int4 * int5 equ equ equ equ equ equ equ equ equ equ equ $202C 0 2 4 8 12 16 $F0 $55 $0F $AA jmp begin move.b #48,D0 jsr output rte Viene caricato in D0 il valore esad. del livello dell' interruz. move.b #49,D0 jsr output rte Viene caricato in D0 il valore esad. del livello dell' interruz. move.b #50,D0 jsr output rte Viene caricato in D0 il valore esad. del livello dell' interruz. move.b #51,D0 jsr output rte Viene caricato in D0 il valore esad. del livello dell' interruz. move.b #52,D0 jsr output rte Viene caricato in D0 il valore esad. del livello dell' interruz. move.b #53,D0 Viene caricato in D0 il valore esad. del livello dell' interruz. jsr output rte * int6 move.b #54,D0 jsr output rte Viene caricato in D0 il valore esad. del livello dell' interruz. * Figura 15 int7 move.b #55,D0 Viene caricato in D0 il valore esad. del livello dell' interruz. 147 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni * output jsr rte output move.b move.b move.b subi.b bset and.b or.b rts #73,(A3) D0,(A3) #13,(A3) #48,D0 #3,D0 #$F0,(A0) D0,(A0) Stampa sul terminale il carattere 'I' Stampa sul terminale il livello dell' interruzione Vai da capo. Inserisci in D0 il livello dell' interruzione Poni EOI=1 per terminare l' interruzione Cancella il bit relativo all' interuzione ricevuta nel registro ISR * begin movea.w movea.w movea.w movea.w move.b move.b #pic,A0 #intg1,A1 #intg2,A2 #ter,A3 #$40,1(A0) #$3C,1(A3) * * move.b move.b move.w move.w move.w move.w move.l Inserimento vector number nel registro TR del pic Inizializzione terminale:disabilita le interruzioni ENTER e BUFFER FULL e cancella il video #$10,(A0) #mask1,1(A0) #$0500,i(A1) #$0100,c(A1) #$0700,i(A1) #$0100,c(A1) #$01001000,tr1(A1) move.l #$03001E00,tr2(A1) AEOI=1 Fine automatica delle interruzioni Sono mascherate le interruzioni delle linee da 4 a 7 Specificazione di un interruzione sulla linea 5 ed invio al pic (1° generatore interruzioni) Specificazione di un interruzione sulla linea 7 ed invio al pic (1° generatore interruzioni) Attivazione. del 1° timer (del 1° generatore interr.) sulla linea d' interr. 1 , valore iniziale 10 esad. Att. 2° timer (1°g.i.) sulla linea 3,val. iniz.1E esad. clr.b move.b move.w move.w move.w AEOI=0 Sono mascherate le interruzioni delle linee pari Specificazione di un interruzione sulla linea 5 ed invio al pic (1° generatore interruzioni) Specificazione di un interruzione sulla linea 7 ed * * (A0) #mask2,1(A0) #$0400,i(A1) #$0100,c(A1) #$0000,i(A1) move.w #$0100,c(A1) invio al pic (1° generatore interruzioni) move.l #$04002A00,tr3(A1) move.l #$05003400,tr4(A1) Att. 3° timer (1°g.i.) sulla linea 4,val. iniz.2A esad. Att. 4° timer (1°g.i.) sulla linea 5,val. iniz.34 esad. move.b move.b move.w move.w move.w AEOI=1 Sono mascherate le interruzioni delle linee da 0 a 3 Specificazione di un interruzione sulla linea 1 ed invio al pic (2° generatore interruzioni) Specificazione di un interruzione sulla linea 2 ed * #$10,(A0) #mask3,1(A0) #$0100,i(A2) #$0100,c(A2) #$0200,i(A2) 148 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Figura 16 move.w #$0100,c(A2) invio al pic (2° generatore interruzioni) move.l #$03003800,tr1(A2) move.l #$07003E00,tr2(A2) Att. 1° timer (2°g.i.) sulla linea 3,val. iniz.38 esad Att. 2° timer (2°g.i.) sulla linea 7,val. iniz.3E esad. clr.b move.b move.w move.w move.w move.w move.l move.l (A0) #mask4,1(A0) #$0600,i(A2) #$0100,c(A2) #$0200,i(A2) #$0100,c(A2) #$06003E00,tr3(A2) #$00004000,tr4(A2) AEOI=0 Sono mascherate le interruzioni delle linee dispari Specificazione di un interruzione sulla linea 6 ed invio al pic (2° generatore interruzioni) Specificazione di un interruzione sulla linea 2 ed invio al pic (2° generatore interruzioni) Att. 3° timer (2°g.i.) sulla linea 6,val. iniz.3E esad Att. 4° timer (2°g.i.) sulla linea 0,val. iniz.40 esad. clr.b 1(A0) Tutte le interruzioni sono abilitate jmp end * * * end Figura 17 Il file di memoria, che deve essere letto per caricare in memoria ROM i valori degli "entry point" per le interruzioni, si chiama pic.mem. Il processore inizia la simulazione inizializzando i device della configurazione. Il gestore delle interruzioni programmabile è inizializzato inserendo il vector number, da trasmettere al processore, nel registro TR. L' inizializzazione del terminale consiste nel disabilitare le interruzioni ENTER e BUFFER FULL e nel cancellare il video. Il programma permette di evidenziare tutte le proprietà del componente; infatti esso prevede l' esecuzione combinata delle seguenti azioni : 149 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni spedizione di interruzioni sulle linee di richiesta, ♦ sempre differenti attraverso i generatori delle interruzioni; attivazione dei timer con valori di conteggio e linee ♦ di richieste sempre diverse; variazione della maschera delle interruzioni nel regi- ♦ stro IMR del P.I.C.; ♦ variazione della modalità della fine delle interruzioni nel registro CNTRL del gestore delle interruzioni programmabile. Quando il gestore delle interruzioni lancia un' interruzione al processore, la routine che serve l' interruzione scrive sul video la linea di richiesta sulla quale è arrivata l' interruzione e cancella il bit corrispondente nel registro ISR del gestore. 6.5 Prova del simulatore del controllore per l' accesso diretto alla memoria Il dispositivo per comunicare direttamente con la memoria (D.M.A.) viene impiegato, nella configurazione di prova dma.cfg (schema in figura 18) , per trasferire dati sia dalla memoria ad un terminale che da una zona all' altra della memoria. I dispositivi bus/memoria della (MEMORY), configurazione un processore sono: (M68000), un un video+tastiera (TERMINAL) ed un D.M.A. (I8237DMA). 150 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Per il processore, il bus/memoria ed il terminale valgono le descrizioni fatte nei paragrafi precedenti Figura 18 Il contollore D.M.A. è un Intel 8237 (I8237DMA, Identificatore = 4), i cui registri sono localizzati agli indirizzi compresi tra 2010 (Indirizzo 1 = 2010) e 201F (Indirizzo 2 = 201F) esadecimali ed è connesso al bus (Com1 = 1, Identificatore del bus) ed al processore (Com2 = 2 valore dell' Identificatore di M68000) attraverso la linea d' interruzione di livello 1 (Com3 = 1) e la linea di richiesta del bus (Com4 = 2 Identificatore di M68000). Infine il canale 0 del D.M.A. controller è connesso al terminale (Com5 = 0003, dove le 2 cifre meno 151 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni significative rappresentano proprio l' Identificatore di TERMINAL). I parametri caratteristici dei dispositivi sono presentati nella tabella 9. Tabella 9 : parametri dei dispositivi della configurazione dma.cfg Nome Elemento MEMORY Nome Elemento M68000 Identificatore 01 Identificatore 02 Indirizzo 1 00008000 Indirizzo 1 00009000 Indirizzo 2 00000000 Indirizzo 2 00009100 Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0000 0001 0000 0010 0008 0000 0000 0000 0000 0000 Nome Elemento TERMINAL Nome Elemento I8237DMA Identificatore 03 Identificatore 04 Indirizzo 1 00002000 Indirizzo 1 00002010 Indirizzo 2 000020001 Indirizzo 2 0000201F Com1 Com2 Com3 Com4 Com5 Com1 Com2 Com3 Com4 Com5 0001 0001 0006 0006 0007 0000 Per 0002 la 0007 prova 0002 di 0003 questa configurazione sono stati realizzati i programmi assembler memtodev.a68 e memtomem.a68. Entrambi per poter essere eseguiti richiedono che siano caricati in memoria ROM i valori degli "entry point" per le interruzioni; ciò può essere fatto leggendo il file di memoria dma.mem. Il programma memtodev.a68 (figura 19) trasferisce un blocco di memoria su un terminale attraverso il D.M.A. 152 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni controller; alla fine del trasferimento viene cancellato il video. * Realizza il trasferimento di un blocco di memoria su un terminale attraverso un DMA che * effettua una richiesta per ogni byte. Alla fine del trasferimento viene cancellato il video. * * ORG $8200 * ter EQU $2000 dma EQU $2010 caddr EQU 0 ccount EQU 1 cntrl EQU 8 request EQU 9 mode EQU 11 nbyte EQU $9F * MOVE.W #ter,A0 MOVE.B #$0C,1(A0) Disabilita tastiera ,eco e interruzioni; cancella MOVE.W #dma,A1 video e buffer tastiera: MOVE.B #nbyte,ccount(A1) Carica il numero di byte da spostare nel MOVE.W #message,caddr(A1) registro conteggio e l' indirizzo di partenza MOVE.B #$10,mode(A1) nel registro indirizzo del canale 0. Fissa il MOVE.B #$80,cntrl(A1) modo SINGLE, con incremento indirizzo, MOVE.B #$08,request(A1) autoinizializzazione,e trasferimento da * memoria a interfaccia sul canale 0. Abilita il * DMA ed effettua la richiesta sul canale 0. * loop NOP NOP BCC loop * int7 MOVE.L A0,-(A7) Salva nel SSP il registro utilizzato. MOVE.W #ter,A0 MOVE.B #$0C,1(A0) Riinizializza il terminale. MOVE.L RTE * message DC.B DC.B (A7)+,A0 Ripristina il registro utilizzato. ' Universita',$60,' degli Studi di Napoli',$0D,$0D ' Federico II',$0D,$0D 153 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni DC.B DC.B DC.B ' Facolta',$60,' d',$60,' Ingegneria',$0D,$0D 'Dipartim. d',$60,' Informatica e Sistemistica',$0D,$0D ' ASIM',$0D Figura 19 Il blocco di memoria contiene la seguente frase: Universita' degli Studi di Napoli Federico II Facolta' d' Ingegneria Dipartim. d' Informatica e Sistemistica ASIM che verrà scritta e cancellata sul video. Il processore, quando inizia la simulazione, inizializza i Device della configurazione. Il DMA controller è inizializzato con le seguenti azioni: scrittura del primo indirizzo del blocco di memoria ♦ nel registro CADDR0, sc ri ttura del numero di byte da spostare nel registro ♦ CCOUNT0, scrittura nel registro MODE0 del tipo di trasferi- ♦ mento da effettuare; abilitazione in CNTRL del DMA controller. ♦ Il tipo di trasferimento che vogliamo effettuare prevede: 154 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni 1. il trasferimento del contenuto di un blocco di memoria al device collegato al canale 0, cioè al terminale, 2. la ric hi esta del bus a l proce ssore pe r ogni byt e da trasferire, l' incremento di CADDR0 di una unità 3. per ogni byt e t rasf eri to, 4. l' autoinizializzazione al termine del trasferi- mento del blocco. L' inizializzazione del terminale consiste nel disabilitare la tastiera, l' eco e le interruzioni ENTER e BUFFER FULL e nel cancellare il video ed il buffer della tastiera. Dopo l' inizializzazione dei device viene inviata una richiesta al flag RF0 del D.M.A.; questa produce l' invio di una ri chiesta di bus al proc essore per ogni byte da trasferire e l' inizio del trasferimento. Il processore, bloccato solo durante l' intervallo di tempo necessario al t rasf e ri mento del si ngol o byte, continua la sua e leborazione percorrendo un ciclo. Quando il trasferimento dell' intero blocco si conclude, il D.M.A. lancia un interruzione di livello 7 al processore che fa partire una routine che riinizializza il terminale. Il programma memtomem.a68 (figura 20), invece, copia un blocco di memoria in un' altra parte di essa attraverso il controllore degli accessi diretti in memoria. 155 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni Alla fine del trasferimento vengono provati i 3 comandi del controllore: WAMF, CMF e RESET. * Effettua la copia di un blocco di memoria in un' altra parte della memoria attraverso un DMA. * Il bus è bloccato dal DMA per tutto il trasferimento. * ORG $8200 * dma EQU $2010 caddr0 EQU 0 caddr1 EQU 2 ccount1 EQU 3 cntrl EQU 8 mode EQU 11 reset EQU 13 clearmf EQU 14 writeamf EQU 15 nbyte EQU $9F * MOVE.W #dma,A0 Carica il registro indirizzo dei canali MOVE.W #message,caddr0(A0) 0 ed 1 con l' indirizzo d' inizio, il numero di MOVE.W #(fine+10),caddr1(A0) byte da spostare nel registro conteggio del MOVE.B #nbyte,ccount1(A0) canale 1. MOVE.B #$00,mode(A0) Fissa il modo incrementa registro infirizzo e MOVE.B #$01,mode(A0) senza autoinizializzazione,il trasferimento da MOVE.B #$A0,cntrl(A0) da memoria a memoria,abilita il DMA * loop NOP NOP BCC loop * int7 MOVE.L A0,-(A7) Salva nel SSP i regisri utilizzati MOVE.W #dma,A0 MOVE.B #1,writeamf(A0) Setta il mask flag del canale 0 MOVE.B #3,writeamf(A0) Setta i mask flags dei canale 0 ed 1 MOVE.B #0,clearmf(A0) Cancella i mask flags 156 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni MOVE.B MOVE.L RTE * message DC.B DC.B DC.B DC.B DC.B fine NOP #0,reset(A0) (A7)+,A0 Resetta il DMA Ripristina i registri salvati in SSP ' Universita',$60,' degli Studi di Napoli',$0D,$0D ' Federico II',$0D,$0D ' Facolta',$60,' d',$60,' Ingegneria',$0D,$0D 'Dipartim. d',$60,' Informatica e Sistemistica',$0D,$0D ' ASIM ' Figura 20 L' inizializzazione del DMA controller è leggermente diversa rispetto al programma precedente, essa consiste nello svolgimento delle seguenti operazioni: scrittura del primo indirizzo del blocco di memoria ♦ sorgente nel registro CADDR0, scrittura del primo indirizzo del blocco di memoria ♦ destinazione nel registro CADDR1, sc ri ttura del numero di byte da spostare nel registro ♦ CCOUNT1, scrittura nel registro MODE0 del tipo di trasferi- ♦ mento da effettuare; abilitazione del DMA controller e richiesta di un tra- ♦ sferimento da memoria a memoria in CNTRL. Il tipo di trasferimento che vogliamo effettuare prevede: 1. la richiesta del bus al processore solo all' inizio del trasferimento del blocco, 2. l' incremento di CADDR0 e CADDR1 di una unit à per ogni byte trasf erito, e 157 _________________________________________________________________________________ Capitolo 6: Esempi di configurazioni 3. l' assenza dell' autoinizializzazione al termine del trasferimento del blocco. Il trasferimento inizia con l' invio, da parte dell' I8237DMA, dell' unica richiesta di bus al processore, il quale in questo caso è bloccato per tutto l' intervallo di tempo necessario al trasferimento dell' intero blocco. Quando il trasferimento dell' intero blocco si conclude, l' I8237DMA lancia un interruzione di livello 7 al processore che fa partire una routine che attiva in sequenza i seguenti comandi del D.M.A.: ♦ WAMF per cancellare MF0 e porre ad 1 MF1, ♦ WAMF per porre ad 1 sia MF0 che MF1, ♦ CMF per azzerare MF0 ed MF1, ♦ RESET per azzerare tutti i registri del controller. 158 _________________________________________________________________________________