Skip to content

feat(accuracysnes): emulation mode uses its own vector table (A6.02) - #189

Merged
doublegate merged 3 commits into
mainfrom
feat/accuracysnes-a6-emu-vectors
Jul 21, 2026
Merged

doublegate merged 3 commits into
mainfrom
feat/accuracysnes-a6-emu-vectors

Conversation

@doublegate

@doublegate doublegate commented Jul 21, 2026 •

Copy link
Copy Markdown
Owner

A6.02 — emulation mode has its own vector table. COP goes through $FFF4, sixteen bytes from
the native $FFE4. A core that keeps one set of vectors, or that picks the table from something
other than the E flag, lands in the wrong handler; nothing about that is visible in ordinary code,
since a game's COP handler is usually the same routine either way.

The cart could not see it either

Both vectors pointed at the same trampoline, so a core taking the native table in emulation mode ran
the same handler and passed. The test is only possible because the runtime changed: the
emulation COP vector now has its own trampoline and its own RAM pointer, initialised to irq_stub
at reset so a COP in a test that installed no handler returns harmlessly.

Both handlers are installed and live, so taking the wrong table is a wrong answer rather than a
hang — the failure code distinguishes "took $FFE4" ($B0) from "reached neither" ($00).

BRK is deliberately not split

In emulation, $FFFE is shared between IRQ and BRK — the hardware conflates them — so a RAM
pointer behind it could not mean "the BRK handler" unambiguously, and splitting it would invent a
distinction the machine does not have.

That argument got made concrete the hard way: the first version split $FFFE too, and A6.06 and
A6.09 immediately failed. Both install through V_BRK_VEC and both run in emulation, so they were
suddenly vectoring past their own handlers. Reverting the BRK half fixed them and is also the
right model.

The other thing this cost, worth recording

The first draft reported neither handler. The handlers run in emulation mode, but ca65 still had
the test body's .a16 in force where they were emitted, so lda #$E0 assembled as three bytes, the
CPU took two, and the third ($00) executed as a BRK. The handlers now carry explicit .a8/.i8
and the body restores .a16/.i16 — this is the file-global assembler-state trap the repository's
own review instructions warn about, and it produces a silently wrong instruction stream rather than
an error.

Validation

  • cargo fmt --check clean; clippy clean apart from the pre-existing ndk-sys Android-only
    compile_error!.
  • Harness 10/10, pass rate 100.00% (222 scoring, 11 golden). A6.06 and A6.09 re-confirmed
    passing after the BRK revert.
  • Cross-validated: snes9x and Mesen2 both agree with the cart, on both images. No new
    divergences; 50/50 scenes unchanged.

Coverage moves 239 → 240 of 443.

In emulation mode, COP now vectors through $FFF4, independently of the native-mode $FFE4 vector; BRK/IRQ remain shared at $FFFE. The AccuracySNES harness adds dossier assertion A6.02 via cart test A6.10, increasing coverage from 239/443 to 240/443.

The claim would be false if an emulation-mode COP reached the native handler, neither handler, or incorrectly split the shared BRK/IRQ behavior.

COP goes through $FFF4, sixteen bytes from the native $FFE4, and a core that
keeps one set of vectors — or picks the table from something other than the E
flag — lands in the wrong handler. Nothing about that is visible in ordinary
code, since a game's COP handler is usually the same routine either way.

The cart could not see it either: both vectors pointed at the same trampoline,
so a core taking the native table in emulation mode ran the same handler and
passed. The emulation COP vector now has its own trampoline and its own RAM
pointer. Both handlers are installed and live, so taking the wrong table is a
wrong answer rather than a hang and the failure names the vector used.

BRK deliberately does not get the same treatment. In emulation, $FFFE is shared
between IRQ and BRK — the hardware conflates them — so a pointer behind it could
not mean 'the BRK handler' unambiguously, and splitting it would invent a
distinction the machine does not have. Splitting it also broke A6.06 and A6.09,
which install through V_BRK_VEC and run in emulation, which is how the argument
got made concrete.

Cross-validated: snes9x and Mesen2 agree, on both images.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 21, 2026 01:14
@gemini-code-assist

Copy link
Copy Markdown

Warning

You have reached your daily quota limit. Please wait up to 24 hours and I will start processing your requests again!

@coderabbitai

coderabbitai Bot commented Jul 21, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@doublegate, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 7 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d216e326-7af0-4c83-a59f-a7e9fe5c7230

📥 Commits

Reviewing files that changed from the base of the PR and between 4bcdcdd and cdba348.

📒 Files selected for processing (1)
  • docs/accuracysnes-plan.md

Walkthrough

In emulation mode, COP now uses a dedicated vector at $FFF4, trampoline, and RAM pointer. A new AccuracySNES test distinguishes emulation and native handlers, while the dossier, changelog, and test-status documentation are updated.

Changes

Emulation COP vector routing

Layer / File(s) Summary
Dedicated emulation COP routing
tests/roms/AccuracySNES/asm/runtime.inc, tests/roms/AccuracySNES/asm/runtime.s, tests/roms/AccuracySNES/asm/header.s
Adds V_COP_VEC_E, initializes it during reset, introduces cop_trampoline_e, and points the emulation COP vector at it. BRK/IRQ handling remains shared.
COP regression coverage and records
tests/roms/AccuracySNES/gen/src/tests/cpu.rs, tests/roms/AccuracySNES/gen/src/dossier.rs, CHANGELOG.md, docs/accuracysnes-plan.md
Adds and registers test A6.10, maps it to assertion A6.02, documents the COP correction, and increments the AccuracySNES test count.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant CPU
  participant EmulationVectorTable
  participant cop_trampoline_e
  participant V_COP_VEC_E
  participant COPHandler
  CPU->>EmulationVectorTable: Execute COP with E=1
  EmulationVectorTable->>cop_trampoline_e: Dispatch through $FFF4
  cop_trampoline_e->>V_COP_VEC_E: Load emulation handler address
  V_COP_VEC_E->>COPHandler: Jump to installed handler or irq_stub
Loading
🚥 Pre-merge checks | ✅ 10
✅ Passed checks (10 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title uses a valid Conventional Commit form and accurately summarizes the A6.02 emulation COP vector table change.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Changelog Entry ✅ Passed The PR adds a user-visible AccuracySNES COP-vector change, and CHANGELOG.md includes a new A6.02 unreleased entry documenting it.
Docs-As-Spec ✅ Passed No files under crates/rustysnes-* changed; the PR only touches AccuracySNES test ROMs and docs, so the docs-as-spec rule is not triggered.
Accuracysnes Bookkeeping ✅ Passed A6.10 is mapped in dossier.rs, the regenerated artifacts are all in the branch diff, and plan/coverage both moved +1 (233→234; 239→240).
No Panic On Untrusted Input ✅ Passed No new unwrap/expect/panic! was added in the PR diff; the only panic in dossier.rs is pre-existing and guards an internal MAP invariant, not external input.
Safety Comment On New Unsafe ✅ Passed No new unsafe blocks or unsafe fns were added in the changed files; the diff is assembly, data, and safe Rust test generation only.

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds an AccuracySNES CPU regression test for dossier A6.02 by making emulation-mode COP ($FFF4) distinguishable from native-mode COP ($FFE4) via a dedicated emulation trampoline + RAM vector pointer, and introducing a scored cart test (A6.10) that fails if the core fetches the wrong vector table.

Changes:

  • Add a dedicated emulation-mode COP trampoline (cop_trampoline_e) plus a new RAM pointer (V_COP_VEC_E) and wire $FFF4 to it.
  • Add scored test A6.10 (mapped to dossier A6.02) that installs distinct emulation/native handlers and asserts emulation COP vectors through $FFF4.
  • Regenerate AccuracySNES catalogs/docs (source catalog, error codes, coverage/plan counts) and update the changelog entry.

Reviewed changes

Copilot reviewed 11 out of 13 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tests/roms/AccuracySNES/SOURCE_CATALOG.tsv Adds the new A6.10 test entry to the generated catalog.
tests/roms/AccuracySNES/gen/src/tests/cpu.rs Implements generator-side definition of the new A6.10 CPU test.
tests/roms/AccuracySNES/gen/src/dossier.rs Maps cart test A6.10 to dossier assertion A6.02.
tests/roms/AccuracySNES/ERROR_CODES.md Documents the new A6.10 failure code meaning.
tests/roms/AccuracySNES/asm/tests_group_a.s Generated assembly for the new A6.10 test, plus updated test tables/counts.
tests/roms/AccuracySNES/asm/runtime.s Initializes the new emulation COP pointer and adds cop_trampoline_e.
tests/roms/AccuracySNES/asm/runtime.inc Defines the new direct-page pointer V_COP_VEC_E.
tests/roms/AccuracySNES/asm/header.s Wires the emulation COP vector ($FFF4) to cop_trampoline_e.
docs/accuracysnes-plan.md Updates the documented test count.
docs/accuracysnes-coverage.md Updates coverage totals to reflect the newly covered dossier row.
CHANGELOG.md Adds release notes describing the new emulation COP vector coverage.

Comment thread tests/roms/AccuracySNES/asm/runtime.inc Outdated
Comment thread tests/roms/AccuracySNES/gen/src/tests/cpu.rs Outdated
V_APU_PTR at $0050 is a 24-bit pointer used with lda [V_APU_PTR],y, so it owns
$0050-$0052 — and the new emulation COP vector was put at $0052, on top of its
bank byte. Whichever ran second corrupted the other. Moved to $0054, with the
reason recorded next to it so the next free-slot search does not repeat it.

Also: the native handler's comment claimed it could not return from an
emulation-mode interrupt. It is entered in emulation mode too — the mode is
decided by the COP, not by which vector was used — so its RTI returns just as
cleanly, and the marker it leaves is the whole of its job.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/accuracysnes-plan.md`:
- Line 16: Update the Tests count in accuracysnes-plan.md from 234 to 240,
matching the covered assertion total reported by accuracysnes-coverage.md while
preserving the existing breakdown text unless it must be adjusted for
consistency.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 094ec41e-6c10-4e4a-a9e5-e6bd60fc7819

📥 Commits

Reviewing files that changed from the base of the PR and between b021b16 and 4bcdcdd.

⛔ Files ignored due to path filters (6)
  • docs/accuracysnes-coverage.md is excluded by !docs/accuracysnes-coverage.md and included by docs/**
  • tests/roms/AccuracySNES/ERROR_CODES.md is excluded by !tests/roms/AccuracySNES/ERROR_CODES.md and included by tests/**
  • tests/roms/AccuracySNES/SOURCE_CATALOG.tsv is excluded by !**/*.tsv, !tests/roms/AccuracySNES/SOURCE_CATALOG.tsv and included by tests/**
  • tests/roms/AccuracySNES/asm/tests_group_a.s is excluded by !tests/roms/AccuracySNES/asm/tests_group_a.s and included by tests/**
  • tests/roms/AccuracySNES/build/accuracysnes-pal.sfc is excluded by !tests/roms/AccuracySNES/build/** and included by tests/**
  • tests/roms/AccuracySNES/build/accuracysnes.sfc is excluded by !tests/roms/AccuracySNES/build/** and included by tests/**
📒 Files selected for processing (7)
  • CHANGELOG.md
  • docs/accuracysnes-plan.md
  • tests/roms/AccuracySNES/asm/header.s
  • tests/roms/AccuracySNES/asm/runtime.inc
  • tests/roms/AccuracySNES/asm/runtime.s
  • tests/roms/AccuracySNES/gen/src/dossier.rs
  • tests/roms/AccuracySNES/gen/src/tests/cpu.rs
📜 Review details
⏰ Context from checks skipped due to timeout. (4)
  • GitHub Check: lint
  • GitHub Check: accuracysnes
  • GitHub Check: test-light
  • GitHub Check: build demo + docs
🧰 Additional context used
📓 Path-based instructions (15)
tests/roms/AccuracySNES/asm/**/*.s

📄 CodeRabbit inference engine (AGENTS.md)

tests/roms/AccuracySNES/asm/**/*.s: Never hand-edit generated asm/tests_group_a.s or asm/scenes.s; regenerate them with the AccuracySNES generator.
Use assertion helpers for every AccuracySNES verdict, including non-equality conditions; never hand-write a sta V_TEST_RESULT verdict byte.
Ensure every scene starts with a rebuilt canvas and a rerun of init_registers; verify that each scene visibly renders the state it claims to arrange.
Every SPC700 test program must call release_to_ipl, remap the IPL ROM before jumping to $FFC0, and bound every APU handshake wait; tests that receive no answer must report SKIP.

Files:

  • tests/roms/AccuracySNES/asm/header.s
  • tests/roms/AccuracySNES/asm/runtime.s
**/*.{rs,s}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{rs,s}: Do not rely on identical failures across three emulators as proof that a test is correct; investigate possible shared harness defects before treating the result as an emulator bug.
Do not use unsupported assembly constructs: STZ has no long-addressing form, cop #$00 must be emitted as .byte $02,$00, and menu labels must not exceed 24 columns.

Files:

  • tests/roms/AccuracySNES/asm/header.s
  • tests/roms/AccuracySNES/asm/runtime.s
  • tests/roms/AccuracySNES/gen/src/tests/cpu.rs
  • tests/roms/AccuracySNES/gen/src/dossier.rs
**/*

📄 CodeRabbit inference engine (AGENTS.md)

Preserve the architecture contracts: the Bus owns mutable state, timing is master-clock-driven, crate dependencies are one-directional, and determinism is mandatory.

**/*: Do not commit or vendor the generated snesdev_wiki/ mirror; it is gitignored and intended only as a local reference.
Keep commits focused and use Conventional Commits: <type>(<scope>): <subject>, with an imperative subject of at most 72 characters.
Do not use emojis in code, comments, or commit messages.
Before opening a PR, ensure formatting, Clippy, workspace tests, the core embedded build, rustdoc with warnings denied, documentation coverage, and changelog requirements pass.
Ticket completion must be reflected in the relevant to-dos/ sprint file.

Files:

  • tests/roms/AccuracySNES/asm/header.s
  • docs/accuracysnes-plan.md
  • tests/roms/AccuracySNES/asm/runtime.inc
  • tests/roms/AccuracySNES/asm/runtime.s
  • CHANGELOG.md
  • tests/roms/AccuracySNES/gen/src/tests/cpu.rs
  • tests/roms/AccuracySNES/gen/src/dossier.rs
tests/roms/AccuracySNES/**

📄 CodeRabbit inference engine (Custom checks)

When adding or removing an AccuracySNES test or scene under tests/roms/AccuracySNES/gen/src/, update dossier.rs::MAP, regenerate all required assembly, catalog, coverage, ROM, and scene artefacts, and adjust the hand-maintained plan counts by the same amount as the generated coverage table.

Files:

  • tests/roms/AccuracySNES/asm/header.s
  • tests/roms/AccuracySNES/asm/runtime.inc
  • tests/roms/AccuracySNES/asm/runtime.s
  • tests/roms/AccuracySNES/gen/src/tests/cpu.rs
  • tests/roms/AccuracySNES/gen/src/dossier.rs
docs/**/*.md

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Before changing a subsystem, consult docs/architecture.md, docs/STATUS.md, CONTRIBUTING.md, the relevant subsystem documentation, and applicable ADRs.

Treat docs/STATUS.md as the authoritative per-subsystem state and update project documentation alongside relevant implementation changes.

New subsystems must add documentation under docs/.

Files:

  • docs/accuracysnes-plan.md
**/*.{rs,md,toml}

📄 CodeRabbit inference engine (AGENTS.md)

Never commit commercial ROMs; only commit derived screenshots or hashes.

Files:

  • docs/accuracysnes-plan.md
  • CHANGELOG.md
  • tests/roms/AccuracySNES/gen/src/tests/cpu.rs
  • tests/roms/AccuracySNES/gen/src/dossier.rs
**/*.{rs,md}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Chip-behavior changes must update both the chip implementation and the corresponding docs/<subsystem>.md documentation.

Files:

  • docs/accuracysnes-plan.md
  • CHANGELOG.md
  • tests/roms/AccuracySNES/gen/src/tests/cpu.rs
  • tests/roms/AccuracySNES/gen/src/dossier.rs
docs/**

⚙️ CodeRabbit configuration file

docs/**: Docs are the spec, not a history log. Flag claims that contradict the code, counts that
contradict the generated docs/accuracysnes-coverage.md, and any statement of coverage that
is broader than what the corresponding test actually asserts.

Files:

  • docs/accuracysnes-plan.md
**/*.md

⚙️ CodeRabbit configuration file

**/*.md: Docs are the spec, not a changelog. Flag prose that has drifted from the code it describes
rather than style nits. The markdownlint gate is pinned to v0.39.0 via pre-commit —
do not report rules that version does not have (MD060 in particular).

Files:

  • docs/accuracysnes-plan.md
  • CHANGELOG.md
tests/roms/AccuracySNES/asm/runtime.inc

⚙️ CodeRabbit configuration file

tests/roms/AccuracySNES/asm/runtime.inc: Shared symbol definitions. Every address here is claimed by something; a new variable that
overlaps an existing block, or a block whose stated width is smaller than what the code
stores into it, is the failure mode. Check the arithmetic of VAR_BASE + $nn offsets
against their declared sizes and against the neighbouring definitions.

Files:

  • tests/roms/AccuracySNES/asm/runtime.inc
tests/roms/AccuracySNES/asm/runtime.s

⚙️ CodeRabbit configuration file

tests/roms/AccuracySNES/asm/runtime.s: Hand-written 65816. The battery runs under forced blank throughout; anything that lifts it
must put it back. Helpers are width-neutral (php/plp) by convention — flag one that is
not, because ca65's .a8/.a16 state is file-global and a mismatch emits silently wrong
instruction lengths.

Files:

  • tests/roms/AccuracySNES/asm/runtime.s
CHANGELOG.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

User-visible changes must be recorded under the [Unreleased] section.

Files:

  • CHANGELOG.md
**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

**/*.rs: Use Rust edition 2024 with the pinned toolchain (1.96); satisfy workspace pedantic, nursery, missing_docs, and unsafe_code warning levels because CI uses -D warnings. Document every public item.
Keep hot paths allocation-free.
Preserve determinism: identical seed, ROM, and input must produce bit-identical audio and video; additive features must remain default-off so shipped, native, no_std, and WASM builds remain byte-identical.
When implementing hardware behavior, pin the failing test ROM first and treat committed test ROMs as the specification.
When changing a chip, update the corresponding docs/<chip>.md in the same pull request.

**/*.rs: Use Rust edition 2024 and the toolchain pinned in rust-toolchain.toml (Rust 1.96).
Run cargo fmt --all --check; Rust code must remain rustfmt-compliant.
Run Clippy with cargo clippy --workspace --all-targets -- -D warnings; warnings must not remain.
New public Rust items must have rustdoc because missing_docs is a workspace lint.
Do not run cargo clippy --all-features; scripting and script-wasm are mutually exclusive. Use explicit per-feature jobs instead.

**/*.rs: Do not introduce .unwrap(), .expect(), or panic!() on untrusted external input such as ROM or save-state bytes, netplay messages, Lua or scripting input, or user-supplied paths, except in #[cfg(test)] code. Use typed errors at those boundaries; locally constructed values or immediately checked invariants are acceptable and must be identified.
Every new unsafe { ... } block or unsafe fn must have an adjacent // SAFETY: comment stating the relied-upon invariant and its guarantor. Unsafe code outside the frontend and FFI shims requires additional justification.

Files:

  • tests/roms/AccuracySNES/gen/src/tests/cpu.rs
  • tests/roms/AccuracySNES/gen/src/dossier.rs
tests/roms/AccuracySNES/gen/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Rebuild AccuracySNES after changes to gen/ or asm/; run the generator directly without piping through tail -1, so generator panics remain visible.

Files:

  • tests/roms/AccuracySNES/gen/src/tests/cpu.rs
  • tests/roms/AccuracySNES/gen/src/dossier.rs
tests/roms/AccuracySNES/gen/src/**

⚙️ CodeRabbit configuration file

tests/roms/AccuracySNES/gen/src/**: This generates a hardware-accuracy test cartridge. Judge each test by whether it can
distinguish the behavior it names from the alternatives, not by whether it passes.

Flag, specifically:

  • Vacuity. An assertion whose expected value is also what a broken or absent
    implementation produces (zero, "unchanged", "not $FF") needs a paired control assertion
    that would fail on that implementation. Say which alternative goes uncaught.
  • Overstated doc comments. The prose above a test is a claim about what it validates.
    If it names behaviors the emitted program does not exercise, or asserts a rationale that
    is not true of the code, that is a defect even though the test passes.
  • Shared state. OAM, CGRAM, VRAM and the S-DSP registers are not reset between tests. A
    test that does not establish its own starting conditions may be measuring the previous
    one; look for an earlier test that leaves the relevant state dirty.
  • Timing-marginal reads. Reading a register a few cycles after disturbing it, or
    asserting on a value that is still moving, produces a verdict that flips when unrelated
    code shifts. Prefer a settle, a disarm, or a provably stationary value.
  • Scanline geometry. Line 0 is a blanking line; the V counter's low byte aliases on a
    312-line PAL frame; the visible height is 224 or 239 depending on overscan. Constants
    derived from any of these deserve a second look.
  • Duplicate coverage. dossier.rs::MAP must not claim an assertion another test already
    implements. There is a build gate for this, but flag it in review too.

Files:

  • tests/roms/AccuracySNES/gen/src/tests/cpu.rs
  • tests/roms/AccuracySNES/gen/src/dossier.rs
🔇 Additional comments (6)
tests/roms/AccuracySNES/asm/runtime.inc (1)

166-174: LGTM!

tests/roms/AccuracySNES/asm/runtime.s (1)

81-82: LGTM!

Also applies to: 1537-1550

tests/roms/AccuracySNES/asm/header.s (1)

14-14: LGTM!

Also applies to: 55-60

tests/roms/AccuracySNES/gen/src/tests/cpu.rs (1)

83-83: LGTM!

Also applies to: 2303-2376

tests/roms/AccuracySNES/gen/src/dossier.rs (1)

169-169: LGTM!

CHANGELOG.md (1)

14-28: LGTM!

Comment thread docs/accuracysnes-plan.md Outdated
…ent counts

Two readers in a fortnight have read the coverage figure off the test count —
me, on #185, and the review bot on #189. Section 2 already said so; the table
at the top, which is where the numbers actually are, did not.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@doublegate
doublegate merged commit 4c9f4b7 into main Jul 21, 2026
13 of 14 checks passed
@doublegate
doublegate deleted the feat/accuracysnes-a6-emu-vectors branch July 21, 2026 01:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants