Gamebuino Classic games ported to SDL2, SDL3 and Playdate selectable in one convient menu

A native SDL3 port bringing 99 games from the Gamebuino Classic library (an Arduino-based handheld with an 84x48 Nokia 5110/PCD8544 monochrome display and 7 real digital buttons) behind one shared game-select menu, running as a plain desktop executable - no emulator required.
Two more ports also live in this same repo, alongside the primary SDL3
port in src/sdl3/, all three sharing one src/gameworld/ codebase (all
99 games, the menu, the shims):
src/sdl2/) - built by porting src/sdl3/’s own platform
files API-call-by-API-call, then verified functionally identical (every
behavioral constant, every input mapping table, every one of the 99
games).src/playdate/) - a genuinely different kind of port
(fixed 400x240 1-bit hardware, its own C SDK, no CLI/window/desktop
concept at all), so a from-scratch platform layer instead - a brand-new
Playdate-native menu (alphabetized, numbered, paginated, with a live
gameplay thumbnail + author caption for the selected game), manual
GAME_SCALE-based rendering (84x48 native display content scaled 4x,
336x192, to fit the real panel), real per-game frame-rate sync
(pd->display->setRefreshRate() tracks whatever rate the running game
actually requests, leveraging the real hardware’s own native 0-50fps
refresh-rate control instead of a fixed-tick accumulator), a real,
native LCDPattern-based checkerboard dither for GB_GRAY content
(kColorGrey, a genuine device-pixel-level dither via the Playdate SDK’s
own pattern-fill mechanism, not an approximation), and Gamebuino’s own
Button C - which has no physical Playdate equivalent - routed through a
real system-menu item instead of a face button. See CLAUDE.md’s own
“The Playdate port” section for the full design writeup.See CLAUDE.md’s “Directory layout / multi-port structure” section for
the full writeup on how this multi-port layout works, and for what a
future fourth port would need to add.
The game logic itself is already-ported, already-bug-fixed C, carried over
from the sibling
gamebuino_classic_vircon32
project by converting only the small amount of nonstandard Vircon32
C-dialect syntax it depended on back into standard C (array declaration
order, int[]-as-string → char*, bare struct Tag → typedef struct)
The shared gameworld/gamebuinoShim.c sound engine is a real port of the
actual tracker/pattern/track engine (notes, patterns, tracks, and
instrument envelopes/slide/arpeggio/tremolo commands), not just one-shot
tones - with one real, documented gap carried over from the sibling
project unchanged: there is no noise instrument. Real hardware drives
its speaker from a genuine pseudorandom noise generator for any
instrument step flagged as noise (e.g. playTick()); this port has no
noise waveform at all, so a noise-flagged step plays as a plain tone at
the same pitch/duration instead.
The platform layer itself - window/input/audio/rendering, the menu, the
CLI, and EEPROM persistence - is new, built directly against SDL3, reusing
infrastructure and technique from the same author’s Tinyjoypad_SDL
project where it fit: the CInput keyboard/gamepad abstraction (copied
verbatim, fully generic), the audio oscillator shape, the menu’s own real
Vircon32 BIOS-font rendering (biosFont.h, copied byte-for-byte
verbatim), and the general multi-port directory/CMake structure.
This port was built with the help of Claude AI (Anthropic) - the platform layer, the dialect conversion, every game ported across several batches of background agents, every bug found during the port, and the Playdate port’s own design work were all done through an AI-assisted development workflow.
Requires CMake and a C compiler (developed against MinGW-w64/GCC on
Windows; nothing in the source is Windows-specific beyond the -mwindows
linker flag, which only suppresses the console window and is skipped on
non-Windows).
This repo has no top-level CMakeLists.txt - each port under src/
(src/sdl3/ and src/sdl2/) is its own standalone CMake project, built
from inside its own directory:
cd src/sdl3 # or: cd src/sdl2
cmake -B build -G Ninja -DUSE_VENDORED_SDL=1
cmake --build build
USE_VENDORED_SDL=1 builds SDL from the matching vendored checkout at
the repo root (SDL3/ for src/sdl3/, SDL2/ for src/sdl2/) as a
static library and statically links everything into one self-contained
executable (no SDL DLL needed alongside it).-DUSE_VENDORED_SDL=1 (or set it to 0) to link against a
system-installed SDL instead (find_package(SDL3 CONFIG) /
find_package(SDL2 CONFIG) respectively).assets/thumbnails/thumbnailData.h, generated from assets/thumbnails/
thumb_NN.bmp by tools/gen_thumbnails.py - re-run it after changing
any thumbnail) - there’s no assets/ folder to ship or find alongside
the built exe. The single resulting binary is the complete, runnable,
relocatable artifact - copy just the .exe to distribute it.src/sdl3/build/GamebuinoClassicSDL3
(or src/sdl2/build/GamebuinoClassicSDL2, or .exe on Windows either
way). See CLAUDE.md’s “Directory layout / multi-port structure”
section for why the build entry point is per-port rather than a single
repo-root command.src/gameworld/,
same CLI, same keybinds) - pick whichever matches what’s actually
available to link against on your system/platform. SDL3 is the primary,
most-exercised port.See CLAUDE.md’s own “The Playdate port” section for how to build
src/playdate/ (Simulator and device targets, requires the official
Playdate SDK).
Identical CLI/behavior on both SDL ports - examples below use the SDL3
binary, substitute GamebuinoClassicSDL2 (from src/sdl2/build/) for the
SDL2 one.
./GamebuinoClassicSDL3 # opens the menu
./GamebuinoClassicSDL3 -g "FLAPPY BIRDO" # launches a game directly by title
./GamebuinoClassicSDL3 -list # prints every game's title, then exits
./GamebuinoClassicSDL3 -help # full command-line reference
See -help for the complete flag list (window size/fullscreen, -ns to
skip audio, -fps for a live FPS overlay, -nd to uncap the framerate,
-s to force software rendering instead of the default GPU-accelerated
one, -ms to batch-capture a gameplay screenshot of every game, -gbu to
write a .gbu stub file per game for external frontends, and a .gbu
file itself as a positional argument to launch straight into that game).
| Action | Keyboard | Gamepad |
|---|---|---|
| Move / navigate menu | Arrow keys | D-pad or left stick |
| Gamebuino Button A / confirm | X | South button (A on Xbox) |
| Gamebuino Button B | C | East button (B on Xbox) |
| Gamebuino Button C | D | West button (X on Xbox) |
| Start / pause / quit-confirmation dialog | Escape or Enter | Start or Back |
| Cycle pixel-grid / glow / CRT scanline effect | G (also L, W, or Z) | Left shoulder (L1) |
| Toggle real-solid-gray-color mode | R (also V) | Right shoulder (R1) |
| Volume down / up | - | Left/Right trigger (L2/R2) |
| Mute / unmute sound | S | North button (Y on Xbox) |
The quit-confirmation dialog (Start, mid-game) freezes the current game
and asks YES/NO before returning to the menu - unless the game was
launched directly (-g <NAME> or a .gbu file), in which case there’s no
menu to return to, so Start quits the app immediately instead, with no
dialog. GB_GRAY content (used by several games for a dithered “third
shade” on this strictly 2-color display) renders as a real, flickering
checkerboard dither by default - matching real Gamebuino Classic hardware
exactly - or, with the real-solid-gray-color toggle on (the default here),
as a genuine flat, solid gray instead; only visible in games that actually
draw GB_GRAY content.
The pixel-grid/glow/CRT cycle is a single button stepping through all 8
real combinations of the three effects (a genuine 3-bit counter - off,
each effect alone, and every pairing/triple together), only visible during
actual gameplay, not on the menu screen. Fullscreen/volume/mute work
everywhere (menu and in-game) and are logged to the console on every
change, since there’s no on-screen indicator for them; -f/-ns on the
command line still cover fullscreen/no-sound at launch time.
Click a thumbnail for the full-size screenshot. In the menu, a handful of titles are shown in red text instead of white - a plain visual “known unfinished” warning (e.g. missing scoring/win-lose conditions, built from a genuinely incomplete upstream source, or a known bug like a ball that can get stuck). They’re still fully selectable and playable like any other game, just flagged.
The table also includes Sound Test, which uses the same red-text
flagging but for a different reason: it’s not a ported game at all, just
an in-cartridge diagnostic tool for exercising the sound shim’s own
primitives directly (playOK()/playCancel()/playTick(), a raw pitch
sweep, and a few instrument/volume/slide extras).
| Game | Author | License | Save | Source | Screenshot |
|---|---|---|---|---|---|
| 101 Starships | Zoglu | None | — | zoglu.net (no stable link) | ![]() |
| A to K | Carlos Mari | CC-BY 4.0 (+ no-selling note) | ✅ | carloslabs.com (no stable link) | ![]() |
| Aerial-Assault | SkylarHylar | None | — | Strike Down | ![]() |
| Agaruino | ogbaba | GPLv3 | — | Agaruino | ![]() |
| Aimbuino | Baptiste Pouget (hosted under ogbaba’s account) | GPLv3 | ✅ | Aimbuino | ![]() |
| Another 2048 | grafMakulaDer2te | None | — | another2048 | ![]() |
| Armageddon | wuuff | GPLv3 | ✅ | armageddon | ![]() |
| Artillery | Frakasss | None | — | Artillery | ![]() |
| Asterocks | Yoda Zhang | None | ✅ | yodasvideoarcade.com | ![]() |
| AsteroidRipper | ripper121 | None | — | Recovered via direct download (no stable link) | ![]() |
| B-Rally | scmar | MIT | ✅ | B Rally | ![]() |
| Bang! Bang! | RackhamLeNoir | GPLv3 | — | gamebuino bangbang | ![]() |
| BigBlackBox | STUDIOCRAFTapps | Custom (non-commercial, keep credit - see source) | ✅ | akkera102 08 gamebuino | ![]() |
| Blob Attack | LudumDareDevelopment | None | ✅ | Blob Attack | ![]() |
| Blockdude | Sorunome | None | ✅ | blockdude gamebuino | ![]() |
| BlocksBuino | frthery | None | — | BlocksBuino | ![]() |
| Bomber | Clement83 | None | — | Bomber | ![]() |
| Breakout Ripper | ripper121 | None | — | Recovered via direct download (no stable link) | ![]() |
| Bub | smogheap | GPLv3 | ✅ | smogheap.github.io/bub | ![]() |
| Castle Defence | kh9282 | None | ✅ | CastleDefence | ![]() |
| Catcher | qubist | None | — | Gamebuino Catcher | ![]() |
| Community RPG | Sorunome | None | — | gamebuino community rpg | ![]() |
| Conduit | adekto | MIT | — | conduit | ![]() |
| Copter | Clement83 | None | — | Copter | ![]() |
| CopterStrike | Frakasss | None | — | CopterStrike | ![]() |
| Crabator | Rodot | None | ✅ | Crabator | ![]() |
| CrazyCar | Baptiste Pouget | GPLv3 | — | CRAZYCAR Gamebuino | ![]() |
| CrazyTown | Clement Quintard | None | ✅ | CrazyTown | ![]() |
| Cruiser | Michael Specht | None | — | cruiser | ![]() |
| Dark Tower | Marcus Hutchings | GPLv3 | — | DarkTower | ![]() |
| DarkShmup | Clement83 | None | — | DarkShmup | ![]() |
| DeathMaze | msevilgenius | None | ✅ | Recovered via direct download (no stable link) | ![]() |
| Descent into Hell | etienne72230 | None | ✅ | DescentIntoHeel | ![]() |
| Digger | scmar | None | ✅ | Digger | ![]() |
| Elventure | trodoss (original, TEAM a.r.g.) / wuuff (Gamebuino port) | GPLv3 | — | Elventure | ![]() |
| Fifteen | Tnxec2 | None | ✅ | fifteen | ![]() |
| FireBuino! | LADBSoft | LGPLv3 | ✅ | makerbuino firebuino | ![]() |
| Firemen | Vicking69 | GPLv2 | ✅ | firemen | ![]() |
| Flappy Birdo | Forklift5 | None | ✅ | FlappyBirdo | ![]() |
| Footlol | Baptiste Pouget (hosted under ogbaba’s account) | GPLv3 | — | FOOTLOL Gamebuino | ![]() |
| Gamebuino2048 | Josiah Winslow | None | ✅ | Mediafire (no stable link) | ![]() |
| Gemgem | Tnxec2 | None | ✅ | gemgem gamebuino | ![]() |
| GlaciGlaca | Clement83 | None | — | GlaciGlaca | ![]() |
| Gruniozerca | Arkadiusz Kaminski (arhneu) | Unlicense | ✅ | gruniozerca gamebuino | ![]() |
| Invaders | Yoda Zhang | None | ✅ | yodasvideoarcade.com | ![]() |
| Jezzball | RackhamLeNoir | GPLv3 | ✅ | gamebuino jezzball | ![]() |
| Kill Race | Yoda Zhang | None | ✅ | yodasvideoarcade.com | ![]() |
| Lander | Yoda Zhang | None | ✅ | yodasvideoarcade.com | ![]() |
| Lights Out AD | 94k | WTFPL | — | Recovered via direct download (no stable link) | ![]() |
| Maruino | ajsb113 | None | — | Dropbox (no stable link) | ![]() |
| Master Kebab | ogbaba | GPLv3 | ✅ | RMKebab | ![]() |
| Maze | Andy O’Neill | MIT | — | gamebuino maze | ![]() |
| microHexagon | valdenthoranar | None | ✅ | microhexagon | ![]() |
| Minesweeper | dirksteindorf | None | — | Gamebuino Minesweeper | ![]() |
| Mole Control | grafMakulaDer2te | None | — | mole control | ![]() |
| MotoCross | Clement83 | None | — | MotoCross | ![]() |
| MyRPG | Frakasss | None | — | MyRPG | ![]() |
| No Name Platform Game | Frakasss | None | — | NoNamePlatformGame | ![]() |
| Paqman | Yoda Zhang | None | ✅ | yodasvideoarcade.com | ![]() |
| Parachute | Jicehel | None | — | Parachute Gamebuino | ![]() |
| PetitMonstre | Clement83 | None | — | PetitMonstre | ![]() |
| PinBall | Clement83 | None | — | pinBall | ![]() |
| Pong 2017 | yawn-g | None | — | pong 2017 | ![]() |
| Pong Local Multiplayer | qubist | None | — | Gamebuino PongLocalMultiplayer | ![]() |
| Pong Solo | Aurelien Rodot | LGPLv3 | — | Gamebuino Classic examples | ![]() |
| Punkt | Andy O’Neill | MIT | ✅ | gamebuino punkt | ![]() |
| Ralph | Clement83 | None | — | Ralph | ![]() |
| Robot | Frakasss | None | — | Robot | ![]() |
| Save Princesse | Clement83 | None | — | SavePrincesse | ![]() |
| Senet | Maximilian Timmerkamp | Apache 2.0 | — | Recovered via direct download (originally hosted on Bitbucket, no stable link) | ![]() |
| shipwrek | yawn-g | None | — | shipwrek | ![]() |
| ShootBuino | frthery | None | ✅ | ShootBuino | ![]() |
| Shufflepuck Cafe | AWOT83 | GPLv3 | — | Gamebuino Shufflepuck cafe | ![]() |
| Simonbuino | Jerom (Forklift5) | None | — | Simonbuino | ![]() |
| Skibuino | Mike Del Pozzo | GPLv3 | ✅ | skibuino | ![]() |
| Smash-and-Crash | Skyrunner65 | None | — | Smash and Crash | ![]() |
| Snake 5110 | Lady Awesome & MakerSquirrel | CC-BY-SA 2018 / GPLv3 (unresolved conflict, see source) | ✅ | Gamebuino Classic Snake 5110 | ![]() |
| Snake ABC | frthery | None | — | SnakeAbcBuino | ![]() |
| Snake Classic | Ripper121 (original), Tnxec2 (fork) | None | — | snake gamebuino classic | ![]() |
| Sokobuino | martinsustek | None | ✅ | Recovered via direct download (no stable link) | ![]() |
| Solitaire | Andy O’Neill | MIT | ✅ | gamebuino solitaire | ![]() |
| Sound Test | willems davy | GPLv3 (this project’s own code) | — | Not a ported game - a sound-shim diagnostic tool, see above | ![]() |
| Spin Spin Spinbuino! | Charly Piva “Zoglu” / Margot Piva “Isil” | None | ✅ | zoglu.net (no stable link) | ![]() |
| Star Honor | Wenceslao Villanueva Jr (original) / wuuff (Gamebuino port) | MIT | — | StarHonor | ![]() |
| StickFighter | Clement83 (art by Quirby64) | None | — | StickFighter | ![]() |
| Stijn’s Pong | Stijn Caerts | MIT | — | Gamebuino (StijnCaerts) | ![]() |
| Stijn’s Snake | Stijn Caerts | MIT | — | Gamebuino (StijnCaerts) | ![]() |
| Super Crate Buino | Aurelien Rodot | None | ✅ | Super Crate Buino | ![]() |
| Super Space Shooter | msevilgenius | None | — | Gamebuino SuperSpaceShooter | ![]() |
| T-Rex Quest | Awot83 | GPLv3 | — | Gamebuino TREX QUEST | ![]() |
| Taquin | RackhamLeNoir | GPLv3 | — | gamebuino taquin | ![]() |
| Tetrino | j0ff | MIT | — | tetrino | ![]() |
| Thunder Shoot | Awot83 | GPLv3 | — | Gamebuino Thunder Shoot | ![]() |
| Tron | Clement83 | None | — | Tron | ![]() |
| UFO Race | Rodot | None | ✅ | UFO Race | ![]() |
| Under the Tower | wuuff | GPLv3 | ✅ | under the tower | ![]() |
| Video Poker | Mike Del Pozzo | GPLv3 | ✅ | videopoker gamebuino | ![]() |
| World’s Hardest Game | Sorunome | None | ✅ | Worlds Hardest Game Gamebuino | ![]() |
| Xonix | Tnxec2 | None | — | xonix gamebuino | ![]() |
| ZombiEscape | Frakasss | None | — | ZombiEscape | ![]() |
src/gameworld/games/), already ported once from
the original Gamebuino Classic sources and already bug-fixed through its
own extensive play-testing history, was carried over here essentially
unchanged - only a mechanical dialect conversion (see CLAUDE.md)
touched it to make it build as standard C instead of Vircon32’s own
restricted dialect. This project’s own platform layer (SDL3/SDL2/
Playdate) is new; the game code underneath it is not.src/gameworld/
gamebuinoShim.h/.c reproduces its real API (buttons, display, sound)
on top of SDL/Playdate, and its own real font5x7/font3x5/font3x3
bitmap fonts are ported verbatim for in-game text rendering.src/gameworld/biosFont.h - 10x20px, codepage 1252, all 256 glyphs
extracted directly from the actual BIOS font asset, not hand-
transcribed), authored by Carra (Vircon32’s own author) and
published on OpenGameArt.org as “Pixel Art Outlined Text Fonts” under
CC-BY 4.0 - a separate license from this project’s own GPLv3 below;
this credit is that license’s own attribution requirement.src/<port>/
directory layout, per-port CMakeLists.txt shape, CLI flag set), and
the source of the CInput keyboard/gamepad abstraction and the audio
oscillator shape, both copied verbatim - see CLAUDE.md for exactly
where each was reused versus built fresh for this project’s own
Gamebuino-specific needs.src/gameworld/games/ and
listed per-game in the “Games” table above.This project is GPLv3 (LICENSE.txt): several of the games shipped
here (Agaruino, CrazyCar, Shufflepuck Cafe, Taquin, and others) are
themselves GPLv3, and combining GPLv3 code into one executable makes the
whole executable a GPLv3 combined work. This covers this project’s own new
code (the SDL3/SDL2/Playdate platform layers, the shared menu) - each
individual game’s own original license/attribution is preserved unmodified
in its own header comment in src/gameworld/games/.
Known concern: Firemen’s own upstream LICENSE.md says only “GPL V2”,
with no “or later version” clause found - GPLv2-only code is not
license-compatible with GPLv3 the way every other GPL’d game here (all
GPLv3) is, so combining it into this same GPLv3 binary as-is is a real,
unresolved licensing conflict, not just a compatible-license bookkeeping
detail. Inherited directly from the source Vircon32 project, flagged here
rather than silently ignored; not yet resolved.