6502tinymachines

シミュレータ

MOS 6502 のトランジスタレベルシミュレーション。Rust と WebAssembly 製で、実物のダイを描く WebGL レンダラを備える。visual6502 の一からの再構築であり、そのダイトレースとシミュレーション手法の上に建っている。

ここには 6502 の挙動をモデル化したものは何も無い。命令デコーダも、アドレッシングモード表も、サイクル数の一覧も無い。あるのは 1725 本の配線と 3510 個のスイッチで、挙動はそれらをシミュレートした結果として現れる。目に見えるレジスタの値はすべてダイ上の記憶ノードから読み戻したもので、サイクル数はすべて創発したものだ。

何をするか

  • 実物のチップを走らせる。 revD ダイのスイッチレベルシミュレーション。 オリジナル実装に対してビット単位で一致することを検証済み。
  • ダイを見せる。 実ポリゴン形状の 83,227 枚の三角形が、任意のズームで、 論理状態を生きたまま映す。
  • 信号を追跡する。 配線をクリックすると、その瞬間に何と繋がっているかが 見える。トランジスタが切り替わるたび、接続グループは変わる。
  • 後ろに戻れる。 直近 4096 半サイクルをキーフレームで巻き戻す。
  • マイクロアーキテクチャを露出する。 内部 T ステート、クロック位相、バスの ハンドシェイク、ALU の保持レジスタ。挙動エミュレータが塗り潰してしまうものも含めて。

どのレジスタにも無い演算結果

6502 は、命令が終わる時に ALU の結果をアキュムレータへ入れない。ADC次のオペコードフェッチに達してもまだアキュムレータに古い値を持っている。 結果は ALU の保持レジスタに座っていて、1 サイクル遅れて転送される。ALU を迂回する LDA は、1 サイクル早く着地する。

LDA #$50 / CLC / ADC #$50 を半サイクルずつ進めて、A が実際にいつ変わるかを見てほしい。命令境界で結果を確定するエミュレータにはこれを見せることができない。シリコンにとって真実ではないからだ。

どう組み立てられているか

クレート役割
v6502-netlist不変のトポロジ: ノード、トランジスタ、名前。状態は持たない。
v6502-simスイッチレベルのソルバ、6502 のクロックとバス層、巻き戻し。
v6502-wasmwasm-bindgen の表面。
web/WebGL2 レンダラと UI。素の ES モジュール、フレームワーク無し、ビルド工程無し。

ノードの論理レベルはノードの属性ではなく、導通中のトランジスタを通していま短絡しているグループの属性だ。整定とは、グループを組み直し、それぞれをレベルに解決し、伝播させ、不動点まで繰り返すことをいう。

レンダラは一つの事実の上で回っている: レイアウトは決して変わらない。三角形は GPU に一度だけ送られ、以降の各フレームはノードレベルの 1725 バイト配列だけをテクスチャとしてアップロードし、頂点シェーダがノード ID で標本化する。1 フレームは 6 回のドローコールで、ズームによらない。

速度

ネイティブでおよそ毎秒 28,500 半サイクル。オリジナルの JavaScript 実装のおよそ 94 倍にあたる。この数字はネイティブエンジンのもので、提供中の API のものではない: API のページがインスタンスごとの数字を載せていて、そちらは低く、別々に実測されている。

再配布の前に、ライセンス

コードは MIT。だが土台のチップデータは違う。visual6502 サブモジュール内の segdefs.jstransdefs.js、すなわちポリゴンとトランジスタの形状は CC BY-NC-SA 3.0 で、著作権は 2010 年 Greg James、Brian Silverman、Barry Silverman、クレジット表記は Greg James と www.visual6502.org に必要だ。

これが問題になるのは、ビルドがそのデータから派生するからだ。生成される netlist.binlayout.bin、それらを埋め込むあらゆる .wasm、デプロイされたあらゆるインスタンスは、NonCommercialShareAlike の条件を引き継ぐ。リポジトリがデータを再配布しないのはサブモジュールだからだが、ビルドは再配布にあたる。

要するに: フォークしてよい、学んでよい、クレジットを付けて非商用でホストしてよい。商用利用には、独立したダイトレースから形状を導出し直すか、権利者の個別の許諾が要る。

halfphi は例外で、その義務なしの MIT だ。チップを名指しせず、ダイデータを埋め込まないからだ。

クレジット

これが存在するのは、visual6502 のチームが 6502 を開封し、ダイを撮影し、すべてのポリゴンを手でトレースして、それを無償で公開してくれたからだ。Greg James、Brian Silverman、Barry Silverman、Ed Spittles、Segher Boessenkool、Achim Breidenbach、そして貢献したすべての人々に。