SlideShare une entreprise Scribd logo
1  sur  27
Télécharger pour lire hors ligne
8 bit e 4 toni di grigio: sviluppare
giochi per Gameboy
Giovanni Simotti
info@haruneko.com - Haruneko Entertainment
Giovanni Simotti info@haruneko.com
Il Gameboy
● 1989/1999 - 10 anni
● quasi 120 milioni di console
vendute
● oltre 800 giochi disponibili
● 9.0 x 14.8 x 3.2 cm
● 300 grammi
● 10-15 ore di autonomia
– (4x batterie AA)
Giovanni Simotti info@haruneko.com
Hardware
● Caratteristiche
● CPU 8-bit SHARP LR35902 @ 4.19 MHz
● 8KB di RAM
● 8KB di VideoRAM
● 32KB... 4MB di ROM (cartuccia)
● schermo monocromatico 2.6” 160x144 (4 toni di
grigio/verde)
● Hardware molto semplice ma ben progettato
● C'è tutto ciò che serve
Giovanni Simotti info@haruneko.com
La CPU e la MEMORIA
● CPU: esegue il programma in linguaggio
macchina e comanda l'hardware dedicato
● MEMORIA: contiene il programma e i dati
letti/scritti dalla cpu
– è organizzata in celle grandi 1 byte
– ogni cella risiede in un certo indirizzo di memoria
● Per accedere all'hardware dedicato:
– Memory mapped I/O: alcuni indirizzi di memoria non
accedono a memoria RAM/ROM, bensì ai chip
Video / chip Audio / ecc...
Giovanni Simotti info@haruneko.com
La CPU: dettaglio
● SHARP LR35902
– Z80 con qualche differenza
– approccio simile a Intel 8080
● Accesso alla memoria dura 2 cicli di clock, ogni
istruzione dura un multiplo di 4 cicli di clock
– 4mhz = al più 1 milione di istruzioni al secondo
– a volte si indica la durata delle istruzioni in
"cicli macchina" = "cicli di clock" / 4
● tabella Opcode: documento che elenca le istruzioni
supportate dalla CPU e quanti cicli di clock durano
Giovanni Simotti info@haruneko.com
La CPU: i registri
● Program Counter (PC)
– Indirizzo dell'istruzione attualmente in esecuzione
● Stack Pointer (SP)
– Indirizzo attualmente usato nell'area stack
● Accumulatore (A)
– Usato nelle operazioni aritmetico/logiche
● 6 registri 8bit general purpose (B,C,D,E,H,L)
– Usabili anche in coppia (BC, DE, HL) (16 bit)
– 6502 (c64, NES, ….) ha solo 2 registri general purpose
Giovanni Simotti info@haruneko.com
Grafica: Mappe
● Mappa: un'immagine grande 256x256 pixel e
realizzata usando dei blocchi ("tile") 8x8
● 32x32 = 1024 tile per mappa = 1024 byte
● 192 tile possibili (8000-97FF)
Giovanni Simotti info@haruneko.com
Grafica: Mappe (continua)
● Due mappe: Background e Window
– Window è sempre mostrata sopra alla mappa
background
– ogni mappa può essere disabilitata (FF40)
– i 1024 tile che compongono una mappa sono
indicati in (9800-9BFF) o (9C00-9FFF)
● Per il posizionamento:
– (FF42) e (FF43) per x,y della mappa Background
– (FF4A) e (FF4B) per x,y della mappa Window
Giovanni Simotti info@haruneko.com
Grafica: Mappe (continua)
● Formato dei tile:
– Ogni pixel può avere 4 colori
● 2 bit per pixel
– 16 byte per ogni tile 8x8
– Occorrono 2 byte per linea: il
primo byte contiene tutti i bit
meno significativi dei pixel di
quella linea, il secondo byte
contiene tutti i bit più significativi
– Ci sono dei tool che semplificano
la vita
Giovanni Simotti info@haruneko.com
Grafica: Sprite (OAM)
● Sono immagini grafiche con pixel trasparenti
– stampati sopra alle mappe
– max 40 sprite a schermo
– 8x8 oppure 8x16 pixel
– 3 colori + 1 trasparente
– sfruttano gli stessi tile usati dalle mappe (8000-8FFF)
– max 10 per linea
● 4 byte per ogni sprite (FE00-FE9F):
● Pos Y: posizione Y a schermo -16
● Pos X: posizione X a schermo -8
● Pattern number: indica il tile da usare
● Flag: mirror x, mirror y, ecc...
Giovanni Simotti info@haruneko.com
Grafica: Palette
● Non specifico direttamente i colori dei pixel: è
usata invece una tabella di lookup chiamata
Palette
– Se ad esempio per un pixel ho il colore “2”:
visualizzo il secondo colore specificato nella palette
utilizzata
● 1 palette da 4 colori per le mappe (FF47)
● 2 palette da 3 colori per gli sprite (FF48 - FF49)
● utili per i "fade": cambio 3 byte anzichè i bit di
tutti i tile in memoria (fino a 384 byte!)
Giovanni Simotti info@haruneko.com
Grafica: Timing
● Lo schermo non è disegnato tutto nello stesso
momento: è disegnato dall'alto verso il basso,
riga per riga
● per ogni riga: 456 cicli di clock
– circa 201..207 cicli “pausa” di HBlank
● Dopo l'ultima riga: 4560 cicli “pausa” di Vblank
● 70224 cicli per ogni frame
– il refresh video è 59.73hz
Giovanni Simotti info@haruneko.com
Grafica: Timing (continua)
● La memoria OAM e (in parte) la Video RAM
sono scrivibili solo durante il VBlank e l'HBlank!
– Il registro STAT (FF41h) ci indica quando possiamo
scrivere la memoria OAM (FE00-FE9F) e quella
Video RAM (usata per tile e mappe)
● Effetti raster
– Posso spostare gli sprite o una mappa durante
l'HBlank!
● Più di 40 sprite
● Tile "nuovi"
Giovanni Simotti info@haruneko.com
Grafica: Timing (continua)
● Durante l'HBlank di ogni riga, sposto la mappa
e cambio il colore della palette della mappa
– Poco più di 200 cicli di clock per l'HBlank
Giovanni Simotti info@haruneko.com
Le cartucce ROM
● Contengono tutto il gioco: grafica, audio e codice
sorgente compilato/assemblato
– La RAM di sistema tipicamente contiene solo variabili,
ecc...
● La memoria ROM della cartuccia ed eventuali
altre cose in essa contenute sono accedibili
tramite gli indirizzi (0000-7FFF) e (A000-BFFF)
– non tutto ciò che è contenuto nello spazio degli
indirizzi è "dentro" alla console
– ROM: le scritture non sono consentite, tranne in
alcuni casi (bank switching o memoria RAM extra)
Giovanni Simotti info@haruneko.com
Memory Bank Controller (MBC)
● Chip della cartuccia che permette di effettuare il Bank Switching,
ovvero selezionare quale porzione (detta "banco") della ROM della
cartuccia deve essere mostrata negli indirizzi (4000-7FFF)
● la porzione di memoria 0000-3FFF è sempre fissa al primo banco
della ROM
● ROM più grandi di 32KB: max 256 banchi per un totale di max
4MB!
● per la selezione del banco N basta scrivere il valore N in un
qualsiasi indirizzo compreso tra 2000-3FFF
● Non solo ROM nella cartuccia:
● RAM extra, generalmente con batteria tampone per i salvataggi
● Timer persistente secondi/minuti/ore/giorni
● altro
Giovanni Simotti info@haruneko.com
I salvataggi
● Solo su cartucce con MBC
● Funzionamento:
– attiviamo la External RAM scrivendo 0x0A in una
locazione tra 0000-1FFF
– scriviamo il save (A000-A7FF oppure A000-BFFF a
seconda di quanta RAM ha la cartuccia, 2K...8K)
– disattiviamo la External RAM scrivendo 0x00 in una
locazione tra 0000-1FFF
● Molto semplice!
Giovanni Simotti info@haruneko.com
L'header delle cartucce
● Contenuto nella cartuccia in (0100-014F):
● (0100-0103): è la prima locazione eseguita dalla CPU
dopo la visualizzazione del logo Nintendo. Tipicamente è
un'istruzione di salto all'indirizzo (0150)
● (0104-0133): grafica del logo Nintendo (deve essere una
sequenza precisa di byte, altrimenti il Gameboy si blocca)
● …
● (0147): tipo di MBC utilizzato + eventuale hardware extra
(ram extra per i salvataggi, rumble pack, ecc...)
● (0148): indica la capienza della cartuccia (min 32KB, max
4MB)
● ...
Giovanni Simotti info@haruneko.com
La mappa di memoria
0000 3FFF 16KB ROM Bank 00 (cartuccia)
4000 7FFF 16KB ROM Bank 01..NN (cartuccia)
8000 9FFF 8KB Video RAM (VRAM)
A000 BFFF [8KB External RAM Bank 01..04] (cartuccia)
C000 DFFF 8KB Work RAM (WRAM)
E000 FDFF Mirror di C000-DDFF (ECHO)
FE00 FE9F Sprite Attribute Table (OAM)
FEA0 FEFF riservato
FF00 FF7F Porte di Input / Output (sonoro, ecc...)
FF80 FFFE High RAM (HRAM - usata durante i
trasferimenti DMA per gli sprite)
FFFF FFFF Interrupt Enable Register
Giovanni Simotti info@haruneko.com
Sonoro
● 4 Canali:
● onda quadra + spostamento in frequenza (FF10-FF14)
● onda quadra (FF16-FF19)
● campione audio (FF1A-FF1E) (Wave RAM: FF30-FF3F, 32
campioni 4 bit)
● rumore (FF20-FF23)
● Più un canale Vin per eventuale audio generato
nella cartuccia
● Il canale 3 in teoria può suonare qualcosa di
campionato e "lungo" con qualità 8khz/4bit
● Ma non restano cicli di clock per fare altro
Giovanni Simotti info@haruneko.com
Per sviluppare
● Emulatore: NO$GMB
– Memory viewer, Breakpoint, Watch, BG Map viewer,
Tile viewer, OAM viewer, Palette viewer, I/O viewer,
ecc..
– L'ultima colonna del disassemblato indica (in cicli
macchina) la durata dell'istruzione!
● Consigliato l'Assembler (RGBDS)
● Buoni risultati anche con C + assembler
(GBDK)
Giovanni Simotti info@haruneko.com
Per sviluppare (continua)
● Ogni istruzione C viene compilata, ovvero convertita
in un certo numero di istruzioni in linguaggio
macchina
– attenzione al timing! Poco tempo per un frame, molto
poco per un vblank, pochissimo per un hblank!
● controllare il codice assemblato (file .lst)
– attenzione ai sizeof(type):
● sizeof(int*) == 2
● sizeof(char) == 1
● sizeof(int) == 2
● sizeof(long) == 4
Giovanni Simotti info@haruneko.com
"Hello World" GBDK
Giovanni Simotti info@haruneko.com
"Hello World" GBDK (continua)
● Si poteva fare meglio in ASM (o in maniera più accorta in C):
– le righe 178...181 non servono (36 cicli di clock sprecati!)
● Analizzando il file .lst, la riga "(*p)++;" diventa
10 comandi ASM
Giovanni Simotti info@haruneko.com
Per testare sull'hardware
● Cartucce Flash
– molte sono troppo vecchie
● driver per OS vecchi
● interfaccia seriale o parallela
– "recenti":
● drag'n'derp cartridge
● ems 64 mb game boy smart card
● DIY:
– http://www.powerofasm.fr.st/gbkit/
– http://www.reinerziegler.de/readplus.htm#Home
%20made%20carts
Giovanni Simotti info@haruneko.com
Links
● http://nocash.emubase.de/pandocs.htm
● http://www.devrs.com/gb/
● http://gameboy.mongenel.com/asmschool.html
● http://marc.rawer.de/Gameboy/
● http://gameboy.mongenel.com/dmg/asmmemmap.html
● http://emu-docs.org/Game%20Boy/gb_sound.txt
● http://cratel.wichita.edu/cratel/ECE238Spr08/tutorials/GameBoyAudioSamples
● C:
● http://gbdk.sourceforge.net
● http://www.loirak.com/gameboy/gbprog.php
● Riassunto OpCode CPU:
● http://www.pcedev.net/GBZ80/GBCribSheet000129.pdf
● http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html
● Emulatore Gameboy scritto in Javascript (con tutorial):
● http://imrannazar.com/GameBoy-Emulation-in-JavaScript
Giovanni Simotti info@haruneko.com
Q&A
Q&A

Contenu connexe

Similaire à 8 bit e 4 toni di grigio: sviluppare giochi per Gameboy by Giovanni Simotti

Il Personal Computer
Il Personal ComputerIl Personal Computer
Il Personal Computerbity1988
 
Il Personal Computer
Il Personal ComputerIl Personal Computer
Il Personal Computerbity1988
 
Gruppo Easycomm2007
Gruppo Easycomm2007Gruppo Easycomm2007
Gruppo Easycomm2007helowen
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosiofirenze-gtug
 
Vshr 2162 p
Vshr 2162 pVshr 2162 p
Vshr 2162 pGpsLazio
 
Vshr 2162 p
Vshr 2162 pVshr 2162 p
Vshr 2162 pGpsLazio
 
Introduzione all’informatica 2011
Introduzione all’informatica 2011Introduzione all’informatica 2011
Introduzione all’informatica 2011donmimi
 
Introduzione al Sistema S6L
Introduzione al Sistema S6LIntroduzione al Sistema S6L
Introduzione al Sistema S6LSenio Corbini
 
Vshr 8080 p-8082p-ok
Vshr 8080 p-8082p-okVshr 8080 p-8082p-ok
Vshr 8080 p-8082p-okGpsLazio
 
Vshr 8080 p-8082p-ok
Vshr 8080 p-8082p-okVshr 8080 p-8082p-ok
Vshr 8080 p-8082p-okGpsLazio
 
Vudvr16 cc
Vudvr16 ccVudvr16 cc
Vudvr16 ccGpsLazio
 
Vshr 2160 p
Vshr 2160 pVshr 2160 p
Vshr 2160 pGpsLazio
 
Vshr 2160 p
Vshr 2160 pVshr 2160 p
Vshr 2160 pGpsLazio
 

Similaire à 8 bit e 4 toni di grigio: sviluppare giochi per Gameboy by Giovanni Simotti (20)

Scheda video word
Scheda video wordScheda video word
Scheda video word
 
Il Personal Computer
Il Personal ComputerIl Personal Computer
Il Personal Computer
 
Il Personal Computer
Il Personal ComputerIl Personal Computer
Il Personal Computer
 
E1 Memorie
E1 MemorieE1 Memorie
E1 Memorie
 
Cell Programming 1
Cell Programming 1Cell Programming 1
Cell Programming 1
 
Gruppo Easycomm2007
Gruppo Easycomm2007Gruppo Easycomm2007
Gruppo Easycomm2007
 
Intro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'AmbrosioIntro BeagleBone Black - Massimiliano D'Ambrosio
Intro BeagleBone Black - Massimiliano D'Ambrosio
 
Raspy Fi: Open source never sounded so good (by Michelangelo Guarise)
Raspy Fi: Open source never sounded so good (by Michelangelo Guarise)Raspy Fi: Open source never sounded so good (by Michelangelo Guarise)
Raspy Fi: Open source never sounded so good (by Michelangelo Guarise)
 
Vshr 2162 p
Vshr 2162 pVshr 2162 p
Vshr 2162 p
 
Vshr 2162 p
Vshr 2162 pVshr 2162 p
Vshr 2162 p
 
Introduzione all’informatica 2011
Introduzione all’informatica 2011Introduzione all’informatica 2011
Introduzione all’informatica 2011
 
Configurazione pc
Configurazione pcConfigurazione pc
Configurazione pc
 
Il pic 16 f84a
Il pic 16 f84aIl pic 16 f84a
Il pic 16 f84a
 
Introduzione al Sistema S6L
Introduzione al Sistema S6LIntroduzione al Sistema S6L
Introduzione al Sistema S6L
 
Vshr 8080 p-8082p-ok
Vshr 8080 p-8082p-okVshr 8080 p-8082p-ok
Vshr 8080 p-8082p-ok
 
Vshr 8080 p-8082p-ok
Vshr 8080 p-8082p-okVshr 8080 p-8082p-ok
Vshr 8080 p-8082p-ok
 
Gpu
GpuGpu
Gpu
 
Vudvr16 cc
Vudvr16 ccVudvr16 cc
Vudvr16 cc
 
Vshr 2160 p
Vshr 2160 pVshr 2160 p
Vshr 2160 p
 
Vshr 2160 p
Vshr 2160 pVshr 2160 p
Vshr 2160 p
 

Plus de Codemotion

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Codemotion
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyCodemotion
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserCodemotion
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Codemotion
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Codemotion
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Codemotion
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 - Codemotion
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Codemotion
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Codemotion
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Codemotion
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Codemotion
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Codemotion
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Codemotion
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Codemotion
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...Codemotion
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Codemotion
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Codemotion
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Codemotion
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Codemotion
 
Mike Kotsur - What can philosophy teach us about programming - Codemotion Ams...
Mike Kotsur - What can philosophy teach us about programming - Codemotion Ams...Mike Kotsur - What can philosophy teach us about programming - Codemotion Ams...
Mike Kotsur - What can philosophy teach us about programming - Codemotion Ams...Codemotion
 

Plus de Codemotion (20)

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
 
Mike Kotsur - What can philosophy teach us about programming - Codemotion Ams...
Mike Kotsur - What can philosophy teach us about programming - Codemotion Ams...Mike Kotsur - What can philosophy teach us about programming - Codemotion Ams...
Mike Kotsur - What can philosophy teach us about programming - Codemotion Ams...
 

Dernier

Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Associazione Digital Days
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Associazione Digital Days
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Associazione Digital Days
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Associazione Digital Days
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Associazione Digital Days
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Associazione Digital Days
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoQuotidiano Piemontese
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Associazione Digital Days
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Associazione Digital Days
 

Dernier (9)

Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
Gabriele Mittica, CEO @Corley Cloud – “Come creare un’azienda “nativa in clou...
 
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
Federico Bottino, Lead Venture Builder – “Riflessioni sull’Innovazione: La Cu...
 
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
Daniele Lunassi, CEO & Head of Design @Eye Studios – “Creare prodotti e servi...
 
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
Alessandro Nasi, COO @Djungle Studio – “Cosa delegheresti alla copia di te st...
 
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
Alessio Mazzotti, Aaron Brancotti; Writer, Screenwriter, Director, UX, Autore...
 
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
Mael Chiabrera, Software Developer; Viola Bongini, Digital Experience Designe...
 
Programma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 TorinoProgramma Biennale Tecnologia 2024 Torino
Programma Biennale Tecnologia 2024 Torino
 
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
Edoardo Di Pietro – “Virtual Influencer vs Umano: Rubiamo il lavoro all’AI”
 
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
Luigi Di Carlo, CEO & Founder @Evometrika srl – “Ruolo della computer vision ...
 

8 bit e 4 toni di grigio: sviluppare giochi per Gameboy by Giovanni Simotti

  • 1. 8 bit e 4 toni di grigio: sviluppare giochi per Gameboy Giovanni Simotti info@haruneko.com - Haruneko Entertainment
  • 2. Giovanni Simotti info@haruneko.com Il Gameboy ● 1989/1999 - 10 anni ● quasi 120 milioni di console vendute ● oltre 800 giochi disponibili ● 9.0 x 14.8 x 3.2 cm ● 300 grammi ● 10-15 ore di autonomia – (4x batterie AA)
  • 3. Giovanni Simotti info@haruneko.com Hardware ● Caratteristiche ● CPU 8-bit SHARP LR35902 @ 4.19 MHz ● 8KB di RAM ● 8KB di VideoRAM ● 32KB... 4MB di ROM (cartuccia) ● schermo monocromatico 2.6” 160x144 (4 toni di grigio/verde) ● Hardware molto semplice ma ben progettato ● C'è tutto ciò che serve
  • 4. Giovanni Simotti info@haruneko.com La CPU e la MEMORIA ● CPU: esegue il programma in linguaggio macchina e comanda l'hardware dedicato ● MEMORIA: contiene il programma e i dati letti/scritti dalla cpu – è organizzata in celle grandi 1 byte – ogni cella risiede in un certo indirizzo di memoria ● Per accedere all'hardware dedicato: – Memory mapped I/O: alcuni indirizzi di memoria non accedono a memoria RAM/ROM, bensì ai chip Video / chip Audio / ecc...
  • 5. Giovanni Simotti info@haruneko.com La CPU: dettaglio ● SHARP LR35902 – Z80 con qualche differenza – approccio simile a Intel 8080 ● Accesso alla memoria dura 2 cicli di clock, ogni istruzione dura un multiplo di 4 cicli di clock – 4mhz = al più 1 milione di istruzioni al secondo – a volte si indica la durata delle istruzioni in "cicli macchina" = "cicli di clock" / 4 ● tabella Opcode: documento che elenca le istruzioni supportate dalla CPU e quanti cicli di clock durano
  • 6. Giovanni Simotti info@haruneko.com La CPU: i registri ● Program Counter (PC) – Indirizzo dell'istruzione attualmente in esecuzione ● Stack Pointer (SP) – Indirizzo attualmente usato nell'area stack ● Accumulatore (A) – Usato nelle operazioni aritmetico/logiche ● 6 registri 8bit general purpose (B,C,D,E,H,L) – Usabili anche in coppia (BC, DE, HL) (16 bit) – 6502 (c64, NES, ….) ha solo 2 registri general purpose
  • 7. Giovanni Simotti info@haruneko.com Grafica: Mappe ● Mappa: un'immagine grande 256x256 pixel e realizzata usando dei blocchi ("tile") 8x8 ● 32x32 = 1024 tile per mappa = 1024 byte ● 192 tile possibili (8000-97FF)
  • 8. Giovanni Simotti info@haruneko.com Grafica: Mappe (continua) ● Due mappe: Background e Window – Window è sempre mostrata sopra alla mappa background – ogni mappa può essere disabilitata (FF40) – i 1024 tile che compongono una mappa sono indicati in (9800-9BFF) o (9C00-9FFF) ● Per il posizionamento: – (FF42) e (FF43) per x,y della mappa Background – (FF4A) e (FF4B) per x,y della mappa Window
  • 9. Giovanni Simotti info@haruneko.com Grafica: Mappe (continua) ● Formato dei tile: – Ogni pixel può avere 4 colori ● 2 bit per pixel – 16 byte per ogni tile 8x8 – Occorrono 2 byte per linea: il primo byte contiene tutti i bit meno significativi dei pixel di quella linea, il secondo byte contiene tutti i bit più significativi – Ci sono dei tool che semplificano la vita
  • 10. Giovanni Simotti info@haruneko.com Grafica: Sprite (OAM) ● Sono immagini grafiche con pixel trasparenti – stampati sopra alle mappe – max 40 sprite a schermo – 8x8 oppure 8x16 pixel – 3 colori + 1 trasparente – sfruttano gli stessi tile usati dalle mappe (8000-8FFF) – max 10 per linea ● 4 byte per ogni sprite (FE00-FE9F): ● Pos Y: posizione Y a schermo -16 ● Pos X: posizione X a schermo -8 ● Pattern number: indica il tile da usare ● Flag: mirror x, mirror y, ecc...
  • 11. Giovanni Simotti info@haruneko.com Grafica: Palette ● Non specifico direttamente i colori dei pixel: è usata invece una tabella di lookup chiamata Palette – Se ad esempio per un pixel ho il colore “2”: visualizzo il secondo colore specificato nella palette utilizzata ● 1 palette da 4 colori per le mappe (FF47) ● 2 palette da 3 colori per gli sprite (FF48 - FF49) ● utili per i "fade": cambio 3 byte anzichè i bit di tutti i tile in memoria (fino a 384 byte!)
  • 12. Giovanni Simotti info@haruneko.com Grafica: Timing ● Lo schermo non è disegnato tutto nello stesso momento: è disegnato dall'alto verso il basso, riga per riga ● per ogni riga: 456 cicli di clock – circa 201..207 cicli “pausa” di HBlank ● Dopo l'ultima riga: 4560 cicli “pausa” di Vblank ● 70224 cicli per ogni frame – il refresh video è 59.73hz
  • 13. Giovanni Simotti info@haruneko.com Grafica: Timing (continua) ● La memoria OAM e (in parte) la Video RAM sono scrivibili solo durante il VBlank e l'HBlank! – Il registro STAT (FF41h) ci indica quando possiamo scrivere la memoria OAM (FE00-FE9F) e quella Video RAM (usata per tile e mappe) ● Effetti raster – Posso spostare gli sprite o una mappa durante l'HBlank! ● Più di 40 sprite ● Tile "nuovi"
  • 14. Giovanni Simotti info@haruneko.com Grafica: Timing (continua) ● Durante l'HBlank di ogni riga, sposto la mappa e cambio il colore della palette della mappa – Poco più di 200 cicli di clock per l'HBlank
  • 15. Giovanni Simotti info@haruneko.com Le cartucce ROM ● Contengono tutto il gioco: grafica, audio e codice sorgente compilato/assemblato – La RAM di sistema tipicamente contiene solo variabili, ecc... ● La memoria ROM della cartuccia ed eventuali altre cose in essa contenute sono accedibili tramite gli indirizzi (0000-7FFF) e (A000-BFFF) – non tutto ciò che è contenuto nello spazio degli indirizzi è "dentro" alla console – ROM: le scritture non sono consentite, tranne in alcuni casi (bank switching o memoria RAM extra)
  • 16. Giovanni Simotti info@haruneko.com Memory Bank Controller (MBC) ● Chip della cartuccia che permette di effettuare il Bank Switching, ovvero selezionare quale porzione (detta "banco") della ROM della cartuccia deve essere mostrata negli indirizzi (4000-7FFF) ● la porzione di memoria 0000-3FFF è sempre fissa al primo banco della ROM ● ROM più grandi di 32KB: max 256 banchi per un totale di max 4MB! ● per la selezione del banco N basta scrivere il valore N in un qualsiasi indirizzo compreso tra 2000-3FFF ● Non solo ROM nella cartuccia: ● RAM extra, generalmente con batteria tampone per i salvataggi ● Timer persistente secondi/minuti/ore/giorni ● altro
  • 17. Giovanni Simotti info@haruneko.com I salvataggi ● Solo su cartucce con MBC ● Funzionamento: – attiviamo la External RAM scrivendo 0x0A in una locazione tra 0000-1FFF – scriviamo il save (A000-A7FF oppure A000-BFFF a seconda di quanta RAM ha la cartuccia, 2K...8K) – disattiviamo la External RAM scrivendo 0x00 in una locazione tra 0000-1FFF ● Molto semplice!
  • 18. Giovanni Simotti info@haruneko.com L'header delle cartucce ● Contenuto nella cartuccia in (0100-014F): ● (0100-0103): è la prima locazione eseguita dalla CPU dopo la visualizzazione del logo Nintendo. Tipicamente è un'istruzione di salto all'indirizzo (0150) ● (0104-0133): grafica del logo Nintendo (deve essere una sequenza precisa di byte, altrimenti il Gameboy si blocca) ● … ● (0147): tipo di MBC utilizzato + eventuale hardware extra (ram extra per i salvataggi, rumble pack, ecc...) ● (0148): indica la capienza della cartuccia (min 32KB, max 4MB) ● ...
  • 19. Giovanni Simotti info@haruneko.com La mappa di memoria 0000 3FFF 16KB ROM Bank 00 (cartuccia) 4000 7FFF 16KB ROM Bank 01..NN (cartuccia) 8000 9FFF 8KB Video RAM (VRAM) A000 BFFF [8KB External RAM Bank 01..04] (cartuccia) C000 DFFF 8KB Work RAM (WRAM) E000 FDFF Mirror di C000-DDFF (ECHO) FE00 FE9F Sprite Attribute Table (OAM) FEA0 FEFF riservato FF00 FF7F Porte di Input / Output (sonoro, ecc...) FF80 FFFE High RAM (HRAM - usata durante i trasferimenti DMA per gli sprite) FFFF FFFF Interrupt Enable Register
  • 20. Giovanni Simotti info@haruneko.com Sonoro ● 4 Canali: ● onda quadra + spostamento in frequenza (FF10-FF14) ● onda quadra (FF16-FF19) ● campione audio (FF1A-FF1E) (Wave RAM: FF30-FF3F, 32 campioni 4 bit) ● rumore (FF20-FF23) ● Più un canale Vin per eventuale audio generato nella cartuccia ● Il canale 3 in teoria può suonare qualcosa di campionato e "lungo" con qualità 8khz/4bit ● Ma non restano cicli di clock per fare altro
  • 21. Giovanni Simotti info@haruneko.com Per sviluppare ● Emulatore: NO$GMB – Memory viewer, Breakpoint, Watch, BG Map viewer, Tile viewer, OAM viewer, Palette viewer, I/O viewer, ecc.. – L'ultima colonna del disassemblato indica (in cicli macchina) la durata dell'istruzione! ● Consigliato l'Assembler (RGBDS) ● Buoni risultati anche con C + assembler (GBDK)
  • 22. Giovanni Simotti info@haruneko.com Per sviluppare (continua) ● Ogni istruzione C viene compilata, ovvero convertita in un certo numero di istruzioni in linguaggio macchina – attenzione al timing! Poco tempo per un frame, molto poco per un vblank, pochissimo per un hblank! ● controllare il codice assemblato (file .lst) – attenzione ai sizeof(type): ● sizeof(int*) == 2 ● sizeof(char) == 1 ● sizeof(int) == 2 ● sizeof(long) == 4
  • 24. Giovanni Simotti info@haruneko.com "Hello World" GBDK (continua) ● Si poteva fare meglio in ASM (o in maniera più accorta in C): – le righe 178...181 non servono (36 cicli di clock sprecati!) ● Analizzando il file .lst, la riga "(*p)++;" diventa 10 comandi ASM
  • 25. Giovanni Simotti info@haruneko.com Per testare sull'hardware ● Cartucce Flash – molte sono troppo vecchie ● driver per OS vecchi ● interfaccia seriale o parallela – "recenti": ● drag'n'derp cartridge ● ems 64 mb game boy smart card ● DIY: – http://www.powerofasm.fr.st/gbkit/ – http://www.reinerziegler.de/readplus.htm#Home %20made%20carts
  • 26. Giovanni Simotti info@haruneko.com Links ● http://nocash.emubase.de/pandocs.htm ● http://www.devrs.com/gb/ ● http://gameboy.mongenel.com/asmschool.html ● http://marc.rawer.de/Gameboy/ ● http://gameboy.mongenel.com/dmg/asmmemmap.html ● http://emu-docs.org/Game%20Boy/gb_sound.txt ● http://cratel.wichita.edu/cratel/ECE238Spr08/tutorials/GameBoyAudioSamples ● C: ● http://gbdk.sourceforge.net ● http://www.loirak.com/gameboy/gbprog.php ● Riassunto OpCode CPU: ● http://www.pcedev.net/GBZ80/GBCribSheet000129.pdf ● http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html ● Emulatore Gameboy scritto in Javascript (con tutorial): ● http://imrannazar.com/GameBoy-Emulation-in-JavaScript