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,463 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: pwm-digi
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [pwm_digi]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D400, D401, D402, D403, D404, D405, D406, D418, D020, DD04, DD05, DD06, DD07, DD0D, DD0E, DD0F]
|
|
9
|
+
uses_kernal: [CHROUT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler PWM Digi: an 8-bit sample through voice 1's pulse width
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A sample player that never touches the volume register after setup. Voice 1
|
|
19
|
+
runs the pulse waveform at the highest SID frequency, `$FFFF`, and the
|
|
20
|
+
program rewrites the pulse width from an 8-bit sample every 128 cycles,
|
|
21
|
+
paced by CIA 2 timer A. The duty cycle of the pulse carries the sample and
|
|
22
|
+
the SID's output stage averages it into audio. The sample is 256 bytes
|
|
23
|
+
holding eight periods of a sine, so the tone is the sample rate over 32:
|
|
24
|
+
240.5 Hz on PAL, 249.7 Hz on NTSC. CIA 2 timer B counts timer A underflows,
|
|
25
|
+
and the verdict compares that count with the number of samples written: a
|
|
26
|
+
code at `$02FF` (01 pass, 02 fail), the border colour, and a line of text.
|
|
27
|
+
The technique is `pwm_digi` in `techniques/music-sid.md`.
|
|
28
|
+
|
|
29
|
+
## Source
|
|
30
|
+
|
|
31
|
+
```asm
|
|
32
|
+
// pwm-digi.asm
|
|
33
|
+
// Pulse-width-modulation digi on voice 1: the pulse waveform runs at the
|
|
34
|
+
// highest SID frequency ($FFFF) and its pulse width is rewritten from an
|
|
35
|
+
// 8-bit sample every 128 cycles, paced by CIA 2 timer A. CIA 2 timer B
|
|
36
|
+
// counts timer A underflows, so after the last sample the program can
|
|
37
|
+
// check that it wrote exactly one sample per timer period. Verdict at
|
|
38
|
+
// $02FF (01 pass, 02 fail), border green or red, and a line of text.
|
|
39
|
+
BasicUpstart2(start)
|
|
40
|
+
|
|
41
|
+
.const CHROUT = $ffd2
|
|
42
|
+
.const RESULT = $02ff
|
|
43
|
+
.const BORDER = $d020
|
|
44
|
+
|
|
45
|
+
.const PERIOD = 128 // cycles per sample; timer latch is PERIOD-1
|
|
46
|
+
.const REPS = 64 // table passes; samples = 256 * REPS = 16384
|
|
47
|
+
.const EXPECT_TB = $ffff - 256 * REPS // timer B after that many underflows
|
|
48
|
+
|
|
49
|
+
.const CODE_PASS = $01
|
|
50
|
+
.const CODE_FAIL = $02
|
|
51
|
+
|
|
52
|
+
start:
|
|
53
|
+
// print the header lines before any timing-critical work
|
|
54
|
+
ldx #0
|
|
55
|
+
!:
|
|
56
|
+
lda header,x
|
|
57
|
+
beq !+
|
|
58
|
+
jsr CHROUT
|
|
59
|
+
inx
|
|
60
|
+
bne !-
|
|
61
|
+
!:
|
|
62
|
+
// split the 8-bit sample into the two pulse-width bytes:
|
|
63
|
+
// PWLO = sample << 4 (bits 7-4), PWHI = sample >> 4 (bits 3-0)
|
|
64
|
+
ldx #0
|
|
65
|
+
split:
|
|
66
|
+
lda sample,x
|
|
67
|
+
lsr
|
|
68
|
+
lsr
|
|
69
|
+
lsr
|
|
70
|
+
lsr
|
|
71
|
+
sta pwhi,x
|
|
72
|
+
lda sample,x
|
|
73
|
+
asl
|
|
74
|
+
asl
|
|
75
|
+
asl
|
|
76
|
+
asl
|
|
77
|
+
sta pwlo,x
|
|
78
|
+
inx
|
|
79
|
+
bne split
|
|
80
|
+
|
|
81
|
+
sei
|
|
82
|
+
// silence CIA 2 as an NMI source and clear anything pending
|
|
83
|
+
lda #$7f
|
|
84
|
+
sta $dd0d
|
|
85
|
+
lda $dd0d
|
|
86
|
+
|
|
87
|
+
// voice 1: highest frequency, attack 0 / decay 0, sustain 15 / release 0,
|
|
88
|
+
// pulse waveform gated on; master volume 15, no filter
|
|
89
|
+
lda #$ff
|
|
90
|
+
sta $d400
|
|
91
|
+
sta $d401
|
|
92
|
+
lda #$00
|
|
93
|
+
sta $d405
|
|
94
|
+
lda #$f0
|
|
95
|
+
sta $d406
|
|
96
|
+
lda #$0f
|
|
97
|
+
sta $d418
|
|
98
|
+
lda pwlo
|
|
99
|
+
sta $d402
|
|
100
|
+
lda pwhi
|
|
101
|
+
sta $d403
|
|
102
|
+
lda #$41
|
|
103
|
+
sta $d404
|
|
104
|
+
|
|
105
|
+
// timer B: count timer A underflows from $FFFF, started first so that
|
|
106
|
+
// it sees every underflow; timer A: continuous, PERIOD cycles
|
|
107
|
+
lda #$ff
|
|
108
|
+
sta $dd06
|
|
109
|
+
sta $dd07
|
|
110
|
+
lda #$51 // start, force load, input = timer A underflow
|
|
111
|
+
sta $dd0f
|
|
112
|
+
lda #<(PERIOD - 1)
|
|
113
|
+
sta $dd04
|
|
114
|
+
lda #>(PERIOD - 1)
|
|
115
|
+
sta $dd05
|
|
116
|
+
lda #$11 // start, force load, continuous, phi2 clock
|
|
117
|
+
sta $dd0e
|
|
118
|
+
|
|
119
|
+
ldx #0
|
|
120
|
+
ldy #REPS
|
|
121
|
+
play:
|
|
122
|
+
lda $dd0d // 4 bit 0 set = timer A underflowed
|
|
123
|
+
and #$01 // 2
|
|
124
|
+
beq play // 2 (3 when looping)
|
|
125
|
+
lda pwlo,x // 4, 5 when x crosses a page (x >= 2 here)
|
|
126
|
+
sta $d402 // 4
|
|
127
|
+
lda pwhi,x // 4, 5 when x crosses a page (x >= 2 here)
|
|
128
|
+
sta $d403 // 4
|
|
129
|
+
inx // 2
|
|
130
|
+
bne play // 3 one table pass = 256 samples
|
|
131
|
+
dey // 2
|
|
132
|
+
bne play // 3
|
|
133
|
+
|
|
134
|
+
// the last flag was consumed a few cycles ago; timer B now holds
|
|
135
|
+
// $FFFF minus the number of underflows, if the loop never fell behind
|
|
136
|
+
lda $dd06
|
|
137
|
+
sta tb_lo
|
|
138
|
+
lda $dd07
|
|
139
|
+
sta tb_hi
|
|
140
|
+
lda #$00
|
|
141
|
+
sta $dd0e // stop both timers
|
|
142
|
+
sta $dd0f
|
|
143
|
+
lda #$40 // pulse, gate off: release 0 ends the tone
|
|
144
|
+
sta $d404
|
|
145
|
+
cli
|
|
146
|
+
|
|
147
|
+
lda tb_lo
|
|
148
|
+
cmp #<EXPECT_TB
|
|
149
|
+
bne fail
|
|
150
|
+
lda tb_hi
|
|
151
|
+
cmp #>EXPECT_TB
|
|
152
|
+
bne fail
|
|
153
|
+
lda #CODE_PASS
|
|
154
|
+
ldy #5 // green
|
|
155
|
+
bne checkpoint
|
|
156
|
+
fail:
|
|
157
|
+
lda #CODE_FAIL
|
|
158
|
+
ldy #2 // red
|
|
159
|
+
checkpoint:
|
|
160
|
+
sta RESULT
|
|
161
|
+
sty BORDER
|
|
162
|
+
|
|
163
|
+
// "RESULT hh PASS" / "RESULT hh FAIL", then the timer B reading
|
|
164
|
+
ldx #0
|
|
165
|
+
!:
|
|
166
|
+
lda text,x
|
|
167
|
+
beq !+
|
|
168
|
+
jsr CHROUT
|
|
169
|
+
inx
|
|
170
|
+
bne !-
|
|
171
|
+
!:
|
|
172
|
+
lda RESULT
|
|
173
|
+
jsr hexbyte
|
|
174
|
+
lda RESULT
|
|
175
|
+
cmp #CODE_PASS
|
|
176
|
+
beq pass
|
|
177
|
+
ldx #0
|
|
178
|
+
!:
|
|
179
|
+
lda failtext,x
|
|
180
|
+
beq tbline
|
|
181
|
+
jsr CHROUT
|
|
182
|
+
inx
|
|
183
|
+
bne !-
|
|
184
|
+
pass:
|
|
185
|
+
ldx #0
|
|
186
|
+
!:
|
|
187
|
+
lda passtext,x
|
|
188
|
+
beq tbline
|
|
189
|
+
jsr CHROUT
|
|
190
|
+
inx
|
|
191
|
+
bne !-
|
|
192
|
+
tbline:
|
|
193
|
+
ldx #0
|
|
194
|
+
!:
|
|
195
|
+
lda tbtext,x
|
|
196
|
+
beq !+
|
|
197
|
+
jsr CHROUT
|
|
198
|
+
inx
|
|
199
|
+
bne !-
|
|
200
|
+
!:
|
|
201
|
+
lda tb_hi
|
|
202
|
+
jsr hexbyte
|
|
203
|
+
lda tb_lo
|
|
204
|
+
jsr hexbyte
|
|
205
|
+
lda #$0d
|
|
206
|
+
jsr CHROUT
|
|
207
|
+
rts
|
|
208
|
+
|
|
209
|
+
hexbyte: // print A as two hex digits
|
|
210
|
+
pha
|
|
211
|
+
lsr
|
|
212
|
+
lsr
|
|
213
|
+
lsr
|
|
214
|
+
lsr
|
|
215
|
+
jsr hexdigit
|
|
216
|
+
pla
|
|
217
|
+
and #$0f
|
|
218
|
+
hexdigit:
|
|
219
|
+
cmp #10
|
|
220
|
+
bcc !+
|
|
221
|
+
adc #6
|
|
222
|
+
!:
|
|
223
|
+
adc #'0'
|
|
224
|
+
jmp CHROUT
|
|
225
|
+
|
|
226
|
+
tb_lo: .byte 0
|
|
227
|
+
tb_hi: .byte 0
|
|
228
|
+
|
|
229
|
+
.encoding "petscii_upper"
|
|
230
|
+
header:
|
|
231
|
+
.text "PWM DIGI, VOICE 1, PULSE AT FN=$FFFF"
|
|
232
|
+
.byte $0d
|
|
233
|
+
.text "CARRIER 3849 HZ PAL / 3995 HZ NTSC"
|
|
234
|
+
.byte $0d
|
|
235
|
+
.text "128 CYCLES PER SAMPLE"
|
|
236
|
+
.byte $0d
|
|
237
|
+
.text "RATE 7697 HZ PAL / 7990 HZ NTSC"
|
|
238
|
+
.byte $0d
|
|
239
|
+
.text "TONE 240 HZ PAL / 250 HZ NTSC"
|
|
240
|
+
.byte $0d, 0
|
|
241
|
+
text: .text "RESULT "
|
|
242
|
+
.byte 0
|
|
243
|
+
passtext: .text " PASS"
|
|
244
|
+
.byte $0d, 0
|
|
245
|
+
failtext: .text " FAIL"
|
|
246
|
+
.byte $0d, 0
|
|
247
|
+
tbtext: .text "TIMER B $"
|
|
248
|
+
.byte 0
|
|
249
|
+
|
|
250
|
+
// 256 unsigned 8-bit samples, 8 sine periods per table (gen_sample.py)
|
|
251
|
+
sample:
|
|
252
|
+
.byte $80, $98, $b0, $c6, $da, $ea, $f5, $fd, $ff, $fd, $f5, $ea, $da, $c6, $b0, $98
|
|
253
|
+
.byte $80, $67, $4f, $39, $25, $15, $0a, $02, $00, $02, $0a, $15, $25, $39, $4f, $67
|
|
254
|
+
.byte $7f, $98, $b0, $c6, $da, $ea, $f5, $fd, $ff, $fd, $f5, $ea, $da, $c6, $b0, $98
|
|
255
|
+
.byte $80, $67, $4f, $39, $25, $15, $0a, $02, $00, $02, $0a, $15, $25, $39, $4f, $67
|
|
256
|
+
.byte $7f, $98, $b0, $c6, $da, $ea, $f5, $fd, $ff, $fd, $f5, $ea, $da, $c6, $b0, $98
|
|
257
|
+
.byte $80, $67, $4f, $39, $25, $15, $0a, $02, $00, $02, $0a, $15, $25, $39, $4f, $67
|
|
258
|
+
.byte $7f, $98, $b0, $c6, $da, $ea, $f5, $fd, $ff, $fd, $f5, $ea, $da, $c6, $b0, $98
|
|
259
|
+
.byte $80, $67, $4f, $39, $25, $15, $0a, $02, $00, $02, $0a, $15, $25, $39, $4f, $67
|
|
260
|
+
.byte $7f, $98, $b0, $c6, $da, $ea, $f5, $fd, $ff, $fd, $f5, $ea, $da, $c6, $b0, $98
|
|
261
|
+
.byte $80, $67, $4f, $39, $25, $15, $0a, $02, $00, $02, $0a, $15, $25, $39, $4f, $67
|
|
262
|
+
.byte $7f, $98, $b0, $c6, $da, $ea, $f5, $fd, $ff, $fd, $f5, $ea, $da, $c6, $b0, $98
|
|
263
|
+
.byte $80, $67, $4f, $39, $25, $15, $0a, $02, $00, $02, $0a, $15, $25, $39, $4f, $67
|
|
264
|
+
.byte $7f, $98, $b0, $c6, $da, $ea, $f5, $fd, $ff, $fd, $f5, $ea, $da, $c6, $b0, $98
|
|
265
|
+
.byte $7f, $67, $4f, $39, $25, $15, $0a, $02, $00, $02, $0a, $15, $25, $39, $4f, $67
|
|
266
|
+
.byte $7f, $98, $b0, $c6, $da, $ea, $f5, $fd, $ff, $fd, $f5, $ea, $da, $c6, $b0, $98
|
|
267
|
+
.byte $80, $67, $4f, $39, $25, $15, $0a, $02, $00, $02, $0a, $15, $25, $39, $4f, $67
|
|
268
|
+
|
|
269
|
+
pwlo: .fill 256, 0
|
|
270
|
+
pwhi: .fill 256, 0
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
The sample table was produced by this script and pasted in; the listing
|
|
274
|
+
does not depend on it at build time:
|
|
275
|
+
|
|
276
|
+
```text
|
|
277
|
+
#!/usr/bin/env python3
|
|
278
|
+
# gen_sample.py: 256 unsigned 8-bit samples holding 8 periods of a sine,
|
|
279
|
+
# printed as KickAssembler .byte lines.
|
|
280
|
+
import math
|
|
281
|
+
CYCLES = 8
|
|
282
|
+
vals = [round(127.5 + 127.5 * math.sin(2 * math.pi * CYCLES * i / 256))
|
|
283
|
+
for i in range(256)]
|
|
284
|
+
vals = [max(0, min(255, v)) for v in vals]
|
|
285
|
+
for row in range(0, 256, 16):
|
|
286
|
+
print(" .byte " + ", ".join("$%02x" % v for v in vals[row:row + 16]))
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Build
|
|
290
|
+
|
|
291
|
+
```bash
|
|
292
|
+
java -jar KickAss.jar pwm-digi.asm -o pwm-digi.prg -showmem
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
Produces `pwm-digi.prg`, code and data from `$080e` to `$0cfd`
|
|
296
|
+
(KickAssembler 5.25, `-showmem`): 256 bytes of sample, two 256-byte
|
|
297
|
+
pulse-width tables filled at start, and the rest code and text.
|
|
298
|
+
|
|
299
|
+
## Expected output
|
|
300
|
+
|
|
301
|
+
Border green. Text area still the power-on blue. Screen rows 7 to 13:
|
|
302
|
+
|
|
303
|
+
```
|
|
304
|
+
PWM DIGI, VOICE 1, PULSE AT FN=$FFFF
|
|
305
|
+
CARRIER 3849 HZ PAL / 3995 HZ NTSC
|
|
306
|
+
128 CYCLES PER SAMPLE
|
|
307
|
+
RATE 7697 HZ PAL / 7990 HZ NTSC
|
|
308
|
+
TONE 240 HZ PAL / 250 HZ NTSC
|
|
309
|
+
RESULT 01 PASS
|
|
310
|
+
TIMER B $BFFF
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
`TIMER B $BFFF` is `$FFFF` less 16,384, the number of samples: one timer A
|
|
314
|
+
underflow per sample and none missed. Screenshots from the pinned run,
|
|
315
|
+
8,000,000 cycles: `screenshots/pwm-digi.png` (PAL) and
|
|
316
|
+
`screenshots/pwm-digi-ntsc.png` (NTSC), decoded with the char ROM: the
|
|
317
|
+
seven lines above on rows 7 to 13 on both models, border pixel (2, 100) =
|
|
318
|
+
(98, 213, 50) on PAL and (114, 189, 103) on NTSC, palette index 5. Each
|
|
319
|
+
model was run twice and the two PNGs were byte-identical.
|
|
320
|
+
|
|
321
|
+
The numbers on screen are arithmetic from the constants in the listing and
|
|
322
|
+
the two clocks (985,248 Hz PAL, 1,022,727 Hz NTSC): carrier
|
|
323
|
+
`65535 × clock ÷ 16,777,216`, sample rate `clock ÷ 128`, tone `rate ÷ 32`.
|
|
324
|
+
The tone was measured, see below.
|
|
325
|
+
|
|
326
|
+
## The sound, measured without ears
|
|
327
|
+
|
|
328
|
+
Nobody listened to this. The PAL build was run without `-warp` with
|
|
329
|
+
`-sound -sounddev wav -soundarg out.wav -limitcycles 5500000`, once with
|
|
330
|
+
`-sidmodel 0` (reSID 6581) and once with `-sidmodel 1` (reSID 8580); the
|
|
331
|
+
windowless build has the `wav` driver (its log lists
|
|
332
|
+
`coreaudio dummy dump fs wav voc iff aiff soundmovie`). VICE wrote a 48,000 Hz
|
|
333
|
+
mono 16-bit file of 2.582 s, and reported `resampling, pass to 21600Hz`.
|
|
334
|
+
A Python script (`wave` and `numpy`) found the tone by RMS, from 0.060 s to
|
|
335
|
+
2.220 s of the file, 2.160 s, against 16,384 × 128 ÷ 985,248 = 2.129 s by
|
|
336
|
+
arithmetic.
|
|
337
|
+
|
|
338
|
+
| Measurement | reSID 6581 | reSID 8580 |
|
|
339
|
+
|---|---|---|
|
|
340
|
+
| Strongest raw component above 1 kHz | 3,848.6 Hz | 3,848.6 Hz |
|
|
341
|
+
| Dominant component after a 12-sample (250 µs) moving average, 20 Hz to 1 kHz | 240.5 Hz | 240.5 Hz |
|
|
342
|
+
| Rising zero crossings of the averaged signal | 240.3 Hz | 238.5 Hz |
|
|
343
|
+
| Carrier line relative to the tone line | −7 dB | −7 dB |
|
|
344
|
+
| Carrier sidebands at ±240.5 Hz, relative to the carrier line | −8 dB, −8 dB | −8 dB, −8 dB |
|
|
345
|
+
| Second harmonic of the tone, 481.1 Hz | −42 dB | −42 dB |
|
|
346
|
+
| RMS of the averaged signal, 16-bit units | 3,358 | 2,494 |
|
|
347
|
+
|
|
348
|
+
The dB rows are from a second script (`analyse_db.py` beside the first):
|
|
349
|
+
the raw file from 0.2 s to 2.1 s, a Hann window, eight times zero padding,
|
|
350
|
+
the peak magnitude within 3 Hz of each arithmetic frequency, ratios of
|
|
351
|
+
those peaks. They are given to the whole decibel because the choice of
|
|
352
|
+
window and segment moves them by up to a decibel (an earlier version of
|
|
353
|
+
this table gave them to a tenth, from a script that was not kept).
|
|
354
|
+
|
|
355
|
+
The carrier is `65535 × 985,248 ÷ 16,777,216 = 3,848.6 Hz` by arithmetic
|
|
356
|
+
and the measured raw peak agrees to the tenth. The recovered tone is
|
|
357
|
+
240.5 Hz, which is `985,248 ÷ 128 ÷ 32 = 240.54 Hz`; a 127-cycle period
|
|
358
|
+
would have given 242.4 Hz, so the measurement also settles that a CIA
|
|
359
|
+
latch of 127 is a 128-cycle period. The carrier is not above the audible
|
|
360
|
+
band (the SID cannot go higher than `$FFFF`), and at about 7 dB below the
|
|
361
|
+
tone it is audible as a whistle in this recording; that is a property of the
|
|
362
|
+
method, not of this listing. The 8580 model is quieter by the ratio
|
|
363
|
+
2,494 ÷ 3,358 = 0.74, about 2.6 dB, with the same spectrum; reSID's two
|
|
364
|
+
models differ in level here, not in shape. A real 6581 or 8580 was not
|
|
365
|
+
measured.
|
|
366
|
+
|
|
367
|
+
## Why this works
|
|
368
|
+
|
|
369
|
+
The pulse comparator turns the top twelve bits of the 24-bit phase
|
|
370
|
+
accumulator into a one-bit output: high while they are at or above the
|
|
371
|
+
pulse width. At `$FFFF` the accumulator advances by 65,535 every cycle, so
|
|
372
|
+
one pulse period is 16,777,216 ÷ 65,535 = 256.004 cycles. Within that
|
|
373
|
+
period the output is high for a fraction the pulse width sets, and the
|
|
374
|
+
mean of the voice output over a period is that fraction times full scale.
|
|
375
|
+
The envelope is held at sustain 15 (attack 0, sustain 15, gate on and left
|
|
376
|
+
on), so the voice output is the waveform at full amplitude and the mean
|
|
377
|
+
follows the pulse width alone. Everything downstream of the voice, the
|
|
378
|
+
mixer, the output amplifier and the coupling to the speaker, averages a
|
|
379
|
+
3.85 kHz square wave the way any low-pass does; the moving average in the
|
|
380
|
+
analysis script stands in for that.
|
|
381
|
+
|
|
382
|
+
The sample is written as two bytes: bits 7 to 4 into `$D402` bits 7 to 4
|
|
383
|
+
and bits 3 to 0 into `$D403` bits 3 to 0, so 256 sample levels map on to
|
|
384
|
+
the 12-bit pulse width in steps of 16. Nothing is lost by that: at `$FFFF`
|
|
385
|
+
the top twelve bits of the accumulator step by 16 each cycle (65,535 ÷
|
|
386
|
+
4,096 = 15.99), so the low four bits of the pulse width are below the
|
|
387
|
+
phase step, and the 8-bit sample in bits 11 to 4 already uses every duty
|
|
388
|
+
level the carrier can resolve in one period, 4,096 ÷ 16 = 256 of them.
|
|
389
|
+
|
|
390
|
+
Two tables are built at start so that the loop is two loads and two
|
|
391
|
+
stores per sample. On the passing path the body is 31 cycles by the
|
|
392
|
+
instruction table: the poll `lda $DD0D` / `and #1` / `beq` is 8, the two
|
|
393
|
+
loads, two stores, `inx` and taken `bne` are 21, and both `lda abs,x`
|
|
394
|
+
cross a page for one more cycle each, because KickAssembler places
|
|
395
|
+
`pwlo` at `$0AFE` and `pwhi` at `$0BFE`, so every index from 2 upward
|
|
396
|
+
reads into the next page (an earlier version of this page said 32, which
|
|
397
|
+
was neither the 29 the annotations then summed to nor the 31 the
|
|
398
|
+
placement gives; a `.align $100` before `pwlo` would make it 29). The
|
|
399
|
+
loads and stores without the poll were timed on their own: a variant with
|
|
400
|
+
the three poll instructions removed, timer A free-running from `$FFFF`
|
|
401
|
+
and the screen blanked took 43,220 cycles over 2,048 samples, 21.1 per
|
|
402
|
+
sample, which is the 21 of the table plus the `dey` / `bne` once per 256.
|
|
403
|
+
Against a 128-cycle period the verdict shows the loop never fell behind
|
|
404
|
+
on either model. The remaining 97 cycles per sample are the budget a real
|
|
405
|
+
program has for everything else, less what the VIC-II takes: with the
|
|
406
|
+
screen on, a badline stalls the CPU for 40 to 43 cycles once every eight
|
|
407
|
+
raster lines, and any IRQ or NMI adds jitter to the write times. This
|
|
408
|
+
listing runs under `sei` with the screen on.
|
|
409
|
+
|
|
410
|
+
The floor is well above 31 with the screen on, and the reason is the
|
|
411
|
+
badline. `PERIOD` was swept on PAL with everything else unchanged,
|
|
412
|
+
6,000,000 cycles per run, and the screen read with the char ROM; two rows
|
|
413
|
+
were then repeated with `$D011 = $0B` written before the loop and `$1B`
|
|
414
|
+
after it, which blanks the display and stops badline DMA:
|
|
415
|
+
|
|
416
|
+
| `PERIOD` | Screen | Verdict | Timer B | Underflows against 16,384 samples |
|
|
417
|
+
|---|---|---|---|---|
|
|
418
|
+
| 28 | on | 02 FAIL | `$B506` | 19,193 |
|
|
419
|
+
| 30 | on | 02 FAIL | `$BA02` | 17,917 |
|
|
420
|
+
| 31 | on | 02 FAIL | `$BC43` | 17,340 |
|
|
421
|
+
| 32 | on | 02 FAIL | `$BD42` | 17,085 |
|
|
422
|
+
| 33 | on | 02 FAIL | `$BD2A` | 17,109 |
|
|
423
|
+
| 34 | on | 02 FAIL | `$BD10` | 17,135 |
|
|
424
|
+
| 36 | on | 02 FAIL | `$BCE6` | 17,177 |
|
|
425
|
+
| 32 | blanked | 02 FAIL | `$BFFE` | 16,385 |
|
|
426
|
+
| 36 | blanked | 01 PASS | `$BFFF` | 16,384 |
|
|
427
|
+
| 128 | on | 01 PASS | `$BFFF` | 16,384 |
|
|
428
|
+
|
|
429
|
+
Below 31 the loop is simply too slow and the excess is large. From 32
|
|
430
|
+
upward the excess grows with the period instead of shrinking, which a
|
|
431
|
+
loop that is merely too slow cannot produce. It is the badline: the poll
|
|
432
|
+
reads and clears the flag, so two underflows between one poll and the
|
|
433
|
+
next count as one sample, and a badline puts 40 to 43 cycles between two
|
|
434
|
+
polls that are otherwise 31 apart. At any period below about 31 + 43 =
|
|
435
|
+
74 cycles a badline can swallow an underflow, and a longer period means a
|
|
436
|
+
longer run, 16,384 × `PERIOD` cycles, which crosses more badlines: at
|
|
437
|
+
`PERIOD` 32 the run is 524,288 cycles, 26.7 PAL frames of 19,656, about
|
|
438
|
+
667 badlines at 25 a frame, and the excess was 701; at 36 it is 750
|
|
439
|
+
badlines against an excess of 793. With the screen blanked `PERIOD` 36
|
|
440
|
+
keeps exact pace. `PERIOD` 32 blanked reads one underflow too many, and
|
|
441
|
+
that one is the readout, not a lost sample: timer B is read 34 cycles
|
|
442
|
+
after the last poll's read of `$DD0D` by the instruction table, and the
|
|
443
|
+
poll itself can be up to nine cycles late in seeing the flag, so at a
|
|
444
|
+
period of 32 the next underflow lands before the read, while at 36 it
|
|
445
|
+
does not. Periods between 36 and 128 were not tried, and the CIA model is
|
|
446
|
+
not the variable (`PERIOD` 32 with `-ciamodel 1` gave the same `$BD42`).
|
|
447
|
+
A program that needs a rate near the loop's floor should measure its own
|
|
448
|
+
period the way this listing does, with timer B, with the display it will
|
|
449
|
+
really run under.
|
|
450
|
+
|
|
451
|
+
CIA 2 is used rather than CIA 1 so that the KERNAL's jiffy timer keeps
|
|
452
|
+
running and nothing has to be restored on exit. Writing `$7F` to `$DD0D`
|
|
453
|
+
and reading it once masks and clears CIA 2 as an NMI source; the RESTORE
|
|
454
|
+
key is not a CIA source and would still fire, which this listing does not
|
|
455
|
+
guard against. Timer B is started before timer A with input mode 10
|
|
456
|
+
(count timer A underflows), so it sees the first underflow; the pass
|
|
457
|
+
condition is timer B = `$FFFF` − 16,384 exactly, read a few cycles after
|
|
458
|
+
the last flag was consumed and before the next underflow.
|
|
459
|
+
|
|
460
|
+
Verified: assembled with KickAssembler 5.25, run headless in the
|
|
461
|
+
windowless VICE x64sc 3.10 build with the pinned command on PAL and NTSC,
|
|
462
|
+
screenshots decoded with the char ROM; the sound figures are from the WAV
|
|
463
|
+
the same build wrote, analysed in Python, not heard.
|