我正在设计一个Z80兼容项目。我负责设计标志寄存器。
我最初认为标志是直接从 ALU 生成的,具体取决于 ALU 操作的输入和类型。
但是在查看指令和标志结果之后,标志似乎并不总是与这个逻辑一致。
因此,我假设我还必须向 ALU 提供操作码,以便每次都生成正确的标志。但这似乎会使设计过于复杂。在进行这个巨大的设计步骤之前,我想在互联网上进行检查。
我对么?或者只是真的很困惑,它和我最初想的一样简单?
当然,操作的类型很重要。做加法和减法时考虑溢出。比如说,您正在添加或减去 8 位字节:
1+5=6 - 没有溢出
255+7=6 - 溢出
1-5=252 - 溢出
200-100=100 - 没有溢出
200+100=44 - 溢出
100-56=44 - 没有溢出
显然,此处进位标志的状态不仅取决于输入字节或结果字节值,还取决于操作。它表示无符号溢出。
逻辑非常一致。如果不是,是时候阅读文档来学习官方逻辑了。
您可能对这个问题感兴趣。
您的代码是为 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 调用的参考,请在此处尝试。要模拟这一点,您需要捕获对地址 5 的调用,并使用您可用的任何工具来实现它们。