NOVA RAID — pixel-art wordmark next to a framed gameplay capture

A complete retro arcade space shooter running bare-metal on the Raspberry Pi Pico W and the 52Pi Pico Breadboard Kit Plus — dual-core C renderer, analog joystick, buzzer soundtrack, WS2812 lighting, and high scores that survive the power switch.

Download UF2 Source on GitHub

The game

Escalating waves, four enemy behaviours, power-ups, nova bombs, combo scoring — and the Void Dreadnought every fifth wave. Frames below are captured from the actual game code by the repository's host harness.

Splash screen
Splash — starfield, wordmark, jingle
Gameplay
Wave combat with HUD: score, combo, wave, lives, bombs
Boss fight
Void Dreadnought — three phases, health bar
Pause
Pause dialog over the dimmed battlefield
Initials entry
Callsign entry for the hall of fame
Hall of fame
Persistent top-5 hall of fame
Diagnostics
Built-in hardware diagnostics screen

On hardware

Owner-supplied photos of NOVA RAID running on the EP-0172 kit.

NOVA RAID splash screen running on the EP-0172 kit
Splash screen on the 3.5" TFT
NOVA RAID main menu running on the EP-0172 kit
Main menu on the physical controls board
NOVA RAID gameplay running on the EP-0172 kit
Wave combat running on the kit
NOVA RAID hall of fame running on the EP-0172 kit
Hall of fame screen on device
NOVA RAID diagnostics screen running on the EP-0172 kit
Diagnostics with ADC, buttons, LEDs and colour bars

The engineering

RP2040, 264 KiB of RAM, no GPU, no FPU — and a 480×320 panel behind a single SPI lane.

Dual-core pipeline

Core 0 simulates and renders a 240×160 framebuffer at a fixed timestep; core 1 pixel-doubles and streams it to the ST7796 with double-buffered DMA. The ~39 ms SPI transfer overlaps the next frame's simulation.

Fixed-point everything

24.8 fixed-point positions and velocities, table-driven sine motion. Soft-float would blow the frame budget on a Cortex-M0+.

Safe flash persistence

Top-5 scores in the last 4 KiB sector, written with the second core locked out and IRQs off, validated by magic number.

Portable game core

Gameplay code touches hardware only through a small HAL, so the identical sources build on a desktop for CI runs and pixel-true frame capture.

Feedback engines

Priority-based single-channel buzzer sequencer; WS2812 base modes with transient event overlays; panel LEDs for bomb-ready and low health.

Everything documented

Pin map, logical schematic, block diagram, architecture notes, troubleshooting, and a diagnostics mode for hardware bring-up.

The hardware

52Pi/GeeekPi Pico Breadboard Kit Plus (EP-0172) with a Raspberry Pi Pico W. No wiring — every peripheral is on the kit.

Hardware block diagram
Controls diagram
PinsPeripheral
GP2/3/4/5/6/73.5" TFT 480×320, ST7796S, SPI0 @ 62.5 MHz
GP26 / GP27Joystick X / Y (ADC)
GP15 / GP14Fire / Nova bomb buttons (active low)
GP13Piezo buzzer (PWM)
GP12WS2812 RGB LED (PIO)
GP16 / GP17Panel LEDs D1 / D2

Verified on the author's physical EP-0172: display init and SPI at 62.5 MHz, gameplay, joystick, buttons, RGB LED and panel LEDs all confirmed working (hardware photos in the repository). The first on-hardware run exposed one defect — the panel displayed a colour negative — fixed in v1.0.1 by sending INVON during init, as documented in the release notes. Board-lot variations (rotation, joystick orientation, display controller) remain one-line settings in src/config.h, and the built-in diagnostics screen shows exactly which to change.

Get it running

  1. Download nova_raid.uf2 from the latest release.
  2. Hold the Pico's BOOTSEL button while plugging in the USB cable — a drive named RPI-RP2 appears.
  3. Drag the UF2 onto the drive. The board reboots straight into the splash screen.
  4. Open DIAGNOSTICS from the menu for a two-minute hardware check, then start the mission.

Building from source, all three OSes: build & flash guide.