Portfolio

Retro Computing — Compilers, Emulators & CP/M

Compilers that target processors discontinued forty years ago, emulators that run the resulting binaries, and a reconstruction of source code the industry lost. The constraints are real — 64 KB of address space, no floating-point unit, a byte of code actually matters — which makes every result measurable.

Compilers & code generation

Modern frontends, vintage backends. uc80 and uc386 share one C23 frontend and diverge only at the target.

uc80

A C compiler for the Z80 and CP/M, tuned for small code size. It produced smaller binaries than z88dk on all 47 tests of a public benchmark suite.

AI-built: I wrote none of this code Python ★ 11

uc_core

The shared C23 frontend and AST optimizer behind uc80 and uc386. It parses, preprocesses and optimizes above the machine level. The target backend then emits Z80 or i386 from there.

AI-built: I wrote none of this code Python

uplm80

A PL/M-80 compiler for the 8080 and Z80. It rebuilds the original CP/M utilities from their PL/M-80 sources and matches the Digital Research compiler on code size.

AI-built: I wrote none of this code Python ★ 12

ucow

A Cowgol compiler for the Z80 and CP/M. It analyzes the call graph across modules so subroutines that can never be live at once share the same local storage.

AI-built: I wrote none of this code Python ★ 3

uada80

An Ada compiler for the Z80 and CP/M 2.2. It compiles a subset of Ada 2012 to Z80 assembly. Work toward ACATS conformance continues.

AI-built: I wrote none of this code Python Ada under construction ★ 2

uplox

An LR(1) and GLR parser generator. It emits the lexer and parser tables as a single JSON bundle plus re-entrant driver skeletons in C, C++, Python and Lua.

AI-built: I wrote none of this code Python ★ 1

Optimizers, assemblers & linkers

The unglamorous half of a toolchain, where most of the size and speed actually comes from.

upeep386

A peephole optimizer for i386 compilers that emit NASM. It rewrites instruction patterns, strips unreachable functions, and splits a libc so a program links only what it calls.

AI-built: I wrote none of this code Python

pyle

A pure-Python linker that reads 32-bit OMF object files and writes MZ+LE executables for DOS. It adds a PMODE/W or DOS/32A stub, so the result runs without dos4gw.exe or Open Watcom.

AI-built: I wrote none of this code Python

Emulators & operating systems

Two different strategies: emulate the hardware faithfully, or intercept the system calls and translate them to the host. Each is the right answer to a different question.

cpmemu

Runs CP/M 2.2 programs on Linux and Windows with no disk image at all: it translates BDOS and BIOS calls straight to the host filesystem. Z80 and 8080 CPU cores.

C++ ★ 11

mpm2

An emulator for MP/M II, the multi-user CP/M. Several people connect over SSH simultaneously, and SFTP and HTTP clients read the same disks. The build compiles MP/M II from its PL/M-80 sources.

AI-built: I wrote none of this code Assembly ★ 5

qxDOS

A DOS emulator for iPad and Mac with a SwiftUI interface over DOSBox Staging. It boots FreeDOS, MS-DOS or the built-in kernel, and runs DOOM.

AI-built: I wrote none of this code Swift C++ ★ 3

dosiz

An MS-DOS emulator for Linux that runs 32-bit DJGPP programs end to end. It answers INT 21h, DPMI and EMS calls on the host over an i386 CPU core.

AI-built: I wrote none of this code C++ ★ 2

Microsoft BASIC

MBASIC 5.21 four ways. One of them reconstructs source code that no longer exists anywhere.

mbasic2025

A reconstruction of the lost MBASIC 5.21 source. The recovered MACRO-80 source assembles to a binary that matches the original mbasic.com byte for byte — the only proof of correctness that counts here.

AI-built: I wrote none of this code Assembly ★ 5

Interactive fiction & the Z-machine

Infocom shipped a portable bytecode virtual machine in 1979. These projects compile to it, interpret it, document it and solve the games written for it.

zorkie

A compiler for Infocom ZIL and the ZILF dialect. It emits Z-machine story files from .z3 to .z8, and compiles the Mini-Zork I source to a verified 350-of-350 win.

AI-built: I wrote none of this code Python ★ 2

zwalker

A walkthrough generator for Z-machine interactive fiction: a CZECH-compliant interpreter, an AI solver and a replay harness. It has 50 verified complete solutions across versions 1 through 8.

AI-built: I wrote none of this code JavaScript under construction ★ 2

zspec

A specification of the Z-machine story-file format for versions 1 through 8, with a compliance test corpus. Every rule states which versions it applies to. The specification follows the Z-Machine Standards Document v1.1.

AI-built: I wrote none of this code ZIL

z2pdf

A debugging tool that renders a story file as a PDF. The output has a room map with movement directions, the dictionary, and the objects a player can carry.

AI-built: I wrote none of this code Python ★ 1

hearzork

A voice-controlled Z-machine interpreter for iOS and macOS. Speech recognition happens on the device, and the app reads the game text aloud. Players with low vision can thus play Zork with no screen at all.

AI-built: I wrote none of this code Swift ★ 1

Archives & documentation

80un

An unpacker for the CP/M archive formats — LBR, ARC, squeeze, crunch and CrLZH. A Python 3 implementation and a native CP/M implementation produce identical output.

AI-built: I wrote none of this code Python ★ 8

retro_docs

Vintage manuals as PDFs and text conversions. They cover CP/M, MP/M II, Z80, 8008, MACRO-80, PL/M-80 and Microsoft BASIC. Reference material for everything above.

AI-built: I wrote none of this code Documentation

Sponsored work on any of these projects

Most of this exists because someone needed it to. If a project here is close to what you need but missing the last mile — a target, a format, a platform — that is exactly the kind of work I take on.

Get in touch