1#include "../../../../../include/ProcessingUnit.hpp"
2#include "../../../../../include/opcodes.hpp"
3#include "../../../../../include/mmu.hpp"
5constexpr int machine_cycles = 4;
6#define totalMachineCycles(n) ((n) * machine_cycles)
8#define DUMMY(name) int name(ProcessingUnit&, MMU&) { return totalMachineCycles(1); }
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);
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);
23 return totalMachineCycles(1);
28 const u8 a = cpu.reg(ProcessingUnit::Register::A);
29 const u8 c = cpu.reg(ProcessingUnit::Register::C);
30 const u16 sum = a + c;
32 const u8 result =
static_cast<u8
>(sum & 0xFF);
33 cpu.reg(ProcessingUnit::Register::A) = result;
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);
40 return totalMachineCycles(1);
45 const u8 a = cpu.reg(ProcessingUnit::Register::A);
46 const u8 d = cpu.reg(ProcessingUnit::Register::D);
47 const u16 sum = a + d;
49 const u8 result =
static_cast<u8
>(sum & 0xFF);
50 cpu.reg(ProcessingUnit::Register::A) = result;
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);
57 return totalMachineCycles(1);
62 const u8 a = cpu.reg(ProcessingUnit::Register::A);
63 const u8 e = cpu.reg(ProcessingUnit::Register::E);
64 const u16 sum = a + e;
66 const u8 result =
static_cast<u8
>(sum & 0xFF);
67 cpu.reg(ProcessingUnit::Register::A) = result;
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);
74 return totalMachineCycles(1);
79 const u8 a = cpu.reg(ProcessingUnit::Register::A);
80 const u8 h = cpu.reg(ProcessingUnit::Register::H);
81 const u16 sum = a + h;
83 const u8 result =
static_cast<u8
>(sum & 0xFF);
84 cpu.reg(ProcessingUnit::Register::A) = result;
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);
91 return totalMachineCycles(1);
96 const u8 a = cpu.reg(ProcessingUnit::Register::A);
97 const u8 l = cpu.reg(ProcessingUnit::Register::L);
98 const u16 sum = a + l;
100 const u8 result =
static_cast<u8
>(sum & 0xFF);
101 cpu.reg(ProcessingUnit::Register::A) = result;
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);
108 return totalMachineCycles(1);
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;
118 const u8 result =
static_cast<u8
>(sum & 0xFF);
119 cpu.reg(ProcessingUnit::Register::A) = result;
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);
126 return totalMachineCycles(2);
131 const u8 a = cpu.reg(ProcessingUnit::Register::A);
132 const u16 sum = a + a;
134 const u8 result =
static_cast<u8
>(sum & 0xFF);
135 cpu.reg(ProcessingUnit::Register::A) = result;
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);
142 return totalMachineCycles(1);
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;
152 const u8 result =
static_cast<u8
>(sum & 0xFF);
153 cpu.reg(ProcessingUnit::Register::A) = result;
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);
160 return totalMachineCycles(1);
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;
170 const u8 result =
static_cast<u8
>(sum & 0xFF);
171 cpu.reg(ProcessingUnit::Register::A) = result;
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);
178 return totalMachineCycles(1);
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;
188 const u8 result =
static_cast<u8
>(sum & 0xFF);
189 cpu.reg(ProcessingUnit::Register::A) = result;
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);
196 return totalMachineCycles(1);
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;
206 const u8 result =
static_cast<u8
>(sum & 0xFF);
207 cpu.reg(ProcessingUnit::Register::A) = result;
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);
214 return totalMachineCycles(1);
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;
224 const u8 result =
static_cast<u8
>(sum & 0xFF);
225 cpu.reg(ProcessingUnit::Register::A) = result;
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);
232 return totalMachineCycles(1);
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;
242 const u8 result =
static_cast<u8
>(sum & 0xFF);
243 cpu.reg(ProcessingUnit::Register::A) = result;
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);
250 return totalMachineCycles(1);
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;
261 const u8 result =
static_cast<u8
>(sum & 0xFF);
262 cpu.reg(ProcessingUnit::Register::A) = result;
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);
269 return totalMachineCycles(2);
274 const u8 a = cpu.reg(ProcessingUnit::Register::A);
275 const bool carry = cpu.get_flag_c();
276 const u16 sum = 2 * a + carry;
278 const u8 result =
static_cast<u8
>(sum & 0xFF);
279 cpu.reg(ProcessingUnit::Register::A) = result;
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);
286 return totalMachineCycles(1);