Я запускал тесты процессора Blarggs через эмулятор Gameboy, и тест 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;
}
Я ввел следующее в тестовое ПЗУ:
06 FE 3E 01 88
Что оставляет A со значением 0 (Flags = B0), когда флаг переноса установлен, и FF (Flags = 00), когда он не установлен. Вот как это должно работать, насколько я понимаю. Тем не менее, он все еще не проходит тест.
Исходя из моего исследования, я считаю, что на флаги влияет то же самое, что и на ADD. Буквально единственным изменением в моем коде по сравнению с рабочей инструкцией ADD является добавление флага проверки/потенциального приращения в первых двух строках, что, похоже, подтверждает мой тестовый код.
Я что-то упускаю? Возможно, есть особенность с состояниями флагов между ADD/ADC? В качестве примечания, инструкции SUB также проходят, но SBC не выполняется точно так же.
Спасибо