GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
op_0B.cpp
1#include "../../../../../include/ProcessingUnit.hpp"
2#include "../../../../../include/opcodes.hpp"
3#include "../../../../../include/mmu.hpp"
4
5constexpr int machine_cycles = 4;
6#define totalMachineCycles(n) ((n) * machine_cycles)
7
8#define DUMMY(name) int name(ProcessingUnit&, MMU&) { return totalMachineCycles(1); }
9
10int op_or_b(ProcessingUnit& cpu, MMU& mmu) // 0xB0
11{
12 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::B);
13 cpu.reg(ProcessingUnit::Register::A) = result;
14
15 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
16 cpu.setFlag(ProcessingUnit::Flag::N, false);
17 cpu.setFlag(ProcessingUnit::Flag::H, false);
18 cpu.setFlag(ProcessingUnit::Flag::C, false);
19
20 return totalMachineCycles(1);
21}
22
23int op_or_c(ProcessingUnit& cpu, MMU& mmu) // 0xB1
24{
25 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::C);
26 cpu.reg(ProcessingUnit::Register::A) = result;
27
28 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
29 cpu.setFlag(ProcessingUnit::Flag::N, false);
30 cpu.setFlag(ProcessingUnit::Flag::H, false);
31 cpu.setFlag(ProcessingUnit::Flag::C, false);
32
33 return totalMachineCycles(1);
34}
35
36int op_or_d(ProcessingUnit& cpu, MMU& mmu) // 0xB2
37{
38 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::D);
39 cpu.reg(ProcessingUnit::Register::A) = result;
40
41 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
42 cpu.setFlag(ProcessingUnit::Flag::N, false);
43 cpu.setFlag(ProcessingUnit::Flag::H, false);
44 cpu.setFlag(ProcessingUnit::Flag::C, false);
45
46 return totalMachineCycles(1);
47}
48
49int op_or_e(ProcessingUnit& cpu, MMU& mmu) // 0xB3
50{
51 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::E);
52 cpu.reg(ProcessingUnit::Register::A) = result;
53
54 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
55 cpu.setFlag(ProcessingUnit::Flag::N, false);
56 cpu.setFlag(ProcessingUnit::Flag::H, false);
57 cpu.setFlag(ProcessingUnit::Flag::C, false);
58
59 return totalMachineCycles(1);
60}
61
62int op_or_h(ProcessingUnit& cpu, MMU& mmu) // 0xB4
63{
64 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::H);
65 cpu.reg(ProcessingUnit::Register::A) = result;
66
67 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
68 cpu.setFlag(ProcessingUnit::Flag::N, false);
69 cpu.setFlag(ProcessingUnit::Flag::H, false);
70 cpu.setFlag(ProcessingUnit::Flag::C, false);
71
72 return totalMachineCycles(1);
73}
74
75int op_or_l(ProcessingUnit& cpu, MMU& mmu) // 0xB5
76{
77 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::L);
78 cpu.reg(ProcessingUnit::Register::A) = result;
79
80 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
81 cpu.setFlag(ProcessingUnit::Flag::N, false);
82 cpu.setFlag(ProcessingUnit::Flag::H, false);
83 cpu.setFlag(ProcessingUnit::Flag::C, false);
84
85 return totalMachineCycles(1);
86}
87
88int op_or_hl(ProcessingUnit& cpu, MMU& mmu) // 0xB6
89{
90 const u8 value = mmu.read(cpu.get_hl());
91 const u8 result = cpu.reg(ProcessingUnit::Register::A) | value;
92 cpu.reg(ProcessingUnit::Register::A) = result;
93
94 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
95 cpu.setFlag(ProcessingUnit::Flag::N, false);
96 cpu.setFlag(ProcessingUnit::Flag::H, false);
97 cpu.setFlag(ProcessingUnit::Flag::C, false);
98
99 return totalMachineCycles(2);
100}
101
102int op_or_a(ProcessingUnit& cpu, MMU& mmu) // 0xB7
103{
104 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::A);
105 cpu.reg(ProcessingUnit::Register::A) = result;
106
107 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
108 cpu.setFlag(ProcessingUnit::Flag::N, false);
109 cpu.setFlag(ProcessingUnit::Flag::H, false);
110 cpu.setFlag(ProcessingUnit::Flag::C, false);
111
112 return totalMachineCycles(1);
113}
114
115int op_cp_b(ProcessingUnit& cpu, MMU& mmu) // 0xB8
116{
117 const u8 a = cpu.reg(ProcessingUnit::Register::A);
118 const u8 b = cpu.reg(ProcessingUnit::Register::B);
119 const int result = a - b;
120 const int half_carry = (a & 0x0F) - (b & 0x0F);
121
122 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
123 cpu.setFlag(ProcessingUnit::Flag::N, true);
124 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
125 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
126
127 return totalMachineCycles(1);
128}
129
130int op_cp_c(ProcessingUnit& cpu, MMU& mmu) // 0xB9
131{
132 const u8 a = cpu.reg(ProcessingUnit::Register::A);
133 const u8 c = cpu.reg(ProcessingUnit::Register::C);
134 const int result = a - c;
135 const int half_carry = (a & 0x0F) - (c & 0x0F);
136
137 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
138 cpu.setFlag(ProcessingUnit::Flag::N, true);
139 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
140 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
141
142 return totalMachineCycles(1);
143}
144
145int op_cp_d(ProcessingUnit& cpu, MMU& mmu) // 0xBA
146{
147 const u8 a = cpu.reg(ProcessingUnit::Register::A);
148 const u8 d = cpu.reg(ProcessingUnit::Register::D);
149 const int result = a - d;
150 const int half_carry = (a & 0x0F) - (d & 0x0F);
151
152 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
153 cpu.setFlag(ProcessingUnit::Flag::N, true);
154 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
155 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
156
157 return totalMachineCycles(1);
158}
159
160int op_cp_e(ProcessingUnit& cpu, MMU& mmu) // 0xBB
161{
162 const u8 a = cpu.reg(ProcessingUnit::Register::A);
163 const u8 e = cpu.reg(ProcessingUnit::Register::E);
164 const int result = a - e;
165 const int half_carry = (a & 0x0F) - (e & 0x0F);
166
167 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
168 cpu.setFlag(ProcessingUnit::Flag::N, true);
169 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
170 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
171
172 return totalMachineCycles(1);
173}
174
175int op_cp_h(ProcessingUnit& cpu, MMU& mmu) // 0xBC
176{
177 const u8 a = cpu.reg(ProcessingUnit::Register::A);
178 const u8 h = cpu.reg(ProcessingUnit::Register::H);
179 const int result = a - h;
180 const int half_carry = (a & 0x0F) - (h & 0x0F);
181
182 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
183 cpu.setFlag(ProcessingUnit::Flag::N, true);
184 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
185 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
186
187 return totalMachineCycles(1);
188}
189
190int op_cp_l(ProcessingUnit& cpu, MMU& mmu) // 0xBD
191{
192 const u8 a = cpu.reg(ProcessingUnit::Register::A);
193 const u8 l = cpu.reg(ProcessingUnit::Register::L);
194 const int result = a - l;
195 const int half_carry = (a & 0x0F) - (l & 0x0F);
196
197 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
198 cpu.setFlag(ProcessingUnit::Flag::N, true);
199 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
200 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
201
202 return totalMachineCycles(1);
203}
204
205int op_cp_hl(ProcessingUnit& cpu, MMU& mmu) // 0xBE
206{
207 const u8 a = cpu.reg(ProcessingUnit::Register::A);
208 const u8 value = mmu.read(cpu.get_hl());
209 const int result = a - value;
210 const int half_carry = (a & 0x0F) - (value & 0x0F);
211
212 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
213 cpu.setFlag(ProcessingUnit::Flag::N, true);
214 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
215 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
216
217 return totalMachineCycles(2);
218}
219
220int op_cp_a(ProcessingUnit& cpu, MMU& mmu) // 0xBF
221{
222 const u8 a = cpu.reg(ProcessingUnit::Register::A);
223 const int result = a - a;
224 const int half_carry = (a & 0x0F) - (a & 0x0F);
225
226 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
227 cpu.setFlag(ProcessingUnit::Flag::N, true);
228 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
229 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
230
231 return totalMachineCycles(1);
232}
Definition mmu.hpp:12