Some refactors

This commit is contained in:
Franco Colmenarez 2021-10-14 16:13:28 -05:00
parent a5fad87319
commit d26b77dc78

View File

@ -265,10 +265,10 @@ pub enum CpuOpcode {
JP(OpcodeParameter), JP(OpcodeParameter),
JR(OpcodeParameter), JR(OpcodeParameter),
CALL(OpcodeParameter), CALL(OpcodeParameter),
RST(u16), RST(u8),
RET(OpcodeParameter), RET(OpcodeParameter),
RETI, RETI,
PREFIX_CB, PrefixCB,
IllegalInstruction, IllegalInstruction,
} }
@ -329,6 +329,12 @@ impl CPU {
OpcodeParameter::U16(address) => self.registers.set(&Register::PC(address)), OpcodeParameter::U16(address) => self.registers.set(&Register::PC(address)),
_ => {}, _ => {},
}, },
CpuOpcode::CALL(params) => match params {
OpcodeParameter::U16(address) => {
self.registers.set(&Register::PC(address));
},
_ => {},
},
// Rotate A Left // Rotate A Left
CpuOpcode::RLCA => { CpuOpcode::RLCA => {
let val = self.registers.get(&Register::A(0)).to_be_bytes()[1]; let val = self.registers.get(&Register::A(0)).to_be_bytes()[1];
@ -336,7 +342,15 @@ impl CPU {
if get_bit(result, BitIndex::I7) { if get_bit(result, BitIndex::I7) {
self.registers.set_flag(&FlagRegister::Carry(true)); self.registers.set_flag(&FlagRegister::Carry(true));
} }
self.registers.set(&Register::A(result)); self.registers.increment_pc(1);
},
// Rotate A Right
CpuOpcode::RRCA => {
let val = self.registers.get(&Register::A(0)).to_be_bytes()[1];
let result = val.rotate_right(7);
if get_bit(result, BitIndex::I0) {
self.registers.set_flag(&FlagRegister::Carry(true));
}
self.registers.increment_pc(1); self.registers.increment_pc(1);
}, },
// Disable interrupts // Disable interrupts
@ -570,7 +584,7 @@ impl CPU {
0x07 => CpuOpcode::RLCA, 0x07 => CpuOpcode::RLCA,
0x0F => CpuOpcode::RRCA, 0x0F => CpuOpcode::RRCA,
0x1F => CpuOpcode::RRA, 0x1F => CpuOpcode::RRA,
0xCB => CpuOpcode::PREFIX_CB, 0xCB => CpuOpcode::PrefixCB,
//0xCB => CpuOpcode::SWAP, //0xCB => CpuOpcode::SWAP,
//0xCB => CpuOpcode::RLC, //0xCB => CpuOpcode::RLC,
//0xCB => CpuOpcode::RL, //0xCB => CpuOpcode::RL,
@ -598,14 +612,14 @@ impl CPU {
0xCC => CpuOpcode::CALL(OpcodeParameter::FlagRegisterSet_U16(FlagRegister::Zero(true), 0)), 0xCC => CpuOpcode::CALL(OpcodeParameter::FlagRegisterSet_U16(FlagRegister::Zero(true), 0)),
0xD4 => CpuOpcode::CALL(OpcodeParameter::FlagRegisterReset_U16(FlagRegister::Carry(true), 0)), 0xD4 => CpuOpcode::CALL(OpcodeParameter::FlagRegisterReset_U16(FlagRegister::Carry(true), 0)),
0xDC => CpuOpcode::CALL(OpcodeParameter::FlagRegisterSet_U16(FlagRegister::Carry(true), 0)), 0xDC => CpuOpcode::CALL(OpcodeParameter::FlagRegisterSet_U16(FlagRegister::Carry(true), 0)),
0xC7 => CpuOpcode::RST(0x0000), 0xC7 => CpuOpcode::RST(0x00),
0xCF => CpuOpcode::RST(0x0008), 0xCF => CpuOpcode::RST(0x08),
0xD7 => CpuOpcode::RST(0x0010), 0xD7 => CpuOpcode::RST(0x10),
0xDF => CpuOpcode::RST(0x0018), 0xDF => CpuOpcode::RST(0x18),
0xE7 => CpuOpcode::RST(0x0020), 0xE7 => CpuOpcode::RST(0x20),
0xEF => CpuOpcode::RST(0x0028), 0xEF => CpuOpcode::RST(0x28),
0xF7 => CpuOpcode::RST(0x0030), 0xF7 => CpuOpcode::RST(0x30),
0xFF => CpuOpcode::RST(0x0038), 0xFF => CpuOpcode::RST(0x38),
0xC9 => CpuOpcode::RET(OpcodeParameter::NoParam), 0xC9 => CpuOpcode::RET(OpcodeParameter::NoParam),
0xC0 => CpuOpcode::RET(OpcodeParameter::FlagRegisterReset(FlagRegister::Zero(true))), 0xC0 => CpuOpcode::RET(OpcodeParameter::FlagRegisterReset(FlagRegister::Zero(true))),
0xC8 => CpuOpcode::RET(OpcodeParameter::FlagRegisterSet(FlagRegister::Zero(true))), 0xC8 => CpuOpcode::RET(OpcodeParameter::FlagRegisterSet(FlagRegister::Zero(true))),
@ -711,12 +725,32 @@ mod tests {
let mut bus = Bus::new(); let mut bus = Bus::new();
cpu.registers.set(&Register::A(0b00000010)); cpu.registers.set(&Register::A(0b00000010));
cpu.exec(CpuOpcode::RLCA, &mut bus); cpu.exec(CpuOpcode::RLCA, &mut bus);
assert_eq!(cpu.registers.get(&Register::A(0)), 0b00000001); assert_eq!(cpu.registers.get(&Register::A(0)), 0b00000010);
assert_eq!(cpu.registers.get_flag(&FlagRegister::Carry(false)), false); assert_eq!(cpu.registers.get_flag(&FlagRegister::Carry(false)), false);
assert_eq!(cpu.registers.get(&Register::PC(0)), 0x101);
let mut cpu = CPU::new();
cpu.registers.set(&Register::A(0b00000001)); cpu.registers.set(&Register::A(0b00000001));
cpu.exec(CpuOpcode::RLCA, &mut bus); cpu.exec(CpuOpcode::RLCA, &mut bus);
assert_eq!(cpu.registers.get(&Register::A(0)), 0b00000001);
assert_eq!(cpu.registers.get_flag(&FlagRegister::Carry(true)), true);
assert_eq!(cpu.registers.get(&Register::PC(0)), 0x101);
let mut cpu = CPU::new();
cpu.registers.set(&Register::A(0b01000000));
cpu.exec(CpuOpcode::RRCA, &mut bus);
assert_eq!(cpu.registers.get(&Register::A(0)), 0b01000000);
assert_eq!(cpu.registers.get_flag(&FlagRegister::Carry(false)), false);
assert_eq!(cpu.registers.get(&Register::PC(0)), 0x101);
let mut cpu = CPU::new();
cpu.registers.set(&Register::A(0b10000000));
cpu.exec(CpuOpcode::RRCA, &mut bus);
assert_eq!(cpu.registers.get(&Register::A(0)), 0b10000000); assert_eq!(cpu.registers.get(&Register::A(0)), 0b10000000);
assert_eq!(cpu.registers.get_flag(&FlagRegister::Carry(true)), true); assert_eq!(cpu.registers.get_flag(&FlagRegister::Carry(true)), true);
assert_eq!(cpu.registers.get(&Register::PC(0)), 0x101);
let mut cpu = CPU::new();
cpu.exec(CpuOpcode::CALL(OpcodeParameter::U16(0xF0F0)), &mut bus);
assert_eq!(cpu.registers.get(&Register::PC(0)), 0xF0F0);
let mut cpu = CPU::new(); let mut cpu = CPU::new();
let mut bus = Bus::new(); let mut bus = Bus::new();