我目前正在为老式的 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(注意位掩码)
(read HL register; &0xFF) save in cache C
R->C = R->HL &0xFF;
我知道所有的位操作,也知道它们的作用,但似乎我无法弄清楚为什么需要这样做。我有一些理论(如果我错了,请纠正我:-)):
我已经了解的是,寄存器 H 和 L 基本上是寄存器 HL,它是一个 16 位寄存器。由于 CPU/Bus 只能处理 8-Bit 操作,所以需要拆分;或更逻辑的建议:由于它只有一个寄存器,因此 H 和 L 的值在寄存器中被屏蔽,它们只需要彼此分开(高/低半字节?)。
如果有人能让我更清楚这一点,我将不胜感激,因为我只想拥有更多的背景知识(所有这些东西在内部是如何工作的),所以我知道自己在做什么对我来说非常重要。