pico-pcePlus is a PC Engine / TurboGrafx-16 emulator for RP2350-based microcontrollers. It is built on the pce-go emulation core from retro-go by ducalex, integrated with the video, audio, menu, and SD card framework from pico-infonesPlus.
Important
An RP2350 board is required. The original RP2040 (Pico 1) is not supported.
This project is part of a family of Raspberry Pi Pico emulator projects:
- NES: pico-infonesPlus
- Sega Master System / Game Gear: pico-smsplus
- Game Boy / Game Boy Color: pico-peanutGB
- Sega Mega Drive / Genesis: pico-genesisPlus
- HuCard ROMs — Standard PC Engine / TurboGrafx-16 cartridge dumps (
.pce) are loaded directly from the SD card. - SuperGrafx (SGX) — SuperGrafx titles are recognised and dispatched to the second VDC. SuperGrafx support requires PSRAM, and the board must be overclocked to 378 MHz to reach the correct framerate and audio. Overclocking to 378 MHz is only possible on configurations that use HSTX for video, such as the Adafruit Fruit Jam. PicoDVI configurations like the Waveshare RP2350 PiZero need an exact system clock of 252 MHz to produce 60 fps, which leaves no headroom to overclock for SuperGrafx. On those boards SuperGrafx games run at a reduced framerate and without audio.
- CD-ROM² — CD-ROM² and Super CD-ROM² games are supported, including CD-DA audio playback and ADPCM streaming. CD-ROM² playback requires PSRAM and a System Card BIOS supplied by the user.
- Audio CDs — Regular music CDs can be played with the CD player built into the System Card BIOS. Put a CUE/BIN or CHD image of a music CD on the SD card and start it like a CD game: the track list appears and playback, track skip, pause and the level meters all work.
- Save states — Manual save and load slots are available through the in-game menu. An optional auto-save mode stores a state when the game exits and offers to resume it the next time the same ROM is launched. State files are stored on the SD card under
/savestates/PCE/<CRC32>/. - Backup RAM (BRAM) — CD-ROM² games that use the System Card's BRAM (for in-game save data) have it persisted automatically alongside the save states.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Two disc-image formats are accepted:
- CUE/BIN — Uncompressed CD images. This is the recommended format.
- CHD — Compressed disc images (MAME's CHD format). CHD images are decompressed sector-by-sector at run time and are therefore generally slower than CUE/BIN. They are useful when SD card space is limited; otherwise CUE/BIN is preferred.
Each disc image (and its associated tracks for CUE/BIN) should be placed in its own folder on the SD card.
Note on SD card speed: CD playback is sensitive to SD card speed, especially when using CHD images that must be decompressed in real time. v0.2 reduced the impact considerably, but a slow or aging card can still cause occasional stutter or audio glitches; a faster card resolves it.
- Prepare an SD card formatted as FAT32 or exFAT
- Transfer ROM files to the card, preferably in /roms/PCE and CD games in /roms/PCE/CD (subdirectory organization is supported).
- Optionally include metadata files for game information
- Insert the SD card into the device
- Use the menu to browse, select, and play games. Save data is automatically persisted to the SD card. The last 20 games that were started are kept in a recently played list, one button press away in the menu.
The emulator runs on RP2350-based boards in two configurations:
- RP2350 without PSRAM — Supports HuCard ROMs, save states, and metadata display.
- RP2350 with PSRAM — In addition to the above, enables SuperGrafx titles, CD-ROM² playback (CUE/BIN or CHD), Backup RAM persistence, and audio recording.
For board-by-board wiring, supported display modes, and which UF2 file to flash, refer to the pico-infonesPlus documentation. The set of supported boards and their pinouts is identical between the two projects.
A board and its breakouts can also be built into a finished little console on one of the three custom PCBs.
Three community PCB designs turn a supported board and its breakouts into a finished little console, each with an optional 3D-printed case. They are simply a neater way to build hardware this emulator already supports, so nothing changes in the firmware: flash the binary for that configuration and you are done.
| Design | Board it carries | Build | Gerber archive | Designed by |
|---|---|---|---|---|
| PicoNES | Pico 2, Pico 2 W or Pimoroni Pico Plus 2 | -c2 |
pico_nesPCB_v2.6.zip |
John Edgar Park |
| PicoNES Mini | Waveshare RP2350-Zero | -c6 |
Gerber_PicoNES_Mini_PCB_v2.0.zip |
Gavin Knight |
| PicoNES Micro | Waveshare RP2350-USB-A | -c9 |
Gerber_PicoNES_Micro_v1.2.zip |
Gavin Knight |
All three archives are attached to every release of this project and also live in pico_shared/PCB. Upload the zip as-is to a PCB manufacturer of your choice; PCBWay and JLCPCB are both good options.
The designs come from pico-infonesPlus and kept their NES-flavoured names, but there is nothing NES-specific about them — they are DVI, microSD and controller wiring, and this emulator runs on them just as well. The PicoNES and PicoNES Mini both have two controller ports, so the second player of a two-player PC Engine game has a pad; the PicoNES Micro is a single-controller design.
Important
The PicoNES also fits an original RP2040 Pico, and the PicoNES Mini exists in an RP2040-Zero flavour. Neither is of use here — this emulator requires an RP2350.
Of the three boards, only the Pimoroni Pico Plus 2 on the PicoNES has PSRAM. That is what CD-ROM² games, SuperGrafx titles and audio recording need; on a Pico 2, a Waveshare RP2350-Zero or a Waveshare RP2350-USB-A the emulator plays HuCard ROMs.
Note
Sellers on AliExpress have copied the PicoNES design and sell ready-made boards. For questions about those, contact the seller.
The original design, by @johnedgarpark. It carries the Pico, the DVI and microSD breakouts and up to two NES controller ports. It is also the only one of the three that takes an interchangeable Pico-format board, which is what makes a Pimoroni Pico Plus 2 — and with it PSRAM, CD-ROM² and SuperGrafx — an option. The current design is v2.6.
Design v2.6 added through-holes, so there are now two ways to fit the board:
| Mounting | Boards | Design version |
|---|---|---|
| Soldered flat onto the PCB, no headers | Pico 2, Pico 2 W | any |
| Male headers plugged into the through-holes | Pico 2, Pico 2 W, Pimoroni Pico Plus 2 | v2.6 or later |
Important
A Pimoroni Pico Plus 2 needs v2.6 and male headers. On v2.1 and older designs the board has to lie flat against the PCB, which the SP/CE connector on the back of the Pimoroni Pico Plus 2 prevents.
Note
Soldering skills are required. Solder every connection from the Pico to the PCB, including the ones on the short right-hand side of the board — those are ground.
- One of the following, mounted as described above:
- Raspberry Pi Pico 2 or Pico 2 W without headers, soldered flat.
- Raspberry Pi Pico 2, Pico 2 W or Pimoroni Pico Plus 2 with male headers soldered on (these fit), plugged into the through-holes.
- Adafruit DVI Breakout Board — For HDMI Source Devices
- Adafruit Micro SD SPI or SDIO Card Breakout Board — 3V ONLY!
- For controllers on the GPIO ports:
- one or two NES controller ports — populate both to give player 2 a pad
- NES or SNES controllers
- Micro USB to OTG Y-cable if you want to use a USB game controller — it powers the board and connects the controller at the same time.
- Micro USB power supply.
- Optional: an on/off switch, such as this one.
Note
A plain NES controller has no Button3, so it cannot open the recently played list directly — use the settings menu entry instead. The sockets speak the SNES protocol as well, so an SNES pad with a SNES-to-NES adapter cable — or one you make yourself — is the better choice.
picopcePlus_AdafruitDVISD_pico2_arm.uf2, for the Pico 2, the Pico 2 W and the Pimoroni Pico Plus 2 alike. The Pimoroni Pico Plus 2 needs no separate build: the emulator reads the real flash size from the chip at boot and detects PSRAM at runtime, so the same image adapts to whichever board is plugged in.
Gavin Knight (DynaMight1124) designed an NES-like enclosure for this PCB: thingiverse.com/thing:6689537. The v2.0 design has a base, a power-switch part and a choice of two top covers — one with a button that reaches the BOOTSEL button so firmware can be updated without opening the case, one without. Print the files that match the PCB version you own; Gavin's Thingiverse page has the details.
Important
If the board is mounted with male headers, download the latest top cover. Headers raise the board, and only the newest cover leaves room for the USB cable — the older ones assume a Pico soldered flat onto the PCB.
For the full photo gallery and assembly detail, see the PCB section of the pico-infonesPlus documentation.
A smaller take on the same idea by Gavin Knight (DynaMight1124), built around a Waveshare RP2350-Zero and two NES controller ports. It uses cheaper but considerably harder to solder parts, so it is a more advanced project than the PicoNES — if you are unsure of your soldering, start with that one instead. The current design is v2.0 (Gerber_PicoNES_Mini_PCB_v2.0.zip), which improved the SD slot and the components around the HDMI port.
Flash picopcePlus_WaveShareRP2350ZeroWithPCB_arm.uf2. The RP2350-Zero has no PSRAM, so this build plays HuCard ROMs.
Note
Good soldering skills are required, especially around the HDMI portion: plenty of flux, a fine tip and solder wick. The recommended order is the resistor arrays first, then the HDMI port, then the Pico or the microSD adaptor, and the NES ports last — they can be hard to push into the PCB.
The build guide and the full component list are on Instructables: https://www.instructables.com/PicoNES-RaspberryPi-Pico-Based-NES-Emulator/
Also by Gavin Knight: thingiverse.com/thing:7041536. The same page still carries the older v1.0 PCB design files, gerber and BOM. Without a printer of your own, a local printing service or a professional one such as PCBWay or JLCPCB will produce it — the professional finishes are excellent.
The smallest of the three, again by Gavin Knight: a Waveshare RP2350-USB-A board on a PCB barely larger than the USB port itself, with a single player controlling the console over USB. The current design is v1.2 (Gerber_PicoNES_Micro_v1.2.zip).
Flash picopcePlus_WaveShare2350USBA_arm_piousb.uf2. The game controller plugs into the USB-A port; the USB-C port is for power and for flashing the firmware. The RP2350-USB-A has no PSRAM, so this build plays HuCard ROMs, and the driver recognises only one USB controller, so two-player games cannot be played on it.
Note
Because of the size, micro-soldering skills are required — the design uses 0603 SMD components. This is the most demanding of the three builds.
The build guide is on Instructables: https://www.instructables.com/PicoNES-RaspberryPi-Pico-Based-NES-Emulator/
CD-ROM² games require a System Card BIOS to boot. The BIOS file must be supplied by the user; it is not distributed with the emulator.
- Create a
/bios/folder in the root of the SD card and place one or more BIOS files there (with a.pceextension, or namedcd_bios.rom). - Alternatively, place a BIOS file alongside a disc image; this takes precedence over
/bios/and allows a per-game override.
The emulator identifies BIOS files by CRC32 and, when several are available, selects the most capable variant automatically. For maximum compatibility the Super CD-ROM System v3.0 (JP) or the Arcade Card Pro (JP) BIOS is recommended.
Note
Without a recognised BIOS file in /bios/ (or alongside the disc image), CD-ROM² games will fail to load.
The emulator can display box art and a short text description for each ROM when a metadata pack is present on the SD card. With the pack installed, pressing START on a ROM in the file browser displays its metadata; the screensaver also shows random box art.
A metadata pack can be downloaded from the releases page and extracted to the root of the SD card. It is installed under:
/metadata/PCE/
├── images/ (box art, named by ROM CRC32)
└── descr/ (text descriptions, named by ROM CRC32)
The emulator presents the PC Engine controller mapping on any connected USB controller, NES/SNES controller (directly wired), or Wii Classic Controller (via I²C). Supported USB devices include Sony DualShock 4 / DualSense, Sega Genesis Mini 1 and 2, Retro-bit 8-button Genesis-USB, PlayStation Classic, USB keyboards, and XInput-compatible controllers (Xbox 360, Xbox One, 8BitDo, and similar).
The PC Engine controller has a D-pad, two action buttons (I and II), and two system buttons (SELECT and RUN).
During gameplay, SELECT + RUN opens the in-game settings menu. All other in-game adjustments — screen mode, scanlines, FPS overlay, VU meter, external (I²S) audio output, volume, save and restore state, rapid-fire, audio recording, and so on — are reached from this menu.
In the file browser, Button2 opens a folder or starts a game, Button1 goes back to the parent folder, START shows metadata and box art, SELECT opens the settings menu, and Button3 opens the recently played list. Button3 is X on a SNES or Wii Classic pad, Y on XInput, Triangle on PlayStation and C on Genesis; a plain NES controller has no Button3.
Two-player games are supported. Without a USB controller, the two GPIO controller ports are player 1 and player 2. With a USB controller connected, that pad becomes player 1 and either GPIO port (or a Wii Classic Controller) drives player 2.
The menu keeps a list of the last 20 games that were started, most recent first. Open it with Button3 in the file browser, or with the Recently played entry at the top of the settings menu. That entry is only present when the settings menu is opened from the file browser, not from inside a running game — which is also the route for pads without a Button3.
In the list:
| Button | Action |
|---|---|
| UP/DOWN | Select a game. |
| Button2 | Start the highlighted game. |
| Button1 | Close the list and return to the file browser. |
| SELECT | Remove the highlighted game from the list. Asks for confirmation first. This only removes the entry; the file on the SD card is left alone. |
| START | Show metadata and box art (when available). |
Games are added automatically when they are started, so nothing has to be enabled. HuCard, SuperGrafx and CD games all appear in the list; starting a game that is already in it moves it back to the top. The list closes by itself after a minute without input.
The list is kept in /recent_PCE.txt in the root of the SD card, as plain text with one game per line. It survives a reboot and can be read, edited or deleted on a PC. Deleting the file simply empties the list, and a damaged file is treated as an empty list — unlike the settings file, nothing else is reset. Each emulator running under pico-bootLoader keeps its own list.
If a game was moved, renamed or deleted on the SD card in the meantime, the list says so instead of starting it. Use SELECT to remove such an entry.
On boards without PSRAM, one entry can be tagged [READY]. That is the game whose ROM is currently written to flash, which is the one that starts without waiting for the flashing step. As of v0.4 a ROM that is already in flash is not written again, so restarting that game is immediate.
- The Raspberry Pi Pico SDK, with the
PICO_SDK_PATHenvironment variable set. - CMake 3.13 or later.
- The ARM GCC toolchain (and, for RISC-V builds, the RISC-V toolchain in
$PICO_SDK_PATH/toolchain/RISCV_RPI_2_0_0_2/bin). picotoolon thePATH.
git clone --recurse-submodules https://github.com/fhoedemakers/pico-pcePlus.git
cd pico-pcePlusRun ./bld.sh -h to see the available build options for a single configuration, or ./buildAll.sh to build every supported configuration and collect the resulting UF2 files in the releases folder. For the mapping between configuration numbers and specific boards, consult the pico-infonesPlus documentation.
- Hold the BOOTSEL button on the RP2350 board while connecting it to a computer via USB.
- The board mounts as a USB mass-storage device.
- Copy the appropriate
.uf2file to the device. - The board reboots automatically and starts the emulator.
This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.
- pce-go — PC Engine / TurboGrafx-16 emulation core, by ducalex (part of retro-go).
- pico-infonesPlus — shared video, audio, menu, and SD card infrastructure, by Frank Hoedemakers.
- Mesen2 — used as a reference for the PC Engine CD ADPCM decoder port.
- PicoDVI — DVI output library by Wren6991.
- pico_lib — PicoDVI audio support by Shuichi Takano.
- pico_hdmi — HSTX HDMI/DVI driver with audio by fliperama86.
- libchdr — CHD disc-image decompression, with its bundled miniz, LZMA SDK, and zstd dependencies.
- pico_fatfs — FatFs SD card driver by elehobica.
- PicoPlusPsram — PSRAM driver by AndrewCapon.
- lwmem — lightweight memory allocator by MaJerle.
- TinyUSB — USB host stack.
- Pico-PIO-USB — software USB host implementation on PIO, by sekigon-gonnoc, used to expose a second USB port for controllers.
- tusb_XInput — XInput controller driver by Ryzee119.
- NES gamepad and Wii Classic Controller support contributed by PaintYourDragon and Adafruit.
- PCB design by John Edgar Park.
- Additional PCB design and 3D-printable cases (for both PCBs and the WaveShare RP2040/RP2350-PiZero) by Gavin Knight.
- Metadata files provided by Gavin Knight, based on Ducalex's retro-go-covers.
- Anthropic Claude (Opus 4.6 and 4.7) assisted with the PSG rewrite, the ADPCM decoder port, CHD integration, SuperGrafx work, and general bug fixes.





