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,655 @@
1
+ # c64-kb Graph Ontology
2
+
3
+ ## Overview
4
+
5
+ The FalkorDB knowledge graph models C64 hardware (chips, registers,
6
+ memory regions), demo and game techniques, toolchains, pitfalls, and
7
+ crash/failure patterns. Designed to support multi-hop queries like
8
+ "what techniques use the copper-equivalent stable raster IRQ?" or "what
9
+ registers does this effect touch?" or "is FLI compatible with sprite-
10
+ multiplex-24 in PAL?"
11
+
12
+ `ensureSchema()` creates the indexes, constraints and the `Chip`, `Region`
13
+ and `HardwareUnit` seed nodes; every other node and edge comes from ingesting `docs/`.
14
+
15
+ Design principles:
16
+ - 5–12 node types, 8–20 edge types (maintainable range for a domain KB)
17
+ - Node vs property test: "do you traverse through it?" If yes, node.
18
+ - Single general type with `category` property (one `Technique` with
19
+ category, not separate `CopperTechnique`/`SpriteTechnique` labels).
20
+ - Edge names: verb-based SCREAMING_SNAKE reading as sentences.
21
+
22
+ ## Node Types (16)
23
+
24
+ ### KernalRoutine
25
+
26
+ A KERNAL ROM jump-table entry ($FF81-$FFF3). An earlier version of this
27
+ line said $FFC0+; the table starts at $FF81 (CINT).
28
+
29
+ | Property | Type | Description |
30
+ |----------|------|-------------|
31
+ | name | string | Routine name (e.g. "CHROUT") |
32
+ | address | string | Hex jump-table address (e.g. "$FFD2") |
33
+ | input_regs | string | Calling convention (e.g. "A=byte to print") |
34
+ | output_regs | string | Return values (e.g. "C=error flag") |
35
+ | description | string | One-line summary |
36
+
37
+ Source: `hardware/kernal-routines-reference.md` (Phase 1).
38
+
39
+ ### Register
40
+
41
+ A C64 hardware register at $D000–$DFFF.
42
+
43
+ | Property | Type | Description |
44
+ |----------|------|-------------|
45
+ | name | string | Register name (e.g. "D011", "BORDER") |
46
+ | address | string | Hex address (e.g. "$D011") |
47
+ | chip | string | Owning chip ("VIC-II", "SID", "CIA1", "CIA2") |
48
+ | rw | string | Access type: "R", "W", or "RW" |
49
+ | bit_width | integer | 8 in nearly all cases |
50
+ | default_value | string | Power-on default |
51
+ | side_effects | string | Strobe / write-only / read-clears semantics |
52
+
53
+ Source: `hardware/c64-registers-reference.md` (Phase 1).
54
+
55
+ ### MemoryRegion
56
+
57
+ An address-space zone (zero page, screen RAM, BASIC RAM, I/O, KERNAL ROM,
58
+ etc.).
59
+
60
+ | Property | Type | Description |
61
+ |----------|------|-------------|
62
+ | name | string | Zone name (e.g. "Zero page", "Screen RAM") |
63
+ | start | string | Start address (e.g. "$0400") |
64
+ | end | string | End address (e.g. "$07FF") |
65
+ | default_use | string | What lives here by default |
66
+ | can_be_bank_switched | boolean | Whether $01 affects it |
67
+
68
+ Source: `hardware/c64-memory-map.md` (Phase 1).
69
+
70
+ ### Chip
71
+
72
+ A C64 silicon component. Static nodes seeded in `ensureSchema()`.
73
+
74
+ | Property | Type | Description |
75
+ |----------|------|-------------|
76
+ | name | string | One of: "VIC-II", "SID", "CIA1", "CIA2", "6510" |
77
+ | variants | string | Known revisions / models |
78
+ | role | string | Functional role |
79
+
80
+ **Hardcoded seed (5 nodes):**
81
+ - VIC-II (variants: 6569 PAL / 6567 NTSC)
82
+ - SID (variants: 6581 / 8580)
83
+ - CIA1 (6526) — keyboard, joystick port 2, timer-A IRQ
84
+ - CIA2 (6526) — VIC bank select, RS-232, timer-B NMI
85
+ - 6510 — CPU with I/O port at $00/$01
86
+
87
+ ### Region
88
+
89
+ A C64 video region. Static nodes seeded in `ensureSchema()`.
90
+
91
+ | Property | Type | Description |
92
+ |----------|------|-------------|
93
+ | name | string | "PAL" or "NTSC" |
94
+ | refresh_hz | integer | 50 (PAL) or 60 (NTSC) |
95
+ | lines_per_frame | integer | 312 (PAL) or 263 (NTSC) |
96
+ | cycles_per_line | integer | 63 (PAL) or 65 (NTSC) |
97
+
98
+ **Hardcoded seed (2 nodes):** PAL, NTSC.
99
+
100
+ ### Technique
101
+
102
+ A demo/game programming technique (raster IRQ, sprite multiplexer, FLI,
103
+ soft scroll, plasma, hard-restart, illegal-opcode trick, etc.).
104
+
105
+ | Property | Type | Description |
106
+ |----------|------|-------------|
107
+ | name | string | Snake_case name (e.g. "stable_raster_irq") |
108
+ | category | string | One of: raster, sprite, scroll, bitmap, effect, music, cpu, banking, loader, render, input, logic, maths, text, io. Enforced at extract (schema 20): a technique doc outside the set is refused with a warning. `render` had been in use since the text-mode page without being listed; input, logic, maths, text and io were added for game and application foundations (issue #17). |
109
+ | complexity | string | "low", "medium", "high", "scene-tier" |
110
+ | cost_cycles_per_line | integer, optional | CPU cycles the technique takes on each raster line it is active on. From the page's `**Cost:**` line (schema 22). |
111
+ | cost_cycles_per_frame | integer, optional | CPU cycles the technique takes per frame, a PAL frame of 19,656 unless the page says otherwise. The worst frame, not an average. For a routine called on demand, one call per frame; a routine the page places outside the frame loop has no value here. |
112
+ | cost_lines_active | integer, optional | Raster lines per frame on which the technique runs code. |
113
+ | cost_bytes_code | integer, optional | Bytes of code in the built recipe's segments. When the page states only a PRG size, that size less the two-byte load address. |
114
+ | cost_bytes_data | integer, optional | Bytes of tables, buffers and other data in the built recipe's segments. |
115
+ | cost_zp_bytes | integer, optional | Zero-page bytes the technique claims. |
116
+ | cost_irq_slots | integer, optional | Raster or timer interrupts the technique needs per frame. |
117
+ | cost_sprites_per_line | integer, optional | The most hardware sprites displayed on one raster line of the technique's lines, 0-8 (schema 24). `c64_timing_budget` subtracts their DMA (3 + 2 per sprite, measured) from the line's user cycles. |
118
+ | cost_cycles_per_frame_typical | integer, optional | A measured typical frame beside a worst-frame cost_cycles_per_frame, never above it (schema 27). `c64_plan_budget` sums it for the low end of its range, which is therefore not a floor. |
119
+ | cost_recipe | string, optional | The recipe the cost figures were measured on or counted from, from `**Cost measured on:**` (schema 27). A property, not an edge; ingest warns when it names no Recipe. |
120
+ | cost_conditions | string, optional | The parenthetical after the recipe on that line: "screen blanked", "whole PRG", "one call" and the like (schema 27). `c64_plan_budget` reads "screen on" (the badline stalls that fell inside the figure are in it), "blank" (none are) and "whole PRG" (bytes not summed). |
121
+ | cost_includes | string[], optional | Techniques whose per-frame work is inside this technique's figure, from `**Cost includes:**` (schema 27). Authored, never inferred; ingest warns when a name is no Technique. A budget that lists both counts the included one once. |
122
+ | cost_basis | string, optional | How the cost figures were obtained, one of "measured-vice", "derived-listing", "arithmetic", "estimated"; present exactly when any cost_* property is. The word is the weakest that applies to any figure on the line. |
123
+ | raster_band | string, optional | The raster lines the technique holds the CPU on, from the page's `**Raster band:**` line (schema 24), in canonical form: sorted inclusive ranges such as "45-250" or "0-44,251-311", or "movable" when the program chooses the lines. Absent when the page states none; a re-ingest that drops the line clears it. `c64_check_compatibility` clears its line-sharing rules for two techniques whose line bands share no line. |
124
+ | claims_stated | string, optional | "stated" when the page's `**Claims:**` line names units, "none" when it says `none` (schema 25). Absent means unknown: the page states nothing, which is not the same as "none". The CLAIMS edges carry the units. |
125
+ | claims_basis | string, optional | How the claims were established: "measured-vice", "derived-listing" or "estimated"; present exactly when claims_stated is. |
126
+
127
+ A technique whose page has no `**Cost:**` line has none of the `cost_*`
128
+ properties, so `WHERE t.cost_cycles_per_frame IS NOT NULL` finds the
129
+ costed ones; a re-ingest that drops the line clears them. `c64_plan_budget`
130
+ and the briefing tools add a set up by the rules in `src/domain/budget.ts`
131
+ (schema 27): a member with no cycles figure is unknown, not zero; a
132
+ figure above one frame is not summed; included work and a band's
133
+ prerequisites are not counted twice; `over` rests only on work that runs
134
+ every frame. An earlier version summed every `cost_cycles_per_frame` and
135
+ called the result a floor.
136
+
137
+ Source: `techniques/*.md` (Phase 3+).
138
+
139
+ ### Pitfall
140
+
141
+ A known gotcha or non-obvious behavior.
142
+
143
+ | Property | Type | Description |
144
+ |----------|------|-------------|
145
+ | title | string | Short description |
146
+ | severity | string | "critical", "high", "medium", "low" |
147
+ | region_specific | string | "pal", "ntsc", "both" |
148
+
149
+ Source: `pitfalls/*.md` (one Pitfall per H2; the file an earlier version of this line named, `c64-pitfalls.md`, does not exist).
150
+
151
+ ### CrashPattern
152
+
153
+ A symptom-keyed failure record (no Guru codes on C64 — failures are
154
+ visual or behavioral).
155
+
156
+ | Property | Type | Description |
157
+ |----------|------|-------------|
158
+ | symptom | string | Visible/audible symptom (e.g. "black screen", "wrong music tempo") |
159
+ | likely_causes | string | JSON-encoded list of causes |
160
+ | diagnosis_steps | string | How to localize the issue |
161
+
162
+ Source: `c64-failure-patterns.md` (Phase 5).
163
+
164
+ ### Tool
165
+
166
+ A development tool (assembler, compiler, emulator, art editor, music
167
+ editor, debugger, packer).
168
+
169
+ | Property | Type | Description |
170
+ |----------|------|-------------|
171
+ | name | string | Tool name (e.g. "oscar64", "kickassembler") |
172
+ | kind | string | The page's `tool_kind`: c-compiler, c-library, assembler, linker, emulator, debug-bridge, unit-test, reference-catalog, asset-converter |
173
+ | maintainer | string | Maintainer, or "" |
174
+ | license | string | Licence, or "" |
175
+ | home_url | string | Project home page |
176
+ | version_verified | string, optional | The version this repo's gates ran with, as the tool reports it (schema 24), e.g. "5.25" for KickAssembler. Absent when the page states none. `c64_recipe_lookup` returns it as `toolchain_version_verified`. |
177
+
178
+ An earlier version of this table listed a single `category` property with
179
+ art, music, debug, test and packer values; the extractor has always
180
+ written `kind` from `tool_kind`, with the values above.
181
+
182
+ Source: toolchain reference docs (Phase 2).
183
+
184
+ ### Recipe
185
+
186
+ A buildable code recipe. The same demo concept can have multiple Recipe
187
+ nodes — one per toolchain.
188
+
189
+ | Property | Type | Description |
190
+ |----------|------|-------------|
191
+ | name | string | Recipe identifier |
192
+ | source_doc | string | Path of the markdown source |
193
+ | toolchain | string | One of: "oscar64", "kickassembler", "cc65" |
194
+ | output_format | string | One of: "prg", "crt", "d64", "bin" |
195
+ | region | string | "pal", "ntsc", or "both" |
196
+
197
+ Source: `recipes/<toolchain>/*.md` (Phase 2+).
198
+
199
+ ### FileFormat
200
+
201
+ A C64 file format.
202
+
203
+ | Property | Type | Description |
204
+ |----------|------|-------------|
205
+ | name | string | "PRG", "D64", "T64", "CRT", "SID", "Koala", "IFFL", "CTM", "SPD", "SNG" |
206
+ | extension | string | Conventional file extension |
207
+ | description | string | One-line summary |
208
+
209
+ Source: `c64-file-formats.md` (Phase 2).
210
+
211
+ ### Resource
212
+
213
+ A machine-level resource a technique needs while it is active: every CPU
214
+ cycle on its lines, a constant sprite set, a badline-free region, the KERNAL
215
+ banked out, the drive's serial bus. One node per word of the fixed
216
+ `**Demands:**` vocabulary in `CONVENTIONS-techniques.md`; created on first
217
+ reference.
218
+
219
+ | Property | Type | Description |
220
+ |----------|------|-------------|
221
+ | name | string | Vocabulary word (e.g. "cpu_every_line") |
222
+ | description | string | One-line meaning |
223
+
224
+ Source: `techniques/*.md` `**Demands:**` lines.
225
+
226
+ ### HardwareUnit
227
+
228
+ A named piece of hardware that one technique can hold while another wants
229
+ it: a SID voice, a sprite, a CIA timer, the raster compare, an interrupt
230
+ vector, zero page (schema 25). Seeded by `ensureSchema()` from
231
+ `HARDWARE_UNITS` in `src/graph/extract.ts`, like Chip and Region, so a
232
+ `**Claims:**` line can only name a unit that exists. It answers a
233
+ different question from Resource: a Resource is a kind of machine time
234
+ ("every CPU cycle on its lines"), a HardwareUnit is a register set.
235
+
236
+ | Property | Type | Description |
237
+ |----------|------|-------------|
238
+ | name | string | Seed name (e.g. "sid_voice_2", "vic_raster_irq") |
239
+ | kind | string | sid_voice, sid_shared, sprite, timer, tod, port, bus, irq_source, vector, io_page or zero_page |
240
+ | addresses | string | The registers or bytes (e.g. "$D407-$D40D") |
241
+ | chip | string | Owning chip, "" for the expansion I/O pages; also a BELONGS_TO edge |
242
+
243
+ The seed: `sid_voice_1`-`3` ($D400-$D406, $D407-$D40D, $D40E-$D414),
244
+ `sid_filter_volume` ($D415-$D418), `sid_voice_3_readback` ($D41B-$D41C),
245
+ `sid_pots` ($D419-$D41A), `sprite_0`-`7` (position, colour, enable and
246
+ other bits, pointer), `cia1_timer_a`/`b`, `cia2_timer_a`/`b`,
247
+ `cia1_tod`, `cia2_tod` (each with its bit of the interrupt control
248
+ register $DC0D/$DD0D: timer A bit 0, timer B bit 1, TOD alarm bit 2),
249
+ `cia1_port_a` ($DC00: keyboard column drive,
250
+ control port 2), `cia1_port_b` ($DC01: keyboard rows, control port 1),
251
+ `cia2_vic_bank` ($DD00 bits 0-1), `serial_bus` ($DD00 bits 3-7 and the
252
+ drive), `user_port` ($DD01), `vic_raster_irq` (the one raster compare:
253
+ $D012, $D011 bit 7, $D019/$D01A bit 0), `irq_vector_0314`,
254
+ `irq_vector_fffe`, `nmi_vector_0318`, `nmi_vector_fffa`,
255
+ `expansion_io1` ($DE00-$DEFF), `expansion_io2` ($DF00-$DFFF), and
256
+ `zero_page` ($02-$FF), one unit whose bytes ride the CLAIMS and
257
+ CLOBBERS_ZP edges.
258
+
259
+ ### Archetype
260
+
261
+ A shape a game or demo takes: the vertical shooter, the single-screen
262
+ platformer, the text adventure. Traversed through, not read as a
263
+ property: `c64_game_briefing` walks Archetype to its techniques and
264
+ pitfalls, which is why it is a node and not a keyword table in the tool.
265
+
266
+ | Property | Type | Description |
267
+ |----------|------|-------------|
268
+ | name | string | snake_case canonical name, from the `**Archetype:**` line (e.g. "vertical_shmup") |
269
+ | title | string | The H2 text (e.g. "Vertical Shmup") |
270
+ | kind | string | "game" or "demo", from file frontmatter; defaults to game |
271
+ | source_doc | string | Path of the page that defines it |
272
+ | brief_words | string[] | From the `**Brief words:**` line, normalised (lower case, punctuation as one space); empty when the entry has none. `c64_game_briefing` with no `archetype` routes the brief to the game archetype whose words it contains most (schema 30) |
273
+ | starter | string? | Directory in `templates/` holding a playable starter for it, from the optional `**Starter:**` line (schema 31); absent when the page names none |
274
+
275
+ Source: `game-design/c64-game-archetypes.md` and, for kind `demo`,
276
+ `demo-design/intro-cracktro-patterns.md` (one Archetype per H2 that
277
+ carries an `**Archetype:**` line; `CONVENTIONS-archetypes.md`). Before
278
+ schema 21 the briefing tool held four archetype keywords and two forced
279
+ techniques in code and the page's fingerprints were read by nobody.
280
+
281
+ ### GameDesign
282
+
283
+ A whole game: the techniques it runs in each phase, the archetype it is
284
+ an instance of, the recipe that builds it, and what its frame measured
285
+ when the built game was timed (schema 28). A node because
286
+ `c64_plan_budget` traverses it: a design name expands to its COMPOSES
287
+ edges, each in its phase, and the measured frame is set beside the
288
+ prediction.
289
+
290
+ | Property | Type | Description |
291
+ |----------|------|-------------|
292
+ | name | string | snake_case, from the `**Game design:**` line (e.g. "platformer_scaffold_oscar64") |
293
+ | title | string | The H2 text |
294
+ | region | string, optional | "PAL", "NTSC" or "both", from `**Region:**`; the budget's default region when the caller gives none |
295
+ | measured | string, optional | JSON list of `{phase, region, worst, typical?, basis, source}` from the `**Measured frame:**` lines: what the built game's frame took, in cycles, on the realising recipe. Absent when the game was not timed; a re-ingest that drops the lines clears it |
296
+ | source_doc | string | Path of the page |
297
+
298
+ Source: `game-design/designs/*.md`, one GameDesign per H2 that carries a
299
+ `**Game design:**` line (`CONVENTIONS-game-designs.md`).
300
+
301
+ ### MachineVariant
302
+
303
+ A C64 model VICE x64sc 3.10 runs, named by its `-model` word (schema 29).
304
+ Seeded by `ensureSchema()` from `src/graph/machine-variants.ts`, like Chip
305
+ and Region. A variant, not a Region: the 6567R56A (`oldntsc`) and the
306
+ Drean 6572 (`drean`) differ from their region's timing, and a third Region
307
+ would split every region rule.
308
+
309
+ | Property | Type | Description |
310
+ |----------|------|-------------|
311
+ | name | string | `c64`, `c64c`, `c64old`, `ntsc`, `newntsc`, `oldntsc`, `drean` |
312
+ | vice_flag | string | `-model <name>` |
313
+ | vic, sid, cia | string | The chips VICE runs for the model, read from `x64sc -default -model <m> -dumpconfig` (VICIIModel, SidModel, CIA1Model), each VICIIModel number named by `-VICIImodel <chip>` |
314
+ | cycles_per_line, lines | integer | Lines measured on all seven by `recipes/oscar64/pal-ntsc-detect.md`; cycles per line from `hardware/pal-ntsc-reference.md`: measured in VICE there for oldntsc (64) and drean (65), from its sources for the rest (63 PAL, 65 NTSC; the 8565 and 8562 are stated timing-compatible, not measured here) |
315
+ | region | string | "PAL", "NTSC" or "PAL-N"; a property, not an edge |
316
+ | vice_default | boolean | True for `c64c`: `x64sc -default` with no `-model` runs an 8565, 8580 and 8521, the same configuration as `-model c64c` |
317
+
318
+ `jap`, `c64gs`, `pet64` and `ultimax` also exist in this VICE; they are
319
+ left out until a page needs them.
320
+
321
+ ## Edge Types (26)
322
+
323
+ ### BELONGS_TO
324
+
325
+ Direction: `Register → Chip`, `Technique → Chip`, `HardwareUnit → Chip`
326
+
327
+ Meaning: "this register lives on this chip."
328
+
329
+ Example: `($D011)-[:BELONGS_TO]->(VIC-II)`
330
+
331
+ ### USES
332
+
333
+ Direction: `Technique → Register/KernalRoutine`, `Recipe → Register/KernalRoutine`
334
+
335
+ Meaning: "this technique or recipe touches this register or routine."
336
+
337
+ ### IMPLEMENTS
338
+
339
+ Direction: `Recipe → Technique`
340
+
341
+ Meaning: "this recipe demonstrates this technique."
342
+
343
+ ### BUILDS_ON
344
+
345
+ Direction: `Recipe → Recipe`
346
+
347
+ Meaning: "this recipe depends on a prior recipe — learn that first."
348
+
349
+ Listed since the ontology was drafted, but no extractor emits it and no
350
+ tool reads it (checked 2026-09-22: `BUILDS_ON` occurs nowhere in `src/`
351
+ or `test/`). The prerequisite relation the docs actually state is between
352
+ techniques, and that is `REQUIRES` below.
353
+
354
+ ### REQUIRES
355
+
356
+ Direction: `Technique → Technique`
357
+
358
+ Meaning: "this technique presupposes that one is already set up or running
359
+ underneath it" — `text_zoom` REQUIRES `stable_raster_irq` (an IRQ on every
360
+ scanline of its zone), `infinite_scroll_h` REQUIRES `soft_scroll_h` and
361
+ `char_scroll_buffer_h`, `sid_filter_routing` REQUIRES `sid_voice_setup`.
362
+ Authored per technique with a `**Requires:**` line
363
+ (`CONVENTIONS-techniques.md`). It is not "see also" and not "variant of":
364
+ `double_irq` is a variant of `stable_raster_irq`, not a prerequisite, and
365
+ neither carries the edge. Both ends are MATCHed at ingest, never MERGEd,
366
+ so a misspelt name drops the edge with a warning instead of creating a
367
+ stub; an edge that would close a cycle is refused. Read by
368
+ `c64_technique_lookup` (`requires`, `required_by`), `c64_techniques_for`
369
+ (`requires` filter, following the chain) and `c64_check_compatibility`,
370
+ which takes each input's REQUIRES closure and runs the hard DEMANDS rules
371
+ between one technique's prerequisites and the other technique, reporting a
372
+ hit as `prerequisite_conflict` — never against a prerequisite the technique
373
+ declared itself, and never by folding a prerequisite's demands into its
374
+ dependant's.
375
+
376
+ ### TRIGGERED_BY
377
+
378
+ Direction: `Pitfall → Register/KernalRoutine/Technique`
379
+
380
+ Meaning: "this pitfall is provoked when using this thing." For a Technique
381
+ target this is the technique in whose code the pitfall arises; the
382
+ technique that cures it is `MITIGATED_BY`, which the single vocabulary used
383
+ to carry as well (`sprite_dma_overflow` was TRIGGERED_BY
384
+ `sprite_multiplex_8` while its Fix said the multiplexer is the fix).
385
+
386
+ ### MITIGATED_BY
387
+
388
+ Direction: `Pitfall → Technique`
389
+
390
+ Meaning: "applying this technique is the Fix section's remedy for this
391
+ pitfall" — `raster_irq_first_line_jitter` MITIGATED_BY `double_irq`, the
392
+ three region-timing pitfalls MITIGATED_BY `pal_ntsc_detection`. Authored
393
+ with a `**Mitigated by techniques:**` line (`CONVENTIONS-pitfalls.md`);
394
+ Technique targets only, both ends MATCHed, misses warned about and counted
395
+ beside triggered_by. A technique may be on both lines only when the pitfall
396
+ arises in a naive version of it and a correct version cures it, and the
397
+ Mechanism says so. Where the remedy is not a Technique node (the SID hard
398
+ restart, a `$0318` handler) there is no edge and the Fix stays prose. Read
399
+ by `c64_pitfalls_for` (a Technique topic matches either relation;
400
+ `mitigated_by[]` is reported apart from `triggered_by[]`) and
401
+ `c64_technique_lookup` (`mitigates`).
402
+
403
+ ### CAUSED_BY
404
+
405
+ Direction: `CrashPattern → Register/KernalRoutine/Technique`
406
+
407
+ Meaning: "this failure pattern is caused by misuse of this thing."
408
+
409
+ ### REQUIRES_TOOL
410
+
411
+ Direction: `Recipe → Tool`
412
+
413
+ Meaning: "this recipe needs this tool to build."
414
+
415
+ Source: every recipe's frontmatter `toolchain` names a Tool node
416
+ (`oscar64`, `kickassembler`, `cc65`) and the ingester links the recipe to
417
+ it. Until data 713 that link was written as `USES`, so this edge type was
418
+ defined and populated by nothing while the same fact sat under the wrong
419
+ label; the ingester now writes `REQUIRES_TOOL` and a query for
420
+ `(:Recipe)-[:REQUIRES_TOOL]->(:Tool)` returns every recipe.
421
+
422
+ ### REQUIRES_REGION
423
+
424
+ Direction: `Technique → Region`
425
+
426
+ Meaning: "this technique requires PAL or NTSC specifically."
427
+
428
+ ### PRODUCES
429
+
430
+ Direction: `Tool → FileFormat`
431
+
432
+ Meaning: "this tool produces this file format."
433
+
434
+ ### CONSUMES
435
+
436
+ Direction: `Tool → FileFormat`
437
+
438
+ Meaning: "this tool reads/converts this file format."
439
+
440
+ ### TARGETS
441
+
442
+ Direction: `Tool → Chip`
443
+
444
+ Meaning: "this tool targets this chip (e.g. GoatTracker targets SID)."
445
+
446
+ ### PAIRS_WITH
447
+
448
+ Direction: `KernalRoutine → KernalRoutine`
449
+
450
+ Meaning: "if you call A you also need B" (e.g. SETLFS + SETNAM + LOAD).
451
+
452
+ ### DEMANDS
453
+
454
+ Direction: `Technique → Resource`
455
+
456
+ Meaning: "while this technique is active it needs this machine-level
457
+ resource" — every CPU cycle on its lines, a constant sprite set, a
458
+ badline-free region, the KERNAL banked out, and so on. Authored per
459
+ technique with a `**Demands:**` line from the fixed vocabulary in
460
+ `CONVENTIONS-techniques.md`. `c64_check_compatibility` derives its hard
461
+ conflicts from these: two `cpu_every_line` techniques cannot share a raster
462
+ line; `cpu_every_line` against `midframe_raster_irqs` or
463
+ `continuous_interrupts` cannot either; `constant_sprite_set` against
464
+ `changes_sprite_set`; `kernal_rom_out` against any technique that USES a
465
+ KernalRoutine; `serial_bus_exclusive` (schema 24, a resident drive-code
466
+ loader) against any technique that USES a KERNAL serial or file routine
467
+ (`serial_bus_busy`). The rules about sharing lines are cleared, and the pair is
468
+ listed as band-separated, when both techniques carry a `raster_band` of
469
+ line ranges and the ranges share no line. Before schema 24 there was no
470
+ band, and any two `cpu_every_line` techniques were reported as a conflict.
471
+
472
+ ### CLAIMS
473
+
474
+ Direction: `Technique → HardwareUnit`
475
+
476
+ Meaning: "while this technique runs it holds this unit, in this mode"
477
+ (schema 25). Authored with the `**Claims:**` and `**Claims basis:**`
478
+ lines (`CONVENTIONS-techniques.md`). Both ends MATCHed, never MERGEd; a
479
+ miss is warned about and counted in the ingest summary as `claims …
480
+ dropped`. Re-ingesting a technique drops its old CLAIMS edges first, so a
481
+ claim the page stopped making does not outlive it.
482
+
483
+ | Property | Type | Description |
484
+ |----------|------|-------------|
485
+ | mode | string | owns (writes or holds it every frame; nobody else may), shares (writes it under the owner's protocol: after the owner in the frame, or in the owner's interrupt chain), reads (reads only), init (uses it once before the frame loop) |
486
+ | ranges | string or null | zero_page only: canonical bytes, e.g. "02-0D,24-2F" |
487
+ | relocatable | boolean | zero_page only: the bytes move with a build option |
488
+ | basis | string | measured-vice, derived-listing or estimated |
489
+
490
+ `c64_check_compatibility` reads them: two `owns` of one unit is
491
+ `unit_contention` (hard); two `owns` of zero page that share bytes is
492
+ `zero_page_overlap` (hard, soft when either side is relocatable);
493
+ `owns` against `shares`, or two `shares`, is `unit_shared` (soft);
494
+ `owns` against `reads` is `unit_read_while_driven` (soft); `init`
495
+ against `owns` or `shares` is `init_order` (info). Between a technique
496
+ and its own REQUIRES prerequisite the two ownership rules do not run, and
497
+ `unit_shared` runs only when the sharer is the one that requires the
498
+ owner (`sfx_engine_beside_music` requires the player it writes after;
499
+ `fli_image` runs the stable raster IRQ it requires inside its own
500
+ handler). Through the REQUIRES closure, a prerequisite's claims on units
501
+ its input technique holds are the input's, and the input's own pair
502
+ reports them; the hit that remains carries the rule in `underlying_kind`.
503
+ A technique with no Claims line is reported as unknown, never as
504
+ claiming nothing.
505
+ `c64_techniques_for` filters on a claimed unit.
506
+
507
+ ### CLOBBERS_ZP
508
+
509
+ Direction: `KernalRoutine → HardwareUnit` (always `zero_page`)
510
+
511
+ Meaning: "calling this routine may write, or did write, these zero-page
512
+ bytes" (schema 26). One edge per `**Clobbers zero page:**` line under the
513
+ routine's H3 in `hardware/kernal-routines-reference.md`
514
+ (`CONVENTIONS-hardware-reference.md`). Both ends MATCHed; a miss is
515
+ counted in the ingest summary as `clobbers_zp … dropped`. Re-ingesting
516
+ the routine drops its old CLOBBERS_ZP edges first.
517
+
518
+ | Property | Type | Description |
519
+ |----------|------|-------------|
520
+ | ranges | string | canonical bytes $00-$FF, e.g. "90-9A,B7"; "" for none. $00-$01 (the 6510 port) can appear; no Claims line can name them |
521
+ | bound | string | may: a static walk of the ROM, an upper bound, written and checked by `scripts/kernal-zp-walk.ts`. must: what one call wrote in a VICE store trace (`scripts/kernal-zp-trace.ts`), a lower bound for that call |
522
+ | basis | string | where the set came from: "ROM walk from $FFD2, power-on vectors", or "VICE x64sc store trace, <the call>". A routine has one may edge and a must edge per traced call |
523
+
524
+ `c64_check_compatibility` reads the may edges: a technique that USES a
525
+ KernalRoutine beside a technique whose CLAIMS on `zero_page` share bytes
526
+ with that routine's may set is `kernal_clobbers_zp` (soft; "may", since
527
+ a given call need not reach every store the walk counts). Unlike the
528
+ unit rules it also runs inside one input's own chain, the technique
529
+ against itself and against its own prerequisites (`a` = `b` = the
530
+ input), since a KERNAL call clobbers the bytes whoever declared them.
531
+ `npm test`
532
+ fails when the page and the ROM walk disagree, or a must byte lies
533
+ outside the may set.
534
+
535
+ ### IN_REGION
536
+
537
+ Direction: `Register → MemoryRegion`, `KernalRoutine → MemoryRegion`
538
+
539
+ Meaning: "this address lies inside this memory-map region." Derived from
540
+ the numeric addresses after ingest; before this edge existed the 220
541
+ MemoryRegion nodes were all orphans.
542
+
543
+ ### OCCUPIES
544
+
545
+ Direction: `Recipe → MemoryRegion`
546
+
547
+ Meaning: "this recipe loads code or data into this region." Derived from
548
+ the listing's own load addresses (`* = $0900`, `#pragma region(...)`,
549
+ `.org`), not from prose.
550
+
551
+ ### FEATURES
552
+
553
+ Direction: `Archetype → Technique`
554
+
555
+ Meaning: "a game of this shape is built on this technique" —
556
+ `vertical_shmup` FEATURES `sprite_multiplex_game`, `text_adventure` FEATURES
557
+ `ram_under_kernal`. Authored with the `**Technique fingerprint:**` line
558
+ (`CONVENTIONS-archetypes.md`); both ends MATCHed, a name that matches no
559
+ Technique is warned about and counted in the ingest summary as
560
+ `archetype_features … dropped`. Read by `c64_game_briefing`, which forces
561
+ every target into the proposal for that archetype, exempt from the
562
+ per-category cap.
563
+
564
+ ### RISKS
565
+
566
+ Direction: `Archetype → Pitfall`
567
+
568
+ Meaning: "a game of this shape commonly meets this pitfall" —
569
+ `racing` RISKS `raster_line_count_difference`, `top_down_adventure` RISKS
570
+ `vic_bank_visibility_collision`. Authored with the `**Common pitfalls:**`
571
+ line; same MATCH-both discipline, misses counted as `archetype_risks …
572
+ dropped`. Read by `c64_game_briefing`, which adds each target to the
573
+ plan's pitfalls when no proposed technique already surfaced it. It is a
574
+ statement about the genre, not a trigger: TRIGGERED_BY still says which
575
+ technique's code the pitfall arises in.
576
+
577
+ ### SCAFFOLDS
578
+
579
+ Direction: `Recipe → Archetype`
580
+
581
+ Meaning: "this recipe is a complete starting point for a game of this
582
+ shape; copy it and change it, do not start from a blank file" —
583
+ `oscar64-simple-shmup` SCAFFOLDS `vertical_shmup`. Authored with the
584
+ `scaffolds:` key in the recipe's frontmatter (`CONVENTIONS-recipes.md`),
585
+ an array of Archetype names. Both ends MATCHed, never MERGEd: a name that
586
+ matches no Archetype is warned about and counted in the ingest summary as
587
+ `scaffolds … dropped`. Read by `c64_game_briefing`, whose first build
588
+ step for a resolved archetype lists the recipes that SCAFFOLD it and
589
+ names their pages (schema 23; before it the tool matched the string
590
+ "shmup" against the archetype name and offered one recipe by name).
591
+
592
+ ### VERIFIED_ON
593
+
594
+ Direction: `Recipe → MachineVariant`, properties `model` (the runs.json
595
+ word), `cycles`, `shot`, `flags`, `pinned`
596
+
597
+ Meaning: "`verify:recipes` runs this recipe on this variant and compares
598
+ its exit screenshot with the committed `shot` pixel for pixel." Built by
599
+ the ingest from `docs/recipes/runs.json`, the only file besides markdown it
600
+ reads, after pass 2; the old edges are deleted first, so the file owns
601
+ them. A recipe with no runs.json entry is run by `verify:recipes` on PAL at
602
+ 8,000,000 cycles, and gets that edge with `pinned` false. An edge is made
603
+ only when its screenshot is committed. runs.json `pal` maps to `c64c` (the
604
+ machine `x64sc -default` runs), `ntsc`, `oldntsc` and `drean` to the
605
+ variants of those names. Read by `c64_recipe_lookup` (`verified_on[]`) and
606
+ `c64_recipes_for` (`verified_on` filter) (schema 29).
607
+
608
+ ### COMPOSES
609
+
610
+ Direction: `GameDesign → Technique`, property `phase` ("play",
611
+ "transition" or "init")
612
+
613
+ Meaning: "this game runs this technique in this phase." Authored with
614
+ the `**Composes:**` line (`CONVENTIONS-game-designs.md`); `name (init)`
615
+ or `name (transition)` sets the phase, play when none is given. One edge
616
+ per phase, so a technique used at start-up and again at game over has
617
+ two. Both ends MATCHed; a miss is warned about and counted as `composes …
618
+ dropped`. Read by `c64_plan_budget`, which budgets each phase alone
619
+ (schema 28).
620
+
621
+ ### INSTANCE_OF
622
+
623
+ Direction: `GameDesign → Archetype`
624
+
625
+ Meaning: "this game is one of this shape." From `**Instance of:**`; MATCH
626
+ both, misses counted as `instance_of … dropped`. Read by
627
+ `c64_game_briefing`, which lists the designs of the archetype it
628
+ resolved (schema 28).
629
+
630
+ ### REALISED_BY
631
+
632
+ Direction: `GameDesign → Recipe`
633
+
634
+ Meaning: "this recipe builds the design; its measured frame came from
635
+ this listing." From `**Realised by:**`; MATCH both, misses counted as
636
+ `realised_by … dropped` (schema 28).
637
+
638
+ ---
639
+
640
+ ## Schema state
641
+
642
+ `ensureSchema()` creates a range index and a unique constraint on the
643
+ primary key of every node label (16) and seeds:
644
+ - 5 `Chip` nodes (VIC-II, SID, CIA1, CIA2, 6510)
645
+ - 2 `Region` nodes (PAL, NTSC)
646
+ - the `HardwareUnit` nodes listed under HardwareUnit, each BELONGS_TO its chip
647
+ - 7 `MachineVariant` nodes (schema 29)
648
+
649
+ Everything else is produced by `npm run ingest` from `docs/`. Of the
650
+ edge types defined here, one is populated by nothing: `BUILDS_ON`, which
651
+ no page asserts and no tool reads (its fate is issue #17). `REQUIRES_TOOL`
652
+ was in that state until data 713, when the recipe-to-tool link the
653
+ ingester had been writing as `USES` was given its ontology name.
654
+ `npx c64-kb health` prints the live node and edge figures; they are not
655
+ repeated here because they change with every docs commit.