chore: refactor LDTarget and InstrRegister
This commit is contained in:
parent
2e1c97e5d7
commit
db86d11085
|
@ -72,6 +72,7 @@ pub enum MATHTarget {
|
|||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub enum LDTarget {
|
||||
IndirectC,
|
||||
Register(InstrRegister),
|
||||
IndirectRegister(InstrRegisterPair),
|
||||
ByteAtAddress(u16),
|
||||
|
@ -103,6 +104,18 @@ enum InstrRegister {
|
|||
H,
|
||||
L,
|
||||
IndirectHL, // (HL)
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum InstrRegisterWithC {
|
||||
A,
|
||||
B,
|
||||
C,
|
||||
D,
|
||||
E,
|
||||
H,
|
||||
L,
|
||||
IndirectHL, // (HL)
|
||||
IndirectC, // (0xFF00 + C)
|
||||
}
|
||||
|
||||
|
@ -215,22 +228,15 @@ impl Instruction {
|
|||
cpu.set_register(Register::try_from(reg).unwrap(), n);
|
||||
Cycles(8)
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
}
|
||||
(
|
||||
LDTarget::Register(InstrRegister::IndirectC),
|
||||
LDTarget::Register(InstrRegister::A),
|
||||
) => {
|
||||
(LDTarget::IndirectC, LDTarget::Register(InstrRegister::A)) => {
|
||||
// LD (0xFF00 + C), A | Store value of register A at address 0xFF00 + C
|
||||
let addr = 0xFF00 + cpu.register(Register::C) as u16;
|
||||
cpu.write_byte(addr, cpu.register(Register::A));
|
||||
Cycles(8)
|
||||
}
|
||||
(
|
||||
LDTarget::Register(InstrRegister::A),
|
||||
LDTarget::Register(InstrRegister::IndirectC),
|
||||
) => {
|
||||
(LDTarget::Register(InstrRegister::A), LDTarget::IndirectC) => {
|
||||
let addr = 0xFF00 + cpu.register(Register::C) as u16;
|
||||
cpu.set_register(Register::A, cpu.read_byte(addr));
|
||||
Cycles(8)
|
||||
|
@ -359,7 +365,6 @@ impl Instruction {
|
|||
sum = Self::add_u8s(a_value, value, &mut flags);
|
||||
cycles = Cycles(4);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
cpu.set_register(Register::A, sum);
|
||||
|
@ -414,7 +419,6 @@ impl Instruction {
|
|||
);
|
||||
cycles = Cycles(12)
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
cpu.set_register(Register::Flag, flags.into());
|
||||
cycles
|
||||
|
@ -470,7 +474,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, Self::dec_register(cpu.read_byte(addr), &mut flags));
|
||||
cycles = Cycles(12);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
cpu.set_register(Register::Flag, flags.into());
|
||||
cycles
|
||||
|
@ -588,7 +591,6 @@ impl Instruction {
|
|||
sum = Self::add_u8s(a_value, value, &mut flags);
|
||||
cycles = Cycles(8);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
cpu.set_register(Register::Flag, flags.into());
|
||||
cpu.set_register(Register::A, sum);
|
||||
|
@ -631,7 +633,6 @@ impl Instruction {
|
|||
diff = Self::sub_u8s(a_value, value, &mut flags);
|
||||
cycles = Cycles(8);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
cpu.set_register(Register::Flag, flags.into());
|
||||
|
@ -676,7 +677,6 @@ impl Instruction {
|
|||
diff = Self::sub_u8s(a_value, value, &mut flags);
|
||||
cycles = Cycles(8);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
cpu.set_register(Register::A, diff);
|
||||
|
@ -721,7 +721,6 @@ impl Instruction {
|
|||
result = a_value & value;
|
||||
cycles = Cycles(8);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(result == 0, false, true, false);
|
||||
|
@ -766,7 +765,6 @@ impl Instruction {
|
|||
result = a_value ^ value;
|
||||
cycles = Cycles(8);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(result == 0, false, false, false);
|
||||
|
@ -811,7 +809,6 @@ impl Instruction {
|
|||
result = a_value | value;
|
||||
cycles = Cycles(8);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(result == 0, false, false, false);
|
||||
|
@ -855,7 +852,6 @@ impl Instruction {
|
|||
let _ = Self::sub_u8s(a_value, value, &mut flags);
|
||||
cycles = Cycles(8);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
cpu.set_register(Register::Flag, flags.into());
|
||||
|
@ -1099,7 +1095,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, rot_reg);
|
||||
cycles = Cycles(16);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(rot_reg == 0, false, false, msb == 0x01);
|
||||
|
@ -1140,7 +1135,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, rot_reg);
|
||||
cycles = Cycles(16);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(rot_reg == 0, false, false, lsb == 0x01);
|
||||
|
@ -1183,7 +1177,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, rot_reg);
|
||||
cycles = Cycles(16);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(rot_reg == 0, false, false, carry);
|
||||
|
@ -1227,7 +1220,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, rot_reg);
|
||||
cycles = Cycles(16);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(rot_reg == 0, false, false, carry);
|
||||
|
@ -1269,7 +1261,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, value);
|
||||
cycles = Cycles(16);
|
||||
}
|
||||
InstrRegister::IndirectC => unimplemented!(),
|
||||
}
|
||||
|
||||
flags.update(shift_reg == 0, false, false, msb == 0x01);
|
||||
|
@ -1313,7 +1304,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, value);
|
||||
cycles = Cycles(16);
|
||||
}
|
||||
InstrRegister::IndirectC => unimplemented!(),
|
||||
}
|
||||
|
||||
flags.update(shift_reg == 0, false, false, lsb == 0x01);
|
||||
|
@ -1353,7 +1343,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, swap_reg);
|
||||
cycles = Cycles(16)
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(swap_reg == 0, false, false, false);
|
||||
|
@ -1395,7 +1384,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, shift_reg);
|
||||
cycles = Cycles(16);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(shift_reg == 0, false, false, lsb == 0x01);
|
||||
|
@ -1429,7 +1417,6 @@ impl Instruction {
|
|||
is_bit_set = ((value >> y) & 0x01) == 0x01;
|
||||
cycles = Cycles(12);
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
|
||||
flags.update(!is_bit_set, false, true, flags.c);
|
||||
|
@ -1464,7 +1451,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, value & !(1u8 << y));
|
||||
Cycles(16)
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
}
|
||||
Instruction::SET(y, reg) => {
|
||||
|
@ -1493,7 +1479,6 @@ impl Instruction {
|
|||
cpu.write_byte(addr, value | (1u8 << y));
|
||||
Cycles(16)
|
||||
}
|
||||
InstrRegister::IndirectC => unreachable!(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1786,7 +1771,7 @@ impl Instruction {
|
|||
),
|
||||
(3, 2, _, 4, _) => Self::LD(
|
||||
// LD (0xFF00 + C) ,A
|
||||
LDTarget::Register(InstrRegister::IndirectC),
|
||||
LDTarget::IndirectC,
|
||||
LDTarget::Register(InstrRegister::A),
|
||||
),
|
||||
(3, 2, _, 5, _) => Self::LD(
|
||||
|
@ -1797,7 +1782,7 @@ impl Instruction {
|
|||
(3, 2, _, 6, _) => Self::LD(
|
||||
// LD A, (0xFF00 + C)
|
||||
LDTarget::Register(InstrRegister::A),
|
||||
LDTarget::Register(InstrRegister::IndirectC),
|
||||
LDTarget::IndirectC,
|
||||
),
|
||||
(3, 2, _, 7, _) => Self::LD(
|
||||
// LD A, (nn)
|
||||
|
@ -1919,9 +1904,6 @@ impl TryFrom<InstrRegister> for Register {
|
|||
InstrRegister::IndirectHL => {
|
||||
Err("Can not convert InstrRegister::IndirectHL to Register".to_string())
|
||||
}
|
||||
InstrRegister::IndirectC => {
|
||||
Err("Can not convert InstrRegister::IndirectC to Register".to_string())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue