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.
Files changed (262) hide show
  1. {skoolkit-9.6/skoolkit.egg-info → skoolkit-10.0}/PKG-INFO +3 -4
  2. {skoolkit-9.6 → skoolkit-10.0}/c/csimulator.c +103 -39
  3. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/asm.rst.txt +4 -1
  4. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog.rst.txt +43 -0
  5. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/commands.rst.txt +47 -15
  6. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/components.rst.txt +3 -0
  7. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/rzxplay.py.rst.txt +6 -0
  8. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/tap2sna.py.rst.txt +5 -5
  9. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/trace.py.rst.txt +10 -2
  10. skoolkit-10.0/docs/_sources/migration.rst.txt +95 -0
  11. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/ref-files.rst.txt +15 -11
  12. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/skool-macros.rst.txt +87 -115
  13. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/usage.rst.txt +1 -1
  14. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/basic.css +27 -13
  15. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/classic.css +2 -9
  16. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/doctools.js +0 -7
  17. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/documentation_options.js +2 -3
  18. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/language_data.js +1 -8
  19. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/pygments.css +1 -0
  20. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/searchtools.js +141 -86
  21. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/sidebar.js +0 -6
  22. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/sphinx_highlight.js +6 -4
  23. {skoolkit-9.6 → skoolkit-10.0}/docs/asm-templates.html +25 -29
  24. {skoolkit-9.6 → skoolkit-10.0}/docs/asm.html +67 -68
  25. {skoolkit-9.6 → skoolkit-10.0}/docs/assemblers.html +28 -32
  26. {skoolkit-9.6 → skoolkit-10.0}/docs/changelog.html +90 -48
  27. {skoolkit-9.6 → skoolkit-10.0}/docs/changelog1.html +32 -36
  28. {skoolkit-9.6 → skoolkit-10.0}/docs/changelog2.html +40 -44
  29. {skoolkit-9.6 → skoolkit-10.0}/docs/changelog3.html +35 -39
  30. {skoolkit-9.6 → skoolkit-10.0}/docs/changelog4.html +26 -30
  31. {skoolkit-9.6 → skoolkit-10.0}/docs/changelog5.html +24 -28
  32. {skoolkit-9.6 → skoolkit-10.0}/docs/changelog6.html +24 -28
  33. {skoolkit-9.6 → skoolkit-10.0}/docs/changelog7.html +22 -26
  34. {skoolkit-9.6 → skoolkit-10.0}/docs/changelog8.html +30 -34
  35. {skoolkit-9.6 → skoolkit-10.0}/docs/commands.html +147 -114
  36. {skoolkit-9.6 → skoolkit-10.0}/docs/components.html +40 -42
  37. {skoolkit-9.6 → skoolkit-10.0}/docs/control-files.html +52 -56
  38. {skoolkit-9.6 → skoolkit-10.0}/docs/diy.html +27 -31
  39. {skoolkit-9.6 → skoolkit-10.0}/docs/extending.html +44 -48
  40. {skoolkit-9.6 → skoolkit-10.0}/docs/genindex.html +17 -21
  41. {skoolkit-9.6 → skoolkit-10.0}/docs/html-templates.html +55 -59
  42. {skoolkit-9.6 → skoolkit-10.0}/docs/index.html +22 -26
  43. {skoolkit-9.6 → skoolkit-10.0}/docs/man/bin2sna.py.html +25 -29
  44. {skoolkit-9.6 → skoolkit-10.0}/docs/man/bin2tap.py.html +25 -29
  45. {skoolkit-9.6 → skoolkit-10.0}/docs/man/rzxinfo.py.html +23 -27
  46. {skoolkit-9.6 → skoolkit-10.0}/docs/man/rzxplay.py.html +33 -32
  47. {skoolkit-9.6 → skoolkit-10.0}/docs/man/skool2asm.py.html +25 -29
  48. {skoolkit-9.6 → skoolkit-10.0}/docs/man/skool2bin.py.html +24 -28
  49. {skoolkit-9.6 → skoolkit-10.0}/docs/man/skool2ctl.py.html +24 -28
  50. {skoolkit-9.6 → skoolkit-10.0}/docs/man/skool2html.py.html +26 -30
  51. {skoolkit-9.6 → skoolkit-10.0}/docs/man/sna2ctl.py.html +24 -28
  52. {skoolkit-9.6 → skoolkit-10.0}/docs/man/sna2img.py.html +23 -27
  53. {skoolkit-9.6 → skoolkit-10.0}/docs/man/sna2skool.py.html +24 -28
  54. {skoolkit-9.6 → skoolkit-10.0}/docs/man/snapinfo.py.html +24 -28
  55. {skoolkit-9.6 → skoolkit-10.0}/docs/man/snapmod.py.html +25 -29
  56. {skoolkit-9.6 → skoolkit-10.0}/docs/man/tap2sna.py.html +43 -47
  57. {skoolkit-9.6 → skoolkit-10.0}/docs/man/tapinfo.py.html +23 -27
  58. {skoolkit-9.6 → skoolkit-10.0}/docs/man/trace.py.html +40 -32
  59. skoolkit-10.0/docs/migration.html +217 -0
  60. {skoolkit-9.6 → skoolkit-10.0}/docs/parsing.html +25 -29
  61. {skoolkit-9.6 → skoolkit-10.0}/docs/ref-files.html +53 -52
  62. {skoolkit-9.6 → skoolkit-10.0}/docs/search.html +19 -25
  63. skoolkit-10.0/docs/searchindex.js +1 -0
  64. {skoolkit-9.6 → skoolkit-10.0}/docs/skool-files.html +27 -31
  65. {skoolkit-9.6 → skoolkit-10.0}/docs/skool-macros.html +192 -235
  66. {skoolkit-9.6 → skoolkit-10.0}/docs/usage.html +24 -28
  67. {skoolkit-9.6 → skoolkit-10.0}/docs/whatis.html +23 -27
  68. {skoolkit-9.6 → skoolkit-10.0}/examples/hungry_horace.ctl +3 -3
  69. {skoolkit-9.6 → skoolkit-10.0}/examples/hungry_horace.ref +1 -1
  70. {skoolkit-9.6 → skoolkit-10.0}/man/man1/bin2sna.py.1 +2 -2
  71. {skoolkit-9.6 → skoolkit-10.0}/man/man1/bin2tap.py.1 +2 -2
  72. {skoolkit-9.6 → skoolkit-10.0}/man/man1/rzxinfo.py.1 +2 -2
  73. {skoolkit-9.6 → skoolkit-10.0}/man/man1/rzxplay.py.1 +8 -2
  74. {skoolkit-9.6 → skoolkit-10.0}/man/man1/skool2asm.py.1 +4 -6
  75. {skoolkit-9.6 → skoolkit-10.0}/man/man1/skool2bin.py.1 +4 -6
  76. {skoolkit-9.6 → skoolkit-10.0}/man/man1/skool2ctl.py.1 +4 -6
  77. {skoolkit-9.6 → skoolkit-10.0}/man/man1/skool2html.py.1 +4 -6
  78. {skoolkit-9.6 → skoolkit-10.0}/man/man1/sna2ctl.py.1 +4 -6
  79. {skoolkit-9.6 → skoolkit-10.0}/man/man1/sna2img.py.1 +2 -2
  80. {skoolkit-9.6 → skoolkit-10.0}/man/man1/sna2skool.py.1 +4 -6
  81. {skoolkit-9.6 → skoolkit-10.0}/man/man1/snapinfo.py.1 +4 -6
  82. {skoolkit-9.6 → skoolkit-10.0}/man/man1/snapmod.py.1 +2 -2
  83. {skoolkit-9.6 → skoolkit-10.0}/man/man1/tap2sna.py.1 +15 -23
  84. {skoolkit-9.6 → skoolkit-10.0}/man/man1/tapinfo.py.1 +2 -2
  85. {skoolkit-9.6 → skoolkit-10.0}/man/man1/trace.py.1 +20 -12
  86. {skoolkit-9.6 → skoolkit-10.0}/setup.cfg +2 -3
  87. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/__init__.py +4 -4
  88. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/audio.py +70 -95
  89. skoolkit-10.0/skoolkit/ay.py +251 -0
  90. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/cmiosimulator.py +63 -12
  91. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/comment.py +51 -9
  92. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/config.py +3 -1
  93. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/defaults.py +5 -6
  94. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/disassembler.py +2 -3
  95. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/kbtracer.py +5 -5
  96. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/loadtracer.py +21 -32
  97. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/pagingtracer.py +5 -5
  98. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/rzxplay.py +18 -12
  99. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/screen.py +18 -5
  100. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/simutils.py +11 -6
  101. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolasm.py +2 -5
  102. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolhtml.py +15 -18
  103. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolmacro.py +113 -151
  104. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snapinfo.py +4 -3
  105. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snapshot.py +8 -5
  106. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/tap2sna.py +5 -5
  107. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/trace.py +60 -26
  108. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/traceutils.py +5 -3
  109. {skoolkit-9.6 → skoolkit-10.0/skoolkit.egg-info}/PKG-INFO +3 -4
  110. {skoolkit-9.6 → skoolkit-10.0}/skoolkit.egg-info/SOURCES.txt +2 -3
  111. {skoolkit-9.6 → skoolkit-10.0}/tests/macrotest.py +80 -101
  112. {skoolkit-9.6 → skoolkit-10.0}/tests/skoolkittest.py +15 -22
  113. {skoolkit-9.6 → skoolkit-10.0}/tests/test_audio.py +75 -77
  114. skoolkit-10.0/tests/test_ay.py +149 -0
  115. {skoolkit-9.6 → skoolkit-10.0}/tests/test_bin2sna.py +2 -2
  116. {skoolkit-9.6 → skoolkit-10.0}/tests/test_cmiosimulator.py +910 -19
  117. {skoolkit-9.6 → skoolkit-10.0}/tests/test_comment.py +47 -0
  118. {skoolkit-9.6 → skoolkit-10.0}/tests/test_disassembler.py +18 -0
  119. {skoolkit-9.6 → skoolkit-10.0}/tests/test_kbtracer.py +18 -14
  120. {skoolkit-9.6 → skoolkit-10.0}/tests/test_rzxplay.py +53 -41
  121. {skoolkit-9.6 → skoolkit-10.0}/tests/test_screen.py +13 -13
  122. {skoolkit-9.6 → skoolkit-10.0}/tests/test_simulator.py +23 -11
  123. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skool2asm.py +5 -32
  124. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skool2bin.py +12 -15
  125. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skool2ctl.py +7 -12
  126. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skool2html.py +52 -60
  127. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolasm.py +12 -19
  128. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolhtml.py +413 -287
  129. {skoolkit-9.6 → skoolkit-10.0}/tests/test_sna2ctl.py +7 -14
  130. {skoolkit-9.6 → skoolkit-10.0}/tests/test_sna2img.py +4 -5
  131. {skoolkit-9.6 → skoolkit-10.0}/tests/test_sna2skool.py +7 -14
  132. {skoolkit-9.6 → skoolkit-10.0}/tests/test_snapinfo.py +25 -15
  133. {skoolkit-9.6 → skoolkit-10.0}/tests/test_snapmod.py +3 -5
  134. {skoolkit-9.6 → skoolkit-10.0}/tests/test_snapshot.py +9 -6
  135. {skoolkit-9.6 → skoolkit-10.0}/tests/test_snaskool.py +2 -2
  136. {skoolkit-9.6 → skoolkit-10.0}/tests/test_tap2sna.py +28 -12
  137. {skoolkit-9.6 → skoolkit-10.0}/tests/test_trace.py +473 -103
  138. skoolkit-9.6/docs/_sources/migration.rst.txt +0 -93
  139. skoolkit-9.6/docs/_static/_sphinx_javascript_frameworks_compat.js +0 -134
  140. skoolkit-9.6/docs/_static/jquery.js +0 -10907
  141. skoolkit-9.6/docs/_static/underscore.js +0 -2042
  142. skoolkit-9.6/docs/migration.html +0 -209
  143. skoolkit-9.6/docs/searchindex.js +0 -1
  144. {skoolkit-9.6 → skoolkit-10.0}/COPYING +0 -0
  145. {skoolkit-9.6 → skoolkit-10.0}/MANIFEST.in +0 -0
  146. {skoolkit-9.6 → skoolkit-10.0}/bin2sna.py +0 -0
  147. {skoolkit-9.6 → skoolkit-10.0}/bin2tap.py +0 -0
  148. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/asm-templates.rst.txt +0 -0
  149. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/assemblers.rst.txt +0 -0
  150. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog1.rst.txt +0 -0
  151. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog2.rst.txt +0 -0
  152. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog3.rst.txt +0 -0
  153. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog4.rst.txt +0 -0
  154. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog5.rst.txt +0 -0
  155. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog6.rst.txt +0 -0
  156. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog7.rst.txt +0 -0
  157. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/changelog8.rst.txt +0 -0
  158. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/control-files.rst.txt +0 -0
  159. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/diy.rst.txt +0 -0
  160. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/extending.rst.txt +0 -0
  161. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/html-templates.rst.txt +0 -0
  162. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/index.rst.txt +0 -0
  163. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/bin2sna.py.rst.txt +0 -0
  164. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/bin2tap.py.rst.txt +0 -0
  165. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/rzxinfo.py.rst.txt +0 -0
  166. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/skool2asm.py.rst.txt +0 -0
  167. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/skool2bin.py.rst.txt +0 -0
  168. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/skool2ctl.py.rst.txt +0 -0
  169. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/skool2html.py.rst.txt +0 -0
  170. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/sna2ctl.py.rst.txt +0 -0
  171. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/sna2img.py.rst.txt +0 -0
  172. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/sna2skool.py.rst.txt +0 -0
  173. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/snapinfo.py.rst.txt +0 -0
  174. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/snapmod.py.rst.txt +0 -0
  175. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/man/tapinfo.py.rst.txt +0 -0
  176. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/parsing.rst.txt +0 -0
  177. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/skool-files.rst.txt +0 -0
  178. {skoolkit-9.6 → skoolkit-10.0}/docs/_sources/whatis.rst.txt +0 -0
  179. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/custom.css +0 -0
  180. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/file.png +0 -0
  181. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/minus.png +0 -0
  182. {skoolkit-9.6 → skoolkit-10.0}/docs/_static/plus.png +0 -0
  183. {skoolkit-9.6 → skoolkit-10.0}/examples/hungry_horace.t2s +0 -0
  184. {skoolkit-9.6 → skoolkit-10.0}/long_description.rst +0 -0
  185. {skoolkit-9.6 → skoolkit-10.0}/pyproject.toml +0 -0
  186. {skoolkit-9.6 → skoolkit-10.0}/rzxinfo.py +0 -0
  187. {skoolkit-9.6 → skoolkit-10.0}/rzxplay.py +0 -0
  188. {skoolkit-9.6 → skoolkit-10.0}/setup.py +0 -0
  189. {skoolkit-9.6 → skoolkit-10.0}/skool2asm.py +0 -0
  190. {skoolkit-9.6 → skoolkit-10.0}/skool2bin.py +0 -0
  191. {skoolkit-9.6 → skoolkit-10.0}/skool2ctl.py +0 -0
  192. {skoolkit-9.6 → skoolkit-10.0}/skool2html.py +0 -0
  193. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/basic.py +0 -0
  194. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/bin2sna.py +0 -0
  195. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/bin2tap.py +0 -0
  196. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/components.py +0 -0
  197. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/ctlparser.py +0 -0
  198. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/graphics.py +0 -0
  199. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/image.py +0 -0
  200. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/loadsample.py +0 -0
  201. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/opcodes.py +0 -0
  202. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/pngwriter.py +0 -0
  203. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/refparser.py +0 -0
  204. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/128-0.rom +0 -0
  205. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/128-1.rom +0 -0
  206. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/48.rom +0 -0
  207. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/plus2-0.rom +0 -0
  208. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/plus2-1.rom +0 -0
  209. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit-dark.css +0 -0
  210. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit-green.css +0 -0
  211. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit-plum.css +0 -0
  212. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit-wide.css +0 -0
  213. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/resources/skoolkit.css +0 -0
  214. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/rst.py +0 -0
  215. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/rzxinfo.py +0 -0
  216. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/simtables.py +0 -0
  217. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/simulator.py +0 -0
  218. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skool2asm.py +0 -0
  219. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skool2bin.py +0 -0
  220. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skool2ctl.py +0 -0
  221. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skool2html.py +0 -0
  222. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolctl.py +0 -0
  223. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolparser.py +0 -0
  224. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/skoolutils.py +0 -0
  225. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/sna2ctl.py +0 -0
  226. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/sna2img.py +0 -0
  227. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/sna2skool.py +0 -0
  228. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snactl.py +0 -0
  229. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snapmod.py +0 -0
  230. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/snaskool.py +0 -0
  231. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/tape.py +0 -0
  232. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/tapinfo.py +0 -0
  233. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/textutils.py +0 -0
  234. {skoolkit-9.6 → skoolkit-10.0}/skoolkit/z80.py +0 -0
  235. {skoolkit-9.6 → skoolkit-10.0}/skoolkit.egg-info/dependency_links.txt +0 -0
  236. {skoolkit-9.6 → skoolkit-10.0}/skoolkit.egg-info/top_level.txt +0 -0
  237. {skoolkit-9.6 → skoolkit-10.0}/sna2ctl.py +0 -0
  238. {skoolkit-9.6 → skoolkit-10.0}/sna2img.py +0 -0
  239. {skoolkit-9.6 → skoolkit-10.0}/sna2skool.py +0 -0
  240. {skoolkit-9.6 → skoolkit-10.0}/snapinfo.py +0 -0
  241. {skoolkit-9.6 → skoolkit-10.0}/snapmod.py +0 -0
  242. {skoolkit-9.6 → skoolkit-10.0}/tap2sna.py +0 -0
  243. {skoolkit-9.6 → skoolkit-10.0}/tapinfo.py +0 -0
  244. {skoolkit-9.6 → skoolkit-10.0}/tests/test_basic.py +0 -0
  245. {skoolkit-9.6 → skoolkit-10.0}/tests/test_bin2tap.py +0 -0
  246. {skoolkit-9.6 → skoolkit-10.0}/tests/test_ctlparser.py +0 -0
  247. {skoolkit-9.6 → skoolkit-10.0}/tests/test_graphics.py +0 -0
  248. {skoolkit-9.6 → skoolkit-10.0}/tests/test_image.py +0 -0
  249. {skoolkit-9.6 → skoolkit-10.0}/tests/test_pagingtracer.py +0 -0
  250. {skoolkit-9.6 → skoolkit-10.0}/tests/test_refparser.py +0 -0
  251. {skoolkit-9.6 → skoolkit-10.0}/tests/test_rzxinfo.py +0 -0
  252. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolctl.py +0 -0
  253. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolkit.py +0 -0
  254. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolmacro.py +0 -0
  255. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolparser.py +0 -0
  256. {skoolkit-9.6 → skoolkit-10.0}/tests/test_skoolutils.py +0 -0
  257. {skoolkit-9.6 → skoolkit-10.0}/tests/test_tape.py +0 -0
  258. {skoolkit-9.6 → skoolkit-10.0}/tests/test_tapinfo.py +0 -0
  259. {skoolkit-9.6 → skoolkit-10.0}/tests/test_textutils.py +0 -0
  260. {skoolkit-9.6 → skoolkit-10.0}/tests/test_traceutils.py +0 -0
  261. {skoolkit-9.6 → skoolkit-10.0}/tests/test_z80.py +0 -0
  262. {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: 9.6
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: GPLv3
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
- Copyright 2024, 2025 Richard Dymond (rjdymond@gmail.com)
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, "OOKKiOOOOO", kwlist, &start_obj, &stop_obj, &max_operations, &max_time, &interrupts, &draw, &exec_map, &keyboard, &disassemble, &trace)) {
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* args = Py_BuildValue("(OIO)", scr, frame, keyboard);
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, "OIIOO", kwlist, &keys, &stop, &timeout, &disassemble, &trace)) {
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, "OIOO", kwlist, &keys, &timeout, &disassemble, &trace)) {
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, "OiiIOO", kwlist, &stop_obj, &fast_load, &finish_tape, &timeout, &disassemble, &trace)) {
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: ``1`` to
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