di  -  mercoledì 26 novembre 2008

Una domanda, questa, che ha tenuto banco (soprattutto gli animi accesi) nella prima metà degli anni ’80, quando a dominare il mercato degli home computer erano il Commodore 64 e il Sinclair ZX Spectrum, che montavano il primo e il secondo rispettivamente.

Le differenze in termini di frequenza di clock potrebbero indurre facilmente a una “evidentissima” conclusione. D’altra parte entrambi sono CISC, entrambi sono a processori a 8 bit, e il secondo ha un clock del 250% superiore. Se ci fermassimo qui, però, ricadremmo nel classico mito dei Mhz (che tratteremo più approfonditamente in un futuro articolo), che attribuisce alla frequenza di funzionamento l’unica variabile (o comunque quella in assoluto più significativa) da considerare…

In realtà analizzando le architetture delle due CPU, pochi si sbilancerebbero su un risultato così “scontato”, e il motivo è presto detto: entrambe hanno punti di forza e di debolezza. Mi rendo conto che è un’affermazione ovvia, oserei dire lapalissiana, ma in un contesto inquinato dai miti di cui sopra, ha una certa valenza e un forte richiamo alla realtà dei fatti.

Possiamo vedere, in particolare, che il 6502 è votato all’efficienza nell’esecuzione (principalmente per l’accesso alla memoria), mentre lo Z80 dà il meglio di sé nella compattezza del codice (essendo particolarmente ricco di registri e di istruzioni che operano in tanti campi).

Gli estremi che rappresentano la situazione di cui sopra (ma che non hanno la pretesa di sintetizzarla, sia chiaro) sono le istruzioni più lente e più veloci. Il 6502 richiede almeno 2 cicli di clock per il completamento dell’operazione più veloce, mentre ben 7 per quella più lenta. Lo Z80, invece, richiede almeno 4 cicli di clock nel primo caso e ben 23 nel secondo.

Il fattore più importante che incide su questi calcoli è il tempo per l’accesso alla memoria. Nel 6502 è necessario un solo ciclo per la lettura o la scrittura di un byte, mentre per lo Z80 ne servono almeno 3 per la stessa operazione.

Per il 6502 ci sono altri tre elementi che giocano a favore. Il primo è sicuramente rappresentato dal fatto che un’istruzione di caricamento di un dato dalla memoria in un registro comporta automaticamente un confronto del byte letto col valore zero e la relativa impostazione dei flag di stato. In questo modo si risparmia un’istruzione.

Il secondo punto a favore è rappresentato dalla pipeline di esecuzione, che permette di sovrapporre le letture della memoria con l’esecuzione delle operazioni. In questo modo un’istruzione che, ad esempio, opera con un dato immediato (e che, quindi, occupa due byte) impiega lo stesso numero di cicli di clock di un’istruzione semplice lunga un solo byte: 2 cicli di clock per entrambe.
Il terzo elemento è rappresentato dall’elevato numero di modalità di indirizzamento: ben 13, che consentono di accedere alla memoria in maniera molto efficiente e flessibile.

Lo Z80 punta, invece, su fattori completamente diversi. Intanto l’elevato numero di registri a disposizione: ben 16 a 8 bit (di cui soltanto 8 alla volte utilizzabili nello stesso momento), a cui si aggiungono altri 4 registri a 16 bit, e due registri speciali a 8 bit (per interrupt e refresh della memoria). Quest’abbondanza consente di ridurre l’accesso alla memoria, che come dicevo prima rappresenta il tallone d’Achille dello Z80.

Altra cosa molto interessante è rappresenta dal fatto di avere registri a 16 bit. Questo non riguarda soltanto lo stack pointer (a 16 bit; mentre nel 6502 è a 8 bit) e i registri indice, ma anche i registri a 8 bit che si possono “raggruppare” a due a due ottenendo quindi 4 registri a 16 bit quando dovesse servire.

Infine la ricchissima dotazione di istruzioni (ben 158 contro le sole 56 del 6502), che consentono addirittura di manipolare singoli bit, spostare blocchi di memoria e ricercare byte nella memoria.

Ci troviamo, quindi, con due filosofie completamente diverse nell’approccio alla computazione. Difficile, se non impossibile, stabilire quale dei due processori fosse mediamente più veloce, se non su singoli e ben precisi pezzi codice.

L’unica cosa certa che rimane, alla fine, è che hanno dato tantissime soddisfazioni a chi li ha usati…

16 Commenti »

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.

  • # 1
    bob
     scrive: 

    ci spieghi come ti salta in mente questa comparativa nel 2008?

  • # 2
    max@nikon
     scrive: 

    The Way of the Exploding Fist!

    Quante serate con gli amici sullo Spectrum!!!

    Aho, a fare 2 conti oramai gioco con i videogames da ben 24 anni!!! E non mi stanco… :-)

  • # 3
    Peppe
     scrive: 

    A parte i due fatti universalmente, scientificamente e obbiettivamente assodati che
    1) il C64 era fantastico e
    2) lo Spectrum faceva pena :D ,
    credo che all’epoca ci fosse un certo consenso sul fatto che lo Z80 fosse la cpu più “seria”, probabilmente per il fatto che dava accesso al mondo CP/M.
    Qualche eretico sognava una macchina con il processore dello Spectrum e i “custom chip” del C64. La Commodore vendeva una cartucciona con dentro uno Z80 da innestare sul C64, però non l’ho mai vista in azione, e suppongo (ma è pura speculazione) che il suo funzionamento fosse ancora più limitato di quello che poi avrebbe avuto lo Z80 nel futuro Commodore 128.

  • # 4
    Luca
     scrive: 

    Sono tornato a casa ora dopo una notte di “bagordi”.
    Doccia e poi in fretta a lavorare.
    Ma mi è cascato l’occhio sull’articolo e sulle foto del gioco della “Melbourne” con cui avevo passato giornate a sfidare gli amici una vita fa.
    Meglio oggi… ma un poco mi sono “commosso”.
    Ciao

  • # 5
    Alessio Di Domizio
     scrive: 

    @ bob
    Posso spiegartelo io. Abbiamo deciso di occuparci di architetture CPU, anche in prospettiva storica.

  • # 6
    efrem
     scrive: 

    ODDIO LO Z80!!! NOOOO
    Argh! che incubi! lo programmavo in assembly!!

    sigh… che tempi… tutti quegli 1 e 0 :D

  • # 7
    Enzo
     scrive: 

    Tanto parlare di una cpu che proprio non è del C-64 ma nel vic-20. Lo so perchè li ho avuti entrambi… :-)
    Infatti è Il motorola 6510 la cpu del c-64.
    Che anni….

    Ciao!!

  • # 8
    Cristiano
     scrive: 

    Beh, il 6510 era derivato strettamente dal 6502. Era una versione customizzata del 6502. Questo articolo dimostra effettivamente che la semplificazioni sulle prestazioni dei dispositivi hardware sono sempre stati usati. Più facile per il marketing evidenziare un unico parametro che far crescere la comprensione degli utenti.

  • # 9
    Cesare
     scrive: 

    Esattamente. :)

    @bob: stiamo parlando di un pezzo di storia, e il confronto ha l’unico scopo di mettere a nudo i fatti, smentendo le classiche leggende metropotane che circolano quando si parla di certi argomenti. ;)

    @Peppe. Infatti il pregio dello Z80 era che ci girava il CP/M. Che non è che fosse poi un signor sistema operativo. Su Commodore 64 girava un certo GEOS che non aveva nulla da invidiargli. Tutt’altro. ;)

    Sulla cartuccia che citi non ho notizie, per cui non ti saprei dire, ma la ritengo inutile, come inutile era lo Z80 dentro il 128, visto che è stato usato pochissimo.

    @Enzo: t’ha risposto Cristiano. Comunque la CPU del C64 non era di casa Motorola, ma MOS, come ho scritto nell’articolo precedente che trattava il 6502.

  • # 10
    daniel
     scrive: 

    Io il 6502 lo uso all’università per programmarlo in assembly con l’emulatore ftoy!
    se non erro ha 3 registri e in oltre se non erro, è il processore del game boy..

  • # 11
    Cesare
     scrive: 

    Non erri. :)

    Comunque ne ho già parlato più approfonditamente qui: http://www.appuntidigitali.it/2684/mos-6502-un-microprocessore-semplice-ma-cisc/ ;)

  • # 12
    phabio76
     scrive: 

    Per accreditare l’efficienza del 6502 ricordo che lo sviluppo di processori ARM (RISC !)nasce dalla base delle istruzioni della cpu MOS Technology.
    Poi non so se sia giusto definirli CISC questi processori, all’epoca il confine era piuttosto sfumato…
    Lo Z80 era “più CISC” e infatti più lento.

  • # 13
    Cesare
     scrive: 

    Sì, gli ARM sono fortemente ispirati al 6502.

    Ti assicuro, comunque, che è molto più “CISC” il 6502 che lo Z80 per alcuni punti di vista (la presenza di modalità d’indirizzamento complesse), mentre per altri aspetti lo Z80 ha dei concetti che richiamano i RISC (numero di registri general purpose e istruzioni di load / store in primis).

    Il confine, come dici, è piuttosto sfumato, ma rimane comunque sufficiente per classificare un processore all’una o all’altra famiglia.

    Quanto ai “più CISC = più lenti”, anche questo è da vedere. Ad esempio il 68040 era uno dei processori più CISC, ma anche più performanti all’epoca in cui è stato introdotto (tanto che veniva chiamato anche “l’anti-RISC” :D ). ;)

  • # 14
    Old_8088
     scrive: 

    Concordo con Cesare. Chi ritiene che, in assoluto, un’architettura cisc sia piu’ lenta di una risc, dimostra di non sapere nulla sui micro.

    Riguardo poi, alla solita diatriba sulla velocita’ del 6502 vs z80, il confronto non ha senso per queste ragioni:

    1) Dipende da quello che devi fare, esempio:

    se devi copiare una stringa di byte tra due regioni di memoria, lo z80 con le sue istruzioni dedicate riesce a “stracciare” il 6502 praticamente anche a parita’ di clock (un byte viene spostato in 21 cicli di clock).
    Se invece fai uso di indirizzamenti sofisticati come quelli presenti nel 6502 (pre/post indexed), non basta uno z80 a 4Mhz a fare quello che il 6502 fa a 1Mhz!

    Di questi esempi se ne potrebbero fare a iosa.

    2) il confronto va fatto con le cpu impiegate in un’ archittetura reale, quindi per esempio con rif. al C64 e ZX, non semplicemente prendendo la calcolatrice e dividendo la frequenza di clock per il numero di cicli di un’ istruzione. Infatti il modo con cui i due micro ‘usano’ il clock esterno e’ differente e questo determina anche la frequenza massima di clock applicabile.

    Non e’ infatti un caso che le versioni ‘early’ del 6502 e dello z80 lavorassero a frequenza di clock massime cosi’ differenti. 1Mhz per il 6502 e 2.5Mhz per lo z80.

    Cio’ che voglio dire e’ che per un 6502 era alta una frequenza di clock di 1mhz allo stesso modo di come lo era per uno z80 la frequenza di 2.5Mhz.

    Nessun progettista utilizzerebbe uno z80 a 1mhz, frequenza che per quel processore e’ ignobilmente bassa.

    Le stesse considerazioni si potevano fare anche per gli amd e intel.

    A titolo di esempio, cito semplicemente un fatto: certi giochi ‘isometrici’, concepiti per il vecchio zx spectrum, quando venivano portati su c64 subivano un’ottimizzazione del codice manuale (riscrittura di routine chiave) per guadagnare un 20-30% di velocita’ e raggiungere una velocita’ confrontabile con quella della versione spectrum.

    Questo dimostra, che la differenza di prestazioni, pur se esistente, non e’ cosi drammatica, ed e’ molto influenzata dalle capacita dello sviluppatore, dal contesto e dal tipo di operazioni svolte.

  • # 15
    Paolo
     scrive: 

    Sono incappato in questa pagina per caso, tra l’altro qualche giorno fa avevo letto un’altro articolo molto interessante su un’altra pagina, dove ci sono addirittura esempi pratici il LM!!
    Nessuno riuscira’ a convincermi che il C64 era peggiore dello spectrum , mi dispiace.
    Chi volesse approfondire la lettura provi a leggere qua: http://c64vszx.blogspot.it/2014/10/salve-tutti-questa-pagina-nasce-dopo-la.html

  • # 16
    Cesare Di Mauro (Autore del post)
     scrive: 

    Bellissimo articolo, grazie! :)

Scrivi un commento!

Aggiungi il commento, oppure trackback dal tuo sito.

I commenti inseriti dai lettori di AppuntiDigitali non sono oggetto di moderazione preventiva, ma solo di eventuale filtro antispam. Qualora si ravvisi un contenuto non consono (offensivo o diffamatorio) si prega di contattare l'amministrazione di Appunti Digitali all'indirizzo info@appuntidigitali.it, specificando quale sia il commento in oggetto.