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,800 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: easyflash-save
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: CRT
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [cartridge_save, cartridge_bank_easyflash]
|
|
7
|
+
file_formats: [CRT]
|
|
8
|
+
uses_registers: [DE00, DE02, DC04, DC05, DC06, DC07, DC0E, DC0F, D011, D016, D018, D020, D021]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — EasyFlash high-score save in the cartridge's own flash
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A complete EasyFlash cartridge that keeps a five-entry high-score table in
|
|
19
|
+
its own flash memory. The listing emits the whole `.crt` itself (header,
|
|
20
|
+
a bank 0 ROMH packet with the boot code, and an erased bank 8 ROML packet
|
|
21
|
+
for the save area), so there is no cartconv step. Each boot reads the
|
|
22
|
+
newest saved record, adds a score, and appends a new 32-byte record to
|
|
23
|
+
bank 8 with the Am29F040 command sequences, erasing the 64 KB sector only
|
|
24
|
+
on first use or when the bank is full. It times the erase and the
|
|
25
|
+
programming with a CIA timer, checks the record against its RAM copy, and
|
|
26
|
+
shows `VERIFY PASS` with a green border. This is the `cartridge_save`
|
|
27
|
+
technique with nothing else in it; a game replaces the table with its own
|
|
28
|
+
save data. It does not use EAPI, so it only drives Am29F040-type flash:
|
|
29
|
+
see "Why this works".
|
|
30
|
+
|
|
31
|
+
## Source
|
|
32
|
+
|
|
33
|
+
```asm
|
|
34
|
+
// easyflash-save.asm: an EasyFlash cartridge that keeps a high-score table in
|
|
35
|
+
// its own flash. The whole .crt is emitted by this file (header + two CHIP
|
|
36
|
+
// packets); no cartconv step. The save lives in LOROM bank 8 (flash sector 1
|
|
37
|
+
// of the ROML chip), written with the AM29F040 command sequences directly.
|
|
38
|
+
// Each boot: read the newest record, add a score, append a new record.
|
|
39
|
+
// Build: java -jar KickAss.jar easyflash-save.asm -o easyflash-save.prg
|
|
40
|
+
// (writes easyflash-save.crt beside the source; the .prg is empty)
|
|
41
|
+
// Run: x64sc -easyflashcrtwrite -cartcrt easyflash-save.crt
|
|
42
|
+
|
|
43
|
+
.const EF_BANK = $de00
|
|
44
|
+
.const EF_CTRL = $de02
|
|
45
|
+
.const SAVE_BANK = 8 // banks 8..15 of ROML = flash sector 1
|
|
46
|
+
.const SCREEN = $0400
|
|
47
|
+
.const RECLEN = 32
|
|
48
|
+
.const CMD1 = $8555 // chip address $555 (A0-A10 decoded)
|
|
49
|
+
.const CMD2 = $82aa // chip address $2AA
|
|
50
|
+
.const RUNADDR = $0800 // main code runs from RAM; $0000-$0FFF is
|
|
51
|
+
// the only RAM visible in Ultimax mode
|
|
52
|
+
.const MODE16K = $07 // MODE|EXROM|GAME: ROML $8000, ROMH $A000
|
|
53
|
+
.const ULTIMAX = $05 // MODE|GAME: ROML $8000, ROMH $E000, no KERNAL
|
|
54
|
+
.const CARTOFF = $04
|
|
55
|
+
|
|
56
|
+
.const ptr = $fb // flash slot pointer
|
|
57
|
+
.const scr = $fd // screen pointer
|
|
58
|
+
.const n = $02 // slot being scanned
|
|
59
|
+
.const last = $03 // newest valid slot, 0 = none
|
|
60
|
+
.const free = $04 // first free slot after it, 0 = none
|
|
61
|
+
.const tmp = $05
|
|
62
|
+
.const cnt = $06
|
|
63
|
+
.const erased = $07 // 1 when this boot erased the sector
|
|
64
|
+
.const bad = $08 // verify failures
|
|
65
|
+
.const t0 = $09 // 4 bytes: elapsed cycles, little-endian
|
|
66
|
+
|
|
67
|
+
.segmentdef Main [start=RUNADDR] // code that runs from RAM
|
|
68
|
+
.segmentdef Romh [start=$e000, min=$e000, max=$ffff, fill, fillByte=$ff]
|
|
69
|
+
.segmentdef Crt [start=0, outBin="easyflash-save.crt"]
|
|
70
|
+
.segment Crt
|
|
71
|
+
|
|
72
|
+
// ---- CRT file header (64 bytes, big-endian fields) ----
|
|
73
|
+
.encoding "ascii"
|
|
74
|
+
.text "C64 CARTRIDGE "
|
|
75
|
+
.byte 0,0,0,$40 // header length
|
|
76
|
+
.byte 1,0 // version 1.0
|
|
77
|
+
.byte 0,32 // hardware type 32 = EasyFlash
|
|
78
|
+
.byte 1,0 // EXROM inactive, GAME active: Ultimax boot
|
|
79
|
+
.fill 6,0
|
|
80
|
+
.text "FLASH SAVE"
|
|
81
|
+
.fill 32-10,0
|
|
82
|
+
// ---- CHIP packet: bank 0 ROMH (seen at $E000 in Ultimax) ----
|
|
83
|
+
.text "CHIP"
|
|
84
|
+
.byte 0,0,$20,$10 // packet length $2010
|
|
85
|
+
.byte 0,2 // chip type 2 = flash
|
|
86
|
+
.byte 0,0 // bank 0
|
|
87
|
+
.byte $a0,$00 // load address $A000 (ROMH)
|
|
88
|
+
.byte $20,$00 // 8 KB
|
|
89
|
+
.segmentout [segments="Romh"]
|
|
90
|
+
// ---- CHIP packet: bank 8 ROML, the save area, shipped erased ($FF) ----
|
|
91
|
+
// (EasyProg erases only the sectors a CRT contains; the boot code checks
|
|
92
|
+
// a signature anyway, in case the bank holds another image's bytes.)
|
|
93
|
+
.text "CHIP"
|
|
94
|
+
.byte 0,0,$20,$10
|
|
95
|
+
.byte 0,2
|
|
96
|
+
.byte 0,SAVE_BANK
|
|
97
|
+
.byte $80,$00 // load address $8000 (ROML)
|
|
98
|
+
.byte $20,$00
|
|
99
|
+
.fill $2000,$ff
|
|
100
|
+
.encoding "screencode_upper"
|
|
101
|
+
|
|
102
|
+
.segment Romh
|
|
103
|
+
reset: sei
|
|
104
|
+
cld
|
|
105
|
+
ldx #$ff
|
|
106
|
+
txs
|
|
107
|
+
lda #$2f
|
|
108
|
+
sta $00
|
|
109
|
+
lda #$37
|
|
110
|
+
sta $01
|
|
111
|
+
ldx #0 // copy main code to RAM ($0800-$0FFF is
|
|
112
|
+
copy: .for (var p = 0; p < 8; p++) { // visible in Ultimax mode)
|
|
113
|
+
lda image + p*$100,x
|
|
114
|
+
sta RUNADDR + p*$100,x
|
|
115
|
+
}
|
|
116
|
+
inx
|
|
117
|
+
bne copy
|
|
118
|
+
jmp RUNADDR
|
|
119
|
+
|
|
120
|
+
image: .segmentout [segments="Main"]
|
|
121
|
+
nmi: rti
|
|
122
|
+
* = $fffa
|
|
123
|
+
.word nmi, reset, nmi
|
|
124
|
+
|
|
125
|
+
.segment Main
|
|
126
|
+
main: lda #CARTOFF // mark the RAM under the command addresses
|
|
127
|
+
sta EF_CTRL
|
|
128
|
+
lda #0
|
|
129
|
+
sta CMD1
|
|
130
|
+
sta CMD2
|
|
131
|
+
lda #MODE16K
|
|
132
|
+
sta EF_CTRL
|
|
133
|
+
jsr screen_init
|
|
134
|
+
lda #SAVE_BANK
|
|
135
|
+
sta EF_BANK
|
|
136
|
+
lda #0
|
|
137
|
+
sta erased
|
|
138
|
+
sta bad
|
|
139
|
+
// ---- format check: signature in the first 4 bytes of the bank ----
|
|
140
|
+
ldx #3
|
|
141
|
+
sig: lda $8000,x
|
|
142
|
+
cmp signature,x
|
|
143
|
+
bne format
|
|
144
|
+
dex
|
|
145
|
+
bpl sig
|
|
146
|
+
jmp scan
|
|
147
|
+
format: jsr erase_sector // blank or foreign bank: erase it
|
|
148
|
+
jsr write_signature
|
|
149
|
+
// ---- find newest valid record and first free slot ----
|
|
150
|
+
scan: lda #0
|
|
151
|
+
sta last
|
|
152
|
+
sta free
|
|
153
|
+
lda #1
|
|
154
|
+
sta n
|
|
155
|
+
scanlp: jsr slot_ptr
|
|
156
|
+
ldy #RECLEN-1
|
|
157
|
+
lda (ptr),y
|
|
158
|
+
bne notvalid // commit byte $00 = complete record
|
|
159
|
+
lda n
|
|
160
|
+
sta last
|
|
161
|
+
lda #0
|
|
162
|
+
sta free
|
|
163
|
+
beq scannext
|
|
164
|
+
notvalid:
|
|
165
|
+
lda (ptr),y // all 32 bytes $FF = free; else torn, skip
|
|
166
|
+
cmp #$ff
|
|
167
|
+
bne scannext
|
|
168
|
+
dey
|
|
169
|
+
bpl notvalid
|
|
170
|
+
lda free
|
|
171
|
+
bne scannext
|
|
172
|
+
lda n
|
|
173
|
+
sta free
|
|
174
|
+
scannext:
|
|
175
|
+
inc n
|
|
176
|
+
bne scanlp
|
|
177
|
+
// ---- load newest record or the default table ----
|
|
178
|
+
ldx #RECLEN-1
|
|
179
|
+
lda last
|
|
180
|
+
beq usedef
|
|
181
|
+
sta n
|
|
182
|
+
jsr slot_ptr
|
|
183
|
+
ldy #RECLEN-1
|
|
184
|
+
ld: lda (ptr),y
|
|
185
|
+
sta rec,y
|
|
186
|
+
dey
|
|
187
|
+
bpl ld
|
|
188
|
+
bmi update
|
|
189
|
+
usedef: lda defaults,x
|
|
190
|
+
sta rec,x
|
|
191
|
+
dex
|
|
192
|
+
bpl usedef
|
|
193
|
+
// ---- this boot's score: boot number x 1250 (BCD) ----
|
|
194
|
+
update: inc rec // boot counter, stops at 255
|
|
195
|
+
bne !+
|
|
196
|
+
dec rec
|
|
197
|
+
!:
|
|
198
|
+
lda #0
|
|
199
|
+
sta newsc
|
|
200
|
+
sta newsc+1
|
|
201
|
+
sta newsc+2
|
|
202
|
+
ldx rec
|
|
203
|
+
sed
|
|
204
|
+
mul: clc
|
|
205
|
+
lda newsc+2
|
|
206
|
+
adc #$50
|
|
207
|
+
sta newsc+2
|
|
208
|
+
lda newsc+1
|
|
209
|
+
adc #$12
|
|
210
|
+
sta newsc+1
|
|
211
|
+
lda newsc
|
|
212
|
+
adc #0
|
|
213
|
+
sta newsc
|
|
214
|
+
dex
|
|
215
|
+
bne mul
|
|
216
|
+
cld
|
|
217
|
+
jsr insert
|
|
218
|
+
// ---- save: append, erasing only when the bank is full ----
|
|
219
|
+
lda free
|
|
220
|
+
bne havefree
|
|
221
|
+
jsr erase_sector
|
|
222
|
+
jsr write_signature
|
|
223
|
+
lda #1
|
|
224
|
+
havefree:
|
|
225
|
+
sta n
|
|
226
|
+
jsr slot_ptr
|
|
227
|
+
lda #0
|
|
228
|
+
sta rec+RECLEN-1 // commit byte, programmed last
|
|
229
|
+
jsr timer_start
|
|
230
|
+
ldy #0
|
|
231
|
+
prog: lda rec,y
|
|
232
|
+
jsr program_byte
|
|
233
|
+
iny
|
|
234
|
+
cpy #RECLEN
|
|
235
|
+
bne prog
|
|
236
|
+
jsr timer_stop
|
|
237
|
+
ldx #3
|
|
238
|
+
cpp: lda t0,x
|
|
239
|
+
sta progt,x
|
|
240
|
+
dex
|
|
241
|
+
bpl cpp
|
|
242
|
+
ldy #RECLEN-1 // verify against the RAM copy
|
|
243
|
+
ver: lda (ptr),y
|
|
244
|
+
cmp rec,y
|
|
245
|
+
beq verok
|
|
246
|
+
inc bad
|
|
247
|
+
verok: dey
|
|
248
|
+
bpl ver
|
|
249
|
+
// ---- what the command writes left in the RAM under ROML ----
|
|
250
|
+
lda #CARTOFF // cartridge off: $8000 reads RAM
|
|
251
|
+
sta EF_CTRL
|
|
252
|
+
lda CMD1
|
|
253
|
+
sta ram555
|
|
254
|
+
lda CMD2
|
|
255
|
+
sta ram2aa
|
|
256
|
+
lda #MODE16K
|
|
257
|
+
sta EF_CTRL
|
|
258
|
+
jmp report
|
|
259
|
+
|
|
260
|
+
// slot n -> ptr = $8000 + n*32
|
|
261
|
+
slot_ptr:
|
|
262
|
+
lda n
|
|
263
|
+
asl
|
|
264
|
+
asl
|
|
265
|
+
asl
|
|
266
|
+
asl
|
|
267
|
+
asl
|
|
268
|
+
sta ptr
|
|
269
|
+
lda n
|
|
270
|
+
lsr
|
|
271
|
+
lsr
|
|
272
|
+
lsr
|
|
273
|
+
ora #$80
|
|
274
|
+
sta ptr+1
|
|
275
|
+
rts
|
|
276
|
+
|
|
277
|
+
// unlock cycles common to every command
|
|
278
|
+
unlock: lda #$aa
|
|
279
|
+
sta CMD1
|
|
280
|
+
lda #$55
|
|
281
|
+
sta CMD2
|
|
282
|
+
rts
|
|
283
|
+
|
|
284
|
+
// program A at (ptr),y; waits until the toggle bit stops.
|
|
285
|
+
// Ultimax mode for the whole command: only then do writes reach ROML.
|
|
286
|
+
program_byte:
|
|
287
|
+
sta tmp
|
|
288
|
+
lda #ULTIMAX
|
|
289
|
+
sta EF_CTRL
|
|
290
|
+
jsr unlock
|
|
291
|
+
lda #$a0
|
|
292
|
+
sta CMD1
|
|
293
|
+
lda tmp
|
|
294
|
+
sta (ptr),y
|
|
295
|
+
pwait: lda (ptr),y // DQ6 toggles on each read while busy
|
|
296
|
+
cmp (ptr),y
|
|
297
|
+
bne pwait
|
|
298
|
+
lda #MODE16K
|
|
299
|
+
sta EF_CTRL
|
|
300
|
+
rts
|
|
301
|
+
|
|
302
|
+
// erase the 64 KB sector holding the selected bank (timed)
|
|
303
|
+
erase_sector:
|
|
304
|
+
jsr timer_start
|
|
305
|
+
lda #ULTIMAX
|
|
306
|
+
sta EF_CTRL
|
|
307
|
+
jsr unlock
|
|
308
|
+
lda #$80
|
|
309
|
+
sta CMD1
|
|
310
|
+
jsr unlock
|
|
311
|
+
lda #$30
|
|
312
|
+
sta $8000
|
|
313
|
+
ewait: lda $8000
|
|
314
|
+
cmp $8000
|
|
315
|
+
bne ewait
|
|
316
|
+
lda #MODE16K
|
|
317
|
+
sta EF_CTRL
|
|
318
|
+
jsr timer_stop
|
|
319
|
+
ldx #3
|
|
320
|
+
cpe: lda t0,x
|
|
321
|
+
sta eraset,x
|
|
322
|
+
dex
|
|
323
|
+
bpl cpe
|
|
324
|
+
inc erased
|
|
325
|
+
rts
|
|
326
|
+
|
|
327
|
+
write_signature:
|
|
328
|
+
lda #<$8000
|
|
329
|
+
sta ptr
|
|
330
|
+
lda #>$8000
|
|
331
|
+
sta ptr+1
|
|
332
|
+
ldy #0
|
|
333
|
+
ws: lda signature,y
|
|
334
|
+
jsr program_byte
|
|
335
|
+
iny
|
|
336
|
+
cpy #4
|
|
337
|
+
bne ws
|
|
338
|
+
rts
|
|
339
|
+
|
|
340
|
+
// insert "YOU" + newsc into the 5-entry table at rec+1 (6 bytes each:
|
|
341
|
+
// 3 screen-code initials, 3 BCD score bytes, high byte first)
|
|
342
|
+
insert: ldx #0 // entry offset 0, 6, .. 24
|
|
343
|
+
ilp: lda newsc
|
|
344
|
+
cmp rec+4,x
|
|
345
|
+
bne idec
|
|
346
|
+
lda newsc+1
|
|
347
|
+
cmp rec+5,x
|
|
348
|
+
bne idec
|
|
349
|
+
lda newsc+2
|
|
350
|
+
cmp rec+6,x
|
|
351
|
+
beq inext // equal: the older entry stays above
|
|
352
|
+
idec: bcs place // new > entry
|
|
353
|
+
inext: txa
|
|
354
|
+
clc
|
|
355
|
+
adc #6
|
|
356
|
+
tax
|
|
357
|
+
cpx #30
|
|
358
|
+
bne ilp
|
|
359
|
+
rts // not in the top five
|
|
360
|
+
place: stx tmp // move entries x..18 down by one row
|
|
361
|
+
ldy #23
|
|
362
|
+
shift: cpy tmp
|
|
363
|
+
bcc put
|
|
364
|
+
lda rec+1,y
|
|
365
|
+
sta rec+7,y
|
|
366
|
+
dey
|
|
367
|
+
bpl shift
|
|
368
|
+
put: ldy #0
|
|
369
|
+
putlp: lda you,y // "YOU" then newsc, adjacent in memory
|
|
370
|
+
sta rec+1,x
|
|
371
|
+
inx
|
|
372
|
+
iny
|
|
373
|
+
cpy #6
|
|
374
|
+
bne putlp
|
|
375
|
+
rts
|
|
376
|
+
|
|
377
|
+
// ---- CIA1 timer A and B chained: 32-bit down-counter ----
|
|
378
|
+
timer_start:
|
|
379
|
+
lda #0
|
|
380
|
+
sta $dc0e
|
|
381
|
+
sta $dc0f
|
|
382
|
+
lda #$ff
|
|
383
|
+
sta $dc04
|
|
384
|
+
sta $dc05
|
|
385
|
+
sta $dc06
|
|
386
|
+
sta $dc07
|
|
387
|
+
lda #$51 // B: count A underflows, force load, start
|
|
388
|
+
sta $dc0f
|
|
389
|
+
lda #$11 // A: continuous, force load, start
|
|
390
|
+
sta $dc0e
|
|
391
|
+
rts
|
|
392
|
+
timer_stop:
|
|
393
|
+
lda #0
|
|
394
|
+
sta $dc0e // stop A, then read
|
|
395
|
+
lda $dc04
|
|
396
|
+
eor #$ff
|
|
397
|
+
sta t0
|
|
398
|
+
lda $dc05
|
|
399
|
+
eor #$ff
|
|
400
|
+
sta t0+1
|
|
401
|
+
lda $dc06
|
|
402
|
+
eor #$ff
|
|
403
|
+
sta t0+2
|
|
404
|
+
lda $dc07
|
|
405
|
+
eor #$ff
|
|
406
|
+
sta t0+3
|
|
407
|
+
rts
|
|
408
|
+
|
|
409
|
+
// ---- screen output ----
|
|
410
|
+
screen_init:
|
|
411
|
+
lda #$1b
|
|
412
|
+
sta $d011
|
|
413
|
+
lda #$08
|
|
414
|
+
sta $d016
|
|
415
|
+
lda #$15
|
|
416
|
+
sta $d018
|
|
417
|
+
lda #0
|
|
418
|
+
sta $d020
|
|
419
|
+
sta $d021
|
|
420
|
+
ldx #0
|
|
421
|
+
cls: lda #$20
|
|
422
|
+
sta SCREEN,x
|
|
423
|
+
sta SCREEN+$100,x
|
|
424
|
+
sta SCREEN+$200,x
|
|
425
|
+
sta SCREEN+$2e8,x
|
|
426
|
+
lda #1
|
|
427
|
+
sta $d800,x
|
|
428
|
+
sta $d900,x
|
|
429
|
+
sta $da00,x
|
|
430
|
+
sta $dae8,x
|
|
431
|
+
inx
|
|
432
|
+
bne cls
|
|
433
|
+
rts
|
|
434
|
+
|
|
435
|
+
// print zero-terminated text at (scr); x:y = address of text (lo, hi)
|
|
436
|
+
print: stx pp+1
|
|
437
|
+
sty pp+2
|
|
438
|
+
ldy #0
|
|
439
|
+
pp: lda $ffff,y
|
|
440
|
+
beq pdone
|
|
441
|
+
sta (scr),y
|
|
442
|
+
iny
|
|
443
|
+
bne pp
|
|
444
|
+
pdone: tya // advance scr past the text
|
|
445
|
+
clc
|
|
446
|
+
adc scr
|
|
447
|
+
sta scr
|
|
448
|
+
bcc !+
|
|
449
|
+
inc scr+1
|
|
450
|
+
!: rts
|
|
451
|
+
|
|
452
|
+
// print A as two hex digits at (scr), advance
|
|
453
|
+
hex: pha
|
|
454
|
+
lsr
|
|
455
|
+
lsr
|
|
456
|
+
lsr
|
|
457
|
+
lsr
|
|
458
|
+
jsr nib
|
|
459
|
+
pla
|
|
460
|
+
and #$0f
|
|
461
|
+
nib: tax
|
|
462
|
+
lda hexd,x
|
|
463
|
+
ldy #0
|
|
464
|
+
sta (scr),y
|
|
465
|
+
inc scr
|
|
466
|
+
bne !+
|
|
467
|
+
inc scr+1
|
|
468
|
+
!: rts
|
|
469
|
+
|
|
470
|
+
at: // x = row
|
|
471
|
+
lda #<SCREEN
|
|
472
|
+
sta scr
|
|
473
|
+
lda #>SCREEN
|
|
474
|
+
sta scr+1
|
|
475
|
+
cpx #0
|
|
476
|
+
beq atd
|
|
477
|
+
atl: lda scr
|
|
478
|
+
clc
|
|
479
|
+
adc #40
|
|
480
|
+
sta scr
|
|
481
|
+
bcc !+
|
|
482
|
+
inc scr+1
|
|
483
|
+
!: dex
|
|
484
|
+
bne atl
|
|
485
|
+
atd: rts
|
|
486
|
+
|
|
487
|
+
report: ldx #1
|
|
488
|
+
jsr at
|
|
489
|
+
ldx #<s_title
|
|
490
|
+
ldy #>s_title
|
|
491
|
+
jsr print
|
|
492
|
+
ldx #3
|
|
493
|
+
jsr at
|
|
494
|
+
ldx #<s_boot
|
|
495
|
+
ldy #>s_boot
|
|
496
|
+
jsr print
|
|
497
|
+
lda rec
|
|
498
|
+
jsr hex
|
|
499
|
+
ldx #<s_slot
|
|
500
|
+
ldy #>s_slot
|
|
501
|
+
jsr print
|
|
502
|
+
lda n
|
|
503
|
+
jsr hex
|
|
504
|
+
ldx #5
|
|
505
|
+
jsr at
|
|
506
|
+
ldx #<s_erase
|
|
507
|
+
ldy #>s_erase
|
|
508
|
+
jsr print
|
|
509
|
+
lda erased
|
|
510
|
+
bne showe
|
|
511
|
+
ldx #<s_none
|
|
512
|
+
ldy #>s_none
|
|
513
|
+
jsr print
|
|
514
|
+
jmp prow
|
|
515
|
+
showe: lda eraset+2
|
|
516
|
+
jsr hex
|
|
517
|
+
lda eraset+1
|
|
518
|
+
jsr hex
|
|
519
|
+
lda eraset
|
|
520
|
+
jsr hex
|
|
521
|
+
ldx #<s_cyc
|
|
522
|
+
ldy #>s_cyc
|
|
523
|
+
jsr print
|
|
524
|
+
prow: ldx #6
|
|
525
|
+
jsr at
|
|
526
|
+
ldx #<s_prog
|
|
527
|
+
ldy #>s_prog
|
|
528
|
+
jsr print
|
|
529
|
+
lda progt+2
|
|
530
|
+
jsr hex
|
|
531
|
+
lda progt+1
|
|
532
|
+
jsr hex
|
|
533
|
+
lda progt
|
|
534
|
+
jsr hex
|
|
535
|
+
ldx #<s_cyc
|
|
536
|
+
ldy #>s_cyc
|
|
537
|
+
jsr print
|
|
538
|
+
ldx #7
|
|
539
|
+
jsr at
|
|
540
|
+
ldx #<s_ram
|
|
541
|
+
ldy #>s_ram
|
|
542
|
+
jsr print
|
|
543
|
+
lda ram555
|
|
544
|
+
jsr hex
|
|
545
|
+
ldx #<s_ram2
|
|
546
|
+
ldy #>s_ram2
|
|
547
|
+
jsr print
|
|
548
|
+
lda ram2aa
|
|
549
|
+
jsr hex
|
|
550
|
+
// table
|
|
551
|
+
lda #0
|
|
552
|
+
sta cnt
|
|
553
|
+
tab: lda cnt
|
|
554
|
+
clc
|
|
555
|
+
adc #10
|
|
556
|
+
tax
|
|
557
|
+
jsr at
|
|
558
|
+
lda #6
|
|
559
|
+
clc
|
|
560
|
+
adc scr
|
|
561
|
+
sta scr
|
|
562
|
+
ldx cnt // entry offset = cnt*6
|
|
563
|
+
lda mul6,x
|
|
564
|
+
tax
|
|
565
|
+
ldy #0
|
|
566
|
+
ini: lda rec+1,x
|
|
567
|
+
sta (scr),y
|
|
568
|
+
inx
|
|
569
|
+
iny
|
|
570
|
+
cpy #3
|
|
571
|
+
bne ini
|
|
572
|
+
lda scr
|
|
573
|
+
clc
|
|
574
|
+
adc #4
|
|
575
|
+
sta scr
|
|
576
|
+
lda rec+1,x
|
|
577
|
+
jsr hex
|
|
578
|
+
ldx cnt
|
|
579
|
+
lda mul6,x
|
|
580
|
+
tax
|
|
581
|
+
lda rec+6,x
|
|
582
|
+
pha
|
|
583
|
+
lda rec+5,x
|
|
584
|
+
jsr hex
|
|
585
|
+
pla
|
|
586
|
+
jsr hex
|
|
587
|
+
inc cnt
|
|
588
|
+
lda cnt
|
|
589
|
+
cmp #5
|
|
590
|
+
bne tab
|
|
591
|
+
ldx #17
|
|
592
|
+
jsr at
|
|
593
|
+
lda bad
|
|
594
|
+
bne fail
|
|
595
|
+
ldx #<s_pass
|
|
596
|
+
ldy #>s_pass
|
|
597
|
+
jsr print
|
|
598
|
+
lda #5 // green border = pass
|
|
599
|
+
sta $d020
|
|
600
|
+
jmp *
|
|
601
|
+
fail: ldx #<s_fail
|
|
602
|
+
ldy #>s_fail
|
|
603
|
+
jsr print
|
|
604
|
+
lda #2 // red border = fail
|
|
605
|
+
sta $d020
|
|
606
|
+
jmp *
|
|
607
|
+
|
|
608
|
+
mul6: .byte 0,6,12,18,24
|
|
609
|
+
hexd: .text "0123456789ABCDEF"
|
|
610
|
+
signature:.text "HS01"
|
|
611
|
+
you: .text "YOU"
|
|
612
|
+
newsc: .byte 0,0,0
|
|
613
|
+
defaults: .byte 0 // boot counter
|
|
614
|
+
.text "ACE"
|
|
615
|
+
.byte $01,$00,$00
|
|
616
|
+
.text "BOB"
|
|
617
|
+
.byte $00,$75,$00
|
|
618
|
+
.text "CAT"
|
|
619
|
+
.byte $00,$50,$00
|
|
620
|
+
.text "DAN"
|
|
621
|
+
.byte $00,$25,$00
|
|
622
|
+
.text "EVE"
|
|
623
|
+
.byte $00,$10,$00
|
|
624
|
+
.byte $ff // commit byte (set to 0 when saved)
|
|
625
|
+
s_title: .text "EASYFLASH SAVE BANK 08 AM29F040"
|
|
626
|
+
.byte 0
|
|
627
|
+
s_boot: .text "BOOT $"
|
|
628
|
+
.byte 0
|
|
629
|
+
s_slot: .text " SLOT $"
|
|
630
|
+
.byte 0
|
|
631
|
+
s_erase: .text "ERASE "
|
|
632
|
+
.byte 0
|
|
633
|
+
s_none: .text "NONE"
|
|
634
|
+
.byte 0
|
|
635
|
+
s_prog: .text "PROGRAM "
|
|
636
|
+
.byte 0
|
|
637
|
+
s_cyc: .text " CYCLES"
|
|
638
|
+
.byte 0
|
|
639
|
+
s_ram: .text "RAM $8555=$"
|
|
640
|
+
.byte 0
|
|
641
|
+
s_ram2: .text " $82AA=$"
|
|
642
|
+
.byte 0
|
|
643
|
+
s_pass: .text "VERIFY PASS"
|
|
644
|
+
.byte 0
|
|
645
|
+
s_fail: .text "VERIFY FAIL"
|
|
646
|
+
.byte 0
|
|
647
|
+
eraset: .byte 0,0,0,0
|
|
648
|
+
progt: .byte 0,0,0,0
|
|
649
|
+
ram555: .byte 0
|
|
650
|
+
ram2aa: .byte 0
|
|
651
|
+
rec: .fill RECLEN,0
|
|
652
|
+
mainend:
|
|
653
|
+
.assert "main code fits in $0800-$0FFF", mainend <= $1000, true
|
|
654
|
+
```
|
|
655
|
+
|
|
656
|
+
## Build
|
|
657
|
+
|
|
658
|
+
```bash
|
|
659
|
+
java -jar $KICKASS_JAR easyflash-save.asm -o easyflash-save.prg
|
|
660
|
+
# writes easyflash-save.crt (16,480 bytes) beside the source.
|
|
661
|
+
# The .prg named by -o is not written: the default segment is empty.
|
|
662
|
+
```
|
|
663
|
+
|
|
664
|
+
## Expected output
|
|
665
|
+
|
|
666
|
+
Run it twice on the same file, with VICE allowed to write the flash back:
|
|
667
|
+
|
|
668
|
+
```bash
|
|
669
|
+
cp easyflash-save.crt run.crt
|
|
670
|
+
x64sc -default -warp +sound -limitcycles 8000000 -easyflashcrtwrite \
|
|
671
|
+
-exitscreenshot run1.png -cartcrt run.crt
|
|
672
|
+
x64sc -default -warp +sound -limitcycles 8000000 -easyflashcrtwrite \
|
|
673
|
+
-exitscreenshot run2.png -cartcrt run.crt
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
Run 1 (`screenshots/easyflash-save.png`), text decoded from the PNG
|
|
677
|
+
against the character ROM with PIL:
|
|
678
|
+
|
|
679
|
+
```text
|
|
680
|
+
EASYFLASH SAVE BANK 08 AM29F040
|
|
681
|
+
BOOT $01 SLOT $01
|
|
682
|
+
ERASE 0F42FF CYCLES
|
|
683
|
+
PROGRAM 000B87 CYCLES
|
|
684
|
+
RAM $8555=$00 $82AA=$00
|
|
685
|
+
ACE 010000
|
|
686
|
+
BOB 007500
|
|
687
|
+
CAT 005000
|
|
688
|
+
DAN 002500
|
|
689
|
+
YOU 001250
|
|
690
|
+
VERIFY PASS
|
|
691
|
+
```
|
|
692
|
+
|
|
693
|
+
Run 2 (`screenshots/easyflash-save-run2.png`) boots from the `.crt` that
|
|
694
|
+
run 1 wrote back. It shows `BOOT $02 SLOT $02`, `ERASE NONE`,
|
|
695
|
+
`PROGRAM 000B32 CYCLES`, and `YOU 002500` below `DAN 002500`: run 1's
|
|
696
|
+
`YOU 001250` has dropped off the table. The border is green (98, 213, 50)
|
|
697
|
+
in both. Measured in VICE x64sc 3.10, PAL, run twice from a fresh copy of
|
|
698
|
+
the built `.crt`, with byte-identical PNGs each time.
|
|
699
|
+
|
|
700
|
+
NTSC: the same two commands with `-model ntsc` after `-default`
|
|
701
|
+
(`screenshots/easyflash-save-ntsc.png`,
|
|
702
|
+
`screenshots/easyflash-save-ntsc-run2.png`) show the same text except
|
|
703
|
+
`ERASE 0F42D3 CYCLES` and `PROGRAM 000C33 CYCLES` in run 1 and
|
|
704
|
+
`PROGRAM 000BDE CYCLES` in run 2. The border is NTSC green
|
|
705
|
+
(114, 189, 103). Measured in VICE x64sc 3.10 (6567R8), two runs from
|
|
706
|
+
each of two fresh copies, byte-identical PNGs.
|
|
707
|
+
|
|
708
|
+
The figures, in decimal:
|
|
709
|
+
|
|
710
|
+
| Measurement | PAL run 1 | PAL run 2 | PAL full bank (side run) | NTSC run 1 | NTSC run 2 |
|
|
711
|
+
|---|---|---|---|---|---|
|
|
712
|
+
| Sector erase, cycles | 1,000,191 | not erased | 1,000,169 | 1,000,147 | not erased |
|
|
713
|
+
| Program 32 bytes, cycles | 2,951 | 2,866 | 3,122 | 3,123 | 3,038 |
|
|
714
|
+
|
|
715
|
+
The side run filled slots 3 to 255 of run 2's bank 8 with copies of a
|
|
716
|
+
valid record (a Python edit of the `.crt`) and booted once. The program
|
|
717
|
+
found no free slot, erased the sector, rewrote the signature, saved to
|
|
718
|
+
`SLOT $01` and showed `BOOT $FF` (the counter stops at 255) and
|
|
719
|
+
`VERIFY PASS`.
|
|
720
|
+
|
|
721
|
+
Every figure includes the timer's start and stop code and the mode
|
|
722
|
+
switches. The erase figure is VICE's model of the flash chip. The
|
|
723
|
+
Am29F040B datasheet gives 1 s typical and 8 s maximum for a sector erase,
|
|
724
|
+
and 7 µs typical and 300 µs maximum for a byte (not measured here). So on
|
|
725
|
+
hardware, 32 bytes take about 0.2 ms to 10 ms of chip time (arithmetic
|
|
726
|
+
from the datasheet), plus the code.
|
|
727
|
+
|
|
728
|
+
`RAM $8555=$00 $82AA=$00` shows that the command writes did not reach
|
|
729
|
+
the C64 RAM under ROML. The program zeroes both bytes with the cartridge
|
|
730
|
+
off, saves, turns the cartridge off again and reads them back
|
|
731
|
+
(VICE-measured; hardware not checked).
|
|
732
|
+
|
|
733
|
+
## Why this works
|
|
734
|
+
|
|
735
|
+
**Writes go to flash only in Ultimax mode.** EasyFlash's control
|
|
736
|
+
register value `$07` (16 KB mode) is how the program reads: ROML at
|
|
737
|
+
`$8000`. A version of this listing that wrote the command sequence in
|
|
738
|
+
that mode ran, but the flash never changed: the erase "finished" after
|
|
739
|
+
130 cycles, every verify failed, and VICE wrote back a `.crt` with no
|
|
740
|
+
bank 8. The same data went into the RAM under `$8000` instead (the page
|
|
741
|
+
showed `$8555=$A0`). EAPI, the EasyFlash flash driver, switches
|
|
742
|
+
`$DE02` to `$85` (Ultimax plus the LED) around every flash write,
|
|
743
|
+
including writes to the low chip at `$8xxx`. The listing does the same
|
|
744
|
+
with `$05`. In Ultimax mode only `$0000-$0FFF` of RAM is mapped, so the
|
|
745
|
+
code that writes runs from `$0800` and keeps its variables in zero page
|
|
746
|
+
and below `$1000`. The boot code copies it there from ROMH. The boot code
|
|
747
|
+
and its image fill bank 0 ROMH offsets `$0000-$04FB` (`$E000-$E4FB`, from
|
|
748
|
+
the symbol file). Offsets `$1800-$1BFF`, which the Programmer's Guide
|
|
749
|
+
reserves for EAPI, stay `$FF`, so EAPI can be added without moving code.
|
|
750
|
+
|
|
751
|
+
**The command sequences are the chip's.** Program: `$AA` to `$555`, `$55`
|
|
752
|
+
to `$2AA`, `$A0` to `$555`, then the byte to its address. Sector erase:
|
|
753
|
+
`$AA`/`$555`, `$55`/`$2AA`, `$80`/`$555`, `$AA`/`$555`, `$55`/`$2AA`, then
|
|
754
|
+
`$30` to any address in the sector (Am29F040B datasheet, Table 4). The
|
|
755
|
+
chip decodes only A0-A10 for the command addresses, so `$8555` and
|
|
756
|
+
`$82AA` work with any bank selected. The bank register supplies the upper
|
|
757
|
+
chip address lines: 8 banks of 8 KB make one 64 KB sector, so bank 8 is
|
|
758
|
+
the first bank of ROML sector 1, and erasing it also erases the ROML
|
|
759
|
+
halves of banks 9 to 15. Completion is detected by the toggle bit: two
|
|
760
|
+
reads in a row differ while the chip is busy. The datasheet says the
|
|
761
|
+
toggle bit is valid during the 50 µs sector-erase time-out too. The wait
|
|
762
|
+
loops do not check DQ5, which the datasheet sets when an operation
|
|
763
|
+
exceeds its time limit ("DQ5: Exceeded Timing Limits"); on a failing chip
|
|
764
|
+
they would spin forever. A released game should add that check or use
|
|
765
|
+
EAPI. Hardware failure was not tested here.
|
|
766
|
+
|
|
767
|
+
**The record format fits the erase size.** A byte can only be programmed
|
|
768
|
+
from 1 to 0, so a save that overwrote its record in place would need an
|
|
769
|
+
erase every time. Here each save programs the next free 32-byte slot.
|
|
770
|
+
The commit byte (the record's last) is programmed last, as `$00`. A
|
|
771
|
+
record counts only if its commit byte is `$00`. A slot counts as free
|
|
772
|
+
only if all 32 bytes are `$FF`. A slot that is neither (power lost
|
|
773
|
+
mid-save) is skipped, and the previous record still loads. That torn-slot
|
|
774
|
+
path was not exercised in these runs. With 255 slots in one bank, the
|
|
775
|
+
sector is erased once every 255 saves. The recipe uses only bank 8 of the
|
|
776
|
+
8-bank sector; using all eight banks would give about 2,047 slots per
|
|
777
|
+
erase (arithmetic).
|
|
778
|
+
|
|
779
|
+
Two power-cut windows remain. (a) When the bank is full, the program
|
|
780
|
+
erases the sector before it writes the new record, so a cut there loses
|
|
781
|
+
every save. (b) A cut during an erase can leave the signature and a `$00`
|
|
782
|
+
commit byte over half-erased data, and without a checksum the program
|
|
783
|
+
cannot tell. Remedies: alternate between two sectors, and add a checksum
|
|
784
|
+
byte to each record.
|
|
785
|
+
|
|
786
|
+
**The CRT ships the save bank erased.** The EasyFlash Programmer's Guide
|
|
787
|
+
says EasyProg erases only the sectors a CRT contains. So the image
|
|
788
|
+
includes bank 8 as `$FF`, and the boot code also checks a 4-byte
|
|
789
|
+
signature. A foreign signature means the bank holds someone else's bytes:
|
|
790
|
+
format it.
|
|
791
|
+
|
|
792
|
+
Sources: EasyFlash Programmer's Guide, Thomas Giesel,
|
|
793
|
+
http://skoe.de/easyflash/files/devdocs/EasyFlash-ProgRef.pdf (boot
|
|
794
|
+
modes, EAPI location and calls, "Game States and High Scores");
|
|
795
|
+
Am29F040B data sheet, AMD publication 21445,
|
|
796
|
+
https://instrumentation.obs.carnegiescience.edu/ccd/parts/AM29F040B.pdf
|
|
797
|
+
(command table, toggle bit, erase and program times); c64gameframework,
|
|
798
|
+
Lasse Öörni, MIT, https://github.com/cadaver/c64gameframework `efboot.s`
|
|
799
|
+
and `eapi-am29f040-14.bin` (the `$85` write mode read from a disassembly
|
|
800
|
+
of the binary; nothing copied).
|