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 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::B);
13 cpu.reg(ProcessingUnit::Register::A) = result;
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);
20 return totalMachineCycles(1);
25 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::C);
26 cpu.reg(ProcessingUnit::Register::A) = result;
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);
33 return totalMachineCycles(1);
38 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::D);
39 cpu.reg(ProcessingUnit::Register::A) = result;
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);
46 return totalMachineCycles(1);
51 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::E);
52 cpu.reg(ProcessingUnit::Register::A) = result;
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);
59 return totalMachineCycles(1);
64 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::H);
65 cpu.reg(ProcessingUnit::Register::A) = result;
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);
72 return totalMachineCycles(1);
77 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::L);
78 cpu.reg(ProcessingUnit::Register::A) = result;
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);
85 return totalMachineCycles(1);
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;
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);
99 return totalMachineCycles(2);
104 const u8 result = cpu.reg(ProcessingUnit::Register::A) | cpu.reg(ProcessingUnit::Register::A);
105 cpu.reg(ProcessingUnit::Register::A) = result;
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);
112 return totalMachineCycles(1);
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);
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);
127 return totalMachineCycles(1);
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);
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);
142 return totalMachineCycles(1);
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);
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);
157 return totalMachineCycles(1);
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);
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);
172 return totalMachineCycles(1);
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);
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);
187 return totalMachineCycles(1);
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);
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);
202 return totalMachineCycles(1);
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);
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);
217 return totalMachineCycles(2);
222 const u8 a = cpu.reg(ProcessingUnit::Register::A);
223 const int result = a - a;
224 const int half_carry = (a & 0x0F) - (a & 0x0F);
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);
231 return totalMachineCycles(1);