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,1019 @@
1
+ ---
2
+ recipe: reu-dma
3
+ toolchain: kickassembler
4
+ output_format: PRG
5
+ region: both
6
+ techniques: [reu_dma]
7
+ file_formats: [PRG]
8
+ uses_registers: [DF00, DF01, DF02, DF03, DF04, DF05, DF06, DF07, DF08, DF09, DF0A, D000, D001, D002, D003, D004, D005, D006, D007, D008, D009, D00A, D00B, D00C, D00D, D00E, D00F, D011, D012, D015, D020, DD04, DD05, DD06, DD07, DD0E, DD0F]
9
+ uses_kernal: [CHROUT]
10
+ ---
11
+
12
+ <!-- doc-type: recipe -->
13
+
14
+ # KickAssembler — REU DMA: detect, stash, fetch, fill, swap, verify
15
+
16
+ ## Synopsis
17
+
18
+ A test bench for a 17xx RAM Expansion Unit. It detects the REU, then
19
+ runs each transfer type once and checks the result with the CPU: stash a
20
+ 4 KB block, fetch 1,000 bytes into screen RAM, fill colour RAM from one
21
+ REU byte (REU address fixed), swap two 4 KB blocks, verify two blocks,
22
+ and verify once more after changing one byte on purpose to read the
23
+ fault bit and the stop address. It fetches 4 KB into the RAM under I/O
24
+ with the `$FF00` trigger and stashes 64 KB from one C64 byte (C64
25
+ address fixed). Every transfer is timed with the CIA2 timers: with the
26
+ screen blanked, with the screen on, and with eight sprites on. The
27
+ program prints the counts, cycles per byte for the 4 KB and 64 KB
28
+ transfers, and a verdict: `$02FF` = `$01` and a green border when every
29
+ check passed, `$02FF` = `$02` and a red border otherwise. Last, it
30
+ fetches the pattern into screen rows 17 to 24 and colours them yellow
31
+ from the REU, so the screenshot shows both transfers. The technique is
32
+ `reu_dma` in `techniques/memory-banking.md`.
33
+
34
+ ## Source
35
+
36
+ ```asm
37
+ // reu-dma.asm
38
+ // Detects a 17xx REU, then drives each transfer type and checks it with
39
+ // the CPU: stash a 4 KB block, fetch 1,000 bytes into screen RAM, fill
40
+ // colour RAM from one REU byte (REU address fixed), swap two 4 KB blocks,
41
+ // verify a block (and report the fault bit on a byte changed on purpose),
42
+ // fetch 4 KB into the RAM under I/O with the $FF00 trigger, and stash
43
+ // 64 KB from one C64 byte (C64 address fixed) with the screen blanked and
44
+ // with it on. Each transfer is timed with the CIA2 timers. Prints the
45
+ // cycle counts, cycles per byte for the 4 KB and 64 KB transfers, and the
46
+ // verdict: $02FF = $01 and a green border when every check passed, $02FF
47
+ // = $02 and a red border otherwise. Then it fetches a pattern into the
48
+ // lower screen rows and colours them from the REU, so the screenshot
49
+ // shows both.
50
+
51
+ BasicUpstart2(start)
52
+
53
+ .const CHROUT = $ffd2
54
+ .const RESULT = $02ff
55
+ .const BORDER = $d020
56
+ .const CODE_PASS = $01
57
+ .const CODE_FAIL = $02
58
+
59
+ .const REU_STATUS = $df00
60
+ .const REU_CMD = $df01
61
+ .const REU_C64 = $df02 // lo, hi
62
+ .const REU_REU = $df04 // lo, hi, bank
63
+ .const REU_LEN = $df07 // lo, hi; 0 = 65,536
64
+ .const REU_IMASK = $df09
65
+ .const REU_ACTRL = $df0a
66
+
67
+ // $DF01 command bytes. Bit 7 execute, bit 4 set = start now (clear = wait
68
+ // for a write to $FF00), bits 1-0 the transfer type.
69
+ .const STASH = $90 // C64 -> REU
70
+ .const FETCH = $91 // REU -> C64
71
+ .const SWAP = $92
72
+ .const VERIFY = $93
73
+ .const FETCH_FF00 = $81 // REU -> C64, deferred to a write of $FF00
74
+
75
+ // $DF0A address control
76
+ .const NOFIX = $00
77
+ .const FIXC64 = $80
78
+ .const FIXREU = $40
79
+
80
+ .const BLOCK_A = $3000 // 4 KB, pattern A
81
+ .const BLOCK_B = $4000 // 4 KB, pattern B = A EOR $FF
82
+ .const SCREEN = $0400
83
+ .const COLRAM = $d800
84
+ .const POKE_AT = $0abc // offset of the byte changed before the failing verify
85
+ .const LOWROW = 17 // first screen row of the final visible fetch
86
+ .const FILLCOL = 7 // yellow
87
+
88
+ .const ptr = $fb
89
+ .const ptr2 = $fd
90
+
91
+ // Reu(c64, reuaddr, bank, len, ctrl): load the address, length and
92
+ // address-control registers. The command is written separately.
93
+ .macro Reu(c64, reuaddr, bank, len, ctrl) {
94
+ lda #<c64
95
+ sta REU_C64
96
+ lda #>c64
97
+ sta REU_C64+1
98
+ lda #<reuaddr
99
+ sta REU_REU
100
+ lda #>reuaddr
101
+ sta REU_REU+1
102
+ lda #bank
103
+ sta REU_REU+2
104
+ lda #<len
105
+ sta REU_LEN
106
+ lda #>len
107
+ sta REU_LEN+1
108
+ lda #ctrl
109
+ sta REU_ACTRL
110
+ }
111
+
112
+ // Time(routine, slot): CIA2 timer A counts phi2, timer B counts A's
113
+ // underflows; slot receives the 24-bit elapsed count.
114
+ .macro Time(routine, slot) {
115
+ lda #$51
116
+ sta $dd0f
117
+ lda #$11
118
+ sta $dd0e
119
+ jsr routine
120
+ lda #$00
121
+ sta $dd0e
122
+ sta $dd0f
123
+ lda #$ff
124
+ sbc $dd04
125
+ sta slot
126
+ lda #$ff
127
+ sbc $dd05
128
+ sta slot+1
129
+ lda #$ff
130
+ sbc $dd06
131
+ sta slot+2
132
+ }
133
+
134
+ // Go(command, slot): time "write command to $DF01", net of the harness.
135
+ .macro Go(command, slot) {
136
+ lda #command
137
+ sta cmd
138
+ Time(exec, slot)
139
+ Net(slot)
140
+ }
141
+
142
+ .macro Net(slot) {
143
+ sec
144
+ lda slot
145
+ sbc empty
146
+ sta slot
147
+ lda slot+1
148
+ sbc empty+1
149
+ sta slot+1
150
+ lda slot+2
151
+ sbc empty+2
152
+ sta slot+2
153
+ }
154
+
155
+ .macro Fail(bit) {
156
+ lda failmask
157
+ ora #bit
158
+ sta failmask
159
+ }
160
+
161
+ .macro Line(text, slot) {
162
+ ldx #<text
163
+ ldy #>text
164
+ jsr puts
165
+ ldx #<slot
166
+ ldy #>slot
167
+ jsr putdec
168
+ }
169
+
170
+ // Nl(): end the line
171
+ .macro Nl() {
172
+ lda #$0d
173
+ jsr CHROUT
174
+ }
175
+
176
+ // PerByte(slot, shift): print slot * 25 >> shift as d.dd; with shift 10
177
+ // that is cycles per byte of a 4,096-byte transfer, with 14 of a 65,536.
178
+ .macro PerByte(slot, shift) {
179
+ ldx #<slot
180
+ ldy #>slot
181
+ lda #shift
182
+ jsr perbyte
183
+ }
184
+
185
+ start:
186
+ sei
187
+ lda #$00
188
+ sta failmask
189
+ sta $dd0e
190
+ sta $dd0f
191
+ lda #$ff
192
+ sta $dd04
193
+ sta $dd05
194
+ sta $dd06
195
+ sta $dd07
196
+ lda #$93 // clear the screen before anything lands on it
197
+ jsr CHROUT
198
+
199
+ // --- detection: write 1..7 to $DF02-$DF08, read them back; $DF06 is
200
+ // compared on bits 2-0 only (bits 7-3 read back as 1 in VICE 512 KB)
201
+ ldx #$00
202
+ !: txa
203
+ clc
204
+ adc #$01
205
+ sta REU_C64,x
206
+ inx
207
+ cpx #$07
208
+ bne !-
209
+ ldx #$00
210
+ !: lda REU_C64,x
211
+ sta seen,x
212
+ inx
213
+ cpx #$07
214
+ bne !-
215
+ ldx #$00
216
+ stx found
217
+ !: lda seen,x
218
+ and detmask,x // the bank register keeps only its low bits
219
+ sta cmpv
220
+ txa
221
+ clc
222
+ adc #$01
223
+ cmp cmpv
224
+ bne detected
225
+ inx
226
+ cpx #$07
227
+ bne !-
228
+ inc found // all seven read back
229
+ detected:
230
+ lda found
231
+ bne reu_present
232
+ jsr showdet
233
+ ldx #<noreutext
234
+ ldy #>noreutext
235
+ jsr puts
236
+ lda #CODE_FAIL
237
+ sta RESULT
238
+ lda #2
239
+ sta BORDER
240
+ cli
241
+ rts
242
+ reu_present:
243
+ sei // CHROUT to the screen ends with CLI; mask again
244
+
245
+ // --- patterns A at $3000 and B = A EOR $FF at $4000 ------------------
246
+ ldx #$00
247
+ !:
248
+ .for (var p = 0; p < 16; p++) {
249
+ txa
250
+ eor #(p * 37 + 11) & $ff
251
+ sta BLOCK_A + p * 256,x
252
+ eor #$ff
253
+ sta BLOCK_B + p * 256,x
254
+ }
255
+ inx
256
+ beq !+
257
+ jmp !-
258
+ !:
259
+ lda #$00
260
+ sta REU_IMASK // no REU interrupts
261
+ lda REU_STATUS // reading clears the fault bit (codebase64)
262
+
263
+ // screen off; DEN is sampled on line $30, so wait for the next frame
264
+ lda $d011
265
+ and #$ef
266
+ sta $d011
267
+ jsr newframe
268
+
269
+ Time(nothing, empty)
270
+
271
+ // --- 1-byte stash: the fixed cost of one command -------------------
272
+ Reu(colbyte, $0000, 2, 1, NOFIX)
273
+ Go(STASH, t_one) // REU 2:0000 = the fill colour, used below
274
+ lda REU_STATUS
275
+ sta status // after a completed stash
276
+
277
+ // --- stash A to REU 0:0000 and B to REU 1:0000 ---------------------
278
+ Reu(BLOCK_A, $0000, 0, $1000, NOFIX)
279
+ Go(STASH, t_stash)
280
+ Reu(BLOCK_B, $0000, 1, $1000, NOFIX)
281
+ Go(STASH, t_tmp)
282
+
283
+ // --- fetch 1,000 bytes of A into screen RAM -------------------------
284
+ Reu(SCREEN, $0000, 0, 1000, NOFIX)
285
+ Go(FETCH, t_fetch)
286
+ ldx #<SCREEN
287
+ ldy #>SCREEN
288
+ lda #>BLOCK_A
289
+ jsr cmp1000
290
+ beq !+
291
+ Fail($01)
292
+ !:
293
+
294
+ // --- fill colour RAM from one REU byte (REU address fixed) ----------
295
+ Reu(COLRAM, $0000, 2, 1000, FIXREU)
296
+ Go(FETCH, t_fill)
297
+ lda #>COLRAM
298
+ sta ptr+1
299
+ lda #<COLRAM
300
+ sta ptr
301
+ ldx #4 // 4 x 250
302
+ ldy #$00
303
+ !: lda (ptr),y
304
+ and #$0f
305
+ cmp #FILLCOL
306
+ bne fillbad
307
+ iny
308
+ cpy #250
309
+ bne !-
310
+ ldy #$00
311
+ clc
312
+ lda ptr
313
+ adc #250
314
+ sta ptr
315
+ bcc !+
316
+ inc ptr+1
317
+ !: dex
318
+ bne !--
319
+ beq filled
320
+ fillbad:
321
+ Fail($02)
322
+ filled:
323
+
324
+ // --- swap C64 $3000 (A) with REU 1:0000 (B), check, swap back ------
325
+ Reu(BLOCK_A, $0000, 1, $1000, NOFIX)
326
+ Go(SWAP, t_swap)
327
+ lda #>BLOCK_A
328
+ ldx #>BLOCK_B
329
+ jsr cmp4k // $3000 must now hold B
330
+ beq !+
331
+ Fail($04)
332
+ !: Reu(BLOCK_A, $0000, 1, $1000, NOFIX)
333
+ Go(SWAP, t_tmp) // A back in C64, B back in REU bank 1
334
+
335
+ // --- verify: A against REU 0, B against REU 1, then a changed byte --
336
+ lda REU_STATUS
337
+ Reu(BLOCK_A, $0000, 0, $1000, NOFIX)
338
+ Go(VERIFY, t_verify)
339
+ lda REU_STATUS
340
+ and #$20
341
+ beq !+
342
+ Fail($08)
343
+ !: Reu(BLOCK_B, $0000, 1, $1000, NOFIX)
344
+ Go(VERIFY, t_tmp)
345
+ lda REU_STATUS
346
+ and #$20
347
+ beq !+
348
+ Fail($08)
349
+ !: lda BLOCK_A + POKE_AT
350
+ eor #$ff
351
+ sta BLOCK_A + POKE_AT
352
+ Reu(BLOCK_A, $0000, 0, $1000, NOFIX)
353
+ Go(VERIFY, t_tmp)
354
+ lda REU_STATUS
355
+ sta vstatus
356
+ lda REU_C64
357
+ sta vaddr
358
+ lda REU_C64+1
359
+ sta vaddr+1
360
+ lda BLOCK_A + POKE_AT // put the byte back
361
+ eor #$ff
362
+ sta BLOCK_A + POKE_AT
363
+ lda vstatus
364
+ and #$20
365
+ bne !+
366
+ Fail($10) // the fault bit did not come up
367
+ !:
368
+
369
+ // --- $FF00 trigger: fetch A into the RAM under I/O -------------------
370
+ Reu($d000, $0000, 0, $1000, NOFIX)
371
+ lda #FETCH_FF00
372
+ sta REU_CMD // armed; nothing moves yet
373
+ lda #$34 // RAM at $D000-$DFFF (and $A000, $E000)
374
+ sta $01
375
+ lda $ff00 // the write, not the value, starts the DMA
376
+ sta $ff00
377
+ lda #>$d000
378
+ ldx #>BLOCK_A
379
+ jsr cmp4k
380
+ php
381
+ lda #$37
382
+ sta $01
383
+ plp
384
+ beq !+
385
+ Fail($20)
386
+ !:
387
+
388
+ // --- 64 KB stash from one C64 byte (C64 address fixed) -------------
389
+ Reu(BLOCK_A, $0000, 3, $0000, FIXC64)
390
+ Go(STASH, t_64off)
391
+ lda REU_STATUS
392
+ Reu(BLOCK_A, $0000, 3, $0000, FIXC64)
393
+ Go(VERIFY, t_tmp) // all 65,536 REU bytes equal BLOCK_A[0]
394
+ lda REU_STATUS
395
+ and #$20
396
+ beq !+
397
+ Fail($40)
398
+ !:
399
+ lda $d011 // screen on, then time the same stash
400
+ ora #$10
401
+ sta $d011
402
+ jsr newframe
403
+ Reu(BLOCK_A, $0000, 3, $0000, FIXC64)
404
+ Go(STASH, t_64on)
405
+
406
+ // sprite DMA on top: all eight sprites on lines 100-120, same stash
407
+ lda #$ff
408
+ sta $d015
409
+ ldx #$0e
410
+ !: txa
411
+ asl
412
+ asl
413
+ asl
414
+ adc #$30
415
+ sta $d000,x // X = $30 + 16 * n
416
+ lda #100
417
+ sta $d001,x
418
+ dex
419
+ dex
420
+ bpl !-
421
+ jsr newframe
422
+ Reu(BLOCK_A, $0000, 3, $0000, FIXC64)
423
+ Go(STASH, t_64spr)
424
+ lda #$00
425
+ sta $d015
426
+
427
+ // --- report ---------------------------------------------------------
428
+ lda #$93
429
+ jsr CHROUT
430
+ jsr showdet
431
+ ldx #<stattext
432
+ ldy #>stattext
433
+ jsr puts
434
+ lda status
435
+ jsr hexbyte
436
+ Line(onetext, t_one)
437
+ Nl()
438
+ Line(stashtext, t_stash)
439
+ PerByte(t_stash, 10)
440
+ Nl()
441
+ Line(fetchtext, t_fetch)
442
+ Nl()
443
+ Line(filltext, t_fill)
444
+ Nl()
445
+ Line(swaptext, t_swap)
446
+ PerByte(t_swap, 10)
447
+ Nl()
448
+ Line(veritext, t_verify)
449
+ PerByte(t_verify, 10)
450
+ Nl()
451
+ ldx #<errtext
452
+ ldy #>errtext
453
+ jsr puts
454
+ lda vstatus
455
+ jsr hexbyte
456
+ ldx #<attext
457
+ ldy #>attext
458
+ jsr puts
459
+ lda vaddr+1
460
+ jsr hexbyte
461
+ lda vaddr
462
+ jsr hexbyte
463
+ Nl()
464
+ Line(offtext, t_64off)
465
+ PerByte(t_64off, 14)
466
+ Nl()
467
+ Line(ontext, t_64on)
468
+ PerByte(t_64on, 14)
469
+ Nl()
470
+ Line(sprtext, t_64spr)
471
+ PerByte(t_64spr, 14)
472
+ Nl()
473
+
474
+ // --- visible: fetch A into rows 17-24, colour them from the REU -----
475
+ Reu(SCREEN + LOWROW * 40, $0000, 0, (25 - LOWROW) * 40, NOFIX)
476
+ lda #FETCH
477
+ sta REU_CMD
478
+ Reu(COLRAM + LOWROW * 40, $0000, 2, (25 - LOWROW) * 40, FIXREU)
479
+ lda #FETCH
480
+ sta REU_CMD
481
+
482
+ lda failmask
483
+ beq pass
484
+ lda #CODE_FAIL
485
+ ldy #2
486
+ bne verdict
487
+ pass:
488
+ lda #CODE_PASS
489
+ ldy #5
490
+ verdict:
491
+ sta RESULT
492
+ sty BORDER
493
+ ldx #<restext
494
+ ldy #>restext
495
+ jsr puts
496
+ lda RESULT
497
+ jsr hexbyte
498
+ ldx #<passtext
499
+ ldy #>passtext
500
+ lda failmask
501
+ beq !+
502
+ ldx #<failtext
503
+ ldy #>failtext
504
+ !: jsr puts
505
+ ldx #<masktext
506
+ ldy #>masktext
507
+ jsr puts
508
+ lda failmask
509
+ jsr hexbyte
510
+ lda #$0d
511
+ jsr CHROUT
512
+ cli
513
+ rts
514
+
515
+ // showdet: print the seven bytes read back and YES or NO
516
+ showdet:
517
+ ldx #<dettext
518
+ ldy #>dettext
519
+ jsr puts
520
+ ldx #$00
521
+ !: lda seen,x
522
+ jsr hexbyte
523
+ lda #' '
524
+ jsr CHROUT
525
+ inx
526
+ cpx #$07
527
+ bne !-
528
+ ldx #<yestext
529
+ ldy #>yestext
530
+ lda found
531
+ bne !+
532
+ ldx #<notext
533
+ ldy #>notext
534
+ !: jmp puts
535
+
536
+ exec:
537
+ lda cmd
538
+ sta REU_CMD
539
+ nothing:
540
+ rts
541
+
542
+ newframe: // wait until the raster wraps to line 0
543
+ !: lda $d011
544
+ bpl !-
545
+ !: lda $d011
546
+ bmi !-
547
+ !: lda $d012
548
+ bne !-
549
+ rts
550
+
551
+ // cmp1000: compare 1,000 bytes at Y:X with 1,000 from page A; Z set if equal
552
+ cmp1000:
553
+ stx ptr
554
+ sty ptr+1
555
+ sta ptr2+1
556
+ lda #$00
557
+ sta ptr2
558
+ ldx #3 // three whole pages
559
+ ldy #$00
560
+ !: lda (ptr),y
561
+ cmp (ptr2),y
562
+ bne c1done
563
+ iny
564
+ bne !-
565
+ inc ptr+1
566
+ inc ptr2+1
567
+ dex
568
+ bne !-
569
+ !: lda (ptr),y // then the last 232 bytes
570
+ cmp (ptr2),y
571
+ bne c1done
572
+ iny
573
+ cpy #1000 - 768
574
+ bne !-
575
+ lda #$00 // Z set: equal
576
+ c1done:
577
+ rts
578
+
579
+ // cmp4k: compare 16 pages starting at page A with 16 starting at page X;
580
+ // Z set if equal
581
+ cmp4k:
582
+ sta c4a+2
583
+ stx c4b+2
584
+ ldx #16
585
+ ldy #$00
586
+ c4a:
587
+ lda $ff00,y
588
+ c4b:
589
+ cmp $ff00,y
590
+ bne c4done
591
+ iny
592
+ bne c4a
593
+ inc c4a+2
594
+ inc c4b+2
595
+ dex
596
+ bne c4a
597
+ c4done:
598
+ rts
599
+
600
+ // perbyte: num = slot(Y:X) * 25 >> A, printed as d.dd
601
+ perbyte:
602
+ sta shift
603
+ stx ptr
604
+ sty ptr+1
605
+ ldy #$00
606
+ !: lda (ptr),y
607
+ sta num,y
608
+ sta x1,y
609
+ iny
610
+ cpy #3
611
+ bne !-
612
+ ldx #3 // num = x * 8
613
+ !: asl num
614
+ rol num+1
615
+ rol num+2
616
+ dex
617
+ bne !-
618
+ clc // x1 = x + 8x
619
+ ldy #$00
620
+ ldx #3
621
+ !: lda x1,y
622
+ adc num,y
623
+ sta x1,y
624
+ iny
625
+ dex
626
+ bne !-
627
+ asl num // num = 16x
628
+ rol num+1
629
+ rol num+2
630
+ clc // num = 25x
631
+ ldy #$00
632
+ ldx #3
633
+ !: lda x1,y
634
+ adc num,y
635
+ sta num,y
636
+ iny
637
+ dex
638
+ bne !-
639
+ ldx shift
640
+ !: lsr num+2
641
+ ror num+1
642
+ ror num
643
+ dex
644
+ bne !-
645
+ lda #' '
646
+ jsr CHROUT
647
+ lda #1
648
+ sta fix
649
+ jsr putnum
650
+ lda #0
651
+ sta fix
652
+ rts
653
+
654
+ // output helpers ---------------------------------------------------------
655
+ puts:
656
+ stx ptr
657
+ sty ptr+1
658
+ ldy #$00
659
+ !: lda (ptr),y
660
+ beq !+
661
+ jsr CHROUT
662
+ iny
663
+ bne !-
664
+ !: rts
665
+
666
+ putdec: // print the 24-bit slot at Y:X
667
+ stx ptr
668
+ sty ptr+1
669
+ ldy #$00
670
+ !: lda (ptr),y
671
+ sta num,y
672
+ iny
673
+ cpy #3
674
+ bne !-
675
+ jmp putnum
676
+
677
+ putnum: // print num in decimal; fix = 1: as d.dd
678
+ ldx #$00
679
+ stx lead
680
+ digit:
681
+ lda #'0' - 1
682
+ sta dig
683
+ !: inc dig
684
+ sec
685
+ lda num
686
+ sbc pow10,x
687
+ sta num
688
+ lda num+1
689
+ sbc pow10+1,x
690
+ sta num+1
691
+ lda num+2
692
+ sbc pow10+2,x
693
+ sta num+2
694
+ bcs !-
695
+ lda num
696
+ adc pow10,x
697
+ sta num
698
+ lda num+1
699
+ adc pow10+1,x
700
+ sta num+1
701
+ lda num+2
702
+ adc pow10+2,x
703
+ sta num+2
704
+ lda fix
705
+ beq plain
706
+ cpx #5 * 3 // tens of hundredths: the point goes first
707
+ bne !+
708
+ lda #'.'
709
+ jsr CHROUT
710
+ !: cpx #4 * 3 // units digit and after always print
711
+ bcs show
712
+ plain:
713
+ lda dig
714
+ cmp #'0'
715
+ bne show
716
+ cpx #6 * 3
717
+ beq show
718
+ lda lead
719
+ beq next
720
+ show:
721
+ lda dig
722
+ jsr CHROUT
723
+ inc lead
724
+ next:
725
+ inx
726
+ inx
727
+ inx
728
+ cpx #7 * 3
729
+ bne digit
730
+ rts
731
+
732
+ hexbyte:
733
+ pha
734
+ lsr
735
+ lsr
736
+ lsr
737
+ lsr
738
+ jsr hexdigit
739
+ pla
740
+ and #$0f
741
+ hexdigit:
742
+ cmp #10
743
+ bcc !+
744
+ adc #6
745
+ !: adc #'0'
746
+ jmp CHROUT
747
+
748
+ pow10: .byte <1000000, >1000000, 1000000 >> 16
749
+ .byte <100000, >100000, 100000 >> 16
750
+ .byte <10000, >10000, 0
751
+ .byte <1000, >1000, 0
752
+ .byte <100, >100, 0
753
+ .byte <10, >10, 0
754
+ .byte <1, >1, 0
755
+
756
+ colbyte: .byte FILLCOL
757
+ cmd: .byte 0
758
+ found: .byte 0
759
+ seen: .fill 7, 0
760
+ cmpv: .byte 0
761
+ detmask: .byte $ff, $ff, $ff, $ff, $07, $ff, $ff
762
+ status: .byte 0
763
+ vstatus: .byte 0
764
+ vaddr: .word 0
765
+ failmask: .byte 0
766
+ num: .byte 0, 0, 0
767
+ x1: .byte 0, 0, 0
768
+ dig: .byte 0
769
+ lead: .byte 0
770
+ fix: .byte 0
771
+ shift: .byte 0
772
+
773
+ empty: .byte 0, 0, 0
774
+ t_one: .byte 0, 0, 0
775
+ t_stash: .byte 0, 0, 0
776
+ t_fetch: .byte 0, 0, 0
777
+ t_fill: .byte 0, 0, 0
778
+ t_swap: .byte 0, 0, 0
779
+ t_verify: .byte 0, 0, 0
780
+ t_64off: .byte 0, 0, 0
781
+ t_64on: .byte 0, 0, 0
782
+ t_64spr: .byte 0, 0, 0
783
+ t_tmp: .byte 0, 0, 0
784
+
785
+ .encoding "petscii_upper"
786
+ dettext: .text "DETECT "
787
+ .byte 0
788
+ yestext: .text "YES"
789
+ .byte $0d, 0
790
+ notext: .text "NO"
791
+ .byte $0d, 0
792
+ noreutext: .text "RESULT 02 NO REU"
793
+ .byte $0d, 0
794
+ stattext: .text "STATUS "
795
+ .byte 0
796
+ onetext: .byte $0d
797
+ .text "1 BYTE "
798
+ .byte 0
799
+ stashtext: .text "STASH 4K "
800
+ .byte 0
801
+ fetchtext: .text "FETCH 1000 "
802
+ .byte 0
803
+ filltext: .text "FILL 1000 "
804
+ .byte 0
805
+ swaptext: .text "SWAP 4K "
806
+ .byte 0
807
+ veritext: .text "VERIFY 4K "
808
+ .byte 0
809
+ errtext: .text "VERIFY ERR "
810
+ .byte 0
811
+ attext: .text " AT "
812
+ .byte 0
813
+ offtext: .text "64K OFF "
814
+ .byte 0
815
+ ontext: .text "64K ON "
816
+ .byte 0
817
+ sprtext: .text "64K SPR "
818
+ .byte 0
819
+ restext: .text "RESULT "
820
+ .byte 0
821
+ passtext: .text " PASS"
822
+ .byte 0
823
+ failtext: .text " FAIL"
824
+ .byte 0
825
+ masktext: .text " MASK "
826
+ .byte 0
827
+ ```
828
+
829
+ ## Build
830
+
831
+ ```bash
832
+ java -jar KickAss.jar reu-dma.asm -o reu-dma.prg
833
+ ```
834
+
835
+ Produces `reu-dma.prg`, 3,506 bytes, `$0801` to `$15b0` (KickAssembler
836
+ 5.25, `-showmem`). The REU is not part of the build; it is a VICE option
837
+ at run time:
838
+
839
+ ```bash
840
+ x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
841
+ -limitcycles 8000000 -reu -reusize 512 -exitscreenshot reu-dma.png -autostart reu-dma.prg
842
+ ```
843
+
844
+ `x64sc -help` in VICE 3.10 lists `-reu`/`+reu`, `-reusize <size in KiB>`,
845
+ `-reuimage <Name>`, `-reuimagerw` and `-cartreu <Name>`.
846
+
847
+ ## Expected output
848
+
849
+ Border green. Rows 0 to 12, PAL:
850
+
851
+ ```text
852
+ DETECT 01 02 03 04 FD 06 07 YES
853
+ STATUS 50
854
+ 1 BYTE 9
855
+ STASH 4K 4104 1.00
856
+ FETCH 1000 1008
857
+ FILL 1000 1008
858
+ SWAP 4K 8200 2.00
859
+ VERIFY 4K 4104 1.00
860
+ VERIFY ERR 30 AT 3ABD
861
+ 64K OFF 65544 1.00
862
+ 64K ON 69414 1.05
863
+ 64K SPR 71134 1.08
864
+ RESULT 01 PASS MASK 00
865
+ ```
866
+
867
+ `READY.` on row 14. Rows 17 to 24 hold the first 320 bytes of the
868
+ pattern as screen codes, in yellow. NTSC shows the same text except two
869
+ lines: `64K ON 69844 1.06` and `64K SPR 71439 1.09`.
870
+
871
+ Screenshots from the pinned runs, 8,000,000 cycles, with `-reu -reusize
872
+ 512`: `screenshots/reu-dma.png` (PAL) and `screenshots/reu-dma-ntsc.png`
873
+ (NTSC). Measured on both: rows 0 to 12 decoded against the character ROM
874
+ as above; border pixel (2, 100) = (98, 213, 50) on PAL and (114, 189,
875
+ 103) on NTSC, index 5; the ink on rows 17 to 24 is (255, 255, 70) on PAL
876
+ and (255, 248, 141) on NTSC, index 7, 888 pixels per row; the text rows
877
+ are index 14 ink on index 6. The pinned command was run twice per model
878
+ and the two PNGs were identical bytes.
879
+
880
+ What the lines mean, measured in VICE x64sc 3.10. Every count is net of
881
+ the harness (an empty `JSR`/`RTS` is timed first and subtracted) and
882
+ still includes the `LDA abs` / `STA $DF01` that starts the transfer,
883
+ 4 + 4 = 8 cycles.
884
+
885
+ | Line | Transfer | Cycles | Less the 8-cycle start |
886
+ |---|---|---|---|
887
+ | `1 BYTE` | stash 1 byte | 9 | 1 |
888
+ | `STASH 4K` | stash 4,096 bytes, screen blanked | 4,104 | 4,096 |
889
+ | `FETCH 1000` | 1,000 bytes into screen RAM, blanked | 1,008 | 1,000 |
890
+ | `FILL 1000` | 1,000 bytes into colour RAM, REU address fixed, blanked | 1,008 | 1,000 |
891
+ | `SWAP 4K` | swap 4,096 bytes, blanked | 8,200 | 8,192 |
892
+ | `VERIFY 4K` | verify 4,096 equal bytes, blanked | 4,104 | 4,096 |
893
+ | `64K OFF` | stash 65,536 bytes (length 0), C64 address fixed, blanked | 65,544 | 65,536 |
894
+ | `64K ON` | the same, text screen on, started on raster line 0 | 69,414 PAL, 69,844 NTSC | 69,406, 69,836 |
895
+ | `64K SPR` | the same, plus eight sprites on lines 100 to 120 | 71,134 PAL, 71,439 NTSC | 71,126, 71,431 |
896
+
897
+ So a stash, fetch or verify costs one cycle per byte and a swap two,
898
+ with no set-up cost beyond the store to `$DF01`. The per-byte column is
899
+ printed as `count × 25 >> 10` for 4,096 bytes and `>> 14` for 65,536,
900
+ which is count / length to two decimals, truncated. The blanked counts
901
+ are the same on both models. An earlier build of this program, laid out
902
+ differently, printed every blanked count one cycle higher (10, 4,105,
903
+ 1,009, 1,009, 8,201, 4,105, 65,545). The cause of that one cycle was
904
+ not established; the REU's one cycle per byte is the same in both.
905
+
906
+ With the screen on, the 64 KB stash took 3,870 cycles longer on PAL
907
+ (5.9 %) and 4,300 on NTSC (6.6 %). It ran for 3.5 PAL frames (69,414 /
908
+ 19,656) and 4.1 NTSC frames (69,844 / 17,095), which crosses about 88
909
+ and 102 badlines: roughly 42 to 44 cycles per badline (arithmetic from
910
+ the measured totals, not a per-line measurement). Eight sprites on 21
911
+ lines added 1,720 cycles on PAL and 1,595 on NTSC.
912
+
913
+ The other lines:
914
+
915
+ - `DETECT`: the seven bytes read back from `$DF02-$DF08` after writing
916
+ 1 to 7. `$DF06`, the bank register, reads `$FD` for a written 5: bits
917
+ 7 to 3 read as 1 with `-reusize 512`. The test therefore compares
918
+ `$DF06` on bits 2 to 0 only.
919
+ - `STATUS 50`: `$DF00` after the 1-byte stash. Bit 6 (end of block) and
920
+ bit 4 (the size bit, set for a 256 KB-chip REU such as the 1750 and
921
+ 1764 per codebase64) are set; the version bits read 0.
922
+ - `VERIFY ERR 30 AT 3ABD`: `$DF00` after a verify of `$3000-$3FFF`
923
+ against the REU with the byte at `$3ABC` inverted. Bit 5 (fault) and
924
+ bit 4 are set; bit 6 (end of block) is not. `$DF02/$DF03` read
925
+ `$3ABD`, one past the differing byte, so the verify stopped there.
926
+ Before that, both unchanged verifies left bit 5 clear.
927
+ - `MASK 00`: no check failed. Bit 0 is the screen fetch, bit 1 the
928
+ colour fill, bit 2 the swap, bit 3 the two clean verifies, bit 4 a
929
+ missing fault bit, bit 5 the `$FF00` fetch under I/O, bit 6 the 64 KB
930
+ verify.
931
+
932
+ ### Without an REU
933
+
934
+ The same PRG run with no `-reu` flag, once per model, not pinned: the
935
+ border is red and the screen shows
936
+
937
+ ```text
938
+ DETECT 00 00 00 00 00 00 00 NO
939
+ RESULT 02 NO REU
940
+ ```
941
+
942
+ on PAL, and `DETECT 00 00 00 00 FF 00 00 NO` on NTSC. With nothing at
943
+ `$DF00-$DFFF` a read returns open bus, the byte the VIC-II last fetched
944
+ (`hardware/c64-registers-reference.md`, the `$DE00-$DFFF` section), so
945
+ the values depend on the model and the moment, and a read-back pattern
946
+ of 1 to 7 does not survive.
947
+
948
+ ## Why this works
949
+
950
+ ### Driving a transfer
951
+
952
+ Each transfer is the same five steps: the C64 address to `$DF02/$DF03`,
953
+ the REU address and bank to `$DF04-$DF06`, the length to `$DF07/$DF08`
954
+ (0 means 65,536), the address-control bits to `$DF0A`, then the command
955
+ to `$DF01`. The command bytes used here are `$90` stash, `$91` fetch,
956
+ `$92` swap and `$93` verify: bit 7 executes, bit 4 set starts at once,
957
+ bits 1 to 0 pick the type. The REU halts the CPU for the transfer, so
958
+ the instruction after the store runs when the last byte has moved. The
959
+ autoload bit 5 is never set, so the address and length registers are
960
+ left pointing past the transfer, and every transfer reloads all of them
961
+ (the `Reu` macro).
962
+
963
+ ### Fixed addresses
964
+
965
+ The colour fill sets `$DF0A` bit 6, which holds the REU address still:
966
+ all 1,000 bytes come from REU `2:0000`, which the 1-byte stash had set to
967
+ 7. The 64 KB stash sets bit 7 instead, which holds the C64 address
968
+ still: 65,536 reads of `$3000` land in REU bank 3, and the verify with
969
+ the same setting finds no difference. The same bit on a fetch writes
970
+ every REU byte to one C64 address, which is the digi case (`$D418`);
971
+ this program does not play one.
972
+
973
+ ### The $FF00 trigger
974
+
975
+ A transfer to the RAM under I/O cannot be started the plain way: the
976
+ store to `$DF01` needs I/O visible, and the DMA uses the memory
977
+ configuration in force while it runs. So the program writes `$81` to
978
+ `$DF01` (execute, bit 4 clear) with I/O visible, which arms the
979
+ transfer and moves nothing. It then sets `$01` = `$34` and writes to
980
+ `$FF00`; that write starts the DMA, which now sees RAM at `$D000`
981
+ (measured: the 4 KB compared equal at `$34`, and the program went on to
982
+ time and print normally, which it could not do after 4 KB of pattern
983
+ had been written over the VIC and CIA registers; codebase64 describes
984
+ the same use). The check runs at `$34` too. `LDA $FF00` / `STA $FF00` writes back the byte
985
+ already there, so the RAM under the KERNAL is not changed. A test
986
+ program that read `$C055` after arming and after a read of `$FF00` found
987
+ it unchanged both times; after the write it held the fetched byte.
988
+
989
+ ### Interrupts stay masked
990
+
991
+ The transfers run under `SEI`, and it has to be set again after any
992
+ `CHROUT` to the screen: the KERNAL's screen output returns through
993
+ `$E6A8`, which ends `CLC` / `CLI` / `RTS` with the `CLI` at `$E6B4`
994
+ (ROM bytes; pitfall `kernal_assumes_sei_cleared`). A first draft printed
995
+ the detection line and then went on with interrupts enabled. The
996
+ KERNAL IRQ then fired at `$34`, took its vector from RAM at `$FFFE`, and
997
+ the machine ended in a `BRK` loop at `$0002`, found with the remote
998
+ monitor. An IRQ cannot be taken in the middle of a transfer, because the
999
+ CPU is halted; it lands between transfers (from the CPU being halted,
1000
+ not measured here).
1001
+
1002
+ ### Timing
1003
+
1004
+ The CIA2 harness is the one in `speedcode-generator.md`: timer B counts
1005
+ timer A's underflows, both latches at `$FFFF`, 24 bits. Screen-off runs
1006
+ start after `DEN` has been cleared and a new frame has begun, because
1007
+ `DEN` is sampled once per frame. The screen-on and sprite runs start at
1008
+ raster line 0, so the pinned counts are repeatable.
1009
+
1010
+ ## What this recipe does not show
1011
+
1012
+ It does not use the REU interrupt (`$DF09`, written 0 here), autoload,
1013
+ or the size test across banks that codebase64 recommends for finding
1014
+ the real capacity. It does not measure a real 1700, 1750 or 1764, an
1015
+ Ultimate or a 1541 Ultimate REU; every figure is VICE x64sc 3.10.
1016
+
1017
+ ## Sources
1018
+
1019
+ - codebase64, "REU programming": https://codebase64.net/doku.php?id=base:reu_programming (register bits, the `$FF00` trigger, detection and the size test).