Changelog

7.1 (2019-02-02)

  • Improved the performance and accuracy of the control file generation algorithm used by sna2ctl.py when no code map is provided
  • Added support to sna2ctl.py for reading configuration from skoolkit.ini
  • Added the --ini and --show-config options to sna2ctl.py (for setting the value of a configuration parameter and for showing all configuration parameter values)
  • Added support to sna2skool.py for reading multiple default control files, and for using the --ctl option multiple times
  • The #UDGARRAY macro now has the ability to specify attribute addresses (as an alternative to specifying attribute values)
  • Added support to control files and skool file templates for specifying that numeric values in instruction operands and DEFB, DEFM, DEFS and DEFW statements be rendered as negative numbers
  • The @isub, @ssub, @rsub, @ofix, @bfix and @rfix directives can insert an instruction after the current one (without first specifying a replacement for it) by using the + marker
  • tapinfo.py now shows pulse lengths in TZX block type 0x13 (pulse sequence) and full info for TZX block type 0x14 (pure data)
  • sna2skool.py handles unprintable characters in a DEFM statement by rendering them as byte values
  • sna2skool.py automatically determines the byte value of an ‘S’ directive and ignores any supplied value
  • Added the CommentWidthMin configuration parameter for sna2skool.py (to specify the minimum width of the instruction comment field in a skool file)
  • Added the InstructionWidth configuration parameter for sna2skool.py (to specify the minimum width of the instruction field in a skool file)
  • Added the Semicolons configuration parameter for sna2skool.py (to specify the block types in which comment semicolons are written for instructions that have no comment)
  • Fixed how sna2skool.py interprets the base prefix n in a ‘B’ directive
  • Fixed how skool2ctl.py and skool2sft.py handle non-entry blocks when a start address or end address is supplied

7.0 (2018-10-13)

  • The @isub, @ssub, @rsub, @ofix, @bfix and @rfix directives can specify the replacement comment over multiple lines, replace the label, and insert, overwrite and remove instructions
  • Non-entry blocks in a skool file are reproduced by skool2asm.py and preserved by skool2ctl.py
  • Moved the ability to generate a control file from sna2skool.py to the new sna2ctl.py command
  • skool2bin.py now processes @if directives (in case they contain @isub, @ssub, @ofix or @bfix directives)
  • The @label directive can now add an entry point marker to the next instruction, or remove one if present
  • Added the --force option to skool2asm.py (to force conversion of the entire skool file, ignoring any @start and @end directives)
  • Added support for appending content to an existing ref file section by adding a ‘+’ suffix to the section name (e.g. [Game+])
  • Added support for preserving ‘inverted’ characters (with bit 7 set) in and restoring them from a control file or skool file template
  • Added support to the #LIST, #TABLE and #UDGTABLE macros for the nowrap and wrapalign flags (which control how sna2skool.py renders each list item or table row when reading from a control file)
  • skool2html.py now writes a single disassembly from the the skool file given as the first positional argument; any other positional arguments are interpreted as extra ref files
  • Every entry title on a memory map page is now hyperlinked to the disassembly page for the corresponding entry
  • Fixed the bug in skool2ctl.py that makes it incorrectly compute the length of an M directive covering a sub-block containing two or more instructions
  • Fixed how blocks of zeroes are detected and how an --end address is handled when generating a control file

6.4 (2018-03-31)

  • Added the @if directive (for conditionally processing other ASM directives)
  • Added the #RAW macro (which prevents any macros or macro-like tokens in its sole string argument from being expanded)
  • Added the --var option to skool2asm.py and skool2html.py (for defining a variable that can be used by the @if directive and the #IF and #MAP macros)
  • The asm replacement field available to the #IF and #MAP macros now indicates the exact ASM mode: 1 (@isub mode), 2 (@ssub mode), 3 (@rsub mode), or 0 (none)
  • The #IF and #MAP macros can now use the fix replacement field, which indicates the fix mode: 1 (@ofix mode), 2 (@bfix mode), 3 (@rfix mode), or 0 (none)
  • The @isub, @ssub, @rsub, @ofix, @bfix and @rfix directives can replace comments as well as instructions
  • Added the entry identifier to the footer template when it is part of a disassembly page
  • Added path to the SkoolKit dictionary in HTML templates
  • In ASM mode, a #LIST or #TABLE macro can now be used in an instruction-level comment and as a parameter of another macro
  • In ASM mode, the #LIST macro produces unindented items when the bullet character is an empty string, and the bullet character can be specified by the bullet parameter
  • Commas that appear between parentheses are retained when a sequence of string parameters is split, making it easier to nest macros (e.g. #FOR0,9(n,#IF(n%2)(Y,N)))

6.3 (2018-02-19)

  • Added the @defb, @defs and @defw directives (for inserting byte values and word values into the memory snapshot)
  • Added the @remote directive (for creating a remote entry)
  • Added the --poke option to bin2sna.py (for performing POKE operations on the snapshot)
  • Added the --user-agent option to tap2sna.py (for setting the User-Agent header used in an HTTP request)
  • Added support to the [Resources] section for specifying files using wildcard characters (*, ? and [])
  • Added the ImagePath parameter to the [Paths] section (for specifying the base directory in which to place images) and the ability to define one image path ID in terms of another
  • Added support for image path ID replacement fields in the fname parameter of the image macros (e.g. #SCR2({UDGImagePath}/scr))
  • The @assemble directive can specify what to assemble in HTML mode and ASM mode separately
  • By default in ASM mode, DEFB/DEFM/DEFS/DEFW statements are no longer converted into byte values for the purpose of populating the memory snapshot
  • The address parameter of the @org directive is now optional and defaults to the address of the next instruction
  • The LABEL parameter of the @label directive may be left blank to prevent the next instruction from having a label automatically generated
  • Added the location identifier to the asm_instruction template
  • Added support for parsing block-level comments that are not left-padded by a space
  • Fixed how an opening brace at the end of a line or a closing brace at the beginning of a line is handled in an instruction-level comment
  • Fixed the bug in skool2ctl.py that prevents an @ignoreua directive on a block end comment from being preserved correctly
  • Fixed sna2skool.py so that it can generate a control file for a snapshot whose final byte (at 65535) is 24 or 237

6.2 (2018-01-01)

  • Added the --reg option to bin2sna.py (for setting the value of a register)
  • Added the --state option to bin2sna.py (for setting the value of a hardware state attribute)
  • sna2img.py can now read a binary (raw memory) file when the --binary option is used, and with a specific origin address when the --org option is used
  • Added the Includes parameter to the [MemoryMap:*] section (for specifying addresses of entries to include on the memory map page in addition to those specified by the EntryTypes parameter)
  • The SkoolKit command options now accept a hexadecimal integer prefixed by ‘0x’ wherever an address, byte, length, step, offset or range limit value is expected
  • Added the hex parameter to the #N macro (for rendering a value in hexadecimal format unless the --decimal option is used with skool2asm.py or skool2html.py)
  • Added the --show-config option to skool2asm.py, skool2html.py and sna2skool.py (for showing configuration parameter values)
  • Added support for substituting labels in instruction operands and DEFB/DEFM/DEFW statements that contain multiple addresses (e.g. LD BC,30000+40000%256), or where the address is the second or later term in an expression (e.g. DEFW 1+30000)
  • The @keep directive can now specify the values to keep, and is applied to instructions that have been replaced by an @isub, @ssub or @rsub directive
  • The @nolabel directive is now processed in HTML mode

6.1 (2017-09-03)

  • Added support for converting the base of every numerical term in an instruction operand or DEFB/DEFM/DEFS/DEFW statement that contains two or more (e.g. LD A,32768/256 to LD A,$8000/$100)
  • Added support for assembling instructions and DEFB/DEFM/DEFS/DEFW statements whose operands contain arithmetic expressions (e.g. DEFM "H","i"+$80)
  • Added support to skool2asm.py, skool2html.py and sna2skool.py for reading configuration from a file named skoolkit.ini, if present
  • Added the --ini option to skool2asm.py, skool2html.py and sna2skool.py (for setting the value of a configuration parameter)
  • sna2img.py can now read skool files, in either the default mode, or @bfix mode by using the --bfix option
  • Added the --move option to sna2img.py (for copying the contents of a block of RAM to another location)
  • Improved how skool2asm.py formats a comment that covers two or more instructions: now the comment is aligned to the widest instruction, and even blank lines are prefixed by a semicolon
  • Improved how the #R macro renders the address of an unavailable instruction (an instruction outside the range of the current disassembly, or in another disassembly) in ASM mode
  • Removed the indent from EQU directives in ASM output (for compatibility with SjASMPlus)
  • Fixed the bug that prevents the expansion of a macro whose numeric parameters contain a ‘<’, ‘>’ or ‘&’ character
  • Fixed how labels are substituted for addresses in DEFB/DEFM/DEFW statements
  • Fixed skool2asm.py so that it processes @ssub directives when --fixes 3 is specified
  • Fixed the styling of entry descriptions for ‘t’ blocks on a memory map page

6.0 (2017-05-06)

  • Dropped support for Python 2.7 and 3.3
  • Added the --expand option to sna2img.py (for expanding a #FONT, #SCR, #UDG or #UDGARRAY macro)
  • Added the --basic option to tapinfo.py (for listing the BASIC program in a tape block)
  • Added the --find-tile option to snapinfo.py (for searching for the graphic data of a tile currently on screen)
  • Added the --word option to snapinfo.py (for showing the words at a range of addresses)
  • Added support to the --find option of snapinfo.py for specifying a range of distances between byte values (e.g. --find 1,2,3-1-10)
  • The --peek option of snapinfo.py now shows UDGs and BASIC tokens
  • Added support for replacement fields (such as {base} and {case}) in the expr parameter of the #IF macro and the key parameter of the #MAP macro
  • Added support for parsing a box page entry section as a sequence of multi-line list items prefixed by ‘-‘ (with SectionType=BulletPoints)
  • The following ref file components may now contain skool macros: the anchor and title of a box page entry section name; every parameter in the [Game], [MemoryMap:*], [Page:*], [PageHeaders], [Paths] and [Titles] sections
  • The @replace directive now acts on ref file section names as well as their contents
  • The #EVAL macro now renders hexadecimal values in lower case when the --lower option of skool2asm.py or skool2html.py is used
  • Added the #VERSION macro (which expands to the version of SkoolKit)
  • Fixed how an image is cropped when the crop rectangle is very narrow
  • Fixed how a masked image with flashing cells is built
  • Fixed how sna2skool.py handles a snapshot that contains a dangling IX/IY prefix (DD/FD) when generating a control file
  • Fixed the bug that prevents the expansion of skool macros in a page’s link text on the disassembly home page