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,690 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: drive-via-probe
|
|
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]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler 1541 VIA Probe
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Against a freshly formatted disk in drive 8: read all sixteen registers
|
|
19
|
+
of each 1541 VIA and the first 32 bytes of the drive's zero page with
|
|
20
|
+
`M-R` while the drive is at rest, then upload a routine into buffer 3
|
|
21
|
+
that runs a seek job and, the moment the controller reports it done,
|
|
22
|
+
copies `$1800`, `$1C00`, the current-track byte `$22` and the status
|
|
23
|
+
byte `$20` into the buffer and reads four bytes off the head through
|
|
24
|
+
`$1C01`. The host runs it five times (tracks 18, 18, 1, 25, 31), reads
|
|
25
|
+
each snapshot back, and reads the same ports again itself. Five seconds
|
|
26
|
+
later it reads `$1C00` once more, then opens and closes a direct-access
|
|
27
|
+
channel and reads it around that. The verdict at `$02FF` is `01` and
|
|
28
|
+
the border turns green when the stepper bits of the second track 18
|
|
29
|
+
snapshot differ from the track 1 snapshot, the density bits are 2, 2,
|
|
30
|
+
3, 1 and 0 for the five seeks, the motor bit is set in every snapshot
|
|
31
|
+
and clear at rest and after the wait. The values are tabulated in
|
|
32
|
+
`../../formats/iec-disk-reference.md`, sections "1541 VIA registers,
|
|
33
|
+
measured" and "1541 memory map".
|
|
34
|
+
|
|
35
|
+
## Source
|
|
36
|
+
|
|
37
|
+
```asm
|
|
38
|
+
// drive-via-probe.asm
|
|
39
|
+
// Read the 1541's two VIAs through M-R with the drive at rest, then upload a
|
|
40
|
+
// routine that runs a seek job and photographs $1800, $1C00, the current
|
|
41
|
+
// track and four head bytes while the motor is still turning. Seeks to
|
|
42
|
+
// tracks 1, 18, 25 and 31 show the stepper bits and the density bits move.
|
|
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
|
+
|
|
55
|
+
.const VERDICT = $02ff
|
|
56
|
+
.const CODE = $0600 // buffer 3 in the drive: where the routine goes
|
|
57
|
+
.const RESULT = $06f0 // the seek job's result code
|
|
58
|
+
.const SNAP = $06f1 // $1800, $1C00, $22, $20 taken right after the job
|
|
59
|
+
.const HEAD = $06f5 // four bytes read from $1C01 with byte-ready
|
|
60
|
+
.const P_TRACK = $06f9 // the track to seek, set by the host with M-W
|
|
61
|
+
|
|
62
|
+
start:
|
|
63
|
+
lda #$93
|
|
64
|
+
jsr CHROUT
|
|
65
|
+
ldx #<title
|
|
66
|
+
ldy #>title
|
|
67
|
+
jsr print_z
|
|
68
|
+
|
|
69
|
+
lda #15
|
|
70
|
+
ldx #8
|
|
71
|
+
ldy #15
|
|
72
|
+
jsr SETLFS
|
|
73
|
+
lda #0
|
|
74
|
+
jsr SETNAM
|
|
75
|
+
jsr OPEN
|
|
76
|
+
bcc rest
|
|
77
|
+
jmp no_drive
|
|
78
|
+
|
|
79
|
+
// R. both VIAs and the first 32 zero-page bytes with the drive at rest
|
|
80
|
+
rest:
|
|
81
|
+
lda #$00
|
|
82
|
+
ldx #$18
|
|
83
|
+
jsr dump16
|
|
84
|
+
lda #$00
|
|
85
|
+
ldx #$1c
|
|
86
|
+
jsr dump16
|
|
87
|
+
lda rbuf // $1C00 at rest, for the verdict
|
|
88
|
+
sta rest_1c00
|
|
89
|
+
lda #$00
|
|
90
|
+
ldx #$00
|
|
91
|
+
jsr dump16
|
|
92
|
+
lda #$10
|
|
93
|
+
ldx #$00
|
|
94
|
+
jsr dump16
|
|
95
|
+
|
|
96
|
+
// upload the drive routine in 32-byte chunks
|
|
97
|
+
lda #0
|
|
98
|
+
sta off
|
|
99
|
+
up_chunk:
|
|
100
|
+
lda off
|
|
101
|
+
cmp #drive_end-drive_code
|
|
102
|
+
bcs seeks
|
|
103
|
+
jsr send_chunk
|
|
104
|
+
lda off
|
|
105
|
+
clc
|
|
106
|
+
adc #32
|
|
107
|
+
sta off
|
|
108
|
+
jmp up_chunk
|
|
109
|
+
|
|
110
|
+
// S. four seeks; each line is the drive's own snapshot, then the host's
|
|
111
|
+
seeks:
|
|
112
|
+
lda #0
|
|
113
|
+
sta sidx
|
|
114
|
+
seek_loop:
|
|
115
|
+
ldx sidx
|
|
116
|
+
lda tracks,x
|
|
117
|
+
jsr run_seek
|
|
118
|
+
lda #'T'
|
|
119
|
+
jsr CHROUT
|
|
120
|
+
ldx sidx
|
|
121
|
+
lda tracks,x
|
|
122
|
+
jsr print_hex
|
|
123
|
+
lda #<lbl_j
|
|
124
|
+
ldx #>lbl_j
|
|
125
|
+
jsr print_zax
|
|
126
|
+
lda #<RESULT
|
|
127
|
+
ldx #>RESULT
|
|
128
|
+
ldy #9
|
|
129
|
+
jsr mem_read // RESULT, SNAP x4, HEAD x4
|
|
130
|
+
lda rbuf
|
|
131
|
+
jsr print_hex
|
|
132
|
+
lda #<lbl_b
|
|
133
|
+
ldx #>lbl_b
|
|
134
|
+
jsr print_zax
|
|
135
|
+
lda rbuf+1
|
|
136
|
+
jsr print_hex
|
|
137
|
+
lda #<lbl_c
|
|
138
|
+
ldx #>lbl_c
|
|
139
|
+
jsr print_zax
|
|
140
|
+
lda rbuf+2
|
|
141
|
+
jsr print_hex
|
|
142
|
+
ldx sidx
|
|
143
|
+
lda rbuf+2 // print_hex returns with a digit in A
|
|
144
|
+
sta snap_1c00,x
|
|
145
|
+
lda #<lbl_tk
|
|
146
|
+
ldx #>lbl_tk
|
|
147
|
+
jsr print_zax
|
|
148
|
+
lda rbuf+3
|
|
149
|
+
jsr print_hex
|
|
150
|
+
lda #<lbl_hd
|
|
151
|
+
ldx #>lbl_hd
|
|
152
|
+
jsr print_zax
|
|
153
|
+
ldy #5
|
|
154
|
+
hd_print:
|
|
155
|
+
lda rbuf,y
|
|
156
|
+
jsr print_hex
|
|
157
|
+
iny
|
|
158
|
+
cpy #9
|
|
159
|
+
bne hd_print
|
|
160
|
+
lda #$0d
|
|
161
|
+
jsr CHROUT
|
|
162
|
+
lda #<lbl_host
|
|
163
|
+
ldx #>lbl_host
|
|
164
|
+
jsr print_zax
|
|
165
|
+
lda #$00
|
|
166
|
+
ldx #$18
|
|
167
|
+
ldy #1
|
|
168
|
+
jsr mem_read
|
|
169
|
+
lda rbuf
|
|
170
|
+
jsr print_hex
|
|
171
|
+
lda #' '
|
|
172
|
+
jsr CHROUT
|
|
173
|
+
lda #$00
|
|
174
|
+
ldx #$1c
|
|
175
|
+
ldy #1
|
|
176
|
+
jsr mem_read
|
|
177
|
+
lda rbuf
|
|
178
|
+
jsr print_hex
|
|
179
|
+
lda #<lbl_zp
|
|
180
|
+
ldx #>lbl_zp
|
|
181
|
+
jsr print_zax
|
|
182
|
+
lda #$22
|
|
183
|
+
ldx #$00
|
|
184
|
+
ldy #1
|
|
185
|
+
jsr mem_read
|
|
186
|
+
lda rbuf
|
|
187
|
+
jsr print_hex
|
|
188
|
+
lda #<lbl_hdr
|
|
189
|
+
ldx #>lbl_hdr
|
|
190
|
+
jsr print_zax
|
|
191
|
+
lda #$16
|
|
192
|
+
ldx #$00
|
|
193
|
+
ldy #5
|
|
194
|
+
jsr mem_read
|
|
195
|
+
ldy #0
|
|
196
|
+
hdr_print:
|
|
197
|
+
lda #' '
|
|
198
|
+
jsr CHROUT
|
|
199
|
+
lda rbuf,y
|
|
200
|
+
jsr print_hex
|
|
201
|
+
iny
|
|
202
|
+
cpy #5
|
|
203
|
+
bne hdr_print
|
|
204
|
+
lda #$0d
|
|
205
|
+
jsr CHROUT
|
|
206
|
+
inc sidx
|
|
207
|
+
lda sidx
|
|
208
|
+
cmp #5
|
|
209
|
+
beq idle
|
|
210
|
+
jmp seek_loop
|
|
211
|
+
idle:
|
|
212
|
+
|
|
213
|
+
// I. five seconds of C64 time later, the motor timer has run out
|
|
214
|
+
lda #<lbl_idle
|
|
215
|
+
ldx #>lbl_idle
|
|
216
|
+
jsr print_zax
|
|
217
|
+
lda #0
|
|
218
|
+
sta $a1
|
|
219
|
+
sta $a2
|
|
220
|
+
wait5:
|
|
221
|
+
lda $a2
|
|
222
|
+
cmp #250
|
|
223
|
+
bcc wait5
|
|
224
|
+
lda #$00
|
|
225
|
+
ldx #$1c
|
|
226
|
+
ldy #1
|
|
227
|
+
jsr mem_read
|
|
228
|
+
lda rbuf
|
|
229
|
+
sta idle_1c00
|
|
230
|
+
jsr print_hex
|
|
231
|
+
lda #$0d
|
|
232
|
+
jsr CHROUT
|
|
233
|
+
|
|
234
|
+
// L. the LED: bit 3 of $1C00 with a direct-access channel open, then closed
|
|
235
|
+
lda #<lbl_led
|
|
236
|
+
ldx #>lbl_led
|
|
237
|
+
jsr print_zax
|
|
238
|
+
lda #2
|
|
239
|
+
ldx #8
|
|
240
|
+
ldy #2
|
|
241
|
+
jsr SETLFS
|
|
242
|
+
lda #1
|
|
243
|
+
ldx #<name_hash
|
|
244
|
+
ldy #>name_hash
|
|
245
|
+
jsr SETNAM
|
|
246
|
+
jsr OPEN
|
|
247
|
+
lda #$00
|
|
248
|
+
ldx #$1c
|
|
249
|
+
ldy #1
|
|
250
|
+
jsr mem_read
|
|
251
|
+
lda rbuf
|
|
252
|
+
sta led_open
|
|
253
|
+
jsr print_hex
|
|
254
|
+
lda #2
|
|
255
|
+
jsr CLOSE
|
|
256
|
+
lda #<lbl_closed
|
|
257
|
+
ldx #>lbl_closed
|
|
258
|
+
jsr print_zax
|
|
259
|
+
lda #$00
|
|
260
|
+
ldx #$1c
|
|
261
|
+
ldy #1
|
|
262
|
+
jsr mem_read
|
|
263
|
+
lda rbuf
|
|
264
|
+
sta led_closed
|
|
265
|
+
jsr print_hex
|
|
266
|
+
lda #$0d
|
|
267
|
+
jsr CHROUT
|
|
268
|
+
|
|
269
|
+
// V. stepper bits differ between the second track 18 snapshot and the
|
|
270
|
+
// track 1 one, the density bits are 2,2,3,1,0 for tracks 18,18,1,25,31,
|
|
271
|
+
// the motor bit is set in every snapshot and clear at rest and after the
|
|
272
|
+
// wait
|
|
273
|
+
lda snap_1c00+1
|
|
274
|
+
eor snap_1c00+2
|
|
275
|
+
and #$03
|
|
276
|
+
beq v_done
|
|
277
|
+
ldx #0
|
|
278
|
+
v_dens:
|
|
279
|
+
lda snap_1c00,x
|
|
280
|
+
and #$64 // density bits and motor bit
|
|
281
|
+
cmp dens_expect,x
|
|
282
|
+
bne v_done
|
|
283
|
+
inx
|
|
284
|
+
cpx #5
|
|
285
|
+
bne v_dens
|
|
286
|
+
lda rest_1c00
|
|
287
|
+
ora idle_1c00
|
|
288
|
+
and #$04
|
|
289
|
+
bne v_done
|
|
290
|
+
lda #1
|
|
291
|
+
sta VERDICT
|
|
292
|
+
lda #5
|
|
293
|
+
sta $d020
|
|
294
|
+
lda led_open // LED bit: set while open, clear after close
|
|
295
|
+
and #$08
|
|
296
|
+
beq v_led
|
|
297
|
+
lda led_closed
|
|
298
|
+
and #$08
|
|
299
|
+
bne v_led
|
|
300
|
+
lda #<lbl_ledok
|
|
301
|
+
ldx #>lbl_ledok
|
|
302
|
+
jsr print_zax
|
|
303
|
+
v_led:
|
|
304
|
+
lda #<lbl_ok
|
|
305
|
+
ldx #>lbl_ok
|
|
306
|
+
jsr print_zax
|
|
307
|
+
v_done:
|
|
308
|
+
lda #15
|
|
309
|
+
jsr CLOSE
|
|
310
|
+
ldx #<lbl_done
|
|
311
|
+
ldy #>lbl_done
|
|
312
|
+
jmp print_z
|
|
313
|
+
|
|
314
|
+
no_drive:
|
|
315
|
+
ldx #<lbl_nodrive
|
|
316
|
+
ldy #>lbl_nodrive
|
|
317
|
+
jmp print_z
|
|
318
|
+
|
|
319
|
+
// --- M-R sixteen bytes at A/X and print them as one line ----------------
|
|
320
|
+
dump16:
|
|
321
|
+
pha
|
|
322
|
+
txa
|
|
323
|
+
jsr print_hex
|
|
324
|
+
pla
|
|
325
|
+
pha
|
|
326
|
+
jsr print_hex
|
|
327
|
+
lda #' '
|
|
328
|
+
jsr CHROUT
|
|
329
|
+
pla
|
|
330
|
+
ldy #16
|
|
331
|
+
jsr mem_read
|
|
332
|
+
ldy #0
|
|
333
|
+
d16:
|
|
334
|
+
lda rbuf,y
|
|
335
|
+
jsr print_hex
|
|
336
|
+
iny
|
|
337
|
+
cpy #16
|
|
338
|
+
beq d16_done
|
|
339
|
+
tya
|
|
340
|
+
and #7
|
|
341
|
+
bne d16
|
|
342
|
+
lda #' '
|
|
343
|
+
jsr CHROUT
|
|
344
|
+
jmp d16
|
|
345
|
+
d16_done:
|
|
346
|
+
lda #$0d
|
|
347
|
+
jmp CHROUT
|
|
348
|
+
|
|
349
|
+
// --- set the track with M-W, then M-E the routine ------------------------
|
|
350
|
+
run_seek:
|
|
351
|
+
sta mw_tk+6
|
|
352
|
+
ldx #15
|
|
353
|
+
jsr CHKOUT
|
|
354
|
+
ldy #0
|
|
355
|
+
rs_1:
|
|
356
|
+
lda mw_tk,y
|
|
357
|
+
jsr CHROUT
|
|
358
|
+
iny
|
|
359
|
+
cpy #7
|
|
360
|
+
bne rs_1
|
|
361
|
+
jsr CLRCHN
|
|
362
|
+
ldx #15
|
|
363
|
+
jsr CHKOUT
|
|
364
|
+
ldy #0
|
|
365
|
+
rs_2:
|
|
366
|
+
lda me_cmd,y
|
|
367
|
+
jsr CHROUT
|
|
368
|
+
iny
|
|
369
|
+
cpy #5
|
|
370
|
+
bne rs_2
|
|
371
|
+
jmp CLRCHN
|
|
372
|
+
|
|
373
|
+
// --- M-W one chunk of the routine: off = offset into drive_code ---------
|
|
374
|
+
send_chunk:
|
|
375
|
+
lda #drive_end-drive_code
|
|
376
|
+
sec
|
|
377
|
+
sbc off
|
|
378
|
+
cmp #32
|
|
379
|
+
bcc sc_len_ok
|
|
380
|
+
lda #32
|
|
381
|
+
sc_len_ok:
|
|
382
|
+
sta clen
|
|
383
|
+
ldx #15
|
|
384
|
+
jsr CHKOUT
|
|
385
|
+
lda #'M'
|
|
386
|
+
jsr CHROUT
|
|
387
|
+
lda #'-'
|
|
388
|
+
jsr CHROUT
|
|
389
|
+
lda #'W'
|
|
390
|
+
jsr CHROUT
|
|
391
|
+
lda off
|
|
392
|
+
clc
|
|
393
|
+
adc #<CODE
|
|
394
|
+
jsr CHROUT
|
|
395
|
+
lda #>CODE
|
|
396
|
+
adc #0
|
|
397
|
+
jsr CHROUT
|
|
398
|
+
lda clen
|
|
399
|
+
jsr CHROUT
|
|
400
|
+
ldx off
|
|
401
|
+
ldy #0
|
|
402
|
+
sc_data:
|
|
403
|
+
lda drive_code,x
|
|
404
|
+
jsr CHROUT
|
|
405
|
+
inx
|
|
406
|
+
iny
|
|
407
|
+
cpy clen
|
|
408
|
+
bne sc_data
|
|
409
|
+
jmp CLRCHN
|
|
410
|
+
|
|
411
|
+
// --- M-R: A/X = address, Y = count (1..127); bytes land in rbuf ---------
|
|
412
|
+
mem_read:
|
|
413
|
+
sta mr_cmd+3
|
|
414
|
+
stx mr_cmd+4
|
|
415
|
+
sty mr_cmd+5
|
|
416
|
+
sty clen
|
|
417
|
+
ldx #15
|
|
418
|
+
jsr CHKOUT
|
|
419
|
+
ldy #0
|
|
420
|
+
mr_1:
|
|
421
|
+
lda mr_cmd,y
|
|
422
|
+
jsr CHROUT
|
|
423
|
+
iny
|
|
424
|
+
cpy #6
|
|
425
|
+
bne mr_1
|
|
426
|
+
jsr CLRCHN
|
|
427
|
+
ldx #15
|
|
428
|
+
jsr CHKIN
|
|
429
|
+
ldy #0
|
|
430
|
+
mr_2:
|
|
431
|
+
jsr CHRIN
|
|
432
|
+
sta rbuf,y
|
|
433
|
+
iny
|
|
434
|
+
cpy clen
|
|
435
|
+
bne mr_2
|
|
436
|
+
jmp CLRCHN
|
|
437
|
+
|
|
438
|
+
print_hex:
|
|
439
|
+
pha
|
|
440
|
+
lsr
|
|
441
|
+
lsr
|
|
442
|
+
lsr
|
|
443
|
+
lsr
|
|
444
|
+
jsr ph_digit
|
|
445
|
+
pla
|
|
446
|
+
and #15
|
|
447
|
+
ph_digit:
|
|
448
|
+
cmp #10
|
|
449
|
+
bcc ph_num
|
|
450
|
+
adc #6
|
|
451
|
+
ph_num:
|
|
452
|
+
adc #'0'
|
|
453
|
+
jmp CHROUT
|
|
454
|
+
|
|
455
|
+
print_zax: // A/X = the same, low byte in A
|
|
456
|
+
sta pz+1
|
|
457
|
+
stx pz+2
|
|
458
|
+
jmp pz
|
|
459
|
+
print_z: // X/Y = zero-terminated PETSCII string
|
|
460
|
+
stx pz+1
|
|
461
|
+
sty pz+2
|
|
462
|
+
pz: lda $ffff
|
|
463
|
+
beq pz_done
|
|
464
|
+
jsr CHROUT
|
|
465
|
+
inc pz+1
|
|
466
|
+
bne pz
|
|
467
|
+
inc pz+2
|
|
468
|
+
bne pz
|
|
469
|
+
pz_done:
|
|
470
|
+
rts
|
|
471
|
+
|
|
472
|
+
// --- the routine that runs on the drive's 6502 ---------------------------
|
|
473
|
+
// Assembled for $0600. A seek job on buffer 1 for the host's track; when
|
|
474
|
+
// the controller has replaced the job code, photograph both port B bytes,
|
|
475
|
+
// the current track and the drive status, then read four bytes off the
|
|
476
|
+
// head, each one after byte-ready sets V. A byte that does not arrive
|
|
477
|
+
// within 256 polls is recorded as $00, which no GCR byte can be.
|
|
478
|
+
.encoding "petscii_upper"
|
|
479
|
+
drive_code:
|
|
480
|
+
.pseudopc CODE {
|
|
481
|
+
lda P_TRACK
|
|
482
|
+
sta $08 // track for buffer 1
|
|
483
|
+
lda #0
|
|
484
|
+
sta $09 // sector for buffer 1
|
|
485
|
+
lda #$b0 // seek
|
|
486
|
+
sta $01 // slot 1 = buffer 1 at $0400
|
|
487
|
+
wait:
|
|
488
|
+
lda $01
|
|
489
|
+
bmi wait // bit 7 set while the job is pending
|
|
490
|
+
sta RESULT
|
|
491
|
+
lda $1800
|
|
492
|
+
sta SNAP
|
|
493
|
+
lda $1c00
|
|
494
|
+
sta SNAP+1
|
|
495
|
+
lda $22 // DRVTRK: the track the head is on
|
|
496
|
+
sta SNAP+2
|
|
497
|
+
lda $20 // DRVST: drive status
|
|
498
|
+
sta SNAP+3
|
|
499
|
+
lda $1c0c
|
|
500
|
+
ora #$0e // CA2 high: SOE, lets byte-ready reach SO
|
|
501
|
+
sta $1c0c
|
|
502
|
+
ldx #0
|
|
503
|
+
hd_loop:
|
|
504
|
+
ldy #0
|
|
505
|
+
lda $1c01 // clears the CA1 flag in $1C0D
|
|
506
|
+
clv
|
|
507
|
+
hd_wait:
|
|
508
|
+
bvs hd_got // byte-ready on the CPU's SO pin
|
|
509
|
+
lda $1c0d
|
|
510
|
+
and #$02 // byte-ready on VIA2 CA1
|
|
511
|
+
bne hd_got
|
|
512
|
+
dey
|
|
513
|
+
bne hd_wait
|
|
514
|
+
lda #0
|
|
515
|
+
beq hd_store
|
|
516
|
+
hd_got:
|
|
517
|
+
lda $1c01
|
|
518
|
+
hd_store:
|
|
519
|
+
sta HEAD,x
|
|
520
|
+
inx
|
|
521
|
+
cpx #4
|
|
522
|
+
bne hd_loop
|
|
523
|
+
lda $1c0c
|
|
524
|
+
and #$f1 // put CA2 back to low, as the DOS leaves it
|
|
525
|
+
ora #$0c
|
|
526
|
+
sta $1c0c
|
|
527
|
+
rts
|
|
528
|
+
}
|
|
529
|
+
drive_end:
|
|
530
|
+
|
|
531
|
+
mw_tk: .text "M-W"
|
|
532
|
+
.byte <P_TRACK, >P_TRACK, 1, 0
|
|
533
|
+
me_cmd: .text "M-E"
|
|
534
|
+
.byte <CODE, >CODE
|
|
535
|
+
mr_cmd: .text "M-R"
|
|
536
|
+
.byte 0, 0, 0
|
|
537
|
+
|
|
538
|
+
tracks: .byte 18, 18, 1, 25, 31
|
|
539
|
+
dens_expect: .byte $44, $44, $64, $24, $04
|
|
540
|
+
|
|
541
|
+
title: .text "DRIVE VIA PROBE"
|
|
542
|
+
.byte $0d, 0
|
|
543
|
+
lbl_j: .text " J="
|
|
544
|
+
.byte 0
|
|
545
|
+
lbl_b: .text " B="
|
|
546
|
+
.byte 0
|
|
547
|
+
lbl_c: .text " C="
|
|
548
|
+
.byte 0
|
|
549
|
+
lbl_tk: .text " TK="
|
|
550
|
+
.byte 0
|
|
551
|
+
lbl_hd: .text " HD="
|
|
552
|
+
.byte 0
|
|
553
|
+
lbl_host: .text " HOST "
|
|
554
|
+
.byte 0
|
|
555
|
+
lbl_zp: .text " 22="
|
|
556
|
+
.byte 0
|
|
557
|
+
lbl_hdr: .text " HDR"
|
|
558
|
+
.byte 0
|
|
559
|
+
lbl_idle: .text "IDLE 5S 1C00="
|
|
560
|
+
.byte 0
|
|
561
|
+
lbl_led: .text "LED: OPEN 2,8,2,# 1C00="
|
|
562
|
+
.byte 0
|
|
563
|
+
lbl_closed: .text " CLOSED="
|
|
564
|
+
.byte 0
|
|
565
|
+
lbl_ledok: .text "LED OK; "
|
|
566
|
+
.byte 0
|
|
567
|
+
name_hash: .text "#"
|
|
568
|
+
lbl_ok: .text "STEPPER, DENSITY, MOTOR OK"
|
|
569
|
+
.byte $0d, 0
|
|
570
|
+
lbl_done: .text "DONE"
|
|
571
|
+
.byte $0d, 0
|
|
572
|
+
lbl_nodrive: .text "NO DRIVE"
|
|
573
|
+
.byte $0d, 0
|
|
574
|
+
|
|
575
|
+
off: .byte 0
|
|
576
|
+
clen: .byte 0
|
|
577
|
+
sidx: .byte 0
|
|
578
|
+
rest_1c00: .byte 0
|
|
579
|
+
idle_1c00: .byte 0
|
|
580
|
+
led_open: .byte 0
|
|
581
|
+
led_closed: .byte 0
|
|
582
|
+
snap_1c00: .byte 0, 0, 0, 0, 0
|
|
583
|
+
rbuf: .fill 128, 0
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
## Build
|
|
587
|
+
|
|
588
|
+
```bash
|
|
589
|
+
java -jar $KICKASS_JAR drive-via-probe.asm -o drive-via-probe.prg
|
|
590
|
+
c1541 -format "TEST,01" d64 test.d64
|
|
591
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas x64sc -default -warp +sound \
|
|
592
|
+
+autostart-delay-random -autostartprgmode 1 -limitcycles 30000000 \
|
|
593
|
+
-8 test.d64 -drive8wobbleamplitude 0 -drive8wobblefrequency 0 \
|
|
594
|
+
-exitscreenshot drive-via-probe.png -autostart drive-via-probe.prg
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
Add `-model ntsc` for the NTSC run. `-default` turns true drive
|
|
598
|
+
emulation on with a 1541, and the program needs it: `M-E` runs the
|
|
599
|
+
routine on the emulated drive's own 6502. Nothing is written to the
|
|
600
|
+
disk. Adding `-drive8truedrive -drive8type 1541` to the command changes
|
|
601
|
+
nothing on the screen except the free-running timer bytes in the two
|
|
602
|
+
register dumps, because the drive is reset again when they are parsed
|
|
603
|
+
and the timeline shifts; the pinned pictures are from the command above.
|
|
604
|
+
|
|
605
|
+
## Expected output
|
|
606
|
+
|
|
607
|
+
PAL:
|
|
608
|
+
|
|
609
|
+
```
|
|
610
|
+
DRIVE VIA PROBE
|
|
611
|
+
1800 85001AFFA100FF01 4CAA000001008200
|
|
612
|
+
1C00 F0546F008518003A 669B0041EC00C054
|
|
613
|
+
0000 0000000000000000 0000000000000000
|
|
614
|
+
0010 0000000000000000 0000000001011000
|
|
615
|
+
T12 J=01 B=81 C=D4 TK=13 HD=A54A9429
|
|
616
|
+
HOST 85 D4 22=13 HDR 30 31 13 02 10
|
|
617
|
+
T12 J=01 B=81 C=D6 TK=12 HD=A54A9429
|
|
618
|
+
HOST 85 D6 22=12 HDR 30 31 12 03 10
|
|
619
|
+
T01 J=01 B=81 C=F4 TK=01 HD=52A54A94
|
|
620
|
+
HOST 85 F4 22=01 HDR 30 31 01 02 02
|
|
621
|
+
T19 J=01 B=81 C=B4 TK=19 HD=52942952
|
|
622
|
+
HOST 85 B4 22=19 HDR 30 31 19 0E 16
|
|
623
|
+
T1F J=01 B=81 C=94 TK=1F HD=A54A9429
|
|
624
|
+
HOST 85 94 22=1F HDR 30 31 1F 01 1F
|
|
625
|
+
IDLE 5S 1C00=90
|
|
626
|
+
LED: OPEN 2,8,2,# 1C00=D6 CLOSED=D6
|
|
627
|
+
STEPPER, DENSITY, MOTOR OK
|
|
628
|
+
DONE
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
The first two lines are `$1800`-`$180F` and `$1C00`-`$1C0F`; the next
|
|
632
|
+
two are drive zero page `$00`-`$1F`. Each `T` line is the drive's own
|
|
633
|
+
snapshot after the seek job for that track: `J` the result code, `B`
|
|
634
|
+
`$1800`, `C` `$1C00`, `TK` the current-track byte `$22`, `HD` four
|
|
635
|
+
bytes from `$1C01`. The `HOST` line below it is what the host's own
|
|
636
|
+
`M-R` then read from `$1800`, `$1C00`, `$22` and the five header bytes
|
|
637
|
+
at `$16`-`$1A` (ID, ID, track, sector, checksum).
|
|
638
|
+
|
|
639
|
+
NTSC differs in the timer bytes of the two dumps (`5400FF01 F7B3` and
|
|
640
|
+
`D820003A 70A8` in place of the PAL values), in `$1800` at rest (`81`,
|
|
641
|
+
not `85`: bit 2, CLK IN, was the other way when the drive got to the
|
|
642
|
+
`M-R`), in the sector numbers of the `HDR` fields (the disk was at a
|
|
643
|
+
different angle each time), and in one host read: after the track 1
|
|
644
|
+
seek the host read `$1C00` as `74`, not `F4`, because bit 7 was low as
|
|
645
|
+
a sync mark passed under the head. The two `T12` lines are the point
|
|
646
|
+
of the repeated first seek: the drive's zero page held `$22 = 00` at
|
|
647
|
+
rest, the first job found a header on track 19 without stepping and
|
|
648
|
+
recorded `13`, and only the second request for track 18 moved the head
|
|
649
|
+
(`C` goes from `D4` to `D6`: two half-steps). Track 1 then differs from
|
|
650
|
+
track 18 in the stepper bits by 34 half-steps, which is 2 modulo 4.
|
|
651
|
+
|
|
652
|
+
Measured in VICE x64sc 3.10 with the pinned command at 30,000,000
|
|
653
|
+
cycles, PAL and NTSC, on a disk formatted by `c1541 -format "TEST,01"`
|
|
654
|
+
(rung 1). Two runs per model gave byte-identical screenshots; every
|
|
655
|
+
character cell was decoded against the character ROM. The screenshots
|
|
656
|
+
are `screenshots/drive-via-probe.png` and
|
|
657
|
+
`screenshots/drive-via-probe-ntsc.png`.
|
|
658
|
+
|
|
659
|
+
## Why this works
|
|
660
|
+
|
|
661
|
+
The host side is the job-queue recipe's: channel 15, `M-W` in 32-byte
|
|
662
|
+
chunks, `M-R` for readback, `M-E` to start. The drive routine differs
|
|
663
|
+
in two ways. It photographs the ports itself, right after `bmi wait`
|
|
664
|
+
falls through, which is the only way to see `$1C00` with the motor
|
|
665
|
+
running and the stepper where the job left it, since a host `M-R` can
|
|
666
|
+
only be answered once the routine has returned. And before it reads
|
|
667
|
+
`$1C01` it raises CA2 of VIA2 (`ora #$0e` into `$1C0C`): CA2 is the
|
|
668
|
+
SOE line that gates byte-ready onto the CPU's SO pin and VIA2's CA1,
|
|
669
|
+
and it read low at rest (`$1C0C` = `EC`, CA2 control bits `110`). The first version
|
|
670
|
+
of this routine waited on `bvs` without that and read four `00`s on
|
|
671
|
+
every track, which is the timeout marker, because no byte-ready ever
|
|
672
|
+
arrived. With SOE up, a byte arrives every 26 to 32 microseconds and
|
|
673
|
+
the loop reads GCR (`52 A5 4A 94`, `A5 4A 94 29`: the images of `55`
|
|
674
|
+
and `00` runs in a gap or a data block).
|
|
675
|
+
|
|
676
|
+
A `-moncommands` file with `trace store 8:1c00` and a log, no command
|
|
677
|
+
attached, listed every write to `$1C00` over the whole PAL run: 856
|
|
678
|
+
runs of distinct site and value, from seven ROM addresses. `$EB2A`
|
|
679
|
+
wrote `F7` once at reset, `$F260` wrote `60` once, `$F35C` wrote the
|
|
680
|
+
density bytes `D4 D6 F4 B4 94` in the order of the seeks, `$F987` wrote
|
|
681
|
+
the motor on (`F4`, later `94`), `$FA75` wrote the stepper phases
|
|
682
|
+
(`D7 D6 D5 D4 ...` cycling downward) 122 times, `$F9ED` wrote the
|
|
683
|
+
motor off (`90`, later `D2`), and `$EC98` in the idle loop rewrote the
|
|
684
|
+
current value on every pass. The only writes with bit 3 set were two
|
|
685
|
+
`DE`s from `$EC98`, 1,108 cycles apart, during the automatic
|
|
686
|
+
initialise the `OPEN 2,8,2,"#"` caused: the LED was on for that long
|
|
687
|
+
and off again before the host's `M-R`, which is why the `LED:` line
|
|
688
|
+
shows `D6` both times. The motor-off write came 3.9 million drive
|
|
689
|
+
cycles after that initialise's density write; the delay from the end
|
|
690
|
+
of the job itself was not isolated.
|