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,672 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: four-player-read
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [four_player_read]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D011, D012, D015, D020, D021, D027, DC00, DC01, DC02, DC04, DC05, DC0D, DC0E, DD01, DD03]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Read four joysticks every frame through a user-port 4-player adapter
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Reads joysticks 1 and 2 from CIA1 and joysticks 3 and 4 from CIA2 port B
|
|
19
|
+
through a CGA/Protovision 4-player adapter, once per frame, and leaves
|
|
20
|
+
four bytes in the `$DC00` layout (bit 0 up, 1 down, 2 left, 3 right,
|
|
21
|
+
4 fire, 0 when pressed). It shows each player's directions and fire as
|
|
22
|
+
text and as four sprites, and prints the read's cost measured with a
|
|
23
|
+
CIA timer. Over a 100-frame window it counts fire presses per player and
|
|
24
|
+
checks the adapter. It writes `$01` to `$02FF` and turns the border green
|
|
25
|
+
when every check passes, `$02` and red otherwise. The technique is
|
|
26
|
+
`four_player_read` in `techniques/input.md`.
|
|
27
|
+
|
|
28
|
+
What a headless VICE run can drive, and what it cannot:
|
|
29
|
+
|
|
30
|
+
- **Fire on joysticks 3 and 4: driven.** VICE's permanent autofire
|
|
31
|
+
presses fire on its own clock with no host input. The run sets 5
|
|
32
|
+
presses a second on joystick 3 and 7 on joystick 4, so the two counts
|
|
33
|
+
differ and a swapped fire bit would show.
|
|
34
|
+
- **Directions on joysticks 3 and 4: not driven.** Nothing in VICE 3.10
|
|
35
|
+
moves them without a host keyboard or joystick: the headless build has
|
|
36
|
+
neither, and the monitor's joyport command (binary monitor `0xa2`)
|
|
37
|
+
accepts ports 1 and 2 only (`mon_joyport_set_output` in
|
|
38
|
+
`src/monitor/monitor.c`). So the select line's effect on PB0-PB3 is not
|
|
39
|
+
observed here; the page checks only that both selects read idle.
|
|
40
|
+
- **Joysticks 1 and 2: not driven.** Autofire on those ports holds a
|
|
41
|
+
keyboard row or column low from power-on, and the autostart `RUN`
|
|
42
|
+
never executed in the run that tried it. They are read and shown idle.
|
|
43
|
+
|
|
44
|
+
## Source
|
|
45
|
+
|
|
46
|
+
```asm
|
|
47
|
+
// four-player-read.asm
|
|
48
|
+
// Reads joysticks 1 to 4 every frame: ports 1 and 2 on CIA1, ports 3 and 4
|
|
49
|
+
// on the user port through a CGA/Protovision 4-player adapter on CIA2 port B.
|
|
50
|
+
// PB7 is the adapter's select output: 1 puts joystick 3's directions on
|
|
51
|
+
// PB0-PB3, 0 puts joystick 4's there. Fire 3 is PB4 and fire 4 is PB5 under
|
|
52
|
+
// either select. read4 leaves four bytes in the $DC00 layout: bit 0 up,
|
|
53
|
+
// 1 down, 2 left, 3 right, 4 fire, 0 = pressed.
|
|
54
|
+
//
|
|
55
|
+
// Self-check over a 100-frame window, then a live display with four sprites.
|
|
56
|
+
// Verdict at $02FF ($01 pass, $02 fail) and in the border (green, red).
|
|
57
|
+
.encoding "screencode_upper"
|
|
58
|
+
|
|
59
|
+
.const SCREEN = $0400
|
|
60
|
+
.const RESULT = $02ff
|
|
61
|
+
.const WINDOW = 100 // frames in the self-check window
|
|
62
|
+
.const SPRBLK = 13 // sprite data at $0340
|
|
63
|
+
|
|
64
|
+
.const J1 = $f0 // read4 output, one byte per player
|
|
65
|
+
.const J2 = $f1
|
|
66
|
+
.const J3 = $f2
|
|
67
|
+
.const J4 = $f3
|
|
68
|
+
.const zp_row = $f7 // screen pointer for the printers
|
|
69
|
+
.const zp_tmp = $f9
|
|
70
|
+
.const zp_prev = $fa // four bytes: last frame's J1-J4 ($fa-$fd)
|
|
71
|
+
|
|
72
|
+
BasicUpstart2(start)
|
|
73
|
+
|
|
74
|
+
* = $0900 "code"
|
|
75
|
+
|
|
76
|
+
start:
|
|
77
|
+
sei
|
|
78
|
+
lda #$7f
|
|
79
|
+
sta $dc0d // no CIA1 interrupts: nothing scans the keyboard
|
|
80
|
+
lda $dc0d
|
|
81
|
+
lda #$ff
|
|
82
|
+
sta $dc02 // CIA1 port A all output (IOINIT's value)
|
|
83
|
+
sta $dc00 // no keyboard column driven: port 1 reads only joystick 1
|
|
84
|
+
lda #$80
|
|
85
|
+
sta $dd03 // CIA2 DDR B: PB7 output (adapter select), PB0-PB6 input
|
|
86
|
+
lda #$00
|
|
87
|
+
sta $d020
|
|
88
|
+
sta $d021
|
|
89
|
+
jsr clear_screen
|
|
90
|
+
jsr draw_labels
|
|
91
|
+
jsr setup_sprites
|
|
92
|
+
|
|
93
|
+
// --- the DDR, read back ---------------------------------------------------
|
|
94
|
+
lda $dd03
|
|
95
|
+
sta ddr_seen
|
|
96
|
+
ldy #2
|
|
97
|
+
ldx #13
|
|
98
|
+
jsr print_hex
|
|
99
|
+
|
|
100
|
+
// --- read4's cost: CIA1 timer A around a call, minus the same around a bare rts
|
|
101
|
+
ldx #<read4
|
|
102
|
+
ldy #>read4
|
|
103
|
+
jsr time_call
|
|
104
|
+
sta t_read
|
|
105
|
+
ldx #<stub
|
|
106
|
+
ldy #>stub
|
|
107
|
+
jsr time_call
|
|
108
|
+
sta t_stub
|
|
109
|
+
lda t_read
|
|
110
|
+
sec
|
|
111
|
+
sbc t_stub // body cycles: the jsr and rts cancel
|
|
112
|
+
sta body_cyc
|
|
113
|
+
ldy #3
|
|
114
|
+
ldx #12
|
|
115
|
+
jsr print_dec
|
|
116
|
+
lda body_cyc
|
|
117
|
+
clc
|
|
118
|
+
adc #12 // plus jsr (6) and rts (6)
|
|
119
|
+
ldy #3
|
|
120
|
+
ldx #29
|
|
121
|
+
jsr print_dec
|
|
122
|
+
|
|
123
|
+
// --- the window: one read4 per frame, count fire presses, check the adapter
|
|
124
|
+
lda #$1f
|
|
125
|
+
sta zp_prev
|
|
126
|
+
sta zp_prev+1
|
|
127
|
+
sta zp_prev+2
|
|
128
|
+
sta zp_prev+3
|
|
129
|
+
lda #WINDOW
|
|
130
|
+
sta frames
|
|
131
|
+
win:
|
|
132
|
+
jsr wait_frame
|
|
133
|
+
jsr read4
|
|
134
|
+
jsr count_presses
|
|
135
|
+
jsr check_adapter
|
|
136
|
+
jsr show_players
|
|
137
|
+
dec frames
|
|
138
|
+
bne win
|
|
139
|
+
|
|
140
|
+
// --- verdict ----------------------------------------------------------------
|
|
141
|
+
lda mismatch
|
|
142
|
+
ldy #11
|
|
143
|
+
ldx #35
|
|
144
|
+
jsr print_dec
|
|
145
|
+
lda idle_bad
|
|
146
|
+
ldy #12
|
|
147
|
+
ldx #35
|
|
148
|
+
jsr print_dec
|
|
149
|
+
|
|
150
|
+
lda ddr_seen
|
|
151
|
+
cmp #$80
|
|
152
|
+
bne fail
|
|
153
|
+
lda mismatch
|
|
154
|
+
bne fail
|
|
155
|
+
lda idle_bad
|
|
156
|
+
bne fail
|
|
157
|
+
lda presses
|
|
158
|
+
ora presses+1
|
|
159
|
+
bne fail // ports 1 and 2 are not driven: no presses there
|
|
160
|
+
lda presses+2
|
|
161
|
+
beq fail // port 3 saw no press: the input never arrived
|
|
162
|
+
cmp presses+3
|
|
163
|
+
bcs fail // port 4 runs the faster autofire: more presses than port 3
|
|
164
|
+
lda #$01
|
|
165
|
+
sta RESULT
|
|
166
|
+
lda #5
|
|
167
|
+
sta $d020
|
|
168
|
+
ldx #0
|
|
169
|
+
!: lda txt_pass,x
|
|
170
|
+
sta SCREEN + 15*40 + 8,x
|
|
171
|
+
inx
|
|
172
|
+
cpx #4
|
|
173
|
+
bne !-
|
|
174
|
+
jmp live
|
|
175
|
+
fail:
|
|
176
|
+
lda #$02
|
|
177
|
+
sta RESULT
|
|
178
|
+
lda #2
|
|
179
|
+
sta $d020
|
|
180
|
+
ldx #0
|
|
181
|
+
!: lda txt_fail,x
|
|
182
|
+
sta SCREEN + 15*40 + 8,x
|
|
183
|
+
inx
|
|
184
|
+
cpx #4
|
|
185
|
+
bne !-
|
|
186
|
+
|
|
187
|
+
// --- live: the same read every frame, shown as text and sprites -----------
|
|
188
|
+
live:
|
|
189
|
+
jsr wait_frame
|
|
190
|
+
jsr read4
|
|
191
|
+
jsr show_players
|
|
192
|
+
jmp live
|
|
193
|
+
|
|
194
|
+
// ===========================================================================
|
|
195
|
+
// read4: the technique. Ports 1 and 2 from CIA1, ports 3 and 4 from CIA2
|
|
196
|
+
// port B with the select on PB7. 62 cycles of body, branch-free.
|
|
197
|
+
read4:
|
|
198
|
+
lda $dc01 // port 1
|
|
199
|
+
and #$1f
|
|
200
|
+
sta J1
|
|
201
|
+
lda $dc00 // port 2
|
|
202
|
+
and #$1f
|
|
203
|
+
sta J2
|
|
204
|
+
lda #$80
|
|
205
|
+
sta $dd01 // select joystick 3
|
|
206
|
+
lda $dd01
|
|
207
|
+
and #$1f // directions PB0-PB3, fire 3 on PB4
|
|
208
|
+
sta J3
|
|
209
|
+
lda #$00
|
|
210
|
+
sta $dd01 // select joystick 4
|
|
211
|
+
lda $dd01
|
|
212
|
+
tax
|
|
213
|
+
and #$0f // directions PB0-PB3
|
|
214
|
+
sta J4
|
|
215
|
+
txa
|
|
216
|
+
and #$20 // fire 4 is PB5
|
|
217
|
+
lsr // move it to bit 4
|
|
218
|
+
ora J4
|
|
219
|
+
sta J4
|
|
220
|
+
rts
|
|
221
|
+
|
|
222
|
+
stub:
|
|
223
|
+
rts
|
|
224
|
+
|
|
225
|
+
// time_call: X/Y = routine address. Returns A = low byte of elapsed cycles
|
|
226
|
+
// from the timer start to its stop (the fixed overhead cancels in a difference).
|
|
227
|
+
time_call:
|
|
228
|
+
stx tc_jsr+1
|
|
229
|
+
sty tc_jsr+2
|
|
230
|
+
lda #$ff
|
|
231
|
+
sta $dc04
|
|
232
|
+
sta $dc05
|
|
233
|
+
lda #$11 // force load, start, continuous
|
|
234
|
+
ldy #$00
|
|
235
|
+
sta $dc0e
|
|
236
|
+
tc_jsr:
|
|
237
|
+
jsr stub // patched
|
|
238
|
+
sty $dc0e // stop
|
|
239
|
+
lda #$ff
|
|
240
|
+
sec
|
|
241
|
+
sbc $dc04 // elapsed low byte; both calls are under 256 cycles
|
|
242
|
+
rts
|
|
243
|
+
|
|
244
|
+
// wait_frame: return once per frame, as line 250 begins ($FA exists on PAL and NTSC)
|
|
245
|
+
wait_frame:
|
|
246
|
+
!: lda $d011
|
|
247
|
+
bmi !-
|
|
248
|
+
lda $d012
|
|
249
|
+
cmp #$fa
|
|
250
|
+
bne !-
|
|
251
|
+
!: lda $d012
|
|
252
|
+
cmp #$fa
|
|
253
|
+
beq !-
|
|
254
|
+
rts
|
|
255
|
+
|
|
256
|
+
// count_presses: a press is a fire bit going from 1 (released) to 0
|
|
257
|
+
count_presses:
|
|
258
|
+
ldx #3
|
|
259
|
+
!: lda J1,x
|
|
260
|
+
and #$10
|
|
261
|
+
bne cp_next // released now
|
|
262
|
+
lda zp_prev,x
|
|
263
|
+
and #$10
|
|
264
|
+
beq cp_next // was already held
|
|
265
|
+
inc presses,x
|
|
266
|
+
cp_next:
|
|
267
|
+
lda J1,x
|
|
268
|
+
sta zp_prev,x
|
|
269
|
+
dex
|
|
270
|
+
bpl !-
|
|
271
|
+
rts
|
|
272
|
+
|
|
273
|
+
// check_adapter: fire bits must not depend on the select, directions must be
|
|
274
|
+
// idle ($0F: nothing drives them headless) and PB6 high under both selects.
|
|
275
|
+
check_adapter:
|
|
276
|
+
lda #$80
|
|
277
|
+
sta $dd01
|
|
278
|
+
lda $dd01
|
|
279
|
+
sta raw3
|
|
280
|
+
lda #$00
|
|
281
|
+
sta $dd01
|
|
282
|
+
lda $dd01
|
|
283
|
+
sta raw4
|
|
284
|
+
eor raw3
|
|
285
|
+
and #$30 // PB4, PB5: fire 3 and fire 4
|
|
286
|
+
beq !+
|
|
287
|
+
inc mismatch
|
|
288
|
+
!: lda raw3
|
|
289
|
+
and #$4f
|
|
290
|
+
cmp #$4f
|
|
291
|
+
bne ca_bad
|
|
292
|
+
lda raw4
|
|
293
|
+
and #$4f
|
|
294
|
+
cmp #$4f
|
|
295
|
+
beq ca_ok
|
|
296
|
+
ca_bad:
|
|
297
|
+
inc idle_bad
|
|
298
|
+
ca_ok:
|
|
299
|
+
lda J1
|
|
300
|
+
and J2
|
|
301
|
+
cmp #$1f // ports 1 and 2 idle as well
|
|
302
|
+
beq !+
|
|
303
|
+
inc idle_bad
|
|
304
|
+
!: rts
|
|
305
|
+
|
|
306
|
+
// show_players: row 6+n: directions as U D L R or '-', fire as F or '-',
|
|
307
|
+
// and the press count; sprite n moves 12 px per held direction, white on fire.
|
|
308
|
+
show_players:
|
|
309
|
+
ldx #0
|
|
310
|
+
sp_loop:
|
|
311
|
+
stx pl
|
|
312
|
+
lda row_lo,x
|
|
313
|
+
sta zp_row
|
|
314
|
+
lda row_hi,x
|
|
315
|
+
sta zp_row+1
|
|
316
|
+
lda J1,x
|
|
317
|
+
sta zp_tmp
|
|
318
|
+
ldy #17
|
|
319
|
+
ldx #0
|
|
320
|
+
sp_dir:
|
|
321
|
+
lsr zp_tmp
|
|
322
|
+
lda dir_chr,x
|
|
323
|
+
bcc !+
|
|
324
|
+
lda #'-'
|
|
325
|
+
!: sta (zp_row),y
|
|
326
|
+
iny
|
|
327
|
+
inx
|
|
328
|
+
cpx #5
|
|
329
|
+
bne sp_dir
|
|
330
|
+
ldx pl
|
|
331
|
+
lda presses,x
|
|
332
|
+
ldy row_n,x
|
|
333
|
+
ldx #25
|
|
334
|
+
jsr print_dec
|
|
335
|
+
ldx pl
|
|
336
|
+
// sprite position: home plus 12 px per held direction
|
|
337
|
+
txa
|
|
338
|
+
asl
|
|
339
|
+
tay // Y = 2 * player: $D000/$D001 index
|
|
340
|
+
lda J1,x
|
|
341
|
+
sta zp_tmp
|
|
342
|
+
lda home_x,x
|
|
343
|
+
lsr zp_tmp // up
|
|
344
|
+
lsr zp_tmp // down
|
|
345
|
+
lsr zp_tmp // left
|
|
346
|
+
bcs !+
|
|
347
|
+
sec
|
|
348
|
+
sbc #12
|
|
349
|
+
!: lsr zp_tmp // right
|
|
350
|
+
bcs !+
|
|
351
|
+
clc
|
|
352
|
+
adc #12
|
|
353
|
+
!: sta $d000,y
|
|
354
|
+
lda J1,x
|
|
355
|
+
sta zp_tmp
|
|
356
|
+
lda #206
|
|
357
|
+
lsr zp_tmp // up
|
|
358
|
+
bcs !+
|
|
359
|
+
sec
|
|
360
|
+
sbc #12
|
|
361
|
+
!: lsr zp_tmp // down
|
|
362
|
+
bcs !+
|
|
363
|
+
clc
|
|
364
|
+
adc #12
|
|
365
|
+
!: sta $d001,y
|
|
366
|
+
lda J1,x
|
|
367
|
+
and #$10
|
|
368
|
+
beq !+
|
|
369
|
+
lda colour,x
|
|
370
|
+
.byte $2c // bit abs: skip the white load
|
|
371
|
+
!: lda #1
|
|
372
|
+
sta $d027,x
|
|
373
|
+
inx
|
|
374
|
+
cpx #4
|
|
375
|
+
beq !+
|
|
376
|
+
jmp sp_loop
|
|
377
|
+
!: rts
|
|
378
|
+
|
|
379
|
+
setup_sprites:
|
|
380
|
+
ldx #62
|
|
381
|
+
!: lda sprite_src,x
|
|
382
|
+
sta SPRBLK*64,x
|
|
383
|
+
dex
|
|
384
|
+
bpl !-
|
|
385
|
+
ldx #3
|
|
386
|
+
!: lda #SPRBLK
|
|
387
|
+
sta SCREEN+$3f8,x
|
|
388
|
+
dex
|
|
389
|
+
bpl !-
|
|
390
|
+
lda #$0f
|
|
391
|
+
sta $d015
|
|
392
|
+
lda #$00
|
|
393
|
+
sta $d010
|
|
394
|
+
sta $d01c
|
|
395
|
+
sta $d017
|
|
396
|
+
sta $d01d
|
|
397
|
+
rts
|
|
398
|
+
|
|
399
|
+
clear_screen:
|
|
400
|
+
ldx #0
|
|
401
|
+
!: lda #' '
|
|
402
|
+
sta SCREEN,x
|
|
403
|
+
sta SCREEN+$100,x
|
|
404
|
+
sta SCREEN+$200,x
|
|
405
|
+
sta SCREEN+$2e8,x
|
|
406
|
+
lda #14
|
|
407
|
+
sta $d800,x
|
|
408
|
+
sta $d900,x
|
|
409
|
+
sta $da00,x
|
|
410
|
+
sta $dae8,x
|
|
411
|
+
inx
|
|
412
|
+
bne !-
|
|
413
|
+
rts
|
|
414
|
+
|
|
415
|
+
// draw_labels: fixed text, one macro call per label
|
|
416
|
+
.macro label(row, col, str) {
|
|
417
|
+
ldx #0
|
|
418
|
+
!: lda txt,x
|
|
419
|
+
sta SCREEN + row*40 + col,x
|
|
420
|
+
inx
|
|
421
|
+
cpx #str.size()
|
|
422
|
+
bne !-
|
|
423
|
+
jmp done
|
|
424
|
+
txt: .text str
|
|
425
|
+
done:
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
draw_labels:
|
|
429
|
+
label(0, 0, "4-PLAYER READ: CGA/PROTOVISION ADAPTER")
|
|
430
|
+
label(2, 0, "DDR B $DD03: (WANT 80)")
|
|
431
|
+
label(3, 0, "READ4 BODY: CYC, AS JSR: CYC")
|
|
432
|
+
label(5, 0, "PORT SOURCE UDLRF PRESSES")
|
|
433
|
+
label(6, 0, "P1 $DC01")
|
|
434
|
+
label(7, 0, "P2 $DC00")
|
|
435
|
+
label(8, 0, "P3 $DD01/80")
|
|
436
|
+
label(9, 0, "P4 $DD01/00")
|
|
437
|
+
label(11, 0, "FIRE BITS DIFFER BETWEEN SELECTS:")
|
|
438
|
+
label(12, 0, "FRAMES WITH A NON-IDLE DIRECTION:")
|
|
439
|
+
label(13, 0, "WINDOW: 100 FRAMES")
|
|
440
|
+
label(15, 0, "RESULT:")
|
|
441
|
+
rts
|
|
442
|
+
|
|
443
|
+
// print_hex: A at row Y, column X
|
|
444
|
+
print_hex:
|
|
445
|
+
pha
|
|
446
|
+
jsr set_row
|
|
447
|
+
pla
|
|
448
|
+
pha
|
|
449
|
+
lsr
|
|
450
|
+
lsr
|
|
451
|
+
lsr
|
|
452
|
+
lsr
|
|
453
|
+
tay
|
|
454
|
+
lda hex_chr,y
|
|
455
|
+
ldy #0
|
|
456
|
+
sta (zp_row),y
|
|
457
|
+
pla
|
|
458
|
+
and #$0f
|
|
459
|
+
tay
|
|
460
|
+
lda hex_chr,y
|
|
461
|
+
ldy #1
|
|
462
|
+
sta (zp_row),y
|
|
463
|
+
rts
|
|
464
|
+
|
|
465
|
+
// print_dec: A (0-255) as three digits at row Y, column X
|
|
466
|
+
print_dec:
|
|
467
|
+
pha
|
|
468
|
+
jsr set_row
|
|
469
|
+
pla
|
|
470
|
+
ldx #'0'
|
|
471
|
+
!: cmp #100
|
|
472
|
+
bcc !+
|
|
473
|
+
sbc #100
|
|
474
|
+
inx
|
|
475
|
+
bne !-
|
|
476
|
+
!: pha
|
|
477
|
+
txa
|
|
478
|
+
ldy #0
|
|
479
|
+
sta (zp_row),y
|
|
480
|
+
pla
|
|
481
|
+
ldx #'0'
|
|
482
|
+
!: cmp #10
|
|
483
|
+
bcc !+
|
|
484
|
+
sbc #10
|
|
485
|
+
inx
|
|
486
|
+
bne !-
|
|
487
|
+
!: pha
|
|
488
|
+
txa
|
|
489
|
+
ldy #1
|
|
490
|
+
sta (zp_row),y
|
|
491
|
+
pla
|
|
492
|
+
clc
|
|
493
|
+
adc #'0'
|
|
494
|
+
ldy #2
|
|
495
|
+
sta (zp_row),y
|
|
496
|
+
rts
|
|
497
|
+
|
|
498
|
+
// set_row: zp_row = SCREEN + 40*Y + X
|
|
499
|
+
set_row:
|
|
500
|
+
txa
|
|
501
|
+
clc
|
|
502
|
+
adc scr_lo,y
|
|
503
|
+
sta zp_row
|
|
504
|
+
lda scr_hi,y
|
|
505
|
+
adc #0
|
|
506
|
+
sta zp_row+1
|
|
507
|
+
rts
|
|
508
|
+
|
|
509
|
+
// ===========================================================================
|
|
510
|
+
ddr_seen: .byte 0
|
|
511
|
+
t_read: .byte 0
|
|
512
|
+
t_stub: .byte 0
|
|
513
|
+
body_cyc: .byte 0
|
|
514
|
+
frames: .byte 0
|
|
515
|
+
pl: .byte 0
|
|
516
|
+
raw3: .byte 0
|
|
517
|
+
raw4: .byte 0
|
|
518
|
+
mismatch: .byte 0
|
|
519
|
+
idle_bad: .byte 0
|
|
520
|
+
presses: .byte 0, 0, 0, 0
|
|
521
|
+
|
|
522
|
+
dir_chr: .text "UDLRF"
|
|
523
|
+
hex_chr: .text "0123456789ABCDEF"
|
|
524
|
+
txt_pass: .text "PASS"
|
|
525
|
+
txt_fail: .text "FAIL"
|
|
526
|
+
home_x: .byte 60, 120, 180, 240
|
|
527
|
+
colour: .byte 2, 3, 6, 8 // red, cyan, blue, orange
|
|
528
|
+
row_n: .byte 6, 7, 8, 9
|
|
529
|
+
row_lo: .fill 4, <(SCREEN + 40*(6+i))
|
|
530
|
+
row_hi: .fill 4, >(SCREEN + 40*(6+i))
|
|
531
|
+
scr_lo: .fill 25, <(SCREEN + 40*i)
|
|
532
|
+
scr_hi: .fill 25, >(SCREEN + 40*i)
|
|
533
|
+
|
|
534
|
+
sprite_src:
|
|
535
|
+
.fill 3, $ff
|
|
536
|
+
.for (var r = 0; r < 19; r++) {
|
|
537
|
+
.byte $c0, $00, $03 // a hollow square: the sides
|
|
538
|
+
}
|
|
539
|
+
.fill 3, $ff
|
|
540
|
+
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
## Build
|
|
544
|
+
|
|
545
|
+
```bash
|
|
546
|
+
java -jar $KICKASS_JAR four-player-read.asm -o four-player-read.prg
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
KickAssembler 5.25 produces a 1,635-byte PRG; the code segment runs
|
|
550
|
+
`$0900` to `$0E61`.
|
|
551
|
+
|
|
552
|
+
Pinned VICE run (both models, `docs/recipes/runs.json`):
|
|
553
|
+
|
|
554
|
+
```bash
|
|
555
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
556
|
+
-limitcycles 8000000 -userportdevice 3 \
|
|
557
|
+
-extrajoystick1autofire -extrajoystick1autofiremode 1 -extrajoystick1autofirespeed 5 \
|
|
558
|
+
-extrajoystick2autofire -extrajoystick2autofiremode 1 -extrajoystick2autofirespeed 7 \
|
|
559
|
+
-exitscreenshot four-player-read.png -autostart four-player-read.prg
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
Add `-model ntsc` for the second picture. The flags, from `x64sc -help`
|
|
563
|
+
and the VICE 3.10 source:
|
|
564
|
+
|
|
565
|
+
- `-userportdevice 3` is VICE's "CGA userport joy adapter". Its wiring in
|
|
566
|
+
`src/userport/userport_joystick.c` is the one the Protovision page
|
|
567
|
+
gives: PB7 selects, PB0-PB3 carry the selected joystick's directions,
|
|
568
|
+
PB4 is joystick 3's fire and PB5 joystick 4's.
|
|
569
|
+
- `-extrajoystick1autofire` sets the resource `JoyStick3AutoFire`
|
|
570
|
+
(`src/joyport/joystick.c`); VICE's read function puts that joystick on
|
|
571
|
+
PB4 for fire, and on PB0-PB3 when PB7 = 1. Measured: the speed-5
|
|
572
|
+
autofire counted on PB4. VICE's pin-table comment in
|
|
573
|
+
`userport_joystick.c` labels the joysticks the other way round; the code
|
|
574
|
+
is what runs. The
|
|
575
|
+
first run of this recipe used `-extrajoystick3autofire` and
|
|
576
|
+
`-extrajoystick4autofire`, drove adapter ports 3 and 4, which the CGA
|
|
577
|
+
adapter does not have, and counted no presses.
|
|
578
|
+
- Autofire mode 1 is permanent: fire is held for the first half of each
|
|
579
|
+
press period, timed from the CPU clock (`get_joystick_autofire` in
|
|
580
|
+
`src/joyport/joystick.c`), so two runs of the same PRG see the same
|
|
581
|
+
presses.
|
|
582
|
+
|
|
583
|
+
## Expected output
|
|
584
|
+
|
|
585
|
+
Green border, black background, light blue text, four sprites. The screen
|
|
586
|
+
on PAL:
|
|
587
|
+
|
|
588
|
+
```text
|
|
589
|
+
row 0 4-PLAYER READ: CGA/PROTOVISION ADAPTER
|
|
590
|
+
row 2 DDR B $DD03: 80 (WANT 80)
|
|
591
|
+
row 3 READ4 BODY: 062 CYC, AS JSR: 074 CYC
|
|
592
|
+
row 5 PORT SOURCE UDLRF PRESSES
|
|
593
|
+
row 6 P1 $DC01 ----- 000
|
|
594
|
+
row 7 P2 $DC00 ----- 000
|
|
595
|
+
row 8 P3 $DD01/80 ----F 011
|
|
596
|
+
row 9 P4 $DD01/00 ----- 015
|
|
597
|
+
row 11 FIRE BITS DIFFER BETWEEN SELECTS: 000
|
|
598
|
+
row 12 FRAMES WITH A NON-IDLE DIRECTION: 000
|
|
599
|
+
row 13 WINDOW: 100 FRAMES
|
|
600
|
+
row 15 RESULT: PASS
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
PASS means: `$DD03` reads `$80`; fire 3 arrives on PB4 and fire 4 on PB5,
|
|
604
|
+
in that order (a swap fails the count order); the fire bits do not change
|
|
605
|
+
with the select; the direction lines read idle. It does not show the
|
|
606
|
+
select routing directions, which VICE cannot drive headless.
|
|
607
|
+
|
|
608
|
+
On NTSC rows 8 and 9 read `009` and `012`; every other text row is the
|
|
609
|
+
same. `recipes/kickassembler/screenshots/four-player-read.png` (PAL, 384
|
|
610
|
+
by 272) and `four-player-read-ntsc.png` (NTSC, 384 by 247) were each
|
|
611
|
+
produced twice by the pinned command with identical bytes, and decoded by
|
|
612
|
+
matching every 8 by 8 cell against `chargen-901225-01.bin` (measured in
|
|
613
|
+
VICE x64sc 3.10). The border is palette index 5 on both models.
|
|
614
|
+
|
|
615
|
+
What each line shows:
|
|
616
|
+
|
|
617
|
+
- Row 2: `$DD03` reads back `$80`: PB7 output, PB0-PB6 input.
|
|
618
|
+
- Row 3: the read's body, 62 cycles, measured by CIA1 timer A around
|
|
619
|
+
`jsr read4` minus the same around `jsr` to a bare `rts`, on both
|
|
620
|
+
models. It matches the instruction table: 22 instructions, no branch,
|
|
621
|
+
so every frame costs the same. 74 is the body plus `jsr` and `rts`
|
|
622
|
+
(arithmetic).
|
|
623
|
+
- Rows 6 to 9: the live read at the moment of the screenshot, one
|
|
624
|
+
letter per held line, and the presses counted in the window. Joystick
|
|
625
|
+
3 shows `F` because autofire holds its fire at that cycle. The counts
|
|
626
|
+
agree with VICE's autofire clock: 100 PAL frames are 1,965,600 cycles,
|
|
627
|
+
2.0 seconds at 985,248 cycles a second, so about 10 presses at 5 a
|
|
628
|
+
second and 14 at 7, give or take the phase of the first and last
|
|
629
|
+
(arithmetic). On NTSC the window is 1,709,500 cycles, 1.67 seconds at
|
|
630
|
+
1,022,727, so about 8 and 12. Every run of this PRG gave 11 and 15 on
|
|
631
|
+
PAL and 9 and 12 on NTSC.
|
|
632
|
+
- Row 11: each frame the check reads `$DD01` under PB7 = 1 and PB7 = 0
|
|
633
|
+
and compares PB4 and PB5. They never differed: the fire lines do not
|
|
634
|
+
go through the select. The two reads are 14 cycles apart, so an
|
|
635
|
+
autofire edge falling between them would count once; none did.
|
|
636
|
+
- Row 12: frames where PB0-PB3 were not `$F` or PB6 was low under
|
|
637
|
+
either select, or where joystick 1 or 2 was not `$1F`. None: nothing
|
|
638
|
+
drives a direction in this run.
|
|
639
|
+
- Sprites: red, cyan, blue and orange for players 1 to 4, at VIC X 60,
|
|
640
|
+
120, 180 and 240, each moved 12 pixels per held direction and white
|
|
641
|
+
while fire is held. Measured in the PAL and NTSC PNGs: each sprite
|
|
642
|
+
covers X 60-83, 120-143, 180-203 and 240-263 and raster lines 207 to
|
|
643
|
+
227 (sprite Y register 206); sprite 3 is white `(255, 255, 255)`,
|
|
644
|
+
the others their colour's palette triple.
|
|
645
|
+
|
|
646
|
+
Two control runs, not pinned, with the same PRG and autofire flags:
|
|
647
|
+
|
|
648
|
+
- No `-userportdevice`: `$DD01` reads `$FF` under both selects, rows 8
|
|
649
|
+
and 9 count 0 presses, and the result is FAIL.
|
|
650
|
+
- `-userportdevice 8`, VICE's Kingsoft adapter: row 8 counts 11 presses
|
|
651
|
+
(the Kingsoft wiring also puts joystick 3's fire on PB4), row 9 counts
|
|
652
|
+
0 (Kingsoft joystick 4's fire is on the serial pin SP2, not port B),
|
|
653
|
+
and the result is FAIL. A 4-player read is written for one adapter.
|
|
654
|
+
|
|
655
|
+
## Why this works
|
|
656
|
+
|
|
657
|
+
With `$DD03` at `$80`, a write to `$DD01` drives only PB7; bits 0 to 6
|
|
658
|
+
stay inputs and the write does not touch them. PB7 goes to the adapter's
|
|
659
|
+
multiplexer, a 74LS257 in VICE's pin table, which passes joystick 3's
|
|
660
|
+
four direction lines to PB0-PB3 when PB7 is high and joystick 4's when
|
|
661
|
+
it is low. The two fire lines bypass the multiplexer and sit on PB4 and
|
|
662
|
+
PB5 all the time. So the read needs one select write before each
|
|
663
|
+
direction read, and joystick 4's fire has to be moved from bit 5 to
|
|
664
|
+
bit 4 to match the `$DC00` layout the rest of a game already decodes.
|
|
665
|
+
|
|
666
|
+
VICE changes the multiplexer at the store; a load 4 cycles later sees
|
|
667
|
+
the new joystick. No settle time on real hardware is measured here.
|
|
668
|
+
|
|
669
|
+
Ports 1 and 2 need `$DC00` to drive no keyboard column: the recipe writes
|
|
670
|
+
`$FF` there and owns the machine (`SEI`, CIA1 interrupts off), so no
|
|
671
|
+
KERNAL scan rewrites it between frames. With the KERNAL IRQ live, see
|
|
672
|
+
`pitfalls/input.md` for what the scan does to `$DC00`.
|