Relazione sullo Z80

Materie:Altro
Categoria:Sistemi

Voto:

2 (2)
Download:213
Data:17.05.2005
Numero di pagine:6
Formato di file:.doc (Microsoft Word)
Download   Anteprima
relazione-z80_1.zip (Dimensione: 11.58 Kb)
trucheck.it_relazione-sullo-z80.doc     81 Kb
readme.txt     59 Bytes


Testo

Il µP Z80

Scopo:
Realizzare un programma in Assembly che, dati dei valori in codice binario mediante l’uso di switch, ne visualizzi il corrispondente, in codice decimale, su un display a sette segmenti;

Cenni teorici sul µP Z80:
Un µP è costituito da un unico chip che contiene tutti gli elementi della CPU. La potenza è la capacità del microprocessore di elaborare dati in forma binaria, normalmente di esprime in MHz o in GHz. La dimensione della memoria equivale al numero di parole o di byte di memoria a cui il µP può accedere per memorizzare programmi e/o dati. La velocità del µP dipende dalla massima frequenza del segnale di clock, nel caso dello Z80 varia dai 2.5 Mhz della versione base, quella che noi utilizziamo, ai 4, 6 e 8 MHz delle versione Z80A, Z80B e Z80C.
La sua struttura interna comprende una ALU (unità aritmetico logica, dall’inglese Aritmetic Logic Unit), che esegue i calcoli richiesti dal µP, una unità di controllo e vari registri connessi tra loro attraverso tre bus interni, il bus dati, il bus indirizzi il bus di controllo.
La ALU esegue operazioni aritmetico – logiche su operandi contenuti temporaneamente nei vari registri. Dopo un’operazione l’ALU trasferisce e memorizza il risultato in un apposito registro chiamato comunemente accumulatore, nel caso dello Z80 il registro prende il nome di “A”.
I registri consentono di memorizzare temporaneamente vari tipi di informazioni ed i principali sono:
• Contatore di programma (PC, dall’inglese Program Counter) → registro a 16 bit, contiene l’indirizzo dell’istruzione da prelevare in memoria. L’aggiornamento del PC avviene alla fine della fase di fetch (dall’inglese, prelevamento);
• Registro istruzioni (IR, dall’inglese Instruction Register) → immagazzina l’istruzione, o meglio il dice operativo dell’istruzione (op-code), puntata dal PC, che verrà decodificata dall’unità di controllo;
• Registro indirizzi di memoria (MAR, dall’inglese Memory Addrerss Register) → contiene l’indirizzo dell’istruzione che deve essere prelevata dalla memoria oppure del dato che deve essere trasferito da o verso la memoria o i dispositivi di I/O;
• Registro dati di memoria (MDR, dall’inglese Memory Data Register) → provvede allo scambio di dati tra il µP e la memoria o gli organi di I/O con adeguato sincronismo;
• Registro di stato (SR, dall’inglese Status Register) → memorizza essenzialmente un insieme di bit indicatori (bit di flag) che forniscono informazioni sull’ultimo risultato aritmetico – logico eseguito dall’ALU.
I bus dati sono linee dedicate al trasferimento di dati da leggere o da scrivere nella memoria o sui dispositivi di I/O e sono quindi bidirezionali. Il loro numero determina la massima quantità di informazione che può essere trasferita con una singola operazione di scrittura o lettura, ossia il parallelismo del µP.
I bus indirizzi sono linee dedicate alla locazione di memoria a cui deve accedere la CPU durante il prelievo di un’istruzione o durante un’operazione di scrittura o lettura.
I bus di controllo sono gruppi di segnali di controllo che intervengono nelle funzioni di base della CPU e nelle creazioni con la memoria e i dispositivi periferici di I/O.
Le informazioni tra la CPU e il mondo esterno avvengono attraverso dispositivi periferici di I/O i quali si differenziano, oltre al ruolo per cui sono stati progettati, per le loro caratteristiche funzionali ed elettriche.
Vengono connessi alla CPU attraverso specifici circuiti di interfaccia (connessi da un lato al dispositivo periferico, dall’altro alle linee esterne della CPU, tra cui il bus dati, il bus indirizzi ed eventuali linee di controllo).
Ogni dispositivo di interfaccia comprende una o più linee di comunicazione (in genere sono bidirezionali) che consentono lo scambio di dati da un senso all’altro, chiamate porte I/O (la larghezza di una porta è pari al numero di linee del bus dati).
Esistono tre modalità di trasferimento dei dati:
• Trasferimento programmato: lo scambio di dati è controllato dal programma (un esempio può essere il computer che invia una file da stampare alla stampante);
• Trasferimento pilotato da interruzione: il processori comunicazione è innescato dal dispositivo esterno che invia alla CPU la richiesta di comunicazione, attivandone la linea di interruzione. In linea di massima si può dire che questo metodo si adatta bene alla gestione di eventi e comunicazioni asincrone e non troppo frequenti (rispetto ai tempi di lavoro della CPU) e che il trasferimento vero e proprio, una volta iniziato, si svolge sotto il controllo del programma;
• Trasferimento tipo DMA (Direct Memory Access): non viene usata; consente l’accesso diretto alla memoria per il trasferimento da e verso le unità periferiche senza passare attraverso la CPU.
Le interruzioni sono il processo mediante il quale il mondo esterno può richiedere alla CPU di interrompere il programma in corso per eseguire una determinata procedura che, ad un certo istante, si rende necessaria.
All’insorgere di una richiesta di interruzione, la CPU deve memorizzare quegli elementi che le permetteranno di riprendere il programma interrotto. Precisamente devono essere salvati il contenuto del PC, dell’SR ed eventualmente quello di altri registri della CPU che vengono utilizzati dalla routine di servizio.
I problemi connessi alla gestione delle interruzioni riguardano essenzialmente:
• Riconoscimento da parte della CPU di una richiesta di interruzione;
• Le modalità con cui la CPU può riconoscere la periferica che ha generato l’interruzione;
• Le modalità di stabilire, se vi sono due o più richieste di interruzione contemporaneamente, quale periferica abbia la priorità sulle altre.

Lo Z80, sviluppato con tecnologia NMOS, appartiene alla categoria di µP con bus dati a 8 bit e bus indirizzi a 16 bit. Esso presenta un gruppo di registri di uso speciale e due banchi di registri di uso generale, uno principale e uno secondario, scambiabili fra loro. I registri di flag sono tutti registri a 8 bit ma possono essere usati a coppie in modo da formare dei registri a 16 bit.

Funzionamento del programma:
Il programma che intendiamo creare è una convertitore di codici, da binario a decimale, ed è in pratica un decoder.
Creando un ciclo polling, cioè fare in modo che il programma si ripeta continuamente controllando i dati che si ritrova in input, facciamo in modo che il dato venga immesso attraverso una piastrina con sei switch, anche se noi ne useremo solo quattro, in codice binario. I dati verranno elaborati dal Deneb e come output troviamo il dato immesso in codice decimale visibile su un display a sette segmenti.
Per fare in modo che sul display di visualizzi correttamente il numero, bisogna passare al programma i codici di ogni cifra decimale, in modo che il software del display capisca che segmenti attivare.

Tabella codici da 0 a 9:

Zero
0C0H
Uno
0F9H
Due
0A4H
Tre
0B0H
Quattro
99H
Cinque
92H
Sei
82H
Sette
0F8H
Otto
80H
Nove
90H
Nel programma la sintassi prevede il label del numero, l’istruzione “EQU”, che fa in modo che il programma associ al label il codice, e infine il codice corrispondente, ad esempio:
zer equ 0C0H

Sintassi del programma:

org 00h
← significa che il programma parte dalla posizione 0
jp alfa
tasti
equ 10h
← mettiamo in input il tastierino che si trova alla 10h
vett
defb zer,uno,due,tre.qua,cin.sei.set.ott.nov
← creazione del vettore; sul simulatore sostituire “defb” con “db”
zer
equ 0c0h
← associazione ai label dei codici
uno
equ 0f9h
due
equ 0a4h
tre
equ 0b0h
qua
equ 99h
cin
equ 92h
sei
equ 82h
set
equ 0f8h
ott
equ 80h
nov
equ 90h
alfa
In a,(tasti)
← il deneb legge quello che c’è in entrata
Ld hl,vett
Add a,l
Ld l,a
Ld a,(hl)
Out (30h),a
← in uscita mandiamo il codice
Jp alfa
← torniamo ad alfa in modo da creare il polling
end

Fase di simulazione:
Si accende al prompt del DOS, si lavora nella directory E:\users\home\3h\z80.sim usando il comando CD (change directory), si scrive il programma usando il comando EDIT e si salva il file in formato .asm, si lancia l’assemblatore con il comando Z80ASM e se non trova errori si può procedere alla simulazione: si usa il comando Z80SIM e si dà 2.5 (MHz) come frequenza di clock. Se si necessita di modificare subito i registri si usa il pulsante F4 per entrare ed uscire dall’editor. Si lancia il file usando il pulsante F2: il programma chiederà il nome del file .obj creato dall’assemblatore e poi bisogna lanciare il programma col tasto G specificando da quale indirizzo inizia il programma. Si eseguono una alla volta le istruzioni premendo il tasto ESC e si controlla sul monitor il funzionamento del programma.

Fase di caricamento ed esecuzione sul Deneb:
Si salva il programma in formato .msa, si salva su floppy e si va a provare sul computer collegato al Deneb eseguendo le seguenti istruzioni:

Fase preparativa
• Cambiare la directory da C:\ a C:\deneb
• Copy a:\sorgente.msa

Fase “Assemblaggio”
• Az80
• Source…=sorgente.msa
• ●
• ●
• ●

Fase “Linker”
• xlink
• def-cpu
• …Z80
• load sorgente
• dump
• …sorgente
• exit

Prova sul Deneb
• com
• scegliere com2 ed abbassare e alzate l’interruttore “reset” sul modulo Deneb
• l
• …0
• …0
• … lunghezza programma (immettere 100 per non correre rischi)
• … sorgente.a01
• g (richiesta dell’indirizzo da cui partire: immettere 00)

NB: ● = premere invio senza immettere nulla

Risultati della prova:
Provando ad immettere i codici dagli switch possiamo osservare il display cambiare valore; se si prova ad immettere valori superiori a 9 il Deneb smette di funzionare poi chè non ha i codici necessari per visualizzare i caratteri.

Esempio