From ff9fd481907a58e1070b4dfb67f2fe65d3cfceb3 Mon Sep 17 00:00:00 2001 From: Franco Colmenarez Date: Tue, 19 Oct 2021 10:33:43 -0500 Subject: [PATCH] SCF instruction --- src/cpu.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/cpu.rs b/src/cpu.rs index 266fa75..ad5db8e 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -1038,6 +1038,13 @@ impl CPU { self.registers.set_flag(FlagRegister::Substract, false); self.registers.set_flag(FlagRegister::HalfCarry, false); }, + // Set the carry flag + Opcode::SCF => { + self.registers.increment(Register::PC, 1); + self.registers.set_flag(FlagRegister::Carry, true); + self.registers.set_flag(FlagRegister::Substract, false); + self.registers.set_flag(FlagRegister::HalfCarry, false); + }, // Disable interrupts Opcode::DI => { self.registers.increment(Register::PC, 1); @@ -3024,6 +3031,31 @@ mod tests { assert_eq!(cpu.registers.get_flag(FlagRegister::Substract), false); assert_eq!(cpu.registers.get_flag(FlagRegister::HalfCarry), false); assert_eq!(cpu.registers.get_flag(FlagRegister::Carry), true); + + let mut cpu = CPU::new(); + let mut bus = Bus::new(); + cpu.registers.set_flag(FlagRegister::Substract, true); + cpu.registers.set_flag(FlagRegister::HalfCarry, true); + cpu.registers.set_flag(FlagRegister::Carry, true); + cpu.exec(Opcode::CCF, &mut bus); + assert_eq!(cpu.registers.get(Register::PC), 0x101); + assert_eq!(cpu.registers.get_flag(FlagRegister::Substract), false); + assert_eq!(cpu.registers.get_flag(FlagRegister::HalfCarry), false); + assert_eq!(cpu.registers.get_flag(FlagRegister::Carry), false); + } + + #[test] + fn test_scf_instructions() { + let mut cpu = CPU::new(); + let mut bus = Bus::new(); + cpu.registers.set_flag(FlagRegister::Substract, true); + cpu.registers.set_flag(FlagRegister::HalfCarry, true); + cpu.registers.set_flag(FlagRegister::Carry, false); + cpu.exec(Opcode::SCF, &mut bus); + assert_eq!(cpu.registers.get(Register::PC), 0x101); + assert_eq!(cpu.registers.get_flag(FlagRegister::Substract), false); + assert_eq!(cpu.registers.get_flag(FlagRegister::HalfCarry), false); + assert_eq!(cpu.registers.get_flag(FlagRegister::Carry), true); } #[test]