use crate::hardware::register::Registers;
pub enum ConditionFlag {
FlPos, FlZro, FlNeg, }
impl ConditionFlag {
pub fn get_flag_value(flag: ConditionFlag) -> u16 {
match flag {
ConditionFlag::FlPos => 1 << 0, ConditionFlag::FlZro => 1 << 1, ConditionFlag::FlNeg => 1 << 2, }
}
}
pub fn update_r_cond_register(r: u16, registers: &mut Registers) {
if registers.get(r) == 0 {
registers.update(9, ConditionFlag::get_flag_value(ConditionFlag::FlZro));
} else if (registers.get(r) >> 15) != 0 {
registers.update(9, ConditionFlag::get_flag_value(ConditionFlag::FlNeg));
} else {
registers.update(9, ConditionFlag::get_flag_value(ConditionFlag::FlPos));
}
}
#[cfg(test)]
mod condition_flag_test {
use super::*;
#[test]
fn value_of_flpos_should_be_1() {
assert_eq!(1, ConditionFlag::get_flag_value(ConditionFlag::FlPos));
}
#[test]
fn value_of_flzro_should_be_2() {
assert_eq!(2, ConditionFlag::get_flag_value(ConditionFlag::FlZro));
}
#[test]
fn value_of_flneg_should_be_4() {
assert_eq!(4, ConditionFlag::get_flag_value(ConditionFlag::FlNeg));
}
}