L’Arduino Uno R3 e’ una famosa scheda basata sul chip microcontroller ATMega328P. Abbiamo parlato di Arduino gia’ innumerevoli volte, ma qui vorrei concentrarmi sulle similitudini tra l’ATMega328p e il MOS6502.
Il MOS6592 nato a fine anni ’70 e’ stato il cuore del C/64 e dell’Apple ][, oltre che di altri innumerevoli console di videogiochi (incluso il Nintendo NES).
Gia’ molti hanno osservato che il MOS6502, con la sua architettura ortogonale a 8bit e una notevole velocità di picco di esecuzioni delle istruzioni era piu’ simile ad un microcontrollore che ad un processore per (micro)computer.
Il MOS6502 inoltre indirizzava con particolare efficacia i primi 256 byte di memoria, rendondoli di fatto altri 256 registri “virtuali”, benche’ un pelino piu’ lenti.
L’ATMega328p condivide molte delle caratteristiche del MOS6502, vediamole assieme.
Innanzitutto e’ un micro controllore a 8bit, con 32 registri base indirizzabili anche a word da 16 bit. E’ estremamente performante, e quasi tutte le istruzioni tra registri vengono eseguite in 1 ciclo di clock (es addizioni, sottrazioni). Le istruzioni che coinvolgo l’accesso alla memoria vengono eseguite mediamente in 2 cicli di clock (es Store e Load), esattamente come nel 6502 che pero’ non e’ cosi’ performante sulle operazioni aritmetiche ne’ e’ in grado di fare moltiplicazioni o divisioni.
L’architettura prevede due zone di memoria separate: una memoria flash da 32Kb dove il codice viene letto, ed altri 2KB di RAM come area di lavoro.
Dei 32 registri, sei sono dedicati ai registri a 16 bit X,Y,Z che possono essere usati per indirizzare in modo indiretto la memoria.
L’ATMega ha diversi ‘spazi di indirizzo’ che consente di accedere ai dati in modo differente. Per es lo stack pointer non e’ accessibile direttamente ma e’ visibile come se fosse una porta di I/O.
Contrariamente al MOS6502 le modalità di indirizzamento sono molte meno, ma e’ possibile eseguire salti relativi (rjmp) con una ‘falcata’ di 12bit con segno.
Inoltre, come nel 6502, e’ possibile ‘saltare’ l’istruzione successiva, anche se nel 6502 questo era uno stratagemma che funzionava solo per istruzioni di 2 byte, e consisteva nell’uso non ortodosso della istruzione di controllo ‘BIT’.
Per indirizzare piu’ di 64Kb di RAM, si usa un registro di segmento aggiuntivo (RAMPD).
In generale ci sono molte meno modalità di indirizzamento rispetto al 6502, che inoltre non aveva un puntatore a 16bit per poter indirizzare qualsiasi zona della memoria, e questo costringeva a contorsioni notevoli.
Ci sono un totale di 26 (!) vettori di interrupt, alcuni usati per gestire la scrittura sulla memoria FLASH.