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,681 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: dypp-sprite-scroller
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [dypp_sprite_sine_scroller]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D002, D003, D004, D005, D006, D007, D008, D009, D00A, D00B, D00C, D00D, D00E, D00F, D010, D012, D015, D017, D01B, D01C, D01D, D020, D021, D027, D028, D029, D02A, D02B, D02C, D02D, D02E, DC04, DC05, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — DYPP Sprite Sine Scroller
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A text scroller built from the eight hardware sprites and nothing else:
|
|
19
|
+
no character buffer, no custom charset and no `$D016` fine scroll. Each
|
|
20
|
+
sprite carries one character, rendered when it is handed the character by
|
|
21
|
+
doubling an 8 by 8 glyph from the character ROM into a 2 by 2 block per
|
|
22
|
+
pixel inside its 24 by 21 image. A shared 9-bit scroll position `p` steps
|
|
23
|
+
down by 2 a frame; sprite `k` sits at `X = (p + 48k) mod 384` and bobs on
|
|
24
|
+
`Y = 130 + siny[(p + 32k) & 255]`, so every column rides the sine at its
|
|
25
|
+
own phase. A sprite is enabled only while its X is 0 to 343; when it
|
|
26
|
+
reaches X 4, where its glyph is wholly under the left border, it takes the
|
|
27
|
+
next character of the message and re-renders, and it comes back in from
|
|
28
|
+
the right at X 342 twenty-three frames later. After 300 frames `p` is
|
|
29
|
+
frozen, so the
|
|
30
|
+
pinned picture is static. The position update and each re-render are
|
|
31
|
+
timed with CIA 1 timer A and logged to RAM. This is the
|
|
32
|
+
`dypp_sprite_sine_scroller` technique.
|
|
33
|
+
|
|
34
|
+
Verified in VICE x64sc: at the pinned cycle count every visible glyph's
|
|
35
|
+
left edge and top row are where the table says, on PAL and on NTSC, and
|
|
36
|
+
`$D010` reads `$0C` for the two sprites past X 255. A control build with
|
|
37
|
+
the `$D010` write left out puts those two glyphs at X 14 and X 62 instead.
|
|
38
|
+
|
|
39
|
+
## Source
|
|
40
|
+
|
|
41
|
+
```asm
|
|
42
|
+
// dypp-sprite-scroller.asm
|
|
43
|
+
// DYPP: a text scroller made of the eight hardware sprites. Each sprite
|
|
44
|
+
// carries one character, rendered at hand-off time from the character ROM
|
|
45
|
+
// into its own 64-byte slot (a 2x2 block per glyph pixel, sprite rows 2..17,
|
|
46
|
+
// columns 4..19). A shared 9-bit scroll position p steps down by 2 a frame;
|
|
47
|
+
// sprite k sits at X = (p + 48k) mod 384 and Y = 130 + siny[(p + 32k) & 255],
|
|
48
|
+
// so each column bobs on its own phase. A sprite is enabled only while its
|
|
49
|
+
// X is 0..343; when X reaches 4 its glyph is wholly under the left border,
|
|
50
|
+
// it takes the next character of the text and re-renders, and it comes back
|
|
51
|
+
// in at X 342 twenty-three frames later. There is no character buffer and $D016
|
|
52
|
+
// is never touched. After FRAMES frames p is frozen and the picture is static.
|
|
53
|
+
//
|
|
54
|
+
// The position update and each re-render are timed with CIA 1 timer A
|
|
55
|
+
// (one-shot from $FFFF) and logged to RAM for a -moncommands dump.
|
|
56
|
+
// Region: both. Registers are written once a frame at raster line 255.
|
|
57
|
+
|
|
58
|
+
.const SCREEN = $0400
|
|
59
|
+
.const SPRBASE = $2000 // eight 64-byte slots $2000..$21c0, pointers $80..$87
|
|
60
|
+
.const XSTEP = 48 // pixels between adjacent columns
|
|
61
|
+
.const YMID = 130
|
|
62
|
+
.const YAMP = 40 // Y = 90..170, sprite rows to 191
|
|
63
|
+
.const FRAMES = 300 // updates before p is frozen
|
|
64
|
+
.const ULOG = $3000 // update time per frame, 2 bytes each ($ffff - timer)
|
|
65
|
+
.const RLOG = $3400 // render time per hand-off, 2 bytes each
|
|
66
|
+
.const DONE = $02ff // written once when the picture is frozen
|
|
67
|
+
|
|
68
|
+
.const ptr = $fb // zero page: sprite slot pointer
|
|
69
|
+
.const src = $fd // zero page: character ROM pointer
|
|
70
|
+
|
|
71
|
+
// Each glyph bit becomes two sprite bits: dbl(b) is the 16-bit doubling of
|
|
72
|
+
// byte b. Glyph column gx lands on sprite columns 4+2gx and 5+2gx, so
|
|
73
|
+
// byte 0 of the sprite row takes the top 4 bits of dbl, byte 1 the middle 8
|
|
74
|
+
// and byte 2 the bottom 4 shifted into its high nibble.
|
|
75
|
+
.function dbl(b) {
|
|
76
|
+
.var e = 0
|
|
77
|
+
.for (var i = 0; i < 8; i++) {
|
|
78
|
+
.if (((b >> i) & 1) == 1) .eval e = e | (3 << (2 * i))
|
|
79
|
+
}
|
|
80
|
+
.return e
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.pc = $0801 "basic"
|
|
84
|
+
:BasicUpstart(start)
|
|
85
|
+
|
|
86
|
+
.pc = $0810 "code"
|
|
87
|
+
start:
|
|
88
|
+
sei
|
|
89
|
+
lda #0
|
|
90
|
+
sta $d020
|
|
91
|
+
sta $d021
|
|
92
|
+
sta frame
|
|
93
|
+
sta frame+1
|
|
94
|
+
sta tidx
|
|
95
|
+
sta rcount
|
|
96
|
+
sta DONE
|
|
97
|
+
lda #<6 // p starts at 6: sprite 0 reaches X 4 on frame 1
|
|
98
|
+
sta pos
|
|
99
|
+
lda #>6
|
|
100
|
+
sta pos+1
|
|
101
|
+
|
|
102
|
+
// stopwatch overhead: an empty bracket
|
|
103
|
+
lda #$ff
|
|
104
|
+
sta $dc04
|
|
105
|
+
sta $dc05
|
|
106
|
+
lda #$19
|
|
107
|
+
sta $dc0e
|
|
108
|
+
lda #$08
|
|
109
|
+
sta $dc0e
|
|
110
|
+
lda $dc04
|
|
111
|
+
sta ovh
|
|
112
|
+
lda $dc05
|
|
113
|
+
sta ovh+1
|
|
114
|
+
|
|
115
|
+
ldx #0 // clear the screen and the eight slots
|
|
116
|
+
lda #$20
|
|
117
|
+
clr:
|
|
118
|
+
sta SCREEN,x
|
|
119
|
+
sta SCREEN+$100,x
|
|
120
|
+
sta SCREEN+$200,x
|
|
121
|
+
sta SCREEN+$300,x
|
|
122
|
+
inx
|
|
123
|
+
bne clr
|
|
124
|
+
lda #0
|
|
125
|
+
clr2:
|
|
126
|
+
sta SPRBASE,x
|
|
127
|
+
sta SPRBASE+$100,x
|
|
128
|
+
inx
|
|
129
|
+
bne clr2
|
|
130
|
+
|
|
131
|
+
ldx #9 // row 0: "frame" and four hex digits, grey
|
|
132
|
+
lbl:
|
|
133
|
+
lda #12
|
|
134
|
+
sta $d800,x
|
|
135
|
+
cpx #6
|
|
136
|
+
bcs !+
|
|
137
|
+
lda label,x
|
|
138
|
+
sta SCREEN,x
|
|
139
|
+
!: dex
|
|
140
|
+
bpl lbl
|
|
141
|
+
|
|
142
|
+
ldx #7 // pointers $80+k, one colour, no expansion
|
|
143
|
+
setup:
|
|
144
|
+
txa
|
|
145
|
+
clc
|
|
146
|
+
adc #SPRBASE/64
|
|
147
|
+
sta SCREEN+$3f8,x
|
|
148
|
+
lda #7
|
|
149
|
+
sta $d027,x
|
|
150
|
+
dex
|
|
151
|
+
bpl setup
|
|
152
|
+
lda #0
|
|
153
|
+
sta $d017
|
|
154
|
+
sta $d01d
|
|
155
|
+
sta $d01c
|
|
156
|
+
sta $d01b
|
|
157
|
+
sta $d015 // enabled per sprite by the update
|
|
158
|
+
|
|
159
|
+
loop:
|
|
160
|
+
lda #255 // wait for raster line 255
|
|
161
|
+
!: cmp $d012
|
|
162
|
+
bne !-
|
|
163
|
+
|
|
164
|
+
lda frame+1 // frozen after FRAMES updates
|
|
165
|
+
cmp #>FRAMES
|
|
166
|
+
bne go
|
|
167
|
+
lda frame
|
|
168
|
+
cmp #<FRAMES
|
|
169
|
+
bne go
|
|
170
|
+
lda #1
|
|
171
|
+
sta DONE
|
|
172
|
+
halt:
|
|
173
|
+
jmp halt
|
|
174
|
+
|
|
175
|
+
go:
|
|
176
|
+
inc frame
|
|
177
|
+
bne !+
|
|
178
|
+
inc frame+1
|
|
179
|
+
!:
|
|
180
|
+
lda pos // p = (p - 2) mod 384
|
|
181
|
+
sec
|
|
182
|
+
sbc #2
|
|
183
|
+
sta pos
|
|
184
|
+
lda pos+1
|
|
185
|
+
sbc #0
|
|
186
|
+
sta pos+1
|
|
187
|
+
bpl !+
|
|
188
|
+
lda pos
|
|
189
|
+
clc
|
|
190
|
+
adc #<384
|
|
191
|
+
sta pos
|
|
192
|
+
lda pos+1
|
|
193
|
+
adc #>384
|
|
194
|
+
sta pos+1
|
|
195
|
+
!:
|
|
196
|
+
lda #$ff // start the stopwatch
|
|
197
|
+
sta $dc04
|
|
198
|
+
sta $dc05
|
|
199
|
+
lda #$19
|
|
200
|
+
sta $dc0e
|
|
201
|
+
|
|
202
|
+
lda #0
|
|
203
|
+
sta msb
|
|
204
|
+
sta ena
|
|
205
|
+
sta pend
|
|
206
|
+
lda pos // running X = p + 48k, 16-bit
|
|
207
|
+
sta xl
|
|
208
|
+
sta yi // running Y index = (p + 32k) & 255
|
|
209
|
+
lda pos+1
|
|
210
|
+
sta xh
|
|
211
|
+
ldx #0
|
|
212
|
+
next:
|
|
213
|
+
lda xh // X >= 384 ? X -= 384
|
|
214
|
+
beq inrange
|
|
215
|
+
cmp #1
|
|
216
|
+
bne sub384
|
|
217
|
+
lda xl
|
|
218
|
+
cmp #<384
|
|
219
|
+
bcc inrange
|
|
220
|
+
sub384:
|
|
221
|
+
lda xl
|
|
222
|
+
sec
|
|
223
|
+
sbc #<384
|
|
224
|
+
sta xl
|
|
225
|
+
lda xh
|
|
226
|
+
sbc #>384
|
|
227
|
+
sta xh
|
|
228
|
+
inrange:
|
|
229
|
+
lda xl
|
|
230
|
+
sta sxlo,x
|
|
231
|
+
lda xh
|
|
232
|
+
sta sxhi,x
|
|
233
|
+
beq onscreen // X < 256: on screen, no MSB
|
|
234
|
+
lda xl
|
|
235
|
+
cmp #344-256
|
|
236
|
+
bcs offscreen // X 344..383: sprite off this frame
|
|
237
|
+
lda bits,x // X 256..343: MSB set
|
|
238
|
+
ora msb
|
|
239
|
+
sta msb
|
|
240
|
+
onscreen:
|
|
241
|
+
lda bits,x
|
|
242
|
+
ora ena
|
|
243
|
+
sta ena
|
|
244
|
+
offscreen:
|
|
245
|
+
lda xh // X == 4: glyph wholly under the left border
|
|
246
|
+
bne nohand
|
|
247
|
+
lda xl
|
|
248
|
+
cmp #4
|
|
249
|
+
bne nohand
|
|
250
|
+
inx // pend = k + 1
|
|
251
|
+
stx pend
|
|
252
|
+
dex
|
|
253
|
+
nohand:
|
|
254
|
+
ldy yi
|
|
255
|
+
lda siny,y
|
|
256
|
+
clc
|
|
257
|
+
adc #YMID
|
|
258
|
+
sta sy,x
|
|
259
|
+
ldy pairs,x
|
|
260
|
+
sta $d001,y
|
|
261
|
+
lda xl
|
|
262
|
+
sta $d000,y
|
|
263
|
+
lda xl // next column: X += 48, Y index += 32
|
|
264
|
+
clc
|
|
265
|
+
adc #XSTEP
|
|
266
|
+
sta xl
|
|
267
|
+
bcc !+
|
|
268
|
+
inc xh
|
|
269
|
+
!: lda yi
|
|
270
|
+
clc
|
|
271
|
+
adc #32
|
|
272
|
+
sta yi
|
|
273
|
+
inx
|
|
274
|
+
cpx #8
|
|
275
|
+
beq !+
|
|
276
|
+
jmp next
|
|
277
|
+
!: lda msb
|
|
278
|
+
#if !NOMSB
|
|
279
|
+
sta $d010 // the control build omits this write
|
|
280
|
+
#endif
|
|
281
|
+
lda ena
|
|
282
|
+
sta $d015
|
|
283
|
+
|
|
284
|
+
lda #$08 // stop the stopwatch, log it at ULOG + 2*(frame-1)
|
|
285
|
+
sta $dc0e
|
|
286
|
+
lda frame
|
|
287
|
+
sec
|
|
288
|
+
sbc #1
|
|
289
|
+
sta ptr
|
|
290
|
+
lda frame+1
|
|
291
|
+
sbc #0
|
|
292
|
+
asl ptr
|
|
293
|
+
rol
|
|
294
|
+
clc
|
|
295
|
+
adc #>ULOG
|
|
296
|
+
sta ptr+1
|
|
297
|
+
ldy #0
|
|
298
|
+
lda $dc04
|
|
299
|
+
sta (ptr),y
|
|
300
|
+
iny
|
|
301
|
+
lda $dc05
|
|
302
|
+
sta (ptr),y
|
|
303
|
+
|
|
304
|
+
lda pend // a sprite reached X 4: hand it the next character
|
|
305
|
+
beq nohandoff
|
|
306
|
+
tax
|
|
307
|
+
dex
|
|
308
|
+
ldy tidx
|
|
309
|
+
lda text,y
|
|
310
|
+
cmp #$ff
|
|
311
|
+
bne !+
|
|
312
|
+
ldy #0
|
|
313
|
+
sty tidx
|
|
314
|
+
lda text
|
|
315
|
+
!: sta code
|
|
316
|
+
inc tidx
|
|
317
|
+
lda #$ff // time the render on its own
|
|
318
|
+
sta $dc04
|
|
319
|
+
sta $dc05
|
|
320
|
+
lda #$19
|
|
321
|
+
sta $dc0e
|
|
322
|
+
jsr render
|
|
323
|
+
lda #$08
|
|
324
|
+
sta $dc0e
|
|
325
|
+
lda rcount
|
|
326
|
+
asl
|
|
327
|
+
tay
|
|
328
|
+
lda $dc04
|
|
329
|
+
sta RLOG,y
|
|
330
|
+
lda $dc05
|
|
331
|
+
sta RLOG+1,y
|
|
332
|
+
inc rcount
|
|
333
|
+
nohandoff:
|
|
334
|
+
|
|
335
|
+
lda frame+1 // frame counter in hex after the label
|
|
336
|
+
lsr
|
|
337
|
+
lsr
|
|
338
|
+
lsr
|
|
339
|
+
lsr
|
|
340
|
+
tax
|
|
341
|
+
lda hex,x
|
|
342
|
+
sta SCREEN+6
|
|
343
|
+
lda frame+1
|
|
344
|
+
and #$0f
|
|
345
|
+
tax
|
|
346
|
+
lda hex,x
|
|
347
|
+
sta SCREEN+7
|
|
348
|
+
lda frame
|
|
349
|
+
lsr
|
|
350
|
+
lsr
|
|
351
|
+
lsr
|
|
352
|
+
lsr
|
|
353
|
+
tax
|
|
354
|
+
lda hex,x
|
|
355
|
+
sta SCREEN+8
|
|
356
|
+
lda frame
|
|
357
|
+
and #$0f
|
|
358
|
+
tax
|
|
359
|
+
lda hex,x
|
|
360
|
+
sta SCREEN+9
|
|
361
|
+
|
|
362
|
+
!: lda $d012 // leave line 255 before waiting again
|
|
363
|
+
cmp #255
|
|
364
|
+
beq !-
|
|
365
|
+
jmp loop
|
|
366
|
+
|
|
367
|
+
// Render screen code `code` into sprite slot X (0..7). The eight glyph
|
|
368
|
+
// bytes are copied out of the character ROM with $01 = $33, then each is
|
|
369
|
+
// expanded through three tables into two identical sprite rows.
|
|
370
|
+
render:
|
|
371
|
+
lda slotlo,x
|
|
372
|
+
sta ptr
|
|
373
|
+
lda slothi,x
|
|
374
|
+
sta ptr+1
|
|
375
|
+
lda #0
|
|
376
|
+
sta src+1
|
|
377
|
+
lda code // ROM address = $d000 + code * 8
|
|
378
|
+
asl
|
|
379
|
+
rol src+1
|
|
380
|
+
asl
|
|
381
|
+
rol src+1
|
|
382
|
+
asl
|
|
383
|
+
rol src+1
|
|
384
|
+
sta src
|
|
385
|
+
lda src+1
|
|
386
|
+
ora #$d0
|
|
387
|
+
sta src+1
|
|
388
|
+
lda #$33
|
|
389
|
+
sta $01
|
|
390
|
+
ldy #7
|
|
391
|
+
!: lda (src),y
|
|
392
|
+
sta gbuf,y
|
|
393
|
+
dey
|
|
394
|
+
bpl !-
|
|
395
|
+
lda #$37
|
|
396
|
+
sta $01
|
|
397
|
+
.for (var r = 0; r < 8; r++) {
|
|
398
|
+
ldx gbuf+r
|
|
399
|
+
lda t0,x // sprite rows 2+2r and 3+2r, bytes 0..2
|
|
400
|
+
ldy #6*r+6
|
|
401
|
+
sta (ptr),y
|
|
402
|
+
ldy #6*r+9
|
|
403
|
+
sta (ptr),y
|
|
404
|
+
lda t1,x
|
|
405
|
+
ldy #6*r+7
|
|
406
|
+
sta (ptr),y
|
|
407
|
+
ldy #6*r+10
|
|
408
|
+
sta (ptr),y
|
|
409
|
+
lda t2,x
|
|
410
|
+
ldy #6*r+8
|
|
411
|
+
sta (ptr),y
|
|
412
|
+
ldy #6*r+11
|
|
413
|
+
sta (ptr),y
|
|
414
|
+
}
|
|
415
|
+
rts
|
|
416
|
+
|
|
417
|
+
label: .text "frame " // lowercase: .text is screen codes
|
|
418
|
+
hex: .text "0123456789abcdef"
|
|
419
|
+
bits: .byte 1, 2, 4, 8, 16, 32, 64, 128
|
|
420
|
+
pairs: .byte 0, 2, 4, 6, 8, 10, 12, 14
|
|
421
|
+
slotlo: .fill 8, <(SPRBASE + i * 64)
|
|
422
|
+
slothi: .fill 8, >(SPRBASE + i * 64)
|
|
423
|
+
|
|
424
|
+
// The message: screen codes, $ff ends it and it wraps.
|
|
425
|
+
text: .text "eight sprites carry the words and each column bobs on its own sine "
|
|
426
|
+
.byte $ff
|
|
427
|
+
|
|
428
|
+
.align $100
|
|
429
|
+
t0: .fill 256, dbl(i) >> 12
|
|
430
|
+
t1: .fill 256, (dbl(i) >> 4) & $ff
|
|
431
|
+
t2: .fill 256, (dbl(i) & $0f) << 4
|
|
432
|
+
siny: .fill 256, (round(YAMP * sin(toRadians(i * 360 / 256))) + 256) & $ff
|
|
433
|
+
|
|
434
|
+
.pc = $3800 "state" virtual
|
|
435
|
+
sxlo: .fill 8, 0 // shadow X low bytes, this frame
|
|
436
|
+
sxhi: .fill 8, 0 // shadow X high bytes
|
|
437
|
+
sy: .fill 8, 0 // shadow Y
|
|
438
|
+
msb: .byte 0 // $d010 as written
|
|
439
|
+
ena: .byte 0 // $d015 as written
|
|
440
|
+
pend: .byte 0 // sprite number + 1 due a hand-off, or 0
|
|
441
|
+
frame: .word 0
|
|
442
|
+
pos: .word 0 // p, 0..383
|
|
443
|
+
tidx: .byte 0 // next character of text
|
|
444
|
+
rcount: .byte 0 // renders so far
|
|
445
|
+
ovh: .word 0 // stopwatch reading of an empty bracket
|
|
446
|
+
xl: .byte 0
|
|
447
|
+
xh: .byte 0
|
|
448
|
+
yi: .byte 0
|
|
449
|
+
code: .byte 0
|
|
450
|
+
gbuf: .fill 8, 0
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
## Build
|
|
454
|
+
|
|
455
|
+
```bash
|
|
456
|
+
java -jar KickAss.jar dypp-sprite-scroller.asm -o dypp-sprite-scroller.prg
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
## Expected output
|
|
460
|
+
|
|
461
|
+
Black screen and border. Row 0 reads `FRAME nnnn` in grey, the frame
|
|
462
|
+
counter in hex, counting up once a frame until it stops at `012C` (300).
|
|
463
|
+
Below it, yellow capital letters 16 pixels wide and 16 tall (each glyph
|
|
464
|
+
pixel is a 2 by 2 block) drift left two pixels a frame, 48 pixels apart,
|
|
465
|
+
each riding up and down its own sine 40 lines either side of Y 130, one
|
|
466
|
+
sine phase step of 32 between neighbours. The message is
|
|
467
|
+
`EIGHT SPRITES CARRY THE WORDS AND EACH COLUMN BOBS ON ITS OWN SINE`,
|
|
468
|
+
followed by four spaces, repeating. The first character enters at the
|
|
469
|
+
right edge about twenty frames in; before that the sprites are blank.
|
|
470
|
+
At most seven of the eight sprites are ever on screen: the eighth is
|
|
471
|
+
between X 344 and X 383, disabled, carrying the character that comes
|
|
472
|
+
next.
|
|
473
|
+
|
|
474
|
+
At frame 300 the picture freezes and holds. It shows, left to right,
|
|
475
|
+
`S P R I T E` with a space before the `S`.
|
|
476
|
+
|
|
477
|
+
### How the glyph lands in the sprite
|
|
478
|
+
|
|
479
|
+
Sprite row `r` is bytes `3r`, `3r + 1` and `3r + 2` of the 64-byte slot.
|
|
480
|
+
Glyph row `gy` (0 to 7) is written to sprite rows `2 + 2gy` and
|
|
481
|
+
`3 + 2gy`; glyph column `gx` (0 is the leftmost bit) becomes sprite
|
|
482
|
+
columns `4 + 2gx` and `5 + 2gx`. So the 8 by 8 glyph fills sprite rows 2
|
|
483
|
+
to 17 and columns 4 to 19, with two blank rows above, three below and
|
|
484
|
+
four blank columns each side. The three tables `t0`, `t1`, `t2`, built by
|
|
485
|
+
the assembler from `dbl(b)`, the 16-bit bit-doubling of byte `b`, give
|
|
486
|
+
the three bytes of a sprite row for any glyph byte: byte 0 holds
|
|
487
|
+
`dbl >> 12` in its low nibble, byte 1 the middle eight bits, byte 2 the
|
|
488
|
+
low four bits of `dbl` in its high nibble. The 15 bytes outside rows 2 to
|
|
489
|
+
17 are zeroed once at start and never written again; a re-render writes
|
|
490
|
+
the 48 bytes of rows 2 to 17.
|
|
491
|
+
|
|
492
|
+
The eight slots are `$2000 + 64k`, `$2000` to `$21C0`, pointers `$80` to
|
|
493
|
+
`$87` at `$07F8 + k`. All eight are yellow (colour 7), single colour,
|
|
494
|
+
unexpanded.
|
|
495
|
+
|
|
496
|
+
### Reading a glyph's position off the picture
|
|
497
|
+
|
|
498
|
+
Screenshot column `x` is VIC X `x - 8` and a sprite's first row is drawn
|
|
499
|
+
on the line after the one in its Y register; the picture's row is the
|
|
500
|
+
line minus 16 on PAL and minus 28 on NTSC
|
|
501
|
+
(`docs/runtime/vice-reference.md`). The glyph starts at sprite column 4
|
|
502
|
+
and row 2, and the ROM capitals in this message have their first ink in
|
|
503
|
+
glyph column 1 except `I`, whose first ink is in column 2, so a glyph's
|
|
504
|
+
leftmost lit column is `X + 8 + 4 + 2` for most letters and `X + 8 + 4 +
|
|
505
|
+
4` for `I`. These capitals have ink in glyph rows 0 to 6, so a glyph's
|
|
506
|
+
top lit row is `Y - 15 + 2`, that is `Y - 13`, on PAL (`Y - 25` on NTSC)
|
|
507
|
+
and its bottom lit row 13 below that. The figures below were measured with PIL as the bounding
|
|
508
|
+
box of yellow (255, 255, 70 on PAL, 255, 248, 141 on NTSC) in each
|
|
509
|
+
column cluster.
|
|
510
|
+
|
|
511
|
+
### PAL, pinned: 10,000,000 cycles, frame 300 frozen
|
|
512
|
+
|
|
513
|
+
`p` after 300 steps of 2 from 6 is `(6 - 600) mod 384 = 174`. The
|
|
514
|
+
message index at hand-off `n` is `n`; sprite `k` was handed characters
|
|
515
|
+
`k` and `k + 8`, sprites 0 to 4 twice and 5 to 7 once by frame 300. The
|
|
516
|
+
whole table was also read back from RAM (`$3800`, the shadow copy the
|
|
517
|
+
loop keeps) and from `$D000` to `$D010` with a `-moncommands` store trace
|
|
518
|
+
on `$02FF`, which the program writes once when it freezes; the dump
|
|
519
|
+
matches this table on both models.
|
|
520
|
+
|
|
521
|
+
| Sprite | Character | X | siny index | Y | On screen | $D010 bit | Predicted column, row | Measured box |
|
|
522
|
+
|---|---|---|---|---|---|---|---|---|
|
|
523
|
+
| 0 | `R` (char 8) | 174 | 174 | 94 | yes | 0 | 188, 81 | x 188 to 199, y 81 to 94 |
|
|
524
|
+
| 1 | `I` (char 9) | 222 | 206 | 92 | yes | 0 | 238, 79 | x 238 to 245, y 79 to 92 |
|
|
525
|
+
| 2 | `T` (char 10) | 270 | 238 | 113 | yes | 1 | 284, 100 | x 284 to 295, y 100 to 113 |
|
|
526
|
+
| 3 | `E` (char 11) | 318 | 14 | 143 | yes | 1 | 332, 130 | x 332 to 343, y 130 to 143 |
|
|
527
|
+
| 4 | `S` (char 12) | 366 | 46 | 166 | no, disabled | 0 | not drawn | none |
|
|
528
|
+
| 5 | space (char 5) | 30 | 78 | 168 | yes, blank | 0 | no ink | none |
|
|
529
|
+
| 6 | `S` (char 6) | 78 | 110 | 147 | yes | 0 | 92, 134 | x 92 to 103, y 134 to 147 |
|
|
530
|
+
| 7 | `P` (char 7) | 126 | 142 | 117 | yes | 0 | 140, 104 | x 140 to 151, y 104 to 117 |
|
|
531
|
+
|
|
532
|
+
`$D010` is `$0C` (bits 2 and 3) and `$D015` is `$EF` (all but sprite 4).
|
|
533
|
+
Sprite 4's low byte is written (110) but its enable bit is clear, so its
|
|
534
|
+
MSB is left out of the mask. The VIC registers read back as X low bytes
|
|
535
|
+
174, 222, 14, 62, 110, 30, 78, 126 and Y 94, 92, 113, 143, 166, 168,
|
|
536
|
+
147, 117. All six visible glyphs match their predicted column and row.
|
|
537
|
+
`DONE` (`$02FF`) is stored at cycle 8,880,950, so at 10,000,000 the
|
|
538
|
+
picture has been static for about 57 PAL frames; the exit lands in a
|
|
539
|
+
frame identical to the one before it.
|
|
540
|
+
|
|
541
|
+
### NTSC, pinned: 10,000,000 cycles, frame 300 frozen
|
|
542
|
+
|
|
543
|
+
The same state: NTSC frames are shorter, so the freeze comes earlier,
|
|
544
|
+
`$02FF` stored at cycle 8,239,296, and the picture is then static for
|
|
545
|
+
about 103 NTSC frames. The same X, Y, `$D010` and `$D015` read back. The
|
|
546
|
+
six visible boxes are the PAL boxes with every row 12 less: `R` x 188 to
|
|
547
|
+
199, y 69 to 82; `I` x 238 to 245, y 67 to 80; `T` x 284 to 295, y 88 to
|
|
548
|
+
101; `E` x 332 to 343, y 118 to 131; `S` x 92 to 103, y 122 to 135; `P`
|
|
549
|
+
x 140 to 151, y 92 to 105.
|
|
550
|
+
|
|
551
|
+
### Mid-motion, not pinned: 6,000,000 cycles
|
|
552
|
+
|
|
553
|
+
PAL: the counter reads `009A` (154) but the five visible glyphs are at
|
|
554
|
+
the positions of frame 153, `p = 84`: `E` at column 98 (X 84), `I` at
|
|
555
|
+
148 (X 132), `G` at 194 (X 180), `H` at 242 (X 228), `T` at 290
|
|
556
|
+
(X 276), each two columns right of the frame-154 value. The counter is
|
|
557
|
+
written at line 255 with the new positions, the counter's row is line 51
|
|
558
|
+
to 58 and the first glyph row is line 96, so the exit landed with the
|
|
559
|
+
beam between them: rows above it show the new field, rows below the
|
|
560
|
+
previous one, which is the rule in `docs/runtime/vice-reference.md`.
|
|
561
|
+
Sprite 7 is still blank at X 36 (its first hand-off is frame 169) and
|
|
562
|
+
sprite 5 carries a space at X 324. NTSC: the counter reads `00A9` (169)
|
|
563
|
+
and the glyphs are at frame 169's positions, `p = 52`: `E` at 66, `I`
|
|
564
|
+
at 116, `G` at 162, `H` at 210, `T` at 258; sprite 6's `S` at X 340 is
|
|
565
|
+
under the right border (its first ink column would be 354, past the
|
|
566
|
+
last visible column 351) and sprite 7 has just taken `R` at X 4, under
|
|
567
|
+
the left one.
|
|
568
|
+
|
|
569
|
+
### The control: `$D010` never written
|
|
570
|
+
|
|
571
|
+
Built with `-define NOMSB`, which drops the one `sta $d010`, and run to
|
|
572
|
+
the same 10,000,000 cycles. PAL: sprites 2 and 3, which should be at X
|
|
573
|
+
270 and 318, appear at X 14 and X 62, their low bytes alone: `T` shows
|
|
574
|
+
columns 32 to 39 (its left half under the border) and `E` columns 76 to
|
|
575
|
+
87, both at their correct rows (100 to 113 and 130 to 143). The other
|
|
576
|
+
four glyphs are where the pinned table puts them. NTSC gives the same
|
|
577
|
+
columns with the rows 12 less. That is the pitfall
|
|
578
|
+
`sprite_x_high_bit_wrong_register` on purpose: the MSB never set, the
|
|
579
|
+
sprite is drawn 256 pixels left of where it belongs.
|
|
580
|
+
|
|
581
|
+
### Cycle costs, CIA 1 timer A
|
|
582
|
+
|
|
583
|
+
Timer A is loaded with `$FFFF`, started one-shot (`$DC0E = $19`),
|
|
584
|
+
stopped (`$DC0E = $08`) and read; the cost is `$FFFF` minus the reading.
|
|
585
|
+
An empty bracket reads 5, and the figures below are raw, with that 5
|
|
586
|
+
still in them. Every value was read back from the logs at `$3000` (one
|
|
587
|
+
16-bit entry per frame, 300 of them) and `$3400` (one per hand-off) with
|
|
588
|
+
the same `-moncommands` dump; PAL and NTSC logs are identical to the
|
|
589
|
+
cycle.
|
|
590
|
+
|
|
591
|
+
- **Position update, eight sprites**, from the timer start after `p` has
|
|
592
|
+
stepped to the timer stop after the `$D015` write: 1,147 cycles in 218
|
|
593
|
+
of the 300 frames, minimum 1,091 (4 frames), maximum 1,154 (11
|
|
594
|
+
frames); the other values are 1,114 (21), 1,121 (2) and 1,124 (44).
|
|
595
|
+
The spread is the branches: how many of the eight columns need the 384
|
|
596
|
+
subtracted, how many are past 255, whether one is off, and whether one
|
|
597
|
+
is at X 4. The update runs from line 255, below the display, so no
|
|
598
|
+
badline or sprite fetch is inside the bracket on either model.
|
|
599
|
+
- **One character re-render**, the `jsr render` alone: 715 cycles, the
|
|
600
|
+
same for all thirteen hand-offs in the run. That is the eight-byte ROM
|
|
601
|
+
copy with `$01` at `$33` plus 48 stores through the three tables.
|
|
602
|
+
|
|
603
|
+
Rung 3 from those: a frame with a hand-off costs 1,869 cycles at most
|
|
604
|
+
(1,154 + 715; a typical frame with a hand-off is 1,862, 1,147 + 715),
|
|
605
|
+
about 30 raster lines on PAL, all of it below the display.
|
|
606
|
+
|
|
607
|
+
Screenshots from the pinned runs: `screenshots/dypp-sprite-scroller.png`
|
|
608
|
+
(PAL) and `screenshots/dypp-sprite-scroller-ntsc.png`. Two runs of each
|
|
609
|
+
pinned command produced byte-identical files.
|
|
610
|
+
|
|
611
|
+
## Why this works
|
|
612
|
+
|
|
613
|
+
### Sprites instead of a charset
|
|
614
|
+
|
|
615
|
+
A DYCP scroller (`recipes/kickassembler/dycp-scroller.md`) moves a glyph
|
|
616
|
+
to any pixel row by copying it into a strip of a custom charset, and
|
|
617
|
+
scrolls it sideways with `$D016` and a ring buffer. Here the hardware
|
|
618
|
+
does both: a sprite's Y register is a pixel row and its X register a
|
|
619
|
+
pixel column, so a column's height and its scroll are two register
|
|
620
|
+
writes. Nothing is copied per frame. The price is that there are eight
|
|
621
|
+
sprites, so eight columns, and a sprite image is 24 pixels wide, so the
|
|
622
|
+
columns sit 48 apart and each one carries a doubled 16 by 16 glyph.
|
|
623
|
+
|
|
624
|
+
### The 9-bit X and the mask
|
|
625
|
+
|
|
626
|
+
`X = (p + 48k) mod 384` is kept as a 16-bit running sum: `p`, then 48
|
|
627
|
+
added per column with the carry into the high byte, and 384 subtracted
|
|
628
|
+
once when the sum reaches it. The low byte goes to `$D000 + 2k` as it
|
|
629
|
+
is; the high byte decides three things. Zero: the sprite is on screen
|
|
630
|
+
and its `$D010` bit is clear. One with a low byte under 88 (X 256 to
|
|
631
|
+
343): on screen, bit set. One with a low byte of 88 or more (X 344 to
|
|
632
|
+
383): the sprite is disabled in `$D015` this frame and its bit is left
|
|
633
|
+
clear. The mask and the enable byte are built in two locals and written
|
|
634
|
+
once each after the loop, so every sprite's low byte, MSB and enable
|
|
635
|
+
change in the same update. The 40 pixels between 344 and 383 are the
|
|
636
|
+
gap a sprite spends off screen; with 48-pixel spacing and 384 for the
|
|
637
|
+
lap, one sprite is always in it.
|
|
638
|
+
|
|
639
|
+
### The hand-off at X 4
|
|
640
|
+
|
|
641
|
+
`X` is always even (`p` starts even and steps by 2, and 48, 32 and 384
|
|
642
|
+
are even), so a column passes X 4 exactly once a lap. At X 4 the glyph
|
|
643
|
+
occupies X 8 to 23, all under the left border, which ends at X 23, so
|
|
644
|
+
the character can change without a visible glitch. The loop records the
|
|
645
|
+
sprite number and the re-render is done after the registers are
|
|
646
|
+
written, from the message index `tidx`, which wraps at the `$FF` that
|
|
647
|
+
ends the text. Sprite 0 starts at X 6 so that its first hand-off is on
|
|
648
|
+
frame 1, and the message then streams in one character per 24 frames.
|
|
649
|
+
Before its first hand-off a sprite shows the zeros the slots were
|
|
650
|
+
cleared to.
|
|
651
|
+
|
|
652
|
+
### The render
|
|
653
|
+
|
|
654
|
+
The eight glyph bytes are read from the character ROM at
|
|
655
|
+
`$D000 + code * 8` with `$01` set to `$33`, which maps the ROM over the
|
|
656
|
+
I/O page, into an eight-byte buffer, and `$01` goes back to `$37` before
|
|
657
|
+
anything touches a register. Interrupts are off throughout (`sei` at
|
|
658
|
+
start), so no handler runs while I/O is hidden. Then each glyph byte is
|
|
659
|
+
an index into `t0`, `t1` and `t2`, and each table value is stored twice
|
|
660
|
+
through the zero-page pointer, at the two sprite rows the glyph row
|
|
661
|
+
becomes. The unrolled `.for` gives every store a constant `Y`, so the
|
|
662
|
+
render is straight-line code and its 715 cycles do not vary.
|
|
663
|
+
|
|
664
|
+
### The sine
|
|
665
|
+
|
|
666
|
+
`siny` is `round(40 sin)` as a signed byte, added to 130. The amplitude
|
|
667
|
+
is well under 128, so no entry reaches 256 and wraps to zero, the
|
|
668
|
+
failure `sine_table_peak_wraps_to_zero` in `docs/pitfalls/maths.md`
|
|
669
|
+
describes for amplitude 128. Sprite `k` reads the table at
|
|
670
|
+
`(p + 32k) & 255`, the low byte of `p` plus 32 per column, so
|
|
671
|
+
neighbours are an eighth of a period apart and the eight span seven
|
|
672
|
+
eighths of the wave.
|
|
673
|
+
|
|
674
|
+
## What it does not establish
|
|
675
|
+
|
|
676
|
+
Nothing here was run on hardware; the positions, the `$D010` behaviour
|
|
677
|
+
and the cycle counts are VICE x64sc figures. It shows eight columns and
|
|
678
|
+
no more; a wider scroller needs a multiplexer, which this recipe does not
|
|
679
|
+
build. The glyphs are single-colour doublings of the ROM capitals;
|
|
680
|
+
multicolour or hand-drawn sprite fonts are not tried. The 300-frame
|
|
681
|
+
freeze is for the pin, not part of the technique.
|