Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,792 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pico-infonesPlus.

Introduction

pico-infonesPlus is a NES (Nintendo Entertainment System) emulator for Raspberry Pi Pico, Pico 2, and other RP2040/RP2350-based microcontrollers. It provides NES emulation with SD card support, an integrated menu system, and HDMI video output, enabling users to build compact, affordable retro gaming systems.

Features

  • NES Emulation – Execute NES ROM files directly from an SD card
  • SD Card Menu System – Browse and launch games from an on-screen menu interface
  • Dual Controller Support – Two simultaneous controllers for multiplayer gameplay (details)
  • Save State Management – Automatic battery-backed SRAM persistence and manual save states
  • Famicom Disk System – Support for FDS game images with user-supplied BIOS. More info on this in the FDS Games section below.
  • Multi-Region Support – NTSC, PAL, and Dendy region compatibility
  • NSF Audio Playback – Play NES music files (.nsf) with visual VU-meter overlay. More info on this in the Playing NSF Audio Files section below.
  • WAV Audio Playback – WAV (.wav) format audio playback in the menu (RP2350 only). More info on this in the WAV Music Playback in Menu section below.
  • Flexible HardwareCompatible with standard DVI/HDMI breakout boards, with optional custom PCB and 3D-printed case
  • Multi-Emulator Console – Can run under pico-bootLoader alongside other emulators and Doom, selectable from an on-screen menu (RP2350 only)

Regional Support

Platform NTSC PAL Dendy
RP2350 ✓ (native speed) ✓ (native speed, untested)
RP2040 ✓ (60Hz) ✓ (60Hz, untested)

Note: RP2040 boards operate PAL/Dendy games at 60Hz instead of 50Hz due to hardware constraints.

Setup Overview

  1. Prepare an SD card formatted as FAT32 or exFAT
  2. Transfer NES ROM files to the card. The file browser starts in /roms/NES, so this is the recommended location. If that folder does not exist, the browser falls back to the root of the card. Subfolders are supported.
  3. Optionally include metadata files for game information
  4. Insert the SD card into the device
  5. Use the menu to browse, select, and play games. Save data is automatically persisted to the SD card.

Famicom Disk System (FDS) Games

To enable FDS game support, provide your own BIOS file:

  1. Copy the FDS BIOS file to the /bios directory on your SD card
  2. Name the file: fds-bios.rom

Note that FDS games can only be played on RP2350.

FDS ROM images will then be available alongside NES ROMs in the menu.

For more info on FDS Game see the FDS section in this README.

Project Information

This project is based on Infones by Jay Kumogata, ported to Raspberry Pi Pico by Shuichi Takano. This implementation extends the core emulator with comprehensive SD card integration, menu functionality, and additional enhancements.

For detailed setup instructions, refer to the Setup section. For hardware configurations and controller options, consult Possible Configurations and Gamecontroller Support. Additional guidance is available in the Adafruit tutorial.

There is also an emulator port for the Sega Master System/Sega Game Gear, Nintendo DMG Game Boy/Game Boy Color and Sega Mega Drive/Genesis. You can find them here:


Video

Click on image below to see a demo video.

Video


Possible configurations

You can use it with these RP2040/RP2350 boards and configurations:

  • A custom printed circuit board (PCB) designed by @johnedgarpark. (requires soldering) Up to two NES controller ports can be added to this PCB. Can also be used with a USB game controller. You can 3D print your own NES-like case for the PCB. The current design (v2.1) requires a Raspberry Pi Pico or Pico 2 without headers, soldered flat onto the board.

  • An additional PCB design for Waveshare RP2040 & RP2350 Zero including case design by DynaMight1124 based around cheaper but harder to solder components for those that fancy a bigger challenge. It also allows the design to be smaller.

  • A further PCB design has also been created for the new Waveshare RP2350 USB A board, this allows a very small PicoNES console to be made using USB control pads only. By far the most challenging to solder, if that's your thing!

  • Adafruit Feather RP2040 with DVI (HDMI) Output Port. For use with a USB game controller, up to two legacy NES controllers, or even a Wii Classic controller. Requires these add-ons:

  • Waveshare RP2040-PiZero Development Board

    For use with a USB game controller, up to two legacy NES controllers, or a Wii Classic controller. (No soldering required)

    You can 3D print your own NES-like case for this board. This does require some soldering.

  • Waveshare RP2350-PiZero Development Board Supports the optional PSRAM chip. When installed, the emulator loads ROMs from PSRAM instead of flash memory for significantly faster performance. Boards that combine PSRAM with a non-Winbond flash chip need a one-time fix first, see PSRAM with a non-Winbond flash chip. Fully functional even without PSRAM.

  • Adafruit Metro RP2350 Supports the optional PSRAM chip. When installed, the emulator loads ROMs from PSRAM instead of flash memory for significantly faster performance. Fully functional even without PSRAM.

  • Pimoroni Pico Plus 2

    Can be used in two ways:

    The PSRAM on the board is used instead of flash to load the ROMs from SD.

  • Adafruit Fruit Jam No additional hardware is required apart from a USB gamepad. Audio is output through the monitor or the included speaker, with the option to connect external speakers and a Wii Classic controller via STEMMA QT. The PSRAM on the board is used instead of flash to load the ROMs from SD.

  • SpotPear HDMI See the downloads on the releases page for the correct binary to use with this board.

  • Murmulator M1 and M2 boards. See the downloads on the releases page for the correct binary to use with these boards.

See below to see how to set up your specific configuration.


Gamecontroller support

Depending on the hardware configuration, the emulator supports these game controllers. In some configurations, a USB-Y cable is needed to both connect power and a game controller to the USB port.

USB game Controllers

  • Sony Dual Shock 4
  • Sony Dual Sense
  • BUFFALO BGC-FC801 connected to USB - not tested
  • Genesis Mini 1 and 2
  • Retro-bit 8 button Genesis-USB
  • PlayStation Classic
  • Keyboard
  • XInput type of controllers like Xbox 360 and Xbox One controllers and other XInput compatible controllers like 8bitDo.
  • Mantapad, cheap NES and SNES USB controllers from AliExpress. Although cheap and working i do not recommended them.

See also troubleshooting USB controllers below

Note

There is some input lag when using USB controllers.

Optional Second USB-Port for game controller use.

In some configurations, a second USB port is available for connecting a USB game controller. The built-in USB port remains dedicated to power and firmware flashing, so there is no need for a USB-Y cable.

This feature is enabled by default on the Adafruit Fruit Jam, the Waveshare RP2350-PiZero and the Waveshare RP2350-USB A. For other boards, you’ll need to build the firmware from source to enable it, as the pre-built binaries do not include this option.

For more info, see pio_usb.md.

Legacy controllers

  • One or optionally two original NES controllers for two player games. In some configurations, soldering is required.
  • Original SNES controllers can be connected to the NES controller port(s) as well. The emulator detects automatically whether an NES or a SNES controller is attached, so no configuration is needed.
  • Wii Classic controller: Adafruit Feather RP2040, WaveShare RP2040 Pi-Zero, Adafruit Metro RP2350, Adafruit Fruit Jam boards only

Parts list for legacy controllers


About two player games

The emulator supports two player games using two NES controllers, two USB gamepads connected via a USB hub, or a USB gamepad combined with a NES controller.

When using a USB hub with a Raspberry Pi Pico, you need an OTG USB-Y cable to connect both power and the hub. On the Adafruit Fruit Jam, two USB gamepads can be connected directly to the two USB ports without a hub.

Note

USB hub support for two gamepads has been tested on Raspberry Pi Pico and Pico 2 configurations. Not all setups are supported — for example, a USB hub connected to the PIO USB port of the Waveshare RP2350-PiZero does not work.

Player 1 Player 2
Two USB gamepads connected (via USB hub) USB 1 USB 2
One USB gamepad connected USB NES port 1 or NES port 2
No USB gamepad connected NES port 1 NES port 2

PSRAM

Some boards support additional memory called PSRAM, with a capacity of up to 8 MB. On certain boards this comes pre-installed, while on others it is optional and must be soldered manually. The emulator detects the PSRAM and its size at boot and will automatically make use of it.

Without PSRAM, selecting a game ROM triggers a reboot: the ROM is written to flash memory during startup to prevent the system from locking up. This process is relatively slow, taking several seconds before the game starts.

With PSRAM, this step is no longer needed. Games are loaded directly from the SD card into PSRAM and executed immediately, resulting in much faster startup times.

Board PSRAM Included
Waveshare RP2350-PiZero No – optional, must be soldered (PSRAM module). See PSRAM with a non-Winbond flash chip
Adafruit Metro RP2350 with PSRAM Yes – pre-installed
Pimoroni Pico Plus 2 Yes – pre-installed
Adafruit Fruit Jam Yes - pre-installed

PSRAM with a non-Winbond flash chip

Some RP2350 boards, notably the Waveshare RP2350-PiZero, ship with a flash chip from a manufacturer other than Winbond, such as Puya. On those chips the Quad Enable (QE) bit in Status Register 2 is not set from the factory. In combination with PSRAM this makes the board lock up when the RP2350 is overclocked, which is what the emulator does. See issue #191.

Boards without PSRAM are not affected.

This can be fixed permanently, once, with the flash_config tool:

  1. Download the prebuilt FLASH_QE_SET_1.uf2 from the uf2 folder of that repository, or build it yourself from source.
  2. Put the board into BOOTSEL mode and copy the UF2 onto the RPI-RP2 drive.
  3. The program sets the QE bit and prints the flash status registers over USB serial.
  4. Flash the emulator firmware as usual. The fix is permanent and does not need to be repeated.

Caution

Do not apply FLASH_QE_SET_1.uf2 a second time. A repeat run fails and the board then has to be recovered by erasing the flash with universal_flash_nuke.uf2 first.

Note

Even after the fix, boards with a non-Winbond flash chip are limited to 252 MHz. This means the Overclock setting (378 MHz) cannot be used on them, and therefore neither can the VRC7 FM audio of Lagrange Point (JP), which depends on it.


Warning

The emulator overclocks the Pico in order to get the emulator working fast enough. Overclocking can reduce the Pico's lifespan.

Use this software at your own risk! I will not be responsible in any way for any damage to your Pico and/or connected peripherals caused by using this software.

I also do not take responsibility in any way when damage is caused to the Pico or display due to incorrect wiring or voltages.


Setup

Click on the link below for your specific board configuration:

The SpotPear HDMI board and the Murmulator M1/M2 boards are supported as well, but have no setup section here. Flash piconesPlus_SpotpearHDMI_pico_arm.uf2 / piconesPlus_SpotpearHDMI_pico2_arm.uf2, or piconesPlus_MurmulatorM1_pico_arm.uf2 / piconesPlus_MurmulatorM1_pico2_arm.uf2 / piconesPlus_MurmulatorM2_arm.uf2 from the releases page and wire the board according to its own documentation.

Note

Several boards also have a RISC-V build available (file names ending in _riscv). These are functionally identical to the ARM builds; use the ARM build unless you specifically want to run the RISC-V cores of the RP2350.


Raspberry Pi Pico or Pico 2, setup for Pimoroni Pico DV Demo Base.

Note

This board is discontinued and no longer sold by Pimoroni

materials needed

Note

An external speaker can be connected to the audio jack of the Pimoroni Pico DV Demo Base. You can toggle audio output to this jack with SELECT + LEFT.

flashing the Pico

  • When using a Pico / Pico W, download piconesPlus_PimoroniDVI_pico_arm.uf2 from the releases page.
  • When using a Pico 2 or Pico 2 W or Pimoroni Pico Plus 2, download piconesPlus_PimoroniDVI_pico2_arm.uf2 from the releases page.
  • Push and hold the BOOTSEL button on the Pico, then connect to your computer using a micro USB cable. Release BOOTSEL once the drive RPI-RP2 appears on your computer.
  • Drag and drop the UF2 file on to the RPI-RP2 drive. The Raspberry Pi Pico will reboot and will now run the emulator.

Pinout

NES controller port(s) (if you want to use legacy NES controllers).

Port 1 Port 2 (optional) Note
GND GND (- on board)
VCC (Power) Connect to 3V3
NES Clock GPIO14 GPIO1
NES LATCH GPIO16 GPIO20
NES Data GPIO15 GPIO21

Note

Soldering is required. There is only one 3v3 pin header on the board, the other 3V3 must be soldered directly onto pin 36 (3V3 OUT) of the Pico. For GND there are two pin headers available on the board. Clock Data and Latch for NES controller port 1 must be soldered directly onto the Pico. The Clock, Data and Latch for NES controller port 2 can be soldered on the available pin headers on the board, no need to solder them directly onto the Pico.

PinHeadersPimoroniDV

Image

Note

An original SNES controller can be wired to the same pins. The emulator detects automatically whether an NES or a SNES controller is attached.

setting up the hardware

  • Disconnect the Pico from your computer.
  • Attach the Pico to the DV Demo Base.
  • Connect the HDMI cable to the Demo base and your monitor.
  • Connect the USB OTG cable to the Pico's USB port.
  • Depending which controller you want to use:
    • Connect the controller to the other end of the USB OTG cable.
    • Connect legacy NES controller(s) to NES controller port(s).
  • Insert the SD card into the SD card slot.
  • Connect the USB power adapter to the USB port of the Demo base. (USB POWER)
  • Power on the monitor and the Pico

Image: USB controller only

Image

Image: one or two player setup with USB controller and NES controller port 2

In this image the NES controller port is wired to port 2.

For single player games: use USB controller.

For two player games: Connect a USB controller for player 1 and a NES controller for player 2 or connect a USB hub with two USB gamepads.

Image

Two player setup using two NES controllers or a USB controller and a NES controller

Controller port 1 pins must be soldered directly onto the Pico.

Controller port 2 pins can be soldered to the available headers of the Pimoroni DV.

For two player games:

  • Connect two NES controllers or
  • Connect a USB controller for player 1 and a NES controller for player 2. You can use either NES controller ports.

Raspberry Pi Pico or Pico 2, setup with Adafruit hardware and breadboard

Note

Instead of a Raspberry Pi Pico, you can also use a Pimoroni Pico Plus 2

materials needed

flashing the Pico

Pinout

See https://www.raspberrypi.com/documentation/microcontrollers/images/pico-pinout.svg for the pinout schema of the Raspberry Pi Pico.

Use the breadboard to connect all together:

  • Wire Pico Pin 38 to the breadboard ground column (-)
  • Wire the breadboard left ground column (-) with the breadboard right ground column (-)

Adafruit Micro-SD breakout board+

Breakout GPIO Note
CS GPIO5
CLK (SCK) GPIO2
DI (MOSI) GPIO3
DO (MISO) GPIO4
3V Pin 36 (3v3 OUT)
GND Ground on breadboard (-)

Adafruit DVI Breakout For HDMI Source Devices

Breakout GPIO Note
D0+ GPIO12
D0- GPIO13
CK+ GPIO14
CK- GPIO15
D2+ GPIO16
D2- GPIO17
D1+ GPIO18
D1- GPIO19
5 (*) VBUS Pin 40 (5volt)
GND (3x) Ground on breadboard (-)

(*) This is the via on the side of the board marked 5. (next to via D and C).

Image

NES controller port(s). (if you want to use legacy NES controllers).

Port1 Port 2 (optional) Note
GND
VCC (Power) (3v3 OUT)
NES Clock GPIO6 GPIO9
NES LATCH GPIO8 GPIO11
NES Data GPIO7 GPIO10

Image

Note

An original SNES controller can be wired to the same pins. The emulator detects automatically whether an NES or a SNES controller is attached.

setting up the hardware

  • Disconnect the Pico from your computer.
  • Attach the Pico to the breadboard.
  • Insert the SD card into the SD card slot.
  • Connect the HDMI cable to the Adafruit HDMI Breakout board and to your monitor.
  • Connect the USB OTG Y-cable to the Pico's USB port.
  • Connect the Micro USB power adapter to the female Micro USB connector of the OTG Y-Cable.
  • Controllers (Depending on what you have)
    • Connect the USB controller to the full size female USB port of the OTG Y-Cable.
    • Connect your NES controller(s) to the NES controller port(s).
  • Power on the monitor and the Pico

See image below.

Note

The Schottky diode (VSYS - Pin 39 to breadboard + column) and the wire on breadboard left (+) to right (+) are not necessary, but recommended when powering the Pico from a Raspberry Pi. See Chapter 4.6 - Powering the Board of the Raspberry Pi Pico Getting Started guide

Image: one or two player setup with USB controller and NES controller port

In this image the NES controller port is wired to port 1.

For single player games, connect either a USB controller or a NES controller. Not both!

For two player games: Connect a USB controller for player 1 and a NES controller for player 2.

Image

Image: Two player setup using two NES controllers or a USB controller and a NES controller

Choose either of the following:

  • Connect two NES controllers
  • Connect a USB controller for player 1 and a NES controller for player 2. You can use either NES controller ports.

Note

The device on the left is a Pico Debug probe used for debugging. This is optional

Image


Adafruit Feather RP2040 with DVI (HDMI) Output Port setup

materials needed

When using a USB game controller this is needed:

When using legacy controllers, this is needed:

Pinout

See: https://learn.adafruit.com/assets/119662 for the Feather pin scheme.

Use the breadboard to connect all together:

  • Wire the 3.3V Pin to the breadboard + column.
  • Wire the GND Pin to the breadboard - column
  • Wire the breadboard left ground column (-) with the breadboard right ground column (-)
  • Optional: Attach a push button to the breadboard and connect a wire from this button to the Feather RST pin and breadboard ground column(-). This adds an extra easy to access Reset button.

Adafruit Micro-SD breakout board+

Breakout GPIO
CS GPIO10
CLK (SCK) GPIO14
DI (MOSI) GPIO15
DO (MISO) GPIO8
5V USB pin labelled USB on feather
3V See Note below
GND - column on breadboard connected to feather ground pin

Note

The Adafruit Micro-SD breakout board+ also has a 3V input pin which can be connected to the + column on the breadboard connected to the feather 3.3V pin. However, this frequently gave me errors trying to mount the SD card. So use 5V instead.

Wii nunchuck breakout adapter.

Connect the nunchuck breakout adapter to the Feather DVI using the STEMMA QT cable.

NES controller port(s). (if you want to use legacy NES controllers).

Port 1 Port 2 (optional) Note
GND - column on breadboard connected to feather ground pin
VCC (Power) + column on breadboard connected to feather 3.3V pin
NES Clock GPIO5 GPIO26
NES LATCH GPIO9 GPIO27
NES Data GPIO6 GPIO28

Image

Note

An original SNES controller can be wired to the same pins. The emulator detects automatically whether an NES or a SNES controller is attached.

flashing the Feather RP2040

  • Download piconesPlus_AdafruitFeatherDVI_arm.uf2 from the releases page.
  • Connect the feather to a USB port on your computer using the USB-C data cable.
  • On the feather, push and hold the BOOTSEL button, then press RESET. Release the buttons, the drive RPI-RP2 should appear on your computer.
  • Drag and drop the UF2 file on to the RPI-RP2 drive. The Raspberry Pi Pico will reboot and will now run the emulator.

Note

When the emulator won't start after flashing or powering on, and the screen shows 'No signal,' press the reset button once again. The emulator should now boot.

setting up the hardware

  • Disconnect the Pico from your computer.
  • Attach the Adafruit Feather RP2040 DVI to the breadboard.
  • Insert the SD card into the SD card slot.
  • Connect the HDMI cable to the HDMI port of the Adafruit Feather and to your monitor.
  • Connect controllers depending on your setup:
    • Legacy controllers.
      • NES controller to the NES controller port.
      • Wii Classic controller to the Nunchuck Breakout Adapter.
      • Connect USB-C power supply to USB-C connector.
    • USB game controllers
      • Connect the USB C connector of the "male USB C to female micro USB cable" to the USB C port of the feather.
      • Connect the female micro USB port of the "male USB C to female micro USB cable" to the male micro USB port of the USB OTG Y cable.
      • Connect the DualSense or DualShock controller with the appropriate cable to the full size female USB port of the OTG Y-Cable.
      • Connect the Micro USB power adapter to the female Micro USB connector of the OTG Y-Cable.
  • Power on the monitor and the Pico

Image: one or two player setup with USB controller and NES/Wii Classic controller port

In this image the NES controller port is wired to port 1.

For single player games, connect either a USB controller or a NES/Wii Classic controller. Not both!

For two player games: Connect a USB controller for player 1 and a NES or Wii Classic controller for player 2.

Image

Image: Two player setup using two NES controllers or a USB controller and a NES/Wii Classic controller

Choose either of the following:

  • Connect two NES controllers
  • Connect a Wii Classic controller for player 1 and a NES controller on port 2 for player 2
  • Connect a USB controller for player 1 and a NES controller for player 2. You can use either NES controller ports. You can also use the Wii Classic controller for player 2.

Image


Adafruit Metro RP2350

This configuration supports USB controllers and legacy controllers. (NES / SNES / Wii Classic).

Materials needed

Note

Use a USB-C power supply to power the board instead of the barrel jack. Powering the board using the barrel jack can cause USB game controllers to not work properly.

Note

You can use the USB host pins on the board to connect a USB game controller instead. Soldering is required for this. You also need to build the binary from source, since it is currently not included in the latest release. For more info see pio_usb.md

Legacy Controllers

Wii nunchuck breakout adapter.

Connect the nunchuck breakout adapter to the Metro using the STEMMA QT cable.

NES controller port(s). (if you want to use legacy NES controllers).

Port 1 Port 2 (optional) Note
GND Any GND pin
VCC (Power) Any 3V3 pin
NES Clock GPIO2 GPIO5
NES LATCH GPIO4 GPIO7
NES Data GPIO3 GPIO6

Image

Note

An original SNES controller can be wired to the same pins. The emulator detects automatically whether an NES or a SNES controller is attached.

flashing the Adafruit Metro RP2350

  • Download piconesPlus_AdafruitMetroRP2350_arm.uf2 from the releases page.
  • Connect the USB-C port to a USB port on your computer using the USB-C to USB-A data cable.
  • On the board, push and hold the BOOT button, then press RESET. Release the buttons, the drive RPI-RP2 should appear on your computer.
  • Drag and drop the UF2 file on to the RPI-RP2 drive. The board will reboot and will now run the emulator.

Adafruit Fruit Jam

Note

The latest HSTX video driver update adds support for HDMI audio output. Make sure External Audio is disabled in the options menu.

The new Adafruit Fruit Jam is supported as well.

materials needed

Setup

  • Connect your USB gamepad to the USB 1 port of the Fruit Jam.
  • If you want to use a Wii Classic controller, connect the nunchuck breakout adapter to the Fruit Jam using the STEMMA QT cable and the Wii Classic controller to the breakout adapter.
  • Connect external speakers to the audio output of the Fruit Jam.

To enable audio over HDMI make sure the setting External audio is disabled in the options menu.

When External audio is enabled, audio will be played through the external speakers and mini speaker simultaneously. Press Button 1 on the Fruit Jam to mute the mini speaker

Flash the firmware onto the Fruit Jam. (Connect the Fruit Jam to your computer via its USB-C connector, then hold Reset and Button 1). Copy piconesPlus_AdafruitFruitJam_arm_piousb.uf2 to the RPI-RP2 drive.

Please keep the following in mind:

  • Not all USB controllers from the supported controllers list are guaranteed to work.
  • Two player mode is only possible with one USB gamepad on USB1 and one Wii Classic controller. USB2 is not supported for two player mode yet, will be looking into it.
  • When a USB controller is connected, the Wii Classic controller is player 2. To use the Wii Classic controller as player 1, unplug the USB controller.
image

Waveshare RP2040/RP2350-PiZero Development Board

materials needed

Additional for the RP2040-Pizero only:

  • USB-C to USB-C - USB-A Y cable, when using a USB controller. Not needed for the Waveshare RP2350-PiZero where the controller must be connected to the PIO-USB port.

Note

Unlike the WaveShare RP2350-PiZero, where the controller must be connected to the PIO-USB port, the WaveShare RP2040-PiZero Development Board cannot use the PIO-USB port for the controller due to memory limitations. Instead, connect both the controller and the power adapter to the Y-cable, and then plug the Y-cable into the board’s port labeled “USB.” While the PIO-USB port can still be used to power the RP2040 board, I do not recommend this, as it has occasionally caused unstable behavior.

NES controller port.

When using an original NES controller you need:

For two player games with two NES controllers you need an extra NES controller port, controller and wire

Port 1 Port 2 (Optional) Note
GND Any ground pin
VCC (Power) 5Volt pin
NES Clock GPIO5 GPIO10
NES LATCH GPIO9 GPIO11
NES Data GPIO6 GPIO12

Image

Note

An original SNES controller can be wired to the same pins. The emulator detects automatically whether an NES or a SNES controller is attached.

Note

Contrary to other configurations where VCC is connected to 3 volt, VCC should be connected to a 5 volt pin. Otherwise the NES controller may not work.

Wii Classic controller.

When using a Wii Classic controller you need:

Connections are as follows:

Nunchuck Breakout Adapter RP2040-PiZero
3.3V 3V3
GND GND
SDA GPIO2
SCL GPIO3

flashing the Waveshare RP2040-PiZero Development Board

  • Download piconesPlus_WaveShareRP2040PiZero_arm.uf2 from the releases page.
  • Connect the USB-C port marked USB (not PIO-USB) to a USB port on your computer using the USB-C to USB-A data cable.
  • On the board, push and hold the BOOT button, then press RUN. Release the buttons, the drive RPI-RP2 should appear on your computer.
  • Drag and drop the UF2 file on to the RPI-RP2 drive. The board will reboot and will now run the emulator.

flashing the Waveshare RP2350-PiZero Development Board

  • Download piconesPlus_WaveShareRP2350PiZero_arm_piousb.uf2 from the releases page.
  • Connect the USB-C port marked USB (not PIO-USB) to a USB port on your computer using the USB-C to USB-A data cable.
  • On the board, push and hold the BOOT button, then press RUN. Release the buttons, the drive RPI-RP2 should appear on your computer.
  • Drag and drop the UF2 file on to the RPI-RP2 drive. The board will reboot and will now run the emulator.

Note

When the emulator won't start after flashing or powering on, and the screen shows 'No signal,' press the run button once again. The emulator should now boot.

Image: one or two player setup with USB controller and NES controller port

In this image the NES controller port is wired to port 1.

For single player games, connect either a USB controller or a NES controller. Not both!

For two player games: Connect a USB controller for player 1 and a NES controller for player 2.

Image

Image

Image: Two player setup using two NES controllers or a USB controller and a NES controller

Choose either of the following:

  • Connect two NES controllers
  • Connect a USB controller for player 1 and a NES controller for player 2. You can use either NES controller ports.

Image

Image: Using a Wii Classic controller

WS-Wiiclassic

WS-Wiiclassic2

3D printed case for RP2040/RP2350-PiZero

Gavin Knight (DynaMight1124) designed a NES-like case you can 3D print as an enclosure for this board. This enclosure is designed for 2 NES controller ports so you can play 1 or 2-player games. Click here for the design. Please contact the creator on their Thingiverse page if you have any questions about this case.

WS3D1

WS3D2


PCB with Raspberry Pi Pico or Pico 2

Create your own Pico-based NES console. It features two NES controller ports for 1 or 2-player games.

Designed by @johnedgarpark

IMG_6011

Several companies can make these PCBs for you.

I personally recommend PCBWay. The boards I ordered from them are of excellent quality. They also have a very short lead time. Boards I ordered on Monday arrived from China to my home in the Netherlands on Friday of the same week.

Image

When ordering, simply upload the zip file containing the gerber design. This file (pico_nesPCB_v2.1.zip) is available on the releases page and can also be found in the PCB folder of the pico_shared repository.

Note

The current design is v2.1. It has no through-holes for pin headers, so the Raspberry Pi Pico or Pico 2 has to be soldered flat onto the PCB.

Note

Soldering skills are required. Make sure you solder all the connections from the Pico onto the PCB. Also the connections on the short right-side of the Pico. (For ground)

Note

If you are looking for the previous design (v0.2). You can find it here

Note

Sellers on AliExpress have copied the PCB design and are selling pre-populated PCBs. For questions about those boards, please contact the seller on AliExpress.

Other materials needed:

When using a Pico / Pico W, Flash piconesPlus_AdafruitDVISD_pico_arm.uf2 / piconesPlus_AdafruitDVISD_pico_w_arm.uf2 from the releases page. When using a Pico 2 or Pico 2 W, flash piconesPlus_AdafruitDVISD_pico2_arm.uf2 / piconesPlus_AdafruitDVISD_pico2_w_arm.uf2 instead.

Important

A Pimoroni Pico Plus 2 cannot be used with this PCB. The board has to lie flat on the PCB, which the SP/CE connector on the back of the Pico Plus 2 prevents.

Image: Two player setup using two NES controllers or a USB controller and a NES controller

Choose either of the following:

  • Connect two NES controllers
  • Connect a USB controller for player 1 and a NES controller for player 2. You can use either NES controller ports. Use the OTG Y-Cable to connect a USB power supply and the USB controller.

image0

3D printed case for PCB

Gavin Knight (DynaMight1124) designed a NES-like case you can 3D print as an enclosure for this PCB. You can find it here: https://www.thingiverse.com/thing:6689537. Here you can find two designs: the latest design for PCB v2.0 and the previous design for PCB v0.2. In the latest v2.0 design, you can choose between two top covers, one with a button connecting to the bootsel button for easy firmware upgrades, the other without the button. In this case you have to remove the top cover to access the bootsel button. See images below. Make sure to print the correct files for the PCB version you own. You can find more information on Gavin's Thingiverse page.

Top Cover v2.0 without button (Top_v2.0.stl)

Top cover without button

Top Cover v2.0 with bootsel button (Top_v2.0_with_Bootsel_Button.stl)

Top Cover with button to access bootsel

Base v2.0 (Base_v2.0.stl)

3d2playerBottom

on/off button (Power_Switch.stl)

powerswitch


PCB with WaveShare RP2040/RP2350 Zero

Create your own Pico-based NES console. It features two NES controller ports for 1 or 2-player games. This version is smaller than the above and uses cheaper, but ultimately harder to solder components. This is a more advanced project than the above PCB design; if you are unsure of your soldering capabilities I wouldn't recommend this PCB.

Several companies can make these PCBs for you. PCBWay or JLCPCB are two good options.

I personally recommend PCBWay. The boards I ordered from them are of excellent quality. They also have a very short lead time. Boards I ordered on Monday arrived from China to my home in the Netherlands on Friday of the same week.

Image

When ordering, simply upload the zip file containing the gerber design. This file (Gerber_PicoNES_Mini_PCB_v2.0.zip) is available on the releases page and can also be found in the PCB folder of the pico_shared repository.

Note

Soldering skills are required. Make sure you solder all the connections from the Pico onto the PCB. This version requires good soldering skills especially for the HDMI portion, a good amount of flux and a fine tip will be required, additional solder can be wicked away with solder wick. I recommend starting with the resistor arrays first, then the HDMI port, after that either Pico or MicroSD adaptor, lastly the NES Ports, which can be hard to push into the PCB.

Please see the Instructables link for the guide and components needed: https://www.instructables.com/PicoNES-RaspberryPi-Pico-Based-NES-Emulator/

When using a RP2040 Zero, flash piconesPlus_WaveShareRP2040ZeroWithPCB_arm.uf2 from the releases page. When using a RP2350 Zero, flash piconesPlus_WaveShareRP2350ZeroWithPCB_arm.uf2 instead.

3D printed case for PCB

Gavin Knight (DynaMight1124) designed a NES-like case you can 3D print as an enclosure for this PCB. You can find it here: https://www.thingiverse.com/thing:7041536. If you don't own a 3D printer, you can either find a local company that offers 3D printing services or use professional services such as PCBWay or JLCPCB; the professional services can offer extremely high quality finishes.

3D printed case

PXL_20250508_183050163

3D printed case from professional services (JLCPCB in this example)

PXL_20250527_092756092 PXL_20250527_092840066

Soldered PCB

PXL_20250508_182416020

Note

The PCB has been updated to v2.0, with improvements to the SD slot and easier to solder components around the HDMI port, however you can still find v1.0 design files, gerber and BOM here: https://www.thingiverse.com/thing:7041536


PCB with WaveShare RP2350 USB A

Based around the WaveShare RP2350 USB A board along with a PCB, which creates a micro PicoNES with 1 player controls via USB. There's a full guide here: https://www.instructables.com/PicoNES-RaspberryPi-Pico-Based-NES-Emulator/

Several companies can make these PCBs for you. PCBWay or JLCPCB are two good options.

I personally recommend PCBWay. The boards I ordered from them are of excellent quality. They also have a very short lead time. Boards I ordered on Monday arrived from China to my home in the Netherlands on Friday of the same week.

Image

When ordering, simply upload the zip file containing the gerber design. This file (Gerber_PicoNES_Micro_v1.2.zip) is available on the releases page and can also be found in the PCB folder of the pico_shared repository.

Flash piconesPlus_WaveShare2350USBA_arm_piousb.uf2 from the releases page. The game controller connects to the USB A port; the USB-C port is used for power and for flashing the firmware.

PicoNES Micro populated PCB - NES controller shown for scale

PXL_20250804_160007569

3D Printed Case

PXL_20250805_144427555

Build Guide

https://www.instructables.com/PicoNES-RaspberryPi-Pico-Based-NES-Emulator/

Note

Due to the small size, micro soldering skills are required. It uses 0603 sized SMD components. Please see the Instructables link for information.


Using metadata.

Download the metadata pack from the releases page and extract its contents to the root of the SD card. It contains box art and game info for many games. The metadata is used in the menu to show box art and game info when a rom is selected. Press START to view the information. When the screensaver is started, random box art is shown.

Screenshot 2025-08-25 15-43-24

Gamepad and keyboard usage

(S)NES Genesis XInput DualShock/DualSense
Button1 B A A X
Button2 A B B Circle
Select select Mode or C Select Select

Menu

Gamepad buttons:

  • UP/DOWN: Next/previous item in the menu.
  • LEFT/RIGHT: next/previous page.
  • Button2: Open folder/flash and start game.
  • Button1: Back to parent folder.
  • START: Show metadata and box art (when available)
  • SELECT: Opens the settings menu. Here you can change settings like screen mode, scanline type, framerate display, menu colours and other board specific settings. The settings menu can also be opened in-game. See Settings menu below for the full list.
  • SELECT + Button2: Force DVI mode (HSTX only). Useful if a DVI monitor shows no picture. This will restore the image.

When using a USB keyboard:

  • Cursor keys: Up, Down, left, right
  • Z: Back to parent folder
  • X: Open Folder/flash and start a game
  • S: Show metadata and box art (when available).
  • A: acts as the select button.

Settings menu

The settings menu is opened with SELECT from the main menu, or with SELECT + START while a game is running. Not every entry is available on every board or in every situation.

Setting Description
Select disk Change the FDS disk side. Only for FDS games, and always the first entry.
Quit game / Back to main menu Leave the game and return to the SD card menu. Battery-backed save RAM is written to the SD card here. In-game only.
Reset game Reset the running game. In-game only.
Save/Load State Manage save states. In-game only.
Screen Mode Cycle the screen modes, including the 8:7 pixel aspect ratio modes.
Scanline Type Simple or LCD style scanlines. HSTX boards only.
Framerate Overlay Show the frames per second on screen.
Display Mode HDMI or DVI output. HSTX boards only.
External Audio Route audio to the I2S/line-out output instead of HDMI. Selecting DVI as Display Mode enables this automatically, because DVI carries no audio.
Menu Font Color / Menu Font Back Color Menu colours (0-63).
Fruit Jam VU Meter / Fruit Jam Volume Control Fruit Jam only.
Rapid Fire on A / Rapid Fire on B Enable rapid fire per button.
FDS Auto Swap Disk side Swap the disk side automatically when the game asks for it. Off by default. FDS games only.
FDS Auto Insert Disk 1 On Start Insert disk 1 automatically at start. On by default. FDS games only.
Overclock Raise the CPU clock from 252 MHz to 378 MHz. Only on HSTX boards with PSRAM, and currently only needed for Lagrange Point (JP). Menu only, not available in-game.
Enter BOOTSEL Mode Reboot into BOOTSEL so you can flash new firmware.
Controller Test Show a gamepad graphic that follows the controller you last pressed a button on, plus a list of connected input sources. Useful for checking wiring and button mappings. Hold SELECT + START for 2 seconds to exit.
Return to emulator selection Go back to the emulator picker. Only present in pico-bootLoader builds.

Note

Changes are only applied when you select SAVE. CANCEL discards them, DEFAULT restores the default values.

Emulator (in game)

Gamepad buttons:

  • SELECT + START, Xbox button: opens the settings menu. From there, you can:
    • Quit the game and return to the SD card menu
    • Reset the game
    • Manage save states. Load or save your game state to one of 5 slots plus a quick save slot. Enable auto save/load state on exit/start.
    • Adjust settings and resume your game.
  • SELECT + UP/SELECT + DOWN: switches screen modes, including the 8:7 pixel aspect ratio modes.
  • START + Button2: Toggle framerate display
  • START + DOWN : (quick) Save state. (Quick Save slot)
  • START + UP : (quick) Load state. (Quick Save slot)
  • SELECT + START + UP + Button2 (all held together): Reboot into BOOTSEL mode for flashing new firmware.
  • Pimoroni Pico DV Demo Base and Murmulator only: SELECT + LEFT: Switch audio output to the connected speakers on the line-out jack. The speaker setting will be remembered when the emulator is restarted. Not available on boards that output audio over HDMI.
  • Fruit Jam Only
    • pushbutton 2 (on board) or SELECT + RIGHT: Toggles the VU meter on or off. (NeoPixel LEDs light up in sync with the music rhythm)
    • START + LEFT/RIGHT: Adjust volume of built-in speaker and external audio jack.
  • RP2350 with PSRAM only: Record about 30 seconds of audio by pressing START to pause the game and then START + Button1. Audio is recorded to /soundrecorder.wav on the SD card.
  • Genesis Mini Controller: When using a Genesis Mini controller with 3 buttons, press C for SELECT. On 8-button Genesis controllers, press MODE for SELECT.
  • USB keyboard: When using a USB keyboard
    • Cursor keys: up, down, left, right
    • A: SELECT
    • S: START
    • Z: Button1
    • X: Button2

Note

Rapid fire is not a button combination. Enable it per button with the Rapid Fire on A / Rapid Fire on B entries in the settings menu.

Save States should work for mapper 0,1,2,3 and 4. Other mappers may or may not work. Below the games that use these mappers.

The mapper number is also shown in the Save State screen.


Famicom Disk System (FDS) Games

FDS games are supported with the following requirements:

  • A BIOS file is required. Place it at /bios/fds-bios.rom on the SD card. The file must be exactly 8 KB.
  • An RP2350 board. RP2040 does not meet the memory requirements.
  • You need ROMs with the .fds extension.

FDS games have these features:

  • For games that can write save data back to disk, you must go back to the menu to save the game. Saves are written to /SAVES/<gamename>_fds.SAV. For single-side disk images the file is /SAVES/<gamename>_fds_s<N>.SAV, one per side. Save states are not supported for FDS games.

Swapping Disks

When prompted to swap disks, use the in-game settings menu:

  1. Press SELECT + START to open the settings menu.
  2. Select the first option (Select disk) to change the disk.
  3. Press LEFT/RIGHT to choose the disk side.
  4. Press Button2 to confirm and return.

Auto Swapping disks

In the settings menu, there is an option FDS Auto Swap Disk side. This is disabled by default. When enabled, the emulator will automatically swap the disk side when the game asks for it. Note that in some cases you still need to swap the disks manually.

There is a second FDS option, FDS Auto Insert Disk 1 On Start, which inserts disk 1 automatically when the game starts. This one is enabled by default.


Playing NSF audio files

The emulator can play Nintendo Sound Format files. These are ROMs with the .nsf extension. This works on both the RP2040 and RP2350 boards.

Each NSF file can have multiple tracks. Loading a .nsf ROM from the menu will automatically start the first track. Each track is played for a maximum duration of 3 minutes, after which the next track is played. When there is silence for more than 3 seconds, the next track is played as well.

Controls

  • Right/Left: Next/Previous track.
  • Button1: Stop Playback
  • Button2: Resume playback.
  • Select + Start: Back to the menu.
Screenshot 2026-05-04 10-12-59

WAV Music Playback in menu (RP2350 Only)

The menu allows you to play music files. Files must meet the following requirements:

  • Format: WAV
  • Bit depth: 16-bit or 24-bit
  • Sample rate: 44.1 kHz
  • Channels: Stereo
  • File extension: .wav

Note

The sample rate is not checked. There is no resampler, so a file recorded at a different sample rate will play back at the wrong speed.

How to Play

  1. Select a music file from the menu.
  2. Press Button2 or START to start playback.
  3. Press Button2 or START again to stop playback.

Converting MP3 to WAV

You can easily convert MP3 files to WAV using Audacity:

  1. Open the MP3 file in Audacity.
  2. Go to File → Export → Export Audio.
  3. Choose the following settings:
    • Format: WAV (Microsoft)
    • Channels: Stereo
    • Sample rate: 44,100 Hz
    • Encoding: Signed 16-bit PCM
  4. Copy the exported WAV file to the SD card.

Save games

For games which support it, battery-backed save RAM is stored in the /SAVES folder of the SD card, as <gamename>.SAV.

Caution

The save RAM is only written back to the SD card when you quit the game properly: press SELECT + START to open the settings menu, then choose Quit game. Powering off or resetting the board while the game is running loses everything since the last save.


Raspberry Pico W and Pico2 W support

The emulator works with the Pico W (RP2040). Use the pico_w_ or pico2_w_ versions of the uf2 files in the latest release. The Pico W has a built-in wifi module. The wifi module is not used by the emulator. It is only used for enabling the LED to blink every 60 frames on the Pico W. If you don't mind the LED blinking, you can use the pico_ versions of the uf2 files on the Pico W.


USB game controller latency

Using a USB game controller introduces some latency. The legacy controllers ((S)NES, Wii Classic) have less latency.


Troubleshooting USB controllers

AliExpress Controllers (Mantapad)

When starting a game, and the controller is unresponsive, you have to unplug and replug the controller to get it working. Not all controllers behave this way. I have a SNES controller that has no problems. The NES controller however must always be replugged to make it work. It is kind of hit and miss.

Note

When using a SNES style USB controller, press Y to set the controller up properly. Otherwise the B button will not work. You have to do this every time you start a game or boot into the menu.

XInput style controllers.

Might not work with all controllers.

Tested devices:

  • Xbox 360 : Works
  • Xbox Series X controller : Works
  • Xbox One controller : Works
  • Xbox elite controller : Works
  • 8bitdo SN30 Pro+ firmware V6.01: Works. With the controller switched off, hold X + Start to switch to XInput mode. (LED 1 and 2 will blink). Then connect to USB.
  • 8bitdo Pro 2 firmware V3.04: Works. With the controller switched off, hold X + Start to switch to XInput mode. (LED 1 and 2 will blink). Then connect to USB.
  • 8bitdo SN30 PRO Wired : Not working, recognized but no report
  • 8bitdo SF30 PRO firmware v2.05 : Works. With the controller switched off, hold X + Start to switch to XInput mode. (LED 1 and 2 will blink). Then connect to USB.
  • 8bitdo SN30 PRO firmware v2.05 : Not tested, should probably work

Troubleshooting:

After flashing some bigger games, the controller might become unresponsive:

  • Xbox Controller. Playing with batteries removed is recommended. When controller becomes unresponsive:

    • unplug and replug the controller.
    • If controller is still unresponsive, unplug the pico from power, wait a few seconds then plug it back in and press start to start the last flashed game.
  • 8bitdo controllers, when controller becomes unresponsive:

    • Disconnect the controller.
    • Hold start to switch the controller off (if it has built-in battery).
    • reconnect the controller.

Troubleshooting no image on TV or monitor

Some displays need 5V connected to the HDMI breakout in order to work:

  • When using the breadboard with HDMI and SD breakout, make sure VBUS (Pin 40) is connected to the 5 volt via on the HDMI breakout board. (Marked 5 on the side)

Image


Known Issues and limitations

  • Not all games will run, as some mappers are either not fully implemented or exceed memory limitations. If a game uses an unsupported mapper, the system will display a message such as: "Mapper n is unsupported." (where n is the mapper number). For example, attempting to start Castlevania III (US) on the RP2040 will result in the message: "Mapper 5 is unsupported." On the RP2350, however, this game runs without issues.
  • MMC5 and VRC7 expansion audio require an RP2350 board. VRC6, FDS and Sunsoft 5B expansion audio also work on the RP2040.
  • The VRC7 (Yamaha OPLL) FM audio used by Lagrange Point (JP) only works on HSTX boards with PSRAM and requires the Overclock setting to be enabled. The audio may still show occasional glitches.
  • Save states are not supported for FDS games.

Running under pico-bootLoader

Instead of flashing this emulator as the only application on your board, you can install it under pico-bootLoader. The bootloader turns an RP2350 board into a multi-system console: on power-on it shows a menu from which you pick an emulator or game, which is then launched straight from the SD card. Any reset or power cycle brings you back to that menu, so you no longer have to reconnect the board to a computer to switch systems.

Alongside this NES emulator, the bootloader can run the Game Boy, Sega Master System/Game Gear, Sega Mega Drive/Genesis, PC Engine, Philips Videopac emulators and a native Doom port.

You do not have to build anything. The bootloader's releases page provides a prebuilt bootloader UF2 for each supported board plus pico-bootLoader_sdcard.zip, an SD card archive that already contains a ready-to-use piconesPlus build. In short:

  1. Flash the bootloader UF2 for your board via BOOTSEL.
  2. Unpack pico-bootLoader_sdcard.zip onto a FAT32 or exFAT SD card.
  3. Insert the card and power on.

Note

pico-bootLoader requires an RP2350 board. Supported configurations are the Pimoroni Pico DV Demo Base, Adafruit DVI + SD breakout, Adafruit Metro RP2350, Waveshare RP2350-Zero with PCB, Waveshare RP2350-PiZero, Adafruit Fruit Jam, Waveshare RP2350-USB A, Murmulator M2 and the Adafruit Feather RP2350. See the bootloader's own readme for the current list and for the SD card layout.

When the emulator runs under the bootloader, the settings menu gains an extra Return to emulator selection entry that takes you back to the picker.

If you do want to build the emulator for the bootloader yourself, use the -b flag described in Building from source. Those builds are relinked to the application partition at 0x10080000 and are written to the releases_bl folder instead of releases. Note that the regular binaries on this project's releases page are standalone builds and will not work under the bootloader.


Building from source

Best is to use the included build script buildAll.sh. You can then copy the correct .uf2 to your Pico via the bootsel option. The script builds all the .uf2 files and puts them in the releases folder.

git clone https://github.com/fhoedemakers/pico-infonesPlus.git
cd pico-infonesPlus
git submodule update --init
chmod +x build*.sh
./buildAll.sh

Alternatively, you can use the bld.sh shell script:

Build script for the piconesPlus project

Usage: ./pico_shared/bld.sh [-d] [-2 | -r] [-w] [-u] [-m] [-D] [-e] [-b] [-t path to toolchain] [ -p nprocessors] [-c <hwconfig>]
Options:
  -d: build in DEBUG configuration
  -2: build for Pico 2 board (RP2350)
  -r: build for Pico 2 board (RP2350) with riscv core
  -u: (RP2350 only, must also use -2) enable PIO USB support (RP2350 only) disabled by default except for Waveshare RP2350-PiZero and Adafruit Fruit Jam.
  -w: build for Pico_w or Pico2_w
  -b: (RP2350 only, must also use -2) build for the resident emuLoader bootloader (passes -DBUILD_FOR_BOOTLOADER=ON;
      relinks the image to the application partition at 0x10080000 instead of 0x10000000).
      Copies the resulting UF2 to releases_bl instead of releases.
  -t <path to riscv toolchain>: only needed for riscv, specify the path to the riscv toolchain bin folder
     Default is $PICO_SDK_PATH/toolchain/RISCV_RPI_2_0_0_2/bin
  -p <nprocessors>: specify the number of processors to use for the build
  -D Force DVI over HSTX.
  -c <hwconfig>: specify the hardware configuration
     1: Pimoroni Pico DV Demo Base (Default)
     2: Breadboard with Adafruit AdaFruit DVI Breakout Board and AdaFruit MicroSD card breakout board
        Custom pcb
     3: Adafruit Feather RP2040 DVI
     4: Waveshare RP2040-PiZero
     5: Adafruit Metro RP2350 (latest branch of TinyUSB is required for this board)
     6: Waveshare RP2040-Zero/RP2350-Zero with custom PCB
     7: WaveShare RP2350-PiZero - PIO USB enabled,  -u implied.
     8: Adafruit Fruit Jam - PIO USB enabled, -u implied.
     9: WaveShare RP2350-USBA - PIO USB enabled, -u implied.
     10: Spotpear HDMI board. https://spotpear.com/index/product/detail/id/1207.html
     11: RP2350-USB-A - OLD config with different SD pins. Deprecated, do not use.
     12: Murmulator M1
     13: Murmulator M2 (rp2350 only)
     14: Adafruit Feather RP2350 with TLV320DAC3100 I2S DAC and sdcard breakout board and PIO USB.
  -m: Run cmake only, do not build the project
  -e: use the pico-extras based I2S audio driver (default: legacy custom driver)
  -h: display this help

To install the RISC-V toolchain:
 - Raspberry Pi: https://github.com/raspberrypi/pico-sdk-tools/releases/download/v2.0.0-5/riscv-toolchain-14-aarch64-lin.tar.gz
 - X86/64 Linux: https://github.com/raspberrypi/pico-sdk-tools/releases/download/v2.0.0-5/riscv-toolchain-14-x86_64-lin.tar.gz
and extract it to $PICO_SDK_PATH/toolchain/RISCV_RPI_2_0_0_2

Example riscv toolchain install for Raspberry Pi OS:

        cd
        sudo apt-get install wget
        wget https://github.com/raspberrypi/pico-sdk-tools/releases/download/v2.0.0-5/riscv-toolchain-14-aarch64-lin.tar.gz
        mkdir -p $PICO_SDK_PATH/toolchain/RISCV_RPI_2_0_0_2
        tar -xzvf riscv-toolchain-14-aarch64-lin.tar.gz -C $PICO_SDK_PATH/toolchain/RISCV_RPI_2_0_0_2

To build for riscv:

        ./bld.sh -c <hwconfig> -r -t $PICO_SDK_PATH/toolchain/RISCV_RPI_2_0_0_2/bin

Note: All .uf2 files are copied to the releases folder, except for the bootloader (-b) build which is copied to releases_bl

When using Visual Studio Code, choose the Release or the RelWithDebInfo build variant.

Building with an embedded ROM

You can embed a NES ROM directly into the firmware binary so the emulator boots straight into the game without needing an SD card or menu. This is useful for dedicated single-game builds or quick testing.

Pass the path to the ROM file at cmake configure time:

cmake -DCMAKE_BUILD_TYPE=Release -DEMBED_NES_ROM=/path/to/game.nes ..
cmake --build . -j$(nproc)

The ROM is converted to a C array at build time using xxd. The resulting UF2 will be larger by the size of the ROM (~128-256KB typically).

To build normally without an embedded ROM (standard SD card menu), simply omit the flag:

cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . -j$(nproc)

Building with support for an additional USB port using PIO-USB

In some configurations, a second USB port can be added. This port can be used to connect a gamepad. The built-in USB port will be used for power and flashing the firmware. With this there is no need to use a USB-Y cable anymore.

For more info on how to setup and build the firmware, see pio_usb.md.

Note

You have to build the firmware from source to enable this feature. The pre-built binaries do not support this.


Credits

InfoNES is programmed by Jay Kumogata and ported to the Raspberry Pi Pico by Shuichi Takano.

I contributed by programming functionality for SD card, menu, 2-player games, support for various USB gamepads and keyboard, metadata rendering etc...

HSTX HDMI/DVI driver with audio using pico_hdmi by fliperama86

PCB design by John Edgar Park.

Additional PCB design and 3D-printable case for both PCBs and WaveShare RP2040/RP2350-PiZero by Gavin Knight

Metadata files provided by Gavin Knight, based on Ducalex's retro-go-covers

NES gamepad support contributed by PaintYourDragon & Adafruit.

Wii Classic controller support by PaintYourDragon & Adafruit.

Adafruit Feather DVI - RP2040 support by PaintYourDragon & Adafruit.

XInput driver: https://github.com/Ryzee119/tusb_XInput by Ryzee119

FatFS driver: https://github.com/elehobica/pico_fatfs by elehobica

PSRAM: AndrewCapon

lwmem: MaJerle

Audio feedback and fixes: szuping

Mesen: https://github.com/SourMesen/Mesen2 used as basis for:

  • NES ROM database
  • FDS implementation
  • NSF playback

Anthropic Claude Opus 4.6 and 4.7 assisted with:

  • Famicom Disk System (FDS) support
  • mapper 5 (MMC5), including its expansion audio
  • mapper 24 (VRC6a)
  • mapper 30
  • mapper 85 (VRC7), including the Yamaha OPLL FM audio
  • mapper 69 (Sunsoft FME-7), including the YM2149 PSG audio
  • fixes in other mappers
  • NSF player support
  • general code optimisations and bug fixes

Other versions

There is also a version available for the Pimoroni PicoSystem handheld.

Image

About

NES Emulator with SD card and menu support for the Raspberry PI Pico, Pico 2 and other RP2040/RP2350 based microcontrollers. Play your games from SD card on a HDMI display.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages