Vezza, a new Z-Machine for CP/M

I’ve made a z-80 based terp with CP/M 3 as the target system. I’m hoping for some help with testing as well as ideas for what else can be implemented within the constraints of the system(s). While there’s a list of things I’d like to do, I’m open to feedback to see where the interest is, which may help prioritise.

Major features:

  • Supports z1-z8 (z6 is limited to non-graphics)
  • Faster than the original Infocom interpreter
  • Named file save/load
  • Reverse text
  • Timed input (1 second resolution)

It takes the optimisations and extensions I’ve developed through the M1/M3/M4ZVM terps, making a highly portable and efficient terp. System constraints has lead to some compromises on the way, which are listed on the link below.

Big thanks go out to Stefan @8bit_era for testing and encouragement to get this happening!

The best use case is any game that has a 1-row status line which is redrawn just before the turn prompt is displayed. PunyInform is ideal for this, including z5 games. Features of the VT52 terminal make it difficult to achieve more visually. Other terminals are also on my later targets list.

I’ve made binaries available for 3 configurations:

* - 80x24 screen, vt52 terminal (e.g. Amstrad CPC)
* - 51x24 screen, vt52 terminal (e.g. Spectrum +3)
*  - 80x25 screen, HGT (e.g. CPU280)

Binaries, a full list of features, current ideas and known issues is available from:

Some screenshots:


Seeing that screenshot reminded my of my old Amstrad!

IFWiki has pages on M3ZVM and M4ZVM. If you have any time off from actually writing the software, would you be willing to check those pages and possibly add a page for Vezza?


I’m going to try getting it to run on my RC2014.

Thank you!


Absolutely! I added and maintain the M3ZVM and M4ZVM pages. I will add this as well.


Awesome! If you could share some action photos, that would be much appreciated.


Will do! I’m currently in the middle of developing a game for ECTOCOMP.

I will try to fire up my RC2014 and give it a try.

Thanks again.


Turns out that with appropriate terminal emulation features (in this case HGT, I can’t see these features on the VT-52 emulations I’ve seen) and a banked version of CP/M, I can use the banked version to increase the available DynMEM and the terminal features to control scrolling issues, and Beyond Zork becomes feasible under CP/M.

Extremely low quality video of a system demonstrating the whole loading procedure. Note that the system here is a CPU280 with a z280 @ 12MHz, running ZCPR3. I’m also using an HxC2001 as my floppy drive (hard disk on this machine is currently unavailable).

Once I’m confident enough with this change, I’ll update versions available on my Gitlab site.


Bravo, Shawn! I was just recently bemoaning the lack of a good non-proprietary CP/M terp, and here it is. I’ll have to see if I can get it running on the Z80 softcard on my Apple II.


Let me know the terminal emulation details! At the very least do you know what terminal it is emulating? e.g. VT-52, ADM-3, H19?

1 Like

So this turns out to be a nontrivial question. I’m using Werner Muenchheimer’s port of CP/M 3 to the Apple II Softcard (to my knowledge this is the only version of CP/M 3 that runs on the Softcard, although there are many ports of CP/M 2.2). This distribution provides terminal emulation via EMULA, but with very little information about what, exactly, this is emulating. Running software that expects a Soroc IQ-120 seems to almost work, but not quite; there is an assembler source file (SOROC.MAC) on one of the disks that might be helpful, but I’ll have to look more at that later. (The emulation might also just be incomplete.)

Thanks for the interest! Is there currently a way to run Vezza in any kind of “dumb terminal” mode? I’m not seeing any documentation on (e.g.) command line options.

(If you’d like to tinker with this, AppleWin supports Z80 Softcard emulation.)

UPDATE EDIT: I think it’s emulating a Videx Videoterm, which is also the default option for CP/M 2.2 on the Softcard.


Thanks for that! I haven’t yet pulled together a dumb terminal mode. I was wondering what the interest would be in that - I assume that means no status line at all. Do you think that would be useful?

I think I found some documentation on Videx Videoterm. If I understand correctly, inverse text/highlighting is an optional expansion only. Is that common? Also it looks like you can’t turn off line wrapping so I’ll need to have a think about whether I can go 80x24 or if I settle for 79x24. I can see there’s a code for positioning the cursor which is nice.

There are 3 routines I’m currently relying on which are only in CP/M 3 - including timed input. CP/M 2.2 is on the roadmap although it needs me to write some workarounds for what I’m using. I’ll take a look at the emulator you’ve mentioned and see if I can get that to go. Thanks!

EMULA does seem to emulate inverse text (at least, WordStar properly displays inverse text when running in Soroc mode, though not when in Videoterm mode - I imagine it just doesn’t try, for compatibility reasons).

I’m always a fan of dumb terminal modes for compatibility - it opens up the option to run it on any obscure CP/M system with a nonstandard terminal. But of course, status lines are preferable when feasible.

Very cool stuff!


So… I’m trying EMULA, and it almost seems to be a SOROC-120. The Vidtex terminal codes didn’t seem to work properly. With SOROC-120 I get some success, however, there’s clearly something else going on. Also I have no idea how to get inverse text as the SOROC does not support it. If you can point me at the terminal code definitions, I can keep digging.

From the Softcard documentation it seems that Apple II CP/M 2.2 has a sort of termcap functionality to interconvert between different terminal modes, but it only supports a limited subset of escape codes. Apple II CP/M 3 doesn’t ship with the same configuration tool, but as far as I can tell the defaults are the same as in CP/M 2.2 (which identifies this as “Soroc IQ 120” mode):

I can confirm that the ESC+( for inverse text does seem to work. The SOROC.MAC files, etc. on the CP/M 3 disks seem to be source for small tools that redefine the termcap tables in memory, similarly to how the configuration tool works on CP/M 2.2 - but presumably just supporting the default would be ideal.

1 Like

So close! I’m going to do a little more testing and then do an update of all available binaries. Yes it has an interesting quirk but at this point I have no idea how to fix that.


Okay so it turns out that the character glitches above are fixed if you select that you have the hires card.
So in summary, to run on the Apple II, you need the Softcard, CP/M 3 and the hires card, run EMULA set to Soroc 120/240 (which seems to be the default), it works perfectly!

Full list of Vezza versions now available are:

* - 80x24 screen, vt52 terminal (e.g. Amstrad CPC)
*  - 80x24 screen, vt52 + Banked CP/M 3
* - 51x24 screen, vt52 terminal (e.g. Spectrum +3)
*  - 80x25 screen, HGT + Banked CP.M 3 (e.g. CPU280)
* - 80x24 screen, Soroc IQ 120 terminal (e.g. Apple Softcard CP/M3)
1 Like

Awesome, thanks so much for working on this!

I am getting a minor visual bug with the status line for some reason:

Thanks for sharing! Looks like I left in the apple/soroc version a workaround to fix a cosmetic issue on the CPC implementation of the vt-52. Try again and let me know if that fixes it?

Hi Shawn,
As discussed elsewhere, the above Soroc terminal codes are the same as used by the Microbee except for the CLEAR SCREEN, that uses 1Ah rather than the ESC *
I tried the VEZZA-SO on the Microbee CP/M3 disk and I get to when the file is loading then a black screen, as expected.



Thank you! I couldn’t get the patched cpmtools to give the right response yet, but I could get host2cpm to work. Does the CP/M need to load something to set which terminal type it is emulating? I read somewhere that colour ANSI is supported? If that’s the case, I’m happy to attempt to go straight there and squeeze the full experience out of the system. These are the results with the Soroc version which makes me think if ANSI is supported, I might as well go straight there: