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,405 @@
1
+ ---
2
+ category: effect
3
+ chip: VIC-II
4
+ ---
5
+
6
+ <!-- doc-type: technique-reference -->
7
+
8
+ # Transitions
9
+
10
+ The effects that carry a demo from one part to the next. The demo-design
11
+ pages name the family (`demo-design/demo-design-philosophy.md`, "Amazing
12
+ transitions": palette splits, screen-clearing raster sweeps, charset swap
13
+ flickers, DRAM fades) and say a transition is an effect in its own right,
14
+ not a cut. This page holds the members that have a page and a recipe. A
15
+ raster sweep, a charset flicker and a DRAM fade have no recipe yet.
16
+
17
+ ## colour_fade — Fade to black through a luminance-ordered colour table
18
+
19
+ **Complexity:** low
20
+ **Region:** both
21
+ **Uses registers:** D020, D021, D012
22
+ **Cost:** cycles_per_frame=400, bytes_data=272
23
+ **Cost basis:** estimated
24
+ **Cost measured on:** kickassembler-colour-fade (per step)
25
+
26
+ ### Why
27
+
28
+ The VIC-II has sixteen fixed colours and no brightness control, so a
29
+ picture cannot be dimmed by scaling. What it can do is substitute: each
30
+ colour on screen is replaced, step by step, by a darker colour from the
31
+ same sixteen until everything is black. Done over a second or so this
32
+ reads as a fade, and it costs nothing in the picture itself: the shapes
33
+ stay where they are, only the colour registers and colour RAM change.
34
+
35
+ ### How
36
+
37
+ 1. Order the sixteen colours from darkest to brightest. Over the RGB
38
+ triples VICE emits for its PAL palette (`runtime/vice-reference.md`,
39
+ "Reading the exit screenshot"), Y = 0.299 R + 0.587 G + 0.114 B gives
40
+ 0, 6, 9, 2, 11, 8, 4, 14, 12, 5, 10, 3, 15, 13, 7, 1 (arithmetic on
41
+ the table, rung 3). The NTSC triples give the same order except that
42
+ 2 and 11 swap and 4 and 8 swap; the recipe uses the PAL order on both
43
+ models and the difference is one rank in two places.
44
+ 2. Build a table `fade[step][colour]` of seventeen rows by sixteen
45
+ colours. Row 0 is the identity, row 16 is all zeros, and row `s` maps
46
+ colour `c` to `order[round(pos(c) * (16 - s) / 16)]`, where `pos(c)`
47
+ is the colour's rank in the order. Each column is monotone: a colour
48
+ never gets brighter as the fade goes on. KickAssembler builds the 272
49
+ bytes at assembly time with two nested `.for` loops.
50
+ 3. Every N frames advance the step. For each step, look up every colour
51
+ the picture uses in the current row and write the result where the
52
+ picture reads it: `$D020`/`$D021` for bars, colour RAM for text,
53
+ `$D027`-`$D02E` for sprites, the screen-RAM nibbles for a bitmap.
54
+ 4. At step 16 hold; the picture is black. To fade in, walk the rows in
55
+ the other direction.
56
+
57
+ ### Why it works
58
+
59
+ The VIC-II reads its colour registers as it draws (see `raster_bars` in
60
+ `raster.md`: the registers are transparent, there is no per-line latch),
61
+ so writing the substituted colour recolours the picture on the next line
62
+ with no redraw of screen or bitmap memory. The luminance order is what
63
+ makes the substitution read as dimming rather than as a palette change:
64
+ at each step the eye sees the same shapes, darker. Hue shifts are the
65
+ price of a fixed palette: white goes through light grey, mid grey and
66
+ dark grey; yellow through light green and green. Rounding in the table
67
+ merges ranks, so two colours adjacent in the order can show the same
68
+ colour for a step; in the recipe, step 9 shows only eight distinct
69
+ colours across the sixteen bars. Dark colours reach black first (blue,
70
+ rank 1, is black from step 9) while white takes all sixteen steps, which
71
+ is what a real fade looks like: the dark parts go first.
72
+
73
+ ### Variations
74
+
75
+ **Text screen.** Rewrite the thousand colour-RAM bytes through the table.
76
+ Per cell `LDA $D800,X` (4), `AND #15` (2), `TAY` (2), `LDA (ROW),Y` (5),
77
+ `STA $D800,X` (5) is 18 cycles counted from the instruction timings, not
78
+ measured here, so a full screen is about 18,000 cycles, close to a whole
79
+ PAL frame (19,656). Spread it over frames, or keep a list of the colours
80
+ the screen actually uses and only write those.
81
+
82
+ **Bitmap.** In multicolour bitmap mode three of the four colours per cell
83
+ sit in screen RAM as two nibbles and in colour RAM. A 256-entry table per
84
+ step that maps both nibbles of a screen byte at once halves the work.
85
+
86
+ **Fade in, or fade to white.** Walk the rows from 16 down to 0 for a fade
87
+ in. For a fade to white, build the order the other way round so every
88
+ column walks up the luminance order.
89
+
90
+ **Easing.** A table of frames-per-step instead of a constant gives a slow
91
+ start and a quick finish, or the reverse.
92
+
93
+ **Partial fade.** Fade one region and pin another. The recipe fades the
94
+ bars and leaves the caption's colour RAM at white, so the held frame
95
+ still says which step it is.
96
+
97
+ ### Cycle budget
98
+
99
+ Not raster critical. The table lookup for sixteen bars in the recipe is
100
+ `LDY base,X` (4), `LDA (ROW),Y` (5), `STA barcol,X` (5), `DEX` (2),
101
+ `BPL` (3): 19 cycles per bar, about 300 per step, from the instruction
102
+ timings. The busy-wait that draws the bars is the raster bars' cost, not
103
+ the fade's. Step 16 needs the row pointer to be formed with the carry
104
+ kept: `step * 16` is 256 at the last step, and a `CLC` after the shifts
105
+ sends the pointer back to row 0, so the picture snaps back to full colour
106
+ instead of going black. An earlier draft of the recipe did exactly that,
107
+ and the run at 8,000,000 cycles showed the step-0 bars under a caption
108
+ reading step 16.
109
+
110
+ ### Recipes
111
+
112
+ - `recipes/kickassembler/colour-fade.md`
113
+
114
+ ---
115
+
116
+ ## colour_cycling — Rotate a colour table through a fixed set of cells
117
+
118
+ **Complexity:** low
119
+ **Region:** both
120
+ **Uses registers:** D012, D021
121
+ **Cost:** cycles_per_frame=3265
122
+ **Cost basis:** measured-vice
123
+ **Cost measured on:** kickassembler-colour-cycling (one step, in the vertical blank from line 251)
124
+
125
+ ### Why
126
+
127
+ Water, a conveyor belt, a glowing rune, a pulsing logo: things that move
128
+ without changing shape. Redrawing them costs screen or bitmap writes every
129
+ frame. Cycling costs colour writes only. The shapes are drawn once, in a
130
+ pattern that steps through a short list of colours, and each step rotates
131
+ which colour each cell shows. The eye reads the rotation as motion along
132
+ the pattern.
133
+
134
+ ### How
135
+
136
+ 1. Choose a short palette, eight colours or fewer, and draw the region so
137
+ that adjacent cells take consecutive entries. A band that runs down
138
+ the screen gives each row one entry; a diagonal gives cell `(row, col)`
139
+ entry `(row + col) mod n`.
140
+ 2. Keep a phase counter. Every N frames add one to it, modulo the palette
141
+ length. The recipe steps every second frame.
142
+ 3. On a step, rewrite the region's colour cells: the cell that held entry
143
+ `k` now takes entry `k + phase`. Write the table twice end to end so an
144
+ index of `phase + k` never needs masking.
145
+ 4. Land the rewrite where the beam is not: after the last text line, or
146
+ before the first line of the region. Colour RAM is read as each row is
147
+ drawn, so a rewrite that overlaps the beam shows the old colour above
148
+ the beam and the new one below it for that frame.
149
+
150
+ ### Why it works
151
+
152
+ Colour RAM is the picture's colour, not its shape: the VIC-II reads a
153
+ cell's colour nibble on the badline that fetches the row and uses it for
154
+ that row's eight lines (`hardware/vic-ii-reference.md`). A reverse space
155
+ in every cell makes the colour the whole picture, and rotating the colours
156
+ moves the pattern without a single screen-RAM write. The write budget is
157
+ what bounds the region. In the recipe one step rewrites 320 cells at ten
158
+ cycles a cell (`STA abs,X`, `DEX`, `BPL`), and the CIA timer in the
159
+ listing reads 3,265 cycles for it on both models, 52 raster lines,
160
+ measured in VICE. Started at the first line of the lower border, 251,
161
+ that ends on line 303 on PAL and, after the wrap at 263, line 38 on NTSC,
162
+ both before the region's first row is fetched, so no frame shows a torn
163
+ band.
164
+
165
+ ### Variations
166
+
167
+ **A $D021 triple.** In multicolour text the colours in `$D021`, `$D022`
168
+ and `$D023` are shared by every cell, so rotating three register writes
169
+ cycles the whole screen's pattern in a dozen cycles. It cannot cycle two
170
+ regions differently.
171
+
172
+ **Sprite colours.** Rotate `$D027` to `$D02E`, or the two shared
173
+ multicolour registers `$D025` and `$D026`, for a glow that costs eight
174
+ writes a step.
175
+
176
+ **Every frame.** Stepping each frame doubles the speed and the budget
177
+ stays the same per step; the recipe's two-frame step is a choice of pace,
178
+ not a limit.
179
+
180
+ **Sub-region.** Cycle a list of cell addresses instead of whole rows. The
181
+ cost falls to the cells that carry the pattern; a list of 40 addresses is
182
+ 40 indirect stores.
183
+
184
+ ### Cycle budget
185
+
186
+ Not raster critical as long as the rewrite is off the beam. The step is
187
+ 3,265 cycles for eight rows of forty cells, measured by CIA1 timer A in
188
+ the recipe on both models; that is a sixth of a PAL frame and a fifth of
189
+ an NTSC one. A rewrite of the whole thousand cells at the same rate would
190
+ be about 10,200 cycles (arithmetic), which is 162 PAL lines and cannot
191
+ fit between line 251 and the first badline at line 51; a full-screen
192
+ cycle has to run over two frames or use a double buffer, which is the
193
+ `full_field_redraw_exceeds_vblank` case. The step rate is in frames, so
194
+ the pace differs by a fifth between PAL and NTSC.
195
+
196
+ ### Recipes
197
+
198
+ - `recipes/kickassembler/colour-cycling.md`
199
+
200
+ ---
201
+
202
+ ## screen_wipe — Reveal or hide the screen a row, a column or a line at a time
203
+
204
+ **Complexity:** low
205
+ **Region:** both
206
+ **Uses registers:** D012, D021
207
+ **Cost:** cycles_per_frame=709
208
+ **Cost basis:** measured-vice
209
+ **Cost measured on:** kickassembler-screen-wipe (one reveal step, worst row)
210
+
211
+ ### Why
212
+
213
+ A cut between two parts is a discontinuity the eye notices. A wipe turns
214
+ the cut into an event: the old picture goes out along an edge, the new one
215
+ comes in along another. On the C64 the cheap version needs no picture
216
+ buffer at all. The screen stays where it is and its colour is taken away
217
+ or given back, one strip at a time.
218
+
219
+ ### How
220
+
221
+ 1. Draw the screen. Keep a copy of, or a rule for, each row's colours so
222
+ the reveal can restore them.
223
+ 2. Keep a row counter and a direction. Every N frames take one step: in
224
+ the hide direction write the current row's forty colour RAM cells to
225
+ the background colour, in the reveal direction write them back from the
226
+ copy. Advance the row; at the last row turn the direction round or
227
+ stop.
228
+ 3. Land the step where the beam is not, as for `colour_cycling`. A row
229
+ write is short, so the lower border is more than enough.
230
+
231
+ ### Why it works
232
+
233
+ A cell whose colour equals `$D021` is invisible whatever character it
234
+ holds, so writing a row's colour RAM to the background colour hides the
235
+ row without touching screen RAM, and writing it back reveals it. Nothing
236
+ about the picture moves, which is why a wipe of this kind is cheap: the
237
+ per-step cost is forty stores. In the recipe the hide step reads 491
238
+ cycles and the reveal step 708 or 709 by CIA1 timer A, measured in VICE,
239
+ the difference being one indirect load per cell for the reveal. Both are
240
+ under a dozen raster lines. The reveal figure depends on the row, not the
241
+ model: 708 at row 3 and 709 at row 11 on PAL, and 709 at row 11 on NTSC.
242
+ The cause of the per-row cycle is not established.
243
+
244
+ ### Variations
245
+
246
+ **Column by column.** Write one cell in each of the 25 rows per step
247
+ instead of one row. The addresses stride by 40; a table of 25 row bases
248
+ indexed by the column serves.
249
+
250
+ **Diagonal by cell.** Hide cell `(row, col)` on step `row + col`. Each
251
+ step touches at most 25 cells, one per row, and the edge runs at 45
252
+ degrees.
253
+
254
+ **Iris by table.** A table of cell addresses ordered by distance from the
255
+ centre, hidden or revealed so many per step, gives a circle closing or
256
+ opening. The table is the whole cost: a thousand two-byte entries, or a
257
+ one-byte index into a row and column pair.
258
+
259
+ **A $D011 blank moving down.** Clearing the display-enable bit at a
260
+ raster line blanks from that line to the bottom of the frame and shows
261
+ the border colour there. It needs a compare per frame and a raster split,
262
+ which brings `d012_wrap_around` and `badline_cycle_loss` into the
263
+ account; it is not built here and its timing is not measured here.
264
+
265
+ **A per-line $D021 split.** Change the background colour at a raster line
266
+ that moves down each frame, so the picture's background sweeps to black
267
+ while its ink stays. The split's write must land in the horizontal border
268
+ of the line or it shows as a step in the colour; the recipe does not do
269
+ this and no figure is given for it here.
270
+
271
+ ### Cycle budget
272
+
273
+ Not raster critical. The step is a single row's colour RAM, 491 cycles
274
+ to hide and at most 709 to reveal, measured by CIA1 timer A in the recipe.
275
+ Twenty-four rows at two frames each make a 48-frame wipe, 0.96 s on PAL
276
+ and 0.8 s on NTSC (arithmetic from 19,656 and 17,095 cycles a frame). The
277
+ step rate is in frames, so the two models finish at different times for
278
+ the same cycle count; the recipe's verdict is taken on the frame count,
279
+ not the cycle count, so it holds on both.
280
+
281
+ ### Recipes
282
+
283
+ - `recipes/kickassembler/screen-wipe.md`
284
+
285
+ ---
286
+
287
+ ## screen_dissolve_lfsr — Cross-fade two text screens cell by cell in LFSR order
288
+
289
+ **Complexity:** low
290
+ **Region:** both
291
+ **Uses registers:** D012
292
+ **Requires:** lfsr_random
293
+ **Cost:** cycles_per_frame=3203, cycles_per_frame_typical=3032, bytes_code=483
294
+ **Cost basis:** measured-vice
295
+ **Cost measured on:** kickassembler-screen-dissolve (one frame of 20 cells with its LFSR pulls, the worst and the median of the 50 frames; bytes are the code block less its two captions)
296
+
297
+ ### Why
298
+
299
+ The fade changes colours, the cycling moves them and the wipe takes them
300
+ away along an edge. None of them can put a second picture in place of
301
+ the first: a fade to black and back is the nearest, and it costs a
302
+ luminance table and a black frame in the middle. A dissolve replaces the
303
+ screen one cell at a time in an order that looks random, so the new
304
+ picture comes up through the old everywhere at once and the eye reads it
305
+ as a cross-fade, with no palette work and no black in between. It needs
306
+ the target screen in RAM, which the wipe does not, and a source of cell
307
+ indices that visits every cell once, which is what a maximal LFSR is.
308
+
309
+ ### How
310
+
311
+ 1. Build the target screen in RAM, screen bytes and colour bytes, 1,000
312
+ of each. The visible screen holds the source.
313
+ 2. Take a 10-bit Galois LFSR with taps `$240`, the polynomial
314
+ x^10 + x^7 + 1, in the right-shifting form of `lfsr_random`: shift the
315
+ state right, and if the bit that fell out was 1 XOR the taps in. Seed
316
+ it with any non-zero value; the recipe uses 1.
317
+ 3. Each frame, in the lower border, pull N indices. A state of 1000 to
318
+ 1023 is not a cell: pull again. For each cell copy the target's screen
319
+ byte and colour byte to the visible screen.
320
+ 4. When the state comes back to the seed every value from 1 to 1023 has
321
+ been produced once, so 999 cells are done. Copy cell 0 by hand; the
322
+ register never produces it. Then stop, and the picture is static.
323
+
324
+ At N = 20 the whole screen takes 50 frames, 1.0 s on PAL and 0.83 s on
325
+ NTSC (arithmetic from 19,656 and 17,095 cycles a frame), measured in the
326
+ recipe as the last cell landing on frame 50 on both models, with cell 0
327
+ as the twentieth slot of that frame.
328
+
329
+ ### Why it works
330
+
331
+ A maximal-length LFSR is a permutation of its 2^n - 1 non-zero states,
332
+ so it produces each cell index exactly once and never repeats one before
333
+ the whole set is out; a random number generator with a repeat would copy
334
+ some cells twice and leave others until the end. The recipe checks the
335
+ permutation two ways: 1,023 steps in Python give 1,023 distinct values
336
+ from 1 to 1,023, and the run comes back to its seed on the 1,023rd pull
337
+ with 999 cells copied.
338
+
339
+ Ten bits and not sixteen because 2^10 is the first power of two above
340
+ 1,000. Every state above 999 is a wasted pull; ten bits wastes 24 in
341
+ 1,023, sixteen would waste 64,535 in 65,535 and spend sixty-four pulls
342
+ for every cell. The 24 wasted pulls fall where the sequence puts them,
343
+ and the frame that meets most of them is the worst frame: 3,203 cycles
344
+ against a median of 3,032 in the recipe, so the spread is small and the
345
+ per-frame budget can be taken as N times the per-cell cost plus a little.
346
+
347
+ The zero cell is the one an LFSR cannot give, for the reason in
348
+ `lfsr_zero_state_lockup` (`pitfalls/cpu.md`): from zero the register
349
+ stays at zero. That is also why the seed must be non-zero. The skip of
350
+ 1000 to 1023 keeps the index below the 24 bytes past the last cell that
351
+ `colour_ram_index_past_last_cell_hits_cia1`
352
+ (`pitfalls/text-mode-render.md`) is about: on the screen side those are
353
+ unused bytes and the sprite pointers, on the colour side they are the end
354
+ of the page, and one more past them is CIA1.
355
+
356
+ ### Variations
357
+
358
+ **Colour RAM only.** Copy the colour byte alone and leave the screen
359
+ bytes, so a picture dissolves from one palette to another; half the
360
+ stores a cell, and no target screen RAM is needed, only 1,000 colour
361
+ bytes. Not built here.
362
+
363
+ **2 by 2 blocks.** Run a 250-state permutation over block indices (an
364
+ 8-bit LFSR wastes 5 in 255) and copy four cells a pull. Fewer, larger
365
+ steps: the same 50 frames at N = 5 blocks, or a faster dissolve at the
366
+ same cost. The block's four cells are at `i`, `i + 1`, `i + 40` and
367
+ `i + 41` from the block's top-left cell. Not built here.
368
+
369
+ **Bitmap by byte.** The same permutation over 8,000 bitmap bytes with a
370
+ 13-bit LFSR (8,191 states, 191 wasted), copying a byte a pull; the
371
+ colour cells follow with a second 10-bit pass or by copying each cell's
372
+ colour with its first byte. Eight times the cells of a text dissolve at
373
+ the same N is eight times the frames, so N has to rise with it. Not
374
+ built or timed here.
375
+
376
+ ### Cycle budget
377
+
378
+ Not raster critical. The recipe's frame of 20 cells with its LFSR pulls
379
+ costs 3,203 cycles at worst and 3,032 at the median, by CIA1 timer A,
380
+ identical on PAL and NTSC because the work starts on line 251 in the
381
+ lower border where there is no badline and nothing in it depends on the
382
+ model. That is about 150 cycles a cell for the recipe's shape (a
383
+ subroutine call, four pointer high bytes and two indirect copies a
384
+ cell), and the frame is over about 50 lines after line 251: line 302 on
385
+ PAL, and on NTSC, whose frame wraps at 263, about line 37 of the next
386
+ frame, both in the border. The blank the copies have to fit is not the
387
+ same on the two models: about 7,000 cycles on PAL and about 4,100 on
388
+ NTSC between line 251 and line 51 of the next frame (arithmetic:
389
+ (312 - 251 + 51) x 63 and (263 - 251 + 51) x 65). The cost scales with
390
+ N at about 150 cycles a cell, so 40 cells a frame, about 6,000 cycles
391
+ and a 25-frame dissolve, fits the PAL blank only; on NTSC the copies
392
+ stay in the blank up to roughly N = 27 (4,095 / 150; arithmetic, not
393
+ measured here). Past that N the copies run into the display and a cell
394
+ can be caught between its screen byte and its colour byte, which is the
395
+ tearing `full_field_redraw_exceeds_vblank` describes; at N = 20 it is
396
+ not near on either model.
397
+ The sequential control in the recipe, the same copies in index order,
398
+ costs 2,226 at worst, so the LFSR and its skip are about a third of the
399
+ frame.
400
+
401
+ ### Recipes
402
+
403
+ - `recipes/kickassembler/screen-dissolve.md`
404
+
405
+ ---
@@ -0,0 +1,262 @@
1
+ ---
2
+ tool: cartconv
3
+ tool_kind: asset-converter
4
+ maintainer: VICE team
5
+ license: GPL-2.0-or-later
6
+ home_url: https://vice-emu.sourceforge.io/
7
+ version_verified: "3.10"
8
+ ---
9
+
10
+ <!-- doc-type: toolchain-reference -->
11
+
12
+ # cartconv: raw ROM binaries to a .CRT cartridge image, and back
13
+
14
+ ## Tool
15
+
16
+ cartconv wraps a raw ROM binary in the `.CRT` container that VICE, the
17
+ EasyFlash tools and most cartridge hardware menus read, and unwraps a
18
+ `.CRT` back to a binary. It ships with VICE and is on this machine at
19
+ `/opt/homebrew/bin/cartconv`. `cartconv --version` prints
20
+ `cartconv (VICE 3.10)`. Everything marked "run here" was done with that
21
+ build on 2026-09-23, booting the results in the windowless x64sc 3.10.
22
+
23
+ A game needs it when its code is assembled or compiled as a flat ROM
24
+ image and the emulator or the flash tool wants the container: the
25
+ header names the hardware type, and from that VICE decides which bank
26
+ register to emulate. The other route is to emit the `.CRT` from the
27
+ assembler itself, which is what the two KickAssembler cartridge recipes
28
+ do; cartconv then serves as the checker (`-c`) and the inspector (`-f`).
29
+
30
+ The licence in the frontmatter is VICE's, read from
31
+ `/opt/homebrew/opt/vice/COPYING` (GPL version 2 with the "any later
32
+ version" clause). cartconv is a build tool; the output carries none of
33
+ its code.
34
+
35
+ **Targets:** 6510
36
+
37
+ ## Build pipeline
38
+
39
+ Input is a raw binary with no load address (what KickAssembler's
40
+ `outBin` and Oscar64's `-tf=bin` write) or a PRG whose two-byte load
41
+ address cartconv strips. Output is a `.CRT`: a 64-byte header and one
42
+ `CHIP` packet per 8 KB or 16 KB of ROM. The reverse direction (`-t bin`)
43
+ concatenates the packets' data back into a binary.
44
+
45
+ ### .CRT — Cartridge image
46
+ **Produced by:** cartconv, kickassembler, oscar64
47
+ **Consumed by:** cartconv, vice
48
+
49
+ Header, then CHIP packets. The layout as decoded here is under "The
50
+ file, as decoded"; the reference table is in
51
+ [c64-file-formats](../formats/c64-file-formats.md), ".CRT".
52
+
53
+ ### .BIN — Raw ROM image
54
+ **Produced by:** kickassembler, oscar64, cartconv
55
+ **Consumed by:** cartconv
56
+
57
+ The bytes of the ROM in bank order, nothing else. For a banked type
58
+ the file is bank 0's 8 KB, then bank 1's, and so on.
59
+
60
+ ## Command line
61
+
62
+ ```text
63
+ cartconv -t normal -l 0x8000 -i bank0.bin -o normal.crt -n "NORMAL 8K" # generic 8 KB, type 0
64
+ cartconv -p -t md -i banks.bin -o md.crt -n "MAGIC DESK" # Magic Desk, type 19
65
+ cartconv -p -t ocean -i banks.bin -o ocean.crt -n "OCEAN" # Ocean, type 5
66
+ cartconv -f md.crt # print header and packet table
67
+ cartconv -c md.crt # check; exit 0 when sound (and when the file is missing)
68
+ cartconv -t bin -i md.crt -o md.bin # unwrap to a raw binary
69
+ cartconv --types # the type table with each name and id
70
+ ```
71
+
72
+ | Flag | Meaning (from `cartconv` with no arguments, exercised here where the text says so) |
73
+ |---|---|
74
+ | `-t <type>` | Output type, by short name or by `.CRT` hardware id (`md` or `19`). Run here with `normal`, `md`, `ocean`, `easy`. Without `-t` cartconv expects a `.crt` input and unwraps it to a binary; a raw binary given without `-t` is refused with `File is already in binary format` (run here). The `(Default bin->crt)` note in `--types` names the hardware type a binary becomes once `-t normal` or its id is given, not what happens when `-t` is omitted. |
75
+ | `-i`, `-o` | Input and output file names. |
76
+ | `-n <name>` | The 32-byte cartridge name field. Run here: written as given (case kept), zero-padded to 32 bytes. |
77
+ | `-l <addr>` | Load address of the input, decimal or `0x` hex. Run here with `0x8000` for the 8 KB type. Not run here without it. |
78
+ | `-p` | Accept an input whose size is not one of the type's sizes. Run here: a 16 KB binary was refused by `md`, `ocean` and `easy` with "Input file size (16384) doesn't match ... requirements", and accepted with `-p`. A 32 KB binary was accepted by `md` and `ocean` without it. |
79
+ | `-b` | Write every bank, including all-`$FF` ones. Run here on a 32 KB Magic Desk input: the file was byte-identical with and without `-b`, so the two empty banks were kept either way at this size. |
80
+ | `-s <rev>` | Hardware revision, the subtype byte. Run here with `-s 1` on `easy`: the version field became 1.01 and byte `$1A` became 1. |
81
+ | `-f <file>` | Print the header, the mode the EXROM and GAME bytes select, and one line per CHIP packet. |
82
+ | `-c <file>` | Check a `.CRT`. Run here: exit 0 on every file this page built, and also when the file cannot be opened (`Error: Can't open` is printed but the status is 0), so check the file exists before trusting the status. |
83
+ | `-r` | Repair mode: accept a broken input. Not run here. |
84
+ | `-q`, `-v` | Quiet, verbose. |
85
+ | `--options-file` | Write the options that reverse the conversion. Not run here. |
86
+
87
+ ## Type table
88
+
89
+ Ids and short names are cartconv's own (`--types`, run here). The bank
90
+ register and the bank size are measured only where the row says so: the
91
+ program in "Boot results" wrote the register from RAM and read a marker
92
+ byte back from the new bank.
93
+
94
+ | Type | Id | Short name | Bank register | Bank at `$8000` | Rung |
95
+ |---|---|---|---|---|---|
96
+ | Generic 8 KB / 16 KB | 0 | `normal` | none | 8 KB, or 16 KB with `$A000` | measured: a write to `$DE00` changed nothing |
97
+ | Ocean | 5 | `ocean` | `$DE00` | 8 KB, and the same 8 KB seen at `$A000` | measured in VICE with a 32 KB image; larger Ocean images not measured here |
98
+ | Magic Desk | 19 | `md` | `$DE00` | 8 KB | measured; the bit that switches the ROM off is not measured here |
99
+ | EasyFlash | 32 | `easy` | `$DE00`, mode in `$DE02` | 8 KB ROML plus 8 KB ROMH per bank | from `cartridge_bank_easyflash` in [memory-banking](../techniques/memory-banking.md) and the `easyflash-save` recipe, not measured here |
100
+ | Magic Desk 16K | 85 | `md16` | not measured here | 16 KB | cartconv's table only |
101
+ | C64 Games System | 15 | `gs` | not measured here | not measured here | cartconv's table only |
102
+ | GMod2 | 60 | `gmod2` | not measured here | not measured here | cartconv's table only |
103
+ | Action Replay V5 | 1 | `ar5` | not measured here | not measured here | cartconv's table only |
104
+ | Final Cartridge III | 3 | `fc3` | not measured here | not measured here | cartconv's table only |
105
+ | Retro Replay | 36 | `rr` | not measured here | not measured here | cartconv's table only |
106
+
107
+ `ulti` (Ultimax, 4, 8 or 16 KB) has no id of its own: it is type 0 with
108
+ EXROM high and GAME low.
109
+
110
+ ## The file, as decoded
111
+
112
+ Every `.CRT` this page built was read with the script below and with
113
+ `cartconv -f`, and the two agreed on every field.
114
+
115
+ ```text
116
+ import struct, sys
117
+ for path in sys.argv[1:]:
118
+ d = open(path, "rb").read()
119
+ hlen, ver, hw, exrom, game = struct.unpack(">IHHBB", d[16:26])
120
+ name = d[32:64].split(b"\0")[0].decode("ascii", "replace")
121
+ print(path, len(d), d[0:16], hlen, f"{ver>>8}.{ver&255:02d}", hw, exrom, game, name)
122
+ off = hlen
123
+ while off + 16 <= len(d):
124
+ plen, ctype, bank, load, size = struct.unpack(">IHHHH", d[off+4:off+16])
125
+ print(f" CHIP@{off:#x} {d[off:off+4]} len {plen} type {ctype} bank {bank}"
126
+ f" load ${load:04X} size {size} first {d[off+16]:02X} last {d[off+16+size-1]:02X}")
127
+ off += plen
128
+ ```
129
+
130
+ Header, 64 bytes, every multi-byte field big-endian:
131
+
132
+ | Offset | Size | Field | Run here |
133
+ |---|---|---|---|
134
+ | `$00` | 16 | `C64 CARTRIDGE` and three spaces | every file |
135
+ | `$10` | 4 | header length | `$40` in every file |
136
+ | `$14` | 2 | version | `$0100` (1.00); `$0101` after `-s 1` |
137
+ | `$16` | 2 | hardware type | 0, 5, 19, 32 as ordered |
138
+ | `$18` | 1 | EXROM line level, 0 low | 0 for types 0, 5, 19; 1 for cartconv's EasyFlash |
139
+ | `$19` | 1 | GAME line level, 0 low | 1 for types 0 (8 KB) and 19; 0 for type 5 and cartconv's EasyFlash |
140
+ | `$1A` | 1 | hardware revision (subtype), 0 unless `-s` | 0; 1 after `-s 1`, which `-f` prints as "Hardware Revision: 1" |
141
+ | `$1B` | 5 | reserved | zero |
142
+ | `$20` | 32 | name, zero-padded | as given to `-n`, or `OSCAR` from Oscar64 |
143
+
144
+ CHIP packet, 16 bytes then the data:
145
+
146
+ | Offset | Size | Field | Run here |
147
+ |---|---|---|---|
148
+ | `$00` | 4 | `CHIP` | every packet |
149
+ | `$04` | 4 | packet length including these 16 bytes | `$2010` for 8 KB, `$4010` for 16 KB |
150
+ | `$08` | 2 | chip type: 0 ROM, 1 RAM, 2 flash | 0 from cartconv for types 0, 5, 19 and from Oscar64 for every target; 2 from cartconv for `easy` |
151
+ | `$0A` | 2 | bank number | 0, 1, 2, 3 in order for the banked types |
152
+ | `$0C` | 2 | load address | `$8000`; `$A000` for cartconv's EasyFlash ROMH; `$E000` for Oscar64's |
153
+ | `$0E` | 2 | data size | `$2000`, or `$4000` for Oscar64's `crt16` |
154
+
155
+ Sizes seen: 8,272 bytes for one 8 KB packet (64 + 8,208); 32,896 for
156
+ Magic Desk and Ocean from a 16 KB input, because cartconv padded the
157
+ image to four banks and wrote all four; 16,480 for EasyFlash from the
158
+ same input, split into bank 0 ROML at `$8000` and bank 0 ROMH at `$A000`.
159
+
160
+ ## Boot results
161
+
162
+ One program, two 8 KB banks (the `crt-banked` recipe's listing, with
163
+ `outBin` writing the raw banks instead of the container). Bank 0 boots
164
+ through the `CBM80` signature, prints the marker byte it sees at `$9FFF`
165
+ and the byte at `$BFFF`, copies a routine to `$0334`, and that routine
166
+ writes 1 to `$DE00`, calls a routine at `$9FF0` in the new bank, reads
167
+ `$9FFF` and `$BFFF`, and writes 0 back. Bank 1's routine turns the border
168
+ green. Bank 0's marker is `$B0`, bank 1's `$B1`. Each file was booted
169
+ with `x64sc -default -warp +sound -limitcycles 4000000 -exitscreenshot
170
+ out.png -cartcrt file.crt`; VICE picked the hardware from the header,
171
+ with no per-type option. The text was read from the PNG with the
172
+ char-ROM decoder.
173
+
174
+ | File | Line 1 | Line 2 | Border | Reading |
175
+ |---|---|---|---|---|
176
+ | `normal.crt` (type 0, 8 KB) | `BANK 0 BYTE B0 HI E0` | `BANK 1 BYTE B0 HI E0` | red | the `$DE00` write changed nothing; `$BFFF` is BASIC ROM (`$E0`) |
177
+ | `md.crt` (type 19) | `BANK 0 BYTE B0 HI E0` | `BANK 1 BYTE B1 HI E0` | green | `$DE00` = 1 put bank 1 at `$8000`; `$A000` stayed BASIC: 8 KB mode |
178
+ | `ocean.crt` (type 5) | `BANK 0 BYTE B0 HI B0` | `BANK 1 BYTE B1 HI B1` | green | `$DE00` = 1 switched both windows; `$BFFF` reads the same bank as `$9FFF`, so VICE mirrors the 8 KB bank at `$A000` for this image size |
179
+ | `easy.crt` (type 32, from the same binary with `-p`) | none | none | orange screen | no program: EasyFlash boots in Ultimax mode from bank 0 ROMH at `$E000`, and this binary's second 8 KB is bank 1's ROML, not a ROMH with a reset vector |
180
+
181
+ The red border on the generic type is the program's own failure path:
182
+ the marker did not change, so the switch did not happen, which is the
183
+ correct result for a cartridge with no bank register. The EasyFlash row
184
+ is a statement about the input layout, not about cartconv or the type:
185
+ a working EasyFlash image is built in the `easyflash-save` recipe.
186
+
187
+ Oscar64's own containers, from a program that sets the border green and
188
+ loops: `-tf=crt8` wrote type 0, EXROM 0, GAME 1, one 8 KB packet;
189
+ `-tf=crt16` wrote type 0, EXROM 0, GAME 0, one 16 KB packet; `-tf=crt`
190
+ wrote type 32 with EXROM 0, GAME 0, bank 0 ROML at `$8000` and bank 0
191
+ ROMH at `$E000`, both chip type 0. `crt8` and `crt` booted green in
192
+ x64sc; `crt16` was not booted here. Note the EasyFlash header
193
+ difference: cartconv writes EXROM 1, GAME 0 and chip type 2 for the same
194
+ hardware id. VICE booted both. Which one a flash tool prefers was not
195
+ measured here.
196
+
197
+ ## Build integration
198
+
199
+ **KickAssembler.** Two routes. Emit the banks as raw binaries with
200
+ `.segmentdef Bank0 [start=$8000, min=$8000, max=$9fff, fill,
201
+ fillByte=$ff]` per bank, gather them in bank order with `.segmentout`
202
+ into a segment with `outBin="banks.bin"`, and run cartconv. Or write
203
+ the container from the source: a `Crt` segment starting at 0 with
204
+ `outBin="name.crt"` that lays down the 64-byte header, then for each
205
+ bank a 16-byte `CHIP` packet followed by `.segmentout
206
+ [segments="BankN"]`. The `crt-banked` and `easyflash-save` recipes do
207
+ the second; the verifier here boots those files directly, so a recipe's
208
+ listing must take that route. KickAssembler 5.25 has no cartridge
209
+ directive: `.crt` and `.bank` both stop the assembler with `Invalid
210
+ directive` (run here). An earlier version of the formats page said it
211
+ produced `.CRT` files through those two directives; it does not.
212
+
213
+ **Oscar64.** `-tf=crt8` and `-tf=crt16` write a generic type 0
214
+ container; `-tf=crt` writes EasyFlash, with `-cid`, `-csub` and `-cname`
215
+ to override the id, subtype and name
216
+ ([oscar64-reference](oscar64-reference.md), "CLI flags" and "Memory
217
+ layout and banking"). No cartconv step is needed; `cartconv -f` still
218
+ reads the result, and `-t bin` unwraps it when a flash tool wants the
219
+ raw image.
220
+
221
+ **Checking.** `cartconv -c` exits 0 on a sound file. Run here on three
222
+ damaged copies: a bank 16 bytes short of its packet header's claim, and a
223
+ file cut off before its last bank, both exited 255 with `this file seems
224
+ broken`; a packet length larger than the data that follows it only
225
+ printed `chunk length exceeds data size` and exited 0, so read the
226
+ output as well as the status. It also exits 0 when it cannot open the
227
+ file (run here), so a script should test that the file exists first.
228
+ `cartconv -f`
229
+ prints what VICE will see. Run both on any hand-emitted container before
230
+ blaming the emulator: a wrong packet length makes the next `CHIP`
231
+ signature land in the wrong place, and VICE's error names the offset.
232
+
233
+ ## Pitfalls
234
+
235
+ **The input size must match the type, or pass `-p`.** Run here: 16 KB
236
+ was refused by `md`, `ocean` and `easy`. The refusal names the size and
237
+ the type. With `-p` cartconv pads to the next size in its table, so the
238
+ file is bigger than the code: 32,896 bytes for two banks of Magic Desk.
239
+
240
+ **A banked binary is bank order, not address order.** Bank 1's 8 KB
241
+ follows bank 0's in the file even though both map at `$8000`. For
242
+ EasyFlash the order is bank 0 ROML, bank 0 ROMH, bank 1 ROML, and so on
243
+ (from the `-p easy` split, run here, and the `easyflash-save` recipe).
244
+ Feeding a Magic Desk layout to `easy` produces a file that checks clean
245
+ and does not boot.
246
+
247
+ **Code that switches banks cannot run from the bank it switches out.**
248
+ The routine that writes `$DE00` must be in RAM or in a bank that stays
249
+ mapped. The measurement program copies it to `$0334`.
250
+
251
+ **`-t` names are short and unlike the hardware names.** `md` is Magic
252
+ Desk, `easy` is EasyFlash, `normal` is the generic type; `--types`
253
+ prints the whole table. A number works too, and it is the `.CRT`
254
+ hardware id, so `-t 19` and `-t md` are the same request.
255
+
256
+ ## See also
257
+
258
+ - [crt-banked](../recipes/kickassembler/crt-banked.md): the two-bank Magic Desk program above, emitting its own `.CRT`.
259
+ - [easyflash-save](../recipes/kickassembler/easyflash-save.md): an EasyFlash container with a ROMH boot bank, written from KickAssembler.
260
+ - `cartridge_bank_easyflash` in [memory-banking](../techniques/memory-banking.md): the EasyFlash registers.
261
+ - [oscar64-reference](oscar64-reference.md): `-tf=crt`, `-cid`, `-csub`, `-cname` and `__bankof`.
262
+ - [c64-file-formats](../formats/c64-file-formats.md): the `.CRT` field tables.