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,349 @@
|
|
|
1
|
+
<!-- doc-type: reference -->
|
|
2
|
+
|
|
3
|
+
# Demo Composition
|
|
4
|
+
|
|
5
|
+
How a multi-part C64 demo is put together: what one part owes the next, how a
|
|
6
|
+
part ends, how long anything is allowed to run, how the music survives the
|
|
7
|
+
joins, and in what order the work gets done. These are design patterns, not
|
|
8
|
+
techniques. Each one names the techniques and recipes that realise it; the
|
|
9
|
+
mechanics live on those pages. `./demo-design-philosophy.md` covers why demos
|
|
10
|
+
exist and the lifecycle of a release; this page starts where a group has parts
|
|
11
|
+
on disk and has to make a demo out of them.
|
|
12
|
+
|
|
13
|
+
No archetype covers a full multi-part demo; the nearest are `demo_intro` and
|
|
14
|
+
`dentro`, and `party_intro_4k` inherits the same rules at a smaller scale.
|
|
15
|
+
Sources are named in prose. Nothing here was measured on this machine unless a
|
|
16
|
+
sentence says which repo page did.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## part_lifecycle — What one part owes the next
|
|
21
|
+
|
|
22
|
+
**Kind:** structure
|
|
23
|
+
**Applies to:** demo_intro, dentro, party_intro_4k
|
|
24
|
+
**Realised by:** irq_chain_table, stable_raster_irq, multi_load_sequencing, sparkle_irq_loader, krill_loader_integration, vic_bank_select, memory_layout_plan, sid_play_routine_pattern, irq-chain, memory-layout, sid-music-player
|
|
25
|
+
**Sources:** Linus Åkesson, Spindle v2 documentation (2015); Raistlin, Stopping Music Popping (2023)
|
|
26
|
+
|
|
27
|
+
**Checks:**
|
|
28
|
+
- Every part writes $D011, $D012, $D015, $D016, $D018 and $DD02 before its first frame is shown.
|
|
29
|
+
- No part writes $DD00 when it runs under a loader that owns that register.
|
|
30
|
+
- After a part's clean-up returns, the IRQ vector points at a handler the next part installed, not at a handler in memory the next part has loaded over.
|
|
31
|
+
- The music play routine is entered exactly once per frame during a part's preparation and fade-out.
|
|
32
|
+
- No load in the disk image overlaps a page range the next part declares inherited.
|
|
33
|
+
|
|
34
|
+
**Why.** A part written on its own assumes a clean machine. A part in a demo
|
|
35
|
+
follows another part, and inherits whatever that part left in the VIC, the
|
|
36
|
+
SID, the interrupt vector and RAM. Åkesson's Spindle documentation makes the
|
|
37
|
+
contract explicit because the loader runs between parts and needs to know what
|
|
38
|
+
each one touches. The same contract holds with any loader, or with none.
|
|
39
|
+
|
|
40
|
+
**The shape.** Åkesson divides a part into six routines that the framework
|
|
41
|
+
calls in order. In this page's words:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
stage runs with IRQs job
|
|
45
|
+
prepare enabled build tables and speedcode, copy data; no VIC writes
|
|
46
|
+
set up disabled write the VIC registers and colour RAM; fast
|
|
47
|
+
interrupt (is the IRQ) the effect's per-frame work; vector at $FFFE
|
|
48
|
+
main enabled framebuffer effects that do not reach full frame rate
|
|
49
|
+
fade out enabled raise a flag the effect reads; return "done" when the fade has finished
|
|
50
|
+
clean up enabled tear down: stop interrupts, wait for a chosen raster line
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Preparation of the next part overlaps the current part's run, which is why
|
|
54
|
+
prepare may not write VIC registers: the screen still belongs to the part on
|
|
55
|
+
display. The next part's remaining data finishes loading after fade out
|
|
56
|
+
reports done and before clean up is called (Åkesson).
|
|
57
|
+
|
|
58
|
+
What a part hands back is what it owned: the interrupt vector, the six VIC
|
|
59
|
+
registers in the first check, the sprite enable bits, the SID registers its
|
|
60
|
+
effects wrote, and any memory it did not declare as inherited. Åkesson lists
|
|
61
|
+
the registers to re-initialise because the previous part may leave unexpected
|
|
62
|
+
values in them; that is the pattern.
|
|
63
|
+
|
|
64
|
+
**Memory inheritance.** Two adjacent parts may not overlap in RAM unless the
|
|
65
|
+
second declares that it inherits a page range from the first. Åkesson's linker
|
|
66
|
+
inserts a filler part when two neighbours collide: a black screen with no
|
|
67
|
+
badlines and an interrupt handler that only calls the music player. A
|
|
68
|
+
deliberate filler is the seam a transition is built in. The loader keeps a
|
|
69
|
+
fixed region ($0C00 to $0DFF in Spindle v2) and may write a further page and
|
|
70
|
+
four zero-page bytes while loading, so a part's memory plan starts by
|
|
71
|
+
subtracting those.
|
|
72
|
+
|
|
73
|
+
**Music across the boundary.** One player is active at a time, and each part's
|
|
74
|
+
handler carries a three-byte placeholder the linker turns into the call to the
|
|
75
|
+
installed player (Åkesson). The handler has to be entered every frame through
|
|
76
|
+
preparation, fade out and clean up, or the tune skips; see
|
|
77
|
+
`music_continuity_across_parts` below.
|
|
78
|
+
|
|
79
|
+
**What breaks when it is skipped.** A part that trusts $D018 from its
|
|
80
|
+
standalone build shows the wrong charset for a frame after a part that moved
|
|
81
|
+
it. A part that leaves $D015 set hands the next part its sprites. A part that
|
|
82
|
+
disables interrupts and never re-enables them before the switch kills the
|
|
83
|
+
music at the join. A part that uses $0E00 while the next one loads is
|
|
84
|
+
overwritten from under itself.
|
|
85
|
+
|
|
86
|
+
**Variations.** A megademo (see `pacing_and_length`) resets between parts, so
|
|
87
|
+
the contract shrinks to leaving the disk readable. A one-file intro has no
|
|
88
|
+
contract, and the six stages are still the order to write it in.
|
|
89
|
+
|
|
90
|
+
Related: `../techniques/loaders-packers.md` (`multi_load_sequencing`),
|
|
91
|
+
`../techniques/raster.md` (`irq_chain_table`),
|
|
92
|
+
`../techniques/memory-banking.md` (`memory_layout_plan`).
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## transition_conditions — Three ways a part ends
|
|
97
|
+
|
|
98
|
+
**Kind:** behaviour
|
|
99
|
+
**Applies to:** demo_intro, dentro, party_intro_4k
|
|
100
|
+
**Realised by:** screen_wipe, colour_fade, colour_cycling, keyboard_matrix_scan, sid_play_routine_pattern, screen-wipe, colour-fade, colour-cycling
|
|
101
|
+
**Sources:** Linus Åkesson, Spindle v2 documentation; Dane, interviewed by Magic in Vandalism News 65
|
|
102
|
+
|
|
103
|
+
**Checks:**
|
|
104
|
+
- A part whose end condition is the space bar advances on that key and on no other.
|
|
105
|
+
- A part whose end condition is drop-through advances only after the next part's scheduled load has completed.
|
|
106
|
+
- A part whose end condition is an address reaching a value advances on the frame the player writes that value, and does not advance if the tune is stopped.
|
|
107
|
+
- The fade-out stage reports done before the clean-up stage runs.
|
|
108
|
+
- No frame between two parts shows the first part's screen with the second part's colours.
|
|
109
|
+
|
|
110
|
+
**Why.** A part has to know when it is over. Åkesson's script format has three
|
|
111
|
+
answers. **The shape:** each part carries one condition.
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
condition meaning used for
|
|
115
|
+
key (space) wait for the viewer early builds; megademo parts
|
|
116
|
+
drop-through end as soon as the next part is loaded parts that exist to cover a load
|
|
117
|
+
address = value wait until RAM holds a value music sync: the player's song position
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The third is how a demo runs to its soundtrack. Åkesson's example reads the
|
|
121
|
+
player's song position from a zero-page byte, so a part ends on a pattern
|
|
122
|
+
boundary rather than a frame count. The condition is met, the fade-out stage
|
|
123
|
+
runs until it reports done, then the switch happens; a part that fades over
|
|
124
|
+
two seconds has to be told to end two seconds early.
|
|
125
|
+
|
|
126
|
+
**The judgement.** Dane, on the soundtrack of Edge of Disgrace, describes the
|
|
127
|
+
job as solving the memory and raster-time limits without letting the viewer
|
|
128
|
+
see where either ran out. Applied to a join, that is the test: a transition
|
|
129
|
+
reads as forced when the viewer can see the limit that caused it. A cut to
|
|
130
|
+
black because two parts collide in memory, a pause because the disk had not
|
|
131
|
+
finished, a fade keyed to a raster count instead of the tune. The fix is not a
|
|
132
|
+
faster effect over the seam; it is moving the condition so the seam falls
|
|
133
|
+
where the music already has one.
|
|
134
|
+
|
|
135
|
+
**What breaks when it is skipped.** A part timed by a frame counter drifts
|
|
136
|
+
against the tune by one frame per missed play call. A part ended by the loader
|
|
137
|
+
alone ends at a different moment on a 1541, on an SD2IEC and in VICE. A part
|
|
138
|
+
that waits for space in the final build stops the demo on the big screen.
|
|
139
|
+
|
|
140
|
+
**Variations.** A demo mixes the three: space everywhere during development
|
|
141
|
+
(Åkesson's advice), address-equals-value once the tune is in, drop-through for
|
|
142
|
+
filler parts. A 4K intro with no loader has the first and third.
|
|
143
|
+
|
|
144
|
+
Related: `../techniques/transitions.md`,
|
|
145
|
+
`./demo-design-philosophy.md` section 5 (transitions as an aesthetic
|
|
146
|
+
site), `music_continuity_across_parts` below.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## pacing_and_length — How long anything may run
|
|
151
|
+
|
|
152
|
+
**Kind:** composition
|
|
153
|
+
**Applies to:** demo_intro, dentro, party_intro_4k
|
|
154
|
+
**Realised by:** multi_load_sequencing, big_font_2x2, dycp_scroller, big-font-scroller, dycp-scroller, sine-scroller
|
|
155
|
+
**Sources:** Raistlin, X 2023 Demo Compo: A Look Back (2023); Goto80, The First Megademos (2021); Cascade release notes (1998)
|
|
156
|
+
|
|
157
|
+
**Checks:**
|
|
158
|
+
- No single effect stays on screen for more than about twenty seconds without a visible change of state.
|
|
159
|
+
- The part that runs across the disk flip loops until the flip is detected and shows a scroller.
|
|
160
|
+
- Every part in the final build advances without a key press unless the design names it a megademo.
|
|
161
|
+
- No effect in the final build runs below the frame rate its design states.
|
|
162
|
+
- The final build's running time, measured start to end, is within ten percent of the figure in the part list.
|
|
163
|
+
|
|
164
|
+
**Why.** The audience at a party sees the demo once, projected, in a row of
|
|
165
|
+
other demos. Length and dwell are the two numbers they feel directly.
|
|
166
|
+
|
|
167
|
+
**Two structural families.** Goto80's history of the megademo separates the
|
|
168
|
+
forms. A megademo is a run of discrete parts; the viewer presses a key to
|
|
169
|
+
reach the next, tolerates a break for a loader or a menu, and needs no common
|
|
170
|
+
theme, so the next part can be anything. A trackmo drops the loading part and
|
|
171
|
+
streams the next part from disk with no visible break, and then the name
|
|
172
|
+
megademo stops fitting. The C64 megademos he lists all date from 1987; 6581
|
|
173
|
+
Crew and Finland Cracking Service are among the six groups named. A megademo
|
|
174
|
+
part is a complete short programme with its own ending; a trackmo part is a
|
|
175
|
+
paragraph in a longer piece.
|
|
176
|
+
|
|
177
|
+
**The numbers.** Raistlin's look back at X 2023 states the rules Genesis
|
|
178
|
+
Project set for No Bounds: do not dwell on an effect for more than twenty
|
|
179
|
+
seconds however long it took to write, and a total running time close to ten
|
|
180
|
+
minutes. He gives the field's running times as Mojo and Wonderland XIV about
|
|
181
|
+
sixteen and a half minutes, Multiverse about eighteen, Next Level about
|
|
182
|
+
twenty-one, and calls fifteen minutes and more the new norm for the bigger
|
|
183
|
+
demos. He takes the blame for his own demo running short and leaning on code
|
|
184
|
+
while the others carried far more art and flipped sides quickly. The dwell
|
|
185
|
+
rule held up; the ten-minute total did not. Both figures are his, from one
|
|
186
|
+
competition.
|
|
187
|
+
|
|
188
|
+
**The disk flip.** Raistlin describes No Bounds' turn-disk part as a greetings
|
|
189
|
+
scroller long enough to cover the flip and then some, kept because it looked
|
|
190
|
+
good. The scroller at the flip is the standard placement: a part that can run
|
|
191
|
+
indefinitely while the viewer changes sides, and that has to be there anyway
|
|
192
|
+
(the boast tradition, `./demo-design-philosophy.md` section 5).
|
|
193
|
+
|
|
194
|
+
**What reads as unfinished.** Raistlin's note on another entry's fight
|
|
195
|
+
sequence is that it wanted more animation and a higher frame rate: the
|
|
196
|
+
audience cannot see the code but can see a slideshow. Cascade's note on Trip
|
|
197
|
+
to Nepa(l) (1998) says trouble linking the parts left the whole demo slow
|
|
198
|
+
paced, the other visible form: parts each fine, a whole that drags.
|
|
199
|
+
|
|
200
|
+
**What breaks when it is skipped.** Without a dwell rule the hardest effect
|
|
201
|
+
stays up for a minute because it was hard, and the room's attention leaves
|
|
202
|
+
after twenty seconds. Without a length figure against the part list the demo
|
|
203
|
+
is short against the field or padded.
|
|
204
|
+
|
|
205
|
+
**Variations.** A 4K intro keeps the dwell rule and runs the length of its
|
|
206
|
+
tune. A single-file demo has no flip and puts the scroller at the end.
|
|
207
|
+
|
|
208
|
+
Related: `./demo-design-philosophy.md` sections 2 and 5,
|
|
209
|
+
`transition_conditions` above, `composition_workflow` below.
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## music_continuity_across_parts — One play call per frame, always
|
|
214
|
+
|
|
215
|
+
**Kind:** behaviour
|
|
216
|
+
**Applies to:** demo_intro, dentro, party_intro_4k, cracktro
|
|
217
|
+
**Realised by:** sid_play_routine_pattern, irq_chain_table, stable_raster_irq, frame_sync_loop, pal_ntsc_detection, sid-music-player, irq-chain, pal-ntsc-detect
|
|
218
|
+
**Sources:** Raistlin, Stopping Music Popping (2023); Linus Åkesson, Spindle v2 documentation; Dane, Vandalism News 65
|
|
219
|
+
|
|
220
|
+
**Checks:**
|
|
221
|
+
- Consecutive entries to the play routine are 19,656 cycles apart on PAL, within the tolerance the design states, on every frame of a run that crosses every part boundary.
|
|
222
|
+
- Consecutive entries to the play routine are 17,095 cycles apart on NTSC under the same rule.
|
|
223
|
+
- No frame between the first play call and the end of the demo has zero play calls or two.
|
|
224
|
+
- The play call is the first thing the interrupt handler does, or it has an interrupt of its own.
|
|
225
|
+
- When the play call moves to a different raster line between two parts, it moves by steps and not in one frame.
|
|
226
|
+
|
|
227
|
+
**Why.** A SID tune is a sequence of register writes that assume one call per
|
|
228
|
+
frame. Raistlin's article names the moments a demo breaks that assumption:
|
|
229
|
+
initialising a new part, the transition into it, and the final switch when the
|
|
230
|
+
IRQ vector changes. Each can drop a call or make two, and the result is an
|
|
231
|
+
audible pop or a lurch in the tempo.
|
|
232
|
+
|
|
233
|
+
**The figure.** A PAL frame is 312 raster lines of 63 cycles: 312 × 63 =
|
|
234
|
+
19,656 cycles. An NTSC frame on the 6567R8 is 263 lines of 65 cycles: 263 × 65
|
|
235
|
+
= 17,095 cycles. Both are arithmetic from the line counts on
|
|
236
|
+
`../hardware/pal-ntsc-reference.md`; the PAL sum is also the figure Raistlin
|
|
237
|
+
states, and that page measured it in VICE x64sc with a CIA timer latch. The
|
|
238
|
+
NTSC figure stands on arithmetic and that page's table.
|
|
239
|
+
|
|
240
|
+
**The shape.** The play call sits at a fixed point in the frame. Raistlin's
|
|
241
|
+
two fixes are ordering and sliding. Ordering: make the play call the first
|
|
242
|
+
thing the handler does, or give it its own interrupt, so variable-time code
|
|
243
|
+
cannot move it. Sliding: when the new part wants its call on a different
|
|
244
|
+
raster line, move it over several frames; his example walks the call from line
|
|
245
|
+
255 to line 50 in steps of about twenty lines over eleven frames. He allows
|
|
246
|
+
about five to ten percent variance during a transition and expects the exact
|
|
247
|
+
figure in steady state.
|
|
248
|
+
|
|
249
|
+
Dane's remark on Edge of Disgrace is the design-side half: the music is
|
|
250
|
+
written to each part's memory and raster budget, and a continuous soundtrack
|
|
251
|
+
is hard for that reason. The composer knows which parts have raster time for a
|
|
252
|
+
heavy player and which do not, and the player's cost is a line in the part's
|
|
253
|
+
budget from the start, not a surprise at linking.
|
|
254
|
+
|
|
255
|
+
**Detection.** Raistlin traces execution of the play routine's address in the
|
|
256
|
+
VICE monitor, logs each hit with its clock to a file, and differences
|
|
257
|
+
consecutive clocks; any gap that is not the figure is a fault. The same
|
|
258
|
+
monitor commands (`trace`, `logname`, `log on`) are documented for another
|
|
259
|
+
purpose on `../runtime/vice-reference.md`; a trace of a play routine across a
|
|
260
|
+
part boundary is not measured here. A trace on stores to $D400 to $D418 asks
|
|
261
|
+
the same question from the register side.
|
|
262
|
+
|
|
263
|
+
**What breaks when it is skipped.** One dropped call is a click. A doubled
|
|
264
|
+
call is a note that lands early. A call that moves from line 255 to line 50 in
|
|
265
|
+
one frame gives one short gap of 312 − 255 + 50 = 107 lines, 107 × 63 = 6,741
|
|
266
|
+
cycles, about a third of a frame (Raistlin calls it about half), and the tempo
|
|
267
|
+
stumbles once. In a trace, a missed call shows as a gap near 39,312 cycles and
|
|
268
|
+
a doubled call as one near zero. On NTSC a tune written for PAL runs faster by
|
|
269
|
+
19,656 ÷ 17,095, which is a separate fault with a separate page
|
|
270
|
+
(`../pitfalls/region-timing.md`).
|
|
271
|
+
|
|
272
|
+
**Variations.** A demo that changes tune between parts has the same problem at
|
|
273
|
+
the join: the old player's last call and the new one's first want the same
|
|
274
|
+
spacing. A cracktro with one part has only the initialisation case.
|
|
275
|
+
|
|
276
|
+
Related: `../techniques/music-sid.md` (`sid_play_routine_pattern`),
|
|
277
|
+
`../pitfalls/region-timing.md`, `../hardware/pal-ntsc-reference.md`,
|
|
278
|
+
`part_lifecycle` above.
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## composition_workflow — The order the work goes in
|
|
283
|
+
|
|
284
|
+
**Kind:** production
|
|
285
|
+
**Applies to:** demo_intro, dentro, party_intro_4k
|
|
286
|
+
**Realised by:** multi_load_sequencing, memory_layout_plan, exomizer_basics, memory-layout
|
|
287
|
+
**Sources:** Dane, Vandalism News 65; Linus Åkesson, Spindle v2 documentation; psenough, Teach Yourself Demoscene in 14 Days; Phoenix, NVScene 2014 report in Hugi 38 (2014)
|
|
288
|
+
|
|
289
|
+
**Checks:**
|
|
290
|
+
- The first linked build runs every part in order with a key press between them and no transitions.
|
|
291
|
+
- The second linked build runs to the tune with every part ended by a song position.
|
|
292
|
+
- Transitions are added only after a build exists that runs end to end on the tune.
|
|
293
|
+
|
|
294
|
+
**Why.** The whole is assembled last and under a fixed deadline. The order in
|
|
295
|
+
which the pieces are made decides how much of the deadline goes to polish and
|
|
296
|
+
how much to firefighting.
|
|
297
|
+
|
|
298
|
+
**The shape, from two shipped accounts.** Dane, on Booze Design's process: for
|
|
299
|
+
Uncensored the theme was decided at a gathering in the summer of 2014 and the
|
|
300
|
+
linking order came naturally from it; nothing is decided early. For Edge of
|
|
301
|
+
Disgrace, HCL stacked up previews of effects, the group worked toward
|
|
302
|
+
coherency, and when HCL stopped making effects they linked the demo in
|
|
303
|
+
chronological order over about six months, HCL linking one more effect or
|
|
304
|
+
transition and Dane adjusting or composing to it; the soundtrack changed
|
|
305
|
+
almost daily. Most of the work on Uncensored was done in the three months, and
|
|
306
|
+
the forty-eight hours, before the deadline. Read as an order: theme, then
|
|
307
|
+
linking order, then effects fitted to both, with the last quarter of the
|
|
308
|
+
calendar carrying most of the load.
|
|
309
|
+
|
|
310
|
+
Åkesson, from the tool side, gives four steps. Put the parts in a script in
|
|
311
|
+
order of increasing interest with every transition set to the space bar. Add
|
|
312
|
+
the tune and switch every transition to a song position so the music drives
|
|
313
|
+
the demo; this is the rough cut. Build the transitions, biggest first, such as
|
|
314
|
+
an intermediate part that brings in a background picture ahead of the effect
|
|
315
|
+
that uses it. Then polish the switchovers that glitch, with clean-up routines
|
|
316
|
+
that stop interrupts and wait for a chosen raster line. Åkesson's reason for
|
|
317
|
+
leaving transitions until the order is fixed is that once it is, inherit tags
|
|
318
|
+
and transitions can rely on it. Two practices sit alongside the steps and have
|
|
319
|
+
no observable on the binary: write the part order, the total time and the
|
|
320
|
+
owner of each join down before the last quarter of the calendar, and show each
|
|
321
|
+
art-heavy part to someone other than its coder before the deadline.
|
|
322
|
+
|
|
323
|
+
**Who owns what.** psenough's guide puts the demo's overall design, from
|
|
324
|
+
concept through the arrangement of scenes to the joins, with the graphician
|
|
325
|
+
more often than not: the coder produces effects, the composer a tune to each
|
|
326
|
+
part's budget, and someone holds the order and the joins. The guide also
|
|
327
|
+
advises a schedule buffer of twenty to fifty percent over the honest estimate,
|
|
328
|
+
and starting small.
|
|
329
|
+
|
|
330
|
+
**Paintovers.** Phoenix's report on NVScene 2014 records Pixtur introducing
|
|
331
|
+
paintovers to get feedback on colour and tone before a release. The method, as
|
|
332
|
+
the name says, is to let others paint over a work-in-progress frame; that
|
|
333
|
+
description is this page's, not the report's. On a sixteen-colour machine this
|
|
334
|
+
is cheap and the alternative is finding out at the projector.
|
|
335
|
+
|
|
336
|
+
**What breaks when it is skipped.** Transitions built before the order is
|
|
337
|
+
fixed are rebuilt when it moves. A tune commissioned before the part budgets
|
|
338
|
+
are known is too heavy for the part that needs raster time or too thin for the
|
|
339
|
+
part that had it. A demo linked in the last week ships the pacing fault
|
|
340
|
+
Cascade described. An unwritten part order means the group learns the running
|
|
341
|
+
time at the party.
|
|
342
|
+
|
|
343
|
+
**Variations.** A one-coder 4K intro collapses the roles into one person and
|
|
344
|
+
keeps the four steps. A megademo skips the transition steps and spends them on
|
|
345
|
+
each part's own ending.
|
|
346
|
+
|
|
347
|
+
Related: `./demo-design-philosophy.md` section 4 (the release lifecycle,
|
|
348
|
+
which this pattern refines), `pacing_and_length` above,
|
|
349
|
+
`../techniques/loaders-packers.md`.
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
<!-- doc-type: reference -->
|
|
2
|
+
|
|
3
|
+
# Demo Design Philosophy
|
|
4
|
+
|
|
5
|
+
This document covers the aesthetic, cultural, and structural conventions of the C64 demo scene.
|
|
6
|
+
It is the *why* behind technique choices — the social context that gives those techniques meaning.
|
|
7
|
+
For the technical implementation of individual effects, see `../techniques/effects-vector-3d.md`,
|
|
8
|
+
`../techniques/loaders-packers.md`, and the other files in `../techniques/`. For the cracktro
|
|
9
|
+
subset and intro conventions, see `./intro-cracktro-patterns.md`.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. The Demo as Performance
|
|
14
|
+
|
|
15
|
+
A C64 demo is not a program that happens to run. It is a released artifact — something that exists
|
|
16
|
+
publicly, has been voted on, has been reviewed, and carries its group's name into the permanent
|
|
17
|
+
record. That distinction matters because it shapes every creative and technical decision a demo
|
|
18
|
+
coder makes.
|
|
19
|
+
|
|
20
|
+
The primary venue for a demo is a party. Demoparties assemble sceners in one place — historically
|
|
21
|
+
in Scandinavia but now distributed globally — project demos on a large screen in front of an
|
|
22
|
+
audience, and run a live vote. The vote result is published immediately. A production that places
|
|
23
|
+
first in a 64K intro compo at a well-regarded party earns a kind of public certificate that "this
|
|
24
|
+
is good by peer consensus." That certificate is permanent: it lives in the CSDb record.
|
|
25
|
+
|
|
26
|
+
**CSDb (csdb.dk)** is the modern release archive and community review board for C64 scene
|
|
27
|
+
productions. Every serious release is catalogued there with a release date, party affiliation,
|
|
28
|
+
download links, and user ratings. CSDb ratings aggregate scene opinion over years, so a demo
|
|
29
|
+
released in 2008 still accretes votes in 2024 as new people discover it. This long tail of
|
|
30
|
+
evaluation makes the scene's collective aesthetic judgment unusually robust compared to ephemeral
|
|
31
|
+
web hype.
|
|
32
|
+
|
|
33
|
+
**Compo demo vs uploaded release:** A compo demo is submitted to a party competition, shown live,
|
|
34
|
+
and voted on in real time. An uploaded release is self-published to CSDb (or formerly to ftp
|
|
35
|
+
sites) without competitive context. Compo demos carry more prestige because the deadline is hard,
|
|
36
|
+
the audience is expert, and the vote is honest. Uploaded releases still matter — many important
|
|
37
|
+
productions circulate that way — but the community understands the difference. A release that
|
|
38
|
+
"was never in a compo" is not lesser by definition, but it lacks the proof-of-pressure that compo
|
|
39
|
+
placement provides.
|
|
40
|
+
|
|
41
|
+
The phrase "released" in scene culture means more than "exists." It means: polished to the point
|
|
42
|
+
where the group was willing to put their name on it in public, under deadline, in front of peers.
|
|
43
|
+
An internal build that leaks is not released. A demo shown at a party but never uploaded is
|
|
44
|
+
technically released but imperfectly archived. The full release cycle closes when a clean binary
|
|
45
|
+
appears on CSDb with accurate credits.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 2. Compo Categories and Constraints
|
|
50
|
+
|
|
51
|
+
Parties divide productions into categories with strict size or content rules. The C64 scene has
|
|
52
|
+
developed its own conventions for each category.
|
|
53
|
+
|
|
54
|
+
### 256-Byte Intro
|
|
55
|
+
|
|
56
|
+
The entire binary — code and data — must fit in 256 bytes. This is a severe constraint on a
|
|
57
|
+
machine where a single sprite definition occupies 63 bytes. The art form is almost entirely about
|
|
58
|
+
what you can procedurally generate: mathematical patterns, Lissajous curves, sine-wave effects,
|
|
59
|
+
simple rasterized geometry. Assembly is mandatory; no compiler overhead survives at this scale.
|
|
60
|
+
|
|
61
|
+
The technical-versus-art balance tilts almost entirely to technical: the aesthetic is the
|
|
62
|
+
algorithm itself. A 256-byte entry that produces something visually unexpected wins because the
|
|
63
|
+
audience understands how little room existed. Scroller text is usually absent or reduced to a
|
|
64
|
+
single static message printed at cost. Tune is either borrowed from ROM or generated by a minimal
|
|
65
|
+
wavetable that fits in the remaining bytes.
|
|
66
|
+
|
|
67
|
+
### 1K Intro
|
|
68
|
+
|
|
69
|
+
At 1024 bytes, 1K intros can contain a short SID tune and one or two distinct visual effects.
|
|
70
|
+
The design challenge is sequencing: the demo needs to feel like it goes somewhere — intro,
|
|
71
|
+
effect, outro — within extreme constraint. Crunching (compression with a decompressor header)
|
|
72
|
+
is standard but the decompressor itself costs bytes, so packing efficiency is critical.
|
|
73
|
+
|
|
74
|
+
The aesthetic expectation shifts slightly toward polish. A 1K intro that shows a clean plasma
|
|
75
|
+
effect with a synchronized tune beat is judged differently than one that shows the same plasma
|
|
76
|
+
untimed. The beat synchronization requires reserving bytes for a timing table or computing beat
|
|
77
|
+
from the SID frame counter — small costs that pay outsized aesthetic dividends.
|
|
78
|
+
|
|
79
|
+
### 4K Intro
|
|
80
|
+
|
|
81
|
+
Four kilobytes allows a short but coherent demo. Typical content: a one-minute SID tune, two to
|
|
82
|
+
four effects in sequence, group logo or rasterized scroller, and at least one transition. The
|
|
83
|
+
4K category is highly competitive because it is achievable by a small team — a coder and a
|
|
84
|
+
musician — without the production overhead of a full demo.
|
|
85
|
+
|
|
86
|
+
Groups like Genesis Project have produced landmark 4K work that demonstrates the category's
|
|
87
|
+
ceiling: procedural geometry, smooth palette cycling, and tight tune synchronization within a
|
|
88
|
+
tiny binary. The 4K format rewards coders who have deeply internalized the hardware: every byte
|
|
89
|
+
saved is a byte available for one more effect frame or one more palette entry.
|
|
90
|
+
|
|
91
|
+
### 64K Intro ("Mini-Demo")
|
|
92
|
+
|
|
93
|
+
At 64 kilobytes, the intro is large enough to contain multiple SID tunes, complex loading
|
|
94
|
+
sequences (if the 64K includes a loader), and richer visual sequences. Some parties call this
|
|
95
|
+
a "mini-demo" to distinguish it from the uncapped full-demo category. The boundary is cultural
|
|
96
|
+
more than technical — a 64K intro might run longer than a conventional demo from 1988.
|
|
97
|
+
|
|
98
|
+
The production challenge at 64K is organizational: the team needs a coder, musician, graphician,
|
|
99
|
+
and sometimes a separate "design lead" to make sure the parts hang together aesthetically. Size
|
|
100
|
+
management is still real — 64K is not infinite — but asset quality is the dominant constraint.
|
|
101
|
+
A 64K intro with mediocre SID work will lose to one with an outstanding tune even if the visuals
|
|
102
|
+
are comparable.
|
|
103
|
+
|
|
104
|
+
### Demo (Full, No Strict Size Cap)
|
|
105
|
+
|
|
106
|
+
The full demo category has no mandated size ceiling, though practical limits apply: a disk-based
|
|
107
|
+
C64 demo must fit on one or two sides of a 1541 disk (approximately 165K or 330K usable). Most
|
|
108
|
+
full demos run four to eight minutes, contain three to six distinct parts separated by loaders,
|
|
109
|
+
and feature coordinated work from a coder, musician, and graphician.
|
|
110
|
+
|
|
111
|
+
Full demos are where the scene's most ambitious aesthetic experiments appear. Multi-part
|
|
112
|
+
construction with per-part loaders (see `../techniques/loaders-packers.md`) allows each part to
|
|
113
|
+
own the full 64K address space. A group can write one part in Oscar64 targeting a plasma effect
|
|
114
|
+
and another part in hand-tuned assembly targeting a sprite-multiplexed 3D rotation, with the
|
|
115
|
+
loader transition between them handling decompression and relocation. The full demo format is
|
|
116
|
+
the main competitive prize at major parties.
|
|
117
|
+
|
|
118
|
+
### Wild Compo
|
|
119
|
+
|
|
120
|
+
Wild compo accepts anything the party organizers will permit: hardware expansions, mixed-media
|
|
121
|
+
productions, demos running from unusual storage, real-time performances with external peripherals.
|
|
122
|
+
C64 entries in wild categories have included productions that modify the hardware in real time,
|
|
123
|
+
demos that display output on oscilloscopes driven by the SID, and entries that use the cassette
|
|
124
|
+
port in unintended ways. Wild compos reward lateral thinking over optimization; the judging
|
|
125
|
+
criterion is audience reaction.
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
## 3. Scene Tiers
|
|
130
|
+
|
|
131
|
+
The C64 scene is not a single aesthetic community. It contains at least three recognizable
|
|
132
|
+
sensibilities that have evolved over four decades.
|
|
133
|
+
|
|
134
|
+
### Newschool
|
|
135
|
+
|
|
136
|
+
The newschool aesthetic emerged from the competitive intro categories in the 2000s and 2010s.
|
|
137
|
+
It prioritizes mathematical rigor and visual density: procedural geometry, voxel-style terrain,
|
|
138
|
+
mode 7 perspective, 3D vector objects (see `../techniques/effects-vector-3d.md`), and tunnel
|
|
139
|
+
effects running at maximum frame rate. The visual language often echoes demoscene productions
|
|
140
|
+
on platforms with more CPU headroom — treating the C64 constraint as proof of craft rather than
|
|
141
|
+
as a source of aesthetic vocabulary.
|
|
142
|
+
|
|
143
|
+
Newschool productions in the 256-byte and 4K categories frequently achieve things that appear
|
|
144
|
+
impossible on a 1 MHz 6510, which is precisely the point. The audience reaction is calibrated
|
|
145
|
+
to technical astonishment. Tune choices tend toward chip-music styles that complement the
|
|
146
|
+
geometric visuals rather than emulating older SID styles.
|
|
147
|
+
|
|
148
|
+
### Oldschool
|
|
149
|
+
|
|
150
|
+
The oldschool aesthetic draws on the visual vocabulary of C64 demos from roughly 1986 to 1992:
|
|
151
|
+
raster bars, hardware sprite multiplexing, FLD-style scrollers, charset animation, and SID
|
|
152
|
+
tunes in the three-voice synth tradition. Oldschool is not nostalgia by default — it is a
|
|
153
|
+
deliberate aesthetic position that treats the platform's native visual grammar as valid art.
|
|
154
|
+
|
|
155
|
+
The most celebrated modern oldschool productions include **Edge of Disgrace** by Booze Design
|
|
156
|
+
(released 2008, widely regarded as one of the finest C64 full demos) and **Comaland** by Censor
|
|
157
|
+
Design (released 2014, similarly acclaimed). Both productions are extensively documented on CSDb
|
|
158
|
+
and have been analyzed in technical write-ups by their authors. They demonstrate that the
|
|
159
|
+
oldschool format supports creative ambition at the same level as any contemporary platform.
|
|
160
|
+
Groups like Triad, Resource, and Fairlight have maintained continuous oldschool output across
|
|
161
|
+
decades, and their aesthetic consistency is part of what makes their releases identifiable.
|
|
162
|
+
|
|
163
|
+
### Wild
|
|
164
|
+
|
|
165
|
+
The wild tier is not a competitive category but a mode of production. Wild-tier thinking asks:
|
|
166
|
+
what can the hardware do if we ignore the expected use? Demos that drive external hardware,
|
|
167
|
+
that treat audio output as primary and visual output as secondary, that run from storage media
|
|
168
|
+
the machine was not designed for — these are wild in sensibility regardless of which compo they
|
|
169
|
+
enter. Some groups produce both competitive oldschool demos and wild-tier experiments in the same
|
|
170
|
+
year.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 4. The Released-Demo Lifecycle
|
|
175
|
+
|
|
176
|
+
Understanding how demos get made illuminates why they look the way they do.
|
|
177
|
+
|
|
178
|
+
**Concept.** A demo begins as an idea for a sequence or a theme — often loose. "We want a
|
|
179
|
+
tunnel leading into a 3D rotation with a SID tune that builds from ambient to loud." The concept
|
|
180
|
+
rarely survives first contact with hardware constraints unchanged, but having a concept before
|
|
181
|
+
writing code is the mark of a production-mode group rather than a tech-demo group.
|
|
182
|
+
|
|
183
|
+
**Tune commissioned.** For groups that collaborate across physical locations, the musician
|
|
184
|
+
typically works first. A SID tune has a fixed length and structure — the musician delivers a
|
|
185
|
+
file, usually a .sid or a raw binary, and the coder builds timing tables around it. Commissioning
|
|
186
|
+
the tune before or during early effect prototyping means the visual sequence can be choreographed
|
|
187
|
+
to the music's actual beat grid rather than retrofitted later.
|
|
188
|
+
|
|
189
|
+
**Effect prototyping.** Individual effects are developed independently, often by separate coders.
|
|
190
|
+
An effect prototype in Oscar64 or KickAssembler runs as a standalone binary — it is not
|
|
191
|
+
integrated into the demo shell yet. This is the longest phase and the one most subject to scope
|
|
192
|
+
creep. A plasma effect that runs at 25 FPS on PAL gets profiled and optimized; if it cannot hit
|
|
193
|
+
the target, the design adapts.
|
|
194
|
+
|
|
195
|
+
**Asset production.** Graphicians produce sprites, charset tiles, Koala-format bitmap screens,
|
|
196
|
+
and logo art in parallel with effect prototyping. C64 graphic formats are extremely constrained
|
|
197
|
+
(see the file formats reference), so graphicians working at production quality understand the
|
|
198
|
+
hardware palette, multicolor restrictions, and sprite overlay techniques. A graphician who does
|
|
199
|
+
not know that FLI (Flexible Line Interpretation) requires cycle-exact timing is a liability in
|
|
200
|
+
a competitive demo.
|
|
201
|
+
|
|
202
|
+
**Integration.** The demo shell is assembled: loader, parts, inter-part transitions, tune player,
|
|
203
|
+
memory banking. This phase often reveals conflicts — two effects that independently work cleanly
|
|
204
|
+
cannot both live in the same part because they need overlapping zero-page addresses or conflict
|
|
205
|
+
on a CIA timer. Integration is where `c64_check_compatibility` queries (in the KB) find their
|
|
206
|
+
real-world equivalent: the coder manually auditing what each part uses and resolving collisions.
|
|
207
|
+
|
|
208
|
+
**Final-party-pressure crunch.** Most demos are still not feature-complete two weeks before the
|
|
209
|
+
party. The deadline is fixed and public — the party will happen whether or not the demo is ready.
|
|
210
|
+
This creates a forcing function that compels decisions: cut the fourth part, fix the scroller
|
|
211
|
+
text typo, accept the one scanline flicker in the transition, release. The crunch is not
|
|
212
|
+
dysfunction; it is the design mechanism that prevents infinite scope creep. Productions that miss
|
|
213
|
+
parties and get uploaded later often feel slightly overlong precisely because they lacked the
|
|
214
|
+
forcing function.
|
|
215
|
+
|
|
216
|
+
**Why "released" means polished.** The party vote is brutal. Audience members vote on what they
|
|
217
|
+
see projected, in real time, having watched the preceding entries. A demo that crashes does not
|
|
218
|
+
recover gracefully — the audience watches a frozen screen until the organizer resets the machine.
|
|
219
|
+
A demo that runs to completion but has a visually weak ending loses to one that has a strong last
|
|
220
|
+
thirty seconds. This pressure produces a very specific kind of polish: demos are end-to-end
|
|
221
|
+
correct, not just technically impressive in isolation.
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 5. Aesthetic Tropes
|
|
226
|
+
|
|
227
|
+
Certain conventions are so embedded in C64 demo culture that their presence or absence is itself
|
|
228
|
+
a statement.
|
|
229
|
+
|
|
230
|
+
**Amazing transitions.** The transition between parts or effects is a primary aesthetic site.
|
|
231
|
+
Palette splits, screen-clearing raster sweeps, charset swap flickers, and DRAM-fade techniques
|
|
232
|
+
all serve the same function: marking the boundary between visual ideas without cutting to black
|
|
233
|
+
abruptly. A well-designed transition makes the demo feel like a continuous performance rather
|
|
234
|
+
than a playlist. Groups that are known for their visual sophistication — Crest, Genesis Project,
|
|
235
|
+
Onslaught — treat transitions as first-class effects requiring their own development time.
|
|
236
|
+
|
|
237
|
+
**Tune sync.** An effect that responds visually to the music's beat grid reads as deliberately
|
|
238
|
+
designed rather than accidentally happening at the same time as the music. Tune sync can be
|
|
239
|
+
implemented via hardcoded timing tables derived from the musician's tempo, via CIA timer
|
|
240
|
+
comparisons, or via live SID voice-amplitude sampling. The simplest version — synchronized raster
|
|
241
|
+
bar expansion on the beat — is immediately legible to any scene audience. Complex tune sync, where
|
|
242
|
+
multiple visual parameters modulate independently to different frequency bands, is a marker of
|
|
243
|
+
production-quality ambition.
|
|
244
|
+
|
|
245
|
+
**The boast tradition.** Demo culture derives in part from cracking culture, where inserting your
|
|
246
|
+
group's name into a commercial release was the primary form of attribution. The demo form
|
|
247
|
+
inherited the tradition: every demo carries a visible group signature, a scroller with greetings
|
|
248
|
+
to allied groups, and a credits sequence. The greetings scroller is simultaneously social bonding
|
|
249
|
+
(publicly acknowledging relationships within the scene) and territorial marking (your group name
|
|
250
|
+
is on this production, permanently). Groups like F4CG, Hokuto Force, and Resource have
|
|
251
|
+
maintained distinctive greeting styles across decades of releases.
|
|
252
|
+
|
|
253
|
+
**Why scrollers exist.** The hardware scroller emerged from the CIA-timer-driven hardware scroll
|
|
254
|
+
registers as a way to display more text than fit on screen without flicker. A smooth one-pixel-
|
|
255
|
+
per-frame left-scroll of a character row is nearly free on the 6510 if implemented in hardware
|
|
256
|
+
scroll mode (via VIC-II's fine scroll register, with software column shifting once per full
|
|
257
|
+
character width). This made scrollers the natural medium for group messaging: unlimited text,
|
|
258
|
+
smooth motion, zero per-character cost. What began as a technical affordance became a social
|
|
259
|
+
institution. A demo without a scroller in the oldschool tradition reads as deliberately minimalist.
|
|
260
|
+
The scroller's content — the actual text — is the demo group's primary direct communication with
|
|
261
|
+
the viewer, often more personal and candid than any other medium available to the coders at the
|
|
262
|
+
time.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## 6. Modern Revival
|
|
267
|
+
|
|
268
|
+
The C64 demo scene did not end when the Amiga arrived or when the PC became dominant. It
|
|
269
|
+
contracted, reorganized, and continued. From roughly 2005 onward, the scene entered a sustained
|
|
270
|
+
revival driven by several forces: emulator accuracy (VICE reaching cycle-exact fidelity),
|
|
271
|
+
hardware preservation (SD2IEC, Ultimate II+ making physical machines more accessible), and
|
|
272
|
+
the emergence of younger sceners encountering the platform via its cultural legacy rather than
|
|
273
|
+
childhood ownership.
|
|
274
|
+
|
|
275
|
+
**Edge of Disgrace** (Booze Design, 2008) is the most frequently cited landmark of the modern
|
|
276
|
+
revival. It demonstrated that a full oldschool-style C64 demo released in the 2000s could be
|
|
277
|
+
not merely competent but genuinely surprising — technically and aesthetically. Its documentation
|
|
278
|
+
at CSDb includes author notes that make it useful as a reference for production methodology, not
|
|
279
|
+
just a thing to watch.
|
|
280
|
+
|
|
281
|
+
**Comaland** (Censor Design, 2014) continued the revival's trajectory, demonstrating that the
|
|
282
|
+
platform's ceiling had not been reached and that groups with deep institutional knowledge could
|
|
283
|
+
continue pushing it. Both productions are well-documented at CSDb and have been discussed in
|
|
284
|
+
technical detail by their authors, making them safe references.
|
|
285
|
+
|
|
286
|
+
The post-2010 scene has also seen growth in the competitive intro categories. The 4K and 256-byte
|
|
287
|
+
categories attract technically focused coders for whom the constraint itself is the creative
|
|
288
|
+
medium. These productions often participate in cross-platform parties where C64 entries compete
|
|
289
|
+
alongside Amiga, PC, and console productions in platform-specific categories. Cross-platform
|
|
290
|
+
party exposure has drawn sceners from other platforms who then specialize in C64, refreshing the
|
|
291
|
+
scene's technical approach.
|
|
292
|
+
|
|
293
|
+
The question of "firsts" — first C64 demo to achieve X — is a live area of scene discourse.
|
|
294
|
+
The C64 demo scene tracks technical firsts carefully, but attributing any specific first to a
|
|
295
|
+
specific production without checking CSDb risks propagating error. Agents retrieving this chunk
|
|
296
|
+
should use `c64_search` with specific technical terms and cross-reference against CSDb records
|
|
297
|
+
rather than relying on any static claim here.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## 7. Cross-References
|
|
302
|
+
|
|
303
|
+
- `./intro-cracktro-patterns.md` — The cracktro subset: intro conventions derived from cracking
|
|
304
|
+
culture, boast formatting, loader integration, and the specific aesthetic of the release-group
|
|
305
|
+
intro. This document is being written in parallel (Phase 6, Task 7).
|
|
306
|
+
|
|
307
|
+
- `../techniques/effects-vector-3d.md` — Technical implementation of the effects that appear
|
|
308
|
+
in newschool and oldschool demos: plasma, tunnel, voxel, mode 7 perspective, 3D vector
|
|
309
|
+
rotation. The philosophy sections above describe why these effects are used and what audience
|
|
310
|
+
reaction they are calibrated for; this reference covers how they are implemented.
|
|
311
|
+
|
|
312
|
+
- `../techniques/loaders-packers.md` — Multi-part demo workflow, Krill/Exomizer/Sparkle
|
|
313
|
+
loader integration, and the GCR-level disk tricks that enable fast loading. Full demos depend
|
|
314
|
+
on this infrastructure; the lifecycle section above describes how loaders fit into the
|
|
315
|
+
integration phase of production.
|
|
316
|
+
|
|
317
|
+
- `./demo-composition.md`: the design patterns for a multi-part demo, one level below the
|
|
318
|
+
lifecycle in section 4: what a part hands to the next, the three ways a part ends, dwell and
|
|
319
|
+
length norms, keeping the music play call one frame apart across every join, and the order
|
|
320
|
+
the linking work goes in.
|