www.studio-zizzari.com

 

 

 

Un piccolo esercizio creativo: reverse engineering di un videogioco anni '80.

di Angelo Zizzari




Si chiama reverse engineering, ingegneria inversa. Che cos'è ?

Di solito nell'ingegneria si parte da un progetto di una soluzione tecnologica e si realizza un prodotto. Qui si fa il contrario, si ha un prodotto funzionante e si individua il progetto che ha permesso di realizzarlo.

Nel campo del software, il “prodotto” è un insieme di codici numerici contenuti all'interno di una memoria. Il “progetto” è il programma sorgente che tramite un compilatore permette di ottenere quei codici, detto anche programma eseguibile.

Prendiamo per esempio un videogioco classico anni '80 per Atari VCS 2600: Demon Attack.

Il gioco era memorizzato all'interno di una ROM di una cartuccia. Andando ad estrarre il contenuto si ottengono una serie di codici esadecimali come questi qui di seguito.




A partire da questi codici, tramite un ragionamento induttivo, si deve risalire al programma sorgente, e quindi agli algoritmi, che utilizzano le risorse della macchina e realizzano il prodotto.

Poi una volta compreso in dettaglio il funzionamento del programma si possono capire le scelte progettuali fatte dall'autore, impostare delle modifiche e proporre per esempio delle varianti, oppure imparare come si ottengono determinati risultati a partire da determinate specifiche di progetto.

In pratica, vedendo come altri hanno realizzato un gioco potete idearne e realizzarne di vostri.

Come si fa a risalire al programma sorgente ? E' molto complicato ed impegnativo.

Per chi fosse interessato, sul sito dell' Atari Age sono indicati ulteriori dettagli di programmazione. Mentre sul sito BJars sono contenute alcune ROM disassemblate.

Per prima cosa occorre conoscere bene la macchina ed il suo funzionamento. L'Atari VCS 2600 aveva un microprocessore della famiglia 6502, la stessa famiglia dell'Apple II e del Commodore 64.
Occorre quindi imparare il linguaggio Assembler del 6502, potendo associare così le istruzioni macchina ad alcuni dei codici esadecimali che operano sui registri e sulle locazioni di memoria.

Poi occorre conoscere in dettaglio le caratteristiche tecniche dell'hardware, dove sono “mappate” le locazioni che permettono di acquisire la lettura dei dispositivi esterni, come i joystick, e le locazioni che permettono di disegnare un oggetto sullo schermo video e cambiarne i colori.

Per inciso, da un punto di vista hardware l'Atari VCS 2600 era quanto di più cervellotico la mente umana potesse inventare. La quantità di componenti elettronici era stata ridotta al minimo per ragioni economiche, e tutte le funzioni normalmente svolte dall'hardware dovevano essere simulate dal software, avendo per giunta in tutto 128 bytes di memoria RAM.

Gli oggetti erano visualizzati sullo schermo utilizzando un “trucco”.

Un oggetto era disegnato dal raster, il pennello elettronico del televisore, e poi immediatamente cancellato e riposizionato su coordinate diverse, cambiandone anche la grafica, prima che passasse nuovamente il raster a disegnarlo di nuovo nella sua nuova versione.
Questo effetto, più veloce della frequenza dei 60 Hz di aggiornamento dello schermo del televisore, era percepito dall'occhio umano come la presenza di due o più oggetti simultanei, mentre era sempre lo stesso oggetto che era cancellato e ridisegnato in continuazione in posizioni diverse.

E' un po' come se il fantasma di Pac Man potesse spostarsi a velocità superiore a quella della luce e potesse comparire quindi in più posti simultaneamente (come nella teoria di Feynman dell'elettrone). L'osservatore percepirebbe quattro fantasmi diversi: Blinky, Inky, Pinky e Sue, mentre sarebbe sempre lo stesso Blinky che riuscirebbe a saltare qua e là prima che l'osservatore se ne accorga (era per questo che Pac Man dell'Atari "sfarfalleggiava" vistosamente)

Dunque, dicevamo, una volta imparate le caratteristiche hardware della macchina, si può usare un programma disassemblatore che cerca di riconoscere i codici, assegnando a ciascun byte o serie di byte un codice mnemonico che è associato ad una istruzione macchina del microprocessore 6502.




La serie di codici mnemonici tuttavia è poco significativa. Si pensi soltanto che l'assemblatore non potendo distinguere tra 'dati' ed 'istruzioni' presenterà molte sequenze con dei punti interrogativi.

Da questo punto in poi inizia una indagine ed un ragionamento approfondito degno dei migliori libri di Sherlock Holmes.

Comunque, indico qui soltanto una sequenza generale di passi, senza tediare con i dettagli delle dimostrazioni rigorose.

Il primo passo è quello di distinguere i dati dalle istruzioni. I dati rappresentano principalmente la grafica, il sonoro e le tabelle dei colori del gioco. Poi si individua la parte in cui la grafica è presentata sullo schermo e si associano rispettivi indirizzi e variabili ad ogni oggetto presentato sullo schermo. Dopo si decodifica come a ciscuna variabile sia associato un determinato stato degli oggetti, e si determinano le formule di transizione da uno stato ad un altro.

Il risultato che si ottiene è il codice disassemblato e commentato per il gioco Demon Attack degli anni '80.

Una volta compreso il programma sorgente è possibile modificarlo, per esempio creandone una versione con vite infinite, per poi compilare il tutto, ottenere un file binario e giocare utilizzando un emulatore, come ad esempio JStella per PC.

Buon divertimento !



(26 Febbraio 2016)

* * *

 

 

 

 



Un piccolo esercizio creativo: reverse engineering di un videogioco anni '80

di Angelo Zizzari



 

 
Ing. Angelo Zizzari
Piazzale Roberto Ardigo, 42
00142 Roma
ITALY

tel./fax.: +39 06 5405512
E-mail: info@studio-zizzari.com









© Copyright 2016    -    Studio Ing. Angelo Zizzari    -    P.IVA 09831351003    

Disclaimer