S1a CLI reference
S1a = S1 + physics mechanisms. Every S1 flag, plus the M2 / M4 / M6X mechanism toggles that walk past the netlist's edge.
S1a = S1 + 物理機制。S1 的每個旗標,加上走出網表邊緣的 M2 / M4 / M6X 機制開關。
The M1–M6 physics mechanisms just run — unconditionally, in every mode, with no env var, no flag, and no opt-out. S1a IS the full engine; there is no way to disarm it — the raw switch-level engine is the separate S1 fork. The authoritative parser is src/AprVisual.S1A/Test/TestRunner.cs; the mechanisms live in Test/TestRunner.Test.cs and Sim/WireCore.System.cs. Run as dotnet run --project src/AprVisual.S1A -- <flags>.
M1–M6 物理機制直接執行 —— 每個模式無條件跑,沒有 env、沒有旗標、沒有關閉開關。S1a 就是完整引擎,無法關掉它;要 raw 開關級引擎請用獨立的 S1 fork。權威解析器是 src/AprVisual.S1A/Test/TestRunner.cs;機制在 Test/TestRunner.Test.cs 與 Sim/WireCore.System.cs。執行方式:dotnet run --project src/AprVisual.S1A -- <flags>。
S1a = S1 + the mechanisms below, and they simply run. The M1–M6 physics mechanisms execute unconditionally in every mode — no env var, no flag, and no opt-out enables or disables them, and the ALERead phase-mux arms automatically with its baked-in calibration. S1a can no longer be disarmed; the raw switch-level engine is the separate S1 fork. The full CLI reference is reproduced below so this page stands alone.
S1a = S1 + 下面的機制,而且它們就是直接跑。M1–M6 物理機制在每個模式無條件執行 —— 沒有 env、沒有旗標、沒有關閉開關可開或關,ALERead 相位 mux 帶內建校準自動武裝。S1a 已無法關閉;要 raw 開關級引擎請用獨立的 S1 fork。完整 CLI 參考在下方重現,讓本頁自足。
The S1a differenceS1a 的差異What S1a adds over S1 — the always-on physics mechanismsS1a 比 S1 多的 —— 恆開的物理機制
Each S1a mechanism restores a slice of physics the binary switch-level model cannot express, and they are armed unconditionally in every mode — --benchmark included, since S1a is a full engine, not a raw switch-level run. So S1a has its own golden checksums (full_palette, --extra-ram): 0x41244C26C45EDD32 @ 300k, 0xFA016F9CEA14029B @ 1M — distinct from S1's raw 0x794A43ABDF169ADA / 0x6D4CCBCE2E9CD599 because the mechanisms (the ALERead node-split especially) change internal node state. They simply run — there is no opt-out; the raw switch-level engine (S1's raw checksum) is the separate S1 fork. The mechanism set is unchanged from the AC 141/141 · 147 146/1 milestone (authoritative re-run pending). Two hand-written shims are also always-on, because no mechanism replaces them yet: OpenBus (last-transferred-byte replay — a behavioural ceiling) and DL (the $4016/$4017 input-data-latch φ2 transparency — deferred; its general form was unsound). See the shim ledger for the full RETIRED status.
每個 S1a 機制還原一片二值開關級模型表達不了的物理,而且在每個模式都無條件武裝 —— 含 --benchmark,因為 S1a 是完整引擎、不是 raw 開關級跑。所以 S1a 有自己的金 checksum(full_palette,--extra-ram):0x41244C26C45EDD32 @ 300k、0xFA016F9CEA14029B @ 1M —— 與 S1 的 raw 0x794A43ABDF169ADA / 0x6D4CCBCE2E9CD599 不同,因為機制(尤其 ALERead node-split)改了內部節點狀態。它們就是直接跑 —— 沒有關閉開關;raw 開關級引擎(S1 的 raw checksum)是獨立的 S1 fork。機制集合與 AC 141/141 · 147 146/1 里程碑相同(權威重跑待進行)。兩個手寫 shim 也恆開,因為還沒有機制能取代它們:OpenBus(最後傳輸位元組重放 —— 行為層天花板)與 DL($4016/$4017 輸入資料閂鎖 φ2 透明 —— 延後;它的通則形式不健全)。完整 RETIRED 狀態見 shim 總帳。
Always-on physics mechanisms (no env, no toggle)恆開的物理機制(無 env、無開關)
Every mechanism below runs unconditionally in test mode and needs no env var, and none disturb the golden checksum (they arm only in test mode). The whole set is gated on AC 141/141 + the 147-ROM regression. S1a is always the full engine — there is no off-switch; the raw switch-level engine is the separate S1 fork. The Replaces column names the physics each one covers.下面每個機制在 test 模式無條件執行、不需 env,且都不動金 checksum(只在 test 模式武裝)。整組以 AC 141/141 + 147 顆回歸為閘。S1a 永遠是完整引擎 —— 沒有關閉開關;raw 開關級引擎是獨立的 S1 fork。取代欄標出每個機制涵蓋的物理。
| Mechanism機制 | Replaces取代 | What it does作用 |
| M2 charge-decay電荷衰減 | _io_db decay | Engine-level per-bit timestamp decay on the 2C02 io-bus latch island (the "decay register" leaks to 0 in ~600 ms). Three-arm proven 2026-07-18 (ppu_open_bus shim PASS / no-shim FAIL / mechanism PASS).2C02 io 匯流排 latch 島上的引擎級 per-bit 時戳衰減(「衰減暫存器」不刷新 ~600ms 漏到 0)。2026-07-18 三段論證(ppu_open_bus shim PASS / 拔 shim FAIL / 機制 PASS)。 |
| M4 edge-latch邊沿閂鎖 | DmcLatch + AluLatch | Generic edge-capture latch primitive (DMC pcm_latch = data-wins; ALU input latches = hold).通用邊沿捕捉閂鎖原語(DMC pcm_latch = 資料贏;ALU 輸入閂鎖 = hold)。 |
| M6×M3 phase相位 | dot-339 + BGSerialIn + even_odd | Unified cross-chip phase-arbitration table — one (trigger, gate, delay, window) mechanism. (dot-339 and BGSerialIn were previously separate delay shims — now folded in and deleted from the code.)統一跨晶片相位裁決表 —— 一個 (trigger, gate, delay, window) 機制。(dot-339、BGSerialIn 原本是獨立的延遲 shim —— 已併入並從程式碼刪除。) |
| M4·P1 merge-clamp合併鉗 | Dbl2007 + OamDmaPpuBus | Merge-clamp / queued-drive row (double-$2007 read merge + $4014-from-PPU-I/O-bus OAM write hold).合併鉗 / 佇列驅動列(雙 $2007 讀合併 + $4014-自-PPU-I/O-bus OAM 寫 hold)。 |
| M4·OE OAM-blank edgeOAM 消隱沿 | OamBlankEdge | Rendering-disable-edge OAM guard (a rendering-disable edge must not write OAM).關渲染邊沿 OAM 守門(關渲染邊沿不得寫 OAM)。 |
| M4·FI frame-IRQ幀 IRQ | FrameIrq | Frame-counter-IRQ flag-hold latch row.幀計數器 IRQ 旗標 hold 閂鎖列。 |
| M3 DMC abortDMC 廢止 | Dmc4015Abort | Mid-transfer abort: a deferred $4015 disable aborts an in-flight DMC DMA.中途廢止:延後的 $4015 disable 廢止進行中的 DMC DMA。 |
| M1 LXA magicLXA magic | LxaMagic | Strength-driven LXA ($AB) bus-fight resolution.強度驅動的 LXA($AB)匯流排對抗解析。 |
| M4·P4 PPU ALE feedbackPPU ALE 回授 | PpuAleReadFeedback | PPU ALE-read analog-feedback break (armed load-time; AC-verdict mode only).PPU ALE-read 類比回授切斷(載入期武裝;僅 AC 判定模式)。 |
| ALERead mux (M6)(M6) | ALERead phase | The $2007-access phase mux + node-split (cuts ppu.io_ab↔cpu.ab, armed before LoadSystem). Always armed with the baked-in calibration (window 13,13,25,44,52, gate 3,3,220,226); its detection is tight enough that only the boing2k7 stunt read triggers it, so it is inert for every other test.$2007 存取相位 mux + node-split(切開 ppu.io_ab↔cpu.ab,LoadSystem 前武裝)。恆武裝,帶內建校準(窗 13,13,25,44,52、閘 3,3,220,226);偵測夠緊,只有 boing2k7 特技讀取會觸發,對其他測試都是惰性。 |
Always-on shims (no mechanism replaces them yet)恆開的 shim(還沒機制取代)
| Shimshim | What it does作用 |
| OpenBus | Open-bus = last-transferred-byte replay. A behavioural ceiling; runs unconditionally in test mode.Open-bus = 最後傳輸位元組重放。行為層天花板;test 模式無條件執行。 |
| DL | DL/idl φ2-transparency at $4016/$4017. Its general form was unsound, so it stays a scoped shim; runs unconditionally.$4016/$4017 的 DL/idl φ2 透明。通則形式不健全,故仍是有範圍的 shim;無條件執行。 |
Experimental opt-ins (env-gated, default-OFF — not in the certified set)實驗性選用(env 控制、預設關 —— 不在認證組)
| Variable變數 | Value值 | What it does作用 |
M2_CAP | set, ≠0有設、≠0 | M2 physical-capacitance floating arbitration: floating groups resolve by physical capacitance (die polygons + gate W×L) instead of the connection-count proxy. Changes the checksum by design (~10.3% of floating-pair elections flip). Unproven investigation — for the M2 census / study, awaiting a separate decision.M2 物理電容浮接裁決:浮接群改用物理電容(晶粒多邊形 + 閘極 W×L)解析,取代連接數代理。設計上會改 checksum(~10.3% 浮接對選舉翻盤)。未拍板的調查 —— 用於 M2 普查 / 研究,待另行決定。 |
M2_CENSUS | set, ≠0 · DEBUG有設、≠0 · DEBUG | DEBUG-build firing census: tally how often the M2 physical key and the legacy connection-count key disagree. Needs M2_CAP; diagnostic only.DEBUG 版開火普查:統計 M2 物理鍵與 legacy 連接數鍵多常不一致。需 M2_CAP;僅診斷。 |
M4_DL | set, ≠0有設、≠0 | Add an experimental DL/idl transparent-latch row to the M4 edge-latch (glitch immunity at $4016/$4017). Redundant with the always-on DL shim; kept off pending a decision.為 M4 邊沿閂鎖加上實驗性的 DL/idl 透明閂鎖列($4016/$4017 毛刺免疫)。與恆開的 DL shim 重複;暫關待決。 |
1 · Entry points1 · 入口Mode selectors執行模式(擇一) identical to S1 today今天與 S1 相同
| Flag旗標 | Argument引數 | What it does作用 |
--benchmark | <rom> | Throughput mode: run a fixed number of master half-cycles, print hc/s, simulated FPS, MIPS, and the NodeStates checksum. ROM path optional.效能量測模式:跑固定數量的主 half-cycle,輸出 hc/s、模擬 FPS、MIPS、NodeStates checksum。ROM 路徑可選。 |
--test | <rom> | Run one test ROM to a verdict (blargg $6000, AccuracyCoin block, screen text, or CRC) or until the frame budget runs out; result in the exit code.跑單顆測試 ROM 到判定(blargg $6000、AccuracyCoin 塊、畫面文字或 CRC),或到幀預算耗盡;結果在 exit code。 |
--test-dir | <dir> | Batch-run every *.nes under a directory (recursive); prints an N/total passed summary.批次跑目錄下每顆 *.nes(遞迴);印 N/total passed 總結。 |
--rom | <rom> | Headless build has no window — a bare ROM renders 3 frames to screenshot.png; positional catch-all.headless 版無視窗 —— 純 ROM render 3 幀到 screenshot.png;位置性引數。 |
--selftest | — | Run the built-in inverter / NAND / pass-gate / callback / static-merge micro-circuits.跑內建 inverter / NAND / pass-gate / callback / static-merge 微電路。 |
--help -h /? | — | Print usage and exit.印使用說明並結束。 |
2 · Simulation environment2 · 模擬環境How the chip is loaded and run晶片怎麼載入與跑 identical to S1 today今天與 S1 相同
| Flag旗標 | Argument引數 | What it does作用 |
--system-def-dir | <dir> | Directory of the .js system-module definitions (default data/system-def)..js 系統模組定義的目錄(預設 data/system-def)。 |
--extra-ram | — | Force-map cart extra-RAM ($6000-$7FFF). Required for the golden checksum; --ac-verdict auto-disables it.強制掛載 cart extra-RAM($6000-$7FFF)。金 checksum 必帶;--ac-verdict 會自動停用。 |
--region | ntsc|pal|dendy | Select region timing (default ntsc).選區域時序(預設 ntsc)。 |
--joypad | — | Attach the behavioral joypad + u7/u8 tie-rewire (per-test). OFF by default (load-time graph change re-rolls the alignment lottery).掛行為層手把 + u7/u8 tie-rewire(per-test)。預設關(載入期圖變更會重擲對齊彩票)。 |
--reset-hold-extra | <K> | Hold reset K extra half-cycles (CPU/PPU phase-alignment). Flagship recipe uses K=1.reset 多按住 K 個 half-cycle(CPU/PPU 相位對齊)。旗艦配方用 K=1。 |
--pin | [N] | Pin the hot thread + High priority + EcoQoS-off to cut bench variance (Windows). No arg = auto P-core; N = force core N. Bit-exact; no frequency change.釘熱執行緒 + High priority + 關 EcoQoS 降 variance(Windows)。無引數 = 自動 P-core;N = 強制核 N。bit-exact;不改頻率。 |
--no-lower | — | Skip the S1.5 netlist-lowering pass (mapped-checksum A/B gate).跳過 S1.5 netlist-lowering pass(mapped-checksum A/B 閘)。 |
--fast-path | — | No-op — fast-path is always on; accepted for compatibility.無作用 —— fast-path 恆開;保留相容。 |
3 · Verdict detection3 · 測試判定How a test-ROM result is read測試 ROM 結果怎麼判 identical to S1 today今天與 S1 相同
| Flag旗標 | Argument引數 | What it does作用 |
--ac-verdict | — | AccuracyCoin unattended verdict: read the completion block at CPU RAM $07F0 (DE B0 61 + passed/total/skipped). Auto-disables extra-RAM; storm detection + $0400-$04FF table dump at exit.AccuracyCoin 無人值守判定:讀 CPU RAM $07F0 完成塊(DE B0 61 + passed/total/skipped)。自動停用 extra-RAM;含風暴偵測 + 結束傾印 $0400-$04FF 表。 |
--screen-verdict | — | B-class: per-frame nametable scan for a terminal Passed/Failed marker; 2-frame confirm.B 類:逐幀掃 nametable 找 terminal Passed/Failed;2 幀確認。 |
--pass-marker | <txt> | Custom terminal PASS text for ROMs that never print "Passed".為不印 "Passed" 的 ROM 自訂 PASS 字串。 |
--expected-crc | <A,B,…> | C-class: accept set for an on-screen 8-hex CRC (dmc_dma visual tests); 2-frame confirm.C 類:畫面 8-hex CRC 接受集(dmc_dma 視覺測試);2 幀確認。 |
--max-wait | <sec> | Wall-clock safety cap (0 = disabled). --max-frames is primary.wall-clock 安全上限(0 = 停用)。--max-frames 為主。 |
--max-frames | <N> | Simulation-frame budget — the primary limit (default 900 ≈ 15 sim-sec).模擬幀預算 —— 主要限制(預設 900 ≈ 15 模擬秒)。 |
--input | "<spec>" | Scripted input, Button:sec[:holdSec] (e.g. A:2,Start:6.5).腳本化輸入,Button:秒[:holdSec](如 A:2,Start:6.5)。 |
--test-json | <path> | Structured per-test result record (schema aprvisual-testrom/1).結構化每測結果記錄(schema aprvisual-testrom/1)。 |
--test-screenshot | <path> | Save the final frame as a PNG.把最終幀存成 PNG。 |
--shot-delay | <N> | N extra frames after the verdict before the screenshot (cosmetic).判定後多跑 N 幀再截圖(裝飾)。 |
4 · Snapshot / resume · 5 · progress4 · 快照/續跑 · 5 · 進度Windowed regression & long-run telemetry窗口回歸與長跑遙測 identical to S1 today今天與 S1 相同
| Flag旗標 | Argument引數 | What it does作用 |
--snapshot-frames | <N> | Full engine-state snapshot every N frames (0 = off). ~380 KB each; carries live shim state + CRC-32.每 N 幀存完整引擎狀態(0 = 關)。每顆 ~380 KB;含 live shim 狀態 + CRC-32。 |
--snapshot-dir | <dir> | Where the snapshot .sav files land.snapshot .sav 輸出目錄。 |
--resume | <sav> | Restore a snapshot after LoadSystem, continue from frame+1. Fingerprint check refuses a config mismatch.LoadSystem 後還原快照,從 frame+1 續跑。指紋校驗不符即拒。 |
--progress-frames | <N> | Every N frames: checkpoint latest.png + a JSON line in progress.jsonl. 0 = off.每 N 幀:checkpoint latest.png + progress.jsonl 一行 JSON。0 = 關。 |
--progress-dir | <dir> | Where those checkpoints land (cleared of stale files at start).checkpoint 輸出目錄(啟動時清舊檔)。 |
6 · Benchmark / perf6 · 效能量測Throughput knobs & profiling dumps吞吐旋鈕與剖析傾印 identical to S1 today今天與 S1 相同
| Flag旗標 | Argument引數 | What it does作用 |
--bench-hc | <N> | Benchmark exactly N raw master half-cycles (full S1a engine). Golden: 300000 → 0x41244C26C45EDD32, 1000000 → 0xFA016F9CEA14029B. The raw switch-level values (0x794A43ABDF169ADA / 0x6D4CCBCE2E9CD599) come from the separate S1 fork.benchmark 精確跑 N 個主 half-cycle(完整 S1a 引擎)。金:300000 → 0x41244C26C45EDD32、1000000 → 0xFA016F9CEA14029B。raw 開關級值(0x794A43ABDF169ADA / 0x6D4CCBCE2E9CD599)由獨立的 S1 fork 產生。 |
--log-dir | <dir> | Benchmark JSON log output directory (default log).benchmark JSON log 輸出目錄(預設 log)。 |
--dump-states | <path> | Dump per-node states after the bench run (A/B per-node diff).bench 後傾印全節點狀態(A/B 逐節點 diff)。 |
--array-footprint | — | Print the hot unmanaged-array base+size at setup (IBS/SPE bucketing).設定時印熱 unmanaged 陣列 base+size(IBS/SPE 分桶)。 |
--payload-hist | <path> | NodeInfo inline-payload size distribution.NodeInfo inline-payload 大小分佈。 |
--fc-taint-stats | <path> | same-state-prune eligibility (FC-free vs FC-tainted; diagnostic).same-state-prune 適格性(FC-free vs FC-tainted;診斷)。 |
7 · Shim CLI toggles7 · Shim CLI 開關The analog-race patch surface類比賽跑補丁面
S1a has no simulation on/off flags and no env vars — the mechanisms just run. There is no --no-shims and no per-shim disable toggle any more (--no-alu-shim, --no-dbl2007-shim, --no-ppu-ale-read-feedback-shim, --oam-dma-ppu-bus-shim, --ppu-write-delay[-global] were all removed) — S1a is always the full engine. The only env knobs are the experimental M2_CAP / M2_CENSUS / M4_DL opt-ins (see What S1a adds), and they change the checksum by design. For a raw switch-level run or env-driven configuration, use the sibling S1 engine.
S1a 沒有模擬開關、沒有 env —— 機制直接跑。已經沒有 --no-shims、也沒有任何 per-shim 關閉開關(--no-alu-shim、--no-dbl2007-shim、--no-ppu-ale-read-feedback-shim、--oam-dma-ppu-bus-shim、--ppu-write-delay[-global] 全部移除)—— S1a 永遠是完整引擎。唯一的 env 旋鈕是實驗性的 M2_CAP / M2_CENSUS / M4_DL 選用(見 S1a 加了什麼),且會依設計改變 checksum。要 raw 開關級跑或 env 驅動設定,用姊妹的 S1 引擎。
8 · Diagnostic tools8 · 診斷工具Node & state inspection節點與狀態檢視
| Flag旗標 | Argument引數 | What it does作用 |
--dump-node | <name> / @<id> | Dissect one node: pull-up, gated transistors, channel-end transistors. Raw-id aliases (cpu.#nnnn) do not resolve here — only in test mode.解剖單節點:pull-up、被 gate 的電晶體、channel 端電晶體。raw-id 別名(cpu.#nnnn)在此不解析 —— 只在 test 模式。 |
--dump-module | <name> | Parse <system-def-dir>/<name>.js and print a summary.解析 <system-def-dir>/<name>.js 並印摘要。 |
--dump-system | — | Compose the full nes-001 + cart netlist and print counts + probes.組出完整 nes-001 + cart 網表並印計數 + 探針。 |
--names | <id1,id2,…> | Engine id → name (keeps the name map).引擎 id → 名稱(保留名稱映射)。 |
--watch | <names> | Comma list of node names, printed per frame (pairs with --micro / after --resume).節點名逗號清單,每幀印(配 --micro / --resume 後)。 |
--micro | <path> | Run N frames, dump work RAM $0200-$07FF.跑 N 幀,傾印工作 RAM $0200-$07FF。 |
--micro-frames | <N> | --micro frame count (default 3).--micro 幀數(預設 3)。 |
--trace | <path> | Classic trace-column output.傳統 trace 欄位輸出。 |
--cycles | <N> | --trace cycle count (default 64).--trace 週期數(預設 64)。 |
--ac-dump-work | — | Dump AccuracyCoin work/results RAM $0500-$06FF at verdict.判定時傾印 AccuracyCoin 工作/結果 RAM $0500-$06FF。 |
9 · Screen output9 · 畫面輸出Framebuffer dumpsframebuffer 傾印 identical to S1 today今天與 S1 相同
| Flag旗標 | Argument引數 | What it does作用 |
--screenshot | <rom> | Run N frames, dump the framebuffer to a PNG.跑 N 幀後把 framebuffer 傾印成 PNG。 |
--frames | <N> | Frame count for --screenshot / --ppu-dump (default 3).--screenshot / --ppu-dump 幀數(預設 3)。 |
--out | <path> | Output PNG path for --screenshot (default screenshot.png).--screenshot 輸出 PNG 路徑(預設 screenshot.png)。 |
--frame-dump | <rom> | Per-frame PNG dump with progress + timing.逐幀 PNG 傾印(含進度 + 計時)。 |
--frame-count | <N> | Number of frames for --frame-dump (default 50).--frame-dump 幀數(預設 50)。 |
--out-dir | <dir> | Output directory for --frame-dump (default frames).--frame-dump 輸出目錄(預設 frames)。 |
--ppu-dump | <rom> | Run N frames, dump palette RAM / VRAM nametable / rendering state / pclk1 samples.跑 N 幀,傾印 palette RAM / VRAM nametable / rendering 狀態 / pclk1 取樣。 |
10 · Common recipes10 · 常用配方Copy-paste command lines可貼上的指令列
Golden checksum (full S1a engine, and the raw S1 core)黃金驗證(完整 S1a 引擎,與 raw S1 核心)
dotnet AprVisual.S1A.dll --benchmark AprVisualBenchMark/roms/full_palette.nes --bench-hc 300000 \
--extra-ram --system-def-dir AprVisualBenchMark/data/system-def
# S1a engine (always full, no opt-out): 300k -> 0x41244C26C45EDD32 1M -> 0xFA016F9CEA14029B
# for the raw switch-level values (0x794A43ABDF169ADA / 0x6D4CCBCE2E9CD599), run the separate S1 fork
S1a mechanisms (they just run — no env)S1a 機制(直接跑 —— 無 env)
dotnet AprVisual.S1A.dll --test ... # EVERY M1–M6 mechanism + ALERead mux ON, automatically (AC 141/141)
# there is no off-switch — S1a is always the full engine (for raw switch-level, run the separate S1 fork)
# Experimental opt-ins (default-OFF, not in the certified set):
M4_DL=1 dotnet AprVisual.S1A.dll --test ... # add the experimental DL transparent row ($4016/$4017)
M2_CAP=1 dotnet AprVisual.S1A.dll --benchmark ... # physical-capacitance arbitration — CHANGES the checksum by design
The mechanisms are unconditional — there is no off-switch. PowerShell (for the opt-ins): $env:M4_DL=1; dotnet ….機制無條件執行 —— 沒有關閉開關。PowerShell(選用):$env:M4_DL=1; dotnet …。
AccuracyCoin flagship run (shared surface — same as S1)AccuracyCoin 掛牌跑(共用面 —— 與 S1 相同)
No env prefix needed — the ALERead mux and its calibration are baked in, so the recipe is pure CLI. (The sibling S1 engine still needs an env prefix; see the S1 page.) The flagship must carry --max-frames 12000 — the default 900 stops the run early.
不需 env 前綴 —— ALERead mux 與其校準已內建,配方是純 CLI。(姊妹的 S1 引擎仍需 env 前綴,見 S1 頁。)旗艦必帶 --max-frames 12000 —— 預設 900 會提早停。
dotnet AprVisual.S1A.dll --test AprAccuracyCoinUnattended/AccuracyCoin.nes --ac-verdict --joypad \
--reset-hold-extra 1 --pin 2 \
--system-def-dir AprVisualBenchMark/data/system-def --max-frames 12000 \
--snapshot-frames 10 --snapshot-dir out/snaps --progress-frames 600 --progress-dir out/prog
# S1a: every mechanism (M2 decay, ALERead mux, …) is already armed — no env prefix needed
One-runner rule: run only one simulation instance at a time; do not build during a benchmark (the DLL is locked). The mechanisms keep the golden checksum unchanged (they never arm in the benchmark path) and must hold AC 141/141 + the 147-ROM regression in test mode.
單 runner 鐵律:同一時間只跑一個模擬實例;benchmark 期間不 build(DLL 鎖)。機制不動金 checksum(benchmark 路徑從不武裝),且在 test 模式須守住 AC 141/141 + 147 顆回歸。
11 · The 147-ROM test battery11 · 147 測試 ROM 實戰Four verdict paths, a controller, and a budget四種判定、手把、與預算 identical to S1 today今天與 S1 相同
Running the nes-test-roms battery is identical to S1 — the four verdict classes (blargg $6000 protocol, screen text, screen CRC), the controller simulation (--joypad + --input), and the budget/timeout flags are the same 71-flag surface. The full cookbook — one copy-paste command per verdict class, controller scripting, and the exit-code / detection=none notes — lives on the S1 page: S1 CLI §11 · The 147-ROM test battery. Just swap AprVisual.S1.dll → AprVisual.S1A.dll.跑 nes-test-roms 電池與 S1 完全相同 —— 四種判定(blargg $6000 協定、畫面文字、畫面 CRC)、手把模擬(--joypad + --input)、預算/timeout 旗標,都是同一組 71 旗標面。完整 cookbook(每種判定一行可貼上指令、手把腳本、exit code / detection=none 說明)在 S1 頁:S1 CLI §11 · 147 測試 ROM 實戰。只要把 AprVisual.S1.dll → AprVisual.S1A.dll。
Why it matters for S1a. The 147-ROM regression is one of the three verification anchors every S1a mechanism must clear — the golden checksum with the mechanism OFF, then AC 141/141 and the 147 sweep with it ON. A mechanism that breaks even one blargg ROM does not ship.
為什麼對 S1a 重要。147 顆回歸是每個 S1a 機制必過的三個驗證錨之一 —— 機制關時金 checksum,機制開時 AC 141/141 和 147 全跑。弄壞任一顆 blargg ROM 的機制不能出貨。