Tinyjoypad_SDL

A Port of the attiny85, esp8265, ... + ssd1306 oled screen games like Tinyjoypad and other games to SDL2/3 and Playdate


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

TinyJoypad → SDL

DownloadCountTotal DownloadCountLatest LatestVersion License

Menu screenshot

A native SDL3 port bringing 82 games behind one shared game-select menu, running as a plain desktop executable - no emulator required. Most originally targeted the TinyJoypad itself (an ATtiny85 driving a 128x64 SSD1306 monochrome OLED); the rest come from other small handhelds sharing that same 128x64 SSD1306 display/ button shape but built on a different microcontroller (ESP8266, ESP8285, or the CH32V003 - a RISC-V chip, not AVR at all, behind the 22-game “Cate engine” batch from inufuto’s own UIAPduino boards) - see each game’s own MCU column in the table below.

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 82 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 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 actual game code, and the whole bug-fix history behind it, is unchanged. Every per-game bug already found and fixed there (the byte-truncation/ shift-wraparound/signed-sentinel/RNG-range/logical-shift family of dialect bugs, plus dozens of genuine game-logic bugs found via real play) applies here too, since it’s the same C.

The platform layer itself - window/input/audio/rendering, the menu, the CLI, and the presentation effects below - is new, built directly against SDL3, reusing infrastructure and technique from the same author’s crisp-game-lib-portable-sdl project (cglpSDL3.c) where it fit: the CInput abstraction, the audio oscillator shape, and the glow/CRT/pixel- grid presentation effects (rebuilt around GPU textures rather than ported verbatim - see CLAUDE.md for why).

This port was built with the help of Claude AI (Anthropic) - the platform layer, the dialect conversion, every bug found during the port, and the optimization/verification passes documented in CLAUDE.md/ OPTIMIZATIONS.md 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

Running

Identical CLI/behavior on both ports - examples below use the SDL3 binary, substitute TinyjoypadSDL2 (from src/sdl2/build/) for the SDL2 one.

./TinyjoypadSDL3           # opens the menu
./TinyjoypadSDL3 -g "TINY INVADERS"   # launches a game directly by title
./TinyjoypadSDL3 -list     # prints every game's title, then exits
./TinyjoypadSDL3 -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, -joy to write a .joy stub file per game for external frontends, and a .joy 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
Fire / confirm / A X South button (A on Xbox)
Fire2 / B (only Tiny Minez - instant flag toggle) C East button (B on Xbox)
Start / pause / quit-confirmation dialog Escape Start or Back
Cycle glow / CRT scanlines / pixel-grid effect G West button (X on Xbox)
Toggle fullscreen F3 -
Volume down / up PageDown / PageUp Left/Right shoulder
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 .joy file), in which case there’s no menu to return to, so Start quits the app immediately instead, with no dialog. The glow/CRT/pixel-grid cycle is a single button stepping through 5 combinations (none → pixel-grid+glow → pixel-grid → CRT scanlines → glow alone → back to none) and only has any visible effect 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.

Game Author MCU License Save Source Screenshot
2048 Obono ATtiny85 MIT TinyJoypadWorks
Aerial Inufuto CH32V003 None specified UIAPduino_aerial
Antiair Inufuto CH32V003 None specified UIAPduino_antiair
Ardumania Daniel C ESP8285 GPLv3 Tinyjoypad
Ascend Inufuto CH32V003 None specified UIAPduino_ascend
Asteroid Tony M (tonym128) ESP8266 GPLv3 ESP8266GameOn
Astro Barrier Sean Price ATtiny85 GPLv3 attiny astro barrier
ATtiny Snake Sean Price ATtiny85 GPLv3 attiny snake
ATtiny Tetromino Sunpazed ATtiny85 GPLv3 attiny tetromino
Awass Inufuto CH32V003 None specified UIAPduino_awass
Bat Bonanza Andy Jackson ATtiny85 Non-commercial, with attribution Attiny Arduino Games
Battlot Inufuto CH32V003 None specified UIAPduino_battlot
Blocks Gold Andy Jackson / Jarosław Mazurkiewicz ATtiny85 Non-commercial ATtiny Tetris Gold
Bootskell Inufuto CH32V003 None specified UIAPduino_bootskell
Breakout Ilya Titov ATtiny85 Non-commercial, with attribution AttinyArcade
Cacorm Inufuto CH32V003 None specified UIAPduino_cacorm
Car Race hoangminh5210119 ESP8266 None specified Esp8266OledGame
Cavit Inufuto CH32V003 None specified UIAPduino_cavit
Cracky Inufuto CH32V003 None specified UIAPduino_cracky
DFlight Tony M (tonym128) ESP8266 GPLv3 BFlight
Dino Game tiny-handheld project (original) ATtiny85 None specified tiny handheld
Falling Blocks Andy Jackson ATtiny85 Non-commercial, with attribution Attiny Arduino Games
Flappy Bird Alex Wulff ATtiny85 None specified Instructables
Four in a Row Unknown ATtiny85 None specified tiny handheld
Frogger Andy Jackson (art: @senkunmusashi) ATtiny85 Non-commercial, with attribution Attiny Arduino Games
Gilbert in the Downland Daniel C ESP8285 GPLv3 Tinyjoypad
Guntus Inufuto CH32V003 None specified UIAPduino_guntus
Helicopter Finn Harms (innif) ESP8266 GPLv3 Arduino Game System
HollowSeeker Obono ATtiny85 MIT TinyJoypadWorks
Hopman Inufuto CH32V003 None specified UIAPduino_hopman
Impetus Inufuto CH32V003 None specified UIAPduino_impetus
Jump Slime Kondolab (近藤さんちの研究室) ATtiny85 None specified kondolab
Laser Pong Winston Lu ATtiny85 MIT ATTiny85 Pong
Lift Inufuto CH32V003 None specified UIAPduino_lift
Mazy Inufuto CH32V003 None specified UIAPduino_mazy
Mazy2 Inufuto CH32V003 None specified UIAPduino_mazy2
Meteor Storm Albert Gonzalez ATtiny85 Unlicense (public domain) attiny85 microgame meteor storm
Mieyen Inufuto CH32V003 None specified UIAPduino_mieyen
MRunnr Tony M (tonym128) ESP8266 GPLv3 BFlight
Neuras Inufuto CH32V003 None specified UIAPduino_neuras
Nohzdyve Daniel C ESP8285 GPLv3 Tinyjoypad
NumberPlace Obono ATtiny85 MIT TinyJoypadWorks
Oroboros Ilya Titov ATtiny85 Non-commercial, with attribution AttinyArcade
Osotos Inufuto CH32V003 None specified UIAPduino_osotos
Pipe Bird Ioannis Lampropoulos ATtiny85 None specified attiny85 flappy bird
Road Rush Tony M (tonym128) ESP8266 GPLv3 BFlight
Run Dude Run Ilya Titov ATtiny85 Non-commercial, with attribution AttinyArcade
Ruptus Inufuto CH32V003 None specified UIAPduino_ruptus
SnakeGame85 terezaza ATtiny85 GPLv3 SnakeGame85
Space Attack Andy Jackson ATtiny85 Non-commercial, with attribution Attiny Arduino Games
Stacker Andy Jackson ATtiny85 Non-commercial, with attribution Attiny Arduino Games
Svellas Inufuto CH32V003 None specified UIAPduino_svellas
Sword Inufuto CH32V003 None specified UIAPduino_sword
Tiny Arena Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Arkanoid Daniel Champagne ATtiny85 GPLv3 tinyjoypad.com
Tiny Bert Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Bike Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Blocks RobotMasterC ATtiny85 None specified TinyTetris
Tiny Bomber Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Bulls And Cows Datacute ATtiny85 MIT TinyBullsAndCows
Tiny DDug Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Doc Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Dungeon Sven B / Lorandil ATtiny85 MIT TinyDungeon
TinY Fi Kondolab (近藤さんちの研究室) ATtiny85 None specified kondolab
Tiny Gilbert Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Invaders Daniel C / Sven B ATtiny85 GPLv3 Tiny invaders v4.2
Tiny Lander Roger Buehler (tscha70) ATtiny85 GPLv3 TinyLanderV1.0
Tiny Mania Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Minez Sven B / Lorandil ATtiny85 GPLv3 TinyMinez
Tiny Missile Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Morpion Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Pacman Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Pinball Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Pipe Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Plaque Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny SQuest Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Trick Daniel C ATtiny85 GPLv3 tinyjoypad.com
Tiny Tris Daniel C ATtiny85 GPLv3 tinyjoypad.com
TinyRoG Kondolab (近藤さんちの研究室) ATtiny85 None specified kondolab
UFO Ilya Titov ATtiny85 Non-commercial, with attribution AttinyArcade
Wren Rollercoaster Andy Jackson ATtiny85 Non-commercial, with attribution Attiny Arduino Games
Yewdow Inufuto CH32V003 None specified UIAPduino_yewdow

Credits

License

This project is GPLv3 (LICENSE.txt), for the same reason: at least one ported game (Tiny Invaders v4.2) is itself GPLv3, and combining GPLv3 code into one executable makes the whole executable a GPLv3 combined work. This covers this project’s own new code (both the SDL3 and SDL2 platform layers, the shared menu, the presentation effects) - each individual game’s own original license/attribution is preserved unmodified in its own header comment in src/gameworld/games/.

See also