Open-source project
fruit-bat/pico-zxspectrum avatar
fruit-bat/pico-zxspectrum

pico-zxspectrum turns a Raspberry Pi Pico into a ZX Spectrum, roughly

ZX Spectrum for Raspberry Pi Pico RP2040 and RP2350

618 stars82 forksC++MIT

At a glance

What is it?
pico-zxspectrum is a firmware project that puts a 48K or 128K ZX Spectrum emulator on a Raspberry Pi Pico RP2040 or RP2350, driving video over DVI, HDMI or VGA and audio over PWM, I2S DAC or HDMI. The author is explicit that the emulation is not highly accurate and that the point is fun and prototyping.
Who is it for?
pico-zxspectrum suits a maker who wants a pocket ZX Spectrum they solder onto a breadboard, or a retro computing enthusiast who needs the machine reproduced in hardware rather than in software on a desktop.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 156 days ago.
What is it written in?
Mainly C++, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A Spectrum emulator as firmware on a four dollar microcontroller

pico-zxspectrum is described in one line as a 48k or 128k ZX Spectrum for the Raspberry Pi Pico, targeting both the RP2040 and the RP2350. The primary language is C++, and the build is driven by CMake with a Pico SDK import, which tells you it is a real firmware image rather than a script running on Linux.

The framing sentence in the documentation is unusually candid for a retro project. It says the project is intended to be relatively easy to breadboard or prototype in some other way, that it is just for fun and not a highly accurate emulation, and that hopefully it is good enough to be enjoyable.

That last clause sets the expectation properly. This is an approximation of a 1982 home computer, not a cycle-exact replica. Games from the era will mostly work, because they were written to a hardware spec that people reverse engineered and emulators have reproduced for decades. But anything that depends on precise timing, on undocumented hardware behaviour, or on a peripheral the firmware does not implement will not match the real machine.

The audience is a maker with a soldering iron and a spare Pico, or a retro computing hobbyist who wants the physical object rather than an emulator on a laptop. The docs directory is full of wiring diagrams and board write-ups, which is the clearest evidence of who this is for.

Video through DVI, HDMI, VGA or a small LCD

The video side is where most of the wiring effort goes, and the project supports four distinct paths.

Digital video uses DVI through Wren's Amazing PicoDVI, and HDMI is also listed as a supported output. VGA is handled by a dedicated output stage with several pixel formats available: RGB332, RGB222 and RGBY1111, which are different compromises between colour depth and the number of pins needed on the connector. There is also a CVBS option documented separately for a 50Hz output.

Small displays are supported through an ST7789 or ILI9341 panel at 320x240, and several of the board designs in the documentation are built around a small LCD rather than a monitor, the PICOZX LCD, the PICOZX2 LCD, the PicomputerMax and the PicomputerZX among them.

That variety is the reason the repository lists so many boards. The documentation table maps each design to a note: breadboard HDMI and VGA variants, the PICOZX HDMI, the PICO ZX48/128 replacement board, the RetroVGA micro-computer, the Pimoroni Pico DV and Pico VGA commercial boards, the ArnoldUK board, the MURMULATOR and MURMULATOR2, and two Waveshare Pi Zero development boards, one on the RP2040 and one on the RP2350. Several of them are credited to Bobricius.

The choice you make here is a commitment to a video mode and its pin requirements, and picking the wrong one means redoing the wiring rather than changing a setting.

Input handling across USB, PS/2 and a matrix

Three input paths are supported, and the choice between them is a hardware decision rather than a configuration one.

USB is the modern route, covering both keyboards and joysticks. PS/2 is supported for keyboards, which covers a lot of older hardware and USB-to-PS/2 adapters. A matrix keyboard is the third option, and the breadboard designs with a key matrix are the ones that use it, since scanning a matrix directly in firmware avoids needing a keyboard controller at all.

Joystick emulation covers both the Kempston and the Sinclair interface, which matters because games targeted one or the other, and a Kempston mouse emulation is included as well.

What the documentation does not spell out is the priority order when several input devices are attached, or whether all three input paths can be active at the same time. If you are wiring a board with both a PS/2 keyboard and a USB keyboard, that is a question for the source rather than for the readme.

The storage side is the more interesting part of the feature list, and it is covered in the next section.

Tape files, snapshots and twelve save slots

The storage features are what make an emulated Spectrum usable rather than a curiosity. The project reads .tap and .tzx tape files, which are the two common tape image formats, and supports audio input so you can load from tape in the way the original machine worked, complete with the loading sound.

It also loads from .z80 snapshot files, which is the format for saved RAM states. Combined with the on screen menu system and the 12 quick save slots, that gives a usable workflow: run something, save a state, go back to the menu, load another.

The menu is on screen rather than in a separate application, which makes sense for a device with no display of its own beyond whatever you have plugged in. A screenshot in the docs shows the main volume menu, and the audio samples in the documentation are recordings of real games running on the hardware, The Swarm and The Goblin in four pin PWM, which is the kind of evidence that only comes from the thing actually running.

For a hardware emulator, this set of features is the difference between a demonstration and something you would sit and use. Saving a state is the feature people miss most, because the alternative, replaying a tape from the start, is the authentic experience and also the tedious one.

Three ways to get sound out, and what each one costs

Audio output is described as three techniques, and the hardware differences between them are significant.

The first is a mixture of digital sound and PWM output, which comes in three pin variants. The documentation gives a table of the four audio labels on the Pico and what each can drive. RP AUDIO1 handles a buzzer and the AY-3-8912 sound chip in one pin variant, or the AY chip alone in the two pin variant, or AY channel A in the four pin variant. RP AUDIO2 adds a buzzer to the two pin and four pin variants. RP AUDIO3 carries AY channel B, and RP AUDIO4 carries AY channel C.

The ZX Spectrum's characteristic sound comes from the AY-3-8912, a three channel chip, and that is why the pin count matters. Driving all three channels needs the four pin variant, and a single pin variant gives you one channel and a buzzer.

The second technique is a DAC connected over I2S, which is the higher quality path and needs an external DAC chip. The third is audio over HDMI, which needs nothing extra beyond the HDMI output you already have.

One practical note is included: high frequencies need to be filtered out of the PWM audio output and mixed with the rest. That is a real hardware problem, since a PWM output is a square wave full of harmonics, and it explains why the audio samples are described as coming from specific pin configurations.

Flashing firmware by dragging a UF2 file

The installation path is the standard one for a Pico, and the documentation is explicit about the safety step.

Pre-built binary targets can be copied directly to a Pico, and they are available from the links on the page for the board, or in the uf2 folder of the repository. The uf2-rp2040 and uf2-rp2350-arm-s directories at the repository root correspond to the two chip variants, so the target you flash has to match your hardware.

Before updating the firmware you must disconnect power supplies and any USB host devices, with a hub, keyboard and joysticks named specifically. Then you hold the BOOTSEL button while plugging the Pico into the USB port, release it after connection, and the board mounts as a mass storage device called RPI-RP2. You drag the UF2 file onto that volume.

The command for doing the same thing from a shell on a Pi is given for the HDMI breadboard wiring:

sh
cp ZxSpectrumBreadboardHdmi4PinAudio.uf2 /media/pi/RPI-RP2/

There is a small hardware wrinkle worth knowing. On boards with a faceplate the button is usually reachable through a small hole, but the PICOZX LCD board has the Pico facing inwards and you need to reach a finger inside the case to press BOOTSEL.

For building rather than flashing, the repository carries a CMakeLists.txt, a build.sh, a comb_uf2.sh script, pico_sdk_import.cmake and pico_extras_import.cmake, plus a boards directory and a test directory.

MIT licensed, no releases, and a quiet last few months

The licence is MIT, so there is nothing unusual about using the firmware, modifying it or putting a board built from it on a desk. The LICENSE file sits at the repository root, and the project publishes no GitHub releases at all.

That last point matters for how you install. The documentation points you at links on the board pages and at the uf2 folder in the repository rather than at a tagged release, so you are copying a specific pre-built file by name, for example ZxSpectrumBreadboardHdmi4PinAudio.uf2 for that particular breadboard wiring. The mapping between board and file is the thing to get right.

Upkeep is modest. The last push was on 2026-05-20, and the update log records the most recent entry as the addition of builds for the Waveshare RP2350-PiZero board on 05/10/25, with earlier notes collected in docs/updates.md. The repository is not archived, and the topic list on the project covers the emulator, the boards and the firmware build system.

The pattern across the documentation is that new hardware appears as new board write-ups, sometimes contributed by other people, with a matching pre-built binary in the uf2 folders. That is how a hobby firmware project grows, and it means the gap between the newest board and a matching binary is the thing to check before you order parts.

Editorial conclusion

pico-zxspectrum suits a maker who wants a pocket ZX Spectrum they solder onto a breadboard, or a retro computing enthusiast who needs the machine reproduced in hardware rather than in software on a desktop. It is the wrong choice for anyone needing accurate timing or cycle-exact behaviour, since the documentation says outright that this is not a highly accurate emulation, and the wrong choice if you want finished hardware, because the boards are hobbyist designs assembled from a Raspberry Pi Pico and loose parts. Before soldering, pick one of the documented board wirings rather than inventing your own, copy the matching UF2 firmware onto the RPI-RP2 volume, and confirm your display accepts the video mode you plan to use, since the video options are genuinely different hardware paths.

Frequently asked questions

Which Raspberry Pi Pico boards does pico-zxspectrum run on?

The project targets the Raspberry Pi Pico RP2040 and RP2350, and the repository has separate uf2-rp2040 and uf2-rp2350-arm-s directories with pre-built binaries for each. The documentation also lists a Waveshare RP2350-PiZero build added on 05/10/25.

How do I install the pico-zxspectrum firmware on a Pico?

Disconnect power supplies and USB host devices first, then hold BOOTSEL while plugging the Pico into the USB port and release it once connected. The board mounts as a mass storage device called RPI-RP2, and you drag the UF2 file for your board onto it, or copy it with a command such as cp ZxSpectrumBreadboardHdmi4PinAudio.uf2 /media/pi/RPI-RP2/.

How accurate is the ZX Spectrum emulation in pico-zxspectrum?

The documentation states the project is intended to be relatively easy to breadboard, that it is just for fun and not a highly accurate emulation, and that hopefully it is good enough to be enjoyable. It supports .tap and .tzx tape files, .z80 snapshots, 12 quick save slots and Kempston and Sinclair joystick emulation.

Official sources

  1. fruit-bat/pico-zxspectrum on GitHub
  2. Issues
  3. License: MIT
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/fruit-bat-pico-zxspectrum.svg)](https://hysenlabs.com/projects/fruit-bat-pico-zxspectrum)

Was this useful?