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,487 @@
|
|
|
1
|
+
---
|
|
2
|
+
tool: spindle
|
|
3
|
+
tool_kind: linker
|
|
4
|
+
maintainer: Linus Åkesson (lft)
|
|
5
|
+
license: MIT
|
|
6
|
+
home_url: https://linusakesson.net/software/spindle/
|
|
7
|
+
version_verified: "3.1"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
<!-- doc-type: toolchain-reference -->
|
|
11
|
+
|
|
12
|
+
# Spindle: a trackmo linker and IRQ loader that builds the D64
|
|
13
|
+
|
|
14
|
+
## Tool
|
|
15
|
+
|
|
16
|
+
Spindle is Linus Åkesson's loading and linking system for trackmos. A
|
|
17
|
+
demo is written as parts. Each part is assembled with a small header
|
|
18
|
+
that names its lifecycle routines and declares the memory it touches.
|
|
19
|
+
`mkpef` bundles a part's code and data into a `.pef` file. `pefchain`
|
|
20
|
+
reads a script listing the parts in order, with a condition for ending
|
|
21
|
+
each one, and writes a bootable D64: the loader, the drive code, every
|
|
22
|
+
part crunched and scattered across the disk, and a short driver per part
|
|
23
|
+
that calls the routines and the loader at the right moments. At run time
|
|
24
|
+
the loader occupies one page of RAM and streams the next parts in while
|
|
25
|
+
the current one runs. The part does not call the loader; the driver
|
|
26
|
+
does, in an order pefchain worked out at link time.
|
|
27
|
+
|
|
28
|
+
Everything marked "run here" was done on 2026-09-23 with Spindle 3.1
|
|
29
|
+
built from the release archive, KickAssembler 5.25, and VICE 3.10's
|
|
30
|
+
windowless `x64sc` with true drive emulation of a 1541. `pefchain
|
|
31
|
+
--version` and every tool's usage banner print `Spindle 3.1 by lft`.
|
|
32
|
+
|
|
33
|
+
This page is the tool: the command lines, the part contract, the file
|
|
34
|
+
formats and the timings measured through it. The design questions (what
|
|
35
|
+
a part owes the next, the three ways a part ends) are
|
|
36
|
+
`part_lifecycle` and `transition_conditions` in
|
|
37
|
+
[demo-composition](../demo-design/demo-composition.md), and the
|
|
38
|
+
general shape of loading between parts is `multi_load_sequencing` in
|
|
39
|
+
[loaders-packers](../techniques/loaders-packers.md). Those pages
|
|
40
|
+
describe Spindle v2; the reserved memory moved in v3 and this page has
|
|
41
|
+
the v3 figures.
|
|
42
|
+
|
|
43
|
+
**Targets:** 6510
|
|
44
|
+
|
|
45
|
+
## Building Spindle
|
|
46
|
+
|
|
47
|
+
The release is `spindle-3.1.zip` from the home page. The `src/` tree
|
|
48
|
+
builds with `make` on a Unix host and needs a C compiler and the xa65
|
|
49
|
+
cross-assembler (`xa`), which Spindle does not ship: the Makefile
|
|
50
|
+
assembles the loader's bootstrap, the resident code, the drive code and
|
|
51
|
+
the blank part with `xa` and bakes them into C headers before the host
|
|
52
|
+
tools compile. Run here: `make` in `src/` with Homebrew's `xa 2.4.1`
|
|
53
|
+
and Apple clang as `gcc` produced `mkpef`, `pef2prg`, `pefchain`,
|
|
54
|
+
`spin` and `mkheader` with no warnings. The tools are self-contained
|
|
55
|
+
binaries; nothing installs. The archive also carries prebuilt Linux and
|
|
56
|
+
Windows binaries, the `spindle-handbook.pdf` the facts below are taken
|
|
57
|
+
from, a `template/effect.s` in xa syntax, and four examples.
|
|
58
|
+
|
|
59
|
+
`xa` is only needed to build Spindle. Parts can be written in any
|
|
60
|
+
assembler that can emit a raw binary; the worked example below uses
|
|
61
|
+
KickAssembler.
|
|
62
|
+
|
|
63
|
+
## Build pipeline
|
|
64
|
+
|
|
65
|
+
```text
|
|
66
|
+
part.asm --assembler--> part.efo --mkpef--> part.pef --pefchain + script--> demo.d64
|
|
67
|
+
data files ----^
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### .EFO — Effect object (a part's code with the Spindle header in front)
|
|
71
|
+
**Produced by:** kickassembler
|
|
72
|
+
**Consumed by:** spindle
|
|
73
|
+
|
|
74
|
+
A raw binary with no load address. It starts with the fixed header
|
|
75
|
+
described under "The part contract", then the tag list, then a two-byte
|
|
76
|
+
load address for the code that follows. Any assembler can write one;
|
|
77
|
+
KickAssembler needs `-binfile` so the two-byte PRG load address is not
|
|
78
|
+
prepended.
|
|
79
|
+
|
|
80
|
+
### .PEF — Packaged effect (one part with all its data chunks)
|
|
81
|
+
**Produced by:** spindle
|
|
82
|
+
**Consumed by:** spindle
|
|
83
|
+
|
|
84
|
+
`mkpef -o part.pef part.efo [data,addr[,offset[,length]] ...]`. The
|
|
85
|
+
first file is the effect object; further files are data chunks, each
|
|
86
|
+
with an optional load address, byte offset and length in hex (a `+`
|
|
87
|
+
prefix means decimal). `--music` marks chunks that must stay resident
|
|
88
|
+
until another music player is installed; `--stream` marks chunks to be
|
|
89
|
+
fed in across later parts. `pef2prg` turns one `.pef` into a standalone
|
|
90
|
+
PRG for testing, with the condition fixed to the space bar.
|
|
91
|
+
|
|
92
|
+
### .D64 — Single-sided 35-track 1541 disk image
|
|
93
|
+
**Produced by:** spindle
|
|
94
|
+
**Consumed by:** vice, c1541
|
|
95
|
+
|
|
96
|
+
`pefchain -o demo.d64 script`. The image has a normal BAM and directory
|
|
97
|
+
with one PRG in it, the bootstrap. Everything else sits in sectors the
|
|
98
|
+
directory does not describe; the BAM marks them allocated so a DOS copy
|
|
99
|
+
leaves them alone. `-F` writes a 40-track image, `-t` names the disk,
|
|
100
|
+
`-i` sets the ID, `-a` adds directory art, `-d` sets which directory
|
|
101
|
+
entry is the PRG.
|
|
102
|
+
|
|
103
|
+
## The part contract
|
|
104
|
+
|
|
105
|
+
A part is a set of routines the driver calls, plus declarations. The
|
|
106
|
+
handbook's lifecycle, in this page's words: with the previous part still
|
|
107
|
+
on screen, the driver finishes loading anything of this part that is
|
|
108
|
+
not in yet and calls `prepare`. Then it disables interrupts, writes the
|
|
109
|
+
part's interrupt handler address to `$FFFE`, calls `setup`, and enables
|
|
110
|
+
interrupts. While the part runs, the driver polls the script's condition
|
|
111
|
+
and, if the part has a `main` routine, calls it in a loop. Once the
|
|
112
|
+
condition holds it calls `fadeout` until that returns with carry set,
|
|
113
|
+
then `cleanup`, then jumps to the next part's driver. Every routine is
|
|
114
|
+
optional: a zero in the header skips it.
|
|
115
|
+
|
|
116
|
+
The header, in the order the file holds it. Sizes are what the worked
|
|
117
|
+
example assembled and pefchain accepted:
|
|
118
|
+
|
|
119
|
+
| Offset | Size | Field |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| 0 | 4 | The ASCII text `EFO2` |
|
|
122
|
+
| 4 | 2 | Address of `prepare`, or 0 |
|
|
123
|
+
| 6 | 2 | Address of `setup`, or 0 |
|
|
124
|
+
| 8 | 2 | Address of the interrupt handler, written to `$FFFE` by the driver |
|
|
125
|
+
| 10 | 2 | Address of `main`, or 0 |
|
|
126
|
+
| 12 | 2 | Address of `fadeout`, or 0 |
|
|
127
|
+
| 14 | 2 | Address of `cleanup`, or 0 |
|
|
128
|
+
| 16 | 2 | Address of the three-byte music-call slot in the handler, or 0 |
|
|
129
|
+
| 18 | n | Tag list: one letter, then that tag's parameter bytes; a zero byte ends it |
|
|
130
|
+
| 18+n+1 | 2 | Load address of the code that follows |
|
|
131
|
+
|
|
132
|
+
The tags, from the handbook (the worked example used none, and pefchain
|
|
133
|
+
took that as "only the loaded pages are used"):
|
|
134
|
+
|
|
135
|
+
| Tag | Bytes | Meaning |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| `P` first, last | 3 | The part writes this page range at run time (generated tables, buffers). Pages a chunk loads into need no tag. |
|
|
138
|
+
| `I` first, last | 3 | The part inherits this page range from the previous part instead of colliding with it. |
|
|
139
|
+
| `Z` first, last | 3 | Zero-page range the part uses. |
|
|
140
|
+
| `S` | 1 | The interrupt handler saves, sets to `$35` and restores address 1, so loading under I/O may go on during the part. |
|
|
141
|
+
| `U` | 1 | `prepare` or `main` switch the I/O area out; pefchain puts a blank part between this and a preceding part without `S`. |
|
|
142
|
+
| `A` | 1 | Load as little as possible during this part. |
|
|
143
|
+
| `X` | 1 | Load nothing during this part. |
|
|
144
|
+
| `M` lo, hi | 3 | This part installs a music player at that address; `M 0 0` uninstalls. |
|
|
145
|
+
| `J` | 1 | `fadeout` returns a label number in A to jump elsewhere in the script. |
|
|
146
|
+
|
|
147
|
+
The music-call slot is a `bit` instruction with a two-byte absolute
|
|
148
|
+
operand, three bytes long, inside the handler. At link time pefchain
|
|
149
|
+
rewrites it as `jsr` to whichever player the script has installed by
|
|
150
|
+
then, and leaves it as `bit` when none is. See Pitfalls for what
|
|
151
|
+
happens when an assembler shortens it.
|
|
152
|
+
|
|
153
|
+
Rules the handbook states and the example kept: VIC bank selection goes
|
|
154
|
+
through `$DD02`, never `$DD00`; address 1 stays `$35` when the loader
|
|
155
|
+
is called; `prepare` writes no VIC register because the previous part
|
|
156
|
+
still owns the screen; `setup` must write `$D011`, `$D012`, `$D015`,
|
|
157
|
+
`$D016`, `$D018` and `$DD02` because the previous part may have left
|
|
158
|
+
anything in them. Before the first part the framework has already
|
|
159
|
+
disabled CIA 1 interrupts, written 1 to `$D01A`, `$FF` to `$DC02`,
|
|
160
|
+
armed an unacknowledged CIA 2 interrupt so Restore does nothing, and set
|
|
161
|
+
CIA 1 timer B free-running with a 63-cycle period in step with the
|
|
162
|
+
raster for jitter correction.
|
|
163
|
+
|
|
164
|
+
## Memory the loader keeps
|
|
165
|
+
|
|
166
|
+
Spindle 3 keeps one resident page, `$0200` to `$02FF` by default, and
|
|
167
|
+
during a loader call also writes a buffer page, `$0300` to `$03FF` by
|
|
168
|
+
default, and five zero-page bytes at `$F4` to `$F8`. `pefchain -r`, `-b`
|
|
169
|
+
and `-z` move all three. Between loader calls the buffer page and the
|
|
170
|
+
zero-page bytes may be used, if declared with `P` and `Z`; the resident
|
|
171
|
+
page may not be touched. pefchain's own suggestion text confirms the
|
|
172
|
+
default fence: it offered "pages 04-2f,31-ff and zero-page locations
|
|
173
|
+
02-f3,f9-ff" as the free space around a part that used page `$30` (run
|
|
174
|
+
here, quoted from the collision case below). Note `$0400` to `$07FF` is
|
|
175
|
+
not reserved: the default screen is ordinary free memory to pefchain,
|
|
176
|
+
and the worked example shows what that means.
|
|
177
|
+
|
|
178
|
+
## The script and the pefchain command line
|
|
179
|
+
|
|
180
|
+
One part per line: the `.pef` path, whitespace, the condition. `#`
|
|
181
|
+
starts a comment. Blank lines are ignored. `-` as the part name is the
|
|
182
|
+
built-in blank part (black screen, no badlines, a handler that only
|
|
183
|
+
calls the music player). `|` as the part name continues the previous
|
|
184
|
+
part with a further condition. Numbers are hex unless prefixed `+`.
|
|
185
|
+
|
|
186
|
+
| Condition | Meaning |
|
|
187
|
+
|---|---|
|
|
188
|
+
| `space` | Advance when space is pressed. |
|
|
189
|
+
| `-` | Advance as soon as any loading scheduled for this part is done. |
|
|
190
|
+
| `addr = value` | Advance when the byte at `addr` holds `value`; the way a part follows the tune. |
|
|
191
|
+
| `stay` | Never advance; for the last line. |
|
|
192
|
+
| `@...` | Music interlock, see the handbook's Music section; not exercised here. |
|
|
193
|
+
|
|
194
|
+
A label is a line `n:` with `n` in hex `00` to `3F`; a part with the `J`
|
|
195
|
+
tag can jump to it, and `-L n` loops the script back to it at the end.
|
|
196
|
+
|
|
197
|
+
```text
|
|
198
|
+
pefchain -v -o demo.d64 script # link; -v prints each part's driver address, crunch ratio and a load chart
|
|
199
|
+
pefchain -vv -o demo.d64 script # also dumps every driver's bytes
|
|
200
|
+
pefchain -r 0c -b 0d -z 02 -o demo.d64 script # move the resident page, buffer page and zero-page bytes
|
|
201
|
+
pefchain -t "my demo" -i xy -o demo.d64 script # disk name and ID
|
|
202
|
+
pefchain -E 5 -o demo.d64 script # simulate read errors with 5 % probability (decimal)
|
|
203
|
+
mkpef -v -o part.pef part.efo # package; -v prints the part's memory chart
|
|
204
|
+
pef2prg -o part.prg -m bounds.mon part.pef # standalone test build plus a VICE watch script for undeclared writes
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The `-v` chart has one row per part and one column per four pages:
|
|
208
|
+
`r` the resident page, `|` the buffer page, `c` code loaded for this
|
|
209
|
+
part, `*` data being loaded ahead for a later part, `.` free. The last
|
|
210
|
+
column is the number of disk sectors the loader reads during that
|
|
211
|
+
part's slot. A byte size of the loader is not printed; the resident is
|
|
212
|
+
one page by construction, and the bootstrap PRG's size is in the D64
|
|
213
|
+
layout below.
|
|
214
|
+
|
|
215
|
+
## Worked example, run here
|
|
216
|
+
|
|
217
|
+
Two parts, each one source file assembled twice. Part 1 sets the border
|
|
218
|
+
red and ends after 150 frames; part 2 sets it green and ends after 200.
|
|
219
|
+
The frame count is a byte the handler increments, and the script's
|
|
220
|
+
`addr = value` condition reads it. `fadeout` sets carry at once, and its
|
|
221
|
+
store to `$D020` (the same colour, so nothing visible changes) marks the
|
|
222
|
+
instant the part ended for the trace below.
|
|
223
|
+
|
|
224
|
+
```kickass
|
|
225
|
+
// One Spindle part, built twice: part 1 by default, part 2 with -define PART2.
|
|
226
|
+
// Assemble with -binfile: an .efo has no load address, the header comes first.
|
|
227
|
+
// java -jar KickAss.jar -binfile spindle-part.asm -o part1.efo
|
|
228
|
+
// java -jar KickAss.jar -binfile -define PART2 spindle-part.asm -o part2.efo
|
|
229
|
+
#if PART2
|
|
230
|
+
.const CODE = $4000
|
|
231
|
+
.const BORDER = 5 // green
|
|
232
|
+
#else
|
|
233
|
+
.const CODE = $3000
|
|
234
|
+
.const BORDER = 2 // red
|
|
235
|
+
#endif
|
|
236
|
+
|
|
237
|
+
.encoding "ascii"
|
|
238
|
+
.pc = CODE - 21 "efo header"
|
|
239
|
+
.text "EFO2" // magic
|
|
240
|
+
.word 0 // prepare: none
|
|
241
|
+
.word setup // setup: VIC registers, interrupts off
|
|
242
|
+
.word irq // interrupt handler, written to $fffe by the driver
|
|
243
|
+
.word 0 // main: none, so the loader may run freely
|
|
244
|
+
.word fadeout // fadeout: returns with carry set at once
|
|
245
|
+
.word 0 // cleanup: none
|
|
246
|
+
.word playcall // the three-byte slot the linker patches to a jsr
|
|
247
|
+
.byte 0 // end of the tag list: no P/I/Z tags, every page used is loaded
|
|
248
|
+
.word CODE // load address of the code that follows
|
|
249
|
+
.errorif * != CODE, "header is not 21 bytes"
|
|
250
|
+
|
|
251
|
+
.pc = CODE "part"
|
|
252
|
+
frames: .byte 0 // pefchain's "address = value" condition reads this byte
|
|
253
|
+
|
|
254
|
+
setup:
|
|
255
|
+
lda #$3c
|
|
256
|
+
sta $dd02 // VIC bank 0 through $dd02, never $dd00
|
|
257
|
+
lda #0
|
|
258
|
+
sta $d015 // sprites off
|
|
259
|
+
sta $d021 // black screen
|
|
260
|
+
lda #BORDER
|
|
261
|
+
sta $d020 // the part's colour
|
|
262
|
+
lda #$1b
|
|
263
|
+
sta $d011 // text mode, 25 rows, raster bit 8 clear
|
|
264
|
+
lda #$f0
|
|
265
|
+
sta $d012 // one interrupt per frame, line 240
|
|
266
|
+
lda #$c8
|
|
267
|
+
sta $d016
|
|
268
|
+
lda #$15
|
|
269
|
+
sta $d018 // screen $0400, upper-case charset
|
|
270
|
+
rts
|
|
271
|
+
|
|
272
|
+
irq:
|
|
273
|
+
pha
|
|
274
|
+
inc frames // one count per frame
|
|
275
|
+
playcall:
|
|
276
|
+
bit.abs $0000 // must be the three-byte form; plain "bit $0000" assembles to two bytes
|
|
277
|
+
lsr $d019 // acknowledge the raster interrupt
|
|
278
|
+
pla
|
|
279
|
+
rti
|
|
280
|
+
|
|
281
|
+
fadeout:
|
|
282
|
+
lda #BORDER
|
|
283
|
+
sta $d020 // same colour: the store only marks the moment the part ended
|
|
284
|
+
sec // carry set: fade finished, move on
|
|
285
|
+
rts
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
The script, `script`. The blank part at the end keeps the disk from
|
|
289
|
+
running off the script:
|
|
290
|
+
|
|
291
|
+
```text
|
|
292
|
+
# Two parts, then the built-in blank part. Numbers are hex: 96 = 150 frames, c8 = 200.
|
|
293
|
+
part1.pef 3000 = 96
|
|
294
|
+
part2.pef 4000 = c8
|
|
295
|
+
- stay
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
The commands, all exit 0:
|
|
299
|
+
|
|
300
|
+
```text
|
|
301
|
+
java -jar KickAss.jar -binfile spindle-part.asm -o part1.efo # 80 bytes
|
|
302
|
+
java -jar KickAss.jar -binfile -define PART2 spindle-part.asm -o part2.efo # 80 bytes
|
|
303
|
+
mkpef -o part1.pef part1.efo
|
|
304
|
+
mkpef -o part2.pef part2.efo
|
|
305
|
+
pefchain -v -o demo.d64 script
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
pefchain's report: drivers for part 1 and part 2 at `$303B` and
|
|
309
|
+
`$403B`, right after each part's code, and the blank part's driver at
|
|
310
|
+
`$0426`; the chunks `3000-30cc` (205 bytes with the driver, crunched to
|
|
311
|
+
199), `0400-043d` (the blank part, 62 bytes, crunched to 63) and
|
|
312
|
+
`4000-405b` (92 bytes, crunched to 91); one sector read in the
|
|
313
|
+
bootstrap's slot and one during part 1; `662 blocks free (643 for
|
|
314
|
+
DOS)`.
|
|
315
|
+
|
|
316
|
+
Booted with the pinned command shape and the disk in place of a PRG:
|
|
317
|
+
|
|
318
|
+
```text
|
|
319
|
+
x64sc -default -warp +sound +autostart-delay-random -limitcycles N \
|
|
320
|
+
-drive8truedrive -drive8type 1541 -drive8wobbleamplitude 0 -drive8wobblefrequency 0 \
|
|
321
|
+
-exitscreenshot out.png -autostart demo.d64
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
At `N = 8500000` the picture is part 1 (red border, black screen); at
|
|
325
|
+
`N = 12000000` it is part 2 (green). Each was taken twice and the two
|
|
326
|
+
files were byte-identical:
|
|
327
|
+
`../figures/spindle-two-parts-part1.png` and
|
|
328
|
+
`spindle-two-parts-part2.png`. They are not verifier pins: the recipe
|
|
329
|
+
verifier formats a fresh empty D64 when a run asks for a disk and
|
|
330
|
+
autostarts a PRG the page's listing built, so it cannot boot a D64
|
|
331
|
+
pefchain made. A recipe page for this example would have nothing the
|
|
332
|
+
verifier could check, and there is none.
|
|
333
|
+
|
|
334
|
+
Both pictures show two rows of junk characters at the top of the screen
|
|
335
|
+
above the KERNAL's boot text. That is the blank part's code and driver
|
|
336
|
+
at `$0400` to `$043D`, loaded into the screen while part 1 ran: neither
|
|
337
|
+
part declared pages `$04` to `$07`, so to pefchain they were free. A
|
|
338
|
+
part that shows the default screen must clear it in `setup` or declare
|
|
339
|
+
it with `P $04 $07`.
|
|
340
|
+
|
|
341
|
+
### The D64's layout
|
|
342
|
+
|
|
343
|
+
Read from the image with c1541 and a sector walk (run here):
|
|
344
|
+
|
|
345
|
+
- Directory: disk name `spindle disk`, ID `uk`, one entry, `demo`, PRG,
|
|
346
|
+
3 blocks, chained through track 18 sectors 8, 18 and 9. Extracted, the
|
|
347
|
+
file is 663 bytes with its load address and begins with a one-line
|
|
348
|
+
BASIC stub, `1 sys2061`. It is byte-for-byte the length of
|
|
349
|
+
`src/stage1.prg` from the Spindle build, the bootstrap that installs
|
|
350
|
+
the resident page and the drive code.
|
|
351
|
+
- BAM: track 1 has all 21 sectors allocated and every other data track
|
|
352
|
+
is empty; track 18 has 12 sectors allocated (the BAM, the directory,
|
|
353
|
+
the three of the bootstrap, and seven more this page did not
|
|
354
|
+
identify). DOS therefore reports 643 blocks free, which is 664 less
|
|
355
|
+
track 1's 21.
|
|
356
|
+
- The parts and the blank part live on track 1 in Spindle's own sector
|
|
357
|
+
format, outside any directory entry. Unused sectors elsewhere are not
|
|
358
|
+
zero: each holds its own sector number in its first byte. A sector
|
|
359
|
+
census that looks for non-zero blocks sees the whole disk as used;
|
|
360
|
+
read the BAM instead.
|
|
361
|
+
- The drive code assembled from `src/drivecode.s` is 1,536 bytes. Where
|
|
362
|
+
the bootstrap reads it from was not established here.
|
|
363
|
+
|
|
364
|
+
### Timings, measured
|
|
365
|
+
|
|
366
|
+
From a `-moncommands` file with `trace exec 080d`, `trace exec 0200`
|
|
367
|
+
and `trace store d020`, logging the cycle counter. `$080D` is the
|
|
368
|
+
`SYS` target, so its first fetch is the moment `RUN` starts the
|
|
369
|
+
program. `$0200` is the loader entry. PAL:
|
|
370
|
+
|
|
371
|
+
| Cycle | Event |
|
|
372
|
+
|---|---|
|
|
373
|
+
| 6,179,517 | First fetch at `$080D`: `RUN` |
|
|
374
|
+
| 6,644,809 | First loader call from the bootstrap |
|
|
375
|
+
| 7,033,873 | Part 1's `setup` writes `$D020`: 854,356 cycles after `RUN`, 0.87 s |
|
|
376
|
+
| 7,033,917 | Part 1's driver calls the loader: part 2 and the blank part load while part 1 runs |
|
|
377
|
+
| 9,980,779 | Part 1's `fadeout` store: 2,946,906 cycles after its `setup`, 149.92 frames of 19,656 |
|
|
378
|
+
| 9,980,834 | Part 2's `setup` writes `$D020`: 55 cycles after part 1 ended |
|
|
379
|
+
| 13,911,974 | Part 2's `fadeout` store: 3,931,140 cycles after its `setup`, 199.997 frames |
|
|
380
|
+
| 13,912,017 | The blank part's `setup` writes `$D020`: 43 cycles after part 2 ended |
|
|
381
|
+
|
|
382
|
+
NTSC (`-model ntsc`): part 1's `setup` at 7,299,419; its end at
|
|
383
|
+
9,862,381, which is 2,562,962 cycles or 149.92 frames of 17,095; part 2's
|
|
384
|
+
`setup` 55 cycles after that, the same join as PAL.
|
|
385
|
+
|
|
386
|
+
The 55 cycles are all straight-line code and the arithmetic reaches
|
|
387
|
+
them: `sec` and `rts` finishing `fadeout` (8), the driver's `bcc` not
|
|
388
|
+
taken (2) and `jmp` to the next driver (3), `sei` (2), two
|
|
389
|
+
load-and-store pairs writing `$FFFE` and `$FFFF` (12), `jsr setup` (6),
|
|
390
|
+
and the seven instructions of part 2's `setup` up to and including the
|
|
391
|
+
border store (22). The join is that short because part 2 had been in
|
|
392
|
+
memory since the loader call at 7,033,917; a part whose data was not in
|
|
393
|
+
yet would wait in the driver's "load any remaining sectors" step first,
|
|
394
|
+
and how long that takes was not measured here. The 149.92 rather than
|
|
395
|
+
150 frames is the poll catching the count on the frame it changes:
|
|
396
|
+
`setup` runs partway down a frame, the handler counts at line 240, and
|
|
397
|
+
the driver reads the byte within a few cycles of the store.
|
|
398
|
+
|
|
399
|
+
### When two parts want the same memory
|
|
400
|
+
|
|
401
|
+
Run here: part 2 rebuilt at `$3000`, the page part 1 occupies, with no
|
|
402
|
+
`I` tag. pefchain still exits 0 and writes the disk, but prints:
|
|
403
|
+
|
|
404
|
+
```text
|
|
405
|
+
Warning: Inserting blank filler because 'part1' and 'clash2' share pages 30.
|
|
406
|
+
Suggestion: Move things around or insert a part that only touches pages 04-2f,31-ff and zero-page locations 02-f3,f9-ff.
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
The chart then shows the blank part between them and a second blank
|
|
410
|
+
part's driver at `$0526`, and the free-block count drops by one. The
|
|
411
|
+
handbook says the filler is a black screen while the loader clears the
|
|
412
|
+
way; that disk was not booted here. This is not an error even when the
|
|
413
|
+
seam is unwanted; read the warnings. To share memory on purpose,
|
|
414
|
+
the second part declares `I first, last` and pefchain treats the
|
|
415
|
+
overlap as inherited rather than colliding (from the handbook, not
|
|
416
|
+
provoked here).
|
|
417
|
+
|
|
418
|
+
## Build integration
|
|
419
|
+
|
|
420
|
+
Three rules of make do the whole thing, with the `.efo` rule using
|
|
421
|
+
`-binfile` and `.DELETE_ON_ERROR:` so a failed assembly does not leave
|
|
422
|
+
a stale object for `mkpef` to package. Keep each part in its own
|
|
423
|
+
directory with its own script line, as the bundled example does, so a
|
|
424
|
+
part can be reordered by editing one line. During development give
|
|
425
|
+
every line the `space` condition and swap in `addr = value` once the
|
|
426
|
+
tune is in (the handbook's advice; `transition_conditions` says why).
|
|
427
|
+
`pef2prg -m` writes a VICE `-moncommands` file that stops the machine on
|
|
428
|
+
a write outside the declared ranges; run each part standalone under it
|
|
429
|
+
before linking, since a part that stays inside its declarations alone
|
|
430
|
+
can still overwrite a later part's preloaded data in the chain.
|
|
431
|
+
`pefchain` on this two-part disk returned without noticeable delay (not
|
|
432
|
+
timed here); relinking on every build is the intended way to work.
|
|
433
|
+
|
|
434
|
+
## Pitfalls
|
|
435
|
+
|
|
436
|
+
**An assembler that shortens the music-call slot breaks the interrupt.**
|
|
437
|
+
KickAssembler assembled `bit $0000` to the two-byte zero-page form
|
|
438
|
+
`24 00`. The header's slot address then pointed at a two-byte
|
|
439
|
+
instruction where pefchain expects three, and the byte after it, the
|
|
440
|
+
first of `lsr $d019`, was no longer where the linker and the code
|
|
441
|
+
agreed. Run here: the raster interrupt was never acknowledged, the
|
|
442
|
+
handler re-entered mostly every 30 to 37 cycles, the frame counter
|
|
443
|
+
reached 49 in 1,535 cycles and the driver never got to its poll, so
|
|
444
|
+
part 1 never ended. `bit.abs $0000` (`2c 00 00`) fixed it and nothing else changed.
|
|
445
|
+
Check the three bytes in the `.efo` before blaming the loader.
|
|
446
|
+
|
|
447
|
+
**The screen is not reserved.** Pages `$04` to `$07` are free memory to
|
|
448
|
+
pefchain and it used them for the blank part's code. A part that shows
|
|
449
|
+
the default screen sees the junk (both pictures above). Clear the screen
|
|
450
|
+
in `setup`, or declare `P $04 $07`, or point `$D018` somewhere the part
|
|
451
|
+
loads.
|
|
452
|
+
|
|
453
|
+
**A shared page is a warning, not an error.** The link succeeds with a
|
|
454
|
+
blank filler inserted. A seam that turns black for a frame is this
|
|
455
|
+
message being ignored.
|
|
456
|
+
|
|
457
|
+
**`bit $0000` stays if no player is installed.** The handbook says so;
|
|
458
|
+
with no `M` tag anywhere in this script the part ran to its frame count
|
|
459
|
+
with the slot in place. The loaded bytes were not disassembled here, so
|
|
460
|
+
whether the slot was rewritten to a `jsr` to a stub or left as `bit` is
|
|
461
|
+
from the handbook. Budget 4 cycles a frame for it either way.
|
|
462
|
+
|
|
463
|
+
**The `-limitcycles` picture on a D64 boot is later than on a PRG.**
|
|
464
|
+
Autostart of a disk goes through the KERNAL's `LOAD"*",8,1` and the
|
|
465
|
+
real drive; `RUN` came at 6,179,517 cycles here against about 3,000,000
|
|
466
|
+
for a PRG in this repository's pins. Sweep the cycle count with the
|
|
467
|
+
`$D020` trace before choosing a pin.
|
|
468
|
+
|
|
469
|
+
## Licence
|
|
470
|
+
|
|
471
|
+
The `src/` directory is under the MIT licence (the `COPYING` file,
|
|
472
|
+
copyright 2013 to 2022 Linus Åkesson): free to use, copy, modify and
|
|
473
|
+
redistribute, including in sold work, provided the copyright and
|
|
474
|
+
permission notice travel with copies of the software. The `template/`
|
|
475
|
+
directory and the Spindle logo example are declared public domain. The
|
|
476
|
+
other examples may be redistributed as they are. The README asks for a
|
|
477
|
+
credit such as "Loader by lft" and says the logo is optional. The
|
|
478
|
+
loader and drive code that pefchain writes into a demo's D64 are part of
|
|
479
|
+
the demo the author ships; nothing on this page copies them.
|
|
480
|
+
|
|
481
|
+
## See also
|
|
482
|
+
|
|
483
|
+
- `part_lifecycle` and `transition_conditions` in [demo-composition](../demo-design/demo-composition.md): the contract this tool enforces, described for v2.
|
|
484
|
+
- `multi_load_sequencing` in [loaders-packers](../techniques/loaders-packers.md): loading between parts with a loader the part calls itself.
|
|
485
|
+
- [kickassembler-reference](kickassembler-reference.md): `-binfile`, `-define`, and the `.abs` suffix.
|
|
486
|
+
- [vice-reference](../runtime/vice-reference.md): `-moncommands`, `trace`, and reading the exit screenshot.
|
|
487
|
+
- [c64-file-formats](../formats/c64-file-formats.md): the `.D64` layout the BAM walk above follows.
|