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,311 @@
|
|
|
1
|
+
// frame_meter.asm: the CIA2 timer A frame meter for KickAssembler starters.
|
|
2
|
+
// The same contract as frame_meter.h (read that header's comment):
|
|
3
|
+
// frames recorded stop at `hold` (1 to 255: the script's play frames);
|
|
4
|
+
// worst = the largest recorded frame; typical = the median of the recorded
|
|
5
|
+
// frames, computed when recording stops (0 until then). The readout is
|
|
6
|
+
// "F00144 W01234 T01100", 20 cells.
|
|
7
|
+
//
|
|
8
|
+
// #import "frame_meter.asm" // -libdir <harness>/meter
|
|
9
|
+
// ...
|
|
10
|
+
// FrameMeterInit() // once, before the loop
|
|
11
|
+
// loop:
|
|
12
|
+
// (wait for the frame)
|
|
13
|
+
// FrameMeterStart()
|
|
14
|
+
// (one frame of work)
|
|
15
|
+
// FrameMeterStop() // records the frame
|
|
16
|
+
// (grading, logging: outside the bracket)
|
|
17
|
+
// FrameMeterPrint()
|
|
18
|
+
// jmp loop
|
|
19
|
+
// ...
|
|
20
|
+
// frame_meter: // this label is required: the macros jsr into it
|
|
21
|
+
// FrameMeterCode($0400, 24, 20, 1, 144) // screen, row, column, colour, hold
|
|
22
|
+
//
|
|
23
|
+
// Work split over a frame is summed: FrameMeterStart() ... FrameMeterPause()
|
|
24
|
+
// as often as needed, then FrameMeterStop() (or FrameMeterEnd() after a
|
|
25
|
+
// Pause) once a frame. Brackets must not nest.
|
|
26
|
+
//
|
|
27
|
+
// It uses no zero page: A, X and Y are clobbered by Init, Pause, Stop, End and
|
|
28
|
+
// Print; Start clobbers A. The flags are not preserved.
|
|
29
|
+
// Unless AUTOPILOT or FRAME_METER is defined (KickAssembler -define), every
|
|
30
|
+
// macro emits nothing, so a release build carries none of it.
|
|
31
|
+
|
|
32
|
+
#if AUTOPILOT || FRAME_METER
|
|
33
|
+
|
|
34
|
+
.macro FrameMeterInit() { jsr frame_meter.fm_init }
|
|
35
|
+
.macro FrameMeterStart() {
|
|
36
|
+
lda #$11 // force-load $FFFF, start, count phi2
|
|
37
|
+
sta $dd0e
|
|
38
|
+
}
|
|
39
|
+
.macro FrameMeterPause() { jsr frame_meter.fm_pause }
|
|
40
|
+
.macro FrameMeterStop() { jsr frame_meter.fm_stop }
|
|
41
|
+
.macro FrameMeterEnd() { jsr frame_meter.fm_frame }
|
|
42
|
+
.macro FrameMeterPrint() { jsr frame_meter.fm_print }
|
|
43
|
+
|
|
44
|
+
// Stops timer A, then raw = $FFFF - count; saturates at $FFFF when the
|
|
45
|
+
// timer passed zero (bit 0 of $DD0D, cleared by the read).
|
|
46
|
+
.macro fm_stop_and_read(fm_raw) {
|
|
47
|
+
lda #$00
|
|
48
|
+
sta $dd0e
|
|
49
|
+
sec
|
|
50
|
+
lda #$ff
|
|
51
|
+
sbc $dd04
|
|
52
|
+
sta fm_raw
|
|
53
|
+
lda #$ff
|
|
54
|
+
sbc $dd05
|
|
55
|
+
sta fm_raw+1
|
|
56
|
+
lda $dd0d
|
|
57
|
+
and #$01
|
|
58
|
+
beq !+
|
|
59
|
+
lda #$ff
|
|
60
|
+
sta fm_raw
|
|
61
|
+
sta fm_raw+1
|
|
62
|
+
!:
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.macro FrameMeterCode(screen, row, col, colour, hold) {
|
|
66
|
+
.errorif (hold < 1 || hold > 255), "FrameMeterCode: hold must be 1 to 255 frames"
|
|
67
|
+
.var cell = screen + 40*row + col
|
|
68
|
+
.var tint = $d800 + 40*row + col
|
|
69
|
+
|
|
70
|
+
fm_init:
|
|
71
|
+
ldx #19
|
|
72
|
+
lda #colour
|
|
73
|
+
!: sta tint,x
|
|
74
|
+
dex
|
|
75
|
+
bpl !-
|
|
76
|
+
lda #$01 // mask timer A's NMI (bit 7 clear: clear this mask bit only)
|
|
77
|
+
sta $dd0d
|
|
78
|
+
lda #$00
|
|
79
|
+
sta $dd0e
|
|
80
|
+
lda #$ff // the latch every FrameMeterStart reloads
|
|
81
|
+
sta $dd04
|
|
82
|
+
sta $dd05
|
|
83
|
+
sta fm_zero
|
|
84
|
+
sta fm_zero+1
|
|
85
|
+
lda $dd0d // clear a stale underflow flag
|
|
86
|
+
php // no interrupt inside the calibration
|
|
87
|
+
sei
|
|
88
|
+
lda #4 // the empty bracket, four times at line 0 (no DMA there);
|
|
89
|
+
sta fm_try // the least count is the bracket's own cost
|
|
90
|
+
fm_cal:
|
|
91
|
+
!: lda $d012
|
|
92
|
+
beq !-
|
|
93
|
+
!: lda $d012
|
|
94
|
+
bne !-
|
|
95
|
+
lda #$11 // the same code as Start and Stop
|
|
96
|
+
sta $dd0e
|
|
97
|
+
jsr fm_read
|
|
98
|
+
lda fm_raw
|
|
99
|
+
cmp fm_zero
|
|
100
|
+
lda fm_raw+1
|
|
101
|
+
sbc fm_zero+1
|
|
102
|
+
bcs !+
|
|
103
|
+
lda fm_raw
|
|
104
|
+
sta fm_zero
|
|
105
|
+
lda fm_raw+1
|
|
106
|
+
sta fm_zero+1
|
|
107
|
+
!: dec fm_try
|
|
108
|
+
bne fm_cal
|
|
109
|
+
plp
|
|
110
|
+
lda #0
|
|
111
|
+
ldx #fm_vars_end - fm_vars - 1
|
|
112
|
+
!: sta fm_vars,x
|
|
113
|
+
dex
|
|
114
|
+
bpl !-
|
|
115
|
+
rts
|
|
116
|
+
|
|
117
|
+
fm_read:
|
|
118
|
+
fm_stop_and_read(fm_raw)
|
|
119
|
+
rts
|
|
120
|
+
|
|
121
|
+
// acc += raw - zero, saturating at $FFFF: a frame whose brackets sum past
|
|
122
|
+
// 65,535 cycles reads 65,535, not the sum modulo 65,536
|
|
123
|
+
fm_pause:
|
|
124
|
+
fm_stop_and_read(fm_raw)
|
|
125
|
+
fm_accumulate:
|
|
126
|
+
sec
|
|
127
|
+
lda fm_raw
|
|
128
|
+
sbc fm_zero
|
|
129
|
+
tax
|
|
130
|
+
lda fm_raw+1
|
|
131
|
+
sbc fm_zero+1
|
|
132
|
+
tay
|
|
133
|
+
clc
|
|
134
|
+
txa
|
|
135
|
+
adc fm_acc
|
|
136
|
+
sta fm_acc
|
|
137
|
+
tya
|
|
138
|
+
adc fm_acc+1
|
|
139
|
+
sta fm_acc+1
|
|
140
|
+
bcc !+
|
|
141
|
+
lda #$ff
|
|
142
|
+
sta fm_acc
|
|
143
|
+
sta fm_acc+1
|
|
144
|
+
!: rts
|
|
145
|
+
|
|
146
|
+
fm_stop:
|
|
147
|
+
fm_stop_and_read(fm_raw)
|
|
148
|
+
jsr fm_accumulate
|
|
149
|
+
// Records the frame's sum, once a frame.
|
|
150
|
+
fm_frame:
|
|
151
|
+
lda fm_frames
|
|
152
|
+
cmp #hold
|
|
153
|
+
bcs fm_clear // recording stopped
|
|
154
|
+
tax
|
|
155
|
+
lda fm_acc
|
|
156
|
+
sta fm_lo,x
|
|
157
|
+
sta fm_last
|
|
158
|
+
lda fm_acc+1
|
|
159
|
+
sta fm_hi,x
|
|
160
|
+
sta fm_last+1
|
|
161
|
+
lda fm_worst+1 // worst = max(worst, last)
|
|
162
|
+
cmp fm_last+1
|
|
163
|
+
bcc fm_newworst
|
|
164
|
+
bne fm_count
|
|
165
|
+
lda fm_worst
|
|
166
|
+
cmp fm_last
|
|
167
|
+
bcs fm_count
|
|
168
|
+
fm_newworst:
|
|
169
|
+
lda fm_last
|
|
170
|
+
sta fm_worst
|
|
171
|
+
lda fm_last+1
|
|
172
|
+
sta fm_worst+1
|
|
173
|
+
fm_count:
|
|
174
|
+
inc fm_frames
|
|
175
|
+
lda fm_frames
|
|
176
|
+
cmp #hold
|
|
177
|
+
bne fm_clear
|
|
178
|
+
jsr fm_sort // recording ends: typical = the median
|
|
179
|
+
ldx #hold/2
|
|
180
|
+
lda fm_lo,x
|
|
181
|
+
sta fm_typical
|
|
182
|
+
lda fm_hi,x
|
|
183
|
+
sta fm_typical+1
|
|
184
|
+
fm_clear:
|
|
185
|
+
lda #0
|
|
186
|
+
sta fm_acc
|
|
187
|
+
sta fm_acc+1
|
|
188
|
+
rts
|
|
189
|
+
|
|
190
|
+
// Insertion sort of fm_lo/fm_hi[0 .. hold-1], ascending.
|
|
191
|
+
fm_sort:
|
|
192
|
+
ldx #1
|
|
193
|
+
fm_si:
|
|
194
|
+
cpx #hold
|
|
195
|
+
bcs fm_sorted
|
|
196
|
+
lda fm_lo,x
|
|
197
|
+
sta fm_klo
|
|
198
|
+
lda fm_hi,x
|
|
199
|
+
sta fm_khi
|
|
200
|
+
txa
|
|
201
|
+
tay
|
|
202
|
+
fm_sj:
|
|
203
|
+
cpy #0
|
|
204
|
+
beq fm_ins
|
|
205
|
+
lda fm_klo // key >= a[j-1]: insert here
|
|
206
|
+
cmp fm_lo-1,y
|
|
207
|
+
lda fm_khi
|
|
208
|
+
sbc fm_hi-1,y
|
|
209
|
+
bcs fm_ins
|
|
210
|
+
lda fm_lo-1,y
|
|
211
|
+
sta fm_lo,y
|
|
212
|
+
lda fm_hi-1,y
|
|
213
|
+
sta fm_hi,y
|
|
214
|
+
dey
|
|
215
|
+
jmp fm_sj
|
|
216
|
+
fm_ins:
|
|
217
|
+
lda fm_klo
|
|
218
|
+
sta fm_lo,y
|
|
219
|
+
lda fm_khi
|
|
220
|
+
sta fm_hi,y
|
|
221
|
+
inx
|
|
222
|
+
jmp fm_si
|
|
223
|
+
fm_sorted:
|
|
224
|
+
rts
|
|
225
|
+
|
|
226
|
+
fm_print:
|
|
227
|
+
ldy #0
|
|
228
|
+
lda #6 // screen code 6 = F
|
|
229
|
+
ldx #0 // frames
|
|
230
|
+
jsr fm_put5
|
|
231
|
+
lda #23 // W
|
|
232
|
+
ldx #2 // worst
|
|
233
|
+
jsr fm_put5
|
|
234
|
+
lda #20 // T
|
|
235
|
+
ldx #4 // typical
|
|
236
|
+
jsr fm_put5
|
|
237
|
+
rts
|
|
238
|
+
|
|
239
|
+
// A = letter, X = offset of the value in fm_shown, Y = cell index.
|
|
240
|
+
// Writes letter, five digits and a space; Y advances by 7.
|
|
241
|
+
fm_put5:
|
|
242
|
+
sta cell,y
|
|
243
|
+
iny
|
|
244
|
+
lda fm_shown,x
|
|
245
|
+
sta fm_v
|
|
246
|
+
lda fm_shown+1,x
|
|
247
|
+
sta fm_v+1
|
|
248
|
+
ldx #0
|
|
249
|
+
fm_digit:
|
|
250
|
+
lda #$30
|
|
251
|
+
sta fm_d
|
|
252
|
+
!: lda fm_v // while v >= pow10[x]: v -= pow10[x]; d++
|
|
253
|
+
cmp fm_p10_lo,x
|
|
254
|
+
lda fm_v+1
|
|
255
|
+
sbc fm_p10_hi,x
|
|
256
|
+
bcc !+
|
|
257
|
+
sta fm_v+1
|
|
258
|
+
lda fm_v
|
|
259
|
+
sbc fm_p10_lo,x
|
|
260
|
+
sta fm_v
|
|
261
|
+
inc fm_d
|
|
262
|
+
jmp !-
|
|
263
|
+
!: lda fm_d
|
|
264
|
+
sta cell,y
|
|
265
|
+
iny
|
|
266
|
+
inx
|
|
267
|
+
cpx #4
|
|
268
|
+
bne fm_digit
|
|
269
|
+
lda fm_v
|
|
270
|
+
ora #$30
|
|
271
|
+
sta cell,y
|
|
272
|
+
iny
|
|
273
|
+
cpy #20
|
|
274
|
+
bcs !+
|
|
275
|
+
lda #$20
|
|
276
|
+
sta cell,y
|
|
277
|
+
iny
|
|
278
|
+
!: rts
|
|
279
|
+
|
|
280
|
+
fm_p10_lo: .byte <10000, <1000, <100, <10
|
|
281
|
+
fm_p10_hi: .byte >10000, >1000, >100, >10
|
|
282
|
+
fm_raw: .word 0
|
|
283
|
+
fm_zero: .word 0
|
|
284
|
+
fm_v: .word 0
|
|
285
|
+
fm_d: .byte 0
|
|
286
|
+
fm_try: .byte 0
|
|
287
|
+
fm_klo: .byte 0
|
|
288
|
+
fm_khi: .byte 0
|
|
289
|
+
fm_vars:
|
|
290
|
+
fm_shown:
|
|
291
|
+
fm_frames: .word 0
|
|
292
|
+
fm_worst: .word 0
|
|
293
|
+
fm_typical: .word 0
|
|
294
|
+
fm_last: .word 0
|
|
295
|
+
fm_acc: .word 0
|
|
296
|
+
fm_vars_end:
|
|
297
|
+
fm_lo: .fill hold, 0
|
|
298
|
+
fm_hi: .fill hold, 0
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
#else
|
|
302
|
+
|
|
303
|
+
.macro FrameMeterInit() {}
|
|
304
|
+
.macro FrameMeterStart() {}
|
|
305
|
+
.macro FrameMeterPause() {}
|
|
306
|
+
.macro FrameMeterStop() {}
|
|
307
|
+
.macro FrameMeterEnd() {}
|
|
308
|
+
.macro FrameMeterPrint() {}
|
|
309
|
+
.macro FrameMeterCode(screen, row, col, colour, hold) {}
|
|
310
|
+
|
|
311
|
+
#endif
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// frame_meter.c: see frame_meter.h for the contract.
|
|
2
|
+
#include "frame_meter.h"
|
|
3
|
+
#include <c64/vic.h>
|
|
4
|
+
|
|
5
|
+
unsigned meter_last, meter_worst, meter_typical, meter_frames, meter_zero;
|
|
6
|
+
|
|
7
|
+
#if FRAME_METER
|
|
8
|
+
|
|
9
|
+
static unsigned sample[255]; // one per recorded frame
|
|
10
|
+
static unsigned acc; // this frame's sum so far
|
|
11
|
+
static char hold_at;
|
|
12
|
+
static char *cell; // first screen cell of the readout
|
|
13
|
+
|
|
14
|
+
// Stops the timer before reading, so the two byte reads cannot straddle a
|
|
15
|
+
// borrow. Bit 0 of $DD0D says the timer passed zero since the last read:
|
|
16
|
+
// more than 65,535 cycles, so the count saturates. Reading $DD0D clears it.
|
|
17
|
+
__noinline unsigned meter_read(void)
|
|
18
|
+
{
|
|
19
|
+
cia2.cra = 0x00;
|
|
20
|
+
unsigned t = 0xffff - cia2.ta;
|
|
21
|
+
if (cia2.icr & 0x01)
|
|
22
|
+
t = 0xffff;
|
|
23
|
+
return t;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
void meter_init(unsigned screen, char row, char col, char colour, char hold)
|
|
27
|
+
{
|
|
28
|
+
unsigned off = 40 * row + col;
|
|
29
|
+
cell = (char *)(screen + off);
|
|
30
|
+
char *tint = (char *)(0xd800 + off);
|
|
31
|
+
for (char i = 0; i < 20; i++)
|
|
32
|
+
tint[i] = colour;
|
|
33
|
+
hold_at = hold ? hold : 1;
|
|
34
|
+
cia2.icr = 0x01; // mask timer A's NMI (bit 7 clear: clear this mask bit only)
|
|
35
|
+
cia2.cra = 0x00;
|
|
36
|
+
cia2.ta = 0xffff; // the latch every METER_START reloads
|
|
37
|
+
acc = cia2.icr; // read to clear a stale underflow flag
|
|
38
|
+
meter_zero = 0xffff;
|
|
39
|
+
__asm volatile { php
|
|
40
|
+
sei } // no interrupt inside the calibration
|
|
41
|
+
for (char k = 0; k < 4; k++) // the empty bracket, at line 0: no DMA there
|
|
42
|
+
{
|
|
43
|
+
while (vic.raster == 0) ;
|
|
44
|
+
while (vic.raster != 0) ;
|
|
45
|
+
METER_START;
|
|
46
|
+
unsigned z = meter_read();
|
|
47
|
+
if (z < meter_zero)
|
|
48
|
+
meter_zero = z;
|
|
49
|
+
}
|
|
50
|
+
__asm volatile { plp }
|
|
51
|
+
meter_last = meter_worst = meter_typical = meter_frames = 0;
|
|
52
|
+
acc = 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Saturates at 65,535: a frame whose brackets sum past it reads 65,535,
|
|
56
|
+
// not the sum modulo 65,536.
|
|
57
|
+
void meter_add(unsigned raw)
|
|
58
|
+
{
|
|
59
|
+
unsigned d = raw - meter_zero;
|
|
60
|
+
if (acc > 65535u - d)
|
|
61
|
+
acc = 65535u;
|
|
62
|
+
else
|
|
63
|
+
acc += d;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// The median of the recorded frames by selection (Wirth's FIND, a
|
|
67
|
+
// quicksort that follows only the half holding the middle): a few hundred
|
|
68
|
+
// compares for 255 frames. The insertion sort it replaces took n * n / 4 and
|
|
69
|
+
// held a platformer's main loop for about 94 frames (1.85M cycles) at the
|
|
70
|
+
// moment recording stopped. Same value: the element a full sort would put
|
|
71
|
+
// in the middle.
|
|
72
|
+
static unsigned select_median(void)
|
|
73
|
+
{
|
|
74
|
+
int lo = 0, hi = hold_at - 1, k = hold_at >> 1;
|
|
75
|
+
while (lo < hi)
|
|
76
|
+
{
|
|
77
|
+
unsigned x = sample[k];
|
|
78
|
+
int i = lo, j = hi;
|
|
79
|
+
do
|
|
80
|
+
{
|
|
81
|
+
while (sample[i] < x)
|
|
82
|
+
i++;
|
|
83
|
+
while (x < sample[j])
|
|
84
|
+
j--;
|
|
85
|
+
if (i <= j)
|
|
86
|
+
{
|
|
87
|
+
unsigned t = sample[i];
|
|
88
|
+
sample[i] = sample[j];
|
|
89
|
+
sample[j] = t;
|
|
90
|
+
i++;
|
|
91
|
+
j--;
|
|
92
|
+
}
|
|
93
|
+
} while (i <= j);
|
|
94
|
+
if (j < k)
|
|
95
|
+
lo = i;
|
|
96
|
+
if (k < i)
|
|
97
|
+
hi = j;
|
|
98
|
+
}
|
|
99
|
+
return sample[k];
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
void meter_frame(void)
|
|
103
|
+
{
|
|
104
|
+
unsigned t = acc;
|
|
105
|
+
acc = 0;
|
|
106
|
+
if (meter_frames >= hold_at)
|
|
107
|
+
return;
|
|
108
|
+
meter_last = t;
|
|
109
|
+
if (t > meter_worst)
|
|
110
|
+
meter_worst = t;
|
|
111
|
+
sample[meter_frames++] = t;
|
|
112
|
+
if (meter_frames == hold_at)
|
|
113
|
+
meter_typical = select_median();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
void meter_stop(unsigned raw)
|
|
117
|
+
{
|
|
118
|
+
meter_add(raw);
|
|
119
|
+
meter_frame();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
static const unsigned pow10[4] = {10000, 1000, 100, 10};
|
|
123
|
+
|
|
124
|
+
static char *put5(char *p, char letter, unsigned v)
|
|
125
|
+
{
|
|
126
|
+
*p++ = letter;
|
|
127
|
+
for (char i = 0; i < 4; i++)
|
|
128
|
+
{
|
|
129
|
+
char d = 0x30;
|
|
130
|
+
while (v >= pow10[i]) { v -= pow10[i]; d++; }
|
|
131
|
+
*p++ = d;
|
|
132
|
+
}
|
|
133
|
+
*p++ = 0x30 + (char)v;
|
|
134
|
+
return p;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
void meter_print(void)
|
|
138
|
+
{
|
|
139
|
+
char *p = put5(cell, 6, meter_frames); // screen code 6 = F
|
|
140
|
+
*p++ = 0x20;
|
|
141
|
+
p = put5(p, 23, meter_worst); // 23 = W
|
|
142
|
+
*p++ = 0x20;
|
|
143
|
+
put5(p, 20, meter_typical); // 20 = T
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
#else
|
|
147
|
+
|
|
148
|
+
unsigned meter_read(void) { return 0; }
|
|
149
|
+
void meter_init(unsigned screen, char row, char col, char colour, char hold) {}
|
|
150
|
+
void meter_add(unsigned raw) {}
|
|
151
|
+
void meter_frame(void) {}
|
|
152
|
+
void meter_stop(unsigned raw) {}
|
|
153
|
+
void meter_print(void) {}
|
|
154
|
+
|
|
155
|
+
#endif
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// frame_meter.h: CIA2 timer A frame meter for Oscar64 starters.
|
|
2
|
+
//
|
|
3
|
+
// meter_init(0x0400, 24, 20, 1, 144); // screen, row, column, colour, frames to record
|
|
4
|
+
// for (;;) {
|
|
5
|
+
// wait_frame();
|
|
6
|
+
// METER_START;
|
|
7
|
+
// ... one frame of work ...
|
|
8
|
+
// METER_STOP; // records this frame
|
|
9
|
+
// ... grading, logging: outside the bracket ...
|
|
10
|
+
// meter_print();
|
|
11
|
+
// }
|
|
12
|
+
//
|
|
13
|
+
// Work split over several places in a frame (a main loop and IRQ handlers)
|
|
14
|
+
// is summed: METER_START ... METER_PAUSE as often as needed, and
|
|
15
|
+
// METER_STOP (or meter_frame()) once, to record the frame's sum. Brackets
|
|
16
|
+
// must not nest: an IRQ that brackets its own work must not land inside
|
|
17
|
+
// another bracket.
|
|
18
|
+
//
|
|
19
|
+
// It times with CIA2 timer A counting phi2 cycles, so a figure is wall
|
|
20
|
+
// time: badline and sprite DMA steals and any interrupt that lands inside a
|
|
21
|
+
// bracket are counted. The empty bracket's own count is measured at init
|
|
22
|
+
// (the least of four tries, each at raster line 0, where no DMA falls) and
|
|
23
|
+
// subtracted from every bracket.
|
|
24
|
+
//
|
|
25
|
+
// frames = frames recorded. Recording stops at `hold` (1 to 255): make hold
|
|
26
|
+
// the play frames of the autopilot script, so no idle frame counts.
|
|
27
|
+
// worst = the largest recorded frame.
|
|
28
|
+
// typical = the median of the recorded frames, found by selection when recording
|
|
29
|
+
// stops (0 until then): a cost some play frame actually took, with
|
|
30
|
+
// at least half the frames at or under it. This is the KB's
|
|
31
|
+
// cycles_per_frame_typical (CONVENTIONS-techniques.md) when the
|
|
32
|
+
// recorded frames are play.
|
|
33
|
+
//
|
|
34
|
+
// meter_print writes "F00144 W01234 T01100" (20 cells) at the row and column
|
|
35
|
+
// given; the character set in use must hold 0-9, F, W and T at their screen
|
|
36
|
+
// codes. check.py reads it back.
|
|
37
|
+
//
|
|
38
|
+
// Timer choice: CIA2 timer A. The KERNAL IRQ uses CIA1 timer A and the KERNAL
|
|
39
|
+
// serial (disk) routines write CIA1 timer B (issue #35), so neither collides.
|
|
40
|
+
// CIA2 timer A is the KERNAL's RS-232 bit timer: do not open device 2 while
|
|
41
|
+
// the meter runs. meter_init masks timer A's NMI only ($DD0D = $01) and
|
|
42
|
+
// leaves CIA2's other sources as they were.
|
|
43
|
+
//
|
|
44
|
+
// FRAME_METER defaults to AUTOPILOT: in a build without it the macros and
|
|
45
|
+
// meter_print compile to nothing and the release carries none of it. Build
|
|
46
|
+
// with -dFRAME_METER=1 to keep the meter in a manual build.
|
|
47
|
+
#ifndef FRAME_METER_H
|
|
48
|
+
#define FRAME_METER_H
|
|
49
|
+
|
|
50
|
+
#include <c64/cia.h>
|
|
51
|
+
|
|
52
|
+
#ifndef AUTOPILOT
|
|
53
|
+
#define AUTOPILOT 0
|
|
54
|
+
#endif
|
|
55
|
+
#ifndef FRAME_METER
|
|
56
|
+
#define FRAME_METER AUTOPILOT
|
|
57
|
+
#endif
|
|
58
|
+
|
|
59
|
+
extern unsigned meter_last, meter_worst, meter_typical, meter_frames, meter_zero;
|
|
60
|
+
|
|
61
|
+
void meter_init(unsigned screen, char row, char col, char colour, char hold);
|
|
62
|
+
unsigned meter_read(void);
|
|
63
|
+
void meter_add(unsigned raw);
|
|
64
|
+
void meter_frame(void);
|
|
65
|
+
void meter_stop(unsigned raw);
|
|
66
|
+
void meter_print(void);
|
|
67
|
+
|
|
68
|
+
#if FRAME_METER
|
|
69
|
+
#define METER_START (cia2.cra = 0x11) // force-load $FFFF, start, count phi2
|
|
70
|
+
#define METER_PAUSE meter_add(meter_read()) // add this bracket to the frame's sum
|
|
71
|
+
#define METER_STOP meter_stop(meter_read()) // add it, then record the frame
|
|
72
|
+
#else
|
|
73
|
+
#define METER_START
|
|
74
|
+
#define METER_PAUSE
|
|
75
|
+
#define METER_STOP
|
|
76
|
+
#endif
|
|
77
|
+
|
|
78
|
+
#pragma compile("frame_meter.c")
|
|
79
|
+
|
|
80
|
+
#endif
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""zp-used.py: the zero-page addresses an Oscar64 program's code touches.
|
|
3
|
+
|
|
4
|
+
usage: zp-used.py build/NAME.asm [--claim '$02-$52']
|
|
5
|
+
|
|
6
|
+
Reads the listing Oscar64 writes beside the PRG. Every instruction there is
|
|
7
|
+
a line "addr : b0 b1 b2 MNEMONIC operand"; one whose third byte is "__" is
|
|
8
|
+
two bytes long, and a two-byte instruction that is not immediate ("#") and
|
|
9
|
+
not a branch addresses zero page through its second byte (zp, zp,x, zp,y,
|
|
10
|
+
(zp,x), (zp),y). The BASIC stub at $0801-$080C decodes as instructions and
|
|
11
|
+
is skipped.
|
|
12
|
+
|
|
13
|
+
Why a measurement and not a constant: Oscar64 places its fixed registers at
|
|
14
|
+
$02-$26 and each function's temporaries from $43 up by that function's temp
|
|
15
|
+
count (oscar64/MachineTypes.cpp and InterCode.cpp, read); temps past
|
|
16
|
+
BC_REG_TMP_SAVED ($53) are saved and restored around calls, but they are
|
|
17
|
+
still zero page. So the top of the range grows with the largest function,
|
|
18
|
+
and only the program's own listing says where it is.
|
|
19
|
+
|
|
20
|
+
It sees the compiled C and inline __asm only: bytes embedded from a
|
|
21
|
+
KickAssembler blob are data in the listing (BYT lines), so a blob's zero
|
|
22
|
+
page is whatever its own source uses.
|
|
23
|
+
|
|
24
|
+
$00 and $01 are the 6510's own port (direction and data), not work bytes;
|
|
25
|
+
they are listed on their own line and never judged against a claim. The
|
|
26
|
+
startup's zero-page clear is a store indexed from $00, which is why $00
|
|
27
|
+
shows up in every build.
|
|
28
|
+
|
|
29
|
+
With --claim, exits 1 when the program touches an address from $02 up
|
|
30
|
+
outside the claimed ranges (comma-separated $lo-$hi or $addr), and names
|
|
31
|
+
them.
|
|
32
|
+
"""
|
|
33
|
+
import re
|
|
34
|
+
import sys
|
|
35
|
+
|
|
36
|
+
LINE = re.compile(r"^\s*([0-9a-f]{4}) : ([0-9a-f]{2}) ([0-9a-f]{2}|__) (__|[0-9a-f]{2}) ([A-Z]{3})\b\s*(.*)$")
|
|
37
|
+
BRANCHES = {"BPL", "BMI", "BVC", "BVS", "BCC", "BCS", "BNE", "BEQ"}
|
|
38
|
+
STUB_END = 0x080D
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def used(path):
|
|
42
|
+
out = {}
|
|
43
|
+
for line in open(path, encoding="latin-1"):
|
|
44
|
+
m = LINE.match(line)
|
|
45
|
+
if not m:
|
|
46
|
+
continue
|
|
47
|
+
addr, _op, b1, b2, mnem, operand = m.groups()
|
|
48
|
+
if int(addr, 16) < STUB_END or b2 != "__" or b1 == "__":
|
|
49
|
+
continue
|
|
50
|
+
if mnem in BRANCHES or operand.startswith("#"):
|
|
51
|
+
continue
|
|
52
|
+
out.setdefault(int(b1, 16), mnem)
|
|
53
|
+
return out
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def ranges(addrs):
|
|
57
|
+
rs, start, prev = [], None, None
|
|
58
|
+
for a in sorted(addrs):
|
|
59
|
+
if start is None:
|
|
60
|
+
start = prev = a
|
|
61
|
+
elif a == prev + 1:
|
|
62
|
+
prev = a
|
|
63
|
+
else:
|
|
64
|
+
rs.append((start, prev))
|
|
65
|
+
start = prev = a
|
|
66
|
+
if start is not None:
|
|
67
|
+
rs.append((start, prev))
|
|
68
|
+
return rs
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def parse_claim(text):
|
|
72
|
+
claimed = set()
|
|
73
|
+
for part in text.split(","):
|
|
74
|
+
part = part.strip().replace("$", "")
|
|
75
|
+
if not part:
|
|
76
|
+
continue
|
|
77
|
+
lo, _, hi = part.partition("-")
|
|
78
|
+
claimed.update(range(int(lo, 16), int(hi or lo, 16) + 1))
|
|
79
|
+
return claimed
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def main(argv):
|
|
83
|
+
if not argv:
|
|
84
|
+
print(__doc__.strip().splitlines()[2], file=sys.stderr)
|
|
85
|
+
return 2
|
|
86
|
+
found = used(argv[0])
|
|
87
|
+
port = sorted(a for a in found if a < 2)
|
|
88
|
+
addrs = {a: m for a, m in found.items() if a >= 2}
|
|
89
|
+
text = ", ".join(f"${a:02X}" if a == b else f"${a:02X}-${b:02X}" for a, b in ranges(addrs))
|
|
90
|
+
print(f"zero page used by the code in {argv[0]}: {text or '(none)'}")
|
|
91
|
+
if port:
|
|
92
|
+
print("6510 port (not judged): " + ", ".join(f"${a:02X} ({found[a]})" for a in port))
|
|
93
|
+
if "--claim" in argv:
|
|
94
|
+
claim = argv[argv.index("--claim") + 1]
|
|
95
|
+
outside = sorted(set(addrs) - parse_claim(claim))
|
|
96
|
+
if outside:
|
|
97
|
+
print("outside the claim " + claim + ": " + ", ".join(f"${a:02X} ({addrs[a]})" for a in outside))
|
|
98
|
+
return 1
|
|
99
|
+
print(f"all inside the claim {claim}")
|
|
100
|
+
return 0
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
if __name__ == "__main__":
|
|
104
|
+
sys.exit(main(sys.argv[1:]))
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/claude-code-settings.json",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"PreToolUse": [
|
|
5
|
+
{
|
|
6
|
+
"matcher": "Edit|MultiEdit|Write|NotebookEdit",
|
|
7
|
+
"hooks": [
|
|
8
|
+
{
|
|
9
|
+
"type": "command",
|
|
10
|
+
"command": "h=\"$CLAUDE_PROJECT_DIR/harness/hooks/plan-gate.py\"; [ -f \"$h\" ] || h=\"$CLAUDE_PROJECT_DIR/../_harness/hooks/plan-gate.py\"; exec python3 \"$h\"",
|
|
11
|
+
"timeout": 10
|
|
12
|
+
}
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
}
|