A cycle-stepped Amstrad CPC 464/6128 emulator written in C with SDL3.
Boots to Locomotive BASIC. Commercial games and standard software run well. Demos and other software that rely on undocumented hardware behaviour or cycle-exact CRTC tricks are untested and may not work correctly.
HDCPM / CP/M+ boots from FAT-formatted SYMBiFACE II / Cyboard IDE drives, mounting up to four CPMDSKxx.IMG images as CP/M drives A–D with the M: ramdisk, ZCPR shell, and SYMBiFACE RTC sync. SymbOS desktop runs on both Albireo (USB / CH376) and Cyboard (Net4CPC + RTC + SYMBiFACE IDE).
M4 board emulation is partial. The ROM signature, FAT file API, single-image SAVE/LOAD/CAT, DNS resolution, and TCP connect plus the cpc-sdcc network examples (TCPTEST, NTP, TELNET, WGET) all work. SymbOS's netd-m4c.exe launches, resolves hosts, and HTTP downloads via wget complete end-to-end. SymbOS interactive telnet sessions stall shortly after the initial server banner — the same stall is observed on real Net4CPC hardware, so this appears to be a SymbOS-side limitation rather than an emulator bug.
Core machine — Z80 CPU (full documented set + undocumented IX/IY half-register ops), MC6845 CRTC, AY-3-8912 PSG (tone, noise, envelope), 8255 PPI, Gate Array with all 32 hardware colours, configurable RAM 64–1024 KB (DK'tronics + Yarek banking), 32 expansion ROM slots, F8 memory monitor + Z80 disassembler with breakpoints.
Media — DSK images via µPD765 FDC (drive A + B), AMSDOS file loading, .cdt / TZX cassette tape decoder with audio mixed into PSG output, AMSDOS-headed ROM auto-unwrap.
Input — keyboard, host-clipboard paste, USB/Bluetooth joystick and gamepad with hot-plug.
Extensions — DDI-1 floppy interface (464), DS12887 RTC (Cyboard / SYMBiFACE II), SYMBiFACE II / Cyboard IDE (FAT16/FAT32 disk images), SYMBiFACE II PS/2 mouse, Albireo USB mass-storage (CH376 host controller, driven by UNIDOS), Net4CPC Ethernet (W5100S, static IP — DHCP unsupported), Amstrad Diagnostics ROM as a one-click toggle.
| Platform | Status |
|---|---|
| Linux (x86_64) | Tested daily; Fedora RPM provided |
| Windows (MinGW-w64) | Tested under Wine and on native Windows 7+; CI-built .exe bundle |
| NetBSD | Builds and runs from pkgsrc |
| OpenBSD | Builds and runs |
| macOS | Builds and runs |
| Haiku (32-bit nightly) | Builds and runs |
| FreeBSD | Should work — autotools build is portable; not tested |
Pre-built Linux and Windows binaries are attached to each GitHub Release.
![]() Linux |
![]() Windows |
![]() macOS |
![]() Haiku |
![]() NetBSD |
![]() OpenBSD |
- INSTALL.md — installing pre-built binaries, building from source on each supported platform, ROM file requirements
- USAGE.md — command-line options, keyboard shortcuts, joystick mapping, options overlay (F9), memory monitor (F8), config file format
- Development.md — architecture, render pipeline, hardware emulation details, CI, port-specific notes (Haiku / NetBSD / Windows)
Per-expansion guides:
- M4.md — M4 board (SD card + Wi-Fi networking); SymbOS netd-m4c.exe autostart caveat
- CYBOARD.md — Cyboard pack (Net4CPC + RTC + SYMBiFACE IDE/Mouse); UNIDOS + UNITOOLS + FATFS ROM layout
- ALBIREO.md — Albireo USB host (CH376); UNIDOS + ALBIREO.ROM layout; coexistence with Cyboard
- ColinPitrat/caprice32 — well-maintained CPC emulator used extensively as a behavioural reference. Hardware colour palette RGB values in
src/gate_array.cwere derived from Caprice32's colour table; the µPD765 FDC semantics insrc/fdc.c(status register layout per phase, ST0.AT/ST1.EN on EOT termination, settling delay on first EXEC MSR read, port 0xFB lo-byte bit-7 gating) and several Z80/Gate Array timing details (hsync falling-edge interrupt counter advance, CRTC tick cycle accumulator) follow Caprice32's implementation. - ikari-pl/konCePCja — Caprice32 fork by Cezar "ikari" Pokorski with a documented SYMBiFACE II implementation, IPC-controllable debugger and headless mode. Used as the gold-standard reference for the HDCPM / CP/M+ boot path: a byte-by-byte LBA-sequence comparison with konCePCja isolated the divergence point that led to the GA-interrupt acknowledge timing fix (deferring
ga_irq_ack()until the Z80 actually accepts the maskable interrupt, plus restoringIFF1fromIFF2on RETI — both behaviours mirroring konCePCja / Caprice32). - CPCWIKI — primary reference for CPC hardware documentation: CRTC registers and timing, Gate Array behaviour, memory map, I/O port decoding, and keyboard matrix.
- The Undocumented Z80 Documented (Sean Young) — reference for flag behaviour, undocumented opcodes (IX/IY bit instructions, DDCB/FDCB prefixes), and interrupt modes.
- µPD765 FDC Application Note and Amstrad CPC service manual — reference for the FDC command set and DSK image format used in
src/fdc.candsrc/disk.c. - SDL3 — cross-platform library providing window management, rendering, audio, and input used throughout the emulator.
- llopis/amstrad-diagnostics — Amstrad Diagnostics ROM used as an optional lower-ROM override for hardware testing (Diag Cart toggle in the options overlay).
- salafek/Net4CPC — Net4CPC Ethernet add-on hardware design and W5100S interface reference; the emulated I/O ports (0xFD20–0xFD23) and register map in
src/net4cpc.cfollow this hardware specification. - salafek/cyboard-for-cpc — Cyboard hardware design; source of the DS12887 I/O port mapping (0xFD14/0xFD15) implemented in
src/rtc.c. - PulkoMandy's Albireo documentation — CH376 / SC16C650B port map and command-flow notes used as the spec for
src/ch376.c. - UNIDOS (OffseT/Futurs') — DOS-node ROM the Albireo emulation is verified against;
src/ch376.cfollows the CH376 command sequence in UNIDOS'sAlbireo.romsource (LowLevel.a/DOSNode.a). - Prodatron's SymbOS — multitasking operating system for Z80 machines; a key test target and reference for CPC system-level behaviour and expanded memory use.






