GameBoy Emulator 1
Game Boy emulator core and tooling
Loading...
Searching...
No Matches
op_09.cpp
1#include "../../../../../include/ProcessingUnit.hpp"
2#include "../../../../../include/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_sub_b(ProcessingUnit &cpu, MMU &mmu) // 0x90
11{
12 const u8 a = cpu.reg(ProcessingUnit::Register::A);
13 const u8 b = cpu.reg(ProcessingUnit::Register::B);
14 const int result = a - b;
15 const int half_carry = (a & 0x0F) - (b & 0x0F);
16
17 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
18 cpu.setFlag(ProcessingUnit::Flag::N, true);
19 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
20 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
21
22 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
23 return totalMachineCycles(1);
24}
25
26int op_sub_c(ProcessingUnit &cpu, MMU &mmu) // 0x91
27{
28 const u8 a = cpu.reg(ProcessingUnit::Register::A);
29 const u8 c = cpu.reg(ProcessingUnit::Register::C);
30 const int result = a - c;
31 const int half_carry = (a & 0x0F) - (c & 0x0F);
32
33 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
34 cpu.setFlag(ProcessingUnit::Flag::N, true);
35 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
36 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
37
38 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
39 return totalMachineCycles(1);
40}
41
42int op_sub_d(ProcessingUnit &cpu, MMU &mmu) // 0x92
43{
44 const u8 a = cpu.reg(ProcessingUnit::Register::A);
45 const u8 d = cpu.reg(ProcessingUnit::Register::D);
46 const int result = a - d;
47 const int half_carry = (a & 0x0F) - (d & 0x0F);
48
49 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
50 cpu.setFlag(ProcessingUnit::Flag::N, true);
51 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
52 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
53
54 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
55 return totalMachineCycles(1);
56}
57
58int op_sub_e(ProcessingUnit &cpu, MMU &mmu) // 0x93
59{
60 const u8 a = cpu.reg(ProcessingUnit::Register::A);
61 const u8 e = cpu.reg(ProcessingUnit::Register::E);
62 const int result = a - e;
63 const int half_carry = (a & 0x0F) - (e & 0x0F);
64
65 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
66 cpu.setFlag(ProcessingUnit::Flag::N, true);
67 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
68 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
69
70 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
71 return totalMachineCycles(1);
72}
73
74int op_sub_h(ProcessingUnit &cpu, MMU &mmu) // 0x94
75{
76 const u8 a = cpu.reg(ProcessingUnit::Register::A);
77 const u8 h = cpu.reg(ProcessingUnit::Register::H);
78 const int result = a - h;
79 const int half_carry = (a & 0x0F) - (h & 0x0F);
80
81 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
82 cpu.setFlag(ProcessingUnit::Flag::N, true);
83 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
84 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
85
86 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
87 return totalMachineCycles(1);
88}
89
90int op_sub_l(ProcessingUnit &cpu, MMU &mmu) // 0x95
91{
92 const u8 a = cpu.reg(ProcessingUnit::Register::A);
93 const u8 l = cpu.reg(ProcessingUnit::Register::L);
94 const int result = a - l;
95 const int half_carry = (a & 0x0F) - (l & 0x0F);
96
97 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
98 cpu.setFlag(ProcessingUnit::Flag::N, true);
99 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
100 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
101
102 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
103 return totalMachineCycles(1);
104}
105
106int op_sub_hl(ProcessingUnit &cpu, MMU &mmu) // 0x96
107{
108 const u8 a = cpu.reg(ProcessingUnit::Register::A);
109 const u8 value = mmu.read(cpu.get_hl());
110 const int result = a - value;
111 const int half_carry = (a & 0x0F) - (value & 0x0F);
112
113 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
114 cpu.setFlag(ProcessingUnit::Flag::N, true);
115 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
116 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
117
118 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
119 return totalMachineCycles(2);
120}
121
122int op_sub_a(ProcessingUnit &cpu, MMU &mmu) // 0x97
123{
124 const u8 a = cpu.reg(ProcessingUnit::Register::A);
125 const int result = a - a;
126 const int half_carry = (a & 0x0F) - (a & 0x0F);
127
128 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
129 cpu.setFlag(ProcessingUnit::Flag::N, true);
130 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
131 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
132
133 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
134 return totalMachineCycles(1);
135}
136
137int op_sbc_a_b(ProcessingUnit &cpu, MMU &mmu) // 0x98
138{
139 const u8 a = cpu.reg(ProcessingUnit::Register::A);
140 const u8 b = cpu.reg(ProcessingUnit::Register::B);
141 const u8 carry = cpu.get_flag_c() ? 1 : 0;
142 const int result = a - b - carry;
143 const int half_carry = (a & 0x0F) - (b & 0x0F) - carry;
144
145 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
146 cpu.setFlag(ProcessingUnit::Flag::N, true);
147 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
148 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
149
150 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
151 return totalMachineCycles(1);
152}
153
154int op_sbc_a_c(ProcessingUnit &cpu, MMU &mmu) // 0x99
155{
156 const u8 a = cpu.reg(ProcessingUnit::Register::A);
157 const u8 c = cpu.reg(ProcessingUnit::Register::C);
158 const u8 carry = cpu.get_flag_c() ? 1 : 0;
159 const int result = a - c - carry;
160 const int half_carry = (a & 0x0F) - (c & 0x0F) - carry;
161
162 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
163 cpu.setFlag(ProcessingUnit::Flag::N, true);
164 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
165 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
166
167 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
168 return totalMachineCycles(1);
169}
170
171int op_sbc_a_d(ProcessingUnit &cpu, MMU &mmu) // 0x9A
172{
173 const u8 a = cpu.reg(ProcessingUnit::Register::A);
174 const u8 d = cpu.reg(ProcessingUnit::Register::D);
175 const u8 carry = cpu.get_flag_c() ? 1 : 0;
176 const int result = a - d - carry;
177 const int half_carry = (a & 0x0F) - (d & 0x0F) - carry;
178
179 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
180 cpu.setFlag(ProcessingUnit::Flag::N, true);
181 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
182 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
183
184 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
185 return totalMachineCycles(1);
186}
187
188int op_sbc_a_e(ProcessingUnit &cpu, MMU &mmu) // 0x9B
189{
190 const u8 a = cpu.reg(ProcessingUnit::Register::A);
191 const u8 e = cpu.reg(ProcessingUnit::Register::E);
192 const u8 carry = cpu.get_flag_c() ? 1 : 0;
193 const int result = a - e - carry;
194 const int half_carry = (a & 0x0F) - (e & 0x0F) - carry;
195
196 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
197 cpu.setFlag(ProcessingUnit::Flag::N, true);
198 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
199 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
200
201 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
202 return totalMachineCycles(1);
203}
204
205int op_sbc_a_h(ProcessingUnit &cpu, MMU &mmu) // 0x9C
206{
207 const u8 a = cpu.reg(ProcessingUnit::Register::A);
208 const u8 h = cpu.reg(ProcessingUnit::Register::H);
209 const u8 carry = cpu.get_flag_c() ? 1 : 0;
210 const int result = a - h - carry;
211 const int half_carry = (a & 0x0F) - (h & 0x0F) - carry;
212
213 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
214 cpu.setFlag(ProcessingUnit::Flag::N, true);
215 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
216 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
217
218 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
219 return totalMachineCycles(1);
220}
221
222int op_sbc_a_l(ProcessingUnit &cpu, MMU &mmu) // 0x9D
223{
224 const u8 a = cpu.reg(ProcessingUnit::Register::A);
225 const u8 l = cpu.reg(ProcessingUnit::Register::L);
226 const u8 carry = cpu.get_flag_c() ? 1 : 0;
227 const int result = a - l - carry;
228 const int half_carry = (a & 0x0F) - (l & 0x0F) - carry;
229
230 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
231 cpu.setFlag(ProcessingUnit::Flag::N, true);
232 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
233 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
234
235 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
236 return totalMachineCycles(1);
237}
238
239int op_sbc_a_hl(ProcessingUnit &cpu, MMU &mmu) // 0x9E
240{
241 const u8 a = cpu.reg(ProcessingUnit::Register::A);
242 const u8 value = mmu.read(cpu.get_hl());
243 const u8 carry = cpu.get_flag_c() ? 1 : 0;
244 const int result = a - value - carry;
245 const int half_carry = (a & 0x0F) - (value & 0x0F) - carry;
246
247 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
248 cpu.setFlag(ProcessingUnit::Flag::N, true);
249 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
250 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
251
252 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
253 return totalMachineCycles(2);
254}
255
256int op_sbc_a_a(ProcessingUnit &cpu, MMU &mmu) // 0x9F
257{
258 const u8 a = cpu.reg(ProcessingUnit::Register::A);
259 const u8 carry = cpu.get_flag_c() ? 1 : 0;
260 const int result = a - a - carry;
261 const int half_carry = (a & 0x0F) - (a & 0x0F) - carry;
262
263 cpu.setFlag(ProcessingUnit::Flag::Z, (result & 0xFF) == 0);
264 cpu.setFlag(ProcessingUnit::Flag::N, true);
265 cpu.setFlag(ProcessingUnit::Flag::H, half_carry < 0);
266 cpu.setFlag(ProcessingUnit::Flag::C, result < 0);
267
268 cpu.reg(ProcessingUnit::Register::A) = static_cast<u8>(result);
269 return totalMachineCycles(1);
270}
Definition mmu.hpp:12