Retrogaming: Nintendo NES, gli strumenti per la programmazione in linguaggio C

retrogaming

In questo articolo vedremo quali sono gli strumenti necessari per poter sviluppare dei semplici videogiochi utilizzando il linguaggio C. 

La programmazione dei videogiochi Nintendo NES

Premetto che non sono uno sviluppatore di videogiochi, mi sono avvicinato a questo genere di programmazione diverse volte durante la mia vita di sperimentatore, ma quasi sempre per curiosità, più che altro affascinato dalle diverse tecniche che nel tempo si sono evolute per sfruttare al massimo l'hardware (computer e/o console) di volta in volta disponibili sul mercato. Quanto descritto in questo articolo rappresenta solo un breve tutorial sulla programmazione della piattaforma in questione. Ci sono diverse tecniche avanzate che necessitano di più tempo e spazio, ma nell'ultimo paragrafo troverete alcune indicazioni su dove è possibile reperire altro materiale per successivi approfondimenti.

Tornando alla console Nintendo NES, chiariamo subito che stiamo parlando di un'architettura vecchia di decine di anni, la produzione della CPU 6502 è iniziata a metà degli anni 70 dello scorso secolo e si è conclusa con il tramonto degli home computer e delle console a 8 bit. All'epoca la scrittura dei programmi avveniva essenzialmente in linguaggio assembly, pur esistendo linguaggi di programmazione ad alto livello come il Fortran, il Pascal e anche il C, questi ultimi erano per lo più utilizzati in ambito accademico per la scrittura di codice sui grandi computer delle università. Le risorse hardware per cui si sviluppavano videogiochi erano molto limitate: RAM di 1 o 2K, velocità di clock delle CPU bassissime (1 o 2MHz), periferiche di memorizzazione estremamente lente, etc. In questo contesto la scrittura di programmi non poteva che essere fatta con un linguaggio capace di permettere di tenere costantemente sotto controllo le poche risorse hardware disponibili e quindi un linguaggio a basso livello appunto come l'assembly. Con il tempo, abbiamo visto evolversi non solo le architetture hardware con CPU sempre più potenti ma anche software con prodotti per la programmazione sempre più performanti ed efficaci, e soprattutto abbiamo visto svilupparsi una realtà che all'epoca della CPU 6502 ancora non esisteva, quella del WEB e dell'open source che ha permesso a tutti noi di avvalerci, senza limitazioni, di strumenti sviluppati dalle community di programmatori e appassionati del settore. Grazie a questo, nel prossimo paragrafo vedremo quali software utilizzare, in ambiente Windows, per realizzare semplici videogiochi.

Grafica e suoni

Un videogioco é sostanzialmente composto da effetti grafici e sonori, naturalmente opportunamente programmati dallo sviluppatore, quindi prima di occuparci del codice dedichiamo alcune righe a descrivere gli strumenti che ci saranno utili per creare tali effetti.

La PPU (Picture Processing Unit) ha il compito di gestire la visualizzazione degli elementi grafici presenti nella "pattern table" caricata in memoria, per la gestione di tale tabella si può far uso di: YY-CHR.

YY-CHR editor

Figura 1: YY-CHR editor

Si tratta di un editor (Figura 1) che permette di creare e/o modificare mappe grafiche composte da tile di 8x8 pixel per un totale di 256 tile. Il programma ha molte funzioni, ma per iniziare è sufficiente utilizzare quelle principali. In particolare, possiamo decidere di partire da una pattern table vuota, disegnando da zero le tile che verranno poi utilizzate, oppure aprirne una già realizzata modificandola in base alle vostre esigenze. Nel folder "CHR-ROM" viene visualizzata l'intera mappa, mentre a destra viene di volta in volta proposta una porzione che potrà essere modificata con gli strumenti che l'editor mette a disposizione (Figura 2).

Strumenti di editing delle tile

Figura 2: Strumenti di editing delle tile

Inoltre, sarà possibile selezionare nel folder palette (Figura 3), il set di colori da utilizzare per visualizzare le tile.

Selezione delle palette

Figura 3: Selezione delle palette

Si può prendere nota degli indentificativi dei colori in esadecimale (ad esempio 0F, 1C, 2B, 30), per poi utilizzarli in fase di programmazione per caricare il set di palette. La cosa da ricordare è che il primo colore della palette, nel nostro caso 0F, è quello utilizzato per lo sfondo.

Tramite il tasto Edit del campo "Pattern" è possibile visualizzare la disposizione delle tile e il relativo identificativo esadecimale (Figura 4).

Posizione delle tile nella pattern table

Figura 4: Posizione delle tile nella pattern table

Va ricordato che le tile rappresentanti lettere e numeri vanno posizionate tra il codice esadecimale 21 e 7E, con la sequenza che vedete in Figura 1, in questo modo si riproduce esattamente l'indirizzamento della famosa tabella ASCII che attribuisce in maniera univoca ad ogni carattere un identificativo numerico, semplificando la gestione delle stringhe quando andremo a programmare in linguaggio C. Terminata la lavorazione della tabella, il file può essere salvato con l'estensione ".chr", ad esempio "graphics.chr",  vedremo successivamente come sarà utilizzato per generare il file ".nes" contenente la ROM finale.

Passiamo ora agli effetti sonori, anche qui possiamo avvalerci di un software gratuito, FamiTracker (Figura 5) che permette di creare melodie e suoni di ogni genere da usare all'interno dei nostri videogame.

FamiTracker

Figura 5: FamiTracker

Sul web si trovano numerosi tutorial inerenti l'uso del programma, quindi non mi dilungherò sulla creazione di brani musicali o su come usare note e strumenti, vedremo invece come salvare ed esportare un file audio affinché possa poi essere utilizzato all'interno del nostro videogame.

A titolo d'esempio, ho creato un file audio "basicSFx.ftm" contenente due effetti audio rispettivamente "shot01" e "explo01" che verranno utilizzati nel prossimo articolo per lo sviluppo di una semplice versione di Pac-Man. Il primo passo è esportare il file nel formato NSF, un formato specifico per la piattaforma Nintendo NES (Figura 6).

FamiTracker, export to file NSF

Figura 6: FamiTracker, export to file NSF

Il passo successivo è convertire questo file NSF, in un formato dati importabile direttamente nella sezione "dati" di un file assembly, parleremo in maniera più approfondita di questa operazione più avanti nell'articolo. Per convertire il file NFS in formato dati assembly, occorre utilizzale un utility messa a punto da Shiru. 

Sviluppatore/programmatore di videogames e non solo, Shiru ha reso disponibili moltissime risorse software per la programmazione in linguaggio C sia per console che per altri computer a 8bit, compresa una intera libreria che vedremo più avanti. Nel caso specifico occorre scaricare il pacchetto FamiTone2 v1.15 ed usare il comando "nsf2data.exe" che troverete nella cartella "tools" una volta aperto il contenuto del file zip. Nello specifico la sintassi è la seguente :

nsf2data basicSFx.nsf -ca65

Verrà generato il file "basicSFx.s" contenente il codice assembly da utilizzare per la generazione del file contenente la ROM finale.

In sintesi:

  • Con il programma YY-CHR abbiamo creato la "Pattern Table" contenente i grafici da utilizzare nel videogame memorizzandola nel file "graphics.chr".

 

  • Con il programma FamiTracker abbiamo generato gli effetti audio esportandoli prima nel formato NSF e convertendo poi il file in formato dati assembly tramite il comando nsf2data, ottenendo così il file  "basicSFx.s".

Il compilatore CC65 e l'ambiente di lavoro

Siamo arrivati alla parte di programmazione. Scrivere un programma partendo da zero in assembly è cosa lunga e tediosa e oltre ad essere piuttosto complicata porta via tantissimo tempo nella fase di debug, e in generale di controllo del codice scritto.

Il linguaggio C è un ottimo compromesso, permette infatti di scrivere molto più velocemente e in maniera più intuitiva. La community, nel corso degli anni, ha  sviluppato e messo a disposizione del web un apposito compilatore C utilizzabile per la maggior parte dei vecchi home computer a 8 bit basati sulla CPU 6502:

Con questo compilatore è possibile scrivere programmi per il VIC20, il Commodore 64, l'Atari e molti altri, compresa la console Nintendo NES. Ma attenzione, il fatto che si semplifica la scrittura del codice può indurre a non prestare cura a come vengono usati i costrutti del C e magari ad abbondare con array e strutture pesanti o ad operazioni matematiche complesse, va sempre ricordato che si scrive codice per una CPU ad 8 bit, lenta e con poca RAM.

Per poter utilizzare il compilatore, in ambiente Windows, dovremmo scaricarlo dal link: https://sourceforge.net/projects/cc65/files/cc65-snapshot-win32.zip

e de-zipparlo in una directory del vostro pc, avendo poi l'accortezza di aggiungere alla variabile ambiente PATH del vostro sistema operativo il percorso "..\cc65\bin" dove sono presenti l'eseguibile del compilatore (cc65.exe) e gli altri strumenti che verranno utilizzati per generare il file contenente la ROM finale, ovvero l'assembler (ca65.exe) e il linker (ld65.exe).

Per organizzare al meglio l'ambiente dove sviluppare il codice del videogame è opportuno crearsi una directory con tutto il necessario come quella in Figura 7:

[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2472 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.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend