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,86 @@
|
|
|
1
|
+
# platformer: the side-scrolling platformer starter. Every target but
|
|
2
|
+
# tearcheck comes from the harness:
|
|
3
|
+
# make build build/platformer.prg (after the PLAN.md gate)
|
|
4
|
+
# make run windowed VICE, joystick in port 2
|
|
5
|
+
# make shot headless PAL and NTSC exit screenshots of the autopilot build
|
|
6
|
+
# make check grade shots/pal.png and shots/ntsc.png against expect.json
|
|
7
|
+
# make selftest prove check fails on the FORCE_FAULT=1 build
|
|
8
|
+
# make tearcheck shoot the autopilot run mid-scroll and match every picture
|
|
9
|
+
# against a render of the level (tools/tearcheck.py); then
|
|
10
|
+
# prove the check fails on the TEAR_DEMO=1 build
|
|
11
|
+
# make joy the normal game reading its port byte from $02FE, for tools/drive.py
|
|
12
|
+
# make disk build/platformer.d64
|
|
13
|
+
# make claims c64-kb's claims-watch over the autopilot build
|
|
14
|
+
# make clean
|
|
15
|
+
NAME := platformer
|
|
16
|
+
C_MAIN := src/main.c
|
|
17
|
+
KICK_SRC := src/engine.asm
|
|
18
|
+
|
|
19
|
+
SHOT_CYCLES_PAL := 26000000
|
|
20
|
+
SHOT_CYCLES_NTSC := 24000000
|
|
21
|
+
|
|
22
|
+
# What the program may write, for make claims (claims-watch's own grammar).
|
|
23
|
+
# - Oscar64's registers start at $02 (BC_REG_WORK_Y). main's temporaries
|
|
24
|
+
# reach $53 (T5, BC_REG_TMP_SAVED in its MachineTypes.cpp): this trace
|
|
25
|
+
# stores there from main+122, one past the $02-$52 that hello declares.
|
|
26
|
+
# - The KERNAL's IRQ runs until main's SEI, so IRQ is declared.
|
|
27
|
+
# - $DC0D (all CIA1 interrupts off) counts against the three CIA1 units;
|
|
28
|
+
# the meter's $DD0D against CIA2's three, declared as the harness's.
|
|
29
|
+
# - The whole run, title to verdict, is traced (--cycles, the PAL pin).
|
|
30
|
+
CLAIMS_ARGS := --claim 'sprite_0, sprite_1, sprite_2, sprite_3, sprite_4, sprite_5, sprite_6, sprite_7, vic_raster_irq, irq_vector_fffe, nmi_vector_fffa, cia2_vic_bank, cia1_port_a, cia1_timer_a, cia1_timer_b, cia1_tod, sid_voice_1, sid_voice_2, sid_voice_3, sid_filter_volume, zero_page $$02-$$53' --range 'colour=$$D800-$$DBFF,result=$$02FF' --harness 'cia2_timer_a, cia2_timer_b, cia2_tod' --kernal IRQ --cycles 26000000
|
|
31
|
+
|
|
32
|
+
# The harness sits beside the starter in c64-kb (../_harness) or is vendored
|
|
33
|
+
# into ./harness when the starter is copied out on its own.
|
|
34
|
+
# Proof targets `npm run verify:templates -- --selftest` runs after selftest.
|
|
35
|
+
VERIFY_TARGETS := tearcheck stage
|
|
36
|
+
|
|
37
|
+
HARNESS ?= $(firstword $(wildcard harness) ../_harness)
|
|
38
|
+
$(if $(wildcard $(HARNESS)/harness.mk),,$(error No harness at '$(HARNESS)'. Copy c64-kb's templates/_harness to ./harness, or make the project with npm run new-project in c64-kb))
|
|
39
|
+
include $(HARNESS)/harness.mk
|
|
40
|
+
|
|
41
|
+
# ---- tearcheck: the scroll never shows a torn picture -------------------------------
|
|
42
|
+
# Sixteen shots a model from 5,000,000 cycles (the first play frames) in steps
|
|
43
|
+
# of 977,777 (no whole number of frames on either model, so the beam lands on
|
|
44
|
+
# a different line each time), each matched against a render of the level.
|
|
45
|
+
# Then the TEAR_DEMO build, which shifts the page on display in place, must
|
|
46
|
+
# fail the same check: proof that the check can see a tear.
|
|
47
|
+
TEAR_CYCLES := $(shell $(PYTHON) -c "print(' '.join(str(5000000 + 977777 * i) for i in range(16)))")
|
|
48
|
+
# The TEAR_DEMO build tears only in the frames of a column crossing, so it
|
|
49
|
+
# gets three times the shots: one torn shot of 32 was all the first list
|
|
50
|
+
# found after a timing change.
|
|
51
|
+
TEAR_DEMO_CYCLES := $(shell $(PYTHON) -c "print(' '.join(str(5000000 + 311111 * i) for i in range(48)))")
|
|
52
|
+
PRG_TEAR := build/$(NAME)-tear.prg
|
|
53
|
+
$(PRG_TEAR): $(C_DEPS) $(ASM_OUT) $(METER_DEPS) | plan-gate
|
|
54
|
+
@mkdir -p build
|
|
55
|
+
$(OSCAR64_BUILD) -d$(AUTOPILOT_DEFINE)=1 -dTEAR_DEMO=1 -o=$@ $(C_MAIN)
|
|
56
|
+
|
|
57
|
+
.PHONY: tearcheck
|
|
58
|
+
tearcheck: $(PRG_AUTO) $(PRG_TEAR)
|
|
59
|
+
$(PYTHON) tools/tearcheck.py --x64sc $(X64SC) --harness $(HARNESS_DIR) --src src --expect whole $(PRG_AUTO) $(TEAR_CYCLES)
|
|
60
|
+
$(PYTHON) tools/tearcheck.py --x64sc $(X64SC) --harness $(HARNESS_DIR) --src src --expect torn $(PRG_TEAR) $(TEAR_DEMO_CYCLES)
|
|
61
|
+
|
|
62
|
+
# The normal game with its port byte read from $02FE instead of $DC00, so a
|
|
63
|
+
# VICE monitor can drive it headless (tools/drive.py).
|
|
64
|
+
PRG_JOY := build/$(NAME)-joy.prg
|
|
65
|
+
$(PRG_JOY): $(C_DEPS) $(ASM_OUT) $(METER_DEPS) | plan-gate
|
|
66
|
+
@mkdir -p build
|
|
67
|
+
$(OSCAR64_BUILD) -dJOY_SOURCE=0x02fe -o=$@ $(C_MAIN)
|
|
68
|
+
|
|
69
|
+
.PHONY: joy
|
|
70
|
+
joy: $(PRG_JOY)
|
|
71
|
+
|
|
72
|
+
# ---- stage: the worst frame with every enemy slot full ------------------------------
|
|
73
|
+
# STAGE_CROWD puts ten enemies in the first view (src/level.c), so all five
|
|
74
|
+
# slots are live from the first play frame; the autopilot runs as usual and
|
|
75
|
+
# grades only late frames. stage-expect.json wants the meter's worst inside
|
|
76
|
+
# one frame on each model.
|
|
77
|
+
PRG_STAGE := build/$(NAME)-stage.prg
|
|
78
|
+
$(PRG_STAGE): $(C_DEPS) $(ASM_OUT) $(METER_DEPS) | plan-gate
|
|
79
|
+
@mkdir -p build
|
|
80
|
+
$(OSCAR64_BUILD) -d$(AUTOPILOT_DEFINE)=1 -dSTAGE_CROWD=1 -o=$@ $(C_MAIN)
|
|
81
|
+
|
|
82
|
+
.PHONY: stage
|
|
83
|
+
stage: $(PRG_STAGE) $(PIN_PAL) $(PIN_NTSC)
|
|
84
|
+
$(call vice_shot,$(PRG_STAGE),$(SHOT_CYCLES_PAL),,shots/stage-pal.png)
|
|
85
|
+
$(call vice_shot,$(PRG_STAGE),$(SHOT_CYCLES_NTSC),-model ntsc,shots/stage-ntsc.png)
|
|
86
|
+
$(PYTHON) $(HARNESS_DIR)/check.py stage-expect.json shots/stage-pal.png shots/stage-ntsc.png
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
# Plan: platformer
|
|
2
|
+
|
|
3
|
+
The side-scrolling platformer starter for c64-kb issue #39. The tool output
|
|
4
|
+
below was produced on 2026-09-23 by c64-kb 0.14.0 (KB data 760) and pasted
|
|
5
|
+
whole.
|
|
6
|
+
|
|
7
|
+
## Concept
|
|
8
|
+
|
|
9
|
+
A side-scrolling platformer. A tile-mapped level 256 characters wide scrolls
|
|
10
|
+
horizontally through a 38-column window as the player runs. The player runs
|
|
11
|
+
and jumps with 8.8 fixed-point physics and lands on flat ground, 45-degree and
|
|
12
|
+
1-in-2 slopes, blocks and one-way ledges. Enemies placed in the level wake as
|
|
13
|
+
they enter an activation window around the view. Coins raise the score; the
|
|
14
|
+
player has three lives; a HUD sits under the playfield; a SID tune plays.
|
|
15
|
+
Title, fire to start, game over back to the title. PAL and NTSC.
|
|
16
|
+
|
|
17
|
+
## Briefing
|
|
18
|
+
|
|
19
|
+
Command: `npx tsx src/cli.ts game-briefing "A side-scrolling platformer: a tile-mapped level wider than the screen scrolls horizontally as the player runs; the player runs and jumps with fixed-point physics and lands on slopes and platforms; enemies wake as they enter an activation window around the screen; pickups raise the score; lives and a HUD; SID music. PAL and NTSC." --archetype platformer`
|
|
20
|
+
|
|
21
|
+
Kept from its 15 proposals: actor_activation_window, sid_play_routine_pattern,
|
|
22
|
+
tile_map_render, slope_collision, fixed_point_8_8. Its `sfx_in_player`
|
|
23
|
+
becomes sfx_engine_beside_music: the effects are C, on a voice the tune
|
|
24
|
+
leaves free.
|
|
25
|
+
|
|
26
|
+
Dropped: `char_scroll_buffer_h` (one screen buffer shifted in place: the
|
|
27
|
+
shift is visible while it runs, issue #18), replaced by soft_scroll_h plus
|
|
28
|
+
screen_double_buffer_d018. `goattracker_player_api` (the tune and its player
|
|
29
|
+
are original). `mixed_sprite_char_actors`, `multi_sprite_object`,
|
|
30
|
+
`charset_parallax`, `sprite_collision_detect` (not the archetype's core; the
|
|
31
|
+
hit test is software boxes). `drive_code_upload_and_job_queue` (nothing loads
|
|
32
|
+
after start) and `bfs_distance_map` (no path-finding enemy).
|
|
33
|
+
`text_window_and_menu` (the title is three HUD lines).
|
|
34
|
+
|
|
35
|
+
Added, not proposed: screen_double_buffer_d018, soft_scroll_h,
|
|
36
|
+
raster_split_modes (the HUD needs its own $D016), jump_arc_table,
|
|
37
|
+
object_pool, per_frame_hitbox, sprite_animation_table, frame_sync_loop,
|
|
38
|
+
joystick_edge_detect, decimal_print, raster_profile_bars (the meter).
|
|
39
|
+
|
|
40
|
+
The briefing named no pitfalls. `pitfalls-for` on the kept techniques names
|
|
41
|
+
the ones this program meets: full_field_redraw_exceeds_vblank (the coarse
|
|
42
|
+
shift goes to the hidden page), xscroll_applies_to_all_rows (the HUD split),
|
|
43
|
+
d016_unmasked_rmw_clobbers_csel_mcm (every $D016 write is a whole value),
|
|
44
|
+
sprite_x_range_hidden_and_seam and sprite_x_high_bit_wrong_register (world X
|
|
45
|
+
is 16-bit; a sprite outside the window is switched off),
|
|
46
|
+
pal_ntsc_tempo_mismatch (one step a frame: the game runs 6/5 as fast on
|
|
47
|
+
NTSC), vic_bank_visibility_collision (bank 3 has no ROM font, so the text
|
|
48
|
+
glyphs are copied to RAM).
|
|
49
|
+
|
|
50
|
+
## Techniques
|
|
51
|
+
|
|
52
|
+
| Technique | Why | Recipe it starts from | Pitfalls read (`pitfalls-for`) |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| tile_map_render | 2x2 metatiles from the level text; one new column per coarse step | oscar64-tile-map-render | full_field_redraw_exceeds_vblank, colour_ram_index_past_last_cell_hits_cia1 |
|
|
55
|
+
| soft_scroll_h | XSCROLL for the pixel, a one-column shift for the character | oscar64-soft-scroll-h (its fine step only; issue #18) | xscroll_applies_to_all_rows, d016_unmasked_rmw_clobbers_csel_mcm |
|
|
56
|
+
| screen_double_buffer_d018 | three pages: the next is prepared off screen; the flip and XSCROLL land together in the blank | kickassembler-eight-way-scroll | full_field_redraw_exceeds_vblank, vic_bank_visibility_collision, d012_wrap_around |
|
|
57
|
+
| raster_split_modes | the HUD under the playfield gets its own $D016 and $D018 at line 212 | kickassembler-eight-way-scroll (its IRQ chain) | xscroll_applies_to_all_rows, raster_irq_first_line_jitter |
|
|
58
|
+
| slope_collision | ground snap on slopes, walls, one-way ledges | oscar64-slope-collision | signed_compare_bmi_overflow |
|
|
59
|
+
| fixed_point_8_8 | 8.8 Y, sub-pixel X speed | oscar64-fixed-point-jump-velocity | signed_compare_bmi_overflow |
|
|
60
|
+
| jump_arc_table | one velocity table for jump, fall and bounce | oscar64-fixed-point-jump-velocity | pal_ntsc_tempo_mismatch |
|
|
61
|
+
| actor_activation_window | enemies wake near the view and go back to the level table when they leave | oscar64-actor-activation-window | sprite_x_high_bit_wrong_register |
|
|
62
|
+
| object_pool | six live enemy slots, one sprite each | oscar64-object-pool | sprite_x_range_hidden_and_seam |
|
|
63
|
+
| per_frame_hitbox | each animation frame carries its box; a squashed enemy has none | oscar64-per-frame-hitbox | sprite_x_high_bit_wrong_register, sprite_x_range_hidden_and_seam |
|
|
64
|
+
| sprite_animation_table | run, jump, walk, hop and squash from tables | oscar64-sprite-animation-table | vic_bank_visibility_collision |
|
|
65
|
+
| sid_play_routine_pattern | an original two-voice tune, init and play in KickAssembler | oscar64-sid-music-player | pal_ntsc_tempo_mismatch, sid_write_only_registers |
|
|
66
|
+
| sfx_engine_beside_music | jump, coin, stomp and hurt effects on voice 3, which the tune leaves alone | oscar64-sid-music-player | sid_adsr_bug_8580, sid_write_only_registers |
|
|
67
|
+
| frame_sync_loop | one pass a frame, started by the IRQ at line 251 | oscar64-frame-sync-loop | d012_wrap_around, raster_line_count_difference, badline_cycle_loss |
|
|
68
|
+
| joystick_edge_detect | fire starts a jump on the press, not while held | oscar64-joystick-input | joystick2_scan_phantom_press, cia1_ddr_cleared_kills_keyboard |
|
|
69
|
+
| decimal_print | the score is six decimal digits, added digit by digit; no division | oscar64-print-number | petscii_written_to_screen_ram |
|
|
70
|
+
| raster_profile_bars | the harness meter, CIA2 timer A | oscar64-raster-profile-bars | badline_cycle_loss, vic_bus_takeover_on_dma |
|
|
71
|
+
|
|
72
|
+
## Compatibility
|
|
73
|
+
|
|
74
|
+
Command: `npx tsx src/cli.ts check-compatibility tile_map_render soft_scroll_h screen_double_buffer_d018 raster_split_modes slope_collision fixed_point_8_8 jump_arc_table actor_activation_window object_pool per_frame_hitbox sprite_animation_table sid_play_routine_pattern sfx_engine_beside_music frame_sync_loop joystick_edge_detect decimal_print raster_profile_bars`
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
# Compatibility: tile_map_render + soft_scroll_h + screen_double_buffer_d018 + raster_split_modes + slope_collision + fixed_point_8_8 + jump_arc_table + actor_activation_window + object_pool + per_frame_hitbox + sprite_animation_table + sid_play_routine_pattern + sfx_engine_beside_music + frame_sync_loop + joystick_edge_detect + decimal_print + raster_profile_bars
|
|
78
|
+
|
|
79
|
+
**Verdict:** WARNINGS
|
|
80
|
+
|
|
81
|
+
Checked with 3 implied prerequisite(s): screen_ram_relocation, sid_voice_setup, tile_grid_collision.
|
|
82
|
+
|
|
83
|
+
Unit claims are stated for 4 of 17 techniques; a unit conflict cannot be ruled out for: tile_map_render, soft_scroll_h, screen_double_buffer_d018, slope_collision, fixed_point_8_8, jump_arc_table, actor_activation_window, object_pool, per_frame_hitbox, sprite_animation_table, frame_sync_loop, decimal_print, raster_profile_bars, screen_ram_relocation (prerequisite), sid_voice_setup (prerequisite), tile_grid_collision (prerequisite). The zero-page bytes and interrupt vectors a recipe chooses are not checked yet (issue #22, step 8).
|
|
84
|
+
|
|
85
|
+
## shared_register (soft): soft_scroll_h × raster_split_modes
|
|
86
|
+
**Shared:** SCROLX
|
|
87
|
+
Both techniques touch register(s) SCROLX. 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.
|
|
88
|
+
|
|
89
|
+
## shared_register (soft): screen_double_buffer_d018 × raster_split_modes
|
|
90
|
+
**Shared:** VMCSB, SCROLY
|
|
91
|
+
Both techniques touch register(s) VMCSB, SCROLY. 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.
|
|
92
|
+
|
|
93
|
+
## shared_register (soft): screen_double_buffer_d018 × frame_sync_loop
|
|
94
|
+
**Shared:** SCROLY
|
|
95
|
+
Both techniques touch register(s) SCROLY. 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.
|
|
96
|
+
|
|
97
|
+
## shared_register (soft): raster_split_modes × frame_sync_loop
|
|
98
|
+
**Shared:** SCROLY
|
|
99
|
+
Both techniques touch register(s) SCROLY. 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.
|
|
100
|
+
|
|
101
|
+
## unit_shared (soft): sid_play_routine_pattern × sfx_engine_beside_music
|
|
102
|
+
**Shared:** sid_voice_2
|
|
103
|
+
sid_play_routine_pattern owns sid_voice_2; sfx_engine_beside_music writes it under sid_play_routine_pattern's protocol.
|
|
104
|
+
**Resolution:** sfx_engine_beside_music must follow sid_play_routine_pattern's protocol: write after sid_play_routine_pattern's write in the frame, or run inside sid_play_routine_pattern's interrupt chain.
|
|
105
|
+
|
|
106
|
+
## shared_register (soft): sid_play_routine_pattern × sfx_engine_beside_music
|
|
107
|
+
**Shared:** SIGVOL, SUREL3, ATDCY3, VCREG3, PWHI3, PWLO3, FREHI3, FRELO3, SUREL2, ATDCY2, VCREG2, PWHI2, PWLO2, FREHI2, FRELO2, SUREL1, ATDCY1, VCREG1, PWHI1, PWLO1, FREHI1, FRELO1
|
|
108
|
+
Both techniques touch register(s) SIGVOL, SUREL3, ATDCY3, VCREG3, PWHI3, PWLO3, FREHI3, FRELO3, SUREL2, ATDCY2, VCREG2, PWHI2, PWLO2, FREHI2, FRELO2, SUREL1, ATDCY1, VCREG1, PWHI1, PWLO1, FREHI1, FRELO1. 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.
|
|
109
|
+
|
|
110
|
+
## shared_register (soft): frame_sync_loop × raster_profile_bars
|
|
111
|
+
**Shared:** EXTCOL
|
|
112
|
+
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.
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
## Not covered
|
|
116
|
+
- **tile_map_render**: the graph has no registers, KERNAL routines or demands for it; the verdict says nothing about it.
|
|
117
|
+
- **slope_collision**: the graph has no registers, KERNAL routines or demands for it; the verdict says nothing about it.
|
|
118
|
+
- **fixed_point_8_8**: the graph has no registers, KERNAL routines or demands for it; the verdict says nothing about it.
|
|
119
|
+
- **jump_arc_table**: the graph has no registers, KERNAL routines or demands for it; the verdict says nothing about it.
|
|
120
|
+
- **actor_activation_window**: the graph has no registers, KERNAL routines or demands for it; the verdict says nothing about it.
|
|
121
|
+
- **object_pool**: the graph has no registers, KERNAL routines or demands for it; the verdict says nothing about it.
|
|
122
|
+
- **sprite_animation_table**: the graph has no registers, KERNAL routines or demands for it; the verdict says nothing about it.
|
|
123
|
+
- **decimal_print**: the graph has no registers, KERNAL routines or demands for it; the verdict says nothing about it.
|
|
124
|
+
- **tile_grid_collision** (prerequisite of slope_collision): the graph has no registers, KERNAL routines or demands for it.
|
|
125
|
+
|
|
126
|
+
## Shared Infrastructure (info)
|
|
127
|
+
- **screen_ram_relocation** (prerequisite, not in the set): required by screen_double_buffer_d018; included in the check as implied. Set it up first.
|
|
128
|
+
- **sid_voice_setup** (prerequisite, not in the set): required by sfx_engine_beside_music, sid_play_routine_pattern; included in the check as implied. Set it up first.
|
|
129
|
+
- **tile_grid_collision** (prerequisite, not in the set): required by slope_collision; included in the check as implied. Set it up first.
|
|
130
|
+
- **DC0D** (Register) shared via recipe(s): kickassembler-cracktro-template, kickassembler-eight-way-scroll
|
|
131
|
+
- **DC00** (Register) shared via recipe(s): kickassembler-cracktro-template, oscar64-platformer-scaffold, oscar64-flip-screen-rooms
|
|
132
|
+
- **BGCOL0** (Register) shared via recipe(s): kickassembler-cracktro-template, oscar64-platformer-scaffold, oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity, kickassembler-eight-way-scroll, oscar64-actor-activation-window
|
|
133
|
+
- **EXTCOL** (Register) shared via recipe(s): kickassembler-cracktro-template, oscar64-platformer-scaffold, oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity, kickassembler-eight-way-scroll, oscar64-actor-activation-window
|
|
134
|
+
- **IRQMSK** (Register) shared via recipe(s): kickassembler-cracktro-template, oscar64-platformer-scaffold, kickassembler-eight-way-scroll
|
|
135
|
+
- **VICIRQ** (Register) shared via recipe(s): kickassembler-cracktro-template, oscar64-platformer-scaffold, kickassembler-eight-way-scroll
|
|
136
|
+
- **VMCSB** (Register) shared via recipe(s): kickassembler-cracktro-template, kickassembler-eight-way-scroll
|
|
137
|
+
- **SCROLX** (Register) shared via recipe(s): kickassembler-cracktro-template, kickassembler-eight-way-scroll
|
|
138
|
+
- **RASTER** (Register) shared via recipe(s): kickassembler-cracktro-template, oscar64-platformer-scaffold, oscar64-flip-screen-rooms, kickassembler-eight-way-scroll
|
|
139
|
+
- **SCROLY** (Register) shared via recipe(s): kickassembler-cracktro-template, oscar64-platformer-scaffold, oscar64-flip-screen-rooms, kickassembler-eight-way-scroll, oscar64-actor-activation-window
|
|
140
|
+
- **SIGVOL** (Register) shared via recipe(s): kickassembler-cracktro-template, oscar64-platformer-scaffold
|
|
141
|
+
- **CLRCHN** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
142
|
+
- **CHKOUT** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
143
|
+
- **CHKIN** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
144
|
+
- **CLOSE** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
145
|
+
- **OPEN** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
146
|
+
- **SETNAM** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
147
|
+
- **SETLFS** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
148
|
+
- **DC0F** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-flip-screen-rooms, kickassembler-eight-way-scroll
|
|
149
|
+
- **DC07** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-flip-screen-rooms, kickassembler-eight-way-scroll
|
|
150
|
+
- **DC06** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-flip-screen-rooms, kickassembler-eight-way-scroll
|
|
151
|
+
- **DC03** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
152
|
+
- **DC02** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
153
|
+
- **SP6COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
154
|
+
- **SP5COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
155
|
+
- **SP4COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
156
|
+
- **SP3COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
157
|
+
- **SP2COL** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
158
|
+
- **SP1COL** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-fixed-point-jump-velocity
|
|
159
|
+
- **SP0COL** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity, oscar64-actor-activation-window
|
|
160
|
+
- **SPENA** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity, oscar64-actor-activation-window
|
|
161
|
+
- **MSIGX** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity, oscar64-actor-activation-window
|
|
162
|
+
- **M0Y** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity, oscar64-actor-activation-window
|
|
163
|
+
- **M0X** (Register) shared via recipe(s): oscar64-platformer-scaffold, oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity, oscar64-actor-activation-window
|
|
164
|
+
- **RANDOM** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
165
|
+
- **SUREL3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
166
|
+
- **ATDCY3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
167
|
+
- **VCREG3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
168
|
+
- **PWHI3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
169
|
+
- **PWLO3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
170
|
+
- **FREHI3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
171
|
+
- **FRELO3** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
172
|
+
- **SUREL2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
173
|
+
- **ATDCY2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
174
|
+
- **VCREG2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
175
|
+
- **PWHI2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
176
|
+
- **PWLO2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
177
|
+
- **FREHI2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
178
|
+
- **FRELO2** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
179
|
+
- **SUREL1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
180
|
+
- **ATDCY1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
181
|
+
- **VCREG1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
182
|
+
- **PWHI1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
183
|
+
- **PWLO1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
184
|
+
- **FREHI1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
185
|
+
- **FRELO1** (Register) shared via recipe(s): oscar64-platformer-scaffold
|
|
186
|
+
- **READST** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
187
|
+
- **CHRIN** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
188
|
+
- **CHROUT** (KernalRoutine) shared via recipe(s): oscar64-platformer-scaffold
|
|
189
|
+
- **DC0E** (Register) shared via recipe(s): oscar64-flip-screen-rooms, oscar64-actor-activation-window
|
|
190
|
+
- **DC05** (Register) shared via recipe(s): oscar64-flip-screen-rooms, oscar64-actor-activation-window
|
|
191
|
+
- **DC04** (Register) shared via recipe(s): oscar64-flip-screen-rooms, oscar64-actor-activation-window
|
|
192
|
+
- **XXPAND** (Register) shared via recipe(s): oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity
|
|
193
|
+
- **SPMC** (Register) shared via recipe(s): oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity
|
|
194
|
+
- **YXPAND** (Register) shared via recipe(s): oscar64-flip-screen-rooms, oscar64-fixed-point-jump, oscar64-fixed-point-jump-velocity
|
|
195
|
+
- **M1Y** (Register) shared via recipe(s): oscar64-fixed-point-jump-velocity
|
|
196
|
+
- **M1X** (Register) shared via recipe(s): oscar64-fixed-point-jump-velocity
|
|
197
|
+
- **DD0D** (Register) shared via recipe(s): kickassembler-eight-way-scroll
|
|
198
|
+
- **raster_discipline**: Multiple raster-discipline techniques present. Verify IRQ stack ordering and timing budget.
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
What the warnings mean for this program:
|
|
202
|
+
|
|
203
|
+
- SCROLX shared by soft_scroll_h and raster_split_modes: one IRQ writes the
|
|
204
|
+
playfield's $D016 at line 251, the other the HUD's at line 212. Each owns
|
|
205
|
+
its region.
|
|
206
|
+
- VMCSB and SCROLY shared by screen_double_buffer_d018, raster_split_modes
|
|
207
|
+
and frame_sync_loop: $D018 is written at line 251 (the flip) and at 212
|
|
208
|
+
(the HUD page), both by the IRQs; $D011 once at start.
|
|
209
|
+
- sid_voice_2 shared by the tune and the effects: the tune plays voices 1
|
|
210
|
+
and 2 only; the effects own voice 3. No voice is shared.
|
|
211
|
+
- The SID register list: the same split, voice 3 to the effects.
|
|
212
|
+
- EXTCOL shared by frame_sync_loop and raster_profile_bars: only the start
|
|
213
|
+
and the verdict write $D020.
|
|
214
|
+
|
|
215
|
+
## Budget
|
|
216
|
+
|
|
217
|
+
Command: `npx tsx src/cli.ts plan-budget tile_map_render soft_scroll_h screen_double_buffer_d018 raster_split_modes slope_collision fixed_point_8_8 jump_arc_table actor_activation_window object_pool per_frame_hitbox sprite_animation_table sid_play_routine_pattern sfx_engine_beside_music frame_sync_loop joystick_edge_detect decimal_print raster_profile_bars --region both --sprites 7 --sprite-lines 21`
|
|
218
|
+
|
|
219
|
+
```text
|
|
220
|
+
# Budget plan: undetermined
|
|
221
|
+
|
|
222
|
+
Techniques: tile_map_render, soft_scroll_h, screen_double_buffer_d018, raster_split_modes, slope_collision, fixed_point_8_8, jump_arc_table, actor_activation_window, object_pool, per_frame_hitbox, sprite_animation_table, sid_play_routine_pattern, sfx_engine_beside_music, frame_sync_loop, joystick_edge_detect, decimal_print, raster_profile_bars
|
|
223
|
+
|
|
224
|
+
## play (PAL, 19656 cycles a frame): undetermined
|
|
225
|
+
|
|
226
|
+
Range 10167-10765 + 1432 fixed cycles; floor 1432; weakest basis arithmetic; IRQ slots 2.
|
|
227
|
+
|
|
228
|
+
Summed:
|
|
229
|
+
- tile_map_render: 268 (arithmetic, on oscar64-tile-map-render (one column edge, 11 metatiles))
|
|
230
|
+
- slope_collision: 455 (measured-vice, on oscar64-slope-collision (worst frame, one actor, in the vertical blank))
|
|
231
|
+
- actor_activation_window: 2809 (measured-vice, on oscar64-actor-activation-window (worst tick, screen blanked))
|
|
232
|
+
- object_pool: 380 (measured-vice, on oscar64-object-pool (eight live slots, screen blanked))
|
|
233
|
+
- per_frame_hitbox: 3693 (measured-vice, on oscar64-per-frame-hitbox (eight boxes, 28 pairs))
|
|
234
|
+
- sprite_animation_table: 357-747 (measured-vice, on oscar64-sprite-animation-table (six actors, the scenario's worst frame))
|
|
235
|
+
- sid_play_routine_pattern: 327 (measured-vice, on oscar64-sfx-engine (the recipe's stub tune; a real player costs several times more))
|
|
236
|
+
- sfx_engine_beside_music: 50-258 (measured-vice, on oscar64-sfx-engine (a frame the engine owns the voice))
|
|
237
|
+
- decimal_print: 1361 (measured-vice, on oscar64-print-number (one call, worst decimal case))
|
|
238
|
+
- raster_profile_bars: 467 (measured-vice, on oscar64-raster-profile-bars (worst frame, screen blanked))
|
|
239
|
+
|
|
240
|
+
Left out:
|
|
241
|
+
- soft_scroll_h: 74041 cycles, above one frame: a multi-frame operation, not summed (measured on oscar64-soft-scroll-h)
|
|
242
|
+
|
|
243
|
+
To measure:
|
|
244
|
+
- screen_double_buffer_d018: no **Cost:** line; measure it on kickassembler-eight-way-scroll
|
|
245
|
+
- raster_split_modes: no **Cost:** line; no recipe yet
|
|
246
|
+
- fixed_point_8_8: no **Cost:** line; measure it on oscar64-fixed-point-jump
|
|
247
|
+
- jump_arc_table: no **Cost:** line; measure it on oscar64-fixed-point-jump
|
|
248
|
+
- 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
|
|
249
|
+
- joystick_edge_detect: no **Cost:** line; measure it on oscar64-attract-replay
|
|
250
|
+
|
|
251
|
+
Notes:
|
|
252
|
+
- Fixed losses 1432 cycles (badlines 25 × 43 = 1075, lines 51-243 every eighth with YSCROLL 3, sprite DMA 357; arithmetic) charged because tile_map_render, slope_collision, actor_activation_window, object_pool, per_frame_hitbox, sprite_animation_table, sid_play_routine_pattern, sfx_engine_beside_music, decimal_print, raster_profile_bars are 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.
|
|
253
|
+
- Unknown is not zero: screen_double_buffer_d018, raster_split_modes, fixed_point_8_8, jump_arc_table, frame_sync_loop, joystick_edge_detect have no cycles figure, so the verdict cannot be fits.
|
|
254
|
+
- Multi-frame: soft_scroll_h (74041) is above one PAL frame of 19656 and not summed; spread the work over frames or budget it as its own phase.
|
|
255
|
+
|
|
256
|
+
## play (NTSC, 17095 cycles a frame): undetermined
|
|
257
|
+
|
|
258
|
+
Range 10167-10765 + 1432 fixed cycles; floor 1432; weakest basis arithmetic; IRQ slots 2.
|
|
259
|
+
|
|
260
|
+
Summed:
|
|
261
|
+
- tile_map_render: 268 (arithmetic, on oscar64-tile-map-render (one column edge, 11 metatiles))
|
|
262
|
+
- slope_collision: 455 (measured-vice, on oscar64-slope-collision (worst frame, one actor, in the vertical blank))
|
|
263
|
+
- actor_activation_window: 2809 (measured-vice, on oscar64-actor-activation-window (worst tick, screen blanked))
|
|
264
|
+
- object_pool: 380 (measured-vice, on oscar64-object-pool (eight live slots, screen blanked))
|
|
265
|
+
- per_frame_hitbox: 3693 (measured-vice, on oscar64-per-frame-hitbox (eight boxes, 28 pairs))
|
|
266
|
+
- sprite_animation_table: 357-747 (measured-vice, on oscar64-sprite-animation-table (six actors, the scenario's worst frame))
|
|
267
|
+
- sid_play_routine_pattern: 327 (measured-vice, on oscar64-sfx-engine (the recipe's stub tune; a real player costs several times more))
|
|
268
|
+
- sfx_engine_beside_music: 50-258 (measured-vice, on oscar64-sfx-engine (a frame the engine owns the voice))
|
|
269
|
+
- decimal_print: 1361 (measured-vice, on oscar64-print-number (one call, worst decimal case))
|
|
270
|
+
- raster_profile_bars: 467 (measured-vice, on oscar64-raster-profile-bars (worst frame, screen blanked))
|
|
271
|
+
|
|
272
|
+
Left out:
|
|
273
|
+
- soft_scroll_h: 74041 cycles, above one frame: a multi-frame operation, not summed (measured on oscar64-soft-scroll-h)
|
|
274
|
+
|
|
275
|
+
To measure:
|
|
276
|
+
- screen_double_buffer_d018: no **Cost:** line; measure it on kickassembler-eight-way-scroll
|
|
277
|
+
- raster_split_modes: no **Cost:** line; no recipe yet
|
|
278
|
+
- fixed_point_8_8: no **Cost:** line; measure it on oscar64-fixed-point-jump
|
|
279
|
+
- jump_arc_table: no **Cost:** line; measure it on oscar64-fixed-point-jump
|
|
280
|
+
- 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
|
|
281
|
+
- joystick_edge_detect: no **Cost:** line; measure it on oscar64-attract-replay
|
|
282
|
+
|
|
283
|
+
Notes:
|
|
284
|
+
- Fixed losses 1432 cycles (badlines 25 × 43 = 1075, lines 51-243 every eighth with YSCROLL 3, sprite DMA 357; arithmetic) charged because tile_map_render, slope_collision, actor_activation_window, object_pool, per_frame_hitbox, sprite_animation_table, sid_play_routine_pattern, sfx_engine_beside_music, decimal_print, raster_profile_bars are 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.
|
|
285
|
+
- Unknown is not zero: screen_double_buffer_d018, raster_split_modes, fixed_point_8_8, jump_arc_table, frame_sync_loop, joystick_edge_detect have no cycles figure, so the verdict cannot be fits.
|
|
286
|
+
- Multi-frame: soft_scroll_h (74041) is above one NTSC frame of 17095 and not summed; spread the work over frames or budget it as its own phase.
|
|
287
|
+
- 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.
|
|
288
|
+
|
|
289
|
+
## Bytes
|
|
290
|
+
|
|
291
|
+
No member states a byte figure that can be summed.
|
|
292
|
+
- frame_sync_loop: 985 bytes left out, the whole program, not the technique
|
|
293
|
+
|
|
294
|
+
## Assumptions
|
|
295
|
+
|
|
296
|
+
- Region PAL and NTSC: PAL 19656, NTSC 17095 cycles a frame.
|
|
297
|
+
- 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.
|
|
298
|
+
- 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.
|
|
299
|
+
- Each figure is the technique's own Cost line, measured on the recipe it names: another implementation can cost more or less.
|
|
300
|
+
- Claims, zero page and memory are not judged here; c64_check_compatibility judges claims and zero page.
|
|
301
|
+
- Sprites: 7 a line on 21 lines, (3 + 2 × 7) × 21 = 357 cycles of DMA a frame (3 + 2n measured in VICE x64sc for sprites numbered without gaps).
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
The frame meter measures the real figure once the loop runs: worst, and
|
|
305
|
+
typical as the median of the autopilot's play frames. The figures and the
|
|
306
|
+
comparison with this budget are in README.md, "The measured frame".
|
|
307
|
+
|
|
308
|
+
Unknown in the budget: the coarse shift. plan-budget leaves soft_scroll_h
|
|
309
|
+
out at 74,041 cycles, the old recipe's in-place C shift (issue #18). The
|
|
310
|
+
first plan here was a KickAssembler copy of all 20 rows into the hidden
|
|
311
|
+
page at a crossing, near 7,500 cycles by arithmetic; the meter measured
|
|
312
|
+
9,457 for that frame's camera work (`PROF=3`) and 18,112 for the whole
|
|
313
|
+
worst frame, too close to NTSC's 17,095. So the scroll became three pages
|
|
314
|
+
with the next one prepared five rows a frame (README.md, "How a frame
|
|
315
|
+
runs"). The six techniques with no figure are settled the same way: the
|
|
316
|
+
meter brackets the whole frame.
|
|
317
|
+
|
|
318
|
+
## Memory and screen
|
|
319
|
+
|
|
320
|
+
VIC bank 3 ($DD00 bits 0-1 = 0). $C000, $C400 and $E800: the three
|
|
321
|
+
playfield pages; $C800: the HUD page; $CC00-$CFFF: sixteen sprite blocks
|
|
322
|
+
(48-63); $E000-$E7FF: the character set (ROM glyphs 0-63 copied, so text
|
|
323
|
+
and the meter decode; tiles from 64). BASIC and KERNAL are banked out ($01
|
|
324
|
+
= $35), so $FFFE and $FFFA point at the IRQs and an RTI. Code from $1000;
|
|
325
|
+
the KickAssembler blob (scroll slice copy, the two IRQs, tune player) at
|
|
326
|
+
$0900. Colour RAM is never scrolled: playfield rows hold $0D (multicolour,
|
|
327
|
+
green), so the four playfield colours are $D021, $D022, $D023 and green.
|
|
328
|
+
In AUTOPILOT builds the meter owns HUD row 24, columns 20 to 39; CIA2
|
|
329
|
+
timer A belongs to the meter.
|
|
330
|
+
|
|
331
|
+
## Autopilot and checks
|
|
332
|
+
|
|
333
|
+
A timeline of joystick bytes from frame 1: fire on the title, then run right
|
|
334
|
+
over slopes, a jump over a gap, coins, a stomp, a hit from an enemy, the
|
|
335
|
+
respawn, more running. After the script the program grades itself: score
|
|
336
|
+
against coins and stomps counted, lives, events seen, every playfield cell
|
|
337
|
+
of the page on display against the level at the camera, and the activation
|
|
338
|
+
window's invariants. $02FF and the border report it. expect.json checks the
|
|
339
|
+
border, the HUD text, the player sprite where the model leaves it, the
|
|
340
|
+
scrolled playfield's cells, and the meter. A separate check
|
|
341
|
+
(`make tearcheck`) shoots the run at many cycle counts and matches each
|
|
342
|
+
playfield against a model render of the level.
|
|
343
|
+
|
|
344
|
+
## Decisions and open questions
|
|
345
|
+
|
|
346
|
+
- Two raster IRQs own $D016 and $D018: line 212 for the HUD, line 251 for
|
|
347
|
+
the playfield pair C publishes. The first build set the playfield pair
|
|
348
|
+
from the main loop at a polled line 251; `make tearcheck` then caught
|
|
349
|
+
blank pictures, because a frame whose work ran past 251 left the HUD
|
|
350
|
+
page and hires mode on for the whole next frame. With the IRQ at 251 the
|
|
351
|
+
main loop waits for its tick instead: polling $D012 for 251 missed the
|
|
352
|
+
line the IRQ spends, on PAL every frame (measured: the run never left
|
|
353
|
+
camera 0).
|
|
354
|
+
- Three pages, the next prepared in slices: see Budget.
|
|
355
|
+
- NTSC runs the same per-frame steps at 60 Hz: the game is 6/5 as fast and
|
|
356
|
+
the tune 6/5 as quick. Not corrected.
|
|
357
|
+
- No disk persistence: the high score lives until power-off.
|
|
358
|
+
- Oscar64: the local build. Upstream 9a902f6 miscompiles surface_walk
|
|
359
|
+
(README.md, "Which Oscar64"). One loop clearing four pages miscompiles on
|
|
360
|
+
both (issue #30 fault 7); view_init uses one memset per page.
|