A long bench of crooked old TVs in a room with seventies wallpaper, with mans and Catwiz's cast standing about
The newest projects are on the TVs. Point at one.

Writing · 2026-11-04

Catwiz, a dice roguelike for the Apple IIe

catwiz tisple apple-ii games

The Catwiz title screen

Catwiz is a dice roguelike for the 128K Apple IIe. You play a cat wizard. Each turn you roll five dice whose six faces are your six item slots, and you play them on enemies through ten fights to the Bulldog King. It runs in double hi-res with stereo Mockingboard music, ships on two 5.25" disks, and takes a mouse.

Play it in the browser, on a phone too, or in AppleWin or MAME, or on a real IIe from the disk images.

A fight in the woods

It's written in Tisple, a typed Lisp I made for the Apple II with its own optimising 6502 compiler. Raced against cc65, LLVM-MOS and Oscar64 on the same cycle-exact simulator, it is the fastest on 13 small kernels. On 2,000 random programs it takes 0.80 of the best C compiler's cycles (geometric mean). On ten program-shaped benchmarks it is about even with Oscar64 (0.98), and it loses Dhrystone by 2x. Catwiz is about 29,000 lines of Tisple.

Some of the tricks it took to fit

  • The music keeps playing while the disk loads. The disk reader runs between the music's ticks, and the next song is read from disk while the current one fades.
  • Screen code takes turns in one 3 KB region, copied in from aux memory or read from the second disk when a screen opens. The compiler works out the groups from the call graph.
  • Cold code lives in the language card's hidden second 4 KB bank, called through stubs, and the songs now play from there too.
  • Every face and charm is a one-sector record on disk 2, so the about 100 faces and 35 charms cost no memory.
  • The browser player is a cycle-exact IIe in WebAssembly with its own boot ROM, so no Apple ROMs are shipped. Its drive sounds are synthesized from the emulated drive's own events.

The making-of video: youtube.com/watch?v=fVxRL68BmLk. Source: catwiz and tisple.