Zeta is a small emulator, implementing a fraction of a DOS-compatible environment just large enough to run ZZT and Super ZZT, allowing user-friendly and accurate usage of them in modern
environments, as well as easy packaging, distribution and embedding of ZZT games.
Features
- 100% gameplay accuracy - it's an emulator, not a clone,
- Automatic, CPU-friendly speed scaling, taking into account ZZT's engine design,
- Easy to port to various platforms, including:
- SDL (Windows, Linux, BSD, macOS, ...),
- Web (WebAssembly-based; modern web browsers),
- Curses (play ZZT in your terminal!),
- Small footprint.
Downloads
To run the desktop version of the emulator, you'll need a copy of ZZT or Super ZZT extracted in the same directory!
- Zeta 1.0.9 (Windows, 32-bit)
- Zeta 1.0.9 (Windows, 64-bit)
- Zeta 1.0.9 (Linux, 64-bit; Ubuntu 22.04+ or compatible)
- Zeta 1.0.9a (HTML5)
- Zeta 1.0.9 (source code)
- Zeta Git repository
For distribution, including usage with the HTML5 port, I highly recommend using the following MIT-licensed releases of ZZT:
- Reconstruction of ZZT (source)
- Reconstruction of Super ZZT (source)
- PSA: Hard drives and floppy drives containing many potentially unpreserved, historical ZZT worlds are rapidly decaying. If you have any archives of your own that you'd like to share, please contact me (kontakt at this domain)! I will do my best to ensure adequate preservation of the contained ZZT/Super ZZT/ZIG/MegaZeux/etc. worlds/games, as well as other utilities and periphery.
- Museum of ZZT - find games and articles here!
- Wiki of Weavers - documentation on ZZT forks, ports, clones and emulators (including Zeta!)
Controls
- F11 - open help/settings pop-up menu (1.0.2+)
- Specific to SDL port (Windows/Linux/etc.):
- Ctrl+F5 - toggle .GIF recording (start/stop)
- Ctrl+Shift+F5 - toggle unoptimized .GIF recording (start/stop)
- Ctrl+F6 - toggle audio recording (start/stop)
- Ctrl+Plus/Minus - resize Zeta window to the nearest integer multiple up/down
- F9 - hold for "turbo" mode (no speed limit)
- F12 - take screenshot
- ALT+ENTER - toggle fullscreen/windowed
Advice
- Desktop Zeta provides many command line arguments for configuration - type "zeta86 -h" in a command line to learn more.
- Web Zeta provides configuration options for configuration - see the included README to learn more.
- To use Zeta with ZZT, just drop it into a directory with ZZT or Super ZZT and double-click the executable!
- If you want to release a ZZT game stand-alone, you can just rename the Zeta emulator to match your game.
For example, if your game file is "COOLGAME.ZZT", just rename Zeta to "COOLGAME.EXE"!
- If you want to release a ZZT game in browser form on itch.io:
- Use the HTML5 download as a base,
- Edit index.html to point to your game's ZIP file and the ZZT .ZIP file,
- Set the canvas size to 640x350.
You may also find Dr. Dos's guide helpful.
NEW: As of Zeta beta 30, you can export .GIF files, which itch.io does support for game screenshots!
- If you want to release a ZZT game in browser form on your own website:
- If you're running into a TypeError "streaming compile failed" error, make sure that your web server returns the "application/wasm" MIME type for .wasm files!
- To get WiL's ZZT 4.0/4.1 running, use UPX to decompress the EXE first - the decompression stub used by those executables requires a 386+, which Zeta does not emulate!
- As of beta 36, Zeta displays Super ZZT games using a CGA-style 8x8 font. As I am aware this is an opinionated move, you can use -l charset:default:ega to force the EGA-style stretched 8x14 font instead.
Known bugs
- The desktop/SDL version does not translate filenames to 8.3 yet. Long .ZZT/.SZT filenames are ignored as of beta 25.
- The desktop/SDL version does not automatically resize the window when loading a non-8x14 character set.
- The Windows build of the desktop/SDL version does not work with Super ClassicZoo. To be fair, I have no idea why at this moment.
Changelog
1.0.9 - 27th October 2024
- [SDL] Update SDL2 to 2.30.8.
- [Web] Improve render.blink_cycle_duration option handling and fix regressions.
- [Web] Update Emscripten to 3.1.69.
- Allow forcing "high colors" blinking from the UI.
- Fix the F11 user interface not displaying correctly in 40x25 text modes.
- Remove unnecessary console logging.
1.0.8 - 2nd August 2024
- [SDL] Fall back to the program's executable directory if the current working directory does not contain a ZZT.EXE.
- [SDL] Update SDL2 to 2.30.6.
1.0.7 - 27th April 2024
- [SDL] Fix regression that prevented correct loading of .PAL files.
- [SDL] Update SDL2 to 2.30.2.
1.0.6 - 20th January 2024
- [SDL] Add Linux binary build.
- [SDL] Fix Windows build blur on non-100% DPI settings.
- [SDL] Fix Windows build force-displaying a console window.
- [SDL] Fix Windows build not having an icon.
- [SDL] Reduce memory usage.
- [SDL] Update SDL2 to 2.28.5.
- [Web] Use pixelated rendering for the Zeta rendering canvas by default.
1.0.5 - 16th July 2023
- [SDL] Add '-d' option to enable developer mode. This feature is intended for engine/fork developers; for now, it adds file open/close tracking.
- [SDL] Increase maximum open file limit from 16 to 256.
- [SDL] Update SDL2 to 2.28.1.
1.0.4 - 14th June 2023
- [SDL] Add '-V' option to set the starting volume.
- [SDL] Update SDL2 to 2.26.5.
- [Web] Add engine.skip_kc option; works like '-t' on SDL Zeta.
- Minor bugfixes.
1.0.3 - 19th March 2023
- [SDL] Add command-line option to double an 8x8 .chr file.
- [SDL, Web] Add options to prevent the emulated engine from changing a custom character set or palette.
- Add pop-up menu option to force-disable blinking.
- Add support for .PAL files with 24-bit colors, as opposed to only 18-bit.
- Fix CTRL-letter keybinds not being emulated.
- Respect custom blinking rate configuration in the .GIF writer.
- Tweak pop-up menu visual flair.
1.0.2a - 11th March 2023
- [SDL] Update SDL2 to 2.26.4.
- Add F11 pop-up menu. For now, this allows configuring volume and the player step sound.
- Fix regression in player step noise removal logic.
- Normalize default volume level at 20% (as opposed to 40% on web and 100% on SDL2).
1.0.1a - 12th February 2023
- [SDL] Add helpful pop-up dialog boxes for common errors.
- [SDL] Update SDL2 to 2.26.3 (for real this time).
- [Web] Add subdirectory support (for ClassicZoo, Weave 3 and other forks).
1.0.0 - 16th October 2022
- The project never really left beta stage in maturity, but I consider it "done", in the sense of not having received major new features in almost a year.
[SDL] Update SDL2 to 2.24.1.
- [Web] Fix major performance bottleneck when reading files.
- [Web] [#15] Partially fix long-to-short filename conversions.
- [Web] Support command: ["zzt.exe"] configuration syntax.
beta 40 - 26th March 2022
- [SDL] Fix character set changes not taking into account the user-requested window scaling.
- Partially mitigate edge-case emulation freezing.
- Fix m4/ folder not being packaged in source code.
beta 39 - 15th February 2022
[SDL] Update SDL2 to 2.0.20.
- [Web] Fix a race condition with audio initialization.
- [Web] Fix compatibility issues with ZZT forks.
- [Web] Fix modifier input issues on rare browser configurations.
beta 38 - 30th November 2021
- [SDL] Avoid creating empty LPT1 file; fixes running Zeta in a OneDrive-synchronized folder.
- [SDL] Fix zeta86.exe auto-loading zeta86.zzt.
- [SDL] Support auto-loading Super ZZT worlds via executable name.
- Various emulation compatibility improvements.
beta 37 - 7th November 2021
- An update to the web version is not necessary, as only the SDL frontend was changed.
- [SDL] Allow specifying charset:default:ega and charset:default:cga to force a specific built-in font.
- [SDL] Fix hang on charset change in Windows.
- [SDL] Improve various aspects of window resizing logic.
beta 36 - 6th November 2021
- [SDL] Actually re-enable band-limited synthesis in the official build.
- [Web] Fix crash if navigator.getGamepads() is not present.
- Automatically use CGA-style 8x8 font for 40x25 mode (Super ZZT).
- Updated toolchain and dependencies.
beta 35 - 18th June 2021
- [SDL] Expose both SHIFT keys individually to the emulated executable.
- Security patch.
beta 34 - 29th May 2021
- [Web] Fix support for expanded VFS paths (affected ClassicZoo).
- [Web] Fix support for larger EMS memory usage (affected ClassicZoo).
- Fix minor performance regression, mostly only affected [Web].
beta 33 - 30th April 2021
- [SDL] Fix capturing blinking colors in .GIF export.
- [SDL] Fix crash with nVidia drivers on some Linux setups.
- [SDL] Minor fixes to subdirectory handling.
- [Web] Fix crash in certain CPU logging edge cases.
- Support common EGA detection method - allows ClassicZoo to use fast video code path.
beta 32 - 6th March 2021
- Major audio code improvements. Not perfect yet, but the best it's ever been.
- [SDL] Re-enable band-limited synthesis in the official build.
- [SDL] Fix subdirectory handling bugs.
- Minor emulation tweaks and improvements.
beta 31 - 27th February 2021
- This is a desktop-only release - the Web version has not changed in any way.
- [SDL] Significantly improved the optimization of the built-in GIF encoder. (It is still beneficial to run it through gifsicle if you value the absolute minimum filesize, but the built-in result should be fine.)
- [SDL] Fixed .GIF files in a way which makes them play better with certain social media platforms.
beta 30 - 27th February 2021
- With special thanks to the Kunger Binb.
- Added EMS emulation support! This should be useful for all ZZT source forks wanting to make use of extended memory.
- [SDL] Added GIF export support! Press CTRL+F5 to record a .GIF file of your playthrough. The feature is slightly experimental, and more work may be done on this to improve compression and/or compatibility.
- Fixed the following DOS/PC emulation accuracy bugs:
- INT 10h palette emulation being broken in general - now it takes into account the separation between palette and DAC registers. This change may break some TSRs, but they would have had issues on real hardware regardless.
- INT 10h AX=1012h ignoring the starting color value.
- INT 16h AX=0305h not setting repeat delays correctly.
- [Web] Fixed multiple bugs related to rendering games with non-standard character sets and palettes.
beta 29 - 20th Jaunary 2021
- [SDL] Use linear interpolation instead of band-limited synthesis due to performance issues. Will have to go back to the drawing board on this one.
- [Web] Fix regression in PNG charset override support.
- [Web] Fix regression in Super ZZT/40-column mode support.
- [Windows] Updated SDL to 2.0.14.
beta 28 - 5th December 2020
- [SDL] Implement band-limited sound synthesis for PC Speaker emulation. Should greatly improve audio quality. (Special thanks to Noser for pointing me in the right direction.)
- [SDL] Add the Zeta version to the window title.
- [Web] Implement linear interpolation for PC Speaker emulation. May slightly improve audio quality.
beta 27 - 9th November 2020
- [SDL] Add support for directory traversal, for those ZZT forks which utilize it.
- [SDL] Fix support for non-USA keyboard layouts.
- [Web] Fix disabling blinking via object configuration (regression).
- Minor improvements.
beta 26 - 19th September 2020
- [SDL] Fix memory allocation-related crash in beta 25 VFS code.
- [SDL] Minor optimizations to fallback software renderer.
- [Web] Fix browser crash when using a function-based filenameMapper.
- Add support for INT 10 calls which change palette and/or blinking settings (f.e. Quantum P.'s TSR).
- Fix speaker buffer size overruns on a popular ZZT fork.
beta 25 - 25th August 2020
- Taken down due to unrelated reliability issues in both the web and desktop version.
- [SDL] Allow using numpad/unshifted keys to control in-window zoom.
- [SDL] Add sorting filenames in a directory by name.
- [SDL, Web] Fix incorrect mouse button mappings.
- [Web] Attempt to fix rendering glitches on zoomed-in canvases.
- [Web] New filesystem configuration format - make sure to update your HTML file!
- Minor improvements - updating Emscripten, minor optimizations, etc.
beta 24 - 16th March 2020
- [Windows] Updated SDL to 2.0.12.
- Project relicensed under the terms of the MIT license.
beta 23 - 8th February 2020
- [SDL] Fixed K/C skip holding the ENTER key on auto-repeat.
- [Web] Fixed crash in Firefox's private mode, or when IndexedDB is present but disabled.
- [Web] Decreased filesize - smaller downloads!
beta 22 - 29th January 2020
- [SDL] Add CTRL+Plus/Minus for window scaling.
- [SDL] Add F9 turbo option.
- [Web] Add backwards compatibility for older browsers for IndexedDB logic
- Refactoring and cleanup.
beta 21 - 10th December 2019
- [SDL, Web] Rewritten audio logic! Proper handling of repeated notes (as opposed to long notes) and fixed bugs regarding high-latency environments.
- [SDL, Web] Added an option to configure the memory limit, between 64 and 640 KB! Use this to ensure your game would run on a real DOS machine.
- [SDL/Windows] Added an icon to the executable.
- [Web] Fixed a bug where holding certain keys then going out of focus could cause the keys to get stuck in-game.
beta 20 - 4th December 2019
- Quick hotfix release.
- [SDL, Web] Fix bug where a large stream of notes in one CPU cycle could cause a non-stop sound to be emitted.
- [Web] Update Emscripten and reduce runtime size by a few kilobytes.
beta 19 - 31st October 2019
- [SDL, Web] Fix regression with walking step sounds being far too noticeable.
beta 18 - 27th October 2019
- [SDL, Web] Rewritten audio logic! Performance improvements and accuracy improvements (including drums)!
- [SDL] Add audio capture support - press Ctrl+F6 to toggle.
- Note that audio capture uses its own version of the audio engine, prioritizing audio "accuracy" - as it doesn't have to worry about latency.
- As for "accuracy", I am still not sure if Zeta is 100% accurate - will need to compare with real hardware at some point...
beta 17 - 5th October 2019
- [Web] Filenames in .ZIP files are now automatically translated to 8.3!
- [SDL, Web] Fixed support of character sets between 8x8 and 8x16.
- [SDL] Fixed bug where Super ZZT would not show more than one .SZT file in a directory.
beta 16 - 20th September 2019
- [SDL, Web] Timing accuracy improvements, particularly with regards to the default blinking rate.
- [SDL] Fix blinking characters not updating the screen when OpenGL is used.
- [SDL] Support outputting PNGs instead of BMPs for screenshots.
beta 15 - 23rd August 2019
- [SDL, Web] Added the ability to load custom charsets and palettes in .CHR/.PAL/.PLD format!
- [Web] Added a new audio engine, matching the sound output of the SDL version.
- [Web] Added methods to control certain aspects of the engine (charsets, palettes, volume, blink cycles) during runtime from scripts.
- [Web] Added the ability to pass in extra commands to run before starting the engine.
- [Web] Minor fixes and updates.
beta 14 - 16th August 2019
- [SDL] Updated official Windows builds to use SDL 2.0.10.
- [Web]
- Persistent game saves!
- New configuration options - covering aspects of rendering, audio, and more advanced ZIP file loading.
- Added (limited) documentation - see readme.txt for details.
- Added on-canvas messages for emulation stopping and file download errors.
- Added version information to the JavaScript console and loading screen.
beta 12 - 7th July 2019
- [SDL] Fix HiDPI support on Windows (as found by lynn)
- Fixed in-emulator time not being set correctly
beta 11 - 16th June 2019
- [SDL] Fix rare screenshot corruption bug (as found by Dr_Dos)
- [Web] Minor code cleanup; recompiled with Emscripten 1.38.36
beta 10 - 3rd May 2019
- [Curses] Add new port! (Unfortunately, no builds at this time)
- [SDL] Add screenshot key - F12
- [SDL] Minor fixes
- [SDL] New software/fallback renderer - much more efficient (still worse than OpenGL, of course)
- [Web] Custom character set installer support
- [Web] Improved timing accuracy
- [Web] Significant code refactors
- Allow changing the 'typematic rate' via interrupts (in-emulation)
beta 9 - 17th March 2019
- [SDL] Add fullscreen toggle - ALT+ENTER
- [SDL] Allow loading multiple executables in a row with "-e"
- [SDL] Allow disabling blinking with "-b"
- [SDL] Custom character set installer support
- [Web] First public release
- Fix CPU usage regression
beta 8 - 16th March 2019
License
Copyright (c) 2018, 2019, 2020 Adrian Siekierka
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Different licensing terms can be discussed, if necessary - contact me.
If you appreciate the work, please consider supporting me on Liberapay.