Other than that, everything feels really well done. Building something like this in JavaScript/HTML, especially with a 3D model this detailed, must be quite challenging from an optimization standpoint.
Great work!
95 karma · joined February 4, 2026
Other than that, everything feels really well done. Building something like this in JavaScript/HTML, especially with a 3D model this detailed, must be quite challenging from an optimization standpoint.
Great work!
AI was used to port to ESP32, and human talent was used to assemble the circuit, hardware, and proprietary knowledge of ESP32 and FreeRTOS optimizations.
Rather than running an emulator, the decompiled C source from mgs_reversing is compiled natively to Xtensa machine code. Everything the original PS1 hardware provided, including the GTE, GPU, BIOS scheduler, and CD drive, is reimplemented in software on top of ESP-IDF and FreeRTOS.
SoC: ESP32-S3, dual-core Xtensa LX7 @ 240 MHz, 512 KB internal SRAM, 8 MB Octal PSRAM.
Display: 320×240 LCD (ST7789 / ILI9341) over SPI at 40 MHz.
Storage: MicroSD card over SPI containing the full game stage assets (STAGE.DIR).
Internal SRAM is fast but limited, while PSRAM provides 8 MB of additional memory but sits behind the same cache subsystem used for external Flash.
Placing FreeRTOS task stacks in PSRAM initially appeared to work, until a task performed file I/O such as fopen().
When external Flash cache was disabled during Flash/PSRAM access, the CPU could no longer safely access task stacks stored in PSRAM, causing an immediate SoC crash.
I’ve been working on getting the real Apple iPod Classic 6G firmware running in QEMU. It currently emulates two clickwheel iPods, including the display ,click wheel input and music player.
https://github.com/davidmonterocrespo24/qemu-ipod-classic
Still a work in progress
Appreciate the feedback.
try the example Traffic Light : Simulate a traffic light with red, yellow, and green LEDs
The emulation itself is pure JavaScript (avr8js), not WebAssembly. The simulation loop runs on requestAnimationFrame and executes 267K AVR instructions per frame (16MHz / 60fps) in a synchronous batch. Port listeners use dirty-checking so the UI is only notified when a GPIO register actually changes value and since all those cycles run in one JS microtask, React reconciles exactly once per frame regardless of how many state changes happened during the batch
So there's no explicit throttle interval like your 2 sec approach, but the architecture achieves something similar. the CPU runs freely, state changes are coalesced within each rAF frame, and the DOM only sees the final result. For your deck.gl case with thousands of points, the 2s batch makes sense since you're dealing with a much higher entity count hitting the GPU , our problem domain is simpler (dozens of components) but the cycle-accurate emulation is the expensive part
I tried to make it as close to zero-setup as possible so people can just jump in and experiment
Definitely inspired by existing tools, but trying to push further into full multi-board emulation and local-first workflows
Being able to iterate without constantly flashing hardware can save a lot of time early on.
If you end up trying it in your workflow, I’d love to hear how it goes
And glad you liked the oscilloscope, that was a fun one to build.You can select the motherboard and ping you want to monitor.
A lot of simulators stop at simple sketches, but the goal with Velxio is to support more realistic workflows , multiple boards interacting, real toolchains, and more complex setups
Still early, but definitely moving in that direction
Things are more stable now, but still tuning performance under load
If anyone finds it useful, the source is here: https://github.com/davidmonterocrespo24/velxio
Always happy to get feedback or contributions.
The Raspberry Pi emulation already runs Python, and I’d like to extend that into proper MicroPython / CircuitPython support for microcontrollers as well
It’s a bit tricky depending on the board/emulator, but definitely a priority!
I used a little AI to create the graphical interface since I focused heavily on emulation, testing, and refining and optimizing the circuit editor. But now I have plans to improve the UI and make it faster and more intuitive
Still a lot to improve there, but glad it’s useful already
The container pulls additional assets on first run (mainly emulation dependencies), which is why there's extra downloading even with -d.
You're right that it can be confusing. I'll update the instructions to make this clearer (and probably remove -d so users can see what's happening)
If anyone still has issues accessing velxio.dev, let me know
I also integrated a couple of existing open-source emulators, like the Raspberry Pi Pico and Arduino ones. And I even reached out to the creator of Wokwi to share the project.
In terms of differences, one of the biggest ones is that Velxio supports multiple heterogeneous boards in the same circuit: for example, two Arduinos connected over SPI or serial, ESP32 with Arduino, Raspberry Pi 3 with a Pico, etc.
Another major difference is the focus on full emulation, including ESP32 (via QEMU) and a Raspberry Pi 3 running Linux (still in beta).
There are also quite a few other differences, but those are probably the most notable ones
It’s still exploratory, but it could definitely go in that direction