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,492 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: load-asset-runtime
|
|
3
|
+
toolchain: oscar64
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [kernal_load_to_address, error_channel_check]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D012, D018, D019, D01A, D020, DD04, DD05, DD06, DD07, DD0E, DD0F]
|
|
9
|
+
uses_kernal: [SETLFS, SETNAM, LOAD, SAVE, OPEN, CLOSE, CHKIN, CHRIN, CLRCHN, READST]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# Oscar64 Load an Asset at Run Time with KERNAL LOAD
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A character set fetched from drive 8 when the program runs, instead of
|
|
19
|
+
being compiled into the PRG. The set is built in RAM first, so the run
|
|
20
|
+
has something to compare against: the ROM font with a dotted underline
|
|
21
|
+
added to every glyph but space. The program then LOADs the file
|
|
22
|
+
`CHARSET` with secondary address 0 to `$3800`, an address it chose and
|
|
23
|
+
not the one in the file's header, points the VIC at it, and compares
|
|
24
|
+
the bytes that landed with the bytes it built. On a fresh disk the
|
|
25
|
+
first LOAD fails with `62`, so the program SAVEs the built set as a PRG
|
|
26
|
+
and LOADs it straight back; on the next start the first LOAD succeeds
|
|
27
|
+
and the SAVE is skipped. The drive's reply is printed after every step.
|
|
28
|
+
Two things are measured along the way: a `rasterirq.h` border split
|
|
29
|
+
stays armed across the calls and counts its entries, and LOAD is
|
|
30
|
+
entered under `SEI` so the I flag it returns with can be read. The
|
|
31
|
+
verdict goes to `$02FF` and the border, green `01` or red `02`, the
|
|
32
|
+
way `headless-verify.md` does it. The verifier formats a fresh disk
|
|
33
|
+
before each run, so the pinned picture is the first-run path, SAVE
|
|
34
|
+
then LOAD; the second-start path was run once and is quoted below.
|
|
35
|
+
|
|
36
|
+
## Source
|
|
37
|
+
|
|
38
|
+
```c
|
|
39
|
+
// load-asset-runtime.c
|
|
40
|
+
// Fetch a 2 KB character set from drive 8 at run time instead of
|
|
41
|
+
// embedding it in the PRG. The set is built in RAM first (the ROM font
|
|
42
|
+
// with a dotted underline under every glyph but space), then LOADed with secondary
|
|
43
|
+
// address 0 to $3800, the address this program chooses, not the one in
|
|
44
|
+
// the file's header. On a fresh disk the first LOAD answers 62, so the
|
|
45
|
+
// program SAVEs the built set as the PRG "CHARSET" and LOADs it again;
|
|
46
|
+
// on the next start the first LOAD succeeds and the SAVE is skipped.
|
|
47
|
+
// Every step prints the KERNAL's return values and the drive's reply.
|
|
48
|
+
// A rasterirq.h border split stays armed across the calls and counts
|
|
49
|
+
// how often it ran, and LOAD is entered under SEI so the I flag it
|
|
50
|
+
// returns with can be read. The loaded block is compared with the
|
|
51
|
+
// built one, the VIC is pointed at it, and the verdict goes to $02FF
|
|
52
|
+
// and the border: green 01 pass, red 02 fail.
|
|
53
|
+
#include <stdio.h>
|
|
54
|
+
#include <string.h>
|
|
55
|
+
#include <c64/vic.h>
|
|
56
|
+
#include <c64/cia.h>
|
|
57
|
+
#include <c64/memmap.h>
|
|
58
|
+
#include <c64/rasterirq.h>
|
|
59
|
+
#include <c64/kernalio.h>
|
|
60
|
+
|
|
61
|
+
// Keep the runtime below the charset: nothing but the $0801 startup
|
|
62
|
+
// stub lands outside $0880-$37FF.
|
|
63
|
+
#pragma stacksize( 1024 )
|
|
64
|
+
#pragma heapsize( 256 )
|
|
65
|
+
#pragma region( main, 0x0880, 0x3800, , , { code, data, bss, heap, stack } )
|
|
66
|
+
|
|
67
|
+
#define DRIVE 8
|
|
68
|
+
#define SIZE 2048
|
|
69
|
+
#define CHARSET ((char *)0x3800) // VIC bank 0, char base 7
|
|
70
|
+
#define RESULT (*(volatile char *)0x02ff)
|
|
71
|
+
#define EXPECT_CHK 0xC4FF // python fold of the built set
|
|
72
|
+
#define SPLIT_ROW 100
|
|
73
|
+
#define RESTORE_ROW 200
|
|
74
|
+
|
|
75
|
+
static char built[SIZE]; // the set as built in RAM
|
|
76
|
+
static char reply[40];
|
|
77
|
+
static RIRQCode split, restore;
|
|
78
|
+
|
|
79
|
+
static volatile unsigned irqs; // split handler entries
|
|
80
|
+
static volatile char rmin, rmax; // $D012 at handler entry
|
|
81
|
+
|
|
82
|
+
__interrupt void on_split(void)
|
|
83
|
+
{
|
|
84
|
+
char r = vic.raster;
|
|
85
|
+
if (r < rmin) rmin = r;
|
|
86
|
+
if (r > rmax) rmax = r;
|
|
87
|
+
irqs++;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
static void stats_reset(void)
|
|
91
|
+
{
|
|
92
|
+
irqs = 0; rmin = 255; rmax = 0;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// CIA2 timer A counts cycles, timer B counts A underflows: a 32-bit
|
|
96
|
+
// counter the KERNAL never touches (its serial timeout is CIA1 B).
|
|
97
|
+
static void clock_init(void)
|
|
98
|
+
{
|
|
99
|
+
cia2.cra = 0x00; cia2.crb = 0x00;
|
|
100
|
+
cia2.ta = 0xffff; cia2.tb = 0xffff;
|
|
101
|
+
cia2.crb = 0x51;
|
|
102
|
+
cia2.cra = 0x11;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
static unsigned long clock_now(void)
|
|
106
|
+
{
|
|
107
|
+
unsigned hi, lo, hi2;
|
|
108
|
+
do {
|
|
109
|
+
hi = cia2.tb; lo = cia2.ta; hi2 = cia2.tb;
|
|
110
|
+
} while (hi != hi2);
|
|
111
|
+
return 0xffffffffUL - (((unsigned long)hi << 16) | lo);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// chk = ((chk ^ b) * 5 + 1) & 0xffff over n bytes
|
|
115
|
+
static unsigned fold(const char *p, unsigned n)
|
|
116
|
+
{
|
|
117
|
+
unsigned c = 0;
|
|
118
|
+
for (unsigned i = 0; i < n; i++)
|
|
119
|
+
c = (c ^ p[i]) * 5 + 1;
|
|
120
|
+
return c;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
static void drive_reply(void)
|
|
124
|
+
{
|
|
125
|
+
reply[0] = 0;
|
|
126
|
+
krnio_setnam("");
|
|
127
|
+
if (krnio_open(15, DRIVE, 15)) {
|
|
128
|
+
int n = krnio_gets(15, reply, sizeof(reply));
|
|
129
|
+
if (n > 0 && reply[n - 1] == 13) reply[n - 1] = 0;
|
|
130
|
+
krnio_close(15);
|
|
131
|
+
}
|
|
132
|
+
printf("DRIVE: %s\n", reply);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// What LOAD handed back: carry, A, the I flag, and X/Y (end + 1).
|
|
136
|
+
static char ld_carry, ld_a, ld_iflag;
|
|
137
|
+
static unsigned ld_end;
|
|
138
|
+
static bool no_drive;
|
|
139
|
+
|
|
140
|
+
// LOAD name to dest. SETLFS secondary 0 makes LOAD take the address in
|
|
141
|
+
// X/Y and discard the two header bytes in the file; secondary 1 would
|
|
142
|
+
// do the opposite (krnio_load passes X/Y = 0, so it is only usable
|
|
143
|
+
// with secondary 1). Entered under SEI on purpose: the flags LOAD
|
|
144
|
+
// returns with say what the KERNAL did to the I bit.
|
|
145
|
+
static void load_to(const char *name, char *dest)
|
|
146
|
+
{
|
|
147
|
+
krnio_setnam(name);
|
|
148
|
+
__asm {
|
|
149
|
+
sei
|
|
150
|
+
lda #1 // logical file: LOAD ignores it
|
|
151
|
+
ldx #8 // device
|
|
152
|
+
ldy #0 // secondary 0: our address wins
|
|
153
|
+
jsr $ffba // SETLFS
|
|
154
|
+
lda #0 // 0 = load, 1 = verify
|
|
155
|
+
ldx dest
|
|
156
|
+
ldy dest + 1
|
|
157
|
+
jsr $ffd5 // LOAD
|
|
158
|
+
php
|
|
159
|
+
sta ld_a
|
|
160
|
+
stx ld_end
|
|
161
|
+
sty ld_end + 1
|
|
162
|
+
lda #0
|
|
163
|
+
rol
|
|
164
|
+
sta ld_carry // C: 1 = failed, A says why
|
|
165
|
+
pla
|
|
166
|
+
and #4
|
|
167
|
+
sta ld_iflag // I bit as LOAD left it
|
|
168
|
+
cli
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
static unsigned long period; // cycles per frame
|
|
173
|
+
|
|
174
|
+
static void report(const char *tag, unsigned long cyc)
|
|
175
|
+
{
|
|
176
|
+
printf("%s CYC=%lu F=%lu IRQ=%u R=%u..%u\n",
|
|
177
|
+
tag, cyc, cyc / period, irqs, rmin, rmax);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
static bool do_load(void)
|
|
181
|
+
{
|
|
182
|
+
stats_reset();
|
|
183
|
+
unsigned long t0 = clock_now();
|
|
184
|
+
load_to("CHARSET", CHARSET);
|
|
185
|
+
unsigned long cyc = clock_now() - t0;
|
|
186
|
+
printf("LOAD C=%d A=%02X I=%d ST=%02X END=%04X\n",
|
|
187
|
+
ld_carry, ld_a, ld_iflag ? 1 : 0, krnio_status(), ld_end);
|
|
188
|
+
report(" ", cyc);
|
|
189
|
+
// A=5 is device not present: nothing answered, so do not open the
|
|
190
|
+
// command channel, whose bare OPEN sends nothing and whose read
|
|
191
|
+
// would then wait for ever.
|
|
192
|
+
no_drive = ld_carry && ld_a == 5;
|
|
193
|
+
if (!no_drive) drive_reply();
|
|
194
|
+
return ld_carry == 0;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
int main(void)
|
|
198
|
+
{
|
|
199
|
+
printf("%cLOAD ASSET AT RUN TIME\n", 147);
|
|
200
|
+
|
|
201
|
+
// model, from the highest raster line seen in one frame; bit 7 of
|
|
202
|
+
// $D011 is read on both sides of $D012 so a line-255 read followed
|
|
203
|
+
// by a line-256 flag cannot count as $1FF
|
|
204
|
+
char top = 0;
|
|
205
|
+
for (unsigned i = 0; i < 20000; i++) {
|
|
206
|
+
char h1 = vic.ctrl1, r = vic.raster, h2 = vic.ctrl1;
|
|
207
|
+
if ((h1 & h2 & 0x80) && r > top) top = r;
|
|
208
|
+
}
|
|
209
|
+
period = (top >= 0x37) ? 19656UL : 17095UL;
|
|
210
|
+
|
|
211
|
+
// 1. build the set: ROM font, row 7 of every glyph but space XORed with $55
|
|
212
|
+
__asm { sei }
|
|
213
|
+
char port = mmap_set(MMAP_CHAR_ROM);
|
|
214
|
+
memcpy(built, (const char *)0xd000, SIZE);
|
|
215
|
+
mmap_set(port);
|
|
216
|
+
__asm { cli }
|
|
217
|
+
for (unsigned i = 7; i < SIZE; i += 8)
|
|
218
|
+
if (i != 32 * 8 + 7) built[i] ^= 0x55; // leave space blank
|
|
219
|
+
unsigned want = fold(built, SIZE);
|
|
220
|
+
printf("BUILT %u BYTES CHK %04X\n", SIZE, want);
|
|
221
|
+
|
|
222
|
+
// 2. a border split armed for the whole run, counting its entries
|
|
223
|
+
rirq_init(true);
|
|
224
|
+
rirq_build(&split, 2);
|
|
225
|
+
rirq_write(&split, 0, &vic.color_border, VCOL_WHITE);
|
|
226
|
+
rirq_call(&split, 1, on_split);
|
|
227
|
+
rirq_set(0, SPLIT_ROW, &split);
|
|
228
|
+
rirq_build(&restore, 1);
|
|
229
|
+
rirq_write(&restore, 0, &vic.color_border, VCOL_LT_BLUE);
|
|
230
|
+
rirq_set(1, RESTORE_ROW, &restore);
|
|
231
|
+
rirq_sort();
|
|
232
|
+
rirq_start();
|
|
233
|
+
clock_init();
|
|
234
|
+
|
|
235
|
+
stats_reset();
|
|
236
|
+
unsigned long t0 = clock_now();
|
|
237
|
+
for (char i = 0; i < 50; i++) rirq_wait();
|
|
238
|
+
report("IDLE", clock_now() - t0);
|
|
239
|
+
|
|
240
|
+
// 3. try the asset first; on a fresh disk this is the 62 path
|
|
241
|
+
bool have = do_load();
|
|
242
|
+
if (!have && !no_drive) {
|
|
243
|
+
// 4. first run: write the built set as a PRG whose header says
|
|
244
|
+
// where "built" lives, then fetch it to $3800 regardless
|
|
245
|
+
stats_reset();
|
|
246
|
+
t0 = clock_now();
|
|
247
|
+
krnio_setnam("CHARSET");
|
|
248
|
+
bool ok = krnio_save(DRIVE, built, built + SIZE);
|
|
249
|
+
unsigned long cyc = clock_now() - t0;
|
|
250
|
+
printf("SAVE %d ST=%02X\n", ok, krnio_status());
|
|
251
|
+
report(" ", cyc);
|
|
252
|
+
drive_reply();
|
|
253
|
+
have = do_load();
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// 5. compare what landed at $3800 with what was built
|
|
257
|
+
bool same = have && memcmp(CHARSET, built, SIZE) == 0;
|
|
258
|
+
unsigned got = fold(CHARSET, SIZE);
|
|
259
|
+
printf("%s CHK %04X %s D011=%02X\n", same ? "MATCH" : "MISMATCH",
|
|
260
|
+
got, got == EXPECT_CHK ? "PASS" : "FAIL", vic.ctrl1);
|
|
261
|
+
|
|
262
|
+
// 6. show the loaded set, drop the split, report the verdict
|
|
263
|
+
vic.memptr = (char)(((0x0400 >> 10) << 4) | ((0x3800 >> 10) & 0x0e));
|
|
264
|
+
vic.intr_enable = 0;
|
|
265
|
+
vic.intr_ctrl = 1;
|
|
266
|
+
bool pass = same && got == EXPECT_CHK;
|
|
267
|
+
vic.color_border = pass ? VCOL_GREEN : VCOL_RED;
|
|
268
|
+
RESULT = pass ? 1 : 2;
|
|
269
|
+
for (;;) ;
|
|
270
|
+
return 0;
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Build
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
oscar64 -tm=c64 -O2 -o=load-asset-runtime.prg load-asset-runtime.c
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Produces `load-asset-runtime.prg`, 6,710 bytes. `kernalio.h` and
|
|
281
|
+
`rasterirq.h` carry `#pragma compile` lines for their `.c` files, so
|
|
282
|
+
nothing else goes on the command line. The `#pragma region` at the top
|
|
283
|
+
redefines `main` as `$0880` to `$3800` with a 1 KB stack and a 256-byte
|
|
284
|
+
heap minimum; without the two size pragmas the linker refused with
|
|
285
|
+
`Cannot place stack section`, because the C64 default stack is 4 KB
|
|
286
|
+
(`toolchains/oscar64-reference.md`). The `.map` shows bss at `$2235`
|
|
287
|
+
to `$2B0D`, so `built` sits at `$2235` and nothing but the `$0801`
|
|
288
|
+
startup stub is outside the region. The run needs a disk in drive 8:
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
c1541 -format "TEST,01" d64 test.d64
|
|
292
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
293
|
+
-limitcycles 24000000 -8 test.d64 \
|
|
294
|
+
-drive8wobbleamplitude 0 -drive8wobblefrequency 0 \
|
|
295
|
+
-exitscreenshot load-asset-runtime.png -autostart load-asset-runtime.prg
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
## Expected output
|
|
299
|
+
|
|
300
|
+
On a fresh disk, PAL:
|
|
301
|
+
|
|
302
|
+
```
|
|
303
|
+
LOAD ASSET AT RUN TIME
|
|
304
|
+
BUILT 2048 BYTES CHK C4FF
|
|
305
|
+
IDLE CYC=981940 F=49 IRQ=50 R=101..101
|
|
306
|
+
LOAD C=1 A=04 I=0 ST=42 END=0003
|
|
307
|
+
CYC=1536937 F=78 IRQ=2 R=101..101
|
|
308
|
+
DRIVE: 62, FILE NOT FOUND,00,00
|
|
309
|
+
SAVE 1 ST=00
|
|
310
|
+
CYC=7675684 F=390 IRQ=146 R=101..248
|
|
311
|
+
DRIVE: 00, OK,00,00
|
|
312
|
+
LOAD C=0 A=C7 I=0 ST=40 END=4000
|
|
313
|
+
CYC=5572444 F=283 IRQ=222 R=101..170
|
|
314
|
+
DRIVE: 00, OK,00,00
|
|
315
|
+
MATCH CHK C4FF PASS D011=1B
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
Every character on the screen has a dotted line under it, because
|
|
319
|
+
the VIC is reading the loaded set at `$3800` by the time the picture
|
|
320
|
+
is taken; the space glyph was left alone so the gaps stay blank. The
|
|
321
|
+
border is green, `$02FF` holds `01`. Screenshots from the pinned
|
|
322
|
+
command: `screenshots/load-asset-runtime.png` (PAL) and
|
|
323
|
+
`screenshots/load-asset-runtime-ntsc.png` (NTSC), each from a disk
|
|
324
|
+
formatted as `TEST,01` immediately before the run. A second run of each
|
|
325
|
+
on another fresh disk gave a byte-identical PNG. The NTSC picture
|
|
326
|
+
differs in the `CYC`, `F`, `IRQ` and `R` figures only: idle
|
|
327
|
+
`854250 F=49`, the failed LOAD `1588028 F=92 IRQ=3 R=101..111`, the
|
|
328
|
+
SAVE `7971572 F=466 IRQ=171 R=101..242`, the LOAD
|
|
329
|
+
`5773293 F=337 IRQ=265 R=101..237`.
|
|
330
|
+
|
|
331
|
+
The `$02FF` trace, route 2 of `runtime/vice-reference.md` "Verifying a
|
|
332
|
+
run without a human", with the pinned command plus `-moncommands` on
|
|
333
|
+
a fresh disk: two dumps, `>C:02ff 00` from the reset clearing page 2
|
|
334
|
+
and `>C:02ff 01` from the program.
|
|
335
|
+
|
|
336
|
+
Read the lines in order:
|
|
337
|
+
|
|
338
|
+
- `BUILT`: the 2 KB set is the uppercase ROM font copied out from under
|
|
339
|
+
I/O with `mmap_set(MMAP_CHAR_ROM)`, row 7 of every glyph except 32
|
|
340
|
+
XORed with `$55`. `C4FF` is the fold `chk = ((chk ^ b) * 5 + 1) &
|
|
341
|
+
0xffff` over those bytes, and the same fold in Python over
|
|
342
|
+
`chargen-901225-01.bin` with the same edit gives `0xC4FF`, the
|
|
343
|
+
compiled-in `EXPECT_CHK`.
|
|
344
|
+
- `IDLE`: 50 `rirq_wait()` frames with the bus quiet: 50 handler
|
|
345
|
+
entries, all on line 101, one past the row-100 slot. This is the
|
|
346
|
+
baseline the two transfers are read against.
|
|
347
|
+
- First `LOAD`: `C=1 A=04`, the KERNAL's file-not-found, with `ST=42`
|
|
348
|
+
and the drive saying `62, FILE NOT FOUND,00,00`. It cost 1.5 million
|
|
349
|
+
cycles, 78 PAL frames, for the drive to spin up and search the
|
|
350
|
+
directory, and the split handler ran twice in those 78 frames.
|
|
351
|
+
`END=0003` is whatever X/Y held on the failure path and means
|
|
352
|
+
nothing. `I=0`: LOAD was entered with the I flag set and returned
|
|
353
|
+
with it clear. That is the `kernal_assumes_sei_cleared` pitfall
|
|
354
|
+
measured on LOAD itself: the serial primitives end in `CLI`, so a
|
|
355
|
+
caller's `SEI` does not survive the first byte on the bus, and there
|
|
356
|
+
is nothing to restore afterwards because the flag is simply gone.
|
|
357
|
+
- `SAVE 1 ST=00`: `krnio_save(8, built, built + 2048)` wrote the set as
|
|
358
|
+
the PRG `CHARSET` whose two-byte header says `$2235`, the address of
|
|
359
|
+
`built`. 7.7 million cycles, 390 frames, drive reply `00, OK`. The
|
|
360
|
+
split handler entered 146 times in those 390 frames and as late as
|
|
361
|
+
line 248.
|
|
362
|
+
- Second `LOAD`: `C=0`, `END=4000`, which is `$3800` plus 2,048: the
|
|
363
|
+
file's own header was discarded and the bytes went where X/Y said.
|
|
364
|
+
`ST=40` is EOF, the bit the last byte arrives with, and it is what
|
|
365
|
+
READST reports after a successful LOAD; test the carry, not ST, for
|
|
366
|
+
success. 5.6 million cycles, 283 frames, 222 handler entries. `A=C7`
|
|
367
|
+
is a leftover in the accumulator with no meaning on the success path.
|
|
368
|
+
- `MATCH CHK C4FF PASS`: `memcmp` of `$3800` against `built` is zero
|
|
369
|
+
and the fold of `$3800` is the expected value. `D011=1B`: bit 4, the
|
|
370
|
+
display enable, is set after the load, so the KERNAL did not blank
|
|
371
|
+
the screen; bit 7 is the raster counter's ninth bit at the moment of
|
|
372
|
+
the read and varies.
|
|
373
|
+
|
|
374
|
+
### What LOAD does to the screen and the raster IRQ
|
|
375
|
+
|
|
376
|
+
Two control runs of the same PRG on fresh disks, PAL, not pinned. At
|
|
377
|
+
9,000,000 cycles the program is inside the SAVE: the text area shows
|
|
378
|
+
the six lines up to `DRIVE: 62` in the ROM font on the normal blue,
|
|
379
|
+
and the border is light blue from the top of the frame to the bottom,
|
|
380
|
+
no white band at all. At 16,000,000 cycles it is inside the second
|
|
381
|
+
LOAD: the same text plus the three SAVE lines, background unchanged,
|
|
382
|
+
and the border is white from PNG y 105 to 206, raster lines 121 to
|
|
383
|
+
222, against 101 to 200 when idle. So the screen is never blanked and
|
|
384
|
+
the raster IRQ is not stopped, but it is late or missing: the handler
|
|
385
|
+
armed for row 100 entered in 146 of 390 SAVE frames and 222 of 283
|
|
386
|
+
LOAD frames, as late as line 248. `raster_irq_during_serial_io` in
|
|
387
|
+
`pitfalls/kernal-and-io.md` has the mechanism and the fix, which is to
|
|
388
|
+
clear `$D01A` around the call rather than rely on `SEI`; this program
|
|
389
|
+
keeps the IRQ armed on purpose, to count what happens.
|
|
390
|
+
|
|
391
|
+
The C64 KERNAL's LOAD does not touch `$D011`: `D011=1B` after the
|
|
392
|
+
load, and the control pictures show the text area drawn mid-transfer.
|
|
393
|
+
Fast loaders and other Commodore machines that blank the screen while
|
|
394
|
+
the drive works are doing it themselves, and were not measured here.
|
|
395
|
+
|
|
396
|
+
### The second start
|
|
397
|
+
|
|
398
|
+
The pinned run leaves `CHARSET` on the disk. Running the same PRG
|
|
399
|
+
again against that disk, PAL, 24,000,000 cycles, gave:
|
|
400
|
+
|
|
401
|
+
```
|
|
402
|
+
LOAD C=0 A=C7 I=0 ST=40 END=4000
|
|
403
|
+
CYC=6931765 F=352 IRQ=223 R=101..195
|
|
404
|
+
DRIVE: 00, OK,00,00
|
|
405
|
+
MATCH CHK C4FF PASS D011=1B
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
No `62`, no SAVE. The one LOAD took 6.9 million cycles against 5.6
|
|
409
|
+
million for the second LOAD of the first run; the 1.4 million cycle
|
|
410
|
+
difference is about what the failed first LOAD cost, the drive's
|
|
411
|
+
spin-up and directory search, which the first run paid once and the
|
|
412
|
+
second start pays inside its only LOAD.
|
|
413
|
+
|
|
414
|
+
### The disk afterwards
|
|
415
|
+
|
|
416
|
+
`c1541 -attach test.d64 -list` printed:
|
|
417
|
+
|
|
418
|
+
```
|
|
419
|
+
0 "TEST " 01 2a
|
|
420
|
+
9 "charset" prg
|
|
421
|
+
655 blocks free.
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
`c1541 -read charset charset-back.prg` gave 2,050 bytes: header
|
|
425
|
+
`35 22`, that is `$2235`, then 2,048 bytes equal to the set Python
|
|
426
|
+
built from the ROM image. c1541 prints the name in lower case because
|
|
427
|
+
it shows unshifted PETSCII that way; the program wrote `CHARSET` in
|
|
428
|
+
upper case and reads it back with the same literal, so the shift never
|
|
429
|
+
comes into it. It would if the file were put on the disk with `c1541
|
|
430
|
+
-write` from the host, which is the `c1541_uppercase_filename_petscii_shift`
|
|
431
|
+
pitfall; a game that ships its asset on the disk image has to get that
|
|
432
|
+
right, and this recipe sidesteps it by writing the file from the C64.
|
|
433
|
+
|
|
434
|
+
## Why this works
|
|
435
|
+
|
|
436
|
+
`load_to` is SETLFS, SETNAM and LOAD written out in inline assembly
|
|
437
|
+
because Oscar64's `krnio_load(fnum, device, channel)` passes X = Y = 0
|
|
438
|
+
to LOAD (`kernalio.c`), which with secondary address 0 means load to
|
|
439
|
+
`$0000`. `krnio_load` is only useful with secondary 1, where the file's
|
|
440
|
+
header decides. With `ldy #0` to SETLFS the KERNAL reads the two header
|
|
441
|
+
bytes and throws them away, substituting the X/Y the caller gave LOAD;
|
|
442
|
+
with `ldy #1` it keeps them. Either way the bytes are stored through
|
|
443
|
+
the pointer at `$AE/$AF`, and the X/Y returned is that pointer after
|
|
444
|
+
the last store, which is why `END=4000` says 2,048 bytes arrived.
|
|
445
|
+
`techniques/file-io.md` under `kernal_load_to_address` has the same
|
|
446
|
+
sequence in KickAssembler and the measurements for both secondary
|
|
447
|
+
addresses.
|
|
448
|
+
|
|
449
|
+
A game supplies its own address for the reason this program does: the
|
|
450
|
+
file was saved from wherever the buffer happened to be when the artist
|
|
451
|
+
or the build made it, `$2235` here, and the game wants it somewhere
|
|
452
|
+
else, in the VIC's bank at a character-set boundary. Secondary 0 makes
|
|
453
|
+
the file's header irrelevant, so one file serves both buffers of a
|
|
454
|
+
double-buffered charset or any map slot. Secondary 1 is for the case
|
|
455
|
+
where the file's author chose the address and the program must honour
|
|
456
|
+
it, a PRG-format music file assembled to `$1000` for example.
|
|
457
|
+
|
|
458
|
+
`krnio_save(device, start, end)` is SETLFS with secondary 0, then SAVE
|
|
459
|
+
with A pointing at the start pointer in zero page and X/Y the end. It
|
|
460
|
+
writes the two-byte header from `start`, so the file on the disk is a
|
|
461
|
+
PRG that LOADs back to `built` with secondary 1 and anywhere with
|
|
462
|
+
secondary 0. The `krnio_save_leaves_splat_file` pitfall applies if the
|
|
463
|
+
emulator is stopped before the drive finishes; the 24,000,000 cycle
|
|
464
|
+
pin is well past the end of the run, and the listing shows no `*`.
|
|
465
|
+
|
|
466
|
+
The raster split is `iotest.c` from `high-score-persist.md`, section
|
|
467
|
+
"A raster IRQ during file I/O", cut down to one handler. It keeps the
|
|
468
|
+
KERNAL IRQ (`rirq_init(true)`) so the jiffy clock and the keyboard scan
|
|
469
|
+
still run, and it is switched off with `vic.intr_enable = 0` before
|
|
470
|
+
the verdict colour goes in the border so the split cannot repaint it.
|
|
471
|
+
One correction to that test program: its model check read `PAL` on
|
|
472
|
+
NTSC in two of its builds, and the cause is a race in
|
|
473
|
+
`if ((vic.ctrl1 & 0x80) && r > top)` with `r` read first. A `$D012`
|
|
474
|
+
read on line 255 followed by a `$D011` read on line 256 counts as line
|
|
475
|
+
`$1FF`, which is above the PAL top, and it happens on either model. The
|
|
476
|
+
first version of this program had the same defect and printed `F=42`
|
|
477
|
+
for the NTSC idle frames, that is 844,100 cycles divided by 19,656.
|
|
478
|
+
Reading bit 7 of `$D011` on both sides of the `$D012` read and
|
|
479
|
+
requiring both set removes it: the NTSC idle line now reads `F=49`.
|
|
480
|
+
|
|
481
|
+
The drive's status channel is opened only after a LOAD has answered,
|
|
482
|
+
and not at all when LOAD returns `A=5`, device not present. A bare
|
|
483
|
+
`OPEN` of secondary 15 sends nothing on the bus, so it cannot fail for
|
|
484
|
+
want of a drive, and the read that follows would then wait for ever
|
|
485
|
+
(`high-score-persist.md`). The KB's lint flags every bare `OPEN 15`
|
|
486
|
+
followed by a read as a heuristic, this one included; the guard is
|
|
487
|
+
what makes it safe here.
|
|
488
|
+
|
|
489
|
+
Nothing on this page was measured on hardware. The cycle counts are
|
|
490
|
+
CIA2 timers A and B chained, read in VICE x64sc 3.10 with true drive
|
|
491
|
+
emulation and the drive's RPM wobble switched off, as the verifier pins
|
|
492
|
+
it; frames are those cycles over 19,656 (PAL) or 17,095 (NTSC).
|