- 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.
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.
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.
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.
key:W → contact [2, 1]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
None of them is released yet. Play and Play mobile come first, then Fast.
| Play | Play mobile | Fast | Classic | |
|---|---|---|---|---|
| Role | Play firmware | Play firmware | Develop firmware | Reference |
| Engine | Fast | Fast | Fast | Classic |
| Priority | Real time | Real time | Speed | Cycle accuracy |
| Opens | .e235, UF2, ELF | .e235 | UF2, ELF | UF2, ELF |
| Platform | Windows | Android | Windows | Windows |
| JIT | x86-64 | ARM64, in progress | x86-64 | x86-64 |
| Release | First | First | Next | Not 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.