skoolkit 9.4__tar.gz → 9.5__tar.gz

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