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,197 @@
|
|
|
1
|
+
// music.asm: an original three-voice tune and the player that plays it,
|
|
2
|
+
// behind the init/play convention most tracker exports use
|
|
3
|
+
// (sid_play_routine_pattern): JSR $1000 once with A = subtune, JSR $1003
|
|
4
|
+
// once a frame. To use a GoatTracker or other export instead, replace this
|
|
5
|
+
// file with the tune's binary at $1000 (`.import binary`, header stripped)
|
|
6
|
+
// and keep the two calls; the NTSC tempo skip lives in the framework.
|
|
7
|
+
//
|
|
8
|
+
// This player's one extension of the convention: X = 0 (PAL) or 1 (NTSC) at
|
|
9
|
+
// init picks the frequency table, so the pitch is right on both clocks.
|
|
10
|
+
//
|
|
11
|
+
// The tune: A minor, F, C, G; a sawtooth bass, a pulse arpeggio that steps
|
|
12
|
+
// through the chord every frame, and noise and triangle drums on voice 3.
|
|
13
|
+
// 32 steps of 7 frames: 224 frames a loop, 4.48 s on PAL.
|
|
14
|
+
|
|
15
|
+
* = $1000 "music"
|
|
16
|
+
MUSIC_INIT: jmp m_init
|
|
17
|
+
MUSIC_PLAY: jmp m_play
|
|
18
|
+
|
|
19
|
+
.const STEP_FRAMES = 7
|
|
20
|
+
.const STEPS = 32
|
|
21
|
+
.const NOTE0 = 24 // the frequency tables start at C1 (MIDI 24)
|
|
22
|
+
.const NOTES = 73 // to C7
|
|
23
|
+
|
|
24
|
+
m_init:
|
|
25
|
+
ldy #NOTES - 1 // X = model: copy that clock's table
|
|
26
|
+
!: cpx #0
|
|
27
|
+
bne !ntsc+
|
|
28
|
+
lda freq_lo_pal,y
|
|
29
|
+
sta freq_lo,y
|
|
30
|
+
lda freq_hi_pal,y
|
|
31
|
+
sta freq_hi,y
|
|
32
|
+
jmp !next+
|
|
33
|
+
!ntsc: lda freq_lo_ntsc,y
|
|
34
|
+
sta freq_lo,y
|
|
35
|
+
lda freq_hi_ntsc,y
|
|
36
|
+
sta freq_hi,y
|
|
37
|
+
!next: dey
|
|
38
|
+
bpl !-
|
|
39
|
+
lda #0
|
|
40
|
+
ldx #$18
|
|
41
|
+
!: sta $d400,x // silence every register first
|
|
42
|
+
dex
|
|
43
|
+
bpl !-
|
|
44
|
+
sta m_step
|
|
45
|
+
sta m_tick
|
|
46
|
+
sta m_arp
|
|
47
|
+
sta m_drum_left
|
|
48
|
+
lda #$09 // bass: attack 0, decay 9, sustain 10, release 9
|
|
49
|
+
sta $d405
|
|
50
|
+
lda #$a9
|
|
51
|
+
sta $d406
|
|
52
|
+
lda #$00 // arpeggio: pulse width 50 %, sustain 10
|
|
53
|
+
sta $d409
|
|
54
|
+
lda #$08
|
|
55
|
+
sta $d40a
|
|
56
|
+
lda #$00
|
|
57
|
+
sta $d40c
|
|
58
|
+
lda #$a6
|
|
59
|
+
sta $d40d
|
|
60
|
+
lda #$41 // pulse, gate on: held for the whole tune
|
|
61
|
+
sta $d40b
|
|
62
|
+
lda #$0f // volume 15, no filter
|
|
63
|
+
sta $d418
|
|
64
|
+
rts
|
|
65
|
+
|
|
66
|
+
m_play:
|
|
67
|
+
// Voice 2: the next tone of the current chord, every frame.
|
|
68
|
+
lda m_step
|
|
69
|
+
lsr
|
|
70
|
+
lsr
|
|
71
|
+
lsr // chord = step / 8
|
|
72
|
+
sta m_tmp
|
|
73
|
+
asl
|
|
74
|
+
adc m_tmp // x 3 tones
|
|
75
|
+
adc m_arp
|
|
76
|
+
tax
|
|
77
|
+
ldy chord_tones,x
|
|
78
|
+
lda freq_lo - NOTE0,y
|
|
79
|
+
sta $d407
|
|
80
|
+
lda freq_hi - NOTE0,y
|
|
81
|
+
sta $d408
|
|
82
|
+
inc m_arp
|
|
83
|
+
lda m_arp
|
|
84
|
+
cmp #3
|
|
85
|
+
bne !+
|
|
86
|
+
lda #0
|
|
87
|
+
sta m_arp
|
|
88
|
+
!:
|
|
89
|
+
// Voice 3: the running drum's pitch slide, then its gate off.
|
|
90
|
+
lda m_drum_left
|
|
91
|
+
beq !+
|
|
92
|
+
lda m_drum_hi
|
|
93
|
+
clc
|
|
94
|
+
adc m_drum_step
|
|
95
|
+
sta m_drum_hi
|
|
96
|
+
sta $d40f
|
|
97
|
+
dec m_drum_left
|
|
98
|
+
bne !+
|
|
99
|
+
lda m_drum_wave
|
|
100
|
+
sta $d412 // gate off: the release runs
|
|
101
|
+
!:
|
|
102
|
+
// A new step on tick 0.
|
|
103
|
+
lda m_tick
|
|
104
|
+
bne !later+
|
|
105
|
+
ldx m_step
|
|
106
|
+
ldy bass,x
|
|
107
|
+
beq !+
|
|
108
|
+
lda freq_lo - NOTE0,y
|
|
109
|
+
sta $d400
|
|
110
|
+
lda freq_hi - NOTE0,y
|
|
111
|
+
sta $d401
|
|
112
|
+
lda #$21 // sawtooth, gate on
|
|
113
|
+
sta $d404
|
|
114
|
+
!: ldy drums,x
|
|
115
|
+
beq !advance+
|
|
116
|
+
lda drum_ad - 1,y
|
|
117
|
+
sta $d413
|
|
118
|
+
lda drum_sr - 1,y
|
|
119
|
+
sta $d414
|
|
120
|
+
lda drum_hi - 1,y
|
|
121
|
+
sta m_drum_hi
|
|
122
|
+
sta $d40f
|
|
123
|
+
lda drum_step - 1,y
|
|
124
|
+
sta m_drum_step
|
|
125
|
+
lda drum_frames - 1,y
|
|
126
|
+
sta m_drum_left
|
|
127
|
+
lda drum_wave - 1,y
|
|
128
|
+
sta m_drum_wave
|
|
129
|
+
ora #$01
|
|
130
|
+
sta $d412 // gate on
|
|
131
|
+
jmp !advance+
|
|
132
|
+
!later: cmp #STEP_FRAMES - 1 // last frame of a step: gate the bass off
|
|
133
|
+
bne !advance+ // if the next step plays a note, so its
|
|
134
|
+
ldx m_step // envelope restarts cleanly
|
|
135
|
+
inx
|
|
136
|
+
txa
|
|
137
|
+
and #STEPS - 1
|
|
138
|
+
tax
|
|
139
|
+
lda bass,x
|
|
140
|
+
beq !advance+
|
|
141
|
+
lda #$20
|
|
142
|
+
sta $d404
|
|
143
|
+
!advance:
|
|
144
|
+
inc m_tick
|
|
145
|
+
lda m_tick
|
|
146
|
+
cmp #STEP_FRAMES
|
|
147
|
+
bne !+
|
|
148
|
+
lda #0
|
|
149
|
+
sta m_tick
|
|
150
|
+
lda m_step
|
|
151
|
+
clc
|
|
152
|
+
adc #1
|
|
153
|
+
and #STEPS - 1
|
|
154
|
+
sta m_step
|
|
155
|
+
!: rts
|
|
156
|
+
|
|
157
|
+
// ---- the tune ---------------------------------------------------------------
|
|
158
|
+
.function BassBar(root) {
|
|
159
|
+
.return List().add(root, 0, root + 12, root, 0, root, root + 12, root + 7)
|
|
160
|
+
}
|
|
161
|
+
bass:
|
|
162
|
+
.for (var c = 0; c < 4; c++) {
|
|
163
|
+
.var bar = BassBar(List().add(33, 29, 36, 31).get(c))
|
|
164
|
+
.for (var i = 0; i < 8; i++) { .byte bar.get(i) }
|
|
165
|
+
}
|
|
166
|
+
chord_tones: // Am, F, C, G: three tones each
|
|
167
|
+
.byte 57, 60, 64, 53, 57, 60, 55, 60, 64, 55, 59, 62
|
|
168
|
+
drums: // 1 kick, 2 snare, 3 hat
|
|
169
|
+
.for (var c = 0; c < 4; c++) {
|
|
170
|
+
.byte 1, 0, 3, 0, 2, 0, 3, 3
|
|
171
|
+
}
|
|
172
|
+
// kick snare hat
|
|
173
|
+
drum_wave: .byte $10, $80, $80
|
|
174
|
+
drum_ad: .byte $00, $00, $00
|
|
175
|
+
drum_sr: .byte $a0, $a8, $80
|
|
176
|
+
drum_hi: .byte $18, $20, $50
|
|
177
|
+
drum_step: .byte $f9, $00, $00 // kick: $18, $11, $0a, $03
|
|
178
|
+
drum_frames: .byte 3, 2, 1
|
|
179
|
+
|
|
180
|
+
// SID frequency = Hz * 2^24 / clock; A4 = 440 Hz. PAL 985,248 Hz, NTSC
|
|
181
|
+
// 1,022,727 Hz (docs/hardware/pal-ntsc-reference.md; the tables are arithmetic).
|
|
182
|
+
.function NoteHz(n) { .return 440 * pow(2, (n - 69) / 12) }
|
|
183
|
+
freq_lo_pal: .fill NOTES, <round(NoteHz(NOTE0 + i) * 16777216 / 985248)
|
|
184
|
+
freq_hi_pal: .fill NOTES, >round(NoteHz(NOTE0 + i) * 16777216 / 985248)
|
|
185
|
+
freq_lo_ntsc: .fill NOTES, <round(NoteHz(NOTE0 + i) * 16777216 / 1022727)
|
|
186
|
+
freq_hi_ntsc: .fill NOTES, >round(NoteHz(NOTE0 + i) * 16777216 / 1022727)
|
|
187
|
+
freq_lo: .fill NOTES, 0
|
|
188
|
+
freq_hi: .fill NOTES, 0
|
|
189
|
+
|
|
190
|
+
m_step: .byte 0
|
|
191
|
+
m_tick: .byte 0
|
|
192
|
+
m_arp: .byte 0
|
|
193
|
+
m_tmp: .byte 0
|
|
194
|
+
m_drum_left: .byte 0
|
|
195
|
+
m_drum_hi: .byte 0
|
|
196
|
+
m_drum_step: .byte 0
|
|
197
|
+
m_drum_wave: .byte 0
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
// part_main.asm: part 1. A character logo, eight sprites on a sine chain,
|
|
2
|
+
// four raster bars from a stable raster kernel, a 1x1 scroller on row 22.
|
|
3
|
+
//
|
|
4
|
+
// lines 51-98 logo, rows 0-4, and the subtitle, row 5
|
|
5
|
+
// lines 101-145 the sprite chain (Y 100-124): no sprite on a bar line
|
|
6
|
+
// lines 155-210 the bars, one colour per line, border and background
|
|
7
|
+
// lines 227-234 the scroller, row 22, 38 columns and XSCROLL
|
|
8
|
+
//
|
|
9
|
+
// Its chain (parts.asm): bars_slot at 148, scroll_slot at 224, frame_slot.
|
|
10
|
+
// update runs in the frame slot, below the picture: every register and
|
|
11
|
+
// table it writes is used by the next frame, so nothing tears.
|
|
12
|
+
|
|
13
|
+
.const MSG_START = 40 // the row starts full: message cells 0-39
|
|
14
|
+
|
|
15
|
+
main_init:
|
|
16
|
+
lda #0
|
|
17
|
+
sta $d020
|
|
18
|
+
sta $d021
|
|
19
|
+
sta border_colour
|
|
20
|
+
sta $d017 // every sprite register this part relies on,
|
|
21
|
+
sta $d01b // not only the ones it changes (pitfall
|
|
22
|
+
sta $d01c // sprite_registers_persist_across_state_change)
|
|
23
|
+
sta $d01d
|
|
24
|
+
ldx #7
|
|
25
|
+
!: lda #SPRITE_BLOCK
|
|
26
|
+
sta SCREEN + $3f8,x
|
|
27
|
+
lda chain_colour,x
|
|
28
|
+
sta $d027,x
|
|
29
|
+
dex
|
|
30
|
+
bpl !-
|
|
31
|
+
lda #$20 // a blank screen first: the part before may
|
|
32
|
+
ldx #0 // have ended on a hard cut, not a wipe
|
|
33
|
+
!: sta SCREEN,x // (colour RAM is left: the meter tints its cells)
|
|
34
|
+
sta SCREEN+$100,x
|
|
35
|
+
sta SCREEN+$200,x
|
|
36
|
+
sta SCREEN+$2e8,x
|
|
37
|
+
inx
|
|
38
|
+
bne !-
|
|
39
|
+
ldx #5 * 40 - 1 // the logo and the subtitle, rows 0-5
|
|
40
|
+
!: lda logo_cells,x
|
|
41
|
+
sta SCREEN,x
|
|
42
|
+
lda logo_colours,x
|
|
43
|
+
sta COLOUR,x
|
|
44
|
+
dex
|
|
45
|
+
cpx #$ff
|
|
46
|
+
bne !-
|
|
47
|
+
ldx #39
|
|
48
|
+
!: lda subtitle,x
|
|
49
|
+
sta SCREEN + 5 * 40,x
|
|
50
|
+
lda #15
|
|
51
|
+
sta COLOUR + 5 * 40,x
|
|
52
|
+
lda message,x // the scroller's row starts full
|
|
53
|
+
sta SCREEN + SCROLL_ROW * 40,x
|
|
54
|
+
lda scroll_colours,x
|
|
55
|
+
sta COLOUR + SCROLL_ROW * 40,x
|
|
56
|
+
dex
|
|
57
|
+
bpl !-
|
|
58
|
+
lda #<(message + MSG_START)
|
|
59
|
+
sta msg_read+1
|
|
60
|
+
lda #>(message + MSG_START)
|
|
61
|
+
sta msg_read+2
|
|
62
|
+
lda #7
|
|
63
|
+
sta xscroll
|
|
64
|
+
lda #CHAIN_FAULT
|
|
65
|
+
sta ph_x
|
|
66
|
+
lda #0
|
|
67
|
+
sta ph_y
|
|
68
|
+
sta ph_b
|
|
69
|
+
sta updates
|
|
70
|
+
sta updates+1
|
|
71
|
+
sta frozen
|
|
72
|
+
jsr place_sprites
|
|
73
|
+
jsr fill_bars
|
|
74
|
+
lda #$ff
|
|
75
|
+
sta $d015
|
|
76
|
+
rts
|
|
77
|
+
|
|
78
|
+
// Frame slot. Advance, then compute: after k updates the picture shows
|
|
79
|
+
// phase k * speed, which is what the verdict and gen_expect.py predict.
|
|
80
|
+
main_update:
|
|
81
|
+
lda frozen
|
|
82
|
+
bne !+
|
|
83
|
+
lda ph_x
|
|
84
|
+
clc
|
|
85
|
+
adc #CHAIN_SX
|
|
86
|
+
sta ph_x
|
|
87
|
+
lda ph_y
|
|
88
|
+
clc
|
|
89
|
+
adc #CHAIN_SY
|
|
90
|
+
sta ph_y
|
|
91
|
+
lda ph_b
|
|
92
|
+
clc
|
|
93
|
+
adc #BAR_SPEED
|
|
94
|
+
sta ph_b
|
|
95
|
+
jsr place_sprites
|
|
96
|
+
jsr fill_bars
|
|
97
|
+
jsr scroll_step
|
|
98
|
+
inc updates
|
|
99
|
+
bne !freeze+
|
|
100
|
+
inc updates+1
|
|
101
|
+
!freeze:
|
|
102
|
+
#if AUTOPILOT
|
|
103
|
+
lda updates+1 // the autopilot's fixed frame: hold still
|
|
104
|
+
bne !+
|
|
105
|
+
lda updates
|
|
106
|
+
cmp #FREEZE_UPDATES
|
|
107
|
+
bne !+
|
|
108
|
+
lda #1
|
|
109
|
+
sta frozen
|
|
110
|
+
#endif
|
|
111
|
+
!: rts
|
|
112
|
+
|
|
113
|
+
main_teardown:
|
|
114
|
+
lda #0
|
|
115
|
+
sta $d015
|
|
116
|
+
lda #$c8
|
|
117
|
+
sta $d016
|
|
118
|
+
rts
|
|
119
|
+
|
|
120
|
+
// ---- sprite chain -------------------------------------------------------------
|
|
121
|
+
// Sprite n: X = base_n + chain_sinx[ph_x + n * CHAIN_PX], Y = chain_siny[ph_y +
|
|
122
|
+
// n * CHAIN_PY]. X passes 255, so the ninth bits are gathered into $D010
|
|
123
|
+
// every frame (pitfall sprite_x_high_bit_wrong_register).
|
|
124
|
+
place_sprites:
|
|
125
|
+
.for (var n = 0; n < 8; n++) {
|
|
126
|
+
.var base = CHAIN_X0 + n * CHAIN_DX - CHAIN_AX
|
|
127
|
+
lda ph_x
|
|
128
|
+
clc
|
|
129
|
+
adc #<(n * CHAIN_PX)
|
|
130
|
+
tay
|
|
131
|
+
lda #<base
|
|
132
|
+
clc
|
|
133
|
+
adc chain_sinx,y
|
|
134
|
+
sta $d000 + 2 * n
|
|
135
|
+
lda #>base
|
|
136
|
+
adc #0
|
|
137
|
+
lsr // the ninth bit into carry, then into msb
|
|
138
|
+
ror msb
|
|
139
|
+
lda ph_y
|
|
140
|
+
clc
|
|
141
|
+
adc #<(n * CHAIN_PY)
|
|
142
|
+
tay
|
|
143
|
+
lda chain_siny,y
|
|
144
|
+
sta $d001 + 2 * n
|
|
145
|
+
}
|
|
146
|
+
lda msb // eight RORs: sprite 0's bit is bit 0
|
|
147
|
+
sta $d010
|
|
148
|
+
rts
|
|
149
|
+
|
|
150
|
+
// ---- bars -----------------------------------------------------------------------
|
|
151
|
+
// bar_colours[i] is the colour of line BARS_TOP + i. Cleared, then four
|
|
152
|
+
// 12-line ramps at sine positions; the later bar is drawn over the earlier.
|
|
153
|
+
fill_bars:
|
|
154
|
+
lda #0
|
|
155
|
+
ldx #BARS_LINES - 1
|
|
156
|
+
!: sta bar_colours,x
|
|
157
|
+
dex
|
|
158
|
+
bpl !-
|
|
159
|
+
.for (var b = 0; b < 4; b++) {
|
|
160
|
+
lda ph_b
|
|
161
|
+
clc
|
|
162
|
+
adc #<(b * BAR_STEP)
|
|
163
|
+
tay
|
|
164
|
+
ldx bar_top,y
|
|
165
|
+
ldy #0
|
|
166
|
+
!: lda ramps + b * BAR_H,y
|
|
167
|
+
sta bar_colours,x
|
|
168
|
+
inx
|
|
169
|
+
iny
|
|
170
|
+
cpy #BAR_H
|
|
171
|
+
bne !-
|
|
172
|
+
}
|
|
173
|
+
rts
|
|
174
|
+
|
|
175
|
+
// ---- the 1x1 scroller -------------------------------------------------------------
|
|
176
|
+
// XSCROLL 7 down to 0, a pixel a frame; past 0 the row moves one cell left,
|
|
177
|
+
// the next message cell comes in on the right and XSCROLL is 7 again.
|
|
178
|
+
scroll_step:
|
|
179
|
+
dec xscroll
|
|
180
|
+
bpl !done+
|
|
181
|
+
lda #7
|
|
182
|
+
sta xscroll
|
|
183
|
+
ldx #0
|
|
184
|
+
!: lda SCREEN + SCROLL_ROW * 40 + 1,x
|
|
185
|
+
sta SCREEN + SCROLL_ROW * 40,x
|
|
186
|
+
inx
|
|
187
|
+
cpx #39
|
|
188
|
+
bne !-
|
|
189
|
+
msg_read:
|
|
190
|
+
lda message // the operand is the read pointer
|
|
191
|
+
bne !+
|
|
192
|
+
lda #<message // 0 ends the message: start again
|
|
193
|
+
sta msg_read+1
|
|
194
|
+
lda #>message
|
|
195
|
+
sta msg_read+2
|
|
196
|
+
lda message
|
|
197
|
+
!: sta SCREEN + SCROLL_ROW * 40 + 39
|
|
198
|
+
inc msg_read+1
|
|
199
|
+
bne !done+
|
|
200
|
+
inc msg_read+2
|
|
201
|
+
!done: rts
|
|
202
|
+
|
|
203
|
+
// ---- the slots ----------------------------------------------------------------------
|
|
204
|
+
// Line 148: stabilise returns on cycle 51 of line 153 (both models, the
|
|
205
|
+
// monitor's numbering), then the kernel for this model (patched at start)
|
|
206
|
+
// draws lines 155 to 210.
|
|
207
|
+
bars_slot:
|
|
208
|
+
jsr stabilise
|
|
209
|
+
kernel_call:
|
|
210
|
+
jsr kernel_pal // start: kernel_ntsc on a 6567
|
|
211
|
+
rts
|
|
212
|
+
|
|
213
|
+
// Line 224: row 22 in 38-column mode with this frame's XSCROLL. The frame
|
|
214
|
+
// slot writes $C8 back at line 236, so no other row moves (pitfall
|
|
215
|
+
// xscroll_applies_to_all_rows).
|
|
216
|
+
scroll_slot:
|
|
217
|
+
lda xscroll
|
|
218
|
+
ora #$c0 // CSEL 0: 38 columns hide the column coming in
|
|
219
|
+
sta $d016
|
|
220
|
+
rts
|
|
221
|
+
|
|
222
|
+
// ---- the bar kernel -----------------------------------------------------------------
|
|
223
|
+
// One chunk a line: load the line's colour, store it to $D020 and $D021 in
|
|
224
|
+
// the horizontal blank, then wait for the next line. Measured with the VICE
|
|
225
|
+
// monitor (README, "The stable entry and the bars"): each chunk's STA $D020 starts on
|
|
226
|
+
// cycle 60 (PAL) or 62 (NTSC) of the line above, so the stores write on
|
|
227
|
+
// cycles 0 and 4 of the bar line, in the monitor's numbering (0 to 62 or 64),
|
|
228
|
+
// and the next chunk starts exactly one line later, badline or not.
|
|
229
|
+
// A normal line gives the CPU all its cycles. A badline ((line & 7) == 3
|
|
230
|
+
// with YSCROLL 3) takes the bus from the CPU for 43 cycles, so its chunk
|
|
231
|
+
// has only NOPs after the stores: all read cycles, which the VIC holds, and
|
|
232
|
+
// the stall is the rest of the line (pitfall badline_cycle_loss). No sprite
|
|
233
|
+
// may be on lines 148-211: each chunk is a fixed length, so sprite DMA on
|
|
234
|
+
// one line delays that chunk and every later one until a badline resyncs
|
|
235
|
+
// them (config.asm refuses a sprite chain that reaches these lines).
|
|
236
|
+
// cycles line length, 63 (6569) or 65 (6567R8)
|
|
237
|
+
// lead cycles from the kernel's first instruction to the first chunk
|
|
238
|
+
.macro BarKernel(cycles, lead) {
|
|
239
|
+
Delay(lead)
|
|
240
|
+
.for (var i = 0; i < BARS_LINES; i++) {
|
|
241
|
+
.var line = BARS_TOP + i
|
|
242
|
+
lda bar_colours + i // 4
|
|
243
|
+
sta $d020 // 4: writes on cycle 0 of `line`
|
|
244
|
+
sta $d021 // 4: writes on cycle 4
|
|
245
|
+
.if ((line & 7) == 3) {
|
|
246
|
+
Pad(cycles - 55) // 20 (22) cycles a badline leaves: 12 + 8 (10)
|
|
247
|
+
} else {
|
|
248
|
+
Delay(cycles - 12)
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
lda border_colour // after the last bar: the part's border
|
|
252
|
+
sta $d020 // writes on cycle 0
|
|
253
|
+
lda #0
|
|
254
|
+
sta $d021 // writes on cycle 6
|
|
255
|
+
rts
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
#if PROBE
|
|
259
|
+
.const PROBE_SHIFT = 20 // the probe build moves every store 20 cycles right
|
|
260
|
+
#else
|
|
261
|
+
.const PROBE_SHIFT = 0
|
|
262
|
+
#endif
|
|
263
|
+
// The leads put the stores mid-blank: measured with the PROBE build and the
|
|
264
|
+
// monitor (README, "The stable entry and the bars").
|
|
265
|
+
.const LEAD_PAL = 62 + PROBE_SHIFT
|
|
266
|
+
.const LEAD_NTSC = 66 + PROBE_SHIFT
|
|
267
|
+
|
|
268
|
+
kernel_pal: BarKernel(63, LEAD_PAL)
|
|
269
|
+
kernel_ntsc: BarKernel(65, LEAD_NTSC)
|
|
270
|
+
|
|
271
|
+
// ---- the part's state ---------------------------------------------------------------
|
|
272
|
+
ph_x: .byte 0
|
|
273
|
+
ph_y: .byte 0
|
|
274
|
+
ph_b: .byte 0
|
|
275
|
+
msb: .byte 0
|
|
276
|
+
xscroll: .byte 7
|
|
277
|
+
updates: .word 0
|
|
278
|
+
border_colour: .byte 0
|
|
279
|
+
bar_colours: .fill BARS_LINES, 0
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// part_title.asm: part 0, the title card. Three lines of text, the first
|
|
2
|
+
// one colour-cycled, on a black screen; the wipe takes it off. The smallest
|
|
3
|
+
// complete part: copy it to start a new one.
|
|
4
|
+
//
|
|
5
|
+
// The text sits on rows 13, 15 and 17, inside the main part's bar lines
|
|
6
|
+
// (155-210), so the bar checks in expect.json also prove it is gone.
|
|
7
|
+
|
|
8
|
+
.const TITLE_ROW = 13
|
|
9
|
+
|
|
10
|
+
title_init:
|
|
11
|
+
lda #0
|
|
12
|
+
sta $d015 // no sprites
|
|
13
|
+
sta $d020
|
|
14
|
+
sta $d021
|
|
15
|
+
lda #$c8
|
|
16
|
+
sta $d016
|
|
17
|
+
lda #$15 // screen $0400, the ROM's upper-case set
|
|
18
|
+
sta $d018
|
|
19
|
+
ldx #0
|
|
20
|
+
!: lda #$20 // the whole screen blank, white ink
|
|
21
|
+
sta SCREEN,x
|
|
22
|
+
sta SCREEN+$100,x
|
|
23
|
+
sta SCREEN+$200,x
|
|
24
|
+
sta SCREEN+$2e8,x
|
|
25
|
+
lda #1
|
|
26
|
+
sta COLOUR,x
|
|
27
|
+
sta COLOUR+$100,x
|
|
28
|
+
sta COLOUR+$200,x
|
|
29
|
+
sta COLOUR+$2e8,x
|
|
30
|
+
inx
|
|
31
|
+
bne !-
|
|
32
|
+
ldx #39
|
|
33
|
+
!: lda title_text,x
|
|
34
|
+
sta SCREEN + TITLE_ROW * 40,x
|
|
35
|
+
lda title_text+40,x
|
|
36
|
+
sta SCREEN + (TITLE_ROW + 2) * 40,x
|
|
37
|
+
lda title_text+80,x
|
|
38
|
+
sta SCREEN + (TITLE_ROW + 4) * 40,x
|
|
39
|
+
lda #14 // light blue under the second and third lines
|
|
40
|
+
sta COLOUR + (TITLE_ROW + 2) * 40,x
|
|
41
|
+
sta COLOUR + (TITLE_ROW + 4) * 40,x
|
|
42
|
+
dex
|
|
43
|
+
bpl !-
|
|
44
|
+
lda #0
|
|
45
|
+
sta title_phase
|
|
46
|
+
rts
|
|
47
|
+
|
|
48
|
+
// Each frame the first line's colours step one place along a 16-entry cycle.
|
|
49
|
+
title_update:
|
|
50
|
+
inc title_phase
|
|
51
|
+
lda title_phase
|
|
52
|
+
lsr // one step every second frame
|
|
53
|
+
sta title_tmp
|
|
54
|
+
ldx #39
|
|
55
|
+
!: lda title_tmp
|
|
56
|
+
and #$0f
|
|
57
|
+
tay
|
|
58
|
+
lda title_cycle,y
|
|
59
|
+
sta COLOUR + TITLE_ROW * 40,x
|
|
60
|
+
inc title_tmp
|
|
61
|
+
dex
|
|
62
|
+
bpl !-
|
|
63
|
+
rts
|
|
64
|
+
|
|
65
|
+
title_teardown:
|
|
66
|
+
lda #1
|
|
67
|
+
sta title_done // the verdict reads it
|
|
68
|
+
rts
|
|
69
|
+
|
|
70
|
+
.encoding "screencode_upper"
|
|
71
|
+
title_text:
|
|
72
|
+
.text " A C64-KB STARTER "
|
|
73
|
+
.text " PRESENTS "
|
|
74
|
+
.text " A DEMO FOR YOU TO FINISH "
|
|
75
|
+
title_cycle:
|
|
76
|
+
.byte 6, 6, 14, 14, 3, 3, 1, 1, 1, 1, 3, 3, 14, 14, 6, 6
|
|
77
|
+
title_phase: .byte 0
|
|
78
|
+
title_tmp: .byte 0
|
|
79
|
+
title_done: .byte 0
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// parts.asm: the demo's running order and every part's IRQ chain. To add a
|
|
2
|
+
// part: write its file (part_title.asm is the smallest model), give it a
|
|
3
|
+
// chain below, add a column to the part table, and import the file in
|
|
4
|
+
// main.asm.
|
|
5
|
+
//
|
|
6
|
+
// A part is six things:
|
|
7
|
+
// init main loop, once, with the idle chain playing the music. May be
|
|
8
|
+
// slow: decrunch, generate speedcode, draw the screen.
|
|
9
|
+
// update frame slot (IRQ), once a frame while the part plays and while
|
|
10
|
+
// its out-transition runs.
|
|
11
|
+
// out frame slot, once a frame after its frames run out, until it
|
|
12
|
+
// returns carry set. wipe_columns, or hard_cut for a cut.
|
|
13
|
+
// teardown main loop, once, before the next part's init: put back what
|
|
14
|
+
// the next part must not inherit (sprites, $D016, $D018 ...).
|
|
15
|
+
// frames how long it plays; 0 plays forever.
|
|
16
|
+
// chain its rows in the slot table: rising lines, the frame slot last.
|
|
17
|
+
|
|
18
|
+
// PART_COUNT and LOOP_PART are in config.asm.
|
|
19
|
+
// part 0 (title) part 1 (main)
|
|
20
|
+
part_init_lo: .byte <title_init, <main_init
|
|
21
|
+
part_init_hi: .byte >title_init, >main_init
|
|
22
|
+
part_update_lo: .byte <title_update, <main_update
|
|
23
|
+
part_update_hi: .byte >title_update, >main_update
|
|
24
|
+
part_out_lo: .byte <wipe_columns, <wipe_columns
|
|
25
|
+
part_out_hi: .byte >wipe_columns, >wipe_columns
|
|
26
|
+
part_teardown_lo: .byte <title_teardown, <main_teardown
|
|
27
|
+
part_teardown_hi: .byte >title_teardown, >main_teardown
|
|
28
|
+
part_frames_lo: .byte <TITLE_FRAMES, 0
|
|
29
|
+
part_frames_hi: .byte >TITLE_FRAMES, 0
|
|
30
|
+
part_chain: .byte chain_title - slots, chain_main - slots
|
|
31
|
+
|
|
32
|
+
// The slot table: every chain's rows, five bytes each (Slot in framework.asm).
|
|
33
|
+
slots:
|
|
34
|
+
chain_title:
|
|
35
|
+
Slot(FRAME_LINE, frame_slot, true)
|
|
36
|
+
chain_main:
|
|
37
|
+
StableSlot(BARS_SLOT_LINE, bars_slot, false)
|
|
38
|
+
Slot(SCROLL_LINE, scroll_slot, false)
|
|
39
|
+
Slot(FRAME_LINE, frame_slot, true)
|
|
40
|
+
chain_idle: // between parts: the music and nothing else
|
|
41
|
+
Slot(FRAME_LINE, frame_slot, true)
|
|
42
|
+
slots_end:
|
|
43
|
+
.errorif (slots_end - slots > 255), "the slot table is longer than 255 bytes"
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// tables.asm: the main part's data, built by the assembler. The sine tables
|
|
2
|
+
// round with KickAssembler's round(); tools/gen_expect.py recomputes them.
|
|
3
|
+
|
|
4
|
+
.align $100
|
|
5
|
+
// X swing, 0 to 2 * CHAIN_AX: added to base_n = CHAIN_X0 + n * CHAIN_DX - CHAIN_AX.
|
|
6
|
+
chain_sinx:
|
|
7
|
+
.fill 256, CHAIN_AX + round(CHAIN_AX * sin(toRadians(i * 360 / 256)))
|
|
8
|
+
// The Y register, CHAIN_Y0 +- CHAIN_AY.
|
|
9
|
+
chain_siny:
|
|
10
|
+
.fill 256, CHAIN_Y0 + round(CHAIN_AY * sin(toRadians(i * 360 / 256)))
|
|
11
|
+
// A bar's top line, 0 to BARS_LINES - BAR_H, as an index into bar_colours.
|
|
12
|
+
bar_top:
|
|
13
|
+
.fill 256, BARS_CENTRE + round(BARS_AMP * sin(toRadians(i * 360 / 256)))
|
|
14
|
+
.errorif (BARS_CENTRE + BARS_AMP + BAR_H > BARS_LINES), "a bar would run past the kernel"
|
|
15
|
+
|
|
16
|
+
// Four ramps, dark to light to dark (luminance order as in colour-fade.md).
|
|
17
|
+
// bar_ramps is in config.asm, so the verdict can draw the same bars.
|
|
18
|
+
ramps:
|
|
19
|
+
.for (var b = 0; b < 4; b++) {
|
|
20
|
+
.for (var i = 0; i < BAR_H; i++) .byte bar_ramps.get(b).get(i)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
chain_colour:
|
|
24
|
+
.fill 8, (i & 1) == 0 ? CHAIN_COL_A : CHAIN_COL_B
|
|
25
|
+
|
|
26
|
+
// A filled ellipse, 24 x 21, touching all four edges of the sprite box.
|
|
27
|
+
sprite_image:
|
|
28
|
+
.for (var r = 0; r < 21; r++) {
|
|
29
|
+
.var dy = (r - 10) / 10.5
|
|
30
|
+
.var hw = 12 * sqrt(1 - dy * dy)
|
|
31
|
+
.var bits = 0
|
|
32
|
+
.for (var c = 0; c < 24; c++) {
|
|
33
|
+
.var dx = c + 0.5 - 12
|
|
34
|
+
.eval bits = bits * 2 + (abs(dx) <= hw + 0.5 ? 1 : 0)
|
|
35
|
+
}
|
|
36
|
+
.byte (bits >> 16) & $ff, (bits >> 8) & $ff, bits & $ff
|
|
37
|
+
}
|
|
38
|
+
.byte 0
|
|
39
|
+
|
|
40
|
+
// The logo: "DEMO" in a 5 x 5 cell font, reverse spaces, rows 0-4.
|
|
41
|
+
.var logo_font = List().add(
|
|
42
|
+
"####. ##### #...# .###.",
|
|
43
|
+
"#...# #.... ##.## #...#",
|
|
44
|
+
"#...# ####. #.#.# #...#",
|
|
45
|
+
"#...# #.... #...# #...#",
|
|
46
|
+
"####. ##### #...# .###.")
|
|
47
|
+
.const LOGO_COL = 7
|
|
48
|
+
logo_cells:
|
|
49
|
+
.for (var r = 0; r < 5; r++) {
|
|
50
|
+
.var s = logo_font.get(r)
|
|
51
|
+
.for (var c = 0; c < 40; c++) {
|
|
52
|
+
.var k = c - LOGO_COL
|
|
53
|
+
.byte (k >= 0 && k < s.size() && s.charAt(k) == '#') ? $a0 : $20
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
logo_colours:
|
|
57
|
+
.for (var r = 0; r < 5; r++) {
|
|
58
|
+
.fill 40, List().add(4, 10, 7, 10, 4).get(r)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
scroll_colours:
|
|
62
|
+
.byte 11, 12, 15
|
|
63
|
+
.fill 34, 1
|
|
64
|
+
.byte 15, 12, 11
|
|
65
|
+
|
|
66
|
+
.encoding "screencode_upper"
|
|
67
|
+
subtitle:
|
|
68
|
+
.text " C64-KB DEMO STARTER * PART ONE "
|
|
69
|
+
message:
|
|
70
|
+
.text "HELLO FROM THE C64-KB DEMO STARTER. A PART TABLE, A TABLE-DRIVEN IRQ CHAIN, "
|
|
71
|
+
.text "A STABLE RASTER KERNEL, EIGHT SPRITES ON A SINE, FOUR BARS AND THIS SCROLLER, "
|
|
72
|
+
.text "ALL IN ONE MEASURED FRAME. ADD A PART, CHANGE THE TUNE, MAKE IT YOURS... "
|
|
73
|
+
.byte 0
|