One day in early 2001 I suffered a mental breakdown and decided to write a Basic interpreter for the Z-machine. At least, I think I suffered a mental breakdown; I can't think of any other reason why I would want to do that.

By the time I recovered, baZic (as I called it) was mostly finished. It features:

  • Dynamic memory allocation, complete with block coalescing
  • A full mark/sweep garbage collector
  • Dynamic typing
  • Full tokenisation for fast(!) execution of programs
  • Full detokenisation when listing them again
  • An interactive Basic development environment (cough, cough)
  • State-of-the-art implementations of Hunt the Wumpus and Guess the Number built in to the very interpreter
  • Pseudo arrays
What it doesn't feature:
  • String operators (the hooks are there, I just need to write the code)
  • Subroutines (GOSUB & friends)
  • Procedures (SUB/PROC & friends)
  • Proper arrays
I am unlikely ever to finish this; the Basic language is just too annoying for words. It's even more annoying to implement than to write in. (It uses the Parser from Hell.) If you wish to continue it, be my guest.

baZic is written in 100% Inform code. It does, however, make certain horrible assumptions about the memory map that means it's unlikely to compile for the Glulx platform. It is mostly useful as an example of just what you can do on the Z-machine if you bend it sufficiently. Oh, and the memory allocator and garbage collector are modular and can be easily ripped out and reused if you are so inclined.

The program is licensed under the MIT open source license. The full text is available in the source package.

bazic.zip 13 kB

Z-machine file and documentation.

bazic.src.zip 19 kB

Source code. If you want to add or remove keyword tokens, you'll need a copy of awk.