GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
cb_op_02.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_sla_b(ProcessingUnit& cpu, MMU& mmu) // 0xCB20
11{
12 u8 value = cpu.reg(ProcessingUnit::Register::B);
13
14 u8 carry = (value >> 7) & 1;
15 u8 result = (value << 1);
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_sla_c(ProcessingUnit& cpu, MMU& mmu) // 0xCB21
27{
28 u8 value = cpu.reg(ProcessingUnit::Register::C);
29
30 u8 carry = (value >> 7) & 1;
31 u8 result = (value << 1);
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_sla_d(ProcessingUnit& cpu, MMU& mmu) // 0xCB22
43{
44 u8 value = cpu.reg(ProcessingUnit::Register::D);
45
46 u8 carry = (value >> 7) & 1;
47 u8 result = (value << 1);
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_sla_e(ProcessingUnit& cpu, MMU& mmu) // 0xCB23
59{
60 u8 value = cpu.reg(ProcessingUnit::Register::E);
61
62 u8 carry = (value >> 7) & 1;
63 u8 result = (value << 1);
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_sla_h(ProcessingUnit& cpu, MMU& mmu) // 0xCB24
75{
76 u8 value = cpu.reg(ProcessingUnit::Register::H);
77
78 u8 carry = (value >> 7) & 1;
79 u8 result = (value << 1);
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_sla_l(ProcessingUnit& cpu, MMU& mmu) // 0xCB25
91{
92 u8 value = cpu.reg(ProcessingUnit::Register::L);
93
94 u8 carry = (value >> 7) & 1;
95 u8 result = (value << 1);
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_sla_hl(ProcessingUnit& cpu, MMU& mmu) // 0xCB26
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);
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_sla_a(ProcessingUnit& cpu, MMU& mmu) // 0xCB27
124{
125 u8 value = cpu.reg(ProcessingUnit::Register::A);
126
127 u8 carry = (value >> 7) & 1;
128 u8 result = (value << 1);
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_sra_b(ProcessingUnit& cpu, MMU& mmu) // 0xCB28
140{
141 u8 value = cpu.reg(ProcessingUnit::Register::B);
142
143 u8 carry = value & 1;
144 u8 result = (value >> 1) | (value & 0x80);
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_sra_c(ProcessingUnit& cpu, MMU& mmu) // 0xCB29
156{
157 u8 value = cpu.reg(ProcessingUnit::Register::C);
158
159 u8 carry = value & 1;
160 u8 result = (value >> 1) | (value & 0x80);
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_sra_d(ProcessingUnit& cpu, MMU& mmu) // 0xCB2A
172{
173 u8 value = cpu.reg(ProcessingUnit::Register::D);
174
175 u8 carry = value & 1;
176 u8 result = (value >> 1) | (value & 0x80);
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_sra_e(ProcessingUnit& cpu, MMU& mmu) // 0xCB2B
188{
189 u8 value = cpu.reg(ProcessingUnit::Register::E);
190
191 u8 carry = value & 1;
192 u8 result = (value >> 1) | (value & 0x80);
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_sra_h(ProcessingUnit& cpu, MMU& mmu) // 0xCB2C
204{
205 u8 value = cpu.reg(ProcessingUnit::Register::H);
206
207 u8 carry = value & 1;
208 u8 result = (value >> 1) | (value & 0x80);
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_sra_l(ProcessingUnit& cpu, MMU& mmu) // 0xCB2D
220{
221 u8 value = cpu.reg(ProcessingUnit::Register::L);
222
223 u8 carry = value & 1;
224 u8 result = (value >> 1) | (value & 0x80);
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_sra_hl(ProcessingUnit& cpu, MMU& mmu) // 0xCB2E
236{
237 u16 address = cpu.get_hl();
238 u8 value = mmu.read(address);
239
240 u8 carry = value & 1;
241 u8 result = (value >> 1) | (value & 0x80);
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_sra_a(ProcessingUnit& cpu, MMU& mmu) // 0xCB2F
253{
254 u8 value = cpu.reg(ProcessingUnit::Register::A);
255
256 u8 carry = value & 1;
257 u8 result = (value >> 1) | (value & 0x80);
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