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 carry = (value >> 7) & 1;
15 u8 result = (value << 1) | carry;
17 cpu.reg(ProcessingUnit::Register::B) = result;
18 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
19 cpu.setFlag(ProcessingUnit::Flag::N,
false);
20 cpu.setFlag(ProcessingUnit::Flag::H,
false);
21 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
23 return totalMachineCycles(2);
28 u8 value = cpu.reg(ProcessingUnit::Register::C);
30 u8 carry = (value >> 7) & 1;
31 u8 result = (value << 1) | carry;
33 cpu.reg(ProcessingUnit::Register::C) = result;
34 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
35 cpu.setFlag(ProcessingUnit::Flag::N,
false);
36 cpu.setFlag(ProcessingUnit::Flag::H,
false);
37 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
39 return totalMachineCycles(2);
44 u8 value = cpu.reg(ProcessingUnit::Register::D);
46 u8 carry = (value >> 7) & 1;
47 u8 result = (value << 1) | carry;
49 cpu.reg(ProcessingUnit::Register::D) = result;
50 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
51 cpu.setFlag(ProcessingUnit::Flag::N,
false);
52 cpu.setFlag(ProcessingUnit::Flag::H,
false);
53 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
55 return totalMachineCycles(2);
60 u8 value = cpu.reg(ProcessingUnit::Register::E);
62 u8 carry = (value >> 7) & 1;
63 u8 result = (value << 1) | carry;
65 cpu.reg(ProcessingUnit::Register::E) = result;
66 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
67 cpu.setFlag(ProcessingUnit::Flag::N,
false);
68 cpu.setFlag(ProcessingUnit::Flag::H,
false);
69 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
71 return totalMachineCycles(2);
76 u8 value = cpu.reg(ProcessingUnit::Register::H);
78 u8 carry = (value >> 7) & 1;
79 u8 result = (value << 1) | carry;
81 cpu.reg(ProcessingUnit::Register::H) = result;
82 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
83 cpu.setFlag(ProcessingUnit::Flag::N,
false);
84 cpu.setFlag(ProcessingUnit::Flag::H,
false);
85 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
87 return totalMachineCycles(2);
92 u8 value = cpu.reg(ProcessingUnit::Register::L);
94 u8 carry = (value >> 7) & 1;
95 u8 result = (value << 1) | carry;
97 cpu.reg(ProcessingUnit::Register::L) = result;
98 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
99 cpu.setFlag(ProcessingUnit::Flag::N,
false);
100 cpu.setFlag(ProcessingUnit::Flag::H,
false);
101 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
103 return totalMachineCycles(2);
108 u16 address = cpu.get_hl();
109 u8 value = mmu.read(address);
111 u8 carry = (value >> 7) & 1;
112 u8 result = (value << 1) | carry;
114 mmu.write(address, result);
115 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
116 cpu.setFlag(ProcessingUnit::Flag::N,
false);
117 cpu.setFlag(ProcessingUnit::Flag::H,
false);
118 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
120 return totalMachineCycles(4);
125 u8 value = cpu.reg(ProcessingUnit::Register::A);
127 u8 carry = (value >> 7) & 1;
128 u8 result = (value << 1) | carry;
130 cpu.reg(ProcessingUnit::Register::A) = result;
131 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
132 cpu.setFlag(ProcessingUnit::Flag::N,
false);
133 cpu.setFlag(ProcessingUnit::Flag::H,
false);
134 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
136 return totalMachineCycles(2);
141 u8 value = cpu.reg(ProcessingUnit::Register::B);
143 u8 carry = value & 1;
144 u8 result = (value >> 1) | (carry << 7);
146 cpu.reg(ProcessingUnit::Register::B) = result;
147 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
148 cpu.setFlag(ProcessingUnit::Flag::N,
false);
149 cpu.setFlag(ProcessingUnit::Flag::H,
false);
150 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
152 return totalMachineCycles(2);
157 u8 value = cpu.reg(ProcessingUnit::Register::C);
159 u8 carry = value & 1;
160 u8 result = (value >> 1) | (carry << 7);
162 cpu.reg(ProcessingUnit::Register::C) = result;
163 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
164 cpu.setFlag(ProcessingUnit::Flag::N,
false);
165 cpu.setFlag(ProcessingUnit::Flag::H,
false);
166 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
168 return totalMachineCycles(2);
173 u8 value = cpu.reg(ProcessingUnit::Register::D);
175 u8 carry = value & 1;
176 u8 result = (value >> 1) | (carry << 7);
178 cpu.reg(ProcessingUnit::Register::D) = result;
179 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
180 cpu.setFlag(ProcessingUnit::Flag::N,
false);
181 cpu.setFlag(ProcessingUnit::Flag::H,
false);
182 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
184 return totalMachineCycles(2);
189 u8 value = cpu.reg(ProcessingUnit::Register::E);
191 u8 carry = value & 1;
192 u8 result = (value >> 1) | (carry << 7);
194 cpu.reg(ProcessingUnit::Register::E) = result;
195 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
196 cpu.setFlag(ProcessingUnit::Flag::N,
false);
197 cpu.setFlag(ProcessingUnit::Flag::H,
false);
198 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
200 return totalMachineCycles(2);
205 u8 value = cpu.reg(ProcessingUnit::Register::H);
207 u8 carry = value & 1;
208 u8 result = (value >> 1) | (carry << 7);
210 cpu.reg(ProcessingUnit::Register::H) = result;
211 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
212 cpu.setFlag(ProcessingUnit::Flag::N,
false);
213 cpu.setFlag(ProcessingUnit::Flag::H,
false);
214 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
216 return totalMachineCycles(2);
221 u8 value = cpu.reg(ProcessingUnit::Register::L);
223 u8 carry = value & 1;
224 u8 result = (value >> 1) | (carry << 7);
226 cpu.reg(ProcessingUnit::Register::L) = result;
227 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
228 cpu.setFlag(ProcessingUnit::Flag::N,
false);
229 cpu.setFlag(ProcessingUnit::Flag::H,
false);
230 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
232 return totalMachineCycles(2);
237 u16 address = cpu.get_hl();
238 u8 value = mmu.read(address);
240 u8 carry = value & 1;
241 u8 result = (value >> 1) | (carry << 7);
243 mmu.write(address, result);
244 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
245 cpu.setFlag(ProcessingUnit::Flag::N,
false);
246 cpu.setFlag(ProcessingUnit::Flag::H,
false);
247 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
249 return totalMachineCycles(4);
254 u8 value = cpu.reg(ProcessingUnit::Register::A);
256 u8 carry = value & 1;
257 u8 result = (value >> 1) | (carry << 7);
259 cpu.reg(ProcessingUnit::Register::A) = result;
260 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
261 cpu.setFlag(ProcessingUnit::Flag::N,
false);
262 cpu.setFlag(ProcessingUnit::Flag::H,
false);
263 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
265 return totalMachineCycles(2);