use super::{Cpu, wide_value};
use crate::consts::flag;
use crate::flags;
use crate::mcode::Decoded;
impl Cpu {
pub(super) fn undocumented_carry_source(&self, accumulator: u8, flags: u8) -> u8 {
flags::undocumented_carry_source(self.undocumented_flags, accumulator, flags)
}
pub(super) fn accumulator_flag_instructions(&mut self, decoded: &Decoded) {
let accumulator = self.accumulator();
let mut flags = self.flags();
if decoded.i_cpl() {
let complemented = !accumulator;
self.registers.af = wide_value(complemented, flags);
flags = Self::take_undocumented(self.flags(), !accumulator);
flags |= flag::H_MASK | flag::N_MASK;
self.set_flags(flags);
}
if decoded.i_ccf() {
let carry = flags & flag::C_MASK != 0;
let reported = self.undocumented_carry_source(accumulator, flags);
flags = Self::take_undocumented(flags, reported) & !(flag::N_MASK | flag::H_MASK);
if carry {
flags |= flag::H_MASK;
flags &= !flag::C_MASK;
} else {
flags |= flag::C_MASK;
}
self.set_flags(flags);
}
if decoded.i_scf() {
let reported = self.undocumented_carry_source(accumulator, flags);
flags = Self::take_undocumented(flags, reported) & !(flag::N_MASK | flag::H_MASK);
flags |= flag::C_MASK;
self.set_flags(flags);
}
}
pub(super) fn report_byte(flags: u8, value: u8, parity: bool) -> u8 {
flags::report_byte(flags, value, parity)
}
}