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 }
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}