diff --git a/src/cpu.rs b/src/cpu.rs index eaa6e78..034cc39 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -639,37 +639,45 @@ impl CPU { }, // Increment by 1 Opcode::INC(affect_flags, register) => { - let prev_value = self.registers.get(register); - self.registers.increment(register, 1); + self.registers.increment(Register::PC, 1); + let mut prev_value = 0; + let mut result = 0; + if register.is_8bit() { + prev_value = self.registers.get_8bit(register); + self.registers.increment(register, 1); + result = self.registers.get_8bit(register); + } else { + let addr = self.registers.get(register); + prev_value = bus.read(addr); + bus.write(addr, prev_value + 1); + result = bus.read(addr); + } if affect_flags { self.registers.set_flag(FlagRegister::Substract, false); - let mut byte_compare = 0; - match register.is_8bit() { - true => byte_compare = prev_value.to_be_bytes()[1], - false => byte_compare = prev_value.to_be_bytes()[0], - } - self.registers.set_flag(FlagRegister::HalfCarry, add_half_carry(byte_compare, 1)); - let result = self.registers.get(register); + self.registers.set_flag(FlagRegister::HalfCarry, add_half_carry(prev_value, 1)); self.registers.set_flag(FlagRegister::Zero, result == 0); } - self.registers.increment(Register::PC, 1); }, // Decrement by 1 Opcode::DEC(affect_flags, register) => { - let prev_value = self.registers.get(register); - self.registers.decrement(register, 1); + self.registers.increment(Register::PC, 1); + let mut prev_value = 0; + let mut result = 0; + if register.is_8bit() { + prev_value = self.registers.get_8bit(register); + self.registers.decrement(register, 1); + result = self.registers.get_8bit(register); + } else { + let addr = self.registers.get(register); + prev_value = bus.read(addr); + bus.write(addr, prev_value - 1); + result = bus.read(addr); + } if affect_flags { self.registers.set_flag(FlagRegister::Substract, true); - let mut byte_compare = 0; - match register.is_8bit() { - true => byte_compare = prev_value.to_be_bytes()[1], - false => byte_compare = prev_value.to_be_bytes()[0], - } - self.registers.set_flag(FlagRegister::HalfCarry, sub_half_carry(byte_compare, 1)); - let result = self.registers.get(register); + self.registers.set_flag(FlagRegister::HalfCarry, sub_half_carry(prev_value, 1)); self.registers.set_flag(FlagRegister::Zero, result == 0); } - self.registers.increment(Register::PC, 1); }, // Jump to address Opcode::JP(params) => match params { @@ -2335,12 +2343,14 @@ mod tests { assert_eq!(cpu.registers.get_flag(FlagRegister::HalfCarry), true); assert_eq!(cpu.registers.get(Register::PC), 0x101); let mut cpu = CPU::new(); - cpu.registers.set(Register::HL, 0b0000111111111111); + let addr = 0xC000; + cpu.registers.set(Register::HL, addr); + bus.write(addr, 0b00001111); cpu.exec(Opcode::INC(true, Register::HL), &mut bus); assert_eq!(cpu.registers.get_flag(FlagRegister::Zero), false); assert_eq!(cpu.registers.get_flag(FlagRegister::Substract), false); assert_eq!(cpu.registers.get_flag(FlagRegister::HalfCarry), true); - assert_eq!(cpu.registers.get(Register::HL), 0b0001000000000000); + assert_eq!(bus.read(addr), 0b00010000); assert_eq!(cpu.registers.get(Register::PC), 0x101); } @@ -2364,12 +2374,14 @@ mod tests { assert_eq!(cpu.registers.get(Register::A), 0b00001111); assert_eq!(cpu.registers.get(Register::PC), 0x101); let mut cpu = CPU::new(); - cpu.registers.set(Register::HL, 0b0001000000000000); + let addr = 0xC000; + cpu.registers.set(Register::HL, addr); + bus.write(addr, 0b00010000); cpu.exec(Opcode::DEC(true, Register::HL), &mut bus); assert_eq!(cpu.registers.get_flag(FlagRegister::Zero), false); assert_eq!(cpu.registers.get_flag(FlagRegister::Substract), true); assert_eq!(cpu.registers.get_flag(FlagRegister::HalfCarry), true); - assert_eq!(cpu.registers.get(Register::HL), 0b0000111111111111); + assert_eq!(bus.read(addr), 0b00001111); assert_eq!(cpu.registers.get(Register::PC), 0x101); }