Personal Projects

Assembly Language IDE September 2023

A web-based IDE for writing TRS-80 assembly language programs, with a built-in emulator, debugger, and paint program.

Forth Interpreter August 2022

An interpreter for the Forth programming language, in Z80 assembly.

“My TRS-80” Website June 2021

A virtual TRS-80 machine online, with a personal library of tapes and floppies.

TRS-80 Cassette Reader March 2021

A web app to decode and explore damaged TRS-80 program cassettes.

The Alice 5 February 2020

A tablet that does nothing but run ShaderToy shaders. Brad Grantham and I wrote an FPGA-based RISC-V MIMD GPU and a shader compiler. Our first failed project!

CP/M Emulator January 2020

A emulator for the CP/M operating system that proxies file requests to the host operating system.

Apple IIa September 2018

A new ROM for the Apple IIe that compiles BASIC instead of interpreting it. Runs about 10× faster than the original.

PiSlide January 2018

A Raspberry Pi-based slideshow program to display our 25,000 family photos on a kitchen monitor, with Ken Burns effects, crossfades, photo rotation, rating, and email. Also controls Sonos systems and displays the name of the playing song.

The Alice 4 August 2017

A tablet that does nothing but run mid-80's SGI demos. Brad Grantham and I wrote the graphics pipeline, including an FPGA-based graphics processor.

Memoir Book July 2017

A Java-based typesetting program to print my great-uncle's memoirs, including support for fine typography, ligatures, kerning, automatic hyphenation, table of contents, index, photos, cross-references, footnotes, and right-to-left text.

Ring Light March 2016

A photographer's foldable LED ring light built out of acrylic and LED strips. This gives nice even lighting for headshots.

The Alice 3 January 2016

A surface-mount version of the Z80 computer we built 20 years ago. Now runs CP/M! Uses an ARM for disk and serial I/O and a Propeller for VGA and sound output.

Lathser October 2015

A system to use a 2D laser cutter as a lathe. A stepper motor holds a wooden dowel horizontally and turns it as the laser cuts outlines from different points of view. Uses a web-based printer driver.

Acrylic Pendulum Clock March 2015

A laser-cut pendulum clock made out of acrylic, with a web-based simulator. A python program computes the shapes of each tooth as well as the size and position of all gears.

IBM 1401 Ray Tracer November 2014

A ray-tracer in assembly for the IBM 1401, a decimal variable-word-length machine from 1959. Prints the result to a line printer. Takes 30 minutes to draw two spheres!

Arcade Cabinet August 2014

A cocktail-style arcade cabinet for my living room built into an IKEA coffee table, using MAME and a Raspberry Pi. Uses a custom-built menu to choose the games.

Turbo Pascal Compiler October 2013

A web-based Turbo Pascal compiler. I wrote this so that I could run my graphics programs from 1989. Includes a mini-IDE in the style of Turbo Pascal 3.0.

TRS-80 Emulator January 2013

A TRS-80 Model III emulator written in Go that uses a web page for its interface. Supports cassette and floppy (read-only).

Nutshell Book January 2013

I printed a book of my writings, which involved processing all the blog posts and stories into PDF format and generating an O'Reilly-style engraving for the cover.

Jigsaw Puzzle on Laser Cutter June 2011

A Python program that generates a pattern to laser cut a jigsaw puzzle of a picture of my son.

Video Camera on Model Rocket June 2011

I taped a key chain (spy) camera to a model rocket and got some good footage of lift-off, despite it getting stuck in a tree (twice).

Poetry Teacher May 2011

Learn poems by erasing one word at a time. This is an online version of what a poetry teacher did on a whiteboard.

Graphics Engine Book Cover March 2011

A Java program to generate the cover for a technical book I wanted to print. Uses the gear shapes from my pendulum clock.

Solar Plotter July 2010

A 2D plotter that uses a magnifying glass and the sun's light to burn a pattern into a piece of wood. The software compensates for the Earth's rotation during the burn!

Java List Comprehensions March 2008

I modified the Java compiler to support Python-style list comprehensions.

High Dynamic Range Images August 2006

An algorithm for combining bracketed pictures to form a single image that looks like what the eye sees.

San Francisco Crime Map October 2003

A visual representation of crime in San Francisco, based on data scraped from public sources and overlaid on an old stitched-together map.

Interpolated Markov Chain March 2003

A Markov Chain program with a twist: it smoothly interpolates between different source materials.

Genetic Walking Robots 1999

A program to evolve walking robots as simple spring-mass systems. It's crazy how evolution will just cheat whenever it can.

The Alice 2 1995–1999

Brad Grantham and I designed and built a Z80 computer using home-made printed circuit boards, a crappy drawing program, a custom logic analyzer, and a co-processor that ran 20 times faster than the CPU.

Graphics Engine Spring 1995

A design for a low-end graphics co-processing chip, along with an assembler and a simulator.

Real Time Ray Tracer Fall 1994

One of the world’s first real-time ray tracers, on UNC’s Pixel-Planes graphics computer, fitting in 208 bits of memory.

Bowling Strike Fall 1994

A bowling strike animation inspired by the cover of The RenderMan Companion book.

MacBSD Summer 1992

Brad Grantham and I ported the recently-open-sourced BSD UNIX to the 68020-based Macintosh II. This later became the NetBSD/Mac port.

Shortest Ray Tracer Spring 1992

Brad Grantham and I challenged each other to write the shortest ASCII ray tracer. You learn a lot about C writing these.

Early Graphics Summer 1989

My early computer graphics videos, filmed on my dad’s Super-8 camera.