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,801 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: mouse-1351-read
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [mouse_1351_read]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D419, D41A, DC00, DC01, DC02, D012, D020, D021, DD04, DD05, DD0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Read a 1351 mouse once per frame, decode the 6-bit counter, and check the delta arithmetic
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Selects control port 1's pot lines through CIA1 port A bit 6, then for
|
|
19
|
+
250 frames waits for raster line 250 and reads the SID's POTX and POTY
|
|
20
|
+
registers once, shifting each right by one and keeping six bits, which
|
|
21
|
+
is the 1351's position counter with its noise bit dropped. It prints
|
|
22
|
+
the smallest and largest counter seen on each axis, reads the two mouse
|
|
23
|
+
buttons on the port's FIRE and UP lines, runs the signed modulo-64
|
|
24
|
+
delta arithmetic over a compiled-in table of ten counter pairs that
|
|
25
|
+
includes both wrap directions and both half-turn cases, and times one
|
|
26
|
+
call of the read routine with CIA2 timer A. It writes `$01` to `$02FF`
|
|
27
|
+
and turns the border green when every table row matches and the masked
|
|
28
|
+
counter never moved during the 250 frames, `$02` and red otherwise. The
|
|
29
|
+
technique is `mouse_1351_read` in `techniques/input.md`.
|
|
30
|
+
|
|
31
|
+
A headless VICE run cannot move the host mouse, so the counter sits at
|
|
32
|
+
one value and no movement delta is measured here. The delta arithmetic
|
|
33
|
+
is exercised on the synthetic table instead, and the page says which
|
|
34
|
+
numbers came from the run and which from the table.
|
|
35
|
+
|
|
36
|
+
## Source
|
|
37
|
+
|
|
38
|
+
```asm
|
|
39
|
+
// mouse-1351-read.asm
|
|
40
|
+
// Reads a Commodore 1351 mouse in proportional mode through the SID's
|
|
41
|
+
// POTX/POTY registers ($D419/$D41A) once per frame at a fixed raster line,
|
|
42
|
+
// decodes the 6-bit position counter in bits 1 to 6, tracks the smallest
|
|
43
|
+
// and largest counter seen over NFRAMES frames, reads the two buttons on
|
|
44
|
+
// the port's FIRE and UP lines, runs the signed modulo-64 delta arithmetic
|
|
45
|
+
// over a compiled-in table of synthetic counter pairs, times the per-frame
|
|
46
|
+
// read with a CIA2 timer, and reports a verdict at $02FF and in the border.
|
|
47
|
+
//
|
|
48
|
+
// The 1351 is on control port 1: CIA1 port A bit 6 selects that port's
|
|
49
|
+
// pots, and its switch lines are read on CIA1 port B ($DC01).
|
|
50
|
+
.encoding "screencode_upper"
|
|
51
|
+
|
|
52
|
+
.const SCREEN = $0400
|
|
53
|
+
.const COLOUR = $d800
|
|
54
|
+
.const RESULT = $02ff
|
|
55
|
+
.const SEL_PORT1 = $40
|
|
56
|
+
.const NFRAMES = 250 // frames sampled at rest
|
|
57
|
+
.const READ_LINE = $fa // raster line 250: below the text area, inside the frame
|
|
58
|
+
.const NTESTS = 10 // rows in the synthetic delta table
|
|
59
|
+
|
|
60
|
+
.const zp_val = $fb // decimal printer's value
|
|
61
|
+
.const zp_row = $fd // screen pointer for the printers
|
|
62
|
+
.const zp_lbl = $f7 // pointer into the label table
|
|
63
|
+
.const zp_min_x = $f9
|
|
64
|
+
.const zp_max_x = $fa
|
|
65
|
+
.const zp_min_y = $f5
|
|
66
|
+
.const zp_max_y = $f6
|
|
67
|
+
.const zp_frames = $f4
|
|
68
|
+
.const zp_fail = $f3
|
|
69
|
+
|
|
70
|
+
BasicUpstart2(start)
|
|
71
|
+
|
|
72
|
+
* = $0900 "code"
|
|
73
|
+
|
|
74
|
+
start:
|
|
75
|
+
sei
|
|
76
|
+
lda #$ff
|
|
77
|
+
sta $dc02 // port A all output: the pot select bits must reach the pins
|
|
78
|
+
lda #SEL_PORT1
|
|
79
|
+
sta $dc00 // bit 6: control port 1's pots reach the SID
|
|
80
|
+
lda #$00
|
|
81
|
+
sta $d020
|
|
82
|
+
sta $d021
|
|
83
|
+
sta zp_fail
|
|
84
|
+
jsr clear_screen
|
|
85
|
+
jsr draw_labels
|
|
86
|
+
|
|
87
|
+
// --- part A: NFRAMES reads at rest, one per frame at READ_LINE ------------
|
|
88
|
+
// The select was written above; the first frame boundary is more than 512
|
|
89
|
+
// cycles away, so the first read already sees port 1's conversion.
|
|
90
|
+
lda #$3f
|
|
91
|
+
sta zp_min_x
|
|
92
|
+
sta zp_min_y
|
|
93
|
+
lda #$00
|
|
94
|
+
sta zp_max_x
|
|
95
|
+
sta zp_max_y
|
|
96
|
+
lda #NFRAMES
|
|
97
|
+
sta zp_frames
|
|
98
|
+
frameloop:
|
|
99
|
+
jsr wait_read_line
|
|
100
|
+
jsr read_mouse // cur_x/cur_y = counters, dx/dy = deltas
|
|
101
|
+
lda cur_x
|
|
102
|
+
cmp zp_min_x
|
|
103
|
+
bcs !+
|
|
104
|
+
sta zp_min_x
|
|
105
|
+
!: lda cur_x
|
|
106
|
+
cmp zp_max_x
|
|
107
|
+
bcc !+
|
|
108
|
+
sta zp_max_x
|
|
109
|
+
!: lda cur_y
|
|
110
|
+
cmp zp_min_y
|
|
111
|
+
bcs !+
|
|
112
|
+
sta zp_min_y
|
|
113
|
+
!: lda cur_y
|
|
114
|
+
cmp zp_max_y
|
|
115
|
+
bcc !+
|
|
116
|
+
sta zp_max_y
|
|
117
|
+
!: dec zp_frames
|
|
118
|
+
bne frameloop
|
|
119
|
+
|
|
120
|
+
lda zp_min_x
|
|
121
|
+
ldy #5
|
|
122
|
+
ldx #14
|
|
123
|
+
jsr print_dec2
|
|
124
|
+
lda zp_max_x
|
|
125
|
+
ldy #5
|
|
126
|
+
ldx #21
|
|
127
|
+
jsr print_dec2
|
|
128
|
+
lda zp_min_y
|
|
129
|
+
ldy #6
|
|
130
|
+
ldx #14
|
|
131
|
+
jsr print_dec2
|
|
132
|
+
lda zp_max_y
|
|
133
|
+
ldy #6
|
|
134
|
+
ldx #21
|
|
135
|
+
jsr print_dec2
|
|
136
|
+
|
|
137
|
+
lda zp_min_x
|
|
138
|
+
cmp zp_max_x
|
|
139
|
+
bne restfail
|
|
140
|
+
lda zp_min_y
|
|
141
|
+
cmp zp_max_y
|
|
142
|
+
beq restok
|
|
143
|
+
restfail:
|
|
144
|
+
inc zp_fail
|
|
145
|
+
restok:
|
|
146
|
+
|
|
147
|
+
// --- part B: the buttons, on port 1's switch lines ----------------------
|
|
148
|
+
lda $dc00
|
|
149
|
+
ldy #9
|
|
150
|
+
ldx #5
|
|
151
|
+
jsr print_hex
|
|
152
|
+
lda $dc01
|
|
153
|
+
sta btn
|
|
154
|
+
ldy #9
|
|
155
|
+
ldx #13
|
|
156
|
+
jsr print_hex
|
|
157
|
+
lda btn
|
|
158
|
+
and #$10 // bit 4, FIRE: the left button
|
|
159
|
+
ldx #21
|
|
160
|
+
jsr print_updown
|
|
161
|
+
lda btn
|
|
162
|
+
and #$01 // bit 0, UP: the right button
|
|
163
|
+
ldx #32
|
|
164
|
+
jsr print_updown
|
|
165
|
+
|
|
166
|
+
// --- part C: the delta arithmetic on synthetic counter pairs -------------
|
|
167
|
+
ldx #0
|
|
168
|
+
testloop:
|
|
169
|
+
stx tidx
|
|
170
|
+
lda test_prev,x
|
|
171
|
+
sta prev_x
|
|
172
|
+
lda test_cur,x
|
|
173
|
+
sta cur_x
|
|
174
|
+
jsr delta_x // A = signed delta of cur_x against prev_x
|
|
175
|
+
sta got
|
|
176
|
+
ldx tidx
|
|
177
|
+
lda test_prev,x
|
|
178
|
+
jsr test_row_y
|
|
179
|
+
ldx #2
|
|
180
|
+
jsr print_dec2
|
|
181
|
+
ldx tidx
|
|
182
|
+
lda test_cur,x
|
|
183
|
+
jsr test_row_y
|
|
184
|
+
ldx #5
|
|
185
|
+
jsr print_dec2
|
|
186
|
+
ldx tidx
|
|
187
|
+
lda test_exp,x
|
|
188
|
+
jsr test_row_y
|
|
189
|
+
ldx #9
|
|
190
|
+
jsr print_signed
|
|
191
|
+
lda got
|
|
192
|
+
jsr test_row_y
|
|
193
|
+
ldx #14
|
|
194
|
+
jsr print_signed
|
|
195
|
+
ldx tidx
|
|
196
|
+
lda got
|
|
197
|
+
cmp test_exp,x
|
|
198
|
+
beq testok
|
|
199
|
+
inc zp_fail
|
|
200
|
+
lda #<txt_bad
|
|
201
|
+
ldy #>txt_bad
|
|
202
|
+
bne testshow
|
|
203
|
+
testok:
|
|
204
|
+
lda #<txt_ok
|
|
205
|
+
ldy #>txt_ok
|
|
206
|
+
testshow:
|
|
207
|
+
sta zp_lbl
|
|
208
|
+
sty zp_lbl+1
|
|
209
|
+
jsr test_row_y
|
|
210
|
+
ldx #19
|
|
211
|
+
jsr print_str
|
|
212
|
+
ldx tidx
|
|
213
|
+
inx
|
|
214
|
+
cpx #NTESTS
|
|
215
|
+
bne testloop
|
|
216
|
+
|
|
217
|
+
// --- part D: the cost of one read, measured with CIA2 timer A -----------
|
|
218
|
+
// Two timings: an empty section, then read_mouse. The difference is the
|
|
219
|
+
// routine's own cycles, with the start and stop stores cancelled out. Both
|
|
220
|
+
// run from READ_LINE, below the text area, so no badline steals cycles
|
|
221
|
+
// from the measurement; an earlier build that did not wait read 146.
|
|
222
|
+
// The routine costs 102 to 104 cycles by the sign of each axis's delta:
|
|
223
|
+
// a negative delta skips a branch and runs the sign-extend, one cycle
|
|
224
|
+
// more per axis. prev_x and prev_y are set to 40 against the resting 32
|
|
225
|
+
// before the timed call so both axes take the longer path; this is the
|
|
226
|
+
// worst case.
|
|
227
|
+
lda #$00
|
|
228
|
+
sta $dd0e // stop the timer while the latch is loaded
|
|
229
|
+
lda #$ff
|
|
230
|
+
sta $dd04
|
|
231
|
+
sta $dd05
|
|
232
|
+
jsr wait_read_line
|
|
233
|
+
lda #$11 // start, force load, continuous
|
|
234
|
+
sta $dd0e
|
|
235
|
+
lda #$00 // stop: the timer read is the raw baseline
|
|
236
|
+
sta $dd0e
|
|
237
|
+
sec
|
|
238
|
+
lda #$ff
|
|
239
|
+
sbc $dd04
|
|
240
|
+
sta base_lo
|
|
241
|
+
lda #$ff
|
|
242
|
+
sbc $dd05
|
|
243
|
+
sta base_hi
|
|
244
|
+
|
|
245
|
+
lda #$ff
|
|
246
|
+
sta $dd04
|
|
247
|
+
sta $dd05
|
|
248
|
+
lda #40 // force both deltas negative: worst path
|
|
249
|
+
sta prev_x
|
|
250
|
+
sta prev_y
|
|
251
|
+
jsr wait_read_line
|
|
252
|
+
lda #$11
|
|
253
|
+
sta $dd0e
|
|
254
|
+
jsr read_mouse
|
|
255
|
+
lda #$00
|
|
256
|
+
sta $dd0e
|
|
257
|
+
sec
|
|
258
|
+
lda #$ff
|
|
259
|
+
sbc $dd04
|
|
260
|
+
sta cost_lo
|
|
261
|
+
lda #$ff
|
|
262
|
+
sbc $dd05
|
|
263
|
+
sta cost_hi
|
|
264
|
+
|
|
265
|
+
sec
|
|
266
|
+
lda cost_lo
|
|
267
|
+
sbc base_lo
|
|
268
|
+
sta zp_val
|
|
269
|
+
lda cost_hi
|
|
270
|
+
sbc base_hi
|
|
271
|
+
sta zp_val+1
|
|
272
|
+
ldy #23
|
|
273
|
+
ldx #10
|
|
274
|
+
jsr print_dec3
|
|
275
|
+
|
|
276
|
+
// --- verdict --------------------------------------------------------------
|
|
277
|
+
lda zp_fail
|
|
278
|
+
bne fail
|
|
279
|
+
lda #$01
|
|
280
|
+
sta RESULT
|
|
281
|
+
lda #$05
|
|
282
|
+
sta $d020
|
|
283
|
+
lda #<txt_pass
|
|
284
|
+
ldy #>txt_pass
|
|
285
|
+
jmp verdict
|
|
286
|
+
fail:
|
|
287
|
+
lda #$02
|
|
288
|
+
sta RESULT
|
|
289
|
+
lda #$02
|
|
290
|
+
sta $d020
|
|
291
|
+
lda #<txt_fail
|
|
292
|
+
ldy #>txt_fail
|
|
293
|
+
verdict:
|
|
294
|
+
sta zp_lbl
|
|
295
|
+
sty zp_lbl+1
|
|
296
|
+
ldy #23
|
|
297
|
+
ldx #32
|
|
298
|
+
jsr print_str
|
|
299
|
+
forever:
|
|
300
|
+
jmp forever
|
|
301
|
+
|
|
302
|
+
// --- the read -------------------------------------------------------------
|
|
303
|
+
// read_mouse: one frame's read of both pots. The counter is bits 1 to 6 of
|
|
304
|
+
// the pot byte, so shift right once and keep six bits; bit 0 is noise and
|
|
305
|
+
// falls off the end. The delta is the difference modulo 64, read as signed:
|
|
306
|
+
// 0 to 31 is a move up, 32 to 63 is a move down (32 itself reads as -32).
|
|
307
|
+
read_mouse:
|
|
308
|
+
lda $d419
|
|
309
|
+
lsr
|
|
310
|
+
and #$3f
|
|
311
|
+
sta cur_x
|
|
312
|
+
jsr delta_x
|
|
313
|
+
sta dx
|
|
314
|
+
lda cur_x
|
|
315
|
+
sta prev_x
|
|
316
|
+
lda $d41a
|
|
317
|
+
lsr
|
|
318
|
+
and #$3f
|
|
319
|
+
sta cur_y
|
|
320
|
+
sec
|
|
321
|
+
sbc prev_y
|
|
322
|
+
and #$3f
|
|
323
|
+
cmp #$20
|
|
324
|
+
bcc !+
|
|
325
|
+
ora #$c0 // sign-extend a 6-bit negative to 8 bits
|
|
326
|
+
!: sta dy
|
|
327
|
+
lda cur_y
|
|
328
|
+
sta prev_y
|
|
329
|
+
rts
|
|
330
|
+
|
|
331
|
+
// delta_x: A = (cur_x - prev_x) as a signed modulo-64 delta. X, Y preserved.
|
|
332
|
+
delta_x:
|
|
333
|
+
lda cur_x
|
|
334
|
+
sec
|
|
335
|
+
sbc prev_x
|
|
336
|
+
and #$3f
|
|
337
|
+
cmp #$20
|
|
338
|
+
bcc !+
|
|
339
|
+
ora #$c0
|
|
340
|
+
!: rts
|
|
341
|
+
|
|
342
|
+
// test_row_y: Y = 12 + tidx, the screen row of the current table entry.
|
|
343
|
+
// A and X are preserved.
|
|
344
|
+
test_row_y:
|
|
345
|
+
pha
|
|
346
|
+
lda tidx
|
|
347
|
+
clc
|
|
348
|
+
adc #12
|
|
349
|
+
tay
|
|
350
|
+
pla
|
|
351
|
+
rts
|
|
352
|
+
|
|
353
|
+
// wait_read_line: spin until the raster reaches READ_LINE, having first
|
|
354
|
+
// left it, so consecutive calls land in consecutive frames.
|
|
355
|
+
wait_read_line:
|
|
356
|
+
lda #READ_LINE
|
|
357
|
+
!: cmp $d012
|
|
358
|
+
beq !-
|
|
359
|
+
!: cmp $d012
|
|
360
|
+
bne !-
|
|
361
|
+
rts
|
|
362
|
+
|
|
363
|
+
// --- printers -------------------------------------------------------------
|
|
364
|
+
// set_row: Y = row, X = column; zp_row = SCREEN + row * 40 + column.
|
|
365
|
+
set_row:
|
|
366
|
+
lda #<SCREEN
|
|
367
|
+
sta zp_row
|
|
368
|
+
lda #>SCREEN
|
|
369
|
+
sta zp_row+1
|
|
370
|
+
tya
|
|
371
|
+
beq set_row_col
|
|
372
|
+
set_row_next:
|
|
373
|
+
lda zp_row
|
|
374
|
+
clc
|
|
375
|
+
adc #40
|
|
376
|
+
sta zp_row
|
|
377
|
+
bcc set_row_dey
|
|
378
|
+
inc zp_row+1
|
|
379
|
+
set_row_dey:
|
|
380
|
+
dey
|
|
381
|
+
bne set_row_next
|
|
382
|
+
set_row_col:
|
|
383
|
+
txa
|
|
384
|
+
clc
|
|
385
|
+
adc zp_row
|
|
386
|
+
sta zp_row
|
|
387
|
+
bcc set_row_done
|
|
388
|
+
inc zp_row+1
|
|
389
|
+
set_row_done:
|
|
390
|
+
rts
|
|
391
|
+
|
|
392
|
+
// print_hex: A = byte, row Y, column X.
|
|
393
|
+
print_hex:
|
|
394
|
+
pha
|
|
395
|
+
jsr set_row
|
|
396
|
+
pla
|
|
397
|
+
pha
|
|
398
|
+
lsr
|
|
399
|
+
lsr
|
|
400
|
+
lsr
|
|
401
|
+
lsr
|
|
402
|
+
tax
|
|
403
|
+
lda hexdigits,x
|
|
404
|
+
ldy #0
|
|
405
|
+
sta (zp_row),y
|
|
406
|
+
pla
|
|
407
|
+
and #$0f
|
|
408
|
+
tax
|
|
409
|
+
lda hexdigits,x
|
|
410
|
+
iny
|
|
411
|
+
sta (zp_row),y
|
|
412
|
+
rts
|
|
413
|
+
|
|
414
|
+
// print_dec2: A = 0..99, row Y, column X: two digits, leading zero.
|
|
415
|
+
print_dec2:
|
|
416
|
+
pha
|
|
417
|
+
jsr set_row
|
|
418
|
+
pla
|
|
419
|
+
ldx #0
|
|
420
|
+
!: cmp #10
|
|
421
|
+
bcc !+
|
|
422
|
+
sbc #10
|
|
423
|
+
inx
|
|
424
|
+
bne !-
|
|
425
|
+
!: pha
|
|
426
|
+
txa
|
|
427
|
+
ora #$30
|
|
428
|
+
ldy #0
|
|
429
|
+
sta (zp_row),y
|
|
430
|
+
pla
|
|
431
|
+
ora #$30
|
|
432
|
+
iny
|
|
433
|
+
sta (zp_row),y
|
|
434
|
+
rts
|
|
435
|
+
|
|
436
|
+
// print_signed: A = signed byte -99..99, row Y, column X: sign then two digits.
|
|
437
|
+
print_signed:
|
|
438
|
+
pha
|
|
439
|
+
jsr set_row
|
|
440
|
+
pla
|
|
441
|
+
bmi !+
|
|
442
|
+
ldy #0
|
|
443
|
+
pha
|
|
444
|
+
lda #$2b // '+'
|
|
445
|
+
sta (zp_row),y
|
|
446
|
+
pla
|
|
447
|
+
jmp !++
|
|
448
|
+
!: eor #$ff
|
|
449
|
+
clc
|
|
450
|
+
adc #1
|
|
451
|
+
pha
|
|
452
|
+
lda #$2d // '-'
|
|
453
|
+
ldy #0
|
|
454
|
+
sta (zp_row),y
|
|
455
|
+
pla
|
|
456
|
+
!: inc zp_row
|
|
457
|
+
bne !+
|
|
458
|
+
inc zp_row+1
|
|
459
|
+
!: ldx #0
|
|
460
|
+
!: cmp #10
|
|
461
|
+
bcc !+
|
|
462
|
+
sbc #10
|
|
463
|
+
inx
|
|
464
|
+
bne !-
|
|
465
|
+
!: pha
|
|
466
|
+
txa
|
|
467
|
+
ora #$30
|
|
468
|
+
ldy #0
|
|
469
|
+
sta (zp_row),y
|
|
470
|
+
pla
|
|
471
|
+
ora #$30
|
|
472
|
+
iny
|
|
473
|
+
sta (zp_row),y
|
|
474
|
+
rts
|
|
475
|
+
|
|
476
|
+
// print_dec3: zp_val = 16-bit value 0..999, row Y, column X: three digits.
|
|
477
|
+
print_dec3:
|
|
478
|
+
jsr set_row
|
|
479
|
+
ldy #0
|
|
480
|
+
ldx #0
|
|
481
|
+
!: lda zp_val
|
|
482
|
+
sec
|
|
483
|
+
sbc #100
|
|
484
|
+
sta zp_val
|
|
485
|
+
lda zp_val+1
|
|
486
|
+
sbc #0
|
|
487
|
+
sta zp_val+1
|
|
488
|
+
bmi !+
|
|
489
|
+
inx
|
|
490
|
+
bne !-
|
|
491
|
+
!: lda zp_val
|
|
492
|
+
clc
|
|
493
|
+
adc #100
|
|
494
|
+
sta zp_val
|
|
495
|
+
txa
|
|
496
|
+
ora #$30
|
|
497
|
+
sta (zp_row),y
|
|
498
|
+
iny
|
|
499
|
+
lda zp_val
|
|
500
|
+
ldx #0
|
|
501
|
+
!: cmp #10
|
|
502
|
+
bcc !+
|
|
503
|
+
sbc #10
|
|
504
|
+
inx
|
|
505
|
+
bne !-
|
|
506
|
+
!: pha
|
|
507
|
+
txa
|
|
508
|
+
ora #$30
|
|
509
|
+
sta (zp_row),y
|
|
510
|
+
iny
|
|
511
|
+
pla
|
|
512
|
+
ora #$30
|
|
513
|
+
sta (zp_row),y
|
|
514
|
+
rts
|
|
515
|
+
|
|
516
|
+
// print_updown: A = masked switch bit, column X, on row 9: "UP" if the
|
|
517
|
+
// line reads high (not pressed), "DOWN" if it reads low.
|
|
518
|
+
print_updown:
|
|
519
|
+
cmp #0
|
|
520
|
+
beq updown_low
|
|
521
|
+
lda #<txt_up
|
|
522
|
+
ldy #>txt_up
|
|
523
|
+
bne updown_show
|
|
524
|
+
updown_low:
|
|
525
|
+
lda #<txt_down
|
|
526
|
+
ldy #>txt_down
|
|
527
|
+
updown_show:
|
|
528
|
+
sta zp_lbl
|
|
529
|
+
sty zp_lbl+1
|
|
530
|
+
ldy #9
|
|
531
|
+
// falls into print_str
|
|
532
|
+
|
|
533
|
+
// print_str: zp_lbl -> zero-terminated screen-code text, row Y, column X.
|
|
534
|
+
print_str:
|
|
535
|
+
jsr set_row
|
|
536
|
+
ldy #0
|
|
537
|
+
!: lda (zp_lbl),y
|
|
538
|
+
beq !+
|
|
539
|
+
sta (zp_row),y
|
|
540
|
+
iny
|
|
541
|
+
bne !-
|
|
542
|
+
!: rts
|
|
543
|
+
|
|
544
|
+
clear_screen:
|
|
545
|
+
ldx #0
|
|
546
|
+
lda #$20
|
|
547
|
+
!: sta SCREEN,x
|
|
548
|
+
sta SCREEN+$100,x
|
|
549
|
+
sta SCREEN+$200,x
|
|
550
|
+
sta SCREEN+$300,x
|
|
551
|
+
inx
|
|
552
|
+
bne !-
|
|
553
|
+
ldx #0
|
|
554
|
+
lda #$0e // light blue ink
|
|
555
|
+
!: sta COLOUR,x
|
|
556
|
+
sta COLOUR+$100,x
|
|
557
|
+
sta COLOUR+$200,x
|
|
558
|
+
sta COLOUR+$300,x
|
|
559
|
+
inx
|
|
560
|
+
bne !-
|
|
561
|
+
rts
|
|
562
|
+
|
|
563
|
+
// draw_labels: entries of row, column, text, 0; the list ends with row $FF.
|
|
564
|
+
draw_labels:
|
|
565
|
+
lda #<labels
|
|
566
|
+
sta zp_lbl
|
|
567
|
+
lda #>labels
|
|
568
|
+
sta zp_lbl+1
|
|
569
|
+
labels_next:
|
|
570
|
+
ldy #0
|
|
571
|
+
lda (zp_lbl),y
|
|
572
|
+
cmp #$ff
|
|
573
|
+
beq labels_done
|
|
574
|
+
pha
|
|
575
|
+
iny
|
|
576
|
+
lda (zp_lbl),y
|
|
577
|
+
tax
|
|
578
|
+
pla
|
|
579
|
+
tay
|
|
580
|
+
jsr set_row
|
|
581
|
+
lda zp_lbl
|
|
582
|
+
clc
|
|
583
|
+
adc #2
|
|
584
|
+
sta zp_lbl
|
|
585
|
+
bcc labels_text
|
|
586
|
+
inc zp_lbl+1
|
|
587
|
+
labels_text:
|
|
588
|
+
ldy #0
|
|
589
|
+
labels_char:
|
|
590
|
+
lda (zp_lbl),y
|
|
591
|
+
beq labels_skip
|
|
592
|
+
sta (zp_row),y
|
|
593
|
+
iny
|
|
594
|
+
bne labels_char
|
|
595
|
+
labels_skip:
|
|
596
|
+
tya // Y = text length; step past it and its zero
|
|
597
|
+
sec
|
|
598
|
+
adc zp_lbl
|
|
599
|
+
sta zp_lbl
|
|
600
|
+
bcc labels_next
|
|
601
|
+
inc zp_lbl+1
|
|
602
|
+
jmp labels_next
|
|
603
|
+
labels_done:
|
|
604
|
+
rts
|
|
605
|
+
|
|
606
|
+
// --- data -----------------------------------------------------------------
|
|
607
|
+
hexdigits: .text "0123456789ABCDEF"
|
|
608
|
+
txt_ok: .text "OK"
|
|
609
|
+
.byte 0
|
|
610
|
+
txt_bad: .text "BAD"
|
|
611
|
+
.byte 0
|
|
612
|
+
txt_up: .text "UP "
|
|
613
|
+
.byte 0
|
|
614
|
+
txt_down: .text "DOWN"
|
|
615
|
+
.byte 0
|
|
616
|
+
txt_pass: .text "PASS"
|
|
617
|
+
.byte 0
|
|
618
|
+
txt_fail: .text "FAIL"
|
|
619
|
+
.byte 0
|
|
620
|
+
|
|
621
|
+
// The synthetic table: previous counter, current counter, expected delta.
|
|
622
|
+
// Rows 2 and 3 cross the 63/0 wrap; rows 7 and 8 are the two ambiguous
|
|
623
|
+
// half-turn cases, which this convention reads as -32.
|
|
624
|
+
test_prev: .byte 32, 32, 63, 0, 32, 32, 10, 10, 40, 50
|
|
625
|
+
test_cur: .byte 33, 31, 0, 63, 40, 25, 41, 42, 8, 20
|
|
626
|
+
test_exp: .byte 1, -1, 1, -1, 8, -7, 31, -32, -32, -30
|
|
627
|
+
|
|
628
|
+
labels:
|
|
629
|
+
.byte 0, 0
|
|
630
|
+
.text "1351 MOUSE READ POTX/POTY 6-BIT COUNTER"
|
|
631
|
+
.byte 0
|
|
632
|
+
.byte 2, 0
|
|
633
|
+
.text "PORT 1 SELECTED (DC00 BIT 6), IRQ OFF"
|
|
634
|
+
.byte 0
|
|
635
|
+
.byte 3, 0
|
|
636
|
+
.text "250 FRAMES, ONE READ AT RASTER LINE 250"
|
|
637
|
+
.byte 0
|
|
638
|
+
.byte 5, 0
|
|
639
|
+
.text "X COUNTER MIN= MAX= (D419 >> 1)"
|
|
640
|
+
.byte 0
|
|
641
|
+
.byte 6, 0
|
|
642
|
+
.text "Y COUNTER MIN= MAX= (D41A >> 1)"
|
|
643
|
+
.byte 0
|
|
644
|
+
.byte 7, 0
|
|
645
|
+
.text "BITS 1-6 ONLY; BIT 0 IS NOISE, DROPPED"
|
|
646
|
+
.byte 0
|
|
647
|
+
.byte 9, 0
|
|
648
|
+
.text "DC00= DC01= LEFT= RIGHT="
|
|
649
|
+
.byte 0
|
|
650
|
+
.byte 11, 0
|
|
651
|
+
.text " PREV CUR EXP GOT (SIGNED MOD 64)"
|
|
652
|
+
.byte 0
|
|
653
|
+
.byte 23, 0
|
|
654
|
+
.text "READ COST CYCLES RESULT:"
|
|
655
|
+
.byte 0
|
|
656
|
+
.byte $ff
|
|
657
|
+
|
|
658
|
+
btn: .byte 0
|
|
659
|
+
tidx: .byte 0
|
|
660
|
+
got: .byte 0
|
|
661
|
+
cur_x: .byte 0
|
|
662
|
+
cur_y: .byte 0
|
|
663
|
+
prev_x: .byte 0
|
|
664
|
+
prev_y: .byte 0
|
|
665
|
+
dx: .byte 0
|
|
666
|
+
dy: .byte 0
|
|
667
|
+
base_lo: .byte 0
|
|
668
|
+
base_hi: .byte 0
|
|
669
|
+
cost_lo: .byte 0
|
|
670
|
+
cost_hi: .byte 0
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
## Build
|
|
674
|
+
|
|
675
|
+
```bash
|
|
676
|
+
java -jar $KICKASS_JAR mouse-1351-read.asm -o mouse-1351-read.prg
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
KickAssembler 5.25 produces a 1,604-byte PRG; the code segment runs
|
|
680
|
+
`$0900` to `$0E42`.
|
|
681
|
+
|
|
682
|
+
Pinned VICE run (both models, `docs/recipes/runs.json`):
|
|
683
|
+
|
|
684
|
+
```bash
|
|
685
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas \
|
|
686
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
687
|
+
-limitcycles 8000000 -controlport1device 3 \
|
|
688
|
+
-exitscreenshot mouse-1351-read.png -autostart mouse-1351-read.prg
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
Add `-model ntsc` for the second picture. `-controlport1device 3` is
|
|
692
|
+
VICE's 1351 mouse on control port 1 (the number is from `x64sc -help`,
|
|
693
|
+
VICE 3.10). Nothing is attached to port 2.
|
|
694
|
+
|
|
695
|
+
## Expected output
|
|
696
|
+
|
|
697
|
+
Green border, black background, light blue text. The screen is:
|
|
698
|
+
|
|
699
|
+
```text
|
|
700
|
+
row 0 1351 MOUSE READ POTX/POTY 6-BIT COUNTER
|
|
701
|
+
row 2 PORT 1 SELECTED (DC00 BIT 6), IRQ OFF
|
|
702
|
+
row 3 250 FRAMES, ONE READ AT RASTER LINE 250
|
|
703
|
+
row 5 X COUNTER MIN=32 MAX=32 (D419 >> 1)
|
|
704
|
+
row 6 Y COUNTER MIN=32 MAX=32 (D41A >> 1)
|
|
705
|
+
row 7 BITS 1-6 ONLY; BIT 0 IS NOISE, DROPPED
|
|
706
|
+
row 9 DC00=40 DC01=FF LEFT=UP RIGHT=UP
|
|
707
|
+
row 11 PREV CUR EXP GOT (SIGNED MOD 64)
|
|
708
|
+
row 12 32 33 +01 +01 OK
|
|
709
|
+
row 13 32 31 -01 -01 OK
|
|
710
|
+
row 14 63 00 +01 +01 OK
|
|
711
|
+
row 15 00 63 -01 -01 OK
|
|
712
|
+
row 16 32 40 +08 +08 OK
|
|
713
|
+
row 17 32 25 -07 -07 OK
|
|
714
|
+
row 18 10 41 +31 +31 OK
|
|
715
|
+
row 19 10 42 -32 -32 OK
|
|
716
|
+
row 20 40 08 -32 -32 OK
|
|
717
|
+
row 21 50 20 -30 -30 OK
|
|
718
|
+
row 23 READ COST 104 CYCLES RESULT: PASS
|
|
719
|
+
```
|
|
720
|
+
|
|
721
|
+
`recipes/kickassembler/screenshots/mouse-1351-read.png` (PAL, 384 by
|
|
722
|
+
272) and `mouse-1351-read-ntsc.png` (NTSC, 384 by 247) were each
|
|
723
|
+
produced twice by the pinned command with identical bytes, and decoded
|
|
724
|
+
by matching every 8 by 8 cell against `chargen-901225-01.bin` (measured
|
|
725
|
+
in VICE x64sc 3.10, rung 1). Every row is the same on both models.
|
|
726
|
+
|
|
727
|
+
What each line shows:
|
|
728
|
+
|
|
729
|
+
- Rows 5 and 6: over 250 frames the masked counter on each axis was 32
|
|
730
|
+
on every read, on both models. The raw byte is `$40` or `$41`: a
|
|
731
|
+
diagnostic build of this listing that also counted the raw bit 0 saw
|
|
732
|
+
it set in 128, 112 and 112 of the 250 frames across three PAL runs,
|
|
733
|
+
and the raw X byte change between one frame and the next 112 and 134
|
|
734
|
+
times. Bit 0 is noise, and it is noise from frame to frame within a
|
|
735
|
+
run, not just between runs; the shift drops it, and the picture never
|
|
736
|
+
shows it, which is why two runs match. The value 32 is VICE's resting
|
|
737
|
+
counter and says nothing about where a real mouse's counter starts.
|
|
738
|
+
- Row 9: `$DC00` reads back `$40`, the select bit on an output pin.
|
|
739
|
+
`$DC01` is port 1's switch byte and reads `$FF`: bit 4 (FIRE) is the
|
|
740
|
+
left button and bit 0 (UP) is the right button, both high, neither
|
|
741
|
+
pressed. That the buttons ride those two lines is from the 1351's
|
|
742
|
+
documentation and is not measured here, since a headless run cannot
|
|
743
|
+
press one.
|
|
744
|
+
- Rows 12 to 21: the delta table. Each row is a previous counter, a
|
|
745
|
+
current counter, the expected delta and the delta `delta_x` computed;
|
|
746
|
+
`OK` when they match. Rows 14 and 15 cross the 63 to 0 wrap in each
|
|
747
|
+
direction and come out as one step. Rows 19 and 20 are the two
|
|
748
|
+
half-turn cases, a difference of exactly 32 modulo 64, which this
|
|
749
|
+
convention reads as -32; a program that wants +32 there changes the
|
|
750
|
+
compare from `#$20` to `#$21`. The table is compiled in, so these
|
|
751
|
+
rows would be the same with no mouse attached.
|
|
752
|
+
- Row 23: one call of `read_mouse`, both axes with their deltas,
|
|
753
|
+
measured as the difference between two CIA2 timer A readings, one
|
|
754
|
+
around an empty section and one around the call, both started on
|
|
755
|
+
raster line 250. 104 cycles including the `jsr` and `rts`. The cost
|
|
756
|
+
depends on the sign of each axis's delta: a delta of 0 to +31 takes
|
|
757
|
+
the `bcc` (3 cycles) and a negative delta falls through it and runs
|
|
758
|
+
the `ora` (2 plus 2), one cycle more per axis. The instruction count
|
|
759
|
+
is 102 with both deltas non-negative, 103 with one negative and 104
|
|
760
|
+
with both negative; the listing sets `prev_x` and `prev_y` to 40
|
|
761
|
+
against the resting counter of 32 just before the timed call, so the
|
|
762
|
+
figure is the worst case. An earlier build did not wait for line 250
|
|
763
|
+
before timing and read 146: the extra 42 were a badline inside the
|
|
764
|
+
measurement.
|
|
765
|
+
|
|
766
|
+
The pass needs all ten table rows to match and the minimum and maximum
|
|
767
|
+
counter on each axis to be equal.
|
|
768
|
+
|
|
769
|
+
## Why this works
|
|
770
|
+
|
|
771
|
+
The select is a plain write of `$40` to `$DC00` with the direction
|
|
772
|
+
register at `$FF`, the same select `paddle-read.md` uses for port 1,
|
|
773
|
+
and after it the SID converts port 1's pot voltages every 512 cycles
|
|
774
|
+
(measured in `paddle-read.md`). `$40` also drives keyboard columns 0
|
|
775
|
+
to 5 and 7 low, which is harmless here with interrupts off and no key
|
|
776
|
+
held; a game that reads the keyboard too selects with `$7F`, as the
|
|
777
|
+
technique page explains. The 1351 in proportional mode drives the
|
|
778
|
+
port's two pot lines itself: each pot register, once settled, holds the
|
|
779
|
+
mouse's own 6-bit position counter in bits 1 to 6, with bit 0 carrying
|
|
780
|
+
no information. `lsr` then `and #$3f` is the whole decode.
|
|
781
|
+
|
|
782
|
+
Position is only useful as a difference. `cur - prev` modulo 64 is a
|
|
783
|
+
number 0 to 63; the routine reads 0 to 31 as a move in the positive
|
|
784
|
+
direction and 32 to 63 as a move in the negative direction, and turns
|
|
785
|
+
the second half into a signed byte by setting the top two bits, which
|
|
786
|
+
is what `ora #$c0` does after `and #$3f`. That reading is correct as
|
|
787
|
+
long as the counter moves fewer than 32 steps between two reads, and
|
|
788
|
+
the frame is chosen as the read interval on that ground; how far a real
|
|
789
|
+
mouse moves in one frame is not measured here.
|
|
790
|
+
|
|
791
|
+
The read is taken at a fixed raster line with interrupts off. The SID
|
|
792
|
+
holds the last finished conversion, so the read itself can fall
|
|
793
|
+
anywhere; what must not happen is a change of the select bits in the
|
|
794
|
+
512 cycles before it. The KERNAL's SCNKEY writes column patterns to
|
|
795
|
+
`$DC00` from the jiffy IRQ and changes bit 6 as it goes, so a program
|
|
796
|
+
that keeps the KERNAL IRQ either brackets its read with `SEI` and `CLI`
|
|
797
|
+
far enough after the scan, or reads on a raster line the scan never
|
|
798
|
+
reaches; `paddle-read.md` measures what happens otherwise. The cost
|
|
799
|
+
measurement is gated to the same line for a different reason, which
|
|
800
|
+
row 23's history shows: a badline in the window adds its stolen cycles
|
|
801
|
+
to the figure.
|