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,743 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: runtime-relocation
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [runtime_relocation]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D020, DD04, DD05, DD0E]
|
|
9
|
+
uses_kernal: [CHROUT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Run-Time Overlay Relocation
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
One overlay (a stand-in for a level script or a boss routine) is
|
|
19
|
+
assembled twice in the same source, at logical origins `$3000` and
|
|
20
|
+
`$3100`, with `.pseudopc`. At start-up the program diffs the two images
|
|
21
|
+
into a relocation table: every byte that is exactly one higher in the
|
|
22
|
+
second image is the high byte of an address inside the overlay. It then
|
|
23
|
+
takes two blocks from a page heap, copies the `$3000` image into each
|
|
24
|
+
(standing in for a disk load), adds the page delta to every listed byte,
|
|
25
|
+
and calls both copies through the jump table at the overlay's offset 0.
|
|
26
|
+
Each copy fills its own buffer from its own table, sums the buffer
|
|
27
|
+
through an address word stored in the overlay, and returns the high byte
|
|
28
|
+
of its buffer from an immediate `#>buf`. Each of those paths fails if its
|
|
29
|
+
byte was not relocated. The program prints the overlay size, the number
|
|
30
|
+
of bytes relocated, the two load addresses, the cycles for the diff and
|
|
31
|
+
for one relocation, the cycles per relocated byte, and the verdict:
|
|
32
|
+
`$02FF` = `$01` and a green border on a pass, `$02FF` = `$02` and a red
|
|
33
|
+
border on a fail. In a shipped game the diff runs on the host (the
|
|
34
|
+
Python script under Build) and only the `$3000` image and the table go
|
|
35
|
+
on disk; the recipe does it on the C64 so that one listing builds and
|
|
36
|
+
checks the whole method.
|
|
37
|
+
|
|
38
|
+
## Source
|
|
39
|
+
|
|
40
|
+
```asm
|
|
41
|
+
// runtime-relocation.asm
|
|
42
|
+
// A code overlay is assembled twice inside this one source, at logical
|
|
43
|
+
// origins $3000 and $3100 (.pseudopc). At start-up the program diffs the
|
|
44
|
+
// two images: a byte that is one higher in the second image is the high
|
|
45
|
+
// byte of an address inside the overlay, and its offset goes into the
|
|
46
|
+
// relocation table. It then takes two blocks from a page heap, copies the
|
|
47
|
+
// $3000 image into each (standing in for a disk load), adds the page delta
|
|
48
|
+
// to every listed byte, and calls each copy through its jump table.
|
|
49
|
+
// Prints the table size, the two load pages, the relocation cost and the
|
|
50
|
+
// verdict: $02FF = $01 and a green border when both copies return the
|
|
51
|
+
// right checksums and buffer pages, $02FF = $02 and a red border otherwise.
|
|
52
|
+
|
|
53
|
+
BasicUpstart2(start)
|
|
54
|
+
|
|
55
|
+
.const CHROUT = $ffd2
|
|
56
|
+
.const RESULT = $02ff // verdict byte read by the harness
|
|
57
|
+
.const BORDER = $d020
|
|
58
|
+
.const CODE_PASS = $01
|
|
59
|
+
.const CODE_FAIL = $02
|
|
60
|
+
|
|
61
|
+
.const ORG_A = $3000 // origin of the image that is shipped
|
|
62
|
+
.const ORG_B = $3100 // second origin, one page up: diff only
|
|
63
|
+
.const HEAP_LO = $40 // heap pages $40..$7F
|
|
64
|
+
.const HEAP_HI = $80
|
|
65
|
+
.const BUFLEN = 128
|
|
66
|
+
.const KEY1 = $00
|
|
67
|
+
.const KEY2 = $5a
|
|
68
|
+
.const FORCE_FAULT = 0 // 1: skip the last table entry (red case)
|
|
69
|
+
|
|
70
|
+
// zero page. The program never returns to BASIC, so $22-$2B is free.
|
|
71
|
+
.const pa = $22 // image A pointer (diff, copy source)
|
|
72
|
+
.const pb = $24 // image B pointer (diff)
|
|
73
|
+
.const pd = $26 // copy destination
|
|
74
|
+
.const rp = $28 // relocation byte pointer
|
|
75
|
+
.const vec = $2a // entry-point vector for JMP (vec)
|
|
76
|
+
.const dpage = $2c // page the overlay is being relocated to
|
|
77
|
+
.const delta = $2d // dpage - >ORG_A
|
|
78
|
+
.const optr = $fb // pointer the overlay itself uses
|
|
79
|
+
.const sptr = $fd // puts pointer
|
|
80
|
+
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// The overlay. Offsets 0, 3 and 6 are its jump table; nothing outside it
|
|
83
|
+
// knows any other address inside it.
|
|
84
|
+
// entry 0 FILL : A = key. buf[i] = tab[i] EOR key.
|
|
85
|
+
// entry 1 SUM : A/X = 16-bit sum of buf, read through the address word
|
|
86
|
+
// bufptr (a data table holding an internal address).
|
|
87
|
+
// entry 2 WHERE : A = high byte of buf, from an immediate #>buf.
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
.macro Overlay() {
|
|
90
|
+
jmp fill
|
|
91
|
+
jmp sum
|
|
92
|
+
jmp where
|
|
93
|
+
fill:
|
|
94
|
+
sta key // absolute store into the overlay
|
|
95
|
+
ldx #BUFLEN - 1
|
|
96
|
+
!: lda tab,x // absolute,X read of its own table
|
|
97
|
+
eor key
|
|
98
|
+
sta buf,x
|
|
99
|
+
dex
|
|
100
|
+
bpl !-
|
|
101
|
+
rts
|
|
102
|
+
sum:
|
|
103
|
+
lda bufptr // pointer taken from an address table
|
|
104
|
+
sta optr
|
|
105
|
+
lda bufptr + 1
|
|
106
|
+
sta optr + 1
|
|
107
|
+
lda #0
|
|
108
|
+
sta acc
|
|
109
|
+
sta acc + 1
|
|
110
|
+
tay
|
|
111
|
+
!: lda (optr),y
|
|
112
|
+
jsr add // absolute JSR inside the overlay
|
|
113
|
+
iny
|
|
114
|
+
cpy #BUFLEN
|
|
115
|
+
bne !-
|
|
116
|
+
lda acc
|
|
117
|
+
ldx acc + 1
|
|
118
|
+
rts
|
|
119
|
+
add:
|
|
120
|
+
clc
|
|
121
|
+
adc acc
|
|
122
|
+
sta acc
|
|
123
|
+
bcc !+
|
|
124
|
+
inc acc + 1
|
|
125
|
+
!: rts
|
|
126
|
+
where:
|
|
127
|
+
lda #>buf // immediate high byte of an internal label
|
|
128
|
+
rts
|
|
129
|
+
key: .byte 0
|
|
130
|
+
acc: .word 0
|
|
131
|
+
bufptr: .word buf
|
|
132
|
+
tab: .fill BUFLEN, (i * 37 + 11) & $ff
|
|
133
|
+
buf: .fill BUFLEN, 0
|
|
134
|
+
end:
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// expected SUM results, worked out by the assembler
|
|
138
|
+
.function sumFor(s) {
|
|
139
|
+
.var t = 0
|
|
140
|
+
.for (var i = 0; i < BUFLEN; i++) {
|
|
141
|
+
.eval t = t + (((i * 37 + 11) & $ff) ^ s)
|
|
142
|
+
}
|
|
143
|
+
.return t & $ffff
|
|
144
|
+
}
|
|
145
|
+
.const EXP1 = sumFor(KEY1)
|
|
146
|
+
.const EXP2 = sumFor(KEY2)
|
|
147
|
+
|
|
148
|
+
// Time(routine, slot): CIA2 timer A counts phi2 from $FFFF; 16-bit count.
|
|
149
|
+
.macro Time(routine, slot) {
|
|
150
|
+
lda #$11 // CRA: start, force load, count phi2
|
|
151
|
+
sta $dd0e
|
|
152
|
+
jsr routine
|
|
153
|
+
lda #$00
|
|
154
|
+
sta $dd0e // stop
|
|
155
|
+
sec
|
|
156
|
+
lda #$ff
|
|
157
|
+
sbc $dd04
|
|
158
|
+
sta slot
|
|
159
|
+
lda #$ff
|
|
160
|
+
sbc $dd05
|
|
161
|
+
sta slot + 1
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
.macro Print(text) {
|
|
165
|
+
ldx #<text
|
|
166
|
+
ldy #>text
|
|
167
|
+
jsr puts
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
start:
|
|
171
|
+
sei
|
|
172
|
+
lda #$00
|
|
173
|
+
sta $dd0e
|
|
174
|
+
lda #$ff // timer A latch = $FFFF
|
|
175
|
+
sta $dd04
|
|
176
|
+
sta $dd05
|
|
177
|
+
lda $d011 // screen off: no badlines in timed code
|
|
178
|
+
and #$ef
|
|
179
|
+
sta $d011
|
|
180
|
+
!: lda $d011
|
|
181
|
+
bpl !-
|
|
182
|
+
!: lda $d011
|
|
183
|
+
bmi !-
|
|
184
|
+
|
|
185
|
+
lda #0
|
|
186
|
+
sta fails
|
|
187
|
+
Time(nothing, t_empty)
|
|
188
|
+
Time(mktable, t_diff)
|
|
189
|
+
|
|
190
|
+
// heap: two overlay-sized blocks
|
|
191
|
+
lda #HEAP_LO
|
|
192
|
+
sta hnext
|
|
193
|
+
jsr alloc
|
|
194
|
+
sta slot1
|
|
195
|
+
jsr alloc
|
|
196
|
+
sta slot2
|
|
197
|
+
|
|
198
|
+
lda slot1
|
|
199
|
+
jsr load
|
|
200
|
+
lda slot1
|
|
201
|
+
sta dpage
|
|
202
|
+
Time(relocate, t_rel)
|
|
203
|
+
lda slot2
|
|
204
|
+
jsr load
|
|
205
|
+
lda slot2
|
|
206
|
+
sta dpage
|
|
207
|
+
jsr relocate
|
|
208
|
+
|
|
209
|
+
lda $d011 // screen back on
|
|
210
|
+
ora #$10
|
|
211
|
+
sta $d011
|
|
212
|
+
cli
|
|
213
|
+
|
|
214
|
+
// exercise both copies: fill both, then read each back
|
|
215
|
+
lda #0 // entry 0 of copy 1: FILL
|
|
216
|
+
ldx slot1
|
|
217
|
+
ldy #KEY1
|
|
218
|
+
jsr call
|
|
219
|
+
lda #0
|
|
220
|
+
ldx slot2
|
|
221
|
+
ldy #KEY2
|
|
222
|
+
jsr call
|
|
223
|
+
lda #3 // entry 1: SUM
|
|
224
|
+
ldx slot1
|
|
225
|
+
jsr call
|
|
226
|
+
cmp #<EXP1
|
|
227
|
+
bne bad1
|
|
228
|
+
cpx #>EXP1
|
|
229
|
+
beq !+
|
|
230
|
+
bad1: inc fails
|
|
231
|
+
!: lda #3
|
|
232
|
+
ldx slot2
|
|
233
|
+
jsr call
|
|
234
|
+
cmp #<EXP2
|
|
235
|
+
bne bad2
|
|
236
|
+
cpx #>EXP2
|
|
237
|
+
beq !+
|
|
238
|
+
bad2: inc fails
|
|
239
|
+
!: lda #6 // entry 2: WHERE
|
|
240
|
+
ldx slot1
|
|
241
|
+
jsr call
|
|
242
|
+
sec
|
|
243
|
+
sbc slot1
|
|
244
|
+
cmp #>(BUF_OFF)
|
|
245
|
+
beq !+
|
|
246
|
+
inc fails
|
|
247
|
+
!: lda #6
|
|
248
|
+
ldx slot2
|
|
249
|
+
jsr call
|
|
250
|
+
sec
|
|
251
|
+
sbc slot2
|
|
252
|
+
cmp #>(BUF_OFF)
|
|
253
|
+
beq !+
|
|
254
|
+
inc fails
|
|
255
|
+
!: lda bad // a byte that moved by other than one
|
|
256
|
+
beq !+
|
|
257
|
+
inc fails
|
|
258
|
+
!:
|
|
259
|
+
// net relocation cycles, then cycles per relocated byte
|
|
260
|
+
sec
|
|
261
|
+
lda t_rel
|
|
262
|
+
sbc t_empty
|
|
263
|
+
sta t_rel
|
|
264
|
+
sta num
|
|
265
|
+
lda t_rel + 1
|
|
266
|
+
sbc t_empty + 1
|
|
267
|
+
sta t_rel + 1
|
|
268
|
+
sta num + 1
|
|
269
|
+
sec
|
|
270
|
+
lda t_diff
|
|
271
|
+
sbc t_empty
|
|
272
|
+
sta t_diff
|
|
273
|
+
lda t_diff + 1
|
|
274
|
+
sbc t_empty + 1
|
|
275
|
+
sta t_diff + 1
|
|
276
|
+
|
|
277
|
+
lda fails
|
|
278
|
+
bne fail
|
|
279
|
+
lda #CODE_PASS
|
|
280
|
+
ldy #5 // green
|
|
281
|
+
bne verdict
|
|
282
|
+
fail:
|
|
283
|
+
lda #CODE_FAIL
|
|
284
|
+
ldy #2 // red
|
|
285
|
+
verdict:
|
|
286
|
+
sta RESULT
|
|
287
|
+
sty BORDER
|
|
288
|
+
|
|
289
|
+
Print(txt_size)
|
|
290
|
+
lda #>OVL_SIZE
|
|
291
|
+
jsr hexbyte
|
|
292
|
+
lda #<OVL_SIZE
|
|
293
|
+
jsr hexbyte
|
|
294
|
+
lda #$0d
|
|
295
|
+
jsr CHROUT
|
|
296
|
+
Print(txt_bytes)
|
|
297
|
+
lda rcount
|
|
298
|
+
sta num
|
|
299
|
+
lda #0
|
|
300
|
+
sta num + 1
|
|
301
|
+
jsr putdec
|
|
302
|
+
Print(txt_slots)
|
|
303
|
+
lda slot1
|
|
304
|
+
jsr hexbyte
|
|
305
|
+
lda #0
|
|
306
|
+
jsr hexbyte
|
|
307
|
+
lda #' '
|
|
308
|
+
jsr CHROUT
|
|
309
|
+
lda slot2
|
|
310
|
+
jsr hexbyte
|
|
311
|
+
lda #0
|
|
312
|
+
jsr hexbyte
|
|
313
|
+
lda #$0d
|
|
314
|
+
jsr CHROUT
|
|
315
|
+
Print(txt_diff)
|
|
316
|
+
lda t_diff
|
|
317
|
+
sta num
|
|
318
|
+
lda t_diff + 1
|
|
319
|
+
sta num + 1
|
|
320
|
+
jsr putdec
|
|
321
|
+
Print(txt_rel)
|
|
322
|
+
lda t_rel
|
|
323
|
+
sta num
|
|
324
|
+
lda t_rel + 1
|
|
325
|
+
sta num + 1
|
|
326
|
+
jsr putdec
|
|
327
|
+
Print(txt_per)
|
|
328
|
+
jsr divide // quo = t_rel / rcount
|
|
329
|
+
lda quo
|
|
330
|
+
sta num
|
|
331
|
+
lda #0
|
|
332
|
+
sta num + 1
|
|
333
|
+
jsr putdec
|
|
334
|
+
Print(txt_res)
|
|
335
|
+
lda RESULT
|
|
336
|
+
jsr hexbyte
|
|
337
|
+
lda RESULT
|
|
338
|
+
cmp #CODE_PASS
|
|
339
|
+
beq !+
|
|
340
|
+
Print(txt_fail)
|
|
341
|
+
jmp *
|
|
342
|
+
!: Print(txt_pass)
|
|
343
|
+
jmp *
|
|
344
|
+
|
|
345
|
+
nothing:
|
|
346
|
+
rts
|
|
347
|
+
|
|
348
|
+
// ---------------------------------------------------------------------------
|
|
349
|
+
// mktable: walk both images; where B = A + 1, record the offset. A byte that
|
|
350
|
+
// differs by anything else is counted in bad (it cannot be page-relocated).
|
|
351
|
+
// ---------------------------------------------------------------------------
|
|
352
|
+
mktable:
|
|
353
|
+
lda #0
|
|
354
|
+
sta rcount
|
|
355
|
+
sta bad
|
|
356
|
+
sta off
|
|
357
|
+
sta off + 1
|
|
358
|
+
lda #<imgA
|
|
359
|
+
sta pa
|
|
360
|
+
lda #>imgA
|
|
361
|
+
sta pa + 1
|
|
362
|
+
lda #<imgB
|
|
363
|
+
sta pb
|
|
364
|
+
lda #>imgB
|
|
365
|
+
sta pb + 1
|
|
366
|
+
ldy #0
|
|
367
|
+
mt_loop:
|
|
368
|
+
lda off
|
|
369
|
+
cmp #<OVL_SIZE
|
|
370
|
+
lda off + 1
|
|
371
|
+
sbc #>OVL_SIZE
|
|
372
|
+
bcs mt_done
|
|
373
|
+
lda (pb),y
|
|
374
|
+
sec
|
|
375
|
+
sbc (pa),y
|
|
376
|
+
beq mt_next
|
|
377
|
+
cmp #1
|
|
378
|
+
bne mt_bad
|
|
379
|
+
ldx rcount
|
|
380
|
+
lda off
|
|
381
|
+
sta off_lo,x
|
|
382
|
+
lda off + 1
|
|
383
|
+
sta off_hi,x
|
|
384
|
+
inc rcount
|
|
385
|
+
jmp mt_next
|
|
386
|
+
mt_bad:
|
|
387
|
+
inc bad
|
|
388
|
+
mt_next:
|
|
389
|
+
inc pa
|
|
390
|
+
bne !+
|
|
391
|
+
inc pa + 1
|
|
392
|
+
!: inc pb
|
|
393
|
+
bne !+
|
|
394
|
+
inc pb + 1
|
|
395
|
+
!: inc off
|
|
396
|
+
bne mt_loop
|
|
397
|
+
inc off + 1
|
|
398
|
+
jmp mt_loop
|
|
399
|
+
mt_done:
|
|
400
|
+
.if (FORCE_FAULT != 0) {
|
|
401
|
+
dec rcount
|
|
402
|
+
}
|
|
403
|
+
rts
|
|
404
|
+
|
|
405
|
+
// ---------------------------------------------------------------------------
|
|
406
|
+
// alloc: bump allocator by whole pages. Returns the first page in A.
|
|
407
|
+
// No bounds failure path here: two blocks fit by construction.
|
|
408
|
+
// ---------------------------------------------------------------------------
|
|
409
|
+
alloc:
|
|
410
|
+
lda hnext
|
|
411
|
+
pha
|
|
412
|
+
clc
|
|
413
|
+
adc #OVL_PAGES
|
|
414
|
+
sta hnext
|
|
415
|
+
pla
|
|
416
|
+
rts
|
|
417
|
+
|
|
418
|
+
// load: copy OVL_SIZE bytes of image A to page A (stands in for a LOAD)
|
|
419
|
+
load:
|
|
420
|
+
sta pd + 1
|
|
421
|
+
lda #0
|
|
422
|
+
sta pd
|
|
423
|
+
lda #<imgA
|
|
424
|
+
sta pa
|
|
425
|
+
lda #>imgA
|
|
426
|
+
sta pa + 1
|
|
427
|
+
ldx #>OVL_SIZE // whole pages first
|
|
428
|
+
ldy #0
|
|
429
|
+
!: cpx #0
|
|
430
|
+
beq ld_tail
|
|
431
|
+
!: lda (pa),y
|
|
432
|
+
sta (pd),y
|
|
433
|
+
iny
|
|
434
|
+
bne !-
|
|
435
|
+
inc pa + 1
|
|
436
|
+
inc pd + 1
|
|
437
|
+
dex
|
|
438
|
+
jmp !--
|
|
439
|
+
ld_tail:
|
|
440
|
+
!: cpy #<OVL_SIZE
|
|
441
|
+
beq ld_done
|
|
442
|
+
lda (pa),y
|
|
443
|
+
sta (pd),y
|
|
444
|
+
iny
|
|
445
|
+
jmp !-
|
|
446
|
+
ld_done:
|
|
447
|
+
rts
|
|
448
|
+
|
|
449
|
+
// ---------------------------------------------------------------------------
|
|
450
|
+
// relocate: for each table entry, (dpage:off) += dpage - >ORG_A.
|
|
451
|
+
// The destination is page-aligned, so an offset's low byte is the pointer's
|
|
452
|
+
// low byte and only the high byte needs an add.
|
|
453
|
+
// ---------------------------------------------------------------------------
|
|
454
|
+
relocate:
|
|
455
|
+
sec
|
|
456
|
+
lda dpage
|
|
457
|
+
sbc #>ORG_A
|
|
458
|
+
sta delta
|
|
459
|
+
ldx #0
|
|
460
|
+
ldy #0
|
|
461
|
+
cpx rcount
|
|
462
|
+
beq rl_done
|
|
463
|
+
rl_loop:
|
|
464
|
+
lda off_lo,x // 4
|
|
465
|
+
sta rp // 3
|
|
466
|
+
lda off_hi,x // 4
|
|
467
|
+
clc // 2
|
|
468
|
+
adc dpage // 3 (dpage is in zero page)
|
|
469
|
+
sta rp + 1 // 3
|
|
470
|
+
lda (rp),y // 5
|
|
471
|
+
clc // 2
|
|
472
|
+
adc delta // 3
|
|
473
|
+
sta (rp),y // 6
|
|
474
|
+
inx // 2
|
|
475
|
+
cpx rcount // 4 (rcount is absolute)
|
|
476
|
+
bne rl_loop // 3 taken
|
|
477
|
+
rl_done:
|
|
478
|
+
rts
|
|
479
|
+
|
|
480
|
+
// call: entry offset in A, overlay page in X, argument in Y
|
|
481
|
+
call:
|
|
482
|
+
sta vec
|
|
483
|
+
stx vec + 1
|
|
484
|
+
tya
|
|
485
|
+
jmp (vec)
|
|
486
|
+
|
|
487
|
+
// divide: quo = t_rel / rcount (16 by 8, quotient fits in 8 bits here)
|
|
488
|
+
divide:
|
|
489
|
+
lda #0
|
|
490
|
+
sta quo
|
|
491
|
+
lda t_rel
|
|
492
|
+
sta num
|
|
493
|
+
lda t_rel + 1
|
|
494
|
+
sta num + 1
|
|
495
|
+
!: sec
|
|
496
|
+
lda num
|
|
497
|
+
sbc rcount
|
|
498
|
+
tax
|
|
499
|
+
lda num + 1
|
|
500
|
+
sbc #0
|
|
501
|
+
bcc !+
|
|
502
|
+
sta num + 1
|
|
503
|
+
stx num
|
|
504
|
+
inc quo
|
|
505
|
+
jmp !-
|
|
506
|
+
!: rts
|
|
507
|
+
|
|
508
|
+
// ---------------------------------------------------------------------------
|
|
509
|
+
// output helpers
|
|
510
|
+
// ---------------------------------------------------------------------------
|
|
511
|
+
puts:
|
|
512
|
+
stx sptr
|
|
513
|
+
sty sptr + 1
|
|
514
|
+
ldy #0
|
|
515
|
+
!: lda (sptr),y
|
|
516
|
+
beq !+
|
|
517
|
+
jsr CHROUT
|
|
518
|
+
iny
|
|
519
|
+
bne !-
|
|
520
|
+
!: rts
|
|
521
|
+
|
|
522
|
+
putdec: // print the 16-bit value in num, decimal
|
|
523
|
+
ldx #0
|
|
524
|
+
stx lead
|
|
525
|
+
pd_digit:
|
|
526
|
+
lda #'0' - 1
|
|
527
|
+
sta dig
|
|
528
|
+
!: inc dig
|
|
529
|
+
sec
|
|
530
|
+
lda num
|
|
531
|
+
sbc pow10,x
|
|
532
|
+
sta num
|
|
533
|
+
lda num + 1
|
|
534
|
+
sbc pow10 + 1,x
|
|
535
|
+
sta num + 1
|
|
536
|
+
bcs !-
|
|
537
|
+
lda num
|
|
538
|
+
adc pow10,x
|
|
539
|
+
sta num
|
|
540
|
+
lda num + 1
|
|
541
|
+
adc pow10 + 1,x
|
|
542
|
+
sta num + 1
|
|
543
|
+
lda dig
|
|
544
|
+
cmp #'0'
|
|
545
|
+
bne pd_show
|
|
546
|
+
cpx #4 * 2
|
|
547
|
+
beq pd_show
|
|
548
|
+
lda lead
|
|
549
|
+
beq pd_next
|
|
550
|
+
lda #'0'
|
|
551
|
+
pd_show:
|
|
552
|
+
jsr CHROUT
|
|
553
|
+
inc lead
|
|
554
|
+
pd_next:
|
|
555
|
+
inx
|
|
556
|
+
inx
|
|
557
|
+
cpx #5 * 2
|
|
558
|
+
bne pd_digit
|
|
559
|
+
lda #$0d
|
|
560
|
+
jmp CHROUT
|
|
561
|
+
|
|
562
|
+
hexbyte:
|
|
563
|
+
pha
|
|
564
|
+
lsr
|
|
565
|
+
lsr
|
|
566
|
+
lsr
|
|
567
|
+
lsr
|
|
568
|
+
jsr hexdigit
|
|
569
|
+
pla
|
|
570
|
+
and #$0f
|
|
571
|
+
hexdigit:
|
|
572
|
+
cmp #10
|
|
573
|
+
bcc !+
|
|
574
|
+
adc #6
|
|
575
|
+
!: adc #'0'
|
|
576
|
+
jmp CHROUT
|
|
577
|
+
|
|
578
|
+
pow10: .word 10000, 1000, 100, 10, 1
|
|
579
|
+
|
|
580
|
+
.encoding "petscii_upper"
|
|
581
|
+
txt_size: .text "OVERLAY SIZE $"
|
|
582
|
+
.byte 0
|
|
583
|
+
txt_bytes: .text "RELOC BYTES "
|
|
584
|
+
.byte 0
|
|
585
|
+
txt_slots: .text "LOADED AT $"
|
|
586
|
+
.byte 0
|
|
587
|
+
txt_diff: .text "DIFF CYCLES "
|
|
588
|
+
.byte 0
|
|
589
|
+
txt_rel: .text "RELOC CYCLES "
|
|
590
|
+
.byte 0
|
|
591
|
+
txt_per: .text "PER BYTE "
|
|
592
|
+
.byte 0
|
|
593
|
+
txt_res: .text "RESULT "
|
|
594
|
+
.byte 0
|
|
595
|
+
txt_pass: .text " PASS"
|
|
596
|
+
.byte $0d, 0
|
|
597
|
+
txt_fail: .text " FAIL"
|
|
598
|
+
.byte $0d, 0
|
|
599
|
+
|
|
600
|
+
hnext: .byte 0
|
|
601
|
+
slot1: .byte 0
|
|
602
|
+
slot2: .byte 0
|
|
603
|
+
rcount: .byte 0
|
|
604
|
+
bad: .byte 0
|
|
605
|
+
fails: .byte 0
|
|
606
|
+
quo: .byte 0
|
|
607
|
+
off: .word 0
|
|
608
|
+
num: .word 0
|
|
609
|
+
dig: .byte 0
|
|
610
|
+
lead: .byte 0
|
|
611
|
+
t_empty: .word 0
|
|
612
|
+
t_diff: .word 0
|
|
613
|
+
t_rel: .word 0
|
|
614
|
+
off_lo: .fill 256, 0 // the relocation table, built by mktable
|
|
615
|
+
off_hi: .fill 256, 0
|
|
616
|
+
|
|
617
|
+
// the two images of the same overlay
|
|
618
|
+
imgA:
|
|
619
|
+
ovA: .pseudopc ORG_A { Overlay() }
|
|
620
|
+
imgB:
|
|
621
|
+
ovB: .pseudopc ORG_B { Overlay() }
|
|
622
|
+
imgEnd:
|
|
623
|
+
|
|
624
|
+
.label OVL_SIZE = imgB - imgA
|
|
625
|
+
.label OVL_PAGES = (OVL_SIZE + 255) >> 8
|
|
626
|
+
.label BUF_OFF = OVL_SIZE - BUFLEN // buf is the last thing in the overlay
|
|
627
|
+
.assert "images are the same size", imgEnd - imgB, OVL_SIZE
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
## Build
|
|
631
|
+
|
|
632
|
+
```bash
|
|
633
|
+
java -jar KickAss.jar runtime-relocation.asm -o runtime-relocation.prg -showmem -symbolfile
|
|
634
|
+
```
|
|
635
|
+
|
|
636
|
+
Produces `runtime-relocation.prg`, 2,260 bytes, `$080e` to `$10d2`
|
|
637
|
+
(KickAssembler 5.25, `-showmem`). The two overlay images are the last
|
|
638
|
+
680 bytes: `imgA` at `$0e2b` and `imgB` at `$0f7f`, 340 bytes each
|
|
639
|
+
(`runtime-relocation.sym`). The relocation table (`off_lo`, `off_hi`)
|
|
640
|
+
is built in RAM at start-up.
|
|
641
|
+
|
|
642
|
+
For a shipped overlay, build the two images as separate binaries and
|
|
643
|
+
make the table on the host. This script does the same diff as `mktable`
|
|
644
|
+
and refuses a byte that moved by anything other than one. It was run
|
|
645
|
+
here on the two images cut out of the recipe's PRG with the symbol file
|
|
646
|
+
and reported `19 bytes to relocate in a 340-byte overlay`, the same
|
|
647
|
+
offsets the C64 found.
|
|
648
|
+
|
|
649
|
+
```python
|
|
650
|
+
# reloctable.py: diff two builds of one overlay, one page apart, into a
|
|
651
|
+
# relocation table. usage: python3 reloctable.py ovl_a.bin ovl_b.bin table.bin
|
|
652
|
+
import sys
|
|
653
|
+
a = open(sys.argv[1], 'rb').read()
|
|
654
|
+
b = open(sys.argv[2], 'rb').read()
|
|
655
|
+
if len(a) != len(b):
|
|
656
|
+
sys.exit('images differ in length: %d vs %d' % (len(a), len(b)))
|
|
657
|
+
offsets = []
|
|
658
|
+
for i, (x, y) in enumerate(zip(a, b)):
|
|
659
|
+
d = (y - x) & 0xff
|
|
660
|
+
if d == 1:
|
|
661
|
+
offsets.append(i)
|
|
662
|
+
elif d != 0:
|
|
663
|
+
sys.exit('offset $%04x moved by %d: not a page-relocatable byte' % (i, d))
|
|
664
|
+
if len(offsets) > 255:
|
|
665
|
+
sys.exit('%d entries: the 8-bit count in the loader overflows' % len(offsets))
|
|
666
|
+
# table layout: count, then the low bytes, then the high bytes
|
|
667
|
+
out = bytes([len(offsets)]) + bytes(o & 0xff for o in offsets) + bytes(o >> 8 for o in offsets)
|
|
668
|
+
open(sys.argv[3], 'wb').write(out)
|
|
669
|
+
print('%d bytes to relocate in a %d-byte overlay' % (len(offsets), len(a)))
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
## Expected output
|
|
673
|
+
|
|
674
|
+
Border green. Screen rows 7 to 13:
|
|
675
|
+
|
|
676
|
+
```text
|
|
677
|
+
OVERLAY SIZE $0154
|
|
678
|
+
RELOC BYTES 19
|
|
679
|
+
LOADED AT $4000 4200
|
|
680
|
+
DIFF CYCLES 19077
|
|
681
|
+
RELOC CYCLES 855
|
|
682
|
+
PER BYTE 45
|
|
683
|
+
RESULT 01 PASS
|
|
684
|
+
```
|
|
685
|
+
|
|
686
|
+
Screenshots from the pinned run, 8,000,000 cycles:
|
|
687
|
+
`screenshots/runtime-relocation.png` (PAL) and
|
|
688
|
+
`screenshots/runtime-relocation-ntsc.png` (NTSC). Measured on both: the
|
|
689
|
+
seven lines above on rows 7 to 13, decoded from the screenshots against
|
|
690
|
+
the character ROM; border pixel (2, 100) = (98, 213, 50) on PAL and
|
|
691
|
+
(114, 189, 103) on NTSC, index 5 in both palettes of
|
|
692
|
+
`runtime/vice-reference.md`. The pinned command was run twice per model
|
|
693
|
+
and the two PNGs were identical bytes. The counts match on both models
|
|
694
|
+
because the timed code runs with the screen blanked and interrupts off,
|
|
695
|
+
so no cycles are stolen.
|
|
696
|
+
|
|
697
|
+
| Line | What was timed | Cycles | Per byte |
|
|
698
|
+
|---|---|---|---|
|
|
699
|
+
| `DIFF` | `mktable`: walk 340 bytes of both images, record 19 offsets | 19,077 | 56.1 per image byte; host-side work in a real game |
|
|
700
|
+
| `RELOC` | `relocate` for one copy: 19 entries | 855 | 45.0 per relocated byte, fixed cost included |
|
|
701
|
+
|
|
702
|
+
`RELOC` is exactly the arithmetic from the listing: 20 cycles before the
|
|
703
|
+
loop, 44 per entry (the cycle comments on `rl_loop`), less 1 for the
|
|
704
|
+
last untaken branch: 20 + 19 × 44 − 1 = 855. The harness cost (an empty
|
|
705
|
+
`JSR`/`RTS`, timed first) is subtracted from both counts. Keeping
|
|
706
|
+
`rcount` in zero page would make an entry 43 cycles.
|
|
707
|
+
|
|
708
|
+
The 19 bytes are: the three `JMP` operands of the jump table; fourteen
|
|
709
|
+
absolute operands in the code (`STA key`, `LDA tab,X`, `EOR key`,
|
|
710
|
+
`STA buf,X`, the two `LDA bufptr`, `JSR add` and seven accesses to
|
|
711
|
+
`acc`); the immediate `#>buf`; and the high byte of the `.word buf`
|
|
712
|
+
address table.
|
|
713
|
+
|
|
714
|
+
The red case, `.const FORCE_FAULT = 1`, was run once on PAL and not
|
|
715
|
+
pinned. It drops the last table entry, the high byte of `bufptr`, so
|
|
716
|
+
both copies' `SUM` read their buffer at `$30d4`, where nothing was
|
|
717
|
+
loaded. The screen showed `RELOC BYTES 18`, `RELOC CYCLES 811` and `RESULT 02 FAIL` on
|
|
718
|
+
row 13, border (175, 60, 88), index 2.
|
|
719
|
+
|
|
720
|
+
## Why this works
|
|
721
|
+
|
|
722
|
+
Assembling at `$3000` and `$3100` changes exactly the bytes that encode
|
|
723
|
+
the high half of an address inside the overlay, and changes each by one.
|
|
724
|
+
Low bytes do not change, because the two origins are a whole page apart.
|
|
725
|
+
Zero-page operands (`optr`), addresses outside the overlay and
|
|
726
|
+
constants do not change, so the diff leaves them
|
|
727
|
+
alone without being told. The diff also catches what an instruction
|
|
728
|
+
walker misses: the immediate `#>buf` and the high byte inside the data
|
|
729
|
+
word `bufptr`.
|
|
730
|
+
|
|
731
|
+
Relocation is then one add per listed byte: `delta` = destination page
|
|
732
|
+
− `$30`, added to the byte at destination page + offset. The heap hands
|
|
733
|
+
out whole pages (`alloc` is a bump pointer), so every overlay byte keeps
|
|
734
|
+
its offset within its page: page-aligned tables stay aligned and no
|
|
735
|
+
branch or indexed read gains or loses a page-crossing cycle. The host
|
|
736
|
+
knows only the overlay's page and the jump-table offsets 0, 3 and 6;
|
|
737
|
+
`call` builds the target in the zero-page word `vec` and jumps through
|
|
738
|
+
it, so the vector is never at `$xxFF`.
|
|
739
|
+
|
|
740
|
+
`mktable` counts a byte that moved by anything other than one in `bad`,
|
|
741
|
+
and a non-zero `bad` fails the run. That is where an expression such as
|
|
742
|
+
`buf / 64` would show up: it moves by some other amount,
|
|
743
|
+
and page relocation cannot fix it.
|