6502tinymachines

検証

独立した二つのオラクル。どちらか一方では足りないからだ。

オリジナルとの差分比較

ヘッドレスのハーネスが 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 を意図ではなく工学的事実にしているものだ。