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,545 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: screen-dissolve
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [screen_dissolve_lfsr]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D012, D020, D021, DC04, DC05, DC0D, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler: Screen Dissolve by LFSR
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Two text screens are built at start-up: screen A, a light blue checker of
|
|
19
|
+
two glyphs captioned `SCREEN A`, on the visible screen, and screen B, yellow
|
|
20
|
+
diagonal stripes captioned `SCREEN B`, in RAM. Each frame a 10-bit Galois
|
|
21
|
+
LFSR pulls 20 cell indices and each cell is copied from B to the visible
|
|
22
|
+
screen, screen byte and colour byte, so B appears through A in a random
|
|
23
|
+
order over 50 frames: a dissolve, with no palette work. Indices 1000 to
|
|
24
|
+
1023 are pulled again, cell 0 is copied by hand at the end, and CIA1 timer
|
|
25
|
+
A times every frame. When cell 0 lands the program grades itself: `$02FF`
|
|
26
|
+
is `$01` with a green border if that was frame 50 and no frame took more
|
|
27
|
+
than 4,000 cycles, else `$02` with a red border. The picture is static from
|
|
28
|
+
then on, which is what the pin shows. Build with `-define SEQ` for the
|
|
29
|
+
control that copies the cells in order at the same rate, which is a wipe,
|
|
30
|
+
and with `-define STOP25` to freeze either after frame 25 for a mid-way
|
|
31
|
+
picture.
|
|
32
|
+
|
|
33
|
+
## Source
|
|
34
|
+
|
|
35
|
+
```asm
|
|
36
|
+
// screen-dissolve.asm
|
|
37
|
+
// Two text screens are built at start-up. Screen A, a checker of two glyphs
|
|
38
|
+
// in light blue with the caption "SCREEN A", is the visible screen at $0400.
|
|
39
|
+
// Screen B, diagonal stripes in yellow with the caption "SCREEN B", is kept
|
|
40
|
+
// in RAM at $2800 (screen bytes) and $2C00 (colour bytes). Each frame, from
|
|
41
|
+
// the first line of the lower border, a 10-bit Galois LFSR (taps $240, the
|
|
42
|
+
// polynomial x^10 + x^7 + 1) produces 20 cell indices and each cell is copied
|
|
43
|
+
// from B to the visible screen, screen byte and colour byte. Indices 1000 to
|
|
44
|
+
// 1023 are skipped, and cell 0, which an LFSR never produces, is copied by
|
|
45
|
+
// hand once the register has come back to its seed. CIA1 timer A times each
|
|
46
|
+
// frame's copy; the cost of every frame is logged as a word at COSTLOG and
|
|
47
|
+
// the largest is kept. When cell 0 lands the program grades itself: $02FF is
|
|
48
|
+
// $01 with a green border if that happened on frame EXPECT_FRAME and no frame
|
|
49
|
+
// cost more than BUDGET cycles, else $02 with a red border. The picture is
|
|
50
|
+
// static from then on.
|
|
51
|
+
// Build variants: -define SEQ gives the control that copies cells 0, 1, 2 ..
|
|
52
|
+
// 999 in order at the same rate, which is a wipe and not a dissolve;
|
|
53
|
+
// -define STOP25 freezes the picture after frame 25 for a mid-way screenshot.
|
|
54
|
+
|
|
55
|
+
.const SCREEN = $0400
|
|
56
|
+
.const COLOUR = $d800
|
|
57
|
+
.const SCREEN_B = $2800 // screen B, screen bytes, 1000 used
|
|
58
|
+
.const COLOUR_B = $2c00 // screen B, colour bytes, 1000 used
|
|
59
|
+
.const COSTLOG = $3000 // word per frame, indexed by frame * 2
|
|
60
|
+
.const SYNC_LINE = 251 // first line of the lower border, both models
|
|
61
|
+
.const CELLS_PER_FRAME = 20
|
|
62
|
+
.const CELLS = 1000
|
|
63
|
+
.const SEED = 1 // any value 1 to 1023; 1 is a valid cell
|
|
64
|
+
.const TAP_LO = $40 // $240: x^10 + x^7 + 1, bits 9 and 6
|
|
65
|
+
.const TAP_HI = $02
|
|
66
|
+
.const EXPECT_FRAME = 50 // 1000 cells at 20 a frame
|
|
67
|
+
.const BUDGET = 4000 // cycles one frame's copies may take
|
|
68
|
+
.const RESULT = $02ff // verdict byte read by a harness
|
|
69
|
+
.const GLYPH_A0 = $66 // hatched square
|
|
70
|
+
.const GLYPH_A1 = $e6 // the same, reversed
|
|
71
|
+
.const GLYPH_B0 = $a0 // reverse space: a solid block
|
|
72
|
+
.const GLYPH_B1 = $2e // full stop
|
|
73
|
+
.const COLOUR_A = 14 // light blue
|
|
74
|
+
.const COLOUR_B_INK = 7 // yellow
|
|
75
|
+
.const CAPTION_ROW = 12
|
|
76
|
+
.const CAPTION_COL = 16
|
|
77
|
+
|
|
78
|
+
#if STOP25
|
|
79
|
+
.const STOP_FRAME = 25 // freeze after frame 25
|
|
80
|
+
#else
|
|
81
|
+
.const STOP_FRAME = 0 // never freeze
|
|
82
|
+
#endif
|
|
83
|
+
|
|
84
|
+
// Variables at a fixed address so a monitor dump can name them.
|
|
85
|
+
.const VARS = $0c00
|
|
86
|
+
.const frame = VARS + 0 // frames since start, 8 bits
|
|
87
|
+
.const done = VARS + 1 // 1 once cell 0 has landed
|
|
88
|
+
.const wrapped = VARS + 2 // 1 once the LFSR has come back to SEED
|
|
89
|
+
.const slots = VARS + 3 // cells left in this frame
|
|
90
|
+
.const idx = VARS + 4 // cell index, low then high
|
|
91
|
+
.const cost = VARS + 6 // last frame's cycles
|
|
92
|
+
.const maxcost = VARS + 8 // largest frame cost
|
|
93
|
+
.const donef = VARS + 10 // the frame cell 0 landed on
|
|
94
|
+
|
|
95
|
+
// Zero-page pointers, low bytes always 0, indexed by Y = low byte of idx.
|
|
96
|
+
.const srcs = $fb // screen B, screen byte
|
|
97
|
+
.const srcc = $fd // screen B, colour byte
|
|
98
|
+
.const dsts = $f7 // visible screen
|
|
99
|
+
.const dstc = $f9 // colour RAM
|
|
100
|
+
.const row_a = $f3 // build pointers
|
|
101
|
+
.const row_b = $f5
|
|
102
|
+
|
|
103
|
+
BasicUpstart2(start)
|
|
104
|
+
|
|
105
|
+
// CIA1 timer A as a stopwatch, phi2 clock, counting down from $FFFF.
|
|
106
|
+
.macro t_start() {
|
|
107
|
+
lda #$00
|
|
108
|
+
sta $dc0e
|
|
109
|
+
lda #$ff
|
|
110
|
+
sta $dc04
|
|
111
|
+
sta $dc05
|
|
112
|
+
lda #$11 // force load, start, count phi2
|
|
113
|
+
sta $dc0e
|
|
114
|
+
}
|
|
115
|
+
.macro t_stop(addr) {
|
|
116
|
+
lda #$00
|
|
117
|
+
sta $dc0e
|
|
118
|
+
sec
|
|
119
|
+
lda #$ff
|
|
120
|
+
sbc $dc04
|
|
121
|
+
sta addr
|
|
122
|
+
lda #$ff
|
|
123
|
+
sbc $dc05
|
|
124
|
+
sta addr + 1
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
* = $0900
|
|
128
|
+
start:
|
|
129
|
+
sei // no KERNAL IRQ: a copy must not be interrupted
|
|
130
|
+
lda #$7f
|
|
131
|
+
sta $dc0d // no CIA1 interrupts: timer A is the stopwatch
|
|
132
|
+
lda $dc0d
|
|
133
|
+
lda #$00
|
|
134
|
+
sta $d020
|
|
135
|
+
sta $d021
|
|
136
|
+
|
|
137
|
+
ldx #$0f // clear the variables
|
|
138
|
+
!: sta VARS, x
|
|
139
|
+
dex
|
|
140
|
+
bpl !-
|
|
141
|
+
sta srcs
|
|
142
|
+
sta srcc
|
|
143
|
+
sta dsts
|
|
144
|
+
sta dstc
|
|
145
|
+
lda #<SEED
|
|
146
|
+
sta idx
|
|
147
|
+
lda #>SEED
|
|
148
|
+
sta idx + 1
|
|
149
|
+
|
|
150
|
+
jsr build_screens
|
|
151
|
+
|
|
152
|
+
#if SEQ
|
|
153
|
+
lda #$00 // the control starts at cell 0
|
|
154
|
+
sta idx
|
|
155
|
+
sta idx + 1
|
|
156
|
+
#endif
|
|
157
|
+
|
|
158
|
+
mainloop:
|
|
159
|
+
lda #SYNC_LINE // leave the sync line, then reach it again
|
|
160
|
+
!: cmp $d012
|
|
161
|
+
beq !-
|
|
162
|
+
!: cmp $d012
|
|
163
|
+
bne !-
|
|
164
|
+
|
|
165
|
+
lda done
|
|
166
|
+
bne mainloop // static: nothing more to do
|
|
167
|
+
.if (STOP_FRAME != 0) {
|
|
168
|
+
lda frame
|
|
169
|
+
cmp #STOP_FRAME
|
|
170
|
+
bcs mainloop // frozen after frame STOP for the mid-way picture
|
|
171
|
+
}
|
|
172
|
+
inc frame
|
|
173
|
+
|
|
174
|
+
t_start()
|
|
175
|
+
ldx #CELLS_PER_FRAME
|
|
176
|
+
slot:
|
|
177
|
+
stx slots
|
|
178
|
+
#if SEQ
|
|
179
|
+
jsr copy_cell // the control: cell idx, then idx + 1
|
|
180
|
+
inc idx
|
|
181
|
+
bne !+
|
|
182
|
+
inc idx + 1
|
|
183
|
+
!: lda idx + 1
|
|
184
|
+
cmp #>CELLS
|
|
185
|
+
bne next
|
|
186
|
+
lda idx
|
|
187
|
+
cmp #<CELLS
|
|
188
|
+
bne next
|
|
189
|
+
inc done // cell 999 was the last
|
|
190
|
+
jmp endframe
|
|
191
|
+
#else
|
|
192
|
+
lda wrapped
|
|
193
|
+
bne lastcell
|
|
194
|
+
pull:
|
|
195
|
+
jsr lfsr_step // next state of the register
|
|
196
|
+
lda idx + 1
|
|
197
|
+
cmp #>CELLS // 1000 to 1023 are not cells: pull again
|
|
198
|
+
bne valid
|
|
199
|
+
lda idx
|
|
200
|
+
cmp #<CELLS
|
|
201
|
+
bcs pull
|
|
202
|
+
valid:
|
|
203
|
+
lda idx // back at the seed: every state has been seen
|
|
204
|
+
cmp #<SEED
|
|
205
|
+
bne !+
|
|
206
|
+
lda idx + 1
|
|
207
|
+
cmp #>SEED
|
|
208
|
+
bne !+
|
|
209
|
+
inc wrapped
|
|
210
|
+
!: jsr copy_cell
|
|
211
|
+
jmp next
|
|
212
|
+
lastcell:
|
|
213
|
+
lda #$00 // cell 0, which the register never produces
|
|
214
|
+
sta idx
|
|
215
|
+
sta idx + 1
|
|
216
|
+
jsr copy_cell
|
|
217
|
+
inc done
|
|
218
|
+
jmp endframe
|
|
219
|
+
#endif
|
|
220
|
+
next:
|
|
221
|
+
ldx slots
|
|
222
|
+
dex
|
|
223
|
+
bne slot
|
|
224
|
+
|
|
225
|
+
endframe:
|
|
226
|
+
t_stop(cost)
|
|
227
|
+
lda frame // log this frame's cost
|
|
228
|
+
asl
|
|
229
|
+
tax
|
|
230
|
+
lda cost
|
|
231
|
+
sta COSTLOG, x
|
|
232
|
+
lda cost + 1
|
|
233
|
+
sta COSTLOG + 1, x
|
|
234
|
+
lda cost + 1 // keep the largest cost seen
|
|
235
|
+
cmp maxcost + 1
|
|
236
|
+
bcc after
|
|
237
|
+
bne newmax
|
|
238
|
+
lda cost
|
|
239
|
+
cmp maxcost
|
|
240
|
+
bcc after
|
|
241
|
+
newmax:
|
|
242
|
+
lda cost
|
|
243
|
+
sta maxcost
|
|
244
|
+
lda cost + 1
|
|
245
|
+
sta maxcost + 1
|
|
246
|
+
after:
|
|
247
|
+
lda done
|
|
248
|
+
beq back
|
|
249
|
+
lda frame // the last cell has landed: grade the run
|
|
250
|
+
sta donef
|
|
251
|
+
cmp #EXPECT_FRAME
|
|
252
|
+
bne fail
|
|
253
|
+
lda maxcost + 1
|
|
254
|
+
cmp #>BUDGET
|
|
255
|
+
bcc pass
|
|
256
|
+
bne fail
|
|
257
|
+
lda maxcost
|
|
258
|
+
cmp #<BUDGET
|
|
259
|
+
bcs fail
|
|
260
|
+
pass:
|
|
261
|
+
lda #$01
|
|
262
|
+
sta RESULT
|
|
263
|
+
lda #$05
|
|
264
|
+
sta $d020
|
|
265
|
+
back:
|
|
266
|
+
jmp mainloop
|
|
267
|
+
fail:
|
|
268
|
+
lda #$02
|
|
269
|
+
sta RESULT
|
|
270
|
+
lda #$02
|
|
271
|
+
sta $d020
|
|
272
|
+
jmp mainloop
|
|
273
|
+
|
|
274
|
+
// One step of the 10-bit Galois LFSR held in idx: shift right, and if the
|
|
275
|
+
// bit that fell out was 1 XOR the taps in. From SEED the states 1 to 1023
|
|
276
|
+
// each come once before SEED comes round again; 0 never comes.
|
|
277
|
+
lfsr_step:
|
|
278
|
+
lsr idx + 1
|
|
279
|
+
ror idx
|
|
280
|
+
bcc !+
|
|
281
|
+
lda idx + 1
|
|
282
|
+
eor #TAP_HI
|
|
283
|
+
sta idx + 1
|
|
284
|
+
lda idx
|
|
285
|
+
eor #TAP_LO
|
|
286
|
+
sta idx
|
|
287
|
+
!: rts
|
|
288
|
+
|
|
289
|
+
// Copy cell idx (0 to 999) from screen B to the visible screen: screen byte
|
|
290
|
+
// and colour byte. The four pointers keep a zero low byte; their high bytes
|
|
291
|
+
// are the buffer's page plus the index's high byte, and Y is the low byte.
|
|
292
|
+
// No sum carries, so one CLC serves all four.
|
|
293
|
+
copy_cell:
|
|
294
|
+
ldy idx
|
|
295
|
+
lda idx + 1
|
|
296
|
+
clc
|
|
297
|
+
adc #>SCREEN_B
|
|
298
|
+
sta srcs + 1
|
|
299
|
+
adc #>(COLOUR_B - SCREEN_B)
|
|
300
|
+
sta srcc + 1
|
|
301
|
+
lda idx + 1
|
|
302
|
+
adc #>SCREEN
|
|
303
|
+
sta dsts + 1
|
|
304
|
+
lda idx + 1
|
|
305
|
+
adc #>COLOUR
|
|
306
|
+
sta dstc + 1
|
|
307
|
+
lda (srcs), y
|
|
308
|
+
sta (dsts), y
|
|
309
|
+
lda (srcc), y
|
|
310
|
+
sta (dstc), y
|
|
311
|
+
rts
|
|
312
|
+
|
|
313
|
+
// Build both screens. Cell (row, col) of A is GLYPH_A0 when row + col is
|
|
314
|
+
// even and GLYPH_A1 when odd, all light blue. Cell (row, col) of B is
|
|
315
|
+
// GLYPH_B0 when row + col is a multiple of four and GLYPH_B1 otherwise, all
|
|
316
|
+
// yellow. Then each gets its caption on row CAPTION_ROW.
|
|
317
|
+
build_screens:
|
|
318
|
+
lda #<SCREEN
|
|
319
|
+
sta row_a
|
|
320
|
+
lda #>SCREEN
|
|
321
|
+
sta row_a + 1
|
|
322
|
+
lda #<SCREEN_B
|
|
323
|
+
sta row_b
|
|
324
|
+
lda #>SCREEN_B
|
|
325
|
+
sta row_b + 1
|
|
326
|
+
ldx #$00 // row
|
|
327
|
+
rowloop:
|
|
328
|
+
ldy #$00 // col
|
|
329
|
+
colloop:
|
|
330
|
+
tya
|
|
331
|
+
stx slots // slots is free until the first frame
|
|
332
|
+
clc
|
|
333
|
+
adc slots // A = row + col
|
|
334
|
+
lsr
|
|
335
|
+
lda #GLYPH_A0
|
|
336
|
+
bcc !+
|
|
337
|
+
lda #GLYPH_A1
|
|
338
|
+
!: sta (row_a), y
|
|
339
|
+
tya
|
|
340
|
+
clc
|
|
341
|
+
adc slots
|
|
342
|
+
and #$03
|
|
343
|
+
beq stripe
|
|
344
|
+
lda #GLYPH_B1
|
|
345
|
+
bne !+
|
|
346
|
+
stripe:
|
|
347
|
+
lda #GLYPH_B0
|
|
348
|
+
!: sta (row_b), y
|
|
349
|
+
iny
|
|
350
|
+
cpy #40
|
|
351
|
+
bne colloop
|
|
352
|
+
lda row_a
|
|
353
|
+
clc
|
|
354
|
+
adc #40
|
|
355
|
+
sta row_a
|
|
356
|
+
bcc !+
|
|
357
|
+
inc row_a + 1
|
|
358
|
+
!: lda row_b
|
|
359
|
+
clc
|
|
360
|
+
adc #40
|
|
361
|
+
sta row_b
|
|
362
|
+
bcc !+
|
|
363
|
+
inc row_b + 1
|
|
364
|
+
!: inx
|
|
365
|
+
cpx #25
|
|
366
|
+
bne rowloop
|
|
367
|
+
|
|
368
|
+
ldx #$00 // colour: A light blue, B yellow, 1,024 each
|
|
369
|
+
!: lda #COLOUR_A
|
|
370
|
+
sta COLOUR, x
|
|
371
|
+
sta COLOUR + $100, x
|
|
372
|
+
sta COLOUR + $200, x
|
|
373
|
+
sta COLOUR + $300 - 24, x // the last page stops at cell 999
|
|
374
|
+
lda #COLOUR_B_INK
|
|
375
|
+
sta COLOUR_B, x
|
|
376
|
+
sta COLOUR_B + $100, x
|
|
377
|
+
sta COLOUR_B + $200, x
|
|
378
|
+
sta COLOUR_B + $300, x
|
|
379
|
+
inx
|
|
380
|
+
bne !-
|
|
381
|
+
|
|
382
|
+
ldx #7 // captions
|
|
383
|
+
!: lda caption_a, x
|
|
384
|
+
sta SCREEN + CAPTION_ROW * 40 + CAPTION_COL, x
|
|
385
|
+
lda caption_b, x
|
|
386
|
+
sta SCREEN_B + CAPTION_ROW * 40 + CAPTION_COL, x
|
|
387
|
+
dex
|
|
388
|
+
bpl !-
|
|
389
|
+
rts
|
|
390
|
+
|
|
391
|
+
caption_a: .text "screen a"
|
|
392
|
+
caption_b: .text "screen b"
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Build
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
java -jar KickAss.jar screen-dissolve.asm -o screen-dissolve.prg
|
|
399
|
+
java -jar KickAss.jar screen-dissolve.asm -define STOP25 -o screen-dissolve-stop25.prg
|
|
400
|
+
java -jar KickAss.jar screen-dissolve.asm -define SEQ -o screen-dissolve-seq.prg
|
|
401
|
+
java -jar KickAss.jar screen-dissolve.asm -define SEQ -define STOP25 -o screen-dissolve-seq-stop25.prg
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
`-showmem` reports one block at $0900-$0AF2 for the first build: 499
|
|
405
|
+
bytes, of which 16 are the two captions and the rest code. The PRG is 756
|
|
406
|
+
bytes. Screen B's 2,048 bytes at $2800 and the 128-byte cost log at $3000
|
|
407
|
+
are written at run time and are not in the file. A note on the variants:
|
|
408
|
+
KickAssembler 5.25 takes `-define NAME` as a preprocessor symbol only; an
|
|
409
|
+
earlier draft used `-define STOP=25` and read `STOP` as a value, and the
|
|
410
|
+
assembler accepted it while `#if !STOP` stayed true, so the build never
|
|
411
|
+
froze. The freeze frame is a constant behind a plain symbol for that
|
|
412
|
+
reason.
|
|
413
|
+
|
|
414
|
+
## Expected output
|
|
415
|
+
|
|
416
|
+
Black border and background. Screen A is a checker of the hatched glyph
|
|
417
|
+
`$66` and its reverse `$E6`, cell `(row, col)` holding `$66` when
|
|
418
|
+
`row + col` is even, all light blue, with `SCREEN A` on row 12 from column
|
|
419
|
+
16. Screen B has the solid block `$A0` where `row + col` is a multiple of
|
|
420
|
+
four and a full stop `$2E` elsewhere, all yellow, with `SCREEN B` in the
|
|
421
|
+
same place. From the first frame after start, 20 cells a frame go from A
|
|
422
|
+
to B in the LFSR's order, scattered over the whole screen; on frame 50 the
|
|
423
|
+
last of them, cell 0 at the top left, lands and the border goes green.
|
|
424
|
+
The dissolve takes 50 frames, 1.0 s on PAL and 0.83 s on NTSC (arithmetic
|
|
425
|
+
from 19,656 and 17,095 cycles a frame).
|
|
426
|
+
|
|
427
|
+
The pinned run is 5,000,000 cycles on both models. The picture is static
|
|
428
|
+
by then: the verdict store `STA $02FF` is at cycle 4,028,615 on PAL and
|
|
429
|
+
4,002,432 on NTSC in the `-moncommands` trace (route 2 of
|
|
430
|
+
`runtime/vice-reference.md`, "Verifying a run without a human"), so the
|
|
431
|
+
beam position at the limit does not matter and the shot is a complete
|
|
432
|
+
screen B under a green border on both models. Measured with PIL over the
|
|
433
|
+
1,000 cells of each pinned PNG, a cell counted as yellow if any of its 64
|
|
434
|
+
pixels is the model's yellow and light blue likewise: 999 yellow, 0 light
|
|
435
|
+
blue, 1 neither, on both models; the one is the space in `SCREEN B`.
|
|
436
|
+
`$0C0A` (the frame cell 0 landed on) reads `$32`, 50, and `$0C08` (the
|
|
437
|
+
largest frame cost) reads `$0C83`, 3,203, on both models.
|
|
438
|
+
|
|
439
|
+
The per-frame cost, CIA1 timer A around the 20 copies including every
|
|
440
|
+
LFSR pull and skip, logged as a word per frame at `$3000`: worst 3,203
|
|
441
|
+
cycles on frame 12, least 2,846 on frame 50 (its twentieth slot is the
|
|
442
|
+
hand-copied cell 0, with no pull), median 3,032, mode 2,978, mean 3,034.
|
|
443
|
+
The fifty figures are identical on PAL and NTSC, which is expected: the
|
|
444
|
+
work starts on line 251 in the lower border on both, there is no badline
|
|
445
|
+
there, and nothing in it depends on the model. The sequential control
|
|
446
|
+
(`-define SEQ`) also lands its last cell on frame 50 and its largest frame
|
|
447
|
+
costs 2,226, the difference being the LFSR pulls and the two compares.
|
|
448
|
+
|
|
449
|
+
Mid-way, from the `STOP25` builds at the same 5,000,000 cycles (both are
|
|
450
|
+
frozen after frame 25 and so static): the dissolve shows 499 yellow, 500
|
|
451
|
+
light blue and 1 neither, which is 500 cells of B landed in 25 frames at 20
|
|
452
|
+
a frame, the odd one being the caption space; the sequential control at
|
|
453
|
+
the same frame shows 500 yellow, 499 light blue and 1 neither, cells 0 to
|
|
454
|
+
499, which is rows 0 to 11 and half of row 12: a straight front, not a
|
|
455
|
+
dissolve. Both are PAL pictures under `docs/figures/`:
|
|
456
|
+
|
|
457
|
+
- `figures/screen-dissolve-mid-frame25.png`: the dissolve after frame 25.
|
|
458
|
+
- `figures/screen-dissolve-wipe-frame25.png`: the sequential control after
|
|
459
|
+
frame 25.
|
|
460
|
+
|
|
461
|
+
Verified: assembled with KickAssembler 5.25, run in VICE x64sc 3.10 with
|
|
462
|
+
the pinned command twice on each model with byte-identical PNGs, the
|
|
463
|
+
verdict, the frame and the cost log read from a `-moncommands` trace, and
|
|
464
|
+
the PNGs counted cell by cell with PIL.
|
|
465
|
+
|
|
466
|
+
Screenshots from the VICE runs this page describes:
|
|
467
|
+
`screenshots/screen-dissolve.png` (PAL) and
|
|
468
|
+
`screenshots/screen-dissolve-ntsc.png` (NTSC).
|
|
469
|
+
|
|
470
|
+
## Why this works
|
|
471
|
+
|
|
472
|
+
### The order
|
|
473
|
+
|
|
474
|
+
A maximal-length LFSR is a permutation of its non-zero states: from any
|
|
475
|
+
seed it visits every value from 1 to 2^n - 1 exactly once before coming
|
|
476
|
+
back to the seed. The register here is ten bits with taps `$240`, the
|
|
477
|
+
polynomial x^10 + x^7 + 1, in the right-shifting Galois form
|
|
478
|
+
`lfsr_random` in `techniques/maths.md` uses for its 8- and 16-bit
|
|
479
|
+
registers; the bit that falls out of `ROR idx` decides whether the taps
|
|
480
|
+
are XORed in. That it is maximal was checked by stepping it 1,023 times in
|
|
481
|
+
Python before the listing was written (1,023 distinct values, least 1,
|
|
482
|
+
greatest 1,023, back at the seed), and the run confirms it: the register
|
|
483
|
+
comes back to the seed on the 1,023rd pull, by which time 999 cells have
|
|
484
|
+
been copied, and the verdict counts frames from that.
|
|
485
|
+
|
|
486
|
+
Ten bits and not sixteen because the screen has 1,000 cells and 2^10 is
|
|
487
|
+
the first power of two above it. A 16-bit register would produce 65,535
|
|
488
|
+
values of which only 1,000 are cells, so on average sixty-four pulls
|
|
489
|
+
would go to waste for every cell copied. Ten bits wastes 24 pulls in
|
|
490
|
+
1,023, and they fall wherever the sequence puts them: the frame that
|
|
491
|
+
meets most of them is the worst frame, and at 3,203 against a median of
|
|
492
|
+
3,032 the spread is small.
|
|
493
|
+
|
|
494
|
+
### The two cells the register cannot give
|
|
495
|
+
|
|
496
|
+
An LFSR never produces zero; from zero it would stay there, which is the
|
|
497
|
+
pitfall `lfsr_zero_state_lockup` in `pitfalls/cpu.md`. So cell 0 is not in
|
|
498
|
+
the permutation and is copied by hand as the last slot of the frame after
|
|
499
|
+
the register returns to its seed. It is also why the seed must not be
|
|
500
|
+
zero; here it is 1, which is itself a cell, and its cell is copied on the
|
|
501
|
+
return pull, not the first. At the other end, states 1000 to 1023 are not
|
|
502
|
+
cells. They sit inside the 1,024-byte page but past the last cell: on the
|
|
503
|
+
screen side `$07E8` to `$07FF`, whose last eight bytes are the sprite
|
|
504
|
+
pointers, and on the colour side the 24 bytes `$DBE8` to `$DBFF`, which is
|
|
505
|
+
the bound `colour_ram_index_past_last_cell_hits_cia1` in
|
|
506
|
+
`pitfalls/text-mode-render.md` describes, the one past which an index
|
|
507
|
+
reaches `$DC00` and CIA1. The skip is a 16-bit compare against 1,000
|
|
508
|
+
before the copy, and a state that fails it costs one more pull.
|
|
509
|
+
|
|
510
|
+
### The copy
|
|
511
|
+
|
|
512
|
+
Four zero-page pointers keep a zero low byte; their high bytes are the
|
|
513
|
+
buffer's page plus the index's high byte and Y is the index's low byte,
|
|
514
|
+
so `LDA (srcs),Y` reads B's screen byte and the same Y reaches all four
|
|
515
|
+
buffers. None of the four sums carries, since the high byte of an index
|
|
516
|
+
below 1,000 is at most 3, so one `CLC` serves all four. With the pull,
|
|
517
|
+
the two compares and the loop that is about 150 cycles a cell, 3,000 a
|
|
518
|
+
frame at N = 20 (the measured figures above), and the copies start on
|
|
519
|
+
line 251 so they are over about 50 lines later: line 302 on PAL, and on
|
|
520
|
+
NTSC, whose frame wraps at 263, about line 37 of the next frame, still
|
|
521
|
+
in the upper border above the display's line 51 on both. The blank they
|
|
522
|
+
have to fit is about 7,000 cycles on PAL and about 4,100 on NTSC
|
|
523
|
+
(arithmetic), which is why the technique entry's scaling limit differs
|
|
524
|
+
by model. The frame is paced by the two-loop wait on line
|
|
525
|
+
251 that the screen-wipe recipe describes: leave the line, then reach it.
|
|
526
|
+
|
|
527
|
+
### The stopwatch and the verdict
|
|
528
|
+
|
|
529
|
+
CIA1 timer A is loaded with $FFFF and started on the phi2 clock before
|
|
530
|
+
the first slot and stopped after the last; $FFFF less the count is the
|
|
531
|
+
cost, logged at `$3000 + 2 * frame` and kept if largest. CIA1 interrupts
|
|
532
|
+
are masked so the timer is only a counter. The verdict is taken once,
|
|
533
|
+
when cell 0 has landed: the frame must be 50, which is 1,000 cells at 20
|
|
534
|
+
a frame, and the largest cost must be under 4,000.
|
|
535
|
+
|
|
536
|
+
## What it does not establish
|
|
537
|
+
|
|
538
|
+
Nothing here was run on hardware; VICE x64sc 3.10 is the instrument. The
|
|
539
|
+
costs are for this listing's shape, one subroutine call and four pointer
|
|
540
|
+
writes a cell; an unrolled copy or a self-modified absolute address would
|
|
541
|
+
be cheaper and was not built. A bitmap dissolve by byte, a dissolve of
|
|
542
|
+
colour RAM alone and a 2 by 2 block dissolve are variations on the
|
|
543
|
+
technique page and were not built or timed. Whether the dissolve reads as
|
|
544
|
+
smooth to a viewer, and at what N it stops reading as a fade and starts
|
|
545
|
+
reading as a scatter, is a perceptual question this page does not answer.
|