Open-Source Controller Test ROMs for Retro Game Consoles
Drop a single ROM on a flash cart and inspect every controller,
accessory, and protocol quirk the console can speak to.
A collection of homebrew controller test ROMs across game consoles. Each console gets its own self-contained subdirectory with its own toolchain and build.
| Console | Status | Path | License |
|---|---|---|---|
| 3DO | released | 3do/ |
MIT |
| Game Boy Advance | released | gba/ |
MIT |
| GameCube | released | gcn/ |
zlib |
| Nintendo 64 | released | n64/ |
MIT |
| PC Engine | released | pce/ |
MIT |
| Xbox | released | xbox/ |
MIT |
| Dreamcast | released | dc/ |
MIT |
| NUON | alpha | nuon/ |
MIT |
| PlayStation | planned | — | — |
| PlayStation 2 | planned | — | — |
| NES | planned | — | — |
| SNES | planned | — | — |
| Xbox 360 | planned | — | — |
| PlayStation 3 | planned | — | — |
Status legend: released = stable, no known issues. beta = nearly complete, may have rough edges or unreleased polish. alpha = boots but core functionality still in progress. planned = on the roadmap, not started.
Subdirs use short codenames (3do, gba, gcn, pce, dc, n64,
nuon, xbox, future psx / ps2 / nes / snes / x360 /
ps3) matching homebrew-community conventions. Release tags follow the
same prefix: <codename>-v<semver>.
Adding a console? PORTING.md is the full port spec
— the shared visual system, feature shape, and device-detection
philosophy every tester follows so they feel like one set. The whole
process is also driven by the /joypad-port skill.
Each console app has its own lineage. As more consoles join, this list grows.
| Console | Origin / inspiration |
|---|---|
| GameCube | Derived from corenting/GC-Controller-Test (zlib). Multi-port layout and accessory probe flow modeled after meeq/JoypadTest-N64. GC keyboard wire format and scancode table come from the joypad-os firmware (src/lib/joybus-pio). |
| Game Boy Advance | Joybus handshake + main loop from Doridian/Joybus-PIO (MIT). Eyes overlay ported from joypad-os's eyes_anim. Mode-4 page-flipped screensaver matches the GameCube tester's logo + color cycle. Two ROM variants from one source tree: joypad_mb.gba (eyes, for joypad-os submodule consumers) and tester_mb.gba (Doridian + on-GBA console). |
| PC Engine | Baseline from dshadoff/PCE_Mouse_Test (MIT). Detects 2-button / 6-button pads and the PC Engine mouse, including multitap support. Built with uli/huc (HuC) pinned in a Docker image we maintain. |
| 3DO | Fresh implementation against trapexit/3do-devkit (ISC). Detects every PBUS device on the daisy chain (Pad, Mouse, Stick, LightGun, Arcade SillyPad, Keyboard) by talking directly to the Portfolio event broker. Bundles a rebuilt broker daemon from trapexit/portfolio_os with every driverlet static-linked in, plus a new SillyPadDriver.c for the 0xC0 silly-pad and a finished KeyboardDriver.c (PR open upstream). Conceptual ancestor: Charles Doty (RasterSoft)'s 3DO Controller Test Multi (2016). Pinned devkit commit lives in 3do/buildtools/Dockerfile. |
| Dreamcast | Fresh implementation against KallistiOS (BSD-style). Reads every maple-bus device class — controllers, mice, keyboards, light guns, plus per-port slot peripherals (VMU, Purupuru, microphone). Also hosts a built-in VMU icon editor mode (v0.2+) ported from RobertDaleSmith/vmu-icon-maker (MIT). First console in the repo to ship the mode-switching scaffold (Options menu via Start+Down) that future testers can adopt. Pinned KOS commit lives in dc/buildtools/Dockerfile. |
| Nintendo 64 | Fork of meeq/JoypadTest-N64 (public domain) on top of LibDragon trunk (also public domain). Detects N64 pads, GameCube pads (passive 3-pin adapter), the N64 Mouse, the Voice Recognition Unit, Rumble / Controller / Transfer Pak, Bio Sensor (live BPM streaming), Snap Station (protocol exerciser), and GBA-in-JOYBUS-mode via the GameCube / GBA link cable — with Kawasedo multiboot ported from gcn/ppc/gba.c so the same tester_mb.gba payload the GameCube tester boots will boot a GBA over the N64 controller port. Secondary modes (Controller Pak browser, GB Camera viewer, Snap Station) follow the dc/ Options-menu scaffold. |
Originating copyrights are preserved in each console's source headers.
Top-level repo scaffolding (CI, build infra, this README): MIT.
Each console subdir carries its own LICENSE.md matching its upstream
origin — see the License column of the Consoles table above.