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,815 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: sine-table-runtime
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [sine_table_generation]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D000, D001, D002, D003, D004, D005, D006, D007, D008, D009, D00A, D00B, D00C, D00D, D00E, D00F, D010, D011, D012, D015, D017, D01C, D01D, D020, D027, D028, D029, D02A, D02B, D02C, D02D, D02E, DD04, DD05, DD06, DD07, DD0E, DD0F]
|
|
9
|
+
uses_kernal: [CHROUT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Sine Table Built at Run Time
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Builds a 256-entry sine table on the C64 itself, three ways, with no
|
|
19
|
+
table from the assembler: a parabola by its exact second difference, a
|
|
20
|
+
fixed-point second-difference recurrence run for a whole turn, and the
|
|
21
|
+
same recurrence run for a quarter turn and unfolded by symmetry. Every
|
|
22
|
+
generated entry is compared with a reference the assembler computed
|
|
23
|
+
(`128 + round(127 * sin)`), each generation is timed with the CIA2 timers,
|
|
24
|
+
and the screen shows the cycles, the worst error and the sum of errors per
|
|
25
|
+
method in decimal. Eight sprites then ride the quarter-wave table so the
|
|
26
|
+
picture shows the shape. This is the `sine_table_generation` technique;
|
|
27
|
+
use it when the table has to be made in RAM by a program that cannot
|
|
28
|
+
carry it as data, such as an Oscar64 build with no floating point or a
|
|
29
|
+
routine that needs a different amplitude each time it runs.
|
|
30
|
+
|
|
31
|
+
Verified in VICE x64sc 3.10: the figures on screen are identical on PAL
|
|
32
|
+
and NTSC, the recurrence table dumped from the machine is byte-identical
|
|
33
|
+
to a Python model of the same integer arithmetic, and the eight sprite
|
|
34
|
+
tops in the pinned picture match the table at one phase.
|
|
35
|
+
|
|
36
|
+
## Source
|
|
37
|
+
|
|
38
|
+
```asm
|
|
39
|
+
// sine-table-runtime.asm
|
|
40
|
+
// Builds a 256-entry sine table on the C64 three ways, with no table from
|
|
41
|
+
// the assembler: an exact second-difference parabola (PARAB), a 8.16
|
|
42
|
+
// fixed-point second-difference recurrence run for a whole turn (RECUR),
|
|
43
|
+
// and the same recurrence run for a quarter turn and unfolded by symmetry
|
|
44
|
+
// (QUART). Each table is compared entry by entry with a reference the
|
|
45
|
+
// assembler computed, 128 + round(127 * sin), and the generation is timed
|
|
46
|
+
// with the CIA2 timers. A fourth line (DRIFT) continues the recurrence for
|
|
47
|
+
// a second turn and compares that too. The screen shows, per method, the
|
|
48
|
+
// cycles, the worst error and the sum of errors, all in decimal. Eight
|
|
49
|
+
// sprites then ride the QUART table so the picture shows the shape.
|
|
50
|
+
// Verdict: $02FF = $01 and a green border when RECUR and QUART are within
|
|
51
|
+
// one unit everywhere, $02FF = $02 and a red border otherwise.
|
|
52
|
+
|
|
53
|
+
BasicUpstart2(start)
|
|
54
|
+
|
|
55
|
+
.const CHROUT = $ffd2
|
|
56
|
+
.const RESULT = $02ff // verdict byte read by the harness
|
|
57
|
+
.const BORDER = $d020
|
|
58
|
+
.const CODE_PASS = $01
|
|
59
|
+
.const CODE_FAIL = $02
|
|
60
|
+
|
|
61
|
+
.const SCREEN = $0400
|
|
62
|
+
.const SPRDATA = $2000 // 64-byte aligned; pointer = $2000/64 = $80
|
|
63
|
+
.const T_PARAB = $3000 // the four generated tables, page-aligned
|
|
64
|
+
.const T_RECUR = $3100
|
|
65
|
+
.const T_QUART = $3200
|
|
66
|
+
.const T_DRIFT = $3300
|
|
67
|
+
|
|
68
|
+
.const AMP = 127
|
|
69
|
+
.const FRAC = 16 // fraction bits of the recurrence state
|
|
70
|
+
// First difference of the recurrence: y[1] - y[0] = AMP * sin(2 pi / 256),
|
|
71
|
+
// the one constant the assembler supplies. It is a number, not a table.
|
|
72
|
+
.const V0 = round(AMP * sin(toRadians(360 / 256)) * pow(2, FRAC))
|
|
73
|
+
|
|
74
|
+
.const ptr = $fb // zero-page pointer for puts
|
|
75
|
+
.const y = $02 // recurrence state, 24-bit signed 8.16
|
|
76
|
+
.const v = $05 // first difference, 24-bit signed
|
|
77
|
+
.const a = $08 // y >> 11 and its further shifts, 16-bit
|
|
78
|
+
.const t = $0a // sum of the shifted terms, 16-bit
|
|
79
|
+
.const i = $0c // loop index
|
|
80
|
+
.const p = $0d // parabola value, 16-bit
|
|
81
|
+
.const dlt = $0f // parabola first difference, 16-bit
|
|
82
|
+
.const o = $11 // the byte step returns
|
|
83
|
+
|
|
84
|
+
// Time(routine, slot): run routine with CIA2 timer A counting phi2 and
|
|
85
|
+
// timer B counting A underflows; leave the 24-bit count in slot.
|
|
86
|
+
.macro Time(routine, slot) {
|
|
87
|
+
lda #$51 // CRB: start, force load, count A underflows
|
|
88
|
+
sta $dd0f
|
|
89
|
+
lda #$11 // CRA: start, force load, count phi2
|
|
90
|
+
sta $dd0e
|
|
91
|
+
jsr routine
|
|
92
|
+
lda #$00
|
|
93
|
+
sta $dd0e // stop A
|
|
94
|
+
sta $dd0f // stop B
|
|
95
|
+
sec // the routine's carry must not leak in
|
|
96
|
+
lda #$ff // count = $FFFFFF - (TB:TA), no borrows
|
|
97
|
+
sbc $dd04
|
|
98
|
+
sta slot
|
|
99
|
+
lda #$ff
|
|
100
|
+
sbc $dd05
|
|
101
|
+
sta slot+1
|
|
102
|
+
lda #$ff
|
|
103
|
+
sbc $dd06
|
|
104
|
+
sta slot+2
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Net(slot): slot -= empty, the cost of the harness itself
|
|
108
|
+
.macro Net(slot) {
|
|
109
|
+
sec
|
|
110
|
+
lda slot
|
|
111
|
+
sbc empty
|
|
112
|
+
sta slot
|
|
113
|
+
lda slot+1
|
|
114
|
+
sbc empty+1
|
|
115
|
+
sta slot+1
|
|
116
|
+
lda slot+2
|
|
117
|
+
sbc empty+2
|
|
118
|
+
sta slot+2
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// PutDec(slot): print the 24-bit value in slot in decimal
|
|
122
|
+
.macro PutDec(slot) {
|
|
123
|
+
lda slot
|
|
124
|
+
sta num
|
|
125
|
+
lda slot+1
|
|
126
|
+
sta num+1
|
|
127
|
+
lda slot+2
|
|
128
|
+
sta num+2
|
|
129
|
+
jsr putdec
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Check(table, slot): worst and summed |table - ref| into slot (max at
|
|
133
|
+
// slot, 16-bit sum at slot+1), then print a line "MAX n SUM s".
|
|
134
|
+
.macro Check(table, slot) {
|
|
135
|
+
lda #<table
|
|
136
|
+
sta chk_lo
|
|
137
|
+
lda #>table
|
|
138
|
+
sta chk_hi
|
|
139
|
+
jsr check
|
|
140
|
+
lda err_max
|
|
141
|
+
sta slot
|
|
142
|
+
lda err_sum
|
|
143
|
+
sta slot+1
|
|
144
|
+
lda err_sum+1
|
|
145
|
+
sta slot+2
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Report(label, cycles, errs): one screen line.
|
|
149
|
+
.macro Report(label, cycles, errs) {
|
|
150
|
+
ldx #<label
|
|
151
|
+
ldy #>label
|
|
152
|
+
jsr puts
|
|
153
|
+
PutDec(cycles)
|
|
154
|
+
ldx #<maxtext
|
|
155
|
+
ldy #>maxtext
|
|
156
|
+
jsr puts
|
|
157
|
+
lda errs
|
|
158
|
+
sta num
|
|
159
|
+
lda #0
|
|
160
|
+
sta num+1
|
|
161
|
+
sta num+2
|
|
162
|
+
jsr putdec
|
|
163
|
+
ldx #<sumtext
|
|
164
|
+
ldy #>sumtext
|
|
165
|
+
jsr puts
|
|
166
|
+
lda errs+1
|
|
167
|
+
sta num
|
|
168
|
+
lda errs+2
|
|
169
|
+
sta num+1
|
|
170
|
+
lda #0
|
|
171
|
+
sta num+2
|
|
172
|
+
jsr putdec
|
|
173
|
+
lda #$0d
|
|
174
|
+
jsr CHROUT
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
start:
|
|
178
|
+
sei
|
|
179
|
+
lda #$00 // stop both CIA2 timers and set both
|
|
180
|
+
sta $dd0e // latches to $FFFF
|
|
181
|
+
sta $dd0f
|
|
182
|
+
lda #$ff
|
|
183
|
+
sta $dd04
|
|
184
|
+
sta $dd05
|
|
185
|
+
sta $dd06
|
|
186
|
+
sta $dd07
|
|
187
|
+
|
|
188
|
+
// screen off, so no badline steals cycles from the timed regions.
|
|
189
|
+
// DEN is sampled on line $30; wait for the next frame so it applies.
|
|
190
|
+
lda $d011
|
|
191
|
+
and #$ef
|
|
192
|
+
sta $d011
|
|
193
|
+
!: lda $d011 // wait until raster line >= 256
|
|
194
|
+
bpl !-
|
|
195
|
+
!: lda $d011 // then until it wraps to line 0
|
|
196
|
+
bmi !-
|
|
197
|
+
|
|
198
|
+
Time(nothing, empty)
|
|
199
|
+
Time(gen_parab, t_parab)
|
|
200
|
+
Time(gen_recur, t_recur)
|
|
201
|
+
Time(gen_drift, t_drift) // the turn after it, same state
|
|
202
|
+
Time(gen_quart, t_quart)
|
|
203
|
+
|
|
204
|
+
lda $d011 // screen back on
|
|
205
|
+
ora #$10
|
|
206
|
+
sta $d011
|
|
207
|
+
cli
|
|
208
|
+
|
|
209
|
+
Net(t_parab)
|
|
210
|
+
Net(t_recur)
|
|
211
|
+
Net(t_quart)
|
|
212
|
+
Net(t_drift)
|
|
213
|
+
|
|
214
|
+
Check(T_PARAB, e_parab)
|
|
215
|
+
Check(T_RECUR, e_recur)
|
|
216
|
+
Check(T_QUART, e_quart)
|
|
217
|
+
Check(T_DRIFT, e_drift)
|
|
218
|
+
|
|
219
|
+
lda e_recur // verdict: RECUR and QUART within 1 unit
|
|
220
|
+
cmp #2
|
|
221
|
+
bcs fail
|
|
222
|
+
lda e_quart
|
|
223
|
+
cmp #2
|
|
224
|
+
bcs fail
|
|
225
|
+
lda #CODE_PASS
|
|
226
|
+
ldy #5 // green
|
|
227
|
+
bne checkpoint
|
|
228
|
+
fail:
|
|
229
|
+
lda #CODE_FAIL
|
|
230
|
+
ldy #2 // red
|
|
231
|
+
checkpoint:
|
|
232
|
+
sta RESULT // the harness watches this store
|
|
233
|
+
sty BORDER
|
|
234
|
+
|
|
235
|
+
lda #$93 // clear the screen, cursor home
|
|
236
|
+
jsr CHROUT
|
|
237
|
+
Report(parabtext, t_parab, e_parab)
|
|
238
|
+
Report(recurtext, t_recur, e_recur)
|
|
239
|
+
Report(quarttext, t_quart, e_quart)
|
|
240
|
+
Report(drifttext, t_drift, e_drift)
|
|
241
|
+
ldx #<restext
|
|
242
|
+
ldy #>restext
|
|
243
|
+
jsr puts
|
|
244
|
+
lda RESULT
|
|
245
|
+
jsr hexbyte
|
|
246
|
+
lda #$0d
|
|
247
|
+
jsr CHROUT
|
|
248
|
+
|
|
249
|
+
// eight sprites, 32 table steps apart, ride the QUART table
|
|
250
|
+
ldx #7
|
|
251
|
+
setup:
|
|
252
|
+
lda #SPRDATA/64
|
|
253
|
+
sta SCREEN+$3f8,x
|
|
254
|
+
lda #1 // white
|
|
255
|
+
sta $d027,x
|
|
256
|
+
dex
|
|
257
|
+
bpl setup
|
|
258
|
+
lda #0
|
|
259
|
+
sta $d017
|
|
260
|
+
sta $d01d
|
|
261
|
+
sta $d01c
|
|
262
|
+
sta $d010
|
|
263
|
+
sta frame
|
|
264
|
+
lda #$ff
|
|
265
|
+
sta $d015
|
|
266
|
+
|
|
267
|
+
loop:
|
|
268
|
+
lda #255 // wait for raster line 255
|
|
269
|
+
!: cmp $d012
|
|
270
|
+
bne !-
|
|
271
|
+
inc frame
|
|
272
|
+
lda frame // base index = frame * 2 (mod 256)
|
|
273
|
+
asl
|
|
274
|
+
sta idx
|
|
275
|
+
ldx #0 // sprite number
|
|
276
|
+
next:
|
|
277
|
+
ldy idx
|
|
278
|
+
lda T_QUART,y // 1..255
|
|
279
|
+
lsr // 0..127
|
|
280
|
+
clc
|
|
281
|
+
adc #100 // Y = 100..227, inside the display
|
|
282
|
+
ldy pairs,x
|
|
283
|
+
sta $d001,y
|
|
284
|
+
lda xpos,x
|
|
285
|
+
sta $d000,y
|
|
286
|
+
lda idx
|
|
287
|
+
clc
|
|
288
|
+
adc #32
|
|
289
|
+
sta idx
|
|
290
|
+
inx
|
|
291
|
+
cpx #8
|
|
292
|
+
bne next
|
|
293
|
+
!: lda $d012 // leave line 255 before waiting again
|
|
294
|
+
cmp #255
|
|
295
|
+
beq !-
|
|
296
|
+
jmp loop
|
|
297
|
+
|
|
298
|
+
nothing:
|
|
299
|
+
rts
|
|
300
|
+
|
|
301
|
+
// ---------------------------------------------------------------------------
|
|
302
|
+
// gen_parab: half a wave as the parabola p(i) = i * (128 - i), built by its
|
|
303
|
+
// exact second difference (dlt starts at 127 and falls by 2), scaled to
|
|
304
|
+
// amplitude 127 by v = (p - p/128 + 16) / 32, and mirrored: entry 128 + i
|
|
305
|
+
// is 256 - entry i.
|
|
306
|
+
// ---------------------------------------------------------------------------
|
|
307
|
+
gen_parab:
|
|
308
|
+
lda #0
|
|
309
|
+
sta p
|
|
310
|
+
sta p+1
|
|
311
|
+
sta dlt+1
|
|
312
|
+
sta i
|
|
313
|
+
lda #127
|
|
314
|
+
sta dlt
|
|
315
|
+
!: lda p // t = p >> 7, at most 32
|
|
316
|
+
asl
|
|
317
|
+
lda p+1
|
|
318
|
+
rol
|
|
319
|
+
sta t
|
|
320
|
+
sec
|
|
321
|
+
lda p // a = p - t + 16
|
|
322
|
+
sbc t
|
|
323
|
+
sta a
|
|
324
|
+
lda p+1
|
|
325
|
+
sbc #0
|
|
326
|
+
sta a+1
|
|
327
|
+
clc
|
|
328
|
+
lda a
|
|
329
|
+
adc #16
|
|
330
|
+
sta a
|
|
331
|
+
bcc !+
|
|
332
|
+
inc a+1
|
|
333
|
+
!: ldx #5 // a >>= 5
|
|
334
|
+
!: lsr a+1
|
|
335
|
+
ror a
|
|
336
|
+
dex
|
|
337
|
+
bne !-
|
|
338
|
+
ldx i
|
|
339
|
+
lda #128
|
|
340
|
+
clc
|
|
341
|
+
adc a
|
|
342
|
+
sta T_PARAB,x
|
|
343
|
+
lda #128
|
|
344
|
+
sec
|
|
345
|
+
sbc a
|
|
346
|
+
sta T_PARAB+128,x
|
|
347
|
+
clc // p += dlt
|
|
348
|
+
lda p
|
|
349
|
+
adc dlt
|
|
350
|
+
sta p
|
|
351
|
+
lda p+1
|
|
352
|
+
adc dlt+1
|
|
353
|
+
sta p+1
|
|
354
|
+
sec // dlt -= 2
|
|
355
|
+
lda dlt
|
|
356
|
+
sbc #2
|
|
357
|
+
sta dlt
|
|
358
|
+
lda dlt+1
|
|
359
|
+
sbc #0
|
|
360
|
+
sta dlt+1
|
|
361
|
+
inc i
|
|
362
|
+
lda i
|
|
363
|
+
bpl !--- // i = 0..127
|
|
364
|
+
rts
|
|
365
|
+
|
|
366
|
+
// ---------------------------------------------------------------------------
|
|
367
|
+
// The recurrence. State y (8.16 signed) and first difference v (signed).
|
|
368
|
+
// step: y += v ; v -= d * y, with d = 2 - 2 cos(2 pi / 256) approximated
|
|
369
|
+
// by y/2^11 + y/2^14 + y/2^15 + y/2^16 + y/2^17, each an arithmetic shift
|
|
370
|
+
// of the one before. Returns A = 128 + round(y) as it was on entry, the
|
|
371
|
+
// table byte for this step.
|
|
372
|
+
// ---------------------------------------------------------------------------
|
|
373
|
+
reset:
|
|
374
|
+
lda #0
|
|
375
|
+
sta y
|
|
376
|
+
sta y+1
|
|
377
|
+
sta y+2
|
|
378
|
+
lda #<V0
|
|
379
|
+
sta v
|
|
380
|
+
lda #>V0
|
|
381
|
+
sta v+1
|
|
382
|
+
lda #(V0 >> 16)
|
|
383
|
+
sta v+2
|
|
384
|
+
rts
|
|
385
|
+
|
|
386
|
+
step:
|
|
387
|
+
lda y+1 // the byte for this entry, 128 + round(y):
|
|
388
|
+
asl // carry = bit 15 of the fraction
|
|
389
|
+
lda y+2
|
|
390
|
+
adc #0
|
|
391
|
+
eor #$80
|
|
392
|
+
sta o
|
|
393
|
+
clc // then advance: y += v
|
|
394
|
+
lda y
|
|
395
|
+
adc v
|
|
396
|
+
sta y
|
|
397
|
+
lda y+1
|
|
398
|
+
adc v+1
|
|
399
|
+
sta y+1
|
|
400
|
+
lda y+2
|
|
401
|
+
adc v+2
|
|
402
|
+
sta y+2
|
|
403
|
+
lda y+1 // a = y >> 11: drop the low byte, then 3
|
|
404
|
+
sta a
|
|
405
|
+
lda y+2
|
|
406
|
+
sta a+1
|
|
407
|
+
jsr asr3
|
|
408
|
+
lda a // t = a
|
|
409
|
+
sta t
|
|
410
|
+
lda a+1
|
|
411
|
+
sta t+1
|
|
412
|
+
jsr asr3 // a = y >> 14
|
|
413
|
+
jsr addt
|
|
414
|
+
jsr asr1 // y >> 15
|
|
415
|
+
jsr addt
|
|
416
|
+
jsr asr1 // y >> 16
|
|
417
|
+
jsr addt
|
|
418
|
+
jsr asr1 // y >> 17
|
|
419
|
+
jsr addt
|
|
420
|
+
sec // v -= t, t sign-extended to 24 bits
|
|
421
|
+
lda v
|
|
422
|
+
sbc t
|
|
423
|
+
sta v
|
|
424
|
+
lda v+1
|
|
425
|
+
sbc t+1
|
|
426
|
+
sta v+1
|
|
427
|
+
ldy #0 // Y = sign extension of t
|
|
428
|
+
lda t+1
|
|
429
|
+
bpl !+
|
|
430
|
+
dey
|
|
431
|
+
!: sty t+1
|
|
432
|
+
lda v+2
|
|
433
|
+
sbc t+1
|
|
434
|
+
sta v+2
|
|
435
|
+
lda o
|
|
436
|
+
rts
|
|
437
|
+
|
|
438
|
+
asr3:
|
|
439
|
+
jsr asr1
|
|
440
|
+
jsr asr1
|
|
441
|
+
asr1: // 16-bit arithmetic shift right of a
|
|
442
|
+
lda a+1
|
|
443
|
+
cmp #$80
|
|
444
|
+
ror a+1
|
|
445
|
+
ror a
|
|
446
|
+
rts
|
|
447
|
+
|
|
448
|
+
addt: // t += a
|
|
449
|
+
clc
|
|
450
|
+
lda t
|
|
451
|
+
adc a
|
|
452
|
+
sta t
|
|
453
|
+
lda t+1
|
|
454
|
+
adc a+1
|
|
455
|
+
sta t+1
|
|
456
|
+
rts
|
|
457
|
+
|
|
458
|
+
gen_recur: // one whole turn, 256 steps
|
|
459
|
+
jsr reset
|
|
460
|
+
ldx #0
|
|
461
|
+
!: jsr step
|
|
462
|
+
sta T_RECUR,x
|
|
463
|
+
inx
|
|
464
|
+
bne !-
|
|
465
|
+
rts
|
|
466
|
+
|
|
467
|
+
gen_drift: // the turn after it, same state
|
|
468
|
+
ldx #0
|
|
469
|
+
!: jsr step
|
|
470
|
+
sta T_DRIFT,x
|
|
471
|
+
inx
|
|
472
|
+
bne !-
|
|
473
|
+
rts
|
|
474
|
+
|
|
475
|
+
gen_quart: // 65 steps, then four writes per step
|
|
476
|
+
jsr reset
|
|
477
|
+
lda #0
|
|
478
|
+
sta i
|
|
479
|
+
!: jsr step
|
|
480
|
+
ldx i
|
|
481
|
+
sta T_QUART,x // entry i
|
|
482
|
+
ldy #128
|
|
483
|
+
sty t
|
|
484
|
+
sec
|
|
485
|
+
lda t
|
|
486
|
+
sbc i
|
|
487
|
+
tay
|
|
488
|
+
txa
|
|
489
|
+
pha
|
|
490
|
+
lda T_QUART,x
|
|
491
|
+
sta T_QUART,y // entry 128 - i, same value
|
|
492
|
+
eor #$ff // 256 - value: negate about 128
|
|
493
|
+
clc
|
|
494
|
+
adc #1
|
|
495
|
+
tay
|
|
496
|
+
pla
|
|
497
|
+
clc
|
|
498
|
+
adc #128
|
|
499
|
+
tax
|
|
500
|
+
tya
|
|
501
|
+
sta T_QUART,x // entry 128 + i
|
|
502
|
+
lda #0
|
|
503
|
+
sec
|
|
504
|
+
sbc i
|
|
505
|
+
tax
|
|
506
|
+
tya
|
|
507
|
+
sta T_QUART,x // entry 256 - i (entry 0 when i = 0)
|
|
508
|
+
inc i
|
|
509
|
+
lda i
|
|
510
|
+
cmp #65
|
|
511
|
+
bne !-
|
|
512
|
+
rts
|
|
513
|
+
|
|
514
|
+
// ---------------------------------------------------------------------------
|
|
515
|
+
// check: err_max = max |table[i] - ref[i]|, err_sum = the sum, 16-bit.
|
|
516
|
+
// ---------------------------------------------------------------------------
|
|
517
|
+
check:
|
|
518
|
+
lda #0
|
|
519
|
+
sta err_max
|
|
520
|
+
sta err_sum
|
|
521
|
+
sta err_sum+1
|
|
522
|
+
ldx #0
|
|
523
|
+
chk_loop:
|
|
524
|
+
sec
|
|
525
|
+
.label chk_lo = * + 1
|
|
526
|
+
.label chk_hi = * + 2
|
|
527
|
+
lda $ffff,x
|
|
528
|
+
sbc ref,x
|
|
529
|
+
bcs !+
|
|
530
|
+
eor #$ff // negative: negate
|
|
531
|
+
adc #1
|
|
532
|
+
!: cmp err_max
|
|
533
|
+
bcc !+
|
|
534
|
+
sta err_max
|
|
535
|
+
!: clc
|
|
536
|
+
adc err_sum
|
|
537
|
+
sta err_sum
|
|
538
|
+
bcc !+
|
|
539
|
+
inc err_sum+1
|
|
540
|
+
!: inx
|
|
541
|
+
bne chk_loop
|
|
542
|
+
rts
|
|
543
|
+
|
|
544
|
+
// ---------------------------------------------------------------------------
|
|
545
|
+
// output helpers
|
|
546
|
+
// ---------------------------------------------------------------------------
|
|
547
|
+
puts: // print the zero-terminated string at Y:X
|
|
548
|
+
stx ptr
|
|
549
|
+
sty ptr+1
|
|
550
|
+
ldy #$00
|
|
551
|
+
!: lda (ptr),y
|
|
552
|
+
beq !+
|
|
553
|
+
jsr CHROUT
|
|
554
|
+
iny
|
|
555
|
+
bne !-
|
|
556
|
+
!: rts
|
|
557
|
+
|
|
558
|
+
putdec: // print the 24-bit value in num, decimal
|
|
559
|
+
ldx #$00 // power-of-ten index, 0 = 1,000,000
|
|
560
|
+
stx lead
|
|
561
|
+
digit:
|
|
562
|
+
lda #'0' - 1
|
|
563
|
+
sta dig
|
|
564
|
+
!: inc dig
|
|
565
|
+
sec
|
|
566
|
+
lda num
|
|
567
|
+
sbc pow10,x
|
|
568
|
+
sta num
|
|
569
|
+
lda num+1
|
|
570
|
+
sbc pow10+1,x
|
|
571
|
+
sta num+1
|
|
572
|
+
lda num+2
|
|
573
|
+
sbc pow10+2,x
|
|
574
|
+
sta num+2
|
|
575
|
+
bcs !-
|
|
576
|
+
lda num // undo the last subtraction
|
|
577
|
+
adc pow10,x
|
|
578
|
+
sta num
|
|
579
|
+
lda num+1
|
|
580
|
+
adc pow10+1,x
|
|
581
|
+
sta num+1
|
|
582
|
+
lda num+2
|
|
583
|
+
adc pow10+2,x
|
|
584
|
+
sta num+2
|
|
585
|
+
lda dig
|
|
586
|
+
cmp #'0'
|
|
587
|
+
bne show
|
|
588
|
+
cpx #6 * 3 // last digit always prints
|
|
589
|
+
beq show
|
|
590
|
+
lda lead
|
|
591
|
+
beq next_digit // suppress a leading zero
|
|
592
|
+
lda #'0'
|
|
593
|
+
show:
|
|
594
|
+
jsr CHROUT
|
|
595
|
+
inc lead
|
|
596
|
+
next_digit:
|
|
597
|
+
inx
|
|
598
|
+
inx
|
|
599
|
+
inx
|
|
600
|
+
cpx #7 * 3
|
|
601
|
+
bne digit
|
|
602
|
+
rts
|
|
603
|
+
|
|
604
|
+
hexbyte: // print A as two hex digits
|
|
605
|
+
pha
|
|
606
|
+
lsr
|
|
607
|
+
lsr
|
|
608
|
+
lsr
|
|
609
|
+
lsr
|
|
610
|
+
jsr hexdigit
|
|
611
|
+
pla
|
|
612
|
+
and #$0f
|
|
613
|
+
hexdigit:
|
|
614
|
+
cmp #10
|
|
615
|
+
bcc !+
|
|
616
|
+
adc #6 // carry set: +7 lands on 'A'..'F'
|
|
617
|
+
!: adc #'0'
|
|
618
|
+
jmp CHROUT
|
|
619
|
+
|
|
620
|
+
pow10: .byte <1000000, >1000000, 1000000 >> 16
|
|
621
|
+
.byte <100000, >100000, 100000 >> 16
|
|
622
|
+
.byte <10000, >10000, 0
|
|
623
|
+
.byte <1000, >1000, 0
|
|
624
|
+
.byte <100, >100, 0
|
|
625
|
+
.byte <10, >10, 0
|
|
626
|
+
.byte <1, >1, 0
|
|
627
|
+
|
|
628
|
+
empty: .byte 0, 0, 0
|
|
629
|
+
t_parab: .byte 0, 0, 0
|
|
630
|
+
t_recur: .byte 0, 0, 0
|
|
631
|
+
t_quart: .byte 0, 0, 0
|
|
632
|
+
t_drift: .byte 0, 0, 0
|
|
633
|
+
e_parab: .byte 0, 0, 0 // max, sum lo, sum hi
|
|
634
|
+
e_recur: .byte 0, 0, 0
|
|
635
|
+
e_quart: .byte 0, 0, 0
|
|
636
|
+
e_drift: .byte 0, 0, 0
|
|
637
|
+
err_max: .byte 0
|
|
638
|
+
err_sum: .word 0
|
|
639
|
+
num: .byte 0, 0, 0
|
|
640
|
+
dig: .byte 0
|
|
641
|
+
lead: .byte 0
|
|
642
|
+
frame: .byte 0
|
|
643
|
+
idx: .byte 0
|
|
644
|
+
|
|
645
|
+
pairs: .byte 0, 2, 4, 6, 8, 10, 12, 14
|
|
646
|
+
xpos: .byte 24, 56, 88, 120, 152, 184, 216, 248
|
|
647
|
+
|
|
648
|
+
.encoding "petscii_upper"
|
|
649
|
+
parabtext: .text "PARAB "
|
|
650
|
+
.byte 0
|
|
651
|
+
recurtext: .text "RECUR "
|
|
652
|
+
.byte 0
|
|
653
|
+
quarttext: .text "QUART "
|
|
654
|
+
.byte 0
|
|
655
|
+
drifttext: .text "DRIFT "
|
|
656
|
+
.byte 0
|
|
657
|
+
maxtext: .text " MAX "
|
|
658
|
+
.byte 0
|
|
659
|
+
sumtext: .text " SUM "
|
|
660
|
+
.byte 0
|
|
661
|
+
restext: .text "RESULT "
|
|
662
|
+
.byte 0
|
|
663
|
+
|
|
664
|
+
// The reference the tables are checked against: the assembler's own
|
|
665
|
+
// 128 + round(127 * sin), the sin_r127 scaling of table_generation.
|
|
666
|
+
.align $100
|
|
667
|
+
ref: .fill 256, 128 + round(AMP * sin(toRadians(i * 360 / 256)))
|
|
668
|
+
|
|
669
|
+
.pc = SPRDATA "sprite"
|
|
670
|
+
.fill 63, $ff // a solid 24x21 block
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
## Build
|
|
674
|
+
|
|
675
|
+
```bash
|
|
676
|
+
java -jar KickAss.jar sine-table-runtime.asm -o sine-table-runtime.prg
|
|
677
|
+
```
|
|
678
|
+
|
|
679
|
+
Run headless (either model; PAL shown):
|
|
680
|
+
|
|
681
|
+
```bash
|
|
682
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas x64sc -default -minimized -warp +sound \
|
|
683
|
+
+autostart-delay-random -autostartprgmode 1 -limitcycles 8000000 \
|
|
684
|
+
-exitscreenshot sine-table-runtime.png -autostart sine-table-runtime.prg
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
## Expected output
|
|
688
|
+
|
|
689
|
+
Blue screen, green border. Five lines of light-blue text at the top, then
|
|
690
|
+
eight white 24 by 21 blocks in a row 32 pixels apart, X 24 to 248, each
|
|
691
|
+
riding the quarter-wave table one eighth of a turn behind the one to its
|
|
692
|
+
left, so the row is one whole sine wave and it rolls left two table steps
|
|
693
|
+
a frame. The text, measured by decoding the exit screenshot against the
|
|
694
|
+
character ROM, is the same on PAL and NTSC:
|
|
695
|
+
|
|
696
|
+
```text
|
|
697
|
+
PARAB 25266 MAX 8 SUM 980
|
|
698
|
+
RECUR 129190 MAX 1 SUM 21
|
|
699
|
+
QUART 38067 MAX 1 SUM 4
|
|
700
|
+
DRIFT 129153 MAX 1 SUM 48
|
|
701
|
+
RESULT 01
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
The first number on each line is the cycles the generator took, less the
|
|
705
|
+
17 cycles of an empty timed call (the `JSR`, the `RTS` and the
|
|
706
|
+
instructions that stop timer A). `MAX` is the largest difference in
|
|
707
|
+
units between a generated entry and the reference, `SUM` the sum of the
|
|
708
|
+
absolute differences over 256 entries, so the mean error is `SUM / 256`.
|
|
709
|
+
`RESULT 01` and the green border say RECUR and QUART are within one unit
|
|
710
|
+
everywhere; `02` and a red border say one of them is not.
|
|
711
|
+
|
|
712
|
+
Screenshots from the pinned run, 8,000,000 cycles, both models:
|
|
713
|
+
`screenshots/sine-table-runtime.png` and
|
|
714
|
+
`screenshots/sine-table-runtime-ntsc.png`.
|
|
715
|
+
|
|
716
|
+
| Line | Method | Cycles for 256 entries | Per entry | PAL frames | Worst error | Mean error |
|
|
717
|
+
|---|---|---|---|---|---|---|
|
|
718
|
+
| PARAB | parabola, exact second difference, mirrored | 25,266 | 99 | 1.3 | 8 | 3.83 |
|
|
719
|
+
| RECUR | 8.16 recurrence, 256 steps | 129,190 | 505 | 6.6 | 1 | 0.08 |
|
|
720
|
+
| QUART | 8.16 recurrence, 65 steps, unfolded | 38,067 | 149 | 1.9 | 1 | 0.02 |
|
|
721
|
+
| DRIFT | RECUR continued for a second turn | 129,153 | 505 | 6.6 | 1 | 0.19 |
|
|
722
|
+
|
|
723
|
+
Cycles and errors are the screen's figures; the per-entry, frame and mean
|
|
724
|
+
columns are arithmetic from them (PAL frame 19,656 cycles). DRIFT differs
|
|
725
|
+
from RECUR by 37 cycles because the one branch in `step`, on the sign of
|
|
726
|
+
the correction term, is taken a different number of times.
|
|
727
|
+
|
|
728
|
+
### Reading the sprites off the picture
|
|
729
|
+
|
|
730
|
+
A sprite's first row is drawn on the line after the one in its Y register
|
|
731
|
+
(`sprite-sine-chain.md` measures the same), and the picture's row is the
|
|
732
|
+
line minus 16 on PAL and minus 28 on NTSC. Sprite n's Y is
|
|
733
|
+
`100 + (table[(2 * frame + 32 * n) mod 256] >> 1)`. Measured with PIL as
|
|
734
|
+
the first white pixel in column X + 20 of each sprite:
|
|
735
|
+
|
|
736
|
+
| Model | Top rows (raster lines) of sprites 0 to 7 | Table phase that predicts every one |
|
|
737
|
+
|---|---|---|
|
|
738
|
+
| PAL | 103, 132, 180, 219, 226, 197, 149, 110 | index 202, entries 5, 63, 159, 237, 251, 193, 97, 19 |
|
|
739
|
+
| NTSC | 177, 218, 227, 200, 152, 112, 102, 129 | index 8, entries 153, 234, 253, 199, 103, 22, 3, 57 |
|
|
740
|
+
|
|
741
|
+
Each set matches exactly one even phase, and the eight Y values in the
|
|
742
|
+
VIC registers at the last frame of the PAL run, read through a
|
|
743
|
+
`trace store d00f` tracepoint, are the top rows less one.
|
|
744
|
+
|
|
745
|
+
## Why this works
|
|
746
|
+
|
|
747
|
+
**The parabola.** `p(i) = i * (128 - i)` has a constant second difference,
|
|
748
|
+
so it is built with two 16-bit additions per entry and no multiply: the
|
|
749
|
+
first difference starts at 127 and falls by 2 each step. Scaling by
|
|
750
|
+
`127 / 4096` is done as `p - p / 128`, then `+ 16` and a shift right by 5
|
|
751
|
+
to round. The half wave is mirrored, entry `128 + i` is `256 - entry i`,
|
|
752
|
+
which is exact because the reference scaling is symmetric about 128. It
|
|
753
|
+
is the cheapest generator and the roughest: a parabola is 8 units from
|
|
754
|
+
the sine at its worst, near the zero crossings, and 3.8 units off on
|
|
755
|
+
average. It is enough for a bounce or a wobble, not for a smooth scroller.
|
|
756
|
+
|
|
757
|
+
**The recurrence.** A sine satisfies `y[n+1] = 2 y[n] - y[n-1] - d y[n]`
|
|
758
|
+
with `d = 2 - 2 cos(2 pi / 256)`, about `0.000602`. The listing keeps
|
|
759
|
+
the state as `y` and its first difference `v` in 8.16 fixed point, and
|
|
760
|
+
each step does `y += v` then `v -= d * y`. The multiply by `d` is five
|
|
761
|
+
arithmetic shifts, `y / 2^11 + y / 2^14 + y / 2^15 + y / 2^16 + y / 2^17`,
|
|
762
|
+
each a shift of the one before, which sums to `0.00060272` against the
|
|
763
|
+
true `0.00060236`, a frequency error of 0.03 %. The amplitude is set by
|
|
764
|
+
the first difference alone: `V0 = round(127 * sin(2 pi / 256) * 65536)`,
|
|
765
|
+
the one constant the assembler supplies and the only place a sine is
|
|
766
|
+
evaluated; an Oscar64 build folds the same expression at compile time,
|
|
767
|
+
and `127 * 2 pi / 256 * 65536` (204,279, arithmetic) is within 0.1 % of
|
|
768
|
+
it for a build with no `sin` at all. The byte for entry n is taken before
|
|
769
|
+
the step advances the state; an earlier draft took it after and every
|
|
770
|
+
entry was the next one's, which read as a worst error of 4.
|
|
771
|
+
|
|
772
|
+
**Why 16 fraction bits.** The shifts floor, so each step under-corrects
|
|
773
|
+
`v` by a fraction of its last bit, and an error in `v` grows into `y` as
|
|
774
|
+
the square of the step count: with 16 fraction bits the bound over one
|
|
775
|
+
turn is about a unit (arithmetic, `2.5 / 65536` a step over 256 steps),
|
|
776
|
+
with 8 it would be hundreds. Measured, the table is within one unit of
|
|
777
|
+
the reference everywhere and off by one in 21 places after one turn, and
|
|
778
|
+
in 48 places after a second turn, still no worse than one unit.
|
|
779
|
+
The same integer algorithm run on the host for eight turns reaches a
|
|
780
|
+
worst error of 2 units on the fifth turn (Python, not run on the
|
|
781
|
+
machine). A generator that runs once and stops has no drift problem; a
|
|
782
|
+
generator that keeps stepping frame after frame, as an oscillator rather
|
|
783
|
+
than a table, should reset its state every turn.
|
|
784
|
+
|
|
785
|
+
**The quarter wave.** A rounded sine of amplitude 127 about 128 is even
|
|
786
|
+
about entry 64 and odd about entry 128, so 65 values fix all 256. QUART
|
|
787
|
+
runs the same recurrence for 65 steps and writes four entries per step,
|
|
788
|
+
`i`, `128 - i`, `128 + i` and `256 - i`, the last two as `256 - value`.
|
|
789
|
+
It costs 3.4 times less than the full turn and is more accurate, because
|
|
790
|
+
the recurrence has only 64 steps to drift in: four entries off by one
|
|
791
|
+
against 21. The unfold's own cost, about 5,250 cycles of the 38,067
|
|
792
|
+
(arithmetic: 65 steps at RECUR's 505 a step, subtracted), is the same job
|
|
793
|
+
`table_generation` in `techniques/cpu-cycle-tricks.md` measures at 5,190
|
|
794
|
+
cycles in Oscar64 from a 65-byte host table.
|
|
795
|
+
|
|
796
|
+
**The measurement.** CIA2 timer A counts phi2 and timer B counts A's
|
|
797
|
+
underflows, the cascade `speedcode-generator.md` describes; the four
|
|
798
|
+
timed calls run under `SEI` with the screen blanked, so no badline steals
|
|
799
|
+
cycles from the count, and DEN is dropped a frame early because the VIC
|
|
800
|
+
samples it once, on line $30. The read of the count sets the carry
|
|
801
|
+
before its first `SBC`, because the timed routine returns with the carry
|
|
802
|
+
in either state and a borrow there reads one cycle high or low. The
|
|
803
|
+
check subtracts the reference from each
|
|
804
|
+
entry, negates a negative difference, and keeps the largest and a 16-bit
|
|
805
|
+
sum. The sprites read the QUART table shifted right once and add 100, so
|
|
806
|
+
the wave spans Y 100 to 227 and stays inside the display.
|
|
807
|
+
|
|
808
|
+
## What this recipe does not show
|
|
809
|
+
|
|
810
|
+
Scaling the table to another amplitude after it is built. The recurrence
|
|
811
|
+
takes its amplitude from `V0`, so a different amplitude is a different
|
|
812
|
+
`V0`, and an offset is an add at read time or a different constant in the
|
|
813
|
+
`eor #$80` step; the technique page covers both. Bhaskara's rational
|
|
814
|
+
approximation, which the technique page quotes from host arithmetic only,
|
|
815
|
+
is not implemented here.
|