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,40 @@
|
|
|
1
|
+
// display.h: the character set, sprite shapes, text and the score panel.
|
|
2
|
+
#ifndef DISPLAY_H
|
|
3
|
+
#define DISPLAY_H
|
|
4
|
+
|
|
5
|
+
#include "game.h"
|
|
6
|
+
|
|
7
|
+
// Character codes. 0-63 are the ROM's letters, digits and punctuation, copied
|
|
8
|
+
// so the panel, the title and check.py read them; 64 up are this game's.
|
|
9
|
+
enum {
|
|
10
|
+
G_WATER = 32, // the ROM space: all background colour
|
|
11
|
+
G_LAND = 64, G_GRASS, G_TREE, G_ROCK, G_EDGE_L, G_EDGE_R, G_SPARKLE,
|
|
12
|
+
G_LIFE = 96, // hires: a ship, for the panel's lives
|
|
13
|
+
G_RULE, // hires: the panel's top rule
|
|
14
|
+
G_DOTS = 0xc0, // $C0-$CF: an enemy dot over open water, pair * 4 + row / 2
|
|
15
|
+
G_BOLTS = 0xd0, // $D0-$D3: a bolt over open water, by pair
|
|
16
|
+
G_BULLET = 0xf8 // $F8-$FB: one reserved glyph per bolt ($F2-$F7 the
|
|
17
|
+
}; // dots'); $FF stays blank ($BFFF is the idle byte)
|
|
18
|
+
|
|
19
|
+
// Sprite frames: block SPR_BLOCK + frame.
|
|
20
|
+
enum { F_SHIP, F_DART, F_SAUCER, F_BUG, F_BOOM1, F_BOOM2, SPR_FRAMES };
|
|
21
|
+
|
|
22
|
+
// Playfield colours: background, $D022 (01), $D023 (10); colour RAM (11)
|
|
23
|
+
// is yellow for every playfield cell, and bullets draw in it.
|
|
24
|
+
#define PF_BG_COL VCOL_BLUE
|
|
25
|
+
#define PF_MC1 VCOL_BROWN
|
|
26
|
+
#define PF_MC2 VCOL_GREEN
|
|
27
|
+
#define PF_CRAM 0x0f // multicolour + yellow
|
|
28
|
+
#define TEXT_CRAM VCOL_WHITE // below 8: a hires cell inside the playfield
|
|
29
|
+
|
|
30
|
+
void display_init(void); // VIC bank 2, charset, sprites
|
|
31
|
+
void put_text(char *screen, char row, char col, const char *s);
|
|
32
|
+
void text_colour(char row, char col, char n, char colour);
|
|
33
|
+
void put_dec(char *p, unsigned v, char digits);
|
|
34
|
+
void panel_draw(void); // the whole panel
|
|
35
|
+
void panel_add(char tens); // score digits, after add_score (shown by panel_update)
|
|
36
|
+
void panel_update(void); // score digits and lives, when changed
|
|
37
|
+
|
|
38
|
+
#pragma compile("display.c")
|
|
39
|
+
|
|
40
|
+
#endif
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// game.h: what every module of shmup-vertical shares. Memory map, the
|
|
2
|
+
// kernel's variables (build/asm.h, generated from src/kernel.asm), and the
|
|
3
|
+
// game state. Each module's own header pulls its .c in with
|
|
4
|
+
// #pragma compile: Oscar64 has no object linker.
|
|
5
|
+
#ifndef GAME_H
|
|
6
|
+
#define GAME_H
|
|
7
|
+
|
|
8
|
+
#include <c64/vic.h>
|
|
9
|
+
#include <c64/cia.h>
|
|
10
|
+
#include "asm.h" // ASM_<LABEL> for every label in src/*.asm
|
|
11
|
+
|
|
12
|
+
#ifndef AUTOPILOT
|
|
13
|
+
#define AUTOPILOT 0
|
|
14
|
+
#endif
|
|
15
|
+
#ifndef FORCE_FAULT
|
|
16
|
+
#define FORCE_FAULT 0
|
|
17
|
+
#endif
|
|
18
|
+
|
|
19
|
+
// ---- memory map ------------------------------------------------------------
|
|
20
|
+
// $0801-$087F Oscar64 startup $0880-$1FFF the kernel blob (asm)
|
|
21
|
+
// $2000-$7FFF C code, data, stack $8000-$BFFF VIC bank 2:
|
|
22
|
+
// $8000 playfield screen 0, $8400 playfield screen 1, $8800 panel screen,
|
|
23
|
+
// $8C00 meter scratch row (AUTOPILOT), $A000 sprite shapes, $B800 characters.
|
|
24
|
+
// The VIC sees the character ROM at $9000-$9FFF in bank 2, so nothing it
|
|
25
|
+
// shows lives there; C keeps its level map there.
|
|
26
|
+
#define PF0 ((char *)0x8000)
|
|
27
|
+
#define PF1 ((char *)0x8400)
|
|
28
|
+
#define PANEL ((char *)0x8800)
|
|
29
|
+
#define SCRATCH ((char *)0x8c00)
|
|
30
|
+
#define SPRITES ((char *)0xa000)
|
|
31
|
+
#define CHARSET ((char *)0xb800)
|
|
32
|
+
#define COLOUR ((char *)0xd800)
|
|
33
|
+
#define LEVEL_RAM ((char *)0x9000)
|
|
34
|
+
#define SPR_BLOCK 128 // $A000 / 64 inside the bank
|
|
35
|
+
#define D018_PF0 0x0e // screen $8000, characters $B800
|
|
36
|
+
#define D018_PF1 0x1e // screen $8400
|
|
37
|
+
#define RESULT (*(volatile char *)0x02ff) // $01 pass, $02 fail
|
|
38
|
+
|
|
39
|
+
// ---- the kernel's variables (src/kernel.asm, mux.asm, sound.asm) -------------
|
|
40
|
+
#define K_BYTE(a) (*(volatile char *)(a))
|
|
41
|
+
#define K_WORD(a) (*(volatile unsigned *)(a))
|
|
42
|
+
#define K_PF_D011 K_BYTE(ASM_PF_D011)
|
|
43
|
+
#define K_PF_D018 K_BYTE(ASM_PF_D018)
|
|
44
|
+
#define K_PF_BG K_BYTE(ASM_PF_BG)
|
|
45
|
+
#define K_FRAME_FLAG K_BYTE(ASM_FRAME_FLAG)
|
|
46
|
+
#define K_FRAME_CNT K_BYTE(ASM_FRAME_CNT)
|
|
47
|
+
#define K_MTR_OPEN K_BYTE(ASM_MTR_OPEN)
|
|
48
|
+
#define K_IRQ_CNT K_BYTE(ASM_IRQ_CNT)
|
|
49
|
+
#define K_IRQ_CYC K_WORD(ASM_IRQ_CYC)
|
|
50
|
+
#define K_IRQ_CAL K_BYTE(ASM_IRQ_CAL)
|
|
51
|
+
#define K_SPLIT_PREV K_BYTE(ASM_SPLIT_PREV)
|
|
52
|
+
#define K_MUX_READY K_BYTE(ASM_MUX_READY)
|
|
53
|
+
#define K_MUX_SHOWN K_BYTE(ASM_MUX_SHOWN)
|
|
54
|
+
#define K_MUX_PEAK K_BYTE(ASM_MUX_PEAK)
|
|
55
|
+
#define K_SFX_TAKEN K_BYTE(ASM_SFX_TAKEN)
|
|
56
|
+
// C writes the actor table and then calls mux_sort; the IRQs read only the
|
|
57
|
+
// sorted copy mux_build makes, so the table need not be volatile.
|
|
58
|
+
#define ACT_Y ((char *)ASM_ACT_Y)
|
|
59
|
+
#define ACT_HX ((char *)ASM_ACT_HX) // sprite X = 2 * hx
|
|
60
|
+
#define ACT_PTR ((char *)ASM_ACT_PTR)
|
|
61
|
+
#define ACT_COL ((char *)ASM_ACT_COL)
|
|
62
|
+
#define N_ACTORS 13 // mux.asm's N: the ship and NE enemies
|
|
63
|
+
#define OFF_Y 0xff // mux.asm's OFF_Y: not shown
|
|
64
|
+
#define MAX_SY 187 // mux.asm's MAX_SY: lowest sprite Y shown
|
|
65
|
+
|
|
66
|
+
// ---- coordinates ---------------------------------------------------------
|
|
67
|
+
// Horizontal positions are half X ("hx"): sprite X = 2 * hx, one byte for the
|
|
68
|
+
// whole screen, and one hx is one multicolour pixel. Vertical positions are
|
|
69
|
+
// sprite Y registers for sprites and raster lines for bullets; a sprite at Y
|
|
70
|
+
// is drawn on lines Y + 1 to Y + 21.
|
|
71
|
+
|
|
72
|
+
// ---- game state (main.c) ---------------------------------------------------
|
|
73
|
+
enum { ST_TITLE, ST_PLAY, ST_OVER, ST_FROZEN };
|
|
74
|
+
extern char state;
|
|
75
|
+
extern char lives, deaths;
|
|
76
|
+
extern unsigned score, hiscore; // in tens of points: the panel adds a 0
|
|
77
|
+
extern unsigned play_frames;
|
|
78
|
+
|
|
79
|
+
#define START_LIVES 3
|
|
80
|
+
|
|
81
|
+
void sfx(char n); // 1 shot, 2 explosion, 3 ship lost
|
|
82
|
+
void add_score(char tens);
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
#endif
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
// glyph.asm: the character bullets, imported by kernel.asm. bb_run moves
|
|
2
|
+
// and draws the ship's bolts, eb_run the enemies' dots (bullets.c fires
|
|
3
|
+
// them and keeps the rules). For each bullet they set cb_r and cb_c (screen
|
|
4
|
+
// row and column), cb_glyph (its reserved code), cb_mask (the pixel pair)
|
|
5
|
+
// and cb_row / cb_n (the glyph rows to set), then call cb_draw. That saves
|
|
6
|
+
// the code under the bullet, copies its glyph into the reserved one, ORs the
|
|
7
|
+
// pair into the rows, writes the reserved code into the cell, and notes the
|
|
8
|
+
// cell and the code it found on a list. cb_erase restores the list
|
|
9
|
+
// backwards; cb_check then compares every cell on it with the map's code,
|
|
10
|
+
// which cb_draw notes only when C sets cb_keep (the autopilot build, whose
|
|
11
|
+
// verdict runs the check every frame). The same work in C cost about 380
|
|
12
|
+
// cycles a bullet (PROFILE build, VICE x64sc 3.10). No zero page: the loops
|
|
13
|
+
// patch their own operands. Over open water (code 32, blank) nothing needs
|
|
14
|
+
// merging: the cell gets cb_fixed, one of the ready-made shot glyphs
|
|
15
|
+
// display.c builds, and the reserved glyph is left alone. Most shots are
|
|
16
|
+
// over the river.
|
|
17
|
+
//
|
|
18
|
+
// Before cb_begin, C sets cb_front (0 or 1: the screen now showing), cb_top
|
|
19
|
+
// (the map row that screen shows in its row 0: cur_row + 20, 0-115) and
|
|
20
|
+
// cb_y (the YSCROLL showing).
|
|
21
|
+
|
|
22
|
+
.const CHARSET = $b800
|
|
23
|
+
.const LEVEL_RAM = $9000 // level.c: map row m at LEVEL_RAM + 40 * (95 - m)
|
|
24
|
+
.const LEVEL_ROWS = 96
|
|
25
|
+
.const CB_MAX = 10 // bullets.h NB + NEB
|
|
26
|
+
.const G_WATER = 32 // display.h: open water, a blank cell
|
|
27
|
+
.const G_DOTS = $c0 // display.h: 16 dots, $C0 + pair * 4 + row / 2
|
|
28
|
+
.const G_BOLTS = $d0 // display.h: 4 bolts, $D0 + pair
|
|
29
|
+
|
|
30
|
+
cb_front: .byte 0
|
|
31
|
+
cb_top: .byte 0
|
|
32
|
+
cb_r: .byte 0
|
|
33
|
+
cb_c: .byte 0
|
|
34
|
+
cb_glyph: .byte 0
|
|
35
|
+
cb_mask: .byte 0
|
|
36
|
+
cb_row: .byte 0
|
|
37
|
+
cb_n: .byte 0
|
|
38
|
+
cb_dn: .byte 0 // cells on the list
|
|
39
|
+
cb_fault: .byte 0 // cb_check: 1 when a cell is not the map's
|
|
40
|
+
cb_fixed: .byte 0 // the ready-made glyph for this shot over open water
|
|
41
|
+
cb_keep: .byte 0 // 1: note the map's code for cb_check (about 40 cycles a draw)
|
|
42
|
+
|
|
43
|
+
cb_lo: .fill CB_MAX, 0 // the list: cell address, code found, map code
|
|
44
|
+
cb_hi_t: .fill CB_MAX, 0
|
|
45
|
+
cb_under: .fill CB_MAX, 0
|
|
46
|
+
cb_map: .fill CB_MAX, 0
|
|
47
|
+
|
|
48
|
+
pf_lo: .fill 21, <($8000 + 40 * i)
|
|
49
|
+
.fill 21, <($8400 + 40 * i)
|
|
50
|
+
pf_hi: .fill 21, >($8000 + 40 * i)
|
|
51
|
+
.fill 21, >($8400 + 40 * i)
|
|
52
|
+
cg_lo: .fill 256, <(CHARSET + 8 * i) // each code's glyph address: shifting
|
|
53
|
+
cg_hi: .fill 256, >(CHARSET + 8 * i) // it cost 35 cycles more a draw
|
|
54
|
+
map_lo: .fill LEVEL_ROWS, <(LEVEL_RAM + 40 * (LEVEL_ROWS - 1 - i))
|
|
55
|
+
map_hi: .fill LEVEL_ROWS, >(LEVEL_RAM + 40 * (LEVEL_ROWS - 1 - i))
|
|
56
|
+
|
|
57
|
+
cb_begin:
|
|
58
|
+
lda #0
|
|
59
|
+
sta cb_dn
|
|
60
|
+
rts
|
|
61
|
+
|
|
62
|
+
cb_draw:
|
|
63
|
+
ldx cb_r // the cell: row r of the showing screen, column c
|
|
64
|
+
lda cb_front
|
|
65
|
+
beq !+
|
|
66
|
+
txa
|
|
67
|
+
clc
|
|
68
|
+
adc #21
|
|
69
|
+
tax
|
|
70
|
+
!: lda pf_lo,x
|
|
71
|
+
clc
|
|
72
|
+
adc cb_c
|
|
73
|
+
sta cb_rd+1
|
|
74
|
+
sta cb_wr+1
|
|
75
|
+
lda pf_hi,x
|
|
76
|
+
adc #0
|
|
77
|
+
sta cb_rd+2
|
|
78
|
+
sta cb_wr+2
|
|
79
|
+
ldy cb_dn // on the list
|
|
80
|
+
lda cb_rd+1
|
|
81
|
+
sta cb_lo,y
|
|
82
|
+
lda cb_rd+2
|
|
83
|
+
sta cb_hi_t,y
|
|
84
|
+
lda cb_keep // only for cb_check (the autopilot's verdict)
|
|
85
|
+
beq cb_rd
|
|
86
|
+
lda cb_top // the map's code: map row cb_top - r, wrapped
|
|
87
|
+
sec
|
|
88
|
+
sbc cb_r
|
|
89
|
+
cmp #LEVEL_ROWS
|
|
90
|
+
bcc !+
|
|
91
|
+
sbc #LEVEL_ROWS
|
|
92
|
+
!: tax
|
|
93
|
+
lda map_lo,x
|
|
94
|
+
sta cb_mp+1
|
|
95
|
+
lda map_hi,x
|
|
96
|
+
sta cb_mp+2
|
|
97
|
+
ldx cb_c
|
|
98
|
+
cb_mp: lda $ffff,x
|
|
99
|
+
sta cb_map,y
|
|
100
|
+
cb_rd: lda $ffff // the code under the bullet
|
|
101
|
+
sta cb_under,y
|
|
102
|
+
inc cb_dn
|
|
103
|
+
cmp #G_WATER // open water: a ready-made glyph, no merge
|
|
104
|
+
bne cb_merge
|
|
105
|
+
lda cb_fixed
|
|
106
|
+
jmp cb_wr
|
|
107
|
+
cb_merge:
|
|
108
|
+
tax // its glyph: CHARSET + code * 8, from tables
|
|
109
|
+
lda cg_lo,x
|
|
110
|
+
sta cb_ld+1
|
|
111
|
+
lda cg_hi,x
|
|
112
|
+
sta cb_ld+2
|
|
113
|
+
ldx cb_glyph // the reserved glyph
|
|
114
|
+
lda cg_lo,x
|
|
115
|
+
sta cb_st+1
|
|
116
|
+
sta cb_or+1
|
|
117
|
+
sta cb_os+1
|
|
118
|
+
lda cg_hi,x
|
|
119
|
+
sta cb_st+2
|
|
120
|
+
sta cb_or+2
|
|
121
|
+
sta cb_os+2
|
|
122
|
+
ldx #7
|
|
123
|
+
cb_ld: lda $ffff,x
|
|
124
|
+
cb_st: sta $ffff,x
|
|
125
|
+
dex
|
|
126
|
+
bpl cb_ld
|
|
127
|
+
ldx cb_row
|
|
128
|
+
ldy cb_n
|
|
129
|
+
cb_or: lda $ffff,x
|
|
130
|
+
ora cb_mask
|
|
131
|
+
cb_os: sta $ffff,x
|
|
132
|
+
inx
|
|
133
|
+
dey
|
|
134
|
+
bne cb_or
|
|
135
|
+
lda cb_glyph
|
|
136
|
+
cb_wr: sta $ffff
|
|
137
|
+
rts
|
|
138
|
+
|
|
139
|
+
// Restore the list backwards, so bullets sharing a cell unwind.
|
|
140
|
+
cb_erase:
|
|
141
|
+
ldy cb_dn
|
|
142
|
+
beq cb_e_done
|
|
143
|
+
cb_e: dey
|
|
144
|
+
lda cb_lo,y
|
|
145
|
+
sta cb_ew+1
|
|
146
|
+
lda cb_hi_t,y
|
|
147
|
+
sta cb_ew+2
|
|
148
|
+
lda cb_under,y
|
|
149
|
+
cb_ew: sta $ffff
|
|
150
|
+
cpy #0
|
|
151
|
+
bne cb_e
|
|
152
|
+
cb_e_done:
|
|
153
|
+
rts
|
|
154
|
+
|
|
155
|
+
// After cb_erase: every cell on the list holds the map's code again. Reads
|
|
156
|
+
// the screen back, so an erase that skipped a cell or ran in the wrong order
|
|
157
|
+
// leaves a reserved code and sets cb_fault.
|
|
158
|
+
cb_check:
|
|
159
|
+
ldy cb_dn
|
|
160
|
+
beq cb_c_done
|
|
161
|
+
cb_cl: dey
|
|
162
|
+
lda cb_lo,y
|
|
163
|
+
sta cb_cr+1
|
|
164
|
+
lda cb_hi_t,y
|
|
165
|
+
sta cb_cr+2
|
|
166
|
+
cb_cr: lda $ffff
|
|
167
|
+
cmp cb_map,y
|
|
168
|
+
beq !+
|
|
169
|
+
lda #1
|
|
170
|
+
sta cb_fault
|
|
171
|
+
!: cpy #0
|
|
172
|
+
bne cb_cl
|
|
173
|
+
cb_c_done:
|
|
174
|
+
rts
|
|
175
|
+
|
|
176
|
+
// ---- the ship's bolts ------------------------------------------------------
|
|
177
|
+
// bullets.c fires them (bb_live/bb_hx/bb_line); bb_run, called once a frame
|
|
178
|
+
// before eb_run with cb_y = the YSCROLL showing, moves each bolt 7 lines up,
|
|
179
|
+
// drops it once its top row is in screen row 0 (half hidden) or it left
|
|
180
|
+
// row 19, draws it with cb_draw on rows 2-5 of its cell, and writes its box
|
|
181
|
+
// (hit.asm hb_*, slot 1 + bolt). In C this loop cost about 250 cycles a
|
|
182
|
+
// bolt more (PROFILE build, VICE x64sc 3.10).
|
|
183
|
+
.const NB = 4 // bullets.h NB
|
|
184
|
+
.const G_BULLET = $f8 // display.h: $F8-$FB, one per bolt
|
|
185
|
+
|
|
186
|
+
bb_live: .fill NB, 0
|
|
187
|
+
bb_hx: .fill NB, 0 // half X of the bolt's pixel pair
|
|
188
|
+
bb_line: .fill NB, 0 // raster line of the bolt's top row
|
|
189
|
+
bb_j: .byte 0
|
|
190
|
+
|
|
191
|
+
bb_run:
|
|
192
|
+
ldx #0
|
|
193
|
+
bb_loop:
|
|
194
|
+
lda bb_live,x
|
|
195
|
+
bne !+
|
|
196
|
+
jmp bb_next
|
|
197
|
+
!:
|
|
198
|
+
lda bb_line,x
|
|
199
|
+
sec
|
|
200
|
+
sbc #7
|
|
201
|
+
sta bb_line,x
|
|
202
|
+
sec // t = line - 50 - YSCROLL = 8 * row
|
|
203
|
+
sbc #50
|
|
204
|
+
sec
|
|
205
|
+
sbc cb_y
|
|
206
|
+
tay
|
|
207
|
+
sec // row 0 (t < 8) or past row 19 (t >= 160,
|
|
208
|
+
sbc #8 // or below 0, which wraps high): gone
|
|
209
|
+
cmp #152
|
|
210
|
+
bcc !+
|
|
211
|
+
jmp bb_kill
|
|
212
|
+
!: tya
|
|
213
|
+
lsr
|
|
214
|
+
lsr
|
|
215
|
+
lsr
|
|
216
|
+
sta cb_r
|
|
217
|
+
lda #2
|
|
218
|
+
sta cb_row
|
|
219
|
+
lda #4
|
|
220
|
+
sta cb_n
|
|
221
|
+
lda bb_hx,x // x = hx - 12: column x / 4, pair x & 3
|
|
222
|
+
sta hb_l+1,x // the box: one pixel pair, four lines
|
|
223
|
+
tay
|
|
224
|
+
iny
|
|
225
|
+
tya
|
|
226
|
+
sta hb_r+1,x
|
|
227
|
+
lda bb_line,x
|
|
228
|
+
sta hb_t+1,x
|
|
229
|
+
clc
|
|
230
|
+
adc #4
|
|
231
|
+
sta hb_b+1,x
|
|
232
|
+
lda #1
|
|
233
|
+
sta hb_on+1,x
|
|
234
|
+
lda bb_hx,x
|
|
235
|
+
sec
|
|
236
|
+
sbc #12
|
|
237
|
+
tay
|
|
238
|
+
lsr
|
|
239
|
+
lsr
|
|
240
|
+
sta cb_c
|
|
241
|
+
tya
|
|
242
|
+
and #3
|
|
243
|
+
tay
|
|
244
|
+
lda eb_mask,y
|
|
245
|
+
sta cb_mask
|
|
246
|
+
tya
|
|
247
|
+
clc
|
|
248
|
+
adc #G_BOLTS // the bolt over open water
|
|
249
|
+
sta cb_fixed
|
|
250
|
+
txa
|
|
251
|
+
clc
|
|
252
|
+
adc #G_BULLET
|
|
253
|
+
sta cb_glyph
|
|
254
|
+
stx bb_j
|
|
255
|
+
jsr cb_draw
|
|
256
|
+
ldx bb_j
|
|
257
|
+
jmp bb_next
|
|
258
|
+
bb_kill:
|
|
259
|
+
lda #0
|
|
260
|
+
sta bb_live,x
|
|
261
|
+
sta hb_on+1,x
|
|
262
|
+
bb_next:
|
|
263
|
+
inx
|
|
264
|
+
cpx #NB
|
|
265
|
+
beq !+
|
|
266
|
+
jmp bb_loop
|
|
267
|
+
!: rts
|
|
268
|
+
|
|
269
|
+
// ---- the enemies' bullets --------------------------------------------------
|
|
270
|
+
// bullets.c fires them (eb_live/eb_hx/eb_line/eb_dx) and calls eb_run once a
|
|
271
|
+
// frame after the bolts, with cb_y = the YSCROLL showing. eb_run moves each
|
|
272
|
+
// dot 2 lines down and eb_dx pixel pairs across, drops it past line EB_LAST
|
|
273
|
+
// or the screen's sides, and draws it with cb_draw: rows (t & 6) and the next
|
|
274
|
+
// of its cell, t = line - 48 - YSCROLL.
|
|
275
|
+
.const NEB = 6 // bullets.h NEB
|
|
276
|
+
.const G_EBULLET = $f2 // $F2-$F7
|
|
277
|
+
.const EB_LAST = 206 // a dot below line 206 is gone (screen row 19)
|
|
278
|
+
|
|
279
|
+
eb_live: .fill NEB, 0
|
|
280
|
+
eb_hx: .fill NEB, 0 // half X of the dot's pixel pair
|
|
281
|
+
eb_line: .fill NEB, 0 // raster line of the dot's top row
|
|
282
|
+
eb_dx: .fill NEB, 0 // -1, 0 or 1 pixel pair a frame
|
|
283
|
+
cb_y: .byte 0
|
|
284
|
+
eb_j: .byte 0
|
|
285
|
+
eb_mask: .byte $c0, $30, $0c, $03
|
|
286
|
+
eb_p4: .byte G_DOTS, G_DOTS + 4, G_DOTS + 8, G_DOTS + 12
|
|
287
|
+
|
|
288
|
+
eb_run:
|
|
289
|
+
ldx #0
|
|
290
|
+
eb_loop:
|
|
291
|
+
lda eb_live,x
|
|
292
|
+
bne !+
|
|
293
|
+
jmp eb_next
|
|
294
|
+
!:
|
|
295
|
+
lda eb_line,x
|
|
296
|
+
clc
|
|
297
|
+
adc #2
|
|
298
|
+
sta eb_line,x
|
|
299
|
+
cmp #EB_LAST+1
|
|
300
|
+
bcc !+
|
|
301
|
+
jmp eb_kill
|
|
302
|
+
!:
|
|
303
|
+
lda eb_hx,x
|
|
304
|
+
clc
|
|
305
|
+
adc eb_dx,x
|
|
306
|
+
sta eb_hx,x
|
|
307
|
+
cmp #12
|
|
308
|
+
bcc eb_kill
|
|
309
|
+
cmp #172
|
|
310
|
+
bcs eb_kill
|
|
311
|
+
sec // x = hx - 12: column x / 4, pair x & 3
|
|
312
|
+
sbc #12
|
|
313
|
+
tay
|
|
314
|
+
lsr
|
|
315
|
+
lsr
|
|
316
|
+
sta cb_c
|
|
317
|
+
tya
|
|
318
|
+
and #3
|
|
319
|
+
tay
|
|
320
|
+
lda eb_mask,y
|
|
321
|
+
sta cb_mask
|
|
322
|
+
lda eb_p4,y // the dot over water: G_DOTS + pair * 4 + row / 2
|
|
323
|
+
sta cb_fixed
|
|
324
|
+
lda eb_line,x // t = line - 48 - YSCROLL (line >= 84: no borrow
|
|
325
|
+
sec // from the first subtraction)
|
|
326
|
+
sbc #48
|
|
327
|
+
sbc cb_y
|
|
328
|
+
tay
|
|
329
|
+
lsr
|
|
330
|
+
lsr
|
|
331
|
+
lsr
|
|
332
|
+
sta cb_r
|
|
333
|
+
tya
|
|
334
|
+
and #6
|
|
335
|
+
sta cb_row
|
|
336
|
+
lsr
|
|
337
|
+
clc
|
|
338
|
+
adc cb_fixed
|
|
339
|
+
sta cb_fixed
|
|
340
|
+
lda #2
|
|
341
|
+
sta cb_n
|
|
342
|
+
txa
|
|
343
|
+
clc
|
|
344
|
+
adc #G_EBULLET
|
|
345
|
+
sta cb_glyph
|
|
346
|
+
stx eb_j
|
|
347
|
+
jsr cb_draw
|
|
348
|
+
ldx eb_j
|
|
349
|
+
jmp eb_next
|
|
350
|
+
eb_kill:
|
|
351
|
+
lda #0
|
|
352
|
+
sta eb_live,x
|
|
353
|
+
eb_next:
|
|
354
|
+
inx
|
|
355
|
+
cpx #NEB
|
|
356
|
+
beq !+
|
|
357
|
+
jmp eb_loop
|
|
358
|
+
!: rts
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// hiscore.c: the high score in the sequential file HISCORE on drive 8, with
|
|
2
|
+
// the policy of c64-kb's oscar64/high-score-persist recipe: the first named
|
|
3
|
+
// OPEN is also the device test (no drive: saving off, the bus is never
|
|
4
|
+
// touched again); the drive's reply separates 62 (no file: first run, write
|
|
5
|
+
// it) from 00 (a file: check its size, magic and version) from anything else
|
|
6
|
+
// (saving off). A file is replaced by scratch, then write.
|
|
7
|
+
//
|
|
8
|
+
// The game runs with the KERNAL banked out and its own raster IRQ chain.
|
|
9
|
+
// Around every file call the chain is stopped with $D01A = 0 (not SEI: the
|
|
10
|
+
// KERNAL's serial routines end in CLI) and the KERNAL is banked in; after,
|
|
11
|
+
// the KERNAL is banked out, SEI again, and the chain restarted. The screen
|
|
12
|
+
// holds still meanwhile: saving happens on the game-over screen.
|
|
13
|
+
//
|
|
14
|
+
// Sprites go off too. With the autopilot's eleven sprites left on, the
|
|
15
|
+
// KERNAL's serial transfers hung: NTSC in 3 of 3 runs (the clock wait in
|
|
16
|
+
// ACPTR), PAL in 1 of 3 (the EOI handshake in ISOUR). The review of this
|
|
17
|
+
// starter isolated the cause with a minimal program: sprite DMA on badline
|
|
18
|
+
// lines during the transfer. It hung with 3 to 8 sprites on screen, not with
|
|
19
|
+
// the sprites above the display (no badlines), not with the screen blanked,
|
|
20
|
+
// not with 0 or 1 sprite; and this game with sprites on but the screen
|
|
21
|
+
// blanked passed 3 of 3 on each model. Measured in VICE x64sc 3.10 with the
|
|
22
|
+
// true 1541; real hardware not measured.
|
|
23
|
+
//
|
|
24
|
+
// A splat file (the drive answers 60, WRITE FILE OPEN: a save cut off by a
|
|
25
|
+
// reset or power-off) is scratched and written again, as a missing one is.
|
|
26
|
+
|
|
27
|
+
#include "hiscore.h"
|
|
28
|
+
#include <c64/kernalio.h>
|
|
29
|
+
|
|
30
|
+
#define DRIVE 8
|
|
31
|
+
#define VERSION 1
|
|
32
|
+
|
|
33
|
+
bool disk_on = true;
|
|
34
|
+
char disk_code = 99;
|
|
35
|
+
|
|
36
|
+
static char record[5]; // 'S', 'V', version, hiscore low, high
|
|
37
|
+
static char back[8];
|
|
38
|
+
static char reply[40];
|
|
39
|
+
static char saved_01, saved_d01a;
|
|
40
|
+
|
|
41
|
+
static void io_begin(void)
|
|
42
|
+
{
|
|
43
|
+
__asm { sei }
|
|
44
|
+
saved_d01a = vic.intr_enable;
|
|
45
|
+
vic.intr_enable = 0; // no raster IRQ during the serial calls
|
|
46
|
+
vic.spr_enable = 0; // no sprite DMA either (see the top of this file)
|
|
47
|
+
saved_01 = *(volatile char *)0x01;
|
|
48
|
+
*(volatile char *)0x01 = 0x36; // KERNAL and I/O in
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static void io_end(void)
|
|
52
|
+
{
|
|
53
|
+
__asm { sei } // the serial routines left CLI behind
|
|
54
|
+
*(volatile char *)0x01 = saved_01;
|
|
55
|
+
cia1.icr = 0x7f; // no CIA1 interrupt, whatever the KERNAL set
|
|
56
|
+
char c = cia1.icr;
|
|
57
|
+
(void)c;
|
|
58
|
+
vic.intr_ctrl = 0x0f; // drop a raster match latched meanwhile
|
|
59
|
+
vic.intr_enable = saved_d01a;
|
|
60
|
+
if (saved_d01a & 0x01) // the chain was running: let it run again
|
|
61
|
+
__asm { cli }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Send cmd on the command channel ("" only reads the status) and read the
|
|
65
|
+
// reply line on the same open channel; disk_code = its two digits.
|
|
66
|
+
static void drive_reply(const char *cmd)
|
|
67
|
+
{
|
|
68
|
+
disk_code = 99;
|
|
69
|
+
krnio_setnam(cmd);
|
|
70
|
+
if (krnio_open(15, DRIVE, 15)) {
|
|
71
|
+
int n = krnio_gets(15, reply, sizeof(reply));
|
|
72
|
+
if (n >= 2)
|
|
73
|
+
disk_code = (reply[0] - '0') * 10 + (reply[1] - '0');
|
|
74
|
+
krnio_close(15);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
static void write_record(void)
|
|
79
|
+
{
|
|
80
|
+
record[0] = 'S';
|
|
81
|
+
record[1] = 'V';
|
|
82
|
+
record[2] = VERSION;
|
|
83
|
+
record[3] = (char)hiscore;
|
|
84
|
+
record[4] = (char)(hiscore >> 8);
|
|
85
|
+
drive_reply("S0:HISCORE"); // a missing file answers 01, harmless
|
|
86
|
+
krnio_setnam("HISCORE,S,W");
|
|
87
|
+
if (krnio_open(2, DRIVE, 2))
|
|
88
|
+
krnio_write(2, record, sizeof(record));
|
|
89
|
+
krnio_close(2);
|
|
90
|
+
drive_reply("");
|
|
91
|
+
disk_on = disk_code == 0;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void hiscore_load(void)
|
|
95
|
+
{
|
|
96
|
+
if (!disk_on)
|
|
97
|
+
return;
|
|
98
|
+
io_begin();
|
|
99
|
+
krnio_setnam("HISCORE,S,R");
|
|
100
|
+
bool ok = krnio_open(2, DRIVE, 2);
|
|
101
|
+
if (!ok && (krnio_status() & KRNIO_NODEVICE)) {
|
|
102
|
+
krnio_close(2); // nothing answered: never CHKIN (no timeout)
|
|
103
|
+
disk_on = false;
|
|
104
|
+
disk_code = 99;
|
|
105
|
+
io_end();
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
int n = ok ? krnio_read(2, back, sizeof(back)) : 0;
|
|
109
|
+
krnio_close(2);
|
|
110
|
+
drive_reply("");
|
|
111
|
+
if (disk_code == 0 && n == sizeof(record) && back[0] == 'S' && back[1] == 'V' && back[2] == VERSION)
|
|
112
|
+
hiscore = back[3] | (back[4] << 8);
|
|
113
|
+
else if (disk_code == 62 || disk_code == 0 || disk_code == 60)
|
|
114
|
+
write_record(); // first run, an old layout or a splat: write ours
|
|
115
|
+
else
|
|
116
|
+
disk_on = false; // 74 no disk, or anything unexpected
|
|
117
|
+
io_end();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
void hiscore_save(void)
|
|
121
|
+
{
|
|
122
|
+
if (!disk_on)
|
|
123
|
+
return;
|
|
124
|
+
io_begin();
|
|
125
|
+
write_record();
|
|
126
|
+
io_end();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
void hiscore_forget(void)
|
|
130
|
+
{
|
|
131
|
+
io_begin();
|
|
132
|
+
krnio_setnam("HISCORE,S,R"); // the device test, as in hiscore_load
|
|
133
|
+
bool ok = krnio_open(2, DRIVE, 2);
|
|
134
|
+
bool none = !ok && (krnio_status() & KRNIO_NODEVICE);
|
|
135
|
+
krnio_close(2);
|
|
136
|
+
if (none)
|
|
137
|
+
disk_on = false;
|
|
138
|
+
else
|
|
139
|
+
drive_reply("S0:HISCORE");
|
|
140
|
+
io_end();
|
|
141
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// hiscore.h: the high score in a file on drive 8.
|
|
2
|
+
#ifndef HISCORE_H
|
|
3
|
+
#define HISCORE_H
|
|
4
|
+
|
|
5
|
+
#include "game.h"
|
|
6
|
+
|
|
7
|
+
extern bool disk_on; // drive 8 answered: saving is on this session
|
|
8
|
+
extern char disk_code; // the drive's last reply: 0 OK, 62 no file, 99 none
|
|
9
|
+
|
|
10
|
+
void hiscore_load(void); // read HISCORE into hiscore; first run: write it
|
|
11
|
+
void hiscore_save(void); // replace HISCORE with hiscore (scratch, write)
|
|
12
|
+
void hiscore_forget(void); // scratch HISCORE (the autopilot's fresh start)
|
|
13
|
+
|
|
14
|
+
#pragma compile("hiscore.c")
|
|
15
|
+
|
|
16
|
+
#endif
|