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}