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);
13 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
14 u8 new_carry = (value >> 7) & 1;
16 u8 result = (value << 1) | old_carry;
18 cpu.reg(ProcessingUnit::Register::B) = result;
19 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
20 cpu.setFlag(ProcessingUnit::Flag::N,
false);
21 cpu.setFlag(ProcessingUnit::Flag::H,
false);
22 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
24 return totalMachineCycles(2);
29 u8 value = cpu.reg(ProcessingUnit::Register::C);
30 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
31 u8 new_carry = (value >> 7) & 1;
33 u8 result = (value << 1) | old_carry;
35 cpu.reg(ProcessingUnit::Register::C) = result;
36 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
37 cpu.setFlag(ProcessingUnit::Flag::N,
false);
38 cpu.setFlag(ProcessingUnit::Flag::H,
false);
39 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
41 return totalMachineCycles(2);
46 u8 value = cpu.reg(ProcessingUnit::Register::D);
47 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
48 u8 new_carry = (value >> 7) & 1;
50 u8 result = (value << 1) | old_carry;
52 cpu.reg(ProcessingUnit::Register::D) = result;
53 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
54 cpu.setFlag(ProcessingUnit::Flag::N,
false);
55 cpu.setFlag(ProcessingUnit::Flag::H,
false);
56 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
58 return totalMachineCycles(2);
63 u8 value = cpu.reg(ProcessingUnit::Register::E);
64 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
65 u8 new_carry = (value >> 7) & 1;
67 u8 result = (value << 1) | old_carry;
69 cpu.reg(ProcessingUnit::Register::E) = result;
70 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
71 cpu.setFlag(ProcessingUnit::Flag::N,
false);
72 cpu.setFlag(ProcessingUnit::Flag::H,
false);
73 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
75 return totalMachineCycles(2);
80 u8 value = cpu.reg(ProcessingUnit::Register::H);
81 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
82 u8 new_carry = (value >> 7) & 1;
84 u8 result = (value << 1) | old_carry;
86 cpu.reg(ProcessingUnit::Register::H) = result;
87 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
88 cpu.setFlag(ProcessingUnit::Flag::N,
false);
89 cpu.setFlag(ProcessingUnit::Flag::H,
false);
90 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
92 return totalMachineCycles(2);
97 u8 value = cpu.reg(ProcessingUnit::Register::L);
98 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
99 u8 new_carry = (value >> 7) & 1;
101 u8 result = (value << 1) | old_carry;
103 cpu.reg(ProcessingUnit::Register::L) = result;
104 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
105 cpu.setFlag(ProcessingUnit::Flag::N,
false);
106 cpu.setFlag(ProcessingUnit::Flag::H,
false);
107 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
109 return totalMachineCycles(2);
114 u16 address = cpu.get_hl();
115 u8 value = mmu.read(address);
117 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
118 u8 new_carry = (value >> 7) & 1;
120 u8 result = (value << 1) | old_carry;
121 mmu.write(address, result);
123 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
124 cpu.setFlag(ProcessingUnit::Flag::N,
false);
125 cpu.setFlag(ProcessingUnit::Flag::H,
false);
126 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
128 return totalMachineCycles(4);
133 u8 value = cpu.reg(ProcessingUnit::Register::A);
134 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
135 u8 new_carry = (value >> 7) & 1;
137 u8 result = (value << 1) | old_carry;
139 cpu.reg(ProcessingUnit::Register::A) = 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, new_carry == 1);
145 return totalMachineCycles(2);
150 u8 value = cpu.reg(ProcessingUnit::Register::B);
151 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
152 u8 new_carry = value & 1;
154 u8 result = (value >> 1) | (old_carry << 7);
156 cpu.reg(ProcessingUnit::Register::B) = result;
157 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
158 cpu.setFlag(ProcessingUnit::Flag::N,
false);
159 cpu.setFlag(ProcessingUnit::Flag::H,
false);
160 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
162 return totalMachineCycles(2);
167 u8 value = cpu.reg(ProcessingUnit::Register::C);
168 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
169 u8 new_carry = value & 1;
171 u8 result = (value >> 1) | (old_carry << 7);
173 cpu.reg(ProcessingUnit::Register::C) = result;
174 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
175 cpu.setFlag(ProcessingUnit::Flag::N,
false);
176 cpu.setFlag(ProcessingUnit::Flag::H,
false);
177 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
179 return totalMachineCycles(2);
184 u8 value = cpu.reg(ProcessingUnit::Register::D);
185 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
186 u8 new_carry = value & 1;
188 u8 result = (value >> 1) | (old_carry << 7);
190 cpu.reg(ProcessingUnit::Register::D) = result;
191 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
192 cpu.setFlag(ProcessingUnit::Flag::N,
false);
193 cpu.setFlag(ProcessingUnit::Flag::H,
false);
194 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
196 return totalMachineCycles(2);
201 u8 value = cpu.reg(ProcessingUnit::Register::E);
202 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
203 u8 new_carry = value & 1;
205 u8 result = (value >> 1) | (old_carry << 7);
207 cpu.reg(ProcessingUnit::Register::E) = result;
208 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
209 cpu.setFlag(ProcessingUnit::Flag::N,
false);
210 cpu.setFlag(ProcessingUnit::Flag::H,
false);
211 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
213 return totalMachineCycles(2);
218 u8 value = cpu.reg(ProcessingUnit::Register::H);
219 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
220 u8 new_carry = value & 1;
222 u8 result = (value >> 1) | (old_carry << 7);
224 cpu.reg(ProcessingUnit::Register::H) = result;
225 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
226 cpu.setFlag(ProcessingUnit::Flag::N,
false);
227 cpu.setFlag(ProcessingUnit::Flag::H,
false);
228 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
230 return totalMachineCycles(2);
235 u8 value = cpu.reg(ProcessingUnit::Register::L);
236 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
237 u8 new_carry = value & 1;
239 u8 result = (value >> 1) | (old_carry << 7);
241 cpu.reg(ProcessingUnit::Register::L) = result;
242 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
243 cpu.setFlag(ProcessingUnit::Flag::N,
false);
244 cpu.setFlag(ProcessingUnit::Flag::H,
false);
245 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
247 return totalMachineCycles(2);
252 u16 address = cpu.get_hl();
253 u8 value = mmu.read(address);
254 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
255 u8 new_carry = value & 1;
257 u8 result = (value >> 1) | (old_carry << 7);
258 mmu.write(address,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, new_carry == 1);
265 return totalMachineCycles(4);
270 u8 value = cpu.reg(ProcessingUnit::Register::A);
271 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
272 u8 new_carry = value & 1;
274 u8 result = (value >> 1) | (old_carry << 7);
276 cpu.reg(ProcessingUnit::Register::A) = result;
277 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
278 cpu.setFlag(ProcessingUnit::Flag::N,
false);
279 cpu.setFlag(ProcessingUnit::Flag::H,
false);
280 cpu.setFlag(ProcessingUnit::Flag::C, new_carry == 1);
282 return totalMachineCycles(2);