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,545 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: vector-balls
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [vector_balls_sprites]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D002, D003, D004, D005, D006, D007, D008, D009, D00A, D00B, D00C, D00D, D00E, D00F, D012, D015, D017, D01B, D01C, D01D, D020, D021, D027, D028, D029, D02A, D02B, D02C, D02D, D02E, DC04, DC05, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler: Vector Balls on Sprites
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Eight sprite balls run round a tilted ring in 3D. Every frame the eight
|
|
19
|
+
are sorted by depth with one bubble pass and the nearest is given
|
|
20
|
+
hardware sprite 0, the farthest sprite 7, so the VIC's fixed
|
|
21
|
+
sprite-to-sprite priority draws a near ball over a far one with no
|
|
22
|
+
masking. Screen x, screen y and a depth byte are three assembler-built
|
|
23
|
+
tables indexed by the ball's angle; the near half of the ring uses a
|
|
24
|
+
24 by 21 ball image, the far half a 16 by 14 one, and colour steps from
|
|
25
|
+
white through light grey to grey with distance. The frame's work is
|
|
26
|
+
CIA-timed and the loop stops after 300 frames so the exit screenshot is
|
|
27
|
+
static. This is the `vector_balls_sprites` technique; build with
|
|
28
|
+
`-define NOSORT` for the control with the sort left out.
|
|
29
|
+
|
|
30
|
+
Verified in VICE x64sc: at the pinned cycle count the sixteen position
|
|
31
|
+
registers hold the table's values for the depth order the sort
|
|
32
|
+
predicts, the ball drawn over each overlap is the nearer one by the
|
|
33
|
+
table, and the control build draws a farther ball on top.
|
|
34
|
+
|
|
35
|
+
## Source
|
|
36
|
+
|
|
37
|
+
```asm
|
|
38
|
+
// vector-balls.asm
|
|
39
|
+
// Eight sprite balls on a tilted ring, turned one table step a frame,
|
|
40
|
+
// depth-sorted every frame and drawn with the VIC's fixed sprite-to-sprite
|
|
41
|
+
// priority: the nearest ball gets hardware sprite 0, the farthest sprite 7,
|
|
42
|
+
// so a near ball covers a far one without any masking. Ball k at frame t
|
|
43
|
+
// sits at angle a = (t + 32k) & 255 on a ring of radius 40 in the XZ plane,
|
|
44
|
+
// lifted by 12 * sin(a) so the ring reads as tilted. Screen x, screen y
|
|
45
|
+
// and a depth byte zd = 128 + z are three assembler-built tables indexed
|
|
46
|
+
// by a; the CPU never multiplies or divides. The camera is on the -z side,
|
|
47
|
+
// so a LARGER zd is FARTHER away.
|
|
48
|
+
//
|
|
49
|
+
// The sort is one bubble pass a frame over the previous frame's order,
|
|
50
|
+
// which is enough because the order changes by adjacent swaps; a check
|
|
51
|
+
// after the pass counts the frames it left unsorted. The lookup, the pass
|
|
52
|
+
// and the sixteen position, eight pointer and eight colour writes are
|
|
53
|
+
// timed with CIA1 timer A; the frame count, the unsorted count, the worst
|
|
54
|
+
// frame and the last frame are printed in hex on row 0 and kept at $0C00.
|
|
55
|
+
// The loop stops after 300 frames so the exit screenshot is static.
|
|
56
|
+
//
|
|
57
|
+
// Region: both. The frame's work runs from raster line 255, below the
|
|
58
|
+
// display on PAL and NTSC. Build with -define NOSORT for the control:
|
|
59
|
+
// the sort pass is left out and hardware sprite k always shows ball k.
|
|
60
|
+
|
|
61
|
+
.const SCREEN = $0400
|
|
62
|
+
.const BIGBALL = $2000 // pointer $80: 24 by 21 ball, near half
|
|
63
|
+
.const SMLBALL = $2040 // pointer $81: 16 by 14 ball, far half
|
|
64
|
+
.const RESULTS = $0c00 // frame, unsorted, worst, last, done
|
|
65
|
+
.const FRAMES = 300
|
|
66
|
+
.const RADIUS = 40 // ring radius in the XZ plane
|
|
67
|
+
.const TILT = 12 // y = TILT * sin(a)
|
|
68
|
+
.const EYE = 200 // z of the projection plane behind the ring
|
|
69
|
+
.const XMID = 172 // sprite X of the ring's centre
|
|
70
|
+
.const YMID = 130 // sprite Y of the ring's centre
|
|
71
|
+
.const NEAR = 120 // zd below this: white
|
|
72
|
+
.const MID = 136 // zd below this: light grey, else grey
|
|
73
|
+
|
|
74
|
+
// Perspective: screen = centre + coordinate * 256 / (z + EYE).
|
|
75
|
+
.function proj(a, amp, centre) {
|
|
76
|
+
.var rad = toRadians(a * 360 / 256)
|
|
77
|
+
.var z3 = RADIUS * cos(rad)
|
|
78
|
+
.return round(centre + amp * sin(rad) * 256 / (z3 + EYE))
|
|
79
|
+
}
|
|
80
|
+
.function depth(a) {
|
|
81
|
+
.return round(128 + RADIUS * cos(toRadians(a * 360 / 256)))
|
|
82
|
+
}
|
|
83
|
+
// One byte of a filled ellipse rx by ry pixels, centred in a 24 by 21 sprite.
|
|
84
|
+
.function ballByte(row, col8, rx, ry) {
|
|
85
|
+
.var v = 0
|
|
86
|
+
.for (var c = 0; c < 8; c++) {
|
|
87
|
+
.var x = col8 * 8 + c
|
|
88
|
+
.if (pow((x - 11.5) / (rx / 2), 2) + pow((row - 10) / (ry / 2), 2) <= 1) {
|
|
89
|
+
.eval v = v | (128 >> c)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
.return v
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.pc = $0801 "basic"
|
|
96
|
+
:BasicUpstart(start)
|
|
97
|
+
|
|
98
|
+
.pc = $0810 "code"
|
|
99
|
+
start:
|
|
100
|
+
sei
|
|
101
|
+
lda #0
|
|
102
|
+
sta $d020
|
|
103
|
+
sta $d021
|
|
104
|
+
sta frame
|
|
105
|
+
sta frame+1
|
|
106
|
+
sta unsorted
|
|
107
|
+
sta unsorted+1
|
|
108
|
+
sta worst
|
|
109
|
+
sta worst+1
|
|
110
|
+
sta done
|
|
111
|
+
|
|
112
|
+
ldx #0 // clear the screen
|
|
113
|
+
lda #$20
|
|
114
|
+
clr:
|
|
115
|
+
sta SCREEN,x
|
|
116
|
+
sta SCREEN+$100,x
|
|
117
|
+
sta SCREEN+$200,x
|
|
118
|
+
sta SCREEN+$300,x
|
|
119
|
+
inx
|
|
120
|
+
bne clr
|
|
121
|
+
|
|
122
|
+
ldx #39 // row 0: labels in dark grey, no ball colour
|
|
123
|
+
lbl:
|
|
124
|
+
lda #11
|
|
125
|
+
sta $d800,x
|
|
126
|
+
lda label,x
|
|
127
|
+
sta SCREEN,x
|
|
128
|
+
dex
|
|
129
|
+
bpl lbl
|
|
130
|
+
|
|
131
|
+
ldx #7 // all eight sprites on, no expansion,
|
|
132
|
+
setup: // in front of the background
|
|
133
|
+
lda sprn,x // order[i] = 7 - i, so before any sort
|
|
134
|
+
sta order,x // hardware sprite k shows ball k
|
|
135
|
+
lda #BIGBALL/64
|
|
136
|
+
sta SCREEN+$3f8,x
|
|
137
|
+
lda #1
|
|
138
|
+
sta $d027,x
|
|
139
|
+
ldy pairs,x // park every sprite inside the display:
|
|
140
|
+
lda #YMID // from reset Y is 0, which the VIC also
|
|
141
|
+
sta $d001,y // matches at line 256, in the timed window
|
|
142
|
+
dex
|
|
143
|
+
bpl setup
|
|
144
|
+
lda #0
|
|
145
|
+
sta $d017
|
|
146
|
+
sta $d01d
|
|
147
|
+
sta $d01c
|
|
148
|
+
sta $d01b
|
|
149
|
+
lda #$ff
|
|
150
|
+
sta $d015
|
|
151
|
+
|
|
152
|
+
loop:
|
|
153
|
+
lda #255 // wait for raster line 255
|
|
154
|
+
!: cmp $d012
|
|
155
|
+
bne !-
|
|
156
|
+
|
|
157
|
+
inc frame // t advances by 1
|
|
158
|
+
bne !+
|
|
159
|
+
inc frame+1
|
|
160
|
+
!:
|
|
161
|
+
lda #$ff // CIA1 timer A: one shot from $FFFF
|
|
162
|
+
sta $dc04
|
|
163
|
+
sta $dc05
|
|
164
|
+
lda #$19
|
|
165
|
+
sta $dc0e
|
|
166
|
+
|
|
167
|
+
// Lookup: ball k reads px, py, zd at a = t + 32k.
|
|
168
|
+
lda frame
|
|
169
|
+
ldx #0
|
|
170
|
+
look:
|
|
171
|
+
sta atmp
|
|
172
|
+
tay
|
|
173
|
+
lda px,y
|
|
174
|
+
sta bx,x
|
|
175
|
+
lda py,y
|
|
176
|
+
sta by,x
|
|
177
|
+
lda zd,y
|
|
178
|
+
sta bz,x
|
|
179
|
+
lda atmp
|
|
180
|
+
clc
|
|
181
|
+
adc #32
|
|
182
|
+
inx
|
|
183
|
+
cpx #8
|
|
184
|
+
bne look
|
|
185
|
+
|
|
186
|
+
#if !NOSORT
|
|
187
|
+
// One bubble pass, zd descending: order[0] is the farthest ball.
|
|
188
|
+
ldx #0
|
|
189
|
+
pass:
|
|
190
|
+
ldy order,x
|
|
191
|
+
lda bz,y
|
|
192
|
+
ldy order+1,x
|
|
193
|
+
cmp bz,y
|
|
194
|
+
bcs !+ // zd[i] >= zd[i+1]: in order
|
|
195
|
+
lda order,x // else swap the pair
|
|
196
|
+
sta order+1,x
|
|
197
|
+
tya
|
|
198
|
+
sta order,x
|
|
199
|
+
!: inx
|
|
200
|
+
cpx #7
|
|
201
|
+
bne pass
|
|
202
|
+
#endif
|
|
203
|
+
|
|
204
|
+
// Assign: order[i] goes to hardware sprite 7 - i.
|
|
205
|
+
ldx #0
|
|
206
|
+
assign:
|
|
207
|
+
ldy order,x
|
|
208
|
+
lda bz,y
|
|
209
|
+
sta ztmp
|
|
210
|
+
lda by,y
|
|
211
|
+
sta ytmp
|
|
212
|
+
lda bx,y
|
|
213
|
+
ldy pairs,x // 2 * (7 - i)
|
|
214
|
+
sta $d000,y
|
|
215
|
+
lda ytmp
|
|
216
|
+
sta $d001,y
|
|
217
|
+
ldy sprn,x // 7 - i
|
|
218
|
+
lda ztmp
|
|
219
|
+
cmp #128
|
|
220
|
+
bcs !+ // zd >= 128: far, small ball
|
|
221
|
+
lda #BIGBALL/64
|
|
222
|
+
bne ptr
|
|
223
|
+
!: lda #SMLBALL/64
|
|
224
|
+
ptr:
|
|
225
|
+
sta SCREEN+$3f8,y
|
|
226
|
+
lda ztmp
|
|
227
|
+
cmp #NEAR
|
|
228
|
+
bcs !+
|
|
229
|
+
lda #1 // white
|
|
230
|
+
bne col
|
|
231
|
+
!: cmp #MID
|
|
232
|
+
bcs !+
|
|
233
|
+
lda #15 // light grey
|
|
234
|
+
bne col
|
|
235
|
+
!: lda #12 // grey
|
|
236
|
+
col:
|
|
237
|
+
sta $d027,y
|
|
238
|
+
inx
|
|
239
|
+
cpx #8
|
|
240
|
+
bne assign
|
|
241
|
+
|
|
242
|
+
lda #0 // stop the timer; elapsed = $FFFF - count
|
|
243
|
+
sta $dc0e
|
|
244
|
+
lda $dc04
|
|
245
|
+
eor #$ff
|
|
246
|
+
sta last
|
|
247
|
+
lda $dc05
|
|
248
|
+
eor #$ff
|
|
249
|
+
sta last+1
|
|
250
|
+
|
|
251
|
+
lda worst+1 // worst = max(worst, last)
|
|
252
|
+
cmp last+1
|
|
253
|
+
bcc newmax
|
|
254
|
+
bne nomax
|
|
255
|
+
lda worst
|
|
256
|
+
cmp last
|
|
257
|
+
bcs nomax
|
|
258
|
+
newmax:
|
|
259
|
+
lda last
|
|
260
|
+
sta worst
|
|
261
|
+
lda last+1
|
|
262
|
+
sta worst+1
|
|
263
|
+
lda frame
|
|
264
|
+
sta worstat
|
|
265
|
+
lda frame+1
|
|
266
|
+
sta worstat+1
|
|
267
|
+
nomax:
|
|
268
|
+
|
|
269
|
+
// Did the one pass leave the order sorted? Count the frames it did not.
|
|
270
|
+
ldx #0
|
|
271
|
+
check:
|
|
272
|
+
ldy order,x
|
|
273
|
+
lda bz,y
|
|
274
|
+
ldy order+1,x
|
|
275
|
+
cmp bz,y
|
|
276
|
+
bcs !+
|
|
277
|
+
inc unsorted
|
|
278
|
+
bne shown
|
|
279
|
+
inc unsorted+1
|
|
280
|
+
jmp shown
|
|
281
|
+
!: inx
|
|
282
|
+
cpx #7
|
|
283
|
+
bne check
|
|
284
|
+
shown:
|
|
285
|
+
|
|
286
|
+
ldy #6 // row 0: frame, unsorted, worst, last
|
|
287
|
+
lda frame+1
|
|
288
|
+
jsr phex
|
|
289
|
+
lda frame
|
|
290
|
+
jsr phex
|
|
291
|
+
ldy #16
|
|
292
|
+
lda unsorted+1
|
|
293
|
+
jsr phex
|
|
294
|
+
lda unsorted
|
|
295
|
+
jsr phex
|
|
296
|
+
ldy #26
|
|
297
|
+
lda worst+1
|
|
298
|
+
jsr phex
|
|
299
|
+
lda worst
|
|
300
|
+
jsr phex
|
|
301
|
+
ldy #36
|
|
302
|
+
lda last+1
|
|
303
|
+
jsr phex
|
|
304
|
+
lda last
|
|
305
|
+
jsr phex
|
|
306
|
+
|
|
307
|
+
lda frame // stop after FRAMES frames
|
|
308
|
+
cmp #<FRAMES
|
|
309
|
+
bne again
|
|
310
|
+
lda frame+1
|
|
311
|
+
cmp #>FRAMES
|
|
312
|
+
bne again
|
|
313
|
+
lda #1
|
|
314
|
+
sta done
|
|
315
|
+
jmp *
|
|
316
|
+
again:
|
|
317
|
+
jmp loop
|
|
318
|
+
|
|
319
|
+
phex: // A as two hex digits at SCREEN,Y; Y += 2
|
|
320
|
+
pha
|
|
321
|
+
lsr
|
|
322
|
+
lsr
|
|
323
|
+
lsr
|
|
324
|
+
lsr
|
|
325
|
+
tax
|
|
326
|
+
lda hex,x
|
|
327
|
+
sta SCREEN,y
|
|
328
|
+
iny
|
|
329
|
+
pla
|
|
330
|
+
and #$0f
|
|
331
|
+
tax
|
|
332
|
+
lda hex,x
|
|
333
|
+
sta SCREEN,y
|
|
334
|
+
iny
|
|
335
|
+
rts
|
|
336
|
+
|
|
337
|
+
atmp: .byte 0
|
|
338
|
+
ytmp: .byte 0
|
|
339
|
+
ztmp: .byte 0
|
|
340
|
+
order: .fill 8, 0 // ball index per depth rank, farthest first
|
|
341
|
+
bx: .fill 8, 0 // this frame's screen x per ball
|
|
342
|
+
by: .fill 8, 0
|
|
343
|
+
bz: .fill 8, 0
|
|
344
|
+
pairs: .byte 14, 12, 10, 8, 6, 4, 2, 0
|
|
345
|
+
sprn: .byte 7, 6, 5, 4, 3, 2, 1, 0
|
|
346
|
+
hex: .text "0123456789abcdef" // lowercase: .text is screen codes
|
|
347
|
+
label: .text "frame .... bad .... max .... cyc ...."
|
|
348
|
+
|
|
349
|
+
.pc = RESULTS "results"
|
|
350
|
+
frame: .word 0 // t; the frame count after the run
|
|
351
|
+
unsorted: .word 0 // frames the one pass left unsorted
|
|
352
|
+
worst: .word 0 // most cycles a frame's work took
|
|
353
|
+
last: .word 0 // the last frame's cycles
|
|
354
|
+
done: .byte 0 // 1 after the last frame
|
|
355
|
+
worstat: .word 0 // the frame the worst was measured on
|
|
356
|
+
|
|
357
|
+
.align $100
|
|
358
|
+
px: .fill 256, proj(i, RADIUS, XMID)
|
|
359
|
+
py: .fill 256, proj(i, TILT, YMID)
|
|
360
|
+
zd: .fill 256, depth(i)
|
|
361
|
+
.for (var i = 0; i < 256; i++) {
|
|
362
|
+
.errorif proj(i, RADIUS, XMID) > 255 - 23, "a ball would cross X 255"
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
.pc = BIGBALL "big ball"
|
|
366
|
+
.for (var r = 0; r < 21; r++) { .byte ballByte(r, 0, 24, 21), ballByte(r, 1, 24, 21), ballByte(r, 2, 24, 21) }
|
|
367
|
+
.byte 0
|
|
368
|
+
.pc = SMLBALL "small ball"
|
|
369
|
+
.for (var r = 0; r < 21; r++) { .byte ballByte(r, 0, 16, 14), ballByte(r, 1, 16, 14), ballByte(r, 2, 16, 14) }
|
|
370
|
+
.byte 0
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
## Build
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
java -jar KickAss.jar vector-balls.asm -o vector-balls.prg
|
|
377
|
+
java -jar KickAss.jar vector-balls.asm -define NOSORT -o vector-balls-nosort.prg # the control
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
## Expected output
|
|
381
|
+
|
|
382
|
+
Black screen and border. Row 0 reads `FRAME 012C BAD 0006 MAX 056D
|
|
383
|
+
CYC 0526` in dark grey once the loop has stopped: 300 frames drawn, six
|
|
384
|
+
frames on which one bubble pass left the order unsorted, a worst frame
|
|
385
|
+
of 1,389 cycles and a last frame of 1,318. Below it eight balls sit on a
|
|
386
|
+
band running from upper left to lower right: white 24 by 21 balls for
|
|
387
|
+
the near half of the ring, grey 16 by 14 balls for the far half, the far
|
|
388
|
+
balls partly or wholly behind the near ones. The run halts on
|
|
389
|
+
`jmp *` with the picture static, so any cycle count past the halt gives
|
|
390
|
+
the same picture.
|
|
391
|
+
|
|
392
|
+
### The tables
|
|
393
|
+
|
|
394
|
+
`px[a]` is `172 + 40 sin(a) * 256 / (40 cos(a) + 200)` rounded, `py[a]`
|
|
395
|
+
the same with amplitude 12 and centre 130, and `zd[a] = 128 + 40 cos(a)`,
|
|
396
|
+
for `a` in 0 to 255 steps of a 256-step turn. Computed in Python from the
|
|
397
|
+
same formulas: px runs 120 to 224, py 114 to 146, zd 88 to 168. The
|
|
398
|
+
widest ball is 24 pixels, so no sprite's X reaches 255 (224 + 23 is 247)
|
|
399
|
+
and `$D010` is never written; the `.errorif` in the listing refuses to
|
|
400
|
+
assemble a table that would. The camera is on the negative z side, so a
|
|
401
|
+
larger zd is farther away: the ball image is the small one for `zd >=
|
|
402
|
+
128` and the colour is white below 120, light grey from 120 to 135 and
|
|
403
|
+
grey from 136 up. Over the table 111 entries are white, 32 light grey and
|
|
404
|
+
113 grey (arithmetic). At frame 300 no ball's zd falls in the light
|
|
405
|
+
grey band, so the pinned picture shows only white and grey.
|
|
406
|
+
|
|
407
|
+
### Frame 300, both models
|
|
408
|
+
|
|
409
|
+
Ball k is at angle `(300 + 32k) & 255`. The bubble pass, simulated from
|
|
410
|
+
the start order 7..0 over 300 frames, ends with the order (farthest
|
|
411
|
+
first) 7, 6, 0, 5, 1, 4, 2, 3, so sprite 7 shows ball 7 and sprite 0
|
|
412
|
+
shows ball 3. The VIC's registers at the halt, dumped by the monitor on
|
|
413
|
+
the PAL run, agree with the table for all eight:
|
|
414
|
+
|
|
415
|
+
| Sprite | Ball | Angle | zd | Image | Colour | X, Y from the table | $D000 pair read |
|
|
416
|
+
|---|---|---|---|---|---|---|---|
|
|
417
|
+
| 0 | 3 | 140 | 90 | big | white | 154, 124 | $9A, $7C |
|
|
418
|
+
| 1 | 2 | 108 | 93 | big | white | 201, 139 | $C9, $8B |
|
|
419
|
+
| 2 | 4 | 172 | 109 | big | white | 122, 115 | $7A, $73 |
|
|
420
|
+
| 3 | 1 | 76 | 116 | big | white | 224, 146 | $E0, $92 |
|
|
421
|
+
| 4 | 5 | 204 | 140 | small | grey | 126, 116 | $7E, $74 |
|
|
422
|
+
| 5 | 0 | 44 | 147 | small | grey | 213, 142 | $D5, $8E |
|
|
423
|
+
| 6 | 6 | 236 | 163 | small | grey | 151, 124 | $97, $7C |
|
|
424
|
+
| 7 | 7 | 12 | 166 | small | grey | 184, 134 | $B8, $86 |
|
|
425
|
+
|
|
426
|
+
`$07F8` to `$07FF` read `80 80 80 80 81 81 81 81`, `$D027` to `$D02E`
|
|
427
|
+
read `01 01 01 01 0C 0C 0C 0C`, and `$D010` is 0.
|
|
428
|
+
|
|
429
|
+
### Which ball covers which
|
|
430
|
+
|
|
431
|
+
Screenshot column is VIC X plus 8; the row is VIC Y less 15 on PAL and
|
|
432
|
+
less 27 on NTSC (`sprite-sine-chain.md`, "Reading a sprite's position
|
|
433
|
+
off the picture"). The small image occupies columns 4 to 19 and rows 3
|
|
434
|
+
to 16 of its sprite. Pixel colours were counted with PIL inside the
|
|
435
|
+
rectangle where two balls' images overlap; VICE's palette gives white as
|
|
436
|
+
(255, 255, 255) and grey as (148, 148, 148).
|
|
437
|
+
|
|
438
|
+
| Pair | zd | Nearer by the table | Overlap, PAL columns and rows | Sorted build | NOSORT control |
|
|
439
|
+
|---|---|---|---|---|---|
|
|
440
|
+
| ball 0 over ball 1 | 147 against 116 | ball 1 | 232 to 240, 131 to 143 | 96 white, 18 grey | 13 white, 101 grey |
|
|
441
|
+
| ball 0 over ball 2 | 147 against 93 | ball 2 | 225 to 232, 130 to 143 | 97 white, 12 grey | 21 white, 88 grey |
|
|
442
|
+
| ball 5 inside ball 4 | 140 against 109 | ball 4 | 138 to 153, 104 to 117 | 211 white, 1 grey | 211 white, 1 grey |
|
|
443
|
+
|
|
444
|
+
In the sorted build the white near ball is on top in both crossing
|
|
445
|
+
pairs, and the far grey pixels that remain are the small ball's edge
|
|
446
|
+
outside the big ball's ellipse. In the control, ball 0 is hardware
|
|
447
|
+
sprite 0 and beats sprites 1 and 2 whatever its depth, so the far grey
|
|
448
|
+
ball is drawn on top of both white ones: the same rectangles turn
|
|
449
|
+
mostly grey. Ball 5's small image lies wholly inside ball 4's big one;
|
|
450
|
+
the sort hides it, and the control happens to as well because sprite 4
|
|
451
|
+
outranks sprite 5. The NTSC pictures give the same counts twelve rows
|
|
452
|
+
higher. The two control pictures are `docs/figures/vector-balls-nosort.png`
|
|
453
|
+
and `docs/figures/vector-balls-nosort-ntsc.png`, from the same command with
|
|
454
|
+
`vector-balls-nosort.prg`.
|
|
455
|
+
|
|
456
|
+
### One pass a frame
|
|
457
|
+
|
|
458
|
+
The listing checks the order after every pass and counts the frames it
|
|
459
|
+
left unsorted: 6 of 300 on PAL and on NTSC, and a Python replay of the
|
|
460
|
+
pass from the start order says they are frames 1 to 6, the frames the
|
|
461
|
+
reversed start order takes to settle. From frame 7 on, one pass a frame
|
|
462
|
+
kept the eight sorted, because two balls only ever change depth order by
|
|
463
|
+
crossing each other, which is an adjacent swap. The control counts 300:
|
|
464
|
+
the fixed order 7..0 was never the depth order on any frame.
|
|
465
|
+
|
|
466
|
+
### Cycles
|
|
467
|
+
|
|
468
|
+
CIA1 timer A, one shot from $FFFF, started before the lookup and stopped
|
|
469
|
+
after the last colour write, so the figure includes the eight lookups,
|
|
470
|
+
the sort pass, the sixteen position writes, eight pointer writes and
|
|
471
|
+
eight colour writes, and about eight cycles of the timer's own start and
|
|
472
|
+
stop instructions (arithmetic, not removed).
|
|
473
|
+
|
|
474
|
+
| Build | Model | Last frame (frame 300) | Worst frame | Worst on frame |
|
|
475
|
+
|---|---|---|---|---|
|
|
476
|
+
| sorted | PAL | 1,318 | 1,389 | 1 |
|
|
477
|
+
| sorted | NTSC | 1,318 | 1,389 | 1 |
|
|
478
|
+
| NOSORT | PAL | 1,129 | 1,137 | 1 |
|
|
479
|
+
|
|
480
|
+
The pass with no swap therefore costs 1,318 less 1,129, 189 cycles, and
|
|
481
|
+
the six swaps of frame 1 another 71 (arithmetic from the measured
|
|
482
|
+
frames). The whole frame is about 21 raster lines, well inside the
|
|
483
|
+
blank below line 255 on either model.
|
|
484
|
+
|
|
485
|
+
An earlier build of this page read a worst frame of 1,769. That was not
|
|
486
|
+
the routine: from reset every sprite's Y is 0, which the VIC also
|
|
487
|
+
matches at raster line 256, so the reset-state sprites took DMA from the
|
|
488
|
+
timed window on the first frame. The listing now parks every Y at 130
|
|
489
|
+
in the setup. A first repair wrote `sta $d001,x` with X counting 0 to 7,
|
|
490
|
+
which lands on $D001 to $D008 and leaves sprites 5 to 7 at Y 0; that
|
|
491
|
+
build read 1,608, and the pair table fixed it.
|
|
492
|
+
|
|
493
|
+
### Frame count and cycles
|
|
494
|
+
|
|
495
|
+
The `done` store lands at cycle 8,863,351 on PAL and 8,207,167 on NTSC
|
|
496
|
+
(monitor trace), both inside the 12,000,000 pinned. The pin is static:
|
|
497
|
+
two runs per model gave byte-identical pictures.
|
|
498
|
+
|
|
499
|
+
Screenshots from the VICE runs this page describes:
|
|
500
|
+
`screenshots/vector-balls.png` (PAL) and
|
|
501
|
+
`screenshots/vector-balls-ntsc.png`.
|
|
502
|
+
|
|
503
|
+
## Why this works
|
|
504
|
+
|
|
505
|
+
### Priority by assignment
|
|
506
|
+
|
|
507
|
+
The VIC draws sprite 0 over sprite 1, 1 over 2 and so on, and nothing
|
|
508
|
+
in a register changes that (`hardware/vic-ii-reference.md`, "Priority").
|
|
509
|
+
A depth sort cannot move the balls between priorities, so it moves the
|
|
510
|
+
priorities between the balls: the program keeps `order`, the ball index
|
|
511
|
+
per depth rank, and writes rank i's position, image and colour into
|
|
512
|
+
hardware sprite 7 - i. The eight sprites never change what they are,
|
|
513
|
+
only which ball they are showing this frame, and the overlap comes out
|
|
514
|
+
right without a mask or a second image.
|
|
515
|
+
|
|
516
|
+
### Three tables and no arithmetic
|
|
517
|
+
|
|
518
|
+
The projection divides by depth, and the ring's depth at angle a is
|
|
519
|
+
known at assembly time, so `px`, `py` and `zd` are built by KickAssembler
|
|
520
|
+
script from the perspective formula and the frame loop only indexes
|
|
521
|
+
them. The angle is a byte, so `t + 32k` wraps on its own; the tables are
|
|
522
|
+
page-aligned so no indexed read crosses a page. The `.errorif` loop is
|
|
523
|
+
the range check that keeps `$D010` out of the picture: it fails the
|
|
524
|
+
build if a change to the radius, centre or eye distance would push a
|
|
525
|
+
ball past X 255.
|
|
526
|
+
|
|
527
|
+
### One bubble pass
|
|
528
|
+
|
|
529
|
+
A full sort every frame would be safe and costs more than it buys. The
|
|
530
|
+
balls move a step of one 256th of a turn a frame, and two of them only
|
|
531
|
+
change depth order by crossing, so the previous frame's order is at
|
|
532
|
+
most a few adjacent swaps from the new one, and a single pass performs
|
|
533
|
+
them. The check after the pass is what turns that argument into a
|
|
534
|
+
number; it is the six settling frames and then none.
|
|
535
|
+
|
|
536
|
+
## What it does not establish
|
|
537
|
+
|
|
538
|
+
Nothing here was run on real hardware; VICE x64sc 3.10 is the
|
|
539
|
+
instrument. The perspective is only as right as the table: the ball
|
|
540
|
+
images do not scale with depth beyond the two sizes, and the tilt is a
|
|
541
|
+
sine term, not a rotated ring. Eight balls is the hardware's sprite
|
|
542
|
+
count; more needs a multiplexer and the sort then has to cooperate with
|
|
543
|
+
the raster order, which this page does not attempt. The one-pass claim
|
|
544
|
+
is measured for this ring, speed and start order only; a faster turn or
|
|
545
|
+
balls that cross three at a time could need a second pass.
|