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.
- package/CHANGELOG.md +2082 -0
- package/LICENSE +29 -0
- package/README.md +559 -0
- package/VERSION +25 -0
- package/dist/cli/setup.js +66 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli-memorize-audit.js +97 -0
- package/dist/cli-memorize-audit.js.map +1 -0
- package/dist/cli.js +335 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +83 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +53 -0
- package/dist/context.js.map +1 -0
- package/dist/domain/budget-notes.js +104 -0
- package/dist/domain/budget-notes.js.map +1 -0
- package/dist/domain/budget.js +417 -0
- package/dist/domain/budget.js.map +1 -0
- package/dist/domain/game-design.js +77 -0
- package/dist/domain/game-design.js.map +1 -0
- package/dist/domain/timing.js +39 -0
- package/dist/domain/timing.js.map +1 -0
- package/dist/graph/apply.js +132 -0
- package/dist/graph/apply.js.map +1 -0
- package/dist/graph/claims.js +231 -0
- package/dist/graph/claims.js.map +1 -0
- package/dist/graph/extract/archetype.js +118 -0
- package/dist/graph/extract/archetype.js.map +1 -0
- package/dist/graph/extract/common.js +69 -0
- package/dist/graph/extract/common.js.map +1 -0
- package/dist/graph/extract/failure.js +37 -0
- package/dist/graph/extract/failure.js.map +1 -0
- package/dist/graph/extract/game-design.js +189 -0
- package/dist/graph/extract/game-design.js.map +1 -0
- package/dist/graph/extract/hardware.js +124 -0
- package/dist/graph/extract/hardware.js.map +1 -0
- package/dist/graph/extract/pitfall.js +62 -0
- package/dist/graph/extract/pitfall.js.map +1 -0
- package/dist/graph/extract/raster-band.js +56 -0
- package/dist/graph/extract/raster-band.js.map +1 -0
- package/dist/graph/extract/recipe.js +71 -0
- package/dist/graph/extract/recipe.js.map +1 -0
- package/dist/graph/extract/technique-entities.js +180 -0
- package/dist/graph/extract/technique-entities.js.map +1 -0
- package/dist/graph/extract/technique.js +179 -0
- package/dist/graph/extract/technique.js.map +1 -0
- package/dist/graph/extract/toolchain.js +67 -0
- package/dist/graph/extract/toolchain.js.map +1 -0
- package/dist/graph/extract/types.js +3 -0
- package/dist/graph/extract/types.js.map +1 -0
- package/dist/graph/extract/vocabulary.js +65 -0
- package/dist/graph/extract/vocabulary.js.map +1 -0
- package/dist/graph/extract.js +43 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/kernal-clobbers.js +64 -0
- package/dist/graph/kernal-clobbers.js.map +1 -0
- package/dist/graph/machine-variants.js +208 -0
- package/dist/graph/machine-variants.js.map +1 -0
- package/dist/ingest/files.js +99 -0
- package/dist/ingest/files.js.map +1 -0
- package/dist/ingest/passes.js +104 -0
- package/dist/ingest/passes.js.map +1 -0
- package/dist/ingest/points.js +50 -0
- package/dist/ingest/points.js.map +1 -0
- package/dist/ingest/report.js +140 -0
- package/dist/ingest/report.js.map +1 -0
- package/dist/ingest/tally.js +81 -0
- package/dist/ingest/tally.js.map +1 -0
- package/dist/ingest/verified-on.js +43 -0
- package/dist/ingest/verified-on.js.map +1 -0
- package/dist/ingest.js +135 -0
- package/dist/ingest.js.map +1 -0
- package/dist/schemas/cost-basis.js +5 -0
- package/dist/schemas/cost-basis.js.map +1 -0
- package/dist/schemas/machine-variant.js +25 -0
- package/dist/schemas/machine-variant.js.map +1 -0
- package/dist/schemas/plan-budget.js +121 -0
- package/dist/schemas/plan-budget.js.map +1 -0
- package/dist/schemas/tool-outputs.js +526 -0
- package/dist/schemas/tool-outputs.js.map +1 -0
- package/dist/server/define-tool.js +52 -0
- package/dist/server/define-tool.js.map +1 -0
- package/dist/server/defined-only.js +9 -0
- package/dist/server/defined-only.js.map +1 -0
- package/dist/server/tools-briefings.js +70 -0
- package/dist/server/tools-briefings.js.map +1 -0
- package/dist/server/tools-lookup.js +180 -0
- package/dist/server/tools-lookup.js.map +1 -0
- package/dist/server/tools-maintenance.js +116 -0
- package/dist/server/tools-maintenance.js.map +1 -0
- package/dist/server/tools-pitfalls.js +89 -0
- package/dist/server/tools-pitfalls.js.map +1 -0
- package/dist/server/tools-recipes.js +296 -0
- package/dist/server/tools-recipes.js.map +1 -0
- package/dist/server/tools-runtime.js +48 -0
- package/dist/server/tools-runtime.js.map +1 -0
- package/dist/server/tools.js +43 -0
- package/dist/server/tools.js.map +1 -0
- package/dist/server.js +95 -0
- package/dist/server.js.map +1 -0
- package/dist/services/analytics/schema.js +78 -0
- package/dist/services/analytics/schema.js.map +1 -0
- package/dist/services/analytics/statements.js +99 -0
- package/dist/services/analytics/statements.js.map +1 -0
- package/dist/services/analytics.js +195 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/bm25.js +158 -0
- package/dist/services/bm25.js.map +1 -0
- package/dist/services/chunker.js +81 -0
- package/dist/services/chunker.js.map +1 -0
- package/dist/services/embeddings.js +58 -0
- package/dist/services/embeddings.js.map +1 -0
- package/dist/services/falkor/base.js +85 -0
- package/dist/services/falkor/base.js.map +1 -0
- package/dist/services/falkor/links.js +361 -0
- package/dist/services/falkor/links.js.map +1 -0
- package/dist/services/falkor/nodes.js +183 -0
- package/dist/services/falkor/nodes.js.map +1 -0
- package/dist/services/falkor/params.js +45 -0
- package/dist/services/falkor/params.js.map +1 -0
- package/dist/services/falkor/schema.js +77 -0
- package/dist/services/falkor/schema.js.map +1 -0
- package/dist/services/falkor.js +100 -0
- package/dist/services/falkor.js.map +1 -0
- package/dist/services/qdrant.js +238 -0
- package/dist/services/qdrant.js.map +1 -0
- package/dist/services/versions.js +73 -0
- package/dist/services/versions.js.map +1 -0
- package/dist/services/vice-bin.js +51 -0
- package/dist/services/vice-bin.js.map +1 -0
- package/dist/tools/briefings/archetype.js +174 -0
- package/dist/tools/briefings/archetype.js.map +1 -0
- package/dist/tools/briefings/budget.js +177 -0
- package/dist/tools/briefings/budget.js.map +1 -0
- package/dist/tools/briefings/build-order.js +135 -0
- package/dist/tools/briefings/build-order.js.map +1 -0
- package/dist/tools/briefings/build.js +185 -0
- package/dist/tools/briefings/build.js.map +1 -0
- package/dist/tools/briefings/discovery.js +290 -0
- package/dist/tools/briefings/discovery.js.map +1 -0
- package/dist/tools/briefings/plan-pitfalls.js +69 -0
- package/dist/tools/briefings/plan-pitfalls.js.map +1 -0
- package/dist/tools/briefings/render.js +151 -0
- package/dist/tools/briefings/render.js.map +1 -0
- package/dist/tools/briefings/rows.js +41 -0
- package/dist/tools/briefings/rows.js.map +1 -0
- package/dist/tools/briefings/toolchain.js +63 -0
- package/dist/tools/briefings/toolchain.js.map +1 -0
- package/dist/tools/briefings/why-proposed.js +69 -0
- package/dist/tools/briefings/why-proposed.js.map +1 -0
- package/dist/tools/briefings.js +44 -0
- package/dist/tools/briefings.js.map +1 -0
- package/dist/tools/feedback.js +97 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/hydrate.js +75 -0
- package/dist/tools/hydrate.js.map +1 -0
- package/dist/tools/intelligence.js +67 -0
- package/dist/tools/intelligence.js.map +1 -0
- package/dist/tools/lint/asm-decimal.js +86 -0
- package/dist/tools/lint/asm-decimal.js.map +1 -0
- package/dist/tools/lint/asm-rules.js +221 -0
- package/dist/tools/lint/asm-rules.js.map +1 -0
- package/dist/tools/lint/asm-shared.js +3 -0
- package/dist/tools/lint/asm-shared.js.map +1 -0
- package/dist/tools/lint/c-rules.js +215 -0
- package/dist/tools/lint/c-rules.js.map +1 -0
- package/dist/tools/lint/text.js +122 -0
- package/dist/tools/lint/text.js.map +1 -0
- package/dist/tools/lint/types.js +40 -0
- package/dist/tools/lint/types.js.map +1 -0
- package/dist/tools/lint.js +76 -0
- package/dist/tools/lint.js.map +1 -0
- package/dist/tools/memorization-mcp.js +111 -0
- package/dist/tools/memorization-mcp.js.map +1 -0
- package/dist/tools/pitfalls/bm25.js +53 -0
- package/dist/tools/pitfalls/bm25.js.map +1 -0
- package/dist/tools/pitfalls/format.js +58 -0
- package/dist/tools/pitfalls/format.js.map +1 -0
- package/dist/tools/pitfalls/graph.js +124 -0
- package/dist/tools/pitfalls/graph.js.map +1 -0
- package/dist/tools/pitfalls.js +134 -0
- package/dist/tools/pitfalls.js.map +1 -0
- package/dist/tools/prompts.js +81 -0
- package/dist/tools/prompts.js.map +1 -0
- package/dist/tools/query/compatibility/closure.js +62 -0
- package/dist/tools/query/compatibility/closure.js.map +1 -0
- package/dist/tools/query/compatibility/facts.js +28 -0
- package/dist/tools/query/compatibility/facts.js.map +1 -0
- package/dist/tools/query/compatibility/fetch.js +164 -0
- package/dist/tools/query/compatibility/fetch.js.map +1 -0
- package/dist/tools/query/compatibility/hard-rules.js +159 -0
- package/dist/tools/query/compatibility/hard-rules.js.map +1 -0
- package/dist/tools/query/compatibility/index.js +27 -0
- package/dist/tools/query/compatibility/index.js.map +1 -0
- package/dist/tools/query/compatibility/kernal-zp-rule.js +90 -0
- package/dist/tools/query/compatibility/kernal-zp-rule.js.map +1 -0
- package/dist/tools/query/compatibility/render.js +106 -0
- package/dist/tools/query/compatibility/render.js.map +1 -0
- package/dist/tools/query/compatibility/rules.js +337 -0
- package/dist/tools/query/compatibility/rules.js.map +1 -0
- package/dist/tools/query/compatibility/unit-rules.js +253 -0
- package/dist/tools/query/compatibility/unit-rules.js.map +1 -0
- package/dist/tools/query/game-design.js +83 -0
- package/dist/tools/query/game-design.js.map +1 -0
- package/dist/tools/query/lookups.js +220 -0
- package/dist/tools/query/lookups.js.map +1 -0
- package/dist/tools/query/plan-budget.js +266 -0
- package/dist/tools/query/plan-budget.js.map +1 -0
- package/dist/tools/query/recipes.js +214 -0
- package/dist/tools/query/recipes.js.map +1 -0
- package/dist/tools/query/retrieval.js +128 -0
- package/dist/tools/query/retrieval.js.map +1 -0
- package/dist/tools/query/shared.js +121 -0
- package/dist/tools/query/shared.js.map +1 -0
- package/dist/tools/query/techniques.js +331 -0
- package/dist/tools/query/techniques.js.map +1 -0
- package/dist/tools/query/timing.js +106 -0
- package/dist/tools/query/timing.js.map +1 -0
- package/dist/tools/query/types.js +11 -0
- package/dist/tools/query/types.js.map +1 -0
- package/dist/tools/query.js +21 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/tools/resources.js +186 -0
- package/dist/tools/resources.js.map +1 -0
- package/dist/tools/run-game.js +249 -0
- package/dist/tools/run-game.js.map +1 -0
- package/dist/tools/selfimprovement.js +367 -0
- package/dist/tools/selfimprovement.js.map +1 -0
- package/docker-compose.yml +35 -0
- package/docs/ARCHITECTURE.md +164 -0
- package/docs/CONVENTIONS-archetypes.md +158 -0
- package/docs/CONVENTIONS-failures.md +46 -0
- package/docs/CONVENTIONS-game-designs.md +75 -0
- package/docs/CONVENTIONS-hardware-reference.md +184 -0
- package/docs/CONVENTIONS-pitfalls.md +91 -0
- package/docs/CONVENTIONS-recipes.md +106 -0
- package/docs/CONVENTIONS-techniques.md +309 -0
- package/docs/CONVENTIONS-toolchain-reference.md +89 -0
- package/docs/ONTOLOGY.md +655 -0
- package/docs/art/art-production-reference.md +157 -0
- package/docs/art/asset-pipelines.md +586 -0
- package/docs/c64-failure-patterns.md +693 -0
- package/docs/demo-design/demo-composition.md +349 -0
- package/docs/demo-design/demo-design-philosophy.md +320 -0
- package/docs/demo-design/intro-cracktro-patterns.md +435 -0
- package/docs/figures/ctm-spd-embed-probe.png +0 -0
- package/docs/figures/dot-flag-mid-5000000.png +0 -0
- package/docs/figures/dot-flag-no-erase-12000000.png +0 -0
- package/docs/figures/edges.json +1 -0
- package/docs/figures/fig6-architecture.png +0 -0
- package/docs/figures/fig7-ontology.png +0 -0
- package/docs/figures/screen-dissolve-mid-frame25.png +0 -0
- package/docs/figures/screen-dissolve-wipe-frame25.png +0 -0
- package/docs/figures/spindle-two-parts-part1.png +0 -0
- package/docs/figures/spindle-two-parts-part2.png +0 -0
- package/docs/figures/starters/action-puzzle.png +0 -0
- package/docs/figures/starters/adventure.png +0 -0
- package/docs/figures/starters/beat-em-up.png +0 -0
- package/docs/figures/starters/demo.png +0 -0
- package/docs/figures/starters/platformer.png +0 -0
- package/docs/figures/starters/shmup-vertical.png +0 -0
- package/docs/figures/tape-kernal-master-ntsc.png +0 -0
- package/docs/figures/tape-kernal-master-pal.png +0 -0
- package/docs/figures/tape-turbo-loader-ntsc.png +0 -0
- package/docs/figures/tape-turbo-loader-pal.png +0 -0
- package/docs/figures/tape-turbo-master-ntsc.png +0 -0
- package/docs/figures/tape-turbo-master-pal.png +0 -0
- package/docs/figures/tech-tech-pad2-12000000.png +0 -0
- package/docs/figures/tech-tech-pad4-12000000.png +0 -0
- package/docs/figures/tech-tech-seven-12000000.png +0 -0
- package/docs/figures/twister-mid-5000000.png +0 -0
- package/docs/figures/twister-straight-12000000.png +0 -0
- package/docs/figures/vector-balls-nosort-ntsc.png +0 -0
- package/docs/figures/vector-balls-nosort.png +0 -0
- package/docs/formats/c64-file-formats.md +1212 -0
- package/docs/formats/iec-disk-reference.md +754 -0
- package/docs/game-design/c64-game-archetypes.md +273 -0
- package/docs/game-design/designs/falling-blocks.md +54 -0
- package/docs/game-design/designs/platformer-scaffold.md +48 -0
- package/docs/game-design/designs/simple-shmup.md +27 -0
- package/docs/game-design/enemy-behaviour-and-difficulty.md +349 -0
- package/docs/game-design/game-design-patterns.md +1189 -0
- package/docs/game-design/game-structure.md +354 -0
- package/docs/game-design/production-planning.md +349 -0
- package/docs/game-design/reference-game-sources.md +90 -0
- package/docs/hardware/6502-illegal-opcodes.md +1353 -0
- package/docs/hardware/6510-cpu-reference.md +2112 -0
- package/docs/hardware/c64-memory-map.md +3184 -0
- package/docs/hardware/c64-registers-reference.md +996 -0
- package/docs/hardware/cia-reference.md +1281 -0
- package/docs/hardware/kernal-routines-reference.md +1836 -0
- package/docs/hardware/pal-ntsc-reference.md +813 -0
- package/docs/hardware/sid-reference.md +1137 -0
- package/docs/hardware/vic-ii-reference.md +1714 -0
- package/docs/music/music-production-reference.md +403 -0
- package/docs/pitfalls/banking.md +1067 -0
- package/docs/pitfalls/cia.md +1147 -0
- package/docs/pitfalls/cpu.md +874 -0
- package/docs/pitfalls/input.md +282 -0
- package/docs/pitfalls/kernal-and-io.md +1615 -0
- package/docs/pitfalls/loader.md +1191 -0
- package/docs/pitfalls/logic.md +94 -0
- package/docs/pitfalls/maths.md +187 -0
- package/docs/pitfalls/raster-and-badline.md +721 -0
- package/docs/pitfalls/region-timing.md +660 -0
- package/docs/pitfalls/scroll.md +207 -0
- package/docs/pitfalls/sid.md +738 -0
- package/docs/pitfalls/sprite.md +979 -0
- package/docs/pitfalls/text-mode-render.md +1172 -0
- package/docs/recipes/cc65/cartridge-8k.md +398 -0
- package/docs/recipes/cc65/hello-world-conio.md +76 -0
- package/docs/recipes/cc65/memory-layout.md +312 -0
- package/docs/recipes/cc65/screenshots/README.md +14 -0
- package/docs/recipes/cc65/screenshots/cartridge-8k-ntsc.png +0 -0
- package/docs/recipes/cc65/screenshots/cartridge-8k.png +0 -0
- package/docs/recipes/cc65/screenshots/hello-world-conio.png +0 -0
- package/docs/recipes/cc65/screenshots/memory-layout-ntsc.png +0 -0
- package/docs/recipes/cc65/screenshots/memory-layout.png +0 -0
- package/docs/recipes/kickassembler/basic-float-calls.md +578 -0
- package/docs/recipes/kickassembler/basic-wedge.md +398 -0
- package/docs/recipes/kickassembler/big-font-scroller.md +620 -0
- package/docs/recipes/kickassembler/charset-copy-rom-to-ram.md +623 -0
- package/docs/recipes/kickassembler/cia-revision-detect.md +366 -0
- package/docs/recipes/kickassembler/colour-cycling.md +343 -0
- package/docs/recipes/kickassembler/colour-fade.md +303 -0
- package/docs/recipes/kickassembler/compare-16bit-signed.md +1007 -0
- package/docs/recipes/kickassembler/cracktro-template.md +526 -0
- package/docs/recipes/kickassembler/crt-banked.md +276 -0
- package/docs/recipes/kickassembler/dos-error-codes.md +466 -0
- package/docs/recipes/kickassembler/dot-flag.md +576 -0
- package/docs/recipes/kickassembler/drive-job-queue.md +667 -0
- package/docs/recipes/kickassembler/drive-via-probe.md +690 -0
- package/docs/recipes/kickassembler/dycp-scroller.md +568 -0
- package/docs/recipes/kickassembler/dypp-sprite-scroller.md +681 -0
- package/docs/recipes/kickassembler/dysp.md +670 -0
- package/docs/recipes/kickassembler/easyflash-save.md +800 -0
- package/docs/recipes/kickassembler/eight-way-scroll.md +1484 -0
- package/docs/recipes/kickassembler/file-io-roundtrip.md +546 -0
- package/docs/recipes/kickassembler/fire-effect.md +420 -0
- package/docs/recipes/kickassembler/fld.md +414 -0
- package/docs/recipes/kickassembler/fli-image.md +336 -0
- package/docs/recipes/kickassembler/four-player-read.md +672 -0
- package/docs/recipes/kickassembler/headless-verify.md +228 -0
- package/docs/recipes/kickassembler/hello-world.md +98 -0
- package/docs/recipes/kickassembler/high-score-insert.md +660 -0
- package/docs/recipes/kickassembler/hires-plot-line.md +723 -0
- package/docs/recipes/kickassembler/irq-chain.md +316 -0
- package/docs/recipes/kickassembler/irq-owns-port.md +668 -0
- package/docs/recipes/kickassembler/isometric-room.md +1145 -0
- package/docs/recipes/kickassembler/light-pen-read.md +926 -0
- package/docs/recipes/kickassembler/logic-rate-decoupling.md +670 -0
- package/docs/recipes/kickassembler/mci-interlace.md +543 -0
- package/docs/recipes/kickassembler/memory-layout.md +277 -0
- package/docs/recipes/kickassembler/mouse-1351-read.md +801 -0
- package/docs/recipes/kickassembler/nmi-timer-tick.md +562 -0
- package/docs/recipes/kickassembler/own-keyscan.md +881 -0
- package/docs/recipes/kickassembler/paddle-read.md +751 -0
- package/docs/recipes/kickassembler/palette-cells.md +219 -0
- package/docs/recipes/kickassembler/pseudo-3d-road.md +930 -0
- package/docs/recipes/kickassembler/pwm-digi.md +463 -0
- package/docs/recipes/kickassembler/raster-bars.md +264 -0
- package/docs/recipes/kickassembler/reu-dma.md +1019 -0
- package/docs/recipes/kickassembler/runtime-relocation.md +743 -0
- package/docs/recipes/kickassembler/screen-dissolve.md +545 -0
- package/docs/recipes/kickassembler/screen-wipe.md +408 -0
- package/docs/recipes/kickassembler/screenshots/README.md +72 -0
- package/docs/recipes/kickassembler/screenshots/basic-float-calls-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/basic-float-calls.png +0 -0
- package/docs/recipes/kickassembler/screenshots/basic-wedge-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/basic-wedge.png +0 -0
- package/docs/recipes/kickassembler/screenshots/big-font-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/big-font-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/charset-copy-rom-to-ram-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/charset-copy-rom-to-ram.png +0 -0
- package/docs/recipes/kickassembler/screenshots/cia-revision-detect-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/cia-revision-detect.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-cycling-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-cycling.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-fade-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-fade.png +0 -0
- package/docs/recipes/kickassembler/screenshots/compare-16bit-signed-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/compare-16bit-signed.png +0 -0
- package/docs/recipes/kickassembler/screenshots/cracktro-template.png +0 -0
- package/docs/recipes/kickassembler/screenshots/crt-banked-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/crt-banked.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dos-error-codes-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dos-error-codes.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dot-flag-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dot-flag.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-job-queue-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-job-queue.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-via-probe-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-via-probe.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dycp-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dycp-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dypp-sprite-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dypp-sprite-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dysp-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dysp.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save-ntsc-run2.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save-run2.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save.png +0 -0
- package/docs/recipes/kickassembler/screenshots/eight-way-scroll-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/eight-way-scroll.png +0 -0
- package/docs/recipes/kickassembler/screenshots/file-io-roundtrip-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/file-io-roundtrip.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fire-effect-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fire-effect.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fld-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fld.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fli-image.png +0 -0
- package/docs/recipes/kickassembler/screenshots/four-player-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/four-player-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/headless-verify-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/headless-verify.png +0 -0
- package/docs/recipes/kickassembler/screenshots/hello-world.png +0 -0
- package/docs/recipes/kickassembler/screenshots/high-score-insert-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/high-score-insert.png +0 -0
- package/docs/recipes/kickassembler/screenshots/hires-plot-line-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/hires-plot-line.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-chain-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-chain.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-owns-port-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-owns-port.png +0 -0
- package/docs/recipes/kickassembler/screenshots/isometric-room-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/isometric-room.png +0 -0
- package/docs/recipes/kickassembler/screenshots/light-pen-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/light-pen-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/logic-rate-decoupling-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/logic-rate-decoupling.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace-average.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace-frame-b.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace.png +0 -0
- package/docs/recipes/kickassembler/screenshots/memory-layout-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/memory-layout.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mouse-1351-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mouse-1351-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/nmi-timer-tick-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/nmi-timer-tick.png +0 -0
- package/docs/recipes/kickassembler/screenshots/own-keyscan-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/own-keyscan.png +0 -0
- package/docs/recipes/kickassembler/screenshots/paddle-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/paddle-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/palette-cells-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/palette-cells.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pseudo-3d-road-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pseudo-3d-road.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pwm-digi-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pwm-digi.png +0 -0
- package/docs/recipes/kickassembler/screenshots/raster-bars.png +0 -0
- package/docs/recipes/kickassembler/screenshots/reu-dma-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/reu-dma.png +0 -0
- package/docs/recipes/kickassembler/screenshots/runtime-relocation-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/runtime-relocation.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-dissolve-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-dissolve.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-wipe-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-wipe.png +0 -0
- package/docs/recipes/kickassembler/screenshots/scroll-panel-split-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/scroll-panel-split.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sfx-in-player-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sfx-in-player.png +0 -0
- package/docs/recipes/kickassembler/screenshots/shadebobs-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/shadebobs.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sideborder-open.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sine-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sine-table-runtime-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sine-table-runtime.png +0 -0
- package/docs/recipes/kickassembler/screenshots/software-sprite-preshifted-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/software-sprite-preshifted.png +0 -0
- package/docs/recipes/kickassembler/screenshots/speedcode-generator-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/speedcode-generator.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-border-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-border-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-cache-flip-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-cache-flip.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-multiplex-24.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-multiplex-game-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-multiplex-game.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-priority-classes-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-priority-classes.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-sine-chain-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-sine-chain.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-stretcher-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-stretcher.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprites-only-screen-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprites-only-screen.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sqrt-atan2-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sqrt-atan2.png +0 -0
- package/docs/recipes/kickassembler/screenshots/stable-raster-irq-control.png +0 -0
- package/docs/recipes/kickassembler/screenshots/stable-raster-irq.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tech-tech-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tech-tech.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tod-alarm-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tod-alarm.png +0 -0
- package/docs/recipes/kickassembler/screenshots/topbottom-border-open.png +0 -0
- package/docs/recipes/kickassembler/screenshots/twister-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/twister.png +0 -0
- package/docs/recipes/kickassembler/screenshots/unit-test-driver-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/unit-test-driver.png +0 -0
- package/docs/recipes/kickassembler/screenshots/vector-balls-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/vector-balls.png +0 -0
- package/docs/recipes/kickassembler/screenshots/wireframe-ships-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/wireframe-ships.png +0 -0
- package/docs/recipes/kickassembler/scroll-panel-split.md +381 -0
- package/docs/recipes/kickassembler/sfx-in-player.md +907 -0
- package/docs/recipes/kickassembler/shadebobs.md +522 -0
- package/docs/recipes/kickassembler/sideborder-open.md +338 -0
- package/docs/recipes/kickassembler/sine-scroller.md +321 -0
- package/docs/recipes/kickassembler/sine-table-runtime.md +815 -0
- package/docs/recipes/kickassembler/software-sprite-preshifted.md +725 -0
- package/docs/recipes/kickassembler/speedcode-generator.md +606 -0
- package/docs/recipes/kickassembler/sprite-border-scroller.md +696 -0
- package/docs/recipes/kickassembler/sprite-cache-flip.md +1071 -0
- package/docs/recipes/kickassembler/sprite-multiplex-24.md +326 -0
- package/docs/recipes/kickassembler/sprite-multiplex-game.md +986 -0
- package/docs/recipes/kickassembler/sprite-priority-classes.md +463 -0
- package/docs/recipes/kickassembler/sprite-sine-chain.md +338 -0
- package/docs/recipes/kickassembler/sprite-stretcher.md +501 -0
- package/docs/recipes/kickassembler/sprites-only-screen.md +550 -0
- package/docs/recipes/kickassembler/sqrt-atan2.md +1014 -0
- package/docs/recipes/kickassembler/stable-raster-irq.md +360 -0
- package/docs/recipes/kickassembler/tape-turbo-loader.md +875 -0
- package/docs/recipes/kickassembler/tech-tech.md +679 -0
- package/docs/recipes/kickassembler/tod-alarm.md +754 -0
- package/docs/recipes/kickassembler/topbottom-border-open.md +407 -0
- package/docs/recipes/kickassembler/twister.md +518 -0
- package/docs/recipes/kickassembler/unit-test-driver.md +314 -0
- package/docs/recipes/kickassembler/vector-balls.md +545 -0
- package/docs/recipes/kickassembler/wireframe-ships.md +2324 -0
- package/docs/recipes/oscar64/actor-activation-window.md +807 -0
- package/docs/recipes/oscar64/adventure-engine.md +1094 -0
- package/docs/recipes/oscar64/attract-replay.md +465 -0
- package/docs/recipes/oscar64/beat-em-up-lanes.md +563 -0
- package/docs/recipes/oscar64/bfs-distance-map.md +723 -0
- package/docs/recipes/oscar64/bitmap-koala-viewer.md +355 -0
- package/docs/recipes/oscar64/car-contact.md +950 -0
- package/docs/recipes/oscar64/cave-scan.md +609 -0
- package/docs/recipes/oscar64/char-bullets.md +477 -0
- package/docs/recipes/oscar64/charset-animation.md +383 -0
- package/docs/recipes/oscar64/charset-parallax.md +401 -0
- package/docs/recipes/oscar64/destructible-terrain.md +1099 -0
- package/docs/recipes/oscar64/difficulty-tables.md +654 -0
- package/docs/recipes/oscar64/dig-and-guards.md +975 -0
- package/docs/recipes/oscar64/directory-reader.md +535 -0
- package/docs/recipes/oscar64/divide-check.md +581 -0
- package/docs/recipes/oscar64/double-buffer-nomirror.md +205 -0
- package/docs/recipes/oscar64/double-buffer.md +255 -0
- package/docs/recipes/oscar64/falling-blocks.md +874 -0
- package/docs/recipes/oscar64/fixed-point-jump-velocity.md +289 -0
- package/docs/recipes/oscar64/fixed-point-jump.md +210 -0
- package/docs/recipes/oscar64/flip-screen-rooms.md +793 -0
- package/docs/recipes/oscar64/frame-sync-loop-overrun.md +214 -0
- package/docs/recipes/oscar64/frame-sync-loop.md +254 -0
- package/docs/recipes/oscar64/game-tree-search.md +743 -0
- package/docs/recipes/oscar64/ghost-targeting.md +867 -0
- package/docs/recipes/oscar64/headless-verify.md +345 -0
- package/docs/recipes/oscar64/hello-world.md +83 -0
- package/docs/recipes/oscar64/high-score-persist.md +772 -0
- package/docs/recipes/oscar64/iffl-kernal-skip.md +421 -0
- package/docs/recipes/oscar64/joystick-input.md +358 -0
- package/docs/recipes/oscar64/lane-pursuit.md +1028 -0
- package/docs/recipes/oscar64/level-rle-decoder.md +620 -0
- package/docs/recipes/oscar64/lfsr-random-seed2.md +338 -0
- package/docs/recipes/oscar64/lfsr-random.md +403 -0
- package/docs/recipes/oscar64/load-asset-runtime.md +492 -0
- package/docs/recipes/oscar64/memory-layout.md +232 -0
- package/docs/recipes/oscar64/mixed-fighters.md +781 -0
- package/docs/recipes/oscar64/multi-sprite-object.md +533 -0
- package/docs/recipes/oscar64/nav-area-pathfinding.md +881 -0
- package/docs/recipes/oscar64/object-pool.md +572 -0
- package/docs/recipes/oscar64/pal-ntsc-detect.md +257 -0
- package/docs/recipes/oscar64/password-state.md +532 -0
- package/docs/recipes/oscar64/per-frame-hitbox.md +651 -0
- package/docs/recipes/oscar64/petscii-screen-codes.md +428 -0
- package/docs/recipes/oscar64/platformer-scaffold.md +1467 -0
- package/docs/recipes/oscar64/print-number.md +367 -0
- package/docs/recipes/oscar64/raster-bars.md +239 -0
- package/docs/recipes/oscar64/raster-profile-bars.md +404 -0
- package/docs/recipes/oscar64/rel-side-sectors.md +391 -0
- package/docs/recipes/oscar64/relative-file-records.md +378 -0
- package/docs/recipes/oscar64/save-load-seq-file.md +365 -0
- package/docs/recipes/oscar64/screenshots/README.md +99 -0
- package/docs/recipes/oscar64/screenshots/actor-activation-window-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/actor-activation-window.png +0 -0
- package/docs/recipes/oscar64/screenshots/adventure-engine-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/adventure-engine.png +0 -0
- package/docs/recipes/oscar64/screenshots/attract-replay-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/attract-replay.png +0 -0
- package/docs/recipes/oscar64/screenshots/beat-em-up-lanes-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/beat-em-up-lanes.png +0 -0
- package/docs/recipes/oscar64/screenshots/bfs-distance-map-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/bfs-distance-map.png +0 -0
- package/docs/recipes/oscar64/screenshots/bitmap-koala-viewer.png +0 -0
- package/docs/recipes/oscar64/screenshots/car-contact-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/car-contact.png +0 -0
- package/docs/recipes/oscar64/screenshots/cave-scan-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/cave-scan.png +0 -0
- package/docs/recipes/oscar64/screenshots/char-bullets-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/char-bullets.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-animation-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-animation.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-parallax-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-parallax.png +0 -0
- package/docs/recipes/oscar64/screenshots/destructible-terrain-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/destructible-terrain.png +0 -0
- package/docs/recipes/oscar64/screenshots/difficulty-tables-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/difficulty-tables.png +0 -0
- package/docs/recipes/oscar64/screenshots/dig-and-guards-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/dig-and-guards.png +0 -0
- package/docs/recipes/oscar64/screenshots/directory-reader-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/directory-reader.png +0 -0
- package/docs/recipes/oscar64/screenshots/divide-check-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/divide-check.png +0 -0
- package/docs/recipes/oscar64/screenshots/double-buffer-nomirror.png +0 -0
- package/docs/recipes/oscar64/screenshots/double-buffer-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/double-buffer.png +0 -0
- package/docs/recipes/oscar64/screenshots/falling-blocks-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/falling-blocks.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump-velocity-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump-velocity.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump.png +0 -0
- package/docs/recipes/oscar64/screenshots/flip-screen-rooms-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/flip-screen-rooms.png +0 -0
- package/docs/recipes/oscar64/screenshots/frame-sync-loop-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/frame-sync-loop-overrun.png +0 -0
- package/docs/recipes/oscar64/screenshots/frame-sync-loop.png +0 -0
- package/docs/recipes/oscar64/screenshots/game-tree-search-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/game-tree-search.png +0 -0
- package/docs/recipes/oscar64/screenshots/ghost-targeting-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/ghost-targeting.png +0 -0
- package/docs/recipes/oscar64/screenshots/headless-verify-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/headless-verify.png +0 -0
- package/docs/recipes/oscar64/screenshots/hello-world.png +0 -0
- package/docs/recipes/oscar64/screenshots/high-score-persist-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/high-score-persist.png +0 -0
- package/docs/recipes/oscar64/screenshots/iffl-kernal-skip-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/iffl-kernal-skip.png +0 -0
- package/docs/recipes/oscar64/screenshots/joystick-input-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/joystick-input.png +0 -0
- package/docs/recipes/oscar64/screenshots/lane-pursuit-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/lane-pursuit.png +0 -0
- package/docs/recipes/oscar64/screenshots/level-rle-decoder-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/level-rle-decoder.png +0 -0
- package/docs/recipes/oscar64/screenshots/lfsr-random-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/lfsr-random-seed2.png +0 -0
- package/docs/recipes/oscar64/screenshots/lfsr-random.png +0 -0
- package/docs/recipes/oscar64/screenshots/load-asset-runtime-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/load-asset-runtime.png +0 -0
- package/docs/recipes/oscar64/screenshots/memory-layout-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/memory-layout.png +0 -0
- package/docs/recipes/oscar64/screenshots/mixed-fighters-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/mixed-fighters.png +0 -0
- package/docs/recipes/oscar64/screenshots/multi-sprite-object-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/multi-sprite-object.png +0 -0
- package/docs/recipes/oscar64/screenshots/nav-area-pathfinding-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/nav-area-pathfinding.png +0 -0
- package/docs/recipes/oscar64/screenshots/object-pool-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/object-pool.png +0 -0
- package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-oldntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-pal.png +0 -0
- package/docs/recipes/oscar64/screenshots/password-state-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/password-state.png +0 -0
- package/docs/recipes/oscar64/screenshots/per-frame-hitbox-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/per-frame-hitbox.png +0 -0
- package/docs/recipes/oscar64/screenshots/petscii-screen-codes-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/petscii-screen-codes.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold-d64-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold-d64.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold.png +0 -0
- package/docs/recipes/oscar64/screenshots/print-number-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/print-number.png +0 -0
- package/docs/recipes/oscar64/screenshots/raster-bars.png +0 -0
- package/docs/recipes/oscar64/screenshots/raster-profile-bars-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/raster-profile-bars.png +0 -0
- package/docs/recipes/oscar64/screenshots/rel-side-sectors-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/rel-side-sectors.png +0 -0
- package/docs/recipes/oscar64/screenshots/relative-file-records-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/relative-file-records.png +0 -0
- package/docs/recipes/oscar64/screenshots/save-load-seq-file-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/save-load-seq-file.png +0 -0
- package/docs/recipes/oscar64/screenshots/seeded-level-fill-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/seeded-level-fill.png +0 -0
- package/docs/recipes/oscar64/screenshots/sfx-engine-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/sfx-engine.png +0 -0
- package/docs/recipes/oscar64/screenshots/sid-music-player.png +0 -0
- package/docs/recipes/oscar64/screenshots/simple-shmup.png +0 -0
- package/docs/recipes/oscar64/screenshots/slope-collision-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/slope-collision.png +0 -0
- package/docs/recipes/oscar64/screenshots/soft-scroll-h.png +0 -0
- package/docs/recipes/oscar64/screenshots/sprite-animation-table-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/sprite-animation-table.png +0 -0
- package/docs/recipes/oscar64/screenshots/sprite-multiplex-8.png +0 -0
- package/docs/recipes/oscar64/screenshots/stable-raster-irq.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-input-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-input.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-gameover.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-notrail-control.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-ungated-control.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-window-menu-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-window-menu.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-grid-collision-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-grid-collision.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-map-render-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-map-render.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-player-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-player.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-word-parser-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-word-parser.png +0 -0
- package/docs/recipes/oscar64/screenshots/vehicle-control-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/vehicle-control.png +0 -0
- package/docs/recipes/oscar64/screenshots/wave-director-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/wave-director.png +0 -0
- package/docs/recipes/oscar64/seeded-level-fill.md +364 -0
- package/docs/recipes/oscar64/sfx-engine.md +514 -0
- package/docs/recipes/oscar64/sid-music-player.md +441 -0
- package/docs/recipes/oscar64/simple-shmup.md +1000 -0
- package/docs/recipes/oscar64/slope-collision.md +610 -0
- package/docs/recipes/oscar64/soft-scroll-h.md +261 -0
- package/docs/recipes/oscar64/sprite-animation-table.md +671 -0
- package/docs/recipes/oscar64/sprite-multiplex-8.md +314 -0
- package/docs/recipes/oscar64/stable-raster-irq.md +236 -0
- package/docs/recipes/oscar64/text-input.md +274 -0
- package/docs/recipes/oscar64/text-overlay-playfield.md +617 -0
- package/docs/recipes/oscar64/text-window-menu.md +551 -0
- package/docs/recipes/oscar64/tile-grid-collision.md +563 -0
- package/docs/recipes/oscar64/tile-map-render.md +395 -0
- package/docs/recipes/oscar64/two-player.md +528 -0
- package/docs/recipes/oscar64/two-word-parser.md +510 -0
- package/docs/recipes/oscar64/vehicle-control.md +771 -0
- package/docs/recipes/oscar64/wave-director.md +787 -0
- package/docs/recipes/runs.json +1606 -0
- package/docs/runtime/sim6502-reference.md +466 -0
- package/docs/runtime/vice-mcp-reference.md +351 -0
- package/docs/runtime/vice-reference.md +1393 -0
- package/docs/techniques/bitmap-modes.md +685 -0
- package/docs/techniques/cpu-cycle-tricks.md +1570 -0
- package/docs/techniques/effects-vector-3d.md +1431 -0
- package/docs/techniques/file-io.md +1427 -0
- package/docs/techniques/input.md +1072 -0
- package/docs/techniques/loaders-packers.md +768 -0
- package/docs/techniques/logic.md +3091 -0
- package/docs/techniques/maths.md +1524 -0
- package/docs/techniques/memory-banking.md +1686 -0
- package/docs/techniques/music-sid.md +1144 -0
- package/docs/techniques/raster.md +1543 -0
- package/docs/techniques/scroll.md +1292 -0
- package/docs/techniques/sprite.md +2566 -0
- package/docs/techniques/text-mode-render.md +717 -0
- package/docs/techniques/text.md +1095 -0
- package/docs/techniques/transitions.md +405 -0
- package/docs/toolchains/cartconv-reference.md +262 -0
- package/docs/toolchains/cc1541-reference.md +316 -0
- package/docs/toolchains/cc65-reference.md +667 -0
- package/docs/toolchains/error-sources/cc65/README.md +1 -0
- package/docs/toolchains/error-sources/cc65/missing-setcpu.s +4 -0
- package/docs/toolchains/error-sources/cc65/range-error.s +4 -0
- package/docs/toolchains/error-sources/cc65/segment-overflow.c +6 -0
- package/docs/toolchains/error-sources/cc65/unresolved-external.c +6 -0
- package/docs/toolchains/error-sources/kickassembler/README.md +1 -0
- package/docs/toolchains/error-sources/kickassembler/branch-out-of-range.asm +4 -0
- package/docs/toolchains/error-sources/kickassembler/failed-assert.asm +3 -0
- package/docs/toolchains/error-sources/kickassembler/flat-lib.asm +4 -0
- package/docs/toolchains/error-sources/kickassembler/import-source-no-namespace.asm +5 -0
- package/docs/toolchains/error-sources/kickassembler/macro-without-parentheses.asm +6 -0
- package/docs/toolchains/error-sources/kickassembler/memory-block-overlap.asm +4 -0
- package/docs/toolchains/error-sources/kickassembler/symbol-clash-lib.asm +5 -0
- package/docs/toolchains/error-sources/kickassembler/symbol-clash-main.asm +6 -0
- package/docs/toolchains/error-sources/kickassembler/unknown-symbol.asm +4 -0
- package/docs/toolchains/error-sources/oscar64/README.md +1 -0
- package/docs/toolchains/error-sources/oscar64/asm-addressing-mode.c +7 -0
- package/docs/toolchains/error-sources/oscar64/region-overflow.c +6 -0
- package/docs/toolchains/error-sources/oscar64/undefined-extern-var.c +5 -0
- package/docs/toolchains/error-sources/oscar64/undefined-extern.c +6 -0
- package/docs/toolchains/error-sources/oscar64/unknown-vic-field.c +6 -0
- package/docs/toolchains/error-sources/oscar64/void-main.c +3 -0
- package/docs/toolchains/kickassembler-reference.md +1020 -0
- package/docs/toolchains/memory-layout-planning.md +362 -0
- package/docs/toolchains/oscar64-headers-reference.md +583 -0
- package/docs/toolchains/oscar64-reference.md +892 -0
- package/docs/toolchains/petcat-reference.md +290 -0
- package/docs/toolchains/png2prg.md +188 -0
- package/docs/toolchains/release-disk.md +314 -0
- package/docs/toolchains/sidreloc.md +236 -0
- package/docs/toolchains/spindle-reference.md +487 -0
- package/docs/toolchains/tape-mastering.md +592 -0
- package/docs/toolchains/unit-testing-6502.md +281 -0
- package/docs/workflow/agent-harness.md +478 -0
- package/package.json +105 -0
- package/templates/_harness/CLAUDE.md.template +91 -0
- package/templates/_harness/PLAN.md.template +72 -0
- package/templates/_harness/check.py +442 -0
- package/templates/_harness/claude/settings.json +17 -0
- package/templates/_harness/gen-asm-header.py +96 -0
- package/templates/_harness/harness.mk +273 -0
- package/templates/_harness/hooks/plan-gate.py +185 -0
- package/templates/_harness/meter/frame_meter.asm +311 -0
- package/templates/_harness/meter/frame_meter.c +155 -0
- package/templates/_harness/meter/frame_meter.h +80 -0
- package/templates/_harness/zp-used.py +104 -0
- package/templates/action-puzzle/.claude/settings.json +17 -0
- package/templates/action-puzzle/.mcp.json +10 -0
- package/templates/action-puzzle/CLAUDE.md +120 -0
- package/templates/action-puzzle/Makefile +125 -0
- package/templates/action-puzzle/PLAN.md +388 -0
- package/templates/action-puzzle/README.md +240 -0
- package/templates/action-puzzle/expect.json +25 -0
- package/templates/action-puzzle/src/cave.c +280 -0
- package/templates/action-puzzle/src/cave.h +80 -0
- package/templates/action-puzzle/src/gen_autopilot.h +20 -0
- package/templates/action-puzzle/src/gen_caves.h +59 -0
- package/templates/action-puzzle/src/gen_notes.h +16 -0
- package/templates/action-puzzle/src/hiscore.c +152 -0
- package/templates/action-puzzle/src/hiscore.h +41 -0
- package/templates/action-puzzle/src/level.c +64 -0
- package/templates/action-puzzle/src/level.h +24 -0
- package/templates/action-puzzle/src/main.c +599 -0
- package/templates/action-puzzle/src/render.c +239 -0
- package/templates/action-puzzle/src/render.h +31 -0
- package/templates/action-puzzle/src/sound.c +158 -0
- package/templates/action-puzzle/src/sound.h +22 -0
- package/templates/action-puzzle/tools/disk_check.py +77 -0
- package/templates/action-puzzle/tools/drive.py +106 -0
- package/templates/action-puzzle/tools/gen.py +454 -0
- package/templates/action-puzzle/tools/model_check.py +49 -0
- package/templates/action-puzzle/tools/verdict_codes.py +24 -0
- package/templates/adventure/.claude/settings.json +17 -0
- package/templates/adventure/.mcp.json +10 -0
- package/templates/adventure/CLAUDE.md +118 -0
- package/templates/adventure/Makefile +113 -0
- package/templates/adventure/PLAN.md +396 -0
- package/templates/adventure/README.md +277 -0
- package/templates/adventure/expect.json +25 -0
- package/templates/adventure/src/engine.c +543 -0
- package/templates/adventure/src/engine.h +48 -0
- package/templates/adventure/src/gen_script.h +141 -0
- package/templates/adventure/src/gen_world.h +511 -0
- package/templates/adventure/src/main.c +439 -0
- package/templates/adventure/src/picture.c +83 -0
- package/templates/adventure/src/picture.h +16 -0
- package/templates/adventure/src/save.c +159 -0
- package/templates/adventure/src/save.h +25 -0
- package/templates/adventure/src/sound.c +71 -0
- package/templates/adventure/src/sound.h +16 -0
- package/templates/adventure/src/text.c +349 -0
- package/templates/adventure/src/text.h +40 -0
- package/templates/adventure/tools/disk_check.py +128 -0
- package/templates/adventure/tools/drive.py +119 -0
- package/templates/adventure/tools/gen.py +1033 -0
- package/templates/adventure/tools/world.py +356 -0
- package/templates/beat-em-up/.claude/settings.json +17 -0
- package/templates/beat-em-up/.mcp.json +10 -0
- package/templates/beat-em-up/CLAUDE.md +136 -0
- package/templates/beat-em-up/Makefile +96 -0
- package/templates/beat-em-up/PLAN.md +502 -0
- package/templates/beat-em-up/README.md +315 -0
- package/templates/beat-em-up/expect-gameover.json +8 -0
- package/templates/beat-em-up/expect.json +29 -0
- package/templates/beat-em-up/src/anim.c +70 -0
- package/templates/beat-em-up/src/art.c +344 -0
- package/templates/beat-em-up/src/autopilot.h +154 -0
- package/templates/beat-em-up/src/brute.c +273 -0
- package/templates/beat-em-up/src/enemy.c +281 -0
- package/templates/beat-em-up/src/engine.asm +512 -0
- package/templates/beat-em-up/src/fighter.c +384 -0
- package/templates/beat-em-up/src/game.h +269 -0
- package/templates/beat-em-up/src/hud.c +135 -0
- package/templates/beat-em-up/src/main.c +341 -0
- package/templates/beat-em-up/src/sound.c +44 -0
- package/templates/beat-em-up/src/street.c +93 -0
- package/templates/beat-em-up/src/verdict.h +523 -0
- package/templates/beat-em-up/src/view.c +362 -0
- package/templates/beat-em-up/tools/drive.py +105 -0
- package/templates/beat-em-up/tools/flickercheck.py +273 -0
- package/templates/demo/.claude/settings.json +17 -0
- package/templates/demo/.mcp.json +10 -0
- package/templates/demo/CLAUDE.md +129 -0
- package/templates/demo/Makefile +66 -0
- package/templates/demo/PLAN.md +401 -0
- package/templates/demo/README.md +322 -0
- package/templates/demo/expect.json +945 -0
- package/templates/demo/src/config.asm +80 -0
- package/templates/demo/src/framework.asm +390 -0
- package/templates/demo/src/main.asm +139 -0
- package/templates/demo/src/music.asm +197 -0
- package/templates/demo/src/part_main.asm +279 -0
- package/templates/demo/src/part_title.asm +79 -0
- package/templates/demo/src/parts.asm +43 -0
- package/templates/demo/src/tables.asm +73 -0
- package/templates/demo/src/verdict.asm +179 -0
- package/templates/demo/tools/audio.py +80 -0
- package/templates/demo/tools/gen_expect.py +167 -0
- package/templates/demo/tools/probe.py +95 -0
- package/templates/hello/.claude/settings.json +17 -0
- package/templates/hello/.mcp.json +10 -0
- package/templates/hello/CLAUDE.md +100 -0
- package/templates/hello/Makefile +38 -0
- package/templates/hello/PLAN.md +200 -0
- package/templates/hello/expect.json +20 -0
- package/templates/hello/src/main.c +161 -0
- package/templates/hello/src/sprite.asm +27 -0
- package/templates/hello-kick/.claude/settings.json +17 -0
- package/templates/hello-kick/.mcp.json +10 -0
- package/templates/hello-kick/CLAUDE.md +100 -0
- package/templates/hello-kick/Makefile +17 -0
- package/templates/hello-kick/PLAN.md +199 -0
- package/templates/hello-kick/expect.json +20 -0
- package/templates/hello-kick/src/main.asm +233 -0
- package/templates/platformer/.claude/settings.json +17 -0
- package/templates/platformer/.mcp.json +10 -0
- package/templates/platformer/CLAUDE.md +125 -0
- package/templates/platformer/Makefile +86 -0
- package/templates/platformer/PLAN.md +360 -0
- package/templates/platformer/README.md +277 -0
- package/templates/platformer/expect.json +32 -0
- package/templates/platformer/src/actors.c +289 -0
- package/templates/platformer/src/anim.c +51 -0
- package/templates/platformer/src/art.c +212 -0
- package/templates/platformer/src/autopilot.h +30 -0
- package/templates/platformer/src/engine.asm +253 -0
- package/templates/platformer/src/game.h +248 -0
- package/templates/platformer/src/hud.c +90 -0
- package/templates/platformer/src/level.c +184 -0
- package/templates/platformer/src/main.c +306 -0
- package/templates/platformer/src/player.c +268 -0
- package/templates/platformer/src/sound.c +42 -0
- package/templates/platformer/src/verdict.h +206 -0
- package/templates/platformer/src/view.c +331 -0
- package/templates/platformer/stage-expect.json +6 -0
- package/templates/platformer/tools/drive.py +112 -0
- package/templates/platformer/tools/tearcheck.py +229 -0
- package/templates/shmup-vertical/.claude/settings.json +17 -0
- package/templates/shmup-vertical/.mcp.json +10 -0
- package/templates/shmup-vertical/CLAUDE.md +137 -0
- package/templates/shmup-vertical/Makefile +131 -0
- package/templates/shmup-vertical/PLAN.md +569 -0
- package/templates/shmup-vertical/README.md +189 -0
- package/templates/shmup-vertical/expect.json +38 -0
- package/templates/shmup-vertical/src/bullets.c +158 -0
- package/templates/shmup-vertical/src/bullets.h +35 -0
- package/templates/shmup-vertical/src/display.c +239 -0
- package/templates/shmup-vertical/src/display.h +40 -0
- package/templates/shmup-vertical/src/game.h +85 -0
- package/templates/shmup-vertical/src/glyph.asm +358 -0
- package/templates/shmup-vertical/src/hiscore.c +141 -0
- package/templates/shmup-vertical/src/hiscore.h +16 -0
- package/templates/shmup-vertical/src/hit.asm +180 -0
- package/templates/shmup-vertical/src/hitbox.c +59 -0
- package/templates/shmup-vertical/src/hitbox.h +25 -0
- package/templates/shmup-vertical/src/kernel.asm +330 -0
- package/templates/shmup-vertical/src/level.c +174 -0
- package/templates/shmup-vertical/src/level.h +27 -0
- package/templates/shmup-vertical/src/main.c +824 -0
- package/templates/shmup-vertical/src/mux.asm +321 -0
- package/templates/shmup-vertical/src/sound.asm +255 -0
- package/templates/shmup-vertical/src/step.asm +169 -0
- package/templates/shmup-vertical/src/waves.c +195 -0
- package/templates/shmup-vertical/src/waves.h +33 -0
- package/templates/shmup-vertical/stage-expect.json +6 -0
- package/templates/shmup-vertical/tools/drive.py +152 -0
- package/templates/shmup-vertical/tools/joytest.py +159 -0
- package/templates/shmup-vertical/tools/meter.py +15 -0
- 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
|