【问题标题】:Z80 Instruction Register SizeZ80 指令寄存器大小
【发布时间】:2013-10-11 14:06:15
【问题描述】:

我正在编写一个 Z80 仿真器,我对指令寄存器的大小感到困惑。

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

【问题讨论】:

  • 没有“注册”指令。 CPU 获取操作码字节(在某些情况下是前缀),然后根据已解码操作码获取操作数。
  • 操作码字节是什么意思?那不是图片中Operands列表下的第一行/第二行吗?

标签: assembly emulation z80


【解决方案1】:

没有指令寄存器,您不会一次获取整个指令。取而代之的是,您逐个获取它。

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

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

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

【讨论】:

  • 我认为OP想知道Z80内部的物理指令寄存器。您描述的是软件仿真提供的抽象。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这里的错误太多了。 “IR寄存器存在”,但与“指令寄存器”无关。它们是 2 个独立的寄存器,每个都有一个独特的功能,与“指令”无关(I 代表中断,R 代表刷新)。 “不可访问”,不正确:LD A,RLD A,I 用于读取,反之用于写入。 “.. 使用 IR 寄存器” - 完全错误。
    • @Jongware,我不敢苟同,如果你读过 Rodnay Zaks 的书,他清楚地指出 IR(指令寄存器)确实是 Z80 内部的物理寄存器,它是不同的来自 I 和 R 寄存器(一个处理中断,另一个处理内存刷新)。 IR 寄存器对程序员是隐藏的,但它用于存储获取的操作码。
    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多