我正在编写一个 Z80 模拟器,我对指令寄存器有多大感到困惑。
Z80手册中规定指令长度为1到4字节,我是否可以假设Z80有32位指令寄存器?如果不是那么它如何执行这样的指令?
没有指令寄存器,并且您不能一次获取整个指令。相反,您可以一块一块地获取它。
让我们看一下您的示例说明:
LD (IX+d),n
,编码为 0xDD 0x36 dd nn
。dd
和 nn
字节,将 nn
写入 (IX+dd)
,递增周期计数器并继续执行下一条指令。如果您想编写一个周期精确的仿真器,事情会变得有点复杂,但如果您是仿真的初学者,我不建议您这样做。
它只说明指令的长度可以是 1-4 个字节。这不会自动允许关于指令寄存器的假设。它说它是 M 个周期:5。这清楚地表明需要 2 个字节来获取指令(M 个周期 1 和 2)。然后它读取下一个 1 个字节(M Cycle 3),将其添加到 IX 寄存器,然后读取另一个字节(M Cylce 4),然后将其写入计算的地址(M Cycle 5)。
指令寄存器确实存在。它是控制单元的一部分,大小为 1 字节。该寄存器保存指令的操作码。对于具有多字节操作码的指令,仅将前缀加载到该寄存器中。
多字节OpCode的剩余部分不加载到指令寄存器中;它在后续周期中被直接获取到解码器。由于解码器被设计为有限状态机(FSM),因此它不需要存储整个操作码——只需要前缀。操作码的其余部分以解码器的内部状态表示。
指令寄存器不与其他寄存器连接,ALU 无法访问,只有解码器与其交互,这使得它对于仿真器来说是可选的。
更多详情请参见“2.3.6.2 解码与执行”部分
https://www.msxarchive.nl/pub/msx/mirrors/msx2.com/zaks/z80prg02.htm
实际上IR寄存器是存在的,但程序员无法访问。查看 Rodnay Zaks 的书《如何对 Z80 进行编程》(第 56 页)。它清楚地解释了如何获取和解码 1 字节指令,但是我仍然不明白如何处理 2 字节、3 字节或 4 字节指令。如果有一个逐步示例来展示如何使用 IR 寄存器处理 2、3 或 4 字节指令,那就太好了。