
Chi di noi non ha mai giocato a Pac-Man, Tetris o al più blasonato Super Mario Bros? Il retrogaming, ovvero la passione per i videogiochi del passato, non è mai tramontata; il WEB è infatti pieno di emulatori che permettono di giocare online con queste vecchie glorie e molti sono i siti di appassionati che rendono disponibili videogiochi sviluppati su queste "antiche" piattaforme di gaming. Approfondiamo questa tematica con alcuni articoli che, partendo dalla realizzazione di una piccola console portatile che emula la piattaforma NES (Nintendo Entertainment System), getteranno le basi per comprendere come programmare da soli dei semplici videogiochi utilizzando il linguaggio C e alcuni strumenti open-source disponibili in rete.
Nintendo Entertainment System
Nintendo Entertainment System (NES) è stata probabilmente la piattaforma di videogiochi a 8 bit più venduta e utilizzata. Rilasciata nel 1983 prima in Giappone con il nome di Family Computer (Famicom), successivamente, dopo un "restyling" e alcune piccole modifiche, a partire dal 1985 venne commercialmente diffusa negli Stati Uniti con il nome "Nintendo Entertainment System". Nel periodo che va dal 1985 fino al 1995, anno in cui cessò la produzione, furono venduti più di 60 milioni di esemplari con centinaia di videogiochi diversi. La diffusione del prodotto oltre agli Stati Uniti riguardò anche tutta l'Europa, l'Australia e parte dell'Asia.

Figura 1: Console NES
La console (Figura 1) fu ideata con l'intento iniziale di rendere disponibili su un piattaforma, sostanzialmente economica, i famosi videogiochi "Arcade" che allora "imperversavano" nelle sale giochi di mezzo mondo. Si trattava di videogiochi installati su dei grandi cabinet (Figura 2), normalmente collocati in gallerie commerciali (da qui il nome "Arcade") dove per giocare occorreva inserire una moneta o un gettone.

Figura 2: Esempio di "Arcade Cabinet"
Architettura hardware
Per meglio comprendere il contesto tecnico e le performance di questa console, descriviamo brevemente quella che è l'architettura hardware di riferimento. Si tratta di un sistema digitale a 8 bit basato sulla CPU 6502, un microprocessore prodotto a partire dal 1975, molto in voga negli anni a 80 e che fu impiegato in molteplici home computer commercializzati in quel periodo, come ad esempio il Commodore VIC-20, l'APPLE I o l'intera famiglia dei computer ATARI a 8 bit. La CPU in questione ebbe un grande successo soprattutto per il costo estremamente contenuto, quest'ultima venne infatti presentata per la prima volta alla fiera dell'elettronica WESCON di San Francisco del 1975 al prezzo di soli 25$. Considerate che le più blasonate CPU dell'epoca, il Motorola 6800 e l'Intel 8080 venivano vendute a più di 170$ e solo in seguito alla presentazione della CPU 6502 vennero prezzati a valori molto più contenuti. La versione realizzata per la console NES (2A03), era prodotta dalla società Giapponese Ricoh ed era composta dalla CPU 6502 e da una apposita unità audio, APU (Audio Processing Unit) che serviva alla gestione di tutto il comparto sonoro. In realtà, le CPU prodotte furono di due tipi: la 2A03 con clock a 1.77 MHZ e la 2A07 con clock 1.69 MHZ, questo perché le CPU dovevano supportare rispettivamente i due standard televisivi di allora, l'NTSC americano e il PAL europeo. All'epoca, in particolare per quanto riguarda i dispositivi digitali prodotti per l'utenza domestica, sia gli home computer che le normali console per videogiochi utilizzavano come monitor i comuni televisori di casa e quindi occorreva tener conto dei diversi standard.

Figura 3: Architettura di riferimento di una console NES

Figura 4: Motherboard della console NES
In Figura 3 è visibile l'architettura di principio di una console NES, mentre in Figura 4 é visibile la foto della motherboard. Oltre alla CPU (2A03) che abbiamo appena descritto, il sistema é composto dalla PPU (Picture Processing Unit) ovvero la scheda grafica e dalla cartridge (Figure 5 e 6) contenente il videogioco. La cartridge é a tutti gli effetti un elemento hardware della console. Il videogioco e la sua componente grafica non sono memorizzati su un supporto magnetico ma sono codificati all'interno di ROM dedicate (ROM game program e CHR ROM/RAM), questo fa capire anche quanto é sostanzialmente costoso produrre e distribuire un videogioco per una console NES.
L'architettura é completata dalle RAM (solo 2k !) utilizzate rispettivamente dalla CPU e dalla PPU, e da un circuito (Lockout) che serve a verificare l'originalità della cartridge.

Figura 5: Il contenitore dove é alloggiata la cartridge

Figura 6: Esempio di cartridge (nello specifico il gioco memorizzato é Tetris)
Per interagire con il videogame il giocatore ha a disposizione un "game PAD" (Figura 7) ed é possibile collegare la console al televisore direttamente all'ingresso A/V o tramite la presa d'antenna con l'ausilio di un modulatore RF.

Figura 7: Il game PAD della console NES
Grafica e suoni
La PPU ha una risoluzione di 256x240 pixel e può gestire fino ad un massimo di 56 colori diversi. La grafica é basata su un meccanismo a "piastrelle" grafiche o "character patterns", meglio note in inglese come tile (continueremo a chiamarle così nel resto dell'articolo) delle dimensioni di 8x8 pixel che possono contenere un grafico composto al massimo da 4 colori diversi uno dei quali coincidente con il colore dello sfondo in maniera da gestire facilmente la trasparenza. La PPU é in grado di memorizzare contemporaneamente fino ad un massimo di 512 tile. Il sistema grafico é inoltre capace di gestire fino a 64 "sprite" delle dimensioni 8x8 o 8x16 pixel. Gli sprite, per chi non lo sapesse, sono le componenti dinamiche dei video game, la loro posizione sullo schermo é gestita da un apposito buffer di memoria che si distingue da quello utilizzato per la grafica statica. Inoltre, la PPU é in grado di lavorare su un sistema di mappe scorrevoli complessivamente composte da un totale di 32x60 (o 64x30) tile, quest'ultima funzionalità é particolarmente utile per lo sviluppo di videogiochi in cui lo sfondo di ambientazione scorre, ad esempio, orizzontalmente come in Super Mario Bros.
I grafici elementari ovvero le tile sono memorizzate in una apposita tabella, la "Pattern Table" che é codificata all'interno della CHR ROM (alcune volte RAM) presente nella cartridge. La Tabella in questione (Figura 8) può contenere fino a 256 tile.

Figura 8: Esempio di Pattern Table (CHR)
Ogni tile memorizzata é identificata da un byte che a tutti gli effetti rappresenta la posizione all'interno della pattern table.
La PPU tramite la CPU e il programma codificato nella cartridge, utilizzando la pattern table, popolano quello che viene definito il "background layer", in pratica lo sfondo del gioco. Questo "layer" prende il nome di "nametable", la PPU può tenere in memoria contemporaneamente due nametable ma ha capienza di indirizzi per altre due (Figura 9). La possibilità di indirizzare ulteriori due nametable può essere sfruttata rendendo disponibile RAM aggiuntiva nella cartridge.
CPU e PPU interagiscono tramite appositi registri mappati in memoria, quindi la scrittura di determinate sequenze di byte da parte della CPU in questi registri determina l'attivazione o la disattivazione di determinate funzionalità della PPU.

Figura 9: Mappatura della memoria gestita dalla PPU
Per quanto riguarda gli effetti sonori, l'Audio Processing Unit (APU) é un dispositivo capace di produrre diverse forme d'onda su 5 canali indipendenti, in particolare:
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2860 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
