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,533 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: multi-sprite-object
|
|
3
|
+
toolchain: oscar64
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [multi_sprite_object]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D010, D011, D015, D017, D01D, D020, D021, D027, DC06, DC07, DC0F]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# Oscar64 multi-sprite object: a six-sprite boss placed from a part table across the X 255 seam
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A boss made of six hardware sprites, each placed at a fixed offset from
|
|
19
|
+
one origin. A part table holds each part's offset, frame, colour and
|
|
20
|
+
expand flags: three unexpanded parts on top, and below them an
|
|
21
|
+
X-expanded wing, a Y-expanded core and a second X-expanded wing. The
|
|
22
|
+
middle top part is animated, two frames eight frames apart. On
|
|
23
|
+
autopilot the origin sweeps right from X 60 to X 340, so parts cross
|
|
24
|
+
X 255 one at a time and then pass X 344 under the right border and are
|
|
25
|
+
switched off; it sweeps back, then comes right again and holds at
|
|
26
|
+
X 264. There the left wing sits at X 240, left of the seam, and the right
|
|
27
|
+
wing is half under the right border. Every frame a model recomputes every
|
|
28
|
+
part from the table and compares it with the VIC registers: the X low
|
|
29
|
+
byte, the part's `$D010` bit, Y, the `$D015` bit, the pointer, the colour
|
|
30
|
+
and both expand bits. Sprite 6 stands for another object; its `$D010` and
|
|
31
|
+
`$D015` bits must survive every update. The screen shows the verdict,
|
|
32
|
+
the frames in which visible parts sat on both sides of X 256, the frames
|
|
33
|
+
in which a part was clipped, and CIA1 timer B cycles per update and per
|
|
34
|
+
part. `$02FF` = `01` and a green border on a pass, `02` and red
|
|
35
|
+
otherwise (`headless-verify.md`). This is the `multi_sprite_object`
|
|
36
|
+
technique from `docs/techniques/sprite.md`.
|
|
37
|
+
|
|
38
|
+
## Source
|
|
39
|
+
|
|
40
|
+
```c
|
|
41
|
+
// multi-sprite-object.c
|
|
42
|
+
//
|
|
43
|
+
// A boss built from six hardware sprites placed at fixed offsets from
|
|
44
|
+
// one origin. Each part has its own offset, frame, colour and expand
|
|
45
|
+
// flags in a table; the middle top part is animated. On autopilot the
|
|
46
|
+
// origin sweeps right across X 255 until parts leave the window at the
|
|
47
|
+
// right, back, then right again to a hold at X 264, where one part sits
|
|
48
|
+
// left of the seam and one is half under the right border.
|
|
49
|
+
// Every frame a model recomputes each part from the table and compares
|
|
50
|
+
// it with what the VIC registers hold: X low byte, the $D010 bit, Y,
|
|
51
|
+
// the $D015 bit, the pointer, the colour and both expand bits. Sprite 6
|
|
52
|
+
// is another object; its $D010 and $D015 bits must survive the update.
|
|
53
|
+
// Row 1: verdict. Rows 3-6: frames checked, mismatches, seam and clip
|
|
54
|
+
// frames, CIA1 timer B cycles. Rows 8-13: each part as the registers
|
|
55
|
+
// hold it. $02FF = 01 and a green border on a pass, 02 and red if not.
|
|
56
|
+
//
|
|
57
|
+
#include <c64/vic.h>
|
|
58
|
+
#include <c64/cia.h>
|
|
59
|
+
|
|
60
|
+
#define Screen ((char *)0x0400)
|
|
61
|
+
#define Color ((char *)0xd800)
|
|
62
|
+
#define SprData ((char *)0x3000) // blocks 192..194
|
|
63
|
+
#define SPR_BLK 192
|
|
64
|
+
#define VR ((volatile char *)0xd000)
|
|
65
|
+
#define PTR ((volatile char *)0x07f8) // sprite pointers
|
|
66
|
+
#define RESULT (*(volatile char *)0x02ff)
|
|
67
|
+
|
|
68
|
+
// --- the part table ---------------------------------------------------
|
|
69
|
+
// Offsets from the origin in sprite pixels. The object uses hardware
|
|
70
|
+
// sprites 0 to 5, part i in sprite i.
|
|
71
|
+
#define F_BLOCK 0
|
|
72
|
+
#define F_EYE 1 // two frames: 1 and 2
|
|
73
|
+
#define XEXP 0x01
|
|
74
|
+
#define YEXP 0x02
|
|
75
|
+
#define PARTS 6
|
|
76
|
+
#define OBJ_MASK 0x3f
|
|
77
|
+
#define ANIM_RATE 8 // frames per animation step
|
|
78
|
+
|
|
79
|
+
const signed char part_dx[PARTS] = { 0, 24, 48, -24, 24, 48 };
|
|
80
|
+
const char part_dy[PARTS] = { 0, 0, 0, 21, 21, 21 };
|
|
81
|
+
const char part_frame[PARTS] = { F_BLOCK, F_EYE, F_BLOCK, F_BLOCK, F_BLOCK, F_BLOCK };
|
|
82
|
+
const char part_len[PARTS] = { 1, 2, 1, 1, 1, 1 }; // animation frames
|
|
83
|
+
const char part_color[PARTS] = { 2, 7, 14, 3, 4, 8 };
|
|
84
|
+
const char part_flags[PARTS] = { 0, 0, 0, XEXP, YEXP, XEXP };
|
|
85
|
+
|
|
86
|
+
// The visible window in sprite coordinates. A part wholly outside it is
|
|
87
|
+
// switched off, not written: X 344 and beyond is under the right border.
|
|
88
|
+
// A negative X is hidden too: the register value that means "left of 0"
|
|
89
|
+
// differs by model (504 + x on PAL, 512 + x on NTSC, measured in VICE).
|
|
90
|
+
#define WIN_L 24
|
|
91
|
+
#define WIN_R 344
|
|
92
|
+
#define WIN_T 50
|
|
93
|
+
#define WIN_B 250
|
|
94
|
+
|
|
95
|
+
int ox; // origin, 9-bit sprite X
|
|
96
|
+
char oy;
|
|
97
|
+
char nparts = PARTS;
|
|
98
|
+
char anim_cur[PARTS], anim_cnt[PARTS];
|
|
99
|
+
|
|
100
|
+
// --- the technique: place every part, one $D010 and $D015 write --------
|
|
101
|
+
void object_update(void)
|
|
102
|
+
{
|
|
103
|
+
char msb = 0, en = 0, bit = 1;
|
|
104
|
+
for (char i = 0; i < nparts; i++) {
|
|
105
|
+
char f = part_frame[i];
|
|
106
|
+
if (part_len[i] > 1) { // per-part animation
|
|
107
|
+
if (--anim_cnt[i] == 0) {
|
|
108
|
+
anim_cnt[i] = ANIM_RATE;
|
|
109
|
+
if (++anim_cur[i] == part_len[i])
|
|
110
|
+
anim_cur[i] = 0;
|
|
111
|
+
}
|
|
112
|
+
f += anim_cur[i];
|
|
113
|
+
}
|
|
114
|
+
int x = ox + part_dx[i]; // 9 bits per part, not per object
|
|
115
|
+
int y = oy + part_dy[i];
|
|
116
|
+
char fl = part_flags[i];
|
|
117
|
+
char w = (fl & XEXP) ? 48 : 24;
|
|
118
|
+
char h = (fl & YEXP) ? 42 : 21;
|
|
119
|
+
if (x >= 0 && x < WIN_R && x + w > WIN_L && y < WIN_B && y + h > WIN_T) {
|
|
120
|
+
char s2 = i * 2;
|
|
121
|
+
VR[s2] = (char)x;
|
|
122
|
+
VR[s2 + 1] = (char)y;
|
|
123
|
+
if (x & 0x100)
|
|
124
|
+
msb |= bit;
|
|
125
|
+
en |= bit;
|
|
126
|
+
PTR[i] = SPR_BLK + f;
|
|
127
|
+
}
|
|
128
|
+
bit <<= 1;
|
|
129
|
+
}
|
|
130
|
+
// Other objects own the other bits of these registers.
|
|
131
|
+
VR[0x10] = (VR[0x10] & ~OBJ_MASK) | msb;
|
|
132
|
+
VR[0x15] = (VR[0x15] & ~OBJ_MASK) | en;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Colour and expand bits do not change while the object lives.
|
|
136
|
+
void object_spawn(void)
|
|
137
|
+
{
|
|
138
|
+
char xe = 0, ye = 0;
|
|
139
|
+
for (char i = 0; i < PARTS; i++) {
|
|
140
|
+
VR[0x27 + i] = part_color[i];
|
|
141
|
+
if (part_flags[i] & XEXP) xe |= 1 << i;
|
|
142
|
+
if (part_flags[i] & YEXP) ye |= 1 << i;
|
|
143
|
+
anim_cur[i] = 0;
|
|
144
|
+
anim_cnt[i] = ANIM_RATE;
|
|
145
|
+
}
|
|
146
|
+
VR[0x1d] = (VR[0x1d] & ~OBJ_MASK) | xe;
|
|
147
|
+
VR[0x17] = (VR[0x17] & ~OBJ_MASK) | ye;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// --- the model: what every register should hold after n updates ---------
|
|
151
|
+
unsigned ticks; // updates since spawn
|
|
152
|
+
char seam_now, clip_now;
|
|
153
|
+
|
|
154
|
+
char check(void)
|
|
155
|
+
{
|
|
156
|
+
char bad = 0;
|
|
157
|
+
char d010 = VR[0x10], d015 = VR[0x15];
|
|
158
|
+
char dx = VR[0x1d], dy = VR[0x17];
|
|
159
|
+
if ((d010 & 0x40) == 0 || (d015 & 0x40) == 0)
|
|
160
|
+
bad = 1; // sprite 6's bits were cleared
|
|
161
|
+
char vis = 0, hi = 0;
|
|
162
|
+
for (char i = 0; i < PARTS; i++) {
|
|
163
|
+
char b = 1 << i;
|
|
164
|
+
int x = ox + part_dx[i];
|
|
165
|
+
int y = oy + part_dy[i];
|
|
166
|
+
int w = (part_flags[i] & XEXP) ? 48 : 24;
|
|
167
|
+
int h = (part_flags[i] & YEXP) ? 42 : 21;
|
|
168
|
+
bool show = x >= 0 && x < WIN_R && x + w > WIN_L && y < WIN_B && y + h > WIN_T;
|
|
169
|
+
if (((dx & b) != 0) != ((part_flags[i] & XEXP) != 0)) bad = 1;
|
|
170
|
+
if (((dy & b) != 0) != ((part_flags[i] & YEXP) != 0)) bad = 1;
|
|
171
|
+
if ((VR[0x27 + i] & 15) != part_color[i]) bad = 1;
|
|
172
|
+
if (!show) {
|
|
173
|
+
if (d015 & b) bad = 1;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
vis |= b;
|
|
177
|
+
if (!(d015 & b)) bad = 1;
|
|
178
|
+
int rx = VR[i * 2] + ((d010 & b) ? 256 : 0);
|
|
179
|
+
if (rx != x || VR[i * 2 + 1] != (char)y) bad = 1;
|
|
180
|
+
if (x >= 256) hi |= b;
|
|
181
|
+
char f = part_frame[i] + (char)((ticks / ANIM_RATE) % part_len[i]);
|
|
182
|
+
if (PTR[i] != SPR_BLK + f) bad = 1;
|
|
183
|
+
}
|
|
184
|
+
seam_now = hi != 0 && hi != vis; // visible parts on both sides of 256
|
|
185
|
+
clip_now = vis != OBJ_MASK;
|
|
186
|
+
return bad;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// --- CIA1 timer B -----------------------------------------------------------
|
|
190
|
+
static inline void timer_start(void)
|
|
191
|
+
{
|
|
192
|
+
cia1.crb = 0x00;
|
|
193
|
+
cia1.tb = 0xffff;
|
|
194
|
+
cia1.crb = 0x11;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
static inline unsigned timer_stop(void)
|
|
198
|
+
{
|
|
199
|
+
cia1.crb = 0x00;
|
|
200
|
+
return 0xffff - cia1.tb;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
__noinline void nothing(void) { }
|
|
204
|
+
|
|
205
|
+
unsigned time1(void (*fn)(void))
|
|
206
|
+
{
|
|
207
|
+
__asm { sei }
|
|
208
|
+
timer_start();
|
|
209
|
+
fn();
|
|
210
|
+
unsigned t = timer_stop();
|
|
211
|
+
__asm { cli }
|
|
212
|
+
return t;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
// --- images: a solid block, and an eye open and shut ----------------------
|
|
216
|
+
void make_images(void)
|
|
217
|
+
{
|
|
218
|
+
for (char i = 0; i < 3 * 64; i++)
|
|
219
|
+
SprData[i] = 0xff;
|
|
220
|
+
for (char r = 6; r < 15; r++)
|
|
221
|
+
SprData[64 + r * 3 + 1] = 0x00; // frame 1: 8 x 9 hole
|
|
222
|
+
for (char r = 10; r < 12; r++)
|
|
223
|
+
SprData[128 + r * 3 + 1] = 0x00; // frame 2: 8 x 2 slit
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// --- text (screen codes) ----------------------------------------------------
|
|
227
|
+
void put_str(char *p, const char *s)
|
|
228
|
+
{
|
|
229
|
+
while (*s)
|
|
230
|
+
*p++ = *s++;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
void put_dec(char *p, unsigned v, char digits)
|
|
234
|
+
{
|
|
235
|
+
for (char i = digits; i > 0; i--) {
|
|
236
|
+
p[i - 1] = 0x30 + v % 10;
|
|
237
|
+
v /= 10;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
void put_sdec(char *p, int v, char digits)
|
|
242
|
+
{
|
|
243
|
+
p[0] = v < 0 ? 0x2d : 0x2b;
|
|
244
|
+
put_dec(p + 1, v < 0 ? -v : v, digits);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// --- autopilot ----------------------------------------------------------------
|
|
248
|
+
#define X_MIN 60
|
|
249
|
+
#define X_MAX 340
|
|
250
|
+
#define X_HOLD 264
|
|
251
|
+
#define Y_HOLD 172
|
|
252
|
+
#define HOLD_FRAMES 30
|
|
253
|
+
|
|
254
|
+
int main(void)
|
|
255
|
+
{
|
|
256
|
+
vic.color_border = 0;
|
|
257
|
+
vic.color_back = 0;
|
|
258
|
+
for (unsigned i = 0; i < 1000; i++) {
|
|
259
|
+
Screen[i] = 0x20;
|
|
260
|
+
Color[i] = 1;
|
|
261
|
+
}
|
|
262
|
+
make_images();
|
|
263
|
+
|
|
264
|
+
// Sprite 6 belongs to another object, at X 330: its $D010 bit is set.
|
|
265
|
+
VR[12] = 330 & 255;
|
|
266
|
+
VR[13] = 230;
|
|
267
|
+
VR[0x10] = 0x40;
|
|
268
|
+
VR[0x15] = 0x40;
|
|
269
|
+
VR[0x2d] = 15;
|
|
270
|
+
PTR[6] = SPR_BLK + F_BLOCK;
|
|
271
|
+
object_spawn();
|
|
272
|
+
|
|
273
|
+
put_str(Screen + 0, s"multi-sprite object frame");
|
|
274
|
+
put_str(Screen + 2 * 40, s"origin x y");
|
|
275
|
+
put_str(Screen + 3 * 40, s"checked mismatches");
|
|
276
|
+
put_str(Screen + 4 * 40, s"seam frames clip frames");
|
|
277
|
+
put_str(Screen + 5 * 40, s"update max min");
|
|
278
|
+
put_str(Screen + 6 * 40, s"part shown hidden fixed");
|
|
279
|
+
put_str(Screen + 7 * 40, s"part dx dy x hi en w h frm");
|
|
280
|
+
|
|
281
|
+
// Cost per part, display blanked: the update with 6 parts shown, 1
|
|
282
|
+
// part shown, and 6 parts all past the right edge, less an empty call.
|
|
283
|
+
vic.ctrl1 &= ~VIC_CTRL1_DEN;
|
|
284
|
+
vic_waitFrame();
|
|
285
|
+
vic_waitFrame();
|
|
286
|
+
unsigned t_none = time1(nothing);
|
|
287
|
+
ox = 200; oy = Y_HOLD;
|
|
288
|
+
unsigned t6 = time1(object_update) - t_none;
|
|
289
|
+
nparts = 1;
|
|
290
|
+
unsigned t1 = time1(object_update) - t_none;
|
|
291
|
+
nparts = PARTS;
|
|
292
|
+
ox = 400;
|
|
293
|
+
unsigned th = time1(object_update) - t_none;
|
|
294
|
+
vic.ctrl1 |= VIC_CTRL1_DEN;
|
|
295
|
+
unsigned c_part = (t6 - t1) / 5;
|
|
296
|
+
unsigned c_fixed = t1 - c_part;
|
|
297
|
+
put_dec(Screen + 6 * 40 + 11, c_part, 3);
|
|
298
|
+
put_dec(Screen + 6 * 40 + 22, (th - c_fixed) / 6, 3);
|
|
299
|
+
put_dec(Screen + 6 * 40 + 32, c_fixed, 3);
|
|
300
|
+
|
|
301
|
+
object_spawn(); // restart the animation
|
|
302
|
+
ox = X_MIN; oy = Y_HOLD;
|
|
303
|
+
ticks = 0;
|
|
304
|
+
char phase = 0, fault = 0, hold = 0, pr = 0;
|
|
305
|
+
unsigned frame = 0, checked = 0, mism = 0, seams = 0, clips = 0;
|
|
306
|
+
unsigned u_max = 0, u_min = 0xffff;
|
|
307
|
+
|
|
308
|
+
for (;;) {
|
|
309
|
+
vic_waitFrame();
|
|
310
|
+
__asm { sei }
|
|
311
|
+
timer_start();
|
|
312
|
+
object_update();
|
|
313
|
+
unsigned tu = timer_stop();
|
|
314
|
+
__asm { cli }
|
|
315
|
+
ticks++;
|
|
316
|
+
if (tu > u_max) u_max = tu;
|
|
317
|
+
if (tu < u_min) u_min = tu;
|
|
318
|
+
|
|
319
|
+
checked++;
|
|
320
|
+
if (check()) mism++;
|
|
321
|
+
if (seam_now) seams++;
|
|
322
|
+
if (clip_now) clips++;
|
|
323
|
+
|
|
324
|
+
// Printing is slow in C: one line of it a frame keeps the loop
|
|
325
|
+
// inside one frame.
|
|
326
|
+
switch (frame & 3) {
|
|
327
|
+
case 0:
|
|
328
|
+
put_dec(Screen + 27, frame, 5);
|
|
329
|
+
put_dec(Screen + 2 * 40 + 9, ox, 3);
|
|
330
|
+
put_dec(Screen + 2 * 40 + 15, oy, 3);
|
|
331
|
+
break;
|
|
332
|
+
case 1:
|
|
333
|
+
put_dec(Screen + 3 * 40 + 8, checked, 5);
|
|
334
|
+
put_dec(Screen + 3 * 40 + 25, mism, 5);
|
|
335
|
+
break;
|
|
336
|
+
case 2:
|
|
337
|
+
put_dec(Screen + 4 * 40 + 12, seams, 3);
|
|
338
|
+
put_dec(Screen + 4 * 40 + 28, clips, 3);
|
|
339
|
+
put_dec(Screen + 5 * 40 + 11, u_max, 4);
|
|
340
|
+
put_dec(Screen + 5 * 40 + 20, u_min, 4);
|
|
341
|
+
break;
|
|
342
|
+
case 3: { // one part's row, as the registers hold it
|
|
343
|
+
char d010 = VR[0x10], d015 = VR[0x15];
|
|
344
|
+
char *row = Screen + (8 + pr) * 40;
|
|
345
|
+
char b = 1 << pr;
|
|
346
|
+
row[0] = 0x30 + pr;
|
|
347
|
+
put_sdec(row + 5, part_dx[pr], 2);
|
|
348
|
+
put_sdec(row + 10, part_dy[pr], 2);
|
|
349
|
+
put_dec(row + 14, VR[pr * 2] + ((d010 & b) ? 256 : 0), 3);
|
|
350
|
+
row[19] = (d010 & b) ? 0x31 : 0x30;
|
|
351
|
+
row[22] = (d015 & b) ? 0x31 : 0x30;
|
|
352
|
+
put_dec(row + 24, (VR[0x1d] & b) ? 48 : 24, 2);
|
|
353
|
+
put_dec(row + 27, (VR[0x17] & b) ? 42 : 21, 2);
|
|
354
|
+
put_dec(row + 30, PTR[pr], 3);
|
|
355
|
+
if (++pr == PARTS)
|
|
356
|
+
pr = 0;
|
|
357
|
+
break;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
frame++;
|
|
361
|
+
|
|
362
|
+
// Next frame's origin: right, left, right to the hold.
|
|
363
|
+
if (phase == 0) {
|
|
364
|
+
ox += 2;
|
|
365
|
+
if (ox == X_MAX) phase = 1;
|
|
366
|
+
} else if (phase == 1) {
|
|
367
|
+
ox -= 2;
|
|
368
|
+
if (ox == X_MIN) phase = 2;
|
|
369
|
+
} else if (phase == 2) {
|
|
370
|
+
ox += 2;
|
|
371
|
+
if (ox == X_HOLD) phase = 3;
|
|
372
|
+
} else if (++hold == HOLD_FRAMES) {
|
|
373
|
+
phase = 4;
|
|
374
|
+
if (seams == 0) fault = 2;
|
|
375
|
+
if (clips == 0) fault = 3;
|
|
376
|
+
if (mism) fault = 1;
|
|
377
|
+
RESULT = fault ? 2 : 1;
|
|
378
|
+
vic.color_border = fault ? 2 : 5;
|
|
379
|
+
put_str(Screen + 40, fault ? s"result fail" : s"result pass");
|
|
380
|
+
Screen[40 + 12] = 0x30 + fault;
|
|
381
|
+
}
|
|
382
|
+
if (phase < 3) {
|
|
383
|
+
char k = frame & 31; // bob 16 lines while moving
|
|
384
|
+
oy = Y_HOLD - 8 + (k < 16 ? k : 31 - k);
|
|
385
|
+
} else
|
|
386
|
+
oy = Y_HOLD;
|
|
387
|
+
}
|
|
388
|
+
return 0;
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
## Build
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
oscar64 -tm=c64 -O2 -o=multi-sprite-object.prg multi-sprite-object.c
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
Produces `multi-sprite-object.prg`, 3,129 bytes. The three sprite images
|
|
399
|
+
are built at run time at `$3000`, blocks 192 to 194, above the program.
|
|
400
|
+
Then run headless in VICE (PAL):
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas x64sc -default -warp +sound \
|
|
404
|
+
+autostart-delay-random -autostartprgmode 1 -limitcycles 12000000 \
|
|
405
|
+
-exitscreenshot multi-sprite-object.png -autostart multi-sprite-object.prg
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
Add `-model ntsc` for the NTSC picture. The sweep and the hold take 412
|
|
409
|
+
frames; at 12,000,000 cycles the verdict is posted on both models.
|
|
410
|
+
|
|
411
|
+
## Expected output
|
|
412
|
+
|
|
413
|
+
The part table, offsets from the origin in sprite pixels:
|
|
414
|
+
|
|
415
|
+
| Part | Sprite | dx | dy | Size | Colour | Frame |
|
|
416
|
+
|---|---|---|---|---|---|---|
|
|
417
|
+
| 0 | 0 | 0 | 0 | 24 x 21 | red (2) | block |
|
|
418
|
+
| 1 | 1 | 24 | 0 | 24 x 21 | yellow (7) | eye, 2 frames |
|
|
419
|
+
| 2 | 2 | 48 | 0 | 24 x 21 | light blue (14) | block |
|
|
420
|
+
| 3 | 3 | -24 | 21 | 48 x 21, X-expanded | cyan (3) | block |
|
|
421
|
+
| 4 | 4 | 24 | 21 | 24 x 42, Y-expanded | purple (4) | block |
|
|
422
|
+
| 5 | 5 | 48 | 21 | 48 x 21, X-expanded | orange (8) | block |
|
|
423
|
+
|
|
424
|
+
Sprite 6, light grey, is fixed at X 330, Y 230, with its `$D010` bit set.
|
|
425
|
+
|
|
426
|
+
Measured in VICE x64sc 3.10 with the pinned command, text decoded
|
|
427
|
+
against the character ROM (rows 0 to 13, PAL):
|
|
428
|
+
|
|
429
|
+
```text
|
|
430
|
+
MULTI-SPRITE OBJECT FRAME 00452
|
|
431
|
+
RESULT PASS 0
|
|
432
|
+
ORIGIN X 264 Y 172
|
|
433
|
+
CHECKED 00454 MISMATCHES 00000
|
|
434
|
+
SEAM FRAMES 169 CLIP FRAMES 045
|
|
435
|
+
UPDATE MAX 1342 MIN 0808
|
|
436
|
+
PART SHOWN 197 HIDDEN 078 FIXED 067
|
|
437
|
+
PART DX DY X HI EN W H FRM
|
|
438
|
+
0 +00 +00 264 1 1 24 21 192
|
|
439
|
+
1 +24 +00 288 1 1 24 21 194
|
|
440
|
+
2 +48 +00 312 1 1 24 21 192
|
|
441
|
+
3 -24 +21 240 0 1 48 21 192
|
|
442
|
+
4 +24 +21 288 1 1 24 42 192
|
|
443
|
+
5 +48 +21 312 1 1 48 21 192
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
NTSC reads the same except `FRAME 00512`, `CHECKED 00514`, `SEAM FRAMES
|
|
447
|
+
233` and part 1's `FRM 193`: the run is 60 frames longer at the same
|
|
448
|
+
cycle count, and the hold keeps counting. One status line is printed
|
|
449
|
+
each frame and one part row every fourth frame, so `FRAME` trails
|
|
450
|
+
`CHECKED` and `FRM` can trail the picture. The border is palette index
|
|
451
|
+
5, (98, 213, 50) on PAL and (114, 189, 103) on NTSC.
|
|
452
|
+
|
|
453
|
+
What the numbers say:
|
|
454
|
+
|
|
455
|
+
- `MISMATCHES 00000`: in every frame of the run every part's registers
|
|
456
|
+
matched the model, sprite 6 kept its bits, and every part the model
|
|
457
|
+
called hidden had its `$D015` bit clear.
|
|
458
|
+
- `SEAM FRAMES`: frames in which visible parts had different `$D010`
|
|
459
|
+
bits. One `$D010` bit for the whole object would have put some part
|
|
460
|
+
256 pixels off in each of them. The hold at X 264 is one such state:
|
|
461
|
+
part 3's X is 240 (bit 0) while the origin and the other parts are at
|
|
462
|
+
264 and above (bit 1), a negative offset that borrows across the seam.
|
|
463
|
+
- `CLIP FRAMES 045`: frames in which at least one part was at X 344 or
|
|
464
|
+
beyond and was switched off. Part 2 (dx 48) leaves first, at origin
|
|
465
|
+
296; 23 frames going right and 22 coming back.
|
|
466
|
+
- `UPDATE MAX 1342 MIN 0808`: the whole object update, CIA1 timer B,
|
|
467
|
+
interrupts masked, at the top of the vertical blank, worst and best
|
|
468
|
+
frame of the run, the same on both models. A probe build that also
|
|
469
|
+
logged the origin found the worst at origin 282: all six parts shown,
|
|
470
|
+
all six setting their `$D010` bit, and part 1 stepping its animation.
|
|
471
|
+
The best was at origin 320, with four parts hidden.
|
|
472
|
+
- `PART SHOWN 197 HIDDEN 078 FIXED 067`: one update call each, less an
|
|
473
|
+
empty call, screen blanked: six parts shown (origin 200), one part
|
|
474
|
+
shown, and six parts hidden (origin 400). Shown per part is the
|
|
475
|
+
difference of the first two divided by 5; fixed is the rest of the
|
|
476
|
+
one-part call; hidden per part is the third less fixed, divided by 6.
|
|
477
|
+
|
|
478
|
+
The pictures: `screenshots/multi-sprite-object.png` (PAL) and
|
|
479
|
+
`screenshots/multi-sprite-object-ntsc.png` (NTSC), the hold at origin
|
|
480
|
+
X 264, Y 172. Measured with PIL on both: each part's colour covers
|
|
481
|
+
exactly the box the model gives it, left edge X + 8 and top row
|
|
482
|
+
Y + 1 − 16 on PAL (− 28 on NTSC), 24 or 48 wide and 21 or 42 tall.
|
|
483
|
+
|
|
484
|
+
| Part | X | `$D010` | PAL box x, y | NTSC box x, y | Pixels |
|
|
485
|
+
|---|---|---|---|---|---|
|
|
486
|
+
| 0 | 264 | 1 | 272-295, 157-177 | 272-295, 145-165 | 504 of 504 |
|
|
487
|
+
| 1 | 288 | 1 | 296-319, 157-177 | 296-319, 145-165 | 432 of 504 |
|
|
488
|
+
| 2 | 312 | 1 | 320-343, 157-177 | 320-343, 145-165 | 504 of 504 |
|
|
489
|
+
| 3 | 240 | 0 | 248-295, 178-198 | 248-295, 166-186 | 1008 of 1008 |
|
|
490
|
+
| 4 | 288 | 1 | 296-319, 178-219 | 296-319, 166-207 | 1008 of 1008 |
|
|
491
|
+
| 5 | 312 | 1 | 320-351, 178-198 | 320-351, 166-186 | 672 of 672 |
|
|
492
|
+
|
|
493
|
+
Part 3 is one sprite across the seam: its register X is 240 with its
|
|
494
|
+
`$D010` bit clear, and its pixels run from X 240 to 287. Part 5's box
|
|
495
|
+
stops at column 351, the last before the right border: 32 of its 48
|
|
496
|
+
columns show, 16 are under the border. Part 1 shows the open eye in
|
|
497
|
+
both shots, 72 pixels short, the 8 x 9 hole of frame 193. Sprite 6 is at
|
|
498
|
+
columns 338 to 351 and 20 rows, cut by the right and bottom borders.
|
|
499
|
+
Each model run twice gives byte-identical PNGs.
|
|
500
|
+
|
|
501
|
+
## Why this works
|
|
502
|
+
|
|
503
|
+
The object is one origin and a table. `object_update` adds each part's
|
|
504
|
+
signed offset to the origin as a 16-bit sum, so a part's ninth bit comes
|
|
505
|
+
from its own X, not from the origin's: at origin 264 part 3's
|
|
506
|
+
`264 - 24 = 240` has bit 8 clear. The low byte goes to `$D000 + 2i`, the
|
|
507
|
+
bit is collected into `msb`, and after the loop the object's six bits
|
|
508
|
+
are merged into `$D010` and `$D015` under `OBJ_MASK`. Sprite 6's bits
|
|
509
|
+
are outside the mask and are never touched; a plain `$D010 = msb` would
|
|
510
|
+
clear them, and the check would count a mismatch in every frame.
|
|
511
|
+
|
|
512
|
+
A part is written only when some of it is inside the window, X 24 to 343
|
|
513
|
+
and Y 50 to 249. Otherwise its enable bit stays clear. Under the right
|
|
514
|
+
border a part is harmless to the picture but still costs its hardware
|
|
515
|
+
sprite and its DMA; past 511 the sum would wrap, and on PAL X 504 to 511
|
|
516
|
+
is a hole the chip never draws (`sprite_x_range_hidden_and_seam` in
|
|
517
|
+
`docs/pitfalls/sprite.md`). A part left of X 0 needs a model-dependent
|
|
518
|
+
register value: a probe for this page put an X-expanded sprite at X 500
|
|
519
|
+
and found its left edge at -4 on PAL and -12 on NTSC (VICE x64sc,
|
|
520
|
+
exit screenshot), so wrapping is at 504 on PAL and 512 on NTSC. The
|
|
521
|
+
recipe hides such a part rather than branch on the model.
|
|
522
|
+
|
|
523
|
+
Colour and the expand bits do not change while the object lives, so
|
|
524
|
+
`object_spawn` writes them once, under the same mask. The animation
|
|
525
|
+
runs per part: only parts with more than one frame keep a countdown, and
|
|
526
|
+
the frame is added to the part's base frame, so a boss can blink an eye
|
|
527
|
+
without re-sending the rest. The model in `check` works the frame out
|
|
528
|
+
independently from the update count, `ticks / 8 % 2`.
|
|
529
|
+
|
|
530
|
+
Verified: compiled with Oscar64, run headless in VICE x64sc 3.10 with the
|
|
531
|
+
pinned command on PAL and NTSC, each twice with byte-identical PNGs; the
|
|
532
|
+
text was decoded against the character ROM and each part's box located
|
|
533
|
+
by colour with PIL, not by eye.
|