From a58e599c7a2971bf579dfd7a26796845ed6ad276 Mon Sep 17 00:00:00 2001 From: Kevin Hamacher Date: Thu, 2 Jun 2016 13:49:21 +0200 Subject: [PATCH] Fix DAA --- src/cpu.rs | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/src/cpu.rs b/src/cpu.rs index a8e8d14..5b5ceb8 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -1083,38 +1083,39 @@ impl CPU { 0x26 => self.ld_r_v(REG_N_H), 0x27 => { // Logic copied from some other emulator - let mut v = self.regs[REG_A] as u16; + let a = self.regs[REG_A]; if self.debug { println!("DAA"); } - if self.flags & FLAG_N == 0 { - // Lower nibble - if ((self.flags & FLAG_H) == FLAG_H) || (v & 0xF) > 9 { - v += 0x06; - } + let mut cor: u8 = 0; + if (self.flags & FLAG_H) == FLAG_H { + cor |= 0x06; + } + if (self.flags & FLAG_C) == FLAG_C { + cor |= 0x60; + } - // Higher nibble - if ((self.flags & FLAG_C) == FLAG_C) || v > 0x9F { - v += 0x60; - } + if (self.flags & FLAG_N) == FLAG_N { + self.regs[REG_A] = a.wrapping_sub(cor); } else { - // Lower nibble - if (self.flags & FLAG_H) == FLAG_H { - v = v.wrapping_sub(6) & 0xFF; + if (a & 0x0F) > 0x09 { + cor |= 0x06; } - - // Higher nibble - if (self.flags & FLAG_C) == FLAG_C { - v = v.wrapping_sub(0x60); + if a > 0x99 { + cor |= 0x60; } + self.regs[REG_A] = a.wrapping_add(cor); } self.clear_flag(FLAG_H); - self.set_clear_flag(FLAG_C, (v & 0x100) == 0x100); - self.set_clear_flag(FLAG_Z, v as u8 == 0); - self.regs[REG_A] = v as u8; + if cor & 0x60 == 0x60 { + self.set_flag(FLAG_C); + } + + let a = self.regs[REG_A]; + self.set_clear_flag(FLAG_Z, a == 0); 4 },