gamebuino_classic_sdl

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


Project maintained by joyrider3774 Hosted on GitHub Pages — Theme by mattgraham

Gamebuino Classic → SDL

Menu screenshot

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

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

Building

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

See CLAUDE.md’s own “The Playdate port” section for how to build src/playdate/ (Simulator and device targets, requires the official Playdate SDK).

Running

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

Controls

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.

Games

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

Credits

License

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.

See also