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,754 @@
|
|
|
1
|
+
---
|
|
2
|
+
recipe: tod-alarm
|
|
3
|
+
toolchain: kickassembler
|
|
4
|
+
output_format: PRG
|
|
5
|
+
region: both
|
|
6
|
+
techniques: [tod_alarm_interrupt]
|
|
7
|
+
file_formats: [PRG]
|
|
8
|
+
uses_registers: [D011, D012, D020, D021, DC04, DC05, DC08, DC09, DC0A, DC0B, DC0D, DC0E, DC0F]
|
|
9
|
+
uses_kernal: []
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<!-- doc-type: recipe -->
|
|
13
|
+
|
|
14
|
+
# KickAssembler — Set the TOD clock, arm its alarm three seconds on, and take the alarm as a CIA1 interrupt
|
|
15
|
+
|
|
16
|
+
## Synopsis
|
|
17
|
+
|
|
18
|
+
Sets CIA1's time-of-day clock to 01:02:03.0, programs the TOD alarm for
|
|
19
|
+
01:02:06.0, enables the alarm interrupt in `$DC0D` and chains a handler
|
|
20
|
+
under the KERNAL's jiffy IRQ through `$0314`. The main loop counts frames.
|
|
21
|
+
The handler reads `$DC0D` once, and on the alarm bit records the raster
|
|
22
|
+
line, Timer A, the TOD time (hours first, tenths last), the frame count
|
|
23
|
+
and its own cost in Timer A cycles. The screen shows the set time, the
|
|
24
|
+
alarm time, the time read in the handler and the frames elapsed against
|
|
25
|
+
the expected figure for the model. Verdict: `$01` at `$02FF` and a green
|
|
26
|
+
border when the alarm came within one tenth of the programmed time and
|
|
27
|
+
the handler's TOD read equals the alarm time; `$02` and red otherwise.
|
|
28
|
+
The technique is `tod_alarm_interrupt` in `techniques/cpu-cycle-tricks.md`.
|
|
29
|
+
|
|
30
|
+
The 50/60 Hz bit (`$DC0E` bit 7) is set from the model detected at run
|
|
31
|
+
time, so one PRG passes on PAL and NTSC. Built with `-define WRONGHZ` the
|
|
32
|
+
bit is set the wrong way round, which is the drift the page quotes.
|
|
33
|
+
|
|
34
|
+
CIA1 rather than CIA2: CIA1's alarm arrives as an IRQ, which the KERNAL
|
|
35
|
+
dispatches through `$0314` with A, X and Y already saved, which `SEI` can
|
|
36
|
+
hold off around a main-loop TOD read, and which leaves the jiffy clock and
|
|
37
|
+
the keyboard scan running. CIA2's alarm would be an NMI: unmaskable,
|
|
38
|
+
sharing a vector with RESTORE, and needing its own `$DD0D` acknowledge
|
|
39
|
+
(`nmi_handler_and_restore_key`).
|
|
40
|
+
|
|
41
|
+
## Source
|
|
42
|
+
|
|
43
|
+
```asm
|
|
44
|
+
// tod-alarm.asm
|
|
45
|
+
// Sets CIA1's time-of-day clock to a known time, programs the TOD alarm three
|
|
46
|
+
// seconds ahead, enables the alarm interrupt and chains it under the KERNAL's
|
|
47
|
+
// jiffy IRQ. The handler records the raster line, Timer A, the TOD time (read
|
|
48
|
+
// hours first, tenths last) and the frame count, and measures its own cost
|
|
49
|
+
// with Timer A. The main loop counts frames. Verdict at $02FF and in the
|
|
50
|
+
// border: $01 green when the alarm fired within one tenth of the programmed
|
|
51
|
+
// time and the TOD read in the handler equals the alarm time, else $02 red.
|
|
52
|
+
//
|
|
53
|
+
// Build with -define WRONGHZ to set the 50/60 Hz bit the wrong way round for
|
|
54
|
+
// the model, which makes the clock run 5/6 (PAL) or 6/5 (NTSC) of true speed.
|
|
55
|
+
.encoding "screencode_upper"
|
|
56
|
+
|
|
57
|
+
.const SCREEN = $0400
|
|
58
|
+
.const COLRAM = $d800
|
|
59
|
+
.const RESULT = $02ff
|
|
60
|
+
.const REC_RASTER = $02f8 // $D012, $D011 as read in the handler (varies run to run)
|
|
61
|
+
.const REC_TIMER = $02fa // Timer A low, high as read in the handler
|
|
62
|
+
.const SET_H = $01 // clock set to 01:02:03.0 AM
|
|
63
|
+
.const SET_M = $02
|
|
64
|
+
.const SET_S = $03
|
|
65
|
+
.const SET_T = $00
|
|
66
|
+
.const ALM_H = $01 // alarm at 01:02:06.0 AM, three seconds on
|
|
67
|
+
.const ALM_M = $02
|
|
68
|
+
.const ALM_S = $06
|
|
69
|
+
.const ALM_T = $00
|
|
70
|
+
.const EXP_PAL = 150 // three seconds of 50 Hz frames
|
|
71
|
+
.const EXP_NTSC = 180 // three seconds of 60 Hz frames
|
|
72
|
+
.const TOL_PAL = 5 // one tenth of a second in frames
|
|
73
|
+
.const TOL_NTSC = 6
|
|
74
|
+
|
|
75
|
+
.const zp_ptr = $fb // string pointer
|
|
76
|
+
.const zp_val = $fd // 16-bit value for the decimal printer
|
|
77
|
+
.const zp_scr = $f7 // screen pointer for the printers
|
|
78
|
+
|
|
79
|
+
BasicUpstart2(start)
|
|
80
|
+
|
|
81
|
+
* = $0900 "code"
|
|
82
|
+
|
|
83
|
+
start:
|
|
84
|
+
sei
|
|
85
|
+
lda #$00
|
|
86
|
+
sta $d020
|
|
87
|
+
sta $d021
|
|
88
|
+
jsr clear_screen
|
|
89
|
+
jsr draw_labels
|
|
90
|
+
jsr detect_model
|
|
91
|
+
|
|
92
|
+
// --- TODIN: bit 7 of $DC0E must say what the mains pin carries ----------
|
|
93
|
+
// Read-modify-write: a plain store would clear bit 0 and stop Timer A, and
|
|
94
|
+
// with it the KERNAL's jiffy IRQ and keyboard scan.
|
|
95
|
+
lda $dc0e
|
|
96
|
+
and #$7f
|
|
97
|
+
ldx is_pal
|
|
98
|
+
beq todin_done
|
|
99
|
+
ora #$80 // PAL: 50 Hz
|
|
100
|
+
todin_done:
|
|
101
|
+
#if WRONGHZ
|
|
102
|
+
eor #$80 // deliberately wrong for the drift run
|
|
103
|
+
#endif
|
|
104
|
+
sta $dc0e
|
|
105
|
+
and #$80
|
|
106
|
+
sta todin_val
|
|
107
|
+
|
|
108
|
+
// --- the alarm: ALARM = 1 routes the four TOD writes to the alarm -------
|
|
109
|
+
lda $dc0f
|
|
110
|
+
ora #$80
|
|
111
|
+
sta $dc0f
|
|
112
|
+
lda #ALM_H
|
|
113
|
+
sta $dc0b
|
|
114
|
+
lda #ALM_M
|
|
115
|
+
sta $dc0a
|
|
116
|
+
lda #ALM_S
|
|
117
|
+
sta $dc09
|
|
118
|
+
lda #ALM_T
|
|
119
|
+
sta $dc08
|
|
120
|
+
lda $dc0f
|
|
121
|
+
and #$7f // back to the clock
|
|
122
|
+
sta $dc0f
|
|
123
|
+
|
|
124
|
+
// --- the handler and the interrupt enable -------------------------------
|
|
125
|
+
lda #<irq
|
|
126
|
+
sta $0314
|
|
127
|
+
lda #>irq
|
|
128
|
+
sta $0315
|
|
129
|
+
lda #$00
|
|
130
|
+
sta fired
|
|
131
|
+
sta frames
|
|
132
|
+
sta frames + 1
|
|
133
|
+
lda $dc0d // drop anything pending
|
|
134
|
+
lda #$84 // set bit 2: alarm IRQ on; Timer A's bit is untouched
|
|
135
|
+
sta $dc0d
|
|
136
|
+
|
|
137
|
+
// --- the clock: hours stops it, tenths starts it ------------------------
|
|
138
|
+
lda #SET_H
|
|
139
|
+
sta $dc0b
|
|
140
|
+
lda #SET_M
|
|
141
|
+
sta $dc0a
|
|
142
|
+
lda #SET_S
|
|
143
|
+
sta $dc09
|
|
144
|
+
lda #SET_T
|
|
145
|
+
sta $dc08 // running from here; frame 0 starts now
|
|
146
|
+
cli
|
|
147
|
+
|
|
148
|
+
// --- count frames until the handler says the alarm fired ----------------
|
|
149
|
+
frame_loop:
|
|
150
|
+
lda $d012
|
|
151
|
+
bpl frame_loop // wait for a line in 128-255
|
|
152
|
+
wait_low:
|
|
153
|
+
lda $d012
|
|
154
|
+
bmi wait_low // wait for the wrap to the next frame's 0-127
|
|
155
|
+
inc frames
|
|
156
|
+
bne no_carry
|
|
157
|
+
inc frames + 1
|
|
158
|
+
no_carry:
|
|
159
|
+
lda fired
|
|
160
|
+
beq frame_loop
|
|
161
|
+
sei // the run is over; nothing more should chain
|
|
162
|
+
|
|
163
|
+
// --- show the figures ---------------------------------------------------
|
|
164
|
+
lda #2
|
|
165
|
+
jsr set_row
|
|
166
|
+
lda is_pal
|
|
167
|
+
beq show_ntsc
|
|
168
|
+
ldx #<txt_pal
|
|
169
|
+
ldy #>txt_pal
|
|
170
|
+
jmp show_model
|
|
171
|
+
show_ntsc:
|
|
172
|
+
ldx #<txt_ntsc
|
|
173
|
+
ldy #>txt_ntsc
|
|
174
|
+
show_model:
|
|
175
|
+
lda #6
|
|
176
|
+
jsr print_str
|
|
177
|
+
lda todin_val
|
|
178
|
+
asl
|
|
179
|
+
rol // bit 7 to bit 0
|
|
180
|
+
ora #$30 // '0' or '1'
|
|
181
|
+
sta SCREEN + 2 * 40 + 34
|
|
182
|
+
|
|
183
|
+
lda #4
|
|
184
|
+
jsr set_row
|
|
185
|
+
ldx #<set_time
|
|
186
|
+
ldy #>set_time
|
|
187
|
+
jsr print_time
|
|
188
|
+
lda #5
|
|
189
|
+
jsr set_row
|
|
190
|
+
ldx #<alarm_time
|
|
191
|
+
ldy #>alarm_time
|
|
192
|
+
jsr print_time
|
|
193
|
+
lda #8
|
|
194
|
+
jsr set_row
|
|
195
|
+
ldx #<got_h
|
|
196
|
+
ldy #>got_h
|
|
197
|
+
jsr print_time
|
|
198
|
+
|
|
199
|
+
lda #11
|
|
200
|
+
jsr set_row
|
|
201
|
+
lda got_icr
|
|
202
|
+
ldx #14
|
|
203
|
+
jsr print_hex
|
|
204
|
+
|
|
205
|
+
lda #12
|
|
206
|
+
jsr set_row
|
|
207
|
+
lda got_flo
|
|
208
|
+
sta zp_val
|
|
209
|
+
lda got_fhi
|
|
210
|
+
sta zp_val + 1
|
|
211
|
+
ldx #12
|
|
212
|
+
jsr print_dec
|
|
213
|
+
jsr expected // A = expected frames, X = tolerance
|
|
214
|
+
sta exp_val
|
|
215
|
+
stx tol_val
|
|
216
|
+
sta zp_val
|
|
217
|
+
lda #$00
|
|
218
|
+
sta zp_val + 1
|
|
219
|
+
ldx #25
|
|
220
|
+
jsr print_dec
|
|
221
|
+
lda tol_val
|
|
222
|
+
ora #$30
|
|
223
|
+
sta SCREEN + 12 * 40 + 33
|
|
224
|
+
|
|
225
|
+
lda #14
|
|
226
|
+
jsr set_row
|
|
227
|
+
lda cost_lo
|
|
228
|
+
sta zp_val
|
|
229
|
+
lda cost_hi
|
|
230
|
+
sta zp_val + 1
|
|
231
|
+
ldx #16
|
|
232
|
+
jsr print_dec
|
|
233
|
+
|
|
234
|
+
// --- verdict ------------------------------------------------------------
|
|
235
|
+
lda got_fhi
|
|
236
|
+
bne fail
|
|
237
|
+
lda got_flo
|
|
238
|
+
sec
|
|
239
|
+
sbc exp_val
|
|
240
|
+
bcs diff_pos
|
|
241
|
+
eor #$ff // negate
|
|
242
|
+
clc
|
|
243
|
+
adc #$01
|
|
244
|
+
diff_pos:
|
|
245
|
+
cmp tol_val
|
|
246
|
+
beq diff_ok
|
|
247
|
+
bcs fail
|
|
248
|
+
diff_ok:
|
|
249
|
+
lda got_h
|
|
250
|
+
cmp #ALM_H
|
|
251
|
+
bne fail
|
|
252
|
+
lda got_m
|
|
253
|
+
cmp #ALM_M
|
|
254
|
+
bne fail
|
|
255
|
+
lda got_s
|
|
256
|
+
cmp #ALM_S
|
|
257
|
+
bne fail
|
|
258
|
+
lda got_t
|
|
259
|
+
cmp #ALM_T
|
|
260
|
+
bne fail
|
|
261
|
+
lda #$01
|
|
262
|
+
sta RESULT
|
|
263
|
+
lda #$05 // green
|
|
264
|
+
sta $d020
|
|
265
|
+
lda #16
|
|
266
|
+
jsr set_row
|
|
267
|
+
ldx #<txt_pass
|
|
268
|
+
ldy #>txt_pass
|
|
269
|
+
lda #0
|
|
270
|
+
jsr print_str
|
|
271
|
+
jmp halt
|
|
272
|
+
fail:
|
|
273
|
+
lda #$02
|
|
274
|
+
sta RESULT
|
|
275
|
+
lda #$02 // red
|
|
276
|
+
sta $d020
|
|
277
|
+
lda #16
|
|
278
|
+
jsr set_row
|
|
279
|
+
ldx #<txt_fail
|
|
280
|
+
ldy #>txt_fail
|
|
281
|
+
lda #0
|
|
282
|
+
jsr print_str
|
|
283
|
+
halt:
|
|
284
|
+
jmp halt
|
|
285
|
+
|
|
286
|
+
// --- the interrupt handler ----------------------------------------------
|
|
287
|
+
// Entered through $0314 with A, X and Y already pushed by the KERNAL.
|
|
288
|
+
irq:
|
|
289
|
+
lda $dc04 // Timer A at entry, for the cost figure
|
|
290
|
+
sta t0_lo
|
|
291
|
+
lda $dc05
|
|
292
|
+
sta t0_hi
|
|
293
|
+
cld // the handler subtracts; D is whatever was interrupted
|
|
294
|
+
lda $dc0d // one read acknowledges every CIA1 source
|
|
295
|
+
sta icr_seen
|
|
296
|
+
and #$04
|
|
297
|
+
beq not_alarm
|
|
298
|
+
lda fired
|
|
299
|
+
bne not_alarm // record the first alarm only
|
|
300
|
+
lda $d011
|
|
301
|
+
sta REC_RASTER + 1 // bit 7 is raster bit 8
|
|
302
|
+
lda $d012
|
|
303
|
+
sta REC_RASTER
|
|
304
|
+
lda $dc04
|
|
305
|
+
sta REC_TIMER
|
|
306
|
+
lda $dc05
|
|
307
|
+
sta REC_TIMER + 1
|
|
308
|
+
lda $dc0b // hours first: latches the four registers
|
|
309
|
+
sta got_h
|
|
310
|
+
lda $dc0a
|
|
311
|
+
sta got_m
|
|
312
|
+
lda $dc09
|
|
313
|
+
sta got_s
|
|
314
|
+
lda $dc08 // tenths last: releases the latch
|
|
315
|
+
sta got_t
|
|
316
|
+
lda frames
|
|
317
|
+
sta got_flo
|
|
318
|
+
lda frames + 1
|
|
319
|
+
sta got_fhi
|
|
320
|
+
lda icr_seen
|
|
321
|
+
sta got_icr
|
|
322
|
+
lda #$01
|
|
323
|
+
sta fired
|
|
324
|
+
lda $dc04 // Timer A at exit; it counts down, so cost = t0 - t1
|
|
325
|
+
sta t1_lo
|
|
326
|
+
lda $dc05
|
|
327
|
+
sta t1_hi
|
|
328
|
+
lda t0_lo
|
|
329
|
+
sec
|
|
330
|
+
sbc t1_lo
|
|
331
|
+
sta cost_lo
|
|
332
|
+
lda t0_hi
|
|
333
|
+
sbc t1_hi
|
|
334
|
+
sta cost_hi
|
|
335
|
+
not_alarm:
|
|
336
|
+
lda icr_seen
|
|
337
|
+
and #$01
|
|
338
|
+
beq no_jiffy
|
|
339
|
+
jmp $ea31 // Timer A too: let the KERNAL run its tick
|
|
340
|
+
no_jiffy:
|
|
341
|
+
jmp $ea81 // alarm alone: restore A, X, Y and RTI
|
|
342
|
+
|
|
343
|
+
// --- model detection: PAL has raster lines past 262 ---------------------
|
|
344
|
+
detect_model:
|
|
345
|
+
lda #$00
|
|
346
|
+
sta is_pal
|
|
347
|
+
wait_high:
|
|
348
|
+
lda $d011
|
|
349
|
+
bpl wait_high // line >= 256
|
|
350
|
+
scan_high:
|
|
351
|
+
lda $d012
|
|
352
|
+
cmp #$10 // line >= 272: PAL
|
|
353
|
+
bcc still_high
|
|
354
|
+
lda #$01
|
|
355
|
+
sta is_pal
|
|
356
|
+
still_high:
|
|
357
|
+
lda $d011
|
|
358
|
+
bmi scan_high
|
|
359
|
+
rts
|
|
360
|
+
|
|
361
|
+
// A = expected frames, X = tolerance for the detected model
|
|
362
|
+
expected:
|
|
363
|
+
lda is_pal
|
|
364
|
+
beq exp_ntsc
|
|
365
|
+
ldx #TOL_PAL
|
|
366
|
+
lda #EXP_PAL
|
|
367
|
+
rts
|
|
368
|
+
exp_ntsc:
|
|
369
|
+
ldx #TOL_NTSC
|
|
370
|
+
lda #EXP_NTSC
|
|
371
|
+
rts
|
|
372
|
+
|
|
373
|
+
// --- screen helpers -----------------------------------------------------
|
|
374
|
+
clear_screen:
|
|
375
|
+
ldx #$00
|
|
376
|
+
clr:
|
|
377
|
+
lda #$20
|
|
378
|
+
sta SCREEN,x
|
|
379
|
+
sta SCREEN + $100,x
|
|
380
|
+
sta SCREEN + $200,x
|
|
381
|
+
sta SCREEN + $300,x
|
|
382
|
+
lda #$0e // light blue
|
|
383
|
+
sta COLRAM,x
|
|
384
|
+
sta COLRAM + $100,x
|
|
385
|
+
sta COLRAM + $200,x
|
|
386
|
+
sta COLRAM + $300,x
|
|
387
|
+
inx
|
|
388
|
+
bne clr
|
|
389
|
+
rts
|
|
390
|
+
|
|
391
|
+
// A = row: zp_scr = SCREEN + row * 40
|
|
392
|
+
set_row:
|
|
393
|
+
tax
|
|
394
|
+
lda row_lo,x
|
|
395
|
+
sta zp_scr
|
|
396
|
+
lda row_hi,x
|
|
397
|
+
sta zp_scr + 1
|
|
398
|
+
rts
|
|
399
|
+
|
|
400
|
+
// X/Y = string address, A = column: prints on zp_scr's row from that column
|
|
401
|
+
print_str:
|
|
402
|
+
stx zp_ptr
|
|
403
|
+
sty zp_ptr + 1
|
|
404
|
+
clc
|
|
405
|
+
adc zp_scr
|
|
406
|
+
sta zp_scr
|
|
407
|
+
bcc ps_nc
|
|
408
|
+
inc zp_scr + 1
|
|
409
|
+
ps_nc:
|
|
410
|
+
ldy #$00
|
|
411
|
+
ps_loop:
|
|
412
|
+
lda (zp_ptr),y
|
|
413
|
+
beq ps_done
|
|
414
|
+
sta (zp_scr),y
|
|
415
|
+
iny
|
|
416
|
+
bne ps_loop
|
|
417
|
+
ps_done:
|
|
418
|
+
rts
|
|
419
|
+
|
|
420
|
+
// X/Y = address of four bytes h, m, s, t; prints HH:MM:SS.T from column 12
|
|
421
|
+
print_time:
|
|
422
|
+
stx zp_ptr
|
|
423
|
+
sty zp_ptr + 1
|
|
424
|
+
ldy #$00
|
|
425
|
+
lda (zp_ptr),y
|
|
426
|
+
and #$7f // AM/PM bit off the hours digit
|
|
427
|
+
ldx #12
|
|
428
|
+
jsr print_hex
|
|
429
|
+
ldy #$01
|
|
430
|
+
lda (zp_ptr),y
|
|
431
|
+
ldx #15
|
|
432
|
+
jsr print_hex
|
|
433
|
+
ldy #$02
|
|
434
|
+
lda (zp_ptr),y
|
|
435
|
+
ldx #18
|
|
436
|
+
jsr print_hex
|
|
437
|
+
ldy #$03
|
|
438
|
+
lda (zp_ptr),y
|
|
439
|
+
and #$0f
|
|
440
|
+
ora #$30
|
|
441
|
+
ldy #21
|
|
442
|
+
sta (zp_scr),y
|
|
443
|
+
lda #$3a // ':'
|
|
444
|
+
ldy #14
|
|
445
|
+
sta (zp_scr),y
|
|
446
|
+
ldy #17
|
|
447
|
+
sta (zp_scr),y
|
|
448
|
+
lda #$2e // '.'
|
|
449
|
+
ldy #20
|
|
450
|
+
sta (zp_scr),y
|
|
451
|
+
rts
|
|
452
|
+
|
|
453
|
+
// A = byte, X = column: two hex digits on zp_scr's row
|
|
454
|
+
print_hex:
|
|
455
|
+
sta hx_tmp
|
|
456
|
+
txa
|
|
457
|
+
tay
|
|
458
|
+
lda hx_tmp
|
|
459
|
+
lsr
|
|
460
|
+
lsr
|
|
461
|
+
lsr
|
|
462
|
+
lsr
|
|
463
|
+
jsr hex_digit
|
|
464
|
+
sta (zp_scr),y
|
|
465
|
+
iny
|
|
466
|
+
lda hx_tmp
|
|
467
|
+
and #$0f
|
|
468
|
+
jsr hex_digit
|
|
469
|
+
sta (zp_scr),y
|
|
470
|
+
rts
|
|
471
|
+
|
|
472
|
+
hex_digit:
|
|
473
|
+
cmp #$0a
|
|
474
|
+
bcc hd_num
|
|
475
|
+
sbc #$09 // A-F are screen codes 1-6
|
|
476
|
+
rts
|
|
477
|
+
hd_num:
|
|
478
|
+
ora #$30
|
|
479
|
+
rts
|
|
480
|
+
|
|
481
|
+
// zp_val = 16-bit value, X = column: five decimal digits
|
|
482
|
+
print_dec:
|
|
483
|
+
txa
|
|
484
|
+
tay
|
|
485
|
+
ldx #$00
|
|
486
|
+
pd_digit:
|
|
487
|
+
lda #$2f // '0' - 1
|
|
488
|
+
pd_sub:
|
|
489
|
+
clc
|
|
490
|
+
adc #$01
|
|
491
|
+
pha
|
|
492
|
+
lda zp_val
|
|
493
|
+
sec
|
|
494
|
+
sbc pow_lo,x
|
|
495
|
+
sta zp_val
|
|
496
|
+
lda zp_val + 1
|
|
497
|
+
sbc pow_hi,x
|
|
498
|
+
sta zp_val + 1
|
|
499
|
+
pla
|
|
500
|
+
bcs pd_sub
|
|
501
|
+
pha
|
|
502
|
+
lda zp_val
|
|
503
|
+
clc
|
|
504
|
+
adc pow_lo,x
|
|
505
|
+
sta zp_val
|
|
506
|
+
lda zp_val + 1
|
|
507
|
+
adc pow_hi,x
|
|
508
|
+
sta zp_val + 1
|
|
509
|
+
pla
|
|
510
|
+
sta (zp_scr),y
|
|
511
|
+
iny
|
|
512
|
+
inx
|
|
513
|
+
cpx #$05
|
|
514
|
+
bne pd_digit
|
|
515
|
+
rts
|
|
516
|
+
|
|
517
|
+
draw_labels:
|
|
518
|
+
ldx #$00
|
|
519
|
+
dl_loop:
|
|
520
|
+
lda label_rows,x
|
|
521
|
+
bmi dl_done
|
|
522
|
+
stx dl_idx
|
|
523
|
+
jsr set_row
|
|
524
|
+
ldx dl_idx
|
|
525
|
+
lda label_lo,x
|
|
526
|
+
sta zp_ptr
|
|
527
|
+
lda label_hi,x
|
|
528
|
+
sta zp_ptr + 1
|
|
529
|
+
ldy #$00
|
|
530
|
+
dl_chr:
|
|
531
|
+
lda (zp_ptr),y
|
|
532
|
+
beq dl_next
|
|
533
|
+
sta (zp_scr),y
|
|
534
|
+
iny
|
|
535
|
+
bne dl_chr
|
|
536
|
+
dl_next:
|
|
537
|
+
ldx dl_idx
|
|
538
|
+
inx
|
|
539
|
+
bne dl_loop
|
|
540
|
+
dl_done:
|
|
541
|
+
rts
|
|
542
|
+
|
|
543
|
+
// --- data ---------------------------------------------------------------
|
|
544
|
+
set_time: .byte SET_H, SET_M, SET_S, SET_T
|
|
545
|
+
alarm_time: .byte ALM_H, ALM_M, ALM_S, ALM_T
|
|
546
|
+
|
|
547
|
+
is_pal: .byte 0
|
|
548
|
+
todin_val: .byte 0
|
|
549
|
+
fired: .byte 0
|
|
550
|
+
frames: .word 0
|
|
551
|
+
icr_seen: .byte 0
|
|
552
|
+
t0_lo: .byte 0
|
|
553
|
+
t0_hi: .byte 0
|
|
554
|
+
t1_lo: .byte 0
|
|
555
|
+
t1_hi: .byte 0
|
|
556
|
+
cost_lo: .byte 0
|
|
557
|
+
cost_hi: .byte 0
|
|
558
|
+
exp_val: .byte 0
|
|
559
|
+
tol_val: .byte 0
|
|
560
|
+
dl_idx: .byte 0
|
|
561
|
+
hx_tmp: .byte 0
|
|
562
|
+
got_h: .byte 0
|
|
563
|
+
got_m: .byte 0
|
|
564
|
+
got_s: .byte 0
|
|
565
|
+
got_t: .byte 0
|
|
566
|
+
got_flo: .byte 0
|
|
567
|
+
got_fhi: .byte 0
|
|
568
|
+
got_icr: .byte 0
|
|
569
|
+
|
|
570
|
+
pow_lo: .byte <10000, <1000, <100, <10, <1
|
|
571
|
+
pow_hi: .byte >10000, >1000, >100, >10, >1
|
|
572
|
+
|
|
573
|
+
row_lo: .fill 25, <(SCREEN + i * 40)
|
|
574
|
+
row_hi: .fill 25, >(SCREEN + i * 40)
|
|
575
|
+
|
|
576
|
+
label_rows: .byte 0, 2, 4, 5, 7, 8, 9, 11, 12, 14, $ff
|
|
577
|
+
label_lo: .byte <l0, <l2, <l4, <l5, <l7, <l8, <l9, <l11, <l12, <l14
|
|
578
|
+
label_hi: .byte >l0, >l2, >l4, >l5, >l7, >l8, >l9, >l11, >l12, >l14
|
|
579
|
+
|
|
580
|
+
l0: .text "TOD ALARM IRQ CIA1 $DC08-$DC0F"
|
|
581
|
+
.byte 0
|
|
582
|
+
l2: .text "MODEL TODIN BIT7 "
|
|
583
|
+
.byte 0
|
|
584
|
+
l4: .text "SET TIME"
|
|
585
|
+
.byte 0
|
|
586
|
+
l5: .text "ALARM TIME"
|
|
587
|
+
.byte 0
|
|
588
|
+
l7: .text "IN THE HANDLER:"
|
|
589
|
+
.byte 0
|
|
590
|
+
l8: .text "TOD READ"
|
|
591
|
+
.byte 0
|
|
592
|
+
l9: .text "RASTER, TIMER A AT $02F8-$02FB"
|
|
593
|
+
.byte 0
|
|
594
|
+
l11: .text "ICR $"
|
|
595
|
+
.byte 0
|
|
596
|
+
l12: .text "FRAMES EXPECT +-"
|
|
597
|
+
.byte 0
|
|
598
|
+
l14: .text "HANDLER CYCLES"
|
|
599
|
+
.byte 0
|
|
600
|
+
txt_pal: .text "PAL"
|
|
601
|
+
.byte 0
|
|
602
|
+
txt_ntsc: .text "NTSC"
|
|
603
|
+
.byte 0
|
|
604
|
+
txt_pass: .text "RESULT: PASS"
|
|
605
|
+
.byte 0
|
|
606
|
+
txt_fail: .text "RESULT: FAIL"
|
|
607
|
+
.byte 0
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
## Build
|
|
611
|
+
|
|
612
|
+
```bash
|
|
613
|
+
java -jar $KICKASS_JAR tod-alarm.asm -o tod-alarm.prg
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
KickAssembler 5.25 produces a 1,486-byte PRG; the code segment runs
|
|
617
|
+
`$0900` to `$0DCC`.
|
|
618
|
+
|
|
619
|
+
Pinned VICE run (both models, `docs/recipes/runs.json`):
|
|
620
|
+
|
|
621
|
+
```bash
|
|
622
|
+
GSETTINGS_SCHEMA_DIR=/opt/homebrew/share/glib-2.0/schemas \
|
|
623
|
+
x64sc -default -warp +sound +autostart-delay-random -autostartprgmode 1 \
|
|
624
|
+
-limitcycles 8000000 -exitscreenshot tod-alarm.png -autostart tod-alarm.prg
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
Add `-model ntsc` for the second picture. The drift build is not pinned:
|
|
628
|
+
|
|
629
|
+
```bash
|
|
630
|
+
java -jar $KICKASS_JAR tod-alarm.asm -define WRONGHZ -o tod-alarm-wronghz.prg
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
## Expected output
|
|
634
|
+
|
|
635
|
+
Green border, black background, light blue text. The PAL screen is:
|
|
636
|
+
|
|
637
|
+
```text
|
|
638
|
+
row 0 TOD ALARM IRQ CIA1 $DC08-$DC0F
|
|
639
|
+
row 2 MODEL PAL TODIN BIT7 1
|
|
640
|
+
row 4 SET TIME 01:02:03.0
|
|
641
|
+
row 5 ALARM TIME 01:02:06.0
|
|
642
|
+
row 7 IN THE HANDLER:
|
|
643
|
+
row 8 TOD READ 01:02:06.0
|
|
644
|
+
row 9 RASTER, TIMER A AT $02F8-$02FB
|
|
645
|
+
row 11 ICR $84
|
|
646
|
+
row 12 FRAMES 00149 EXPECT 00150 +-5
|
|
647
|
+
row 14 HANDLER CYCLES 00130
|
|
648
|
+
row 16 RESULT: PASS
|
|
649
|
+
```
|
|
650
|
+
|
|
651
|
+
On NTSC row 2 reads `MODEL NTSC TODIN BIT7 0` and row 12
|
|
652
|
+
reads `FRAMES 00179 EXPECT 00180 +-6`; every other row is the same.
|
|
653
|
+
`recipes/kickassembler/screenshots/tod-alarm.png` (PAL, 384 by 272) and
|
|
654
|
+
`tod-alarm-ntsc.png` (NTSC, 384 by 247) were each produced twice by the
|
|
655
|
+
pinned command with identical bytes, and decoded by matching every 8 by
|
|
656
|
+
8 cell against `chargen-901225-01.bin` (measured in VICE x64sc 3.10,
|
|
657
|
+
rung 1).
|
|
658
|
+
|
|
659
|
+
What each line shows:
|
|
660
|
+
|
|
661
|
+
- Rows 4, 5 and 8: the clock was set to 01:02:03.0, the alarm to
|
|
662
|
+
01:02:06.0, and the four registers read in the handler, hours first
|
|
663
|
+
and tenths last, are 01:02:06.0 on both models. The alarm interrupt
|
|
664
|
+
is raised at the match, and the handler is inside it well before the
|
|
665
|
+
next tenth.
|
|
666
|
+
- Row 11: `$DC0D` read `$84` in the handler: bit 7 (an enabled source
|
|
667
|
+
fired) and bit 2 (the alarm), and no bit 0, so the jiffy timer had
|
|
668
|
+
not also underflowed and the handler left through `$EA81` rather than
|
|
669
|
+
`$EA31`. A run in which the two coincide would read `$85` and take
|
|
670
|
+
the `$EA31` path; that did not happen in any of the runs made.
|
|
671
|
+
- Row 12: frames counted from the tenths write that started the clock
|
|
672
|
+
to the alarm. Three seconds is 150 PAL frames or 180 NTSC frames; the
|
|
673
|
+
count was 149 and 179, one frame inside the tolerance of one tenth
|
|
674
|
+
(5 PAL frames, 6 NTSC). The alarm can only be early, never late: the
|
|
675
|
+
clock starts on the tenths write, but the mains tick that advances it
|
|
676
|
+
keeps its own phase, so the first tick arrives anywhere from 0 to one
|
|
677
|
+
tick later and the 150th (or 180th) tick lands up to one tick short
|
|
678
|
+
of 3.000 s. One tick is 19,705 PAL cycles or 17,045 NTSC cycles, one
|
|
679
|
+
frame within one per cent, and the frame counter rounds down, hence
|
|
680
|
+
149 and 179 (arithmetic; the counts are measured). That one-tick bound
|
|
681
|
+
assumes the five-or-six-tick divider behind the tenths digit restarts
|
|
682
|
+
when the clock does. If it keeps its count across the stop, the first
|
|
683
|
+
tenth can take from one to five ticks and the alarm can land up to
|
|
684
|
+
four ticks early, still inside the tolerance. The runs here cannot
|
|
685
|
+
tell the two apart; a build that delays the clock set by a varying
|
|
686
|
+
number of frames and reads the count would.
|
|
687
|
+
- Row 14: 130 cycles from the handler's first read of Timer A, at its
|
|
688
|
+
entry, to the read at its exit, with `CLD`, the `$DC0D` read, the
|
|
689
|
+
recording and the frame copy inside the span (measured in VICE x64sc
|
|
690
|
+
3.10, the same on both models). The whole alarm entry adds the IRQ
|
|
691
|
+
sequence (7), the KERNAL dispatcher at `$FF48` (29), the cost
|
|
692
|
+
bookkeeping after the exit read (about 38), the exit test (12) and
|
|
693
|
+
`$EA81` (22): about 240 cycles once, on the frame the alarm fires
|
|
694
|
+
(arithmetic from the instruction table). A build of this listing with
|
|
695
|
+
only the technique page's handler body between the two Timer A reads
|
|
696
|
+
(`CLD`, the `$DC0D` read, the four TOD reads and a count) read 68 on
|
|
697
|
+
both models, the same harness; that is the figure behind the
|
|
698
|
+
technique's `Cost` line, not this row's 130.
|
|
699
|
+
- Row 9: the raster line and Timer A seen in the handler are stored at
|
|
700
|
+
`$02F8`-`$02F9` (`$D012`, then `$D011` with the raster's bit 8 in bit
|
|
701
|
+
7) and `$02FA`-`$02FB` (Timer A low, high), for the monitor, and are
|
|
702
|
+
not printed. An earlier build printed them, and the PAL picture then
|
|
703
|
+
differed between identical runs: Timer A read `$048C` in one run and
|
|
704
|
+
`$045E` or `$045B` in five others, the raster line 240 or 241, while
|
|
705
|
+
two NTSC runs agreed to the byte. The alarm's arrival moves by up to
|
|
706
|
+
about 50 cycles between runs on PAL in VICE, and a pinned screenshot
|
|
707
|
+
cannot carry a figure that moves. Why it moves was not established
|
|
708
|
+
here.
|
|
709
|
+
|
|
710
|
+
With `-define WRONGHZ` (not pinned; both runs made once from this
|
|
711
|
+
listing, measured in VICE x64sc 3.10):
|
|
712
|
+
|
|
713
|
+
- PAL with TODIN = 0 (the bit the KERNAL leaves): row 12 reads `FRAMES
|
|
714
|
+
00180 EXPECT 00150 +-5`, red border, `RESULT: FAIL`. The clock divided
|
|
715
|
+
a 50 Hz tick by 6, so three clock seconds took 3.6 s of real time.
|
|
716
|
+
- NTSC with TODIN = 1: `FRAMES 00149 EXPECT 00180 +-6`, red, FAIL. The
|
|
717
|
+
clock divided 60 Hz by 5 and ran three seconds in 2.5 s.
|
|
718
|
+
- In both the handler's TOD read is still 01:02:06.0 and the ICR still
|
|
719
|
+
`$84`: the alarm compares clock digits, so a clock running at the
|
|
720
|
+
wrong rate still fires the alarm at the right digits, at the wrong
|
|
721
|
+
wall time. Nothing on the screen but the frame count reveals it.
|
|
722
|
+
|
|
723
|
+
## Why this works
|
|
724
|
+
|
|
725
|
+
The four writes with `$DC0F` bit 7 set land in the alarm registers and
|
|
726
|
+
leave the clock alone; the compare against the running clock is always
|
|
727
|
+
live, so there is no arming step beyond bit 2 of `$DC0D`. The four
|
|
728
|
+
writes with bit 7 clear set the clock: the hours write stops it and the
|
|
729
|
+
tenths write restarts it, which is why the clock is set last and the
|
|
730
|
+
frame count starts at that store (`pitfalls/cia.md`,
|
|
731
|
+
`tod_read_order_latch`, which measured both orders). The handler's read
|
|
732
|
+
order matters for the same reason in reverse: the hours read latches
|
|
733
|
+
the four registers, the tenths read releases them, so the time it
|
|
734
|
+
records is one coherent instant and the latch is not left standing for
|
|
735
|
+
the main loop to trip over.
|
|
736
|
+
|
|
737
|
+
One read of `$DC0D` clears every CIA1 flag and drops the IRQ line, so
|
|
738
|
+
the handler reads it once, keeps the value, and decides from the copy:
|
|
739
|
+
bit 2 is the alarm, bit 0 is the KERNAL's Timer A, and the two can
|
|
740
|
+
arrive together. The alarm alone leaves through `$EA81`, which pops A,
|
|
741
|
+
X and Y and returns; a Timer A bit sends the copy on to `$EA31` so the
|
|
742
|
+
jiffy clock and the keyboard scan are not lost. Writing `$84` to `$DC0D`
|
|
743
|
+
sets bit 2 without touching bit 0 (bit 7 set means "set the bits that
|
|
744
|
+
are 1"), which is what keeps the KERNAL's interrupt alive underneath.
|
|
745
|
+
Bit 7 of `$DC0E` is set read-modify-write for the same reason: a plain
|
|
746
|
+
store would clear bit 0 and stop Timer A.
|
|
747
|
+
|
|
748
|
+
The model test reads `$D011` bit 7 and `$D012` while the raster is past
|
|
749
|
+
line 255 and calls the machine PAL if it sees a line at or above 272;
|
|
750
|
+
NTSC's last line is 262. That is what chooses the TODIN value. The
|
|
751
|
+
KERNAL never sets that bit on either model (`hardware/cia-reference.md`,
|
|
752
|
+
`$DC0E`, read from the ROM bytes), so a program that wants the clock to
|
|
753
|
+
keep time on a PAL machine sets it itself, and the drift figures above
|
|
754
|
+
are what it costs not to.
|