Run classic Doom on a Raspberry Pi Pico with Pimoroni LCD display!
This project ports Doom to the RP2040 microcontroller using the PicoDoom engine and Pimoroni's graphics libraries.
Current Status: ✅ Phase 1, 2, 3 Complete - Ready for Hardware Testing
- ✅ Phase 1: Project Setup & Build System
- ✅ Phase 2: Doom Engine Integration Framework
- ✅ Phase 3: Rendering & WAD Loading Framework
- 🚧 Phase 4: Hardware Testing & Optimization
- 📋 Phase 5: Polish & Audio
- Display: Pimoroni ST7789 (320×240) with double-buffering
- Input: 4-button interface with debouncing & Doom key mapping
- Performance: Real-time FPS tracking and debug output
- Architecture: Dual-core (Core 0: game logic, Core 1: display driver)
- Test Patterns: 3 interactive patterns (color bars, checkerboard, gradient)
- Color Accuracy: Full RGB565 rendering with proper color conversion
- Frame Rate: 30+ FPS minimum (verified in testing)
- Interactive: Switch patterns with weapon buttons
- WAD Loader: Full WAD file parsing infrastructure ready
- Input System: Complete button mapping to Doom controls
- Display Pipeline: Render → Buffer Swap → Display
- Raspberry Pi Pico (RP2040)
- Pimoroni Pico Display 2.0 (320×240, ST7789)
- Note: Project targets this specific display
- USB cable for power and programming
- (Optional) Speaker/buzzer for audio (Phase 5)
- Raspberry Pi Pico SDK (v1.5.0+)
- ARM GCC cross-compiler (14.3+)
- CMake (3.13+)
- Python 3.x
- Git
# Clone the repository
git clone <repository-url>
cd PICO-DOOM
# Initialize submodules
git submodule update --init --recursive
# Create build directory
mkdir -p build && cd build
# Configure and build
cmake ..
make
# Firmware output: pico_doom.uf2 (ready to flash!)Latest Build: November 17, 2025
Firmware: pico_doom.uf2 (87 KB)
Compilation: ✅ Clean (no errors/warnings)
# Method 1: Bootloader Mode (drag & drop)
1. Hold BOOTSEL button on Pico
2. Connect USB (still holding BOOTSEL)
3. Drag build/pico_doom.uf2 to PICO-RP2 drive
4. Pico reboots automatically
# Method 2: picotool
picotool load build/pico_doom.uf2Once flashed:
- USB serial output shows initialization messages
- Display shows test pattern (color bars by default)
- Press Weapon_Up button to cycle to next pattern
- Press Weapon_Down button to cycle to previous pattern
Available patterns:
- Pattern 0: Color Bars (6 vertical color stripes)
- Pattern 1: Checkerboard (8×8 pixel black/white pattern)
- Pattern 2: Gradient (animated RGB gradient)
Current Test Mode Controls:
- Weapon_Up Button (X): Cycle to next test pattern
- Weapon_Down Button (Y): Cycle to previous test pattern
- All buttons: Monitored and logged via USB serial
Full Doom Controls (coming Phase 4):
- A Button: Fire weapon / Use door
- B Button: Open / Activate
- X Button: Change weapon / Next pattern (test mode)
- Y Button: Toggle map / Prev pattern (test mode)
- Combined: Movement, strafing, and turning
- Build system and project architecture
- Pimoroni ST7789 display driver (320×240)
- Button input with debouncing
- Test pattern rendering (3 patterns)
- WAD file loader framework
- Game loop infrastructure
- Dual-core rendering pipeline
- Hardware testing validation
- WAD file integration
- Level geometry rendering
- Sprite rendering
- Player movement
- Enemy sprites
- Full gameplay (weapons, combat)
- Audio/music system
- Performance optimization
- Memory profiling
- Polish and refinement
PICO-DOOM/
├── src/
│ ├── main.c (Entry point & game loop)
│ ├── doom_engine.c (Rendering engine with test patterns)
│ ├── wad_loader.c (WAD file loading)
│ ├── display/
│ │ └── display_adapter.c (ST7789 SPI driver)
│ └── input/
│ └── input_handler.c (Button debouncing & mapping)
├── include/
│ ├── doom_engine.h (Rendering API)
│ ├── wad_loader.h (WAD loading API)
│ ├── display_adapter.h (Display API)
│ └── input_handler.h (Input API)
├── lib/
│ ├── picodoom/ (Chocolate Doom source)
│ └── pimoroni-pico/ (Display libraries)
├── docs/
│ ├── BUILD_PROGRESS.md
│ ├── PHASE2_COMPLETION.md
│ ├── PHASE3_RENDERING.md
│ ├── BUILDING.md
│ └── WAD_SETUP.md
├── CMakeLists.txt (Build configuration)
├── README.md (This file)
└── build/
└── pico_doom.uf2 (Compiled firmware ⚡)
- PicoDoom: Based on Graham Sanderson's excellent RP2040 Doom port
- Chocolate Doom: Foundation for WAD loading and engine
- id Software: Original Doom game and engine design
- Pimoroni: Excellent display hardware and libraries
- Raspberry Pi Foundation: Pico SDK and RP2040 microcontroller
This project respects the licenses of all components:
- Doom source code: GPL-2.0
- Pico SDK: BSD-3-Clause
- Pimoroni libraries: MIT
- PICO-DOOM: GPL-2.0 (compatible with Doom)
See individual component licenses for details.
- Flash firmware to Pico using
pico_doom.uf2 - Test display patterns via USB serial console
- Verify input by pressing buttons
- Monitor performance (FPS and frame times)
- Report results to guide Phase 4 work
Check out:
.github/copilot-instructions.md- Development guidelinesdocs/BUILDING.md- Detailed build setupdocs/BUILD_PROGRESS.md- Current status and milestones
Made with ❤️ for the RP2040 community
Current Status: Phase 1, 2, 3 Complete - Ready for Hardware Testing! 🎮
