thomaspiquetcom
ProjectsContact
← Projects
Type
Tool
Year
2026
Role
Author
Stack
C++23 · CMake · SDL3
Target
RP2350 · Pico 2 W
Status
In development

Emu235

A C++ emulator of the Raspberry Pi Pico 2 W. It runs the same compiled firmware as the real board, so firmware can be developed and tested without flashing the board at every change.

Context

The RP2350 is the microcontroller of the Raspberry Pi Pico 2. Testing firmware on the board means flashing it at every change, and what happens inside the chip is hard to observe. Emu235 runs the same UF2 or ELF file on a PC instead.

Goal

Make writing firmware for the Pico 2 open to more people. With Emu235, a firmware can be written, run and shared without owning the board or wiring anything to it.

A firmware can then be a game for PC or phone, shipped with Play, and still run on a real Pico 2, since it is the same file.

What I built

Emu235 emulates both Arm Cortex-M33 cores of the RP2350, its memories and its peripherals, and devices of the board such as the CYW43439 Wi-Fi chip and the screens. The same firmware with the same inputs always gives the same result.

All of it is emulated, except the dashed RISC-V cores.

Checked on the board

Monster Bench is a firmware written to compare the emulator with the chip. The same file runs on a real Pico 2 W and in Emu235. It runs 845,868 checks in 103 suites: integer and DSP arithmetic, floating point, division, exceptions, both cores, DMA, the SHA-256 and random-number hardware, and more. It also times 175 short loops.

Run of 13 October 2026, Pico 2 W (RP2350 A2) at 150 MHz, against Classic.

Every check gives the same result on the board and in Classic, down to the digest of all the results. Timing is harder to match: 84 of the 175 loops take exactly as many microseconds as on the board, 139 are within 1% and 150 within 5%. The whole run takes 0.18% longer in the emulator.

The versions are also checked against each other. Fast must give the same results with and without its JIT (machine state, serial output, frames) on 14 firmwares, from a blinking LED to MicroCraft.

The .e235 format

A firmware ships as a .e235 package: a standard ZIP that holds the firmware, UF2 or ELF, unchanged byte for byte, and a JSON manifest. The firmware is written for the real board and knows nothing about the emulator.

Example: MicroCraft. Play reads both files; a real Pico 2 only needs the firmware.

The manifest describes what surrounds the firmware:

  • the board it expects: the screen and its wiring (ST7789 over SPI, ILI9341, DVI over HSTX, or the Pico 2 W) and any extra circuits;
  • how the host's inputs reach the board's pins, from the keyboard or a gamepad;
  • the emulator's settings: window scale, full screen, Wi-Fi, USB devices, serial port, saves, sound, and whether the player may remap keys.
MicroCraft's manifest: W closes the contact between GP4 and GP9, as a pressed button would.

To run the same firmware on a real Pico 2, open the package as a ZIP and copy the firmware to the board (wired the way the firmware's author intended).

Versions

Every version shares one model of the board; two engines run it.

None of them is released yet. Play and Play mobile come first, then Fast.

PlayPlay mobileFastClassic
RolePlay firmwarePlay firmwareDevelop firmwareReference
EngineFastFastFastClassic
PriorityReal timeReal timeSpeedCycle accuracy
Opens.e235, UF2, ELF.e235UF2, ELFUF2, ELF
PlatformWindowsAndroidWindowsWindows
JITx86-64ARM64, in progressx86-64x86-64
ReleaseFirstFirstNextNot planned

Classic's timings are checked against measurements taken on a real Pico 2.

Trademarks

Raspberry Pi, Pico and RP2350 are trademarks of Raspberry Pi Ltd. Arm and Cortex are trademarks of Arm Limited. CYW43439 is a product of Infineon Technologies. Other names belong to their owners. Emu235 is an independent project: it is not affiliated with, endorsed by or sponsored by any of them.