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,1019 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: reu-dma
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [reu_dma]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [DF00, DF01, DF02, DF03, DF04, DF05, DF06, DF07, DF08, DF09, DF0A, D000, D001, D002, D003, D004, D005, D006, D007, D008, D009, D00A, D00B, D00C, D00D, D00E, D00F, D011, D012, D015, D020, DD04, DD05, DD06, DD07, DD0E, DD0F]
|
|
9
|
+
uses_kernal: [CHROUT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — REU DMA: detect, stash, fetch, fill, swap, verify
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A test bench for a 17xx RAM Expansion Unit. It detects the REU, then
|
|
19
|
+
runs each transfer type once and checks the result with the CPU: stash a
|
|
20
|
+
4 KB block, fetch 1,000 bytes into screen RAM, fill colour RAM from one
|
|
21
|
+
REU byte (REU address fixed), swap two 4 KB blocks, verify two blocks,
|
|
22
|
+
and verify once more after changing one byte on purpose to read the
|
|
23
|
+
fault bit and the stop address. It fetches 4 KB into the RAM under I/O
|
|
24
|
+
with the `$FF00` trigger and stashes 64 KB from one C64 byte (C64
|
|
25
|
+
address fixed). Every transfer is timed with the CIA2 timers: with the
|
|
26
|
+
screen blanked, with the screen on, and with eight sprites on. The
|
|
27
|
+
program prints the counts, cycles per byte for the 4 KB and 64 KB
|
|
28
|
+
transfers, and a verdict: `$02FF` = `$01` and a green border when every
|
|
29
|
+
check passed, `$02FF` = `$02` and a red border otherwise. Last, it
|
|
30
|
+
fetches the pattern into screen rows 17 to 24 and colours them yellow
|
|
31
|
+
from the REU, so the screenshot shows both transfers. The technique is
|
|
32
|
+
`reu_dma` in `techniques/memory-banking.md`.
|
|
33
|
+
|
|
34
|
+
## Source
|
|
35
|
+
|
|
36
|
+
```asm
|
|
37
|
+
// reu-dma.asm
|
|
38
|
+
// Detects a 17xx REU, then drives each transfer type and checks it with
|
|
39
|
+
// the CPU: stash a 4 KB block, fetch 1,000 bytes into screen RAM, fill
|
|
40
|
+
// colour RAM from one REU byte (REU address fixed), swap two 4 KB blocks,
|
|
41
|
+
// verify a block (and report the fault bit on a byte changed on purpose),
|
|
42
|
+
// fetch 4 KB into the RAM under I/O with the $FF00 trigger, and stash
|
|
43
|
+
// 64 KB from one C64 byte (C64 address fixed) with the screen blanked and
|
|
44
|
+
// with it on. Each transfer is timed with the CIA2 timers. Prints the
|
|
45
|
+
// cycle counts, cycles per byte for the 4 KB and 64 KB transfers, and the
|
|
46
|
+
// verdict: $02FF = $01 and a green border when every check passed, $02FF
|
|
47
|
+
// = $02 and a red border otherwise. Then it fetches a pattern into the
|
|
48
|
+
// lower screen rows and colours them from the REU, so the screenshot
|
|
49
|
+
// shows both.
|
|
50
|
+
|
|
51
|
+
BasicUpstart2(start)
|
|
52
|
+
|
|
53
|
+
.const CHROUT = $ffd2
|
|
54
|
+
.const RESULT = $02ff
|
|
55
|
+
.const BORDER = $d020
|
|
56
|
+
.const CODE_PASS = $01
|
|
57
|
+
.const CODE_FAIL = $02
|
|
58
|
+
|
|
59
|
+
.const REU_STATUS = $df00
|
|
60
|
+
.const REU_CMD = $df01
|
|
61
|
+
.const REU_C64 = $df02 // lo, hi
|
|
62
|
+
.const REU_REU = $df04 // lo, hi, bank
|
|
63
|
+
.const REU_LEN = $df07 // lo, hi; 0 = 65,536
|
|
64
|
+
.const REU_IMASK = $df09
|
|
65
|
+
.const REU_ACTRL = $df0a
|
|
66
|
+
|
|
67
|
+
// $DF01 command bytes. Bit 7 execute, bit 4 set = start now (clear = wait
|
|
68
|
+
// for a write to $FF00), bits 1-0 the transfer type.
|
|
69
|
+
.const STASH = $90 // C64 -> REU
|
|
70
|
+
.const FETCH = $91 // REU -> C64
|
|
71
|
+
.const SWAP = $92
|
|
72
|
+
.const VERIFY = $93
|
|
73
|
+
.const FETCH_FF00 = $81 // REU -> C64, deferred to a write of $FF00
|
|
74
|
+
|
|
75
|
+
// $DF0A address control
|
|
76
|
+
.const NOFIX = $00
|
|
77
|
+
.const FIXC64 = $80
|
|
78
|
+
.const FIXREU = $40
|
|
79
|
+
|
|
80
|
+
.const BLOCK_A = $3000 // 4 KB, pattern A
|
|
81
|
+
.const BLOCK_B = $4000 // 4 KB, pattern B = A EOR $FF
|
|
82
|
+
.const SCREEN = $0400
|
|
83
|
+
.const COLRAM = $d800
|
|
84
|
+
.const POKE_AT = $0abc // offset of the byte changed before the failing verify
|
|
85
|
+
.const LOWROW = 17 // first screen row of the final visible fetch
|
|
86
|
+
.const FILLCOL = 7 // yellow
|
|
87
|
+
|
|
88
|
+
.const ptr = $fb
|
|
89
|
+
.const ptr2 = $fd
|
|
90
|
+
|
|
91
|
+
// Reu(c64, reuaddr, bank, len, ctrl): load the address, length and
|
|
92
|
+
// address-control registers. The command is written separately.
|
|
93
|
+
.macro Reu(c64, reuaddr, bank, len, ctrl) {
|
|
94
|
+
lda #<c64
|
|
95
|
+
sta REU_C64
|
|
96
|
+
lda #>c64
|
|
97
|
+
sta REU_C64+1
|
|
98
|
+
lda #<reuaddr
|
|
99
|
+
sta REU_REU
|
|
100
|
+
lda #>reuaddr
|
|
101
|
+
sta REU_REU+1
|
|
102
|
+
lda #bank
|
|
103
|
+
sta REU_REU+2
|
|
104
|
+
lda #<len
|
|
105
|
+
sta REU_LEN
|
|
106
|
+
lda #>len
|
|
107
|
+
sta REU_LEN+1
|
|
108
|
+
lda #ctrl
|
|
109
|
+
sta REU_ACTRL
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Time(routine, slot): CIA2 timer A counts phi2, timer B counts A's
|
|
113
|
+
// underflows; slot receives the 24-bit elapsed count.
|
|
114
|
+
.macro Time(routine, slot) {
|
|
115
|
+
lda #$51
|
|
116
|
+
sta $dd0f
|
|
117
|
+
lda #$11
|
|
118
|
+
sta $dd0e
|
|
119
|
+
jsr routine
|
|
120
|
+
lda #$00
|
|
121
|
+
sta $dd0e
|
|
122
|
+
sta $dd0f
|
|
123
|
+
lda #$ff
|
|
124
|
+
sbc $dd04
|
|
125
|
+
sta slot
|
|
126
|
+
lda #$ff
|
|
127
|
+
sbc $dd05
|
|
128
|
+
sta slot+1
|
|
129
|
+
lda #$ff
|
|
130
|
+
sbc $dd06
|
|
131
|
+
sta slot+2
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Go(command, slot): time "write command to $DF01", net of the harness.
|
|
135
|
+
.macro Go(command, slot) {
|
|
136
|
+
lda #command
|
|
137
|
+
sta cmd
|
|
138
|
+
Time(exec, slot)
|
|
139
|
+
Net(slot)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.macro Net(slot) {
|
|
143
|
+
sec
|
|
144
|
+
lda slot
|
|
145
|
+
sbc empty
|
|
146
|
+
sta slot
|
|
147
|
+
lda slot+1
|
|
148
|
+
sbc empty+1
|
|
149
|
+
sta slot+1
|
|
150
|
+
lda slot+2
|
|
151
|
+
sbc empty+2
|
|
152
|
+
sta slot+2
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.macro Fail(bit) {
|
|
156
|
+
lda failmask
|
|
157
|
+
ora #bit
|
|
158
|
+
sta failmask
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.macro Line(text, slot) {
|
|
162
|
+
ldx #<text
|
|
163
|
+
ldy #>text
|
|
164
|
+
jsr puts
|
|
165
|
+
ldx #<slot
|
|
166
|
+
ldy #>slot
|
|
167
|
+
jsr putdec
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Nl(): end the line
|
|
171
|
+
.macro Nl() {
|
|
172
|
+
lda #$0d
|
|
173
|
+
jsr CHROUT
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// PerByte(slot, shift): print slot * 25 >> shift as d.dd; with shift 10
|
|
177
|
+
// that is cycles per byte of a 4,096-byte transfer, with 14 of a 65,536.
|
|
178
|
+
.macro PerByte(slot, shift) {
|
|
179
|
+
ldx #<slot
|
|
180
|
+
ldy #>slot
|
|
181
|
+
lda #shift
|
|
182
|
+
jsr perbyte
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
start:
|
|
186
|
+
sei
|
|
187
|
+
lda #$00
|
|
188
|
+
sta failmask
|
|
189
|
+
sta $dd0e
|
|
190
|
+
sta $dd0f
|
|
191
|
+
lda #$ff
|
|
192
|
+
sta $dd04
|
|
193
|
+
sta $dd05
|
|
194
|
+
sta $dd06
|
|
195
|
+
sta $dd07
|
|
196
|
+
lda #$93 // clear the screen before anything lands on it
|
|
197
|
+
jsr CHROUT
|
|
198
|
+
|
|
199
|
+
// --- detection: write 1..7 to $DF02-$DF08, read them back; $DF06 is
|
|
200
|
+
// compared on bits 2-0 only (bits 7-3 read back as 1 in VICE 512 KB)
|
|
201
|
+
ldx #$00
|
|
202
|
+
!: txa
|
|
203
|
+
clc
|
|
204
|
+
adc #$01
|
|
205
|
+
sta REU_C64,x
|
|
206
|
+
inx
|
|
207
|
+
cpx #$07
|
|
208
|
+
bne !-
|
|
209
|
+
ldx #$00
|
|
210
|
+
!: lda REU_C64,x
|
|
211
|
+
sta seen,x
|
|
212
|
+
inx
|
|
213
|
+
cpx #$07
|
|
214
|
+
bne !-
|
|
215
|
+
ldx #$00
|
|
216
|
+
stx found
|
|
217
|
+
!: lda seen,x
|
|
218
|
+
and detmask,x // the bank register keeps only its low bits
|
|
219
|
+
sta cmpv
|
|
220
|
+
txa
|
|
221
|
+
clc
|
|
222
|
+
adc #$01
|
|
223
|
+
cmp cmpv
|
|
224
|
+
bne detected
|
|
225
|
+
inx
|
|
226
|
+
cpx #$07
|
|
227
|
+
bne !-
|
|
228
|
+
inc found // all seven read back
|
|
229
|
+
detected:
|
|
230
|
+
lda found
|
|
231
|
+
bne reu_present
|
|
232
|
+
jsr showdet
|
|
233
|
+
ldx #<noreutext
|
|
234
|
+
ldy #>noreutext
|
|
235
|
+
jsr puts
|
|
236
|
+
lda #CODE_FAIL
|
|
237
|
+
sta RESULT
|
|
238
|
+
lda #2
|
|
239
|
+
sta BORDER
|
|
240
|
+
cli
|
|
241
|
+
rts
|
|
242
|
+
reu_present:
|
|
243
|
+
sei // CHROUT to the screen ends with CLI; mask again
|
|
244
|
+
|
|
245
|
+
// --- patterns A at $3000 and B = A EOR $FF at $4000 ------------------
|
|
246
|
+
ldx #$00
|
|
247
|
+
!:
|
|
248
|
+
.for (var p = 0; p < 16; p++) {
|
|
249
|
+
txa
|
|
250
|
+
eor #(p * 37 + 11) & $ff
|
|
251
|
+
sta BLOCK_A + p * 256,x
|
|
252
|
+
eor #$ff
|
|
253
|
+
sta BLOCK_B + p * 256,x
|
|
254
|
+
}
|
|
255
|
+
inx
|
|
256
|
+
beq !+
|
|
257
|
+
jmp !-
|
|
258
|
+
!:
|
|
259
|
+
lda #$00
|
|
260
|
+
sta REU_IMASK // no REU interrupts
|
|
261
|
+
lda REU_STATUS // reading clears the fault bit (codebase64)
|
|
262
|
+
|
|
263
|
+
// screen off; DEN is sampled on line $30, so wait for the next frame
|
|
264
|
+
lda $d011
|
|
265
|
+
and #$ef
|
|
266
|
+
sta $d011
|
|
267
|
+
jsr newframe
|
|
268
|
+
|
|
269
|
+
Time(nothing, empty)
|
|
270
|
+
|
|
271
|
+
// --- 1-byte stash: the fixed cost of one command -------------------
|
|
272
|
+
Reu(colbyte, $0000, 2, 1, NOFIX)
|
|
273
|
+
Go(STASH, t_one) // REU 2:0000 = the fill colour, used below
|
|
274
|
+
lda REU_STATUS
|
|
275
|
+
sta status // after a completed stash
|
|
276
|
+
|
|
277
|
+
// --- stash A to REU 0:0000 and B to REU 1:0000 ---------------------
|
|
278
|
+
Reu(BLOCK_A, $0000, 0, $1000, NOFIX)
|
|
279
|
+
Go(STASH, t_stash)
|
|
280
|
+
Reu(BLOCK_B, $0000, 1, $1000, NOFIX)
|
|
281
|
+
Go(STASH, t_tmp)
|
|
282
|
+
|
|
283
|
+
// --- fetch 1,000 bytes of A into screen RAM -------------------------
|
|
284
|
+
Reu(SCREEN, $0000, 0, 1000, NOFIX)
|
|
285
|
+
Go(FETCH, t_fetch)
|
|
286
|
+
ldx #<SCREEN
|
|
287
|
+
ldy #>SCREEN
|
|
288
|
+
lda #>BLOCK_A
|
|
289
|
+
jsr cmp1000
|
|
290
|
+
beq !+
|
|
291
|
+
Fail($01)
|
|
292
|
+
!:
|
|
293
|
+
|
|
294
|
+
// --- fill colour RAM from one REU byte (REU address fixed) ----------
|
|
295
|
+
Reu(COLRAM, $0000, 2, 1000, FIXREU)
|
|
296
|
+
Go(FETCH, t_fill)
|
|
297
|
+
lda #>COLRAM
|
|
298
|
+
sta ptr+1
|
|
299
|
+
lda #<COLRAM
|
|
300
|
+
sta ptr
|
|
301
|
+
ldx #4 // 4 x 250
|
|
302
|
+
ldy #$00
|
|
303
|
+
!: lda (ptr),y
|
|
304
|
+
and #$0f
|
|
305
|
+
cmp #FILLCOL
|
|
306
|
+
bne fillbad
|
|
307
|
+
iny
|
|
308
|
+
cpy #250
|
|
309
|
+
bne !-
|
|
310
|
+
ldy #$00
|
|
311
|
+
clc
|
|
312
|
+
lda ptr
|
|
313
|
+
adc #250
|
|
314
|
+
sta ptr
|
|
315
|
+
bcc !+
|
|
316
|
+
inc ptr+1
|
|
317
|
+
!: dex
|
|
318
|
+
bne !--
|
|
319
|
+
beq filled
|
|
320
|
+
fillbad:
|
|
321
|
+
Fail($02)
|
|
322
|
+
filled:
|
|
323
|
+
|
|
324
|
+
// --- swap C64 $3000 (A) with REU 1:0000 (B), check, swap back ------
|
|
325
|
+
Reu(BLOCK_A, $0000, 1, $1000, NOFIX)
|
|
326
|
+
Go(SWAP, t_swap)
|
|
327
|
+
lda #>BLOCK_A
|
|
328
|
+
ldx #>BLOCK_B
|
|
329
|
+
jsr cmp4k // $3000 must now hold B
|
|
330
|
+
beq !+
|
|
331
|
+
Fail($04)
|
|
332
|
+
!: Reu(BLOCK_A, $0000, 1, $1000, NOFIX)
|
|
333
|
+
Go(SWAP, t_tmp) // A back in C64, B back in REU bank 1
|
|
334
|
+
|
|
335
|
+
// --- verify: A against REU 0, B against REU 1, then a changed byte --
|
|
336
|
+
lda REU_STATUS
|
|
337
|
+
Reu(BLOCK_A, $0000, 0, $1000, NOFIX)
|
|
338
|
+
Go(VERIFY, t_verify)
|
|
339
|
+
lda REU_STATUS
|
|
340
|
+
and #$20
|
|
341
|
+
beq !+
|
|
342
|
+
Fail($08)
|
|
343
|
+
!: Reu(BLOCK_B, $0000, 1, $1000, NOFIX)
|
|
344
|
+
Go(VERIFY, t_tmp)
|
|
345
|
+
lda REU_STATUS
|
|
346
|
+
and #$20
|
|
347
|
+
beq !+
|
|
348
|
+
Fail($08)
|
|
349
|
+
!: lda BLOCK_A + POKE_AT
|
|
350
|
+
eor #$ff
|
|
351
|
+
sta BLOCK_A + POKE_AT
|
|
352
|
+
Reu(BLOCK_A, $0000, 0, $1000, NOFIX)
|
|
353
|
+
Go(VERIFY, t_tmp)
|
|
354
|
+
lda REU_STATUS
|
|
355
|
+
sta vstatus
|
|
356
|
+
lda REU_C64
|
|
357
|
+
sta vaddr
|
|
358
|
+
lda REU_C64+1
|
|
359
|
+
sta vaddr+1
|
|
360
|
+
lda BLOCK_A + POKE_AT // put the byte back
|
|
361
|
+
eor #$ff
|
|
362
|
+
sta BLOCK_A + POKE_AT
|
|
363
|
+
lda vstatus
|
|
364
|
+
and #$20
|
|
365
|
+
bne !+
|
|
366
|
+
Fail($10) // the fault bit did not come up
|
|
367
|
+
!:
|
|
368
|
+
|
|
369
|
+
// --- $FF00 trigger: fetch A into the RAM under I/O -------------------
|
|
370
|
+
Reu($d000, $0000, 0, $1000, NOFIX)
|
|
371
|
+
lda #FETCH_FF00
|
|
372
|
+
sta REU_CMD // armed; nothing moves yet
|
|
373
|
+
lda #$34 // RAM at $D000-$DFFF (and $A000, $E000)
|
|
374
|
+
sta $01
|
|
375
|
+
lda $ff00 // the write, not the value, starts the DMA
|
|
376
|
+
sta $ff00
|
|
377
|
+
lda #>$d000
|
|
378
|
+
ldx #>BLOCK_A
|
|
379
|
+
jsr cmp4k
|
|
380
|
+
php
|
|
381
|
+
lda #$37
|
|
382
|
+
sta $01
|
|
383
|
+
plp
|
|
384
|
+
beq !+
|
|
385
|
+
Fail($20)
|
|
386
|
+
!:
|
|
387
|
+
|
|
388
|
+
// --- 64 KB stash from one C64 byte (C64 address fixed) -------------
|
|
389
|
+
Reu(BLOCK_A, $0000, 3, $0000, FIXC64)
|
|
390
|
+
Go(STASH, t_64off)
|
|
391
|
+
lda REU_STATUS
|
|
392
|
+
Reu(BLOCK_A, $0000, 3, $0000, FIXC64)
|
|
393
|
+
Go(VERIFY, t_tmp) // all 65,536 REU bytes equal BLOCK_A[0]
|
|
394
|
+
lda REU_STATUS
|
|
395
|
+
and #$20
|
|
396
|
+
beq !+
|
|
397
|
+
Fail($40)
|
|
398
|
+
!:
|
|
399
|
+
lda $d011 // screen on, then time the same stash
|
|
400
|
+
ora #$10
|
|
401
|
+
sta $d011
|
|
402
|
+
jsr newframe
|
|
403
|
+
Reu(BLOCK_A, $0000, 3, $0000, FIXC64)
|
|
404
|
+
Go(STASH, t_64on)
|
|
405
|
+
|
|
406
|
+
// sprite DMA on top: all eight sprites on lines 100-120, same stash
|
|
407
|
+
lda #$ff
|
|
408
|
+
sta $d015
|
|
409
|
+
ldx #$0e
|
|
410
|
+
!: txa
|
|
411
|
+
asl
|
|
412
|
+
asl
|
|
413
|
+
asl
|
|
414
|
+
adc #$30
|
|
415
|
+
sta $d000,x // X = $30 + 16 * n
|
|
416
|
+
lda #100
|
|
417
|
+
sta $d001,x
|
|
418
|
+
dex
|
|
419
|
+
dex
|
|
420
|
+
bpl !-
|
|
421
|
+
jsr newframe
|
|
422
|
+
Reu(BLOCK_A, $0000, 3, $0000, FIXC64)
|
|
423
|
+
Go(STASH, t_64spr)
|
|
424
|
+
lda #$00
|
|
425
|
+
sta $d015
|
|
426
|
+
|
|
427
|
+
// --- report ---------------------------------------------------------
|
|
428
|
+
lda #$93
|
|
429
|
+
jsr CHROUT
|
|
430
|
+
jsr showdet
|
|
431
|
+
ldx #<stattext
|
|
432
|
+
ldy #>stattext
|
|
433
|
+
jsr puts
|
|
434
|
+
lda status
|
|
435
|
+
jsr hexbyte
|
|
436
|
+
Line(onetext, t_one)
|
|
437
|
+
Nl()
|
|
438
|
+
Line(stashtext, t_stash)
|
|
439
|
+
PerByte(t_stash, 10)
|
|
440
|
+
Nl()
|
|
441
|
+
Line(fetchtext, t_fetch)
|
|
442
|
+
Nl()
|
|
443
|
+
Line(filltext, t_fill)
|
|
444
|
+
Nl()
|
|
445
|
+
Line(swaptext, t_swap)
|
|
446
|
+
PerByte(t_swap, 10)
|
|
447
|
+
Nl()
|
|
448
|
+
Line(veritext, t_verify)
|
|
449
|
+
PerByte(t_verify, 10)
|
|
450
|
+
Nl()
|
|
451
|
+
ldx #<errtext
|
|
452
|
+
ldy #>errtext
|
|
453
|
+
jsr puts
|
|
454
|
+
lda vstatus
|
|
455
|
+
jsr hexbyte
|
|
456
|
+
ldx #<attext
|
|
457
|
+
ldy #>attext
|
|
458
|
+
jsr puts
|
|
459
|
+
lda vaddr+1
|
|
460
|
+
jsr hexbyte
|
|
461
|
+
lda vaddr
|
|
462
|
+
jsr hexbyte
|
|
463
|
+
Nl()
|
|
464
|
+
Line(offtext, t_64off)
|
|
465
|
+
PerByte(t_64off, 14)
|
|
466
|
+
Nl()
|
|
467
|
+
Line(ontext, t_64on)
|
|
468
|
+
PerByte(t_64on, 14)
|
|
469
|
+
Nl()
|
|
470
|
+
Line(sprtext, t_64spr)
|
|
471
|
+
PerByte(t_64spr, 14)
|
|
472
|
+
Nl()
|
|
473
|
+
|
|
474
|
+
// --- visible: fetch A into rows 17-24, colour them from the REU -----
|
|
475
|
+
Reu(SCREEN + LOWROW * 40, $0000, 0, (25 - LOWROW) * 40, NOFIX)
|
|
476
|
+
lda #FETCH
|
|
477
|
+
sta REU_CMD
|
|
478
|
+
Reu(COLRAM + LOWROW * 40, $0000, 2, (25 - LOWROW) * 40, FIXREU)
|
|
479
|
+
lda #FETCH
|
|
480
|
+
sta REU_CMD
|
|
481
|
+
|
|
482
|
+
lda failmask
|
|
483
|
+
beq pass
|
|
484
|
+
lda #CODE_FAIL
|
|
485
|
+
ldy #2
|
|
486
|
+
bne verdict
|
|
487
|
+
pass:
|
|
488
|
+
lda #CODE_PASS
|
|
489
|
+
ldy #5
|
|
490
|
+
verdict:
|
|
491
|
+
sta RESULT
|
|
492
|
+
sty BORDER
|
|
493
|
+
ldx #<restext
|
|
494
|
+
ldy #>restext
|
|
495
|
+
jsr puts
|
|
496
|
+
lda RESULT
|
|
497
|
+
jsr hexbyte
|
|
498
|
+
ldx #<passtext
|
|
499
|
+
ldy #>passtext
|
|
500
|
+
lda failmask
|
|
501
|
+
beq !+
|
|
502
|
+
ldx #<failtext
|
|
503
|
+
ldy #>failtext
|
|
504
|
+
!: jsr puts
|
|
505
|
+
ldx #<masktext
|
|
506
|
+
ldy #>masktext
|
|
507
|
+
jsr puts
|
|
508
|
+
lda failmask
|
|
509
|
+
jsr hexbyte
|
|
510
|
+
lda #$0d
|
|
511
|
+
jsr CHROUT
|
|
512
|
+
cli
|
|
513
|
+
rts
|
|
514
|
+
|
|
515
|
+
// showdet: print the seven bytes read back and YES or NO
|
|
516
|
+
showdet:
|
|
517
|
+
ldx #<dettext
|
|
518
|
+
ldy #>dettext
|
|
519
|
+
jsr puts
|
|
520
|
+
ldx #$00
|
|
521
|
+
!: lda seen,x
|
|
522
|
+
jsr hexbyte
|
|
523
|
+
lda #' '
|
|
524
|
+
jsr CHROUT
|
|
525
|
+
inx
|
|
526
|
+
cpx #$07
|
|
527
|
+
bne !-
|
|
528
|
+
ldx #<yestext
|
|
529
|
+
ldy #>yestext
|
|
530
|
+
lda found
|
|
531
|
+
bne !+
|
|
532
|
+
ldx #<notext
|
|
533
|
+
ldy #>notext
|
|
534
|
+
!: jmp puts
|
|
535
|
+
|
|
536
|
+
exec:
|
|
537
|
+
lda cmd
|
|
538
|
+
sta REU_CMD
|
|
539
|
+
nothing:
|
|
540
|
+
rts
|
|
541
|
+
|
|
542
|
+
newframe: // wait until the raster wraps to line 0
|
|
543
|
+
!: lda $d011
|
|
544
|
+
bpl !-
|
|
545
|
+
!: lda $d011
|
|
546
|
+
bmi !-
|
|
547
|
+
!: lda $d012
|
|
548
|
+
bne !-
|
|
549
|
+
rts
|
|
550
|
+
|
|
551
|
+
// cmp1000: compare 1,000 bytes at Y:X with 1,000 from page A; Z set if equal
|
|
552
|
+
cmp1000:
|
|
553
|
+
stx ptr
|
|
554
|
+
sty ptr+1
|
|
555
|
+
sta ptr2+1
|
|
556
|
+
lda #$00
|
|
557
|
+
sta ptr2
|
|
558
|
+
ldx #3 // three whole pages
|
|
559
|
+
ldy #$00
|
|
560
|
+
!: lda (ptr),y
|
|
561
|
+
cmp (ptr2),y
|
|
562
|
+
bne c1done
|
|
563
|
+
iny
|
|
564
|
+
bne !-
|
|
565
|
+
inc ptr+1
|
|
566
|
+
inc ptr2+1
|
|
567
|
+
dex
|
|
568
|
+
bne !-
|
|
569
|
+
!: lda (ptr),y // then the last 232 bytes
|
|
570
|
+
cmp (ptr2),y
|
|
571
|
+
bne c1done
|
|
572
|
+
iny
|
|
573
|
+
cpy #1000 - 768
|
|
574
|
+
bne !-
|
|
575
|
+
lda #$00 // Z set: equal
|
|
576
|
+
c1done:
|
|
577
|
+
rts
|
|
578
|
+
|
|
579
|
+
// cmp4k: compare 16 pages starting at page A with 16 starting at page X;
|
|
580
|
+
// Z set if equal
|
|
581
|
+
cmp4k:
|
|
582
|
+
sta c4a+2
|
|
583
|
+
stx c4b+2
|
|
584
|
+
ldx #16
|
|
585
|
+
ldy #$00
|
|
586
|
+
c4a:
|
|
587
|
+
lda $ff00,y
|
|
588
|
+
c4b:
|
|
589
|
+
cmp $ff00,y
|
|
590
|
+
bne c4done
|
|
591
|
+
iny
|
|
592
|
+
bne c4a
|
|
593
|
+
inc c4a+2
|
|
594
|
+
inc c4b+2
|
|
595
|
+
dex
|
|
596
|
+
bne c4a
|
|
597
|
+
c4done:
|
|
598
|
+
rts
|
|
599
|
+
|
|
600
|
+
// perbyte: num = slot(Y:X) * 25 >> A, printed as d.dd
|
|
601
|
+
perbyte:
|
|
602
|
+
sta shift
|
|
603
|
+
stx ptr
|
|
604
|
+
sty ptr+1
|
|
605
|
+
ldy #$00
|
|
606
|
+
!: lda (ptr),y
|
|
607
|
+
sta num,y
|
|
608
|
+
sta x1,y
|
|
609
|
+
iny
|
|
610
|
+
cpy #3
|
|
611
|
+
bne !-
|
|
612
|
+
ldx #3 // num = x * 8
|
|
613
|
+
!: asl num
|
|
614
|
+
rol num+1
|
|
615
|
+
rol num+2
|
|
616
|
+
dex
|
|
617
|
+
bne !-
|
|
618
|
+
clc // x1 = x + 8x
|
|
619
|
+
ldy #$00
|
|
620
|
+
ldx #3
|
|
621
|
+
!: lda x1,y
|
|
622
|
+
adc num,y
|
|
623
|
+
sta x1,y
|
|
624
|
+
iny
|
|
625
|
+
dex
|
|
626
|
+
bne !-
|
|
627
|
+
asl num // num = 16x
|
|
628
|
+
rol num+1
|
|
629
|
+
rol num+2
|
|
630
|
+
clc // num = 25x
|
|
631
|
+
ldy #$00
|
|
632
|
+
ldx #3
|
|
633
|
+
!: lda x1,y
|
|
634
|
+
adc num,y
|
|
635
|
+
sta num,y
|
|
636
|
+
iny
|
|
637
|
+
dex
|
|
638
|
+
bne !-
|
|
639
|
+
ldx shift
|
|
640
|
+
!: lsr num+2
|
|
641
|
+
ror num+1
|
|
642
|
+
ror num
|
|
643
|
+
dex
|
|
644
|
+
bne !-
|
|
645
|
+
lda #' '
|
|
646
|
+
jsr CHROUT
|
|
647
|
+
lda #1
|
|
648
|
+
sta fix
|
|
649
|
+
jsr putnum
|
|
650
|
+
lda #0
|
|
651
|
+
sta fix
|
|
652
|
+
rts
|
|
653
|
+
|
|
654
|
+
// output helpers ---------------------------------------------------------
|
|
655
|
+
puts:
|
|
656
|
+
stx ptr
|
|
657
|
+
sty ptr+1
|
|
658
|
+
ldy #$00
|
|
659
|
+
!: lda (ptr),y
|
|
660
|
+
beq !+
|
|
661
|
+
jsr CHROUT
|
|
662
|
+
iny
|
|
663
|
+
bne !-
|
|
664
|
+
!: rts
|
|
665
|
+
|
|
666
|
+
putdec: // print the 24-bit slot at Y:X
|
|
667
|
+
stx ptr
|
|
668
|
+
sty ptr+1
|
|
669
|
+
ldy #$00
|
|
670
|
+
!: lda (ptr),y
|
|
671
|
+
sta num,y
|
|
672
|
+
iny
|
|
673
|
+
cpy #3
|
|
674
|
+
bne !-
|
|
675
|
+
jmp putnum
|
|
676
|
+
|
|
677
|
+
putnum: // print num in decimal; fix = 1: as d.dd
|
|
678
|
+
ldx #$00
|
|
679
|
+
stx lead
|
|
680
|
+
digit:
|
|
681
|
+
lda #'0' - 1
|
|
682
|
+
sta dig
|
|
683
|
+
!: inc dig
|
|
684
|
+
sec
|
|
685
|
+
lda num
|
|
686
|
+
sbc pow10,x
|
|
687
|
+
sta num
|
|
688
|
+
lda num+1
|
|
689
|
+
sbc pow10+1,x
|
|
690
|
+
sta num+1
|
|
691
|
+
lda num+2
|
|
692
|
+
sbc pow10+2,x
|
|
693
|
+
sta num+2
|
|
694
|
+
bcs !-
|
|
695
|
+
lda num
|
|
696
|
+
adc pow10,x
|
|
697
|
+
sta num
|
|
698
|
+
lda num+1
|
|
699
|
+
adc pow10+1,x
|
|
700
|
+
sta num+1
|
|
701
|
+
lda num+2
|
|
702
|
+
adc pow10+2,x
|
|
703
|
+
sta num+2
|
|
704
|
+
lda fix
|
|
705
|
+
beq plain
|
|
706
|
+
cpx #5 * 3 // tens of hundredths: the point goes first
|
|
707
|
+
bne !+
|
|
708
|
+
lda #'.'
|
|
709
|
+
jsr CHROUT
|
|
710
|
+
!: cpx #4 * 3 // units digit and after always print
|
|
711
|
+
bcs show
|
|
712
|
+
plain:
|
|
713
|
+
lda dig
|
|
714
|
+
cmp #'0'
|
|
715
|
+
bne show
|
|
716
|
+
cpx #6 * 3
|
|
717
|
+
beq show
|
|
718
|
+
lda lead
|
|
719
|
+
beq next
|
|
720
|
+
show:
|
|
721
|
+
lda dig
|
|
722
|
+
jsr CHROUT
|
|
723
|
+
inc lead
|
|
724
|
+
next:
|
|
725
|
+
inx
|
|
726
|
+
inx
|
|
727
|
+
inx
|
|
728
|
+
cpx #7 * 3
|
|
729
|
+
bne digit
|
|
730
|
+
rts
|
|
731
|
+
|
|
732
|
+
hexbyte:
|
|
733
|
+
pha
|
|
734
|
+
lsr
|
|
735
|
+
lsr
|
|
736
|
+
lsr
|
|
737
|
+
lsr
|
|
738
|
+
jsr hexdigit
|
|
739
|
+
pla
|
|
740
|
+
and #$0f
|
|
741
|
+
hexdigit:
|
|
742
|
+
cmp #10
|
|
743
|
+
bcc !+
|
|
744
|
+
adc #6
|
|
745
|
+
!: adc #'0'
|
|
746
|
+
jmp CHROUT
|
|
747
|
+
|
|
748
|
+
pow10: .byte <1000000, >1000000, 1000000 >> 16
|
|
749
|
+
.byte <100000, >100000, 100000 >> 16
|
|
750
|
+
.byte <10000, >10000, 0
|
|
751
|
+
.byte <1000, >1000, 0
|
|
752
|
+
.byte <100, >100, 0
|
|
753
|
+
.byte <10, >10, 0
|
|
754
|
+
.byte <1, >1, 0
|
|
755
|
+
|
|
756
|
+
colbyte: .byte FILLCOL
|
|
757
|
+
cmd: .byte 0
|
|
758
|
+
found: .byte 0
|
|
759
|
+
seen: .fill 7, 0
|
|
760
|
+
cmpv: .byte 0
|
|
761
|
+
detmask: .byte $ff, $ff, $ff, $ff, $07, $ff, $ff
|
|
762
|
+
status: .byte 0
|
|
763
|
+
vstatus: .byte 0
|
|
764
|
+
vaddr: .word 0
|
|
765
|
+
failmask: .byte 0
|
|
766
|
+
num: .byte 0, 0, 0
|
|
767
|
+
x1: .byte 0, 0, 0
|
|
768
|
+
dig: .byte 0
|
|
769
|
+
lead: .byte 0
|
|
770
|
+
fix: .byte 0
|
|
771
|
+
shift: .byte 0
|
|
772
|
+
|
|
773
|
+
empty: .byte 0, 0, 0
|
|
774
|
+
t_one: .byte 0, 0, 0
|
|
775
|
+
t_stash: .byte 0, 0, 0
|
|
776
|
+
t_fetch: .byte 0, 0, 0
|
|
777
|
+
t_fill: .byte 0, 0, 0
|
|
778
|
+
t_swap: .byte 0, 0, 0
|
|
779
|
+
t_verify: .byte 0, 0, 0
|
|
780
|
+
t_64off: .byte 0, 0, 0
|
|
781
|
+
t_64on: .byte 0, 0, 0
|
|
782
|
+
t_64spr: .byte 0, 0, 0
|
|
783
|
+
t_tmp: .byte 0, 0, 0
|
|
784
|
+
|
|
785
|
+
.encoding "petscii_upper"
|
|
786
|
+
dettext: .text "DETECT "
|
|
787
|
+
.byte 0
|
|
788
|
+
yestext: .text "YES"
|
|
789
|
+
.byte $0d, 0
|
|
790
|
+
notext: .text "NO"
|
|
791
|
+
.byte $0d, 0
|
|
792
|
+
noreutext: .text "RESULT 02 NO REU"
|
|
793
|
+
.byte $0d, 0
|
|
794
|
+
stattext: .text "STATUS "
|
|
795
|
+
.byte 0
|
|
796
|
+
onetext: .byte $0d
|
|
797
|
+
.text "1 BYTE "
|
|
798
|
+
.byte 0
|
|
799
|
+
stashtext: .text "STASH 4K "
|
|
800
|
+
.byte 0
|
|
801
|
+
fetchtext: .text "FETCH 1000 "
|
|
802
|
+
.byte 0
|
|
803
|
+
filltext: .text "FILL 1000 "
|
|
804
|
+
.byte 0
|
|
805
|
+
swaptext: .text "SWAP 4K "
|
|
806
|
+
.byte 0
|
|
807
|
+
veritext: .text "VERIFY 4K "
|
|
808
|
+
.byte 0
|
|
809
|
+
errtext: .text "VERIFY ERR "
|
|
810
|
+
.byte 0
|
|
811
|
+
attext: .text " AT "
|
|
812
|
+
.byte 0
|
|
813
|
+
offtext: .text "64K OFF "
|
|
814
|
+
.byte 0
|
|
815
|
+
ontext: .text "64K ON "
|
|
816
|
+
.byte 0
|
|
817
|
+
sprtext: .text "64K SPR "
|
|
818
|
+
.byte 0
|
|
819
|
+
restext: .text "RESULT "
|
|
820
|
+
.byte 0
|
|
821
|
+
passtext: .text " PASS"
|
|
822
|
+
.byte 0
|
|
823
|
+
failtext: .text " FAIL"
|
|
824
|
+
.byte 0
|
|
825
|
+
masktext: .text " MASK "
|
|
826
|
+
.byte 0
|
|
827
|
+
```
|
|
828
|
+
|
|
829
|
+
## Build
|
|
830
|
+
|
|
831
|
+
```bash
|
|
832
|
+
java -jar KickAss.jar reu-dma.asm -o reu-dma.prg
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
Produces `reu-dma.prg`, 3,506 bytes, `$0801` to `$15b0` (KickAssembler
|
|
836
|
+
5.25, `-showmem`). The REU is not part of the build; it is a VICE option
|
|
837
|
+
at run time:
|
|
838
|
+
|
|
839
|
+
```bash
|
|
840
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
841
|
+
-limitcycles 8000000 -reu -reusize 512 -exitscreenshot reu-dma.png -autostart reu-dma.prg
|
|
842
|
+
```
|
|
843
|
+
|
|
844
|
+
`x64sc -help` in VICE 3.10 lists `-reu`/`+reu`, `-reusize <size in KiB>`,
|
|
845
|
+
`-reuimage <Name>`, `-reuimagerw` and `-cartreu <Name>`.
|
|
846
|
+
|
|
847
|
+
## Expected output
|
|
848
|
+
|
|
849
|
+
Border green. Rows 0 to 12, PAL:
|
|
850
|
+
|
|
851
|
+
```text
|
|
852
|
+
DETECT 01 02 03 04 FD 06 07 YES
|
|
853
|
+
STATUS 50
|
|
854
|
+
1 BYTE 9
|
|
855
|
+
STASH 4K 4104 1.00
|
|
856
|
+
FETCH 1000 1008
|
|
857
|
+
FILL 1000 1008
|
|
858
|
+
SWAP 4K 8200 2.00
|
|
859
|
+
VERIFY 4K 4104 1.00
|
|
860
|
+
VERIFY ERR 30 AT 3ABD
|
|
861
|
+
64K OFF 65544 1.00
|
|
862
|
+
64K ON 69414 1.05
|
|
863
|
+
64K SPR 71134 1.08
|
|
864
|
+
RESULT 01 PASS MASK 00
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
`READY.` on row 14. Rows 17 to 24 hold the first 320 bytes of the
|
|
868
|
+
pattern as screen codes, in yellow. NTSC shows the same text except two
|
|
869
|
+
lines: `64K ON 69844 1.06` and `64K SPR 71439 1.09`.
|
|
870
|
+
|
|
871
|
+
Screenshots from the pinned runs, 8,000,000 cycles, with `-reu -reusize
|
|
872
|
+
512`: `screenshots/reu-dma.png` (PAL) and `screenshots/reu-dma-ntsc.png`
|
|
873
|
+
(NTSC). Measured on both: rows 0 to 12 decoded against the character ROM
|
|
874
|
+
as above; border pixel (2, 100) = (98, 213, 50) on PAL and (114, 189,
|
|
875
|
+
103) on NTSC, index 5; the ink on rows 17 to 24 is (255, 255, 70) on PAL
|
|
876
|
+
and (255, 248, 141) on NTSC, index 7, 888 pixels per row; the text rows
|
|
877
|
+
are index 14 ink on index 6. The pinned command was run twice per model
|
|
878
|
+
and the two PNGs were identical bytes.
|
|
879
|
+
|
|
880
|
+
What the lines mean, measured in VICE x64sc 3.10. Every count is net of
|
|
881
|
+
the harness (an empty `JSR`/`RTS` is timed first and subtracted) and
|
|
882
|
+
still includes the `LDA abs` / `STA $DF01` that starts the transfer,
|
|
883
|
+
4 + 4 = 8 cycles.
|
|
884
|
+
|
|
885
|
+
| Line | Transfer | Cycles | Less the 8-cycle start |
|
|
886
|
+
|---|---|---|---|
|
|
887
|
+
| `1 BYTE` | stash 1 byte | 9 | 1 |
|
|
888
|
+
| `STASH 4K` | stash 4,096 bytes, screen blanked | 4,104 | 4,096 |
|
|
889
|
+
| `FETCH 1000` | 1,000 bytes into screen RAM, blanked | 1,008 | 1,000 |
|
|
890
|
+
| `FILL 1000` | 1,000 bytes into colour RAM, REU address fixed, blanked | 1,008 | 1,000 |
|
|
891
|
+
| `SWAP 4K` | swap 4,096 bytes, blanked | 8,200 | 8,192 |
|
|
892
|
+
| `VERIFY 4K` | verify 4,096 equal bytes, blanked | 4,104 | 4,096 |
|
|
893
|
+
| `64K OFF` | stash 65,536 bytes (length 0), C64 address fixed, blanked | 65,544 | 65,536 |
|
|
894
|
+
| `64K ON` | the same, text screen on, started on raster line 0 | 69,414 PAL, 69,844 NTSC | 69,406, 69,836 |
|
|
895
|
+
| `64K SPR` | the same, plus eight sprites on lines 100 to 120 | 71,134 PAL, 71,439 NTSC | 71,126, 71,431 |
|
|
896
|
+
|
|
897
|
+
So a stash, fetch or verify costs one cycle per byte and a swap two,
|
|
898
|
+
with no set-up cost beyond the store to `$DF01`. The per-byte column is
|
|
899
|
+
printed as `count × 25 >> 10` for 4,096 bytes and `>> 14` for 65,536,
|
|
900
|
+
which is count / length to two decimals, truncated. The blanked counts
|
|
901
|
+
are the same on both models. An earlier build of this program, laid out
|
|
902
|
+
differently, printed every blanked count one cycle higher (10, 4,105,
|
|
903
|
+
1,009, 1,009, 8,201, 4,105, 65,545). The cause of that one cycle was
|
|
904
|
+
not established; the REU's one cycle per byte is the same in both.
|
|
905
|
+
|
|
906
|
+
With the screen on, the 64 KB stash took 3,870 cycles longer on PAL
|
|
907
|
+
(5.9 %) and 4,300 on NTSC (6.6 %). It ran for 3.5 PAL frames (69,414 /
|
|
908
|
+
19,656) and 4.1 NTSC frames (69,844 / 17,095), which crosses about 88
|
|
909
|
+
and 102 badlines: roughly 42 to 44 cycles per badline (arithmetic from
|
|
910
|
+
the measured totals, not a per-line measurement). Eight sprites on 21
|
|
911
|
+
lines added 1,720 cycles on PAL and 1,595 on NTSC.
|
|
912
|
+
|
|
913
|
+
The other lines:
|
|
914
|
+
|
|
915
|
+
- `DETECT`: the seven bytes read back from `$DF02-$DF08` after writing
|
|
916
|
+
1 to 7. `$DF06`, the bank register, reads `$FD` for a written 5: bits
|
|
917
|
+
7 to 3 read as 1 with `-reusize 512`. The test therefore compares
|
|
918
|
+
`$DF06` on bits 2 to 0 only.
|
|
919
|
+
- `STATUS 50`: `$DF00` after the 1-byte stash. Bit 6 (end of block) and
|
|
920
|
+
bit 4 (the size bit, set for a 256 KB-chip REU such as the 1750 and
|
|
921
|
+
1764 per codebase64) are set; the version bits read 0.
|
|
922
|
+
- `VERIFY ERR 30 AT 3ABD`: `$DF00` after a verify of `$3000-$3FFF`
|
|
923
|
+
against the REU with the byte at `$3ABC` inverted. Bit 5 (fault) and
|
|
924
|
+
bit 4 are set; bit 6 (end of block) is not. `$DF02/$DF03` read
|
|
925
|
+
`$3ABD`, one past the differing byte, so the verify stopped there.
|
|
926
|
+
Before that, both unchanged verifies left bit 5 clear.
|
|
927
|
+
- `MASK 00`: no check failed. Bit 0 is the screen fetch, bit 1 the
|
|
928
|
+
colour fill, bit 2 the swap, bit 3 the two clean verifies, bit 4 a
|
|
929
|
+
missing fault bit, bit 5 the `$FF00` fetch under I/O, bit 6 the 64 KB
|
|
930
|
+
verify.
|
|
931
|
+
|
|
932
|
+
### Without an REU
|
|
933
|
+
|
|
934
|
+
The same PRG run with no `-reu` flag, once per model, not pinned: the
|
|
935
|
+
border is red and the screen shows
|
|
936
|
+
|
|
937
|
+
```text
|
|
938
|
+
DETECT 00 00 00 00 00 00 00 NO
|
|
939
|
+
RESULT 02 NO REU
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
on PAL, and `DETECT 00 00 00 00 FF 00 00 NO` on NTSC. With nothing at
|
|
943
|
+
`$DF00-$DFFF` a read returns open bus, the byte the VIC-II last fetched
|
|
944
|
+
(`hardware/c64-registers-reference.md`, the `$DE00-$DFFF` section), so
|
|
945
|
+
the values depend on the model and the moment, and a read-back pattern
|
|
946
|
+
of 1 to 7 does not survive.
|
|
947
|
+
|
|
948
|
+
## Why this works
|
|
949
|
+
|
|
950
|
+
### Driving a transfer
|
|
951
|
+
|
|
952
|
+
Each transfer is the same five steps: the C64 address to `$DF02/$DF03`,
|
|
953
|
+
the REU address and bank to `$DF04-$DF06`, the length to `$DF07/$DF08`
|
|
954
|
+
(0 means 65,536), the address-control bits to `$DF0A`, then the command
|
|
955
|
+
to `$DF01`. The command bytes used here are `$90` stash, `$91` fetch,
|
|
956
|
+
`$92` swap and `$93` verify: bit 7 executes, bit 4 set starts at once,
|
|
957
|
+
bits 1 to 0 pick the type. The REU halts the CPU for the transfer, so
|
|
958
|
+
the instruction after the store runs when the last byte has moved. The
|
|
959
|
+
autoload bit 5 is never set, so the address and length registers are
|
|
960
|
+
left pointing past the transfer, and every transfer reloads all of them
|
|
961
|
+
(the `Reu` macro).
|
|
962
|
+
|
|
963
|
+
### Fixed addresses
|
|
964
|
+
|
|
965
|
+
The colour fill sets `$DF0A` bit 6, which holds the REU address still:
|
|
966
|
+
all 1,000 bytes come from REU `2:0000`, which the 1-byte stash had set to
|
|
967
|
+
7. The 64 KB stash sets bit 7 instead, which holds the C64 address
|
|
968
|
+
still: 65,536 reads of `$3000` land in REU bank 3, and the verify with
|
|
969
|
+
the same setting finds no difference. The same bit on a fetch writes
|
|
970
|
+
every REU byte to one C64 address, which is the digi case (`$D418`);
|
|
971
|
+
this program does not play one.
|
|
972
|
+
|
|
973
|
+
### The $FF00 trigger
|
|
974
|
+
|
|
975
|
+
A transfer to the RAM under I/O cannot be started the plain way: the
|
|
976
|
+
store to `$DF01` needs I/O visible, and the DMA uses the memory
|
|
977
|
+
configuration in force while it runs. So the program writes `$81` to
|
|
978
|
+
`$DF01` (execute, bit 4 clear) with I/O visible, which arms the
|
|
979
|
+
transfer and moves nothing. It then sets `$01` = `$34` and writes to
|
|
980
|
+
`$FF00`; that write starts the DMA, which now sees RAM at `$D000`
|
|
981
|
+
(measured: the 4 KB compared equal at `$34`, and the program went on to
|
|
982
|
+
time and print normally, which it could not do after 4 KB of pattern
|
|
983
|
+
had been written over the VIC and CIA registers; codebase64 describes
|
|
984
|
+
the same use). The check runs at `$34` too. `LDA $FF00` / `STA $FF00` writes back the byte
|
|
985
|
+
already there, so the RAM under the KERNAL is not changed. A test
|
|
986
|
+
program that read `$C055` after arming and after a read of `$FF00` found
|
|
987
|
+
it unchanged both times; after the write it held the fetched byte.
|
|
988
|
+
|
|
989
|
+
### Interrupts stay masked
|
|
990
|
+
|
|
991
|
+
The transfers run under `SEI`, and it has to be set again after any
|
|
992
|
+
`CHROUT` to the screen: the KERNAL's screen output returns through
|
|
993
|
+
`$E6A8`, which ends `CLC` / `CLI` / `RTS` with the `CLI` at `$E6B4`
|
|
994
|
+
(ROM bytes; pitfall `kernal_assumes_sei_cleared`). A first draft printed
|
|
995
|
+
the detection line and then went on with interrupts enabled. The
|
|
996
|
+
KERNAL IRQ then fired at `$34`, took its vector from RAM at `$FFFE`, and
|
|
997
|
+
the machine ended in a `BRK` loop at `$0002`, found with the remote
|
|
998
|
+
monitor. An IRQ cannot be taken in the middle of a transfer, because the
|
|
999
|
+
CPU is halted; it lands between transfers (from the CPU being halted,
|
|
1000
|
+
not measured here).
|
|
1001
|
+
|
|
1002
|
+
### Timing
|
|
1003
|
+
|
|
1004
|
+
The CIA2 harness is the one in `speedcode-generator.md`: timer B counts
|
|
1005
|
+
timer A's underflows, both latches at `$FFFF`, 24 bits. Screen-off runs
|
|
1006
|
+
start after `DEN` has been cleared and a new frame has begun, because
|
|
1007
|
+
`DEN` is sampled once per frame. The screen-on and sprite runs start at
|
|
1008
|
+
raster line 0, so the pinned counts are repeatable.
|
|
1009
|
+
|
|
1010
|
+
## What this recipe does not show
|
|
1011
|
+
|
|
1012
|
+
It does not use the REU interrupt (`$DF09`, written 0 here), autoload,
|
|
1013
|
+
or the size test across banks that codebase64 recommends for finding
|
|
1014
|
+
the real capacity. It does not measure a real 1700, 1750 or 1764, an
|
|
1015
|
+
Ultimate or a 1541 Ultimate REU; every figure is VICE x64sc 3.10.
|
|
1016
|
+
|
|
1017
|
+
## Sources
|
|
1018
|
+
|
|
1019
|
+
- codebase64, "REU programming": https://codebase64.net/doku.php?id=base:reu_programming (register bits, the `$FF00` trigger, detection and the size test).
|