Z80 指令寄存器大小

问题描述 投票:0回答:4

我正在编写一个 Z80 模拟器,我对指令寄存器有多大感到困惑。

Z80手册中规定指令长度为1到4字节,我是否可以假设Z80有32位指令寄存器?如果不是那么它如何执行这样的指令?

enter image description here

assembly emulation z80
4个回答
14
投票

没有指令寄存器,并且您不能一次获取整个指令。相反,您可以一块一块地获取它。

让我们看一下您的示例说明:

  • 您的模拟器首先从当前 PC 获取一个字节,然后递增 PC。
  • 它查看字节,即 0xDD,模拟器知道这是“IX 指令前缀”(因为您知道这一点,因此已经对模拟器进行了编程以了解它)。然后,您的模拟器会获取另一个字节以获取实际的操作码。
  • 操作码字节是 0x36,并且您的模拟器 知道以 0xDD 为前缀的 0x36 是
    LD (IX+d),n
    ,编码为
    0xDD 0x36 dd nn
  • 您的模拟器然后获取
    dd
    nn
    字节,将
    nn
    写入
    (IX+dd)
    ,递增周期计数器并继续执行下一条指令。

如果您想编写一个周期精确的仿真器,事情会变得有点复杂,但如果您是仿真的初学者,我不建议您这样做。


2
投票

它只说明指令的长度可以是 1-4 个字节。这不会自动允许关于指令寄存器的假设。它说它是 M 个周期:5。这清楚地表明需要 2 个字节来获取指令(M 个周期 1 和 2)。然后它读取下一个 1 个字节(M Cycle 3),将其添加到 IX 寄存器,然后读取另一个字节(M Cylce 4),然后将其写入计算的地址(M Cycle 5)。


0
投票

指令寄存器确实存在。它是控制单元的一部分,大小为 1 字节。该寄存器保存指令的操作码。对于具有多字节操作码的指令,仅将前缀加载到该寄存器中。

多字节OpCode的剩余部分不加载到指令寄存器中;它在后续周期中被直接获取到解码器。由于解码器被设计为有限状态机(FSM),因此它不需要存储整个操作码——只需要前缀。操作码的其余部分以解码器的内部状态表示。

指令寄存器不与其他寄存器连接,ALU 无法访问,只有解码器与其交互,这使得它对于仿真器来说是可选的。

enter image description here

更多详情请参见“2.3.6.2 解码与执行”部分

https://www.msxarchive.nl/pub/msx/mirrors/msx2.com/zaks/z80prg02.htm


-1
投票

实际上IR寄存器是存在的,但程序员无法访问。查看 Rodnay Zaks 的书《如何对 Z80 进行编程》(第 56 页)。它清楚地解释了如何获取和解码 1 字节指令,但是我仍然不明白如何处理 2 字节、3 字节或 4 字节指令。如果有一个逐步示例来展示如何使用 IR 寄存器处理 2、3 或 4 字节指令,那就太好了。

© www.soinside.com 2019 - 2024. All rights reserved.