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,568 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: dycp-scroller
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [dycp_scroller, soft_scroll_h, char_scroll_buffer_h]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D012, D016, D018, D019, D01A, D020, DD04, DD05, DD0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — DYCP Scroller
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A DYCP scroller (Different Y Character Position): a message scrolls left
|
|
19
|
+
across the full width while every column sits at its own pixel height on
|
|
20
|
+
a sine wave. The screen is written once. Each of the thirty-nine visible
|
|
21
|
+
columns is a fixed vertical strip of six characters in a custom charset,
|
|
22
|
+
and every frame the column's glyph is copied into that strip at its new
|
|
23
|
+
pixel row, so only charset bytes change. The copy runs in the vertical
|
|
24
|
+
blank from raster line 250, is timed with CIA2 timer A, and prints its
|
|
25
|
+
cycle count and the highest raster line it ever finished on along the top
|
|
26
|
+
row. After 250 frames the program leaves a verdict at `$02FF` and in the
|
|
27
|
+
border: `$01` and green if the copy always finished before line 122, the
|
|
28
|
+
first raster line of the strips; `$02` and red otherwise. The effect keeps
|
|
29
|
+
running so the exit screenshot shows the wave.
|
|
30
|
+
|
|
31
|
+
Verified in VICE x64sc 3.10 on both models: the verdict byte is `01`,
|
|
32
|
+
the border is green, and the top row reads `CYCLES 05317 MAX LINE 035`
|
|
33
|
+
on PAL and `CYCLES 05459 MAX LINE 084` on NTSC.
|
|
34
|
+
|
|
35
|
+
## Source
|
|
36
|
+
|
|
37
|
+
```asm
|
|
38
|
+
// dycp-scroller.asm
|
|
39
|
+
// A DYCP scroller: Different Y Character Position. Thirty-nine text
|
|
40
|
+
// columns each sit at their own pixel Y on a sine wave. The screen never
|
|
41
|
+
// changes after setup: each column is a fixed vertical strip of six
|
|
42
|
+
// characters in a custom charset, and every frame the column's glyph is
|
|
43
|
+
// copied into that strip at its new pixel row. Only charset bytes move.
|
|
44
|
+
// The whole picture fine-scrolls left with $D016 XSCROLL, and every
|
|
45
|
+
// eighth frame the forty-entry ring buffer shifts and takes the next
|
|
46
|
+
// message character.
|
|
47
|
+
//
|
|
48
|
+
// Region: both. The copy runs in the vertical blank from raster line 250
|
|
49
|
+
// and is timed with CIA2 timer A; the cycle count and the highest raster
|
|
50
|
+
// line the copy ever finished on are printed on the top row. After
|
|
51
|
+
// FRAMES frames the program leaves a verdict: $02FF = $01 and a green
|
|
52
|
+
// border if the copy always finished before BUDGET_LINE, the first raster
|
|
53
|
+
// line of the strips, else $02 and red. The effect keeps running.
|
|
54
|
+
|
|
55
|
+
.const COLS = 39 // columns with a strip; column 39 is under the border
|
|
56
|
+
.const STRIP_CELLS = 6 // cells per strip: 48 pixels, 40 of travel
|
|
57
|
+
.const BAND_TOP = 9 // first screen row of the strips
|
|
58
|
+
.const HUD_CHARS = 22 // charset slots 0-21: blank, digits, letters
|
|
59
|
+
.const AMPLITUDE = 20 // pixels either side of centre; centre = 20
|
|
60
|
+
.const STEP = 6 // sine-table steps between adjacent columns
|
|
61
|
+
.const SPEED = 2 // sine-table steps per frame
|
|
62
|
+
.const IRQ_LINE = 250 // last visible PAL line: the copy runs in the blank
|
|
63
|
+
.const BUDGET_LINE = 50 + BAND_TOP * 8 // 122: first raster line of the strips
|
|
64
|
+
.const FRAMES = 250 // frames before the verdict is written
|
|
65
|
+
.const TEXT_COLOUR = 1 // white
|
|
66
|
+
|
|
67
|
+
.const SCREEN = $0400
|
|
68
|
+
.const COLOUR = $d800
|
|
69
|
+
.const CHARSET = $3000 // $D018 = $1C: screen $0400, charset $3000
|
|
70
|
+
.const RESULT = $02ff
|
|
71
|
+
|
|
72
|
+
.const zp_dst = $fb // pointer used by the glyph copier at setup
|
|
73
|
+
.const msg_ptr = $fd // pointer into the message
|
|
74
|
+
|
|
75
|
+
.encoding "screencode_upper"
|
|
76
|
+
|
|
77
|
+
// Map a message character to a glyph slot 0-31, so slot * 8 fits a byte.
|
|
78
|
+
.function slot(c) {
|
|
79
|
+
.if (c == ' ') .return 0
|
|
80
|
+
.if (c >= 1 && c <= 26) .return c
|
|
81
|
+
.if (c == '.') .return 27
|
|
82
|
+
.if (c == '!') .return 28
|
|
83
|
+
.if (c == ',') .return 29
|
|
84
|
+
.if (c == '-') .return 30
|
|
85
|
+
.if (c == '?') .return 31
|
|
86
|
+
.error "character not in the glyph set"
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.var msg = " DIFFERENT Y CHARACTER POSITION. THE SCREEN NEVER CHANGES, ONLY THE CHARSET DOES. THIRTY-NINE STRIPS, SIX CELLS EACH, FORTY PIXELS OF TRAVEL ... "
|
|
90
|
+
|
|
91
|
+
BasicUpstart2(start)
|
|
92
|
+
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Tables, built by the assembler.
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
* = $2000
|
|
97
|
+
sine: .fill 512, AMPLITUDE + round(sin(toRadians(i * 360 / 256)) * AMPLITUDE)
|
|
98
|
+
// two periods, so sine + c*STEP + phase never wraps
|
|
99
|
+
font: .fill 256, 0 // 32 glyphs x 8 rows, copied from the ROM; page-aligned
|
|
100
|
+
// so lda font+r,y never crosses a page
|
|
101
|
+
glyph_codes: // ROM screen code for each of the 32 glyph slots
|
|
102
|
+
.byte ' '
|
|
103
|
+
.for (var c = 1; c <= 26; c++) { .byte c }
|
|
104
|
+
.byte '.', '!', ',', '-', '?'
|
|
105
|
+
hud_codes: // ROM screen code for each HUD charset slot
|
|
106
|
+
.text " 0123456789CYLESMAXIN" // 21 slots; slot 21 stays blank
|
|
107
|
+
message: .fill msg.size(), slot(msg.charAt(i)) * 8
|
|
108
|
+
.byte $ff // end marker (never a slot * 8)
|
|
109
|
+
digit_pow_lo: .byte <10000, <1000, <100, <10, <1
|
|
110
|
+
digit_pow_hi: .byte >10000, >1000, >100, >10, >1
|
|
111
|
+
|
|
112
|
+
// The HUD text as charset slots: space 0, digits 1-10, letters 11-20.
|
|
113
|
+
.function hud(c) {
|
|
114
|
+
.if (c == ' ') .return 0
|
|
115
|
+
.if (c >= '0' && c <= '9') .return c - '0' + 1
|
|
116
|
+
.if (c == 'C') .return 11
|
|
117
|
+
.if (c == 'Y') .return 12
|
|
118
|
+
.if (c == 'L') .return 13
|
|
119
|
+
.if (c == 'E') .return 14
|
|
120
|
+
.if (c == 'S') .return 15
|
|
121
|
+
.if (c == 'M') .return 16
|
|
122
|
+
.if (c == 'A') .return 17
|
|
123
|
+
.if (c == 'X') .return 18
|
|
124
|
+
.if (c == 'I') .return 19
|
|
125
|
+
.if (c == 'N') .return 20
|
|
126
|
+
.error "character not in the HUD set"
|
|
127
|
+
}
|
|
128
|
+
.var hud_str = "CYCLES MAX LINE"
|
|
129
|
+
hud_slots: .fill hud_str.size(), hud(hud_str.charAt(i))
|
|
130
|
+
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
// State
|
|
133
|
+
// ---------------------------------------------------------------------------
|
|
134
|
+
scroll_buf: .fill 40, 0 // glyph slot * 8 per column, left to right
|
|
135
|
+
old_y: .fill COLS, 0 // pixel row each column's glyph was drawn at
|
|
136
|
+
xscroll: .byte 7
|
|
137
|
+
phase: .byte 0
|
|
138
|
+
frame_lo: .byte 0
|
|
139
|
+
frame_hi: .byte 0
|
|
140
|
+
max_line: .byte 0 // highest end-of-copy raster line seen
|
|
141
|
+
cycles_lo: .byte 0
|
|
142
|
+
cycles_hi: .byte 0
|
|
143
|
+
verdict: .byte 0
|
|
144
|
+
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
// Setup
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
* = $0900
|
|
149
|
+
start:
|
|
150
|
+
sei
|
|
151
|
+
lda #$7f
|
|
152
|
+
sta $dc0d // mask CIA1 interrupts
|
|
153
|
+
lda $dc0d
|
|
154
|
+
|
|
155
|
+
// Clear the screen to slot 0 (blank) and colour the strips.
|
|
156
|
+
lda #0
|
|
157
|
+
ldx #0
|
|
158
|
+
!: sta SCREEN, x
|
|
159
|
+
sta SCREEN + $100, x
|
|
160
|
+
sta SCREEN + $200, x
|
|
161
|
+
sta SCREEN + $2e8, x
|
|
162
|
+
inx
|
|
163
|
+
bne !-
|
|
164
|
+
lda #TEXT_COLOUR
|
|
165
|
+
ldx #0
|
|
166
|
+
!: sta COLOUR, x // row 0: the HUD
|
|
167
|
+
.for (var r = BAND_TOP; r < BAND_TOP + STRIP_CELLS; r++) {
|
|
168
|
+
sta COLOUR + r * 40, x
|
|
169
|
+
}
|
|
170
|
+
inx
|
|
171
|
+
cpx #40
|
|
172
|
+
bne !-
|
|
173
|
+
|
|
174
|
+
// Lay the strips: column c, cell k is charset slot HUD_CHARS + c*STRIP_CELLS + k.
|
|
175
|
+
ldx #0
|
|
176
|
+
lda #HUD_CHARS
|
|
177
|
+
lay:
|
|
178
|
+
.for (var k = 0; k < STRIP_CELLS; k++) {
|
|
179
|
+
sta SCREEN + (BAND_TOP + k) * 40, x
|
|
180
|
+
clc
|
|
181
|
+
adc #1
|
|
182
|
+
}
|
|
183
|
+
inx
|
|
184
|
+
cpx #COLS
|
|
185
|
+
bne lay
|
|
186
|
+
|
|
187
|
+
// HUD labels on row 0.
|
|
188
|
+
ldx #0
|
|
189
|
+
!: lda hud_slots, x
|
|
190
|
+
sta SCREEN, x
|
|
191
|
+
inx
|
|
192
|
+
cpx #hud_str.size()
|
|
193
|
+
bne !-
|
|
194
|
+
|
|
195
|
+
// Clear the charset, then copy the ROM glyphs: 32 into the font table
|
|
196
|
+
// (the copy source), 21 into charset slots 0-20 (the HUD).
|
|
197
|
+
lda #0
|
|
198
|
+
tax
|
|
199
|
+
!: .for (var p = 0; p < 8; p++) { sta CHARSET + p * $100, x }
|
|
200
|
+
inx
|
|
201
|
+
bne !-
|
|
202
|
+
|
|
203
|
+
lda #$33 // character ROM in at $D000, I/O out
|
|
204
|
+
sta $01
|
|
205
|
+
lda #<font
|
|
206
|
+
sta zp_dst
|
|
207
|
+
lda #>font
|
|
208
|
+
sta zp_dst + 1
|
|
209
|
+
ldx #0
|
|
210
|
+
!: lda glyph_codes, x
|
|
211
|
+
jsr copy_glyph
|
|
212
|
+
inx
|
|
213
|
+
cpx #32
|
|
214
|
+
bne !-
|
|
215
|
+
lda #<CHARSET
|
|
216
|
+
sta zp_dst
|
|
217
|
+
lda #>CHARSET
|
|
218
|
+
sta zp_dst + 1
|
|
219
|
+
ldx #0
|
|
220
|
+
!: lda hud_codes, x
|
|
221
|
+
jsr copy_glyph
|
|
222
|
+
inx
|
|
223
|
+
cpx #21
|
|
224
|
+
bne !-
|
|
225
|
+
lda #$37 // I/O back in
|
|
226
|
+
sta $01
|
|
227
|
+
|
|
228
|
+
lda #<message
|
|
229
|
+
sta msg_ptr
|
|
230
|
+
lda #>message
|
|
231
|
+
sta msg_ptr + 1
|
|
232
|
+
|
|
233
|
+
lda #$1b
|
|
234
|
+
sta $d011
|
|
235
|
+
lda #$c7 // CSEL=0: 38 columns; XSCROLL=7
|
|
236
|
+
sta $d016
|
|
237
|
+
lda #$1c // screen $0400, charset $3000
|
|
238
|
+
sta $d018
|
|
239
|
+
lda #<irq
|
|
240
|
+
sta $0314
|
|
241
|
+
lda #>irq
|
|
242
|
+
sta $0315
|
|
243
|
+
lda #IRQ_LINE
|
|
244
|
+
sta $d012
|
|
245
|
+
lda #$01
|
|
246
|
+
sta $d01a
|
|
247
|
+
sta $d019
|
|
248
|
+
lda #$ff // CIA2 timer A latch = $FFFF
|
|
249
|
+
sta $dd04
|
|
250
|
+
sta $dd05
|
|
251
|
+
cli
|
|
252
|
+
jmp *
|
|
253
|
+
|
|
254
|
+
// Copy the 8 rows of ROM glyph A (upper-case set) to (zp_dst); advance it.
|
|
255
|
+
copy_glyph:
|
|
256
|
+
sta copy_src + 1
|
|
257
|
+
lda #0
|
|
258
|
+
asl copy_src + 1
|
|
259
|
+
rol
|
|
260
|
+
asl copy_src + 1
|
|
261
|
+
rol
|
|
262
|
+
asl copy_src + 1
|
|
263
|
+
rol
|
|
264
|
+
clc
|
|
265
|
+
adc #$d0
|
|
266
|
+
sta copy_src + 2
|
|
267
|
+
ldy #7
|
|
268
|
+
copy_src:
|
|
269
|
+
lda $d000, y
|
|
270
|
+
sta (zp_dst), y
|
|
271
|
+
dey
|
|
272
|
+
bpl copy_src
|
|
273
|
+
lda zp_dst
|
|
274
|
+
clc
|
|
275
|
+
adc #8
|
|
276
|
+
sta zp_dst
|
|
277
|
+
bcc !+
|
|
278
|
+
inc zp_dst + 1
|
|
279
|
+
!: rts
|
|
280
|
+
|
|
281
|
+
// ---------------------------------------------------------------------------
|
|
282
|
+
// Once per frame, in the vertical blank.
|
|
283
|
+
// ---------------------------------------------------------------------------
|
|
284
|
+
irq:
|
|
285
|
+
// 1. Fine scroll one pixel left; every eighth frame shift the buffer.
|
|
286
|
+
dec xscroll
|
|
287
|
+
bpl set_d016
|
|
288
|
+
lda #7
|
|
289
|
+
sta xscroll
|
|
290
|
+
jsr shift_buffer
|
|
291
|
+
set_d016:
|
|
292
|
+
lda xscroll
|
|
293
|
+
ora #$c0
|
|
294
|
+
sta $d016
|
|
295
|
+
|
|
296
|
+
// 2. Advance the wave.
|
|
297
|
+
lda phase
|
|
298
|
+
clc
|
|
299
|
+
adc #SPEED
|
|
300
|
+
sta phase
|
|
301
|
+
|
|
302
|
+
// 3. The copy, timed. For each column: blank the 8 rows the glyph was
|
|
303
|
+
// on last frame, then write its 8 new rows at the new pixel Y.
|
|
304
|
+
// Strip c is 48 consecutive charset bytes, so row y of the strip is
|
|
305
|
+
// strip + y and a glyph at pixel Y is 8 bytes from strip + Y.
|
|
306
|
+
lda #%00010001 // force-load $FFFF and start, continuous
|
|
307
|
+
sta $dd0e
|
|
308
|
+
.for (var c = 0; c < COLS; c++) {
|
|
309
|
+
.const strip = CHARSET + (HUD_CHARS + c * STRIP_CELLS) * 8
|
|
310
|
+
lda #0
|
|
311
|
+
ldx old_y + c
|
|
312
|
+
.for (var r = 0; r < 8; r++) { sta strip + r, x }
|
|
313
|
+
ldx phase
|
|
314
|
+
lda sine + c * STEP, x
|
|
315
|
+
sta old_y + c
|
|
316
|
+
tax
|
|
317
|
+
ldy scroll_buf + c
|
|
318
|
+
.for (var r = 0; r < 8; r++) {
|
|
319
|
+
lda font + r, y
|
|
320
|
+
sta strip + r, x
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
lda $dd04 // timer low, then high: elapsed = $FFFF - value
|
|
324
|
+
eor #$ff
|
|
325
|
+
sta cycles_lo
|
|
326
|
+
lda $dd05
|
|
327
|
+
eor #$ff
|
|
328
|
+
sta cycles_hi
|
|
329
|
+
lda #0
|
|
330
|
+
sta $dd0e // stop the timer
|
|
331
|
+
|
|
332
|
+
// 4. Where did the copy end? Lines at or after IRQ_LINE are still this
|
|
333
|
+
// frame's blank and count as 0; anything else is lines into the next.
|
|
334
|
+
lda $d012
|
|
335
|
+
ldx $d011
|
|
336
|
+
bpl !+ // bit 7 = raster bit 8: line >= 256
|
|
337
|
+
lda #0
|
|
338
|
+
beq got_line
|
|
339
|
+
!: cmp #IRQ_LINE
|
|
340
|
+
bcc got_line
|
|
341
|
+
lda #0
|
|
342
|
+
got_line:
|
|
343
|
+
cmp max_line
|
|
344
|
+
bcc !+
|
|
345
|
+
sta max_line
|
|
346
|
+
!:
|
|
347
|
+
|
|
348
|
+
// 5. HUD: cycles in decimal at columns 7-11, max line at columns 22-24.
|
|
349
|
+
lda cycles_lo
|
|
350
|
+
sta num_lo
|
|
351
|
+
lda cycles_hi
|
|
352
|
+
sta num_hi
|
|
353
|
+
jsr to_decimal // writes 5 digits at digits+0..4
|
|
354
|
+
.for (var d = 0; d < 5; d++) {
|
|
355
|
+
lda digits + d
|
|
356
|
+
sta SCREEN + 7 + d
|
|
357
|
+
}
|
|
358
|
+
lda max_line
|
|
359
|
+
sta num_lo
|
|
360
|
+
lda #0
|
|
361
|
+
sta num_hi
|
|
362
|
+
jsr to_decimal
|
|
363
|
+
.for (var d = 2; d < 5; d++) {
|
|
364
|
+
lda digits + d
|
|
365
|
+
sta SCREEN + 20 + d
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// 6. After FRAMES frames, the verdict. Once.
|
|
369
|
+
lda verdict
|
|
370
|
+
bne done
|
|
371
|
+
inc frame_lo
|
|
372
|
+
bne !+
|
|
373
|
+
inc frame_hi
|
|
374
|
+
!: lda frame_lo
|
|
375
|
+
cmp #<FRAMES
|
|
376
|
+
bne done
|
|
377
|
+
lda frame_hi
|
|
378
|
+
cmp #>FRAMES
|
|
379
|
+
bne done
|
|
380
|
+
lda max_line
|
|
381
|
+
cmp #BUDGET_LINE
|
|
382
|
+
bcs fail
|
|
383
|
+
lda #$01
|
|
384
|
+
ldy #5 // green
|
|
385
|
+
bne set_verdict
|
|
386
|
+
fail:
|
|
387
|
+
lda #$02
|
|
388
|
+
ldy #2 // red
|
|
389
|
+
set_verdict:
|
|
390
|
+
sta RESULT
|
|
391
|
+
sta verdict
|
|
392
|
+
sty $d020
|
|
393
|
+
done:
|
|
394
|
+
lda #$01
|
|
395
|
+
sta $d019
|
|
396
|
+
jmp $ea31 // KERNAL housekeeping once a frame; CIA1 is masked
|
|
397
|
+
|
|
398
|
+
// 16-bit num -> five HUD digit slots (1-10) at digits+0..4.
|
|
399
|
+
num_lo: .byte 0
|
|
400
|
+
num_hi: .byte 0
|
|
401
|
+
digits: .fill 5, 0
|
|
402
|
+
to_decimal:
|
|
403
|
+
ldx #0
|
|
404
|
+
next_digit:
|
|
405
|
+
lda #1 // slot 1 = '0'
|
|
406
|
+
sta digits, x
|
|
407
|
+
sub_again:
|
|
408
|
+
lda num_lo
|
|
409
|
+
sec
|
|
410
|
+
sbc digit_pow_lo, x
|
|
411
|
+
tay
|
|
412
|
+
lda num_hi
|
|
413
|
+
sbc digit_pow_hi, x
|
|
414
|
+
bcc digit_done
|
|
415
|
+
sta num_hi
|
|
416
|
+
sty num_lo
|
|
417
|
+
inc digits, x
|
|
418
|
+
bne sub_again
|
|
419
|
+
digit_done:
|
|
420
|
+
inx
|
|
421
|
+
cpx #5
|
|
422
|
+
bne next_digit
|
|
423
|
+
rts
|
|
424
|
+
|
|
425
|
+
// Shift the ring left and append the next message glyph.
|
|
426
|
+
shift_buffer:
|
|
427
|
+
ldx #0
|
|
428
|
+
!: lda scroll_buf + 1, x
|
|
429
|
+
sta scroll_buf, x
|
|
430
|
+
inx
|
|
431
|
+
cpx #39
|
|
432
|
+
bne !-
|
|
433
|
+
ldy #0
|
|
434
|
+
lda (msg_ptr), y
|
|
435
|
+
cmp #$ff
|
|
436
|
+
bne !+
|
|
437
|
+
lda #<message // end of message: wrap
|
|
438
|
+
sta msg_ptr
|
|
439
|
+
lda #>message
|
|
440
|
+
sta msg_ptr + 1
|
|
441
|
+
lda (msg_ptr), y
|
|
442
|
+
!: sta scroll_buf + 39
|
|
443
|
+
inc msg_ptr
|
|
444
|
+
bne !+
|
|
445
|
+
inc msg_ptr + 1
|
|
446
|
+
!: rts
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
## Build
|
|
450
|
+
|
|
451
|
+
```bash
|
|
452
|
+
java -jar KickAss.jar dycp-scroller.asm -o dycp-scroller.prg
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
KickAssembler 5.25 reports code at `$0900-$1914` and tables at
|
|
456
|
+
`$2000-$2441`; the PRG is 7,235 bytes. The 2 KB charset at `$3000` is
|
|
457
|
+
not in the file: the program clears it and copies the glyphs it needs
|
|
458
|
+
out of the character ROM at start.
|
|
459
|
+
|
|
460
|
+
## Expected output
|
|
461
|
+
|
|
462
|
+
A blue screen with a green border. On the top row, in white,
|
|
463
|
+
`CYCLES nnnnn MAX LINE nnn`. Across the middle, the message in white with
|
|
464
|
+
each column at a different height, forming just under one period of a
|
|
465
|
+
sine wave (39 columns × STEP 6 = 234 of the 256 table steps) and 40
|
|
466
|
+
pixels tall from trough to crest. The text moves left one pixel per frame
|
|
467
|
+
(50 px/s on PAL, 60 px/s on NTSC) and the wave rolls under it two table
|
|
468
|
+
steps per frame; a column's height changes by at most one pixel a frame
|
|
469
|
+
at that speed. The 38-column mode hides column 39, so characters slide in
|
|
470
|
+
from under the right border and out under the left one a pixel at a time.
|
|
471
|
+
|
|
472
|
+
Screenshots from the runs this page describes, pinned at 9,000,000
|
|
473
|
+
cycles: `screenshots/dycp-scroller.png` (PAL) and
|
|
474
|
+
`screenshots/dycp-scroller-ntsc.png` (6567R8). Both runs were made twice
|
|
475
|
+
and the two PNGs were byte-identical each time. The verdict store,
|
|
476
|
+
watched with a `trace store 02ff` as `docs/runtime/vice-reference.md`
|
|
477
|
+
"Verifying a run without a human" route 2 shows, was `01` on both models
|
|
478
|
+
(at cycle 7,924,349 on PAL and 7,391,660 on NTSC). The top row shows the
|
|
479
|
+
count from the frame before the screenshot's, because the exit frame's
|
|
480
|
+
own top row is drawn a few thousand cycles after its interrupt has
|
|
481
|
+
written it: the last NTSC store was 5,543 and the picture says 5,459.
|
|
482
|
+
|
|
483
|
+
## Why this works
|
|
484
|
+
|
|
485
|
+
### The strips
|
|
486
|
+
|
|
487
|
+
The band is screen rows 9 to 14. Column `c`, cell `k` of the band holds
|
|
488
|
+
charset slot `22 + c*6 + k`, so the six cells of one column are six
|
|
489
|
+
consecutive slots and, since a slot is 8 bytes, one strip is 48
|
|
490
|
+
consecutive bytes of the charset: `$3000 + (22 + c*6) * 8`. Pixel row `y`
|
|
491
|
+
of the strip is byte `strip + y`. Putting a glyph at pixel `Y` is
|
|
492
|
+
therefore eight stores to `strip + Y + 0 .. 7`, and the cell split the
|
|
493
|
+
technique description talks about (row offset `Y & 7` into cell `Y >> 3`
|
|
494
|
+
and the rest into the cell below) falls out of the address arithmetic
|
|
495
|
+
without being computed. Six cells give 48 pixels, of which a glyph can
|
|
496
|
+
start on 0 to 40: the 40 pixels of travel. The screen and colour RAM are
|
|
497
|
+
never written again after setup. This is `dycp_scroller` in
|
|
498
|
+
`docs/techniques/scroll.md`.
|
|
499
|
+
|
|
500
|
+
Thirty-nine strips of six cells is 234 slots; slots 0 to 21 are left for
|
|
501
|
+
the blank the rest of the screen shows and for the digits and letters of
|
|
502
|
+
the top row. Column 39 gets no strip because CSEL=0 hides it at every
|
|
503
|
+
XSCROLL (measured for `sine-scroller.md`).
|
|
504
|
+
|
|
505
|
+
### The copy
|
|
506
|
+
|
|
507
|
+
Per column, fully unrolled by the assembler: eight stores of zero at the
|
|
508
|
+
column's previous `Y` (kept in `old_y`), then the new `Y` from the sine
|
|
509
|
+
table, then eight `lda font+r,y` / `sta strip+r,x` pairs with `X = Y` and
|
|
510
|
+
`Y = glyph * 8`. The glyph source is a 256-byte copy of 32 ROM glyphs, so
|
|
511
|
+
`glyph * 8` fits a byte and one indexed load reaches any row of any
|
|
512
|
+
glyph; the message is mapped onto those 32 slots by the assembler
|
|
513
|
+
(`slot()`), because screen codes for space and punctuation lie above 31.
|
|
514
|
+
The sine table is two periods long so `lda sine + c*STEP, x` with
|
|
515
|
+
`X = phase` never needs a wrap. Clearing the old eight rows rather than
|
|
516
|
+
the two rows a one-pixel move vacates costs six stores a column and makes
|
|
517
|
+
the copy correct for any per-frame move up to eight pixels, which is what
|
|
518
|
+
lets SPEED or AMPLITUDE be changed without touching the copy.
|
|
519
|
+
|
|
520
|
+
Measured with CIA2 timer A over 304 PAL frames (a `trace store` on the
|
|
521
|
+
two count bytes): 5,305 to 5,343 cycles, 136 a column. The 38-cycle
|
|
522
|
+
spread is the page crossing of `lda sine + c*STEP, x`, one cycle in the
|
|
523
|
+
columns where it happens. An earlier build of this page kept `font`
|
|
524
|
+
where the tables happened to end, straddling `$2300`, and the same
|
|
525
|
+
measurement read 5,376 to 5,522: `lda font+r,y` crossing a page on most
|
|
526
|
+
rows. Aligning `font` to a page took 71 to 179 cycles off the copy and
|
|
527
|
+
narrowed the spread to the sine crossing alone.
|
|
528
|
+
|
|
529
|
+
### Where the work runs
|
|
530
|
+
|
|
531
|
+
The interrupt is at line 250. The copy starts after the KERNAL's 36-cycle
|
|
532
|
+
entry, the `$D016` write, the wave step and, every eighth frame, the
|
|
533
|
+
buffer shift (that lead-in is not measured here), and it ends, by the `$D012` read at its tail, no later than line
|
|
534
|
+
35 on PAL and line 84 on NTSC. The strips' first raster line is 122
|
|
535
|
+
(`50 + 9*8`), so the VIC never fetches a strip byte the copy is still
|
|
536
|
+
writing and a single charset is enough; a second charset and a `$D018`
|
|
537
|
+
flip would buy nothing here. The verdict is that inequality held for
|
|
538
|
+
every one of the first 250 frames.
|
|
539
|
+
|
|
540
|
+
On NTSC the same 5,305-cycle copy is stretched to 5,433 to 5,556 cycles
|
|
541
|
+
of CIA time: the NTSC frame is 263 lines, so line 250 is only 13 lines
|
|
542
|
+
from the end, and the copy runs over rows 0 to 4 of the next display,
|
|
543
|
+
crossing three to five badlines (lines 51, 59, 67, 75, 83), each of
|
|
544
|
+
which stops the CPU for 40 to 43 cycles (`badline_cycle_loss` in
|
|
545
|
+
`docs/pitfalls/raster-and-badline.md`). The count on the top row is
|
|
546
|
+
the plain way to see that pitfall: the CPU work is identical on both
|
|
547
|
+
models and the timer says it is not.
|
|
548
|
+
|
|
549
|
+
### The verdict line
|
|
550
|
+
|
|
551
|
+
`$D012` at the end of the copy is a nine-bit value read through two
|
|
552
|
+
registers. A line at or after 250 is still this frame's blank and counts
|
|
553
|
+
as 0; a line at or above 256 (bit 7 of `$D011` set) is also the blank on
|
|
554
|
+
PAL and is folded to 0 as well, which is right for a copy that ends
|
|
555
|
+
within one frame and would misreport one that ran a whole frame late.
|
|
556
|
+
The maximum is kept, printed, and compared with BUDGET_LINE once, at
|
|
557
|
+
frame 250. `$02FF` and `$D020` are then written exactly once; the
|
|
558
|
+
handler keeps running afterwards so the picture at the pinned cycle count
|
|
559
|
+
is a live frame, not a frozen one.
|
|
560
|
+
|
|
561
|
+
### Region
|
|
562
|
+
|
|
563
|
+
`region: both`. Nothing in the copy depends on the model. What differs is
|
|
564
|
+
the room after line 250: about 7,100 cycles to the first badline on PAL
|
|
565
|
+
and about 4,200 on NTSC, so the NTSC copy runs some 33 lines into the
|
|
566
|
+
display and pays the badlines above. Both finish 38 or more lines before
|
|
567
|
+
the strips. A taller band, more columns or a lower IRQ line eats that
|
|
568
|
+
margin on NTSC first; the top row's `MAX LINE` is the number to watch.
|