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,620 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: big-font-scroller
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [big_font_2x2, char_scroll_buffer_h, soft_scroll_h]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D012, D016, D018, D019, D01A, D020, DC04, DC05, DC0D, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Big-Font 2x2 Scroller
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A message scrolls across two text rows in letters twice the normal size.
|
|
19
|
+
At start the program copies the upper-case ROM font out from under I/O and
|
|
20
|
+
expands each of its first 64 glyphs into four characters, one per 4x4
|
|
21
|
+
quadrant scaled by two, so a 2 KB charset at $3000 holds a 2x2 version of
|
|
22
|
+
every screen code from 0 to 63. Every frame a raster interrupt steps
|
|
23
|
+
$D016 XSCROLL down one pixel; every eighth frame it rotates both scroller
|
|
24
|
+
rows one cell left, appends the next half-letter and resets XSCROLL to 7.
|
|
25
|
+
The whole screen, the readout included, is drawn in the big font, so the
|
|
26
|
+
picture is its own proof that the charset was built correctly.
|
|
27
|
+
|
|
28
|
+
The program grades itself. CIA1 timer A times the rotate and append, the
|
|
29
|
+
raster is read straight after it, and after 200 frames `$02FF` is `$01`
|
|
30
|
+
with a green border if every carry finished while the raster was still on
|
|
31
|
+
lines 240 to 255 of the same frame, or `$02` with a red border if one did
|
|
32
|
+
not. Measured in VICE x64sc 3.10 on both models: the copy reads 708
|
|
33
|
+
cycles (a left-half carry; a right-half carry reads 715, and 43 of either
|
|
34
|
+
is the badline at line 243 that the copy crosses), it ends on line 253
|
|
35
|
+
(PAL) or 252 (NTSC), and the verdict is pass.
|
|
36
|
+
|
|
37
|
+
## Source
|
|
38
|
+
|
|
39
|
+
```asm
|
|
40
|
+
// big-font-scroller.asm
|
|
41
|
+
// A two-row scroller in 2x2 letters. At start the upper-case ROM font is
|
|
42
|
+
// copied out from under I/O and expanded into a 2 KB charset in which
|
|
43
|
+
// every source glyph 0-63 becomes four codes, one per 4x4 quadrant scaled
|
|
44
|
+
// by two. Screen code g draws as codes 4g, 4g+1 on the top row and 4g+2,
|
|
45
|
+
// 4g+3 on the row below. The whole screen, HUD included, uses that font.
|
|
46
|
+
//
|
|
47
|
+
// Every frame a raster IRQ at line 240 steps $D016 XSCROLL down one pixel.
|
|
48
|
+
// Every eighth frame it rotates both scroller rows one cell left, appends
|
|
49
|
+
// the next half-letter and resets XSCROLL to 7. CIA1 timer A times the
|
|
50
|
+
// rotate and append; the raster is read straight after it. Pass condition:
|
|
51
|
+
// on every carry the raster is still on lines 240-255 of the same frame
|
|
52
|
+
// ($D011 bit 7 clear, $D012 >= 240), a window of 16 lines that holds one
|
|
53
|
+
// badline (243). After FRAMES frames $02FF = $01 and the border is green
|
|
54
|
+
// if no carry missed the window, else $02FF = $02 and the border is red.
|
|
55
|
+
//
|
|
56
|
+
// Region: both. The window ends at line 255 so it does not wrap on NTSC
|
|
57
|
+
// (263 lines) and the test is one bit and one compare.
|
|
58
|
+
|
|
59
|
+
.const SCREEN = $0400
|
|
60
|
+
.const COLOUR = $d800
|
|
61
|
+
.const CHARSET = $3000 // 2 KB in VIC bank 0: $D018 = $1C
|
|
62
|
+
.const ROM_FONT = $d000 // upper-case set, first 2 KB of the char ROM
|
|
63
|
+
.const GLYPHS = 64 // screen codes 0-63 -> big-font codes 0-255
|
|
64
|
+
.const ROW_A = 11 // scroller top row
|
|
65
|
+
.const ROW_B = 12
|
|
66
|
+
.const IRQ_LINE = 240
|
|
67
|
+
.const FRAMES = 200 // verdict after this many frames
|
|
68
|
+
.const RESULT = $02ff // verdict byte read by a harness
|
|
69
|
+
.const BIG_SPACE = $80 // any quadrant of the space glyph is blank
|
|
70
|
+
|
|
71
|
+
.const zp_src = $fb // init: ROM font pointer; later: message pointer
|
|
72
|
+
.const zp_dst = $fd // init: charset pointer; later: HUD row pointer
|
|
73
|
+
|
|
74
|
+
BasicUpstart2(start)
|
|
75
|
+
|
|
76
|
+
// ---------------------------------------------------------------------------
|
|
77
|
+
// CIA1 timer A as a stopwatch, phi2 clock, counting down from $FFFF.
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
.macro t_start() {
|
|
80
|
+
lda #$00
|
|
81
|
+
sta $dc0e
|
|
82
|
+
lda #$ff
|
|
83
|
+
sta $dc04
|
|
84
|
+
sta $dc05
|
|
85
|
+
lda #$11 // force load, start, count phi2
|
|
86
|
+
sta $dc0e
|
|
87
|
+
}
|
|
88
|
+
.macro t_stop(addr) {
|
|
89
|
+
lda #$00
|
|
90
|
+
sta $dc0e
|
|
91
|
+
sec
|
|
92
|
+
lda #$ff
|
|
93
|
+
sbc $dc04
|
|
94
|
+
sta addr
|
|
95
|
+
lda #$ff
|
|
96
|
+
sbc $dc05
|
|
97
|
+
sta addr + 1
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Draw a screen-code string in big letters: top-left cell at (row, col).
|
|
101
|
+
.macro draw_big(str, len, row, col) {
|
|
102
|
+
lda #<(SCREEN + row * 40 + col)
|
|
103
|
+
sta zp_dst
|
|
104
|
+
lda #>(SCREEN + row * 40 + col)
|
|
105
|
+
sta zp_dst + 1
|
|
106
|
+
ldx #0
|
|
107
|
+
!: txa
|
|
108
|
+
asl
|
|
109
|
+
tay // cell offset = 2 * index
|
|
110
|
+
lda str, x
|
|
111
|
+
jsr put_big
|
|
112
|
+
inx
|
|
113
|
+
cpx #len
|
|
114
|
+
bne !-
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
* = $0810
|
|
118
|
+
start:
|
|
119
|
+
sei
|
|
120
|
+
lda #$7f
|
|
121
|
+
sta $dc0d // no CIA1 interrupts: timer A is the stopwatch
|
|
122
|
+
lda $dc0d
|
|
123
|
+
|
|
124
|
+
// Blank the screen with the space glyph's quadrant and colour the rows.
|
|
125
|
+
lda #BIG_SPACE
|
|
126
|
+
ldx #0
|
|
127
|
+
!: sta SCREEN, x
|
|
128
|
+
sta SCREEN + $100, x
|
|
129
|
+
sta SCREEN + $200, x
|
|
130
|
+
sta SCREEN + $2e8, x
|
|
131
|
+
inx
|
|
132
|
+
bne !-
|
|
133
|
+
ldx #39
|
|
134
|
+
!: lda #7 // title: yellow
|
|
135
|
+
sta COLOUR + 1 * 40, x
|
|
136
|
+
sta COLOUR + 2 * 40, x
|
|
137
|
+
lda #1 // scroller top row: white
|
|
138
|
+
sta COLOUR + ROW_A * 40, x
|
|
139
|
+
lda #3 // scroller bottom row: cyan
|
|
140
|
+
sta COLOUR + ROW_B * 40, x
|
|
141
|
+
lda #15 // HUD: light grey
|
|
142
|
+
sta COLOUR + 5 * 40, x
|
|
143
|
+
sta COLOUR + 6 * 40, x
|
|
144
|
+
sta COLOUR + 14 * 40, x
|
|
145
|
+
sta COLOUR + 15 * 40, x
|
|
146
|
+
sta COLOUR + 17 * 40, x
|
|
147
|
+
sta COLOUR + 18 * 40, x
|
|
148
|
+
sta COLOUR + 20 * 40, x
|
|
149
|
+
sta COLOUR + 21 * 40, x
|
|
150
|
+
dex
|
|
151
|
+
bpl !-
|
|
152
|
+
|
|
153
|
+
t_start()
|
|
154
|
+
jsr build_font
|
|
155
|
+
t_stop(font_count)
|
|
156
|
+
|
|
157
|
+
draw_big(t_title, 12, 1, 8)
|
|
158
|
+
draw_big(t_font, 4, 5, 3)
|
|
159
|
+
draw_big(t_cycles, 6, 5, 25)
|
|
160
|
+
draw_big(t_copy, 4, 14, 3)
|
|
161
|
+
draw_big(t_cycles, 6, 14, 25)
|
|
162
|
+
draw_big(t_raster, 6, 17, 3)
|
|
163
|
+
draw_big(t_frame, 5, 20, 3)
|
|
164
|
+
|
|
165
|
+
// Stopwatch overhead: an empty start/stop pair.
|
|
166
|
+
t_start()
|
|
167
|
+
t_stop(null_count)
|
|
168
|
+
sec
|
|
169
|
+
lda font_count
|
|
170
|
+
sbc null_count
|
|
171
|
+
sta num
|
|
172
|
+
lda font_count + 1
|
|
173
|
+
sbc null_count + 1
|
|
174
|
+
sta num + 1
|
|
175
|
+
lda #<(SCREEN + 5 * 40 + 13)
|
|
176
|
+
sta zp_dst
|
|
177
|
+
lda #>(SCREEN + 5 * 40 + 13)
|
|
178
|
+
sta zp_dst + 1
|
|
179
|
+
jsr print_big5
|
|
180
|
+
|
|
181
|
+
lda #<message
|
|
182
|
+
sta zp_src
|
|
183
|
+
lda #>message
|
|
184
|
+
sta zp_src + 1
|
|
185
|
+
|
|
186
|
+
lda #$1c // screen $0400, charset $3000
|
|
187
|
+
sta $d018
|
|
188
|
+
lda #$1b
|
|
189
|
+
sta $d011
|
|
190
|
+
lda $d016
|
|
191
|
+
and #$f0 // CSEL = 0 (38 columns), XSCROLL = 0
|
|
192
|
+
ora #7
|
|
193
|
+
sta $d016
|
|
194
|
+
lda #<irq
|
|
195
|
+
sta $0314
|
|
196
|
+
lda #>irq
|
|
197
|
+
sta $0315
|
|
198
|
+
lda #IRQ_LINE
|
|
199
|
+
sta $d012
|
|
200
|
+
lda #$01
|
|
201
|
+
sta $d01a
|
|
202
|
+
sta $d019
|
|
203
|
+
cli
|
|
204
|
+
jmp *
|
|
205
|
+
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// Expand the ROM font: glyph g, source row s (0-7), high nibble -> left
|
|
208
|
+
// quadrant, low nibble -> right quadrant; each nibble becomes two rows of a
|
|
209
|
+
// pixel-doubled byte. Quadrant order 0 TL, 1 TR, 2 BL, 3 BR, 8 bytes each.
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
build_font:
|
|
212
|
+
lda $01
|
|
213
|
+
and #$f8
|
|
214
|
+
ora #$03 // CHAREN = 0: char ROM at $D000, I/O out
|
|
215
|
+
sta $01
|
|
216
|
+
lda #<ROM_FONT
|
|
217
|
+
sta zp_src
|
|
218
|
+
lda #>ROM_FONT
|
|
219
|
+
sta zp_src + 1
|
|
220
|
+
lda #<CHARSET
|
|
221
|
+
sta zp_dst
|
|
222
|
+
lda #>CHARSET
|
|
223
|
+
sta zp_dst + 1
|
|
224
|
+
lda #GLYPHS
|
|
225
|
+
sta glyph_left
|
|
226
|
+
glyph:
|
|
227
|
+
ldy #0
|
|
228
|
+
row:
|
|
229
|
+
sty srow
|
|
230
|
+
lda (zp_src), y
|
|
231
|
+
pha
|
|
232
|
+
lsr
|
|
233
|
+
lsr
|
|
234
|
+
lsr
|
|
235
|
+
lsr
|
|
236
|
+
tax
|
|
237
|
+
lda dbl, x // high nibble doubled
|
|
238
|
+
ldy srow
|
|
239
|
+
ldx off_left, y
|
|
240
|
+
stx srow_off
|
|
241
|
+
ldy srow_off
|
|
242
|
+
sta (zp_dst), y
|
|
243
|
+
iny
|
|
244
|
+
sta (zp_dst), y
|
|
245
|
+
pla
|
|
246
|
+
and #$0f
|
|
247
|
+
tax
|
|
248
|
+
tya
|
|
249
|
+
clc
|
|
250
|
+
adc #7 // same rows in the right-hand quadrant
|
|
251
|
+
tay
|
|
252
|
+
lda dbl, x // low nibble doubled
|
|
253
|
+
sta (zp_dst), y
|
|
254
|
+
iny
|
|
255
|
+
sta (zp_dst), y
|
|
256
|
+
ldy srow
|
|
257
|
+
iny
|
|
258
|
+
cpy #8
|
|
259
|
+
bne row
|
|
260
|
+
lda zp_src
|
|
261
|
+
clc
|
|
262
|
+
adc #8
|
|
263
|
+
sta zp_src
|
|
264
|
+
bcc !+
|
|
265
|
+
inc zp_src + 1
|
|
266
|
+
!: lda zp_dst
|
|
267
|
+
clc
|
|
268
|
+
adc #32
|
|
269
|
+
sta zp_dst
|
|
270
|
+
bcc !+
|
|
271
|
+
inc zp_dst + 1
|
|
272
|
+
!: dec glyph_left
|
|
273
|
+
bne glyph
|
|
274
|
+
lda $01
|
|
275
|
+
and #$f8
|
|
276
|
+
ora #$07 // I/O back
|
|
277
|
+
sta $01
|
|
278
|
+
rts
|
|
279
|
+
|
|
280
|
+
// ---------------------------------------------------------------------------
|
|
281
|
+
// Once per frame.
|
|
282
|
+
// ---------------------------------------------------------------------------
|
|
283
|
+
irq:
|
|
284
|
+
inc frames
|
|
285
|
+
bne !+
|
|
286
|
+
inc frames + 1
|
|
287
|
+
!: dec xscroll
|
|
288
|
+
bpl set_x
|
|
289
|
+
lda #7
|
|
290
|
+
sta xscroll
|
|
291
|
+
jsr carry
|
|
292
|
+
set_x:
|
|
293
|
+
lda $d016
|
|
294
|
+
and #$f8
|
|
295
|
+
ora xscroll
|
|
296
|
+
sta $d016
|
|
297
|
+
|
|
298
|
+
lda frames + 1
|
|
299
|
+
cmp #>FRAMES
|
|
300
|
+
bne done
|
|
301
|
+
lda frames
|
|
302
|
+
cmp #<FRAMES
|
|
303
|
+
bne done
|
|
304
|
+
lda fails
|
|
305
|
+
beq pass
|
|
306
|
+
lda #$02
|
|
307
|
+
sta RESULT
|
|
308
|
+
lda #2 // red
|
|
309
|
+
sta $d020
|
|
310
|
+
draw_big(t_fail, 4, 20, 27)
|
|
311
|
+
jmp done
|
|
312
|
+
pass:
|
|
313
|
+
lda #$01
|
|
314
|
+
sta RESULT
|
|
315
|
+
lda #5 // green
|
|
316
|
+
sta $d020
|
|
317
|
+
draw_big(t_pass, 4, 20, 27)
|
|
318
|
+
done:
|
|
319
|
+
lda #$01
|
|
320
|
+
sta $d019
|
|
321
|
+
jmp $ea31
|
|
322
|
+
|
|
323
|
+
// Every eighth frame: rotate both rows one cell left, append the next
|
|
324
|
+
// half-letter, read the raster, update the HUD.
|
|
325
|
+
carry:
|
|
326
|
+
t_start()
|
|
327
|
+
.for (var i = 0; i < 39; i++) {
|
|
328
|
+
lda SCREEN + ROW_A * 40 + i + 1
|
|
329
|
+
sta SCREEN + ROW_A * 40 + i
|
|
330
|
+
}
|
|
331
|
+
.for (var i = 0; i < 39; i++) {
|
|
332
|
+
lda SCREEN + ROW_B * 40 + i + 1
|
|
333
|
+
sta SCREEN + ROW_B * 40 + i
|
|
334
|
+
}
|
|
335
|
+
ldy #0
|
|
336
|
+
lda (zp_src), y
|
|
337
|
+
bpl !+ // $FF ends the message: wrap
|
|
338
|
+
lda #<message
|
|
339
|
+
sta zp_src
|
|
340
|
+
lda #>message
|
|
341
|
+
sta zp_src + 1
|
|
342
|
+
lda (zp_src), y
|
|
343
|
+
!: asl
|
|
344
|
+
asl
|
|
345
|
+
ora half // 0: left half, 1: right half
|
|
346
|
+
sta SCREEN + ROW_A * 40 + 39
|
|
347
|
+
ora #2
|
|
348
|
+
sta SCREEN + ROW_B * 40 + 39
|
|
349
|
+
lda half
|
|
350
|
+
eor #1
|
|
351
|
+
sta half
|
|
352
|
+
bne !+ // right half done: next letter
|
|
353
|
+
inc zp_src
|
|
354
|
+
bne !+
|
|
355
|
+
inc zp_src + 1
|
|
356
|
+
!: t_stop(raw_count)
|
|
357
|
+
|
|
358
|
+
lda $d011
|
|
359
|
+
bmi miss // line 256 or later
|
|
360
|
+
lda $d012
|
|
361
|
+
sta line_seen
|
|
362
|
+
cmp #IRQ_LINE
|
|
363
|
+
bcs hud // 240-255: inside the window
|
|
364
|
+
miss:
|
|
365
|
+
lda #1
|
|
366
|
+
sta fails
|
|
367
|
+
hud:
|
|
368
|
+
sec
|
|
369
|
+
lda raw_count
|
|
370
|
+
sbc null_count
|
|
371
|
+
sta num
|
|
372
|
+
lda raw_count + 1
|
|
373
|
+
sbc null_count + 1
|
|
374
|
+
sta num + 1
|
|
375
|
+
lda #<(SCREEN + 14 * 40 + 13)
|
|
376
|
+
sta zp_dst
|
|
377
|
+
lda #>(SCREEN + 14 * 40 + 13)
|
|
378
|
+
sta zp_dst + 1
|
|
379
|
+
jsr print_big5
|
|
380
|
+
lda line_seen
|
|
381
|
+
sta num
|
|
382
|
+
lda #0
|
|
383
|
+
sta num + 1
|
|
384
|
+
lda #<(SCREEN + 17 * 40 + 17)
|
|
385
|
+
sta zp_dst
|
|
386
|
+
lda #>(SCREEN + 17 * 40 + 17)
|
|
387
|
+
sta zp_dst + 1
|
|
388
|
+
jsr print_big5
|
|
389
|
+
lda frames
|
|
390
|
+
sta num
|
|
391
|
+
lda frames + 1
|
|
392
|
+
sta num + 1
|
|
393
|
+
lda #<(SCREEN + 20 * 40 + 15)
|
|
394
|
+
sta zp_dst
|
|
395
|
+
lda #>(SCREEN + 20 * 40 + 15)
|
|
396
|
+
sta zp_dst + 1
|
|
397
|
+
jsr print_big5
|
|
398
|
+
rts
|
|
399
|
+
|
|
400
|
+
// A = screen code 0-63, Y = cell offset of the left cell; zp_dst = top row.
|
|
401
|
+
put_big:
|
|
402
|
+
asl
|
|
403
|
+
asl
|
|
404
|
+
sta big_tmp
|
|
405
|
+
sta (zp_dst), y
|
|
406
|
+
iny
|
|
407
|
+
ora #1
|
|
408
|
+
sta (zp_dst), y
|
|
409
|
+
tya
|
|
410
|
+
clc
|
|
411
|
+
adc #39 // the row below, left cell
|
|
412
|
+
tay
|
|
413
|
+
lda big_tmp
|
|
414
|
+
ora #2
|
|
415
|
+
sta (zp_dst), y
|
|
416
|
+
iny
|
|
417
|
+
ora #1
|
|
418
|
+
sta (zp_dst), y
|
|
419
|
+
rts
|
|
420
|
+
|
|
421
|
+
// num (16-bit) as five big digits from (zp_dst), leading zeros as spaces.
|
|
422
|
+
print_big5:
|
|
423
|
+
lda #0
|
|
424
|
+
sta col_off
|
|
425
|
+
sta lead // no digit shown yet
|
|
426
|
+
ldx #0
|
|
427
|
+
digit:
|
|
428
|
+
lda #$30 // screen code '0'
|
|
429
|
+
sta dig
|
|
430
|
+
sub:
|
|
431
|
+
lda num
|
|
432
|
+
sec
|
|
433
|
+
sbc pow_lo, x
|
|
434
|
+
tay
|
|
435
|
+
lda num + 1
|
|
436
|
+
sbc pow_hi, x
|
|
437
|
+
bcc emit
|
|
438
|
+
sta num + 1
|
|
439
|
+
sty num
|
|
440
|
+
inc dig
|
|
441
|
+
jmp sub
|
|
442
|
+
emit:
|
|
443
|
+
lda dig
|
|
444
|
+
cmp #$30
|
|
445
|
+
bne show
|
|
446
|
+
cpx #4
|
|
447
|
+
beq show // the units digit is always shown
|
|
448
|
+
lda lead
|
|
449
|
+
bne show
|
|
450
|
+
lda #$20 // leading zero: a space
|
|
451
|
+
bne put // always
|
|
452
|
+
show:
|
|
453
|
+
lda #1
|
|
454
|
+
sta lead
|
|
455
|
+
lda dig
|
|
456
|
+
put:
|
|
457
|
+
ldy col_off
|
|
458
|
+
jsr put_big
|
|
459
|
+
inc col_off
|
|
460
|
+
inc col_off
|
|
461
|
+
inx
|
|
462
|
+
cpx #5
|
|
463
|
+
bne digit
|
|
464
|
+
rts
|
|
465
|
+
|
|
466
|
+
// ---------------------------------------------------------------------------
|
|
467
|
+
// Data
|
|
468
|
+
// ---------------------------------------------------------------------------
|
|
469
|
+
dbl: .fill 16, ((i >> 3) & 1) * $c0 + ((i >> 2) & 1) * $30 + ((i >> 1) & 1) * $0c + (i & 1) * $03
|
|
470
|
+
off_left: .byte 0, 2, 4, 6, 16, 18, 20, 22
|
|
471
|
+
pow_lo: .byte <10000, <1000, <100, <10, <1
|
|
472
|
+
pow_hi: .byte >10000, >1000, >100, >10, >1
|
|
473
|
+
|
|
474
|
+
.encoding "screencode_upper"
|
|
475
|
+
t_title: .text "2X2 BIG FONT"
|
|
476
|
+
t_copy: .text "COPY"
|
|
477
|
+
t_font: .text "FONT"
|
|
478
|
+
t_cycles: .text "CYCLES"
|
|
479
|
+
t_raster: .text "RASTER"
|
|
480
|
+
t_frame: .text "FRAME"
|
|
481
|
+
t_pass: .text "PASS"
|
|
482
|
+
t_fail: .text "FAIL"
|
|
483
|
+
message: .text "HELLO FROM A 2X2 SCROLLER ... EVERY LETTER IS FOUR CELLS OF ONE CHARSET ... "
|
|
484
|
+
.byte $ff
|
|
485
|
+
|
|
486
|
+
xscroll: .byte 7
|
|
487
|
+
half: .byte 0
|
|
488
|
+
frames: .word 0
|
|
489
|
+
fails: .byte 0
|
|
490
|
+
raw_count: .word 0
|
|
491
|
+
null_count: .word 0
|
|
492
|
+
font_count: .word 0
|
|
493
|
+
line_seen: .byte 0
|
|
494
|
+
num: .word 0
|
|
495
|
+
dig: .byte 0
|
|
496
|
+
col_off: .byte 0
|
|
497
|
+
lead: .byte 0
|
|
498
|
+
big_tmp: .byte 0
|
|
499
|
+
srow: .byte 0
|
|
500
|
+
srow_off: .byte 0
|
|
501
|
+
glyph_left: .byte 0
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
## Build
|
|
505
|
+
|
|
506
|
+
```bash
|
|
507
|
+
java -jar KickAss.jar big-font-scroller.asm -o big-font-scroller.prg
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
`-showmem` reports one segment, $0810 to $0E5A: 1,611 bytes of code, tables
|
|
511
|
+
and text. The 2 KB charset at $3000 is built at run time and is not in the
|
|
512
|
+
PRG.
|
|
513
|
+
|
|
514
|
+
## Expected output
|
|
515
|
+
|
|
516
|
+
A blue screen whose every character is 16 pixels square. Rows 1 and 2 hold
|
|
517
|
+
the title `2X2 BIG FONT` in yellow. Rows 11 and 12 are the scroller, top
|
|
518
|
+
row white and bottom row cyan: `HELLO FROM A 2X2 SCROLLER ...` enters from
|
|
519
|
+
under the right border one pixel a frame and leaves under the left one.
|
|
520
|
+
Rows 5 and 6, 14 and 15, 17 and 18, and 20 and 21 are the readout in light
|
|
521
|
+
grey:
|
|
522
|
+
|
|
523
|
+
| Rows | Text | PAL | NTSC |
|
|
524
|
+
|---|---|---|---|
|
|
525
|
+
| 5-6 | `FONT n CYCLES` | 57757 | 58061 |
|
|
526
|
+
| 14-15 | `COPY n CYCLES` | 708 | 708 |
|
|
527
|
+
| 17-18 | `RASTER n` | 253 | 252 |
|
|
528
|
+
| 20-21 | `FRAME n PASS` | 248 | 280 |
|
|
529
|
+
|
|
530
|
+
`FONT` is the charset build, measured once at start with the display on,
|
|
531
|
+
so it includes the badlines it ran across; `COPY` is the last carry's
|
|
532
|
+
rotate and append, net of the stopwatch overhead the program measures for
|
|
533
|
+
itself at start (5 cycles, read from memory with a `-moncommands` dump).
|
|
534
|
+
Both pinned frames caught a left-half carry, which reads 708; a
|
|
535
|
+
right-half carry, which also advances the message pointer, reads 715 (PAL,
|
|
536
|
+
one carry later at `-limitcycles 8157248`). Both figures include the
|
|
537
|
+
43-cycle badline at line 243; with the interrupt moved to line 251 the
|
|
538
|
+
same carries read 665 and 672. `RASTER` is `$D012` read straight after
|
|
539
|
+
that copy;
|
|
540
|
+
`FRAME` is the frame the last carry ran in. The verdict word appears at
|
|
541
|
+
frame 200: `PASS` with the border green, `FAIL` with it red. At the pinned
|
|
542
|
+
8,000,000 cycles the border is green on both models, `$02FF` holds `$01`
|
|
543
|
+
(a `-moncommands` store trace shows the KERNAL's page-2 clear writing `00`
|
|
544
|
+
at cycle 5,305 and the program's `STA $02FF` writing `01` at cycle
|
|
545
|
+
6,977,550 on PAL), and the frame the picture caught had XSCROLL at 4.
|
|
546
|
+
|
|
547
|
+
Screenshots from the pinned runs: `screenshots/big-font-scroller.png`
|
|
548
|
+
(PAL) and `screenshots/big-font-scroller-ntsc.png` (NTSC). Two runs of
|
|
549
|
+
each pinned command produced byte-identical files.
|
|
550
|
+
|
|
551
|
+
## Why this works
|
|
552
|
+
|
|
553
|
+
### One glyph, four codes
|
|
554
|
+
|
|
555
|
+
The character generator reads eight bytes per screen code at charset base
|
|
556
|
+
plus code times 8. A glyph scaled by two is 16 rows of 16 pixels, which is
|
|
557
|
+
four ordinary cells: the top-left cell shows source rows 0 to 3, high
|
|
558
|
+
nibble, each row twice and each pixel twice. `build_font` walks the 64
|
|
559
|
+
source glyphs and for each source row `s` writes the high nibble's
|
|
560
|
+
doubled byte to rows `2(s&3)` and `2(s&3)+1` of quadrant `s/4 * 2` and
|
|
561
|
+
the low nibble's to the quadrant beside it (`off_left` is that offset
|
|
562
|
+
table, `dbl` the 16-entry nibble-to-byte table). Code `4g` is therefore
|
|
563
|
+
the top-left of glyph `g`, `4g+1` top-right, `4g+2` bottom-left and
|
|
564
|
+
`4g+3` bottom-right, which is why `put_big` shifts a screen code left
|
|
565
|
+
twice and ORs 1, 2 and 3. Sixty-four glyphs fill all 256 codes; the
|
|
566
|
+
screen is blanked with `$80`, the space glyph's top-left, because there is
|
|
567
|
+
no plain space in this charset.
|
|
568
|
+
|
|
569
|
+
The ROM font is only visible to the CPU with CHAREN clear: `$01` is
|
|
570
|
+
read-modify-written to `$33` under SEI, the copy runs, and it goes back to
|
|
571
|
+
`$37` before any interrupt is enabled (`pitfalls/banking.md`,
|
|
572
|
+
`charset_under_io_invisible_to_cpu`). `$D018 = $1C` points the VIC at
|
|
573
|
+
$0400 for the screen and $3000 for the charset inside bank 0. The build
|
|
574
|
+
took 57,757 cycles on PAL with the display on, about three frames.
|
|
575
|
+
|
|
576
|
+
### The scroller
|
|
577
|
+
|
|
578
|
+
Each carry moves 78 bytes: columns 1 to 39 of each of the two rows go to
|
|
579
|
+
columns 0 to 38, fully unrolled as 78 `lda abs` / `sta abs` pairs, then
|
|
580
|
+
column 39 of both rows takes the next half of the next letter (`half`
|
|
581
|
+
alternates 0 and 1; the message pointer advances after the right half).
|
|
582
|
+
This is `char_scroll_buffer_h` applied to two rows at once, with the
|
|
583
|
+
screen itself as the buffer. `$D016` is read, masked to bits 3 to 7 and
|
|
584
|
+
ORed with XSCROLL, so CSEL stays at 0 (38 columns hide the ragged edge;
|
|
585
|
+
`d016_unmasked_rmw_clobbers_csel_mcm`). The rows that are not the
|
|
586
|
+
scroller shift too (`xscroll_applies_to_all_rows`); here they are static
|
|
587
|
+
text and the readout, and the 7-pixel snap every eighth frame that
|
|
588
|
+
pitfall describes applies to them (not measured here). A second interrupt that sets XSCROLL for the scroller rows only
|
|
589
|
+
is the fix on that pitfall's page and was left out to keep this page to
|
|
590
|
+
one interrupt.
|
|
591
|
+
|
|
592
|
+
### The verdict
|
|
593
|
+
|
|
594
|
+
The interrupt is at line 240, inside the display but below any row that
|
|
595
|
+
holds anything after row 21. The rows the copy writes were fetched at
|
|
596
|
+
lines 139 and 147 and are next fetched at those lines of the following
|
|
597
|
+
frame, so the
|
|
598
|
+
real budget is wide; the test uses a tighter and simpler one: after the
|
|
599
|
+
copy, `$D011` bit 7 is clear and `$D012` is at least 240, that is the
|
|
600
|
+
raster is still on lines 240 to 255 of this frame. Sixteen lines from 240
|
|
601
|
+
end at 255 on both models, so no line in the window needs the ninth bit
|
|
602
|
+
and the test is one branch and one compare; from line 250 the same window
|
|
603
|
+
would wrap past line 262 on NTSC (`d012_wrap_around`). The window holds
|
|
604
|
+
one badline, 243, which costs 43 cycles of it (`badline_cycle_loss`); the
|
|
605
|
+
copy is running when it comes, so the stall is inside the `COPY` figure.
|
|
606
|
+
|
|
607
|
+
Measured in VICE x64sc: the raster reads 253 on PAL and 252 on NTSC after
|
|
608
|
+
the copy, two and three lines inside the window. That is the KERNAL's
|
|
609
|
+
36-cycle entry, the frame counter and XSCROLL step, the stopwatch start
|
|
610
|
+
and the copy, 708 cycles on the pinned frame and 715 on the alternate
|
|
611
|
+
carry, badline included. There is not room to add work to the
|
|
612
|
+
carry and keep this window; moving `IRQ_LINE` up widens it, and any line
|
|
613
|
+
from 155 to 238 keeps the copy clear of the scroller rows' fetch.
|
|
614
|
+
|
|
615
|
+
### Region
|
|
616
|
+
|
|
617
|
+
`region: both`. The mechanism is the same on NTSC; the message moves 20 %
|
|
618
|
+
faster, the font build took 58,061 cycles (304 more, from the different
|
|
619
|
+
badline count in three NTSC frames; not analysed further), and the copy
|
|
620
|
+
ends one line earlier because an NTSC line is 65 cycles.
|