Refactor bit manipulation HL instructions
parent
4202e70240
commit
6447db5df7
|
@ -20,41 +20,7 @@ impl Run for BitManipulationInstruction {
|
||||||
}
|
}
|
||||||
|
|
||||||
BitManipulationInstruction::SetHLValueBit { bit } => {
|
BitManipulationInstruction::SetHLValueBit { bit } => {
|
||||||
// TODO: wow this code kinda sucks, I kinda wanna make a better to deal with the HL values
|
transform_hl_value(processor, |value| set_nth_bit(value, bit))?;
|
||||||
|
|
||||||
let hl_addr = processor
|
|
||||||
.registers
|
|
||||||
.get_combined_register(register::Combined::HL);
|
|
||||||
|
|
||||||
#[allow(clippy::match_wildcard_for_single_variants)]
|
|
||||||
let hl_value = processor
|
|
||||||
.memory
|
|
||||||
.get(hl_addr.into())
|
|
||||||
.map_err(|err| match err {
|
|
||||||
memory::Error::GetInvalidAddress(addr) => {
|
|
||||||
run::Error::InvalidRegisterAddress(
|
|
||||||
register::SixteenBit::Combined(register::Combined::HL),
|
|
||||||
addr,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
err => run::Error::Unknown(Box::new(err)),
|
|
||||||
})?;
|
|
||||||
|
|
||||||
let upd_value = set_nth_bit(hl_value, bit);
|
|
||||||
|
|
||||||
#[allow(clippy::match_wildcard_for_single_variants)]
|
|
||||||
processor
|
|
||||||
.memory
|
|
||||||
.set(hl_addr.into(), upd_value)
|
|
||||||
.map_err(|err| match err {
|
|
||||||
memory::Error::SetInvalidAddress(addr, _value) => {
|
|
||||||
run::Error::InvalidRegisterAddress(
|
|
||||||
register::SixteenBit::Combined(register::Combined::HL),
|
|
||||||
addr,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
err => run::Error::Unknown(Box::new(err)),
|
|
||||||
})?;
|
|
||||||
|
|
||||||
Ok(Cycles(16))
|
Ok(Cycles(16))
|
||||||
}
|
}
|
||||||
|
@ -67,3 +33,40 @@ fn set_nth_bit(value: u8, bit: u8) -> u8 {
|
||||||
|
|
||||||
value | (0x1 << bit)
|
value | (0x1 << bit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn transform_hl_value<F: Fn(u8) -> u8>(
|
||||||
|
processor: &mut Processor,
|
||||||
|
transform: F,
|
||||||
|
) -> Result<(), run::Error> {
|
||||||
|
let hl_addr = processor
|
||||||
|
.registers
|
||||||
|
.get_combined_register(register::Combined::HL);
|
||||||
|
|
||||||
|
#[allow(clippy::match_wildcard_for_single_variants)]
|
||||||
|
let hl_value = processor
|
||||||
|
.memory
|
||||||
|
.get(hl_addr.into())
|
||||||
|
.map_err(|err| match err {
|
||||||
|
memory::Error::GetInvalidAddress(addr) => run::Error::InvalidRegisterAddress(
|
||||||
|
register::SixteenBit::Combined(register::Combined::HL),
|
||||||
|
addr,
|
||||||
|
),
|
||||||
|
err => run::Error::Unknown(Box::new(err)),
|
||||||
|
})?;
|
||||||
|
|
||||||
|
let upd_value = transform(hl_value);
|
||||||
|
|
||||||
|
#[allow(clippy::match_wildcard_for_single_variants)]
|
||||||
|
processor
|
||||||
|
.memory
|
||||||
|
.set(hl_addr.into(), upd_value)
|
||||||
|
.map_err(|err| match err {
|
||||||
|
memory::Error::SetInvalidAddress(addr, _value) => run::Error::InvalidRegisterAddress(
|
||||||
|
register::SixteenBit::Combined(register::Combined::HL),
|
||||||
|
addr,
|
||||||
|
),
|
||||||
|
err => run::Error::Unknown(Box::new(err)),
|
||||||
|
})?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue