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,366 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: cia-revision-detect
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: []
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [DC04, DC05, DC06, DC07, DC0D, DC0E, DC0F, D011, D012, D020]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Detect the CIA revision from its interrupt latency
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Tells an old 6526 from a 6526A or 8521 at CIA1 by measuring how many
|
|
19
|
+
cycles pass between a Timer A underflow and the first instruction of the
|
|
20
|
+
interrupt handler. Timer B free-runs from `$FFFF` as the clock; the
|
|
21
|
+
handler's first instruction reads it. The old part raises its interrupt
|
|
22
|
+
one cycle later than the new one, and against a run of 2-cycle `NOP`s
|
|
23
|
+
that shows as a pair of readings the program can classify. The result
|
|
24
|
+
goes to `$02FE` (`00` old 6526, `01` new 8521 or 6526A, `FF` neither
|
|
25
|
+
signature) and the verdict to `$02FF` and the border. Use it once at
|
|
26
|
+
start-up, before a raster routine or a loader that counts on the CIA's
|
|
27
|
+
cycle-exact interrupt timing. The pitfall it serves is
|
|
28
|
+
`cia_revision_irq_one_cycle_late` in `pitfalls/cia.md`.
|
|
29
|
+
|
|
30
|
+
## Source
|
|
31
|
+
|
|
32
|
+
```asm
|
|
33
|
+
// cia-revision-detect.asm
|
|
34
|
+
// Detects which CIA revision sits at CIA1 by measuring how many cycles
|
|
35
|
+
// pass between a Timer A underflow and the first instruction of the IRQ
|
|
36
|
+
// handler. Timer B free-runs from $FFFF as the clock. The test runs at
|
|
37
|
+
// two phases (Timer A latch $40 and $41) against a run of 2-cycle NOPs:
|
|
38
|
+
// on VICE's old 6526 the pair reads $12/$11, on its new 8521 $10/$11.
|
|
39
|
+
// Result byte at $02FE: 0 = old 6526, 1 = new 8521 / 6526A, $FF = neither
|
|
40
|
+
// signature. $02FF = 1 and a green border when a signature matched,
|
|
41
|
+
// 2 and red otherwise.
|
|
42
|
+
.encoding "screencode_upper"
|
|
43
|
+
|
|
44
|
+
.const SCREEN = $0400
|
|
45
|
+
.const BASE = $40
|
|
46
|
+
.const REVISION = $02fe
|
|
47
|
+
.const RESULT = $02ff
|
|
48
|
+
.const zp_ph = $fb // phase index 0 or 1
|
|
49
|
+
.const zp_flag = $fc // handler sets to 1
|
|
50
|
+
.const txt_ptr = $fd // verdict text pointer
|
|
51
|
+
|
|
52
|
+
BasicUpstart2(start)
|
|
53
|
+
|
|
54
|
+
* = $0900 "code"
|
|
55
|
+
|
|
56
|
+
start:
|
|
57
|
+
sei
|
|
58
|
+
lda #$35
|
|
59
|
+
sta $01 // I/O in, KERNAL and BASIC out
|
|
60
|
+
lda #<irq
|
|
61
|
+
sta $fffe
|
|
62
|
+
lda #>irq
|
|
63
|
+
sta $ffff
|
|
64
|
+
lda #<nmi
|
|
65
|
+
sta $fffa
|
|
66
|
+
lda #>nmi
|
|
67
|
+
sta $fffb
|
|
68
|
+
lda #$7f
|
|
69
|
+
sta $dc0d
|
|
70
|
+
sta $dd0d
|
|
71
|
+
lda $dc0d
|
|
72
|
+
lda $dd0d
|
|
73
|
+
lda #$00
|
|
74
|
+
sta $d01a
|
|
75
|
+
lda #$ff
|
|
76
|
+
sta $d019
|
|
77
|
+
lda #$00
|
|
78
|
+
sta $d015
|
|
79
|
+
lda #$0b
|
|
80
|
+
sta $d011 // DEN = 0: no badlines while measuring
|
|
81
|
+
lda #$00
|
|
82
|
+
sta $d020
|
|
83
|
+
sta $d021
|
|
84
|
+
jsr clear_screen
|
|
85
|
+
jsr wait_frame
|
|
86
|
+
jsr wait_frame
|
|
87
|
+
|
|
88
|
+
lda #$00
|
|
89
|
+
sta zp_ph
|
|
90
|
+
phase_loop:
|
|
91
|
+
jsr arm_timers
|
|
92
|
+
lda zp_ph
|
|
93
|
+
clc
|
|
94
|
+
adc #BASE
|
|
95
|
+
sta $dc04 // Timer A latch = $40 + phase
|
|
96
|
+
lda #$00
|
|
97
|
+
sta $dc05
|
|
98
|
+
sta zp_flag
|
|
99
|
+
lda #$81
|
|
100
|
+
sta $dc0d // Timer A may interrupt
|
|
101
|
+
lda #$40
|
|
102
|
+
sync:
|
|
103
|
+
cmp $d012
|
|
104
|
+
bne sync
|
|
105
|
+
cli
|
|
106
|
+
lda #$11
|
|
107
|
+
ldx #$19
|
|
108
|
+
sta $dc0f // Timer B: continuous, load, start
|
|
109
|
+
stx $dc0e // Timer A: one-shot, load, start, 4 cycles later
|
|
110
|
+
.fill 200, $ea // the IRQ lands in these NOPs
|
|
111
|
+
sei
|
|
112
|
+
lda zp_flag
|
|
113
|
+
beq unknown
|
|
114
|
+
inc zp_ph
|
|
115
|
+
lda zp_ph
|
|
116
|
+
cmp #$02
|
|
117
|
+
beq classify
|
|
118
|
+
jmp phase_loop
|
|
119
|
+
|
|
120
|
+
classify:
|
|
121
|
+
// lat[k] = ($FF - TBlo) - ($40 + k): the phase-0 value decides
|
|
122
|
+
lda #$ff
|
|
123
|
+
sec
|
|
124
|
+
sbc tb_lo
|
|
125
|
+
sec
|
|
126
|
+
sbc #BASE
|
|
127
|
+
sta lat
|
|
128
|
+
lda #$ff
|
|
129
|
+
sec
|
|
130
|
+
sbc tb_lo+1
|
|
131
|
+
sec
|
|
132
|
+
sbc #BASE+1
|
|
133
|
+
sta lat+1
|
|
134
|
+
cmp #$11
|
|
135
|
+
bne unknown // the odd phase reads $11 on both models
|
|
136
|
+
lda lat
|
|
137
|
+
cmp #$12
|
|
138
|
+
beq old_cia
|
|
139
|
+
cmp #$10
|
|
140
|
+
bne unknown
|
|
141
|
+
lda #$01
|
|
142
|
+
sta REVISION
|
|
143
|
+
ldx #<txt_new
|
|
144
|
+
ldy #>txt_new
|
|
145
|
+
jmp report
|
|
146
|
+
old_cia:
|
|
147
|
+
lda #$00
|
|
148
|
+
sta REVISION
|
|
149
|
+
ldx #<txt_old
|
|
150
|
+
ldy #>txt_old
|
|
151
|
+
jmp report
|
|
152
|
+
unknown:
|
|
153
|
+
lda #$ff
|
|
154
|
+
sta REVISION
|
|
155
|
+
ldx #<txt_unknown
|
|
156
|
+
ldy #>txt_unknown
|
|
157
|
+
jsr show
|
|
158
|
+
lda #$02
|
|
159
|
+
sta $d020
|
|
160
|
+
sta RESULT
|
|
161
|
+
jmp hang
|
|
162
|
+
report:
|
|
163
|
+
jsr show
|
|
164
|
+
lda #$05
|
|
165
|
+
sta $d020
|
|
166
|
+
lda #$01
|
|
167
|
+
sta RESULT
|
|
168
|
+
hang:
|
|
169
|
+
jmp hang
|
|
170
|
+
|
|
171
|
+
irq:
|
|
172
|
+
lda $dc06 // the read is this instruction's 4th cycle
|
|
173
|
+
ldx zp_ph
|
|
174
|
+
sta tb_lo,x
|
|
175
|
+
lda $dc0d // acknowledge
|
|
176
|
+
lda #$01
|
|
177
|
+
sta zp_flag
|
|
178
|
+
rti
|
|
179
|
+
|
|
180
|
+
nmi:
|
|
181
|
+
rti
|
|
182
|
+
|
|
183
|
+
arm_timers:
|
|
184
|
+
lda #$00
|
|
185
|
+
sta $dc0e
|
|
186
|
+
sta $dc0f
|
|
187
|
+
lda #$7f
|
|
188
|
+
sta $dc0d
|
|
189
|
+
lda $dc0d
|
|
190
|
+
lda #$ff
|
|
191
|
+
sta $dc06
|
|
192
|
+
sta $dc07 // Timer B latch $FFFF
|
|
193
|
+
rts
|
|
194
|
+
|
|
195
|
+
wait_frame:
|
|
196
|
+
lda $d012
|
|
197
|
+
bne wait_frame
|
|
198
|
+
lda $d011
|
|
199
|
+
bmi wait_frame
|
|
200
|
+
!: lda $d012
|
|
201
|
+
beq !-
|
|
202
|
+
rts
|
|
203
|
+
|
|
204
|
+
clear_screen:
|
|
205
|
+
ldx #$00
|
|
206
|
+
lda #$20
|
|
207
|
+
!: sta SCREEN,x
|
|
208
|
+
sta SCREEN+$100,x
|
|
209
|
+
sta SCREEN+$200,x
|
|
210
|
+
sta SCREEN+$300,x
|
|
211
|
+
inx
|
|
212
|
+
bne !-
|
|
213
|
+
ldx #$00
|
|
214
|
+
lda #$01
|
|
215
|
+
!: sta $d800,x
|
|
216
|
+
sta $d900,x
|
|
217
|
+
sta $da00,x
|
|
218
|
+
sta $db00,x
|
|
219
|
+
inx
|
|
220
|
+
bne !-
|
|
221
|
+
rts
|
|
222
|
+
|
|
223
|
+
// X/Y = verdict text. Row 0: title. Row 2: the two latency bytes.
|
|
224
|
+
// Row 4: the verdict.
|
|
225
|
+
show:
|
|
226
|
+
stx txt_ptr
|
|
227
|
+
sty txt_ptr+1
|
|
228
|
+
lda #$1b
|
|
229
|
+
sta $d011 // display back on
|
|
230
|
+
ldx #$00
|
|
231
|
+
!: lda txt_title,x
|
|
232
|
+
beq !+
|
|
233
|
+
sta SCREEN,x
|
|
234
|
+
inx
|
|
235
|
+
bne !-
|
|
236
|
+
!: lda lat
|
|
237
|
+
ldy #$00
|
|
238
|
+
jsr put_hex
|
|
239
|
+
lda lat+1
|
|
240
|
+
ldy #$03
|
|
241
|
+
jsr put_hex
|
|
242
|
+
ldy #$00
|
|
243
|
+
!: lda (txt_ptr),y
|
|
244
|
+
beq !+
|
|
245
|
+
sta SCREEN+160,y
|
|
246
|
+
iny
|
|
247
|
+
bne !-
|
|
248
|
+
!: rts
|
|
249
|
+
|
|
250
|
+
put_hex: // A = byte, Y = column on row 2
|
|
251
|
+
pha
|
|
252
|
+
lsr
|
|
253
|
+
lsr
|
|
254
|
+
lsr
|
|
255
|
+
lsr
|
|
256
|
+
tax
|
|
257
|
+
lda hexdig,x
|
|
258
|
+
sta SCREEN+80,y
|
|
259
|
+
iny
|
|
260
|
+
pla
|
|
261
|
+
and #$0f
|
|
262
|
+
tax
|
|
263
|
+
lda hexdig,x
|
|
264
|
+
sta SCREEN+80,y
|
|
265
|
+
rts
|
|
266
|
+
|
|
267
|
+
hexdig: .text "0123456789ABCDEF"
|
|
268
|
+
txt_title: .text "CIA1 IRQ LATENCY, PHASES 0 AND 1:"
|
|
269
|
+
.byte 0
|
|
270
|
+
txt_old: .text "OLD 6526: IRQ ONE CYCLE LATER (02FE=00)"
|
|
271
|
+
.byte 0
|
|
272
|
+
txt_new: .text "NEW 8521 OR 6526A (02FE=01)"
|
|
273
|
+
.byte 0
|
|
274
|
+
txt_unknown: .text "NO KNOWN SIGNATURE (02FE=FF)"
|
|
275
|
+
.byte 0
|
|
276
|
+
tb_lo: .byte 0, 0
|
|
277
|
+
lat: .byte 0, 0
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Build
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
java -jar $KICKASS_JAR cia-revision-detect.asm -o cia-revision-detect.prg
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
KickAssembler 5.25 produces a 1,019-byte PRG; the code segment runs
|
|
287
|
+
`$0900` to `$0BF9`.
|
|
288
|
+
|
|
289
|
+
Pinned VICE run (both models, `docs/recipes/runs.json`):
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas \
|
|
293
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
294
|
+
-limitcycles 8000000 -ciamodel 0 \
|
|
295
|
+
-exitscreenshot cia-revision-detect.png -autostart cia-revision-detect.prg
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Add `-model ntsc` for the second picture. `-ciamodel 0` selects VICE's
|
|
299
|
+
old 6526 for both CIAs (`1` is the new 8521; the names and values are
|
|
300
|
+
from `x64sc -help`, VICE 3.10). The pin uses the old part because it is
|
|
301
|
+
not the PAL default: a run with no `-ciamodel` flag reads as the new
|
|
302
|
+
part on the PAL default (VICE's C64C) and on `-model c64c`, so a picture
|
|
303
|
+
of it would not show the flag doing anything. The default depends on the
|
|
304
|
+
model: with no flag, `-model c64` and `-model ntsc` read `12 11`, the old
|
|
305
|
+
part, and `-model newntsc` reads `10 11`, the new one (measured in VICE
|
|
306
|
+
x64sc 3.10). An earlier version of this paragraph
|
|
307
|
+
said a run with no flag reads as the new part, without naming the model.
|
|
308
|
+
|
|
309
|
+
## Expected output
|
|
310
|
+
|
|
311
|
+
Green border, black background, white text:
|
|
312
|
+
|
|
313
|
+
```text
|
|
314
|
+
row 0 CIA1 IRQ LATENCY, PHASES 0 AND 1:
|
|
315
|
+
row 2 12 11
|
|
316
|
+
row 4 OLD 6526: IRQ ONE CYCLE LATER (02FE=00)
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
`recipes/kickassembler/screenshots/cia-revision-detect.png` (PAL, 384 by
|
|
320
|
+
272) and `cia-revision-detect-ntsc.png` (NTSC, 384 by 247) were each
|
|
321
|
+
produced three times by the pinned command with identical bytes, and
|
|
322
|
+
decoded by matching every 8 by 8 cell against `chargen-901225-01.bin`
|
|
323
|
+
(measured in VICE x64sc 3.10, rung 1). With `-ciamodel 1` instead, on
|
|
324
|
+
either model, row 2 reads `10 11` and row 4 `NEW 8521 OR 6526A
|
|
325
|
+
(02FE=01)`, border green. `$02FF` is `01` in all four cases. The
|
|
326
|
+
verdict is internal: the pair of readings matched one of the two
|
|
327
|
+
signatures. Which one it matched is what the command line set, and the
|
|
328
|
+
picture shows it.
|
|
329
|
+
|
|
330
|
+
Row 2 is the number of Timer B counts between the start of the test and
|
|
331
|
+
the handler's read, less the Timer A latch, for the latch `$40` and then
|
|
332
|
+
`$41`. The two models differ at the even phase by two cycles and agree
|
|
333
|
+
at the odd one; averaged over both phases the old part is one cycle
|
|
334
|
+
later, which is the mechanism, and the 2-cycle `NOP` boundary is why it
|
|
335
|
+
shows as 0 or 2 rather than 1. The eight-phase form of the same
|
|
336
|
+
measurement is in `pitfalls/cia.md`, `cia_revision_irq_one_cycle_late`.
|
|
337
|
+
|
|
338
|
+
## Why this works
|
|
339
|
+
|
|
340
|
+
The measurement needs a fixed instruction stream from the timer start
|
|
341
|
+
to the handler's first read, so nothing may steal a cycle: the display
|
|
342
|
+
is blanked (`$D011` bit 4 clear) two frames ahead so no badline occurs,
|
|
343
|
+
sprites are off, and the KERNAL is banked out so the hardware vector at
|
|
344
|
+
`$FFFE` goes straight to the handler with no dispatcher in the way. The
|
|
345
|
+
`$D012` wait only orders the test within the frame; with no badlines
|
|
346
|
+
the CIA figures do not depend on the raster position, and the PAL and
|
|
347
|
+
NTSC pictures agree.
|
|
348
|
+
|
|
349
|
+
Two writes start the clocks four cycles apart: `sta $DC0F` starts Timer
|
|
350
|
+
B counting down from `$FFFF`, `stx $DC0E` starts Timer A one-shot from
|
|
351
|
+
the latch. When Timer A underflows the chip sets ICR bit 0 and, with
|
|
352
|
+
the mask set, pulls `/IRQ`. The 6510 finishes the `NOP` it is in, runs
|
|
353
|
+
its seven-cycle interrupt sequence and fetches the handler's `lda
|
|
354
|
+
$DC06`, whose fourth cycle reads the low byte of Timer B. `$FF` less
|
|
355
|
+
that byte, less the latch, is the figure on screen. Everything in that
|
|
356
|
+
path is fixed except the CIA's own delay between underflow and `/IRQ`,
|
|
357
|
+
and the 6510 samples `/IRQ` once per instruction, so a one-cycle change
|
|
358
|
+
in the CIA either changes nothing or costs a whole `NOP`. Running two
|
|
359
|
+
latches one apart puts one test on each side of that boundary, which
|
|
360
|
+
is why the odd phase reads the same on both parts and the even one
|
|
361
|
+
tells them apart.
|
|
362
|
+
|
|
363
|
+
The classifier compares against the two pairs measured in VICE. A pair
|
|
364
|
+
that matches neither reports `$FF`; on hardware this recipe has not
|
|
365
|
+
been run, and a machine that gives a third pair is telling you
|
|
366
|
+
something this page does not know.
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: colour-cycling
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [colour_cycling]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D012, D020, D021, DC04, DC05, DC0D, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Colour Cycling
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Eight text rows of reverse spaces whose colour RAM is rewritten every second
|
|
19
|
+
frame from a rotating eight-colour table, so a blue, light blue, cyan and
|
|
20
|
+
white band runs down the screen without a screen-RAM write. The rewrite is
|
|
21
|
+
320 stores, landed in the lower border by a busy-wait on $D012, and CIA1
|
|
22
|
+
timer A times it; the last cost is printed on row 0 in hex beside the
|
|
23
|
+
current phase. After 100 frames the program grades itself: `$02FF` is `$01`
|
|
24
|
+
with a green border if the phase is the one 100 frames must produce and no
|
|
25
|
+
rewrite went over 4,000 cycles, else `$02` with a red border. The cycling
|
|
26
|
+
carries on after the verdict, so the pinned screenshot shows the band in
|
|
27
|
+
mid-rotation under a green border. Use it as the template for water, a
|
|
28
|
+
conveyor or a glow, or to cycle sprite colours or a `$D021` triple instead
|
|
29
|
+
of colour RAM.
|
|
30
|
+
|
|
31
|
+
## Source
|
|
32
|
+
|
|
33
|
+
```asm
|
|
34
|
+
// colour-cycling.asm
|
|
35
|
+
// Eight text rows of reverse spaces whose colour RAM is rewritten every
|
|
36
|
+
// second frame from a rotating eight-colour table, so a band of colour
|
|
37
|
+
// runs down the screen. CIA1 timer A times each rewrite; the cost of the
|
|
38
|
+
// last one is printed on row 0 in hex, with the current phase. After
|
|
39
|
+
// FRAMES frames the program grades itself: $02FF is $01 with a green
|
|
40
|
+
// border if the phase is the one that many frames must produce and no
|
|
41
|
+
// rewrite took more than BUDGET cycles, else $02 with a red border. The
|
|
42
|
+
// cycling carries on after the verdict, so a late screenshot shows the
|
|
43
|
+
// effect in progress under the verdict border.
|
|
44
|
+
|
|
45
|
+
.const SCREEN = $0400
|
|
46
|
+
.const COLOUR = $d800
|
|
47
|
+
.const SYNC_LINE = 251 // first line of the lower border, both models
|
|
48
|
+
.const FRAMES_PER_STEP = 2
|
|
49
|
+
.const BAND_TOP = 8 // first band row
|
|
50
|
+
.const BAND_ROWS = 8
|
|
51
|
+
.const FRAMES = 100 // verdict after this many frames
|
|
52
|
+
.const EXPECT_PHASE = (FRAMES / FRAMES_PER_STEP) & 7
|
|
53
|
+
.const BUDGET = 4000 // cycles one rewrite may take
|
|
54
|
+
.const RESULT = $02ff // verdict byte read by a harness
|
|
55
|
+
.const COST_COL = 21 // "$xxxx" on row 0
|
|
56
|
+
.const PHASE_COL = 34
|
|
57
|
+
|
|
58
|
+
BasicUpstart2(start)
|
|
59
|
+
|
|
60
|
+
// CIA1 timer A as a stopwatch, phi2 clock, counting down from $FFFF.
|
|
61
|
+
.macro t_start() {
|
|
62
|
+
lda #$00
|
|
63
|
+
sta $dc0e
|
|
64
|
+
lda #$ff
|
|
65
|
+
sta $dc04
|
|
66
|
+
sta $dc05
|
|
67
|
+
lda #$11 // force load, start, count phi2
|
|
68
|
+
sta $dc0e
|
|
69
|
+
}
|
|
70
|
+
.macro t_stop(addr) {
|
|
71
|
+
lda #$00
|
|
72
|
+
sta $dc0e
|
|
73
|
+
sec
|
|
74
|
+
lda #$ff
|
|
75
|
+
sbc $dc04
|
|
76
|
+
sta addr
|
|
77
|
+
lda #$ff
|
|
78
|
+
sbc $dc05
|
|
79
|
+
sta addr + 1
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
* = $0900
|
|
83
|
+
start:
|
|
84
|
+
sei // no KERNAL IRQ: the rewrite must not be interrupted
|
|
85
|
+
lda #$7f
|
|
86
|
+
sta $dc0d // no CIA1 interrupts: timer A is the stopwatch
|
|
87
|
+
lda $dc0d
|
|
88
|
+
lda #$00
|
|
89
|
+
sta $d020
|
|
90
|
+
sta $d021
|
|
91
|
+
|
|
92
|
+
ldx #$00
|
|
93
|
+
lda #$20
|
|
94
|
+
!: sta SCREEN, x // clear the screen
|
|
95
|
+
sta SCREEN + $100, x
|
|
96
|
+
sta SCREEN + $200, x
|
|
97
|
+
sta SCREEN + $300, x
|
|
98
|
+
inx
|
|
99
|
+
bne !-
|
|
100
|
+
|
|
101
|
+
ldx #39 // caption on row 0, white
|
|
102
|
+
!: lda caption, x
|
|
103
|
+
sta SCREEN, x
|
|
104
|
+
lda #$01
|
|
105
|
+
sta COLOUR, x
|
|
106
|
+
dex
|
|
107
|
+
bpl !-
|
|
108
|
+
|
|
109
|
+
lda #$a0 // the band: reverse spaces, colour RAM shows
|
|
110
|
+
.for (var r = 0; r < BAND_ROWS; r++) {
|
|
111
|
+
ldx #39
|
|
112
|
+
!: sta SCREEN + (BAND_TOP + r) * 40, x
|
|
113
|
+
dex
|
|
114
|
+
bpl !-
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
mainloop:
|
|
118
|
+
lda #SYNC_LINE // first leave the sync line: a short pass
|
|
119
|
+
!: cmp $d012 // would otherwise fall through twice in it
|
|
120
|
+
beq !-
|
|
121
|
+
!: cmp $d012
|
|
122
|
+
bne !-
|
|
123
|
+
|
|
124
|
+
inc frame
|
|
125
|
+
inc sub
|
|
126
|
+
lda sub
|
|
127
|
+
cmp #FRAMES_PER_STEP
|
|
128
|
+
beq step
|
|
129
|
+
jmp check
|
|
130
|
+
step:
|
|
131
|
+
lda #$00
|
|
132
|
+
sta sub
|
|
133
|
+
inc phase
|
|
134
|
+
lda phase
|
|
135
|
+
and #$07
|
|
136
|
+
sta phase
|
|
137
|
+
|
|
138
|
+
// Rewrite the band: row r takes colour (r + phase) & 7 from the table.
|
|
139
|
+
t_start()
|
|
140
|
+
ldy phase
|
|
141
|
+
.for (var r = 0; r < BAND_ROWS; r++) {
|
|
142
|
+
lda palette, y // palette is 16 long, so no masking
|
|
143
|
+
ldx #39
|
|
144
|
+
!: sta COLOUR + (BAND_TOP + r) * 40, x
|
|
145
|
+
dex
|
|
146
|
+
bpl !-
|
|
147
|
+
iny
|
|
148
|
+
}
|
|
149
|
+
t_stop(cost)
|
|
150
|
+
|
|
151
|
+
// Keep the largest cost seen.
|
|
152
|
+
lda cost + 1
|
|
153
|
+
cmp maxcost + 1
|
|
154
|
+
bcc show
|
|
155
|
+
bne newmax
|
|
156
|
+
lda cost
|
|
157
|
+
cmp maxcost
|
|
158
|
+
bcc show
|
|
159
|
+
newmax:
|
|
160
|
+
lda cost
|
|
161
|
+
sta maxcost
|
|
162
|
+
lda cost + 1
|
|
163
|
+
sta maxcost + 1
|
|
164
|
+
|
|
165
|
+
show:
|
|
166
|
+
lda cost + 1 // "$xxxx": the last rewrite in hex
|
|
167
|
+
jsr hex_hi
|
|
168
|
+
sta SCREEN + COST_COL + 1
|
|
169
|
+
lda cost + 1
|
|
170
|
+
jsr hex_lo
|
|
171
|
+
sta SCREEN + COST_COL + 2
|
|
172
|
+
lda cost
|
|
173
|
+
jsr hex_hi
|
|
174
|
+
sta SCREEN + COST_COL + 3
|
|
175
|
+
lda cost
|
|
176
|
+
jsr hex_lo
|
|
177
|
+
sta SCREEN + COST_COL + 4
|
|
178
|
+
lda phase
|
|
179
|
+
ora #$30
|
|
180
|
+
sta SCREEN + PHASE_COL
|
|
181
|
+
|
|
182
|
+
check:
|
|
183
|
+
lda done
|
|
184
|
+
bne back
|
|
185
|
+
lda frame
|
|
186
|
+
cmp #FRAMES
|
|
187
|
+
bne back
|
|
188
|
+
inc done
|
|
189
|
+
jmp verdict
|
|
190
|
+
back:
|
|
191
|
+
jmp mainloop
|
|
192
|
+
|
|
193
|
+
verdict:
|
|
194
|
+
|
|
195
|
+
// Verdict: the phase FRAMES frames must give, and no rewrite over budget.
|
|
196
|
+
lda phase
|
|
197
|
+
cmp #EXPECT_PHASE
|
|
198
|
+
bne fail
|
|
199
|
+
lda maxcost + 1
|
|
200
|
+
cmp #>BUDGET
|
|
201
|
+
bcc pass
|
|
202
|
+
bne fail
|
|
203
|
+
lda maxcost
|
|
204
|
+
cmp #<BUDGET
|
|
205
|
+
bcs fail
|
|
206
|
+
pass:
|
|
207
|
+
lda #$01
|
|
208
|
+
sta RESULT
|
|
209
|
+
lda #$05
|
|
210
|
+
sta $d020
|
|
211
|
+
jmp mainloop
|
|
212
|
+
fail:
|
|
213
|
+
lda #$02
|
|
214
|
+
sta RESULT
|
|
215
|
+
lda #$02
|
|
216
|
+
sta $d020
|
|
217
|
+
jmp mainloop
|
|
218
|
+
|
|
219
|
+
hex_hi: // A = byte -> screen code of its high nibble
|
|
220
|
+
lsr
|
|
221
|
+
lsr
|
|
222
|
+
lsr
|
|
223
|
+
lsr
|
|
224
|
+
hex_lo: // A = byte -> screen code of its low nibble
|
|
225
|
+
and #$0f
|
|
226
|
+
cmp #$0a
|
|
227
|
+
bcc !+
|
|
228
|
+
sbc #$09 // 10..15 -> screen codes 1..6, "A".."F"
|
|
229
|
+
rts
|
|
230
|
+
!: ora #$30 // 0..9 -> "0".."9"
|
|
231
|
+
rts
|
|
232
|
+
|
|
233
|
+
// The eight band colours, written twice so an index of phase + row never
|
|
234
|
+
// needs masking: blue, light blue, cyan, white, cyan, light blue, blue, black.
|
|
235
|
+
palette: .byte 6, 14, 3, 1, 3, 14, 6, 0
|
|
236
|
+
.byte 6, 14, 3, 1, 3, 14, 6, 0
|
|
237
|
+
|
|
238
|
+
caption: .text "colour cycling cost $0000 phase 0 "
|
|
239
|
+
|
|
240
|
+
frame: .byte 0
|
|
241
|
+
sub: .byte 0
|
|
242
|
+
phase: .byte 0
|
|
243
|
+
done: .byte 0
|
|
244
|
+
cost: .word 0
|
|
245
|
+
maxcost: .word 0
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
## Build
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
java -jar KickAss.jar colour-cycling.asm -o colour-cycling.prg
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
`-showmem` reports one block at $0900-$0B0C: code, then the sixteen-byte
|
|
255
|
+
palette, the caption and the counters. The PRG is 782 bytes.
|
|
256
|
+
|
|
257
|
+
## Expected output
|
|
258
|
+
|
|
259
|
+
Black screen with the caption `COLOUR CYCLING COST $0CC1 PHASE n` in
|
|
260
|
+
white on row 0. Rows 8 to 15 are each one solid colour across all forty
|
|
261
|
+
columns: row `8 + r` shows `palette[(r + phase) & 7]` where the palette is
|
|
262
|
+
blue, light blue, cyan, white, cyan, light blue, blue, black. Every second
|
|
263
|
+
frame the phase goes up by one, so the band slides up a row: on PAL a full
|
|
264
|
+
turn of eight steps takes sixteen frames, 0.32 s, on NTSC 0.27 s
|
|
265
|
+
(arithmetic from 19,656 and 17,095 cycles a frame). The cost readout is the
|
|
266
|
+
cycles CIA1 timer A counted for the last rewrite, 3,265, the same on both
|
|
267
|
+
models. The border is black until frame 100 and green from then on.
|
|
268
|
+
|
|
269
|
+
The pinned run is 6,030,000 cycles on both models. Both show phase 5: rows
|
|
270
|
+
8 to 15 are light blue, blue, black, blue, light blue, cyan, white, cyan,
|
|
271
|
+
the border is green and the cost reads `$0CC1`. Measured: every pixel of
|
|
272
|
+
the 24 rows below the caption is the colour that phase gives its cell, no
|
|
273
|
+
mismatches in 61,440 pixels on either model, and the caption decodes cell
|
|
274
|
+
by cell against the char ROM. The verdict store is at cycle 4,933,399 on
|
|
275
|
+
PAL and 4,806,500 on NTSC in the `-moncommands` trace (route 2 of
|
|
276
|
+
`runtime/vice-reference.md`, "Verifying a run without a human"), which put
|
|
277
|
+
the program's first frame near 2,968,000 and 3,097,000 cycles, inside the
|
|
278
|
+
bracket the `colour-fade` recipe measured for the start of a program this
|
|
279
|
+
size.
|
|
280
|
+
|
|
281
|
+
Why that count. A shot lands in a partly drawn frame, so on a step frame a
|
|
282
|
+
count that puts the beam between the caption and the band shows the new
|
|
283
|
+
phase in the caption over the previous phase in the band. At 6,000,000 PAL
|
|
284
|
+
did exactly that, caption 2 over a band at 1; a sweep in 10,000-cycle
|
|
285
|
+
steps found 6,030,000 consistent on both models, and it is what is pinned.
|
|
286
|
+
A count that lands on a step frame with the beam inside the band would
|
|
287
|
+
tear the band itself; none of the sweep's shots did.
|
|
288
|
+
|
|
289
|
+
An earlier draft of this listing waited for line 251 with a single
|
|
290
|
+
compare loop. On a frame with no step the work after the wait is under a
|
|
291
|
+
raster line, so the loop fell straight through a second time in the same
|
|
292
|
+
line and the frame counter went up by two: the band stepped every frame,
|
|
293
|
+
not every second one, and the verdict, which counts frames, was taken
|
|
294
|
+
early. The listing now waits to leave line 251 before waiting to reach
|
|
295
|
+
it. That draft's rewrite also read `$0CE8`, 3,304 cycles, against 3,265
|
|
296
|
+
now; the two builds run the same store loop and the 39-cycle difference is
|
|
297
|
+
not established here.
|
|
298
|
+
|
|
299
|
+
Verified: assembled with KickAssembler 5.25, run in VICE x64sc 3.10 with
|
|
300
|
+
the pinned command twice on each model with byte-identical PNGs, the
|
|
301
|
+
verdict read from a `-moncommands` trace, and the PNGs checked cell by
|
|
302
|
+
cell against the palette formula.
|
|
303
|
+
|
|
304
|
+
Screenshots from the VICE runs this page describes:
|
|
305
|
+
`screenshots/colour-cycling.png` (PAL) and
|
|
306
|
+
`screenshots/colour-cycling-ntsc.png` (NTSC).
|
|
307
|
+
|
|
308
|
+
## Why this works
|
|
309
|
+
|
|
310
|
+
### The rewrite
|
|
311
|
+
|
|
312
|
+
Each band row is one `STA COLOUR + row * 40, X` loop of forty stores, ten
|
|
313
|
+
cycles a cell, unrolled over the eight rows by a `.for` at assembly time.
|
|
314
|
+
The colour comes from `palette, Y` with `Y` starting at the phase and going
|
|
315
|
+
up by one per row; the table is written twice so `phase + 7` never runs off
|
|
316
|
+
its end. Eight rows are 3,265 cycles by the CIA, about 52 raster lines.
|
|
317
|
+
Started on line 251 the rewrite ends on line 303 on PAL and on line 38 of
|
|
318
|
+
the next frame on NTSC, both before the badline that fetches row 8 on line
|
|
319
|
+
115, so the VIC never reads a half-written band. The same loop over all
|
|
320
|
+
twenty-five rows would take about 10,200 cycles (arithmetic) and cross the
|
|
321
|
+
top of the display on both models: that is the case
|
|
322
|
+
`full_field_redraw_exceeds_vblank` describes.
|
|
323
|
+
|
|
324
|
+
### The stopwatch and the verdict
|
|
325
|
+
|
|
326
|
+
CIA1 timer A is loaded with $FFFF and started on the phi2 clock just before
|
|
327
|
+
the rewrite and stopped just after it; $FFFF less the count is the cost.
|
|
328
|
+
CIA1 interrupts are masked first so the timer is only a counter. The
|
|
329
|
+
verdict has two conditions: the phase after 100 frames must be 50 steps
|
|
330
|
+
modulo eight, which is 2, and the largest cost seen must be under the
|
|
331
|
+
4,000-cycle budget. A frame counter that runs fast, as the earlier draft's
|
|
332
|
+
did, fails the first; a rewrite interrupted or stalled fails the second.
|
|
333
|
+
|
|
334
|
+
### Timing
|
|
335
|
+
|
|
336
|
+
Interrupts are off and the frame is paced by a busy-wait on line 251, the
|
|
337
|
+
first line of the lower border on both models. The wait is two loops: leave
|
|
338
|
+
the line, then reach it, because the work between waits on a frame with no
|
|
339
|
+
step is shorter than a line. The KERNAL IRQ is left off so no interrupt
|
|
340
|
+
can land inside the rewrite and push its tail into the display. Step
|
|
341
|
+
timing is in frames, so PAL and NTSC show the same phase for a given frame
|
|
342
|
+
and different phases for a given cycle count; 6,030,000 happens to give
|
|
343
|
+
both phase 5.
|