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,543 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: mci-interlace
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [mci_interlace_bitmap]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D012, D016, D018, D020, D021, DC04, DC05, DC0E, DD00]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Multicolour Interlace (MCI) Bitmap
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Two multicolour bitmaps are shown on alternate frames, the odd frame moved
|
|
19
|
+
right by one hires pixel through XSCROLL, so a display with persistence
|
|
20
|
+
averages them into a picture with twice the horizontal colour resolution
|
|
21
|
+
of one multicolour frame, at the cost of a flicker at half the frame rate.
|
|
22
|
+
The content is a test card the program draws itself at start-up: eight
|
|
23
|
+
vertical bands, each two colours in alternating multicolour pixels with the
|
|
24
|
+
two colours swapped between the frames, and one diagonal line present in
|
|
25
|
+
both bitmaps at the same multicolour position, which the odd frame shows one
|
|
26
|
+
hires pixel further right. After 300 toggling frames the program holds
|
|
27
|
+
frame A, so a static picture exists for the pin. This is the
|
|
28
|
+
`mci_interlace_bitmap` technique.
|
|
29
|
+
|
|
30
|
+
Verified in VICE x64sc: the static pin is byte-identical on two runs per
|
|
31
|
+
model, the two frames' diagonals are one hires pixel apart during the
|
|
32
|
+
toggling phase, and the control build with XSCROLL 0 on both frames puts
|
|
33
|
+
them on the same columns.
|
|
34
|
+
|
|
35
|
+
## Source
|
|
36
|
+
|
|
37
|
+
```asm
|
|
38
|
+
// mci-interlace.asm
|
|
39
|
+
// Two multicolour bitmaps shown on alternate frames, the odd frame moved
|
|
40
|
+
// right by one hires pixel with XSCROLL, so the eye averages them into a
|
|
41
|
+
// picture with twice the horizontal colour resolution of one frame. The
|
|
42
|
+
// content is a test card the program draws itself at start-up: eight
|
|
43
|
+
// vertical bands of two colours in alternating multicolour pixels, with
|
|
44
|
+
// the two colours swapped between the frames, and one diagonal line that
|
|
45
|
+
// is in both bitmaps at the same multicolour position, so the odd frame
|
|
46
|
+
// shows it one hires pixel to the right. After HOLD_FRAMES frames the
|
|
47
|
+
// program stops toggling and holds frame A, so a static picture exists.
|
|
48
|
+
//
|
|
49
|
+
// Two VIC banks: two 8000-byte bitmaps and two 1000-byte screens are
|
|
50
|
+
// 18,000 bytes and a bank is 16,384, so frame A is in bank 1 and frame B
|
|
51
|
+
// in bank 0. Colour RAM is one block and is shared by both frames.
|
|
52
|
+
//
|
|
53
|
+
// Region: both. The switch is made at raster line 251, below the display
|
|
54
|
+
// on PAL and NTSC. Nothing is cycle-exact.
|
|
55
|
+
|
|
56
|
+
.const XSHIFT = 1 // XSCROLL for frame B; set 0 for the control run
|
|
57
|
+
.const HOLD_FRAMES = 300 // toggling frames before the static hold
|
|
58
|
+
.const BITMAP_A = $6000 // bank 1, in-bank $2000
|
|
59
|
+
.const SCREEN_A = $5C00 // bank 1, in-bank $1C00
|
|
60
|
+
.const BITMAP_B = $2000 // bank 0, in-bank $2000
|
|
61
|
+
.const SCREEN_B = $0400 // bank 0, in-bank $0400
|
|
62
|
+
.const D018_A = (((SCREEN_A - $4000) / $400) << 4) | (((BITMAP_A - $4000) / $2000) << 3) // $78
|
|
63
|
+
.const D018_B = ((SCREEN_B / $400) << 4) | ((BITMAP_B / $2000) << 3) // $18
|
|
64
|
+
.const D016_A = $D8 // MCM on, CSEL 40 columns, XSCROLL 0
|
|
65
|
+
.const D016_B = $D8 | XSHIFT // the same with the half-pixel shift
|
|
66
|
+
.const PATTERN_A = $66 // %01 %10 %01 %10
|
|
67
|
+
.const PATTERN_B = $99 // %10 %01 %10 %01
|
|
68
|
+
.const LINE_COLOUR = 13 // colour RAM value: the %11 colour, light green
|
|
69
|
+
.const RECORD = $02F0 // timer records, frame count and done byte
|
|
70
|
+
|
|
71
|
+
.const ptr = $FB // zero-page pointer pair
|
|
72
|
+
.const tmp = $FD
|
|
73
|
+
.const acc = $FE
|
|
74
|
+
|
|
75
|
+
.pc = $0801 "basic"
|
|
76
|
+
:BasicUpstart(start)
|
|
77
|
+
|
|
78
|
+
.pc = $0810 "code"
|
|
79
|
+
start:
|
|
80
|
+
sei
|
|
81
|
+
lda #$0B // display off while the card is drawn
|
|
82
|
+
sta $D011
|
|
83
|
+
lda #0
|
|
84
|
+
sta $D020
|
|
85
|
+
sta $D021
|
|
86
|
+
lda $DD00 // the two bank values, serial lines kept
|
|
87
|
+
and #$FC
|
|
88
|
+
ora #$03
|
|
89
|
+
sta bank_b // bank 0
|
|
90
|
+
and #$FC
|
|
91
|
+
ora #$02
|
|
92
|
+
sta bank_a // bank 1
|
|
93
|
+
|
|
94
|
+
jsr fill_bitmaps
|
|
95
|
+
jsr fill_screens
|
|
96
|
+
jsr draw_diagonal
|
|
97
|
+
|
|
98
|
+
lda #0
|
|
99
|
+
sta frame
|
|
100
|
+
sta frame + 1
|
|
101
|
+
lda bank_a
|
|
102
|
+
sta $DD00
|
|
103
|
+
lda #D018_A
|
|
104
|
+
sta $D018
|
|
105
|
+
lda #D016_A
|
|
106
|
+
sta $D016
|
|
107
|
+
lda #$3B // bitmap mode, display on, 25 rows, YSCROLL 3
|
|
108
|
+
sta $D011
|
|
109
|
+
|
|
110
|
+
// ---- frame loop: one switch per frame at raster line 251 ----------------
|
|
111
|
+
loop:
|
|
112
|
+
lda #251
|
|
113
|
+
wait_251:
|
|
114
|
+
cmp $D012
|
|
115
|
+
bne wait_251
|
|
116
|
+
lda #$FF // CIA1 timer A one-shot from $FFFF
|
|
117
|
+
sta $DC04
|
|
118
|
+
sta $DC05
|
|
119
|
+
lda #$19
|
|
120
|
+
sta $DC0E
|
|
121
|
+
lda frame
|
|
122
|
+
and #1
|
|
123
|
+
bne odd_frame
|
|
124
|
+
lda bank_a // even frame: A, no shift
|
|
125
|
+
sta $DD00
|
|
126
|
+
lda #D018_A
|
|
127
|
+
sta $D018
|
|
128
|
+
lda #D016_A
|
|
129
|
+
sta $D016
|
|
130
|
+
ldx #0
|
|
131
|
+
jmp stamp
|
|
132
|
+
odd_frame:
|
|
133
|
+
lda bank_b // odd frame: B, one hires pixel right
|
|
134
|
+
sta $DD00
|
|
135
|
+
lda #D018_B
|
|
136
|
+
sta $D018
|
|
137
|
+
lda #D016_B
|
|
138
|
+
sta $D016
|
|
139
|
+
ldx #2
|
|
140
|
+
stamp:
|
|
141
|
+
lda $DC04 // timer at the last store, per parity
|
|
142
|
+
sta RECORD, x
|
|
143
|
+
lda $DC05
|
|
144
|
+
sta RECORD + 1, x
|
|
145
|
+
inc frame
|
|
146
|
+
bne !+
|
|
147
|
+
inc frame + 1
|
|
148
|
+
!: lda frame
|
|
149
|
+
sta RECORD + 4
|
|
150
|
+
lda frame + 1
|
|
151
|
+
sta RECORD + 5
|
|
152
|
+
cmp #>HOLD_FRAMES
|
|
153
|
+
bne leave_251
|
|
154
|
+
lda frame
|
|
155
|
+
cmp #<HOLD_FRAMES
|
|
156
|
+
beq hold
|
|
157
|
+
leave_251:
|
|
158
|
+
lda $D012 // let the raster leave 251 before waiting again
|
|
159
|
+
cmp #251
|
|
160
|
+
beq leave_251
|
|
161
|
+
jmp loop
|
|
162
|
+
|
|
163
|
+
hold: // static: frame A for ever
|
|
164
|
+
lda #251
|
|
165
|
+
wait_hold:
|
|
166
|
+
cmp $D012
|
|
167
|
+
bne wait_hold
|
|
168
|
+
lda bank_a
|
|
169
|
+
sta $DD00
|
|
170
|
+
lda #D018_A
|
|
171
|
+
sta $D018
|
|
172
|
+
lda #D016_A
|
|
173
|
+
sta $D016
|
|
174
|
+
lda #1
|
|
175
|
+
sta RECORD + 15 // done byte at $02FF
|
|
176
|
+
forever:
|
|
177
|
+
jmp forever
|
|
178
|
+
|
|
179
|
+
// ---- test card -----------------------------------------------------------
|
|
180
|
+
fill_bitmaps: // 32 pages each; the 192 bytes past 8000 are unused
|
|
181
|
+
lda #>BITMAP_A
|
|
182
|
+
sta ptr + 1
|
|
183
|
+
lda #PATTERN_A
|
|
184
|
+
jsr fill_32_pages
|
|
185
|
+
lda #>BITMAP_B
|
|
186
|
+
sta ptr + 1
|
|
187
|
+
lda #PATTERN_B
|
|
188
|
+
fill_32_pages:
|
|
189
|
+
ldx #32
|
|
190
|
+
ldy #0
|
|
191
|
+
sty ptr
|
|
192
|
+
fill_page:
|
|
193
|
+
sta (ptr), y
|
|
194
|
+
iny
|
|
195
|
+
bne fill_page
|
|
196
|
+
inc ptr + 1
|
|
197
|
+
dex
|
|
198
|
+
bne fill_page
|
|
199
|
+
rts
|
|
200
|
+
|
|
201
|
+
fill_screens: // 25 rows of the 40-byte band row, twice, and colour RAM
|
|
202
|
+
lda #<SCREEN_A
|
|
203
|
+
sta ptr
|
|
204
|
+
lda #>SCREEN_A
|
|
205
|
+
sta ptr + 1
|
|
206
|
+
jsr fill_screen
|
|
207
|
+
lda #<SCREEN_B
|
|
208
|
+
sta ptr
|
|
209
|
+
lda #>SCREEN_B
|
|
210
|
+
sta ptr + 1
|
|
211
|
+
jsr fill_screen
|
|
212
|
+
lda #LINE_COLOUR
|
|
213
|
+
ldx #0
|
|
214
|
+
colour_loop:
|
|
215
|
+
sta $D800, x
|
|
216
|
+
sta $D900, x
|
|
217
|
+
sta $DA00, x
|
|
218
|
+
sta $DB00, x
|
|
219
|
+
inx
|
|
220
|
+
bne colour_loop
|
|
221
|
+
rts
|
|
222
|
+
fill_screen:
|
|
223
|
+
ldx #25
|
|
224
|
+
screen_row:
|
|
225
|
+
ldy #39
|
|
226
|
+
screen_cell:
|
|
227
|
+
lda band_row, y
|
|
228
|
+
sta (ptr), y
|
|
229
|
+
dey
|
|
230
|
+
bpl screen_cell
|
|
231
|
+
lda ptr
|
|
232
|
+
clc
|
|
233
|
+
adc #40
|
|
234
|
+
sta ptr
|
|
235
|
+
bcc !+
|
|
236
|
+
inc ptr + 1
|
|
237
|
+
!: dex
|
|
238
|
+
bne screen_row
|
|
239
|
+
rts
|
|
240
|
+
|
|
241
|
+
draw_diagonal: // multicolour x = 4/5 of y, rows 0 to 199, both bitmaps
|
|
242
|
+
lda #0
|
|
243
|
+
sta acc
|
|
244
|
+
sta xpos
|
|
245
|
+
sta ypos
|
|
246
|
+
diag_row:
|
|
247
|
+
lda ypos
|
|
248
|
+
and #7
|
|
249
|
+
sta tmp // line within the cell row
|
|
250
|
+
lda ypos
|
|
251
|
+
lsr
|
|
252
|
+
lsr
|
|
253
|
+
lsr
|
|
254
|
+
tax // cell row 0 to 24
|
|
255
|
+
lda xpos
|
|
256
|
+
lsr
|
|
257
|
+
lsr
|
|
258
|
+
tay // cell column 0 to 39
|
|
259
|
+
lda row_lo, x
|
|
260
|
+
clc
|
|
261
|
+
adc col_lo, y
|
|
262
|
+
sta ptr
|
|
263
|
+
lda row_hi, x
|
|
264
|
+
adc col_hi, y
|
|
265
|
+
sta ptr + 1 // byte in bitmap A
|
|
266
|
+
lda xpos
|
|
267
|
+
and #3
|
|
268
|
+
tax
|
|
269
|
+
lda pair_mask, x
|
|
270
|
+
ldy tmp
|
|
271
|
+
ora (ptr), y
|
|
272
|
+
sta (ptr), y // frame A
|
|
273
|
+
lda ptr + 1
|
|
274
|
+
sec
|
|
275
|
+
sbc #>(BITMAP_A - BITMAP_B)
|
|
276
|
+
sta ptr + 1
|
|
277
|
+
lda pair_mask, x
|
|
278
|
+
ora (ptr), y
|
|
279
|
+
sta (ptr), y // frame B, same multicolour position
|
|
280
|
+
lda acc // x advances 4 every 5 rows
|
|
281
|
+
clc
|
|
282
|
+
adc #4
|
|
283
|
+
cmp #5
|
|
284
|
+
bcc !+
|
|
285
|
+
sbc #5
|
|
286
|
+
inc xpos
|
|
287
|
+
!: sta acc
|
|
288
|
+
inc ypos
|
|
289
|
+
lda ypos
|
|
290
|
+
cmp #200
|
|
291
|
+
bne diag_row
|
|
292
|
+
rts
|
|
293
|
+
|
|
294
|
+
// ---- tables and variables ------------------------------------------------
|
|
295
|
+
band_row: // cell column c is band c/5; pair (k, k+1) as the two nibbles
|
|
296
|
+
.fill 40, ((floor(i / 5)) << 4) | (floor(i / 5) + 1)
|
|
297
|
+
row_lo:
|
|
298
|
+
.fill 25, <(BITMAP_A + i * 320)
|
|
299
|
+
row_hi:
|
|
300
|
+
.fill 25, >(BITMAP_A + i * 320)
|
|
301
|
+
col_lo:
|
|
302
|
+
.fill 40, <(i * 8)
|
|
303
|
+
col_hi:
|
|
304
|
+
.fill 40, >(i * 8)
|
|
305
|
+
pair_mask:
|
|
306
|
+
.byte $C0, $30, $0C, $03 // %11 in multicolour pixel 0, 1, 2, 3 of a byte
|
|
307
|
+
|
|
308
|
+
frame: .word 0
|
|
309
|
+
bank_a: .byte 0
|
|
310
|
+
bank_b: .byte 0
|
|
311
|
+
xpos: .byte 0
|
|
312
|
+
ypos: .byte 0
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Build
|
|
316
|
+
|
|
317
|
+
```sh
|
|
318
|
+
java -jar KickAss.jar mci-interlace.asm -o out.prg
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
KickAssembler 5.25; the PRG is 620 bytes.
|
|
322
|
+
|
|
323
|
+
Pinned run, PAL and NTSC:
|
|
324
|
+
|
|
325
|
+
```sh
|
|
326
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
327
|
+
-limitcycles 12000000 -exitscreenshot out.png -autostart out.prg
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
Add `-model ntsc` for the second picture. 12,000,000 cycles is past the
|
|
331
|
+
300th frame on both models, so the picture is the static hold of frame A
|
|
332
|
+
and the exit may land on any raster line: consecutive fields are the same.
|
|
333
|
+
To read the timer records back, add `-moncommands timer.mon` with a file
|
|
334
|
+
that traces the done byte and dumps the record:
|
|
335
|
+
|
|
336
|
+
```text
|
|
337
|
+
logname "/tmp/timer.log"
|
|
338
|
+
log on
|
|
339
|
+
trace store 02ff
|
|
340
|
+
command 1 "m 02f0 02ff"
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
For the two frames of the toggling phase, PAL only, run the same command
|
|
344
|
+
with `-limitcycles 4990300` (frame B) and `-limitcycles 5009956` (frame A).
|
|
345
|
+
The two counts are one PAL frame of 19,656 cycles apart, and each lands
|
|
346
|
+
about 1,490 cycles after the switch on raster line 251, that is on line
|
|
347
|
+
274 or so, in the vertical blank, so the display rows all belong to one
|
|
348
|
+
field. They were derived from the monitor: the hold's done byte is stored
|
|
349
|
+
at cycle 9,116,570 on PAL (the trace line prints the cycle), which is
|
|
350
|
+
frame 300's line 251, so frame n's switch is at 9,116,570 minus
|
|
351
|
+
(300 - n) x 19,656; n = 90 gives 4,988,810. A count that lands
|
|
352
|
+
mid-display splits the picture: 5,000,000 is 11,190 cycles after that
|
|
353
|
+
switch, around raster line 117, and its screenshot has rows 35 to 100
|
|
354
|
+
equal to frame A and rows 101 to 234 equal to frame B (measured; this is
|
|
355
|
+
the draw-buffer behaviour in `runtime/vice-reference.md`, "Reading the
|
|
356
|
+
exit screenshot").
|
|
357
|
+
|
|
358
|
+
The control run is the same source with `XSHIFT` set to 0, built and run
|
|
359
|
+
at the same two toggling counts.
|
|
360
|
+
|
|
361
|
+
## Expected output
|
|
362
|
+
|
|
363
|
+
Black border and background. Eight vertical bands each 40 hires pixels
|
|
364
|
+
wide, in fine two-pixel stripes: black and white, white and red, red and
|
|
365
|
+
cyan, cyan and purple, purple and green, green and blue, blue and yellow,
|
|
366
|
+
yellow and orange (colours 0 to 8, band k is the pair k and k + 1). One
|
|
367
|
+
light green diagonal from the top left corner of the display to the
|
|
368
|
+
bottom right corner, two hires pixels wide. Nothing is printed.
|
|
369
|
+
|
|
370
|
+
`recipes/kickassembler/screenshots/mci-interlace.png` (PAL, 384 by 272)
|
|
371
|
+
and `mci-interlace-ntsc.png` (NTSC, 384 by 247) were each produced twice
|
|
372
|
+
by the pinned command with identical bytes (md5 `1707650c...` PAL,
|
|
373
|
+
`09e6b4be...` NTSC). Counted with PIL, the display window (x 32 to 351,
|
|
374
|
+
rows 35 to 234 on PAL, 23 to 222 on NTSC) holds exactly 400 light green
|
|
375
|
+
pixels on both models: 200 rows, two pixels each. The light green is
|
|
376
|
+
(183, 255, 134) in VICE's PAL palette and (198, 255, 186) on NTSC.
|
|
377
|
+
|
|
378
|
+
### The static hold (frame A)
|
|
379
|
+
|
|
380
|
+
Diagonal columns at seven rows, identical on PAL and on NTSC twelve rows
|
|
381
|
+
higher (the NTSC display starts at row 23):
|
|
382
|
+
|
|
383
|
+
| PAL row | NTSC row | Light green columns |
|
|
384
|
+
|---|---|---|
|
|
385
|
+
| 35 | 23 | 32, 33 |
|
|
386
|
+
| 60 | 48 | 72, 73 |
|
|
387
|
+
| 100 | 88 | 136, 137 |
|
|
388
|
+
| 134 | 122 | 190, 191 |
|
|
389
|
+
| 150 | 138 | 216, 217 |
|
|
390
|
+
| 200 | 188 | 296, 297 |
|
|
391
|
+
| 234 | 222 | 350, 351 |
|
|
392
|
+
|
|
393
|
+
Band 0 on row 60, columns 32 to 39: black, black, white, white, black,
|
|
394
|
+
black, white, white. Band 2 on the same row, columns 112 to 119: red
|
|
395
|
+
(175, 60, 88), red, cyan (126, 243, 214), cyan, red, red, cyan, cyan.
|
|
396
|
+
Bitmap byte $66 is %01 %10 %01 %10, so the screen's high nibble colour
|
|
397
|
+
comes first in every byte.
|
|
398
|
+
|
|
399
|
+
### Frame B (PAL, 4,990,300 cycles)
|
|
400
|
+
|
|
401
|
+
`screenshots/mci-interlace-frame-b.png`, produced twice with identical
|
|
402
|
+
bytes (md5 `7a7153a2...`). Everything is one hires pixel to the right of
|
|
403
|
+
frame A: the diagonal is at 33 and 34 on row 35, 73 and 74 on row 60, 191
|
|
404
|
+
and 192 on row 134, and 351 alone on row 234, its second pixel being under
|
|
405
|
+
the right border, so the window holds 399 light green pixels. Column 32,
|
|
406
|
+
the leftmost, is black on every row: with XSCROLL 1 in 40-column mode the
|
|
407
|
+
first column shows the background colour. Band 0 on row 60, columns 32 to
|
|
408
|
+
39: black, white, white, black, black, white, white, black. Band 2,
|
|
409
|
+
columns 112 to 119: white (the last pixel of band 1, moved in), cyan, cyan,
|
|
410
|
+
red, red, cyan, cyan, red, so the bitmap byte $99 puts the low nibble
|
|
411
|
+
colour first and the shift moves the whole row one column right.
|
|
412
|
+
|
|
413
|
+
All 200 display rows differ between the two frames and no border row does.
|
|
414
|
+
|
|
415
|
+
### The half-pixel check
|
|
416
|
+
|
|
417
|
+
At row 134 the diagonal is on columns 190 and 191 in frame A and 191 and
|
|
418
|
+
192 in frame B: one hires pixel, half a multicolour pixel, apart. The
|
|
419
|
+
same one-pixel difference holds at every measured row.
|
|
420
|
+
|
|
421
|
+
Control, `XSHIFT = 0`: the frame B screenshot at 4,990,300 cycles has the
|
|
422
|
+
diagonal on 190 and 191 at row 134, and on 32 and 33, 72 and 73, 136 and
|
|
423
|
+
137, 216 and 217, 296 and 297 and 350 and 351 at the other six rows,
|
|
424
|
+
exactly frame A's columns, with 400 light green pixels in the window. The
|
|
425
|
+
band stripes still swap between the frames, the diagonal does not move,
|
|
426
|
+
and column 32 is no longer blank. The frame A screenshot of the control
|
|
427
|
+
is byte-identical to the shifted build's.
|
|
428
|
+
|
|
429
|
+
### The average
|
|
430
|
+
|
|
431
|
+
`screenshots/mci-interlace-average.png` is the PIL `Image.blend` of the
|
|
432
|
+
two toggling-phase screenshots at weight 0.5, an arithmetic stand-in for
|
|
433
|
+
what a persistent display would show; it is not a VICE output and is not
|
|
434
|
+
pinned. Row 60, columns 112 to 120, frame A, frame B and the average:
|
|
435
|
+
|
|
436
|
+
| Column | Frame A | Frame B | Average |
|
|
437
|
+
|---|---|---|---|
|
|
438
|
+
| 112 | red (175, 60, 88) | white | (215, 157, 171) |
|
|
439
|
+
| 113 | red | cyan (126, 243, 214) | (150, 151, 151) |
|
|
440
|
+
| 114 | cyan | cyan | cyan |
|
|
441
|
+
| 115 | cyan | red | (150, 151, 151) |
|
|
442
|
+
| 116 | red | red | red |
|
|
443
|
+
| 117 | red | cyan | (150, 151, 151) |
|
|
444
|
+
| 118 | cyan | cyan | cyan |
|
|
445
|
+
| 119 | cyan | red | (150, 151, 151) |
|
|
446
|
+
| 120 | red | red | red |
|
|
447
|
+
|
|
448
|
+
So the average of a band is a one-pixel pattern of pure red, blend, pure
|
|
449
|
+
cyan, blend: four distinct columns per multicolour pixel pair where one
|
|
450
|
+
frame has two. Band 0 on the same row from column 32: black, (127, 127,
|
|
451
|
+
127), white, (127, 127, 127), black, (127, 127, 127).
|
|
452
|
+
|
|
453
|
+
### The frame loop's cost
|
|
454
|
+
|
|
455
|
+
The monitor dump on the done byte reads the same on both models:
|
|
456
|
+
|
|
457
|
+
```text
|
|
458
|
+
>C:02f0 dd ff df ff
|
|
459
|
+
>C:02f4 2c 01 00 00
|
|
460
|
+
>C:02f8 00 00 00 00
|
|
461
|
+
>C:02fc 00 00 00 01
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
CIA1 timer A, one-shot from $FFFF, started after the `cmp $D012` match
|
|
465
|
+
and read at the `lda $DC04` after the last register store: $FFDD for the
|
|
466
|
+
even frame, 34 cycles, and $FFDF for the odd frame, 32 cycles ($FFFF minus
|
|
467
|
+
the value; the count starts the cycle after `sta $DC0E` and includes the
|
|
468
|
+
reading instruction's own cycles up to its read). The even path is two
|
|
469
|
+
cycles longer because it takes a `jmp` over the odd path where the odd
|
|
470
|
+
path took its branch. The frame counter is $012C, 300, and the done byte
|
|
471
|
+
is 1. Adding the 16 cycles from the match to the timer start (arithmetic
|
|
472
|
+
from the instruction table: `lda #`, `sta`, `sta`, `lda #`, `sta`) gives
|
|
473
|
+
50 and 48 cycles from the raster match to the last store, well inside one
|
|
474
|
+
raster line. The whole frame loop, with its two polls of $D012, is under
|
|
475
|
+
two raster lines a frame; the rest of the frame is free.
|
|
476
|
+
|
|
477
|
+
## Why this works
|
|
478
|
+
|
|
479
|
+
### Two banks, because two frames do not fit in one
|
|
480
|
+
|
|
481
|
+
A multicolour bitmap is 8000 bytes and its screen 1000; two of each are
|
|
482
|
+
18,000 bytes and a VIC bank is 16,384, so the two frames cannot share a
|
|
483
|
+
bank (an earlier plan for this page put both in bank 1 and did not fit).
|
|
484
|
+
Frame A is bitmap $6000 and screen $5C00 in bank 1, $D018 = $78 (screen
|
|
485
|
+
at in-bank $1C00, bits 7 to 4 = 7; bitmap at in-bank $2000, bit 3 set).
|
|
486
|
+
Frame B is bitmap $2000 and screen $0400 in bank 0, $D018 = $18. Bank 0's
|
|
487
|
+
character ROM shadow at $1000 to $1FFF does not touch either, and the
|
|
488
|
+
program at $0810 ends below $0B00. The switch is therefore three stores,
|
|
489
|
+
$DD00, $D018 and $D016, and the `bank_a` and `bank_b` bytes are computed
|
|
490
|
+
once from $DD00 so the serial bus lines in its upper bits are kept.
|
|
491
|
+
|
|
492
|
+
Colour RAM is one block at $D800 whatever bank or $D018 is selected, so
|
|
493
|
+
the %11 colour of every cell is the same in both frames; here it is the
|
|
494
|
+
diagonal's light green everywhere. That is the limit of the technique: a
|
|
495
|
+
converter preparing an MCI pair chooses the two screen nibbles per frame
|
|
496
|
+
but one colour RAM nibble per cell for both.
|
|
497
|
+
|
|
498
|
+
### The half pixel
|
|
499
|
+
|
|
500
|
+
XSCROLL shifts the whole display in hires pixels, and a multicolour pixel
|
|
501
|
+
is two of them, so `$D016 = $D9` on the odd frame moves frame B half a
|
|
502
|
+
multicolour pixel right. $D8 keeps MCM (bit 4) and CSEL (bit 3) set and
|
|
503
|
+
bits 6 and 7 as they read back; the register is written whole, from a
|
|
504
|
+
constant, so the mode bits cannot be lost to a read-modify-write of the
|
|
505
|
+
scroll field (`pitfalls/scroll.md`, `d016_unmasked_rmw_clobbers_csel_mcm`).
|
|
506
|
+
The control build shows that without the shift the two frames' diagonals
|
|
507
|
+
coincide and only the band stripes alternate, which is a colour blend
|
|
508
|
+
without the resolution gain.
|
|
509
|
+
|
|
510
|
+
### Switching below the display
|
|
511
|
+
|
|
512
|
+
`lda #251 / cmp $D012 / bne` waits for raster line 251, one line below
|
|
513
|
+
the 200-line window on both models, so a frame is never shown with one
|
|
514
|
+
bank's bitmap above a line and the other's below. The switch is done
|
|
515
|
+
within the line, and `leave_251` then waits for $D012 to move on, because
|
|
516
|
+
the loop's 50 cycles are shorter than a 63-cycle line and the poll would
|
|
517
|
+
otherwise match the same line twice and switch twice in one frame. Both
|
|
518
|
+
frames are set up before the display is turned on, so the first visible
|
|
519
|
+
field is already frame A.
|
|
520
|
+
|
|
521
|
+
### Drawing the card
|
|
522
|
+
|
|
523
|
+
`band_row` is 40 bytes built by `.fill`: cell column c is band c / 5,
|
|
524
|
+
value (k << 4) | (k + 1), copied to all 25 rows of both screens. Frame A's
|
|
525
|
+
bitmap is $66 throughout and frame B's is $99: the same two nibbles read in
|
|
526
|
+
the other order, so the stripes swap between the frames without the
|
|
527
|
+
screens differing. The diagonal walks x forward by four multicolour
|
|
528
|
+
pixels every five rows (`acc`), computes the byte from a 25-entry row
|
|
529
|
+
table and a 40-entry column table, ORs a %11 pair into frame A's byte and
|
|
530
|
+
then into the byte $4000 lower, which is the same position in frame B.
|
|
531
|
+
ORing %11 over %01 or %10 gives %11, the colour RAM colour, which is why
|
|
532
|
+
the diagonal reads light green in both frames.
|
|
533
|
+
|
|
534
|
+
### What it does not establish
|
|
535
|
+
|
|
536
|
+
Whether a real CRT's persistence blends the two frames as the PIL average
|
|
537
|
+
does, or how visible the 25 Hz (PAL) or 30 Hz (NTSC) flicker is to a
|
|
538
|
+
viewer, neither of which VICE measures. Whether a real 6569 or 6567 places
|
|
539
|
+
the XSCROLL 1 frame exactly one hires pixel right, as VICE does here. The
|
|
540
|
+
NTSC toggling phase was not photographed, only its static hold; the timer
|
|
541
|
+
figures are the same on both models. Nothing here is a converted picture:
|
|
542
|
+
how well the technique serves real artwork is a question for a converter
|
|
543
|
+
and a viewer, not for this test card.
|