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,725 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: software-sprite-preshifted
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [software_sprite_preshifted]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D012, D018, D020, DD04, DD05, DD0E]
|
|
9
|
+
uses_kernal: [CHROUT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Pre-shifted Software Sprites in a Character Back Buffer
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Two 24x21 objects, a ring and a diamond, are drawn into a 16x4 cell
|
|
19
|
+
character canvas over a tiled background with an AND mask and OR data,
|
|
20
|
+
pre-shifted for the eight pixel positions so a draw is a copy and never
|
|
21
|
+
a shift. At start-up, with the display blanked, one masked blit is timed
|
|
22
|
+
with CIA2 timer A at each of the eight shifts, the canvas is checksummed
|
|
23
|
+
after the draw and after the erase, the erase is timed, and one more
|
|
24
|
+
blit is timed with the display on so the badline cost shows. Every
|
|
25
|
+
figure is printed in decimal. Then the two objects cross the canvas in
|
|
26
|
+
opposite directions, one pixel a frame, drawn after the VIC has passed
|
|
27
|
+
the canvas rows. This is the `software_sprite_preshifted` technique;
|
|
28
|
+
use it when hardware sprites have run out on a row and the objects sit
|
|
29
|
+
on a background you can repaint.
|
|
30
|
+
|
|
31
|
+
Verified in VICE x64sc 3.10: the blit costs 1,428 cycles at every shift
|
|
32
|
+
on PAL and on NTSC, the canvas checksum returns to the background value
|
|
33
|
+
after every erase, and the pinned pictures show the two objects
|
|
34
|
+
overlapping mid-canvas.
|
|
35
|
+
|
|
36
|
+
## Source
|
|
37
|
+
|
|
38
|
+
```asm
|
|
39
|
+
// software-sprite-preshifted.asm
|
|
40
|
+
// Two 24x21 software sprites drawn into a character-mode back buffer with
|
|
41
|
+
// an AND mask and OR data, pre-shifted for the eight pixel positions so a
|
|
42
|
+
// draw is a straight copy with no shifting at run time. The buffer is a
|
|
43
|
+
// 16x4 cell canvas made of characters 192..255 of a copied ROM font, so a
|
|
44
|
+
// pixel row of the canvas is one byte per cell, eight bytes apart. The
|
|
45
|
+
// background is an 8x8 tile repeated over the canvas; erase writes the
|
|
46
|
+
// tile rows back over the object's footprint.
|
|
47
|
+
// Start-up, screen blanked: one masked blit of the ring is timed with CIA2
|
|
48
|
+
// timer A at each of the eight shifts, the canvas is checksummed after the
|
|
49
|
+
// draw and again after the erase, and the erase is timed. Then, with the
|
|
50
|
+
// display on, one blit is timed starting at raster line 100 so the badline
|
|
51
|
+
// cost shows. The screen prints every figure in decimal. After that the
|
|
52
|
+
// ring and the diamond cross the canvas in opposite directions, one pixel
|
|
53
|
+
// a frame, drawn after the VIC has passed the canvas rows.
|
|
54
|
+
// Verdict: $02FF = $01 and a green border when every drawn checksum
|
|
55
|
+
// differs from the background's and every erased checksum equals it;
|
|
56
|
+
// $02FF = $02 and a red border otherwise.
|
|
57
|
+
|
|
58
|
+
BasicUpstart2(start)
|
|
59
|
+
.encoding "petscii_upper"
|
|
60
|
+
|
|
61
|
+
.const CHROUT = $ffd2
|
|
62
|
+
.const RESULT = $02ff // verdict byte read by the harness
|
|
63
|
+
.const BORDER = $d020
|
|
64
|
+
.const CODE_PASS = $01
|
|
65
|
+
.const CODE_FAIL = $02
|
|
66
|
+
|
|
67
|
+
.const SCREEN = $0400
|
|
68
|
+
.const COLRAM = $d800
|
|
69
|
+
.const FONT = $3000 // 2 KB copy of the ROM upper-case font
|
|
70
|
+
.const CANVAS = FONT + 192 * 8 // glyphs 192..255: 16 cells x 4 rows
|
|
71
|
+
.const CW = 16 // canvas width in cells
|
|
72
|
+
.const CROW = 2 // screen row of the canvas's top cell row
|
|
73
|
+
.const CCOL = 12 // screen column of its left cell column
|
|
74
|
+
.const XMAX = CW * 8 - 32 // last x that keeps a 4-cell footprint inside
|
|
75
|
+
.const YA = 3 // ring's top pixel row inside the canvas
|
|
76
|
+
.const YB = 8 // diamond's top pixel row
|
|
77
|
+
.const TIMELINE = 100 // raster line the in-display timing starts on
|
|
78
|
+
.const DRAWLINE = 128 // raster line the frame loop draws from
|
|
79
|
+
|
|
80
|
+
// zero page
|
|
81
|
+
.const val = $fb // 16-bit number for the decimal printer
|
|
82
|
+
.const chk = $fd // 16-bit canvas checksum
|
|
83
|
+
.const ptr = $f7 // copy pointer
|
|
84
|
+
.const ax = $02 // ring x, 0..XMAX
|
|
85
|
+
.const bx = $03 // diamond x
|
|
86
|
+
.const adir = $04 // +1 or -1
|
|
87
|
+
.const bdir = $05
|
|
88
|
+
|
|
89
|
+
// Background tile, 8 rows: diagonal stripes.
|
|
90
|
+
.var TILE = List().add($11, $22, $44, $88, $11, $22, $44, $88)
|
|
91
|
+
|
|
92
|
+
// Shapes: 21 rows of 24 pixels. data = pixels the object sets, mask =
|
|
93
|
+
// pixels it leaves alone (1 = transparent).
|
|
94
|
+
.var ringData = List()
|
|
95
|
+
.var ringMask = List()
|
|
96
|
+
.for (var r = 0; r < 21; r++) {
|
|
97
|
+
.var d = 0
|
|
98
|
+
.var m = 0
|
|
99
|
+
.for (var x = 0; x < 24; x++) {
|
|
100
|
+
.var dx = x - 11.5
|
|
101
|
+
.var dy = r - 10
|
|
102
|
+
.var dd = dx * dx + dy * dy
|
|
103
|
+
.var solid = (dd <= 110) && (dd > 22)
|
|
104
|
+
.if (solid) { .eval d = d | (1 << (23 - x)) }
|
|
105
|
+
.if (!solid) { .eval m = m | (1 << (23 - x)) }
|
|
106
|
+
}
|
|
107
|
+
.eval ringData.add(d)
|
|
108
|
+
.eval ringMask.add(m)
|
|
109
|
+
}
|
|
110
|
+
.var diaData = List()
|
|
111
|
+
.var diaMask = List()
|
|
112
|
+
.for (var r = 0; r < 21; r++) {
|
|
113
|
+
.var d = 0
|
|
114
|
+
.var m = 0
|
|
115
|
+
.for (var x = 0; x < 24; x++) {
|
|
116
|
+
.var man = abs(x - 11.5) + abs(r - 10) // diamond: L1 distance
|
|
117
|
+
.var inside = man <= 11.5
|
|
118
|
+
.var edge = inside && (man > 9.5)
|
|
119
|
+
.if (edge) { .eval d = d | (1 << (23 - x)) }
|
|
120
|
+
.if (!inside) { .eval m = m | (1 << (23 - x)) }
|
|
121
|
+
}
|
|
122
|
+
.eval diaData.add(d)
|
|
123
|
+
.eval diaMask.add(m)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// One pre-shifted table: for each of the 84 byte positions (21 rows x 4
|
|
127
|
+
// cells) the eight shifts in a row, so the shift is a Y index and the
|
|
128
|
+
// position is a constant in the unrolled code. Page-aligned, so no
|
|
129
|
+
// abs,y read crosses a page.
|
|
130
|
+
.function shifted(word, s, c, fillbit) {
|
|
131
|
+
.var b = 0
|
|
132
|
+
.for (var i = 0; i < 8; i++) {
|
|
133
|
+
.var o = c * 8 + i // output bit, counted from the left
|
|
134
|
+
.var k = o - s // the 24-bit word's bit that lands there
|
|
135
|
+
.var bit = fillbit
|
|
136
|
+
.if (k >= 0 && k < 24) { .eval bit = (word >> (23 - k)) & 1 }
|
|
137
|
+
.eval b = b | (bit << (7 - i))
|
|
138
|
+
}
|
|
139
|
+
.return b
|
|
140
|
+
}
|
|
141
|
+
.macro ShiftTable(rows, fillbit) {
|
|
142
|
+
.for (var p = 0; p < 84; p++) {
|
|
143
|
+
.var r = floor(p / 4)
|
|
144
|
+
.var c = mod(p, 4)
|
|
145
|
+
.for (var s = 0; s < 8; s++) {
|
|
146
|
+
.byte shifted(rows.get(r), s, c, fillbit)
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Blit(y0, data, mask): masked draw of a 24x21 object whose top row is
|
|
152
|
+
// canvas pixel row y0. X = x & $F8 (the cell column times 8), Y = x & 7
|
|
153
|
+
// (the shift). 84 byte positions, each load, AND, OR, store.
|
|
154
|
+
.macro Blit(y0, data, mask) {
|
|
155
|
+
.for (var r = 0; r < 21; r++) {
|
|
156
|
+
.var y = y0 + r
|
|
157
|
+
.var base = CANVAS + floor(y / 8) * CW * 8 + mod(y, 8)
|
|
158
|
+
.for (var c = 0; c < 4; c++) {
|
|
159
|
+
.var p = r * 4 + c
|
|
160
|
+
lda base + c * 8,x
|
|
161
|
+
and mask + p * 8,y
|
|
162
|
+
ora data + p * 8,y
|
|
163
|
+
sta base + c * 8,x
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
rts
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Erase(y0): write the tile rows back over the 4-cell footprint. X as
|
|
170
|
+
// for Blit; Y unused.
|
|
171
|
+
.macro Erase(y0) {
|
|
172
|
+
.for (var r = 0; r < 21; r++) {
|
|
173
|
+
.var y = y0 + r
|
|
174
|
+
.var base = CANVAS + floor(y / 8) * CW * 8 + mod(y, 8)
|
|
175
|
+
lda #TILE.get(mod(y, 8))
|
|
176
|
+
.for (var c = 0; c < 4; c++) {
|
|
177
|
+
sta base + c * 8,x
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
rts
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Time(routine, slot): run routine with CIA2 timer A counting phi2 from
|
|
184
|
+
// $FFFF; leave $FFFF - TA, the cycles taken, in slot (16-bit).
|
|
185
|
+
.macro Time(routine, slot) {
|
|
186
|
+
lda #$11 // CRA: start, force load, count phi2
|
|
187
|
+
sta $dd0e
|
|
188
|
+
jsr routine
|
|
189
|
+
lda #$00
|
|
190
|
+
sta $dd0e // stop A
|
|
191
|
+
sec
|
|
192
|
+
lda #$ff
|
|
193
|
+
sbc $dd04
|
|
194
|
+
sta slot
|
|
195
|
+
lda #$ff
|
|
196
|
+
sbc $dd05
|
|
197
|
+
sta slot + 1
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Net(slot): slot -= empty, the cost of the harness itself
|
|
201
|
+
.macro Net(slot) {
|
|
202
|
+
sec
|
|
203
|
+
lda slot
|
|
204
|
+
sbc t_empty
|
|
205
|
+
sta slot
|
|
206
|
+
lda slot + 1
|
|
207
|
+
sbc t_empty + 1
|
|
208
|
+
sta slot + 1
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
start:
|
|
212
|
+
sei
|
|
213
|
+
cld
|
|
214
|
+
lda #$00
|
|
215
|
+
sta $dd0e // stop timer A, latch $FFFF
|
|
216
|
+
lda #$ff
|
|
217
|
+
sta $dd04
|
|
218
|
+
sta $dd05
|
|
219
|
+
|
|
220
|
+
// screen off, so no badline steals cycles from the timed blits.
|
|
221
|
+
// DEN is sampled on line $30; wait for the next frame so it applies.
|
|
222
|
+
lda $d011
|
|
223
|
+
and #$ef
|
|
224
|
+
sta $d011
|
|
225
|
+
jsr waitframe
|
|
226
|
+
jsr waitframe
|
|
227
|
+
|
|
228
|
+
// copy the ROM upper-case font to FONT, then point the VIC at it
|
|
229
|
+
lda #$33
|
|
230
|
+
sta $01
|
|
231
|
+
ldx #$00
|
|
232
|
+
!: .for (var i = 0; i < 8; i++) {
|
|
233
|
+
lda $d000 + i * 256,x
|
|
234
|
+
sta FONT + i * 256,x
|
|
235
|
+
}
|
|
236
|
+
inx
|
|
237
|
+
bne !-
|
|
238
|
+
lda #$37
|
|
239
|
+
sta $01
|
|
240
|
+
lda #$1c // screen $0400, font $3000
|
|
241
|
+
sta $d018
|
|
242
|
+
|
|
243
|
+
// fill the canvas glyphs with the tile
|
|
244
|
+
ldx #$00
|
|
245
|
+
!: .for (var i = 0; i < 2; i++) {
|
|
246
|
+
lda tilepat, x // x & 7 selects the row, see tilepat
|
|
247
|
+
sta CANVAS + i * 256,x
|
|
248
|
+
}
|
|
249
|
+
inx
|
|
250
|
+
bne !-
|
|
251
|
+
|
|
252
|
+
// background checksum, then the eight timed draws and erases
|
|
253
|
+
jsr checksum
|
|
254
|
+
lda chk
|
|
255
|
+
sta chk0
|
|
256
|
+
lda chk + 1
|
|
257
|
+
sta chk0 + 1
|
|
258
|
+
lda #CODE_PASS
|
|
259
|
+
sta RESULT
|
|
260
|
+
|
|
261
|
+
Time(empty, t_empty)
|
|
262
|
+
ldy #$00
|
|
263
|
+
measure:
|
|
264
|
+
sty shift
|
|
265
|
+
ldx #$08 // cell column 1
|
|
266
|
+
Time(blita, t_shift)
|
|
267
|
+
lda shift
|
|
268
|
+
asl
|
|
269
|
+
tay
|
|
270
|
+
lda t_shift
|
|
271
|
+
sta t_shifts, y
|
|
272
|
+
lda t_shift + 1
|
|
273
|
+
sta t_shifts + 1, y
|
|
274
|
+
jsr checksum // drawn: must differ from background
|
|
275
|
+
lda chk
|
|
276
|
+
cmp chk0
|
|
277
|
+
bne !+
|
|
278
|
+
lda chk + 1
|
|
279
|
+
cmp chk0 + 1
|
|
280
|
+
bne !+
|
|
281
|
+
jsr fail
|
|
282
|
+
!: ldx #$08
|
|
283
|
+
ldy shift
|
|
284
|
+
Time(erasea, t_erase)
|
|
285
|
+
jsr checksum // erased: must equal background
|
|
286
|
+
lda chk
|
|
287
|
+
cmp chk0
|
|
288
|
+
bne bad
|
|
289
|
+
lda chk + 1
|
|
290
|
+
cmp chk0 + 1
|
|
291
|
+
beq !+
|
|
292
|
+
bad: jsr fail
|
|
293
|
+
!: ldy shift
|
|
294
|
+
iny
|
|
295
|
+
cpy #$08
|
|
296
|
+
beq !+
|
|
297
|
+
jmp measure
|
|
298
|
+
!:
|
|
299
|
+
|
|
300
|
+
// display on, then one blit timed from raster line TIMELINE
|
|
301
|
+
lda $d011
|
|
302
|
+
ora #$10
|
|
303
|
+
sta $d011
|
|
304
|
+
jsr waitframe
|
|
305
|
+
jsr waitframe
|
|
306
|
+
!: lda $d012
|
|
307
|
+
cmp #TIMELINE
|
|
308
|
+
bne !-
|
|
309
|
+
ldx #$08
|
|
310
|
+
ldy #$03
|
|
311
|
+
Time(blita, t_disp)
|
|
312
|
+
ldx #$08
|
|
313
|
+
jsr erasea
|
|
314
|
+
|
|
315
|
+
// print the figures. The screen CHROUT returns with interrupts
|
|
316
|
+
// enabled after every character, so every print goes through out,
|
|
317
|
+
// which does sei again; a KERNAL IRQ would otherwise jitter the
|
|
318
|
+
// frame loop below.
|
|
319
|
+
lda #$93 // clear, cursor home
|
|
320
|
+
jsr out
|
|
321
|
+
ldx #$08
|
|
322
|
+
!: lda #$11 // cursor down
|
|
323
|
+
jsr out
|
|
324
|
+
dex
|
|
325
|
+
bne !-
|
|
326
|
+
ldx #$00
|
|
327
|
+
stx shift
|
|
328
|
+
!: ldy #$00
|
|
329
|
+
jsr print // "SHIFT "
|
|
330
|
+
lda shift
|
|
331
|
+
clc
|
|
332
|
+
adc #'0'
|
|
333
|
+
jsr out
|
|
334
|
+
lda #' '
|
|
335
|
+
jsr out
|
|
336
|
+
lda shift
|
|
337
|
+
asl
|
|
338
|
+
tax
|
|
339
|
+
lda t_shifts, x
|
|
340
|
+
sta val
|
|
341
|
+
lda t_shifts + 1, x
|
|
342
|
+
sta val + 1
|
|
343
|
+
Net(val)
|
|
344
|
+
jsr decimal
|
|
345
|
+
lda #$0d
|
|
346
|
+
jsr out
|
|
347
|
+
inc shift
|
|
348
|
+
ldx shift
|
|
349
|
+
cpx #$08
|
|
350
|
+
bne !-
|
|
351
|
+
ldy #erasetext - texts
|
|
352
|
+
jsr print
|
|
353
|
+
lda t_erase
|
|
354
|
+
sta val
|
|
355
|
+
lda t_erase + 1
|
|
356
|
+
sta val + 1
|
|
357
|
+
Net(val)
|
|
358
|
+
jsr decimal
|
|
359
|
+
lda #$0d
|
|
360
|
+
jsr out
|
|
361
|
+
ldy #disptext - texts
|
|
362
|
+
jsr print
|
|
363
|
+
lda t_disp
|
|
364
|
+
sta val
|
|
365
|
+
lda t_disp + 1
|
|
366
|
+
sta val + 1
|
|
367
|
+
Net(val)
|
|
368
|
+
jsr decimal
|
|
369
|
+
lda #$0d
|
|
370
|
+
jsr out
|
|
371
|
+
ldy #tabletext - texts
|
|
372
|
+
jsr print
|
|
373
|
+
lda #<(tables_end - tables)
|
|
374
|
+
sta val
|
|
375
|
+
lda #>(tables_end - tables)
|
|
376
|
+
sta val + 1
|
|
377
|
+
jsr decimal
|
|
378
|
+
ldy #bytestext - texts
|
|
379
|
+
jsr print
|
|
380
|
+
lda #$0d
|
|
381
|
+
jsr out
|
|
382
|
+
ldy #restext - texts
|
|
383
|
+
jsr print
|
|
384
|
+
lda RESULT
|
|
385
|
+
jsr hexbyte
|
|
386
|
+
lda #$0d
|
|
387
|
+
jsr out
|
|
388
|
+
|
|
389
|
+
lda RESULT
|
|
390
|
+
cmp #CODE_PASS
|
|
391
|
+
bne !+
|
|
392
|
+
lda #$05 // green
|
|
393
|
+
.byte $2c // BIT abs: skip the red
|
|
394
|
+
!: lda #$02 // red
|
|
395
|
+
sta BORDER
|
|
396
|
+
|
|
397
|
+
// lay the canvas on screen (after the clear, which wiped the cells)
|
|
398
|
+
.for (var cy = 0; cy < 4; cy++) {
|
|
399
|
+
.for (var cx = 0; cx < CW; cx++) {
|
|
400
|
+
lda #192 + cy * CW + cx
|
|
401
|
+
sta SCREEN + (CROW + cy) * 40 + CCOL + cx
|
|
402
|
+
lda #$01
|
|
403
|
+
sta COLRAM + (CROW + cy) * 40 + CCOL + cx
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// the frame loop: erase both at their old x, step, draw both
|
|
408
|
+
lda #$00
|
|
409
|
+
sta ax
|
|
410
|
+
lda #XMAX
|
|
411
|
+
sta bx
|
|
412
|
+
lda #$01
|
|
413
|
+
sta adir
|
|
414
|
+
lda #$ff
|
|
415
|
+
sta bdir
|
|
416
|
+
frame:
|
|
417
|
+
lda $d012
|
|
418
|
+
cmp #DRAWLINE
|
|
419
|
+
bne frame
|
|
420
|
+
lda ax
|
|
421
|
+
and #$f8
|
|
422
|
+
tax
|
|
423
|
+
jsr erasea
|
|
424
|
+
lda bx
|
|
425
|
+
and #$f8
|
|
426
|
+
tax
|
|
427
|
+
jsr eraseb
|
|
428
|
+
lda ax
|
|
429
|
+
clc
|
|
430
|
+
adc adir
|
|
431
|
+
sta ax
|
|
432
|
+
beq !+
|
|
433
|
+
cmp #XMAX
|
|
434
|
+
bne !++
|
|
435
|
+
!: lda adir
|
|
436
|
+
eor #$fe // +1 <-> -1
|
|
437
|
+
sta adir
|
|
438
|
+
!: lda bx
|
|
439
|
+
clc
|
|
440
|
+
adc bdir
|
|
441
|
+
sta bx
|
|
442
|
+
beq !+
|
|
443
|
+
cmp #XMAX
|
|
444
|
+
bne !++
|
|
445
|
+
!: lda bdir
|
|
446
|
+
eor #$fe
|
|
447
|
+
sta bdir
|
|
448
|
+
!: lda ax
|
|
449
|
+
and #$f8
|
|
450
|
+
tax
|
|
451
|
+
lda ax
|
|
452
|
+
and #$07
|
|
453
|
+
tay
|
|
454
|
+
jsr blita
|
|
455
|
+
lda bx
|
|
456
|
+
and #$f8
|
|
457
|
+
tax
|
|
458
|
+
lda bx
|
|
459
|
+
and #$07
|
|
460
|
+
tay
|
|
461
|
+
jsr blitb
|
|
462
|
+
jmp frame
|
|
463
|
+
|
|
464
|
+
fail:
|
|
465
|
+
lda #CODE_FAIL
|
|
466
|
+
sta RESULT
|
|
467
|
+
rts
|
|
468
|
+
|
|
469
|
+
empty:
|
|
470
|
+
rts
|
|
471
|
+
|
|
472
|
+
out: // CHROUT, then interrupts off again
|
|
473
|
+
jsr CHROUT
|
|
474
|
+
sei
|
|
475
|
+
rts
|
|
476
|
+
|
|
477
|
+
waitframe: // RST8 clear, then set: one frame edge
|
|
478
|
+
bit $d011
|
|
479
|
+
bmi waitframe
|
|
480
|
+
!: bit $d011
|
|
481
|
+
bpl !-
|
|
482
|
+
rts
|
|
483
|
+
|
|
484
|
+
checksum: // 16-bit sum of the 512 canvas bytes
|
|
485
|
+
lda #$00
|
|
486
|
+
sta chk
|
|
487
|
+
sta chk + 1
|
|
488
|
+
ldx #$00
|
|
489
|
+
chkloop:
|
|
490
|
+
.for (var i = 0; i < 2; i++) {
|
|
491
|
+
clc
|
|
492
|
+
lda CANVAS + i * 256,x
|
|
493
|
+
adc chk
|
|
494
|
+
sta chk
|
|
495
|
+
lda chk + 1
|
|
496
|
+
adc #$00
|
|
497
|
+
sta chk + 1
|
|
498
|
+
}
|
|
499
|
+
inx
|
|
500
|
+
bne chkloop
|
|
501
|
+
rts
|
|
502
|
+
|
|
503
|
+
blita: Blit(YA, dataA, maskA)
|
|
504
|
+
blitb: Blit(YB, dataB, maskB)
|
|
505
|
+
erasea: Erase(YA)
|
|
506
|
+
eraseb: Erase(YB)
|
|
507
|
+
|
|
508
|
+
print: // texts,y up to a zero
|
|
509
|
+
lda texts, y
|
|
510
|
+
beq !+
|
|
511
|
+
jsr out
|
|
512
|
+
iny
|
|
513
|
+
bne print
|
|
514
|
+
!: rts
|
|
515
|
+
|
|
516
|
+
decimal: // print val (16-bit) in decimal, no leading zeros
|
|
517
|
+
ldx #$00 // x indexes pow10, 2 bytes an entry
|
|
518
|
+
stx lead
|
|
519
|
+
digit:
|
|
520
|
+
ldy #'0' - 1
|
|
521
|
+
!: iny
|
|
522
|
+
sec
|
|
523
|
+
lda val
|
|
524
|
+
sbc pow10, x
|
|
525
|
+
pha
|
|
526
|
+
lda val + 1
|
|
527
|
+
sbc pow10 + 1, x
|
|
528
|
+
bcc !+
|
|
529
|
+
sta val + 1
|
|
530
|
+
pla
|
|
531
|
+
sta val
|
|
532
|
+
jmp !-
|
|
533
|
+
!: pla
|
|
534
|
+
cpy #'0'
|
|
535
|
+
bne !+
|
|
536
|
+
lda lead
|
|
537
|
+
beq !++ // leading zero: skip
|
|
538
|
+
!: tya
|
|
539
|
+
jsr out
|
|
540
|
+
inc lead
|
|
541
|
+
!: inx
|
|
542
|
+
inx
|
|
543
|
+
cpx #2 * 4
|
|
544
|
+
bne digit
|
|
545
|
+
lda val // last digit always printed
|
|
546
|
+
clc
|
|
547
|
+
adc #'0'
|
|
548
|
+
jmp out
|
|
549
|
+
|
|
550
|
+
hexbyte: // print A as two hex digits
|
|
551
|
+
pha
|
|
552
|
+
lsr
|
|
553
|
+
lsr
|
|
554
|
+
lsr
|
|
555
|
+
lsr
|
|
556
|
+
jsr hexdigit
|
|
557
|
+
pla
|
|
558
|
+
and #$0f
|
|
559
|
+
hexdigit:
|
|
560
|
+
cmp #10
|
|
561
|
+
bcc !+
|
|
562
|
+
adc #6 // carry set: +7 lands on 'A'..'F'
|
|
563
|
+
!: adc #'0'
|
|
564
|
+
jmp out
|
|
565
|
+
|
|
566
|
+
pow10: .word 10000, 1000, 100, 10
|
|
567
|
+
|
|
568
|
+
tilepat: .fill 256, TILE.get(mod(i, 8))
|
|
569
|
+
|
|
570
|
+
texts:
|
|
571
|
+
shifttext: .text "SHIFT "
|
|
572
|
+
.byte 0
|
|
573
|
+
erasetext: .text "ERASE "
|
|
574
|
+
.byte 0
|
|
575
|
+
disptext: .text "DISPLAY "
|
|
576
|
+
.byte 0
|
|
577
|
+
tabletext: .text "TABLES "
|
|
578
|
+
.byte 0
|
|
579
|
+
bytestext: .text " BYTES"
|
|
580
|
+
.byte 0
|
|
581
|
+
restext: .text "RESULT "
|
|
582
|
+
.byte 0
|
|
583
|
+
|
|
584
|
+
shift: .byte 0
|
|
585
|
+
lead: .byte 0
|
|
586
|
+
chk0: .word 0
|
|
587
|
+
t_empty: .word 0
|
|
588
|
+
t_shift: .word 0
|
|
589
|
+
t_erase: .word 0
|
|
590
|
+
t_disp: .word 0
|
|
591
|
+
t_shifts: .fill 16, 0
|
|
592
|
+
|
|
593
|
+
.align $100
|
|
594
|
+
tables:
|
|
595
|
+
dataA: ShiftTable(ringData, 0) // data: vacated bits clear
|
|
596
|
+
maskA: ShiftTable(ringMask, 1) // mask: vacated bits transparent
|
|
597
|
+
dataB: ShiftTable(diaData, 0)
|
|
598
|
+
maskB: ShiftTable(diaMask, 1)
|
|
599
|
+
tables_end:
|
|
600
|
+
|
|
601
|
+
.print "blit bytes " + (blitb - blita)
|
|
602
|
+
.print "erase bytes " + (eraseb - erasea)
|
|
603
|
+
.print "tables bytes " + (tables_end - tables)
|
|
604
|
+
.print "end " + toHexString(tables_end)
|
|
605
|
+
```
|
|
606
|
+
|
|
607
|
+
## Build
|
|
608
|
+
|
|
609
|
+
```bash
|
|
610
|
+
java -jar $KICKASS_JAR software-sprite-preshifted.asm -o software-sprite-preshifted.prg
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
The assembler prints `blit bytes 1009`, `erase bytes 295` and
|
|
614
|
+
`tables bytes 2688`. The PRG loads at $0801 and ends at $247F; the font
|
|
615
|
+
copy sits at $3000-$37FF.
|
|
616
|
+
|
|
617
|
+
## Expected output
|
|
618
|
+
|
|
619
|
+
Screen rows 2 to 5, columns 12 to 27, show the canvas: diagonal stripes
|
|
620
|
+
with a white ring and a white-edged diamond moving across it, the
|
|
621
|
+
diamond drawn over the ring where they overlap. Rows 8 to 19 read:
|
|
622
|
+
|
|
623
|
+
```text
|
|
624
|
+
SHIFT 0 1428
|
|
625
|
+
SHIFT 1 1428
|
|
626
|
+
SHIFT 2 1428
|
|
627
|
+
SHIFT 3 1428
|
|
628
|
+
SHIFT 4 1428
|
|
629
|
+
SHIFT 5 1428
|
|
630
|
+
SHIFT 6 1428
|
|
631
|
+
SHIFT 7 1428
|
|
632
|
+
ERASE 462
|
|
633
|
+
DISPLAY 1557
|
|
634
|
+
TABLES 2688 BYTES
|
|
635
|
+
RESULT 01
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
Each `SHIFT` figure is the cycles of one masked blit of the ring at that
|
|
639
|
+
pixel offset, display blanked, less the cycles of an empty timed call
|
|
640
|
+
(the `JSR`, the `RTS` and the two instructions that stop the timer; 18
|
|
641
|
+
by arithmetic from the instruction table, the value itself is not
|
|
642
|
+
printed). `ERASE` is the tile restore over the same footprint. `DISPLAY` is
|
|
643
|
+
the shift-3 blit started at raster line 100 with the display on: 1,557
|
|
644
|
+
on PAL and on NTSC, the difference from 1,428 being the three badlines
|
|
645
|
+
the blit crosses. `TABLES` is the size of the four pre-shift
|
|
646
|
+
tables, two objects' data and mask. `RESULT 01` and a green border say
|
|
647
|
+
that at every shift the drawn canvas differed from the background and
|
|
648
|
+
the erased canvas equalled it; `02` and a red border say one did not.
|
|
649
|
+
|
|
650
|
+
Pinned run, 4,160,000 cycles, both models:
|
|
651
|
+
`screenshots/software-sprite-preshifted.png` and
|
|
652
|
+
`screenshots/software-sprite-preshifted-ntsc.png`, each identical over
|
|
653
|
+
two runs. Positions measured with PIL from the ring's top row (a six
|
|
654
|
+
pixel run at canvas row 3; the stripe pixel at x = 48 on that row
|
|
655
|
+
resolves which side of the run it joins): the ring's left edge is at
|
|
656
|
+
canvas x = 38 on PAL and 40 on NTSC, so the diamond, which starts at
|
|
657
|
+
x = 96 and moves the other way, is at 58 and 56. The two overlap by four
|
|
658
|
+
pixels on PAL and eight on NTSC, and the diamond's blank interior cuts
|
|
659
|
+
the ring where it covers it. The NTSC run is two frames further on; the
|
|
660
|
+
start-up path differs by model and the offset is not analysed here.
|
|
661
|
+
|
|
662
|
+
## Why this works
|
|
663
|
+
|
|
664
|
+
**The canvas.** The screen cells hold codes 192 to 255 of a font copied
|
|
665
|
+
from ROM to $3000, so cell `(cx, cy)` of the canvas is code
|
|
666
|
+
`192 + cy * 16 + cx` and pixel row `y` of cell column `cx` is byte
|
|
667
|
+
`$3600 + (y / 8) * 128 + cx * 8 + (y & 7)`. A pixel row across the
|
|
668
|
+
canvas is one byte per cell, eight apart, and a horizontal move by one
|
|
669
|
+
cell is a change of 8 in the X register. The 24 pixel object needs four
|
|
670
|
+
cells once it is shifted, and `XMAX = 96` keeps the fourth cell inside
|
|
671
|
+
the 16 cell row. Each character row of the canvas is 128 bytes and
|
|
672
|
+
starts on a half page, so no `abs,x` store crosses a page.
|
|
673
|
+
|
|
674
|
+
**The tables.** For each of the 84 byte positions (21 rows by 4 cells)
|
|
675
|
+
the eight shifts are stored together, so the unrolled `and` and `ora`
|
|
676
|
+
name a constant position and take the shift from Y. The tables are
|
|
677
|
+
page-aligned and each group of eight is aligned, so no `abs,y` read
|
|
678
|
+
crosses a page, and every byte of the blit costs 4 + 4 + 4 + 5 = 17
|
|
679
|
+
cycles: `84 * 17 = 1,428`, which is what the timer reads at every
|
|
680
|
+
shift. The mask's vacated bits are 1 and the data's are 0, so the
|
|
681
|
+
fourth byte at shift 0 leaves the background alone.
|
|
682
|
+
|
|
683
|
+
**The measurement.** CIA2 timer A counts phi2 from $FFFF and the count
|
|
684
|
+
is `$FFFF - TA` after the stop, with the carry set before the first
|
|
685
|
+
`SBC` because the timed routine returns with it in either state. The
|
|
686
|
+
eight blits and the erase run under `SEI` with DEN off, dropped a frame
|
|
687
|
+
early because the VIC samples DEN once, on line $30, so no badline
|
|
688
|
+
steals from the count. The `DISPLAY` figure is the same blit with DEN
|
|
689
|
+
on, started at line 100: it spans about 23 lines and crosses the
|
|
690
|
+
badlines at 107, 115 and 123, and the 129 extra cycles are three
|
|
691
|
+
badlines at 43, the same on both models.
|
|
692
|
+
|
|
693
|
+
**The frame loop.** The canvas occupies screen rows 2 to 5, raster lines
|
|
694
|
+
67 to 98, and the VIC fetches its font bytes on every one of those
|
|
695
|
+
lines. The loop waits for `$D012 = 128`, erases both objects at their
|
|
696
|
+
old x, steps them, and draws both; the work is about 3,780 cycles, 60
|
|
697
|
+
lines, done long before the canvas rows come round again. A canvas that
|
|
698
|
+
filled the screen would leave only the blank for this, and would need
|
|
699
|
+
two fonts and a `$D018` flip (`screen_double_buffer_d018` applied to the
|
|
700
|
+
font bits). The erase comes before either draw so that neither erase
|
|
701
|
+
wipes the other object's fresh pixels; the draws go ring then diamond,
|
|
702
|
+
so the diamond is on top.
|
|
703
|
+
|
|
704
|
+
**Interrupts.** The KERNAL's screen `CHROUT` returns with interrupts
|
|
705
|
+
enabled for every character it writes, not only on a clear or a scroll:
|
|
706
|
+
the screen editor's common exit ends `CLC`, `CLI`, `RTS`, the `CLI` at
|
|
707
|
+
$E6B4 in the 901227-03 KERNAL (read from the ROM image), and in VICE the
|
|
708
|
+
I flag was clear after `CHROUT` with a plain `A` and after $93 (measured
|
|
709
|
+
by storing the status register to the screen). An earlier draft cleared
|
|
710
|
+
the screen before copying the font with I/O banked out under `$01 = $33`,
|
|
711
|
+
and the CIA IRQ that then fired could not be acknowledged, so the
|
|
712
|
+
machine sat in the KERNAL handler for ever. The listing routes every
|
|
713
|
+
print through `out`, which does `SEI` again, and clears the screen only
|
|
714
|
+
after the copy and the timed runs. That is the mechanism of the
|
|
715
|
+
`kernal_assumes_sei_cleared` pitfall, reached through a routine its
|
|
716
|
+
entry does not list; the harness meets it, the blit itself calls no
|
|
717
|
+
KERNAL routine.
|
|
718
|
+
|
|
719
|
+
## What this recipe does not show
|
|
720
|
+
|
|
721
|
+
A save-under erase for a background that is not a tile, a bitmap-mode
|
|
722
|
+
destination, vertical movement (the row is baked into the unrolled
|
|
723
|
+
addresses, so a moving row needs a routine per row or a slower indexed
|
|
724
|
+
one), and the run-time shifting draw this technique replaces, so there
|
|
725
|
+
is no measured figure here for what pre-shifting saves.
|