Lo Zilog Z80 è un microprocessore ad 8 bit con un design interno della ALU a 4 bit ma capace di operazioni a 8 e 16 bit progettato dalla Zilog di Federico Faggin e commercializzato a partire dal luglio del 1976. Lo Z80, con i suoi derivati e i suoi cloni, è una delle famiglie di CPU più impiegate di tutti i tempi.

È stato largamente utilizzato in numerosi sistemi, negli home computer, nei videogiochi arcade, nelle console, nei sistemi embedded ed anche in quelli militari; insieme alla famiglia di CPU basate sul MOS 6502 ha dominato il mercato dei microcomputer e delle console giochi ad 8 bit di fine anni settanta e quello degli home computer dei primi anni ottanta..

Zilog provò anche a commercializzare delle versioni per minicomputer dell'architettura Z80, lo Z800 e lo Z280, che però non riscossero il successo del loro predecessore: il primo fu abbandonato ancor prima della sua commercializzazione, mentre la complessità ed i bug del secondo ne limitarono la diffusione a vantaggio di altri prodotti, fra cui l'Hitachi HD64180 e lo Zilog Z180.

Con un comunicato ufficiale datato 15 Aprile 2024, la Zilog dichiara la cessazione della produzione dell'intera linea di CPU, MPU, I/O della famiglia Z80, con data di produzione dell'ultimo lotto stimata per il 15 Giugno 2024.

Storia

Federico Faggin, dopo aver lavorato sull'8080, lasciò Intel alla fine del 1974 per divergenze con la dirigenza: questa, infatti, era ancora troppo focalizzata sulla produzione di chip di memoria e considerava i microprocessori solo come prodotti accessori, utili per vendere più RAM. Faggin, invece, intravedeva in essi una potenzialità d'impiego molto più vasta, grazie alla loro possibilità di essere programmati per impieghi generali. Faggin decise quindi di lasciare Intel per fondare insieme al suo collega Ralph Ungermann la Zilog, una società dedita esclusivamente alla produzione di CPU. Il primo prodotto della società fu proprio lo Z80, nato da un progetto che Faggin elaborò verso la fine del 1974, presentato nel luglio del 1976..

Lo Z80 si diffuse nel mercato dei processori molto più dell'Intel 8080 e del suo successore, l'8085 e divenne una delle CPU ad 8 bit più popolari. Uno dei fattori chiave del successo iniziale dello Z80 furono i sistemi integrati nel chip stesso, come quello per il refresh della memoria DRAM: tale integrazione permetteva di realizzare sistemi completi con l'aggiunta di pochi altri componenti esterni di supporto (più in là comparvero sistemi embedded basati sullo Z80, che in genere utilizzano memorie statiche, che non necessitano di questo refresh) ed aprendo la via verso i moderni "System On Chip".

La Zilog concesse in licenza senza royalty la proprietà intellettuale del progetto del core dello Z80 a qualunque società lo avesse voluto produrre in proprio: questa politica commerciale alla lunga ripagò Zilog con un ritorno di immagine, diffusione e vendite perché permise ad un prodotto di una piccola società, quale essa era, di affermarsi sul mercato mondiale grazie al fatto che grossi produttori come Toshiba iniziarono a produrre in quantità industriali il processore. Come conseguenza di questa scelta commerciale, Zilog ha prodotto meno del 50% di tutti gli Z80 costruiti in questi anni.. Nonostante ciò diversi produttori dell'Europa dell'Est, del Giappone e dell'ex Unione Sovietica fabbricarono delle copie della CPU senza licenza.

Descrizione tecnica

Il set di istruzioni dello Z80 fu scritto per essere compatibile con l'Intel 8080,. per cui gran parte del codice per l'8080 (principalmente quello del sistema operativo CP/M) poteva girare senza modifiche sullo Z80. Masatoshi Shima (co-progettista dell'Intel 4004 e dell'Intel 8080) contribuì allo sviluppo dello Z80..

Lo Z80 offriva le seguenti migliorie rispetto all'8080: un insieme di istruzioni più completo,. incluse quelle per la manipolazione dei bit, lo spostamento dei blocchi di dati, l'I/O e le istruzioni per la ricerca dei byte;. nuovi registri indice IX e IY, con le relative istruzioni; un sistema di interrupt vettorizzati maggiormente automatizzato e generalizzato, operante in 3 modalità: il modo 2 gestiva una modalità vettorizzata indiretta, il modo 1 prevedeva una modalità diretta, valida per sistemi semplici con hardware minimale, mentre il modo 0 indicava la modalità compatibile 8080.. due banchi di registri separati, che possono essere velocemente invertiti, per velocizzare la risposta agli interrupt; necessità di meno hardware per l'alimentazione, la generazione del clock, l'interfaccia di memoria e l'I/O: richiesta di 1 singola alimentazione a 5 V (l'8080 necessita di 3 alimentazioni, rispettivamente a -5 V, +5 V e +12 V) clock a 5 V a singola fase (l'8080 necessita di un generatore di clock a due fasi di grande ampiezza); un meccanismo integrato per il refresh della memoria ad accesso diretto che altrimenti doveva essere fornito da una circuiteria esterna; bus dati non multiplato (l'8080 ha nel bus dati un sistema multiplato di segnali di stato); un prezzo più basso.

Il progetto originale in logica NMOS vide il limite massimo della frequenza del clock crescere progressivamente dai 2,5 MHz iniziali fino ai 4 MHz dello Z80A, ai 6 MHz dello Z80B ed agli 8 MHz dello Z80H. Ne fu realizzata anche una versione CMOS con un intervallo di frequenze che andava dai 4 MHz fino ai 20 MHz delle versioni vendute più recentemente. La versione CMOS permetteva inoltre una modalità d'attesa a basso consumo energetico denominata "Power-Down", o "modalità standby", in cui veniva mantenuto lo stato interno (registri e segnali di controllo) del processore fino al ricevimento del segnale di uscita da tale stato (un segnale di clock). I chip derivati compatibili con lo Z80, l'HD64180/Z180. e l'eZ80 sono dichiarati capaci rispettivamente di 33 MHz e 50 MHz.

Modello di programmazione e gestione dei registri Il modello di programmazione e la gestione dei registri sono convenzionali e simili a quelli della famiglia x86. I registri AF, BC, DE e HL, compatibili con quelli dell'Intel 8080, sono duplicati nello Z80 in 2 banchi separati con il processore che può velocemente passare da un banco all'altro,. una caratteristica utile per velocizzare la risposta agli interrupt ad alta priorità e livello singolo. Questa caratteristica era presente nel Datapoint 2200, mentre non era implementata nell'Intel 8008. Il sistema dei registri doppi aveva senso sullo Z80 (e su altri microprocessori dell'epoca), perché esso era stato progettato anche per i sistemi embedded, non solo per i personal computer o per gli home computer. I doppi registri risultarono molto utili per la codifica assembly altamente ottimizzata: alcuni software, specialmente i giochi per i sistemi MSX, gli ZX Spectrum ed altri computer basati sullo Z80, portarono l'ottimizzazione dell'assembly dello Z80 a livelli estremi, impiegando, tra le altre cose, proprio i registri duplicati.

Registri

Come sull'8080, i registri ad 8 bit sono di solito accoppiati per ottenerne delle versioni a 16 bit. I registri compatibili con quelli dell'8080 sono:. AF - (8 bit) accumulatore (A) e bit di flag (F) per resto, zero, segno meno, parità/overflow, semi-riporto (usato per codifica decimale), ed un flag Aggiungi/Sottrai (normalmente chiamato N), anch'esso per la codifica decimale; BC - (16 bit) registro dati/indirizzo oppure 2 registri ad 8 bit; DE - (16 bit) registro dati/indirizzo oppure 2 registri ad 8 bit; HL - (16 bit) registro accumulatore/indirizzo a 16 bit oppure 2 registri ad 8 bit; SP - (16 bit) puntatore stack; PC - (16 bit) contatore di programma.

I nuovi registri introdotti dallo Z80 sono: IX - (16 bit) registro indice o di base per offset ad 8 bit immediati o accumulatore a 16 bit; IY - (16 bit) registro indice o di base per offset ad 8 bit immediati o accumulatore a 16 bit; I - (8 bit) registro base per gli interrupt vettoriali; R - (8 bit) contatore per refresh della DRAM (il bit più significativo non conta); AF' - accumulatore alternativo (od "ombra") e flag (attivati e disattivati con EX AF,AF'); BC', DE' e HL - registri alternativi (od "ombra") e flag (attivati o disattivati con EXX); 4 bit per lo stato degli interrupt e le modalità degli interrupt.

Non c'è la possibilità di accedere direttamente ai registri alternativi: esistono per questo compito 2 istruzioni speciali, EX AF,AF' e EXX, ognuna delle quali modifica 1 di 2 multiplatori flip-flop. Questo permette passaggi veloci di contesto per le routine di servizio degli interrupt: EX AF, AF' può essere utilizzata da sola (per routine di interrupt molto semplici e veloci) o in abbinamento a EXX per invertire l'intero gruppo di registri AF, BC, DE e HL, un modo di operare molto più veloce di quello basato sull'inserimento degli stessi registri nello stack (interrupt con più livelli o interrupt lenti e con bassa priorità normalmente utilizzano lo stack per memorizzare il valore dei registri).

Il registro di refresh ("R") viene incrementato. ogni volta che la CPU esegue un opcode (o un prefisso opcode) e non ha pertanto una relazione semplice con l'esecuzione del programma. Questo modo di operare era spesso usato per generare numeri pseudo-casuali nei giochi, ma anche in schemi di protezione software. Era anche utilizzato come contatore "hardware" in alcuni sistemi: un famoso esempio di questo utilizzo è il Sinclair ZX81, che permette di tenere traccia delle posizioni dei caratteri sullo schermo TV innescando un interrupt al verificarsi della reinizializzazione (collegando l'interrupt ad A6).

Il registro vettoriale di interrupt ("I") è usato per gli interrupt dello Z80 specificati con modalità 2 (selezionata dall'istruzione IM 2). Esso fornisce l'indirizzo di base della pagina (il "byte alto") per la tabella a 128 voci degli indirizzi degli interrupt di servizio che sono selezionati tramite un puntatore (il "byte basso" dell'indirizzo) inviato alla CPU durante un ciclo di riconoscimento degli interrupt. Il puntatore identifica un particolare chip periferico e/o una funzione di un chip periferico (nel caso in cui un chip periferico possa sollevare più interrupt, come ad esempio il CTC), dove i chip sono normalmente connessi a cascata per la risoluzione della priorità. Come per quello di refresh, questo registro è stato talvolta utilizzato in maniera "creativa".

La ALU a 4 bit La ALU, o "Arithmetic-Unit Logic", è il modulo integrato in una CPU deputato all'esecuzione dei calcoli aritmetico/logici. A differenza di altre CPU contemporanee (come il MOS 6502 o l'Intel 8080) la ALU dello Z80 è a 4 bit, vale a dire che esegue calcoli su numeri di 4 bit, o nibble. Siccome l'accumulatore della CPU è a 8 bit, per eseguire un calcolo su un numero contenuto nell'accumulatore la ALU dello Z80 deve eseguire due passaggi su tale registro. Per far sì che questo non incida sulle prestazioni della CPU, i progettisti dello Z80 hanno pensato ad un sistema di cicli interni divisi in "cicli macchina", o "cicli M" (dall'inglese M-cycle), in cui ogni ciclo M è composto da più "cicli di clock", o "stati T" (dall'inglese T-state), dove uno stato T è equivalente ad un ciclo di clock,, ed ottimizzando le istruzioni affinché la CPU sia in grado di eseguire un minimo di sovrapposizione delle operazioni delle singole istruzioni: questo processo è detto "fetch/execute overlapping" e permette di continuare l'esecuzione di una istruzione mentre la CPU sta leggendo dalla memoria l'opcode di quella successiva. Ad esempio, l'istruzione SUB r, che sottrae dall'accumulatore il valore contenuto nel registro ad 8 bit indicato da "r", viene eseguito in 1 ciclo M composto da 4 cicli di clock. L'esecuzione di questa istruzione più essere divisa nei seguenti singoli passaggi: ISTRUZIONE CORRENTE "N" (SUB r) M1 / T1 : viene impostato l'indirizzo da cui leggere l'istruzione "N" da eseguire M1 / T2 : viene recuperata dalla memoria l'istruzione "N"