From 8c1aab93aa17fc6643de706f8e2f6bcaa01c232e Mon Sep 17 00:00:00 2001 From: Matteo Benedetto Date: Wed, 17 Jun 2026 15:23:58 +0200 Subject: [PATCH] Add Game Boy Hello World example with GBDK-2020 and PyBoy test --- gameboy-hello/Makefile | 10 +++++++ gameboy-hello/README.md | 63 ++++++++++++++++++++++++++++++++++++++++ gameboy-hello/hello.gb | Bin 0 -> 32768 bytes gameboy-hello/main.c | 9 ++++++ 4 files changed, 82 insertions(+) create mode 100644 gameboy-hello/Makefile create mode 100644 gameboy-hello/README.md create mode 100644 gameboy-hello/hello.gb create mode 100644 gameboy-hello/main.c diff --git a/gameboy-hello/Makefile b/gameboy-hello/Makefile new file mode 100644 index 0000000..e9d24cc --- /dev/null +++ b/gameboy-hello/Makefile @@ -0,0 +1,10 @@ +CC = /home/enne2/.local/gbdk/bin/lcc +CFLAGS = -Wl-yt1 -Wl-ya4 + +hello.gb: main.c + $(CC) $(CFLAGS) -o $@ $^ + +clean: + rm -f *.gb *.ihx *.cdb *.adb *.noi *.map *.lst *.sym *.rel + +.PHONY: clean diff --git a/gameboy-hello/README.md b/gameboy-hello/README.md new file mode 100644 index 0000000..dbc46a3 --- /dev/null +++ b/gameboy-hello/README.md @@ -0,0 +1,63 @@ +# Game Boy Hello World + +Questa sottocartella contiene un minimo esempio di "Hello World" per Game Boy originale, compilato con **GBDK-2020** in C. + +## Struttura + +- `main.c` — sorgente C. +- `Makefile` — regola per compilare con `lcc` (GBDK-2020). +- `hello.gb` — ROM Game Boy risultante (32 KB). + +## Requisiti + +GBDK-2020 e installato in `/home/enne2/.local/gbdk`. Se vuoi spostarlo altrove, aggiorna il `CC` nel `Makefile`. + +## Build + +```bash +cd gameboy-hello +make +``` + +## Test con emulatore + +### PyBoy (senza finestra, screenshot) + +```bash +python3 - <<'PY' +from pyboy import PyBoy +rom = 'hello.gb' +pyboy = PyBoy(rom, window='null') +for _ in range(60*5): + pyboy.tick() +pyboy.screen.image.save('/tmp/hello_gb.png') +pyboy.stop() +print('Screenshot salvato in /tmp/hello_gb.png') +PY +``` + +### PyBoy (con finestra SDL2) + +```bash +python3 - <<'PY' +from pyboy import PyBoy +pyboy = PyBoy('hello.gb', window='SDL2') +for _ in range(60*30): + pyboy.tick() +pyboy.stop() +PY +``` + +## Note + +- La ROM usa il logo Nintendo corretto e il checksum di header e valido. +- Il testo viene visualizzato con `printf` sulla console testuale del Game Boy. +- Il loop principale chiama `wait_vbl_done()` per sincronizzarsi con il VBlank. + +## Prossimi passi + +Da qui si puo partire per un vero gioco Game Boy (ad esempio Tetris), aggiungendo: +- gestione di input tramite `joypad()`; +- sprite OAM per i pezzi; +- tilemap per il campo di gioco; +- musica/effetti sonori con i 4 canali audio del Game Boy. diff --git a/gameboy-hello/hello.gb b/gameboy-hello/hello.gb new file mode 100644 index 0000000000000000000000000000000000000000..5a0c9c319f4ae4d7a29abe00083d2c9a4a9a2adf GIT binary patch literal 32768 zcmeH~dvFuS8NgR3=`7olEL&jC^6Snb!&G7ZqC|7u7mG-cX3;1y5gg)sXF zH!)h3?7a|-9oa`lkDL|148u~m>Rh#_E_A=c-|qSo|5^3A>}(gKZ-D15{uri+?_Q$o10tt+HF7D$**kPFA%{%mgovH61jv#Ro3O*r0izG z(V?j0tmp`->{jQd=vc*WpCVg^^?fQ?$baly$i*ru;x})&pDeFfxM=ZHl}lEvTvffg zh78Bm;_k9NYT^E}HnkXRIcm=izGA%k*!gDTJZ+g%+N*A!yxx1Y-h23KBn2XLiJU)EVU|Mfa=TuGiK4@^+WA+~w?0ZGo$egC`6yzOF{U zc|)OEK;r@J_Q6a8t#=IW)asYTLMpZoE;rJ8@8Dcb-3gQX14gy@zGx>KMeF2_!4LG4 zd&TFkcAkfBCrz+`CRi7FDw#9T*ea1r%&tI4wWoloyvyI3Vzxh-Q^yjak;#O7(!C|q zz0}uz#!85kHC7?$$dbgWkn(5quu&DjOBArx)jS|4tOdVg#)VHq}WaHs`kb_Z4I#k;-|5yuyELo$CbsFGo(x@zJW=KTBSx<}|&_>uTt>_9pd{Ix%CC5i@6V?EYW0 z{^r$PiM8XWWN$R`9B)((m^r=TvkV);u8~u+YXqi_ye)?(vv}(m^<#oDO2*CbO(nwi z|0^T?K9eDl{s=oZ{3W0|QdraeB?7Y+e<XC;GEuj}A7wVL z%*anj`jH_yIP$)%v}E*!gCm#akt=dEA&_Gwd_JFYw3s+&@}C#;|A`O5qPk#A00xCM zqP&rs?1SLE4=S#JA|YIsgMStEi@2=CcHs(b>lVes3F-z!DHr+{0!o_+lrUDZYYKib zxz}r_ZVX~(5M08v^k_f^A?o;JC8g6*W|iqvQBEr)QU(eN=@#8XVkT^r+;)@FVOCx= zO|Sc%FeEN9BPV4owINu^_aVIxgvIFTS*8t9RNTM+@PI-(Q_l z%?`|l51Aot^ptFrW;FTDoZDYRIxlX!bn#**;W(Q%&S0VwO$OdZYa37MD<>=Kp^M`J zU@%qOZXOz*v_$)eo&|e8nRxsy`}}?n;VS8T4rFUlWm|v*%$$d<@ep&-{AUAZGYR;5 zSSlCsz8*S0z*>t^V`A3DfbY84BEr3d``dVD^JORHgildlC_0x!QdPm3N5va~>){^riM&SpOW zD^PmK#8oH*1EgtB*VgqlD`~t?H2Yu|?4@LuI)^6MZ}V8e4nU-Z`hfy=Y1z?91_lPe z-~^TFRIR4t0u&#_S)xrVAyqVCmLZ**+(~Se&3Bi9kN_dF?9&vU8j0pZ>C${P0FXZm zTB?Tt13r*T+&yk6giyUy<4KM8!_Lth5TfmeMz?Rr%Ub@LmNSzy0Fnku?LmPBq5gn? zW)GH-G`CS;(7&g$Xg%x;548aE>2Mkctss8@pydy;mOs_cDWSkp`^U<`x^vc4RA8YE zjKCWz(}grdTGasm$j z)8fqQLYQ6yr^W2+LPTr5%M&;%?)|8LPwpSp!G!)RI+fkTW#u1+L&PRB`Mq%D!ZlF` z(<2q#$(#cX-N{jJhI4eeZ}mkQjL$|vRr#J_{s^((inbU{P+ z0p9)V$kIpwJX|sV?=-?6&u?=M^%?mq7CzJ$zCqxh2hkac&}YfLEGz#sPXELC zPJhF2FcLrlNB{{S0VIF~kN^@u0!RP}AOR$R1dsp{Kmter2_OL^fCP{L5 +#include + +void main(void) { + printf("Hello Game Boy!"); + while (1) { + wait_vbl_done(); + } +}