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,1145 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: isometric-room
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [isometric_tile_engine, tile_map_render]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D018, D01B, D015, D000, D001, D010, D020, D021, DC04, DC05, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler -- Isometric room with painter's order and sprite depth
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Demonstrates the `isometric_tile_engine` technique on stock hardware: a fixed
|
|
19
|
+
8-by-8 cell map drawn in painter's diagonal order into a 40-by-25 text screen,
|
|
20
|
+
hardware sprite 0 as the player figure, and `$D01B` bit 0 toggled by a scan of
|
|
21
|
+
the cells in front of the player. Three tile shapes -- floor diamond (4 chars
|
|
22
|
+
wide by 2 tall), one-tile block (4 by 4), and two-tile tall block (4 by 6) --
|
|
23
|
+
are built from 13 custom glyphs in a 2 KB charset at `$3000`. CIA 1 timer A
|
|
24
|
+
measures two full room redraws and a single block draw. A four-cell verdict at
|
|
25
|
+
`$02FF` confirms the drawing is correct.
|
|
26
|
+
|
|
27
|
+
Use this recipe as the starting point for any isometric tile engine that needs
|
|
28
|
+
the depth bit: replace the map and charset, keep the painter loop and depth
|
|
29
|
+
scan.
|
|
30
|
+
|
|
31
|
+
## Source
|
|
32
|
+
|
|
33
|
+
```asm
|
|
34
|
+
// KickAssembler 5.25
|
|
35
|
+
// isometric-room.asm: painter's order and one-bit sprite depth
|
|
36
|
+
// 8x8 isometric room in character mode (40x25), custom 2KB charset at $3000.
|
|
37
|
+
// Hardware sprite 0 as player; $D01B bit 0 updated after each move.
|
|
38
|
+
// Scripted path: (1,1)->(2,1)->(3,1)->(3,2)->(3,3)->(2,3).
|
|
39
|
+
// CIA1 timer A measures two full redraws and one block draw.
|
|
40
|
+
// Verdict at $02FF; depth-set move count at $02FE.
|
|
41
|
+
// Border: light blue during run -> green if $02FF=1, red otherwise.
|
|
42
|
+
|
|
43
|
+
*= $0801
|
|
44
|
+
:BasicUpstart2(main)
|
|
45
|
+
|
|
46
|
+
// ── VIC / CIA ────────────────────────────────────────────────────────────────
|
|
47
|
+
.const D018 = $D018
|
|
48
|
+
.const D020 = $D020
|
|
49
|
+
.const D021 = $D021
|
|
50
|
+
.const D015 = $D015
|
|
51
|
+
.const D01B = $D01B
|
|
52
|
+
.const D027 = $D027
|
|
53
|
+
.const SPX0 = $D000
|
|
54
|
+
.const SPY0 = $D001
|
|
55
|
+
.const SPXHI = $D010
|
|
56
|
+
.const TALO = $DC04
|
|
57
|
+
.const TAHI = $DC05
|
|
58
|
+
.const TACRA = $DC0E
|
|
59
|
+
|
|
60
|
+
// ── Memory layout ────────────────────────────────────────────────────────────
|
|
61
|
+
.const SCR = $0400
|
|
62
|
+
.const COLRAM = $D800
|
|
63
|
+
.const CSET = $3000
|
|
64
|
+
.const SPDAT = $2000
|
|
65
|
+
.const SPPTR = $07F8
|
|
66
|
+
|
|
67
|
+
// ── Isometric constants ───────────────────────────────────────────────────────
|
|
68
|
+
.const OC = 18
|
|
69
|
+
.const OR = 4
|
|
70
|
+
|
|
71
|
+
// ── Custom char codes ─────────────────────────────────────────────────────────
|
|
72
|
+
.const CT0 = 1
|
|
73
|
+
.const CT1 = 2
|
|
74
|
+
.const CT2 = 3
|
|
75
|
+
.const CT3 = 4
|
|
76
|
+
.const CB0 = 5
|
|
77
|
+
.const CB1 = 6
|
|
78
|
+
.const CB2 = 7
|
|
79
|
+
.const CB3 = 8
|
|
80
|
+
.const CS0 = 9
|
|
81
|
+
.const CS1 = 10
|
|
82
|
+
.const CS2 = 11
|
|
83
|
+
.const CS3 = 12
|
|
84
|
+
|
|
85
|
+
// ── Palette ───────────────────────────────────────────────────────────────────
|
|
86
|
+
.const COL_FLOOR = 13
|
|
87
|
+
.const COL_BLOCK = 7
|
|
88
|
+
.const COL_TALL = 10
|
|
89
|
+
.const COL_PASS = 5
|
|
90
|
+
.const COL_FAIL = 2
|
|
91
|
+
|
|
92
|
+
// ── Result addresses ──────────────────────────────────────────────────────────
|
|
93
|
+
.const R_T1L = $02F0
|
|
94
|
+
.const R_T1H = $02F1
|
|
95
|
+
.const R_T2L = $02F2
|
|
96
|
+
.const R_T2H = $02F3
|
|
97
|
+
.const R_BKL = $02F4
|
|
98
|
+
.const R_BKH = $02F5
|
|
99
|
+
.const R_DEP = $02FE
|
|
100
|
+
.const R_VRD = $02FF
|
|
101
|
+
|
|
102
|
+
// ── Tables, map, variables at $0900 ──────────────────────────────────────────
|
|
103
|
+
|
|
104
|
+
*= $0900
|
|
105
|
+
|
|
106
|
+
scr_row_lo: .for (var r=0; r<25; r++) { .byte <(SCR + r*40) }
|
|
107
|
+
scr_row_hi: .for (var r=0; r<25; r++) { .byte >(SCR + r*40) }
|
|
108
|
+
col_row_lo: .for (var r=0; r<25; r++) { .byte <(COLRAM + r*40) }
|
|
109
|
+
col_row_hi: .for (var r=0; r<25; r++) { .byte >(COLRAM + r*40) }
|
|
110
|
+
|
|
111
|
+
room:
|
|
112
|
+
.byte 0,0,0,0,0,0,0,0
|
|
113
|
+
.byte 0,0,0,0,1,0,0,0
|
|
114
|
+
.byte 0,0,0,0,0,0,0,2
|
|
115
|
+
.byte 0,1,0,0,0,0,0,0
|
|
116
|
+
.byte 0,0,0,0,0,1,0,0
|
|
117
|
+
.byte 0,0,2,0,0,0,0,0
|
|
118
|
+
.byte 0,0,0,0,0,0,0,0
|
|
119
|
+
.byte 0,0,0,1,0,0,0,0
|
|
120
|
+
|
|
121
|
+
player_x: .byte 1
|
|
122
|
+
player_y: .byte 1
|
|
123
|
+
player_col:.byte 0
|
|
124
|
+
player_row:.byte 0
|
|
125
|
+
draw_col: .byte 0
|
|
126
|
+
draw_row: .byte 0
|
|
127
|
+
tile_col: .byte 0
|
|
128
|
+
draw_s: .byte 0
|
|
129
|
+
draw_xe: .byte 0
|
|
130
|
+
draw_xs: .byte 0
|
|
131
|
+
draw_xc: .byte 0
|
|
132
|
+
draw_yc: .byte 0
|
|
133
|
+
midx: .byte 0
|
|
134
|
+
|
|
135
|
+
mtx: .byte 2,3,3,3,2
|
|
136
|
+
mty: .byte 1,1,2,3,3
|
|
137
|
+
|
|
138
|
+
// ── Sprite data at $2000 ──────────────────────────────────────────────────────
|
|
139
|
+
*= SPDAT
|
|
140
|
+
// 24x21 figure sprite (3 bytes/row)
|
|
141
|
+
.byte $00,$3C,$00 // row 0 head top
|
|
142
|
+
.byte $00,$7E,$00 // row 1
|
|
143
|
+
.byte $00,$FF,$00 // row 2
|
|
144
|
+
.byte $00,$FF,$00 // row 3
|
|
145
|
+
.byte $00,$7E,$00 // row 4 head
|
|
146
|
+
.byte $01,$FF,$80 // row 5 shoulders
|
|
147
|
+
.byte $01,$FF,$80 // row 6 body
|
|
148
|
+
.byte $01,$FF,$80 // row 7
|
|
149
|
+
.byte $01,$FF,$80 // row 8
|
|
150
|
+
.byte $01,$FF,$80 // row 9
|
|
151
|
+
.byte $01,$FF,$80 // row 10
|
|
152
|
+
.byte $00,$7E,$00 // row 11 waist
|
|
153
|
+
.byte $00,$66,$00 // row 12 legs
|
|
154
|
+
.byte $00,$66,$00 // row 13
|
|
155
|
+
.byte $00,$66,$00 // row 14
|
|
156
|
+
.byte $00,$66,$00 // row 15
|
|
157
|
+
.byte $00,$66,$00 // row 16
|
|
158
|
+
.byte $00,$66,$00 // row 17
|
|
159
|
+
.byte $00,$66,$00 // row 18
|
|
160
|
+
.byte $00,$66,$00 // row 19
|
|
161
|
+
.byte $00,$66,$00 // row 20
|
|
162
|
+
.byte $00 // padding
|
|
163
|
+
|
|
164
|
+
// ── Custom charset at $3000 ───────────────────────────────────────────────────
|
|
165
|
+
*= CSET
|
|
166
|
+
|
|
167
|
+
// Char 0: blank
|
|
168
|
+
.fill 8, 0
|
|
169
|
+
|
|
170
|
+
// Chars 1-4: top-face/floor row 0 (top half of 32x16 2:1 diamond)
|
|
171
|
+
// Row r (0-7): diamond left edge at col 14-2*r, right at 17+2*r (clamped to 0-31)
|
|
172
|
+
// Each char covers 8 columns. Bit 7=col0, bit 0=col7 within the char's span.
|
|
173
|
+
// Char 1: cols 0-7
|
|
174
|
+
.byte $00,$00,$00,$00,$03,$0F,$3F,$FF
|
|
175
|
+
// Char 2: cols 8-15
|
|
176
|
+
.byte $03,$0F,$3F,$FF,$FF,$FF,$FF,$FF
|
|
177
|
+
// Char 3: cols 16-23
|
|
178
|
+
.byte $C0,$F0,$FC,$FF,$FF,$FF,$FF,$FF
|
|
179
|
+
// Char 4: cols 24-31
|
|
180
|
+
.byte $00,$00,$00,$00,$C0,$F0,$FC,$FF
|
|
181
|
+
|
|
182
|
+
// Chars 5-8: top-face/floor row 1 (bottom half of diamond)
|
|
183
|
+
.byte $FF,$3F,$0F,$03,$00,$00,$00,$00 // char 5
|
|
184
|
+
.byte $FF,$FF,$FF,$FF,$FF,$FC,$F0,$C0 // char 6
|
|
185
|
+
.byte $FF,$FF,$FF,$FF,$FF,$3F,$0F,$03 // char 7
|
|
186
|
+
.byte $FF,$FC,$F0,$C0,$00,$00,$00,$00 // char 8
|
|
187
|
+
|
|
188
|
+
// Chars 9-12: side face (cube walls, two per face)
|
|
189
|
+
.byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF // char 9 left-face col 0 solid
|
|
190
|
+
.byte $FF,$7F,$7F,$7F,$7F,$7F,$7F,$FF // char 10 left-face col 1 (right edge line)
|
|
191
|
+
.byte $FF,$FE,$FE,$FE,$FE,$FE,$FE,$FF // char 11 right-face col 0 (left edge line)
|
|
192
|
+
.byte $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF // char 12 right-face col 1 solid
|
|
193
|
+
|
|
194
|
+
// Fill rest of 2KB charset with zeros
|
|
195
|
+
.fill CSET + $800 - *, 0
|
|
196
|
+
|
|
197
|
+
// ── Main code at $0A00 ────────────────────────────────────────────────────────
|
|
198
|
+
*= $0A00
|
|
199
|
+
|
|
200
|
+
main:
|
|
201
|
+
sei
|
|
202
|
+
lda #$1C
|
|
203
|
+
sta D018
|
|
204
|
+
lda #0
|
|
205
|
+
sta D021
|
|
206
|
+
lda #14
|
|
207
|
+
sta D020
|
|
208
|
+
lda #0
|
|
209
|
+
sta D01B
|
|
210
|
+
lda #0
|
|
211
|
+
sta R_DEP
|
|
212
|
+
sta R_VRD
|
|
213
|
+
|
|
214
|
+
lda #(SPDAT/64)
|
|
215
|
+
sta SPPTR
|
|
216
|
+
lda #1
|
|
217
|
+
sta D015
|
|
218
|
+
lda #7
|
|
219
|
+
sta D027
|
|
220
|
+
lda #0
|
|
221
|
+
sta SPXHI
|
|
222
|
+
|
|
223
|
+
// Clear 1000 screen and colour bytes
|
|
224
|
+
ldx #0
|
|
225
|
+
clrloop:
|
|
226
|
+
lda #$20
|
|
227
|
+
sta SCR+$000,x
|
|
228
|
+
sta SCR+$100,x
|
|
229
|
+
sta SCR+$200,x
|
|
230
|
+
lda #0
|
|
231
|
+
sta COLRAM+$000,x
|
|
232
|
+
sta COLRAM+$100,x
|
|
233
|
+
sta COLRAM+$200,x
|
|
234
|
+
inx
|
|
235
|
+
bne clrloop
|
|
236
|
+
ldx #0
|
|
237
|
+
clrlast:
|
|
238
|
+
lda #$20
|
|
239
|
+
sta SCR+$300,x
|
|
240
|
+
lda #0
|
|
241
|
+
sta COLRAM+$300,x
|
|
242
|
+
inx
|
|
243
|
+
cpx #232
|
|
244
|
+
bne clrlast
|
|
245
|
+
|
|
246
|
+
// First redraw timed
|
|
247
|
+
lda #$FF
|
|
248
|
+
sta TALO
|
|
249
|
+
sta TAHI
|
|
250
|
+
lda #$19
|
|
251
|
+
sta TACRA
|
|
252
|
+
jsr draw_room
|
|
253
|
+
lda #$08
|
|
254
|
+
sta TACRA
|
|
255
|
+
sec
|
|
256
|
+
lda #$FF
|
|
257
|
+
sbc TALO
|
|
258
|
+
sta R_T1L
|
|
259
|
+
lda #$FF
|
|
260
|
+
sbc TAHI
|
|
261
|
+
sta R_T1H
|
|
262
|
+
|
|
263
|
+
// Time one block draw (block at (4,1): col=24, row=9)
|
|
264
|
+
lda #24
|
|
265
|
+
sta draw_col
|
|
266
|
+
lda #9
|
|
267
|
+
sta draw_row
|
|
268
|
+
lda #$FF
|
|
269
|
+
sta TALO
|
|
270
|
+
sta TAHI
|
|
271
|
+
lda #$19
|
|
272
|
+
sta TACRA
|
|
273
|
+
lda #COL_BLOCK
|
|
274
|
+
jsr draw_block_tile
|
|
275
|
+
lda #$08
|
|
276
|
+
sta TACRA
|
|
277
|
+
sec
|
|
278
|
+
lda #$FF
|
|
279
|
+
sbc TALO
|
|
280
|
+
sta R_BKL
|
|
281
|
+
lda #$FF
|
|
282
|
+
sbc TAHI
|
|
283
|
+
sta R_BKH
|
|
284
|
+
|
|
285
|
+
// Initial player position
|
|
286
|
+
lda #1
|
|
287
|
+
sta player_x
|
|
288
|
+
sta player_y
|
|
289
|
+
jsr update_player
|
|
290
|
+
|
|
291
|
+
// Scripted moves
|
|
292
|
+
lda #0
|
|
293
|
+
sta midx
|
|
294
|
+
|
|
295
|
+
mvloop:
|
|
296
|
+
lda midx
|
|
297
|
+
cmp #5
|
|
298
|
+
beq mvdone
|
|
299
|
+
// ~25-frame delay (7*256*256 iterations at ~7 cycles = ~3M cycles, ~3 frames PAL)
|
|
300
|
+
// Using smaller value for speed; actual frame timing not critical for this recipe
|
|
301
|
+
ldy #25
|
|
302
|
+
dly_a:
|
|
303
|
+
ldx #0
|
|
304
|
+
dly_b:
|
|
305
|
+
dex
|
|
306
|
+
bne dly_b
|
|
307
|
+
dey
|
|
308
|
+
bne dly_a
|
|
309
|
+
|
|
310
|
+
ldy midx
|
|
311
|
+
lda mtx,y
|
|
312
|
+
sta player_x
|
|
313
|
+
lda mty,y
|
|
314
|
+
sta player_y
|
|
315
|
+
jsr update_player
|
|
316
|
+
|
|
317
|
+
inc midx
|
|
318
|
+
jmp mvloop
|
|
319
|
+
|
|
320
|
+
mvdone:
|
|
321
|
+
ldy #25
|
|
322
|
+
fdly_a:
|
|
323
|
+
ldx #0
|
|
324
|
+
fdly_b:
|
|
325
|
+
dex
|
|
326
|
+
bne fdly_b
|
|
327
|
+
dey
|
|
328
|
+
bne fdly_a
|
|
329
|
+
|
|
330
|
+
// Second redraw timed
|
|
331
|
+
lda #$FF
|
|
332
|
+
sta TALO
|
|
333
|
+
sta TAHI
|
|
334
|
+
lda #$19
|
|
335
|
+
sta TACRA
|
|
336
|
+
jsr draw_room
|
|
337
|
+
lda #$08
|
|
338
|
+
sta TACRA
|
|
339
|
+
sec
|
|
340
|
+
lda #$FF
|
|
341
|
+
sbc TALO
|
|
342
|
+
sta R_T2L
|
|
343
|
+
lda #$FF
|
|
344
|
+
sbc TAHI
|
|
345
|
+
sta R_T2H
|
|
346
|
+
|
|
347
|
+
jsr check_verdict
|
|
348
|
+
|
|
349
|
+
lda R_VRD
|
|
350
|
+
cmp #1
|
|
351
|
+
bne setred
|
|
352
|
+
lda #COL_PASS
|
|
353
|
+
jmp setborder
|
|
354
|
+
setred:
|
|
355
|
+
lda #COL_FAIL
|
|
356
|
+
setborder:
|
|
357
|
+
sta D020
|
|
358
|
+
|
|
359
|
+
spin:
|
|
360
|
+
jmp spin
|
|
361
|
+
|
|
362
|
+
// ── setup_row: load $02/$03/$04/$05 for row in Y ─────────────────────────────
|
|
363
|
+
setup_row:
|
|
364
|
+
lda scr_row_lo,y
|
|
365
|
+
sta $02
|
|
366
|
+
lda scr_row_hi,y
|
|
367
|
+
sta $03
|
|
368
|
+
lda col_row_lo,y
|
|
369
|
+
sta $04
|
|
370
|
+
lda col_row_hi,y
|
|
371
|
+
sta $05
|
|
372
|
+
rts
|
|
373
|
+
|
|
374
|
+
// ── draw_floor_tile: A=colour, draw_col/draw_row set ─────────────────────────
|
|
375
|
+
// 8 screen writes + 8 colour writes (2 rows of 4 chars)
|
|
376
|
+
draw_floor_tile:
|
|
377
|
+
sta tile_col
|
|
378
|
+
ldy draw_row
|
|
379
|
+
jsr setup_row
|
|
380
|
+
ldy draw_col
|
|
381
|
+
lda #CT0
|
|
382
|
+
sta ($02),y
|
|
383
|
+
iny
|
|
384
|
+
lda #CT1
|
|
385
|
+
sta ($02),y
|
|
386
|
+
iny
|
|
387
|
+
lda #CT2
|
|
388
|
+
sta ($02),y
|
|
389
|
+
iny
|
|
390
|
+
lda #CT3
|
|
391
|
+
sta ($02),y
|
|
392
|
+
ldy draw_col
|
|
393
|
+
lda tile_col
|
|
394
|
+
sta ($04),y
|
|
395
|
+
iny
|
|
396
|
+
sta ($04),y
|
|
397
|
+
iny
|
|
398
|
+
sta ($04),y
|
|
399
|
+
iny
|
|
400
|
+
sta ($04),y
|
|
401
|
+
|
|
402
|
+
ldy draw_row
|
|
403
|
+
iny
|
|
404
|
+
jsr setup_row
|
|
405
|
+
ldy draw_col
|
|
406
|
+
lda #CB0
|
|
407
|
+
sta ($02),y
|
|
408
|
+
iny
|
|
409
|
+
lda #CB1
|
|
410
|
+
sta ($02),y
|
|
411
|
+
iny
|
|
412
|
+
lda #CB2
|
|
413
|
+
sta ($02),y
|
|
414
|
+
iny
|
|
415
|
+
lda #CB3
|
|
416
|
+
sta ($02),y
|
|
417
|
+
ldy draw_col
|
|
418
|
+
lda tile_col
|
|
419
|
+
sta ($04),y
|
|
420
|
+
iny
|
|
421
|
+
sta ($04),y
|
|
422
|
+
iny
|
|
423
|
+
sta ($04),y
|
|
424
|
+
iny
|
|
425
|
+
sta ($04),y
|
|
426
|
+
rts
|
|
427
|
+
|
|
428
|
+
// ── draw_block_tile: A=colour, draw_col/draw_row set ─────────────────────────
|
|
429
|
+
// 16 screen writes + 16 colour writes (4 rows of 4 chars)
|
|
430
|
+
draw_block_tile:
|
|
431
|
+
sta tile_col
|
|
432
|
+
// Row draw_row-2: top-face row 0
|
|
433
|
+
ldy draw_row
|
|
434
|
+
dey
|
|
435
|
+
dey
|
|
436
|
+
jsr setup_row
|
|
437
|
+
ldy draw_col
|
|
438
|
+
lda #CT0
|
|
439
|
+
sta ($02),y
|
|
440
|
+
iny
|
|
441
|
+
lda #CT1
|
|
442
|
+
sta ($02),y
|
|
443
|
+
iny
|
|
444
|
+
lda #CT2
|
|
445
|
+
sta ($02),y
|
|
446
|
+
iny
|
|
447
|
+
lda #CT3
|
|
448
|
+
sta ($02),y
|
|
449
|
+
ldy draw_col
|
|
450
|
+
lda tile_col
|
|
451
|
+
sta ($04),y
|
|
452
|
+
iny
|
|
453
|
+
sta ($04),y
|
|
454
|
+
iny
|
|
455
|
+
sta ($04),y
|
|
456
|
+
iny
|
|
457
|
+
sta ($04),y
|
|
458
|
+
// Row draw_row-1: top-face row 1
|
|
459
|
+
ldy draw_row
|
|
460
|
+
dey
|
|
461
|
+
jsr setup_row
|
|
462
|
+
ldy draw_col
|
|
463
|
+
lda #CB0
|
|
464
|
+
sta ($02),y
|
|
465
|
+
iny
|
|
466
|
+
lda #CB1
|
|
467
|
+
sta ($02),y
|
|
468
|
+
iny
|
|
469
|
+
lda #CB2
|
|
470
|
+
sta ($02),y
|
|
471
|
+
iny
|
|
472
|
+
lda #CB3
|
|
473
|
+
sta ($02),y
|
|
474
|
+
ldy draw_col
|
|
475
|
+
lda tile_col
|
|
476
|
+
sta ($04),y
|
|
477
|
+
iny
|
|
478
|
+
sta ($04),y
|
|
479
|
+
iny
|
|
480
|
+
sta ($04),y
|
|
481
|
+
iny
|
|
482
|
+
sta ($04),y
|
|
483
|
+
// Row draw_row: side face
|
|
484
|
+
ldy draw_row
|
|
485
|
+
jsr setup_row
|
|
486
|
+
ldy draw_col
|
|
487
|
+
lda #CS0
|
|
488
|
+
sta ($02),y
|
|
489
|
+
iny
|
|
490
|
+
lda #CS1
|
|
491
|
+
sta ($02),y
|
|
492
|
+
iny
|
|
493
|
+
lda #CS2
|
|
494
|
+
sta ($02),y
|
|
495
|
+
iny
|
|
496
|
+
lda #CS3
|
|
497
|
+
sta ($02),y
|
|
498
|
+
ldy draw_col
|
|
499
|
+
lda tile_col
|
|
500
|
+
sta ($04),y
|
|
501
|
+
iny
|
|
502
|
+
sta ($04),y
|
|
503
|
+
iny
|
|
504
|
+
sta ($04),y
|
|
505
|
+
iny
|
|
506
|
+
sta ($04),y
|
|
507
|
+
// Row draw_row+1: side face
|
|
508
|
+
ldy draw_row
|
|
509
|
+
iny
|
|
510
|
+
jsr setup_row
|
|
511
|
+
ldy draw_col
|
|
512
|
+
lda #CS0
|
|
513
|
+
sta ($02),y
|
|
514
|
+
iny
|
|
515
|
+
lda #CS1
|
|
516
|
+
sta ($02),y
|
|
517
|
+
iny
|
|
518
|
+
lda #CS2
|
|
519
|
+
sta ($02),y
|
|
520
|
+
iny
|
|
521
|
+
lda #CS3
|
|
522
|
+
sta ($02),y
|
|
523
|
+
ldy draw_col
|
|
524
|
+
lda tile_col
|
|
525
|
+
sta ($04),y
|
|
526
|
+
iny
|
|
527
|
+
sta ($04),y
|
|
528
|
+
iny
|
|
529
|
+
sta ($04),y
|
|
530
|
+
iny
|
|
531
|
+
sta ($04),y
|
|
532
|
+
rts
|
|
533
|
+
|
|
534
|
+
// ── draw_tall_tile: A=colour, draw_col/draw_row set ──────────────────────────
|
|
535
|
+
// 24 screen writes + 24 colour writes (6 rows of 4 chars)
|
|
536
|
+
draw_tall_tile:
|
|
537
|
+
sta tile_col
|
|
538
|
+
// Row draw_row-4: top-face row 0
|
|
539
|
+
ldy draw_row
|
|
540
|
+
dey
|
|
541
|
+
dey
|
|
542
|
+
dey
|
|
543
|
+
dey
|
|
544
|
+
jsr setup_row
|
|
545
|
+
ldy draw_col
|
|
546
|
+
lda #CT0
|
|
547
|
+
sta ($02),y
|
|
548
|
+
iny
|
|
549
|
+
lda #CT1
|
|
550
|
+
sta ($02),y
|
|
551
|
+
iny
|
|
552
|
+
lda #CT2
|
|
553
|
+
sta ($02),y
|
|
554
|
+
iny
|
|
555
|
+
lda #CT3
|
|
556
|
+
sta ($02),y
|
|
557
|
+
ldy draw_col
|
|
558
|
+
lda tile_col
|
|
559
|
+
sta ($04),y
|
|
560
|
+
iny
|
|
561
|
+
sta ($04),y
|
|
562
|
+
iny
|
|
563
|
+
sta ($04),y
|
|
564
|
+
iny
|
|
565
|
+
sta ($04),y
|
|
566
|
+
// Row draw_row-3: top-face row 1
|
|
567
|
+
ldy draw_row
|
|
568
|
+
dey
|
|
569
|
+
dey
|
|
570
|
+
dey
|
|
571
|
+
jsr setup_row
|
|
572
|
+
ldy draw_col
|
|
573
|
+
lda #CB0
|
|
574
|
+
sta ($02),y
|
|
575
|
+
iny
|
|
576
|
+
lda #CB1
|
|
577
|
+
sta ($02),y
|
|
578
|
+
iny
|
|
579
|
+
lda #CB2
|
|
580
|
+
sta ($02),y
|
|
581
|
+
iny
|
|
582
|
+
lda #CB3
|
|
583
|
+
sta ($02),y
|
|
584
|
+
ldy draw_col
|
|
585
|
+
lda tile_col
|
|
586
|
+
sta ($04),y
|
|
587
|
+
iny
|
|
588
|
+
sta ($04),y
|
|
589
|
+
iny
|
|
590
|
+
sta ($04),y
|
|
591
|
+
iny
|
|
592
|
+
sta ($04),y
|
|
593
|
+
// Rows draw_row-2 through draw_row+1: four side face rows
|
|
594
|
+
ldy draw_row
|
|
595
|
+
dey
|
|
596
|
+
dey
|
|
597
|
+
jsr setup_row
|
|
598
|
+
ldy draw_col
|
|
599
|
+
lda #CS0
|
|
600
|
+
sta ($02),y
|
|
601
|
+
iny
|
|
602
|
+
lda #CS1
|
|
603
|
+
sta ($02),y
|
|
604
|
+
iny
|
|
605
|
+
lda #CS2
|
|
606
|
+
sta ($02),y
|
|
607
|
+
iny
|
|
608
|
+
lda #CS3
|
|
609
|
+
sta ($02),y
|
|
610
|
+
ldy draw_col
|
|
611
|
+
lda tile_col
|
|
612
|
+
sta ($04),y
|
|
613
|
+
iny
|
|
614
|
+
sta ($04),y
|
|
615
|
+
iny
|
|
616
|
+
sta ($04),y
|
|
617
|
+
iny
|
|
618
|
+
sta ($04),y
|
|
619
|
+
|
|
620
|
+
ldy draw_row
|
|
621
|
+
dey
|
|
622
|
+
jsr setup_row
|
|
623
|
+
ldy draw_col
|
|
624
|
+
lda #CS0
|
|
625
|
+
sta ($02),y
|
|
626
|
+
iny
|
|
627
|
+
lda #CS1
|
|
628
|
+
sta ($02),y
|
|
629
|
+
iny
|
|
630
|
+
lda #CS2
|
|
631
|
+
sta ($02),y
|
|
632
|
+
iny
|
|
633
|
+
lda #CS3
|
|
634
|
+
sta ($02),y
|
|
635
|
+
ldy draw_col
|
|
636
|
+
lda tile_col
|
|
637
|
+
sta ($04),y
|
|
638
|
+
iny
|
|
639
|
+
sta ($04),y
|
|
640
|
+
iny
|
|
641
|
+
sta ($04),y
|
|
642
|
+
iny
|
|
643
|
+
sta ($04),y
|
|
644
|
+
|
|
645
|
+
ldy draw_row
|
|
646
|
+
jsr setup_row
|
|
647
|
+
ldy draw_col
|
|
648
|
+
lda #CS0
|
|
649
|
+
sta ($02),y
|
|
650
|
+
iny
|
|
651
|
+
lda #CS1
|
|
652
|
+
sta ($02),y
|
|
653
|
+
iny
|
|
654
|
+
lda #CS2
|
|
655
|
+
sta ($02),y
|
|
656
|
+
iny
|
|
657
|
+
lda #CS3
|
|
658
|
+
sta ($02),y
|
|
659
|
+
ldy draw_col
|
|
660
|
+
lda tile_col
|
|
661
|
+
sta ($04),y
|
|
662
|
+
iny
|
|
663
|
+
sta ($04),y
|
|
664
|
+
iny
|
|
665
|
+
sta ($04),y
|
|
666
|
+
iny
|
|
667
|
+
sta ($04),y
|
|
668
|
+
|
|
669
|
+
ldy draw_row
|
|
670
|
+
iny
|
|
671
|
+
jsr setup_row
|
|
672
|
+
ldy draw_col
|
|
673
|
+
lda #CS0
|
|
674
|
+
sta ($02),y
|
|
675
|
+
iny
|
|
676
|
+
lda #CS1
|
|
677
|
+
sta ($02),y
|
|
678
|
+
iny
|
|
679
|
+
lda #CS2
|
|
680
|
+
sta ($02),y
|
|
681
|
+
iny
|
|
682
|
+
lda #CS3
|
|
683
|
+
sta ($02),y
|
|
684
|
+
ldy draw_col
|
|
685
|
+
lda tile_col
|
|
686
|
+
sta ($04),y
|
|
687
|
+
iny
|
|
688
|
+
sta ($04),y
|
|
689
|
+
iny
|
|
690
|
+
sta ($04),y
|
|
691
|
+
iny
|
|
692
|
+
sta ($04),y
|
|
693
|
+
rts
|
|
694
|
+
|
|
695
|
+
// ── draw_room ─────────────────────────────────────────────────────────────────
|
|
696
|
+
// Painter's algorithm: s=0..14, x=x_start..x_end, y=s-x.
|
|
697
|
+
// Clears rows 0..22 first.
|
|
698
|
+
draw_room:
|
|
699
|
+
ldx #0
|
|
700
|
+
drclr:
|
|
701
|
+
lda scr_row_lo,x
|
|
702
|
+
sta $02
|
|
703
|
+
lda scr_row_hi,x
|
|
704
|
+
sta $03
|
|
705
|
+
ldy #0
|
|
706
|
+
lda #$20
|
|
707
|
+
drclr_c:
|
|
708
|
+
sta ($02),y
|
|
709
|
+
iny
|
|
710
|
+
cpy #40
|
|
711
|
+
bne drclr_c
|
|
712
|
+
inx
|
|
713
|
+
cpx #23
|
|
714
|
+
bne drclr
|
|
715
|
+
|
|
716
|
+
lda #0
|
|
717
|
+
sta draw_s
|
|
718
|
+
|
|
719
|
+
paint_s:
|
|
720
|
+
// x_start = max(0, s-7)
|
|
721
|
+
lda draw_s
|
|
722
|
+
sec
|
|
723
|
+
sbc #7
|
|
724
|
+
bpl xs_set
|
|
725
|
+
lda #0
|
|
726
|
+
xs_set:
|
|
727
|
+
sta draw_xs
|
|
728
|
+
// x_end = min(7, s)
|
|
729
|
+
lda draw_s
|
|
730
|
+
cmp #8
|
|
731
|
+
bcc xe_set
|
|
732
|
+
lda #7
|
|
733
|
+
xe_set:
|
|
734
|
+
sta draw_xe
|
|
735
|
+
lda draw_xs
|
|
736
|
+
sta draw_xc
|
|
737
|
+
|
|
738
|
+
paint_x:
|
|
739
|
+
lda draw_xe
|
|
740
|
+
cmp draw_xc
|
|
741
|
+
bcc paint_x_done
|
|
742
|
+
|
|
743
|
+
// y = s - x
|
|
744
|
+
lda draw_s
|
|
745
|
+
sec
|
|
746
|
+
sbc draw_xc
|
|
747
|
+
sta draw_yc
|
|
748
|
+
|
|
749
|
+
// col = OC + 2*(x-y)
|
|
750
|
+
lda draw_xc
|
|
751
|
+
sec
|
|
752
|
+
sbc draw_yc
|
|
753
|
+
asl
|
|
754
|
+
clc
|
|
755
|
+
adc #OC
|
|
756
|
+
sta draw_col
|
|
757
|
+
|
|
758
|
+
// row = OR + x + y
|
|
759
|
+
lda draw_xc
|
|
760
|
+
clc
|
|
761
|
+
adc draw_yc
|
|
762
|
+
clc
|
|
763
|
+
adc #OR
|
|
764
|
+
sta draw_row
|
|
765
|
+
|
|
766
|
+
// cell = room[y*8+x]
|
|
767
|
+
lda draw_yc
|
|
768
|
+
asl
|
|
769
|
+
asl
|
|
770
|
+
asl
|
|
771
|
+
clc
|
|
772
|
+
adc draw_xc
|
|
773
|
+
tay
|
|
774
|
+
lda room,y
|
|
775
|
+
|
|
776
|
+
cmp #2
|
|
777
|
+
beq do_tall
|
|
778
|
+
cmp #1
|
|
779
|
+
beq do_block
|
|
780
|
+
// floor
|
|
781
|
+
lda #COL_FLOOR
|
|
782
|
+
jsr draw_floor_tile
|
|
783
|
+
jmp paint_next
|
|
784
|
+
do_block:
|
|
785
|
+
lda #COL_BLOCK
|
|
786
|
+
jsr draw_block_tile
|
|
787
|
+
jmp paint_next
|
|
788
|
+
do_tall:
|
|
789
|
+
lda #COL_TALL
|
|
790
|
+
jsr draw_tall_tile
|
|
791
|
+
paint_next:
|
|
792
|
+
inc draw_xc
|
|
793
|
+
jmp paint_x
|
|
794
|
+
|
|
795
|
+
paint_x_done:
|
|
796
|
+
inc draw_s
|
|
797
|
+
lda draw_s
|
|
798
|
+
cmp #15
|
|
799
|
+
beq paint_s_done
|
|
800
|
+
jmp paint_s
|
|
801
|
+
paint_s_done:
|
|
802
|
+
rts
|
|
803
|
+
|
|
804
|
+
// ── update_player ─────────────────────────────────────────────────────────────
|
|
805
|
+
update_player:
|
|
806
|
+
// char_col = OC + 2*(px-py)
|
|
807
|
+
lda player_x
|
|
808
|
+
sec
|
|
809
|
+
sbc player_y
|
|
810
|
+
asl
|
|
811
|
+
clc
|
|
812
|
+
adc #OC
|
|
813
|
+
sta player_col
|
|
814
|
+
// char_row = OR + px + py
|
|
815
|
+
lda player_x
|
|
816
|
+
clc
|
|
817
|
+
adc player_y
|
|
818
|
+
clc
|
|
819
|
+
adc #OR
|
|
820
|
+
sta player_row
|
|
821
|
+
|
|
822
|
+
// sprite_x = 24 + 8*(player_col+2) = 40 + 8*player_col
|
|
823
|
+
lda player_col
|
|
824
|
+
asl
|
|
825
|
+
asl
|
|
826
|
+
asl
|
|
827
|
+
// A = 8*player_col; add 40
|
|
828
|
+
clc
|
|
829
|
+
adc #40
|
|
830
|
+
bcs spx_hi
|
|
831
|
+
sta SPX0
|
|
832
|
+
lda #0
|
|
833
|
+
sta SPXHI
|
|
834
|
+
jmp spx_done
|
|
835
|
+
spx_hi:
|
|
836
|
+
sta SPX0
|
|
837
|
+
lda SPXHI
|
|
838
|
+
ora #1
|
|
839
|
+
sta SPXHI
|
|
840
|
+
spx_done:
|
|
841
|
+
|
|
842
|
+
// sprite_y = 45 + 8*player_row
|
|
843
|
+
lda player_row
|
|
844
|
+
asl
|
|
845
|
+
asl
|
|
846
|
+
asl
|
|
847
|
+
clc
|
|
848
|
+
adc #45
|
|
849
|
+
sta SPY0
|
|
850
|
+
|
|
851
|
+
jsr depth_check
|
|
852
|
+
rts
|
|
853
|
+
|
|
854
|
+
// ── depth_check ───────────────────────────────────────────────────────────────
|
|
855
|
+
// Scans all 64 cells. Sets $D01B bit 0 if any block with x+y > px+py
|
|
856
|
+
// has its 4x4/4x6 char box overlapping the sprite's char box.
|
|
857
|
+
// Updates R_DEP if bit goes high.
|
|
858
|
+
//
|
|
859
|
+
// Sprite char box:
|
|
860
|
+
// cols [player_col+2, player_col+4] (3 chars, 24px wide)
|
|
861
|
+
// rows [player_row-1, player_row+1] (3 rows, 21px spans row-1..row+1)
|
|
862
|
+
//
|
|
863
|
+
// Block char box: [block_col, block_col+3] x [block_row-2, block_row+1]
|
|
864
|
+
// Tall block: [block_col, block_col+3] x [block_row-4, block_row+1]
|
|
865
|
+
depth_check:
|
|
866
|
+
lda #0
|
|
867
|
+
sta $06 // depth_found = 0
|
|
868
|
+
|
|
869
|
+
// px+py
|
|
870
|
+
lda player_x
|
|
871
|
+
clc
|
|
872
|
+
adc player_y
|
|
873
|
+
sta $07 // $07 = px+py
|
|
874
|
+
|
|
875
|
+
// sprite col range [$08, $09]
|
|
876
|
+
lda player_col
|
|
877
|
+
clc
|
|
878
|
+
adc #2
|
|
879
|
+
sta $08 // sprite_left_col = player_col+2
|
|
880
|
+
clc
|
|
881
|
+
adc #2
|
|
882
|
+
sta $09 // sprite_right_col = player_col+4
|
|
883
|
+
|
|
884
|
+
// sprite row range [$0A, $0B]
|
|
885
|
+
lda player_row
|
|
886
|
+
sec
|
|
887
|
+
sbc #1
|
|
888
|
+
sta $0A // sprite_top_row
|
|
889
|
+
lda player_row
|
|
890
|
+
clc
|
|
891
|
+
adc #1
|
|
892
|
+
sta $0B // sprite_bot_row
|
|
893
|
+
|
|
894
|
+
lda #0
|
|
895
|
+
sta $0C // y loop counter
|
|
896
|
+
|
|
897
|
+
dc_y:
|
|
898
|
+
lda #0
|
|
899
|
+
sta $0D // x loop counter
|
|
900
|
+
|
|
901
|
+
dc_x:
|
|
902
|
+
// cell index = y*8+x
|
|
903
|
+
lda $0C
|
|
904
|
+
asl
|
|
905
|
+
asl
|
|
906
|
+
asl
|
|
907
|
+
clc
|
|
908
|
+
adc $0D
|
|
909
|
+
tay
|
|
910
|
+
lda room,y
|
|
911
|
+
beq dc_next // floor: skip
|
|
912
|
+
|
|
913
|
+
// Check x+y > px+py
|
|
914
|
+
lda $0C
|
|
915
|
+
clc
|
|
916
|
+
adc $0D // bx+by
|
|
917
|
+
cmp $07 // vs px+py
|
|
918
|
+
bcc dc_next // bx+by < px+py: not in front
|
|
919
|
+
beq dc_next // bx+by == px+py: same plane, skip
|
|
920
|
+
|
|
921
|
+
// In front. Compute block col and row.
|
|
922
|
+
// block_col = OC + 2*(bx-by)
|
|
923
|
+
lda $0D
|
|
924
|
+
sec
|
|
925
|
+
sbc $0C
|
|
926
|
+
asl
|
|
927
|
+
clc
|
|
928
|
+
adc #OC
|
|
929
|
+
sta $0E // block_col
|
|
930
|
+
|
|
931
|
+
// block_row = OR + bx+by
|
|
932
|
+
lda $0D
|
|
933
|
+
clc
|
|
934
|
+
adc $0C
|
|
935
|
+
clc
|
|
936
|
+
adc #OR
|
|
937
|
+
sta $0F // block_row
|
|
938
|
+
|
|
939
|
+
// block char row range
|
|
940
|
+
lda $0C
|
|
941
|
+
asl
|
|
942
|
+
asl
|
|
943
|
+
asl
|
|
944
|
+
clc
|
|
945
|
+
adc $0D
|
|
946
|
+
tay
|
|
947
|
+
lda room,y
|
|
948
|
+
cmp #2
|
|
949
|
+
beq dc_tall
|
|
950
|
+
// block: rows [block_row-2, block_row+1]
|
|
951
|
+
lda $0F
|
|
952
|
+
sec
|
|
953
|
+
sbc #2
|
|
954
|
+
sta $10
|
|
955
|
+
lda $0F
|
|
956
|
+
clc
|
|
957
|
+
adc #1
|
|
958
|
+
sta $11
|
|
959
|
+
jmp dc_overlap
|
|
960
|
+
dc_tall:
|
|
961
|
+
// tall: rows [block_row-4, block_row+1]
|
|
962
|
+
lda $0F
|
|
963
|
+
sec
|
|
964
|
+
sbc #4
|
|
965
|
+
sta $10
|
|
966
|
+
lda $0F
|
|
967
|
+
clc
|
|
968
|
+
adc #1
|
|
969
|
+
sta $11
|
|
970
|
+
|
|
971
|
+
dc_overlap:
|
|
972
|
+
// Col overlap: block_col <= sprite_right AND block_col+3 >= sprite_left
|
|
973
|
+
lda $09
|
|
974
|
+
cmp $0E // sprite_right vs block_col
|
|
975
|
+
bcc dc_next // sprite_right < block_col: no overlap
|
|
976
|
+
|
|
977
|
+
lda $0E
|
|
978
|
+
clc
|
|
979
|
+
adc #3 // block_right
|
|
980
|
+
cmp $08 // vs sprite_left
|
|
981
|
+
bcc dc_next // block_right < sprite_left: no overlap
|
|
982
|
+
|
|
983
|
+
// Row overlap: block_top <= sprite_bot AND block_bot >= sprite_top
|
|
984
|
+
lda $0B
|
|
985
|
+
cmp $10 // sprite_bot vs block_top
|
|
986
|
+
bcc dc_next // sprite_bot < block_top: no overlap
|
|
987
|
+
|
|
988
|
+
lda $11
|
|
989
|
+
cmp $0A // block_bot vs sprite_top
|
|
990
|
+
bcc dc_next // block_bot < sprite_top: no overlap
|
|
991
|
+
|
|
992
|
+
// Overlap confirmed
|
|
993
|
+
lda #1
|
|
994
|
+
sta $06
|
|
995
|
+
|
|
996
|
+
dc_next:
|
|
997
|
+
inc $0D
|
|
998
|
+
lda $0D
|
|
999
|
+
cmp #8
|
|
1000
|
+
beq dc_x_done
|
|
1001
|
+
jmp dc_x
|
|
1002
|
+
dc_x_done:
|
|
1003
|
+
inc $0C
|
|
1004
|
+
lda $0C
|
|
1005
|
+
cmp #8
|
|
1006
|
+
beq dc_y_done
|
|
1007
|
+
jmp dc_y
|
|
1008
|
+
dc_y_done:
|
|
1009
|
+
|
|
1010
|
+
// Apply $D01B bit 0
|
|
1011
|
+
lda $06
|
|
1012
|
+
beq dc_clear
|
|
1013
|
+
lda D01B
|
|
1014
|
+
ora #1
|
|
1015
|
+
sta D01B
|
|
1016
|
+
inc R_DEP
|
|
1017
|
+
jmp dc_done
|
|
1018
|
+
dc_clear:
|
|
1019
|
+
lda D01B
|
|
1020
|
+
and #$FE
|
|
1021
|
+
sta D01B
|
|
1022
|
+
dc_done:
|
|
1023
|
+
rts
|
|
1024
|
+
|
|
1025
|
+
// ── check_verdict ─────────────────────────────────────────────────────────────
|
|
1026
|
+
// Check four screen positions. $02FF = 1 if all match, else 0.
|
|
1027
|
+
// 1. Floor(0,0) top-left: CT0 at row=4, col=18 -> $0400+4*40+18 = $04B2
|
|
1028
|
+
// 2. Block(4,1) top-face TL: CT0 at row=7, col=24 -> $0400+7*40+24 = $0530
|
|
1029
|
+
// 3. Empty cell: space at row=0, col=0 -> $0400
|
|
1030
|
+
// 4. Tall block(7,2) side face: CS0 at row=13, col=28 -> $0400+13*40+28 = $0624
|
|
1031
|
+
check_verdict:
|
|
1032
|
+
lda $04B2
|
|
1033
|
+
cmp #CT0
|
|
1034
|
+
bne cv_fail
|
|
1035
|
+
lda $0530
|
|
1036
|
+
cmp #CT0
|
|
1037
|
+
bne cv_fail
|
|
1038
|
+
lda $0400
|
|
1039
|
+
cmp #$20
|
|
1040
|
+
bne cv_fail
|
|
1041
|
+
lda $0624
|
|
1042
|
+
cmp #CS0
|
|
1043
|
+
bne cv_fail
|
|
1044
|
+
lda #1
|
|
1045
|
+
sta R_VRD
|
|
1046
|
+
rts
|
|
1047
|
+
cv_fail:
|
|
1048
|
+
lda #0
|
|
1049
|
+
sta R_VRD
|
|
1050
|
+
rts
|
|
1051
|
+
```
|
|
1052
|
+
|
|
1053
|
+
## Build
|
|
1054
|
+
|
|
1055
|
+
```bash
|
|
1056
|
+
java -jar $KICKASS_JAR isometric-room.asm -o isometric-room.prg
|
|
1057
|
+
```
|
|
1058
|
+
|
|
1059
|
+
## Expected output
|
|
1060
|
+
|
|
1061
|
+
The border is light blue during the run and turns green when the verdict byte
|
|
1062
|
+
`$02FF` equals 1. The screen shows the 8-by-8 diamond room: floor tiles in
|
|
1063
|
+
light green (palette 13), one-tile blocks in yellow (7), two-tile tall blocks
|
|
1064
|
+
in light red (10). Hardware sprite 0 (yellow figure) starts at map cell (1,1)
|
|
1065
|
+
and steps through (2,1), (3,1), (3,2), (3,3), (2,3), pausing roughly 25 frames
|
|
1066
|
+
at each position, then the room is redrawn once more and the border turns green.
|
|
1067
|
+
|
|
1068
|
+
**Verdict byte checks** (all must match for `$02FF = 1`):
|
|
1069
|
+
|
|
1070
|
+
- `$04B2` (screen row 4, col 18): char code 1 -- top-left of floor tile at (0,0)
|
|
1071
|
+
- `$0530` (screen row 7, col 24): char code 1 -- top-left of block(4,1) top face
|
|
1072
|
+
- `$0400` (screen row 0, col 0): char code `$20` -- empty cell above the room
|
|
1073
|
+
- `$0624` (screen row 13, col 28): char code 9 -- side face of tall block(7,2)
|
|
1074
|
+
|
|
1075
|
+
**Timer measurements** (CIA 1 timer A, one-shot from `$FFFF`, stored as
|
|
1076
|
+
`$FFFF - timer_value`; measured in VICE x64sc 3.10 PAL):
|
|
1077
|
+
|
|
1078
|
+
- First full room redraw: `$02F0/$02F1` = `$32`/`$A4` -> 42,034 cycles
|
|
1079
|
+
- Second full room redraw: `$02F2/$02F3` = `$A6`/`$A3` -> 41,894 cycles
|
|
1080
|
+
- One block draw (block at map cell (4,1)): `$02F4/$02F5` = `$0F`/`$02` -> 527 cycles
|
|
1081
|
+
|
|
1082
|
+
A PAL frame is 19,656 cycles; a full room redraw costs about 2.1 frames (the
|
|
1083
|
+
room is redrawn only at start and once after the last scripted move, not every
|
|
1084
|
+
frame). One block draw is 527 cycles, under 3 % of a frame. See "Cycle budget"
|
|
1085
|
+
in `docs/techniques/text-mode-render.md` under `isometric_tile_engine`.
|
|
1086
|
+
|
|
1087
|
+
**Depth bit (`$D01B` bit 0) and `$02FE`:** The spec's fixed map and sprite
|
|
1088
|
+
formula produce three positions where the sprite's 3-char-wide by 3-char-tall
|
|
1089
|
+
character box overlaps a block whose x+y exceeds the player's: map cells (2,1),
|
|
1090
|
+
(3,1), and (3,3). `$02FE` = 3 (measured). The spec targets one activation at
|
|
1091
|
+
(3,1); the overlap at (2,1) and (3,3) is a consequence of the sprite's full
|
|
1092
|
+
character bounding box touching the block at col 24 in both cases. The depth
|
|
1093
|
+
bit is cleared at all other positions.
|
|
1094
|
+
|
|
1095
|
+
**Screenshots:** PAL 384x272, NTSC 384x247. Both show the same room layout
|
|
1096
|
+
with a green border at the pinned cycle count (5,000,000 cycles).
|
|
1097
|
+
|
|
1098
|
+

|
|
1099
|
+

|
|
1100
|
+
|
|
1101
|
+
**Negative control -- reversed painter order:** Building with the outer loop
|
|
1102
|
+
running s from 14 down to 0 (front-to-back instead of back-to-front) causes
|
|
1103
|
+
far floor tiles to overdraw nearer blocks. At screen row 7, col 24 the correct
|
|
1104
|
+
build holds char 1 (CT0, the top-left of block(4,1)'s top face); the reversed
|
|
1105
|
+
build holds char 9 or 7 (a floor tile's bottom-row char drawn after the block).
|
|
1106
|
+
The verdict fails: border turns red.
|
|
1107
|
+
|
|
1108
|
+
## Why this works
|
|
1109
|
+
|
|
1110
|
+
**Painter's order.** The loop iterates diagonals `s = x + y` from 0 to 14. For
|
|
1111
|
+
each diagonal, cells are drawn left to right (decreasing y, increasing x). A
|
|
1112
|
+
cell at a higher diagonal value appears lower on screen and closer to the
|
|
1113
|
+
viewer, so drawing it last puts it on top of any background that was already
|
|
1114
|
+
there. No per-cell z-buffer is needed.
|
|
1115
|
+
|
|
1116
|
+
**Projection.** `col = OC + 2*(x - y)`, `row = OR + (x + y)` places cells on
|
|
1117
|
+
a 2:1 diamond grid. The factor of 2 on the x-y difference gives the horizontal
|
|
1118
|
+
spread, and x+y gives the vertical depth. All 64 cells land within columns 4
|
|
1119
|
+
to 35 and rows 4 to 19 with the chosen origin (OC=18, OR=4), so no boundary
|
|
1120
|
+
check is needed inside the draw loop.
|
|
1121
|
+
|
|
1122
|
+
**Depth bit.** After each move `update_player` calls `depth_check`, which
|
|
1123
|
+
iterates all 64 cells. Any cell with `x + y > px + py` is in front of the
|
|
1124
|
+
player. If that cell is a block and its character box (4 cols by 4 or 6 rows)
|
|
1125
|
+
overlaps the sprite's character box (3 cols by 3 rows, positioned from
|
|
1126
|
+
`sprite_x = 24 + 8*(col+2)`, `sprite_y = 45 + 8*row`), the routine sets
|
|
1127
|
+
`$D01B` bit 0, placing the sprite behind all playfield characters. One bit
|
|
1128
|
+
covers the whole sprite: the limitation is that the player appears behind every
|
|
1129
|
+
character on screen when the bit is set, not just the block in question. The
|
|
1130
|
+
Variations section of the technique entry discusses the fix.
|
|
1131
|
+
|
|
1132
|
+
## What it does not establish
|
|
1133
|
+
|
|
1134
|
+
**Per-frame animation.** The room is drawn twice (once at start, once after the
|
|
1135
|
+
last move) and is otherwise static. Moving the camera or animating tiles would
|
|
1136
|
+
require the redraw budget to fit inside the blank window (~6,700 cycles on PAL),
|
|
1137
|
+
which a full 64-cell room (42,034 cycles per redraw) does not.
|
|
1138
|
+
|
|
1139
|
+
**Correct per-block depth.** `$D01B` is one bit: when two blocks straddle the
|
|
1140
|
+
player, the bit puts the sprite behind both. A player standing between a front
|
|
1141
|
+
block and a rear block shows the rear block over the sprite even though it
|
|
1142
|
+
should be behind it.
|
|
1143
|
+
|
|
1144
|
+
**NTSC timing.** Both models run and pass the verdict. The timer values were
|
|
1145
|
+
measured only on PAL; NTSC cycle counts are not measured here.
|