6502 CPU エミュレーション
-
02-07-2019 - |
質問
今日は週末なので、趣味のプロジェクトを書いて、一週間プログラミングに費やした疲れを癒します。
昨日、MOS 6502 CPU エミュレータのフレームワークを書きました。レジスタ、スタック、メモリ、およびすべてのオペコードが実装されています。(以下のソースへのリンク)
私が作成したデバッガで一連の操作を手動で実行することもできますが、NES rom をロードして、その指示に従ってプログラム カウンターを指定するだけでよいと考えています。これが、欠陥のあるオペコードを見つける最も速い方法であると考えました。
私は簡単な NES rom ローダーを作成し、ROM バンクを CPU メモリにロードしました。
問題は、オペコードがどのようにエンコードされているかがわからないことです。オペコード自体は、オペコードを一意に識別するオペコードごとに 1 バイトのパターンに従っていることはわかっています。
0 - BRK
1 - ORA (D,X)
2 - COP b
等
ただし、opcode 引数をどこで見つければよいのかわかりません。直後のバイトですか?絶対メモリではバイトではなくショートかもしれないと思います。
この CPU のメモリ モデルに詳しい人はいますか?
編集:おそらくこれは暗闇で撮影されたものだとは思いますが、昔ながらの Apple や Commodore のハッカーがここに潜んでいることを期待していました。
編集: 皆さんのご協力に感謝します。各操作を調整するための適切な変更を実装した後、CPU はマリオ ブラザーズをロードして実行できるようになります。Start を待機するループ以外は何もしませんが、これは良い兆候です :)
ソースをアップロードしました:
https://archive.codeplex.com/?p=cpu6502
エミュレータがどのように動作するか疑問に思ったことがある人なら、それは非常に簡単に理解できます。まったく最適化されていませんが、繰り返しになりますが、2.4GHz マシン上で 2MHz で動作する CPU をエミュレートしています :)
解決
オペコードは 1 バイトをとり、オペランドは次のバイトにあります。バイトサイズ列を確認してください ここ, 、 例えば。
他のヒント
次のような参考資料を調べてみると、 http://www.atarimax.com/jindroush.atari.org/aopc.html, 各オペコードには次のように指定されたエンコーディングがあることがわかります。
HEX LEN TIM
HEX は 1 バイトのオペコードです。その直後に引数の LEN バイトが続きます。これらの引数が何であるかを確認するには、リファレンスを参照してください。TIM データはエミュレータにとって重要です。これは、この命令の実行にかかるクロック サイクル数です。タイミングを正確に合わせるためにこれが必要になります。
これらの値 (LEN、TIM) は、オペコード自体ではエンコードされません。このデータをプログラム ローダー/実行プログラムに保存する必要があります。それは単なる大きなルックアップテーブルです。または、データとリーダーをエンコードするミニ言語を定義することもできます。
この本が役立つかもしれません: http://www.atariarchives.org/mlb/
また、他の 6502 アセンブラ/シミュレータ/デバッガを調べて、Assembly がどのように機械語としてコード化されるかを確認してください。
6502 のマニュアルは、Web 上のさまざまな歴史サイトにあります。KIM-1 が付属しています。もしかしたら、あなたが知る必要がある以上のことがそこに含まれているかもしれません。
Apple II ROM には逆アセンブラが含まれており、それがそう呼ばれていたと思います。これは、16 進数のオペコード、3 文字のオペコード、およびオペランドを良い形式で表示します。
そこで、利用可能なメモリがいかに少ないかを考慮して、6502 命令セット全体の 3 文字のオペコードをオペランドのバイト数 (常に 0、1、または 2) を非常に小さなスペースに押し込むことができました。実際にはそれほど多くはないからです。
Apple IIのROMを掘り出すことができれば、そこから切り取って貼り付けることができます...
6502 にはさまざまなアドレッシング モードがあり、同じ命令でもアドレッシング モードに応じていくつかの異なるオペコードがあります。6502 がメモリから、または ROM から直接データを取得するさまざまな方法について説明している次のリンクを参照してください。
これはより良いです - 6502 命令セット マトリックス: