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