Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻译准备中
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.
翻译准备中
游戏C++ · CGitHub @PicoPlus-devel自行安装运营者未确认
试用过了吗? 点一下就好,无需登录。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗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.
.nsf) with visual VU-meter overlay. More info on this in the Playing NSF Audio Files section below..wav) format audio playback in the menu (RP2350 only). More info on this in the WAV Music Playback in Menu section below.| 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.
/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.To enable FDS game support, provide your own BIOS file:
/bios directory on your SD cardfds-bios.romFDS 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.
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:
Click on image below to see a demo video.
You can use it with these RP2040/RP2350 boards and configurations:
A selection of custom printed circuit boards. See also Custom PCBs.
A custom printed circuit board (PCB) designed by @johnedgarpark. (requires soldering) It is available with two NES controller ports (v2.6) or two SNES controller ports (v2.8), and can also be used with a USB game controller. You can 3D print your own NES-like case for the v2.6 PCB. Both current designs (v2.6 and v2.8) have through-holes, so besides a Raspberry Pi Pico or Pico 2 you can also use a Pimoroni Pico Plus 2, as long as it has soldered male headers. See the PCB README for all PCB designs.
A smaller PCB design for the Waveshare RP2040-Zero or RP2350-Zero, with a 3D-printed case, designed by Gavin Knight (DynaMight1124). It uses cheaper components that are harder to solder, and is recommended for builders with good soldering skills.
A very small PCB design for the Waveshare RP2350-USB-A, designed by Gavin Knight (DynaMight1124), for one player with a USB controller. It is the most difficult design to solder and requires micro-soldering skills.
Raspberry Pi Pico, Pico W, Pico 2, Pico 2 W or Pimoroni Pico Plus 2 with male headers, on a breadboard with the Adafruit DVI Breakout For HDMI Source Devices and the . For use with a USB game controller or up to two legacy NES controllers. (No soldering required) See .
See below to see how to set up your specific configuration.
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.
See also troubleshooting USB controllers below
[!NOTE] There is some input lag when using USB controllers.
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.
Parts list for legacy controllers
NES or SNES controller. A second controller port and controller is optional and only needed if you want to play two player games using legacy controllers. Two player games can also be played with a USB controller and a legacy controller.
Wii Classic controller
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 |
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.
Starting the game that is already in flash is quick, though: the emulator remembers which ROM it wrote there and skips the write when you select that same game again. It still reboots, but without the several seconds of flashing. In the recently played list that game is tagged [READY].
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 |
| Pico Computer 3 | Yes - pre-installed |
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:
[!CAUTION] Do not apply
FLASH_QE_SET_1.uf2a second time. A repeat run fails and the board then has to be recovered by erasing the flash withuniversal_flash_nuke.uf2first.
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.
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.
[!NOTE] This board is discontinued and no longer sold by Pimoroni
[!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.
| 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.
[!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.
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.
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:
[!NOTE] Instead of a Raspberry Pi Pico, you can also use a Pimoroni Pico Plus 2
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:
| Breakout | GPIO | Note |
|---|---|---|
| CS | GPIO5 | |
| CLK (SCK) | GPIO2 | |
| DI (MOSI) | GPIO3 | |
| DO (MISO) | GPIO4 | |
| 3V | Pin 36 (3v3 OUT) | |
| GND | Ground on breadboard (-) |
| 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).
| Port1 | Port 2 (optional) | Note | |
|---|---|---|---|
| GND | |||
| VCC (Power) | (3v3 OUT) | ||
| NES Clock | GPIO6 | GPIO9 | |
| NES LATCH | GPIO8 | GPIO11 | |
| NES Data | GPIO7 | GPIO10 |
[!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.
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
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.
Choose either of the following:
[!NOTE] The device on the left is a Pico Debug probe used for debugging. This is optional
When using a USB game controller this is needed:
When using legacy controllers, this is needed:
See: https://learn.adafruit.com/assets/119662 for the Feather pin scheme.
Use the breadboard to connect all together:
| 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.
Connect the nunchuck breakout adapter to the Feather DVI using the STEMMA QT cable.
| 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 |
[!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] 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.
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.
Choose either of the following:
This configuration supports USB controllers and legacy controllers. (NES / SNES / Wii Classic).
[!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
Connect the nunchuck breakout adapter to the Metro using the STEMMA QT cable.
| 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 |
[!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] 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.
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:
Additional for the RP2040-Pizero only:
[!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.
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 |
[!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.
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 |
[!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.
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.
Choose either of the following:
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.
Four printed circuit board (PCB) designs turn a supported microcontroller board into a small console. This section shows the designs and the firmware to flash. Parts lists, ordering instructions, assembly notes, the pin assignment, the 3D-printed cases and the older design versions are described in the PCB README. The Gerber files are in the PCB folder of the pico_shared repository and are also attached to every release.
| Design | Picture | Controller ports | Microcontroller board | Designed by |
|---|---|---|---|---|
| PicoNES v2.6 | See note | 2 × NES | Raspberry Pi Pico, Pico 2 or Pimoroni Pico Plus 2 | John Park |
| PicoNES v2.8 SNES | See note | 2 × SNES | Raspberry Pi Pico, Pico 2 or Pimoroni Pico Plus 2 | John Park |
| PicoNES Mini | 2 × NES | Waveshare RP2040-Zero or RP2350-Zero | Gavin Knight | |
| PicoNES Micro | None, USB controller only | Waveshare RP2350-USB-A | Gavin Knight |
[!NOTE] The PicoNES v2.6 and v2.8 are shown with a Pimoroni Pico Plus 2. A Raspberry Pi Pico, Pico W, Pico 2 or Pico 2 W can also be fitted.
All boards require soldering.
[!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.
This PCB carries a Raspberry Pi Pico, Pico 2 or Pimoroni Pico Plus 2, the Adafruit DVI and microSD breakout boards and two controller ports. It comes in two versions, which differ only in the controller ports:
pico_nesPCB_v2.6.zip) has two NES controller ports.pico_nesPCB_v2.8_SNES_PORTS.zip) has two SNES controller ports. The emulator detects SNES controllers automatically. The NES Zapper cannot be used with this version, and the 3D-printed case does not fit it.A Pico or Pico 2 can be soldered flat onto the PCB or mounted on male pin headers. A Pimoroni Pico Plus 2 must be mounted on pin headers, because the SP/CE connector on its back prevents it from lying flat. Optional female socket headers, soldered into the PCB, let a board with male headers be plugged in and swapped without desoldering.
The parts lists and assembly notes are in the PCB README: PicoNES v2.6 and PicoNES v2.8.
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. When using a Pimoroni Pico Plus 2, flash piconesPlus_AdafruitDVISD_pico2_arm.uf2 as well. The PSRAM on the board is used instead of flash to load the ROMs from SD.
For two-player games, connect two controllers to the controller ports, or connect a USB controller for player 1 and a controller in either controller port for player 2. Use the OTG Y-cable to connect both a USB power supply and the USB controller.
| NES controller ports (v2.6) | SNES controller ports (v2.8) |
|---|---|
[!NOTE] Beta. Works on the PCB only, in controller port 2, and needs a third-party light gun such as the Tomee Zapp Gun - an original Nintendo Zapper will not work on a flat panel unmodified. See Which gun you need below.
PCB design v2.1 and later (so also the current v2.6) route the two extra data lines of NES controller port 2 to the Pico: D3 → GPIO27 (light sensor) and D4 → GPIO28 (trigger). The emulator reads those two lines directly into bits 3 and 4 of $4017, exactly as a real NES does. Flash one of the piconesPlus_AdafruitDVISD_* binaries (the PCB firmware); on all other boards GPIO27 and GPIO28 are already in use for something else, so Zapper support is not compiled in there.
No setting has to be enabled. The gun is detected automatically the moment it is plugged in, because a Zapper actively drives its trigger line low while the trigger is released. A regular NES or SNES controller can stay in port 2 alongside the gun and keeps working - only bits 3 and 4 of $4017 come from the Zapper, the pad's own data line is untouched.
[!NOTE] The Zapper cannot be used on the Murmulator M1 and M2 boards. Those PCBs leave D3 and D4 of the controller ports unconnected, so the gun's light and trigger lines never reach the board at all. This cannot be fixed in firmware.
[!IMPORTANT] An original Nintendo Zapper does not work on a flat panel without a hardware modification.
Use a third-party light gun made for modern displays. The Tomee Zapp Gun for NES is confirmed working and is what this support was developed and tested with. neslcdmod.com lists it among the guns known to work.
The original light gun games time their light detection against a CRT, which puts a pixel on screen the instant it is scanned out. An LCD/LED TV adds milliseconds of lag, so an unmodified Duck Hunt scores every shot as a miss. This is a property of flat panels, not of the emulator - the same games fail the same way on real NES hardware connected to a modern TV.
neslcdmod.com provides IPS patches that add a calibration routine to compensate for that lag. Patches exist for Duck Hunt, Wild Gunman, Hogan's Alley, Duck Hunt VS and Barker Bill's Trick Shooting.
.nes file to the SD card like any other ROM.Put the TV in game mode first (it is the single biggest reduction in display lag), then boot the patched ROM and follow its on-screen calibration: aim at the target it shows (SHOOT HERE / FIRE ME) and fire straight into it. The delay can also be adjusted by hand - the arrows change it in the main menu, and pressing Start during play shows the current value so it can be nudged. Recalibrate after changing TV, screen mode, or the Overclock setting.
[!TIP] If the gun does not respond, or shots always hit or always miss, see zapper_troubleshooting.md.
Gavin Knight (DynaMight1124) designed an NES-like case for the v2.6 PCB: https://www.thingiverse.com/thing:6689537. Two top covers are available, one with a button that presses the BOOTSEL button for firmware updates and one without. All parts are shown in the PCB README. For questions about the case, please contact the designer on the Thingiverse page.
[!IMPORTANT] When the Pico is plugged into the through-holes of PCB v2.6 with male headers, always download the latest top case design from Thingiverse. Because the Pico sits higher on the board when headers are used, only the newest top cover leaves enough room for the USB cable to fit. The older covers were designed for a Pico soldered flat onto the PCB.
| Top cover | Base |
|---|---|
The PicoNES Mini, designed by Gavin Knight (DynaMight1124), is a smaller PCB for a Waveshare RP2040-Zero or RP2350-Zero, with two NES controller ports. It uses cheaper components that are harder to solder, and is recommended only for builders with good soldering skills. The Gerber file is Gerber_PicoNES_Mini_PCB_v2.0.zip.
The parts list and build instructions are in the Instructables guide, step 1. See also PicoNES Mini in the PCB README. The 3D-printed case is available on Thingiverse.
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.
The PicoNES Micro, designed by Gavin Knight (DynaMight1124), is a very small PCB for the Waveshare RP2350-USB-A, for one player with a USB controller. It uses 0603-size SMD components and requires micro-soldering skills. The Gerber file is Gerber_PicoNES_Micro_v1.2.zip.
The parts list, build instructions and case are in the Instructables guide, steps 2 and 3. See also PicoNES Micro in the PCB README.
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.
The Olimex RP2040-PICO-PC is a carrier board for a Raspberry Pi Pico with an HDMI connector, a microSD card slot, a USB-A port and an audio jack. Only a Raspberry Pi Pico 2 is supported in it.
Flash piconesPlus_OlimexPicoPC_arm.uf2 from the releases page.
Support for this board was contributed by DnCraptor.
The Pico Computer 3 (PC3) is an RP2350B computer board with an HDMI connector, a microSD card slot, 8 MB PSRAM, a USB hub and an audio jack.
Design files, schematics and parts lists: https://github.com/UKTailwind/Pico-Computer-3
[!NOTE] Support for this board is new. The pin assignment and other details below may change in a future release.
Flash piconesPlus_PicoComputer3_arm.uf2 from the releases page.
Sound: through the audio jack.
USB: USB controllers or a USB keyboard on the USB-A ports.
NES or SNES controllers: up to two, on the external I/O header H4:
| Clock | Latch | Data | |
|---|---|---|---|
| Port 1 | GPIO 0 | GPIO 1 | GPIO 2 |
| Port 2 | GPIO 3 | GPIO 4 | GPIO 5 |
NES Zapper: light sensor (D3) on GPIO 6 and trigger (D4) on GPIO 7. Games see it as a Zapper in controller port 2. See NES Zapper (light gun) for the gun and the game patches it needs.
Wii Classic controller: on I2C0, SDA on GPIO 20 and SCL on GPIO 21.
PSRAM: fitted on the board. Games are loaded from the SD card into PSRAM.
LED: the heartbeat LED on GPIO 25 is used when jumper H5 is set to 1-2.
Support for this board was contributed by javavi.
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.
| (S)NES | Genesis | XInput | DualShock/DualSense | Wii Classic | |
|---|---|---|---|---|---|
| Button1 | B | A | A | X | B |
| Button2 | A | B | B | Circle | A |
| Button3 | X (SNES only) | C | Y | Triangle | X |
| Select | select | Mode or C | Select | Select | Select |
[!NOTE] An original NES controller has no Button3. Everything reachable with it can also be reached from the settings menu.
In a game, Button1 is NES B and Button2 is NES A. With the Button Layout setting set to SNES, the left and the bottom button are used instead (SNES Y and B). See Settings menu.
Gamepad buttons:
When using a USB keyboard:
The menu keeps a list of the last 20 games you started, most recent first. Open it with Button3 in the menu, or with the Recently played entry at the top of the settings menu. That entry is only there when the settings menu is opened from the menu - a game cannot be started from inside a running game.
[!NOTE] On an original 3-button Genesis Mini controller, C acts as SELECT and opens the settings menu instead. Take the Recently played entry there.
In the list:
| Button | Action |
|---|---|
| UP/DOWN | Select a game. |
| Button2 | Start the highlighted game. |
| Button1 | Close the list and return to the menu. |
| SELECT | Remove the highlighted game from the list. Asks for confirmation first. This only removes the entry, the ROM on the SD card is left alone. |
| START | Show metadata and box art (when available). |
Games are added to the list automatically when you start them, so nothing has to be enabled. Starting a game that is already in the list moves it back to the top. The list closes by itself after a minute without input.
The list is kept in /recent_NES.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. See PSRAM.
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. |
| Recently played | Open the list of the last 20 games you started and restart one of them. Menu only, not available in-game. |
| Screen Mode | Cycle the screen modes, including the 8:7 pixel aspect ratio modes. |
| Scanline Type | Simple or LCD style scanlines. HSTX boards only. |
| NES Palette | The colors the game is drawn with. A description of the palette is shown below the options while this entry is selected. See Color palettes. |
| Framerate Overlay | Show the frames per second on screen, followed by the name of the color palette in use. |
| 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. |
| Button Layout | The buttons a game uses as NES B and A. NES (default): Button1 and Button2. SNES: on a controller with four face buttons, the left and the bottom button: Y and B on a SNES controller, X and A on XInput, Square and Cross on DualShock/DualSense, y and b on a Wii Classic controller. The menu and the button combinations are not affected. NES and Genesis controllers keep their buttons. A NES Classic controller on the Wii port cannot be told apart from a Wii Classic controller; use NES with it. |
| Rapid Fire on A / Rapid Fire on B | Enable rapid fire per button. |
[!NOTE] Changes are only applied when you select SAVE. CANCEL discards them, DEFAULT restores the default values. Press SELECT to jump directly to SAVE.
The colors a NES produces depend on the console and on the television, so there is no single correct palette. The palette is selected with NES Palette in the settings menu, or with START + LEFT/RIGHT during play. START + LEFT/RIGHT steps to the previous or next palette and shows its name at the top of the screen for 3 seconds. On RP2350 boards the choice is saved right away; on RP2040 boards it is saved when you quit the game to the menu. The name of the palette in use is also shown for 3 seconds when a game starts. While the framerate display is on, the name appears there instead. Default is the palette that earlier versions used; it differs between boards with HSTX video output and the other boards.
The palettes marked FBX are by FirebrandX and Wavebeam is by Nakedarthur. These, PC-10 and Sony CXA are published at firebrandx.com, and their descriptions below are taken from there.
| Palette | Description |
|---|---|
| Default | The palette used by earlier versions of this emulator. |
| Composite Direct (FBX) | A pure direct capture palette. Capture devices clip NTSC voltages to fit the RGB color space. Most colors come out normally, but some extreme edge-case colors are clipped and result in a different hue. The major example is the blue sky in Super Mario Bros., which appears more purplish in direct captures. |
| NES Classic (FBX) | Color values taken from the NES Classic console Nintendo released in 2016. The kernel was modified to include a test ROM that fills the screen with each color entry. The HDMI 720p signal was fed into a Datapath Vision E1s capture card, and the screens were stored as lossless 8-8-8 RGB bitmaps. The bitmaps were then color averaged to remove Nintendo's epilepsy protection. |
| PC-10 | RGB values taken from the original PlayChoice-10 arcade PPU chips. |
| PVM Style D93 (FBX) | Approximated NTSC NES color appearance on the screen of a Sony PVM monitor running at D93 color temperature. |
| Smooth (FBX) | FirebrandX's final palette for the NTSC NES. Combines reverse engineered NTSC output levels with a few slight adjustments to improve its appearance on digital displays. Has a wide dynamic range of dark-to-light colors. |
| Sony CXA | Intended to approximate the RGB translation of NTSC by certain consumer-grade Sony TV sets. The original author of this palette is unknown. |
| Wavebeam | Nakedarthur's final approximation palette, based on his experience with NES colors on consumer NTSC TVs. In its final revision it looks like a more saturated version of Smooth (FBX). |
| Bubbles | Reduced saturation for LCD and OLED screens. Contributed by dragonkn9 in #256. |
Gamepad buttons:
[!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.
FDS games are supported with the following requirements:
/bios/fds-bios.rom on the SD card. The file must be exactly 8 KB..fds extension.FDS games run on both RP2040 and RP2350 boards.
FDS games have these features:
/SAVES/<gamename>_fds.SAV. Earlier versions wrote one file per disk side, /SAVES/<gamename>_fds_s<N>.SAV, on RP2350 boards without PSRAM. These files are read automatically when no _fds.SAV file exists yet. Save states are not supported for FDS games.When prompted to swap disks, use the in-game settings menu:
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.
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
The menu allows you to play music files. Files must meet the following requirements:
.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.
You can easily convert MP3 files to WAV using Audacity:
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.
USB drive mode presents the SD card to a computer as a USB mass storage device, so games can be added or removed without taking the card out of the console. Connect the console to the computer, open the settings menu with SELECT from the game list and choose USB Drive Mode. The card appears on the computer as a removable drive.
The entry is only offered when the settings menu is opened from the game list. It is not available while a game is running: the running game holds its save files open and its ROM is mapped out of flash, and letting the computer rewrite the card underneath that would corrupt both.
When you are finished, eject the drive on the computer. The console notices this and leaves USB drive mode by itself. Pressing B on the console leaves as well, for when no computer is attached. The game list is re-read on the way out, so files added from the computer appear without having to restart.
[!NOTE] Transfers are slow. The console is a USB full-speed device and reaches the card a sector at a time over SPI, so copying is far slower than reading the card in a card reader. USB drive mode is meant for adding or replacing a few games. For filling a card, or for copying a large amount of data, take the card out and use a card reader.
Behaviour depends on where controllers are connected on your board.
| Board | Behaviour |
|---|---|
| Controllers on a separate USB port (boards built with PIO USB, such as the Fruit Jam) | The console's own USB port is free, so controllers keep working and the screen stays on. The menu returns to the game list when you are done. |
| Controllers on the console's own USB port | That port is the one connected to the computer, so a USB controller cannot be used while the card is mounted. Press B on a controller in the NES port, or eject the drive on the computer. The console restarts afterwards. |
| RP2040 boards | As above, and the screen is switched off for as long as the card is mounted. These boards cannot drive the video output while the computer is reading the card. The menu explains this first and lets you go back without mounting anything. |
[!CAUTION] Eject the drive on the computer rather than pressing B. Ejecting makes the computer write out anything it still had cached, and the console leaves USB drive mode on its own once it has. Pressing B while the computer still has the drive open can leave files on the card incomplete.
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.
Using a USB game controller introduces some latency. The legacy controllers ((S)NES, Wii Classic) have less latency.
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.
Might not work with all controllers.
Tested devices:
After flashing some bigger games, the controller might become unresponsive:
Xbox Controller. Playing with batteries removed is recommended. When controller becomes unresponsive:
8bitdo controllers, when controller becomes unresponsive:
Some displays need 5V connected to the HDMI breakout in order to work:
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:
pico-bootLoader_sdcard.zip onto a FAT32 or exFAT SD card.[!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 boot loader 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.
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/PicoPlus-devel/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
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.
15: Olimex RP2040-PICO-PC with a Pico 2 (rp2350 only)
17: Pico Computer 3 (PC3): HSTX video, I2S audio, USB hub (rp2350 only)
-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.
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)
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.
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.
Olimex RP2040-PICO-PC support, including sound through its audio jack, by DnCraptor.
Pico Computer 3 support, and the NES controller reading code used on all boards, by javavi.
XInput driver: https://github.com/Ryzee119/tusb_XInput by Ryzee119
FatFS driver: https://github.com/elehobica/pico_fatfs by elehobica
USB drive mode is derived from Adafruit_ColecoJam by Dan Cogliano
PSRAM: AndrewCapon
lwmem: MaJerle
Audio feedback and fixes: szuping
NES color palettes: FirebrandX, added to the emulator by szuping. Wavebeam palette by Nakedarthur. Bubbles palette by dragonkn9
Mesen: https://github.com/SourMesen/Mesen2 used as basis for:
Anthropic Claude Opus 4.6 and 4.7 assisted with:
There is also a version available for the Pimoroni PicoSystem handheld.
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.
Can be used in three 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.
Olimex RP2040-PICO-PC fitted with a Raspberry Pi Pico 2. For use with a USB game controller and a NES or SNES controller on the UEXT connector. See Olimex RP2040-PICO-PC.
Pico Computer 3 (PC3), an RP2350B board with HDMI, an audio jack, a USB hub, PSRAM and an I/O header for NES or SNES controllers. See Pico Computer 3.
| 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. |
| Sprite Limit (8 per line) | Draw at most 8 sprites per scanline, as the NES does. On by default. Turning it off reduces sprite flicker, but a few games rely on the limit, for example Felix the Cat. |
| Overclock | Raise the CPU clock from 252 MHz to 384 MHz. Only on HSTX boards with PSRAM, and currently only needed for Lagrange Point (JP). Menu only, not available in-game. |
| 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 + UP for 2 seconds to exit. |
| Enter BOOTSEL Mode | Reboot into BOOTSEL so you can flash new firmware. |
| USB Drive Mode | Show the SD card on a computer as a USB drive, so games can be added or removed without taking the card out. See USB drive mode. Menu only, not available in-game. |
| Return to emulator selection | Go back to the emulator picker. Only present in pico-bootLoader builds. |