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,670 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: dysp
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [dysp_side_border_sprites, sideborder_open, stable_raster_irq, double_irq, pal_ntsc_detection]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D002, D003, D004, D005, D006, D007, D010, D011, D012, D015, D016, D017, D019, D01A, D01C, D01D, D027, D028, D029, D02A, DC04, DC05, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler: DYSP, sprites at different Y in the opened side border
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Four ring sprites stand in the right side border at X 344, each bobbing
|
|
19
|
+
on its own sine about Y 60, 90, 120 and 150 with an amplitude of 20, and
|
|
20
|
+
the border stays open on every line they cross. The side border opens
|
|
21
|
+
exactly as `sideborder-open.md` opens it: one `DEC $D016` per line whose
|
|
22
|
+
new value is written on cycle 56 (PAL). What that recipe could not do is
|
|
23
|
+
let the sprites sit at different heights, because the sprite DMA after
|
|
24
|
+
the write stalls the CPU for a length that depends on which sprites the
|
|
25
|
+
VIC fetches on that line, and a loop timed for one sprite set loses its
|
|
26
|
+
phase on the first line where the set changes. DYSP (different Y sprite
|
|
27
|
+
positions) rebuilds a per-line table every frame from the sprites' Y
|
|
28
|
+
positions and pads each line's code by the stall that line will not
|
|
29
|
+
have, so the write lands on cycle 56 whether the line carries no sprite,
|
|
30
|
+
one, or three.
|
|
31
|
+
|
|
32
|
+
Measured in VICE x64sc 3.10 on both models: with the per-line table the
|
|
33
|
+
right border is open on every line from 51 to 200 and all four sprites
|
|
34
|
+
are visible; with the sideborder recipe's fixed timing and the same four
|
|
35
|
+
sprites it is closed on every one of those lines and no sprite shows;
|
|
36
|
+
with a table built from a count of sprites rather than the set, the
|
|
37
|
+
border closes from the first line whose set does not contain sprite 0.
|
|
38
|
+
The sweep is in Expected output. Both models pin to one picture each,
|
|
39
|
+
byte-identical across two runs.
|
|
40
|
+
|
|
41
|
+
## Source
|
|
42
|
+
|
|
43
|
+
```asm
|
|
44
|
+
// dysp.asm
|
|
45
|
+
// DYSP: four sprites at different, moving Y positions inside the opened
|
|
46
|
+
// right side border. One write per line opens the border: DEC $D016 with
|
|
47
|
+
// its new value written on cycle 56 (PAL) or 57 (NTSC), as in
|
|
48
|
+
// sideborder-open.asm. Sprite DMA then stalls the CPU for a length that
|
|
49
|
+
// depends on WHICH sprites are fetched on that line, so the loop reads a
|
|
50
|
+
// per-line delay from a table rebuilt every frame from the sprites' Y
|
|
51
|
+
// positions, and pads each line's code to 63 (65) cycles less the stall.
|
|
52
|
+
//
|
|
53
|
+
// Per line, from the line's DEC onwards (see the text for the arithmetic):
|
|
54
|
+
// dec $d016 51-56 (PAL), new value written on 56
|
|
55
|
+
// inx / lda / sta $d011 reads only until the stall is over; YSCROLL
|
|
56
|
+
// is rewritten every line so no line is a badline
|
|
57
|
+
// ldy mask,x which sprites the VIC fetches after this DEC
|
|
58
|
+
// lda odd16,y ; bne one cycle when the compensation is odd
|
|
59
|
+
// lda entry16,y ; sta jm+1 ; jm: jmp slide into a slide of six NOPs
|
|
60
|
+
// inc $d016 CSEL back to 1 for the next line's comparisons
|
|
61
|
+
// cpx / bne / jmp loop
|
|
62
|
+
// Code cycles per line = 51 + extra (PAL; 53 + extra NTSC), with
|
|
63
|
+
// extra = 12 - lost, where lost is the CPU cycles the sprite DMA takes
|
|
64
|
+
// after the DEC on that line, from a 16-entry table indexed by the mask.
|
|
65
|
+
//
|
|
66
|
+
// Build variants (KickAssembler command line):
|
|
67
|
+
// :ENTRYPAD=n cycles from the sync to the first DEC (PAL default 45)
|
|
68
|
+
// :ENTRYPADN=n the same for NTSC (default 45)
|
|
69
|
+
// :SYNCPADN=n NTSC sync padding (default 12)
|
|
70
|
+
// :MODEL=count :D=n :B=n count model: lost = B + D * (sprites on the line)
|
|
71
|
+
// -define FIXEDDELAY control: the sideborder recipe's fixed
|
|
72
|
+
// sprite-free timing on every line
|
|
73
|
+
|
|
74
|
+
.var ENTRYPAD = cmdLineVars.containsKey("ENTRYPAD") ? cmdLineVars.get("ENTRYPAD").asNumber() : 45
|
|
75
|
+
.var ENTRYPADN = cmdLineVars.containsKey("ENTRYPADN") ? cmdLineVars.get("ENTRYPADN").asNumber() : 45
|
|
76
|
+
.var SYNCPADN = cmdLineVars.containsKey("SYNCPADN") ? cmdLineVars.get("SYNCPADN").asNumber() : 12
|
|
77
|
+
.var COUNTMODEL = cmdLineVars.containsKey("MODEL") && cmdLineVars.get("MODEL") == "count"
|
|
78
|
+
.var DPER = cmdLineVars.containsKey("D") ? cmdLineVars.get("D").asNumber() : 2
|
|
79
|
+
.var BLEAD = cmdLineVars.containsKey("B") ? cmdLineVars.get("B").asNumber() : 1
|
|
80
|
+
|
|
81
|
+
.const BAND_TOP = 40 // first line with a DEC; sprite 0 reaches Y 40
|
|
82
|
+
.const BAND_LINES = 161 // lines 40..200
|
|
83
|
+
.const SYNC_PAD = 11 // PAL, as in stable-raster-irq
|
|
84
|
+
.const EXTRA_MAX = 12 // six NOPs; the odd cycle comes from the branch
|
|
85
|
+
.const FRAMES = 300 // the sines stop here so the pin is static
|
|
86
|
+
.const NSPR = 4
|
|
87
|
+
|
|
88
|
+
.const REG_FLAG = $02e1 // 0 = PAL, 1 = NTSC
|
|
89
|
+
.const CIA_TALO = $dc04
|
|
90
|
+
.const CIA_TAHI = $dc05
|
|
91
|
+
.const CIA_CRA = $dc0e
|
|
92
|
+
|
|
93
|
+
// Tables, one page each, indexed by j = line - BAND_TOP + 1 (the loop's X
|
|
94
|
+
// after its INX). mask: bits 0..3, sprite s fetched on that line.
|
|
95
|
+
.const mask_tab = $0c00
|
|
96
|
+
.const d011_tab = $0f00
|
|
97
|
+
.const sine_tab = $1000
|
|
98
|
+
.const lost16 = $02c0 // per-model, copied at boot: mask -> lost cycles
|
|
99
|
+
.const entry16 = $02d0 // mask -> slide entry low byte
|
|
100
|
+
.const odd16 = $02f0 // mask -> odd cycle
|
|
101
|
+
.const saved_sp = $02e0
|
|
102
|
+
.const frame_lo = $02e2
|
|
103
|
+
.const frame_hi = $02e3
|
|
104
|
+
.const cia_lo = $02e4 // builder cost, low/high, from CIA 1 timer A
|
|
105
|
+
.const cia_hi = $02e5
|
|
106
|
+
.const phase = $02e8 // 4 bytes
|
|
107
|
+
.const spr_y = $02ec // 4 bytes
|
|
108
|
+
.const sprite_block = $2000
|
|
109
|
+
|
|
110
|
+
BasicUpstart2(start)
|
|
111
|
+
|
|
112
|
+
.macro Delay(n) {
|
|
113
|
+
.if (n < 2) .error "Delay needs >= 2 cycles"
|
|
114
|
+
.if ((n & 1) != 0) { bit $ea }
|
|
115
|
+
.for (var i = 0; i < ((n & 1) != 0 ? n - 3 : n) / 2; i++) { nop }
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// CPU cycles lost after the DEC to the sprite DMA of the sprites in mask.
|
|
119
|
+
// The p-access slots are 58, 60, 62, 1 (PAL) and 60, 62, 64, 1 (NTSC) for
|
|
120
|
+
// sprites 0..3; BA falls three cycles before the first and the CPU resumes
|
|
121
|
+
// two cycles after the last slot. DEC's writes on 55 and 56 (56 and 57 on
|
|
122
|
+
// NTSC) go through while BA is low, so a set holding sprite 0 costs less.
|
|
123
|
+
.function lostcycles(m, ntsc) {
|
|
124
|
+
.if (m == 0) .return 0
|
|
125
|
+
.var f = 0
|
|
126
|
+
.while (((m >> f) & 1) == 0) .eval f++
|
|
127
|
+
.var l = 3
|
|
128
|
+
.while (((m >> l) & 1) == 0) .eval l--
|
|
129
|
+
.if (f == 0) .return (ntsc ? 4 : 3) + 2 * l
|
|
130
|
+
.return 5 + 2 * (l - f)
|
|
131
|
+
}
|
|
132
|
+
.function popcount(m) {
|
|
133
|
+
.var c = 0
|
|
134
|
+
.for (var b = 0; b < 4; b++) .eval c += (m >> b) & 1
|
|
135
|
+
.return c
|
|
136
|
+
}
|
|
137
|
+
.function lostmodel(m, ntsc) {
|
|
138
|
+
#if FIXEDDELAY
|
|
139
|
+
.return 0
|
|
140
|
+
#else
|
|
141
|
+
.if (COUNTMODEL) {
|
|
142
|
+
.if (m == 0) .return 0
|
|
143
|
+
.var v = BLEAD + DPER * popcount(m)
|
|
144
|
+
.return min(v, EXTRA_MAX)
|
|
145
|
+
}
|
|
146
|
+
.return lostcycles(m, ntsc)
|
|
147
|
+
#endif
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// A 24x21 ring: an ellipse two to three pixels thick.
|
|
151
|
+
.function ringbyte(row, col) {
|
|
152
|
+
.var v = 0
|
|
153
|
+
.for (var b = 0; b < 8; b++) {
|
|
154
|
+
.var x = col * 8 + b
|
|
155
|
+
.var dx = (x - 11.5) / 11.5
|
|
156
|
+
.var dy = (row - 10) / 10
|
|
157
|
+
.var d = dx * dx + dy * dy
|
|
158
|
+
.if (d <= 1.0 && d >= 0.5) .eval v = v | (128 >> b)
|
|
159
|
+
}
|
|
160
|
+
.return v
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
* = sprite_block
|
|
164
|
+
.for (var r = 0; r < 21; r++) { .byte ringbyte(r, 0), ringbyte(r, 1), ringbyte(r, 2) }
|
|
165
|
+
.byte 0
|
|
166
|
+
|
|
167
|
+
* = sine_tab
|
|
168
|
+
.fill 256, (round(20 * sin(toRadians(i * 360 / 256))) + 256) & 255
|
|
169
|
+
|
|
170
|
+
* = d011_tab
|
|
171
|
+
.fill 256, $18 | ((BAND_TOP + i + 4) & 7)
|
|
172
|
+
|
|
173
|
+
// The two per-model 16-entry conversions. Both loops keep their slide at
|
|
174
|
+
// the same low byte, so one entry table serves either.
|
|
175
|
+
* = $0bc0
|
|
176
|
+
conv_pal:
|
|
177
|
+
.fill 16, lostmodel(i, false)
|
|
178
|
+
conv_ntsc:
|
|
179
|
+
.fill 16, lostmodel(i, true)
|
|
180
|
+
|
|
181
|
+
spr_base: .byte 60, 90, 120, 150
|
|
182
|
+
spr_speed: .byte 2, 3, 5, 7
|
|
183
|
+
spr_col: .byte 1, 7, 3, 13
|
|
184
|
+
|
|
185
|
+
* = $0900
|
|
186
|
+
start:
|
|
187
|
+
sei
|
|
188
|
+
lda #$7f
|
|
189
|
+
sta $dc0d
|
|
190
|
+
lda $dc0d
|
|
191
|
+
jsr detect_region // sets REG_FLAG, leaves I clear
|
|
192
|
+
sei
|
|
193
|
+
|
|
194
|
+
// per-model conversion tables: mask -> lost cycles -> slide entry, odd
|
|
195
|
+
ldx #15
|
|
196
|
+
conv_loop:
|
|
197
|
+
lda conv_pal, x
|
|
198
|
+
ldy REG_FLAG
|
|
199
|
+
beq !+
|
|
200
|
+
lda conv_ntsc, x
|
|
201
|
+
!: sta lost16, x
|
|
202
|
+
sta $02
|
|
203
|
+
lda #EXTRA_MAX
|
|
204
|
+
sec
|
|
205
|
+
sbc $02 // extra = 12 - lost
|
|
206
|
+
lsr // A = extra / 2, C = the odd cycle
|
|
207
|
+
sta $02
|
|
208
|
+
lda #0
|
|
209
|
+
adc #0
|
|
210
|
+
sta odd16, x
|
|
211
|
+
lda #<slide_pal + 6 // six NOPs less extra / 2
|
|
212
|
+
sec
|
|
213
|
+
sbc $02
|
|
214
|
+
sta entry16, x
|
|
215
|
+
dex
|
|
216
|
+
bpl conv_loop
|
|
217
|
+
|
|
218
|
+
.for (var s = 0; s < NSPR; s++) {
|
|
219
|
+
lda #<344
|
|
220
|
+
sta $d000 + s * 2
|
|
221
|
+
lda spr_base + s
|
|
222
|
+
sta $d001 + s * 2
|
|
223
|
+
lda #sprite_block / 64
|
|
224
|
+
sta $07f8 + s
|
|
225
|
+
lda spr_col + s
|
|
226
|
+
sta $d027 + s
|
|
227
|
+
lda #0
|
|
228
|
+
sta phase + s
|
|
229
|
+
}
|
|
230
|
+
lda #%00001111
|
|
231
|
+
sta $d010 // all four past X 255
|
|
232
|
+
sta $d015 // sprites 0..3 on
|
|
233
|
+
lda #0
|
|
234
|
+
sta $d017
|
|
235
|
+
sta $d01d
|
|
236
|
+
sta $d01c
|
|
237
|
+
sta frame_lo
|
|
238
|
+
sta frame_hi
|
|
239
|
+
|
|
240
|
+
jsr build_tables // first frame's tables before the first band
|
|
241
|
+
|
|
242
|
+
lda #<vblank
|
|
243
|
+
sta $0314
|
|
244
|
+
lda #>vblank
|
|
245
|
+
sta $0315
|
|
246
|
+
lda #$1b
|
|
247
|
+
sta $d011
|
|
248
|
+
lda #$c8
|
|
249
|
+
sta $d016 // CSEL=1, MCM=0, XSCROLL=0
|
|
250
|
+
lda #210
|
|
251
|
+
sta $d012
|
|
252
|
+
lda #$01
|
|
253
|
+
sta $d01a
|
|
254
|
+
sta $d019
|
|
255
|
+
cli
|
|
256
|
+
jmp *
|
|
257
|
+
|
|
258
|
+
// ---- region detection, as in pseudo-3d-road.asm ----
|
|
259
|
+
detect_region:
|
|
260
|
+
sei
|
|
261
|
+
!: bit $d011
|
|
262
|
+
bmi !-
|
|
263
|
+
!: bit $d011
|
|
264
|
+
bpl !-
|
|
265
|
+
!: lda $d012
|
|
266
|
+
bit $d011
|
|
267
|
+
bpl !+
|
|
268
|
+
tax
|
|
269
|
+
jmp !-
|
|
270
|
+
!: lda #0
|
|
271
|
+
cpx #$10
|
|
272
|
+
bcs !+
|
|
273
|
+
lda #1
|
|
274
|
+
!: sta REG_FLAG
|
|
275
|
+
cli
|
|
276
|
+
rts
|
|
277
|
+
|
|
278
|
+
// ---- per-frame work, below the band (line 210) ----
|
|
279
|
+
vblank:
|
|
280
|
+
cld
|
|
281
|
+
lda #$01
|
|
282
|
+
sta $d019
|
|
283
|
+
lda #$ff
|
|
284
|
+
sta CIA_TALO
|
|
285
|
+
sta CIA_TAHI
|
|
286
|
+
lda #$11
|
|
287
|
+
sta CIA_CRA // count cycles
|
|
288
|
+
|
|
289
|
+
lda frame_hi
|
|
290
|
+
cmp #>FRAMES
|
|
291
|
+
bne advance
|
|
292
|
+
lda frame_lo
|
|
293
|
+
cmp #<FRAMES
|
|
294
|
+
bcs frozen
|
|
295
|
+
advance:
|
|
296
|
+
inc frame_lo
|
|
297
|
+
bne !+
|
|
298
|
+
inc frame_hi
|
|
299
|
+
!: .for (var s = 0; s < NSPR; s++) {
|
|
300
|
+
lda phase + s
|
|
301
|
+
clc
|
|
302
|
+
adc spr_speed + s
|
|
303
|
+
sta phase + s
|
|
304
|
+
}
|
|
305
|
+
frozen:
|
|
306
|
+
jsr build_tables
|
|
307
|
+
|
|
308
|
+
lda #0
|
|
309
|
+
sta CIA_CRA
|
|
310
|
+
sec
|
|
311
|
+
lda #$ff
|
|
312
|
+
sbc CIA_TALO
|
|
313
|
+
sta cia_lo
|
|
314
|
+
lda #$ff
|
|
315
|
+
sbc CIA_TAHI
|
|
316
|
+
sta cia_hi
|
|
317
|
+
|
|
318
|
+
lda #<irq1
|
|
319
|
+
sta $0314
|
|
320
|
+
lda #>irq1
|
|
321
|
+
sta $0315
|
|
322
|
+
lda #BAND_TOP - 3
|
|
323
|
+
sta $d012
|
|
324
|
+
jmp $ea81
|
|
325
|
+
|
|
326
|
+
// Y from the sines, then the per-line tables: mask, then entry and odd.
|
|
327
|
+
build_tables:
|
|
328
|
+
.for (var s = 0; s < NSPR; s++) {
|
|
329
|
+
ldx phase + s
|
|
330
|
+
lda sine_tab, x
|
|
331
|
+
clc
|
|
332
|
+
adc spr_base + s
|
|
333
|
+
sta spr_y + s
|
|
334
|
+
sta $d001 + s * 2
|
|
335
|
+
}
|
|
336
|
+
ldx #BAND_LINES
|
|
337
|
+
lda #0
|
|
338
|
+
!: sta mask_tab, x
|
|
339
|
+
dex
|
|
340
|
+
bne !-
|
|
341
|
+
.for (var s = 0; s < NSPR; s++) {
|
|
342
|
+
lda spr_y + s
|
|
343
|
+
sec
|
|
344
|
+
sbc #BAND_TOP - 1 // j = Y - BAND_TOP + 1
|
|
345
|
+
tax
|
|
346
|
+
ldy #21
|
|
347
|
+
!: lda mask_tab, x
|
|
348
|
+
ora #1 << s
|
|
349
|
+
sta mask_tab, x
|
|
350
|
+
inx
|
|
351
|
+
dey
|
|
352
|
+
bne !-
|
|
353
|
+
}
|
|
354
|
+
rts
|
|
355
|
+
|
|
356
|
+
// ---- double IRQ, as in stable-raster-irq.asm ----
|
|
357
|
+
irq1:
|
|
358
|
+
lda REG_FLAG
|
|
359
|
+
bne !+
|
|
360
|
+
lda #<irq2_pal
|
|
361
|
+
sta $0314
|
|
362
|
+
lda #>irq2_pal
|
|
363
|
+
sta $0315
|
|
364
|
+
jmp !++
|
|
365
|
+
!: lda #<irq2_ntsc
|
|
366
|
+
sta $0314
|
|
367
|
+
lda #>irq2_ntsc
|
|
368
|
+
sta $0315
|
|
369
|
+
!: lda #BAND_TOP - 1
|
|
370
|
+
sta $d012
|
|
371
|
+
lda #$01
|
|
372
|
+
sta $d019
|
|
373
|
+
tsx
|
|
374
|
+
stx saved_sp
|
|
375
|
+
cli
|
|
376
|
+
.for (var i = 0; i < 40; i++) { nop }
|
|
377
|
+
jmp * // never reached: irq2 exits through irq1's frame
|
|
378
|
+
|
|
379
|
+
done:
|
|
380
|
+
lda #$1b
|
|
381
|
+
sta $d011 // normal display again
|
|
382
|
+
lda #210
|
|
383
|
+
sta $d012
|
|
384
|
+
lda #<vblank
|
|
385
|
+
sta $0314
|
|
386
|
+
lda #>vblank
|
|
387
|
+
sta $0315
|
|
388
|
+
lda #$01
|
|
389
|
+
sta $d019
|
|
390
|
+
pla
|
|
391
|
+
tay
|
|
392
|
+
pla
|
|
393
|
+
tax
|
|
394
|
+
pla
|
|
395
|
+
rti
|
|
396
|
+
|
|
397
|
+
// The PAL and NTSC loops share a layout, so slide_pal and slide_ntsc have
|
|
398
|
+
// the same low byte, which is what the entry table holds. Each model's
|
|
399
|
+
// stable entry follows its loop and jumps back to it.
|
|
400
|
+
* = $1100
|
|
401
|
+
loop_pal:
|
|
402
|
+
dec $d016 // 51-56: writes on 55 and 56
|
|
403
|
+
inx // reads only from here until the stall ends
|
|
404
|
+
lda d011_tab, x
|
|
405
|
+
sta $d011 // the next line's YSCROLL: no badline
|
|
406
|
+
ldy mask_tab, x // which sprites the VIC fetches after this DEC
|
|
407
|
+
lda odd16, y
|
|
408
|
+
bne !+ // taken: one cycle more
|
|
409
|
+
!: lda entry16, y
|
|
410
|
+
sta jm_pal + 1
|
|
411
|
+
jm_pal:
|
|
412
|
+
jmp slide_pal
|
|
413
|
+
slide_pal:
|
|
414
|
+
nop
|
|
415
|
+
nop
|
|
416
|
+
nop
|
|
417
|
+
nop
|
|
418
|
+
nop
|
|
419
|
+
nop
|
|
420
|
+
inc $d016 // CSEL back to 1
|
|
421
|
+
cpx #BAND_LINES
|
|
422
|
+
bne !+ // taken, 3 cycles, on every line but the last
|
|
423
|
+
jmp done
|
|
424
|
+
!: jmp loop_pal // 51 + extra code cycles a line
|
|
425
|
+
|
|
426
|
+
irq2_pal:
|
|
427
|
+
ldx saved_sp
|
|
428
|
+
txs
|
|
429
|
+
Delay(SYNC_PAD)
|
|
430
|
+
lda $d012
|
|
431
|
+
cmp $d012
|
|
432
|
+
beq !+
|
|
433
|
+
!: ldx #0
|
|
434
|
+
Delay(ENTRYPAD - 3)
|
|
435
|
+
jmp loop_pal
|
|
436
|
+
|
|
437
|
+
* = $1200
|
|
438
|
+
loop_ntsc:
|
|
439
|
+
dec $d016 // 52-57: writes on 56 and 57
|
|
440
|
+
inx
|
|
441
|
+
lda d011_tab, x
|
|
442
|
+
sta $d011
|
|
443
|
+
ldy mask_tab, x
|
|
444
|
+
lda odd16, y
|
|
445
|
+
bne !+
|
|
446
|
+
!: lda entry16, y
|
|
447
|
+
sta jm_ntsc + 1
|
|
448
|
+
jm_ntsc:
|
|
449
|
+
jmp slide_ntsc
|
|
450
|
+
slide_ntsc:
|
|
451
|
+
nop
|
|
452
|
+
nop
|
|
453
|
+
nop
|
|
454
|
+
nop
|
|
455
|
+
nop
|
|
456
|
+
nop
|
|
457
|
+
inc $d016
|
|
458
|
+
cpx #BAND_LINES
|
|
459
|
+
bne !+
|
|
460
|
+
jmp done
|
|
461
|
+
!: Delay(2)
|
|
462
|
+
jmp loop_ntsc // 53 + extra code cycles a line
|
|
463
|
+
|
|
464
|
+
irq2_ntsc:
|
|
465
|
+
ldx saved_sp
|
|
466
|
+
txs
|
|
467
|
+
Delay(SYNCPADN)
|
|
468
|
+
lda $d012
|
|
469
|
+
cmp $d012
|
|
470
|
+
beq !+
|
|
471
|
+
!: ldx #0
|
|
472
|
+
Delay(ENTRYPADN - 3)
|
|
473
|
+
jmp loop_ntsc
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
## Build
|
|
477
|
+
|
|
478
|
+
```bash
|
|
479
|
+
java -jar KickAss.jar dysp.asm -o dysp.prg
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
Sweep and control builds used for the measurements below:
|
|
483
|
+
|
|
484
|
+
```bash
|
|
485
|
+
java -jar KickAss.jar dysp.asm -o dysp-count2.prg :MODEL=count :D=2 :B=1
|
|
486
|
+
java -jar KickAss.jar dysp.asm -o dysp-count3.prg :MODEL=count :D=3 :B=1
|
|
487
|
+
java -jar KickAss.jar dysp.asm -o dysp-count4.prg :MODEL=count :D=4 :B=1
|
|
488
|
+
java -jar KickAss.jar dysp.asm -o dysp-fixed.prg -define FIXEDDELAY
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
## Expected output
|
|
492
|
+
|
|
493
|
+
Pinned with `-limitcycles 10000000`, which is past the 300th frame on
|
|
494
|
+
either model (the program stops advancing its sines at frame 300; the
|
|
495
|
+
frame counter at `$02E2` reads 300 in the monitor dump on both), so the
|
|
496
|
+
picture is static.
|
|
497
|
+
|
|
498
|
+
**PAL (default machine).** `screenshots/dysp.png`, md5
|
|
499
|
+
`e932e372f4650703e7358ae47f1ae2e5` on two runs. From raster line 51 to
|
|
500
|
+
200 (screenshot rows 35 to 184) the light-blue side borders are gone on
|
|
501
|
+
both sides: the blue background runs from x 0 to x 383. Four rings sit
|
|
502
|
+
at x 352 to 375, which is X 344 to 367 in VIC coordinates, wholly inside
|
|
503
|
+
the right border: white with its Y at 77, yellow at 88, cyan at 105 and
|
|
504
|
+
light green at 169 (the four bytes at `$02EC`, monitor dump). The white
|
|
505
|
+
and yellow rings overlap; the cyan one starts as the white one ends.
|
|
506
|
+
Sprite pixels are on rows for lines 79 to 125 and 171 to 189; the ring's
|
|
507
|
+
first and last rows are empty, so a sprite at Y 77 first lights line 79.
|
|
508
|
+
Lines 40 to 50 are inside the upper border, which this write does not
|
|
509
|
+
open (see below): the white ring's top rows are hidden there whenever
|
|
510
|
+
its Y falls below 50. Inside the band the character display is idle and
|
|
511
|
+
blank, as in the sideborder recipe; below it the rest of the BASIC screen
|
|
512
|
+
is untouched.
|
|
513
|
+
|
|
514
|
+
**NTSC (`-model ntsc`).** `screenshots/dysp-ntsc.png`, md5
|
|
515
|
+
`8840e1407a45dedc052f9191aad8f2c9` on two runs. The same band, lines 51
|
|
516
|
+
to 200 (rows 23 to 172), the same four Y positions and the same sprite
|
|
517
|
+
rows, in the NTSC palette.
|
|
518
|
+
|
|
519
|
+
**Sweep: what the border does under each per-line model (PAL, frame
|
|
520
|
+
300, sprites at Y 77, 88, 105, 169).** Measured from the screenshot:
|
|
521
|
+
a band line counts as closed when all 32 pixels at x 352 to 383 are the
|
|
522
|
+
border colour. Lines 40 to 50 are left out because the upper border
|
|
523
|
+
closes them in every build.
|
|
524
|
+
|
|
525
|
+
| Build | Per-line delay model | Lines 51 to 200 with the right border closed | Sprites visible |
|
|
526
|
+
|---|---|---|---|
|
|
527
|
+
| `dysp.prg` | table by sprite set: lost = 3 + 2l with sprite 0 in the set, 5 + 2(l - f) without, 0 for none | 0 | all four (lines 79 to 125, 171 to 189) |
|
|
528
|
+
| `-define FIXEDDELAY` | none: the sideborder recipe's sprite-free 63-cycle line on every line | 150 (every line) | none |
|
|
529
|
+
| `:MODEL=count :D=2 :B=1` | 1 + 2 per sprite on the line | 102 (99 to 200) | sprite 0 only (79 to 98) |
|
|
530
|
+
| `:MODEL=count :D=3 :B=1` | 1 + 3 per sprite | 118 (78 to 99, 101 to 105, 110 to 200) | fragments of sprite 1 (100, 106 to 109) |
|
|
531
|
+
| `:MODEL=count :D=4 :B=1` | 1 + 4 per sprite | 123 (78 to 200) | none |
|
|
532
|
+
|
|
533
|
+
The count model with two cycles a sprite is right on every line whose
|
|
534
|
+
set contains sprite 0 (lines 77 to 97 here) and wrong by two on the
|
|
535
|
+
first line that does not (line 98, sprite 1 alone), and once the loop's
|
|
536
|
+
phase has slipped it does not come back, so the border is closed from
|
|
537
|
+
99 to the bottom of the band. Three and four cycles a sprite overshoot
|
|
538
|
+
on the very first sprite line (77) and close from 78; the few open lines
|
|
539
|
+
in the D=3 column are where the accumulating drift happened to pass
|
|
540
|
+
through cycle 56 again. There is no per-sprite constant that works: the
|
|
541
|
+
stall is set by the first and last sprite in the line's set, and by
|
|
542
|
+
whether the first is sprite 0.
|
|
543
|
+
|
|
544
|
+
**Write cycles (`trace store d016`, PAL, five frames from boot).** With
|
|
545
|
+
the pinned `ENTRYPAD` of 45, every `DEC $D016` in the band reports cycle
|
|
546
|
+
56 and every `INC $D016` cycle 42: 805 of 805 each, over lines that
|
|
547
|
+
carry no sprite, sprite 0 alone, sprites 0 and 1, 1 alone, 1 and 2, 2
|
|
548
|
+
alone, 2 and 3 and 3 alone as the sines moved. With `ENTRYPAD` 43, the
|
|
549
|
+
sideborder recipe's value, the sprite-free lines reported 54 and the
|
|
550
|
+
border stayed closed until the first sprite line, whose stall moved the
|
|
551
|
+
loop to 56; the sideborder recipe tolerated 41 to 45 because all its
|
|
552
|
+
lines had the stall, and this one has lines without it. On NTSC with
|
|
553
|
+
`ENTRYPADN` 45 every `DEC` reports 56 and every `INC` 40, 2,737 of
|
|
554
|
+
2,737; with 44 the sprite-free lines reported 55 and were closed. The
|
|
555
|
+
monitor's cycle numbers for the two models were not reconciled against
|
|
556
|
+
each other here; what is established is that the value it reports as
|
|
557
|
+
56 opens the border on both.
|
|
558
|
+
|
|
559
|
+
**Cycles.** The band is 161 lines of 63 wall cycles on PAL (arithmetic:
|
|
560
|
+
10,143 cycles), 65 on NTSC; the code in each line is 51 cycles plus the
|
|
561
|
+
padding, 53 on NTSC, and the padding plus the stall is 12 on every line.
|
|
562
|
+
The per-frame table rebuild at line 210, timed with CIA 1 timer A,
|
|
563
|
+
costs 3,560 cycles in 254 of the 357 measured frames while the sprites
|
|
564
|
+
move, 3,570 at most, and 3,506 in the frozen frames; the same figures
|
|
565
|
+
on NTSC. The two interrupts' KERNAL entries and the double IRQ's slide
|
|
566
|
+
are outside the brackets.
|
|
567
|
+
|
|
568
|
+
## Why this works
|
|
569
|
+
|
|
570
|
+
### The stall after the write, per sprite set
|
|
571
|
+
|
|
572
|
+
`DEC $D016` started on cycle 51 reads on 51 to 54 and writes on 55 and
|
|
573
|
+
56, the new value on 56, between the X=335 and X=344 comparisons; that
|
|
574
|
+
is the sideborder recipe's mechanism unchanged. What follows the write
|
|
575
|
+
is the VIC's sprite fetch. `hardware/vic-ii-reference.md`, Sprite DMA,
|
|
576
|
+
gives the p-access slots as cycles 58, 60, 62, 1, 3, 5, 7, 9 for sprites
|
|
577
|
+
0 to 7 on PAL, states that BA falls three cycles before the first fetch
|
|
578
|
+
and that the CPU completes up to three write cycles after BA falls, and
|
|
579
|
+
measured that with sprites 0..k active the CPU resumes two cycles after
|
|
580
|
+
sprite k's slot. From those statements, for a set whose first sprite is
|
|
581
|
+
f and last is l (measured here only through the border, not with a CIA
|
|
582
|
+
timer per line):
|
|
583
|
+
|
|
584
|
+
- with sprite 0 in the set, BA falls on 55; the `DEC`'s two writes go
|
|
585
|
+
through and the `INX` on 57 stalls until 60 + 2l, so the CPU loses
|
|
586
|
+
3 + 2l cycles: 3, 5, 7 and 9 for the sets 0, 0-1, 0-2 and 0-3;
|
|
587
|
+
- without sprite 0, BA falls on 55 + 2f, after the write, and the first
|
|
588
|
+
read after that stalls until 60 + 2l: 5 + 2(l - f) cycles, 5 for any
|
|
589
|
+
single sprite, 7 for two neighbours;
|
|
590
|
+
- with no sprite, nothing.
|
|
591
|
+
|
|
592
|
+
A gap of one sprite inside the set costs the same as if the missing
|
|
593
|
+
sprite were present, because BA does not rise for a two-cycle gap; the
|
|
594
|
+
table treats {0, 2} as {0, 1, 2}. The sets here are always runs of
|
|
595
|
+
neighbours or nearly so, since each sprite's range overlaps only the
|
|
596
|
+
next one's.
|
|
597
|
+
|
|
598
|
+
So the stall is not a per-sprite price. A line with sprite 1 alone
|
|
599
|
+
costs five, a line with sprite 0 alone three, and the difference is the
|
|
600
|
+
two write cycles the `DEC` spends inside the lead-in when the lead-in
|
|
601
|
+
starts on 55. The count model's failure in the sweep is exactly that
|
|
602
|
+
difference.
|
|
603
|
+
|
|
604
|
+
### The table and the loop
|
|
605
|
+
|
|
606
|
+
The per-frame builder writes `spr_y` from the sines, clears the 161-byte
|
|
607
|
+
`mask_tab`, and for each sprite ORs its bit into the 21 entries from its
|
|
608
|
+
Y line. Entry j stands for line 39 + j, which is the line the loop's X
|
|
609
|
+
holds after its `INX`. At boot a 16-entry conversion turns each mask
|
|
610
|
+
into the two things the loop needs: `entry16`, the low byte of where to
|
|
611
|
+
enter a slide of six `NOP`s, and `odd16`, whether to spend one more cycle
|
|
612
|
+
on a taken branch. Extra cycles = 12 minus the stall, so a sprite-free
|
|
613
|
+
line pads twelve, a line with sprite 0 alone nine, and a line with
|
|
614
|
+
sprites 0 to 3 three.
|
|
615
|
+
|
|
616
|
+
The loop keeps every read between the `DEC` and the end of the stall
|
|
617
|
+
window: `INX`, `LDA d011_tab,X` and the address bytes of `STA $D011`
|
|
618
|
+
whose write falls on cycle 3 at the earliest, which is where the
|
|
619
|
+
longest stall ends. Any write inside the window would be completed
|
|
620
|
+
during BA low and change the lost count. `INC $D016` restores CSEL on
|
|
621
|
+
cycles 37 to 42, well before the next line's cycle 55, which is the
|
|
622
|
+
window the sideborder recipe measured for the restore.
|
|
623
|
+
|
|
624
|
+
`$D011` is rewritten on every line with YSCROLL = (line + 4) & 7, the
|
|
625
|
+
sideborder recipe's device, so no line of the band is a badline; the
|
|
626
|
+
character display idles and the band is blank. The band starts on line
|
|
627
|
+
40, below any badline, and lines 40 to 50 get the write to no effect,
|
|
628
|
+
since the vertical border flip-flop is set there and the main border
|
|
629
|
+
flip-flop only matters once it clears on line 51.
|
|
630
|
+
|
|
631
|
+
### Entry, models, and what the sines may not do
|
|
632
|
+
|
|
633
|
+
The stable entry is the double IRQ from `stable-raster-irq.md`: `irq1`
|
|
634
|
+
at line 37, `irq2` at line 39, `SYNC_PAD` 11 on PAL. `ENTRYPAD` is the
|
|
635
|
+
cycles from the sync to the first `DEC` and its value, 45, was set from
|
|
636
|
+
the write-cycle trace above. `pal_ntsc_detection`'s method from the road
|
|
637
|
+
recipe sets a flag at boot; `irq1` selects the PAL or the NTSC loop by
|
|
638
|
+
it, the loops differ in the `Delay(2)` of the NTSC one and in their
|
|
639
|
+
stall tables (sprite 0's lead-in on NTSC starts on 57, one cycle after
|
|
640
|
+
the write, so a set with sprite 0 costs 4 + 2l there), and both loops
|
|
641
|
+
keep their slide at the same low byte so one entry table serves either.
|
|
642
|
+
|
|
643
|
+
The IRQ lines 37 to 39 must be free of sprite DMA, or the sync itself
|
|
644
|
+
is stalled by a length that changes with the frame. Sprite 0's lowest Y
|
|
645
|
+
is 40, so its first fetch is on line 40. That is why the band starts on
|
|
646
|
+
40 and not 50: with the interrupt at line 48 and the loop from 50, the
|
|
647
|
+
white ring would cross the sync line whenever its Y fell below 51. The
|
|
648
|
+
lower limit also puts the ring's top rows under the upper border for
|
|
649
|
+
part of its swing; a design that wants the whole ring visible keeps
|
|
650
|
+
Y above 50 or opens that border too (`topbottom_border_open`).
|
|
651
|
+
|
|
652
|
+
The sine table is 256 signed bytes of amplitude 20, which cannot wrap
|
|
653
|
+
(`sine_table_peak_wraps_to_zero` in `pitfalls/maths.md` is about
|
|
654
|
+
amplitude 128 about 128); the largest Y is 170 and the smallest 40.
|
|
655
|
+
|
|
656
|
+
## What it does not establish
|
|
657
|
+
|
|
658
|
+
- Real hardware. Every figure is VICE x64sc 3.10; the stall lengths are
|
|
659
|
+
inferred from the border, not timed per line.
|
|
660
|
+
- The left border and sprites in it. The write opens both sides, and the
|
|
661
|
+
screenshot shows the left open from line 52, but no sprite was put
|
|
662
|
+
there.
|
|
663
|
+
- Eight sprites. The tables are four bits wide; with eight the largest
|
|
664
|
+
stall is 19 and the slide would need to be longer than the sprite-free
|
|
665
|
+
line's spare cycles allow without moving other work out of the loop.
|
|
666
|
+
- The two monitors' cycle numbering. "56" is what VICE reports for the
|
|
667
|
+
write that opens the border on both models; whether that is the 6567's
|
|
668
|
+
cycle 56 or 57 in the datasheet's numbering was not settled.
|
|
669
|
+
- Sets with a gap of two or more sprites, where BA rises between the
|
|
670
|
+
groups; the four sprites here never form one.
|