Game Boy:什么构成“半扛式”?

问题描述 投票:37回答:3

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

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

emulation z80 gameboy
3个回答
31
投票

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

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

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

为清楚起见,z80具有4位ALU,并通过执行两个4位运算来执行8位运算。因此,它非常自然地得到一半的进位,这是一个中间结果。

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


10
投票

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

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单元执行)
© www.soinside.com 2019 - 2024. All rights reserved.