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,551 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: text-window-menu
|
|
3
|
+
toolchain: oscar64
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [text_window_and_menu]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D012, D020, D021, DC00, DD04, DD05, DD0E]
|
|
9
|
+
uses_kernal: [GETIN]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# Oscar64 Text-Mode Window with a Table-Driven Menu
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A pause window opened over a busy text-mode background. Opening it
|
|
19
|
+
saves the screen and colour cells under it, draws a box with the PETSCII
|
|
20
|
+
line-drawing glyphs and puts a five-item menu inside. The highlight is a
|
|
21
|
+
row of colour RAM, moved by joystick 2 or the cursor keys; fire or
|
|
22
|
+
RETURN calls the handler in the item's table row. Closing it puts the
|
|
23
|
+
saved cells back. The program keeps a copy of the whole screen from
|
|
24
|
+
before the open, compares it byte for byte after the close, times the
|
|
25
|
+
open and the close on CIA 2 timer A, and reports the verdict three ways:
|
|
26
|
+
`$02FF` (`01` pass, `02` fail), the border colour, and three rows of
|
|
27
|
+
text. By default a script drives the joystick (down, down, fire), so a
|
|
28
|
+
headless run picks the third item; built with `-dAUTOPILOT=0` it reads
|
|
29
|
+
the real port and was driven with the cursor keys through `-keybuf`.
|
|
30
|
+
|
|
31
|
+
## Source
|
|
32
|
+
|
|
33
|
+
```c
|
|
34
|
+
// text-window-menu.c
|
|
35
|
+
//
|
|
36
|
+
// A text-mode window over a busy background. Opening it saves the screen
|
|
37
|
+
// and colour cells under it, draws a PETSCII box with the line-drawing
|
|
38
|
+
// glyphs and a five-item table-driven menu inside; the highlight is moved
|
|
39
|
+
// by joystick 2 (up, down) or the cursor keys, and fire or RETURN picks the
|
|
40
|
+
// item. Closing it restores the saved cells. The program keeps a copy of
|
|
41
|
+
// the whole screen taken before the window opened and compares it byte for
|
|
42
|
+
// byte after the close, times the open, each menu step and the close on
|
|
43
|
+
// CIA 2 timer A, and reports
|
|
44
|
+
// the verdict at $02FF (01 pass, 02 fail), in the border colour and on the
|
|
45
|
+
// bottom rows.
|
|
46
|
+
//
|
|
47
|
+
// AUTOPILOT=1 (the default) replaces the joystick read with a script:
|
|
48
|
+
// down, down, fire, so the expected selection is item 3. Build with
|
|
49
|
+
// -dAUTOPILOT=0 to read the real port and drive it with the cursor keys.
|
|
50
|
+
//
|
|
51
|
+
// Build: oscar64 -tm=c64 -O2 -o=text-window-menu.prg text-window-menu.c
|
|
52
|
+
#include <c64/vic.h>
|
|
53
|
+
#include <c64/cia.h>
|
|
54
|
+
#include <conio.h>
|
|
55
|
+
|
|
56
|
+
#ifndef AUTOPILOT
|
|
57
|
+
#define AUTOPILOT 1
|
|
58
|
+
#endif
|
|
59
|
+
|
|
60
|
+
#define Screen ((char *)0x0400)
|
|
61
|
+
#define Color ((char *)0xD800)
|
|
62
|
+
#define COLS 40
|
|
63
|
+
#define ROWS 25
|
|
64
|
+
#define CELLS (COLS * ROWS)
|
|
65
|
+
|
|
66
|
+
#define RESULT (*(volatile char *)0x02ff)
|
|
67
|
+
#define CODE_PASS 0x01
|
|
68
|
+
#define CODE_FAIL 0x02
|
|
69
|
+
|
|
70
|
+
// The window: outer frame position and size, in cells.
|
|
71
|
+
#define WIN_X 10
|
|
72
|
+
#define WIN_Y 7
|
|
73
|
+
#define WIN_W 20
|
|
74
|
+
#define WIN_H 9
|
|
75
|
+
#define WIN_CELLS (WIN_W * WIN_H)
|
|
76
|
+
|
|
77
|
+
// Box glyphs as screen codes: PETSCII $B0 $AE $AD $BD less $40, $C0 $DD less $80.
|
|
78
|
+
#define GL_TL 0x70
|
|
79
|
+
#define GL_TR 0x6E
|
|
80
|
+
#define GL_BL 0x6D
|
|
81
|
+
#define GL_BR 0x7D
|
|
82
|
+
#define GL_H 0x40
|
|
83
|
+
#define GL_V 0x5D
|
|
84
|
+
|
|
85
|
+
#define WIN_INK VCOL_WHITE
|
|
86
|
+
#define WIN_HILITE VCOL_YELLOW
|
|
87
|
+
#define WIN_FRAME VCOL_LT_BLUE
|
|
88
|
+
|
|
89
|
+
#define EXPECTED_ITEM 2 // third item, 0-based
|
|
90
|
+
|
|
91
|
+
// Joystick bits, active low in $DC00.
|
|
92
|
+
#define JOY_UP 0x01
|
|
93
|
+
#define JOY_DOWN 0x02
|
|
94
|
+
#define JOY_FIRE 0x10
|
|
95
|
+
#define JOY_MASK 0x1f
|
|
96
|
+
|
|
97
|
+
// ------------------------------------------------------------ menu table
|
|
98
|
+
|
|
99
|
+
typedef void (*Handler)(void);
|
|
100
|
+
|
|
101
|
+
static char picked = 0xff;
|
|
102
|
+
|
|
103
|
+
static void act_resume(void) { picked = 0; }
|
|
104
|
+
static void act_restart(void) { picked = 1; }
|
|
105
|
+
static void act_sound(void) { picked = 2; }
|
|
106
|
+
static void act_options(void) { picked = 3; }
|
|
107
|
+
static void act_quit(void) { picked = 4; }
|
|
108
|
+
|
|
109
|
+
struct MenuItem {
|
|
110
|
+
const char *label; // screen codes, NUL-terminated
|
|
111
|
+
Handler handler;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
#define ITEMS 5
|
|
115
|
+
static const struct MenuItem menu[ITEMS] = {
|
|
116
|
+
{ S"RESUME GAME", act_resume },
|
|
117
|
+
{ S"RESTART", act_restart },
|
|
118
|
+
{ S"SOUND ON/OFF", act_sound },
|
|
119
|
+
{ S"OPTIONS", act_options },
|
|
120
|
+
{ S"QUIT", act_quit },
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
// -------------------------------------------------------------- buffers
|
|
124
|
+
|
|
125
|
+
static char under_scr[WIN_CELLS]; // save-under: screen codes
|
|
126
|
+
static char under_col[WIN_CELLS]; // save-under: colour nibbles
|
|
127
|
+
static char snap_scr[CELLS]; // whole-screen copy taken before open
|
|
128
|
+
static char snap_col[CELLS];
|
|
129
|
+
|
|
130
|
+
static char cursor; // highlighted item, 0..ITEMS-1
|
|
131
|
+
|
|
132
|
+
// --------------------------------------------------------------- timing
|
|
133
|
+
|
|
134
|
+
static void t_start(void)
|
|
135
|
+
{
|
|
136
|
+
cia2.cra = 0x00; // stop timer A
|
|
137
|
+
cia2.ta = 0xffff; // latch $FFFF
|
|
138
|
+
cia2.cra = 0x11; // force load, start, count phi2
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
static unsigned t_stop(void)
|
|
142
|
+
{
|
|
143
|
+
cia2.cra = 0x00; // stop before the two byte reads
|
|
144
|
+
return 0xffff - cia2.ta;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// --------------------------------------------------------------- output
|
|
148
|
+
|
|
149
|
+
static void put_text(char row, char col, const char *s, char ink)
|
|
150
|
+
{
|
|
151
|
+
unsigned o = (unsigned)row * COLS + col;
|
|
152
|
+
while (*s) {
|
|
153
|
+
Screen[o] = *s++;
|
|
154
|
+
Color[o] = ink;
|
|
155
|
+
o++;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
static void put_dec(char row, char col, unsigned v, char ink)
|
|
160
|
+
{
|
|
161
|
+
char buf[6];
|
|
162
|
+
char n = 0;
|
|
163
|
+
do { buf[n++] = '0' + v % 10; v /= 10; } while (v);
|
|
164
|
+
unsigned o = (unsigned)row * COLS + col;
|
|
165
|
+
while (n) { Screen[o] = buf[--n]; Color[o] = ink; o++; }
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// ----------------------------------------------------------- background
|
|
169
|
+
|
|
170
|
+
// A tile pattern: four glyphs and a colour that walks with the cell, so
|
|
171
|
+
// every cell under the window differs from its neighbours.
|
|
172
|
+
static void draw_background(void)
|
|
173
|
+
{
|
|
174
|
+
static const char tile[4] = { 0x66, 0x5B, 0x51, 0x7B };
|
|
175
|
+
unsigned o = 0;
|
|
176
|
+
for (char y = 0; y < ROWS; y++)
|
|
177
|
+
for (char x = 0; x < COLS; x++) {
|
|
178
|
+
Screen[o] = tile[(x + y) & 3];
|
|
179
|
+
Color[o] = (x * 3 + y * 5) & 15;
|
|
180
|
+
o++;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
static void snapshot(void)
|
|
185
|
+
{
|
|
186
|
+
for (unsigned i = 0; i < CELLS; i++) {
|
|
187
|
+
snap_scr[i] = Screen[i];
|
|
188
|
+
snap_col[i] = Color[i] & 15;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
static bool snapshot_matches(void)
|
|
193
|
+
{
|
|
194
|
+
for (unsigned i = 0; i < CELLS; i++)
|
|
195
|
+
if (snap_scr[i] != Screen[i] || snap_col[i] != (Color[i] & 15))
|
|
196
|
+
return false;
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// --------------------------------------------------------------- window
|
|
201
|
+
|
|
202
|
+
static void highlight(char item, char ink)
|
|
203
|
+
{
|
|
204
|
+
unsigned o = (unsigned)(WIN_Y + 2 + item) * COLS + WIN_X + 1;
|
|
205
|
+
for (char x = 0; x < WIN_W - 2; x++)
|
|
206
|
+
Color[o + x] = ink;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Save the cells under the window, then draw the frame, the title, the
|
|
210
|
+
// items and the highlight.
|
|
211
|
+
static void window_open(void)
|
|
212
|
+
{
|
|
213
|
+
char *s = Screen + WIN_Y * COLS + WIN_X;
|
|
214
|
+
char *c = Color + WIN_Y * COLS + WIN_X;
|
|
215
|
+
char *us = under_scr, *uc = under_col;
|
|
216
|
+
|
|
217
|
+
for (char y = 0; y < WIN_H; y++) {
|
|
218
|
+
for (char x = 0; x < WIN_W; x++) {
|
|
219
|
+
us[x] = s[x];
|
|
220
|
+
uc[x] = c[x];
|
|
221
|
+
s[x] = 0x20;
|
|
222
|
+
c[x] = WIN_INK;
|
|
223
|
+
}
|
|
224
|
+
s[0] = GL_V; s[WIN_W - 1] = GL_V;
|
|
225
|
+
c[0] = WIN_FRAME; c[WIN_W - 1] = WIN_FRAME;
|
|
226
|
+
us += WIN_W; uc += WIN_W;
|
|
227
|
+
s += COLS; c += COLS;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
s = Screen + WIN_Y * COLS + WIN_X;
|
|
231
|
+
c = Color + WIN_Y * COLS + WIN_X;
|
|
232
|
+
char *b = s + (WIN_H - 1) * COLS;
|
|
233
|
+
char *bc = c + (WIN_H - 1) * COLS;
|
|
234
|
+
for (char x = 1; x < WIN_W - 1; x++) {
|
|
235
|
+
s[x] = GL_H; b[x] = GL_H;
|
|
236
|
+
c[x] = WIN_FRAME; bc[x] = WIN_FRAME;
|
|
237
|
+
}
|
|
238
|
+
s[0] = GL_TL; s[WIN_W - 1] = GL_TR;
|
|
239
|
+
b[0] = GL_BL; b[WIN_W - 1] = GL_BR;
|
|
240
|
+
c[0] = WIN_FRAME; c[WIN_W - 1] = WIN_FRAME;
|
|
241
|
+
bc[0] = WIN_FRAME; bc[WIN_W - 1] = WIN_FRAME;
|
|
242
|
+
|
|
243
|
+
put_text(WIN_Y, WIN_X + 6, S" PAUSED ", WIN_INK);
|
|
244
|
+
for (char i = 0; i < ITEMS; i++)
|
|
245
|
+
put_text(WIN_Y + 2 + i, WIN_X + 3, menu[i].label, WIN_INK);
|
|
246
|
+
highlight(cursor, WIN_HILITE);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Put the saved cells back.
|
|
250
|
+
static void window_close(void)
|
|
251
|
+
{
|
|
252
|
+
char *s = Screen + WIN_Y * COLS + WIN_X;
|
|
253
|
+
char *c = Color + WIN_Y * COLS + WIN_X;
|
|
254
|
+
const char *us = under_scr, *uc = under_col;
|
|
255
|
+
|
|
256
|
+
for (char y = 0; y < WIN_H; y++) {
|
|
257
|
+
for (char x = 0; x < WIN_W; x++) {
|
|
258
|
+
s[x] = us[x];
|
|
259
|
+
c[x] = uc[x];
|
|
260
|
+
}
|
|
261
|
+
us += WIN_W; uc += WIN_W;
|
|
262
|
+
s += COLS; c += COLS;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// ---------------------------------------------------------------- input
|
|
267
|
+
|
|
268
|
+
#if AUTOPILOT
|
|
269
|
+
// { frames, port byte } as $DC00 reads it, active low.
|
|
270
|
+
static const char script[7][2] = {
|
|
271
|
+
{ 40, 0xff }, { 4, 0xfd }, { 30, 0xff }, { 4, 0xfd },
|
|
272
|
+
{ 30, 0xff }, { 4, 0xef }, { 30, 0xff }
|
|
273
|
+
};
|
|
274
|
+
static char ap_index, ap_used;
|
|
275
|
+
|
|
276
|
+
static char port_read(void)
|
|
277
|
+
{
|
|
278
|
+
char out = 0xff;
|
|
279
|
+
if (ap_index < 7) {
|
|
280
|
+
out = script[ap_index][1];
|
|
281
|
+
if (++ap_used == script[ap_index][0]) { ap_used = 0; ap_index++; }
|
|
282
|
+
}
|
|
283
|
+
return out;
|
|
284
|
+
}
|
|
285
|
+
#else
|
|
286
|
+
static char port_read(void)
|
|
287
|
+
{
|
|
288
|
+
cia1.pra = 0xff; // no keyboard column selected
|
|
289
|
+
return cia1.pra; // control port 2, active low
|
|
290
|
+
}
|
|
291
|
+
#endif
|
|
292
|
+
|
|
293
|
+
static void wait_frame(void)
|
|
294
|
+
{
|
|
295
|
+
while (vic.raster == 250) ;
|
|
296
|
+
while (vic.raster != 250) ;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// One step of the menu: returns true when an item has been chosen.
|
|
300
|
+
static bool menu_step(char *prev)
|
|
301
|
+
{
|
|
302
|
+
char cur = port_read();
|
|
303
|
+
char newp = ~cur & *prev & JOY_MASK; // pressed now, not pressed before
|
|
304
|
+
*prev = cur;
|
|
305
|
+
|
|
306
|
+
char k = getchx(); // 0 with no key waiting
|
|
307
|
+
if (k == 0x11) newp |= JOY_DOWN; // cursor down
|
|
308
|
+
if (k == 0x91) newp |= JOY_UP; // cursor up (shifted)
|
|
309
|
+
if (k == 0x0d || k == 0x0a) newp |= JOY_FIRE; // RETURN, either code
|
|
310
|
+
|
|
311
|
+
if (newp & JOY_DOWN) {
|
|
312
|
+
highlight(cursor, WIN_INK);
|
|
313
|
+
cursor = (cursor + 1 < ITEMS) ? cursor + 1 : 0;
|
|
314
|
+
highlight(cursor, WIN_HILITE);
|
|
315
|
+
} else if (newp & JOY_UP) {
|
|
316
|
+
highlight(cursor, WIN_INK);
|
|
317
|
+
cursor = cursor ? cursor - 1 : ITEMS - 1;
|
|
318
|
+
highlight(cursor, WIN_HILITE);
|
|
319
|
+
}
|
|
320
|
+
if (newp & JOY_FIRE) {
|
|
321
|
+
menu[cursor].handler();
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// ----------------------------------------------------------------- main
|
|
328
|
+
|
|
329
|
+
int main(void)
|
|
330
|
+
{
|
|
331
|
+
unsigned t_open, t_close, t_step = 0, t;
|
|
332
|
+
char prev = 0xff;
|
|
333
|
+
|
|
334
|
+
vic.color_border = VCOL_BLACK;
|
|
335
|
+
vic.color_back = VCOL_BLACK;
|
|
336
|
+
draw_background();
|
|
337
|
+
snapshot();
|
|
338
|
+
|
|
339
|
+
cursor = 0;
|
|
340
|
+
wait_frame(); // time from raster line 250 on both models
|
|
341
|
+
__asm { sei }
|
|
342
|
+
t_start();
|
|
343
|
+
window_open();
|
|
344
|
+
t_open = t_stop();
|
|
345
|
+
__asm { cli }
|
|
346
|
+
|
|
347
|
+
for (;;) {
|
|
348
|
+
wait_frame(); // time each step from line 250 too
|
|
349
|
+
__asm { sei }
|
|
350
|
+
t_start();
|
|
351
|
+
bool done = menu_step(&prev);
|
|
352
|
+
t = t_stop();
|
|
353
|
+
__asm { cli }
|
|
354
|
+
if (t > t_step) t_step = t; // keep the worst frame
|
|
355
|
+
if (done)
|
|
356
|
+
break;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
wait_frame();
|
|
360
|
+
__asm { sei }
|
|
361
|
+
t_start();
|
|
362
|
+
window_close();
|
|
363
|
+
t_close = t_stop();
|
|
364
|
+
__asm { cli }
|
|
365
|
+
|
|
366
|
+
bool same = snapshot_matches();
|
|
367
|
+
char code = (same && picked == EXPECTED_ITEM) ? CODE_PASS : CODE_FAIL;
|
|
368
|
+
|
|
369
|
+
RESULT = code;
|
|
370
|
+
vic.color_border = (code == CODE_PASS) ? VCOL_GREEN : VCOL_RED;
|
|
371
|
+
|
|
372
|
+
// Report on the bottom rows, after the compare has been made.
|
|
373
|
+
put_text(22, 0, S"RESTORE ", VCOL_WHITE);
|
|
374
|
+
put_text(22, 8, same ? S"EXACT " : S"DIFFERS ", VCOL_WHITE);
|
|
375
|
+
put_text(22, 17, S"PICKED ", VCOL_WHITE);
|
|
376
|
+
put_dec(22, 24, picked + 1, VCOL_WHITE);
|
|
377
|
+
put_text(23, 0, S"OPEN ", VCOL_WHITE);
|
|
378
|
+
put_dec(23, 6, t_open, VCOL_WHITE);
|
|
379
|
+
put_text(23, 12, S"CLOSE ", VCOL_WHITE);
|
|
380
|
+
put_dec(23, 18, t_close, VCOL_WHITE);
|
|
381
|
+
put_text(23, 24, S"STEP ", VCOL_WHITE);
|
|
382
|
+
put_dec(23, 29, t_step, VCOL_WHITE);
|
|
383
|
+
put_text(24, 0, S"RESULT ", VCOL_WHITE);
|
|
384
|
+
put_text(24, 7, code == CODE_PASS ? S"01 PASS " : S"02 FAIL ", VCOL_WHITE);
|
|
385
|
+
|
|
386
|
+
for (;;) ;
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
## Build
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
oscar64 -tm=c64 -O2 -o=text-window-menu.prg text-window-menu.c
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
Produces `text-window-menu.prg`, 2,098 bytes (Oscar64 1.32.271 local
|
|
397
|
+
build). `-dAUTOPILOT=0` gives the real-port build, 2,069 bytes.
|
|
398
|
+
|
|
399
|
+
## Expected output
|
|
400
|
+
|
|
401
|
+
Pinned command, both models:
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
405
|
+
-limitcycles 4250000 [-model ntsc] -exitscreenshot text-window-menu.png \
|
|
406
|
+
-autostart text-window-menu.prg
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Screenshots: `screenshots/text-window-menu.png` (PAL) and
|
|
410
|
+
`screenshots/text-window-menu-ntsc.png`. Both were made twice and the
|
|
411
|
+
two files were byte-identical each time.
|
|
412
|
+
|
|
413
|
+
At 4,250,000 cycles the window is open and the script has pressed down
|
|
414
|
+
once, so the picture is:
|
|
415
|
+
|
|
416
|
+
- black border and background, and every cell of the 40 by 25 screen
|
|
417
|
+
carrying one of four glyphs (screen codes `$66`, `$5B`, `$51`, `$7B`)
|
|
418
|
+
in a colour that walks with the cell;
|
|
419
|
+
- the window at columns 10 to 29, rows 7 to 15, its frame in light blue:
|
|
420
|
+
corners `$70`, `$6E`, `$6D`, `$7D`, sides `$5D`, top and bottom `$40`.
|
|
421
|
+
Each of the six frame cells was matched bit for bit against the
|
|
422
|
+
character ROM glyph of its code in both screenshots;
|
|
423
|
+
- the title ` PAUSED ` on the top frame row, five labels on rows 9 to
|
|
424
|
+
13 in white, and the second label, `RESTART`, in yellow across the
|
|
425
|
+
window's inner width (columns 11 to 28). The label ink measured by a
|
|
426
|
+
PIL script is white (255, 255, 255) on rows 9, 11, 12 and 13 and
|
|
427
|
+
yellow on row 10: (255, 255, 70) PAL, (255, 248, 141) NTSC.
|
|
428
|
+
|
|
429
|
+
The screenshot lands inside a 30-frame hold of the script (frames 44 to
|
|
430
|
+
74 after the menu starts), so consecutive fields draw the same thing; at
|
|
431
|
+
3,500,000 cycles the highlight was still on the first row and at
|
|
432
|
+
4,000,000 and 4,500,000 on the second.
|
|
433
|
+
|
|
434
|
+
An unpinned run at 16,000,000 cycles shows the end state: the
|
|
435
|
+
background restored, the border green, and rows 22 to 24 reading
|
|
436
|
+
|
|
437
|
+
```text
|
|
438
|
+
RESTORE EXACT PICKED 3
|
|
439
|
+
OPEN 14916 CLOSE 5759 STEP 833
|
|
440
|
+
RESULT 01 PASS
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
on PAL, and `OPEN 15175 CLOSE 5931 STEP 833` on NTSC. The border pixel at
|
|
444
|
+
(2, 100) is (98, 213, 50) PAL and (114, 189, 103) NTSC, index 5 in both
|
|
445
|
+
palettes. `RESTORE EXACT` is the byte-for-byte compare of 1,000 screen
|
|
446
|
+
codes and 1,000 colour nibbles against the copy taken before the open;
|
|
447
|
+
`PICKED 3` is the third handler, the one two downs and a fire reach.
|
|
448
|
+
|
|
449
|
+
The keyboard path was run once, unpinned, PAL, with the
|
|
450
|
+
`-dAUTOPILOT=0` build and `-keybuf '\x11\x11\x0d'` (cursor down twice
|
|
451
|
+
and RETURN through the KERNAL queue): `RESTORE EXACT PICKED 3`,
|
|
452
|
+
`OPEN 14916 CLOSE 5759 STEP 864`, `RESULT 01 PASS`, border green. The
|
|
453
|
+
step is 31 cycles more than the script build's because `port_read` there
|
|
454
|
+
writes and reads CIA 1 instead of indexing a table. Cursor up (`$91`) is
|
|
455
|
+
handled by the same line and was not exercised.
|
|
456
|
+
|
|
457
|
+
### The three costs
|
|
458
|
+
|
|
459
|
+
All three figures are CIA 2 timer A counting phi2 with interrupts
|
|
460
|
+
disabled, started after a wait for raster line 250, so each timed
|
|
461
|
+
section begins at the same place in the frame on every run. They
|
|
462
|
+
include the badline stalls the section crosses, which is why two of
|
|
463
|
+
them differ between models:
|
|
464
|
+
|
|
465
|
+
- Step, 833 cycles on both models: the worst frame of the menu loop,
|
|
466
|
+
which is `menu_step` from the port read through `getchx()` to the
|
|
467
|
+
two `highlight` passes of 18 colour writes each on a move. The
|
|
468
|
+
program keeps the largest step of the run, so the figure is the move
|
|
469
|
+
frame; the idle frames and the fire frame do less and were not
|
|
470
|
+
timed separately. From line 250, 833 cycles is about thirteen lines
|
|
471
|
+
(arithmetic), all of them in the lower border or above the display,
|
|
472
|
+
so no badline is inside it and PAL and NTSC agree. This is the
|
|
473
|
+
per-frame cost of the technique while the window is open.
|
|
474
|
+
- Close, PAL, 5,759 cycles for 180 cells, 32 cycles a cell. From line
|
|
475
|
+
250 there are 113 lines (250 to 311 and 0 to 50) before the first
|
|
476
|
+
badline on line 51, which is 7,119 cycles at 63 a line (arithmetic),
|
|
477
|
+
so the close finishes with no badline in it and the figure is pure
|
|
478
|
+
CPU. On NTSC the same window is 64 lines at 65 cycles, 4,160 cycles,
|
|
479
|
+
so the last 1,771 cycles of the close cross the display area and the
|
|
480
|
+
figure is 172 higher.
|
|
481
|
+
- Open, PAL, 14,916 cycles: the save of 180 cells, the clear, the
|
|
482
|
+
frame, the title, five labels and the highlight. Its last 7,797
|
|
483
|
+
cycles run in the display area, about 124 lines (arithmetic), so
|
|
484
|
+
fifteen or sixteen badlines at 40 to 43 cycles each are inside the
|
|
485
|
+
figure; the CPU work alone is about 14,300 cycles, not measured
|
|
486
|
+
separately.
|
|
487
|
+
|
|
488
|
+
The first build timed the open from wherever the program happened to be
|
|
489
|
+
in the frame and gave 14,880, 14,962 and 15,136 for the same code on
|
|
490
|
+
three runs. That spread is badline count, not the routine; the wait for
|
|
491
|
+
line 250 removed it.
|
|
492
|
+
|
|
493
|
+
## Why this works
|
|
494
|
+
|
|
495
|
+
- **The save-under is sized by the window, not the screen.** `under_scr`
|
|
496
|
+
and `under_col` are `WIN_W * WIN_H` bytes each; the open copies each
|
|
497
|
+
window row from screen and colour RAM before it writes the row, and
|
|
498
|
+
the close copies them back with the same row stride (`COLS` on the
|
|
499
|
+
screen side, `WIN_W` on the buffer side). Nothing else about the
|
|
500
|
+
screen is touched, so the compare against the whole-screen copy
|
|
501
|
+
passes on all 1,000 cells, including the 820 outside the window.
|
|
502
|
+
- **Colour RAM is four bits wide.** The RAM at `$D800` stores only a
|
|
503
|
+
low nibble (`hardware/c64-memory-map.md`, "Color RAM (4 bits wide)"),
|
|
504
|
+
so the upper four bits of a read are not the value that was written.
|
|
505
|
+
The snapshot and the compare both mask with `& 15`. Without the mask
|
|
506
|
+
the compare can fail on cells the program never wrote.
|
|
507
|
+
- **The box glyphs are screen codes, not PETSCII.** The corner and line
|
|
508
|
+
characters are PETSCII `$B0`, `$AE`, `$AD`, `$BD`, `$C0` and `$DD`;
|
|
509
|
+
stored in screen RAM they must be the screen codes `$70`, `$6E`,
|
|
510
|
+
`$6D`, `$7D`, `$40` and `$5D` (the PETSCII `$A0` to `$BF` corners map
|
|
511
|
+
down by `$40` and the `$C0` to `$DF` bars map down by `$80`;
|
|
512
|
+
`petscii_screen_code_conversion` in
|
|
513
|
+
`techniques/text.md`). The labels use Oscar64's `S"..."` literal,
|
|
514
|
+
which gives screen codes directly; the lowercase `s"..."` prefix
|
|
515
|
+
case-flips first and prints uppercase ASCII as the shifted graphics
|
|
516
|
+
glyphs (`recipes/oscar64/text-overlay-playfield.md`, "Why this
|
|
517
|
+
works").
|
|
518
|
+
- **The menu is a table.** `menu[]` holds a label pointer and a handler
|
|
519
|
+
per item; `menu_step` moves `cursor` and, on fire, calls
|
|
520
|
+
`menu[cursor].handler()`. Adding an item is one row and one function.
|
|
521
|
+
The handlers here only record which was called; a game's handlers
|
|
522
|
+
change its state and the caller closes the window afterwards.
|
|
523
|
+
- **The highlight is a row of colour RAM.** Moving it writes eighteen
|
|
524
|
+
colour bytes for the old row and eighteen for the new; the screen
|
|
525
|
+
codes do not change. A reverse-video highlight would flip bit 7 of
|
|
526
|
+
the screen codes instead and need its own restore.
|
|
527
|
+
- **Joystick and keyboard land in one event byte.** The port read is
|
|
528
|
+
edge-detected against the previous frame's byte
|
|
529
|
+
(`~cur & prev & 0x1F`: pressed now, not pressed before), then
|
|
530
|
+
`getchx()` (GETIN, `$FFE4`) is folded in: PETSCII `$11` is cursor
|
|
531
|
+
down, `$91` cursor up, and RETURN arrives as `$0D` from the KERNAL or
|
|
532
|
+
`$0A` under Oscar64's default character map
|
|
533
|
+
(`pitfalls/kernal-and-io.md`, `getchx_petscii_remaps_return`). The
|
|
534
|
+
menu code below that line does not know which device spoke.
|
|
535
|
+
- **The KERNAL IRQ stays on for the keyboard, off for the timer.** The
|
|
536
|
+
keyboard queue needs SCNKEY, so the IRQ runs during the menu. Each
|
|
537
|
+
timed section (the open, every menu step, the close) does `sei`
|
|
538
|
+
first so that a jiffy interrupt does not land inside the count, and
|
|
539
|
+
`cli` after it, so the interrupt is delayed by the length of the
|
|
540
|
+
section, never lost. They time on CIA 2's timer A, which the KERNAL
|
|
541
|
+
does not use; CIA 1 timer A is the jiffy clock and stopping it would
|
|
542
|
+
stop the keyboard scan.
|
|
543
|
+
- **`-keybuf` reaches the program.** VICE feeds the string into the
|
|
544
|
+
KERNAL keyboard queue after the autostart's `RUN`, so the menu's
|
|
545
|
+
`getchx()` reads the three keys once it is polling. That is the same
|
|
546
|
+
route `recipes/oscar64/text-input.md` uses.
|
|
547
|
+
|
|
548
|
+
The autopilot script, like the one in `recipes/oscar64/headless-verify.md`,
|
|
549
|
+
runs each press for four frames and each pause for thirty. Four frames of
|
|
550
|
+
a held direction produce one event, because the edge detector fires only
|
|
551
|
+
on the frame the bit goes low.
|