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,667 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: drive-job-queue
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [drive_code_upload_and_job_queue]
|
|
7
|
+
file_formats: [PRG, D64]
|
|
8
|
+
uses_registers: []
|
|
9
|
+
uses_kernal: [SETLFS, SETNAM, OPEN, CHKOUT, CHROUT, CHKIN, CHRIN, CLRCHN, CLOSE, READST]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler Drive Code Upload and Job Queue
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Against a freshly formatted disk in drive 8: upload a 68-byte routine
|
|
19
|
+
into the 1541's buffer 3 (`$0600`) with three `M-W` commands, read it
|
|
20
|
+
back with `M-R` and compare, start it with `M-E`, and let it ask the
|
|
21
|
+
drive's own disk controller for sectors through the job queue at `$00`
|
|
22
|
+
to `$05`. The routine runs four times with different parameters and the
|
|
23
|
+
host reads each result back over channel 15: a read job before the
|
|
24
|
+
controller knows the disk ID (it fails with `$0B`), a seek job that
|
|
25
|
+
teaches it the ID, the read of track 18 sector 0 that then succeeds with
|
|
26
|
+
`$01` and delivers the BAM, and a read of track 40 that fails with
|
|
27
|
+
`$03`. It also shows two things about the error channel: a failed job
|
|
28
|
+
leaves the status line at `00, OK,00,00`, and a bare read of channel 15
|
|
29
|
+
after an `M-R` returns a single CR. The verdict at `$02FF` is `01` and
|
|
30
|
+
the border turns green when the sector bytes match a compiled-in copy of
|
|
31
|
+
the BAM's first sixteen bytes. The addresses and codes are tabulated in
|
|
32
|
+
`../../formats/iec-disk-reference.md`, section "1541 job queue and
|
|
33
|
+
buffers"; the technique is `drive_code_upload_and_job_queue` on
|
|
34
|
+
`../../techniques/file-io.md`.
|
|
35
|
+
|
|
36
|
+
## Source
|
|
37
|
+
|
|
38
|
+
```asm
|
|
39
|
+
// drive-job-queue.asm
|
|
40
|
+
// Upload a routine into 1541 buffer 3 with M-W, read it back with M-R, start
|
|
41
|
+
// it with M-E, and let it read a sector through the drive's own job queue.
|
|
42
|
+
// The host reads the result code and the buffer back over channel 15.
|
|
43
|
+
BasicUpstart2(start)
|
|
44
|
+
|
|
45
|
+
.const SETLFS = $ffba
|
|
46
|
+
.const SETNAM = $ffbd
|
|
47
|
+
.const OPEN = $ffc0
|
|
48
|
+
.const CLOSE = $ffc3
|
|
49
|
+
.const CHKIN = $ffc6
|
|
50
|
+
.const CHKOUT = $ffc9
|
|
51
|
+
.const CLRCHN = $ffcc
|
|
52
|
+
.const CHRIN = $ffcf
|
|
53
|
+
.const CHROUT = $ffd2
|
|
54
|
+
.const READST = $ffb7
|
|
55
|
+
|
|
56
|
+
.const VERDICT = $02ff
|
|
57
|
+
.const CODE = $0600 // buffer 3 in the drive: where the routine goes
|
|
58
|
+
.const FLAG = $06f0 // the routine writes $A5 here when it runs
|
|
59
|
+
.const RESULT = $06f1 // the job's result code, copied here
|
|
60
|
+
.const P_TRACK = $06f8 // parameters the host sets with M-W before M-E
|
|
61
|
+
.const P_SECT = $06f9
|
|
62
|
+
.const P_JOB = $06fa
|
|
63
|
+
.const SECTOR = $0400 // buffer 1: the job reads into it
|
|
64
|
+
|
|
65
|
+
start:
|
|
66
|
+
lda #$93
|
|
67
|
+
jsr CHROUT
|
|
68
|
+
ldx #<title
|
|
69
|
+
ldy #>title
|
|
70
|
+
jsr print_z
|
|
71
|
+
|
|
72
|
+
lda #15
|
|
73
|
+
ldx #8
|
|
74
|
+
ldy #15
|
|
75
|
+
jsr SETLFS
|
|
76
|
+
lda #0
|
|
77
|
+
jsr SETNAM
|
|
78
|
+
jsr OPEN
|
|
79
|
+
bcc a_upload
|
|
80
|
+
jmp no_drive
|
|
81
|
+
|
|
82
|
+
// A. upload the routine in 32-byte chunks, then read it all back
|
|
83
|
+
a_upload:
|
|
84
|
+
lda #'A'
|
|
85
|
+
jsr step
|
|
86
|
+
lda #0
|
|
87
|
+
sta off
|
|
88
|
+
a_chunk:
|
|
89
|
+
lda off
|
|
90
|
+
cmp #drive_end-drive_code
|
|
91
|
+
bcs a_verify
|
|
92
|
+
jsr send_chunk
|
|
93
|
+
lda off
|
|
94
|
+
clc
|
|
95
|
+
adc #32
|
|
96
|
+
sta off
|
|
97
|
+
jmp a_chunk
|
|
98
|
+
a_verify:
|
|
99
|
+
lda #<CODE
|
|
100
|
+
ldx #>CODE
|
|
101
|
+
ldy #drive_end-drive_code
|
|
102
|
+
jsr mem_read // the readback lands in rbuf
|
|
103
|
+
ldy #0
|
|
104
|
+
a_cmp:
|
|
105
|
+
lda rbuf,y
|
|
106
|
+
cmp drive_code,y
|
|
107
|
+
bne a_bad
|
|
108
|
+
iny
|
|
109
|
+
cpy #drive_end-drive_code
|
|
110
|
+
bne a_cmp
|
|
111
|
+
ldx #<lbl_a_ok
|
|
112
|
+
ldy #>lbl_a_ok
|
|
113
|
+
jsr print_z
|
|
114
|
+
jmp b_exec
|
|
115
|
+
a_bad:
|
|
116
|
+
ldx #<lbl_bad
|
|
117
|
+
ldy #>lbl_bad
|
|
118
|
+
jsr print_z
|
|
119
|
+
jmp finish
|
|
120
|
+
|
|
121
|
+
// B. a read job for track 18 sector 0, and proof it ran: FLAG becomes $A5.
|
|
122
|
+
// The controller has no disk ID yet, so this first job fails with $0B.
|
|
123
|
+
b_exec:
|
|
124
|
+
lda #'B'
|
|
125
|
+
jsr step
|
|
126
|
+
lda #18
|
|
127
|
+
ldx #0
|
|
128
|
+
ldy #$80
|
|
129
|
+
jsr run_job
|
|
130
|
+
lda #<FLAG
|
|
131
|
+
ldx #>FLAG
|
|
132
|
+
ldy #1
|
|
133
|
+
jsr mem_read
|
|
134
|
+
ldx #<lbl_flag
|
|
135
|
+
ldy #>lbl_flag
|
|
136
|
+
jsr print_z
|
|
137
|
+
lda rbuf
|
|
138
|
+
jsr print_hex
|
|
139
|
+
jsr print_result
|
|
140
|
+
lda #$0d
|
|
141
|
+
jsr CHROUT
|
|
142
|
+
|
|
143
|
+
// S. a seek job: the controller reads any header and keeps its ID
|
|
144
|
+
lda #'S'
|
|
145
|
+
jsr step
|
|
146
|
+
lda #18
|
|
147
|
+
ldx #0
|
|
148
|
+
ldy #$b0
|
|
149
|
+
jsr run_job
|
|
150
|
+
ldx #<lbl_seek
|
|
151
|
+
ldy #>lbl_seek
|
|
152
|
+
jsr print_z
|
|
153
|
+
jsr print_result
|
|
154
|
+
lda #<lbl_id
|
|
155
|
+
ldx #>lbl_id
|
|
156
|
+
jsr print_zax
|
|
157
|
+
lda #$12 // the master disk ID the controller compares
|
|
158
|
+
ldx #0
|
|
159
|
+
ldy #2
|
|
160
|
+
jsr mem_read
|
|
161
|
+
lda rbuf
|
|
162
|
+
jsr print_hex
|
|
163
|
+
lda rbuf+1
|
|
164
|
+
jsr print_hex
|
|
165
|
+
lda #$0d
|
|
166
|
+
jsr CHROUT
|
|
167
|
+
lda #18
|
|
168
|
+
ldx #0
|
|
169
|
+
ldy #$80
|
|
170
|
+
jsr run_job
|
|
171
|
+
|
|
172
|
+
// C. the job byte, the buffer's track/sector bytes, the result, the data
|
|
173
|
+
lda #'C'
|
|
174
|
+
jsr step
|
|
175
|
+
lda #<lbl_job
|
|
176
|
+
ldx #>lbl_job
|
|
177
|
+
jsr print_zax
|
|
178
|
+
lda #$01 // job slot for buffer 1
|
|
179
|
+
ldx #0
|
|
180
|
+
ldy #1
|
|
181
|
+
jsr mem_read
|
|
182
|
+
lda rbuf
|
|
183
|
+
jsr print_hex
|
|
184
|
+
lda #<lbl_ts
|
|
185
|
+
ldx #>lbl_ts
|
|
186
|
+
jsr print_zax
|
|
187
|
+
lda #$08 // buffer 1's track and sector
|
|
188
|
+
ldx #0
|
|
189
|
+
ldy #2
|
|
190
|
+
jsr mem_read
|
|
191
|
+
lda rbuf
|
|
192
|
+
jsr print_hex
|
|
193
|
+
lda #'/'
|
|
194
|
+
jsr CHROUT
|
|
195
|
+
lda rbuf+1
|
|
196
|
+
jsr print_hex
|
|
197
|
+
jsr print_result
|
|
198
|
+
lda rbuf
|
|
199
|
+
sta res_c
|
|
200
|
+
lda #$0d
|
|
201
|
+
jsr CHROUT
|
|
202
|
+
|
|
203
|
+
lda #<SECTOR
|
|
204
|
+
ldx #>SECTOR
|
|
205
|
+
ldy #16
|
|
206
|
+
jsr mem_read
|
|
207
|
+
ldy #0
|
|
208
|
+
c_print:
|
|
209
|
+
lda rbuf,y
|
|
210
|
+
jsr print_hex
|
|
211
|
+
iny
|
|
212
|
+
cpy #16
|
|
213
|
+
beq c_printed
|
|
214
|
+
tya
|
|
215
|
+
and #7
|
|
216
|
+
bne c_print
|
|
217
|
+
lda #' '
|
|
218
|
+
jsr CHROUT
|
|
219
|
+
jmp c_print
|
|
220
|
+
c_printed:
|
|
221
|
+
lda #$0d
|
|
222
|
+
jsr CHROUT
|
|
223
|
+
ldy #0
|
|
224
|
+
c_cmp:
|
|
225
|
+
lda rbuf,y
|
|
226
|
+
cmp bam_head,y
|
|
227
|
+
bne c_done
|
|
228
|
+
iny
|
|
229
|
+
cpy #16
|
|
230
|
+
bne c_cmp
|
|
231
|
+
lda res_c
|
|
232
|
+
cmp #1
|
|
233
|
+
bne c_done
|
|
234
|
+
lda #1
|
|
235
|
+
sta VERDICT
|
|
236
|
+
lda #5
|
|
237
|
+
sta $d020
|
|
238
|
+
c_done:
|
|
239
|
+
lda #<SECTOR+$90 // the disk name from the same buffer
|
|
240
|
+
ldx #>SECTOR+$90
|
|
241
|
+
ldy #16
|
|
242
|
+
jsr mem_read
|
|
243
|
+
lda #' '
|
|
244
|
+
jsr CHROUT
|
|
245
|
+
jsr CHROUT
|
|
246
|
+
ldy #0
|
|
247
|
+
c_name:
|
|
248
|
+
lda rbuf,y
|
|
249
|
+
and #$7f
|
|
250
|
+
jsr CHROUT
|
|
251
|
+
iny
|
|
252
|
+
cpy #16
|
|
253
|
+
bne c_name
|
|
254
|
+
lda #$0d
|
|
255
|
+
jsr CHROUT
|
|
256
|
+
|
|
257
|
+
// D. the same routine asked for track 40: the controller's error code.
|
|
258
|
+
// The status line is read first, before any M-R: the job's failure is
|
|
259
|
+
// not on it.
|
|
260
|
+
lda #'D'
|
|
261
|
+
jsr step
|
|
262
|
+
lda #40
|
|
263
|
+
ldx #0
|
|
264
|
+
ldy #$80
|
|
265
|
+
jsr run_job
|
|
266
|
+
jsr read_status
|
|
267
|
+
dec clen // drop the CR: the codes go on the same line
|
|
268
|
+
jsr print_status
|
|
269
|
+
lda #<lbl_job
|
|
270
|
+
ldx #>lbl_job
|
|
271
|
+
jsr print_zax
|
|
272
|
+
lda #$01
|
|
273
|
+
ldx #0
|
|
274
|
+
ldy #1
|
|
275
|
+
jsr mem_read
|
|
276
|
+
lda rbuf
|
|
277
|
+
jsr print_hex
|
|
278
|
+
jsr print_result
|
|
279
|
+
lda #$0d
|
|
280
|
+
jsr CHROUT
|
|
281
|
+
|
|
282
|
+
// E. the error channel after all that: the job queue never wrote to it
|
|
283
|
+
lda #'E'
|
|
284
|
+
jsr step
|
|
285
|
+
jsr read_status
|
|
286
|
+
lda clen
|
|
287
|
+
jsr print_hex
|
|
288
|
+
lda #':'
|
|
289
|
+
jsr CHROUT
|
|
290
|
+
ldy #0
|
|
291
|
+
e_hex:
|
|
292
|
+
cpy clen
|
|
293
|
+
beq e_done
|
|
294
|
+
cpy #8
|
|
295
|
+
beq e_done
|
|
296
|
+
lda rbuf,y
|
|
297
|
+
jsr print_hex
|
|
298
|
+
iny
|
|
299
|
+
bne e_hex
|
|
300
|
+
e_done:
|
|
301
|
+
lda #$0d
|
|
302
|
+
jsr CHROUT
|
|
303
|
+
|
|
304
|
+
finish:
|
|
305
|
+
lda #15
|
|
306
|
+
jsr CLOSE
|
|
307
|
+
ldx #<lbl_done
|
|
308
|
+
ldy #>lbl_done
|
|
309
|
+
jsr print_z
|
|
310
|
+
rts
|
|
311
|
+
|
|
312
|
+
no_drive:
|
|
313
|
+
ldx #<lbl_nodrive
|
|
314
|
+
ldy #>lbl_nodrive
|
|
315
|
+
jsr print_z
|
|
316
|
+
rts
|
|
317
|
+
|
|
318
|
+
// --- set the routine's track, sector and job code with M-W, then M-E it --
|
|
319
|
+
// A = track, X = sector, Y = job code. Returns when the drive is back in
|
|
320
|
+
// its idle loop, because channel 15 takes no new command before then.
|
|
321
|
+
run_job:
|
|
322
|
+
sta mw_ts+6
|
|
323
|
+
stx mw_ts+7
|
|
324
|
+
sty mw_ts+8
|
|
325
|
+
ldx #15
|
|
326
|
+
jsr CHKOUT
|
|
327
|
+
ldy #0
|
|
328
|
+
rj_1:
|
|
329
|
+
lda mw_ts,y
|
|
330
|
+
jsr CHROUT
|
|
331
|
+
iny
|
|
332
|
+
cpy #9
|
|
333
|
+
bne rj_1
|
|
334
|
+
jsr CLRCHN
|
|
335
|
+
ldx #15
|
|
336
|
+
jsr CHKOUT
|
|
337
|
+
ldy #0
|
|
338
|
+
rj_2:
|
|
339
|
+
lda me_cmd,y
|
|
340
|
+
jsr CHROUT
|
|
341
|
+
iny
|
|
342
|
+
cpy #5
|
|
343
|
+
bne rj_2
|
|
344
|
+
jmp CLRCHN
|
|
345
|
+
|
|
346
|
+
// --- M-W one chunk of the routine: off = offset into drive_code ---------
|
|
347
|
+
send_chunk:
|
|
348
|
+
lda #drive_end-drive_code
|
|
349
|
+
sec
|
|
350
|
+
sbc off
|
|
351
|
+
cmp #32
|
|
352
|
+
bcc sc_len_ok
|
|
353
|
+
lda #32
|
|
354
|
+
sc_len_ok:
|
|
355
|
+
sta clen
|
|
356
|
+
ldx #15
|
|
357
|
+
jsr CHKOUT
|
|
358
|
+
lda #'M'
|
|
359
|
+
jsr CHROUT
|
|
360
|
+
lda #'-'
|
|
361
|
+
jsr CHROUT
|
|
362
|
+
lda #'W'
|
|
363
|
+
jsr CHROUT
|
|
364
|
+
lda off
|
|
365
|
+
clc
|
|
366
|
+
adc #<CODE
|
|
367
|
+
jsr CHROUT
|
|
368
|
+
lda #>CODE
|
|
369
|
+
adc #0
|
|
370
|
+
jsr CHROUT
|
|
371
|
+
lda clen
|
|
372
|
+
jsr CHROUT
|
|
373
|
+
ldx off
|
|
374
|
+
ldy #0
|
|
375
|
+
sc_data:
|
|
376
|
+
lda drive_code,x
|
|
377
|
+
jsr CHROUT
|
|
378
|
+
inx
|
|
379
|
+
iny
|
|
380
|
+
cpy clen
|
|
381
|
+
bne sc_data
|
|
382
|
+
jmp CLRCHN
|
|
383
|
+
|
|
384
|
+
// --- M-R: A/X = address, Y = count (1..127); bytes land in rbuf ---------
|
|
385
|
+
mem_read:
|
|
386
|
+
sta mr_cmd+3
|
|
387
|
+
stx mr_cmd+4
|
|
388
|
+
sty mr_cmd+5
|
|
389
|
+
sty clen
|
|
390
|
+
ldx #15
|
|
391
|
+
jsr CHKOUT
|
|
392
|
+
ldy #0
|
|
393
|
+
mr_1:
|
|
394
|
+
lda mr_cmd,y
|
|
395
|
+
jsr CHROUT
|
|
396
|
+
iny
|
|
397
|
+
cpy #6
|
|
398
|
+
bne mr_1
|
|
399
|
+
jsr CLRCHN
|
|
400
|
+
ldx #15
|
|
401
|
+
jsr CHKIN
|
|
402
|
+
ldy #0
|
|
403
|
+
mr_2:
|
|
404
|
+
jsr CHRIN
|
|
405
|
+
sta rbuf,y
|
|
406
|
+
iny
|
|
407
|
+
cpy clen
|
|
408
|
+
bne mr_2
|
|
409
|
+
jmp CLRCHN
|
|
410
|
+
|
|
411
|
+
// --- the status line: a read that also clears it -------------------------
|
|
412
|
+
read_status:
|
|
413
|
+
ldx #15
|
|
414
|
+
jsr CHKIN
|
|
415
|
+
ldy #0
|
|
416
|
+
rs_loop:
|
|
417
|
+
jsr CHRIN
|
|
418
|
+
sta rbuf,y
|
|
419
|
+
iny
|
|
420
|
+
jsr READST
|
|
421
|
+
bne rs_end
|
|
422
|
+
cpy #39
|
|
423
|
+
bne rs_loop
|
|
424
|
+
rs_end:
|
|
425
|
+
sty clen
|
|
426
|
+
jmp CLRCHN
|
|
427
|
+
|
|
428
|
+
print_status:
|
|
429
|
+
ldy #0
|
|
430
|
+
ps_loop:
|
|
431
|
+
cpy clen
|
|
432
|
+
beq ps_done
|
|
433
|
+
lda rbuf,y
|
|
434
|
+
jsr CHROUT
|
|
435
|
+
iny
|
|
436
|
+
bne ps_loop
|
|
437
|
+
ps_done:
|
|
438
|
+
rts
|
|
439
|
+
|
|
440
|
+
print_result: // " RESULT=" and the byte at RESULT
|
|
441
|
+
lda #<lbl_res
|
|
442
|
+
ldx #>lbl_res
|
|
443
|
+
jsr print_zax
|
|
444
|
+
lda #<RESULT
|
|
445
|
+
ldx #>RESULT
|
|
446
|
+
ldy #1
|
|
447
|
+
jsr mem_read
|
|
448
|
+
lda rbuf
|
|
449
|
+
jmp print_hex
|
|
450
|
+
|
|
451
|
+
step:
|
|
452
|
+
jsr CHROUT
|
|
453
|
+
lda #' '
|
|
454
|
+
jmp CHROUT
|
|
455
|
+
|
|
456
|
+
print_hex:
|
|
457
|
+
pha
|
|
458
|
+
lsr
|
|
459
|
+
lsr
|
|
460
|
+
lsr
|
|
461
|
+
lsr
|
|
462
|
+
jsr ph_digit
|
|
463
|
+
pla
|
|
464
|
+
and #15
|
|
465
|
+
ph_digit:
|
|
466
|
+
cmp #10
|
|
467
|
+
bcc ph_num
|
|
468
|
+
adc #6
|
|
469
|
+
ph_num:
|
|
470
|
+
adc #'0'
|
|
471
|
+
jmp CHROUT
|
|
472
|
+
|
|
473
|
+
print_zax: // A/X = the same, low byte in A
|
|
474
|
+
sta pz+1
|
|
475
|
+
stx pz+2
|
|
476
|
+
jmp pz
|
|
477
|
+
print_z: // X/Y = zero-terminated PETSCII string
|
|
478
|
+
stx pz+1
|
|
479
|
+
sty pz+2
|
|
480
|
+
pz: lda $ffff
|
|
481
|
+
beq pz_done
|
|
482
|
+
jsr CHROUT
|
|
483
|
+
inc pz+1
|
|
484
|
+
bne pz
|
|
485
|
+
inc pz+2
|
|
486
|
+
bne pz
|
|
487
|
+
pz_done:
|
|
488
|
+
rts
|
|
489
|
+
|
|
490
|
+
// --- the routine that runs on the drive's 6502 ---------------------------
|
|
491
|
+
// Assembled for $0600. It marks FLAG, copies the host's track and sector
|
|
492
|
+
// into buffer 1's header bytes, writes the read job code into slot 1 and
|
|
493
|
+
// waits for the controller to replace it with a result below $80.
|
|
494
|
+
.encoding "petscii_upper"
|
|
495
|
+
drive_code:
|
|
496
|
+
.pseudopc CODE {
|
|
497
|
+
lda #$a5
|
|
498
|
+
sta FLAG
|
|
499
|
+
lda P_TRACK
|
|
500
|
+
sta $08 // track for buffer 1
|
|
501
|
+
lda P_SECT
|
|
502
|
+
sta $09 // sector for buffer 1
|
|
503
|
+
lda P_JOB // $80 read, $B0 seek
|
|
504
|
+
sta $01 // slot 1 = buffer 1 at $0400
|
|
505
|
+
wait:
|
|
506
|
+
lda $01
|
|
507
|
+
bmi wait // bit 7 set while the job is pending
|
|
508
|
+
sta RESULT
|
|
509
|
+
rts
|
|
510
|
+
.fill 40, i // padding: a ramp the M-R readback checks too
|
|
511
|
+
}
|
|
512
|
+
drive_end:
|
|
513
|
+
|
|
514
|
+
mw_ts: .text "M-W"
|
|
515
|
+
.byte <P_TRACK, >P_TRACK, 3, 0, 0, 0
|
|
516
|
+
me_cmd: .text "M-E"
|
|
517
|
+
.byte <CODE, >CODE
|
|
518
|
+
mr_cmd: .text "M-R"
|
|
519
|
+
.byte 0, 0, 0
|
|
520
|
+
|
|
521
|
+
bam_head: .byte $12, $01, $41, $00, $15, $ff, $ff, $1f
|
|
522
|
+
.byte $15, $ff, $ff, $1f, $15, $ff, $ff, $1f
|
|
523
|
+
|
|
524
|
+
title: .text "DRIVE JOB QUEUE"
|
|
525
|
+
.byte $0d, 0
|
|
526
|
+
lbl_a_ok: .text toIntString(drive_end-drive_code) + " BYTES IN "
|
|
527
|
+
.text toIntString(floor((drive_end-drive_code+31)/32))
|
|
528
|
+
.text " M-W, M-R MATCHES"
|
|
529
|
+
.byte $0d, 0
|
|
530
|
+
lbl_seek: .text "SEEK"
|
|
531
|
+
.byte 0
|
|
532
|
+
lbl_id: .text " ID $12/13="
|
|
533
|
+
.byte 0
|
|
534
|
+
lbl_bad: .text "M-R DIFFERS"
|
|
535
|
+
.byte $0d, 0
|
|
536
|
+
lbl_flag: .text "M-E RAN, FLAG="
|
|
537
|
+
.byte 0
|
|
538
|
+
lbl_job: .text "JOB $01="
|
|
539
|
+
.byte 0
|
|
540
|
+
lbl_ts: .text " T/S="
|
|
541
|
+
.byte 0
|
|
542
|
+
lbl_res: .text " RESULT="
|
|
543
|
+
.byte 0
|
|
544
|
+
lbl_done: .text "DONE"
|
|
545
|
+
.byte $0d, 0
|
|
546
|
+
lbl_nodrive: .text "NO DRIVE"
|
|
547
|
+
.byte $0d, 0
|
|
548
|
+
|
|
549
|
+
off: .byte 0
|
|
550
|
+
clen: .byte 0
|
|
551
|
+
res_c: .byte 0
|
|
552
|
+
rbuf: .fill 128, 0
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
## Build
|
|
556
|
+
|
|
557
|
+
```bash
|
|
558
|
+
java -jar $KICKASS_JAR drive-job-queue.asm -o drive-job-queue.prg
|
|
559
|
+
c1541 -format "TEST,01" d64 test.d64
|
|
560
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas x64sc -default -warp +sound \
|
|
561
|
+
+autostart-delay-random -autostartprgmode 1 -limitcycles 16000000 \
|
|
562
|
+
-8 test.d64 -drive8wobbleamplitude 0 -drive8wobblefrequency 0 \
|
|
563
|
+
-exitscreenshot drive-job-queue.png -autostart drive-job-queue.prg
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
Add `-model ntsc` for the NTSC run. `-default` turns true drive
|
|
567
|
+
emulation on, and the program needs it: `M-E` runs the routine on the
|
|
568
|
+
emulated drive's own 6502, and there is no drive CPU without it. The
|
|
569
|
+
disk must be a `TEST,01` format, because the compiled-in sixteen bytes
|
|
570
|
+
and the printed name are that disk's BAM. Nothing is written to the
|
|
571
|
+
disk, so a second run on the same image gives the same picture.
|
|
572
|
+
|
|
573
|
+
## Expected output
|
|
574
|
+
|
|
575
|
+
```
|
|
576
|
+
DRIVE JOB QUEUE
|
|
577
|
+
A 68 BYTES IN 3 M-W, M-R MATCHES
|
|
578
|
+
B M-E RAN, FLAG=A5 RESULT=0B
|
|
579
|
+
S SEEK RESULT=01 ID $12/13=3031
|
|
580
|
+
C JOB $01=01 T/S=12/00 RESULT=01
|
|
581
|
+
1201410015FFFF1F 15FFFF1F15FFFF1F
|
|
582
|
+
TEST
|
|
583
|
+
D 00, OK,00,00JOB $01=03 RESULT=03
|
|
584
|
+
E 01:0D
|
|
585
|
+
DONE
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
What each letter did:
|
|
589
|
+
|
|
590
|
+
| Step | Host side | Drive side | What the readback shows |
|
|
591
|
+
|---|---|---|---|
|
|
592
|
+
| A | three `M-W` commands of 32, 32 and 4 bytes to `$0600`, then one `M-R $0600` of 68 bytes | stores the bytes | all 68 bytes match the source, padding ramp included |
|
|
593
|
+
| B | `M-W` the parameters track 18, sector 0, job `$80` to `$06F8`, then `M-E $0600` | the routine writes `$A5` to `$06F0`, puts 18/0 in `$08`/`$09`, `$80` in `$01`, waits for bit 7 to clear | `FLAG=A5`: it ran. `RESULT=0B`: the controller compared the header's ID with its master copy at `$12`/`$13`, which nothing had set |
|
|
594
|
+
| S | the same with job `$B0` | a seek: the controller reads any header on the track and copies its ID to `$12`/`$13` | `RESULT=01`, and `$12`/`$13` read `30 31`: the ID `01` of the format command. Then the read of B is issued again |
|
|
595
|
+
| C | `M-R $0001`, `M-R $0008` for two bytes, `M-R $06F1`, `M-R $0400` for 16 bytes and `M-R $0490` for 16 | nothing new | job byte `01`, track/sector `12/00`, result `01`, then `12 01 41 00 15 FF FF 1F ...`, the BAM the host's `c1541` wrote, and the disk name `TEST` from offset `$90` |
|
|
596
|
+
| D | parameters track 40, sector 0, job `$80`; `M-E`; then a read of channel 15 before any `M-R` | the controller steps to a track the image does not have and gives up | `00, OK,00,00`: the job's failure is not on the error channel. Then `$01` and the copy both read `03` |
|
|
597
|
+
| E | a bare read of channel 15 after the last `M-R` | | one byte, `$0D`: a lone CR, with READST non-zero after it |
|
|
598
|
+
|
|
599
|
+
Measured in VICE x64sc 3.10 with the pinned command at 16,000,000
|
|
600
|
+
cycles, PAL and NTSC, on a disk formatted by `c1541 -format "TEST,01"`
|
|
601
|
+
(rung 1). Two runs per model gave byte-identical screenshots; every
|
|
602
|
+
character cell of the ten lines was decoded against the character ROM.
|
|
603
|
+
The screenshots are `screenshots/drive-job-queue.png` and
|
|
604
|
+
`screenshots/drive-job-queue-ntsc.png`. The BAM bytes were compared
|
|
605
|
+
against offset 91,392 (track 18 sector 0) of the `.d64` the host
|
|
606
|
+
formatted: `12 01 41 00 15 FF FF 1F 15 FF FF 1F 15 FF FF 1F`, with
|
|
607
|
+
`D4 C5 D3 D4 A0 ...` at offset `$90`.
|
|
608
|
+
|
|
609
|
+
## Why this works
|
|
610
|
+
|
|
611
|
+
Everything goes through channel 15, opened bare once and closed at the
|
|
612
|
+
very end. `send_chunk` sends `M-W`, the address, the count and the
|
|
613
|
+
bytes with CHKOUT 15 and CHROUT and then CLRCHN; the UNLISTEN that
|
|
614
|
+
CLRCHN performs is what makes the DOS act on the command, so no CR is
|
|
615
|
+
sent. `mem_read` sends `M-R` the same way and then reads the bytes back
|
|
616
|
+
with CHKIN 15 and CHRIN. `M-E` is the same kind of command whose action
|
|
617
|
+
is a JSR into the drive's RAM: `drive_code` runs in the DOS's own
|
|
618
|
+
context, so it can do what the DOS does, which is to put a track and
|
|
619
|
+
sector in `$08`/`$09`, store a code with bit 7 set in slot `$01`, and
|
|
620
|
+
spin on `bmi wait` until the disk controller, running from the drive's
|
|
621
|
+
timer interrupt, replaces it with a result. The routine copies that
|
|
622
|
+
result to `RESULT` and returns, which puts the drive back in its idle
|
|
623
|
+
loop; the host's next `M-R` is not answered until then, so it waits
|
|
624
|
+
for free.
|
|
625
|
+
|
|
626
|
+
The first read fails because the controller checks each header's ID
|
|
627
|
+
against `$12`/`$13` and nothing has set those since power-on; the seek
|
|
628
|
+
job (`$B0`) reads any header on the track and copies its ID there,
|
|
629
|
+
which is what the DOS's own `I0` does before it touches a disk. That is
|
|
630
|
+
why the same read then returns `$01` with the BAM in buffer 1, and why
|
|
631
|
+
track 40 returns `$03`: there is no header there to find.
|
|
632
|
+
|
|
633
|
+
The same PAL run with a `-moncommands` file that traces the drive CPU
|
|
634
|
+
(`trace exec 8:0600`, `trace store 8:06f1`: the `8:` prefix selects the
|
|
635
|
+
drive's address space, and `trace` does not stop the machine) and four
|
|
636
|
+
host addresses (`a_upload`, `a_verify`, `a_cmp` and `b_exec`: the start
|
|
637
|
+
of the upload, the start and the compare loop of the readback, and step
|
|
638
|
+
B) printed these lines, cycle counters as VICE prints them on the
|
|
639
|
+
right; the picture was byte-identical to the untraced run:
|
|
640
|
+
|
|
641
|
+
```text
|
|
642
|
+
.8:0600 A9 A5 LDA #$A5 ... 3358170 M-E entry, first job
|
|
643
|
+
.8:0618 8D F1 06 STA $06F1 - A:0B ... 4260800 read before seek: $0B
|
|
644
|
+
.8:0600 ... 4354152 seek job
|
|
645
|
+
.8:0618 ... A:01 ... 4480011 $01 after 125,859 drive cycles
|
|
646
|
+
.8:0600 ... 4571206 read job
|
|
647
|
+
.8:0618 ... A:01 ... 4795277 $01 after 224,071 drive cycles
|
|
648
|
+
.8:0600 ... 5038884 track 40
|
|
649
|
+
.8:0618 ... A:03 ... 5805417 $03 after 766,533 drive cycles
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
The drive's 6502 runs at 1 MHz, so those are microseconds: a seek and a
|
|
653
|
+
read of a sector that is there take an eighth to a quarter of a second,
|
|
654
|
+
mostly waiting for the sector to come round; the two failures take 0.9 s
|
|
655
|
+
and 0.77 s, which is the controller's retry and bump sequence. On the
|
|
656
|
+
host side `trace exec` at the upload's first and last instruction gave
|
|
657
|
+
132,742 cycles for the three `M-W` commands and 163,545 for the 68-byte
|
|
658
|
+
`M-R` readback (PAL, rung 1). The same trace also caught the drive's
|
|
659
|
+
reset code storing to `$06F1` three times before the program ran: its
|
|
660
|
+
RAM test walks every byte, which is why nothing uploaded survives a
|
|
661
|
+
drive reset.
|
|
662
|
+
|
|
663
|
+
A `command 1 "m 8:0000 8:0011"` attached to a drive-side trace store
|
|
664
|
+
crashed this x64sc build (exit 139, the trace line repeated until the
|
|
665
|
+
crash); a plain `trace` without a command worked. `dev 8` was not
|
|
666
|
+
tried. Writing the sector back and reading through another buffer are
|
|
667
|
+
listed as variations under the technique on `../../techniques/file-io.md`.
|