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,606 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: speedcode-generator
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [speedcode_generation]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D020, DD04, DD05, DD06, DD07, DD0E, DD0F]
|
|
9
|
+
uses_kernal: [CHROUT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Speedcode Generator
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
A generator that writes an unrolled copy routine into RAM at start-up,
|
|
19
|
+
from two tables of row addresses, and then proves it. The job is a
|
|
20
|
+
1,000-byte block, 25 rows of 40 bytes: the generator emits one
|
|
21
|
+
`LDA abs / STA abs` pair per byte (6,000 bytes of code) and an `RTS`, the
|
|
22
|
+
program runs it, compares the destination with the source byte for byte,
|
|
23
|
+
and times three things with the CIA2 timers: the generation, the
|
|
24
|
+
generated code, and a plain indexed loop doing the same copy. The three
|
|
25
|
+
counts are printed and the verdict is left where a harness can read it:
|
|
26
|
+
`$02FF` = `$01` and a green border when every byte matches and the
|
|
27
|
+
generated code beat the loop by at least `MARGIN` (2,000) cycles, `$02FF`
|
|
28
|
+
= `$02` and a red border otherwise. The harness side is
|
|
29
|
+
`runtime/vice-reference.md`, section "Verifying a run without a human".
|
|
30
|
+
|
|
31
|
+
## Source
|
|
32
|
+
|
|
33
|
+
```asm
|
|
34
|
+
// speedcode-generator.asm
|
|
35
|
+
// Generates an unrolled copy of a 1,000-byte block (25 rows of 40) into
|
|
36
|
+
// RAM at CODE from two row-address tables, runs it, checks the destination
|
|
37
|
+
// against the source, and times it against a plain indexed loop with the
|
|
38
|
+
// CIA2 timers. Prints the three cycle counts (generation, generated code,
|
|
39
|
+
// loop) and the verdict: $02FF = $01 and a green border when the copy
|
|
40
|
+
// matches and the generated code beat the loop by at least MARGIN cycles,
|
|
41
|
+
// $02FF = $02 and a red border otherwise.
|
|
42
|
+
|
|
43
|
+
BasicUpstart2(start)
|
|
44
|
+
|
|
45
|
+
.const CHROUT = $ffd2
|
|
46
|
+
.const RESULT = $02ff // verdict byte read by the harness
|
|
47
|
+
.const BORDER = $d020
|
|
48
|
+
.const CODE_PASS = $01
|
|
49
|
+
.const CODE_FAIL = $02
|
|
50
|
+
|
|
51
|
+
.const ROWS = 25
|
|
52
|
+
.const COLS = 40 // 25 * 40 = 1,000 bytes
|
|
53
|
+
.const DST = $4000 // destination block
|
|
54
|
+
.const CODE = $5000 // generated code: 1,000 * 6 + 1 = 6,001 bytes
|
|
55
|
+
.const MARGIN = 2000 // generated code must beat the loop by this
|
|
56
|
+
.const FORCE_FAULT = 0 // 1: corrupt one generated opcode (red case)
|
|
57
|
+
|
|
58
|
+
.const OP_LDA_ABS = $ad
|
|
59
|
+
.const OP_STA_ABS = $8d
|
|
60
|
+
.const OP_RTS = $60
|
|
61
|
+
|
|
62
|
+
.const out = $fb // zero-page pointer to the emitted code
|
|
63
|
+
.const ptr = $fd // zero-page pointer for puts
|
|
64
|
+
|
|
65
|
+
// Time(routine, slot): run routine with CIA2 timer A counting phi2 and
|
|
66
|
+
// timer B counting A underflows; leave the 24-bit count in slot.
|
|
67
|
+
.macro Time(routine, slot) {
|
|
68
|
+
lda #$51 // CRB: start, force load, count A underflows
|
|
69
|
+
sta $dd0f
|
|
70
|
+
lda #$11 // CRA: start, force load, count phi2
|
|
71
|
+
sta $dd0e
|
|
72
|
+
jsr routine
|
|
73
|
+
lda #$00
|
|
74
|
+
sta $dd0e // stop A
|
|
75
|
+
sta $dd0f // stop B
|
|
76
|
+
lda #$ff // count = $FFFFFF - (TB:TA), no borrows
|
|
77
|
+
sbc $dd04
|
|
78
|
+
sta slot
|
|
79
|
+
lda #$ff
|
|
80
|
+
sbc $dd05
|
|
81
|
+
sta slot+1
|
|
82
|
+
lda #$ff
|
|
83
|
+
sbc $dd06
|
|
84
|
+
sta slot+2
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// PutDec(slot): print the 24-bit value in slot in decimal
|
|
88
|
+
.macro PutDec(slot) {
|
|
89
|
+
lda slot
|
|
90
|
+
sta num
|
|
91
|
+
lda slot+1
|
|
92
|
+
sta num+1
|
|
93
|
+
lda slot+2
|
|
94
|
+
sta num+2
|
|
95
|
+
jsr putdec
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Net(slot): slot -= empty, the cost of the harness itself
|
|
99
|
+
.macro Net(slot) {
|
|
100
|
+
sec
|
|
101
|
+
lda slot
|
|
102
|
+
sbc empty
|
|
103
|
+
sta slot
|
|
104
|
+
lda slot+1
|
|
105
|
+
sbc empty+1
|
|
106
|
+
sta slot+1
|
|
107
|
+
lda slot+2
|
|
108
|
+
sbc empty+2
|
|
109
|
+
sta slot+2
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
start:
|
|
113
|
+
sei
|
|
114
|
+
lda #$00 // stop both CIA2 timers and set both
|
|
115
|
+
sta $dd0e // latches to $FFFF
|
|
116
|
+
sta $dd0f
|
|
117
|
+
lda #$ff
|
|
118
|
+
sta $dd04
|
|
119
|
+
sta $dd05
|
|
120
|
+
sta $dd06
|
|
121
|
+
sta $dd07
|
|
122
|
+
|
|
123
|
+
// clear the destination so a missed byte shows
|
|
124
|
+
ldx #$00
|
|
125
|
+
txa
|
|
126
|
+
!: sta DST,x
|
|
127
|
+
sta DST+250,x
|
|
128
|
+
sta DST+500,x
|
|
129
|
+
sta DST+750,x
|
|
130
|
+
inx
|
|
131
|
+
cpx #250
|
|
132
|
+
bne !-
|
|
133
|
+
|
|
134
|
+
// screen off, so no badline steals cycles from the timed regions.
|
|
135
|
+
// DEN is sampled on line $30; wait for the next frame so it applies.
|
|
136
|
+
lda $d011
|
|
137
|
+
and #$ef
|
|
138
|
+
sta $d011
|
|
139
|
+
!: lda $d011 // wait until raster line >= 256
|
|
140
|
+
bpl !-
|
|
141
|
+
!: lda $d011 // then until it wraps to line 0
|
|
142
|
+
bmi !-
|
|
143
|
+
|
|
144
|
+
Time(nothing, empty)
|
|
145
|
+
Time(generate, t_gen)
|
|
146
|
+
.if (FORCE_FAULT != 0) {
|
|
147
|
+
lda #OP_LDA_ABS // turn the first STA into an LDA:
|
|
148
|
+
sta CODE + 3 // DST+0 is never written
|
|
149
|
+
}
|
|
150
|
+
Time(CODE, t_fast)
|
|
151
|
+
|
|
152
|
+
// check the destination now: the loop below would repair it
|
|
153
|
+
ldx #$00
|
|
154
|
+
stx match
|
|
155
|
+
!: lda src,x
|
|
156
|
+
cmp DST,x
|
|
157
|
+
bne compared
|
|
158
|
+
lda src+250,x
|
|
159
|
+
cmp DST+250,x
|
|
160
|
+
bne compared
|
|
161
|
+
lda src+500,x
|
|
162
|
+
cmp DST+500,x
|
|
163
|
+
bne compared
|
|
164
|
+
lda src+750,x
|
|
165
|
+
cmp DST+750,x
|
|
166
|
+
bne compared
|
|
167
|
+
inx
|
|
168
|
+
cpx #250
|
|
169
|
+
bne !-
|
|
170
|
+
inc match // every byte equal
|
|
171
|
+
compared:
|
|
172
|
+
Time(loopcopy, t_loop)
|
|
173
|
+
|
|
174
|
+
lda $d011 // screen back on
|
|
175
|
+
ora #$10
|
|
176
|
+
sta $d011
|
|
177
|
+
cli
|
|
178
|
+
|
|
179
|
+
Net(t_gen)
|
|
180
|
+
Net(t_fast)
|
|
181
|
+
Net(t_loop)
|
|
182
|
+
|
|
183
|
+
lda match
|
|
184
|
+
beq fail // the generated copy missed a byte
|
|
185
|
+
|
|
186
|
+
// verdict 2: t_loop - t_fast >= MARGIN
|
|
187
|
+
sec
|
|
188
|
+
lda t_loop
|
|
189
|
+
sbc t_fast
|
|
190
|
+
sta diff
|
|
191
|
+
lda t_loop+1
|
|
192
|
+
sbc t_fast+1
|
|
193
|
+
sta diff+1
|
|
194
|
+
lda t_loop+2
|
|
195
|
+
sbc t_fast+2
|
|
196
|
+
bcc fail // loop was faster
|
|
197
|
+
bne pass // difference of 65,536 or more
|
|
198
|
+
lda diff
|
|
199
|
+
cmp #<MARGIN
|
|
200
|
+
lda diff+1
|
|
201
|
+
sbc #>MARGIN
|
|
202
|
+
bcc fail
|
|
203
|
+
pass:
|
|
204
|
+
lda #CODE_PASS
|
|
205
|
+
ldy #5 // green
|
|
206
|
+
bne checkpoint
|
|
207
|
+
fail:
|
|
208
|
+
lda #CODE_FAIL
|
|
209
|
+
ldy #2 // red
|
|
210
|
+
checkpoint:
|
|
211
|
+
sta RESULT // the harness watches this store
|
|
212
|
+
sty BORDER
|
|
213
|
+
|
|
214
|
+
// print the three counts and the verdict line
|
|
215
|
+
ldx #<gentext
|
|
216
|
+
ldy #>gentext
|
|
217
|
+
jsr puts
|
|
218
|
+
PutDec(t_gen)
|
|
219
|
+
ldx #<fasttext
|
|
220
|
+
ldy #>fasttext
|
|
221
|
+
jsr puts
|
|
222
|
+
PutDec(t_fast)
|
|
223
|
+
ldx #<looptext
|
|
224
|
+
ldy #>looptext
|
|
225
|
+
jsr puts
|
|
226
|
+
PutDec(t_loop)
|
|
227
|
+
ldx #<restext
|
|
228
|
+
ldy #>restext
|
|
229
|
+
jsr puts
|
|
230
|
+
lda RESULT
|
|
231
|
+
jsr hexbyte
|
|
232
|
+
lda RESULT
|
|
233
|
+
cmp #CODE_PASS
|
|
234
|
+
beq !+
|
|
235
|
+
ldx #<failtext
|
|
236
|
+
ldy #>failtext
|
|
237
|
+
jmp puts
|
|
238
|
+
!: ldx #<passtext
|
|
239
|
+
ldy #>passtext
|
|
240
|
+
jmp puts
|
|
241
|
+
|
|
242
|
+
nothing:
|
|
243
|
+
rts
|
|
244
|
+
|
|
245
|
+
// ---------------------------------------------------------------------------
|
|
246
|
+
// generate: for each of ROWS rows, take the source and destination row
|
|
247
|
+
// addresses from the tables and emit COLS pairs of
|
|
248
|
+
// LDA abs ($AD lo hi)
|
|
249
|
+
// STA abs ($8D lo hi)
|
|
250
|
+
// with the addresses stepping by one, then an RTS after the last row.
|
|
251
|
+
// Each row is COLS * 6 = 240 bytes of code, so Y indexes one row's worth.
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
generate:
|
|
254
|
+
lda #<CODE
|
|
255
|
+
sta out
|
|
256
|
+
lda #>CODE
|
|
257
|
+
sta out+1
|
|
258
|
+
ldx #$00 // row
|
|
259
|
+
row:
|
|
260
|
+
lda src_lo,x
|
|
261
|
+
sta cur_src
|
|
262
|
+
lda src_hi,x
|
|
263
|
+
sta cur_src+1
|
|
264
|
+
lda dst_lo,x
|
|
265
|
+
sta cur_dst
|
|
266
|
+
lda dst_hi,x
|
|
267
|
+
sta cur_dst+1
|
|
268
|
+
ldy #$00
|
|
269
|
+
pair:
|
|
270
|
+
lda #OP_LDA_ABS
|
|
271
|
+
sta (out),y
|
|
272
|
+
iny
|
|
273
|
+
lda cur_src
|
|
274
|
+
sta (out),y
|
|
275
|
+
iny
|
|
276
|
+
lda cur_src+1
|
|
277
|
+
sta (out),y
|
|
278
|
+
iny
|
|
279
|
+
lda #OP_STA_ABS
|
|
280
|
+
sta (out),y
|
|
281
|
+
iny
|
|
282
|
+
lda cur_dst
|
|
283
|
+
sta (out),y
|
|
284
|
+
iny
|
|
285
|
+
lda cur_dst+1
|
|
286
|
+
sta (out),y
|
|
287
|
+
iny
|
|
288
|
+
inc cur_src
|
|
289
|
+
bne !+
|
|
290
|
+
inc cur_src+1
|
|
291
|
+
!: inc cur_dst
|
|
292
|
+
bne !+
|
|
293
|
+
inc cur_dst+1
|
|
294
|
+
!: cpy #COLS * 6
|
|
295
|
+
bne pair
|
|
296
|
+
tya // out += 240
|
|
297
|
+
clc
|
|
298
|
+
adc out
|
|
299
|
+
sta out
|
|
300
|
+
bcc !+
|
|
301
|
+
inc out+1
|
|
302
|
+
!: inx
|
|
303
|
+
cpx #ROWS
|
|
304
|
+
bne row
|
|
305
|
+
lda #OP_RTS
|
|
306
|
+
ldy #$00
|
|
307
|
+
sta (out),y
|
|
308
|
+
rts
|
|
309
|
+
|
|
310
|
+
// ---------------------------------------------------------------------------
|
|
311
|
+
// loopcopy: the plain version of the same job. Four 250-byte strides,
|
|
312
|
+
// one index register, LDA abs,X / STA abs,X.
|
|
313
|
+
// ---------------------------------------------------------------------------
|
|
314
|
+
loopcopy:
|
|
315
|
+
ldx #$00
|
|
316
|
+
!: lda src,x
|
|
317
|
+
sta DST,x
|
|
318
|
+
lda src+250,x
|
|
319
|
+
sta DST+250,x
|
|
320
|
+
lda src+500,x
|
|
321
|
+
sta DST+500,x
|
|
322
|
+
lda src+750,x
|
|
323
|
+
sta DST+750,x
|
|
324
|
+
inx
|
|
325
|
+
cpx #250
|
|
326
|
+
bne !-
|
|
327
|
+
rts
|
|
328
|
+
|
|
329
|
+
// ---------------------------------------------------------------------------
|
|
330
|
+
// output helpers
|
|
331
|
+
// ---------------------------------------------------------------------------
|
|
332
|
+
puts: // print the zero-terminated string at Y:X
|
|
333
|
+
stx ptr
|
|
334
|
+
sty ptr+1
|
|
335
|
+
ldy #$00
|
|
336
|
+
!: lda (ptr),y
|
|
337
|
+
beq !+
|
|
338
|
+
jsr CHROUT
|
|
339
|
+
iny
|
|
340
|
+
bne !-
|
|
341
|
+
!: rts
|
|
342
|
+
|
|
343
|
+
putdec: // print the 24-bit value in num, decimal
|
|
344
|
+
ldx #$00 // power-of-ten index, 0 = 1,000,000
|
|
345
|
+
stx lead
|
|
346
|
+
digit:
|
|
347
|
+
lda #'0' - 1
|
|
348
|
+
sta dig
|
|
349
|
+
!: inc dig
|
|
350
|
+
sec
|
|
351
|
+
lda num
|
|
352
|
+
sbc pow10,x
|
|
353
|
+
sta num
|
|
354
|
+
lda num+1
|
|
355
|
+
sbc pow10+1,x
|
|
356
|
+
sta num+1
|
|
357
|
+
lda num+2
|
|
358
|
+
sbc pow10+2,x
|
|
359
|
+
sta num+2
|
|
360
|
+
bcs !-
|
|
361
|
+
lda num // undo the last subtraction
|
|
362
|
+
adc pow10,x
|
|
363
|
+
sta num
|
|
364
|
+
lda num+1
|
|
365
|
+
adc pow10+1,x
|
|
366
|
+
sta num+1
|
|
367
|
+
lda num+2
|
|
368
|
+
adc pow10+2,x
|
|
369
|
+
sta num+2
|
|
370
|
+
lda dig
|
|
371
|
+
cmp #'0'
|
|
372
|
+
bne show
|
|
373
|
+
cpx #6 * 3 // last digit always prints
|
|
374
|
+
beq show
|
|
375
|
+
lda lead
|
|
376
|
+
beq next // suppress a leading zero
|
|
377
|
+
lda #'0'
|
|
378
|
+
show:
|
|
379
|
+
jsr CHROUT
|
|
380
|
+
inc lead
|
|
381
|
+
next:
|
|
382
|
+
inx
|
|
383
|
+
inx
|
|
384
|
+
inx
|
|
385
|
+
cpx #7 * 3
|
|
386
|
+
bne digit
|
|
387
|
+
lda #$0d
|
|
388
|
+
jmp CHROUT
|
|
389
|
+
|
|
390
|
+
hexbyte: // print A as two hex digits
|
|
391
|
+
pha
|
|
392
|
+
lsr
|
|
393
|
+
lsr
|
|
394
|
+
lsr
|
|
395
|
+
lsr
|
|
396
|
+
jsr hexdigit
|
|
397
|
+
pla
|
|
398
|
+
and #$0f
|
|
399
|
+
hexdigit:
|
|
400
|
+
cmp #10
|
|
401
|
+
bcc !+
|
|
402
|
+
adc #6 // carry set: +7 lands on 'A'..'F'
|
|
403
|
+
!: adc #'0'
|
|
404
|
+
jmp CHROUT
|
|
405
|
+
|
|
406
|
+
pow10: .byte <1000000, >1000000, 1000000 >> 16
|
|
407
|
+
.byte <100000, >100000, 100000 >> 16
|
|
408
|
+
.byte <10000, >10000, 0
|
|
409
|
+
.byte <1000, >1000, 0
|
|
410
|
+
.byte <100, >100, 0
|
|
411
|
+
.byte <10, >10, 0
|
|
412
|
+
.byte <1, >1, 0
|
|
413
|
+
|
|
414
|
+
cur_src: .word 0
|
|
415
|
+
cur_dst: .word 0
|
|
416
|
+
diff: .word 0
|
|
417
|
+
match: .byte 0
|
|
418
|
+
num: .byte 0, 0, 0
|
|
419
|
+
dig: .byte 0
|
|
420
|
+
lead: .byte 0
|
|
421
|
+
|
|
422
|
+
.encoding "petscii_upper"
|
|
423
|
+
gentext: .text "GEN "
|
|
424
|
+
.byte 0
|
|
425
|
+
fasttext: .text "FAST "
|
|
426
|
+
.byte 0
|
|
427
|
+
looptext: .text "LOOP "
|
|
428
|
+
.byte 0
|
|
429
|
+
restext: .text "RESULT "
|
|
430
|
+
.byte 0
|
|
431
|
+
passtext: .text " PASS"
|
|
432
|
+
.byte $0d, 0
|
|
433
|
+
failtext: .text " FAIL"
|
|
434
|
+
.byte $0d, 0
|
|
435
|
+
|
|
436
|
+
// the row-address tables the generator reads
|
|
437
|
+
src_lo: .fill ROWS, <(src + i * COLS)
|
|
438
|
+
src_hi: .fill ROWS, >(src + i * COLS)
|
|
439
|
+
dst_lo: .fill ROWS, <(DST + i * COLS)
|
|
440
|
+
dst_hi: .fill ROWS, >(DST + i * COLS)
|
|
441
|
+
|
|
442
|
+
// the 24-bit timer slots: three bytes each, measured then net of empty
|
|
443
|
+
empty: .byte 0, 0, 0
|
|
444
|
+
t_gen: .byte 0, 0, 0
|
|
445
|
+
t_fast: .byte 0, 0, 0
|
|
446
|
+
t_loop: .byte 0, 0, 0
|
|
447
|
+
|
|
448
|
+
// the source block: 1,000 bytes, no two neighbouring rows alike
|
|
449
|
+
src: .fill ROWS * COLS, (i * 7 + 13) & $ff
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
## Build
|
|
453
|
+
|
|
454
|
+
```bash
|
|
455
|
+
java -jar KickAss.jar speedcode-generator.asm -o speedcode-generator.prg -symbolfile
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
Produces `speedcode-generator.prg`, 2,049 bytes, `$080e` to `$0fff`
|
|
459
|
+
(KickAssembler 5.25, `-showmem`). 1,185 of those bytes are data, from
|
|
460
|
+
`pow10` at `$0b5f` to the end: the 1,000-byte source block at `$0c18`,
|
|
461
|
+
the four 25-entry row tables, the powers of ten, the timer slots and
|
|
462
|
+
the text. The generated code is not in the PRG; it
|
|
463
|
+
occupies `$5000` to `$6770` in RAM once `generate` has run.
|
|
464
|
+
|
|
465
|
+
## Expected output
|
|
466
|
+
|
|
467
|
+
Border green. Text area still the power-on blue. Screen rows 5 to 12:
|
|
468
|
+
|
|
469
|
+
```
|
|
470
|
+
READY.
|
|
471
|
+
RUN
|
|
472
|
+
GEN 92485
|
|
473
|
+
FAST 8000
|
|
474
|
+
LOOP 10787
|
|
475
|
+
RESULT 01 PASS
|
|
476
|
+
|
|
477
|
+
READY.
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
Screenshots from the pinned run, 8,000,000 cycles:
|
|
481
|
+
`screenshots/speedcode-generator.png` (PAL) and
|
|
482
|
+
`screenshots/speedcode-generator-ntsc.png` (NTSC). Measured on both:
|
|
483
|
+
the three counts above on rows 7 to 9 and `RESULT 01 PASS` on row 10,
|
|
484
|
+
decoded from the screenshots against the character ROM; border pixel
|
|
485
|
+
(2, 100) = (98, 213, 50) on PAL and (114, 189, 103) on NTSC, index 5 in
|
|
486
|
+
both palettes of `runtime/vice-reference.md`. The pinned command was run
|
|
487
|
+
twice per model and the two PNGs were identical bytes. The counts are
|
|
488
|
+
the same on both models because the timed regions run with the screen
|
|
489
|
+
blanked, so they are CPU cycles with nothing stolen, and the 6510 takes
|
|
490
|
+
the same number of them for the same code on either machine.
|
|
491
|
+
|
|
492
|
+
The three numbers, net of the harness (an empty `JSR`/`RTS` is timed
|
|
493
|
+
first and subtracted), measured in VICE x64sc 3.10:
|
|
494
|
+
|
|
495
|
+
| Line | What was timed | Cycles | Per byte |
|
|
496
|
+
|---|---|---|---|
|
|
497
|
+
| `GEN` | `generate`: 1,000 pairs and the `RTS` written to RAM | 92,485 | 92.5 emitted, about 4.7 PAL frames once |
|
|
498
|
+
| `FAST` | the generated code: 1,000 × `LDA abs` (4) + `STA abs` (4) | 8,000 | 8.0 |
|
|
499
|
+
| `LOOP` | the indexed loop, four 250-byte strides | 10,787 | 10.8 |
|
|
500
|
+
|
|
501
|
+
`FAST` is exactly the arithmetic, which is also the check that the
|
|
502
|
+
empty-call subtraction removes the `JSR`, the `RTS` and the timer stores
|
|
503
|
+
and nothing else. `LOOP` is exactly the arithmetic too: `LDX` (2) plus
|
|
504
|
+
250 iterations of 43 cycles less 1 for the final untaken branch is
|
|
505
|
+
10,749, plus 36 page-crossing cycles on `LDA abs,X`, from the source
|
|
506
|
+
block starting at `$0c18` (the strides at `$0c18`, `$0d12` and `$0e0c`
|
|
507
|
+
cross a page for 18, 12 and 6 values of X; the one at `$0f06` never
|
|
508
|
+
does). Move the source and `LOOP` moves by
|
|
509
|
+
a few dozen cycles; the generated code has no indexed reads and does
|
|
510
|
+
not. The generated code wins by 2,787 cycles, 1.35 times the speed;
|
|
511
|
+
`MARGIN` is 2,000 so that a relocation of the source cannot flip the
|
|
512
|
+
verdict.
|
|
513
|
+
|
|
514
|
+
The red case, `.const FORCE_FAULT = 1`, was run once on PAL and not
|
|
515
|
+
pinned: it overwrites the first emitted `STA` opcode with `LDA` after
|
|
516
|
+
generation, so the first destination byte stays zero, and the screen
|
|
517
|
+
shows `RESULT 02 FAIL` on row 10 with the border at (175, 60, 88),
|
|
518
|
+
index 2; the `-moncommands` trace of `$02FF` logged `02`. Its `GEN` and
|
|
519
|
+
`LOOP` read 92,490 and 10,807, five and twenty cycles more, because the
|
|
520
|
+
five extra bytes of the fault move every loop and the source block and
|
|
521
|
+
change which branches and indexed reads cross a page.
|
|
522
|
+
|
|
523
|
+
An earlier draft of this program compared the destination after the
|
|
524
|
+
timed loop had run, and the red case passed: the loop had repaired the
|
|
525
|
+
byte the broken speedcode missed. The comparison now sits between the
|
|
526
|
+
two timed runs.
|
|
527
|
+
|
|
528
|
+
## Why this works
|
|
529
|
+
|
|
530
|
+
### What the generator emits
|
|
531
|
+
|
|
532
|
+
`LDA abs` is `$AD lo hi` and `STA abs` is `$8D lo hi`, so a copy of one
|
|
533
|
+
byte is six bytes of code and eight cycles. The generator keeps a
|
|
534
|
+
16-bit output pointer in zero page (`out`, at `$FB`) and writes each
|
|
535
|
+
pair through `STA (out),Y`. Y runs 0 to 239 within a row, one row of 40
|
|
536
|
+
pairs being exactly 240 bytes, and the pointer advances by 240 per row;
|
|
537
|
+
25 rows give 6,000 bytes, and the `RTS` (`$60`) lands at `$5000 + 6000 =
|
|
538
|
+
$6770`. Both were read back over the monitor at the checkpoint: `$5000`
|
|
539
|
+
holds `AD 18 0C 8D 00 40 AD 19 0C 8D 01 40`, that is `LDA $0C18 / STA
|
|
540
|
+
$4000 / LDA $0C19 / STA $4001`, the last pair at `$676A` is `AD FF 0F 8D
|
|
541
|
+
E7 43`, and `$6770` is `60`.
|
|
542
|
+
|
|
543
|
+
The source and destination addresses come from four tables the
|
|
544
|
+
assembler builds with `.fill`, one low and one high byte per row. The
|
|
545
|
+
generator never computes a row address; it reads two and then
|
|
546
|
+
increments them 40 times. That is what makes it more than a `memcpy`:
|
|
547
|
+
the same generator, given a source table with a stride of 64 and a
|
|
548
|
+
destination table with a stride of 40, emits code that copies a 40-wide
|
|
549
|
+
window out of a wider map buffer with no per-row arithmetic at run
|
|
550
|
+
time. The block here has both strides at 40 so that the four-stride
|
|
551
|
+
loop and the byte compare stay simple.
|
|
552
|
+
|
|
553
|
+
### Timing with CIA2
|
|
554
|
+
|
|
555
|
+
CIA1's timer A drives the KERNAL's jiffy interrupt, so the harness uses
|
|
556
|
+
CIA2, whose timers nothing in the KERNAL touches after reset. Both
|
|
557
|
+
latches are set to `$FFFF` once. `Time` starts B first with `$51` (start,
|
|
558
|
+
force load, count timer A underflows) and then A with `$11` (start, force
|
|
559
|
+
load, count phi2), calls the routine, stops A then B, and reads the
|
|
560
|
+
count as `$FFFFFF` minus `TB:TA`; the per-byte subtraction needs no
|
|
561
|
+
borrow because each timer byte is at most `$FF`. `table_generation` in
|
|
562
|
+
`techniques/cpu-cycle-tricks.md` uses the same cascade on CIA1 with
|
|
563
|
+
interrupts off.
|
|
564
|
+
|
|
565
|
+
The four timed calls run under `SEI` and with the screen blanked. A CIA
|
|
566
|
+
timer counts phi2 whether or not the CPU is running, so a badline inside
|
|
567
|
+
a timed region would add its 40 to 43 stolen cycles to the count and
|
|
568
|
+
the result would depend on where in the frame the run started, and
|
|
569
|
+
differ between PAL and NTSC. DEN (`$D011` bit 4) is sampled once per
|
|
570
|
+
frame on line `$30`, so the code clears it and then waits for the raster
|
|
571
|
+
to pass line 255 and wrap to 0 before starting the first timer; from
|
|
572
|
+
that frame on there are no badlines until DEN is set again. The whole
|
|
573
|
+
timed sequence is about 120,000 cycles, six PAL frames, and the screen
|
|
574
|
+
is back on long before the exit screenshot.
|
|
575
|
+
|
|
576
|
+
### Where the code goes
|
|
577
|
+
|
|
578
|
+
`$5000` to `$6770` is inside VIC bank 1 (`$4000` to `$7FFF`), which the
|
|
579
|
+
VIC does not display on a stock machine, so 6 KB of generated code
|
|
580
|
+
costs no screen, charset or sprite space. It is also always RAM: no
|
|
581
|
+
ROM or I/O is ever mapped there, so the emitted bytes are the bytes
|
|
582
|
+
the CPU fetches. Generating under BASIC ROM at `$A000` or the KERNAL at
|
|
583
|
+
`$E000` writes fine and executes the ROM instead unless `$01` banks it
|
|
584
|
+
out first; `ram_under_rom_traps` in `pitfalls/banking.md` is that
|
|
585
|
+
failure.
|
|
586
|
+
|
|
587
|
+
### The verdict
|
|
588
|
+
|
|
589
|
+
The result byte, the border and the printed line follow the contract in
|
|
590
|
+
`runtime/vice-reference.md`: `$02FF` is written first, then `$D020`, then
|
|
591
|
+
the text. The margin test is a 24-bit subtraction: a borrow out of the
|
|
592
|
+
top byte means the loop was faster (fail), a non-zero top byte means a
|
|
593
|
+
difference of 65,536 or more (pass), and otherwise the 16-bit difference
|
|
594
|
+
is compared with `MARGIN`. The decimal printer subtracts powers of ten
|
|
595
|
+
from a 24-bit copy of the count and suppresses leading zeros, so a
|
|
596
|
+
count up to 9,999,999 prints without padding.
|
|
597
|
+
|
|
598
|
+
## What this recipe does not show
|
|
599
|
+
|
|
600
|
+
It generates once and runs the code once. The technique's other two
|
|
601
|
+
schedules, generation per part and per frame, are described under
|
|
602
|
+
`speedcode_generation` in `techniques/cpu-cycle-tricks.md` and not
|
|
603
|
+
measured here. The 8,000-cycle copy is longer than the PAL vertical
|
|
604
|
+
blank of about 7,100 cycles (`sine-scroller.md`), so used per frame on
|
|
605
|
+
the visible screen it has to be placed against the raster, which this
|
|
606
|
+
program does not do.
|