emu6809/cpu/
flags.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Default, Serialize, Deserialize,Clone,Copy,PartialEq,Debug)]
4#[repr(transparent)]
5pub struct Flags(u8);
6
7bitflags::bitflags! {
8
9    impl Flags: u8 {
10        const E  = 1 << 7;
11        const F  = 1 << 6;
12        const H  = 1 << 5;
13        const I  = 1 << 4;
14        const N  = 1 << 3;
15        const Z  = 1 << 2;
16        const V  = 1 << 1;
17        const C = 1 << 0;
18
19        const NZVCH =
20            Self::N.bits() |
21            Self::Z.bits() |
22            Self::V.bits() |
23            Self::C.bits() |
24            Self::H.bits() ;
25
26        const NZVC =
27            Self::N.bits() |
28            Self::Z.bits() |
29            Self::V.bits() |
30            Self::C.bits() ;
31
32        const NZC = Self::N.bits() | Self::Z.bits() | Self::C.bits() ;
33        const NZ  = Self::N.bits ()| Self::Z.bits() ;
34        const NZV = Self::N.bits() | Self::Z.bits() | Self::V.bits() ;
35    }
36}
37
38impl Flags {
39    pub fn new(val: u8) -> Flags {
40        Flags(val)
41        // let mut r: Flags = Default::default();
42        // r.set_flags(val);
43        // r
44    }
45
46    #[inline]
47    pub fn set_flags(&mut self, val: u8) {
48        *self = Flags(val)
49    }
50
51    pub fn write_with_mask(&mut self, mask: u8, val: u8) {
52        self.set_flags((self.bits() & !mask) | (val & mask))
53    }
54
55    pub fn le(self) -> bool {
56        let v = self.contains(Flags::V);
57        let n = self.contains(Flags::N);
58        let z = self.contains(Flags::Z);
59        z | (v ^ n)
60    }
61
62    pub fn gt(self) -> bool {
63        !self.le()
64    }
65
66    pub fn lt(self) -> bool {
67        !self.ge()
68    }
69
70    pub fn ge(self) -> bool {
71        let v = self.contains(Flags::V);
72        let n = self.contains(Flags::N);
73        !(v ^ n)
74    }
75
76    pub fn hi(self) -> bool {
77        let c = self.contains(Flags::C);
78        let z = self.contains(Flags::Z);
79        !(c | z)
80    }
81
82    pub fn ls(self) -> bool {
83        !self.hi()
84    }
85}