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,435 @@
|
|
|
1
|
+
---
|
|
2
|
+
kind: demo
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<!-- doc-type: archetype-reference -->
|
|
6
|
+
|
|
7
|
+
# Cracktro and One-Screen Intro Patterns
|
|
8
|
+
|
|
9
|
+
The cracktro is the smallest self-contained unit of C64 demo aesthetics. It is a
|
|
10
|
+
one-screen production that declares a group's existence, delivers a message, and
|
|
11
|
+
exits cleanly. Understanding its conventions is prerequisite to building any larger
|
|
12
|
+
demo or game intro, because the cracktro is where every single technique — stable
|
|
13
|
+
raster, side-border open, sprite animation, SID player, scroller — appears in its
|
|
14
|
+
simplest combined form.
|
|
15
|
+
|
|
16
|
+
This page is also the archetype reference for demo forms. Each form below is an
|
|
17
|
+
`Archetype` node of kind `demo` in the graph, named by its `**Archetype:**` line;
|
|
18
|
+
its `**Technique fingerprint:**` line becomes `FEATURES` edges to techniques and its
|
|
19
|
+
`**Common pitfalls:**` line `RISKS` edges to pitfalls, and `c64_demo_briefing` reads
|
|
20
|
+
them when called with an `archetype` (`../CONVENTIONS-archetypes.md`). Technique
|
|
21
|
+
names match H2s in `../techniques/`; pitfall names match H2s in `../pitfalls/`.
|
|
22
|
+
A section without an `**Archetype:**` line is prose and is not a node.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## History
|
|
27
|
+
|
|
28
|
+
From approximately 1985 to 1995 the cracktro was a functional artifact. Cracking
|
|
29
|
+
groups stripped the copy protection from commercial games and prefixed the cracked
|
|
30
|
+
binary with a short intro: the group's name, a scroller message declaring the crack
|
|
31
|
+
version and date, greetings to allied groups, and a SID tune. The intro ran until
|
|
32
|
+
the user pressed a key, then it jumped into the game.
|
|
33
|
+
|
|
34
|
+
The cracktro served two purposes simultaneously. First, it was attribution: the
|
|
35
|
+
group claimed the crack. Second, it was social infrastructure: the greetings list
|
|
36
|
+
embedded in the scroller text was the scene's address book. A group's standing in
|
|
37
|
+
the community was partly measured by who greeted them back.
|
|
38
|
+
|
|
39
|
+
Size constraints were strict because the intro shared memory with the game. Common
|
|
40
|
+
limits were 1 KB or less — sometimes 256 bytes — because the cracked game image
|
|
41
|
+
had to fit alongside the intro in the C64's 64 KB address space. These constraints
|
|
42
|
+
forced extreme economy: every byte of code, every raster line of display time, had
|
|
43
|
+
to earn its place.
|
|
44
|
+
|
|
45
|
+
From the mid-1990s onward, cracktros became increasingly aesthetic objects in their
|
|
46
|
+
own right. Groups like Triad, Onslaught, F4CG (Fairlight's successor formation), and
|
|
47
|
+
Genesis Project continued releasing cracks with attached intros well into the 2000s
|
|
48
|
+
and 2010s. The cracktro format also migrated to demo parties as a compo category:
|
|
49
|
+
productions capped at 4 KB compete on the same terms as the 1985 originals. The
|
|
50
|
+
cracktro remains alive as a constrained art form distinct from the full demo.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Crack Intro
|
|
55
|
+
|
|
56
|
+
**Archetype:** `cracktro`
|
|
57
|
+
|
|
58
|
+
The crack intro is the canonical form, built from five elements. A canonical cracktro
|
|
59
|
+
consists of exactly five elements assembled in a fixed spatial
|
|
60
|
+
layout. Each element maps to one or more C64 techniques. The five elements are not
|
|
61
|
+
optional: omitting any one of them produces something that reads as incomplete to a
|
|
62
|
+
scene-literate viewer.
|
|
63
|
+
|
|
64
|
+
### Group Logo
|
|
65
|
+
|
|
66
|
+
The logo occupies roughly the top half of the visible screen — approximately 80 to
|
|
67
|
+
100 pixels tall, spanning the full 320-pixel width. It is the first thing the viewer
|
|
68
|
+
sees and the hardest to get right aesthetically.
|
|
69
|
+
|
|
70
|
+
Two implementation paths exist. The first is a bitmap logo: a hi-res or multicolor
|
|
71
|
+
bitmap loaded into $4000–$7FFF (standard VIC-II bitmap area), with color data in
|
|
72
|
+
screen RAM and color RAM. The VIC-II's multicolor bitmap mode (bit 5 of $D011 = 1,
|
|
73
|
+
bit 4 of $D016 = 1) gives three colors plus background, which is sufficient for a
|
|
74
|
+
bold logo glyph. The second path is a large custom multicolor charset: a 4x4 or 8x4
|
|
75
|
+
character-cell logo built from custom character definitions. The charset approach
|
|
76
|
+
is smaller in RAM footprint and easier to re-color dynamically, making it the common
|
|
77
|
+
choice when the intro must fit under 1 KB.
|
|
78
|
+
|
|
79
|
+
Regardless of rendering method, the logo is static. Cracktros do not animate the
|
|
80
|
+
logo. Animation budget goes to the sprite layer beneath it.
|
|
81
|
+
|
|
82
|
+
Logo placement in screen coordinates: top edge at raster line ~40 (the first visible
|
|
83
|
+
line below the top border), bottom edge at approximately raster line 140. This leaves
|
|
84
|
+
roughly 100 raster lines for the sprite layer and 40 lines for the scroller bar.
|
|
85
|
+
|
|
86
|
+
Color conventions: see Conventions below.
|
|
87
|
+
|
|
88
|
+
### Side-Border Sprites
|
|
89
|
+
|
|
90
|
+
The left and right side borders are normally invisible extensions of the border
|
|
91
|
+
region; the VIC-II's horizontal blank window cuts them off. Side-border opening
|
|
92
|
+
(`sideborder_open`) uses a two-write timing trick in the horizontal blank to trick
|
|
93
|
+
the VIC-II into leaving the border generator disabled, exposing roughly 7 pixels
|
|
94
|
+
of sprite rendering on each side.
|
|
95
|
+
|
|
96
|
+
In a cracktro context, side-border sprites are purely decorative: thin vertical bars,
|
|
97
|
+
dashed lines, or simple graphic elements that frame the screen. They reinforce the
|
|
98
|
+
sense that the intro has pushed the hardware as far as it will go — a deliberate
|
|
99
|
+
display of technical competence.
|
|
100
|
+
|
|
101
|
+
The implementation requirement is a stable raster IRQ (`stable_raster_irq`) firing on
|
|
102
|
+
the correct scanline for each horizontal blank crossing. The two VIC-II writes
|
|
103
|
+
($D016 wide / $D016 narrow) must land within a ±1 cycle window. See
|
|
104
|
+
`../techniques/raster.md` for the exact cycle budget.
|
|
105
|
+
|
|
106
|
+
In intros smaller than 1 KB, side-border opening is sometimes omitted to save code
|
|
107
|
+
space. In any intro above approximately 512 bytes it is expected.
|
|
108
|
+
|
|
109
|
+
### Sprite-Chain Animation
|
|
110
|
+
|
|
111
|
+
Eight hardware sprites are available simultaneously. A cracktro typically devotes all
|
|
112
|
+
eight to an animated element in the middle of the screen — between the logo and the
|
|
113
|
+
scroller bar. Common patterns are a horizontal sweep (sprites moving left-to-right in
|
|
114
|
+
a chain, wrapping), a bounce pattern (sprites oscillating vertically at different
|
|
115
|
+
phases), or a sine-wave chain that produces a fluid ribbon effect.
|
|
116
|
+
|
|
117
|
+
The sprite positions are updated in the raster IRQ handler or a main-loop timer. Each
|
|
118
|
+
sprite gets an X and Y position computed from a precomputed sine table indexed by a
|
|
119
|
+
per-sprite phase offset. The phase advances by a fixed amount each frame, and each
|
|
120
|
+
sprite's phase is offset from the previous by a constant (typically 256/8 = 32 units
|
|
121
|
+
for an evenly spaced chain over a full sine period).
|
|
122
|
+
|
|
123
|
+
The chain animation itself (eight sprites phased along one table, the `$D010`
|
|
124
|
+
high-bit wrap, the bounce, the expanded-sprite logo) is `sprite_sine_chain` in
|
|
125
|
+
`../techniques/sprite.md`, with the recipe `../recipes/kickassembler/sprite-sine-chain.md`;
|
|
126
|
+
`sprite_multiplex_8` is a multiplexer and is only needed when more than eight
|
|
127
|
+
objects are on screen at once (an earlier version of this page named it for the
|
|
128
|
+
chain). For showier intros with more than 8 simultaneous sprite objects, `sprite_multiplex_8`
|
|
129
|
+
is replaced by `sprite_multiplex_24`, which reuses the eight hardware sprites across
|
|
130
|
+
multiple raster bands. The trade-off is IRQ complexity and a minimum vertical spacing
|
|
131
|
+
requirement between bands.
|
|
132
|
+
|
|
133
|
+
Sprite design in cracktros is constrained by the same color economy as the logo: two
|
|
134
|
+
or three colors, chosen to complement the palette of the logo region. Multicolor
|
|
135
|
+
sprites (bit set in $D01C) give three colors plus transparent; hi-res sprites give
|
|
136
|
+
one color with sharper edges. Cracktros almost universally use multicolor.
|
|
137
|
+
|
|
138
|
+
### SID Tune
|
|
139
|
+
|
|
140
|
+
Every cracktro carries a SID tune. The tune plays in the background while the scroller
|
|
141
|
+
runs; it loops for as long as the user lets the intro run before pressing a key.
|
|
142
|
+
|
|
143
|
+
The tune is almost always a standalone SID binary: a composer exports a `.sid` file
|
|
144
|
+
from a tracker (GoatTracker, SID Factory II, or older tools like Music Assembler),
|
|
145
|
+
and the intro relocates and links it. The player follows the `sid_play_routine_pattern`
|
|
146
|
+
convention: an `init` entry point that accepts a song number in the accumulator, called
|
|
147
|
+
once at startup, and a `play` entry point called once per frame (every 50 Hz on PAL,
|
|
148
|
+
every 60 Hz on NTSC) from the raster IRQ.
|
|
149
|
+
|
|
150
|
+
In a size-constrained intro (under 1 KB) the SID player is the largest single
|
|
151
|
+
component. A minimal three-voice SID routine with one short tune can occupy 200–400
|
|
152
|
+
bytes. Some groups ship hand-assembled micro-players for extreme size categories.
|
|
153
|
+
|
|
154
|
+
Loop length is a social convention as much as a technical one: 30 to 60 seconds is
|
|
155
|
+
the expected range. A tune that loops in under 20 seconds becomes annoying. A tune
|
|
156
|
+
longer than 90 seconds was historically impractical because the tracker data would
|
|
157
|
+
overflow the available RAM.
|
|
158
|
+
|
|
159
|
+
### Scroller Bar
|
|
160
|
+
|
|
161
|
+
The scroller is the text layer at the bottom of the screen, typically occupying one
|
|
162
|
+
character row (8 raster lines) or a double-height zone (16 lines). It scrolls
|
|
163
|
+
horizontally from right to left at a speed of one pixel per frame (50 pixels/second
|
|
164
|
+
on PAL), shifting the VIC-II's fine X-scroll register ($D016 bits 2–0) and advancing
|
|
165
|
+
a character pointer when the fine-scroll wraps to 7.
|
|
166
|
+
|
|
167
|
+
Implementation uses `soft_scroll_h` from `../techniques/scroll.md`. The scroller
|
|
168
|
+
buffer holds enough characters to fill the screen plus one additional character to
|
|
169
|
+
absorb the pipeline delay. New characters are fed from the message string as the
|
|
170
|
+
scroll pointer advances.
|
|
171
|
+
|
|
172
|
+
The scroller bar is positioned at the bottom of the visible display, often with a
|
|
173
|
+
distinct background color (set via color RAM for that row) to separate it visually
|
|
174
|
+
from the sprite layer. A common layout places it at character row 24 (the last
|
|
175
|
+
row before the border).
|
|
176
|
+
|
|
177
|
+
The text in the scroller is the human-readable content of the cracktro. See Conventions
|
|
178
|
+
below for text conventions.
|
|
179
|
+
|
|
180
|
+
### Size and Exit
|
|
181
|
+
|
|
182
|
+
The canonical form: one screen, often under 1 KB, sometimes 256 bytes. All five
|
|
183
|
+
elements are present in minimal form. The code is hand-optimized machine language
|
|
184
|
+
(or KickAssembler with aggressive constant-folding). RAM usage is tracked byte by
|
|
185
|
+
byte. The SID tune is the primary size driver. Groups in the extreme-size category
|
|
186
|
+
sometimes synthesize audio from a tiny engine rather than shipping tracker data.
|
|
187
|
+
|
|
188
|
+
The crack intro exits to the game when the user presses a key or fire. The exit
|
|
189
|
+
routine patches the game's reset vector or JSRs directly into the game entry point.
|
|
190
|
+
|
|
191
|
+
The core cracktro pattern scales up and down into the variant formats that follow:
|
|
192
|
+
the demo intro, the pack intro, the dentro and the 4K party intro.
|
|
193
|
+
|
|
194
|
+
**Technique fingerprint:** `stable_raster_irq`, `sideborder_open`, `sprite_sine_chain`, `soft_scroll_h`, `raster_bars`, `sid_play_routine_pattern`
|
|
195
|
+
|
|
196
|
+
**Common pitfalls:** `raster_irq_first_line_jitter`, `d016_unmasked_rmw_clobbers_csel_mcm`, `xscroll_applies_to_all_rows`, `sprite_x_high_bit_wrong_register`, `pal_ntsc_tempo_mismatch`
|
|
197
|
+
|
|
198
|
+
The fingerprint is the Technique Checklist's five core names plus `raster_bars`, which the
|
|
199
|
+
canonical recipe builds behind the scroller; `sprite_multiplex_24` is the checklist's
|
|
200
|
+
alternative for larger intros and is not forced. The pitfalls follow from the elements:
|
|
201
|
+
the stable IRQ (`raster_irq_first_line_jitter`), two users of `$D016` on one screen
|
|
202
|
+
(`d016_unmasked_rmw_clobbers_csel_mcm`), a scroller on one row under a static logo
|
|
203
|
+
(`xscroll_applies_to_all_rows`), the `$D010` wrap in the sprite chain
|
|
204
|
+
(`sprite_x_high_bit_wrong_register`) and a play call once a frame on both models
|
|
205
|
+
(`pal_ntsc_tempo_mismatch`).
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## Demo Intro
|
|
210
|
+
|
|
211
|
+
**Archetype:** `demo_intro`
|
|
212
|
+
|
|
213
|
+
**Starter:** `demo`
|
|
214
|
+
|
|
215
|
+
A demo intro is the opening part of a longer multi-part demo, released as a
|
|
216
|
+
standalone production in its own right. Size ceiling is typically 1 KB to 4 KB.
|
|
217
|
+
It may combine the cracktro layout with a simple effect — a plasma, a vector cube,
|
|
218
|
+
or a tunnel — that previews the demo's aesthetic. The transition from the intro
|
|
219
|
+
screen to the first effect is itself a design moment: fade-to-black, raster wipe,
|
|
220
|
+
or hard-cut. The fade is `colour_fade` in `../techniques/transitions.md`, a
|
|
221
|
+
sixteen-step luminance-ordered table measured in the `colour-fade` recipe;
|
|
222
|
+
a fade done by arithmetic on the colour numbers flickers through hues.
|
|
223
|
+
|
|
224
|
+
**Technique fingerprint:** `stable_raster_irq`, `soft_scroll_h`, `sid_play_routine_pattern`, `colour_fade`
|
|
225
|
+
|
|
226
|
+
**Common pitfalls:** `raster_irq_first_line_jitter`, `pal_ntsc_tempo_mismatch`
|
|
227
|
+
|
|
228
|
+
The effect that previews the demo (plasma, vector, tunnel) is the intro's own choice
|
|
229
|
+
and is not in the fingerprint; the fade out of the intro screen is.
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## Pack Intro
|
|
234
|
+
|
|
235
|
+
**Archetype:** `pack_intro`
|
|
236
|
+
|
|
237
|
+
A pack intro is the interface wrapper for a compilation (a "pack" or "disk magazine").
|
|
238
|
+
It presents a menu of productions loadable from the disk. The pack intro's scroller
|
|
239
|
+
explains the contents; the sprite layer and logo identify the group curating the
|
|
240
|
+
collection. Functionally the pack intro replaces the exit-to-game logic with a
|
|
241
|
+
disk directory reader and a loader invocation. Pack intros from the late 1980s are
|
|
242
|
+
some of the earliest examples of C64 software with a designed UI.
|
|
243
|
+
|
|
244
|
+
**Technique fingerprint:** `stable_raster_irq`, `soft_scroll_h`, `sid_play_routine_pattern`, `multi_load_sequencing`
|
|
245
|
+
|
|
246
|
+
**Common pitfalls:** `raster_irq_first_line_jitter`, `pal_ntsc_tempo_mismatch`, `fastloader_kernal_dependency`
|
|
247
|
+
|
|
248
|
+
The loader that replaces the exit-to-game logic is `multi_load_sequencing` in
|
|
249
|
+
`../techniques/loaders-packers.md`; which loader sits under it is the pack's choice.
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Mini-Demo / Dentro
|
|
254
|
+
|
|
255
|
+
**Archetype:** `dentro`
|
|
256
|
+
|
|
257
|
+
The "dentro" (a mid-1990s portmanteau of "demo" and "dentro") is a multi-part
|
|
258
|
+
production in the 8 KB to 16 KB range, typically 2 to 4 parts. Each part is a
|
|
259
|
+
self-contained effect with its own raster setup and SID tune. A minimal loader
|
|
260
|
+
sequences the parts from disk. The dentro format emerged as a middle ground between
|
|
261
|
+
the one-screen intro and the full competition demo requiring multiple disk sides.
|
|
262
|
+
A two-part dentro might open with a cracktro-style screen, transition to a plasma
|
|
263
|
+
or sprite-multiplexed effect, then roll credits.
|
|
264
|
+
|
|
265
|
+
**Technique fingerprint:** `stable_raster_irq`, `sid_play_routine_pattern`, `multi_load_sequencing`, `colour_fade`
|
|
266
|
+
|
|
267
|
+
**Common pitfalls:** `raster_irq_first_line_jitter`, `pal_ntsc_tempo_mismatch`, `fastloader_kernal_dependency`
|
|
268
|
+
|
|
269
|
+
Each part brings its own raster setup and tune, so the stable IRQ and the play
|
|
270
|
+
convention are per part; the sequencing loader and the transitions between parts
|
|
271
|
+
are what the dentro adds over the one-screen intro.
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Conventions
|
|
276
|
+
|
|
277
|
+
### Scroller Text Format
|
|
278
|
+
|
|
279
|
+
The canonical scroller text follows a well-established template:
|
|
280
|
+
|
|
281
|
+
```
|
|
282
|
+
*** GROUP NAME PRESENTS ANOTHER 100% CRACK / GREETINGS TO: GROUP A ... GROUP Z ***
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Key conventions:
|
|
286
|
+
- Triple asterisks as visual separators between message segments
|
|
287
|
+
- "PRESENTS" as the verb (alternatives: "RELEASED", "BRINGS YOU")
|
|
288
|
+
- "100% CRACK" as the quality claim (100% = no trainer, no nag screen, fully working)
|
|
289
|
+
- "GREETINGS TO" as the transition to the social network list
|
|
290
|
+
- Group names in ALL CAPS throughout
|
|
291
|
+
- Ellipsis represented as " ... " with spaces
|
|
292
|
+
- The message loops: the closing ` ***` connects back to the opening `*** ` without pause
|
|
293
|
+
|
|
294
|
+
A longer scroller might include: release date, version number, crack notes ("TRAINED
|
|
295
|
+
BY XXX" or "ORIGINAL TRAINER REMOVED"), requests for originals, contact addresses
|
|
296
|
+
(BBS phone numbers in the historical era, nowadays IRC or email), and an extended
|
|
297
|
+
greetings list of 10 to 30 groups.
|
|
298
|
+
|
|
299
|
+
### Logo Placement and Sizing
|
|
300
|
+
|
|
301
|
+
Logo top edge: no higher than raster line 40 (first line below top border). Logo
|
|
302
|
+
bottom edge: no lower than raster line 140. This preserves the 100-line sprite zone
|
|
303
|
+
(140–190) and the scroller zone (190–248). The logo fills the horizontal screen
|
|
304
|
+
fully — 320 pixels wide for hi-res, 160 pixels wide for multicolor (with 2x pixel
|
|
305
|
+
width).
|
|
306
|
+
|
|
307
|
+
### Color Scheme
|
|
308
|
+
|
|
309
|
+
Cracktros use 2 to 3 colors maximum. The historically dominant palette is:
|
|
310
|
+
|
|
311
|
+
- Logo: blue ($06) or light blue ($0E) on black ($00) background
|
|
312
|
+
- Scroller bar background: dark blue ($06), text color cyan ($03) or white ($01)
|
|
313
|
+
- Sprite chain: white ($01) or yellow ($07)
|
|
314
|
+
- Border: black ($00) always
|
|
315
|
+
|
|
316
|
+
This palette is a historical artifact of early-1980s European scene aesthetics
|
|
317
|
+
influenced by the default C64 BASIC screen colors. Modern cracktros sometimes break
|
|
318
|
+
with it deliberately as an aesthetic statement, but the departure is always legible
|
|
319
|
+
as a deviation from the norm.
|
|
320
|
+
|
|
321
|
+
### Tune Length
|
|
322
|
+
|
|
323
|
+
30 to 60 seconds per loop. A 30-second loop is acceptable for intros under 512 bytes
|
|
324
|
+
where tune data is the bottleneck. 60 seconds is the comfortable maximum before the
|
|
325
|
+
tracker pattern data begins to strain the available RAM in a sub-4KB intro.
|
|
326
|
+
|
|
327
|
+
### Greetings List
|
|
328
|
+
|
|
329
|
+
The greetings list is the cracktro's primary social function. Its composition is not
|
|
330
|
+
arbitrary: groups are listed roughly in order of alliance strength, with close allies
|
|
331
|
+
first and friendly-but-distant contacts toward the end. Listing a group is a public
|
|
332
|
+
statement of respect. Being listed earns reciprocal listing. Groups actively curate
|
|
333
|
+
their greetings lists across releases as social relationships evolve.
|
|
334
|
+
|
|
335
|
+
For an agent building a cracktro for functional purposes (a demo framework test, a
|
|
336
|
+
toolchain validation), the greetings list can be a stub: `GREETINGS TO ALL CODERS
|
|
337
|
+
READING THIS SOURCE CODE`. The format must be present; the content is context-dependent.
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
## 4K Party Intro
|
|
342
|
+
|
|
343
|
+
**Archetype:** `party_intro_4k`
|
|
344
|
+
|
|
345
|
+
The 4K party intro is the form's modern reinvention. The cracktro format has outlasted
|
|
346
|
+
the software piracy context that created it. Several
|
|
347
|
+
groups have continued producing cracktros as releases in their own right through the
|
|
348
|
+
2000s and 2010s. Triad (Sweden) has been releasing cracks with attached intros since
|
|
349
|
+
the mid-1980s and was still active into the 2010s. Genesis Project and Onslaught
|
|
350
|
+
have similarly long release histories with cracktro production as a consistent
|
|
351
|
+
component.
|
|
352
|
+
|
|
353
|
+
At demo parties, the intro compo (productions under 4 KB) functions as the modern
|
|
354
|
+
heir to the cracktro tradition. The constraint is identical — fit everything into a
|
|
355
|
+
small binary — but the production context is competitive rather than attached to a
|
|
356
|
+
specific cracked game. The best 4 KB intros from major parties (Revision, X, Datastorm)
|
|
357
|
+
demonstrate what is technically achievable when experienced coders maximize every byte:
|
|
358
|
+
real-time plasma, vector objects, and polyphonic SID all within the cracktro spatial
|
|
359
|
+
layout.
|
|
360
|
+
|
|
361
|
+
The cracktro is also used as a pedagogical reference. Because every element is present
|
|
362
|
+
in minimal form, it is the ideal starting point for learning how the five core C64
|
|
363
|
+
techniques interact. A working cracktro is a proof that stable raster, side-border,
|
|
364
|
+
sprite animation, SID playback, and hardware scroll can coexist in a single binary
|
|
365
|
+
without conflicts.
|
|
366
|
+
|
|
367
|
+
**Technique fingerprint:** `stable_raster_irq`, `soft_scroll_h`, `sprite_sine_chain`, `sid_play_routine_pattern`
|
|
368
|
+
|
|
369
|
+
**Common pitfalls:** `raster_irq_first_line_jitter`, `pal_ntsc_tempo_mismatch`
|
|
370
|
+
|
|
371
|
+
The fingerprint is the cracktro spatial layout the compo entry keeps; the plasma
|
|
372
|
+
and vector work that the best entries add is not required of every one and is left
|
|
373
|
+
to the brief.
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## Buildable Reference
|
|
378
|
+
|
|
379
|
+
### Canonical Recipe
|
|
380
|
+
|
|
381
|
+
The canonical buildable cracktro is at `../recipes/kickassembler/cracktro-template.md`.
|
|
382
|
+
It implements all five elements in KickAssembler. Readers building a cracktro should
|
|
383
|
+
start there: the recipe provides the full memory map, IRQ handler structure, sprite
|
|
384
|
+
sine table, scroller main loop, and SID relocation pattern.
|
|
385
|
+
|
|
386
|
+
The current revision of that recipe builds a text logo, ten raster bars from a
|
|
387
|
+
chained IRQ ring, a sine scroller and a SID play call, and says in its synopsis that
|
|
388
|
+
it no longer opens the side borders or drives a sprite layer; those two come from
|
|
389
|
+
`../recipes/kickassembler/sideborder-open.md` and
|
|
390
|
+
`../recipes/kickassembler/sprite-sine-chain.md`. Read the recipe's own synopsis for
|
|
391
|
+
what it builds today.
|
|
392
|
+
|
|
393
|
+
KickAssembler is the primary toolchain for cracktros because it gives cycle-exact
|
|
394
|
+
control over the raster timing required by `sideborder_open`. Oscar64 is suitable for
|
|
395
|
+
game logic and high-level demo structure, but for a component where every cycle of
|
|
396
|
+
the horizontal blank window matters, hand-assembled KickAssembler gives the necessary
|
|
397
|
+
precision.
|
|
398
|
+
|
|
399
|
+
### Technique Checklist
|
|
400
|
+
|
|
401
|
+
A complete cracktro combines the following techniques (snake_case names as used in
|
|
402
|
+
the knowledge graph):
|
|
403
|
+
|
|
404
|
+
| Technique | Role in cracktro |
|
|
405
|
+
|---|---|
|
|
406
|
+
| `stable_raster_irq` | Prerequisite for all timed writes; provides the cycle-stable IRQ baseline |
|
|
407
|
+
| `sideborder_open` | Opens left and right borders; requires `stable_raster_irq` |
|
|
408
|
+
| `sprite_sine_chain` | Phases the eight sprites of the middle band along one table (sweep, bounce, logo); `sprite_multiplex_8` is only needed above eight objects |
|
|
409
|
+
| `sprite_multiplex_24` | Alternative for showier intros with more than 8 simultaneous objects |
|
|
410
|
+
| `soft_scroll_h` | Drives the bottom scroller bar one pixel per frame |
|
|
411
|
+
| `sid_play_routine_pattern` | Standard init+play convention for the background SID tune |
|
|
412
|
+
|
|
413
|
+
These six names can be passed directly to `c64_check_compatibility` to detect register
|
|
414
|
+
conflicts before writing a line of code. The primary known conflict is that
|
|
415
|
+
`sideborder_open` and `sprite_multiplex_24` both require IRQ handlers at multiple
|
|
416
|
+
raster lines — the IRQ schedule must be planned explicitly to avoid handler collision.
|
|
417
|
+
`sprite_multiplex_8` does not have this problem because it operates in a single
|
|
418
|
+
raster band.
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
## Cross-References
|
|
423
|
+
|
|
424
|
+
- `./demo-design-philosophy.md` — broader scene philosophy; cracktros as the atomic
|
|
425
|
+
unit of demo culture
|
|
426
|
+
- `../recipes/kickassembler/cracktro-template.md` — the canonical buildable recipe
|
|
427
|
+
for a complete cracktro in KickAssembler
|
|
428
|
+
- `../techniques/sprite.md` — `sprite_multiplex_8` and `sprite_multiplex_24`
|
|
429
|
+
implementation details, sine table patterns, sprite chain construction
|
|
430
|
+
- `../techniques/scroll.md` — `soft_scroll_h` implementation; scroller buffer
|
|
431
|
+
management; fine-scroll register protocol
|
|
432
|
+
- `../techniques/raster.md` — `stable_raster_irq` and `sideborder_open`; cycle
|
|
433
|
+
budget for the horizontal blank window; two-write timing protocol
|
|
434
|
+
- `../techniques/music-sid.md` — `sid_play_routine_pattern`; SID binary relocation;
|
|
435
|
+
init/play entry point conventions
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"edges":[{"t":"standard_bitmap","r":"SCROLY","a":"$D011"},{"t":"standard_bitmap","r":"VMCSB","a":"$D018"},{"t":"multicolor_bitmap","r":"SCROLY","a":"$D011"},{"t":"multicolor_bitmap","r":"SCROLX","a":"$D016"},{"t":"multicolor_bitmap","r":"VMCSB","a":"$D018"},{"t":"ecm_mode","r":"SCROLY","a":"$D011"},{"t":"ecm_mode","r":"BGCOL1","a":"$D022"},{"t":"ecm_mode","r":"BGCOL2","a":"$D023"},{"t":"ecm_mode","r":"BGCOL3","a":"$D024"},{"t":"mcm_text","r":"SCROLX","a":"$D016"},{"t":"mcm_text","r":"VMCSB","a":"$D018"},{"t":"mcm_text","r":"BGCOL0","a":"$D021"},{"t":"mcm_text","r":"BGCOL1","a":"$D022"},{"t":"mcm_text","r":"BGCOL2","a":"$D023"},{"t":"mcm_text","r":"SPMC0","a":"$D025"},{"t":"mcm_text","r":"SPMC1","a":"$D026"},{"t":"fli_image","r":"SCROLY","a":"$D011"},{"t":"fli_image","r":"SCROLX","a":"$D016"},{"t":"fli_image","r":"VMCSB","a":"$D018"},{"t":"afli_image","r":"SCROLY","a":"$D011"},{"t":"afli_image","r":"VMCSB","a":"$D018"},{"t":"ifli_image","r":"SCROLY","a":"$D011"},{"t":"ifli_image","r":"VMCSB","a":"$D018"},{"t":"koala_format","r":"SCROLY","a":"$D011"},{"t":"koala_format","r":"SCROLX","a":"$D016"},{"t":"koala_format","r":"VMCSB","a":"$D018"},{"t":"koala_format","r":"BGCOL0","a":"$D021"},{"t":"phase_inverted_irq","r":"RASTER","a":"$D012"},{"t":"phase_inverted_irq","r":"VICIRQ","a":"$D019"},{"t":"phase_inverted_irq","r":"IRQMSK","a":"$D01A"},{"t":"dma_steal_avoidance","r":"SCROLY","a":"$D011"},{"t":"dma_steal_avoidance","r":"RASTER","a":"$D012"},{"t":"dma_steal_avoidance","r":"SPENA","a":"$D015"},{"t":"dot_3d_rotator","r":"M0X","a":"$D000"},{"t":"dot_3d_rotator","r":"M0Y","a":"$D001"},{"t":"dot_3d_rotator","r":"M1X","a":"$D002"},{"t":"dot_3d_rotator","r":"M1Y","a":"$D003"},{"t":"dot_3d_rotator","r":"M2X","a":"$D004"},{"t":"dot_3d_rotator","r":"M2Y","a":"$D005"},{"t":"dot_3d_rotator","r":"M3X","a":"$D006"},{"t":"dot_3d_rotator","r":"M3Y","a":"$D007"},{"t":"dot_3d_rotator","r":"M4X","a":"$D008"},{"t":"dot_3d_rotator","r":"M4Y","a":"$D009"},{"t":"dot_3d_rotator","r":"M5X","a":"$D00A"},{"t":"dot_3d_rotator","r":"M5Y","a":"$D00B"},{"t":"dot_3d_rotator","r":"M6X","a":"$D00C"},{"t":"dot_3d_rotator","r":"M6Y","a":"$D00D"},{"t":"dot_3d_rotator","r":"M7X","a":"$D00E"},{"t":"dot_3d_rotator","r":"M7Y","a":"$D00F"},{"t":"dot_3d_rotator","r":"MSIGX","a":"$D010"},{"t":"dot_3d_rotator","r":"SPENA","a":"$D015"},{"t":"dot_3d_rotator","r":"VMCSB","a":"$D018"},{"t":"dot_3d_rotator","r":"SP0COL","a":"$D027"},{"t":"dot_3d_rotator","r":"SP1COL","a":"$D028"},{"t":"dot_3d_rotator","r":"SP2COL","a":"$D029"},{"t":"dot_3d_rotator","r":"SP3COL","a":"$D02A"},{"t":"dot_3d_rotator","r":"SP4COL","a":"$D02B"},{"t":"dot_3d_rotator","r":"SP5COL","a":"$D02C"},{"t":"dot_3d_rotator","r":"SP6COL","a":"$D02D"},{"t":"dot_3d_rotator","r":"SP7COL","a":"$D02E"},{"t":"solid_vector_3d","r":"SCROLY","a":"$D011"},{"t":"solid_vector_3d","r":"SCROLX","a":"$D016"},{"t":"solid_vector_3d","r":"VMCSB","a":"$D018"},{"t":"bobs_effect","r":"SCROLY","a":"$D011"},{"t":"bobs_effect","r":"VMCSB","a":"$D018"},{"t":"plasma","r":"VMCSB","a":"$D018"},{"t":"plasma","r":"BGCOL0","a":"$D021"},{"t":"plasma","r":"BGCOL1","a":"$D022"},{"t":"plasma","r":"BGCOL2","a":"$D023"},{"t":"tunnel","r":"VMCSB","a":"$D018"},{"t":"tunnel","r":"BGCOL0","a":"$D021"},{"t":"starfield","r":"M0X","a":"$D000"},{"t":"starfield","r":"M0Y","a":"$D001"},{"t":"starfield","r":"M1X","a":"$D002"},{"t":"starfield","r":"M1Y","a":"$D003"},{"t":"starfield","r":"M2X","a":"$D004"},{"t":"starfield","r":"M2Y","a":"$D005"},{"t":"starfield","r":"M3X","a":"$D006"},{"t":"starfield","r":"M3Y","a":"$D007"},{"t":"starfield","r":"M4X","a":"$D008"},{"t":"starfield","r":"M4Y","a":"$D009"},{"t":"starfield","r":"M5X","a":"$D00A"},{"t":"starfield","r":"M5Y","a":"$D00B"},{"t":"starfield","r":"M6X","a":"$D00C"},{"t":"starfield","r":"M6Y","a":"$D00D"},{"t":"starfield","r":"M7X","a":"$D00E"},{"t":"starfield","r":"M7Y","a":"$D00F"},{"t":"starfield","r":"MSIGX","a":"$D010"},{"t":"starfield","r":"SPENA","a":"$D015"},{"t":"text_zoom","r":"SCROLY","a":"$D011"},{"t":"text_zoom","r":"SCROLX","a":"$D016"},{"t":"voxel_landscape","r":"SCROLY","a":"$D011"},{"t":"voxel_landscape","r":"VMCSB","a":"$D018"},{"t":"mode7_lookalike","r":"SCROLX","a":"$D016"},{"t":"mode7_lookalike","r":"VMCSB","a":"$D018"},{"t":"krill_loader_integration","r":"DD00","a":"$DD00"},{"t":"sparkle_irq_loader","r":"DD00","a":"$DD00"},{"t":"sparkle_irq_loader","r":"RASTER","a":"$D012"},{"t":"sparkle_irq_loader","r":"VICIRQ","a":"$D019"},{"t":"sparkle_irq_loader","r":"IRQMSK","a":"$D01A"},{"t":"disk_protection_tricks","r":"DD00","a":"$DD00"},{"t":"vic_bank_select","r":"DD00","a":"$DD00"},{"t":"char_rom_under_vic","r":"DD00","a":"$DD00"},{"t":"char_rom_under_vic","r":"VMCSB","a":"$D018"},{"t":"screen_ram_relocation","r":"VMCSB","a":"$D018"},{"t":"bitmap_relocation","r":"VMCSB","a":"$D018"},{"t":"sid_voice_setup","r":"FRELO1","a":"$D400"},{"t":"sid_voice_setup","r":"FREHI1","a":"$D401"},{"t":"sid_voice_setup","r":"PWLO1","a":"$D402"},{"t":"sid_voice_setup","r":"PWHI1","a":"$D403"},{"t":"sid_voice_setup","r":"VCREG1","a":"$D404"},{"t":"sid_voice_setup","r":"ATDCY1","a":"$D405"},{"t":"sid_voice_setup","r":"SUREL1","a":"$D406"},{"t":"sid_voice_setup","r":"FRELO2","a":"$D407"},{"t":"sid_voice_setup","r":"FREHI2","a":"$D408"},{"t":"sid_voice_setup","r":"PWLO2","a":"$D409"},{"t":"sid_voice_setup","r":"PWHI2","a":"$D40A"},{"t":"sid_voice_setup","r":"VCREG2","a":"$D40B"},{"t":"sid_voice_setup","r":"ATDCY2","a":"$D40C"},{"t":"sid_voice_setup","r":"SUREL2","a":"$D40D"},{"t":"sid_voice_setup","r":"FRELO3","a":"$D40E"},{"t":"sid_voice_setup","r":"FREHI3","a":"$D40F"},{"t":"sid_voice_setup","r":"PWLO3","a":"$D410"},{"t":"sid_voice_setup","r":"PWHI3","a":"$D411"},{"t":"sid_voice_setup","r":"VCREG3","a":"$D412"},{"t":"sid_voice_setup","r":"ATDCY3","a":"$D413"},{"t":"sid_voice_setup","r":"SUREL3","a":"$D414"},{"t":"sid_filter_routing","r":"CUTLO","a":"$D415"},{"t":"sid_filter_routing","r":"CUTHI","a":"$D416"},{"t":"sid_filter_routing","r":"RESON","a":"$D417"},{"t":"sid_filter_routing","r":"SIGVOL","a":"$D418"},{"t":"sid_play_routine_pattern","r":"FRELO1","a":"$D400"},{"t":"sid_play_routine_pattern","r":"FREHI1","a":"$D401"},{"t":"sid_play_routine_pattern","r":"PWLO1","a":"$D402"},{"t":"sid_play_routine_pattern","r":"PWHI1","a":"$D403"},{"t":"sid_play_routine_pattern","r":"VCREG1","a":"$D404"},{"t":"sid_play_routine_pattern","r":"ATDCY1","a":"$D405"},{"t":"sid_play_routine_pattern","r":"SUREL1","a":"$D406"},{"t":"sid_play_routine_pattern","r":"FRELO2","a":"$D407"},{"t":"sid_play_routine_pattern","r":"FREHI2","a":"$D408"},{"t":"sid_play_routine_pattern","r":"PWLO2","a":"$D409"},{"t":"sid_play_routine_pattern","r":"PWHI2","a":"$D40A"},{"t":"sid_play_routine_pattern","r":"VCREG2","a":"$D40B"},{"t":"sid_play_routine_pattern","r":"ATDCY2","a":"$D40C"},{"t":"sid_play_routine_pattern","r":"SUREL2","a":"$D40D"},{"t":"sid_play_routine_pattern","r":"FRELO3","a":"$D40E"},{"t":"sid_play_routine_pattern","r":"FREHI3","a":"$D40F"},{"t":"sid_play_routine_pattern","r":"PWLO3","a":"$D410"},{"t":"sid_play_routine_pattern","r":"PWHI3","a":"$D411"},{"t":"sid_play_routine_pattern","r":"VCREG3","a":"$D412"},{"t":"sid_play_routine_pattern","r":"ATDCY3","a":"$D413"},{"t":"sid_play_routine_pattern","r":"SUREL3","a":"$D414"},{"t":"sid_play_routine_pattern","r":"CUTLO","a":"$D415"},{"t":"sid_play_routine_pattern","r":"CUTHI","a":"$D416"},{"t":"sid_play_routine_pattern","r":"RESON","a":"$D417"},{"t":"sid_play_routine_pattern","r":"SIGVOL","a":"$D418"},{"t":"sid_8580_vs_6581_differences","r":"VCREG1","a":"$D404"},{"t":"sid_8580_vs_6581_differences","r":"CUTLO","a":"$D415"},{"t":"sid_8580_vs_6581_differences","r":"CUTHI","a":"$D416"},{"t":"sid_8580_vs_6581_differences","r":"RESON","a":"$D417"},{"t":"sid_8580_vs_6581_differences","r":"SIGVOL","a":"$D418"},{"t":"digi_4bit","r":"SIGVOL","a":"$D418"},{"t":"digi_8bit_hard_restart","r":"VCREG1","a":"$D404"},{"t":"digi_8bit_hard_restart","r":"ATDCY1","a":"$D405"},{"t":"digi_8bit_hard_restart","r":"SUREL1","a":"$D406"},{"t":"digi_8bit_hard_restart","r":"SIGVOL","a":"$D418"},{"t":"sidfx_layered_chip","r":"FRELO1","a":"$D400"},{"t":"sidfx_layered_chip","r":"FREHI1","a":"$D401"},{"t":"sidfx_layered_chip","r":"PWLO1","a":"$D402"},{"t":"sidfx_layered_chip","r":"PWHI1","a":"$D403"},{"t":"sidfx_layered_chip","r":"VCREG1","a":"$D404"},{"t":"sidfx_layered_chip","r":"ATDCY1","a":"$D405"},{"t":"sidfx_layered_chip","r":"SUREL1","a":"$D406"},{"t":"sidfx_layered_chip","r":"FRELO2","a":"$D407"},{"t":"sidfx_layered_chip","r":"FREHI2","a":"$D408"},{"t":"sidfx_layered_chip","r":"PWLO2","a":"$D409"},{"t":"sidfx_layered_chip","r":"PWHI2","a":"$D40A"},{"t":"sidfx_layered_chip","r":"VCREG2","a":"$D40B"},{"t":"sidfx_layered_chip","r":"ATDCY2","a":"$D40C"},{"t":"sidfx_layered_chip","r":"SUREL2","a":"$D40D"},{"t":"sidfx_layered_chip","r":"FRELO3","a":"$D40E"},{"t":"sidfx_layered_chip","r":"FREHI3","a":"$D40F"},{"t":"sidfx_layered_chip","r":"PWLO3","a":"$D410"},{"t":"sidfx_layered_chip","r":"PWHI3","a":"$D411"},{"t":"sidfx_layered_chip","r":"VCREG3","a":"$D412"},{"t":"sidfx_layered_chip","r":"ATDCY3","a":"$D413"},{"t":"sidfx_layered_chip","r":"SUREL3","a":"$D414"},{"t":"sidfx_layered_chip","r":"CUTLO","a":"$D415"},{"t":"sidfx_layered_chip","r":"CUTHI","a":"$D416"},{"t":"sidfx_layered_chip","r":"RESON","a":"$D417"},{"t":"sidfx_layered_chip","r":"SIGVOL","a":"$D418"},{"t":"sidasid_emulation_notes","r":"CUTLO","a":"$D415"},{"t":"sidasid_emulation_notes","r":"CUTHI","a":"$D416"},{"t":"sidasid_emulation_notes","r":"RESON","a":"$D417"},{"t":"sidasid_emulation_notes","r":"SIGVOL","a":"$D418"},{"t":"stable_raster_irq","r":"SCROLY","a":"$D011"},{"t":"stable_raster_irq","r":"RASTER","a":"$D012"},{"t":"stable_raster_irq","r":"VICIRQ","a":"$D019"},{"t":"stable_raster_irq","r":"IRQMSK","a":"$D01A"},{"t":"raster_bars","r":"RASTER","a":"$D012"},{"t":"raster_bars","r":"VICIRQ","a":"$D019"},{"t":"raster_bars","r":"EXTCOL","a":"$D020"},{"t":"raster_bars","r":"BGCOL0","a":"$D021"},{"t":"badline_synchronization","r":"SCROLY","a":"$D011"},{"t":"badline_synchronization","r":"RASTER","a":"$D012"},{"t":"double_irq","r":"RASTER","a":"$D012"},{"t":"double_irq","r":"VICIRQ","a":"$D019"},{"t":"double_irq","r":"IRQMSK","a":"$D01A"},{"t":"vsp_glitch","r":"SCROLY","a":"$D011"},{"t":"vsp_glitch","r":"SCROLX","a":"$D016"},{"t":"sideborder_open","r":"SCROLX","a":"$D016"},{"t":"topbottom_border_open","r":"SCROLY","a":"$D011"},{"t":"raster_split_modes","r":"SCROLY","a":"$D011"},{"t":"raster_split_modes","r":"SCROLX","a":"$D016"},{"t":"raster_split_modes","r":"VMCSB","a":"$D018"},{"t":"soft_scroll_h","r":"SCROLX","a":"$D016"},{"t":"soft_scroll_v","r":"SCROLY","a":"$D011"},{"t":"char_scroll_buffer_h","r":"SCROLX","a":"$D016"},{"t":"char_scroll_buffer_v","r":"SCROLY","a":"$D011"},{"t":"infinite_scroll_h","r":"SCROLX","a":"$D016"},{"t":"parallax_dual_layer","r":"MSIGX","a":"$D010"},{"t":"parallax_dual_layer","r":"SCROLX","a":"$D016"},{"t":"bitmap_scroll","r":"SCROLY","a":"$D011"},{"t":"bitmap_scroll","r":"SCROLX","a":"$D016"},{"t":"bitmap_scroll","r":"VMCSB","a":"$D018"},{"t":"sprite_multiplex_8","r":"M0X","a":"$D000"},{"t":"sprite_multiplex_8","r":"M0Y","a":"$D001"},{"t":"sprite_multiplex_8","r":"RASTER","a":"$D012"},{"t":"sprite_multiplex_8","r":"SPENA","a":"$D015"},{"t":"sprite_multiplex_8","r":"VICIRQ","a":"$D019"},{"t":"sprite_multiplex_8","r":"IRQMSK","a":"$D01A"},{"t":"sprite_multiplex_8","r":"SP0COL","a":"$D027"},{"t":"sprite_multiplex_24","r":"M0X","a":"$D000"},{"t":"sprite_multiplex_24","r":"M0Y","a":"$D001"},{"t":"sprite_multiplex_24","r":"M1X","a":"$D002"},{"t":"sprite_multiplex_24","r":"M1Y","a":"$D003"},{"t":"sprite_multiplex_24","r":"M2X","a":"$D004"},{"t":"sprite_multiplex_24","r":"M2Y","a":"$D005"},{"t":"sprite_multiplex_24","r":"M3X","a":"$D006"},{"t":"sprite_multiplex_24","r":"M3Y","a":"$D007"},{"t":"sprite_multiplex_24","r":"M4X","a":"$D008"},{"t":"sprite_multiplex_24","r":"M4Y","a":"$D009"},{"t":"sprite_multiplex_24","r":"M5X","a":"$D00A"},{"t":"sprite_multiplex_24","r":"M5Y","a":"$D00B"},{"t":"sprite_multiplex_24","r":"M6X","a":"$D00C"},{"t":"sprite_multiplex_24","r":"M6Y","a":"$D00D"},{"t":"sprite_multiplex_24","r":"M7X","a":"$D00E"},{"t":"sprite_multiplex_24","r":"M7Y","a":"$D00F"},{"t":"sprite_multiplex_24","r":"MSIGX","a":"$D010"},{"t":"sprite_multiplex_24","r":"SPENA","a":"$D015"},{"t":"sprite_multiplex_24","r":"SP0COL","a":"$D027"},{"t":"sprite_multiplex_24","r":"SP1COL","a":"$D028"},{"t":"sprite_multiplex_24","r":"SP2COL","a":"$D029"},{"t":"sprite_multiplex_24","r":"SP3COL","a":"$D02A"},{"t":"sprite_multiplex_24","r":"SP4COL","a":"$D02B"},{"t":"sprite_multiplex_24","r":"SP5COL","a":"$D02C"},{"t":"sprite_multiplex_24","r":"SP6COL","a":"$D02D"},{"t":"sprite_multiplex_24","r":"SP7COL","a":"$D02E"},{"t":"sprite_expand","r":"YXPAND","a":"$D017"},{"t":"sprite_expand","r":"XXPAND","a":"$D01D"},{"t":"sprite_collision_detect","r":"SPSPCL","a":"$D01E"},{"t":"sprite_collision_detect","r":"SPBGCL","a":"$D01F"},{"t":"sprite_y_stretch_glitch","r":"YXPAND","a":"$D017"},{"t":"mob_priority","r":"SPBGPR","a":"$D01B"},{"t":"sprite_color_swap_mid_line","r":"SP0COL","a":"$D027"},{"t":"sprite_color_swap_mid_line","r":"SP1COL","a":"$D028"},{"t":"sprite_color_swap_mid_line","r":"SP2COL","a":"$D029"},{"t":"sprite_color_swap_mid_line","r":"SP3COL","a":"$D02A"},{"t":"sprite_color_swap_mid_line","r":"SP4COL","a":"$D02B"},{"t":"sprite_color_swap_mid_line","r":"SP5COL","a":"$D02C"},{"t":"sprite_color_swap_mid_line","r":"SP6COL","a":"$D02D"},{"t":"sprite_color_swap_mid_line","r":"SP7COL","a":"$D02E"}],"cats":[{"t":"standard_bitmap","c":"bitmap"},{"t":"multicolor_bitmap","c":"bitmap"},{"t":"ecm_mode","c":"bitmap"},{"t":"mcm_text","c":"bitmap"},{"t":"fli_image","c":"bitmap"},{"t":"afli_image","c":"bitmap"},{"t":"ifli_image","c":"bitmap"},{"t":"koala_format","c":"bitmap"},{"t":"self_modifying_code","c":"cpu"},{"t":"unrolled_loops","c":"cpu"},{"t":"illegal_opcode_tricks","c":"cpu"},{"t":"jump_table_dispatch","c":"cpu"},{"t":"zero_page_burst","c":"cpu"},{"t":"decimal_mode_pitfalls","c":"cpu"},{"t":"bit_test_trick","c":"cpu"},{"t":"phase_inverted_irq","c":"cpu"},{"t":"dma_steal_avoidance","c":"cpu"},{"t":"dot_3d_rotator","c":"effect"},{"t":"solid_vector_3d","c":"effect"},{"t":"bobs_effect","c":"effect"},{"t":"plasma","c":"effect"},{"t":"tunnel","c":"effect"},{"t":"starfield","c":"effect"},{"t":"text_zoom","c":"effect"},{"t":"voxel_landscape","c":"effect"},{"t":"mode7_lookalike","c":"effect"},{"t":"krill_loader_integration","c":"loader"},{"t":"wcf_packer","c":"loader"},{"t":"exomizer_basics","c":"loader"},{"t":"doynax_decruncher","c":"loader"},{"t":"sparkle_irq_loader","c":"loader"},{"t":"byteboozer_packer","c":"loader"},{"t":"disk_protection_tricks","c":"loader"},{"t":"multi_load_sequencing","c":"loader"},{"t":"crunched_data_in_basic_stub","c":"loader"},{"t":"cpu_io_port_bank","c":"banking"},{"t":"vic_bank_select","c":"banking"},{"t":"char_rom_under_vic","c":"banking"},{"t":"screen_ram_relocation","c":"banking"},{"t":"bitmap_relocation","c":"banking"},{"t":"cartridge_bank_easyflash","c":"banking"},{"t":"ram_under_kernal","c":"banking"},{"t":"sid_voice_setup","c":"music"},{"t":"sid_filter_routing","c":"music"},{"t":"sid_play_routine_pattern","c":"music"},{"t":"sid_8580_vs_6581_differences","c":"music"},{"t":"digi_4bit","c":"music"},{"t":"digi_8bit_hard_restart","c":"music"},{"t":"sidfx_layered_chip","c":"music"},{"t":"sidasid_emulation_notes","c":"music"},{"t":"stable_raster_irq","c":"raster"},{"t":"raster_bars","c":"raster"},{"t":"badline_synchronization","c":"raster"},{"t":"double_irq","c":"raster"},{"t":"vsp_glitch","c":"raster"},{"t":"sideborder_open","c":"raster"},{"t":"topbottom_border_open","c":"raster"},{"t":"raster_split_modes","c":"raster"},{"t":"soft_scroll_h","c":"scroll"},{"t":"soft_scroll_v","c":"scroll"},{"t":"char_scroll_buffer_h","c":"scroll"},{"t":"char_scroll_buffer_v","c":"scroll"},{"t":"infinite_scroll_h","c":"scroll"},{"t":"parallax_dual_layer","c":"scroll"},{"t":"bitmap_scroll","c":"scroll"},{"t":"sprite_multiplex_8","c":"sprite"},{"t":"sprite_multiplex_24","c":"sprite"},{"t":"sprite_expand","c":"sprite"},{"t":"sprite_collision_detect","c":"sprite"},{"t":"sprite_y_stretch_glitch","c":"sprite"},{"t":"mob_priority","c":"sprite"},{"t":"sprite_color_swap_mid_line","c":"sprite"},{"t":"text_mode_overlay_render","c":"render"}]}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|