2

私はemuで最初の一歩を踏み出しているので、単純なGBエミュレーターを作成しています(これは新しいことですよね)。

私が理解していないように見えるのは、CPUサイクルと無条件ジャンプを正しく実装する方法です。

次の基本的なループがある場合は、JP1000hのようなコマンドJPnn(指摘されたメモリアドレスへの無条件ジャンプ)を検討してください。

increment PC
read opcode
execute command

次に、JPオペコードが読み取られてコマンドが実行された後(メモリから1000hを読み取り、PC = 1000hに設定)、PCがインクリメントされて1001hになり、エミュレーションが不良になります。

tl; dr PCをインクリメントするCPUループがある場合に、PC値が正しいままになるように、エミュレーターでジャンプをどのようにエミュレートしますか?

4

3 に答える 3

0

PC は、バイトを返すために使用されるたびに「アトミック」操作としてインクリメントする必要があります。これは、即値オペランドとオペコードを意味します。

あなたの例では、PCはオペコードに1回、2つのオペランドバイトに2回、3回使用されます。CPU が 3 バイトをフェッチし、PC をロードできる状態になるまでに、PC はすでに第 2 オペランドの後の次の命令オペコードを指していますが、実際に命令を実装すると PC がリロードされるため、問題ではありません。 .

于 2012-05-15T23:00:45.167 に答える
0

ループの最後に移動increment PCし、オペコードに応じて条件付きで実行しましたか?

于 2012-05-15T22:44:07.703 に答える
0

私はエミュレーションについてほとんど何も知りませんが、2 つの明らかなアプローチが思い浮かびます。

  1. メイン ループにハードコーディングする代わりにPC += 1、各オペコードが次の PC 値 (またはオフセット、インクリメントするかどうかを示すフラグなど) を返すかどうかを評価します。次に、ジャンプと他のオペコードの違い (プログラム カウンターへの影響) は、それらに関する他のすべてと一緒に定義できます。

  2. メイン ループが常に PC を 1 ずつインクリメントすることがわかっているので、ジャンプの実装で PC をtarget - 1ではなくに設定しtargetます。

于 2012-05-15T22:55:45.120 に答える