Game Boy Z80 CPU 有一个半进位标志,我似乎找不到太多关于何时设置/清除它的信息。
到目前为止我所理解的是,任何 8 位加、减、移位或旋转操作(可能还有其他操作?)将其设置为结果的第 4 位(?),并且 DAA 指令以某种方式设置/使用它。我不确定 16 位指令如何影响它以及它是否受到某些寄存器的使用的影响。
最佳答案
它是从第 3 位到第 4 位的进位,就像正常的进位标志记录从第 7 位进位一样。所以,例如在加法中获得半进位:
((a&0xf) + (value&0xf))&0x10
如果应设置半进位,则为 0x10,否则为 0。自然而然地从其他相关操作中获得一半进位——问题是从低位到高位是否有进位。
从正确的角度来看,z80 有一个 4 位 ALU,并通过执行两个 4 位操作来执行 8 位操作。所以它很自然地得到一半进位,作为中间结果。
DAA 对该标志感兴趣,因为如果设置了半进位,那么在低半字节中添加了加起来超过 16 的两位数字;这将正确地产生进位到高半字节,但会使低半字节 6 比它应该产生的低,因为在 10 之间还有六个值,当它应该产生进位时,16,当它产生时。
关于emulation - 游戏男孩 : What constitutes a "half-carry"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8868396/