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,501 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: sprite-stretcher
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: pal
|
|
6
|
+
techniques: [sprite_stretcher_d017]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D010, D011, D012, D015, D017, D019, D01A, D01B, D01C, D01D, D021, D027, DC04, DC05, DC0D, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler Sprite Stretcher
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
The $D017 sprite stretcher: a sprite made taller than its data by writing
|
|
19
|
+
its Y-expand bit twice on every raster line, so that the VIC-II's
|
|
20
|
+
expansion flip-flop is left in the "repeat this row" state at the moment
|
|
21
|
+
the row counter would otherwise advance. One white sprite with numbered
|
|
22
|
+
rows sits at X 160, Y 100; a stable raster interrupt on line 99 (the
|
|
23
|
+
double-IRQ method of `stable-raster-irq.md`) is followed by straight-line
|
|
24
|
+
code for lines 100 to 180 that, on every line that is not a badline,
|
|
25
|
+
clears bit 0 of $D017 with a write landing on CPU cycle C-4 and sets it
|
|
26
|
+
again with a write landing on cycle C. The write cycle C is a build
|
|
27
|
+
symbol (`-define C48` to `-define C62`) so the whole range around the
|
|
28
|
+
flip-flop's inversion cycle can be swept; the pinned build is C=52.
|
|
29
|
+
|
|
30
|
+
Measured in VICE x64sc 3.10, PAL 6569 and NTSC 6567R8, on 2026-09-23.
|
|
31
|
+
The result: with C anywhere from 48 to 55 the sprite is 91 lines tall
|
|
32
|
+
instead of 21, every row from 1 to 9 drawn on eight consecutive lines,
|
|
33
|
+
and the row advancing only on the badlines, where the CPU is stalled and
|
|
34
|
+
cannot write. C=55 is the last CPU write cycle that completes before the
|
|
35
|
+
sprite's DMA stall (BA low from cycle 55); with C at 56 the write is
|
|
36
|
+
pushed to cycle 61, past the inversion, and the sprite is 24 lines. From
|
|
37
|
+
57 upwards the code runs long, the
|
|
38
|
+
writes drift into the crunch cycle of the following line, and the
|
|
39
|
+
result is the irregular, data-dependent lengthening of
|
|
40
|
+
`sprite_y_stretch_glitch`, not a stretch. The `NOSTRETCH` control, the
|
|
41
|
+
same code with both writes sent to a RAM byte, gives the plain 21 lines.
|
|
42
|
+
|
|
43
|
+
## Source
|
|
44
|
+
|
|
45
|
+
```asm
|
|
46
|
+
// sprite-stretcher.asm
|
|
47
|
+
// The $D017 sprite stretcher, measured. One white sprite whose 21 rows are
|
|
48
|
+
// numbered (row r holds the byte r+1 three times) sits at X=160, Y=100. A
|
|
49
|
+
// stable raster interrupt on line 99 (the double-IRQ method of
|
|
50
|
+
// stable-raster-irq.asm) is followed by straight-line code for lines 100 to
|
|
51
|
+
// 180 that, on every line that is not a badline, clears the sprite's
|
|
52
|
+
// Y-expand bit with a write landing on CPU cycle C-4 and sets it again with
|
|
53
|
+
// a write landing on cycle C. Between those two writes and the VIC's own
|
|
54
|
+
// inversion of the expansion flip-flop in cycle 56 the flip-flop ends every
|
|
55
|
+
// line in the "repeat this row" state, so the row the sprite is on is drawn
|
|
56
|
+
// again on the next line. On a badline the CPU cannot write in time, the
|
|
57
|
+
// row advances once, and the sprite comes out as rows held for eight lines
|
|
58
|
+
// each (measured: 91 lines tall for C from 48 to 55).
|
|
59
|
+
//
|
|
60
|
+
// Build variants (java -jar KickAss.jar sprite-stretcher.asm -o out.prg ...):
|
|
61
|
+
// -define C<n> CPU cycle of the setting write, C48 to C62 (default 52)
|
|
62
|
+
// -define NOSTRETCH the same code with both writes sent to a RAM byte
|
|
63
|
+
// -define CALIB the same code with both writes sent to $D021, so the
|
|
64
|
+
// write cycle can be read off the screenshot as a colour edge
|
|
65
|
+
// -define NTSC two more read cycles per line for the 65-cycle line of
|
|
66
|
+
// the 6567R8 (the sync padding is the PAL one, unmeasured)
|
|
67
|
+
|
|
68
|
+
// KickAssembler 5.25 takes -define NAME as a preprocessor symbol only, so the
|
|
69
|
+
// write cycle is chosen by one of fifteen plain symbols, C48 to C62.
|
|
70
|
+
#if C48
|
|
71
|
+
.const WRITE_CYCLE = 48
|
|
72
|
+
#elif C49
|
|
73
|
+
.const WRITE_CYCLE = 49
|
|
74
|
+
#elif C50
|
|
75
|
+
.const WRITE_CYCLE = 50
|
|
76
|
+
#elif C51
|
|
77
|
+
.const WRITE_CYCLE = 51
|
|
78
|
+
#elif C52
|
|
79
|
+
.const WRITE_CYCLE = 52
|
|
80
|
+
#elif C53
|
|
81
|
+
.const WRITE_CYCLE = 53
|
|
82
|
+
#elif C54
|
|
83
|
+
.const WRITE_CYCLE = 54
|
|
84
|
+
#elif C55
|
|
85
|
+
.const WRITE_CYCLE = 55
|
|
86
|
+
#elif C56
|
|
87
|
+
.const WRITE_CYCLE = 56
|
|
88
|
+
#elif C57
|
|
89
|
+
.const WRITE_CYCLE = 57
|
|
90
|
+
#elif C58
|
|
91
|
+
.const WRITE_CYCLE = 58
|
|
92
|
+
#elif C59
|
|
93
|
+
.const WRITE_CYCLE = 59
|
|
94
|
+
#elif C60
|
|
95
|
+
.const WRITE_CYCLE = 60
|
|
96
|
+
#elif C61
|
|
97
|
+
.const WRITE_CYCLE = 61
|
|
98
|
+
#elif C62
|
|
99
|
+
.const WRITE_CYCLE = 62
|
|
100
|
+
#else
|
|
101
|
+
.const WRITE_CYCLE = 52
|
|
102
|
+
#endif
|
|
103
|
+
.print "WRITE_CYCLE = " + WRITE_CYCLE
|
|
104
|
+
|
|
105
|
+
#if NOSTRETCH
|
|
106
|
+
.const TARGET = dummy
|
|
107
|
+
#elif CALIB
|
|
108
|
+
.const TARGET = $d021
|
|
109
|
+
#else
|
|
110
|
+
.const TARGET = $d017
|
|
111
|
+
#endif
|
|
112
|
+
|
|
113
|
+
#if NTSC
|
|
114
|
+
.const EXTRA = 2
|
|
115
|
+
#else
|
|
116
|
+
.const EXTRA = 0
|
|
117
|
+
#endif
|
|
118
|
+
.const SYNC_PAD = 11 // measured in stable-raster-irq.asm (VICE 3.10, PAL)
|
|
119
|
+
.const FIRST = 100 // first toggled line; the sprite's Y
|
|
120
|
+
.const LAST = 180 // last toggled line
|
|
121
|
+
.const YSCROLL = 0 // badlines on 96, 104, ... 176: none on the sync line 99
|
|
122
|
+
.const SPRITE_X = 160
|
|
123
|
+
.const SPRITE_Y = 100
|
|
124
|
+
// Code cycles per line: the head (pad, STY, STX) ends with the write on
|
|
125
|
+
// cycle C; the rest of the line's 58 code cycles follow it as reads, so
|
|
126
|
+
// the sprite's DMA stall (BA low from cycle 55, CPU stopped on its next
|
|
127
|
+
// read, resumed at 60) falls inside them and the line comes to 63.
|
|
128
|
+
.const POST = (57 - WRITE_CYCLE) >= 2 ? (57 - WRITE_CYCLE) : 2
|
|
129
|
+
|
|
130
|
+
BasicUpstart2(start)
|
|
131
|
+
|
|
132
|
+
// Delay(n): emit exactly n cycles of straight-line code, n >= 2.
|
|
133
|
+
.macro Delay(n) {
|
|
134
|
+
.if (n < 2) .error "Delay needs >= 2 cycles"
|
|
135
|
+
.if ((n & 1) != 0) { bit $ea }
|
|
136
|
+
.for (var i = 0; i < ((n & 1) != 0 ? n - 3 : n) / 2; i++) { nop }
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
* = $0900
|
|
140
|
+
start:
|
|
141
|
+
sei
|
|
142
|
+
lda #$7f
|
|
143
|
+
sta $dc0d // CIA1 ICR: mask every CIA1 source
|
|
144
|
+
lda $dc0d
|
|
145
|
+
lda #$ff // CIA1 timer A latch = $FFFF, started later
|
|
146
|
+
sta $dc04
|
|
147
|
+
sta $dc05
|
|
148
|
+
|
|
149
|
+
ldx #0
|
|
150
|
+
!: lda #$20 // clear the screen so the stripes sit on plain
|
|
151
|
+
sta $0400,x // background
|
|
152
|
+
sta $0500,x
|
|
153
|
+
sta $0600,x
|
|
154
|
+
sta $0700,x
|
|
155
|
+
inx
|
|
156
|
+
bne !-
|
|
157
|
+
|
|
158
|
+
ldx #0 // row r of the sprite = byte r+1, three times
|
|
159
|
+
ldy #1
|
|
160
|
+
row_fill:
|
|
161
|
+
tya
|
|
162
|
+
sta sprite_data,x
|
|
163
|
+
sta sprite_data+1,x
|
|
164
|
+
sta sprite_data+2,x
|
|
165
|
+
inx
|
|
166
|
+
inx
|
|
167
|
+
inx
|
|
168
|
+
iny
|
|
169
|
+
cpx #63
|
|
170
|
+
bne row_fill
|
|
171
|
+
|
|
172
|
+
lda #(sprite_data / 64)
|
|
173
|
+
sta $07f8 // sprite 0 pointer
|
|
174
|
+
lda #SPRITE_X
|
|
175
|
+
sta $d000
|
|
176
|
+
lda #SPRITE_Y
|
|
177
|
+
sta $d001
|
|
178
|
+
lda #$01
|
|
179
|
+
sta $d027 // white
|
|
180
|
+
sta $d015 // sprite 0 on
|
|
181
|
+
lda #$00
|
|
182
|
+
sta $d010
|
|
183
|
+
sta $d017 // no Y expansion to begin with
|
|
184
|
+
sta $d01d
|
|
185
|
+
sta $d01c
|
|
186
|
+
sta $d01b
|
|
187
|
+
lda #$06
|
|
188
|
+
sta $d021
|
|
189
|
+
|
|
190
|
+
lda #<irq1
|
|
191
|
+
sta $0314
|
|
192
|
+
lda #>irq1
|
|
193
|
+
sta $0315
|
|
194
|
+
|
|
195
|
+
lda #($18 | YSCROLL) // DEN=1, RSEL=1, YSCROLL as above, RST8=0
|
|
196
|
+
sta $d011
|
|
197
|
+
lda #FIRST - 3
|
|
198
|
+
sta $d012 // irq1 three lines above the first toggled line
|
|
199
|
+
lda #$01
|
|
200
|
+
sta $d01a
|
|
201
|
+
sta $d019
|
|
202
|
+
cli
|
|
203
|
+
|
|
204
|
+
main:
|
|
205
|
+
inc $c000,x // long instructions, as in stable-raster-irq.asm,
|
|
206
|
+
inc $c100,x // so irq1's entry jitter is the full 0 to 6
|
|
207
|
+
inc $c200,x
|
|
208
|
+
inx
|
|
209
|
+
jmp main
|
|
210
|
+
|
|
211
|
+
// ---------------------------------------------------------------------------
|
|
212
|
+
// irq1: first half of the double IRQ (stable-raster-irq.asm, unchanged).
|
|
213
|
+
// ---------------------------------------------------------------------------
|
|
214
|
+
irq1:
|
|
215
|
+
lda #<irq2
|
|
216
|
+
sta $0314
|
|
217
|
+
lda #>irq2
|
|
218
|
+
sta $0315
|
|
219
|
+
lda #FIRST - 1
|
|
220
|
+
sta $d012 // irq2 on the sync line, 99
|
|
221
|
+
lda #$01
|
|
222
|
+
sta $d019
|
|
223
|
+
tsx
|
|
224
|
+
stx saved_sp
|
|
225
|
+
cli
|
|
226
|
+
.for (var i = 0; i < 40; i++) { nop }
|
|
227
|
+
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
// irq2: entered from inside a NOP; the two $D012 reads and the BEQ absorb
|
|
230
|
+
// the last cycle. The first instruction after the BEQ starts on cycle 4 of
|
|
231
|
+
// line 100. Measured with the CALIB build: the sprite's DMA pulls BA low
|
|
232
|
+
// from cycle 55 and the CPU stops on its next read, and the build whose
|
|
233
|
+
// setting write is the last one that can land before that stop is the one
|
|
234
|
+
// this file calls C=55 (an earlier draft assumed cycle 7 and was three
|
|
235
|
+
// cycles out).
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
irq2:
|
|
238
|
+
ldx saved_sp
|
|
239
|
+
txs
|
|
240
|
+
Delay(SYNC_PAD)
|
|
241
|
+
lda $d012
|
|
242
|
+
cmp $d012
|
|
243
|
+
beq !+
|
|
244
|
+
!:
|
|
245
|
+
// Line 100, from cycle 4. Start CIA1 timer A (2+4 cycles, part of the
|
|
246
|
+
// padding), then pad to the writes. Head of every line: pad, then
|
|
247
|
+
// STY (write at C-4), then STX (write at C); POST cycles of reads
|
|
248
|
+
// follow, the DMA stop (cycles 55 to 59) falls among them, and the
|
|
249
|
+
// next line's head starts on cycle 0.
|
|
250
|
+
ldy #$00
|
|
251
|
+
ldx #$01
|
|
252
|
+
lda #$19
|
|
253
|
+
sta $dc0e // timer A: one-shot, force load, start
|
|
254
|
+
Delay(WRITE_CYCLE - 21)
|
|
255
|
+
sty TARGET
|
|
256
|
+
stx TARGET
|
|
257
|
+
Delay(POST + EXTRA)
|
|
258
|
+
.for (var line = FIRST + 1; line <= LAST; line++) {
|
|
259
|
+
.if ((line & 7) == YSCROLL) {
|
|
260
|
+
// Badline: the CPU is stopped from cycle 12 to 59 (badline DMA,
|
|
261
|
+
// then the sprite's). Twelve cycles fill 0 to 11; no write can
|
|
262
|
+
// land on C here, so none is attempted, and the tail runs 60 to 62.
|
|
263
|
+
Delay(12)
|
|
264
|
+
Delay(3 + EXTRA)
|
|
265
|
+
} else {
|
|
266
|
+
Delay(WRITE_CYCLE - 7)
|
|
267
|
+
sty TARGET
|
|
268
|
+
stx TARGET
|
|
269
|
+
Delay(POST + EXTRA)
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
// Line 181, cycle 0: leave the bit clear so the rest of the sprite is
|
|
273
|
+
// drawn unexpanded, then read the timer and flag the run as done.
|
|
274
|
+
sty TARGET
|
|
275
|
+
lda $dc04
|
|
276
|
+
sta timer_lo
|
|
277
|
+
lda $dc05
|
|
278
|
+
sta timer_hi
|
|
279
|
+
inc done
|
|
280
|
+
|
|
281
|
+
lda #<irq1
|
|
282
|
+
sta $0314
|
|
283
|
+
lda #>irq1
|
|
284
|
+
sta $0315
|
|
285
|
+
lda #FIRST - 3
|
|
286
|
+
sta $d012
|
|
287
|
+
lda #$01
|
|
288
|
+
sta $d019
|
|
289
|
+
pla
|
|
290
|
+
tay
|
|
291
|
+
pla
|
|
292
|
+
tax
|
|
293
|
+
pla
|
|
294
|
+
rti
|
|
295
|
+
|
|
296
|
+
saved_sp: .byte 0
|
|
297
|
+
dummy: .byte 0
|
|
298
|
+
|
|
299
|
+
* = $2ff0 // timer_lo, timer_hi, done: read with -moncommands
|
|
300
|
+
timer_lo: .byte 0 // "m 2ff0 2ff2" on a store trace of $2ff2
|
|
301
|
+
timer_hi: .byte 0
|
|
302
|
+
done: .byte 0
|
|
303
|
+
|
|
304
|
+
* = $3000
|
|
305
|
+
sprite_data: .fill 64, 0
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
## Build
|
|
309
|
+
|
|
310
|
+
```bash
|
|
311
|
+
java -jar KickAss.jar sprite-stretcher.asm -o sprite-stretcher.prg
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
That is the pinned build, C=52. The sweep and the controls:
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
java -jar KickAss.jar sprite-stretcher.asm -o c48.prg -define C48 # any of C48 to C62
|
|
318
|
+
java -jar KickAss.jar sprite-stretcher.asm -o control.prg -define NOSTRETCH
|
|
319
|
+
java -jar KickAss.jar sprite-stretcher.asm -o calib.prg -define C55 -define CALIB
|
|
320
|
+
java -jar KickAss.jar sprite-stretcher.asm -o ntsc.prg -define C52 -define NTSC
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
KickAssembler 5.25 takes `-define NAME` as a preprocessor symbol only,
|
|
324
|
+
so the write cycle is chosen by one of fifteen plain symbols rather than
|
|
325
|
+
by `-define C=52` (`screen-dissolve.md` records the same trap). `-showmem`
|
|
326
|
+
reports one code block at $0900-$1343 (2,628 bytes, most of it the
|
|
327
|
+
unrolled 81 lines), three result bytes at $2FF0 and the 64-byte
|
|
328
|
+
sprite at $3000; the PRG is 10,305 bytes because the assembler pads the
|
|
329
|
+
gap between them.
|
|
330
|
+
|
|
331
|
+
## Expected output
|
|
332
|
+
|
|
333
|
+
Blue screen, light blue border, nothing on the character screen (the
|
|
334
|
+
program clears it). One white sprite whose rows are horizontal stripes:
|
|
335
|
+
row r holds the byte r+1 three times, so the stripe's pattern within each
|
|
336
|
+
8-pixel group reads as the row number (row 0 is one dot per byte, row 1
|
|
337
|
+
two dots, row 20 the pattern 00010101). In the pinned PAL build the
|
|
338
|
+
sprite runs from raster line 101 to 191, 91 lines tall, and reading the
|
|
339
|
+
stripes top to bottom gives: row 0 on lines 101 to 105, then rows 1 to 9
|
|
340
|
+
on eight lines each (106 to 177), row 10 on four lines (178 to 181), and
|
|
341
|
+
rows 11 to 20 on one line each (182 to 191). The toggling stops on line
|
|
342
|
+
180 and the sprite finishes unexpanded.
|
|
343
|
+
|
|
344
|
+
Screenshots from the runs this page describes: `screenshots/sprite-stretcher.png`
|
|
345
|
+
(PAL) and `screenshots/sprite-stretcher-ntsc.png` (NTSC), both at the pinned
|
|
346
|
+
`-limitcycles 6000000`. The picture is the same on every frame after the
|
|
347
|
+
first (nothing moves and nothing is redrawn), so where the beam is at the
|
|
348
|
+
cycle limit does not matter; the limit is not in the blank on purpose.
|
|
349
|
+
The PAL run was made twice and the NTSC run twice; each pair's PNGs were
|
|
350
|
+
md5-identical. The screenshot's sprite left edge is at x 168 (VIC X 160
|
|
351
|
+
plus the page offset of 8 from `runtime/vice-reference.md`); row r of the
|
|
352
|
+
picture is raster line r+16 on PAL and r+28 on NTSC.
|
|
353
|
+
|
|
354
|
+
### The sweep
|
|
355
|
+
|
|
356
|
+
Fifteen PAL builds, one per write cycle, each run once at the pinned
|
|
357
|
+
command; the height and the row runs read off the stripes with a script
|
|
358
|
+
that decodes the 8-pixel group at x 168 on each white row. "r1x8" means
|
|
359
|
+
row 1 on eight consecutive lines.
|
|
360
|
+
|
|
361
|
+
| C | Height (lines) | Rows and how many lines each |
|
|
362
|
+
|---|---|---|
|
|
363
|
+
| 48, 49, 50, 51, 52, 53, 54, 55 | 91 | r0x5, r1x8, r2x8, r3x8, r4x8, r5x8, r6x8, r7x8, r8x8, r9x8, r10x4, then r11 to r20 once each. Identical in all eight builds. |
|
|
364
|
+
| 56 | 24 | r0 to r20 once each except r4, r11 and r18, which are doubled: the lines after the badlines 104, 112 and 120. |
|
|
365
|
+
| 57 | 44 | r4x2, r10x2, r11x8, r12x8, r13x6, r15x3, the rest once |
|
|
366
|
+
| 58 | 50 | r4x2, r7x5, r8x8, r9x3, r14x2, r16x6, r17x8, r18x3, the rest once |
|
|
367
|
+
| 59 | 47 | nineteen distinct rows, r6 and r20 never shown; r4x2, r7x6, r8x6, r10x3, r12x5, r13x7, r14x4, r17x3 |
|
|
368
|
+
| 60 | 94 | rows 0 to 20 with doublings, then rows 0 to 20 a second time: the sprite ran past its 63rd byte and wrapped |
|
|
369
|
+
| 61 | 53 | r3x2, r4x7, r5x3, r7x5, r8x4, r11x2, r14x6, r15x3, r16x5, r17x5 |
|
|
370
|
+
| 62 | 53 | r3x2, r4x6, r6x2, r7x7, r8x3, r9x5, r10x4, r13x2, r15x5, r17x2, r20x5 |
|
|
371
|
+
| control (`NOSTRETCH`, C=52) | 21 | r0 to r20 once each |
|
|
372
|
+
|
|
373
|
+
NTSC, `-define NTSC` builds (two more read cycles per line for the
|
|
374
|
+
65-cycle line, the PAL sync padding kept): C=48, C=52 and C=55 each give
|
|
375
|
+
the same 91-line picture as PAL, run for run. Other NTSC write cycles
|
|
376
|
+
were not built. The pinned PRG itself is PAL-timed, and on NTSC its line
|
|
377
|
+
loop is two cycles short per line: the writes walk earlier by two cycles
|
|
378
|
+
a line, cross the flip-flop's inversion cycle after the first badline and
|
|
379
|
+
then reach the crunch cycle, so the NTSC screenshot shows a 113-line
|
|
380
|
+
sprite (lines 101 to 213, screenshot y 73 to 185) that holds row 0 for
|
|
381
|
+
five lines, row 1 for eight and row 2 for three, then 76 lines (117 to
|
|
382
|
+
192) whose three stripe bytes no longer agree with each other, because
|
|
383
|
+
the crunch has left the data pointer off a row boundary and the line is
|
|
384
|
+
not any sprite row, then rows 0 to 20 once each on lines 193 to 213. (A
|
|
385
|
+
decoder reading only the first stripe byte reports the middle band as
|
|
386
|
+
rows; it is not.) That picture is deterministic (two runs, one md5) and
|
|
387
|
+
is what the pin records; it is not a stretch, which is why the page's
|
|
388
|
+
region is PAL.
|
|
389
|
+
|
|
390
|
+
### What the write cycle means
|
|
391
|
+
|
|
392
|
+
The cycle numbers are the VIC's, cycle 1 the first of the line, and the
|
|
393
|
+
figure the source calls C is the cycle in which the STX's write happens,
|
|
394
|
+
anchored on the sprite's own DMA. The `CALIB` build sends the same two
|
|
395
|
+
writes to $D021 instead, so each lands as a colour edge on the screen,
|
|
396
|
+
black at C-4 and white at C, 32 pixels apart. With C=55 the white edge is
|
|
397
|
+
at x 337 on line 100 and at x 329 on every line after it; with C=56 the
|
|
398
|
+
white edge is never inside the display and the black edge walks from
|
|
399
|
+
x 313 on line 100 to x 337 by line 103 and stays there. That is the
|
|
400
|
+
signature of the sprite's DMA: BA falls in cycle 55 while sprite 0 is
|
|
401
|
+
being fetched, the 6510 stops on its next read cycle and resumes in cycle
|
|
402
|
+
60. A write cycle is allowed to complete under BA low, so C=55 lands on
|
|
403
|
+
line 100; the read that follows it is then stopped, the line comes out a
|
|
404
|
+
cycle short, and from line 101 the write sits on cycle 54, where the
|
|
405
|
+
stop that follows it is the full five cycles and the line is 63 again.
|
|
406
|
+
At C=56 the STX's third read cycle is the one stopped, and the write
|
|
407
|
+
lands in cycle 61, past the inversion. So the edges pin the numbering:
|
|
408
|
+
C=55 is the last CPU write cycle that completes before the sprite-0 DMA
|
|
409
|
+
stall (BA low from 55), and the stopped read is cycle 55; one cycle
|
|
410
|
+
later the write is pushed to 61 and misses the inversion. What this
|
|
411
|
+
measures is that edge, not the inversion's own cycle: from the CPU side
|
|
412
|
+
the inversion can be anywhere from 56 to 61. An earlier draft of this file took the first
|
|
413
|
+
instruction after the sync to start on cycle 7 of line 100, from the
|
|
414
|
+
bar-edge position in `stable-raster-irq.md`; the calibration put it on
|
|
415
|
+
cycle 4, and the padding on line 100 was corrected by three.
|
|
416
|
+
|
|
417
|
+
### Cycle cost
|
|
418
|
+
|
|
419
|
+
CIA1 timer A, started by the `STA $DC0E` on line 100 (its write in cycle
|
|
420
|
+
13) and read by the `LDA $DC04` on line 181 (its read in cycle 7), counts
|
|
421
|
+
5,094 cycles in the pinned PAL run (the bytes at $2FF0/$2FF1 read $19
|
|
422
|
+
$EC, dumped with `-moncommands` on a store trace of $2FF2). Arithmetic
|
|
423
|
+
for that bracket is 81 lines of 63 less six cycles, 5,097; the three
|
|
424
|
+
missing counts are the timer's start latency, not measured separately
|
|
425
|
+
here. Per line the CPU executes 58 cycles of its own code when C is 55
|
|
426
|
+
or less (C-7 of padding, two 4-cycle stores, 57-C of padding) and is
|
|
427
|
+
stopped for five by the sprite's DMA; on the ten badlines it executes
|
|
428
|
+
fifteen and is stopped for 48. The whole line belongs to the effect.
|
|
429
|
+
|
|
430
|
+
## Why this works
|
|
431
|
+
|
|
432
|
+
The VIC-II keeps one expansion flip-flop per sprite (the "expansion
|
|
433
|
+
flip-flop that toggles each line" of `docs/hardware/vic-ii-reference.md`,
|
|
434
|
+
Expansion, which names it but not its cycle). While the sprite's $D017
|
|
435
|
+
bit is clear the flip-flop is held set; while the bit is set and the
|
|
436
|
+
sprite's DMA is on, the chip inverts it once per line in cycle 56, the
|
|
437
|
+
cycle VICE 3.10's PAL cycle table gives it, as cited under
|
|
438
|
+
`sprite_y_stretch_glitch` in `docs/techniques/sprite.md`. In cycle 16 of
|
|
439
|
+
the next line the sprite's row counter base advances to the next three
|
|
440
|
+
bytes only if the flip-flop is set; if it is clear, the same three bytes
|
|
441
|
+
are fetched again, which is how a Y-expanded sprite shows each row twice
|
|
442
|
+
(`sprite_y_stretch_glitch` has the counters by name). Clearing the bit
|
|
443
|
+
on cycle C-4 forces the flip-flop set; setting it again on cycle C,
|
|
444
|
+
before cycle 56, lets the inversion clear it; cycle 16 of the next line
|
|
445
|
+
then finds it clear and repeats the row. Do that every line and the row
|
|
446
|
+
never advances. Both writes must sit after cycle 16 and before the
|
|
447
|
+
inversion on the same line. The lower edge, C=17, is arithmetic from
|
|
448
|
+
that and was not built (nothing below C=48 was); the upper edge the
|
|
449
|
+
sweep shows exactly, and it is the CPU's, not the chip's: any C from 48
|
|
450
|
+
to 55 gives the same picture, and C=55 is the last write that completes
|
|
451
|
+
before the sprite's DMA stall, so C=56 (write pushed to cycle 61) gives
|
|
452
|
+
none.
|
|
453
|
+
|
|
454
|
+
The badlines are why the pinned picture is a staircase rather than one
|
|
455
|
+
row 81 lines tall. On a badline the CPU is stopped from cycle 12 to 59,
|
|
456
|
+
so no write can land in the window; the bit is still set from the
|
|
457
|
+
previous line, cycle 56 inverts the flip-flop back to set, and the next
|
|
458
|
+
line's cycle 16 advances the row once. With YSCROLL 0 the badlines fall
|
|
459
|
+
on 104, 112, ... 176, so each row is drawn on eight lines. The C=56
|
|
460
|
+
column shows the same mechanism in isolation: its setting write lands
|
|
461
|
+
after the inversion, so on ordinary lines the bit is clear at cycle 56
|
|
462
|
+
and the flip-flop stays set, and the only doubled rows are the three
|
|
463
|
+
that follow a badline, where the bit was left set across cycle 56.
|
|
464
|
+
|
|
465
|
+
The per-line block first exceeds the line's 58 code cycles at C=56, not
|
|
466
|
+
57: with the post-write padding clamped at two cycles it is 59 (`POST`
|
|
467
|
+
in the source). C=56 still comes out clean because the read the DMA
|
|
468
|
+
stops is released in cycle 60 whatever cycle it was stopped on, so what
|
|
469
|
+
has to fit is the code from the release on: at C=56 that is the released
|
|
470
|
+
read, the STX's write and two padding reads, cycles 60 to 63, and the
|
|
471
|
+
line stays 63.
|
|
472
|
+
From C=57 a further read of the STX precedes the write after the
|
|
473
|
+
release, the block runs past cycle 63, and the writes drift later by one
|
|
474
|
+
or more cycles a line and pass through cycle 15 of the following line,
|
|
475
|
+
the crunch cycle that changes the counter base once by a data-dependent
|
|
476
|
+
amount. The heights of 44 to 94 lines, the rows never shown at C=59 and
|
|
477
|
+
the wrapped sprite at C=60 are that effect; it is the one
|
|
478
|
+
`sprite_y_stretch_glitch` measured, and it is not a stretcher. The
|
|
479
|
+
`CALIB` C=56 build's black edge, which walks for three lines and then
|
|
480
|
+
holds, is the same re-locking seen from the clearing write.
|
|
481
|
+
|
|
482
|
+
## What it does not establish
|
|
483
|
+
|
|
484
|
+
- Anything about a physical VIC-II. Every figure is VICE 3.10 x64sc, a
|
|
485
|
+
6569 for PAL and a 6567R8 for NTSC.
|
|
486
|
+
- The VIC's internal cycle of the inversion. What was measured is the CPU
|
|
487
|
+
write cycle, anchored on the sprite DMA stop: C=55 lands, C=56 is
|
|
488
|
+
pushed to 61. The inversion is placed in cycle 56 by VICE's PAL cycle
|
|
489
|
+
table (cited under `sprite_y_stretch_glitch`), and the sweep is
|
|
490
|
+
consistent with any inversion cycle from 56 to 61, not only 56.
|
|
491
|
+
- The lower edge of the write window. C=17 is arithmetic from the
|
|
492
|
+
cycle-16 advance; no build below C=48 was made.
|
|
493
|
+
- NTSC beyond the three `-define NTSC` builds at C 48, 52 and 55, and the
|
|
494
|
+
NTSC sync padding, which was left at the PAL value and happened to
|
|
495
|
+
hold; the NTSC write cycles were not calibrated. The pinned PRG does
|
|
496
|
+
not stretch on NTSC, which is why the page's region is PAL.
|
|
497
|
+
- A single row held for the whole region. That needs the badlines moved
|
|
498
|
+
or removed inside the stretch (FLD, or a blanked screen with the
|
|
499
|
+
sprite in the border), which this recipe does not do.
|
|
500
|
+
- The `sprite_y_stretch_glitch` crunch amounts at C 57 to 62, which are
|
|
501
|
+
reported as read off the pictures and not analysed.
|