# SkoolKit 8.x changelog

## 8.10 (2023-06-17)

- Added the `finish-tape` simulated LOAD configuration parameter to tap2sna.py (to specify whether to finish the tape before stopping the simulation at the given start address)

- Added the `contended-in` simulated LOAD configuration parameter to tap2sna.py (to specify whether to interpret ‘IN A,($FE)’ instructions in the address range $4000-$7FFF as reading the tape)

- Added the `accelerate-dec-a` simulated LOAD configuration parameter to tap2sna.py (to specify whether to accelerate ‘DEC A: JR NZ,$-1’ or ‘DEC A: JP NZ,$-1’ delay loops)

- Added the `alkatraz-05`, `alkatraz-09`, `alkatraz-0a`, `alkatraz-0b`, `alternative`, `alternative2`, `boguslaw-juza`, `bulldog`, `crl`, `crl2`, `crl3`, `crl4`, `cybexlab`, `d-and-h`, `delphine`, `design-design`, `gargoyle2`, `gremlin2`, `microprose`, `micro-style`, `mirrorsoft`, `palas`, `raxoft`, `realtime`, `silverbird`, `software-projects`, `sparklers`, `suzy-soft`, `suzy-soft2`, `tiny`, `us-gold` and `weird-science` tape-sampling loop accelerators for use with tap2sna.py

- Added the special `auto` and `list` tape-sampling loop accelerator names for use with the `accelerator` simulated LOAD configuration parameter of tap2sna.py, and the ability to specify multiple accelerators

- Added support to bin2sna.py, snapmod.py and tap2sna.py for setting the `issue2` hardware state attribute (to enable or disable issue 2 emulation)

- Added support to tap2sna.py for loading tapes that end with a pulse sequence instead of data

- Added support to tap2sna.py for reading configuration from skoolkit.ini

- Added the `--ini` and `--show-config` options to tap2sna.py (for setting the value of a configuration parameter and for showing all configuration parameter values)

- Added support to tap2sna.py for configuring the format of a simulated LOAD trace log file via the `TraceLine` and `TraceOperand` configuration parameters

- Added the `--tape-analysis` option to tap2sna.py (for showing an analysis of the tape’s tones, pulse sequences and data blocks)

- snapinfo.py now shows the value of the T-states counter and the issue 2 emulation flag in SZX and Z80 snapshots

- Fixed the bug that prevents snapinfo.py from displaying the value of a floating-point number in a BASIC line when the accompanying numeric string is a single decimal point (`.`)

- Fixed how the value of the R register is set in a Z80 snapshot when bit 7 is reset

- Fixed how tape-sampling loop accelerators affect the carry flag after at least one pass through the loop

## 8.9 (2023-02-19)

- Added support to tap2sna.py for TZX loops (block types 0x24 and 0x25), pauses (block types 0x10, 0x11, 0x14 and 0x20), and unused bits in data blocks (block types 0x11 and 0x14)

- tap2sna.py now accelerates the simulation of tape-sampling loops in loading routines, and also simulates the execution of interrupt routines when interrupts are enabled

- Added the `--sim-load-config` option to tap2sna.py (to set the value of a `--sim-load` configuration parameter: `accelerator`, `fast-load`, `first-edge`, `pause`, `timeout`, `trace`)

- Added the `--tape-name` option to tap2sna.py (to specify the name of a TAP/TZX file in a zip archive, in case there is more than one)

- Added the `--tape-start` and `--tape-stop` options to tap2sna.py (to start or stop the tape at a specific block number)

- Added the `--tape-sum` option to tap2sna.py (to specify the MD5 checksum of the TAP/TZX file)

- Added support to tap2sna.py for quoted arguments in an arguments file

- Added the `--interrupts` option to trace.py (to enable the execution of interrupt routines)

- trace.py now reads and writes the T-states counter in Z80 snapshots and reads the T-states counter in SZX snapshots

- Added support to bin2sna.py, snapmod.py and tap2sna.py for setting the `tstates` hardware attribute (i.e. the T-states counter in Z80 snapshots)

- tapinfo.py now shows full info for TZX block types 0x10 (standard speed data) and 0x11 (turbo speed data)

- Fixed how the Z80 instruction set simulator updates the A and R registers in the ‘LD A,R’ and ‘LD R,A’ instructions

- Fixed how the Z80 instruction set simulator handles a CALL instruction that overwrites its own address operand

- Fixed how a Z80 snapshot memory block that ends with a single 0xED byte is decompressed

- Fixed how the `--sim-load` option of tap2sna.py transitions from a tape block that ends with data to the next block when there is no pause between them

- Fixed the bug that prevents the `--find` option of snapinfo.py from finding byte sequences below address 16384

- Fixed the bug that prevents the `--find-text` option of snapinfo.py from finding text strings below address 16384

## 8.8 (2022-11-19)

- Added the trace.py command (for tracing the execution of machine code in a 48K memory snapshot)

- The `--sim-load` option of tap2sna.py now performs any `call`, `move`, `poke` and `sysvars` operations specified by the `--ram` option

- Improved the performance of the `--sim-load` option of tap2sna.py

- Improved the performance of the #SIM macro

- Improved the performance of the #AUDIO and #TSTATES macros when they execute instructions in a simulator

- Removed the `MaxAmplitude` parameter from the [AudioWriter] section

## 8.7 (2022-10-08)

- Dropped support for Python 3.6

- Added the #SIM macro (for simulating the execution of machine code in the internal memory snapshot constructed from the contents of the skool file)

- Added the #AUDIO macro (for creating HTML5 `<audio>` elements, and optionally creating audio files in WAV format)

- Added the #TSTATES macro (which expands to the time taken, in T-states, to execute one or more instructions)

- Added the `--sim-load` option to tap2sna.py (to simulate a 48K ZX Spectrum running LOAD “”)

- Added the @rom directive (for inserting a copy of the 48K ZX Spectrum ROM into the internal memory snapshot constructed from the contents of the skool file)

- Added the `AudioPath` parameter to the [Paths] section (for specifying where the #AUDIO macro should look for or create audio files by default)

- Added the audio template (for formatting the `<audio>` element produced by the #AUDIO macro)

- Added the [AudioWriter] section (for configuring audio files created by the #AUDIO macro)

- Added the `--rebuild-audio` option to and the `RebuildAudio` configuration parameter for skool2html.py (to overwrite existing audio files)

- Added the `AudioFormats` parameter to the [Game] section (for specifying the alternative audio file formats that the #AUDIO macro should look for before creating a WAV file)

- Added the `--defb` option to sna2skool.py (to disassemble as DEFB statements instead of as code)

- Added the `Timings` configuration parameter for sna2skool.py (for showing instruction timings in the comment fields)

- Added the `flags` parameter to the #FOR macro (for affixing commas to and replacing variable names in each separator)

- Added support to the M directive for applying its comment to each instruction in its range

- When tap2sna.py ignores a headerless block because no `--ram load` options have been specified, it now prints a warning

- Amended the register ASM template so that it can handle empty register names

- Fixed the bug where the `stop` value of the #FOR macro is used even when it does not differ from `start` by a multiple of `step`

- Fixed the bug where an M directive with an explicit length overrides the sublengths of an earlier sub-block directive at the same address

## 8.6 (2021-11-06)

- Added the #STR macro (for retrieving the text string at a given address in the memory snapshot)

- Added the #WHILE macro (for repeatedly expanding macros until a conditional expression becomes false)

- Added the #UDGS macro (as an alternative to the #UDGARRAY macro for creating an image of a rectangular array of UDGs)

- Added support to the #DEF macro for using replacement fields to represent the defined macro’s argument values, and for stripping leading and trailing whitespace from the defined macro’s output

- Added support to the #LET macro for defining dictionary variables

- Added support to the `--ram` option of tap2sna.py for the `call` operation (for calling a Python function to perform arbitrary manipulation of the memory snapshot)

- Added the `flags` parameter to the #CHR macro (to produce a character in the UTF-8 encoding in HTML mode, and to map character codes 94, 96 and 127 to ‘↑’, ‘£’ and ‘©’)

- Added the `Expand` parameter to the [Config] section (for specifying skool macros to be expanded during HTML writer initialisation)

- Added support to the #INCLUDE macro for combining the contents of multiple ref file sections

- Added the `tindex` and `alpha` parameters to the #COPY macro (for specifying the transparent colour and its alpha value in the new frame)

- Fixed the bug where macros inside a #LIST or #TABLE macro are expanded twice in HTML mode (which makes #RAW ineffective)

## 8.5 (2021-07-03)

- Dropped support for Python 3.5

- Added the #OVER macro (for superimposing one frame on another)

- Added the #COPY macro (for copying all or part of an existing frame into a new frame)

- Added the #DEF macro (as a more powerful alternative to the `#DEFINE` macro, which is now deprecated)

- Added the `Wrap` configuration parameter for sna2skool.py (for controlling whether to disassemble an instruction that wraps around the 64K boundary)

- Added the `RefFormat` configuration parameter for sna2skool.py (for specifying the format of referrers in a comment that lists them for a routine or entry point)

- Added the `EntryLabel` and `EntryPointLabel` configuration parameters for skool2asm.py and skool2html.py (for specifying the format of the default labels for routines and data blocks and their entry points)

- Added the `Address` configuration parameter for skool2asm.py (for specifying the format of the default link text for the #R macro)

- The `SnapshotReferenceOperations` parameter in the [skoolkit] section of skoolkit.ini is now interpreted as a list of regular expression patterns (which enables any type of instruction to be designated by the snapshot reference calculator as one whose address operand identifies an entry point in a routine or data block)

- Added support for identifying entries by address ranges in the [EntryGroups] section and the `Includes` parameter in [MemoryMap:*] sections

- Added the `case` parameter to the #FORMAT macro (for converting formatted text to lower case or upper case)

- Added the `DefaultDisassemblyStartAddress` parameter to the [skoolkit] section of skoolkit.ini (for specifying the address at which to start disassembling a snapshot when no control file is provided)

- Added the `InitModule` parameter to the [Config] section (for specifying a Python module to import before the HTML writer class is imported)

- Fixed the bug where a frame whose pixels are modified by the #PLOT macro may have incorrect colours when converted to an image

- Fixed the bug where an `M` directive in a control file is ignored when it is followed by a sub-block that has sublengths

## 8.4 (2021-03-06)

- Made the image writer component pluggable

- Added support for defining groups of entries (via the [EntryGroups] section of the ref file) whose disassembly pages can be given custom titles and headers

- Added the `Address` parameter to the [Game] section (for specifying the format of address fields on disassembly pages and memory map pages, and of the default link text for the #R macro)

- Added the `Length` parameter to the [Game] section (for specifying the format of the new `length` attribute of entry objects in HTML templates, which is now used instead of `size` in the Length column on memory map pages)

- Added the `Peek` and `Word` configuration parameters for snapinfo.py (for specifying the format of each line of the output produced by the `--peek` and `--word` options)

- Added support for specifying an @expand directive value over multiple lines by prefixing the second and subsequent lines with `+`

- Added support to the `--ram` option of tap2sna.py for the `sysvars` operation (for initialising the system variables in a snapshot)

- Changed the default value of the `DefmSize` configuration parameter for sna2skool.py from 66 to 65; this makes it compliant with the default maximum line width of 79 defined by the `LineWidth` configuration parameter

- Fixed the bug that prevents instruction comments from being repeated in a control file loop

- Fixed the bug that makes sna2skool.py ignore a given start address below 16384 when converting a snapshot

## 8.3 (2020-11-08)

- Added the #PLOT macro (for setting, resetting or flipping a pixel in a frame already created by an image macro)

- Added the `--begin` option to bin2tap.py (for specifying the address at which to begin conversion)

- The `--end` option of bin2tap.py now applies to raw memory files as well as SNA, SZX and Z80 snapshots

- Added the `--data` option to tapinfo.py (for showing the entire contents of header and data blocks)

- Added support to the `--ctl` option of sna2skool.py and snapinfo.py for reading control files from a directory

- Added the `x` and `y` parameters to the frame specification of the `#UDGARRAY*` macro (for specifying the coordinates at which to render a frame of an animated image)

- Added support for replacement fields in the `args` parameter of the #CALL macro, in the integer parameters of the #CHR, #D, #INCLUDE, #N, #POKES, #R and #SPACE macros, and in the integer parameters and cropping specification of the #FONT, #SCR, #UDG and #UDGARRAY macros

- Fixed the bug that causes ‘e+1’ to be interpreted as a floating point number when it appears in a BASIC program

## 8.2 (2020-07-19)

- Added the `--call-graph` option to snapinfo.py (for generating a call graph in DOT format)

- Added the `--ctl` option to snapinfo.py (for specifying a control file to use when generating a call graph)

- Added the `--org` option to snapinfo.py along with the ability to read binary (raw memory) files

- Added support to snapinfo.py for reading configuration from skoolkit.ini

- Added the `--ini` and `--show-config` options to snapinfo.py (for setting the value of a configuration parameter and for showing all configuration parameter values)

- Added the `#DEFINE` macro (for defining new skool macros)

- Added the #LET macro (for defining variables that can be retrieved by other macros via replacement fields)

- Added the #FORMAT macro (for performing a Python-style string formatting operation on an arbitrary piece of text)

- Added the @expand directive (for specifying skool macros to be expanded during ASM writer or HTML writer initialisation)

- Added the `tindex` parameter to the #FONT, #SCR, #UDG and #UDGARRAY macros (for specifying a transparent colour to use other than the default)

- Added the `alpha` parameter to the #FONT, #SCR, #UDG and #UDGARRAY macros (for specifying the alpha value to use for the transparent colour)

- Added the @refs directive (for managing the addresses of routines that jump to or call an entry point)

- Added support for replacement fields in the integer parameters of the #FOR and #PEEK macros

- Added the `--page` option to snapinfo.py (for specifying the page of a 128K snapshot to map to 49152-65535)

## 8.1 (2020-03-29)

- Added the `--rsub` and `--rfix` options to skool2bin.py (for parsing the skool file in @rsub mode and @rfix mode)

- Added the `--data` option to skool2bin.py (for processing @defb, @defs and @defw directives)

- Added the `--verbose` option to skool2bin.py (for showing information on each converted instruction)

- Added the `--no-warnings` option to skool2bin.py (to suppress the warnings that are now shown by default)

- The `address` parameter of the @defb, @defs and @defw directives is now optional

- @defb, @defs and @defw directives in non-entry blocks are now processed when reading a control file

- Register name fields in the registers section of an entry header may now contain whitespace and skool macros

- The #CALL macro now accepts keyword arguments

- tapinfo.py now shows the contents of TZX block types 0x33 (hardware type) and 0x35 (custom info)

- Added the `LabelColumn` parameter to the [MemoryMap:*] section (for specifying whether to display the ‘Label’ column on a memory map page whenever any entries have ASM labels defined)

- Added the `fmt` parameter to the format specifier for the `bytes` attribute of instruction objects in the asm template (for formatting the entire string of byte values)

- Added support to the @set directive for the table-row-separator property

- The @ignoreua and @nowarn directives can now specify the addresses for which to suppress warnings

- Added support to sna2skool.py for ignoring default control files (by specifying `--ctl 0`)

- Fixed how sna2skool.py works with dot directives in a control file when an end address is specified

## 8.0 (2019-11-09)

- Dropped support for Python 3.4

- Made several SkoolKit components pluggable

- Added support for the foreach, if and include directives in HTML templates

- Added the #PC macro (which expands to the address of the closest instruction in the current entry)

- Added support to the @set directive for the table-border-horizontal, table-border-join and table-border-vertical properties

- Added the `DefwSize` configuration parameter for sna2skool.py (for setting the maximum number of words in a DEFW statement)

- Added support for the `**` pattern (which matches any files and zero or more directories and subdirectories) in the [Resources] section

- Added support for replacement fields (such as `{base}` and `{case}`) in the parameter string of the #EVAL macro

- Added the `max_reg_len` identifier to the register template

- Added support for specifying page header prefixes and suffixes in the [PageHeaders] section

- An `entry` dictionary is available when formatting the title and header of a disassembly page (as defined by the `Asm-*` parameters in the [Titles] and [PageHeaders] sections)

- Added the `GameIndex` parameter to the [PageHeaders] section

- Replaced the `AsmSinglePageTemplate` parameter with the `AsmSinglePage` parameter in the [Game] section

- Fixed the bug that prevents the `JavaScript` parameter from working for a box page whose `SectionType` is `ListItems` or `BulletPoints`

- Fixed how a table row separator that crosses a cell with rowspan > 1 is rendered in ASM mode

- Fixed the bug that prevents sna2skool.py from wrapping referrer comments