GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
cb_op_01.cpp
1#include "../../../../../include/ProcessingUnit.hpp"
2#include "../../../../../include/cb_opcodes.hpp"
3#include "../../../../../include/mmu.hpp"
4
5constexpr int machine_cycles = 4;
6#define totalMachineCycles(n) ((n) * machine_cycles)
7
8#define DUMMY(name) int name(ProcessingUnit&, MMU&) { return totalMachineCycles(1); }
9
10int op_rl_b(ProcessingUnit& cpu, MMU& mmu) // 0xCB10
11{
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;
15
16 u8 result = (value << 1) | old_carry;
17
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);
23
24 return totalMachineCycles(2);
25}
26
27int op_rl_c(ProcessingUnit& cpu, MMU& mmu) // 0xCB11
28{
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;
32
33 u8 result = (value << 1) | old_carry;
34
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);
40
41 return totalMachineCycles(2);
42}
43
44int op_rl_d(ProcessingUnit& cpu, MMU& mmu) // 0xCB12
45{
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;
49
50 u8 result = (value << 1) | old_carry;
51
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);
57
58 return totalMachineCycles(2);
59}
60
61int op_rl_e(ProcessingUnit& cpu, MMU& mmu) // 0xCB13
62{
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;
66
67 u8 result = (value << 1) | old_carry;
68
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);
74
75 return totalMachineCycles(2);
76}
77
78int op_rl_h(ProcessingUnit& cpu, MMU& mmu) // 0xCB14
79{
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;
83
84 u8 result = (value << 1) | old_carry;
85
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);
91
92 return totalMachineCycles(2);
93}
94
95int op_rl_l(ProcessingUnit& cpu, MMU& mmu) // 0xCB15
96{
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;
100
101 u8 result = (value << 1) | old_carry;
102
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);
108
109 return totalMachineCycles(2);
110}
111
112int op_rl_hl(ProcessingUnit& cpu, MMU& mmu) // 0xCB16
113{
114 u16 address = cpu.get_hl();
115 u8 value = mmu.read(address);
116
117 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
118 u8 new_carry = (value >> 7) & 1;
119
120 u8 result = (value << 1) | old_carry;
121 mmu.write(address, result);
122
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);
127
128 return totalMachineCycles(4);
129}
130
131int op_rl_a(ProcessingUnit& cpu, MMU& mmu) // 0xCB17
132{
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;
136
137 u8 result = (value << 1) | old_carry;
138
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);
144
145 return totalMachineCycles(2);
146}
147
148int op_rr_b(ProcessingUnit& cpu, MMU& mmu) // 0xCB18
149{
150 u8 value = cpu.reg(ProcessingUnit::Register::B);
151 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
152 u8 new_carry = value & 1;
153
154 u8 result = (value >> 1) | (old_carry << 7);
155
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);
161
162 return totalMachineCycles(2);
163}
164
165int op_rr_c(ProcessingUnit& cpu, MMU& mmu) // 0xCB19
166{
167 u8 value = cpu.reg(ProcessingUnit::Register::C);
168 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
169 u8 new_carry = value & 1;
170
171 u8 result = (value >> 1) | (old_carry << 7);
172
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);
178
179 return totalMachineCycles(2);
180}
181
182int op_rr_d(ProcessingUnit& cpu, MMU& mmu) // 0xCB1A
183{
184 u8 value = cpu.reg(ProcessingUnit::Register::D);
185 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
186 u8 new_carry = value & 1;
187
188 u8 result = (value >> 1) | (old_carry << 7);
189
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);
195
196 return totalMachineCycles(2);
197}
198
199int op_rr_e(ProcessingUnit& cpu, MMU& mmu) // 0xCB1B
200{
201 u8 value = cpu.reg(ProcessingUnit::Register::E);
202 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
203 u8 new_carry = value & 1;
204
205 u8 result = (value >> 1) | (old_carry << 7);
206
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);
212
213 return totalMachineCycles(2);
214}
215
216int op_rr_h(ProcessingUnit& cpu, MMU& mmu) // 0xCB1C
217{
218 u8 value = cpu.reg(ProcessingUnit::Register::H);
219 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
220 u8 new_carry = value & 1;
221
222 u8 result = (value >> 1) | (old_carry << 7);
223
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);
229
230 return totalMachineCycles(2);
231}
232
233int op_rr_l(ProcessingUnit& cpu, MMU& mmu) // 0xCB1D
234{
235 u8 value = cpu.reg(ProcessingUnit::Register::L);
236 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
237 u8 new_carry = value & 1;
238
239 u8 result = (value >> 1) | (old_carry << 7);
240
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);
246
247 return totalMachineCycles(2);
248}
249
250int op_rr_hl(ProcessingUnit& cpu, MMU& mmu) // 0xCB1E
251{
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;
256
257 u8 result = (value >> 1) | (old_carry << 7);
258 mmu.write(address,result);
259
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);
264
265 return totalMachineCycles(4);
266}
267
268int op_rr_a(ProcessingUnit& cpu, MMU& mmu) // 0xCB1F
269{
270 u8 value = cpu.reg(ProcessingUnit::Register::A);
271 u8 old_carry = cpu.get_flag_c() ? 1 : 0;
272 u8 new_carry = value & 1;
273
274 u8 result = (value >> 1) | (old_carry << 7);
275
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);
281
282 return totalMachineCycles(2);
283}
Definition mmu.hpp:12