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,199 @@
|
|
|
1
|
+
# Plan: hello-kick
|
|
2
|
+
|
|
3
|
+
hello in KickAssembler alone, to prove the harness's pure-KickAssembler
|
|
4
|
+
path and the KickAssembler frame meter. The minimal starter. It exists to prove the harness end to end, so its plan
|
|
5
|
+
is small. The tool output below was produced on 2026-09-23 by c64-kb 0.13.0
|
|
6
|
+
(KB data 756) and pasted whole.
|
|
7
|
+
|
|
8
|
+
## Concept
|
|
9
|
+
|
|
10
|
+
One hardware sprite, moved by joystick port 2, fire toggles its colour. The
|
|
11
|
+
frame's work is timed by the harness meter's KickAssembler macros. PAL and
|
|
12
|
+
NTSC.
|
|
13
|
+
|
|
14
|
+
## Briefing
|
|
15
|
+
|
|
16
|
+
No briefing was run for hello: its techniques were chosen to exercise the
|
|
17
|
+
harness, not proposed by a brief. A real starter runs
|
|
18
|
+
`npx tsx src/cli.ts game-briefing "<concept>" --archetype <name>` here.
|
|
19
|
+
|
|
20
|
+
## Techniques
|
|
21
|
+
|
|
22
|
+
| Technique | Why | Recipe it starts from | Pitfalls read (`pitfalls-for`) |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
| frame_sync_loop | one pass of the loop a frame, synced on raster line 250 | oscar64-frame-sync-loop (ported) | badline_cycle_loss, d012_wrap_around, raster_line_count_difference, vic_colour_register_upper_nibble_reads_set, and the rest of its list |
|
|
25
|
+
| joystick_edge_detect | fire toggles the colour once per press, not once per frame | oscar64-joystick-input, oscar64-headless-verify (the autopilot) | cia1_ddr_cleared_kills_keyboard, colour_ram_index_past_last_cell_hits_cia1, joystick2_scan_phantom_press |
|
|
26
|
+
| raster_profile_bars | the frame meter is its CIA-timed half, on CIA2 timer A | oscar64-raster-profile-bars | badline_cycle_loss, vic_bus_takeover_on_dma, vic_colour_register_upper_nibble_reads_set |
|
|
27
|
+
|
|
28
|
+
## Compatibility
|
|
29
|
+
|
|
30
|
+
Command: `npx tsx src/cli.ts check-compatibility frame_sync_loop joystick_edge_detect raster_profile_bars`
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
# Compatibility: frame_sync_loop + joystick_edge_detect + raster_profile_bars
|
|
34
|
+
|
|
35
|
+
**Verdict:** WARNINGS
|
|
36
|
+
|
|
37
|
+
Unit claims are stated for 1 of 3 techniques; a unit conflict cannot be ruled out for: frame_sync_loop, raster_profile_bars. The zero-page bytes and interrupt vectors a recipe chooses are not checked yet (issue #22, step 8).
|
|
38
|
+
|
|
39
|
+
## shared_register (soft): frame_sync_loop × raster_profile_bars
|
|
40
|
+
**Shared:** EXTCOL
|
|
41
|
+
Both techniques touch register(s) EXTCOL. This says they write the same registers, not that they fight: keep each one's writes in its own raster region, or have one of them own the register and the other read a shadow copy.
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
## Shared Infrastructure (info)
|
|
45
|
+
- **CLRCHN** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
46
|
+
- **CHKOUT** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
47
|
+
- **CHKIN** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
48
|
+
- **CLOSE** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
49
|
+
- **OPEN** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
50
|
+
- **SETNAM** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
51
|
+
- **SETLFS** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
52
|
+
- **DC0F** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
53
|
+
- **DC07** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
54
|
+
- **DC06** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
55
|
+
- **SP6COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
56
|
+
- **SP5COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
57
|
+
- **SP4COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
58
|
+
- **SP3COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
59
|
+
- **SP2COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
60
|
+
- **SP1COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
61
|
+
- **SP0COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
62
|
+
- **BGCOL0** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-falling-blocks
|
|
63
|
+
- **EXTCOL** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-falling-blocks
|
|
64
|
+
- **IRQMSK** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
65
|
+
- **VICIRQ** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
66
|
+
- **SPENA** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
67
|
+
- **RASTER** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-falling-blocks
|
|
68
|
+
- **SCROLY** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-falling-blocks
|
|
69
|
+
- **MSIGX** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
70
|
+
- **M0Y** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
71
|
+
- **M0X** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
72
|
+
- **RANDOM** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
73
|
+
- **SIGVOL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
74
|
+
- **SUREL3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
75
|
+
- **ATDCY3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
76
|
+
- **VCREG3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
77
|
+
- **PWHI3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
78
|
+
- **PWLO3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
79
|
+
- **FREHI3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
80
|
+
- **FRELO3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
81
|
+
- **SUREL2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
82
|
+
- **ATDCY2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
83
|
+
- **VCREG2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
84
|
+
- **PWHI2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
85
|
+
- **PWLO2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
86
|
+
- **FREHI2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
87
|
+
- **FRELO2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
88
|
+
- **SUREL1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
89
|
+
- **ATDCY1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
90
|
+
- **VCREG1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
91
|
+
- **DC03** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
92
|
+
- **DC02** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
93
|
+
- **PWHI1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
94
|
+
- **PWLO1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
95
|
+
- **FREHI1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
96
|
+
- **FRELO1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
97
|
+
- **READST** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
98
|
+
- **DC00** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-falling-blocks
|
|
99
|
+
- **CHRIN** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
100
|
+
- **CHROUT** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
101
|
+
- **DC0E** (Register) shared via recipe(s): oscar64-falling-blocks
|
|
102
|
+
- **DC05** (Register) shared via recipe(s): oscar64-falling-blocks
|
|
103
|
+
- **DC04** (Register) shared via recipe(s): oscar64-falling-blocks
|
|
104
|
+
- **raster_discipline**: Multiple raster-discipline techniques present. Verify IRQ stack ordering and timing budget.
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
What the warnings mean for this program:
|
|
108
|
+
|
|
109
|
+
- EXTCOL shared by frame_sync_loop and raster_profile_bars: hello uses no
|
|
110
|
+
border bars; only the verdict writes `$D020`, once.
|
|
111
|
+
- The shared-infrastructure list comes from another recipe
|
|
112
|
+
(platformer-scaffold) that uses these techniques; hello calls no KERNAL
|
|
113
|
+
routine after `SEI`.
|
|
114
|
+
|
|
115
|
+
## Budget
|
|
116
|
+
|
|
117
|
+
Command: `npx tsx src/cli.ts plan-budget frame_sync_loop joystick_edge_detect raster_profile_bars --region both --sprites 1 --sprite-lines 21`
|
|
118
|
+
|
|
119
|
+
```text
|
|
120
|
+
# Budget plan: undetermined
|
|
121
|
+
|
|
122
|
+
Techniques: frame_sync_loop, joystick_edge_detect, raster_profile_bars
|
|
123
|
+
|
|
124
|
+
## play (PAL, 19656 cycles a frame): undetermined
|
|
125
|
+
|
|
126
|
+
Range 467 + 1180 fixed cycles; floor 1180; weakest basis measured-vice; IRQ slots 0.
|
|
127
|
+
|
|
128
|
+
Summed:
|
|
129
|
+
- raster_profile_bars: 467 (measured-vice, on oscar64-raster-profile-bars (worst frame, screen blanked))
|
|
130
|
+
|
|
131
|
+
To measure:
|
|
132
|
+
- frame_sync_loop: the Cost line has no cycles_per_frame (nor cycles_per_line with lines_active); measure it on oscar64-frame-sync-loop
|
|
133
|
+
- joystick_edge_detect: no **Cost:** line; measure it on oscar64-attract-replay
|
|
134
|
+
|
|
135
|
+
Notes:
|
|
136
|
+
- Fixed losses 1180 cycles (badlines 25 × 43 = 1075, lines 51-243 every eighth with YSCROLL 3, sprite DMA 105; arithmetic) charged because raster_profile_bars is not stated as measured with the screen on. A stall takes its cycles wherever the code runs, so the charge is exact: no summed figure already holds a stall.
|
|
137
|
+
- Unknown is not zero: frame_sync_loop, joystick_edge_detect have no cycles figure, so the verdict cannot be fits.
|
|
138
|
+
|
|
139
|
+
## play (NTSC, 17095 cycles a frame): undetermined
|
|
140
|
+
|
|
141
|
+
Range 467 + 1180 fixed cycles; floor 1180; weakest basis measured-vice; IRQ slots 0.
|
|
142
|
+
|
|
143
|
+
Summed:
|
|
144
|
+
- raster_profile_bars: 467 (measured-vice, on oscar64-raster-profile-bars (worst frame, screen blanked))
|
|
145
|
+
|
|
146
|
+
To measure:
|
|
147
|
+
- frame_sync_loop: the Cost line has no cycles_per_frame (nor cycles_per_line with lines_active); measure it on oscar64-frame-sync-loop
|
|
148
|
+
- joystick_edge_detect: no **Cost:** line; measure it on oscar64-attract-replay
|
|
149
|
+
|
|
150
|
+
Notes:
|
|
151
|
+
- Fixed losses 1180 cycles (badlines 25 × 43 = 1075, lines 51-243 every eighth with YSCROLL 3, sprite DMA 105; arithmetic) charged because raster_profile_bars is not stated as measured with the screen on. A stall takes its cycles wherever the code runs, so the charge is exact: no summed figure already holds a stall.
|
|
152
|
+
- Unknown is not zero: frame_sync_loop, joystick_edge_detect have no cycles figure, so the verdict cannot be fits.
|
|
153
|
+
- Cycles per frame are the pages' figures, most measured on PAL; the same code takes about the same cycles on NTSC, against a 17,095-cycle frame.
|
|
154
|
+
|
|
155
|
+
## Bytes
|
|
156
|
+
|
|
157
|
+
No member states a byte figure that can be summed.
|
|
158
|
+
- frame_sync_loop: 985 bytes left out, the whole program, not the technique
|
|
159
|
+
|
|
160
|
+
## Assumptions
|
|
161
|
+
|
|
162
|
+
- Region PAL and NTSC: PAL 19656, NTSC 17095 cycles a frame.
|
|
163
|
+
- Screen on: unless every summed figure says it was measured with the screen on, the 25 badlines × 43 cycles outside any band charge are charged.
|
|
164
|
+
- Low end: each member's cycles_per_frame_typical where the page states one (a common frame, or a real run's worst frame), else its worst frame. It is not a floor. Over is judged on the floor: band and per-line charges, which run every frame, plus the badline loss no summed figure can already hold.
|
|
165
|
+
- Each figure is the technique's own Cost line, measured on the recipe it names: another implementation can cost more or less.
|
|
166
|
+
- Claims, zero page and memory are not judged here; c64_check_compatibility judges claims and zero page.
|
|
167
|
+
- Sprites: 1 a line on 21 lines, (3 + 2 × 1) × 21 = 105 cycles of DMA a frame (3 + 2n measured in VICE x64sc for sprites numbered without gaps).
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Measured by the meter (`make shot check`, VICE x64sc 3.10, the script's 144
|
|
171
|
+
play frames): worst 178 cycles, typical (the median) 154, the same on PAL and
|
|
172
|
+
NTSC. The bracket starts on raster line 250, below the last badline ($F7),
|
|
173
|
+
and the sprite is on lines 117 to 137, so no badline and no sprite DMA lands
|
|
174
|
+
in it; the plan's 1,180 fixed cycles are real but fall outside the bracket.
|
|
175
|
+
The grading at frame 150 runs after the bracket and is not in either figure.
|
|
176
|
+
|
|
177
|
+
## Memory and screen
|
|
178
|
+
|
|
179
|
+
- `$0340-$037E` sprite 0's image (block 13, the tape buffer).
|
|
180
|
+
- `$0801` up: the program, then the meter's code and variables
|
|
181
|
+
(`FrameMeterCode`, no zero page).
|
|
182
|
+
- `$0400` screen, power-on character set. Row 24, columns 20 to 39: the meter.
|
|
183
|
+
- `$02FF` the verdict byte. CIA2 timer A: the meter.
|
|
184
|
+
|
|
185
|
+
## Autopilot and checks
|
|
186
|
+
|
|
187
|
+
Script (frames, port byte): 64 right, 40 down, 16 fire, 24 up and right: 144
|
|
188
|
+
frames, every one playing, then idle. The meter records exactly those 144.
|
|
189
|
+
End state by arithmetic: sprite X 188, Y 116, cyan. Frame 150, after the
|
|
190
|
+
meter's bracket, reads the sprite registers back, stores the verdict at
|
|
191
|
+
`$02FF` and sets the border. FORCE_FAULT starts the sprite at X 101, so it
|
|
192
|
+
ends at 189: the verdict and the sprite checks fail together. `expect.json`
|
|
193
|
+
checks the border, the title and verdict text, the sprite's bounding box and
|
|
194
|
+
that it is solid, the pixel left of it, rows 0 to 23 identical on PAL and
|
|
195
|
+
NTSC, and the meter (144 frames recorded, worst within one frame).
|
|
196
|
+
|
|
197
|
+
## Decisions and open questions
|
|
198
|
+
|
|
199
|
+
- `SEI` at start: no KERNAL interrupt lands inside the meter's bracket.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"checks": [
|
|
3
|
+
{ "name": "own verdict (border)", "type": "verdict" },
|
|
4
|
+
{ "name": "title", "type": "text", "row": 1, "col": 1, "text": "HELLO HARNESS" },
|
|
5
|
+
{ "name": "verdict line", "type": "text", "row": 22, "col": 1, "text": "RESULT 01 PASS" },
|
|
6
|
+
{
|
|
7
|
+
"name": "sprite where the script leaves it (X 188, Y 116: lines 117 to 137)",
|
|
8
|
+
"type": "sprite",
|
|
9
|
+
"colour": 3,
|
|
10
|
+
"vic_x": 188,
|
|
11
|
+
"line": 117,
|
|
12
|
+
"width": 24,
|
|
13
|
+
"height": 21
|
|
14
|
+
},
|
|
15
|
+
{ "name": "sprite solid", "type": "rect", "colour": 3, "vic_x": 188, "line": 117, "width": 24, "height": 21 },
|
|
16
|
+
{ "name": "left of the sprite", "type": "pixel", "vic_x": 187, "line": 117, "colour": 0 },
|
|
17
|
+
{ "name": "display the same on both models", "type": "same", "cells": [0, 0, 23, 39] },
|
|
18
|
+
{ "name": "frame meter, the script's 144 play frames", "type": "meter", "row": 24, "col": 20, "frames": 144 }
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// hello-kick: hello in KickAssembler alone. One sprite moved by joystick
|
|
2
|
+
// port 2, fire toggles its colour, the frame meter around the frame's work.
|
|
3
|
+
// -define AUTOPILOT replaces the port with a script and grades the end
|
|
4
|
+
// position; -define FORCE_FAULT starts the sprite one pixel off, so both the
|
|
5
|
+
// program's own grade and the screenshot checks must fail.
|
|
6
|
+
#import "frame_meter.asm" // templates/_harness/meter, via -libdir
|
|
7
|
+
|
|
8
|
+
.const SCREEN = $0400
|
|
9
|
+
.const COLOUR = $d800
|
|
10
|
+
.const RESULT = $02ff // $01 pass, $02 fail, $00 not reached
|
|
11
|
+
.const SPRITE_BLOCK = 13 // $0340, the tape buffer
|
|
12
|
+
#if FORCE_FAULT
|
|
13
|
+
.const START_X = 101 // the fault build ends 1 pixel off
|
|
14
|
+
#else
|
|
15
|
+
.const START_X = 100
|
|
16
|
+
#endif
|
|
17
|
+
.const START_Y = 100
|
|
18
|
+
.const PLAY_FRAMES = 144 // the script's length; the meter records these
|
|
19
|
+
.const VERDICT_FRAME = 150 // after the script
|
|
20
|
+
.const EXPECT_X = 188 // 100 + 64 + 24, by arithmetic on the script
|
|
21
|
+
.const EXPECT_Y = 116 // 100 + 40 - 24
|
|
22
|
+
.const EXPECT_COLOUR = 3 // cyan: one fire press from yellow
|
|
23
|
+
|
|
24
|
+
BasicUpstart2(start)
|
|
25
|
+
|
|
26
|
+
start:
|
|
27
|
+
sei // no KERNAL IRQ inside the meter's bracket
|
|
28
|
+
lda #$ff
|
|
29
|
+
sta $dc00 // no keyboard column selected
|
|
30
|
+
ldx #0
|
|
31
|
+
!: lda #$20
|
|
32
|
+
sta SCREEN,x
|
|
33
|
+
sta SCREEN+$100,x
|
|
34
|
+
sta SCREEN+$200,x
|
|
35
|
+
sta SCREEN+$2e8,x
|
|
36
|
+
lda #1
|
|
37
|
+
sta COLOUR,x
|
|
38
|
+
sta COLOUR+$100,x
|
|
39
|
+
sta COLOUR+$200,x
|
|
40
|
+
sta COLOUR+$2e8,x
|
|
41
|
+
inx
|
|
42
|
+
bne !-
|
|
43
|
+
lda #0
|
|
44
|
+
sta $d020
|
|
45
|
+
sta $d021
|
|
46
|
+
ldx #title_end - title - 1
|
|
47
|
+
!: lda title,x
|
|
48
|
+
sta SCREEN + 40*1 + 1,x
|
|
49
|
+
dex
|
|
50
|
+
bpl !-
|
|
51
|
+
ldx #62
|
|
52
|
+
lda #$ff // a solid 24 x 21 block
|
|
53
|
+
!: sta SPRITE_BLOCK*64,x
|
|
54
|
+
dex
|
|
55
|
+
bpl !-
|
|
56
|
+
lda #SPRITE_BLOCK
|
|
57
|
+
sta SCREEN + $3f8
|
|
58
|
+
lda #7
|
|
59
|
+
sta colour
|
|
60
|
+
sta $d027
|
|
61
|
+
lda #1
|
|
62
|
+
sta $d015
|
|
63
|
+
FrameMeterInit()
|
|
64
|
+
|
|
65
|
+
loop:
|
|
66
|
+
!: lda $d012 // frame_sync_loop on line 250: below the last
|
|
67
|
+
cmp #250 // badline ($F7), once a frame, PAL and NTSC
|
|
68
|
+
beq !-
|
|
69
|
+
!: lda $d012
|
|
70
|
+
cmp #250
|
|
71
|
+
bne !-
|
|
72
|
+
FrameMeterStart()
|
|
73
|
+
jsr port_read // A = port byte, active low
|
|
74
|
+
sta joy
|
|
75
|
+
lda joy
|
|
76
|
+
and #$04 // left, down to X 24
|
|
77
|
+
bne no_left
|
|
78
|
+
lda xpos+1
|
|
79
|
+
bne do_left
|
|
80
|
+
lda xpos
|
|
81
|
+
cmp #25
|
|
82
|
+
bcc no_left
|
|
83
|
+
do_left:
|
|
84
|
+
lda xpos
|
|
85
|
+
bne !+
|
|
86
|
+
dec xpos+1
|
|
87
|
+
!: dec xpos
|
|
88
|
+
no_left:
|
|
89
|
+
lda joy
|
|
90
|
+
and #$08 // right, up to X 320
|
|
91
|
+
bne no_right
|
|
92
|
+
lda xpos+1
|
|
93
|
+
beq do_right
|
|
94
|
+
lda xpos
|
|
95
|
+
cmp #<320
|
|
96
|
+
bcs no_right
|
|
97
|
+
do_right:
|
|
98
|
+
inc xpos
|
|
99
|
+
bne no_right
|
|
100
|
+
inc xpos+1
|
|
101
|
+
no_right:
|
|
102
|
+
lda joy
|
|
103
|
+
and #$01 // up
|
|
104
|
+
bne !+
|
|
105
|
+
lda ypos
|
|
106
|
+
cmp #51
|
|
107
|
+
bcc !+
|
|
108
|
+
dec ypos
|
|
109
|
+
!: lda joy
|
|
110
|
+
and #$02 // down
|
|
111
|
+
bne !+
|
|
112
|
+
lda ypos
|
|
113
|
+
cmp #229
|
|
114
|
+
bcs !+
|
|
115
|
+
inc ypos
|
|
116
|
+
!: lda joy // fire: a new press toggles the colour
|
|
117
|
+
and #$10
|
|
118
|
+
bne !+
|
|
119
|
+
lda prev
|
|
120
|
+
and #$10
|
|
121
|
+
beq !+
|
|
122
|
+
lda colour
|
|
123
|
+
eor #7 ^ 3
|
|
124
|
+
sta colour
|
|
125
|
+
!: lda joy
|
|
126
|
+
sta prev
|
|
127
|
+
lda xpos // the sprite registers
|
|
128
|
+
sta $d000
|
|
129
|
+
lda $d010
|
|
130
|
+
and #$fe
|
|
131
|
+
ldx xpos+1
|
|
132
|
+
beq !+
|
|
133
|
+
ora #1
|
|
134
|
+
!: sta $d010
|
|
135
|
+
lda ypos
|
|
136
|
+
sta $d001
|
|
137
|
+
lda colour
|
|
138
|
+
sta $d027
|
|
139
|
+
FrameMeterStop() // the frame's own work ends here
|
|
140
|
+
#if AUTOPILOT
|
|
141
|
+
// Grading is the harness's bookkeeping, not the program's work: it
|
|
142
|
+
// runs after FrameMeterStop, so it is not in the worst frame.
|
|
143
|
+
lda frame+1
|
|
144
|
+
bne !+
|
|
145
|
+
lda frame
|
|
146
|
+
cmp #VERDICT_FRAME
|
|
147
|
+
bne !+
|
|
148
|
+
jsr verdict
|
|
149
|
+
!:
|
|
150
|
+
#endif
|
|
151
|
+
FrameMeterPrint()
|
|
152
|
+
inc frame
|
|
153
|
+
bne !+
|
|
154
|
+
inc frame+1
|
|
155
|
+
!: jmp loop
|
|
156
|
+
|
|
157
|
+
#if AUTOPILOT
|
|
158
|
+
// Reads the sprite registers back and grades them.
|
|
159
|
+
verdict:
|
|
160
|
+
lda $d000
|
|
161
|
+
cmp #<EXPECT_X
|
|
162
|
+
bne fail
|
|
163
|
+
lda $d010
|
|
164
|
+
and #1
|
|
165
|
+
cmp #>EXPECT_X
|
|
166
|
+
bne fail
|
|
167
|
+
lda $d001
|
|
168
|
+
cmp #EXPECT_Y
|
|
169
|
+
bne fail
|
|
170
|
+
lda $d027
|
|
171
|
+
and #$0f // the upper nibble of a colour register reads set
|
|
172
|
+
cmp #EXPECT_COLOUR
|
|
173
|
+
bne fail
|
|
174
|
+
lda #1
|
|
175
|
+
sta RESULT
|
|
176
|
+
lda #5
|
|
177
|
+
sta $d020
|
|
178
|
+
ldx #0
|
|
179
|
+
jmp say
|
|
180
|
+
fail: lda #2
|
|
181
|
+
sta RESULT
|
|
182
|
+
sta $d020
|
|
183
|
+
ldx #pass_end - pass
|
|
184
|
+
say: ldy #0
|
|
185
|
+
!: lda pass,x
|
|
186
|
+
sta SCREEN + 40*22 + 1,y
|
|
187
|
+
inx
|
|
188
|
+
iny
|
|
189
|
+
cpy #pass_end - pass
|
|
190
|
+
bne !-
|
|
191
|
+
rts
|
|
192
|
+
|
|
193
|
+
// { frames, port byte }: right 64, down 40, fire 16, up and right 24.
|
|
194
|
+
// Every frame plays.
|
|
195
|
+
port_read:
|
|
196
|
+
ldx ap_index
|
|
197
|
+
cpx #4
|
|
198
|
+
bcs idle
|
|
199
|
+
inc ap_used
|
|
200
|
+
lda ap_used
|
|
201
|
+
cmp script_frames,x
|
|
202
|
+
bne !+
|
|
203
|
+
lda #0
|
|
204
|
+
sta ap_used
|
|
205
|
+
inc ap_index
|
|
206
|
+
!: lda script_byte,x // this frame's byte; X still names its entry
|
|
207
|
+
rts
|
|
208
|
+
idle: lda #$ff
|
|
209
|
+
rts
|
|
210
|
+
script_frames: .byte 64, 40, 16, 24
|
|
211
|
+
script_byte: .byte $f7, $fd, $ef, $f6
|
|
212
|
+
ap_index: .byte 0
|
|
213
|
+
ap_used: .byte 0
|
|
214
|
+
pass: .text "result 01 pass"
|
|
215
|
+
pass_end:
|
|
216
|
+
.text "result 02 fail"
|
|
217
|
+
#else
|
|
218
|
+
port_read:
|
|
219
|
+
lda $dc00 // control port 2, active low
|
|
220
|
+
rts
|
|
221
|
+
#endif
|
|
222
|
+
|
|
223
|
+
title: .text "hello harness"
|
|
224
|
+
title_end:
|
|
225
|
+
xpos: .word START_X
|
|
226
|
+
ypos: .byte START_Y
|
|
227
|
+
colour: .byte 7
|
|
228
|
+
joy: .byte 0
|
|
229
|
+
prev: .byte $ff
|
|
230
|
+
frame: .word 0
|
|
231
|
+
|
|
232
|
+
frame_meter: // the meter's macros jsr into this label
|
|
233
|
+
FrameMeterCode(SCREEN, 24, 20, 1, PLAY_FRAMES)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"PreToolUse": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "Edit|MultiEdit|Write|NotebookEdit",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "h=\"$CLAUDE_PROJECT_DIR/harness/hooks/plan-gate.py\"; [ -f \"$h\" ] || h=\"$CLAUDE_PROJECT_DIR/../_harness/hooks/plan-gate.py\"; exec python3 \"$h\"",
|
|
11
|
+
"timeout": 10
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Rules for an agent working on this C64 program
|
|
2
|
+
|
|
3
|
+
This program runs on a stock Commodore 64, PAL and NTSC. It is built on the
|
|
4
|
+
c64-kb harness (`./harness`, vendored from c64-kb's `templates/_harness`).
|
|
5
|
+
c64-kb is the reference: its pages give the registers, timings, techniques,
|
|
6
|
+
pitfalls and recipes this program is built from. A wrong number becomes a torn
|
|
7
|
+
screen or a crash, so every claim here is measured or says it is not.
|
|
8
|
+
|
|
9
|
+
A new program starts in c64-kb with `npm run new-project -- <starter> <dir>`.
|
|
10
|
+
That copies the starter and the harness, points `.mcp.json` and `local.mk`
|
|
11
|
+
at the c64-kb checkout, proves the copy with `make shot check`, and leaves a
|
|
12
|
+
blank `PLAN.md`.
|
|
13
|
+
|
|
14
|
+
## This starter: platformer
|
|
15
|
+
|
|
16
|
+
A side-scrolling platformer that plays: `README.md` has the file map, how a
|
|
17
|
+
frame runs, the measured frame and the three most likely next steps. Rules
|
|
18
|
+
this program depends on:
|
|
19
|
+
|
|
20
|
+
- The scroll never shifts or redraws the page on display: it prepares a
|
|
21
|
+
third page five rows a frame (`src/view.c`), and only a flip shows it. A
|
|
22
|
+
taken coin's cells and the sprite pointers are the only writes to the
|
|
23
|
+
page on display (and a level restart redraws all three pages at a cut).
|
|
24
|
+
Keep the camera at 2 pixels a frame or less, or the slices fall behind.
|
|
25
|
+
- It builds on the local Oscar64 and on v1.32.273. Keep `surface_at`
|
|
26
|
+
`__noinline` and the score written through `put_digits`: both work around
|
|
27
|
+
v1.32.273 faults (README, "Which Oscar64").
|
|
28
|
+
- `NSLOT` is 5 because six live enemies overran an NTSC frame. After any
|
|
29
|
+
change to the enemies, run `make stage` (every slot live) as well as
|
|
30
|
+
`make shot check`.
|
|
31
|
+
- The verdict's per-frame bits (`check_frame` in `src/verdict.h`) catch
|
|
32
|
+
faults that heal before the end: keep them when you change the rules.
|
|
33
|
+
- `$D016` and `$D018` belong to the two IRQs in `src/engine.asm`. C
|
|
34
|
+
publishes the next picture's pair once a frame (`view_publish`).
|
|
35
|
+
- `make tearcheck` after any change to the scroll, the camera, the level or
|
|
36
|
+
the art: `tools/tearcheck.py` renders the level from `src/` and matches
|
|
37
|
+
shots mid-play. It reads the `LEVEL`, `TILES`, `GLYPHS` and `GLYPH-ART`
|
|
38
|
+
blocks: keep their markers.
|
|
39
|
+
- The autopilot is a timeline (`src/autopilot.h`); a changed level or
|
|
40
|
+
physics changes the run. Re-time it with `-dDEBUG_AT=n` builds, which
|
|
41
|
+
freeze at frame n and print the state on HUD row 21.
|
|
42
|
+
- `-dPROF=n` meters one subsystem (see `src/main.c`).
|
|
43
|
+
|
|
44
|
+
`PLAN.md` here is this starter's plan, filled from real tool output;
|
|
45
|
+
new-project keeps it as `PLAN-platformer-example.md` and gives the new
|
|
46
|
+
program a blank one.
|
|
47
|
+
|
|
48
|
+
## Before any code
|
|
49
|
+
|
|
50
|
+
1. Brief: `npx tsx src/cli.ts game-briefing "<concept>" --archetype <name>`
|
|
51
|
+
(or `demo-briefing`), in the c64-kb checkout. Read what it proposes.
|
|
52
|
+
2. For each technique you keep: `technique-lookup <name>` and
|
|
53
|
+
`pitfalls-for <name>`. Start from the recipe it names (`recipe-lookup`).
|
|
54
|
+
3. Fill `PLAN.md`: paste the whole output of `check-compatibility` and of
|
|
55
|
+
`plan-budget` (same techniques) into their sections, list every technique
|
|
56
|
+
in its table, and replace every `FILL:` line.
|
|
57
|
+
|
|
58
|
+
Until `PLAN.md` passes, a hook blocks Edit and Write under `src/`, and every
|
|
59
|
+
make target that builds stops (`make plan-gate` says what is missing). With
|
|
60
|
+
C64KB set, `make` re-runs `check-compatibility` and wants the pasted Verdict.
|
|
61
|
+
The gate cannot see writes made through a shell command, or outputs edited
|
|
62
|
+
into shape by hand: do neither. `make PLAN_GATE=off` overrides it; say why in
|
|
63
|
+
`PLAN.md` if you do.
|
|
64
|
+
|
|
65
|
+
## The loop
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
make # build build/<name>.prg
|
|
69
|
+
make shot check # autopilot build, headless PAL and NTSC, graded by expect.json
|
|
70
|
+
make selftest # the FORCE_FAULT build must fail the same checks
|
|
71
|
+
make disk # build/<name>.d64
|
|
72
|
+
make claims # every store the program makes, against what it declares
|
|
73
|
+
make run # windowed VICE, for a human
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Rules
|
|
77
|
+
|
|
78
|
+
- Build before claiming. Code that has not built is not done.
|
|
79
|
+
- Measure screenshots with `check.py` through `expect.json`, never by eye.
|
|
80
|
+
Every visible claim gets a check. Add one before you trust a change.
|
|
81
|
+
- PAL and NTSC: both shots pass, or it is not done.
|
|
82
|
+
- Name the rung for every number: measured here (`make shot`, the meter, the
|
|
83
|
+
VICE monitor), taken from a c64-kb page (say which), arithmetic, or not
|
|
84
|
+
measured. Never call something verified that was not run.
|
|
85
|
+
- Frame cost comes from the meter: CIA2 timer A, printed as
|
|
86
|
+
`F<frames> W<worst> T<typical>` at row 24, columns 20 to 39, in AUTOPILOT
|
|
87
|
+
builds. It records the first `hold` frames: make that the autopilot
|
|
88
|
+
script's play frames. Typical is the median of those frames, the KB's
|
|
89
|
+
`cycles_per_frame_typical`. Keep grading, logging and printing outside the
|
|
90
|
+
bracket; work split between the main loop and IRQs is summed with
|
|
91
|
+
`METER_PAUSE` / `METER_START`.
|
|
92
|
+
- Do not invent a register, routine or address. Look it up:
|
|
93
|
+
`lookup-register`, `lookup-kernal`, `memory-map`.
|
|
94
|
+
- Lint every source you change: `npx tsx src/cli.ts lint <file>`.
|
|
95
|
+
- Commit named paths only. Never `git add -A` or `git add .`. `build/`,
|
|
96
|
+
`shots/` and `local.mk` are never committed.
|
|
97
|
+
|
|
98
|
+
## Harness facts you will need
|
|
99
|
+
|
|
100
|
+
- `AUTOPILOT=1` builds read a scripted joystick byte instead of `$DC00` and
|
|
101
|
+
grade themselves: `$02FF` = `$01` and a green border on pass, `$02` and red
|
|
102
|
+
on fail. `FORCE_FAULT=1` must turn the verdict red and move something a
|
|
103
|
+
screenshot check can see.
|
|
104
|
+
- Screenshot geometry (c64-kb `docs/runtime/vice-reference.md`): PAL 384 x 272,
|
|
105
|
+
row = raster line - 16; NTSC 384 x 247, row = line - 28; x = VIC X + 8. A
|
|
106
|
+
sprite at Y register y is drawn from line y + 1.
|
|
107
|
+
- `check.py` reads text in the ROM character set unless a check names a
|
|
108
|
+
`charset` file; the meter's cells need 0-9, F, W and T in the set on screen.
|
|
109
|
+
- A KickAssembler part called from C is a raw blob at its own `* =` address,
|
|
110
|
+
`$0880` or above; `build/asm.h` gives C its labels as `ASM_<LABEL>`
|
|
111
|
+
(`ASM_<SCOPE>_<LABEL>` inside a scope). Pass arguments through bytes in the
|
|
112
|
+
blob, not Oscar64's zero page (`$02` up; the top depends on the program:
|
|
113
|
+
`make zp` lists what the build's code touches).
|
|
114
|
+
- The meter takes CIA2 timer A. Do not open RS-232 (device 2) while it runs.
|
|
115
|
+
- The KERNAL serial routines end in `CLI` (ROM bytes `58 60` / `58 18` at
|
|
116
|
+
`$EDAB`, `$EDB5`, `$EDDB`, `$EE82`). After any disk call, `SEI` again if
|
|
117
|
+
the program runs with the KERNAL IRQ off: otherwise that IRQ lands inside
|
|
118
|
+
the meter's brackets and rewrites `$DC00`.
|
|
119
|
+
|
|
120
|
+
## Calling c64-kb
|
|
121
|
+
|
|
122
|
+
- CLI, from the c64-kb checkout (`C64KB` in `local.mk`):
|
|
123
|
+
`npx tsx src/cli.ts <command>`; `npx tsx src/cli.ts --help` lists them.
|
|
124
|
+
- MCP: `.mcp.json` starts `node <c64-kb>/dist/cli.js serve` (run
|
|
125
|
+
`npm run build` in c64-kb first).
|