Skip to the content
PCBKitNew board
4 layers101.6 × 70 mmMicroNES pcb v0.1, the printed circuit board in 3D

MicroNES pcb v0.1

bchelf/microNES1

A microcontroller based emulator to play original NES games over composite video (and HDMI)

Size
101.6 × 70 mm
Copper layers
4
Thickness
1.6 mm
Parts
109
Nets
93
Pads
368
Tracks, vias
973, 165
Pours
6
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
12 Mar 2026
Updated
15 Jun 2026

Overview

MicroNES pcb v0.1 is an open-source printed circuit board by bchelf, from the bchelf/microNES repository on GitHub. It is a 4-layer board of 101.6 × 70 mm with 109 parts on 93 nets, routed with 973 tracks and 165 vias.

It is built around the W25Q128JVSIQ, AMS1117-3.3 and BAT54S, with the AV-5, PTS810SJM250SMTRLFS and ABM8-272-T3 among its other parts. Its parts include 38 resistors, 30 capacitors, 8 ICs, 6 diodes and 3 connectors. It belongs with the retro computing and games boards and the RP2350 boards of this library.

Main components

7

README

README.md

microNES

microNES RP2350 NES emulator hardware

microNES is a small RP2350-based NES emulator project with custom hardware, portable emulator code, and host-side development tools.

The repo now includes a complete KiCad implementation of an RP2350 console-style board, plus firmware for composite video, HDMI output, SD-card ROM loading, controller input, and audio. It also includes host tools for building, running, capturing, and validating the same emulator core on a desktop.

ROM images are not included.

What This Repo Does

  • Runs NES ROMs through a shared C emulator core.
  • Targets RP2350 / Raspberry Pi Pico 2-class hardware.
  • Provides a fully functional KiCad PCB design under hardware/microNES_pcb_v0.1.
  • Outputs analog composite video from the RP2350 using PIO/DMA timing.
  • Outputs HDMI/DVI-style video using the RP2350 HSTX path.
  • Loads ROMs at runtime from SD card, with an optional flash/XIP cache.
  • Supports NES controller input.
  • Produces audio through PWM on the Pico targets, with a MAX98357 I2S path for the TFT audio target.
  • Builds host tools for smoke tests, SDL play, PNG frame dumps, WAV dumps, and ffmpeg video capture.
  • Includes an ESP32-S3 frontend as a separate reference platform.
  • Includes an Emscripten/WebAssembly target stub for browser experiments.

Current Status

The project has moved beyond the original SMB1-only bring-up. The core still prioritizes pragmatic compatibility over perfect NES accuracy, but the repo now contains support for several common mapper families:

  • NROM / mapper 0
  • MMC1
  • UxROM
  • CNROM
  • AxROM
  • GxROM
  • Color Dreams
  • MMC2
  • MMC3
  • mapper 40

The hardware and firmware path is centered on the RP2350 board in hardware/microNES_pcb_v0.1, with composite and HDMI firmware targets in src/pico. The host path remains the fastest way to validate emulator behavior before testing on hardware.

Hardware

The KiCad project lives here:

text
hardware/microNES_pcb_v0.1/

It includes:

  • KiCad schematic and PCB files
  • custom symbols and footprints
  • RP2350 QFN footprint and 3D model support
  • microSD slot support
  • USB-C support
  • NES controller connector footprint
  • custom KiCad footprints for original Nintendo console parts
  • composite output hardware
  • production outputs, BOM, placement files, and Gerbers

The board is designed around harvested original NES console hardware for the user-facing controls and controller interface. It uses the original Nintendo power switch assembly and original NES controller input ports, with custom KiCad footprints made specifically for those salvaged parts.

The older breadboard composite schematic is documented in SCHEMATIC.md. The PCB target is selected in firmware with:

sh
-DMICRONES_BOARD=v0_1

Repo Layout

text
src/common/      Portable emulator core, ROM menu, mappers, CPU, PPU, APU, input
src/host/        Desktop smoke runner, SDL runner, PNG/WAV/video tooling
src/pico/        RP2350 firmware, composite, HDMI, TFT, SD, flash cache, audio
src/esp32s3/     Separate ESP32-S3 frontend/reference implementation
src/web/         Emscripten/WebAssembly browser frontend
hardware/        KiCad PCB design, production files, Gerbers, BOMs
tests/           Emulator test ROMs and menu smoke tests

Build

Host

sh
cmake -S . -B build-host -DMICRONES_PLATFORM=host
cmake --build build-host -j

This builds:

  • build-host/micrones_smoke
  • build-host/micrones_menu_smoke
  • build-host/micrones when SDL3 is available

Run a ROM locally:

sh
./build-host/micrones roms/smb1.nes

Run deterministic smoke validation:

sh
./build-host/micrones_smoke roms/smb1.nes

Capture a frame or video:

sh
./build-host/micrones_smoke roms/smb1.nes 6200000 /tmp/micrones_10s.png
./build-host/micrones_smoke roms/smb1.nes --steps 17670500 --video-out build-host/capture.mp4

RP2350 / Pico

Configure the firmware for the emulator and the custom PCB:

sh
cmake -S . -B build-pico \
  -DMICRONES_PLATFORM=pico \
  -DMICRONES_PICO_VIDEO_MODE=emulator \
  -DMICRONES_BOARD=v0_1 \
  -Dpicotool_DIR=/Users/bchelf/microNES/build/_deps/picotool

Build composite output:

sh
cmake --build build-pico --target micrones_pico_analog -j

Build HDMI output:

sh
cmake --build build-pico --target micrones_pico_hdmi -j

Other firmware targets:

sh
cmake --build build-pico --target micrones_pico_tft -j
cmake --build build-pico --target micrones_pico_tft_max98357 -j
cmake --build build-pico --target micrones_pico_hdmi_test_pattern -j

The Pico firmware loads ROMs from SD at runtime. MICRONES_PICO_ROM_PATH is no longer needed for normal Pico builds.

Web

sh
emcmake cmake -S . -B build-web -DMICRONES_PLATFORM=web
cmake --build build-web -j

The build copies src/web/index.html next to the generated JS/WASM output.

ESP32-S3

sh
cd src/esp32s3
. $IDF_PATH/export.sh
idf.py build

Host Controls

For the SDL runner:

  • Arrow keys or WASD: D-pad
  • L: A
  • K: B
  • Return: Start
  • Tab or right shift: Select

Useful runner options:

sh
./build-host/micrones roms/smb1.nes --vsync
./build-host/micrones roms/smb1.nes --no-vsync --unthrottled
./build-host/micrones roms/smb1.nes --scale 5
./build-host/micrones roms/smb1.nes --dump-wav /tmp/gameplay.wav --dump-wav-seconds 2

Known Limitations

microNES is still an emulator under active development, not a fully accurate general-purpose NES implementation.

  • PPU timing is practical rather than fully cycle-accurate.
  • Sprite overflow and exact secondary OAM behavior are incomplete.
  • APU fidelity is improved but still not perfect.
  • Mapper support exists for several common boards, but compatibility is not expected to match mature NES emulators.
  • Some RP2350 SD-to-flash-cache ROM load paths can still disturb video output and are an active debugging area.

Development Notes

Keep platform boundaries clean:

  • src/common should stay portable.
  • Host-only SDL, PNG, WAV, and ffmpeg code belongs in src/host.
  • Pico SDK, PIO, DMA, HSTX, SD, and flash code belongs in src/pico.
  • ESP-IDF code belongs in src/esp32s3.

The recommended workflow is still host-first: validate behavior with micrones_smoke and the SDL runner, then test the same core on RP2350 hardware.

Parts

109
QtyValueFootprintReferences
14100nFCapacitor_SMD:C_0402_1005MetricC2, C8, C11, C12, C13, C14, C15, C16, C17, C18, C20, C27, C28, C30
9~TestPoint:TestPoint_Pad_1.5x1.5mmTP2, TP3, TP4, TP6, TP7, TP8, TP9, TP10, TP11
8270Resistor_SMD:R_0603_1608MetricR10, R26, R27, R28, R29, R30, R31, R32
610kResistor_SMD:R_0402_1005MetricR15, R21, R33, R35, R36, R37
61kResistor_SMD:R_0402_1005MetricR2, R3, R4, R6, R14, R16
6BAT54SPackage_TO_SOT_SMD:SOT-23D1, D2, D3, D4, D5, D6
510uFCapacitor_SMD:C_0603_1608MetricC1, C5, C19, C26, C29
44.7uFCapacitor_SMD:C_0402_1005MetricC6, C7, C9, C10
4MountingHoleMountingHole:MountingHole_2.7mm_M2.5H1, H2, H3, H4
310nFCapacitor_SMD:C_0402_1005MetricC22, C24, C25
20Resistor_SMD:R_0402_1005MetricR38, R39
215pFCapacitor_SMD:C_0402_1005MetricC3, C4
227Resistor_SMD:R_0402_1005MetricR7, R8
2330Resistor_SMD:R_0402_1005MetricR13, R40
25.1kResistor_SMD:R_0402_1005MetricR11, R12
2AMS1117-3.3Package_TO_SOT_SMD:SOT-223-3_TabPin2U2, U5
2AV-5microNES_footprints:CONN-TH_AV-5AV1, AV2
2PTS810SJM250SMTRLFSmicroNES_footprints:KEY-SMD_4P-L4.2-W3.2-P2.20-LS4.6SW3, SW4
2~microNES_footprints:NES_1x7_CustomPitchU6, U7
1100Resistor_SMD:R_0402_1005MetricR24
1100nFCapacitor_SMD:C_0805_2012MetricC21
1100uFCapacitor_SMD:CP_Elec_6.3x5.4C23
1120Resistor_SMD:R_0402_1005MetricR25
115Resistor_SMD:R_0402_1005MetricR19
120kResistor_SMD:R_0402_1005MetricR34
122Resistor_SMD:R_0402_1005MetricR22
1220Resistor_SMD:R_0402_1005MetricR23
12N7002Package_TO_SOT_SMD:SOT-23Q1
13.3uHmicroNES_footprints:IND-SMD_L2.0-W1.6_AOTA-B201610S3R3-101-TL1
133Resistor_SMD:R_0402_1005MetricR5
1470Resistor_SMD:R_0402_1005MetricR20
168Resistor_SMD:R_0402_1005MetricR18
17.5Resistor_SMD:R_0402_1005MetricR17
1ABM8-272-T3Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mmY1
1HDMI_EConnector_Video:HDMI_A_Molex_208658-1001_HorizontalJ3
1RP2350_60QFNmicroNES_footprints:RP2350-QFN-60-1EP_7x7_P0.4mm_EP3.4x3.4mm_ThermalViasU1
1SM03B-SRSS-TBConnector_JST:JST_SH_SM03B-SRSS-TB_1x03-1MP_P1.00mm_HorizontalJ4
1TF PUSHmicroNES_footprints:TF-SMD_TF-PUSHCard1
1TestPointTestPoint:TestPoint_Pad_2.0x2.0mmTP5
1TestPointTestPoint:TestPoint_Pad_1.5x1.5mmTP1
1USB_C_Receptacle_USB2.0_16PmicroNES_footprints:USB-C_SMD-TYPE-C-31-M-12_1J1
1W25Q128JVSPackage_SO:SOIC-8_5.3x5.3mm_P1.27mmU3
1~microNES_footprints:NES_Power_Reset_LED_5pinU8
1~Package_TO_SOT_SMD:SOT-23-6U4

The 108 most common of 109 parts.

Questions

How big is the MicroNES pcb v0.1 PCB?

It measures 101.6 × 70 mm and has 4 copper layers, 1.6 mm thick.

What parts does the MicroNES pcb v0.1 use?

109 parts, built around the W25Q128JVSIQ, AMS1117-3.3, BAT54S and AV-5. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the MicroNES pcb v0.1 KiCad files?

From the bchelf/microNES repository on GitHub, at the commit this page was made from: the board is hardware/microNES_pcb_v0.1/microNES_pcb_v0.1.kicad_pcb and its schematic hardware/microNES_pcb_v0.1/microNES_pcb_v0.1.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the MicroNES pcb v0.1 design in my own project?

Its repository states no licence, so its author keeps all rights: ask bchelf before reusing the design.

Similar boards

  • 4 layers72 × 51.1 mmEsp32s3-audio streamer, the printed circuit board in 3D

    Esp32s3-audio streamer

    wemaxon/esp32-audio-streamer

    Hardware design for a WiFi/Bluetooth audio streamer using the esp32 microcontroller and the PCM5102A DAC, intended to be used with squeezelite firmware.

    63 parts
  • 4 layers44.3 × 95.9 mmAura mon, the printed circuit board in 3D

    Aura mon

    nrwiersma/aura-mon

    RP-2350 Energy Data Logger

    119 parts1
  • 4 layers51.1 × 40.7 mmKbd nes v2, the printed circuit board in 3D

    Kbd nes v2

    bchelf/keyboard-nes

    Remapping order: Right, Left, Down, Up, A, B, Select, Start

    53 parts
  • 4 layers58 × 70 mmProbelab, the printed circuit board in 3D

    Probelab

    enkhbold470/kicad-projects

    Five KiCad 10 boards (4- and 6-layer): ESP32-S3 industrial gateway, USB-C PD bench supply, RP2040 logic analyzer, FOC motor controller, iCE40 FPGA board.

    88 partsCERN-OHL-S-2.0
  • 2 layers86.1 × 66.4 mmStereoPlasmaSpeakersV2, the printed circuit board in 3D

    StereoPlasmaSpeakersV2

    Firestorm108/Plasma-Speakers-V2

    Dual flyback transformers that produce audio through the modulation of high frequency plasma arcs.

    72 parts
  • 4 layers40 × 40 mmEnc encoder, the printed circuit board in 3D

    Enc encoder

    ROAR-QUTRC/perseus-v3

    The code base for the QUT Robotics Club ROAR teams rover Perseus starting 2026

    87 parts10
  • 4 layers61 × 79 mmRP2350 80QFN minimal, the printed circuit board in 3D

    RP2350 80QFN minimal

    Sphyrna-029/Pico-Pilot

    A simple auto pilot for land/water based robots based on the Raspberry Pi rp2350B/2354B

    75 parts3