Game Boy:什么是“半进位”?
Game Boy Z80 CPU 有一个半进位标志,我似乎找不到太多关于何时设置/清除它的信息。
到目前为止我所理解的是,任何 8 位加法、减法、移位或旋转操作(也许还有其他操作?)将其设置为结果的第 4 位(?),并且 DAA 指令以某种方式设置/使用它。我不确定 16 位指令如何影响它以及它是否受到使用某些寄存器的影响。
The Game Boy Z80 CPU has a half-carry flag, and I can't seem to find much information about when to set/clear it.
What I understand so far is that any 8-bit add, subtract, shift, or rotate operation (and maybe others?) set it to bit 4 of the result(?), and the DAA instruction sets/uses this somehow. What I'm not sure is how 16-bit instructions affect it and whether it's affected or not by the use of certain registers.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
它是从位 3 到位 4 的进位,就像正常进位标志记录从位 7 进位一样。因此,例如要在加法中获取半进位位:
如果应设置半进位,则给出 0x10,否则为 0。从其他相关操作中获得半进位是很自然的事情 - 问题是是否存在从低半字节到高半字节的进位。
从长远来看,z80 有一个 4 位 ALU,通过执行两个 4 位运算来执行 8 位运算。所以它很自然地得到半进位,作为中间结果。
DAA 对标志感兴趣,因为如果设置了半进位,则在低半字节中添加了加起来超过 16 的两个数字;这将正确地在高半字节中产生进位,但会使低半字节 6 低于应有的值,因为在应该生成进位的 10 和它生成进位的 16 之间还有 6 个值。
It's the carry from bit 3 to bit 4, just like the normal carry flag records carry from bit 7. So, e.g. to get the half carry bit in an add:
Which gives 0x10 if half carry should be set, 0 otherwise. Getting half carry from the other relevant ops follows naturally - the questions is whether there was carry from the low nibble to the high.
To put things in perspective, the z80 has a 4bit ALU and performs 8bit ops by doing two 4bit ops. So it gets half carry very naturally, as an intermediate result.
DAA is interested in the flag because if half carry is set then two digits that add up to more than 16 were added in the low nibble; that will have correctly produced carry into the upper nibble but will have left the low nibble 6 lower than it should be, since there were six more values between 10, when it should have generated carry, and 16, when it did.
对于 16 位操作,寄存器高字节中的位 3 到位 4 的进位设置标志。换句话说,位 11 到位 12。
(请注意,上述位标记为 0-15,从最低有效位到最高有效位)
请参见此处:http://www.z80.info/z80code.htm
For 16-bit operations, the carry from bit 3 to bit 4 in the register's high byte sets the flag. In other words, bit 11 to bit 12.
(Note the above bits are labeled 0-15, from least to most significant)
See here: http://www.z80.info/z80code.htm
由于半进位标志是 Game Boy 模拟器制造商最常见的障碍之一,因此我将冒昧地发布一个链接,指向我最近关于该主题的问题作为答案:
Game Boy:半进位标志和16 位指令(尤其是操作码 0xE8)
上述线程的摘要(@gekkio 回答):
Since the half-carry flag is one of the most common stumbling blocks for Game Boy emulator makers, I'll take the liberty to post a link to a recent question of mine regarding the subject as an answer:
Game Boy: Half-carry flag and 16-bit instructions (especially opcode 0xE8)
A summary of the above thread (answer by @gekkio):