抱歉让我成为我的第二个Z80 DAA问题 - 我现在已经实现了这个指令,但有一点我不确定 - 这个指令设置的H标志是什么? Z80手册中说“看到指令”,但它只在DAA之前提到了标志,而不是在执行之后。
我按如下方式设置标志:
如果结果为负,则设置S(0x80&结果等于0x80) 如果结果为零,则设置Z. H(不确定这个问题) P / V设置为结果的奇偶校验(如果是偶数则为1,如果为奇数则为0) N独自留下 如果原始累加器值的高半字节被修改,则设置C
除此之外,该指示似乎按照我的预期执行:-)我希望有人可以为我清除这一点,非常感谢。
答案 0 :(得分:2)
这是一个很好的问题。是的,H flag的行为没有明确记录,因为DAA
的行为是非标准的。
如果A的低半字节(最低有效4位)是非基数10(大于9,如A,B,C,D,E或F)或 H标志被设置,6被添加到寄存器中。这意味着即使较低的半字节在0-9范围内,您也可以通过设置H标志强制将6添加到A寄存器。
当谈到你的问题时,H标志通常在我的经验中保持不变,但你不能依赖它,因为据说“效果是非标准的”,这意味着H标志可能会改变或者可能不会根据情况而改变。在这种情况下,即使您在测试中看到H标志没有受到影响,也应该始终认为H标志在执行后受DAA
指令的影响。
答案 1 :(得分:2)
我只能找到here DAA修改了半进位/借位标志。
我建议将此标志设置为与x86 CPU上的DAA和DAS指令设置的AF(辅助进位)标志完全相同。我认为没有理由说i8080 / i8085 / Z80和i8086的DAA / DAS之间的操作有任何不同。
如果将累加器的最低4位调整为6,则x86 DAA / DAS将AF设置为1.如果不调整它,则将AF重置为0.
在英特尔(或AMD的)x86 CPU手册中查看DAA和DAS的伪代码。