【问题标题】:Game Boy: What constitutes a "half-carry"?Game Boy:什么是“半进位”?
【发布时间】:2012-01-15 08:18:31
【问题描述】:

Game Boy Z80 CPU 有一个半进位标志,我似乎找不到太多关于何时设置/清除它的信息。

到目前为止,我所了解的是,任何 8 位加、减、移位或循环操作(可能还有其他操作?)将其设置为结果的第 4 位(?),并且 DAA 指令以某种方式设置/使用它.我不确定 16 位指令如何影响它,以及它是否受到使用某些寄存器的影响。

【问题讨论】:

  • 呃,不是电子问题吗?
  • 我在写模拟器,所以我不这么认为...
  • 我强烈建议任何与半进位标志苦苦挣扎的人阅读this线程以获取更多详细信息。
  • 阅读 Z80 参考手册。记录了每条指令对每个标志的影响。

标签: emulation z80 gameboy


【解决方案1】:

这是从第 3 位到第 4 位的进位,就像正常的进位标志记录从第 7 位进位一样。所以,例如在加法中获得半进位:

((a&0xf) + (value&0xf))&0x10

如果应该设置半进位,则为 0x10,否则为 0。自然而然地从其他相关操作中获得一半进位 - 问题是是否有从低位到高位的进位。

从长远来看,z80 有一个 4 位 ALU,并通过执行两个 4 位运算来执行 8 位运算。所以它很自然地得到了半进位,作为一个中间结果。

DAA 对标志感兴趣,因为如果设置了半进位,则在低半字节中添加两个加起来超过 16 的数字;这将正确地产生进位到上半字节,但会使低半字节 6 低于应有的水平,因为在应该产生进位的 10 和应该产生进位的 16 之间还有六个值。

【讨论】:

  • 好的,但是 16 位操作呢?半进位是高字节还是低字节?
  • 高字节;这是最近的半进位。你可能已经找到了,但我发现datasheets.chipdb.org/Zilog/Z80/z80-documented-0.90.pdf 对 DAA 有很好的描述,并解释了在 CCF 等边缘情况下半进位的来源(如果有记忆,它被设置为旧进位)。
  • 要添加的一件事让我很清楚:添加例如 0x37 和 0x44 不会导致半进位,因为您只查看每个字节的低 4 位,将它们加在一起,然后看看是否溢出。 0x0F + 0x01 有,0x37 + 0x44 没有。
  • GBZ80(又名 SM83)有一个 8 位 ALU。
【解决方案2】:

对于 16 位操作,寄存器高字节中从位 3 到位 4 的进位设置标志。也就是说,从第 11 位到第 12 位。

(注意上面的位被标记为 0-15,从最低到最高)

请看这里:http://www.z80.info/z80code.htm

16 bit arithmetic

If  you want to add numbers that are more than the 0-255 that can
be stored in the A register,  then the HL, IX or IY registers can
be used. Thus LD HL,1000H:LD BC,2000H:ADD HL,BC will give

A  CZPSNH  BC   DE   HL   IX   IY  A' CZPSNH' BC'  DE'  HL'  SP
00 000000 2000 0000 3000 0000 0000 00 000000 0000 0000 0000 0000

The flags are set as follows.

C or carry flag          1 if answer >65535 else 0
Z or zero flag           not changed
P flag                   not changed
S or sign flag           not changed
N flag                   0
H or half carry flag     1 if carry from bit 11 to bit 12 else 0

【讨论】:

    【解决方案3】:

    由于半进旗是 Game Boy 模拟器制造商最常见的绊脚石之一,我将冒昧地发布一个链接,指向我最近关于该主题的一个问题作为答案:

    Game Boy: Half-carry flag and 16-bit instructions (especially opcode 0xE8)


    上述话题的总结(@gekkio 的回答):

    这取决于指令,但是如果您从 8 位值的角度来考虑,标志总是基于相同的位位置更新......无论我们谈论的是高字节还是低字节,它都会有所不同16 位值。第 11 位只是高字节的第 3 位。

    • ADD SP, e: H 来自第 3 位,C 来自第 7 位(来自低字节操作的标志)
    • LD HL, SP+e: H 来自第 3 位,C 来自第 7 位(来自低字节操作的标志)
    • ADD HL, rr: H 来自第 11 位,C 来自第 15 位(来自高字节操作的标志)
    • INC rr: 没有标志更新(由 16 位 inc/dec 单元执行)
    • DEC rr: 没有标志更新(由 16 位 inc/dec 单元执行)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2020-08-23
      相关资源
      最近更新 更多