SkoolKit 7.1 has been released. As usual, copies may be obtained from the download page, the Python Package Index, the Ubuntu PPA, or the Fedora copr repo.

Among the changes worthy of note in this release is the improved control file generation algorithm that sna2ctl.py uses when no code map is provided. The algorithm is now much faster, and strongly prefers to mark a chunk of bytes as code first, text second (if it really doesn’t look like code), and data last (if it really looks like neither code nor text). The main idea behind these preferences is that more code and text will be identified, at the expense of misidentifying more data. But since data that has been marked as code or text is easier to spot and fix than code or text that has been marked as data, the cost is worth it.

In other sna2ctl.py news, that command can now read configuration from skoolkit.ini, and has also gained the --ini option (for setting the value of a configuration parameter) and the --show-config option (for showing all configuration parameter values). So if you want sna2ctl.py to always produce hexadecimal control files, you can add the line Hex=2 to the [sna2ctl] section in skoolkit.ini and forget about having to use the --hex option on the command line all the time.

Speaking of control files, sna2skool.py now has the ability to read multiple control files by default (e.g. both game-1.ctl and game-2.ctl when the input snapshot is game.z80), and to use the --ctl option multiple times (for specifying two or more control files manually). This change makes sna2skool.py easier to use if you prefer to split your large control file into smaller, more manageable chunks.

On the image macro front, #UDGARRAY can now specify attribute address ranges, as an alternative to specifying an attribute value separately for each tile. For example, if you are creating an 8x4 graphic whose attribute values are located at addresses 32000-32031, you can now write a macro like this:

#UDGARRAY8;31744-31992-8@32000-32031(box)

Hopefully we can all agree that this is much nicer than having to specify each of those 32 attribute values individually.

And that’s it for the new features that I can be bothered to spend time explaining in any detail. If you want to know more about the other changes in 7.1, such as the ability to render numeric values in instruction operands as negative numbers (e.g. LD A,-1), or how the @*sub and @*fix directives can insert an instruction after the current one without first specifying a replacement, I suggest heading over to the changelog.