A fork of GP2040-CE v0.7.12 that adds NOBD (No OBD) — a sync window that groups near-simultaneous button presses so they arrive on the same USB frame. Built for MvC2, where split LP+HP presses cause dropped dashes.
Also includes a native Dreamcast Maple Bus driver — play on a real DC without an adapter. Jump to Dreamcast wiring →
Sync disabled — dropped dashes, stray jabs
NOBD.Demo.-.Sync.disabled.mp4
Sync enabled — dashes come out clean every time
NODB.Demo.-.Sync.Enabled.mp4
- Download the
.uf2for your board from the Releases page - Unplug your board, hold BOOTSEL, plug in via USB
- Drag and drop the
.uf2onto theRPI-RP2drive that appears - Board reboots with new firmware — done
Supported boards: RP2040AdvancedBreakoutBoard, Pico, PicoW, Pico2
Open the web UI: hold S2 on boot → navigate to http://192.168.7.1 → Settings
| Mode | What it does |
|---|---|
| NOBD Sync Window | Groups near-simultaneous presses. Default: 5ms |
| Stock Debounce | GP2040-CE stock behavior. Set to 0 for raw passthrough |
Recommended: Start at 5ms. If you still drop dashes occasionally, try 6–8ms.
A Release Debounce checkbox appears in NOBD mode — enables bounce filtering on button release. Off by default. Useful for rhythm games where release bounce causes phantom inputs, not needed for fighting games.
GP2040-CE NOBD includes a native Maple Bus driver. Your fight stick talks directly to the Dreamcast — no adapter, no USB dongle, no level shifter.
Status: Beta — buttons, d-pad, triggers, and VMU save/load all confirmed working on real hardware. Analog stick untested.
- RP2040-based GP2040-CE board
- A Dreamcast controller cable (cut from a broken controller or extension)
- Soldering iron (not necessary if you have breakout screw terminals like in gp2040 advanced breakout board)
| Pin | Color (typical) | Signal |
|---|---|---|
| 1 | Red | VCC (+5V from console) |
| 2 | Green | SDCKA (Data/Clock A) |
| 3 | Blue | SDCKB (Data/Clock B) |
| 4 | White | Sense |
| 5 | Black | GND |
Wire colors vary between cables — verify with a multimeter before soldering.
| DC Cable | Board Connection | Notes |
|---|---|---|
| Red (VCC) | VCC | Board is powered directly by the DC's 5V |
| Green (SDCKA) | GPIO 2 | Maple Bus Data A (default) |
| Blue (SDCKB) | GPIO 3 | Maple Bus Data B (default) |
| White (Sense) | GND | Tie directly to ground — tells DC a device is present |
| Black (GND) | GND | Common ground |
Important — RP2040AdvancedBreakoutBoard: The board has a physical switch that selects between USB and the Options/Aux header. Flip it to the Options position before connecting to the Dreamcast, otherwise the board won't power on from the DC's 5V line.
The Maple Bus pins default to GPIO 2/3. If you wire to different pins, update them in the web UI under Settings → Dreamcast so the firmware knows where to look.
Hold L1 while plugging in the board. (or use the webui, the hot button can be configured)
For full Dreamcast wiring details and troubleshooting, see docs/DREAMCAST.md.
In the web UI, go to Settings → Input Mode and select Dreamcast from the dropdown. The Dreamcast GPIO pin settings and VMU Manager link appear below.
Manage your Dreamcast VMU saves from the web UI — no real VMU hardware needed.
Download a complete 128KB backup of your VMU as a .bin file. Useful for archiving saves or transferring to other tools.
Upload a .dci save file (Nexus Memory Manager / Dreamcast Memory Manager format). The import automatically:
- Converts byte order (DCI → flash format)
- Allocates blocks top-down (matching Dreamcast convention)
- Replaces any existing save with the same filename
Wipe and re-format the VMU. Requires typing "FORMAT" to confirm — all saves are permanently deleted.
Debounce and NOBD sync windows are generally unnecessary in Dreamcast mode. The 16ms Maple Bus polling interval acts as a natural sync window — simultaneous presses within that window always land on the same frame. The default for fresh installs is Stock Debounce 0 (raw passthrough).
The short version: when you press two buttons "simultaneously," your fingers are actually 2–8ms apart. At 1000Hz USB polling, that gap splits your inputs across USB frames. In MvC2 — a 25-year-old arcade game with zero input leniency — that means a stray jab instead of a dash.
NOBD holds the first press for up to 5ms so both buttons commit on the same frame. Nothing added, nothing invented — just your two presses arriving together instead of split by a timing boundary you can't see or control.
Measure your natural finger gap with the Finger Gap Tester — Python CLI or Rust GUI. Detects strays, bounces, pre-fire, and recommends a sync window value.
See docs/README.md — covers how this project was built using AI-assisted firmware development (Claude Code), how to set up your build environment, and how to contribute without being a firmware expert.









