【发布时间】:2017-02-07 13:34:41
【问题描述】:
我一直在通过我的 Gameboy 模拟器运行 Blarggs CPU tests,op r,r 测试显示我的 ADC 指令无法正常工作,但 ADD 可以。我的理解是,两者之间的唯一区别是在添加之前将现有的进位标志添加到第二个操作数。因此,我的 ADC 代码如下:
void Emu::add8To8Carry(BYTE &a, BYTE b) //4 cycles - 1 byte
{
if((Flags >> FLAG_CARRY) & 1)
b++;
FLAGCLEAR_N;
halfCarryAdd8_8(a, b); //generates H flag based on addition
carryAdd8_8(a, b); //generates C flag appropriately
a+=b;
if(a == 0)
FLAGSET_Z;
else
FLAGCLEAR_Z;
}
我在测试 ROM 中输入了以下内容:
06 FE 3E 01 88
当设置进位标志时,A 的值为 0 (Flags = B0),否则为 FF (Flags = 00)。就我的理解而言,这就是它应该如何工作。但是,它仍然没有通过测试。
根据我的研究,我认为标志的影响方式与 ADD 相同。从字面上看,我的代码与工作 ADD 指令的唯一变化是在前两行中添加了标志检查/潜在增量,我的测试代码似乎证明了这一点。
我错过了什么吗?也许 ADD/ADC 之间的标志状态有一个特殊性?附带说明一下,SUB 指令也通过了,但 SBC 以同样的方式失败。
谢谢
【问题讨论】: