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,723 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: hires-plot-line
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [hires_plot, bresenham_line, standard_bitmap]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D012, D016, D018, D020, D021, DC04, DC05, DC0E]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Plot a pixel and draw a Bresenham line in a hires bitmap, timed, and count the result
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Puts a standard bitmap at `$2000` with screen RAM at `$0400` set to white
|
|
19
|
+
ink on black paper, plots single pixels through a 200-entry row address
|
|
20
|
+
table and an 8-entry bit mask table, and draws eleven lines with
|
|
21
|
+
Bresenham's algorithm: the two axes, two 45-degree diagonals, three
|
|
22
|
+
shallow lines and four steep ones, one steep line in each sign quadrant.
|
|
23
|
+
The shallow loop's +x -y case is taken by the second diagonal, which has
|
|
24
|
+
equal deltas and so goes the shallow way. Every line
|
|
25
|
+
stays on the screen and no two share a pixel. It times one plot, a
|
|
26
|
+
one-pixel line and the 320-pixel axis with CIA1 timer A while the display
|
|
27
|
+
is blanked, then counts the set bits in the 8000 bitmap bytes and
|
|
28
|
+
compares the count with the total the assembler worked out from the
|
|
29
|
+
endpoints. `$02FF` is `$01` and the border green when they match, `$02`
|
|
30
|
+
and red otherwise. The techniques are `hires_plot` and `bresenham_line`
|
|
31
|
+
in `techniques/bitmap-modes.md`.
|
|
32
|
+
|
|
33
|
+
## Source
|
|
34
|
+
|
|
35
|
+
```asm
|
|
36
|
+
// hires-plot-line.asm
|
|
37
|
+
// Sets up a standard (hires) bitmap at $2000 with screen RAM at $0400,
|
|
38
|
+
// plots single pixels through a 200-entry row address table and an 8-entry
|
|
39
|
+
// mask table, draws a compiled-in set of lines with Bresenham's algorithm in
|
|
40
|
+
// every direction, times one plot and the longest line with CIA1 timer A,
|
|
41
|
+
// then counts the set bits in the bitmap and compares the count with the
|
|
42
|
+
// total the assembler worked out from the endpoints. Verdict at $02FF ($01
|
|
43
|
+
// pass, $02 fail) and in the border colour (green or red). The program
|
|
44
|
+
// never returns to BASIC, so the colour cells stay as it left them.
|
|
45
|
+
|
|
46
|
+
.const BITMAP = $2000
|
|
47
|
+
.const SCREEN = $0400
|
|
48
|
+
.const RESULT = $02ff
|
|
49
|
+
.const REC_OVER = $02f0 // timer overhead of an empty measurement
|
|
50
|
+
.const REC_PLOT = $02f2 // one jsr plot, overhead removed
|
|
51
|
+
.const REC_LINE = $02f4 // one jsr line for the 320-pixel axis, overhead removed
|
|
52
|
+
.const REC_BITS = $02f6 // set bits counted in the bitmap
|
|
53
|
+
.const REC_TEAR = $02f8 // timer reads retried because the high byte moved
|
|
54
|
+
.const REC_WANT = $02fa // the compiled-in total, for a monitor read
|
|
55
|
+
.const REC_ONE = $02fc // one jsr line for a one-pixel line, overhead removed
|
|
56
|
+
|
|
57
|
+
// zero page: BASIC's numeric work area, free because the program never
|
|
58
|
+
// returns to BASIC
|
|
59
|
+
.const zp_ptr = $57 // bitmap byte pointer
|
|
60
|
+
.const px = $59 // current x, 16-bit
|
|
61
|
+
.const py = $5b // current y
|
|
62
|
+
.const x1 = $5c // end x, 16-bit
|
|
63
|
+
.const y1 = $5e // end y
|
|
64
|
+
.const dx = $5f // |x1 - px|, 16-bit
|
|
65
|
+
.const dy = $61 // |y1 - py|, 16-bit
|
|
66
|
+
.const dx2 = $63 // 2 * dx
|
|
67
|
+
.const dy2 = $65 // 2 * dy
|
|
68
|
+
.const err = $67 // Bresenham error term, 16-bit signed
|
|
69
|
+
.const n = $69 // steps left on the major axis
|
|
70
|
+
.const sx = $6b // $01 or $ff
|
|
71
|
+
.const sy = $6c // $01 or $ff
|
|
72
|
+
.const t_hi = $6d // timer read scratch
|
|
73
|
+
.const t_lo = $6e
|
|
74
|
+
|
|
75
|
+
// The line set. Every line lies in its own region of the screen, so no two
|
|
76
|
+
// share a pixel and the set-bit count of the finished bitmap is the sum of
|
|
77
|
+
// max(|dx|, |dy|) + 1 over the set, which the assembler works out here.
|
|
78
|
+
// Directions covered: +x flat, +y vertical, two equal-delta diagonals,
|
|
79
|
+
// three shallow lines and a steep line in each of the four sign quadrants.
|
|
80
|
+
.var lines = List()
|
|
81
|
+
.eval lines.add(List().add(0, 199, 319, 199)) // x axis, bottom row, left to right
|
|
82
|
+
.eval lines.add(List().add(0, 0, 0, 198)) // y axis, left column, top to bottom
|
|
83
|
+
.eval lines.add(List().add(2, 0, 159, 157)) // 45 degrees, +x +y
|
|
84
|
+
.eval lines.add(List().add(160, 157, 317, 0)) // 45 degrees, +x -y
|
|
85
|
+
.eval lines.add(List().add(20, 170, 300, 190)) // shallow, +x +y
|
|
86
|
+
.eval lines.add(List().add(310, 160, 20, 168)) // shallow, -x +y
|
|
87
|
+
.eval lines.add(List().add(150, 197, 40, 192)) // shallow, -x -y
|
|
88
|
+
.eval lines.add(List().add(318, 20, 319, 198)) // steep, +x +y
|
|
89
|
+
.eval lines.add(List().add(100, 60, 112, 0)) // steep, +x -y
|
|
90
|
+
.eval lines.add(List().add(300, 30, 290, 150)) // steep, -x +y
|
|
91
|
+
.eval lines.add(List().add(10, 196, 4, 20)) // steep, -x -y
|
|
92
|
+
.var NLINES = lines.size()
|
|
93
|
+
.var EXPECT = 0
|
|
94
|
+
.for (var i = 0; i < NLINES; i++) {
|
|
95
|
+
.var l = lines.get(i)
|
|
96
|
+
.eval EXPECT = EXPECT + max(abs(l.get(2) - l.get(0)), abs(l.get(3) - l.get(1))) + 1
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
BasicUpstart2(start)
|
|
100
|
+
|
|
101
|
+
* = $0900 "code"
|
|
102
|
+
|
|
103
|
+
start:
|
|
104
|
+
sei
|
|
105
|
+
lda #$00
|
|
106
|
+
sta $d020
|
|
107
|
+
sta $d021
|
|
108
|
+
|
|
109
|
+
// screen RAM: every cell white ink on black paper
|
|
110
|
+
lda #$10
|
|
111
|
+
ldx #0
|
|
112
|
+
fill_screen:
|
|
113
|
+
sta SCREEN,x
|
|
114
|
+
sta SCREEN + $100,x
|
|
115
|
+
sta SCREEN + $200,x
|
|
116
|
+
sta SCREEN + $2e8,x
|
|
117
|
+
inx
|
|
118
|
+
bne fill_screen
|
|
119
|
+
|
|
120
|
+
// clear the bitmap, $2000 to $3F3F
|
|
121
|
+
lda #<BITMAP
|
|
122
|
+
sta zp_ptr
|
|
123
|
+
lda #>BITMAP
|
|
124
|
+
sta zp_ptr + 1
|
|
125
|
+
lda #0
|
|
126
|
+
tay
|
|
127
|
+
ldx #32 // 32 pages: $2000-$3FFF, the 192 bytes past the bitmap included
|
|
128
|
+
clear_page:
|
|
129
|
+
sta (zp_ptr),y
|
|
130
|
+
iny
|
|
131
|
+
bne clear_page
|
|
132
|
+
inc zp_ptr + 1
|
|
133
|
+
dex
|
|
134
|
+
bne clear_page
|
|
135
|
+
|
|
136
|
+
// VIC: screen at $0400, bitmap at $2000, hires, bitmap mode on but the
|
|
137
|
+
// display blanked (DEN clear) while the timings run, so no badline stalls
|
|
138
|
+
// the CPU under the CIA's count. DEN is sampled once per frame, on line
|
|
139
|
+
// $30, so two sightings of line 64 pass before the first measurement.
|
|
140
|
+
lda #$18
|
|
141
|
+
sta $d018
|
|
142
|
+
lda #$08
|
|
143
|
+
sta $d016
|
|
144
|
+
lda #$2b
|
|
145
|
+
sta $d011
|
|
146
|
+
jsr wait_line_64
|
|
147
|
+
jsr wait_line_64
|
|
148
|
+
|
|
149
|
+
// --- timing: the empty measurement ---------------------------------------
|
|
150
|
+
jsr timer_start
|
|
151
|
+
jsr timer_read
|
|
152
|
+
lda t_lo
|
|
153
|
+
sta REC_OVER
|
|
154
|
+
lda t_hi
|
|
155
|
+
sta REC_OVER + 1
|
|
156
|
+
|
|
157
|
+
// --- timing: one plot, at the first pixel of the x axis ------------------
|
|
158
|
+
lda #0
|
|
159
|
+
sta px
|
|
160
|
+
sta px + 1
|
|
161
|
+
lda #199
|
|
162
|
+
sta py
|
|
163
|
+
jsr timer_start
|
|
164
|
+
jsr plot
|
|
165
|
+
jsr timer_read
|
|
166
|
+
lda t_lo
|
|
167
|
+
sec
|
|
168
|
+
sbc REC_OVER
|
|
169
|
+
sta REC_PLOT
|
|
170
|
+
lda t_hi
|
|
171
|
+
sbc REC_OVER + 1
|
|
172
|
+
sta REC_PLOT + 1
|
|
173
|
+
|
|
174
|
+
// --- timing: a one-pixel line, the line routine's fixed cost -------------
|
|
175
|
+
// Start and end are both (0, 199), the pixel the plot above already set.
|
|
176
|
+
lda #0
|
|
177
|
+
sta px
|
|
178
|
+
sta px + 1
|
|
179
|
+
sta x1
|
|
180
|
+
sta x1 + 1
|
|
181
|
+
lda #199
|
|
182
|
+
sta py
|
|
183
|
+
sta y1
|
|
184
|
+
jsr timer_start
|
|
185
|
+
jsr line
|
|
186
|
+
jsr timer_read
|
|
187
|
+
lda t_lo
|
|
188
|
+
sec
|
|
189
|
+
sbc REC_OVER
|
|
190
|
+
sta REC_ONE
|
|
191
|
+
lda t_hi
|
|
192
|
+
sbc REC_OVER + 1
|
|
193
|
+
sta REC_ONE + 1
|
|
194
|
+
|
|
195
|
+
// --- timing: the longest line, the 320-pixel x axis ----------------------
|
|
196
|
+
ldx #0
|
|
197
|
+
jsr load_line
|
|
198
|
+
jsr timer_start
|
|
199
|
+
jsr line
|
|
200
|
+
jsr timer_read
|
|
201
|
+
lda t_lo
|
|
202
|
+
sec
|
|
203
|
+
sbc REC_OVER
|
|
204
|
+
sta REC_LINE
|
|
205
|
+
lda t_hi
|
|
206
|
+
sbc REC_OVER + 1
|
|
207
|
+
sta REC_LINE + 1
|
|
208
|
+
|
|
209
|
+
// --- the rest of the set --------------------------------------------------
|
|
210
|
+
ldx #1
|
|
211
|
+
draw_all:
|
|
212
|
+
txa
|
|
213
|
+
pha
|
|
214
|
+
jsr load_line
|
|
215
|
+
jsr line
|
|
216
|
+
pla
|
|
217
|
+
tax
|
|
218
|
+
inx
|
|
219
|
+
cpx #NLINES
|
|
220
|
+
bne draw_all
|
|
221
|
+
|
|
222
|
+
// display on
|
|
223
|
+
lda #$3b
|
|
224
|
+
sta $d011
|
|
225
|
+
|
|
226
|
+
// --- count the set bits in the 8000 bitmap bytes -------------------------
|
|
227
|
+
lda #0
|
|
228
|
+
sta REC_BITS
|
|
229
|
+
sta REC_BITS + 1
|
|
230
|
+
lda #<BITMAP
|
|
231
|
+
sta zp_ptr
|
|
232
|
+
lda #>BITMAP
|
|
233
|
+
sta zp_ptr + 1
|
|
234
|
+
lda #<8000
|
|
235
|
+
sta n
|
|
236
|
+
lda #>8000
|
|
237
|
+
sta n + 1
|
|
238
|
+
count_byte:
|
|
239
|
+
ldy #0
|
|
240
|
+
lda (zp_ptr),y
|
|
241
|
+
beq count_next
|
|
242
|
+
ldx #8
|
|
243
|
+
count_bit:
|
|
244
|
+
asl
|
|
245
|
+
bcc count_skip
|
|
246
|
+
inc REC_BITS
|
|
247
|
+
bne count_skip
|
|
248
|
+
inc REC_BITS + 1
|
|
249
|
+
count_skip:
|
|
250
|
+
dex
|
|
251
|
+
bne count_bit
|
|
252
|
+
count_next:
|
|
253
|
+
inc zp_ptr
|
|
254
|
+
bne !+
|
|
255
|
+
inc zp_ptr + 1
|
|
256
|
+
!: lda n
|
|
257
|
+
bne !+
|
|
258
|
+
dec n + 1
|
|
259
|
+
!: dec n
|
|
260
|
+
lda n
|
|
261
|
+
ora n + 1
|
|
262
|
+
bne count_byte
|
|
263
|
+
|
|
264
|
+
// --- verdict ----------------------------------------------------------------
|
|
265
|
+
lda #<EXPECT
|
|
266
|
+
sta REC_WANT
|
|
267
|
+
lda #>EXPECT
|
|
268
|
+
sta REC_WANT + 1
|
|
269
|
+
lda REC_BITS
|
|
270
|
+
cmp #<EXPECT
|
|
271
|
+
bne fail
|
|
272
|
+
lda REC_BITS + 1
|
|
273
|
+
cmp #>EXPECT
|
|
274
|
+
bne fail
|
|
275
|
+
lda #$01
|
|
276
|
+
sta RESULT
|
|
277
|
+
lda #$05
|
|
278
|
+
sta $d020
|
|
279
|
+
jmp halt
|
|
280
|
+
fail:
|
|
281
|
+
lda #$02
|
|
282
|
+
sta RESULT
|
|
283
|
+
sta $d020
|
|
284
|
+
halt:
|
|
285
|
+
jmp halt
|
|
286
|
+
|
|
287
|
+
// --- wait_line_64: return during raster line 64, after it was not 64 -----
|
|
288
|
+
wait_line_64:
|
|
289
|
+
lda $d012
|
|
290
|
+
cmp #$40
|
|
291
|
+
beq wait_line_64
|
|
292
|
+
wait_64:
|
|
293
|
+
lda $d011
|
|
294
|
+
bmi wait_64 // lines 256 and up read $40 too on PAL
|
|
295
|
+
lda $d012
|
|
296
|
+
cmp #$40
|
|
297
|
+
bne wait_64
|
|
298
|
+
rts
|
|
299
|
+
|
|
300
|
+
// --- load_line: copy line X of the table into px, py, x1, y1 --------------
|
|
301
|
+
load_line:
|
|
302
|
+
lda line_x0_lo,x
|
|
303
|
+
sta px
|
|
304
|
+
lda line_x0_hi,x
|
|
305
|
+
sta px + 1
|
|
306
|
+
lda line_y0,x
|
|
307
|
+
sta py
|
|
308
|
+
lda line_x1_lo,x
|
|
309
|
+
sta x1
|
|
310
|
+
lda line_x1_hi,x
|
|
311
|
+
sta x1 + 1
|
|
312
|
+
lda line_y1,x
|
|
313
|
+
sta y1
|
|
314
|
+
rts
|
|
315
|
+
|
|
316
|
+
// --- plot: set pixel (px, py) -----------------------------------------------
|
|
317
|
+
// Address = row_lo/row_hi[py] + (px & $F8), carrying px's high byte in;
|
|
318
|
+
// the bit is mask[px & 7].
|
|
319
|
+
plot:
|
|
320
|
+
ldy py
|
|
321
|
+
lda px
|
|
322
|
+
and #$f8
|
|
323
|
+
clc
|
|
324
|
+
adc row_lo,y
|
|
325
|
+
sta zp_ptr
|
|
326
|
+
lda row_hi,y
|
|
327
|
+
adc px + 1
|
|
328
|
+
sta zp_ptr + 1
|
|
329
|
+
lda px
|
|
330
|
+
and #$07
|
|
331
|
+
tax
|
|
332
|
+
lda mask,x
|
|
333
|
+
ldy #0
|
|
334
|
+
ora (zp_ptr),y
|
|
335
|
+
sta (zp_ptr),y
|
|
336
|
+
rts
|
|
337
|
+
|
|
338
|
+
// --- line: draw from (px, py) to (x1, y1) inclusive -------------------------
|
|
339
|
+
// Bresenham with the error term held in 16 bits. The major axis is the one
|
|
340
|
+
// with the larger delta; the loop steps it every pixel and steps the other
|
|
341
|
+
// axis when the error term is zero or positive. Both loops step in either
|
|
342
|
+
// direction through sx and sy, so all eight octants are covered by two loops.
|
|
343
|
+
line:
|
|
344
|
+
lda #$01
|
|
345
|
+
sta sx
|
|
346
|
+
sta sy
|
|
347
|
+
sec
|
|
348
|
+
lda x1
|
|
349
|
+
sbc px
|
|
350
|
+
sta dx
|
|
351
|
+
lda x1 + 1
|
|
352
|
+
sbc px + 1
|
|
353
|
+
sta dx + 1
|
|
354
|
+
bpl dx_done
|
|
355
|
+
lda #$ff
|
|
356
|
+
sta sx
|
|
357
|
+
sec
|
|
358
|
+
lda #0
|
|
359
|
+
sbc dx
|
|
360
|
+
sta dx
|
|
361
|
+
lda #0
|
|
362
|
+
sbc dx + 1
|
|
363
|
+
sta dx + 1
|
|
364
|
+
dx_done:
|
|
365
|
+
sec
|
|
366
|
+
lda y1
|
|
367
|
+
sbc py
|
|
368
|
+
sta dy
|
|
369
|
+
lda #0
|
|
370
|
+
sbc #0
|
|
371
|
+
sta dy + 1
|
|
372
|
+
bpl dy_done
|
|
373
|
+
lda #$ff
|
|
374
|
+
sta sy
|
|
375
|
+
sec
|
|
376
|
+
lda #0
|
|
377
|
+
sbc dy
|
|
378
|
+
sta dy
|
|
379
|
+
lda #0
|
|
380
|
+
sbc dy + 1
|
|
381
|
+
sta dy + 1
|
|
382
|
+
dy_done:
|
|
383
|
+
lda dx
|
|
384
|
+
asl
|
|
385
|
+
sta dx2
|
|
386
|
+
lda dx + 1
|
|
387
|
+
rol
|
|
388
|
+
sta dx2 + 1
|
|
389
|
+
lda dy
|
|
390
|
+
asl
|
|
391
|
+
sta dy2
|
|
392
|
+
lda dy + 1
|
|
393
|
+
rol
|
|
394
|
+
sta dy2 + 1
|
|
395
|
+
// steep if dy > dx
|
|
396
|
+
lda dx
|
|
397
|
+
cmp dy
|
|
398
|
+
lda dx + 1
|
|
399
|
+
sbc dy + 1
|
|
400
|
+
bcc steep
|
|
401
|
+
|
|
402
|
+
// shallow: x is the major axis. err = 2*dy - dx, n = dx
|
|
403
|
+
lda dx
|
|
404
|
+
sta n
|
|
405
|
+
lda dx + 1
|
|
406
|
+
sta n + 1
|
|
407
|
+
sec
|
|
408
|
+
lda dy2
|
|
409
|
+
sbc dx
|
|
410
|
+
sta err
|
|
411
|
+
lda dy2 + 1
|
|
412
|
+
sbc dx + 1
|
|
413
|
+
sta err + 1
|
|
414
|
+
shallow_loop:
|
|
415
|
+
jsr plot
|
|
416
|
+
lda n
|
|
417
|
+
ora n + 1
|
|
418
|
+
beq shallow_done
|
|
419
|
+
lda n
|
|
420
|
+
bne !+
|
|
421
|
+
dec n + 1
|
|
422
|
+
!: dec n
|
|
423
|
+
lda err + 1
|
|
424
|
+
bmi shallow_no_y
|
|
425
|
+
lda py
|
|
426
|
+
clc
|
|
427
|
+
adc sy
|
|
428
|
+
sta py
|
|
429
|
+
sec
|
|
430
|
+
lda err
|
|
431
|
+
sbc dx2
|
|
432
|
+
sta err
|
|
433
|
+
lda err + 1
|
|
434
|
+
sbc dx2 + 1
|
|
435
|
+
sta err + 1
|
|
436
|
+
shallow_no_y:
|
|
437
|
+
clc
|
|
438
|
+
lda err
|
|
439
|
+
adc dy2
|
|
440
|
+
sta err
|
|
441
|
+
lda err + 1
|
|
442
|
+
adc dy2 + 1
|
|
443
|
+
sta err + 1
|
|
444
|
+
jsr step_x
|
|
445
|
+
jmp shallow_loop
|
|
446
|
+
shallow_done:
|
|
447
|
+
rts
|
|
448
|
+
|
|
449
|
+
// steep: y is the major axis. err = 2*dx - dy, n = dy
|
|
450
|
+
steep:
|
|
451
|
+
lda dy
|
|
452
|
+
sta n
|
|
453
|
+
lda dy + 1
|
|
454
|
+
sta n + 1
|
|
455
|
+
sec
|
|
456
|
+
lda dx2
|
|
457
|
+
sbc dy
|
|
458
|
+
sta err
|
|
459
|
+
lda dx2 + 1
|
|
460
|
+
sbc dy + 1
|
|
461
|
+
sta err + 1
|
|
462
|
+
steep_loop:
|
|
463
|
+
jsr plot
|
|
464
|
+
lda n
|
|
465
|
+
ora n + 1
|
|
466
|
+
beq line_done
|
|
467
|
+
lda n
|
|
468
|
+
bne !+
|
|
469
|
+
dec n + 1
|
|
470
|
+
!: dec n
|
|
471
|
+
lda err + 1
|
|
472
|
+
bmi steep_no_x
|
|
473
|
+
jsr step_x
|
|
474
|
+
sec
|
|
475
|
+
lda err
|
|
476
|
+
sbc dy2
|
|
477
|
+
sta err
|
|
478
|
+
lda err + 1
|
|
479
|
+
sbc dy2 + 1
|
|
480
|
+
sta err + 1
|
|
481
|
+
steep_no_x:
|
|
482
|
+
clc
|
|
483
|
+
lda err
|
|
484
|
+
adc dx2
|
|
485
|
+
sta err
|
|
486
|
+
lda err + 1
|
|
487
|
+
adc dx2 + 1
|
|
488
|
+
sta err + 1
|
|
489
|
+
lda py
|
|
490
|
+
clc
|
|
491
|
+
adc sy
|
|
492
|
+
sta py
|
|
493
|
+
jmp steep_loop
|
|
494
|
+
line_done:
|
|
495
|
+
rts
|
|
496
|
+
|
|
497
|
+
// px += sx, 16-bit, sx is $01 or $ff
|
|
498
|
+
step_x:
|
|
499
|
+
lda sx
|
|
500
|
+
bmi step_x_left
|
|
501
|
+
inc px
|
|
502
|
+
bne !+
|
|
503
|
+
inc px + 1
|
|
504
|
+
!: rts
|
|
505
|
+
step_x_left:
|
|
506
|
+
lda px
|
|
507
|
+
bne !+
|
|
508
|
+
dec px + 1
|
|
509
|
+
!: dec px
|
|
510
|
+
rts
|
|
511
|
+
|
|
512
|
+
// --- CIA1 timer A as a stopwatch ------------------------------------------
|
|
513
|
+
// timer_start loads $FFFF and starts the timer counting down at one count
|
|
514
|
+
// per cycle. timer_read stores $FFFF - timer in t_lo/t_hi: the cycles from
|
|
515
|
+
// the start to the read, including the two calls' own overhead, which the
|
|
516
|
+
// empty measurement records and the figures subtract.
|
|
517
|
+
timer_start:
|
|
518
|
+
lda #$00
|
|
519
|
+
sta $dc0e
|
|
520
|
+
lda #$ff
|
|
521
|
+
sta $dc04
|
|
522
|
+
sta $dc05
|
|
523
|
+
lda #$11 // force load, continuous, start
|
|
524
|
+
sta $dc0e
|
|
525
|
+
rts
|
|
526
|
+
|
|
527
|
+
timer_read:
|
|
528
|
+
lda $dc05
|
|
529
|
+
sta t_hi
|
|
530
|
+
lda $dc04
|
|
531
|
+
sta t_lo
|
|
532
|
+
lda $dc05
|
|
533
|
+
cmp t_hi
|
|
534
|
+
beq read_ok
|
|
535
|
+
inc REC_TEAR
|
|
536
|
+
jmp timer_read
|
|
537
|
+
read_ok:
|
|
538
|
+
lda #$ff
|
|
539
|
+
sec
|
|
540
|
+
sbc t_lo
|
|
541
|
+
sta t_lo
|
|
542
|
+
lda #$ff
|
|
543
|
+
sbc t_hi
|
|
544
|
+
sta t_hi
|
|
545
|
+
rts
|
|
546
|
+
|
|
547
|
+
// --- tables -------------------------------------------------------------------
|
|
548
|
+
// Row address table: the byte holding pixel (0, y) is
|
|
549
|
+
// BITMAP + (y / 8) * 320 + (y & 7): 320 bytes per cell row, one byte per
|
|
550
|
+
// scanline inside the cell.
|
|
551
|
+
// Each table sits inside one page, so the indexed reads in plot never pay
|
|
552
|
+
// the page-crossing cycle (unaligned, plot measured 65 cycles at y = 199
|
|
553
|
+
// instead of 63).
|
|
554
|
+
.align $100
|
|
555
|
+
row_lo:
|
|
556
|
+
.fill 200, <(BITMAP + floor(i / 8) * 320 + mod(i, 8))
|
|
557
|
+
.align $100
|
|
558
|
+
row_hi:
|
|
559
|
+
.fill 200, >(BITMAP + floor(i / 8) * 320 + mod(i, 8))
|
|
560
|
+
mask:
|
|
561
|
+
.byte $80, $40, $20, $10, $08, $04, $02, $01
|
|
562
|
+
|
|
563
|
+
line_x0_lo:
|
|
564
|
+
.fill NLINES, <lines.get(i).get(0)
|
|
565
|
+
line_x0_hi:
|
|
566
|
+
.fill NLINES, >lines.get(i).get(0)
|
|
567
|
+
line_y0:
|
|
568
|
+
.fill NLINES, lines.get(i).get(1)
|
|
569
|
+
line_x1_lo:
|
|
570
|
+
.fill NLINES, <lines.get(i).get(2)
|
|
571
|
+
line_x1_hi:
|
|
572
|
+
.fill NLINES, >lines.get(i).get(2)
|
|
573
|
+
line_y1:
|
|
574
|
+
.fill NLINES, lines.get(i).get(3)
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
## Build
|
|
578
|
+
|
|
579
|
+
```bash
|
|
580
|
+
java -jar $KICKASS_JAR hires-plot-line.asm -o hires-plot-line.prg
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
KickAssembler 5.25 produces a 1,555-byte PRG; the code segment runs
|
|
584
|
+
`$0900` to `$0E11`, with the two row tables page-aligned at `$0C00` and
|
|
585
|
+
`$0D00` and the mask and line tables after them.
|
|
586
|
+
|
|
587
|
+
Pinned VICE run (both models, `docs/recipes/runs.json`):
|
|
588
|
+
|
|
589
|
+
```bash
|
|
590
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas \
|
|
591
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
592
|
+
-limitcycles 8000000 -exitscreenshot hires-plot-line.png \
|
|
593
|
+
-autostart hires-plot-line.prg
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
Add `-model ntsc` for the second picture. To read the figures back, add
|
|
597
|
+
`-moncommands verdict.mon` with a file that traces the verdict store and
|
|
598
|
+
dumps the record bytes when it happens (the route is in
|
|
599
|
+
`runtime/vice-reference.md`, "Verifying a run without a human"):
|
|
600
|
+
|
|
601
|
+
```text
|
|
602
|
+
logname "/tmp/verdict.log"
|
|
603
|
+
log on
|
|
604
|
+
trace store 02ff
|
|
605
|
+
command 1 "m 02f0 02ff"
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
## Expected output
|
|
609
|
+
|
|
610
|
+
Green border, black paper, white lines. The picture is the drawing
|
|
611
|
+
itself: the x axis along the bottom row, the y axis down the left column,
|
|
612
|
+
two diagonals meeting near the middle of row 157, a shallow line each way
|
|
613
|
+
across the lower part of the screen, a short shallow line above the axis,
|
|
614
|
+
and four steep lines, one near each side. Nothing is printed.
|
|
615
|
+
|
|
616
|
+
`recipes/kickassembler/screenshots/hires-plot-line.png` (PAL, 384 by 272)
|
|
617
|
+
and `hires-plot-line-ntsc.png` (NTSC, 384 by 247) were each produced twice
|
|
618
|
+
by the pinned command with identical bytes. Counted with PIL, the display
|
|
619
|
+
window (x 32 to 351, screenshot rows 35 to 234 on PAL, 23 to 222 on NTSC)
|
|
620
|
+
holds 2,056 pure white pixels on both models, and the border pixel at
|
|
621
|
+
(2, 100) is VICE's green (measured in VICE x64sc 3.10, rung 1).
|
|
622
|
+
|
|
623
|
+
The monitor dump on the verdict store reads the same on both models:
|
|
624
|
+
|
|
625
|
+
```text
|
|
626
|
+
>C:02f0 14 00 3f 00
|
|
627
|
+
>C:02f4 56 aa 08 08
|
|
628
|
+
>C:02f8 00 00 08 08
|
|
629
|
+
>C:02fc d6 00 00 01
|
|
630
|
+
```
|
|
631
|
+
|
|
632
|
+
- `$02F0`: 20 cycles, the empty measurement (the `rts` of `timer_start`,
|
|
633
|
+
the call into `timer_read` and its first two reads).
|
|
634
|
+
- `$02F2`: 63 cycles for `jsr plot` with the overhead removed. The
|
|
635
|
+
instruction table gives the same 63 (rung 3). Before the row tables
|
|
636
|
+
were page-aligned the same plot at y = 199 measured 65: both indexed
|
|
637
|
+
reads crossed a page.
|
|
638
|
+
- `$02F4`: 43,606 cycles for `jsr line` on the 320-pixel axis.
|
|
639
|
+
- `$02F6`: 2,056 set bits counted in the bitmap; `$02FA` the compiled-in
|
|
640
|
+
total, also 2,056. A Python Bresenham over the same eleven endpoint
|
|
641
|
+
pairs, in the same form as the listing, gives 2,056 pixels with no two
|
|
642
|
+
lines sharing one, so the two counts agree because nothing overlaps,
|
|
643
|
+
not by accident.
|
|
644
|
+
- `$02F8`: 0 timer reads retried because the high byte moved between
|
|
645
|
+
reads.
|
|
646
|
+
- `$02FC`: 214 cycles for a one-pixel line, the routine's fixed cost
|
|
647
|
+
(setup, the first plot, the exit test).
|
|
648
|
+
- `$02FF`: `01`, pass.
|
|
649
|
+
|
|
650
|
+
From the one-pixel and the 320-pixel figures, each further pixel of a
|
|
651
|
+
flat line costs (43,606 - 214) / 319 = 136 cycles (rung 3 from two rung 1
|
|
652
|
+
figures). The instruction table for the shallow loop gives 63 for the
|
|
653
|
+
plot and 73 for the step, also 136. A sweep of flat lines of 2, 3, 256,
|
|
654
|
+
257, 258, 301, 319 and 320 pixels with the same listing is described
|
|
655
|
+
under "Why this works".
|
|
656
|
+
|
|
657
|
+
Before the display was blanked for the timing, the 320-pixel line
|
|
658
|
+
measured 47,028 cycles on PAL and 47,119 on NTSC, both wrong as a cost of
|
|
659
|
+
the routine: the CIA counts while a badline holds the CPU, and the two
|
|
660
|
+
models put a different number of badlines under a 44,000-cycle window.
|
|
661
|
+
|
|
662
|
+
## Why this works
|
|
663
|
+
|
|
664
|
+
**The plot.** Pixel (x, y) lives in the cell at column x / 8 and row
|
|
665
|
+
y / 8; cells are stored row by row, eight bytes per cell, so the cell row
|
|
666
|
+
starts at `$2000 + (y / 8) * 320` and the byte for scanline y inside it is
|
|
667
|
+
`+ (y & 7)`. The row table holds that sum for each of the 200 values of y,
|
|
668
|
+
low bytes in one page and high bytes in another. Adding `x & $F8` to the
|
|
669
|
+
low byte, with x's high byte carried into the high byte, reaches the cell:
|
|
670
|
+
`x & $F8` is the column times eight, which is exactly the byte offset of
|
|
671
|
+
that column's cell within the row. The bit inside the byte is the mask
|
|
672
|
+
table entry for `x & 7`, `$80` for the leftmost pixel, and an `ORA` sets
|
|
673
|
+
it without disturbing its neighbours. Each table sits in one page because
|
|
674
|
+
`LDA abs,Y` costs a cycle more when the index carries into the next page,
|
|
675
|
+
and y = 199 did.
|
|
676
|
+
|
|
677
|
+
**The line.** The routine takes the two deltas, remembers a sign for
|
|
678
|
+
each as `$01` or `$FF`, and works on their magnitudes. The axis with the
|
|
679
|
+
larger delta is the major axis: the loop steps it on every pixel and
|
|
680
|
+
steps the other axis only when the error term is zero or positive. The
|
|
681
|
+
error term starts at `2 * minor - major` and gains `2 * minor` each
|
|
682
|
+
step, less `2 * major` whenever the minor axis stepped; it is the
|
|
683
|
+
distance from the true line, scaled by two so no half appears. The
|
|
684
|
+
deltas reach 319, so the term and the doubled deltas are 16-bit and the
|
|
685
|
+
sign test is one `BMI` on the high byte; the values stay within about
|
|
686
|
+
-640 to 640, so the high byte's bit 7 is the true sign. Two loops, one
|
|
687
|
+
for each major axis, cover all eight octants because each steps its
|
|
688
|
+
major axis by `sx` or `sy`. The loop counts `major` steps after the
|
|
689
|
+
first pixel, so the last pixel is the end point in every octant, which
|
|
690
|
+
the Python model asserts for the eleven lines here.
|
|
691
|
+
|
|
692
|
+
**Why the sweep matters.** Flat lines of 2, 3, 256, 257, 258, 301, 319
|
|
693
|
+
and 320 pixels were timed with the same listing, changing only the first
|
|
694
|
+
endpoint pair (measured in VICE x64sc, PAL). Every figure fits 214 + 136
|
|
695
|
+
per further pixel, plus 4 cycles once the step count's low byte passes
|
|
696
|
+
zero and 4 once x crosses 255: 350, 34,894, 35,038, 35,174, 41,022,
|
|
697
|
+
43,470 and 43,606. The 3-pixel line read 518, 32 over the model, and its
|
|
698
|
+
`$02F8` read 1: the timer's high byte moved between the two reads, the
|
|
699
|
+
read was retried, and the retry is 32 cycles with the timer running. A
|
|
700
|
+
figure from this harness is only clean when `$02F8` is 0. The committed
|
|
701
|
+
layout keeps `shallow_loop`, `step_x` and every branch target in
|
|
702
|
+
`$0B00`-`$0BFF`. The same listing without the one-pixel measurement in
|
|
703
|
+
front of the loop measured 43,925 for the 320-pixel line, 319 more: its
|
|
704
|
+
`bne` that skips the high-byte decrement sat at `$0AFC` with its target
|
|
705
|
+
at `$0B00`, so the taken branch crossed a page on every step
|
|
706
|
+
(`pitfalls/cpu.md`, `branch_page_cross_extra_cycle`). A cost quoted for a
|
|
707
|
+
line routine is a cost of one layout.
|
|
708
|
+
|
|
709
|
+
**Blanking for the count.** DEN (`$D011` bit 4) is sampled once per
|
|
710
|
+
frame, on line `$30`, so clearing it stops badlines from the next frame
|
|
711
|
+
on, not from the next line. The program clears it and waits for two
|
|
712
|
+
sightings of raster line 64 before the first measurement; that crosses
|
|
713
|
+
one line `$30` with DEN clear. It sets DEN again before counting bits,
|
|
714
|
+
so the exit screenshot shows the drawing.
|
|
715
|
+
|
|
716
|
+
**Why the verdict is a count.** The set-bit count is a property of the
|
|
717
|
+
finished bitmap, not of the plot calls: a plot that hit the wrong byte,
|
|
718
|
+
or a line that ran a pixel long or short, changes it. It equals the sum
|
|
719
|
+
of `max(|dx|, |dy|) + 1` over the set only if no two lines share a pixel,
|
|
720
|
+
so the endpoints were chosen in separate regions and the Python model
|
|
721
|
+
checks the overlap as well as the count. The program never returns to
|
|
722
|
+
BASIC: `READY.` and the cursor would land in screen RAM, which is the
|
|
723
|
+
colour matrix here, and the picture would change with the cursor's phase.
|