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,289 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: fixed-point-jump-velocity
|
|
3
|
+
toolchain: oscar64
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [fixed_point_8_8, jump_arc_table]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D002, D003, D010, D015, D017, D01C, D01D, D020, D021, D027, D028]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# Oscar64 fixed-point jump from any height
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Two hardware sprites jump from floors of different height, both driven
|
|
19
|
+
by one table of per-frame velocities in 8.8 fixed point. The table is
|
|
20
|
+
independent of where the jump starts: each frame `y += vy_tab[n]`, and
|
|
21
|
+
the caller decides what a landing is. That is the form a platformer
|
|
22
|
+
needs, because `fixed-point-jump.md` holds absolute Y from one fixed
|
|
23
|
+
ground and cannot be used from a platform. Row 24 shows the frame
|
|
24
|
+
counter and each jumper's `y` and `vy`; `$02FF` holds `01` once both
|
|
25
|
+
have landed and every landing was exact, `02` if any landing overshot
|
|
26
|
+
its floor, and the border turns green or red to match.
|
|
27
|
+
|
|
28
|
+
## Source
|
|
29
|
+
|
|
30
|
+
```c
|
|
31
|
+
// fixed-point-jump-velocity.c -- two sprites jump from floors of different
|
|
32
|
+
// height using one per-frame velocity table in 8.8. Row 24 shows the frame
|
|
33
|
+
// counter and each jumper's y and vy; $02FF and the border report whether
|
|
34
|
+
// every landing was exact.
|
|
35
|
+
// Build: oscar64 -tm=c64 -O2 -o=fixed-point-jump-velocity.prg fixed-point-jump-velocity.c
|
|
36
|
+
#include <c64/vic.h>
|
|
37
|
+
#include <c64/sprites.h>
|
|
38
|
+
|
|
39
|
+
#define SCREEN ((char *)0x0400)
|
|
40
|
+
#define COLOUR ((char *)0xd800)
|
|
41
|
+
#define SPRDATA ((char *)0x0340) // block 13, the cassette buffer
|
|
42
|
+
#define HUD (SCREEN + 24 * 40) // bottom row: written after the beam has drawn it
|
|
43
|
+
#define RESULT (*(volatile char *)0x02ff)
|
|
44
|
+
|
|
45
|
+
#define PERIOD 52 // updates from launch to landing, from gen.py
|
|
46
|
+
|
|
47
|
+
// Per-frame velocity in 8.8, + is down, from gen.py with V0 = -$0380,
|
|
48
|
+
// G = +$0024 and VTERM = +$0210. Entry n is added to y on update n + 1.
|
|
49
|
+
static const int vy_tab[PERIOD] = {
|
|
50
|
+
-860, -824, -788, -752, -716, -680, -644, -608,
|
|
51
|
+
-572, -536, -500, -464, -428, -392, -356, -320,
|
|
52
|
+
-284, -248, -212, -176, -140, -104, -68, -32,
|
|
53
|
+
4, 40, 76, 112, 148, 184, 220, 256,
|
|
54
|
+
292, 328, 364, 400, 436, 472, 508, 528,
|
|
55
|
+
528, 528, 528, 528, 528, 528, 528, 528,
|
|
56
|
+
528, 528, 528, 528
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
struct Jumper
|
|
60
|
+
{
|
|
61
|
+
char x; // sprite X register
|
|
62
|
+
char floor; // sprite Y register when standing on its floor
|
|
63
|
+
char n; // next table entry; 0 = standing, about to launch
|
|
64
|
+
unsigned y_fp; // 8.8 position, high byte is the sprite Y register
|
|
65
|
+
int vy; // velocity used on the last update, for the HUD
|
|
66
|
+
char landings; // landings so far
|
|
67
|
+
char wait; // frames to hold on the floor before the first launch
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
static struct Jumper jumper[2] = {
|
|
71
|
+
{ 100, 213, 0, 213 << 8, 0, 0, 0 }, // A: the ground, char row 23
|
|
72
|
+
{ 220, 149, 0, 149 << 8, 0, 0, 26 } // B: a platform on char row 15, launched half a period later
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
static void put_dec(char col, unsigned v, char width)
|
|
76
|
+
{
|
|
77
|
+
char *p = HUD + col;
|
|
78
|
+
for (signed char k = width - 1; k >= 0; k--) { p[k] = 0x30 + v % 10; v /= 10; }
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// 8.8 value as integer.fraction, the fraction being the raw low byte 0..255.
|
|
82
|
+
static void put_fp(char col, unsigned v)
|
|
83
|
+
{
|
|
84
|
+
put_dec(col, v >> 8, 3);
|
|
85
|
+
HUD[col + 3] = 0x2e;
|
|
86
|
+
put_dec(col + 4, v & 0xff, 3);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Signed 8.8 velocity as sign, integer, fraction byte.
|
|
90
|
+
static void put_vel(char col, int v)
|
|
91
|
+
{
|
|
92
|
+
unsigned m = v < 0 ? -v : v;
|
|
93
|
+
HUD[col] = v < 0 ? 0x2d : 0x2b;
|
|
94
|
+
HUD[col + 1] = 0x30 + (m >> 8);
|
|
95
|
+
HUD[col + 2] = 0x2e;
|
|
96
|
+
put_dec(col + 3, m & 0xff, 3);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
static void put_floor(char row, char col0, char col1)
|
|
100
|
+
{
|
|
101
|
+
for (char c = col0; c <= col1; c++) { SCREEN[row * 40 + c] = 0xa0; COLOUR[row * 40 + c] = 12; }
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
int main(void)
|
|
105
|
+
{
|
|
106
|
+
for (unsigned i = 0; i < 1000; i++) { SCREEN[i] = 0x20; COLOUR[i] = 1; }
|
|
107
|
+
for (char i = 0; i < 63; i++) SPRDATA[i] = 0xff; // solid 24x21 block
|
|
108
|
+
vic.color_back = 0;
|
|
109
|
+
vic.color_border = 0;
|
|
110
|
+
put_floor(23, 0, 39); // ground under A
|
|
111
|
+
put_floor(15, 22, 29); // platform under B
|
|
112
|
+
|
|
113
|
+
spr_init(SCREEN);
|
|
114
|
+
spr_set(0, true, jumper[0].x, jumper[0].floor, 13, VCOL_YELLOW, false, false, false);
|
|
115
|
+
spr_set(1, true, jumper[1].x, jumper[1].floor, 13, VCOL_LT_BLUE, false, false, false);
|
|
116
|
+
|
|
117
|
+
HUD[0] = 6; HUD[7] = 1; HUD[24] = 2; // f, a, b labels
|
|
118
|
+
|
|
119
|
+
unsigned frame = 0;
|
|
120
|
+
char failed = 0;
|
|
121
|
+
|
|
122
|
+
// Landing is the caller's job: the table only supplies vy.
|
|
123
|
+
for (;;)
|
|
124
|
+
{
|
|
125
|
+
vic_waitFrame();
|
|
126
|
+
|
|
127
|
+
for (char j = 0; j < 2; j++)
|
|
128
|
+
{
|
|
129
|
+
struct Jumper *p = &jumper[j];
|
|
130
|
+
unsigned floor_fp = (unsigned)p->floor << 8;
|
|
131
|
+
|
|
132
|
+
if (p->wait) { p->wait--; continue; }
|
|
133
|
+
p->vy = vy_tab[p->n];
|
|
134
|
+
p->y_fp += p->vy;
|
|
135
|
+
p->n++;
|
|
136
|
+
if (p->y_fp >= floor_fp) // reached or passed the floor
|
|
137
|
+
{
|
|
138
|
+
if (p->y_fp != floor_fp) failed = 1; // overshoot: the table's sum is not zero
|
|
139
|
+
p->y_fp = floor_fp;
|
|
140
|
+
p->n = 0;
|
|
141
|
+
if (p->landings < 255) p->landings++;
|
|
142
|
+
if (failed)
|
|
143
|
+
{ RESULT = 2; vic.color_border = 2; }
|
|
144
|
+
else if (jumper[0].landings && jumper[1].landings)
|
|
145
|
+
{ RESULT = 1; vic.color_border = 5; }
|
|
146
|
+
}
|
|
147
|
+
spr_move(j, p->x, p->y_fp >> 8);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
put_dec(2, frame, 4);
|
|
151
|
+
put_fp(9, jumper[0].y_fp); put_vel(17, jumper[0].vy);
|
|
152
|
+
put_fp(26, jumper[1].y_fp); put_vel(34, jumper[1].vy);
|
|
153
|
+
frame++;
|
|
154
|
+
}
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Build
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
oscar64 -tm=c64 -O2 -o=fixed-point-jump-velocity.prg fixed-point-jump-velocity.c
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Produces `fixed-point-jump-velocity.prg` (1,232 bytes including the
|
|
166
|
+
BASIC stub), with no warnings. Load with
|
|
167
|
+
`LOAD"FIXED-POINT-JUMP-VELOCITY",8,1 : RUN` or via VICE autostart.
|
|
168
|
+
|
|
169
|
+
`vy_tab[]` is generated off-line by `gen.py`, which runs the same update
|
|
170
|
+
the loop runs and stops at the first update whose position sum reaches
|
|
171
|
+
the floor. It prints the period, the landing remainder and the table:
|
|
172
|
+
|
|
173
|
+
```text
|
|
174
|
+
# gen.py -- per-frame velocity table for fixed-point-jump-velocity.c
|
|
175
|
+
# 8.8 fixed point: 256 units = 1 pixel. + is down. Semi-implicit Euler:
|
|
176
|
+
# each frame v += G, clamp to VTERM, then y += v. Entry n is the v used
|
|
177
|
+
# on update n+1 (the first update after launch reads entry 0).
|
|
178
|
+
V0 = -0x0380 # -3.5 px/frame = -896
|
|
179
|
+
G = 0x0024 # +0.140625 px/frame^2 = 36
|
|
180
|
+
VTERM = 0x0210 # +2.0625 px/frame = 528
|
|
181
|
+
v, y, tab = V0, 0, []
|
|
182
|
+
while True:
|
|
183
|
+
v = min(v + G, VTERM)
|
|
184
|
+
tab.append(v)
|
|
185
|
+
y += v
|
|
186
|
+
if y >= 0:
|
|
187
|
+
break
|
|
188
|
+
print("PERIOD", len(tab), "landing remainder", y, "(0 = exact)")
|
|
189
|
+
for i in range(0, len(tab), 8):
|
|
190
|
+
print(" " + ", ".join("%6d" % x for x in tab[i:i+8]) + ",")
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Output: `PERIOD 52 landing remainder 0 (0 = exact)` and the 52 entries in
|
|
194
|
+
the listing. The arithmetic: entry `n` is `V0 + (n + 1) * G` until that
|
|
195
|
+
passes `VTERM`, so entry 0 is `-896 + 36 = -860` and entry 23 is
|
|
196
|
+
`-896 + 24 * 36 = -32`; entry 38 would be `-896 + 39 * 36 = 508` and
|
|
197
|
+
entry 39 would be 544, above 528, so entries 39 to 51 are the terminal
|
|
198
|
+
528. The position sum of the 39 ramp entries is `39 * (-860 + 508) / 2 =
|
|
199
|
+
-6864`, and 13 terminal entries add `13 * 528 = 6864`, so the sum is 0
|
|
200
|
+
at update 52 and the landing is exact. The apex is the most negative
|
|
201
|
+
running sum, after entry 23: `24 * (-860 - 32) / 2 = -10704`, which is
|
|
202
|
+
41.81 pixels above the floor.
|
|
203
|
+
|
|
204
|
+
The constants were chosen for that zero. The pair the issue suggested,
|
|
205
|
+
`-3.5` and `+0.15625` (`$28`), passes the floor by 8 to 744 units
|
|
206
|
+
(1/32 to 2.9 pixels) for every terminal velocity from 1.5 to 4.0 in
|
|
207
|
+
steps of 1/32 (checked in Python, not on the 6510); a landing that is
|
|
208
|
+
not exact needs the clamp, and then the result byte would never read
|
|
209
|
+
`01`. Change any of the three constants
|
|
210
|
+
and rerun `gen.py` until the remainder is 0, or accept the clamp and
|
|
211
|
+
drop the exactness check.
|
|
212
|
+
|
|
213
|
+
## Expected output
|
|
214
|
+
|
|
215
|
+
Black screen, black border until the first landing after both have
|
|
216
|
+
jumped, then green. A grey ground across char row 23 and a grey
|
|
217
|
+
platform on char row 15, columns 22 to 29. A yellow 24x21 sprite at
|
|
218
|
+
X 100 jumps from the ground (standing Y register 213) and a light blue
|
|
219
|
+
one at X 220 jumps from the platform (standing Y 149); the blue one
|
|
220
|
+
launches 26 frames later, so the two are half a period apart. Row 24
|
|
221
|
+
reads `F nnnn A yyy.fff svy.fff B yyy.fff svy.fff`: the frame counter,
|
|
222
|
+
then for each jumper the position as integer and raw fraction byte (0
|
|
223
|
+
to 255, so `.128` is one half) and the velocity as sign, integer and
|
|
224
|
+
fraction byte. The border goes red and `$02FF` reads `02` only if a
|
|
225
|
+
landing overshoots its floor; neither pinned run did that.
|
|
226
|
+
|
|
227
|
+
Pinned runs (VICE x64sc 3.10, `-warp +sound +autostart-delay-random
|
|
228
|
+
-autostartprgmode 1 -limitcycles 8000000`), pictures in
|
|
229
|
+
`screenshots/fixed-point-jump-velocity.png` and
|
|
230
|
+
`screenshots/fixed-point-jump-velocity-ntsc.png`, decoded with the
|
|
231
|
+
character ROM and measured with PIL. Each command was run twice and the
|
|
232
|
+
two PNGs were byte-identical.
|
|
233
|
+
|
|
234
|
+
| | PAL | NTSC (`-model ntsc`) |
|
|
235
|
+
|---|---|---|
|
|
236
|
+
| Row 24 text | `F 0251 A 196.128 +2.016 B 110.012 -0.248` | `F 0283 A 171.048 -0.032 B 144.224 +2.016` |
|
|
237
|
+
| A: updates since launch, entry just added | 44, 528 (terminal) | 24, -32 |
|
|
238
|
+
| B: updates since launch, entry just added | 18, -248 | 50, 528 (terminal) |
|
|
239
|
+
| Sprite A rows in the PNG | 181 to 201 | 144 to 164 |
|
|
240
|
+
| Sprite B rows in the PNG | 95 to 115 | 117 to 137 |
|
|
241
|
+
| Sprite Y from the PNG (first row is line Y + 1) | A 196, B 110 | A 171, B 144 |
|
|
242
|
+
| Landings before the picture | A 4, B 4 | A 5, B 4 |
|
|
243
|
+
| Border pixel (2,100) | (98, 213, 50), green | (114, 189, 103), green |
|
|
244
|
+
|
|
245
|
+
The text and the sprites describe the same frame in both pictures: the
|
|
246
|
+
row is written after the update that moved the sprites, and the row is
|
|
247
|
+
the last one the beam draws. Running the loop in Python for 252 updates
|
|
248
|
+
(PAL, `F 0251`) and 284 (NTSC) gives the same four position and
|
|
249
|
+
velocity values as the pictures.
|
|
250
|
+
|
|
251
|
+
Verdict trace (`-moncommands` with `trace store 02ff` and
|
|
252
|
+
`command 1 "m 02ff 02ff"`, the route in `runtime/vice-reference.md`):
|
|
253
|
+
PAL logged `00` from the KERNAL reset and then `01` seven times, NTSC
|
|
254
|
+
`00` and then `01` eight times, one per landing after the first one
|
|
255
|
+
that had both jumpers down. No `02` in either log.
|
|
256
|
+
|
|
257
|
+
## Why this works
|
|
258
|
+
|
|
259
|
+
The table holds velocity, not position, so the origin is the caller's:
|
|
260
|
+
`y_fp += vy_tab[n]` from any starting `y_fp`, and the apex, the period
|
|
261
|
+
and the landing speed are the same from the ground and from the
|
|
262
|
+
platform. The sum of the table is zero, so a sprite that starts on a
|
|
263
|
+
floor is back on it exactly after `PERIOD` updates. The loop checks
|
|
264
|
+
that with `y_fp != floor_fp` on the landing update and reports through
|
|
265
|
+
`$02FF` and the border; with these constants the clamp that follows
|
|
266
|
+
never changes the value. A game keeps the check out and the clamp in,
|
|
267
|
+
because a moving platform or a floor under a falling sprite will not be
|
|
268
|
+
where the sum lands. The terminal velocity is in the table as a run of
|
|
269
|
+
equal entries; a longer fall than the table just holds the last entry,
|
|
270
|
+
which is the one thing this recipe does not exercise.
|
|
271
|
+
|
|
272
|
+
`y_fp` is `unsigned` so that `213 << 8` does not wrap negative as it
|
|
273
|
+
would in an `int`; adding the signed `vy` to it is a two's-complement
|
|
274
|
+
add and the compare against `floor_fp` stays unsigned. Oscar64 keeps
|
|
275
|
+
both in 16 bits; the update is one indexed 16-bit load from `vy_tab[]`
|
|
276
|
+
and one 16-bit add, every operand indexed through the `jumper[]` array,
|
|
277
|
+
so the `fixed_point_8_8` figure in `techniques/maths.md` (two adds on
|
|
278
|
+
absolute operands) is a floor, not this loop's cost (not measured here).
|
|
279
|
+
|
|
280
|
+
The HUD is on row 24, not row 0. The mismatch was measured and the
|
|
281
|
+
reason is inferred. A first build wrote the same text to row 0; on PAL
|
|
282
|
+
the picture agreed with itself, but on NTSC sprite B was one update
|
|
283
|
+
ahead of the text (the row said `150.208`, the PNG put the sprite at
|
|
284
|
+
152). `vic_waitFrame()` returns at raster line 256, and the 24 digits
|
|
285
|
+
on the row (22 of them through a divide-by-ten loop) take longer than
|
|
286
|
+
the 7 lines to the end of an NTSC frame plus the 51 to the top of the
|
|
287
|
+
text area, so the beam drew row 0 before the new text was in it. The
|
|
288
|
+
bottom row is drawn last, so the text there always describes the frame
|
|
289
|
+
that is on screen.
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: fixed-point-jump
|
|
3
|
+
toolchain: oscar64
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [fixed_point_8_8, jump_arc_table]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D010, D015, D017, D01C, D01D, D020, D021, D027]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# Oscar64 fixed-point jump arc
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
One hardware sprite jumps and lands, over and over, with its position
|
|
19
|
+
held in 8.8 fixed point: velocity gains gravity, position gains velocity,
|
|
20
|
+
the high byte goes to the sprite Y register. The same arc is also held
|
|
21
|
+
as a 63-byte table, `arc_y[]`, generated off-line from the same two
|
|
22
|
+
adds. Row 0 of the screen shows the frame counter, the frame within the
|
|
23
|
+
jump, the sprite Y register and the table value, so a screenshot at a
|
|
24
|
+
pinned frame can be checked against the table by reading the picture.
|
|
25
|
+
If the live value ever differs from the table the border turns red. Use
|
|
26
|
+
it as the starting point for any platformer jump.
|
|
27
|
+
|
|
28
|
+
## Source
|
|
29
|
+
|
|
30
|
+
```c
|
|
31
|
+
// fixed-point-jump.c -- a sprite jumps in an 8.8 fixed-point arc.
|
|
32
|
+
// Frame counter, jump frame, sprite Y register and the precomputed table
|
|
33
|
+
// value are shown on row 0 so a screenshot can be checked against the table.
|
|
34
|
+
// Build: oscar64 -tm=c64 -O2 -o=fixed-point-jump.prg fixed-point-jump.c
|
|
35
|
+
#include <c64/vic.h>
|
|
36
|
+
#include <c64/sprites.h>
|
|
37
|
+
|
|
38
|
+
#define SCREEN ((char *)0x0400)
|
|
39
|
+
#define COLOUR ((char *)0xd800)
|
|
40
|
+
#define SPRDATA ((char *)0x0340) // block 13, the cassette buffer
|
|
41
|
+
|
|
42
|
+
#define GROUND_Y 229 // sprite Y register when standing
|
|
43
|
+
#define SPRITE_X 172
|
|
44
|
+
#define JUMP_V0 (-0x0400) // -4.0 px/frame in 8.8
|
|
45
|
+
#define GRAVITY 0x0020 // +0.125 px/frame^2 in 8.8
|
|
46
|
+
#define PERIOD 63 // frames from launch to landing
|
|
47
|
+
|
|
48
|
+
// Precomputed arc: sprite Y at jump frame n, from gen.py with the same
|
|
49
|
+
// V0, gravity and update order as the loop below.
|
|
50
|
+
static const char arc_y[PERIOD] = {
|
|
51
|
+
229, 225, 221, 217, 214, 210, 207, 204, 201, 198, 195, 193, 190,
|
|
52
|
+
188, 186, 184, 182, 180, 178, 176, 175, 173, 172, 171, 170, 169,
|
|
53
|
+
168, 168, 167, 167, 167, 167, 167, 167, 167, 167, 168, 168, 169,
|
|
54
|
+
170, 171, 172, 173, 175, 176, 178, 180, 182, 184, 186, 188, 190,
|
|
55
|
+
193, 195, 198, 201, 204, 207, 210, 214, 217, 221, 225
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
static void put_dec(char col, unsigned v, char width)
|
|
59
|
+
{
|
|
60
|
+
char *p = SCREEN + col;
|
|
61
|
+
for (signed char k = width - 1; k >= 0; k--) { p[k] = 0x30 + v % 10; v /= 10; }
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
static void put_str(char col, const char *s)
|
|
65
|
+
{
|
|
66
|
+
char *p = SCREEN + col;
|
|
67
|
+
while (*s) { char c = *s++; *p++ = (c == ' ') ? 0x20 : c - 'a' + 1; }
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
int main(void)
|
|
71
|
+
{
|
|
72
|
+
for (unsigned i = 0; i < 1000; i++) { SCREEN[i] = 0x20; COLOUR[i] = 1; }
|
|
73
|
+
for (char i = 0; i < 63; i++) SPRDATA[i] = 0xff; // solid 24x21 block
|
|
74
|
+
vic.color_back = 0;
|
|
75
|
+
vic.color_border = 5;
|
|
76
|
+
|
|
77
|
+
spr_init(SCREEN);
|
|
78
|
+
spr_set(0, true, SPRITE_X, GROUND_Y, 13, VCOL_YELLOW, false, false, false);
|
|
79
|
+
|
|
80
|
+
put_str(0, "f"); put_str(9, "j"); put_str(15, "y"); put_str(22, "t");
|
|
81
|
+
put_str(29, "apex");
|
|
82
|
+
|
|
83
|
+
int y_fp = GROUND_Y << 8; // 8.8 position
|
|
84
|
+
int vy_fp = 0; // 8.8 velocity, + is down
|
|
85
|
+
unsigned frame = 0; // frames since start
|
|
86
|
+
char n = 0; // frame within the jump, 0 = on ground
|
|
87
|
+
char apex = 255;
|
|
88
|
+
|
|
89
|
+
for (;;)
|
|
90
|
+
{
|
|
91
|
+
vic_waitFrame();
|
|
92
|
+
|
|
93
|
+
// Row 0 shows the state that produced the sprite now on screen.
|
|
94
|
+
put_dec(2, frame, 5);
|
|
95
|
+
put_dec(11, n, 2);
|
|
96
|
+
put_dec(17, vic.spr_pos[0].y, 3);
|
|
97
|
+
put_dec(24, arc_y[n], 3);
|
|
98
|
+
put_dec(34, apex, 3);
|
|
99
|
+
|
|
100
|
+
if (n == 0)
|
|
101
|
+
vy_fp = JUMP_V0; // launch
|
|
102
|
+
vy_fp += GRAVITY; // gravity first, then position
|
|
103
|
+
y_fp += vy_fp;
|
|
104
|
+
n++;
|
|
105
|
+
if (y_fp >= (GROUND_Y << 8)) { y_fp = GROUND_Y << 8; n = 0; }
|
|
106
|
+
|
|
107
|
+
char y = y_fp >> 8; // pixel byte for the sprite register
|
|
108
|
+
if (y < apex) apex = y;
|
|
109
|
+
if (y != arc_y[n]) vic.color_border = 2; // live and table disagree
|
|
110
|
+
spr_move(0, SPRITE_X, y);
|
|
111
|
+
frame++;
|
|
112
|
+
}
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Build
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
oscar64 -tm=c64 -O2 -o=fixed-point-jump.prg fixed-point-jump.c
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Produces `fixed-point-jump.prg` (868 bytes including the BASIC stub).
|
|
124
|
+
The compiler prints `warning 2017: Invalid value range` for the
|
|
125
|
+
`arc_y[n]` read after `n++`; `n` is reset to 0 on the landing frame
|
|
126
|
+
before that read, so the index never reaches 63. Load with
|
|
127
|
+
`LOAD"FIXED-POINT-JUMP",8,1 : RUN` or via VICE autostart.
|
|
128
|
+
|
|
129
|
+
## Expected output
|
|
130
|
+
|
|
131
|
+
Black screen, green border, a solid yellow 24x21 sprite at X 172 rising
|
|
132
|
+
and falling over the bottom third of the screen, and a white status line
|
|
133
|
+
on row 0: `F` frames since start, `J` frame within the jump, `Y` the
|
|
134
|
+
sprite Y register, `T` the table value for that jump frame, `APEX` the
|
|
135
|
+
lowest register value seen so far. The border goes red only if the live
|
|
136
|
+
8.8 value and the table ever disagree; it did not in either pinned run.
|
|
137
|
+
|
|
138
|
+
Pinned runs (VICE x64sc 3.10, `-warp +sound +autostart-delay-random
|
|
139
|
+
-autostartprgmode 1 -limitcycles 8000000`), pictures in
|
|
140
|
+
`screenshots/fixed-point-jump.png` and
|
|
141
|
+
`screenshots/fixed-point-jump-ntsc.png`, decoded with the character ROM
|
|
142
|
+
and measured with PIL:
|
|
143
|
+
|
|
144
|
+
| | PAL | NTSC (`-model ntsc`) |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| Row 0 text | `f 00252 j 00 y 229 t 229 apex 167` | `f 00283 j 31 y 167 t 167 apex 167` |
|
|
147
|
+
| Frame the sprite is drawn in | jump frame 1 | jump frame 32 |
|
|
148
|
+
| `arc_y[]` for that frame | 225 | 167 |
|
|
149
|
+
| Sprite rows in the PNG | 210 to 230 | 140 to 160 |
|
|
150
|
+
| Sprite Y from the PNG | 225 | 167 |
|
|
151
|
+
| Border pixel (2,100) | green | green |
|
|
152
|
+
|
|
153
|
+
The status line describes the frame that has just finished, because it
|
|
154
|
+
is written after `vic_waitFrame()` and before the update that moves the
|
|
155
|
+
sprite for the next one. The picture is the next frame. So `J 00, Y 229`
|
|
156
|
+
on PAL is a picture of jump frame 1, whose table value is 225, and the
|
|
157
|
+
sprite measured from the PNG is at register 225. On NTSC `J 31` is a
|
|
158
|
+
picture of frame 32; the table holds 167 for both, the flat apex. The
|
|
159
|
+
sprite's first row appears in the PNG one line below its Y register
|
|
160
|
+
(PAL row 210 is raster line 226 with the formula row = line - 16; NTSC
|
|
161
|
+
row 140 is line 168 with row = line - 28); both pictures agree on that
|
|
162
|
+
offset, as `hardware/vic-ii-reference.md` states (the first sprite row
|
|
163
|
+
is on the line after the Y register value). An earlier draft of this table read the register straight off
|
|
164
|
+
the status line and disagreed with the picture by one frame; the
|
|
165
|
+
one-frame lag above is why.
|
|
166
|
+
|
|
167
|
+
A cleaner listing would print the values after the update, so that the
|
|
168
|
+
text and the sprite in one picture describe the same frame, and would
|
|
169
|
+
keep `y_fp` in an `unsigned` (in an `int`, `229 << 8` wraps negative;
|
|
170
|
+
the arithmetic still holds because every value in the arc wraps the
|
|
171
|
+
same way, but it reads badly). Neither change has been run, so neither
|
|
172
|
+
is in the listing.
|
|
173
|
+
|
|
174
|
+
## Why this works
|
|
175
|
+
|
|
176
|
+
The whole jump is two adds a frame on 16-bit values: `vy_fp += GRAVITY`
|
|
177
|
+
and `y_fp += vy_fp`. With `JUMP_V0 = -$0400` and `GRAVITY = $0020` the
|
|
178
|
+
velocity reaches zero after 32 updates and the sprite is back on the
|
|
179
|
+
ground after 63; the 63 velocity steps sum to exactly zero, so the
|
|
180
|
+
landing is exact and the clamp is only there for constants where it is
|
|
181
|
+
not. Oscar64 compiles each add to the `clc / lda / adc / sta / lda /
|
|
182
|
+
adc / sta` shape that `techniques/maths.md` measures at 26 cycles with
|
|
183
|
+
absolute operands; here the compiler keeps both values in zero-page
|
|
184
|
+
temporaries and folds the gravity into an immediate (`adc #$20`, then
|
|
185
|
+
`adc #$00` for the high byte, read from the `.asm` file the build
|
|
186
|
+
writes), which is 20 cycles by the instruction table (rung 3, not
|
|
187
|
+
measured in this recipe). The pixel byte is `y_fp >> 8`, one byte move,
|
|
188
|
+
and it goes through `spr_move` from `<c64/sprites.h>` into `$D001`.
|
|
189
|
+
|
|
190
|
+
`arc_y[]` was generated by the same two adds in Python, and the loop
|
|
191
|
+
compares its own result against the table every frame. Gravity is added
|
|
192
|
+
before the position (semi-implicit Euler). Adding position first moves
|
|
193
|
+
the full launch speed on the first step, lands after 65 updates and
|
|
194
|
+
gives a table that differs from jump frame 4 onward (rung 3, from the
|
|
195
|
+
same Python integration), so the generator and the loop must agree on
|
|
196
|
+
the order.
|
|
197
|
+
|
|
198
|
+
The sprite image is 63 bytes of `$FF` at `$0340`, block 13, which is the
|
|
199
|
+
cassette buffer and free once the program is running; `spr_init(SCREEN)`
|
|
200
|
+
points the sprite pointer table at `$07F8` and `spr_set` writes pointer,
|
|
201
|
+
colour, position and enable in one call. The frame is paced by
|
|
202
|
+
`vic_waitFrame()`, so on PAL the arc takes 63/50 of a second and on NTSC
|
|
203
|
+
63/60; the table is in frames, not time, which is why the two pictures
|
|
204
|
+
show different frame counts for the same cycle budget.
|
|
205
|
+
|
|
206
|
+
`arc_y[]` is absolute Y from `GROUND_Y`, so it only plays from that one
|
|
207
|
+
ground. A jump that has to start from a platform stores the per-frame
|
|
208
|
+
velocity instead and adds it to whatever `y` it starts from;
|
|
209
|
+
`fixed-point-jump-velocity.md` is that variant, with two sprites on
|
|
210
|
+
floors 64 pixels apart driven by one table.
|