summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpu.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/cpu.c b/cpu.c
index df9c852..bba0ed5 100644
--- a/cpu.c
+++ b/cpu.c
@@ -1,4 +1,5 @@
1#include <libgen.h> 1#include <libgen.h>
2#include <stdbool.h>
2#include <stdint.h> 3#include <stdint.h>
3#include <stdio.h> 4#include <stdio.h>
4#include <stdlib.h> 5#include <stdlib.h>
@@ -151,6 +152,20 @@ opcode_mem(enum addressing_mode mode)
151 return val; 152 return val;
152} 153}
153 154
155static void
156branch(uint16_t addr, bool cond)
157{
158 if (!cond)
159 return;
160 cycles++;
161
162 addr += regs.pc;
163 if ((regs.pc + 1) & 0xFF00 != addr & 0xFF00)
164 cycles++;
165
166 regs.pc = addr;
167}
168
154void 169void
155ADC(uint16_t arg) 170ADC(uint16_t arg)
156{ 171{
@@ -201,22 +216,19 @@ ASL(uint16_t mem)
201void 216void
202BCC(uint16_t arg) 217BCC(uint16_t arg)
203{ 218{
204 if (regs.status.carry == 0) 219 branch(arg, regs.status.carry == 0);
205 regs.pc += arg, cycles++;
206} 220}
207 221
208void 222void
209BCS(uint16_t arg) 223BCS(uint16_t arg)
210{ 224{
211 if (regs.status.carry == 1) 225 branch(arg, regs.status.carry == 1);
212 regs.pc += arg, cycles++;
213} 226}
214 227
215void 228void
216BEQ(uint16_t arg) 229BEQ(uint16_t arg)
217{ 230{
218 if (regs.status.zero == 1) 231 branch(arg, regs.status.zero == 1);
219 regs.pc += arg, cycles++;
220} 232}
221 233
222void 234void
@@ -232,22 +244,19 @@ BIT(uint16_t arg)
232void 244void
233BMI(uint16_t arg) 245BMI(uint16_t arg)
234{ 246{
235 if (regs.status.negative == 1) 247 branch(arg, regs.status.negative == 1);
236 regs.pc += arg, cycles++;
237} 248}
238 249
239void 250void
240BNE(uint16_t arg) 251BNE(uint16_t arg)
241{ 252{
242 if (regs.status.zero == 0) 253 branch(arg, regs.status.zero == 0);
243 regs.pc += arg, cycles++;
244} 254}
245 255
246void 256void
247BPL(uint16_t arg) 257BPL(uint16_t arg)
248{ 258{
249 if (regs.status.negative == 0) 259 branch(arg, regs.status.negative == 0);
250 regs.pc += arg, cycles++;
251} 260}
252 261
253void 262void
@@ -263,16 +272,14 @@ BVC(uint16_t arg)
263{ 272{
264 //regs.status.overflow = (STATUS_TO_INT() & (1 << 6)) == 0; 273 //regs.status.overflow = (STATUS_TO_INT() & (1 << 6)) == 0;
265 //if (regs.status.overflow == 0) 274 //if (regs.status.overflow == 0)
266 if ((STATUS_TO_INT() & (1 << 6)) == 0) 275 branch(arg, (STATUS_TO_INT() & (1 << 6)) == 0);
267 regs.pc += arg, cycles++;
268} 276}
269 277
270void 278void
271BVS(uint16_t arg) 279BVS(uint16_t arg)
272{ 280{
273 regs.status.overflow = (STATUS_TO_INT() & (1 << 6)) != 0; 281 regs.status.overflow = (STATUS_TO_INT() & (1 << 6)) != 0;
274 if (regs.status.overflow == 1) 282 branch(arg, regs.status.overflow == 1);
275 regs.pc += arg, cycles++;
276} 283}
277 284
278void 285void