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,1020 @@
1
+ ---
2
+ tool: kickassembler
3
+ tool_kind: assembler
4
+ maintainer: Mads Nielsen (Camelot)
5
+ license: Freeware (royalty-free for non-commercial; commercial use permitted)
6
+ home_url: http://theweb.dk/KickAssembler/
7
+ version_verified: "5.25"
8
+ ---
9
+
10
+ <!-- doc-type: toolchain-reference -->
11
+
12
+ # KickAssembler — 6502 Cross-Assembler
13
+
14
+ ## Tool
15
+
16
+ KickAssembler (version 5.25 as of this writing) is a cross-assembler for the
17
+ MOS 65xx family, written and maintained by Mads Nielsen (Camelot). It pairs a
18
+ traditional assembler with a JavaScript-like script language that runs at
19
+ assembly time. The script layer makes it straightforward to generate sine
20
+ tables, sprite coordinate arrays, and other data directly in the source file
21
+ without reaching for an external tool. The script and the assembler are
22
+ integrated — script variables, constants, and loops interleave with mnemonics
23
+ rather than running as a separate pre-pass.
24
+
25
+ **Targets:** 6510
26
+
27
+ KickAssembler is the second tool in the c64-kb toolchain ranking. It is the
28
+ preferred choice when a task demands cycle-counted raster effects, sprite
29
+ multiplexing, FLI/AFLI modes, or a full-assembly cracktro where every cycle
30
+ matters. It is not the general-purpose workhorse; for projects where
31
+ readability, refactorability, and C-level abstractions matter more than
32
+ squeezing a handful of cycles per scanline, Oscar64 is the better pick.
33
+
34
+ ## Quick reference
35
+
36
+ Install a Java runtime — Java 11 or later recommended, but the vendor's
37
+ stated minimum is Java 8: the bundled 5.25 manual says "Java 8.0 or higher",
38
+ and the 5.25 jar is compiled as Java 8 bytecode (all 548 classes are
39
+ class-file major 52, read from the jar). The download page offers a Java 11
40
+ runtime as a convenience; Java 11/17/21 LTS and Java 26 are the versions
41
+ exercised here. An earlier version of this page said "Java 11 or later" as if
42
+ it were the minimum. Download `KickAssembler.zip` from
43
+ `http://theweb.dk/KickAssembler/`, unzip to a convenient directory, and
44
+ assemble with:
45
+
46
+ ```
47
+ java -jar KickAss.jar source.asm
48
+ ```
49
+
50
+ Common flags:
51
+
52
+ | Flag | Effect |
53
+ |------|--------|
54
+ | `-o output.prg` | Rename the output file |
55
+ | `-odir dir/` | Write all output files to a directory |
56
+ | `-symbolfile` | Write a `.sym` label file alongside the output |
57
+ | `-vicesymbols` | Write a `.vs` VICE monitor label file |
58
+ | `-libdir path` | Add a search path for `#import` and `LoadSid`/`LoadBinary` |
59
+ | `-define SYM` | Define a preprocessor symbol |
60
+ | `-showmem` | Print a memory map after assembly |
61
+ | `-asminfo all` | Write assembly metadata to `asminfo.txt` — a plain-text file with `[section]` headers and semicolon-separated fields (not XML; an earlier version of this row gave `-asminfo file.xml`, which 5.25 rejects with "Invalid asminfo type: file.xml" and writes nothing). The argument is a selector, not a file name: `all`, `allPredefined`, `allSourceSpecific`, or section names (`version`, `libraries`, `directives`, `ppdirectives`, `errors`, `syntax`, `files`) joined with `\|`. Use `-asminfofile name.txt` to rename the output, or `-asminfotostdout` to print it instead. `labels` is not a selector ("Invalid asminfo type: labels") |
62
+ | `-pseudoc3x` | Accept 3.x pseudo-command argument separator (semicolon) |
63
+
64
+ By default, KickAssembler writes a single `.prg` file whose name matches the
65
+ source file. Multiple output files (`.prg`, `.d64`, `.bin`, `.sym`, `.vs`) are
66
+ produced when segments or the `-symbolfile` / `-vicesymbols` flags request
67
+ them.
68
+
69
+ ## Build pipeline
70
+
71
+ **Targets:** 6510
72
+
73
+ ### .PRG — Program file (executable)
74
+ **Produced by:** kickassembler, oscar64, cc65
75
+ **Consumed by:** vice
76
+
77
+ The primary output. KickAssembler prepends a two-byte load address (little-
78
+ endian) before the assembled bytes. The default name matches the source file.
79
+ Use `-o` to override.
80
+
81
+ ### .BIN — Raw binary
82
+ **Produced by:** kickassembler
83
+ **Consumed by:** vice
84
+
85
+ A headerless byte dump. Produced when a segment uses `outBin="filename.bin"`.
86
+ Useful for code that is not loaded by the KERNAL (cartridge ROMs, raw block
87
+ copy targets).
88
+
89
+ ### .D64 — 1541 disk image
90
+ **Produced by:** kickassembler
91
+ **Consumed by:** vice
92
+
93
+ KickAssembler can create D64 images directly via the `.disk` directive, which
94
+ wraps the CC1541 library. You can mix assembled segments and files from the
95
+ host filesystem in the same image.
96
+
97
+ ### .SYM — KickAssembler symbol file
98
+ **Produced by:** kickassembler
99
+
100
+ Generated by `-symbolfile`. Contains `.label` declarations; labels declared
101
+ inside `.namespace` blocks (or under `.filenamespace`) are exported inside
102
+ matching `.namespace` blocks, everything else is flat (an earlier version of
103
+ this page said every label was wrapped in a namespace; measured on 5.25, a
104
+ top-level `clearScreen:` exports as a bare `.label clearScreen=$80e`). Other
105
+ source files consume it via `.import source "file.sym"` to reference labels
106
+ across separately assembled units. `KickAss.cfg` on this machine already
107
+ contains `-symbolfile -showmem`, so a `.sym` is written on every build without
108
+ the flag.
109
+
110
+ ### .VS — VICE monitor symbol file
111
+ **Produced by:** kickassembler
112
+ **Consumed by:** vice
113
+
114
+ Generated by `-vicesymbols`. Each line is `al C:<hex address> .<name>` (an
115
+ `add_label` monitor command; the `C:` memspace prefix was missing from an
116
+ earlier version of this line). Load at startup with `-moncommands file.vs`,
117
+ or interactively with `ll "file.vs"` (load_labels) — not `:load`, which is not
118
+ a monitor command.
119
+ vice-mcp reads `.vs` files to resolve label names during introspection.
120
+
121
+ ## Syntax overview
122
+
123
+ ### Labels
124
+
125
+ Labels end with a colon at declaration and are bare at the call site:
126
+
127
+ ```asm
128
+ loop:
129
+ inc $d020
130
+ jmp loop
131
+ ```
132
+
133
+ Multi-labels (anonymous) start with `!`. Reference them with `!label-` (previous)
134
+ or `!label+` (next). Bare `!:` and `!+` / `!-` work for quick forward/backward
135
+ jumps:
136
+
137
+ ```asm
138
+ ldx #100
139
+ !loop:
140
+ dex
141
+ bne !loop-
142
+ ```
143
+
144
+ Argument labels name the argument of a mnemonic for self-modifying code:
145
+
146
+ ```asm
147
+ ldx tmpX:#$00 // 'tmpX' names the immediate byte
148
+ ```
149
+
150
+ `*` returns the current program counter value.
151
+
152
+ ### Number formats
153
+
154
+ | Prefix | Base | Example |
155
+ |--------|------|---------|
156
+ | (none) | Decimal | `42` |
157
+ | `$` | Hexadecimal | `$d020` |
158
+ | `%` | Binary | `%10110001` |
159
+
160
+ `<` is the low-byte operator; `>` is the high-byte operator.
161
+
162
+ ### Addressing modes
163
+
164
+ | Notation | Mode |
165
+ |----------|------|
166
+ | `lda #$30` | Immediate |
167
+ | `lda $30` | Zero-page |
168
+ | `lda $30,x` | Zero-page,X |
169
+ | `ldx $30,y` | Zero-page,Y |
170
+ | `lda ($30,x)` | Indirect zero-page,X |
171
+ | `lda ($30),y` | Indirect zero-page,Y |
172
+ | `lda $1000` | Absolute |
173
+ | `lda $1000,x` | Absolute,X |
174
+ | `lda $1000,y` | Absolute,Y |
175
+ | `jmp ($1000)` | Indirect |
176
+ | `bne loop` | Relative (branch) |
177
+
178
+ Force absolute mode with `.abs` / `.a`; force zero-page with `.zp` / `.z`:
179
+
180
+ ```kickassembler
181
+ lda.abs $0030,x // force absolute even though address fits in zero-page
182
+ ```
183
+
184
+ ### Comments
185
+
186
+ Line comments are `//` only. `;` is NOT a comment — the semicolon is the
187
+ statement separator (`lda #$00 ; sta $d020` assembles both instructions) and
188
+ the separator inside `.for(init; cond; step)` headers — so text after it is
189
+ parsed as code, giving "Pseudo command '<word>' not defined" and/or "Unknown
190
+ symbol '<word>'" (measured on 5.25). Block comments `/* ... */` ARE
191
+ supported, may span lines, and may appear inside a statement
192
+ (`sta /* note */ $d021`). An earlier version of this page had both facts
193
+ backwards, and four of its own fences carried `;` comments that did not
194
+ assemble.
195
+
196
+ ## Directives
197
+
198
+ The assembler directive set covers both classic output and the script layer.
199
+
200
+ | Directive | Syntax example | Purpose |
201
+ |-----------|----------------|---------|
202
+ | `.byte` / `.by` | `.byte $01,$02,$03` | Output bytes |
203
+ | `.word` / `.wo` | `.word $1000` | Output 16-bit little-endian words |
204
+ | `.dword` / `.dw` | `.dword $12341234` | Output 32-bit little-endian values |
205
+ | `.text` / `.te` | `.text "Hello"` | Output text using current encoding |
206
+ | `.encoding` | `.encoding "petscii_upper"` | Set character encoding for `.text` |
207
+ | `.fill` | `.fill 256, 127.5+127.5*sin(toRadians(i*360/256))` | Fill N bytes with an expression (loop var: `i`); sine, reciprocal and multiply table forms and their verification are `table_generation` in `../techniques/cpu-cycle-tricks.md` |
208
+ | `.fillword` | `.fillword 5, i*$80` | Fill N words |
209
+ | `.lohifill` | `.lohifill $100, i*40` | Fill a lo-byte table followed by a hi-byte table |
210
+ | `.const` | `.const DELAY=7` | Define an immutable script constant |
211
+ | `.var` | `.var x=27` | Define a mutable script variable |
212
+ | `.eval` | `.eval x=x+1` | Evaluate a script expression |
213
+ | `.if` | `.if(x>10) { ... } else { ... }` | Conditional assembly |
214
+ | `.for` | `.for(var i=0; i<8; i++) { ... }` | Counted loop |
215
+ | `.while` | `.while(i<10) { ... }` | Condition loop |
216
+ | `.return` | `.return width*height` | Return from a `.function` |
217
+ | `.assert` | `.assert "msg", got, expected` | Compare two values at assembly time and print the result. A mismatch prints `ERROR IN ASSERTION` but still writes the PRG and exits 0 (measured on 5.25) — it does not guard the build; use `.errorif` for that |
218
+ | `.errorif` | `.errorif addr >= $100, "operand not in zero page"` | Abort assembly with a message if the condition is true: exit 1, no output file (measured on 5.25) |
219
+ | `.error` | `.error "unsupported configuration"` | Unconditionally abort assembly with a message: exit 1, no output file (measured on 5.25) |
220
+ | `.label` | `.label color=$d020` | Assign a value to a label name |
221
+ | `.align` | `.align $100` | Advance PC to next multiple of value |
222
+ | `.cpu` | `.cpu _65c02` | Switch CPU instruction set |
223
+ | `.zp` | `.zp { reg: .byte 0 }` | Mark unresolved labels as zero-page |
224
+ | `.print` | `.print "init=$"+toHexString(init)` | Print to console at assembly time |
225
+
226
+ Supported CPU identifiers: `_6502NoIllegals`, `_6502` (default; includes
227
+ illegal opcodes), `dtv`, `_65c02`.
228
+
229
+ ## Memory layout
230
+
231
+ The whole-program view (which constraints decide a layout, one worked layout in all three toolchains, and how to confirm it from `-showmem`) is `memory-layout-planning.md`, with the recipe `../recipes/kickassembler/memory-layout.md`.
232
+
233
+ The program counter is set with `*=` (preferred in 5.x) or the older `.pc=`
234
+ alias:
235
+
236
+ ```asm
237
+ *=$0801 "BASIC start"
238
+ BasicUpstart2(main)
239
+
240
+ *=$0810 "main"
241
+ main:
242
+ lda #0
243
+ sta $d020
244
+ jmp *
245
+ ```
246
+
247
+ The optional string after the address names the memory block. The `-showmem`
248
+ flag prints a memory map of all named blocks after assembly.
249
+
250
+ Use `virtual` to reserve an address range without writing it to the output
251
+ file:
252
+
253
+ ```asm
254
+ *=$0002 "ZP scratch" virtual
255
+ zpTmp1: .byte 0
256
+ zpTmp2: .byte 0
257
+ ```
258
+
259
+ Virtual blocks can overlap non-virtual blocks; only the non-virtual bytes are
260
+ written.
261
+
262
+ ### Segments
263
+
264
+ Segments let you split output into multiple files or disk tracks:
265
+
266
+ ```asm
267
+ .segment Code [outPrg="code.prg"]
268
+ *=$1000
269
+ jsr init
270
+ jmp *
271
+
272
+ .segment Data [outBin="data.bin"]
273
+ *=$2000
274
+ .fill 1024, 0
275
+ ```
276
+
277
+ Only the Default segment goes to the normal output file (the one named after
278
+ the source, or by `-o`). A named segment whose bytes are not directed anywhere
279
+ — no `outPrg`/`outBin` parameter, not listed in a `.file` or `.disk`
280
+ directive, and not pulled into another segment via `segments=` — is
281
+ assembled, appears in the `-showmem` map, and is written nowhere, with no
282
+ warning (measured on 5.25: an earlier version of this example declared
283
+ `.segment Code []`, and the Code segment vanished silently, with and without
284
+ `-o`).
285
+
286
+ Define a segment explicitly with `.segmentdef`:
287
+
288
+ ```asm
289
+ .segmentdef Code [start=$1000, max=$1fff]
290
+ .segmentdef Music [start=$2000, max=$4fff]
291
+ .segmentdef Screen [start=$0400, max=$07ff]
292
+ ```
293
+
294
+ Switch the active segment with `.segment SegName`. Use
295
+ `.file [name="out.prg", segments="Code,Data"]` to write a combined `.prg`
296
+ from multiple segments.
297
+
298
+ ## Multi-file projects
299
+
300
+ KickAssembler has no object files and no linker. A program is split in one of
301
+ two ways. Both were built on 5.25 with the files below and produced a
302
+ byte-identical `main.prg` (2,056 bytes); each PRG was run in VICE x64sc 3.10
303
+ and turned the border and screen green.
304
+
305
+ **`#import`: one assembly.** The module is pasted into the caller's parse, so
306
+ it shares one symbol table, one memory map and every macro and `.const`.
307
+ This is the right form for almost everything: shared macros, constants,
308
+ zero-page allocations, and code that changes as often as the caller does.
309
+ Put `#importonce` at the top of a library file (see Preprocessor). The module
310
+ wraps its labels in a `.namespace` so the caller writes `border.set`:
311
+
312
+ ```asm
313
+ // border_inc.asm
314
+ .namespace border {
315
+ *=$1000 "border module"
316
+ set:
317
+ sta $d020
318
+ sta $d021
319
+ rts
320
+ }
321
+ ```
322
+
323
+ ```text
324
+ // inc_main.asm
325
+ #import "border_inc.asm"
326
+ *=$0801 "basic"
327
+ BasicUpstart2(main)
328
+ *=$0810 "main"
329
+ main:
330
+ lda #5
331
+ jsr border.set
332
+ jmp *
333
+ ```
334
+
335
+ ```
336
+ java -jar KickAss.jar inc_main.asm -o main.prg -showmem
337
+ ```
338
+
339
+ **Separate assembly: `-symbolfile` plus `.import source`.** Each file is
340
+ assembled on its own. The module writes a `.sym` file of its label addresses;
341
+ the caller reads that file for the addresses and the module's `.prg` for the
342
+ bytes. This is the right form when the module is large and rarely changes (a
343
+ music player, a converted picture), lives at a fixed address, or is assembled
344
+ by a different build step. The module declares `.filenamespace`, which is what
345
+ puts its labels in a named block in the `.sym`:
346
+
347
+ ```asm
348
+ // border.asm: assembled first, on its own
349
+ .filenamespace border
350
+ *=$1000 "border module"
351
+ set: // A = colour
352
+ sta $d020
353
+ sta $d021
354
+ rts
355
+ ```
356
+
357
+ ```
358
+ java -jar KickAss.jar border.asm -o border.prg -symbolfile
359
+ ```
360
+
361
+ That writes `border.prg` (9 bytes: a two-byte load address and seven bytes of
362
+ code) and `border.sym`, which is exactly:
363
+
364
+ ```text
365
+ .namespace border {
366
+ .label set=$1000
367
+ }
368
+ ```
369
+
370
+ The caller imports the addresses and places the bytes at the same `*=`; the
371
+ `, 2` on `.import binary` skips the module's load address:
372
+
373
+ ```asm
374
+ // main.asm: assembled second
375
+ .import source "border.sym"
376
+ *=$0801 "basic"
377
+ BasicUpstart2(main)
378
+ *=$0810 "main"
379
+ main:
380
+ lda #5
381
+ jsr border.set
382
+ jmp *
383
+ *=$1000 "border bytes"
384
+ .import binary "border.prg", 2
385
+ ```
386
+
387
+ ```
388
+ java -jar KickAss.jar main.asm -o main.prg -showmem
389
+ ```
390
+
391
+ Two things go wrong with this form, both measured on 5.25 (sources in
392
+ `error-sources/kickassembler/`):
393
+
394
+ - The module has no `.filenamespace`, so its `.sym` is a flat
395
+ `.label set=$1000` and a namespaced call fails. The shipped source
396
+ (`import-source-no-namespace.asm`, against `flat-lib.sym`) calls
397
+ `jsr lib.set`:
398
+
399
+ ```text
400
+ Error: Unknown symbol 'lib'
401
+ at line 4, column 9 in import-source-no-namespace.asm
402
+ ```
403
+
404
+ Either add `.filenamespace border` to the module, or call the flat name
405
+ (`jsr set`).
406
+
407
+ - Without a namespace the module's labels land in the caller's own scope, so a
408
+ label both files use (here `main`) collides:
409
+
410
+ ```text
411
+ Error: The symbol 'main' is already defined
412
+ at line 4, column 1 in symbol-clash-main.asm
413
+ ```
414
+
415
+ `.filenamespace` in the module is the fix for this too.
416
+
417
+ The `.sym` holds addresses, nothing else: no macros, no `.const` values, no
418
+ code. And it is a snapshot. Rebuild the module and the caller's copy of the
419
+ addresses is stale until the caller is assembled again, so a build script
420
+ always assembles the module first and the caller second. For the `.sym` and
421
+ `.vs` formats themselves see "Symbol export for VICE/vice-mcp" below;
422
+ `-showmem` on the caller lists the imported bytes as an ordinary block
423
+ (`$1000-$1006 border bytes`).
424
+
425
+ ## Macros and pseudocommands
426
+
427
+ ### Macros
428
+
429
+ A macro groups assembler directives for inline expansion. Call site labels do
430
+ not collide across invocations because each call gets its own scope:
431
+
432
+ ```asm
433
+ .macro FillColourRam(colour) {
434
+ lda #colour
435
+ ldx #250
436
+ next: dex // 249 down to 0, four quarters of 250
437
+ sta $d800,x
438
+ sta $d800+250,x
439
+ sta $d800+500,x
440
+ sta $d800+750,x
441
+ bne next // Z from dex; sta leaves the flags alone
442
+ }
443
+
444
+ FillColourRam(1) // white
445
+ FillColourRam(14) // light blue; this call's `next` is its own label
446
+ ```
447
+
448
+ The leading `:` before a macro call is optional from version 4.0 but
449
+ disambiguates a macro call from a mnemonic of the same name.
450
+
451
+ Macros may call other macros or themselves (recursive, with a termination
452
+ condition). They may be used before they are declared.
453
+
454
+ ### Pseudocommands
455
+
456
+ Pseudocommands behave like custom mnemonics: they accept addressing-mode
457
+ arguments separated by colons. Inside the body, arguments are `CmdValue`
458
+ objects; inspect them with `.getType()` and `.getValue()`:
459
+
460
+ ```kickassembler
461
+ .pseudocommand store value : dest {
462
+ lda value
463
+ sta dest
464
+ }
465
+
466
+ store #0 : $d020 // lda #0 / sta $d020
467
+ store table,y : $0400,x // lda table,y / sta $0400,x
468
+ ```
469
+
470
+ Use `CmdArgument(AT_IMMEDIATE, value)` to construct new argument values
471
+ programmatically inside a pseudocommand body.
472
+
473
+ ## Functions and scripting
474
+
475
+ `.function` defines a reusable script-layer computation that returns a value.
476
+ Functions may be overloaded by argument count:
477
+
478
+ ```asm
479
+ .function area(w, h) {
480
+ .return w * h
481
+ }
482
+
483
+ .const SPRITE_BYTES = area(3, 21)
484
+ lda #area(4, 8) + 10
485
+ ```
486
+
487
+ Functions support `.if`, `.for`, `.while`, `.var`, and `.return` but do not
488
+ generate bytes directly. The script language includes:
489
+
490
+ - **Math**: `sin()`, `cos()`, `toRadians()`, `abs()`, `floor()`, `round()`,
491
+ `min()`, `max()`, `pow()`, `log()`, `sqrt()`, `mod()`
492
+ - **String**: `toHexString()`, `toBinaryString()`, string concatenation with `+`
493
+ - **Collections**: `List()`, `Hashtable()`, `.add()`, `.get()`, `.set()`,
494
+ `.size()`
495
+ - **Type conversion**: `.asNumber()`, `.asBoolean()`, `.asString()`
496
+
497
+ Use `.eval` to mutate a variable in-line; use `.var` to declare mutable
498
+ script variables; use `.const` for true constants.
499
+
500
+ ## Preprocessor
501
+
502
+ KickAssembler's preprocessor runs before the main parse pass. It mirrors C#
503
+ preprocessor conventions. Directives start with `#`.
504
+
505
+ | Directive | Example | Effect |
506
+ |-----------|---------|--------|
507
+ | `#define` | `#define NTSC` | Define a preprocessor symbol |
508
+ | `#undef` | `#undef NTSC` | Remove a symbol |
509
+ | `#if` | `#if NTSC` ... `#endif` | Conditional include |
510
+ | `#elif` | `#elif DEBUG` ... | Else-if branch |
511
+ | `#else` | `#else` ... | Else branch |
512
+ | `#endif` | `#endif` | Close a `#if` block |
513
+ | `#import` | `#import "lib.asm"` | Include a file |
514
+ | `#importif` | `#importif STANDALONE "upstart.asm"` | Conditional import |
515
+ | `#importonce` | `#importonce` | Guard a file against double inclusion |
516
+
517
+ Define from the command line: `java -jar KickAss.jar src.asm -define NTSC`.
518
+
519
+ `#importonce` belongs in library files. Unlike a traditional include guard it
520
+ is a per-file flag, not a macro:
521
+
522
+ ```asm
523
+ // lib.asm
524
+ #importonce
525
+ .macro WaitRaster(line) { ... }
526
+ ```
527
+
528
+ ## Importing data
529
+
530
+ ### Binary files
531
+
532
+ `.import binary "file.bin"` embeds the raw bytes of a file at the current PC.
533
+ Optional offset and length parameters trim the import:
534
+
535
+ ```asm
536
+ .import binary "charset.bin", 0, $0800 // first 2 KB only
537
+ ```
538
+
539
+ For programmatic access to individual bytes, use `LoadBinary()`:
540
+
541
+ ```asm
542
+ .var data = LoadBinary("mytable.bin")
543
+ table: .fill data.getSize(), data.get(i)
544
+ ```
545
+
546
+ `data.uget(i)` returns unsigned bytes (0–255); `data.get(i)` returns signed
547
+ (Java convention, so `$ff` = -1).
548
+
549
+ KickAssembler ships built-in format constants for common graphics formats:
550
+
551
+ | Constant | Blocks |
552
+ |----------|--------|
553
+ | `BF_C64FILE` | Skips the two-byte load address |
554
+ | `BF_KOALA` | `Bitmap, ScreenRam, ColorRam, BackgroundColor` |
555
+ | `BF_BITMAP_SINGLECOLOR` | `Bitmap, ScreenRam` (Bitmap at +$0000, ScreenRam at +$2000; `.print BF_BITMAP_SINGLECOLOR` on 5.25 — an earlier version of this row had the order reversed) |
556
+ | `BF_FLI` | `ColorRam, ScreenRam, Bitmap` |
557
+ | `BF_DOODLE` | `ColorRam, Bitmap` |
558
+
559
+ ```asm
560
+ .var pic = LoadBinary("scene.prg", BF_KOALA)
561
+ *=$2000; .fill pic.getBitmapSize(), pic.getBitmap(i)
562
+ *=$3f40; .fill pic.getScreenRamSize(), pic.getScreenRam(i)
563
+ *=$4328; .fill pic.getColorRamSize(), pic.getColorRam(i)
564
+ ```
565
+
566
+ ### Graphics from PNG/GIF
567
+
568
+ `LoadPicture("file.png")` returns a picture object. Access individual pixels
569
+ or request pre-converted C64 byte sequences:
570
+
571
+ ```asm
572
+ *=$2000
573
+ .var logo = LoadPicture("logo.png")
574
+ .fill $800, logo.getSinglecolorByte((i>>3)&$1f, (i&7)|(i>>8)<<3)
575
+ ```
576
+
577
+ For multi-color, supply a color table mapping RGB values to bit patterns.
578
+ `getMulticolorByte(x, y)` takes `x` as a byte column (pixel position / 8) and
579
+ `y` as a pixel row, so the fill must match the image's geometry:
580
+
581
+ ```asm
582
+ // The manual's example: a 16x16-character (128x128-pixel) multicolour charset
583
+ .var chars = LoadPicture("charset.gif",
584
+ List().add($000000, $ffffff, $888888, $444444))
585
+ .fill $800, chars.getMulticolorByte(i>>7, i&$7f) // x = byte column 0-15, y = pixel row 0-127
586
+
587
+ // A 24x21 sprite: 3 byte columns x 21 rows = 63 bytes, padded to a 64-byte block
588
+ .var mc = LoadPicture("sprite.gif",
589
+ List().add($000000, $ffffff, $888888, $444444))
590
+ .fill 63, mc.getMulticolorByte(mod(i,3), floor(i/3))
591
+ .byte 0
592
+ ```
593
+
594
+ An earlier version of this page applied the `$800` / `i>>7` / `i&$7f` charset
595
+ fill to `sprite.gif`; on a 24×21 image that fails with "y coordinate out of
596
+ range : 21" (measured on 5.25). The trailing `.byte 0` keeps the next sprite
597
+ pointer on a 64-byte boundary.
598
+
599
+ `getPixel(x, y)` returns the RGB value for custom processing.
600
+
601
+ ## SID file support
602
+
603
+ `LoadSid("file.sid")` parses a PSID or RSID file and exposes its header
604
+ fields and binary data as script properties:
605
+
606
+ | Property | Type | Description |
607
+ |----------|------|-------------|
608
+ | `music.location` | number | Load address of the SID data |
609
+ | `music.init` | number | Init routine address |
610
+ | `music.play` | number | Play routine address |
611
+ | `music.songs` | number | Number of sub-songs |
612
+ | `music.startSong` | number | Default song index (1-based) |
613
+ | `music.size` | number | Byte length of the SID data |
614
+ | `music.getData(i)` | number | i-th byte of the SID data |
615
+ | `music.name` | string | Song title |
616
+ | `music.author` | string | Author name |
617
+
618
+ A raster-interrupt player built on those properties:
619
+
620
+ ```asm
621
+ .var music = LoadSid("tune.sid")
622
+
623
+ BasicUpstart2(main)
624
+
625
+ main: sei
626
+ lda #$7f
627
+ sta $dc0d // CIA1: no timer interrupts
628
+ lda $dc0d // acknowledge one already pending
629
+ lda #<player
630
+ ldx #>player
631
+ sta $0314 // KERNAL IRQ vector
632
+ stx $0315
633
+ lda #$f8 // raster line 248, below the text
634
+ sta $d012
635
+ lda $d011
636
+ and #$7f // raster compare bit 8 = 0
637
+ sta $d011
638
+ lda #$01
639
+ sta $d01a // raster interrupt on
640
+ lda #music.startSong-1 // the tune's default song, 0-based
641
+ jsr music.init
642
+ cli
643
+ !: jmp !-
644
+
645
+ player: lda #$01
646
+ sta $d019 // acknowledge the raster interrupt
647
+ jsr music.play
648
+ jmp $ea81 // KERNAL: restore Y, X, A and RTI
649
+
650
+ *= music.location "SID data"
651
+ .fill music.size, music.getData(i)
652
+ ```
653
+
654
+ The assembler resolves `music.init` and `music.play` to the actual addresses
655
+ inside the SID data block, so changing the SID file requires no manual address
656
+ updates.
657
+
658
+ Use `-libdir /path/to/HVSC` so that `LoadSid("Artist/Title.sid")` searches
659
+ the HVSC tree without absolute paths in source.
660
+
661
+ ## Symbol export for VICE/vice-mcp
662
+
663
+ Two export modes produce label files for VICE:
664
+
665
+ **`-vicesymbols`** writes `source.vs`:
666
+
667
+ ```
668
+ java -jar KickAss.jar main.asm -vicesymbols
669
+ ```
670
+
671
+ Each line in the `.vs` file is:
672
+
673
+ ```
674
+ al C:<hex_address> .<label_name>
675
+ ```
676
+
677
+ e.g. `al C:812 .clearScreen`. The `C:` is VICE's memspace prefix (computer
678
+ memory) and the address is unpadded lowercase hex; an earlier version of this
679
+ page omitted the `C:`, so a parser written from it mis-read every line.
680
+ `BasicUpstart2` also emits an `.upstartEnd` label. Only labels (`name:` and
681
+ `.label`) are exported; `.const` symbols are not.
682
+
683
+ VICE loads these at startup with:
684
+
685
+ ```
686
+ x64sc -moncommands main.vs main.prg
687
+ ```
688
+
689
+ Or load interactively from the VICE monitor with `ll` (load_labels):
690
+
691
+ ```
692
+ ll "main.vs"
693
+ ```
694
+
695
+ VICE's `load` is the binary memory loader; `ll`/`load_labels` reads label
696
+ files (an earlier version of this page gave `load "main.vs"`). The
697
+ `-moncommands main.vs` form works because a `.vs` file is itself a list of
698
+ `al` monitor commands.
699
+
700
+ **vice-mcp** reads `.vs` files to resolve address-to-label mappings when
701
+ setting breakpoints by name or displaying memory annotated with symbol names.
702
+
703
+ **`-symbolfile`** writes `source.sym` in KickAssembler's own namespace format.
704
+ This is for linking separately assembled files, not for VICE:
705
+
706
+ ```asm
707
+ // main.asm -- optional: .filenamespace main (wraps main.sym in .namespace main { })
708
+ // other.asm
709
+ .import source "main.sym"
710
+ jsr clearScreen // labels are flat unless main.asm declares .filenamespace (or .namespace) - then jsr main.clearScreen
711
+ jsr ns.sub // an explicit .namespace ns { } in main.asm is exported as a block
712
+ ```
713
+
714
+ An earlier version of this fence wrote `jsr main.clearScreen` with no
715
+ `.filenamespace` in `main.asm`; that fails with "Unknown symbol 'main'"
716
+ (measured on 5.25).
717
+
718
+ The `.label` directive also creates labels that appear in both outputs:
719
+
720
+ ```asm
721
+ .label SCREEN = $0400
722
+ .label COLOR = $d800
723
+ ```
724
+
725
+ ## Idioms — KickAss vs Oscar64-inline-asm vs cc65
726
+
727
+ ### Decision flow
728
+
729
+ **Use KickAssembler as the standalone assembler when:**
730
+
731
+ - The entire project is assembly — a demo, cracktro, or game where C-level
732
+ abstraction buys nothing.
733
+ - You need cycle-exact raster IRQ timing (stable raster, FLD, FLI, AFLI).
734
+ - You are writing a sprite multiplexer where every cycle in the sort and
735
+ update loop must be accounted for.
736
+ - You need the script layer to generate large data tables (sine waves, trigonometry
737
+ tables, sprite coordinate arrays) without leaving the source file.
738
+
739
+ Example: a raster bar that must hit a specific scanline within ±0 cycles on
740
+ both PAL and NTSC requires hand-scheduled code with `.if` guards around
741
+ NTSC-compensating nops. The KickAssembler `.if`/`.const` system handles this
742
+ cleanly.
743
+
744
+ **Use Oscar64 with a KickAssembler-built hot path when** the project is
745
+ C-driven but one loop (inner sample loop, sprite sort, copper-list generator)
746
+ needs more precision than the Oscar64 code generator can deliver.
747
+
748
+ Oscar64 has no object-level link with foreign assemblers; an earlier version
749
+ of this page said to "have the linker stitch them together", which does not
750
+ work. Measured (Oscar64 build 2026-05-19): every positional argument is
751
+ compiled as a C/C++ translation unit — an `.asm` input fails to parse as C,
752
+ and a KickAssembler `.prg` passed alongside a `.c` file is accepted silently
753
+ while the extern stays undefined (error 3022) and nothing is written. The
754
+ working routes are (a) `__asm { }` inline assembly inside the C function, or
755
+ (b) a KickAssembler-built raw binary (`KickAss.jar hot.asm -binfile -o
756
+ hot.bin`) brought in with `#embed` and called through a function pointer:
757
+
758
+ ```c
759
+ __export const char hot[] = {
760
+ #embed "hot.bin" // directive must be on its own line
761
+ };
762
+ ((void (*)(void))hot)();
763
+ ```
764
+
765
+ The binary must be position-independent or assembled for the address the
766
+ array lands at (pin it with `#pragma section`/`#pragma region`/`#pragma data`
767
+ and check the `.map`), and any arguments must follow the Oscar64 calling
768
+ convention by hand. `#embed` consumes the rest of its line:
769
+ `{ #embed "hot.bin" };` on one line fails to parse.
770
+
771
+ **Use cc65 when:**
772
+
773
+ - A large cc65 code corpus (e.g., a mature library or port) already exists
774
+ and porting it to Oscar64 would cost more than the performance difference.
775
+ - The task is purely text-mode utility work where the cc65 standard library
776
+ is convenient.
777
+
778
+ **Do not reach for KickAssembler when:**
779
+
780
+ - Readability, refactoring, and test-driven development matter more than
781
+ tight cycle counts (use Oscar64).
782
+ - You are saving 5–10 cycles per scanline on code that runs once per frame
783
+ at non-display time — the overhead is not worth the cost in maintainability.
784
+ - You need C standard library functions, data structures, or C++ features.
785
+
786
+ ## Debugging with VICE
787
+
788
+
789
+ Reaching the monitor prompt headless, the register line, breakpoints, watchpoints and measuring cycles between two points are in `../runtime/vice-reference.md`, "Text monitor for debugging".
790
+ Generate the `.vs` symbol file during assembly:
791
+
792
+ ```
793
+ java -jar KickAss.jar main.asm -vicesymbols
794
+ ```
795
+
796
+ Launch x64sc with the symbols pre-loaded:
797
+
798
+ ```
799
+ x64sc -moncommands main.vs main.prg
800
+ ```
801
+
802
+ Inside the VICE monitor, labels are available for `break`, `watch`, and
803
+ `goto`:
804
+
805
+ ```
806
+ break .clearScreen ; break when PC hits clearScreen label
807
+ watch store .COLOR ; watch writes to the COLOR address
808
+ dis .irq ; disassemble from irq label
809
+ ```
810
+
811
+ VICE reports breakpoint addresses alongside their label names when the `.vs`
812
+ file is loaded.
813
+
814
+ vice-mcp uses the same `.vs` file format. Set breakpoints by label, request
815
+ memory reads by symbolic address, and receive register dumps annotated with
816
+ label context — all without hard-coding addresses in the agent loop.
817
+
818
+ ## Pitfalls
819
+
820
+ **Overlapping blocks are an assembly error, not a silent merge (5.25).** An
821
+ earlier version of this page said the later block overwrote the earlier one
822
+ "without any warning or error"; it does not. Two non-virtual blocks that
823
+ overlap within the same segment — including the Default segment — stop the
824
+ build with `Error: In segment 'Default' the memoryblock ... ($1000-$1003)
825
+ overlaps ... ($1002-$1003)`, and no PRG is written; the message itself names
826
+ both blocks and their ranges. Segments that are combined into one output are
827
+ checked again at the `.file` level, so two segments that overlap and land in
828
+ the same file also error; they only go unchecked when written to different
829
+ files or when one is thrown away (manual §10.12). To permit an overlap
830
+ deliberately — e.g. patching a base PRG — use `allowOverlap` on the
831
+ `.segmentdef` for an overlap inside one segment, `allowOverlap` on the
832
+ `.file` for an overlap between segments it combines (a `.file`-level
833
+ `allowOverlap` does not cover an intra-segment overlap), or the `-aom`
834
+ command-line switch, which lifts the check globally. In every allowed case
835
+ the later block wins byte-for-byte (`*=$1000 .byte 1,2,3,4` then `*=$1002
836
+ .byte 9,9` yields `01 02 09 09`, measured with `-aom`). `-showmem` prints
837
+ nothing on a build that fails this check, so it is not the diagnostic here.
838
+ Declare scratch regions `virtual`: a virtual block may overlap anything and
839
+ is never written to the file.
840
+
841
+ **Java version.** An earlier version of this page said "Java 8 is not
842
+ supported in KickAssembler 5.x"; the jar says otherwise. KickAss.jar 5.25 is
843
+ Java 8 bytecode throughout (all 548 classes are class-file version 52, built
844
+ with JDK 13 but targeting 8), references no Java 9+ API, and the bundled
845
+ manual states "Java 8.0 or higher". The only requirement the author has ever
846
+ posted in the changelog is "now need java8 or higher" (v4.x, 2016); no 5.x
847
+ release note changes it. The download page links an OpenJDK 11 runtime as a
848
+ convenience, not as a stated minimum — do not read that as Java 8 being
849
+ refused. It runs here under Temurin 26; Java 11/17/21 LTS are the sensible
850
+ installs today, and nothing in the jar refuses Java 8, though execution on a
851
+ Java 8 runtime was not tested on this machine.
852
+
853
+ **Encoding issues with `.text`.** The default encoding is `screencode_mixed`.
854
+ If your screen target uses the uppercase+graphics charset (the power-on
855
+ default on a stock C64), strings written with `screencode_mixed` will
856
+ produce garbled output. Switch with `.encoding "screencode_upper"` before
857
+ any `.text` directive that targets upper-case-only output.
858
+
859
+ **Macro hygiene.** Labels declared inside a macro are scoped to the macro
860
+ call, so `loop:` in a macro does not collide across invocations. A `.var`
861
+ declared inside the macro body is scoped to that invocation too (`Unknown
862
+ symbol` afterwards, and a body-local `.var v` merely shadows a caller's `v`);
863
+ an earlier version of this page said such variables leaked out, which is the
864
+ wrong direction. The leak runs the other way: the body resolves names in the
865
+ scope where the macro was defined, so `.eval v = v + 10` inside a macro
866
+ changes the caller's `v` (measured on 5.25: two calls took `v` from 1 to 21).
867
+ Keep the caller's state in a `.namespace` that the macro is defined outside
868
+ of if the macro must not touch it; a macro defined inside the same namespace
869
+ still sees and mutates it.
870
+
871
+ **Pseudocommand argument separator changed between 3.x and 4.x.** The
872
+ separator changed from semicolon to colon. Old 3.x code fails with `Invalid
873
+ token` / `Pseudo command '...' not defined` unless you pass `-pseudoc3x` — it
874
+ is loud, with no output; an earlier version of this page said it "fails
875
+ silently or misassembles". If you are adapting code from CSDB or similar
876
+ archives written for 3.x, check the separator.
877
+
878
+ **`LoadPicture` accepts GIF and JPEG as well as PNG.** The manual's
879
+ examples use GIF files. PNG works but the function name does not imply it;
880
+ do not assume the function is PNG-only.
881
+
882
+ The next five were each found by assembling this knowledge base's own
883
+ listings with KickAssembler 5.25 (see `scripts/check-listings.ts`); every
884
+ one of them had shipped in a recipe.
885
+
886
+ **`(addr),y` with a non-zero-page operand assembles without a diagnostic.**
887
+ Indirect-indexed addressing exists only for zero page. Give it a label in
888
+ ordinary RAM and the assembler emits the zero-page opcode with the low byte
889
+ of the address, so the code reads a pointer from wherever `$xx` happens to
890
+ be — BASIC's workspace, in the case that was caught (`sine-scroller`
891
+ printed a screen of `3`s). Keep every `(ptr),y` pointer below `$0100` and
892
+ check with `-showmem` or a `.vs` dump if in doubt.
893
+
894
+ **`.if (n)` on a number is an error, not a truthiness test.** "Can't get a
895
+ boolean representation from a value of type number." Write `.if (n != 0)`.
896
+ The same applies to the ternary `n ? a : b` in expressions.
897
+
898
+ **Semicolons do not start comments.** KickAssembler comments are `//` and
899
+ `/* */`. A `;` is parsed as code: `; SID player` becomes "pseudo command
900
+ 'SID' not defined". Listings pasted from ca65 or ACME sources fail this
901
+ way, as do `txa : pha` colon-chained statements, which ca65 accepts and
902
+ KickAssembler does not. Worse than the error is the comment that does not
903
+ fail: `; inc $d020` assembles the `inc` (measured on 5.25, exit 0), so a
904
+ commented-out instruction in pasted code is live.
905
+
906
+ **A `!:` outside a `.for` is one label for every iteration.** `bpl !-`
907
+ inside the body then resolves to the single `!:` above the loop and, once the
908
+ expansion is long, fails with `relative address is illegal (jump distance is
909
+ too far: -132)`. A `!:` placed *inside* the body is per-iteration — each
910
+ `bpl !-` branches to its own (measured on 5.25, 40 × 11-byte bodies, offset
911
+ −11 every time) — and so is a named label inside the body, because each
912
+ iteration is its own scope. Neither is visible after the loop, nor from the
913
+ body if it sits in a nested `.for`, `.if` or macro (`Unknown symbol '!-'`).
914
+ Put the label inside the body; a label outside the loop only works while the
915
+ whole expansion stays within 127 bytes. An earlier version of this pitfall
916
+ said the opposite — that a `!:` inside the body was shared across iterations
917
+ — and prescribed a label outside the loop, which is the form that fails.
918
+
919
+ **A branch target more than 127 bytes away is an assembly error, and
920
+ unrolled `.for` bodies get there fast.** `beq exit` across 700 bytes of
921
+ macro expansion fails with "relative address is illegal". Invert the branch
922
+ around a `jmp`.
923
+
924
+ ## Reading the errors
925
+
926
+ Every message below was provoked on KickAssembler 5.25 with the minimal
927
+ source named in the second column; the sources are files in
928
+ `error-sources/kickassembler/` and are shown after the table. Each error
929
+ prints the offending line, a caret under the token, the `Error:` line and an
930
+ `at line L, column C in file` line, and the assembler exits 1 with no PRG
931
+ written. The one exception is the failed `.assert`, which exits 0 and writes
932
+ the PRG.
933
+
934
+ | Message (verbatim) | Source | Cause | Fix |
935
+ |---|---|---|---|
936
+ | `Error: Unknown symbol 'nowhere'` | `unknown-symbol.asm` | A label or constant is used and never defined; also a typo, a label inside a `.namespace` or `.filenamespace` used without its prefix, or a `.sym` import whose module had no namespace (see Multi-file projects) | Define it, prefix it, or add `.filenamespace` to the module |
937
+ | `Error: relative address is illegal (jump distance is too far: -202).` | `branch-out-of-range.asm` | A branch to a target more than 128 bytes back or 127 forward. There is no message with the words "branch out of range"; this is the wording | Invert the branch around a `jmp`, or move the code |
938
+ | `Error: In segment 'Default' the memoryblock 'first' ($1000-$100f) overlaps 'second' ($1008-$1017)` | `memory-block-overlap.asm` | Two `*=` blocks in the same segment write the same bytes. The message names both blocks and their ranges; unnamed blocks appear as `Unnamed` | Move one block, or mark a reservation `virtual` (see Memory layout) |
939
+ | ` one plus one=2 (3) -- ERROR IN ASSERTION!!!` then `Made 1 asserts , 1 FAILED!` | `failed-assert.asm` | `.assert "name", actual, expected` disagreed. The build still says `Writing prg file:`, still writes it (3 bytes here) and exits 0 | Grep the build log for `FAILED` in scripts; the exit code will not tell you |
940
+ | `Error: Pseudo command 'Blink' not defined` | `macro-without-parentheses.asm` | A macro called without parentheses (`Blink` for `Blink()`) is parsed as a pseudocommand. A `;` line pasted from a ca65 source is parsed the same way, not skipped, and what it prints depends on the words: on 5.25 `;comment` gives `Pseudo command 'comment' not defined`, `; Comment text` gives that plus `Unknown symbol 'text'`, `; a comment here` gives `Syntax error`, and `; inc $d020` or `; lda #0` gives no error at all, the instruction after the `;` assembles into the PRG. The silent case is the one to look for | Write `Blink()`; use `//` for comments |
941
+ | `Error: The symbol 'main' is already defined` | `symbol-clash-main.asm` with `symbol-clash-lib.asm` | Two definitions of one label in one scope, here through a flat `.sym` import | Rename, or give the module a `.filenamespace` |
942
+
943
+ Sources (each is meant to fail, so none is in a buildable fence):
944
+
945
+ `unknown-symbol.asm`
946
+
947
+ ```text
948
+ *=$1000
949
+ lda #0
950
+ jsr nowhere
951
+ rts
952
+ ```
953
+
954
+ `branch-out-of-range.asm`
955
+
956
+ ```text
957
+ *=$1000
958
+ loop:
959
+ .fill 200, $ea
960
+ bne loop
961
+ ```
962
+
963
+ `memory-block-overlap.asm`
964
+
965
+ ```text
966
+ *=$1000 "first"
967
+ .fill 16, 0
968
+ *=$1008 "second"
969
+ .fill 16, 0
970
+ ```
971
+
972
+ `failed-assert.asm`
973
+
974
+ ```text
975
+ *=$1000
976
+ rts
977
+ .assert "one plus one", 1+1, 3
978
+ ```
979
+
980
+ `macro-without-parentheses.asm`
981
+
982
+ ```text
983
+ .macro Blink() {
984
+ inc $d020
985
+ }
986
+ *=$1000
987
+ Blink
988
+ rts
989
+ ```
990
+
991
+ `import-source-no-namespace.asm`, after `flat-lib.asm` (no `.filenamespace`)
992
+ has been assembled with `-symbolfile`:
993
+
994
+ ```text
995
+ // flat-lib.sym was written by a flat-lib.asm that has no .filenamespace
996
+ .import source "flat-lib.sym"
997
+ *=$0810
998
+ jsr lib.set
999
+ rts
1000
+ ```
1001
+
1002
+ `symbol-clash-main.asm`, after `symbol-clash-lib.asm` (which defines a flat
1003
+ `main:` at `$1000`) has been assembled with `-symbolfile`:
1004
+
1005
+ ```text
1006
+ .import source "symbol-clash-lib.sym"
1007
+ *=$0801 "basic"
1008
+ BasicUpstart2(main)
1009
+ main:
1010
+ jsr main
1011
+ jmp *
1012
+ ```
1013
+
1014
+ ## See also
1015
+
1016
+ - [oscar64-reference.md](../toolchains/oscar64-reference.md) — primary C compiler; use as the project driver when mixing C and asm
1017
+ - [recipes/kickassembler/hello-world.md](../recipes/kickassembler/hello-world.md) — minimal working PRG with BASIC upstart
1018
+ - [vice-reference.md](../runtime/vice-reference.md) — VICE emulator flags, monitor commands, `.vs` file loading
1019
+ - [memory-layout-planning.md](memory-layout-planning.md) — whole-program layout: the constraints, one worked layout in all three toolchains, confirmed from `-showmem`; recipe `../recipes/kickassembler/memory-layout.md`
1020
+ - [release-disk.md](release-disk.md) — putting the built PRG on a bootable D64 with c1541, proving it boots by autostarting the image headless, and a Makefile target that does both