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,550 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: sprites-only-screen
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [sprites_only_screen_mode]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D012, D019, D01A, D020, D021, D000, D001, D010, D015, D017, D01B, D01C, D01D, D027, DC04, DC05, DC0D, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler: a sprites-only screen, no badlines and no vertical border
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Turns the frame into a surface that shows sprites and nothing else, and
|
|
19
|
+
gives the CPU every cycle that is not sprite DMA. Three things are done to
|
|
20
|
+
`$D011` from five plain raster interrupts: DEN is clear while line 48
|
|
21
|
+
passes, so the badline condition is never met and the character display
|
|
22
|
+
never fetches a row; DEN is set for the one moment that matters, the top
|
|
23
|
+
comparison at line 51, so the vertical border flip-flop is reset once; and
|
|
24
|
+
RSEL is clear while line 251 passes, so the flip-flop is never set again.
|
|
25
|
+
With `$3FFF` zero the idle graphics sequencer draws plain background, the
|
|
26
|
+
border and background are both black, and eight white ring sprites stand
|
|
27
|
+
at Y 8, 30, 60, 100, 140, 200, 240 and 252, two of them where the border
|
|
28
|
+
would normally be.
|
|
29
|
+
|
|
30
|
+
The main loop is a fixed twenty-cycle loop that counts its iterations, and
|
|
31
|
+
the last interrupt of each frame latches the count. Iterations times
|
|
32
|
+
twenty is the CPU time the frame left free, so the same listing measures
|
|
33
|
+
what the mode buys. Three build variants are controls: `NORMAL` keeps
|
|
34
|
+
`$D011 = $1B` in every slot, `NOBORDER` keeps DEN clear and never sets it,
|
|
35
|
+
`NOSPRITES` leaves `$D015` at zero.
|
|
36
|
+
|
|
37
|
+
Verified in VICE x64sc 3.10 (PAL C64C, VIC-II 8565, and NTSC 6567R8): the
|
|
38
|
+
picture holds two colours only, black and white; sprites at Y 8 and Y 252
|
|
39
|
+
are drawn; the free-CPU meter reads 904 iterations a frame on PAL against
|
|
40
|
+
847 for the ordinary screen; and both controls behave as the mechanism
|
|
41
|
+
predicts. Every figure below is from those runs.
|
|
42
|
+
|
|
43
|
+
## Source
|
|
44
|
+
|
|
45
|
+
```asm
|
|
46
|
+
// sprites-only-screen.asm
|
|
47
|
+
// A frame with no badlines and no vertical border: the character display
|
|
48
|
+
// is switched off for the whole frame (DEN clear while line 48 passes, so
|
|
49
|
+
// the badline condition is never met), the vertical border flip-flop is
|
|
50
|
+
// reset once at line 51 (DEN set for that one moment) and never set again
|
|
51
|
+
// (RSEL clear while line 251 passes), and $3FFF, the idle graphics byte,
|
|
52
|
+
// is zero so the sequencer draws plain background. What remains on the
|
|
53
|
+
// screen is the sprites and nothing else, and what remains for the CPU is
|
|
54
|
+
// every cycle except sprite DMA and the five interrupts below.
|
|
55
|
+
//
|
|
56
|
+
// Frame plan, one raster interrupt per row of the table:
|
|
57
|
+
// line 40 $D011 = $0B DEN clear before line 48: no badlines this frame
|
|
58
|
+
// line 50 $D011 = $1B DEN set before line 51: the flip-flop resets
|
|
59
|
+
// line 53 $D011 = $0B DEN clear again; nothing sets the flip-flop
|
|
60
|
+
// line 249 $D011 = $03 RSEL clear before line 251: 251 is not a match
|
|
61
|
+
// line 253 $D011 = $0B RSEL set again: next frame's 247 is not either
|
|
62
|
+
//
|
|
63
|
+
// Eight ring sprites stand at Y 8, 30, 60, 100, 140, 200, 240 and 252,
|
|
64
|
+
// two of them where the border would be. The main loop is a fixed
|
|
65
|
+
// twenty-cycle loop that counts its iterations; the line-253 handler
|
|
66
|
+
// latches the count once per frame, so iterations x 20 is the CPU time
|
|
67
|
+
// the frame left free. Counting stops after 300 frames.
|
|
68
|
+
//
|
|
69
|
+
// Build variants (-define): NORMAL keeps $D011 = $1B in every slot (the
|
|
70
|
+
// ordinary text screen, borders closed); NOBORDER keeps $0B in every slot
|
|
71
|
+
// (DEN never set: border everywhere); NOSPRITES leaves $D015 clear.
|
|
72
|
+
|
|
73
|
+
.const FRAMES_TO_COUNT = 300
|
|
74
|
+
|
|
75
|
+
.const cnt = $0340 // 16-bit iteration counter, main loop
|
|
76
|
+
.const prev = $0342 // its value at the last latch
|
|
77
|
+
.const meter = $0344 // iterations in the last counted frame
|
|
78
|
+
.const frames = $0346 // frames counted, 16-bit
|
|
79
|
+
.const done = $0348 // 1 once FRAMES_TO_COUNT frames are in
|
|
80
|
+
.const d011_rd = $0349 // $D011 as read in the last handler
|
|
81
|
+
.const d012_rd = $034a // $D012 as read in the last handler
|
|
82
|
+
.const step = $034b // index into the tables below
|
|
83
|
+
.const ticks = $034c // five bytes: CIA1 timer A low byte per handler
|
|
84
|
+
|
|
85
|
+
BasicUpstart2(start)
|
|
86
|
+
|
|
87
|
+
// The ring, 24 x 21, one shape shared by all eight sprites.
|
|
88
|
+
* = $0e00
|
|
89
|
+
ring:
|
|
90
|
+
.byte %00000000, %00000000, %00000000
|
|
91
|
+
.byte %00000001, %11111111, %10000000
|
|
92
|
+
.byte %00000111, %11111111, %11100000
|
|
93
|
+
.byte %00001111, %11111111, %11110000
|
|
94
|
+
.byte %00011111, %00000000, %11111000
|
|
95
|
+
.byte %00111100, %00000000, %00111100
|
|
96
|
+
.byte %01111000, %00000000, %00011110
|
|
97
|
+
.byte %01110000, %00000000, %00001110
|
|
98
|
+
.byte %01110000, %00000000, %00001110
|
|
99
|
+
.byte %01110000, %00000000, %00001110
|
|
100
|
+
.byte %11110000, %00000000, %00001111
|
|
101
|
+
.byte %01110000, %00000000, %00001110
|
|
102
|
+
.byte %01110000, %00000000, %00001110
|
|
103
|
+
.byte %01110000, %00000000, %00001110
|
|
104
|
+
.byte %01111000, %00000000, %00011110
|
|
105
|
+
.byte %00111100, %00000000, %00111100
|
|
106
|
+
.byte %00011111, %00000000, %11111000
|
|
107
|
+
.byte %00001111, %11111111, %11110000
|
|
108
|
+
.byte %00000111, %11111111, %11100000
|
|
109
|
+
.byte %00000001, %11111111, %10000000
|
|
110
|
+
.byte %00000000, %00000000, %00000000
|
|
111
|
+
.byte 0
|
|
112
|
+
|
|
113
|
+
* = $0900
|
|
114
|
+
line_tab:
|
|
115
|
+
.byte 40, 50, 53, 249, 253
|
|
116
|
+
d011_tab:
|
|
117
|
+
#if NORMAL
|
|
118
|
+
.byte $1b, $1b, $1b, $1b, $1b
|
|
119
|
+
#elif NOBORDER
|
|
120
|
+
.byte $0b, $0b, $0b, $0b, $0b
|
|
121
|
+
#else
|
|
122
|
+
.byte $0b, $1b, $0b, $03, $0b
|
|
123
|
+
#endif
|
|
124
|
+
sprite_y:
|
|
125
|
+
.byte 8, 30, 60, 100, 140, 200, 240, 252
|
|
126
|
+
|
|
127
|
+
start:
|
|
128
|
+
sei
|
|
129
|
+
lda #$7f
|
|
130
|
+
sta $dc0d // mask every CIA1 source
|
|
131
|
+
lda $dc0d // and drop a pending one
|
|
132
|
+
lda #$ff
|
|
133
|
+
sta $dc04 // timer A latch $FFFF; each handler restarts it
|
|
134
|
+
sta $dc05
|
|
135
|
+
|
|
136
|
+
lda #0
|
|
137
|
+
sta $3fff // idle graphics byte: nothing to draw
|
|
138
|
+
sta $d020 // border black
|
|
139
|
+
sta $d021 // background black
|
|
140
|
+
sta $d017 // no expansion
|
|
141
|
+
sta $d01d
|
|
142
|
+
sta $d01c // single colour
|
|
143
|
+
sta $d01b // sprites in front
|
|
144
|
+
ldx #11
|
|
145
|
+
clear:
|
|
146
|
+
sta cnt,x // cnt .. step
|
|
147
|
+
dex
|
|
148
|
+
bpl clear
|
|
149
|
+
|
|
150
|
+
ldx #7 // sprite k: X = 40 + 36 k, Y from the table
|
|
151
|
+
ldy #14 // register pair offset 2 k
|
|
152
|
+
place:
|
|
153
|
+
txa
|
|
154
|
+
asl
|
|
155
|
+
asl // 4 k
|
|
156
|
+
sta $02
|
|
157
|
+
asl
|
|
158
|
+
asl
|
|
159
|
+
asl // 32 k
|
|
160
|
+
clc
|
|
161
|
+
adc $02 // 36 k
|
|
162
|
+
adc #40
|
|
163
|
+
sta $d000,y
|
|
164
|
+
lda sprite_y,x
|
|
165
|
+
sta $d001,y
|
|
166
|
+
lda #ring / 64
|
|
167
|
+
sta $07f8,x
|
|
168
|
+
lda #1
|
|
169
|
+
sta $d027,x // white
|
|
170
|
+
dey
|
|
171
|
+
dey
|
|
172
|
+
dex
|
|
173
|
+
bpl place
|
|
174
|
+
lda #$c0
|
|
175
|
+
sta $d010 // sprites 6 and 7 stand at X 256 and 292
|
|
176
|
+
#if NOSPRITES
|
|
177
|
+
lda #$00
|
|
178
|
+
#else
|
|
179
|
+
lda #$ff
|
|
180
|
+
#endif
|
|
181
|
+
sta $d015
|
|
182
|
+
|
|
183
|
+
lda #<irq
|
|
184
|
+
sta $0314
|
|
185
|
+
lda #>irq
|
|
186
|
+
sta $0315
|
|
187
|
+
lda #$1b
|
|
188
|
+
sta $d011 // the ordinary value until the first handler
|
|
189
|
+
lda line_tab
|
|
190
|
+
sta $d012
|
|
191
|
+
lda #$01
|
|
192
|
+
sta $d01a // raster source on
|
|
193
|
+
sta $d019 // stale flag off
|
|
194
|
+
cli
|
|
195
|
+
|
|
196
|
+
// The free-CPU meter: exactly 20 cycles round, either way through.
|
|
197
|
+
loop:
|
|
198
|
+
inc cnt // 6
|
|
199
|
+
beq carry // 2 not taken
|
|
200
|
+
bit $ea // 3
|
|
201
|
+
nop // 2
|
|
202
|
+
nop // 2
|
|
203
|
+
nop // 2
|
|
204
|
+
jmp loop // 3 = 20
|
|
205
|
+
carry: // 6 + 3 taken
|
|
206
|
+
inc cnt+1 // 6
|
|
207
|
+
nop // 2
|
|
208
|
+
jmp loop // 3 = 20
|
|
209
|
+
|
|
210
|
+
// One handler for the five slots. Entered on cycle 37-43 of its line
|
|
211
|
+
// through the KERNAL dispatcher; the $D011 write lands about 20 cycles in.
|
|
212
|
+
irq:
|
|
213
|
+
lda #$19
|
|
214
|
+
sta $dc0e // timer A: one shot from $FFFF, starts now
|
|
215
|
+
ldx step
|
|
216
|
+
lda d011_tab,x
|
|
217
|
+
sta $d011
|
|
218
|
+
lda $d011
|
|
219
|
+
sta d011_rd
|
|
220
|
+
lda $d012
|
|
221
|
+
sta d012_rd
|
|
222
|
+
inx
|
|
223
|
+
cpx #5
|
|
224
|
+
bne next
|
|
225
|
+
jsr latch // the line-253 slot closes the frame
|
|
226
|
+
ldx #0
|
|
227
|
+
next:
|
|
228
|
+
stx step
|
|
229
|
+
lda line_tab,x
|
|
230
|
+
sta $d012
|
|
231
|
+
lda #$01
|
|
232
|
+
sta $d019
|
|
233
|
+
ldx step
|
|
234
|
+
lda $dc04
|
|
235
|
+
sta ticks,x // low byte of the count-down: cost so far
|
|
236
|
+
jmp $ea81 // pla/tay/pla/tax/pla/rti
|
|
237
|
+
|
|
238
|
+
// Read the counter, adjusted if the interrupt fell between a low-byte
|
|
239
|
+
// wrap and its carry: the saved return address then points at the beq
|
|
240
|
+
// (with cnt now 0) or at carry, and the high byte is one short.
|
|
241
|
+
latch:
|
|
242
|
+
lda done
|
|
243
|
+
bne latched
|
|
244
|
+
tsx
|
|
245
|
+
lda cnt
|
|
246
|
+
sta $02
|
|
247
|
+
lda cnt+1
|
|
248
|
+
sta $03
|
|
249
|
+
lda cnt
|
|
250
|
+
bne no_fix
|
|
251
|
+
lda $0108,x // PCH under the jsr and the six saved bytes
|
|
252
|
+
cmp #>carry
|
|
253
|
+
bne no_fix
|
|
254
|
+
lda $0107,x // PCL
|
|
255
|
+
cmp #<carry
|
|
256
|
+
beq fix
|
|
257
|
+
cmp #<(loop + 3) // the beq itself, not yet executed
|
|
258
|
+
bne no_fix
|
|
259
|
+
fix:
|
|
260
|
+
inc $03
|
|
261
|
+
no_fix:
|
|
262
|
+
sec
|
|
263
|
+
lda $02
|
|
264
|
+
sbc prev
|
|
265
|
+
sta meter
|
|
266
|
+
lda $03
|
|
267
|
+
sbc prev+1
|
|
268
|
+
sta meter+1
|
|
269
|
+
lda $02
|
|
270
|
+
sta prev
|
|
271
|
+
lda $03
|
|
272
|
+
sta prev+1
|
|
273
|
+
inc frames
|
|
274
|
+
bne count_ok
|
|
275
|
+
inc frames+1
|
|
276
|
+
count_ok:
|
|
277
|
+
lda frames
|
|
278
|
+
cmp #<FRAMES_TO_COUNT
|
|
279
|
+
bne latched
|
|
280
|
+
lda frames+1
|
|
281
|
+
cmp #>FRAMES_TO_COUNT
|
|
282
|
+
bne latched
|
|
283
|
+
lda #1
|
|
284
|
+
sta done
|
|
285
|
+
latched:
|
|
286
|
+
rts
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Build
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
java -jar KickAss.jar sprites-only-screen.asm -o sprites-only-screen.prg
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
The controls are the same file with one symbol defined:
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
java -jar KickAss.jar sprites-only-screen.asm -define NORMAL -o normal.prg
|
|
299
|
+
java -jar KickAss.jar sprites-only-screen.asm -define NOBORDER -o noborder.prg
|
|
300
|
+
java -jar KickAss.jar sprites-only-screen.asm -define NOSPRITES -o nosprites.prg
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
`-showmem` reports the code segment at `$0900` to `$0A44`, 325 bytes, of
|
|
304
|
+
which 18 are the three tables, and the sprite block at `$0E00`, 64 bytes.
|
|
305
|
+
|
|
306
|
+
## Expected output
|
|
307
|
+
|
|
308
|
+
A black picture with eight white rings on it and nothing else: no text,
|
|
309
|
+
no frame, no top or bottom border. The rings stand in a row that steps
|
|
310
|
+
36 pixels right and irregularly down, the first one cut off by the top of
|
|
311
|
+
the picture and the last two in what is normally the bottom border.
|
|
312
|
+
|
|
313
|
+
Screenshot from the pinned run: `screenshots/sprites-only-screen.png`
|
|
314
|
+
(PAL, 384 by 272, screenshot row = raster line minus 16) and
|
|
315
|
+
`screenshots/sprites-only-screen-ntsc.png` (NTSC, 384 by 247, row = line
|
|
316
|
+
minus 28, wrapping into the next frame's lines 0 to 11 at the bottom).
|
|
317
|
+
Pinned at 12,000,000 cycles on both models. The picture is static from the
|
|
318
|
+
program's second frame, so the beam position at the limit does not change
|
|
319
|
+
it; for the record it is line 156, cycle 12 on PAL and line 252, cycle 25
|
|
320
|
+
on NTSC, arithmetic from the last traced interrupt entry (checked against
|
|
321
|
+
the six entries before it). Two runs per model gave byte-identical files:
|
|
322
|
+
MD5 `fa6585d3223bfdb7aecf0135e9683862` (PAL) and
|
|
323
|
+
`60d418e7941332ba382e22a614e0f85f` (NTSC).
|
|
324
|
+
|
|
325
|
+
Measured on the PAL screenshot with a script, none of it by eye:
|
|
326
|
+
|
|
327
|
+
- Exactly two colours in the picture, black and white. 1,518 white
|
|
328
|
+
pixels. Not one pixel of border colour, background colour or text; the
|
|
329
|
+
background is black too, so "no border" is read from the sprites, not
|
|
330
|
+
from a colour change.
|
|
331
|
+
- White columns 48 to 71, 84 to 107, 120 to 143, 156 to 179, 192 to 215,
|
|
332
|
+
228 to 251, 264 to 287 and 300 to 323: the eight sprites at screen X
|
|
333
|
+
40 + 36 k, which the picture shows at X + 8.
|
|
334
|
+
- White rows by column: 0 to 12 (Y 8, whose first drawn line, 9, is above
|
|
335
|
+
the picture), 16 to 34 (Y 30), 46 to 64, 86 to 104, 126 to 144, 186 to
|
|
336
|
+
204, 226 to 244 (Y 240, lines 242 to 260), 238 to 256 (Y 252, lines 254
|
|
337
|
+
to 272) and, in the first column again, 250 to 268: the Y 8 sprite's
|
|
338
|
+
second copy, because its Y compare matches line 264 as well (264 and
|
|
339
|
+
$FF is 8). The ring's first and last rows are blank, so each copy is 19
|
|
340
|
+
rows of white.
|
|
341
|
+
- The lowest white row is 0 and the highest 268 of 271. The sprite at Y 8
|
|
342
|
+
and the sprite at Y 252 are both drawn.
|
|
343
|
+
|
|
344
|
+
On the NTSC screenshot: two colours, 1,266 white pixels, the same eight
|
|
345
|
+
columns. The Y 252 sprite occupies rows 226 to 244, which is lines 254 to
|
|
346
|
+
262 and then 0 to 10 of the next frame; the sprite's row counter runs
|
|
347
|
+
through the frame wrap. The Y 8 sprite is drawn on lines 9 to 29, and the
|
|
348
|
+
NTSC picture begins at line 28, so only its last drawn row shows, row 0,
|
|
349
|
+
plus rows 245 and 246, which are lines 10 and 11 of the next frame. The Y
|
|
350
|
+
240 sprite is on rows 214 to 232. Lowest white row 0, highest 246 of 246.
|
|
351
|
+
|
|
352
|
+
The controls, each one symbol away from the listing:
|
|
353
|
+
|
|
354
|
+
- **`NORMAL`, `$D011 = $1B` in every slot.** The BASIC start-up screen
|
|
355
|
+
with its text and blue frame, three colours plus white. 788 white
|
|
356
|
+
pixels. White rows 46 to 64, 86 to 104, 126 to 144, 186 to 204 and 226
|
|
357
|
+
to 234: the sprites at Y 60, 100, 140 and 200, and the top nine drawn
|
|
358
|
+
lines of the Y 240 sprite (lines 242 to 250), which the border covers
|
|
359
|
+
from line 251. The sprites at Y 8, 30 and 252 have no visible pixel.
|
|
360
|
+
NTSC: 788 white pixels, rows 34 to 52, 74 to 92, 114 to 132, 174 to
|
|
361
|
+
192 and 214 to 222, the same story 12 rows up.
|
|
362
|
+
- **`NOBORDER`, DEN clear in every slot and never set.** One colour in the
|
|
363
|
+
picture, black, on both models: zero white pixels. The vertical border
|
|
364
|
+
flip-flop is reset only while DEN is set, so it stays set from the
|
|
365
|
+
first frame's line 251 onwards and the border colour covers everything,
|
|
366
|
+
sprites included. This is the picture a reader gets who clears DEN to
|
|
367
|
+
kill the badlines and forgets the one line where it must be set.
|
|
368
|
+
- **`NOSPRITES`.** One colour, black, zero white pixels; this build exists
|
|
369
|
+
for the meter, below.
|
|
370
|
+
|
|
371
|
+
If the picture is all black, either DEN never reached line 51 set
|
|
372
|
+
(`NOBORDER`) or the sprites are off. If the two bottom rings are missing
|
|
373
|
+
and the text is back, the slot table is the `NORMAL` one. If rings appear
|
|
374
|
+
in the border with a stripe pattern behind them, `$3FFF` is not zero.
|
|
375
|
+
|
|
376
|
+
### The free-CPU meter
|
|
377
|
+
|
|
378
|
+
The RAM at `$0340` was dumped from the monitor on the store to `done`
|
|
379
|
+
(`-moncommands` with `tr store 0348` and `m 0340 0350`); the store lands
|
|
380
|
+
at cycle 8,881,007 on PAL, 300 frames after the first interrupt at
|
|
381
|
+
2,990,271. `frames` read 300 in every run, `d011_rd` read `$0B` and
|
|
382
|
+
`d012_rd` 254 (the handler enters line 253 on cycle 37 to 43 and the read
|
|
383
|
+
is 25 cycles later, in line 254), so the writes landed where the table
|
|
384
|
+
says. `meter` is the iterations counted in frame 300; one iteration is 20
|
|
385
|
+
cycles.
|
|
386
|
+
|
|
387
|
+
| build | PAL iterations | PAL free cycles | NTSC iterations | NTSC free cycles |
|
|
388
|
+
|---|---|---|---|---|
|
|
389
|
+
| sprites-only (this listing) | 904 | 18,080 | 776 | 15,520 |
|
|
390
|
+
| `NORMAL` | 847 | 16,940 | 723 | 14,460 |
|
|
391
|
+
| `NOSPRITES` (sprites-only, `$D015` = 0) | 945 | 18,900 | 817 | 16,340 |
|
|
392
|
+
| `NORMAL` and `NOSPRITES` together | 891 | 17,820 | 763 | 15,260 |
|
|
393
|
+
|
|
394
|
+
A PAL frame is 19,656 cycles (312 lines of 63) and this NTSC frame 17,095
|
|
395
|
+
(263 lines of 65); those two are arithmetic, the rest of this section is
|
|
396
|
+
the table above and subtraction:
|
|
397
|
+
|
|
398
|
+
- Badlines cost 57 iterations on PAL and 53 on NTSC with the sprites on,
|
|
399
|
+
1,140 and 1,060 cycles; 54 on both without them, 1,080 cycles. Twenty-
|
|
400
|
+
five badlines at 40 to 43 cycles each is 1,000 to 1,075.
|
|
401
|
+
- Sprite DMA for these eight sprites costs 41 iterations, 820 cycles, on
|
|
402
|
+
both models in this mode (44 and 40 iterations under the ordinary
|
|
403
|
+
screen, where some sprite lines are also badlines).
|
|
404
|
+
- What is left in the `NOSPRITES` build, 756 cycles on PAL and 755 on
|
|
405
|
+
NTSC, is the five interrupts through the KERNAL dispatcher, the meter's
|
|
406
|
+
own latch included. The per-handler timer below puts the latch at about
|
|
407
|
+
99 of those.
|
|
408
|
+
- The meter's resolution is one iteration. An earlier build of this
|
|
409
|
+
listing, five bytes shorter before the `$D010` write was added, read 944
|
|
410
|
+
where this one reads 945 with nothing else changed: the phase of the
|
|
411
|
+
loop against the interrupt moves the count by one.
|
|
412
|
+
|
|
413
|
+
The CIA1 timer A low bytes in `ticks`, one per slot, give the handler's
|
|
414
|
+
cost from the `STA $DC0E` that starts the timer to the `LDA $DC04` that
|
|
415
|
+
reads it (the timer counts down from `$FFFF`; `$FF` minus the byte is the
|
|
416
|
+
figure): 58 cycles in every slot in the `NOSPRITES` build. With the
|
|
417
|
+
sprites on, the line-40 and line-50 handlers read 62 (63 on NTSC), stalled
|
|
418
|
+
by the Y 30 sprite's DMA, the line-249 handler 63 (the Y 240 sprite) and
|
|
419
|
+
the line-53 handler 58, no sprite there. The line-253 handler carries the
|
|
420
|
+
latch: 157 without sprites, 178 with two of them active. In the `NORMAL`
|
|
421
|
+
build the line-50 handler reads 105 (101 without sprites): it runs into
|
|
422
|
+
line 51, the first badline, and loses 43 cycles there. The same handler in
|
|
423
|
+
this listing reads 62, which is the badline not happening, measured from
|
|
424
|
+
inside the CPU.
|
|
425
|
+
|
|
426
|
+
## Why this works
|
|
427
|
+
|
|
428
|
+
### No badlines: DEN clear across line 48
|
|
429
|
+
|
|
430
|
+
The badline condition needs DEN to have been set at some point during
|
|
431
|
+
raster line `$30`, 48, and holds for the whole frame once it has been
|
|
432
|
+
(`hardware/vic-ii-reference.md`, the `$D011` section; Bauer §3.5). The
|
|
433
|
+
line-40 handler writes `$0B`, DEN clear, and the line-50 handler is the
|
|
434
|
+
next write, so DEN is clear for all of line 48 and no line of the frame
|
|
435
|
+
can be a badline. The VIC stays in its idle state: it fetches no video
|
|
436
|
+
matrix row, no character pointers and no graphics data, and the CPU loses
|
|
437
|
+
nothing to it on lines 51 to 250. The `NORMAL` control, whose slots all
|
|
438
|
+
write `$1B`, has DEN set on line 48 and its line-50 handler pays the
|
|
439
|
+
line-51 badline in the timer readings above.
|
|
440
|
+
|
|
441
|
+
### The border opens once and never closes
|
|
442
|
+
|
|
443
|
+
The vertical border flip-flop is reset when the raster reaches the top
|
|
444
|
+
comparison line, 51 with RSEL set, at cycle 63 and at the left edge, and
|
|
445
|
+
only while DEN is set; it is set when the raster reaches the bottom
|
|
446
|
+
comparison line, 251 with RSEL set or 247 with it clear, at the same two
|
|
447
|
+
moments (`hardware/vic-ii-reference.md`, "the vertical border flip-flop is
|
|
448
|
+
reset only if DEN is set at cycle 63 of the top comparison line"; Bauer
|
|
449
|
+
§3.9). Nothing else moves it.
|
|
450
|
+
|
|
451
|
+
So DEN must be set for the checks on line 51, and the line-50 write of
|
|
452
|
+
`$1B` does that; the line-53 write of `$0B` takes DEN away again with the
|
|
453
|
+
flip-flop already clear, and the flip-flop has no rule that reads DEN
|
|
454
|
+
except the reset. That is the only reason the line-50 and line-53 writes
|
|
455
|
+
exist. Leave them out and the picture is the `NOBORDER` control: black,
|
|
456
|
+
no sprite, because the flip-flop was set at line 251 of the first frame
|
|
457
|
+
and nothing has reset it since.
|
|
458
|
+
|
|
459
|
+
The bottom set is suppressed the way `topbottom-border-open.md` does it:
|
|
460
|
+
RSEL is set while line 247 passes (the checks look for 251), the line-249
|
|
461
|
+
write clears it (`$03`: DEN clear, RSEL clear, YSCROLL 3), so while line
|
|
462
|
+
251 passes the checks look for 247, and neither matches. The line-253
|
|
463
|
+
write puts RSEL back so that the next frame's line 247 is not a match
|
|
464
|
+
either. The write window is the one measured on that page, lines 248 to
|
|
465
|
+
250 for a handler entered through `$0314`; 249 is the middle of it.
|
|
466
|
+
|
|
467
|
+
With the flip-flop clear all frame and the display disabled, the graphics
|
|
468
|
+
sequencer is in its idle state everywhere and draws the byte at `$3FFF`
|
|
469
|
+
of the current VIC bank in colour 0 over the background (Bauer §3.7.3.9).
|
|
470
|
+
The listing writes `$3FFF` to zero, so what it draws is black background;
|
|
471
|
+
in VICE the byte reads zero anyway, and `topbottom-border-open.md` records
|
|
472
|
+
that measurement. Sprites are fetched and drawn regardless of DEN and of
|
|
473
|
+
the flip-flop, which is why they are the only thing left.
|
|
474
|
+
|
|
475
|
+
### The writes as values, not read-modify-write
|
|
476
|
+
|
|
477
|
+
`topbottom-border-open.md` reads `$D011`, changes one bit and writes it
|
|
478
|
+
back. This listing writes whole values from a table because every write
|
|
479
|
+
sets DEN and RSEL together and YSCROLL is fixed at 3; the table is also
|
|
480
|
+
what makes the controls one symbol away. Bit 7 is written as zero in
|
|
481
|
+
every slot, which is what a raster compare below 256 needs; a reader who
|
|
482
|
+
moves a slot above line 255 has to set it (`d012_wrap_around`).
|
|
483
|
+
|
|
484
|
+
### The meter
|
|
485
|
+
|
|
486
|
+
`loop` is 20 cycles round on both paths: `INC cnt` 6, `BEQ` 2 not taken,
|
|
487
|
+
`BIT $EA` 3, three `NOP`s 6, `JMP` 3; or `BEQ` 3 taken, `INC cnt+1` 6,
|
|
488
|
+
`NOP` 2, `JMP` 3. Sprite DMA and badlines stretch an iteration without
|
|
489
|
+
changing what it counts, so iterations times 20 is CPU time in the loop.
|
|
490
|
+
The latch reads a 16-bit counter that the loop updates in two
|
|
491
|
+
instructions; if the interrupt lands after the low byte wraps and before
|
|
492
|
+
the high byte is carried, the saved return address on the stack is either
|
|
493
|
+
the `BEQ` or `carry`, with `cnt` zero, and the latch adds the missing
|
|
494
|
+
carry before it subtracts. The difference from the previous latch is the
|
|
495
|
+
frame's count.
|
|
496
|
+
|
|
497
|
+
### The sprite that was not there
|
|
498
|
+
|
|
499
|
+
The design says X = 40 + 36 k, and for k = 6 and 7 that is 256 and 292,
|
|
500
|
+
above the eight bits of `$D000`. The first build of this listing left
|
|
501
|
+
`$D010` clear; sprite 6 was drawn at X 0, entirely under the left side
|
|
502
|
+
border, and the PAL picture had 1,322 white pixels and no ring in the
|
|
503
|
+
264 to 287 column. `$D010 = $C0` is the fix; the count went to 1,518 and
|
|
504
|
+
the column appeared (`sprite_x_high_bit_wrong_register` in
|
|
505
|
+
`pitfalls/sprite.md`).
|
|
506
|
+
|
|
507
|
+
### Region
|
|
508
|
+
|
|
509
|
+
`region: both`. The lines the mechanism cares about, 48, 51, 247 and 251,
|
|
510
|
+
are the same on the 6567R8, and the frame plan does not go near the NTSC
|
|
511
|
+
line count. Measured with `-model ntsc`: both controls give the same
|
|
512
|
+
result as on PAL, the meter table has its own NTSC column, and the
|
|
513
|
+
handler timer reads 63 rather than 62 on lines 40 and 50, one cycle more
|
|
514
|
+
of sprite stall on a 65-cycle line. The picture differs only in what the
|
|
515
|
+
shorter frame and VICE's 247-row window include, as itemised above.
|
|
516
|
+
|
|
517
|
+
## Sources
|
|
518
|
+
|
|
519
|
+
- Christian Bauer, *The MOS 6567/6569 video controller (VIC-II) and its
|
|
520
|
+
application in the Commodore 64*, 28 August 1996: §3.5 (the badline
|
|
521
|
+
condition and the DEN test on line `$30`), §3.9 (the two border
|
|
522
|
+
flip-flops and their six rules), §3.7.3.9 (the idle state and `$3FFF`),
|
|
523
|
+
§3.8.1 (sprite Y compared against the low eight bits of the raster).
|
|
524
|
+
https://www.zimmers.net/cbmpics/cbm/c64/vic-ii.txt
|
|
525
|
+
- This repository: `hardware/vic-ii-reference.md` (the `$D011` section:
|
|
526
|
+
DEN on line `$30`, and the flip-flop reset needing DEN at cycle 63 of
|
|
527
|
+
the top comparison line, both measured in VICE);
|
|
528
|
+
`recipes/kickassembler/topbottom-border-open.md` (the RSEL write window
|
|
529
|
+
and the `$3FFF` readback); `recipes/kickassembler/stable-raster-irq.md`
|
|
530
|
+
(handler entry on cycle 37 to 43); `pitfalls/raster-and-badline.md`
|
|
531
|
+
(`d012_wrap_around`, `idle_fetch_byte_shows_in_gaps`,
|
|
532
|
+
`vic_bus_takeover_on_dma`); `pitfalls/sprite.md`
|
|
533
|
+
(`sprite_x_high_bit_wrong_register`).
|
|
534
|
+
- VICE 3.10 x64sc, headless, `-model` default (PAL C64C) and `ntsc`
|
|
535
|
+
(6567R8); KickAssembler 5.25. All row, column, colour and cycle figures
|
|
536
|
+
on this page are from those runs.
|
|
537
|
+
|
|
538
|
+
## What it does not establish
|
|
539
|
+
|
|
540
|
+
- Real hardware. Every figure is VICE x64sc 3.10; the badline and border
|
|
541
|
+
rules it relies on are Bauer's, measured here only in the emulator.
|
|
542
|
+
- NTSC beyond what the screenshot and the meter show: the 6567R56A with
|
|
543
|
+
its 262-line, 64-cycle frame was not run.
|
|
544
|
+
- Whether the idle byte is read from `$3FFF` of the bank you expect on
|
|
545
|
+
every VIC revision; this listing runs in bank 0 and writes `$3FFF`
|
|
546
|
+
there, and VICE read it back as zero before the write.
|
|
547
|
+
- What the mode costs with more than two sprites on a line; the eight
|
|
548
|
+
here overlap at most two deep.
|
|
549
|
+
- Anything about the meter's absolute accuracy beyond one iteration:
|
|
550
|
+
a different code alignment moved one control's count by one.
|