GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
cb_op_00.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_rlc_b(ProcessingUnit& cpu, MMU& mmu) // 0xCB00
11{
12 u8 value = cpu.reg(ProcessingUnit::Register::B);
13
14 u8 carry = (value >> 7) & 1;
15 u8 result = (value << 1) | carry;
16
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);
22
23 return totalMachineCycles(2);
24}
25
26int op_rlc_c(ProcessingUnit& cpu, MMU& mmu) // 0xCB01
27{
28 u8 value = cpu.reg(ProcessingUnit::Register::C);
29
30 u8 carry = (value >> 7) & 1;
31 u8 result = (value << 1) | carry;
32
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);
38
39 return totalMachineCycles(2);
40}
41
42int op_rlc_d(ProcessingUnit& cpu, MMU& mmu) // 0xCB02
43{
44 u8 value = cpu.reg(ProcessingUnit::Register::D);
45
46 u8 carry = (value >> 7) & 1;
47 u8 result = (value << 1) | carry;
48
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);
54
55 return totalMachineCycles(2);
56}
57
58int op_rlc_e(ProcessingUnit& cpu, MMU& mmu) // 0xCB03
59{
60 u8 value = cpu.reg(ProcessingUnit::Register::E);
61
62 u8 carry = (value >> 7) & 1;
63 u8 result = (value << 1) | carry;
64
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);
70
71 return totalMachineCycles(2);
72}
73
74int op_rlc_h(ProcessingUnit& cpu, MMU& mmu) // 0xCB04
75{
76 u8 value = cpu.reg(ProcessingUnit::Register::H);
77
78 u8 carry = (value >> 7) & 1;
79 u8 result = (value << 1) | carry;
80
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);
86
87 return totalMachineCycles(2);
88}
89
90int op_rlc_l(ProcessingUnit& cpu, MMU& mmu) // 0xCB05
91{
92 u8 value = cpu.reg(ProcessingUnit::Register::L);
93
94 u8 carry = (value >> 7) & 1;
95 u8 result = (value << 1) | carry;
96
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);
102
103 return totalMachineCycles(2);
104}
105
106int op_rlc_hl(ProcessingUnit& cpu, MMU& mmu) // 0xCB06
107{
108 u16 address = cpu.get_hl();
109 u8 value = mmu.read(address);
110
111 u8 carry = (value >> 7) & 1;
112 u8 result = (value << 1) | carry;
113
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);
119
120 return totalMachineCycles(4);
121}
122
123int op_rlc_a(ProcessingUnit& cpu, MMU& mmu) // 0xCB07
124{
125 u8 value = cpu.reg(ProcessingUnit::Register::A);
126
127 u8 carry = (value >> 7) & 1;
128 u8 result = (value << 1) | carry;
129
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);
135
136 return totalMachineCycles(2);
137}
138
139int op_rrc_b(ProcessingUnit& cpu, MMU& mmu) // 0xCB08
140{
141 u8 value = cpu.reg(ProcessingUnit::Register::B);
142
143 u8 carry = value & 1;
144 u8 result = (value >> 1) | (carry << 7);
145
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);
151
152 return totalMachineCycles(2);
153}
154
155int op_rrc_c(ProcessingUnit& cpu, MMU& mmu) // 0xCB09
156{
157 u8 value = cpu.reg(ProcessingUnit::Register::C);
158
159 u8 carry = value & 1;
160 u8 result = (value >> 1) | (carry << 7);
161
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);
167
168 return totalMachineCycles(2);
169}
170
171int op_rrc_d(ProcessingUnit& cpu, MMU& mmu) // 0xCB0A
172{
173 u8 value = cpu.reg(ProcessingUnit::Register::D);
174
175 u8 carry = value & 1;
176 u8 result = (value >> 1) | (carry << 7);
177
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);
183
184 return totalMachineCycles(2);
185}
186
187int op_rrc_e(ProcessingUnit& cpu, MMU& mmu) // 0xCB0B
188{
189 u8 value = cpu.reg(ProcessingUnit::Register::E);
190
191 u8 carry = value & 1;
192 u8 result = (value >> 1) | (carry << 7);
193
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);
199
200 return totalMachineCycles(2);
201}
202
203int op_rrc_h(ProcessingUnit& cpu, MMU& mmu) // 0xCB0C
204{
205 u8 value = cpu.reg(ProcessingUnit::Register::H);
206
207 u8 carry = value & 1;
208 u8 result = (value >> 1) | (carry << 7);
209
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);
215
216 return totalMachineCycles(2);
217}
218
219int op_rrc_l(ProcessingUnit& cpu, MMU& mmu) // 0xCB0D
220{
221 u8 value = cpu.reg(ProcessingUnit::Register::L);
222
223 u8 carry = value & 1;
224 u8 result = (value >> 1) | (carry << 7);
225
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);
231
232 return totalMachineCycles(2);
233}
234
235int op_rrc_hl(ProcessingUnit& cpu, MMU& mmu) // 0xCB0E
236{
237 u16 address = cpu.get_hl();
238 u8 value = mmu.read(address);
239
240 u8 carry = value & 1;
241 u8 result = (value >> 1) | (carry << 7);
242
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);
248
249 return totalMachineCycles(4);
250}
251
252int op_rrc_a(ProcessingUnit& cpu, MMU& mmu) // 0xCB0F
253{
254 u8 value = cpu.reg(ProcessingUnit::Register::A);
255
256 u8 carry = value & 1;
257 u8 result = (value >> 1) | (carry << 7);
258
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);
264
265 return totalMachineCycles(2);
266}
Definition mmu.hpp:12