1#include "../../../../../include/ProcessingUnit.hpp"
2#include "../../../../../include/cb_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 u8 value = cpu.reg(ProcessingUnit::Register::B);
14 u8 result = (value >> 4) | (value << 4);
16 cpu.reg(ProcessingUnit::Register::B) = result;
17 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
18 cpu.setFlag(ProcessingUnit::Flag::N,
false);
19 cpu.setFlag(ProcessingUnit::Flag::H,
false);
20 cpu.setFlag(ProcessingUnit::Flag::C,
false);
22 return totalMachineCycles(2);
27 u8 value = cpu.reg(ProcessingUnit::Register::C);
29 u8 result = (value >> 4) | (value << 4);
31 cpu.reg(ProcessingUnit::Register::C) = result;
32 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
33 cpu.setFlag(ProcessingUnit::Flag::N,
false);
34 cpu.setFlag(ProcessingUnit::Flag::H,
false);
35 cpu.setFlag(ProcessingUnit::Flag::C,
false);
37 return totalMachineCycles(2);
42 u8 value = cpu.reg(ProcessingUnit::Register::D);
44 u8 result = (value >> 4) | (value << 4);
46 cpu.reg(ProcessingUnit::Register::D) = result;
47 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
48 cpu.setFlag(ProcessingUnit::Flag::N,
false);
49 cpu.setFlag(ProcessingUnit::Flag::H,
false);
50 cpu.setFlag(ProcessingUnit::Flag::C,
false);
52 return totalMachineCycles(2);
57 u8 value = cpu.reg(ProcessingUnit::Register::E);
59 u8 result = (value >> 4) | (value << 4);
61 cpu.reg(ProcessingUnit::Register::E) = result;
62 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
63 cpu.setFlag(ProcessingUnit::Flag::N,
false);
64 cpu.setFlag(ProcessingUnit::Flag::H,
false);
65 cpu.setFlag(ProcessingUnit::Flag::C,
false);
67 return totalMachineCycles(2);
72 u8 value = cpu.reg(ProcessingUnit::Register::H);
74 u8 result = (value >> 4) | (value << 4);
76 cpu.reg(ProcessingUnit::Register::H) = result;
77 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
78 cpu.setFlag(ProcessingUnit::Flag::N,
false);
79 cpu.setFlag(ProcessingUnit::Flag::H,
false);
80 cpu.setFlag(ProcessingUnit::Flag::C,
false);
82 return totalMachineCycles(2);
87 u8 value = cpu.reg(ProcessingUnit::Register::L);
89 u8 result = (value >> 4) | (value << 4);
91 cpu.reg(ProcessingUnit::Register::L) = result;
92 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
93 cpu.setFlag(ProcessingUnit::Flag::N,
false);
94 cpu.setFlag(ProcessingUnit::Flag::H,
false);
95 cpu.setFlag(ProcessingUnit::Flag::C,
false);
97 return totalMachineCycles(2);
102 u16 address = cpu.get_hl();
104 u8 value = mmu.read(address);
105 u8 result = (value >> 4) | (value << 4);
107 mmu.write(address, result);
109 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
110 cpu.setFlag(ProcessingUnit::Flag::N,
false);
111 cpu.setFlag(ProcessingUnit::Flag::H,
false);
112 cpu.setFlag(ProcessingUnit::Flag::C,
false);
114 return totalMachineCycles(4);
119 u8 value = cpu.reg(ProcessingUnit::Register::A);
121 u8 result = (value >> 4) | (value << 4);
123 cpu.reg(ProcessingUnit::Register::A) = result;
124 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
125 cpu.setFlag(ProcessingUnit::Flag::N,
false);
126 cpu.setFlag(ProcessingUnit::Flag::H,
false);
127 cpu.setFlag(ProcessingUnit::Flag::C,
false);
129 return totalMachineCycles(2);
134 u8 value = cpu.reg(ProcessingUnit::Register::B);
136 u8 carry = value & 0x01;
137 u8 result = value >> 1;
139 cpu.reg(ProcessingUnit::Register::B) = result;
140 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
141 cpu.setFlag(ProcessingUnit::Flag::N,
false);
142 cpu.setFlag(ProcessingUnit::Flag::H,
false);
143 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
145 return totalMachineCycles(2);
150 u8 value = cpu.reg(ProcessingUnit::Register::C);
152 u8 carry = value & 0x01;
153 u8 result = value >> 1;
155 cpu.reg(ProcessingUnit::Register::C) = result;
156 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
157 cpu.setFlag(ProcessingUnit::Flag::N,
false);
158 cpu.setFlag(ProcessingUnit::Flag::H,
false);
159 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
161 return totalMachineCycles(2);
166 u8 value = cpu.reg(ProcessingUnit::Register::D);
168 u8 carry = value & 0x01;
169 u8 result = value >> 1;
171 cpu.reg(ProcessingUnit::Register::D) = 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, carry == 1);
177 return totalMachineCycles(2);
182 u8 value = cpu.reg(ProcessingUnit::Register::E);
184 u8 carry = value & 0x01;
185 u8 result = value >> 1;
187 cpu.reg(ProcessingUnit::Register::E) = result;
188 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
189 cpu.setFlag(ProcessingUnit::Flag::N,
false);
190 cpu.setFlag(ProcessingUnit::Flag::H,
false);
191 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
193 return totalMachineCycles(2);
198 u8 value = cpu.reg(ProcessingUnit::Register::H);
200 u8 carry = value & 0x01;
201 u8 result = value >> 1;
203 cpu.reg(ProcessingUnit::Register::H) = result;
204 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
205 cpu.setFlag(ProcessingUnit::Flag::N,
false);
206 cpu.setFlag(ProcessingUnit::Flag::H,
false);
207 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
209 return totalMachineCycles(2);
214 u8 value = cpu.reg(ProcessingUnit::Register::L);
216 u8 carry = value & 0x01;
217 u8 result = value >> 1;
219 cpu.reg(ProcessingUnit::Register::L) = result;
220 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
221 cpu.setFlag(ProcessingUnit::Flag::N,
false);
222 cpu.setFlag(ProcessingUnit::Flag::H,
false);
223 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
225 return totalMachineCycles(2);
230 u16 address = cpu.get_hl();
232 u8 value = mmu.read(address);
233 u8 carry = value & 0x01;
234 u8 result = value >> 1;
236 mmu.write(address, result);
238 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
239 cpu.setFlag(ProcessingUnit::Flag::N,
false);
240 cpu.setFlag(ProcessingUnit::Flag::H,
false);
241 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
243 return totalMachineCycles(4);
248 u8 value = cpu.reg(ProcessingUnit::Register::A);
250 u8 carry = value & 0x01;
251 u8 result = value >> 1;
253 cpu.reg(ProcessingUnit::Register::A) = result;
254 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
255 cpu.setFlag(ProcessingUnit::Flag::N,
false);
256 cpu.setFlag(ProcessingUnit::Flag::H,
false);
257 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
259 return totalMachineCycles(2);