質問

現在古き良きゲームボーイのためのエミュレータを開発しています、そして、私はいくつかの基本的な操作コードをどのように実装するかを理解するいくつかの問題に直面しています。

今、私はと操作を実装しています。最初の数少ない(0xa0 - > 0xa3; 0xa6&0xa7; 0xa6&0xa7)はかなり前方ですが、レジスタH、Lの演算は少し異なります。

このリンクの下のZ80の文書をダウンロードすることができます。 UM0080.pdf (172ページ)

これは、(疑似コードで)、基本的に私がしていることを示すものを示す例です。

とh(ビットシフトに注意してください)

(read HL register; >> 8) save in cache C
R->C = R->HL >> 8;

perform AND operation with cache
AND_H(R->C);
R->A &= R->C;
.

とa、l(ビットマスキングに注意してください)

(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;
.

私はすべてのビット操作を知っています、そして私は彼らが何をするのか知っていますが、そのようなことをする必要がある理由を理解することができないようです。私はいくつかの理論を持っています(私が間違っているなら私を正しい: - )):

私が既に理解されているのは、レジスタHとLは基本的には16ビットのレジスタであるレジスタHLです。 CPU / BUSは8ビットの動作を処理できるため、分割する必要があります。 またはより多くの論理的提案:その唯一のレジスタは1つのレジスタから、HとLの値はレジスタ内にマスクされ、それらは単に互いに分離される必要があります(より高い/下のニブル?)。

誰かが私にとってこれをより明確にすることができれば私はちょうど私にとってもっと明確にすることができるなら、私は私が私がしていることを知っていることを私にとって非常に重要です。

役に立ちましたか?

解決

コメントが指摘したときに、実装が16ビットエンティティHLとしてHLを16ビットエンティティHLとしてまとめて、右にシフトすることでHとLをHに分解するという事実は、純粋に実装です。具体的な

オリジナルZ80には4ビットのALUがあります(コンピュータ史博物館パネルのこの転写産物で、実際に(i)とLの4ビットとアキュムレータの4ビットです。 (ii)とLの高4ビットとアキュムレータ。ただし、内部実装が完全に隠されているように、ディスクリート8ビットエンティティとしてそのレジスタを公開します。

HLは、16ビットの数量を加えるために一緒になった2つのレジスタであるため、レジスタペアと呼ばれます。シャドウとインデックスレジスタを無視すると、元のZ80は実際にはそれらの3つのものがあります - HL、BC、そしてDE。 BCとDEは、間接負荷(オペコード0x1A - LD A、(BC)など)、および16ビット演算のための代替ペアとして、そして16ビット算術(例えば、0x09追加HL、BC)として、GameBoyのCPUで生き残り、 Z80。

SPとPCは一般に不可分16ビットレジスタと見なされています(もちろん、それらをメモリに保存して個別にバイトを読み取ることによってそれらを分割することができます)、そしてPusingとPoppingのためにAFが存在しますがfは特別なものです。 AFが通常16ビット整数として特に特に役立ちません。

ショートサマリー:オペコードでなければならないのは、特定の著者によってどのように実装されているかを理解することに問題がありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top