GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
op_08.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_add_a_b(ProcessingUnit& cpu, MMU& mmu) // 0x80
11{
12 const u8 a = cpu.reg(ProcessingUnit::Register::A);
13 const u8 b = cpu.reg(ProcessingUnit::Register::B);
14 const u16 sum = a + b;
15 const u8 result = static_cast<u8>(sum & 0xFF);
16
17 cpu.reg(ProcessingUnit::Register::A) = result;
18 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
19 cpu.setFlag(ProcessingUnit::Flag::N, false);
20 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (b & 0x0F)) > 0x0F);
21 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
22
23 return totalMachineCycles(1);
24}
25
26int op_add_a_c(ProcessingUnit& cpu, MMU& mmu) // 0x81
27{
28 const u8 a = cpu.reg(ProcessingUnit::Register::A);
29 const u8 c = cpu.reg(ProcessingUnit::Register::C);
30 const u16 sum = a + c;
31
32 const u8 result = static_cast<u8>(sum & 0xFF);
33 cpu.reg(ProcessingUnit::Register::A) = result;
34
35 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
36 cpu.setFlag(ProcessingUnit::Flag::N, false);
37 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (c & 0x0F)) > 0x0F);
38 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
39
40 return totalMachineCycles(1);
41}
42
43int op_add_a_d(ProcessingUnit& cpu, MMU& mmu) // 0x82
44{
45 const u8 a = cpu.reg(ProcessingUnit::Register::A);
46 const u8 d = cpu.reg(ProcessingUnit::Register::D);
47 const u16 sum = a + d;
48
49 const u8 result = static_cast<u8>(sum & 0xFF);
50 cpu.reg(ProcessingUnit::Register::A) = result;
51
52 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
53 cpu.setFlag(ProcessingUnit::Flag::N, false);
54 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (d & 0x0F)) > 0x0F);
55 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
56
57 return totalMachineCycles(1);
58}
59
60int op_add_a_e(ProcessingUnit& cpu, MMU& mmu) // 0x83
61{
62 const u8 a = cpu.reg(ProcessingUnit::Register::A);
63 const u8 e = cpu.reg(ProcessingUnit::Register::E);
64 const u16 sum = a + e;
65
66 const u8 result = static_cast<u8>(sum & 0xFF);
67 cpu.reg(ProcessingUnit::Register::A) = result;
68
69 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
70 cpu.setFlag(ProcessingUnit::Flag::N, false);
71 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (e & 0x0F)) > 0x0F);
72 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
73
74 return totalMachineCycles(1);
75}
76
77int op_add_a_h(ProcessingUnit& cpu, MMU& mmu) // 0x82
78{
79 const u8 a = cpu.reg(ProcessingUnit::Register::A);
80 const u8 h = cpu.reg(ProcessingUnit::Register::H);
81 const u16 sum = a + h;
82
83 const u8 result = static_cast<u8>(sum & 0xFF);
84 cpu.reg(ProcessingUnit::Register::A) = result;
85
86 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
87 cpu.setFlag(ProcessingUnit::Flag::N, false);
88 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (h & 0x0F)) > 0x0F);
89 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
90
91 return totalMachineCycles(1);
92}
93
94int op_add_a_l(ProcessingUnit& cpu, MMU& mmu) // 0x85
95{
96 const u8 a = cpu.reg(ProcessingUnit::Register::A);
97 const u8 l = cpu.reg(ProcessingUnit::Register::L);
98 const u16 sum = a + l;
99
100 const u8 result = static_cast<u8>(sum & 0xFF);
101 cpu.reg(ProcessingUnit::Register::A) = result;
102
103 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
104 cpu.setFlag(ProcessingUnit::Flag::N, false);
105 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (l & 0x0F)) > 0x0F);
106 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
107
108 return totalMachineCycles(1);
109}
110
111int op_add_a_hl(ProcessingUnit& cpu, MMU& mmu) // 0x86
112{
113 const u8 a = cpu.reg(ProcessingUnit::Register::A);
114 const u16 hl = cpu.get_hl();
115 const u8 value = mmu.read(hl);
116 const u16 sum = a + value;
117
118 const u8 result = static_cast<u8>(sum & 0xFF);
119 cpu.reg(ProcessingUnit::Register::A) = result;
120
121 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
122 cpu.setFlag(ProcessingUnit::Flag::N, false);
123 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (value & 0x0F)) > 0x0F);
124 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
125
126 return totalMachineCycles(2);
127}
128
129int op_add_a_a(ProcessingUnit& cpu, MMU& mmu) // 0x87
130{
131 const u8 a = cpu.reg(ProcessingUnit::Register::A);
132 const u16 sum = a + a;
133
134 const u8 result = static_cast<u8>(sum & 0xFF);
135 cpu.reg(ProcessingUnit::Register::A) = result;
136
137 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
138 cpu.setFlag(ProcessingUnit::Flag::N, false);
139 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (a & 0x0F)) > 0x0F);
140 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
141
142 return totalMachineCycles(1);
143}
144
145int op_adc_a_b(ProcessingUnit& cpu, MMU& mmu) // 0x88
146{
147 const u8 a = cpu.reg(ProcessingUnit::Register::A);
148 const u8 b = cpu.reg(ProcessingUnit::Register::B);
149 const bool carry = cpu.get_flag_c();
150 const u16 sum = a + b + carry;
151
152 const u8 result = static_cast<u8>(sum & 0xFF);
153 cpu.reg(ProcessingUnit::Register::A) = result;
154
155 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
156 cpu.setFlag(ProcessingUnit::Flag::N, false);
157 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (b & 0x0F) + carry) > 0x0F);
158 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
159
160 return totalMachineCycles(1);
161}
162
163int op_adc_a_c(ProcessingUnit& cpu, MMU& mmu) // 0x89
164{
165 const u8 a = cpu.reg(ProcessingUnit::Register::A);
166 const u8 b = cpu.reg(ProcessingUnit::Register::C);
167 const bool carry = cpu.get_flag_c();
168 const u16 sum = a + b + carry;
169
170 const u8 result = static_cast<u8>(sum & 0xFF);
171 cpu.reg(ProcessingUnit::Register::A) = result;
172
173 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
174 cpu.setFlag(ProcessingUnit::Flag::N, false);
175 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (b & 0x0F) + carry) > 0x0F);
176 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
177
178 return totalMachineCycles(1);
179}
180
181int op_adc_a_d(ProcessingUnit& cpu, MMU& mmu) // 0x8A
182{
183 const u8 a = cpu.reg(ProcessingUnit::Register::A);
184 const u8 b = cpu.reg(ProcessingUnit::Register::D);
185 const bool carry = cpu.get_flag_c();
186 const u16 sum = a + b + carry;
187
188 const u8 result = static_cast<u8>(sum & 0xFF);
189 cpu.reg(ProcessingUnit::Register::A) = result;
190
191 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
192 cpu.setFlag(ProcessingUnit::Flag::N, false);
193 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (b & 0x0F) + carry) > 0x0F);
194 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
195
196 return totalMachineCycles(1);
197}
198
199int op_adc_a_e(ProcessingUnit& cpu, MMU& mmu) // 0x8B
200{
201 const u8 a = cpu.reg(ProcessingUnit::Register::A);
202 const u8 b = cpu.reg(ProcessingUnit::Register::E);
203 const bool carry = cpu.get_flag_c();
204 const u16 sum = a + b + carry;
205
206 const u8 result = static_cast<u8>(sum & 0xFF);
207 cpu.reg(ProcessingUnit::Register::A) = result;
208
209 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
210 cpu.setFlag(ProcessingUnit::Flag::N, false);
211 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (b & 0x0F) + carry) > 0x0F);
212 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
213
214 return totalMachineCycles(1);
215}
216
217int op_adc_a_h(ProcessingUnit& cpu, MMU& mmu) // 0x8C
218{
219 const u8 a = cpu.reg(ProcessingUnit::Register::A);
220 const u8 b = cpu.reg(ProcessingUnit::Register::H);
221 const bool carry = cpu.get_flag_c();
222 const u16 sum = a + b + carry;
223
224 const u8 result = static_cast<u8>(sum & 0xFF);
225 cpu.reg(ProcessingUnit::Register::A) = result;
226
227 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
228 cpu.setFlag(ProcessingUnit::Flag::N, false);
229 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (b & 0x0F) + carry) > 0x0F);
230 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
231
232 return totalMachineCycles(1);
233}
234
235int op_adc_a_l(ProcessingUnit& cpu, MMU& mmu) // 0x8D
236{
237 const u8 a = cpu.reg(ProcessingUnit::Register::A);
238 const u8 b = cpu.reg(ProcessingUnit::Register::L);
239 const bool carry = cpu.get_flag_c();
240 const u16 sum = a + b + carry;
241
242 const u8 result = static_cast<u8>(sum & 0xFF);
243 cpu.reg(ProcessingUnit::Register::A) = result;
244
245 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
246 cpu.setFlag(ProcessingUnit::Flag::N, false);
247 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (b & 0x0F) + carry) > 0x0F);
248 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
249
250 return totalMachineCycles(1);
251}
252
253int op_adc_a_hl(ProcessingUnit& cpu, MMU& mmu) // 0x8E
254{
255 const u8 a = cpu.reg(ProcessingUnit::Register::A);
256 const u16 hl = cpu.get_hl();
257 const u8 value = mmu.read(hl);
258 const bool carry = cpu.get_flag_c();
259 const u16 sum = a + value + carry;
260
261 const u8 result = static_cast<u8>(sum & 0xFF);
262 cpu.reg(ProcessingUnit::Register::A) = result;
263
264 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
265 cpu.setFlag(ProcessingUnit::Flag::N, false);
266 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (value & 0x0F) + carry) > 0x0F);
267 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
268
269 return totalMachineCycles(2);
270}
271
272int op_adc_a_a(ProcessingUnit& cpu, MMU& mmu) // 0x8F
273{
274 const u8 a = cpu.reg(ProcessingUnit::Register::A);
275 const bool carry = cpu.get_flag_c();
276 const u16 sum = 2 * a + carry;
277
278 const u8 result = static_cast<u8>(sum & 0xFF);
279 cpu.reg(ProcessingUnit::Register::A) = result;
280
281 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
282 cpu.setFlag(ProcessingUnit::Flag::N, false);
283 cpu.setFlag(ProcessingUnit::Flag::H, ((a & 0x0F) + (a & 0x0F) + carry) > 0x0F);
284 cpu.setFlag(ProcessingUnit::Flag::C, sum > 0xFF);
285
286 return totalMachineCycles(1);
287}
Definition mmu.hpp:12