Quando i 16 bit stavano stretti: Zilog Z8000

Il concetto di bellezza è sfuggente, mutevole e con una forte componente soggettiva. E’ difficile classificare qualcosa come “bello”, tanto che persino il David di Michelangelo agli occhi di qualcuno potrebbe sembrare addirittura “brutto”.

Immaginatevi la difficoltà nell’applicare il concetto di bellezza a una roba astrusa qual è l’architettura di un microprocessore. Eppure un appassionato davanti a certi “spettacoli” non può che strabuzzare gli occhi e ammirare ciò che il frutto dell’ingegno umano ha saputo concretizzare.

E’ il caso dello Z8000, microprocessore a 16 bit dell’arcinota Zilog che ha regalato al mondo quel gioiello che è lo Z80, e che con questa nuova CPU riesce a toccare vette altissime nel design di un’ISA che ancora oggi può essere preso a modello.


Già perché, mentre con lo Z80 il vincolo forte della compatibilità binaria con l’Intel 8080 aveva pesato molto, su un design completamente nuovo i progettisti hanno potuto dare spazio alle proprie idee ed elaborare un capolavoro dell’ingegneria.

La prima cosa che salta all’occhio è sicuramente la semplicità che inizialmente porta alla mente le architetture RISC. Infatti gli opcode a 16 bit del microprocessore sono suddivisi in due macrocategorie, la prima a lunghezza fissa (16 bit in totale) che è chiamata anche compact e definisce soltanto 4 istruzioni (le più comuni); la seconda, potenzialmente a lunghezza variabile (e già questo è sufficiente per classificare lo Z8000 come CISC), è chiamata general e definisce due grandi categorie di istruzioni.

Con uno schema così ridotto la decodifica delle istruzioni risulta sicuramente molto facile da effettuare. Nulla a che vedere con la notevole complessità della sezione di decodifica di un microprocessore come l’8086 di Intel, che nelle versioni moderne occupa una considerevole area del chip e incide particolarmente sui consumi.

Ma un’organizzazione degli opcode, per quanto lineare e ortogonale, nulla dice a un programmatore, abituato com’è a utilizzare assemblatori o, meglio ancora, compilatori per linguaggi di programmazione di più alto livello, che nascondono questi dettagli. Quindi quali sarebbero le caratteristiche di targa di questa CPU? Eccole:

  • presenza di ben 16 registri a 16 bit general purpose, quindi utilizzabili per gli scopi più disparati (anche questo lo rende più simile a un’architettura RISC, che in genere è dotata di molti registri, quasi tutti “generici” appunto);
  • possibilità di accedere ai singoli byte dei primi 8 registri, sia alla loro parte bassa che a quella alta (similmente all’architettura 8086);
  • suddivisione dei 16 registri in 8 a 32 bit oppure 4 a 64 bit, con possibilità di manipolare dati di questa dimensione;
  • numerosi tipi di dato (bit, booleano, byte/word/longword/quadword, decimale o BCD, stack e, infine, stringhe di byte o word);
  • 8 modalità d’indirizzamento (utilizzabili da quasi tutte le istruzioni);
  • 110 istruzioni raggruppate in 9 aree di utilizzo (aritmetiche, logiche, rotazione e shift, di bit, accesso alla memoria, salto, input/output, blocchi di memoria e manipolazione di stringhe, controllo della CPU ed estensione per gestire periferiche esterne);
  • possibilità di combinare la maggior parte delle istruzioni coi precedenti tipi di dato e modalità d’indirizzamento per arrivare a più di 400 istruzioni;
  • esecuzione in modalità utente o supervisore, con rispettivo stack “privato”;
  • indirizzamento della memoria a 23 bit, che permette di raggiungere 8MB;
  • possibilità di proteggere e regolare l’accesso alla memoria tramite una MMU esterna (lo Z8010);
  • spazi d’indirizzamento diversi per accedere a codice, dati e stack;
  • supporto al multiprocessing tramite condivisione di dati fra più processori.

A parte la notevole quantità di carne al fuoco, la cosa che stupisce di più è la presenza di funzionalità che ritroviamo in genere soltanto su CPU molto avanzate e/o moderne. Impressionante. Sembra di trovarsi di fronte a una microprocessore di un’altra epoca.

A questo punto lo Z8000 sembra possedere un’architettura assolutamente perfetta; esente da difetti. In realtà già il titolo lascia presagire qualcosa di diverso, ma sia in positivo che in negativo. Di positivo c’è il fatto che, pur essendo un microprocessore a 16 bit, permette di manipolare anche dati a 32 e addirittura 64 bit. Negativa è, invece, la gestione della memoria, che per superare la famigerata barriera dei 16 bit (pari a 64KB di byte) deve ricorrere al meccanismo dei segmenti di dati.

Sappiamo bene, infatti, che registri a 16 bit permettono di indirizzare soltanto 64KB. Per superare questo limite architetture come lo Z8000 (o altre, come il celeberrimo 8086) “combinano” due valori (chiamati rispettivamente segmento e offset) a 16 bit per ricavare un indirizzo di memoria finale che supera lo spazio dei 64KB. Il segmento si occupa in genere di specificare la “parte alta” dell’indirizzo di memoria, mentre l’offset contribuisce per quella “bassa”.

Una soluzione un po’ macchinosa (ne abbiamo già parlato in un precedente articolo), ma necessaria, in mancanza di veri registri a 32 o più bit che consentono di accedere a grandi quantità di dati in maniera semplice e immediata. D’altra parte è già tanto che questa CPU a 16 bit metta a disposizione la possibilità di manipolare direttamente quantità a 32 e 64 bit.

A fronte di questa ricchissima dotazione di memoria (se consideriamo che l’anno di commercializzazione è il 1979), si stenta a credere che questo processore abbia avuto scarso successo. Fu, infatti, impiegato in alcune workstation Unix, nel famosissimo gioco Pole Position di Namco, e nei nostrani Olivetti M20, M30, ecc..

Purtroppo, e come la storia dimostra, non sempre i prodotti migliori riescono a imporsi nel mercato (e lo Z8000 non fa eccezione), che gli ha preferito la meno versatile e più ostica CPU 8086 di Intel, ma forse è anche colpa di un certo Motorola 68000, che arrivò giusto qualche mese dopo e che s’impose come nuovo metro di paragone nel panorama dei microprocessori…

Press ESC to close