skoolkit 9.6__tar.gz → 10.0__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.6/skoolkit.egg-info → skoolkit-10.0}/PKG-INFO +3 -4
- {skoolkit-9.6 → skoolkit-10.0}/c/csimulator.c +103 -39
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/asm.rst.txt +4 -1
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog.rst.txt +43 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/commands.rst.txt +47 -15
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/components.rst.txt +3 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/rzxplay.py.rst.txt +6 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/tap2sna.py.rst.txt +5 -5
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/trace.py.rst.txt +10 -2
- skoolkit-10.0/docs/_sources/migration.rst.txt +95 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/ref-files.rst.txt +15 -11
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/skool-macros.rst.txt +87 -115
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/usage.rst.txt +1 -1
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/basic.css +27 -13
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/classic.css +2 -9
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/doctools.js +0 -7
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/documentation_options.js +2 -3
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/language_data.js +1 -8
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/pygments.css +1 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/searchtools.js +141 -86
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/sidebar.js +0 -6
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/sphinx_highlight.js +6 -4
- {skoolkit-9.6 → skoolkit-10.0}/docs/asm-templates.html +25 -29
- {skoolkit-9.6 → skoolkit-10.0}/docs/asm.html +67 -68
- {skoolkit-9.6 → skoolkit-10.0}/docs/assemblers.html +28 -32
- {skoolkit-9.6 → skoolkit-10.0}/docs/changelog.html +90 -48
- {skoolkit-9.6 → skoolkit-10.0}/docs/changelog1.html +32 -36
- {skoolkit-9.6 → skoolkit-10.0}/docs/changelog2.html +40 -44
- {skoolkit-9.6 → skoolkit-10.0}/docs/changelog3.html +35 -39
- {skoolkit-9.6 → skoolkit-10.0}/docs/changelog4.html +26 -30
- {skoolkit-9.6 → skoolkit-10.0}/docs/changelog5.html +24 -28
- {skoolkit-9.6 → skoolkit-10.0}/docs/changelog6.html +24 -28
- {skoolkit-9.6 → skoolkit-10.0}/docs/changelog7.html +22 -26
- {skoolkit-9.6 → skoolkit-10.0}/docs/changelog8.html +30 -34
- {skoolkit-9.6 → skoolkit-10.0}/docs/commands.html +147 -114
- {skoolkit-9.6 → skoolkit-10.0}/docs/components.html +40 -42
- {skoolkit-9.6 → skoolkit-10.0}/docs/control-files.html +52 -56
- {skoolkit-9.6 → skoolkit-10.0}/docs/diy.html +27 -31
- {skoolkit-9.6 → skoolkit-10.0}/docs/extending.html +44 -48
- {skoolkit-9.6 → skoolkit-10.0}/docs/genindex.html +17 -21
- {skoolkit-9.6 → skoolkit-10.0}/docs/html-templates.html +55 -59
- {skoolkit-9.6 → skoolkit-10.0}/docs/index.html +22 -26
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/bin2sna.py.html +25 -29
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/bin2tap.py.html +25 -29
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/rzxinfo.py.html +23 -27
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/rzxplay.py.html +33 -32
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/skool2asm.py.html +25 -29
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/skool2bin.py.html +24 -28
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/skool2ctl.py.html +24 -28
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/skool2html.py.html +26 -30
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/sna2ctl.py.html +24 -28
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/sna2img.py.html +23 -27
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/sna2skool.py.html +24 -28
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/snapinfo.py.html +24 -28
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/snapmod.py.html +25 -29
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/tap2sna.py.html +43 -47
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/tapinfo.py.html +23 -27
- {skoolkit-9.6 → skoolkit-10.0}/docs/man/trace.py.html +40 -32
- skoolkit-10.0/docs/migration.html +217 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/parsing.html +25 -29
- {skoolkit-9.6 → skoolkit-10.0}/docs/ref-files.html +53 -52
- {skoolkit-9.6 → skoolkit-10.0}/docs/search.html +19 -25
- skoolkit-10.0/docs/searchindex.js +1 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/skool-files.html +27 -31
- {skoolkit-9.6 → skoolkit-10.0}/docs/skool-macros.html +192 -235
- {skoolkit-9.6 → skoolkit-10.0}/docs/usage.html +24 -28
- {skoolkit-9.6 → skoolkit-10.0}/docs/whatis.html +23 -27
- {skoolkit-9.6 → skoolkit-10.0}/examples/hungry_horace.ctl +3 -3
- {skoolkit-9.6 → skoolkit-10.0}/examples/hungry_horace.ref +1 -1
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/bin2sna.py.1 +2 -2
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/bin2tap.py.1 +2 -2
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/rzxinfo.py.1 +2 -2
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/rzxplay.py.1 +8 -2
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/skool2asm.py.1 +4 -6
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/skool2bin.py.1 +4 -6
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/skool2ctl.py.1 +4 -6
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/skool2html.py.1 +4 -6
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/sna2ctl.py.1 +4 -6
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/sna2img.py.1 +2 -2
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/sna2skool.py.1 +4 -6
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/snapinfo.py.1 +4 -6
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/snapmod.py.1 +2 -2
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/tap2sna.py.1 +15 -23
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/tapinfo.py.1 +2 -2
- {skoolkit-9.6 → skoolkit-10.0}/man/man1/trace.py.1 +20 -12
- {skoolkit-9.6 → skoolkit-10.0}/setup.cfg +2 -3
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/__init__.py +4 -4
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/audio.py +70 -95
- skoolkit-10.0/skoolkit/ay.py +251 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/cmiosimulator.py +63 -12
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/comment.py +51 -9
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/config.py +3 -1
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/defaults.py +5 -6
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/disassembler.py +2 -3
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/kbtracer.py +5 -5
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/loadtracer.py +21 -32
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/pagingtracer.py +5 -5
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/rzxplay.py +18 -12
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/screen.py +18 -5
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/simutils.py +11 -6
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolasm.py +2 -5
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolhtml.py +15 -18
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolmacro.py +113 -151
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snapinfo.py +4 -3
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snapshot.py +8 -5
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/tap2sna.py +5 -5
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/trace.py +60 -26
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/traceutils.py +5 -3
- {skoolkit-9.6 → skoolkit-10.0/skoolkit.egg-info}/PKG-INFO +3 -4
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit.egg-info/SOURCES.txt +2 -3
- {skoolkit-9.6 → skoolkit-10.0}/tests/macrotest.py +80 -101
- {skoolkit-9.6 → skoolkit-10.0}/tests/skoolkittest.py +15 -22
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_audio.py +75 -77
- skoolkit-10.0/tests/test_ay.py +149 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_bin2sna.py +2 -2
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_cmiosimulator.py +910 -19
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_comment.py +47 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_disassembler.py +18 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_kbtracer.py +18 -14
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_rzxplay.py +53 -41
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_screen.py +13 -13
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_simulator.py +23 -11
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skool2asm.py +5 -32
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skool2bin.py +12 -15
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skool2ctl.py +7 -12
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skool2html.py +52 -60
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolasm.py +12 -19
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolhtml.py +413 -287
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_sna2ctl.py +7 -14
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_sna2img.py +4 -5
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_sna2skool.py +7 -14
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_snapinfo.py +25 -15
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_snapmod.py +3 -5
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_snapshot.py +9 -6
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_snaskool.py +2 -2
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_tap2sna.py +28 -12
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_trace.py +473 -103
- skoolkit-9.6/docs/_sources/migration.rst.txt +0 -93
- skoolkit-9.6/docs/_static/_sphinx_javascript_frameworks_compat.js +0 -134
- skoolkit-9.6/docs/_static/jquery.js +0 -10907
- skoolkit-9.6/docs/_static/underscore.js +0 -2042
- skoolkit-9.6/docs/migration.html +0 -209
- skoolkit-9.6/docs/searchindex.js +0 -1
- {skoolkit-9.6 → skoolkit-10.0}/COPYING +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/MANIFEST.in +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/bin2sna.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/bin2tap.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/asm-templates.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/assemblers.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog1.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog2.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog3.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog4.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog5.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog6.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog7.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog8.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/control-files.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/diy.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/extending.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/html-templates.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/index.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/bin2sna.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/bin2tap.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/rzxinfo.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/skool2asm.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/skool2bin.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/skool2ctl.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/skool2html.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/sna2ctl.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/sna2img.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/sna2skool.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/snapinfo.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/snapmod.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/tapinfo.py.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/parsing.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/skool-files.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/whatis.rst.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/custom.css +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/file.png +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/minus.png +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/docs/_static/plus.png +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/examples/hungry_horace.t2s +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/long_description.rst +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/pyproject.toml +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/rzxinfo.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/rzxplay.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/setup.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skool2asm.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skool2bin.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skool2ctl.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skool2html.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/basic.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/bin2sna.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/bin2tap.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/components.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/ctlparser.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/graphics.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/image.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/loadsample.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/opcodes.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/pngwriter.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/refparser.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/128-0.rom +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/128-1.rom +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/48.rom +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/plus2-0.rom +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/plus2-1.rom +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit-dark.css +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit-green.css +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit-plum.css +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit-wide.css +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit.css +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/rst.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/rzxinfo.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/simtables.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/simulator.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skool2asm.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skool2bin.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skool2ctl.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skool2html.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolctl.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolparser.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolutils.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/sna2ctl.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/sna2img.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/sna2skool.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snactl.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snapmod.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snaskool.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/tape.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/tapinfo.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/textutils.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit/z80.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit.egg-info/dependency_links.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/skoolkit.egg-info/top_level.txt +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/sna2ctl.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/sna2img.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/sna2skool.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/snapinfo.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/snapmod.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tap2sna.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tapinfo.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_basic.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_bin2tap.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_ctlparser.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_graphics.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_image.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_pagingtracer.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_refparser.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_rzxinfo.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolctl.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolkit.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolmacro.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolparser.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolutils.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_tape.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_tapinfo.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_textutils.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_traceutils.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/tests/test_z80.py +0 -0
- {skoolkit-9.6 → skoolkit-10.0}/trace.py +0 -0
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: skoolkit
|
|
3
|
-
Version:
|
|
3
|
+
Version: 10.0
|
|
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
|
|
7
7
|
Author-email: rjdymond@gmail.com
|
|
8
|
-
License:
|
|
8
|
+
License: GPL-3.0-or-later
|
|
9
9
|
Classifier: Development Status :: 5 - Production/Stable
|
|
10
|
-
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
|
|
11
10
|
Classifier: Operating System :: OS Independent
|
|
12
11
|
Classifier: Programming Language :: Python :: 3
|
|
13
12
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
15
13
|
Classifier: Programming Language :: Python :: 3.10
|
|
16
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
17
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
18
|
Classifier: Topic :: Software Development :: Disassemblers
|
|
20
19
|
Classifier: Topic :: Utilities
|
|
21
20
|
Description-Content-Type: text/x-rst
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
|
|
2
|
+
© 2024-2026 Richard Dymond (rjdymond@gmail.com)
|
|
3
3
|
|
|
4
4
|
This file is part of SkoolKit.
|
|
5
5
|
|
|
@@ -130,6 +130,9 @@ static const int T = 25;
|
|
|
130
130
|
static const int IFF = 26;
|
|
131
131
|
static const int IM = 27;
|
|
132
132
|
static const int HALT = 28;
|
|
133
|
+
#ifdef CONTENTION
|
|
134
|
+
static const int MEMPTR = 29;
|
|
135
|
+
#endif
|
|
133
136
|
|
|
134
137
|
typedef struct {
|
|
135
138
|
const char* name;
|
|
@@ -775,6 +778,9 @@ static int accept_interrupt(CSimulatorObject* self, unsigned prev_pc) {
|
|
|
775
778
|
LD(PC, iaddr);
|
|
776
779
|
LD(IFF, 0);
|
|
777
780
|
LD(HALT, 0);
|
|
781
|
+
#ifdef CONTENTION
|
|
782
|
+
LD(MEMPTR, iaddr);
|
|
783
|
+
#endif
|
|
778
784
|
return 1;
|
|
779
785
|
}
|
|
780
786
|
|
|
@@ -931,6 +937,7 @@ static void af_xy(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
931
937
|
unsigned pc2 = ADDR(pc + 2);
|
|
932
938
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, pc2, 3, pc2, 1, pc2, 1, pc2, 1, pc2, 1, pc2, 1, addr, 3);
|
|
933
939
|
}
|
|
940
|
+
LD(MEMPTR, addr);
|
|
934
941
|
#endif
|
|
935
942
|
byte* values = table[REG(A)][PEEK(addr)];
|
|
936
943
|
LD(A, values[0]);
|
|
@@ -1028,17 +1035,14 @@ static void afc_xy(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1028
1035
|
unsigned pc2 = ADDR(pc + 2);
|
|
1029
1036
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, pc2, 3, pc2, 1, pc2, 1, pc2, 1, pc2, 1, pc2, 1, addr, 3);
|
|
1030
1037
|
}
|
|
1038
|
+
LD(MEMPTR, addr);
|
|
1031
1039
|
#endif
|
|
1032
1040
|
byte* values = table[REG(F) & 1][REG(A)][PEEK(addr)];
|
|
1033
1041
|
LD(A, values[0]);
|
|
1034
1042
|
LD(F, values[1]);
|
|
1035
1043
|
|
|
1036
1044
|
INC_R(2);
|
|
1037
|
-
#ifdef CONTENTION
|
|
1038
1045
|
INC_T(19);
|
|
1039
|
-
#else
|
|
1040
|
-
INC_T(19);
|
|
1041
|
-
#endif
|
|
1042
1046
|
INC_PC(3);
|
|
1043
1047
|
}
|
|
1044
1048
|
|
|
@@ -1105,6 +1109,7 @@ static void f_xy(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1105
1109
|
unsigned pc3 = ADDR(pc + 3);
|
|
1106
1110
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, ADDR(pc + 2), 3, pc3, 3, pc3, 1, pc3, 1, addr, 3, addr, 1, addr, 3);
|
|
1107
1111
|
}
|
|
1112
|
+
LD(MEMPTR, addr);
|
|
1108
1113
|
#endif
|
|
1109
1114
|
byte* values = table[PEEK(addr)];
|
|
1110
1115
|
LD(F, values[1]);
|
|
@@ -1203,6 +1208,7 @@ static void fc_xy(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1203
1208
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, pc2, 3, pc3, 3, pc3, 1, pc3, 1, addr, 3, addr, 1, addr, 3);
|
|
1204
1209
|
}
|
|
1205
1210
|
}
|
|
1211
|
+
LD(MEMPTR, addr);
|
|
1206
1212
|
#endif
|
|
1207
1213
|
byte* values = table[REG(F) & 1][PEEK(addr)];
|
|
1208
1214
|
LD(F, values[1]);
|
|
@@ -1224,16 +1230,17 @@ static void adc_hl(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1224
1230
|
unsigned rl = args[1];
|
|
1225
1231
|
unsigned long long* reg = self->registers;
|
|
1226
1232
|
|
|
1233
|
+
unsigned h = REG(H);
|
|
1234
|
+
unsigned hl = REG(L) + 256 * h;
|
|
1227
1235
|
#ifdef CONTENTION
|
|
1228
1236
|
CONTEND {
|
|
1229
1237
|
unsigned pc = REG(PC);
|
|
1230
1238
|
unsigned ir = REG(R) + 256 * REG(I);
|
|
1231
1239
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, ir, 1, ir, 1, ir, 1, ir, 1, ir, 1, ir, 1, ir, 1);
|
|
1232
1240
|
}
|
|
1241
|
+
LD(MEMPTR, ADDR(hl + 1));
|
|
1233
1242
|
#endif
|
|
1234
1243
|
unsigned rr = REG(rl) + 256 * REG(rh);
|
|
1235
|
-
unsigned h = REG(H);
|
|
1236
|
-
unsigned hl = REG(L) + 256 * h;
|
|
1237
1244
|
unsigned rr_c = rr + (REG(F) & 1);
|
|
1238
1245
|
unsigned result = hl + rr_c;
|
|
1239
1246
|
unsigned f = 0;
|
|
@@ -1271,6 +1278,8 @@ static void add_rr(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1271
1278
|
int rl = args[6];
|
|
1272
1279
|
unsigned long long* reg = self->registers;
|
|
1273
1280
|
|
|
1281
|
+
unsigned addend_v = REG(rl) + 256 * REG(rh);
|
|
1282
|
+
unsigned augend_v = REG(al) + 256 * REG(ah);
|
|
1274
1283
|
#ifdef CONTENTION
|
|
1275
1284
|
CONTEND {
|
|
1276
1285
|
unsigned pc = REG(PC);
|
|
@@ -1281,9 +1290,8 @@ static void add_rr(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1281
1290
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, ir, 1, ir, 1, ir, 1, ir, 1, ir, 1, ir, 1, ir, 1);
|
|
1282
1291
|
}
|
|
1283
1292
|
}
|
|
1293
|
+
LD(MEMPTR, ADDR(augend_v + 1));
|
|
1284
1294
|
#endif
|
|
1285
|
-
unsigned addend_v = REG(rl) + 256 * REG(rh);
|
|
1286
|
-
unsigned augend_v = REG(al) + 256 * REG(ah);
|
|
1287
1295
|
unsigned result = augend_v + addend_v;
|
|
1288
1296
|
unsigned f = REG(F) & 0xC4; // SZ...P..
|
|
1289
1297
|
if (result > 0xFFFF) {
|
|
@@ -1310,13 +1318,14 @@ static void bit_hl(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1310
1318
|
byte* mem = self->memory;
|
|
1311
1319
|
|
|
1312
1320
|
unsigned hl = REG(L) + 256 * REG(H);
|
|
1321
|
+
LD(F, BIT[REG(F) & 1][b][PEEK(hl)]);
|
|
1313
1322
|
#ifdef CONTENTION
|
|
1314
1323
|
CONTEND {
|
|
1315
1324
|
unsigned pc = REG(PC);
|
|
1316
1325
|
CPATTERN(8, pc, 4, ADDR(pc + 1), 4, hl, 3, hl, 1);
|
|
1317
1326
|
}
|
|
1327
|
+
LD(F, (REG(F) & 0xD7) | ((REG(MEMPTR) >> 8) & 0x28));
|
|
1318
1328
|
#endif
|
|
1319
|
-
LD(F, BIT[REG(F) & 1][b][PEEK(hl)]);
|
|
1320
1329
|
|
|
1321
1330
|
INC_R(2);
|
|
1322
1331
|
INC_T(12);
|
|
@@ -1359,6 +1368,7 @@ static void bit_xy(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1359
1368
|
unsigned pc3 = ADDR(pc + 3);
|
|
1360
1369
|
CPATTERN(16, pc, 4, ADDR(pc + 1), 4, ADDR(pc + 2), 3, pc3, 3, pc3, 1, pc3, 1, addr, 3, addr, 1);
|
|
1361
1370
|
}
|
|
1371
|
+
LD(MEMPTR, addr);
|
|
1362
1372
|
#endif
|
|
1363
1373
|
byte value = BIT[REG(F) & 1][b][PEEK(addr)];
|
|
1364
1374
|
LD(F, (value & 0xD7) + ((addr / 256) & 0x28));
|
|
@@ -1376,10 +1386,12 @@ static void call(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1376
1386
|
|
|
1377
1387
|
if (c_and && (REG(F) & c_and) == c_val) {
|
|
1378
1388
|
#ifdef CONTENTION
|
|
1389
|
+
unsigned pc = REG(PC);
|
|
1379
1390
|
CONTEND {
|
|
1380
|
-
unsigned pc = REG(PC);
|
|
1381
1391
|
CPATTERN(6, pc, 4, ADDR(pc + 1), 3, ADDR(pc + 2), 3);
|
|
1382
1392
|
}
|
|
1393
|
+
byte* mem = self->memory;
|
|
1394
|
+
LD(MEMPTR, PEEK(ADDR(pc + 1)) + 256 * PEEK(ADDR(pc + 2)));
|
|
1383
1395
|
#endif
|
|
1384
1396
|
INC_T(10);
|
|
1385
1397
|
INC_PC(3);
|
|
@@ -1402,6 +1414,7 @@ static void call(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1402
1414
|
unsigned pc2 = ADDR(pc + 2);
|
|
1403
1415
|
CPATTERN(12, pc, 4, ADDR(pc + 1), 3, pc2, 3, pc2, 1, sp, 3, ADDR(sp - 1), 3);
|
|
1404
1416
|
}
|
|
1417
|
+
LD(MEMPTR, REG(PC));
|
|
1405
1418
|
#endif
|
|
1406
1419
|
INC_T(17);
|
|
1407
1420
|
}
|
|
@@ -1449,11 +1462,12 @@ static void cpi(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1449
1462
|
if (repeat && cp && bc) {
|
|
1450
1463
|
LD(F, f + ((REG(PC) / 256) & 0x28) + 0x04); // .Z5.3P..
|
|
1451
1464
|
#ifdef CONTENTION
|
|
1465
|
+
unsigned pc = REG(PC);
|
|
1452
1466
|
CONTEND {
|
|
1453
|
-
unsigned pc = REG(PC);
|
|
1454
1467
|
hl = ADDR(hl - inc);
|
|
1455
1468
|
CPATTERN(26, pc, 4, ADDR(pc + 1), 4, hl, 3, hl, 1, hl, 1, hl, 1, hl, 1, hl, 1, hl, 1, hl, 1, hl, 1, hl, 1, hl, 1);
|
|
1456
1469
|
}
|
|
1470
|
+
LD(MEMPTR, ADDR(pc + 1));
|
|
1457
1471
|
#endif
|
|
1458
1472
|
INC_T(21);
|
|
1459
1473
|
} else {
|
|
@@ -1465,6 +1479,7 @@ static void cpi(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1465
1479
|
hl = ADDR(hl - inc);
|
|
1466
1480
|
CPATTERN(16, pc, 4, ADDR(pc + 1), 4, hl, 3, hl, 1, hl, 1, hl, 1, hl, 1, hl, 1);
|
|
1467
1481
|
}
|
|
1482
|
+
LD(MEMPTR, ADDR(REG(MEMPTR) + inc));
|
|
1468
1483
|
#endif
|
|
1469
1484
|
INC_T(16);
|
|
1470
1485
|
INC_PC(2);
|
|
@@ -1497,18 +1512,18 @@ static void djnz(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1497
1512
|
unsigned b = (REG(B) - 1) % 256;
|
|
1498
1513
|
LD(B, b);
|
|
1499
1514
|
if (b) {
|
|
1515
|
+
unsigned pc = REG(PC);
|
|
1516
|
+
byte* mem = self->memory;
|
|
1517
|
+
unsigned offset = PEEK(ADDR(pc + 1));
|
|
1518
|
+
LD(PC, ADDR(pc + (offset < 128 ? offset + 2 : offset - 254)));
|
|
1500
1519
|
#ifdef CONTENTION
|
|
1501
1520
|
CONTEND {
|
|
1502
|
-
unsigned pc = REG(PC);
|
|
1503
1521
|
unsigned pc1 = ADDR(pc + 1);
|
|
1504
1522
|
CPATTERN(16, pc, 4, REG(R) + 256 * REG(I), 1, pc1, 3, pc1, 1, pc1, 1, pc1, 1, pc1, 1, pc1, 1);
|
|
1505
1523
|
}
|
|
1524
|
+
LD(MEMPTR, REG(PC));
|
|
1506
1525
|
#endif
|
|
1507
1526
|
INC_T(13);
|
|
1508
|
-
unsigned pc = REG(PC);
|
|
1509
|
-
byte* mem = self->memory;
|
|
1510
|
-
unsigned offset = PEEK(ADDR(pc + 1));
|
|
1511
|
-
LD(PC, ADDR(pc + (offset < 128 ? offset + 2 : offset - 254)));
|
|
1512
1527
|
} else {
|
|
1513
1528
|
#ifdef CONTENTION
|
|
1514
1529
|
CONTEND {
|
|
@@ -1598,6 +1613,9 @@ static void ex_sp(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1598
1613
|
}
|
|
1599
1614
|
LD(rl, sp1);
|
|
1600
1615
|
LD(rh, sp2);
|
|
1616
|
+
#ifdef CONTENTION
|
|
1617
|
+
LD(MEMPTR, sp1 + 256 * sp2);
|
|
1618
|
+
#endif
|
|
1601
1619
|
|
|
1602
1620
|
INC_R(r_inc);
|
|
1603
1621
|
INC_T(timing);
|
|
@@ -1680,13 +1698,14 @@ static void in_a(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1680
1698
|
unsigned long long* reg = self->registers;
|
|
1681
1699
|
|
|
1682
1700
|
#ifdef CONTENTION
|
|
1701
|
+
byte* mem = self->memory;
|
|
1702
|
+
unsigned pc = REG(PC);
|
|
1703
|
+
unsigned pc1 = ADDR(pc + 1);
|
|
1704
|
+
unsigned port = PEEK(pc1) + 256 * REG(A);
|
|
1683
1705
|
CONTEND {
|
|
1684
|
-
byte* mem = self->memory;
|
|
1685
|
-
unsigned pc = REG(PC);
|
|
1686
|
-
unsigned pc1 = ADDR(pc + 1);
|
|
1687
|
-
unsigned port = PEEK(pc1) + 256 * REG(A);
|
|
1688
1706
|
CPATTERN(6, pc, 4, pc1, 3, port, 0);
|
|
1689
1707
|
}
|
|
1708
|
+
LD(MEMPTR, ADDR(port + 1));
|
|
1690
1709
|
#endif
|
|
1691
1710
|
unsigned value = 255;
|
|
1692
1711
|
if (self->in_a_n_tracer) {
|
|
@@ -1717,11 +1736,12 @@ static void in_c(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1717
1736
|
unsigned long long* reg = self->registers;
|
|
1718
1737
|
|
|
1719
1738
|
#ifdef CONTENTION
|
|
1739
|
+
unsigned port = REG(C) + 256 * REG(B);
|
|
1720
1740
|
CONTEND {
|
|
1721
1741
|
unsigned pc = REG(PC);
|
|
1722
|
-
unsigned port = REG(C) + 256 * REG(B);
|
|
1723
1742
|
CPATTERN(6, pc, 4, ADDR(pc + 1), 4, port, 0);
|
|
1724
1743
|
}
|
|
1744
|
+
LD(MEMPTR, ADDR(port + 1));
|
|
1725
1745
|
#endif
|
|
1726
1746
|
unsigned value = 255;
|
|
1727
1747
|
if (self->in_r_c_tracer) {
|
|
@@ -1835,25 +1855,27 @@ static void ini(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1835
1855
|
}
|
|
1836
1856
|
LD(F, (b & 0x80) + ((REG(PC) >> 8) & 0x28) + hf + p + n + cf);
|
|
1837
1857
|
#ifdef CONTENTION
|
|
1858
|
+
unsigned pc = REG(PC);
|
|
1838
1859
|
CONTEND {
|
|
1839
|
-
unsigned pc = REG(PC);
|
|
1840
1860
|
unsigned port = c + 256 * ((b + 1) % 256);
|
|
1841
1861
|
unsigned ir = REG(R) + 256 * REG(I);
|
|
1842
1862
|
hl = ADDR(hl - inc);
|
|
1843
1863
|
CPATTERN(20, pc, 4, ADDR(pc + 1), 4, ir, 1, port, 0, hl, 3, hl, 1, hl, 1, hl, 1, hl, 1, hl, 1);
|
|
1844
1864
|
}
|
|
1865
|
+
LD(MEMPTR, ADDR(pc + 1));
|
|
1845
1866
|
#endif
|
|
1846
1867
|
INC_T(21);
|
|
1847
1868
|
} else {
|
|
1848
1869
|
LD(F, (b & 0xA8) + (b == 0) * 0x40 + cf * 0x11 + PARITY[(j % 8) ^ b] + n);
|
|
1849
1870
|
#ifdef CONTENTION
|
|
1871
|
+
unsigned pc = REG(PC);
|
|
1872
|
+
unsigned port = c + 256 * ((b + 1) % 256);
|
|
1850
1873
|
CONTEND {
|
|
1851
|
-
unsigned pc = REG(PC);
|
|
1852
|
-
unsigned port = c + 256 * ((b + 1) % 256);
|
|
1853
1874
|
unsigned ir = REG(R) + 256 * REG(I);
|
|
1854
1875
|
hl = ADDR(hl - inc);
|
|
1855
1876
|
CPATTERN(10, pc, 4, ADDR(pc + 1), 4, ir, 1, port, 0, hl, 3);
|
|
1856
1877
|
}
|
|
1878
|
+
LD(MEMPTR, ADDR(port + inc));
|
|
1857
1879
|
#endif
|
|
1858
1880
|
INC_PC(2);
|
|
1859
1881
|
INC_T(16);
|
|
@@ -1869,10 +1891,12 @@ static void jp(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1869
1891
|
unsigned long long* reg = self->registers;
|
|
1870
1892
|
|
|
1871
1893
|
#ifdef CONTENTION
|
|
1894
|
+
unsigned pc = REG(PC);
|
|
1895
|
+
byte* mem = self->memory;
|
|
1872
1896
|
CONTEND {
|
|
1873
|
-
unsigned pc = REG(PC);
|
|
1874
1897
|
CPATTERN(6, pc, 4, ADDR(pc + 1), 3, ADDR(pc + 2), 3);
|
|
1875
1898
|
}
|
|
1899
|
+
LD(MEMPTR, PEEK(ADDR(REG(PC) + 1)) + 256 * PEEK(ADDR(REG(PC) + 2)));
|
|
1876
1900
|
#endif
|
|
1877
1901
|
if ((REG(F) & c_and) == c_val) {
|
|
1878
1902
|
byte* mem = self->memory;
|
|
@@ -1927,6 +1951,9 @@ static void jr(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
1927
1951
|
byte offset = PEEK(ADDR(REG(PC) + 1));
|
|
1928
1952
|
INC_PC(offset < 128 ? offset + 2 : offset - 254);
|
|
1929
1953
|
INC_T(12);
|
|
1954
|
+
#ifdef CONTENTION
|
|
1955
|
+
LD(MEMPTR, REG(PC));
|
|
1956
|
+
#endif
|
|
1930
1957
|
} else {
|
|
1931
1958
|
#ifdef CONTENTION
|
|
1932
1959
|
CONTEND {
|
|
@@ -2052,6 +2079,9 @@ static void ld_r_rr(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2052
2079
|
CONTEND {
|
|
2053
2080
|
CPATTERN(4, REG(PC), 4, REG(rl) + 256 * REG(rh), 3);
|
|
2054
2081
|
}
|
|
2082
|
+
if (r == A && rh <= D) {
|
|
2083
|
+
LD(MEMPTR, ADDR(REG(rl) + 256 * REG(rh) + 1));
|
|
2084
|
+
}
|
|
2055
2085
|
#endif
|
|
2056
2086
|
LD(r, PEEK(REG(rl) + 256 * REG(rh)));
|
|
2057
2087
|
|
|
@@ -2072,6 +2102,9 @@ static void ld_rr_r(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2072
2102
|
CONTEND {
|
|
2073
2103
|
CPATTERN(4, REG(PC), 4, addr, 3);
|
|
2074
2104
|
}
|
|
2105
|
+
if (r == A && rh <= D) {
|
|
2106
|
+
LD(MEMPTR, ((REG(rl) + 1) & 0xFF) + 256 * REG(A));
|
|
2107
|
+
}
|
|
2075
2108
|
#endif
|
|
2076
2109
|
if (addr > 0x3FFF) {
|
|
2077
2110
|
byte* mem = self->memory;
|
|
@@ -2100,6 +2133,7 @@ static void ld_r_xy(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2100
2133
|
unsigned pc2 = ADDR(pc + 2);
|
|
2101
2134
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, pc2, 3, pc2, 1, pc2, 1, pc2, 1, pc2, 1, pc2, 1, addr, 3);
|
|
2102
2135
|
}
|
|
2136
|
+
LD(MEMPTR, addr);
|
|
2103
2137
|
#endif
|
|
2104
2138
|
LD(r, PEEK(addr));
|
|
2105
2139
|
|
|
@@ -2125,6 +2159,7 @@ static void ld_xy_n(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2125
2159
|
unsigned pc3 = ADDR(pc + 3);
|
|
2126
2160
|
CPATTERN(14, pc, 4, ADDR(pc + 1), 4, pc2, 3, pc3, 3, pc3, 1, pc3, 1, addr, 3);
|
|
2127
2161
|
}
|
|
2162
|
+
LD(MEMPTR, addr);
|
|
2128
2163
|
#endif
|
|
2129
2164
|
if (addr > 0x3FFF) {
|
|
2130
2165
|
POKE(addr, PEEK(ADDR(REG(PC) + 3)));
|
|
@@ -2152,6 +2187,7 @@ static void ld_xy_r(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2152
2187
|
unsigned pc2 = ADDR(pc + 2);
|
|
2153
2188
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, pc2, 3, pc2, 1, pc2, 1, pc2, 1, pc2, 1, pc2, 1, addr, 3);
|
|
2154
2189
|
}
|
|
2190
|
+
LD(MEMPTR, addr);
|
|
2155
2191
|
#endif
|
|
2156
2192
|
if (addr > 0x3FFF) {
|
|
2157
2193
|
POKE(addr, REG(r));
|
|
@@ -2206,6 +2242,7 @@ static void ld_a_m(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2206
2242
|
unsigned pc2 = ADDR(pc + 2);
|
|
2207
2243
|
CPATTERN(8, pc, 4, pc1, 3, pc2, 3, PEEK(pc1) + 256 * PEEK(pc2), 3);
|
|
2208
2244
|
}
|
|
2245
|
+
LD(MEMPTR, ADDR(PEEK(ADDR(REG(PC) + 1)) + 256 * PEEK(ADDR(REG(PC) + 2)) + 1));
|
|
2209
2246
|
#endif
|
|
2210
2247
|
LD(A, PEEK(PEEK(ADDR(REG(PC) + 1)) + 256 * PEEK(ADDR(REG(PC) + 2))));
|
|
2211
2248
|
|
|
@@ -2225,6 +2262,7 @@ static void ld_m_a(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2225
2262
|
unsigned pc = REG(PC);
|
|
2226
2263
|
CPATTERN(8, pc, 4, ADDR(pc + 1), 3, ADDR(pc + 2), 3, addr, 3);
|
|
2227
2264
|
}
|
|
2265
|
+
LD(MEMPTR, ((addr + 1) & 0xFF) + 256 * REG(A));
|
|
2228
2266
|
#endif
|
|
2229
2267
|
if (addr > 0x3FFF) {
|
|
2230
2268
|
POKE(addr, REG(A));
|
|
@@ -2255,6 +2293,7 @@ static void ld_rr_mm(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2255
2293
|
CPATTERN(12, pc, 4, ADDR(pc + 1), 4, ADDR(pc + 2), 3, ADDR(pc + 3), 3, addr, 3, ADDR(addr + 1), 3);
|
|
2256
2294
|
}
|
|
2257
2295
|
}
|
|
2296
|
+
LD(MEMPTR, ADDR(addr + 1));
|
|
2258
2297
|
#endif
|
|
2259
2298
|
if (rl == SP) {
|
|
2260
2299
|
LD(SP, PEEK(addr) + 256 * PEEK(ADDR(addr + 1)));
|
|
@@ -2288,6 +2327,7 @@ static void ld_mm_rr(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2288
2327
|
CPATTERN(12, pc, 4, ADDR(pc + 1), 4, ADDR(pc + 2), 3, ADDR(pc + 3), 3, addr, 3, ADDR(addr + 1), 3);
|
|
2289
2328
|
}
|
|
2290
2329
|
}
|
|
2330
|
+
LD(MEMPTR, ADDR(addr + 1));
|
|
2291
2331
|
#endif
|
|
2292
2332
|
if (rl == SP) {
|
|
2293
2333
|
unsigned sp = REG(SP);
|
|
@@ -2339,12 +2379,13 @@ static void ldi(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2339
2379
|
if (repeat && bc) {
|
|
2340
2380
|
LD(F, (REG(F) & 0xC1) + ((REG(PC) / 256) & 0x28) + 0x04);
|
|
2341
2381
|
#ifdef CONTENTION
|
|
2382
|
+
unsigned pc = REG(PC);
|
|
2342
2383
|
CONTEND {
|
|
2343
|
-
unsigned pc = REG(PC);
|
|
2344
2384
|
hl = ADDR(hl - inc);
|
|
2345
2385
|
de = ADDR(de - inc);
|
|
2346
2386
|
CPATTERN(22, pc, 4, ADDR(pc + 1), 4, hl, 3, de, 3, de, 1, de, 1, de, 1, de, 1, de, 1, de, 1, de, 1);
|
|
2347
2387
|
}
|
|
2388
|
+
LD(MEMPTR, ADDR(pc + 1));
|
|
2348
2389
|
#endif
|
|
2349
2390
|
INC_T(21);
|
|
2350
2391
|
} else {
|
|
@@ -2444,6 +2485,7 @@ static void out_a(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2444
2485
|
unsigned pc = REG(PC);
|
|
2445
2486
|
CPATTERN(6, pc, 4, ADDR(pc + 1), 3, port, 0);
|
|
2446
2487
|
}
|
|
2488
|
+
LD(MEMPTR, ((PEEK(ADDR(REG(PC) + 1)) + 1) & 0xFF) + 256 * REG(A));
|
|
2447
2489
|
#endif
|
|
2448
2490
|
byte value = REG(A);
|
|
2449
2491
|
OUT(port, value);
|
|
@@ -2474,6 +2516,7 @@ static void out_c(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2474
2516
|
unsigned pc = REG(PC);
|
|
2475
2517
|
CPATTERN(6, pc, 4, ADDR(pc + 1), 4, port, 0);
|
|
2476
2518
|
}
|
|
2519
|
+
LD(MEMPTR, ADDR(port + 1));
|
|
2477
2520
|
#endif
|
|
2478
2521
|
byte value = r >= 0 ? REG(r) : 0;
|
|
2479
2522
|
OUT(port, value);
|
|
@@ -2538,13 +2581,14 @@ static void outi(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2538
2581
|
}
|
|
2539
2582
|
LD(F, (b & 0x80) + ((REG(PC) >> 8) & 0x28) + hf + p + n + cf);
|
|
2540
2583
|
#ifdef CONTENTION
|
|
2584
|
+
unsigned pc = REG(PC);
|
|
2541
2585
|
CONTEND {
|
|
2542
|
-
unsigned pc = REG(PC);
|
|
2543
2586
|
unsigned bc = REG(C) + 256 * ((b + 1) % 256);
|
|
2544
2587
|
unsigned ir = REG(R) + 256 * REG(I);
|
|
2545
2588
|
hl = ADDR(hl - inc);
|
|
2546
2589
|
CPATTERN(20, pc, 4, ADDR(pc + 1), 4, ir, 1, hl, 3, port, 0, bc, 1, bc, 1, bc, 1, bc, 1, bc, 1);
|
|
2547
2590
|
}
|
|
2591
|
+
LD(MEMPTR, ADDR(pc + 1));
|
|
2548
2592
|
#endif
|
|
2549
2593
|
INC_T(21);
|
|
2550
2594
|
} else {
|
|
@@ -2556,6 +2600,7 @@ static void outi(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2556
2600
|
hl = ADDR(hl - inc);
|
|
2557
2601
|
CPATTERN(10, pc, 4, ADDR(pc + 1), 4, ir, 1, hl, 3, port, 0);
|
|
2558
2602
|
}
|
|
2603
|
+
LD(MEMPTR, ADDR(port + inc));
|
|
2559
2604
|
#endif
|
|
2560
2605
|
INC_PC(2);
|
|
2561
2606
|
INC_T(16);
|
|
@@ -2689,6 +2734,7 @@ static void res_xy(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2689
2734
|
unsigned pc3 = ADDR(pc + 3);
|
|
2690
2735
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, ADDR(pc + 2), 3, pc3, 3, pc3, 1, pc3, 1, addr, 3, addr, 1, addr, 3);
|
|
2691
2736
|
}
|
|
2737
|
+
LD(MEMPTR, addr);
|
|
2692
2738
|
#endif
|
|
2693
2739
|
byte value = PEEK(addr) & bit;
|
|
2694
2740
|
if (addr > 0x3FFF) {
|
|
@@ -2733,6 +2779,9 @@ static void ret(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2733
2779
|
INC_T(11);
|
|
2734
2780
|
LD(SP, ADDR(sp + 2));
|
|
2735
2781
|
LD(PC, PEEK(sp) + 256 * PEEK(ADDR(sp + 1)));
|
|
2782
|
+
#ifdef CONTENTION
|
|
2783
|
+
LD(MEMPTR, REG(PC));
|
|
2784
|
+
#endif
|
|
2736
2785
|
}
|
|
2737
2786
|
} else {
|
|
2738
2787
|
unsigned sp = REG(SP);
|
|
@@ -2745,6 +2794,9 @@ static void ret(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2745
2794
|
INC_T(10);
|
|
2746
2795
|
LD(SP, ADDR(sp + 2));
|
|
2747
2796
|
LD(PC, PEEK(sp) + 256 * PEEK(ADDR(sp + 1)));
|
|
2797
|
+
#ifdef CONTENTION
|
|
2798
|
+
LD(MEMPTR, REG(PC));
|
|
2799
|
+
#endif
|
|
2748
2800
|
}
|
|
2749
2801
|
|
|
2750
2802
|
INC_R(1);
|
|
@@ -2766,6 +2818,9 @@ static void reti(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2766
2818
|
INC_R(2);
|
|
2767
2819
|
INC_T(14);
|
|
2768
2820
|
LD(PC, PEEK(sp) + 256 * PEEK(ADDR(sp + 1)));
|
|
2821
|
+
#ifdef CONTENTION
|
|
2822
|
+
LD(MEMPTR, REG(PC));
|
|
2823
|
+
#endif
|
|
2769
2824
|
}
|
|
2770
2825
|
|
|
2771
2826
|
/* RLD */
|
|
@@ -2779,6 +2834,7 @@ static void rld(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2779
2834
|
unsigned pc = REG(PC);
|
|
2780
2835
|
CPATTERN(16, pc, 4, ADDR(pc + 1), 4, hl, 3, hl, 1, hl, 1, hl, 1, hl, 1, hl, 3);
|
|
2781
2836
|
}
|
|
2837
|
+
LD(MEMPTR, ADDR(hl + 1));
|
|
2782
2838
|
#endif
|
|
2783
2839
|
unsigned a = REG(A);
|
|
2784
2840
|
byte at_hl = PEEK(hl);
|
|
@@ -2804,6 +2860,7 @@ static void rrd(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2804
2860
|
unsigned pc = REG(PC);
|
|
2805
2861
|
CPATTERN(16, pc, 4, ADDR(pc + 1), 4, hl, 3, hl, 1, hl, 1, hl, 1, hl, 1, hl, 3);
|
|
2806
2862
|
}
|
|
2863
|
+
LD(MEMPTR, ADDR(hl + 1));
|
|
2807
2864
|
#endif
|
|
2808
2865
|
unsigned a = REG(A);
|
|
2809
2866
|
byte at_hl = PEEK(hl);
|
|
@@ -2839,6 +2896,7 @@ static void rst(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2839
2896
|
unsigned ir = REG(R) + 256 * REG(I);
|
|
2840
2897
|
CPATTERN(8, REG(PC), 4, ir, 1, sp, 3, ADDR(sp - 1), 3);
|
|
2841
2898
|
}
|
|
2899
|
+
LD(MEMPTR, addr);
|
|
2842
2900
|
#endif
|
|
2843
2901
|
|
|
2844
2902
|
INC_R(1);
|
|
@@ -2852,16 +2910,17 @@ static void sbc_hl(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2852
2910
|
unsigned rl = args[1];
|
|
2853
2911
|
unsigned long long* reg = self->registers;
|
|
2854
2912
|
|
|
2913
|
+
unsigned h = REG(H);
|
|
2914
|
+
unsigned hl = REG(L) + 256 * h;
|
|
2855
2915
|
#ifdef CONTENTION
|
|
2856
2916
|
CONTEND {
|
|
2857
2917
|
unsigned pc = REG(PC);
|
|
2858
2918
|
unsigned ir = REG(R) + 256 * REG(I);
|
|
2859
2919
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, ir, 1, ir, 1, ir, 1, ir, 1, ir, 1, ir, 1, ir, 1);
|
|
2860
2920
|
}
|
|
2921
|
+
LD(MEMPTR, ADDR(hl + 1));
|
|
2861
2922
|
#endif
|
|
2862
2923
|
unsigned rr = REG(rl) + 256 * REG(rh);
|
|
2863
|
-
unsigned h = REG(H);
|
|
2864
|
-
unsigned hl = REG(L) + 256 * h;
|
|
2865
2924
|
unsigned rr_c = rr + (REG(F) & 1);
|
|
2866
2925
|
unsigned result = (hl - rr_c) & 0xFFFF;
|
|
2867
2926
|
unsigned r_h = result / 256;
|
|
@@ -2948,6 +3007,7 @@ static void set_xy(CSimulatorObject* self, void* lookup, int args[]) {
|
|
|
2948
3007
|
unsigned pc3 = ADDR(pc + 3);
|
|
2949
3008
|
CPATTERN(18, pc, 4, ADDR(pc + 1), 4, ADDR(pc + 2), 3, pc3, 3, pc3, 1, pc3, 1, addr, 3, addr, 1, addr, 3);
|
|
2950
3009
|
}
|
|
3010
|
+
LD(MEMPTR, addr);
|
|
2951
3011
|
#endif
|
|
2952
3012
|
byte value = PEEK(addr) | bit;
|
|
2953
3013
|
if (addr > 0x3FFF) {
|
|
@@ -5383,7 +5443,8 @@ static PyObject* CSimulator_accept_interrupt(CSimulatorObject* self, PyObject* a
|
|
|
5383
5443
|
}
|
|
5384
5444
|
|
|
5385
5445
|
static PyObject* CSimulator_trace(CSimulatorObject* self, PyObject* args, PyObject* kwds) {
|
|
5386
|
-
static char* kwlist[] = {"", "", "", "", "", "", "", "", "", "", NULL};
|
|
5446
|
+
static char* kwlist[] = {"", "", "", "", "", "", "", "", "", "", "", NULL};
|
|
5447
|
+
PyObject* tracer;
|
|
5387
5448
|
PyObject* start_obj;
|
|
5388
5449
|
PyObject* stop_obj;
|
|
5389
5450
|
unsigned long long max_operations;
|
|
@@ -5395,7 +5456,8 @@ static PyObject* CSimulator_trace(CSimulatorObject* self, PyObject* args, PyObje
|
|
|
5395
5456
|
PyObject* disassemble;
|
|
5396
5457
|
PyObject* trace;
|
|
5397
5458
|
|
|
5398
|
-
if (!PyArg_ParseTupleAndKeywords(args, kwds, "
|
|
5459
|
+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOKKiOOOOO", kwlist, &tracer, &start_obj, &stop_obj, &max_operations,
|
|
5460
|
+
&max_time, &interrupts, &draw, &exec_map, &keyboard, &disassemble, &trace)) {
|
|
5399
5461
|
return NULL;
|
|
5400
5462
|
}
|
|
5401
5463
|
|
|
@@ -5499,9 +5561,11 @@ static PyObject* CSimulator_trace(CSimulatorObject* self, PyObject* args, PyObje
|
|
|
5499
5561
|
return NULL;
|
|
5500
5562
|
}
|
|
5501
5563
|
}
|
|
5502
|
-
PyObject*
|
|
5564
|
+
PyObject* border = PyObject_GetAttrString(tracer, "border");
|
|
5565
|
+
PyObject* args = Py_BuildValue("(OIOO)", scr, frame, border, keyboard);
|
|
5503
5566
|
PyObject* rv = PyObject_CallObject(draw, args);
|
|
5504
5567
|
Py_XDECREF(args);
|
|
5568
|
+
Py_XDECREF(border);
|
|
5505
5569
|
Py_XDECREF(scr);
|
|
5506
5570
|
if (rv == NULL) {
|
|
5507
5571
|
return NULL;
|
|
@@ -5533,11 +5597,11 @@ static PyObject* CSimulator_press_keys(CSimulatorObject* self, PyObject* args, P
|
|
|
5533
5597
|
static char* kwlist[] = {"", "", "", "", "", NULL};
|
|
5534
5598
|
PyObject* keys;
|
|
5535
5599
|
unsigned stop;
|
|
5536
|
-
unsigned timeout;
|
|
5600
|
+
unsigned long long timeout;
|
|
5537
5601
|
PyObject* disassemble;
|
|
5538
5602
|
PyObject* trace;
|
|
5539
5603
|
|
|
5540
|
-
if (!PyArg_ParseTupleAndKeywords(args, kwds, "
|
|
5604
|
+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OIKOO", kwlist, &keys, &stop, &timeout, &disassemble, &trace)) {
|
|
5541
5605
|
return NULL;
|
|
5542
5606
|
}
|
|
5543
5607
|
|
|
@@ -5638,11 +5702,11 @@ static PyObject* CSimulator_press_keys(CSimulatorObject* self, PyObject* args, P
|
|
|
5638
5702
|
static PyObject* CSimulator_press(CSimulatorObject* self, PyObject* args, PyObject* kwds) {
|
|
5639
5703
|
static char* kwlist[] = {"", "", "", "", NULL};
|
|
5640
5704
|
PyObject* keys;
|
|
5641
|
-
unsigned timeout;
|
|
5705
|
+
unsigned long long timeout;
|
|
5642
5706
|
PyObject* disassemble;
|
|
5643
5707
|
PyObject* trace;
|
|
5644
5708
|
|
|
5645
|
-
if (!PyArg_ParseTupleAndKeywords(args, kwds, "
|
|
5709
|
+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OKOO", kwlist, &keys, &timeout, &disassemble, &trace)) {
|
|
5646
5710
|
return NULL;
|
|
5647
5711
|
}
|
|
5648
5712
|
|
|
@@ -6010,11 +6074,11 @@ static PyObject* CSimulator_load(CSimulatorObject* self, PyObject* args, PyObjec
|
|
|
6010
6074
|
PyObject* stop_obj;
|
|
6011
6075
|
int fast_load;
|
|
6012
6076
|
int finish_tape;
|
|
6013
|
-
unsigned timeout;
|
|
6077
|
+
unsigned long long timeout;
|
|
6014
6078
|
PyObject* disassemble;
|
|
6015
6079
|
PyObject* trace;
|
|
6016
6080
|
|
|
6017
|
-
if (!PyArg_ParseTupleAndKeywords(args, kwds, "
|
|
6081
|
+
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OiiKOO", kwlist, &stop_obj, &fast_load, &finish_tape, &timeout, &disassemble, &trace)) {
|
|
6018
6082
|
return NULL;
|
|
6019
6083
|
}
|
|
6020
6084
|
|
|
@@ -1306,6 +1306,8 @@ Some reasons why you might want to do this are:
|
|
|
1306
1306
|
otherwise) with the :ref:`SIM` macro
|
|
1307
1307
|
* to create a WAV file of the ROM's 'BEEPER' subroutine in action with the
|
|
1308
1308
|
:ref:`AUDIO` macro
|
|
1309
|
+
* to make the ROM interrupt routine available when using the :ref:`AUDIO`,
|
|
1310
|
+
:ref:`SIM` or :ref:`TSTATES` macro with interrupt routine execution enabled
|
|
1309
1311
|
* to gain access to the Spectrum character set at 0x3D00 for the purpose of
|
|
1310
1312
|
creating images of text
|
|
1311
1313
|
|
|
@@ -1371,7 +1373,8 @@ Recognised property names and their default values are:
|
|
|
1371
1373
|
(default: ``10``)
|
|
1372
1374
|
* ``crlf`` - ``1`` to use CR+LF to terminate lines, or ``0`` to use the system
|
|
1373
1375
|
default (default: ``0``)
|
|
1374
|
-
* ``handle-unsupported-macros`` - how to handle an unsupported macro
|
|
1376
|
+
* ``handle-unsupported-macros`` - how to handle an unsupported macro (i.e.
|
|
1377
|
+
:ref:`AUDIO` or any of the :ref:`image macros <imageMacros>`): ``1`` to
|
|
1375
1378
|
expand it to an empty string, or ``0`` to exit with an error (default: ``0``)
|
|
1376
1379
|
* ``indent`` - the number of spaces by which to indent instructions (default:
|
|
1377
1380
|
``2``)
|
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
10.0 (2026-04-04)
|
|
5
|
+
-----------------
|
|
6
|
+
* Dropped support for Python 3.9
|
|
7
|
+
* Added the ``--ay`` option to :ref:`trace.py` (for capturing AY audio when
|
|
8
|
+
writing a WAV file)
|
|
9
|
+
* Added the ``ay`` parameter to the :ref:`AUDIO` macro (to set whether AY
|
|
10
|
+
audio is captured)
|
|
11
|
+
* Added the ``--beeper`` option to :ref:`trace.py` (for capturing beeper audio
|
|
12
|
+
as well when ``--ay`` is specified)
|
|
13
|
+
* Added the ``bpr`` parameter to the :ref:`AUDIO` macro (to set whether beeper
|
|
14
|
+
audio is captured along with AY audio)
|
|
15
|
+
* Added support for the MEMPTR register to CMIOSimulator and CCMIOSimulator
|
|
16
|
+
* Added the ``memptr`` parameter to the :ref:`SIM` macro (to set the MEMPTR
|
|
17
|
+
register)
|
|
18
|
+
* :ref:`snapinfo.py` now shows the MEMPTR register value in SZX snapshots
|
|
19
|
+
* Added support to :ref:`trace.py` for setting the MEMPTR register before
|
|
20
|
+
execution begins, for reading and writing MEMPTR in SZX snapshots, and for
|
|
21
|
+
tracing its value via the ``r[memptr]`` replacement field in the
|
|
22
|
+
``TraceLine*`` configuration parameters
|
|
23
|
+
* Added support to :ref:`tap2sna.py` for setting the MEMPTR register in SZX
|
|
24
|
+
snapshots, and for tracing its value via the ``r[memptr]`` replacement field
|
|
25
|
+
in the ``TraceLine`` configuration parameter
|
|
26
|
+
* Added support to :ref:`bin2sna.py` and :ref:`snapmod.py` for setting the
|
|
27
|
+
MEMPTR register in SZX snapshots
|
|
28
|
+
* Added the ``TraceHeader`` and ``TraceHeader2`` configuration parameters for
|
|
29
|
+
:ref:`trace.py <trace-conf>` (to specify headers to print before a trace)
|
|
30
|
+
* Added support to the :ref:`AUDIO` macro for keyword arguments
|
|
31
|
+
* Added support to :ref:`rzxplay.py` for ignoring any snapshots after the first
|
|
32
|
+
one (which is useful for playing some RZX files created by the Fuse emulator)
|
|
33
|
+
* Added a border area to the screen displayed by :ref:`rzxplay.py` and
|
|
34
|
+
:ref:`trace.py`
|
|
35
|
+
* Updated the comments generated for 'IN r,(C)' immediately after 'LD BC,$XXFE'
|
|
36
|
+
and 'IN A,($FE)' immediately after 'LD A,n' when a single half-row of the
|
|
37
|
+
keyboard is read
|
|
38
|
+
* Updated the default values of ``ContentionBegin``, ``ContentionEnd`` and
|
|
39
|
+
``InterruptDelay`` in the :ref:`ref-AudioWriter` section
|
|
40
|
+
* Added support for multiple values to the ``InterruptDelay`` parameter in the
|
|
41
|
+
:ref:`ref-AudioWriter` section
|
|
42
|
+
* Fixed the bug in CSimulator that restricts the ``timeout`` simulated load
|
|
43
|
+
configuration parameter to a maximum value of 1227 seconds
|
|
44
|
+
* Fixed how :ref:`tap2sna.py` handles zero-length pulses in the encodings of 0s
|
|
45
|
+
and 1s in a PZX DATA block
|
|
46
|
+
|
|
4
47
|
9.6 (2025-05-12)
|
|
5
48
|
----------------
|
|
6
49
|
* :ref:`tap2sna.py` can now load from two tape files (e.g. when side 1 and side
|