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
_________________________________________________________________________________