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,660 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: high-score-insert
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [high_score_table_insert]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D020, DD04, DD05, DD06, DD07, DD0E, DD0F]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — High-score table insert: rank, shift, write, checked byte for byte
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A five-row high-score table of six-digit BCD scores with three-letter
|
|
19
|
+
names, and the routine that puts a new score into it at the right
|
|
20
|
+
place. Four compiled-in scores go in one after another: one that ranks
|
|
21
|
+
first, one that ties an existing row, one that does not qualify, and
|
|
22
|
+
one that ranks last. After each the table is printed with the rank
|
|
23
|
+
found and the cycles the insert took on the CIA2 timers. At the end
|
|
24
|
+
the table is compared byte for byte with a compiled-in expected table:
|
|
25
|
+
`$02FF = $01` and a green border when they match, `$02` and red
|
|
26
|
+
otherwise. The technique is `high_score_table_insert` in
|
|
27
|
+
`techniques/text.md`. It exists because a generated game put every
|
|
28
|
+
new entry in row 0 whatever its score; this is the check
|
|
29
|
+
`front_end_and_attract` in `game-design/game-structure.md` asks for,
|
|
30
|
+
"the table re-sorted", run on its own.
|
|
31
|
+
|
|
32
|
+
The tie rule is stated in the code and tested by the second insert: a
|
|
33
|
+
score equal to a row's score goes below that row. The holder keeps
|
|
34
|
+
the rank; only a strictly higher score displaces one.
|
|
35
|
+
|
|
36
|
+
## Source
|
|
37
|
+
|
|
38
|
+
```asm
|
|
39
|
+
// high-score-insert.asm
|
|
40
|
+
// A five-row high-score table of six-digit BCD scores with three-letter
|
|
41
|
+
// names, and the insert: find the rank by comparing BCD bytes from the
|
|
42
|
+
// most significant, shift the lower rows down one place with a bounded
|
|
43
|
+
// loop, drop the last row, write the new row. Four compiled-in scores
|
|
44
|
+
// are inserted in turn: one that ranks first, one that ties an existing
|
|
45
|
+
// row, one that does not qualify, one that ranks last. The table is
|
|
46
|
+
// printed after each insert with the rank found and the cycles the
|
|
47
|
+
// insert took on the CIA2 timers. At the end the table is compared
|
|
48
|
+
// byte for byte with a compiled-in expected table: $02FF = $01 and a
|
|
49
|
+
// green border when they match, $02 and red otherwise.
|
|
50
|
+
//
|
|
51
|
+
// Tie rule: a new score equal to a row's score goes below that row.
|
|
52
|
+
// The earlier holder keeps the rank; only a strictly higher score
|
|
53
|
+
// displaces one. No SED anywhere: CMP is the same in either mode.
|
|
54
|
+
|
|
55
|
+
BasicUpstart2(start)
|
|
56
|
+
.encoding "screencode_upper"
|
|
57
|
+
|
|
58
|
+
.const SCREEN = $0400
|
|
59
|
+
.const RESULT = $02ff // verdict byte read by the harness
|
|
60
|
+
.const BORDER = $d020
|
|
61
|
+
.const CODE_PASS = $01
|
|
62
|
+
.const CODE_FAIL = $02
|
|
63
|
+
|
|
64
|
+
.const ROWS = 5
|
|
65
|
+
.const ROWLEN = 6 // three name screen codes, three BCD bytes
|
|
66
|
+
.const TABLEN = ROWS * ROWLEN // 30
|
|
67
|
+
.const LASTOFF = TABLEN - ROWLEN
|
|
68
|
+
.const NSEQ = 4 // scores inserted in turn
|
|
69
|
+
.const LINE = 40
|
|
70
|
+
|
|
71
|
+
.const src = $fb // zero-page pointer: string or entry source
|
|
72
|
+
.const dst = $fd // zero-page pointer: screen destination
|
|
73
|
+
|
|
74
|
+
// ---------------------------------------------------------------- insert
|
|
75
|
+
// hs_rank: X = table offset of the first row the new score beats, or
|
|
76
|
+
// X = TABLEN when it beats none. Compares the three BCD bytes from the
|
|
77
|
+
// most significant; the first byte that differs decides. Three equal
|
|
78
|
+
// bytes mean the row keeps its place and the search goes on.
|
|
79
|
+
hs_rank:
|
|
80
|
+
ldx #0
|
|
81
|
+
!row:
|
|
82
|
+
lda newrow+3
|
|
83
|
+
cmp table+3,x
|
|
84
|
+
bne !decide+
|
|
85
|
+
lda newrow+4
|
|
86
|
+
cmp table+4,x
|
|
87
|
+
bne !decide+
|
|
88
|
+
lda newrow+5
|
|
89
|
+
cmp table+5,x
|
|
90
|
+
beq !next+ // equal on all three: the holder stays above
|
|
91
|
+
!decide:
|
|
92
|
+
bcs !found+ // Z clear and C set: the new score is higher
|
|
93
|
+
!next:
|
|
94
|
+
txa
|
|
95
|
+
clc
|
|
96
|
+
adc #ROWLEN
|
|
97
|
+
tax
|
|
98
|
+
cpx #TABLEN
|
|
99
|
+
bne !row-
|
|
100
|
+
!found:
|
|
101
|
+
rts
|
|
102
|
+
|
|
103
|
+
// hs_place: shift every row from offset rank downward one place and
|
|
104
|
+
// write newrow at rank. The loop runs from the last row up to rank and
|
|
105
|
+
// stops on equal or below, so a rank that is not a row boundary cannot
|
|
106
|
+
// run it past the table's start.
|
|
107
|
+
hs_place:
|
|
108
|
+
ldx #LASTOFF
|
|
109
|
+
!shift:
|
|
110
|
+
cpx rank
|
|
111
|
+
beq !write+
|
|
112
|
+
bcc !write+
|
|
113
|
+
.for (var i = 0; i < ROWLEN; i++) {
|
|
114
|
+
lda table - ROWLEN + i,x
|
|
115
|
+
sta table + i,x
|
|
116
|
+
}
|
|
117
|
+
txa
|
|
118
|
+
sec
|
|
119
|
+
sbc #ROWLEN
|
|
120
|
+
tax
|
|
121
|
+
jmp !shift-
|
|
122
|
+
!write:
|
|
123
|
+
ldx rank
|
|
124
|
+
ldy #0
|
|
125
|
+
!: lda newrow,y
|
|
126
|
+
sta table,x
|
|
127
|
+
inx
|
|
128
|
+
iny
|
|
129
|
+
cpy #ROWLEN
|
|
130
|
+
bne !-
|
|
131
|
+
rts
|
|
132
|
+
|
|
133
|
+
// hs_insert: rank, then place if the score qualifies. rank = TABLEN
|
|
134
|
+
// means it did not. A game splits the two calls: hs_rank before the
|
|
135
|
+
// name entry, so the player sees where the score will go, hs_place
|
|
136
|
+
// after it, with the typed name in newrow.
|
|
137
|
+
hs_insert:
|
|
138
|
+
jsr hs_rank
|
|
139
|
+
stx rank
|
|
140
|
+
cpx #TABLEN
|
|
141
|
+
bcs !+
|
|
142
|
+
jsr hs_place
|
|
143
|
+
!: rts
|
|
144
|
+
|
|
145
|
+
nothing:
|
|
146
|
+
rts
|
|
147
|
+
|
|
148
|
+
// ---------------------------------------------------------------- timing
|
|
149
|
+
// Time(routine, slot): CIA2 timer A counts phi2, timer B counts A
|
|
150
|
+
// underflows; the 24-bit count lands in slot. Run under SEI with the
|
|
151
|
+
// screen blanked so no badline lands inside the measurement.
|
|
152
|
+
.macro Time(routine, slot) {
|
|
153
|
+
lda #$51
|
|
154
|
+
sta $dd0f
|
|
155
|
+
lda #$11
|
|
156
|
+
sta $dd0e
|
|
157
|
+
jsr routine
|
|
158
|
+
lda #$00
|
|
159
|
+
sta $dd0e
|
|
160
|
+
sta $dd0f
|
|
161
|
+
sec // the routine may leave C in either state
|
|
162
|
+
lda #$ff
|
|
163
|
+
sbc $dd04
|
|
164
|
+
sta slot
|
|
165
|
+
lda #$ff
|
|
166
|
+
sbc $dd05
|
|
167
|
+
sta slot+1
|
|
168
|
+
lda #$ff
|
|
169
|
+
sbc $dd06
|
|
170
|
+
sta slot+2
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// ---------------------------------------------------------------- main
|
|
174
|
+
start:
|
|
175
|
+
sei
|
|
176
|
+
ldx #0
|
|
177
|
+
lda #$20
|
|
178
|
+
!: sta SCREEN,x
|
|
179
|
+
sta SCREEN + $100,x
|
|
180
|
+
sta SCREEN + $200,x
|
|
181
|
+
sta SCREEN + $300,x
|
|
182
|
+
inx
|
|
183
|
+
bne !-
|
|
184
|
+
|
|
185
|
+
lda #<SCREEN
|
|
186
|
+
sta dst
|
|
187
|
+
lda #>SCREEN
|
|
188
|
+
sta dst+1
|
|
189
|
+
ldy #0
|
|
190
|
+
lda #<title
|
|
191
|
+
sta src
|
|
192
|
+
lda #>title
|
|
193
|
+
sta src+1
|
|
194
|
+
jsr print_str
|
|
195
|
+
|
|
196
|
+
lda $d011 // DEN clear, then wait for the raster to
|
|
197
|
+
and #$ef // wrap, so the frames measured have no
|
|
198
|
+
sta $d011 // badlines
|
|
199
|
+
!: lda $d011
|
|
200
|
+
bpl !-
|
|
201
|
+
!: lda $d011
|
|
202
|
+
bmi !-
|
|
203
|
+
|
|
204
|
+
lda #$00
|
|
205
|
+
sta $dd0e
|
|
206
|
+
sta $dd0f
|
|
207
|
+
lda #$ff
|
|
208
|
+
sta $dd04
|
|
209
|
+
sta $dd05
|
|
210
|
+
sta $dd06
|
|
211
|
+
sta $dd07
|
|
212
|
+
|
|
213
|
+
Time(nothing, base) // cost of the harness and an empty call
|
|
214
|
+
|
|
215
|
+
lda #0
|
|
216
|
+
sta seq
|
|
217
|
+
lda #<(SCREEN + LINE)
|
|
218
|
+
sta dst
|
|
219
|
+
lda #>(SCREEN + LINE)
|
|
220
|
+
sta dst+1
|
|
221
|
+
|
|
222
|
+
seq_loop:
|
|
223
|
+
lda seq // newrow = sequence[seq], six bytes
|
|
224
|
+
asl
|
|
225
|
+
adc seq // seq * 3, carry clear after asl of 0..3
|
|
226
|
+
asl // seq * 6
|
|
227
|
+
tax
|
|
228
|
+
ldy #0
|
|
229
|
+
!: lda sequence,x
|
|
230
|
+
sta newrow,y
|
|
231
|
+
inx
|
|
232
|
+
iny
|
|
233
|
+
cpy #ROWLEN
|
|
234
|
+
bne !-
|
|
235
|
+
|
|
236
|
+
Time(hs_insert, cyc)
|
|
237
|
+
|
|
238
|
+
sec // cyc = cyc - base, 16 bits
|
|
239
|
+
lda cyc
|
|
240
|
+
sbc base
|
|
241
|
+
sta cyc
|
|
242
|
+
lda cyc+1
|
|
243
|
+
sbc base+1
|
|
244
|
+
sta cyc+1
|
|
245
|
+
|
|
246
|
+
ldy #0 // header: entry, rank, cycles
|
|
247
|
+
lda #<newrow
|
|
248
|
+
sta src
|
|
249
|
+
lda #>newrow
|
|
250
|
+
sta src+1
|
|
251
|
+
jsr print_entry
|
|
252
|
+
lda #<rank_txt
|
|
253
|
+
sta src
|
|
254
|
+
lda #>rank_txt
|
|
255
|
+
sta src+1
|
|
256
|
+
jsr print_str
|
|
257
|
+
jsr print_rank
|
|
258
|
+
lda #<cyc_txt
|
|
259
|
+
sta src
|
|
260
|
+
lda #>cyc_txt
|
|
261
|
+
sta src+1
|
|
262
|
+
jsr print_str
|
|
263
|
+
jsr print_cycles
|
|
264
|
+
jsr next_line
|
|
265
|
+
|
|
266
|
+
ldx #0 // five table rows, numbered
|
|
267
|
+
stx row
|
|
268
|
+
!table:
|
|
269
|
+
ldy #0
|
|
270
|
+
lda row
|
|
271
|
+
clc
|
|
272
|
+
adc #$31 // screen code of the digit 1 + row
|
|
273
|
+
sta (dst),y
|
|
274
|
+
iny
|
|
275
|
+
lda #$20
|
|
276
|
+
sta (dst),y
|
|
277
|
+
iny
|
|
278
|
+
lda row
|
|
279
|
+
asl
|
|
280
|
+
adc row
|
|
281
|
+
asl
|
|
282
|
+
clc
|
|
283
|
+
adc #<table
|
|
284
|
+
sta src
|
|
285
|
+
lda #>table
|
|
286
|
+
adc #0
|
|
287
|
+
sta src+1
|
|
288
|
+
jsr print_entry
|
|
289
|
+
jsr next_line
|
|
290
|
+
inc row
|
|
291
|
+
lda row
|
|
292
|
+
cmp #ROWS
|
|
293
|
+
bne !table-
|
|
294
|
+
|
|
295
|
+
inc seq
|
|
296
|
+
lda seq
|
|
297
|
+
cmp #NSEQ
|
|
298
|
+
beq !+
|
|
299
|
+
jmp seq_loop
|
|
300
|
+
!:
|
|
301
|
+
lda $d011
|
|
302
|
+
ora #$10
|
|
303
|
+
sta $d011
|
|
304
|
+
|
|
305
|
+
ldx #TABLEN - 1 // verdict: the table against expect
|
|
306
|
+
!: lda table,x
|
|
307
|
+
cmp expect,x
|
|
308
|
+
bne fail
|
|
309
|
+
dex
|
|
310
|
+
bpl !-
|
|
311
|
+
|
|
312
|
+
lda #CODE_PASS
|
|
313
|
+
sta RESULT
|
|
314
|
+
lda #5
|
|
315
|
+
sta BORDER
|
|
316
|
+
lda #<pass_txt
|
|
317
|
+
sta src
|
|
318
|
+
lda #>pass_txt
|
|
319
|
+
sta src+1
|
|
320
|
+
jmp verdict
|
|
321
|
+
fail:
|
|
322
|
+
lda #CODE_FAIL
|
|
323
|
+
sta RESULT
|
|
324
|
+
lda #2
|
|
325
|
+
sta BORDER
|
|
326
|
+
lda #<fail_txt
|
|
327
|
+
sta src
|
|
328
|
+
lda #>fail_txt
|
|
329
|
+
sta src+1
|
|
330
|
+
verdict:
|
|
331
|
+
lda #<(SCREEN + 20)
|
|
332
|
+
sta dst
|
|
333
|
+
lda #>(SCREEN + 20)
|
|
334
|
+
sta dst+1
|
|
335
|
+
ldy #0
|
|
336
|
+
jsr print_str
|
|
337
|
+
jmp *
|
|
338
|
+
|
|
339
|
+
// ---------------------------------------------------------------- print
|
|
340
|
+
// All output is screen codes written straight into screen RAM.
|
|
341
|
+
|
|
342
|
+
// print_str: zero-terminated screen-code string at src to (dst),y.
|
|
343
|
+
print_str:
|
|
344
|
+
ldx #0
|
|
345
|
+
!: lda (src,x)
|
|
346
|
+
beq !+
|
|
347
|
+
sta (dst),y
|
|
348
|
+
iny
|
|
349
|
+
inc src
|
|
350
|
+
bne !-
|
|
351
|
+
inc src+1
|
|
352
|
+
bne !-
|
|
353
|
+
!: rts
|
|
354
|
+
|
|
355
|
+
// print_entry: name (three screen codes), a space, six BCD digits,
|
|
356
|
+
// a space, from the six-byte entry at src.
|
|
357
|
+
print_entry:
|
|
358
|
+
ldx #0 // X stays 0: (src,x) reads through src
|
|
359
|
+
stx cnt
|
|
360
|
+
!: lda (src,x)
|
|
361
|
+
sta (dst),y
|
|
362
|
+
iny
|
|
363
|
+
jsr next_src
|
|
364
|
+
inc cnt
|
|
365
|
+
lda cnt
|
|
366
|
+
cmp #3
|
|
367
|
+
bne !-
|
|
368
|
+
lda #$20
|
|
369
|
+
sta (dst),y
|
|
370
|
+
iny
|
|
371
|
+
stx cnt
|
|
372
|
+
!: lda (src,x)
|
|
373
|
+
pha
|
|
374
|
+
lsr
|
|
375
|
+
lsr
|
|
376
|
+
lsr
|
|
377
|
+
lsr
|
|
378
|
+
ora #$30
|
|
379
|
+
sta (dst),y
|
|
380
|
+
iny
|
|
381
|
+
pla
|
|
382
|
+
and #$0f
|
|
383
|
+
ora #$30
|
|
384
|
+
sta (dst),y
|
|
385
|
+
iny
|
|
386
|
+
jsr next_src
|
|
387
|
+
inc cnt
|
|
388
|
+
lda cnt
|
|
389
|
+
cmp #3
|
|
390
|
+
bne !-
|
|
391
|
+
lda #$20
|
|
392
|
+
sta (dst),y
|
|
393
|
+
iny
|
|
394
|
+
rts
|
|
395
|
+
|
|
396
|
+
// next_src: src += 1.
|
|
397
|
+
next_src:
|
|
398
|
+
inc src
|
|
399
|
+
bne !+
|
|
400
|
+
inc src+1
|
|
401
|
+
!: rts
|
|
402
|
+
|
|
403
|
+
// print_rank: the rank as a digit 1 to ROWS, or a dash for none.
|
|
404
|
+
print_rank:
|
|
405
|
+
lda rank
|
|
406
|
+
cmp #TABLEN
|
|
407
|
+
bcs !none+
|
|
408
|
+
ldx #0
|
|
409
|
+
!: cmp #ROWLEN // rank offset / ROWLEN, plus one
|
|
410
|
+
bcc !+
|
|
411
|
+
sbc #ROWLEN
|
|
412
|
+
inx
|
|
413
|
+
bne !-
|
|
414
|
+
!: txa
|
|
415
|
+
clc
|
|
416
|
+
adc #$31
|
|
417
|
+
sta (dst),y
|
|
418
|
+
iny
|
|
419
|
+
rts
|
|
420
|
+
!none:
|
|
421
|
+
lda #$2d // the dash
|
|
422
|
+
sta (dst),y
|
|
423
|
+
iny
|
|
424
|
+
rts
|
|
425
|
+
|
|
426
|
+
// print_cycles: cyc (16 bits) as five decimal digits, by subtracting
|
|
427
|
+
// powers of ten.
|
|
428
|
+
print_cycles:
|
|
429
|
+
ldx #0
|
|
430
|
+
!digit:
|
|
431
|
+
lda #$2f // one below the digit 0; the loop adds 1
|
|
432
|
+
sta digit
|
|
433
|
+
!sub:
|
|
434
|
+
inc digit
|
|
435
|
+
sec
|
|
436
|
+
lda cyc
|
|
437
|
+
sbc pow10_lo,x
|
|
438
|
+
pha
|
|
439
|
+
lda cyc+1
|
|
440
|
+
sbc pow10_hi,x
|
|
441
|
+
bcc !stop+
|
|
442
|
+
sta cyc+1
|
|
443
|
+
pla
|
|
444
|
+
sta cyc
|
|
445
|
+
jmp !sub-
|
|
446
|
+
!stop:
|
|
447
|
+
pla
|
|
448
|
+
lda digit
|
|
449
|
+
sta (dst),y
|
|
450
|
+
iny
|
|
451
|
+
inx
|
|
452
|
+
cpx #5
|
|
453
|
+
bne !digit-
|
|
454
|
+
rts
|
|
455
|
+
|
|
456
|
+
// next_line: dst += 40.
|
|
457
|
+
next_line:
|
|
458
|
+
clc
|
|
459
|
+
lda dst
|
|
460
|
+
adc #LINE
|
|
461
|
+
sta dst
|
|
462
|
+
bcc !+
|
|
463
|
+
inc dst+1
|
|
464
|
+
!: rts
|
|
465
|
+
|
|
466
|
+
// ---------------------------------------------------------------- data
|
|
467
|
+
pow10_lo: .byte <10000, <1000, <100, <10, <1
|
|
468
|
+
pow10_hi: .byte >10000, >1000, >100, >10, >1
|
|
469
|
+
|
|
470
|
+
title: .text "HIGH SCORE INSERT"
|
|
471
|
+
.byte 0
|
|
472
|
+
rank_txt: .text "RANK "
|
|
473
|
+
.byte 0
|
|
474
|
+
cyc_txt: .text " CYC "
|
|
475
|
+
.byte 0
|
|
476
|
+
pass_txt: .text "PASS"
|
|
477
|
+
.byte 0
|
|
478
|
+
fail_txt: .text "FAIL"
|
|
479
|
+
.byte 0
|
|
480
|
+
|
|
481
|
+
// The table: three name screen codes, three BCD bytes, most
|
|
482
|
+
// significant first. Seeded so a first run never shows a blank table.
|
|
483
|
+
table:
|
|
484
|
+
.text "AAA"
|
|
485
|
+
.byte $05, $00, $00
|
|
486
|
+
.text "BBB"
|
|
487
|
+
.byte $04, $00, $00
|
|
488
|
+
.text "CCC"
|
|
489
|
+
.byte $03, $00, $00
|
|
490
|
+
.text "DDD"
|
|
491
|
+
.byte $02, $00, $00
|
|
492
|
+
.text "EEE"
|
|
493
|
+
.byte $01, $00, $00
|
|
494
|
+
|
|
495
|
+
// The scores inserted, in order.
|
|
496
|
+
sequence:
|
|
497
|
+
.text "NEW" // ranks first: decided on the third byte
|
|
498
|
+
.byte $05, $00, $01
|
|
499
|
+
.text "TIE" // equals BBB: goes below it, rank 4
|
|
500
|
+
.byte $04, $00, $00
|
|
501
|
+
.text "NIL" // below the last row: not entered
|
|
502
|
+
.byte $00, $50, $00
|
|
503
|
+
.text "LOW" // ranks last: beats CCC on the second byte
|
|
504
|
+
.byte $03, $50, $00
|
|
505
|
+
|
|
506
|
+
// The table the sequence must produce.
|
|
507
|
+
expect:
|
|
508
|
+
.text "NEW"
|
|
509
|
+
.byte $05, $00, $01
|
|
510
|
+
.text "AAA"
|
|
511
|
+
.byte $05, $00, $00
|
|
512
|
+
.text "BBB"
|
|
513
|
+
.byte $04, $00, $00
|
|
514
|
+
.text "TIE"
|
|
515
|
+
.byte $04, $00, $00
|
|
516
|
+
.text "LOW"
|
|
517
|
+
.byte $03, $50, $00
|
|
518
|
+
|
|
519
|
+
newrow: .fill ROWLEN, 0
|
|
520
|
+
rank: .byte 0
|
|
521
|
+
seq: .byte 0
|
|
522
|
+
row: .byte 0
|
|
523
|
+
digit: .byte 0
|
|
524
|
+
cnt: .byte 0
|
|
525
|
+
base: .byte 0, 0, 0
|
|
526
|
+
cyc: .byte 0, 0, 0
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
## Build
|
|
530
|
+
|
|
531
|
+
```bash
|
|
532
|
+
java -jar KickAss.jar high-score-insert.asm -o high-score-insert.prg
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
Produces `high-score-insert.prg`, `$0801` to `$0B7D`.
|
|
536
|
+
|
|
537
|
+
## Expected output
|
|
538
|
+
|
|
539
|
+
Border green, text area the power-on blue, the screen cleared by the
|
|
540
|
+
program before it prints, so the BASIC banner is gone:
|
|
541
|
+
|
|
542
|
+
```
|
|
543
|
+
HIGH SCORE INSERT PASS
|
|
544
|
+
NEW 050001 RANK 1 CYC 00481
|
|
545
|
+
1 NEW 050001
|
|
546
|
+
2 AAA 050000
|
|
547
|
+
3 BBB 040000
|
|
548
|
+
4 CCC 030000
|
|
549
|
+
5 DDD 020000
|
|
550
|
+
TIE 040000 RANK 4 CYC 00339
|
|
551
|
+
1 NEW 050001
|
|
552
|
+
2 AAA 050000
|
|
553
|
+
3 BBB 040000
|
|
554
|
+
4 TIE 040000
|
|
555
|
+
5 CCC 030000
|
|
556
|
+
NIL 005000 RANK - CYC 00152
|
|
557
|
+
1 NEW 050001
|
|
558
|
+
2 AAA 050000
|
|
559
|
+
3 BBB 040000
|
|
560
|
+
4 TIE 040000
|
|
561
|
+
5 CCC 030000
|
|
562
|
+
LOW 035000 RANK 5 CYC 00284
|
|
563
|
+
1 NEW 050001
|
|
564
|
+
2 AAA 050000
|
|
565
|
+
3 BBB 040000
|
|
566
|
+
4 TIE 040000
|
|
567
|
+
5 LOW 035000
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
Each block is one insert: the new entry, the rank it was given (`-`
|
|
571
|
+
for not entered), the cycles the call took, then the table after it.
|
|
572
|
+
The seeded table was `AAA 050000` down to `EEE 010000` in steps of
|
|
573
|
+
ten thousand.
|
|
574
|
+
|
|
575
|
+
- `NEW 050001` beats `AAA 050000` on the third BCD byte alone, so it
|
|
576
|
+
ranks first; every row moves down one and `EEE` falls off.
|
|
577
|
+
- `TIE 040000` equals `BBB`. The three-byte compare finds them equal,
|
|
578
|
+
the search goes on, and `CCC 030000` is the first row it beats, so
|
|
579
|
+
`TIE` lands at rank 4 below `BBB`.
|
|
580
|
+
- `NIL 005000` beats nothing. Rank `-`, the table is untouched.
|
|
581
|
+
- `LOW 035000` beats only `CCC`, the last row, so it ranks 5. The
|
|
582
|
+
shift loop runs zero times and the write overwrites `CCC`.
|
|
583
|
+
|
|
584
|
+
Screenshots from the pinned run, 4,000,000 cycles:
|
|
585
|
+
`screenshots/high-score-insert.png` (PAL) and
|
|
586
|
+
`screenshots/high-score-insert-ntsc.png` (NTSC). Both decoded against
|
|
587
|
+
the character ROM give the text above; border pixel (2, 100) =
|
|
588
|
+
(98, 213, 50) on PAL and (114, 189, 103) on NTSC, index 5 in both
|
|
589
|
+
palettes of `runtime/vice-reference.md`. The pinned command was run
|
|
590
|
+
twice per model and the two PNGs were identical bytes. The `CYC`
|
|
591
|
+
figures are the same on both models: the inserts run under `SEI` with
|
|
592
|
+
the screen blanked, so no badline lands in a measurement.
|
|
593
|
+
|
|
594
|
+
### The cycle figures
|
|
595
|
+
|
|
596
|
+
Measured in VICE x64sc 3.10 with the CIA2 cascade, less an empty call
|
|
597
|
+
timed the same way, so each figure is the routine's own instructions
|
|
598
|
+
without the `JSR` and `RTS` of the call:
|
|
599
|
+
|
|
600
|
+
| Insert | Rank | Compares | Rows shifted | Cycles |
|
|
601
|
+
|---|---|---|---|---|
|
|
602
|
+
| `NEW 050001` | 1 | one row, three bytes deep | 4 | 481 |
|
|
603
|
+
| `TIE 040000` | 4 | four rows, one three bytes deep | 1 | 339 |
|
|
604
|
+
| `NIL 005000` | none | five rows, one byte each | 0 | 152 |
|
|
605
|
+
| `LOW 035000` | 5 | five rows, the last two bytes deep | 0 | 284 |
|
|
606
|
+
|
|
607
|
+
The first insert is the worst case for this table: the compare on row
|
|
608
|
+
0 goes all three bytes deep and the shift moves four rows. Arithmetic
|
|
609
|
+
from the instruction table gives the same 481: the rank search 41, a
|
|
610
|
+
shifted row 73 (the bounded-loop test 8, six `LDA abs,X` / `STA abs,X`
|
|
611
|
+
pairs 54, the step and jump 11) four times, the loop's final test 7,
|
|
612
|
+
the write 113, `hs_place`'s entry and return 8, and 20 in `hs_insert`
|
|
613
|
+
between the calls. The same arithmetic gives 339, 152 and 284 for the
|
|
614
|
+
other three, and no branch in the two routines crosses a page. A
|
|
615
|
+
longer table scales by 73 cycles a shifted row plus 26 a row compared
|
|
616
|
+
and rejected on its first byte.
|
|
617
|
+
|
|
618
|
+
## Why this works
|
|
619
|
+
|
|
620
|
+
**The compare.** A BCD byte holds two decimal digits and its binary
|
|
621
|
+
value orders the same way its digits do (`$50` is above `$49` in
|
|
622
|
+
both readings), so `CMP` orders BCD bytes correctly with no decimal
|
|
623
|
+
mode. `hs_rank` compares the most significant byte first; the first
|
|
624
|
+
byte that differs decides, and `BCS` after a `BNE` means the new score
|
|
625
|
+
is strictly higher. When all three bytes are equal the `BEQ` skips the
|
|
626
|
+
`BCS` and the search moves on, which is the tie rule: the holder stays
|
|
627
|
+
above. The result is the row offset in `X`, or `TABLEN` for none, and
|
|
628
|
+
that is also the qualification test: a score that beats no row does
|
|
629
|
+
not enter.
|
|
630
|
+
|
|
631
|
+
**The shift.** `hs_place` starts at the last row and copies the row
|
|
632
|
+
above it down, stepping up by one row until `X` reaches the rank. The
|
|
633
|
+
test is `CPX rank` followed by `BEQ` and `BCC`, so the loop stops on
|
|
634
|
+
equal and on below; a `rank` that is not a multiple of six, or a
|
|
635
|
+
caller that passes garbage, cannot walk the copy below the table's
|
|
636
|
+
first row. Copying downward from the bottom is what makes an in-place
|
|
637
|
+
shift safe: each row is read before it is overwritten. The last row
|
|
638
|
+
is never read as a source, so it is dropped by construction. The
|
|
639
|
+
write then copies the six bytes of `newrow` to the rank's offset.
|
|
640
|
+
|
|
641
|
+
**The split.** `hs_rank` and `hs_place` are separate calls with
|
|
642
|
+
`rank` kept between them, because a game wants the rank before the
|
|
643
|
+
player types a name (to show "you placed 3rd" and to skip the name
|
|
644
|
+
entry when the score does not qualify) and the shift and write after
|
|
645
|
+
it, with the typed name in `newrow`. `hs_insert` runs both back to
|
|
646
|
+
back for the measurement.
|
|
647
|
+
|
|
648
|
+
**The verdict.** The expected table is thirty bytes assembled from the
|
|
649
|
+
same layout, compared with `CMP abs,X` from the end. A wrong rank, a
|
|
650
|
+
shift that stops one row early, or a tie put above its holder changes
|
|
651
|
+
at least one byte, and a byte that differs sets `$02FF` to `$02` and
|
|
652
|
+
the border red.
|
|
653
|
+
|
|
654
|
+
**A fault found while writing it.** The first build passed the
|
|
655
|
+
verdict and drew garbage: `print_entry` used `LDA (src,X)` with `X`
|
|
656
|
+
as its byte counter, and indexed-indirect adds `X` to the zero-page
|
|
657
|
+
address before the pointer is read, so it read through `$FC`, `$FD`
|
|
658
|
+
and `$FE` in turn. The counter now lives in memory and `X` stays
|
|
659
|
+
zero. A verdict on the table bytes cannot see the screen, which is
|
|
660
|
+
why the screenshot is measured as well.
|