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,158 @@
1
+ # Archetype Reference Conventions
2
+
3
+ Archetype docs describe the shapes a C64 game or demo takes: the vertical
4
+ shooter, the single-screen platformer, the text adventure, the crack
5
+ intro. Today there are two: `docs/game-design/c64-game-archetypes.md`
6
+ for kind `game` and `docs/demo-design/intro-cracktro-patterns.md` for
7
+ kind `demo`. Each H2 in them is one `Archetype` node, and two lines under
8
+ the H2 become its edges: the technique fingerprint (`FEATURES`, Archetype
9
+ to Technique) and the common pitfalls (`RISKS`, Archetype to Pitfall).
10
+ `c64_game_briefing` and `c64_demo_briefing` read both.
11
+
12
+ The marker `<!-- doc-type: archetype-reference -->` MUST appear in the
13
+ first 10 lines for the extractor to process the file.
14
+
15
+ ## File-level frontmatter
16
+
17
+ ```yaml
18
+ ---
19
+ kind: game # game | demo; optional, defaults to game
20
+ ---
21
+ ```
22
+
23
+ `kind` applies to every archetype in the file. Any other word refuses the
24
+ whole file with a warning, the way an unknown technique category does.
25
+
26
+ `kind: demo` is the demo forms: the source is
27
+ `docs/demo-design/intro-cracktro-patterns.md`, whose crack intro, demo
28
+ intro, pack intro, dentro and 4K party intro are each one `Archetype`
29
+ node. A form is the node; the parts a multi-part production is cut into
30
+ are not a node type, and a page must not try to make them one. The entry
31
+ format, the edge lines and the ingest counts are the same as for games,
32
+ and `c64_demo_briefing` with `archetype` reads the node exactly as
33
+ `c64_game_briefing` does. Archetype names are unique across every
34
+ archetype page, not just within one: the ingest merges the node on its
35
+ name alone, so a name repeated on a second page overwrites the first
36
+ page's node (its kind, title and source) and both pages' edges land on
37
+ the one node. The extractor only refuses a repeat within a single file.
38
+ `archetype_not_found` lists the names of both kinds.
39
+
40
+ ## Archetype entries
41
+
42
+ The H2 is the human-readable title, free-form, and is NOT the node name.
43
+ Technique and pitfall H2s carry `## name — Title`; archetype titles have
44
+ slashes and hyphens in them ("Text Adventure / Parser-Driven",
45
+ "Beat-em-up"), so the name is a separate line instead. The first line
46
+ after the H2 is:
47
+
48
+ ```
49
+ ## Vertical Shmup
50
+
51
+ **Archetype:** `vertical_shmup`
52
+ ```
53
+
54
+ - `vertical_shmup` is the snake_case node name (`Archetype.name`), unique
55
+ in the file. Backticks are optional.
56
+ - An H2 with no `**Archetype:**` line is not an archetype: it is warned
57
+ about and skipped, so a prose section cannot become a node by accident.
58
+ - A second H2 with the same name is warned about and skipped.
59
+
60
+ Two more lines under the H2 are the edge sources. Both existed on the page
61
+ before the graph read them; the format did not change.
62
+
63
+ ```
64
+ **Technique fingerprint:** `soft_scroll_v`, `sprite_multiplex_24`, `stable_raster_irq`
65
+ **Common pitfalls:** `sprite_dma_overflow`, `badline_cycle_loss`
66
+ ```
67
+
68
+ - Comma-separated, backticks optional. Each word must be a snake_case
69
+ name. A word that is not one is refused at extract time with a warning
70
+ and never reaches the graph.
71
+ - `**Technique fingerprint:**` makes one `FEATURES` edge per word to the
72
+ `Technique` of that name. `**Common pitfalls:**` makes one `RISKS` edge
73
+ per word to the `Pitfall` of that name.
74
+ - Both ends are MATCHed, never MERGEd. A name that matches no node is
75
+ dropped at link time with a `[falkor]` warning and counted in the ingest
76
+ summary (`archetype_features: … dropped`, `archetype_risks: … dropped`),
77
+ beside `triggered_by` and `mitigated_by`. It is never silently dropped
78
+ and it never creates a stub node. Fix the page, do not ignore the count.
79
+ - Only name a technique the archetype's own prose supports. The
80
+ fingerprint is what `c64_game_briefing` forces into a plan for that
81
+ archetype, so a name here is a claim that every such game needs it.
82
+
83
+ One more line routes a brief that names no archetype (schema 30):
84
+
85
+ ```
86
+ **Brief words:** vertical shooter, vertically scrolling, road shooter, road, car, spy hunter
87
+ ```
88
+
89
+ - Comma-separated words or phrases, backticks optional. The extractor
90
+ lowers the case, drops apostrophes and reads any other run of
91
+ non-letters and non-digits as one space, so "Beat-'em-up" is stored as
92
+ `beat em up`. It becomes the `brief_words` property of the node, not an
93
+ edge; an entry with no line stores an empty list.
94
+ - Only kind `game` is routed. `c64_game_briefing` with no `archetype`
95
+ normalises the brief the same way and counts, per archetype, the
96
+ distinct words it contains, a plural "s" or "es" allowed. The archetype
97
+ with the most wins; a tie or no match routes nowhere.
98
+ - Choose words that name the genre, not a technique. A word on two
99
+ entries cancels itself out ("puzzle" is on `puzzle` and `action_puzzle`,
100
+ so "Boulder Dash puzzle" still routes by "boulder dash"). A word that
101
+ every brief carries ("game", "screen", "columns") routes everything.
102
+ - The line is how a genre reaches its archetype. It is data here, so no
103
+ genre word or game title is spelled in the briefing code.
104
+
105
+ One more optional line names the playable starter for the archetype
106
+ (schema 31):
107
+
108
+ ```
109
+ **Starter:** `shmup-vertical`
110
+ ```
111
+
112
+ - The word is a directory in `templates/` (lower case, digits, hyphens).
113
+ It becomes the Archetype's `starter` property, and `c64_game_briefing`
114
+ or `c64_demo_briefing` returns it in `archetype.starter` and tells the
115
+ agent to run `npm run new-project -- <starter> <dir>` in this checkout.
116
+ - The extractor does not read the tree. `test/extract-archetype-starters.test.ts`
117
+ fails when a starter named on a real page has no `Makefile` and
118
+ `expect.json` in `templates/`.
119
+ - Name a starter only where it is a game or effect of that archetype.
120
+ An archetype with no fitting starter carries no line.
121
+
122
+ The other lines on the page (`**Reference titles:**`, `**Modern
123
+ examples:**`) are prose for the reader and are not read by the extractor.
124
+
125
+ ## What the briefing does with it
126
+
127
+ `c64_game_briefing` with `archetype: "vertical_shmup"` (also accepted:
128
+ "Vertical Shmup", "vertical-shmup") looks the node up. Its `FEATURES`
129
+ targets are proposed regardless of the keyword scorer's verdict and are
130
+ exempt from the three-per-category cap; its `RISKS` targets are added to
131
+ the pitfalls when no proposed technique already surfaced them; its title
132
+ is appended to the search text. The output repeats what the graph held
133
+ in an `archetype` field.
134
+
135
+ With no `archetype`, `c64_game_briefing` routes the brief by the brief
136
+ words above and does the same with the winner; the output's
137
+ `archetype.inferred_from` lists the words that chose it, and the text
138
+ says so. A named `archetype` always wins over the words.
139
+
140
+ A name the graph does not have returns `archetype_not_found` with the
141
+ known names and builds the rest of the plan from the description alone.
142
+ The briefing does not guess a near match. Only a graph with no
143
+ `Archetype` nodes at all falls back to a small built-in table; with this
144
+ page ingested, the page is the source of truth.
145
+
146
+ ## Section structure inside an Archetype
147
+
148
+ After the H2 and the `**Archetype:**` line, free-form prose covering:
149
+
150
+ 1. **What it is** — the defining mechanic and the scene tradition
151
+ 2. **Where the budget goes** — the technical constraint that shapes it
152
+ 3. **How the pieces fit** — sprites, scroll, SID, loading, in plain terms
153
+ 4. The `**Technique fingerprint:**`, `**Common pitfalls:**` and
154
+ `**Brief words:**` lines
155
+ 5. `**Reference titles:**` and `**Modern examples:**`
156
+
157
+ H3 inside an archetype is fine; the extractor reads only the H2 and the
158
+ five bold lines (`**Brief words:**` and `**Starter:**` are optional).
@@ -0,0 +1,46 @@
1
+ # Failure Pattern Reference Conventions
2
+
3
+ Failure-pattern docs live in `docs/c64-failure-patterns.md` (single
4
+ file). Each entry is one CrashPattern node, keyed by `symptom`.
5
+
6
+ The marker `<!-- doc-type: failure-reference -->` MUST appear in the
7
+ first 10 lines for the extractor to process the file.
8
+
9
+ ## CrashPattern entries
10
+
11
+ Every CrashPattern in the doc gets an H2 in this exact format:
12
+
13
+ ```
14
+ ## black_screen — Display goes solid color or stays $00
15
+ ```
16
+
17
+ Breakdown:
18
+ - `## ` (H2)
19
+ - `black_screen` — snake_case symptom canonical name
20
+ - ` — ` — em-dash separator
21
+ - Free-form one-line description
22
+
23
+ Following each H2 block:
24
+
25
+ ```
26
+ **Likely causes:** vic_bank_misconfigured, screen_pointer_outside_bank, di_d011_blanked
27
+ **Diagnosis steps:** Check $D018 video matrix pointer; verify $DD00 VIC bank bits; inspect $D011 bit 4 (blank).
28
+ **Caused by registers:** D011, D018, DD00
29
+ **Caused by kernal:** SCREEN
30
+ **Caused by techniques:** vic_bank_select
31
+ ```
32
+
33
+ `Likely causes` is a comma-separated list of free-form cause tags
34
+ (short snake_case strings). Stored as a JSON-encoded array on the
35
+ node. NOT graph edges — graph edges go through the `Caused by …`
36
+ lines.
37
+
38
+ `Caused by …` lines emit CAUSED_BY edges, same structure as Pitfall's
39
+ TRIGGERED_BY.
40
+
41
+ ## Section structure inside a CrashPattern
42
+
43
+ 1. **Visible/audible symptom** (1–2 sentences, vivid)
44
+ 2. **Likely causes** (parallel to the metadata list, expanded)
45
+ 3. **Diagnosis steps** (numbered, concrete — what to inspect in vice-mcp)
46
+ 4. **Common fixes** (1–3 paragraphs)
@@ -0,0 +1,75 @@
1
+ # Game Design Conventions
2
+
3
+ A game design page describes one whole game: which archetype it is, which
4
+ recipe builds it, which techniques it runs in each phase, and, once the
5
+ built game has been timed, what its frame took. Each H2 is one
6
+ `GameDesign` node (schema 28). `c64_plan_budget` takes a design name and
7
+ budgets its phases; `c64_game_briefing` lists the designs of the archetype
8
+ it resolved.
9
+
10
+ Pages live in `docs/game-design/designs/`, one design per file. The marker
11
+ `<!-- doc-type: game-design -->` MUST appear in the first 10 lines.
12
+
13
+ ## The lines under each H2
14
+
15
+ ```
16
+ ## Single-screen platformer scaffold (Oscar64)
17
+
18
+ **Game design:** `platformer_scaffold_oscar64`
19
+ **Instance of:** single_screen_platformer
20
+ **Realised by:** oscar64-platformer-scaffold
21
+ **Region:** both
22
+ **Composes:** tile_map_render (init), decimal_print, lfsr_random (init), kernal_file_write_seq (transition)
23
+ **Measured frame:** play pal worst=8693 typical=4966; play ntsc worst=10287 typical=6628 (measured-vice, CIA1 timer B around the loop body, recipes/oscar64/platformer-scaffold.md "Expected output")
24
+ ```
25
+
26
+ | Line | Required | Becomes |
27
+ |---|---|---|
28
+ | `**Game design:**` | yes | the node's `name`, snake_case. Without it the H2 is prose and is not ingested; with a `**Composes:**` line but no name, the extractor warns. |
29
+ | `**Instance of:**` | no | `INSTANCE_OF` edges to Archetype names from `c64-game-archetypes.md`. |
30
+ | `**Realised by:**` | no | `REALISED_BY` edges to canonical recipe names (`<toolchain>-<recipe>`). |
31
+ | `**Region:**` | no | `PAL`, `NTSC` or `both`: the region the budget uses when the caller names none. |
32
+ | `**Composes:**` | yes | `COMPOSES` edges, one per technique and phase. |
33
+ | `**Measured frame:**` | no | the node's `measured` property. More than one line is allowed. |
34
+
35
+ Every name is MATCHed at ingest, never created. A name that matches no
36
+ node is warned about and counted in the ingest summary as dropped.
37
+
38
+ ## Composes
39
+
40
+ A comma-separated list of Technique names. A name alone runs in `play`,
41
+ the frame loop. `name (init)` runs once before play; `name (transition)`
42
+ runs between plays (a level load, a game-over save). A technique used in
43
+ two phases is listed twice, once per phase. Any other phase word is
44
+ refused with a warning.
45
+
46
+ List what the listing runs, not what the recipe's frontmatter says. Read
47
+ the frame loop. When the two differ, fix the frontmatter or say why in the
48
+ page's prose.
49
+
50
+ ## Measured frame
51
+
52
+ `<phase> <pal|ntsc> worst=N [typical=N]`, entries separated by `;`, then
53
+ a parenthetical: the basis word first (`measured-vice`, `derived-listing`,
54
+ `arithmetic`, `estimated`), then the instrument and where the figures are.
55
+ A malformed line is refused whole, because part of it would read as the
56
+ whole measurement.
57
+
58
+ - `worst` is the largest frame the run recorded, in CPU cycles.
59
+ - `typical` is a common frame. Say in prose what it is: a mean, or one
60
+ frame's reading.
61
+ - State what the timed region holds. A figure that leaves out the HUD, the
62
+ IRQ or the badline stalls says so in prose under the lines.
63
+ - Figures come from the realising recipe's page, with its rung. A figure
64
+ this repo did not measure is `estimated` and names its source.
65
+
66
+ `c64_plan_budget` prints each measured figure beside its prediction for
67
+ the same phase and region. The two answer different questions: the
68
+ prediction adds up each technique's own recipe; the measurement is this
69
+ game's listing.
70
+
71
+ ## What is not here
72
+
73
+ No claims, zero page or memory lines yet: those are per-technique
74
+ (`CONVENTIONS-techniques.md`) and per-recipe. `c64_check_compatibility`
75
+ takes the technique list.
@@ -0,0 +1,184 @@
1
+ # Hardware Reference Conventions
2
+
3
+ All hardware reference docs in `docs/` follow these structural patterns so
4
+ the entity extractor in `src/graph/extract.ts` can parse them. Deviation
5
+ breaks the graph build.
6
+
7
+ ## File-level frontmatter (optional)
8
+
9
+ ```yaml
10
+ ---
11
+ chip: VIC-II # for chip refs only
12
+ region: PAL # for region-specific docs only
13
+ ---
14
+ ```
15
+
16
+ ## Section structure
17
+
18
+ Top of file: `# Doc Title` (H1). One H1 per doc.
19
+
20
+ Followed by an "Overview" section (H2) describing what's covered.
21
+
22
+ Followed by a "Quick reference" section (H2) with tables.
23
+
24
+ Followed by detail sections (H2 per topic, H3 per item).
25
+
26
+ Followed by a "Pitfalls" cross-reference section (H2) at end.
27
+
28
+ ## Register definitions
29
+
30
+ Every register gets an H3 in this exact format:
31
+
32
+ ```
33
+ ### $D011 — D011 — Screen Control Register 1 (RW)
34
+ ```
35
+
36
+ Breakdown:
37
+ - `### ` (H3) at start of line
38
+ - ` $D011 ` — hex address, dollar-prefix, 4 hex digits, surrounded by spaces
39
+ - ` — ` — em-dash separator (Unicode U+2014)
40
+ - `D011` — canonical register name (no spaces; uppercase letters + digits)
41
+ - ` — ` — em-dash separator
42
+ - `Screen Control Register 1` — description (free-form)
43
+ - ` (` — opening paren
44
+ - `RW` — one of `R`, `W`, or `RW`
45
+ - `)` — closing paren
46
+
47
+ Following each register H3 block, an optional `**Chip:** VIC-II` line
48
+ identifies the owning chip. If absent, the extractor falls back to the
49
+ doc's frontmatter `chip` field.
50
+
51
+ Bit definitions use a sub-H4 or a table. Example:
52
+
53
+ ```
54
+ ### $D011 — D011 — Screen Control Register 1 (RW)
55
+
56
+ **Chip:** VIC-II
57
+
58
+ | Bit | Name | Description |
59
+ |-----|------|-------------|
60
+ | 7 | RST8 | Bit 8 of raster line |
61
+ | 6 | ECM | Extended color mode |
62
+ | 5 | BMM | Bitmap mode |
63
+ ```
64
+
65
+ ## KERNAL routine definitions
66
+
67
+ Every KERNAL routine gets an H3 in this exact format:
68
+
69
+ ```
70
+ ### $FFD2 — CHROUT — Output a character
71
+ ```
72
+
73
+ Breakdown:
74
+ - `### ` (H3) at start of line
75
+ - ` $FFD2 ` — hex address (jump-table entry), 4 hex digits
76
+ - ` — ` — em-dash separator
77
+ - `CHROUT` — canonical routine name (uppercase letters)
78
+ - ` — ` — em-dash separator
79
+ - description
80
+
81
+ Following each routine H3, optional structured fields:
82
+
83
+ ```
84
+ **Input:** A = byte to print
85
+ **Output:** None
86
+ **Affects:** A
87
+ **Pairs with:** CHROUT
88
+ **Description:** ...
89
+ ```
90
+
91
+ The `**Pairs with:**` marker is what `PAIRS_WITH` graph edges are extracted from.
92
+ Multiple pair names are comma-separated.
93
+
94
+ After `**Affects:**`, one or more `**Clobbers zero page:**` lines (schema
95
+ 26) state the zero-page bytes the routine writes. Each becomes a
96
+ `CLOBBERS_ZP` edge to the `zero_page` HardwareUnit:
97
+
98
+ ```
99
+ **Clobbers zero page:** $B8-$BA (may; ROM walk from $FFBA, power-on vectors)
100
+ **Clobbers zero page:** $B8-$BA (must; VICE x64sc store trace, SETLFS 2,8,2)
101
+ ```
102
+
103
+ - The value is `<bytes> (<bound>; <basis>)`. Bytes are `$XX` or
104
+ `$XX-$YY`, comma-separated, anywhere in `$00-$FF`, or `none`.
105
+ - `may` lines are not hand-written. `node scripts/kernal-zp-walk.ts
106
+ --write` sets one per routine from a static walk of the 901227-03 ROM;
107
+ `npm test` runs its `--check` and fails on any difference.
108
+ - `must` lines come from `node scripts/kernal-zp-trace.ts --write`, which
109
+ runs `scripts/kernal-zp-trace.asm` in VICE with a store trace. The basis
110
+ names the traced call. Every must byte has to lie inside the may set.
111
+ - A line that does not parse is warned about at ingest and dropped.
112
+
113
+ ## Memory region definitions
114
+
115
+ Every memory region gets an H3 in this exact format:
116
+
117
+ ```
118
+ ### $0400-$07FF — Default Screen RAM
119
+ ```
120
+
121
+ Breakdown:
122
+ - `### ` (H3) at start of line
123
+ - ` $START-$END ` — start/end hex addresses, 4 hex digits each, separated by `-`
124
+ - ` — ` — em-dash separator
125
+ - description
126
+
127
+ Following each H3, optional structured fields:
128
+
129
+ ```
130
+ **Default use:** Screen character codes (40x25 = 1000 bytes)
131
+ **Bank-switchable:** No
132
+ **Notes:** ...
133
+ ```
134
+
135
+ ## Opcode definitions (for 6510-cpu-reference.md and 6502-illegal-opcodes.md)
136
+
137
+ Every opcode gets an H3 in this exact format:
138
+
139
+ ```
140
+ ### $A9 — LDA #imm — Load Accumulator immediate
141
+ ```
142
+
143
+ Breakdown:
144
+ - `### ` (H3) at start of line
145
+ - ` $A9 ` — opcode byte, 2 hex digits
146
+ - ` — ` — em-dash separator
147
+ - `LDA #imm` — mnemonic with addressing mode
148
+ - ` — ` — em-dash separator
149
+ - description
150
+
151
+ Following each opcode H3:
152
+
153
+ ```
154
+ **Cycles:** 2
155
+ **Flags:** N Z
156
+ **Legal:** yes (or "no" for illegal opcodes — defaults to yes if absent)
157
+ **Page-cross:** +1 (or absent if no page-cross penalty)
158
+ ```
159
+
160
+ ## Pitfalls cross-reference
161
+
162
+ End-of-doc H2 `## Pitfalls` with bullet list:
163
+
164
+ ```
165
+ ## Pitfalls
166
+
167
+ - **$D012 raster wrap**: comparing $D012 against >=256 requires combining
168
+ with $D011 bit 7 — see `d012_wrap_around` in
169
+ [pitfalls/raster-and-badline.md](pitfalls/raster-and-badline.md).
170
+ - ...
171
+ ```
172
+
173
+ ## Cross-references between docs
174
+
175
+ Use relative markdown links: `[VIC-II screen mode](vic-ii-reference.md#screen-modes)`.
176
+
177
+ ## File-end checklist
178
+
179
+ Every hardware reference doc must end with this comment so the extractor
180
+ can quickly verify it's a hardware-reference doc:
181
+
182
+ ```
183
+ <!-- doc-type: hardware-reference -->
184
+ ```
@@ -0,0 +1,91 @@
1
+ # Pitfall Reference Conventions
2
+
3
+ Pitfall docs live in `docs/pitfalls/<category>.md`. Each doc covers ONE
4
+ category (raster, sprite, sid, region, kernal, banking, cpu, loader,
5
+ input, render, scroll, cia, maths, logic) and contains multiple Pitfall
6
+ entries as H2 sections. The extractor parses each H2 as one Pitfall
7
+ node. The category is carried into the node as written; the extractor
8
+ keeps no whitelist, so this list is the set in use, not a constraint it
9
+ enforces (it read eight names until 2026-09-22 while twelve docs
10
+ existed; maths and logic were added on 2026-09-23 when their pages
11
+ were created). A new category is allowed when no existing page's
12
+ intro covers the fault: copy the marker and front matter from the
13
+ newest page and add the name here.
14
+
15
+ The marker `<!-- doc-type: pitfall-reference -->` MUST appear in the
16
+ first 10 lines for the extractor to process the file.
17
+
18
+ ## File-level frontmatter
19
+
20
+ ```yaml
21
+ ---
22
+ category: raster # raster | sprite | sid | region | kernal | banking | cpu | loader | input | render | scroll | cia | maths | logic
23
+ ---
24
+ ```
25
+
26
+ ## Pitfall entries
27
+
28
+ Every Pitfall in the doc gets an H2 in this exact format:
29
+
30
+ ```
31
+ ## badline_cycle_loss — Badline DMA steals 40-43 cycles from the CPU
32
+ ```
33
+
34
+ Breakdown:
35
+ - `## ` (H2)
36
+ - `badline_cycle_loss` — snake_case canonical name (matches ontology Pitfall.title surrogate; the extractor uses the snake_case form as the node primary key and the prose form as the human-readable title)
37
+ - ` — ` — em-dash separator (Unicode U+2014)
38
+ - Free-form one-line title
39
+
40
+ Following each Pitfall H2 block:
41
+
42
+ ```
43
+ **Severity:** critical # critical | high | medium | low
44
+ **Region:** both # PAL | NTSC | both (use 'both' if the pitfall manifests in either region)
45
+ **Triggered by registers:** D011, D012
46
+ **Triggered by kernal:** CHKIN
47
+ **Triggered by techniques:** stable_raster_irq, sprite_multiplex_8
48
+ ```
49
+
50
+ All `Triggered by …` lines are optional and additive — the extractor emits one TRIGGERED_BY edge per item. At least ONE Triggered-by line must be present (otherwise the pitfall has no graph anchor and won't surface through `c64_pitfalls_for`). The other direction matters too: a technique no pitfall names cannot reach any pitfall through the graph, and `c64_pitfalls_for` falls back to a semantic guess for it. `npm run check:pitfall-anchors` lists those techniques and fails on a name that matches no Technique H2; when you add a technique, add it to the Triggered-by line of every pitfall whose mechanism its code meets.
51
+
52
+ After the `Triggered by …` lines, one optional additive line names the
53
+ technique(s) whose application is the Fix section's remedy:
54
+
55
+ ```
56
+ **Mitigated by techniques:** double_irq
57
+ ```
58
+
59
+ Comma-separated existing Technique names; the extractor emits one
60
+ MITIGATED_BY edge per item, Pitfall to Technique, and nothing else — a
61
+ register or KERNAL routine is never a remedy in this sense. The line
62
+ separates two relations one vocabulary used to carry: the technique in
63
+ whose code the pitfall arises (Triggered by) and the technique that cures
64
+ it (Mitigated by). A technique on the Mitigated-by line may also be on
65
+ the Triggered-by line when the pitfall arises inside a naive version of
66
+ the technique and a correct version cures it — `sprite_dma_overflow` and
67
+ `sprite_multiplex_8`, `raster_irq_first_line_jitter` and
68
+ `stable_raster_irq`, `jmp_indirect_page_boundary_bug` and
69
+ `jump_table_dispatch`, three of the six pitfalls that carry the line — and
70
+ Mechanism should say so; otherwise a technique is on one line or the
71
+ other. If the remedy is not a Technique node — the SID hard restart
72
+ lives in `hardware/sid-reference.md`, "take `$0318`" in
73
+ `restore_nmi_not_maskable` is a handler, not a technique — write nothing;
74
+ do not invent a technique to have something to point at. A name that
75
+ matches no Technique node is dropped at link time with a warning and
76
+ counted in the ingest summary beside triggered_by. `c64_pitfalls_for`
77
+ returns a pitfall for its remedy technique as well as for its triggers,
78
+ with the two lists kept apart; `c64_technique_lookup` lists the pitfalls a
79
+ technique mitigates.
80
+
81
+ ## Section structure inside a Pitfall
82
+
83
+ After the H2 + metadata lines, free-form prose covering:
84
+
85
+ 1. **Symptom** — what the developer sees when this bites
86
+ 2. **Mechanism** — what's actually happening at the hardware level
87
+ 3. **Fix** — concrete code/timing change
88
+ 4. **Worked example** — short asm or C snippet showing both the bad pattern and the fix
89
+ 5. **Cross-references** — related techniques, registers, recipes
90
+
91
+ A pitfall whose bad pattern can be recognised in source text may also have a lint rule, named after the pitfall and pointing at its page; the rules live in `src/tools/lint.ts` and are served as `c64_lint_source` (CLI `lint <file>`). Nothing on the page declares the rule, and a pitfall without one is the common case.
@@ -0,0 +1,106 @@
1
+ # Recipe Conventions
2
+
3
+ Recipes live in `docs/recipes/<toolchain>/<recipe-name>.md`. Each recipe is a
4
+ complete, buildable example with source, build command, expected output, and a
5
+ description of why it's done this way. The same conceptual demo MAY have one
6
+ recipe per toolchain (e.g. `oscar64/raster-bars.md`, `kickassembler/raster-bars.md`)
7
+ — they are distinct Recipe nodes IMPLEMENTS-edged to the same Technique.
8
+
9
+ The marker `<!-- doc-type: recipe -->` MUST appear immediately after the
10
+ frontmatter — line 12 of every recipe, after the ten frontmatter lines and
11
+ one blank; the extractor matches it anywhere in the file. An earlier
12
+ version of this line said "in the first 10 lines", which no recipe
13
+ satisfied.
14
+
15
+ ## File-level frontmatter (required)
16
+
17
+ ```yaml
18
+ ---
19
+ recipe: hello-world # short identifier, lowercase, hyphen-separated
20
+ toolchain: oscar64 # canonical toolchain name (matches a Tool node; becomes a REQUIRES_TOOL edge)
21
+ output_format: PRG # one of PRG, CRT, BIN, D64
22
+ region: both # pal | ntsc | both
23
+ techniques: [] # array of Technique names this recipe implements (Phase 2: empty for hello-worlds)
24
+ file_formats: [PRG] # FileFormat nodes this recipe produces
25
+ uses_registers: [] # array of Register canonical names referenced
26
+ uses_kernal: [CHROUT] # array of KernalRoutine names called
27
+ scaffolds: [] # optional: Archetype names this recipe is a starting point for
28
+ ---
29
+ ```
30
+
31
+ `recipe`, `toolchain`, `output_format`, and `region` are required. The rest may be
32
+ empty arrays but the keys must be present.
33
+
34
+ `scaffolds` is the exception: it is optional, and absent reads as empty.
35
+ Set it only on a recipe that is a whole playable game an agent should copy
36
+ and change rather than start from nothing, such as `simple-shmup`. Each
37
+ entry must be the `name` of an Archetype on an archetype page
38
+ (`CONVENTIONS-archetypes.md`); the ingest links `Recipe -[:SCAFFOLDS]->
39
+ Archetype`, drops a name that matches no Archetype with a warning, and
40
+ `c64_game_briefing` offers the recipe as the first build step for that
41
+ archetype.
42
+
43
+ ## Section structure
44
+
45
+ After the frontmatter:
46
+
47
+ 1. `# <Human-readable title>` (H1, exactly one)
48
+ 2. `## Synopsis` — one paragraph: what this recipe demonstrates and when to use it
49
+ 3. `## Source` — a single fenced code block with the complete source listing
50
+ 4. `## Build` — the exact shell command(s) to produce the artifact
51
+ 5. `## Expected output` — what you should see on screen / in the .prg
52
+ 6. `## Why this works` — one to three paragraphs walking through the load-bearing
53
+ lines, calling out chip-specific quirks or toolchain idioms
54
+
55
+ Recipes are atomic — no "and another variation". Variations are separate recipes.
56
+
57
+ ## Naming
58
+
59
+ The filename matches the `recipe:` frontmatter value. Directory matches `toolchain:`.
60
+ `oscar64/hello-world.md` produces a Recipe node with `name: oscar64-hello-world`
61
+ (directory and basename joined with `-`).
62
+
63
+ ## Verification (required)
64
+
65
+ A recipe page is not done when it reads well. Before it lands:
66
+
67
+ 1. The listing is extracted from the page and built with the toolchain the
68
+ page names — `npm run check:listings` does exactly that and is run by
69
+ `npm test`. A listing that does not build does not land.
70
+ 2. For anything that draws, the PRG is run headless in VICE with the
71
+ pinned command (`x64sc -default -warp +sound +autostart-delay-random
72
+ -autostartprgmode 1 -limitcycles N [-model ntsc] -exitscreenshot
73
+ out.png -autostart recipe.prg`) and the screenshot is measured against
74
+ the "Expected output" section; the PNG goes in
75
+ `recipes/<toolchain>/screenshots/<recipe>.png` and the page names it.
76
+ The cycle count, models, extra flags and any fresh disk are pinned per
77
+ recipe in `recipes/runs.json`, and `npm run verify:recipes` re-runs
78
+ every recipe from that manifest and fails on a pixel that differs from
79
+ the committed PNG. A recipe whose listing builds a cartridge instead of
80
+ a PRG is pinned with a `"cartridge"` key: `{"file": "x.crt", "write":
81
+ true, "runs": 2}`. The verifier takes `x.crt` from the build's work
82
+ directory (a KickAssembler listing writes it with `outBin`), boots a
83
+ fresh copy of it per model with `-cartcrt` in place of `-autostart`,
84
+ adds `-easyflashcrtwrite` when `write` is true so VICE saves the flash
85
+ back into the copy, and boots that copy `runs` times in sequence. Run 1
86
+ is shot key `pal`; run N is `pal-runN`, default path
87
+ `screenshots/<recipe>[-<model>]-runN.png`. The pixel geometry, the
88
+ palette RGB values per model and a decode snippet are in `runtime/vice-reference.md`, section
89
+ "Reading the exit screenshot"; a program that reports its own verdict
90
+ through a result byte and the border colour, with a harness that turns
91
+ it into a shell exit code, is the section "Verifying a run without a
92
+ human" on the same page and the two `headless-verify` recipes.
93
+ A recipe the verifier cannot run because it needs an input the harness
94
+ has no key for (a TAP on the datasette, a prepared disk image, a key
95
+ press) is listed in `runs.json` with a `"skip"` key whose value says why;
96
+ the verifier reports it as skipped rather than failed, the listing gate
97
+ still builds its Source listing, the page keeps its own pictures under
98
+ `figures/` with the exact command that made them, and its "Expected
99
+ output" says it is not pinned.
100
+ 3. Any timing constant that was found by trying values (a sync padding, a
101
+ line padding) is labelled as measured in VICE, with what the picture
102
+ looks like when it is off by one. VICE is the instrument; the pages do
103
+ not claim bench measurements.
104
+ 4. If the page corrects an earlier version, it says what was wrong. That
105
+ history is worth more to the next reader than a clean surface.
106
+