skoolkit 9.4__tar.gz → 9.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {skoolkit-9.4/skoolkit.egg-info → skoolkit-9.5}/PKG-INFO +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/c/csimulator.c +47 -39
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/changelog.rst.txt +32 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/changelog8.rst.txt +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/commands.rst.txt +40 -2
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/components.rst.txt +47 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/diy.rst.txt +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/extending.rst.txt +29 -2
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/sna2ctl.py.rst.txt +7 -2
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/sna2skool.py.rst.txt +5 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/snapmod.py.rst.txt +5 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/tap2sna.py.rst.txt +2 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/trace.py.rst.txt +6 -1
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/skool-macros.rst.txt +133 -109
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/usage.rst.txt +1 -1
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/whatis.rst.txt +1 -1
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/documentation_options.js +1 -1
- {skoolkit-9.4 → skoolkit-9.5}/docs/asm-templates.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/asm.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/assemblers.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/changelog.html +53 -18
- {skoolkit-9.4 → skoolkit-9.5}/docs/changelog1.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/changelog2.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/changelog3.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/changelog4.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/changelog5.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/changelog6.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/changelog7.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/changelog8.html +6 -6
- {skoolkit-9.4 → skoolkit-9.5}/docs/commands.html +103 -60
- {skoolkit-9.4 → skoolkit-9.5}/docs/components.html +118 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/control-files.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/diy.html +6 -6
- {skoolkit-9.4 → skoolkit-9.5}/docs/extending.html +48 -10
- {skoolkit-9.4 → skoolkit-9.5}/docs/genindex.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/html-templates.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/index.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/bin2sna.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/bin2tap.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/rzxinfo.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/rzxplay.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/skool2asm.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/skool2bin.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/skool2ctl.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/skool2html.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/sna2ctl.py.html +25 -16
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/sna2img.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/sna2skool.py.html +65 -54
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/snapinfo.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/snapmod.py.html +8 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/tap2sna.py.html +8 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/tapinfo.py.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/man/trace.py.html +14 -5
- {skoolkit-9.4 → skoolkit-9.5}/docs/migration.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/parsing.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/ref-files.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/search.html +4 -4
- skoolkit-9.5/docs/searchindex.js +1 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/skool-files.html +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/docs/skool-macros.html +186 -154
- {skoolkit-9.4 → skoolkit-9.5}/docs/usage.html +5 -5
- {skoolkit-9.4 → skoolkit-9.5}/docs/whatis.html +5 -5
- {skoolkit-9.4 → skoolkit-9.5}/long_description.rst +1 -1
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/bin2sna.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/bin2tap.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/rzxinfo.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/rzxplay.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/skool2asm.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/skool2bin.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/skool2ctl.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/skool2html.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/sna2ctl.py.1 +13 -4
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/sna2img.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/sna2skool.py.1 +13 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/snapinfo.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/snapmod.py.1 +7 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/tap2sna.py.1 +6 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/tapinfo.py.1 +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/man/man1/trace.py.1 +12 -3
- {skoolkit-9.4 → skoolkit-9.5}/setup.cfg +1 -1
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/__init__.py +2 -2
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/audio.py +30 -1
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/basic.py +10 -6
- skoolkit-9.5/skoolkit/comment.py +606 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/components.py +7 -1
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/config.py +8 -2
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/pagingtracer.py +3 -3
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/rzxplay.py +2 -2
- skoolkit-9.5/skoolkit/screen.py +189 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skoolasm.py +5 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skoolhtml.py +8 -5
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skoolmacro.py +202 -114
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skoolutils.py +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/sna2ctl.py +4 -2
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/sna2img.py +3 -3
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/sna2skool.py +2 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/snactl.py +42 -6
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/snapinfo.py +1 -1
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/snapmod.py +5 -1
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/snapshot.py +27 -6
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/snaskool.py +14 -4
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/tap2sna.py +1 -1
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/trace.py +45 -14
- {skoolkit-9.4 → skoolkit-9.5/skoolkit.egg-info}/PKG-INFO +4 -4
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit.egg-info/SOURCES.txt +5 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/macrotest.py +117 -27
- {skoolkit-9.4 → skoolkit-9.5}/tests/skoolkittest.py +68 -2
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_basic.py +35 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_bin2sna.py +4 -3
- skoolkit-9.5/tests/test_comment.py +1474 -0
- skoolkit-9.5/tests/test_pagingtracer.py +72 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_rzxplay.py +87 -33
- skoolkit-9.5/tests/test_screen.py +166 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skool2bin.py +8 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skoolasm.py +23 -2
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skoolhtml.py +317 -215
- skoolkit-9.5/tests/test_skoolutils.py +136 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_sna2ctl.py +120 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_sna2img.py +3 -2
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_sna2skool.py +30 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_snapinfo.py +114 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_snapmod.py +103 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_snapshot.py +80 -1
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_snaskool.py +197 -3
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_tap2sna.py +36 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_trace.py +238 -9
- skoolkit-9.4/docs/searchindex.js +0 -1
- skoolkit-9.4/skoolkit/screen.py +0 -104
- {skoolkit-9.4 → skoolkit-9.5}/COPYING +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/MANIFEST.in +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/bin2sna.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/bin2tap.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/asm-templates.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/asm.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/assemblers.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/changelog1.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/changelog2.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/changelog3.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/changelog4.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/changelog5.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/changelog6.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/changelog7.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/control-files.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/html-templates.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/index.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/bin2sna.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/bin2tap.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/rzxinfo.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/rzxplay.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/skool2asm.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/skool2bin.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/skool2ctl.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/skool2html.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/sna2img.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/snapinfo.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/man/tapinfo.py.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/migration.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/parsing.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/ref-files.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_sources/skool-files.rst.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/_sphinx_javascript_frameworks_compat.js +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/basic.css +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/classic.css +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/custom.css +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/doctools.js +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/file.png +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/jquery.js +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/language_data.js +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/minus.png +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/plus.png +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/pygments.css +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/searchtools.js +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/sidebar.js +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/sphinx_highlight.js +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/docs/_static/underscore.js +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/examples/hungry_horace.ctl +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/examples/hungry_horace.ref +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/examples/hungry_horace.t2s +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/pyproject.toml +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/rzxinfo.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/rzxplay.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/setup.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skool2asm.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skool2bin.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skool2ctl.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skool2html.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/bin2sna.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/bin2tap.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/cmiosimulator.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/ctlparser.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/defaults.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/disassembler.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/graphics.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/image.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/kbtracer.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/loadsample.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/loadtracer.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/opcodes.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/pngwriter.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/refparser.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/128-0.rom +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/128-1.rom +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/48.rom +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/plus2-0.rom +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/plus2-1.rom +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/skoolkit-dark.css +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/skoolkit-green.css +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/skoolkit-plum.css +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/skoolkit-wide.css +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/resources/skoolkit.css +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/rzxinfo.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/simtables.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/simulator.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/simutils.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skool2asm.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skool2bin.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skool2ctl.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skool2html.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skoolctl.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/skoolparser.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/tape.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/tapinfo.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/textutils.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/traceutils.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit/z80.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit.egg-info/dependency_links.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/skoolkit.egg-info/top_level.txt +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/sna2ctl.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/sna2img.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/sna2skool.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/snapinfo.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/snapmod.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tap2sna.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tapinfo.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_audio.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_bin2tap.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_cmiosimulator.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_ctlparser.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_disassembler.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_graphics.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_image.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_kbtracer.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_refparser.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_rzxinfo.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_simulator.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skool2asm.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skool2ctl.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skool2html.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skoolctl.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skoolkit.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skoolmacro.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_skoolparser.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_tape.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_tapinfo.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_textutils.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_traceutils.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/tests/test_z80.py +0 -0
- {skoolkit-9.4 → skoolkit-9.5}/trace.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: skoolkit
|
|
3
|
-
Version: 9.
|
|
3
|
+
Version: 9.5
|
|
4
4
|
Summary: A suite of tools for creating disassemblies of ZX Spectrum games
|
|
5
5
|
Home-page: https://skoolkit.ca
|
|
6
6
|
Author: Richard Dymond
|
|
@@ -11,11 +11,11 @@ Classifier: License :: OSI Approved :: GNU General Public License v3 or later (G
|
|
|
11
11
|
Classifier: Operating System :: OS Independent
|
|
12
12
|
Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.8
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.9
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.10
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
18
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
19
|
Classifier: Topic :: Software Development :: Disassemblers
|
|
20
20
|
Classifier: Topic :: Utilities
|
|
21
21
|
Description-Content-Type: text/x-rst
|
|
@@ -43,7 +43,7 @@ With SkoolKit you can:
|
|
|
43
43
|
Z80) or raw memory file
|
|
44
44
|
* enable sna2ctl.py_ to generate a much better control file that more reliably
|
|
45
45
|
distinguishes code from data by using a code execution map produced by an
|
|
46
|
-
emulator or
|
|
46
|
+
emulator, rzxplay.py_ or trace.py_
|
|
47
47
|
* use sna2skool.py_ along with this control file to produce a disassembly of a
|
|
48
48
|
snapshot or raw memory file
|
|
49
49
|
* add annotations to this disassembly (or the control file) as you discover the
|
|
@@ -1679,10 +1679,9 @@ static void in_a(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1679
1679
|
unsigned value = 255;
|
|
1680
1680
|
if (self->in_a_n_tracer) {
|
|
1681
1681
|
byte* mem = self->memory;
|
|
1682
|
-
|
|
1683
|
-
PyObject*
|
|
1684
|
-
|
|
1685
|
-
Py_XDECREF(args);
|
|
1682
|
+
PyObject* port = PyLong_FromLong(PEEK(ADDR(REG(PC) + 1)) + 256 * REG(A));
|
|
1683
|
+
PyObject* rv = PyObject_CallOneArg(self->in_a_n_tracer, port);
|
|
1684
|
+
Py_XDECREF(port);
|
|
1686
1685
|
if (rv) {
|
|
1687
1686
|
value = PyLong_AsLong(rv);
|
|
1688
1687
|
Py_DECREF(rv);
|
|
@@ -1709,10 +1708,9 @@ static void in_c(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1709
1708
|
#endif
|
|
1710
1709
|
unsigned value = 255;
|
|
1711
1710
|
if (self->in_r_c_tracer) {
|
|
1712
|
-
|
|
1713
|
-
PyObject*
|
|
1714
|
-
|
|
1715
|
-
Py_XDECREF(args);
|
|
1711
|
+
PyObject* port = PyLong_FromLong(REG(C) + 256 * REG(B));
|
|
1712
|
+
PyObject* rv = PyObject_CallOneArg(self->in_a_n_tracer, port);
|
|
1713
|
+
Py_XDECREF(port);
|
|
1716
1714
|
if (rv) {
|
|
1717
1715
|
value = PyLong_AsLong(rv);
|
|
1718
1716
|
Py_DECREF(rv);
|
|
@@ -1774,10 +1772,9 @@ static void ini(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1774
1772
|
unsigned c = REG(C);
|
|
1775
1773
|
byte value = 191;
|
|
1776
1774
|
if (self->ini_tracer) {
|
|
1777
|
-
|
|
1778
|
-
PyObject*
|
|
1779
|
-
|
|
1780
|
-
Py_XDECREF(args);
|
|
1775
|
+
PyObject* port = PyLong_FromLong(c + 256 * b);
|
|
1776
|
+
PyObject* rv = PyObject_CallOneArg(self->in_a_n_tracer, port);
|
|
1777
|
+
Py_XDECREF(port);
|
|
1781
1778
|
if (rv) {
|
|
1782
1779
|
value = (byte)PyLong_AsLong(rv);
|
|
1783
1780
|
Py_DECREF(rv);
|
|
@@ -5237,9 +5234,9 @@ static PyObject* CSimulator_exec_with_cb(CSimulatorObject* self, PyObject* args,
|
|
|
5237
5234
|
}
|
|
5238
5235
|
|
|
5239
5236
|
if (opcode == 0xD7) {
|
|
5240
|
-
PyObject*
|
|
5241
|
-
PyObject* rv =
|
|
5242
|
-
Py_XDECREF(
|
|
5237
|
+
PyObject* arg = PyLong_FromLong(REG(A));
|
|
5238
|
+
PyObject* rv = PyObject_CallOneArg(rst16_cb, arg);
|
|
5239
|
+
Py_XDECREF(arg);
|
|
5243
5240
|
if (rv == NULL) {
|
|
5244
5241
|
return NULL;
|
|
5245
5242
|
}
|
|
@@ -5359,17 +5356,19 @@ static PyObject* CSimulator_accept_interrupt(CSimulatorObject* self, PyObject* a
|
|
|
5359
5356
|
}
|
|
5360
5357
|
|
|
5361
5358
|
static PyObject* CSimulator_trace(CSimulatorObject* self, PyObject* args, PyObject* kwds) {
|
|
5362
|
-
static char* kwlist[] = {"", "", "", "", "", "", "", "", NULL};
|
|
5359
|
+
static char* kwlist[] = {"", "", "", "", "", "", "", "", "", "", NULL};
|
|
5363
5360
|
PyObject* start_obj;
|
|
5364
5361
|
PyObject* stop_obj;
|
|
5365
5362
|
unsigned long long max_operations;
|
|
5366
5363
|
unsigned long long max_time;
|
|
5367
5364
|
int interrupts;
|
|
5368
5365
|
PyObject* draw;
|
|
5366
|
+
PyObject* exec_map;
|
|
5367
|
+
PyObject* keyboard;
|
|
5369
5368
|
PyObject* disassemble;
|
|
5370
5369
|
PyObject* trace;
|
|
5371
5370
|
|
|
5372
|
-
if (!PyArg_ParseTupleAndKeywords(args, kwds, "
|
|
5371
|
+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOKKiOOOOO", kwlist, &start_obj, &stop_obj, &max_operations, &max_time, &interrupts, &draw, &exec_map, &keyboard, &disassemble, &trace)) {
|
|
5373
5372
|
return NULL;
|
|
5374
5373
|
}
|
|
5375
5374
|
|
|
@@ -5420,9 +5419,9 @@ static PyObject* CSimulator_trace(CSimulatorObject* self, PyObject* args, PyObje
|
|
|
5420
5419
|
}
|
|
5421
5420
|
|
|
5422
5421
|
if (disassemble != Py_None) {
|
|
5423
|
-
PyObject*
|
|
5424
|
-
i =
|
|
5425
|
-
Py_XDECREF(
|
|
5422
|
+
PyObject* arg = PyLong_FromLong(pc);
|
|
5423
|
+
i = PyObject_CallOneArg(disassemble, arg);
|
|
5424
|
+
Py_XDECREF(arg);
|
|
5426
5425
|
if (i == NULL) {
|
|
5427
5426
|
return NULL;
|
|
5428
5427
|
}
|
|
@@ -5433,6 +5432,15 @@ static PyObject* CSimulator_trace(CSimulatorObject* self, PyObject* args, PyObje
|
|
|
5433
5432
|
return NULL;
|
|
5434
5433
|
}
|
|
5435
5434
|
|
|
5435
|
+
if (exec_map != Py_None) {
|
|
5436
|
+
PyObject* addr = PyLong_FromLong(pc);
|
|
5437
|
+
int rv = PySet_Add(exec_map, addr);
|
|
5438
|
+
Py_XDECREF(addr);
|
|
5439
|
+
if (rv == -1) {
|
|
5440
|
+
return NULL;
|
|
5441
|
+
}
|
|
5442
|
+
}
|
|
5443
|
+
|
|
5436
5444
|
if (trace == Py_None) {
|
|
5437
5445
|
CHECK_SIGNALS;
|
|
5438
5446
|
} else {
|
|
@@ -5464,14 +5472,16 @@ static PyObject* CSimulator_trace(CSimulatorObject* self, PyObject* args, PyObje
|
|
|
5464
5472
|
return NULL;
|
|
5465
5473
|
}
|
|
5466
5474
|
}
|
|
5467
|
-
PyObject* args = Py_BuildValue("(
|
|
5468
|
-
|
|
5475
|
+
PyObject* args = Py_BuildValue("(OIO)", scr, frame, keyboard);
|
|
5476
|
+
PyObject* rv = PyObject_CallObject(draw, args);
|
|
5469
5477
|
Py_XDECREF(args);
|
|
5470
5478
|
Py_XDECREF(scr);
|
|
5471
|
-
if (
|
|
5479
|
+
if (rv == NULL) {
|
|
5472
5480
|
return NULL;
|
|
5473
5481
|
}
|
|
5474
|
-
|
|
5482
|
+
int quit = !PyObject_IsTrue(rv);
|
|
5483
|
+
Py_DECREF(rv);
|
|
5484
|
+
if (quit) {
|
|
5475
5485
|
return Py_BuildValue("(IL)", 0, operations);
|
|
5476
5486
|
}
|
|
5477
5487
|
prev_frame = frame;
|
|
@@ -5549,9 +5559,9 @@ static PyObject* CSimulator_press_keys(CSimulatorObject* self, PyObject* args, P
|
|
|
5549
5559
|
}
|
|
5550
5560
|
|
|
5551
5561
|
if (disassemble != Py_None) {
|
|
5552
|
-
PyObject*
|
|
5553
|
-
i =
|
|
5554
|
-
Py_XDECREF(
|
|
5562
|
+
PyObject* arg = PyLong_FromLong(pc);
|
|
5563
|
+
i = PyObject_CallOneArg(disassemble, arg);
|
|
5564
|
+
Py_XDECREF(arg);
|
|
5555
5565
|
if (i == NULL) {
|
|
5556
5566
|
return NULL;
|
|
5557
5567
|
}
|
|
@@ -5579,9 +5589,9 @@ static PyObject* CSimulator_press_keys(CSimulatorObject* self, PyObject* args, P
|
|
|
5579
5589
|
return NULL;
|
|
5580
5590
|
}
|
|
5581
5591
|
if (!PyObject_IsTrue(k)) {
|
|
5582
|
-
PyObject*
|
|
5583
|
-
PyObject* p =
|
|
5584
|
-
Py_XDECREF(
|
|
5592
|
+
PyObject* arg = PyLong_FromLong(0);
|
|
5593
|
+
PyObject* p = PyObject_CallOneArg(pop, arg);
|
|
5594
|
+
Py_XDECREF(arg);
|
|
5585
5595
|
if (p == NULL) {
|
|
5586
5596
|
return NULL;
|
|
5587
5597
|
}
|
|
@@ -5641,9 +5651,9 @@ static int advance_tape(PyObject* tracer, unsigned long long* tracer_state, unsi
|
|
|
5641
5651
|
if (index < block_max_index) {
|
|
5642
5652
|
unsigned p = (unsigned)(edge / (edges[max_index] / 1000));
|
|
5643
5653
|
if (p > *progress) {
|
|
5644
|
-
PyObject*
|
|
5645
|
-
PyObject* rv =
|
|
5646
|
-
Py_XDECREF(
|
|
5654
|
+
PyObject* arg = PyLong_FromLong(p);
|
|
5655
|
+
PyObject* rv = PyObject_CallOneArg(print_progress, arg);
|
|
5656
|
+
Py_XDECREF(arg);
|
|
5647
5657
|
if (rv == NULL) {
|
|
5648
5658
|
return -1;
|
|
5649
5659
|
}
|
|
@@ -6116,9 +6126,9 @@ static PyObject* CSimulator_load(CSimulatorObject* self, PyObject* args, PyObjec
|
|
|
6116
6126
|
}
|
|
6117
6127
|
|
|
6118
6128
|
if (disassemble != Py_None) {
|
|
6119
|
-
PyObject*
|
|
6120
|
-
i =
|
|
6121
|
-
Py_XDECREF(
|
|
6129
|
+
PyObject* arg = PyLong_FromLong(pc);
|
|
6130
|
+
i = PyObject_CallOneArg(disassemble, arg);
|
|
6131
|
+
Py_XDECREF(arg);
|
|
6122
6132
|
if (i == NULL) {
|
|
6123
6133
|
break;
|
|
6124
6134
|
}
|
|
@@ -6157,9 +6167,7 @@ static PyObject* CSimulator_load(CSimulatorObject* self, PyObject* args, PyObjec
|
|
|
6157
6167
|
|
|
6158
6168
|
int did_fast_load = 0;
|
|
6159
6169
|
if (pc == 0x0556 && self->out7ffd & 0x10 && fast_load) {
|
|
6160
|
-
PyObject*
|
|
6161
|
-
PyObject* fl = PyObject_CallObject(fast_load_method, args);
|
|
6162
|
-
Py_XDECREF(args);
|
|
6170
|
+
PyObject* fl = PyObject_CallOneArg(fast_load_method, (PyObject*)self);
|
|
6163
6171
|
if (fl == NULL) {
|
|
6164
6172
|
break;
|
|
6165
6173
|
}
|
|
@@ -1,6 +1,38 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
9.5 (2025-01-28)
|
|
5
|
+
----------------
|
|
6
|
+
* Dropped support for Python 3.8
|
|
7
|
+
* Added the :ref:`comment generator <commentGenerator>` component
|
|
8
|
+
* Added the ``--comments`` option to :ref:`sna2ctl.py` and :ref:`sna2skool.py`
|
|
9
|
+
(for generating instruction comments)
|
|
10
|
+
* Added the ``Comments`` configuration parameter for
|
|
11
|
+
:ref:`sna2ctl.py <sna2ctl-conf>` and :ref:`sna2skool.py <sna2skool-conf>` (to
|
|
12
|
+
enable instruction comment generation)
|
|
13
|
+
* :ref:`trace.py` now responds to keypresses while running with screen contents
|
|
14
|
+
displayed
|
|
15
|
+
* Added the ``--map`` option to :ref:`trace.py` (for writing a code execution
|
|
16
|
+
map file)
|
|
17
|
+
* Added the ``UserAgent`` configuration parameter for
|
|
18
|
+
:ref:`tap2sna.py <tap2sna-conf>` (to specify the User-Agent header in
|
|
19
|
+
HTTP/HTTPS requests)
|
|
20
|
+
* Added support to the :ref:`CALL` macro for calling an arbitrary function
|
|
21
|
+
* Added the ``--patch`` option to :ref:`snapmod.py` (for applying a binary
|
|
22
|
+
patch file)
|
|
23
|
+
* The :ref:`REG` macro now always renders the IXh, IXl, IYh and IYl registers
|
|
24
|
+
with a lower case 'h' or 'l'
|
|
25
|
+
* Added the :ref:`FRAMES` macro (as an alternative to the ``#UDGARRAY*`` macro,
|
|
26
|
+
which is now deprecated)
|
|
27
|
+
* Made the :ref:`audio writer <audioWriter>` a pluggable component
|
|
28
|
+
* Made the :ref:`code map reader <codeMapReader>` a pluggable component
|
|
29
|
+
* Improved handling of TC2048, TC2068 and TS2068 Z80 snapshots
|
|
30
|
+
* Fixed how :ref:`trace.py` builds a PNG image in 128K mode
|
|
31
|
+
* Fixed the bug that prevents :ref:`skool2asm.py`, :ref:`skool2bin.py` and
|
|
32
|
+
:ref:`skool2html.py` from handling an instruction that crosses the 64K
|
|
33
|
+
boundary
|
|
34
|
+
* Fixed how BIN expressions are evaluated in BASIC listings
|
|
35
|
+
|
|
4
36
|
9.4 (2024-10-05)
|
|
5
37
|
----------------
|
|
6
38
|
* Added support to :ref:`skool2bin.py <skool2bin-conf>` for reading
|
|
@@ -261,8 +261,8 @@ SkoolKit 8.x changelog
|
|
|
261
261
|
* Added support to the ``--ctl`` option of :ref:`sna2skool.py` and
|
|
262
262
|
:ref:`snapinfo.py` for reading control files from a directory
|
|
263
263
|
* Added the ``x`` and ``y`` parameters to the frame specification of the
|
|
264
|
-
|
|
265
|
-
|
|
264
|
+
``#UDGARRAY*`` macro (for specifying the coordinates at which to render a
|
|
265
|
+
frame of an animated image)
|
|
266
266
|
* Added support for replacement fields in the ``args`` parameter of the
|
|
267
267
|
:ref:`CALL` macro, in the integer parameters of the :ref:`CHR`, :ref:`D`,
|
|
268
268
|
:ref:`INCLUDE`, :ref:`N`, :ref:`POKES`, :ref:`R` and :ref:`SPACE` macros, and
|
|
@@ -924,6 +924,7 @@ skool file split into blocks of code and data.
|
|
|
924
924
|
snapshot. FILE may be a regular file, or '-' for standard input.
|
|
925
925
|
|
|
926
926
|
Options:
|
|
927
|
+
-C, --comments Generate instruction comments.
|
|
927
928
|
-e ADDR, --end ADDR Stop at this address (default=65536).
|
|
928
929
|
-h, --hex Write upper case hexadecimal addresses.
|
|
929
930
|
-I p=v, --ini p=v Set the value of the configuration parameter 'p' to
|
|
@@ -945,7 +946,7 @@ to be a binary file.
|
|
|
945
946
|
The ``-m`` option may be used to specify a code execution map to use when
|
|
946
947
|
generating a control file. The supported file formats are:
|
|
947
948
|
|
|
948
|
-
* Files created by the ``--map`` option of :ref:`rzxplay.py`
|
|
949
|
+
* Files created by the ``--map`` option of :ref:`rzxplay.py` or :ref:`trace.py`
|
|
949
950
|
* Profiles created by the Fuse emulator
|
|
950
951
|
* Code execution logs created by the SpecEmu, Spud and Zero emulators
|
|
951
952
|
* Map files created by the SpecEmu and Z80 emulators
|
|
@@ -962,6 +963,8 @@ Configuration
|
|
|
962
963
|
current working directory or in `~/.skoolkit`, if present. The recognised
|
|
963
964
|
configuration parameters are:
|
|
964
965
|
|
|
966
|
+
* ``Comments`` - generate instruction comments (``1``), or don't (``0``, the
|
|
967
|
+
default)
|
|
965
968
|
* ``Dictionary`` - the name of a file containing a list of allowed words, one
|
|
966
969
|
per line; if specified, a string of characters will be marked as text only if
|
|
967
970
|
it contains at least one of the words in this file
|
|
@@ -990,6 +993,9 @@ Configuration parameters may also be set on the command line by using the
|
|
|
990
993
|
+---------+-------------------------------------------------------------------+
|
|
991
994
|
| Version | Changes |
|
|
992
995
|
+=========+===================================================================+
|
|
996
|
+
| 9.5 | Added the ``--comments`` option and the ``Comments`` |
|
|
997
|
+
| | configuration parameter |
|
|
998
|
+
+---------+-------------------------------------------------------------------+
|
|
993
999
|
| 9.2 | Added support for reading code execution maps produced by |
|
|
994
1000
|
| | :ref:`rzxplay.py` |
|
|
995
1001
|
+---------+-------------------------------------------------------------------+
|
|
@@ -1089,6 +1095,7 @@ list::
|
|
|
1089
1095
|
which to read control files. PATH may be '-' for
|
|
1090
1096
|
standard input, or '0' to use no control file. This
|
|
1091
1097
|
option may be used multiple times.
|
|
1098
|
+
-C, --comments Generate instruction comments.
|
|
1092
1099
|
-d SIZE, --defb SIZE Disassemble as DEFB statements of this size.
|
|
1093
1100
|
-e ADDR, --end ADDR Stop disassembling at this address (default: 65536).
|
|
1094
1101
|
-H, --hex Write hexadecimal addresses and operands in the
|
|
@@ -1114,6 +1121,16 @@ By default, any files whose names start with the input filename (minus the
|
|
|
1114
1121
|
'.bin', '.sna', '.szx' or '.z80' suffix, if any) and end with '.ctl' will be
|
|
1115
1122
|
used as :ref:`control files <controlFiles>`.
|
|
1116
1123
|
|
|
1124
|
+
There are three options and configuration parameters that control whether
|
|
1125
|
+
`sna2skool.py` generates a comment for an instruction that has no comment
|
|
1126
|
+
defined in a control file. They are mutually exclusive and operate in the
|
|
1127
|
+
following order:
|
|
1128
|
+
|
|
1129
|
+
* the ``--comments`` option or ``Comments`` configuration parameter (uses the
|
|
1130
|
+
:ref:`comment generator <commentGenerator>` component)
|
|
1131
|
+
* the ``Text`` configuration parameter (shows byte values as ASCII text)
|
|
1132
|
+
* the ``Timings`` configuration parameter (shows instruction timings)
|
|
1133
|
+
|
|
1117
1134
|
.. _sna2skool-conf:
|
|
1118
1135
|
|
|
1119
1136
|
Configuration
|
|
@@ -1126,6 +1143,8 @@ configuration parameters are:
|
|
|
1126
1143
|
or decimal (``10``, the default)
|
|
1127
1144
|
* ``Case`` - write the disassembly in lower case (``1``) or upper case (``2``,
|
|
1128
1145
|
the default)
|
|
1146
|
+
* ``Comments`` - generate instruction comments (``1``), or don't (``0``, the
|
|
1147
|
+
default)
|
|
1129
1148
|
* ``CommentWidthMin`` - minimum width of the instruction comment field in the
|
|
1130
1149
|
skool file (default: ``10``)
|
|
1131
1150
|
* ``DefbSize`` - maximum number of bytes in a DEFB statement (default: ``8``)
|
|
@@ -1243,6 +1262,9 @@ Configuration parameters may also be set on the command line by using the
|
|
|
1243
1262
|
+---------+-------------------------------------------------------------------+
|
|
1244
1263
|
| Version | Changes |
|
|
1245
1264
|
+=========+===================================================================+
|
|
1265
|
+
| 9.5 | Added the ``--comments`` option and the ``Comments`` |
|
|
1266
|
+
| | configuration parameter |
|
|
1267
|
+
+---------+-------------------------------------------------------------------+
|
|
1246
1268
|
| 9.3 | Added the ``Opcodes`` configuration parameter |
|
|
1247
1269
|
+---------+-------------------------------------------------------------------+
|
|
1248
1270
|
| 8.7 | Added the ``--defb`` option and the ``Timings`` configuration |
|
|
@@ -1500,6 +1522,8 @@ To list the options supported by `snapmod.py`, run it with no arguments::
|
|
|
1500
1522
|
Copy a block of bytes of the given size from src in
|
|
1501
1523
|
RAM bank s to dest in RAM bank d. This option may be
|
|
1502
1524
|
used multiple times.
|
|
1525
|
+
--patch [p:]a,file Apply a binary patch file at address 'a' in RAM bank
|
|
1526
|
+
'p'. This option may be used multiple times.
|
|
1503
1527
|
-p [p:]a[-b[-c]],[^+]v, --poke [p:]a[-b[-c]],[^+]v
|
|
1504
1528
|
POKE N,v in RAM bank p for N in {a, a+c, a+2c..., b}.
|
|
1505
1529
|
Prefix 'v' with '^' to perform an XOR operation, or
|
|
@@ -1517,6 +1541,8 @@ To list the options supported by `snapmod.py`, run it with no arguments::
|
|
|
1517
1541
|
+---------+-------------------------------------------------------------------+
|
|
1518
1542
|
| Version | Changes |
|
|
1519
1543
|
+=========+===================================================================+
|
|
1544
|
+
| 9.5 | Added the ``--patch`` option |
|
|
1545
|
+
+---------+-------------------------------------------------------------------+
|
|
1520
1546
|
| 9.1 | Added support for modifying SZX snapshots and 128K snapshots; the |
|
|
1521
1547
|
| | ``--move`` and ``--poke`` options can modify specific RAM banks |
|
|
1522
1548
|
+---------+-------------------------------------------------------------------+
|
|
@@ -1807,6 +1833,8 @@ configuration parameters are:
|
|
|
1807
1833
|
separated by commas (default: ``$,02X,04X``); the byte and word formats are
|
|
1808
1834
|
standard Python format specifiers for numeric values, and default to empty
|
|
1809
1835
|
strings if not supplied
|
|
1836
|
+
* ``UserAgent`` - the value of the User-Agent header in HTTP/HTTPS requests
|
|
1837
|
+
(default: empty string)
|
|
1810
1838
|
|
|
1811
1839
|
``TraceLine`` is a standard Python format string that recognises the following
|
|
1812
1840
|
replacement fields:
|
|
@@ -1853,6 +1881,8 @@ Configuration parameters may also be set on the command line by using the
|
|
|
1853
1881
|
+---------+-------------------------------------------------------------------+
|
|
1854
1882
|
| Version | Changes |
|
|
1855
1883
|
+=========+===================================================================+
|
|
1884
|
+
| 9.5 | Added the ``UserAgent`` configuration parameter |
|
|
1885
|
+
+---------+-------------------------------------------------------------------+
|
|
1856
1886
|
| 9.3 | Added support for PZX files; added support for the ``m`` (memory) |
|
|
1857
1887
|
| | replacement field in the ``TraceLine`` configuration parameter |
|
|
1858
1888
|
+---------+-------------------------------------------------------------------+
|
|
@@ -2005,6 +2035,7 @@ To list the options supported by `trace.py`, run it with no arguments::
|
|
|
2005
2035
|
-D, --decimal Show decimal values in verbose mode.
|
|
2006
2036
|
-I p=v, --ini p=v Set the value of the configuration parameter 'p' to
|
|
2007
2037
|
'v'. This option may be used multiple times.
|
|
2038
|
+
--map FILE Log addresses of executed instructions to a file.
|
|
2008
2039
|
-m MAX, --max-operations MAX
|
|
2009
2040
|
Maximum number of instructions to execute.
|
|
2010
2041
|
-M MAX, --max-tstates MAX
|
|
@@ -2027,7 +2058,8 @@ To list the options supported by `trace.py`, run it with no arguments::
|
|
|
2027
2058
|
-s ADDR, --start ADDR
|
|
2028
2059
|
Start execution at this address.
|
|
2029
2060
|
-S ADDR, --stop ADDR Stop execution at this address.
|
|
2030
|
-
--screen Display screen contents
|
|
2061
|
+
--screen Display screen contents and respond to keypresses
|
|
2062
|
+
while running.
|
|
2031
2063
|
--state name=value Set a hardware state attribute before execution
|
|
2032
2064
|
begins. Do '--state help' for more information. This
|
|
2033
2065
|
option may be used multiple times.
|
|
@@ -2053,6 +2085,9 @@ If the ``--screen`` option is given and `pygame`_ is installed, `trace.py` will
|
|
|
2053
2085
|
use it to render the Spectrum's screen contents at 50 frames per second with a
|
|
2054
2086
|
scale factor of 2 while running. The frame rate and scale factor can be changed
|
|
2055
2087
|
by setting the ``ScreenFps`` and ``ScreenScale`` configuration parameters.
|
|
2088
|
+
While the screen is displayed, `trace.py` will also respond to keypresses, with
|
|
2089
|
+
the left shift key mapped to CAPS SHIFT on the Spectrum keyboard, and the left
|
|
2090
|
+
Ctrl key mapped to SYMBOL SHIFT.
|
|
2056
2091
|
|
|
2057
2092
|
.. _trace-conf:
|
|
2058
2093
|
|
|
@@ -2120,6 +2155,9 @@ Configuration parameters may also be set on the command line by using the
|
|
|
2120
2155
|
+---------+-------------------------------------------------------------------+
|
|
2121
2156
|
| Version | Changes |
|
|
2122
2157
|
+=========+===================================================================+
|
|
2158
|
+
| 9.5 | Responds to keypresses while the screen is displayed; added the |
|
|
2159
|
+
| | ``--map`` option |
|
|
2160
|
+
+---------+-------------------------------------------------------------------+
|
|
2123
2161
|
| 9.4 | Added the ``--screen`` option; added support for writing a PNG |
|
|
2124
2162
|
| | file after execution has completed; added the ``PNGScale``, |
|
|
2125
2163
|
| | ``ScreenFps`` and ``ScreenScale`` configuration parameters; added |
|
|
@@ -6,6 +6,9 @@ SkoolKit components
|
|
|
6
6
|
SkoolKit relies on several components in order to function:
|
|
7
7
|
|
|
8
8
|
* :ref:`assembler`
|
|
9
|
+
* :ref:`audioWriter`
|
|
10
|
+
* :ref:`codeMapReader`
|
|
11
|
+
* :ref:`commentGenerator`
|
|
9
12
|
* :ref:`ctlComposer`
|
|
10
13
|
* :ref:`ctlGenerator`
|
|
11
14
|
* :ref:`disassembler`
|
|
@@ -30,6 +33,9 @@ or in `~/.skoolkit`. The default contents of this section are as follows::
|
|
|
30
33
|
|
|
31
34
|
[skoolkit]
|
|
32
35
|
Assembler=skoolkit.z80.Assembler
|
|
36
|
+
AudioWriter=skoolkit.audio.AudioWriter
|
|
37
|
+
CodeMapReader=skoolkit.snactl
|
|
38
|
+
CommentGenerator=skoolkit.comment.CommentGenerator
|
|
33
39
|
ControlDirectiveComposer=skoolkit.skoolctl.ControlDirectiveComposer
|
|
34
40
|
ControlFileGenerator=skoolkit.snactl
|
|
35
41
|
DefaultDisassemblyStartAddress=16384
|
|
@@ -66,6 +72,47 @@ must supply the following API functions, in common with skoolkit.z80.Assembler:
|
|
|
66
72
|
:members: assemble, get_size
|
|
67
73
|
:noindex:
|
|
68
74
|
|
|
75
|
+
.. _audioWriter:
|
|
76
|
+
|
|
77
|
+
Audio writer
|
|
78
|
+
------------
|
|
79
|
+
This class is responsible for writing audio files. It must supply the following
|
|
80
|
+
API methods, in common with skoolkit.audio.AudioWriter:
|
|
81
|
+
|
|
82
|
+
.. autoclass:: skoolkit.audio.AudioWriter
|
|
83
|
+
:members: formats, write_audio
|
|
84
|
+
:noindex:
|
|
85
|
+
|
|
86
|
+
.. _codeMapReader:
|
|
87
|
+
|
|
88
|
+
Code map reader
|
|
89
|
+
---------------
|
|
90
|
+
This object is reponsible for generating a list of code block start addresses
|
|
91
|
+
and lengths from a code map file and corresponding snapshot. The code map
|
|
92
|
+
reader object must supply the following API function, in common with
|
|
93
|
+
skoolkit.snactl:
|
|
94
|
+
|
|
95
|
+
.. automodule:: skoolkit.snactl
|
|
96
|
+
:members: read_map
|
|
97
|
+
:noindex:
|
|
98
|
+
|
|
99
|
+
If **read_map()** encounters an error while reading a code map file, it should
|
|
100
|
+
raise a CodeMapError:
|
|
101
|
+
|
|
102
|
+
.. autoclass:: skoolkit.snactl.CodeMapError
|
|
103
|
+
:noindex:
|
|
104
|
+
|
|
105
|
+
.. _commentGenerator:
|
|
106
|
+
|
|
107
|
+
Comment generator
|
|
108
|
+
-----------------
|
|
109
|
+
This class is responsible for generating instruction comments. It must supply
|
|
110
|
+
the following API method, in common with skoolkit.comment.CommentGenerator:
|
|
111
|
+
|
|
112
|
+
.. autoclass:: skoolkit.comment.CommentGenerator
|
|
113
|
+
:members: get_comment
|
|
114
|
+
:noindex:
|
|
115
|
+
|
|
69
116
|
.. _ctlComposer:
|
|
70
117
|
|
|
71
118
|
Control directive composer
|
|
@@ -125,8 +125,8 @@ text, data or code, and then edit the control file (`game.ctl`) accordingly.
|
|
|
125
125
|
To generate a better control file, you could use a code execution map to tell
|
|
126
126
|
`sna2ctl.py` where at least some of the code is in the snapshot. `sna2ctl.py`
|
|
127
127
|
will read a map (otherwise known as a profile or trace) produced by
|
|
128
|
-
:ref:`rzxplay.py`, Fuse, SpecEmu, Spud, Zero or Z80 when
|
|
129
|
-
``-m`` option::
|
|
128
|
+
:ref:`rzxplay.py`, :ref:`trace.py`, Fuse, SpecEmu, Spud, Zero or Z80 when
|
|
129
|
+
specified by the ``-m`` option::
|
|
130
130
|
|
|
131
131
|
$ sna2ctl.py -m game.map game.z80 > game.ctl
|
|
132
132
|
|
|
@@ -122,7 +122,7 @@ With this method (and an appropriate implementation of the `build_sprite`
|
|
|
122
122
|
method) in place, it's possible to use a ``#CALL`` macro like this::
|
|
123
123
|
|
|
124
124
|
#UDGTABLE
|
|
125
|
-
{ #CALL
|
|
125
|
+
{ #CALL(sprite(3,jumping)) }
|
|
126
126
|
{ Sprite 3 (jumping) }
|
|
127
127
|
TABLE#
|
|
128
128
|
|
|
@@ -141,11 +141,35 @@ this:
|
|
|
141
141
|
|
|
142
142
|
With this method in place, it's possible to use a ``#CALL`` macro like this::
|
|
143
143
|
|
|
144
|
-
; This ASM file was generated on #CALL
|
|
144
|
+
; This ASM file was generated on #CALL(timestamp())
|
|
145
145
|
|
|
146
146
|
Note that if the return value of a ``#CALL`` method contains skool macros, then
|
|
147
147
|
they will be expanded.
|
|
148
148
|
|
|
149
|
+
#CALL functions
|
|
150
|
+
---------------
|
|
151
|
+
The :ref:`CALL` macro can be used not only to call a method on an HtmlWriter or
|
|
152
|
+
AsmWriter subclass, but also to call an arbitrary function. This approach might
|
|
153
|
+
be preferable if you don't need to make use of any of the methods or attributes
|
|
154
|
+
on the HtmlWriter/AsmWriter object, and the desired output is the same
|
|
155
|
+
regardless of the output mode (HTML or ASM).
|
|
156
|
+
|
|
157
|
+
Suppose you have the following string-reversing function defined in
|
|
158
|
+
`mods/custom.py`:
|
|
159
|
+
|
|
160
|
+
.. code-block:: python
|
|
161
|
+
|
|
162
|
+
def rev(s):
|
|
163
|
+
return s[::-1]
|
|
164
|
+
|
|
165
|
+
Then you could call the **rev** function like this::
|
|
166
|
+
|
|
167
|
+
; This string reversed is "#CALL(mods:custom.rev(#STR40000))".
|
|
168
|
+
t40000 DEFM "hello",0
|
|
169
|
+
|
|
170
|
+
Note that unlike when calling a method on an HtmlWriter subclass, no `cwd`
|
|
171
|
+
parameter is passed to the function.
|
|
172
|
+
|
|
149
173
|
Skool macros
|
|
150
174
|
------------
|
|
151
175
|
Another way to add a custom method is to implement it as a skool macro. The
|
|
@@ -253,6 +277,9 @@ to parse the parameters of a skool macro.
|
|
|
253
277
|
.. autofunction:: skoolkit.skoolmacro.parse_image_macro
|
|
254
278
|
:noindex:
|
|
255
279
|
|
|
280
|
+
.. versionchanged:: 9.5
|
|
281
|
+
Added the *xparse* and *xpargs* parameters.
|
|
282
|
+
|
|
256
283
|
.. versionchanged:: 8.3
|
|
257
284
|
Added the *fields* parameter.
|
|
258
285
|
|
|
@@ -16,6 +16,9 @@ FILE is '-', ``sna2ctl.py`` reads standard input as a binary file.
|
|
|
16
16
|
|
|
17
17
|
OPTIONS
|
|
18
18
|
=======
|
|
19
|
+
-C, --comments
|
|
20
|
+
Generate instruction comments.
|
|
21
|
+
|
|
19
22
|
-e, --end `ADDR`
|
|
20
23
|
Stop at this address. The default end address is 65536. `ADDR` must be a
|
|
21
24
|
decimal number, or a hexadecimal number prefixed by '0x'.
|
|
@@ -33,8 +36,8 @@ OPTIONS
|
|
|
33
36
|
|
|
34
37
|
-m, --map `FILE`
|
|
35
38
|
Specify a code execution map to use. Code execution maps produced by
|
|
36
|
-
``rzxplay.py`` and by the Fuse, SpecEmu, Spud, Zero and Z80
|
|
37
|
-
emulators are supported.
|
|
39
|
+
``rzxplay.py`` and ``trace.py``, and by the Fuse, SpecEmu, Spud, Zero and Z80
|
|
40
|
+
Spectrum emulators are supported.
|
|
38
41
|
|
|
39
42
|
-o, --org `ADDR`
|
|
40
43
|
Specify the origin address of a binary file. The default origin address is
|
|
@@ -60,6 +63,8 @@ CONFIGURATION
|
|
|
60
63
|
the current working directory or in ``~/.skoolkit``, if present. The recognised
|
|
61
64
|
configuration parameters are:
|
|
62
65
|
|
|
66
|
+
:Comments: Generate instruction comments (``1``), or don't (``0``, the
|
|
67
|
+
default).
|
|
63
68
|
:Dictionary: The name of a file containing a list of allowed words, one per
|
|
64
69
|
line. If specified, a string of characters will be marked as text only if
|
|
65
70
|
it contains at least one of the words in this file.
|
|
@@ -23,6 +23,9 @@ OPTIONS
|
|
|
23
23
|
used, if present. If `PATH` is '-', standard input is used. If `PATH` is '0',
|
|
24
24
|
no control file is used. This option may be used multiple times.
|
|
25
25
|
|
|
26
|
+
-C, --comments
|
|
27
|
+
Generate instruction comments.
|
|
28
|
+
|
|
26
29
|
-d, --defb `SIZE`
|
|
27
30
|
Disassemble as DEFB statements of this size (instead of as code).
|
|
28
31
|
|
|
@@ -73,6 +76,8 @@ configuration parameters are:
|
|
|
73
76
|
decimal (``10``, the default).
|
|
74
77
|
:Case: Write the disassembly in lower case (``1``) or upper case (``2``, the
|
|
75
78
|
default).
|
|
79
|
+
:Comments: Generate instruction comments (``1``), or don't (``0``, the
|
|
80
|
+
default).
|
|
76
81
|
:CommentWidthMin: Minimum width of the instruction comment field in the skool
|
|
77
82
|
file (default: ``10``).
|
|
78
83
|
:DefbSize: Maximum number of bytes in a DEFB statement (default: ``8``).
|
|
@@ -20,6 +20,11 @@ OPTIONS
|
|
|
20
20
|
'dest' must each be a decimal number, or a hexadecimal number prefixed by
|
|
21
21
|
'0x'.
|
|
22
22
|
|
|
23
|
+
--patch `[p:]a,file`
|
|
24
|
+
Apply a binary patch file at address 'a' in RAM bank 'p'. This option may be
|
|
25
|
+
used multiple times. 'a' must be a decimal number, or a hexadecimal number
|
|
26
|
+
prefixed by '0x'.
|
|
27
|
+
|
|
23
28
|
-p, --poke `[p:]a[-b[-c]],[^+]v`
|
|
24
29
|
POKE N,v in RAM bank p for N in {a, a+c, a+2c..., b}. Prefix 'v' with '^' to
|
|
25
30
|
perform an XOR operation, or '+' to perform an ADD operation. This option may
|
|
@@ -456,6 +456,8 @@ configuration parameters are:
|
|
|
456
456
|
separated by commas (default: ``$,02X,04X``). The byte and word formats are
|
|
457
457
|
standard Python format specifiers for numeric values, and default to empty
|
|
458
458
|
strings if not supplied.
|
|
459
|
+
:UserAgent: The value of the User-Agent header in HTTP/HTTPS requests
|
|
460
|
+
(default: empty string).
|
|
459
461
|
|
|
460
462
|
``TraceLine`` is a standard Python format string that recognises the following
|
|
461
463
|
replacement fields:
|
|
@@ -39,6 +39,9 @@ OPTIONS
|
|
|
39
39
|
overriding any value found in ``skoolkit.ini``. This option may be used
|
|
40
40
|
multiple times.
|
|
41
41
|
|
|
42
|
+
--map FILE
|
|
43
|
+
Log addresses of executed instructions to a file.
|
|
44
|
+
|
|
42
45
|
-m, --max-operations `MAX`
|
|
43
46
|
Maximum number of instructions to execute. Overrides the `STOP` address (if
|
|
44
47
|
given).
|
|
@@ -86,7 +89,9 @@ OPTIONS
|
|
|
86
89
|
hexadecimal number prefixed by '0x'.
|
|
87
90
|
|
|
88
91
|
--screen
|
|
89
|
-
Display screen contents while running (requires
|
|
92
|
+
Display screen contents and respond to keypresses while running (requires
|
|
93
|
+
pygame). The left shift key is mapped to CAPS SHIFT on the Spectrum keyboard,
|
|
94
|
+
and the left Ctrl key is mapped to SYMBOL SHIFT.
|
|
90
95
|
|
|
91
96
|
--state name=value
|
|
92
97
|
Set a hardware state attribute before execution begins. Do ``--state help``
|