GBZ80:什么构成“半携带”?

时间:2012-01-15 08:18:32

标签: emulation z80 gameboy

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

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

3 个答案:

答案 0 :(得分:28)

这是从第3位到第4位的进位,就像正常进位标志记录从第7位进位一样。在add中获取半进位:

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

如果应该设置一半进位,则给出0x10,否则为0。从其他相关操作中得到一半自然跟随 - 问题在于是否存在从低半字节到高位的进位。

为了正确看待,z80有一个4位ALU,通过两个4位操作执行8位操作。所以它很自然地得到一半,作为中间结果。

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

答案 1 :(得分:9)

对于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

答案 2 :(得分:0)

由于半高举标志是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单元执行)