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 周期的细分:
- M1 周期读取 0xDD 前缀(4 个 T 周期)
- M1 周期读取 0xCB 前缀(4 个 T 周期)
- 内存读取周期以读取位移字节(3 个 T 周期)
- M1 周期获取 0x06 操作码并将 IX 加载到 ALU(5 个 T 周期)
- 从地址 IX+d 计算和读取的内存读取周期(4 个 T 周期)
- 内存写入周期以计算 RLC 并将结果写入地址 IX+d(3 个 T 周期)
(RLC 计算与 M 周期 5 和 6 重叠。)
这些类型指令的独特之处在于它们是唯一具有非连续 M1 周期(上述 M 周期 1、2 和 4)的 Z80 指令。他们也是最慢的!
保罗