<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>SkoolKit</title>
    <description>Spectrum game disassembly toolkit</description>
    <link>https://skoolkit.ca/</link>
    <atom:link href="https://skoolkit.ca/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>2026-08-14</pubDate>
    <lastBuildDate>Fri, 14 Aug 2026 08:47:58 -0300</lastBuildDate>
    <generator>Jekyll v4.3.4</generator>
    
      <item>
        <title>Blurring the border lines</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-10.1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;SkoolKit 10.1 has been released. To get a copy, please head over to the
&lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;, the
&lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Back in SkoolKit 9.2, the upstart new command was &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; with its ability
to play RZX files (hence the name). It also had the ability to display a
(borderless) screen, so you could sit back and watch the action as the command
mapped out the executable code in whatever game you were reverse-engineering.
Soon after that release, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; kept bugging me for its own screen-drawing
capability, which I added (still borderlessly) in 9.4. Then, in 10.0, I added a
border area to the screen displayed by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;. It could
only display one colour at any given time, but despite that limitation, it
caught the attention of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt;. That command then started bugging me for
&lt;em&gt;its&lt;/em&gt; own screen-drawing capability, but with support for multiple colours in
the border area - think ‘loading stripes’ - or else. All of which is a
roundabout way of bringing us to the current release, with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tapsna.py&lt;/code&gt; boasting
a new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--screen&lt;/code&gt; option, and all three commands in this story now enjoying a
border that can display multiple colours simultaneously all day, every day, and
twice on Sundays.&lt;/p&gt;

&lt;p&gt;However, though it might be fun to watch the previously headless &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt;
show off the speed of its phantom typist, or slowly draw a loading screen (or
a little more quickly draw a loading screen, if the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ScreenFps&lt;/code&gt; configuration
parameter is set to 0), I can tell you from experience that the appeal soon
wears off. I imagine the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--screen&lt;/code&gt; option will come in most useful for
troubleshooting tricky tapes that refuse to load - no longer will such
troubleshooting have to be done ‘blind’, as it were. That said, the visual
reassurance that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; really is simulating a real tape loading on a
real Spectrum (and not just cheating while you’re not looking) is somewhat
comforting.&lt;/p&gt;

&lt;p&gt;In other screen-related news, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; now has a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--cmio&lt;/code&gt; option, which
simulates memory and I/O contention and the MEMPTR register. How is that
screen-related, you ask? Well, some games employ border effects whose timing
relies on memory and I/O contention:
&lt;a href=&quot;https://spectrumcomputing.co.uk/entry/227/&quot;&gt;Aquaplane&lt;/a&gt; is a good example. So
now you can use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; to watch the RZX of that game as nature intended.
The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--cmio&lt;/code&gt; option will also come in handy for playing an RZX file whose
execution path depends on accurate emulation of the MEMPTR register. I’m not
aware of any such RZX files at the moment, however - at least, none that
correctly play to completion in a modern emulator.&lt;/p&gt;

&lt;p&gt;So much for the visual improvements in SkoolKit 10.1. What about the audio
improvements? Well, after AY audio support was added in 10.0, it only makes
sense that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt; macro should gain the ability to tweak
that AY simulation experience via the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--volume&lt;/code&gt; option and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vol&lt;/code&gt; parameter for
setting the volume; the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--ay-mode&lt;/code&gt; option and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aymode&lt;/code&gt; parameter for setting
the AY stereo mode (to ABC, ACB or MONO); and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--ay-res&lt;/code&gt; option and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ayres&lt;/code&gt;
parameter for setting the AY sampling resolution (in T-states). The default AY
sampling resolution of 622 T-states - equivalent to 5700Hz on a 128K
Spectrum - should be good enough for capturing most AY speech and other sound
effects, but if you ever find it lacking, now there’s a way to adjust it.&lt;/p&gt;

&lt;p&gt;Finally, speaking of the screen and AY audio - as I have been - I should also
mention that the ‘Screen’ (to give it its official name) and the AY audio
writer are now pluggable components. So if you don’t like the way SkoolKit
draws pixels or rips AY audio, you can bloody well write your own components
and plug them in via the component API. More power to you.&lt;/p&gt;

&lt;p&gt;Finally finally, for even more details on what’s new in 10.1, visit the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-10.1/changelog.html&quot;&gt;changelog&lt;/a&gt;. After that, get a
copy of 10.1 and use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--screen&lt;/code&gt; option of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; (along with the
acceleration-disabling, real-time-matching &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c fast-load=0&lt;/code&gt;,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c accelerator=none&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-c cmio=1&lt;/code&gt; options) to watch
&lt;a href=&quot;https://spectrumcomputing.co.uk/entry/4549/&quot;&gt;Skool Daze&lt;/a&gt; take over four
minutes to load, just like the good old days.&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2026/08/blurring-the-border-lines/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2026/08/blurring-the-border-lines/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
      <item>
        <title>Offering a few MEMPTRs</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-10.0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;SkoolKit 10.0 has been released. To get a copy, please head over to the
&lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;, the
&lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Before we get into the meat of what’s new in 10.0, a word of warning. As is
often the case with an N.0 release, there are some compatibility-breaking
changes, which you can read about in the
&lt;a href=&quot;/docs/skoolkit-10.0/migration.html&quot;&gt;migration guide&lt;/a&gt;. In particular, the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#UDGARRAY*&lt;/code&gt; macro is no more, the syntax of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt; macro has had a
complete overhaul, and the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#CALL&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#FONT&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#LINK&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#UDGARRAY&lt;/code&gt; macros no
longer support the syntax that was deprecated in 9.x. But never fear - in
keeping with tradition, there is a migration script
(&lt;a href=&quot;https://github.com/skoolkid/skoolkit/blob/master/utils/skoolkit9to10.py&quot;&gt;skoolkit9to10.py&lt;/a&gt;)
to help you get your skool files, control files and ref files ready for 10.0.&lt;/p&gt;

&lt;p&gt;When support for simulating code execution on a 128K Spectrum was added back in
SkoolKit 9.1, you might have been forgiven for thinking that it would also gain
the ability to convert AY audio into a WAV file. However, you would have
thought wrong. A couple of years later, though - which, as the saying goes, is
better than never - SkoolKit 10.0 steps in to provide that missing
functionality. So, for example, you could capture the AY speech at the
beginning of &lt;a href=&quot;https://spectrumcomputing.co.uk/entry/4179&quot;&gt;Robocop&lt;/a&gt; with:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ tap2sna.py -c machine=128 &quot;Robocop - Side A.tzx&quot; robocop.z80
$ trace.py --ay --stop 39978 robocop.z80 robocop.wav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Of course, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt; macro can now capture AY audio as well by setting its
brand new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ay&lt;/code&gt; parameter to 1. And for those cases where you want to capture
both AY and beeper audio at the same time, you can use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--ay&lt;/code&gt; and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--beeper&lt;/code&gt; options of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;, or set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ay&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bpr&lt;/code&gt; parameters of the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt; macro to 1.&lt;/p&gt;

&lt;p&gt;In other simulator-related news, fans of MEMPTR (or WZ, as the case may be) can
rejoice in the fact that 10.0 brings full support for this often overlooked
internal register pair. It is simulated whenever memory and I/O contention are
enabled, i.e. when the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--cmio&lt;/code&gt; option of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; is specified, and when the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cmio&lt;/code&gt; parameter of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#SIM&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#TSTATES&lt;/code&gt; macro is set to 1. In
addition, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snapinfo.py&lt;/code&gt; now shows the value of MEMPTR in SZX snapshots, and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bin2sna.py&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snapmod.py&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; can all set the value
of MEMPTR. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; can also log the value of MEMPTR via
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;r[memptr]&lt;/code&gt; replacement field. So what does all of this mean in practice?
Well, you could, for example, now use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; to play
&lt;a href=&quot;https://spectrumcomputing.co.uk/entry/31198&quot;&gt;MEMPTR Snake&lt;/a&gt; properly. The
possibilities are truly endless.&lt;/p&gt;

&lt;p&gt;Speaking of using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; to play games, that experience - still not
recommended, by the way - should be slightly less awful in 10.0 thanks to the
border area now being included in the display. It won’t show multi-colour
border effects (at least not yet), but the effect of entering ‘BORDER 0’, for
example, being distinguishable from nothing counts as progress in my book.
Obviously &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; benefits from this new feature as well.&lt;/p&gt;

&lt;p&gt;Remember the comment generator introduced in SkoolKit 9.5? No need to apologise
if you don’t. Anyway, it has been updated to handle some keyboard-reading
instructions a little more intelligently. Specifically, the comment for
‘IN r,(C)’ immediately after ‘LD BC,$XXFE’, along with the comment for
‘IN A,($FE)’ immediately after ‘LD A,$XX’, now indicates the half-row of the
keyboard being read when eaxctly one bit of XX is reset. Which should make it
easier to spot that all-important keyboard-reading code in a freshly made skool
file.&lt;/p&gt;

&lt;p&gt;And that’s about it for the main new features in this release. For details of
the non-main new features, visit the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-10.0/changelog.html&quot;&gt;changelog&lt;/a&gt;. After that, get a
copy of 10.0 and test your mental MEMPTR-tracing skills against &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;
running on your favourite game.&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2026/04/offering-a-few-memptrs/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2026/04/offering-a-few-memptrs/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
      <item>
        <title>Two sides of the same tape</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-9.6.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;SkoolKit 9.6 has been released. To get a copy, please head over to the
&lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;, the
&lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Although &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; has recently transformed into something that’s actually
easy to use (thanks to the introduction of a Z80 instruction set simulator in
SkoolKit 8.7), it still lacks a couple of abilities that would make it even
more useful: loading from two tape files (as when side 1 and side 2 are in
separate files), and simulating keypresses while a tape is loading. Until now,
that is.&lt;/p&gt;

&lt;p&gt;If you do happen to be trying to load one of those annoying games that require
both sides of a tape that are in two different files, you can now do the
natural thing and supply each filename as an argument:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ tap2sna.py side1.pzx side2.pzx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And if you happen to be trying to load one of those even more annoying games
that require you to stop the tape for no good reason at some point in the
middle of a load, and then press a key and start the tape again to continue
loading, the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--press&lt;/code&gt; option is there to help. For example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ tap2sna.py --press 5:ENTER more-annoying-game.tap
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This will stop the tape when block 5 is reached, simulate pressing the ENTER
key until the row containing that key has been read, and then resume playing
the tape. If more than one keypress is required before the tape can resume
playing, don’t worry: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--press&lt;/code&gt; can simulate as many as are needed.&lt;/p&gt;

&lt;p&gt;And as a bonus, if you happen to be trying to load one of those annoyingest
games of all that require you to stop the tape at some point and do some
fast-forwarding before continuing the load - yes, such games, though rare, do
exist - then the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--tape-skip&lt;/code&gt; option comes to the rescue. It can fast
forward over one or more blocks like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ tap2sna.py --tape-skip 4-5 annoyingest-game.tzx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;In other tape-related news, 12 new tape-sampling loop accelerators have been
added, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; can now accelerate both types of ‘DEC A’ delay loop
(the more common one that ends with ‘JR NZ’, and the less common one that ends
with ‘JP NZ’) at the same time, instead of just one or the other exclusively.&lt;/p&gt;

&lt;p&gt;But if all of that fails to capture your interest, perhaps SkoolKit 9.6’s new
component - the RST handler - can fail to capture it even more. As its name
suggests, it handles RST instructions, which means it can alert its
consumer - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt; - that a byte or word argument
follows. To activate the RST handler, use the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--handle-rst&lt;/code&gt; option:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sna2ctl.py --handle-rst --org 0 some-rom.bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;By default, the stock RST handler recognises the byte argument of ‘RST $08’
instructions, and nothing else - which is useful (if at all) only for the 48K
ROM. But it can be configured to recognise the byte or word argument of any
RST instruction by setting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RSTHandlerConfig&lt;/code&gt; configuration parameter in
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[skoolkit]&lt;/code&gt; section of &lt;em&gt;skoolkit.ini&lt;/em&gt;, in case you’re interested in
disassembling some other ROM.&lt;/p&gt;

&lt;p&gt;When used with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt;, the RST handler inserts B (byte) and W (word)
sub-block directives as appropriate immediately after the RST instructions of
interest. But if you want to bypass the control file stage and go straight to
disassembling a ROM image, you can activate the RST handler thus:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sna2skool.py --handle-rst --org 0 some-rom.bin
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;When used with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt;, the RST handler inserts DEFB and DEFW statements
as appropriate immediately after the RST instructions of interest. Note that
the RST handler only needs to be invoked once on any ROM image or snapshot; if
you use it with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt; to generate a control file, and then again with
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt; on that same control file, confusion will result - both for
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt; and for you. You have been warned.&lt;/p&gt;

&lt;p&gt;For details of the other new features that have nothing to do with loading
tapes or recognising the arguments of RST instructions, visit the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-9.6/changelog.html&quot;&gt;changelog&lt;/a&gt;. Once you’re done
there, grab a copy of 9.6 and see how much quicker &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; is now at
loading &lt;a href=&quot;https://spectrumcomputing.co.uk/entry/430&quot;&gt;Basil&lt;/a&gt; or
&lt;a href=&quot;https://spectrumcomputing.co.uk/entry/2920&quot;&gt;Lone Wolf&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2025/05/two-sides-of-the-same-tape/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2025/05/two-sides-of-the-same-tape/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
      <item>
        <title>No instruction left uncommented</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-9.5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On the 15th anniversary of the release of
&lt;a href=&quot;/posts/2010/01/skoolkit-1-0/&quot;&gt;SkoolKit 1.0&lt;/a&gt;, SkoolKit 9.5 has been released.
To get a copy, please head over to the &lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;,
the &lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When it comes to annotations, SkoolKit has always stayed out of the way and
allowed the reverse engineer (that’s you) free rein to decide where to place
comments in the skool file and how to word them. Which is how it should be,
because only the reverse engineer (that’s you again) really understands what
the code is doing and how to convey that information to a reader of the
disassembly. However, if you’ve ever, when starting a new disassembly project,
been filled with dread by the daunting sight of a completely bare skool file,
then SkoolKit 9.5 is here to help (a little). New in this release is a comment
generator component, which can be enabled by using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--comments&lt;/code&gt; (or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-C&lt;/code&gt;)
option of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt;. For example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sna2ctl.py -C game.z80 &amp;gt; game.ctl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Now take a look at &lt;em&gt;game.ctl&lt;/em&gt; and revel in the ready-made comments that
describe what each individual instruction is doing. What if you’ve already
started on a control file, for which &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt; did not employ the comment
generator? No problem. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt; can use it to generate comments for the
instructions that don’t yet have any:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ sna2skool.py -C -c game.ctl game.z80 &amp;gt; game.skool
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Of course, the comment generator is not in any way smart, doesn’t understand
how the game you’re disassembling actually works, and should never be used to
produce a ‘complete’ disassembly automatically from scratch. But if you’re a
bit hazy on how an arithmetic or logic operation works on the flags, or what
one of the rarely used instructions (e.g. RLD or OTIR) actually does, then the
comment generator can provide a useful jog to the memory. Which is better than
nothing.&lt;/p&gt;

&lt;p&gt;If, by chance and over time, you find the comment generator to be more useful
than not, you can enable it by default for both &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt;
by setting their &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Comments&lt;/code&gt; configuration parameters to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;1&lt;/code&gt; in &lt;em&gt;skoolkit.ini&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Anyway, moving on to other new features, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;, when running with screen
contents displayed, will now respond to keypresses. This means you could use it
to enter programs into the simulated ZX Spectrum, or even play games, though I
wouldn’t recommend it. With no border, or sound, or menus to control its
operation, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; is a poor substitute for a proper emulator. But in a
pinch it could be useful if the code you’re tracing depends on user input.&lt;/p&gt;

&lt;p&gt;Another new feature for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; - which makes more sense now that it can
respond to keypresses - is the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--map&lt;/code&gt; option. Just like the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--map&lt;/code&gt; option of
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt;, it produces a code execution map. And, just like a code execution
map produced by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt;, one produced by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; can be used with the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--map&lt;/code&gt; option of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt; when generating a control file.&lt;/p&gt;

&lt;p&gt;Finally, with an eye to the looming SkoolKit 10.0 (no release date planned
yet, so don’t panic), there are several macro-related deprecations in the
works in this release. They all concern syntax oddities that have been around
for a long time, and which I’m now determined to eradicate (eventually) by
encouraging the use of parentheses where appropriate. Specifically, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#CALL&lt;/code&gt;,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#LINK&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#FONT&lt;/code&gt; now support alternative syntaxes that do away with the ugly
colons, and the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#FRAMES&lt;/code&gt; macro is an aptly named drop-in replacement (more
or less) for the frame-splicing &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#UDGARRAY*&lt;/code&gt; macro that avoids the weird
asterisk. In addition, the plain &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#UDGARRAY&lt;/code&gt; macro now strongly prefers its UDG
specifications to be enclosed in parentheses, and its attribute address range
specifications to be enclosed in square brackets.&lt;/p&gt;

&lt;p&gt;For details of the other new features that may or may not be overshadowed by
the comment generator, check out the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-9.5/changelog.html&quot;&gt;changelog&lt;/a&gt;. After that, why not
download a copy of 9.5 and use the comment generator to remind yourself what
RRD and INIR do, and how ‘RET C’ works after a CP?&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2025/01/no-instruction-left-uncommented/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2025/01/no-instruction-left-uncommented/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
      <item>
        <title>Tracing with a screen near you</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-9.4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;SkoolKit 9.4 has been released. To get a copy, please head over to the
&lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;, the
&lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With the 9.x series well under way, and full 128K support (9.0 and 9.1), RZX
support (9.2) and PZX support (9.3) now firmly entrenched, 9.4 quite reasonably
steps down a gear and modestly introduces some minor enhancements to the
Skoolkit commands and skool macros that we have come to know and love.&lt;/p&gt;

&lt;p&gt;First, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--screen&lt;/code&gt; option of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;. As its name suggests, it displays
the contents of the Spectrum’s screen while code is executing (so long as you
have &lt;a href=&quot;https://pygame.org/&quot;&gt;pygame&lt;/a&gt; installed). This can help if you want to
produce a snapshot at a particular point that’s easier to judge by eye than by,
say, the number of instructions executed (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--max-operations&lt;/code&gt;) or the number of
T-states elapsed (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--max-tstates&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;By default, the screen is refreshed at a rate of 50 frames per second (i.e.
normal Spectrum speed), but that can be changed by setting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ScreenFps&lt;/code&gt;
configuration parameter. A value of 0 sets &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; (and screen updates)
running at maximum speed. Also by default, the screen is rendered with a scale
factor of 2 (i.e. 512x384 pixels), but that can also be changed by setting the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ScreenScale&lt;/code&gt; configuration parameter.&lt;/p&gt;

&lt;p&gt;In addition to writing a snapshot file or WAV file after code execution has
completed, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; can now write a PNG image file of the screen contents.
Or, indeed, all three at the same time, now that multiple output file arguments
are allowed. By default, the image scale factor is 2 (i.e. 512x384 pixels
again), but that can be changed by setting the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PNGScale&lt;/code&gt; configuration
parameter.&lt;/p&gt;

&lt;p&gt;In other command news, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skool2bin.py&lt;/code&gt; can now read configuration from
&lt;em&gt;skoolkit.ini&lt;/em&gt;, and can also pad its output with zeroes on the left by using
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PadLeft&lt;/code&gt; configuration parameter, or (perhaps more usefully) on the right
by using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PadRight&lt;/code&gt; configuration parameter. So if &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;PadRight&lt;/code&gt; is set to
65536, you can (for example) use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bin2sna.py&lt;/code&gt; on the output of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skool2bin.py&lt;/code&gt;
without ever having to specify the origin address.&lt;/p&gt;

&lt;p&gt;Turning now to skool macros, this release bestows upon &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#FOREACH&lt;/code&gt; support for
a new special variable: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POKEname&lt;/code&gt;. This expands to a list of the POKEs made
by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#POKES&lt;/code&gt; macro on the named snapshot created by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#PUSHS&lt;/code&gt; macro. For
example, if the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;udgfix&lt;/code&gt; snapshot has three POKEs:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#PUSHSudgfix #POKES30000,1;30001,2;30002,3 #UDG30000 #POPS
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;then:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;#FOREACH(POKEudgfix)(p,p,: )
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;would expand to:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;POKE 30000,1: POKE 30001,2: POKE 30002,3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Individual POKEs and subsequences of POKEs on a snapshot can be specified by
using Python’s square brackets notation for indexing (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[i]&lt;/code&gt;) and slicing
(&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[start:stop]&lt;/code&gt;) a list. For example, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POKEudgfix[0]&lt;/code&gt; yields the first POKE,
and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;POKEudgfix[1:]&lt;/code&gt; yields every POKE but the first.&lt;/p&gt;

&lt;p&gt;There are more new features to discover, but for details on those and the bug
fixes in SkoolKit 9.4, head over to the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-9.4/changelog.html&quot;&gt;changelog&lt;/a&gt;. When you’re
finished there, get a copy of 9.4 and start rendering POKE lists with absolute
precision.&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2024/10/tracing-with-a-screen-near-you/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2024/10/tracing-with-a-screen-near-you/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
      <item>
        <title>Let&apos;s talk about PZX</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-9.3.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;SkoolKit 9.3 has been released. To get a copy, please head over to the
&lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;, the
&lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As if introducing support for RZX files in SkoolKit 9.2 wasn’t enough, 9.3
continues on the new file format bandwagon by introducing support for PZX
files. In case you’re not aware, &lt;a href=&quot;http://zxds.raxoft.cz/pzx.html&quot;&gt;PZX&lt;/a&gt; is a
tape file format that’s much simpler than TZX, and leaves no room for ambiguity
about where one pulse ends and the next begins. Which is quite important for a
computer whose tape-loading routines are all about those ‘edges’ between pulses
(and in some cases about whether those pulses are high or low, another topic on
which PZX is unambiguous).&lt;/p&gt;

&lt;p&gt;So now that you are aware, you will no doubt want to convert your entire
collection of TAP and TZX files to PZX format. And you can do that safe in the
knowledge that SkoolKit 9.3 has you covered: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tapinfo.py&lt;/code&gt; can show information
on the blocks in a PZX file, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; can LOAD that same PZX file. On
top of that, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bin2tap.py&lt;/code&gt; can now write PZX files too.&lt;/p&gt;

&lt;p&gt;In other news, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt; has finally gained the ability to disassemble
some of the more obscure ‘undocumented’ instructions in the Z80 assembly
language, such as ‘IN F,(C)’, ‘OUT (C),0’ and ‘RLC (IX+d),B’. It can also now
disassemble ED6B0000 to ‘LD HL,(0)’ if you want it to, along with a batch of
other variant opcode sequences, such as ED4E to ‘IM 0’, or ED4C to ‘NEG’. This
new feature is disabled by default, though, for good reasons. One is that your
assembler might not recognise some of these instructions, which will be a
problem if you want to run it on the output of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skool2asm.py&lt;/code&gt;. Another is that
your assembler probably won’t assemble instructions with variant opcode
sequences back to the original byte values.&lt;/p&gt;

&lt;p&gt;But if you want to enable this feature despite these dangers, you can set the
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Opcodes&lt;/code&gt; configuration parameter for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt; to one or more of the
following values in a comma-separated list:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ED63&lt;/code&gt; - LD (nn),HL&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ED6B&lt;/code&gt; - LD HL,(nn)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ED70&lt;/code&gt; - IN F,(C)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ED71&lt;/code&gt; - OUT (C),0&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IM&lt;/code&gt; - IM 0/1/2 variants&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NEG&lt;/code&gt; - NEG variants&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;RETN&lt;/code&gt; - RETN variants&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;XYCB&lt;/code&gt; - RLC (IX+d),B etc.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ALL&lt;/code&gt; - all of the above&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One other potential danger with instructions that have variant opcode sequences
is that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skool2asm.py&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skool2html.py&lt;/code&gt; won’t assemble them back to their
original byte values, thus creating a discrepancy between the internal memory
snapshot derived from the skool file and the snapshot that was used to create
the disassembly. To work around this, the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@bytes&lt;/code&gt; directive can be used to
remove any ambiguity. Whenever &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt; encounters an instruction with a
variant opcode sequence, it will automatically insert a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@bytes&lt;/code&gt; directive. For
example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;@bytes=$ED,$4E
 $8000 NEG     ; This assembles to ED4E (not ED44)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;On a completely different note (pun intended), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; can now write a WAV
file after code execution has completed. This means, for example, that you
could create a WAV file of the Fairlight theme tune like this:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ tap2sna.py https://worldofspectrum.net/pub/sinclair/games/f/Fairlight48V1.tzx.zip fairlight.z80
$ trace.py --stop 49217 fairlight.z80 fairlight.wav
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And that’s just some of the news. Information on the the other new features and
bug fixes in SkoolKit 9.3 can be found in the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-9.3/changelog.html&quot;&gt;changelog&lt;/a&gt;. After you’re done
reading that, grab a copy of 9.3 and unleash it on your new collection of PZX
files.&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2024/08/lets-talk-about-pzx/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2024/08/lets-talk-about-pzx/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
      <item>
        <title>Let&apos;s talk about RZX</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-9.2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;SkoolKit 9.2 has been released. To get a copy, please head over to the
&lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;, the
&lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Back in SkoolKit 3.3, I added the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-M&lt;/code&gt; option to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt;, which could be
used to read a code execution map produced by an emulator, and thus generate a
more accurate control file than is possible by default. That &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-M&lt;/code&gt; option on
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2skool.py&lt;/code&gt; later became the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-m&lt;/code&gt; option on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt;, which is still
there to this day. That’s all well and good, but one thing that has bugged me
all this time is the need to use an external tool (external to SkoolKit, that
is) to produce the code execution map. Which is why I’m pleased to announce, 11
years later, that SkoolKit 9.2 includes its very own map-producing tool:
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As the name suggests, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; plays RZX files. It can draw a screen if you
want to watch the playback, but this is not its intended purpose. Instead, I
would expect the dedicated reverse engineer to use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--map&lt;/code&gt; option (in
conjunction with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--no-screen&lt;/code&gt; option, to maximise playback speed), and
feed the resultant code execution map file to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt;. Naturally, in this
release &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sna2ctl.py&lt;/code&gt; has gained the ability to read map files produced by
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In the initial stages of development, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; could only play RZX files
that were recorded in plain 48K or 128K mode. However, there are many RZX files
out there that, for reasons unknown, were recorded in +2 mode or above (even
for 16K Spectrum games). So, in order to increase compatibility with existing
RZX files, I added support for +2 mode to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt;. As a consequence,
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; gains the ability to execute code in +2 snapshots for free, as it
were. You are welcome.&lt;/p&gt;

&lt;p&gt;Barging in alongside &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; in this release is its sibling, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxinfo.py&lt;/code&gt;.
This tool can be used to show the contents of an RZX file (down to individual
frames), and extract the snapshots from an RZX file. In the past I’ve made the
mistake of adding support to SkoolKit for a particular file format without
providing a tool to dump the contents of such files. (For example, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt;
arrived in SkoolKit 3.5, but &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tapinfo.py&lt;/code&gt; had to wait until 5.0.) Not this
time, though, thank goodness.&lt;/p&gt;

&lt;p&gt;One thing that became clear during the development of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; is that, for
RZX files more than a few minutes long, producing a map file is a rather
time-consuming process. In other (less kind) words, SkoolKit’s pure Python Z80
simulator is, frankly, way too slow. To address this, SkoolKit 9.2 includes a
new Z80 simulator implemented in C, which is quite a bit faster than its
predecessor. But &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rzxplay.py&lt;/code&gt; is not the only beneficiary of this speed boost:
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#SIM&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#TSTATES&lt;/code&gt; will also use the new
simulator if it’s available.&lt;/p&gt;

&lt;p&gt;So for old times’ sake, let’s look at the improvement in speed the new Z80
simulator brings. Tradition requires that I include loading the Skool Daze TZX
in such comparisons, so I will do that. I’ll also look at running Patrik Rak’s
z80doc test suite, and using &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt; to generate a WAV file for the Fairlight
theme tune. These are the relevant timings on my PC:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;19.6s (Python) v. 1.3s (C) - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py skooldaze.tzx&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;54.4s (Python) v. 1.2s (C) - z80doc tests&lt;/li&gt;
  &lt;li&gt;12.0s (Python) v. 1.9s (C) - &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO12(fairlight.wav)(49164,49217)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s all the news. More information on the the new features and bug fixes
in SkoolKit 9.2 can be found in the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-9.2/changelog.html&quot;&gt;changelog&lt;/a&gt;. After you’re
finished there, grab a copy of 9.2 and a few RZX files, and start cranking out
some code execution maps.&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2024/05/lets-talk-about-rzx/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2024/05/lets-talk-about-rzx/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
      <item>
        <title>Zone of contention</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-9.1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;SkoolKit 9.1 has been released. To get a copy, please head over to the
&lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;, the
&lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Continuing the theme of “more 128K support” that started in 9.0, this release
does indeed bring more 128K support. Specifically, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bin2sna.py&lt;/code&gt; can now create
128K snapshots, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bin2tap.py&lt;/code&gt; can create 128K TAP files, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;skool2bin.py&lt;/code&gt; can
create 128K binary files, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snapmod.py&lt;/code&gt; can modify 128K snapshots, and skool
files can create internal 128K memory snapshots.&lt;/p&gt;

&lt;p&gt;I think most of that was self-explanatory, but perhaps the internal 128K memory
snapshots in skool files need a little more explanation. The new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;@bank&lt;/code&gt;
directive either specifies the RAM bank mapped to 49152 (0xC000), or loads the
contents of another skool file into a 128K RAM bank - and converts the snapshot
to 128K at the same time. When that happens, the 128K ROM is loaded as well.
After that, how do you actually access all the extra memory? Enter the new
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#BANK&lt;/code&gt; macro, which switches the RAM bank that is mapped to 49152. Got a
sprite in RAM bank 4 you’d like to create an image of? Do a quick &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#BANK4&lt;/code&gt; and
you’re ready to go.&lt;/p&gt;

&lt;p&gt;One other thing about &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;snapmod.py&lt;/code&gt;: not only can it now modify 128K snapshots,
but it can also modify SZX snapshots. That brings it up to par with its friends
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bin2sna.py&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;, which gained the ability to write
SZX snapshots in the previous release.&lt;/p&gt;

&lt;p&gt;In other news, SkoolKit’s Z80 instruction set simulator has gained the ability
to simulate memory and I/O contention. It’s much slower when this feature is
enabled, but it can be useful for various reasons. For example, there are a few
game tapes out there that require it in order to LOAD correctly (the original
release of &lt;a href=&quot;https://spectrumcomputing.co.uk/entry/2078&quot;&gt;Gold Mine&lt;/a&gt; being the
quintessential example), so &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; can certainly benefit from it. For
another example, the sound created by routines running in contended memory can
now be captured precisely by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt; macro (instead of being approximated
in post-processing). And finally, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#TSTATES&lt;/code&gt; macro can now do its job
accurately when presented with code that’s subject to contention.&lt;/p&gt;

&lt;p&gt;On the subject of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#TSTATES&lt;/code&gt;, those two macros can also now
simulate the execution of interrupt routines, for extra faithfulness to the
behaviour of the original hardware. In the case of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt;, this means its two
post-processing options (approximating contention and interrupt delays) are now
redundant when simulating code execution.&lt;/p&gt;

&lt;p&gt;In case you were wondering, yes, of course the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#SIM&lt;/code&gt; macro has not been left
out when it comes to memory and I/O contention and interrupts. It also now has
parameters for specifying the value of the simulator’s clock, the interrupt
mode, and whether interrupts are enabled. In addition, if the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;stop&lt;/code&gt; parameter
is omitted, all other parameters are evaluated, but no code is executed. This
technique can be used to prepare the simulator with the required initial
register values and hardware state for later use by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#AUDIO&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#TSTATES&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And that’s about it. Anyone wanting more information on the the new features
and bug fixes in SkoolKit 9.1 should pop over to the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-9.1/changelog.html&quot;&gt;changelog&lt;/a&gt;. After that, go and
get your copy of 9.1 and enjoy contending memory and switching RAM banks until
the cows come home.&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2024/02/zone-of-contention/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2024/02/zone-of-contention/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
      <item>
        <title>128K ought to be enough for anyone</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-9.0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;SkoolKit 9.0 has been released. To get a copy, please head over to the
&lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;, the
&lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Yes, the 8.x series has come to an end. It had a good four-year run, but now’s
the time for it to step aside and let 9.0 in. As you might expect from an N.0
release, there are some compatibility-breaking changes, which you can read
about in the &lt;a href=&quot;/docs/skoolkit-9.0/migration.html&quot;&gt;migration guide&lt;/a&gt;. But unless
you were particularly fond of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#DEFINE&lt;/code&gt; macro (deprecated since 8.5),
there’s not much to worry about. Most of the other breaking changes are in
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;, but I hope you’ll agree they’re all changes for
the better.&lt;/p&gt;

&lt;p&gt;The main new feature in this release is support for the (original) 128K
Spectrum in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;. That is, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; can load 128K
games from tape, and save 128K snapshots. And &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt; can then execute code
in those 128K snapshots (or any other 128K snapshots you care to throw at it).
The &lt;a href=&quot;https://github.com/skoolkid/t2sfiles&quot;&gt;t2sfiles&lt;/a&gt; repository (a collection
of ready-made &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; argument files) has already celebrated this new
capability by including over 1400 recipes for 128K games, which now accompany
the more than 11000 recipes for 48K games.&lt;/p&gt;

&lt;p&gt;The next most important feature in this release is support for a ‘phantom
typist’ in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt;. Now, the right-minded among you will surely agree that
there are few things more annoying in this world than a tape that requires
something other than &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LOAD &quot;&quot;&lt;/code&gt; (or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LOAD &quot;&quot;CODE&lt;/code&gt;) in order to LOAD and RUN
correctly. Unfortunately for us, quite a few such tapes exist out there, but
the phantom typist is here to help: it can enter a custom command line before
starting the tape. For example:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ tap2sna.py -c &apos;load=CLEAR 35000: LOAD &quot;&quot;&apos; Tridex.tzx
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;And perhaps the third most important feature in this release is support for
writing SZX snapshots, which has been added to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bin2sna.py&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; and
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;trace.py&lt;/code&gt;. Until this release, SkoolKit’s one and only output snapshot format
of choice was Z80, because it’s well supported by other software and adequate
for most purposes. But &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; occasionally runs into a deficiency in the
Z80 format: it has no slot for the last OUT to port 0xFE. This value actually
matters for some games that have poorly written keyboard-reading routines.&lt;/p&gt;

&lt;p&gt;And there I shall stop, and advise any readers who want more information on the
the new stuff in SkoolKit 9.0 to consult the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-9.0/changelog.html&quot;&gt;changelog&lt;/a&gt;. After that, go and
grab a copy of 9.0 and enjoy the 128K’s worth of goodness within.&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2023/11/128k-ought-to-be-enough-for-anyone/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2023/11/128k-ought-to-be-enough-for-anyone/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
      <item>
        <title>No rest for the simulated</title>
        <description>&lt;p&gt;&lt;img src=&quot;https://skoolkit.ca/images/skoolkit-8.10.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;SkoolKit 8.10 has been released. To get a copy, please head over to the
&lt;a href=&quot;https://skoolkit.ca/skoolkit/&quot;&gt;download page&lt;/a&gt;, the
&lt;a href=&quot;https://pypi.org/project/skoolkit/&quot;&gt;Python Package Index&lt;/a&gt;, or
&lt;a href=&quot;https://github.com/skoolkid/skoolkit/releases&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As the title suggests, this release of SkoolKit is (again) almost entirely
about Z80 instruction set simulation. And to rub salt in the wounds of those
who still have no interest in the subject, it’s specifically about Z80
instruction set simulation in the service of LOADing tapes. To my recollection,
never has a single SkoolKit command received so much attention over a sequence
of releases as &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; has since 8.7 came out in October last year. So, to
the fans of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; that are still reading: strap in.&lt;/p&gt;

&lt;p&gt;First up is the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;finish-tape&lt;/code&gt; simulated LOAD configuration parameter, which
(when set to 1) forces &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; to play the tape to the end before stopping
the simulation at the given start address. This is particularly useful for
custom loaders that hit the start address more than once during the loading
process, and also for stopping purely ROM-based loaders at $053F (SA/LD-RET)
after the last block on the tape has loaded.&lt;/p&gt;

&lt;p&gt;Next is the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;contended-in&lt;/code&gt; configuration parameter, which (when set to 1) makes
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; interpret ‘IN A,($FE)’ instructions in the address range
$4000-$7FFF (i.e. contended memory on a standard 48K Spectrum) as reading the
tape. Lest you think this couldn’t possibly be useful, it’s actually required
by such games as &lt;a href=&quot;https://spectrumcomputing.co.uk/entry/25210&quot;&gt;Fly Swatter&lt;/a&gt;,
&lt;a href=&quot;https://spectrumcomputing.co.uk/entry/21840&quot;&gt;Removal Deluxe&lt;/a&gt; and
&lt;a href=&quot;https://spectrumcomputing.co.uk/entry/27648&quot;&gt;Sapper&lt;/a&gt;, all of which have custom
loading routines located in the aforementioned address range.&lt;/p&gt;

&lt;p&gt;After that, there are 32 new tape-sampling loop accelerators in this release,
brought in to accompany the original 11. And although the casual user will
rarely need to think about them, if you are curious which accelerators (if any)
a game uses, you can now set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;accelerator&lt;/code&gt; simulated LOAD configuration
parameter to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;list&lt;/code&gt;, and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; will do just that:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;$ tap2sna.py --sim-load -c accelerator=list GYROSCP2.TZX gyroscope2.z80
Program: GYROSC.II
Fast loading data block: 23755,1250
Data (602 bytes)
Data (46414 bytes)
Tape finished
Simulation stopped (end of tape): PC=64809
Accelerators: rom: 12857; speedlock: 113290; bleepload: 632000; misses: 25/62
Writing gyroscope2.z80
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Accelerators&lt;/code&gt; line here shows that a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rom&lt;/code&gt;-style tape-sampling loop was
entered 12857 times, a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;speedlock&lt;/code&gt;-style loop 113290 times, and a
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;bleepload&lt;/code&gt;-style loop 632000 times. In addition, the tape-sampling loop
detectors, which are triggered by ‘INC B’ and ‘DEC B’ instructions, counted 25
misses for ‘INC B’ (i.e. 25 instances of ‘INC B’ not inside a recognised
tape-sampling loop) and 62 misses for ‘DEC B’.&lt;/p&gt;

&lt;p&gt;For those even more curious about custom loaders, the format of the trace log
file produced by &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; during a simulated LOAD can now be defined via
the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TraceLine&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TraceOperand&lt;/code&gt; configuration parameters. In addition to the
current address and instruction, you can log the current value of any register,
and also the current time (in T-states) as recorded by the simulator’s internal
clock. In conjunction with the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--tape-analysis&lt;/code&gt; option of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt;,
which provides an analysis (including timestamps) of a tape’s tones, pulse
sequences and data blocks, this enables you to figure out what’s being loaded
and where at any point in the loading routine. If that’s your kind of thing.&lt;/p&gt;

&lt;p&gt;But if all of this so far seems like too much information, and all you want is
for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--sim-load&lt;/code&gt; to just work for a particular tape, you could do worse than
consult the &lt;a href=&quot;https://github.com/skoolkid/t2sfiles&quot;&gt;t2sfiles&lt;/a&gt; repository. It
contains ready-made ‘t2s’ (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tap2sna.py&lt;/code&gt; argument) files for thousands of games,
with appropriate start addresses already figured out, and appropriate
accelerators already specified.&lt;/p&gt;

&lt;p&gt;And on that note, I shall direct any readers who want even more information on
the goodies (simulation-related and otherwise) inside SkoolKit 8.10 to the
&lt;a href=&quot;https://skoolkit.ca/docs/skoolkit-8.10/changelog.html&quot;&gt;changelog&lt;/a&gt;. When you’re done
there, please download a copy of 8.10, and perhaps a copy of the
&lt;a href=&quot;https://github.com/skoolkid/t2sfiles&quot;&gt;t2sfiles&lt;/a&gt; repository, and give
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--sim-load&lt;/code&gt; a good workout. For real this time.&lt;/p&gt;
</description>
        <pubDate>2026-08-14</pubDate>
        <link>https://skoolkit.ca/posts/2023/06/no-rest-for-the-simulated/</link>
        <guid isPermaLink="true">https://skoolkit.ca/posts/2023/06/no-rest-for-the-simulated/</guid>
        
        
        <category>SkoolKit</category>
        
      </item>
    
  </channel>
</rss>
