Shawn Sijnstra<p>After much testing and code comparison, the new Feb 2025 Release of <a href="https://hachyderm.io/tags/Vezza" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Vezza</span></a> - my <a href="https://hachyderm.io/tags/z80" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>z80</span></a> high speed <a href="https://hachyderm.io/tags/zmachine" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>zmachine</span></a> is ready! Took way longer than expected to synchronize across all of the code bases, particularly making sure that all optimizations made it across all platforms - TRS-80 model 1, TRS-80 model 3, TRS-80 model 4, the CP/M versions (~18 platforms), the embedded versions (Spectrum tape, TEC-1G), and slowly pushing into the Agon Light version (which has even more updates still in progress). Lots of individual tweaks, and some major rethinks and rewrites have come together to accelerate game play.</p><p>The hardest part of rewriting in this update involved rewriting the dictionary search code. I ended up going back to the original jzip interpreter, written in C for Unix waaay back when. Jzip provided much of the logic that went into ZXZVM, which provided the base for <a href="https://hachyderm.io/tags/M4ZVM" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>M4ZVM</span></a> <a href="https://hachyderm.io/tags/M3ZVM" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>M3ZVM</span></a> and <a href="https://hachyderm.io/tags/Vezza" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>Vezza</span></a>. Going back to Jzip made sense as Jzip has an even longer history; and is highly tested and stable and still maintained. This research gave me the confidence that the streamlining and changes I was making to such a fundamental part of the game would work, making all inputted dictionary searching more efficient.</p><p>To work around how CP/M stores executable files I spent a lot of time re-organising the memory map to make the executable smaller. This involved rearranging where the initialization code was stored inside the increasingly complex layout. Support across multiple versions means I needed to break up variable sized code and strings to sit inside variable sized gaps, while still compiling all the CP/M versions from the same interconnected set of source files. It needed quite a few manual checks to ensure that it all worked.</p><p>What this all means is that your favourite <a href="https://hachyderm.io/tags/infocom" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>infocom</span></a> <a href="https://hachyderm.io/tags/punyinform" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>punyinform</span></a> and other text adventures will all play on your favourite z80 <a href="https://hachyderm.io/tags/retrocomputing" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>retrocomputing</span></a> platforms even faster than before!</p><p>More details in the devlog and downloads can be found at:<br><a href="https://hachyderm.io/tags/TRS80" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>TRS80</span></a> versions <a href="https://sijnstra.itch.io/m4zvm" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">sijnstra.itch.io/m4zvm</span><span class="invisible"></span></a><br><a href="https://hachyderm.io/tags/CPM" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>CPM</span></a> <a href="https://hachyderm.io/tags/CPM80" class="mention hashtag" rel="nofollow noopener noreferrer" target="_blank">#<span>CPM80</span></a> versions <a href="https://sijnstra.itch.io/vezza" rel="nofollow noopener noreferrer" translate="no" target="_blank"><span class="invisible">https://</span><span class="">sijnstra.itch.io/vezza</span><span class="invisible"></span></a></p>