A Port of the attiny85, Tinyjoypad games to the vircon32 fantasy console
A single Vircon32 cartridge that ports 33
games originally written for the TinyJoypad
ATtiny85 + SSD1306 128x64 OLED handheld onto Vircon32’s 640x360 GPU, behind
one shared game-select menu. Vircon32’s GPU is a texture-region blitter with
no CPU-writable framebuffer, so every game’s display output is routed
through a 256-tile “column atlas” (one pre-baked texture tile per possible
SSD1306 byte value) instead of writing pixels directly - see CLAUDE.md for
the full architecture writeup, porting log, and every bug found along the
way.
This port was built with the help of Claude AI (Anthropic) - the shim
layer, every individual game port, bug fixes, and the optimization passes
documented in CLAUDE.md/OPTIMIZATIONS.md were all done through an
AI-assisted development workflow.
Vircon32 is a fantasy console with its own abstract gamepad (D-pad + 6 buttons + Start) - the games in this cartridge only ever use a small part of that:
| Console input | Used for |
|---|---|
| D-pad | Move / navigate the menu |
| Button 1 (“A”/Fire) | Confirm, jump, shoot, rotate, etc. - context-sensitive per game |
| Button 2 (“B”) | Secondary action - only Tiny Minez uses this (instant flag-toggle, as an alternative to holding Button 1) |
| Start | Pause mid-game and open the quit-confirmation dialog (YES/NO, defaults to NO) |
Which physical keyboard key or real gamepad button maps to which of
these is entirely up to the Vircon32 emulator’s own input configuration
(Config-Controls.xml in the desktop emulator, or the equivalent in
whichever emulator/frontend is used) - this cartridge doesn’t fix or
assume a specific keyboard layout, the same way a real console game
doesn’t. See vircon32.com for the emulator’s
own default bindings and how to change them.
This project is GPLv3 (LICENSE.txt), because at least one ported
game (Tiny Invaders v4.2) is itself GPLv3, and combining GPLv3 code into
one cartridge binary makes the cartridge as a whole a GPLv3 combined work.
This covers this project’s own new code (the shim layer, the menu,
portVircon32.c, etc.) - each individual game’s own original
license/attribution is preserved unmodified in its own header comment in
src/games/, and is also listed per-game in the table below.
| Game (in-cartridge title) | Original Author | License | Source |
|---|---|---|---|
| NumberPlace | Obono | MIT | TinyJoypadWorks |
| 2048 | Obono | MIT | TinyJoypadWorks |
| HollowSeeker | Obono | MIT | TinyJoypadWorks |
| Tiny Invaders | Daniel C / Sven B | GPLv3 | Tiny-invaders-v4.2 |
| Tiny Minez | Sven B / Lorandil | GPLv3 | TinyMinez |
| Tiny Dungeon | Sven B / Lorandil | MIT | TinyDungeon |
| Tiny Lander | Roger Buehler (tscha70) | GPLv3 | TinyLanderV1.0 |
| Tiny Pinball | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Pacman | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Bomber | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Doc | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Bert | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Tris | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Arkanoid | Daniel Champagne | GPLv3 | tinyjoypad.com |
| Tiny Trick | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Missile | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Bike | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Arena | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Gilbert | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Pipe | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Morpion | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny Plaque | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny SQuest | Daniel C | GPLv3 | tinyjoypad.com |
| Tiny DDug | Daniel C | GPLv3 | tinyjoypad.com |
| Wren Rollercoaster | Andy Jackson | Non-commercial, with attribution | Attiny-Arduino-Games |
| Frogger | Andy Jackson (art: @senkunmusashi) | Non-commercial, with attribution | Attiny-Arduino-Games |
| Bat Bonanza | Andy Jackson | Non-commercial, with attribution | Attiny-Arduino-Games |
| Stacker | Andy Jackson | Non-commercial, with attribution | Attiny-Arduino-Games |
| UFO | Ilya Titov | Non-commercial, with attribution | AttinyArcade |
| Oroboros | Ilya Titov | Non-commercial, with attribution | AttinyArcade |
| Run Dude Run | Ilya Titov | Non-commercial, with attribution | AttinyArcade |
| Four in a Row | Unknown | None specified | tiny-handheld |
| Dino Game | tiny-handheld project (original) | None specified | tiny-handheld |
Vircon32 runs a fixed 15 MHz / 60 fps / 250,000-CPU-cycles-per-frame budget - several ports needed real optimization work to stay under it, mostly the same recurring shape (per-pixel work redone every frame instead of cached, or a self-gated function still costing a full call every time it’s invoked). See OPTIMIZATIONS.md for a short per-game summary of what was done.
See Make.sh/Make.bat (requires the Vircon32 dev tools - compile,
assemble, png2vircon, wav2vircon, packrom - on PATH) and
CLAUDE.md for the full architecture and porting notes.