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

27
8 bit e 4 toni di grigio: sviluppare giochi per Gameboy Giovanni Simotti [email protected] - Haruneko Entertainment

description

Come sviluppare oggi giochi per Gameboy. Dettaglio dell’architettura della console e descrizione dell’assembler Z80. Grafica raster. Tile, scrolling e sprite. Il sonoro. Descrizione del Bank Switching e dei chip MBC. Come creare salvataggi nella SRAM. Provare il software sull’emulatore e sull’hardware fisico.

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

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

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

Giovanni Simotti

[email protected] - Haruneko Entertainment

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

Giovanni Simotti [email protected]

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)

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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...

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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)

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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...

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

Giovanni Simotti [email protected]

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!)

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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"

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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)

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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!

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

Giovanni Simotti [email protected]

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)● ...

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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)

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

"Hello World" GBDK

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

Giovanni Simotti [email protected]

"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

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

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

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

Giovanni Simotti [email protected]

Q&A

Q&A