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,578 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: basic-float-calls
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [basic_rom_float_calls]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [DC04, DC05, DC0D, DC0E, D011, D012, D020]
|
|
9
|
+
uses_kernal: [CHROUT]
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler: BASIC ROM floating point from machine code, four sums printed and checked, four calls timed
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
The BASIC ROM at $A000 holds a complete 40-bit floating-point library,
|
|
19
|
+
and with `$01 = $37`, which is how a `SYS` finds the machine, any
|
|
20
|
+
program can call it. This recipe calls ten of its routines by address:
|
|
21
|
+
`GIVAYF` (signed 16-bit to FAC), `MOVFM` and `MOVMF` (load and store a
|
|
22
|
+
five-byte float), `FADD`, `FDIV`, `FMULT`, `FSQR`, `FOUT` (FAC to a
|
|
23
|
+
PETSCII string at $0100) and `LINPRT` (print a 16-bit integer), with
|
|
24
|
+
`CONUPK` reached through the arithmetic entries. It prints four sums
|
|
25
|
+
through `CHROUT`, one a line: `sqrt(2)`, `355 / 113`, `0.1 + 0.2` from
|
|
26
|
+
two five-byte constants written in the listing, and `2^24 + 1` by 23
|
|
27
|
+
multiplies and an add. After each `FOUT` the string at $0100 is compared
|
|
28
|
+
with expected text held in the listing; the five bytes BASIC itself
|
|
29
|
+
produces for `1 / 10` are printed in hex and compared with the listing's
|
|
30
|
+
`0.1` constant. One `FMULT`, `FDIV`, `FSQR` and `FOUT` call are timed
|
|
31
|
+
with CIA1 timer A, net of an empty call, with the display off so no
|
|
32
|
+
badline stalls the count, and the four costs are printed with `LINPRT`.
|
|
33
|
+
The verdict goes to `$02FF` (`$01` pass, `$02` fail) and the border
|
|
34
|
+
(green or red). Every entry address was checked against the ROM with the
|
|
35
|
+
VICE monitor's `d` command before it was used; the listing is on the
|
|
36
|
+
technique `basic_rom_float_calls` in `techniques/maths.md`, and the
|
|
37
|
+
dump is quoted under "Expected output" below.
|
|
38
|
+
|
|
39
|
+
Built with `-define BASICOUT` the same program writes `$36` to `$01`
|
|
40
|
+
first, so the calls land in the RAM under the ROM. That build is the
|
|
41
|
+
control; what it did is recorded below and it is not pinned.
|
|
42
|
+
|
|
43
|
+
## Source
|
|
44
|
+
|
|
45
|
+
```asm
|
|
46
|
+
// basic-float-calls.asm
|
|
47
|
+
// Calls the BASIC ROM's floating-point routines from machine code with the
|
|
48
|
+
// ROM banked in ($01 = $37, as it is at SYS). Four sums, each printed through
|
|
49
|
+
// CHROUT on its own line: sqrt(2), 355/113, 0.1 + 0.2 and 2^24 + 1. The FOUT
|
|
50
|
+
// string at $0100 is compared with expected text held in this listing; the
|
|
51
|
+
// five bytes BASIC itself makes for 1/10 are compared with the constant below.
|
|
52
|
+
// One FMULT, FDIV, FSQR and FOUT call are each timed with CIA1 timer A, net of
|
|
53
|
+
// an empty call, and the four costs are printed with LINPRT.
|
|
54
|
+
// Verdict: $02FF = $01 and a green border when every compare matched, $02 and
|
|
55
|
+
// red otherwise. Zero page $57 to $70 is copied to $0340 before the first call
|
|
56
|
+
// and to $0360 after the last FOUT, for a monitor dump.
|
|
57
|
+
// Build with -define BASICOUT to run the same calls with BASIC banked out.
|
|
58
|
+
.encoding "petscii_upper"
|
|
59
|
+
|
|
60
|
+
.const CHROUT = $ffd2
|
|
61
|
+
.const MOVFM = $bba2 // FAC = five bytes at (A = low, Y = high)
|
|
62
|
+
.const MOVMF = $bbd4 // five bytes at (X = low, Y = high) = FAC
|
|
63
|
+
.const FADD = $b867 // FAC = mem(A/Y) + FAC
|
|
64
|
+
.const FSUB = $b850 // FAC = mem(A/Y) - FAC
|
|
65
|
+
.const FMULT = $ba28 // FAC = mem(A/Y) * FAC
|
|
66
|
+
.const FDIV = $bb0f // FAC = mem(A/Y) / FAC
|
|
67
|
+
.const FSQR = $bf71 // FAC = sqrt(FAC)
|
|
68
|
+
.const FOUT = $bddd // string of FAC at $0100, A/Y = $0100
|
|
69
|
+
.const GIVAYF = $b391 // FAC = signed 16-bit, A = high, Y = low
|
|
70
|
+
.const LINPRT = $bdcd // print unsigned 16-bit, A = high, X = low
|
|
71
|
+
|
|
72
|
+
.const RESULT = $02ff
|
|
73
|
+
.const CYC = $02f0 // four net costs, then the raw empty call
|
|
74
|
+
.const SAVE_PRE = $0340 // zero page $57..$70 before the first call
|
|
75
|
+
.const SAVE_POST = $0360 // the same span after the last FOUT
|
|
76
|
+
.const STRBUF = $0100
|
|
77
|
+
.const msg = $fb // string pointer for print_msg (2 bytes)
|
|
78
|
+
|
|
79
|
+
.macro timed(routine, ptr, slot) {
|
|
80
|
+
lda #$ff
|
|
81
|
+
sta $dc04
|
|
82
|
+
sta $dc05
|
|
83
|
+
lda #$19 // force load, one-shot, start
|
|
84
|
+
sta $dc0e
|
|
85
|
+
lda #<ptr
|
|
86
|
+
ldy #>ptr
|
|
87
|
+
jsr routine
|
|
88
|
+
lda #$08 // stop
|
|
89
|
+
sta $dc0e
|
|
90
|
+
sec
|
|
91
|
+
lda #$ff
|
|
92
|
+
sbc $dc04
|
|
93
|
+
sta CYC + slot * 2
|
|
94
|
+
lda #$ff
|
|
95
|
+
sbc $dc05
|
|
96
|
+
sta CYC + slot * 2 + 1
|
|
97
|
+
.if (slot != 4) {
|
|
98
|
+
sec
|
|
99
|
+
lda CYC + slot * 2
|
|
100
|
+
sbc CYC + 8
|
|
101
|
+
sta CYC + slot * 2
|
|
102
|
+
lda CYC + slot * 2 + 1
|
|
103
|
+
sbc CYC + 9
|
|
104
|
+
sta CYC + slot * 2 + 1
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
BasicUpstart2(start)
|
|
109
|
+
|
|
110
|
+
start:
|
|
111
|
+
sei
|
|
112
|
+
lda #$7f
|
|
113
|
+
sta $dc0d // no CIA1 interrupts
|
|
114
|
+
lda $dc0d
|
|
115
|
+
#if BASICOUT
|
|
116
|
+
lda #$36 // control build: BASIC ROM out, RAM at $A000
|
|
117
|
+
sta $01
|
|
118
|
+
#endif
|
|
119
|
+
lda #0
|
|
120
|
+
sta fail
|
|
121
|
+
ldx #$19
|
|
122
|
+
!: lda $57,x
|
|
123
|
+
sta SAVE_PRE,x
|
|
124
|
+
dex
|
|
125
|
+
bpl !-
|
|
126
|
+
lda #$93
|
|
127
|
+
jsr CHROUT
|
|
128
|
+
lda $d011
|
|
129
|
+
and #%11101111 // DEN off: no badline stalls in the timings.
|
|
130
|
+
sta $d011 // The VIC samples DEN on line $30, so wait
|
|
131
|
+
jsr wait_line255 // for the next frame before timing anything.
|
|
132
|
+
jsr wait_line255
|
|
133
|
+
ldx #<txt_hdr
|
|
134
|
+
ldy #>txt_hdr
|
|
135
|
+
jsr print_msg
|
|
136
|
+
|
|
137
|
+
timed(empty_rts, c_two, 4) // jsr, rts, loads and timer stores
|
|
138
|
+
|
|
139
|
+
// (a) sqrt(2)
|
|
140
|
+
ldx #<txt_a
|
|
141
|
+
ldy #>txt_a
|
|
142
|
+
jsr print_msg
|
|
143
|
+
lda #0
|
|
144
|
+
ldy #2
|
|
145
|
+
jsr GIVAYF
|
|
146
|
+
timed(FSQR, c_two, 2)
|
|
147
|
+
timed(FOUT, c_two, 3)
|
|
148
|
+
ldx #<exp_a
|
|
149
|
+
ldy #>exp_a
|
|
150
|
+
jsr show_and_check
|
|
151
|
+
|
|
152
|
+
// (b) 355 / 113
|
|
153
|
+
ldx #<txt_b
|
|
154
|
+
ldy #>txt_b
|
|
155
|
+
jsr print_msg
|
|
156
|
+
lda #>355
|
|
157
|
+
ldy #<355
|
|
158
|
+
jsr GIVAYF
|
|
159
|
+
ldx #<tmp
|
|
160
|
+
ldy #>tmp
|
|
161
|
+
jsr MOVMF
|
|
162
|
+
lda #0
|
|
163
|
+
ldy #113
|
|
164
|
+
jsr GIVAYF
|
|
165
|
+
timed(FDIV, tmp, 1)
|
|
166
|
+
jsr FOUT
|
|
167
|
+
ldx #<exp_b
|
|
168
|
+
ldy #>exp_b
|
|
169
|
+
jsr show_and_check
|
|
170
|
+
|
|
171
|
+
// (c) 0.1 + 0.2 from the two constants below
|
|
172
|
+
ldx #<txt_c
|
|
173
|
+
ldy #>txt_c
|
|
174
|
+
jsr print_msg
|
|
175
|
+
lda #<c_tenth
|
|
176
|
+
ldy #>c_tenth
|
|
177
|
+
jsr MOVFM
|
|
178
|
+
lda #<c_fifth
|
|
179
|
+
ldy #>c_fifth
|
|
180
|
+
jsr FADD
|
|
181
|
+
jsr FOUT
|
|
182
|
+
ldx #<exp_c
|
|
183
|
+
ldy #>exp_c
|
|
184
|
+
jsr show_and_check
|
|
185
|
+
|
|
186
|
+
// (c2) BASIC's own 1/10, five bytes, against c_tenth
|
|
187
|
+
ldx #<txt_c2
|
|
188
|
+
ldy #>txt_c2
|
|
189
|
+
jsr print_msg
|
|
190
|
+
lda #0
|
|
191
|
+
ldy #1
|
|
192
|
+
jsr GIVAYF
|
|
193
|
+
ldx #<tmp
|
|
194
|
+
ldy #>tmp
|
|
195
|
+
jsr MOVMF
|
|
196
|
+
lda #0
|
|
197
|
+
ldy #10
|
|
198
|
+
jsr GIVAYF
|
|
199
|
+
lda #<tmp
|
|
200
|
+
ldy #>tmp
|
|
201
|
+
jsr FDIV
|
|
202
|
+
ldx #<tmp2
|
|
203
|
+
ldy #>tmp2
|
|
204
|
+
jsr MOVMF
|
|
205
|
+
ldx #0
|
|
206
|
+
!: stx idx
|
|
207
|
+
lda tmp2,x
|
|
208
|
+
jsr print_hex
|
|
209
|
+
lda #$20
|
|
210
|
+
jsr CHROUT
|
|
211
|
+
ldx idx
|
|
212
|
+
lda tmp2,x
|
|
213
|
+
cmp c_tenth,x
|
|
214
|
+
beq !+
|
|
215
|
+
inc fail
|
|
216
|
+
!: inx
|
|
217
|
+
cpx #5
|
|
218
|
+
bne !--
|
|
219
|
+
lda #13
|
|
220
|
+
jsr CHROUT
|
|
221
|
+
|
|
222
|
+
// (d) 2^24 + 1 by 23 multiplies and one add
|
|
223
|
+
ldx #<txt_d
|
|
224
|
+
ldy #>txt_d
|
|
225
|
+
jsr print_msg
|
|
226
|
+
lda #<c_two
|
|
227
|
+
ldy #>c_two
|
|
228
|
+
jsr MOVFM
|
|
229
|
+
timed(FMULT, c_two, 0) // 2 * 2
|
|
230
|
+
lda #22
|
|
231
|
+
sta idx
|
|
232
|
+
!: lda #<c_two
|
|
233
|
+
ldy #>c_two
|
|
234
|
+
jsr FMULT
|
|
235
|
+
dec idx
|
|
236
|
+
bne !-
|
|
237
|
+
lda #<c_one
|
|
238
|
+
ldy #>c_one
|
|
239
|
+
jsr FADD
|
|
240
|
+
jsr FOUT
|
|
241
|
+
ldx #$19
|
|
242
|
+
!: lda $57,x
|
|
243
|
+
sta SAVE_POST,x
|
|
244
|
+
dex
|
|
245
|
+
bpl !-
|
|
246
|
+
ldx #<exp_d
|
|
247
|
+
ldy #>exp_d
|
|
248
|
+
jsr show_and_check
|
|
249
|
+
|
|
250
|
+
// measured costs, net of the empty call
|
|
251
|
+
ldx #<txt_mult
|
|
252
|
+
ldy #>txt_mult
|
|
253
|
+
jsr print_msg
|
|
254
|
+
lda CYC + 1
|
|
255
|
+
ldx CYC + 0
|
|
256
|
+
jsr LINPRT
|
|
257
|
+
ldx #<txt_div
|
|
258
|
+
ldy #>txt_div
|
|
259
|
+
jsr print_msg
|
|
260
|
+
lda CYC + 3
|
|
261
|
+
ldx CYC + 2
|
|
262
|
+
jsr LINPRT
|
|
263
|
+
ldx #<txt_sqr
|
|
264
|
+
ldy #>txt_sqr
|
|
265
|
+
jsr print_msg
|
|
266
|
+
lda CYC + 5
|
|
267
|
+
ldx CYC + 4
|
|
268
|
+
jsr LINPRT
|
|
269
|
+
ldx #<txt_out
|
|
270
|
+
ldy #>txt_out
|
|
271
|
+
jsr print_msg
|
|
272
|
+
lda CYC + 7
|
|
273
|
+
ldx CYC + 6
|
|
274
|
+
jsr LINPRT
|
|
275
|
+
|
|
276
|
+
lda $d011
|
|
277
|
+
ora #%00010000 // DEN back on for the picture
|
|
278
|
+
sta $d011
|
|
279
|
+
lda fail
|
|
280
|
+
bne bad
|
|
281
|
+
ldx #<txt_pass
|
|
282
|
+
ldy #>txt_pass
|
|
283
|
+
jsr print_msg
|
|
284
|
+
lda #5
|
|
285
|
+
sta $d020
|
|
286
|
+
lda #1
|
|
287
|
+
sta RESULT
|
|
288
|
+
jmp *
|
|
289
|
+
bad:
|
|
290
|
+
ldx #<txt_fail
|
|
291
|
+
ldy #>txt_fail
|
|
292
|
+
jsr print_msg
|
|
293
|
+
lda #2
|
|
294
|
+
sta $d020
|
|
295
|
+
sta RESULT
|
|
296
|
+
jmp *
|
|
297
|
+
|
|
298
|
+
empty_rts:
|
|
299
|
+
rts
|
|
300
|
+
|
|
301
|
+
wait_line255:
|
|
302
|
+
lda #255
|
|
303
|
+
!: cmp $d012
|
|
304
|
+
beq !-
|
|
305
|
+
!: cmp $d012
|
|
306
|
+
bne !-
|
|
307
|
+
rts
|
|
308
|
+
|
|
309
|
+
// print the FOUT string at $0100, then compare it with the text at X/Y
|
|
310
|
+
show_and_check:
|
|
311
|
+
stx msg
|
|
312
|
+
sty msg + 1
|
|
313
|
+
ldx #0
|
|
314
|
+
!: lda STRBUF,x
|
|
315
|
+
beq !+
|
|
316
|
+
jsr CHROUT
|
|
317
|
+
inx
|
|
318
|
+
bne !-
|
|
319
|
+
!: lda #13
|
|
320
|
+
jsr CHROUT
|
|
321
|
+
ldy #0
|
|
322
|
+
!: lda STRBUF,y
|
|
323
|
+
cmp (msg),y
|
|
324
|
+
bne !+
|
|
325
|
+
tax
|
|
326
|
+
beq done
|
|
327
|
+
iny
|
|
328
|
+
bne !-
|
|
329
|
+
!: inc fail
|
|
330
|
+
done: rts
|
|
331
|
+
|
|
332
|
+
print_msg:
|
|
333
|
+
stx msg
|
|
334
|
+
sty msg + 1
|
|
335
|
+
ldy #0
|
|
336
|
+
!: lda (msg),y
|
|
337
|
+
beq done
|
|
338
|
+
jsr CHROUT
|
|
339
|
+
iny
|
|
340
|
+
bne !-
|
|
341
|
+
rts
|
|
342
|
+
|
|
343
|
+
print_hex:
|
|
344
|
+
pha
|
|
345
|
+
lsr
|
|
346
|
+
lsr
|
|
347
|
+
lsr
|
|
348
|
+
lsr
|
|
349
|
+
jsr hex_digit
|
|
350
|
+
pla
|
|
351
|
+
and #$0f
|
|
352
|
+
hex_digit:
|
|
353
|
+
cmp #10
|
|
354
|
+
bcc !+
|
|
355
|
+
adc #6 // carry set: +7, into A..F
|
|
356
|
+
!: adc #$30
|
|
357
|
+
jmp CHROUT
|
|
358
|
+
|
|
359
|
+
// Five-byte floats: exponent excess 128, then a 32-bit mantissa with its top
|
|
360
|
+
// bit set in the value and used for the sign in the byte (0 = positive).
|
|
361
|
+
// 0.1 = 0.8 * 2^-3: exponent $7D; 0.8 * 2^32 = 3435973836.8, rounded up to
|
|
362
|
+
// $CCCCCCCD, sign bit cleared: $4C $CC $CC $CD. 0.2 is the same mantissa one
|
|
363
|
+
// exponent up. 1 = 0.5 * 2^1: $81 $00.. ; 2 = 0.5 * 2^2: $82 $00..
|
|
364
|
+
c_tenth: .byte $7d, $4c, $cc, $cc, $cd
|
|
365
|
+
c_fifth: .byte $7e, $4c, $cc, $cc, $cd
|
|
366
|
+
c_one: .byte $81, $00, $00, $00, $00
|
|
367
|
+
c_two: .byte $82, $00, $00, $00, $00
|
|
368
|
+
tmp: .fill 5, 0
|
|
369
|
+
tmp2: .fill 5, 0
|
|
370
|
+
fail: .byte 0
|
|
371
|
+
idx: .byte 0
|
|
372
|
+
|
|
373
|
+
txt_hdr: .text "BASIC ROM FLOAT CALLS"
|
|
374
|
+
.byte 13, 0
|
|
375
|
+
txt_a: .text "SQR(2) ="
|
|
376
|
+
.byte 0
|
|
377
|
+
txt_b: .text "355/113 ="
|
|
378
|
+
.byte 0
|
|
379
|
+
txt_c: .text "0.1+0.2 ="
|
|
380
|
+
.byte 0
|
|
381
|
+
txt_c2: .text "1/10 BYTES = "
|
|
382
|
+
.byte 0
|
|
383
|
+
txt_d: .text "2^24+1 ="
|
|
384
|
+
.byte 0
|
|
385
|
+
txt_mult: .text "FMULT CYCLES "
|
|
386
|
+
.byte 0
|
|
387
|
+
txt_div: .byte 13
|
|
388
|
+
.text "FDIV CYCLES "
|
|
389
|
+
.byte 0
|
|
390
|
+
txt_sqr: .byte 13
|
|
391
|
+
.text "FSQR CYCLES "
|
|
392
|
+
.byte 0
|
|
393
|
+
txt_out: .byte 13
|
|
394
|
+
.text "FOUT CYCLES "
|
|
395
|
+
.byte 0
|
|
396
|
+
txt_pass: .byte 13
|
|
397
|
+
.text "RESULT: PASS"
|
|
398
|
+
.byte 0
|
|
399
|
+
txt_fail: .byte 13
|
|
400
|
+
.text "RESULT: FAIL"
|
|
401
|
+
.byte 0
|
|
402
|
+
|
|
403
|
+
// expected FOUT text: a leading space for a positive value, no trailing space
|
|
404
|
+
exp_a: .text " 1.41421356"
|
|
405
|
+
.byte 0
|
|
406
|
+
exp_b: .text " 3.14159292"
|
|
407
|
+
.byte 0
|
|
408
|
+
exp_c: .text " .3"
|
|
409
|
+
.byte 0
|
|
410
|
+
exp_d: .text " 16777217"
|
|
411
|
+
.byte 0
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Build
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
java -jar $KICKASS_JAR basic-float-calls.asm -o basic-float-calls.prg
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
The control build, not pinned:
|
|
421
|
+
|
|
422
|
+
```bash
|
|
423
|
+
java -jar $KICKASS_JAR basic-float-calls.asm -define BASICOUT -o basic-float-calls-ctl.prg
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
## Expected output
|
|
427
|
+
|
|
428
|
+
Border green, text light blue on blue as `CHROUT` leaves it, decoded
|
|
429
|
+
from the PNG with the character ROM:
|
|
430
|
+
|
|
431
|
+
```
|
|
432
|
+
BASIC ROM FLOAT CALLS
|
|
433
|
+
SQR(2) = 1.41421356
|
|
434
|
+
355/113 = 3.14159292
|
|
435
|
+
0.1+0.2 = .3
|
|
436
|
+
1/10 BYTES = 7D 4C CC CC CD
|
|
437
|
+
2^24+1 = 16777217
|
|
438
|
+
FMULT CYCLES 1079
|
|
439
|
+
FDIV CYCLES 2409
|
|
440
|
+
FSQR CYCLES 43752
|
|
441
|
+
FOUT CYCLES 7412
|
|
442
|
+
RESULT: PASS
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
The `^` on the sixth line is PETSCII `$5E`, drawn as an up arrow.
|
|
446
|
+
Screenshots from the pinned run, 6,000,000 cycles:
|
|
447
|
+
`screenshots/basic-float-calls.png` (PAL) and
|
|
448
|
+
`screenshots/basic-float-calls-ntsc.png` (NTSC). Both decode to the text
|
|
449
|
+
above; border pixel (2, 100) is (98, 213, 50) on PAL and (114, 189, 103)
|
|
450
|
+
on NTSC, palette index 5 in `runtime/vice-reference.md`. The pinned
|
|
451
|
+
command was run twice per model and the two PNGs were identical bytes
|
|
452
|
+
each time (md5 `c44daf48c5569e770dbeb4d0f27a0b75` PAL,
|
|
453
|
+
`eb616ee612267b2d015d0f563d919d5c` NTSC). The program stores its
|
|
454
|
+
verdict at PAL cycle 3,237,550 and then loops with interrupts off, so
|
|
455
|
+
the picture is static from there and the beam position at the limit
|
|
456
|
+
does not matter.
|
|
457
|
+
|
|
458
|
+
The monitor dump at the verdict store (`trace store 02ff` with `m`
|
|
459
|
+
commands, VICE x64sc 3.10), identical on PAL and NTSC:
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
>C:02f0 37 04 69 09 FMULT 1079, FDIV 2409 (net, low byte first)
|
|
463
|
+
>C:02f4 e8 aa f4 1c FSQR 43752, FOUT 7412
|
|
464
|
+
>C:02f8 15 00 the empty call, 21 cycles raw, subtracted above
|
|
465
|
+
>C:02ff 01 verdict
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
Net means the raw timer count less the 21 cycles of the empty call,
|
|
469
|
+
which covers the `LDA`/`LDY` of the pointer, `JSR`, `RTS`, the stop
|
|
470
|
+
store and the timer's start latency. An earlier build of this program
|
|
471
|
+
timed with the display on and read `FSQR` 45,975 and `FOUT` 7,969 on
|
|
472
|
+
PAL, 2,223 and 557 more, while `FMULT` and `FDIV` read the same 1,079
|
|
473
|
+
and 2,409: the CIA counts the cycles a badline steals, and the two
|
|
474
|
+
short calls happened to fall where no badline was (the position in the
|
|
475
|
+
frame was not read). The listing now clears DEN before the first timing
|
|
476
|
+
and waits for two passes of line 255, because the VIC samples DEN once
|
|
477
|
+
a frame on line `$30`.
|
|
478
|
+
|
|
479
|
+
The ROM at each entry, from the monitor's `d` command with `$01 = $37`
|
|
480
|
+
(BASIC ROM 901226-01 as shipped with VICE, md5
|
|
481
|
+
`57af4ae21d4b705c2991d98ed5c1f7b8`; `$E097` is in the KERNAL image
|
|
482
|
+
901227-03):
|
|
483
|
+
|
|
484
|
+
```
|
|
485
|
+
GIVAYF .C:b391 A2 00 LDX #$00 ; then STX $0D, STA $62, STY $63: A/Y into the FAC mantissa
|
|
486
|
+
MOVFM .C:bba2 85 22 STA $22 ; STY $23, LDY #$04, LDA ($22),Y: pointer, then 5 bytes
|
|
487
|
+
MOVMF .C:bbd4 20 1B BC JSR $BC1B ; round FAC, then STX $22, STY $23: pointer, then 5 bytes
|
|
488
|
+
FADD .C:b867 20 8C BA JSR $BA8C ; CONUPK first: mem(A/Y) into ARG
|
|
489
|
+
FSUB .C:b850 20 8C BA JSR $BA8C ; CONUPK, then LDA $66 / EOR #$FF / STA $66: negate FAC, add
|
|
490
|
+
FMULT .C:ba28 20 8C BA JSR $BA8C ; CONUPK, BNE past a JMP $BA8B (zero FAC)
|
|
491
|
+
FDIV .C:bb0f 20 8C BA JSR $BA8C ; CONUPK, BEQ $BB8A (division by zero), JSR $BC1B
|
|
492
|
+
FSQR .C:bf71 20 0C BC JSR $BC0C ; FAC to ARG, LDA #$11 / LDY #$BF: 0.5 at $BF11, JSR $BBA2: power
|
|
493
|
+
FOUT .C:bddd A0 01 LDY #$01 ; LDA #$20, BIT $66, BPL, LDA #$2D: space or minus at $0100
|
|
494
|
+
CONUPK .C:ba8c 85 22 STA $22 ; STY $23, LDY #$04, LDA ($22),Y, STA $6D: 5 bytes into ARG
|
|
495
|
+
LINPRT .C:bdcd 85 62 STA $62 ; STX $63, LDX #$90, SEC, JSR $BC49: A/X as an unsigned float
|
|
496
|
+
RND .C:e097 20 2B BC JSR $BC2B ; sign of FAC, BMI / BNE / JSR $FFF3: RND(<0), RND(>0), RND(0)
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
Every first instruction fits the role its name claims: the four
|
|
500
|
+
arithmetic entries begin by unpacking the operand at A/Y into ARG, the
|
|
501
|
+
two movers begin with the pointer stores, `FSQR` is `FAC ^ 0.5`, and
|
|
502
|
+
`FOUT` decides the sign character. None was rejected. The lines after
|
|
503
|
+
the first instruction in each comment are the next lines of the same
|
|
504
|
+
dump, paraphrased.
|
|
505
|
+
|
|
506
|
+
Zero page `$57` to `$70`, copied before the first call and after the
|
|
507
|
+
last `FOUT` (before the `LINPRT` lines), same on both models:
|
|
508
|
+
|
|
509
|
+
```
|
|
510
|
+
before $57: 00 00 00 00 00 00 00 00 00 00 8c 00 00 08 0e 00 00 00 8c 80 c0 00 00 00 00 00
|
|
511
|
+
after $57: 7e af b0 cc c0 80 ff 00 00 00 9c ff ff ff ff 20 00 00 80 00 00 00 08 00 20 00
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
Changed: `$57` to `$5D`, `$61` to `$66`, `$69` to `$6B`, `$6D` and
|
|
515
|
+
`$6F`. Unchanged: `$5E` to `$60`, `$67`, `$68`, `$6C`, `$6E` and `$70`.
|
|
516
|
+
The before copy is what `SYS` left: `$61` to `$65` hold `8C 00 00 08
|
|
517
|
+
0E`, which is 2062, the program's start address as BASIC evaluated it
|
|
518
|
+
(arithmetic: exponent `$8C` is 2^12, mantissa `$0000080E`).
|
|
519
|
+
|
|
520
|
+
The control, `-define BASICOUT`, run once on PAL with `trace exec` on
|
|
521
|
+
`$B391`, `$FE66` and `$E37B`: the first `JSR GIVAYF` fetched opcode
|
|
522
|
+
`00` from the RAM at `$B391` (`$01` read `36` at that moment) and
|
|
523
|
+
executed `BRK` at cycle 3,053,082; the `BRK` vector reached the KERNAL
|
|
524
|
+
at `$FE66`, whose `JSR $FDA3` (IOINIT) wrote `$E7` to `$01` at `$FDD7`,
|
|
525
|
+
banking BASIC back in, and whose `JSR $E518` cleared the screen; then
|
|
526
|
+
`JMP ($A002)` went to the warm start at `$E37B` with `$01` reading
|
|
527
|
+
`37`. The screenshot shows a cleared screen, `READY.` on row 1, a
|
|
528
|
+
glyph the decoder did not match on row 2 at the cursor's position (the
|
|
529
|
+
warm start re-enables interrupts, so the cursor flashes), the border
|
|
530
|
+
its default light blue, and `$02FF` still `00`. The program's header
|
|
531
|
+
line, printed before the first call, was wiped by the screen clear. So
|
|
532
|
+
the failure mode with BASIC out is not garbage arithmetic but a `BRK`
|
|
533
|
+
into the KERNAL and a warm start that quietly re-banks the ROM.
|
|
534
|
+
|
|
535
|
+
## Why this works
|
|
536
|
+
|
|
537
|
+
BASIC's arithmetic works on two five-byte accumulators in zero page,
|
|
538
|
+
FAC at `$61` to `$66` and ARG at `$69` to `$6E`, each an exponent in
|
|
539
|
+
excess-128 form, a 32-bit mantissa with its top bit implied set, and a
|
|
540
|
+
separate sign byte; in memory the sign is folded into bit 7 of the
|
|
541
|
+
first mantissa byte. `MOVFM` unpacks a memory float into FAC, `CONUPK`
|
|
542
|
+
unpacks one into ARG, and the arithmetic entries take a pointer in A
|
|
543
|
+
(low) and Y (high) to the memory operand and leave the result in FAC,
|
|
544
|
+
so `FDIV` computes `mem / FAC` and the divisor has to be in FAC first:
|
|
545
|
+
that is why the listing converts 355, stores it to `tmp` with `MOVMF`,
|
|
546
|
+
converts 113 and then calls `FDIV` with `tmp`. `GIVAYF` stores A and Y
|
|
547
|
+
straight into the top of the mantissa and normalises from an exponent
|
|
548
|
+
of `$90`, which is the 16-bit integer path.
|
|
549
|
+
|
|
550
|
+
The constants: 0.1 is `0.8 * 2^-3`, so the exponent byte is 128 - 3 =
|
|
551
|
+
`$7D` and the mantissa is `0.8 * 2^32 = 3435973836.8`, rounded to
|
|
552
|
+
`$CCCCCCCD`; the sign bit is cleared for a positive value, giving
|
|
553
|
+
`7D 4C CC CC CD`. BASIC's own `1 / 10` came out as those five bytes, so
|
|
554
|
+
the derivation and the ROM's rounding agree. 0.2 is the same mantissa
|
|
555
|
+
with exponent `$7E`. Their sum prints as `.3` because `FOUT` rounds to
|
|
556
|
+
nine significant digits and the 32-bit sum is within half a unit of
|
|
557
|
+
0.3 at that precision. `2^24 + 1` prints exactly as 16777217: a 32-bit
|
|
558
|
+
mantissa holds every integer below 2^32, so the value that a 24-bit
|
|
559
|
+
single-precision format loses survives here. `FOUT` writes a leading
|
|
560
|
+
space for a positive value, drops the leading zero and terminates the
|
|
561
|
+
string with a zero byte, which is what the expected strings assert.
|
|
562
|
+
|
|
563
|
+
`FSQR` is not a root routine: its first instruction copies FAC to ARG
|
|
564
|
+
and the next two point at the constant 0.5 at `$BF11`, and the power
|
|
565
|
+
routine computes `exp(0.5 * log(x))`. That is why it costs 43,752
|
|
566
|
+
cycles, more than two PAL frames, against 1,079 for a multiply. `FOUT`
|
|
567
|
+
at 7,412 is a digit loop with a divide by ten per digit. All four
|
|
568
|
+
figures are one input each, not worst cases.
|
|
569
|
+
|
|
570
|
+
## What it does not establish
|
|
571
|
+
|
|
572
|
+
Any address on a BASIC ROM other than 901226-01: the entries were
|
|
573
|
+
checked against the image VICE ships and no other. Accuracy beyond the
|
|
574
|
+
four printed cases and the one constant compared: no sweep over inputs
|
|
575
|
+
was run, and the timings are for the inputs shown, not a worst case.
|
|
576
|
+
The ownership of the individual bytes in `$57` to `$60` is not
|
|
577
|
+
attributed to routines; only which bytes changed over the whole
|
|
578
|
+
sequence was measured. The control was run once and on PAL only.
|