【发布时间】:2012-03-29 05:38:38
【问题描述】:
我目前正在为老式的 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 的值在寄存器中被屏蔽了,它们只需要彼此分开(更高/更低的半字节?)。
如果有人能让我更清楚这一点,我将不胜感激,因为我只是想了解更多背景知识(所有这些东西在内部是如何工作的),所以知道自己在做什么对我来说非常重要。
【问题讨论】:
-
不需要那样做。显然,如果您将 HL 保持在一起,则在使用任何一半时都必须将其“拆分”。另一种选择是将 H 和 L 分开,并在需要 HL 时将它们连接在一起。
-
在我看来,你理解的很好。
-
您检查过现有的 Z80 模拟器源代码吗?
-
@harold:是的,我已经认为这仅取决于您如何实现它;因为它都是虚拟的,你可以做任何你想做的事情,只是输出(像黑盒一样)必须是合法的。
-
顺便说一句,tat Zilog Z80 手册是一个很好的文档,去年夏天我在调试 ADA MP-1 吉他前置放大器(1987 年)中出现的硬件问题时将其用作参考。 :)
标签: c emulation z80 opcodes gameboy