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,576 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: dot-flag
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [dot_flag_sine_plotter, hires_plot, standard_bitmap]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D012, D016, D018, D020, D021, DC04, DC05, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — A dot flag: 128 dots on two sines, plotted and erased every frame in a hires bitmap, timed
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Puts a standard bitmap at `$2000` with screen RAM at `$0400` set to white
|
|
19
|
+
ink on black paper, and every frame plots a 16 by 8 grid of dots whose x
|
|
20
|
+
follows one sine and whose y another, so the grid ripples like a flag.
|
|
21
|
+
Each dot is set through the row address table and mask table of
|
|
22
|
+
`hires_plot`, and the 128 bitmap addresses and inverted masks are saved
|
|
23
|
+
as they are plotted so the next frame can erase the grid with 128 `AND`s
|
|
24
|
+
before it plots again. The time variable advances by 2 a frame for 300
|
|
25
|
+
frames, then the program stops drawing and spins, so the picture is
|
|
26
|
+
static for the exit screenshot. Every frame's erase-plus-plot cost is
|
|
27
|
+
measured with CIA1 timer A and stored, two bytes a frame, from `$1000`;
|
|
28
|
+
frame 0 runs with the display blanked so its figure is the CPU's alone.
|
|
29
|
+
Built with `-define NOERASE` the erase pass is left out and the dots
|
|
30
|
+
leave trails, which is the control for the erase list. The technique is
|
|
31
|
+
`dot_flag_sine_plotter` in `techniques/effects-vector-3d.md`.
|
|
32
|
+
|
|
33
|
+
## Source
|
|
34
|
+
|
|
35
|
+
```asm
|
|
36
|
+
// dot-flag.asm
|
|
37
|
+
// A 16 by 8 grid of dots whose x follows one sine and whose y follows
|
|
38
|
+
// another, plotted every frame into a hires bitmap at $2000 through a row
|
|
39
|
+
// address table and a mask table, erased the next frame from a saved list
|
|
40
|
+
// of 128 bitmap addresses and inverted masks. Column i shares one x, so x
|
|
41
|
+
// is worked out sixteen times a frame and y one hundred and twenty-eight
|
|
42
|
+
// times. t advances by 2 a frame for 300 frames, then the program stops
|
|
43
|
+
// drawing and spins, so the picture is static for the exit screenshot.
|
|
44
|
+
// Each frame's erase-plus-plot cost is CIA1-timed and stored, two bytes a
|
|
45
|
+
// frame, at $1000; frame 0 runs with the display blanked (DEN clear) so its
|
|
46
|
+
// figure is the CPU's alone, the rest run with the display on.
|
|
47
|
+
// Build with -define NOERASE for the control that never erases.
|
|
48
|
+
|
|
49
|
+
.const BITMAP = $2000
|
|
50
|
+
.const SCREEN = $0400
|
|
51
|
+
.const FRAMES = 300
|
|
52
|
+
.const TIMES = $1000 // FRAMES 16-bit CIA counts, overhead removed
|
|
53
|
+
.const REC_OVER = $02f0 // timer overhead of an empty measurement
|
|
54
|
+
.const REC_FRAME = $02f2 // frames completed
|
|
55
|
+
.const REC_DONE = $02ff // $01 when the 300 frames are drawn
|
|
56
|
+
|
|
57
|
+
// zero page: BASIC's numeric work area, free because the program never
|
|
58
|
+
// returns to BASIC
|
|
59
|
+
.const ptr = $57 // bitmap byte pointer
|
|
60
|
+
.const t = $59 // time, advances by 2 a frame
|
|
61
|
+
.const phx = $5a // x phase of the current column: t + 12 * i
|
|
62
|
+
.const phy0 = $5b // y phase base of the current column: 2 * t + 6 * i
|
|
63
|
+
.const c8lo = $5c // column * 8, low byte, for the current column
|
|
64
|
+
.const c8hi = $5d // column * 8, high byte (0 or 1)
|
|
65
|
+
.const m = $5e // mask of the current column's pixel
|
|
66
|
+
.const minv = $5f // its inverse, for the erase list
|
|
67
|
+
.const ci = $60 // columns left
|
|
68
|
+
.const xl = $61 // x, 16-bit
|
|
69
|
+
.const xh = $62
|
|
70
|
+
.const t_lo = $63 // timer read scratch
|
|
71
|
+
.const t_hi = $64
|
|
72
|
+
.const tp = $65 // pointer into TIMES
|
|
73
|
+
|
|
74
|
+
BasicUpstart2(start)
|
|
75
|
+
|
|
76
|
+
* = $0900 "code"
|
|
77
|
+
|
|
78
|
+
start:
|
|
79
|
+
sei
|
|
80
|
+
lda #$00
|
|
81
|
+
sta $d020
|
|
82
|
+
sta $d021
|
|
83
|
+
sta t
|
|
84
|
+
sta REC_FRAME
|
|
85
|
+
sta REC_FRAME + 1
|
|
86
|
+
lda #<TIMES
|
|
87
|
+
sta tp
|
|
88
|
+
lda #>TIMES
|
|
89
|
+
sta tp + 1
|
|
90
|
+
|
|
91
|
+
// screen RAM: every cell white ink on black paper
|
|
92
|
+
lda #$10
|
|
93
|
+
ldx #0
|
|
94
|
+
fill_screen:
|
|
95
|
+
sta SCREEN,x
|
|
96
|
+
sta SCREEN + $100,x
|
|
97
|
+
sta SCREEN + $200,x
|
|
98
|
+
sta SCREEN + $2e8,x
|
|
99
|
+
inx
|
|
100
|
+
bne fill_screen
|
|
101
|
+
|
|
102
|
+
// clear the bitmap, $2000 to $3FFF
|
|
103
|
+
lda #<BITMAP
|
|
104
|
+
sta ptr
|
|
105
|
+
lda #>BITMAP
|
|
106
|
+
sta ptr + 1
|
|
107
|
+
lda #0
|
|
108
|
+
tay
|
|
109
|
+
ldx #32
|
|
110
|
+
clear_page:
|
|
111
|
+
sta (ptr),y
|
|
112
|
+
iny
|
|
113
|
+
bne clear_page
|
|
114
|
+
inc ptr + 1
|
|
115
|
+
dex
|
|
116
|
+
bne clear_page
|
|
117
|
+
|
|
118
|
+
// the erase list before the first frame: 128 harmless entries, the first
|
|
119
|
+
// bitmap byte with an all-ones mask, so frame 0's erase costs what every
|
|
120
|
+
// other erase costs and changes nothing
|
|
121
|
+
lda #<BITMAP
|
|
122
|
+
ldx #0
|
|
123
|
+
init_list:
|
|
124
|
+
sta list_lo,x
|
|
125
|
+
inx
|
|
126
|
+
bpl init_list
|
|
127
|
+
lda #>BITMAP
|
|
128
|
+
ldx #0
|
|
129
|
+
!: sta list_hi,x
|
|
130
|
+
inx
|
|
131
|
+
bpl !-
|
|
132
|
+
lda #$ff
|
|
133
|
+
ldx #0
|
|
134
|
+
!: sta list_inv,x
|
|
135
|
+
inx
|
|
136
|
+
bpl !-
|
|
137
|
+
|
|
138
|
+
// VIC: screen at $0400, bitmap at $2000, hires, bitmap mode on with the
|
|
139
|
+
// display blanked (DEN clear) for frame 0. DEN is sampled once a frame on
|
|
140
|
+
// line $30, so two sightings of line 64 pass before the timed frame.
|
|
141
|
+
lda #$18
|
|
142
|
+
sta $d018
|
|
143
|
+
lda #$08
|
|
144
|
+
sta $d016
|
|
145
|
+
lda #$2b
|
|
146
|
+
sta $d011
|
|
147
|
+
jsr wait_line_64
|
|
148
|
+
jsr wait_line_64
|
|
149
|
+
|
|
150
|
+
// the empty measurement
|
|
151
|
+
jsr timer_start
|
|
152
|
+
jsr timer_read
|
|
153
|
+
lda t_lo
|
|
154
|
+
sta REC_OVER
|
|
155
|
+
lda t_hi
|
|
156
|
+
sta REC_OVER + 1
|
|
157
|
+
|
|
158
|
+
// --- the frame loop ---------------------------------------------------------
|
|
159
|
+
frame:
|
|
160
|
+
jsr wait_line_250
|
|
161
|
+
jsr timer_start
|
|
162
|
+
#if !NOERASE
|
|
163
|
+
jsr erase
|
|
164
|
+
#endif
|
|
165
|
+
jsr draw
|
|
166
|
+
jsr timer_read
|
|
167
|
+
lda t_lo
|
|
168
|
+
sec
|
|
169
|
+
sbc REC_OVER
|
|
170
|
+
ldy #0
|
|
171
|
+
sta (tp),y
|
|
172
|
+
lda t_hi
|
|
173
|
+
sbc REC_OVER + 1
|
|
174
|
+
iny
|
|
175
|
+
sta (tp),y
|
|
176
|
+
lda tp
|
|
177
|
+
clc
|
|
178
|
+
adc #2
|
|
179
|
+
sta tp
|
|
180
|
+
bcc !+
|
|
181
|
+
inc tp + 1
|
|
182
|
+
!: lda #$3b // display on from frame 1
|
|
183
|
+
sta $d011
|
|
184
|
+
lda t
|
|
185
|
+
clc
|
|
186
|
+
adc #2
|
|
187
|
+
sta t
|
|
188
|
+
inc REC_FRAME
|
|
189
|
+
bne !+
|
|
190
|
+
inc REC_FRAME + 1
|
|
191
|
+
!: lda REC_FRAME
|
|
192
|
+
cmp #<FRAMES
|
|
193
|
+
bne frame
|
|
194
|
+
lda REC_FRAME + 1
|
|
195
|
+
cmp #>FRAMES
|
|
196
|
+
bne frame
|
|
197
|
+
lda #$01
|
|
198
|
+
sta REC_DONE
|
|
199
|
+
halt:
|
|
200
|
+
jmp halt
|
|
201
|
+
|
|
202
|
+
// --- erase: AND every listed byte with its saved inverted mask ------------
|
|
203
|
+
erase:
|
|
204
|
+
ldy #0
|
|
205
|
+
ldx #0
|
|
206
|
+
erase_loop:
|
|
207
|
+
lda list_lo,x
|
|
208
|
+
sta ptr
|
|
209
|
+
lda list_hi,x
|
|
210
|
+
sta ptr + 1
|
|
211
|
+
lda (ptr),y
|
|
212
|
+
and list_inv,x
|
|
213
|
+
sta (ptr),y
|
|
214
|
+
inx
|
|
215
|
+
bpl erase_loop
|
|
216
|
+
rts
|
|
217
|
+
|
|
218
|
+
// --- draw: compute and plot the 128 dots, saving each in the list ---------
|
|
219
|
+
// Column i (0 to 15) has x = 160 + sinx[t + 12 * i]; its eight dots j have
|
|
220
|
+
// y = 100 + siny[2 * t + 24 * j + 6 * i]. x is 60 to 260 and y 40 to 160,
|
|
221
|
+
// so nothing needs clipping.
|
|
222
|
+
draw:
|
|
223
|
+
lda t
|
|
224
|
+
sta phx
|
|
225
|
+
asl
|
|
226
|
+
sta phy0
|
|
227
|
+
lda #16
|
|
228
|
+
sta ci
|
|
229
|
+
ldx #0 // list index, 0 to 127
|
|
230
|
+
column:
|
|
231
|
+
// x, in 16 bits because it reaches 260
|
|
232
|
+
ldy phx
|
|
233
|
+
lda sinx,y
|
|
234
|
+
ldy #0
|
|
235
|
+
cmp #$80 // ldy has just set the flags, so test A again
|
|
236
|
+
bcc !+
|
|
237
|
+
dey // sign extend: high byte $FF
|
|
238
|
+
!: clc
|
|
239
|
+
adc #160
|
|
240
|
+
sta xl
|
|
241
|
+
tya
|
|
242
|
+
adc #0
|
|
243
|
+
sta xh
|
|
244
|
+
// the pixel's mask and its inverse, from x & 7
|
|
245
|
+
lda xl
|
|
246
|
+
and #$07
|
|
247
|
+
tay
|
|
248
|
+
lda mask,y
|
|
249
|
+
sta m
|
|
250
|
+
lda maskinv,y
|
|
251
|
+
sta minv
|
|
252
|
+
// the column's byte offset in a row: (x >> 3) * 8, from the 40-entry table
|
|
253
|
+
lsr xh
|
|
254
|
+
lda xl
|
|
255
|
+
ror
|
|
256
|
+
lsr
|
|
257
|
+
lsr
|
|
258
|
+
tay
|
|
259
|
+
lda col8_lo,y
|
|
260
|
+
sta c8lo
|
|
261
|
+
lda col8_hi,y
|
|
262
|
+
sta c8hi
|
|
263
|
+
// the eight dots of the column, unrolled: siny is stored twice over so
|
|
264
|
+
// siny + 24 * j indexed by a full byte never runs off the table
|
|
265
|
+
.for (var j = 0; j < 8; j++) {
|
|
266
|
+
ldy phy0
|
|
267
|
+
lda siny + 24 * j,y
|
|
268
|
+
clc
|
|
269
|
+
adc #100
|
|
270
|
+
tay // y, 40 to 160
|
|
271
|
+
lda row_lo,y
|
|
272
|
+
clc
|
|
273
|
+
adc c8lo
|
|
274
|
+
sta ptr
|
|
275
|
+
sta list_lo,x
|
|
276
|
+
lda row_hi,y
|
|
277
|
+
adc c8hi
|
|
278
|
+
sta ptr + 1
|
|
279
|
+
sta list_hi,x
|
|
280
|
+
ldy #0
|
|
281
|
+
lda (ptr),y
|
|
282
|
+
ora m
|
|
283
|
+
sta (ptr),y
|
|
284
|
+
lda minv
|
|
285
|
+
sta list_inv,x
|
|
286
|
+
inx
|
|
287
|
+
}
|
|
288
|
+
// next column: x phase on by 12, y phase base by 6
|
|
289
|
+
lda phx
|
|
290
|
+
clc
|
|
291
|
+
adc #12
|
|
292
|
+
sta phx
|
|
293
|
+
lda phy0
|
|
294
|
+
clc
|
|
295
|
+
adc #6
|
|
296
|
+
sta phy0
|
|
297
|
+
dec ci
|
|
298
|
+
beq draw_done // the unrolled block puts column out of a branch's reach
|
|
299
|
+
jmp column
|
|
300
|
+
draw_done:
|
|
301
|
+
rts
|
|
302
|
+
|
|
303
|
+
// --- wait_line_250: return during raster line 250, after it was not 250 --
|
|
304
|
+
// Line 250 is the last line of the display window's last cell row; the
|
|
305
|
+
// erase runs in the blank that follows.
|
|
306
|
+
wait_line_250:
|
|
307
|
+
lda $d012
|
|
308
|
+
cmp #$fa
|
|
309
|
+
beq wait_line_250
|
|
310
|
+
wait_250:
|
|
311
|
+
lda $d011
|
|
312
|
+
bmi wait_250
|
|
313
|
+
lda $d012
|
|
314
|
+
cmp #$fa
|
|
315
|
+
bne wait_250
|
|
316
|
+
rts
|
|
317
|
+
|
|
318
|
+
// --- wait_line_64: return during raster line 64, after it was not 64 -----
|
|
319
|
+
wait_line_64:
|
|
320
|
+
lda $d012
|
|
321
|
+
cmp #$40
|
|
322
|
+
beq wait_line_64
|
|
323
|
+
wait_64:
|
|
324
|
+
lda $d011
|
|
325
|
+
bmi wait_64
|
|
326
|
+
lda $d012
|
|
327
|
+
cmp #$40
|
|
328
|
+
bne wait_64
|
|
329
|
+
rts
|
|
330
|
+
|
|
331
|
+
// --- CIA1 timer A, one-shot from $FFFF; the count is $FFFF - the read ----
|
|
332
|
+
timer_start:
|
|
333
|
+
lda #$00
|
|
334
|
+
sta $dc0e
|
|
335
|
+
lda #$ff
|
|
336
|
+
sta $dc04
|
|
337
|
+
sta $dc05
|
|
338
|
+
lda #$19 // force load, one-shot, start
|
|
339
|
+
sta $dc0e
|
|
340
|
+
rts
|
|
341
|
+
|
|
342
|
+
timer_read:
|
|
343
|
+
lda $dc05
|
|
344
|
+
sta t_hi
|
|
345
|
+
lda $dc04
|
|
346
|
+
sta t_lo
|
|
347
|
+
lda $dc05
|
|
348
|
+
cmp t_hi
|
|
349
|
+
bne timer_read
|
|
350
|
+
lda #$ff
|
|
351
|
+
sec
|
|
352
|
+
sbc t_lo
|
|
353
|
+
sta t_lo
|
|
354
|
+
lda #$ff
|
|
355
|
+
sbc t_hi
|
|
356
|
+
sta t_hi
|
|
357
|
+
rts
|
|
358
|
+
|
|
359
|
+
// --- tables -------------------------------------------------------------------
|
|
360
|
+
// Sines as signed bytes. Amplitudes 100 and 60 are below 128, so no entry
|
|
361
|
+
// reaches the byte's edge and nothing wraps (pitfalls/maths.md,
|
|
362
|
+
// sine_table_peak_wraps_to_zero, is about amplitude 128).
|
|
363
|
+
* = $1800 "tables"
|
|
364
|
+
sinx:
|
|
365
|
+
.fill 256, round(100 * sin(toRadians(i * 360 / 256)))
|
|
366
|
+
siny:
|
|
367
|
+
.fill 512, round(60 * sin(toRadians(mod(i, 256) * 360 / 256)))
|
|
368
|
+
// Row address table: the byte holding pixel (0, y) is
|
|
369
|
+
// BITMAP + (y / 8) * 320 + (y & 7). Each table sits inside one page.
|
|
370
|
+
row_lo:
|
|
371
|
+
.fill 200, <(BITMAP + floor(i / 8) * 320 + mod(i, 8))
|
|
372
|
+
.align $100
|
|
373
|
+
row_hi:
|
|
374
|
+
.fill 200, >(BITMAP + floor(i / 8) * 320 + mod(i, 8))
|
|
375
|
+
.align $100
|
|
376
|
+
mask:
|
|
377
|
+
.byte $80, $40, $20, $10, $08, $04, $02, $01
|
|
378
|
+
maskinv:
|
|
379
|
+
.byte $7f, $bf, $df, $ef, $f7, $fb, $fd, $fe
|
|
380
|
+
col8_lo:
|
|
381
|
+
.fill 40, <(i * 8)
|
|
382
|
+
col8_hi:
|
|
383
|
+
.fill 40, >(i * 8)
|
|
384
|
+
// the erase list: where last frame's 128 dots are and which bit each is
|
|
385
|
+
.align $100
|
|
386
|
+
list_lo:
|
|
387
|
+
.fill 128, 0
|
|
388
|
+
list_hi:
|
|
389
|
+
.fill 128, 0
|
|
390
|
+
list_inv:
|
|
391
|
+
.fill 128, 0
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
## Build
|
|
395
|
+
|
|
396
|
+
```bash
|
|
397
|
+
java -jar KickAss.jar dot-flag.asm -o dot-flag.prg
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
For the control without the erase pass:
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
java -jar KickAss.jar dot-flag.asm -define NOERASE -o dot-flag-noerase.prg
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## Expected output
|
|
407
|
+
|
|
408
|
+
A black screen with 128 white single pixels in a 16 by 8 grid that has
|
|
409
|
+
been bent twice: the columns lean left and right along one sine, and the
|
|
410
|
+
rows rise and fall along another that also runs across the columns, so
|
|
411
|
+
the whole grid reads as a flag rippling in a wind. After 300 frames the
|
|
412
|
+
program stops drawing and the picture holds still.
|
|
413
|
+
|
|
414
|
+
Measured in VICE x64sc 3.10 with the pinned command at 12,000,000 cycles,
|
|
415
|
+
`$02FF` read `01` and `$02F2` read 300 (frames done) on both models, so
|
|
416
|
+
the picture is static at the pin; the pictures are byte-identical across
|
|
417
|
+
two runs on each model (PAL MD5 `d322ed7f…`, NTSC `f8a1c4b7…`). Counting
|
|
418
|
+
non-black pixels inside the display window of the PAL picture (PNG
|
|
419
|
+
x 32 to 351, y 35 to 234) with PIL gives 128, the whole grid, spanning
|
|
420
|
+
bitmap x 60 to 246 and y 40 to 160 at that frame; the NTSC picture gives
|
|
421
|
+
the same 128 at the same places, because t is a frame count and both
|
|
422
|
+
runs finished the same 300 frames. The x range is 60 to 260 over the
|
|
423
|
+
whole run (the mid-motion picture below reaches 260); the pinned frame
|
|
424
|
+
does not happen to hold a dot at the right-hand peak.
|
|
425
|
+
|
|
426
|
+
Screenshots from the VICE runs this page describes:
|
|
427
|
+
`screenshots/dot-flag.png` (PAL) and `screenshots/dot-flag-ntsc.png`.
|
|
428
|
+
|
|
429
|
+
Two further pictures, not pinned, made with the same command and other
|
|
430
|
+
cycle counts, live under `docs/figures/`:
|
|
431
|
+
|
|
432
|
+
- `figures/dot-flag-mid-5000000.png`: PAL, `-limitcycles 5000000`, while
|
|
433
|
+
the flag is still moving. It shows the shape, and it shows 91 lit
|
|
434
|
+
pixels, not 128. The exit screenshot is the draw buffer at the moment
|
|
435
|
+
the limit hits, and at that moment the frame's plot pass had not
|
|
436
|
+
finished: dots in rows the beam had already passed, erased in the blank
|
|
437
|
+
and not yet replotted, are missing from the picture, which is the
|
|
438
|
+
flicker a real display would show at the same instant (see "Where the
|
|
439
|
+
work runs" below).
|
|
440
|
+
- `figures/dot-flag-no-erase-12000000.png`: PAL, the `NOERASE` build at
|
|
441
|
+
the pinned cycle count. 3,570 lit pixels: the union of the 300 frames'
|
|
442
|
+
128 positions, with every position a dot ever visited still lit. That
|
|
443
|
+
is the trail the erase list removes.
|
|
444
|
+
|
|
445
|
+
The timer figures, read from the running machine with a `-moncommands`
|
|
446
|
+
file that traces the store to `$02FF` and dumps `$02F0`-`$02FF` and
|
|
447
|
+
`$1000`-`$1257`, overhead of an empty measurement (20 cycles) removed:
|
|
448
|
+
|
|
449
|
+
| | PAL | NTSC |
|
|
450
|
+
|---|---|---|
|
|
451
|
+
| Frame 0, display blanked (erase + plot) | 15,233 | 15,233 |
|
|
452
|
+
| Frames 1 to 299, display on, least | 16,005 | 16,261 |
|
|
453
|
+
| Frames 1 to 299, display on, most | 16,098 | 16,356 |
|
|
454
|
+
| Frames 1 to 299, display on, mean | 16,049 | 16,307 |
|
|
455
|
+
| Frame 0, blanked, `NOERASE` build (plot only) | 10,866 | not measured here |
|
|
456
|
+
|
|
457
|
+
The blanked frame is the same on both models because the CPU's work is
|
|
458
|
+
the same; the display-on frames differ because the plot pass runs while
|
|
459
|
+
the VIC is fetching, and the badlines it crosses stall the CPU under the
|
|
460
|
+
timer's count (the timer keeps counting while the CPU is stalled). The
|
|
461
|
+
frame-to-frame spread of about 90 cycles comes from the sign branch in
|
|
462
|
+
the sixteen x computations and from where each frame's plot pass falls
|
|
463
|
+
against the badlines.
|
|
464
|
+
|
|
465
|
+
## Why this works
|
|
466
|
+
|
|
467
|
+
### The tables
|
|
468
|
+
|
|
469
|
+
`sinx` is 256 signed bytes of `round(100 * sin)` and `siny` is
|
|
470
|
+
`round(60 * sin)`, stored twice over (512 bytes) so that `siny + 24 * j`
|
|
471
|
+
indexed by a whole byte never reads past the table. Both amplitudes are
|
|
472
|
+
below 128, so no entry can reach the edge of the byte and nothing wraps:
|
|
473
|
+
`sine_table_peak_wraps_to_zero` in `pitfalls/maths.md` is about an
|
|
474
|
+
unsigned table of amplitude 128 about 128, whose peak is 256 and comes
|
|
475
|
+
out as 0 from `.fill`; a signed table of amplitude 100 peaks at 100 and
|
|
476
|
+
troughs at -100, both representable. The row table and the mask table are
|
|
477
|
+
the ones `hires_plot` describes (`techniques/bitmap-modes.md`): `row_lo`
|
|
478
|
+
and `row_hi` hold the address of pixel (0, y) for y from 0 to 199, each
|
|
479
|
+
in its own page so the indexed reads never pay the page-crossing cycle,
|
|
480
|
+
and `mask` holds `$80` down to `$01` for x & 7. `maskinv` is the same
|
|
481
|
+
eight bytes inverted, saved with each dot for the erase. `col8_lo` and
|
|
482
|
+
`col8_hi` hold `column * 8` for the forty columns, which is the byte
|
|
483
|
+
offset of a column's cell within a row; the high byte is 1 from column
|
|
484
|
+
32 on, so the column offset is added to the row address in 16 bits.
|
|
485
|
+
|
|
486
|
+
### The two sines and the frame order
|
|
487
|
+
|
|
488
|
+
Dot (i, j), with i the column from 0 to 15 and j the row from 0 to 7, is
|
|
489
|
+
at `x = 160 + sinx[(t + 12 * i) & 255]` and
|
|
490
|
+
`y = 100 + siny[(2 * t + 24 * j + 6 * i) & 255]`. x depends on i alone,
|
|
491
|
+
so the listing works it out once per column: the sine byte is sign
|
|
492
|
+
extended to 16 bits (a `cmp #$80` after the `ldy #0`, because `ldy` has
|
|
493
|
+
just overwritten the flags the `lda` set; the first build used `bpl`
|
|
494
|
+
there and every negative x came out 256 too far right), 160 is added,
|
|
495
|
+
the mask pair is looked up from the low three bits, and the 16-bit value
|
|
496
|
+
is shifted right three times for the column. The eight dots of the column
|
|
497
|
+
are then unrolled with `.for`, each one a `siny` lookup, an add of 100, a
|
|
498
|
+
row lookup, the column offset added in, the plot, and three stores into
|
|
499
|
+
the erase list. With amplitudes 100 and 60, x lies in 60 to 260 and y in
|
|
500
|
+
40 to 160 (arithmetic), so there is no clipping code.
|
|
501
|
+
|
|
502
|
+
The frame is: wait for raster line 250, start the timer, erase last
|
|
503
|
+
frame's 128 dots from the list, plot this frame's 128 and overwrite the
|
|
504
|
+
list, read the timer, then advance t by 2. Erasing before plotting means
|
|
505
|
+
a dot that lands where another dot was last frame is not wiped by that
|
|
506
|
+
dot's erase, and two dots that share a pixel this frame are erased
|
|
507
|
+
cleanly next frame because both entries `AND` the same bit off.
|
|
508
|
+
|
|
509
|
+
### Where the work runs
|
|
510
|
+
|
|
511
|
+
The blank after line 250 is 107 lines on PAL, about 6,700 cycles
|
|
512
|
+
(`full_field_redraw_exceeds_vblank` in `pitfalls/text-mode-render.md`
|
|
513
|
+
does the arithmetic). The erase costs 15,233 minus 10,866, which is
|
|
514
|
+
4,367 cycles (arithmetic from the two blanked figures), about 69 lines,
|
|
515
|
+
so it finishes inside the blank and no dot is ever seen half erased. The
|
|
516
|
+
plot costs 10,866 cycles, about 172 lines, and runs from about line 7 to
|
|
517
|
+
about line 180, while the beam is in the display window from line 51 and
|
|
518
|
+
crosses the dots' rows (raster lines 90 to 210) from line 90. The columns
|
|
519
|
+
are plotted in order, so when the beam reaches a row the left-hand
|
|
520
|
+
columns are already there and the right-hand ones are not yet; those
|
|
521
|
+
dots are absent from that field and present from the next, which a
|
|
522
|
+
viewer sees as flicker on the right of the picture and the mid-motion
|
|
523
|
+
figure shows as 91 lit pixels of 128. A build that wanted the picture
|
|
524
|
+
whole every field would draw into a second bitmap and swap `$D018` in
|
|
525
|
+
the blank, at the price of a second 8,000-byte bitmap and a second
|
|
526
|
+
erase list; this listing does not, because the point of it is the plot
|
|
527
|
+
and the erase.
|
|
528
|
+
|
|
529
|
+
Both models finish a frame inside a frame: the worst display-on frame is
|
|
530
|
+
16,098 cycles on PAL against 19,656 a frame, and 16,356 on NTSC against
|
|
531
|
+
17,095 (263 lines of 65), so the loop is back at `wait_line_250` before
|
|
532
|
+
line 250 comes round again and t advances once per displayed frame
|
|
533
|
+
(arithmetic from the measured worst frames; the NTSC margin is about 700
|
|
534
|
+
cycles, some eleven lines). The 300 frames take 6 seconds of PAL machine
|
|
535
|
+
time and 5 of NTSC (arithmetic, at 50 and 60 frames a second), and
|
|
536
|
+
12,000,000 cycles is about 12 seconds, so both pinned runs were long
|
|
537
|
+
finished; `$02F2` reading 300 in both dumps says the same.
|
|
538
|
+
|
|
539
|
+
### What the timer measures
|
|
540
|
+
|
|
541
|
+
CIA1 timer A is loaded with `$FFFF` and started in one-shot mode
|
|
542
|
+
(`$DC0E = $19`); the count read back after the work, subtracted from
|
|
543
|
+
`$FFFF`, is the cycles elapsed, and the 20-cycle empty measurement taken
|
|
544
|
+
once at the start is subtracted from every frame before it is stored.
|
|
545
|
+
The timer counts machine cycles whether or not the CPU is running, so a
|
|
546
|
+
display-on frame includes the badline stalls the plot pass suffers, which
|
|
547
|
+
is why frame 0 was run with DEN clear: its 15,233 is what the code costs,
|
|
548
|
+
the display-on figures are what the frame costs. Per dot, 15,233 / 128
|
|
549
|
+
is 119.0 cycles for erase plus plot, and the two blanked figures split it
|
|
550
|
+
as 34.1 for the erase (4,367 / 128) and 84.9 for the plot (10,866 / 128,
|
|
551
|
+
which includes the sixteen per-column x computations and the loop
|
|
552
|
+
overhead). All three are arithmetic from the measured frames.
|
|
553
|
+
|
|
554
|
+
### Region
|
|
555
|
+
|
|
556
|
+
`region: both`. The mechanism is the same on NTSC; the animation runs 20 %
|
|
557
|
+
faster because t is a frame count, the display-on frame costs about 260
|
|
558
|
+
cycles more because the plot pass crosses more badlines relative to where
|
|
559
|
+
it starts, and the frame still fits with about 700 cycles to spare. Both
|
|
560
|
+
pinned pictures hold the same 128 pixels.
|
|
561
|
+
|
|
562
|
+
### What it does not establish
|
|
563
|
+
|
|
564
|
+
**Real hardware.** Every figure on this page is from VICE x64sc 3.10; no
|
|
565
|
+
C64 was run.
|
|
566
|
+
|
|
567
|
+
**More than 128 dots.** The arithmetic on the technique page for how many
|
|
568
|
+
dots fit a frame is an extrapolation from this listing's per-dot figure;
|
|
569
|
+
no build with more dots was made or timed.
|
|
570
|
+
|
|
571
|
+
**Colour.** The bitmap is one ink on one paper. A coloured dot flag would
|
|
572
|
+
write screen RAM cells per dot or use multicolour bitmap mode, and
|
|
573
|
+
neither was built.
|
|
574
|
+
|
|
575
|
+
**The NTSC no-erase figure.** The `NOERASE` control was timed and
|
|
576
|
+
photographed on PAL only.
|