我目前正在开发一款好玩的GameBoy模拟器,但是我在理解一些基本操作码的实现方式时遇到了一些问题。
目前我正在实现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 (note the bit-masking)
AND A,L(请注意位屏蔽)
(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;
我了解所有的位运算,知道它们的作用,但似乎我无法弄清楚为什么需要这样做。我有一些理论(如果我错了,请纠正我 :-)):我已经了解到,寄存器H和L基本上是寄存器HL,它是一个16位寄存器。由于CPU/总线只能处理8位操作,因此需要分割它;或者更合适的建议是:由于它只是一个寄存器,H和L的值在寄存器中被掩码,它们只需要被分开(较高的/低的四位?)。
如果有人可以让我更清楚地了解这一点,我将非常感激,因为我只想拥有更多的背景知识(关于所有这些东西内部如何工作),所以我知道我在做什么非常重要。