【问题标题】:Zilog Z80 OP-Code implementationZilog Z80 OP-Code 实现
【发布时间】: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


【解决方案1】:

正如 cmets 所指出的,您找到的实现将 H 和 L 寄存器一起存储为 16 位实体 HL,然后通过右移将其分解为 H,并通过屏蔽将其分解为 L,这纯粹是一种实现具体的。

最初的 z80 有一个 4 位 ALU(请参阅 Shima 的 cmets,从 this transcript of a Computer History Museum panel 的第 9 页底部开始),因此它实际上将 (i) 与 L 的低四位和累加器;然后 (ii) 与 L 的高四位和累加器。然而,它将其寄存器公开为离散的 8 位实体,因此内部实现完全隐藏。

HL 被称为寄存器对,因为它是两个寄存器一起构成一个 16 位的数量。忽略影子和索引寄存器,原来的 z80 实际上有其中三个——HL、BC 和 DE。 BC 和 DE 作为间接加载(例如操作码 0x1a — LD A,(BC))和 16 位算术(例如,0x09 ADD HL,BC)的替代对存在于 Gameboy 的 CPU 中,并且在 a z80.

SP 和 PC 通常被认为是不可分割的 16 位寄存器(当然,您可以通过将它们存储到内存并单独读取字节来划分它们)并且 AF 存在用于推送和弹出但 F 是如此特殊AF 作为 16 位整数通常不是特别有用的情况。

那么简短的总结:您在理解操作码必须如何实现方面没有问题,只是特定作者如何实现它们。

【讨论】:

  • 事实证明,IX 和 IY 寄存器可以单独字节寻址,使用未记录的操作码。 (将 HL 转换为 IX/IY 的操作码前缀是 0xBD 和 0xFD。)本质上,在任何其他基于寄存器的操作前加上 0xBD 会将对 (HL) 的引用转换为 (IX+n) 形式之一(na 单字节) integer),但它也将对 H 的引用转换为 IX 的高半部分,并将对 L 的引用转换为 IX 的低半部分。对于 IY 和操作码前缀 FD 也是如此。
  • 感谢您添加对 4 位 ALU 的引用! +1
  • 哇,非常感谢汤米!现在我知道的比我预期的还要多:-);并感谢您提供的链接,非常有趣的文档 - 完全值得一读。
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2022-10-16
  • 2019-07-14
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
相关资源
最近更新 更多