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,522 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: shadebobs
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [shadebobs, bobs_effect]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D020, D021, DC04, DC05, DC0D, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler: Shade Bobs
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A character-mode shade bob. Screen RAM holds the reverse space (screen
|
|
19
|
+
code 160) in every cell, so every pixel of a cell takes its colour-RAM
|
|
20
|
+
colour and the picture is colour RAM alone. A 40 by 25 shade buffer in
|
|
21
|
+
RAM holds values 0 to 15, all zero at the start. One blob of four by
|
|
22
|
+
three cells moves on two sines, and every frame each cell under a set
|
|
23
|
+
entry of its mask gains one shade step, saturating at 15, and has its
|
|
24
|
+
colour rewritten from a sixteen-entry palette in luminance order. Every
|
|
25
|
+
fourth frame the whole buffer loses one step, floored at zero, and all
|
|
26
|
+
1,000 colour cells are rewritten. The loop runs 300 iterations and
|
|
27
|
+
stops, so the picture is static for the pin. Use it where a demo part
|
|
28
|
+
wants a bob that leaves a glowing trail rather than a clean erase, at
|
|
29
|
+
the cost of one store per covered cell and a periodic full rewrite.
|
|
30
|
+
|
|
31
|
+
Verified in VICE x64sc: a short tail of grey, red, orange and brown
|
|
32
|
+
cells in the lower right of a black screen where the blob stopped; the
|
|
33
|
+
no-decay control draws the whole figure of eight in the palette's
|
|
34
|
+
sixteen colours with white where the path crosses itself.
|
|
35
|
+
|
|
36
|
+
## Source
|
|
37
|
+
|
|
38
|
+
```asm
|
|
39
|
+
// shadebobs.asm
|
|
40
|
+
// A character-mode shade bob. Screen RAM holds one solid glyph (screen code
|
|
41
|
+
// 160, the reverse space) in every cell, so the picture is colour RAM alone.
|
|
42
|
+
// A 40 by 25 shade buffer (values 0..15) lives in RAM, all zero at start.
|
|
43
|
+
// One 4 by 3 cell blob moves on two sines; every frame each cell under a set
|
|
44
|
+
// mask entry gains one shade step, saturating at 15, and its colour-RAM cell
|
|
45
|
+
// takes palette[shade]. Every fourth frame the whole buffer loses one step
|
|
46
|
+
// (floor 0) and all 1,000 colour cells are rewritten from it. The loop runs
|
|
47
|
+
// FRAMES iterations and stops, so the picture is static for the pin.
|
|
48
|
+
//
|
|
49
|
+
// Build with -define NODECAY for the control: the decay pass is left out
|
|
50
|
+
// and the trail only ever brightens.
|
|
51
|
+
//
|
|
52
|
+
// Region: both. Costs measured with CIA1 timer A (see the recipe page).
|
|
53
|
+
|
|
54
|
+
.const FRAMES = 300 // loop iterations before the program stops
|
|
55
|
+
.const MAX = 15 // top shade; also the last palette index
|
|
56
|
+
.const SCREEN = $0400
|
|
57
|
+
.const COLOUR = $d800
|
|
58
|
+
.const SHADE = $3000 // 25 rows of 40 bytes
|
|
59
|
+
.const TIMES = $0340 // timer bytes, first-15 frame and a done byte
|
|
60
|
+
.const sp = $fb // zero page: shade row pointer
|
|
61
|
+
.const cp = $fd // zero page: colour row pointer
|
|
62
|
+
|
|
63
|
+
BasicUpstart2(start)
|
|
64
|
+
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// Tables, built by the assembler.
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
* = $3400
|
|
69
|
+
// Shade 0..15 to a VIC colour: all sixteen colours in rising luminance
|
|
70
|
+
// order (colour_fade's PAL ranking), black first and white last.
|
|
71
|
+
palette:
|
|
72
|
+
.byte 0, 6, 9, 2, 11, 8, 4, 14, 12, 5, 10, 3, 15, 13, 7, 1
|
|
73
|
+
|
|
74
|
+
// The blob: four columns by three rows, 1 where a cell is shaded.
|
|
75
|
+
mask:
|
|
76
|
+
.byte 0, 1, 1, 0
|
|
77
|
+
.byte 1, 1, 1, 1
|
|
78
|
+
.byte 0, 1, 1, 0
|
|
79
|
+
|
|
80
|
+
// Signed sines of amplitude 16 and 9, one period over 256 entries. The
|
|
81
|
+
// amplitude is far below 128, so the peak cannot carry out of the byte.
|
|
82
|
+
sin16: .fill 256, round(16 * sin(i * 2 * PI / 256))
|
|
83
|
+
sin9: .fill 256, round(9 * sin(i * 2 * PI / 256))
|
|
84
|
+
|
|
85
|
+
// Row start addresses for the shade buffer and for colour RAM.
|
|
86
|
+
srow_lo: .fill 25, <(SHADE + i * 40)
|
|
87
|
+
srow_hi: .fill 25, >(SHADE + i * 40)
|
|
88
|
+
crow_lo: .fill 25, <(COLOUR + i * 40)
|
|
89
|
+
crow_hi: .fill 25, >(COLOUR + i * 40)
|
|
90
|
+
|
|
91
|
+
t: .byte 0 // sine phase, one step per iteration
|
|
92
|
+
frame_lo: .byte 0
|
|
93
|
+
frame_hi: .byte 0
|
|
94
|
+
cx: .byte 0 // top-left column of the blob, 2..34
|
|
95
|
+
cy: .byte 0 // top-left row of the blob, 2..20
|
|
96
|
+
tmp: .byte 0, 0
|
|
97
|
+
|
|
98
|
+
.macro TimerStart() {
|
|
99
|
+
lda #$ff
|
|
100
|
+
sta $dc04
|
|
101
|
+
sta $dc05
|
|
102
|
+
lda #$19 // start, one-shot, force load from $FFFF
|
|
103
|
+
sta $dc0e
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.macro TimerStop(dst) {
|
|
107
|
+
lda $dc04
|
|
108
|
+
sta dst
|
|
109
|
+
lda $dc05
|
|
110
|
+
sta dst + 1
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// One row of the blob. Y runs 3 down to 0 along the row; the pointers were
|
|
114
|
+
// set to the row start plus cx, so the colour-RAM address is at most
|
|
115
|
+
// COLOUR + 22 * 40 + 37 and never reaches CIA1 at COLOUR + 1,024.
|
|
116
|
+
.macro BobRow(dy) {
|
|
117
|
+
ldy #3
|
|
118
|
+
!cell:
|
|
119
|
+
lda mask + dy * 4, y
|
|
120
|
+
beq !skip+
|
|
121
|
+
lda (sp), y
|
|
122
|
+
cmp #MAX
|
|
123
|
+
beq !skip+ // saturate: a full cell stays full
|
|
124
|
+
clc
|
|
125
|
+
adc #1
|
|
126
|
+
sta (sp), y
|
|
127
|
+
cmp #MAX
|
|
128
|
+
bne !+
|
|
129
|
+
jsr note_full // first time any cell reaches MAX
|
|
130
|
+
!: tax
|
|
131
|
+
lda palette, x
|
|
132
|
+
sta (cp), y
|
|
133
|
+
!skip:
|
|
134
|
+
dey
|
|
135
|
+
bpl !cell-
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
// Code
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
* = $0900
|
|
142
|
+
start:
|
|
143
|
+
sei
|
|
144
|
+
lda #$7f
|
|
145
|
+
sta $dc0d // CIA1 interrupts off: timer A is ours now
|
|
146
|
+
lda $dc0d
|
|
147
|
+
lda #0
|
|
148
|
+
sta $d020
|
|
149
|
+
sta $d021
|
|
150
|
+
ldx #0
|
|
151
|
+
!: lda #160 // reverse space: every pixel takes the cell colour
|
|
152
|
+
sta SCREEN, x
|
|
153
|
+
sta SCREEN + $100, x
|
|
154
|
+
sta SCREEN + $200, x
|
|
155
|
+
sta SCREEN + $300, x
|
|
156
|
+
lda #0
|
|
157
|
+
sta COLOUR, x
|
|
158
|
+
sta COLOUR + $100, x
|
|
159
|
+
sta COLOUR + $200, x
|
|
160
|
+
sta COLOUR + $300, x
|
|
161
|
+
sta SHADE, x
|
|
162
|
+
sta SHADE + $100, x
|
|
163
|
+
sta SHADE + $200, x
|
|
164
|
+
sta SHADE + $300, x
|
|
165
|
+
sta TIMES, x
|
|
166
|
+
inx
|
|
167
|
+
bne !-
|
|
168
|
+
|
|
169
|
+
main:
|
|
170
|
+
jsr wait_frame
|
|
171
|
+
|
|
172
|
+
// Blob position from the two sines: cx = 18 + 16 sin t, cy = 11 + 9 sin 2t.
|
|
173
|
+
ldx t
|
|
174
|
+
lda #18
|
|
175
|
+
clc
|
|
176
|
+
adc sin16, x
|
|
177
|
+
sta cx
|
|
178
|
+
txa
|
|
179
|
+
asl
|
|
180
|
+
tax
|
|
181
|
+
lda #11
|
|
182
|
+
clc
|
|
183
|
+
adc sin9, x
|
|
184
|
+
sta cy
|
|
185
|
+
|
|
186
|
+
TimerStart()
|
|
187
|
+
jsr draw_bob
|
|
188
|
+
TimerStop(tmp)
|
|
189
|
+
lda frame_lo
|
|
190
|
+
ora frame_hi
|
|
191
|
+
bne !+
|
|
192
|
+
lda tmp // keep the first iteration's figure: every
|
|
193
|
+
sta TIMES // cell under the blob is added to, none is full
|
|
194
|
+
lda tmp + 1
|
|
195
|
+
sta TIMES + 1
|
|
196
|
+
!:
|
|
197
|
+
#if !NODECAY
|
|
198
|
+
lda frame_lo
|
|
199
|
+
and #3
|
|
200
|
+
cmp #3
|
|
201
|
+
bne !+ // decay on iterations 3, 7, 11, ...
|
|
202
|
+
TimerStart()
|
|
203
|
+
jsr decay
|
|
204
|
+
TimerStop(tmp)
|
|
205
|
+
lda frame_hi
|
|
206
|
+
bne !+
|
|
207
|
+
lda frame_lo
|
|
208
|
+
cmp #3
|
|
209
|
+
bne !+
|
|
210
|
+
lda tmp // the first decay pass
|
|
211
|
+
sta TIMES + 2
|
|
212
|
+
lda tmp + 1
|
|
213
|
+
sta TIMES + 3
|
|
214
|
+
!:
|
|
215
|
+
#endif
|
|
216
|
+
inc t
|
|
217
|
+
inc frame_lo
|
|
218
|
+
bne !+
|
|
219
|
+
inc frame_hi
|
|
220
|
+
!: lda frame_lo
|
|
221
|
+
cmp #<FRAMES
|
|
222
|
+
lda frame_hi
|
|
223
|
+
sbc #>FRAMES
|
|
224
|
+
bcs !+
|
|
225
|
+
jmp main
|
|
226
|
+
!:
|
|
227
|
+
lda #1
|
|
228
|
+
sta TIMES + 6 // done: the monitor dumps on this store
|
|
229
|
+
jmp *
|
|
230
|
+
|
|
231
|
+
// Wait for a fresh crossing of raster line 256 ($D011 bit 7 clear, then set).
|
|
232
|
+
wait_frame:
|
|
233
|
+
!: bit $d011
|
|
234
|
+
bmi !-
|
|
235
|
+
!: bit $d011
|
|
236
|
+
bpl !-
|
|
237
|
+
rts
|
|
238
|
+
|
|
239
|
+
// Record the iteration on which a cell first reached MAX; later calls do
|
|
240
|
+
// nothing. Iteration 0 cannot reach it, so 0 in TIMES + 4 means never.
|
|
241
|
+
note_full:
|
|
242
|
+
pha
|
|
243
|
+
lda TIMES + 4
|
|
244
|
+
ora TIMES + 5
|
|
245
|
+
bne !+
|
|
246
|
+
lda frame_lo
|
|
247
|
+
sta TIMES + 4
|
|
248
|
+
lda frame_hi
|
|
249
|
+
sta TIMES + 5
|
|
250
|
+
!: pla
|
|
251
|
+
rts
|
|
252
|
+
|
|
253
|
+
// Point sp and cp at row cy + dy, column cx, and add one to each masked cell.
|
|
254
|
+
draw_bob:
|
|
255
|
+
.for (var dy = 0; dy < 3; dy++) {
|
|
256
|
+
ldy cy
|
|
257
|
+
.if (dy > 0) {
|
|
258
|
+
.fill dy, $c8 // iny
|
|
259
|
+
}
|
|
260
|
+
lda srow_lo, y
|
|
261
|
+
clc
|
|
262
|
+
adc cx
|
|
263
|
+
sta sp
|
|
264
|
+
lda srow_hi, y
|
|
265
|
+
adc #0
|
|
266
|
+
sta sp + 1
|
|
267
|
+
lda crow_lo, y
|
|
268
|
+
clc
|
|
269
|
+
adc cx
|
|
270
|
+
sta cp
|
|
271
|
+
lda crow_hi, y
|
|
272
|
+
adc #0
|
|
273
|
+
sta cp + 1
|
|
274
|
+
BobRow(dy)
|
|
275
|
+
}
|
|
276
|
+
rts
|
|
277
|
+
|
|
278
|
+
// Every cell loses one step, floored at 0, and every colour cell is
|
|
279
|
+
// rewritten. Row by row with X at most 39, so no index reaches 1,024.
|
|
280
|
+
decay:
|
|
281
|
+
.for (var r = 0; r < 25; r++) {
|
|
282
|
+
ldx #0
|
|
283
|
+
!loop:
|
|
284
|
+
lda SHADE + r * 40, x
|
|
285
|
+
beq !zero+
|
|
286
|
+
sec
|
|
287
|
+
sbc #1
|
|
288
|
+
sta SHADE + r * 40, x
|
|
289
|
+
!zero:
|
|
290
|
+
tay
|
|
291
|
+
lda palette, y
|
|
292
|
+
sta COLOUR + r * 40, x
|
|
293
|
+
inx
|
|
294
|
+
cpx #40
|
|
295
|
+
bne !loop-
|
|
296
|
+
}
|
|
297
|
+
rts
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## Build
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
java -jar KickAss.jar shadebobs.asm -o shadebobs.prg
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
Control build, no decay pass:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
java -jar KickAss.jar shadebobs.asm -define NODECAY -o shadebobs-nodecay.prg
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
## Expected output
|
|
313
|
+
|
|
314
|
+
Black border and background. After the 300 iterations the program
|
|
315
|
+
halts, and what is left is the blob's last position and the trail that
|
|
316
|
+
the decay has not yet taken back to zero: 21 lit cells in rows 19 to
|
|
317
|
+
22, columns 27 to 35, the brightest at shade 8 (grey), the rest of the
|
|
318
|
+
screen black. The picture does not change after the halt and repeats
|
|
319
|
+
exactly from one run to the next, because the sines are tables and
|
|
320
|
+
nothing reads a timer or a key.
|
|
321
|
+
|
|
322
|
+
Screenshots from the VICE runs this page describes:
|
|
323
|
+
`screenshots/shadebobs.png` (PAL) and `screenshots/shadebobs-ntsc.png`
|
|
324
|
+
(NTSC), both at cycle limit 11,000,000. The program's done-byte store
|
|
325
|
+
lands at cycle 10,362,897 on PAL (raster line 66) and 9,515,159 on NTSC
|
|
326
|
+
(raster line 159), read from a monitor trace of the store, so at the
|
|
327
|
+
limit the picture is static and the beam position does not matter;
|
|
328
|
+
two runs per model gave the same PNG (md5
|
|
329
|
+
`4254e90a022d46d6489d2f4240ab2bb3` PAL,
|
|
330
|
+
`384ec1f77a7b9891f64d8e9d1bb38a96` NTSC).
|
|
331
|
+
|
|
332
|
+
Sampling the centre pixel of every cell of the PAL picture and matching
|
|
333
|
+
it to the cell's colour-RAM nibble from the same run's monitor dump
|
|
334
|
+
(every nibble value maps to one RGB and every RGB to one nibble, so the
|
|
335
|
+
pixel census is the nibble census) gives, over the 1,000 cells: 979
|
|
336
|
+
black, 7 red, 3 brown, 3 grey, 2 blue, 2 dark grey, 2 orange, 1 purple
|
|
337
|
+
and 1 light blue. By shade that is 979 at 0, 2 at 1, 3 at 2, 7 at 3, 2
|
|
338
|
+
at 4, 2 at 5, 1 at 6, 1 at 7 and 3 at 8. The NTSC run has the identical
|
|
339
|
+
census and the identical 1,000-byte buffer: the iteration count is the
|
|
340
|
+
same on both models, only the cycle at which it finishes differs.
|
|
341
|
+
|
|
342
|
+
No cell reaches 15 in this build. The blob covers a cell for a few
|
|
343
|
+
frames per pass and the decay takes a step every four frames, so a cell
|
|
344
|
+
left at shade 8 is back to black 32 frames after the blob leaves it
|
|
345
|
+
(arithmetic), and the trail is 21 cells long rather than the whole path.
|
|
346
|
+
|
|
347
|
+
Control: the same listing with `-define NODECAY`, run to the same cycle
|
|
348
|
+
limit on PAL, gives 640 black, 19 blue, 37 brown, 20 red, 34 dark grey,
|
|
349
|
+
51 orange, 38 purple, 44 light blue, 23 grey, 15 green, 28 light red,
|
|
350
|
+
12 cyan, 14 light grey, 4 light green, 8 yellow and 13 white: the whole
|
|
351
|
+
figure of eight, 360 lit cells, brightest where the path crosses itself
|
|
352
|
+
in the middle and where the second pass (iterations 256 to 299 repeat
|
|
353
|
+
the phase of 0 to 43) runs over the first. The first cell to reach 15
|
|
354
|
+
did so on iteration 280 (the count is zero-based; the value is recorded
|
|
355
|
+
by the program at `$0344`). The NTSC control has the same census and
|
|
356
|
+
the same first-15 iteration. Its done store lands at 8,881,626 PAL and
|
|
357
|
+
8,222,883 NTSC.
|
|
358
|
+
|
|
359
|
+
## Why this works
|
|
360
|
+
|
|
361
|
+
### Colour RAM is the picture
|
|
362
|
+
|
|
363
|
+
In standard text mode, colour RAM sets the colour of a cell's set
|
|
364
|
+
pixels and `$D021` its clear pixels. The reverse space has every pixel
|
|
365
|
+
set, so with `$D021` black a cell shows its colour-RAM nibble and
|
|
366
|
+
nothing else. `fire_effect` and `plasma` in
|
|
367
|
+
`../../techniques/effects-vector-3d.md` use the same fill. For a shade
|
|
368
|
+
bob this is the whole point: the "bob" is never drawn and never erased,
|
|
369
|
+
it only adds to a number per cell, and the number is shown by one
|
|
370
|
+
store.
|
|
371
|
+
|
|
372
|
+
### The saturating add
|
|
373
|
+
|
|
374
|
+
For each of the twelve mask entries under the blob, a set entry means
|
|
375
|
+
`shade = min(shade + 1, 15)` and `colour = palette[shade]`. The
|
|
376
|
+
`BobRow` macro runs Y from 3 down to 0 along a row through two
|
|
377
|
+
zero-page pointers, `sp` into the buffer and `cp` into colour RAM, both
|
|
378
|
+
set to the row start plus `cx` from the `srow` and `crow` tables. A
|
|
379
|
+
cell already at 15 is skipped before the add, so it is never written
|
|
380
|
+
and never wraps. Saturating rather than wrapping is what keeps the
|
|
381
|
+
brightest cell brightest: a wrap would take a full cell to
|
|
382
|
+
`palette[0]`, black, and the hottest point of the trail would become a
|
|
383
|
+
hole; with saturation the top of the range is a plateau the decay
|
|
384
|
+
brings down one step at a time. The mask has eight set entries out of
|
|
385
|
+
twelve, the four corners clear, so the blob reads as rounded rather
|
|
386
|
+
than as a brick.
|
|
387
|
+
|
|
388
|
+
### The decay
|
|
389
|
+
|
|
390
|
+
Every iteration whose count is 3 modulo 4 runs `decay`: 25 unrolled
|
|
391
|
+
row loops, each with X from 0 to 39, subtracting one from every
|
|
392
|
+
non-zero shade and rewriting the colour of every cell, including the
|
|
393
|
+
cells that were and stay zero. It rewrites all 1,000 colour cells
|
|
394
|
+
rather than only the changed ones because it has no record of which
|
|
395
|
+
cells changed; a dirty list is the variation on the technique page.
|
|
396
|
+
|
|
397
|
+
### The palette
|
|
398
|
+
|
|
399
|
+
Sixteen bytes map shade to a VIC colour in rising luminance order,
|
|
400
|
+
`colour_fade`'s PAL ranking from `../../techniques/transitions.md`:
|
|
401
|
+
|
|
402
|
+
```
|
|
403
|
+
shade 0: 0 black shade 8: 12 grey
|
|
404
|
+
shade 1: 6 blue shade 9: 5 green
|
|
405
|
+
shade 2: 9 brown shade 10: 10 light red
|
|
406
|
+
shade 3: 2 red shade 11: 3 cyan
|
|
407
|
+
shade 4: 11 dark grey shade 12: 15 light grey
|
|
408
|
+
shade 5: 8 orange shade 13: 13 light green
|
|
409
|
+
shade 6: 4 purple shade 14: 7 yellow
|
|
410
|
+
shade 7: 14 light blue shade 15: 1 white
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
All sixteen are used, so the trail changes hue as it fades, blue and
|
|
414
|
+
purple among the browns and reds; the ranking is monotone in
|
|
415
|
+
brightness, which is what makes it read as a glow that cools. A subset
|
|
416
|
+
in the same order, as the fire recipe uses, gives a single hue at the
|
|
417
|
+
cost of fewer steps.
|
|
418
|
+
|
|
419
|
+
### The two sines
|
|
420
|
+
|
|
421
|
+
`sin16` and `sin9` are 256-entry signed tables of `round(16 * sin)` and
|
|
422
|
+
`round(9 * sin)`, and the blob's top-left cell is `cx = 18 + sin16[t]`,
|
|
423
|
+
`cy = 11 + sin9[2t]`, with `t` stepping once per iteration, so the
|
|
424
|
+
path is a figure of eight 33 columns wide and 19 rows tall. `cx` runs
|
|
425
|
+
2 to 34 and `cy` 2 to 20, so the four-by-three blob stays inside
|
|
426
|
+
columns 2 to 37 and rows 2 to 22 and no clipping is needed. The
|
|
427
|
+
amplitudes are far below 128, so the peak of neither table can carry
|
|
428
|
+
out of a byte, which is the fault
|
|
429
|
+
`sine_table_peak_wraps_to_zero` (`../../pitfalls/maths.md`) describes
|
|
430
|
+
for amplitude-128 tables; the largest step between neighbours in
|
|
431
|
+
`sin16` is 1 (arithmetic: 16 times 2 pi over 256 is 0.39).
|
|
432
|
+
|
|
433
|
+
### Measured costs
|
|
434
|
+
|
|
435
|
+
Measured with CIA1 timer A (one-shot from `$FFFF`, `$DC0E = $19`, read
|
|
436
|
+
`$DC04`/`$DC05` after; the bytes at `$0340` dumped through the monitor
|
|
437
|
+
on a trace of the done byte at `$0346`), with the screen on so badline
|
|
438
|
+
stealing is included. The add is timed on iteration 0, when every
|
|
439
|
+
covered cell is zero and none is skipped as full; the decay on its
|
|
440
|
+
first pass, iteration 3, when 12 of the 1,000 cells are non-zero.
|
|
441
|
+
|
|
442
|
+
| | PAL | NTSC |
|
|
443
|
+
|---|---|---|
|
|
444
|
+
| Blob add, 8 set mask entries of 12 | 590 | 590 |
|
|
445
|
+
| Decay pass, first, all 1,000 cells | 26,514 | 27,028 |
|
|
446
|
+
|
|
447
|
+
Two more builds of the same listing with the mask changed, PAL only:
|
|
448
|
+
all twelve entries set, 730; none set, 310. So a set entry costs 35
|
|
449
|
+
cycles and a clear one 12, with about 166 cycles of row set-up, `jsr`
|
|
450
|
+
and timer reads around them (arithmetic from the three measurements;
|
|
451
|
+
the instruction table gives 47 for the set path and 12 for the clear
|
|
452
|
+
path, and 35 is their difference). The control build measures the
|
|
453
|
+
same add at 595; the five-cycle difference was not examined.
|
|
454
|
+
|
|
455
|
+
A PAL frame is 19,656 cycles and an NTSC frame 17,095 (arithmetic).
|
|
456
|
+
The add is about nine raster lines (arithmetic, 63 cycles a line). The decay pass is 1.35 PAL frames
|
|
457
|
+
and 1.58 NTSC frames, and it does not fit the vertical blank or the
|
|
458
|
+
frame: per cell the zero path is `lda abs,x`, `beq`, `tay`, `lda
|
|
459
|
+
abs,y`, `sta abs,x`, `inx`, `cpx`, `bne`, 25 cycles by the instruction
|
|
460
|
+
table, and the non-zero path 33, so 1,000 cells are at least 25,000
|
|
461
|
+
before badlines. The `main` loop waits for a fresh crossing of raster
|
|
462
|
+
line 256 before each iteration, so an iteration with a decay pass
|
|
463
|
+
overruns into the next frame and the following iteration starts on the
|
|
464
|
+
crossing after that: 75 of the 300 iterations take two raster frames,
|
|
465
|
+
and the run from the program's first instruction to its halt is 376
|
|
466
|
+
PAL frames (arithmetic from the measured done cycle and the cycle of
|
|
467
|
+
the first store into `$0346`, which is the start-up clearing loop at
|
|
468
|
+
2,970,920). The colour-RAM rewrite of a decay iteration starts in the
|
|
469
|
+
blank and runs through the next field's display, so a frame with a
|
|
470
|
+
decay pass tears; a viewer sees a hitch every fourth frame.
|
|
471
|
+
|
|
472
|
+
### Colour RAM by row, indexed inside the row
|
|
473
|
+
|
|
474
|
+
The decay's stores are `sta COLOUR + r * 40, x` with X at most 39, and
|
|
475
|
+
the add's are `sta (cp), y` with Y at most 3 and `cp` at most `COLOUR
|
|
476
|
+
+ 22 * 40 + 34`. Neither can reach `COLOUR + 1,024`, which is where a
|
|
477
|
+
store lands on CIA1's registers instead of colour RAM
|
|
478
|
+
(`colour_ram_index_past_last_cell_hits_cia1` in
|
|
479
|
+
`../../pitfalls/text-mode-render.md`); this listing has CIA1's interrupt
|
|
480
|
+
mask cleared and its timer in use for the measurement, so a stray store
|
|
481
|
+
there would change the figures. The full rewrite through an index is
|
|
482
|
+
what `full_field_redraw_exceeds_vblank` on the same page describes,
|
|
483
|
+
and here it overruns; running it every fourth frame is what keeps the
|
|
484
|
+
average under a frame, not a fit.
|
|
485
|
+
|
|
486
|
+
### The buffer is the picture
|
|
487
|
+
|
|
488
|
+
At the halt the monitor dumped the 1,000-byte buffer at `$3000` and
|
|
489
|
+
colour RAM at `$D800` to `$DBE7` from the same trace. Passing each
|
|
490
|
+
buffer byte through the palette and comparing with the colour-RAM low
|
|
491
|
+
nibble gives 0 mismatches in 1,000, on both models and in both builds.
|
|
492
|
+
The comparison masks the upper nibble: the monitor's read of colour RAM
|
|
493
|
+
returned 0 there in the decay runs, 15 in the PAL control and 10 in the
|
|
494
|
+
NTSC control, which is not stored data. The program itself never reads
|
|
495
|
+
colour RAM back.
|
|
496
|
+
|
|
497
|
+
As a second check, a Python model of the design as written above (the
|
|
498
|
+
two rounded sine tables, the eight-entry mask, the saturating add and
|
|
499
|
+
the decay on every iteration that is 3 modulo 4, 300 iterations)
|
|
500
|
+
produces the same 1,000 bytes as the dumped buffer, in both builds: 0
|
|
501
|
+
differences. The 6502 listing does what the description says, cell for
|
|
502
|
+
cell.
|
|
503
|
+
|
|
504
|
+
### Region
|
|
505
|
+
|
|
506
|
+
`region: both`. The mechanism is the same on NTSC; the decay pass is
|
|
507
|
+
514 cycles dearer there because more badlines fall inside it, and the
|
|
508
|
+
same 300 iterations finish 847,738 cycles earlier because the frames
|
|
509
|
+
are shorter. The buffer, the census and the first-15 iteration are the
|
|
510
|
+
same on both models.
|
|
511
|
+
|
|
512
|
+
## What it does not establish
|
|
513
|
+
|
|
514
|
+
Nothing here was run on hardware; VICE x64sc 3.10 is the instrument.
|
|
515
|
+
One blob only: a second bob, a bitmap shade bob that adds per pixel
|
|
516
|
+
rather than per cell, and a decay split across alternate halves of the
|
|
517
|
+
screen were not built or timed. The decay rate of one step every four
|
|
518
|
+
frames is the design as fixed, and with this blob speed it leaves a
|
|
519
|
+
trail of 21 cells; a slower decay was not run. The costs are for this
|
|
520
|
+
listing's loop shape, not a floor for the technique. The palette order
|
|
521
|
+
is `colour_fade`'s luminance ranking, not measured on a display, and
|
|
522
|
+
the five-cycle difference in the control build's add was not examined.
|