検証
独立した二つのオラクル。どちらか一方では足りないからだ。
オリジナルとの差分比較
ヘッドレスのハーネスが visual6502 の JavaScript エンジンを走らせ、全 1725 ノードのレベルを半サイクルごとにダンプする。Rust エンジンはこれにビット単位で一致する。
レジスタの一致は、6502 についての合意しか示さない。全ノードの一致は、シリコンについての合意を示す。
文書化された ISA との比較
データシートのサイクル数 (ページ跨ぎとブランチのペナルティ込み)、リード・モディファイ・ライトの二重書き込み、JSR/RTS のスタック配置、ADC/SBC のフラグ、そして BCD。
ダイデータを二者が同じように読み違えていれば、最初のテストは通り、こちらで落ちる。両方を持つ理由がそれだ。
走らせ方
差分テストは、先にオラクルを生成しないと走らない。無ければそのテストは、何も無いのに合格する代わりに、スキップする。
git clone --recurse-submodules https://github.com/tinymachines/6502
cd 6502
cargo test --workspace
# オリジナルとの差分テストは先にオラクルの生成が要る。
# 無ければそのテストはスキップされる。
node tools/golden-trace/gen.js --steps 3000
ダイデータがコピーではなくサブモジュールなのは、シミュレータ
に書いたライセンス上の理由による。--recurse-submodules なしでクローンした場合、ビルドにはパースすべきダイデータが無い:
git submodule update --init
状態復元が満たすべき基準
crates/v6502-sim/tests/state.rs が、API の中心的な主張の免許証だ。スナップショットを新品のマシンに復元した結果は、全ノード・全半サイクルでビット単位に一致することが証明されており、シリアライズと再開を三回跳んでも、一気に走らせた場合と正確に同じ場所に着地する。test_service.py は同じことを
HTTP の表面越しに証明する。
それが、ステートレスな API を意図ではなく工学的事実にしているものだ。