c64-kb 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +2082 -0
- package/LICENSE +29 -0
- package/README.md +559 -0
- package/VERSION +25 -0
- package/dist/cli/setup.js +66 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli-memorize-audit.js +97 -0
- package/dist/cli-memorize-audit.js.map +1 -0
- package/dist/cli.js +335 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.js +83 -0
- package/dist/config.js.map +1 -0
- package/dist/context.js +53 -0
- package/dist/context.js.map +1 -0
- package/dist/domain/budget-notes.js +104 -0
- package/dist/domain/budget-notes.js.map +1 -0
- package/dist/domain/budget.js +417 -0
- package/dist/domain/budget.js.map +1 -0
- package/dist/domain/game-design.js +77 -0
- package/dist/domain/game-design.js.map +1 -0
- package/dist/domain/timing.js +39 -0
- package/dist/domain/timing.js.map +1 -0
- package/dist/graph/apply.js +132 -0
- package/dist/graph/apply.js.map +1 -0
- package/dist/graph/claims.js +231 -0
- package/dist/graph/claims.js.map +1 -0
- package/dist/graph/extract/archetype.js +118 -0
- package/dist/graph/extract/archetype.js.map +1 -0
- package/dist/graph/extract/common.js +69 -0
- package/dist/graph/extract/common.js.map +1 -0
- package/dist/graph/extract/failure.js +37 -0
- package/dist/graph/extract/failure.js.map +1 -0
- package/dist/graph/extract/game-design.js +189 -0
- package/dist/graph/extract/game-design.js.map +1 -0
- package/dist/graph/extract/hardware.js +124 -0
- package/dist/graph/extract/hardware.js.map +1 -0
- package/dist/graph/extract/pitfall.js +62 -0
- package/dist/graph/extract/pitfall.js.map +1 -0
- package/dist/graph/extract/raster-band.js +56 -0
- package/dist/graph/extract/raster-band.js.map +1 -0
- package/dist/graph/extract/recipe.js +71 -0
- package/dist/graph/extract/recipe.js.map +1 -0
- package/dist/graph/extract/technique-entities.js +180 -0
- package/dist/graph/extract/technique-entities.js.map +1 -0
- package/dist/graph/extract/technique.js +179 -0
- package/dist/graph/extract/technique.js.map +1 -0
- package/dist/graph/extract/toolchain.js +67 -0
- package/dist/graph/extract/toolchain.js.map +1 -0
- package/dist/graph/extract/types.js +3 -0
- package/dist/graph/extract/types.js.map +1 -0
- package/dist/graph/extract/vocabulary.js +65 -0
- package/dist/graph/extract/vocabulary.js.map +1 -0
- package/dist/graph/extract.js +43 -0
- package/dist/graph/extract.js.map +1 -0
- package/dist/graph/kernal-clobbers.js +64 -0
- package/dist/graph/kernal-clobbers.js.map +1 -0
- package/dist/graph/machine-variants.js +208 -0
- package/dist/graph/machine-variants.js.map +1 -0
- package/dist/ingest/files.js +99 -0
- package/dist/ingest/files.js.map +1 -0
- package/dist/ingest/passes.js +104 -0
- package/dist/ingest/passes.js.map +1 -0
- package/dist/ingest/points.js +50 -0
- package/dist/ingest/points.js.map +1 -0
- package/dist/ingest/report.js +140 -0
- package/dist/ingest/report.js.map +1 -0
- package/dist/ingest/tally.js +81 -0
- package/dist/ingest/tally.js.map +1 -0
- package/dist/ingest/verified-on.js +43 -0
- package/dist/ingest/verified-on.js.map +1 -0
- package/dist/ingest.js +135 -0
- package/dist/ingest.js.map +1 -0
- package/dist/schemas/cost-basis.js +5 -0
- package/dist/schemas/cost-basis.js.map +1 -0
- package/dist/schemas/machine-variant.js +25 -0
- package/dist/schemas/machine-variant.js.map +1 -0
- package/dist/schemas/plan-budget.js +121 -0
- package/dist/schemas/plan-budget.js.map +1 -0
- package/dist/schemas/tool-outputs.js +526 -0
- package/dist/schemas/tool-outputs.js.map +1 -0
- package/dist/server/define-tool.js +52 -0
- package/dist/server/define-tool.js.map +1 -0
- package/dist/server/defined-only.js +9 -0
- package/dist/server/defined-only.js.map +1 -0
- package/dist/server/tools-briefings.js +70 -0
- package/dist/server/tools-briefings.js.map +1 -0
- package/dist/server/tools-lookup.js +180 -0
- package/dist/server/tools-lookup.js.map +1 -0
- package/dist/server/tools-maintenance.js +116 -0
- package/dist/server/tools-maintenance.js.map +1 -0
- package/dist/server/tools-pitfalls.js +89 -0
- package/dist/server/tools-pitfalls.js.map +1 -0
- package/dist/server/tools-recipes.js +296 -0
- package/dist/server/tools-recipes.js.map +1 -0
- package/dist/server/tools-runtime.js +48 -0
- package/dist/server/tools-runtime.js.map +1 -0
- package/dist/server/tools.js +43 -0
- package/dist/server/tools.js.map +1 -0
- package/dist/server.js +95 -0
- package/dist/server.js.map +1 -0
- package/dist/services/analytics/schema.js +78 -0
- package/dist/services/analytics/schema.js.map +1 -0
- package/dist/services/analytics/statements.js +99 -0
- package/dist/services/analytics/statements.js.map +1 -0
- package/dist/services/analytics.js +195 -0
- package/dist/services/analytics.js.map +1 -0
- package/dist/services/bm25.js +158 -0
- package/dist/services/bm25.js.map +1 -0
- package/dist/services/chunker.js +81 -0
- package/dist/services/chunker.js.map +1 -0
- package/dist/services/embeddings.js +58 -0
- package/dist/services/embeddings.js.map +1 -0
- package/dist/services/falkor/base.js +85 -0
- package/dist/services/falkor/base.js.map +1 -0
- package/dist/services/falkor/links.js +361 -0
- package/dist/services/falkor/links.js.map +1 -0
- package/dist/services/falkor/nodes.js +183 -0
- package/dist/services/falkor/nodes.js.map +1 -0
- package/dist/services/falkor/params.js +45 -0
- package/dist/services/falkor/params.js.map +1 -0
- package/dist/services/falkor/schema.js +77 -0
- package/dist/services/falkor/schema.js.map +1 -0
- package/dist/services/falkor.js +100 -0
- package/dist/services/falkor.js.map +1 -0
- package/dist/services/qdrant.js +238 -0
- package/dist/services/qdrant.js.map +1 -0
- package/dist/services/versions.js +73 -0
- package/dist/services/versions.js.map +1 -0
- package/dist/services/vice-bin.js +51 -0
- package/dist/services/vice-bin.js.map +1 -0
- package/dist/tools/briefings/archetype.js +174 -0
- package/dist/tools/briefings/archetype.js.map +1 -0
- package/dist/tools/briefings/budget.js +177 -0
- package/dist/tools/briefings/budget.js.map +1 -0
- package/dist/tools/briefings/build-order.js +135 -0
- package/dist/tools/briefings/build-order.js.map +1 -0
- package/dist/tools/briefings/build.js +185 -0
- package/dist/tools/briefings/build.js.map +1 -0
- package/dist/tools/briefings/discovery.js +290 -0
- package/dist/tools/briefings/discovery.js.map +1 -0
- package/dist/tools/briefings/plan-pitfalls.js +69 -0
- package/dist/tools/briefings/plan-pitfalls.js.map +1 -0
- package/dist/tools/briefings/render.js +151 -0
- package/dist/tools/briefings/render.js.map +1 -0
- package/dist/tools/briefings/rows.js +41 -0
- package/dist/tools/briefings/rows.js.map +1 -0
- package/dist/tools/briefings/toolchain.js +63 -0
- package/dist/tools/briefings/toolchain.js.map +1 -0
- package/dist/tools/briefings/why-proposed.js +69 -0
- package/dist/tools/briefings/why-proposed.js.map +1 -0
- package/dist/tools/briefings.js +44 -0
- package/dist/tools/briefings.js.map +1 -0
- package/dist/tools/feedback.js +97 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/hydrate.js +75 -0
- package/dist/tools/hydrate.js.map +1 -0
- package/dist/tools/intelligence.js +67 -0
- package/dist/tools/intelligence.js.map +1 -0
- package/dist/tools/lint/asm-decimal.js +86 -0
- package/dist/tools/lint/asm-decimal.js.map +1 -0
- package/dist/tools/lint/asm-rules.js +221 -0
- package/dist/tools/lint/asm-rules.js.map +1 -0
- package/dist/tools/lint/asm-shared.js +3 -0
- package/dist/tools/lint/asm-shared.js.map +1 -0
- package/dist/tools/lint/c-rules.js +215 -0
- package/dist/tools/lint/c-rules.js.map +1 -0
- package/dist/tools/lint/text.js +122 -0
- package/dist/tools/lint/text.js.map +1 -0
- package/dist/tools/lint/types.js +40 -0
- package/dist/tools/lint/types.js.map +1 -0
- package/dist/tools/lint.js +76 -0
- package/dist/tools/lint.js.map +1 -0
- package/dist/tools/memorization-mcp.js +111 -0
- package/dist/tools/memorization-mcp.js.map +1 -0
- package/dist/tools/pitfalls/bm25.js +53 -0
- package/dist/tools/pitfalls/bm25.js.map +1 -0
- package/dist/tools/pitfalls/format.js +58 -0
- package/dist/tools/pitfalls/format.js.map +1 -0
- package/dist/tools/pitfalls/graph.js +124 -0
- package/dist/tools/pitfalls/graph.js.map +1 -0
- package/dist/tools/pitfalls.js +134 -0
- package/dist/tools/pitfalls.js.map +1 -0
- package/dist/tools/prompts.js +81 -0
- package/dist/tools/prompts.js.map +1 -0
- package/dist/tools/query/compatibility/closure.js +62 -0
- package/dist/tools/query/compatibility/closure.js.map +1 -0
- package/dist/tools/query/compatibility/facts.js +28 -0
- package/dist/tools/query/compatibility/facts.js.map +1 -0
- package/dist/tools/query/compatibility/fetch.js +164 -0
- package/dist/tools/query/compatibility/fetch.js.map +1 -0
- package/dist/tools/query/compatibility/hard-rules.js +159 -0
- package/dist/tools/query/compatibility/hard-rules.js.map +1 -0
- package/dist/tools/query/compatibility/index.js +27 -0
- package/dist/tools/query/compatibility/index.js.map +1 -0
- package/dist/tools/query/compatibility/kernal-zp-rule.js +90 -0
- package/dist/tools/query/compatibility/kernal-zp-rule.js.map +1 -0
- package/dist/tools/query/compatibility/render.js +106 -0
- package/dist/tools/query/compatibility/render.js.map +1 -0
- package/dist/tools/query/compatibility/rules.js +337 -0
- package/dist/tools/query/compatibility/rules.js.map +1 -0
- package/dist/tools/query/compatibility/unit-rules.js +253 -0
- package/dist/tools/query/compatibility/unit-rules.js.map +1 -0
- package/dist/tools/query/game-design.js +83 -0
- package/dist/tools/query/game-design.js.map +1 -0
- package/dist/tools/query/lookups.js +220 -0
- package/dist/tools/query/lookups.js.map +1 -0
- package/dist/tools/query/plan-budget.js +266 -0
- package/dist/tools/query/plan-budget.js.map +1 -0
- package/dist/tools/query/recipes.js +214 -0
- package/dist/tools/query/recipes.js.map +1 -0
- package/dist/tools/query/retrieval.js +128 -0
- package/dist/tools/query/retrieval.js.map +1 -0
- package/dist/tools/query/shared.js +121 -0
- package/dist/tools/query/shared.js.map +1 -0
- package/dist/tools/query/techniques.js +331 -0
- package/dist/tools/query/techniques.js.map +1 -0
- package/dist/tools/query/timing.js +106 -0
- package/dist/tools/query/timing.js.map +1 -0
- package/dist/tools/query/types.js +11 -0
- package/dist/tools/query/types.js.map +1 -0
- package/dist/tools/query.js +21 -0
- package/dist/tools/query.js.map +1 -0
- package/dist/tools/resources.js +186 -0
- package/dist/tools/resources.js.map +1 -0
- package/dist/tools/run-game.js +249 -0
- package/dist/tools/run-game.js.map +1 -0
- package/dist/tools/selfimprovement.js +367 -0
- package/dist/tools/selfimprovement.js.map +1 -0
- package/docker-compose.yml +35 -0
- package/docs/ARCHITECTURE.md +164 -0
- package/docs/CONVENTIONS-archetypes.md +158 -0
- package/docs/CONVENTIONS-failures.md +46 -0
- package/docs/CONVENTIONS-game-designs.md +75 -0
- package/docs/CONVENTIONS-hardware-reference.md +184 -0
- package/docs/CONVENTIONS-pitfalls.md +91 -0
- package/docs/CONVENTIONS-recipes.md +106 -0
- package/docs/CONVENTIONS-techniques.md +309 -0
- package/docs/CONVENTIONS-toolchain-reference.md +89 -0
- package/docs/ONTOLOGY.md +655 -0
- package/docs/art/art-production-reference.md +157 -0
- package/docs/art/asset-pipelines.md +586 -0
- package/docs/c64-failure-patterns.md +693 -0
- package/docs/demo-design/demo-composition.md +349 -0
- package/docs/demo-design/demo-design-philosophy.md +320 -0
- package/docs/demo-design/intro-cracktro-patterns.md +435 -0
- package/docs/figures/ctm-spd-embed-probe.png +0 -0
- package/docs/figures/dot-flag-mid-5000000.png +0 -0
- package/docs/figures/dot-flag-no-erase-12000000.png +0 -0
- package/docs/figures/edges.json +1 -0
- package/docs/figures/fig6-architecture.png +0 -0
- package/docs/figures/fig7-ontology.png +0 -0
- package/docs/figures/screen-dissolve-mid-frame25.png +0 -0
- package/docs/figures/screen-dissolve-wipe-frame25.png +0 -0
- package/docs/figures/spindle-two-parts-part1.png +0 -0
- package/docs/figures/spindle-two-parts-part2.png +0 -0
- package/docs/figures/starters/action-puzzle.png +0 -0
- package/docs/figures/starters/adventure.png +0 -0
- package/docs/figures/starters/beat-em-up.png +0 -0
- package/docs/figures/starters/demo.png +0 -0
- package/docs/figures/starters/platformer.png +0 -0
- package/docs/figures/starters/shmup-vertical.png +0 -0
- package/docs/figures/tape-kernal-master-ntsc.png +0 -0
- package/docs/figures/tape-kernal-master-pal.png +0 -0
- package/docs/figures/tape-turbo-loader-ntsc.png +0 -0
- package/docs/figures/tape-turbo-loader-pal.png +0 -0
- package/docs/figures/tape-turbo-master-ntsc.png +0 -0
- package/docs/figures/tape-turbo-master-pal.png +0 -0
- package/docs/figures/tech-tech-pad2-12000000.png +0 -0
- package/docs/figures/tech-tech-pad4-12000000.png +0 -0
- package/docs/figures/tech-tech-seven-12000000.png +0 -0
- package/docs/figures/twister-mid-5000000.png +0 -0
- package/docs/figures/twister-straight-12000000.png +0 -0
- package/docs/figures/vector-balls-nosort-ntsc.png +0 -0
- package/docs/figures/vector-balls-nosort.png +0 -0
- package/docs/formats/c64-file-formats.md +1212 -0
- package/docs/formats/iec-disk-reference.md +754 -0
- package/docs/game-design/c64-game-archetypes.md +273 -0
- package/docs/game-design/designs/falling-blocks.md +54 -0
- package/docs/game-design/designs/platformer-scaffold.md +48 -0
- package/docs/game-design/designs/simple-shmup.md +27 -0
- package/docs/game-design/enemy-behaviour-and-difficulty.md +349 -0
- package/docs/game-design/game-design-patterns.md +1189 -0
- package/docs/game-design/game-structure.md +354 -0
- package/docs/game-design/production-planning.md +349 -0
- package/docs/game-design/reference-game-sources.md +90 -0
- package/docs/hardware/6502-illegal-opcodes.md +1353 -0
- package/docs/hardware/6510-cpu-reference.md +2112 -0
- package/docs/hardware/c64-memory-map.md +3184 -0
- package/docs/hardware/c64-registers-reference.md +996 -0
- package/docs/hardware/cia-reference.md +1281 -0
- package/docs/hardware/kernal-routines-reference.md +1836 -0
- package/docs/hardware/pal-ntsc-reference.md +813 -0
- package/docs/hardware/sid-reference.md +1137 -0
- package/docs/hardware/vic-ii-reference.md +1714 -0
- package/docs/music/music-production-reference.md +403 -0
- package/docs/pitfalls/banking.md +1067 -0
- package/docs/pitfalls/cia.md +1147 -0
- package/docs/pitfalls/cpu.md +874 -0
- package/docs/pitfalls/input.md +282 -0
- package/docs/pitfalls/kernal-and-io.md +1615 -0
- package/docs/pitfalls/loader.md +1191 -0
- package/docs/pitfalls/logic.md +94 -0
- package/docs/pitfalls/maths.md +187 -0
- package/docs/pitfalls/raster-and-badline.md +721 -0
- package/docs/pitfalls/region-timing.md +660 -0
- package/docs/pitfalls/scroll.md +207 -0
- package/docs/pitfalls/sid.md +738 -0
- package/docs/pitfalls/sprite.md +979 -0
- package/docs/pitfalls/text-mode-render.md +1172 -0
- package/docs/recipes/cc65/cartridge-8k.md +398 -0
- package/docs/recipes/cc65/hello-world-conio.md +76 -0
- package/docs/recipes/cc65/memory-layout.md +312 -0
- package/docs/recipes/cc65/screenshots/README.md +14 -0
- package/docs/recipes/cc65/screenshots/cartridge-8k-ntsc.png +0 -0
- package/docs/recipes/cc65/screenshots/cartridge-8k.png +0 -0
- package/docs/recipes/cc65/screenshots/hello-world-conio.png +0 -0
- package/docs/recipes/cc65/screenshots/memory-layout-ntsc.png +0 -0
- package/docs/recipes/cc65/screenshots/memory-layout.png +0 -0
- package/docs/recipes/kickassembler/basic-float-calls.md +578 -0
- package/docs/recipes/kickassembler/basic-wedge.md +398 -0
- package/docs/recipes/kickassembler/big-font-scroller.md +620 -0
- package/docs/recipes/kickassembler/charset-copy-rom-to-ram.md +623 -0
- package/docs/recipes/kickassembler/cia-revision-detect.md +366 -0
- package/docs/recipes/kickassembler/colour-cycling.md +343 -0
- package/docs/recipes/kickassembler/colour-fade.md +303 -0
- package/docs/recipes/kickassembler/compare-16bit-signed.md +1007 -0
- package/docs/recipes/kickassembler/cracktro-template.md +526 -0
- package/docs/recipes/kickassembler/crt-banked.md +276 -0
- package/docs/recipes/kickassembler/dos-error-codes.md +466 -0
- package/docs/recipes/kickassembler/dot-flag.md +576 -0
- package/docs/recipes/kickassembler/drive-job-queue.md +667 -0
- package/docs/recipes/kickassembler/drive-via-probe.md +690 -0
- package/docs/recipes/kickassembler/dycp-scroller.md +568 -0
- package/docs/recipes/kickassembler/dypp-sprite-scroller.md +681 -0
- package/docs/recipes/kickassembler/dysp.md +670 -0
- package/docs/recipes/kickassembler/easyflash-save.md +800 -0
- package/docs/recipes/kickassembler/eight-way-scroll.md +1484 -0
- package/docs/recipes/kickassembler/file-io-roundtrip.md +546 -0
- package/docs/recipes/kickassembler/fire-effect.md +420 -0
- package/docs/recipes/kickassembler/fld.md +414 -0
- package/docs/recipes/kickassembler/fli-image.md +336 -0
- package/docs/recipes/kickassembler/four-player-read.md +672 -0
- package/docs/recipes/kickassembler/headless-verify.md +228 -0
- package/docs/recipes/kickassembler/hello-world.md +98 -0
- package/docs/recipes/kickassembler/high-score-insert.md +660 -0
- package/docs/recipes/kickassembler/hires-plot-line.md +723 -0
- package/docs/recipes/kickassembler/irq-chain.md +316 -0
- package/docs/recipes/kickassembler/irq-owns-port.md +668 -0
- package/docs/recipes/kickassembler/isometric-room.md +1145 -0
- package/docs/recipes/kickassembler/light-pen-read.md +926 -0
- package/docs/recipes/kickassembler/logic-rate-decoupling.md +670 -0
- package/docs/recipes/kickassembler/mci-interlace.md +543 -0
- package/docs/recipes/kickassembler/memory-layout.md +277 -0
- package/docs/recipes/kickassembler/mouse-1351-read.md +801 -0
- package/docs/recipes/kickassembler/nmi-timer-tick.md +562 -0
- package/docs/recipes/kickassembler/own-keyscan.md +881 -0
- package/docs/recipes/kickassembler/paddle-read.md +751 -0
- package/docs/recipes/kickassembler/palette-cells.md +219 -0
- package/docs/recipes/kickassembler/pseudo-3d-road.md +930 -0
- package/docs/recipes/kickassembler/pwm-digi.md +463 -0
- package/docs/recipes/kickassembler/raster-bars.md +264 -0
- package/docs/recipes/kickassembler/reu-dma.md +1019 -0
- package/docs/recipes/kickassembler/runtime-relocation.md +743 -0
- package/docs/recipes/kickassembler/screen-dissolve.md +545 -0
- package/docs/recipes/kickassembler/screen-wipe.md +408 -0
- package/docs/recipes/kickassembler/screenshots/README.md +72 -0
- package/docs/recipes/kickassembler/screenshots/basic-float-calls-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/basic-float-calls.png +0 -0
- package/docs/recipes/kickassembler/screenshots/basic-wedge-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/basic-wedge.png +0 -0
- package/docs/recipes/kickassembler/screenshots/big-font-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/big-font-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/charset-copy-rom-to-ram-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/charset-copy-rom-to-ram.png +0 -0
- package/docs/recipes/kickassembler/screenshots/cia-revision-detect-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/cia-revision-detect.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-cycling-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-cycling.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-fade-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/colour-fade.png +0 -0
- package/docs/recipes/kickassembler/screenshots/compare-16bit-signed-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/compare-16bit-signed.png +0 -0
- package/docs/recipes/kickassembler/screenshots/cracktro-template.png +0 -0
- package/docs/recipes/kickassembler/screenshots/crt-banked-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/crt-banked.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dos-error-codes-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dos-error-codes.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dot-flag-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dot-flag.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-job-queue-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-job-queue.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-via-probe-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/drive-via-probe.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dycp-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dycp-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dypp-sprite-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dypp-sprite-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dysp-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/dysp.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save-ntsc-run2.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save-run2.png +0 -0
- package/docs/recipes/kickassembler/screenshots/easyflash-save.png +0 -0
- package/docs/recipes/kickassembler/screenshots/eight-way-scroll-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/eight-way-scroll.png +0 -0
- package/docs/recipes/kickassembler/screenshots/file-io-roundtrip-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/file-io-roundtrip.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fire-effect-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fire-effect.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fld-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fld.png +0 -0
- package/docs/recipes/kickassembler/screenshots/fli-image.png +0 -0
- package/docs/recipes/kickassembler/screenshots/four-player-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/four-player-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/headless-verify-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/headless-verify.png +0 -0
- package/docs/recipes/kickassembler/screenshots/hello-world.png +0 -0
- package/docs/recipes/kickassembler/screenshots/high-score-insert-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/high-score-insert.png +0 -0
- package/docs/recipes/kickassembler/screenshots/hires-plot-line-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/hires-plot-line.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-chain-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-chain.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-owns-port-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/irq-owns-port.png +0 -0
- package/docs/recipes/kickassembler/screenshots/isometric-room-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/isometric-room.png +0 -0
- package/docs/recipes/kickassembler/screenshots/light-pen-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/light-pen-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/logic-rate-decoupling-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/logic-rate-decoupling.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace-average.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace-frame-b.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mci-interlace.png +0 -0
- package/docs/recipes/kickassembler/screenshots/memory-layout-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/memory-layout.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mouse-1351-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/mouse-1351-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/nmi-timer-tick-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/nmi-timer-tick.png +0 -0
- package/docs/recipes/kickassembler/screenshots/own-keyscan-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/own-keyscan.png +0 -0
- package/docs/recipes/kickassembler/screenshots/paddle-read-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/paddle-read.png +0 -0
- package/docs/recipes/kickassembler/screenshots/palette-cells-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/palette-cells.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pseudo-3d-road-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pseudo-3d-road.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pwm-digi-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/pwm-digi.png +0 -0
- package/docs/recipes/kickassembler/screenshots/raster-bars.png +0 -0
- package/docs/recipes/kickassembler/screenshots/reu-dma-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/reu-dma.png +0 -0
- package/docs/recipes/kickassembler/screenshots/runtime-relocation-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/runtime-relocation.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-dissolve-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-dissolve.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-wipe-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/screen-wipe.png +0 -0
- package/docs/recipes/kickassembler/screenshots/scroll-panel-split-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/scroll-panel-split.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sfx-in-player-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sfx-in-player.png +0 -0
- package/docs/recipes/kickassembler/screenshots/shadebobs-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/shadebobs.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sideborder-open.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sine-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sine-table-runtime-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sine-table-runtime.png +0 -0
- package/docs/recipes/kickassembler/screenshots/software-sprite-preshifted-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/software-sprite-preshifted.png +0 -0
- package/docs/recipes/kickassembler/screenshots/speedcode-generator-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/speedcode-generator.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-border-scroller-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-border-scroller.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-cache-flip-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-cache-flip.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-multiplex-24.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-multiplex-game-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-multiplex-game.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-priority-classes-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-priority-classes.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-sine-chain-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-sine-chain.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-stretcher-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprite-stretcher.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprites-only-screen-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sprites-only-screen.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sqrt-atan2-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/sqrt-atan2.png +0 -0
- package/docs/recipes/kickassembler/screenshots/stable-raster-irq-control.png +0 -0
- package/docs/recipes/kickassembler/screenshots/stable-raster-irq.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tech-tech-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tech-tech.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tod-alarm-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/tod-alarm.png +0 -0
- package/docs/recipes/kickassembler/screenshots/topbottom-border-open.png +0 -0
- package/docs/recipes/kickassembler/screenshots/twister-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/twister.png +0 -0
- package/docs/recipes/kickassembler/screenshots/unit-test-driver-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/unit-test-driver.png +0 -0
- package/docs/recipes/kickassembler/screenshots/vector-balls-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/vector-balls.png +0 -0
- package/docs/recipes/kickassembler/screenshots/wireframe-ships-ntsc.png +0 -0
- package/docs/recipes/kickassembler/screenshots/wireframe-ships.png +0 -0
- package/docs/recipes/kickassembler/scroll-panel-split.md +381 -0
- package/docs/recipes/kickassembler/sfx-in-player.md +907 -0
- package/docs/recipes/kickassembler/shadebobs.md +522 -0
- package/docs/recipes/kickassembler/sideborder-open.md +338 -0
- package/docs/recipes/kickassembler/sine-scroller.md +321 -0
- package/docs/recipes/kickassembler/sine-table-runtime.md +815 -0
- package/docs/recipes/kickassembler/software-sprite-preshifted.md +725 -0
- package/docs/recipes/kickassembler/speedcode-generator.md +606 -0
- package/docs/recipes/kickassembler/sprite-border-scroller.md +696 -0
- package/docs/recipes/kickassembler/sprite-cache-flip.md +1071 -0
- package/docs/recipes/kickassembler/sprite-multiplex-24.md +326 -0
- package/docs/recipes/kickassembler/sprite-multiplex-game.md +986 -0
- package/docs/recipes/kickassembler/sprite-priority-classes.md +463 -0
- package/docs/recipes/kickassembler/sprite-sine-chain.md +338 -0
- package/docs/recipes/kickassembler/sprite-stretcher.md +501 -0
- package/docs/recipes/kickassembler/sprites-only-screen.md +550 -0
- package/docs/recipes/kickassembler/sqrt-atan2.md +1014 -0
- package/docs/recipes/kickassembler/stable-raster-irq.md +360 -0
- package/docs/recipes/kickassembler/tape-turbo-loader.md +875 -0
- package/docs/recipes/kickassembler/tech-tech.md +679 -0
- package/docs/recipes/kickassembler/tod-alarm.md +754 -0
- package/docs/recipes/kickassembler/topbottom-border-open.md +407 -0
- package/docs/recipes/kickassembler/twister.md +518 -0
- package/docs/recipes/kickassembler/unit-test-driver.md +314 -0
- package/docs/recipes/kickassembler/vector-balls.md +545 -0
- package/docs/recipes/kickassembler/wireframe-ships.md +2324 -0
- package/docs/recipes/oscar64/actor-activation-window.md +807 -0
- package/docs/recipes/oscar64/adventure-engine.md +1094 -0
- package/docs/recipes/oscar64/attract-replay.md +465 -0
- package/docs/recipes/oscar64/beat-em-up-lanes.md +563 -0
- package/docs/recipes/oscar64/bfs-distance-map.md +723 -0
- package/docs/recipes/oscar64/bitmap-koala-viewer.md +355 -0
- package/docs/recipes/oscar64/car-contact.md +950 -0
- package/docs/recipes/oscar64/cave-scan.md +609 -0
- package/docs/recipes/oscar64/char-bullets.md +477 -0
- package/docs/recipes/oscar64/charset-animation.md +383 -0
- package/docs/recipes/oscar64/charset-parallax.md +401 -0
- package/docs/recipes/oscar64/destructible-terrain.md +1099 -0
- package/docs/recipes/oscar64/difficulty-tables.md +654 -0
- package/docs/recipes/oscar64/dig-and-guards.md +975 -0
- package/docs/recipes/oscar64/directory-reader.md +535 -0
- package/docs/recipes/oscar64/divide-check.md +581 -0
- package/docs/recipes/oscar64/double-buffer-nomirror.md +205 -0
- package/docs/recipes/oscar64/double-buffer.md +255 -0
- package/docs/recipes/oscar64/falling-blocks.md +874 -0
- package/docs/recipes/oscar64/fixed-point-jump-velocity.md +289 -0
- package/docs/recipes/oscar64/fixed-point-jump.md +210 -0
- package/docs/recipes/oscar64/flip-screen-rooms.md +793 -0
- package/docs/recipes/oscar64/frame-sync-loop-overrun.md +214 -0
- package/docs/recipes/oscar64/frame-sync-loop.md +254 -0
- package/docs/recipes/oscar64/game-tree-search.md +743 -0
- package/docs/recipes/oscar64/ghost-targeting.md +867 -0
- package/docs/recipes/oscar64/headless-verify.md +345 -0
- package/docs/recipes/oscar64/hello-world.md +83 -0
- package/docs/recipes/oscar64/high-score-persist.md +772 -0
- package/docs/recipes/oscar64/iffl-kernal-skip.md +421 -0
- package/docs/recipes/oscar64/joystick-input.md +358 -0
- package/docs/recipes/oscar64/lane-pursuit.md +1028 -0
- package/docs/recipes/oscar64/level-rle-decoder.md +620 -0
- package/docs/recipes/oscar64/lfsr-random-seed2.md +338 -0
- package/docs/recipes/oscar64/lfsr-random.md +403 -0
- package/docs/recipes/oscar64/load-asset-runtime.md +492 -0
- package/docs/recipes/oscar64/memory-layout.md +232 -0
- package/docs/recipes/oscar64/mixed-fighters.md +781 -0
- package/docs/recipes/oscar64/multi-sprite-object.md +533 -0
- package/docs/recipes/oscar64/nav-area-pathfinding.md +881 -0
- package/docs/recipes/oscar64/object-pool.md +572 -0
- package/docs/recipes/oscar64/pal-ntsc-detect.md +257 -0
- package/docs/recipes/oscar64/password-state.md +532 -0
- package/docs/recipes/oscar64/per-frame-hitbox.md +651 -0
- package/docs/recipes/oscar64/petscii-screen-codes.md +428 -0
- package/docs/recipes/oscar64/platformer-scaffold.md +1467 -0
- package/docs/recipes/oscar64/print-number.md +367 -0
- package/docs/recipes/oscar64/raster-bars.md +239 -0
- package/docs/recipes/oscar64/raster-profile-bars.md +404 -0
- package/docs/recipes/oscar64/rel-side-sectors.md +391 -0
- package/docs/recipes/oscar64/relative-file-records.md +378 -0
- package/docs/recipes/oscar64/save-load-seq-file.md +365 -0
- package/docs/recipes/oscar64/screenshots/README.md +99 -0
- package/docs/recipes/oscar64/screenshots/actor-activation-window-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/actor-activation-window.png +0 -0
- package/docs/recipes/oscar64/screenshots/adventure-engine-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/adventure-engine.png +0 -0
- package/docs/recipes/oscar64/screenshots/attract-replay-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/attract-replay.png +0 -0
- package/docs/recipes/oscar64/screenshots/beat-em-up-lanes-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/beat-em-up-lanes.png +0 -0
- package/docs/recipes/oscar64/screenshots/bfs-distance-map-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/bfs-distance-map.png +0 -0
- package/docs/recipes/oscar64/screenshots/bitmap-koala-viewer.png +0 -0
- package/docs/recipes/oscar64/screenshots/car-contact-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/car-contact.png +0 -0
- package/docs/recipes/oscar64/screenshots/cave-scan-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/cave-scan.png +0 -0
- package/docs/recipes/oscar64/screenshots/char-bullets-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/char-bullets.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-animation-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-animation.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-parallax-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/charset-parallax.png +0 -0
- package/docs/recipes/oscar64/screenshots/destructible-terrain-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/destructible-terrain.png +0 -0
- package/docs/recipes/oscar64/screenshots/difficulty-tables-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/difficulty-tables.png +0 -0
- package/docs/recipes/oscar64/screenshots/dig-and-guards-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/dig-and-guards.png +0 -0
- package/docs/recipes/oscar64/screenshots/directory-reader-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/directory-reader.png +0 -0
- package/docs/recipes/oscar64/screenshots/divide-check-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/divide-check.png +0 -0
- package/docs/recipes/oscar64/screenshots/double-buffer-nomirror.png +0 -0
- package/docs/recipes/oscar64/screenshots/double-buffer-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/double-buffer.png +0 -0
- package/docs/recipes/oscar64/screenshots/falling-blocks-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/falling-blocks.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump-velocity-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump-velocity.png +0 -0
- package/docs/recipes/oscar64/screenshots/fixed-point-jump.png +0 -0
- package/docs/recipes/oscar64/screenshots/flip-screen-rooms-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/flip-screen-rooms.png +0 -0
- package/docs/recipes/oscar64/screenshots/frame-sync-loop-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/frame-sync-loop-overrun.png +0 -0
- package/docs/recipes/oscar64/screenshots/frame-sync-loop.png +0 -0
- package/docs/recipes/oscar64/screenshots/game-tree-search-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/game-tree-search.png +0 -0
- package/docs/recipes/oscar64/screenshots/ghost-targeting-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/ghost-targeting.png +0 -0
- package/docs/recipes/oscar64/screenshots/headless-verify-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/headless-verify.png +0 -0
- package/docs/recipes/oscar64/screenshots/hello-world.png +0 -0
- package/docs/recipes/oscar64/screenshots/high-score-persist-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/high-score-persist.png +0 -0
- package/docs/recipes/oscar64/screenshots/iffl-kernal-skip-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/iffl-kernal-skip.png +0 -0
- package/docs/recipes/oscar64/screenshots/joystick-input-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/joystick-input.png +0 -0
- package/docs/recipes/oscar64/screenshots/lane-pursuit-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/lane-pursuit.png +0 -0
- package/docs/recipes/oscar64/screenshots/level-rle-decoder-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/level-rle-decoder.png +0 -0
- package/docs/recipes/oscar64/screenshots/lfsr-random-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/lfsr-random-seed2.png +0 -0
- package/docs/recipes/oscar64/screenshots/lfsr-random.png +0 -0
- package/docs/recipes/oscar64/screenshots/load-asset-runtime-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/load-asset-runtime.png +0 -0
- package/docs/recipes/oscar64/screenshots/memory-layout-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/memory-layout.png +0 -0
- package/docs/recipes/oscar64/screenshots/mixed-fighters-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/mixed-fighters.png +0 -0
- package/docs/recipes/oscar64/screenshots/multi-sprite-object-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/multi-sprite-object.png +0 -0
- package/docs/recipes/oscar64/screenshots/nav-area-pathfinding-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/nav-area-pathfinding.png +0 -0
- package/docs/recipes/oscar64/screenshots/object-pool-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/object-pool.png +0 -0
- package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-oldntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/pal-ntsc-detect-pal.png +0 -0
- package/docs/recipes/oscar64/screenshots/password-state-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/password-state.png +0 -0
- package/docs/recipes/oscar64/screenshots/per-frame-hitbox-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/per-frame-hitbox.png +0 -0
- package/docs/recipes/oscar64/screenshots/petscii-screen-codes-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/petscii-screen-codes.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold-d64-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold-d64.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/platformer-scaffold.png +0 -0
- package/docs/recipes/oscar64/screenshots/print-number-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/print-number.png +0 -0
- package/docs/recipes/oscar64/screenshots/raster-bars.png +0 -0
- package/docs/recipes/oscar64/screenshots/raster-profile-bars-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/raster-profile-bars.png +0 -0
- package/docs/recipes/oscar64/screenshots/rel-side-sectors-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/rel-side-sectors.png +0 -0
- package/docs/recipes/oscar64/screenshots/relative-file-records-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/relative-file-records.png +0 -0
- package/docs/recipes/oscar64/screenshots/save-load-seq-file-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/save-load-seq-file.png +0 -0
- package/docs/recipes/oscar64/screenshots/seeded-level-fill-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/seeded-level-fill.png +0 -0
- package/docs/recipes/oscar64/screenshots/sfx-engine-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/sfx-engine.png +0 -0
- package/docs/recipes/oscar64/screenshots/sid-music-player.png +0 -0
- package/docs/recipes/oscar64/screenshots/simple-shmup.png +0 -0
- package/docs/recipes/oscar64/screenshots/slope-collision-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/slope-collision.png +0 -0
- package/docs/recipes/oscar64/screenshots/soft-scroll-h.png +0 -0
- package/docs/recipes/oscar64/screenshots/sprite-animation-table-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/sprite-animation-table.png +0 -0
- package/docs/recipes/oscar64/screenshots/sprite-multiplex-8.png +0 -0
- package/docs/recipes/oscar64/screenshots/stable-raster-irq.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-input-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-input.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-gameover.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-notrail-control.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield-ungated-control.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-overlay-playfield.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-window-menu-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/text-window-menu.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-grid-collision-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-grid-collision.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-map-render-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/tile-map-render.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-player-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-player.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-word-parser-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/two-word-parser.png +0 -0
- package/docs/recipes/oscar64/screenshots/vehicle-control-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/vehicle-control.png +0 -0
- package/docs/recipes/oscar64/screenshots/wave-director-ntsc.png +0 -0
- package/docs/recipes/oscar64/screenshots/wave-director.png +0 -0
- package/docs/recipes/oscar64/seeded-level-fill.md +364 -0
- package/docs/recipes/oscar64/sfx-engine.md +514 -0
- package/docs/recipes/oscar64/sid-music-player.md +441 -0
- package/docs/recipes/oscar64/simple-shmup.md +1000 -0
- package/docs/recipes/oscar64/slope-collision.md +610 -0
- package/docs/recipes/oscar64/soft-scroll-h.md +261 -0
- package/docs/recipes/oscar64/sprite-animation-table.md +671 -0
- package/docs/recipes/oscar64/sprite-multiplex-8.md +314 -0
- package/docs/recipes/oscar64/stable-raster-irq.md +236 -0
- package/docs/recipes/oscar64/text-input.md +274 -0
- package/docs/recipes/oscar64/text-overlay-playfield.md +617 -0
- package/docs/recipes/oscar64/text-window-menu.md +551 -0
- package/docs/recipes/oscar64/tile-grid-collision.md +563 -0
- package/docs/recipes/oscar64/tile-map-render.md +395 -0
- package/docs/recipes/oscar64/two-player.md +528 -0
- package/docs/recipes/oscar64/two-word-parser.md +510 -0
- package/docs/recipes/oscar64/vehicle-control.md +771 -0
- package/docs/recipes/oscar64/wave-director.md +787 -0
- package/docs/recipes/runs.json +1606 -0
- package/docs/runtime/sim6502-reference.md +466 -0
- package/docs/runtime/vice-mcp-reference.md +351 -0
- package/docs/runtime/vice-reference.md +1393 -0
- package/docs/techniques/bitmap-modes.md +685 -0
- package/docs/techniques/cpu-cycle-tricks.md +1570 -0
- package/docs/techniques/effects-vector-3d.md +1431 -0
- package/docs/techniques/file-io.md +1427 -0
- package/docs/techniques/input.md +1072 -0
- package/docs/techniques/loaders-packers.md +768 -0
- package/docs/techniques/logic.md +3091 -0
- package/docs/techniques/maths.md +1524 -0
- package/docs/techniques/memory-banking.md +1686 -0
- package/docs/techniques/music-sid.md +1144 -0
- package/docs/techniques/raster.md +1543 -0
- package/docs/techniques/scroll.md +1292 -0
- package/docs/techniques/sprite.md +2566 -0
- package/docs/techniques/text-mode-render.md +717 -0
- package/docs/techniques/text.md +1095 -0
- package/docs/techniques/transitions.md +405 -0
- package/docs/toolchains/cartconv-reference.md +262 -0
- package/docs/toolchains/cc1541-reference.md +316 -0
- package/docs/toolchains/cc65-reference.md +667 -0
- package/docs/toolchains/error-sources/cc65/README.md +1 -0
- package/docs/toolchains/error-sources/cc65/missing-setcpu.s +4 -0
- package/docs/toolchains/error-sources/cc65/range-error.s +4 -0
- package/docs/toolchains/error-sources/cc65/segment-overflow.c +6 -0
- package/docs/toolchains/error-sources/cc65/unresolved-external.c +6 -0
- package/docs/toolchains/error-sources/kickassembler/README.md +1 -0
- package/docs/toolchains/error-sources/kickassembler/branch-out-of-range.asm +4 -0
- package/docs/toolchains/error-sources/kickassembler/failed-assert.asm +3 -0
- package/docs/toolchains/error-sources/kickassembler/flat-lib.asm +4 -0
- package/docs/toolchains/error-sources/kickassembler/import-source-no-namespace.asm +5 -0
- package/docs/toolchains/error-sources/kickassembler/macro-without-parentheses.asm +6 -0
- package/docs/toolchains/error-sources/kickassembler/memory-block-overlap.asm +4 -0
- package/docs/toolchains/error-sources/kickassembler/symbol-clash-lib.asm +5 -0
- package/docs/toolchains/error-sources/kickassembler/symbol-clash-main.asm +6 -0
- package/docs/toolchains/error-sources/kickassembler/unknown-symbol.asm +4 -0
- package/docs/toolchains/error-sources/oscar64/README.md +1 -0
- package/docs/toolchains/error-sources/oscar64/asm-addressing-mode.c +7 -0
- package/docs/toolchains/error-sources/oscar64/region-overflow.c +6 -0
- package/docs/toolchains/error-sources/oscar64/undefined-extern-var.c +5 -0
- package/docs/toolchains/error-sources/oscar64/undefined-extern.c +6 -0
- package/docs/toolchains/error-sources/oscar64/unknown-vic-field.c +6 -0
- package/docs/toolchains/error-sources/oscar64/void-main.c +3 -0
- package/docs/toolchains/kickassembler-reference.md +1020 -0
- package/docs/toolchains/memory-layout-planning.md +362 -0
- package/docs/toolchains/oscar64-headers-reference.md +583 -0
- package/docs/toolchains/oscar64-reference.md +892 -0
- package/docs/toolchains/petcat-reference.md +290 -0
- package/docs/toolchains/png2prg.md +188 -0
- package/docs/toolchains/release-disk.md +314 -0
- package/docs/toolchains/sidreloc.md +236 -0
- package/docs/toolchains/spindle-reference.md +487 -0
- package/docs/toolchains/tape-mastering.md +592 -0
- package/docs/toolchains/unit-testing-6502.md +281 -0
- package/docs/workflow/agent-harness.md +478 -0
- package/package.json +105 -0
- package/templates/_harness/CLAUDE.md.template +91 -0
- package/templates/_harness/PLAN.md.template +72 -0
- package/templates/_harness/check.py +442 -0
- package/templates/_harness/claude/settings.json +17 -0
- package/templates/_harness/gen-asm-header.py +96 -0
- package/templates/_harness/harness.mk +273 -0
- package/templates/_harness/hooks/plan-gate.py +185 -0
- package/templates/_harness/meter/frame_meter.asm +311 -0
- package/templates/_harness/meter/frame_meter.c +155 -0
- package/templates/_harness/meter/frame_meter.h +80 -0
- package/templates/_harness/zp-used.py +104 -0
- package/templates/action-puzzle/.claude/settings.json +17 -0
- package/templates/action-puzzle/.mcp.json +10 -0
- package/templates/action-puzzle/CLAUDE.md +120 -0
- package/templates/action-puzzle/Makefile +125 -0
- package/templates/action-puzzle/PLAN.md +388 -0
- package/templates/action-puzzle/README.md +240 -0
- package/templates/action-puzzle/expect.json +25 -0
- package/templates/action-puzzle/src/cave.c +280 -0
- package/templates/action-puzzle/src/cave.h +80 -0
- package/templates/action-puzzle/src/gen_autopilot.h +20 -0
- package/templates/action-puzzle/src/gen_caves.h +59 -0
- package/templates/action-puzzle/src/gen_notes.h +16 -0
- package/templates/action-puzzle/src/hiscore.c +152 -0
- package/templates/action-puzzle/src/hiscore.h +41 -0
- package/templates/action-puzzle/src/level.c +64 -0
- package/templates/action-puzzle/src/level.h +24 -0
- package/templates/action-puzzle/src/main.c +599 -0
- package/templates/action-puzzle/src/render.c +239 -0
- package/templates/action-puzzle/src/render.h +31 -0
- package/templates/action-puzzle/src/sound.c +158 -0
- package/templates/action-puzzle/src/sound.h +22 -0
- package/templates/action-puzzle/tools/disk_check.py +77 -0
- package/templates/action-puzzle/tools/drive.py +106 -0
- package/templates/action-puzzle/tools/gen.py +454 -0
- package/templates/action-puzzle/tools/model_check.py +49 -0
- package/templates/action-puzzle/tools/verdict_codes.py +24 -0
- package/templates/adventure/.claude/settings.json +17 -0
- package/templates/adventure/.mcp.json +10 -0
- package/templates/adventure/CLAUDE.md +118 -0
- package/templates/adventure/Makefile +113 -0
- package/templates/adventure/PLAN.md +396 -0
- package/templates/adventure/README.md +277 -0
- package/templates/adventure/expect.json +25 -0
- package/templates/adventure/src/engine.c +543 -0
- package/templates/adventure/src/engine.h +48 -0
- package/templates/adventure/src/gen_script.h +141 -0
- package/templates/adventure/src/gen_world.h +511 -0
- package/templates/adventure/src/main.c +439 -0
- package/templates/adventure/src/picture.c +83 -0
- package/templates/adventure/src/picture.h +16 -0
- package/templates/adventure/src/save.c +159 -0
- package/templates/adventure/src/save.h +25 -0
- package/templates/adventure/src/sound.c +71 -0
- package/templates/adventure/src/sound.h +16 -0
- package/templates/adventure/src/text.c +349 -0
- package/templates/adventure/src/text.h +40 -0
- package/templates/adventure/tools/disk_check.py +128 -0
- package/templates/adventure/tools/drive.py +119 -0
- package/templates/adventure/tools/gen.py +1033 -0
- package/templates/adventure/tools/world.py +356 -0
- package/templates/beat-em-up/.claude/settings.json +17 -0
- package/templates/beat-em-up/.mcp.json +10 -0
- package/templates/beat-em-up/CLAUDE.md +136 -0
- package/templates/beat-em-up/Makefile +96 -0
- package/templates/beat-em-up/PLAN.md +502 -0
- package/templates/beat-em-up/README.md +315 -0
- package/templates/beat-em-up/expect-gameover.json +8 -0
- package/templates/beat-em-up/expect.json +29 -0
- package/templates/beat-em-up/src/anim.c +70 -0
- package/templates/beat-em-up/src/art.c +344 -0
- package/templates/beat-em-up/src/autopilot.h +154 -0
- package/templates/beat-em-up/src/brute.c +273 -0
- package/templates/beat-em-up/src/enemy.c +281 -0
- package/templates/beat-em-up/src/engine.asm +512 -0
- package/templates/beat-em-up/src/fighter.c +384 -0
- package/templates/beat-em-up/src/game.h +269 -0
- package/templates/beat-em-up/src/hud.c +135 -0
- package/templates/beat-em-up/src/main.c +341 -0
- package/templates/beat-em-up/src/sound.c +44 -0
- package/templates/beat-em-up/src/street.c +93 -0
- package/templates/beat-em-up/src/verdict.h +523 -0
- package/templates/beat-em-up/src/view.c +362 -0
- package/templates/beat-em-up/tools/drive.py +105 -0
- package/templates/beat-em-up/tools/flickercheck.py +273 -0
- package/templates/demo/.claude/settings.json +17 -0
- package/templates/demo/.mcp.json +10 -0
- package/templates/demo/CLAUDE.md +129 -0
- package/templates/demo/Makefile +66 -0
- package/templates/demo/PLAN.md +401 -0
- package/templates/demo/README.md +322 -0
- package/templates/demo/expect.json +945 -0
- package/templates/demo/src/config.asm +80 -0
- package/templates/demo/src/framework.asm +390 -0
- package/templates/demo/src/main.asm +139 -0
- package/templates/demo/src/music.asm +197 -0
- package/templates/demo/src/part_main.asm +279 -0
- package/templates/demo/src/part_title.asm +79 -0
- package/templates/demo/src/parts.asm +43 -0
- package/templates/demo/src/tables.asm +73 -0
- package/templates/demo/src/verdict.asm +179 -0
- package/templates/demo/tools/audio.py +80 -0
- package/templates/demo/tools/gen_expect.py +167 -0
- package/templates/demo/tools/probe.py +95 -0
- package/templates/hello/.claude/settings.json +17 -0
- package/templates/hello/.mcp.json +10 -0
- package/templates/hello/CLAUDE.md +100 -0
- package/templates/hello/Makefile +38 -0
- package/templates/hello/PLAN.md +200 -0
- package/templates/hello/expect.json +20 -0
- package/templates/hello/src/main.c +161 -0
- package/templates/hello/src/sprite.asm +27 -0
- package/templates/hello-kick/.claude/settings.json +17 -0
- package/templates/hello-kick/.mcp.json +10 -0
- package/templates/hello-kick/CLAUDE.md +100 -0
- package/templates/hello-kick/Makefile +17 -0
- package/templates/hello-kick/PLAN.md +199 -0
- package/templates/hello-kick/expect.json +20 -0
- package/templates/hello-kick/src/main.asm +233 -0
- package/templates/platformer/.claude/settings.json +17 -0
- package/templates/platformer/.mcp.json +10 -0
- package/templates/platformer/CLAUDE.md +125 -0
- package/templates/platformer/Makefile +86 -0
- package/templates/platformer/PLAN.md +360 -0
- package/templates/platformer/README.md +277 -0
- package/templates/platformer/expect.json +32 -0
- package/templates/platformer/src/actors.c +289 -0
- package/templates/platformer/src/anim.c +51 -0
- package/templates/platformer/src/art.c +212 -0
- package/templates/platformer/src/autopilot.h +30 -0
- package/templates/platformer/src/engine.asm +253 -0
- package/templates/platformer/src/game.h +248 -0
- package/templates/platformer/src/hud.c +90 -0
- package/templates/platformer/src/level.c +184 -0
- package/templates/platformer/src/main.c +306 -0
- package/templates/platformer/src/player.c +268 -0
- package/templates/platformer/src/sound.c +42 -0
- package/templates/platformer/src/verdict.h +206 -0
- package/templates/platformer/src/view.c +331 -0
- package/templates/platformer/stage-expect.json +6 -0
- package/templates/platformer/tools/drive.py +112 -0
- package/templates/platformer/tools/tearcheck.py +229 -0
- package/templates/shmup-vertical/.claude/settings.json +17 -0
- package/templates/shmup-vertical/.mcp.json +10 -0
- package/templates/shmup-vertical/CLAUDE.md +137 -0
- package/templates/shmup-vertical/Makefile +131 -0
- package/templates/shmup-vertical/PLAN.md +569 -0
- package/templates/shmup-vertical/README.md +189 -0
- package/templates/shmup-vertical/expect.json +38 -0
- package/templates/shmup-vertical/src/bullets.c +158 -0
- package/templates/shmup-vertical/src/bullets.h +35 -0
- package/templates/shmup-vertical/src/display.c +239 -0
- package/templates/shmup-vertical/src/display.h +40 -0
- package/templates/shmup-vertical/src/game.h +85 -0
- package/templates/shmup-vertical/src/glyph.asm +358 -0
- package/templates/shmup-vertical/src/hiscore.c +141 -0
- package/templates/shmup-vertical/src/hiscore.h +16 -0
- package/templates/shmup-vertical/src/hit.asm +180 -0
- package/templates/shmup-vertical/src/hitbox.c +59 -0
- package/templates/shmup-vertical/src/hitbox.h +25 -0
- package/templates/shmup-vertical/src/kernel.asm +330 -0
- package/templates/shmup-vertical/src/level.c +174 -0
- package/templates/shmup-vertical/src/level.h +27 -0
- package/templates/shmup-vertical/src/main.c +824 -0
- package/templates/shmup-vertical/src/mux.asm +321 -0
- package/templates/shmup-vertical/src/sound.asm +255 -0
- package/templates/shmup-vertical/src/step.asm +169 -0
- package/templates/shmup-vertical/src/waves.c +195 -0
- package/templates/shmup-vertical/src/waves.h +33 -0
- package/templates/shmup-vertical/stage-expect.json +6 -0
- package/templates/shmup-vertical/tools/drive.py +152 -0
- package/templates/shmup-vertical/tools/joytest.py +159 -0
- package/templates/shmup-vertical/tools/meter.py +15 -0
- package/templates/shmup-vertical/tools/phases.py +73 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Archetype Reference Conventions
|
|
2
|
+
|
|
3
|
+
Archetype docs describe the shapes a C64 game or demo takes: the vertical
|
|
4
|
+
shooter, the single-screen platformer, the text adventure, the crack
|
|
5
|
+
intro. Today there are two: `docs/game-design/c64-game-archetypes.md`
|
|
6
|
+
for kind `game` and `docs/demo-design/intro-cracktro-patterns.md` for
|
|
7
|
+
kind `demo`. Each H2 in them is one `Archetype` node, and two lines under
|
|
8
|
+
the H2 become its edges: the technique fingerprint (`FEATURES`, Archetype
|
|
9
|
+
to Technique) and the common pitfalls (`RISKS`, Archetype to Pitfall).
|
|
10
|
+
`c64_game_briefing` and `c64_demo_briefing` read both.
|
|
11
|
+
|
|
12
|
+
The marker `<!-- doc-type: archetype-reference -->` MUST appear in the
|
|
13
|
+
first 10 lines for the extractor to process the file.
|
|
14
|
+
|
|
15
|
+
## File-level frontmatter
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
---
|
|
19
|
+
kind: game # game | demo; optional, defaults to game
|
|
20
|
+
---
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`kind` applies to every archetype in the file. Any other word refuses the
|
|
24
|
+
whole file with a warning, the way an unknown technique category does.
|
|
25
|
+
|
|
26
|
+
`kind: demo` is the demo forms: the source is
|
|
27
|
+
`docs/demo-design/intro-cracktro-patterns.md`, whose crack intro, demo
|
|
28
|
+
intro, pack intro, dentro and 4K party intro are each one `Archetype`
|
|
29
|
+
node. A form is the node; the parts a multi-part production is cut into
|
|
30
|
+
are not a node type, and a page must not try to make them one. The entry
|
|
31
|
+
format, the edge lines and the ingest counts are the same as for games,
|
|
32
|
+
and `c64_demo_briefing` with `archetype` reads the node exactly as
|
|
33
|
+
`c64_game_briefing` does. Archetype names are unique across every
|
|
34
|
+
archetype page, not just within one: the ingest merges the node on its
|
|
35
|
+
name alone, so a name repeated on a second page overwrites the first
|
|
36
|
+
page's node (its kind, title and source) and both pages' edges land on
|
|
37
|
+
the one node. The extractor only refuses a repeat within a single file.
|
|
38
|
+
`archetype_not_found` lists the names of both kinds.
|
|
39
|
+
|
|
40
|
+
## Archetype entries
|
|
41
|
+
|
|
42
|
+
The H2 is the human-readable title, free-form, and is NOT the node name.
|
|
43
|
+
Technique and pitfall H2s carry `## name — Title`; archetype titles have
|
|
44
|
+
slashes and hyphens in them ("Text Adventure / Parser-Driven",
|
|
45
|
+
"Beat-em-up"), so the name is a separate line instead. The first line
|
|
46
|
+
after the H2 is:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
## Vertical Shmup
|
|
50
|
+
|
|
51
|
+
**Archetype:** `vertical_shmup`
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
- `vertical_shmup` is the snake_case node name (`Archetype.name`), unique
|
|
55
|
+
in the file. Backticks are optional.
|
|
56
|
+
- An H2 with no `**Archetype:**` line is not an archetype: it is warned
|
|
57
|
+
about and skipped, so a prose section cannot become a node by accident.
|
|
58
|
+
- A second H2 with the same name is warned about and skipped.
|
|
59
|
+
|
|
60
|
+
Two more lines under the H2 are the edge sources. Both existed on the page
|
|
61
|
+
before the graph read them; the format did not change.
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
**Technique fingerprint:** `soft_scroll_v`, `sprite_multiplex_24`, `stable_raster_irq`
|
|
65
|
+
**Common pitfalls:** `sprite_dma_overflow`, `badline_cycle_loss`
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- Comma-separated, backticks optional. Each word must be a snake_case
|
|
69
|
+
name. A word that is not one is refused at extract time with a warning
|
|
70
|
+
and never reaches the graph.
|
|
71
|
+
- `**Technique fingerprint:**` makes one `FEATURES` edge per word to the
|
|
72
|
+
`Technique` of that name. `**Common pitfalls:**` makes one `RISKS` edge
|
|
73
|
+
per word to the `Pitfall` of that name.
|
|
74
|
+
- Both ends are MATCHed, never MERGEd. A name that matches no node is
|
|
75
|
+
dropped at link time with a `[falkor]` warning and counted in the ingest
|
|
76
|
+
summary (`archetype_features: … dropped`, `archetype_risks: … dropped`),
|
|
77
|
+
beside `triggered_by` and `mitigated_by`. It is never silently dropped
|
|
78
|
+
and it never creates a stub node. Fix the page, do not ignore the count.
|
|
79
|
+
- Only name a technique the archetype's own prose supports. The
|
|
80
|
+
fingerprint is what `c64_game_briefing` forces into a plan for that
|
|
81
|
+
archetype, so a name here is a claim that every such game needs it.
|
|
82
|
+
|
|
83
|
+
One more line routes a brief that names no archetype (schema 30):
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
**Brief words:** vertical shooter, vertically scrolling, road shooter, road, car, spy hunter
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
- Comma-separated words or phrases, backticks optional. The extractor
|
|
90
|
+
lowers the case, drops apostrophes and reads any other run of
|
|
91
|
+
non-letters and non-digits as one space, so "Beat-'em-up" is stored as
|
|
92
|
+
`beat em up`. It becomes the `brief_words` property of the node, not an
|
|
93
|
+
edge; an entry with no line stores an empty list.
|
|
94
|
+
- Only kind `game` is routed. `c64_game_briefing` with no `archetype`
|
|
95
|
+
normalises the brief the same way and counts, per archetype, the
|
|
96
|
+
distinct words it contains, a plural "s" or "es" allowed. The archetype
|
|
97
|
+
with the most wins; a tie or no match routes nowhere.
|
|
98
|
+
- Choose words that name the genre, not a technique. A word on two
|
|
99
|
+
entries cancels itself out ("puzzle" is on `puzzle` and `action_puzzle`,
|
|
100
|
+
so "Boulder Dash puzzle" still routes by "boulder dash"). A word that
|
|
101
|
+
every brief carries ("game", "screen", "columns") routes everything.
|
|
102
|
+
- The line is how a genre reaches its archetype. It is data here, so no
|
|
103
|
+
genre word or game title is spelled in the briefing code.
|
|
104
|
+
|
|
105
|
+
One more optional line names the playable starter for the archetype
|
|
106
|
+
(schema 31):
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
**Starter:** `shmup-vertical`
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
- The word is a directory in `templates/` (lower case, digits, hyphens).
|
|
113
|
+
It becomes the Archetype's `starter` property, and `c64_game_briefing`
|
|
114
|
+
or `c64_demo_briefing` returns it in `archetype.starter` and tells the
|
|
115
|
+
agent to run `npm run new-project -- <starter> <dir>` in this checkout.
|
|
116
|
+
- The extractor does not read the tree. `test/extract-archetype-starters.test.ts`
|
|
117
|
+
fails when a starter named on a real page has no `Makefile` and
|
|
118
|
+
`expect.json` in `templates/`.
|
|
119
|
+
- Name a starter only where it is a game or effect of that archetype.
|
|
120
|
+
An archetype with no fitting starter carries no line.
|
|
121
|
+
|
|
122
|
+
The other lines on the page (`**Reference titles:**`, `**Modern
|
|
123
|
+
examples:**`) are prose for the reader and are not read by the extractor.
|
|
124
|
+
|
|
125
|
+
## What the briefing does with it
|
|
126
|
+
|
|
127
|
+
`c64_game_briefing` with `archetype: "vertical_shmup"` (also accepted:
|
|
128
|
+
"Vertical Shmup", "vertical-shmup") looks the node up. Its `FEATURES`
|
|
129
|
+
targets are proposed regardless of the keyword scorer's verdict and are
|
|
130
|
+
exempt from the three-per-category cap; its `RISKS` targets are added to
|
|
131
|
+
the pitfalls when no proposed technique already surfaced them; its title
|
|
132
|
+
is appended to the search text. The output repeats what the graph held
|
|
133
|
+
in an `archetype` field.
|
|
134
|
+
|
|
135
|
+
With no `archetype`, `c64_game_briefing` routes the brief by the brief
|
|
136
|
+
words above and does the same with the winner; the output's
|
|
137
|
+
`archetype.inferred_from` lists the words that chose it, and the text
|
|
138
|
+
says so. A named `archetype` always wins over the words.
|
|
139
|
+
|
|
140
|
+
A name the graph does not have returns `archetype_not_found` with the
|
|
141
|
+
known names and builds the rest of the plan from the description alone.
|
|
142
|
+
The briefing does not guess a near match. Only a graph with no
|
|
143
|
+
`Archetype` nodes at all falls back to a small built-in table; with this
|
|
144
|
+
page ingested, the page is the source of truth.
|
|
145
|
+
|
|
146
|
+
## Section structure inside an Archetype
|
|
147
|
+
|
|
148
|
+
After the H2 and the `**Archetype:**` line, free-form prose covering:
|
|
149
|
+
|
|
150
|
+
1. **What it is** — the defining mechanic and the scene tradition
|
|
151
|
+
2. **Where the budget goes** — the technical constraint that shapes it
|
|
152
|
+
3. **How the pieces fit** — sprites, scroll, SID, loading, in plain terms
|
|
153
|
+
4. The `**Technique fingerprint:**`, `**Common pitfalls:**` and
|
|
154
|
+
`**Brief words:**` lines
|
|
155
|
+
5. `**Reference titles:**` and `**Modern examples:**`
|
|
156
|
+
|
|
157
|
+
H3 inside an archetype is fine; the extractor reads only the H2 and the
|
|
158
|
+
five bold lines (`**Brief words:**` and `**Starter:**` are optional).
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Failure Pattern Reference Conventions
|
|
2
|
+
|
|
3
|
+
Failure-pattern docs live in `docs/c64-failure-patterns.md` (single
|
|
4
|
+
file). Each entry is one CrashPattern node, keyed by `symptom`.
|
|
5
|
+
|
|
6
|
+
The marker `<!-- doc-type: failure-reference -->` MUST appear in the
|
|
7
|
+
first 10 lines for the extractor to process the file.
|
|
8
|
+
|
|
9
|
+
## CrashPattern entries
|
|
10
|
+
|
|
11
|
+
Every CrashPattern in the doc gets an H2 in this exact format:
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
## black_screen — Display goes solid color or stays $00
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Breakdown:
|
|
18
|
+
- `## ` (H2)
|
|
19
|
+
- `black_screen` — snake_case symptom canonical name
|
|
20
|
+
- ` — ` — em-dash separator
|
|
21
|
+
- Free-form one-line description
|
|
22
|
+
|
|
23
|
+
Following each H2 block:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
**Likely causes:** vic_bank_misconfigured, screen_pointer_outside_bank, di_d011_blanked
|
|
27
|
+
**Diagnosis steps:** Check $D018 video matrix pointer; verify $DD00 VIC bank bits; inspect $D011 bit 4 (blank).
|
|
28
|
+
**Caused by registers:** D011, D018, DD00
|
|
29
|
+
**Caused by kernal:** SCREEN
|
|
30
|
+
**Caused by techniques:** vic_bank_select
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`Likely causes` is a comma-separated list of free-form cause tags
|
|
34
|
+
(short snake_case strings). Stored as a JSON-encoded array on the
|
|
35
|
+
node. NOT graph edges — graph edges go through the `Caused by …`
|
|
36
|
+
lines.
|
|
37
|
+
|
|
38
|
+
`Caused by …` lines emit CAUSED_BY edges, same structure as Pitfall's
|
|
39
|
+
TRIGGERED_BY.
|
|
40
|
+
|
|
41
|
+
## Section structure inside a CrashPattern
|
|
42
|
+
|
|
43
|
+
1. **Visible/audible symptom** (1–2 sentences, vivid)
|
|
44
|
+
2. **Likely causes** (parallel to the metadata list, expanded)
|
|
45
|
+
3. **Diagnosis steps** (numbered, concrete — what to inspect in vice-mcp)
|
|
46
|
+
4. **Common fixes** (1–3 paragraphs)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Game Design Conventions
|
|
2
|
+
|
|
3
|
+
A game design page describes one whole game: which archetype it is, which
|
|
4
|
+
recipe builds it, which techniques it runs in each phase, and, once the
|
|
5
|
+
built game has been timed, what its frame took. Each H2 is one
|
|
6
|
+
`GameDesign` node (schema 28). `c64_plan_budget` takes a design name and
|
|
7
|
+
budgets its phases; `c64_game_briefing` lists the designs of the archetype
|
|
8
|
+
it resolved.
|
|
9
|
+
|
|
10
|
+
Pages live in `docs/game-design/designs/`, one design per file. The marker
|
|
11
|
+
`<!-- doc-type: game-design -->` MUST appear in the first 10 lines.
|
|
12
|
+
|
|
13
|
+
## The lines under each H2
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
## Single-screen platformer scaffold (Oscar64)
|
|
17
|
+
|
|
18
|
+
**Game design:** `platformer_scaffold_oscar64`
|
|
19
|
+
**Instance of:** single_screen_platformer
|
|
20
|
+
**Realised by:** oscar64-platformer-scaffold
|
|
21
|
+
**Region:** both
|
|
22
|
+
**Composes:** tile_map_render (init), decimal_print, lfsr_random (init), kernal_file_write_seq (transition)
|
|
23
|
+
**Measured frame:** play pal worst=8693 typical=4966; play ntsc worst=10287 typical=6628 (measured-vice, CIA1 timer B around the loop body, recipes/oscar64/platformer-scaffold.md "Expected output")
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
| Line | Required | Becomes |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `**Game design:**` | yes | the node's `name`, snake_case. Without it the H2 is prose and is not ingested; with a `**Composes:**` line but no name, the extractor warns. |
|
|
29
|
+
| `**Instance of:**` | no | `INSTANCE_OF` edges to Archetype names from `c64-game-archetypes.md`. |
|
|
30
|
+
| `**Realised by:**` | no | `REALISED_BY` edges to canonical recipe names (`<toolchain>-<recipe>`). |
|
|
31
|
+
| `**Region:**` | no | `PAL`, `NTSC` or `both`: the region the budget uses when the caller names none. |
|
|
32
|
+
| `**Composes:**` | yes | `COMPOSES` edges, one per technique and phase. |
|
|
33
|
+
| `**Measured frame:**` | no | the node's `measured` property. More than one line is allowed. |
|
|
34
|
+
|
|
35
|
+
Every name is MATCHed at ingest, never created. A name that matches no
|
|
36
|
+
node is warned about and counted in the ingest summary as dropped.
|
|
37
|
+
|
|
38
|
+
## Composes
|
|
39
|
+
|
|
40
|
+
A comma-separated list of Technique names. A name alone runs in `play`,
|
|
41
|
+
the frame loop. `name (init)` runs once before play; `name (transition)`
|
|
42
|
+
runs between plays (a level load, a game-over save). A technique used in
|
|
43
|
+
two phases is listed twice, once per phase. Any other phase word is
|
|
44
|
+
refused with a warning.
|
|
45
|
+
|
|
46
|
+
List what the listing runs, not what the recipe's frontmatter says. Read
|
|
47
|
+
the frame loop. When the two differ, fix the frontmatter or say why in the
|
|
48
|
+
page's prose.
|
|
49
|
+
|
|
50
|
+
## Measured frame
|
|
51
|
+
|
|
52
|
+
`<phase> <pal|ntsc> worst=N [typical=N]`, entries separated by `;`, then
|
|
53
|
+
a parenthetical: the basis word first (`measured-vice`, `derived-listing`,
|
|
54
|
+
`arithmetic`, `estimated`), then the instrument and where the figures are.
|
|
55
|
+
A malformed line is refused whole, because part of it would read as the
|
|
56
|
+
whole measurement.
|
|
57
|
+
|
|
58
|
+
- `worst` is the largest frame the run recorded, in CPU cycles.
|
|
59
|
+
- `typical` is a common frame. Say in prose what it is: a mean, or one
|
|
60
|
+
frame's reading.
|
|
61
|
+
- State what the timed region holds. A figure that leaves out the HUD, the
|
|
62
|
+
IRQ or the badline stalls says so in prose under the lines.
|
|
63
|
+
- Figures come from the realising recipe's page, with its rung. A figure
|
|
64
|
+
this repo did not measure is `estimated` and names its source.
|
|
65
|
+
|
|
66
|
+
`c64_plan_budget` prints each measured figure beside its prediction for
|
|
67
|
+
the same phase and region. The two answer different questions: the
|
|
68
|
+
prediction adds up each technique's own recipe; the measurement is this
|
|
69
|
+
game's listing.
|
|
70
|
+
|
|
71
|
+
## What is not here
|
|
72
|
+
|
|
73
|
+
No claims, zero page or memory lines yet: those are per-technique
|
|
74
|
+
(`CONVENTIONS-techniques.md`) and per-recipe. `c64_check_compatibility`
|
|
75
|
+
takes the technique list.
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# Hardware Reference Conventions
|
|
2
|
+
|
|
3
|
+
All hardware reference docs in `docs/` follow these structural patterns so
|
|
4
|
+
the entity extractor in `src/graph/extract.ts` can parse them. Deviation
|
|
5
|
+
breaks the graph build.
|
|
6
|
+
|
|
7
|
+
## File-level frontmatter (optional)
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
---
|
|
11
|
+
chip: VIC-II # for chip refs only
|
|
12
|
+
region: PAL # for region-specific docs only
|
|
13
|
+
---
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Section structure
|
|
17
|
+
|
|
18
|
+
Top of file: `# Doc Title` (H1). One H1 per doc.
|
|
19
|
+
|
|
20
|
+
Followed by an "Overview" section (H2) describing what's covered.
|
|
21
|
+
|
|
22
|
+
Followed by a "Quick reference" section (H2) with tables.
|
|
23
|
+
|
|
24
|
+
Followed by detail sections (H2 per topic, H3 per item).
|
|
25
|
+
|
|
26
|
+
Followed by a "Pitfalls" cross-reference section (H2) at end.
|
|
27
|
+
|
|
28
|
+
## Register definitions
|
|
29
|
+
|
|
30
|
+
Every register gets an H3 in this exact format:
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
### $D011 — D011 — Screen Control Register 1 (RW)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Breakdown:
|
|
37
|
+
- `### ` (H3) at start of line
|
|
38
|
+
- ` $D011 ` — hex address, dollar-prefix, 4 hex digits, surrounded by spaces
|
|
39
|
+
- ` — ` — em-dash separator (Unicode U+2014)
|
|
40
|
+
- `D011` — canonical register name (no spaces; uppercase letters + digits)
|
|
41
|
+
- ` — ` — em-dash separator
|
|
42
|
+
- `Screen Control Register 1` — description (free-form)
|
|
43
|
+
- ` (` — opening paren
|
|
44
|
+
- `RW` — one of `R`, `W`, or `RW`
|
|
45
|
+
- `)` — closing paren
|
|
46
|
+
|
|
47
|
+
Following each register H3 block, an optional `**Chip:** VIC-II` line
|
|
48
|
+
identifies the owning chip. If absent, the extractor falls back to the
|
|
49
|
+
doc's frontmatter `chip` field.
|
|
50
|
+
|
|
51
|
+
Bit definitions use a sub-H4 or a table. Example:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
### $D011 — D011 — Screen Control Register 1 (RW)
|
|
55
|
+
|
|
56
|
+
**Chip:** VIC-II
|
|
57
|
+
|
|
58
|
+
| Bit | Name | Description |
|
|
59
|
+
|-----|------|-------------|
|
|
60
|
+
| 7 | RST8 | Bit 8 of raster line |
|
|
61
|
+
| 6 | ECM | Extended color mode |
|
|
62
|
+
| 5 | BMM | Bitmap mode |
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## KERNAL routine definitions
|
|
66
|
+
|
|
67
|
+
Every KERNAL routine gets an H3 in this exact format:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
### $FFD2 — CHROUT — Output a character
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Breakdown:
|
|
74
|
+
- `### ` (H3) at start of line
|
|
75
|
+
- ` $FFD2 ` — hex address (jump-table entry), 4 hex digits
|
|
76
|
+
- ` — ` — em-dash separator
|
|
77
|
+
- `CHROUT` — canonical routine name (uppercase letters)
|
|
78
|
+
- ` — ` — em-dash separator
|
|
79
|
+
- description
|
|
80
|
+
|
|
81
|
+
Following each routine H3, optional structured fields:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
**Input:** A = byte to print
|
|
85
|
+
**Output:** None
|
|
86
|
+
**Affects:** A
|
|
87
|
+
**Pairs with:** CHROUT
|
|
88
|
+
**Description:** ...
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
The `**Pairs with:**` marker is what `PAIRS_WITH` graph edges are extracted from.
|
|
92
|
+
Multiple pair names are comma-separated.
|
|
93
|
+
|
|
94
|
+
After `**Affects:**`, one or more `**Clobbers zero page:**` lines (schema
|
|
95
|
+
26) state the zero-page bytes the routine writes. Each becomes a
|
|
96
|
+
`CLOBBERS_ZP` edge to the `zero_page` HardwareUnit:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
**Clobbers zero page:** $B8-$BA (may; ROM walk from $FFBA, power-on vectors)
|
|
100
|
+
**Clobbers zero page:** $B8-$BA (must; VICE x64sc store trace, SETLFS 2,8,2)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- The value is `<bytes> (<bound>; <basis>)`. Bytes are `$XX` or
|
|
104
|
+
`$XX-$YY`, comma-separated, anywhere in `$00-$FF`, or `none`.
|
|
105
|
+
- `may` lines are not hand-written. `node scripts/kernal-zp-walk.ts
|
|
106
|
+
--write` sets one per routine from a static walk of the 901227-03 ROM;
|
|
107
|
+
`npm test` runs its `--check` and fails on any difference.
|
|
108
|
+
- `must` lines come from `node scripts/kernal-zp-trace.ts --write`, which
|
|
109
|
+
runs `scripts/kernal-zp-trace.asm` in VICE with a store trace. The basis
|
|
110
|
+
names the traced call. Every must byte has to lie inside the may set.
|
|
111
|
+
- A line that does not parse is warned about at ingest and dropped.
|
|
112
|
+
|
|
113
|
+
## Memory region definitions
|
|
114
|
+
|
|
115
|
+
Every memory region gets an H3 in this exact format:
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
### $0400-$07FF — Default Screen RAM
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Breakdown:
|
|
122
|
+
- `### ` (H3) at start of line
|
|
123
|
+
- ` $START-$END ` — start/end hex addresses, 4 hex digits each, separated by `-`
|
|
124
|
+
- ` — ` — em-dash separator
|
|
125
|
+
- description
|
|
126
|
+
|
|
127
|
+
Following each H3, optional structured fields:
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
**Default use:** Screen character codes (40x25 = 1000 bytes)
|
|
131
|
+
**Bank-switchable:** No
|
|
132
|
+
**Notes:** ...
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Opcode definitions (for 6510-cpu-reference.md and 6502-illegal-opcodes.md)
|
|
136
|
+
|
|
137
|
+
Every opcode gets an H3 in this exact format:
|
|
138
|
+
|
|
139
|
+
```
|
|
140
|
+
### $A9 — LDA #imm — Load Accumulator immediate
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Breakdown:
|
|
144
|
+
- `### ` (H3) at start of line
|
|
145
|
+
- ` $A9 ` — opcode byte, 2 hex digits
|
|
146
|
+
- ` — ` — em-dash separator
|
|
147
|
+
- `LDA #imm` — mnemonic with addressing mode
|
|
148
|
+
- ` — ` — em-dash separator
|
|
149
|
+
- description
|
|
150
|
+
|
|
151
|
+
Following each opcode H3:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
**Cycles:** 2
|
|
155
|
+
**Flags:** N Z
|
|
156
|
+
**Legal:** yes (or "no" for illegal opcodes — defaults to yes if absent)
|
|
157
|
+
**Page-cross:** +1 (or absent if no page-cross penalty)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## Pitfalls cross-reference
|
|
161
|
+
|
|
162
|
+
End-of-doc H2 `## Pitfalls` with bullet list:
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
## Pitfalls
|
|
166
|
+
|
|
167
|
+
- **$D012 raster wrap**: comparing $D012 against >=256 requires combining
|
|
168
|
+
with $D011 bit 7 — see `d012_wrap_around` in
|
|
169
|
+
[pitfalls/raster-and-badline.md](pitfalls/raster-and-badline.md).
|
|
170
|
+
- ...
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Cross-references between docs
|
|
174
|
+
|
|
175
|
+
Use relative markdown links: `[VIC-II screen mode](vic-ii-reference.md#screen-modes)`.
|
|
176
|
+
|
|
177
|
+
## File-end checklist
|
|
178
|
+
|
|
179
|
+
Every hardware reference doc must end with this comment so the extractor
|
|
180
|
+
can quickly verify it's a hardware-reference doc:
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
<!-- doc-type: hardware-reference -->
|
|
184
|
+
```
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Pitfall Reference Conventions
|
|
2
|
+
|
|
3
|
+
Pitfall docs live in `docs/pitfalls/<category>.md`. Each doc covers ONE
|
|
4
|
+
category (raster, sprite, sid, region, kernal, banking, cpu, loader,
|
|
5
|
+
input, render, scroll, cia, maths, logic) and contains multiple Pitfall
|
|
6
|
+
entries as H2 sections. The extractor parses each H2 as one Pitfall
|
|
7
|
+
node. The category is carried into the node as written; the extractor
|
|
8
|
+
keeps no whitelist, so this list is the set in use, not a constraint it
|
|
9
|
+
enforces (it read eight names until 2026-09-22 while twelve docs
|
|
10
|
+
existed; maths and logic were added on 2026-09-23 when their pages
|
|
11
|
+
were created). A new category is allowed when no existing page's
|
|
12
|
+
intro covers the fault: copy the marker and front matter from the
|
|
13
|
+
newest page and add the name here.
|
|
14
|
+
|
|
15
|
+
The marker `<!-- doc-type: pitfall-reference -->` MUST appear in the
|
|
16
|
+
first 10 lines for the extractor to process the file.
|
|
17
|
+
|
|
18
|
+
## File-level frontmatter
|
|
19
|
+
|
|
20
|
+
```yaml
|
|
21
|
+
---
|
|
22
|
+
category: raster # raster | sprite | sid | region | kernal | banking | cpu | loader | input | render | scroll | cia | maths | logic
|
|
23
|
+
---
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Pitfall entries
|
|
27
|
+
|
|
28
|
+
Every Pitfall in the doc gets an H2 in this exact format:
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
## badline_cycle_loss — Badline DMA steals 40-43 cycles from the CPU
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Breakdown:
|
|
35
|
+
- `## ` (H2)
|
|
36
|
+
- `badline_cycle_loss` — snake_case canonical name (matches ontology Pitfall.title surrogate; the extractor uses the snake_case form as the node primary key and the prose form as the human-readable title)
|
|
37
|
+
- ` — ` — em-dash separator (Unicode U+2014)
|
|
38
|
+
- Free-form one-line title
|
|
39
|
+
|
|
40
|
+
Following each Pitfall H2 block:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
**Severity:** critical # critical | high | medium | low
|
|
44
|
+
**Region:** both # PAL | NTSC | both (use 'both' if the pitfall manifests in either region)
|
|
45
|
+
**Triggered by registers:** D011, D012
|
|
46
|
+
**Triggered by kernal:** CHKIN
|
|
47
|
+
**Triggered by techniques:** stable_raster_irq, sprite_multiplex_8
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
All `Triggered by …` lines are optional and additive — the extractor emits one TRIGGERED_BY edge per item. At least ONE Triggered-by line must be present (otherwise the pitfall has no graph anchor and won't surface through `c64_pitfalls_for`). The other direction matters too: a technique no pitfall names cannot reach any pitfall through the graph, and `c64_pitfalls_for` falls back to a semantic guess for it. `npm run check:pitfall-anchors` lists those techniques and fails on a name that matches no Technique H2; when you add a technique, add it to the Triggered-by line of every pitfall whose mechanism its code meets.
|
|
51
|
+
|
|
52
|
+
After the `Triggered by …` lines, one optional additive line names the
|
|
53
|
+
technique(s) whose application is the Fix section's remedy:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
**Mitigated by techniques:** double_irq
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Comma-separated existing Technique names; the extractor emits one
|
|
60
|
+
MITIGATED_BY edge per item, Pitfall to Technique, and nothing else — a
|
|
61
|
+
register or KERNAL routine is never a remedy in this sense. The line
|
|
62
|
+
separates two relations one vocabulary used to carry: the technique in
|
|
63
|
+
whose code the pitfall arises (Triggered by) and the technique that cures
|
|
64
|
+
it (Mitigated by). A technique on the Mitigated-by line may also be on
|
|
65
|
+
the Triggered-by line when the pitfall arises inside a naive version of
|
|
66
|
+
the technique and a correct version cures it — `sprite_dma_overflow` and
|
|
67
|
+
`sprite_multiplex_8`, `raster_irq_first_line_jitter` and
|
|
68
|
+
`stable_raster_irq`, `jmp_indirect_page_boundary_bug` and
|
|
69
|
+
`jump_table_dispatch`, three of the six pitfalls that carry the line — and
|
|
70
|
+
Mechanism should say so; otherwise a technique is on one line or the
|
|
71
|
+
other. If the remedy is not a Technique node — the SID hard restart
|
|
72
|
+
lives in `hardware/sid-reference.md`, "take `$0318`" in
|
|
73
|
+
`restore_nmi_not_maskable` is a handler, not a technique — write nothing;
|
|
74
|
+
do not invent a technique to have something to point at. A name that
|
|
75
|
+
matches no Technique node is dropped at link time with a warning and
|
|
76
|
+
counted in the ingest summary beside triggered_by. `c64_pitfalls_for`
|
|
77
|
+
returns a pitfall for its remedy technique as well as for its triggers,
|
|
78
|
+
with the two lists kept apart; `c64_technique_lookup` lists the pitfalls a
|
|
79
|
+
technique mitigates.
|
|
80
|
+
|
|
81
|
+
## Section structure inside a Pitfall
|
|
82
|
+
|
|
83
|
+
After the H2 + metadata lines, free-form prose covering:
|
|
84
|
+
|
|
85
|
+
1. **Symptom** — what the developer sees when this bites
|
|
86
|
+
2. **Mechanism** — what's actually happening at the hardware level
|
|
87
|
+
3. **Fix** — concrete code/timing change
|
|
88
|
+
4. **Worked example** — short asm or C snippet showing both the bad pattern and the fix
|
|
89
|
+
5. **Cross-references** — related techniques, registers, recipes
|
|
90
|
+
|
|
91
|
+
A pitfall whose bad pattern can be recognised in source text may also have a lint rule, named after the pitfall and pointing at its page; the rules live in `src/tools/lint.ts` and are served as `c64_lint_source` (CLI `lint <file>`). Nothing on the page declares the rule, and a pitfall without one is the common case.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Recipe Conventions
|
|
2
|
+
|
|
3
|
+
Recipes live in `docs/recipes/<toolchain>/<recipe-name>.md`. Each recipe is a
|
|
4
|
+
complete, buildable example with source, build command, expected output, and a
|
|
5
|
+
description of why it's done this way. The same conceptual demo MAY have one
|
|
6
|
+
recipe per toolchain (e.g. `oscar64/raster-bars.md`, `kickassembler/raster-bars.md`)
|
|
7
|
+
— they are distinct Recipe nodes IMPLEMENTS-edged to the same Technique.
|
|
8
|
+
|
|
9
|
+
The marker `<!-- doc-type: recipe -->` MUST appear immediately after the
|
|
10
|
+
frontmatter — line 12 of every recipe, after the ten frontmatter lines and
|
|
11
|
+
one blank; the extractor matches it anywhere in the file. An earlier
|
|
12
|
+
version of this line said "in the first 10 lines", which no recipe
|
|
13
|
+
satisfied.
|
|
14
|
+
|
|
15
|
+
## File-level frontmatter (required)
|
|
16
|
+
|
|
17
|
+
```yaml
|
|
18
|
+
---
|
|
19
|
+
recipe: hello-world # short identifier, lowercase, hyphen-separated
|
|
20
|
+
toolchain: oscar64 # canonical toolchain name (matches a Tool node; becomes a REQUIRES_TOOL edge)
|
|
21
|
+
output_format: PRG # one of PRG, CRT, BIN, D64
|
|
22
|
+
region: both # pal | ntsc | both
|
|
23
|
+
techniques: [] # array of Technique names this recipe implements (Phase 2: empty for hello-worlds)
|
|
24
|
+
file_formats: [PRG] # FileFormat nodes this recipe produces
|
|
25
|
+
uses_registers: [] # array of Register canonical names referenced
|
|
26
|
+
uses_kernal: [CHROUT] # array of KernalRoutine names called
|
|
27
|
+
scaffolds: [] # optional: Archetype names this recipe is a starting point for
|
|
28
|
+
---
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`recipe`, `toolchain`, `output_format`, and `region` are required. The rest may be
|
|
32
|
+
empty arrays but the keys must be present.
|
|
33
|
+
|
|
34
|
+
`scaffolds` is the exception: it is optional, and absent reads as empty.
|
|
35
|
+
Set it only on a recipe that is a whole playable game an agent should copy
|
|
36
|
+
and change rather than start from nothing, such as `simple-shmup`. Each
|
|
37
|
+
entry must be the `name` of an Archetype on an archetype page
|
|
38
|
+
(`CONVENTIONS-archetypes.md`); the ingest links `Recipe -[:SCAFFOLDS]->
|
|
39
|
+
Archetype`, drops a name that matches no Archetype with a warning, and
|
|
40
|
+
`c64_game_briefing` offers the recipe as the first build step for that
|
|
41
|
+
archetype.
|
|
42
|
+
|
|
43
|
+
## Section structure
|
|
44
|
+
|
|
45
|
+
After the frontmatter:
|
|
46
|
+
|
|
47
|
+
1. `# <Human-readable title>` (H1, exactly one)
|
|
48
|
+
2. `## Synopsis` — one paragraph: what this recipe demonstrates and when to use it
|
|
49
|
+
3. `## Source` — a single fenced code block with the complete source listing
|
|
50
|
+
4. `## Build` — the exact shell command(s) to produce the artifact
|
|
51
|
+
5. `## Expected output` — what you should see on screen / in the .prg
|
|
52
|
+
6. `## Why this works` — one to three paragraphs walking through the load-bearing
|
|
53
|
+
lines, calling out chip-specific quirks or toolchain idioms
|
|
54
|
+
|
|
55
|
+
Recipes are atomic — no "and another variation". Variations are separate recipes.
|
|
56
|
+
|
|
57
|
+
## Naming
|
|
58
|
+
|
|
59
|
+
The filename matches the `recipe:` frontmatter value. Directory matches `toolchain:`.
|
|
60
|
+
`oscar64/hello-world.md` produces a Recipe node with `name: oscar64-hello-world`
|
|
61
|
+
(directory and basename joined with `-`).
|
|
62
|
+
|
|
63
|
+
## Verification (required)
|
|
64
|
+
|
|
65
|
+
A recipe page is not done when it reads well. Before it lands:
|
|
66
|
+
|
|
67
|
+
1. The listing is extracted from the page and built with the toolchain the
|
|
68
|
+
page names — `npm run check:listings` does exactly that and is run by
|
|
69
|
+
`npm test`. A listing that does not build does not land.
|
|
70
|
+
2. For anything that draws, the PRG is run headless in VICE with the
|
|
71
|
+
pinned command (`x64sc -default -warp +sound +autostart-delay-random
|
|
72
|
+
-autostartprgmode 1 -limitcycles N [-model ntsc] -exitscreenshot
|
|
73
|
+
out.png -autostart recipe.prg`) and the screenshot is measured against
|
|
74
|
+
the "Expected output" section; the PNG goes in
|
|
75
|
+
`recipes/<toolchain>/screenshots/<recipe>.png` and the page names it.
|
|
76
|
+
The cycle count, models, extra flags and any fresh disk are pinned per
|
|
77
|
+
recipe in `recipes/runs.json`, and `npm run verify:recipes` re-runs
|
|
78
|
+
every recipe from that manifest and fails on a pixel that differs from
|
|
79
|
+
the committed PNG. A recipe whose listing builds a cartridge instead of
|
|
80
|
+
a PRG is pinned with a `"cartridge"` key: `{"file": "x.crt", "write":
|
|
81
|
+
true, "runs": 2}`. The verifier takes `x.crt` from the build's work
|
|
82
|
+
directory (a KickAssembler listing writes it with `outBin`), boots a
|
|
83
|
+
fresh copy of it per model with `-cartcrt` in place of `-autostart`,
|
|
84
|
+
adds `-easyflashcrtwrite` when `write` is true so VICE saves the flash
|
|
85
|
+
back into the copy, and boots that copy `runs` times in sequence. Run 1
|
|
86
|
+
is shot key `pal`; run N is `pal-runN`, default path
|
|
87
|
+
`screenshots/<recipe>[-<model>]-runN.png`. The pixel geometry, the
|
|
88
|
+
palette RGB values per model and a decode snippet are in `runtime/vice-reference.md`, section
|
|
89
|
+
"Reading the exit screenshot"; a program that reports its own verdict
|
|
90
|
+
through a result byte and the border colour, with a harness that turns
|
|
91
|
+
it into a shell exit code, is the section "Verifying a run without a
|
|
92
|
+
human" on the same page and the two `headless-verify` recipes.
|
|
93
|
+
A recipe the verifier cannot run because it needs an input the harness
|
|
94
|
+
has no key for (a TAP on the datasette, a prepared disk image, a key
|
|
95
|
+
press) is listed in `runs.json` with a `"skip"` key whose value says why;
|
|
96
|
+
the verifier reports it as skipped rather than failed, the listing gate
|
|
97
|
+
still builds its Source listing, the page keeps its own pictures under
|
|
98
|
+
`figures/` with the exact command that made them, and its "Expected
|
|
99
|
+
output" says it is not pinned.
|
|
100
|
+
3. Any timing constant that was found by trying values (a sync padding, a
|
|
101
|
+
line padding) is labelled as measured in VICE, with what the picture
|
|
102
|
+
looks like when it is off by one. VICE is the instrument; the pages do
|
|
103
|
+
not claim bench measurements.
|
|
104
|
+
4. If the page corrects an earlier version, it says what was wrong. That
|
|
105
|
+
history is worth more to the next reader than a clean surface.
|
|
106
|
+
|