【问题标题】:Z80 flags - how to generate?Z80 标志 - 如何生成?
【发布时间】:2012-07-17 00:19:57
【问题描述】:

我正在设计一个Z80 兼容的项目。我负责设计标志寄存器。

我最初认为标志是直接从 ALU 生成的,具体取决于 ALU 操作的输入和类型。

但是在查看指令和标志结果之后,标志似乎并不总是与这个逻辑一致。

因此,我假设我还必须向 ALU 提供操作码,以便每次生成正确的标志。但这似乎会使设计过于复杂。在进行这一巨大的设计步骤之前,我想先上网查询一下。

我说的对吗?还是真的很迷茫,和我最初想的一样简单?

【问题讨论】:

  • 这不清楚。你在写 Z80 emulator 吗?你能举一个不一致的例子吗?

标签: microcontroller flags opcode z80 alu


【解决方案1】:

当然,操作的类型很重要。做加减法时要考虑溢出。比如说,你正在添加或减去 8 位字节:

1+5=6 - 没有溢出

255+7=6 - 溢出

1-5=252 - 溢出

200-100=100 - 没有溢出

200+100=44 - 溢出

100-56=44 - 没有溢出

显然,这里的进位标志的状态不仅取决于输入字节或结果字节值,还取决于操作。并且表示无符号溢出。

逻辑非常一致。如果不是,是时候阅读文档了解官方逻辑了。

您可能对this question 感兴趣。

【讨论】:

    【解决方案2】:

    您的代码是为 CP/M 操作系统编写的。 I/O 是通过 BDOS(基本光盘操作系统)接口完成的。基本上,您在 C 寄存器中加载操作代码,在其他寄存器中加载任何附加参数,然后调用位置 0x5。功能代码 C=2 是将 E 寄存器中的一个字符写入控制台(=屏幕)。您可以在第 1200 行看到这一点:

        ld  e,a
        ld  c,2
        call    bdos
        pop hl
        pop de
        pop bc
        pop af
        ret
     bdos   push    af
        push    bc
        push    de
        push    hl
        call    5
        pop hl
        pop de
        pop bc
        pop af
        ret 
    

    有关 BDOS 调用的参考,请尝试 here。 要模拟这一点,您需要捕获对地址 5 的调用,并使用您可用的任何工具来实现它们。

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2019-11-20
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      相关资源
      最近更新 更多