v2.0.3 - 07.02.2022 ------------------- Core Changes: Implemented two fairly recently discovered Z80 behaviours that are currently doing the rounds: The HALT instruction repeatedly reads the byte following the HALT instruction, not the HALT itself while in a halted state. This can make a detectable difference when the memory contention is different for the byte after the HALT. Thanks to ZJoyKiller and Tony Brewer for this information. The Z80 now modifies additional flags while executing a block instruction (LDIR, etc.) Thanks to David Banks, ZJoyKiller, Ped7g and Arjun Nair for the information. Thanks to Woody, Peter Helcmanovsky and Patrik Rak for their test programs used to verify these changes. Added DK'Tronics 3 Channel Sound emulation. Added the ability to record animated GIF files. In the GUI there's a new Recordings options page where you can configure the frame rate, optimisations used to keep the GIF sizes to a minimum and whether to include a border. The recording is started using the new Tools->Record Animated GIF menu item. [GIF] appears on the right-hand side of the status bar when a GIF is being recorded. This functionality is also available in the CLI tool which makes it very easy to produce GIFs of tapes loading or RZXs being played at the command line, e.g. incli jetpac.tap --playtape --makegif <- Creates jetpac.gif of the whole tape load incli commando.rzx --playrec --makegif <- Creates commando.gif of the whole recording NB incli uses the same configuration as the Inkspector GUI, so you may configure the required GIF frame rate, etc, in the GUI on the Recordings options page before running incli. Similarly, you probably want to ensure that flash tape loading is disabled, for example, before creating a .gif from a a tape image otherwise it's not going to be very long or interesting! Added ROM and RAM mirroring to the ZX80 and ZX81. This fixes, on the ZX81 at least, Psion's 'Space Raiders and Bomber' behaving as though the movement keys were being held down due to some odd (protection?) code in those games reading memory from $3e80 and acting as though a key was pressed if not getting the expected result from the mirrored ROM access. Added ZX81 Chroma 81 emulation. Added support for writing ZX80 tape images in .o and .80 formats. Added support for writing ZX81 tape images in .p, .81 and .p81 formats. Added support for loading from ZX81 .p81 and .tzx (GDB / type 0x19 block) files, including being able to dump BASIC listings directly from these files. Add 'Cursor Joystick' support to the ZX80 and ZX81. Improvements to the machine state reporting (accessible via the inks.get_machine_state() script function or the GUI's Tools->View Machine State menu item / Alt-A) Made some small optimisations to the configuration read and writer. The ZX Interface 1 system variables are now available when it's present (including being displayed on the System Variables window). Auto-loaded tapes (where LOAD "" is typed in automatically) now play rather than sitting in pause mode when auto start stop tape playback is turned off. Added experimental code to detect and exclude BASIC lines that look as though they contain binary data such as machine code rather than a BASIC program. This new feature is on by default, but can be turned off on the Advanced option page if you find it's excluding regular BASIC lines containing many control codes, etc. The assembler now has a maximum nested include level of 30 files. GUI Changes: Added a 'View->Show Timestamps' item to the Message window which allows the timestamps to be disabled. Breakpoints can now have comments assigned to them, which are displayed when they're hit to help identify them. Thanks to Andy Dansby for the suggestion. On the Tape Browser, you can go straight to recording a new tape by pressing the Record button without first having to press Create New Tape. Improved the Message window's performance when things get busy (e.g. when noisy diagnostic options are enabled) Holding down CTRL while selecting File->Load Last Auto-Save now saves the auto-saved image to %TEMP%\auto-save.ext (where ext is the appropriate extension for the machine being saved) Added a What's New? item on the Help menu to open up the whatsnew.txt file supplied with Inkspector as of this release (previously this information was buried inside Inkspector 2.txt). CLI Changes: The CLI defaults to the same machine last used by the GUI. This makes it less frustrating when switching between the two. It may still be overriden with the --machine option. Added --makegif which records the whole session as an animated .gif. If no filename is given after --makegif, the name of the file loaded is used with a .gif extension. Added --playtape which plays the tape until either it comes to the end of the tape and stops, or it remains in pause mode for 5 (emulated, not real time) seconds. Bug Fixes: The "...Show the Microdrive map too" option on the Interface 1 Options page didn't work! The Tape Browser window wasn't reopening when 'Automatically reopen active tool windows' was enabled. Fixed the log message 'This appears to be a .tzx file with an incorrect extension...' being shown when loading any .tzx file, which was introduced shortly before the 2.0.2 release. The screensaver was using the GUI's 'Additional Archive Folders' configuration settings when it should only have been using its own single archive folder setting. Snippets run by a breakpoint are no longer allowed to change the current machine. This change fixes a crash that could happen by attempting to do that. v2.0.2 - 21.12.2021 ------------------- Core Changes: Changed the Spectrum 128's contention start from cycle 14361 (as most documents specify) to 14363. This fixes the centre column of the display on the Shock megademo being out of sync. Thanks to Rich Chandler for both the report and fix! Reduced the ZX Spectrum's bottom border height from 56 to 48 lines following a report from Rich Chandler. As this is becoming the R.C. release, add Boldfield Joystick Interface emulation for the Jupiter Ace, as per his new SpudACE release :) Added DK'Tronics Speech Synthesizer emulation. BASIC token expansion, as used by Keyboard Assist, is now disabled when entering quotation marks, and re-enabled at the end of them. The backtick can now be used to change the current state of expansion within a quoted string (previously it was always off). PRINT "scr." -> PRINT "scr." PRINT "`scr." -> PRINT "SCREEN$ " In addition, the Spectrum's copyright symbol may now be specified with {C} and its pound sign with {UKP}. And this is how they appear in BASIC dumps, too. The tape generator now invokes the program using PRINT USR instead of RANDOMIZE USR so that if the program returns, the value of register pair BC will be printed out. Tape images whose contents look like .tzx files are now loaded as such, regardless of the actual file extension. Enhanced the logging system to capture entries early on in Inkspector's start-up before a means to display them is available. Upgraded to SQLite 3.37.0, Boost 1.78, Inno Setup 6.2.0 GUI Changes: Added a choice of CAPS and SYM SHIFT key mapping (Options->Keyboard and Joysticks), allowing CAPS SHIFT to be selected with the PC's left shift key and SYM SHIFT with the right shift key. This change also fixes a problem not allowing a '?' to be entered at the BASIC editor as it was previously being consumed by the CTRL-C copy screen shortcut. It now changes to ALT-CTRL-C when the CTRL key mapping is being used. Added an option to restore all tool windows on start-up (Options->Start-up and Shut Down). The RZX Verifier may be launched directly from the Search window with the currently selected file (File->Verify RZX File). The Options->Peripherals screen's Browse file selector now allows multiple snapshots to be selected at once, as requested by Pavero. Added a couple of extra escape points in the executor’s thread loop, which reduces - on average - the time taken for it (and therefore the Inkspector GUI) to close down, by up to a few milliseconds :) When the border size is changed to 'None', the border is no longer rendered internally, as it's not shown anyway! Bug Fixes: Fixed numerous problems with the ROM and RAM drop-down selectors in the debugger. The Lua script functions inks.load(), inks.relative_to_script() and the file iterator dir() weren't handling UTF-8 characters properly. The assembler now guards against runaway macro recursion. The DI/Halt breakpoint now works correctly. Add a missing error string, which was the reason loading example_128k.s from within %ProgramFiles%\Inkland\InkSpector 2\Snapshots\s didn't show the actual error even though the tape generation had failed. v2.0.1 - 28.05.2021 ------------------- Core Changes: Enhancements to the assembler. See the updated example.s for more details and examples: The SAVETAP directive can now save tape images as .tzx and .pzx in addition to .tap. As it's no longer .tap specific, a directive alias called SAVETAPE has been created. A TAPEINFO directive has been added to add information to .tzx and .pzx tape images. Added an IMPORT SYSVARS directive to import system variable names for the target machine (specified with DEVICE) as labels. Imported labels do not appear in any UNREFS report. Added a SETREGISTER directive to initialise a Z80 register to a specific value before snapshots are written out. SAVESYMBOLS, SAVELISTING, SAVEBIN and SAVEHEX now default to using .ext if no filename is specified, where ext is .sym, .lst, .bin and .hex respectively. Added an ALIGN directive. Ignore the block length value reported by a TZX block $2A ("Stop the tape in 48K mode") and always assume it's 0, as other emulators appear to do. This allows the "Amaurote3k+3_zx7rcs.tzx" tape image (and any others there may be with non-zero length values) to load. The tape auto-loader now types LOAD ""CODE (i.e. the addition of CODE) if it appears to be a loader that doesn't use the usual "Program:" file type as the first file, e.g. Pheenix The Interface 1 shadow ROM is now mirrored at $2000, as per: https://worldofspectrum.org/forums/discussion/34702/ When dumping BASIC programs, unprintable characters are now shown as \nnn rather than ? and UDGs are shown as \A, \B, etc. Added a script that queues up multiple RZX recordings and plays them in sequence. It can be found in Snapshots\lua\queue_recordings.lua This was requested by Pavero: https://spectrumcomputing.co.uk/forums/viewtopic.php?p=52625#p52625 Enable saving of .mlt screenshots for +2A and +3 machines and .sna snapshots for Spectrum 128s. Improved the source and symbols file functionality (currently used by the GUI's debugger): Inkspector assumed SjASMPlus .sym files were produced by its LABELSLIST directive, not its --sym command line option, but this understandably confused people when .sym files weren’t loading, so Inkspector now supports files produced by either method (Inkspector automatically detects). The symbols system now automatically imports the current machine's system variables and makes them available in the same way symbols loaded from files are. i.e. the numerous 'Symbol' buttons on Inkspector windows are now always visible to allow selection of them (in addition to any symbol files loaded as before) and system variable names are shown in disassemblies and are highlighted on memory view windows. This feature may be disabled if necessary from the Debugger options page: "Expose the machine's system variables as symbols" Symbols and listing files are now loaded when loading tape images in addition to snapshots. Added support for loading .sym and .lst files from within a .zip file if the snapshot or tape file is itself in a .zip. Other general improvements including faster loading of source and symbol files and better cache handling. Upgraded to Lua 5.4.3, SQLite 3.35.5 Made numerous small improvements to the performance of the core emulation code that together reduce the CLI's unthrottled playback time of my benchmark .rzx file from 15 to 13 seconds. Every little helps! GUI Changes: Added two display render methods selectable on the new Display options page: GDI+ and Direct 2D. Both offer smoothed displays but the Direct 2D is hardware accelerated, so is probably the better option, unless for some reason the Direct 2D option doesn't work on your system (the only reason GDI+ is supported, as it's slow). Added an Inkspector Search window (shortcut Alt+S) that quickly searches through your snapshot archive as configured in the new Options->Archives page, for files that match what is typed into the search bar. Double click a file or press the toolbar load button to load one. Holding down the CTRL key as you do so also closes the search window. File extensions may be filtered by entering "ext:[,extension]" e.g. "manic ext:szx" to find all supported files containing the word "manic" with a file extension of szx, or "manic ext:szx,sna" to find ones with extensions of szx or sna. Added a calculator window (shortcut Alt+C) which uses the debugger's expression evaluator, giving you access to all available symbols. Added View->Block Data to the Tape Browser window to see the first 20 bytes of each block. Added a View->Additional Information to the Tape Browser which displays additional information available for some types of tape block (e.g. TZX Archive Info). "..." is shown at the end of lines when additional information is available. Added File->Load Memory to load a file directly into a machine's memory. File->Save Screenshot now supports saving images as .gif in addition to .png and .bmp. The View System Variables window remembers the last variable selected and auto-selects it on subsequent openings. Added a "Start Up" menu item and button to the Snippet Editor to quickly select the current snippet for running at start up, saving a trip to the Options->Startup and Shutdown page. The following keys are now mapped on all systems where available: , . / ; ' # - = The debugger can now show elapsed T-state counts at the start or end of an instruction. Added an option to the Debugger options page to show a message on the emulator window when a breakpoint is hit. Holding down the CTRL key while selecting any "Recent->" menu item copies the path to the clipboard instead of selecting it. Added ZX80 and ZX81 support to the Tools->View User Variables menu item and inks.expand_user_variables() script function. Changing settings in the Options screen relevant to the currently running machine now prompts the user to reset the machine for the changes to take effect. Made the following audio improvements: Added the ability to individually control the volumes of different audio devices. Reduced the audio latency. Corrected some audio clipping. Improved the performance of the message window by batching updates. Upgraded from wxWidgets 3.0.5 to 3.1.5 which does not suffer from the same issues as 3.1.3 (that the attempted upgrade in Inkspector 2.0.0.28 revealed). Numerous tweaks and changes throughout. CLI Changes: Added --tapelist to list any loaded tape blocks Added --state to display the full machine state --play now shows the time taken to play the recording Bug Fixes: Fixed the cassette player's auto-stop/start not pausing the tape when the EAR port is read by something previously determined not to be a tape loader, such as the ROM's keyboard reader. This fixes horizons.tap failing to load 'logo'screen$ (when flash loading is off) due to the PAUSE 250 immediately before the LOAD command, allowing the tape to continue playing during the PAUSE and resulting in missing the 'logo' header. Fixed the handling of TZX select blocks, which was treating the choice block offsets as absolute values and not relative offsets to the current tape block. The ZX Interface 2 was not being allowed to attach to a Spectrum 128 (only 16/48K) which in turn caused a crash when attempting to load Domin8tr1s. Both issues have been fixed. Spectrum 128s onwards were always displaying RAM page 5 when the disabled bit of port $7FFD was set, rather than using the display bit to decide as usual. This issue was also highlighted by Domin8tr1s! Fixed the debugger's single-step not executing an instruction if an interrupt was due. Thanks to djnzx48 for the report. Fixed a crash that could occur when single-stepping RZX recordings containing retriggered interrupts (e.g. boulderdash.rzx). Fixed several issues with "Symbol" selection buttons and menu items not being visible or enabled correctly. Fixed the flickering on the View System Variables window, caused by the rolling back to the earlier version of wxWidgets in 2.0.0.51. Changing the "Display values in hexadecimal" option on the debugger options page would not take effect on the Z80 Registers window immediately. Fixed a crash when passing the name of a .dsk or .mdr file on the GUI's command line. Fixed an issue with the Snippet code window loading non-ASCII characters incorrectly. Fixed the Machine->Hot Peripheral Patching->Cheetah SpecDrum menu item which did nothing! :) Fixed numerous display issues with filenames containing non-ASCII characters. Fixed the "Recent->" lists on the tool windows (e.g. Tape Browser) not being populated after being closed and re-opened. View User Variables now displays unprintable characters correctly, allowing all of Wudang's variables to be seen! Fixed the screensaver showing the bouncing "No valid scripts available!" message after playing back an .rzx recording that fails to play to completion. The assembler was writing incorrect values for local labels in symbol files (it was actually writing the value of the parent label) v2.0.0.51 - 02.06.2020 ---------------------- Common (GUI and CLI) Changes: Upgraded to Lua 5.4 RC4. GUI Changes: Added a Help->Send An Email menu item that launches your default email app to send an email with the To and Subject lines pre-populated. Bug Fixes: Reverted from wxWidgets 3.1.3 back to 3.0.5 which fixes the following: - The file preview display was being scaled incorrectly on high DPI systems - The debugger's peek disassembly tooltip window was generating unnecessary focus changes - Game controller inputs weren't coming through inks.load_from_archive() was not returning the result code. v2.0.0.50 - 28.05.2020 ---------------------- Common (GUI and CLI) Changes: ZX Spectrum +2A and +3 floating bus behaviour is now emulated. ZX80 and ZX81 tape images (.o, .80, .p and .81 files) are now handled as tape images rather than snapshots. Added BASIC listing dump support to the ZX80 and ZX81 and its tapes. Improved the spacing accuracy of BASIC listings Added more Lua inks.xxx() functions (these will be documented separately and soon!) Added a backtick (`) as a way to toggle token expansion and and off in key assist Added inks.get_recent(itemNum,[itemType]) to retrieve a file name from one of the recent items. 0 is the most recent, 1 the next, and so one. itemtype is one of the following strings: "snapshot" (the default), "tape", "script", "mdrv", "poke", "roll", "disk" or "source". GUI Changes: Added native cursor key support to the Jupiter Ace, ZX80 and ZX81. Added Key Assist support to the Jupiter Ace, ZX80 and ZX81. Add a System Variables window (Tools->View System Variables) that shows system variables and their current values, which are updated automatically once a second. The system variable constants for the current machine are now available everywhere where an expression may be entered. Improved the full-screen view (it previously had small part of the display cropped when viewing with no border) Added a toolbar to the main and message windows. Added a Tools->Stop Script menu item that may be used to stop long-running scripts. Added a View->Raise Windows menu item and toolbar button to raise all open Inkspector windows to the top. Addded a Tools->View User Variables menu item, and exposed it via inks.expand_user_variables(). Currently this works for ZX Spectrums only. Bug Fixes: Fixed an issue displaying negative integers in the ZX81/Spectrum 5-byte number format. Modifying memory at the currently selected address using one of the right-button menu items (increment, decrement, poke, assemble) would not update the value at that address afterwards. Fixed the "Open disk control panel when a disk is accessed" option not working. 2.0.0.28 (Beta 1) - 12.05.2020 ------------------------------ Common (GUI and CLI) Changes: The scripting framework has been re-written, with Lua being upgraded from 5.2 to the current 5.4 release candidate in the process. Inkspector now defines ten "snippets" which are Lua scripts, edited using the GUI's new Snippet Editor, and that may be run the following ways: 1. Directly from within the Snippet Editor (Snippets->Edit Snippets) 2. From the Snippets menu (shortcut keys Alt-1, Alt-2, etc.) 3. By selecting one to be run on startup of Inkspector (Options->Startup) 4. By selecting one to be run on a breakpoint hit within the debugger 5. By using the CLI's --snippet option A few snippets are pre-defined as examples. Improved Currah uSpeech emulation in respect to ROM mirroring and blocking out the standard ROM when its own ROM is paged in. Intonation is now emulated too. Speech subtitling (Currah uSpeech and Fuller Orator) will automatically pause if the same allophone is played 10 times in succession, automatically resuming when a different allophone is played. This is to avoid the message window being flooded with "PA1" as the uSpeech ROM plays it incessantly. Added support for reading and writing .snx snapshots. Added support for reading and writing .mlt screen images. Added support for the Cheetah SpecDrum. InkSpector now has its own built-in macro assembler. It will attempt to assemble files that have either a .s or .asm extension. Two sample files, example.s and example_128k.s are supplied in the Snapshots\s folder that also serve as the assembler's documentation for now. The GUI can optionally load .s and .asm files for the file preview window too, but it is disabled by default. You may enable it on the "General" options page. To assemble using the CLI use the usual load file method: incli --load example.s The assembler also includes a .tap file generator that can automatically create a full .tap image (with optional loading screen) from the assembled output, including loading of 128K RAM pages. Emulation is paused and a message displayed should the Z80 execute 64K's worth of contiguous DD/FD opcode prefixes. The emulator core used by the GUI, CLI and the screensaver now uses UTF-8 exclusively for messages and file paths internally. The only visible change is more consistent Unicode support throughout Inkspector. Many other minor tweaks and improvements. GUI Changes: Added a snippet editor. On the General options page, a snippet may be selected to be run at start-up. The numerous placeholder toolbar button icons have been replaced with proper ones. Added support for physical joysticks. Added a navigation drop-down menu to the Navigate Backward debugger toolbar button. Added a Load Most Recent Tape Image (Shift-F9) and Load Most Recent Source File (Ctrl-F9) menu items. The message window now uses a fixed pitch font to make it more readable. Tape browser window updates (particularly block % updates) are now more efficient. You may only notice this change on tape images containing thousands of small blocks, such as Rescate Atlantida.tzx The tape browser's File->Open menu item has been wired up. Added Tools->View In-Memory BASIC Program to the main window and Tools->View BASIC Program on the Tape Browser window which displays in the message window any BASIC programs present. The Tape Browser window can save out an individual tape block (Tools->Save Individual Tape Block). This currently works only for .tap blocks. Added an 'Advanced' page to Options, containing a 'show additional messages' option. This may be enabled to help diagnose issues with snapshots as it causes additional information about them to be displayed, mainly on the messages window, but also some of it on the file load/save preview window. Also added fine-grained diagnostic options that may produce a lot of information, so a warning is shown when Inkspector is started when one or more of them are enabled. The Key Assist dialog is disabled when an RZX recording is playing. Key Assist now also supports the Prototype ZX Spectrum ROM: http://www.computinghistory.org.uk/det/51620/Sinclair-ZX-Spectrum-Prototype The debugger breakpoint 'Comment' field has been replaced with 'Run Snippet' where you can now select one of the ten snippets to run when a breakpoint is hit. A new 'Never break' option has been added to the 'Break When...' drop-down list to allow the Lua commands to be executed without pausing execution and launching the debugger in the process. Once I've documented the Lua extensions, snippets will make sense :) Upgraded from wxWidgets 3.0.5 to 3.1.3 Unfortunately this upgrade has also introduced a regression which causes the debugger peek disassembly tooltip to steal window focus when it appears, which manifests as the debugger's main window frame changing colour as focus changes. Hopefully this will be fixed in 3.1.4. CLI Changes: Added a --dumpbasic option which will list a BASIC program stored within a snapshot or one or more tape image blocks. Bug Fixes: A couple of tape block types (including PZX's PULS block) always showed 0% progress on the tape browser window. Fixed a problem with drag and dropping a .pok file onto the GUI that could cause an unhandled exeption to be reported. Fixed a crash that could occur when loading an .szx snapshot (including ones embedded within .rzx recordings) that references a tape image containing a drive letter than doesn't exist on the local machine. Thanks to Woody for unwittingly supplying an offending .rzx file! Fixed an issue with loading a snapshot with the debugger open, which could sometimes allow the machine to execute for a very short period before showing the first line of disassembly. Removed a harmless duplicate "Fuller Box present" message on the file preview dialog. Key Assist didn't work correctly when the Currah uSpeech unit was attached. Fixed the occasional allophone being dropped when the uSpeech or Orator were talking and the code wasn't querying the ready status before sending the allophone. This was most prominent at the start of Jungle Fever which proudly announced "Welcome to Jung Fever". The Spectrum's issue2/issue3 configuration setting wasn't being applied. Z80 opcode ed71 is now disassembled correctly as 'out (c),0' instead of 'out (c),f' The disassembler was skipping too many bytes following an undocumented instruction. Port writes to the 128K AY chip were being consumed even when the AY chip wasn't present (i.e. 48K machines) which manifested as flickering in the FPGA48all.tap tester as it eventually writes to port $8004! Thanks to azesmbog for reporting this. Similarly, reading the AY port when it wasn't present was returning $FF instead of reading the floating bus, which prevented 'Lord Bromley's Estate' from working. Fixed an issue with interrupt handling that caused minfo.tap ("INT time") and Woody's nointpfx.tap to fail. The 128K Spectrum was only holding the INT line low for 32 t-states, not 36. Thanks to Woody for diagnosing and reporting this! :) Improvements to accelerated tape loading compatibility. Fixed an issue that could allow AY chip tone counters to runaway, which resulted in some channels not sounding for a while. E.g. loading "Batman - The Movie.rzx" would result in the instruments appearing one by one when it first started to play the music on the menu. Thanks to Woody for the report. Fixed the Z80 snapshot reader wanting to select a Pentagon 128 for any unrecognised machine type, or machine type #3 when in a version 3 image (should be Spectrum 48K). This would result in a Spectrum 128 being selected, as the Pentagon isn't emulated. When the GUI's menu was active the machine was still running. 2.0.0.27 - First preview version - 13th October 2019 ---------------------------------------------------- InkSpector has been re-written from the ground up and is now called Inkspector 2. It is a separate program to Inkspector (1.0) and both may be installed on the same machine without conflicts. The GUI version is now the main focus of development, with another new program 'incli' which is a command line headless version of the emulator that may be used to convert between snapshot formats, disassemble directly from snapshots, display snapshot and tape information, etc.