c64-kb 0.17.0

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 (970) hide show
  1. package/CHANGELOG.md +2082 -0
  2. package/LICENSE +29 -0
  3. package/README.md +559 -0
  4. package/VERSION +25 -0
  5. package/dist/cli/setup.js +66 -0
  6. package/dist/cli/setup.js.map +1 -0
  7. package/dist/cli-memorize-audit.js +97 -0
  8. package/dist/cli-memorize-audit.js.map +1 -0
  9. package/dist/cli.js +335 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config.js +83 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/context.js +53 -0
  14. package/dist/context.js.map +1 -0
  15. package/dist/domain/budget-notes.js +104 -0
  16. package/dist/domain/budget-notes.js.map +1 -0
  17. package/dist/domain/budget.js +417 -0
  18. package/dist/domain/budget.js.map +1 -0
  19. package/dist/domain/game-design.js +77 -0
  20. package/dist/domain/game-design.js.map +1 -0
  21. package/dist/domain/timing.js +39 -0
  22. package/dist/domain/timing.js.map +1 -0
  23. package/dist/graph/apply.js +132 -0
  24. package/dist/graph/apply.js.map +1 -0
  25. package/dist/graph/claims.js +231 -0
  26. package/dist/graph/claims.js.map +1 -0
  27. package/dist/graph/extract/archetype.js +118 -0
  28. package/dist/graph/extract/archetype.js.map +1 -0
  29. package/dist/graph/extract/common.js +69 -0
  30. package/dist/graph/extract/common.js.map +1 -0
  31. package/dist/graph/extract/failure.js +37 -0
  32. package/dist/graph/extract/failure.js.map +1 -0
  33. package/dist/graph/extract/game-design.js +189 -0
  34. package/dist/graph/extract/game-design.js.map +1 -0
  35. package/dist/graph/extract/hardware.js +124 -0
  36. package/dist/graph/extract/hardware.js.map +1 -0
  37. package/dist/graph/extract/pitfall.js +62 -0
  38. package/dist/graph/extract/pitfall.js.map +1 -0
  39. package/dist/graph/extract/raster-band.js +56 -0
  40. package/dist/graph/extract/raster-band.js.map +1 -0
  41. package/dist/graph/extract/recipe.js +71 -0
  42. package/dist/graph/extract/recipe.js.map +1 -0
  43. package/dist/graph/extract/technique-entities.js +180 -0
  44. package/dist/graph/extract/technique-entities.js.map +1 -0
  45. package/dist/graph/extract/technique.js +179 -0
  46. package/dist/graph/extract/technique.js.map +1 -0
  47. package/dist/graph/extract/toolchain.js +67 -0
  48. package/dist/graph/extract/toolchain.js.map +1 -0
  49. package/dist/graph/extract/types.js +3 -0
  50. package/dist/graph/extract/types.js.map +1 -0
  51. package/dist/graph/extract/vocabulary.js +65 -0
  52. package/dist/graph/extract/vocabulary.js.map +1 -0
  53. package/dist/graph/extract.js +43 -0
  54. package/dist/graph/extract.js.map +1 -0
  55. package/dist/graph/kernal-clobbers.js +64 -0
  56. package/dist/graph/kernal-clobbers.js.map +1 -0
  57. package/dist/graph/machine-variants.js +208 -0
  58. package/dist/graph/machine-variants.js.map +1 -0
  59. package/dist/ingest/files.js +99 -0
  60. package/dist/ingest/files.js.map +1 -0
  61. package/dist/ingest/passes.js +104 -0
  62. package/dist/ingest/passes.js.map +1 -0
  63. package/dist/ingest/points.js +50 -0
  64. package/dist/ingest/points.js.map +1 -0
  65. package/dist/ingest/report.js +140 -0
  66. package/dist/ingest/report.js.map +1 -0
  67. package/dist/ingest/tally.js +81 -0
  68. package/dist/ingest/tally.js.map +1 -0
  69. package/dist/ingest/verified-on.js +43 -0
  70. package/dist/ingest/verified-on.js.map +1 -0
  71. package/dist/ingest.js +135 -0
  72. package/dist/ingest.js.map +1 -0
  73. package/dist/schemas/cost-basis.js +5 -0
  74. package/dist/schemas/cost-basis.js.map +1 -0
  75. package/dist/schemas/machine-variant.js +25 -0
  76. package/dist/schemas/machine-variant.js.map +1 -0
  77. package/dist/schemas/plan-budget.js +121 -0
  78. package/dist/schemas/plan-budget.js.map +1 -0
  79. package/dist/schemas/tool-outputs.js +526 -0
  80. package/dist/schemas/tool-outputs.js.map +1 -0
  81. package/dist/server/define-tool.js +52 -0
  82. package/dist/server/define-tool.js.map +1 -0
  83. package/dist/server/defined-only.js +9 -0
  84. package/dist/server/defined-only.js.map +1 -0
  85. package/dist/server/tools-briefings.js +70 -0
  86. package/dist/server/tools-briefings.js.map +1 -0
  87. package/dist/server/tools-lookup.js +180 -0
  88. package/dist/server/tools-lookup.js.map +1 -0
  89. package/dist/server/tools-maintenance.js +116 -0
  90. package/dist/server/tools-maintenance.js.map +1 -0
  91. package/dist/server/tools-pitfalls.js +89 -0
  92. package/dist/server/tools-pitfalls.js.map +1 -0
  93. package/dist/server/tools-recipes.js +296 -0
  94. package/dist/server/tools-recipes.js.map +1 -0
  95. package/dist/server/tools-runtime.js +48 -0
  96. package/dist/server/tools-runtime.js.map +1 -0
  97. package/dist/server/tools.js +43 -0
  98. package/dist/server/tools.js.map +1 -0
  99. package/dist/server.js +95 -0
  100. package/dist/server.js.map +1 -0
  101. package/dist/services/analytics/schema.js +78 -0
  102. package/dist/services/analytics/schema.js.map +1 -0
  103. package/dist/services/analytics/statements.js +99 -0
  104. package/dist/services/analytics/statements.js.map +1 -0
  105. package/dist/services/analytics.js +195 -0
  106. package/dist/services/analytics.js.map +1 -0
  107. package/dist/services/bm25.js +158 -0
  108. package/dist/services/bm25.js.map +1 -0
  109. package/dist/services/chunker.js +81 -0
  110. package/dist/services/chunker.js.map +1 -0
  111. package/dist/services/embeddings.js +58 -0
  112. package/dist/services/embeddings.js.map +1 -0
  113. package/dist/services/falkor/base.js +85 -0
  114. package/dist/services/falkor/base.js.map +1 -0
  115. package/dist/services/falkor/links.js +361 -0
  116. package/dist/services/falkor/links.js.map +1 -0
  117. package/dist/services/falkor/nodes.js +183 -0
  118. package/dist/services/falkor/nodes.js.map +1 -0
  119. package/dist/services/falkor/params.js +45 -0
  120. package/dist/services/falkor/params.js.map +1 -0
  121. package/dist/services/falkor/schema.js +77 -0
  122. package/dist/services/falkor/schema.js.map +1 -0
  123. package/dist/services/falkor.js +100 -0
  124. package/dist/services/falkor.js.map +1 -0
  125. package/dist/services/qdrant.js +238 -0
  126. package/dist/services/qdrant.js.map +1 -0
  127. package/dist/services/versions.js +73 -0
  128. package/dist/services/versions.js.map +1 -0
  129. package/dist/services/vice-bin.js +51 -0
  130. package/dist/services/vice-bin.js.map +1 -0
  131. package/dist/tools/briefings/archetype.js +174 -0
  132. package/dist/tools/briefings/archetype.js.map +1 -0
  133. package/dist/tools/briefings/budget.js +177 -0
  134. package/dist/tools/briefings/budget.js.map +1 -0
  135. package/dist/tools/briefings/build-order.js +135 -0
  136. package/dist/tools/briefings/build-order.js.map +1 -0
  137. package/dist/tools/briefings/build.js +185 -0
  138. package/dist/tools/briefings/build.js.map +1 -0
  139. package/dist/tools/briefings/discovery.js +290 -0
  140. package/dist/tools/briefings/discovery.js.map +1 -0
  141. package/dist/tools/briefings/plan-pitfalls.js +69 -0
  142. package/dist/tools/briefings/plan-pitfalls.js.map +1 -0
  143. package/dist/tools/briefings/render.js +151 -0
  144. package/dist/tools/briefings/render.js.map +1 -0
  145. package/dist/tools/briefings/rows.js +41 -0
  146. package/dist/tools/briefings/rows.js.map +1 -0
  147. package/dist/tools/briefings/toolchain.js +63 -0
  148. package/dist/tools/briefings/toolchain.js.map +1 -0
  149. package/dist/tools/briefings/why-proposed.js +69 -0
  150. package/dist/tools/briefings/why-proposed.js.map +1 -0
  151. package/dist/tools/briefings.js +44 -0
  152. package/dist/tools/briefings.js.map +1 -0
  153. package/dist/tools/feedback.js +97 -0
  154. package/dist/tools/feedback.js.map +1 -0
  155. package/dist/tools/hydrate.js +75 -0
  156. package/dist/tools/hydrate.js.map +1 -0
  157. package/dist/tools/intelligence.js +67 -0
  158. package/dist/tools/intelligence.js.map +1 -0
  159. package/dist/tools/lint/asm-decimal.js +86 -0
  160. package/dist/tools/lint/asm-decimal.js.map +1 -0
  161. package/dist/tools/lint/asm-rules.js +221 -0
  162. package/dist/tools/lint/asm-rules.js.map +1 -0
  163. package/dist/tools/lint/asm-shared.js +3 -0
  164. package/dist/tools/lint/asm-shared.js.map +1 -0
  165. package/dist/tools/lint/c-rules.js +215 -0
  166. package/dist/tools/lint/c-rules.js.map +1 -0
  167. package/dist/tools/lint/text.js +122 -0
  168. package/dist/tools/lint/text.js.map +1 -0
  169. package/dist/tools/lint/types.js +40 -0
  170. package/dist/tools/lint/types.js.map +1 -0
  171. package/dist/tools/lint.js +76 -0
  172. package/dist/tools/lint.js.map +1 -0
  173. package/dist/tools/memorization-mcp.js +111 -0
  174. package/dist/tools/memorization-mcp.js.map +1 -0
  175. package/dist/tools/pitfalls/bm25.js +53 -0
  176. package/dist/tools/pitfalls/bm25.js.map +1 -0
  177. package/dist/tools/pitfalls/format.js +58 -0
  178. package/dist/tools/pitfalls/format.js.map +1 -0
  179. package/dist/tools/pitfalls/graph.js +124 -0
  180. package/dist/tools/pitfalls/graph.js.map +1 -0
  181. package/dist/tools/pitfalls.js +134 -0
  182. package/dist/tools/pitfalls.js.map +1 -0
  183. package/dist/tools/prompts.js +81 -0
  184. package/dist/tools/prompts.js.map +1 -0
  185. package/dist/tools/query/compatibility/closure.js +62 -0
  186. package/dist/tools/query/compatibility/closure.js.map +1 -0
  187. package/dist/tools/query/compatibility/facts.js +28 -0
  188. package/dist/tools/query/compatibility/facts.js.map +1 -0
  189. package/dist/tools/query/compatibility/fetch.js +164 -0
  190. package/dist/tools/query/compatibility/fetch.js.map +1 -0
  191. package/dist/tools/query/compatibility/hard-rules.js +159 -0
  192. package/dist/tools/query/compatibility/hard-rules.js.map +1 -0
  193. package/dist/tools/query/compatibility/index.js +27 -0
  194. package/dist/tools/query/compatibility/index.js.map +1 -0
  195. package/dist/tools/query/compatibility/kernal-zp-rule.js +90 -0
  196. package/dist/tools/query/compatibility/kernal-zp-rule.js.map +1 -0
  197. package/dist/tools/query/compatibility/render.js +106 -0
  198. package/dist/tools/query/compatibility/render.js.map +1 -0
  199. package/dist/tools/query/compatibility/rules.js +337 -0
  200. package/dist/tools/query/compatibility/rules.js.map +1 -0
  201. package/dist/tools/query/compatibility/unit-rules.js +253 -0
  202. package/dist/tools/query/compatibility/unit-rules.js.map +1 -0
  203. package/dist/tools/query/game-design.js +83 -0
  204. package/dist/tools/query/game-design.js.map +1 -0
  205. package/dist/tools/query/lookups.js +220 -0
  206. package/dist/tools/query/lookups.js.map +1 -0
  207. package/dist/tools/query/plan-budget.js +266 -0
  208. package/dist/tools/query/plan-budget.js.map +1 -0
  209. package/dist/tools/query/recipes.js +214 -0
  210. package/dist/tools/query/recipes.js.map +1 -0
  211. package/dist/tools/query/retrieval.js +128 -0
  212. package/dist/tools/query/retrieval.js.map +1 -0
  213. package/dist/tools/query/shared.js +121 -0
  214. package/dist/tools/query/shared.js.map +1 -0
  215. package/dist/tools/query/techniques.js +331 -0
  216. package/dist/tools/query/techniques.js.map +1 -0
  217. package/dist/tools/query/timing.js +106 -0
  218. package/dist/tools/query/timing.js.map +1 -0
  219. package/dist/tools/query/types.js +11 -0
  220. package/dist/tools/query/types.js.map +1 -0
  221. package/dist/tools/query.js +21 -0
  222. package/dist/tools/query.js.map +1 -0
  223. package/dist/tools/resources.js +186 -0
  224. package/dist/tools/resources.js.map +1 -0
  225. package/dist/tools/run-game.js +249 -0
  226. package/dist/tools/run-game.js.map +1 -0
  227. package/dist/tools/selfimprovement.js +367 -0
  228. package/dist/tools/selfimprovement.js.map +1 -0
  229. package/docker-compose.yml +35 -0
  230. package/docs/ARCHITECTURE.md +164 -0
  231. package/docs/CONVENTIONS-archetypes.md +158 -0
  232. package/docs/CONVENTIONS-failures.md +46 -0
  233. package/docs/CONVENTIONS-game-designs.md +75 -0
  234. package/docs/CONVENTIONS-hardware-reference.md +184 -0
  235. package/docs/CONVENTIONS-pitfalls.md +91 -0
  236. package/docs/CONVENTIONS-recipes.md +106 -0
  237. package/docs/CONVENTIONS-techniques.md +309 -0
  238. package/docs/CONVENTIONS-toolchain-reference.md +89 -0
  239. package/docs/ONTOLOGY.md +655 -0
  240. package/docs/art/art-production-reference.md +157 -0
  241. package/docs/art/asset-pipelines.md +586 -0
  242. package/docs/c64-failure-patterns.md +693 -0
  243. package/docs/demo-design/demo-composition.md +349 -0
  244. package/docs/demo-design/demo-design-philosophy.md +320 -0
  245. package/docs/demo-design/intro-cracktro-patterns.md +435 -0
  246. package/docs/figures/ctm-spd-embed-probe.png +0 -0
  247. package/docs/figures/dot-flag-mid-5000000.png +0 -0
  248. package/docs/figures/dot-flag-no-erase-12000000.png +0 -0
  249. package/docs/figures/edges.json +1 -0
  250. package/docs/figures/fig6-architecture.png +0 -0
  251. package/docs/figures/fig7-ontology.png +0 -0
  252. package/docs/figures/screen-dissolve-mid-frame25.png +0 -0
  253. package/docs/figures/screen-dissolve-wipe-frame25.png +0 -0
  254. package/docs/figures/spindle-two-parts-part1.png +0 -0
  255. package/docs/figures/spindle-two-parts-part2.png +0 -0
  256. package/docs/figures/starters/action-puzzle.png +0 -0
  257. package/docs/figures/starters/adventure.png +0 -0
  258. package/docs/figures/starters/beat-em-up.png +0 -0
  259. package/docs/figures/starters/demo.png +0 -0
  260. package/docs/figures/starters/platformer.png +0 -0
  261. package/docs/figures/starters/shmup-vertical.png +0 -0
  262. package/docs/figures/tape-kernal-master-ntsc.png +0 -0
  263. package/docs/figures/tape-kernal-master-pal.png +0 -0
  264. package/docs/figures/tape-turbo-loader-ntsc.png +0 -0
  265. package/docs/figures/tape-turbo-loader-pal.png +0 -0
  266. package/docs/figures/tape-turbo-master-ntsc.png +0 -0
  267. package/docs/figures/tape-turbo-master-pal.png +0 -0
  268. package/docs/figures/tech-tech-pad2-12000000.png +0 -0
  269. package/docs/figures/tech-tech-pad4-12000000.png +0 -0
  270. package/docs/figures/tech-tech-seven-12000000.png +0 -0
  271. package/docs/figures/twister-mid-5000000.png +0 -0
  272. package/docs/figures/twister-straight-12000000.png +0 -0
  273. package/docs/figures/vector-balls-nosort-ntsc.png +0 -0
  274. package/docs/figures/vector-balls-nosort.png +0 -0
  275. package/docs/formats/c64-file-formats.md +1212 -0
  276. package/docs/formats/iec-disk-reference.md +754 -0
  277. package/docs/game-design/c64-game-archetypes.md +273 -0
  278. package/docs/game-design/designs/falling-blocks.md +54 -0
  279. package/docs/game-design/designs/platformer-scaffold.md +48 -0
  280. package/docs/game-design/designs/simple-shmup.md +27 -0
  281. package/docs/game-design/enemy-behaviour-and-difficulty.md +349 -0
  282. package/docs/game-design/game-design-patterns.md +1189 -0
  283. package/docs/game-design/game-structure.md +354 -0
  284. package/docs/game-design/production-planning.md +349 -0
  285. package/docs/game-design/reference-game-sources.md +90 -0
  286. package/docs/hardware/6502-illegal-opcodes.md +1353 -0
  287. package/docs/hardware/6510-cpu-reference.md +2112 -0
  288. package/docs/hardware/c64-memory-map.md +3184 -0
  289. package/docs/hardware/c64-registers-reference.md +996 -0
  290. package/docs/hardware/cia-reference.md +1281 -0
  291. package/docs/hardware/kernal-routines-reference.md +1836 -0
  292. package/docs/hardware/pal-ntsc-reference.md +813 -0
  293. package/docs/hardware/sid-reference.md +1137 -0
  294. package/docs/hardware/vic-ii-reference.md +1714 -0
  295. package/docs/music/music-production-reference.md +403 -0
  296. package/docs/pitfalls/banking.md +1067 -0
  297. package/docs/pitfalls/cia.md +1147 -0
  298. package/docs/pitfalls/cpu.md +874 -0
  299. package/docs/pitfalls/input.md +282 -0
  300. package/docs/pitfalls/kernal-and-io.md +1615 -0
  301. package/docs/pitfalls/loader.md +1191 -0
  302. package/docs/pitfalls/logic.md +94 -0
  303. package/docs/pitfalls/maths.md +187 -0
  304. package/docs/pitfalls/raster-and-badline.md +721 -0
  305. package/docs/pitfalls/region-timing.md +660 -0
  306. package/docs/pitfalls/scroll.md +207 -0
  307. package/docs/pitfalls/sid.md +738 -0
  308. package/docs/pitfalls/sprite.md +979 -0
  309. package/docs/pitfalls/text-mode-render.md +1172 -0
  310. package/docs/recipes/cc65/cartridge-8k.md +398 -0
  311. package/docs/recipes/cc65/hello-world-conio.md +76 -0
  312. package/docs/recipes/cc65/memory-layout.md +312 -0
  313. package/docs/recipes/cc65/screenshots/README.md +14 -0
  314. package/docs/recipes/cc65/screenshots/cartridge-8k-ntsc.png +0 -0
  315. package/docs/recipes/cc65/screenshots/cartridge-8k.png +0 -0
  316. package/docs/recipes/cc65/screenshots/hello-world-conio.png +0 -0
  317. package/docs/recipes/cc65/screenshots/memory-layout-ntsc.png +0 -0
  318. package/docs/recipes/cc65/screenshots/memory-layout.png +0 -0
  319. package/docs/recipes/kickassembler/basic-float-calls.md +578 -0
  320. package/docs/recipes/kickassembler/basic-wedge.md +398 -0
  321. package/docs/recipes/kickassembler/big-font-scroller.md +620 -0
  322. package/docs/recipes/kickassembler/charset-copy-rom-to-ram.md +623 -0
  323. package/docs/recipes/kickassembler/cia-revision-detect.md +366 -0
  324. package/docs/recipes/kickassembler/colour-cycling.md +343 -0
  325. package/docs/recipes/kickassembler/colour-fade.md +303 -0
  326. package/docs/recipes/kickassembler/compare-16bit-signed.md +1007 -0
  327. package/docs/recipes/kickassembler/cracktro-template.md +526 -0
  328. package/docs/recipes/kickassembler/crt-banked.md +276 -0
  329. package/docs/recipes/kickassembler/dos-error-codes.md +466 -0
  330. package/docs/recipes/kickassembler/dot-flag.md +576 -0
  331. package/docs/recipes/kickassembler/drive-job-queue.md +667 -0
  332. package/docs/recipes/kickassembler/drive-via-probe.md +690 -0
  333. package/docs/recipes/kickassembler/dycp-scroller.md +568 -0
  334. package/docs/recipes/kickassembler/dypp-sprite-scroller.md +681 -0
  335. package/docs/recipes/kickassembler/dysp.md +670 -0
  336. package/docs/recipes/kickassembler/easyflash-save.md +800 -0
  337. package/docs/recipes/kickassembler/eight-way-scroll.md +1484 -0
  338. package/docs/recipes/kickassembler/file-io-roundtrip.md +546 -0
  339. package/docs/recipes/kickassembler/fire-effect.md +420 -0
  340. package/docs/recipes/kickassembler/fld.md +414 -0
  341. package/docs/recipes/kickassembler/fli-image.md +336 -0
  342. package/docs/recipes/kickassembler/four-player-read.md +672 -0
  343. package/docs/recipes/kickassembler/headless-verify.md +228 -0
  344. package/docs/recipes/kickassembler/hello-world.md +98 -0
  345. package/docs/recipes/kickassembler/high-score-insert.md +660 -0
  346. package/docs/recipes/kickassembler/hires-plot-line.md +723 -0
  347. package/docs/recipes/kickassembler/irq-chain.md +316 -0
  348. package/docs/recipes/kickassembler/irq-owns-port.md +668 -0
  349. package/docs/recipes/kickassembler/isometric-room.md +1145 -0
  350. package/docs/recipes/kickassembler/light-pen-read.md +926 -0
  351. package/docs/recipes/kickassembler/logic-rate-decoupling.md +670 -0
  352. package/docs/recipes/kickassembler/mci-interlace.md +543 -0
  353. package/docs/recipes/kickassembler/memory-layout.md +277 -0
  354. package/docs/recipes/kickassembler/mouse-1351-read.md +801 -0
  355. package/docs/recipes/kickassembler/nmi-timer-tick.md +562 -0
  356. package/docs/recipes/kickassembler/own-keyscan.md +881 -0
  357. package/docs/recipes/kickassembler/paddle-read.md +751 -0
  358. package/docs/recipes/kickassembler/palette-cells.md +219 -0
  359. package/docs/recipes/kickassembler/pseudo-3d-road.md +930 -0
  360. package/docs/recipes/kickassembler/pwm-digi.md +463 -0
  361. package/docs/recipes/kickassembler/raster-bars.md +264 -0
  362. package/docs/recipes/kickassembler/reu-dma.md +1019 -0
  363. package/docs/recipes/kickassembler/runtime-relocation.md +743 -0
  364. package/docs/recipes/kickassembler/screen-dissolve.md +545 -0
  365. package/docs/recipes/kickassembler/screen-wipe.md +408 -0
  366. package/docs/recipes/kickassembler/screenshots/README.md +72 -0
  367. package/docs/recipes/kickassembler/screenshots/basic-float-calls-ntsc.png +0 -0
  368. package/docs/recipes/kickassembler/screenshots/basic-float-calls.png +0 -0
  369. package/docs/recipes/kickassembler/screenshots/basic-wedge-ntsc.png +0 -0
  370. package/docs/recipes/kickassembler/screenshots/basic-wedge.png +0 -0
  371. package/docs/recipes/kickassembler/screenshots/big-font-scroller-ntsc.png +0 -0
  372. package/docs/recipes/kickassembler/screenshots/big-font-scroller.png +0 -0
  373. package/docs/recipes/kickassembler/screenshots/charset-copy-rom-to-ram-ntsc.png +0 -0
  374. package/docs/recipes/kickassembler/screenshots/charset-copy-rom-to-ram.png +0 -0
  375. package/docs/recipes/kickassembler/screenshots/cia-revision-detect-ntsc.png +0 -0
  376. package/docs/recipes/kickassembler/screenshots/cia-revision-detect.png +0 -0
  377. package/docs/recipes/kickassembler/screenshots/colour-cycling-ntsc.png +0 -0
  378. package/docs/recipes/kickassembler/screenshots/colour-cycling.png +0 -0
  379. package/docs/recipes/kickassembler/screenshots/colour-fade-ntsc.png +0 -0
  380. package/docs/recipes/kickassembler/screenshots/colour-fade.png +0 -0
  381. package/docs/recipes/kickassembler/screenshots/compare-16bit-signed-ntsc.png +0 -0
  382. package/docs/recipes/kickassembler/screenshots/compare-16bit-signed.png +0 -0
  383. package/docs/recipes/kickassembler/screenshots/cracktro-template.png +0 -0
  384. package/docs/recipes/kickassembler/screenshots/crt-banked-ntsc.png +0 -0
  385. package/docs/recipes/kickassembler/screenshots/crt-banked.png +0 -0
  386. package/docs/recipes/kickassembler/screenshots/dos-error-codes-ntsc.png +0 -0
  387. package/docs/recipes/kickassembler/screenshots/dos-error-codes.png +0 -0
  388. package/docs/recipes/kickassembler/screenshots/dot-flag-ntsc.png +0 -0
  389. package/docs/recipes/kickassembler/screenshots/dot-flag.png +0 -0
  390. package/docs/recipes/kickassembler/screenshots/drive-job-queue-ntsc.png +0 -0
  391. package/docs/recipes/kickassembler/screenshots/drive-job-queue.png +0 -0
  392. package/docs/recipes/kickassembler/screenshots/drive-via-probe-ntsc.png +0 -0
  393. package/docs/recipes/kickassembler/screenshots/drive-via-probe.png +0 -0
  394. package/docs/recipes/kickassembler/screenshots/dycp-scroller-ntsc.png +0 -0
  395. package/docs/recipes/kickassembler/screenshots/dycp-scroller.png +0 -0
  396. package/docs/recipes/kickassembler/screenshots/dypp-sprite-scroller-ntsc.png +0 -0
  397. package/docs/recipes/kickassembler/screenshots/dypp-sprite-scroller.png +0 -0
  398. package/docs/recipes/kickassembler/screenshots/dysp-ntsc.png +0 -0
  399. package/docs/recipes/kickassembler/screenshots/dysp.png +0 -0
  400. package/docs/recipes/kickassembler/screenshots/easyflash-save-ntsc-run2.png +0 -0
  401. package/docs/recipes/kickassembler/screenshots/easyflash-save-ntsc.png +0 -0
  402. package/docs/recipes/kickassembler/screenshots/easyflash-save-run2.png +0 -0
  403. package/docs/recipes/kickassembler/screenshots/easyflash-save.png +0 -0
  404. package/docs/recipes/kickassembler/screenshots/eight-way-scroll-ntsc.png +0 -0
  405. package/docs/recipes/kickassembler/screenshots/eight-way-scroll.png +0 -0
  406. package/docs/recipes/kickassembler/screenshots/file-io-roundtrip-ntsc.png +0 -0
  407. package/docs/recipes/kickassembler/screenshots/file-io-roundtrip.png +0 -0
  408. package/docs/recipes/kickassembler/screenshots/fire-effect-ntsc.png +0 -0
  409. package/docs/recipes/kickassembler/screenshots/fire-effect.png +0 -0
  410. package/docs/recipes/kickassembler/screenshots/fld-ntsc.png +0 -0
  411. package/docs/recipes/kickassembler/screenshots/fld.png +0 -0
  412. package/docs/recipes/kickassembler/screenshots/fli-image.png +0 -0
  413. package/docs/recipes/kickassembler/screenshots/four-player-read-ntsc.png +0 -0
  414. package/docs/recipes/kickassembler/screenshots/four-player-read.png +0 -0
  415. package/docs/recipes/kickassembler/screenshots/headless-verify-ntsc.png +0 -0
  416. package/docs/recipes/kickassembler/screenshots/headless-verify.png +0 -0
  417. package/docs/recipes/kickassembler/screenshots/hello-world.png +0 -0
  418. package/docs/recipes/kickassembler/screenshots/high-score-insert-ntsc.png +0 -0
  419. package/docs/recipes/kickassembler/screenshots/high-score-insert.png +0 -0
  420. package/docs/recipes/kickassembler/screenshots/hires-plot-line-ntsc.png +0 -0
  421. package/docs/recipes/kickassembler/screenshots/hires-plot-line.png +0 -0
  422. package/docs/recipes/kickassembler/screenshots/irq-chain-ntsc.png +0 -0
  423. package/docs/recipes/kickassembler/screenshots/irq-chain.png +0 -0
  424. package/docs/recipes/kickassembler/screenshots/irq-owns-port-ntsc.png +0 -0
  425. package/docs/recipes/kickassembler/screenshots/irq-owns-port.png +0 -0
  426. package/docs/recipes/kickassembler/screenshots/isometric-room-ntsc.png +0 -0
  427. package/docs/recipes/kickassembler/screenshots/isometric-room.png +0 -0
  428. package/docs/recipes/kickassembler/screenshots/light-pen-read-ntsc.png +0 -0
  429. package/docs/recipes/kickassembler/screenshots/light-pen-read.png +0 -0
  430. package/docs/recipes/kickassembler/screenshots/logic-rate-decoupling-ntsc.png +0 -0
  431. package/docs/recipes/kickassembler/screenshots/logic-rate-decoupling.png +0 -0
  432. package/docs/recipes/kickassembler/screenshots/mci-interlace-average.png +0 -0
  433. package/docs/recipes/kickassembler/screenshots/mci-interlace-frame-b.png +0 -0
  434. package/docs/recipes/kickassembler/screenshots/mci-interlace-ntsc.png +0 -0
  435. package/docs/recipes/kickassembler/screenshots/mci-interlace.png +0 -0
  436. package/docs/recipes/kickassembler/screenshots/memory-layout-ntsc.png +0 -0
  437. package/docs/recipes/kickassembler/screenshots/memory-layout.png +0 -0
  438. package/docs/recipes/kickassembler/screenshots/mouse-1351-read-ntsc.png +0 -0
  439. package/docs/recipes/kickassembler/screenshots/mouse-1351-read.png +0 -0
  440. package/docs/recipes/kickassembler/screenshots/nmi-timer-tick-ntsc.png +0 -0
  441. package/docs/recipes/kickassembler/screenshots/nmi-timer-tick.png +0 -0
  442. package/docs/recipes/kickassembler/screenshots/own-keyscan-ntsc.png +0 -0
  443. package/docs/recipes/kickassembler/screenshots/own-keyscan.png +0 -0
  444. package/docs/recipes/kickassembler/screenshots/paddle-read-ntsc.png +0 -0
  445. package/docs/recipes/kickassembler/screenshots/paddle-read.png +0 -0
  446. package/docs/recipes/kickassembler/screenshots/palette-cells-ntsc.png +0 -0
  447. package/docs/recipes/kickassembler/screenshots/palette-cells.png +0 -0
  448. package/docs/recipes/kickassembler/screenshots/pseudo-3d-road-ntsc.png +0 -0
  449. package/docs/recipes/kickassembler/screenshots/pseudo-3d-road.png +0 -0
  450. package/docs/recipes/kickassembler/screenshots/pwm-digi-ntsc.png +0 -0
  451. package/docs/recipes/kickassembler/screenshots/pwm-digi.png +0 -0
  452. package/docs/recipes/kickassembler/screenshots/raster-bars.png +0 -0
  453. package/docs/recipes/kickassembler/screenshots/reu-dma-ntsc.png +0 -0
  454. package/docs/recipes/kickassembler/screenshots/reu-dma.png +0 -0
  455. package/docs/recipes/kickassembler/screenshots/runtime-relocation-ntsc.png +0 -0
  456. package/docs/recipes/kickassembler/screenshots/runtime-relocation.png +0 -0
  457. package/docs/recipes/kickassembler/screenshots/screen-dissolve-ntsc.png +0 -0
  458. package/docs/recipes/kickassembler/screenshots/screen-dissolve.png +0 -0
  459. package/docs/recipes/kickassembler/screenshots/screen-wipe-ntsc.png +0 -0
  460. package/docs/recipes/kickassembler/screenshots/screen-wipe.png +0 -0
  461. package/docs/recipes/kickassembler/screenshots/scroll-panel-split-ntsc.png +0 -0
  462. package/docs/recipes/kickassembler/screenshots/scroll-panel-split.png +0 -0
  463. package/docs/recipes/kickassembler/screenshots/sfx-in-player-ntsc.png +0 -0
  464. package/docs/recipes/kickassembler/screenshots/sfx-in-player.png +0 -0
  465. package/docs/recipes/kickassembler/screenshots/shadebobs-ntsc.png +0 -0
  466. package/docs/recipes/kickassembler/screenshots/shadebobs.png +0 -0
  467. package/docs/recipes/kickassembler/screenshots/sideborder-open.png +0 -0
  468. package/docs/recipes/kickassembler/screenshots/sine-scroller.png +0 -0
  469. package/docs/recipes/kickassembler/screenshots/sine-table-runtime-ntsc.png +0 -0
  470. package/docs/recipes/kickassembler/screenshots/sine-table-runtime.png +0 -0
  471. package/docs/recipes/kickassembler/screenshots/software-sprite-preshifted-ntsc.png +0 -0
  472. package/docs/recipes/kickassembler/screenshots/software-sprite-preshifted.png +0 -0
  473. package/docs/recipes/kickassembler/screenshots/speedcode-generator-ntsc.png +0 -0
  474. package/docs/recipes/kickassembler/screenshots/speedcode-generator.png +0 -0
  475. package/docs/recipes/kickassembler/screenshots/sprite-border-scroller-ntsc.png +0 -0
  476. package/docs/recipes/kickassembler/screenshots/sprite-border-scroller.png +0 -0
  477. package/docs/recipes/kickassembler/screenshots/sprite-cache-flip-ntsc.png +0 -0
  478. package/docs/recipes/kickassembler/screenshots/sprite-cache-flip.png +0 -0
  479. package/docs/recipes/kickassembler/screenshots/sprite-multiplex-24.png +0 -0
  480. package/docs/recipes/kickassembler/screenshots/sprite-multiplex-game-ntsc.png +0 -0
  481. package/docs/recipes/kickassembler/screenshots/sprite-multiplex-game.png +0 -0
  482. package/docs/recipes/kickassembler/screenshots/sprite-priority-classes-ntsc.png +0 -0
  483. package/docs/recipes/kickassembler/screenshots/sprite-priority-classes.png +0 -0
  484. package/docs/recipes/kickassembler/screenshots/sprite-sine-chain-ntsc.png +0 -0
  485. package/docs/recipes/kickassembler/screenshots/sprite-sine-chain.png +0 -0
  486. package/docs/recipes/kickassembler/screenshots/sprite-stretcher-ntsc.png +0 -0
  487. package/docs/recipes/kickassembler/screenshots/sprite-stretcher.png +0 -0
  488. package/docs/recipes/kickassembler/screenshots/sprites-only-screen-ntsc.png +0 -0
  489. package/docs/recipes/kickassembler/screenshots/sprites-only-screen.png +0 -0
  490. package/docs/recipes/kickassembler/screenshots/sqrt-atan2-ntsc.png +0 -0
  491. package/docs/recipes/kickassembler/screenshots/sqrt-atan2.png +0 -0
  492. package/docs/recipes/kickassembler/screenshots/stable-raster-irq-control.png +0 -0
  493. package/docs/recipes/kickassembler/screenshots/stable-raster-irq.png +0 -0
  494. package/docs/recipes/kickassembler/screenshots/tech-tech-ntsc.png +0 -0
  495. package/docs/recipes/kickassembler/screenshots/tech-tech.png +0 -0
  496. package/docs/recipes/kickassembler/screenshots/tod-alarm-ntsc.png +0 -0
  497. package/docs/recipes/kickassembler/screenshots/tod-alarm.png +0 -0
  498. package/docs/recipes/kickassembler/screenshots/topbottom-border-open.png +0 -0
  499. package/docs/recipes/kickassembler/screenshots/twister-ntsc.png +0 -0
  500. package/docs/recipes/kickassembler/screenshots/twister.png +0 -0
  501. package/docs/recipes/kickassembler/screenshots/unit-test-driver-ntsc.png +0 -0
  502. package/docs/recipes/kickassembler/screenshots/unit-test-driver.png +0 -0
  503. package/docs/recipes/kickassembler/screenshots/vector-balls-ntsc.png +0 -0
  504. package/docs/recipes/kickassembler/screenshots/vector-balls.png +0 -0
  505. package/docs/recipes/kickassembler/screenshots/wireframe-ships-ntsc.png +0 -0
  506. package/docs/recipes/kickassembler/screenshots/wireframe-ships.png +0 -0
  507. package/docs/recipes/kickassembler/scroll-panel-split.md +381 -0
  508. package/docs/recipes/kickassembler/sfx-in-player.md +907 -0
  509. package/docs/recipes/kickassembler/shadebobs.md +522 -0
  510. package/docs/recipes/kickassembler/sideborder-open.md +338 -0
  511. package/docs/recipes/kickassembler/sine-scroller.md +321 -0
  512. package/docs/recipes/kickassembler/sine-table-runtime.md +815 -0
  513. package/docs/recipes/kickassembler/software-sprite-preshifted.md +725 -0
  514. package/docs/recipes/kickassembler/speedcode-generator.md +606 -0
  515. package/docs/recipes/kickassembler/sprite-border-scroller.md +696 -0
  516. package/docs/recipes/kickassembler/sprite-cache-flip.md +1071 -0
  517. package/docs/recipes/kickassembler/sprite-multiplex-24.md +326 -0
  518. package/docs/recipes/kickassembler/sprite-multiplex-game.md +986 -0
  519. package/docs/recipes/kickassembler/sprite-priority-classes.md +463 -0
  520. package/docs/recipes/kickassembler/sprite-sine-chain.md +338 -0
  521. package/docs/recipes/kickassembler/sprite-stretcher.md +501 -0
  522. package/docs/recipes/kickassembler/sprites-only-screen.md +550 -0
  523. package/docs/recipes/kickassembler/sqrt-atan2.md +1014 -0
  524. package/docs/recipes/kickassembler/stable-raster-irq.md +360 -0
  525. package/docs/recipes/kickassembler/tape-turbo-loader.md +875 -0
  526. package/docs/recipes/kickassembler/tech-tech.md +679 -0
  527. package/docs/recipes/kickassembler/tod-alarm.md +754 -0
  528. package/docs/recipes/kickassembler/topbottom-border-open.md +407 -0
  529. package/docs/recipes/kickassembler/twister.md +518 -0
  530. package/docs/recipes/kickassembler/unit-test-driver.md +314 -0
  531. package/docs/recipes/kickassembler/vector-balls.md +545 -0
  532. package/docs/recipes/kickassembler/wireframe-ships.md +2324 -0
  533. package/docs/recipes/oscar64/actor-activation-window.md +807 -0
  534. package/docs/recipes/oscar64/adventure-engine.md +1094 -0
  535. package/docs/recipes/oscar64/attract-replay.md +465 -0
  536. package/docs/recipes/oscar64/beat-em-up-lanes.md +563 -0
  537. package/docs/recipes/oscar64/bfs-distance-map.md +723 -0
  538. package/docs/recipes/oscar64/bitmap-koala-viewer.md +355 -0
  539. package/docs/recipes/oscar64/car-contact.md +950 -0
  540. package/docs/recipes/oscar64/cave-scan.md +609 -0
  541. package/docs/recipes/oscar64/char-bullets.md +477 -0
  542. package/docs/recipes/oscar64/charset-animation.md +383 -0
  543. package/docs/recipes/oscar64/charset-parallax.md +401 -0
  544. package/docs/recipes/oscar64/destructible-terrain.md +1099 -0
  545. package/docs/recipes/oscar64/difficulty-tables.md +654 -0
  546. package/docs/recipes/oscar64/dig-and-guards.md +975 -0
  547. package/docs/recipes/oscar64/directory-reader.md +535 -0
  548. package/docs/recipes/oscar64/divide-check.md +581 -0
  549. package/docs/recipes/oscar64/double-buffer-nomirror.md +205 -0
  550. package/docs/recipes/oscar64/double-buffer.md +255 -0
  551. package/docs/recipes/oscar64/falling-blocks.md +874 -0
  552. package/docs/recipes/oscar64/fixed-point-jump-velocity.md +289 -0
  553. package/docs/recipes/oscar64/fixed-point-jump.md +210 -0
  554. package/docs/recipes/oscar64/flip-screen-rooms.md +793 -0
  555. package/docs/recipes/oscar64/frame-sync-loop-overrun.md +214 -0
  556. package/docs/recipes/oscar64/frame-sync-loop.md +254 -0
  557. package/docs/recipes/oscar64/game-tree-search.md +743 -0
  558. package/docs/recipes/oscar64/ghost-targeting.md +867 -0
  559. package/docs/recipes/oscar64/headless-verify.md +345 -0
  560. package/docs/recipes/oscar64/hello-world.md +83 -0
  561. package/docs/recipes/oscar64/high-score-persist.md +772 -0
  562. package/docs/recipes/oscar64/iffl-kernal-skip.md +421 -0
  563. package/docs/recipes/oscar64/joystick-input.md +358 -0
  564. package/docs/recipes/oscar64/lane-pursuit.md +1028 -0
  565. package/docs/recipes/oscar64/level-rle-decoder.md +620 -0
  566. package/docs/recipes/oscar64/lfsr-random-seed2.md +338 -0
  567. package/docs/recipes/oscar64/lfsr-random.md +403 -0
  568. package/docs/recipes/oscar64/load-asset-runtime.md +492 -0
  569. package/docs/recipes/oscar64/memory-layout.md +232 -0
  570. package/docs/recipes/oscar64/mixed-fighters.md +781 -0
  571. package/docs/recipes/oscar64/multi-sprite-object.md +533 -0
  572. package/docs/recipes/oscar64/nav-area-pathfinding.md +881 -0
  573. package/docs/recipes/oscar64/object-pool.md +572 -0
  574. package/docs/recipes/oscar64/pal-ntsc-detect.md +257 -0
  575. package/docs/recipes/oscar64/password-state.md +532 -0
  576. package/docs/recipes/oscar64/per-frame-hitbox.md +651 -0
  577. package/docs/recipes/oscar64/petscii-screen-codes.md +428 -0
  578. package/docs/recipes/oscar64/platformer-scaffold.md +1467 -0
  579. package/docs/recipes/oscar64/print-number.md +367 -0
  580. package/docs/recipes/oscar64/raster-bars.md +239 -0
  581. package/docs/recipes/oscar64/raster-profile-bars.md +404 -0
  582. package/docs/recipes/oscar64/rel-side-sectors.md +391 -0
  583. package/docs/recipes/oscar64/relative-file-records.md +378 -0
  584. package/docs/recipes/oscar64/save-load-seq-file.md +365 -0
  585. package/docs/recipes/oscar64/screenshots/README.md +99 -0
  586. package/docs/recipes/oscar64/screenshots/actor-activation-window-ntsc.png +0 -0
  587. package/docs/recipes/oscar64/screenshots/actor-activation-window.png +0 -0
  588. package/docs/recipes/oscar64/screenshots/adventure-engine-ntsc.png +0 -0
  589. package/docs/recipes/oscar64/screenshots/adventure-engine.png +0 -0
  590. package/docs/recipes/oscar64/screenshots/attract-replay-ntsc.png +0 -0
  591. package/docs/recipes/oscar64/screenshots/attract-replay.png +0 -0
  592. package/docs/recipes/oscar64/screenshots/beat-em-up-lanes-ntsc.png +0 -0
  593. package/docs/recipes/oscar64/screenshots/beat-em-up-lanes.png +0 -0
  594. package/docs/recipes/oscar64/screenshots/bfs-distance-map-ntsc.png +0 -0
  595. package/docs/recipes/oscar64/screenshots/bfs-distance-map.png +0 -0
  596. package/docs/recipes/oscar64/screenshots/bitmap-koala-viewer.png +0 -0
  597. package/docs/recipes/oscar64/screenshots/car-contact-ntsc.png +0 -0
  598. package/docs/recipes/oscar64/screenshots/car-contact.png +0 -0
  599. package/docs/recipes/oscar64/screenshots/cave-scan-ntsc.png +0 -0
  600. package/docs/recipes/oscar64/screenshots/cave-scan.png +0 -0
  601. package/docs/recipes/oscar64/screenshots/char-bullets-ntsc.png +0 -0
  602. package/docs/recipes/oscar64/screenshots/char-bullets.png +0 -0
  603. package/docs/recipes/oscar64/screenshots/charset-animation-ntsc.png +0 -0
  604. package/docs/recipes/oscar64/screenshots/charset-animation.png +0 -0
  605. package/docs/recipes/oscar64/screenshots/charset-parallax-ntsc.png +0 -0
  606. package/docs/recipes/oscar64/screenshots/charset-parallax.png +0 -0
  607. package/docs/recipes/oscar64/screenshots/destructible-terrain-ntsc.png +0 -0
  608. package/docs/recipes/oscar64/screenshots/destructible-terrain.png +0 -0
  609. package/docs/recipes/oscar64/screenshots/difficulty-tables-ntsc.png +0 -0
  610. package/docs/recipes/oscar64/screenshots/difficulty-tables.png +0 -0
  611. package/docs/recipes/oscar64/screenshots/dig-and-guards-ntsc.png +0 -0
  612. package/docs/recipes/oscar64/screenshots/dig-and-guards.png +0 -0
  613. package/docs/recipes/oscar64/screenshots/directory-reader-ntsc.png +0 -0
  614. package/docs/recipes/oscar64/screenshots/directory-reader.png +0 -0
  615. package/docs/recipes/oscar64/screenshots/divide-check-ntsc.png +0 -0
  616. package/docs/recipes/oscar64/screenshots/divide-check.png +0 -0
  617. package/docs/recipes/oscar64/screenshots/double-buffer-nomirror.png +0 -0
  618. package/docs/recipes/oscar64/screenshots/double-buffer-ntsc.png +0 -0
  619. package/docs/recipes/oscar64/screenshots/double-buffer.png +0 -0
  620. package/docs/recipes/oscar64/screenshots/falling-blocks-ntsc.png +0 -0
  621. package/docs/recipes/oscar64/screenshots/falling-blocks.png +0 -0
  622. package/docs/recipes/oscar64/screenshots/fixed-point-jump-ntsc.png +0 -0
  623. package/docs/recipes/oscar64/screenshots/fixed-point-jump-velocity-ntsc.png +0 -0
  624. package/docs/recipes/oscar64/screenshots/fixed-point-jump-velocity.png +0 -0
  625. package/docs/recipes/oscar64/screenshots/fixed-point-jump.png +0 -0
  626. package/docs/recipes/oscar64/screenshots/flip-screen-rooms-ntsc.png +0 -0
  627. package/docs/recipes/oscar64/screenshots/flip-screen-rooms.png +0 -0
  628. package/docs/recipes/oscar64/screenshots/frame-sync-loop-ntsc.png +0 -0
  629. package/docs/recipes/oscar64/screenshots/frame-sync-loop-overrun.png +0 -0
  630. package/docs/recipes/oscar64/screenshots/frame-sync-loop.png +0 -0
  631. package/docs/recipes/oscar64/screenshots/game-tree-search-ntsc.png +0 -0
  632. package/docs/recipes/oscar64/screenshots/game-tree-search.png +0 -0
  633. package/docs/recipes/oscar64/screenshots/ghost-targeting-ntsc.png +0 -0
  634. package/docs/recipes/oscar64/screenshots/ghost-targeting.png +0 -0
  635. package/docs/recipes/oscar64/screenshots/headless-verify-ntsc.png +0 -0
  636. package/docs/recipes/oscar64/screenshots/headless-verify.png +0 -0
  637. package/docs/recipes/oscar64/screenshots/hello-world.png +0 -0
  638. package/docs/recipes/oscar64/screenshots/high-score-persist-ntsc.png +0 -0
  639. package/docs/recipes/oscar64/screenshots/high-score-persist.png +0 -0
  640. package/docs/recipes/oscar64/screenshots/iffl-kernal-skip-ntsc.png +0 -0
  641. package/docs/recipes/oscar64/screenshots/iffl-kernal-skip.png +0 -0
  642. package/docs/recipes/oscar64/screenshots/joystick-input-ntsc.png +0 -0
  643. package/docs/recipes/oscar64/screenshots/joystick-input.png +0 -0
  644. package/docs/recipes/oscar64/screenshots/lane-pursuit-ntsc.png +0 -0
  645. package/docs/recipes/oscar64/screenshots/lane-pursuit.png +0 -0
  646. package/docs/recipes/oscar64/screenshots/level-rle-decoder-ntsc.png +0 -0
  647. package/docs/recipes/oscar64/screenshots/level-rle-decoder.png +0 -0
  648. package/docs/recipes/oscar64/screenshots/lfsr-random-ntsc.png +0 -0
  649. package/docs/recipes/oscar64/screenshots/lfsr-random-seed2.png +0 -0
  650. package/docs/recipes/oscar64/screenshots/lfsr-random.png +0 -0
  651. package/docs/recipes/oscar64/screenshots/load-asset-runtime-ntsc.png +0 -0
  652. package/docs/recipes/oscar64/screenshots/load-asset-runtime.png +0 -0
  653. package/docs/recipes/oscar64/screenshots/memory-layout-ntsc.png +0 -0
  654. package/docs/recipes/oscar64/screenshots/memory-layout.png +0 -0
  655. package/docs/recipes/oscar64/screenshots/mixed-fighters-ntsc.png +0 -0
  656. package/docs/recipes/oscar64/screenshots/mixed-fighters.png +0 -0
  657. package/docs/recipes/oscar64/screenshots/multi-sprite-object-ntsc.png +0 -0
  658. package/docs/recipes/oscar64/screenshots/multi-sprite-object.png +0 -0
  659. package/docs/recipes/oscar64/screenshots/nav-area-pathfinding-ntsc.png +0 -0
  660. package/docs/recipes/oscar64/screenshots/nav-area-pathfinding.png +0 -0
  661. package/docs/recipes/oscar64/screenshots/object-pool-ntsc.png +0 -0
  662. package/docs/recipes/oscar64/screenshots/object-pool.png +0 -0
  663. package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-ntsc.png +0 -0
  664. package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-oldntsc.png +0 -0
  665. package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-pal.png +0 -0
  666. package/docs/recipes/oscar64/screenshots/password-state-ntsc.png +0 -0
  667. package/docs/recipes/oscar64/screenshots/password-state.png +0 -0
  668. package/docs/recipes/oscar64/screenshots/per-frame-hitbox-ntsc.png +0 -0
  669. package/docs/recipes/oscar64/screenshots/per-frame-hitbox.png +0 -0
  670. package/docs/recipes/oscar64/screenshots/petscii-screen-codes-ntsc.png +0 -0
  671. package/docs/recipes/oscar64/screenshots/petscii-screen-codes.png +0 -0
  672. package/docs/recipes/oscar64/screenshots/platformer-scaffold-d64-ntsc.png +0 -0
  673. package/docs/recipes/oscar64/screenshots/platformer-scaffold-d64.png +0 -0
  674. package/docs/recipes/oscar64/screenshots/platformer-scaffold-ntsc.png +0 -0
  675. package/docs/recipes/oscar64/screenshots/platformer-scaffold.png +0 -0
  676. package/docs/recipes/oscar64/screenshots/print-number-ntsc.png +0 -0
  677. package/docs/recipes/oscar64/screenshots/print-number.png +0 -0
  678. package/docs/recipes/oscar64/screenshots/raster-bars.png +0 -0
  679. package/docs/recipes/oscar64/screenshots/raster-profile-bars-ntsc.png +0 -0
  680. package/docs/recipes/oscar64/screenshots/raster-profile-bars.png +0 -0
  681. package/docs/recipes/oscar64/screenshots/rel-side-sectors-ntsc.png +0 -0
  682. package/docs/recipes/oscar64/screenshots/rel-side-sectors.png +0 -0
  683. package/docs/recipes/oscar64/screenshots/relative-file-records-ntsc.png +0 -0
  684. package/docs/recipes/oscar64/screenshots/relative-file-records.png +0 -0
  685. package/docs/recipes/oscar64/screenshots/save-load-seq-file-ntsc.png +0 -0
  686. package/docs/recipes/oscar64/screenshots/save-load-seq-file.png +0 -0
  687. package/docs/recipes/oscar64/screenshots/seeded-level-fill-ntsc.png +0 -0
  688. package/docs/recipes/oscar64/screenshots/seeded-level-fill.png +0 -0
  689. package/docs/recipes/oscar64/screenshots/sfx-engine-ntsc.png +0 -0
  690. package/docs/recipes/oscar64/screenshots/sfx-engine.png +0 -0
  691. package/docs/recipes/oscar64/screenshots/sid-music-player.png +0 -0
  692. package/docs/recipes/oscar64/screenshots/simple-shmup.png +0 -0
  693. package/docs/recipes/oscar64/screenshots/slope-collision-ntsc.png +0 -0
  694. package/docs/recipes/oscar64/screenshots/slope-collision.png +0 -0
  695. package/docs/recipes/oscar64/screenshots/soft-scroll-h.png +0 -0
  696. package/docs/recipes/oscar64/screenshots/sprite-animation-table-ntsc.png +0 -0
  697. package/docs/recipes/oscar64/screenshots/sprite-animation-table.png +0 -0
  698. package/docs/recipes/oscar64/screenshots/sprite-multiplex-8.png +0 -0
  699. package/docs/recipes/oscar64/screenshots/stable-raster-irq.png +0 -0
  700. package/docs/recipes/oscar64/screenshots/text-input-ntsc.png +0 -0
  701. package/docs/recipes/oscar64/screenshots/text-input.png +0 -0
  702. package/docs/recipes/oscar64/screenshots/text-overlay-playfield-gameover.png +0 -0
  703. package/docs/recipes/oscar64/screenshots/text-overlay-playfield-notrail-control.png +0 -0
  704. package/docs/recipes/oscar64/screenshots/text-overlay-playfield-ntsc.png +0 -0
  705. package/docs/recipes/oscar64/screenshots/text-overlay-playfield-ungated-control.png +0 -0
  706. package/docs/recipes/oscar64/screenshots/text-overlay-playfield.png +0 -0
  707. package/docs/recipes/oscar64/screenshots/text-window-menu-ntsc.png +0 -0
  708. package/docs/recipes/oscar64/screenshots/text-window-menu.png +0 -0
  709. package/docs/recipes/oscar64/screenshots/tile-grid-collision-ntsc.png +0 -0
  710. package/docs/recipes/oscar64/screenshots/tile-grid-collision.png +0 -0
  711. package/docs/recipes/oscar64/screenshots/tile-map-render-ntsc.png +0 -0
  712. package/docs/recipes/oscar64/screenshots/tile-map-render.png +0 -0
  713. package/docs/recipes/oscar64/screenshots/two-player-ntsc.png +0 -0
  714. package/docs/recipes/oscar64/screenshots/two-player.png +0 -0
  715. package/docs/recipes/oscar64/screenshots/two-word-parser-ntsc.png +0 -0
  716. package/docs/recipes/oscar64/screenshots/two-word-parser.png +0 -0
  717. package/docs/recipes/oscar64/screenshots/vehicle-control-ntsc.png +0 -0
  718. package/docs/recipes/oscar64/screenshots/vehicle-control.png +0 -0
  719. package/docs/recipes/oscar64/screenshots/wave-director-ntsc.png +0 -0
  720. package/docs/recipes/oscar64/screenshots/wave-director.png +0 -0
  721. package/docs/recipes/oscar64/seeded-level-fill.md +364 -0
  722. package/docs/recipes/oscar64/sfx-engine.md +514 -0
  723. package/docs/recipes/oscar64/sid-music-player.md +441 -0
  724. package/docs/recipes/oscar64/simple-shmup.md +1000 -0
  725. package/docs/recipes/oscar64/slope-collision.md +610 -0
  726. package/docs/recipes/oscar64/soft-scroll-h.md +261 -0
  727. package/docs/recipes/oscar64/sprite-animation-table.md +671 -0
  728. package/docs/recipes/oscar64/sprite-multiplex-8.md +314 -0
  729. package/docs/recipes/oscar64/stable-raster-irq.md +236 -0
  730. package/docs/recipes/oscar64/text-input.md +274 -0
  731. package/docs/recipes/oscar64/text-overlay-playfield.md +617 -0
  732. package/docs/recipes/oscar64/text-window-menu.md +551 -0
  733. package/docs/recipes/oscar64/tile-grid-collision.md +563 -0
  734. package/docs/recipes/oscar64/tile-map-render.md +395 -0
  735. package/docs/recipes/oscar64/two-player.md +528 -0
  736. package/docs/recipes/oscar64/two-word-parser.md +510 -0
  737. package/docs/recipes/oscar64/vehicle-control.md +771 -0
  738. package/docs/recipes/oscar64/wave-director.md +787 -0
  739. package/docs/recipes/runs.json +1606 -0
  740. package/docs/runtime/sim6502-reference.md +466 -0
  741. package/docs/runtime/vice-mcp-reference.md +351 -0
  742. package/docs/runtime/vice-reference.md +1393 -0
  743. package/docs/techniques/bitmap-modes.md +685 -0
  744. package/docs/techniques/cpu-cycle-tricks.md +1570 -0
  745. package/docs/techniques/effects-vector-3d.md +1431 -0
  746. package/docs/techniques/file-io.md +1427 -0
  747. package/docs/techniques/input.md +1072 -0
  748. package/docs/techniques/loaders-packers.md +768 -0
  749. package/docs/techniques/logic.md +3091 -0
  750. package/docs/techniques/maths.md +1524 -0
  751. package/docs/techniques/memory-banking.md +1686 -0
  752. package/docs/techniques/music-sid.md +1144 -0
  753. package/docs/techniques/raster.md +1543 -0
  754. package/docs/techniques/scroll.md +1292 -0
  755. package/docs/techniques/sprite.md +2566 -0
  756. package/docs/techniques/text-mode-render.md +717 -0
  757. package/docs/techniques/text.md +1095 -0
  758. package/docs/techniques/transitions.md +405 -0
  759. package/docs/toolchains/cartconv-reference.md +262 -0
  760. package/docs/toolchains/cc1541-reference.md +316 -0
  761. package/docs/toolchains/cc65-reference.md +667 -0
  762. package/docs/toolchains/error-sources/cc65/README.md +1 -0
  763. package/docs/toolchains/error-sources/cc65/missing-setcpu.s +4 -0
  764. package/docs/toolchains/error-sources/cc65/range-error.s +4 -0
  765. package/docs/toolchains/error-sources/cc65/segment-overflow.c +6 -0
  766. package/docs/toolchains/error-sources/cc65/unresolved-external.c +6 -0
  767. package/docs/toolchains/error-sources/kickassembler/README.md +1 -0
  768. package/docs/toolchains/error-sources/kickassembler/branch-out-of-range.asm +4 -0
  769. package/docs/toolchains/error-sources/kickassembler/failed-assert.asm +3 -0
  770. package/docs/toolchains/error-sources/kickassembler/flat-lib.asm +4 -0
  771. package/docs/toolchains/error-sources/kickassembler/import-source-no-namespace.asm +5 -0
  772. package/docs/toolchains/error-sources/kickassembler/macro-without-parentheses.asm +6 -0
  773. package/docs/toolchains/error-sources/kickassembler/memory-block-overlap.asm +4 -0
  774. package/docs/toolchains/error-sources/kickassembler/symbol-clash-lib.asm +5 -0
  775. package/docs/toolchains/error-sources/kickassembler/symbol-clash-main.asm +6 -0
  776. package/docs/toolchains/error-sources/kickassembler/unknown-symbol.asm +4 -0
  777. package/docs/toolchains/error-sources/oscar64/README.md +1 -0
  778. package/docs/toolchains/error-sources/oscar64/asm-addressing-mode.c +7 -0
  779. package/docs/toolchains/error-sources/oscar64/region-overflow.c +6 -0
  780. package/docs/toolchains/error-sources/oscar64/undefined-extern-var.c +5 -0
  781. package/docs/toolchains/error-sources/oscar64/undefined-extern.c +6 -0
  782. package/docs/toolchains/error-sources/oscar64/unknown-vic-field.c +6 -0
  783. package/docs/toolchains/error-sources/oscar64/void-main.c +3 -0
  784. package/docs/toolchains/kickassembler-reference.md +1020 -0
  785. package/docs/toolchains/memory-layout-planning.md +362 -0
  786. package/docs/toolchains/oscar64-headers-reference.md +583 -0
  787. package/docs/toolchains/oscar64-reference.md +892 -0
  788. package/docs/toolchains/petcat-reference.md +290 -0
  789. package/docs/toolchains/png2prg.md +188 -0
  790. package/docs/toolchains/release-disk.md +314 -0
  791. package/docs/toolchains/sidreloc.md +236 -0
  792. package/docs/toolchains/spindle-reference.md +487 -0
  793. package/docs/toolchains/tape-mastering.md +592 -0
  794. package/docs/toolchains/unit-testing-6502.md +281 -0
  795. package/docs/workflow/agent-harness.md +478 -0
  796. package/package.json +105 -0
  797. package/templates/_harness/CLAUDE.md.template +91 -0
  798. package/templates/_harness/PLAN.md.template +72 -0
  799. package/templates/_harness/check.py +442 -0
  800. package/templates/_harness/claude/settings.json +17 -0
  801. package/templates/_harness/gen-asm-header.py +96 -0
  802. package/templates/_harness/harness.mk +273 -0
  803. package/templates/_harness/hooks/plan-gate.py +185 -0
  804. package/templates/_harness/meter/frame_meter.asm +311 -0
  805. package/templates/_harness/meter/frame_meter.c +155 -0
  806. package/templates/_harness/meter/frame_meter.h +80 -0
  807. package/templates/_harness/zp-used.py +104 -0
  808. package/templates/action-puzzle/.claude/settings.json +17 -0
  809. package/templates/action-puzzle/.mcp.json +10 -0
  810. package/templates/action-puzzle/CLAUDE.md +120 -0
  811. package/templates/action-puzzle/Makefile +125 -0
  812. package/templates/action-puzzle/PLAN.md +388 -0
  813. package/templates/action-puzzle/README.md +240 -0
  814. package/templates/action-puzzle/expect.json +25 -0
  815. package/templates/action-puzzle/src/cave.c +280 -0
  816. package/templates/action-puzzle/src/cave.h +80 -0
  817. package/templates/action-puzzle/src/gen_autopilot.h +20 -0
  818. package/templates/action-puzzle/src/gen_caves.h +59 -0
  819. package/templates/action-puzzle/src/gen_notes.h +16 -0
  820. package/templates/action-puzzle/src/hiscore.c +152 -0
  821. package/templates/action-puzzle/src/hiscore.h +41 -0
  822. package/templates/action-puzzle/src/level.c +64 -0
  823. package/templates/action-puzzle/src/level.h +24 -0
  824. package/templates/action-puzzle/src/main.c +599 -0
  825. package/templates/action-puzzle/src/render.c +239 -0
  826. package/templates/action-puzzle/src/render.h +31 -0
  827. package/templates/action-puzzle/src/sound.c +158 -0
  828. package/templates/action-puzzle/src/sound.h +22 -0
  829. package/templates/action-puzzle/tools/disk_check.py +77 -0
  830. package/templates/action-puzzle/tools/drive.py +106 -0
  831. package/templates/action-puzzle/tools/gen.py +454 -0
  832. package/templates/action-puzzle/tools/model_check.py +49 -0
  833. package/templates/action-puzzle/tools/verdict_codes.py +24 -0
  834. package/templates/adventure/.claude/settings.json +17 -0
  835. package/templates/adventure/.mcp.json +10 -0
  836. package/templates/adventure/CLAUDE.md +118 -0
  837. package/templates/adventure/Makefile +113 -0
  838. package/templates/adventure/PLAN.md +396 -0
  839. package/templates/adventure/README.md +277 -0
  840. package/templates/adventure/expect.json +25 -0
  841. package/templates/adventure/src/engine.c +543 -0
  842. package/templates/adventure/src/engine.h +48 -0
  843. package/templates/adventure/src/gen_script.h +141 -0
  844. package/templates/adventure/src/gen_world.h +511 -0
  845. package/templates/adventure/src/main.c +439 -0
  846. package/templates/adventure/src/picture.c +83 -0
  847. package/templates/adventure/src/picture.h +16 -0
  848. package/templates/adventure/src/save.c +159 -0
  849. package/templates/adventure/src/save.h +25 -0
  850. package/templates/adventure/src/sound.c +71 -0
  851. package/templates/adventure/src/sound.h +16 -0
  852. package/templates/adventure/src/text.c +349 -0
  853. package/templates/adventure/src/text.h +40 -0
  854. package/templates/adventure/tools/disk_check.py +128 -0
  855. package/templates/adventure/tools/drive.py +119 -0
  856. package/templates/adventure/tools/gen.py +1033 -0
  857. package/templates/adventure/tools/world.py +356 -0
  858. package/templates/beat-em-up/.claude/settings.json +17 -0
  859. package/templates/beat-em-up/.mcp.json +10 -0
  860. package/templates/beat-em-up/CLAUDE.md +136 -0
  861. package/templates/beat-em-up/Makefile +96 -0
  862. package/templates/beat-em-up/PLAN.md +502 -0
  863. package/templates/beat-em-up/README.md +315 -0
  864. package/templates/beat-em-up/expect-gameover.json +8 -0
  865. package/templates/beat-em-up/expect.json +29 -0
  866. package/templates/beat-em-up/src/anim.c +70 -0
  867. package/templates/beat-em-up/src/art.c +344 -0
  868. package/templates/beat-em-up/src/autopilot.h +154 -0
  869. package/templates/beat-em-up/src/brute.c +273 -0
  870. package/templates/beat-em-up/src/enemy.c +281 -0
  871. package/templates/beat-em-up/src/engine.asm +512 -0
  872. package/templates/beat-em-up/src/fighter.c +384 -0
  873. package/templates/beat-em-up/src/game.h +269 -0
  874. package/templates/beat-em-up/src/hud.c +135 -0
  875. package/templates/beat-em-up/src/main.c +341 -0
  876. package/templates/beat-em-up/src/sound.c +44 -0
  877. package/templates/beat-em-up/src/street.c +93 -0
  878. package/templates/beat-em-up/src/verdict.h +523 -0
  879. package/templates/beat-em-up/src/view.c +362 -0
  880. package/templates/beat-em-up/tools/drive.py +105 -0
  881. package/templates/beat-em-up/tools/flickercheck.py +273 -0
  882. package/templates/demo/.claude/settings.json +17 -0
  883. package/templates/demo/.mcp.json +10 -0
  884. package/templates/demo/CLAUDE.md +129 -0
  885. package/templates/demo/Makefile +66 -0
  886. package/templates/demo/PLAN.md +401 -0
  887. package/templates/demo/README.md +322 -0
  888. package/templates/demo/expect.json +945 -0
  889. package/templates/demo/src/config.asm +80 -0
  890. package/templates/demo/src/framework.asm +390 -0
  891. package/templates/demo/src/main.asm +139 -0
  892. package/templates/demo/src/music.asm +197 -0
  893. package/templates/demo/src/part_main.asm +279 -0
  894. package/templates/demo/src/part_title.asm +79 -0
  895. package/templates/demo/src/parts.asm +43 -0
  896. package/templates/demo/src/tables.asm +73 -0
  897. package/templates/demo/src/verdict.asm +179 -0
  898. package/templates/demo/tools/audio.py +80 -0
  899. package/templates/demo/tools/gen_expect.py +167 -0
  900. package/templates/demo/tools/probe.py +95 -0
  901. package/templates/hello/.claude/settings.json +17 -0
  902. package/templates/hello/.mcp.json +10 -0
  903. package/templates/hello/CLAUDE.md +100 -0
  904. package/templates/hello/Makefile +38 -0
  905. package/templates/hello/PLAN.md +200 -0
  906. package/templates/hello/expect.json +20 -0
  907. package/templates/hello/src/main.c +161 -0
  908. package/templates/hello/src/sprite.asm +27 -0
  909. package/templates/hello-kick/.claude/settings.json +17 -0
  910. package/templates/hello-kick/.mcp.json +10 -0
  911. package/templates/hello-kick/CLAUDE.md +100 -0
  912. package/templates/hello-kick/Makefile +17 -0
  913. package/templates/hello-kick/PLAN.md +199 -0
  914. package/templates/hello-kick/expect.json +20 -0
  915. package/templates/hello-kick/src/main.asm +233 -0
  916. package/templates/platformer/.claude/settings.json +17 -0
  917. package/templates/platformer/.mcp.json +10 -0
  918. package/templates/platformer/CLAUDE.md +125 -0
  919. package/templates/platformer/Makefile +86 -0
  920. package/templates/platformer/PLAN.md +360 -0
  921. package/templates/platformer/README.md +277 -0
  922. package/templates/platformer/expect.json +32 -0
  923. package/templates/platformer/src/actors.c +289 -0
  924. package/templates/platformer/src/anim.c +51 -0
  925. package/templates/platformer/src/art.c +212 -0
  926. package/templates/platformer/src/autopilot.h +30 -0
  927. package/templates/platformer/src/engine.asm +253 -0
  928. package/templates/platformer/src/game.h +248 -0
  929. package/templates/platformer/src/hud.c +90 -0
  930. package/templates/platformer/src/level.c +184 -0
  931. package/templates/platformer/src/main.c +306 -0
  932. package/templates/platformer/src/player.c +268 -0
  933. package/templates/platformer/src/sound.c +42 -0
  934. package/templates/platformer/src/verdict.h +206 -0
  935. package/templates/platformer/src/view.c +331 -0
  936. package/templates/platformer/stage-expect.json +6 -0
  937. package/templates/platformer/tools/drive.py +112 -0
  938. package/templates/platformer/tools/tearcheck.py +229 -0
  939. package/templates/shmup-vertical/.claude/settings.json +17 -0
  940. package/templates/shmup-vertical/.mcp.json +10 -0
  941. package/templates/shmup-vertical/CLAUDE.md +137 -0
  942. package/templates/shmup-vertical/Makefile +131 -0
  943. package/templates/shmup-vertical/PLAN.md +569 -0
  944. package/templates/shmup-vertical/README.md +189 -0
  945. package/templates/shmup-vertical/expect.json +38 -0
  946. package/templates/shmup-vertical/src/bullets.c +158 -0
  947. package/templates/shmup-vertical/src/bullets.h +35 -0
  948. package/templates/shmup-vertical/src/display.c +239 -0
  949. package/templates/shmup-vertical/src/display.h +40 -0
  950. package/templates/shmup-vertical/src/game.h +85 -0
  951. package/templates/shmup-vertical/src/glyph.asm +358 -0
  952. package/templates/shmup-vertical/src/hiscore.c +141 -0
  953. package/templates/shmup-vertical/src/hiscore.h +16 -0
  954. package/templates/shmup-vertical/src/hit.asm +180 -0
  955. package/templates/shmup-vertical/src/hitbox.c +59 -0
  956. package/templates/shmup-vertical/src/hitbox.h +25 -0
  957. package/templates/shmup-vertical/src/kernel.asm +330 -0
  958. package/templates/shmup-vertical/src/level.c +174 -0
  959. package/templates/shmup-vertical/src/level.h +27 -0
  960. package/templates/shmup-vertical/src/main.c +824 -0
  961. package/templates/shmup-vertical/src/mux.asm +321 -0
  962. package/templates/shmup-vertical/src/sound.asm +255 -0
  963. package/templates/shmup-vertical/src/step.asm +169 -0
  964. package/templates/shmup-vertical/src/waves.c +195 -0
  965. package/templates/shmup-vertical/src/waves.h +33 -0
  966. package/templates/shmup-vertical/stage-expect.json +6 -0
  967. package/templates/shmup-vertical/tools/drive.py +152 -0
  968. package/templates/shmup-vertical/tools/joytest.py +159 -0
  969. package/templates/shmup-vertical/tools/meter.py +15 -0
  970. package/templates/shmup-vertical/tools/phases.py +73 -0
@@ -0,0 +1,1007 @@
1
+ ---
2
+ recipe: compare-16bit-signed
3
+ toolchain: kickassembler
4
+ output_format: PRG
5
+ region: both
6
+ techniques: [compare_16bit_and_signed]
7
+ file_formats: [PRG]
8
+ uses_registers: [D011, D020, DD04, DD05, DD06, DD07, DD0E, DD0F]
9
+ uses_kernal: [CHROUT]
10
+ ---
11
+
12
+ <!-- doc-type: recipe -->
13
+
14
+ # KickAssembler — 16-bit and signed compares, proved and timed
15
+
16
+ ## Synopsis
17
+
18
+ Five compare idioms run against boundary pairs and full sweeps: unsigned
19
+ 16-bit (high byte first), signed 8-bit and signed 16-bit (`SBC` then
20
+ `BVC` / `EOR #$80`), an unsigned range test (`x` in `[lo, lo + w)`), and
21
+ the wrong one, a signed compare that trusts `BMI` after the subtract.
22
+ The program prints the processor flags each idiom leaves on eight 8-bit
23
+ and seven 16-bit boundary pairs, folds every sweep result into a
24
+ checksum and compares it with the value a Python model computed, counts
25
+ how many pairs the `BMI` version gets wrong, times one call of each
26
+ idiom with the CIA2 timers, and leaves a verdict where a harness can
27
+ read it: `$02FF` = `$01` and a green border when the four correct
28
+ idioms match their checksums and the `BMI` version misses exactly the
29
+ 16,384 pairs the model predicts, `$02FF` = `$02` and a red border
30
+ otherwise.
31
+
32
+ ## Source
33
+
34
+ ```asm
35
+ // compare-16bit-signed.asm
36
+ // Runs five compare idioms over boundary pairs and full sweeps, prints
37
+ // the processor flags each idiom leaves on the boundary pairs, checks
38
+ // every sweep against a checksum computed in Python, times one call of
39
+ // each idiom with the CIA2 timers, and leaves a verdict where a harness
40
+ // can read it: $02FF = $01 and a green border when the four correct
41
+ // idioms match their checksums and the naive BMI compare misses exactly
42
+ // the 16,384 pairs it is expected to miss; $02FF = $02 and a red border
43
+ // otherwise.
44
+
45
+ BasicUpstart2(start)
46
+ .encoding "screencode_upper"
47
+
48
+ .const SCREEN = $0400
49
+ .const RESULT = $02ff // verdict byte read by the harness
50
+ .const BORDER = $d020
51
+ .const CODE_PASS = $01
52
+ .const CODE_FAIL = $02
53
+
54
+ // expected checksums, from the Python model on the recipe page
55
+ .const EXP_U16 = $6182
56
+ .const EXP_S8 = $73fa
57
+ .const EXP_S16 = $27b8
58
+ .const EXP_RNG = $a021
59
+ .const EXP_BMI = $a3cd
60
+ .const EXP_MISS = 16384
61
+
62
+ .const src = $fb // zero-page pointer: string source
63
+ .const dst = $fd // zero-page pointer: screen destination
64
+
65
+ // ---------------------------------------------------------------- idioms
66
+ // Operands are absolute variables so the timed cost is the common case.
67
+
68
+ // Unsigned 16-bit: a_hi:a_lo against b_hi:b_lo.
69
+ // Exit: C clear means a < b, C set means a >= b, Z set means a == b.
70
+ u16:
71
+ lda a_hi
72
+ cmp b_hi
73
+ bne !+ // high bytes differ: they decide
74
+ lda a_lo
75
+ cmp b_lo // high bytes equal: the low bytes decide
76
+ !: rts
77
+
78
+ // Signed 8-bit: a8 against b8. Exit: N set means a < b.
79
+ s8:
80
+ lda a8
81
+ sec
82
+ sbc b8
83
+ bvc !+ // no overflow: N is the sign of a - b
84
+ eor #$80 // overflow: the sign came out inverted
85
+ !: rts
86
+
87
+ // Signed 16-bit. Exit: N set means a < b.
88
+ s16:
89
+ lda a_lo
90
+ cmp b_lo // sets C for the high-byte subtract
91
+ lda a_hi
92
+ sbc b_hi
93
+ bvc !+
94
+ eor #$80
95
+ !: rts
96
+
97
+ // The wrong way: signed compare by the sign of the difference alone.
98
+ bmi8:
99
+ lda a8
100
+ sec
101
+ sbc b8
102
+ rts // N is wrong whenever a - b overflowed
103
+
104
+ // Unsigned range: x8 in [lo8, lo8 + w8). Exit: C clear means inside.
105
+ rng:
106
+ lda x8
107
+ sec
108
+ sbc lo8
109
+ cmp w8
110
+ rts
111
+
112
+ // ---------------------------------------------------------------- probes
113
+ // Same instructions with PHP after the points the page tabulates.
114
+
115
+ probe8:
116
+ lda a8
117
+ sec
118
+ sbc b8
119
+ php // P after SBC
120
+ bvc !+
121
+ eor #$80
122
+ !: php // P after the fix-up
123
+ pla
124
+ sta p_fix
125
+ pla
126
+ sta p_sbc
127
+ rts
128
+
129
+ probe16:
130
+ clv // CMP never touches V; clear it so the
131
+ lda a_hi // table shows what CMP alone leaves
132
+ cmp b_hi
133
+ php // P after the high-byte CMP alone
134
+ pla
135
+ sta p_cmph
136
+ jsr u16
137
+ php
138
+ pla
139
+ sta p_u16
140
+ jsr s16
141
+ php
142
+ pla
143
+ sta p_s16
144
+ rts
145
+
146
+ // ---------------------------------------------------------------- timing
147
+ // Time(routine, slot): CIA2 timer A counts phi2, timer B counts A
148
+ // underflows; the 24-bit count lands in slot.
149
+ .macro Time(routine, slot) {
150
+ lda #$51
151
+ sta $dd0f
152
+ lda #$11
153
+ sta $dd0e
154
+ jsr routine
155
+ lda #$00
156
+ sta $dd0e
157
+ sta $dd0f
158
+ sec // the routine left C in either state
159
+ lda #$ff
160
+ sbc $dd04
161
+ sta slot
162
+ lda #$ff
163
+ sbc $dd05
164
+ sta slot+1
165
+ lda #$ff
166
+ sbc $dd06
167
+ sta slot+2
168
+ }
169
+
170
+ .macro Net(slot) {
171
+ sec
172
+ lda slot
173
+ sbc empty
174
+ sta slot
175
+ }
176
+
177
+ nothing:
178
+ rts
179
+
180
+ // ---------------------------------------------------------------- sweeps
181
+ // sweep: for ii in 0..255, for jj in 0..255: jsr pair; fold the 0/1
182
+ // result into cs together with the pair. cs is not reset here.
183
+ sweep:
184
+ lda #0
185
+ sta ii
186
+ !outer:
187
+ lda #0
188
+ sta jj
189
+ !inner:
190
+ pair_jsr:
191
+ jsr $0000 // patched by RunSweep
192
+ jsr fold
193
+ inc jj
194
+ bne !inner-
195
+ inc ii
196
+ bne !outer-
197
+ rts
198
+
199
+ // fold: A = 0 or 1. cs = rol16(cs) ^ (A ? ii:jj : 0) + 13
200
+ fold:
201
+ tax
202
+ asl cs
203
+ rol cs+1
204
+ bcc !+
205
+ inc cs
206
+ !: txa
207
+ beq !+
208
+ lda cs
209
+ eor jj
210
+ sta cs
211
+ lda cs+1
212
+ eor ii
213
+ sta cs+1
214
+ !: clc
215
+ lda cs
216
+ adc #13
217
+ sta cs
218
+ bcc !+
219
+ inc cs+1
220
+ !: rts
221
+
222
+ // The pair routines set the operands from ii, jj and return A = 1 for
223
+ // "less" (or "inside"), else 0.
224
+ pair_s8:
225
+ lda ii
226
+ sta a8
227
+ lda jj
228
+ sta b8
229
+ jsr s8
230
+ jmp n_to_a
231
+
232
+ pair_bmi: // also counts disagreements with s8
233
+ lda ii
234
+ sta a8
235
+ lda jj
236
+ sta b8
237
+ jsr s8
238
+ jsr n_to_a
239
+ sta tmp
240
+ jsr bmi8
241
+ jsr n_to_a
242
+ cmp tmp
243
+ beq !+
244
+ inc miss
245
+ bne !+
246
+ inc miss+1
247
+ !: rts
248
+
249
+ pair_u16a: // a = ii:jj, b = jj:ii
250
+ lda ii
251
+ sta a_hi
252
+ sta b_lo
253
+ lda jj
254
+ sta a_lo
255
+ sta b_hi
256
+ jsr u16
257
+ jmp c_to_a
258
+
259
+ pair_u16b: // a = ii:jj, b = ii:(7*jj+3)
260
+ jsr set_b
261
+ jsr u16
262
+ jmp c_to_a
263
+
264
+ pair_s16a:
265
+ lda ii
266
+ sta a_hi
267
+ sta b_lo
268
+ lda jj
269
+ sta a_lo
270
+ sta b_hi
271
+ jsr s16
272
+ jmp n_to_a
273
+
274
+ pair_s16b:
275
+ jsr set_b
276
+ jsr s16
277
+ jmp n_to_a
278
+
279
+ pair_rng: // lo = ii, w = min(32, 256 - lo), x = jj
280
+ lda ii
281
+ sta lo8
282
+ cmp #224
283
+ bcc !+
284
+ lda #0
285
+ sec
286
+ sbc ii
287
+ jmp !++
288
+ !: lda #32
289
+ !: sta w8
290
+ lda jj
291
+ sta x8
292
+ jsr rng
293
+ jmp c_to_a
294
+
295
+ set_b:
296
+ lda ii
297
+ sta a_hi
298
+ sta b_hi
299
+ lda jj
300
+ sta a_lo
301
+ asl
302
+ asl
303
+ asl
304
+ sec
305
+ sbc jj
306
+ clc
307
+ adc #3
308
+ sta b_lo
309
+ rts
310
+
311
+ n_to_a: // N set -> A = 1, else 0; flags from the compare
312
+ bmi !+
313
+ lda #0
314
+ rts
315
+ !: lda #1
316
+ rts
317
+
318
+ c_to_a: // C clear -> A = 1, else 0
319
+ lda #0
320
+ rol
321
+ eor #1
322
+ rts
323
+
324
+ // ---------------------------------------------------------------- printing
325
+ .macro PutStr(addr, str) {
326
+ lda #<addr
327
+ sta dst
328
+ lda #>addr
329
+ sta dst+1
330
+ lda #<text
331
+ sta src
332
+ lda #>text
333
+ sta src+1
334
+ jsr puts
335
+ jmp done
336
+ text:
337
+ .text str
338
+ .byte 0
339
+ done:
340
+ }
341
+
342
+ puts:
343
+ ldy #0
344
+ !: lda (src),y
345
+ beq !+
346
+ sta (dst),y
347
+ iny
348
+ bne !-
349
+ !: rts
350
+
351
+ .macro At(addr) {
352
+ lda #<addr
353
+ sta dst
354
+ lda #>addr
355
+ sta dst+1
356
+ }
357
+
358
+ // hex2: A = byte, written at (dst); two screen-code digits
359
+ hex2:
360
+ pha
361
+ lsr
362
+ lsr
363
+ lsr
364
+ lsr
365
+ jsr hexdigit
366
+ ldy #0
367
+ sta (dst),y
368
+ pla
369
+ and #$0f
370
+ jsr hexdigit
371
+ ldy #1
372
+ sta (dst),y
373
+ rts
374
+
375
+ hexdigit:
376
+ cmp #10
377
+ bcc !+
378
+ sbc #9 // 10..15 -> screen codes 1..6, "A".."F"
379
+ rts
380
+ !: ora #$30 // 0..9 -> "0".."9"
381
+ rts
382
+
383
+ // flags4: A = P; writes N V Z C or "." for a clear bit
384
+ flags4:
385
+ sta tmp
386
+ ldy #0
387
+ ldx #'N'
388
+ asl tmp // bit 7
389
+ jsr flagchar
390
+ ldx #'V'
391
+ asl tmp // bit 6
392
+ jsr flagchar
393
+ asl tmp // bit 5, unused
394
+ asl tmp // bit 4, B
395
+ asl tmp // bit 3, D
396
+ asl tmp // bit 2, I
397
+ ldx #'Z'
398
+ asl tmp // bit 1
399
+ jsr flagchar
400
+ ldx #'C'
401
+ asl tmp // bit 0
402
+ flagchar:
403
+ bcs !+
404
+ ldx #'.'
405
+ !: txa
406
+ sta (dst),y
407
+ iny
408
+ rts
409
+
410
+ // lg: A = 0 or 1; writes "L" for 1 (less), "G" for 0 (not less)
411
+ lg:
412
+ tax
413
+ lda #'G'
414
+ cpx #0
415
+ beq !+
416
+ lda #'L'
417
+ !: ldy #0
418
+ sta (dst),y
419
+ rts
420
+
421
+ // dec3: A = byte; three decimal digits at (dst), leading zeros as spaces
422
+ dec3:
423
+ ldy #0
424
+ ldx #'0'-1
425
+ !: inx
426
+ sec
427
+ sbc #100
428
+ bcs !-
429
+ adc #100
430
+ jsr decchar
431
+ ldx #'0'-1
432
+ !: inx
433
+ sec
434
+ sbc #10
435
+ bcs !-
436
+ adc #10
437
+ jsr decchar
438
+ ora #$30
439
+ sta (dst),y
440
+ rts
441
+ decchar: // X = digit char; blank while leading
442
+ pha
443
+ cpx #'0'
444
+ bne !+
445
+ cpy #2 // the units digit is never blanked
446
+ beq !+
447
+ lda tmp2 // still leading?
448
+ beq !++
449
+ !: stx tmp2 // a non-zero digit ends the leading run
450
+ txa
451
+ sta (dst),y
452
+ iny
453
+ pla
454
+ rts
455
+ !: lda #' '
456
+ sta (dst),y
457
+ iny
458
+ pla
459
+ rts
460
+
461
+ // dec5: 16-bit value in num, five digits at (dst)
462
+ dec5:
463
+ ldy #0
464
+ sty tmp
465
+ lda #<10000
466
+ sta sub
467
+ lda #>10000
468
+ sta sub+1
469
+ jsr decdiv
470
+ lda #<1000
471
+ sta sub
472
+ lda #>1000
473
+ sta sub+1
474
+ jsr decdiv
475
+ lda #100
476
+ sta sub
477
+ lda #0
478
+ sta sub+1
479
+ jsr decdiv
480
+ lda #10
481
+ sta sub
482
+ jsr decdiv
483
+ lda num
484
+ ora #$30
485
+ sta (dst),y
486
+ rts
487
+ decdiv: // count how often sub goes into num
488
+ !: lda num
489
+ sec
490
+ sbc sub
491
+ tax
492
+ lda num+1
493
+ sbc sub+1
494
+ bcc !+
495
+ sta num+1
496
+ stx num
497
+ inc tmp
498
+ jmp !-
499
+ !: lda tmp
500
+ ora #$30
501
+ sta (dst),y
502
+ iny
503
+ lda #0
504
+ sta tmp
505
+ rts
506
+
507
+ // ---------------------------------------------------------------- tables
508
+ .macro Probe8(a, b, exp, row) {
509
+ lda #a
510
+ sta a8
511
+ lda #b
512
+ sta b8
513
+ jsr probe8
514
+ At(SCREEN + row*40 + 6)
515
+ lda #a
516
+ jsr hex2
517
+ At(SCREEN + row*40 + 9)
518
+ lda #b
519
+ jsr hex2
520
+ At(SCREEN + row*40 + 12)
521
+ lda p_sbc
522
+ jsr flags4
523
+ At(SCREEN + row*40 + 17)
524
+ lda p_fix
525
+ jsr flags4
526
+ At(SCREEN + row*40 + 23)
527
+ jsr s8
528
+ jsr n_to_a
529
+ jsr lg
530
+ At(SCREEN + row*40 + 27)
531
+ jsr bmi8
532
+ jsr n_to_a
533
+ jsr lg
534
+ At(SCREEN + row*40 + 31)
535
+ lda #exp
536
+ jsr lg
537
+ }
538
+
539
+ .macro Probe16(a, b, expu, exps, row) {
540
+ lda #<a
541
+ sta a_lo
542
+ lda #>a
543
+ sta a_hi
544
+ lda #<b
545
+ sta b_lo
546
+ lda #>b
547
+ sta b_hi
548
+ jsr probe16
549
+ At(SCREEN + row*40 + 6)
550
+ lda #>a
551
+ jsr hex2
552
+ At(SCREEN + row*40 + 8)
553
+ lda #<a
554
+ jsr hex2
555
+ At(SCREEN + row*40 + 11)
556
+ lda #>b
557
+ jsr hex2
558
+ At(SCREEN + row*40 + 13)
559
+ lda #<b
560
+ jsr hex2
561
+ At(SCREEN + row*40 + 16)
562
+ lda p_cmph
563
+ jsr flags4
564
+ At(SCREEN + row*40 + 21)
565
+ lda p_u16
566
+ jsr flags4
567
+ At(SCREEN + row*40 + 26)
568
+ lda p_s16
569
+ jsr flags4
570
+ At(SCREEN + row*40 + 31)
571
+ jsr u16
572
+ jsr c_to_a
573
+ jsr lg
574
+ At(SCREEN + row*40 + 33)
575
+ jsr s16
576
+ jsr n_to_a
577
+ jsr lg
578
+ At(SCREEN + row*40 + 35)
579
+ lda #expu
580
+ jsr lg
581
+ At(SCREEN + row*40 + 38)
582
+ lda #exps
583
+ jsr lg
584
+ }
585
+
586
+ // RunSweep(routine): patch the driver and run one 65,536-pair sweep
587
+ .macro RunSweep(routine) {
588
+ lda #<routine
589
+ sta pair_jsr+1
590
+ lda #>routine
591
+ sta pair_jsr+2
592
+ jsr sweep
593
+ }
594
+
595
+ // Report(row, label, expect): print cs against expect, PASS or FAIL,
596
+ // and clear ok if they differ
597
+ .macro Report(row, label, expect) {
598
+ PutStr(SCREEN + row*40, label)
599
+ At(SCREEN + row*40 + 7)
600
+ lda cs+1
601
+ jsr hex2
602
+ At(SCREEN + row*40 + 9)
603
+ lda cs
604
+ jsr hex2
605
+ PutStr(SCREEN + row*40 + 12, "EXP")
606
+ At(SCREEN + row*40 + 16)
607
+ lda #>expect
608
+ jsr hex2
609
+ At(SCREEN + row*40 + 18)
610
+ lda #<expect
611
+ jsr hex2
612
+ lda cs
613
+ cmp #<expect
614
+ bne !+
615
+ lda cs+1
616
+ cmp #>expect
617
+ bne !+
618
+ PutStr(SCREEN + row*40 + 21, "PASS")
619
+ jmp !++
620
+ !: PutStr(SCREEN + row*40 + 21, "FAIL")
621
+ lda #0
622
+ sta ok
623
+ !:
624
+ }
625
+
626
+ .macro ClearCs() {
627
+ lda #0
628
+ sta cs
629
+ sta cs+1
630
+ }
631
+
632
+ // ---------------------------------------------------------------- main
633
+ start:
634
+ lda #$93 // clear screen through CHROUT
635
+ jsr $ffd2
636
+ lda #1
637
+ sta ok
638
+ lda #0
639
+ sta miss
640
+ sta miss+1
641
+ sta tmp
642
+
643
+ // -------- timing, interrupts off and screen blanked (no badlines)
644
+ sei
645
+ lda #$00
646
+ sta $dd0e
647
+ sta $dd0f
648
+ lda #$ff
649
+ sta $dd04
650
+ sta $dd05
651
+ sta $dd06
652
+ sta $dd07
653
+ lda $d011
654
+ and #$ef
655
+ sta $d011
656
+ !: lda $d011
657
+ bpl !-
658
+ !: lda $d011
659
+ bmi !-
660
+
661
+ Time(nothing, empty)
662
+ lda #$ff // u16, high bytes differ: $7FFF vs $8000
663
+ sta a_lo
664
+ lda #$7f
665
+ sta a_hi
666
+ lda #$00
667
+ sta b_lo
668
+ lda #$80
669
+ sta b_hi
670
+ Time(u16, t_u16d)
671
+ Time(s16, t_s16) // s16 on the same pair
672
+ lda #$34 // u16, high bytes equal: $1234 vs $1234
673
+ sta a_lo
674
+ sta b_lo
675
+ lda #$12
676
+ sta a_hi
677
+ sta b_hi
678
+ Time(u16, t_u16e)
679
+ lda #$80 // s8: -128 against 127
680
+ sta a8
681
+ lda #$7f
682
+ sta b8
683
+ Time(s8, t_s8)
684
+ lda #100 // rng: 100 in [90, 122)
685
+ sta x8
686
+ lda #90
687
+ sta lo8
688
+ lda #32
689
+ sta w8
690
+ Time(rng, t_rng)
691
+
692
+ lda $d011
693
+ ora #$10
694
+ sta $d011
695
+ cli
696
+
697
+ Net(t_u16d)
698
+ Net(t_u16e)
699
+ Net(t_s8)
700
+ Net(t_s16)
701
+ Net(t_rng)
702
+
703
+ // -------- boundary tables
704
+ PutStr(SCREEN, "COMPARE 16BIT AND SIGNED")
705
+ PutStr(SCREEN + 1*40, "8BIT A B SBC FIX IDM NAI EXP")
706
+ Probe8($80, $7f, 1, 2)
707
+ Probe8($7f, $80, 0, 3)
708
+ Probe8($00, $00, 0, 4)
709
+ Probe8($ff, $00, 1, 5)
710
+ Probe8($00, $ff, 0, 6)
711
+ Probe8($80, $80, 0, 7)
712
+ Probe8($7f, $7f, 0, 8)
713
+ Probe8($9c, $64, 1, 9)
714
+ PutStr(SCREEN + 10*40, "16BIT A B CMPH U16 S16 U S EU ES")
715
+ Probe16($7fff, $8000, 1, 0, 11)
716
+ Probe16($8000, $7fff, 0, 1, 12)
717
+ Probe16($1234, $1234, 0, 0, 13)
718
+ Probe16($0000, $ffff, 1, 0, 14)
719
+ Probe16($ffff, $0000, 0, 1, 15)
720
+ Probe16($0100, $00ff, 0, 0, 16)
721
+ Probe16($00ff, $0100, 1, 1, 17)
722
+
723
+ // -------- sweeps
724
+ ClearCs()
725
+ RunSweep(pair_u16a)
726
+ RunSweep(pair_u16b)
727
+ Report(18, "U16 CS", EXP_U16)
728
+ ClearCs()
729
+ RunSweep(pair_s8)
730
+ Report(19, "S8 CS", EXP_S8)
731
+ ClearCs()
732
+ RunSweep(pair_s16a)
733
+ RunSweep(pair_s16b)
734
+ Report(20, "S16 CS", EXP_S16)
735
+ ClearCs()
736
+ RunSweep(pair_rng)
737
+ Report(21, "RNG CS", EXP_RNG)
738
+ ClearCs()
739
+ RunSweep(pair_bmi)
740
+ Report(22, "BMI CS", EXP_BMI)
741
+ PutStr(SCREEN + 22*40 + 26, "WRONG")
742
+ At(SCREEN + 22*40 + 32)
743
+ lda miss
744
+ sta num
745
+ lda miss+1
746
+ sta num+1
747
+ jsr dec5
748
+ lda miss
749
+ cmp #<EXP_MISS
750
+ bne fail_miss
751
+ lda miss+1
752
+ cmp #>EXP_MISS
753
+ beq miss_ok
754
+ fail_miss:
755
+ lda #0
756
+ sta ok
757
+ miss_ok:
758
+
759
+ // -------- cycle line
760
+ PutStr(SCREEN + 23*40, "CYC U16")
761
+ lda #0
762
+ sta tmp2
763
+ At(SCREEN + 23*40 + 8)
764
+ lda t_u16d
765
+ jsr dec3
766
+ lda #0
767
+ sta tmp2
768
+ At(SCREEN + 23*40 + 12)
769
+ lda t_u16e
770
+ jsr dec3
771
+ PutStr(SCREEN + 23*40 + 16, "S8")
772
+ lda #0
773
+ sta tmp2
774
+ At(SCREEN + 23*40 + 19)
775
+ lda t_s8
776
+ jsr dec3
777
+ PutStr(SCREEN + 23*40 + 23, "S16")
778
+ lda #0
779
+ sta tmp2
780
+ At(SCREEN + 23*40 + 27)
781
+ lda t_s16
782
+ jsr dec3
783
+ PutStr(SCREEN + 23*40 + 31, "RNG")
784
+ lda #0
785
+ sta tmp2
786
+ At(SCREEN + 23*40 + 35)
787
+ lda t_rng
788
+ jsr dec3
789
+
790
+ // -------- verdict
791
+ lda ok
792
+ beq fail
793
+ lda #CODE_PASS
794
+ sta RESULT
795
+ lda #5
796
+ sta BORDER
797
+ PutStr(SCREEN + 24*40, "RESULT 01 PASS")
798
+ halt:
799
+ jmp halt // stay here so BASIC's READY. does not scroll the table
800
+ fail:
801
+ lda #CODE_FAIL
802
+ sta RESULT
803
+ lda #2
804
+ sta BORDER
805
+ PutStr(SCREEN + 24*40, "RESULT 02 FAIL")
806
+ jmp halt
807
+
808
+ // ---------------------------------------------------------------- data
809
+ a_lo: .byte 0
810
+ a_hi: .byte 0
811
+ b_lo: .byte 0
812
+ b_hi: .byte 0
813
+ a8: .byte 0
814
+ b8: .byte 0
815
+ x8: .byte 0
816
+ lo8: .byte 0
817
+ w8: .byte 0
818
+ p_sbc: .byte 0
819
+ p_fix: .byte 0
820
+ p_cmph: .byte 0
821
+ p_u16: .byte 0
822
+ p_s16: .byte 0
823
+ ii: .byte 0
824
+ jj: .byte 0
825
+ cs: .word 0
826
+ miss: .word 0
827
+ num: .word 0
828
+ sub: .word 0
829
+ tmp: .byte 0
830
+ tmp2: .byte 0
831
+ ok: .byte 0
832
+ empty: .byte 0, 0, 0
833
+ t_u16d: .byte 0, 0, 0
834
+ t_u16e: .byte 0, 0, 0
835
+ t_s8: .byte 0, 0, 0
836
+ t_s16: .byte 0, 0, 0
837
+ t_rng: .byte 0, 0, 0
838
+ ```
839
+
840
+ ## Build
841
+
842
+ ```bash
843
+ java -jar KickAss.jar compare-16bit-signed.asm -o compare-16bit-signed.prg
844
+ ```
845
+
846
+ Produces `compare-16bit-signed.prg`, `$0801` to `$1B4B`.
847
+
848
+ ## Expected output
849
+
850
+ Border green, text area the power-on blue, the whole screen ours (the
851
+ program ends in a loop, so BASIC never prints `READY.` over the table):
852
+
853
+ ```
854
+ COMPARE 16BIT AND SIGNED
855
+ 8BIT A B SBC FIX IDM NAI EXP
856
+ 80 7F .V.C NV.C L G L
857
+ 7F 80 NV.. .V.. G L G
858
+ 00 00 ..ZC ..ZC G G G
859
+ FF 00 N..C N..C L L L
860
+ 00 FF .... .... G G G
861
+ 80 80 ..ZC ..ZC G G G
862
+ 7F 7F ..ZC ..ZC G G G
863
+ 9C 64 .V.C NV.C L G L
864
+ 16BIT A B CMPH U16 S16 U S EU ES
865
+ 7FFF 8000 N... N... .V.. L G L G
866
+ 8000 7FFF ...C ...C NV.C G L G L
867
+ 1234 1234 ..ZC ..ZC ..ZC G G G G
868
+ 0000 FFFF .... .... ..Z. L G L G
869
+ FFFF 0000 N..C N..C N..C G L G L
870
+ 0100 00FF ...C ...C ..ZC G G G G
871
+ 00FF 0100 N... N... N... L L L L
872
+ U16 CS 6182 EXP 6182 PASS
873
+ S8 CS 73FA EXP 73FA PASS
874
+ S16 CS 27B8 EXP 27B8 PASS
875
+ RNG CS A021 EXP A021 PASS
876
+ BMI CS A3CD EXP A3CD PASS WRONG 16384
877
+ CYC U16 11 18 S8 14 S16 20 RNG 14
878
+ RESULT 01 PASS
879
+ ```
880
+
881
+ Screenshots from the pinned run, 100,000,000 cycles:
882
+ `screenshots/compare-16bit-signed.png` (PAL) and
883
+ `screenshots/compare-16bit-signed-ntsc.png` (NTSC). Both decoded
884
+ against the character ROM give the text above; border pixel (2, 100)
885
+ = (98, 213, 50) on PAL and (114, 189, 103) on NTSC, index 5 in both
886
+ palettes of `runtime/vice-reference.md`. The pinned command was run
887
+ twice per model and the two PNGs were identical bytes. The sweeps take
888
+ about 90,000,000 cycles; a run limited to 64,000,000 stopped after the
889
+ `S16` line.
890
+
891
+ The columns, rows 2 to 9: `A` and `B` in hex, `P` after `SEC / SBC`
892
+ (`SBC`), `P` after the `BVC` / `EOR #$80` fix-up (`FIX`), then `L` for
893
+ "A is less than B" or `G` for "not less" from the idiom (`IDM`), from
894
+ the bare `BMI` version (`NAI`) and from the Python model (`EXP`). Rows
895
+ 11 to 17: `P` after `CMP` of the high bytes alone (`CMPH`, with `V`
896
+ cleared first because `CMP` never writes it), `P` at the end of the
897
+ unsigned idiom (`U16`) and of the signed one (`S16`), then the unsigned
898
+ and signed verdicts (`U`, `S`) beside the model's (`EU`, `ES`). A flag
899
+ prints as its letter when set and `.` when clear; the order is `N V Z C`.
900
+
901
+ Every `IDM`, `U` and `S` letter matches its `EXP` column. `NAI` is
902
+ wrong on three of the eight rows: `80 7F` (-128 against 127 says "not
903
+ less"), `7F 80` (127 against -128 says "less") and `9C 64` (-100
904
+ against 100 says "not less"). Those are the rows where `SBC` set `V`.
905
+
906
+ The sweep lines: `U16` and `S16` cover 131,072 pairs each (`a = i:j`
907
+ against `b = j:i` for every `i, j`, which meets every high-byte pair
908
+ and every equal value, then `a = i:j` against `b = i:(7j + 3)` so the
909
+ low bytes decide with the high bytes equal); `S8` and `BMI` cover all
910
+ 65,536 signed byte pairs; `RNG` tests every `x` against every `lo`
911
+ with a width of 32 (clamped to `256 - lo` near the top). `WRONG 16384`
912
+ is the number of pairs on which the `BMI` version and the `SBC / BVC /
913
+ EOR` idiom disagree; the model counts the same 16,384, one quarter of
914
+ all pairs, which is every pair whose difference overflows.
915
+
916
+ The `CYC` line is the cost of one call of each idiom with absolute
917
+ operands, net of an empty `JSR` / `RTS`, measured in VICE x64sc 3.10 on
918
+ both models:
919
+
920
+ | Idiom | Pair timed | Cycles | Instruction table |
921
+ |---|---|---|---|
922
+ | `U16`, high bytes differ | `$7FFF` against `$8000` | 11 | 4 + 4 + 3 (branch taken) |
923
+ | `U16`, high bytes equal | `$1234` against `$1234` | 18 | 4 + 4 + 2 + 4 + 4 |
924
+ | `S8` | `$80` against `$7F` | 14 | 4 + 2 + 4 + 2 + 2 |
925
+ | `S16` | `$7FFF` against `$8000` | 20 | 4 + 4 + 4 + 4 + 2 + 2 |
926
+ | `RNG` | 100 in `[90, 122)` | 14 | 4 + 2 + 4 + 4 |
927
+
928
+ The branch that acts on the result is not included: add 2 when it
929
+ falls through, 3 when taken, 4 taken across a page. With the operands
930
+ in zero page each absolute access is one cycle less (rung 3, not
931
+ measured here).
932
+
933
+ The first version of this program printed 19, 15 and 20 for the
934
+ second, third and fourth rows. The timer readout `LDA #$FF / SBC $DD04`
935
+ ran with whatever carry the timed routine had left, so a routine that
936
+ ended with `C` set read one cycle more than one that ended with `C`
937
+ clear. A `SEC` before the readout fixed it and the five figures now
938
+ equal the instruction-table sums.
939
+
940
+ ## Why this works
941
+
942
+ ### The unsigned 16-bit compare
943
+
944
+ `CMP` sets `C` when `A >= operand` and `Z` when they are equal. The
945
+ high bytes are compared first; if they differ (`BNE` taken) they decide
946
+ the order and the flags `CMP` left are the answer. If they are equal the
947
+ low bytes are compared and their flags are the answer. At the label
948
+ after the branch `C` clear means `a < b`, `C` set means `a >= b`, and
949
+ `Z` set means the two words are equal, because `Z` can only be set
950
+ there by the low-byte `CMP` after the high bytes matched. Rows 16 and
951
+ 17 show the high byte deciding against the low: `$0100` against `$00FF`
952
+ leaves `C` set from the first `CMP` alone.
953
+
954
+ ### The signed compares
955
+
956
+ `SBC` produces `a - b` and sets `N` from bit 7 of the result and `V`
957
+ when the true result is outside -128 to 127. When `V` is clear `N` is
958
+ the sign of `a - b`, so `N` set means `a < b`. When `V` is set the
959
+ result wrapped and `N` is the opposite of the true sign; `EOR #$80`
960
+ flips bit 7 of `A`, and since `EOR` sets `N` from its result, `N` is
961
+ the true sign again. Row 2 is the case: `$80 - $7F` is `$01`, `N`
962
+ clear, `V` set; after the fix-up `A` is `$81` and `N` is set, so -128
963
+ is less than 127. The 16-bit form does the same on the high byte with
964
+ the borrow from a `CMP` of the low bytes carried in. `Z` at the end of
965
+ the signed 16-bit idiom is the high byte's alone (row 14: `$0000`
966
+ against `$FFFF` shows `Z` set with the values unequal); test equality
967
+ with the unsigned form or a separate compare.
968
+
969
+ The bare `BMI` version is the same subtract without the fix-up. It is
970
+ right whenever `V` is clear, which is every pair whose difference fits
971
+ in a byte, and wrong on the 16,384 that do not: positives against
972
+ negatives and negatives against positives far enough apart. A game
973
+ that compares a signed velocity against a small limit will pass every
974
+ test until a value crosses the boundary, which is why the sweep counts
975
+ the misses rather than trusting a few pairs.
976
+
977
+ ### The range test
978
+
979
+ `x - lo` modulo 256 is below `w` exactly when `lo <= x < lo + w`,
980
+ provided `lo + w` does not pass 256: an `x` below `lo` wraps to at
981
+ least `256 - lo`, which is at least `w`. So `SEC / SBC lo / CMP w`
982
+ leaves `C` clear for inside and set for outside, and one branch acts
983
+ on it. The two-compare form (`CMP lo / BCC out / CMP hi / BCS out`)
984
+ needs no width and no wrap condition; it is what Oscar64 emits for
985
+ `x >= lo && x < hi`, and costs 4 + 4 + 2 + 4 + 2 = 16 on the inside path
986
+ (rung 3, not measured here).
987
+
988
+ ### The checksum
989
+
990
+ Each sweep result (0 or 1) is folded as `cs = rol16(cs) ^ (r ? i:j : 0)
991
+ + 13`. A plain rotate, exclusive-or of the bit and add, as
992
+ `techniques/maths.md` uses for its add sweep, was tried first and is
993
+ weak here: with `r = 0` the map has a period of 16 from the states
994
+ these sweeps reach, and a run of 65,536 identical results, or 256
995
+ repeats of one 256-pair block, returns to its starting state. Folding
996
+ the pair in makes a single flipped result change the final value (the
997
+ model shows `RNG` moving from `$A021` to `$4389` for one flip).
998
+
999
+ ### Timing
1000
+
1001
+ Same CIA2 cascade as `speedcode-generator.md`: timer A counts phi2,
1002
+ timer B counts A underflows, the count is `$FFFFFF` less the timer
1003
+ bytes. The timed calls run under `SEI` with `DEN` clear and after a
1004
+ wait for the raster to wrap, so no badline lands inside a measurement
1005
+ and the figures are the same on PAL and NTSC. The `SEC` before the
1006
+ readout matters, see above; the same macro without it reads one cycle
1007
+ high for any routine that exits with `C` set.