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
package/docs/ONTOLOGY.md
ADDED
|
@@ -0,0 +1,655 @@
|
|
|
1
|
+
# c64-kb Graph Ontology
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The FalkorDB knowledge graph models C64 hardware (chips, registers,
|
|
6
|
+
memory regions), demo and game techniques, toolchains, pitfalls, and
|
|
7
|
+
crash/failure patterns. Designed to support multi-hop queries like
|
|
8
|
+
"what techniques use the copper-equivalent stable raster IRQ?" or "what
|
|
9
|
+
registers does this effect touch?" or "is FLI compatible with sprite-
|
|
10
|
+
multiplex-24 in PAL?"
|
|
11
|
+
|
|
12
|
+
`ensureSchema()` creates the indexes, constraints and the `Chip`, `Region`
|
|
13
|
+
and `HardwareUnit` seed nodes; every other node and edge comes from ingesting `docs/`.
|
|
14
|
+
|
|
15
|
+
Design principles:
|
|
16
|
+
- 5–12 node types, 8–20 edge types (maintainable range for a domain KB)
|
|
17
|
+
- Node vs property test: "do you traverse through it?" If yes, node.
|
|
18
|
+
- Single general type with `category` property (one `Technique` with
|
|
19
|
+
category, not separate `CopperTechnique`/`SpriteTechnique` labels).
|
|
20
|
+
- Edge names: verb-based SCREAMING_SNAKE reading as sentences.
|
|
21
|
+
|
|
22
|
+
## Node Types (16)
|
|
23
|
+
|
|
24
|
+
### KernalRoutine
|
|
25
|
+
|
|
26
|
+
A KERNAL ROM jump-table entry ($FF81-$FFF3). An earlier version of this
|
|
27
|
+
line said $FFC0+; the table starts at $FF81 (CINT).
|
|
28
|
+
|
|
29
|
+
| Property | Type | Description |
|
|
30
|
+
|----------|------|-------------|
|
|
31
|
+
| name | string | Routine name (e.g. "CHROUT") |
|
|
32
|
+
| address | string | Hex jump-table address (e.g. "$FFD2") |
|
|
33
|
+
| input_regs | string | Calling convention (e.g. "A=byte to print") |
|
|
34
|
+
| output_regs | string | Return values (e.g. "C=error flag") |
|
|
35
|
+
| description | string | One-line summary |
|
|
36
|
+
|
|
37
|
+
Source: `hardware/kernal-routines-reference.md` (Phase 1).
|
|
38
|
+
|
|
39
|
+
### Register
|
|
40
|
+
|
|
41
|
+
A C64 hardware register at $D000–$DFFF.
|
|
42
|
+
|
|
43
|
+
| Property | Type | Description |
|
|
44
|
+
|----------|------|-------------|
|
|
45
|
+
| name | string | Register name (e.g. "D011", "BORDER") |
|
|
46
|
+
| address | string | Hex address (e.g. "$D011") |
|
|
47
|
+
| chip | string | Owning chip ("VIC-II", "SID", "CIA1", "CIA2") |
|
|
48
|
+
| rw | string | Access type: "R", "W", or "RW" |
|
|
49
|
+
| bit_width | integer | 8 in nearly all cases |
|
|
50
|
+
| default_value | string | Power-on default |
|
|
51
|
+
| side_effects | string | Strobe / write-only / read-clears semantics |
|
|
52
|
+
|
|
53
|
+
Source: `hardware/c64-registers-reference.md` (Phase 1).
|
|
54
|
+
|
|
55
|
+
### MemoryRegion
|
|
56
|
+
|
|
57
|
+
An address-space zone (zero page, screen RAM, BASIC RAM, I/O, KERNAL ROM,
|
|
58
|
+
etc.).
|
|
59
|
+
|
|
60
|
+
| Property | Type | Description |
|
|
61
|
+
|----------|------|-------------|
|
|
62
|
+
| name | string | Zone name (e.g. "Zero page", "Screen RAM") |
|
|
63
|
+
| start | string | Start address (e.g. "$0400") |
|
|
64
|
+
| end | string | End address (e.g. "$07FF") |
|
|
65
|
+
| default_use | string | What lives here by default |
|
|
66
|
+
| can_be_bank_switched | boolean | Whether $01 affects it |
|
|
67
|
+
|
|
68
|
+
Source: `hardware/c64-memory-map.md` (Phase 1).
|
|
69
|
+
|
|
70
|
+
### Chip
|
|
71
|
+
|
|
72
|
+
A C64 silicon component. Static nodes seeded in `ensureSchema()`.
|
|
73
|
+
|
|
74
|
+
| Property | Type | Description |
|
|
75
|
+
|----------|------|-------------|
|
|
76
|
+
| name | string | One of: "VIC-II", "SID", "CIA1", "CIA2", "6510" |
|
|
77
|
+
| variants | string | Known revisions / models |
|
|
78
|
+
| role | string | Functional role |
|
|
79
|
+
|
|
80
|
+
**Hardcoded seed (5 nodes):**
|
|
81
|
+
- VIC-II (variants: 6569 PAL / 6567 NTSC)
|
|
82
|
+
- SID (variants: 6581 / 8580)
|
|
83
|
+
- CIA1 (6526) — keyboard, joystick port 2, timer-A IRQ
|
|
84
|
+
- CIA2 (6526) — VIC bank select, RS-232, timer-B NMI
|
|
85
|
+
- 6510 — CPU with I/O port at $00/$01
|
|
86
|
+
|
|
87
|
+
### Region
|
|
88
|
+
|
|
89
|
+
A C64 video region. Static nodes seeded in `ensureSchema()`.
|
|
90
|
+
|
|
91
|
+
| Property | Type | Description |
|
|
92
|
+
|----------|------|-------------|
|
|
93
|
+
| name | string | "PAL" or "NTSC" |
|
|
94
|
+
| refresh_hz | integer | 50 (PAL) or 60 (NTSC) |
|
|
95
|
+
| lines_per_frame | integer | 312 (PAL) or 263 (NTSC) |
|
|
96
|
+
| cycles_per_line | integer | 63 (PAL) or 65 (NTSC) |
|
|
97
|
+
|
|
98
|
+
**Hardcoded seed (2 nodes):** PAL, NTSC.
|
|
99
|
+
|
|
100
|
+
### Technique
|
|
101
|
+
|
|
102
|
+
A demo/game programming technique (raster IRQ, sprite multiplexer, FLI,
|
|
103
|
+
soft scroll, plasma, hard-restart, illegal-opcode trick, etc.).
|
|
104
|
+
|
|
105
|
+
| Property | Type | Description |
|
|
106
|
+
|----------|------|-------------|
|
|
107
|
+
| name | string | Snake_case name (e.g. "stable_raster_irq") |
|
|
108
|
+
| category | string | One of: raster, sprite, scroll, bitmap, effect, music, cpu, banking, loader, render, input, logic, maths, text, io. Enforced at extract (schema 20): a technique doc outside the set is refused with a warning. `render` had been in use since the text-mode page without being listed; input, logic, maths, text and io were added for game and application foundations (issue #17). |
|
|
109
|
+
| complexity | string | "low", "medium", "high", "scene-tier" |
|
|
110
|
+
| cost_cycles_per_line | integer, optional | CPU cycles the technique takes on each raster line it is active on. From the page's `**Cost:**` line (schema 22). |
|
|
111
|
+
| cost_cycles_per_frame | integer, optional | CPU cycles the technique takes per frame, a PAL frame of 19,656 unless the page says otherwise. The worst frame, not an average. For a routine called on demand, one call per frame; a routine the page places outside the frame loop has no value here. |
|
|
112
|
+
| cost_lines_active | integer, optional | Raster lines per frame on which the technique runs code. |
|
|
113
|
+
| cost_bytes_code | integer, optional | Bytes of code in the built recipe's segments. When the page states only a PRG size, that size less the two-byte load address. |
|
|
114
|
+
| cost_bytes_data | integer, optional | Bytes of tables, buffers and other data in the built recipe's segments. |
|
|
115
|
+
| cost_zp_bytes | integer, optional | Zero-page bytes the technique claims. |
|
|
116
|
+
| cost_irq_slots | integer, optional | Raster or timer interrupts the technique needs per frame. |
|
|
117
|
+
| cost_sprites_per_line | integer, optional | The most hardware sprites displayed on one raster line of the technique's lines, 0-8 (schema 24). `c64_timing_budget` subtracts their DMA (3 + 2 per sprite, measured) from the line's user cycles. |
|
|
118
|
+
| cost_cycles_per_frame_typical | integer, optional | A measured typical frame beside a worst-frame cost_cycles_per_frame, never above it (schema 27). `c64_plan_budget` sums it for the low end of its range, which is therefore not a floor. |
|
|
119
|
+
| cost_recipe | string, optional | The recipe the cost figures were measured on or counted from, from `**Cost measured on:**` (schema 27). A property, not an edge; ingest warns when it names no Recipe. |
|
|
120
|
+
| cost_conditions | string, optional | The parenthetical after the recipe on that line: "screen blanked", "whole PRG", "one call" and the like (schema 27). `c64_plan_budget` reads "screen on" (the badline stalls that fell inside the figure are in it), "blank" (none are) and "whole PRG" (bytes not summed). |
|
|
121
|
+
| cost_includes | string[], optional | Techniques whose per-frame work is inside this technique's figure, from `**Cost includes:**` (schema 27). Authored, never inferred; ingest warns when a name is no Technique. A budget that lists both counts the included one once. |
|
|
122
|
+
| cost_basis | string, optional | How the cost figures were obtained, one of "measured-vice", "derived-listing", "arithmetic", "estimated"; present exactly when any cost_* property is. The word is the weakest that applies to any figure on the line. |
|
|
123
|
+
| raster_band | string, optional | The raster lines the technique holds the CPU on, from the page's `**Raster band:**` line (schema 24), in canonical form: sorted inclusive ranges such as "45-250" or "0-44,251-311", or "movable" when the program chooses the lines. Absent when the page states none; a re-ingest that drops the line clears it. `c64_check_compatibility` clears its line-sharing rules for two techniques whose line bands share no line. |
|
|
124
|
+
| claims_stated | string, optional | "stated" when the page's `**Claims:**` line names units, "none" when it says `none` (schema 25). Absent means unknown: the page states nothing, which is not the same as "none". The CLAIMS edges carry the units. |
|
|
125
|
+
| claims_basis | string, optional | How the claims were established: "measured-vice", "derived-listing" or "estimated"; present exactly when claims_stated is. |
|
|
126
|
+
|
|
127
|
+
A technique whose page has no `**Cost:**` line has none of the `cost_*`
|
|
128
|
+
properties, so `WHERE t.cost_cycles_per_frame IS NOT NULL` finds the
|
|
129
|
+
costed ones; a re-ingest that drops the line clears them. `c64_plan_budget`
|
|
130
|
+
and the briefing tools add a set up by the rules in `src/domain/budget.ts`
|
|
131
|
+
(schema 27): a member with no cycles figure is unknown, not zero; a
|
|
132
|
+
figure above one frame is not summed; included work and a band's
|
|
133
|
+
prerequisites are not counted twice; `over` rests only on work that runs
|
|
134
|
+
every frame. An earlier version summed every `cost_cycles_per_frame` and
|
|
135
|
+
called the result a floor.
|
|
136
|
+
|
|
137
|
+
Source: `techniques/*.md` (Phase 3+).
|
|
138
|
+
|
|
139
|
+
### Pitfall
|
|
140
|
+
|
|
141
|
+
A known gotcha or non-obvious behavior.
|
|
142
|
+
|
|
143
|
+
| Property | Type | Description |
|
|
144
|
+
|----------|------|-------------|
|
|
145
|
+
| title | string | Short description |
|
|
146
|
+
| severity | string | "critical", "high", "medium", "low" |
|
|
147
|
+
| region_specific | string | "pal", "ntsc", "both" |
|
|
148
|
+
|
|
149
|
+
Source: `pitfalls/*.md` (one Pitfall per H2; the file an earlier version of this line named, `c64-pitfalls.md`, does not exist).
|
|
150
|
+
|
|
151
|
+
### CrashPattern
|
|
152
|
+
|
|
153
|
+
A symptom-keyed failure record (no Guru codes on C64 — failures are
|
|
154
|
+
visual or behavioral).
|
|
155
|
+
|
|
156
|
+
| Property | Type | Description |
|
|
157
|
+
|----------|------|-------------|
|
|
158
|
+
| symptom | string | Visible/audible symptom (e.g. "black screen", "wrong music tempo") |
|
|
159
|
+
| likely_causes | string | JSON-encoded list of causes |
|
|
160
|
+
| diagnosis_steps | string | How to localize the issue |
|
|
161
|
+
|
|
162
|
+
Source: `c64-failure-patterns.md` (Phase 5).
|
|
163
|
+
|
|
164
|
+
### Tool
|
|
165
|
+
|
|
166
|
+
A development tool (assembler, compiler, emulator, art editor, music
|
|
167
|
+
editor, debugger, packer).
|
|
168
|
+
|
|
169
|
+
| Property | Type | Description |
|
|
170
|
+
|----------|------|-------------|
|
|
171
|
+
| name | string | Tool name (e.g. "oscar64", "kickassembler") |
|
|
172
|
+
| kind | string | The page's `tool_kind`: c-compiler, c-library, assembler, linker, emulator, debug-bridge, unit-test, reference-catalog, asset-converter |
|
|
173
|
+
| maintainer | string | Maintainer, or "" |
|
|
174
|
+
| license | string | Licence, or "" |
|
|
175
|
+
| home_url | string | Project home page |
|
|
176
|
+
| version_verified | string, optional | The version this repo's gates ran with, as the tool reports it (schema 24), e.g. "5.25" for KickAssembler. Absent when the page states none. `c64_recipe_lookup` returns it as `toolchain_version_verified`. |
|
|
177
|
+
|
|
178
|
+
An earlier version of this table listed a single `category` property with
|
|
179
|
+
art, music, debug, test and packer values; the extractor has always
|
|
180
|
+
written `kind` from `tool_kind`, with the values above.
|
|
181
|
+
|
|
182
|
+
Source: toolchain reference docs (Phase 2).
|
|
183
|
+
|
|
184
|
+
### Recipe
|
|
185
|
+
|
|
186
|
+
A buildable code recipe. The same demo concept can have multiple Recipe
|
|
187
|
+
nodes — one per toolchain.
|
|
188
|
+
|
|
189
|
+
| Property | Type | Description |
|
|
190
|
+
|----------|------|-------------|
|
|
191
|
+
| name | string | Recipe identifier |
|
|
192
|
+
| source_doc | string | Path of the markdown source |
|
|
193
|
+
| toolchain | string | One of: "oscar64", "kickassembler", "cc65" |
|
|
194
|
+
| output_format | string | One of: "prg", "crt", "d64", "bin" |
|
|
195
|
+
| region | string | "pal", "ntsc", or "both" |
|
|
196
|
+
|
|
197
|
+
Source: `recipes/<toolchain>/*.md` (Phase 2+).
|
|
198
|
+
|
|
199
|
+
### FileFormat
|
|
200
|
+
|
|
201
|
+
A C64 file format.
|
|
202
|
+
|
|
203
|
+
| Property | Type | Description |
|
|
204
|
+
|----------|------|-------------|
|
|
205
|
+
| name | string | "PRG", "D64", "T64", "CRT", "SID", "Koala", "IFFL", "CTM", "SPD", "SNG" |
|
|
206
|
+
| extension | string | Conventional file extension |
|
|
207
|
+
| description | string | One-line summary |
|
|
208
|
+
|
|
209
|
+
Source: `c64-file-formats.md` (Phase 2).
|
|
210
|
+
|
|
211
|
+
### Resource
|
|
212
|
+
|
|
213
|
+
A machine-level resource a technique needs while it is active: every CPU
|
|
214
|
+
cycle on its lines, a constant sprite set, a badline-free region, the KERNAL
|
|
215
|
+
banked out, the drive's serial bus. One node per word of the fixed
|
|
216
|
+
`**Demands:**` vocabulary in `CONVENTIONS-techniques.md`; created on first
|
|
217
|
+
reference.
|
|
218
|
+
|
|
219
|
+
| Property | Type | Description |
|
|
220
|
+
|----------|------|-------------|
|
|
221
|
+
| name | string | Vocabulary word (e.g. "cpu_every_line") |
|
|
222
|
+
| description | string | One-line meaning |
|
|
223
|
+
|
|
224
|
+
Source: `techniques/*.md` `**Demands:**` lines.
|
|
225
|
+
|
|
226
|
+
### HardwareUnit
|
|
227
|
+
|
|
228
|
+
A named piece of hardware that one technique can hold while another wants
|
|
229
|
+
it: a SID voice, a sprite, a CIA timer, the raster compare, an interrupt
|
|
230
|
+
vector, zero page (schema 25). Seeded by `ensureSchema()` from
|
|
231
|
+
`HARDWARE_UNITS` in `src/graph/extract.ts`, like Chip and Region, so a
|
|
232
|
+
`**Claims:**` line can only name a unit that exists. It answers a
|
|
233
|
+
different question from Resource: a Resource is a kind of machine time
|
|
234
|
+
("every CPU cycle on its lines"), a HardwareUnit is a register set.
|
|
235
|
+
|
|
236
|
+
| Property | Type | Description |
|
|
237
|
+
|----------|------|-------------|
|
|
238
|
+
| name | string | Seed name (e.g. "sid_voice_2", "vic_raster_irq") |
|
|
239
|
+
| kind | string | sid_voice, sid_shared, sprite, timer, tod, port, bus, irq_source, vector, io_page or zero_page |
|
|
240
|
+
| addresses | string | The registers or bytes (e.g. "$D407-$D40D") |
|
|
241
|
+
| chip | string | Owning chip, "" for the expansion I/O pages; also a BELONGS_TO edge |
|
|
242
|
+
|
|
243
|
+
The seed: `sid_voice_1`-`3` ($D400-$D406, $D407-$D40D, $D40E-$D414),
|
|
244
|
+
`sid_filter_volume` ($D415-$D418), `sid_voice_3_readback` ($D41B-$D41C),
|
|
245
|
+
`sid_pots` ($D419-$D41A), `sprite_0`-`7` (position, colour, enable and
|
|
246
|
+
other bits, pointer), `cia1_timer_a`/`b`, `cia2_timer_a`/`b`,
|
|
247
|
+
`cia1_tod`, `cia2_tod` (each with its bit of the interrupt control
|
|
248
|
+
register $DC0D/$DD0D: timer A bit 0, timer B bit 1, TOD alarm bit 2),
|
|
249
|
+
`cia1_port_a` ($DC00: keyboard column drive,
|
|
250
|
+
control port 2), `cia1_port_b` ($DC01: keyboard rows, control port 1),
|
|
251
|
+
`cia2_vic_bank` ($DD00 bits 0-1), `serial_bus` ($DD00 bits 3-7 and the
|
|
252
|
+
drive), `user_port` ($DD01), `vic_raster_irq` (the one raster compare:
|
|
253
|
+
$D012, $D011 bit 7, $D019/$D01A bit 0), `irq_vector_0314`,
|
|
254
|
+
`irq_vector_fffe`, `nmi_vector_0318`, `nmi_vector_fffa`,
|
|
255
|
+
`expansion_io1` ($DE00-$DEFF), `expansion_io2` ($DF00-$DFFF), and
|
|
256
|
+
`zero_page` ($02-$FF), one unit whose bytes ride the CLAIMS and
|
|
257
|
+
CLOBBERS_ZP edges.
|
|
258
|
+
|
|
259
|
+
### Archetype
|
|
260
|
+
|
|
261
|
+
A shape a game or demo takes: the vertical shooter, the single-screen
|
|
262
|
+
platformer, the text adventure. Traversed through, not read as a
|
|
263
|
+
property: `c64_game_briefing` walks Archetype to its techniques and
|
|
264
|
+
pitfalls, which is why it is a node and not a keyword table in the tool.
|
|
265
|
+
|
|
266
|
+
| Property | Type | Description |
|
|
267
|
+
|----------|------|-------------|
|
|
268
|
+
| name | string | snake_case canonical name, from the `**Archetype:**` line (e.g. "vertical_shmup") |
|
|
269
|
+
| title | string | The H2 text (e.g. "Vertical Shmup") |
|
|
270
|
+
| kind | string | "game" or "demo", from file frontmatter; defaults to game |
|
|
271
|
+
| source_doc | string | Path of the page that defines it |
|
|
272
|
+
| brief_words | string[] | From the `**Brief words:**` line, normalised (lower case, punctuation as one space); empty when the entry has none. `c64_game_briefing` with no `archetype` routes the brief to the game archetype whose words it contains most (schema 30) |
|
|
273
|
+
| starter | string? | Directory in `templates/` holding a playable starter for it, from the optional `**Starter:**` line (schema 31); absent when the page names none |
|
|
274
|
+
|
|
275
|
+
Source: `game-design/c64-game-archetypes.md` and, for kind `demo`,
|
|
276
|
+
`demo-design/intro-cracktro-patterns.md` (one Archetype per H2 that
|
|
277
|
+
carries an `**Archetype:**` line; `CONVENTIONS-archetypes.md`). Before
|
|
278
|
+
schema 21 the briefing tool held four archetype keywords and two forced
|
|
279
|
+
techniques in code and the page's fingerprints were read by nobody.
|
|
280
|
+
|
|
281
|
+
### GameDesign
|
|
282
|
+
|
|
283
|
+
A whole game: the techniques it runs in each phase, the archetype it is
|
|
284
|
+
an instance of, the recipe that builds it, and what its frame measured
|
|
285
|
+
when the built game was timed (schema 28). A node because
|
|
286
|
+
`c64_plan_budget` traverses it: a design name expands to its COMPOSES
|
|
287
|
+
edges, each in its phase, and the measured frame is set beside the
|
|
288
|
+
prediction.
|
|
289
|
+
|
|
290
|
+
| Property | Type | Description |
|
|
291
|
+
|----------|------|-------------|
|
|
292
|
+
| name | string | snake_case, from the `**Game design:**` line (e.g. "platformer_scaffold_oscar64") |
|
|
293
|
+
| title | string | The H2 text |
|
|
294
|
+
| region | string, optional | "PAL", "NTSC" or "both", from `**Region:**`; the budget's default region when the caller gives none |
|
|
295
|
+
| measured | string, optional | JSON list of `{phase, region, worst, typical?, basis, source}` from the `**Measured frame:**` lines: what the built game's frame took, in cycles, on the realising recipe. Absent when the game was not timed; a re-ingest that drops the lines clears it |
|
|
296
|
+
| source_doc | string | Path of the page |
|
|
297
|
+
|
|
298
|
+
Source: `game-design/designs/*.md`, one GameDesign per H2 that carries a
|
|
299
|
+
`**Game design:**` line (`CONVENTIONS-game-designs.md`).
|
|
300
|
+
|
|
301
|
+
### MachineVariant
|
|
302
|
+
|
|
303
|
+
A C64 model VICE x64sc 3.10 runs, named by its `-model` word (schema 29).
|
|
304
|
+
Seeded by `ensureSchema()` from `src/graph/machine-variants.ts`, like Chip
|
|
305
|
+
and Region. A variant, not a Region: the 6567R56A (`oldntsc`) and the
|
|
306
|
+
Drean 6572 (`drean`) differ from their region's timing, and a third Region
|
|
307
|
+
would split every region rule.
|
|
308
|
+
|
|
309
|
+
| Property | Type | Description |
|
|
310
|
+
|----------|------|-------------|
|
|
311
|
+
| name | string | `c64`, `c64c`, `c64old`, `ntsc`, `newntsc`, `oldntsc`, `drean` |
|
|
312
|
+
| vice_flag | string | `-model <name>` |
|
|
313
|
+
| vic, sid, cia | string | The chips VICE runs for the model, read from `x64sc -default -model <m> -dumpconfig` (VICIIModel, SidModel, CIA1Model), each VICIIModel number named by `-VICIImodel <chip>` |
|
|
314
|
+
| cycles_per_line, lines | integer | Lines measured on all seven by `recipes/oscar64/pal-ntsc-detect.md`; cycles per line from `hardware/pal-ntsc-reference.md`: measured in VICE there for oldntsc (64) and drean (65), from its sources for the rest (63 PAL, 65 NTSC; the 8565 and 8562 are stated timing-compatible, not measured here) |
|
|
315
|
+
| region | string | "PAL", "NTSC" or "PAL-N"; a property, not an edge |
|
|
316
|
+
| vice_default | boolean | True for `c64c`: `x64sc -default` with no `-model` runs an 8565, 8580 and 8521, the same configuration as `-model c64c` |
|
|
317
|
+
|
|
318
|
+
`jap`, `c64gs`, `pet64` and `ultimax` also exist in this VICE; they are
|
|
319
|
+
left out until a page needs them.
|
|
320
|
+
|
|
321
|
+
## Edge Types (26)
|
|
322
|
+
|
|
323
|
+
### BELONGS_TO
|
|
324
|
+
|
|
325
|
+
Direction: `Register → Chip`, `Technique → Chip`, `HardwareUnit → Chip`
|
|
326
|
+
|
|
327
|
+
Meaning: "this register lives on this chip."
|
|
328
|
+
|
|
329
|
+
Example: `($D011)-[:BELONGS_TO]->(VIC-II)`
|
|
330
|
+
|
|
331
|
+
### USES
|
|
332
|
+
|
|
333
|
+
Direction: `Technique → Register/KernalRoutine`, `Recipe → Register/KernalRoutine`
|
|
334
|
+
|
|
335
|
+
Meaning: "this technique or recipe touches this register or routine."
|
|
336
|
+
|
|
337
|
+
### IMPLEMENTS
|
|
338
|
+
|
|
339
|
+
Direction: `Recipe → Technique`
|
|
340
|
+
|
|
341
|
+
Meaning: "this recipe demonstrates this technique."
|
|
342
|
+
|
|
343
|
+
### BUILDS_ON
|
|
344
|
+
|
|
345
|
+
Direction: `Recipe → Recipe`
|
|
346
|
+
|
|
347
|
+
Meaning: "this recipe depends on a prior recipe — learn that first."
|
|
348
|
+
|
|
349
|
+
Listed since the ontology was drafted, but no extractor emits it and no
|
|
350
|
+
tool reads it (checked 2026-09-22: `BUILDS_ON` occurs nowhere in `src/`
|
|
351
|
+
or `test/`). The prerequisite relation the docs actually state is between
|
|
352
|
+
techniques, and that is `REQUIRES` below.
|
|
353
|
+
|
|
354
|
+
### REQUIRES
|
|
355
|
+
|
|
356
|
+
Direction: `Technique → Technique`
|
|
357
|
+
|
|
358
|
+
Meaning: "this technique presupposes that one is already set up or running
|
|
359
|
+
underneath it" — `text_zoom` REQUIRES `stable_raster_irq` (an IRQ on every
|
|
360
|
+
scanline of its zone), `infinite_scroll_h` REQUIRES `soft_scroll_h` and
|
|
361
|
+
`char_scroll_buffer_h`, `sid_filter_routing` REQUIRES `sid_voice_setup`.
|
|
362
|
+
Authored per technique with a `**Requires:**` line
|
|
363
|
+
(`CONVENTIONS-techniques.md`). It is not "see also" and not "variant of":
|
|
364
|
+
`double_irq` is a variant of `stable_raster_irq`, not a prerequisite, and
|
|
365
|
+
neither carries the edge. Both ends are MATCHed at ingest, never MERGEd,
|
|
366
|
+
so a misspelt name drops the edge with a warning instead of creating a
|
|
367
|
+
stub; an edge that would close a cycle is refused. Read by
|
|
368
|
+
`c64_technique_lookup` (`requires`, `required_by`), `c64_techniques_for`
|
|
369
|
+
(`requires` filter, following the chain) and `c64_check_compatibility`,
|
|
370
|
+
which takes each input's REQUIRES closure and runs the hard DEMANDS rules
|
|
371
|
+
between one technique's prerequisites and the other technique, reporting a
|
|
372
|
+
hit as `prerequisite_conflict` — never against a prerequisite the technique
|
|
373
|
+
declared itself, and never by folding a prerequisite's demands into its
|
|
374
|
+
dependant's.
|
|
375
|
+
|
|
376
|
+
### TRIGGERED_BY
|
|
377
|
+
|
|
378
|
+
Direction: `Pitfall → Register/KernalRoutine/Technique`
|
|
379
|
+
|
|
380
|
+
Meaning: "this pitfall is provoked when using this thing." For a Technique
|
|
381
|
+
target this is the technique in whose code the pitfall arises; the
|
|
382
|
+
technique that cures it is `MITIGATED_BY`, which the single vocabulary used
|
|
383
|
+
to carry as well (`sprite_dma_overflow` was TRIGGERED_BY
|
|
384
|
+
`sprite_multiplex_8` while its Fix said the multiplexer is the fix).
|
|
385
|
+
|
|
386
|
+
### MITIGATED_BY
|
|
387
|
+
|
|
388
|
+
Direction: `Pitfall → Technique`
|
|
389
|
+
|
|
390
|
+
Meaning: "applying this technique is the Fix section's remedy for this
|
|
391
|
+
pitfall" — `raster_irq_first_line_jitter` MITIGATED_BY `double_irq`, the
|
|
392
|
+
three region-timing pitfalls MITIGATED_BY `pal_ntsc_detection`. Authored
|
|
393
|
+
with a `**Mitigated by techniques:**` line (`CONVENTIONS-pitfalls.md`);
|
|
394
|
+
Technique targets only, both ends MATCHed, misses warned about and counted
|
|
395
|
+
beside triggered_by. A technique may be on both lines only when the pitfall
|
|
396
|
+
arises in a naive version of it and a correct version cures it, and the
|
|
397
|
+
Mechanism says so. Where the remedy is not a Technique node (the SID hard
|
|
398
|
+
restart, a `$0318` handler) there is no edge and the Fix stays prose. Read
|
|
399
|
+
by `c64_pitfalls_for` (a Technique topic matches either relation;
|
|
400
|
+
`mitigated_by[]` is reported apart from `triggered_by[]`) and
|
|
401
|
+
`c64_technique_lookup` (`mitigates`).
|
|
402
|
+
|
|
403
|
+
### CAUSED_BY
|
|
404
|
+
|
|
405
|
+
Direction: `CrashPattern → Register/KernalRoutine/Technique`
|
|
406
|
+
|
|
407
|
+
Meaning: "this failure pattern is caused by misuse of this thing."
|
|
408
|
+
|
|
409
|
+
### REQUIRES_TOOL
|
|
410
|
+
|
|
411
|
+
Direction: `Recipe → Tool`
|
|
412
|
+
|
|
413
|
+
Meaning: "this recipe needs this tool to build."
|
|
414
|
+
|
|
415
|
+
Source: every recipe's frontmatter `toolchain` names a Tool node
|
|
416
|
+
(`oscar64`, `kickassembler`, `cc65`) and the ingester links the recipe to
|
|
417
|
+
it. Until data 713 that link was written as `USES`, so this edge type was
|
|
418
|
+
defined and populated by nothing while the same fact sat under the wrong
|
|
419
|
+
label; the ingester now writes `REQUIRES_TOOL` and a query for
|
|
420
|
+
`(:Recipe)-[:REQUIRES_TOOL]->(:Tool)` returns every recipe.
|
|
421
|
+
|
|
422
|
+
### REQUIRES_REGION
|
|
423
|
+
|
|
424
|
+
Direction: `Technique → Region`
|
|
425
|
+
|
|
426
|
+
Meaning: "this technique requires PAL or NTSC specifically."
|
|
427
|
+
|
|
428
|
+
### PRODUCES
|
|
429
|
+
|
|
430
|
+
Direction: `Tool → FileFormat`
|
|
431
|
+
|
|
432
|
+
Meaning: "this tool produces this file format."
|
|
433
|
+
|
|
434
|
+
### CONSUMES
|
|
435
|
+
|
|
436
|
+
Direction: `Tool → FileFormat`
|
|
437
|
+
|
|
438
|
+
Meaning: "this tool reads/converts this file format."
|
|
439
|
+
|
|
440
|
+
### TARGETS
|
|
441
|
+
|
|
442
|
+
Direction: `Tool → Chip`
|
|
443
|
+
|
|
444
|
+
Meaning: "this tool targets this chip (e.g. GoatTracker targets SID)."
|
|
445
|
+
|
|
446
|
+
### PAIRS_WITH
|
|
447
|
+
|
|
448
|
+
Direction: `KernalRoutine → KernalRoutine`
|
|
449
|
+
|
|
450
|
+
Meaning: "if you call A you also need B" (e.g. SETLFS + SETNAM + LOAD).
|
|
451
|
+
|
|
452
|
+
### DEMANDS
|
|
453
|
+
|
|
454
|
+
Direction: `Technique → Resource`
|
|
455
|
+
|
|
456
|
+
Meaning: "while this technique is active it needs this machine-level
|
|
457
|
+
resource" — every CPU cycle on its lines, a constant sprite set, a
|
|
458
|
+
badline-free region, the KERNAL banked out, and so on. Authored per
|
|
459
|
+
technique with a `**Demands:**` line from the fixed vocabulary in
|
|
460
|
+
`CONVENTIONS-techniques.md`. `c64_check_compatibility` derives its hard
|
|
461
|
+
conflicts from these: two `cpu_every_line` techniques cannot share a raster
|
|
462
|
+
line; `cpu_every_line` against `midframe_raster_irqs` or
|
|
463
|
+
`continuous_interrupts` cannot either; `constant_sprite_set` against
|
|
464
|
+
`changes_sprite_set`; `kernal_rom_out` against any technique that USES a
|
|
465
|
+
KernalRoutine; `serial_bus_exclusive` (schema 24, a resident drive-code
|
|
466
|
+
loader) against any technique that USES a KERNAL serial or file routine
|
|
467
|
+
(`serial_bus_busy`). The rules about sharing lines are cleared, and the pair is
|
|
468
|
+
listed as band-separated, when both techniques carry a `raster_band` of
|
|
469
|
+
line ranges and the ranges share no line. Before schema 24 there was no
|
|
470
|
+
band, and any two `cpu_every_line` techniques were reported as a conflict.
|
|
471
|
+
|
|
472
|
+
### CLAIMS
|
|
473
|
+
|
|
474
|
+
Direction: `Technique → HardwareUnit`
|
|
475
|
+
|
|
476
|
+
Meaning: "while this technique runs it holds this unit, in this mode"
|
|
477
|
+
(schema 25). Authored with the `**Claims:**` and `**Claims basis:**`
|
|
478
|
+
lines (`CONVENTIONS-techniques.md`). Both ends MATCHed, never MERGEd; a
|
|
479
|
+
miss is warned about and counted in the ingest summary as `claims …
|
|
480
|
+
dropped`. Re-ingesting a technique drops its old CLAIMS edges first, so a
|
|
481
|
+
claim the page stopped making does not outlive it.
|
|
482
|
+
|
|
483
|
+
| Property | Type | Description |
|
|
484
|
+
|----------|------|-------------|
|
|
485
|
+
| mode | string | owns (writes or holds it every frame; nobody else may), shares (writes it under the owner's protocol: after the owner in the frame, or in the owner's interrupt chain), reads (reads only), init (uses it once before the frame loop) |
|
|
486
|
+
| ranges | string or null | zero_page only: canonical bytes, e.g. "02-0D,24-2F" |
|
|
487
|
+
| relocatable | boolean | zero_page only: the bytes move with a build option |
|
|
488
|
+
| basis | string | measured-vice, derived-listing or estimated |
|
|
489
|
+
|
|
490
|
+
`c64_check_compatibility` reads them: two `owns` of one unit is
|
|
491
|
+
`unit_contention` (hard); two `owns` of zero page that share bytes is
|
|
492
|
+
`zero_page_overlap` (hard, soft when either side is relocatable);
|
|
493
|
+
`owns` against `shares`, or two `shares`, is `unit_shared` (soft);
|
|
494
|
+
`owns` against `reads` is `unit_read_while_driven` (soft); `init`
|
|
495
|
+
against `owns` or `shares` is `init_order` (info). Between a technique
|
|
496
|
+
and its own REQUIRES prerequisite the two ownership rules do not run, and
|
|
497
|
+
`unit_shared` runs only when the sharer is the one that requires the
|
|
498
|
+
owner (`sfx_engine_beside_music` requires the player it writes after;
|
|
499
|
+
`fli_image` runs the stable raster IRQ it requires inside its own
|
|
500
|
+
handler). Through the REQUIRES closure, a prerequisite's claims on units
|
|
501
|
+
its input technique holds are the input's, and the input's own pair
|
|
502
|
+
reports them; the hit that remains carries the rule in `underlying_kind`.
|
|
503
|
+
A technique with no Claims line is reported as unknown, never as
|
|
504
|
+
claiming nothing.
|
|
505
|
+
`c64_techniques_for` filters on a claimed unit.
|
|
506
|
+
|
|
507
|
+
### CLOBBERS_ZP
|
|
508
|
+
|
|
509
|
+
Direction: `KernalRoutine → HardwareUnit` (always `zero_page`)
|
|
510
|
+
|
|
511
|
+
Meaning: "calling this routine may write, or did write, these zero-page
|
|
512
|
+
bytes" (schema 26). One edge per `**Clobbers zero page:**` line under the
|
|
513
|
+
routine's H3 in `hardware/kernal-routines-reference.md`
|
|
514
|
+
(`CONVENTIONS-hardware-reference.md`). Both ends MATCHed; a miss is
|
|
515
|
+
counted in the ingest summary as `clobbers_zp … dropped`. Re-ingesting
|
|
516
|
+
the routine drops its old CLOBBERS_ZP edges first.
|
|
517
|
+
|
|
518
|
+
| Property | Type | Description |
|
|
519
|
+
|----------|------|-------------|
|
|
520
|
+
| ranges | string | canonical bytes $00-$FF, e.g. "90-9A,B7"; "" for none. $00-$01 (the 6510 port) can appear; no Claims line can name them |
|
|
521
|
+
| bound | string | may: a static walk of the ROM, an upper bound, written and checked by `scripts/kernal-zp-walk.ts`. must: what one call wrote in a VICE store trace (`scripts/kernal-zp-trace.ts`), a lower bound for that call |
|
|
522
|
+
| basis | string | where the set came from: "ROM walk from $FFD2, power-on vectors", or "VICE x64sc store trace, <the call>". A routine has one may edge and a must edge per traced call |
|
|
523
|
+
|
|
524
|
+
`c64_check_compatibility` reads the may edges: a technique that USES a
|
|
525
|
+
KernalRoutine beside a technique whose CLAIMS on `zero_page` share bytes
|
|
526
|
+
with that routine's may set is `kernal_clobbers_zp` (soft; "may", since
|
|
527
|
+
a given call need not reach every store the walk counts). Unlike the
|
|
528
|
+
unit rules it also runs inside one input's own chain, the technique
|
|
529
|
+
against itself and against its own prerequisites (`a` = `b` = the
|
|
530
|
+
input), since a KERNAL call clobbers the bytes whoever declared them.
|
|
531
|
+
`npm test`
|
|
532
|
+
fails when the page and the ROM walk disagree, or a must byte lies
|
|
533
|
+
outside the may set.
|
|
534
|
+
|
|
535
|
+
### IN_REGION
|
|
536
|
+
|
|
537
|
+
Direction: `Register → MemoryRegion`, `KernalRoutine → MemoryRegion`
|
|
538
|
+
|
|
539
|
+
Meaning: "this address lies inside this memory-map region." Derived from
|
|
540
|
+
the numeric addresses after ingest; before this edge existed the 220
|
|
541
|
+
MemoryRegion nodes were all orphans.
|
|
542
|
+
|
|
543
|
+
### OCCUPIES
|
|
544
|
+
|
|
545
|
+
Direction: `Recipe → MemoryRegion`
|
|
546
|
+
|
|
547
|
+
Meaning: "this recipe loads code or data into this region." Derived from
|
|
548
|
+
the listing's own load addresses (`* = $0900`, `#pragma region(...)`,
|
|
549
|
+
`.org`), not from prose.
|
|
550
|
+
|
|
551
|
+
### FEATURES
|
|
552
|
+
|
|
553
|
+
Direction: `Archetype → Technique`
|
|
554
|
+
|
|
555
|
+
Meaning: "a game of this shape is built on this technique" —
|
|
556
|
+
`vertical_shmup` FEATURES `sprite_multiplex_game`, `text_adventure` FEATURES
|
|
557
|
+
`ram_under_kernal`. Authored with the `**Technique fingerprint:**` line
|
|
558
|
+
(`CONVENTIONS-archetypes.md`); both ends MATCHed, a name that matches no
|
|
559
|
+
Technique is warned about and counted in the ingest summary as
|
|
560
|
+
`archetype_features … dropped`. Read by `c64_game_briefing`, which forces
|
|
561
|
+
every target into the proposal for that archetype, exempt from the
|
|
562
|
+
per-category cap.
|
|
563
|
+
|
|
564
|
+
### RISKS
|
|
565
|
+
|
|
566
|
+
Direction: `Archetype → Pitfall`
|
|
567
|
+
|
|
568
|
+
Meaning: "a game of this shape commonly meets this pitfall" —
|
|
569
|
+
`racing` RISKS `raster_line_count_difference`, `top_down_adventure` RISKS
|
|
570
|
+
`vic_bank_visibility_collision`. Authored with the `**Common pitfalls:**`
|
|
571
|
+
line; same MATCH-both discipline, misses counted as `archetype_risks …
|
|
572
|
+
dropped`. Read by `c64_game_briefing`, which adds each target to the
|
|
573
|
+
plan's pitfalls when no proposed technique already surfaced it. It is a
|
|
574
|
+
statement about the genre, not a trigger: TRIGGERED_BY still says which
|
|
575
|
+
technique's code the pitfall arises in.
|
|
576
|
+
|
|
577
|
+
### SCAFFOLDS
|
|
578
|
+
|
|
579
|
+
Direction: `Recipe → Archetype`
|
|
580
|
+
|
|
581
|
+
Meaning: "this recipe is a complete starting point for a game of this
|
|
582
|
+
shape; copy it and change it, do not start from a blank file" —
|
|
583
|
+
`oscar64-simple-shmup` SCAFFOLDS `vertical_shmup`. Authored with the
|
|
584
|
+
`scaffolds:` key in the recipe's frontmatter (`CONVENTIONS-recipes.md`),
|
|
585
|
+
an array of Archetype names. Both ends MATCHed, never MERGEd: a name that
|
|
586
|
+
matches no Archetype is warned about and counted in the ingest summary as
|
|
587
|
+
`scaffolds … dropped`. Read by `c64_game_briefing`, whose first build
|
|
588
|
+
step for a resolved archetype lists the recipes that SCAFFOLD it and
|
|
589
|
+
names their pages (schema 23; before it the tool matched the string
|
|
590
|
+
"shmup" against the archetype name and offered one recipe by name).
|
|
591
|
+
|
|
592
|
+
### VERIFIED_ON
|
|
593
|
+
|
|
594
|
+
Direction: `Recipe → MachineVariant`, properties `model` (the runs.json
|
|
595
|
+
word), `cycles`, `shot`, `flags`, `pinned`
|
|
596
|
+
|
|
597
|
+
Meaning: "`verify:recipes` runs this recipe on this variant and compares
|
|
598
|
+
its exit screenshot with the committed `shot` pixel for pixel." Built by
|
|
599
|
+
the ingest from `docs/recipes/runs.json`, the only file besides markdown it
|
|
600
|
+
reads, after pass 2; the old edges are deleted first, so the file owns
|
|
601
|
+
them. A recipe with no runs.json entry is run by `verify:recipes` on PAL at
|
|
602
|
+
8,000,000 cycles, and gets that edge with `pinned` false. An edge is made
|
|
603
|
+
only when its screenshot is committed. runs.json `pal` maps to `c64c` (the
|
|
604
|
+
machine `x64sc -default` runs), `ntsc`, `oldntsc` and `drean` to the
|
|
605
|
+
variants of those names. Read by `c64_recipe_lookup` (`verified_on[]`) and
|
|
606
|
+
`c64_recipes_for` (`verified_on` filter) (schema 29).
|
|
607
|
+
|
|
608
|
+
### COMPOSES
|
|
609
|
+
|
|
610
|
+
Direction: `GameDesign → Technique`, property `phase` ("play",
|
|
611
|
+
"transition" or "init")
|
|
612
|
+
|
|
613
|
+
Meaning: "this game runs this technique in this phase." Authored with
|
|
614
|
+
the `**Composes:**` line (`CONVENTIONS-game-designs.md`); `name (init)`
|
|
615
|
+
or `name (transition)` sets the phase, play when none is given. One edge
|
|
616
|
+
per phase, so a technique used at start-up and again at game over has
|
|
617
|
+
two. Both ends MATCHed; a miss is warned about and counted as `composes …
|
|
618
|
+
dropped`. Read by `c64_plan_budget`, which budgets each phase alone
|
|
619
|
+
(schema 28).
|
|
620
|
+
|
|
621
|
+
### INSTANCE_OF
|
|
622
|
+
|
|
623
|
+
Direction: `GameDesign → Archetype`
|
|
624
|
+
|
|
625
|
+
Meaning: "this game is one of this shape." From `**Instance of:**`; MATCH
|
|
626
|
+
both, misses counted as `instance_of … dropped`. Read by
|
|
627
|
+
`c64_game_briefing`, which lists the designs of the archetype it
|
|
628
|
+
resolved (schema 28).
|
|
629
|
+
|
|
630
|
+
### REALISED_BY
|
|
631
|
+
|
|
632
|
+
Direction: `GameDesign → Recipe`
|
|
633
|
+
|
|
634
|
+
Meaning: "this recipe builds the design; its measured frame came from
|
|
635
|
+
this listing." From `**Realised by:**`; MATCH both, misses counted as
|
|
636
|
+
`realised_by … dropped` (schema 28).
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
## Schema state
|
|
641
|
+
|
|
642
|
+
`ensureSchema()` creates a range index and a unique constraint on the
|
|
643
|
+
primary key of every node label (16) and seeds:
|
|
644
|
+
- 5 `Chip` nodes (VIC-II, SID, CIA1, CIA2, 6510)
|
|
645
|
+
- 2 `Region` nodes (PAL, NTSC)
|
|
646
|
+
- the `HardwareUnit` nodes listed under HardwareUnit, each BELONGS_TO its chip
|
|
647
|
+
- 7 `MachineVariant` nodes (schema 29)
|
|
648
|
+
|
|
649
|
+
Everything else is produced by `npm run ingest` from `docs/`. Of the
|
|
650
|
+
edge types defined here, one is populated by nothing: `BUILDS_ON`, which
|
|
651
|
+
no page asserts and no tool reads (its fate is issue #17). `REQUIRES_TOOL`
|
|
652
|
+
was in that state until data 713, when the recipe-to-tool link the
|
|
653
|
+
ingester had been writing as `USES` was given its ontology name.
|
|
654
|
+
`npx c64-kb health` prints the live node and edge figures; they are not
|
|
655
|
+
repeated here because they change with every docs commit.
|