Math DAA指令中的半进位/半借用标志

Math DAA指令中的半进位/半借用标志,math,flags,z80,Math,Flags,Z80,很抱歉,让这成为我的第二个Z80 DAA问题-我现在几乎已经实现了这个指令,但有一件事我不确定-这个指令是否设置了H标志?Z80手册上说“请参阅说明”,但它只在DAA之前提到该标志,而不是在执行后提到该标志 我将旗帜设置如下: 如果结果为负(0x80&结果等于0x80),则设置S 如果结果为零,则设置Z H(不确定,因此该问题) P/V设置为结果的奇偶性(1为偶数,0为奇数) N被单独留下 如果修改了原始累加器值的较高半字节,则设置C 除此之外,该指令的执行似乎与我预期的一样:-)我希望有人能为

很抱歉,让这成为我的第二个Z80 DAA问题-我现在几乎已经实现了这个指令,但有一件事我不确定-这个指令是否设置了H标志?Z80手册上说“请参阅说明”,但它只在DAA之前提到该标志,而不是在执行后提到该标志

我将旗帜设置如下:

如果结果为负(0x80&结果等于0x80),则设置S 如果结果为零,则设置Z H(不确定,因此该问题) P/V设置为结果的奇偶性(1为偶数,0为奇数) N被单独留下 如果修改了原始累加器值的较高半字节,则设置C


除此之外,该指令的执行似乎与我预期的一样:-)我希望有人能为我澄清这一点,非常感谢。

这是一个好问题。是的,H flag的行为没有明确记录,因为它的行为是非标准的
DAA

如果A的下半字节(最低有效四位)是非十进制数字(大于9,如A、B、C、D、E或F)H标志被设置,则将6添加到寄存器中。这意味着,即使下半字节在0-9范围内,也可以通过设置H标志强制向寄存器添加6

当涉及到你的问题时,根据我的经验,H标志通常保持不变,但你不能依赖于此,因为据说“效果是非标准的”,这意味着H标志可能会改变,也可能不会改变,这取决于情况。在这种情况下,即使您在测试中看到H标志不受影响,您也应该始终认为H标志在执行后受到
DAA
指令的影响。

我只能发现半进位/借用标志是由DAA修改的

我建议将此标志设置为与x86 CPU上的DAA和DAS指令设置的AF(辅助进位)标志完全相同。我看不出为什么i8080/i8085/Z80和i8086的DAA/DAS之间的操作会有任何差异

如果x86 DAA/DAS将累加器的最低4位调整6,则将AF设置为1。如果不进行调整,则将AF重置为0


请参阅英特尔(或AMD)x86 CPU手册中DAA和DAS的伪代码。

正如您所知,Z80 CPU没有DAS指令。Z80的DAA指令将i8086的DAA和DAS指令合并为一条指令,这意味着它在某些方面与i8086的DAA不同。您说过:“我看不出为什么i8080/i8085/Z80和i8086的DAA/DAS之间的操作会有任何差异。”。我的评论是针对那句话的。检查x86的等效指令对解释Z80的H Flag奇怪行为没有多大帮助。这看起来像是逻辑行为,尽管Z80手册中没有提到——这让我有点困扰:-(@EmirAkaydın:这种差异被认为是可以理解的。@PhilPotter1987:Z80和x86文档都没有建议在DAA/DAS执行后,以一些有意义的方式使用H/AF,它们没有提供这种用法的示例。我认为很多人认为在DAA/DAS之后H/AF没有用处。也许没有。如果你想确定,请参阅其他文档了解Z80和兼容的CPU,如i8080和i8085。也许它们能更好地解释DAA。或者……找一个有Z80电脑的人(例如ZX频谱)并要求他们运行DAA测试。感谢这一点-我很清楚低半字节计算使用H标志的原因,只是不确定这之后发生了什么-我认为,由于C标志是在高半字节被修改时设置的,如果低半字节被修改,H标志可能会被设置-这将与另一个Z80M的行为保持一致无神论的指导,虽然手册根本没有说明这一点,所以我不会假设它。