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,
true);
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,
true);
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,
true);
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,
true);
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,
true);
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,
true);
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,
true);
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,
true);
110 cpu.setFlag(ProcessingUnit::Flag::C,
false);
112 return totalMachineCycles(1);
117 const u8 result = cpu.reg(ProcessingUnit::Register::A) ^ cpu.reg(ProcessingUnit::Register::B);
118 cpu.reg(ProcessingUnit::Register::A) = result;
120 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
121 cpu.setFlag(ProcessingUnit::Flag::N,
false);
122 cpu.setFlag(ProcessingUnit::Flag::H,
false);
123 cpu.setFlag(ProcessingUnit::Flag::C,
false);
125 return totalMachineCycles(1);
130 const u8 result = cpu.reg(ProcessingUnit::Register::A) ^ cpu.reg(ProcessingUnit::Register::C);
131 cpu.reg(ProcessingUnit::Register::A) = result;
133 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
134 cpu.setFlag(ProcessingUnit::Flag::N,
false);
135 cpu.setFlag(ProcessingUnit::Flag::H,
false);
136 cpu.setFlag(ProcessingUnit::Flag::C,
false);
138 return totalMachineCycles(1);
143 const u8 result = cpu.reg(ProcessingUnit::Register::A) ^ cpu.reg(ProcessingUnit::Register::D);
144 cpu.reg(ProcessingUnit::Register::A) = result;
146 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
147 cpu.setFlag(ProcessingUnit::Flag::N,
false);
148 cpu.setFlag(ProcessingUnit::Flag::H,
false);
149 cpu.setFlag(ProcessingUnit::Flag::C,
false);
151 return totalMachineCycles(1);
156 const u8 result = cpu.reg(ProcessingUnit::Register::A) ^ cpu.reg(ProcessingUnit::Register::E);
157 cpu.reg(ProcessingUnit::Register::A) = result;
159 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
160 cpu.setFlag(ProcessingUnit::Flag::N,
false);
161 cpu.setFlag(ProcessingUnit::Flag::H,
false);
162 cpu.setFlag(ProcessingUnit::Flag::C,
false);
164 return totalMachineCycles(1);
169 const u8 result = cpu.reg(ProcessingUnit::Register::A) ^ cpu.reg(ProcessingUnit::Register::H);
170 cpu.reg(ProcessingUnit::Register::A) = result;
172 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
173 cpu.setFlag(ProcessingUnit::Flag::N,
false);
174 cpu.setFlag(ProcessingUnit::Flag::H,
false);
175 cpu.setFlag(ProcessingUnit::Flag::C,
false);
177 return totalMachineCycles(1);
182 const u8 result = cpu.reg(ProcessingUnit::Register::A) ^ cpu.reg(ProcessingUnit::Register::L);
183 cpu.reg(ProcessingUnit::Register::A) = result;
185 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
186 cpu.setFlag(ProcessingUnit::Flag::N,
false);
187 cpu.setFlag(ProcessingUnit::Flag::H,
false);
188 cpu.setFlag(ProcessingUnit::Flag::C,
false);
190 return totalMachineCycles(1);
195 const u8 value = mmu.read(cpu.get_hl());
196 const u8 result = cpu.reg(ProcessingUnit::Register::A) ^ value;
197 cpu.reg(ProcessingUnit::Register::A) = result;
199 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
200 cpu.setFlag(ProcessingUnit::Flag::N,
false);
201 cpu.setFlag(ProcessingUnit::Flag::H,
false);
202 cpu.setFlag(ProcessingUnit::Flag::C,
false);
204 return totalMachineCycles(2);
209 const u8 result = cpu.reg(ProcessingUnit::Register::A) ^ cpu.reg(ProcessingUnit::Register::A);
210 cpu.reg(ProcessingUnit::Register::A) = result;
212 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
213 cpu.setFlag(ProcessingUnit::Flag::N,
false);
214 cpu.setFlag(ProcessingUnit::Flag::H,
false);
215 cpu.setFlag(ProcessingUnit::Flag::C,
false);
217 return totalMachineCycles(1);