summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpu.c66
1 files changed, 46 insertions, 20 deletions
diff --git a/cpu.c b/cpu.c
index 65e60d4..8c88959 100644
--- a/cpu.c
+++ b/cpu.c
@@ -244,7 +244,7 @@ bit(uint8_t arg)
244{ 244{
245 regs.status.zero = (regs.a & arg) == 0; 245 regs.status.zero = (regs.a & arg) == 0;
246 regs.status.overflow = (arg & (1 << 6)) > 0; 246 regs.status.overflow = (arg & (1 << 6)) > 0;
247 regs.status.negative = (arg & (1 << 7)) > 0; 247 STATUS_UPDATE_NEGATIVE(arg);
248} 248}
249 249
250static void 250static void
@@ -329,7 +329,7 @@ cmp(uint8_t arg)
329 329
330 regs.status.carry = regs.a >= arg; 330 regs.status.carry = regs.a >= arg;
331 regs.status.zero = regs.a == arg; 331 regs.status.zero = regs.a == arg;
332 regs.status.negative = (tmp & (1 << 7)) > 0; 332 STATUS_UPDATE_NEGATIVE(tmp);
333} 333}
334 334
335static void 335static void
@@ -341,7 +341,7 @@ cpx(uint8_t arg)
341 341
342 regs.status.carry = regs.x >= arg; 342 regs.status.carry = regs.x >= arg;
343 regs.status.zero = regs.x == arg; 343 regs.status.zero = regs.x == arg;
344 regs.status.negative = (tmp & (1 << 7)) > 0; 344 STATUS_UPDATE_NEGATIVE(tmp);
345} 345}
346 346
347static void 347static void
@@ -353,37 +353,52 @@ cpy(uint8_t arg)
353 353
354 regs.status.carry = regs.y >= arg; 354 regs.status.carry = regs.y >= arg;
355 regs.status.zero = regs.y == arg; 355 regs.status.zero = regs.y == arg;
356 regs.status.negative = (tmp & (1 << 7)) > 0; 356 STATUS_UPDATE_NEGATIVE(tmp);
357} 357}
358 358
359static void 359static void
360dec(uint16_t mem) 360dec(uint16_t mem)
361{ 361{
362 memwrite(mem, peek(mem) - 1); 362 memwrite(mem, peek(mem) - 1);
363
364 STATUS_UPDATE_ZERO(peek(mem));
365 STATUS_UPDATE_NEGATIVE(peek(mem));
363} 366}
364 367
365static void 368static void
366dex(uint8_t arg) 369dex(void)
367{ 370{
368/* TODO: complete this */ 371 regs.x--;
372
373 STATUS_UPDATE_ZERO(regs.x);
374 STATUS_UPDATE_NEGATIVE(regs.x);
369} 375}
370 376
371static void 377static void
372dey(uint8_t arg) 378dey(void)
373{ 379{
374/* TODO: complete this */ 380 regs.y--;
381
382 STATUS_UPDATE_ZERO(regs.y);
383 STATUS_UPDATE_NEGATIVE(regs.y);
375} 384}
376 385
377static void 386static void
378eor(uint8_t arg) 387eor(uint8_t arg)
379{ 388{
380/* TODO: complete this */ 389 regs.a ^= arg;
390
391 STATUS_UPDATE_ZERO(regs.a);
392 STATUS_UPDATE_NEGATIVE(regs.a);
381} 393}
382 394
383static void 395static void
384inc(uint8_t arg) 396inc(uint16_t mem)
385{ 397{
386/* TODO: complete this */ 398 memwrite(mem, peek(mem) + 1);
399
400 STATUS_UPDATE_ZERO(peek(mem));
401 STATUS_UPDATE_NEGATIVE(peek(mem));
387} 402}
388 403
389static void 404static void
@@ -398,13 +413,16 @@ inx(void)
398static void 413static void
399iny(uint8_t arg) 414iny(uint8_t arg)
400{ 415{
401/* TODO: complete this */ 416 regs.y++;
417
418 STATUS_UPDATE_ZERO(regs.y);
419 STATUS_UPDATE_NEGATIVE(regs.y);
402} 420}
403 421
404static void 422static void
405jmp(uint8_t arg) 423jmp(uint8_t arg)
406{ 424{
407/* TODO: complete this */ 425 regs.pc = arg;
408} 426}
409 427
410static void 428static void
@@ -416,7 +434,6 @@ jsr(uint8_t arg)
416static void 434static void
417lda(uint8_t arg) 435lda(uint8_t arg)
418{ 436{
419 printf("arg1 $%02X\n", arg);
420 regs.a = arg; 437 regs.a = arg;
421 438
422 STATUS_UPDATE_ZERO(regs.a); 439 STATUS_UPDATE_ZERO(regs.a);
@@ -426,13 +443,19 @@ lda(uint8_t arg)
426static void 443static void
427ldx(uint8_t arg) 444ldx(uint8_t arg)
428{ 445{
429/* TODO: complete this */ 446 regs.x = arg;
447
448 STATUS_UPDATE_ZERO(regs.x);
449 STATUS_UPDATE_NEGATIVE(regs.x);
430} 450}
431 451
432static void 452static void
433ldy(uint8_t arg) 453ldy(uint8_t arg)
434{ 454{
435/* TODO: complete this */ 455 regs.y = arg;
456
457 STATUS_UPDATE_ZERO(regs.y);
458 STATUS_UPDATE_NEGATIVE(regs.y);
436} 459}
437 460
438static void 461static void
@@ -444,13 +467,16 @@ lsr(uint8_t arg)
444static void 467static void
445nop(uint8_t arg) 468nop(uint8_t arg)
446{ 469{
447/* TODO: complete this */ 470 return;
448} 471}
449 472
450static void 473static void
451ora(uint8_t arg) 474ora(uint8_t arg)
452{ 475{
453/* TODO: complete this */ 476 regs.a |= arg;
477
478 STATUS_UPDATE_ZERO(regs.a);
479 STATUS_UPDATE_NEGATIVE(regs.a);
454} 480}
455 481
456static void 482static void
@@ -975,11 +1001,11 @@ interpret(void)
975 cycles += 7; 1001 cycles += 7;
976 break; 1002 break;
977 case 0xca: 1003 case 0xca:
978 dex(opcode_arg(AM_ACC)); 1004 dex();
979 cycles += 2; 1005 cycles += 2;
980 break; 1006 break;
981 case 0x88: 1007 case 0x88:
982 dey(opcode_arg(AM_ACC)); 1008 dey();
983 cycles += 2; 1009 cycles += 2;
984 break; 1010 break;
985 case 0x49: 1011 case 0x49: