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,518 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: twister
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [twister, standard_bitmap, table_generation]
|
|
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 recipe: a twister, a turning square column drawn as 128 lines copied from 64 phase images, 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 redraws a 64 pixel wide, 128 line
|
|
20
|
+
band as a square column turning about its vertical axis. The column's
|
|
21
|
+
four edges come from one sine, its faces from four fixed bit patterns,
|
|
22
|
+
and both are evaluated at assembly time into 64 phase images of 8 bytes
|
|
23
|
+
each. The frame loop is then a copy: line L of the band takes phase
|
|
24
|
+
(t + L) & 63, which is a straight helix, and its 8 bytes go through a
|
|
25
|
+
zero page pointer into the bitmap row. t advances by 1 a frame for 300
|
|
26
|
+
frames, then the program stops drawing and spins, so the picture is
|
|
27
|
+
static for the exit screenshot. Every frame's copy cost is measured with
|
|
28
|
+
CIA1 timer A and stored, two bytes a frame, from `$1000`; frame 0 runs
|
|
29
|
+
with the display blanked so its figure is the CPU's alone. Built with
|
|
30
|
+
`-define STRAIGHT` every line takes phase t, which is the control: a
|
|
31
|
+
column that turns but does not twist. The technique is `twister` in
|
|
32
|
+
`techniques/effects-vector-3d.md`.
|
|
33
|
+
|
|
34
|
+
## Source
|
|
35
|
+
|
|
36
|
+
```asm
|
|
37
|
+
// twister.asm
|
|
38
|
+
// A square column seen side on, turning about its vertical axis, drawn as a
|
|
39
|
+
// 64 pixel wide band of a hires bitmap, 128 lines tall. At rotation angle a
|
|
40
|
+
// (0 to 255 for a full turn) the four vertical edges are at
|
|
41
|
+
// x_i = 160 + 32 * sin((a + 64 i) & 255), i = 0 to 3, and face i spans x_i to
|
|
42
|
+
// x_(i+1) when x_i < x_(i+1); at most two faces are in front. Each face has a
|
|
43
|
+
// fixed pattern: face 0 solid, face 1 fifty percent dither ($AA on every
|
|
44
|
+
// row), face 2 twenty-five percent ($88), face 3 empty. The 64 phase images
|
|
45
|
+
// for a = 0, 4, .. 252 are built at assembly time, 8 bytes each, 512 bytes.
|
|
46
|
+
// Every frame, line L of the band (0 to 127) takes phase (t + L) & 63, which
|
|
47
|
+
// is a straight helix, and its 8 bytes are copied from the phase image
|
|
48
|
+
// through a zero page pointer into bitmap row 36 + L, bytes 16 to 23. The
|
|
49
|
+
// copy is unrolled over the 128 lines. t advances by 1 a frame for 300
|
|
50
|
+
// frames, then the program stops drawing and spins, so the picture is static
|
|
51
|
+
// for the exit screenshot. Each frame's copy cost is CIA1-timed and stored,
|
|
52
|
+
// two bytes a frame, at $1000; frame 0 runs with the display blanked (DEN
|
|
53
|
+
// clear) so its figure is the CPU's alone.
|
|
54
|
+
// Build with -define STRAIGHT for the control in which every line takes
|
|
55
|
+
// phase t, a column that does not twist.
|
|
56
|
+
|
|
57
|
+
.const BITMAP = $2000
|
|
58
|
+
.const SCREEN = $0400
|
|
59
|
+
.const FRAMES = 300
|
|
60
|
+
.const TOP = 36 // first bitmap row of the band
|
|
61
|
+
.const LINES = 128
|
|
62
|
+
.const BAND_BYTE = 16 // first byte column of the band: x 128 to 191
|
|
63
|
+
.const TIMES = $1000 // FRAMES 16-bit CIA counts, overhead removed
|
|
64
|
+
.const REC_OVER = $02f0 // timer overhead of an empty measurement
|
|
65
|
+
.const REC_FRAME = $02f2 // frames completed
|
|
66
|
+
.const REC_DONE = $02ff // $01 when the 300 frames are drawn
|
|
67
|
+
|
|
68
|
+
// zero page: BASIC's numeric work area, free because the program never
|
|
69
|
+
// returns to BASIC
|
|
70
|
+
.const ptr = $57 // bitmap clear pointer
|
|
71
|
+
.const src = $59 // pointer into the phase table
|
|
72
|
+
.const t = $5b // time, advances by 1 a frame
|
|
73
|
+
.const t_lo = $5c // timer read scratch
|
|
74
|
+
.const t_hi = $5d
|
|
75
|
+
.const tp = $5e // pointer into TIMES
|
|
76
|
+
|
|
77
|
+
// --- the phase images, built in script -----------------------------------
|
|
78
|
+
// Face i's edge positions for angle a, then every pixel of the 64 wide band
|
|
79
|
+
// tested against the four faces and the face's pattern bit ORed in.
|
|
80
|
+
.var facepat = List().add($ff, $aa, $88, $00)
|
|
81
|
+
.var phases = List()
|
|
82
|
+
.for (var p = 0; p < 64; p++) {
|
|
83
|
+
.var a = p * 4
|
|
84
|
+
.var xe = List()
|
|
85
|
+
.for (var i = 0; i < 4; i++) {
|
|
86
|
+
.eval xe.add(160 + round(32 * sin(toRadians(mod(a + 64 * i, 256) * 360 / 256))))
|
|
87
|
+
}
|
|
88
|
+
.for (var b = 0; b < 8; b++) {
|
|
89
|
+
.var v = 0
|
|
90
|
+
.for (var bit = 0; bit < 8; bit++) {
|
|
91
|
+
.var x = 128 + b * 8 + bit
|
|
92
|
+
.var m = 128 >> bit
|
|
93
|
+
.for (var i = 0; i < 4; i++) {
|
|
94
|
+
.var x0 = xe.get(i)
|
|
95
|
+
.var x1 = xe.get(mod(i + 1, 4))
|
|
96
|
+
.if (x0 < x1 && x >= x0 && x < x1 && (facepat.get(i) & m) != 0) {
|
|
97
|
+
.eval v = v | m
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
.eval phases.add(v)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
BasicUpstart2(start)
|
|
106
|
+
|
|
107
|
+
* = $4000 "code"
|
|
108
|
+
|
|
109
|
+
start:
|
|
110
|
+
sei
|
|
111
|
+
lda #$00
|
|
112
|
+
sta $d020
|
|
113
|
+
sta $d021
|
|
114
|
+
sta t
|
|
115
|
+
sta REC_FRAME
|
|
116
|
+
sta REC_FRAME + 1
|
|
117
|
+
lda #<TIMES
|
|
118
|
+
sta tp
|
|
119
|
+
lda #>TIMES
|
|
120
|
+
sta tp + 1
|
|
121
|
+
|
|
122
|
+
// screen RAM: every cell white ink on black paper
|
|
123
|
+
lda #$10
|
|
124
|
+
ldx #0
|
|
125
|
+
fill_screen:
|
|
126
|
+
sta SCREEN,x
|
|
127
|
+
sta SCREEN + $100,x
|
|
128
|
+
sta SCREEN + $200,x
|
|
129
|
+
sta SCREEN + $2e8,x
|
|
130
|
+
inx
|
|
131
|
+
bne fill_screen
|
|
132
|
+
|
|
133
|
+
// clear the bitmap, $2000 to $3FFF
|
|
134
|
+
lda #<BITMAP
|
|
135
|
+
sta ptr
|
|
136
|
+
lda #>BITMAP
|
|
137
|
+
sta ptr + 1
|
|
138
|
+
lda #0
|
|
139
|
+
tay
|
|
140
|
+
ldx #32
|
|
141
|
+
clear_page:
|
|
142
|
+
sta (ptr),y
|
|
143
|
+
iny
|
|
144
|
+
bne clear_page
|
|
145
|
+
inc ptr + 1
|
|
146
|
+
dex
|
|
147
|
+
bne clear_page
|
|
148
|
+
|
|
149
|
+
// VIC: screen at $0400, bitmap at $2000, hires, bitmap mode on with the
|
|
150
|
+
// display blanked (DEN clear) for frame 0. DEN is sampled once a frame on
|
|
151
|
+
// line $30, so two sightings of line 64 pass before the timed frame.
|
|
152
|
+
lda #$18
|
|
153
|
+
sta $d018
|
|
154
|
+
lda #$08
|
|
155
|
+
sta $d016
|
|
156
|
+
lda #$2b
|
|
157
|
+
sta $d011
|
|
158
|
+
jsr wait_line_64
|
|
159
|
+
jsr wait_line_64
|
|
160
|
+
|
|
161
|
+
// the empty measurement
|
|
162
|
+
jsr timer_start
|
|
163
|
+
jsr timer_read
|
|
164
|
+
lda t_lo
|
|
165
|
+
sta REC_OVER
|
|
166
|
+
lda t_hi
|
|
167
|
+
sta REC_OVER + 1
|
|
168
|
+
|
|
169
|
+
// --- the frame loop ---------------------------------------------------------
|
|
170
|
+
frame:
|
|
171
|
+
jsr wait_line_250
|
|
172
|
+
jsr timer_start
|
|
173
|
+
jsr draw
|
|
174
|
+
jsr timer_read
|
|
175
|
+
lda t_lo
|
|
176
|
+
sec
|
|
177
|
+
sbc REC_OVER
|
|
178
|
+
ldy #0
|
|
179
|
+
sta (tp),y
|
|
180
|
+
lda t_hi
|
|
181
|
+
sbc REC_OVER + 1
|
|
182
|
+
iny
|
|
183
|
+
sta (tp),y
|
|
184
|
+
lda tp
|
|
185
|
+
clc
|
|
186
|
+
adc #2
|
|
187
|
+
sta tp
|
|
188
|
+
bcc !+
|
|
189
|
+
inc tp + 1
|
|
190
|
+
!: lda #$3b // display on from frame 1
|
|
191
|
+
sta $d011
|
|
192
|
+
inc t
|
|
193
|
+
inc REC_FRAME
|
|
194
|
+
bne !+
|
|
195
|
+
inc REC_FRAME + 1
|
|
196
|
+
!: lda REC_FRAME
|
|
197
|
+
cmp #<FRAMES
|
|
198
|
+
bne frame
|
|
199
|
+
lda REC_FRAME + 1
|
|
200
|
+
cmp #>FRAMES
|
|
201
|
+
bne frame
|
|
202
|
+
lda #$01
|
|
203
|
+
sta REC_DONE
|
|
204
|
+
halt:
|
|
205
|
+
jmp halt
|
|
206
|
+
|
|
207
|
+
// --- draw: copy 128 phase images into the band ------------------------------
|
|
208
|
+
// src starts at phase image (t & 63) and steps 8 bytes a line. The table is
|
|
209
|
+
// page aligned and two pages long, so a page crossing toggles the high byte
|
|
210
|
+
// between the two pages, which also wraps image 63 back to image 0.
|
|
211
|
+
draw:
|
|
212
|
+
lda t
|
|
213
|
+
and #$3f
|
|
214
|
+
asl
|
|
215
|
+
asl
|
|
216
|
+
asl // (t & 63) * 8, 0 to 248
|
|
217
|
+
sta src
|
|
218
|
+
lda t
|
|
219
|
+
and #$20 // bit 5 of t picks the page
|
|
220
|
+
beq !+
|
|
221
|
+
lda #1
|
|
222
|
+
!: clc
|
|
223
|
+
adc #>phase_table
|
|
224
|
+
sta src + 1
|
|
225
|
+
.for (var L = 0; L < LINES; L++) {
|
|
226
|
+
.var y = TOP + L
|
|
227
|
+
.var row = BITMAP + floor(y / 8) * 320 + mod(y, 8) + BAND_BYTE * 8
|
|
228
|
+
.for (var k = 0; k < 8; k++) {
|
|
229
|
+
ldy #k
|
|
230
|
+
lda (src),y
|
|
231
|
+
sta row + 8 * k
|
|
232
|
+
}
|
|
233
|
+
#if !STRAIGHT
|
|
234
|
+
lda src
|
|
235
|
+
clc
|
|
236
|
+
adc #8
|
|
237
|
+
sta src
|
|
238
|
+
bcc !+
|
|
239
|
+
lda src + 1
|
|
240
|
+
eor #$01
|
|
241
|
+
sta src + 1
|
|
242
|
+
!:
|
|
243
|
+
#endif
|
|
244
|
+
}
|
|
245
|
+
rts
|
|
246
|
+
|
|
247
|
+
// --- wait_line_250: return during raster line 250, after it was not 250 --
|
|
248
|
+
wait_line_250:
|
|
249
|
+
lda $d012
|
|
250
|
+
cmp #$fa
|
|
251
|
+
beq wait_line_250
|
|
252
|
+
wait_250:
|
|
253
|
+
lda $d011
|
|
254
|
+
bmi wait_250
|
|
255
|
+
lda $d012
|
|
256
|
+
cmp #$fa
|
|
257
|
+
bne wait_250
|
|
258
|
+
rts
|
|
259
|
+
|
|
260
|
+
// --- wait_line_64: return during raster line 64, after it was not 64 -----
|
|
261
|
+
wait_line_64:
|
|
262
|
+
lda $d012
|
|
263
|
+
cmp #$40
|
|
264
|
+
beq wait_line_64
|
|
265
|
+
wait_64:
|
|
266
|
+
lda $d011
|
|
267
|
+
bmi wait_64
|
|
268
|
+
lda $d012
|
|
269
|
+
cmp #$40
|
|
270
|
+
bne wait_64
|
|
271
|
+
rts
|
|
272
|
+
|
|
273
|
+
// --- CIA1 timer A, one-shot from $FFFF; the count is $FFFF - the read ----
|
|
274
|
+
timer_start:
|
|
275
|
+
lda #$00
|
|
276
|
+
sta $dc0e
|
|
277
|
+
lda #$ff
|
|
278
|
+
sta $dc04
|
|
279
|
+
sta $dc05
|
|
280
|
+
lda #$19 // force load, one-shot, start
|
|
281
|
+
sta $dc0e
|
|
282
|
+
rts
|
|
283
|
+
|
|
284
|
+
timer_read:
|
|
285
|
+
lda $dc05
|
|
286
|
+
sta t_hi
|
|
287
|
+
lda $dc04
|
|
288
|
+
sta t_lo
|
|
289
|
+
lda $dc05
|
|
290
|
+
cmp t_hi
|
|
291
|
+
bne timer_read
|
|
292
|
+
lda #$ff
|
|
293
|
+
sec
|
|
294
|
+
sbc t_lo
|
|
295
|
+
sta t_lo
|
|
296
|
+
lda #$ff
|
|
297
|
+
sbc t_hi
|
|
298
|
+
sta t_hi
|
|
299
|
+
rts
|
|
300
|
+
|
|
301
|
+
// --- the phase table: 64 images of 8 bytes, page aligned -----------------
|
|
302
|
+
* = $1800 "phase table"
|
|
303
|
+
phase_table:
|
|
304
|
+
.fill 512, phases.get(i)
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
## Build
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
java -jar KickAss.jar twister.asm -o twister.prg
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
For the control in which every line shares one phase:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
java -jar KickAss.jar twister.asm -define STRAIGHT -o twister-straight.prg
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
`-showmem` reports the code segment at `$4000` to `$64A6` (9,383 bytes,
|
|
320
|
+
almost all of it the unrolled copy) and the phase table at `$1800` to
|
|
321
|
+
`$19FF` (512 bytes). The `STRAIGHT` build's code ends at `$5D26`.
|
|
322
|
+
|
|
323
|
+
## Expected output
|
|
324
|
+
|
|
325
|
+
A black screen with a white column 64 pixels wide in the middle, from
|
|
326
|
+
bitmap row 36 to row 163. Two faces of it are visible at any height: a
|
|
327
|
+
solid face, a fifty percent dithered face, a face of every fourth pixel,
|
|
328
|
+
and an empty face take turns as the column turns, and because each line
|
|
329
|
+
is 1/64 of a turn further round than the line above, the faces wind down
|
|
330
|
+
the column as a helix and appear to rise as it turns. After 300 frames
|
|
331
|
+
the program stops drawing and the picture holds still.
|
|
332
|
+
|
|
333
|
+
Measured in VICE x64sc 3.10 with the pinned command at 12,000,000
|
|
334
|
+
cycles, `$02FF` read `01` and `$02F2` read 300 (frames done) on both
|
|
335
|
+
models, so the picture is static at the pin; the pictures are
|
|
336
|
+
byte-identical across two runs on each model (PAL MD5 `8a682c0f…`, NTSC
|
|
337
|
+
`e704abc1…`). In the PAL picture the lit pixels lie in PNG columns 160
|
|
338
|
+
to 223 and rows 71 to 198 (bitmap x 128 to 191, rows 36 to 163), 3,236
|
|
339
|
+
of them, with 59 distinct row patterns over the 128 lines. The NTSC
|
|
340
|
+
picture holds the same rows at PNG rows 59 to 186, because t is a frame
|
|
341
|
+
count and both runs finished the same 300 frames.
|
|
342
|
+
|
|
343
|
+
The last frame drawn used t = 299, so line L of the band shows phase
|
|
344
|
+
(299 + L) & 63. Three rows, measured with PIL against the edge table the
|
|
345
|
+
listing builds (`x_i = 160 + 32 sin`, rounded):
|
|
346
|
+
|
|
347
|
+
| Band line | Phase, angle | x0, x1, x2, x3 | Faces in front | First lit pixel | Last lit pixel |
|
|
348
|
+
|---|---|---|---|---|---|
|
|
349
|
+
| 0 | 43, a = 172 | 132, 145, 188, 175 | 0 (132 to 145), 1 (145 to 188) | 132 | 186 |
|
|
350
|
+
| 40 | 19, a = 76 | 191, 151, 129, 169 | 2 (129 to 169), 3 (169 to 191) | 132 | 168 |
|
|
351
|
+
| 100 | 15, a = 60 | 192, 163, 128, 157 | 2 (128 to 157), 3 (157 to 192) | 128 | 156 |
|
|
352
|
+
|
|
353
|
+
The first lit pixel is the left edge of the leftmost visible face where
|
|
354
|
+
that face is solid (line 0) and the first pixel of it that the pattern
|
|
355
|
+
lights where it is not: face 2 lights every pixel whose x is a multiple
|
|
356
|
+
of 4, so at line 40 the span from 129 is first lit at 132. The last lit
|
|
357
|
+
pixel is the last one the pattern lights below the exclusive right edge:
|
|
358
|
+
186 under 188 for the dither, 168 under 169 and 156 under 157 for every
|
|
359
|
+
fourth pixel. Face 3 is empty, so where it is in front the column ends
|
|
360
|
+
at face 2's right edge. The same three rows of the NTSC picture give the
|
|
361
|
+
same six numbers.
|
|
362
|
+
|
|
363
|
+
The `STRAIGHT` build at the same pin shows the phase 43 image on every
|
|
364
|
+
line: first lit 132, last lit 186 at lines 0, 40 and 100, and one
|
|
365
|
+
distinct row pattern over the 128 lines. That is the column at a = 172
|
|
366
|
+
without the helix, and it is the difference the per-line phase makes.
|
|
367
|
+
|
|
368
|
+
Screenshots from the VICE runs this page describes:
|
|
369
|
+
`screenshots/twister.png` (PAL) and `screenshots/twister-ntsc.png`.
|
|
370
|
+
|
|
371
|
+
Two further pictures, not pinned, made with the same command and other
|
|
372
|
+
inputs, live under `docs/figures/`:
|
|
373
|
+
|
|
374
|
+
- `figures/twister-mid-5000000.png`: PAL, `-limitcycles 5000000`, while
|
|
375
|
+
the column is still turning. 3,257 lit pixels in the same 128 rows,
|
|
376
|
+
the helix at another phase. Nothing is torn, for the reason given
|
|
377
|
+
under "Where the work runs".
|
|
378
|
+
- `figures/twister-straight-12000000.png`: PAL, the `STRAIGHT` build at
|
|
379
|
+
the pinned cycle count, the one-pattern column of the table above.
|
|
380
|
+
|
|
381
|
+
The timer figures, read from the running machine with a `-moncommands`
|
|
382
|
+
file that traces the store to `$02FF` and dumps `$02F0`-`$02FF` and
|
|
383
|
+
`$1000`-`$1257`, overhead of an empty measurement (20 cycles) removed:
|
|
384
|
+
|
|
385
|
+
| | PAL | NTSC |
|
|
386
|
+
|---|---|---|
|
|
387
|
+
| Frame 0, display blanked | 13,001 | 13,001 |
|
|
388
|
+
| Frames 1 to 299, display on, least | 13,557 | 13,813 |
|
|
389
|
+
| Frames 1 to 299, display on, most | 13,561 | 13,819 |
|
|
390
|
+
| Frames 1 to 299, display on, mean | 13,560 | 13,816 |
|
|
391
|
+
| Frame 0, blanked, `STRAIGHT` build | 11,305 | not measured here |
|
|
392
|
+
| Frames 1 to 299, `STRAIGHT`, least to most | 11,725 to 11,736 | not measured here |
|
|
393
|
+
|
|
394
|
+
Per line, 13,001 / 128 is 101.6 cycles blanked and 13,561 / 128 is 105.9
|
|
395
|
+
for the worst PAL frame with the display on (arithmetic from the
|
|
396
|
+
measured frames). The blanked frame is the same on both models because
|
|
397
|
+
the CPU's work is the same; the display-on frames differ because the
|
|
398
|
+
copy runs while the VIC is fetching and the badlines it crosses stall
|
|
399
|
+
the CPU under the timer's count.
|
|
400
|
+
|
|
401
|
+
## Why this works
|
|
402
|
+
|
|
403
|
+
### The phase images
|
|
404
|
+
|
|
405
|
+
The listing builds the images in KickAssembler script before any code
|
|
406
|
+
is emitted, with nested `.for` loops that fill a `List`, and one
|
|
407
|
+
`.fill 512, phases.get(i)` emits it. For phase p (angle a = 4p) the four
|
|
408
|
+
edges are `160 + round(32 * sin((a + 64 i) & 255 in turns))`; then for
|
|
409
|
+
each of the 64 pixels of the band, and each face i, if `x_i < x_(i+1)`
|
|
410
|
+
and the pixel lies in `[x_i, x_(i+1))` and the face's pattern byte has
|
|
411
|
+
the pixel's bit set, the bit is ORed into the image byte. The pattern
|
|
412
|
+
bytes are `$FF`, `$AA`, `$88` and `$00`: the fifty percent face uses
|
|
413
|
+
`$AA` on every row rather than alternating with `$55`, so its dither is
|
|
414
|
+
vertical stripes, not a checkerboard; that keeps the image a function of
|
|
415
|
+
the phase alone, which is what lets one 8-byte image serve any line.
|
|
416
|
+
|
|
417
|
+
A square seen side on has at most two faces towards the viewer, and the
|
|
418
|
+
test `x_i < x_(i+1)` is exactly that: a face whose right edge has
|
|
419
|
+
crossed to the left of its left edge is on the far side. The edges are
|
|
420
|
+
never stored as bytes, only compared in script, and the amplitude is 32
|
|
421
|
+
about 160, so the values run 128 to 192 and nothing is near a byte's
|
|
422
|
+
edge; `sine_table_peak_wraps_to_zero` in `pitfalls/maths.md` is about an
|
|
423
|
+
unsigned table of amplitude 128 about 128 whose peak is 256, and does
|
|
424
|
+
not arise here.
|
|
425
|
+
|
|
426
|
+
### The copy
|
|
427
|
+
|
|
428
|
+
The band is bitmap x 128 to 191, which is byte columns 16 to 23 of each
|
|
429
|
+
row, and bitmap rows 36 to 163. The byte holding pixel (0, y) is
|
|
430
|
+
`BITMAP + (y / 8) * 320 + (y & 7)`, and byte column c of that row is
|
|
431
|
+
`8 c` further on, so line L's eight destination addresses are constants
|
|
432
|
+
the assembler works out, and the copy is unrolled over the 128 lines:
|
|
433
|
+
per line, eight pairs of `ldy #k`, `lda (src),y`, `sta row + 8 k`, then
|
|
434
|
+
the pointer advance. The source pointer starts at image `t & 63`, which
|
|
435
|
+
is `phase_table + 8 (t & 63)`: the low byte is `(t & 63) << 3` and the
|
|
436
|
+
high byte is the table's page plus bit 5 of t, because the table is page
|
|
437
|
+
aligned and images 0 to 31 fill the first page, 32 to 63 the second.
|
|
438
|
+
Advancing by 8 with a carry into an `eor #1` on the high byte both steps
|
|
439
|
+
to the second page and wraps from image 63 back to image 0, which is the
|
|
440
|
+
`& 63` in `(t + L) & 63`; the `STRAIGHT` build leaves the advance out.
|
|
441
|
+
|
|
442
|
+
Per line that is 8 by (2 + 5 + 4) = 88 cycles for the copy and 13 for
|
|
443
|
+
the advance when the carry is clear, 20 when it is set (arithmetic from
|
|
444
|
+
the instruction table): 128 lines of 101 plus the setup is 12,960 before
|
|
445
|
+
the four or five page crossings, against the measured 13,001. The
|
|
446
|
+
`STRAIGHT` build measures 11,305, and the 1,696 between them is the 128
|
|
447
|
+
advances at 13.25 each. A version that kept the phase in X and read
|
|
448
|
+
eight 64-entry planes with `lda plane_k,x` would drop the per-line cost
|
|
449
|
+
to about 70 (arithmetic, not built here), at the price of a table laid
|
|
450
|
+
out by plane rather than by image.
|
|
451
|
+
|
|
452
|
+
### Where the work runs
|
|
453
|
+
|
|
454
|
+
The frame is: wait for raster line 250, start the timer, copy the 128
|
|
455
|
+
lines, read the timer, advance t. The blank after line 250 is about
|
|
456
|
+
6,700 cycles on PAL (`full_field_redraw_exceeds_vblank` in
|
|
457
|
+
`pitfalls/text-mode-render.md` does the arithmetic) and the copy is
|
|
458
|
+
13,001, so it runs on past the top of the next field. It does not tear,
|
|
459
|
+
because it stays ahead of the beam: from line 251 to the band's first
|
|
460
|
+
raster line (87 of the next field) is 148 lines, 9,324 cycles, in which
|
|
461
|
+
the copy has written about 92 of the 128 band lines; the beam then
|
|
462
|
+
covers a band line every 63 cycles and the copy one every 102, and the
|
|
463
|
+
beam would need 242 lines to catch up, more than the band has
|
|
464
|
+
(arithmetic from the measured per-line cost). The mid-motion picture at
|
|
465
|
+
5,000,000 cycles shows a whole helix. The margin is the band's height:
|
|
466
|
+
at this per-line cost a band of the full 200 rows from row 0 would have
|
|
467
|
+
about 69 lines written when the beam reached it and would be caught at
|
|
468
|
+
about line 183 (same arithmetic), and would want a second bitmap and a
|
|
469
|
+
`$D018` swap.
|
|
470
|
+
|
|
471
|
+
Both models finish a frame inside a frame: the worst display-on frame is
|
|
472
|
+
13,561 on PAL against 19,656 a frame, and 13,819 on NTSC against 17,095
|
|
473
|
+
(263 lines of 65), so the loop is back at `wait_line_250` before line 250
|
|
474
|
+
comes round again and t advances once per displayed frame. The 300
|
|
475
|
+
frames take 6 seconds of PAL machine time and 5 of NTSC (arithmetic, at
|
|
476
|
+
50 and 60 frames a second); boot and autostart take about three seconds
|
|
477
|
+
more, which is why 8,000,000 cycles was tried first and found the loop
|
|
478
|
+
still running on both models (`$02FF` never written) and 12,000,000 was
|
|
479
|
+
pinned.
|
|
480
|
+
|
|
481
|
+
### What the timer measures
|
|
482
|
+
|
|
483
|
+
CIA1 timer A is loaded with `$FFFF` and started in one-shot mode
|
|
484
|
+
(`$DC0E = $19`); the count read back after the copy, subtracted from
|
|
485
|
+
`$FFFF`, is the cycles elapsed, and the 20-cycle empty measurement taken
|
|
486
|
+
once at the start is subtracted from every frame before it is stored.
|
|
487
|
+
The timer counts machine cycles whether or not the CPU is running, so a
|
|
488
|
+
display-on frame includes the badline stalls, which is why frame 0 was
|
|
489
|
+
run with DEN clear: its 13,001 is what the code costs, the display-on
|
|
490
|
+
figures are what the frame costs. The spread of 4 cycles across the
|
|
491
|
+
display-on PAL frames is the page crossings of the pointer falling on
|
|
492
|
+
different lines as t moves.
|
|
493
|
+
|
|
494
|
+
### Region
|
|
495
|
+
|
|
496
|
+
`region: both`. The mechanism is the same on NTSC; the animation runs
|
|
497
|
+
20 % faster because t is a frame count, the display-on frame costs about
|
|
498
|
+
260 cycles more because the copy crosses more badlines relative to where
|
|
499
|
+
it starts, and the frame still fits with about 3,300 cycles to spare.
|
|
500
|
+
Both pinned pictures hold the same 128 rows.
|
|
501
|
+
|
|
502
|
+
### What it does not establish
|
|
503
|
+
|
|
504
|
+
**Real hardware.** Every figure on this page is from VICE x64sc 3.10; no
|
|
505
|
+
C64 was run.
|
|
506
|
+
|
|
507
|
+
**More than 64 pixels of width.** The 8-byte image and the per-line cost
|
|
508
|
+
are for this band; a wider column means more bytes per line and a larger
|
|
509
|
+
phase table, and no build with one was made or timed.
|
|
510
|
+
|
|
511
|
+
**Colour.** The bitmap is one ink on one paper. A coloured face would
|
|
512
|
+
write screen RAM pairs, which are one pair per 8 by 8 cell and so cannot
|
|
513
|
+
follow an edge that falls inside a cell; nothing of the kind was built.
|
|
514
|
+
|
|
515
|
+
**The NTSC `STRAIGHT` figures.** The control was timed on PAL only.
|
|
516
|
+
|
|
517
|
+
**A bending helix.** The phase is `t + L`, a straight helix; a second
|
|
518
|
+
sine on L was not built.
|