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,563 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: tile-grid-collision
|
|
3
|
+
toolchain: oscar64
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [tile_grid_collision]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D010, D011, D015, D020, D021, D027, DC06, DC07, DC0F]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# Oscar64 Tile Grid Collision: a scripted sprite against a decoded map
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
One sprite walks a 40 x 23 tile map under a script instead of a joystick,
|
|
19
|
+
and every frame its body is tested against the map: a wall stops the walk,
|
|
20
|
+
a fall ends on a tile top, a jump ends on a ceiling, a ladder switches
|
|
21
|
+
gravity off, and a pit is no solid tile under the feet. The map is text in
|
|
22
|
+
the source, decoded once into a one-byte-per-tile array and onto the
|
|
23
|
+
screen. Row 0 is a HUD (the feet's tile row and column, a state word, the
|
|
24
|
+
frame number and an event mask); row 1 shows the CIA1 timer B cost of the
|
|
25
|
+
update, worst and best frame. A check after every frame asserts that no
|
|
26
|
+
probe point on the body is inside a solid tile, and the script carries the
|
|
27
|
+
tile row and x position the sprite must have at the end of each phase.
|
|
28
|
+
`$02FF` = `01` and a green border when the script completed with all five
|
|
29
|
+
events seen and no failed check; `02` and red otherwise. This is the
|
|
30
|
+
`tile_grid_collision` technique from `docs/techniques/logic.md`; the
|
|
31
|
+
result-byte contract is `headless-verify.md`.
|
|
32
|
+
|
|
33
|
+
## Source
|
|
34
|
+
|
|
35
|
+
```c
|
|
36
|
+
// tile-grid-collision.c
|
|
37
|
+
//
|
|
38
|
+
// Tile-grid collision for a platformer. One sprite is driven by a
|
|
39
|
+
// scripted walk over a 40 x 23 tile map decoded once from text. Every
|
|
40
|
+
// frame the body's edges are tested against the map: a wall stops the
|
|
41
|
+
// walk, a landing snaps to the tile top, a ceiling stops a jump, a
|
|
42
|
+
// ladder disables gravity, a pit is no solid tile under the feet.
|
|
43
|
+
// Row 0 is a HUD (feet tile row and column, state, frame, events).
|
|
44
|
+
// Row 1 shows the CIA1 timer B cost of the update, worst and best frame.
|
|
45
|
+
// $02FF = 01 and a green border when the script completed with every
|
|
46
|
+
// event seen and no assert failure; 02 and red otherwise.
|
|
47
|
+
//
|
|
48
|
+
#include <c64/vic.h>
|
|
49
|
+
#include <c64/cia.h>
|
|
50
|
+
#include <c64/sprites.h>
|
|
51
|
+
|
|
52
|
+
#define Screen ((char *)0x0400)
|
|
53
|
+
#define Color ((char *)0xd800)
|
|
54
|
+
#define SprData ((char *)0x0340) // sprite block 13, cassette buffer
|
|
55
|
+
#define RESULT (*(volatile char *)0x02ff)
|
|
56
|
+
|
|
57
|
+
#define CODE_PASS 0x01
|
|
58
|
+
#define CODE_FAIL 0x02
|
|
59
|
+
|
|
60
|
+
#define MAP_W 40
|
|
61
|
+
#define MAP_H 23
|
|
62
|
+
#define MAP_ROW 2 // first screen row of the map
|
|
63
|
+
|
|
64
|
+
// Tile classes. The map below is text, one character per 8 x 8 tile.
|
|
65
|
+
#define T_EMPTY 0 // '.'
|
|
66
|
+
#define T_BRICK 1 // '#'
|
|
67
|
+
#define T_PLAT 2 // '='
|
|
68
|
+
#define T_LADDER 3 // 'H'
|
|
69
|
+
|
|
70
|
+
// Body inside the 24 x 21 sprite: columns 8..15, rows 0..20 (the image
|
|
71
|
+
// is a filled bar over exactly these pixels). Side probes go every 8 px.
|
|
72
|
+
#define BODY_L 8
|
|
73
|
+
#define BODY_R 15
|
|
74
|
+
#define BODY_T 0
|
|
75
|
+
#define BODY_B 20
|
|
76
|
+
#define BODY_CX 12 // ladder test column
|
|
77
|
+
|
|
78
|
+
// Physics, 8.8 fixed point, positive is down.
|
|
79
|
+
#define GRAVITY 0x0028
|
|
80
|
+
#define MAX_FALL 0x0400 // 4 px a frame, under one tile
|
|
81
|
+
#define JUMP_V (-0x0300) // 3 px a frame upwards
|
|
82
|
+
|
|
83
|
+
// Joystick bits, active low on the port.
|
|
84
|
+
#define JOY_UP 0x01
|
|
85
|
+
#define JOY_DOWN 0x02
|
|
86
|
+
#define JOY_LEFT 0x04
|
|
87
|
+
#define JOY_RIGHT 0x08
|
|
88
|
+
#define JOY_FIRE 0x10
|
|
89
|
+
#define JOY_MASK 0x1f
|
|
90
|
+
|
|
91
|
+
// Events the script must produce before it may pass.
|
|
92
|
+
#define EV_LAND 0x01
|
|
93
|
+
#define EV_WALL 0x02
|
|
94
|
+
#define EV_BUMP 0x04
|
|
95
|
+
#define EV_LADDER 0x08
|
|
96
|
+
#define EV_PIT 0x10
|
|
97
|
+
#define EV_ALL 0x1f
|
|
98
|
+
|
|
99
|
+
// --- map ---------------------------------------------------------------
|
|
100
|
+
// Screen rows 2..24. Column 0 and 39 are wall. A platform on screen row
|
|
101
|
+
// 17 with a ladder through it at column 6 down to the floor; a one-tile
|
|
102
|
+
// overhang at column 11 row 19; a pillar at columns 12..17 rows 20..22;
|
|
103
|
+
// a two-row floor with a pit at columns 1..2.
|
|
104
|
+
const char map_text[MAP_H][MAP_W + 1] = {
|
|
105
|
+
"#......................................#", // screen row 2
|
|
106
|
+
"#......................................#",
|
|
107
|
+
"#......................................#",
|
|
108
|
+
"#......................................#",
|
|
109
|
+
"#......................................#",
|
|
110
|
+
"#......................................#",
|
|
111
|
+
"#......................................#",
|
|
112
|
+
"#......................................#",
|
|
113
|
+
"#......................................#", // 10
|
|
114
|
+
"#......................................#",
|
|
115
|
+
"#......................................#",
|
|
116
|
+
"#......................................#",
|
|
117
|
+
"#......................................#",
|
|
118
|
+
"#......................................#",
|
|
119
|
+
"#......................................#", // 16
|
|
120
|
+
"#..===H===..............................#", // 17 platform
|
|
121
|
+
"#.....H................................#",
|
|
122
|
+
"#.....H....#...........................#", // 19 overhang
|
|
123
|
+
"#.....H.....######.....................#", // 20 pillar
|
|
124
|
+
"#.....H.....######.....................#",
|
|
125
|
+
"#.....H.....######.....................#", // 22
|
|
126
|
+
"#..#####################################", // 23 floor, pit at 1..2
|
|
127
|
+
"#..#####################################", // 24
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
char map[MAP_H * MAP_W]; // decoded, one byte per tile
|
|
131
|
+
|
|
132
|
+
const char tile_code[4] = { 0x20, 0xa0, 0xa0, 0x08 }; // space, block, block, H
|
|
133
|
+
const char tile_col[4] = { 0, 12, 5, 7 }; // -, grey, green, yellow
|
|
134
|
+
|
|
135
|
+
// --- scripted walk -----------------------------------------------------
|
|
136
|
+
// One entry per phase: frames to hold the port byte, then what must be
|
|
137
|
+
// true at the end of the phase. exp_row is the feet's screen row, 0xff
|
|
138
|
+
// for any; exp_px is the world x of the sprite's left edge, -1 for any.
|
|
139
|
+
struct Step { char frames; char port; char exp_row; int exp_px; };
|
|
140
|
+
|
|
141
|
+
const struct Step script[] = {
|
|
142
|
+
{ 10, 0xff, 22, 32 }, // stand on the floor
|
|
143
|
+
{ 60, 0xff ^ JOY_RIGHT, 22, 80 }, // walk right, stopped by the pillar
|
|
144
|
+
{ 1, 0xff ^ JOY_FIRE, 0xff, 80 }, // one-frame fire pulse: jump
|
|
145
|
+
{ 39, 0xff, 22, 80 }, // head hits the overhang, fall back
|
|
146
|
+
{ 40, 0xff ^ JOY_LEFT, 22, 40 }, // walk left to the ladder
|
|
147
|
+
{ 70, 0xff ^ JOY_UP, 16, 40 }, // climb to the platform top
|
|
148
|
+
{ 40, 0xff ^ JOY_RIGHT, 0xff, 80 }, // walk off the platform end
|
|
149
|
+
{ 30, 0xff, 18, 80 }, // land on the overhang
|
|
150
|
+
{ 130, 0xff ^ JOY_LEFT, 24, 0 }, // off the overhang, into the pit
|
|
151
|
+
{ 20, 0xff, 24, 0 }, // stand in the pit
|
|
152
|
+
};
|
|
153
|
+
#define STEPS (sizeof(script) / sizeof(script[0]))
|
|
154
|
+
|
|
155
|
+
// --- player state ------------------------------------------------------
|
|
156
|
+
int px; // world x of sprite left edge
|
|
157
|
+
unsigned py_fp; // 8.8 world y of sprite top
|
|
158
|
+
int vy; // 8.8
|
|
159
|
+
bool on_ground, on_ladder;
|
|
160
|
+
char state; // index into state_name
|
|
161
|
+
char events;
|
|
162
|
+
char fault; // first failed assert, 0 = none
|
|
163
|
+
|
|
164
|
+
const char *state_name[6] = {
|
|
165
|
+
s"stand", s"walk ", s"jump ", s"fall ", s"climb", s"wall "
|
|
166
|
+
};
|
|
167
|
+
|
|
168
|
+
// --- tile lookup -------------------------------------------------------
|
|
169
|
+
// World pixel to tile: column = x >> 3, screen row = y >> 3, and the map
|
|
170
|
+
// starts at screen row MAP_ROW. Outside the map is empty above and solid
|
|
171
|
+
// below and to the sides.
|
|
172
|
+
char tile_at(int wx, int wy)
|
|
173
|
+
{
|
|
174
|
+
if (wx < 0 || wx >= 320) return T_BRICK;
|
|
175
|
+
int ty = (wy >> 3) - MAP_ROW;
|
|
176
|
+
if (ty < 0) return T_EMPTY;
|
|
177
|
+
if (ty >= MAP_H) return T_BRICK;
|
|
178
|
+
return map[ty * MAP_W + (wx >> 3)];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
bool solid_at(int wx, int wy)
|
|
182
|
+
{
|
|
183
|
+
char t = tile_at(wx, wy);
|
|
184
|
+
return t == T_BRICK || t == T_PLAT;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// The tile under a foot holds the player if it is solid, or if it is the
|
|
188
|
+
// top rung of a ladder (a ladder tile with no ladder above it).
|
|
189
|
+
bool stands_on(int wx, int wy)
|
|
190
|
+
{
|
|
191
|
+
char t = tile_at(wx, wy);
|
|
192
|
+
if (t == T_BRICK || t == T_PLAT) return true;
|
|
193
|
+
return t == T_LADDER && tile_at(wx, wy - 8) != T_LADDER;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
void check(bool ok, char n)
|
|
197
|
+
{
|
|
198
|
+
if (!ok && fault == 0) fault = n;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// --- one frame of movement and collision --------------------------------
|
|
202
|
+
// cur is the port byte (active low), newp the lines that went low this
|
|
203
|
+
// frame. Order: horizontal, ladder, vertical, events.
|
|
204
|
+
void player_update(char cur, char newp)
|
|
205
|
+
{
|
|
206
|
+
int py = (int)(py_fp >> 8);
|
|
207
|
+
bool moving = false, blocked = false;
|
|
208
|
+
bool was_ground = on_ground;
|
|
209
|
+
|
|
210
|
+
// 1. Horizontal. Probe the leading edge every 8 px from head to
|
|
211
|
+
// feet: a 21 px edge crosses up to four tile rows, and probes
|
|
212
|
+
// further apart than a tile let a one-tile ledge slip between.
|
|
213
|
+
if (!(cur & JOY_LEFT) || !(cur & JOY_RIGHT)) {
|
|
214
|
+
int nx = (cur & JOY_LEFT) ? px + 1 : px - 1;
|
|
215
|
+
int edge = (nx > px) ? nx + BODY_R : nx + BODY_L;
|
|
216
|
+
if (solid_at(edge, py + BODY_T) || solid_at(edge, py + BODY_T + 8) ||
|
|
217
|
+
solid_at(edge, py + BODY_T + 16) || solid_at(edge, py + BODY_B))
|
|
218
|
+
blocked = true;
|
|
219
|
+
else {
|
|
220
|
+
px = nx;
|
|
221
|
+
moving = true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// 2. Ladder: the centre column at the feet, or the tile just below.
|
|
226
|
+
int cx = px + BODY_CX;
|
|
227
|
+
on_ladder = tile_at(cx, py + BODY_B) == T_LADDER ||
|
|
228
|
+
tile_at(cx, py + BODY_B + 1) == T_LADDER;
|
|
229
|
+
bool climbing = false;
|
|
230
|
+
if (on_ladder && (!(cur & JOY_UP) || !(cur & JOY_DOWN))) {
|
|
231
|
+
vy = 0;
|
|
232
|
+
if (!(cur & JOY_UP)) {
|
|
233
|
+
// Climb while the feet are on a ladder tile; the last pixel
|
|
234
|
+
// leaves the feet one row above the top rung, standing on it.
|
|
235
|
+
if (tile_at(cx, py + BODY_B) == T_LADDER) {
|
|
236
|
+
py--;
|
|
237
|
+
climbing = true;
|
|
238
|
+
}
|
|
239
|
+
} else if (!solid_at(cx, py + BODY_B + 1)) {
|
|
240
|
+
py++;
|
|
241
|
+
climbing = true;
|
|
242
|
+
}
|
|
243
|
+
py_fp = (unsigned)py << 8;
|
|
244
|
+
on_ground = true;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// 3. Vertical. Ground is a standable tile under either foot corner;
|
|
248
|
+
// none under both is a pit or a platform end, and gravity applies.
|
|
249
|
+
if (!climbing) {
|
|
250
|
+
on_ground = stands_on(px + BODY_L, py + BODY_B + 1) ||
|
|
251
|
+
stands_on(px + BODY_R, py + BODY_B + 1);
|
|
252
|
+
if (on_ground && (newp & JOY_FIRE))
|
|
253
|
+
vy = JUMP_V;
|
|
254
|
+
else if (on_ground)
|
|
255
|
+
vy = 0;
|
|
256
|
+
else {
|
|
257
|
+
vy += GRAVITY;
|
|
258
|
+
if (vy > MAX_FALL) vy = MAX_FALL;
|
|
259
|
+
}
|
|
260
|
+
if (vy) {
|
|
261
|
+
py_fp += (unsigned)vy;
|
|
262
|
+
int ny = (int)(py_fp >> 8);
|
|
263
|
+
if (vy > 0) {
|
|
264
|
+
// Landing: the feet crossed into a standable tile, so
|
|
265
|
+
// put them on the pixel row above its top.
|
|
266
|
+
if (stands_on(px + BODY_L, ny + BODY_B) ||
|
|
267
|
+
stands_on(px + BODY_R, ny + BODY_B)) {
|
|
268
|
+
ny = ((ny + BODY_B) & ~7) - BODY_B - 1;
|
|
269
|
+
py_fp = (unsigned)ny << 8;
|
|
270
|
+
vy = 0;
|
|
271
|
+
on_ground = true;
|
|
272
|
+
}
|
|
273
|
+
} else {
|
|
274
|
+
// Ceiling: the head crossed into a solid tile, so put it
|
|
275
|
+
// on the pixel row below its bottom and fall from there.
|
|
276
|
+
if (solid_at(px + BODY_L, ny + BODY_T) ||
|
|
277
|
+
solid_at(px + BODY_R, ny + BODY_T)) {
|
|
278
|
+
ny = ((ny + BODY_T) | 7) + 1 - BODY_T;
|
|
279
|
+
py_fp = (unsigned)ny << 8;
|
|
280
|
+
vy = 0;
|
|
281
|
+
events |= EV_BUMP;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
py = ny;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// 4. Events and state word. A landing is the ground test turning
|
|
289
|
+
// true, not the snap: a fall can end exactly on the tile top.
|
|
290
|
+
if (blocked) events |= EV_WALL;
|
|
291
|
+
if (climbing) events |= EV_LADDER;
|
|
292
|
+
if (on_ground && !was_ground && !climbing) events |= EV_LAND;
|
|
293
|
+
if (on_ground && py + BODY_B == 199) events |= EV_PIT;
|
|
294
|
+
if (climbing) state = 4;
|
|
295
|
+
else if (!on_ground) state = (vy < 0) ? 2 : 3;
|
|
296
|
+
else if (blocked) state = 5;
|
|
297
|
+
else state = moving ? 1 : 0;
|
|
298
|
+
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Assert, outside the timed region: no probe point on the body's outline
|
|
302
|
+
// is inside a solid tile after the update.
|
|
303
|
+
void player_assert(void)
|
|
304
|
+
{
|
|
305
|
+
int py = (int)(py_fp >> 8);
|
|
306
|
+
check(!solid_at(px + BODY_L, py + BODY_T) && !solid_at(px + BODY_R, py + BODY_T), 1);
|
|
307
|
+
check(!solid_at(px + BODY_L, py + BODY_T + 8) && !solid_at(px + BODY_R, py + BODY_T + 8), 2);
|
|
308
|
+
check(!solid_at(px + BODY_L, py + BODY_T + 16) && !solid_at(px + BODY_R, py + BODY_T + 16), 2);
|
|
309
|
+
check(!solid_at(px + BODY_L, py + BODY_B) && !solid_at(px + BODY_R, py + BODY_B), 3);
|
|
310
|
+
check(py >= 0 && py + BODY_B < 200, 4);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// --- CIA1 timer B harness (as tile-map-render.md) ------------------------
|
|
314
|
+
static inline void timer_start(void)
|
|
315
|
+
{
|
|
316
|
+
cia1.crb = 0x00;
|
|
317
|
+
cia1.tb = 0xffff;
|
|
318
|
+
cia1.crb = 0x11;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
static inline unsigned timer_stop(void)
|
|
322
|
+
{
|
|
323
|
+
cia1.crb = 0x00;
|
|
324
|
+
return 0xffff - cia1.tb;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// --- text helpers (screen codes) ------------------------------------------
|
|
328
|
+
void put_str(char *p, const char *s)
|
|
329
|
+
{
|
|
330
|
+
while (*s)
|
|
331
|
+
*p++ = *s++;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
void put_dec(char *p, unsigned v, char digits)
|
|
335
|
+
{
|
|
336
|
+
for (char i = digits; i > 0; i--) {
|
|
337
|
+
p[i - 1] = 0x30 + v % 10;
|
|
338
|
+
v /= 10;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
void put_hex2(char *p, char v)
|
|
343
|
+
{
|
|
344
|
+
char d = v >> 4;
|
|
345
|
+
p[0] = d < 10 ? 0x30 + d : d - 9;
|
|
346
|
+
d = v & 15;
|
|
347
|
+
p[1] = d < 10 ? 0x30 + d : d - 9;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
int main(void)
|
|
351
|
+
{
|
|
352
|
+
vic.color_border = 0;
|
|
353
|
+
vic.color_back = 0;
|
|
354
|
+
for (unsigned i = 0; i < 1000; i++) {
|
|
355
|
+
Screen[i] = 0x20;
|
|
356
|
+
Color[i] = 1;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Decode the text map once, into the map array and onto the screen.
|
|
360
|
+
for (char y = 0; y < MAP_H; y++) {
|
|
361
|
+
char *s = Screen + (MAP_ROW + y) * 40;
|
|
362
|
+
char *k = Color + (MAP_ROW + y) * 40;
|
|
363
|
+
char *m = map + y * MAP_W;
|
|
364
|
+
for (char x = 0; x < MAP_W; x++) {
|
|
365
|
+
char c = map_text[y][x];
|
|
366
|
+
char t = (c == '#') ? T_BRICK : (c == '=') ? T_PLAT : (c == 'H') ? T_LADDER : T_EMPTY;
|
|
367
|
+
m[x] = t;
|
|
368
|
+
s[x] = tile_code[t];
|
|
369
|
+
k[x] = tile_col[t];
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
// Sprite 0: a filled bar 8 px wide, 21 tall, in body columns 8..15.
|
|
374
|
+
for (char i = 0; i < 63; i++)
|
|
375
|
+
SprData[i] = (i % 3 == 1) ? 0xff : 0x00;
|
|
376
|
+
px = 32;
|
|
377
|
+
py_fp = (unsigned)(184 - 21) << 8; // feet on the floor's top
|
|
378
|
+
spr_init(Screen);
|
|
379
|
+
spr_set(0, true, px + 24, (int)(py_fp >> 8) + 50, 13, VCOL_WHITE, false, false, false);
|
|
380
|
+
|
|
381
|
+
put_str(Screen, s"row col state f ev");
|
|
382
|
+
put_str(Screen + 40, s"update max min");
|
|
383
|
+
|
|
384
|
+
char prev = 0xff, step = 0, left = script[0].frames;
|
|
385
|
+
unsigned frame = 0, t_max = 0, t_min = 0xffff;
|
|
386
|
+
bool done = false;
|
|
387
|
+
|
|
388
|
+
for (;;) {
|
|
389
|
+
vic_waitFrame();
|
|
390
|
+
|
|
391
|
+
// Script: a table of frames and an active-low port byte, through
|
|
392
|
+
// the same edge detector a real stick would go through.
|
|
393
|
+
char cur = done ? 0xff : script[step].port;
|
|
394
|
+
char newp = (cur ^ prev) & prev & JOY_MASK; // low now, high last frame
|
|
395
|
+
prev = cur;
|
|
396
|
+
|
|
397
|
+
__asm { sei }
|
|
398
|
+
timer_start();
|
|
399
|
+
player_update(cur, newp);
|
|
400
|
+
unsigned t = timer_stop();
|
|
401
|
+
__asm { cli }
|
|
402
|
+
player_assert();
|
|
403
|
+
if (t > t_max) t_max = t;
|
|
404
|
+
if (t < t_min) t_min = t;
|
|
405
|
+
|
|
406
|
+
int py = (int)(py_fp >> 8);
|
|
407
|
+
spr_move(0, px + 24, py + 50);
|
|
408
|
+
|
|
409
|
+
// HUD
|
|
410
|
+
char frow = (py + BODY_B) >> 3;
|
|
411
|
+
char fcol = (px + BODY_L) >> 3;
|
|
412
|
+
put_dec(Screen + 4, frow, 2);
|
|
413
|
+
put_dec(Screen + 11, fcol, 2);
|
|
414
|
+
put_str(Screen + 20, state_name[state]);
|
|
415
|
+
put_dec(Screen + 27, frame, 5);
|
|
416
|
+
put_hex2(Screen + 37, events);
|
|
417
|
+
put_dec(Screen + 40 + 11, t_max, 5);
|
|
418
|
+
put_dec(Screen + 40 + 21, t_min, 5);
|
|
419
|
+
frame++;
|
|
420
|
+
|
|
421
|
+
if (!done && --left == 0) {
|
|
422
|
+
const struct Step *st = script + step;
|
|
423
|
+
check(st->exp_row == 0xff || st->exp_row == frow, 5);
|
|
424
|
+
check(st->exp_px < 0 || st->exp_px == px, 6);
|
|
425
|
+
step++;
|
|
426
|
+
if (step == STEPS) {
|
|
427
|
+
done = true;
|
|
428
|
+
check(events == EV_ALL, 7);
|
|
429
|
+
char code = fault ? CODE_FAIL : CODE_PASS;
|
|
430
|
+
RESULT = code;
|
|
431
|
+
vic.color_border = fault ? 2 : 5;
|
|
432
|
+
put_str(Screen + 40 + 30, s"result 0");
|
|
433
|
+
Screen[40 + 38] = 0x30 + code;
|
|
434
|
+
Screen[40 + 39] = 0x30 + fault;
|
|
435
|
+
} else
|
|
436
|
+
left = script[step].frames;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return 0;
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
## Build
|
|
444
|
+
|
|
445
|
+
```bash
|
|
446
|
+
oscar64 -tm=c64 -O2 -o=tile-grid-collision.prg tile-grid-collision.c
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
Produces `tile-grid-collision.prg`, 3,918 bytes (Oscar64 build
|
|
450
|
+
2026-05-19). Then run headless in VICE (PAL):
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas x64sc -default -warp +sound \
|
|
454
|
+
+autostart-delay-random -autostartprgmode 1 -limitcycles 7200000 \
|
|
455
|
+
-exitscreenshot tile-grid-collision.png -autostart tile-grid-collision.prg
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
Add `-model ntsc` for the NTSC picture. The script takes 440 frames; at
|
|
459
|
+
12,000,000 cycles the run is over on both models and the border carries
|
|
460
|
+
the verdict.
|
|
461
|
+
|
|
462
|
+
## Expected output
|
|
463
|
+
|
|
464
|
+
Black border and background while the script runs. Rows 2 to 24 hold the
|
|
465
|
+
map: a grey wall down each side, a green platform on row 17 with a yellow
|
|
466
|
+
`H` ladder through it at column 6 down to the floor, a one-tile grey
|
|
467
|
+
overhang at column 11 row 19, a grey pillar at columns 12 to 17 on rows
|
|
468
|
+
20 to 22, and a two-row grey floor with a gap at columns 1 and 2. The
|
|
469
|
+
sprite is a white bar 8 pixels wide and 21 tall.
|
|
470
|
+
|
|
471
|
+
The script, frame by frame:
|
|
472
|
+
|
|
473
|
+
| Frames | Port | What happens | Event |
|
|
474
|
+
|---|---|---|---|
|
|
475
|
+
| 0 to 9 | none | stands on the floor at x 32 | |
|
|
476
|
+
| 10 to 69 | right | walks to x 80 and is stopped by the pillar for the last 12 frames | WALL |
|
|
477
|
+
| 70 | fire | jumps; the head meets the overhang on the second frame and stops under it | BUMP |
|
|
478
|
+
| 71 to 109 | none | falls back to the floor | LAND |
|
|
479
|
+
| 110 to 149 | left | walks to x 40, centred on the ladder | |
|
|
480
|
+
| 150 to 219 | up | climbs 48 pixels and stands on the ladder top, feet on row 16 | LADDER |
|
|
481
|
+
| 220 to 259 | right | walks along the platform, off its end at x 72, and falls | |
|
|
482
|
+
| 260 to 289 | none | lands on the overhang, feet on row 18 | |
|
|
483
|
+
| 290 to 419 | left | walks off the overhang, is held by the platform end while its head passes it, lands on the floor, walks to the gap, falls in and is stopped by the left wall at x 0 | PIT |
|
|
484
|
+
| 420 to 439 | none | stands in the pit, feet on row 24; the verdict is posted | |
|
|
485
|
+
|
|
486
|
+
The verdict on both models (measured in VICE x64sc 3.10 at 12,000,000
|
|
487
|
+
cycles, HUD decoded against the char ROM): row 0 reads
|
|
488
|
+
`ROW 24 COL 01 STATE STAND 00450 EV1F` on PAL (`00509` on NTSC, more
|
|
489
|
+
frames in the same cycles), row 1 reads `UPDATE MAX 02345 MIN 00604`
|
|
490
|
+
followed by `RESULT 010` (code `01`, fault `0`), and the border is
|
|
491
|
+
palette index 5, (98, 213, 50) on PAL and (114, 189, 103) on NTSC. The
|
|
492
|
+
HUD's frame counter shows how many frames ran, and the two cycle
|
|
493
|
+
figures are identical on the two models.
|
|
494
|
+
|
|
495
|
+
Screenshots at 7,200,000 cycles, mid-script:
|
|
496
|
+
`screenshots/tile-grid-collision.png` (PAL, frame 206) and
|
|
497
|
+
`screenshots/tile-grid-collision-ntsc.png` (NTSC, frame 228). Measured
|
|
498
|
+
on the PNGs: the sprite's white pixels are exactly 168, an 8 x 21 block
|
|
499
|
+
at world x 48 to 55, y 115 to 135 on PAL (standing on the ladder top,
|
|
500
|
+
HUD `ROW 16 COL 06 STATE STAND`) and x 58 to 65, y 115 to 135 on NTSC
|
|
501
|
+
(walking along the platform, HUD `ROW 16 COL 07 STATE WALK`); the pixel
|
|
502
|
+
under the right foot on NTSC is the platform's green, index 5. The row 1
|
|
503
|
+
maxima differ at this point (`01594` PAL, `01787` NTSC) because the NTSC
|
|
504
|
+
run is 22 frames further into the script; both reach 2,345 by the end.
|
|
505
|
+
|
|
506
|
+
The two cycle figures are what `player_update` costs, net of nothing:
|
|
507
|
+
the timer starts before the call and stops after it, interrupts masked.
|
|
508
|
+
The update runs straight after `vic_waitFrame()` returns at raster line
|
|
509
|
+
256, inside the vertical blank, so no badline falls in it on either
|
|
510
|
+
model, which is why the figures agree. An earlier build timed the
|
|
511
|
+
asserts too and read 3,820 on PAL and 3,863 on NTSC: that region ran
|
|
512
|
+
past the end of the NTSC blank into the badlines.
|
|
513
|
+
|
|
514
|
+
## Why this works
|
|
515
|
+
|
|
516
|
+
A tile is 8 x 8 pixels, so a world pixel `(x, y)` is in tile column
|
|
517
|
+
`x >> 3` and screen row `y >> 3`, where world x is the sprite's X minus 24
|
|
518
|
+
and world y its Y minus 50 (sprite 24, 50 is the top-left visible pixel).
|
|
519
|
+
`tile_at` subtracts the map's first screen row and reads the decoded
|
|
520
|
+
array; outside the map it answers empty above and solid to the sides and
|
|
521
|
+
below, so the sprite can never leave. The body is the sprite's columns 8
|
|
522
|
+
to 15 and rows 0 to 20, and every test is on points of that box, never
|
|
523
|
+
on the 24 x 21 sprite.
|
|
524
|
+
|
|
525
|
+
The horizontal step probes the leading edge at the head, 8 and 16 pixels
|
|
526
|
+
below it, and the feet. Probes further apart than a tile miss a one-tile
|
|
527
|
+
ledge: the first version probed at 0, 10 and 20 and the sprite, falling
|
|
528
|
+
past the platform's end with its head at 135 and its middle at 145, was
|
|
529
|
+
allowed to step left under the platform's row 17 (pixels 136 to 143),
|
|
530
|
+
and the next frame's fall put its head inside it. The check that failed
|
|
531
|
+
was the head assert, at frame 304.
|
|
532
|
+
|
|
533
|
+
The vertical step first asks whether either foot corner has a standable
|
|
534
|
+
tile one pixel below it. If not, gravity applies and the body falls at up
|
|
535
|
+
to 4 pixels a frame, less than a tile, so the feet cannot cross a tile
|
|
536
|
+
without ending inside it; when they do, the new y is the tile top less
|
|
537
|
+
the body height less one, `((y + 20) & ~7) - 21`. A rising head that
|
|
538
|
+
crosses into a solid tile is put on the row below it, `(y | 7) + 1`, and
|
|
539
|
+
the velocity zeroed. A fall can also end exactly on the boundary, feet on
|
|
540
|
+
the last pixel row above the tile, with no penetration and no snap; the
|
|
541
|
+
first version set its landing event inside the snap and missed the fall
|
|
542
|
+
after the head bump for that reason, so the event is now the ground test
|
|
543
|
+
turning true.
|
|
544
|
+
|
|
545
|
+
A ladder is a tile class: the body is on a ladder when the centre column
|
|
546
|
+
at the feet, or one pixel below them, reads one. Up and down then move
|
|
547
|
+
one pixel a frame with the velocity held at zero, and the climb stops
|
|
548
|
+
when the feet leave the last ladder tile, which leaves them one pixel
|
|
549
|
+
above it. The top rung is standable from above (`stands_on`: a ladder
|
|
550
|
+
tile with no ladder over it), so the sprite can stand on it, walk off it
|
|
551
|
+
and climb down into it. A pit needs no code of its own: with no standable
|
|
552
|
+
tile under either foot the ground test fails and the fall begins.
|
|
553
|
+
|
|
554
|
+
The script is a table of a frame count and an active-low port byte, run
|
|
555
|
+
through the previous-frame XOR of `joystick_edge_detect`, so the fire
|
|
556
|
+
pulse becomes one press event exactly as a stick would deliver it, and a
|
|
557
|
+
real port read can replace `script[step].port` without touching the
|
|
558
|
+
update.
|
|
559
|
+
|
|
560
|
+
Verified: compiled with Oscar64 (build 2026-05-19), run headless in VICE
|
|
561
|
+
x64sc 3.10 with the pinned command on PAL and NTSC, each run twice with
|
|
562
|
+
byte-identical PNGs; the HUD was decoded against the char ROM and the
|
|
563
|
+
sprite located by counting white pixels, not by eye.
|