# ZX-Picocalc (Sinclair ZX Spectrum emulator)

**URL:** <https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323>\
**Category:** PicoCalc\
**Tags:** firmware, emulation\
**Created:** [November 2, 2025, 9:51pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323 "2025-11-02T21:51:15Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![ohm69](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/ohm69/32/11926_2.png) [@ohm69](https://forum.clockworkpi.com/u/ohm69)\
**Post date:** [November 2, 2025, 9:51pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/1 "2025-11-02T21:51:15Z")

</div>

Hi, I’m working on emulating Sinclair ZX Spectrum 8-bit computer on PicoCalc.

PicoCalc, with its color 320x320 display and rubber qwerty keyboard is in many ways so much similar to ZX Spectrum…

And so I have zx-2040 emulator somewhat running now on Picocalc. Main issue is a low-level keyboard driver, or lack of it. I’d love to have it interrupt-based, but I can’t find information how to do it or whether it’s possible. If you have a knowledge on advanced I2C keyboard programming - please contact me.

Anyway, here are some Spectrum games I tried:

[![](https://img.youtube.com/vi/p3rtdQkmYJs/maxresdefault.jpg "BombJack on Picocalc") ](https://www.youtube.com/watch?v=p3rtdQkmYJs)

[![](https://img.youtube.com/vi/GRqfQ2hFxuI/maxresdefault.jpg "Atic Atac on Picocalc") ](https://www.youtube.com/watch?v=GRqfQ2hFxuI)

[![](https://img.youtube.com/vi/tdEk7oRfxbU/maxresdefault.jpg "Pacman on Picocalc") ](https://www.youtube.com/watch?v=tdEk7oRfxbU)

More information about zx-picocalc project [on my blog](https://ohm.bearblog.dev/emulating-zx-spectrum-on-my-picocalc/).

---

<div class="post-metadata">

**Author:** ![maple](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/maple/32/12677_2.png) [@maple](https://forum.clockworkpi.com/u/maple)\
**Post date:** [November 3, 2025, 4:47am UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/2 "2025-11-03T04:47:49Z")

</div>

interrupt-driven keyboard polling isn’t possible because that’s not how the I2C keyboard communicates to the pico

Blair Leduc’s picocalc-text-starter has a good example of polling the keyboard with a timer detached from the main loop however, and from there you can make a soft-“interrupt” which calls your emulator to let it know there’s a key being pressed: [picocalc-text-starter/drivers/keyboard.c at main · BlairLeduc/picocalc-text-starter · GitHub](https://github.com/BlairLeduc/picocalc-text-starter/blob/main/drivers/keyboard.c)

---

<div class="post-metadata">

**Author:** ![ohm69](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/ohm69/32/11926_2.png) [@ohm69](https://forum.clockworkpi.com/u/ohm69)\
**Post date:** [November 3, 2025, 6:11am UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/3 "2025-11-03T06:11:24Z")

</div>

Thanks, I’ll look into it

---

<div class="post-metadata">

**Author:** ![Marsupial](https://avatars.discourse-cdn.com/v4/letter/m/e9bcb4/32.png) [@Marsupial](https://forum.clockworkpi.com/u/Marsupial)\
**Post date:** [November 3, 2025, 10:42am UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/4 "2025-11-03T10:42:04Z")

</div>

You should upload your source to your fork to let people in with the fun

---

<div class="post-metadata">

**Author:** ![pnwkayaker](https://avatars.discourse-cdn.com/v4/letter/p/46a35a/32.png) [@pnwkayaker](https://forum.clockworkpi.com/u/pnwkayaker)\
**Post date:** [November 3, 2025, 1:32pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/5 "2025-11-03T13:32:36Z")

</div>

I’m very interested in this port also (played too much time with a ZX Spectrum as a kid). Something super cool would be to map the Kempston joystick input to the cursor keys in the PicoCalc, so it’s a lot more straightforward experience.

I just got a PicoCal over the weekend, could try to add that mapping if you post a link to your code?

---

<div class="post-metadata">

**Author:** ![chr256](https://avatars.discourse-cdn.com/v4/letter/c/a183cd/32.png) [@chr256](https://forum.clockworkpi.com/u/chr256)\
**Post date:** [November 4, 2025, 1:00pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/6 "2025-11-04T13:00:02Z")

</div>

Nice project, thanks !  
Since the pico keyboard is quite cramped, i would remap the direction keys as follow :

Up = Q

DOWN = C

RIGHT = P

LEFT = U

SHOOT = SPACEBAR

And have a remap option built into the emulator (could be inside a config text file)

---

<div class="post-metadata">

**Author:** ![Hark0](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/hark0/32/11934_2.png) [@Hark0](https://forum.clockworkpi.com/u/Hark0)\
**Post date:** [November 7, 2025, 10:34pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/7 "2025-11-07T22:34:57Z")

</div>

oooooohhhh

QAOP!!! 🤣

---

<div class="post-metadata">

**Author:** ![ohm69](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/ohm69/32/11926_2.png) [@ohm69](https://forum.clockworkpi.com/u/ohm69)\
**Post date:** [November 15, 2025, 4:54pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/8 "2025-11-15T16:54:22Z")

</div>

Hi, first version of zx-picocalc is more or less ready, enjoy!

There is no games included in the package btw, you need to get .z80 files by yourself and then upload them. More info in [README.md](https://github.com/ohm69/zx-picocalc/blob/main/README.md)

> **[Releases · ohm69/zx-picocalc](https://github.com/ohm69/zx-picocalc/releases)**
>
> RP2040 ZX Spectrum emulator ported to Picocalc by Clockwork Pi - ohm69/zx-picocalc

---

<div class="post-metadata">

**Author:** ![DigitalDreams](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/digitaldreams/32/16007_2.png) [@DigitalDreams](https://forum.clockworkpi.com/u/DigitalDreams)\
**Post date:** [November 15, 2025, 9:08pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/9 "2025-11-15T21:08:35Z")

</div>

What’s the possibility of a Pico2 2350 version ?

---

<div class="post-metadata">

**Author:** ![ohm69](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/ohm69/32/11926_2.png) [@ohm69](https://forum.clockworkpi.com/u/ohm69)\
**Post date:** [November 16, 2025, 1:12pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/10 "2025-11-16T13:12:44Z")

</div>

Yeah, why not 🙂

New release includes version for pico2\_w.

> **[Releases · ohm69/zx-picocalc](https://github.com/ohm69/zx-picocalc/releases)**
>
> RP2040 ZX Spectrum emulator ported to Picocalc by Clockwork Pi - ohm69/zx-picocalc

---

<div class="post-metadata">

**Author:** ![ohm69](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/ohm69/32/11926_2.png) [@ohm69](https://forum.clockworkpi.com/u/ohm69)\
**Post date:** [November 16, 2025, 1:14pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/11 "2025-11-16T13:14:38Z")

</div>

Done! I also included pre-built uf2 files.

---

<div class="post-metadata">

**Author:** ![DigitalDreams](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/digitaldreams/32/16007_2.png) [@DigitalDreams](https://forum.clockworkpi.com/u/DigitalDreams)\
**Post date:** [November 16, 2025, 3:18pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/12 "2025-11-16T15:18:04Z")

</div>

Pico2w ?… How about a plain Pico2 (overclocked to 378Mhz)

---

<div class="post-metadata">

**Author:** ![TheFlynn49](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/theflynn49/32/14674_2.png) [@TheFlynn49](https://forum.clockworkpi.com/u/TheFlynn49)\
**Post date:** [November 16, 2025, 7:53pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/13 "2025-11-16T19:53:39Z")

</div>

Nice ZX emulator ! Thank you !

---

<div class="post-metadata">

**Author:** ![Marsupial](https://avatars.discourse-cdn.com/v4/letter/m/e9bcb4/32.png) [@Marsupial](https://forum.clockworkpi.com/u/Marsupial)\
**Post date:** [November 16, 2025, 9:45pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/14 "2025-11-16T21:45:13Z")

</div>

The W is about wireless capability. They have the same processing chip so it shouldn’t be a problem

---

<div class="post-metadata">

**Author:** ![ohm69](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/ohm69/32/11926_2.png) [@ohm69](https://forum.clockworkpi.com/u/ohm69)\
**Post date:** [November 22, 2025, 11:04pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/15 "2025-11-22T23:04:30Z")

</div>

I have added an ability to load the snapshots/games from an SD card. Enjoy!

Known issue: On RP2040 the size of a game loaded that way is limited. On RP2350 even 48kb games work correctly.

> **[Releases · ohm69/zx-picocalc](https://github.com/ohm69/zx-picocalc/releases)**
>
> RP2040 ZX Spectrum emulator ported to Picocalc by Clockwork Pi - ohm69/zx-picocalc

---

<div class="post-metadata">

**Author:** ![Jonjo747](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/jonjo747/32/14749_2.png) [@Jonjo747](https://forum.clockworkpi.com/u/Jonjo747)\
**Post date:** [November 23, 2025, 2:34am UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/16 "2025-11-23T02:34:03Z")

</div>

Well the stm32f103 keyboard controller could be reprogrammed to act as I2c master by updating Code/picocalc\_keyboard/picocalc\_keyboard.ino

Changing roles could give you interrupt capability for keyboard.

Be careful with reprogramming, stm32 controls PMU.

> **[GitHub - clockworkpi/PicoCalc: A calculator like nothing you've ever seen before,...](https://github.com/clockworkpi/PicoCalc)**
>
> A calculator like nothing you've ever seen before, right?

---

<div class="post-metadata">

**Author:** ![maple](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/maple/32/12677_2.png) [@maple](https://forum.clockworkpi.com/u/maple)\
**Post date:** [November 23, 2025, 2:49am UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/17 "2025-11-23T02:49:54Z")

</div>

oh, yes, i know the possibility is there, but then you’d need people to use a special keyboard firmware just to use your Pico firmware

---

<div class="post-metadata">

**Author:** ![ohm69](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/ohm69/32/11926_2.png) [@ohm69](https://forum.clockworkpi.com/u/ohm69)\
**Post date:** [November 23, 2025, 8:09am UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/18 "2025-11-23T08:09:22Z")

</div>

Yeah, I’d rather have BIOS updated by ClockworkPi to limit fragmentation. I think I will just move keyboard polling to a second core and leave the first one with z80 emulation.

Btw, what I’d really love would be additional I2C command that reads raw keyboard row/column state. That way the games could easily support several key pressed at a time. Passing that info to the emulators would also be much more direct.

Don’t get me wrong, current BIOS function does a great job returning ASCII codes for regular productivity apps, but there are other use cases…

Actually, I could support both APIs for maximum compatibility

---

<div class="post-metadata">

**Author:** ![maple](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/maple/32/12677_2.png) [@maple](https://forum.clockworkpi.com/u/maple)\
**Post date:** [November 23, 2025, 3:54pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/19 "2025-11-23T15:54:38Z")

</div>

you can already support several key presses at the same time if you simply store the state of each key updated by their pressed and released events. my Lua firmware does this: [picocalc\_lua/drivers/keyboard.c at eeb26709ed167af3c9b841de927dd628b57fbac8 · Lana-chan/picocalc\_lua · GitHub](https://github.com/Lana-chan/picocalc_lua/blob/eeb26709ed167af3c9b841de927dd628b57fbac8/drivers/keyboard.c#L138)

---

<div class="post-metadata">

**Author:** ![ohm69](https://yyz1.discourse-cdn.com/flex029/user_avatar/forum.clockworkpi.com/ohm69/32/11926_2.png) [@ohm69](https://forum.clockworkpi.com/u/ohm69)\
**Post date:** [November 24, 2025, 9:42pm UTC](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323/20 "2025-11-24T21:42:36Z")

</div>

Yeah, I’m doing that as well.

Matrix keyboard driver would be much simpler and more elegant though.

[Next page](https://forum.clockworkpi.com/t/zx-picocalc-sinclair-zx-spectrum-emulator/20323.md?page=2)
