Skip to main content

k580_core/
flags.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
4pub struct Flags {
5    pub sign: bool,
6    pub zero: bool,
7    pub auxiliary_carry: bool,
8    pub parity: bool,
9    pub carry: bool,
10}
11
12impl Flags {
13    pub const PSW_ALWAYS_SET: u8 = 0b0000_0010;
14
15    pub fn from_psw(byte: u8) -> Self {
16        Self {
17            sign: byte & 0x80 != 0,
18            zero: byte & 0x40 != 0,
19            auxiliary_carry: byte & 0x10 != 0,
20            parity: byte & 0x04 != 0,
21            carry: byte & 0x01 != 0,
22        }
23    }
24
25    pub fn to_psw(self) -> u8 {
26        (u8::from(self.sign) << 7)
27            | (u8::from(self.zero) << 6)
28            | (u8::from(self.auxiliary_carry) << 4)
29            | (u8::from(self.parity) << 2)
30            | Self::PSW_ALWAYS_SET
31            | u8::from(self.carry)
32    }
33
34    pub fn set_sign_zero_parity(&mut self, value: u8) {
35        self.sign = value & 0x80 != 0;
36        self.zero = value == 0;
37        self.parity = value.count_ones().is_multiple_of(2);
38    }
39}