Crea sito

CPU Z80 vs MOS 6502

[Sintesi finale, un confronto all’americana]

A sinistra vediamo il MOS 6502 sulla destra la cpu Zilog Z80

Prima di leggere questo articolo si prega di ammainare ogni bandiera di fazione. Ho deciso di approfondire ancora l’argomento già trattato nell’articolo [Aleph-Proect: la scelta della CPU]. Semplicemente perché ritengo che la trattazione in quell’articolo non forniva quell’esempio lampante su quali siano le reali differenze che caratterizzano tale scelta.

Sebbene in quell’articolo ho mostrato, a grandi linee quelle informazioni che riguardano l’architettura del processore, quelle caratteristiche non si traducono in informazioni prontamente assimilabili (ai non addetti ai lavori).

Il diavolo si nasconde nei dettagli

Quando, su un manuale tecnico si dice che una CPU 6502 esegue un’operazione in un numero di cicli macchina inferiori rispetto allo Z80, in realtà non si dice che il 6502, esegue solo operazioni elementari “tutte ad otto-bit”. Quindi per eseguire una somma tra due numeri a 16 bit come ad esempio: 8960 + 2132, non si può usare ADD HL,BC, ma deve fare un piccolo “programma” che faccia due volte la somma dei registri ad otto bit di cui dispone, ai quali deve considerare il riporto per ogni byte sommato.

— Questo significa che operare con una CPU del genere significa dover fare “lunghe codifiche” come si fa su processori RISC. — Invece, per contro la CPU Z80 già dispone di numerose istruzioni per eseguire somme a 16 bit, ed istruzioni di loop e di spostamento di blocchi di memoria. In sintesi chi sceglie una CPU MOS 6502, sceglie una cpu più “stupida” alla quale bisogna spiegare proprio tutto.

Il pregio della CPU 6502 consiste nel fatto che, una volta scomposto il problema, il MOS 6502 riesce ad affrontarlo con un numero di cicli-macchina inferiore rispetto, alla controparte ZILOG Z80. Ma questo pregio non si concretizza mai in una maggiore velocità di calcolo, perché il MOS 6502, che esordì con una velocità massima di 1 Mhz, fu poi portato a 2Mhz, nella versione CMOS; ma si ricorda che lo ZILOG Z80 fu realizzato per funzionare a 4Mhz, nella versione Z80A, e poi successivamente raggiunse la velocità di 20 Mhz nella versione HCMOS o Z80C.

NOTA BENE: il NEC D780C a 3.5 Mhz dello zx-spectrum era un clone poco efficiente dello Zilog Z80 ed aveva caratteristiche inferiori allo Zilog Z80A.

Considerando quanto detto sopra, ecco la situazione che si dipana al programmatore che desidera spostare un buffer di 16K bytes da un luogo della memoria ad un altro. Chi sceglie un’architettura di tipo CISC fa una codifica in assembly più compatta, perché il processore ha delle apposite istruzioni per gestire anche operazioni più complesse. Chi invece decide di programmare una “specie di RISC” ma con un cloccaggio più lento, in termini di Mhz, si ritrova a dover fare lunghe codifiche nelle quali va esplicitato ogni singolo passaggio di dati intermedio. E questo lavoro maggiore non sarà ricompensato da una maggior velocità di esecuzione. Questa è l’evidenza dei fatti e questa è la realtà privata da nostalgie di marchi scomparsi, degli anni andati. — Oggi che scrivo il processore più veloce al mondo è un processore CISC costruito da INTEL che è retro compatibile con l’I8088, ovvero compatibile con uno stretto parente dello Zilog Z80. —

SEGUE UN ESEMPIO DI CODIFICA IN ASSEMBLY: il codice del test, copia tutti i dati a partire dall indirizzo 8000 HEX fino all’indirizzo BFFF HEX nell’area compresa dall’intervallo [C000 HEX … FFFF HEX].
— Lo Z80 impiega 86 mSecondi a 4Mhz (velocità minima).
— Il MOS 6502 impiega 131,5 mSecondi a 2Mhz.

Lo Z80 è vero che impiega più cicli macchina per un’operazione complessa equivalente, ma questi cicli possono girare ad una frequenza maggiore, proprio per via del fatto che il processore ha una pipe-line più lunga, ed un clock interno diverso da quello applicato all’ingresso. Gli Z80C da me provati non hanno risentito di nessun problema anche se over-colccati del 30%. In sintesi tutti gli Z80 a 10Mhz da me provati hanno funzionato per almeno 5 anni a 13,5 Mhz, senza nessuna anomalia riscontrata.

Lo stesso non si può dire del MOS 6502, che montato a 4 Mhz, nell’Apple bisognava rallentarlo ad 1 Mhz, per l’input /output con le periferiche. — Inoltre si ricorda che, le periferiche su MOS 6502, “possono solo essere mappate in RAM”, perdendo indirizzi di memoria utili al sistema. — Invece lo Z80 può indirizzare 256 periferiche di I/O senza perdere un solo byte di memoria, perché gestisce l’INPUT/OUTPUT in uno spazio di indirizzamento separato.

[Non si riscontrano tanti bug noti sulla cpu Z80, la sua affidabilità è fuori da ogni dubbio]
Anche gli op-code non pubblicati sembrano funzionare bene su tutte le cpu che ho provato. Gli unici op-codes che rivelano un comportamento anomalo sono: OTIR,
OTDR che non aggiornerebbero il carry-flag come documentato.

[Il capitolo BUG del 6502, è pieno di casi nei quali il programmatore deve solo arrendersi]
[Wikipedia-English [bug del processore 6502]

Il confronto tra i due codici assembly dimostra la differenza in termini di “lavoro umano”.
A sinistra la lunga codifica necessaria al MOS 6502 per affrontare il problema complesso.
A destra vediamo che Z80 non necessita di troppi dettagli per risolvere lo stesso problema.

6 Risposte a “CPU Z80 vs MOS 6502”

  1. Il confronto è tra il comune [email protected] usato su home computer e uno [email protected] usato su macchine business invece che sei comuni [email protected],5mhz (o cloni) che erano i concorrenti del [email protected] nella stessa fascia di mercato e ambito.
    Quindi mi sembra un test da fanboy.
    Uno [email protected],5mhz andrà un pelo più veloce di un [email protected] Hanno preatazioni simili.
    L’autore ha fatto un confronto “strano”.

    1. Infoelettronica

      @ Fabrizio Caruso detto “il loquace fan della COMMODORE”,
      amico di persone o “Magazine” poco gradite all’autore di questo blog.

      Il mondo dell’informatica è un tantino più grande della sua visone attuale dei fatti. Lei “NON VEDE” in questo articolo un confronto tra due processori. E vuole ricondurre questo confronto alla bassezza del classico (ZX-SPECTRUM vs COMMODORE)?!? — Mi dispiace se lei ha letto in questo modo. Infoelettronica ha solo il compito di informare, l’alfabetizzazione informatica dovrebbe partire da un bisogno individuale di colmare un vuoto culturale personale. Per tanto le ricordo che la lista dei computer sui quali gira il CP/M è molto lunga, e (COMMODORE 64 & ZX-SPECTRUM) non sono mai stati determinanti in tali ambienti. Ovvero la totalità dei PERSONAL-COMPUTERs ad 8 BIT precedenti all’avvento del PC-IBM.
      (open some book please)!!! (Poi ci sono i sistemi Z80 “custom” non CP/M) … insomma in questo blog si dice altro.
      https://en.wikipedia.org/wiki/List_of_computers_running_CP/M

      1. Io non ho parlato di confrontare il C64 e lo Spectrum? Lei vuole confrontarli? Ho parlato dell’architettura del C64? Lei sta travisando le mie parole.

        Se si fa un confronto si devono confrontare cose simili, dello stesso periodo e che concorrevono nello stesso mercato o quanto meno tra due architetture alle stesse condizioni.

        Esempi di confronti un po’ più bilanciati:
        1. Il minimo Z80 è cloccato a 2,5Mhz vs il minino 6502 a 1Mhz. 4Mhz non è il minimo…

        2. Il modello Z80 più usato negli home computer della fine anni 70, inizio anni 80 con un equivalente modello 6502.
        Nel 1979 un MOS6502 molto diffuso era cloccato a 1,8Mhz e concorreva con Z80 da max 3,5Mhz.

        Lei a preso delle frequenze arbitrarie e le ha confrontate. Qualunque scelta è arbitraria ma almeno bisognerebbe dire perché si confronta 1Mhz vs 4Mhz quando parliamo di rispettive frequenze i cui modelli avevano applicazioni e costi diversi.

        Poi il confronto è difficile da fare perché dipende dallo use-case.
        L’architettura Z80 è più complessa e soffre meno anche in applicazioni moderne grazie al suo stack. Lo stack è il vero limite serio del MOS6502.
        Sicuramente uno Z80 regge meglio oggi soprattutto se lo si vuole usare programmando in C. Il MOS6502 oggi è incarnato dal 65816 a 16 che è con lui retrocompatibile.

        Il MOS6502 pur costando meno in pratica se confrontato seriamente con modelli Z80 che erano suoi concorrenti diretti, andava circa alla pari pur utilizzando il suo test (che a me pare molto di parte). E’ sufficiente fare le dovute proporzioni per vedere come un comune [email protected],8Mhz del 1979 stracci nel suo test uno [email protected] usato allora in ambito business.

        Non contesto neanche il risultato del test ma la metodologia del test che a me sembra molto partigiana.

        1. Non traviso nulla, come si permette?
          Il riferimento è tutto su RetroForce (gruppo facebook)
          https://www.facebook.com/groups/Retroforce/permalink/909561482717208/

          Tuttavia torniamo all’attualità.
          il mio confronto è tra un MOS 6502 a 2 Mhz (2Mhz) contro uno Zilog Z80 a 4Mhz
          ————————————–
          Scrive (Fabrizio Caruso)
          1. Il minimo Z80 è cloccato a 2,5Mhz vs il minino 6502 a 1Mhz. 4Mhz non è il minimo… (non è equo?)
          ————————————–
          Risponde Infoeletronica
          uno Z80 a 2,5 Mhz produce la seguente proporzione: 334.131 time clock * (1/2.500.000 Hz) =

          133,65 milli secondi (per copiare 16 k bytes).

          un MOS 6502 ad 1 Mhz produce la seguente proporzione: 263.064 time clock * (1/1.000.000 Hz) =

          263,06 milli secondi. (per copiare 16 k bytes).

          Le formule che lei vede qui si studiano in 5A elementare, basta una buona quinta elementare per capire quanto siano sciocchi i suoi ragionamenti da filosofo del computer. Mi consenta, usi la matematica come metro per misurare le sue parole. Nel mio confronto ho avvantaggiato il MOS 6502 rispetto allo Z80 perché un Mos 6502 a 2Mhz ha solo 2 Mhz di differenza rispetto allo Z80 a 4 Mhz e sarebbe il doppio 2x.

          Nel confronto che lei ritiene più equo, il mos 6502 ha 1 Mhz mentre lo Zilog Z80 ha 2,5 volte più veloce in termini di frequenza!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.

          Questo implica uno zilog 2,5 volte più veloce del suo processore preferito. Temo che lei non abbia idea di cosa siano le proporzioni aritmetiche. Mi perdoni e lo faccio per lei, non approverò più altri commenti dove lei manifesta la sua ignoranza e la mancanza di conoscenze elementari. (Mi perdoni signor Caruso, magari lei non è così sprovveduto …) Magari lei è solo un po’ stressato.

          Ora il confronto le sembra più equo? (Meditate gente meditate … diceva il caro Renzo Arbore)! Con simpatia da Infoelettronica.

  2. non vorrei fare polemica, a me piace molto quando si fanno i test usando i codici 🙂
    quello per 6502 però mi sembra un tantino lungo..

    supponendo di avere i valori di partenza (c000) e di arrivo (8000) nelle locazioni di memoria FC, FB, FE ed FD
    i 16k si dovrebbero copiare facilmente con questo listato piu’ “umano”

    * org 0100
    LDX #$40 ;esegue il ciclo di copia di 256 bytes 64 volte (16k)
    LOOP:
    LDA ($FB),Y ; legge il dato
    STA ($FD),Y ; scrive il dato
    INY
    BNE LOOP ; ripete 256 volte
    INC $FC ; incrementa i byte piu significativi di partenza e destinazione
    INC $FE
    DEX ; decrementa il numero delle ripetizioni del ciclo di copia
    BNE LOOP ; controlla se finito

    volendo si puo’ aggiungere un SEI all’inizio ed un CLI alla fine…
    (non ho testato il programma per mancanza di tempo, spero non ci siano errori)

    non capisco il perche’ di quel programma arcigogolato per fare una cosa cosi’ semplice 🙂

    1. FROM Infoeletronica
      @ Juri Fossaroli

      Ed infatti non non credo sia il caso di fare polemiche.
      Quel codice proviene dal sito 6502.org
      http://6502.org/source/general/memory_move.html
      Non l’ho fatto certo apposta per l’occasione.
      Non è mia volontà affliggere il MOS 6502.

      Tuttavia il tuo codice funziona. l’ho provato nel simulatore.
      nel file zippato troverai:
      juri00.65s
      IURI00.65BIN
      IURIEXEC.65B

      dall’indirizzo E000H .. E007H ci sono una serie di zeri perché
      il processore non ha INPUT/OUTPUT separati dall’indirizzamento
      della memoria così quelle porte di input/output sono indirizzi
      mancanti in RAM. (Inutile dire che lo Z80) ha un indirizzamento
      separato per l’input/output quindi i 64K sono tutti ram.
      Senza buchi per i varii I/O su periferiche.

      Hai fatto un bel lavoro COMPLIMENTI

      hai risparmiato 8 CICLI DI CLOCK!!!!

      (scarica i files del test)
      http://infoelettronica.altervista.org/wp-content/uploads/2019/04/IURI_FOSSAROLI.zip

      Scarica il risultato del TEST.

      FILE SORGENTE MODIFICATO
      ;
      ; this program was made Iuri_Fossaroli
      ; with modify by Isacco Luongo
      ; when copy the block [8000h .. BFFFh] to [C000 .. FFFF]
      ; 16.348 bytes
      ;
      ; FROM = source start address
      ; TO = destination start address
      ; SIZE = number of bytes to move
      ;……………………………………………..
      .ORG $0000 ;
      JSR MAIN ;
      BRK ; 263.056 cicli macchina
      ; Si risparmiano 8 cicli
      .ORG $0060 ; ======================
      ;
      ;
      FROM: .DB $00 ; ADDR 0060H = 00
      .DB $80 ; ADDR 0061H = 80
      TO: .DB $00 ; ADDR 0062H = 00
      .DB $C0 ; ADDR 0063H = C0
      ; —————————-
      SIZEL: .DB $00 ;
      SIZEH: .DB $40 ;
      ;
      .ORG $0100 ;
      MAIN: ;
      LDX #$40 ; REG.X=64 loops
      LDY FROM ; REG.Y=00H
      ;
      LOOP: ;
      LDA (FROM),Y ; move a page at a time
      STA (TO),Y ;
      INY ;
      BNE LOOP ;
      INC FROM+1 ;
      INC TO+1 ;
      DEX ;
      BNE LOOP ;
      RTS ;
      ;
      .ORG $8000 ;
      .DB $FF ;
      ;
      .ORG $BFFF ;
      .DB $FE ;

I commenti sono chiusi.