diff options
| author | vin <git@vineetk.net> | 2024-06-30 15:46:18 -0400 |
|---|---|---|
| committer | vin <git@vineetk.net> | 2024-06-30 15:46:25 -0400 |
| commit | f28733401ebfe5457a4a79a37fbd5d2001de90bd (patch) | |
| tree | 0a6bc8f1db19c264c95196539a6527ab5c9c31d0 | |
| parent | 47b8fac273d980f8d0893b2f6f4b363a9989070f (diff) | |
combine macro for updating N and Z status flags
| -rw-r--r-- | cpu.c | 84 |
1 files changed, 30 insertions, 54 deletions
| @@ -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 | ||
| 231 | static void | 233 | static 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 | ||
| 240 | static void | 241 | static 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 | ||
| 253 | static void | 253 | static 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 | ||
| 266 | static void | 265 | static 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 | ||
| 412 | static void | 410 | static 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 | ||
| 421 | static void | 418 | static 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 | ||
| 430 | static void | 426 | static 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 | ||
| 439 | static void | 434 | static 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 | ||
| 448 | static void | 442 | static 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 | ||
| 457 | static void | 450 | static 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 | ||
| 466 | static void | 458 | static 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 | ||
| 495 | static void | 486 | static 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 | ||
| 504 | static void | 494 | static 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 | ||
| 513 | static void | 502 | static 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 | ||
| 524 | static void | 512 | static 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 | ||
| 541 | static void | 528 | static 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 | ||
| 556 | static void | 542 | static 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 | ||
| 577 | static void | 562 | static 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 | ||
| 608 | static void | 592 | static 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 | ||
| 622 | static void | 605 | static 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 | ||
| 636 | static void | 618 | static 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 | ||
| 650 | static void | 631 | static 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 | ||
| 724 | static void | 704 | static 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 | ||
| 733 | static void | 712 | static 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 | ||
| 743 | static void | 721 | static 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 | ||
| 752 | static void | 729 | static 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 | ||
| 768 | static void | 744 | static void |
