GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
cb_op_03.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_swap_b(ProcessingUnit& cpu, MMU& mmu) // 0xCB30
11{
12 u8 value = cpu.reg(ProcessingUnit::Register::B);
13
14 u8 result = (value >> 4) | (value << 4);
15
16 cpu.reg(ProcessingUnit::Register::B) = result;
17 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
18 cpu.setFlag(ProcessingUnit::Flag::N, false);
19 cpu.setFlag(ProcessingUnit::Flag::H, false);
20 cpu.setFlag(ProcessingUnit::Flag::C, false);
21
22 return totalMachineCycles(2);
23}
24
25int op_swap_c(ProcessingUnit& cpu, MMU& mmu) // 0xCB31
26{
27 u8 value = cpu.reg(ProcessingUnit::Register::C);
28
29 u8 result = (value >> 4) | (value << 4);
30
31 cpu.reg(ProcessingUnit::Register::C) = result;
32 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
33 cpu.setFlag(ProcessingUnit::Flag::N, false);
34 cpu.setFlag(ProcessingUnit::Flag::H, false);
35 cpu.setFlag(ProcessingUnit::Flag::C, false);
36
37 return totalMachineCycles(2);
38}
39
40int op_swap_d(ProcessingUnit& cpu, MMU& mmu) // 0xCB32
41{
42 u8 value = cpu.reg(ProcessingUnit::Register::D);
43
44 u8 result = (value >> 4) | (value << 4);
45
46 cpu.reg(ProcessingUnit::Register::D) = result;
47 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
48 cpu.setFlag(ProcessingUnit::Flag::N, false);
49 cpu.setFlag(ProcessingUnit::Flag::H, false);
50 cpu.setFlag(ProcessingUnit::Flag::C, false);
51
52 return totalMachineCycles(2);
53}
54
55int op_swap_e(ProcessingUnit& cpu, MMU& mmu) // 0xCB33
56{
57 u8 value = cpu.reg(ProcessingUnit::Register::E);
58
59 u8 result = (value >> 4) | (value << 4);
60
61 cpu.reg(ProcessingUnit::Register::E) = result;
62 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
63 cpu.setFlag(ProcessingUnit::Flag::N, false);
64 cpu.setFlag(ProcessingUnit::Flag::H, false);
65 cpu.setFlag(ProcessingUnit::Flag::C, false);
66
67 return totalMachineCycles(2);
68}
69
70int op_swap_h(ProcessingUnit& cpu, MMU& mmu) // 0xCB34
71{
72 u8 value = cpu.reg(ProcessingUnit::Register::H);
73
74 u8 result = (value >> 4) | (value << 4);
75
76 cpu.reg(ProcessingUnit::Register::H) = result;
77 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
78 cpu.setFlag(ProcessingUnit::Flag::N, false);
79 cpu.setFlag(ProcessingUnit::Flag::H, false);
80 cpu.setFlag(ProcessingUnit::Flag::C, false);
81
82 return totalMachineCycles(2);
83}
84
85int op_swap_l(ProcessingUnit& cpu, MMU& mmu) // 0xCB35
86{
87 u8 value = cpu.reg(ProcessingUnit::Register::L);
88
89 u8 result = (value >> 4) | (value << 4);
90
91 cpu.reg(ProcessingUnit::Register::L) = result;
92 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
93 cpu.setFlag(ProcessingUnit::Flag::N, false);
94 cpu.setFlag(ProcessingUnit::Flag::H, false);
95 cpu.setFlag(ProcessingUnit::Flag::C, false);
96
97 return totalMachineCycles(2);
98}
99
100int op_swap_hl(ProcessingUnit& cpu, MMU& mmu) // 0xCB36
101{
102 u16 address = cpu.get_hl();
103
104 u8 value = mmu.read(address);
105 u8 result = (value >> 4) | (value << 4);
106
107 mmu.write(address, result);
108
109 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
110 cpu.setFlag(ProcessingUnit::Flag::N, false);
111 cpu.setFlag(ProcessingUnit::Flag::H, false);
112 cpu.setFlag(ProcessingUnit::Flag::C, false);
113
114 return totalMachineCycles(4);
115}
116
117int op_swap_a(ProcessingUnit& cpu, MMU& mmu) // 0xCB37
118{
119 u8 value = cpu.reg(ProcessingUnit::Register::A);
120
121 u8 result = (value >> 4) | (value << 4);
122
123 cpu.reg(ProcessingUnit::Register::A) = result;
124 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
125 cpu.setFlag(ProcessingUnit::Flag::N, false);
126 cpu.setFlag(ProcessingUnit::Flag::H, false);
127 cpu.setFlag(ProcessingUnit::Flag::C, false);
128
129 return totalMachineCycles(2);
130}
131
132int op_srl_b(ProcessingUnit& cpu, MMU& mmu) // 0xCB38
133{
134 u8 value = cpu.reg(ProcessingUnit::Register::B);
135
136 u8 carry = value & 0x01;
137 u8 result = value >> 1;
138
139 cpu.reg(ProcessingUnit::Register::B) = 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, carry == 1);
144
145 return totalMachineCycles(2);
146}
147
148int op_srl_c(ProcessingUnit& cpu, MMU& mmu) // 0xCB39
149{
150 u8 value = cpu.reg(ProcessingUnit::Register::C);
151
152 u8 carry = value & 0x01;
153 u8 result = value >> 1;
154
155 cpu.reg(ProcessingUnit::Register::C) = result;
156 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
157 cpu.setFlag(ProcessingUnit::Flag::N, false);
158 cpu.setFlag(ProcessingUnit::Flag::H, false);
159 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
160
161 return totalMachineCycles(2);
162}
163
164int op_srl_d(ProcessingUnit& cpu, MMU& mmu) // 0xCB3A
165{
166 u8 value = cpu.reg(ProcessingUnit::Register::D);
167
168 u8 carry = value & 0x01;
169 u8 result = value >> 1;
170
171 cpu.reg(ProcessingUnit::Register::D) = result;
172 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
173 cpu.setFlag(ProcessingUnit::Flag::N, false);
174 cpu.setFlag(ProcessingUnit::Flag::H, false);
175 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
176
177 return totalMachineCycles(2);
178}
179
180int op_srl_e(ProcessingUnit& cpu, MMU& mmu) // 0xCB3B
181{
182 u8 value = cpu.reg(ProcessingUnit::Register::E);
183
184 u8 carry = value & 0x01;
185 u8 result = value >> 1;
186
187 cpu.reg(ProcessingUnit::Register::E) = result;
188 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
189 cpu.setFlag(ProcessingUnit::Flag::N, false);
190 cpu.setFlag(ProcessingUnit::Flag::H, false);
191 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
192
193 return totalMachineCycles(2);
194}
195
196int op_srl_h(ProcessingUnit& cpu, MMU& mmu) // 0xCB3C
197{
198 u8 value = cpu.reg(ProcessingUnit::Register::H);
199
200 u8 carry = value & 0x01;
201 u8 result = value >> 1;
202
203 cpu.reg(ProcessingUnit::Register::H) = result;
204 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
205 cpu.setFlag(ProcessingUnit::Flag::N, false);
206 cpu.setFlag(ProcessingUnit::Flag::H, false);
207 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
208
209 return totalMachineCycles(2);
210}
211
212int op_srl_l(ProcessingUnit& cpu, MMU& mmu) // 0xCB3D
213{
214 u8 value = cpu.reg(ProcessingUnit::Register::L);
215
216 u8 carry = value & 0x01;
217 u8 result = value >> 1;
218
219 cpu.reg(ProcessingUnit::Register::L) = result;
220 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
221 cpu.setFlag(ProcessingUnit::Flag::N, false);
222 cpu.setFlag(ProcessingUnit::Flag::H, false);
223 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
224
225 return totalMachineCycles(2);
226}
227
228int op_srl_hl(ProcessingUnit& cpu, MMU& mmu) // 0xCB3E
229{
230 u16 address = cpu.get_hl();
231
232 u8 value = mmu.read(address);
233 u8 carry = value & 0x01;
234 u8 result = value >> 1;
235
236 mmu.write(address, result);
237
238 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
239 cpu.setFlag(ProcessingUnit::Flag::N, false);
240 cpu.setFlag(ProcessingUnit::Flag::H, false);
241 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
242
243 return totalMachineCycles(4);
244}
245
246int op_srl_a(ProcessingUnit& cpu, MMU& mmu) // 0xCB3F
247{
248 u8 value = cpu.reg(ProcessingUnit::Register::A);
249
250 u8 carry = value & 0x01;
251 u8 result = value >> 1;
252
253 cpu.reg(ProcessingUnit::Register::A) = result;
254 cpu.setFlag(ProcessingUnit::Flag::Z, result == 0);
255 cpu.setFlag(ProcessingUnit::Flag::N, false);
256 cpu.setFlag(ProcessingUnit::Flag::H, false);
257 cpu.setFlag(ProcessingUnit::Flag::C, carry == 1);
258
259 return totalMachineCycles(2);
260}
Definition mmu.hpp:12