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,1007 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: compare-16bit-signed
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [compare_16bit_and_signed]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D020, DD04, DD05, DD06, DD07, DD0E, DD0F]
|
|
9
|
+
uses_kernal: [CHROUT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — 16-bit and signed compares, proved and timed
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Five compare idioms run against boundary pairs and full sweeps: unsigned
|
|
19
|
+
16-bit (high byte first), signed 8-bit and signed 16-bit (`SBC` then
|
|
20
|
+
`BVC` / `EOR #$80`), an unsigned range test (`x` in `[lo, lo + w)`), and
|
|
21
|
+
the wrong one, a signed compare that trusts `BMI` after the subtract.
|
|
22
|
+
The program prints the processor flags each idiom leaves on eight 8-bit
|
|
23
|
+
and seven 16-bit boundary pairs, folds every sweep result into a
|
|
24
|
+
checksum and compares it with the value a Python model computed, counts
|
|
25
|
+
how many pairs the `BMI` version gets wrong, times one call of each
|
|
26
|
+
idiom with the CIA2 timers, and leaves a verdict where a harness can
|
|
27
|
+
read it: `$02FF` = `$01` and a green border when the four correct
|
|
28
|
+
idioms match their checksums and the `BMI` version misses exactly the
|
|
29
|
+
16,384 pairs the model predicts, `$02FF` = `$02` and a red border
|
|
30
|
+
otherwise.
|
|
31
|
+
|
|
32
|
+
## Source
|
|
33
|
+
|
|
34
|
+
```asm
|
|
35
|
+
// compare-16bit-signed.asm
|
|
36
|
+
// Runs five compare idioms over boundary pairs and full sweeps, prints
|
|
37
|
+
// the processor flags each idiom leaves on the boundary pairs, checks
|
|
38
|
+
// every sweep against a checksum computed in Python, times one call of
|
|
39
|
+
// each idiom with the CIA2 timers, and leaves a verdict where a harness
|
|
40
|
+
// can read it: $02FF = $01 and a green border when the four correct
|
|
41
|
+
// idioms match their checksums and the naive BMI compare misses exactly
|
|
42
|
+
// the 16,384 pairs it is expected to miss; $02FF = $02 and a red border
|
|
43
|
+
// otherwise.
|
|
44
|
+
|
|
45
|
+
BasicUpstart2(start)
|
|
46
|
+
.encoding "screencode_upper"
|
|
47
|
+
|
|
48
|
+
.const SCREEN = $0400
|
|
49
|
+
.const RESULT = $02ff // verdict byte read by the harness
|
|
50
|
+
.const BORDER = $d020
|
|
51
|
+
.const CODE_PASS = $01
|
|
52
|
+
.const CODE_FAIL = $02
|
|
53
|
+
|
|
54
|
+
// expected checksums, from the Python model on the recipe page
|
|
55
|
+
.const EXP_U16 = $6182
|
|
56
|
+
.const EXP_S8 = $73fa
|
|
57
|
+
.const EXP_S16 = $27b8
|
|
58
|
+
.const EXP_RNG = $a021
|
|
59
|
+
.const EXP_BMI = $a3cd
|
|
60
|
+
.const EXP_MISS = 16384
|
|
61
|
+
|
|
62
|
+
.const src = $fb // zero-page pointer: string source
|
|
63
|
+
.const dst = $fd // zero-page pointer: screen destination
|
|
64
|
+
|
|
65
|
+
// ---------------------------------------------------------------- idioms
|
|
66
|
+
// Operands are absolute variables so the timed cost is the common case.
|
|
67
|
+
|
|
68
|
+
// Unsigned 16-bit: a_hi:a_lo against b_hi:b_lo.
|
|
69
|
+
// Exit: C clear means a < b, C set means a >= b, Z set means a == b.
|
|
70
|
+
u16:
|
|
71
|
+
lda a_hi
|
|
72
|
+
cmp b_hi
|
|
73
|
+
bne !+ // high bytes differ: they decide
|
|
74
|
+
lda a_lo
|
|
75
|
+
cmp b_lo // high bytes equal: the low bytes decide
|
|
76
|
+
!: rts
|
|
77
|
+
|
|
78
|
+
// Signed 8-bit: a8 against b8. Exit: N set means a < b.
|
|
79
|
+
s8:
|
|
80
|
+
lda a8
|
|
81
|
+
sec
|
|
82
|
+
sbc b8
|
|
83
|
+
bvc !+ // no overflow: N is the sign of a - b
|
|
84
|
+
eor #$80 // overflow: the sign came out inverted
|
|
85
|
+
!: rts
|
|
86
|
+
|
|
87
|
+
// Signed 16-bit. Exit: N set means a < b.
|
|
88
|
+
s16:
|
|
89
|
+
lda a_lo
|
|
90
|
+
cmp b_lo // sets C for the high-byte subtract
|
|
91
|
+
lda a_hi
|
|
92
|
+
sbc b_hi
|
|
93
|
+
bvc !+
|
|
94
|
+
eor #$80
|
|
95
|
+
!: rts
|
|
96
|
+
|
|
97
|
+
// The wrong way: signed compare by the sign of the difference alone.
|
|
98
|
+
bmi8:
|
|
99
|
+
lda a8
|
|
100
|
+
sec
|
|
101
|
+
sbc b8
|
|
102
|
+
rts // N is wrong whenever a - b overflowed
|
|
103
|
+
|
|
104
|
+
// Unsigned range: x8 in [lo8, lo8 + w8). Exit: C clear means inside.
|
|
105
|
+
rng:
|
|
106
|
+
lda x8
|
|
107
|
+
sec
|
|
108
|
+
sbc lo8
|
|
109
|
+
cmp w8
|
|
110
|
+
rts
|
|
111
|
+
|
|
112
|
+
// ---------------------------------------------------------------- probes
|
|
113
|
+
// Same instructions with PHP after the points the page tabulates.
|
|
114
|
+
|
|
115
|
+
probe8:
|
|
116
|
+
lda a8
|
|
117
|
+
sec
|
|
118
|
+
sbc b8
|
|
119
|
+
php // P after SBC
|
|
120
|
+
bvc !+
|
|
121
|
+
eor #$80
|
|
122
|
+
!: php // P after the fix-up
|
|
123
|
+
pla
|
|
124
|
+
sta p_fix
|
|
125
|
+
pla
|
|
126
|
+
sta p_sbc
|
|
127
|
+
rts
|
|
128
|
+
|
|
129
|
+
probe16:
|
|
130
|
+
clv // CMP never touches V; clear it so the
|
|
131
|
+
lda a_hi // table shows what CMP alone leaves
|
|
132
|
+
cmp b_hi
|
|
133
|
+
php // P after the high-byte CMP alone
|
|
134
|
+
pla
|
|
135
|
+
sta p_cmph
|
|
136
|
+
jsr u16
|
|
137
|
+
php
|
|
138
|
+
pla
|
|
139
|
+
sta p_u16
|
|
140
|
+
jsr s16
|
|
141
|
+
php
|
|
142
|
+
pla
|
|
143
|
+
sta p_s16
|
|
144
|
+
rts
|
|
145
|
+
|
|
146
|
+
// ---------------------------------------------------------------- timing
|
|
147
|
+
// Time(routine, slot): CIA2 timer A counts phi2, timer B counts A
|
|
148
|
+
// underflows; the 24-bit count lands in slot.
|
|
149
|
+
.macro Time(routine, slot) {
|
|
150
|
+
lda #$51
|
|
151
|
+
sta $dd0f
|
|
152
|
+
lda #$11
|
|
153
|
+
sta $dd0e
|
|
154
|
+
jsr routine
|
|
155
|
+
lda #$00
|
|
156
|
+
sta $dd0e
|
|
157
|
+
sta $dd0f
|
|
158
|
+
sec // the routine left C in either state
|
|
159
|
+
lda #$ff
|
|
160
|
+
sbc $dd04
|
|
161
|
+
sta slot
|
|
162
|
+
lda #$ff
|
|
163
|
+
sbc $dd05
|
|
164
|
+
sta slot+1
|
|
165
|
+
lda #$ff
|
|
166
|
+
sbc $dd06
|
|
167
|
+
sta slot+2
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.macro Net(slot) {
|
|
171
|
+
sec
|
|
172
|
+
lda slot
|
|
173
|
+
sbc empty
|
|
174
|
+
sta slot
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
nothing:
|
|
178
|
+
rts
|
|
179
|
+
|
|
180
|
+
// ---------------------------------------------------------------- sweeps
|
|
181
|
+
// sweep: for ii in 0..255, for jj in 0..255: jsr pair; fold the 0/1
|
|
182
|
+
// result into cs together with the pair. cs is not reset here.
|
|
183
|
+
sweep:
|
|
184
|
+
lda #0
|
|
185
|
+
sta ii
|
|
186
|
+
!outer:
|
|
187
|
+
lda #0
|
|
188
|
+
sta jj
|
|
189
|
+
!inner:
|
|
190
|
+
pair_jsr:
|
|
191
|
+
jsr $0000 // patched by RunSweep
|
|
192
|
+
jsr fold
|
|
193
|
+
inc jj
|
|
194
|
+
bne !inner-
|
|
195
|
+
inc ii
|
|
196
|
+
bne !outer-
|
|
197
|
+
rts
|
|
198
|
+
|
|
199
|
+
// fold: A = 0 or 1. cs = rol16(cs) ^ (A ? ii:jj : 0) + 13
|
|
200
|
+
fold:
|
|
201
|
+
tax
|
|
202
|
+
asl cs
|
|
203
|
+
rol cs+1
|
|
204
|
+
bcc !+
|
|
205
|
+
inc cs
|
|
206
|
+
!: txa
|
|
207
|
+
beq !+
|
|
208
|
+
lda cs
|
|
209
|
+
eor jj
|
|
210
|
+
sta cs
|
|
211
|
+
lda cs+1
|
|
212
|
+
eor ii
|
|
213
|
+
sta cs+1
|
|
214
|
+
!: clc
|
|
215
|
+
lda cs
|
|
216
|
+
adc #13
|
|
217
|
+
sta cs
|
|
218
|
+
bcc !+
|
|
219
|
+
inc cs+1
|
|
220
|
+
!: rts
|
|
221
|
+
|
|
222
|
+
// The pair routines set the operands from ii, jj and return A = 1 for
|
|
223
|
+
// "less" (or "inside"), else 0.
|
|
224
|
+
pair_s8:
|
|
225
|
+
lda ii
|
|
226
|
+
sta a8
|
|
227
|
+
lda jj
|
|
228
|
+
sta b8
|
|
229
|
+
jsr s8
|
|
230
|
+
jmp n_to_a
|
|
231
|
+
|
|
232
|
+
pair_bmi: // also counts disagreements with s8
|
|
233
|
+
lda ii
|
|
234
|
+
sta a8
|
|
235
|
+
lda jj
|
|
236
|
+
sta b8
|
|
237
|
+
jsr s8
|
|
238
|
+
jsr n_to_a
|
|
239
|
+
sta tmp
|
|
240
|
+
jsr bmi8
|
|
241
|
+
jsr n_to_a
|
|
242
|
+
cmp tmp
|
|
243
|
+
beq !+
|
|
244
|
+
inc miss
|
|
245
|
+
bne !+
|
|
246
|
+
inc miss+1
|
|
247
|
+
!: rts
|
|
248
|
+
|
|
249
|
+
pair_u16a: // a = ii:jj, b = jj:ii
|
|
250
|
+
lda ii
|
|
251
|
+
sta a_hi
|
|
252
|
+
sta b_lo
|
|
253
|
+
lda jj
|
|
254
|
+
sta a_lo
|
|
255
|
+
sta b_hi
|
|
256
|
+
jsr u16
|
|
257
|
+
jmp c_to_a
|
|
258
|
+
|
|
259
|
+
pair_u16b: // a = ii:jj, b = ii:(7*jj+3)
|
|
260
|
+
jsr set_b
|
|
261
|
+
jsr u16
|
|
262
|
+
jmp c_to_a
|
|
263
|
+
|
|
264
|
+
pair_s16a:
|
|
265
|
+
lda ii
|
|
266
|
+
sta a_hi
|
|
267
|
+
sta b_lo
|
|
268
|
+
lda jj
|
|
269
|
+
sta a_lo
|
|
270
|
+
sta b_hi
|
|
271
|
+
jsr s16
|
|
272
|
+
jmp n_to_a
|
|
273
|
+
|
|
274
|
+
pair_s16b:
|
|
275
|
+
jsr set_b
|
|
276
|
+
jsr s16
|
|
277
|
+
jmp n_to_a
|
|
278
|
+
|
|
279
|
+
pair_rng: // lo = ii, w = min(32, 256 - lo), x = jj
|
|
280
|
+
lda ii
|
|
281
|
+
sta lo8
|
|
282
|
+
cmp #224
|
|
283
|
+
bcc !+
|
|
284
|
+
lda #0
|
|
285
|
+
sec
|
|
286
|
+
sbc ii
|
|
287
|
+
jmp !++
|
|
288
|
+
!: lda #32
|
|
289
|
+
!: sta w8
|
|
290
|
+
lda jj
|
|
291
|
+
sta x8
|
|
292
|
+
jsr rng
|
|
293
|
+
jmp c_to_a
|
|
294
|
+
|
|
295
|
+
set_b:
|
|
296
|
+
lda ii
|
|
297
|
+
sta a_hi
|
|
298
|
+
sta b_hi
|
|
299
|
+
lda jj
|
|
300
|
+
sta a_lo
|
|
301
|
+
asl
|
|
302
|
+
asl
|
|
303
|
+
asl
|
|
304
|
+
sec
|
|
305
|
+
sbc jj
|
|
306
|
+
clc
|
|
307
|
+
adc #3
|
|
308
|
+
sta b_lo
|
|
309
|
+
rts
|
|
310
|
+
|
|
311
|
+
n_to_a: // N set -> A = 1, else 0; flags from the compare
|
|
312
|
+
bmi !+
|
|
313
|
+
lda #0
|
|
314
|
+
rts
|
|
315
|
+
!: lda #1
|
|
316
|
+
rts
|
|
317
|
+
|
|
318
|
+
c_to_a: // C clear -> A = 1, else 0
|
|
319
|
+
lda #0
|
|
320
|
+
rol
|
|
321
|
+
eor #1
|
|
322
|
+
rts
|
|
323
|
+
|
|
324
|
+
// ---------------------------------------------------------------- printing
|
|
325
|
+
.macro PutStr(addr, str) {
|
|
326
|
+
lda #<addr
|
|
327
|
+
sta dst
|
|
328
|
+
lda #>addr
|
|
329
|
+
sta dst+1
|
|
330
|
+
lda #<text
|
|
331
|
+
sta src
|
|
332
|
+
lda #>text
|
|
333
|
+
sta src+1
|
|
334
|
+
jsr puts
|
|
335
|
+
jmp done
|
|
336
|
+
text:
|
|
337
|
+
.text str
|
|
338
|
+
.byte 0
|
|
339
|
+
done:
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
puts:
|
|
343
|
+
ldy #0
|
|
344
|
+
!: lda (src),y
|
|
345
|
+
beq !+
|
|
346
|
+
sta (dst),y
|
|
347
|
+
iny
|
|
348
|
+
bne !-
|
|
349
|
+
!: rts
|
|
350
|
+
|
|
351
|
+
.macro At(addr) {
|
|
352
|
+
lda #<addr
|
|
353
|
+
sta dst
|
|
354
|
+
lda #>addr
|
|
355
|
+
sta dst+1
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// hex2: A = byte, written at (dst); two screen-code digits
|
|
359
|
+
hex2:
|
|
360
|
+
pha
|
|
361
|
+
lsr
|
|
362
|
+
lsr
|
|
363
|
+
lsr
|
|
364
|
+
lsr
|
|
365
|
+
jsr hexdigit
|
|
366
|
+
ldy #0
|
|
367
|
+
sta (dst),y
|
|
368
|
+
pla
|
|
369
|
+
and #$0f
|
|
370
|
+
jsr hexdigit
|
|
371
|
+
ldy #1
|
|
372
|
+
sta (dst),y
|
|
373
|
+
rts
|
|
374
|
+
|
|
375
|
+
hexdigit:
|
|
376
|
+
cmp #10
|
|
377
|
+
bcc !+
|
|
378
|
+
sbc #9 // 10..15 -> screen codes 1..6, "A".."F"
|
|
379
|
+
rts
|
|
380
|
+
!: ora #$30 // 0..9 -> "0".."9"
|
|
381
|
+
rts
|
|
382
|
+
|
|
383
|
+
// flags4: A = P; writes N V Z C or "." for a clear bit
|
|
384
|
+
flags4:
|
|
385
|
+
sta tmp
|
|
386
|
+
ldy #0
|
|
387
|
+
ldx #'N'
|
|
388
|
+
asl tmp // bit 7
|
|
389
|
+
jsr flagchar
|
|
390
|
+
ldx #'V'
|
|
391
|
+
asl tmp // bit 6
|
|
392
|
+
jsr flagchar
|
|
393
|
+
asl tmp // bit 5, unused
|
|
394
|
+
asl tmp // bit 4, B
|
|
395
|
+
asl tmp // bit 3, D
|
|
396
|
+
asl tmp // bit 2, I
|
|
397
|
+
ldx #'Z'
|
|
398
|
+
asl tmp // bit 1
|
|
399
|
+
jsr flagchar
|
|
400
|
+
ldx #'C'
|
|
401
|
+
asl tmp // bit 0
|
|
402
|
+
flagchar:
|
|
403
|
+
bcs !+
|
|
404
|
+
ldx #'.'
|
|
405
|
+
!: txa
|
|
406
|
+
sta (dst),y
|
|
407
|
+
iny
|
|
408
|
+
rts
|
|
409
|
+
|
|
410
|
+
// lg: A = 0 or 1; writes "L" for 1 (less), "G" for 0 (not less)
|
|
411
|
+
lg:
|
|
412
|
+
tax
|
|
413
|
+
lda #'G'
|
|
414
|
+
cpx #0
|
|
415
|
+
beq !+
|
|
416
|
+
lda #'L'
|
|
417
|
+
!: ldy #0
|
|
418
|
+
sta (dst),y
|
|
419
|
+
rts
|
|
420
|
+
|
|
421
|
+
// dec3: A = byte; three decimal digits at (dst), leading zeros as spaces
|
|
422
|
+
dec3:
|
|
423
|
+
ldy #0
|
|
424
|
+
ldx #'0'-1
|
|
425
|
+
!: inx
|
|
426
|
+
sec
|
|
427
|
+
sbc #100
|
|
428
|
+
bcs !-
|
|
429
|
+
adc #100
|
|
430
|
+
jsr decchar
|
|
431
|
+
ldx #'0'-1
|
|
432
|
+
!: inx
|
|
433
|
+
sec
|
|
434
|
+
sbc #10
|
|
435
|
+
bcs !-
|
|
436
|
+
adc #10
|
|
437
|
+
jsr decchar
|
|
438
|
+
ora #$30
|
|
439
|
+
sta (dst),y
|
|
440
|
+
rts
|
|
441
|
+
decchar: // X = digit char; blank while leading
|
|
442
|
+
pha
|
|
443
|
+
cpx #'0'
|
|
444
|
+
bne !+
|
|
445
|
+
cpy #2 // the units digit is never blanked
|
|
446
|
+
beq !+
|
|
447
|
+
lda tmp2 // still leading?
|
|
448
|
+
beq !++
|
|
449
|
+
!: stx tmp2 // a non-zero digit ends the leading run
|
|
450
|
+
txa
|
|
451
|
+
sta (dst),y
|
|
452
|
+
iny
|
|
453
|
+
pla
|
|
454
|
+
rts
|
|
455
|
+
!: lda #' '
|
|
456
|
+
sta (dst),y
|
|
457
|
+
iny
|
|
458
|
+
pla
|
|
459
|
+
rts
|
|
460
|
+
|
|
461
|
+
// dec5: 16-bit value in num, five digits at (dst)
|
|
462
|
+
dec5:
|
|
463
|
+
ldy #0
|
|
464
|
+
sty tmp
|
|
465
|
+
lda #<10000
|
|
466
|
+
sta sub
|
|
467
|
+
lda #>10000
|
|
468
|
+
sta sub+1
|
|
469
|
+
jsr decdiv
|
|
470
|
+
lda #<1000
|
|
471
|
+
sta sub
|
|
472
|
+
lda #>1000
|
|
473
|
+
sta sub+1
|
|
474
|
+
jsr decdiv
|
|
475
|
+
lda #100
|
|
476
|
+
sta sub
|
|
477
|
+
lda #0
|
|
478
|
+
sta sub+1
|
|
479
|
+
jsr decdiv
|
|
480
|
+
lda #10
|
|
481
|
+
sta sub
|
|
482
|
+
jsr decdiv
|
|
483
|
+
lda num
|
|
484
|
+
ora #$30
|
|
485
|
+
sta (dst),y
|
|
486
|
+
rts
|
|
487
|
+
decdiv: // count how often sub goes into num
|
|
488
|
+
!: lda num
|
|
489
|
+
sec
|
|
490
|
+
sbc sub
|
|
491
|
+
tax
|
|
492
|
+
lda num+1
|
|
493
|
+
sbc sub+1
|
|
494
|
+
bcc !+
|
|
495
|
+
sta num+1
|
|
496
|
+
stx num
|
|
497
|
+
inc tmp
|
|
498
|
+
jmp !-
|
|
499
|
+
!: lda tmp
|
|
500
|
+
ora #$30
|
|
501
|
+
sta (dst),y
|
|
502
|
+
iny
|
|
503
|
+
lda #0
|
|
504
|
+
sta tmp
|
|
505
|
+
rts
|
|
506
|
+
|
|
507
|
+
// ---------------------------------------------------------------- tables
|
|
508
|
+
.macro Probe8(a, b, exp, row) {
|
|
509
|
+
lda #a
|
|
510
|
+
sta a8
|
|
511
|
+
lda #b
|
|
512
|
+
sta b8
|
|
513
|
+
jsr probe8
|
|
514
|
+
At(SCREEN + row*40 + 6)
|
|
515
|
+
lda #a
|
|
516
|
+
jsr hex2
|
|
517
|
+
At(SCREEN + row*40 + 9)
|
|
518
|
+
lda #b
|
|
519
|
+
jsr hex2
|
|
520
|
+
At(SCREEN + row*40 + 12)
|
|
521
|
+
lda p_sbc
|
|
522
|
+
jsr flags4
|
|
523
|
+
At(SCREEN + row*40 + 17)
|
|
524
|
+
lda p_fix
|
|
525
|
+
jsr flags4
|
|
526
|
+
At(SCREEN + row*40 + 23)
|
|
527
|
+
jsr s8
|
|
528
|
+
jsr n_to_a
|
|
529
|
+
jsr lg
|
|
530
|
+
At(SCREEN + row*40 + 27)
|
|
531
|
+
jsr bmi8
|
|
532
|
+
jsr n_to_a
|
|
533
|
+
jsr lg
|
|
534
|
+
At(SCREEN + row*40 + 31)
|
|
535
|
+
lda #exp
|
|
536
|
+
jsr lg
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
.macro Probe16(a, b, expu, exps, row) {
|
|
540
|
+
lda #<a
|
|
541
|
+
sta a_lo
|
|
542
|
+
lda #>a
|
|
543
|
+
sta a_hi
|
|
544
|
+
lda #<b
|
|
545
|
+
sta b_lo
|
|
546
|
+
lda #>b
|
|
547
|
+
sta b_hi
|
|
548
|
+
jsr probe16
|
|
549
|
+
At(SCREEN + row*40 + 6)
|
|
550
|
+
lda #>a
|
|
551
|
+
jsr hex2
|
|
552
|
+
At(SCREEN + row*40 + 8)
|
|
553
|
+
lda #<a
|
|
554
|
+
jsr hex2
|
|
555
|
+
At(SCREEN + row*40 + 11)
|
|
556
|
+
lda #>b
|
|
557
|
+
jsr hex2
|
|
558
|
+
At(SCREEN + row*40 + 13)
|
|
559
|
+
lda #<b
|
|
560
|
+
jsr hex2
|
|
561
|
+
At(SCREEN + row*40 + 16)
|
|
562
|
+
lda p_cmph
|
|
563
|
+
jsr flags4
|
|
564
|
+
At(SCREEN + row*40 + 21)
|
|
565
|
+
lda p_u16
|
|
566
|
+
jsr flags4
|
|
567
|
+
At(SCREEN + row*40 + 26)
|
|
568
|
+
lda p_s16
|
|
569
|
+
jsr flags4
|
|
570
|
+
At(SCREEN + row*40 + 31)
|
|
571
|
+
jsr u16
|
|
572
|
+
jsr c_to_a
|
|
573
|
+
jsr lg
|
|
574
|
+
At(SCREEN + row*40 + 33)
|
|
575
|
+
jsr s16
|
|
576
|
+
jsr n_to_a
|
|
577
|
+
jsr lg
|
|
578
|
+
At(SCREEN + row*40 + 35)
|
|
579
|
+
lda #expu
|
|
580
|
+
jsr lg
|
|
581
|
+
At(SCREEN + row*40 + 38)
|
|
582
|
+
lda #exps
|
|
583
|
+
jsr lg
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// RunSweep(routine): patch the driver and run one 65,536-pair sweep
|
|
587
|
+
.macro RunSweep(routine) {
|
|
588
|
+
lda #<routine
|
|
589
|
+
sta pair_jsr+1
|
|
590
|
+
lda #>routine
|
|
591
|
+
sta pair_jsr+2
|
|
592
|
+
jsr sweep
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
// Report(row, label, expect): print cs against expect, PASS or FAIL,
|
|
596
|
+
// and clear ok if they differ
|
|
597
|
+
.macro Report(row, label, expect) {
|
|
598
|
+
PutStr(SCREEN + row*40, label)
|
|
599
|
+
At(SCREEN + row*40 + 7)
|
|
600
|
+
lda cs+1
|
|
601
|
+
jsr hex2
|
|
602
|
+
At(SCREEN + row*40 + 9)
|
|
603
|
+
lda cs
|
|
604
|
+
jsr hex2
|
|
605
|
+
PutStr(SCREEN + row*40 + 12, "EXP")
|
|
606
|
+
At(SCREEN + row*40 + 16)
|
|
607
|
+
lda #>expect
|
|
608
|
+
jsr hex2
|
|
609
|
+
At(SCREEN + row*40 + 18)
|
|
610
|
+
lda #<expect
|
|
611
|
+
jsr hex2
|
|
612
|
+
lda cs
|
|
613
|
+
cmp #<expect
|
|
614
|
+
bne !+
|
|
615
|
+
lda cs+1
|
|
616
|
+
cmp #>expect
|
|
617
|
+
bne !+
|
|
618
|
+
PutStr(SCREEN + row*40 + 21, "PASS")
|
|
619
|
+
jmp !++
|
|
620
|
+
!: PutStr(SCREEN + row*40 + 21, "FAIL")
|
|
621
|
+
lda #0
|
|
622
|
+
sta ok
|
|
623
|
+
!:
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.macro ClearCs() {
|
|
627
|
+
lda #0
|
|
628
|
+
sta cs
|
|
629
|
+
sta cs+1
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
// ---------------------------------------------------------------- main
|
|
633
|
+
start:
|
|
634
|
+
lda #$93 // clear screen through CHROUT
|
|
635
|
+
jsr $ffd2
|
|
636
|
+
lda #1
|
|
637
|
+
sta ok
|
|
638
|
+
lda #0
|
|
639
|
+
sta miss
|
|
640
|
+
sta miss+1
|
|
641
|
+
sta tmp
|
|
642
|
+
|
|
643
|
+
// -------- timing, interrupts off and screen blanked (no badlines)
|
|
644
|
+
sei
|
|
645
|
+
lda #$00
|
|
646
|
+
sta $dd0e
|
|
647
|
+
sta $dd0f
|
|
648
|
+
lda #$ff
|
|
649
|
+
sta $dd04
|
|
650
|
+
sta $dd05
|
|
651
|
+
sta $dd06
|
|
652
|
+
sta $dd07
|
|
653
|
+
lda $d011
|
|
654
|
+
and #$ef
|
|
655
|
+
sta $d011
|
|
656
|
+
!: lda $d011
|
|
657
|
+
bpl !-
|
|
658
|
+
!: lda $d011
|
|
659
|
+
bmi !-
|
|
660
|
+
|
|
661
|
+
Time(nothing, empty)
|
|
662
|
+
lda #$ff // u16, high bytes differ: $7FFF vs $8000
|
|
663
|
+
sta a_lo
|
|
664
|
+
lda #$7f
|
|
665
|
+
sta a_hi
|
|
666
|
+
lda #$00
|
|
667
|
+
sta b_lo
|
|
668
|
+
lda #$80
|
|
669
|
+
sta b_hi
|
|
670
|
+
Time(u16, t_u16d)
|
|
671
|
+
Time(s16, t_s16) // s16 on the same pair
|
|
672
|
+
lda #$34 // u16, high bytes equal: $1234 vs $1234
|
|
673
|
+
sta a_lo
|
|
674
|
+
sta b_lo
|
|
675
|
+
lda #$12
|
|
676
|
+
sta a_hi
|
|
677
|
+
sta b_hi
|
|
678
|
+
Time(u16, t_u16e)
|
|
679
|
+
lda #$80 // s8: -128 against 127
|
|
680
|
+
sta a8
|
|
681
|
+
lda #$7f
|
|
682
|
+
sta b8
|
|
683
|
+
Time(s8, t_s8)
|
|
684
|
+
lda #100 // rng: 100 in [90, 122)
|
|
685
|
+
sta x8
|
|
686
|
+
lda #90
|
|
687
|
+
sta lo8
|
|
688
|
+
lda #32
|
|
689
|
+
sta w8
|
|
690
|
+
Time(rng, t_rng)
|
|
691
|
+
|
|
692
|
+
lda $d011
|
|
693
|
+
ora #$10
|
|
694
|
+
sta $d011
|
|
695
|
+
cli
|
|
696
|
+
|
|
697
|
+
Net(t_u16d)
|
|
698
|
+
Net(t_u16e)
|
|
699
|
+
Net(t_s8)
|
|
700
|
+
Net(t_s16)
|
|
701
|
+
Net(t_rng)
|
|
702
|
+
|
|
703
|
+
// -------- boundary tables
|
|
704
|
+
PutStr(SCREEN, "COMPARE 16BIT AND SIGNED")
|
|
705
|
+
PutStr(SCREEN + 1*40, "8BIT A B SBC FIX IDM NAI EXP")
|
|
706
|
+
Probe8($80, $7f, 1, 2)
|
|
707
|
+
Probe8($7f, $80, 0, 3)
|
|
708
|
+
Probe8($00, $00, 0, 4)
|
|
709
|
+
Probe8($ff, $00, 1, 5)
|
|
710
|
+
Probe8($00, $ff, 0, 6)
|
|
711
|
+
Probe8($80, $80, 0, 7)
|
|
712
|
+
Probe8($7f, $7f, 0, 8)
|
|
713
|
+
Probe8($9c, $64, 1, 9)
|
|
714
|
+
PutStr(SCREEN + 10*40, "16BIT A B CMPH U16 S16 U S EU ES")
|
|
715
|
+
Probe16($7fff, $8000, 1, 0, 11)
|
|
716
|
+
Probe16($8000, $7fff, 0, 1, 12)
|
|
717
|
+
Probe16($1234, $1234, 0, 0, 13)
|
|
718
|
+
Probe16($0000, $ffff, 1, 0, 14)
|
|
719
|
+
Probe16($ffff, $0000, 0, 1, 15)
|
|
720
|
+
Probe16($0100, $00ff, 0, 0, 16)
|
|
721
|
+
Probe16($00ff, $0100, 1, 1, 17)
|
|
722
|
+
|
|
723
|
+
// -------- sweeps
|
|
724
|
+
ClearCs()
|
|
725
|
+
RunSweep(pair_u16a)
|
|
726
|
+
RunSweep(pair_u16b)
|
|
727
|
+
Report(18, "U16 CS", EXP_U16)
|
|
728
|
+
ClearCs()
|
|
729
|
+
RunSweep(pair_s8)
|
|
730
|
+
Report(19, "S8 CS", EXP_S8)
|
|
731
|
+
ClearCs()
|
|
732
|
+
RunSweep(pair_s16a)
|
|
733
|
+
RunSweep(pair_s16b)
|
|
734
|
+
Report(20, "S16 CS", EXP_S16)
|
|
735
|
+
ClearCs()
|
|
736
|
+
RunSweep(pair_rng)
|
|
737
|
+
Report(21, "RNG CS", EXP_RNG)
|
|
738
|
+
ClearCs()
|
|
739
|
+
RunSweep(pair_bmi)
|
|
740
|
+
Report(22, "BMI CS", EXP_BMI)
|
|
741
|
+
PutStr(SCREEN + 22*40 + 26, "WRONG")
|
|
742
|
+
At(SCREEN + 22*40 + 32)
|
|
743
|
+
lda miss
|
|
744
|
+
sta num
|
|
745
|
+
lda miss+1
|
|
746
|
+
sta num+1
|
|
747
|
+
jsr dec5
|
|
748
|
+
lda miss
|
|
749
|
+
cmp #<EXP_MISS
|
|
750
|
+
bne fail_miss
|
|
751
|
+
lda miss+1
|
|
752
|
+
cmp #>EXP_MISS
|
|
753
|
+
beq miss_ok
|
|
754
|
+
fail_miss:
|
|
755
|
+
lda #0
|
|
756
|
+
sta ok
|
|
757
|
+
miss_ok:
|
|
758
|
+
|
|
759
|
+
// -------- cycle line
|
|
760
|
+
PutStr(SCREEN + 23*40, "CYC U16")
|
|
761
|
+
lda #0
|
|
762
|
+
sta tmp2
|
|
763
|
+
At(SCREEN + 23*40 + 8)
|
|
764
|
+
lda t_u16d
|
|
765
|
+
jsr dec3
|
|
766
|
+
lda #0
|
|
767
|
+
sta tmp2
|
|
768
|
+
At(SCREEN + 23*40 + 12)
|
|
769
|
+
lda t_u16e
|
|
770
|
+
jsr dec3
|
|
771
|
+
PutStr(SCREEN + 23*40 + 16, "S8")
|
|
772
|
+
lda #0
|
|
773
|
+
sta tmp2
|
|
774
|
+
At(SCREEN + 23*40 + 19)
|
|
775
|
+
lda t_s8
|
|
776
|
+
jsr dec3
|
|
777
|
+
PutStr(SCREEN + 23*40 + 23, "S16")
|
|
778
|
+
lda #0
|
|
779
|
+
sta tmp2
|
|
780
|
+
At(SCREEN + 23*40 + 27)
|
|
781
|
+
lda t_s16
|
|
782
|
+
jsr dec3
|
|
783
|
+
PutStr(SCREEN + 23*40 + 31, "RNG")
|
|
784
|
+
lda #0
|
|
785
|
+
sta tmp2
|
|
786
|
+
At(SCREEN + 23*40 + 35)
|
|
787
|
+
lda t_rng
|
|
788
|
+
jsr dec3
|
|
789
|
+
|
|
790
|
+
// -------- verdict
|
|
791
|
+
lda ok
|
|
792
|
+
beq fail
|
|
793
|
+
lda #CODE_PASS
|
|
794
|
+
sta RESULT
|
|
795
|
+
lda #5
|
|
796
|
+
sta BORDER
|
|
797
|
+
PutStr(SCREEN + 24*40, "RESULT 01 PASS")
|
|
798
|
+
halt:
|
|
799
|
+
jmp halt // stay here so BASIC's READY. does not scroll the table
|
|
800
|
+
fail:
|
|
801
|
+
lda #CODE_FAIL
|
|
802
|
+
sta RESULT
|
|
803
|
+
lda #2
|
|
804
|
+
sta BORDER
|
|
805
|
+
PutStr(SCREEN + 24*40, "RESULT 02 FAIL")
|
|
806
|
+
jmp halt
|
|
807
|
+
|
|
808
|
+
// ---------------------------------------------------------------- data
|
|
809
|
+
a_lo: .byte 0
|
|
810
|
+
a_hi: .byte 0
|
|
811
|
+
b_lo: .byte 0
|
|
812
|
+
b_hi: .byte 0
|
|
813
|
+
a8: .byte 0
|
|
814
|
+
b8: .byte 0
|
|
815
|
+
x8: .byte 0
|
|
816
|
+
lo8: .byte 0
|
|
817
|
+
w8: .byte 0
|
|
818
|
+
p_sbc: .byte 0
|
|
819
|
+
p_fix: .byte 0
|
|
820
|
+
p_cmph: .byte 0
|
|
821
|
+
p_u16: .byte 0
|
|
822
|
+
p_s16: .byte 0
|
|
823
|
+
ii: .byte 0
|
|
824
|
+
jj: .byte 0
|
|
825
|
+
cs: .word 0
|
|
826
|
+
miss: .word 0
|
|
827
|
+
num: .word 0
|
|
828
|
+
sub: .word 0
|
|
829
|
+
tmp: .byte 0
|
|
830
|
+
tmp2: .byte 0
|
|
831
|
+
ok: .byte 0
|
|
832
|
+
empty: .byte 0, 0, 0
|
|
833
|
+
t_u16d: .byte 0, 0, 0
|
|
834
|
+
t_u16e: .byte 0, 0, 0
|
|
835
|
+
t_s8: .byte 0, 0, 0
|
|
836
|
+
t_s16: .byte 0, 0, 0
|
|
837
|
+
t_rng: .byte 0, 0, 0
|
|
838
|
+
```
|
|
839
|
+
|
|
840
|
+
## Build
|
|
841
|
+
|
|
842
|
+
```bash
|
|
843
|
+
java -jar KickAss.jar compare-16bit-signed.asm -o compare-16bit-signed.prg
|
|
844
|
+
```
|
|
845
|
+
|
|
846
|
+
Produces `compare-16bit-signed.prg`, `$0801` to `$1B4B`.
|
|
847
|
+
|
|
848
|
+
## Expected output
|
|
849
|
+
|
|
850
|
+
Border green, text area the power-on blue, the whole screen ours (the
|
|
851
|
+
program ends in a loop, so BASIC never prints `READY.` over the table):
|
|
852
|
+
|
|
853
|
+
```
|
|
854
|
+
COMPARE 16BIT AND SIGNED
|
|
855
|
+
8BIT A B SBC FIX IDM NAI EXP
|
|
856
|
+
80 7F .V.C NV.C L G L
|
|
857
|
+
7F 80 NV.. .V.. G L G
|
|
858
|
+
00 00 ..ZC ..ZC G G G
|
|
859
|
+
FF 00 N..C N..C L L L
|
|
860
|
+
00 FF .... .... G G G
|
|
861
|
+
80 80 ..ZC ..ZC G G G
|
|
862
|
+
7F 7F ..ZC ..ZC G G G
|
|
863
|
+
9C 64 .V.C NV.C L G L
|
|
864
|
+
16BIT A B CMPH U16 S16 U S EU ES
|
|
865
|
+
7FFF 8000 N... N... .V.. L G L G
|
|
866
|
+
8000 7FFF ...C ...C NV.C G L G L
|
|
867
|
+
1234 1234 ..ZC ..ZC ..ZC G G G G
|
|
868
|
+
0000 FFFF .... .... ..Z. L G L G
|
|
869
|
+
FFFF 0000 N..C N..C N..C G L G L
|
|
870
|
+
0100 00FF ...C ...C ..ZC G G G G
|
|
871
|
+
00FF 0100 N... N... N... L L L L
|
|
872
|
+
U16 CS 6182 EXP 6182 PASS
|
|
873
|
+
S8 CS 73FA EXP 73FA PASS
|
|
874
|
+
S16 CS 27B8 EXP 27B8 PASS
|
|
875
|
+
RNG CS A021 EXP A021 PASS
|
|
876
|
+
BMI CS A3CD EXP A3CD PASS WRONG 16384
|
|
877
|
+
CYC U16 11 18 S8 14 S16 20 RNG 14
|
|
878
|
+
RESULT 01 PASS
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
Screenshots from the pinned run, 100,000,000 cycles:
|
|
882
|
+
`screenshots/compare-16bit-signed.png` (PAL) and
|
|
883
|
+
`screenshots/compare-16bit-signed-ntsc.png` (NTSC). Both decoded
|
|
884
|
+
against the character ROM give the text above; border pixel (2, 100)
|
|
885
|
+
= (98, 213, 50) on PAL and (114, 189, 103) on NTSC, index 5 in both
|
|
886
|
+
palettes of `runtime/vice-reference.md`. The pinned command was run
|
|
887
|
+
twice per model and the two PNGs were identical bytes. The sweeps take
|
|
888
|
+
about 90,000,000 cycles; a run limited to 64,000,000 stopped after the
|
|
889
|
+
`S16` line.
|
|
890
|
+
|
|
891
|
+
The columns, rows 2 to 9: `A` and `B` in hex, `P` after `SEC / SBC`
|
|
892
|
+
(`SBC`), `P` after the `BVC` / `EOR #$80` fix-up (`FIX`), then `L` for
|
|
893
|
+
"A is less than B" or `G` for "not less" from the idiom (`IDM`), from
|
|
894
|
+
the bare `BMI` version (`NAI`) and from the Python model (`EXP`). Rows
|
|
895
|
+
11 to 17: `P` after `CMP` of the high bytes alone (`CMPH`, with `V`
|
|
896
|
+
cleared first because `CMP` never writes it), `P` at the end of the
|
|
897
|
+
unsigned idiom (`U16`) and of the signed one (`S16`), then the unsigned
|
|
898
|
+
and signed verdicts (`U`, `S`) beside the model's (`EU`, `ES`). A flag
|
|
899
|
+
prints as its letter when set and `.` when clear; the order is `N V Z C`.
|
|
900
|
+
|
|
901
|
+
Every `IDM`, `U` and `S` letter matches its `EXP` column. `NAI` is
|
|
902
|
+
wrong on three of the eight rows: `80 7F` (-128 against 127 says "not
|
|
903
|
+
less"), `7F 80` (127 against -128 says "less") and `9C 64` (-100
|
|
904
|
+
against 100 says "not less"). Those are the rows where `SBC` set `V`.
|
|
905
|
+
|
|
906
|
+
The sweep lines: `U16` and `S16` cover 131,072 pairs each (`a = i:j`
|
|
907
|
+
against `b = j:i` for every `i, j`, which meets every high-byte pair
|
|
908
|
+
and every equal value, then `a = i:j` against `b = i:(7j + 3)` so the
|
|
909
|
+
low bytes decide with the high bytes equal); `S8` and `BMI` cover all
|
|
910
|
+
65,536 signed byte pairs; `RNG` tests every `x` against every `lo`
|
|
911
|
+
with a width of 32 (clamped to `256 - lo` near the top). `WRONG 16384`
|
|
912
|
+
is the number of pairs on which the `BMI` version and the `SBC / BVC /
|
|
913
|
+
EOR` idiom disagree; the model counts the same 16,384, one quarter of
|
|
914
|
+
all pairs, which is every pair whose difference overflows.
|
|
915
|
+
|
|
916
|
+
The `CYC` line is the cost of one call of each idiom with absolute
|
|
917
|
+
operands, net of an empty `JSR` / `RTS`, measured in VICE x64sc 3.10 on
|
|
918
|
+
both models:
|
|
919
|
+
|
|
920
|
+
| Idiom | Pair timed | Cycles | Instruction table |
|
|
921
|
+
|---|---|---|---|
|
|
922
|
+
| `U16`, high bytes differ | `$7FFF` against `$8000` | 11 | 4 + 4 + 3 (branch taken) |
|
|
923
|
+
| `U16`, high bytes equal | `$1234` against `$1234` | 18 | 4 + 4 + 2 + 4 + 4 |
|
|
924
|
+
| `S8` | `$80` against `$7F` | 14 | 4 + 2 + 4 + 2 + 2 |
|
|
925
|
+
| `S16` | `$7FFF` against `$8000` | 20 | 4 + 4 + 4 + 4 + 2 + 2 |
|
|
926
|
+
| `RNG` | 100 in `[90, 122)` | 14 | 4 + 2 + 4 + 4 |
|
|
927
|
+
|
|
928
|
+
The branch that acts on the result is not included: add 2 when it
|
|
929
|
+
falls through, 3 when taken, 4 taken across a page. With the operands
|
|
930
|
+
in zero page each absolute access is one cycle less (rung 3, not
|
|
931
|
+
measured here).
|
|
932
|
+
|
|
933
|
+
The first version of this program printed 19, 15 and 20 for the
|
|
934
|
+
second, third and fourth rows. The timer readout `LDA #$FF / SBC $DD04`
|
|
935
|
+
ran with whatever carry the timed routine had left, so a routine that
|
|
936
|
+
ended with `C` set read one cycle more than one that ended with `C`
|
|
937
|
+
clear. A `SEC` before the readout fixed it and the five figures now
|
|
938
|
+
equal the instruction-table sums.
|
|
939
|
+
|
|
940
|
+
## Why this works
|
|
941
|
+
|
|
942
|
+
### The unsigned 16-bit compare
|
|
943
|
+
|
|
944
|
+
`CMP` sets `C` when `A >= operand` and `Z` when they are equal. The
|
|
945
|
+
high bytes are compared first; if they differ (`BNE` taken) they decide
|
|
946
|
+
the order and the flags `CMP` left are the answer. If they are equal the
|
|
947
|
+
low bytes are compared and their flags are the answer. At the label
|
|
948
|
+
after the branch `C` clear means `a < b`, `C` set means `a >= b`, and
|
|
949
|
+
`Z` set means the two words are equal, because `Z` can only be set
|
|
950
|
+
there by the low-byte `CMP` after the high bytes matched. Rows 16 and
|
|
951
|
+
17 show the high byte deciding against the low: `$0100` against `$00FF`
|
|
952
|
+
leaves `C` set from the first `CMP` alone.
|
|
953
|
+
|
|
954
|
+
### The signed compares
|
|
955
|
+
|
|
956
|
+
`SBC` produces `a - b` and sets `N` from bit 7 of the result and `V`
|
|
957
|
+
when the true result is outside -128 to 127. When `V` is clear `N` is
|
|
958
|
+
the sign of `a - b`, so `N` set means `a < b`. When `V` is set the
|
|
959
|
+
result wrapped and `N` is the opposite of the true sign; `EOR #$80`
|
|
960
|
+
flips bit 7 of `A`, and since `EOR` sets `N` from its result, `N` is
|
|
961
|
+
the true sign again. Row 2 is the case: `$80 - $7F` is `$01`, `N`
|
|
962
|
+
clear, `V` set; after the fix-up `A` is `$81` and `N` is set, so -128
|
|
963
|
+
is less than 127. The 16-bit form does the same on the high byte with
|
|
964
|
+
the borrow from a `CMP` of the low bytes carried in. `Z` at the end of
|
|
965
|
+
the signed 16-bit idiom is the high byte's alone (row 14: `$0000`
|
|
966
|
+
against `$FFFF` shows `Z` set with the values unequal); test equality
|
|
967
|
+
with the unsigned form or a separate compare.
|
|
968
|
+
|
|
969
|
+
The bare `BMI` version is the same subtract without the fix-up. It is
|
|
970
|
+
right whenever `V` is clear, which is every pair whose difference fits
|
|
971
|
+
in a byte, and wrong on the 16,384 that do not: positives against
|
|
972
|
+
negatives and negatives against positives far enough apart. A game
|
|
973
|
+
that compares a signed velocity against a small limit will pass every
|
|
974
|
+
test until a value crosses the boundary, which is why the sweep counts
|
|
975
|
+
the misses rather than trusting a few pairs.
|
|
976
|
+
|
|
977
|
+
### The range test
|
|
978
|
+
|
|
979
|
+
`x - lo` modulo 256 is below `w` exactly when `lo <= x < lo + w`,
|
|
980
|
+
provided `lo + w` does not pass 256: an `x` below `lo` wraps to at
|
|
981
|
+
least `256 - lo`, which is at least `w`. So `SEC / SBC lo / CMP w`
|
|
982
|
+
leaves `C` clear for inside and set for outside, and one branch acts
|
|
983
|
+
on it. The two-compare form (`CMP lo / BCC out / CMP hi / BCS out`)
|
|
984
|
+
needs no width and no wrap condition; it is what Oscar64 emits for
|
|
985
|
+
`x >= lo && x < hi`, and costs 4 + 4 + 2 + 4 + 2 = 16 on the inside path
|
|
986
|
+
(rung 3, not measured here).
|
|
987
|
+
|
|
988
|
+
### The checksum
|
|
989
|
+
|
|
990
|
+
Each sweep result (0 or 1) is folded as `cs = rol16(cs) ^ (r ? i:j : 0)
|
|
991
|
+
+ 13`. A plain rotate, exclusive-or of the bit and add, as
|
|
992
|
+
`techniques/maths.md` uses for its add sweep, was tried first and is
|
|
993
|
+
weak here: with `r = 0` the map has a period of 16 from the states
|
|
994
|
+
these sweeps reach, and a run of 65,536 identical results, or 256
|
|
995
|
+
repeats of one 256-pair block, returns to its starting state. Folding
|
|
996
|
+
the pair in makes a single flipped result change the final value (the
|
|
997
|
+
model shows `RNG` moving from `$A021` to `$4389` for one flip).
|
|
998
|
+
|
|
999
|
+
### Timing
|
|
1000
|
+
|
|
1001
|
+
Same CIA2 cascade as `speedcode-generator.md`: timer A counts phi2,
|
|
1002
|
+
timer B counts A underflows, the count is `$FFFFFF` less the timer
|
|
1003
|
+
bytes. The timed calls run under `SEI` with `DEN` clear and after a
|
|
1004
|
+
wait for the raster to wrap, so no badline lands inside a measurement
|
|
1005
|
+
and the figures are the same on PAL and NTSC. The `SEC` before the
|
|
1006
|
+
readout matters, see above; the same macro without it reads one cycle
|
|
1007
|
+
high for any routine that exits with `C` set.
|