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,80 @@
|
|
|
1
|
+
// config.asm: every constant the demo's layout and timeline hang on.
|
|
2
|
+
// tools/gen_expect.py reads the plain `.const NAME = number` lines of this
|
|
3
|
+
// file, recomputes the picture from them in Python and writes expect.json.
|
|
4
|
+
// Change a number here, then run `python3 tools/gen_expect.py`.
|
|
5
|
+
|
|
6
|
+
.const SCREEN = $0400
|
|
7
|
+
.const COLOUR = $d800
|
|
8
|
+
.const RESULT = $02ff // $01 pass, $02 fail, $00 not reached
|
|
9
|
+
.const SPRITE_BLOCK = 13 // $0340, the tape buffer
|
|
10
|
+
|
|
11
|
+
// ---- timeline -------------------------------------------------------------
|
|
12
|
+
.const TITLE_FRAMES = 60 // the title card's play frames
|
|
13
|
+
.const WIPE_COLS = 2 // columns the wipe clears each frame
|
|
14
|
+
.const FREEZE_UPDATES = 156 // AUTOPILOT: the main part's updates before
|
|
15
|
+
// it freezes; 156 = 8 x 19 + 4 leaves XSCROLL 3,
|
|
16
|
+
// so a missing $D016 write shows in the picture
|
|
17
|
+
.const HOLD = 232 // frames the meter records (all before the freeze)
|
|
18
|
+
|
|
19
|
+
// ---- raster layout: the same line numbers on PAL and NTSC ------------------
|
|
20
|
+
.const FRAME_LINE = 236 // the frame slot, last row of every chain
|
|
21
|
+
.const SCROLL_LINE = 224 // XSCROLL on for row 22 (lines 227-234)
|
|
22
|
+
.const BARS_SLOT_LINE = 148 // the stable entry: irq2 fires STABLE_LINES later
|
|
23
|
+
.const STABLE_LINES = 4
|
|
24
|
+
.const LATE_LINES = 3 // a slot entered this many lines after its line is late
|
|
25
|
+
.const BARS_TOP = 155 // first bar line (measured lead, see main part)
|
|
26
|
+
.const BARS_LINES = 56 // bar lines 155-210; rows 13-19 must stay blank
|
|
27
|
+
.const BAR_H = 12
|
|
28
|
+
.const SCROLL_ROW = 22
|
|
29
|
+
|
|
30
|
+
// ---- sprite chain (lines 101-145: clear of the bars' lines) ---------------
|
|
31
|
+
.const CHAIN_X0 = 48 // sprite n's centre X: CHAIN_X0 + n * CHAIN_DX
|
|
32
|
+
.const CHAIN_DX = 36
|
|
33
|
+
.const CHAIN_AX = 16 // X swing, +-
|
|
34
|
+
.const CHAIN_Y0 = 112 // Y register centre
|
|
35
|
+
.const CHAIN_AY = 12 // Y swing, +-: Y 100-124, lines 101-145
|
|
36
|
+
.const CHAIN_PX = 16 // sine steps between sprites, X
|
|
37
|
+
.const CHAIN_PY = 24 // and Y
|
|
38
|
+
.const CHAIN_SX = 2 // sine steps a frame, X
|
|
39
|
+
.const CHAIN_SY = 3 // and Y
|
|
40
|
+
.const CHAIN_COL_A = 13 // even sprites: light green
|
|
41
|
+
.const CHAIN_COL_B = 3 // odd sprites: cyan
|
|
42
|
+
// Each bar chunk is a fixed 63 or 65 cycles: sprite DMA on any line from the
|
|
43
|
+
// stable slot to the last bar delays that chunk and every later one until a
|
|
44
|
+
// badline resyncs them, and tears the bars. Keep the chain clear of 148-211.
|
|
45
|
+
.errorif (CHAIN_Y0 + CHAIN_AY + 21 >= BARS_SLOT_LINE && CHAIN_Y0 - CHAIN_AY + 1 <= BARS_TOP + BARS_LINES), "the sprite chain reaches the stable slot or the bar lines"
|
|
46
|
+
|
|
47
|
+
// ---- bars -------------------------------------------------------------------
|
|
48
|
+
.const BARS_CENTRE = 22 // top of a bar at rest: (56 - 12) / 2
|
|
49
|
+
.const BARS_AMP = 22 // +- lines
|
|
50
|
+
.const BAR_STEP = 40 // sine steps between bars
|
|
51
|
+
.const BAR_SPEED = 2 // sine steps a frame
|
|
52
|
+
// The four bars' colours, top line to bottom (tables.asm emits them).
|
|
53
|
+
.var bar_ramps = List().add(
|
|
54
|
+
List().add(9, 2, 8, 10, 15, 1, 1, 15, 10, 8, 2, 9), // red
|
|
55
|
+
List().add(6, 6, 14, 14, 3, 1, 1, 3, 14, 14, 6, 6), // blue
|
|
56
|
+
List().add(11, 5, 5, 13, 13, 1, 1, 13, 13, 5, 5, 11), // green
|
|
57
|
+
List().add(11, 12, 12, 15, 15, 1, 1, 15, 15, 12, 12, 11)) // grey
|
|
58
|
+
|
|
59
|
+
// ---- the stable entry: cycles of padding before irq2's two $D012 reads ----
|
|
60
|
+
// Measured in VICE x64sc 3.10 with the PROBE build (README, "The stable
|
|
61
|
+
// entry and the bars"): with these the bar kernel's stores land in one
|
|
62
|
+
// column on every line of six shots a model; one more or one less splits
|
|
63
|
+
// them into two columns 8 pixels apart.
|
|
64
|
+
.const SYNC_PAD_PAL = 2
|
|
65
|
+
.const SYNC_PAD_NTSC = 6
|
|
66
|
+
// The column, in the PROBE build's shots, where every bar line's $D021
|
|
67
|
+
// store must land on both models: tools/probe.py fails on any other, so a
|
|
68
|
+
// wrong pad that still gives one column (NTSC 5 gives 89) fails too.
|
|
69
|
+
.const PROBE_COLUMN = 97
|
|
70
|
+
|
|
71
|
+
// ---- the running order (parts.asm holds the table) --------------------------
|
|
72
|
+
.const PART_COUNT = 2
|
|
73
|
+
.const LOOP_PART = 1 // after the last part: play this one again
|
|
74
|
+
.const MAIN_PART = 1 // the part the AUTOPILOT build freezes and grades
|
|
75
|
+
|
|
76
|
+
#if FORCE_FAULT
|
|
77
|
+
.const CHAIN_FAULT = 16 // the chain starts sixteen sine steps ahead
|
|
78
|
+
#else
|
|
79
|
+
.const CHAIN_FAULT = 0
|
|
80
|
+
#endif
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
// framework.asm: the part sequencer, the table-driven IRQ chain, the
|
|
2
|
+
// stable entry, model detection, the once-a-frame slot and the wipe.
|
|
3
|
+
// Nothing here knows what a part draws. Parts are rows of parts.asm.
|
|
4
|
+
//
|
|
5
|
+
// One frame, main part (PAL and NTSC use the same lines):
|
|
6
|
+
// 148 bars_slot stabilise, then the bar kernel (lines 155-210)
|
|
7
|
+
// 224 scroll_slot XSCROLL for row 22
|
|
8
|
+
// 236 frame_slot music, the part's update, the sequencer (every chain ends here)
|
|
9
|
+
//
|
|
10
|
+
// All IRQs enter through the KERNAL's $FF48 and $0314 and leave through
|
|
11
|
+
// $EA81 (registers back, RTI; no KERNAL housekeeping). CIA1's interrupt is
|
|
12
|
+
// off, so every IRQ is a raster match.
|
|
13
|
+
|
|
14
|
+
// ---- Delay(n): exactly n cycles of straight-line code (n = 0 or n >= 2) ----
|
|
15
|
+
// n >= 11 is a DEX loop, unless its branch would cross a page (a taken
|
|
16
|
+
// branch that crosses costs a cycle more: pitfall
|
|
17
|
+
// branch_page_cross_extra_cycle); then it is NOPs. The assert checks it.
|
|
18
|
+
.macro Delay(n) {
|
|
19
|
+
.errorif (n == 1 || n < 0), "Delay: n must be 0 or at least 2"
|
|
20
|
+
.var crosses = (>(* + 2)) != (>(* + 5))
|
|
21
|
+
.if (n >= 11 && !crosses) {
|
|
22
|
+
.var k = floor((n - 1) / 5)
|
|
23
|
+
.var r = n - (5 * k + 1)
|
|
24
|
+
.if (r == 1) {
|
|
25
|
+
.eval k = k - 1
|
|
26
|
+
.eval r = r + 5
|
|
27
|
+
}
|
|
28
|
+
ldx #k
|
|
29
|
+
!: dex
|
|
30
|
+
bne !-
|
|
31
|
+
.errorif (>(*)) != (>(!-)), "Delay: the loop branch crosses a page"
|
|
32
|
+
Pad(r)
|
|
33
|
+
} else {
|
|
34
|
+
Pad(n)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
.macro Pad(n) {
|
|
38
|
+
.if ((n & 1) == 1) {
|
|
39
|
+
bit $ea // 3 cycles, a zero-page read
|
|
40
|
+
.for (var i = 0; i < (n - 3) / 2; i++) { nop }
|
|
41
|
+
} else {
|
|
42
|
+
.for (var i = 0; i < n / 2; i++) { nop }
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// A chain row: the raster line, the handler, and whether the chain wraps
|
|
47
|
+
// after it. Rows of one chain are consecutive and in rising line order; the
|
|
48
|
+
// last row of every chain is the frame slot.
|
|
49
|
+
.const ROW = 5
|
|
50
|
+
.macro Slot(line, handler, last) {
|
|
51
|
+
.errorif (line > 311), "Slot: line past PAL's last line"
|
|
52
|
+
.byte <line, (line >> 8) << 7, <handler, >handler, last ? $80 : $00
|
|
53
|
+
}
|
|
54
|
+
// A row whose handler calls stabilise: its second IRQ fires STABLE_LINES
|
|
55
|
+
// later, and stabilise arms that line with RST8 clear.
|
|
56
|
+
.macro StableSlot(line, handler, last) {
|
|
57
|
+
.errorif (line + STABLE_LINES > 255), "StableSlot: stabilise's second IRQ must fire below line 256"
|
|
58
|
+
Slot(line, handler, last)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ---- the dispatcher, behind $0314 ------------------------------------------
|
|
62
|
+
// Acknowledge, arm the next row, call this row's handler, advance. The next
|
|
63
|
+
// row is armed before the handler runs, so a handler that overruns makes the
|
|
64
|
+
// next slot late instead of losing it (irq-chain.md measures this).
|
|
65
|
+
// It also keeps three counters the verdict grades (all saturate at 255):
|
|
66
|
+
// irq_late entries that began LATE_LINES or more lines after their row's line
|
|
67
|
+
// irq_bad chains whose last row was not entry number (rows in the chain)
|
|
68
|
+
// frame_late frame slots that ended past the next chain's first line
|
|
69
|
+
// (counted in frame_slot)
|
|
70
|
+
// The first chain after the IRQs start is not judged (pitfall
|
|
71
|
+
// raster_irq_first_line_jitter).
|
|
72
|
+
irq:
|
|
73
|
+
FrameMeterStart() // AUTOPILOT: this IRQ's work is timed
|
|
74
|
+
cld // pitfall decimal_mode_in_irq_handler
|
|
75
|
+
lda #$01
|
|
76
|
+
sta $d019
|
|
77
|
+
ldx slot
|
|
78
|
+
lda $d012 // lines since this row's line (low bytes)
|
|
79
|
+
sec
|
|
80
|
+
sbc slots+0,x
|
|
81
|
+
cmp #LATE_LINES
|
|
82
|
+
bcc !+
|
|
83
|
+
lda watching
|
|
84
|
+
beq !+
|
|
85
|
+
inc irq_late
|
|
86
|
+
bne !+
|
|
87
|
+
dec irq_late
|
|
88
|
+
!: inc irq_entries
|
|
89
|
+
ldy chain_first // the last row wraps to the current chain
|
|
90
|
+
lda slots+4,x
|
|
91
|
+
bmi !wrap+
|
|
92
|
+
txa
|
|
93
|
+
clc
|
|
94
|
+
adc #ROW
|
|
95
|
+
tay
|
|
96
|
+
jmp !arm+
|
|
97
|
+
!wrap: txa // rows in this chain x ROW
|
|
98
|
+
sec
|
|
99
|
+
sbc chain_run
|
|
100
|
+
clc
|
|
101
|
+
adc #ROW
|
|
102
|
+
sta irq_tmp
|
|
103
|
+
lda irq_entries // entries since the last wrap x ROW
|
|
104
|
+
asl
|
|
105
|
+
asl
|
|
106
|
+
adc irq_entries
|
|
107
|
+
cmp irq_tmp
|
|
108
|
+
beq !+
|
|
109
|
+
lda watching
|
|
110
|
+
beq !+
|
|
111
|
+
inc irq_bad
|
|
112
|
+
bne !+
|
|
113
|
+
dec irq_bad
|
|
114
|
+
!: lda #0
|
|
115
|
+
sta irq_entries
|
|
116
|
+
sty chain_run
|
|
117
|
+
lda #1 // judged from the second chain on
|
|
118
|
+
sta watching
|
|
119
|
+
!arm: sty next
|
|
120
|
+
lda slots+0,y // arm all nine bits of the next row's line
|
|
121
|
+
sta $d012
|
|
122
|
+
lda $d011
|
|
123
|
+
and #$7f
|
|
124
|
+
ora slots+1,y
|
|
125
|
+
sta $d011
|
|
126
|
+
lda slots+2,x
|
|
127
|
+
sta call+1
|
|
128
|
+
lda slots+3,x
|
|
129
|
+
sta call+2
|
|
130
|
+
call: jsr $ffff
|
|
131
|
+
lda next
|
|
132
|
+
sta slot
|
|
133
|
+
FrameMeterPause()
|
|
134
|
+
jmp $ea81
|
|
135
|
+
|
|
136
|
+
// ---- stabilise: a slot handler's JSR returns on a fixed cycle --------------
|
|
137
|
+
// The double IRQ of stable-raster-irq.md, as a subroutine. Arms a second
|
|
138
|
+
// raster IRQ STABLE_LINES below this row's line and slides through NOPs; the
|
|
139
|
+
// second IRQ lands in a NOP (0 or 1 cycle late), the two $D012 reads absorb
|
|
140
|
+
// that cycle, and the table's own next line is put back before the RTS.
|
|
141
|
+
// The slot's line must be below 256 - STABLE_LINES.
|
|
142
|
+
stabilise:
|
|
143
|
+
lda #<irq2
|
|
144
|
+
sta $0314
|
|
145
|
+
lda #>irq2
|
|
146
|
+
sta $0315
|
|
147
|
+
ldx slot
|
|
148
|
+
lda slots+0,x
|
|
149
|
+
clc
|
|
150
|
+
adc #STABLE_LINES
|
|
151
|
+
sta $d012
|
|
152
|
+
lda $d011 // this line is below 256: RST8 off
|
|
153
|
+
and #$7f
|
|
154
|
+
sta $d011
|
|
155
|
+
lda #$01
|
|
156
|
+
sta $d019
|
|
157
|
+
tsx // the KERNAL's $FF48 does TSX itself: keep
|
|
158
|
+
stx saved_sp // the stack pointer in memory (the recipe's trap)
|
|
159
|
+
cli
|
|
160
|
+
.fill 90, NOP // irq2 is always taken inside this slide
|
|
161
|
+
|
|
162
|
+
irq2: ldx saved_sp // drop irq2's own stack frame: back in the
|
|
163
|
+
txs // slot handler's JSR to stabilise
|
|
164
|
+
lda model
|
|
165
|
+
bne irq2_ntsc
|
|
166
|
+
.errorif (>(*)) != (>irq2_ntsc), "irq2: the model branch crosses a page"
|
|
167
|
+
Delay(SYNC_PAD_PAL)
|
|
168
|
+
jmp irq2_sync
|
|
169
|
+
irq2_ntsc:
|
|
170
|
+
Delay(SYNC_PAD_NTSC)
|
|
171
|
+
irq2_sync:
|
|
172
|
+
lda $d012 // the two reads straddle the line's end in one
|
|
173
|
+
cmp $d012 // of the two entry phases; BEQ costs 3 when
|
|
174
|
+
beq !+ // they match and 2 when not (offset 0: no
|
|
175
|
+
!: // page crossing is possible)
|
|
176
|
+
lda #<irq
|
|
177
|
+
sta $0314
|
|
178
|
+
lda #>irq
|
|
179
|
+
sta $0315
|
|
180
|
+
ldy next // the line the dispatcher armed
|
|
181
|
+
lda slots+0,y
|
|
182
|
+
sta $d012
|
|
183
|
+
lda $d011
|
|
184
|
+
ora slots+1,y
|
|
185
|
+
sta $d011
|
|
186
|
+
lda #$01
|
|
187
|
+
sta $d019
|
|
188
|
+
rts // the caller goes on at cycle 51 of line L + 5
|
|
189
|
+
|
|
190
|
+
// ---- the frame slot: the last row of every chain ---------------------------
|
|
191
|
+
frame_slot:
|
|
192
|
+
lda #$c8 // 40 columns, XSCROLL 0: the whole value,
|
|
193
|
+
sta $d016 // never a read-modify-write
|
|
194
|
+
jsr music_frame
|
|
195
|
+
inc frames
|
|
196
|
+
bne !+
|
|
197
|
+
inc frames+1
|
|
198
|
+
!: jsr sequencer
|
|
199
|
+
// Late if this ended at or past the next chain's first line (and
|
|
200
|
+
// before this slot's own line): that row fired while it ran, so a
|
|
201
|
+
// split came late or a stable entry lost its line. Lines 256 up have
|
|
202
|
+
// $D011 bit 7 set and are on time.
|
|
203
|
+
ldy next
|
|
204
|
+
lda $d011
|
|
205
|
+
bmi !+
|
|
206
|
+
lda $d012
|
|
207
|
+
cmp slots+0,y
|
|
208
|
+
bcc !+
|
|
209
|
+
cmp #FRAME_LINE
|
|
210
|
+
bcs !+
|
|
211
|
+
inc frame_late
|
|
212
|
+
bne !+
|
|
213
|
+
dec frame_late
|
|
214
|
+
!: inc frame_flag // the main loop's once-a-frame point
|
|
215
|
+
rts
|
|
216
|
+
|
|
217
|
+
// PAL: play every frame. NTSC: skip every sixth call, so a tune written for
|
|
218
|
+
// 50 Hz keeps its tempo at 60 (pitfall pal_ntsc_tempo_mismatch).
|
|
219
|
+
music_frame:
|
|
220
|
+
lda model
|
|
221
|
+
beq !play+
|
|
222
|
+
inc ntsc_div
|
|
223
|
+
lda ntsc_div
|
|
224
|
+
cmp #6
|
|
225
|
+
bne !play+
|
|
226
|
+
lda #0
|
|
227
|
+
sta ntsc_div
|
|
228
|
+
inc music_skips
|
|
229
|
+
bne !+
|
|
230
|
+
inc music_skips+1
|
|
231
|
+
!: rts
|
|
232
|
+
!play: jsr MUSIC_PLAY
|
|
233
|
+
inc music_calls
|
|
234
|
+
bne !+
|
|
235
|
+
inc music_calls+1
|
|
236
|
+
!: rts
|
|
237
|
+
|
|
238
|
+
// ---- the part sequencer ------------------------------------------------------
|
|
239
|
+
// PLAY: the part's update each frame; when its frame count runs out, OUT.
|
|
240
|
+
// OUT: update and the part's out-transition step each frame until the step
|
|
241
|
+
// returns carry set; then the idle chain (the frame slot alone) and SWITCH.
|
|
242
|
+
// SWITCH: the main loop runs the teardown and the next part's init.
|
|
243
|
+
.const PLAY = 0
|
|
244
|
+
.const OUT = 1
|
|
245
|
+
.const SWITCH = 2
|
|
246
|
+
|
|
247
|
+
sequencer:
|
|
248
|
+
lda seq_state
|
|
249
|
+
beq !play+
|
|
250
|
+
cmp #OUT
|
|
251
|
+
beq !out+
|
|
252
|
+
rts // SWITCH: the main loop owns it
|
|
253
|
+
!play: jsr call_update
|
|
254
|
+
lda frozen // AUTOPILOT's graded frame: time stands still
|
|
255
|
+
bne !done+
|
|
256
|
+
lda part_timer // 0 from the start: the part runs forever
|
|
257
|
+
ora part_timer+1
|
|
258
|
+
beq !done+
|
|
259
|
+
lda part_timer
|
|
260
|
+
bne !+
|
|
261
|
+
dec part_timer+1
|
|
262
|
+
!: dec part_timer
|
|
263
|
+
lda part_timer
|
|
264
|
+
ora part_timer+1
|
|
265
|
+
bne !done+
|
|
266
|
+
lda #0
|
|
267
|
+
sta tr_step
|
|
268
|
+
lda #OUT
|
|
269
|
+
sta seq_state
|
|
270
|
+
!done: rts
|
|
271
|
+
!out: jsr call_update
|
|
272
|
+
lda frozen
|
|
273
|
+
bne !done-
|
|
274
|
+
jsr call_out
|
|
275
|
+
bcc !done-
|
|
276
|
+
lda #chain_idle - slots
|
|
277
|
+
sta chain_first // one byte: the dispatcher reads it at the wrap
|
|
278
|
+
lda #SWITCH
|
|
279
|
+
sta seq_state
|
|
280
|
+
rts
|
|
281
|
+
|
|
282
|
+
.macro CallPart(lo, hi) {
|
|
283
|
+
ldx part
|
|
284
|
+
lda lo,x
|
|
285
|
+
sta jump+1
|
|
286
|
+
lda hi,x
|
|
287
|
+
sta jump+2
|
|
288
|
+
jump: jmp $ffff
|
|
289
|
+
}
|
|
290
|
+
call_init: CallPart(part_init_lo, part_init_hi)
|
|
291
|
+
call_update: CallPart(part_update_lo, part_update_hi)
|
|
292
|
+
call_out: CallPart(part_out_lo, part_out_hi)
|
|
293
|
+
call_teardown: CallPart(part_teardown_lo, part_teardown_hi)
|
|
294
|
+
|
|
295
|
+
// Starts the part in `part`: init, its frame count, its chain, PLAY.
|
|
296
|
+
// Called before the IRQs start (part 0) and from the main loop.
|
|
297
|
+
start_part:
|
|
298
|
+
jsr call_init
|
|
299
|
+
ldx part
|
|
300
|
+
lda part_frames_lo,x
|
|
301
|
+
sta part_timer
|
|
302
|
+
lda part_frames_hi,x
|
|
303
|
+
sta part_timer+1
|
|
304
|
+
lda part_chain,x
|
|
305
|
+
sta chain_first
|
|
306
|
+
lda #PLAY // last: the frame slot reads seq_state
|
|
307
|
+
sta seq_state
|
|
308
|
+
rts
|
|
309
|
+
|
|
310
|
+
// Main loop: once the out-transition has finished, tear the part down and
|
|
311
|
+
// start the next. The idle chain keeps the music playing meanwhile.
|
|
312
|
+
switch_parts:
|
|
313
|
+
lda seq_state
|
|
314
|
+
cmp #SWITCH
|
|
315
|
+
bne !+
|
|
316
|
+
jsr call_teardown
|
|
317
|
+
ldx part
|
|
318
|
+
inx
|
|
319
|
+
cpx #PART_COUNT
|
|
320
|
+
bne !next+
|
|
321
|
+
ldx #LOOP_PART
|
|
322
|
+
!next: stx part
|
|
323
|
+
jsr start_part
|
|
324
|
+
!: rts
|
|
325
|
+
|
|
326
|
+
// ---- model detection, interrupts off ----------------------------------------
|
|
327
|
+
// The last raster line before the wrap: $37 (311) on PAL, $06 (262) on the
|
|
328
|
+
// 6567R8, $05 (261) on the 6567R56A. model = 0 PAL, 1 NTSC.
|
|
329
|
+
detect_model:
|
|
330
|
+
!w1: lda $d012
|
|
331
|
+
!w2: cmp $d012
|
|
332
|
+
beq !w2-
|
|
333
|
+
bmi !w1- // the line went up by one: keep looking
|
|
334
|
+
ldx #0
|
|
335
|
+
cmp #$20
|
|
336
|
+
bcs !+
|
|
337
|
+
inx
|
|
338
|
+
!: stx model
|
|
339
|
+
rts
|
|
340
|
+
|
|
341
|
+
// ---- the wipe: an out-transition any part can name ---------------------------
|
|
342
|
+
// Clears WIPE_COLS columns of screen RAM a frame, left to right; carry set
|
|
343
|
+
// once all 40 are clear. Colour RAM is left alone.
|
|
344
|
+
wipe_columns:
|
|
345
|
+
ldy #WIPE_COLS
|
|
346
|
+
!col: ldx tr_step
|
|
347
|
+
lda #$20
|
|
348
|
+
.for (var r = 0; r < 25; r++) {
|
|
349
|
+
sta SCREEN + r * 40, x
|
|
350
|
+
}
|
|
351
|
+
inx
|
|
352
|
+
stx tr_step
|
|
353
|
+
cpx #40
|
|
354
|
+
bcs !+ // carry set: finished
|
|
355
|
+
dey
|
|
356
|
+
bne !col-
|
|
357
|
+
clc
|
|
358
|
+
!: rts
|
|
359
|
+
|
|
360
|
+
// An update or teardown with nothing to do names no_op. An `out` step
|
|
361
|
+
// that returns at once names hard_cut: carry set ends the part this frame.
|
|
362
|
+
// (An out step that always returns carry clear never ends its part.)
|
|
363
|
+
no_op: rts
|
|
364
|
+
hard_cut:
|
|
365
|
+
sec
|
|
366
|
+
rts
|
|
367
|
+
|
|
368
|
+
// ---- the framework's state ---------------------------------------------------
|
|
369
|
+
slot: .byte 0 // the row the next IRQ runs
|
|
370
|
+
next: .byte 0
|
|
371
|
+
chain_first: .byte 0 // the current chain's first row
|
|
372
|
+
saved_sp: .byte 0
|
|
373
|
+
model: .byte 0
|
|
374
|
+
seq_state: .byte PLAY
|
|
375
|
+
part: .byte 0
|
|
376
|
+
part_timer: .word 0
|
|
377
|
+
tr_step: .byte 0 // the transition's own counter
|
|
378
|
+
frame_flag: .byte 0
|
|
379
|
+
irq_entries: .byte 0 // dispatcher entries since the last wrap
|
|
380
|
+
irq_tmp: .byte 0
|
|
381
|
+
chain_run: .byte 0 // the chain that started at the last wrap
|
|
382
|
+
watching: .byte 0
|
|
383
|
+
irq_late: .byte 0
|
|
384
|
+
irq_bad: .byte 0
|
|
385
|
+
frame_late: .byte 0
|
|
386
|
+
frozen: .byte 0 // AUTOPILOT: set once the graded frame is reached
|
|
387
|
+
frames: .word 0 // frame slots since the start
|
|
388
|
+
ntsc_div: .byte 0
|
|
389
|
+
music_calls: .word 0
|
|
390
|
+
music_skips: .word 0
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// main.asm: the demo starter. Start-up, the main loop and the memory map.
|
|
2
|
+
//
|
|
3
|
+
// framework.asm dispatcher, stable entry, sequencer, frame slot, wipe
|
|
4
|
+
// parts.asm the running order and every part's IRQ chain
|
|
5
|
+
// part_title.asm part 0: the title card
|
|
6
|
+
// part_main.asm part 1: logo, sprite chain, bars kernel, scroller
|
|
7
|
+
// tables.asm part 1's sines, ramps, sprite, logo and message
|
|
8
|
+
// music.asm the tune and its player, $1000 init / $1003 play
|
|
9
|
+
// verdict.asm AUTOPILOT: grades the frozen frame
|
|
10
|
+
//
|
|
11
|
+
// -define AUTOPILOT: the frame meter runs (row 24, columns 20-39) and the
|
|
12
|
+
// main part freezes after FREEZE_UPDATES updates for the verdict.
|
|
13
|
+
// -define FORCE_FAULT: the sprite chain starts sixteen sine steps ahead; the
|
|
14
|
+
// verdict and the screenshot checks must both fail.
|
|
15
|
+
// -define PROBE: the bar kernel's stores move 20 cycles right, into the
|
|
16
|
+
// visible line, to measure where they land (README, "The stable entry and the bars").
|
|
17
|
+
#import "frame_meter.asm" // templates/_harness/meter, via -libdir
|
|
18
|
+
#import "config.asm"
|
|
19
|
+
|
|
20
|
+
BasicUpstart2(start)
|
|
21
|
+
|
|
22
|
+
* = $0810 "code"
|
|
23
|
+
start:
|
|
24
|
+
sei
|
|
25
|
+
lda #$7f
|
|
26
|
+
sta $dc0d // CIA1: no interrupts; every IRQ is a raster match
|
|
27
|
+
lda $dc0d // drop one already flagged
|
|
28
|
+
lda #0
|
|
29
|
+
sta $d015
|
|
30
|
+
sta $d01a
|
|
31
|
+
jsr detect_model
|
|
32
|
+
lda model
|
|
33
|
+
beq !+
|
|
34
|
+
lda #<kernel_ntsc // the NTSC kernel's lines are 65 cycles
|
|
35
|
+
sta kernel_call+1
|
|
36
|
+
lda #>kernel_ntsc
|
|
37
|
+
sta kernel_call+2
|
|
38
|
+
!: ldx #63 // the sprite image to block 13
|
|
39
|
+
!: lda sprite_image,x
|
|
40
|
+
sta SPRITE_BLOCK * 64,x
|
|
41
|
+
dex
|
|
42
|
+
bpl !-
|
|
43
|
+
lda #0 // the tune: subtune 0, X = this model's pitch
|
|
44
|
+
ldx model
|
|
45
|
+
jsr MUSIC_INIT
|
|
46
|
+
lda #0
|
|
47
|
+
sta part
|
|
48
|
+
jsr start_part // part 0's init, frame count and chain
|
|
49
|
+
FrameMeterInit() // after the init: the meter tints its own cells
|
|
50
|
+
lda chain_first // arm the chain's first row
|
|
51
|
+
sta slot
|
|
52
|
+
sta chain_run
|
|
53
|
+
tax
|
|
54
|
+
lda slots+0,x
|
|
55
|
+
sta $d012
|
|
56
|
+
lda $d011
|
|
57
|
+
and #$7f
|
|
58
|
+
ora slots+1,x
|
|
59
|
+
sta $d011
|
|
60
|
+
lda #<irq
|
|
61
|
+
sta $0314
|
|
62
|
+
lda #>irq
|
|
63
|
+
sta $0315
|
|
64
|
+
lda #$01
|
|
65
|
+
sta $d01a
|
|
66
|
+
sta $d019
|
|
67
|
+
cli
|
|
68
|
+
|
|
69
|
+
// The main loop: everything that is not tied to a raster line. Once a
|
|
70
|
+
// frame: record the meter, start the next part when the sequencer asks, and
|
|
71
|
+
// give the loader its turn.
|
|
72
|
+
main_loop:
|
|
73
|
+
#if PROBE
|
|
74
|
+
// PROBE only: the IRQs must land in every phase of the instruction
|
|
75
|
+
// they interrupt, or a wrong SYNC_PAD looks right. A frozen frame
|
|
76
|
+
// repeats exactly, so each pass waits 5 x n cycles (n = 1 to 19, one
|
|
77
|
+
// more each frame) and then spins in a 19-cycle loop with a 6-cycle
|
|
78
|
+
// instruction in it; 19 is prime and divides neither frame length.
|
|
79
|
+
inc probe_n
|
|
80
|
+
lda probe_n
|
|
81
|
+
cmp #20
|
|
82
|
+
bcc !+
|
|
83
|
+
lda #1
|
|
84
|
+
sta probe_n
|
|
85
|
+
!: tax
|
|
86
|
+
!: dex
|
|
87
|
+
bne !-
|
|
88
|
+
!: lda frame_flag // 4
|
|
89
|
+
bne !+ // 2
|
|
90
|
+
inc probe_spin // 6
|
|
91
|
+
nop // 2
|
|
92
|
+
nop // 2
|
|
93
|
+
jmp !- // 3
|
|
94
|
+
!:
|
|
95
|
+
#else
|
|
96
|
+
lda frame_flag
|
|
97
|
+
beq main_loop
|
|
98
|
+
#endif
|
|
99
|
+
lda #0
|
|
100
|
+
sta frame_flag
|
|
101
|
+
FrameMeterEnd() // the frame's IRQ work, summed, is one sample
|
|
102
|
+
FrameMeterPrint()
|
|
103
|
+
jsr switch_parts
|
|
104
|
+
jsr loader_hook
|
|
105
|
+
#if AUTOPILOT
|
|
106
|
+
lda verdict_done // grading is bookkeeping: outside every bracket
|
|
107
|
+
bne !+
|
|
108
|
+
lda frozen
|
|
109
|
+
beq !+
|
|
110
|
+
jsr verdict
|
|
111
|
+
!:
|
|
112
|
+
#endif
|
|
113
|
+
jmp main_loop
|
|
114
|
+
|
|
115
|
+
// The loader hook. A real demo loads its next part here while this one
|
|
116
|
+
// plays, with an IRQ loader (Sparkle, Spindle or Krill: see c64-kb's
|
|
117
|
+
// loader techniques). It runs outside every IRQ, so the chain keeps its
|
|
118
|
+
// lines. Not the KERNAL's LOAD: its serial routines run with interrupts
|
|
119
|
+
// masked for whole bytes, which moves the bars, and end in CLI.
|
|
120
|
+
loader_hook:
|
|
121
|
+
rts
|
|
122
|
+
|
|
123
|
+
probe_spin: .byte 0
|
|
124
|
+
probe_n: .byte 0
|
|
125
|
+
|
|
126
|
+
#import "framework.asm"
|
|
127
|
+
#import "parts.asm"
|
|
128
|
+
#import "part_title.asm"
|
|
129
|
+
|
|
130
|
+
#import "music.asm" // * = $1000
|
|
131
|
+
|
|
132
|
+
* = $1400 "main part"
|
|
133
|
+
#import "part_main.asm"
|
|
134
|
+
#if AUTOPILOT
|
|
135
|
+
#import "verdict.asm"
|
|
136
|
+
#endif
|
|
137
|
+
frame_meter: // the meter's macros jsr into this label
|
|
138
|
+
FrameMeterCode(SCREEN, 24, 20, 1, HOLD)
|
|
139
|
+
#import "tables.asm" // page-aligned
|