diff --git a/src/cpu.rs b/src/cpu.rs index 4836448..e9bfece 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -971,6 +971,22 @@ impl CPU { self.registers.set_flag(FlagRegister::Substract, false); self.registers.set_flag(FlagRegister::HalfCarry, false); }, + Opcode::SWAP(register) => { + let mut val = 0; + match register.is_8bit() { + true => val = self.registers.get_8bit(register), + false => val = bus.read(self.registers.get(register)), + }; + let val = (val << 4) | (val >> 4); + match register.is_8bit() { + true => self.registers.set(register, val as u16), + false => bus.write(self.registers.get(register), val), + }; + self.registers.set_flag(FlagRegister::Zero, val == 0); + self.registers.set_flag(FlagRegister::Carry, false); + self.registers.set_flag(FlagRegister::Substract, false); + self.registers.set_flag(FlagRegister::HalfCarry, false); + }, _ => {}, }; }, @@ -2814,6 +2830,44 @@ mod tests { assert_eq!(cpu.registers.get(Register::PC), 0x102); } + #[test] + fn test_prefix_cb_swap_instruction() { + let mut bus = Bus::new(); + let mut cpu = CPU::new(); + cpu.registers.set(Register::A, 0b11110101); + cpu.exec(Opcode::PrefixCB(Box::new(Opcode::SWAP(Register::A))), &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), false); + assert_eq!(cpu.registers.get_flag(FlagRegister::Carry), false); + assert_eq!(cpu.registers.get(Register::A), 0b01011111); + assert_eq!(cpu.registers.get(Register::PC), 0x102); + + let mut bus = Bus::new(); + let mut cpu = CPU::new(); + cpu.registers.set(Register::A, 0b00000000); + cpu.exec(Opcode::PrefixCB(Box::new(Opcode::SWAP(Register::A))), &mut bus); + assert_eq!(cpu.registers.get_flag(FlagRegister::Zero), true); + 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); + assert_eq!(cpu.registers.get(Register::A), 0b00000000); + assert_eq!(cpu.registers.get(Register::PC), 0x102); + + let mut bus = Bus::new(); + let mut cpu = CPU::new(); + let addr = 0xC000; + cpu.registers.set(Register::HL, addr); + bus.write(addr, 0b11110101); + cpu.exec(Opcode::PrefixCB(Box::new(Opcode::SWAP(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), false); + assert_eq!(cpu.registers.get_flag(FlagRegister::Carry), false); + assert_eq!(bus.read(addr), 0b01011111); + assert_eq!(cpu.registers.get(Register::PC), 0x102); + } + #[test] fn test_daa_instruction() { let mut bus = Bus::new();