Specifications
Every figure below was measured on the V1 alpha board, not estimated. Each section leads with the two or three numbers a game actually lives with; the rest is folded away, and it is all still here.
Video
640 × 480 at 60 Hz over HDMI, 4:3, 8 bits per pixel, palettised — 18.4 Mpx/s active.
3 000 opaque sprite-pixels per scanline, measured on the board: roughly 90 sprites of 32 px width on the same line, about 2 200 once they are blended. The budget is per line, not per screen — that is the number a game is really spending. Sprites are arbitrary sizes and animated; there is no fixed tile grid.
Sprites overlay a scrolling tile background, with front/behind priority resolved per pixel. Latency is two frames plus scan-out, deterministic, and there is no tearing by construction.
For comparison, a Neo Geo manages 1 536 sprite-pixels per line — about half.
The whole video pipeline
| Resolution | 640 × 480 at 60 Hz (4:3), 18.4 Mpx/s active |
| Output | HDMI / DVI |
| Depth | 8 bits per pixel, palettised: index → blend table → RGB565 → RGB888 on the wire |
| Palette | one palette of 256 indices, no banks: index 0 reserved (transparent), 190 opaque colours (1-190), one system ink (191, the white of the built-in 8×8 arcade font) and 64 effect rows (192-255) |
| Blend table | 65 536 × RGB565, 128 KB, rebuilt on the chip from the palette: one lookup per pixel resolves transparency, opacity, translucency, additive, shadow and front/behind priority — no branch |
| Sprites | 3 000 opaque sprite-pixels per scanline measured on the board (late August 2026), about 2 200 blended — roughly 90 opaque sprites of 32 px width per line |
| Sizes | arbitrary and animated; no fixed tile grid |
| Resident art | a 320 KiB pool in RP2’s SRAM (450 KB target), owned by RP1: 64-byte pages, bitmaps streamed from RP2’s NOR on demand by load orders carried in the display list packet, no tearing by a three-frame quarantine (late August 2026) |
| Display list | 256 entries of 16 bytes per frame, sent by RP1 over SPI at VSYNC with the palette, the background camera and tile-map writes, and up to 16 load orders (6 928-byte packet, 2.22 ms) |
| Overlay bus | 16-bit at 42 MHz between the sprite engine and the mixer; 484 lines per frame — 480 pixel lines plus four control blocks carrying the palette and camera, the blend modes, the tile-map writes, and one reserved |
| Planes | sprite overlay over background, front/behind priority per pixel |
| Background | 8 × 8 tile map scrolled by the mixer from its NOR, or a 128 × 64 toroidal map owned by the game: the background camera and tile-map writes are driven by the game and travel with the display list — a text mode at no display-list cost (late August 2026) |
| Latency | two frames plus scan-out, deterministic; no tearing by construction |
Compute
Three RP2350B, two Cortex-M33 each — six cores, 520 KB of SRAM per chip, 1.5 MB in all. All three run at 252 MHz.
One 12 MHz MEMS oscillator drives the XIN pin of all three, so their clocks are frequency-locked and never drift apart (genlock, in video terms). Sampling phase on the inter-chip bus is recovered by calibration.
Storage
Each chip has its own 16 MB NOR flash on its own XIP port — sprite atlas, background, code — reading at a measured 33 MB/s, which is 550 KB reloadable per frame. That private bandwidth, more than the cores, is why there are three chips.
Games live on a micro-SD card (FAT32, with card detect) on RP1, one folder each under
papydeck/games/<name>/, hot-plugged.
Launching a game compiles its art bundle into RP2’s and RP3’s NOR: a few seconds the first time, about two seconds from the card’s cache, and nothing at all once the NOR already holds it. This is a cartridge model, not a loading-screen model.
Audio
Running on the board, out of the headphone jack. Four synth channels — each a 32-step wavetable or an LFSR noise source — plus two PCM voices for sound effects, at 48 kHz into a TLV320DAC3100 and a 2.5 W class-D amplifier.
Envelopes and arpeggios are counted in frames, so the music follows the game clock exactly rather than drifting against it.
The whole audio path
| Synth | four channels, each a 32-step wavetable or an LFSR noise source: pulse 12/25/50 %, triangle, sawtooth, noise. Envelopes and arpeggios counted in frames, so they follow the game clock exactly |
| Samples | two PCM voices for effects, 8-bit at 24 kHz, read in place from RP1’s NOR — a third effect steals the oldest voice. Up to 64 effects and 1,920 KiB (about 80 s) per game, written to the NOR the first time a game runs and left alone until its sounds change |
| Music | a small text tracker file written in the editor, compiled on the console; the synth is shared to the byte with the browser simulator |
| Analogue | I2S from RP1 into a TLV320DAC3100: 4-pole jack and a 2.5 W class-D amplifier into 4 Ω |
| Sample rate | 48 kHz, from an exact PIO divider off 252 MHz |
| Digital | HDMI data islands generated by RP3 — designed, not implemented; the mixer runs in DVI mode |
Both paths exist because many PC monitors have neither speakers nor a headphone output.
Connectivity
Wi-Fi (station; the network is chosen and remembered on the console, HTTPS to the project’s server) and Bluetooth Classic (BR/EDR) as well as BLE, through an ESP32. Gamepads pair from the console’s own menu — DualShock 4, DualSense, Switch Pro, 8BitDo — via Bluepad32.
Bluetooth Classic is not a bonus feature: it is what living-room gamepads speak. BLE-only modules will not do.
USB-C 2.0 on RP1, the only chip carrying USB: console and firmware updates for all four chips. Three SWD connectors, one per chip, because a board you cannot probe is a board you cannot fix.
Status
Running on the V1 alpha board (received late August 2026), as of early September 2026: HDMI output from the three clock-locked chips; the sprite engine with its pool owned by RP1 and its opaque intervals (3 000 sprite-pixels per line measured); the tile background — a world scrolled from the mixer’s NOR, or a local text mode driven by the game; games from the micro-SD card, each with its art bundle compiled on the console and installed in the NORs (cached on the card); a game engine (fixed-point actors, collision mask, animations) shared to the byte with the browser simulator; Bluetooth gamepads with pairing from the console’s menu, rumble and player LEDs; Wi-Fi with an on-screen keyboard; the published games listed and downloaded onto the card over HTTPS; four-channel music and sampled effects out of the headphone jack. Watchdogs on the three chips and a universal exit (B or the console button held 3 s).
The console also updates its own four firmwares — no PC, no card swapping: it sees a newer version online, downloads it to the micro-SD, then installs the ESP32, the sprite engine, the mixer and finally itself. Each RP2350 image is written to the partition it is not running from and booted once; it only becomes current if it passes its own self-tests, so any reset — crash, power cut, watchdog — comes back on the previous image. The ESP32 does the same with its two OTA slots. That is the RP2350 bootrom’s A/B partitions and its try-before-you-buy flag.
Still open: HDMI audio, pool compaction, an identity for the console (an ATECC608 on the V1 board, signing towards the server), scores sent to the leaderboard.