私は現在、古き良きゲームボーイ用のエミュレーターを開発していますが、いくつかの基本的な操作コードを実装する方法を理解する上でいくつかの問題に直面しています。
現在、AND 演算を実装しています。最初のいくつか (0xA0 -> 0xA3; 0xA6 & 0xA7) は非常に単純ですが、レジスタ H、L の AND 演算は少し異なります。
z80 のドキュメントは、次のリンクからダウンロードできます: um0080.pdf (172 ページ)
ここに、私が何を意味するか (疑似コードを使用) と基本的に何をするかを示すいくつかの例を示します。
AND A,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;
AND A,L (ビットマスキングに注意)
(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;
私はすべてのビット操作を知っており、それらが何をするかを知っていますが、なぜそのようにする必要があるのか 理解できないようです. 私にはいくつかの理論があります (間違っていたら訂正してください :-)):
私がすでに理解していることは、レジスタ H と L は基本的に 16 ビット レジスタであるレジスタ HL であるということです。CPU/バスは 8 ビット操作しか処理できないため、分割する必要があります。または、より論理的な提案: 唯一のレジスタであるため、H と L の値はレジスタでマスクされ、単に互いに分離する必要があります (上位/下位ニブル?)。
背景知識(これらすべてが内部でどのように機能するか)を知りたいので、誰かがこれをより明確にしてくれれば、深く感謝します。