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,563 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: beat-em-up-lanes
|
|
3
|
+
toolchain: oscar64
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [lane_depth_engine]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D010, D011, D015, D01B, D020, D021, D027, DC06, DC07, DC0F]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# Oscar64 beat-em-up lanes: a four-lane ground plane, a Y-sort that sets sprite priority, and hits gated by a Y window and an active-frame table
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A player and three enemies move on a ground plane drawn as tile rows in
|
|
19
|
+
four lane colours. Each actor has a plane Y, the line its feet stand on;
|
|
20
|
+
a higher plane Y is nearer the viewer. Every frame a persistent
|
|
21
|
+
insertion sort orders the four actors by plane Y and the draw gives the
|
|
22
|
+
nearest actor hardware sprite 0 and the farthest sprite 3, so a nearer
|
|
23
|
+
actor is drawn over a farther one by the VIC-II's own index priority.
|
|
24
|
+
Attacks are tested in the same order. A hit connects only when the
|
|
25
|
+
target's plane Y is within six lines of the attacker's, the target is
|
|
26
|
+
14 to 34 pixels away on the side the attacker faces, and the attack is
|
|
27
|
+
on one of the two active frames of its six-frame animation, read from
|
|
28
|
+
a per-frame table. All four actors run scripts that repeat every 256
|
|
29
|
+
frames: eight attacks, three of them out of the lane. At the end of
|
|
30
|
+
each pass the program checks the attack count, the hit count, the hit
|
|
31
|
+
log against the window and the sort order; `$02FF` = `01` and a green
|
|
32
|
+
border on a pass, `02` and red otherwise (`headless-verify.md`). The
|
|
33
|
+
HUD shows the sort order, each actor's lane, the counts and the CIA1
|
|
34
|
+
timer B cycles of the sort and of the whole engine step. This is the
|
|
35
|
+
`lane_depth_engine` technique from `docs/techniques/logic.md`.
|
|
36
|
+
|
|
37
|
+
## Source
|
|
38
|
+
|
|
39
|
+
```c
|
|
40
|
+
// beat-em-up-lanes.c
|
|
41
|
+
//
|
|
42
|
+
// A ground plane of four lanes drawn as tile rows. A player and three
|
|
43
|
+
// enemies move on it under a script; a higher plane Y is nearer the
|
|
44
|
+
// viewer. Every frame a persistent insertion sort orders the actors by
|
|
45
|
+
// plane Y, the nearest actor is given hardware sprite 0 and the farthest
|
|
46
|
+
// sprite 3, so nearer actors are drawn over farther ones. Attacks are
|
|
47
|
+
// tested in the same order. A hit connects only when the target is
|
|
48
|
+
// within WIN lines of the attacker in plane Y, within reach in X on the
|
|
49
|
+
// side the attacker faces, and the attack is on one of its active
|
|
50
|
+
// animation frames from a per-frame table.
|
|
51
|
+
// Rows 0-6: HUD. Rows 8-9: wall. Rows 10-22: the plane, one colour per
|
|
52
|
+
// lane. Scripts repeat every 256 frames; at the end of each pass the
|
|
53
|
+
// counts are checked: $02FF = 01 and a green border on a pass, 02 and
|
|
54
|
+
// red if not. A fail is sticky.
|
|
55
|
+
//
|
|
56
|
+
#include <c64/vic.h>
|
|
57
|
+
#include <c64/cia.h>
|
|
58
|
+
|
|
59
|
+
#define Screen ((char *)0x0400)
|
|
60
|
+
#define Color ((char *)0xd800)
|
|
61
|
+
#define SprData ((char *)0x3000) // blocks 192..195
|
|
62
|
+
#define SPR_BLK 192
|
|
63
|
+
#define VR ((volatile char *)0xd000)
|
|
64
|
+
#define PTR ((volatile char *)0x07f8)
|
|
65
|
+
#define RESULT (*(volatile char *)0x02ff)
|
|
66
|
+
|
|
67
|
+
// --- the plane --------------------------------------------------------------
|
|
68
|
+
#define N_ACT 4
|
|
69
|
+
#define PLANE_TOP 130 // plane Y of the far edge, feet line
|
|
70
|
+
#define LANE_H 25
|
|
71
|
+
#define N_LANES 4
|
|
72
|
+
#define WIN 6 // hit window in plane Y, either side
|
|
73
|
+
#define REACH_MIN 14 // target X minus attacker X, facing right
|
|
74
|
+
#define REACH_MAX 34
|
|
75
|
+
#define ANIM_RATE 4 // display frames per animation frame
|
|
76
|
+
#define ATT_LEN 6 // animation frames in an attack
|
|
77
|
+
#define STUN 8 // frames the target flashes
|
|
78
|
+
|
|
79
|
+
// --- the active-frame table: image per attack frame, and whether it hits --
|
|
80
|
+
const char att_image[ATT_LEN] = { 1, 1, 2, 2, 1, 0 };
|
|
81
|
+
const char att_active[ATT_LEN] = { 0, 0, 1, 1, 0, 0 };
|
|
82
|
+
|
|
83
|
+
// --- actors, parallel arrays ------------------------------------------------
|
|
84
|
+
int ax[N_ACT]; // sprite X of the left edge
|
|
85
|
+
char ay[N_ACT]; // plane Y: the feet line
|
|
86
|
+
char aface[N_ACT]; // 0 right, 1 left
|
|
87
|
+
char acol[N_ACT];
|
|
88
|
+
char aatt[N_ACT]; // 0 idle, else attack frame + 1
|
|
89
|
+
char aanim[N_ACT]; // display frames left on this frame
|
|
90
|
+
char alanded[N_ACT]; // a hit was already scored this attack
|
|
91
|
+
char astun[N_ACT];
|
|
92
|
+
|
|
93
|
+
// --- the scripts: dx, dy, frames, kind (0 walk, 1 attack, 2 wait) --------
|
|
94
|
+
struct Step { signed char dx, dy; char n, kind; };
|
|
95
|
+
|
|
96
|
+
const struct Step scr_p[] = { {2,0,36,0}, {0,0,30,1}, {0,1,20,0}, {0,0,30,1},
|
|
97
|
+
{0,1,15,0}, {0,0,30,1}, {0,0,95,2}, {0,0,0,2} };
|
|
98
|
+
const struct Step scr_e0[] = { {0,0,60,2}, {0,1,50,0}, {0,0,10,2}, {0,0,30,1},
|
|
99
|
+
{0,-1,16,0}, {0,0,4,2}, {0,0,30,1}, {0,0,56,2}, {0,0,0,2} };
|
|
100
|
+
const struct Step scr_e1[] = { {0,0,140,2}, {0,0,30,1}, {0,-1,40,0}, {0,0,46,2}, {0,0,0,2} };
|
|
101
|
+
const struct Step scr_e2[] = { {0,0,100,2}, {2,0,40,0}, {0,0,30,1}, {0,2,31,0},
|
|
102
|
+
{0,0,30,1}, {0,0,25,2}, {0,0,0,2} };
|
|
103
|
+
const struct Step *const scripts[N_ACT] = { scr_p, scr_e0, scr_e1, scr_e2 };
|
|
104
|
+
char sstep[N_ACT], sleft[N_ACT];
|
|
105
|
+
|
|
106
|
+
// --- the sort -----------------------------------------------------------------
|
|
107
|
+
char order[N_ACT]; // actor indices, far to near; persistent
|
|
108
|
+
|
|
109
|
+
void sort_depth(void)
|
|
110
|
+
{
|
|
111
|
+
for (char i = 1; i < N_ACT; i++) {
|
|
112
|
+
char a = order[i];
|
|
113
|
+
char y = ay[a];
|
|
114
|
+
char j = i;
|
|
115
|
+
while (j > 0 && ay[order[j - 1]] > y) {
|
|
116
|
+
order[j] = order[j - 1];
|
|
117
|
+
j--;
|
|
118
|
+
}
|
|
119
|
+
order[j] = a;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// --- the draw: nearest actor into sprite 0 ------------------------------------
|
|
124
|
+
void draw_actors(void)
|
|
125
|
+
{
|
|
126
|
+
char msb = 0;
|
|
127
|
+
for (char s = 0; s < N_ACT; s++) {
|
|
128
|
+
char a = order[N_ACT - 1 - s];
|
|
129
|
+
int x = ax[a];
|
|
130
|
+
VR[s * 2] = (char)x;
|
|
131
|
+
VR[s * 2 + 1] = ay[a] - 21;
|
|
132
|
+
if (x & 0x100)
|
|
133
|
+
msb |= 1 << s;
|
|
134
|
+
char img = 0;
|
|
135
|
+
if (aatt[a]) {
|
|
136
|
+
img = att_image[aatt[a] - 1];
|
|
137
|
+
if (img == 2 && aface[a])
|
|
138
|
+
img = 3; // the left-facing punch
|
|
139
|
+
}
|
|
140
|
+
PTR[s] = SPR_BLK + img;
|
|
141
|
+
VR[0x27 + s] = astun[a] ? 1 : acol[a];
|
|
142
|
+
}
|
|
143
|
+
VR[0x10] = msb;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// --- the hit test, in sort order ------------------------------------------------
|
|
147
|
+
char hits, attacks, outwin, maxdy;
|
|
148
|
+
char hit_ya[16], hit_yt[16]; // the hit log: both plane Ys at the hit
|
|
149
|
+
|
|
150
|
+
void hit_test(void)
|
|
151
|
+
{
|
|
152
|
+
for (char k = 0; k < N_ACT; k++) {
|
|
153
|
+
char a = order[k];
|
|
154
|
+
if (!aatt[a] || !att_active[aatt[a] - 1] || alanded[a])
|
|
155
|
+
continue;
|
|
156
|
+
for (char t = 0; t < N_ACT; t++) {
|
|
157
|
+
if (t == a)
|
|
158
|
+
continue;
|
|
159
|
+
char dy = ay[t] > ay[a] ? ay[t] - ay[a] : ay[a] - ay[t];
|
|
160
|
+
if (dy > WIN)
|
|
161
|
+
continue; // not in the lane
|
|
162
|
+
int dx = aface[a] ? ax[a] - ax[t] : ax[t] - ax[a];
|
|
163
|
+
if (dx < REACH_MIN || dx > REACH_MAX)
|
|
164
|
+
continue; // out of reach, or behind
|
|
165
|
+
if (hits < 16) {
|
|
166
|
+
hit_ya[hits] = ay[a];
|
|
167
|
+
hit_yt[hits] = ay[t];
|
|
168
|
+
}
|
|
169
|
+
hits++;
|
|
170
|
+
alanded[a] = 1;
|
|
171
|
+
astun[t] = STUN;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// --- the monitor: every logged hit re-checked against the window -------------
|
|
177
|
+
void monitor_hits(void)
|
|
178
|
+
{
|
|
179
|
+
maxdy = 0;
|
|
180
|
+
outwin = 0;
|
|
181
|
+
for (char i = 0; i < hits && i < 16; i++) {
|
|
182
|
+
int d = (int)hit_yt[i] - (int)hit_ya[i];
|
|
183
|
+
if (d < 0) d = -d;
|
|
184
|
+
if (d > maxdy) maxdy = d;
|
|
185
|
+
if (d > WIN) outwin++;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// --- the script and animation step --------------------------------------------
|
|
190
|
+
void step_actors(void)
|
|
191
|
+
{
|
|
192
|
+
for (char a = 0; a < N_ACT; a++) {
|
|
193
|
+
if (astun[a]) astun[a]--;
|
|
194
|
+
if (aatt[a]) {
|
|
195
|
+
if (--aanim[a] == 0) {
|
|
196
|
+
aanim[a] = ANIM_RATE;
|
|
197
|
+
if (++aatt[a] > ATT_LEN)
|
|
198
|
+
aatt[a] = 0;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (sleft[a] == 0) {
|
|
202
|
+
const struct Step *s = scripts[a] + sstep[a];
|
|
203
|
+
if (s->n == 0) { // end: restart the script
|
|
204
|
+
sstep[a] = 0;
|
|
205
|
+
s = scripts[a];
|
|
206
|
+
}
|
|
207
|
+
sleft[a] = s->n;
|
|
208
|
+
if (s->kind == 1) {
|
|
209
|
+
aatt[a] = 1;
|
|
210
|
+
aanim[a] = ANIM_RATE;
|
|
211
|
+
alanded[a] = 0;
|
|
212
|
+
attacks++;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const struct Step *s = scripts[a] + sstep[a];
|
|
216
|
+
if (s->kind == 0) {
|
|
217
|
+
ax[a] += s->dx;
|
|
218
|
+
ay[a] += s->dy;
|
|
219
|
+
}
|
|
220
|
+
if (--sleft[a] == 0)
|
|
221
|
+
sstep[a]++;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// --- CIA1 timer B -----------------------------------------------------------
|
|
226
|
+
static inline void timer_start(void)
|
|
227
|
+
{
|
|
228
|
+
cia1.crb = 0x00;
|
|
229
|
+
cia1.tb = 0xffff;
|
|
230
|
+
cia1.crb = 0x11;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
static inline unsigned timer_stop(void)
|
|
234
|
+
{
|
|
235
|
+
cia1.crb = 0x00;
|
|
236
|
+
return 0xffff - cia1.tb;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
__noinline void nothing(void) { }
|
|
240
|
+
|
|
241
|
+
unsigned time1(void (*fn)(void))
|
|
242
|
+
{
|
|
243
|
+
__asm { sei }
|
|
244
|
+
timer_start();
|
|
245
|
+
fn();
|
|
246
|
+
unsigned t = timer_stop();
|
|
247
|
+
__asm { cli }
|
|
248
|
+
return t;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// --- images: a body, a wind-up, a punch right, a punch left ---------------
|
|
252
|
+
void make_images(void)
|
|
253
|
+
{
|
|
254
|
+
for (unsigned i = 0; i < 4 * 64; i++)
|
|
255
|
+
SprData[i] = 0;
|
|
256
|
+
for (char f = 0; f < 4; f++) {
|
|
257
|
+
char *p = SprData + f * 64;
|
|
258
|
+
p[0 * 3 + 1] = 0x3c; p[1 * 3 + 1] = 0x3c; // head
|
|
259
|
+
for (char r = 3; r < 21; r++)
|
|
260
|
+
p[r * 3 + 1] = 0xff; // body
|
|
261
|
+
if (f == 1) {
|
|
262
|
+
for (char r = 8; r < 11; r++)
|
|
263
|
+
p[r * 3 + 1] = 0x7e; // wind-up
|
|
264
|
+
} else if (f == 2) {
|
|
265
|
+
for (char r = 8; r < 11; r++)
|
|
266
|
+
p[r * 3 + 2] = 0xff; // arm to the right
|
|
267
|
+
} else if (f == 3) {
|
|
268
|
+
for (char r = 8; r < 11; r++)
|
|
269
|
+
p[r * 3 + 0] = 0xff; // arm to the left
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// --- text (screen codes) ----------------------------------------------------
|
|
275
|
+
void put_str(char *p, const char *s)
|
|
276
|
+
{
|
|
277
|
+
while (*s)
|
|
278
|
+
*p++ = *s++;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
void put_dec(char *p, unsigned v, char digits)
|
|
282
|
+
{
|
|
283
|
+
for (char i = digits; i > 0; i--) {
|
|
284
|
+
p[i - 1] = 0x30 + v % 10;
|
|
285
|
+
v /= 10;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// --- the plane as tile rows ----------------------------------------------------
|
|
290
|
+
const char lane_col[N_LANES] = { 9, 8, 11, 12 };
|
|
291
|
+
|
|
292
|
+
void draw_plane(void)
|
|
293
|
+
{
|
|
294
|
+
for (char c = 0; c < 80; c++) { // rows 8 and 9: a wall
|
|
295
|
+
Screen[8 * 40 + c] = 0xa0;
|
|
296
|
+
Color[8 * 40 + c] = 6;
|
|
297
|
+
}
|
|
298
|
+
for (char r = 10; r < 23; r++) {
|
|
299
|
+
char py = r * 8 + 57; // plane Y of the row's last line
|
|
300
|
+
char lane = (py - PLANE_TOP) / LANE_H;
|
|
301
|
+
if (lane >= N_LANES) lane = N_LANES - 1;
|
|
302
|
+
for (char c = 0; c < 40; c++) {
|
|
303
|
+
Screen[r * 40 + c] = ((r + c) & 1) ? 0x66 : 0xa0;
|
|
304
|
+
Color[r * 40 + c] = lane_col[lane];
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Start of a pass: positions, facing and scripts. order[] is not reset;
|
|
310
|
+
// the persistent sort repairs it on the next frame.
|
|
311
|
+
void reset_actors(void)
|
|
312
|
+
{
|
|
313
|
+
ax[0] = 100; ay[0] = 165; aface[0] = 0; acol[0] = 7;
|
|
314
|
+
ax[1] = 200; ay[1] = 165; aface[1] = 1; acol[1] = 2;
|
|
315
|
+
ax[2] = 200; ay[2] = 200; aface[2] = 1; acol[2] = 5;
|
|
316
|
+
ax[3] = 60; ay[3] = 140; aface[3] = 0; acol[3] = 14;
|
|
317
|
+
for (char a = 0; a < N_ACT; a++) {
|
|
318
|
+
aatt[a] = 0; aanim[a] = 0; alanded[a] = 0; astun[a] = 0;
|
|
319
|
+
sstep[a] = 0; sleft[a] = 0;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// --- expected results per pass ---------------------------------------------------
|
|
324
|
+
#define EXP_ATTACKS 8
|
|
325
|
+
#define EXP_HITS 5
|
|
326
|
+
const char exp_order[N_ACT] = { 2, 1, 0, 3 };
|
|
327
|
+
|
|
328
|
+
int main(void)
|
|
329
|
+
{
|
|
330
|
+
vic.color_border = 0;
|
|
331
|
+
vic.color_back = 0;
|
|
332
|
+
for (unsigned i = 0; i < 1000; i++) {
|
|
333
|
+
Screen[i] = 0x20;
|
|
334
|
+
Color[i] = 1;
|
|
335
|
+
}
|
|
336
|
+
make_images();
|
|
337
|
+
draw_plane();
|
|
338
|
+
for (char a = 0; a < N_ACT; a++)
|
|
339
|
+
order[a] = a;
|
|
340
|
+
reset_actors();
|
|
341
|
+
|
|
342
|
+
put_str(Screen + 0, s"lane depth engine frame pass");
|
|
343
|
+
put_str(Screen + 1 * 40, s"result");
|
|
344
|
+
put_str(Screen + 2 * 40, s"order far>near expect 2 1 0 3");
|
|
345
|
+
put_str(Screen + 3 * 40, s"lane p0 e1 e2 e3 win 6");
|
|
346
|
+
put_str(Screen + 4 * 40, s"attacks hits expect 5 outwin");
|
|
347
|
+
put_str(Screen + 5 * 40, s"sort max min rev fwd");
|
|
348
|
+
put_str(Screen + 6 * 40, s"dy max engine max min");
|
|
349
|
+
|
|
350
|
+
// The sort's cost, display blanked: a reversed order (worst case) and
|
|
351
|
+
// an already sorted one (best case), less an empty call.
|
|
352
|
+
vic.ctrl1 &= ~VIC_CTRL1_DEN;
|
|
353
|
+
vic_waitFrame();
|
|
354
|
+
vic_waitFrame();
|
|
355
|
+
unsigned t_none = time1(nothing);
|
|
356
|
+
ay[0] = 200; ay[1] = 180; ay[2] = 160; ay[3] = 140;
|
|
357
|
+
order[0] = 0; order[1] = 1; order[2] = 2; order[3] = 3;
|
|
358
|
+
unsigned t_rev = time1(sort_depth) - t_none;
|
|
359
|
+
unsigned t_fwd = time1(sort_depth) - t_none;
|
|
360
|
+
vic.ctrl1 |= VIC_CTRL1_DEN;
|
|
361
|
+
put_dec(Screen + 5 * 40 + 27, t_rev, 3);
|
|
362
|
+
put_dec(Screen + 5 * 40 + 36, t_fwd, 3);
|
|
363
|
+
reset_actors();
|
|
364
|
+
|
|
365
|
+
VR[0x15] = 0x0f;
|
|
366
|
+
VR[0x1b] = 0;
|
|
367
|
+
char frame = 0, pass = 0, fault = 0;
|
|
368
|
+
unsigned total = 0, s_max = 0, s_min = 0xffff, e_max = 0, e_min = 0xffff;
|
|
369
|
+
|
|
370
|
+
for (;;) {
|
|
371
|
+
vic_waitFrame();
|
|
372
|
+
step_actors();
|
|
373
|
+
__asm { sei }
|
|
374
|
+
timer_start();
|
|
375
|
+
sort_depth();
|
|
376
|
+
unsigned ts = timer_stop();
|
|
377
|
+
timer_start();
|
|
378
|
+
draw_actors();
|
|
379
|
+
char before = hits;
|
|
380
|
+
hit_test();
|
|
381
|
+
unsigned te = timer_stop() + ts; // the engine step: sort, draw, hit test
|
|
382
|
+
__asm { cli }
|
|
383
|
+
if (ts > s_max) s_max = ts;
|
|
384
|
+
if (ts < s_min) s_min = ts;
|
|
385
|
+
if (te > e_max) e_max = te;
|
|
386
|
+
if (te < e_min) e_min = te;
|
|
387
|
+
if (hits != before)
|
|
388
|
+
monitor_hits(); // re-check the whole log on each new hit
|
|
389
|
+
|
|
390
|
+
put_dec(Screen + 26, total, 5);
|
|
391
|
+
put_dec(Screen + 37, pass, 2);
|
|
392
|
+
for (char k = 0; k < N_ACT; k++)
|
|
393
|
+
Screen[2 * 40 + 15 + k * 2] = 0x30 + order[k];
|
|
394
|
+
for (char a = 0; a < N_ACT; a++)
|
|
395
|
+
Screen[3 * 40 + 8 + a * 5] = 0x30 + (ay[a] - PLANE_TOP) / LANE_H;
|
|
396
|
+
put_dec(Screen + 4 * 40 + 8, attacks, 2);
|
|
397
|
+
put_dec(Screen + 4 * 40 + 16, hits, 2);
|
|
398
|
+
put_dec(Screen + 4 * 40 + 36, outwin, 2);
|
|
399
|
+
put_dec(Screen + 5 * 40 + 9, s_max, 4);
|
|
400
|
+
put_dec(Screen + 5 * 40 + 18, s_min, 4);
|
|
401
|
+
put_dec(Screen + 6 * 40 + 7, maxdy, 2);
|
|
402
|
+
put_dec(Screen + 6 * 40 + 21, e_max, 4);
|
|
403
|
+
put_dec(Screen + 6 * 40 + 30, e_min, 4);
|
|
404
|
+
|
|
405
|
+
total++;
|
|
406
|
+
if (++frame == 0) { // end of a 256-frame pass
|
|
407
|
+
if (attacks != EXP_ATTACKS) fault = 1;
|
|
408
|
+
if (hits != EXP_HITS) fault = 2;
|
|
409
|
+
if (outwin || maxdy > WIN) fault = 3;
|
|
410
|
+
for (char k = 0; k < N_ACT; k++)
|
|
411
|
+
if (order[k] != exp_order[k]) fault = 4;
|
|
412
|
+
RESULT = fault ? 2 : 1;
|
|
413
|
+
vic.color_border = fault ? 2 : 5;
|
|
414
|
+
put_str(Screen + 40 + 7, fault ? s"fail" : s"pass");
|
|
415
|
+
Screen[40 + 12] = 0x30 + fault;
|
|
416
|
+
pass++;
|
|
417
|
+
attacks = 0; hits = 0; outwin = 0; maxdy = 0;
|
|
418
|
+
reset_actors(); // the next pass replays the fight
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
return 0;
|
|
422
|
+
}
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
## Build
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
oscar64 -tm=c64 -O2 -o=beat-em-up-lanes.prg beat-em-up-lanes.c
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
Produces `beat-em-up-lanes.prg`, 3,226 bytes. The four sprite images
|
|
432
|
+
are built at run time at `$3000`, blocks 192 to 195. Then run headless
|
|
433
|
+
in VICE (PAL):
|
|
434
|
+
|
|
435
|
+
```bash
|
|
436
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas x64sc -default -warp +sound \
|
|
437
|
+
+autostart-delay-random -autostartprgmode 1 -limitcycles 11200000 \
|
|
438
|
+
-exitscreenshot beat-em-up-lanes.png -autostart beat-em-up-lanes.prg
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
Add `-model ntsc` for the NTSC picture. A pass is 256 frames; the
|
|
442
|
+
verdict is posted at the end of the first pass, and the pinned cycle
|
|
443
|
+
count lands in the second pass, PAL at pass frame 154 and NTSC at pass
|
|
444
|
+
frame 209, both with a punch on screen.
|
|
445
|
+
|
|
446
|
+
## Expected output
|
|
447
|
+
|
|
448
|
+
The actors, their start positions and their scripts. Actor 0 is the
|
|
449
|
+
player (yellow, faces right); 1, 2 and 3 are enemies (red and green
|
|
450
|
+
facing left, light blue facing right). Plane Y 130 to 229 is four lanes
|
|
451
|
+
of 25 lines; lane = (plane Y - 130) / 25.
|
|
452
|
+
|
|
453
|
+
| Actor | Start X, plane Y | Script (frames of the pass) |
|
|
454
|
+
|---|---|---|
|
|
455
|
+
| 0 | 100, 165 | walk right to X 172 (0-35); attack (36-65); walk down to Y 185 (66-85); attack (86-115); walk down to Y 200 (116-130); attack (131-160); wait |
|
|
456
|
+
| 1 | 200, 165 | wait; walk down to Y 215 (60-109); wait; attack (120-149); walk up to Y 199 (150-165); wait; attack (170-199); wait |
|
|
457
|
+
| 2 | 200, 200 | wait; attack (140-169); walk up to Y 160 (170-209); wait |
|
|
458
|
+
| 3 | 60, 140 | wait; walk right to X 140 (100-139); attack (140-169); walk down to Y 202 (170-200); attack (201-230); wait |
|
|
459
|
+
|
|
460
|
+
An attack is six animation frames of four display frames each; frames
|
|
461
|
+
3 and 4 (display frames 8 to 15 of the attack) are active. Worked from
|
|
462
|
+
the table: eight attacks, five hits (0 on 1 at Y 165; 0 on 2 and 2 on 0
|
|
463
|
+
at Y 200; 1 on 0 with Y 199 against 200; 3 on 0 with Y 202 against
|
|
464
|
+
200), three attacks that miss because the only target in reach is 15
|
|
465
|
+
or more lines away in plane Y, the largest Y difference at a hit 2, and
|
|
466
|
+
the order far to near at the end of the pass 2 1 0 3 (plane Y 160, 199,
|
|
467
|
+
200, 202).
|
|
468
|
+
|
|
469
|
+
Measured in VICE x64sc 3.10 with the pinned command, text decoded
|
|
470
|
+
against the character ROM (rows 0 to 6). PAL, frame 410, pass 1 frame
|
|
471
|
+
154, mid-fight: actor 2 punching actor 0 (flashing white from the
|
|
472
|
+
hit) and actor 3 punching into an empty lane:
|
|
473
|
+
|
|
474
|
+
```text
|
|
475
|
+
LANE DEPTH ENGINE FRAME 00410 PASS 01
|
|
476
|
+
RESULT PASS 0
|
|
477
|
+
ORDER FAR>NEAR 3 0 2 1 EXPECT 2 1 0 3
|
|
478
|
+
LANE P02 E13 E22 E30 WIN 6
|
|
479
|
+
ATTACKS 06 HITS 03 EXPECT 5 OUTWIN 00
|
|
480
|
+
SORT MAX 0269 MIN 0174 REV 262 FWD 157
|
|
481
|
+
DY MAX 00 ENGINE MAX 1413 MIN 0784
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
NTSC, frame 465, pass 1 frame 209: actor 3 punching actor 0 from two
|
|
485
|
+
lines nearer:
|
|
486
|
+
|
|
487
|
+
```text
|
|
488
|
+
LANE DEPTH ENGINE FRAME 00465 PASS 01
|
|
489
|
+
RESULT PASS 0
|
|
490
|
+
ORDER FAR>NEAR 2 1 0 3 EXPECT 2 1 0 3
|
|
491
|
+
LANE P02 E12 E21 E32 WIN 6
|
|
492
|
+
ATTACKS 08 HITS 05 EXPECT 5 OUTWIN 00
|
|
493
|
+
SORT MAX 0279 MIN 0174 REV 262 FWD 157
|
|
494
|
+
DY MAX 01 ENGINE MAX 1413 MIN 0784
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
`RESULT PASS 0` is the first pass's verdict: 8 attacks, 5 hits, no hit
|
|
498
|
+
outside the window, order 2 1 0 3. A run to 16,000,000 cycles shows
|
|
499
|
+
pass 2 green on both models with the same figures, so the pass reset
|
|
500
|
+
replays the fight exactly. Border green, `$02FF` = `01`.
|
|
501
|
+
|
|
502
|
+
The priority assignment, measured on the PAL picture: at pass frame 154
|
|
503
|
+
actor 1 (red, plane Y 210, walking up) and actor 2 (green, plane Y 200)
|
|
504
|
+
stand at the same X 200; on the lines both bodies cover the pixel is
|
|
505
|
+
red (175, 60, 88), the nearer actor, and above the overlap it is green
|
|
506
|
+
(98, 213, 50).
|
|
507
|
+
|
|
508
|
+
The cycle figures, CIA1 timer B, interrupts masked, Oscar64 `-O2`:
|
|
509
|
+
|
|
510
|
+
| Figure | Cycles | Conditions |
|
|
511
|
+
|---|---|---|
|
|
512
|
+
| Sort, four actors in reverse order | 262 | screen blanked, less an empty call |
|
|
513
|
+
| Sort, four actors already in order | 157 | screen blanked, less an empty call |
|
|
514
|
+
| Sort per frame, worst and best over the run | 269 PAL, 279 NTSC, and 174 | screen on, sprites on; the peak is the sort with badline stalls inside it, and where they land moves with the code |
|
|
515
|
+
| Engine step (sort, draw, hit test), worst and best | 1,413 and 784 | screen on; the worst frame is one with an active attack and badline stalls inside it |
|
|
516
|
+
|
|
517
|
+
The best engine step is 784: the sort plus the four-sprite draw on a
|
|
518
|
+
frame with no active attack, which does no pair tests. An earlier
|
|
519
|
+
version of this page gave it as 84; the HUD printed the figure with two
|
|
520
|
+
digits and the leading 7 was cut, which a four-digit field now shows.
|
|
521
|
+
The NTSC sort peak of 279 is not a different sort: the same code on
|
|
522
|
+
the PAL run peaks at 269, and a build eight bytes longer read 269 on
|
|
523
|
+
NTSC at the pinned frame and 279 later in the run. The screenshots are
|
|
524
|
+
`screenshots/beat-em-up-lanes.png` and
|
|
525
|
+
`screenshots/beat-em-up-lanes-ntsc.png`.
|
|
526
|
+
|
|
527
|
+
## Why this works
|
|
528
|
+
|
|
529
|
+
The sort is the whole engine. `order[]` holds actor indices far to near
|
|
530
|
+
and is never reset: each frame the insertion sort repairs it, so an
|
|
531
|
+
actor that has not passed a neighbour costs one compare and the whole
|
|
532
|
+
pass over four actors is 157 to 279 cycles. The draw walks `order[]`
|
|
533
|
+
from the near end and writes actor `order[3 - s]` into hardware sprite
|
|
534
|
+
`s`: position, `$D010` bit, pointer and colour all move with the actor,
|
|
535
|
+
because the VIC-II draws a lower-numbered sprite over a higher one and
|
|
536
|
+
that is the only priority it has between sprites. A tie in plane Y is
|
|
537
|
+
left in its previous order, which is what a stable insertion sort does
|
|
538
|
+
by itself. `hit_test` walks the same order, so with more actors the
|
|
539
|
+
pair loop can stop early on the Y compare.
|
|
540
|
+
|
|
541
|
+
A hit is three gates in the cheap order. The Y window first: the
|
|
542
|
+
absolute difference of two plane Ys against `WIN`, one byte compare,
|
|
543
|
+
which fails for most pairs. Then reach, a signed 16-bit difference with
|
|
544
|
+
the sign chosen by the attacker's facing, so an attack cannot connect
|
|
545
|
+
behind the attacker. Then the frame gate, which is not a compare at all:
|
|
546
|
+
`att_active[]` is indexed by the attack's animation frame, the same
|
|
547
|
+
index that picks the image in `att_image[]`, so the frames on which the
|
|
548
|
+
punch image shows are the frames on which it can land, and `alanded`
|
|
549
|
+
stops one attack scoring twice on its second active frame. Actor 0's
|
|
550
|
+
second attack and one attack each from actors 1 and 3 have the only
|
|
551
|
+
target in reach 15 or more lines away, and those are the three misses
|
|
552
|
+
the count expects.
|
|
553
|
+
|
|
554
|
+
The monitor is a second computation, not the first one repeated. Each
|
|
555
|
+
hit logs both plane Ys at the moment it connects; `monitor_hits`
|
|
556
|
+
recomputes the difference as a signed int over the whole log and counts
|
|
557
|
+
any above the window. It re-checks the log at the moment of each new
|
|
558
|
+
hit rather than against the actors' later positions, which an earlier
|
|
559
|
+
version of this listing did and which reported six violations on a
|
|
560
|
+
correct fight. The pass reset restores positions and scripts but leaves
|
|
561
|
+
`order[]` alone, which is the point of a persistent sort; the second
|
|
562
|
+
pass then reproduces the first's counts, and a run to 16,000,000
|
|
563
|
+
cycles confirms it.
|