Atom, a new Z80 assembler
Atom runs on macOS, Windows, Linux … and CP/M. The assembler itself is written in Z80 assembly, fits within 16 KiB and can assemble its own source.
John Hardy’s engineering notebook
Current bench Atom · Z80 systems · AI and authorship
Atom runs on macOS, Windows, Linux … and CP/M. The assembler itself is written in Z80 assembly, fits within 16 KiB and can assemble its own source.
A language model can solve a problem and describe an inner life. What would establish that it actually experiences anything?
Triptych is a retro computer project using three ESP32 boards for CPU and storage, VGA video, and sound. The goal is a machine you can program directly, with a Z80 and CP/M at the centre of the current design.
Ken Stone’s old cassette preserved a game I could no longer reconstruct from memory. Recovering Hyperdrive gave me evidence to piece together the history of our early work on Caverns and the games he sold through Micro Parts.
Decoding Ken Stone’s cassette recording turned pulse timings into readable BASIC. As the words emerged, apparent damage gave way to unfamiliar Commodore conventions, and I began recovering details I could no longer recall.
I’m building Skate, a Scheme compiler for Z80/CP/M. I’ll release the implementation in stages and explore how to make its expressive style of programming practical on a small machine.
I’m building Skate, a Scheme compiler for the Z80 running CP/M. Examples from Structure and Interpretation of Computer Programs provide a test of how much we can retain while leaving enough memory to run useful programs.
Skate’s design balances useful Scheme features against the memory and processing limits of Z80/CP/M. Some features remain central; others sit outside the scope of the first version.
Skate brings compiled Scheme to Z80/CP/M. Providing automatic memory management on a small machine means balancing runtime size, data capacity and processing time.
Skate reclaims list pairs that a running program can no longer reach. Its collector traces from live roots, keeps reachable pairs and returns the rest to the free list.
Skate divides its small heap into 256-byte pages. Pairs, bindings, closures, strings and vectors can then share the available memory without fixed reservations for each type.
Skate implements lexical closures using heap binding records and pointers. Following a small adder example shows how those bindings survive a procedure call on a Z80.