2026-07-28 - Released version 2.0.5 - preview

	- The emulator can now be built on macOS as well (guide: docs/build_osx.md). Thanks to Mathias Olsson for the contribution.

	- BUGFIX: macOS - the emulator crashed shortly after start while updating the main window title. (GitHub issue #2)

	- BUGFIX: Debugger - a MEM_W/MEM_R breakpoint incorrectly triggered already when an instruction at the watched address was executed.

	- BUGFIX: Debugger - MEM_W/MEM_R and IORQ breakpoints only worked while the Disassembled window was open. They now work without the Disassembled #1 window open too.

	- Debugger - for a memory-access breakpoint in the memory bank zone (MMEXT_BANK) you can now choose how the entered address is read: either as an address in the CPU view (0000-FFFF), or as an offset within the bank (e.g. 0000-1FFF). The offset within the bank catches an access to that bank regardless of which CPU window the bank is currently mapped into.

	- BUGFIX: Trace Suite - turning recording off (or changing a channel mode) from the menu while emulation was running could crash the emulator. Recording is now started and stopped safely on the emulation thread.

	- CHANGE: Trace-suite recording now has a default size cap of 2 GB per channel (previously unlimited) so a long recording (mainly CPU Track) cannot fill the disk. When reached, the channel stops; the cap is configurable (max_total_mb, 0 = unlimited).

	- BUGFIX: fixed timing in the z80-mz800 CPU core - the CPU executed an interrupt immediately after EI instead of after the following instruction. The bug was introduced in version v2.0.2

	- BUGFIX: In IM 2 mode, when an interrupt that did not originate from the PIO-Z80 arrived, we previously returned the vector 0x00 incorrectly. Now the "bus ghost" value is returned. A minor fix was also added in the I/O Ports window and the Events window. Snapshot: loading a snapshot corrupted the Unicard SD root dir configuration.

	- MCP server - events are now available over TCP as well (previously only over the pipe). Typed breakpoints (MEM_W, MEM_R, IORQ...) can be created. Instruction tracing can be fully controlled over MCP (start/stop/reset/save, with channel selection). MCP tools now always return an error message instead of an empty response on error.

	- BUGFIX: MCP server - sending keys to the emulator now reports whether the keys actually landed. Previously the tool could report success even when the machine did not accept them.

	- Tracing can now be limited to an address range (PC filter).

	- A breakpoint action can run additional commands - control tracing and CDL recording (start/stop/reset/save) and save a snapshot or a memory segment right from the breakpoint (including a continuing one), with a file name template.

	- BUGFIX: MCP server - emu_run now stops emulation deterministically (exactly at the requested frame count). Previously the asynchronous pause stopped it at a variable point, so tracing over MCP could nondeterministically affect timing-sensitive programs.

	- MCP server - the emu_run response now includes a stopped_by field (why the emulation stopped: ran the full frame count, breakpoint, pause or timeout); the complete field is now true only when the full requested frame count was reached.

	- SPEEDUP: The emulation is significantly faster in MAX SPEED mode. Thanks to Z80 core and memory access optimizations it now runs about 42 % faster (up to ~47 % on memory-heavy code). Specifically: a per-step Z80 core variant without the internal register cache (+27 %) and direct (inline) access to plain RAM instead of going through a function pointer (+11.6 % to +15.6 %).

	- BUGFIX: Unicard - the short file name field (8.3 format) in the directory listing and file status contained only a truncated long name instead of a valid 8.3 name for long file names. The emulation now generates the same 8.3 name as a real card.
	  IMPORTANT: it turned out that each Unicard firmware version fills this field DIFFERENTLY - and the emulation now reproduces BOTH variants. Firmware uc1 (MZ800UKP1) preserves letter case (e.g. "seesharp.mzf" stays lowercase); firmware uc3 (Unicard3) uses uppercase only. The emulation picks the correct variant based on the active firmware.

	- BUGFIX: Unicard - the binary directory listing and file status now also faithfully fill the long name field and its length, according to the active firmware (uc1 and uc3 fill these fields differently - on uc1 the long name is sent only for files that actually have one, on uc3 this field carries the primary name). As a result, code tested against the emulator also works on real HW. Firmware uc1 additionally sends a ".." entry in subdirectories (uc3 does not - its manager adds it itself).

	- CHANGE: A bug was found in the Unicard uc3 (Unicard3) firmware - in the binary directory listing it does not fill the long file name (LFN) field. In this point the emulator deliberately behaves CONTRARY to the accurate-emulation principle: it emulates uc3 the way we believe it should behave IF the bug were not there (i.e. filling the LFN correctly). For this reason, uc1 (which is faithful to the real HW) is now the default Unicard firmware for MZ-800.

	- BUGFIX: the main window was not placed at the center of the screen at startup on lower-resolution displays when a startup window size other than "Native" was selected. The window is now centered for all sizes, including after leaving full-screen mode.

	- BUGFIX: MCP server - direct physical memory access (region_read/region_write and the file_load/save_from_region composites) was unreliable in some situations: reading large regions (around 64 KB) over TCP stalled the connection, and region IO failed until the debugger was opened. It now works reliably even for full 64 KB regions and right after startup; on error it returns a clear message instead of an empty response.

	- BUGFIX: On-the-fly reads from the CTC 8253 occasionally returned a wrong value. The bug was introduced in v2.0.2 when the emulation was split into the DBG and HOT paths.


2026-06-14 - Released version 2.0.4 - preview

	- The printer mode switch can now be set to MZ or CENTRONICS. In both modes the printer communication can be logged to a file independently.

	- Added full emulation of the MZ-1P16 plotter. This plotter behaves as connected only while the GUI window with its generated output is open. When the MZ-1P16 plotter window is opened, the printer mode switch is automatically set to the "MZ" standard, and the standard cannot be changed to "CENTRONICS" for as long as the plotter is connected. The printer file capture can still be used even with the plotter connected at the same time.

	- The Z80 PIO can now generate an interrupt from the printer port signals, so hopefully it won't have any undesirable side effects.

	- Added a MAX SPEED benchmark: measures emulation efficiency in MAX SPEED mode (how much real MZ-800 time gets executed per one real second, 100 % = real HW speed). Window via the Emulator -> MAX SPEED Benchmark... menu, the Alt+T key prints the report to the console, Alt+Shift+T resets it. For headless measurement use the --maxspeed-bench option. Measurement is active only in MAX SPEED and excludes pause and blocking operations (CMT hack).

	- Added support for a secondary FDC controller (WD279x) on ports 0x58 - 0x5F (supported by some types of Unicard).

	- Unicard: new "Managed FDC" option (none / FDC0 / FDC1) selects which FDC controller the Unicard API manages when mounting DSK images; the change affects only future operations

	- Debugger: the FDC State window has tabs for both controllers; the I/O Ports window shows the ports of both the standard and secondary controllers

	- Debugger: added device status details for Memory Disks and IDE8 Disks

	- MCP server: FDC media slots now address both the controller and the drive - fdc0_fd0..3 (standard controller) and fdc1_fd0..3 (secondary controller). The original fdc0/fdc1 slots were removed (breaking change for MCP clients)

	- BUGFIX: FDC - after the controller rewrite, the MZ-800 disk BASIC reported "FD1:Unformat error" when listing the directory (DIR); the cause was that during multi-block sector reads the controller signalled Record Not Found at the end of a track permanently, instead of only transiently (one BUSY+RNF status read, then a clean status)

	- BUGFIX: FDC - clicking Cancel in the DSK file browser no longer unmounts the current image (it stays unchanged)

	- BUGFIX: Unicard - the GETCWD command returned a doubled leading slash for subdirectories (//dir)

	- BUGFIX: Debugger Main, Instruction History showed extra bytes for short instructions


2026-06-02 - Released version 2.0.3 - preview

	- New standalone window for disassembling a memory block

	- Debugger: added GDG State panel (video subsystem, raster, palette, PCG)

	- Debugger: added per-chip detail panels (CTC / PPI / Z80 PIO / PSG)

	- Debugger: added PSG Audio Scope window (oscilloscopes, envelope, piano roll, MIDI/CSV export)

	- Debugger: Memory Browser window, Memory Diff

	- all GTK artifacts and legacy have finally been removed from the project

	- MCP server implemented

	- Created a virtual CENTRONIX printer that performs automatic capture to a file

	- Virtual keyboard: added hint with description of PC key for non-intuitively placed keys

	- Breakpoints Window: added Groups section + minor improvements

	- Unicard: the SD root directory can now be changed on the fly while the card is connected (automatic reconnect to the new directory; a non-existent or empty directory is initialized just like at startup)

	- BUGFIX: MZ-700/1500 keyboard - removed TAB and fixed the Virtual Keyboard layout (key colors kept the original MZ-800 ones)

	- BUGFIX: CPU Registers window - the buttons in front of VEC[A/B] and ISR[A/B] had no working right-click menu

	- BUGFIX: Breakpoints - an empty breakpoint list could not be saved

	- BUGFIX: CPU z80-mz800 showed an already incremented regPC during an unfinished HALT

	- BUGFIX: dbgapi: when the CPU is in HALT and regPC is changed manually, it must wake up from HALT (the previous wrong behavior kept waiting for an INT)

	- BUGFIX: keyboard - the ALPHA key now also responds to the second PC backslash key (ISO / Oem102 next to the left Shift; CZ layout has two backslash keys)

	- BUGFIX: Version Check Setup Window - fixed a z-order issue with the Check period combo

	- there were also a few minor corrections in localization


2026-05-21 - Released version 2.0.2 - preview

	- Added main debugger window + IASM + 4 auxiliary disassembled windows, CPU Registers and Memory Map windows, Symbols, Bookmarks, Watch

	- Created a system of "smart" breakpoints + variables and scripting

	- CDL + Memory Heatmap window + CDL export/import

	- Trace suite for offline analytics: CPU track, IORQ Log, Interrupt Log, HW log

	- Stack Monitor, Stack regions analytics, Stack History

	- I/O Ports monitor + tracking history

	- Event log, visualization + analytics and tools

	- Callstack: experimental heuristics

	- CPU profiler

	- Completely rewritten FDC emulation + HW state monitor

	- Completely rewritten QD image emulation + HW state monitor

	- z80ex replaced with our own, faster and more accurate z80-mz800 https://github.com/michalhucik/z80-mz800

	- GDG MZ-800: added some previously undocumented features, see the GDG Documented project https://www.ordoz.com/gdg-documented/
	The only intentionally unimplemented feature remains the Superimpose bit, which would not bring anything fundamental from an emulation standpoint but would unnecessarily complicate the counting of screens by elapsed pxCLK.

	- Unicard: full integration of the complete FS API for firmware uc1 rev.60 and uc3 v0.26 (both versions still use the original QD bootstrap)

	- The project is now officially split into three MZ architectures: MZ-800 / MZ-1500 / MZ-700 (PAL, NTSC).
	The primary architecture remains MZ-800.

	- DSK tools removed: replaced by the standalone MZdisk project https://github.com/michalhucik/mzdisk

	- bugfix: emulator window did not come to the foreground when launched from a console (Windows)

	- bugfix: removed VRAM latch on MZ-1500 (it seems to be implemented only on MZ-800 - unverified)

	- bugfix: loading of the preselected ROM from the configuration file (.ini)
	  the ROM setting was ignored at startup and the default ROM was always loaded

	- comprehensive refactoring of all internal libraries

	- completely rewritten thread communication via dbgapi, EE implementation + many other minor improvements, bugfixes and new bugs

	- upgrade Dear ImGui 1.91.9 WIP -> 1.92.6-docking

	- by default the program is always set to English localization on launch, as this version is usually the best tested

	- project is moved to Github https://github.com/michalhucik/mz800emu - Source code is no longer updated on SourceForge


2026-03-12 - Released version 2.0.1 - preview

	- A young and capable AI assistant has been recruited into the development team :)

	- bugfix: fixed application freeze on exit in Linux

	- Added missing modules from the old version of the emulator:

		- FDC Tools - new FD image
		- Ramdisk: PEZIK Settings
		- Memext: Memory Content
		- Memext: Memory Map Settings
		- ROM: User Settings
		- Keyboard: Autotype
		- JOY: completely new SDL3 interface + UI

	- MZ-800 now experimentally supports adding PSG1 for stereo audio. Port 0xF2 handles
	  both channels simultaneously (mono). Port 0xF3 PSG0 (left), 0xF9 PSG1 (right).

	- development: automated testing section added for selected modules


	i18n Implementation - Localization
	===================================

	- The emulator now has official localization into several selected languages

	- The language is selected by default according to environment variables.
	  In Menu Interface → Language, the setting can be changed.

	- Localization was done automatically and for most languages I am not able to verify correctness


	--------------------------------------------------------------------------
	PLEASE: if you find any errors in the localization (text, formatting, etc.),
	        let me know — we will fix it.
	--------------------------------------------------------------------------


	The emulator is now officially multiplatform for: MZ-800/MZ-1500, with MZ-700 planned.
	=======================================================================================

	- Each platform is generated from the shared source code as a standalone EXE.
	  It is recommended to run each platform in its own working directory.

	- It should be noted that for MZ-1500 I have only done a few basic measurements on real HW,
	  and for most features I rely on verified knowledge gained from MZ-800, so inaccuracies
	  in the emulation may appear.


	Implemented a complete snapshot system for saving and loading the emulator state.
	=================================================================================

	  A snapshot is a ZIP archive with the .mzs extension containing:
	  - manifest.xml with metadata (architecture, version, description, SHA-256 checksum)
	  - XML files with the complete state of all HW components
	  - binary dumps of memories (RAM, VRAM, framebuffer, optionally MEMEXT/ramdisk)
	  - PNG screenshot of the current screen state

	  Saving and loading snapshots:
	  - Menu Snapshot → Save Snapshot Alt + F6 / Load Snapshot Alt + F7 (file dialogs)
	  - The Load dialog includes a preview: screenshot, architecture, date, description, size
	  - The emulator is automatically paused during the operation

	  Quick Save Alt + F8 / Quick Load Alt + F9:
	  - Fast save/load without dialog (from the Snapshot menu)
	  - Three modes: Basic (single file), Incremental (numbered files),
	    Rotational (like Incremental with automatic deletion of the oldest)
	  - Configurable in Snapshot → Snapshot Setup

	  Snapshot Setup dialog:
	  - Default directory for snapshots
	  - ZIP archive compression level
	  - Include ramdisks and memory extension
	  - Quick Save mode and maximum number of slots

	  Saved HW components (19 handlers):
	  - CPU Z80 (all registers including alternate sets)
	  - Memory: RAM, VRAM, EXVRAM/PCG, memory state (mapping)
	  - Video: GDG registers, timing, sync signals, framebuffer
	  - VRAM Control: WF/RF registers (MZ-800), latch (MZ-1500)
	  - Sound: PSG registers (mono and stereo), CTC8253 counters, audio log
	  - I/O: PIO8255, PIO Z80
	  - Devices: CMT (file position), FDC (state + DSK reference),
	    Quick Disk, Ramdisk, IDE8, MEMEXT, Unicard
	  - Control structures: mzarch state, HW configuration

	  Safety and integrity:
	  - SHA-256 checksum protects against archive corruption
	  - Atomic write (temp file + rename) protects existing snapshots
	  - Architecture compatibility check on load (MZ-700/800/1500)
	  - After a failed load, the emulator stays paused (protection against inconsistent state)

	  Status: alpha — basic functionality implemented, tested only in automatic mode.


2025-04-21 - Released version 2.0.0 - preview

	- The emulator core has been reworked, including minor bug fixes. Significant use of
	  multithreading introduced. Noticeable overall performance improvement.

	- Initial integration of localization macros has begun. Future versions of the program may 
	  feature localized GUI. 
	  Any help with translating the GUI text into other languages is welcome.

	- Added support for variable speed control (until now the emulator only ran in NORMAL and MAX speed modes).
	  Speed can now be freely increased or decreased by 1%, 10%, or 100%. Once variable 
	  speed is set, you can freely switch between all three speed modes.

	- Migrated to SDL3. Video and audio interfaces have been completely reworked.
	  MISSING: low-level joystick support

	- Switched from libsoup to libcurl (version_check module) — improves portability on Windows 
	  when distributing as a standalone application with libraries in its own directory 
	  (rather than relying on MSYS2).

	- Migration from GTK3 to ImGui has started.
	  MISSING:
				- FDC Tools
				- Pežik Settings
				- MemExt - Memory Content and Memory Map Settings
				- ROM User Settings
				- Interface - Keyboard Autotype
				- Interface - JOY Settings
				- Debugger, Memory Browser, Breakpoints

	- Preview version released, to be gradually completed with missing modules and 
	  language localizations.

2023-04-28 - Released version 1.0.8

	- Windows - bugfix: upgraded to GTK-3 runtime gtk-3.24.38
	  Among other things, this fixed an error in the display of the topmenu on systems with multiple monitors.
	  The module for checking the latest version of the program now uses SSL.
	  The program can now be compiled in Windows in both 32-bit and 64-bit versions.

	- bugfix: WD279x - command type III read track addr - fixed empty FD

	- bugfix: 4 years ago I accidentally disabled the CMT extension TAP,  no one noticed :(

	- added new topmenu section the Audio, now is posible to setup audio volume for all channels or individualy per channel

	- the default main window rendering scale is now set to Bigger - 150%
	  In the Display section you can now select the startup window size from one of three predefined sizes - 100%, 150% and 300%.

	- virtual CMT now supports motor control via i8255

	  Engine state may by controlled manualy by the "Pause" toggle button in the CMT control pannel.

	  Play / Record + Pause => motor OFF
	  Play / Record         => motor ON

	  If the engine is running and the i8255 sends a signal to stop it, the "Pause" switch is activated.

	  CMT saving: after opening a new file is now switched default to mode "Record + Pause".

	- into CMT menu added option for enable/disable MZF filesize check and fix (default is enabled)


2022-01-27 - Released version 1.0.7

	- added menu option HW compatibility -> MZ-700 mode - fixed 0xE008

	This is a partial HW bugfix for reading regDMD status at address 0xE008 in MZ-700 mode.
	The MZ-800 computer has permanent value '0' on bits 1 to 6. This causes a false identification 
	of the JOY stick on the original MZ-700 games. The option sets these bits to value '1'.


2021-10-27 - Released version 1.0.6


	- bugfix in HW scroll
	- added the ability to assemble project via cmake (thanks Ysblokje) - see cmake_README.md
	- small bugfixes
	- in top menu added experimental option HW compatibility -> MZ-700 (PAL) VRAM timing
	  This option allows slow VRAM read/write acces like real MZ-700 hardware.


2020-08-09 - Released version 1.0.5


	- new function: Auto Type Keyboard
	- BUGFIX: vkbd keybord mapping
	- BUGFIX: added 20ms sleep to the main cycle, when emulator is paused
	- Debugger settings: added options for auto forced full screen refresh
	  (without dependency on beam position)
	  May by called manually by CTRL+R from debugger window.

	- several improvements and bugfixes in the memory browser
	- CMTHACK: added option "Fixing FNAME terminator"
	- bugfix: in "fast" version of CTC0 on MODE2 (Madonna2 demo did not work)
	- bugfix: changed initialization of virtual CMT output sig. (ESC key in Turbo Copy now works)
	- display: added "Lock window aspect ratio" (default off, working only in Windows)
	- display: Alt+W, Alt + H - fix window aspect ratio by width, or by height


2018-09-16 - Released version 1.0.4


	In this released emulator version is integrated a huge amount of bugfixes,
	improvements, features and new bugs, which I gradually collected over the last 
	two years.
	Thanks to some improvements was the emulation be significantly accelerated and  
	this achieved performance was instantly used for the new features, which this 
	slows down a bit :)
	Some peripherals have revealed new secrets and all of that has been integrated 
	into emulation.

	Just in the short:
	
	- virtual CMT now supports a multiple file formats (MZF, MZT, TAP, WAV) and allows 
	  the save into WAV

	- added a virtual keyboard and creation tools for DSK and QD images

	- added a simple simulation of the "Unicard" and IDE8 (supported by NIPOPS cp/m)

	- implemented both types of MemExt (supported by MZIX - Unix)

	- many many improvements in the debugger..., added new memory browser / editor, 
	  memory dissassembler, etc...

	- better synchronisation in the Linux, some changes about ROMs, and lots of other 
	  little things in the different places

	- added online check for new versions
	  Emulator sometimes at the startup checks the my web site and if they discover 
	  a new version of the emulator, then show the information window - this feature 
	  can be turned off and version checks can be performed manually.

	If you want to ask about some emulator features or peripherals of the MZ-800, 
	do not hesitate and ask me on the SourceForge, or by email.


2016-03-01

	Released version 1.0.3

	- bugfix: in the Pezik ramdisk
	- added breakpoints and memory dump viewer
	- added Quick Disk emulation

	- added an additional Sharp ROM's, possible to switch between:

		Standard MZ-800 ROM
		JSS v1.08C - for MR-1R18 compatibile ramdisk
		JSS v1.06A - for the Pezik (0x0e8 - 0x0ef) ramdisk
		WILLY English
		WILLY German
		WILLY Japanese

	- many litle improvements and bugfixes


2015-09-23

	Released version 1.0.2

	- trivial bugfix: locale encoded errors and warning messages in console
        - trivial bugxix: step mode in debugger sometime stepped over multiple lines
	- a little improved emulation speed
        - inline assembler bugfix: fixed instructions with relative
        - inline assembler bug fixed of generating instruction with relative
        - value (JR %, DJNZ %, etc.)



2015-09-20
	
	Released version 1.0.1


	Bugfix:
		- trivial bugfix in memory allocation
		- added loging into error.log
 		- localized file names and paths are now fully supported

        This is tested only in my Czech localization of Windows 7.

        Does it work in other codepages? For example in the Japanese localization of Windows?



2015-09-17

	Released version 1.0


