10

我再次提出另一个无害的 Z80 问题 :-) 我的仿真器内核当前的结构方式,每次从内存中获取操作码字节时,我都会递增内存刷新寄存器的低 7 位 - 这意味着多字节指令,例如作为开始 DD 或 FD 的那些,我将寄存器增加两次 - 或者在 RLC (IX+d) 等指令的实例中增加三次(因为它的布局是 opcode1-opcode2-d-opcode3)。

它是否正确?我不确定 - Z80 手册对此有点不清楚,因为它说 CPDR(一个两字节指令)将其递增两次,但是“内存刷新寄存器”部分仅表示它在每次指令获取后递增。我注意到 J80(我检查过的一个模拟器,因为我不确定)只在指令的第一个操作码字节之后递增。

哪个是对的?我想这在任何情况下都不是很重要,但很高兴知道:-) 非常感谢。

问候,菲尔·波特

4

4 回答 4

15

Zilog 时序图可以回答您的问题。

在所有 M1(操作码获取)周期的 T3 和 T4 期间发生刷新。

在单操作码指令的情况下,每条指令刷新一次。对于单前缀指令(使用 M1 周期读取前缀),每条指令刷新两次。

对于那些奇怪的 DD-CB-disp-opcode 和 FD-CB-disp-opcode 类型的指令(很奇怪,因为位移字节出现最终操作码之前而不是之后),刷新次数至少为 3 次(对于两个前缀和最终操作码),但我不确定是否将位移字节作为 M1 周期(这将触发另一次刷新)或正常内存读取周期(无刷新)的一部分读取。我倾向于相信这些指令的位移字节是在 M1 周期中读取的,但我不确定。我问过肖恩·杨这件事;他也不确定。有人确定吗?

更新:

我回答了我自己关于那些奇怪的 DD-CB-disp-opcode 和 FD-CB-disp-opcode 指令的问题。如果您查看 Zilog 的这些类型指令的文档,例如 RLC (IX+d),您会注意到该指令需要 6 个 M 周期和 23 个 T 周期,分解为:(4,4,3,5,4 ,3)。

我们知道前两个 M 周期是 M1 周期,用于获取 DD 和 CB 前缀(每个 4 个 T 周期)。下一个 M 周期读取位移字节 d。但是那个 M 循环只使用了 3 个 T 循环,而不是 4 个,所以它不可能是 M1 循环;相反,这是一个正常的内存读取周期。

以下是 RLC (IX+d) 指令的六个 M 周期的细分:

  1. M1 周期读取 0xDD 前缀(4 个 T 周期)
  2. M1 周期读取 0xCB 前缀(4 个 T 周期)
  3. 内存读取周期以读取位移字节(3 个 T 周期)
  4. M1 周期获取 0x06 操作码并将 IX 加载到 ALU(5 个 T 周期)
  5. 从地址 IX+d 计算和读取的内存读取周期(4 个 T 周期)
  6. 内存写入周期以计算 RLC 并将结果写入地址 IX+d(3 个 T 周期)

(RLC 计算与 M 周期 5 和 6 重叠。)

这些类型指令的独特之处在于它们是唯一具有非连续 M1 周期(上述 M 周期 1、2 和 4)的 Z80 指令。他们也是最慢的!

保罗

于 2012-02-19T17:03:40.700 回答
5

Sean Young 的 Z80 Undocumented Features有不同的故事。一次用于无前缀,两次用于单个前缀,两次用于双前缀(仅限 DDCB),一次用于无操作前缀。

块指令当然会在每次运行时影响 R(并且它们运行 BC 次)。

于 2011-12-19T15:50:13.383 回答
1

我现在看到了一些评论,这些奇怪的 DDCB 和 FDCB 指令只会将 R 寄存器增加两次。

我一直假设(以及我实现 Z80 仿真器的方式)R 寄存器在每个M1 周期结束时实现。

回顾一下,这些奇怪的 DDCB 和 FDCB 指令有四个字节长:

DD CB 显示操作码

FD CB 显示操作码

很明显,使用 M1 周期读取两个前缀操作码,导致 R 寄存器在每个周期结束时递增。

同样清楚的是,CB 前缀后面的位移字节由正常的读取周期读取,因此 R 寄存器在该周期结束时不会递增。

这留下了最终的操作码。如果它由 M1 周期读取,则 R 寄存器在周期结束时递增,导致总共 3 次递增,或者在此 M1 周期的 Z80 特殊情况下不递增 R 寄存器。

还有另一种可能。如果最终操作码是通过正常的读取周期读取的,例如它之前的位移字节,而不是通过 M1 周期读取怎么办?当然,这也会导致 R 寄存器对于这些指令只增加两次,并且不需要 Z80 例外,即在每个 M1 周期结束时不增加 R 寄存器。

就 Z80 的内部状态而言,这也可能更有意义。一旦它切换到正常的读取周期以读取指令的附加字节(在这种情况下是 CB 前缀之后的位移字节),它永远不会切换回 M1 周期,直到它开始下一条指令。

任何人都可以在真正的 Z80 硬件上对此进行测试,以按照这些 DDCB 或 FDCB 指令之一确认 R 寄存器的值吗?

于 2013-04-25T18:25:20.027 回答
-2

我可以在网上找到的所有参考资料都说 R 每条指令递增一次,无论其长度如何。

于 2011-12-16T22:23:02.823 回答