Fix DAA
This commit is contained in:
parent
9508244447
commit
a58e599c7a
41
src/cpu.rs
41
src/cpu.rs
@ -1083,38 +1083,39 @@ impl CPU {
|
|||||||
0x26 => self.ld_r_v(REG_N_H),
|
0x26 => self.ld_r_v(REG_N_H),
|
||||||
0x27 => {
|
0x27 => {
|
||||||
// Logic copied from some other emulator
|
// Logic copied from some other emulator
|
||||||
let mut v = self.regs[REG_A] as u16;
|
let a = self.regs[REG_A];
|
||||||
|
|
||||||
if self.debug {
|
if self.debug {
|
||||||
println!("DAA");
|
println!("DAA");
|
||||||
}
|
}
|
||||||
|
|
||||||
if self.flags & FLAG_N == 0 {
|
let mut cor: u8 = 0;
|
||||||
// Lower nibble
|
if (self.flags & FLAG_H) == FLAG_H {
|
||||||
if ((self.flags & FLAG_H) == FLAG_H) || (v & 0xF) > 9 {
|
cor |= 0x06;
|
||||||
v += 0x06;
|
}
|
||||||
}
|
if (self.flags & FLAG_C) == FLAG_C {
|
||||||
|
cor |= 0x60;
|
||||||
|
}
|
||||||
|
|
||||||
// Higher nibble
|
if (self.flags & FLAG_N) == FLAG_N {
|
||||||
if ((self.flags & FLAG_C) == FLAG_C) || v > 0x9F {
|
self.regs[REG_A] = a.wrapping_sub(cor);
|
||||||
v += 0x60;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// Lower nibble
|
if (a & 0x0F) > 0x09 {
|
||||||
if (self.flags & FLAG_H) == FLAG_H {
|
cor |= 0x06;
|
||||||
v = v.wrapping_sub(6) & 0xFF;
|
|
||||||
}
|
}
|
||||||
|
if a > 0x99 {
|
||||||
// Higher nibble
|
cor |= 0x60;
|
||||||
if (self.flags & FLAG_C) == FLAG_C {
|
|
||||||
v = v.wrapping_sub(0x60);
|
|
||||||
}
|
}
|
||||||
|
self.regs[REG_A] = a.wrapping_add(cor);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.clear_flag(FLAG_H);
|
self.clear_flag(FLAG_H);
|
||||||
self.set_clear_flag(FLAG_C, (v & 0x100) == 0x100);
|
if cor & 0x60 == 0x60 {
|
||||||
self.set_clear_flag(FLAG_Z, v as u8 == 0);
|
self.set_flag(FLAG_C);
|
||||||
self.regs[REG_A] = v as u8;
|
}
|
||||||
|
|
||||||
|
let a = self.regs[REG_A];
|
||||||
|
self.set_clear_flag(FLAG_Z, a == 0);
|
||||||
|
|
||||||
4
|
4
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user