# Bare-metal emulator precedents on the Raspberry Pi

Checked on 2026-10-21. Every project was cloned with `git clone --depth 1` into a temporary directory and its README, documentation and release notes were read. The commit hash of each clone is given with its section, and a claim cites either a link or `path:line` inside that clone. Where something could not be verified it is marked **open**. GitHub search results are used only to find projects, never to settle what a project does.

## Scope and reading notes

The question behind this document is what precedents show about porting an emulator such as Previous (68030/68040 core derived from WinUAE, plus an i860 core) to a Raspberry Pi 5 without Linux. The projects fall into four groups:

1. A framework: [Circle](https://github.com/rsta2/circle), which nearly every bare-metal emulator on the Pi builds on.
2. An emulator family built on Circle: BMC64 and its descendants (BMA800XL, BMCoco, BMApple2, BMAtariST, BMX, BMC64-NG, BMRetroSys).
3. A bare-metal 68k JIT with its own code: Emu68, used by PiStorm hardware.
4. Single-purpose projects: Pi1541, Faux86, a Sega Genesis emulator, PiTubeDirect, ZX Raspberry, umac-zero.

Line counts below come from `find ... -exec cat {} + | wc -l` over whole directories, so they include headers, assembly, web UI files and shader sources, not only C and C++.

## Circle (the framework)

Source: clone at `7a81e1b`, last commit 2026-09-25 (`git log`), https://github.com/rsta2/circle.

- Circle describes itself as "a C++ bare metal programming environment for the Raspberry Pi" that "can be used to create 32-bit or 64-bit bare metal applications" (`README.md:4`).
- Pi 5 is listed as "Tested" with "BCM2712 C1 and D0 steppings" in the support table. Pi 1 to Pi 4, Pi 400, Zero, Zero 2 W and several Compute Modules are listed too (`README.md`, section "Support Status").
- "Circle does not support 32-bit applications on the Raspberry Pi 5." AArch64 builds use `RASPPI` 3, 4 or 5 (`README.md`, sections "Build" and "AArch64").
- The feature table has a Pi 5 column. Items marked there for the Pi 5: multi-core support, MMU caches, USB host with HID keyboard, mouse and gamepad, USB mass storage, FatFs, TCP/IP stack, wireless LAN, the RP1 DMA controller, the MACB/GEM Ethernet NIC, HDMI sound output without VCHIQ. Interrupt support is "IRQ only", the frame buffer is "limited", and the platform DMA is "DMA40 only".
- Items with an empty Pi 5 cell: the VCHIQ interface and audio service drivers, OpenGL ES and OpenVG, GDB stub, QEMU support, SDHOST. The same table says OpenGL ES, OpenVG and EGL are not available on the Pi 4 either.
- The multi-core documentation says the Cortex-A7/-A53/-A72 CPU "has four identical cores", the application assigns work to a core, and "all peripheral IRQs (and callbacks triggered by an IRQ, e.g. kernel timer handler or USB completion routine) are handled on core 0" (`doc/multicore.txt:1-8`). That text names the Pi 2, 3 and 4 only; the README feature table marks multi-core as supported on the Pi 5.
- Known Pi 5 issue: "The WLAN connection is delicate on the Raspberry Pi 5, when a HDMI display is used at the same time." (`doc/issues.txt:51`).
- Circle is distributed "only as source code; no official binary releases are provided" and carries a disclaimer that the maintainers cannot validate every device (`README.md`, section "Disclaimer").
- The LICENSE file in the clone is the GNU GPL version 3 text (`LICENSE:1-2`).
- Circle alone has no full C library. The `circle-stdlib` project adds newlib and is what BMC64 and its descendants use (`docs/THIRD_PARTY.md` in the BMC64 clone, section "circle-stdlib").

## BMC64 (VICE on Circle)

Source: https://github.com/randyrossi/bmc64, clone at `34e08e9`, last commit 2026-10-20 ("Update digest after v5.3.1 release").

**What it is.** "BMC64 is a bare metal C64 emulator for the Raspberry Pi Zero/2/3 models" with "true 50hz/60hz smooth scrolling and low latency between input & video/audio", plus C128, VIC-20, Plus/4 and PET (`README.md:3`).

**Pi models.** "BMC64 **only** supports Pi Zero, Pi Zero 2W, Pi 2, and Pi 3 based devices. Raspberry Pi 4 and greater is **not supported**." (`README.md`, section "Limitations"). The scope document lists "Raspberry Pi 4 and later models. This includes the Raspberry Pi 4B, Pi 400, Pi 5, Pi 500" as out of scope (`docs/SCOPE.md`, section "Out of Scope"). So the answer for Pi 5 is no, by decision rather than by oversight. The build flags in `make_all.sh:417,425` are `-march=armv6k -mfpu=vfp` for the 32-bit build, which matches the model list.

**Framework and emulator origin.** "This project uses VICE for emulation without any O/S (Linux) distribution installed on the Pi. VICE ... platform dependencies are satisfied using circle-stdlib." (`README.md`, section "Limitations"). The tree vendors VICE 3.3 (`third_party/vice-3.3`), circle-stdlib v21, Plus4Emu, zlib and the Raspberry Pi firmware (`docs/THIRD_PARTY.md`). The scope document says "BMC64 is based on VICE 3.3. It is not intended to track current VICE releases." (`docs/SCOPE.md`).

**How much was changed.**

- VICE gets a new architecture directory, `third_party/vice-3.3/src/arch/raspi`, next to the existing `gtk3`, `sdl`, `android` and `mingw32-pcap` ones. It contains `videoarch.c`, `mousedrv.c`, `archdep.c`, `vice_api.c`, per-machine subdirectories and menu and overlay code. That directory is 12057 lines.
- VICE is configured for a cross build with a long list of features switched off: `--disable-realdevice --disable-ipv6 --disable-portaudio --disable-ahi --disable-rs232 --disable-midi --without-oss --without-alsa --without-pulse --disable-sdlui --enable-raspiui --enable-raspilite` (`make_all.sh:425`).
- Circle and circle-stdlib are patched. The patch set is 709 diff lines: newlib glue with RAM-buffered FatFs file I/O, disabled `BUG_ON` assertions, FatFs fast seek and multi-partition, KASAN and I/O statistics hooks (`src/patches/README.md`, table).
- The Pi-side glue in `src/` (kernel, display, sound, USB, networking, web UI, profiles, update) is 44725 lines including non-code files.
- VICE is started through its own `main_program` with the options `-sounddev raspi -soundsync 0 -refresh 1 +VICIIvcache`. The comments say that without disabling the video cache "vsync is messed up", and that the vertical blank disturbs VICE's frame skipping algorithm (`src/viceemulatorcore.cpp:87-103`).

**Multicore.** The emulator runs on core 1: "Now that emmc is initialized, launch the emulator main loop on CORE 1 before USBHCII." (`src/viceapp.cpp:883-884`). `ViceEmulatorCore` derives from `CMultiCoreSupport` when `ARM_ALLOW_MULTI_CORE` is set (`src/viceemulatorcore.cpp:36-41`). Cores 1 and 2 compute the reSID sampling tables in parallel at boot to save boot time (`src/viceemulatorcore.cpp:43-65`, `src/kernel.cpp:1901-1906`). `src/kernel.cpp:1876` contains the comment "TODO: This is a race condition between two cores. Fix this."

**Peripherals.**

- Video: HDMI, composite and DPI, chosen by `machines.txt` entries such as `hdmi_group=1`, `hdmi_mode=19`, `machine_timing=pal-hdmi` (`docs/USER_GUIDE.md:117-149`). The default is 720p PAL at 50 Hz.
- Sound: the FAQ has an entry about audio from HDMI or the analog jack (`docs/FAQ.md`, table of contents).
- Input: USB plug and play, keyboards, 8BitDo gamepads (`README.md`, "Features").
- Storage: SD card with FAT through FatFs. Disk writes are flushed to the card on write or detach because "BMC64 has no shutdown sequence" (`docs/OPTIMISING.md`, section "Disk writes and shutting down").
- Network: Wi-Fi and Ethernet, used by a software modem that opens outbound TCP connections only, "Telnet-style, unencrypted" (`docs/NETWORKING.md`, section "What It Does"). Wi-Fi needs the Raspberry Pi firmware files on the card.

**Timing and latency claims.** "Quick boot time (C64 in 4.1 seconds over composite!)", "Frames are timed to vsync", "Low latency between input & audio/video" (`README.md`, "Features"). The project's own profiling guide says a demanding game on a Pi Zero W needs about 11 ms of each 20 ms frame with one drive and about 17 ms with four, and that audio drops out at about 17 to 18 ms (`docs/OPTIMISING.md`, section "Drives: the biggest cost"). No latency figure in milliseconds for input to display was found in the files read, so the latency claim is qualitative (**open** as a number).

**Maintenance.** Last commit 2026-10-20, release 5.3.1 pre-release at the top of `CHANGELOG.md`. Actively maintained.

**Licence.** `LICENSE` is the GPL version 3 text. Some source files carry an Apache 2.0 header, for example `src/viceemulatorcore.cpp:4-14`. Third-party licences are listed in `docs/THIRD_PARTY.md`.

## Descendants of BMC64 that reach the Pi 4 and the Pi 5

BMC64 itself stops at the Pi 3. Several forks replace the emulator and add 64-bit Pi 4 and Pi 5 kernels. They matter most for this question.

### BMA800XL (Atari 8-bit, atari800)

Source: https://github.com/aminch/bma800xl, clone at `43cac1c`, last commit 2026-10-20, GPL version 3.

- "BMA800XL is a bare metal Atari 800XL emulator for the Raspberry Pi Zero, 2, 3, 4 and 5" using the same approach as BMC64 (`README.md:3-5`).
- Pi 5, Pi 500 and Pi 500+ are supported as `kernel_2712.img`, 64-bit (`README.md`, "Supported hardware"). The changelog dates Pi 5 support to release 1.3.0 and Pi Zero support to release 1.4.0, both on 2026-10-14, and Pi 4 support to 1.1.0 (`CHANGELOG.md`, headings "1.3.0" and "1.4.0"). The Pi 5 port is therefore about one week old at the time of checking.
- What the Pi 5 needed beyond the Pi 3 code (`docs/PI5.md`): its own display driver for the Pi 5 display hardware (`src/kms/pi5/`), because "The Pi 5's firmware ignores `hdmi_mode` and picks the display's own preferred resolution"; the 3D GPU (V3D 7.1) draws the CRT shader and smooth scaling; sound goes over HDMI only because "The Pi 5 and Pi 500 have no headphone jack"; the Wi-Fi firmware must be copied under the name Circle looks for on the Pi 5. The firmware framebuffer on the Pi 5 "is 32-bit ... and has a single page, so ... fast movement can tear".
- The Pi 4 display driver "was written by examining the Linux `vc4` driver and the BCM2711 device tree" (BMAtariST `docs/PI4.md`, section "Picture", describing the code it took from BMA800XL).

### BMAtariST (Atari ST, STE, TT and Falcon, Hatari)

Source: https://github.com/jhonnaker1/bmatarist, clone at `710b5f7`, last commit 2026-10-20, GPL version 3. The clone is shallow, so the commit count is not known (**open**). `CHANGELOG.md` has one entry, version 0.1.0, marked "unreleased".

This is the closest precedent in the set, because Hatari's CPU is WinUAE-derived like Previous's. `docs/THIRD_PARTY.md:11` states: "Hatari's 68000-68060 CPU core comes from WinUAE and UAE".

- "BMAtariST is a bare metal Atari ST, STE, TT and Falcon emulator for the Raspberry Pi. It runs the Hatari emulator directly on the hardware, with no Linux underneath" (`README.md:3-5`). It descends from BMApple2, BMCoco, BMA800XL and BMC64; "The emulator is replaced by Hatari; the kernel, display, sound, network and web UI come from those projects." (`README.md`).
- "Hatari is used unmodified: everything specific to BMAtariST is in `src/`. Hatari's CPU core is generated when it is built, as in Hatari's own build." (`README.md`, section "How it fits together"). Hatari comes in as a git submodule at a master commit after release 2.6.1 "which has its user interfaces split out of the emulation core" (`docs/THIRD_PARTY.md:9`). BMAtariST's front end "has the same functions as Hatari's libretro front end (`src/retro/`), which it follows" (`docs/THIRD_PARTY.md:11`).
- Size of the work: the emulator-specific front end `src/port/` is 4843 lines (`platform.c`, `screen.c`, `audio.c`, `keymap.c`, `gui_event.c`, `joy_ui.c`, `statusbar.c`, `menu.c`, `osd.c`, `config.h`, `hatari.mk`). The Circle patch set is 226 diff lines (three patches in `src/patches/`). The shared video and GPU code reused from the BMA800XL line is `src/av` 2274 lines, `src/kms` 4197 lines and `src/v3d` 3636 lines.
- Pi models: "The Raspberry Pi 4 Model B and Pi 400 (`kernel8-rpi4.img`, 64-bit) and the Raspberry Pi 5, Pi 500 and Pi 500+ (`kernel_2712.img`, 64-bit) are the ones to use: Hatari emulates the ST cycle by cycle, which takes a fast core, and the TT and Falcon (a 68030, and the Falcon's DSP) take more." The Pi 3 family and Pi 2 "start too, for the ST and STE; whether they keep up depends on the program". The Pi Zero and Zero W "start, but are too slow." (`README.md`, "Supported hardware").
- The TT (68030 at 32 MHz with FPU) and Falcon (68030 at 16 MHz with DSP) need a Pi 4 or 5 (`docs/USER_GUIDE.md:141-146`). The menu shows speed "as a percentage of the real machine's", and the troubleshooting text says "Sound breaks up, or the menu's speed line is under 100%: the Pi can't keep up with that machine or program. Turn off *Cycle Exact CPU* ... use an ST rather than a TT or Falcon, or a faster Pi (a Pi 4 or 5)." (`docs/USER_GUIDE.md:347-349`). No measured percentage for the TT or Falcon on the Pi 5 is published in the files read (**open**).
- Multicore: the README's file map reads "src/main.cpp, kernel.cpp   Circle kernel: USB, GPIO, SD card; runs Hatari on core 1" (`README.md`, section "How it fits together"). On the Pi 4, ARM cores 1 to 3 draw the CRT picture if the GPU does not start (`docs/PI4.md`, section "Picture").
- Pi 5 specifics: the same HVS display driver as BMA800XL, resolution choice Auto, 1920x1080 or 1280x720, HDMI sound that "runs about 24 ms later than on the Pi 4", Ethernet and Wi-Fi (`docs/PI5.md`). The display runs at the ST's frame rate (50.05 Hz PAL, 60.04 Hz NTSC, 71.2 Hz monochrome), switched by the kernel (`docs/PI4.md`).
- Peripherals: HDMI sound, USB keyboard, mouse and gamepad, GPIO joysticks, floppy images written back to the SD card two seconds after a write, a host folder as GEMDOS drive, ACSI and IDE hard disk images, Ethernet and Wi-Fi with the BMC64 web UI (`README.md`).
- Whether it was verified on Pi 5 hardware is **open**: the README makes no statement about testing. The related project BMRetroSys writes "Atari on Pi 5 is staged but not device-tested; Pi 4 is verified." (`BMRetroSys/CHANGELOG.md:99`).
- It credits BMRetroSys "for the pitfalls of running Hatari on Circle (restarting the CPU core after a reset, what newlib lacks)" (`docs/THIRD_PARTY.md:91`). Those two pitfalls are the kind of work a port of a WinUAE-derived CPU core has to expect.

### BMApple2, BMCoco (Apple II, Tandy CoCo)

Sources: https://github.com/jhonnaker1/bmapple2 at `e7fa3ba` and https://github.com/jhonnaker1/bmcoco at `ea8a2ce`, last commits 2026-10-20, GPL version 3. BMApple2 is "a bare metal Apple IIgs and Apple IIe emulator for the Raspberry Pi Zero, 2, 3, 4 and 5" running KEGS (`README.md:3-5`). They are the middle links of the chain BMC64, BMA800XL, BMCoco, BMApple2, BMAtariST, and show the same kernel, display and network code reused across emulators. The BMCoco README was not read in full (**open** for its Pi model list).

### BMX, BMC64-NG, BMRetroSys

- **BMX**, https://github.com/kdre/bmx, `81efb7e`, 2026-08-19, GPL version 3: "a bare-metal Commodore emulator derived from BMC64 for the Raspberry PI 4/5 family ... Support for Raspberry Pi <= 3 is removed and left to the original BMC64 project." (`README.md`).
- **BMC64-NG**, https://github.com/lroby74/BMC64-NG, `1835a08`, 2026-10-11, GPL version 3: VICE 3.10 in 64-bit, "Raspberry Pi 4, 400, 5, 500 and 500+ only". Its README says the code is written with Claude Code and "finally tried on real hardware before it ships" (`README.md`, section "Developed by Cla-Bob Systems"). Network works on all machines including Pi 5 (Guide file in `docs/`, line 210).
- **BMRetroSys**, https://github.com/drunkeneye/BMRetroSys, `248532b`, 2026-10-12, GPL version 3: a fork of BMX with nineteen machines on one SD card for "the Raspberry Pi 4/5 family" (`README.md:3-6`). Among them are two 68k Macintosh machines: Macintosh 128K with Mini vMac and "Mac IIci/Quadra" with Basilisk II (`README.md`, machine table). Its own README is blunt about quality: "vibe-coded with Muse Spark 1.3 via opencode.ai. This is not a fully supported release, it is unclear whether any reported bugs will ever be fixed." and "And there a lot of bugs" (`README.md`, sections "AI all over the place" and "BUGS"). The third-party table calls the Basilisk II port an "Interpreter-only subset", vendored with a `bmx-shim/` directory and a backend in `src/mac68k/` of 6204 lines (`THIRD_PARTY_SOURCES.md:537-548`). No statement about how fast the Quadra mode runs on a Pi 4 or Pi 5 was found (**open**). The clone is shallow, so the repository history is not known.

These projects are very recent and several are AI-assisted. They are evidence that the approach is currently being applied to many emulators, and they are not evidence of long-term field testing.

## Emu68 (68k JIT for AArch64, own code)

Source: https://github.com/michalsc/Emu68, clone at `2fb0e32`, last commit 2026-10-14 (`git log`). The GitHub API reports the description "M68K emulation for AArch64/AArch32" and a push on 2026-10-20.

**What it is.** The `README.md` is only a build guide. The project describes itself in its SD card tutorial as "a bare metal JIT translator of m68k binaries which attempts to emulate as little as possible" (`docs/tutorials/SD_Preparation.md`, "Foreword"). The PiStorm variants are the main product. The `Emu68-raspi.zip` release file is described by the author as one "you don't want to use ... unless you want to play with bare-metal m68k based raspberry pi" (release v1.1.0-beta.1 notes, from the GitHub releases API).

**Framework.** No framework. The kernel is its own: `src/raspi/start_rpi64.c`, `src/raspi/support_rpi.c`, `src/aarch64/start.c`, `mmu.c`, `intc.c`, `vectors.c`. It also has its own memory allocator (TLSF, `src/tlsf.c`), device tree handling, an ELF and Hunk loader, drivers for the SD card (`brcm-sdhc.device`, `brcm-emmc.device`), the VideoCore mailbox, the camera interface (Unicam) and a GIC400 library, shipped as AmigaOS-side libraries and cards inside the Emu68 image (`src/boards/*.h`, `docs/Options.md`). Targets are `raspi64`, `pbpro` (Pinebook Pro), `rockpro64` and `virt` (`CMakeLists.txt:58`). Variants are `none`, `pistorm` and `pistorm-classic` (`CMakeLists.txt:62-63`). The only Raspberry Pi target is 64-bit (`TARGET "raspi64"`, `CMakeLists.txt:205-219`).

**CPU emulated.** It translates 68k code to AArch64 just in time. The configuration documentation names a `68040.library` and an `emu68-vc4.card` shipped with it (`docs/Options.md`, headings "68040.library" and "emu68-vc4.card"). The FPU translator is part of the project (release v1.1.0-beta.1: "my FPU translator was completely missing FDBcc"). The early release notes say the integer part "is passing cputests with exception of MOVEC", while MMU and trace modes were not working then (v0.10-beta notes). Whether the current version is documented as a 68020, 68030 or 68040 is **open**: no document read states the model in one sentence. The `68040.library` and the comment "68040 stores du2 first, then du1" (`src/M68k_LINE0.c:2651`) point to 68040 behavior.

**Boot.** `config.txt` selects the image: `kernel=Emu68.img`, `arm_64bit=1`, `enable_gic=0`, `gpu_mem=32`, `hdmi_group=2`, `hdmi_mode=82`, with commented `initramfs` lines for m68k test programs (`scripts/config.txt`). Settings are given in `cmdline.txt` and in device tree overlays (`docs/Options.md`, `documentation/overlays.md`). The microSD card has a FAT32 boot partition and further partitions of type 0x76 that appear as AmigaOS disks (`docs/tutorials/SD_Preparation.md`).

**Pi models.**

- The code detects the BCM2711 by looking for a `/scb` node in the device tree. On it (Pi 4, CM4, Pi 400) it enables `brcm-emmc` and disables `brcm-sdhc`; on every other board it does the reverse (`src/aarch64/start.c:891-929`).
- The documentation names Pi 4, CM4 and Pi 400, and release notes name Pi 3 ("not recommended for Pi3 users", v0.16 notes). Release notes credit a contributor for an xHCI driver and wired Ethernet for the Pi 4 and CM4, and say the first PiStorm16 device uses a Compute Module 4 (v1.1.0-alpha.1 notes). "Pi4/CM4 are officially not supported on classic PiStorm models" (release notes). The Pi Zero 2 and Pi 3A+ are named in the PiStorm README (see below).
- **Pi 5: no evidence of support.** A search of `src`, `docs`, `documentation`, `scripts` and `CMakeLists.txt` for `bcm2712`, "Pi 5" and "RPi5" found nothing, and a GitHub issue search for "Pi 5" and "bcm2712" in the repository returned no issue about a Pi 5 port. Absence is not proof; whether the author plans it is **open**.

**Performance.** No benchmark figure for Emu68 is published in the files read (**open**). The documentation does name mechanisms behind its speed: an instruction cache for the translator, removed code inlining on 24-bit memory, and `vbr_move`, which puts the vector table in fast memory because that RAM "is at least 500 times faster than CHIP" (`docs/Options.md`, section "68040.library"; release notes). Those statements are about the Amiga hardware attached to Emu68, not about a standalone machine.

**Peripherals.** In the standalone `raspi` build: HDMI through the VideoCore mailbox framebuffer, SD and eMMC, the camera interface, serial. USB, networking and Wi-Fi come from AmigaOS-side drivers contributed separately (release notes). The `async_log` option runs logging "on separate ARM core with a 8 MB large ring buffer" (`docs/Options.md`, section "Debugging").

**Licence.** Mozilla Public License 2.0 (`LICENSE`, GitHub API `MPL-2.0`).

**Relevance.** Emu68 is a machine-code translator written for AArch64 rather than a port of an existing emulator. It shows how large the platform code is when nothing is borrowed: its own bootstrap, MMU setup, allocator and drivers, in 41733 lines of C under `src/*.c` and `src/aarch64/*.c` (`find ... | wc -l`, which includes the translator).

## PiStorm (as far as it relates to Emu68)

Source: https://github.com/captain-amygdala/pistorm, clone at `88937a6`, last commit 2025-09-15, licence MIT (`LICENSE`, GitHub API).

- PiStorm is "an adapter board intended to be paired with a Raspberry Pi Model 3A+. It goes in the DIP socket on and acts in place of the CPU" (`README.md`, section "Project information").
- The software in this repository is a Linux userland program. The quickstart says "Download Raspberry Pi OS ... You must use the 32bit version of Pi OS", then `make` and `sudo ./emulator --config amiga.cfg` (`README.md`, section "Simple quickstart"). It emulates the CPU with Musashi, "somewhere around a 100-125MHz 68030". The repository contains `m68kcpu.c`, `m68kfpu.c`, `m68kmmu.h` and configuration files for Amiga, Mac (`mac68k.cfg`) and X68000 (`x68k.cfg`).
- The README never mentions Emu68 or a bare-metal mode (a case-insensitive search for `emu68` and `bare` in `README.md` returns nothing). The bare-metal variant is Emu68, a separate project that ships PiStorm builds (`Emu68/CMakeLists.txt:243-247`).
- Pi models in the README: "Raspberry Pi Zero2 and Raspberry Pi Model 3a+ work out of the box, the Raspberry Pi Zero and Model 2/4 cannot currently be used with the PiStorm." The README mentions "October 2021" and "June 2, 2021", and later Emu68 releases added Pi 4 and CM4 based boards, so the README is out of date about the Pi 4.

## Pi1541 (Commodore 1541 drive emulator)

Source: https://github.com/pi1541/Pi1541, clone at `f993028`, last commit 2024-01-17, GPL version 3.

- "Pi1541 is a real-time, cycle exact, Commodore 1541 disk drive emulator that can run on a Raspberry Pi 3A, 3B or 3B+." It emulates a disk drive attached to a real Commodore computer through the GPIO header and is not a computer emulator (`README.md:3-5`).
- It builds a `kernel.img` with the plain `arm-none-eabi` toolchain (`README.md`, "Toolchain Installation", "Building") and carries its own startup code (`src/armc-start.S`, `src/armc-cstartup.c`, `src/exception.c`, `src/interrupt.c`), its own FatFs copy and a `uspi` directory, which is a USB library. Circle is not used.
- Relevance: a precedent for hard real-time work (GPIO timing at cycle level) on the Pi 3 in bare metal. The README makes no Pi 4 or Pi 5 statement, and the last commit is from January 2024.

## Other bare-metal emulators found

These were found by GitHub repository searches on 2026-10-21 and read through their READMEs. Searches for an Amiga emulator on Circle, Basilisk II on Circle and an arcade emulator returned no repository. The search API was rate-limited for part of the session, so the negative result is not complete. The one Amiga machine found is vAmiga inside BMRetroSys (see above).

| Project | What | Evidence |
| --- | --- | --- |
| [Faux86](https://github.com/jhhoward/Faux86), `3631a44`, 2019-10-29 | 8086/80186 PC emulator "for bare metal Raspberry Pi", based on Fake86, "uses the Circle library", GPL version 2 | `README.md`: CGA/EGA/VGA, Adlib, Soundblaster; floppy image `dosboot.img` as drive A, SD card as drive C |
| [baremetal-fake86](https://github.com/jhhoward/baremetal-fake86), `634ea17`, 2018-10-18 | Earlier port of fake86 "to bare metal Raspberry Pi using Circle lib" | Repository description from the search API; README not read |
| [Bare-Metal-Sega-Genesis](https://github.com/mjaydedecker/Bare-Metal-Sega-Genesis), `2fc1d6f`, 2026-09-11 | Genesis/Mega Drive with Genesis-Plus-GX-Wide on Circle. "Runs on the Raspberry Pi 2, 3 and 4 in 32-bit mode ... verified on real hardware." "Pi 5 is not yet supported (it has no 32-bit target; it needs a separate 64-bit build)." | `README.md`, "Status" and "Hardware requirements". The Genesis has a 68000, so this is a small 68k precedent. Licence not checked |
| [ZX Raspberry](https://github.com/doraemoncito/zx-raspberry), `d93711d`, 2024-06-14, GPL version 3 | ZX Spectrum emulator for the Pi, marked experimental; it also builds on macOS with Qt | `README.adoc`: bare-metal development "is significantly harder and more time-consuming" |
| [PiTubeDirect](https://github.com/hoglet67/PiTubeDirect), `a524731`, 2022-08-31, GPL version 3 | Second-processor emulator for Acorn machines through the Tube connector. "A Pi Zero can emulate a 6502 Second Processor running at 274MHz." | `README.md`. Which other Pi models and CPUs it supports was not verified, **open** |
| [umac-zero](https://github.com/RalphSommerer/umac-zero), `43d7743`, 2026-05-30 | "umac Mac Plus emulator on bare-metal Raspberry Pi Zero" (repository description). In the clone `src/raspi_main.c` has 10 lines, `circle` and `umac` are unfetched submodules, and the README is the single line `# umac-zero` | An unfinished stub. The Mac Plus emulation itself would come from `jepler/umac` (submodule, `.gitmodules`) |
| [cpmemu](https://github.com/rsta2/cpmemu) | CP/M emulator, "bare metal for Raspberry Pi, and for Linux" by the author of Circle | Found in the search (pushed 2022-11-24). Not cloned, README not read, **open** |

Not found despite searches: a Hatari-only, Basilisk II-only or UAE-only bare-metal Raspberry Pi project outside the BMC64 family, and an arcade (MAME) bare-metal project. For Mini vMac and Basilisk II the only bare-metal precedent found is BMRetroSys.

## Comparison table

"Pi 5" means the project documents support for the Raspberry Pi 5. Multicore is what the files show, not a performance claim.

| Project | Framework | Emulated machine (core) | Pi models | Pi 5 | Multicore | Networking | Last commit | Licence |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Circle | itself | none (framework) | 1, Zero, 2, 3, 4, 400, 5, CM3/CM4/CM5 | yes, 64-bit only | yes, per-core tasks; IRQs on core 0 | TCP/IP, Wi-Fi, Ethernet | 2026-09-25 | GPL 3 |
| BMC64 | Circle + circle-stdlib | C64, C128, VIC-20, Plus/4, PET (VICE 3.3) | Zero, Zero 2 W, 2, 3 | no, out of scope by `docs/SCOPE.md` | emulator on core 1, helper work on cores 1 and 2 | Wi-Fi, Ethernet, modem over TCP | 2026-10-20 | GPL 3 (some Apache 2.0 files) |
| BMA800XL | Circle, line from BMC64 | Atari 8-bit (atari800) | Zero, 2, 3, 4, 400, 5, 500 | yes (since 1.3.0, 2026-10-14) | ARM cores draw the CRT picture if the GPU is unused | Wi-Fi, Ethernet, web UI | 2026-10-20 | GPL 3 |
| BMAtariST | Circle, line from BMC64 | Atari ST, STE, TT, Falcon (Hatari, WinUAE-derived CPU) | Zero (too slow), 2, 3, 4, 400, 5, 500 | yes; hardware testing not stated | Hatari on core 1; cores 1 to 3 as fallback for the picture | Wi-Fi, Ethernet, web UI | 2026-10-20 | GPL 3 (Hatari GPL 2 or later) |
| BMApple2 | same line | Apple IIgs, IIe (KEGS) | Zero, 2, 3, 4, 5 | yes | not read | Wi-Fi, Ethernet (BMC64 web UI) | 2026-10-20 | GPL 3 |
| BMCoco | same line | Tandy CoCo | not read | not read | not read | not read | 2026-10-20 | GPL 3 |
| BMX | Circle | Commodore machines (VICE) | Pi 4, 400, 5, 500 | yes | not read | not read | 2026-08-19 | GPL 3 |
| BMC64-NG | Circle | Commodore machines (VICE 3.10) | 4, 400, 5, 500, 500+ only | yes | not read | Wi-Fi, Ethernet on all machines | 2026-10-11 | GPL 3 |
| BMRetroSys | Circle | 19 machines incl. Mac 128K (Mini vMac), Mac IIci/Quadra (Basilisk II, interpreter only), Atari ST (Hatari), Amiga (vAmiga) | 4, 400, 5, 500 | yes; Atari on Pi 5 "staged but not device-tested" | not read | not read | 2026-10-12 | GPL 3 |
| Emu68 | own code | 68k JIT to AArch64 (68040-class per the files, model **open**), FPU, PPC translator | Pi 3, 4, CM4, 400 and PiStorm boards (Zero 2 and 3A+ per the PiStorm README) | no evidence | async log on a second core; the JIT itself not read as multicore | Pi 4 Ethernet through an AmigaOS driver | 2026-10-14 | MPL 2.0 |
| PiStorm | none (Linux userland) | 68k via Musashi, Linux based | Zero 2, 3A+ ("Model 2/4 cannot", per the 2021 README) | no | not read | via Linux | 2025-09-15 | MIT |
| Pi1541 | own code + USB library | Commodore 1541/1581 drive | 3A, 3B, 3B+ | no statement | not read | none read | 2024-01-17 | GPL 3 |
| Faux86 | Circle | 8086/80186 PC | not stated in README | no statement | not read | not read | 2019-10-29 | GPL 2 |
| Bare-Metal-Sega-Genesis | Circle | Sega Genesis (Genesis-Plus-GX-Wide, 68000) | 2, 3, 4 (32-bit) | no, "not yet supported" | not read | not read | 2026-09-11 | not checked |
| ZX Raspberry | own code | ZX Spectrum | Pi family, not itemized | no statement | not read | not read | 2024-06-14 | GPL 3 |
| PiTubeDirect | own code | BBC Micro second-processor CPUs | Pi Zero named, others not verified | no statement | not read | none | 2022-08-31 | GPL 3 |
| umac-zero | Circle (submodule, empty in clone) | Mac Plus (umac) | Zero | no | no | no | 2026-05-30 | none found in clone |

## What the precedents show about the effort of such a port

Statements below that go beyond a source are inferences and are labeled as such.

1. **The established route is Circle plus an unmodified or lightly modified emulator core with a new front end.** BMC64 (VICE), BMAtariST (Hatari) and the others follow it. In BMAtariST the emulator is "used unmodified" and the emulator-specific work is a 4843-line front end plus a 226-line Circle patch set. In BMC64 the work is a 12057-line VICE architecture directory plus a 709-line Circle patch set and a configure step with many features switched off. Inference: Previous is a larger and more SDL-coupled program than either, so its front end would be larger than Hatari's. The sources do not say how large. The size of Previous's SDL usage is the subject of `previous-host-dependencies.md` in this directory.
2. **A clean split between emulation core and user interface made BMAtariST possible.** The Hatari commit used "has its user interfaces split out of the emulation core" and already had a libretro front end that BMAtariST followed (`docs/THIRD_PARTY.md:9-11`). Inference: for Previous, the existence and size of an equivalent boundary decides most of the effort.
3. **A WinUAE-derived CPU core has been run on Circle.** Hatari's core is derived from WinUAE and UAE, as Previous's is, and the pitfalls named for it are restarting the CPU core after a reset and what newlib lacks (`docs/THIRD_PARTY.md:91`). No source says anything about an i860 core or the NeXTdimension, and no precedent contains a 68040 core or an i860 core on bare metal driving an unmodified OS at full speed. Hatari offers at most a 68030 TT or Falcon. Whether a 68040 core at NeXT clock rates keeps up on a Pi 5 is **open** and is a measurement to take, not something the precedents answer.
4. **The Pi 5 is the expensive target.** BMC64 excludes it by scope decision. The Circle table shows the VCHIQ interface (firmware audio and display services), OpenGL ES and OpenVG missing for it, interrupt support "IRQ only" and the frame buffer "limited". The projects that support the Pi 5 wrote their own display driver for the Pi 5's HVS (`src/kms/pi5/`), their own driver for the V3D 7.1 GPU for scaling and shader effects, an HDMI-only sound path with a different latency, and handling for the firmware ignoring `hdmi_mode`. That work first appeared in BMA800XL on 2026-10-14 and was reused by BMAtariST within about a week (`bma800xl/CHANGELOG.md`, heading "1.3.0"). The shared code (`src/av`, `src/kms`, `src/v3d`) is 10107 lines in BMAtariST. It is GPL 3 and written for a Circle layout, so Previously could build on it; licence compatibility with Previous's own licence is **open**.
5. **Peripheral coverage on the Pi 5 through Circle is good for what an emulator needs.** USB keyboard, mouse and gamepad, USB mass storage, FatFs on the SD card, TCP/IP, Wi-Fi and Ethernet (MACB/GEM) are marked supported (`circle/README.md` feature table). The one stated weakness is Wi-Fi next to HDMI (`doc/issues.txt:51`). Whether Circle's socket API offers what Previous's network backend for the emulated NIC needs is **open**.
6. **Multicore is manual.** The Circle-based emulators run the emulator on core 1 and keep USB and other IRQs on core 0 (BMC64 `src/viceapp.cpp:883-884`, BMAtariST `README.md`). Inference: a design with a 68k thread and an i860 thread would map to separate cores by hand.
7. **Quality and maintenance vary strongly.** BMC64 is long-running, human-maintained and has a written scope. The Pi 4 and Pi 5 branches, BMX, BMC64-NG and BMRetroSys are weeks to months old, several declare AI-assisted authorship, and BMRetroSys states its own bugs openly. BMAtariST is version 0.1.0, unreleased. Nothing in the sources gives long-term evidence about the Pi 5 bare-metal path.
8. **Writing the platform yourself costs far more.** Emu68, which borrows no framework, has its own MMU setup, allocator, device tree handling and drivers, within 41733 lines of C including the translator. It targets the Pi 3 and 4 family and has no Pi 5 evidence. The ZX Raspberry authors say bare-metal development "is significantly harder and more time-consuming".
9. **No precedent covers a machine with the peripherals of a NeXT.** BMAtariST covers floppy, ACSI and IDE; Emu68 uses the SD card as a drive. SCSI, an optical drive and everything else a NeXT has are unmeasured in the sources.

## Open points

- Pi 5 hardware verification of BMAtariST and BMA800XL: no statement in the files read.
- Speed percentages for the Falcon or TT on a Pi 5: not published in the files read.
- Emu68 CPU model in a single sentence, benchmark numbers, and any Pi 5 plan.
- Effect of Circle's "IRQ only" interrupt model on the Pi 5 for a timing-sensitive emulator loop.
- Licence compatibility between Previous and GPL 3 front-end code, if it would be reused.
- Repository history of the jhonnaker1 and aminch repositories (shallow clones).
- BMCoco's Pi models, cpmemu, and the Bare-Metal-Sega-Genesis licence: not read.
