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,349 @@
1
+ <!-- doc-type: reference -->
2
+
3
+ # Demo Composition
4
+
5
+ How a multi-part C64 demo is put together: what one part owes the next, how a
6
+ part ends, how long anything is allowed to run, how the music survives the
7
+ joins, and in what order the work gets done. These are design patterns, not
8
+ techniques. Each one names the techniques and recipes that realise it; the
9
+ mechanics live on those pages. `./demo-design-philosophy.md` covers why demos
10
+ exist and the lifecycle of a release; this page starts where a group has parts
11
+ on disk and has to make a demo out of them.
12
+
13
+ No archetype covers a full multi-part demo; the nearest are `demo_intro` and
14
+ `dentro`, and `party_intro_4k` inherits the same rules at a smaller scale.
15
+ Sources are named in prose. Nothing here was measured on this machine unless a
16
+ sentence says which repo page did.
17
+
18
+ ---
19
+
20
+ ## part_lifecycle — What one part owes the next
21
+
22
+ **Kind:** structure
23
+ **Applies to:** demo_intro, dentro, party_intro_4k
24
+ **Realised by:** irq_chain_table, stable_raster_irq, multi_load_sequencing, sparkle_irq_loader, krill_loader_integration, vic_bank_select, memory_layout_plan, sid_play_routine_pattern, irq-chain, memory-layout, sid-music-player
25
+ **Sources:** Linus Åkesson, Spindle v2 documentation (2015); Raistlin, Stopping Music Popping (2023)
26
+
27
+ **Checks:**
28
+ - Every part writes $D011, $D012, $D015, $D016, $D018 and $DD02 before its first frame is shown.
29
+ - No part writes $DD00 when it runs under a loader that owns that register.
30
+ - After a part's clean-up returns, the IRQ vector points at a handler the next part installed, not at a handler in memory the next part has loaded over.
31
+ - The music play routine is entered exactly once per frame during a part's preparation and fade-out.
32
+ - No load in the disk image overlaps a page range the next part declares inherited.
33
+
34
+ **Why.** A part written on its own assumes a clean machine. A part in a demo
35
+ follows another part, and inherits whatever that part left in the VIC, the
36
+ SID, the interrupt vector and RAM. Åkesson's Spindle documentation makes the
37
+ contract explicit because the loader runs between parts and needs to know what
38
+ each one touches. The same contract holds with any loader, or with none.
39
+
40
+ **The shape.** Åkesson divides a part into six routines that the framework
41
+ calls in order. In this page's words:
42
+
43
+ ```
44
+ stage runs with IRQs job
45
+ prepare enabled build tables and speedcode, copy data; no VIC writes
46
+ set up disabled write the VIC registers and colour RAM; fast
47
+ interrupt (is the IRQ) the effect's per-frame work; vector at $FFFE
48
+ main enabled framebuffer effects that do not reach full frame rate
49
+ fade out enabled raise a flag the effect reads; return "done" when the fade has finished
50
+ clean up enabled tear down: stop interrupts, wait for a chosen raster line
51
+ ```
52
+
53
+ Preparation of the next part overlaps the current part's run, which is why
54
+ prepare may not write VIC registers: the screen still belongs to the part on
55
+ display. The next part's remaining data finishes loading after fade out
56
+ reports done and before clean up is called (Åkesson).
57
+
58
+ What a part hands back is what it owned: the interrupt vector, the six VIC
59
+ registers in the first check, the sprite enable bits, the SID registers its
60
+ effects wrote, and any memory it did not declare as inherited. Åkesson lists
61
+ the registers to re-initialise because the previous part may leave unexpected
62
+ values in them; that is the pattern.
63
+
64
+ **Memory inheritance.** Two adjacent parts may not overlap in RAM unless the
65
+ second declares that it inherits a page range from the first. Åkesson's linker
66
+ inserts a filler part when two neighbours collide: a black screen with no
67
+ badlines and an interrupt handler that only calls the music player. A
68
+ deliberate filler is the seam a transition is built in. The loader keeps a
69
+ fixed region ($0C00 to $0DFF in Spindle v2) and may write a further page and
70
+ four zero-page bytes while loading, so a part's memory plan starts by
71
+ subtracting those.
72
+
73
+ **Music across the boundary.** One player is active at a time, and each part's
74
+ handler carries a three-byte placeholder the linker turns into the call to the
75
+ installed player (Åkesson). The handler has to be entered every frame through
76
+ preparation, fade out and clean up, or the tune skips; see
77
+ `music_continuity_across_parts` below.
78
+
79
+ **What breaks when it is skipped.** A part that trusts $D018 from its
80
+ standalone build shows the wrong charset for a frame after a part that moved
81
+ it. A part that leaves $D015 set hands the next part its sprites. A part that
82
+ disables interrupts and never re-enables them before the switch kills the
83
+ music at the join. A part that uses $0E00 while the next one loads is
84
+ overwritten from under itself.
85
+
86
+ **Variations.** A megademo (see `pacing_and_length`) resets between parts, so
87
+ the contract shrinks to leaving the disk readable. A one-file intro has no
88
+ contract, and the six stages are still the order to write it in.
89
+
90
+ Related: `../techniques/loaders-packers.md` (`multi_load_sequencing`),
91
+ `../techniques/raster.md` (`irq_chain_table`),
92
+ `../techniques/memory-banking.md` (`memory_layout_plan`).
93
+
94
+ ---
95
+
96
+ ## transition_conditions — Three ways a part ends
97
+
98
+ **Kind:** behaviour
99
+ **Applies to:** demo_intro, dentro, party_intro_4k
100
+ **Realised by:** screen_wipe, colour_fade, colour_cycling, keyboard_matrix_scan, sid_play_routine_pattern, screen-wipe, colour-fade, colour-cycling
101
+ **Sources:** Linus Åkesson, Spindle v2 documentation; Dane, interviewed by Magic in Vandalism News 65
102
+
103
+ **Checks:**
104
+ - A part whose end condition is the space bar advances on that key and on no other.
105
+ - A part whose end condition is drop-through advances only after the next part's scheduled load has completed.
106
+ - A part whose end condition is an address reaching a value advances on the frame the player writes that value, and does not advance if the tune is stopped.
107
+ - The fade-out stage reports done before the clean-up stage runs.
108
+ - No frame between two parts shows the first part's screen with the second part's colours.
109
+
110
+ **Why.** A part has to know when it is over. Åkesson's script format has three
111
+ answers. **The shape:** each part carries one condition.
112
+
113
+ ```
114
+ condition meaning used for
115
+ key (space) wait for the viewer early builds; megademo parts
116
+ drop-through end as soon as the next part is loaded parts that exist to cover a load
117
+ address = value wait until RAM holds a value music sync: the player's song position
118
+ ```
119
+
120
+ The third is how a demo runs to its soundtrack. Åkesson's example reads the
121
+ player's song position from a zero-page byte, so a part ends on a pattern
122
+ boundary rather than a frame count. The condition is met, the fade-out stage
123
+ runs until it reports done, then the switch happens; a part that fades over
124
+ two seconds has to be told to end two seconds early.
125
+
126
+ **The judgement.** Dane, on the soundtrack of Edge of Disgrace, describes the
127
+ job as solving the memory and raster-time limits without letting the viewer
128
+ see where either ran out. Applied to a join, that is the test: a transition
129
+ reads as forced when the viewer can see the limit that caused it. A cut to
130
+ black because two parts collide in memory, a pause because the disk had not
131
+ finished, a fade keyed to a raster count instead of the tune. The fix is not a
132
+ faster effect over the seam; it is moving the condition so the seam falls
133
+ where the music already has one.
134
+
135
+ **What breaks when it is skipped.** A part timed by a frame counter drifts
136
+ against the tune by one frame per missed play call. A part ended by the loader
137
+ alone ends at a different moment on a 1541, on an SD2IEC and in VICE. A part
138
+ that waits for space in the final build stops the demo on the big screen.
139
+
140
+ **Variations.** A demo mixes the three: space everywhere during development
141
+ (Åkesson's advice), address-equals-value once the tune is in, drop-through for
142
+ filler parts. A 4K intro with no loader has the first and third.
143
+
144
+ Related: `../techniques/transitions.md`,
145
+ `./demo-design-philosophy.md` section 5 (transitions as an aesthetic
146
+ site), `music_continuity_across_parts` below.
147
+
148
+ ---
149
+
150
+ ## pacing_and_length — How long anything may run
151
+
152
+ **Kind:** composition
153
+ **Applies to:** demo_intro, dentro, party_intro_4k
154
+ **Realised by:** multi_load_sequencing, big_font_2x2, dycp_scroller, big-font-scroller, dycp-scroller, sine-scroller
155
+ **Sources:** Raistlin, X 2023 Demo Compo: A Look Back (2023); Goto80, The First Megademos (2021); Cascade release notes (1998)
156
+
157
+ **Checks:**
158
+ - No single effect stays on screen for more than about twenty seconds without a visible change of state.
159
+ - The part that runs across the disk flip loops until the flip is detected and shows a scroller.
160
+ - Every part in the final build advances without a key press unless the design names it a megademo.
161
+ - No effect in the final build runs below the frame rate its design states.
162
+ - The final build's running time, measured start to end, is within ten percent of the figure in the part list.
163
+
164
+ **Why.** The audience at a party sees the demo once, projected, in a row of
165
+ other demos. Length and dwell are the two numbers they feel directly.
166
+
167
+ **Two structural families.** Goto80's history of the megademo separates the
168
+ forms. A megademo is a run of discrete parts; the viewer presses a key to
169
+ reach the next, tolerates a break for a loader or a menu, and needs no common
170
+ theme, so the next part can be anything. A trackmo drops the loading part and
171
+ streams the next part from disk with no visible break, and then the name
172
+ megademo stops fitting. The C64 megademos he lists all date from 1987; 6581
173
+ Crew and Finland Cracking Service are among the six groups named. A megademo
174
+ part is a complete short programme with its own ending; a trackmo part is a
175
+ paragraph in a longer piece.
176
+
177
+ **The numbers.** Raistlin's look back at X 2023 states the rules Genesis
178
+ Project set for No Bounds: do not dwell on an effect for more than twenty
179
+ seconds however long it took to write, and a total running time close to ten
180
+ minutes. He gives the field's running times as Mojo and Wonderland XIV about
181
+ sixteen and a half minutes, Multiverse about eighteen, Next Level about
182
+ twenty-one, and calls fifteen minutes and more the new norm for the bigger
183
+ demos. He takes the blame for his own demo running short and leaning on code
184
+ while the others carried far more art and flipped sides quickly. The dwell
185
+ rule held up; the ten-minute total did not. Both figures are his, from one
186
+ competition.
187
+
188
+ **The disk flip.** Raistlin describes No Bounds' turn-disk part as a greetings
189
+ scroller long enough to cover the flip and then some, kept because it looked
190
+ good. The scroller at the flip is the standard placement: a part that can run
191
+ indefinitely while the viewer changes sides, and that has to be there anyway
192
+ (the boast tradition, `./demo-design-philosophy.md` section 5).
193
+
194
+ **What reads as unfinished.** Raistlin's note on another entry's fight
195
+ sequence is that it wanted more animation and a higher frame rate: the
196
+ audience cannot see the code but can see a slideshow. Cascade's note on Trip
197
+ to Nepa(l) (1998) says trouble linking the parts left the whole demo slow
198
+ paced, the other visible form: parts each fine, a whole that drags.
199
+
200
+ **What breaks when it is skipped.** Without a dwell rule the hardest effect
201
+ stays up for a minute because it was hard, and the room's attention leaves
202
+ after twenty seconds. Without a length figure against the part list the demo
203
+ is short against the field or padded.
204
+
205
+ **Variations.** A 4K intro keeps the dwell rule and runs the length of its
206
+ tune. A single-file demo has no flip and puts the scroller at the end.
207
+
208
+ Related: `./demo-design-philosophy.md` sections 2 and 5,
209
+ `transition_conditions` above, `composition_workflow` below.
210
+
211
+ ---
212
+
213
+ ## music_continuity_across_parts — One play call per frame, always
214
+
215
+ **Kind:** behaviour
216
+ **Applies to:** demo_intro, dentro, party_intro_4k, cracktro
217
+ **Realised by:** sid_play_routine_pattern, irq_chain_table, stable_raster_irq, frame_sync_loop, pal_ntsc_detection, sid-music-player, irq-chain, pal-ntsc-detect
218
+ **Sources:** Raistlin, Stopping Music Popping (2023); Linus Åkesson, Spindle v2 documentation; Dane, Vandalism News 65
219
+
220
+ **Checks:**
221
+ - Consecutive entries to the play routine are 19,656 cycles apart on PAL, within the tolerance the design states, on every frame of a run that crosses every part boundary.
222
+ - Consecutive entries to the play routine are 17,095 cycles apart on NTSC under the same rule.
223
+ - No frame between the first play call and the end of the demo has zero play calls or two.
224
+ - The play call is the first thing the interrupt handler does, or it has an interrupt of its own.
225
+ - When the play call moves to a different raster line between two parts, it moves by steps and not in one frame.
226
+
227
+ **Why.** A SID tune is a sequence of register writes that assume one call per
228
+ frame. Raistlin's article names the moments a demo breaks that assumption:
229
+ initialising a new part, the transition into it, and the final switch when the
230
+ IRQ vector changes. Each can drop a call or make two, and the result is an
231
+ audible pop or a lurch in the tempo.
232
+
233
+ **The figure.** A PAL frame is 312 raster lines of 63 cycles: 312 × 63 =
234
+ 19,656 cycles. An NTSC frame on the 6567R8 is 263 lines of 65 cycles: 263 × 65
235
+ = 17,095 cycles. Both are arithmetic from the line counts on
236
+ `../hardware/pal-ntsc-reference.md`; the PAL sum is also the figure Raistlin
237
+ states, and that page measured it in VICE x64sc with a CIA timer latch. The
238
+ NTSC figure stands on arithmetic and that page's table.
239
+
240
+ **The shape.** The play call sits at a fixed point in the frame. Raistlin's
241
+ two fixes are ordering and sliding. Ordering: make the play call the first
242
+ thing the handler does, or give it its own interrupt, so variable-time code
243
+ cannot move it. Sliding: when the new part wants its call on a different
244
+ raster line, move it over several frames; his example walks the call from line
245
+ 255 to line 50 in steps of about twenty lines over eleven frames. He allows
246
+ about five to ten percent variance during a transition and expects the exact
247
+ figure in steady state.
248
+
249
+ Dane's remark on Edge of Disgrace is the design-side half: the music is
250
+ written to each part's memory and raster budget, and a continuous soundtrack
251
+ is hard for that reason. The composer knows which parts have raster time for a
252
+ heavy player and which do not, and the player's cost is a line in the part's
253
+ budget from the start, not a surprise at linking.
254
+
255
+ **Detection.** Raistlin traces execution of the play routine's address in the
256
+ VICE monitor, logs each hit with its clock to a file, and differences
257
+ consecutive clocks; any gap that is not the figure is a fault. The same
258
+ monitor commands (`trace`, `logname`, `log on`) are documented for another
259
+ purpose on `../runtime/vice-reference.md`; a trace of a play routine across a
260
+ part boundary is not measured here. A trace on stores to $D400 to $D418 asks
261
+ the same question from the register side.
262
+
263
+ **What breaks when it is skipped.** One dropped call is a click. A doubled
264
+ call is a note that lands early. A call that moves from line 255 to line 50 in
265
+ one frame gives one short gap of 312 − 255 + 50 = 107 lines, 107 × 63 = 6,741
266
+ cycles, about a third of a frame (Raistlin calls it about half), and the tempo
267
+ stumbles once. In a trace, a missed call shows as a gap near 39,312 cycles and
268
+ a doubled call as one near zero. On NTSC a tune written for PAL runs faster by
269
+ 19,656 ÷ 17,095, which is a separate fault with a separate page
270
+ (`../pitfalls/region-timing.md`).
271
+
272
+ **Variations.** A demo that changes tune between parts has the same problem at
273
+ the join: the old player's last call and the new one's first want the same
274
+ spacing. A cracktro with one part has only the initialisation case.
275
+
276
+ Related: `../techniques/music-sid.md` (`sid_play_routine_pattern`),
277
+ `../pitfalls/region-timing.md`, `../hardware/pal-ntsc-reference.md`,
278
+ `part_lifecycle` above.
279
+
280
+ ---
281
+
282
+ ## composition_workflow — The order the work goes in
283
+
284
+ **Kind:** production
285
+ **Applies to:** demo_intro, dentro, party_intro_4k
286
+ **Realised by:** multi_load_sequencing, memory_layout_plan, exomizer_basics, memory-layout
287
+ **Sources:** Dane, Vandalism News 65; Linus Åkesson, Spindle v2 documentation; psenough, Teach Yourself Demoscene in 14 Days; Phoenix, NVScene 2014 report in Hugi 38 (2014)
288
+
289
+ **Checks:**
290
+ - The first linked build runs every part in order with a key press between them and no transitions.
291
+ - The second linked build runs to the tune with every part ended by a song position.
292
+ - Transitions are added only after a build exists that runs end to end on the tune.
293
+
294
+ **Why.** The whole is assembled last and under a fixed deadline. The order in
295
+ which the pieces are made decides how much of the deadline goes to polish and
296
+ how much to firefighting.
297
+
298
+ **The shape, from two shipped accounts.** Dane, on Booze Design's process: for
299
+ Uncensored the theme was decided at a gathering in the summer of 2014 and the
300
+ linking order came naturally from it; nothing is decided early. For Edge of
301
+ Disgrace, HCL stacked up previews of effects, the group worked toward
302
+ coherency, and when HCL stopped making effects they linked the demo in
303
+ chronological order over about six months, HCL linking one more effect or
304
+ transition and Dane adjusting or composing to it; the soundtrack changed
305
+ almost daily. Most of the work on Uncensored was done in the three months, and
306
+ the forty-eight hours, before the deadline. Read as an order: theme, then
307
+ linking order, then effects fitted to both, with the last quarter of the
308
+ calendar carrying most of the load.
309
+
310
+ Åkesson, from the tool side, gives four steps. Put the parts in a script in
311
+ order of increasing interest with every transition set to the space bar. Add
312
+ the tune and switch every transition to a song position so the music drives
313
+ the demo; this is the rough cut. Build the transitions, biggest first, such as
314
+ an intermediate part that brings in a background picture ahead of the effect
315
+ that uses it. Then polish the switchovers that glitch, with clean-up routines
316
+ that stop interrupts and wait for a chosen raster line. Åkesson's reason for
317
+ leaving transitions until the order is fixed is that once it is, inherit tags
318
+ and transitions can rely on it. Two practices sit alongside the steps and have
319
+ no observable on the binary: write the part order, the total time and the
320
+ owner of each join down before the last quarter of the calendar, and show each
321
+ art-heavy part to someone other than its coder before the deadline.
322
+
323
+ **Who owns what.** psenough's guide puts the demo's overall design, from
324
+ concept through the arrangement of scenes to the joins, with the graphician
325
+ more often than not: the coder produces effects, the composer a tune to each
326
+ part's budget, and someone holds the order and the joins. The guide also
327
+ advises a schedule buffer of twenty to fifty percent over the honest estimate,
328
+ and starting small.
329
+
330
+ **Paintovers.** Phoenix's report on NVScene 2014 records Pixtur introducing
331
+ paintovers to get feedback on colour and tone before a release. The method, as
332
+ the name says, is to let others paint over a work-in-progress frame; that
333
+ description is this page's, not the report's. On a sixteen-colour machine this
334
+ is cheap and the alternative is finding out at the projector.
335
+
336
+ **What breaks when it is skipped.** Transitions built before the order is
337
+ fixed are rebuilt when it moves. A tune commissioned before the part budgets
338
+ are known is too heavy for the part that needs raster time or too thin for the
339
+ part that had it. A demo linked in the last week ships the pacing fault
340
+ Cascade described. An unwritten part order means the group learns the running
341
+ time at the party.
342
+
343
+ **Variations.** A one-coder 4K intro collapses the roles into one person and
344
+ keeps the four steps. A megademo skips the transition steps and spends them on
345
+ each part's own ending.
346
+
347
+ Related: `./demo-design-philosophy.md` section 4 (the release lifecycle,
348
+ which this pattern refines), `pacing_and_length` above,
349
+ `../techniques/loaders-packers.md`.
@@ -0,0 +1,320 @@
1
+ <!-- doc-type: reference -->
2
+
3
+ # Demo Design Philosophy
4
+
5
+ This document covers the aesthetic, cultural, and structural conventions of the C64 demo scene.
6
+ It is the *why* behind technique choices — the social context that gives those techniques meaning.
7
+ For the technical implementation of individual effects, see `../techniques/effects-vector-3d.md`,
8
+ `../techniques/loaders-packers.md`, and the other files in `../techniques/`. For the cracktro
9
+ subset and intro conventions, see `./intro-cracktro-patterns.md`.
10
+
11
+ ---
12
+
13
+ ## 1. The Demo as Performance
14
+
15
+ A C64 demo is not a program that happens to run. It is a released artifact — something that exists
16
+ publicly, has been voted on, has been reviewed, and carries its group's name into the permanent
17
+ record. That distinction matters because it shapes every creative and technical decision a demo
18
+ coder makes.
19
+
20
+ The primary venue for a demo is a party. Demoparties assemble sceners in one place — historically
21
+ in Scandinavia but now distributed globally — project demos on a large screen in front of an
22
+ audience, and run a live vote. The vote result is published immediately. A production that places
23
+ first in a 64K intro compo at a well-regarded party earns a kind of public certificate that "this
24
+ is good by peer consensus." That certificate is permanent: it lives in the CSDb record.
25
+
26
+ **CSDb (csdb.dk)** is the modern release archive and community review board for C64 scene
27
+ productions. Every serious release is catalogued there with a release date, party affiliation,
28
+ download links, and user ratings. CSDb ratings aggregate scene opinion over years, so a demo
29
+ released in 2008 still accretes votes in 2024 as new people discover it. This long tail of
30
+ evaluation makes the scene's collective aesthetic judgment unusually robust compared to ephemeral
31
+ web hype.
32
+
33
+ **Compo demo vs uploaded release:** A compo demo is submitted to a party competition, shown live,
34
+ and voted on in real time. An uploaded release is self-published to CSDb (or formerly to ftp
35
+ sites) without competitive context. Compo demos carry more prestige because the deadline is hard,
36
+ the audience is expert, and the vote is honest. Uploaded releases still matter — many important
37
+ productions circulate that way — but the community understands the difference. A release that
38
+ "was never in a compo" is not lesser by definition, but it lacks the proof-of-pressure that compo
39
+ placement provides.
40
+
41
+ The phrase "released" in scene culture means more than "exists." It means: polished to the point
42
+ where the group was willing to put their name on it in public, under deadline, in front of peers.
43
+ An internal build that leaks is not released. A demo shown at a party but never uploaded is
44
+ technically released but imperfectly archived. The full release cycle closes when a clean binary
45
+ appears on CSDb with accurate credits.
46
+
47
+ ---
48
+
49
+ ## 2. Compo Categories and Constraints
50
+
51
+ Parties divide productions into categories with strict size or content rules. The C64 scene has
52
+ developed its own conventions for each category.
53
+
54
+ ### 256-Byte Intro
55
+
56
+ The entire binary — code and data — must fit in 256 bytes. This is a severe constraint on a
57
+ machine where a single sprite definition occupies 63 bytes. The art form is almost entirely about
58
+ what you can procedurally generate: mathematical patterns, Lissajous curves, sine-wave effects,
59
+ simple rasterized geometry. Assembly is mandatory; no compiler overhead survives at this scale.
60
+
61
+ The technical-versus-art balance tilts almost entirely to technical: the aesthetic is the
62
+ algorithm itself. A 256-byte entry that produces something visually unexpected wins because the
63
+ audience understands how little room existed. Scroller text is usually absent or reduced to a
64
+ single static message printed at cost. Tune is either borrowed from ROM or generated by a minimal
65
+ wavetable that fits in the remaining bytes.
66
+
67
+ ### 1K Intro
68
+
69
+ At 1024 bytes, 1K intros can contain a short SID tune and one or two distinct visual effects.
70
+ The design challenge is sequencing: the demo needs to feel like it goes somewhere — intro,
71
+ effect, outro — within extreme constraint. Crunching (compression with a decompressor header)
72
+ is standard but the decompressor itself costs bytes, so packing efficiency is critical.
73
+
74
+ The aesthetic expectation shifts slightly toward polish. A 1K intro that shows a clean plasma
75
+ effect with a synchronized tune beat is judged differently than one that shows the same plasma
76
+ untimed. The beat synchronization requires reserving bytes for a timing table or computing beat
77
+ from the SID frame counter — small costs that pay outsized aesthetic dividends.
78
+
79
+ ### 4K Intro
80
+
81
+ Four kilobytes allows a short but coherent demo. Typical content: a one-minute SID tune, two to
82
+ four effects in sequence, group logo or rasterized scroller, and at least one transition. The
83
+ 4K category is highly competitive because it is achievable by a small team — a coder and a
84
+ musician — without the production overhead of a full demo.
85
+
86
+ Groups like Genesis Project have produced landmark 4K work that demonstrates the category's
87
+ ceiling: procedural geometry, smooth palette cycling, and tight tune synchronization within a
88
+ tiny binary. The 4K format rewards coders who have deeply internalized the hardware: every byte
89
+ saved is a byte available for one more effect frame or one more palette entry.
90
+
91
+ ### 64K Intro ("Mini-Demo")
92
+
93
+ At 64 kilobytes, the intro is large enough to contain multiple SID tunes, complex loading
94
+ sequences (if the 64K includes a loader), and richer visual sequences. Some parties call this
95
+ a "mini-demo" to distinguish it from the uncapped full-demo category. The boundary is cultural
96
+ more than technical — a 64K intro might run longer than a conventional demo from 1988.
97
+
98
+ The production challenge at 64K is organizational: the team needs a coder, musician, graphician,
99
+ and sometimes a separate "design lead" to make sure the parts hang together aesthetically. Size
100
+ management is still real — 64K is not infinite — but asset quality is the dominant constraint.
101
+ A 64K intro with mediocre SID work will lose to one with an outstanding tune even if the visuals
102
+ are comparable.
103
+
104
+ ### Demo (Full, No Strict Size Cap)
105
+
106
+ The full demo category has no mandated size ceiling, though practical limits apply: a disk-based
107
+ C64 demo must fit on one or two sides of a 1541 disk (approximately 165K or 330K usable). Most
108
+ full demos run four to eight minutes, contain three to six distinct parts separated by loaders,
109
+ and feature coordinated work from a coder, musician, and graphician.
110
+
111
+ Full demos are where the scene's most ambitious aesthetic experiments appear. Multi-part
112
+ construction with per-part loaders (see `../techniques/loaders-packers.md`) allows each part to
113
+ own the full 64K address space. A group can write one part in Oscar64 targeting a plasma effect
114
+ and another part in hand-tuned assembly targeting a sprite-multiplexed 3D rotation, with the
115
+ loader transition between them handling decompression and relocation. The full demo format is
116
+ the main competitive prize at major parties.
117
+
118
+ ### Wild Compo
119
+
120
+ Wild compo accepts anything the party organizers will permit: hardware expansions, mixed-media
121
+ productions, demos running from unusual storage, real-time performances with external peripherals.
122
+ C64 entries in wild categories have included productions that modify the hardware in real time,
123
+ demos that display output on oscilloscopes driven by the SID, and entries that use the cassette
124
+ port in unintended ways. Wild compos reward lateral thinking over optimization; the judging
125
+ criterion is audience reaction.
126
+
127
+ ---
128
+
129
+ ## 3. Scene Tiers
130
+
131
+ The C64 scene is not a single aesthetic community. It contains at least three recognizable
132
+ sensibilities that have evolved over four decades.
133
+
134
+ ### Newschool
135
+
136
+ The newschool aesthetic emerged from the competitive intro categories in the 2000s and 2010s.
137
+ It prioritizes mathematical rigor and visual density: procedural geometry, voxel-style terrain,
138
+ mode 7 perspective, 3D vector objects (see `../techniques/effects-vector-3d.md`), and tunnel
139
+ effects running at maximum frame rate. The visual language often echoes demoscene productions
140
+ on platforms with more CPU headroom — treating the C64 constraint as proof of craft rather than
141
+ as a source of aesthetic vocabulary.
142
+
143
+ Newschool productions in the 256-byte and 4K categories frequently achieve things that appear
144
+ impossible on a 1 MHz 6510, which is precisely the point. The audience reaction is calibrated
145
+ to technical astonishment. Tune choices tend toward chip-music styles that complement the
146
+ geometric visuals rather than emulating older SID styles.
147
+
148
+ ### Oldschool
149
+
150
+ The oldschool aesthetic draws on the visual vocabulary of C64 demos from roughly 1986 to 1992:
151
+ raster bars, hardware sprite multiplexing, FLD-style scrollers, charset animation, and SID
152
+ tunes in the three-voice synth tradition. Oldschool is not nostalgia by default — it is a
153
+ deliberate aesthetic position that treats the platform's native visual grammar as valid art.
154
+
155
+ The most celebrated modern oldschool productions include **Edge of Disgrace** by Booze Design
156
+ (released 2008, widely regarded as one of the finest C64 full demos) and **Comaland** by Censor
157
+ Design (released 2014, similarly acclaimed). Both productions are extensively documented on CSDb
158
+ and have been analyzed in technical write-ups by their authors. They demonstrate that the
159
+ oldschool format supports creative ambition at the same level as any contemporary platform.
160
+ Groups like Triad, Resource, and Fairlight have maintained continuous oldschool output across
161
+ decades, and their aesthetic consistency is part of what makes their releases identifiable.
162
+
163
+ ### Wild
164
+
165
+ The wild tier is not a competitive category but a mode of production. Wild-tier thinking asks:
166
+ what can the hardware do if we ignore the expected use? Demos that drive external hardware,
167
+ that treat audio output as primary and visual output as secondary, that run from storage media
168
+ the machine was not designed for — these are wild in sensibility regardless of which compo they
169
+ enter. Some groups produce both competitive oldschool demos and wild-tier experiments in the same
170
+ year.
171
+
172
+ ---
173
+
174
+ ## 4. The Released-Demo Lifecycle
175
+
176
+ Understanding how demos get made illuminates why they look the way they do.
177
+
178
+ **Concept.** A demo begins as an idea for a sequence or a theme — often loose. "We want a
179
+ tunnel leading into a 3D rotation with a SID tune that builds from ambient to loud." The concept
180
+ rarely survives first contact with hardware constraints unchanged, but having a concept before
181
+ writing code is the mark of a production-mode group rather than a tech-demo group.
182
+
183
+ **Tune commissioned.** For groups that collaborate across physical locations, the musician
184
+ typically works first. A SID tune has a fixed length and structure — the musician delivers a
185
+ file, usually a .sid or a raw binary, and the coder builds timing tables around it. Commissioning
186
+ the tune before or during early effect prototyping means the visual sequence can be choreographed
187
+ to the music's actual beat grid rather than retrofitted later.
188
+
189
+ **Effect prototyping.** Individual effects are developed independently, often by separate coders.
190
+ An effect prototype in Oscar64 or KickAssembler runs as a standalone binary — it is not
191
+ integrated into the demo shell yet. This is the longest phase and the one most subject to scope
192
+ creep. A plasma effect that runs at 25 FPS on PAL gets profiled and optimized; if it cannot hit
193
+ the target, the design adapts.
194
+
195
+ **Asset production.** Graphicians produce sprites, charset tiles, Koala-format bitmap screens,
196
+ and logo art in parallel with effect prototyping. C64 graphic formats are extremely constrained
197
+ (see the file formats reference), so graphicians working at production quality understand the
198
+ hardware palette, multicolor restrictions, and sprite overlay techniques. A graphician who does
199
+ not know that FLI (Flexible Line Interpretation) requires cycle-exact timing is a liability in
200
+ a competitive demo.
201
+
202
+ **Integration.** The demo shell is assembled: loader, parts, inter-part transitions, tune player,
203
+ memory banking. This phase often reveals conflicts — two effects that independently work cleanly
204
+ cannot both live in the same part because they need overlapping zero-page addresses or conflict
205
+ on a CIA timer. Integration is where `c64_check_compatibility` queries (in the KB) find their
206
+ real-world equivalent: the coder manually auditing what each part uses and resolving collisions.
207
+
208
+ **Final-party-pressure crunch.** Most demos are still not feature-complete two weeks before the
209
+ party. The deadline is fixed and public — the party will happen whether or not the demo is ready.
210
+ This creates a forcing function that compels decisions: cut the fourth part, fix the scroller
211
+ text typo, accept the one scanline flicker in the transition, release. The crunch is not
212
+ dysfunction; it is the design mechanism that prevents infinite scope creep. Productions that miss
213
+ parties and get uploaded later often feel slightly overlong precisely because they lacked the
214
+ forcing function.
215
+
216
+ **Why "released" means polished.** The party vote is brutal. Audience members vote on what they
217
+ see projected, in real time, having watched the preceding entries. A demo that crashes does not
218
+ recover gracefully — the audience watches a frozen screen until the organizer resets the machine.
219
+ A demo that runs to completion but has a visually weak ending loses to one that has a strong last
220
+ thirty seconds. This pressure produces a very specific kind of polish: demos are end-to-end
221
+ correct, not just technically impressive in isolation.
222
+
223
+ ---
224
+
225
+ ## 5. Aesthetic Tropes
226
+
227
+ Certain conventions are so embedded in C64 demo culture that their presence or absence is itself
228
+ a statement.
229
+
230
+ **Amazing transitions.** The transition between parts or effects is a primary aesthetic site.
231
+ Palette splits, screen-clearing raster sweeps, charset swap flickers, and DRAM-fade techniques
232
+ all serve the same function: marking the boundary between visual ideas without cutting to black
233
+ abruptly. A well-designed transition makes the demo feel like a continuous performance rather
234
+ than a playlist. Groups that are known for their visual sophistication — Crest, Genesis Project,
235
+ Onslaught — treat transitions as first-class effects requiring their own development time.
236
+
237
+ **Tune sync.** An effect that responds visually to the music's beat grid reads as deliberately
238
+ designed rather than accidentally happening at the same time as the music. Tune sync can be
239
+ implemented via hardcoded timing tables derived from the musician's tempo, via CIA timer
240
+ comparisons, or via live SID voice-amplitude sampling. The simplest version — synchronized raster
241
+ bar expansion on the beat — is immediately legible to any scene audience. Complex tune sync, where
242
+ multiple visual parameters modulate independently to different frequency bands, is a marker of
243
+ production-quality ambition.
244
+
245
+ **The boast tradition.** Demo culture derives in part from cracking culture, where inserting your
246
+ group's name into a commercial release was the primary form of attribution. The demo form
247
+ inherited the tradition: every demo carries a visible group signature, a scroller with greetings
248
+ to allied groups, and a credits sequence. The greetings scroller is simultaneously social bonding
249
+ (publicly acknowledging relationships within the scene) and territorial marking (your group name
250
+ is on this production, permanently). Groups like F4CG, Hokuto Force, and Resource have
251
+ maintained distinctive greeting styles across decades of releases.
252
+
253
+ **Why scrollers exist.** The hardware scroller emerged from the CIA-timer-driven hardware scroll
254
+ registers as a way to display more text than fit on screen without flicker. A smooth one-pixel-
255
+ per-frame left-scroll of a character row is nearly free on the 6510 if implemented in hardware
256
+ scroll mode (via VIC-II's fine scroll register, with software column shifting once per full
257
+ character width). This made scrollers the natural medium for group messaging: unlimited text,
258
+ smooth motion, zero per-character cost. What began as a technical affordance became a social
259
+ institution. A demo without a scroller in the oldschool tradition reads as deliberately minimalist.
260
+ The scroller's content — the actual text — is the demo group's primary direct communication with
261
+ the viewer, often more personal and candid than any other medium available to the coders at the
262
+ time.
263
+
264
+ ---
265
+
266
+ ## 6. Modern Revival
267
+
268
+ The C64 demo scene did not end when the Amiga arrived or when the PC became dominant. It
269
+ contracted, reorganized, and continued. From roughly 2005 onward, the scene entered a sustained
270
+ revival driven by several forces: emulator accuracy (VICE reaching cycle-exact fidelity),
271
+ hardware preservation (SD2IEC, Ultimate II+ making physical machines more accessible), and
272
+ the emergence of younger sceners encountering the platform via its cultural legacy rather than
273
+ childhood ownership.
274
+
275
+ **Edge of Disgrace** (Booze Design, 2008) is the most frequently cited landmark of the modern
276
+ revival. It demonstrated that a full oldschool-style C64 demo released in the 2000s could be
277
+ not merely competent but genuinely surprising — technically and aesthetically. Its documentation
278
+ at CSDb includes author notes that make it useful as a reference for production methodology, not
279
+ just a thing to watch.
280
+
281
+ **Comaland** (Censor Design, 2014) continued the revival's trajectory, demonstrating that the
282
+ platform's ceiling had not been reached and that groups with deep institutional knowledge could
283
+ continue pushing it. Both productions are well-documented at CSDb and have been discussed in
284
+ technical detail by their authors, making them safe references.
285
+
286
+ The post-2010 scene has also seen growth in the competitive intro categories. The 4K and 256-byte
287
+ categories attract technically focused coders for whom the constraint itself is the creative
288
+ medium. These productions often participate in cross-platform parties where C64 entries compete
289
+ alongside Amiga, PC, and console productions in platform-specific categories. Cross-platform
290
+ party exposure has drawn sceners from other platforms who then specialize in C64, refreshing the
291
+ scene's technical approach.
292
+
293
+ The question of "firsts" — first C64 demo to achieve X — is a live area of scene discourse.
294
+ The C64 demo scene tracks technical firsts carefully, but attributing any specific first to a
295
+ specific production without checking CSDb risks propagating error. Agents retrieving this chunk
296
+ should use `c64_search` with specific technical terms and cross-reference against CSDb records
297
+ rather than relying on any static claim here.
298
+
299
+ ---
300
+
301
+ ## 7. Cross-References
302
+
303
+ - `./intro-cracktro-patterns.md` — The cracktro subset: intro conventions derived from cracking
304
+ culture, boast formatting, loader integration, and the specific aesthetic of the release-group
305
+ intro. This document is being written in parallel (Phase 6, Task 7).
306
+
307
+ - `../techniques/effects-vector-3d.md` — Technical implementation of the effects that appear
308
+ in newschool and oldschool demos: plasma, tunnel, voxel, mode 7 perspective, 3D vector
309
+ rotation. The philosophy sections above describe why these effects are used and what audience
310
+ reaction they are calibrated for; this reference covers how they are implemented.
311
+
312
+ - `../techniques/loaders-packers.md` — Multi-part demo workflow, Krill/Exomizer/Sparkle
313
+ loader integration, and the GCR-level disk tricks that enable fast loading. Full demos depend
314
+ on this infrastructure; the lifecycle section above describes how loaders fit into the
315
+ integration phase of production.
316
+
317
+ - `./demo-composition.md`: the design patterns for a multi-part demo, one level below the
318
+ lifecycle in section 4: what a part hands to the next, the three ways a part ends, dwell and
319
+ length norms, keeping the music play call one frame apart across every join, and the order
320
+ the linking work goes in.