summaryrefslogtreecommitdiff
path: root/cpu.c
diff options
context:
space:
mode:
authorvin <git@vineetk.net>2024-06-30 15:46:18 -0400
committervin <git@vineetk.net>2024-06-30 15:46:25 -0400
commitf28733401ebfe5457a4a79a37fbd5d2001de90bd (patch)
tree0a6bc8f1db19c264c95196539a6527ab5c9c31d0 /cpu.c
parent47b8fac273d980f8d0893b2f6f4b363a9989070f (diff)
combine macro for updating N and Z status flags
Diffstat (limited to 'cpu.c')
-rw-r--r--cpu.c84
1 files changed, 30 insertions, 54 deletions
diff --git a/cpu.c b/cpu.c
index e79ebf1..0bbbc75 100644
--- a/cpu.c
+++ b/cpu.c
@@ -12,6 +12,9 @@
12 (regs.status.zero = r == 0) 12 (regs.status.zero = r == 0)
13#define STATUS_UPDATE_NEGATIVE(r) \ 13#define STATUS_UPDATE_NEGATIVE(r) \
14 (regs.status.negative = ((r & (1 << 7)) != 0)) 14 (regs.status.negative = ((r & (1 << 7)) != 0))
15#define STATUS_UPDATE_NZ(r) \
16 {STATUS_UPDATE_ZERO(r); \
17 STATUS_UPDATE_NEGATIVE(r);}
15#define STATUS_TO_INT() \ 18#define STATUS_TO_INT() \
16 (regs.status.carry | (regs.status.zero << 1) \ 19 (regs.status.carry | (regs.status.zero << 1) \
17 | (regs.status.interrupt_disable << 2) | (regs.status.decimal_mode << 3) \ 20 | (regs.status.interrupt_disable << 2) | (regs.status.decimal_mode << 3) \
@@ -224,8 +227,7 @@ adc(uint8_t arg)
224 regs.status.overflow = (~(regs.a ^ arg) & (regs.a ^ sum) & 0x80) != 0; 227 regs.status.overflow = (~(regs.a ^ arg) & (regs.a ^ sum) & 0x80) != 0;
225 regs.a = sum & 0xFF; 228 regs.a = sum & 0xFF;
226 229
227 STATUS_UPDATE_ZERO(regs.a); 230 STATUS_UPDATE_NZ(regs.a);
228 STATUS_UPDATE_NEGATIVE(regs.a);
229} 231}
230 232
231static void 233static void
@@ -233,8 +235,7 @@ and(uint8_t arg)
233{ 235{
234 regs.a &= arg; 236 regs.a &= arg;
235 237
236 STATUS_UPDATE_ZERO(regs.a); 238 STATUS_UPDATE_NZ(regs.a);
237 STATUS_UPDATE_NEGATIVE(regs.a);
238} 239}
239 240
240static void 241static void
@@ -246,8 +247,7 @@ asl_acc(void)
246 regs.a = tmp & 0xFF; 247 regs.a = tmp & 0xFF;
247 248
248 regs.status.carry = tmp > 0xFF; 249 regs.status.carry = tmp > 0xFF;
249 STATUS_UPDATE_ZERO(regs.a); 250 STATUS_UPDATE_NZ(regs.a);
250 STATUS_UPDATE_NEGATIVE(regs.a);
251} 251}
252 252
253static void 253static void
@@ -259,8 +259,7 @@ asl(uint16_t mem)
259 memwrite(mem, tmp & 0xFF); 259 memwrite(mem, tmp & 0xFF);
260 260
261 regs.status.carry = tmp > 0xFF; 261 regs.status.carry = tmp > 0xFF;
262 STATUS_UPDATE_ZERO(tmp); 262 STATUS_UPDATE_NZ(tmp);
263 STATUS_UPDATE_NEGATIVE(tmp);
264} 263}
265 264
266static void 265static void
@@ -405,8 +404,7 @@ dec(uint16_t mem)
405{ 404{
406 memwrite(mem, peek(mem) - 1); 405 memwrite(mem, peek(mem) - 1);
407 406
408 STATUS_UPDATE_ZERO(peek(mem)); 407 STATUS_UPDATE_NZ(peek(mem));
409 STATUS_UPDATE_NEGATIVE(peek(mem));
410} 408}
411 409
412static void 410static void
@@ -414,8 +412,7 @@ dex(void)
414{ 412{
415 regs.x--; 413 regs.x--;
416 414
417 STATUS_UPDATE_ZERO(regs.x); 415 STATUS_UPDATE_NZ(regs.x);
418 STATUS_UPDATE_NEGATIVE(regs.x);
419} 416}
420 417
421static void 418static void
@@ -423,8 +420,7 @@ dey(void)
423{ 420{
424 regs.y--; 421 regs.y--;
425 422
426 STATUS_UPDATE_ZERO(regs.y); 423 STATUS_UPDATE_NZ(regs.y);
427 STATUS_UPDATE_NEGATIVE(regs.y);
428} 424}
429 425
430static void 426static void
@@ -432,8 +428,7 @@ eor(uint8_t arg)
432{ 428{
433 regs.a ^= arg; 429 regs.a ^= arg;
434 430
435 STATUS_UPDATE_ZERO(regs.a); 431 STATUS_UPDATE_NZ(regs.a);
436 STATUS_UPDATE_NEGATIVE(regs.a);
437} 432}
438 433
439static void 434static void
@@ -441,8 +436,7 @@ inc(uint16_t mem)
441{ 436{
442 memwrite(mem, peek(mem) + 1); 437 memwrite(mem, peek(mem) + 1);
443 438
444 STATUS_UPDATE_ZERO(peek(mem)); 439 STATUS_UPDATE_NZ(peek(mem));
445 STATUS_UPDATE_NEGATIVE(peek(mem));
446} 440}
447 441
448static void 442static void
@@ -450,8 +444,7 @@ inx(void)
450{ 444{
451 regs.x++; 445 regs.x++;
452 446
453 STATUS_UPDATE_ZERO(regs.x); 447 STATUS_UPDATE_NZ(regs.x);
454 STATUS_UPDATE_NEGATIVE(regs.x);
455} 448}
456 449
457static void 450static void
@@ -459,8 +452,7 @@ iny(void)
459{ 452{
460 regs.y++; 453 regs.y++;
461 454
462 STATUS_UPDATE_ZERO(regs.y); 455 STATUS_UPDATE_NZ(regs.y);
463 STATUS_UPDATE_NEGATIVE(regs.y);
464} 456}
465 457
466static void 458static void
@@ -488,8 +480,7 @@ lda(uint8_t arg)
488{ 480{
489 regs.a = arg; 481 regs.a = arg;
490 482
491 STATUS_UPDATE_ZERO(regs.a); 483 STATUS_UPDATE_NZ(regs.a);
492 STATUS_UPDATE_NEGATIVE(regs.a);
493} 484}
494 485
495static void 486static void
@@ -497,8 +488,7 @@ ldx(uint8_t arg)
497{ 488{
498 regs.x = arg; 489 regs.x = arg;
499 490
500 STATUS_UPDATE_ZERO(regs.x); 491 STATUS_UPDATE_NZ(regs.x);
501 STATUS_UPDATE_NEGATIVE(regs.x);
502} 492}
503 493
504static void 494static void
@@ -506,8 +496,7 @@ ldy(uint8_t arg)
506{ 496{
507 regs.y = arg; 497 regs.y = arg;
508 498
509 STATUS_UPDATE_ZERO(regs.y); 499 STATUS_UPDATE_NZ(regs.y);
510 STATUS_UPDATE_NEGATIVE(regs.y);
511} 500}
512 501
513static void 502static void
@@ -517,8 +506,7 @@ lsr_acc(void)
517 regs.a >>= 1; 506 regs.a >>= 1;
518 regs.a &= ~(1 << 7); // bit 7 cleared 507 regs.a &= ~(1 << 7); // bit 7 cleared
519 508
520 STATUS_UPDATE_ZERO(regs.a); 509 STATUS_UPDATE_NZ(regs.a);
521 STATUS_UPDATE_NEGATIVE(regs.a);
522} 510}
523 511
524static void 512static void
@@ -534,8 +522,7 @@ lsr(uint16_t mem)
534 522
535 memwrite(mem, tmp); 523 memwrite(mem, tmp);
536 524
537 STATUS_UPDATE_ZERO(tmp); 525 STATUS_UPDATE_NZ(tmp);
538 STATUS_UPDATE_NEGATIVE(tmp);
539} 526}
540 527
541static void 528static void
@@ -549,8 +536,7 @@ ora(uint8_t arg)
549{ 536{
550 regs.a |= arg; 537 regs.a |= arg;
551 538
552 STATUS_UPDATE_ZERO(regs.a); 539 STATUS_UPDATE_NZ(regs.a);
553 STATUS_UPDATE_NEGATIVE(regs.a);
554} 540}
555 541
556static void 542static void
@@ -570,8 +556,7 @@ pla(void)
570{ 556{
571 regs.a = PULL(); 557 regs.a = PULL();
572 558
573 STATUS_UPDATE_ZERO(regs.a); 559 STATUS_UPDATE_NZ(regs.a);
574 STATUS_UPDATE_NEGATIVE(regs.a);
575} 560}
576 561
577static void 562static void
@@ -601,8 +586,7 @@ rol_acc(void)
601 regs.a |= regs.status.carry; 586 regs.a |= regs.status.carry;
602 587
603 regs.status.carry = carry; 588 regs.status.carry = carry;
604 STATUS_UPDATE_ZERO(regs.a); 589 STATUS_UPDATE_NZ(regs.a);
605 STATUS_UPDATE_NEGATIVE(regs.a);
606} 590}
607 591
608static void 592static void
@@ -615,8 +599,7 @@ rol(uint16_t mem)
615 memwrite(mem, tmp); 599 memwrite(mem, tmp);
616 600
617 regs.status.carry = carry; 601 regs.status.carry = carry;
618 STATUS_UPDATE_ZERO(tmp); 602 STATUS_UPDATE_NZ(regs.a);
619 STATUS_UPDATE_NEGATIVE(tmp);
620} 603}
621 604
622static void 605static void
@@ -629,8 +612,7 @@ ror_acc(void)
629 regs.a |= regs.status.carry << 7; 612 regs.a |= regs.status.carry << 7;
630 613
631 regs.status.carry = carry; 614 regs.status.carry = carry;
632 STATUS_UPDATE_ZERO(regs.a); 615 STATUS_UPDATE_NZ(regs.a);
633 STATUS_UPDATE_NEGATIVE(regs.a);
634} 616}
635 617
636static void 618static void
@@ -643,8 +625,7 @@ ror(uint16_t mem)
643 memwrite(mem, tmp); 625 memwrite(mem, tmp);
644 626
645 regs.status.carry = carry; 627 regs.status.carry = carry;
646 STATUS_UPDATE_ZERO(tmp); 628 STATUS_UPDATE_NZ(tmp);
647 STATUS_UPDATE_NEGATIVE(tmp);
648} 629}
649 630
650static void 631static void
@@ -717,8 +698,7 @@ tax(void)
717{ 698{
718 regs.x = regs.a; 699 regs.x = regs.a;
719 700
720 STATUS_UPDATE_ZERO(regs.x); 701 STATUS_UPDATE_NZ(regs.x);
721 STATUS_UPDATE_NEGATIVE(regs.x);
722} 702}
723 703
724static void 704static void
@@ -726,8 +706,7 @@ tay(void)
726{ 706{
727 regs.y = regs.a; 707 regs.y = regs.a;
728 708
729 STATUS_UPDATE_ZERO(regs.y); 709 STATUS_UPDATE_NZ(regs.y);
730 STATUS_UPDATE_NEGATIVE(regs.y);
731} 710}
732 711
733static void 712static void
@@ -736,8 +715,7 @@ tsx(void)
736// regs.x = PULL(); 715// regs.x = PULL();
737 regs.x = regs.sp; 716 regs.x = regs.sp;
738 717
739 STATUS_UPDATE_ZERO(regs.x); 718 STATUS_UPDATE_NZ(regs.x);
740 STATUS_UPDATE_NEGATIVE(regs.x);
741} 719}
742 720
743static void 721static void
@@ -745,8 +723,7 @@ txa(void)
745{ 723{
746 regs.a = regs.x; 724 regs.a = regs.x;
747 725
748 STATUS_UPDATE_ZERO(regs.a); 726 STATUS_UPDATE_NZ(regs.a);
749 STATUS_UPDATE_NEGATIVE(regs.a);
750} 727}
751 728
752static void 729static void
@@ -761,8 +738,7 @@ tya(void)
761{ 738{
762 regs.a = regs.y; 739 regs.a = regs.y;
763 740
764 STATUS_UPDATE_ZERO(regs.a); 741 STATUS_UPDATE_NZ(regs.a);
765 STATUS_UPDATE_NEGATIVE(regs.a);
766} 742}
767 743
768static void 744static void