Vezza, a new Z-Machine for CP/M

I use HOST2CPM and CPM2HOST myself, much easier to use than CPMTools. The Terminal the bee uses for CP/M is built into the CP/M code. But I know ANSI can be emulated, as I’ve seen an under development TELCOM that has ANSI support to allow connections to Telnet BBS’s.

The Microbee can currently run any Z3 infocom file, its the ability to run Z5 files I’m after as they seem to be abundant. This is Mini-Zork I and II as they currently run on the 'bee.

Alan

2 Likes

and II

2 Likes

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?

Yep, that fixed it. Thanks!

2 Likes

Hi Alan,

Appreciate the goal is to run games previously not available - the screenshot provided is just an example of how the text renders, which is the next problem to solve. The terminal codes in use are different to the Soroc IQ 128 as I also get exactly the same problem with running a z5 - see screenshot below. I need to find out which terminal the MicroBee is emulating so I can use the correct terminal codes to make the most of the platform. It’s a much more feature rich platform than the z3 version, which is why configuration is a lot more involved than the original Infocom z3 interpreter.

2 Likes

Here is a scan of the Microbees Terminal codes its knows

2 Likes

Thank you for that list! I was able to use that to come up with a slightly different way of scrolling the lower window. The up side is that it now works as expected, and the status line (or even multi-line upper window) does not scroll off, with one exception - if the row at the bottom goes the full 80 characters. I can’t find a way to turn off auto-feed, so I could either make it 79 columns which causes other issues for games expecting the full width, or leave it as-is.

I will upload the binary shortly. here’s a sample screenshot:

3 Likes

After some further testing, looks like it’s better to shave off the last column to get the best cosmetic results. It’s been uploaded as vezza-a3.com - let me know how you go! I forgot to enable the code that allows the Seastalker sonarscope to work. I’ll upload that later after this version gets more of a test run.

It was AMFV which made me go with the shaved off column - it comes out well this way:

additional: Beyond Zork also looking good

4 Likes

Looks like for many terminals I’ve figured out how to overcome the cosmetic issue. Out of the various builds now downloadable, it’s only the Soroc IQ 120 terminal that doesn’t support the necessary codes to maintain the status line. The VT-52 works very well (as expected when I think about it…) and the ADM-3a is close but is missing codes to support the full width. The HGT which largely uses more advanced Televideo codes now works in a more simplified way.

image

1 Like

Just for fun, here’s a real-hardware demo on the Apple II (with bonus Appleception):

3 Likes

Thanks Shawn, yes looking good. I tried BeyondZork and its looking great as well. Tried a few other recent smaller Z5 games and they all seem to run okay as well. Thanks for your efforts in getting it running on the Microbee, much appreciated. The size of these Z5 files are huge, like BZ is 270kb, AMFV is 256kb so looks like I will only be able to just fit 3 games on a Microbee 786kb disk if I’m lucky. These 2 games running

2 Likes

and

3 Likes

I tried to run TRINITY.Z4 but get this error of exceeding max DynMEM of 32k ?? I then tried ZORKZERO.Z6 and appears the Score get wrapped to the next line, is that a 79/80 line issue ? Sorry I cant add any more pics or posts as I’m a newbie here :frowning:

1 Like

Hi Alan, all good! Let me take you on a still-going journey…

There is an interesting trade-off with these games inside the CP/M memory model. With the z80 addressing up to 64K directly, one of my design decisions was to not build any direct paging of memory. I wanted the code to be both fast and portable. That comes at a cost. The z-machine/infocom game format allows for up to 64K of memory to be used to store read/write variables such as object status and location. This is Dynamic memory or DynMem for short. Most games use way less than 64k - most Infocom games are under 22k. I store that in memory for speed reasons. Memory also is used for the executable itself, disk cache and multiple stacks.

The challenge is where to draw the line for performance. I would love Trinity to also work and I think that a banked CP/M might just have enough memory to make it playable. Now that the code is starting to settle down, I will be looking again at the memory map to see if I can make Trinity fit and be playable.

p.s. out of all of the Infocom games, Trinity is enormous in use of Dynamic Memory (37k). On my model I/III version, as well as non-paged CP/M, you’ll also find that Beyond Zork and AMFV are also too large.

3 Likes

For the Microbee I’ve added the ANSI colour selecting codes, which work well with Beyond Zork, however, they cause a lot of issues with z6 games which will take more research. The binary is available as vezza-mb.com if you want to try it out.
Updated image (binary also updated now) - looks like I can add “bold” to the supported text types:

3 Likes

Woohoo, looking good :slight_smile:

3 Likes

Wow! I’m going to have to figure out where I stashed my P112.

1 Like

This continues to be extremely cool. If you’re looking for more feature ideas, my main wishlist items would be CP/M 2.2 support and dumb terminal mode - even without a proper status line or (e.g.) timed input, that would immediately make a ton of games playable on many of the more obscure Z80 CP/M machines. A version for the Osborne (52x24 display, TeleVideo 912C, CP/M 2.2) would also be great.

A more complicated feature request: many early CP/M platforms (like the Osborne and Apple II with a softcard) are limited to single- or double-density disks in their most common configuration, which means most z5/z8 games are too large to fit on one disk. It would be fantastic if it were possible to split these files over two disks (either with two disks inserted in the A: and B: drives, or using an “insert disk 2” type prompt). The Infocom terps for Apple II do this for z5 games, although I don’t imagine most Inform games would be well-optimized to minimize disk-switching in a single-drive arrangement.

When Infocom’s interpreters played games that were on two disks, they would read the first part of the story file into RAM first, ask you to insert the other disk, and then the game could start. It would never ask you to insert the first disk again, so the RAM used by the part of the game that is on the first disk is left to hold its contents for the entire game session.

This technique can still be used, and on a system with 64 KB of RAM it means you can play z5 games up to about 30 KB + the amount of data that fits on a disk side. However, the more you fit onto side 1, the less RAM will be free for virtual memory buffers. This is a big problem for Inform 6 games, particulary with later library versions, as even the core functions that are needed every move take up more than than entire RAM you have for virtual memory. Library versions 6/1 and 6/2 are better, and PunyInform is a lot better in this respect, as is ZIL.

2 Likes

So I’ve tweaked the memory map and have updated the list of binaries available to now allow Trinity to load. Expect a performance hit due to higher I/O (less space for cache), but it works:


Also for those with a Speccy can use @ChristopherDrum 's versions of narrow-screen converted z4 games:
Speccy Trinity

2 Likes

Thank you! Definitely appreciate the ideas.

I do have CP/M 2.2 on my to do list although it is a little way down. It’ll need a bunch of extra code to replace the other CP/M 3 routines I use as well, and it doesn’t normally support banked memory operations, so it will result in smaller games being able to work. At the very least it’ll rule out Trinity, AMFV and Beyond Zork. Not so bad in the big scheme of things which is why it’s definitely on the list.

The headless one is the one that I’ve struggled to decide on whether it would be genuinely useful. Which sort of games do you think would play? I’m open to ideas on how to handle the lack of upper(status) window because with enough of a use case, it should be easy enough to do. My current understanding is that if I simply cut it off, there will be no working hint pages (just a blank page with no instruction on how to exit), no pop-up windows with messages (anything similar to the one on the Trinity screen shot) so important text could go missing, and the Bureaucracy opening would rule it out as well. The ScottFree ports to z-machine also use the status window for their room description. Again - not saying it can’t be done, I just haven’t really worked out how to solve it and am open to ideas. Perhaps there are other z5 games you are thinking of that will be just fine without a status bar?

The disk switching prompt is also something I’d consider, with the conditions outlined in @fredrik 's post, however, I would need some help working out which additional games on which platform would become viable that were not previously. Note that any large amounts of extra code to handle these situations will reduce the overall performance of the interpreter as there will be less cache available. Currently I don’t even prompt to swap disks for a disk save.