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 int result = a - b;
15 const int half_carry = (a & 0x0F) - (b & 0x0F);
17 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
18 cpu.setFlag(ProcessingUnit::Flag::N,
true);
19 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
20 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
22 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
23 return totalMachineCycles(1);
28 const u8 a = cpu.reg(ProcessingUnit::Register::A);
29 const u8 c = cpu.reg(ProcessingUnit::Register::C);
30 const int result = a - c;
31 const int half_carry = (a & 0x0F) - (c & 0x0F);
33 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
34 cpu.setFlag(ProcessingUnit::Flag::N,
true);
35 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
36 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
38 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
39 return totalMachineCycles(1);
44 const u8 a = cpu.reg(ProcessingUnit::Register::A);
45 const u8 d = cpu.reg(ProcessingUnit::Register::D);
46 const int result = a - d;
47 const int half_carry = (a & 0x0F) - (d & 0x0F);
49 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
50 cpu.setFlag(ProcessingUnit::Flag::N,
true);
51 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
52 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
54 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
55 return totalMachineCycles(1);
60 const u8 a = cpu.reg(ProcessingUnit::Register::A);
61 const u8 e = cpu.reg(ProcessingUnit::Register::E);
62 const int result = a - e;
63 const int half_carry = (a & 0x0F) - (e & 0x0F);
65 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
66 cpu.setFlag(ProcessingUnit::Flag::N,
true);
67 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
68 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
70 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
71 return totalMachineCycles(1);
76 const u8 a = cpu.reg(ProcessingUnit::Register::A);
77 const u8 h = cpu.reg(ProcessingUnit::Register::H);
78 const int result = a - h;
79 const int half_carry = (a & 0x0F) - (h & 0x0F);
81 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
82 cpu.setFlag(ProcessingUnit::Flag::N,
true);
83 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
84 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
86 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
87 return totalMachineCycles(1);
92 const u8 a = cpu.reg(ProcessingUnit::Register::A);
93 const u8 l = cpu.reg(ProcessingUnit::Register::L);
94 const int result = a - l;
95 const int half_carry = (a & 0x0F) - (l & 0x0F);
97 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
98 cpu.setFlag(ProcessingUnit::Flag::N,
true);
99 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
100 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
102 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
103 return totalMachineCycles(1);
108 const u8 a = cpu.reg(ProcessingUnit::Register::A);
109 const u8 value = mmu.read(cpu.get_hl());
110 const int result = a - value;
111 const int half_carry = (a & 0x0F) - (value & 0x0F);
113 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
114 cpu.setFlag(ProcessingUnit::Flag::N,
true);
115 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
116 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
118 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
119 return totalMachineCycles(2);
124 const u8 a = cpu.reg(ProcessingUnit::Register::A);
125 const int result = a - a;
126 const int half_carry = (a & 0x0F) - (a & 0x0F);
128 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
129 cpu.setFlag(ProcessingUnit::Flag::N,
true);
130 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
131 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
133 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
134 return totalMachineCycles(1);
139 const u8 a = cpu.reg(ProcessingUnit::Register::A);
140 const u8 b = cpu.reg(ProcessingUnit::Register::B);
141 const u8 carry = cpu.get_flag_c() ? 1 : 0;
142 const int result = a - b - carry;
143 const int half_carry = (a & 0x0F) - (b & 0x0F) - carry;
145 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
146 cpu.setFlag(ProcessingUnit::Flag::N,
true);
147 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
148 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
150 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
151 return totalMachineCycles(1);
156 const u8 a = cpu.reg(ProcessingUnit::Register::A);
157 const u8 c = cpu.reg(ProcessingUnit::Register::C);
158 const u8 carry = cpu.get_flag_c() ? 1 : 0;
159 const int result = a - c - carry;
160 const int half_carry = (a & 0x0F) - (c & 0x0F) - carry;
162 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
163 cpu.setFlag(ProcessingUnit::Flag::N,
true);
164 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
165 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
167 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
168 return totalMachineCycles(1);
173 const u8 a = cpu.reg(ProcessingUnit::Register::A);
174 const u8 d = cpu.reg(ProcessingUnit::Register::D);
175 const u8 carry = cpu.get_flag_c() ? 1 : 0;
176 const int result = a - d - carry;
177 const int half_carry = (a & 0x0F) - (d & 0x0F) - carry;
179 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
180 cpu.setFlag(ProcessingUnit::Flag::N,
true);
181 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
182 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
184 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
185 return totalMachineCycles(1);
190 const u8 a = cpu.reg(ProcessingUnit::Register::A);
191 const u8 e = cpu.reg(ProcessingUnit::Register::E);
192 const u8 carry = cpu.get_flag_c() ? 1 : 0;
193 const int result = a - e - carry;
194 const int half_carry = (a & 0x0F) - (e & 0x0F) - carry;
196 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
197 cpu.setFlag(ProcessingUnit::Flag::N,
true);
198 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
199 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
201 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
202 return totalMachineCycles(1);
207 const u8 a = cpu.reg(ProcessingUnit::Register::A);
208 const u8 h = cpu.reg(ProcessingUnit::Register::H);
209 const u8 carry = cpu.get_flag_c() ? 1 : 0;
210 const int result = a - h - carry;
211 const int half_carry = (a & 0x0F) - (h & 0x0F) - carry;
213 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
214 cpu.setFlag(ProcessingUnit::Flag::N,
true);
215 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
216 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
218 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
219 return totalMachineCycles(1);
224 const u8 a = cpu.reg(ProcessingUnit::Register::A);
225 const u8 l = cpu.reg(ProcessingUnit::Register::L);
226 const u8 carry = cpu.get_flag_c() ? 1 : 0;
227 const int result = a - l - carry;
228 const int half_carry = (a & 0x0F) - (l & 0x0F) - carry;
230 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
231 cpu.setFlag(ProcessingUnit::Flag::N,
true);
232 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
233 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
235 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
236 return totalMachineCycles(1);
241 const u8 a = cpu.reg(ProcessingUnit::Register::A);
242 const u8 value = mmu.read(cpu.get_hl());
243 const u8 carry = cpu.get_flag_c() ? 1 : 0;
244 const int result = a - value - carry;
245 const int half_carry = (a & 0x0F) - (value & 0x0F) - carry;
247 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
248 cpu.setFlag(ProcessingUnit::Flag::N,
true);
249 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
250 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
252 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
253 return totalMachineCycles(2);
258 const u8 a = cpu.reg(ProcessingUnit::Register::A);
259 const u8 carry = cpu.get_flag_c() ? 1 : 0;
260 const int result = a - a - carry;
261 const int half_carry = (a & 0x0F) - (a & 0x0F) - carry;
263 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
264 cpu.setFlag(ProcessingUnit::Flag::N,
true);
265 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
266 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
268 cpu.reg(ProcessingUnit::Register::A) =
static_cast<u8
>(result);
269 return totalMachineCycles(1);