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,290 @@
|
|
|
1
|
+
---
|
|
2
|
+
tool: petcat
|
|
3
|
+
tool_kind: asset-converter
|
|
4
|
+
maintainer: VICE team
|
|
5
|
+
license: GPL-2.0-or-later
|
|
6
|
+
home_url: https://vice-emu.sourceforge.io/
|
|
7
|
+
version_verified: "3.10"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
<!-- doc-type: toolchain-reference -->
|
|
11
|
+
|
|
12
|
+
# petcat: BASIC v2 text to a tokenised PRG, and back
|
|
13
|
+
|
|
14
|
+
## Tool
|
|
15
|
+
|
|
16
|
+
petcat turns BASIC source typed on the host into the tokenised form the
|
|
17
|
+
C64's BASIC interpreter runs, and lists a tokenised PRG back as text. It
|
|
18
|
+
ships with VICE (the README lists it as "a CBM BASIC de-tokenizer") and
|
|
19
|
+
is on this machine at `/opt/homebrew/bin/petcat`. `petcat -version`
|
|
20
|
+
prints `petcat (VICE 3.10)`. Everything marked "run here" was done with
|
|
21
|
+
that build on 2026-09-23.
|
|
22
|
+
|
|
23
|
+
A game needs it in two places. The BASIC stub at `$0801` that every
|
|
24
|
+
auto-running PRG starts with (`10 SYS2061` and the like) can be written
|
|
25
|
+
as one line of text and tokenised, instead of being hand-assembled as
|
|
26
|
+
bytes. And a whole BASIC loader or menu, with colour and cursor control
|
|
27
|
+
codes in its strings, can live in the repository as readable text and be
|
|
28
|
+
built by `make`. Control codes are written as named macros in braces
|
|
29
|
+
(`{clr}`, `{wht}`), so the source needs no unprintable bytes.
|
|
30
|
+
|
|
31
|
+
The licence in the frontmatter is VICE's, read from
|
|
32
|
+
`/opt/homebrew/opt/vice/COPYING` (GPL version 2 with the "any later
|
|
33
|
+
version" clause). petcat is a build tool; its output PRG carries none of
|
|
34
|
+
its code.
|
|
35
|
+
|
|
36
|
+
**Targets:** 6510
|
|
37
|
+
|
|
38
|
+
## Build pipeline
|
|
39
|
+
|
|
40
|
+
Input is plain text on the host, one BASIC line per text line, each
|
|
41
|
+
starting with its line number. petcat has no fixed extension for it;
|
|
42
|
+
`.bas` is used below. Output is a PRG with a two-byte load address.
|
|
43
|
+
|
|
44
|
+
### .PRG — Program file (executable)
|
|
45
|
+
**Produced by:** petcat
|
|
46
|
+
**Consumed by:** petcat, vice
|
|
47
|
+
|
|
48
|
+
Tokenised BASIC in the C64's own memory layout: for each line a two-byte
|
|
49
|
+
link to the next line, a two-byte line number, the line's bytes with
|
|
50
|
+
keywords replaced by one-byte tokens (`$80` and up), a zero, and after the
|
|
51
|
+
last line two more zeros. The byte layout is in
|
|
52
|
+
[c64-file-formats](../formats/c64-file-formats.md), ".PRG"; the stub
|
|
53
|
+
arithmetic is `crunched_data_in_basic_stub` in
|
|
54
|
+
[loaders-packers](../techniques/loaders-packers.md).
|
|
55
|
+
|
|
56
|
+
## Command line
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
petcat -w2 -l 0801 -o stub.prg -- stub.bas # tokenise BASIC v2 text to a PRG at $0801
|
|
60
|
+
petcat -2 -o stub.lst -- stub.prg # list a PRG back as text, macros in braces
|
|
61
|
+
petcat -2 -- stub.prg # the same to stdout, with a ";file ==0801==" header
|
|
62
|
+
petcat -2 -nc -- stub.prg # list without control-code macros
|
|
63
|
+
petcat -k2 # print the BASIC v2 keyword table
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
| Flag | Meaning (from `petcat -help`, exercised here where the text says so) |
|
|
67
|
+
|---|---|
|
|
68
|
+
| `-w<version>` | Tokenise ("write") with the keyword set of a BASIC version. `-w2` is BASIC v2.0, the C64's. With no `-w` petcat lists. |
|
|
69
|
+
| `-<version>` | List a PRG using that version's keywords; `-2` for the C64. The help text says the default set is v7.0 (C128); what a C128-only token byte lists as under each setting was not measured here. |
|
|
70
|
+
| `-l <hex>` | Load address, hex digits only (`0801`, not `$0801` or `0x0801`). Run here: with no `-l` and `-w2` the output still started `01 08`, so `$0801` is the default for the C64 version. Pass it anyway; the file says what you meant. |
|
|
71
|
+
| `-o <name>` | Output file. Without it the listing goes to stdout with a header line; `-nh` drops the header and is the default when writing to a file. |
|
|
72
|
+
| `-c`, `-nc` | Interpret control codes as brace macros when listing (default in text mode), or print none of them. |
|
|
73
|
+
| `-ic` | Match macro names case-insensitively. Run here: `{CLR}` tokenised to `$93` with and without `-ic` on this build, so what `-ic` changes was not established here. |
|
|
74
|
+
| `-qc` | Turn every non-alphanumeric character inside quotes into a control code on listing. Not run here. |
|
|
75
|
+
| `-skip <n>` | Skip `n` bytes at the start of the input. Not run here. |
|
|
76
|
+
| `-k<version>`, `-k` | Print the keyword table for a version, or the list of versions. |
|
|
77
|
+
| `--` | Ends the options; the file list follows. Use it so a file name starting with `-` is not read as a flag. |
|
|
78
|
+
|
|
79
|
+
## Control-code macros
|
|
80
|
+
|
|
81
|
+
Inside a quoted string the text `{name}` becomes one PETSCII control byte.
|
|
82
|
+
Run here: the line below tokenised to exactly the bytes in the third
|
|
83
|
+
column, in this order, and listed back as the same names.
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
10 print "{clr}{home}{up}{down}{left}{rght}{rvon}{rvof}{blk}{wht}{red}{cyn}{pur}{grn}{blu}{yel}{lblu}{gry1}{lred}{orng}"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
| Macro | Effect | Byte |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| `{clr}` | Clear screen, cursor home | `$93` |
|
|
92
|
+
| `{home}` | Cursor home | `$13` |
|
|
93
|
+
| `{up}` `{down}` `{left}` `{rght}` | Cursor moves | `$91` `$11` `$9D` `$1D` |
|
|
94
|
+
| `{rvon}` `{rvof}` | Reverse video on, off | `$12` `$92` |
|
|
95
|
+
| `{blk}` `{wht}` `{red}` `{cyn}` | Text colour 0 to 3 | `$90` `$05` `$1C` `$9F` |
|
|
96
|
+
| `{pur}` `{grn}` `{blu}` `{yel}` | Text colour 4 to 7 | `$9C` `$1E` `$1F` `$9E` |
|
|
97
|
+
| `{orng}` `{lred}` `{gry1}` `{lblu}` | Text colour 8, 10, 11, 14 | `$81` `$96` `$97` `$9A` |
|
|
98
|
+
|
|
99
|
+
petcat knows more names than this table (the full set is in its source,
|
|
100
|
+
`src/petcat.c` in the VICE tree, not read here). A name it does not know
|
|
101
|
+
is a hard error: run here, `{foo}` in a string stopped the build with
|
|
102
|
+
`unknown control code` and exit 255, and the output file was left holding
|
|
103
|
+
only the two load-address bytes. This is the opposite of an unknown
|
|
104
|
+
keyword, which passes through as text. See Pitfalls for both.
|
|
105
|
+
|
|
106
|
+
## The load address rule
|
|
107
|
+
|
|
108
|
+
`-l` sets the two bytes at the front of the file and nothing else. The
|
|
109
|
+
line links inside the file are absolute addresses, and petcat computes
|
|
110
|
+
them from the load address, so a file tokenised with `-l 0801` has its
|
|
111
|
+
first link at `$081A` when the first line is 25 bytes long (run here, the
|
|
112
|
+
stub below). Tokenise for the address the program will be loaded to.
|
|
113
|
+
BASIC's own `LOAD` from direct mode recomputes the links afterwards (the
|
|
114
|
+
ROM's relink routine; from the ROM's design, not measured here), so a
|
|
115
|
+
wrong `-l` is often forgiven there. A file pulled in by a machine-code
|
|
116
|
+
loader, or a stub that a packer's depacker rebuilds, gets no such repair.
|
|
117
|
+
A `SYS` stub that only ever runs from `$0801` needs `-l 0801` and nothing
|
|
118
|
+
else.
|
|
119
|
+
|
|
120
|
+
## Worked example, run here
|
|
121
|
+
|
|
122
|
+
The source, `stub.bas`. Lowercase throughout (see Pitfalls):
|
|
123
|
+
|
|
124
|
+
```text
|
|
125
|
+
10 print "{clr}{wht}petcat stub ok"
|
|
126
|
+
20 poke 767,42
|
|
127
|
+
30 print peek(767)
|
|
128
|
+
40 goto 40
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
`petcat -w2 -l 0801 -o stub.prg -- stub.bas` exited 0 and wrote 64 bytes.
|
|
132
|
+
A hand count agrees: 2 (load address) + 25 (line 10: link 2, number 2,
|
|
133
|
+
`print` token `$99`, the space, the quote, `$93`, `$05`, 14 text bytes,
|
|
134
|
+
the quote, the zero) + 13 (line 20) + 13 (line 30) + 9 (line 40) + 2
|
|
135
|
+
(end marker) = 64. The links in the file are `$081A`, `$0827`, `$0834`,
|
|
136
|
+
`$083D`, each the previous link plus that line's length. `peek` is token
|
|
137
|
+
`$C2`, `poke` `$97`, `goto` `$89`. The space after a keyword is kept as
|
|
138
|
+
`$20`, as the C64's own tokeniser keeps it.
|
|
139
|
+
|
|
140
|
+
Run with the pinned command at 5,000,000 cycles, PAL and NTSC:
|
|
141
|
+
|
|
142
|
+
```text
|
|
143
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
144
|
+
-limitcycles 5000000 -exitscreenshot stub.png -autostart stub.prg
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Measured from the PNGs with the char-ROM decoder: row 0 reads
|
|
148
|
+
`PETCAT STUB OK`, row 1 reads ` 42` (the leading space is BASIC's sign
|
|
149
|
+
position), and the rest of the screen is background, so `{clr}` ran.
|
|
150
|
+
The text pixels are `(255,255,255)`, white, on both models; without
|
|
151
|
+
`{wht}` the default text colour is light blue. Two runs per model gave
|
|
152
|
+
byte-identical PNGs.
|
|
153
|
+
|
|
154
|
+
De-tokenising: `petcat -2 -o back.bas -- stub.prg`, then `diff stub.bas
|
|
155
|
+
back.bas`. Every line differs, and only in one way: petcat right-aligns
|
|
156
|
+
the line number in a five-character field, so each line gains three
|
|
157
|
+
leading spaces. With the leading spaces stripped the two files are
|
|
158
|
+
identical: the macro names come back as `{clr}` and `{wht}`, lowercase,
|
|
159
|
+
and the keywords and the string text are lowercase as they went in.
|
|
160
|
+
`-nc` lists the same program with the two control bytes dropped from the
|
|
161
|
+
string.
|
|
162
|
+
|
|
163
|
+
An unknown keyword: `10 frobnicate 5` tokenised with exit 0 and no
|
|
164
|
+
message. The PRG holds the letters as plain PETSCII text (`46 52 4F 42
|
|
165
|
+
...`), because to petcat a word that is not a keyword is text, exactly as
|
|
166
|
+
it is to the C64's line editor. Run in VICE, the program printed
|
|
167
|
+
`?SYNTAX ERROR IN 10`. petcat does not check syntax; the emulator does.
|
|
168
|
+
|
|
169
|
+
The version flags on one keyword: `10 color 0,1` under `-w2` became
|
|
170
|
+
`43 4F 4C B0`, the letters `COL` followed by the v2 token for `or`
|
|
171
|
+
(`$B0`), because the tokeniser replaces the first keyword it can match
|
|
172
|
+
inside any run of letters, as the C64 does. Under `-w3` (BASIC 3.5) the
|
|
173
|
+
same line became the single token `$E7`. A C64 given the `-w3` file would
|
|
174
|
+
read `$E7` as a token it has no keyword for. Use `-w2` for the C64, always.
|
|
175
|
+
|
|
176
|
+
## Build integration
|
|
177
|
+
|
|
178
|
+
The stub is one text file, tokenised once, and the machine code is
|
|
179
|
+
appended after it. Run here: `10 sys 2304` tokenised to a 15-byte file
|
|
180
|
+
(13 bytes of stub at `$0801` to `$080D`, so the first free byte is
|
|
181
|
+
`$080E`); KickAssembler
|
|
182
|
+
assembled a 15-byte program at `$0900` with no `BasicUpstart`; a build
|
|
183
|
+
step wrote the stub file, then 242 zero bytes, then the code file minus
|
|
184
|
+
its two-byte load address, 270 bytes in all; VICE autostarted it and the
|
|
185
|
+
border turned green (`(98,213,50)` in the PAL PNG), the code's own
|
|
186
|
+
verdict colour. The same three steps as a Makefile; `make game.prg` with
|
|
187
|
+
this file produced a `game.prg` byte-identical to the hand-built one
|
|
188
|
+
(run here, GNU make 3.81 on macOS). The first line matters: when petcat
|
|
189
|
+
refuses a file it still writes a two-byte `stub.prg` with only the load
|
|
190
|
+
address in it, and without `.DELETE_ON_ERROR:` make keeps that file as
|
|
191
|
+
up to date, so the next `make game.prg` builds a 270-byte program with no
|
|
192
|
+
BASIC in it and no error. Run here both ways: with the guard, a bad stub
|
|
193
|
+
failed twice in a row and left no `stub.prg`; without it, the second run
|
|
194
|
+
built `game.prg` from the empty stub.
|
|
195
|
+
|
|
196
|
+
```makefile
|
|
197
|
+
.DELETE_ON_ERROR:
|
|
198
|
+
PETCAT ?= petcat
|
|
199
|
+
KICKASS ?= java -jar $(KICKASS_JAR)
|
|
200
|
+
CODE_AT := 0x0900
|
|
201
|
+
|
|
202
|
+
stub.prg: stub.bas
|
|
203
|
+
$(PETCAT) -w2 -l 0801 -o $@ -- $<
|
|
204
|
+
|
|
205
|
+
code.prg: code.asm
|
|
206
|
+
$(KICKASS) $< -o $@
|
|
207
|
+
|
|
208
|
+
game.prg: stub.prg code.prg
|
|
209
|
+
python3 -c 's=open("stub.prg","rb").read(); c=open("code.prg","rb").read(); pad=$(CODE_AT)-(0x0801+len(s)-2); open("game.prg","wb").write(s+bytes(pad)+c[2:])'
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
The padding is the gap between the stub's last byte and the code's
|
|
213
|
+
origin; it must not be negative, and `CODE_AT` must equal the `* =` in
|
|
214
|
+
the assembly source and the number after `sys` in the stub. Keep the
|
|
215
|
+
three in one place. The same rule serves Oscar64 output built with a
|
|
216
|
+
raw origin, but Oscar64 already emits its own SYS stub for the `c64`
|
|
217
|
+
target ([oscar64-reference](oscar64-reference.md), ".PRG"), so it only
|
|
218
|
+
needs petcat when the loader is a BASIC program in its own right.
|
|
219
|
+
|
|
220
|
+
The alternative for KickAssembler projects is `BasicUpstart2(label)`
|
|
221
|
+
([kickassembler-reference](kickassembler-reference.md)), which emits the
|
|
222
|
+
stub from inside the assembly source. petcat earns its place when the
|
|
223
|
+
stub is more than one `SYS`: a loader that prints a title in colour,
|
|
224
|
+
asks a question, pokes a setting, and then calls the code.
|
|
225
|
+
|
|
226
|
+
## Pitfalls
|
|
227
|
+
|
|
228
|
+
**Keywords and text must be lowercase.** petcat maps lowercase host
|
|
229
|
+
letters to unshifted PETSCII, the letters the C64 shows as capitals in
|
|
230
|
+
its default character set, and uppercase host letters to shifted PETSCII
|
|
231
|
+
(`$C1` and up). Run here: `10 PRINT "HELLO"` tokenised to `D0 D2 C9 CE
|
|
232
|
+
D4` outside the quotes, five shifted letters and no `print` token; listed
|
|
233
|
+
back, petcat printed the `$C9` as `right$`. And `print "{clr}HELLO
|
|
234
|
+
hello"` drew screen codes 72, 69, 76, 76, 79 for `HELLO`, which are
|
|
235
|
+
graphics symbols in the default set, and 8, 5, 12, 12, 15 for `hello`,
|
|
236
|
+
the letters. Write the whole file in lowercase unless a shifted symbol is
|
|
237
|
+
wanted.
|
|
238
|
+
|
|
239
|
+
**Shifted and graphics characters.** An uppercase host letter is the way
|
|
240
|
+
to get a shifted letter: the graphics symbol on that key's right face in
|
|
241
|
+
the default set, the capital letter once the lowercase set is switched
|
|
242
|
+
in. The switch bytes have names: `{swlc}` is `$0E` (lowercase set) and
|
|
243
|
+
`{swuc}` is `$8E` (uppercase set). A byte petcat has no name for is
|
|
244
|
+
written `{$61}`, a hex escape. Run here: a PRG holding `0E 8E 61` in a
|
|
245
|
+
string listed as `{swlc}{swuc}{$61}`, and that text tokenised back to the
|
|
246
|
+
same three bytes. The names for the other graphics characters were not
|
|
247
|
+
exercised here; `-k` lists versions, not macros, so list an existing PRG
|
|
248
|
+
that uses them with `-2` and copy the names it prints, or fall back to
|
|
249
|
+
the hex escape.
|
|
250
|
+
|
|
251
|
+
**Unknown keywords pass silently.** A misspelt keyword becomes text, the
|
|
252
|
+
file tokenises with exit 0, and the failure is `?SYNTAX ERROR` at run
|
|
253
|
+
time. Run the PRG in VICE and read the screen.
|
|
254
|
+
|
|
255
|
+
**Unknown macro names stop the build.** A `{name}` petcat has no entry
|
|
256
|
+
for is an error, not text. Run here: `10 print "{foo}x"` gave
|
|
257
|
+
`Error: line 10 - unknown control code: foo}x"` on stderr and exit 255,
|
|
258
|
+
and the output file held two bytes, the load address and nothing after
|
|
259
|
+
it. A build script that does not check petcat's exit status, or a make
|
|
260
|
+
rule without `.DELETE_ON_ERROR:`, will carry that two-byte file forward
|
|
261
|
+
as if it were the program (see Build integration). Check the name against
|
|
262
|
+
a listing petcat itself produced, or use the `{$xx}` hex escape.
|
|
263
|
+
|
|
264
|
+
**Keywords hide inside names.** `color` tokenised as `COL` plus the `or`
|
|
265
|
+
token under `-w2`; a variable named `tone` or `format` will meet the same
|
|
266
|
+
rule. This is the C64's own behaviour, so petcat is right to do it, but
|
|
267
|
+
the listing will not look like the source.
|
|
268
|
+
|
|
269
|
+
**Line length.** petcat imposed no limit that was met here: a line with a
|
|
270
|
+
90-character string tokenised to 103 bytes and ran, printing all 90
|
|
271
|
+
characters. The C64's screen editor accepts a logical line of 80
|
|
272
|
+
characters (two screen rows), so such a line cannot be re-entered by
|
|
273
|
+
typing after a `LIST`; that limit is from the machine's design and was
|
|
274
|
+
not measured here. Keep loader lines under 80 characters if anyone will
|
|
275
|
+
edit them on the machine.
|
|
276
|
+
|
|
277
|
+
**The listing is not the source.** A de-tokenised file has the line
|
|
278
|
+
number padded to five columns. Strip leading spaces before a diff, or
|
|
279
|
+
compare the PRG bytes from two tokenisations instead.
|
|
280
|
+
|
|
281
|
+
**`-l` takes bare hex.** `-l $0801` and `-l 0x0801` are not the same
|
|
282
|
+
argument as `-l 0801`; the help text says "no leading chars". Not
|
|
283
|
+
measured here what petcat does with them.
|
|
284
|
+
|
|
285
|
+
## See also
|
|
286
|
+
|
|
287
|
+
- `crunched_data_in_basic_stub` in [loaders-packers](../techniques/loaders-packers.md): the stub's byte layout and what it costs.
|
|
288
|
+
- [kickassembler-reference](kickassembler-reference.md): `BasicUpstart2`, the in-source alternative.
|
|
289
|
+
- [release-disk](release-disk.md): putting the finished PRG on a `.d64` with c1541, from the same VICE install.
|
|
290
|
+
- [c64-file-formats](../formats/c64-file-formats.md): the `.PRG` layout.
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
---
|
|
2
|
+
tool: png2prg
|
|
3
|
+
tool_kind: asset-converter
|
|
4
|
+
maintainer: staD020 (burg)
|
|
5
|
+
license: NOASSERTION
|
|
6
|
+
home_url: https://github.com/staD020/png2prg
|
|
7
|
+
version_verified: "1.12"
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
<!-- doc-type: toolchain-reference -->
|
|
11
|
+
|
|
12
|
+
# png2prg: PNG art to C64 bitmap, charset and sprite data
|
|
13
|
+
|
|
14
|
+
## Tool
|
|
15
|
+
|
|
16
|
+
png2prg converts a 320x200 PNG, GIF or JPEG that already obeys C64 colour
|
|
17
|
+
rules into C64 data: a Koala multicolour bitmap, a hires bitmap,
|
|
18
|
+
charsets (single-colour, multicolour, mixed, PETSCII, ECM), sprites, or a
|
|
19
|
+
multicolour interlace bitmap. It finds the palette and the background
|
|
20
|
+
colour itself. It does not reduce colours or dither: a full-colour picture
|
|
21
|
+
is refused, not converted. That makes it a build step for art an artist
|
|
22
|
+
or an agent drew to C64 rules, and it closes a loop: a VICE exit
|
|
23
|
+
screenshot converts back to the same bytes (measured below).
|
|
24
|
+
|
|
25
|
+
The repository has no LICENSE file (checked at commit `4cf8d5b`,
|
|
26
|
+
2025-05-10), so the frontmatter says `NOASSERTION`. Use it as a build
|
|
27
|
+
tool; do not vendor its source or its displayer binaries into a project.
|
|
28
|
+
|
|
29
|
+
Everything marked "run here" was done on 2026-09-23 with png2prg 1.12
|
|
30
|
+
(banner `png2prg 1.12 by burg`), built from commit `4cf8d5b` with Go 1.26.5
|
|
31
|
+
on macOS arm64:
|
|
32
|
+
|
|
33
|
+
```text
|
|
34
|
+
git clone https://github.com/staD020/png2prg
|
|
35
|
+
cd png2prg && go build -o png2prg ./cmd/png2prg
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Targets:** VIC-II
|
|
39
|
+
|
|
40
|
+
## Build pipeline
|
|
41
|
+
|
|
42
|
+
### .PNG — Portable Network Graphics image
|
|
43
|
+
**Consumed by:** png2prg
|
|
44
|
+
|
|
45
|
+
320x200, or a 384x272 VICE PAL screenshot, which png2prg crops at
|
|
46
|
+
x = 32, y = 35 (its README). A 384x247 VICE NTSC screenshot also
|
|
47
|
+
converted correctly here. Sprite-sized images become sprites.
|
|
48
|
+
|
|
49
|
+
### .PRG — Program file (executable)
|
|
50
|
+
**Produced by:** png2prg
|
|
51
|
+
|
|
52
|
+
For `-m koala` without `-d`: 10,003 bytes loading at `$2000`, the same
|
|
53
|
+
byte layout as a Koala `.kla` after its two-byte load address (bitmap,
|
|
54
|
+
1,000 screen bytes, 1,000 colour-RAM bytes, one background byte). The
|
|
55
|
+
README places the file at `$2000` bitmap, `$3F40` screen, `$4328` colour
|
|
56
|
+
RAM, `$4710` background (low nibble; the high nibble holds the border
|
|
57
|
+
colour). With `-d` the file is a self-running viewer packed with TSCrunch
|
|
58
|
+
(2,668 bytes for the test image here).
|
|
59
|
+
|
|
60
|
+
## Command line
|
|
61
|
+
|
|
62
|
+
```text
|
|
63
|
+
png2prg -m koala -o picture.prg picture.png # data only
|
|
64
|
+
png2prg -m koala -d -o show.prg picture.png # self-displaying PRG
|
|
65
|
+
png2prg -m koala -v -o picture.prg picture.png # verbose: palette, colours per cell, clashes
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
| Flag | Meaning (from `png2prg -h` and the README) |
|
|
69
|
+
|---|---|
|
|
70
|
+
| `-m`, `-mode` | Force `koala`, `hires`, `mixedcharset`, `sccharset`, `mccharset`, `petscii`, `ecm`, `scsprites`, `mcsprites`; otherwise png2prg guesses |
|
|
71
|
+
| `-o`, `-out` | Output file; default is the input name with `.prg` |
|
|
72
|
+
| `-d`, `-display` | Include a displayer (png2prg's own display code plus the TSCrunch depacker) |
|
|
73
|
+
| `-bpc`, `-bitpair-colors` | Prefer these colours for the bit pairs, e.g. `-bpc 0,4,7,2` (source flag text: "prefer these colors in 2bit space"; the README uses "force" only for ECM's `$D021`-`$D024`) |
|
|
74
|
+
| `-sid file.sid` | Add a tune to the displayer |
|
|
75
|
+
| `-i`, `-interlace` | Treat two images as an interlace pair |
|
|
76
|
+
| `-no-crunch`, `-no-fade` | Displayer without TSCrunch, without the fade |
|
|
77
|
+
| `-v`, `-vv` | Verbose; `-vv` adds a memory map |
|
|
78
|
+
| `-sym` | Write a `.sym` file of the output's addresses |
|
|
79
|
+
|
|
80
|
+
Charset output is packed to unique characters by default; `-no-pack` turns
|
|
81
|
+
that off (README).
|
|
82
|
+
|
|
83
|
+
Use `-d` output for previews. It contains png2prg's displayer and the
|
|
84
|
+
TSCrunch depacker, and the png2prg repository has no licence, so a shipped
|
|
85
|
+
game should use data-only output and its own display code.
|
|
86
|
+
|
|
87
|
+
## Input rules
|
|
88
|
+
|
|
89
|
+
| Mode | Size | Colours per cell | Shared colours |
|
|
90
|
+
|---|---|---|---|
|
|
91
|
+
| koala | 160x200 double-wide pixels in a 320x200 image | 4 per 4x8 cell | background (`$D021`) |
|
|
92
|
+
| hires | 320x200 | 2 per 8x8 cell | none |
|
|
93
|
+
| mccharset, mixedcharset | 320x200 | 4 per cell | `$D021`, `$D022`, `$D023` |
|
|
94
|
+
| sccharset, petscii | 320x200 | 2 per cell | `$D021` |
|
|
95
|
+
| ecm | 320x200 | 2 per cell | 4 backgrounds, at most 64 characters |
|
|
96
|
+
|
|
97
|
+
The table is from the README; only the koala row was run here.
|
|
98
|
+
|
|
99
|
+
What happened here when the input broke the rules:
|
|
100
|
+
|
|
101
|
+
| Input | Result |
|
|
102
|
+
|---|---|
|
|
103
|
+
| One 4x8 cell with 5 colours | `amount of colors in char 410 (x=80, y=80) 5 > 4 : 0,1,5,11,15`, exit 1, no file |
|
|
104
|
+
| One pixel of (128, 0, 128), a 17th colour | `NewPalette failed: too many colors: 17 while the max is 16`, exit 1, no file |
|
|
105
|
+
| Every white pixel changed to (249, 249, 249) | Converted; output byte-identical to the unchanged image (nearest palette entry) |
|
|
106
|
+
|
|
107
|
+
The clash message names the cell by index and by top-left pixel, in
|
|
108
|
+
320-wide coordinates. Use `-v` to see it.
|
|
109
|
+
|
|
110
|
+
**Palette.** png2prg compares the image with a list of known palettes and
|
|
111
|
+
takes the nearest. The VICE 3.10 `-default` PAL palette (the triples in
|
|
112
|
+
[vice-reference](../runtime/vice-reference.md), "The default palette")
|
|
113
|
+
matched png2prg's entry "vice 3.7.1 internal" at distance 0. The NTSC
|
|
114
|
+
screenshot's nearest palette was "le funge", at distance 341. Drawing with the VICE PAL table is the
|
|
115
|
+
safe choice. Run here.
|
|
116
|
+
|
|
117
|
+
## Round trip, measured
|
|
118
|
+
|
|
119
|
+
1. A Python/PIL script drew a 160x200 test image, doubled to 320x200, in
|
|
120
|
+
the VICE PAL palette: black background and three other colours in every
|
|
121
|
+
4x8 cell, arranged so every cell uses all four bit pairs, and the colour
|
|
122
|
+
triple varies from cell to cell.
|
|
123
|
+
2. `png2prg -m koala -v -o src.prg src.png`: exit 0, background found as
|
|
124
|
+
colour 0, 10,003 bytes.
|
|
125
|
+
3. The file was decoded in Python with `%00` = `$D021`, `%01` = screen
|
|
126
|
+
byte high nibble, `%10` = screen byte low nibble, `%11` = colour RAM.
|
|
127
|
+
0 of 32,000 fat pixels differed from the source. With `%01` and `%10`
|
|
128
|
+
swapped, 16,000 differed.
|
|
129
|
+
4. The bytes, with a `$6000` load address in front, were embedded in the
|
|
130
|
+
Oscar64 1.32.271 build of
|
|
131
|
+
[oscar64/bitmap-koala-viewer](../recipes/oscar64/bitmap-koala-viewer.md)
|
|
132
|
+
with `USE_TEST_IMAGE 0`. The `#embed` line had to go on a line of its
|
|
133
|
+
own (see "The viewer recipe's `#embed` line").
|
|
134
|
+
5. VICE x64sc 3.10, the pinned command, `-limitcycles 6000000`, PAL and
|
|
135
|
+
`-model ntsc`, two runs each, byte-identical PNGs per model.
|
|
136
|
+
6. The display window (PAL x 32 to 351, y 35 to 234; NTSC y 23 to 222) was
|
|
137
|
+
compared pixel by pixel with the source, using each model's palette
|
|
138
|
+
table: 0 of 64,000 pixels differed on either model.
|
|
139
|
+
7. `png2prg -m koala` on the PAL exit screenshot and on the NTSC exit
|
|
140
|
+
screenshot each produced a file byte-identical to step 2's.
|
|
141
|
+
8. `png2prg -m koala -d` on the source: the displayer PRG, run the same
|
|
142
|
+
way at 6,000,000 and 12,000,000 cycles, also showed 0 differing pixels.
|
|
143
|
+
|
|
144
|
+
So for art drawn in the palette and within the cell rules, nothing is lost
|
|
145
|
+
in either direction. What png2prg decides for you is which colour goes in
|
|
146
|
+
which bit pair. `-bpc` states a preference, not a guarantee: when the game
|
|
147
|
+
needs a colour on a fixed pair (for example, the same `%11` colour-RAM value
|
|
148
|
+
everywhere so colour RAM can be filled once), pass `-bpc` and then check the
|
|
149
|
+
colour-RAM bytes in the output.
|
|
150
|
+
|
|
151
|
+
A test of the loop, as commands (the viewer build and the pixel compare are
|
|
152
|
+
the steps above; this is not a gate-built listing):
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
python3 draw.py # writes art.png, 320x200, VICE PAL colours
|
|
156
|
+
png2prg -m koala -o art.prg art.png
|
|
157
|
+
python3 -c "d=open('art.prg','rb').read(); open('image.kla','wb').write(b'\x00\x60'+d[2:])"
|
|
158
|
+
oscar64 -tm=c64 -O2 -o=viewer.prg bitmap-koala-viewer.c # USE_TEST_IMAGE 0
|
|
159
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
160
|
+
-limitcycles 6000000 -exitscreenshot shot.png -autostart viewer.prg
|
|
161
|
+
png2prg -m koala -o back.prg shot.png && cmp art.prg back.prg
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Not measured here
|
|
165
|
+
|
|
166
|
+
- Every mode other than koala, and `-bpc`, `-sid`, interlace and animation.
|
|
167
|
+
- A picture with more than one background candidate, where png2prg has to
|
|
168
|
+
guess `$D021`.
|
|
169
|
+
|
|
170
|
+
## The viewer recipe's `#embed` line
|
|
171
|
+
|
|
172
|
+
`static const char koala_file[] = { #embed "image.kla" };` on one line
|
|
173
|
+
fails to compile (Oscar64 1.32.271: `error 3006: Term starts with invalid
|
|
174
|
+
token ''}''` in most runs here, `error 3037: Semicolon expected` in one). With `#embed` on a line
|
|
175
|
+
of its own it builds. The recipe ships with `USE_TEST_IMAGE 1`, so the
|
|
176
|
+
listing gate never compiles that line. Run here.
|
|
177
|
+
|
|
178
|
+
## Sources
|
|
179
|
+
|
|
180
|
+
- png2prg README and `-h` output: https://github.com/staD020/png2prg (commit `4cf8d5b`)
|
|
181
|
+
- TSCrunch, the displayer's packer, is named in the README; not examined here
|
|
182
|
+
|
|
183
|
+
## See also
|
|
184
|
+
|
|
185
|
+
- [asset-pipelines](../art/asset-pipelines.md), "Koala bitmap (.kla)" for the byte layout
|
|
186
|
+
- [art-production-reference](../art/art-production-reference.md), drawing to C64 rules
|
|
187
|
+
- [vice-reference](../runtime/vice-reference.md), "Reading the exit screenshot"
|
|
188
|
+
- [bitmap-modes](../techniques/bitmap-modes.md), `koala_format` and `multicolor_bitmap`
|