我正在编写一个 Z80 仿真器,并且一直试图理解十进制调整指令对某些操作数的作用。这些操作码在真正的 Z80 上的结果(在寄存器 A 和 F 中)是什么?
LD A,1h
ADD A,99h
DAA
我的代码目前在 A 寄存器中以 0xA0 完成,并且设置了半进位和溢出位。但它应该返回 0 吗?
后:
LD A, 1h
ADD A, 99h
A
应包含 9Ah。进位、半进位和溢出都应该被重置,因为从位 3 到位 4 或从位 7 没有进位,并且在有符号的解释中,您在负数中添加了正数,因此溢出是不可能的。
然后执行DAA
时,处理器将发现低半字节的值大于 0x9。因此,它将决定添加 0x6 以从低位创建合适的十进制进位。
鉴于它将向低半字节添加 0x9,它将检查它是否会期望高半字节创建小数进位。测试高半字节是否大于0x8。这是。所以 DAA 也将决定将 0x6 添加到高半字节。
所以总体而言,DAA 将决定添加 0x66。
(0x9a + 0x66) MOD 0x100 = 0x00
所以剩下的结果A
将是0x00。
DAA 决定将 0x6 添加到顶部半字节。所以现在将设置进位。
DAA 还决定将 0x6 添加到底部半字节。所以半进位也将被设置。
符号、零等将根据 0x00 结果设置。
如果我不得不猜测,看起来您的代码发现低半字节不正确并计划创建半进位。但是它无法检查是否会因此使最高四位不正确(即,它是否为 0x8 或更大),并且也未能计划创建最高四位进位。
仅在 A 寄存器中留下两个 BCD 位字节结果的 ADD 指令后执行 DAA。
ADD 操作符应该由两个压缩的 BCD 数字组成。DAA 指令调整 A 寄存器以包含正确的两位压缩十进制结果,溢出、进位和零标志也受到影响。如果结果(在 DAA 执行之后)大于 99,则在 DAA 之后设置进位标志。
x86 CPU 还支持非常接近 Z80 DAA 指令的 DAA 指令,因此如果您在 x86 平台上工作,您可以在仿真中使用它。