diff --git a/cpu/decoder.cpp b/cpu/decoder.cpp index 36aa25b..4e8ac9e 100644 --- a/cpu/decoder.cpp +++ b/cpu/decoder.cpp @@ -427,7 +427,21 @@ void Cpu::executeInstruction() state.halfcarry = false; break; - // TODO: case 0x27: break; // DAA + case 0x27: // DAA + { + u16 corr = 0; + if (state.halfcarry || ((state.A & 0x0F) > 0x9)) + corr |= 0x06; + if ((state.A & 0xF0) > 0x90) + corr |= 0x06; + + u32 res16 = (u16)state.A + (state.subtract ? (-corr) : corr); + state.A = (u8)res16; + state.halfcarry = false; + state.zero = (state.A == 0); + state.carry = (res16 & 0x100); + } + break; case 0x2F: // CPL Complement accumulator state.A = ~state.A;