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,696 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: sprite-border-scroller
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [sprite_border_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, D011, D012, D015, D017, D019, D01A, D01B, D01C, D01D, D020, D021, D027, D028, D029, D02A, D02B, D02C, D02D, D02E, DC04, DC05, DC0D, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler Sprite Border Scroller
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A text scroller of eight hardware sprites that runs in the lower border,
|
|
19
|
+
underneath the display, so the forty by twenty-five character screen is
|
|
20
|
+
left whole for whatever else the program wants to show. The border is
|
|
21
|
+
opened every frame the way `topbottom-border-open.md` does it: a raster
|
|
22
|
+
interrupt on line 249 clears RSEL, so neither of the VIC-II's bottom
|
|
23
|
+
comparison lines is ever matched and the vertical border flip-flop is
|
|
24
|
+
never set; a second interrupt on line 20 of the next frame puts RSEL
|
|
25
|
+
back. That second interrupt also moves the sprites. Every sprite has
|
|
26
|
+
Y 254, so its 21 rows are drawn from raster line 255 down, in what is
|
|
27
|
+
normally border; a shared 9-bit scroll position `p` steps down by 2 a
|
|
28
|
+
frame and sprite `k` sits at `X = (p + 48k) mod 384`, enabled only while
|
|
29
|
+
X is 0 to 343. When a sprite reaches X 4 its glyph is wholly under the
|
|
30
|
+
left border and it takes the next character of the text, rendered from
|
|
31
|
+
the character ROM into its own 64-byte slot exactly as
|
|
32
|
+
`dypp-sprite-scroller.md` renders it. After 300 frames `p` is frozen and
|
|
33
|
+
the picture is static. Both interrupt handlers are timed with CIA 1
|
|
34
|
+
timer A and logged to RAM. This is the `sprite_border_scroller`
|
|
35
|
+
technique.
|
|
36
|
+
|
|
37
|
+
Verified in VICE x64sc: at the pinned cycle count the white glyph rows
|
|
38
|
+
sit on screenshot rows 241 to 254 on PAL (raster lines 257 to 270) and
|
|
39
|
+
229 to 242 on NTSC, every one of them below the line-251 border edge,
|
|
40
|
+
and the two runs per model are byte-identical. A control build with the
|
|
41
|
+
RSEL write left out has no white pixel anywhere below the display: the
|
|
42
|
+
border covers the sprites.
|
|
43
|
+
|
|
44
|
+
## Source
|
|
45
|
+
|
|
46
|
+
```asm
|
|
47
|
+
// sprite-border-scroller.asm
|
|
48
|
+
// A text scroller of eight hardware sprites standing in the opened lower
|
|
49
|
+
// border. Two plain raster interrupts through $0314 open the border the way
|
|
50
|
+
// topbottom-border-open.asm does: RSEL is cleared on line 249, after line
|
|
51
|
+
// 247's bottom comparison has passed and before line 251's arrives, so the
|
|
52
|
+
// vertical border flip-flop is never set and the rest of the frame is drawn
|
|
53
|
+
// as background. RSEL is put back on line 20 of the next frame, and that
|
|
54
|
+
// same interrupt moves the sprites: a shared 9-bit scroll position p steps
|
|
55
|
+
// down by 2 a frame; sprite k sits at X = (p + 48k) mod 384 and every sprite
|
|
56
|
+
// has Y = 254, so its 21 rows are drawn from raster line 255, below the
|
|
57
|
+
// display. A sprite is enabled only while X is 0..343; when X reaches 4 its
|
|
58
|
+
// glyph is wholly under the left border, so it takes the next character of
|
|
59
|
+
// the text and re-renders it from the character ROM into its own 64-byte
|
|
60
|
+
// slot (a 2x2 block per glyph pixel, sprite rows 2..17, columns 4..19),
|
|
61
|
+
// as dypp-sprite-scroller.asm does. After FRAMES frames p is frozen and the
|
|
62
|
+
// picture is static. $3FFF is written to zero because the VIC fetches its
|
|
63
|
+
// idle-state graphics from there and would draw its set bits over the
|
|
64
|
+
// opened area.
|
|
65
|
+
//
|
|
66
|
+
// Both handlers are timed with CIA 1 timer A (one-shot from $FFFF) and
|
|
67
|
+
// logged to RAM for a -moncommands dump. Build with -define NOOPEN for the
|
|
68
|
+
// control: the line-249 handler runs but leaves RSEL alone, so the border
|
|
69
|
+
// stays closed and covers the sprites.
|
|
70
|
+
// Region: both.
|
|
71
|
+
|
|
72
|
+
.const SCREEN = $0400
|
|
73
|
+
.const SPRBASE = $2000 // eight 64-byte slots $2000..$21c0, pointers $80..$87
|
|
74
|
+
.const XSTEP = 48 // pixels between adjacent columns
|
|
75
|
+
.const SPRITE_Y = 254 // first row drawn on raster line 255
|
|
76
|
+
.const OPEN_LINE = 249 // 248, 249 and 250 open; 247 and 251 do not
|
|
77
|
+
.const RESTORE_LINE = 20 // anywhere from 252 to 246 of the next frame
|
|
78
|
+
.const FRAMES = 300 // updates before p is frozen
|
|
79
|
+
.const OLOG = $3000 // open handler time per frame, 2 bytes each ($ffff - timer)
|
|
80
|
+
.const RLOG = $3400 // restore handler time per frame, 2 bytes each
|
|
81
|
+
.const DONE = $02ff // 1 from the frame the picture is frozen
|
|
82
|
+
.const CAPLEN = 27 // the caption's length, centred on row 12
|
|
83
|
+
.const CAPCOL = (40 - CAPLEN) / 2
|
|
84
|
+
|
|
85
|
+
.const ptr = $fb // zero page: sprite slot pointer
|
|
86
|
+
.const src = $fd // zero page: character ROM pointer
|
|
87
|
+
|
|
88
|
+
// Each glyph bit becomes two sprite bits: dbl(b) is the 16-bit doubling of
|
|
89
|
+
// byte b. Glyph column gx lands on sprite columns 4+2gx and 5+2gx, so
|
|
90
|
+
// byte 0 of the sprite row takes the top 4 bits of dbl, byte 1 the middle 8
|
|
91
|
+
// and byte 2 the bottom 4 shifted into its high nibble.
|
|
92
|
+
.function dbl(b) {
|
|
93
|
+
.var e = 0
|
|
94
|
+
.for (var i = 0; i < 8; i++) {
|
|
95
|
+
.if (((b >> i) & 1) == 1) .eval e = e | (3 << (2 * i))
|
|
96
|
+
}
|
|
97
|
+
.return e
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.pc = $0801 "basic"
|
|
101
|
+
:BasicUpstart(start)
|
|
102
|
+
|
|
103
|
+
.pc = $0810 "code"
|
|
104
|
+
start:
|
|
105
|
+
sei
|
|
106
|
+
lda #$7f
|
|
107
|
+
sta $dc0d // mask every CIA1 source
|
|
108
|
+
lda $dc0d // and drop a pending one
|
|
109
|
+
|
|
110
|
+
lda #0
|
|
111
|
+
sta $3fff // idle-state graphics byte: zero, so the
|
|
112
|
+
// opened area is plain background
|
|
113
|
+
sta $d020 // border black
|
|
114
|
+
sta $d021 // background black
|
|
115
|
+
sta frame
|
|
116
|
+
sta frame+1
|
|
117
|
+
sta tidx
|
|
118
|
+
sta rcount
|
|
119
|
+
sta DONE
|
|
120
|
+
lda #<6 // p starts at 6: sprite 0 reaches X 4 on frame 1
|
|
121
|
+
sta pos
|
|
122
|
+
lda #>6
|
|
123
|
+
sta pos+1
|
|
124
|
+
|
|
125
|
+
ldx #0 // clear the screen and the eight slots
|
|
126
|
+
lda #$20
|
|
127
|
+
clr:
|
|
128
|
+
sta SCREEN,x
|
|
129
|
+
sta SCREEN+$100,x
|
|
130
|
+
sta SCREEN+$200,x
|
|
131
|
+
sta SCREEN+$300,x
|
|
132
|
+
inx
|
|
133
|
+
bne clr
|
|
134
|
+
lda #0
|
|
135
|
+
clr2:
|
|
136
|
+
sta SPRBASE,x
|
|
137
|
+
sta SPRBASE+$100,x
|
|
138
|
+
inx
|
|
139
|
+
bne clr2
|
|
140
|
+
|
|
141
|
+
ldx #CAPLEN-1 // the caption on row 12, white
|
|
142
|
+
cap:
|
|
143
|
+
lda caption,x
|
|
144
|
+
sta SCREEN+12*40+CAPCOL,x
|
|
145
|
+
lda #1
|
|
146
|
+
sta $d800+12*40+CAPCOL,x
|
|
147
|
+
dex
|
|
148
|
+
bpl cap
|
|
149
|
+
|
|
150
|
+
ldx #7 // pointers $80+k, white, Y 254, no expansion
|
|
151
|
+
setup:
|
|
152
|
+
txa
|
|
153
|
+
clc
|
|
154
|
+
adc #SPRBASE/64
|
|
155
|
+
sta SCREEN+$3f8,x
|
|
156
|
+
lda #1
|
|
157
|
+
sta $d027,x
|
|
158
|
+
lda #SPRITE_Y
|
|
159
|
+
ldy pairs,x
|
|
160
|
+
sta $d001,y
|
|
161
|
+
dex
|
|
162
|
+
bpl setup
|
|
163
|
+
lda #0
|
|
164
|
+
sta $d017
|
|
165
|
+
sta $d01d
|
|
166
|
+
sta $d01c
|
|
167
|
+
sta $d01b
|
|
168
|
+
sta $d010
|
|
169
|
+
sta $d015 // enabled per sprite by the update
|
|
170
|
+
|
|
171
|
+
lda #<open
|
|
172
|
+
sta $0314
|
|
173
|
+
lda #>open
|
|
174
|
+
sta $0315
|
|
175
|
+
lda #$1b
|
|
176
|
+
sta $d011 // DEN=1, RSEL=1, YSCROLL=3, RST8=0
|
|
177
|
+
lda #OPEN_LINE
|
|
178
|
+
sta $d012
|
|
179
|
+
lda #$01
|
|
180
|
+
sta $d01a // raster source on
|
|
181
|
+
sta $d019 // stale flag off
|
|
182
|
+
cli
|
|
183
|
+
jmp *
|
|
184
|
+
|
|
185
|
+
// Line OPEN_LINE, entered on cycle 37-43: RSEL to 0 with YSCROLL and DEN
|
|
186
|
+
// kept, bit 7 masked off (on a read it is the raster's ninth bit).
|
|
187
|
+
open:
|
|
188
|
+
cld // the log arithmetic must be binary
|
|
189
|
+
lda #$ff // start the stopwatch
|
|
190
|
+
sta $dc04
|
|
191
|
+
sta $dc05
|
|
192
|
+
lda #$19
|
|
193
|
+
sta $dc0e
|
|
194
|
+
#if !NOOPEN
|
|
195
|
+
lda $d011
|
|
196
|
+
and #%01110111
|
|
197
|
+
sta $d011 // the control build omits this write
|
|
198
|
+
#endif
|
|
199
|
+
lda #RESTORE_LINE
|
|
200
|
+
sta $d012
|
|
201
|
+
lda #<restore
|
|
202
|
+
sta $0314
|
|
203
|
+
lda #>restore
|
|
204
|
+
sta $0315
|
|
205
|
+
lda #$01
|
|
206
|
+
sta $d019
|
|
207
|
+
lda #$08 // stop the stopwatch, log it at OLOG + 2*frame
|
|
208
|
+
sta $dc0e
|
|
209
|
+
lda #<OLOG
|
|
210
|
+
sta ptr
|
|
211
|
+
lda #>OLOG
|
|
212
|
+
sta ptr+1
|
|
213
|
+
jsr logtime
|
|
214
|
+
jmp $ea81 // pla/tay/pla/tax/pla/rti
|
|
215
|
+
|
|
216
|
+
// Line RESTORE_LINE: RSEL back to 1 so next frame's line 247 is not a
|
|
217
|
+
// bottom comparison either; then the position update and any hand-off,
|
|
218
|
+
// while no sprite is being drawn on either model.
|
|
219
|
+
restore:
|
|
220
|
+
cld
|
|
221
|
+
lda #$ff // start the stopwatch
|
|
222
|
+
sta $dc04
|
|
223
|
+
sta $dc05
|
|
224
|
+
lda #$19
|
|
225
|
+
sta $dc0e
|
|
226
|
+
lda $d011
|
|
227
|
+
and #%01111111
|
|
228
|
+
ora #%00001000
|
|
229
|
+
sta $d011
|
|
230
|
+
lda #OPEN_LINE
|
|
231
|
+
sta $d012
|
|
232
|
+
lda #<open
|
|
233
|
+
sta $0314
|
|
234
|
+
lda #>open
|
|
235
|
+
sta $0315
|
|
236
|
+
lda #$01
|
|
237
|
+
sta $d019
|
|
238
|
+
|
|
239
|
+
lda frame+1 // frozen after FRAMES updates
|
|
240
|
+
cmp #>FRAMES
|
|
241
|
+
bne go
|
|
242
|
+
lda frame
|
|
243
|
+
cmp #<FRAMES
|
|
244
|
+
bne go
|
|
245
|
+
lda #1
|
|
246
|
+
sta DONE
|
|
247
|
+
jmp done
|
|
248
|
+
go:
|
|
249
|
+
lda pos // p = (p - 2) mod 384
|
|
250
|
+
sec
|
|
251
|
+
sbc #2
|
|
252
|
+
sta pos
|
|
253
|
+
lda pos+1
|
|
254
|
+
sbc #0
|
|
255
|
+
sta pos+1
|
|
256
|
+
bpl !+
|
|
257
|
+
lda pos
|
|
258
|
+
clc
|
|
259
|
+
adc #<384
|
|
260
|
+
sta pos
|
|
261
|
+
lda pos+1
|
|
262
|
+
adc #>384
|
|
263
|
+
sta pos+1
|
|
264
|
+
!:
|
|
265
|
+
lda #0
|
|
266
|
+
sta msb
|
|
267
|
+
sta ena
|
|
268
|
+
sta pend
|
|
269
|
+
lda pos // running X = p + 48k, 16-bit
|
|
270
|
+
sta xl
|
|
271
|
+
lda pos+1
|
|
272
|
+
sta xh
|
|
273
|
+
ldx #0
|
|
274
|
+
next:
|
|
275
|
+
lda xh // X >= 384 ? X -= 384
|
|
276
|
+
beq inrange
|
|
277
|
+
cmp #1
|
|
278
|
+
bne sub384
|
|
279
|
+
lda xl
|
|
280
|
+
cmp #<384
|
|
281
|
+
bcc inrange
|
|
282
|
+
sub384:
|
|
283
|
+
lda xl
|
|
284
|
+
sec
|
|
285
|
+
sbc #<384
|
|
286
|
+
sta xl
|
|
287
|
+
lda xh
|
|
288
|
+
sbc #>384
|
|
289
|
+
sta xh
|
|
290
|
+
inrange:
|
|
291
|
+
lda xh
|
|
292
|
+
beq onscreen // X < 256: on screen, no MSB
|
|
293
|
+
lda xl
|
|
294
|
+
cmp #344-256
|
|
295
|
+
bcs offscreen // X 344..383: sprite off this frame
|
|
296
|
+
lda bits,x // X 256..343: MSB set
|
|
297
|
+
ora msb
|
|
298
|
+
sta msb
|
|
299
|
+
onscreen:
|
|
300
|
+
lda bits,x
|
|
301
|
+
ora ena
|
|
302
|
+
sta ena
|
|
303
|
+
offscreen:
|
|
304
|
+
lda xh // X == 4: glyph wholly under the left border
|
|
305
|
+
bne nohand
|
|
306
|
+
lda xl
|
|
307
|
+
cmp #4
|
|
308
|
+
bne nohand
|
|
309
|
+
inx // pend = k + 1
|
|
310
|
+
stx pend
|
|
311
|
+
dex
|
|
312
|
+
nohand:
|
|
313
|
+
ldy pairs,x
|
|
314
|
+
lda xl
|
|
315
|
+
sta $d000,y
|
|
316
|
+
clc // next column: X += 48
|
|
317
|
+
adc #XSTEP
|
|
318
|
+
sta xl
|
|
319
|
+
bcc !+
|
|
320
|
+
inc xh
|
|
321
|
+
!: inx
|
|
322
|
+
cpx #8
|
|
323
|
+
bne next
|
|
324
|
+
lda msb
|
|
325
|
+
sta $d010
|
|
326
|
+
lda ena
|
|
327
|
+
sta $d015
|
|
328
|
+
|
|
329
|
+
lda pend // a sprite reached X 4: hand it the next character
|
|
330
|
+
beq nohandoff
|
|
331
|
+
tax
|
|
332
|
+
dex
|
|
333
|
+
ldy tidx
|
|
334
|
+
lda text,y
|
|
335
|
+
cmp #$ff
|
|
336
|
+
bne !+
|
|
337
|
+
ldy #0
|
|
338
|
+
sty tidx
|
|
339
|
+
lda text
|
|
340
|
+
!: sta code
|
|
341
|
+
inc tidx
|
|
342
|
+
jsr render
|
|
343
|
+
inc rcount
|
|
344
|
+
nohandoff:
|
|
345
|
+
lda #$08 // stop the stopwatch, log it at RLOG + 2*frame
|
|
346
|
+
sta $dc0e
|
|
347
|
+
lda #<RLOG
|
|
348
|
+
sta ptr
|
|
349
|
+
lda #>RLOG
|
|
350
|
+
sta ptr+1
|
|
351
|
+
jsr logtime
|
|
352
|
+
inc frame
|
|
353
|
+
bne !+
|
|
354
|
+
inc frame+1
|
|
355
|
+
!: jmp $ea31 // full KERNAL service once a frame
|
|
356
|
+
done:
|
|
357
|
+
lda #$08
|
|
358
|
+
sta $dc0e
|
|
359
|
+
jmp $ea31
|
|
360
|
+
|
|
361
|
+
// Store $ffff - timer at (ptr) + 2*frame, ptr pointing at a log base.
|
|
362
|
+
logtime:
|
|
363
|
+
lda frame
|
|
364
|
+
asl
|
|
365
|
+
sta off
|
|
366
|
+
lda frame+1
|
|
367
|
+
rol
|
|
368
|
+
sta off+1
|
|
369
|
+
lda off
|
|
370
|
+
clc
|
|
371
|
+
adc ptr
|
|
372
|
+
sta ptr
|
|
373
|
+
lda off+1
|
|
374
|
+
adc ptr+1
|
|
375
|
+
sta ptr+1
|
|
376
|
+
ldy #0
|
|
377
|
+
lda $dc04
|
|
378
|
+
eor #$ff
|
|
379
|
+
sta (ptr),y
|
|
380
|
+
iny
|
|
381
|
+
lda $dc05
|
|
382
|
+
eor #$ff
|
|
383
|
+
sta (ptr),y
|
|
384
|
+
rts
|
|
385
|
+
|
|
386
|
+
// Render screen code `code` into sprite slot X (0..7). The eight glyph
|
|
387
|
+
// bytes are copied out of the character ROM with $01 = $33, then each is
|
|
388
|
+
// expanded through three tables into two identical sprite rows.
|
|
389
|
+
render:
|
|
390
|
+
lda slotlo,x
|
|
391
|
+
sta ptr
|
|
392
|
+
lda slothi,x
|
|
393
|
+
sta ptr+1
|
|
394
|
+
lda #0
|
|
395
|
+
sta src+1
|
|
396
|
+
lda code // ROM address = $d000 + code * 8
|
|
397
|
+
asl
|
|
398
|
+
rol src+1
|
|
399
|
+
asl
|
|
400
|
+
rol src+1
|
|
401
|
+
asl
|
|
402
|
+
rol src+1
|
|
403
|
+
sta src
|
|
404
|
+
lda src+1
|
|
405
|
+
ora #$d0
|
|
406
|
+
sta src+1
|
|
407
|
+
lda #$33
|
|
408
|
+
sta $01
|
|
409
|
+
ldy #7
|
|
410
|
+
!: lda (src),y
|
|
411
|
+
sta gbuf,y
|
|
412
|
+
dey
|
|
413
|
+
bpl !-
|
|
414
|
+
lda #$37
|
|
415
|
+
sta $01
|
|
416
|
+
.for (var r = 0; r < 8; r++) {
|
|
417
|
+
ldx gbuf+r
|
|
418
|
+
lda t0,x // sprite rows 2+2r and 3+2r, bytes 0..2
|
|
419
|
+
ldy #6*r+6
|
|
420
|
+
sta (ptr),y
|
|
421
|
+
ldy #6*r+9
|
|
422
|
+
sta (ptr),y
|
|
423
|
+
lda t1,x
|
|
424
|
+
ldy #6*r+7
|
|
425
|
+
sta (ptr),y
|
|
426
|
+
ldy #6*r+10
|
|
427
|
+
sta (ptr),y
|
|
428
|
+
lda t2,x
|
|
429
|
+
ldy #6*r+8
|
|
430
|
+
sta (ptr),y
|
|
431
|
+
ldy #6*r+11
|
|
432
|
+
sta (ptr),y
|
|
433
|
+
}
|
|
434
|
+
rts
|
|
435
|
+
|
|
436
|
+
caption: .text "sprites in the lower border" // lowercase: .text is screen codes
|
|
437
|
+
bits: .byte 1, 2, 4, 8, 16, 32, 64, 128
|
|
438
|
+
pairs: .byte 0, 2, 4, 6, 8, 10, 12, 14
|
|
439
|
+
slotlo: .fill 8, <(SPRBASE + i * 64)
|
|
440
|
+
slothi: .fill 8, >(SPRBASE + i * 64)
|
|
441
|
+
|
|
442
|
+
// The message: screen codes, $ff ends it and it wraps.
|
|
443
|
+
text: .text "the border is open and the words walk through it "
|
|
444
|
+
.byte $ff
|
|
445
|
+
|
|
446
|
+
.align $100
|
|
447
|
+
t0: .fill 256, dbl(i) >> 12
|
|
448
|
+
t1: .fill 256, (dbl(i) >> 4) & $ff
|
|
449
|
+
t2: .fill 256, (dbl(i) & $0f) << 4
|
|
450
|
+
|
|
451
|
+
.pc = $3800 "state" virtual
|
|
452
|
+
msb: .byte 0 // $d010 as written
|
|
453
|
+
ena: .byte 0 // $d015 as written
|
|
454
|
+
pend: .byte 0 // sprite number + 1 due a hand-off, or 0
|
|
455
|
+
frame: .word 0
|
|
456
|
+
pos: .word 0 // p, 0..383
|
|
457
|
+
tidx: .byte 0 // next character of text
|
|
458
|
+
rcount: .byte 0 // renders so far
|
|
459
|
+
xl: .byte 0
|
|
460
|
+
xh: .byte 0
|
|
461
|
+
code: .byte 0
|
|
462
|
+
off: .word 0 // 2*frame, the log offset
|
|
463
|
+
gbuf: .fill 8, 0
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
## Build
|
|
467
|
+
|
|
468
|
+
```bash
|
|
469
|
+
java -jar KickAss.jar sprite-border-scroller.asm -o sprite-border-scroller.prg
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
For the control, which runs the same two interrupts but never clears
|
|
473
|
+
RSEL:
|
|
474
|
+
|
|
475
|
+
```bash
|
|
476
|
+
java -jar KickAss.jar sprite-border-scroller.asm -define NOOPEN -o sprite-border-scroller-noopen.prg
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
## Expected output
|
|
480
|
+
|
|
481
|
+
A black screen and a black border, with `SPRITES IN THE LOWER BORDER` in
|
|
482
|
+
white on character row 12, centred. Below the display, where the bottom
|
|
483
|
+
border would be, white capital letters 16 pixels wide and 14 tall (each
|
|
484
|
+
glyph pixel a 2 by 2 block; the ROM capitals use seven of their eight
|
|
485
|
+
rows) walk left two pixels a frame, 48 pixels apart. The message is
|
|
486
|
+
`THE BORDER IS OPEN AND THE WORDS WALK THROUGH IT`, followed by four
|
|
487
|
+
spaces, repeating. The first character enters at the right edge about
|
|
488
|
+
twenty frames in; before that the sprites are blank. At most seven
|
|
489
|
+
glyphs are visible at once; for twenty frames in every twenty-four the
|
|
490
|
+
eighth sprite is disabled between X 344 and X 383, carrying the next
|
|
491
|
+
character, and for the other four it is enabled under the left border at
|
|
492
|
+
X 0 to 6. Nothing else moves; there is no frame counter on this page's
|
|
493
|
+
screen.
|
|
494
|
+
|
|
495
|
+
At frame 300 the picture freezes and holds. It shows, left to right,
|
|
496
|
+
`O R D E R`, a blank column, and `I`.
|
|
497
|
+
|
|
498
|
+
Screenshots from the runs this page describes:
|
|
499
|
+
`screenshots/sprite-border-scroller.png` (PAL) and
|
|
500
|
+
`screenshots/sprite-border-scroller-ntsc.png` (NTSC), both at
|
|
501
|
+
10,000,000 cycles.
|
|
502
|
+
|
|
503
|
+
### The pinned frame: 10,000,000 cycles, frame 300 frozen
|
|
504
|
+
|
|
505
|
+
`p` after 300 steps of 2 from 6 is `(6 - 600) mod 384 = 174`, the same
|
|
506
|
+
frozen position as the DYPP recipe, because the position rule is the
|
|
507
|
+
same. Hand-off `n` gives character `n` of the message; sprite `k` was
|
|
508
|
+
handed characters `k` and `k + 8`, sprites 0 to 4 twice and 5 to 7
|
|
509
|
+
once, thirteen hand-offs in all. The VIC registers were read back with a
|
|
510
|
+
`-moncommands` store trace on `$02FF` (`m d000 d015`), and the same
|
|
511
|
+
dump is what the cycle logs below came from.
|
|
512
|
+
|
|
513
|
+
| Sprite | Character | X | On screen | $D010 bit | Predicted first lit column | Measured columns, both models |
|
|
514
|
+
|---|---|---|---|---|---|---|
|
|
515
|
+
| 5 | `O` (char 5) | 30 | yes | 0 | 44 | x 44 to 55 |
|
|
516
|
+
| 6 | `R` (char 6) | 78 | yes | 0 | 92 | x 92 to 103 |
|
|
517
|
+
| 7 | `D` (char 7) | 126 | yes | 0 | 140 | x 140 to 151 |
|
|
518
|
+
| 0 | `E` (char 8) | 174 | yes | 0 | 188 | x 188 to 199 |
|
|
519
|
+
| 1 | `R` (char 9) | 222 | yes | 0 | 236 | x 236 to 247 |
|
|
520
|
+
| 2 | space (char 10) | 270 | yes, blank | 1 | no ink | none |
|
|
521
|
+
| 3 | `I` (char 11) | 318 | yes | 1 | 334 | x 334 to 341 |
|
|
522
|
+
| 4 | `S` (char 12) | 366 | no, disabled | 0 | not drawn | none |
|
|
523
|
+
|
|
524
|
+
`$D010` reads `$0C` and `$D015` reads `$EF`; the eight Y registers all
|
|
525
|
+
read 254; the X low bytes read 174, 222, 14, 62, 110, 30, 78, 126. A
|
|
526
|
+
sprite pixel column `c` of a sprite at X lands on screenshot column
|
|
527
|
+
`X + c + 8` (the display's X 24 is screenshot column 32), so a glyph
|
|
528
|
+
whose ROM bitmap starts at column `g` first lights at `X + 2g + 12`:
|
|
529
|
+
`g = 1` for `O`, `R`, `D` and `E`, `g = 2` for `I`.
|
|
530
|
+
|
|
531
|
+
The white rows, measured on the screenshot with a script:
|
|
532
|
+
|
|
533
|
+
- **PAL** (384 by 272, screenshot row = raster line minus 16): white
|
|
534
|
+
pixels below the display on rows 241 to 254, raster lines 257 to 270,
|
|
535
|
+
and on no other row past 235 (line 251). That is sprite rows 2 to 15:
|
|
536
|
+
the render puts glyph row `gy` on sprite rows `2 + 2gy` and
|
|
537
|
+
`3 + 2gy`, and the ROM capitals leave glyph row 7 blank, so sprite
|
|
538
|
+
rows 16 and 17 carry no ink. Sprite rows 0 and 1 and 18 to 20 are
|
|
539
|
+
margin. All 21 sprite rows, lines 255 to 275, are inside the PAL
|
|
540
|
+
frame; 632 white pixels lie below line 251, and 591 above it, which is
|
|
541
|
+
the caption.
|
|
542
|
+
- **NTSC** (384 by 247, screenshot row = raster line minus 28): white
|
|
543
|
+
pixels on rows 229 to 242, the same fourteen row counts as PAL row for
|
|
544
|
+
row (56, 56, 40, 40, 40, 40, 48, 48, 40, 40, 40, 40, 52, 52), 632
|
|
545
|
+
pixels. The NTSC frame ends at line 262, so rows 229 to 234 are lines
|
|
546
|
+
257 to 262 of the frame the sprite started in and rows 235 to 242 are
|
|
547
|
+
lines 0 to 7 of the next frame: the sprite's row counter runs straight
|
|
548
|
+
through the frame wrap, as `topbottom-border-open.md` measured for its
|
|
549
|
+
parked sprite. Of the 21 sprite rows, rows 0 to 19 (lines 255 to 262,
|
|
550
|
+
then 0 to 11) are in the picture and row 20 falls on line 12, one past
|
|
551
|
+
the picture's last row 246; it is a blank margin row, so no ink is
|
|
552
|
+
lost. Whether line 12's row is visible on a real NTSC set is not
|
|
553
|
+
measured here.
|
|
554
|
+
|
|
555
|
+
The cycle count was chosen for a static picture, not for a beam
|
|
556
|
+
position: `DONE` (`$02FF`) is first stored with 1 at cycle 8,885,887 on
|
|
557
|
+
PAL (raster line 21, inside the restore handler) and 8,241,204 on NTSC,
|
|
558
|
+
so at 10,000,000 the picture has held for about 56 PAL frames or 102
|
|
559
|
+
NTSC frames (arithmetic from 19,656 and 17,095 cycles a frame), and the
|
|
560
|
+
exit lands in a frame identical to the one before it whichever row the
|
|
561
|
+
beam is on. Two runs per model gave byte-identical PNGs (md5
|
|
562
|
+
`f26f8d902cd2bf17f7cde1c21b66699c` PAL, `19d0a6defa458180dc6084155546e348`
|
|
563
|
+
NTSC).
|
|
564
|
+
|
|
565
|
+
### Mid-motion, not pinned: 6,000,000 cycles
|
|
566
|
+
|
|
567
|
+
About 154 frames in on PAL. Seven hand-offs have happened (frames 1, 25,
|
|
568
|
+
49, 73, 97, 121 and 145) and the picture shows `T H E`, a gap, `B O`,
|
|
569
|
+
white pixels on the same rows 241 to 254 spanning columns 98 to 349; the
|
|
570
|
+
`R` handed over at frame 145 is still in the disabled gap and re-enters
|
|
571
|
+
at frame 168. On NTSC the same rows 229 to 242, columns 68 to 319, a few
|
|
572
|
+
frames further on because NTSC frames are shorter. A picture taken while
|
|
573
|
+
`p` is moving is not pinned: the exit screenshot is the draw buffer at
|
|
574
|
+
the cycle limit, and a limit that lands inside lines 255 to 275 would
|
|
575
|
+
show the previous frame's rows below the beam.
|
|
576
|
+
|
|
577
|
+
### The control: RSEL never cleared
|
|
578
|
+
|
|
579
|
+
`-define NOOPEN` leaves out the three instructions that clear RSEL and
|
|
580
|
+
changes nothing else: the same two interrupts run, the same sprites are
|
|
581
|
+
positioned and enabled, the same `$D010` and `$D015` are written. Both
|
|
582
|
+
models: zero white pixels on any row from line 251 down (screenshot rows
|
|
583
|
+
235 to 271 on PAL, 223 to 246 on NTSC), 591 white pixels in the whole
|
|
584
|
+
picture, all of them the caption. The sprites are there, enabled, at
|
|
585
|
+
Y 254; the border is drawn over them.
|
|
586
|
+
|
|
587
|
+
### Cycle costs, CIA 1 timer A
|
|
588
|
+
|
|
589
|
+
Each handler loads timer A with `$FFFF`, starts it one-shot
|
|
590
|
+
(`$DC0E = $19`), stops it (`$DC0E = $08`) at the end of its own work and
|
|
591
|
+
stores `$FFFF` minus the reading, two bytes per frame, at `$3000` (the
|
|
592
|
+
line-249 handler) and `$3400` (the line-20 handler); 300 entries each,
|
|
593
|
+
read back with the same `-moncommands` dump. PAL and NTSC logs are
|
|
594
|
+
identical to the cycle. The figures are raw: the bracket's own
|
|
595
|
+
`LDA/STA/LDA` after the start and `LDA #$08 / STA` before the stop are
|
|
596
|
+
inside them.
|
|
597
|
+
|
|
598
|
+
- **Line 249, the open**: 39 cycles in all 300 frames. It is the
|
|
599
|
+
read-modify-write of `$D011`, the next raster compare, the vector
|
|
600
|
+
swap and the acknowledge.
|
|
601
|
+
- **Line 20, the restore and the position update**: 790 cycles in 182
|
|
602
|
+
of the 300 frames; minimum 734 (4 frames), maximum 811 (2 frames)
|
|
603
|
+
when no sprite is handed a character, the other values being 757
|
|
604
|
+
(21), 767 (36), 775 (8) and 798 (34). The spread is the per-column
|
|
605
|
+
branches: how many of the eight need the 384 subtracted, how many are
|
|
606
|
+
past 255, whether one is off, whether one is at X 4. In the thirteen
|
|
607
|
+
hand-off frames the handler costs 1,506 (2), 1,539 (9) or 1,547 (2),
|
|
608
|
+
which is the update plus the render.
|
|
609
|
+
- **Both handlers together**, frame by frame: 829 cycles in 182 frames,
|
|
610
|
+
minimum 773, maximum 1,586, the worst frame being a hand-off. That is
|
|
611
|
+
about 25 PAL raster lines, from line 20 to about line 46, all above
|
|
612
|
+
the display and below the last sprite row on either model. The
|
|
613
|
+
`$EA31` exit and the KERNAL's 29-cycle entry are outside the brackets.
|
|
614
|
+
|
|
615
|
+
## Why this works
|
|
616
|
+
|
|
617
|
+
### The border flip-flop and the sprites under it
|
|
618
|
+
|
|
619
|
+
`topbottom-border-open.md` has the mechanism in full: the vertical
|
|
620
|
+
border flip-flop is set only when the raster reaches the bottom
|
|
621
|
+
comparison line, 251 with RSEL set or 247 with it clear, and reset only
|
|
622
|
+
at the top one while DEN is set. RSEL is 1 while line 247 goes by and 0
|
|
623
|
+
by the time line 251 arrives, so no bottom comparison matches, the
|
|
624
|
+
flip-flop stays clear, and everything from line 251 to the end of the
|
|
625
|
+
frame and on through the next frame's top border is drawn as
|
|
626
|
+
background. `OPEN_LINE` is that recipe's 249, the middle of the three
|
|
627
|
+
lines 248 to 250 it measured as working with a plain `$0314`
|
|
628
|
+
interrupt; `RESTORE_LINE` is 20, inside the 252-to-246 window it swept,
|
|
629
|
+
chosen here so that the same handler can move the sprites at a moment
|
|
630
|
+
when none of them is being drawn on either model (the last sprite row
|
|
631
|
+
is line 275 on PAL and line 12 of the following frame on NTSC).
|
|
632
|
+
|
|
633
|
+
While the flip-flop is set the border colour has priority over sprites
|
|
634
|
+
and graphics alike, which is what the control build shows: seven
|
|
635
|
+
enabled sprites at Y 254 and not one white pixel. Opening the border
|
|
636
|
+
does not put the sprites anywhere new; it stops the border being drawn
|
|
637
|
+
over the place they already were. `$3FFF` is written to zero because the
|
|
638
|
+
VIC is in its idle state below the display and fetches its graphics
|
|
639
|
+
from the last byte of the video bank: with a text mode and a zero
|
|
640
|
+
byte the opened area is plain background, and with a non-zero byte it
|
|
641
|
+
would carry that byte's set bits as a black stripe pattern, invisible
|
|
642
|
+
against this page's black background but drawn over a sprite pixel
|
|
643
|
+
where the two coincide. In VICE 3.10 `$3FFF` reads back as zero before
|
|
644
|
+
the write (its default RAM pattern is `00 00 ff ff ff ff 00 00`, so the
|
|
645
|
+
neighbouring bytes are not); hardware need not.
|
|
646
|
+
|
|
647
|
+
### Sprite Y 254
|
|
648
|
+
|
|
649
|
+
Sprite Y is compared against the low eight bits of the raster line, and
|
|
650
|
+
a match turns the sprite's DMA on with its first row drawn on the
|
|
651
|
+
following line. 254 matches line 254 and the sprite occupies lines 255
|
|
652
|
+
to 275 on PAL, all inside the frame's 312 lines and all below the
|
|
653
|
+
display, which ends on line 250. It would also match line 510 if there
|
|
654
|
+
were one; there is not, so unlike the topbottom recipe's Y 4, which
|
|
655
|
+
draws twice, this sprite is drawn once a frame. On NTSC the 21 rows run
|
|
656
|
+
past the frame's last line, 262, and continue on lines 0 to 12 of the
|
|
657
|
+
next frame, so the letters straddle the frame boundary and still come
|
|
658
|
+
out whole in the emulator's picture, less the one blank row past its
|
|
659
|
+
edge.
|
|
660
|
+
|
|
661
|
+
### The X rule, the mask and the hand-off
|
|
662
|
+
|
|
663
|
+
These are the DYPP recipe's, unchanged: a 16-bit running sum steps 48
|
|
664
|
+
per column and drops 384 once, the low byte goes to `$D000 + 2k`, a
|
|
665
|
+
high byte of 1 with a low byte under 88 sets the sprite's `$D010` bit,
|
|
666
|
+
and a low byte of 88 or more with the high byte set disables the sprite
|
|
667
|
+
in `$D015` for the frame. `$D010` and `$D015` are written once each
|
|
668
|
+
after the eight low bytes, inside the same handler, so no frame shows a
|
|
669
|
+
mask that disagrees with a low byte. A sprite passes X 4 exactly once a
|
|
670
|
+
lap because every X is even; there its columns 4 to 19 are at X 8 to 23,
|
|
671
|
+
under the left border, so the re-render is invisible, and it comes back
|
|
672
|
+
in at X 342 twenty-three frames later carrying the new character. The
|
|
673
|
+
render itself, character ROM under `$01 = $33`, three doubling tables,
|
|
674
|
+
sixteen rows of three bytes, is the DYPP recipe's `render` verbatim.
|
|
675
|
+
|
|
676
|
+
Both handlers begin with `CLD`: the log arithmetic and the position sum
|
|
677
|
+
are binary, and an interrupt inherits the D flag of whatever it broke
|
|
678
|
+
into. The one difference from the DYPP recipe is where the update runs. That
|
|
679
|
+
recipe polls `$D012` for line 255 in a main loop; here the sprites
|
|
680
|
+
themselves sit on lines 255 to 275, so the update moves to the line-20
|
|
681
|
+
interrupt instead, which is also the handler that restores RSEL. Two
|
|
682
|
+
interrupts a frame, no main-loop work at all: the main program is a
|
|
683
|
+
`jmp *`.
|
|
684
|
+
|
|
685
|
+
## What it does not establish
|
|
686
|
+
|
|
687
|
+
Nothing here was run on hardware; the border behaviour, the row
|
|
688
|
+
positions, the NTSC frame-wrap drawing and the cycle counts are VICE
|
|
689
|
+
x64sc 3.10 figures, and whether an NTSC set shows the rows that fall on
|
|
690
|
+
lines 0 to 12 of the next frame is a question for a monitor, not an
|
|
691
|
+
emulator. The glyphs are single-colour doublings of the ROM capitals;
|
|
692
|
+
multicolour or hand-drawn fonts are not tried, and the upper border,
|
|
693
|
+
which this method opens as well, is left empty. The sprites are drawn
|
|
694
|
+
at one fixed Y; bobbing them inside the border is described on the
|
|
695
|
+
technique page and not built. The 300-frame freeze is for the pin, not
|
|
696
|
+
part of the technique.
|