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,398 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: cartridge-8k
|
|
3
|
+
toolchain: cc65
|
|
4
|
+
output_format: CRT
|
|
5
|
+
region: both
|
|
6
|
+
techniques: []
|
|
7
|
+
file_formats: [CRT]
|
|
8
|
+
uses_registers: [DD04, DD05, DD06, DD07, DD0E, DD0F, D020]
|
|
9
|
+
uses_kernal: [IOINIT, RAMTAS, RESTOR, CINT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# cc65 8 KB cartridge: CBM80 start-up, DATA copied from ROM to RAM
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A C program built as a generic 8 KB cartridge at `$8000`. The linker
|
|
19
|
+
configuration drops the BASIC stub, puts the `CBM80` signature at `$8004`,
|
|
20
|
+
places `DATA` in ROM with a run address in RAM, and writes the finished
|
|
21
|
+
`.CRT` container itself, so one `cl65` line produces a file that
|
|
22
|
+
`x64sc -cartcrt` boots. The start-up code lives in the C file as a
|
|
23
|
+
function of inline instructions. The program prints an initialised
|
|
24
|
+
global before and after changing it, the byte the ROM still holds, a
|
|
25
|
+
checksum of the `DATA` image in ROM and of its copy in RAM, and the
|
|
26
|
+
cycles from the end of the KERNAL's set-up to `main`; then it writes
|
|
27
|
+
`$02FF`. Read this with
|
|
28
|
+
[cc65-reference](../../toolchains/cc65-reference.md), "Cartridge
|
|
29
|
+
builds", and
|
|
30
|
+
[cartconv-reference](../../toolchains/cartconv-reference.md) for the
|
|
31
|
+
container fields.
|
|
32
|
+
|
|
33
|
+
## Source
|
|
34
|
+
|
|
35
|
+
```c
|
|
36
|
+
/* cartridge-8k.c - build with -C cartridge-8k.cfg; the link writes cartridge-8k.crt */
|
|
37
|
+
#include <conio.h>
|
|
38
|
+
#include <c64.h>
|
|
39
|
+
#include <peekpoke.h>
|
|
40
|
+
|
|
41
|
+
void coldstart(void);
|
|
42
|
+
|
|
43
|
+
/* ---- The .CRT container, 80 bytes, written by the linker ahead of the ROM
|
|
44
|
+
image: a 64-byte header then a 16-byte CHIP packet, all big-endian. */
|
|
45
|
+
#pragma rodata-name (push, "CRTHDR")
|
|
46
|
+
const unsigned char crt_container[80] = {
|
|
47
|
+
/* "C64 CARTRIDGE " as ASCII bytes: character literals would be
|
|
48
|
+
translated to PETSCII by cc65 -t c64 and VICE would not find them */
|
|
49
|
+
0x43, 0x36, 0x34, 0x20, 0x43, 0x41, 0x52, 0x54,
|
|
50
|
+
0x52, 0x49, 0x44, 0x47, 0x45, 0x20, 0x20, 0x20,
|
|
51
|
+
0x00, 0x00, 0x00, 0x40, /* header length $40 */
|
|
52
|
+
0x01, 0x00, /* version 1.00 */
|
|
53
|
+
0x00, 0x00, /* hardware type 0: generic */
|
|
54
|
+
0x00, /* EXROM low */
|
|
55
|
+
0x01, /* GAME high: 8 KB at $8000 */
|
|
56
|
+
0x00, /* subtype */
|
|
57
|
+
0x00, 0x00, 0x00, 0x00, 0x00,
|
|
58
|
+
0x43, 0x43, 0x36, 0x35, 0x20, 0x38, 0x4B, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* name "CC65 8K", 32 bytes */
|
|
59
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
60
|
+
0x43, 0x48, 0x49, 0x50, /* "CHIP" */
|
|
61
|
+
0x00, 0x00, 0x20, 0x10, /* packet length $2010 */
|
|
62
|
+
0x00, 0x00, /* chip type 0: ROM */
|
|
63
|
+
0x00, 0x00, /* bank 0 */
|
|
64
|
+
0x80, 0x00, /* load $8000 */
|
|
65
|
+
0x20, 0x00 /* size $2000 */
|
|
66
|
+
};
|
|
67
|
+
#pragma rodata-name (pop)
|
|
68
|
+
|
|
69
|
+
/* ---- $8000: cold-start vector, warm-start vector, CBM80 at $8004. */
|
|
70
|
+
#pragma rodata-name (push, "CBM80")
|
|
71
|
+
const struct {
|
|
72
|
+
void (*cold)(void);
|
|
73
|
+
void (*warm)(void);
|
|
74
|
+
unsigned char sig[5];
|
|
75
|
+
} cbm80 = { coldstart, coldstart, { 0xC3, 0xC2, 0xCD, 0x38, 0x30 } };
|
|
76
|
+
#pragma rodata-name (pop)
|
|
77
|
+
|
|
78
|
+
/* ---- The start-up code. The KERNAL jumps here before it has set anything
|
|
79
|
+
up, so this function runs with no stack and no zero page of its own:
|
|
80
|
+
nothing but inline instructions until sp is set. */
|
|
81
|
+
#pragma code-name (push, "STARTUP")
|
|
82
|
+
void coldstart(void)
|
|
83
|
+
{
|
|
84
|
+
asm("sei");
|
|
85
|
+
asm("ldx #$ff");
|
|
86
|
+
asm("txs");
|
|
87
|
+
asm("cld");
|
|
88
|
+
asm("jsr $fda3"); /* IOINIT: CIAs, SID off, port $01 */
|
|
89
|
+
asm("jsr $fd50"); /* RAMTAS: clear $0002-$03FF, size RAM */
|
|
90
|
+
asm("jsr $fd15"); /* RESTOR: KERNAL vectors at $0314 */
|
|
91
|
+
asm("jsr $ff5b"); /* CINT: VIC, screen editor, clear */
|
|
92
|
+
asm("cli");
|
|
93
|
+
/* CIA 2 timer B counts timer A underflows from here until main reads it */
|
|
94
|
+
asm("lda #$ff");
|
|
95
|
+
asm("sta $dd04");
|
|
96
|
+
asm("sta $dd05");
|
|
97
|
+
asm("sta $dd06");
|
|
98
|
+
asm("sta $dd07");
|
|
99
|
+
asm("lda #$51"); /* B: force load, count A underflows, start */
|
|
100
|
+
asm("sta $dd0f");
|
|
101
|
+
asm("lda #$11"); /* A: force load, continuous, start */
|
|
102
|
+
asm("sta $dd0e");
|
|
103
|
+
asm("jsr zerobss"); /* BSS in RAM to zero */
|
|
104
|
+
asm("jsr copydata"); /* DATA: ROM image to its RAM address */
|
|
105
|
+
asm("lda #<(__RAM_START__ + __RAM_SIZE__)");
|
|
106
|
+
asm("ldx #>(__RAM_START__ + __RAM_SIZE__)");
|
|
107
|
+
asm("sta sp");
|
|
108
|
+
asm("stx sp+1"); /* C stack grows down from $D000 */
|
|
109
|
+
asm("jsr initlib"); /* library constructors */
|
|
110
|
+
asm("jsr callmain"); /* main(); it does not return */
|
|
111
|
+
asm("jmp %v", coldstart); /* if it did, or on RESTORE: start again */
|
|
112
|
+
}
|
|
113
|
+
#pragma code-name (pop)
|
|
114
|
+
|
|
115
|
+
/* ---- The program. */
|
|
116
|
+
unsigned char value = 0x42; /* DATA: initialised and writable */
|
|
117
|
+
unsigned counter = 1000; /* DATA */
|
|
118
|
+
unsigned char zeroed[16]; /* BSS: must read as zero */
|
|
119
|
+
|
|
120
|
+
/* Linker symbols carry no C underscore, so they are read through asm. */
|
|
121
|
+
static unsigned data_load(void) { asm("lda #<__DATA_LOAD__"); asm("ldx #>__DATA_LOAD__"); return __AX__; }
|
|
122
|
+
static unsigned data_run(void) { asm("lda #<__DATA_RUN__"); asm("ldx #>__DATA_RUN__"); return __AX__; }
|
|
123
|
+
static unsigned data_size(void) { asm("lda #<__DATA_SIZE__"); asm("ldx #>__DATA_SIZE__"); return __AX__; }
|
|
124
|
+
static unsigned bss_run(void) { asm("lda #<__BSS_RUN__"); asm("ldx #>__BSS_RUN__"); return __AX__; }
|
|
125
|
+
static unsigned bss_size(void) { asm("lda #<__BSS_SIZE__"); asm("ldx #>__BSS_SIZE__"); return __AX__; }
|
|
126
|
+
|
|
127
|
+
static unsigned char sum8(unsigned base, unsigned n)
|
|
128
|
+
{
|
|
129
|
+
unsigned char s = 0;
|
|
130
|
+
unsigned i;
|
|
131
|
+
for (i = 0; i < n; ++i) s += PEEK(base + i);
|
|
132
|
+
return s;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
int main(void)
|
|
136
|
+
{
|
|
137
|
+
unsigned long cycles;
|
|
138
|
+
unsigned ta, tb, i;
|
|
139
|
+
unsigned char before, after, rom_copy, sum_rom, sum_ram, bss_ok, ok;
|
|
140
|
+
|
|
141
|
+
/* stop both timers, then read them: B underflows of A, A remainder */
|
|
142
|
+
CIA2.cra = 0x00;
|
|
143
|
+
CIA2.crb = 0x00;
|
|
144
|
+
ta = CIA2.ta_lo | ((unsigned)CIA2.ta_hi << 8);
|
|
145
|
+
tb = CIA2.tb_lo | ((unsigned)CIA2.tb_hi << 8);
|
|
146
|
+
cycles = (0xFFFFUL - tb) * 65536UL + (0xFFFFUL - ta);
|
|
147
|
+
|
|
148
|
+
before = value; /* copied from ROM */
|
|
149
|
+
sum_rom = sum8(data_load(), data_size());
|
|
150
|
+
sum_ram = sum8(data_run(), data_size());
|
|
151
|
+
value = 0x99; /* writes RAM */
|
|
152
|
+
++counter;
|
|
153
|
+
after = value;
|
|
154
|
+
rom_copy = PEEK(data_load() + ((unsigned)&value - data_run())); /* ROM still $42 */
|
|
155
|
+
|
|
156
|
+
bss_ok = 1;
|
|
157
|
+
for (i = 0; i < sizeof zeroed; ++i) if (zeroed[i]) bss_ok = 0;
|
|
158
|
+
|
|
159
|
+
clrscr();
|
|
160
|
+
cprintf("cc65 8k cartridge\r\n\r\n");
|
|
161
|
+
cprintf("cbm80 at $%04x cold $%04x\r\n", (unsigned)&cbm80, (unsigned)coldstart);
|
|
162
|
+
cprintf("data load $%04x run $%04x size $%04x\r\n", data_load(), data_run(), data_size());
|
|
163
|
+
cprintf("bss run $%04x size $%04x\r\n", bss_run(), bss_size());
|
|
164
|
+
cprintf("value before %02x after %02x rom %02x\r\n", before, after, rom_copy);
|
|
165
|
+
cprintf("counter %u\r\n", counter);
|
|
166
|
+
cprintf("data sum rom %02x ram %02x\r\n", sum_rom, sum_ram);
|
|
167
|
+
cprintf("bss zero %s\r\n", bss_ok ? "yes" : "no");
|
|
168
|
+
cprintf("crt0 to main %lu cycles\r\n", cycles);
|
|
169
|
+
|
|
170
|
+
ok = before == 0x42 && after == 0x99 && rom_copy == 0x42 &&
|
|
171
|
+
sum_rom == sum_ram && counter == 1001 && bss_ok &&
|
|
172
|
+
data_run() < 0x8000 && data_load() >= 0x8000;
|
|
173
|
+
POKE(0x02FF, ok);
|
|
174
|
+
VIC.bordercolor = ok ? COLOR_GREEN : COLOR_RED;
|
|
175
|
+
for (;;) ;
|
|
176
|
+
return 0;
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
The linker configuration, `cartridge-8k.cfg`. The two areas that reach
|
|
181
|
+
the file name it directly, so the container comes out of `ld65` and the
|
|
182
|
+
`.prg` named by `-o` is never written.
|
|
183
|
+
|
|
184
|
+
```cfg
|
|
185
|
+
# cartridge-8k.cfg - one 8 KB ROM at $8000, DATA copied to RAM at start.
|
|
186
|
+
# The linker writes the whole .CRT container: the 80-byte header and
|
|
187
|
+
# CHIP packet from the CRTHDR segment, then the filled 8 KB ROM image.
|
|
188
|
+
SYMBOLS {
|
|
189
|
+
__STACKSIZE__: type = weak, value = $0800; # C stack, top at $D000
|
|
190
|
+
__STARTUP__: type = export, value = 1; # our own start-up code; keeps the library crt0 out
|
|
191
|
+
}
|
|
192
|
+
MEMORY {
|
|
193
|
+
ZP: file = "", start = $0002, size = $001A, define = yes;
|
|
194
|
+
CRTHDR: file = "cartridge-8k.crt", start = $0000, size = $0050, fill = yes;
|
|
195
|
+
ROML: file = "cartridge-8k.crt", start = $8000, size = $2000, fill = yes, fillval = $FF, define = yes;
|
|
196
|
+
RAM: file = "", start = $0800, size = $D000 - __STACKSIZE__ - $0800, define = yes;
|
|
197
|
+
}
|
|
198
|
+
SEGMENTS {
|
|
199
|
+
ZEROPAGE: load = ZP, type = zp;
|
|
200
|
+
CRTHDR: load = CRTHDR, type = ro;
|
|
201
|
+
CBM80: load = ROML, type = ro;
|
|
202
|
+
STARTUP: load = ROML, type = ro;
|
|
203
|
+
LOWCODE: load = ROML, type = ro, optional = yes;
|
|
204
|
+
ONCE: load = ROML, type = ro, optional = yes;
|
|
205
|
+
CODE: load = ROML, type = ro;
|
|
206
|
+
RODATA: load = ROML, type = ro;
|
|
207
|
+
DATA: load = ROML, run = RAM, type = rw, define = yes;
|
|
208
|
+
INIT: load = RAM, type = bss, optional = yes;
|
|
209
|
+
BSS: load = RAM, type = bss, define = yes;
|
|
210
|
+
}
|
|
211
|
+
FEATURES {
|
|
212
|
+
CONDES: type = constructor,
|
|
213
|
+
label = __CONSTRUCTOR_TABLE__,
|
|
214
|
+
count = __CONSTRUCTOR_COUNT__,
|
|
215
|
+
segment = ONCE;
|
|
216
|
+
CONDES: type = destructor,
|
|
217
|
+
label = __DESTRUCTOR_TABLE__,
|
|
218
|
+
count = __DESTRUCTOR_COUNT__,
|
|
219
|
+
segment = RODATA;
|
|
220
|
+
CONDES: type = interruptor,
|
|
221
|
+
label = __INTERRUPTOR_TABLE__,
|
|
222
|
+
count = __INTERRUPTOR_COUNT__,
|
|
223
|
+
segment = RODATA,
|
|
224
|
+
import = __CALLIRQ__;
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Build
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
cl65 -t c64 -O -C cartridge-8k.cfg --mapfile cartridge-8k.map -Ln cartridge-8k.lbl -o cartridge-8k.prg cartridge-8k.c
|
|
232
|
+
# writes cartridge-8k.crt (8,272 bytes: 80 + 8,192) beside the source; no .prg
|
|
233
|
+
cartconv -c cartridge-8k.crt # exit 0; -f prints "Hardware ID: 0 (Generic C64 Cartridge)" and one CHIP at $8000
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
`--mapfile` writes the segment list (cc65 2.19, `cl65` reports V2.18):
|
|
237
|
+
|
|
238
|
+
```text
|
|
239
|
+
Name Start End Size Align
|
|
240
|
+
----------------------------------------------------
|
|
241
|
+
CRTHDR 000000 00004F 000050 00001
|
|
242
|
+
ZEROPAGE 000002 00001B 00001A 00001
|
|
243
|
+
DATA 000800 000836 000037 00001
|
|
244
|
+
BSS 000837 000872 00003C 00001
|
|
245
|
+
CBM80 008000 008008 000009 00001
|
|
246
|
+
STARTUP 008009 008049 000041 00001
|
|
247
|
+
ONCE 00804A 008055 00000C 00001
|
|
248
|
+
CODE 008056 008AE7 000A92 00001
|
|
249
|
+
RODATA 008AE8 008C85 00019E 00001
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`DATA` is listed at its run address; its load address, `$8C86`, is what
|
|
253
|
+
the program prints and what `__DATA_LOAD__` resolves to. The ROM holds
|
|
254
|
+
`$8000`-`$8CBC`, 3,261 bytes of the 8,192, and `ld65` fills the rest with
|
|
255
|
+
`$FF`. `STARTUP` is 65 bytes and is this file's `coldstart` alone: the
|
|
256
|
+
library's own `crt0` was not linked, because the configuration exports
|
|
257
|
+
`__STARTUP__` itself. `ONCE` is the 12 bytes of constructor code the
|
|
258
|
+
conio library brings.
|
|
259
|
+
|
|
260
|
+
The same container from the conventional route, as a check: the last
|
|
261
|
+
8,192 bytes of `cartridge-8k.crt` passed to
|
|
262
|
+
`cartconv -t normal -i rom.bin -o cc.crt -n "CC65 8K"` produced a file
|
|
263
|
+
byte-identical to the linker's (`cmp` silent, run here).
|
|
264
|
+
|
|
265
|
+
## Expected output
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
269
|
+
-limitcycles 4000000 -exitscreenshot cartridge-8k.png -cartcrt cartridge-8k.crt
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Text decoded from the PNG against the character ROM with PIL, from row 0:
|
|
273
|
+
|
|
274
|
+
```text
|
|
275
|
+
CC65 8K CARTRIDGE
|
|
276
|
+
|
|
277
|
+
CBM80 AT $8000 COLD $8009
|
|
278
|
+
DATA LOAD $8C86 RUN $0800 SIZE $0037
|
|
279
|
+
BSS RUN $0837 SIZE $003C
|
|
280
|
+
VALUE BEFORE 42 AFTER 99 ROM 42
|
|
281
|
+
COUNTER 1001
|
|
282
|
+
DATA SUM ROM A1 RAM A1
|
|
283
|
+
BSS ZERO YES
|
|
284
|
+
CRT0 TO MAIN 2281 CYCLES
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
The border is green: `(98, 213, 50)` on `(44, 61, 236)` in the PAL PNG
|
|
288
|
+
(`screenshots/cartridge-8k.png`), `(114, 189, 103)` on `(25, 73, 180)`
|
|
289
|
+
in the NTSC one (`screenshots/cartridge-8k-ntsc.png`, the same command
|
|
290
|
+
with `-model ntsc` after `-default`). Every row above reads the same on
|
|
291
|
+
both models. `$02FF` is 1: a `trace store 02ff` over `-moncommands`
|
|
292
|
+
logged the write at `$82DF` with `A:01`. Measured in VICE x64sc 3.10;
|
|
293
|
+
each model was run twice from the built `.crt` and the PNGs were
|
|
294
|
+
byte-identical.
|
|
295
|
+
|
|
296
|
+
The lines say what the verdict checks. `VALUE BEFORE 42` is the compiled
|
|
297
|
+
initialiser, read from RAM at `$0800` after the copy; `AFTER 99` shows
|
|
298
|
+
the write took, so the variable is in RAM; `ROM 42` is the same byte read
|
|
299
|
+
back from the image at `$8C86`, untouched. The two checksums are the
|
|
300
|
+
55-byte `DATA` image in ROM and its copy in RAM, equal. `COUNTER 1001`
|
|
301
|
+
is the second initialised global, incremented once.
|
|
302
|
+
|
|
303
|
+
**Cold-start cost.** The CIA figure on screen, 2,281 cycles on both
|
|
304
|
+
models, runs from the timer start after `CINT` returns to the first read
|
|
305
|
+
in `main`: `zerobss` over 60 bytes, `copydata` over 55, the stack
|
|
306
|
+
pointer, `initlib`, `callmain`, and the entry of `main`. The whole path
|
|
307
|
+
from the cold-start vector was measured with the monitor, `trace exec
|
|
308
|
+
8009` and `trace exec 80bb` over `-moncommands`, reading the stopwatch
|
|
309
|
+
column of each register line:
|
|
310
|
+
|
|
311
|
+
| Point | PAL stopwatch | NTSC stopwatch |
|
|
312
|
+
|---|---|---|
|
|
313
|
+
| `SEI` at `$8009`, first cartridge instruction | 109 | 109 |
|
|
314
|
+
| `main` at `$80BB` | 1,650,153 | 1,643,242 |
|
|
315
|
+
| `STA $02FF` at `$82DF` | 1,839,555 | 1,834,243 |
|
|
316
|
+
|
|
317
|
+
Vector to `main`: 1,650,044 cycles PAL, 1,643,133 NTSC. The split
|
|
318
|
+
between the four KERNAL calls was measured the same way, with `trace
|
|
319
|
+
exec` on the four `JSR`s at `$8011`, `$8014`, `$8017` and the `CLI` at
|
|
320
|
+
`$801A`; each figure is the stopwatch difference between one traced
|
|
321
|
+
instruction and the next:
|
|
322
|
+
|
|
323
|
+
| Stage | PAL cycles | NTSC cycles |
|
|
324
|
+
|---|---|---|
|
|
325
|
+
| `SEI` to `JSR RAMTAS` (stack set, `IOINIT`) | 147 | 147 |
|
|
326
|
+
| `RAMTAS` | 1,593,289 | 1,593,289 |
|
|
327
|
+
| `RESTOR` | 889 | 889 |
|
|
328
|
+
| `CINT` | 53,221 | 46,310 |
|
|
329
|
+
| `CLI` to `main` (`zerobss`, `copydata`, `sp`, `initlib`, `callmain`) | 2,498 | 2,498 |
|
|
330
|
+
|
|
331
|
+
`RAMTAS` is 96.5 % of the path on PAL: it writes and reads every byte
|
|
332
|
+
from `$0400` up until the cartridge ROM at `$8000` refuses the test.
|
|
333
|
+
`CINT` is the only stage whose cost depends on the model; the other four
|
|
334
|
+
are identical on both. The CIA figure on screen, 2,281, sits inside the
|
|
335
|
+
2,498 of the last row; the rest is the timer start and the read. The
|
|
336
|
+
KERNAL takes the vector 109 cycles after power-on. A CIA timer cannot
|
|
337
|
+
span the whole path: `IOINIT` writes the control registers of both CIAs,
|
|
338
|
+
and a `trace store` on `$DC0E`, `$DC0F`, `$DD0E` and `$DD0F` logged the
|
|
339
|
+
four stores of `$08` at `$FDB0`, `$FDB3`, `$FDB6` and `$FDB9`, stopwatch
|
|
340
|
+
143, 147, 151 and 155 on both models (run here). A timer started at
|
|
341
|
+
`$8009` is therefore stopped 34 cycles later on CIA 1 and 38 on CIA 2;
|
|
342
|
+
that is why the on-screen timer starts after `CINT` and the monitor gives
|
|
343
|
+
the rest.
|
|
344
|
+
|
|
345
|
+
**The control, `DATA` without `run = RAM`.** The same source linked with
|
|
346
|
+
`DATA: load = ROML, type = rw` (run address equal to load address, in
|
|
347
|
+
ROM) booted, entered `main` at the same stopwatch, and then printed
|
|
348
|
+
nothing: the screen stayed clear and the border light blue, `$02FF` was
|
|
349
|
+
never written, and a `trace exec ff48` showed the interrupt entry with
|
|
350
|
+
the B flag set 1,049 cycles into the first `cprintf`, then the KERNAL's
|
|
351
|
+
BRK path at `$FE66`, fifty-five times in the run. The runtime's own
|
|
352
|
+
writable state sat in ROM; the write that should have changed it was
|
|
353
|
+
lost and a later read returned the image's bytes. Which of the
|
|
354
|
+
library's variables broke first was not measured here. The globals did
|
|
355
|
+
not read as zero, and the `DATA` segment size was the same 55 bytes.
|
|
356
|
+
|
|
357
|
+
## Why this works
|
|
358
|
+
|
|
359
|
+
The KERNAL's reset code at `$FCE2` checks for a cartridge before it
|
|
360
|
+
initialises anything: it compares the five bytes at `$8004` against
|
|
361
|
+
`$C3 $C2 $CD $38 $30` (`CBM80` with the letters' high bits set) and, on a
|
|
362
|
+
match, jumps through the vector at `$8000`. The four calls at the top of
|
|
363
|
+
`coldstart` are the ones the KERNAL would have made itself on the other
|
|
364
|
+
path, in the same order, and `CINT` is what makes conio's screen state
|
|
365
|
+
valid; without `RAMTAS` the screen base at `$0288` is unset. The
|
|
366
|
+
`RESTORE` key's NMI runs the same signature check and takes the vector at
|
|
367
|
+
`$8002`, so both vectors point at `coldstart`. The
|
|
368
|
+
[kernal-routines-reference](../../hardware/kernal-routines-reference.md)
|
|
369
|
+
has the four routines.
|
|
370
|
+
|
|
371
|
+
cc65 has no file-scope `asm` (cc65 2.19 stops with `__asm__ is not
|
|
372
|
+
allowed here`) and its inline `asm` refuses `.segment`, `.byte` and
|
|
373
|
+
`.res` (run here), so the start-up code is a C function of inline
|
|
374
|
+
instructions in a segment of its own and the two headers are `const`
|
|
375
|
+
objects placed with `rodata-name`. `coldstart` takes no arguments and has
|
|
376
|
+
no locals, so the compiler emits no prologue and the first byte at
|
|
377
|
+
`$8009` is `SEI`. The runtime routines `zerobss`, `copydata`, `initlib`
|
|
378
|
+
and `callmain` are the library's; the compiler switches `.autoimport` on
|
|
379
|
+
in every file it emits, so naming them, and the linker's `__DATA_LOAD__`
|
|
380
|
+
family, inside `asm` needs no declaration. `copydata` reads
|
|
381
|
+
`__DATA_LOAD__`, `__DATA_RUN__` and `__DATA_SIZE__`, which exist because
|
|
382
|
+
`DATA` carries `define = yes` and a `run` address different from its
|
|
383
|
+
`load`. `__STARTUP__` is exported from the configuration's `SYMBOLS`
|
|
384
|
+
block, which satisfies the `.forceimport __STARTUP__` the compiler
|
|
385
|
+
emits for `main` without pulling the library `crt0` and its `EXEHDR`
|
|
386
|
+
expectations.
|
|
387
|
+
|
|
388
|
+
Writes to `$8000`-`$9FFF` while the cartridge is mapped reach the RAM
|
|
389
|
+
underneath and reads come back from the ROM, the trap
|
|
390
|
+
[ram_under_rom_traps](../../pitfalls/banking.md#ram_under_rom_traps--writes-go-to-ram-under-rom-reads-return-rom-bytes)
|
|
391
|
+
describes for the KERNAL and BASIC ROMs; that is the mechanism behind
|
|
392
|
+
the control above. The container header is written as numeric bytes
|
|
393
|
+
because `cc65 -t c64` translates character literals to PETSCII, and
|
|
394
|
+
`'C'` becomes `$C3`: the first build here carried `C3 36 34` where VICE
|
|
395
|
+
expected `C64`, x64sc refused it with `no CRT header found`, and
|
|
396
|
+
`cartconv -f` printed nothing and exited 0. The field layout is the one
|
|
397
|
+
[cartconv-reference](../../toolchains/cartconv-reference.md) decoded;
|
|
398
|
+
the cross-check against cartconv's own output is in Build.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: hello-world-conio
|
|
3
|
+
toolchain: cc65
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: []
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: []
|
|
9
|
+
uses_kernal: [CHROUT, PLOT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# cc65 Hello World (conio)
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Smallest cc65 program that uses `conio.h` to print `HELLO, WORLD!` to
|
|
19
|
+
the C64 screen. `conio` is cc65's text-mode UI library and produces
|
|
20
|
+
tighter code than `printf` for character output.
|
|
21
|
+
|
|
22
|
+
## Source
|
|
23
|
+
|
|
24
|
+
```c
|
|
25
|
+
// hello.c
|
|
26
|
+
#include <conio.h>
|
|
27
|
+
|
|
28
|
+
int main(void) {
|
|
29
|
+
clrscr();
|
|
30
|
+
cputs("HELLO, WORLD!");
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Build
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
cl65 -O -t c64 -o hello.prg hello.c
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Produces `hello.prg`.
|
|
42
|
+
|
|
43
|
+
## Expected output
|
|
44
|
+
|
|
45
|
+
The screen clears, then prints `HELLO, WORLD!` at the top-left (row 0,
|
|
46
|
+
columns 0-12). The screen is in the **upper/lower-case** character set,
|
|
47
|
+
not the power-on upper-case/graphics set: cc65's conio initialiser sends
|
|
48
|
+
PETSCII `$0E` through CHROUT before `main()` runs (the built PRG contains
|
|
49
|
+
`LDA #$0E ; JSR $FFD2`). That is why an upper-case C string comes out as
|
|
50
|
+
upper-case letters rather than graphics glyphs, and why the `ready.`
|
|
51
|
+
that BASIC prints on row 1 after `main()` returns appears in lower case.
|
|
52
|
+
Write the string in lower case and it prints in lower case. Measured on
|
|
53
|
+
VICE 3.10 (PAL) with cc65 V2.18; the earlier version of this page said
|
|
54
|
+
only "at the top-left" and did not mention the character-set switch.
|
|
55
|
+
|
|
56
|
+
## Why this works
|
|
57
|
+
|
|
58
|
+
`conio.h` is cc65's hardware-aware text-mode library. `clrscr()` and
|
|
59
|
+
`cputs()` compile down to KERNAL/direct-screen-RAM writes with no stdio
|
|
60
|
+
buffering: the built PRG calls the ROM clear-screen body at `$E544`
|
|
61
|
+
(`JSR $E544`, not a jump-table entry), the PLOT vector `$FFF0` to read
|
|
62
|
+
and set the cursor, and CHROUT `$FFD2` once, in the initialiser, for the
|
|
63
|
+
character-set switch described above; the characters themselves are
|
|
64
|
+
stored straight into screen RAM. The `-O` flag enables the optimizer.
|
|
65
|
+
For this listing it barely matters — 478 bytes with `-O` against 482
|
|
66
|
+
without, measured with cc65 V2.18 — because almost all of the PRG is
|
|
67
|
+
library and startup code; the earlier version of this page said the
|
|
68
|
+
unoptimised output is "markedly larger and slower", which is not true
|
|
69
|
+
of this program and was not measured for any other.
|
|
70
|
+
|
|
71
|
+
cc65's `printf` would also work here but pulls in the full format-string
|
|
72
|
+
interpreter and is significantly heavier than `cputs`: the same program
|
|
73
|
+
with `printf("HELLO, WORLD!")` in place of `cputs` builds to 2,663 bytes
|
|
74
|
+
against 478 (cc65 V2.18, `-O`, measured). For text-mode
|
|
75
|
+
utilities, `conio` is the cc65 idiom; for anything more complex,
|
|
76
|
+
consider whether Oscar64 is the better choice.
|