ITALIA  
 
Commodore 64 vs. Sinclair Spectrum :: La CPU
 
 
 
MOS 6510 e Zilog Z80
 
Sfida allo "0"K Corral
Cosa succede quando veterani di Z80 e 6502 si sfidano a colpi di codice? Piccoli problemi sono stati proposti, risolti e raccolti in The Fridge, con il susseguente confronto dei cicli di clock. Il confronto su problemi concreti chiarisce come il rapporto di velocità tra Z80 e 6502 a parità di clock sia in media di 3:1 in favore di quest' ultimo. Gli algoritmi esposti sono 8x8->16 shift&add multiply, block mem copy (con e senza LDIR), substring search, line routine, fast multiply, string print, sprites.
Le aree contese
Nello Spectrum l'area di memoria contenuta nei primi 16K è condivisa tra la ULA e la CPU. Non avendo le caratteristiche del 6502, l'accesso deve avvenire a turni. La ULA è responsabile della generazione del video e perciò ha la priorità rispetto allo Z80. Questo significa che l'esecuzione di codice od operazioni di lettura/scrittura in quest'area possono subire dei rallentamenti. A seconda dell'istante di esecuzione infatti una istruzione può richiedere fino a 6 cicli aggiuntivi. Ciò significa che in alcuni casi l'incremento del tempo di esecuzione può arrivare al 150% (ad esempio una NOP può passare da 4 a 10 cicli). Oltre alla memoria contesa vi è anche una zona di I/O contesa. L'accesso alle porte pari comporta un'accesso alla ULA. Se la ULA è impegnata nella generazione del video, l'accesso in lettura a tali porte ne risulterà rallentato [9].

Il chip Zilog Z80

Verso la metà degli anni 70 l'italiano Federico Faggin, che aveva lavorato alla creazione del primo chip mai realizzato, il 4004, lasciò la Intel per fondare la propria ditta e portare avanti il progetto di un chip più avanzato rispetto all'allora disponibile Intel 8080. La ditta prese il nome di Zilog e nel 1976 rilasciò uno dei più fortunati microprocessori ad 8 bit della storia, lo Z80. Faggin partì dalle caratteristiche dell'8080 ampliandole in diverse direzioni e proponendo il risultato ad un prezzo comunque minore dell'8080, con il risultato di spingere quest'ultimo lentamente fuori dal mercato. L'8080 e lo Z80 appartengono alla famiglia dei cosiddetti processori register-oriented. In questi processori le operazioni devono aver primariamente luogo nei registri interni che quindi devono essere in numero adeguato. Nello Z80 oltre all'accumulatore e ai registri speciali (flag, stack pointer, contatore istruzioni) ve ne sono altri 6 ad 8 bit che possono essere combinati a coppie in registri da 16 bit e che risultano utili nei calcoli, più due registri indice a 16 bit. Dispone inoltre di un secondo set di altrettanti registri gemelli ma solo uno alla volta dei due set può essere utilizzato. Un'altra peculiarità di questa famiglia di processori è l'elevato numero di istruzioni. Essi sono infatti gli antenati dei processori CISC (Complex Instruction Set Chip) dei quali oggi sopravvive la ben nota famiglia Pentium IV (e compatibili) che troviamo praticamente in tutti i computer desktop e basano la loro potenza sulla implementazione di un ricco set di istruzioni, anche complesse. Uno dei vantaggi dello Z80 è inoltre quello di includere un controller per il refresh della RAM dinamica che quindi non deve essere montato a parte e semplifica la progettazione della macchina.

Il chip MOS 6502

La MOS Technologies venne fondata da un gruppo di ingegneri fuoriusciti dalla Motorola dopo la progettazione del Motorola 6800 per poter lavorare liberamente ad un nuovo progetto. Il risultato fu il 6502, un chip dal design nuovo, offerto ad un prezzo incredibilmente basso (25 dollari del 1975) e ciononostante più performante degli allora dominanti Intel 8080 e Motorola 6800, offerti ad un prezzo 6 volte maggiore. Comparato con l'Intel 8080, il 6502 segue una filosofia completamente diversa, preferendo puntare sulla semplicità e sull'ottimizzazione. Il 6502 appartiene infatti alla categoria dei processori memory-oriented, che privilegiano un'accesso veloce alla memoria ed un ridotto numero di istruzioni e registri e rappresenta un'antenato dei processori RISC (Reduced Instruction Set Chip). Il 6502 possiede solo tre registri per uso generale, in particolare l'accumulatore A e due registri, X ed Y, di solito utilizzati come registri indice.

La CPU nello Spectrum e nel Commodore 64

Lo Spectrum adotta un processore Z80 con un clock di 3.54 MHz mentre nel Commodore 64 troviamo un 6510 cloccato a circa 1 MHz. Il 6510 è una variante del 6502 che aggiunge una porta I/O da 8 bit. Considerata la velocità del clock e quanto detto sul numero di registri e di istruzioni nei due chip potrebbe apparire che la CPU dello Spectrum, e quindi il computer stesso, sia assai più potente del Commodore 64. Tuttavia un'analisi delle prestazioni non può prescindere da come sono stati concepiti questi due chip e rivela non solo che per la maggior parte dei task generici o specifici un 6510 a 1 Mhz riesce tener testa ad uno Z80 clockato a 3 Mhz ma che in diversi casi riesce perfino a fare meglio. E molto dipende dal contesto in cui è inserito e sfruttato il chip in base alla sua ingegnerizzazione. Lo Z80 ha il pregio di poter utilizzare nativamente un' artimetica a 16 bit grazie alla lunghezza e al numero dei registri interni. Possiede inoltre un set molto più elaborato di istruzioni che possono tornare utili in particolari situazioni. Ma quest' ultimo vantaggio non solo è mitigato dalla legge del 20-80 secondo cui tipicamente una CPU passa l' 80% del tempo ad eseguire solo il 20% delle istruzioni disponibili, ovvero le più usate, ma deve anche combattere da una parte con il collo di bottiglia dell'accumulatore, unica via d'accesso alla memoria, accesso che avviene con istruzioni lente poiché si è scelto di privilegiare le operazioni all'interno dei registri. Dall'altra con il maggior numero di cicli di clock che servono per eseguire le singole istruzioni. E' infatti proprio la complessità del processore e l'elevato numero di istruzioni in esso implementate che tendono a rallentarlo, il prezzo da pagare per avere un set complesso; ed il modo per ovviare a ciò è aumentare il clock del processore. La prospettiva cambia dunque radicalmente quando ci si rende conto che il 6510 è un chip progettato attorno al concetto di un accesso veloce alla memoria con la possibilità per alcune istruzioni di operare direttamente sulla RAM ed un set di modalità di indirizzamento che lo Z80 non possiede; e laddove il numero di variabili cresce rapidamente ed i registri dello Z80 ben presto si saturano il 6510 non può che uscire vincitore. Al contrario lo Z80 mostra la sua potenza finché le operazioni da fare sono interne al processore, sfruttando proprio l' elevato numero di registri. Molto viene quindi a dipendere dal tipo di applicazione e dall' abilità del programmatore. Una regola empirica all'epoca molto seguita affermava che un 6502 ad 1 MHz fosse equivalente ad un 8080 a 4MHz [1]. Mediamente un 6502 ad 1 MHz è equivalente ad uno Z80 a 3 MHz. In definitiva il divario tra i due processori presenti nei due computer è assai ridotto e poco significativo. E' invece importante notare come il C64 si avvalga, oltre al processore, di ben 4 chip dedicati (VIC-II, SID e due 6526 per l' I/O) mentre nello Spectrum tutto il carico di lavoro resta sulle spalle dello Z80. Se escludiamo quindi alcune appplicazioni particolari dove i calcoli interni possono divenire predominanti, come la grafica 3D dove lo Spectrum può avere un 20% di vantaggio [2], le due CPU sono mediamente allo stesso livello ma laddove venga chiamato in causa anche uno solo dei coprocessori del C64, lo Spectrum non potrà che soffrirne. E' significativo far notare come sebbene all'epoca 8080 e Z80 potessero apparire chip assai superiori, cionondimeno, benchmark dopo benchmark, l'evidenza mostrasse come gli interpreti BASIC basati sul 6800 e sul 6502 risultassero significativamente più veloci [3].

 
 
Le armi segrete del 6502

Il 6502 è progettato in base alla semplicità, la velocità, l'efficienza, l'ottimizzazione dell'accesso alla memoria centrale. Per questo motivo gli algoritmi che comportano un accesso sparso alla memoria performano molto bene, così come i programmi che fanno abbondante uso di branching e subroutine. La possibilità di eseguire operazioni direttamente sulla memoria comporta che algoritmi con numerose variabili, tavole, puntatori performino assai meglio sul 6502 che sullo Z80. Algoritmi che al contrario riguardano poche variabili e pochi accessi alla memoria forniranno un risultato opposto. Il programmatore di 6502 tenderà a lavorare intimamente con la memoria, il programmatore di Z80 tenderà al contrario a confinare tutto nei registri, cercando di accedere alla memoria sempre in maniera lineare [4]. La maggior parte delle istruzioni del 6502 richiedono dai 2 ai 5 cicli e fino ad un massimo di 7 mentre la maggior parte delle istruzioni dello Z80 richiedono dai 4 ai 16 cicli, con alcune istruzioni che possono arrivare a 23. In particolare gli accessi alla memoria sono sempre eseguiti indirettamente in maniera lineare (generalmente tramite HL) e la scrittura prende ben 13 cicli. Nelle istruzioni immediate, che tipicamente richiedono 2 cicli nel 6502 e 7 cicli nello Z80, il clock di 3.54 MHz serve a riportare in pari la differenza. Sebbene lo Z80 includa diverse istruzioni complesse per compiti specializzati, alcune operazioni comuni richiedono l'uso di due istruzioni. Ad esempio la comparazione di un byte in memoria con l'accumulatore nel 6502 si ottiene direttamente con l'istruzione CMP che prende 4 cicli. Nello Z80 la medesima istruzione prende 7 cicli ma richiede che venga preventivamente memorizzato l'indirizzo della locazione di memoria in HL. Le due istruzioni insieme finiscono per richiedere 17 cicli. A differenza dello Z80 inoltre, il 6502 non è microcodificato. Il 6502 presenta una serie di caratteristiche che all'epoca lo rendevano performante ed interessante a dispetto della velocità di clock.

Pagina Zero: le locazioni della prima pagina di memoria, quella che inizia a $0000, costituivano una pagina accessibile in maniera più veloce rispetto alle altre. Nell'indirizzamento di pagina zero infatti solo il byte meno significativo dell'indirizzo è contenuto nell'istruzione, rendendola un byte più corta e riducendo la fase di fetch dalla memoria durante l'esecuzione [5]. Stante l'elevata velocità di accesso alla memoria del 6502, la pagina zero poteva all'occorrenza essere utilizzata per implementare tutti i registri mancanti.
Modi di indirizzamento: il 6502 forniva una serie di versatili modalità di indirizzamento: implicita, accumulatore, immediata, pagina zero, pagina zero X, pagina zero Y, relativa, assoluta, assoluta X, assoluta Y, indiretta, indicizzata indiretta, indiretta indicizzata [6],[7].
Pipelining: il 6502 implementava già allora il meccanismo del pipelining, il prelievo dell'istruzione successiva aveva luogo quando quella corrente non era ancora terminata. Il processore accedeva alla memoria ad ogni ciclo.
Bus 6502: grazie al suo meccanismo di temporizzazione, i chip della famiglia 6500 potevano accedere alla memoria insieme alla CPU nello stesso ciclo di clock, utilizzando entrambi i fronti del clock (salita e discesa). Un caso tipico era quello del processore video che così poteva accedere alla memoria senza rallentamenti e con un generale incremento delle prestazioni [8].
Economicità: nonostante le sue prestazioni il 6502 veniva offerto ad un prezzo veramente interessante rispetto ai suoi concorrenti. In fase di progettazione della macchina ciò permetteva di concentrare buon parte del budget per lo sviluppo di caratteristiche aggiuntive.

Il futuro del micro processing da oltre 25 anni
Così recità l'intestazione della Western Design, la ditta che ad oggi, dopo quasi trent'anni dalla sua introduzione, ancora produce e commercializza il 6502 ed altri chip della stessa famiglia per applicazioni low-cost. In particolare la Western Design fornisce il W65C02S8-14, versione moderna del 65C02 (la versione CMOS del 6502 del 1982, con nuove istruzioni) con un clock massimo di 14 MHz e disponibile in 3 diversi package.

Riferimenti
[3] Interpreters—A Recap, J.W.Crenshaw
[1],[7],[8] MOS Technology 6502,Wikipedia

[2],[4] Pity the poor Speccy
[5],[6] www.obelisk.demon.co.uk/6502/
[9] comp.sys.sinclair FAQ, 16K/48K Spectrum Reference