Anatomy of a Retro BIOS
Designing firmware for emulated retro computers—reset vectors, service calls, UART I/O, toolchains, and the boot theatre that makes it feel real.
Technical articles, tutorials, and notes on various topics from amateur radio to software development.
Designing firmware for emulated retro computers—reset vectors, service calls, UART I/O, toolchains, and the boot theatre that makes it feel real.
Centralising modem, line, backend, and peripheral audio in a single bus system, and why fewer hops beat fancy decoupling.
I mapped code history onto a small audio graph and treated volume as a data contract, not a vibe.
The iteration that turned a text adventure into something playable—balance tuning, achievement scaffolding, and the 1081-line manual that made it legible.
Building cross-assemblers for retro CPUs in Rust, migrating to Pest parsers, and discovering why load addresses matter more than you think.
How a deadpan text adventure about mild chaos became the BBS system's most extensively tested game—79 tests, procedural honk audio, and a migration ending instead of game over.
Chart.js redraws the full scene every frame—correct for dashboards, wrong for playback. The fix was to treat the chart as a video surface.
Rebuilding the DATAPAC PAD experience in code — the command loop, X.25 NUAs, and five period-authentic hosts behind a 300-baud prompt.
How I shrank the emulator's main bundle from 1MB to 104KB by lazy-loading backends during dial tones—and why users never notice the delay.
A database-first ownership model for long-running jobs, with heartbeats, stale detection, and deterministic recovery.
Building five classic CPU cores in Rust for WebAssembly: 8008, 8080, 8088, Z80, and 6502, with shared state formats, cycle timing, and the edge cases that keep emulation honest.
How I emulated the VIC-II video chip and forwarded its framebuffer as ANSI escape sequences over a serial connection—turning a 40-year-old graphics architecture into something a BBS terminal can display.
How a BBS emulator grew into a distributed system with gRPC services, NATS messaging, gateway routing, and real backends instead of localStorage.
Migrating backends to server APIs with NATS pub/sub, adding microservices, and building the peripheral slot system with the Canada Goose game.
Identity got real: guest sessions, passkeys, and a server‑backed auth surface, plus gopher content routing, Z‑Machine version wiring, and a formatting sweep.
What started as a quick script turned into two days of yak-shaving through chart performance, audio bugs, and that moment when you realize cloc is just too slow.
Passkeys in a 300‑baud world: the smallest WebAuthn flow, the server state it requires, and how I kept it in tune with emulator.ca's identity model.
Shipping the TI CC-40 backend with authentic CALL commands and audio, plus a full IVR phone tree system.
Building a 1976-era cassette peripheral—FSK encoding at 2400/1200 Hz, tape transport simulation, and why saving 8KB took six minutes.