SkoolKit

Spectrum game disassembly toolkit

Skool files to screenshots

SkoolKit 6.1

SkoolKit 6.1 has been released. As is the custom on occasions like this, copies are available from the download page, the Python Package Index, the Ubuntu PPA, and the Fedora copr repo.

The main new feature in this release is support for changing the default behaviour of skool2asm.py, skool2html.py and sna2kool.py via a configuration file: skoolkit.ini. For example, if you always use the --hex option with skool2asm.py, you could place the configuration parameter Base=16 in the [skool2asm] section in skoolkit.ini, and save some time by never having to type --hex on the skool2asm.py command line again. But what if you want to run skool2asm.py without the implied --hex option once in a while? That’s where the new --ini option comes in: just run skool2asm.py --ini Base=0 and it will override the Base=16 parameter in skoolkit.ini.

One other benefit of having configuration in skoolkit.ini is that you can now define, via various parameters, the format of the comments that sna2skool.py uses to list the callers of entry points in routines when generating a skool file from a control file, and also the format of the titles it uses for untitled blocks. As far as I’m aware, this removes the last bit of hard coded text from the SkoolKit codebase, and leaves it to the discretion of the user to define.

Next up comes support for arithmetic expressions in instruction operands when converting base and assembling. For example, in earlier versions, LD A,32768/256 would be (partially) converted to LD A,$8000/256 when the --hex option of skool2asm.py or skool2html.py was used, but now it is fully converted to LD A,$8000/$100. Also in earlier versions, skool2bin.py would fail to assemble LD A,32768/256, but now it handles such instructions just fine.

And finally among the noteworthy new features, sna2img.py can now read skool files. This means that if you’ve mislaid the snapshot that you originally used to generate your skool file, you need not worry: sna2img.py can automatically build a snapshot from your skool file on the fly so that you don’t have to.

For details of all the other changes and bugs fixed in this release, check the changelog. After that, go grab a copy of 6.1, create your ideal skoolkit.ini, and enjoy the brevity of all your skool2asm.py, skool2html.py and sna2kool.py commands from here on out.

All the disassemblies

SD/BTS/CSC/MM/JSW/ROM

With SkoolKit 6.0 came many compatibility-breaking changes that rendered all but one of the current versions of the disassemblies hosted here utterly broken. Not one to let a disgraceful situation like that stand (for too long, anyway), I have stepped in and published updated versions that build successfully with 6.0. And I could just leave it there, possibly breaking the record for the shortest post ever on this site, but there are a few things besides the porting to 6.0 to mention.

First, the hexadecimal versions of the Skool Daze, Back to Skool and Contact Sam Cruise disassemblies have been greatly improved, in the sense that thare are now far fewer jarring instances of decimal numbers floating around in them. For example, animatory states, character numbers and message numbers are all shown in hex rather than decimal, which should make things more comprehensible for the base-16-minded among you. In addition, the Skool Daze disassembly has two new trivia items.

Next, the hexadecimal versions of the Manic Miner and Jet Set Willy disassemblies have also seen a purge of extraneous decimal numbers, albeit on a smaller scale than in the SD/BTS/CSC disassemblies (which were staunchly decimal until now). And the Jet Set Willy disassembly has a new bug entry concerning the in-game tune.

Finally there is the 48K Spectrum ROM disassembly (decimal version here). It didn’t require porting to 6.0, but I have added register tables to all the routines that take input values or produce output values, which I hope will aid in the general understanding of this seminal work of Z80 assembly language programming.

So there we are. These disassemblies are now safely buildable for another major series of SkoolKit releases. See you again when 7.0 is released (or shortly thereafter).

The #BUG-free edition

Alternative #FACTs

SkoolKit 6.0 has been released. And in anticipation of your next question, let me just say that copies are available from the download page, the Python Package Index, the Ubuntu PPA, and the Fedora copr repo.

Before we get into what’s new in this initial release of the 6.x series, a quick reminder of the some of the more prominent features you’ve come to know and love in previous versions that have been ruthlessly removed: the #BUG, #FACT, #POKE, #EREFS and #REFS macros; the [PageContent:*] ref file section; the parse_params() function, and the parse_image_params(), flip_udgs() and rotate_udgs() methods on HtmlWriter. But do not despair: check the migration guide for details on how to restore these features (should you wish to).

Now, what’s new in 6.0? Strangely, there are no new commands or ASM directives, and only one new (and trivial) skool macro (#VERSION). (The 6.x series is still young, so let’s give it time to venture into those areas.) But the sna2img.py command does have a new option: --expand. This allows you to expand an image macro (#FONT, #SCR, #UDG or #UDGARRAY) outside the context of a skool or ref file. Which could be useful if you just want to make sure you’ve got all your macro parameters straight before committing an image macro to said skool or ref file. Or if you just want to create a standalone image from a game snapshot, and don’t want to bother creating a skool or ref file first.

Also sporting a new option is the tapinfo.py command with --basic. Like the option of the same name sported by snapinfo.py since 5.3, it lists the BASIC program in a specified tape block. Yes, at last, SkoolKit provides a convenient way to examine the first thing any reverse engineer worth his salt will want to look at when starting work on a new game: the BASIC loader. Previously you might have been able to convert the tape into a snapshot with tap2sna.py and then used snapinfo.py --basic on it, but you probably (justifiably) thought that was too much work.

Yet another command enjoying a new option in 6.0 is snapinfo.py with --find-tile. This one enables you to search the RAM for the graphic data of a tile currently on screen. By default it will search for a contiguous block of 8 bytes that match the tile at the specified coordinates, but it can also search for graphic bytes separated by a fixed distance (e.g. 2, as is common with 2x2 sprites), or a range of distances (e.g. 1-256) if you’re unsure about how the graphic data is organised.

By now you might be thinking that new options for old commands is the entire story for 6.0, and you’d be mostly right. But if you want to find out about the non-option-related new features, you should check the changelog.

And that’s all the news. You are now encouraged to download a copy, and migrate your existing disassemblies to the new reality that is SkoolKit 6.0. Good luck!