chip_ahoyto/
macros.rs

1#[cfg(feature = "quirks")]
2#[macro_export]
3macro_rules! vf_reset {
4    ($self:expr) => {
5        if $self.quirks.vf_reset {
6            $self.regs[0xf] = 0;
7        }
8    };
9}
10
11#[cfg(not(feature = "quirks"))]
12#[macro_export]
13macro_rules! vf_reset {
14    ($self:expr) => {
15        $self.regs[0xf] = 0;
16    };
17}
18
19#[cfg(feature = "quirks")]
20#[macro_export]
21macro_rules! memory {
22    ($self:expr) => {
23        if $self.quirks.memory {
24            $self.i = $self.i.saturating_add(1);
25        }
26    };
27}
28
29#[cfg(not(feature = "quirks"))]
30#[macro_export]
31macro_rules! memory {
32    ($self:expr) => {
33        $self.i = $self.i.saturating_add(1);
34    };
35}
36
37#[cfg(feature = "quirks")]
38#[macro_export]
39macro_rules! display_blank {
40    ( $self:expr ) => {
41        if $self.quirks.display_blank && $self.wait_vblank != WaitVblank::Vblank {
42            $self.pause_vblank();
43            return;
44        }
45        $self.wait_vblank = WaitVblank::NotWaiting;
46    };
47}
48
49#[cfg(not(feature = "quirks"))]
50#[macro_export]
51macro_rules! display_blank {
52    ( $self:expr ) => {};
53}
54
55#[cfg(feature = "quirks")]
56#[macro_export]
57macro_rules! clipping {
58    ( $self:expr, $y:expr, $y0:expr, $yf:expr ) => {
59        if $self.quirks.clipping {
60            $yf = $y0 + $y;
61            if $yf >= DISPLAY_HEIGHT {
62                continue;
63            }
64        } else {
65            $yf = ($y0 + $y) % DISPLAY_HEIGHT;
66        }
67    };
68}
69
70#[cfg(not(feature = "quirks"))]
71#[macro_export]
72macro_rules! clipping {
73    ( $self:expr, $y:expr, $y0:expr, $yf:expr ) => {
74        $yf = $y0 + $y;
75        if $yf >= DISPLAY_HEIGHT {
76            continue;
77        }
78    };
79}
80
81#[cfg(feature = "quirks")]
82#[macro_export]
83macro_rules! shifting {
84    ( $self:expr, $x:expr, $y:expr, $shift:tt ) => {
85        if $self.quirks.shifting {
86            $self.regs[$x] = $self.regs[$x] $shift 1;
87        } else {
88            $self.regs[$x] = $self.regs[$y] $shift 1;
89        }
90    }
91}
92
93#[cfg(not(feature = "quirks"))]
94#[macro_export]
95macro_rules! shifting {
96    ( $self:expr, $x:expr, $y:expr, $shift:tt ) => {
97        $self.regs[$x] = $self.regs[$y] $shift 1;
98    }
99}
100
101#[cfg(feature = "quirks")]
102#[macro_export]
103macro_rules! jumping {
104    ( $self:expr, $address:expr, $x:expr ) => {
105        if $self.quirks.jumping {
106            $self.pc = $address + $self.regs[$x] as u16;
107        } else {
108            $self.pc = $address + $self.regs[0x0] as u16;
109        }
110    };
111}
112
113#[cfg(not(feature = "quirks"))]
114#[macro_export]
115macro_rules! jumping {
116    ( $self:expr, $address:expr, $x:expr ) => {
117        $self.pc = $address + $self.regs[0x0] as u16;
118    };
119}