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,751 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: paddle-read
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [paddle_read]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D419, D41A, DC00, DC01, DC02, D020, D021]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Read the paddles on both ports, time the settle, and catch the keyboard scan
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Selects each control port in turn through CIA1 port A bits 6 and 7,
|
|
19
|
+
reads the SID's POTX and POTY registers after a long wait and prints the
|
|
20
|
+
four results; then switches from port 2 to port 1 and reads `$D419`
|
|
21
|
+
every 8 cycles across the switch, at eight different phases, to show how
|
|
22
|
+
long the value takes to settle; then runs 2,000 select-wait-read passes
|
|
23
|
+
with the KERNAL jiffy IRQ live and again under `SEI`, counting the reads
|
|
24
|
+
that did not return port 2's value. It writes `$01` to `$02FF` and turns
|
|
25
|
+
the border green when every phase's settle is inside the page's window
|
|
26
|
+
and ten further reads of port 2 agree, `$02` and red otherwise. The
|
|
27
|
+
technique is `paddle_read` in `techniques/input.md`.
|
|
28
|
+
|
|
29
|
+
A headless VICE run has no host mouse to move, so its paddles sit at
|
|
30
|
+
one value, and that value is `$FF`, the same as an empty port. The run
|
|
31
|
+
therefore attaches a 1351 mouse to port 1 as a pot source that reads
|
|
32
|
+
something other than `$FF`, and paddles to port 2. The code is the same
|
|
33
|
+
code a paddle game runs; only the source of the voltage differs.
|
|
34
|
+
|
|
35
|
+
## Source
|
|
36
|
+
|
|
37
|
+
```asm
|
|
38
|
+
// paddle-read.asm
|
|
39
|
+
// Reads the SID paddle registers POTX/POTY ($D419/$D41A) for both control
|
|
40
|
+
// ports through the CIA1 port A select bits, measures how many cycles the
|
|
41
|
+
// value takes to settle after the select changes, shows what the KERNAL
|
|
42
|
+
// keyboard scan does to a read taken with the jiffy IRQ live, and reports
|
|
43
|
+
// a verdict at $02FF and in the border colour.
|
|
44
|
+
//
|
|
45
|
+
// The select: $DC00 bit 6 set = control port 1, bit 7 set = control port 2.
|
|
46
|
+
// DDR A must be $FF for the write to reach the pins (IOINIT leaves it so).
|
|
47
|
+
.encoding "screencode_upper"
|
|
48
|
+
|
|
49
|
+
.const SCREEN = $0400
|
|
50
|
+
.const RESULT = $02ff
|
|
51
|
+
.const SEL_NONE = $00
|
|
52
|
+
.const SEL_PORT1 = $40
|
|
53
|
+
.const SEL_PORT2 = $80
|
|
54
|
+
.const SEL_BOTH = $c0
|
|
55
|
+
.const NSAMPLES = 140 // unrolled reads, 8 cycles apart: 1,116 cycles of window
|
|
56
|
+
.const NPHASES = 8 // the switch is repeated at eight phases, 65 cycles apart
|
|
57
|
+
.const SETTLE_LO = 448 // pass window for the rounded settle, in cycles
|
|
58
|
+
.const SETTLE_HI = 544
|
|
59
|
+
.const IRQ_LOOPS = 2000 // select-wait-read passes with the IRQ live
|
|
60
|
+
|
|
61
|
+
.const zp_ptr = $fb // 16-bit scratch: cycles, then the decimal printer's value
|
|
62
|
+
.const zp_tmp = $fd
|
|
63
|
+
.const zp_row = $f7 // screen pointer for the printers
|
|
64
|
+
.const zp_saved_y = $f9
|
|
65
|
+
.const idx = $fa
|
|
66
|
+
.const zp_lbl = $f5 // pointer into the label table
|
|
67
|
+
|
|
68
|
+
BasicUpstart2(start)
|
|
69
|
+
|
|
70
|
+
* = $0900 "code"
|
|
71
|
+
|
|
72
|
+
start:
|
|
73
|
+
sei
|
|
74
|
+
lda #$ff
|
|
75
|
+
sta $dc02 // port A all output: keyboard columns and the paddle select
|
|
76
|
+
lda #$00
|
|
77
|
+
sta $d020
|
|
78
|
+
sta $d021
|
|
79
|
+
jsr clear_screen
|
|
80
|
+
jsr draw_labels
|
|
81
|
+
|
|
82
|
+
// --- part A: the settled value for each of the four select patterns -----
|
|
83
|
+
ldx #0
|
|
84
|
+
partA:
|
|
85
|
+
lda sel_table,x
|
|
86
|
+
sta $dc00
|
|
87
|
+
jsr wait_2k // far longer than the settle
|
|
88
|
+
lda $d419
|
|
89
|
+
and #$fe // a 1351's pot line flickers bit 0 in VICE; mask it so two runs match
|
|
90
|
+
sta potx_val,x
|
|
91
|
+
lda $d41a
|
|
92
|
+
and #$fe
|
|
93
|
+
sta poty_val,x
|
|
94
|
+
inx
|
|
95
|
+
cpx #4
|
|
96
|
+
bne partA
|
|
97
|
+
|
|
98
|
+
ldx #0
|
|
99
|
+
showA:
|
|
100
|
+
stx idx
|
|
101
|
+
lda potx_val,x
|
|
102
|
+
ldy row_a,x
|
|
103
|
+
ldx #16
|
|
104
|
+
jsr print_hex
|
|
105
|
+
ldx idx
|
|
106
|
+
lda poty_val,x
|
|
107
|
+
ldy row_a,x
|
|
108
|
+
ldx #21
|
|
109
|
+
jsr print_hex
|
|
110
|
+
ldx idx
|
|
111
|
+
inx
|
|
112
|
+
cpx #4
|
|
113
|
+
bne showA
|
|
114
|
+
|
|
115
|
+
// buttons: the paddle buttons are the LEFT and RIGHT lines of each port
|
|
116
|
+
lda #SEL_PORT2
|
|
117
|
+
sta $dc00
|
|
118
|
+
lda $dc00
|
|
119
|
+
ldy #7
|
|
120
|
+
ldx #13
|
|
121
|
+
jsr print_hex
|
|
122
|
+
lda $dc01
|
|
123
|
+
ldy #7
|
|
124
|
+
ldx #21
|
|
125
|
+
jsr print_hex
|
|
126
|
+
|
|
127
|
+
// --- part B: the settle, sampled every 8 cycles across the switch ------
|
|
128
|
+
// Port 2 is left selected for a while, then port 1 is selected and $D419 is
|
|
129
|
+
// read every 8 cycles. The whole thing is repeated at eight phases, each 65
|
|
130
|
+
// cycles later than the last, because the SID's conversion runs on its own
|
|
131
|
+
// clock and the settle depends on where in that cycle the select lands.
|
|
132
|
+
ldx #0
|
|
133
|
+
phase_loop:
|
|
134
|
+
stx idx
|
|
135
|
+
lda #SEL_PORT2
|
|
136
|
+
sta $dc00
|
|
137
|
+
jsr wait_2k
|
|
138
|
+
ldx idx
|
|
139
|
+
jsr delay_phase // idx * 65 cycles
|
|
140
|
+
jsr sample_switch // selects port 1, fills buf
|
|
141
|
+
lda #<buf
|
|
142
|
+
sta zp_ptr
|
|
143
|
+
lda #>buf
|
|
144
|
+
sta zp_ptr + 1
|
|
145
|
+
jsr find_settle
|
|
146
|
+
ldx idx
|
|
147
|
+
sta settle_k,x
|
|
148
|
+
jsr settle_to_cycles
|
|
149
|
+
lda idx
|
|
150
|
+
asl
|
|
151
|
+
asl
|
|
152
|
+
adc idx // column = 5 * idx
|
|
153
|
+
tax
|
|
154
|
+
ldy #10
|
|
155
|
+
jsr print_dec4
|
|
156
|
+
ldx idx
|
|
157
|
+
inx
|
|
158
|
+
cpx #NPHASES
|
|
159
|
+
bne phase_loop
|
|
160
|
+
|
|
161
|
+
// --- part C: the jiffy IRQ's SCNKEY versus a select-then-read --------------
|
|
162
|
+
// Unguarded: select port 2, wait about 530 cycles, read. The IRQ can land in
|
|
163
|
+
// the wait and leave $DC00 at $7F, which is port 1. Guarded: the same under SEI.
|
|
164
|
+
lda #0
|
|
165
|
+
sta bad_free
|
|
166
|
+
sta bad_free + 1
|
|
167
|
+
sta bad_sei
|
|
168
|
+
sta bad_sei + 1
|
|
169
|
+
lda #$ff
|
|
170
|
+
sta $dc00 // every column high before the KERNAL scan runs again
|
|
171
|
+
cli
|
|
172
|
+
|
|
173
|
+
lda #<IRQ_LOOPS
|
|
174
|
+
sta loops
|
|
175
|
+
lda #>IRQ_LOOPS
|
|
176
|
+
sta loops + 1
|
|
177
|
+
loopC1:
|
|
178
|
+
lda #SEL_PORT2
|
|
179
|
+
sta $dc00
|
|
180
|
+
jsr wait_530
|
|
181
|
+
lda $d419
|
|
182
|
+
and #$fe
|
|
183
|
+
cmp potx_val + 2 // the settled port 2 value from part A
|
|
184
|
+
beq !+
|
|
185
|
+
inc bad_free
|
|
186
|
+
bne !+
|
|
187
|
+
inc bad_free + 1
|
|
188
|
+
!: jsr dec_loops
|
|
189
|
+
bne loopC1
|
|
190
|
+
|
|
191
|
+
lda #<IRQ_LOOPS
|
|
192
|
+
sta loops
|
|
193
|
+
lda #>IRQ_LOOPS
|
|
194
|
+
sta loops + 1
|
|
195
|
+
loopC2:
|
|
196
|
+
sei
|
|
197
|
+
lda #SEL_PORT2
|
|
198
|
+
sta $dc00
|
|
199
|
+
jsr wait_530
|
|
200
|
+
lda $d419
|
|
201
|
+
cli
|
|
202
|
+
and #$fe
|
|
203
|
+
cmp potx_val + 2
|
|
204
|
+
beq !+
|
|
205
|
+
inc bad_sei
|
|
206
|
+
bne !+
|
|
207
|
+
inc bad_sei + 1
|
|
208
|
+
!: jsr dec_loops
|
|
209
|
+
bne loopC2
|
|
210
|
+
sei
|
|
211
|
+
|
|
212
|
+
lda bad_free
|
|
213
|
+
and #$f0 // shown rounded down to 16: the exact count moves by one between runs
|
|
214
|
+
sta zp_ptr
|
|
215
|
+
lda bad_free + 1
|
|
216
|
+
sta zp_ptr + 1
|
|
217
|
+
ldy #14
|
|
218
|
+
ldx #31
|
|
219
|
+
jsr print_dec
|
|
220
|
+
lda bad_sei
|
|
221
|
+
sta zp_ptr
|
|
222
|
+
lda bad_sei + 1
|
|
223
|
+
sta zp_ptr + 1
|
|
224
|
+
ldy #15
|
|
225
|
+
ldx #31
|
|
226
|
+
jsr print_dec
|
|
227
|
+
|
|
228
|
+
// --- stability: ten reads of port 2, each after a fresh select and wait ---
|
|
229
|
+
lda #0
|
|
230
|
+
sta unstable
|
|
231
|
+
ldx #10
|
|
232
|
+
!: lda #SEL_PORT2
|
|
233
|
+
sta $dc00
|
|
234
|
+
jsr wait_2k
|
|
235
|
+
lda $d419
|
|
236
|
+
and #$fe
|
|
237
|
+
cmp potx_val + 2
|
|
238
|
+
beq !+
|
|
239
|
+
inc unstable
|
|
240
|
+
!: dex
|
|
241
|
+
bne !--
|
|
242
|
+
|
|
243
|
+
// --- verdict ---------------------------------------------------------------
|
|
244
|
+
lda #2 // assume FAIL
|
|
245
|
+
sta verdict
|
|
246
|
+
lda unstable
|
|
247
|
+
bne decide
|
|
248
|
+
lda bad_sei
|
|
249
|
+
ora bad_sei + 1
|
|
250
|
+
bne decide
|
|
251
|
+
ldx #0
|
|
252
|
+
check_phase:
|
|
253
|
+
stx idx
|
|
254
|
+
lda settle_k,x
|
|
255
|
+
jsr settle_to_cycles
|
|
256
|
+
jsr in_window
|
|
257
|
+
bcc decide
|
|
258
|
+
ldx idx
|
|
259
|
+
inx
|
|
260
|
+
cpx #NPHASES
|
|
261
|
+
bne check_phase
|
|
262
|
+
lda #1
|
|
263
|
+
sta verdict
|
|
264
|
+
decide:
|
|
265
|
+
lda verdict
|
|
266
|
+
sta RESULT
|
|
267
|
+
cmp #1
|
|
268
|
+
beq pass
|
|
269
|
+
lda #2 // red border
|
|
270
|
+
sta $d020
|
|
271
|
+
ldy #18
|
|
272
|
+
ldx #8
|
|
273
|
+
jsr print_fail
|
|
274
|
+
jmp halt
|
|
275
|
+
pass:
|
|
276
|
+
lda #5 // green border
|
|
277
|
+
sta $d020
|
|
278
|
+
ldy #18
|
|
279
|
+
ldx #8
|
|
280
|
+
jsr print_pass
|
|
281
|
+
halt:
|
|
282
|
+
jmp halt
|
|
283
|
+
|
|
284
|
+
// --- subroutines -----------------------------------------------------------
|
|
285
|
+
|
|
286
|
+
// sample_switch: select control port 1 and read $D419 every 8 cycles into buf.
|
|
287
|
+
// Sample i is read 4 + 8 * i cycles after the write cycle of the select store.
|
|
288
|
+
sample_switch:
|
|
289
|
+
lda #SEL_PORT1
|
|
290
|
+
sta $dc00 // cycle 0 is the write cycle of this store
|
|
291
|
+
.for (var i = 0; i < NSAMPLES; i++) {
|
|
292
|
+
lda $d419 // the read is on this instruction's 4th cycle
|
|
293
|
+
sta buf + i
|
|
294
|
+
}
|
|
295
|
+
rts
|
|
296
|
+
|
|
297
|
+
// delay_phase: X * 65 cycles (arithmetic: ldy 2 + 11 * 5 - 1 + dex 2 + jmp 3 +
|
|
298
|
+
// cpx 2 + beq 2 per step). X = 0 costs the compare and branch only.
|
|
299
|
+
delay_phase:
|
|
300
|
+
cpx #0
|
|
301
|
+
beq delay_done
|
|
302
|
+
ldy #11
|
|
303
|
+
delay_inner:
|
|
304
|
+
dey
|
|
305
|
+
bne delay_inner
|
|
306
|
+
dex
|
|
307
|
+
jmp delay_phase
|
|
308
|
+
delay_done:
|
|
309
|
+
rts
|
|
310
|
+
|
|
311
|
+
// find_settle: zp_ptr -> NSAMPLES bytes. Returns in A the lowest index i such
|
|
312
|
+
// that every sample from i to the last equals the last sample.
|
|
313
|
+
find_settle:
|
|
314
|
+
ldy #NSAMPLES - 1
|
|
315
|
+
lda (zp_ptr),y
|
|
316
|
+
sta zp_tmp // the final value
|
|
317
|
+
!: dey
|
|
318
|
+
cpy #$ff // ran off the front (NSAMPLES may exceed 128, so no bmi)
|
|
319
|
+
beq settled_from_zero
|
|
320
|
+
lda (zp_ptr),y
|
|
321
|
+
sec
|
|
322
|
+
sbc zp_tmp
|
|
323
|
+
beq !-
|
|
324
|
+
cmp #1 // within one of the final value counts as settled:
|
|
325
|
+
beq !- // a 1351's pot line flickers bit 0 (measured in VICE)
|
|
326
|
+
cmp #$ff
|
|
327
|
+
beq !-
|
|
328
|
+
iny // sample y differed, so y+1 is the first that holds
|
|
329
|
+
tya
|
|
330
|
+
rts
|
|
331
|
+
settled_from_zero:
|
|
332
|
+
lda #0
|
|
333
|
+
rts
|
|
334
|
+
|
|
335
|
+
// settle_to_cycles: A = sample index; zp_ptr = 4 + 8 * A rounded up to a
|
|
336
|
+
// multiple of 32 (16-bit). The rounding hides a chance hit by a noise byte
|
|
337
|
+
// on the final value one sample early, which would otherwise move the digits.
|
|
338
|
+
settle_to_cycles:
|
|
339
|
+
sta zp_ptr
|
|
340
|
+
lda #0
|
|
341
|
+
sta zp_ptr + 1
|
|
342
|
+
asl zp_ptr
|
|
343
|
+
rol zp_ptr + 1
|
|
344
|
+
asl zp_ptr
|
|
345
|
+
rol zp_ptr + 1
|
|
346
|
+
asl zp_ptr
|
|
347
|
+
rol zp_ptr + 1
|
|
348
|
+
lda zp_ptr
|
|
349
|
+
clc
|
|
350
|
+
adc #4 + 31 // + 4 for the read cycle, then round up to a multiple of 32
|
|
351
|
+
sta zp_ptr
|
|
352
|
+
bcc !+
|
|
353
|
+
inc zp_ptr + 1
|
|
354
|
+
!: lda zp_ptr
|
|
355
|
+
and #$e0
|
|
356
|
+
sta zp_ptr
|
|
357
|
+
rts
|
|
358
|
+
|
|
359
|
+
// in_window: carry set when SETTLE_LO <= zp_ptr <= SETTLE_HI.
|
|
360
|
+
in_window:
|
|
361
|
+
lda zp_ptr + 1
|
|
362
|
+
cmp #>SETTLE_LO
|
|
363
|
+
bcc no
|
|
364
|
+
bne !+
|
|
365
|
+
lda zp_ptr
|
|
366
|
+
cmp #<SETTLE_LO
|
|
367
|
+
bcc no
|
|
368
|
+
!: lda zp_ptr + 1
|
|
369
|
+
cmp #>SETTLE_HI
|
|
370
|
+
bcc yes
|
|
371
|
+
bne no
|
|
372
|
+
lda zp_ptr
|
|
373
|
+
cmp #<SETTLE_HI
|
|
374
|
+
bcc yes
|
|
375
|
+
beq yes
|
|
376
|
+
no: clc
|
|
377
|
+
rts
|
|
378
|
+
yes:
|
|
379
|
+
sec
|
|
380
|
+
rts
|
|
381
|
+
|
|
382
|
+
// print_hex: A = byte, row Y, column X. Y is preserved.
|
|
383
|
+
print_hex:
|
|
384
|
+
pha
|
|
385
|
+
jsr row_ptr
|
|
386
|
+
pla
|
|
387
|
+
pha
|
|
388
|
+
lsr
|
|
389
|
+
lsr
|
|
390
|
+
lsr
|
|
391
|
+
lsr
|
|
392
|
+
tax
|
|
393
|
+
lda hex_digits,x
|
|
394
|
+
ldy #0
|
|
395
|
+
sta (zp_row),y
|
|
396
|
+
pla
|
|
397
|
+
and #$0f
|
|
398
|
+
tax
|
|
399
|
+
lda hex_digits,x
|
|
400
|
+
iny
|
|
401
|
+
sta (zp_row),y
|
|
402
|
+
ldy zp_saved_y
|
|
403
|
+
rts
|
|
404
|
+
|
|
405
|
+
// print_dec: zp_ptr = 16-bit value, row Y, column X: five digits, leading zeros.
|
|
406
|
+
// print_dec4: the same without the ten-thousands digit.
|
|
407
|
+
print_dec4:
|
|
408
|
+
jsr row_ptr
|
|
409
|
+
ldy #0
|
|
410
|
+
ldx #1
|
|
411
|
+
bne dec_digit
|
|
412
|
+
print_dec:
|
|
413
|
+
jsr row_ptr
|
|
414
|
+
ldy #0
|
|
415
|
+
ldx #0
|
|
416
|
+
dec_digit:
|
|
417
|
+
lda #$30
|
|
418
|
+
sta digit
|
|
419
|
+
dec_sub:
|
|
420
|
+
lda zp_ptr
|
|
421
|
+
sec
|
|
422
|
+
sbc pow10_lo,x
|
|
423
|
+
pha
|
|
424
|
+
lda zp_ptr + 1
|
|
425
|
+
sbc pow10_hi,x
|
|
426
|
+
bcc dec_done
|
|
427
|
+
sta zp_ptr + 1
|
|
428
|
+
pla
|
|
429
|
+
sta zp_ptr
|
|
430
|
+
inc digit
|
|
431
|
+
jmp dec_sub
|
|
432
|
+
dec_done:
|
|
433
|
+
pla
|
|
434
|
+
lda digit
|
|
435
|
+
sta (zp_row),y
|
|
436
|
+
iny
|
|
437
|
+
inx
|
|
438
|
+
cpx #5
|
|
439
|
+
bne dec_digit
|
|
440
|
+
ldy zp_saved_y
|
|
441
|
+
rts
|
|
442
|
+
|
|
443
|
+
// row_ptr: zp_row = SCREEN + 40 * Y + X. Saves Y in zp_saved_y.
|
|
444
|
+
row_ptr:
|
|
445
|
+
sty zp_saved_y
|
|
446
|
+
txa
|
|
447
|
+
clc
|
|
448
|
+
adc row_lo,y
|
|
449
|
+
sta zp_row
|
|
450
|
+
lda row_hi,y
|
|
451
|
+
adc #0
|
|
452
|
+
sta zp_row + 1
|
|
453
|
+
rts
|
|
454
|
+
|
|
455
|
+
print_pass:
|
|
456
|
+
jsr row_ptr
|
|
457
|
+
ldy #0
|
|
458
|
+
!: lda t_pass,y
|
|
459
|
+
sta (zp_row),y
|
|
460
|
+
iny
|
|
461
|
+
cpy #4
|
|
462
|
+
bne !-
|
|
463
|
+
rts
|
|
464
|
+
|
|
465
|
+
print_fail:
|
|
466
|
+
jsr row_ptr
|
|
467
|
+
ldy #0
|
|
468
|
+
!: lda t_fail,y
|
|
469
|
+
sta (zp_row),y
|
|
470
|
+
iny
|
|
471
|
+
cpy #4
|
|
472
|
+
bne !-
|
|
473
|
+
rts
|
|
474
|
+
|
|
475
|
+
// dec_loops: 16-bit decrement of loops; Z clear while it is non-zero.
|
|
476
|
+
dec_loops:
|
|
477
|
+
lda loops
|
|
478
|
+
bne !+
|
|
479
|
+
dec loops + 1
|
|
480
|
+
!: dec loops
|
|
481
|
+
lda loops
|
|
482
|
+
ora loops + 1
|
|
483
|
+
rts
|
|
484
|
+
|
|
485
|
+
// wait_2k: about 2,000 cycles (arithmetic: 256 * 5 + 146 * 5, less the two
|
|
486
|
+
// fall-through branches, plus the call and the X save). X is preserved.
|
|
487
|
+
wait_2k:
|
|
488
|
+
txa
|
|
489
|
+
pha
|
|
490
|
+
ldx #0
|
|
491
|
+
!: dex
|
|
492
|
+
bne !-
|
|
493
|
+
ldx #146
|
|
494
|
+
!: dex
|
|
495
|
+
bne !-
|
|
496
|
+
pla
|
|
497
|
+
tax
|
|
498
|
+
rts
|
|
499
|
+
|
|
500
|
+
// wait_530: 104 * 5 - 1 + 2 + 12 = 533 cycles including the jsr/rts (arithmetic).
|
|
501
|
+
wait_530:
|
|
502
|
+
ldy #104
|
|
503
|
+
!: dey
|
|
504
|
+
bne !-
|
|
505
|
+
rts
|
|
506
|
+
|
|
507
|
+
clear_screen:
|
|
508
|
+
ldx #0
|
|
509
|
+
lda #$20
|
|
510
|
+
!: sta SCREEN,x
|
|
511
|
+
sta SCREEN + 250,x
|
|
512
|
+
sta SCREEN + 500,x
|
|
513
|
+
sta SCREEN + 750,x
|
|
514
|
+
inx
|
|
515
|
+
cpx #250
|
|
516
|
+
bne !-
|
|
517
|
+
rts
|
|
518
|
+
|
|
519
|
+
// draw_labels: entries of row, column, text, 0; the list ends with row $FF.
|
|
520
|
+
// The table is longer than 256 bytes, so it is walked with a pointer, not X.
|
|
521
|
+
draw_labels:
|
|
522
|
+
lda #<labels
|
|
523
|
+
sta zp_lbl
|
|
524
|
+
lda #>labels
|
|
525
|
+
sta zp_lbl + 1
|
|
526
|
+
next_label:
|
|
527
|
+
ldy #0
|
|
528
|
+
lda (zp_lbl),y
|
|
529
|
+
cmp #$ff
|
|
530
|
+
beq done_labels
|
|
531
|
+
tax // row
|
|
532
|
+
iny
|
|
533
|
+
lda (zp_lbl),y // column
|
|
534
|
+
clc
|
|
535
|
+
adc row_lo,x
|
|
536
|
+
sta zp_row
|
|
537
|
+
lda row_hi,x
|
|
538
|
+
adc #0
|
|
539
|
+
sta zp_row + 1
|
|
540
|
+
lda zp_lbl
|
|
541
|
+
clc
|
|
542
|
+
adc #2
|
|
543
|
+
sta zp_lbl
|
|
544
|
+
bcc !+
|
|
545
|
+
inc zp_lbl + 1
|
|
546
|
+
!: ldy #0
|
|
547
|
+
copy_label:
|
|
548
|
+
lda (zp_lbl),y
|
|
549
|
+
beq end_label
|
|
550
|
+
sta (zp_row),y
|
|
551
|
+
iny
|
|
552
|
+
bne copy_label
|
|
553
|
+
end_label:
|
|
554
|
+
iny // past the terminator
|
|
555
|
+
tya
|
|
556
|
+
clc
|
|
557
|
+
adc zp_lbl
|
|
558
|
+
sta zp_lbl
|
|
559
|
+
bcc next_label
|
|
560
|
+
inc zp_lbl + 1
|
|
561
|
+
jmp next_label
|
|
562
|
+
done_labels:
|
|
563
|
+
rts
|
|
564
|
+
|
|
565
|
+
// --- data ---------------------------------------------------------------------
|
|
566
|
+
|
|
567
|
+
sel_table: .byte SEL_NONE, SEL_PORT1, SEL_PORT2, SEL_BOTH
|
|
568
|
+
row_a: .byte 2, 3, 4, 5
|
|
569
|
+
hex_digits: .text "0123456789ABCDEF"
|
|
570
|
+
pow10_lo: .byte <10000, <1000, <100, <10, <1
|
|
571
|
+
pow10_hi: .byte >10000, >1000, >100, >10, >1
|
|
572
|
+
row_lo: .fill 25, <(SCREEN + 40 * i)
|
|
573
|
+
row_hi: .fill 25, >(SCREEN + 40 * i)
|
|
574
|
+
t_pass: .text "PASS"
|
|
575
|
+
t_fail: .text "FAIL"
|
|
576
|
+
|
|
577
|
+
labels:
|
|
578
|
+
.byte 0, 0
|
|
579
|
+
.text "PADDLE READ POTX/POTY VIA CIA1 PA6/PA7"
|
|
580
|
+
.byte 0
|
|
581
|
+
.byte 2, 0
|
|
582
|
+
.text "SEL 00 NONE : X= Y= (BIT 0 OFF)"
|
|
583
|
+
.byte 0
|
|
584
|
+
.byte 3, 0
|
|
585
|
+
.text "SEL 40 PORT1: X= Y="
|
|
586
|
+
.byte 0
|
|
587
|
+
.byte 4, 0
|
|
588
|
+
.text "SEL 80 PORT2: X= Y="
|
|
589
|
+
.byte 0
|
|
590
|
+
.byte 5, 0
|
|
591
|
+
.text "SEL C0 BOTH : X= Y="
|
|
592
|
+
.byte 0
|
|
593
|
+
.byte 7, 0
|
|
594
|
+
.text "BUTTONS DC00= DC01= (BITS 2,3)"
|
|
595
|
+
.byte 0
|
|
596
|
+
.byte 9, 0
|
|
597
|
+
.text "SETTLE P2>P1 (UP TO 32) 8 PHASES X 65:"
|
|
598
|
+
.byte 0
|
|
599
|
+
.byte 14, 0
|
|
600
|
+
.text "IRQ LIVE 2000, BAD DOWN TO 16:"
|
|
601
|
+
.byte 0
|
|
602
|
+
.byte 15, 0
|
|
603
|
+
.text "SEI GUARDED 2000, BAD:"
|
|
604
|
+
.byte 0
|
|
605
|
+
.byte 18, 0
|
|
606
|
+
.text "RESULT: "
|
|
607
|
+
.byte 0
|
|
608
|
+
.byte $ff
|
|
609
|
+
|
|
610
|
+
potx_val: .fill 4, 0
|
|
611
|
+
poty_val: .fill 4, 0
|
|
612
|
+
settle_k: .fill NPHASES, 0
|
|
613
|
+
bad_free: .word 0
|
|
614
|
+
bad_sei: .word 0
|
|
615
|
+
loops: .word 0
|
|
616
|
+
unstable: .byte 0
|
|
617
|
+
verdict: .byte 0
|
|
618
|
+
digit: .byte 0
|
|
619
|
+
|
|
620
|
+
buf: .fill NSAMPLES, 0
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
## Build
|
|
624
|
+
|
|
625
|
+
```bash
|
|
626
|
+
java -jar $KICKASS_JAR paddle-read.asm -o paddle-read.prg
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
KickAssembler 5.25 produces a 2,476-byte PRG; the code segment runs
|
|
630
|
+
`$0900` to `$11AA`, most of it the two unrolled samplers.
|
|
631
|
+
|
|
632
|
+
Pinned VICE run (both models, `docs/recipes/runs.json`):
|
|
633
|
+
|
|
634
|
+
```bash
|
|
635
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas \
|
|
636
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
637
|
+
-limitcycles 8000000 -controlport1device 3 -controlport2device 2 \
|
|
638
|
+
-exitscreenshot paddle-read.png -autostart paddle-read.prg
|
|
639
|
+
```
|
|
640
|
+
|
|
641
|
+
Add `-model ntsc` for the second picture. `-controlport1device 3` is
|
|
642
|
+
VICE's 1351 mouse on port 1, `-controlport2device 2` its paddles on
|
|
643
|
+
port 2 (the numbers are from `x64sc -help`, VICE 3.10). With paddles on
|
|
644
|
+
both ports, or on one, every select reads `$FF` and nothing can be
|
|
645
|
+
measured; that run was made and is why the 1351 is there.
|
|
646
|
+
|
|
647
|
+
## Expected output
|
|
648
|
+
|
|
649
|
+
Green border, black background, light blue text. The screen is:
|
|
650
|
+
|
|
651
|
+
```text
|
|
652
|
+
row 0 PADDLE READ POTX/POTY VIA CIA1 PA6/PA7
|
|
653
|
+
row 2 SEL 00 NONE : X=FE Y=FE (BIT 0 OFF)
|
|
654
|
+
row 3 SEL 40 PORT1: X=40 Y=40
|
|
655
|
+
row 4 SEL 80 PORT2: X=FE Y=FE
|
|
656
|
+
row 5 SEL C0 BOTH : X=40 Y=40
|
|
657
|
+
row 7 BUTTONS DC00=80 DC01=FF (BITS 2,3)
|
|
658
|
+
row 9 SETTLE P2>P1 (UP TO 32) 8 PHASES X 65:
|
|
659
|
+
row 10 0480 0480 0544 0480 0480 0544 0480 0480
|
|
660
|
+
row 14 IRQ LIVE 2000, BAD DOWN TO 16: 00048
|
|
661
|
+
row 15 SEI GUARDED 2000, BAD: 00000
|
|
662
|
+
row 18 RESULT: PASS
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
`recipes/kickassembler/screenshots/paddle-read.png` (PAL, 384 by 272)
|
|
666
|
+
and `paddle-read-ntsc.png` (NTSC, 384 by 247) were each produced twice
|
|
667
|
+
by the pinned command with identical bytes, and decoded by matching
|
|
668
|
+
every 8 by 8 cell against `chargen-901225-01.bin` (measured in VICE
|
|
669
|
+
x64sc 3.10, rung 1). On NTSC row 10 reads
|
|
670
|
+
`0480 0480 0480 0544 0480 0480 0544 0480`; every other row is the same.
|
|
671
|
+
|
|
672
|
+
What each line shows:
|
|
673
|
+
|
|
674
|
+
- Rows 2 to 5: the four select patterns. `$40` (bit 6) reads port 1, the
|
|
675
|
+
1351, as `$40`/`$40`; `$80` (bit 7) reads port 2, the paddles at rest,
|
|
676
|
+
as `$FE`; no port selected reads `$FE`; both bits set reads the 1351
|
|
677
|
+
again. All four values are shown with bit 0 cleared: VICE's 1351
|
|
678
|
+
flickers bit 0 of its pot value between runs, so `$41` and `$40` are
|
|
679
|
+
the same reading, and the display masks it so two runs match. `$FE`
|
|
680
|
+
on the screen is `$FF` on the bus. The both-bits case is VICE's
|
|
681
|
+
arbitration and says nothing about the hardware.
|
|
682
|
+
- Row 7: with port 2 selected, `$DC00` reads back `$80` (the select bits
|
|
683
|
+
are outputs and read back; bits 0 to 4 high, no button) and `$DC01`
|
|
684
|
+
reads `$FF`. The paddle buttons are read on the port's LEFT and RIGHT
|
|
685
|
+
lines, bits 2 and 3, on `$DC00` for port 2 and `$DC01` for port 1;
|
|
686
|
+
that they ride those lines is not measured here (VICE has no headless
|
|
687
|
+
way to press one) and `hardware/cia-reference.md` places the paddle
|
|
688
|
+
switches only somewhere in PA0-PA4.
|
|
689
|
+
- Row 10: eight settle times, one per phase. Each pass leaves port 2
|
|
690
|
+
selected for about 2,000 cycles, waits a further 65 cycles times the
|
|
691
|
+
phase number, selects port 1, and reads `$D419` every 8 cycles for
|
|
692
|
+
140 reads. The settle is the first read from which every later read is
|
|
693
|
+
within one of the final value, counted in cycles from the write cycle
|
|
694
|
+
of the select store (read `i` is at `4 + 8 i`), rounded up to a
|
|
695
|
+
multiple of 32. Six of eight phases settle by 480, two need more than
|
|
696
|
+
512 and settle by 544; which two depends on the model because the
|
|
697
|
+
phases fall differently against the SID's conversion clock. The raw
|
|
698
|
+
reads at the transition are not shown because VICE fills the window
|
|
699
|
+
with values that differ from run to run (`$C8 $FF $63`, then `$4B
|
|
700
|
+
$87 $46`, then `$D2 $FB $6A` at the same three cycles in three runs).
|
|
701
|
+
In the runs that did print them, the settled value was present from
|
|
702
|
+
read 59, cycle 476, at phase 0 on both models.
|
|
703
|
+
- Rows 14 and 15: 2,000 passes of select port 2, wait about 530 cycles,
|
|
704
|
+
read, with the KERNAL IRQ enabled: 48 or more reads (the exact count
|
|
705
|
+
was 53 to 59 across runs, shown rounded down to 16) returned something
|
|
706
|
+
other than port 2's value. The loop takes about 1.1 million cycles,
|
|
707
|
+
56 PAL frames, so that is about one bad read per jiffy interrupt: the
|
|
708
|
+
scan leaves `$DC00` at `$7F`, port 1 selected. The same 2,000 passes
|
|
709
|
+
under `SEI` return port 2's value every time.
|
|
710
|
+
|
|
711
|
+
The pass window for row 10 is 448 to 544 inclusive. The pass also needs
|
|
712
|
+
the guarded count to be zero and ten more reads of port 2, each after
|
|
713
|
+
its own select and a 2,000-cycle wait, to agree with row 4.
|
|
714
|
+
|
|
715
|
+
Two earlier versions of this listing did not run: the label table grew
|
|
716
|
+
past 256 bytes and an indexed walk wrapped, and the 2,000-cycle wait
|
|
717
|
+
used X and reset a loop counter. Both were found from the screen, not
|
|
718
|
+
the source.
|
|
719
|
+
|
|
720
|
+
## Why this works
|
|
721
|
+
|
|
722
|
+
The select is a plain write to `$DC00` with the direction register at
|
|
723
|
+
`$FF`: bits 6 and 7 are output pins on the CIA that feed the SID's
|
|
724
|
+
analogue multiplexer, and bits 0 to 5 double as keyboard columns, so
|
|
725
|
+
`$40` and `$80` also leave every column line high. The SID does not
|
|
726
|
+
sample the pot line at the moment of the write. It runs its own
|
|
727
|
+
conversion, one every 512 cycles, and the value in `$D419` becomes the
|
|
728
|
+
new port's only after a conversion that started after the switch has
|
|
729
|
+
finished. The phase sweep exists to show that the wait depends on where
|
|
730
|
+
the write lands in that cycle; a program that reads a fixed number of
|
|
731
|
+
cycles after the select must use the longest case, and the cheapest
|
|
732
|
+
correct schedule is to select on one frame and read on the next.
|
|
733
|
+
|
|
734
|
+
The unrolled sampler is what makes the count exact: `lda $d419` reads
|
|
735
|
+
on its fourth cycle and `sta buf+i` takes four, so read `i` is at
|
|
736
|
+
`4 + 8 i` with no loop overhead to account for. `find_settle` walks the
|
|
737
|
+
buffer from the end so that a stray match inside the noise cannot end
|
|
738
|
+
the search early. The tolerance of one and the rounding to 32 are
|
|
739
|
+
concessions to VICE, not to the SID: its 1351 wobbles bit 0, and its
|
|
740
|
+
noise bytes are random, so an unrounded figure could move by 8 between
|
|
741
|
+
two runs of the same PRG.
|
|
742
|
+
|
|
743
|
+
The IRQ loop shows the other half of the technique. SCNKEY runs inside
|
|
744
|
+
the jiffy interrupt, drives the columns, and leaves `$7F` in `$DC00`,
|
|
745
|
+
which is bit 6 set: port 1. A read taken after that, but within a
|
|
746
|
+
conversion of it, gets either port 1's value or a byte from the middle
|
|
747
|
+
of a conversion; the runs here saw both. Bracketing the select, the
|
|
748
|
+
wait and the read with `SEI` and `CLI` removes every miss, at the cost
|
|
749
|
+
of holding the interrupt off for the wait. A game that already owns the
|
|
750
|
+
IRQ, or that reads on a raster line it chooses, has the same guarantee
|
|
751
|
+
for free.
|