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,1145 @@
1
+ ---
2
+ recipe: isometric-room
3
+ toolchain: kickassembler
4
+ output_format: PRG
5
+ region: both
6
+ techniques: [isometric_tile_engine, tile_map_render]
7
+ file_formats: [PRG]
8
+ uses_registers: [D018, D01B, D015, D000, D001, D010, D020, D021, DC04, DC05, DC0E]
9
+ uses_kernal: []
10
+ ---
11
+
12
+ <!-- doc-type: recipe -->
13
+
14
+ # KickAssembler -- Isometric room with painter's order and sprite depth
15
+
16
+ ## Synopsis
17
+
18
+ Demonstrates the `isometric_tile_engine` technique on stock hardware: a fixed
19
+ 8-by-8 cell map drawn in painter's diagonal order into a 40-by-25 text screen,
20
+ hardware sprite 0 as the player figure, and `$D01B` bit 0 toggled by a scan of
21
+ the cells in front of the player. Three tile shapes -- floor diamond (4 chars
22
+ wide by 2 tall), one-tile block (4 by 4), and two-tile tall block (4 by 6) --
23
+ are built from 13 custom glyphs in a 2 KB charset at `$3000`. CIA 1 timer A
24
+ measures two full room redraws and a single block draw. A four-cell verdict at
25
+ `$02FF` confirms the drawing is correct.
26
+
27
+ Use this recipe as the starting point for any isometric tile engine that needs
28
+ the depth bit: replace the map and charset, keep the painter loop and depth
29
+ scan.
30
+
31
+ ## Source
32
+
33
+ ```asm
34
+ // KickAssembler 5.25
35
+ // isometric-room.asm: painter's order and one-bit sprite depth
36
+ // 8x8 isometric room in character mode (40x25), custom 2KB charset at $3000.
37
+ // Hardware sprite 0 as player; $D01B bit 0 updated after each move.
38
+ // Scripted path: (1,1)->(2,1)->(3,1)->(3,2)->(3,3)->(2,3).
39
+ // CIA1 timer A measures two full redraws and one block draw.
40
+ // Verdict at $02FF; depth-set move count at $02FE.
41
+ // Border: light blue during run -> green if $02FF=1, red otherwise.
42
+
43
+ *= $0801
44
+ :BasicUpstart2(main)
45
+
46
+ // ── VIC / CIA ────────────────────────────────────────────────────────────────
47
+ .const D018 = $D018
48
+ .const D020 = $D020
49
+ .const D021 = $D021
50
+ .const D015 = $D015
51
+ .const D01B = $D01B
52
+ .const D027 = $D027
53
+ .const SPX0 = $D000
54
+ .const SPY0 = $D001
55
+ .const SPXHI = $D010
56
+ .const TALO = $DC04
57
+ .const TAHI = $DC05
58
+ .const TACRA = $DC0E
59
+
60
+ // ── Memory layout ────────────────────────────────────────────────────────────
61
+ .const SCR = $0400
62
+ .const COLRAM = $D800
63
+ .const CSET = $3000
64
+ .const SPDAT = $2000
65
+ .const SPPTR = $07F8
66
+
67
+ // ── Isometric constants ───────────────────────────────────────────────────────
68
+ .const OC = 18
69
+ .const OR = 4
70
+
71
+ // ── Custom char codes ─────────────────────────────────────────────────────────
72
+ .const CT0 = 1
73
+ .const CT1 = 2
74
+ .const CT2 = 3
75
+ .const CT3 = 4
76
+ .const CB0 = 5
77
+ .const CB1 = 6
78
+ .const CB2 = 7
79
+ .const CB3 = 8
80
+ .const CS0 = 9
81
+ .const CS1 = 10
82
+ .const CS2 = 11
83
+ .const CS3 = 12
84
+
85
+ // ── Palette ───────────────────────────────────────────────────────────────────
86
+ .const COL_FLOOR = 13
87
+ .const COL_BLOCK = 7
88
+ .const COL_TALL = 10
89
+ .const COL_PASS = 5
90
+ .const COL_FAIL = 2
91
+
92
+ // ── Result addresses ──────────────────────────────────────────────────────────
93
+ .const R_T1L = $02F0
94
+ .const R_T1H = $02F1
95
+ .const R_T2L = $02F2
96
+ .const R_T2H = $02F3
97
+ .const R_BKL = $02F4
98
+ .const R_BKH = $02F5
99
+ .const R_DEP = $02FE
100
+ .const R_VRD = $02FF
101
+
102
+ // ── Tables, map, variables at $0900 ──────────────────────────────────────────
103
+
104
+ *= $0900
105
+
106
+ scr_row_lo: .for (var r=0; r<25; r++) { .byte <(SCR + r*40) }
107
+ scr_row_hi: .for (var r=0; r<25; r++) { .byte >(SCR + r*40) }
108
+ col_row_lo: .for (var r=0; r<25; r++) { .byte <(COLRAM + r*40) }
109
+ col_row_hi: .for (var r=0; r<25; r++) { .byte >(COLRAM + r*40) }
110
+
111
+ room:
112
+ .byte 0,0,0,0,0,0,0,0
113
+ .byte 0,0,0,0,1,0,0,0
114
+ .byte 0,0,0,0,0,0,0,2
115
+ .byte 0,1,0,0,0,0,0,0
116
+ .byte 0,0,0,0,0,1,0,0
117
+ .byte 0,0,2,0,0,0,0,0
118
+ .byte 0,0,0,0,0,0,0,0
119
+ .byte 0,0,0,1,0,0,0,0
120
+
121
+ player_x: .byte 1
122
+ player_y: .byte 1
123
+ player_col:.byte 0
124
+ player_row:.byte 0
125
+ draw_col: .byte 0
126
+ draw_row: .byte 0
127
+ tile_col: .byte 0
128
+ draw_s: .byte 0
129
+ draw_xe: .byte 0
130
+ draw_xs: .byte 0
131
+ draw_xc: .byte 0
132
+ draw_yc: .byte 0
133
+ midx: .byte 0
134
+
135
+ mtx: .byte 2,3,3,3,2
136
+ mty: .byte 1,1,2,3,3
137
+
138
+ // ── Sprite data at $2000 ──────────────────────────────────────────────────────
139
+ *= SPDAT
140
+ // 24x21 figure sprite (3 bytes/row)
141
+ .byte $00,$3C,$00 // row 0 head top
142
+ .byte $00,$7E,$00 // row 1
143
+ .byte $00,$FF,$00 // row 2
144
+ .byte $00,$FF,$00 // row 3
145
+ .byte $00,$7E,$00 // row 4 head
146
+ .byte $01,$FF,$80 // row 5 shoulders
147
+ .byte $01,$FF,$80 // row 6 body
148
+ .byte $01,$FF,$80 // row 7
149
+ .byte $01,$FF,$80 // row 8
150
+ .byte $01,$FF,$80 // row 9
151
+ .byte $01,$FF,$80 // row 10
152
+ .byte $00,$7E,$00 // row 11 waist
153
+ .byte $00,$66,$00 // row 12 legs
154
+ .byte $00,$66,$00 // row 13
155
+ .byte $00,$66,$00 // row 14
156
+ .byte $00,$66,$00 // row 15
157
+ .byte $00,$66,$00 // row 16
158
+ .byte $00,$66,$00 // row 17
159
+ .byte $00,$66,$00 // row 18
160
+ .byte $00,$66,$00 // row 19
161
+ .byte $00,$66,$00 // row 20
162
+ .byte $00 // padding
163
+
164
+ // ── Custom charset at $3000 ───────────────────────────────────────────────────
165
+ *= CSET
166
+
167
+ // Char 0: blank
168
+ .fill 8, 0
169
+
170
+ // Chars 1-4: top-face/floor row 0 (top half of 32x16 2:1 diamond)
171
+ // Row r (0-7): diamond left edge at col 14-2*r, right at 17+2*r (clamped to 0-31)
172
+ // Each char covers 8 columns. Bit 7=col0, bit 0=col7 within the char's span.
173
+ // Char 1: cols 0-7
174
+ .byte $00,$00,$00,$00,$03,$0F,$3F,$FF
175
+ // Char 2: cols 8-15
176
+ .byte $03,$0F,$3F,$FF,$FF,$FF,$FF,$FF
177
+ // Char 3: cols 16-23
178
+ .byte $C0,$F0,$FC,$FF,$FF,$FF,$FF,$FF
179
+ // Char 4: cols 24-31
180
+ .byte $00,$00,$00,$00,$C0,$F0,$FC,$FF
181
+
182
+ // Chars 5-8: top-face/floor row 1 (bottom half of diamond)
183
+ .byte $FF,$3F,$0F,$03,$00,$00,$00,$00 // char 5
184
+ .byte $FF,$FF,$FF,$FF,$FF,$FC,$F0,$C0 // char 6
185
+ .byte $FF,$FF,$FF,$FF,$FF,$3F,$0F,$03 // char 7
186
+ .byte $FF,$FC,$F0,$C0,$00,$00,$00,$00 // char 8
187
+
188
+ // Chars 9-12: side face (cube walls, two per face)
189
+ .byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF // char 9 left-face col 0 solid
190
+ .byte $FF,$7F,$7F,$7F,$7F,$7F,$7F,$FF // char 10 left-face col 1 (right edge line)
191
+ .byte $FF,$FE,$FE,$FE,$FE,$FE,$FE,$FF // char 11 right-face col 0 (left edge line)
192
+ .byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF // char 12 right-face col 1 solid
193
+
194
+ // Fill rest of 2KB charset with zeros
195
+ .fill CSET + $800 - *, 0
196
+
197
+ // ── Main code at $0A00 ────────────────────────────────────────────────────────
198
+ *= $0A00
199
+
200
+ main:
201
+ sei
202
+ lda #$1C
203
+ sta D018
204
+ lda #0
205
+ sta D021
206
+ lda #14
207
+ sta D020
208
+ lda #0
209
+ sta D01B
210
+ lda #0
211
+ sta R_DEP
212
+ sta R_VRD
213
+
214
+ lda #(SPDAT/64)
215
+ sta SPPTR
216
+ lda #1
217
+ sta D015
218
+ lda #7
219
+ sta D027
220
+ lda #0
221
+ sta SPXHI
222
+
223
+ // Clear 1000 screen and colour bytes
224
+ ldx #0
225
+ clrloop:
226
+ lda #$20
227
+ sta SCR+$000,x
228
+ sta SCR+$100,x
229
+ sta SCR+$200,x
230
+ lda #0
231
+ sta COLRAM+$000,x
232
+ sta COLRAM+$100,x
233
+ sta COLRAM+$200,x
234
+ inx
235
+ bne clrloop
236
+ ldx #0
237
+ clrlast:
238
+ lda #$20
239
+ sta SCR+$300,x
240
+ lda #0
241
+ sta COLRAM+$300,x
242
+ inx
243
+ cpx #232
244
+ bne clrlast
245
+
246
+ // First redraw timed
247
+ lda #$FF
248
+ sta TALO
249
+ sta TAHI
250
+ lda #$19
251
+ sta TACRA
252
+ jsr draw_room
253
+ lda #$08
254
+ sta TACRA
255
+ sec
256
+ lda #$FF
257
+ sbc TALO
258
+ sta R_T1L
259
+ lda #$FF
260
+ sbc TAHI
261
+ sta R_T1H
262
+
263
+ // Time one block draw (block at (4,1): col=24, row=9)
264
+ lda #24
265
+ sta draw_col
266
+ lda #9
267
+ sta draw_row
268
+ lda #$FF
269
+ sta TALO
270
+ sta TAHI
271
+ lda #$19
272
+ sta TACRA
273
+ lda #COL_BLOCK
274
+ jsr draw_block_tile
275
+ lda #$08
276
+ sta TACRA
277
+ sec
278
+ lda #$FF
279
+ sbc TALO
280
+ sta R_BKL
281
+ lda #$FF
282
+ sbc TAHI
283
+ sta R_BKH
284
+
285
+ // Initial player position
286
+ lda #1
287
+ sta player_x
288
+ sta player_y
289
+ jsr update_player
290
+
291
+ // Scripted moves
292
+ lda #0
293
+ sta midx
294
+
295
+ mvloop:
296
+ lda midx
297
+ cmp #5
298
+ beq mvdone
299
+ // ~25-frame delay (7*256*256 iterations at ~7 cycles = ~3M cycles, ~3 frames PAL)
300
+ // Using smaller value for speed; actual frame timing not critical for this recipe
301
+ ldy #25
302
+ dly_a:
303
+ ldx #0
304
+ dly_b:
305
+ dex
306
+ bne dly_b
307
+ dey
308
+ bne dly_a
309
+
310
+ ldy midx
311
+ lda mtx,y
312
+ sta player_x
313
+ lda mty,y
314
+ sta player_y
315
+ jsr update_player
316
+
317
+ inc midx
318
+ jmp mvloop
319
+
320
+ mvdone:
321
+ ldy #25
322
+ fdly_a:
323
+ ldx #0
324
+ fdly_b:
325
+ dex
326
+ bne fdly_b
327
+ dey
328
+ bne fdly_a
329
+
330
+ // Second redraw timed
331
+ lda #$FF
332
+ sta TALO
333
+ sta TAHI
334
+ lda #$19
335
+ sta TACRA
336
+ jsr draw_room
337
+ lda #$08
338
+ sta TACRA
339
+ sec
340
+ lda #$FF
341
+ sbc TALO
342
+ sta R_T2L
343
+ lda #$FF
344
+ sbc TAHI
345
+ sta R_T2H
346
+
347
+ jsr check_verdict
348
+
349
+ lda R_VRD
350
+ cmp #1
351
+ bne setred
352
+ lda #COL_PASS
353
+ jmp setborder
354
+ setred:
355
+ lda #COL_FAIL
356
+ setborder:
357
+ sta D020
358
+
359
+ spin:
360
+ jmp spin
361
+
362
+ // ── setup_row: load $02/$03/$04/$05 for row in Y ─────────────────────────────
363
+ setup_row:
364
+ lda scr_row_lo,y
365
+ sta $02
366
+ lda scr_row_hi,y
367
+ sta $03
368
+ lda col_row_lo,y
369
+ sta $04
370
+ lda col_row_hi,y
371
+ sta $05
372
+ rts
373
+
374
+ // ── draw_floor_tile: A=colour, draw_col/draw_row set ─────────────────────────
375
+ // 8 screen writes + 8 colour writes (2 rows of 4 chars)
376
+ draw_floor_tile:
377
+ sta tile_col
378
+ ldy draw_row
379
+ jsr setup_row
380
+ ldy draw_col
381
+ lda #CT0
382
+ sta ($02),y
383
+ iny
384
+ lda #CT1
385
+ sta ($02),y
386
+ iny
387
+ lda #CT2
388
+ sta ($02),y
389
+ iny
390
+ lda #CT3
391
+ sta ($02),y
392
+ ldy draw_col
393
+ lda tile_col
394
+ sta ($04),y
395
+ iny
396
+ sta ($04),y
397
+ iny
398
+ sta ($04),y
399
+ iny
400
+ sta ($04),y
401
+
402
+ ldy draw_row
403
+ iny
404
+ jsr setup_row
405
+ ldy draw_col
406
+ lda #CB0
407
+ sta ($02),y
408
+ iny
409
+ lda #CB1
410
+ sta ($02),y
411
+ iny
412
+ lda #CB2
413
+ sta ($02),y
414
+ iny
415
+ lda #CB3
416
+ sta ($02),y
417
+ ldy draw_col
418
+ lda tile_col
419
+ sta ($04),y
420
+ iny
421
+ sta ($04),y
422
+ iny
423
+ sta ($04),y
424
+ iny
425
+ sta ($04),y
426
+ rts
427
+
428
+ // ── draw_block_tile: A=colour, draw_col/draw_row set ─────────────────────────
429
+ // 16 screen writes + 16 colour writes (4 rows of 4 chars)
430
+ draw_block_tile:
431
+ sta tile_col
432
+ // Row draw_row-2: top-face row 0
433
+ ldy draw_row
434
+ dey
435
+ dey
436
+ jsr setup_row
437
+ ldy draw_col
438
+ lda #CT0
439
+ sta ($02),y
440
+ iny
441
+ lda #CT1
442
+ sta ($02),y
443
+ iny
444
+ lda #CT2
445
+ sta ($02),y
446
+ iny
447
+ lda #CT3
448
+ sta ($02),y
449
+ ldy draw_col
450
+ lda tile_col
451
+ sta ($04),y
452
+ iny
453
+ sta ($04),y
454
+ iny
455
+ sta ($04),y
456
+ iny
457
+ sta ($04),y
458
+ // Row draw_row-1: top-face row 1
459
+ ldy draw_row
460
+ dey
461
+ jsr setup_row
462
+ ldy draw_col
463
+ lda #CB0
464
+ sta ($02),y
465
+ iny
466
+ lda #CB1
467
+ sta ($02),y
468
+ iny
469
+ lda #CB2
470
+ sta ($02),y
471
+ iny
472
+ lda #CB3
473
+ sta ($02),y
474
+ ldy draw_col
475
+ lda tile_col
476
+ sta ($04),y
477
+ iny
478
+ sta ($04),y
479
+ iny
480
+ sta ($04),y
481
+ iny
482
+ sta ($04),y
483
+ // Row draw_row: side face
484
+ ldy draw_row
485
+ jsr setup_row
486
+ ldy draw_col
487
+ lda #CS0
488
+ sta ($02),y
489
+ iny
490
+ lda #CS1
491
+ sta ($02),y
492
+ iny
493
+ lda #CS2
494
+ sta ($02),y
495
+ iny
496
+ lda #CS3
497
+ sta ($02),y
498
+ ldy draw_col
499
+ lda tile_col
500
+ sta ($04),y
501
+ iny
502
+ sta ($04),y
503
+ iny
504
+ sta ($04),y
505
+ iny
506
+ sta ($04),y
507
+ // Row draw_row+1: side face
508
+ ldy draw_row
509
+ iny
510
+ jsr setup_row
511
+ ldy draw_col
512
+ lda #CS0
513
+ sta ($02),y
514
+ iny
515
+ lda #CS1
516
+ sta ($02),y
517
+ iny
518
+ lda #CS2
519
+ sta ($02),y
520
+ iny
521
+ lda #CS3
522
+ sta ($02),y
523
+ ldy draw_col
524
+ lda tile_col
525
+ sta ($04),y
526
+ iny
527
+ sta ($04),y
528
+ iny
529
+ sta ($04),y
530
+ iny
531
+ sta ($04),y
532
+ rts
533
+
534
+ // ── draw_tall_tile: A=colour, draw_col/draw_row set ──────────────────────────
535
+ // 24 screen writes + 24 colour writes (6 rows of 4 chars)
536
+ draw_tall_tile:
537
+ sta tile_col
538
+ // Row draw_row-4: top-face row 0
539
+ ldy draw_row
540
+ dey
541
+ dey
542
+ dey
543
+ dey
544
+ jsr setup_row
545
+ ldy draw_col
546
+ lda #CT0
547
+ sta ($02),y
548
+ iny
549
+ lda #CT1
550
+ sta ($02),y
551
+ iny
552
+ lda #CT2
553
+ sta ($02),y
554
+ iny
555
+ lda #CT3
556
+ sta ($02),y
557
+ ldy draw_col
558
+ lda tile_col
559
+ sta ($04),y
560
+ iny
561
+ sta ($04),y
562
+ iny
563
+ sta ($04),y
564
+ iny
565
+ sta ($04),y
566
+ // Row draw_row-3: top-face row 1
567
+ ldy draw_row
568
+ dey
569
+ dey
570
+ dey
571
+ jsr setup_row
572
+ ldy draw_col
573
+ lda #CB0
574
+ sta ($02),y
575
+ iny
576
+ lda #CB1
577
+ sta ($02),y
578
+ iny
579
+ lda #CB2
580
+ sta ($02),y
581
+ iny
582
+ lda #CB3
583
+ sta ($02),y
584
+ ldy draw_col
585
+ lda tile_col
586
+ sta ($04),y
587
+ iny
588
+ sta ($04),y
589
+ iny
590
+ sta ($04),y
591
+ iny
592
+ sta ($04),y
593
+ // Rows draw_row-2 through draw_row+1: four side face rows
594
+ ldy draw_row
595
+ dey
596
+ dey
597
+ jsr setup_row
598
+ ldy draw_col
599
+ lda #CS0
600
+ sta ($02),y
601
+ iny
602
+ lda #CS1
603
+ sta ($02),y
604
+ iny
605
+ lda #CS2
606
+ sta ($02),y
607
+ iny
608
+ lda #CS3
609
+ sta ($02),y
610
+ ldy draw_col
611
+ lda tile_col
612
+ sta ($04),y
613
+ iny
614
+ sta ($04),y
615
+ iny
616
+ sta ($04),y
617
+ iny
618
+ sta ($04),y
619
+
620
+ ldy draw_row
621
+ dey
622
+ jsr setup_row
623
+ ldy draw_col
624
+ lda #CS0
625
+ sta ($02),y
626
+ iny
627
+ lda #CS1
628
+ sta ($02),y
629
+ iny
630
+ lda #CS2
631
+ sta ($02),y
632
+ iny
633
+ lda #CS3
634
+ sta ($02),y
635
+ ldy draw_col
636
+ lda tile_col
637
+ sta ($04),y
638
+ iny
639
+ sta ($04),y
640
+ iny
641
+ sta ($04),y
642
+ iny
643
+ sta ($04),y
644
+
645
+ ldy draw_row
646
+ jsr setup_row
647
+ ldy draw_col
648
+ lda #CS0
649
+ sta ($02),y
650
+ iny
651
+ lda #CS1
652
+ sta ($02),y
653
+ iny
654
+ lda #CS2
655
+ sta ($02),y
656
+ iny
657
+ lda #CS3
658
+ sta ($02),y
659
+ ldy draw_col
660
+ lda tile_col
661
+ sta ($04),y
662
+ iny
663
+ sta ($04),y
664
+ iny
665
+ sta ($04),y
666
+ iny
667
+ sta ($04),y
668
+
669
+ ldy draw_row
670
+ iny
671
+ jsr setup_row
672
+ ldy draw_col
673
+ lda #CS0
674
+ sta ($02),y
675
+ iny
676
+ lda #CS1
677
+ sta ($02),y
678
+ iny
679
+ lda #CS2
680
+ sta ($02),y
681
+ iny
682
+ lda #CS3
683
+ sta ($02),y
684
+ ldy draw_col
685
+ lda tile_col
686
+ sta ($04),y
687
+ iny
688
+ sta ($04),y
689
+ iny
690
+ sta ($04),y
691
+ iny
692
+ sta ($04),y
693
+ rts
694
+
695
+ // ── draw_room ─────────────────────────────────────────────────────────────────
696
+ // Painter's algorithm: s=0..14, x=x_start..x_end, y=s-x.
697
+ // Clears rows 0..22 first.
698
+ draw_room:
699
+ ldx #0
700
+ drclr:
701
+ lda scr_row_lo,x
702
+ sta $02
703
+ lda scr_row_hi,x
704
+ sta $03
705
+ ldy #0
706
+ lda #$20
707
+ drclr_c:
708
+ sta ($02),y
709
+ iny
710
+ cpy #40
711
+ bne drclr_c
712
+ inx
713
+ cpx #23
714
+ bne drclr
715
+
716
+ lda #0
717
+ sta draw_s
718
+
719
+ paint_s:
720
+ // x_start = max(0, s-7)
721
+ lda draw_s
722
+ sec
723
+ sbc #7
724
+ bpl xs_set
725
+ lda #0
726
+ xs_set:
727
+ sta draw_xs
728
+ // x_end = min(7, s)
729
+ lda draw_s
730
+ cmp #8
731
+ bcc xe_set
732
+ lda #7
733
+ xe_set:
734
+ sta draw_xe
735
+ lda draw_xs
736
+ sta draw_xc
737
+
738
+ paint_x:
739
+ lda draw_xe
740
+ cmp draw_xc
741
+ bcc paint_x_done
742
+
743
+ // y = s - x
744
+ lda draw_s
745
+ sec
746
+ sbc draw_xc
747
+ sta draw_yc
748
+
749
+ // col = OC + 2*(x-y)
750
+ lda draw_xc
751
+ sec
752
+ sbc draw_yc
753
+ asl
754
+ clc
755
+ adc #OC
756
+ sta draw_col
757
+
758
+ // row = OR + x + y
759
+ lda draw_xc
760
+ clc
761
+ adc draw_yc
762
+ clc
763
+ adc #OR
764
+ sta draw_row
765
+
766
+ // cell = room[y*8+x]
767
+ lda draw_yc
768
+ asl
769
+ asl
770
+ asl
771
+ clc
772
+ adc draw_xc
773
+ tay
774
+ lda room,y
775
+
776
+ cmp #2
777
+ beq do_tall
778
+ cmp #1
779
+ beq do_block
780
+ // floor
781
+ lda #COL_FLOOR
782
+ jsr draw_floor_tile
783
+ jmp paint_next
784
+ do_block:
785
+ lda #COL_BLOCK
786
+ jsr draw_block_tile
787
+ jmp paint_next
788
+ do_tall:
789
+ lda #COL_TALL
790
+ jsr draw_tall_tile
791
+ paint_next:
792
+ inc draw_xc
793
+ jmp paint_x
794
+
795
+ paint_x_done:
796
+ inc draw_s
797
+ lda draw_s
798
+ cmp #15
799
+ beq paint_s_done
800
+ jmp paint_s
801
+ paint_s_done:
802
+ rts
803
+
804
+ // ── update_player ─────────────────────────────────────────────────────────────
805
+ update_player:
806
+ // char_col = OC + 2*(px-py)
807
+ lda player_x
808
+ sec
809
+ sbc player_y
810
+ asl
811
+ clc
812
+ adc #OC
813
+ sta player_col
814
+ // char_row = OR + px + py
815
+ lda player_x
816
+ clc
817
+ adc player_y
818
+ clc
819
+ adc #OR
820
+ sta player_row
821
+
822
+ // sprite_x = 24 + 8*(player_col+2) = 40 + 8*player_col
823
+ lda player_col
824
+ asl
825
+ asl
826
+ asl
827
+ // A = 8*player_col; add 40
828
+ clc
829
+ adc #40
830
+ bcs spx_hi
831
+ sta SPX0
832
+ lda #0
833
+ sta SPXHI
834
+ jmp spx_done
835
+ spx_hi:
836
+ sta SPX0
837
+ lda SPXHI
838
+ ora #1
839
+ sta SPXHI
840
+ spx_done:
841
+
842
+ // sprite_y = 45 + 8*player_row
843
+ lda player_row
844
+ asl
845
+ asl
846
+ asl
847
+ clc
848
+ adc #45
849
+ sta SPY0
850
+
851
+ jsr depth_check
852
+ rts
853
+
854
+ // ── depth_check ───────────────────────────────────────────────────────────────
855
+ // Scans all 64 cells. Sets $D01B bit 0 if any block with x+y > px+py
856
+ // has its 4x4/4x6 char box overlapping the sprite's char box.
857
+ // Updates R_DEP if bit goes high.
858
+ //
859
+ // Sprite char box:
860
+ // cols [player_col+2, player_col+4] (3 chars, 24px wide)
861
+ // rows [player_row-1, player_row+1] (3 rows, 21px spans row-1..row+1)
862
+ //
863
+ // Block char box: [block_col, block_col+3] x [block_row-2, block_row+1]
864
+ // Tall block: [block_col, block_col+3] x [block_row-4, block_row+1]
865
+ depth_check:
866
+ lda #0
867
+ sta $06 // depth_found = 0
868
+
869
+ // px+py
870
+ lda player_x
871
+ clc
872
+ adc player_y
873
+ sta $07 // $07 = px+py
874
+
875
+ // sprite col range [$08, $09]
876
+ lda player_col
877
+ clc
878
+ adc #2
879
+ sta $08 // sprite_left_col = player_col+2
880
+ clc
881
+ adc #2
882
+ sta $09 // sprite_right_col = player_col+4
883
+
884
+ // sprite row range [$0A, $0B]
885
+ lda player_row
886
+ sec
887
+ sbc #1
888
+ sta $0A // sprite_top_row
889
+ lda player_row
890
+ clc
891
+ adc #1
892
+ sta $0B // sprite_bot_row
893
+
894
+ lda #0
895
+ sta $0C // y loop counter
896
+
897
+ dc_y:
898
+ lda #0
899
+ sta $0D // x loop counter
900
+
901
+ dc_x:
902
+ // cell index = y*8+x
903
+ lda $0C
904
+ asl
905
+ asl
906
+ asl
907
+ clc
908
+ adc $0D
909
+ tay
910
+ lda room,y
911
+ beq dc_next // floor: skip
912
+
913
+ // Check x+y > px+py
914
+ lda $0C
915
+ clc
916
+ adc $0D // bx+by
917
+ cmp $07 // vs px+py
918
+ bcc dc_next // bx+by < px+py: not in front
919
+ beq dc_next // bx+by == px+py: same plane, skip
920
+
921
+ // In front. Compute block col and row.
922
+ // block_col = OC + 2*(bx-by)
923
+ lda $0D
924
+ sec
925
+ sbc $0C
926
+ asl
927
+ clc
928
+ adc #OC
929
+ sta $0E // block_col
930
+
931
+ // block_row = OR + bx+by
932
+ lda $0D
933
+ clc
934
+ adc $0C
935
+ clc
936
+ adc #OR
937
+ sta $0F // block_row
938
+
939
+ // block char row range
940
+ lda $0C
941
+ asl
942
+ asl
943
+ asl
944
+ clc
945
+ adc $0D
946
+ tay
947
+ lda room,y
948
+ cmp #2
949
+ beq dc_tall
950
+ // block: rows [block_row-2, block_row+1]
951
+ lda $0F
952
+ sec
953
+ sbc #2
954
+ sta $10
955
+ lda $0F
956
+ clc
957
+ adc #1
958
+ sta $11
959
+ jmp dc_overlap
960
+ dc_tall:
961
+ // tall: rows [block_row-4, block_row+1]
962
+ lda $0F
963
+ sec
964
+ sbc #4
965
+ sta $10
966
+ lda $0F
967
+ clc
968
+ adc #1
969
+ sta $11
970
+
971
+ dc_overlap:
972
+ // Col overlap: block_col <= sprite_right AND block_col+3 >= sprite_left
973
+ lda $09
974
+ cmp $0E // sprite_right vs block_col
975
+ bcc dc_next // sprite_right < block_col: no overlap
976
+
977
+ lda $0E
978
+ clc
979
+ adc #3 // block_right
980
+ cmp $08 // vs sprite_left
981
+ bcc dc_next // block_right < sprite_left: no overlap
982
+
983
+ // Row overlap: block_top <= sprite_bot AND block_bot >= sprite_top
984
+ lda $0B
985
+ cmp $10 // sprite_bot vs block_top
986
+ bcc dc_next // sprite_bot < block_top: no overlap
987
+
988
+ lda $11
989
+ cmp $0A // block_bot vs sprite_top
990
+ bcc dc_next // block_bot < sprite_top: no overlap
991
+
992
+ // Overlap confirmed
993
+ lda #1
994
+ sta $06
995
+
996
+ dc_next:
997
+ inc $0D
998
+ lda $0D
999
+ cmp #8
1000
+ beq dc_x_done
1001
+ jmp dc_x
1002
+ dc_x_done:
1003
+ inc $0C
1004
+ lda $0C
1005
+ cmp #8
1006
+ beq dc_y_done
1007
+ jmp dc_y
1008
+ dc_y_done:
1009
+
1010
+ // Apply $D01B bit 0
1011
+ lda $06
1012
+ beq dc_clear
1013
+ lda D01B
1014
+ ora #1
1015
+ sta D01B
1016
+ inc R_DEP
1017
+ jmp dc_done
1018
+ dc_clear:
1019
+ lda D01B
1020
+ and #$FE
1021
+ sta D01B
1022
+ dc_done:
1023
+ rts
1024
+
1025
+ // ── check_verdict ─────────────────────────────────────────────────────────────
1026
+ // Check four screen positions. $02FF = 1 if all match, else 0.
1027
+ // 1. Floor(0,0) top-left: CT0 at row=4, col=18 -> $0400+4*40+18 = $04B2
1028
+ // 2. Block(4,1) top-face TL: CT0 at row=7, col=24 -> $0400+7*40+24 = $0530
1029
+ // 3. Empty cell: space at row=0, col=0 -> $0400
1030
+ // 4. Tall block(7,2) side face: CS0 at row=13, col=28 -> $0400+13*40+28 = $0624
1031
+ check_verdict:
1032
+ lda $04B2
1033
+ cmp #CT0
1034
+ bne cv_fail
1035
+ lda $0530
1036
+ cmp #CT0
1037
+ bne cv_fail
1038
+ lda $0400
1039
+ cmp #$20
1040
+ bne cv_fail
1041
+ lda $0624
1042
+ cmp #CS0
1043
+ bne cv_fail
1044
+ lda #1
1045
+ sta R_VRD
1046
+ rts
1047
+ cv_fail:
1048
+ lda #0
1049
+ sta R_VRD
1050
+ rts
1051
+ ```
1052
+
1053
+ ## Build
1054
+
1055
+ ```bash
1056
+ java -jar $KICKASS_JAR isometric-room.asm -o isometric-room.prg
1057
+ ```
1058
+
1059
+ ## Expected output
1060
+
1061
+ The border is light blue during the run and turns green when the verdict byte
1062
+ `$02FF` equals 1. The screen shows the 8-by-8 diamond room: floor tiles in
1063
+ light green (palette 13), one-tile blocks in yellow (7), two-tile tall blocks
1064
+ in light red (10). Hardware sprite 0 (yellow figure) starts at map cell (1,1)
1065
+ and steps through (2,1), (3,1), (3,2), (3,3), (2,3), pausing roughly 25 frames
1066
+ at each position, then the room is redrawn once more and the border turns green.
1067
+
1068
+ **Verdict byte checks** (all must match for `$02FF = 1`):
1069
+
1070
+ - `$04B2` (screen row 4, col 18): char code 1 -- top-left of floor tile at (0,0)
1071
+ - `$0530` (screen row 7, col 24): char code 1 -- top-left of block(4,1) top face
1072
+ - `$0400` (screen row 0, col 0): char code `$20` -- empty cell above the room
1073
+ - `$0624` (screen row 13, col 28): char code 9 -- side face of tall block(7,2)
1074
+
1075
+ **Timer measurements** (CIA 1 timer A, one-shot from `$FFFF`, stored as
1076
+ `$FFFF - timer_value`; measured in VICE x64sc 3.10 PAL):
1077
+
1078
+ - First full room redraw: `$02F0/$02F1` = `$32`/`$A4` -> 42,034 cycles
1079
+ - Second full room redraw: `$02F2/$02F3` = `$A6`/`$A3` -> 41,894 cycles
1080
+ - One block draw (block at map cell (4,1)): `$02F4/$02F5` = `$0F`/`$02` -> 527 cycles
1081
+
1082
+ A PAL frame is 19,656 cycles; a full room redraw costs about 2.1 frames (the
1083
+ room is redrawn only at start and once after the last scripted move, not every
1084
+ frame). One block draw is 527 cycles, under 3 % of a frame. See "Cycle budget"
1085
+ in `docs/techniques/text-mode-render.md` under `isometric_tile_engine`.
1086
+
1087
+ **Depth bit (`$D01B` bit 0) and `$02FE`:** The spec's fixed map and sprite
1088
+ formula produce three positions where the sprite's 3-char-wide by 3-char-tall
1089
+ character box overlaps a block whose x+y exceeds the player's: map cells (2,1),
1090
+ (3,1), and (3,3). `$02FE` = 3 (measured). The spec targets one activation at
1091
+ (3,1); the overlap at (2,1) and (3,3) is a consequence of the sprite's full
1092
+ character bounding box touching the block at col 24 in both cases. The depth
1093
+ bit is cleared at all other positions.
1094
+
1095
+ **Screenshots:** PAL 384x272, NTSC 384x247. Both show the same room layout
1096
+ with a green border at the pinned cycle count (5,000,000 cycles).
1097
+
1098
+ ![PAL screenshot](screenshots/isometric-room.png)
1099
+ ![NTSC screenshot](screenshots/isometric-room-ntsc.png)
1100
+
1101
+ **Negative control -- reversed painter order:** Building with the outer loop
1102
+ running s from 14 down to 0 (front-to-back instead of back-to-front) causes
1103
+ far floor tiles to overdraw nearer blocks. At screen row 7, col 24 the correct
1104
+ build holds char 1 (CT0, the top-left of block(4,1)'s top face); the reversed
1105
+ build holds char 9 or 7 (a floor tile's bottom-row char drawn after the block).
1106
+ The verdict fails: border turns red.
1107
+
1108
+ ## Why this works
1109
+
1110
+ **Painter's order.** The loop iterates diagonals `s = x + y` from 0 to 14. For
1111
+ each diagonal, cells are drawn left to right (decreasing y, increasing x). A
1112
+ cell at a higher diagonal value appears lower on screen and closer to the
1113
+ viewer, so drawing it last puts it on top of any background that was already
1114
+ there. No per-cell z-buffer is needed.
1115
+
1116
+ **Projection.** `col = OC + 2*(x - y)`, `row = OR + (x + y)` places cells on
1117
+ a 2:1 diamond grid. The factor of 2 on the x-y difference gives the horizontal
1118
+ spread, and x+y gives the vertical depth. All 64 cells land within columns 4
1119
+ to 35 and rows 4 to 19 with the chosen origin (OC=18, OR=4), so no boundary
1120
+ check is needed inside the draw loop.
1121
+
1122
+ **Depth bit.** After each move `update_player` calls `depth_check`, which
1123
+ iterates all 64 cells. Any cell with `x + y > px + py` is in front of the
1124
+ player. If that cell is a block and its character box (4 cols by 4 or 6 rows)
1125
+ overlaps the sprite's character box (3 cols by 3 rows, positioned from
1126
+ `sprite_x = 24 + 8*(col+2)`, `sprite_y = 45 + 8*row`), the routine sets
1127
+ `$D01B` bit 0, placing the sprite behind all playfield characters. One bit
1128
+ covers the whole sprite: the limitation is that the player appears behind every
1129
+ character on screen when the bit is set, not just the block in question. The
1130
+ Variations section of the technique entry discusses the fix.
1131
+
1132
+ ## What it does not establish
1133
+
1134
+ **Per-frame animation.** The room is drawn twice (once at start, once after the
1135
+ last move) and is otherwise static. Moving the camera or animating tiles would
1136
+ require the redraw budget to fit inside the blank window (~6,700 cycles on PAL),
1137
+ which a full 64-cell room (42,034 cycles per redraw) does not.
1138
+
1139
+ **Correct per-block depth.** `$D01B` is one bit: when two blocks straddle the
1140
+ player, the bit puts the sprite behind both. A player standing between a front
1141
+ block and a rear block shows the rear block over the sprite even though it
1142
+ should be behind it.
1143
+
1144
+ **NTSC timing.** Both models run and pass the verdict. The timer values were
1145
+ measured only on PAL; NTSC cycle counts are not measured here.