20

週末なので、趣味のプロジェクトを書いて 1 週間のプログラミングから解放されます。

昨日、MOS 6502 CPU エミュレータのフレームワークを書きました。レジスタ、スタック、メモリ、およびすべてのオペコードが実装されています。(以下ソースへのリンク)

私が書いたデバッガーで一連の操作を手動で実行することはできますが、NES ROM をロードして、プログラム カウンターをその命令に合わせたいだけです。これが欠陥のあるオペコードを見つけるための最速の方法であると考えました。

簡単な NES rom ローダーを作成し、ROM バンクを CPU メモリにロードしました。

問題は、オペコードがどのようにエンコードされているかがわからないことです。オペコード自体は、オペコードを一意に識別するオペコードごとに 1 バイトのパターンに従うことを知っています。

0 - BRK
1 - ORA (D,X)
2 - COP b

ただし、オペコード引数がどこにあるのかわかりません。直後のバイトですか?絶対メモリでは、バイトではなくショートかもしれないと思います。

このCPUのメモリモデルに精通している人はいますか?

編集:これはおそらく暗闇で撮影されていることを認識していますが、古い学校のアップルとコモドールのハッカーがここに潜んでいることを望んでいました.

編集:ご協力いただきありがとうございます。各操作を調整するための適切な変更を実装した後、CPU はマリオ ブラザーズをロードして実行できます。開始を待ってループする以外は何もしませんが、それは良い兆候です:)

ソースをアップロードしました:

https://archive.codeplex.com/?p=cpu6502

エミュレーターがどのように機能するのか疑問に思ったことがある人なら、理解するのは非常に簡単です。少なくとも最適化されていませんが、2.4 GHz マシンで 2 MHz で動作する CPU をエミュレートしています :)

4

7 に答える 7

12

オペコードは 1 バイトで、オペランドは次のバイトにあります。たとえば、こちらのバイト サイズの列を確認してください。

于 2008-09-21T18:59:56.733 に答える
4

http://www.atarimax.com/jindroush.atari.org/aopc.htmlのような参照を調べると、各オペコードに次のように指定されたエンコーディングがあることがわかります。

HEX LEN TIM

HEX は 1 バイトのオペコードです。その直後に、その引数の LEN バイトが続きます。これらの引数が何であるかを確認するには、リファレンスを参照してください。TIM データはエミュレーターにとって重要です。これは、この命令の実行にかかるクロック サイクル数です。これは、タイミングを正しくするために必要です。

これらの値 (LEN、TIM) は、オペコード自体にエンコードされていません。このデータをプログラムのローダー/実行プログラムに保存する必要があります。それはただの大きなルックアップテーブルです。または、ミニ言語を定義して、データとリーダーをエンコードすることもできます。

于 2008-09-21T19:03:49.940 に答える
1

この本が役立つかもしれません: http://www.atariarchives.org/mlb/

また、他の 6502 アセンブラー/シミュレーター/デバッガーを調べて、アセンブリが機械語としてどのようにコード化されるかを確認してください。

于 2008-09-21T18:57:54.510 に答える
1

6502 のマニュアルは Web のさまざまな履歴サイトにあります。KIM-1 が同梱されていました。たぶん、あなたが知る必要があるよりも多くのことがあります。

于 2008-09-21T19:09:37.927 に答える