diff options
Diffstat (limited to 'cpu.c')
| -rw-r--r-- | cpu.c | 639 |
1 files changed, 503 insertions, 136 deletions
| @@ -50,6 +50,8 @@ struct registers regs = {0}; | |||
| 50 | struct Rom rom = {0}; | 50 | struct Rom rom = {0}; |
| 51 | 51 | ||
| 52 | enum addressing_mode { | 52 | enum addressing_mode { |
| 53 | AM_ACC, | ||
| 54 | AM_IMPLICIT, | ||
| 53 | AM_IMM, | 55 | AM_IMM, |
| 54 | AM_ZP, | 56 | AM_ZP, |
| 55 | AM_ZP_X, | 57 | AM_ZP_X, |
| @@ -164,7 +166,7 @@ opcode_mem(enum addressing_mode mode) | |||
| 164 | { | 166 | { |
| 165 | uint16_t arg, val; | 167 | uint16_t arg, val; |
| 166 | 168 | ||
| 167 | if (mode != AM_ABS && mode != AM_ABS_X && mode != AM_ABS_Y) { | 169 | if (mode != AM_ABS && mode != AM_ABS_X && mode != AM_ABS_Y && mode != AM_IND && mode) { |
| 168 | arg = peek(regs.pc++); | 170 | arg = peek(regs.pc++); |
| 169 | printf(" %02X\t", arg); | 171 | printf(" %02X\t", arg); |
| 170 | } else { | 172 | } else { |
| @@ -281,12 +283,14 @@ beq(uint8_t arg) | |||
| 281 | regs.pc += arg; | 283 | regs.pc += arg; |
| 282 | } | 284 | } |
| 283 | 285 | ||
| 284 | static void | 286 | static uint8_t |
| 285 | bit(uint8_t arg) | 287 | bit(uint8_t arg) |
| 286 | { | 288 | { |
| 287 | regs.status.zero = (regs.a & arg) == 0; | 289 | regs.status.zero = (regs.a & arg) == 0; |
| 288 | regs.status.overflow = (arg & (1 << 6)) != 0; | 290 | regs.status.overflow = (arg & (1 << 6)) != 0; |
| 289 | STATUS_UPDATE_NEGATIVE(arg); | 291 | STATUS_UPDATE_NEGATIVE(arg); |
| 292 | |||
| 293 | return regs.a & arg; | ||
| 290 | } | 294 | } |
| 291 | 295 | ||
| 292 | static void | 296 | static void |
| @@ -315,8 +319,7 @@ brk(void) | |||
| 315 | { | 319 | { |
| 316 | /* TODO: push regs.pc and regs.status to stack and load IRQ vector */ | 320 | /* TODO: push regs.pc and regs.status to stack and load IRQ vector */ |
| 317 | regs.status.brk = 1; | 321 | regs.status.brk = 1; |
| 318 | putchar('\n'); | 322 | // exit(0); |
| 319 | exit(0); | ||
| 320 | } | 323 | } |
| 321 | 324 | ||
| 322 | static void | 325 | static void |
| @@ -682,22 +685,31 @@ sei(void) | |||
| 682 | regs.status.interrupt_disable = 1; | 685 | regs.status.interrupt_disable = 1; |
| 683 | } | 686 | } |
| 684 | 687 | ||
| 685 | static void | 688 | static uint8_t |
| 686 | sta(uint16_t mem) | 689 | sta(uint16_t mem) |
| 687 | { | 690 | { |
| 691 | uint8_t tmp = peek(mem); | ||
| 688 | memwrite(mem, regs.a); | 692 | memwrite(mem, regs.a); |
| 693 | |||
| 694 | return tmp; | ||
| 689 | } | 695 | } |
| 690 | 696 | ||
| 691 | static void | 697 | static uint8_t |
| 692 | stx(uint16_t mem) | 698 | stx(uint16_t mem) |
| 693 | { | 699 | { |
| 700 | uint8_t tmp = peek(mem); | ||
| 694 | memwrite(mem, regs.x); | 701 | memwrite(mem, regs.x); |
| 702 | |||
| 703 | return tmp; | ||
| 695 | } | 704 | } |
| 696 | 705 | ||
| 697 | static void | 706 | static uint8_t |
| 698 | sty(uint16_t mem) | 707 | sty(uint16_t mem) |
| 699 | { | 708 | { |
| 709 | uint8_t tmp = peek(mem); | ||
| 700 | memwrite(mem, regs.y); | 710 | memwrite(mem, regs.y); |
| 711 | |||
| 712 | return tmp; | ||
| 701 | } | 713 | } |
| 702 | 714 | ||
| 703 | static void | 715 | static void |
| @@ -754,787 +766,1092 @@ tya(void) | |||
| 754 | static void | 766 | static void |
| 755 | interpret(void) | 767 | interpret(void) |
| 756 | { | 768 | { |
| 757 | uint8_t opcode; | 769 | uint8_t opcode, did_memwrite, ret; |
| 770 | uint16_t arg, mem, deref; | ||
| 758 | uint32_t cycles_; | 771 | uint32_t cycles_; |
| 772 | enum addressing_mode mode; | ||
| 759 | 773 | ||
| 760 | for (;;) { | 774 | for (;;) { |
| 761 | opcode = peek(regs.pc++); | 775 | opcode = peek(regs.pc++); |
| 762 | cycles_ = cycles; | 776 | cycles_ = cycles; |
| 777 | did_memwrite = 0; | ||
| 763 | 778 | ||
| 764 | printf("%04X %02X", regs.pc - 1, opcode); | 779 | printf("%04X %02X", regs.pc - 1, opcode); |
| 765 | 780 | ||
| 766 | switch (opcode) { | 781 | switch (opcode) { |
| 767 | case 0x69: | 782 | case 0x69: |
| 768 | adc(opcode_arg(AM_IMM)); | 783 | mode = AM_IMM; |
| 784 | arg = opcode_arg(mode); | ||
| 785 | adc(arg); | ||
| 769 | cycles += 2; | 786 | cycles += 2; |
| 770 | printf("ADC"); | 787 | printf("ADC"); |
| 771 | break; | 788 | break; |
| 772 | case 0x65: | 789 | case 0x65: |
| 773 | adc(opcode_arg(AM_ZP)); | 790 | mode = AM_ZP; |
| 791 | arg = opcode_arg(mode); | ||
| 792 | adc(arg); | ||
| 774 | cycles += 3; | 793 | cycles += 3; |
| 775 | printf("ADC"); | 794 | printf("ADC"); |
| 776 | break; | 795 | break; |
| 777 | case 0x75: | 796 | case 0x75: |
| 778 | adc(opcode_arg(AM_ZP_X)); | 797 | mode = AM_ZP_X; |
| 798 | arg = opcode_arg(mode); | ||
| 799 | adc(arg); | ||
| 779 | cycles += 4; | 800 | cycles += 4; |
| 780 | printf("ADC"); | 801 | printf("ADC"); |
| 781 | break; | 802 | break; |
| 782 | case 0x6d: | 803 | case 0x6d: |
| 783 | adc(opcode_arg(AM_ABS)); | 804 | mode = AM_ABS; |
| 805 | arg = opcode_arg(mode); | ||
| 806 | adc(arg); | ||
| 784 | cycles += 4; | 807 | cycles += 4; |
| 785 | printf("ADC"); | 808 | printf("ADC"); |
| 786 | break; | 809 | break; |
| 787 | case 0x7d: | 810 | case 0x7d: |
| 788 | adc(opcode_arg(AM_ABS_X)); | 811 | mode = AM_ABS_X; |
| 812 | arg = opcode_arg(mode); | ||
| 813 | adc(arg); | ||
| 789 | cycles += 4; | 814 | cycles += 4; |
| 790 | printf("ADC"); | 815 | printf("ADC"); |
| 791 | break; | 816 | break; |
| 792 | case 0x79: | 817 | case 0x79: |
| 793 | adc(opcode_arg(AM_ABS_Y)); | 818 | mode = AM_ABS_Y; |
| 819 | arg = opcode_arg(mode); | ||
| 820 | adc(arg); | ||
| 794 | cycles += 4; | 821 | cycles += 4; |
| 795 | printf("ADC"); | 822 | printf("ADC"); |
| 796 | break; | 823 | break; |
| 797 | case 0x61: | 824 | case 0x61: |
| 798 | adc(opcode_arg(AM_IND_X)); | 825 | mode = AM_IND_X; |
| 826 | arg = opcode_arg(mode); | ||
| 827 | adc(arg); | ||
| 799 | cycles += 6; | 828 | cycles += 6; |
| 800 | printf("ADC"); | 829 | printf("ADC"); |
| 801 | break; | 830 | break; |
| 802 | case 0x71: | 831 | case 0x71: |
| 803 | adc(opcode_arg(AM_IND_Y)); | 832 | mode = AM_IND_Y; |
| 833 | arg = opcode_arg(mode); | ||
| 834 | adc(arg); | ||
| 804 | cycles += 5; | 835 | cycles += 5; |
| 805 | printf("ADC"); | 836 | printf("ADC"); |
| 806 | break; | 837 | break; |
| 807 | case 0x29: | 838 | case 0x29: |
| 808 | and(opcode_arg(AM_IMM)); | 839 | mode = AM_IMM; |
| 840 | arg = opcode_arg(mode); | ||
| 841 | and(arg); | ||
| 809 | cycles += 2; | 842 | cycles += 2; |
| 810 | printf("AND"); | 843 | printf("AND"); |
| 811 | break; | 844 | break; |
| 812 | case 0x25: | 845 | case 0x25: |
| 813 | and(opcode_arg(AM_ZP)); | 846 | mode = AM_ZP; |
| 847 | arg = opcode_arg(mode); | ||
| 848 | and(arg); | ||
| 814 | cycles += 3; | 849 | cycles += 3; |
| 815 | printf("AND"); | 850 | printf("AND"); |
| 816 | break; | 851 | break; |
| 817 | case 0x35: | 852 | case 0x35: |
| 818 | and(opcode_arg(AM_ZP_X)); | 853 | mode = AM_ZP_X; |
| 854 | arg = opcode_arg(mode); | ||
| 855 | and(arg); | ||
| 819 | cycles += 4; | 856 | cycles += 4; |
| 820 | printf("AND"); | 857 | printf("AND"); |
| 821 | break; | 858 | break; |
| 822 | case 0x2d: | 859 | case 0x2d: |
| 823 | and(opcode_arg(AM_ABS)); | 860 | mode = AM_ABS; |
| 861 | arg = opcode_arg(mode); | ||
| 862 | and(arg); | ||
| 824 | cycles += 4; | 863 | cycles += 4; |
| 825 | printf("AND"); | 864 | printf("AND"); |
| 826 | break; | 865 | break; |
| 827 | case 0x3d: | 866 | case 0x3d: |
| 828 | and(opcode_arg(AM_ABS_X)); | 867 | mode = AM_ABS_X; |
| 868 | arg = opcode_arg(mode); | ||
| 869 | and(arg); | ||
| 829 | cycles += 4; | 870 | cycles += 4; |
| 830 | printf("AND"); | 871 | printf("AND"); |
| 831 | break; | 872 | break; |
| 832 | case 0x39: | 873 | case 0x39: |
| 833 | and(opcode_arg(AM_ABS_Y)); | 874 | mode = AM_ABS_Y; |
| 875 | arg = opcode_arg(mode); | ||
| 876 | and(arg); | ||
| 834 | cycles += 4; | 877 | cycles += 4; |
| 835 | printf("AND"); | 878 | printf("AND"); |
| 836 | break; | 879 | break; |
| 837 | case 0x21: | 880 | case 0x21: |
| 838 | and(opcode_arg(AM_IND_X)); | 881 | mode = AM_IND_X; |
| 882 | arg = opcode_arg(mode); | ||
| 883 | and(arg); | ||
| 839 | cycles += 6; | 884 | cycles += 6; |
| 840 | printf("AND"); | 885 | printf("AND"); |
| 841 | break; | 886 | break; |
| 842 | case 0x31: | 887 | case 0x31: |
| 843 | and(opcode_arg(AM_IND_Y)); | 888 | mode = AM_IND_Y; |
| 889 | arg = opcode_arg(mode); | ||
| 890 | and(arg); | ||
| 844 | cycles += 5; | 891 | cycles += 5; |
| 845 | printf("AND"); | 892 | printf("AND"); |
| 846 | break; | 893 | break; |
| 847 | case 0x0a: | 894 | case 0x0a: |
| 895 | mode = AM_ACC; | ||
| 848 | asl_acc(); | 896 | asl_acc(); |
| 849 | cycles += 2; | 897 | cycles += 2; |
| 850 | printf("\tASL"); | 898 | printf("\tASL"); |
| 851 | break; | 899 | break; |
| 852 | case 0x06: | 900 | case 0x06: |
| 853 | asl(opcode_arg(AM_ZP)); | 901 | mode = AM_ZP; |
| 902 | arg = opcode_arg(mode); | ||
| 903 | asl(arg); | ||
| 854 | cycles += 5; | 904 | cycles += 5; |
| 855 | printf("ASL"); | 905 | printf("ASL"); |
| 856 | break; | 906 | break; |
| 857 | case 0x16: | 907 | case 0x16: |
| 858 | asl(opcode_arg(AM_ZP_X)); | 908 | mode = AM_ZP_X; |
| 909 | arg = opcode_arg(mode); | ||
| 910 | asl(arg); | ||
| 859 | cycles += 6; | 911 | cycles += 6; |
| 860 | printf("ASL"); | 912 | printf("ASL"); |
| 861 | break; | 913 | break; |
| 862 | case 0x0e: | 914 | case 0x0e: |
| 863 | asl(opcode_arg(AM_ABS)); | 915 | mode = AM_ABS; |
| 916 | arg = opcode_arg(mode); | ||
| 917 | asl(arg); | ||
| 864 | cycles += 6; | 918 | cycles += 6; |
| 865 | printf("ASL"); | 919 | printf("ASL"); |
| 866 | break; | 920 | break; |
| 867 | case 0x1e: | 921 | case 0x1e: |
| 868 | asl(opcode_arg(AM_ABS_X)); | 922 | mode = AM_ABS_X; |
| 923 | arg = opcode_arg(mode); | ||
| 924 | asl(arg); | ||
| 869 | cycles += 6; | 925 | cycles += 6; |
| 870 | printf("ASL"); | 926 | printf("ASL"); |
| 871 | break; | 927 | break; |
| 872 | case 0x90: | 928 | case 0x90: |
| 873 | bcc(opcode_arg(AM_IMM)); | 929 | mode = AM_IMM; |
| 930 | arg = opcode_arg(mode); | ||
| 931 | bcc(arg); | ||
| 874 | cycles += 2; | 932 | cycles += 2; |
| 875 | printf("BCC"); | 933 | printf("BCC"); |
| 876 | break; | 934 | break; |
| 877 | case 0xb0: | 935 | case 0xb0: |
| 878 | bcs(opcode_arg(AM_IMM)); | 936 | mode = AM_IMM; |
| 937 | arg = opcode_arg(mode); | ||
| 938 | bcs(arg); | ||
| 879 | cycles += 2; | 939 | cycles += 2; |
| 880 | printf("BCS"); | 940 | printf("BCS"); |
| 881 | break; | 941 | break; |
| 882 | case 0xf0: | 942 | case 0xf0: |
| 883 | beq(opcode_arg(AM_IMM)); | 943 | mode = AM_IMM; |
| 944 | arg = opcode_arg(mode); | ||
| 945 | beq(arg); | ||
| 884 | cycles += 2; | 946 | cycles += 2; |
| 885 | printf("BEQ"); | 947 | printf("BEQ"); |
| 886 | break; | 948 | break; |
| 887 | case 0x89: | 949 | case 0x89: |
| 888 | bit(opcode_arg(AM_IMM)); | 950 | mode = AM_IMM; |
| 951 | arg = opcode_arg(mode); | ||
| 952 | did_memwrite = 1; | ||
| 953 | ret = bit(arg); | ||
| 889 | cycles += 2; | 954 | cycles += 2; |
| 890 | printf("BIT"); | 955 | printf("BIT"); |
| 891 | break; | 956 | break; |
| 892 | case 0x24: | 957 | case 0x24: |
| 893 | bit(opcode_arg(AM_ZP)); | 958 | mode = AM_ZP; |
| 959 | arg = opcode_arg(mode); | ||
| 960 | did_memwrite = 1; | ||
| 961 | ret = bit(arg); | ||
| 894 | cycles += 3; | 962 | cycles += 3; |
| 895 | printf("BIT"); | 963 | printf("BIT"); |
| 896 | break; | 964 | break; |
| 897 | case 0x34: | 965 | case 0x34: |
| 898 | bit(opcode_arg(AM_ZP_X)); | 966 | mode = AM_ZP_X; |
| 967 | arg = opcode_arg(mode); | ||
| 968 | did_memwrite = 1; | ||
| 969 | ret = bit(arg); | ||
| 899 | cycles += 4; | 970 | cycles += 4; |
| 900 | printf("BIT"); | 971 | printf("BIT"); |
| 901 | break; | 972 | break; |
| 902 | case 0x2c: | 973 | case 0x2c: |
| 903 | bit(opcode_arg(AM_ABS)); | 974 | mode = AM_ABS; |
| 975 | arg = opcode_arg(mode); | ||
| 976 | did_memwrite = 1; | ||
| 977 | ret = bit(arg); | ||
| 904 | cycles += 4; | 978 | cycles += 4; |
| 905 | printf("BIT"); | 979 | printf("BIT"); |
| 906 | break; | 980 | break; |
| 907 | case 0x3c: | 981 | case 0x3c: |
| 908 | bit(opcode_arg(AM_ABS_X)); | 982 | mode = AM_ABS_X; |
| 983 | arg = opcode_arg(mode); | ||
| 984 | did_memwrite = 1; | ||
| 985 | ret = bit(arg); | ||
| 909 | cycles += 4; | 986 | cycles += 4; |
| 910 | printf("BIT"); | 987 | printf("BIT"); |
| 911 | break; | 988 | break; |
| 912 | case 0x30: | 989 | case 0x30: |
| 913 | bmi(opcode_arg(AM_IMM)); | 990 | mode = AM_IMM; |
| 991 | arg = opcode_arg(mode); | ||
| 992 | bmi(arg); | ||
| 914 | cycles += 2; | 993 | cycles += 2; |
| 915 | printf("BMI"); | 994 | printf("BMI"); |
| 916 | break; | 995 | break; |
| 917 | case 0xd0: | 996 | case 0xd0: |
| 918 | bne(opcode_arg(AM_IMM)); | 997 | mode = AM_IMM; |
| 998 | arg = opcode_arg(mode); | ||
| 999 | bne(arg); | ||
| 919 | cycles += 2; | 1000 | cycles += 2; |
| 920 | printf("BNE"); | 1001 | printf("BNE"); |
| 921 | break; | 1002 | break; |
| 922 | case 0x10: | 1003 | case 0x10: |
| 923 | bpl(opcode_arg(AM_IMM)); | 1004 | mode = AM_IMM; |
| 1005 | arg = opcode_arg(mode); | ||
| 1006 | bpl(arg); | ||
| 924 | cycles += 2; | 1007 | cycles += 2; |
| 925 | printf("BPL"); | 1008 | printf("BPL"); |
| 926 | break; | 1009 | break; |
| 927 | case 0x00: | 1010 | case 0x00: |
| 1011 | mode = AM_IMPLICIT; | ||
| 928 | brk(); | 1012 | brk(); |
| 929 | cycles += 7; | 1013 | cycles += 7; |
| 930 | printf("\tBRK"); | 1014 | printf("\tBRK"); |
| 931 | break; | 1015 | goto loop_exit; |
| 932 | case 0x50: | 1016 | case 0x50: |
| 933 | bvc(opcode_arg(AM_IMM)); | 1017 | mode = AM_IMM; |
| 1018 | arg = opcode_arg(mode); | ||
| 1019 | bvc(arg); | ||
| 934 | cycles += 2; | 1020 | cycles += 2; |
| 935 | printf("BVC"); | 1021 | printf("BVC"); |
| 936 | break; | 1022 | break; |
| 937 | case 0x70: | 1023 | case 0x70: |
| 938 | bvs(opcode_arg(AM_IMM)); | 1024 | mode = AM_IMM; |
| 1025 | arg = opcode_arg(mode); | ||
| 1026 | bvs(arg); | ||
| 939 | cycles += 2; | 1027 | cycles += 2; |
| 940 | printf("BVS"); | 1028 | printf("BVS"); |
| 941 | break; | 1029 | break; |
| 942 | case 0x18: | 1030 | case 0x18: |
| 1031 | mode = AM_IMPLICIT; | ||
| 943 | clc(); | 1032 | clc(); |
| 944 | cycles += 2; | 1033 | cycles += 2; |
| 945 | printf("\tCLC"); | 1034 | printf("\tCLC"); |
| 946 | break; | 1035 | break; |
| 947 | case 0xd8: | 1036 | case 0xd8: |
| 1037 | mode = AM_IMPLICIT; | ||
| 948 | cld(); | 1038 | cld(); |
| 949 | cycles += 2; | 1039 | cycles += 2; |
| 950 | printf("\tCLD"); | 1040 | printf("\tCLD"); |
| 951 | break; | 1041 | break; |
| 952 | case 0x58: | 1042 | case 0x58: |
| 1043 | mode = AM_IMPLICIT; | ||
| 953 | cli(); | 1044 | cli(); |
| 954 | cycles += 2; | 1045 | cycles += 2; |
| 955 | printf("\tCLI"); | 1046 | printf("\tCLI"); |
| 956 | break; | 1047 | break; |
| 957 | case 0xb8: | 1048 | case 0xb8: |
| 1049 | mode = AM_IMPLICIT; | ||
| 958 | clv(); | 1050 | clv(); |
| 959 | cycles += 2; | 1051 | cycles += 2; |
| 960 | printf("\tCLV"); | 1052 | printf("\tCLV"); |
| 961 | break; | 1053 | break; |
| 962 | case 0xc9: | 1054 | case 0xc9: |
| 963 | cmp(opcode_arg(AM_IMM)); | 1055 | mode = AM_IMM; |
| 1056 | arg = opcode_arg(mode); | ||
| 1057 | cmp(arg); | ||
| 964 | cycles += 2; | 1058 | cycles += 2; |
| 965 | printf("CMP"); | 1059 | printf("CMP"); |
| 966 | break; | 1060 | break; |
| 967 | case 0xc5: | 1061 | case 0xc5: |
| 968 | cmp(opcode_arg(AM_ZP)); | 1062 | mode = AM_ZP; |
| 1063 | arg = opcode_arg(mode); | ||
| 1064 | cmp(arg); | ||
| 969 | cycles += 3; | 1065 | cycles += 3; |
| 970 | printf("CMP"); | 1066 | printf("CMP"); |
| 971 | break; | 1067 | break; |
| 972 | case 0xd5: | 1068 | case 0xd5: |
| 973 | cmp(opcode_arg(AM_ZP_X)); | 1069 | mode = AM_ZP_X; |
| 1070 | arg = opcode_arg(mode); | ||
| 1071 | cmp(arg); | ||
| 974 | cycles += 4; | 1072 | cycles += 4; |
| 975 | printf("CMP"); | 1073 | printf("CMP"); |
| 976 | break; | 1074 | break; |
| 977 | case 0xcd: | 1075 | case 0xcd: |
| 978 | cmp(opcode_arg(AM_ABS)); | 1076 | mode = AM_ABS; |
| 1077 | arg = opcode_arg(mode); | ||
| 1078 | cmp(arg); | ||
| 979 | cycles += 4; | 1079 | cycles += 4; |
| 980 | printf("CMP"); | 1080 | printf("CMP"); |
| 981 | break; | 1081 | break; |
| 982 | case 0xdd: | 1082 | case 0xdd: |
| 983 | cmp(opcode_arg(AM_ABS_X)); | 1083 | mode = AM_ABS_X; |
| 1084 | arg = opcode_arg(mode); | ||
| 1085 | cmp(arg); | ||
| 984 | cycles += 4; | 1086 | cycles += 4; |
| 985 | printf("CMP"); | 1087 | printf("CMP"); |
| 986 | break; | 1088 | break; |
| 987 | case 0xd9: | 1089 | case 0xd9: |
| 988 | cmp(opcode_arg(AM_ABS_Y)); | 1090 | mode = AM_ABS_Y; |
| 1091 | arg = opcode_arg(mode); | ||
| 1092 | cmp(arg); | ||
| 989 | cycles += 4; | 1093 | cycles += 4; |
| 990 | printf("CMP"); | 1094 | printf("CMP"); |
| 991 | break; | 1095 | break; |
| 992 | case 0xc1: | 1096 | case 0xc1: |
| 993 | cmp(opcode_arg(AM_IND_X)); | 1097 | mode = AM_IND_X; |
| 1098 | arg = opcode_arg(mode); | ||
| 1099 | cmp(arg); | ||
| 994 | cycles += 6; | 1100 | cycles += 6; |
| 995 | printf("CMP"); | 1101 | printf("CMP"); |
| 996 | break; | 1102 | break; |
| 997 | case 0xd1: | 1103 | case 0xd1: |
| 998 | cmp(opcode_arg(AM_IND_Y)); | 1104 | mode = AM_IND_Y; |
| 1105 | arg = opcode_arg(mode); | ||
| 1106 | cmp(arg); | ||
| 999 | cycles += 5; | 1107 | cycles += 5; |
| 1000 | printf("CMP"); | 1108 | printf("CMP"); |
| 1001 | break; | 1109 | break; |
| 1002 | case 0xe0: | 1110 | case 0xe0: |
| 1003 | cpx(opcode_arg(AM_IMM)); | 1111 | mode = AM_IMM; |
| 1112 | arg = opcode_arg(mode); | ||
| 1113 | cpx(arg); | ||
| 1004 | cycles += 2; | 1114 | cycles += 2; |
| 1005 | printf("CPX"); | 1115 | printf("CPX"); |
| 1006 | break; | 1116 | break; |
| 1007 | case 0xe4: | 1117 | case 0xe4: |
| 1008 | cpx(opcode_arg(AM_ZP)); | 1118 | mode = AM_ZP; |
| 1119 | arg = opcode_arg(mode); | ||
| 1120 | cpx(arg); | ||
| 1009 | cycles += 3; | 1121 | cycles += 3; |
| 1010 | printf("CPX"); | 1122 | printf("CPX"); |
| 1011 | break; | 1123 | break; |
| 1012 | case 0xec: | 1124 | case 0xec: |
| 1013 | cpx(opcode_arg(AM_ABS)); | 1125 | mode = AM_ABS; |
| 1126 | arg = opcode_arg(mode); | ||
| 1127 | cpx(arg); | ||
| 1014 | cycles += 4; | 1128 | cycles += 4; |
| 1015 | printf("CPX"); | 1129 | printf("CPX"); |
| 1016 | break; | 1130 | break; |
| 1017 | case 0xc0: | 1131 | case 0xc0: |
| 1018 | cpy(opcode_arg(AM_IMM)); | 1132 | mode = AM_IMM; |
| 1133 | arg = opcode_arg(mode); | ||
| 1134 | cpy(arg); | ||
| 1019 | cycles += 2; | 1135 | cycles += 2; |
| 1020 | printf("CPY"); | 1136 | printf("CPY"); |
| 1021 | break; | 1137 | break; |
| 1022 | case 0xc4: | 1138 | case 0xc4: |
| 1023 | cpy(opcode_arg(AM_ZP)); | 1139 | mode = AM_ZP; |
| 1140 | arg = opcode_arg(mode); | ||
| 1141 | cpy(arg); | ||
| 1024 | cycles += 3; | 1142 | cycles += 3; |
| 1025 | printf("CPY"); | 1143 | printf("CPY"); |
| 1026 | break; | 1144 | break; |
| 1027 | case 0xcc: | 1145 | case 0xcc: |
| 1028 | cpy(opcode_arg(AM_ABS)); | 1146 | mode = AM_ABS; |
| 1147 | arg = opcode_arg(mode); | ||
| 1148 | cpy(arg); | ||
| 1029 | cycles += 4; | 1149 | cycles += 4; |
| 1030 | printf("CPY"); | 1150 | printf("CPY"); |
| 1031 | break; | 1151 | break; |
| 1032 | case 0xc6: | 1152 | case 0xc6: |
| 1033 | dec(opcode_mem(AM_ZP)); | 1153 | mode = AM_ZP; |
| 1154 | arg = opcode_mem(mode); | ||
| 1155 | dec(arg); | ||
| 1034 | cycles += 5; | 1156 | cycles += 5; |
| 1035 | printf("DEC"); | 1157 | printf("DEC"); |
| 1036 | break; | 1158 | break; |
| 1037 | case 0xd6: | 1159 | case 0xd6: |
| 1038 | dec(opcode_mem(AM_ZP_X)); | 1160 | mode = AM_ZP_X; |
| 1161 | arg = opcode_mem(mode); | ||
| 1162 | dec(arg); | ||
| 1039 | cycles += 6; | 1163 | cycles += 6; |
| 1040 | printf("DEC"); | 1164 | printf("DEC"); |
| 1041 | break; | 1165 | break; |
| 1042 | case 0xce: | 1166 | case 0xce: |
| 1043 | dec(opcode_mem(AM_ABS)); | 1167 | mode = AM_ABS; |
| 1168 | arg = opcode_mem(mode); | ||
| 1169 | dec(arg); | ||
| 1044 | cycles += 6; | 1170 | cycles += 6; |
| 1045 | printf("DEC"); | 1171 | printf("DEC"); |
| 1046 | break; | 1172 | break; |
| 1047 | case 0xde: | 1173 | case 0xde: |
| 1048 | dec(opcode_mem(AM_ABS_X)); | 1174 | mode = AM_ABS_X; |
| 1175 | arg = opcode_mem(mode); | ||
| 1176 | dec(arg); | ||
| 1049 | cycles += 7; | 1177 | cycles += 7; |
| 1050 | printf("DEC"); | 1178 | printf("DEC"); |
| 1051 | break; | 1179 | break; |
| 1052 | case 0xca: | 1180 | case 0xca: |
| 1181 | mode = AM_IMPLICIT; | ||
| 1053 | dex(); | 1182 | dex(); |
| 1054 | cycles += 2; | 1183 | cycles += 2; |
| 1055 | printf("\tDEX"); | 1184 | printf("\tDEX"); |
| 1056 | break; | 1185 | break; |
| 1057 | case 0x88: | 1186 | case 0x88: |
| 1187 | mode = AM_IMPLICIT; | ||
| 1058 | dey(); | 1188 | dey(); |
| 1059 | cycles += 2; | 1189 | cycles += 2; |
| 1060 | printf("\tDEY"); | 1190 | printf("\tDEY"); |
| 1061 | break; | 1191 | break; |
| 1062 | case 0x49: | 1192 | case 0x49: |
| 1063 | eor(opcode_arg(AM_IMM)); | 1193 | mode = AM_IMM; |
| 1194 | arg = opcode_arg(mode); | ||
| 1195 | eor(arg); | ||
| 1064 | cycles += 2; | 1196 | cycles += 2; |
| 1065 | printf("EOR"); | 1197 | printf("EOR"); |
| 1066 | break; | 1198 | break; |
| 1067 | case 0x45: | 1199 | case 0x45: |
| 1068 | eor(opcode_arg(AM_ZP)); | 1200 | mode = AM_ZP; |
| 1201 | arg = opcode_arg(mode); | ||
| 1202 | eor(arg); | ||
| 1069 | cycles += 3; | 1203 | cycles += 3; |
| 1070 | printf("EOR"); | 1204 | printf("EOR"); |
| 1071 | break; | 1205 | break; |
| 1072 | case 0x55: | 1206 | case 0x55: |
| 1073 | eor(opcode_arg(AM_ZP_X)); | 1207 | mode = AM_ZP_X; |
| 1208 | arg = opcode_arg(mode); | ||
| 1209 | eor(arg); | ||
| 1074 | cycles += 4; | 1210 | cycles += 4; |
| 1075 | printf("EOR"); | 1211 | printf("EOR"); |
| 1076 | break; | 1212 | break; |
| 1077 | case 0x4d: | 1213 | case 0x4d: |
| 1078 | eor(opcode_arg(AM_ABS)); | 1214 | mode = AM_ABS; |
| 1215 | arg = opcode_arg(mode); | ||
| 1216 | eor(arg); | ||
| 1079 | cycles += 4; | 1217 | cycles += 4; |
| 1080 | printf("EOR"); | 1218 | printf("EOR"); |
| 1081 | break; | 1219 | break; |
| 1082 | case 0x5d: | 1220 | case 0x5d: |
| 1083 | eor(opcode_arg(AM_ABS_X)); | 1221 | mode = AM_ABS_X; |
| 1222 | arg = opcode_arg(mode); | ||
| 1223 | eor(arg); | ||
| 1084 | cycles += 4; | 1224 | cycles += 4; |
| 1085 | printf("EOR"); | 1225 | printf("EOR"); |
| 1086 | break; | 1226 | break; |
| 1087 | case 0x59: | 1227 | case 0x59: |
| 1088 | eor(opcode_arg(AM_ABS_Y)); | 1228 | mode = AM_ABS_Y; |
| 1229 | arg = opcode_arg(mode); | ||
| 1230 | eor(arg); | ||
| 1089 | cycles += 4; | 1231 | cycles += 4; |
| 1090 | printf("EOR"); | 1232 | printf("EOR"); |
| 1091 | break; | 1233 | break; |
| 1092 | case 0x41: | 1234 | case 0x41: |
| 1093 | eor(opcode_arg(AM_IND_X)); | 1235 | mode = AM_IND_X; |
| 1236 | arg = opcode_arg(mode); | ||
| 1237 | eor(arg); | ||
| 1094 | cycles += 6; | 1238 | cycles += 6; |
| 1095 | printf("EOR"); | 1239 | printf("EOR"); |
| 1096 | break; | 1240 | break; |
| 1097 | case 0x51: | 1241 | case 0x51: |
| 1098 | eor(opcode_arg(AM_IND_Y)); | 1242 | mode = AM_IND_Y; |
| 1243 | arg = opcode_arg(mode); | ||
| 1244 | eor(arg); | ||
| 1099 | cycles += 5; | 1245 | cycles += 5; |
| 1100 | printf("EOR"); | 1246 | printf("EOR"); |
| 1101 | break; | 1247 | break; |
| 1102 | case 0xe6: | 1248 | case 0xe6: |
| 1103 | inc(opcode_arg(AM_ZP)); | 1249 | mode = AM_ZP; |
| 1250 | arg = opcode_arg(mode); | ||
| 1251 | inc(arg); | ||
| 1104 | cycles += 5; | 1252 | cycles += 5; |
| 1105 | printf("INC"); | 1253 | printf("INC"); |
| 1106 | break; | 1254 | break; |
| 1107 | case 0xf6: | 1255 | case 0xf6: |
| 1108 | inc(opcode_arg(AM_ZP_X)); | 1256 | mode = AM_ZP_X; |
| 1257 | arg = opcode_arg(mode); | ||
| 1258 | inc(arg); | ||
| 1109 | cycles += 6; | 1259 | cycles += 6; |
| 1110 | printf("INC"); | 1260 | printf("INC"); |
| 1111 | break; | 1261 | break; |
| 1112 | case 0xee: | 1262 | case 0xee: |
| 1113 | inc(opcode_arg(AM_ABS)); | 1263 | mode = AM_ABS; |
| 1264 | arg = opcode_arg(mode); | ||
| 1265 | inc(arg); | ||
| 1114 | cycles += 6; | 1266 | cycles += 6; |
| 1115 | printf("INC"); | 1267 | printf("INC"); |
| 1116 | break; | 1268 | break; |
| 1117 | case 0xfe: | 1269 | case 0xfe: |
| 1118 | inc(opcode_arg(AM_ABS_X)); | 1270 | mode = AM_ABS_X; |
| 1271 | arg = opcode_arg(mode); | ||
| 1272 | inc(arg); | ||
| 1119 | cycles += 7; | 1273 | cycles += 7; |
| 1120 | printf("INC"); | 1274 | printf("INC"); |
| 1121 | break; | 1275 | break; |
| 1122 | case 0xe8: | 1276 | case 0xe8: |
| 1277 | mode = AM_IMPLICIT; | ||
| 1123 | inx(); | 1278 | inx(); |
| 1124 | cycles += 2; | 1279 | cycles += 2; |
| 1125 | printf("\tINX"); | 1280 | printf("\tINX"); |
| 1126 | break; | 1281 | break; |
| 1127 | case 0xc8: | 1282 | case 0xc8: |
| 1283 | mode = AM_IMPLICIT; | ||
| 1128 | iny(); | 1284 | iny(); |
| 1129 | cycles += 2; | 1285 | cycles += 2; |
| 1130 | printf("\tINY"); | 1286 | printf("\tINY"); |
| 1131 | break; | 1287 | break; |
| 1132 | case 0x4c: | 1288 | case 0x4c: |
| 1133 | jmp(opcode_mem(AM_ABS)); | 1289 | mode = AM_ABS; |
| 1290 | arg = opcode_mem(mode); | ||
| 1291 | jmp(arg); | ||
| 1134 | cycles += 3; | 1292 | cycles += 3; |
| 1135 | printf("JMP"); | 1293 | printf("JMP"); |
| 1136 | break; | 1294 | break; |
| 1137 | case 0x6c: | 1295 | case 0x6c: |
| 1138 | jmp(opcode_mem(AM_IND)); | 1296 | mode = AM_IND; |
| 1297 | mem = peek16(regs.pc); | ||
| 1298 | deref = peek(mem); | ||
| 1299 | arg = opcode_mem(mode); | ||
| 1300 | //jmp(arg); | ||
| 1301 | jmp(deref); | ||
| 1139 | cycles += 6; | 1302 | cycles += 6; |
| 1140 | printf("JMP"); | 1303 | printf("JMP"); |
| 1141 | break; | 1304 | break; |
| 1142 | case 0x7c: | 1305 | case 0x7c: |
| 1143 | jmp(opcode_arg(AM_ABS_X)); | 1306 | mode = AM_ABS_X; |
| 1307 | arg = opcode_arg(mode); | ||
| 1308 | jmp(arg); | ||
| 1144 | cycles += 6; | 1309 | cycles += 6; |
| 1145 | printf("JMP"); | 1310 | printf("JMP"); |
| 1146 | break; | 1311 | break; |
| 1147 | case 0x20: | 1312 | case 0x20: |
| 1148 | jsr(opcode_mem(AM_ABS)); | 1313 | mode = AM_ABS; |
| 1314 | arg = opcode_mem(mode); | ||
| 1315 | jsr(arg); | ||
| 1149 | cycles += 6; | 1316 | cycles += 6; |
| 1150 | printf("JSR"); | 1317 | printf("JSR"); |
| 1151 | break; | 1318 | break; |
| 1152 | case 0xa9: | 1319 | case 0xa9: |
| 1153 | lda(opcode_arg(AM_IMM)); | 1320 | mode = AM_IMM; |
| 1321 | arg = opcode_arg(mode); | ||
| 1322 | lda(arg); | ||
| 1154 | cycles += 2; | 1323 | cycles += 2; |
| 1155 | printf("LDA"); | 1324 | printf("LDA"); |
| 1156 | break; | 1325 | break; |
| 1157 | case 0xa5: | 1326 | case 0xa5: |
| 1158 | lda(opcode_arg(AM_ZP)); | 1327 | mode = AM_ZP; |
| 1328 | arg = opcode_arg(mode); | ||
| 1329 | lda(arg); | ||
| 1159 | cycles += 3; | 1330 | cycles += 3; |
| 1160 | printf("LDA"); | 1331 | printf("LDA"); |
| 1161 | break; | 1332 | break; |
| 1162 | case 0xb5: | 1333 | case 0xb5: |
| 1163 | lda(opcode_arg(AM_ZP_X)); | 1334 | mode = AM_ZP_X; |
| 1335 | arg = opcode_arg(mode); | ||
| 1336 | lda(arg); | ||
| 1164 | cycles += 4; | 1337 | cycles += 4; |
| 1165 | printf("LDA"); | 1338 | printf("LDA"); |
| 1166 | break; | 1339 | break; |
| 1167 | case 0xad: | 1340 | case 0xad: |
| 1168 | lda(opcode_arg(AM_ABS)); | 1341 | mode = AM_ABS; |
| 1342 | arg = opcode_arg(mode); | ||
| 1343 | lda(arg); | ||
| 1169 | cycles += 4; | 1344 | cycles += 4; |
| 1170 | printf("LDA"); | 1345 | printf("LDA"); |
| 1171 | break; | 1346 | break; |
| 1172 | case 0xbd: | 1347 | case 0xbd: |
| 1173 | lda(opcode_arg(AM_ABS_X)); | 1348 | mode = AM_ABS_X; |
| 1349 | arg = opcode_arg(mode); | ||
| 1350 | lda(arg); | ||
| 1174 | cycles += 4; | 1351 | cycles += 4; |
| 1175 | printf("LDA"); | 1352 | printf("LDA"); |
| 1176 | break; | 1353 | break; |
| 1177 | case 0xb9: | 1354 | case 0xb9: |
| 1178 | lda(opcode_arg(AM_ABS_Y)); | 1355 | mode = AM_ABS_Y; |
| 1356 | arg = opcode_arg(mode); | ||
| 1357 | lda(arg); | ||
| 1179 | cycles += 4; | 1358 | cycles += 4; |
| 1180 | printf("LDA"); | 1359 | printf("LDA"); |
| 1181 | break; | 1360 | break; |
| 1182 | case 0xa1: | 1361 | case 0xa1: |
| 1183 | lda(opcode_arg(AM_IND_X)); | 1362 | mode = AM_IND_X; |
| 1363 | arg = opcode_arg(mode); | ||
| 1364 | lda(arg); | ||
| 1184 | cycles += 6; | 1365 | cycles += 6; |
| 1185 | printf("LDA"); | 1366 | printf("LDA"); |
| 1186 | break; | 1367 | break; |
| 1187 | case 0xb1: | 1368 | case 0xb1: |
| 1188 | lda(opcode_arg(AM_IND_Y)); | 1369 | mode = AM_IND_Y; |
| 1370 | arg = opcode_arg(mode); | ||
| 1371 | lda(arg); | ||
| 1189 | cycles += 5; | 1372 | cycles += 5; |
| 1190 | printf("LDA"); | 1373 | printf("LDA"); |
| 1191 | break; | 1374 | break; |
| 1192 | case 0xa2: | 1375 | case 0xa2: |
| 1193 | ldx(opcode_mem(AM_IMM)); | 1376 | mode = AM_IMM; |
| 1377 | arg = opcode_mem(mode); | ||
| 1378 | ldx(arg); | ||
| 1194 | cycles += 2; | 1379 | cycles += 2; |
| 1195 | printf("LDX"); | 1380 | printf("LDX"); |
| 1196 | break; | 1381 | break; |
| 1197 | case 0xa6: | 1382 | case 0xa6: |
| 1198 | ldx(opcode_arg(AM_ZP)); | 1383 | mode = AM_ZP; |
| 1384 | arg = opcode_arg(mode); | ||
| 1385 | ldx(arg); | ||
| 1199 | cycles += 3; | 1386 | cycles += 3; |
| 1200 | printf("LDX"); | 1387 | printf("LDX"); |
| 1201 | break; | 1388 | break; |
| 1202 | case 0xb6: | 1389 | case 0xb6: |
| 1203 | ldx(opcode_arg(AM_ZP_Y)); | 1390 | mode = AM_ZP_Y; |
| 1391 | arg = opcode_arg(mode); | ||
| 1392 | ldx(arg); | ||
| 1204 | cycles += 4; | 1393 | cycles += 4; |
| 1205 | printf("LDX"); | 1394 | printf("LDX"); |
| 1206 | break; | 1395 | break; |
| 1207 | case 0xae: | 1396 | case 0xae: |
| 1208 | ldx(opcode_arg(AM_ABS)); | 1397 | mode = AM_ABS; |
| 1398 | arg = opcode_arg(mode); | ||
| 1399 | ldx(arg); | ||
| 1209 | cycles += 4; | 1400 | cycles += 4; |
| 1210 | printf("LDX"); | 1401 | printf("LDX"); |
| 1211 | break; | 1402 | break; |
| 1212 | case 0xbe: | 1403 | case 0xbe: |
| 1213 | ldx(opcode_arg(AM_ABS_Y)); | 1404 | mode = AM_ABS_Y; |
| 1405 | arg = opcode_arg(mode); | ||
| 1406 | ldx(arg); | ||
| 1214 | cycles += 4; | 1407 | cycles += 4; |
| 1215 | printf("LDX"); | 1408 | printf("LDX"); |
| 1216 | break; | 1409 | break; |
| 1217 | case 0xa0: | 1410 | case 0xa0: |
| 1218 | ldy(opcode_arg(AM_IMM)); | 1411 | mode = AM_IMM; |
| 1412 | arg = opcode_arg(mode); | ||
| 1413 | ldy(arg); | ||
| 1219 | cycles += 2; | 1414 | cycles += 2; |
| 1220 | printf("LDY"); | 1415 | printf("LDY"); |
| 1221 | break; | 1416 | break; |
| 1222 | case 0xa4: | 1417 | case 0xa4: |
| 1223 | ldy(opcode_arg(AM_ZP)); | 1418 | mode = AM_ZP; |
| 1419 | arg = opcode_arg(mode); | ||
| 1420 | ldy(arg); | ||
| 1224 | cycles += 3; | 1421 | cycles += 3; |
| 1225 | printf("LDY"); | 1422 | printf("LDY"); |
| 1226 | break; | 1423 | break; |
| 1227 | case 0xb4: | 1424 | case 0xb4: |
| 1228 | ldy(opcode_arg(AM_ZP_X)); | 1425 | mode = AM_ZP_X; |
| 1426 | arg = opcode_arg(mode); | ||
| 1427 | ldy(arg); | ||
| 1229 | cycles += 4; | 1428 | cycles += 4; |
| 1230 | printf("LDY"); | 1429 | printf("LDY"); |
| 1231 | break; | 1430 | break; |
| 1232 | case 0xac: | 1431 | case 0xac: |
| 1233 | ldy(opcode_arg(AM_ABS)); | 1432 | mode = AM_ABS; |
| 1433 | arg = opcode_arg(mode); | ||
| 1434 | ldy(arg); | ||
| 1234 | cycles += 4; | 1435 | cycles += 4; |
| 1235 | printf("LDY"); | 1436 | printf("LDY"); |
| 1236 | break; | 1437 | break; |
| 1237 | case 0xbc: | 1438 | case 0xbc: |
| 1238 | ldy(opcode_arg(AM_ABS_X)); | 1439 | mode = AM_ABS_X; |
| 1440 | arg = opcode_arg(mode); | ||
| 1441 | ldy(arg); | ||
| 1239 | cycles += 4; | 1442 | cycles += 4; |
| 1240 | printf("LDY"); | 1443 | printf("LDY"); |
| 1241 | break; | 1444 | break; |
| 1242 | case 0x4a: | 1445 | case 0x4a: |
| 1446 | mode = AM_ACC; | ||
| 1243 | lsr_acc(); | 1447 | lsr_acc(); |
| 1244 | cycles += 2; | 1448 | cycles += 2; |
| 1245 | printf("\tLSR"); | 1449 | printf("\tLSR"); |
| 1246 | break; | 1450 | break; |
| 1247 | case 0x46: | 1451 | case 0x46: |
| 1248 | lsr(opcode_arg(AM_ZP)); | 1452 | mode = AM_ZP; |
| 1453 | arg = opcode_arg(mode); | ||
| 1454 | lsr(arg); | ||
| 1249 | cycles += 5; | 1455 | cycles += 5; |
| 1250 | printf("LSR"); | 1456 | printf("LSR"); |
| 1251 | break; | 1457 | break; |
| 1252 | case 0x56: | 1458 | case 0x56: |
| 1253 | lsr(opcode_arg(AM_ZP_X)); | 1459 | mode = AM_ZP_X; |
| 1460 | arg = opcode_arg(mode); | ||
| 1461 | lsr(arg); | ||
| 1254 | cycles += 6; | 1462 | cycles += 6; |
| 1255 | printf("LSR"); | 1463 | printf("LSR"); |
| 1256 | break; | 1464 | break; |
| 1257 | case 0x4e: | 1465 | case 0x4e: |
| 1258 | lsr(opcode_arg(AM_ABS)); | 1466 | mode = AM_ABS; |
| 1467 | arg = opcode_arg(mode); | ||
| 1468 | lsr(arg); | ||
| 1259 | cycles += 6; | 1469 | cycles += 6; |
| 1260 | printf("LSR"); | 1470 | printf("LSR"); |
| 1261 | break; | 1471 | break; |
| 1262 | case 0x5e: | 1472 | case 0x5e: |
| 1263 | lsr(opcode_arg(AM_ABS_X)); | 1473 | mode = AM_ABS_X; |
| 1474 | arg = opcode_arg(mode); | ||
| 1475 | lsr(arg); | ||
| 1264 | cycles += 6; | 1476 | cycles += 6; |
| 1265 | printf("LSR"); | 1477 | printf("LSR"); |
| 1266 | break; | 1478 | break; |
| 1267 | case 0xea: | 1479 | case 0xea: |
| 1480 | mode = AM_IMPLICIT; | ||
| 1268 | nop(); | 1481 | nop(); |
| 1269 | cycles += 2; | 1482 | cycles += 2; |
| 1270 | printf("\tNOP"); | 1483 | printf("\tNOP"); |
| 1271 | break; | 1484 | break; |
| 1272 | case 0x09: | 1485 | case 0x09: |
| 1273 | ora(opcode_arg(AM_IMM)); | 1486 | mode = AM_IMM; |
| 1487 | arg = opcode_arg(mode); | ||
| 1488 | ora(arg); | ||
| 1274 | cycles += 2; | 1489 | cycles += 2; |
| 1275 | printf("ORA"); | 1490 | printf("ORA"); |
| 1276 | break; | 1491 | break; |
| 1277 | case 0x05: | 1492 | case 0x05: |
| 1278 | ora(opcode_arg(AM_ZP)); | 1493 | mode = AM_ZP; |
| 1494 | arg = opcode_arg(mode); | ||
| 1495 | ora(arg); | ||
| 1279 | cycles += 3; | 1496 | cycles += 3; |
| 1280 | printf("ORA"); | 1497 | printf("ORA"); |
| 1281 | break; | 1498 | break; |
| 1282 | case 0x15: | 1499 | case 0x15: |
| 1283 | ora(opcode_arg(AM_ZP_X)); | 1500 | mode = AM_ZP_X; |
| 1501 | arg = opcode_arg(mode); | ||
| 1502 | ora(arg); | ||
| 1284 | cycles += 4; | 1503 | cycles += 4; |
| 1285 | printf("ORA"); | 1504 | printf("ORA"); |
| 1286 | break; | 1505 | break; |
| 1287 | case 0x0d: | 1506 | case 0x0d: |
| 1288 | ora(opcode_arg(AM_ABS)); | 1507 | mode = AM_ABS; |
| 1508 | arg = opcode_arg(mode); | ||
| 1509 | ora(arg); | ||
| 1289 | cycles += 4; | 1510 | cycles += 4; |
| 1290 | printf("ORA"); | 1511 | printf("ORA"); |
| 1291 | break; | 1512 | break; |
| 1292 | case 0x1d: | 1513 | case 0x1d: |
| 1293 | ora(opcode_arg(AM_ABS_X)); | 1514 | mode = AM_ABS_X; |
| 1515 | arg = opcode_arg(mode); | ||
| 1516 | ora(arg); | ||
| 1294 | cycles += 4; | 1517 | cycles += 4; |
| 1295 | printf("ORA"); | 1518 | printf("ORA"); |
| 1296 | break; | 1519 | break; |
| 1297 | case 0x19: | 1520 | case 0x19: |
| 1298 | ora(opcode_arg(AM_ABS_Y)); | 1521 | mode = AM_ABS_Y; |
| 1522 | arg = opcode_arg(mode); | ||
| 1523 | ora(arg); | ||
| 1299 | cycles += 4; | 1524 | cycles += 4; |
| 1300 | printf("ORA"); | 1525 | printf("ORA"); |
| 1301 | break; | 1526 | break; |
| 1302 | case 0x01: | 1527 | case 0x01: |
| 1303 | ora(opcode_arg(AM_IND_X)); | 1528 | mode = AM_IND_X; |
| 1529 | arg = opcode_arg(mode); | ||
| 1530 | ora(arg); | ||
| 1304 | cycles += 6; | 1531 | cycles += 6; |
| 1305 | printf("ORA"); | 1532 | printf("ORA"); |
| 1306 | break; | 1533 | break; |
| 1307 | case 0x11: | 1534 | case 0x11: |
| 1308 | ora(opcode_arg(AM_IND_Y)); | 1535 | mode = AM_IND_Y; |
| 1536 | arg = opcode_arg(mode); | ||
| 1537 | ora(arg); | ||
| 1309 | cycles += 5; | 1538 | cycles += 5; |
| 1310 | printf("ORA"); | 1539 | printf("ORA"); |
| 1311 | break; | 1540 | break; |
| 1312 | case 0x48: | 1541 | case 0x48: |
| 1542 | mode = AM_IMPLICIT; | ||
| 1313 | pha(); | 1543 | pha(); |
| 1314 | cycles += 3; | 1544 | cycles += 3; |
| 1315 | printf("\tPHA"); | 1545 | printf("\tPHA"); |
| 1316 | break; | 1546 | break; |
| 1317 | case 0x08: | 1547 | case 0x08: |
| 1548 | mode = AM_IMPLICIT; | ||
| 1318 | php(); | 1549 | php(); |
| 1319 | cycles += 3; | 1550 | cycles += 3; |
| 1320 | printf("\tPHP"); | 1551 | printf("\tPHP"); |
| 1321 | break; | 1552 | break; |
| 1322 | case 0x68: | 1553 | case 0x68: |
| 1554 | mode = AM_IMPLICIT; | ||
| 1323 | pla(); | 1555 | pla(); |
| 1324 | cycles += 4; | 1556 | cycles += 4; |
| 1325 | printf("\tPLA"); | 1557 | printf("\tPLA"); |
| 1326 | break; | 1558 | break; |
| 1327 | case 0x28: | 1559 | case 0x28: |
| 1560 | mode = AM_IMPLICIT; | ||
| 1328 | plp(); | 1561 | plp(); |
| 1329 | cycles += 4; | 1562 | cycles += 4; |
| 1330 | printf("\tPLP"); | 1563 | printf("\tPLP"); |
| 1331 | break; | 1564 | break; |
| 1332 | case 0x2a: | 1565 | case 0x2a: |
| 1566 | mode = AM_ACC; | ||
| 1333 | rol_acc(); | 1567 | rol_acc(); |
| 1334 | cycles += 2; | 1568 | cycles += 2; |
| 1335 | printf("\tROL"); | 1569 | printf("\tROL"); |
| 1336 | break; | 1570 | break; |
| 1337 | case 0x26: | 1571 | case 0x26: |
| 1338 | rol(opcode_arg(AM_ZP)); | 1572 | mode = AM_ZP; |
| 1573 | arg = opcode_arg(mode); | ||
| 1574 | rol(arg); | ||
| 1339 | cycles += 5; | 1575 | cycles += 5; |
| 1340 | printf("ROL"); | 1576 | printf("ROL"); |
| 1341 | break; | 1577 | break; |
| 1342 | case 0x36: | 1578 | case 0x36: |
| 1343 | rol(opcode_arg(AM_ZP_X)); | 1579 | mode = AM_ZP_X; |
| 1580 | arg = opcode_arg(mode); | ||
| 1581 | rol(arg); | ||
| 1344 | cycles += 6; | 1582 | cycles += 6; |
| 1345 | printf("ROL"); | 1583 | printf("ROL"); |
| 1346 | break; | 1584 | break; |
| 1347 | case 0x2e: | 1585 | case 0x2e: |
| 1348 | rol(opcode_arg(AM_ABS)); | 1586 | mode = AM_ABS; |
| 1587 | arg = opcode_arg(mode); | ||
| 1588 | rol(arg); | ||
| 1349 | cycles += 6; | 1589 | cycles += 6; |
| 1350 | printf("ROL"); | 1590 | printf("ROL"); |
| 1351 | break; | 1591 | break; |
| 1352 | case 0x3e: | 1592 | case 0x3e: |
| 1353 | rol(opcode_arg(AM_ABS_X)); | 1593 | mode = AM_ABS_X; |
| 1594 | arg = opcode_arg(mode); | ||
| 1595 | rol(arg); | ||
| 1354 | cycles += 6; | 1596 | cycles += 6; |
| 1355 | printf("ROL"); | 1597 | printf("ROL"); |
| 1356 | break; | 1598 | break; |
| 1357 | case 0x6a: | 1599 | case 0x6a: |
| 1600 | mode = AM_ACC; | ||
| 1358 | ror_acc(); | 1601 | ror_acc(); |
| 1359 | cycles += 2; | 1602 | cycles += 2; |
| 1360 | printf("\tROR"); | 1603 | printf("\tROR"); |
| 1361 | break; | 1604 | break; |
| 1362 | case 0x66: | 1605 | case 0x66: |
| 1363 | ror(opcode_arg(AM_ZP)); | 1606 | mode = AM_ZP; |
| 1607 | arg = opcode_arg(mode); | ||
| 1608 | ror(arg); | ||
| 1364 | cycles += 5; | 1609 | cycles += 5; |
| 1365 | printf("ROR"); | 1610 | printf("ROR"); |
| 1366 | break; | 1611 | break; |
| 1367 | case 0x76: | 1612 | case 0x76: |
| 1368 | ror(opcode_arg(AM_ZP_X)); | 1613 | mode = AM_ZP_X; |
| 1614 | arg = opcode_arg(mode); | ||
| 1615 | ror(arg); | ||
| 1369 | cycles += 6; | 1616 | cycles += 6; |
| 1370 | printf("ROR"); | 1617 | printf("ROR"); |
| 1371 | break; | 1618 | break; |
| 1372 | case 0x6e: | 1619 | case 0x6e: |
| 1373 | ror(opcode_arg(AM_ABS)); | 1620 | mode = AM_ABS; |
| 1621 | arg = opcode_arg(mode); | ||
| 1622 | ror(arg); | ||
| 1374 | cycles += 6; | 1623 | cycles += 6; |
| 1375 | printf("ROR"); | 1624 | printf("ROR"); |
| 1376 | break; | 1625 | break; |
| 1377 | case 0x7e: | 1626 | case 0x7e: |
| 1378 | ror(opcode_arg(AM_ABS_X)); | 1627 | mode = AM_ABS_X; |
| 1628 | arg = opcode_arg(mode); | ||
| 1629 | ror(arg); | ||
| 1379 | cycles += 6; | 1630 | cycles += 6; |
| 1380 | printf("ROR"); | 1631 | printf("ROR"); |
| 1381 | break; | 1632 | break; |
| 1382 | case 0x40: | 1633 | case 0x40: |
| 1634 | mode = AM_IMPLICIT; | ||
| 1383 | rti(); | 1635 | rti(); |
| 1384 | cycles += 6; | 1636 | cycles += 6; |
| 1385 | printf("\tRTI"); | 1637 | printf("\tRTI"); |
| 1386 | break; | 1638 | break; |
| 1387 | case 0x60: | 1639 | case 0x60: |
| 1640 | mode = AM_IMPLICIT; | ||
| 1388 | rts(); | 1641 | rts(); |
| 1389 | cycles += 6; | 1642 | cycles += 6; |
| 1390 | printf("\tRTS"); | 1643 | printf("\tRTS"); |
| 1391 | break; | 1644 | break; |
| 1392 | case 0xe9: | 1645 | case 0xe9: |
| 1393 | sbc(opcode_arg(AM_IMM)); | 1646 | mode = AM_IMM; |
| 1647 | arg = opcode_arg(mode); | ||
| 1648 | sbc(arg); | ||
| 1394 | cycles += 2; | 1649 | cycles += 2; |
| 1395 | printf("SBC"); | 1650 | printf("SBC"); |
| 1396 | break; | 1651 | break; |
| 1397 | case 0xe5: | 1652 | case 0xe5: |
| 1398 | sbc(opcode_arg(AM_ZP)); | 1653 | mode = AM_ZP; |
| 1654 | arg = opcode_arg(mode); | ||
| 1655 | sbc(arg); | ||
| 1399 | cycles += 3; | 1656 | cycles += 3; |
| 1400 | printf("SBC"); | 1657 | printf("SBC"); |
| 1401 | break; | 1658 | break; |
| 1402 | case 0xf5: | 1659 | case 0xf5: |
| 1403 | sbc(opcode_arg(AM_ZP_X)); | 1660 | mode = AM_ZP_X; |
| 1661 | arg = opcode_arg(mode); | ||
| 1662 | sbc(arg); | ||
| 1404 | cycles += 4; | 1663 | cycles += 4; |
| 1405 | printf("SBC"); | 1664 | printf("SBC"); |
| 1406 | break; | 1665 | break; |
| 1407 | case 0xed: | 1666 | case 0xed: |
| 1408 | sbc(opcode_arg(AM_ABS)); | 1667 | mode = AM_ABS; |
| 1668 | arg = opcode_arg(mode); | ||
| 1669 | sbc(arg); | ||
| 1409 | cycles += 4; | 1670 | cycles += 4; |
| 1410 | printf("SBC"); | 1671 | printf("SBC"); |
| 1411 | break; | 1672 | break; |
| 1412 | case 0xfd: | 1673 | case 0xfd: |
| 1413 | sbc(opcode_arg(AM_ABS_X)); | 1674 | mode = AM_ABS_X; |
| 1675 | arg = opcode_arg(mode); | ||
| 1676 | sbc(arg); | ||
| 1414 | cycles += 4; | 1677 | cycles += 4; |
| 1415 | printf("SBC"); | 1678 | printf("SBC"); |
| 1416 | break; | 1679 | break; |
| 1417 | case 0xf9: | 1680 | case 0xf9: |
| 1418 | sbc(opcode_arg(AM_ABS_Y)); | 1681 | mode = AM_ABS_Y; |
| 1682 | arg = opcode_arg(mode); | ||
| 1683 | sbc(arg); | ||
| 1419 | cycles += 4; | 1684 | cycles += 4; |
| 1420 | printf("SBC"); | 1685 | printf("SBC"); |
| 1421 | break; | 1686 | break; |
| 1422 | case 0xe1: | 1687 | case 0xe1: |
| 1423 | sbc(opcode_arg(AM_IND_X)); | 1688 | mode = AM_IND_X; |
| 1689 | arg = opcode_arg(mode); | ||
| 1690 | sbc(arg); | ||
| 1424 | cycles += 6; | 1691 | cycles += 6; |
| 1425 | printf("SBC"); | 1692 | printf("SBC"); |
| 1426 | break; | 1693 | break; |
| 1427 | case 0xf1: | 1694 | case 0xf1: |
| 1428 | sbc(opcode_arg(AM_IND_Y)); | 1695 | mode = AM_IND_Y; |
| 1696 | arg = opcode_arg(mode); | ||
| 1697 | sbc(arg); | ||
| 1429 | cycles += 5; | 1698 | cycles += 5; |
| 1430 | printf("SBC"); | 1699 | printf("SBC"); |
| 1431 | break; | 1700 | break; |
| 1432 | case 0x38: | 1701 | case 0x38: |
| 1702 | mode = AM_IMPLICIT; | ||
| 1433 | sec(); | 1703 | sec(); |
| 1434 | cycles += 2; | 1704 | cycles += 2; |
| 1435 | printf("\tSEC"); | 1705 | printf("\tSEC"); |
| 1436 | break; | 1706 | break; |
| 1437 | case 0xf8: | 1707 | case 0xf8: |
| 1708 | mode = AM_IMPLICIT; | ||
| 1438 | sed(); | 1709 | sed(); |
| 1439 | cycles += 2; | 1710 | cycles += 2; |
| 1440 | printf("\tSED"); | 1711 | printf("\tSED"); |
| 1441 | break; | 1712 | break; |
| 1442 | case 0x78: | 1713 | case 0x78: |
| 1714 | mode = AM_IMPLICIT; | ||
| 1443 | sei(); | 1715 | sei(); |
| 1444 | cycles += 2; | 1716 | cycles += 2; |
| 1445 | printf("\tSEI"); | 1717 | printf("\tSEI"); |
| 1446 | break; | 1718 | break; |
| 1447 | case 0x85: | 1719 | case 0x85: |
| 1448 | sta(opcode_mem(AM_ZP)); | 1720 | mode = AM_ZP; |
| 1721 | arg = opcode_mem(mode); | ||
| 1722 | did_memwrite = 1; | ||
| 1723 | ret = sta(arg); | ||
| 1449 | cycles += 4; | 1724 | cycles += 4; |
| 1450 | printf("STA"); | 1725 | printf("STA"); |
| 1451 | break; | 1726 | break; |
| 1452 | case 0x95: | 1727 | case 0x95: |
| 1453 | sta(opcode_mem(AM_ZP_X)); | 1728 | mode = AM_ZP_X; |
| 1729 | arg = opcode_mem(mode); | ||
| 1730 | did_memwrite = 1; | ||
| 1731 | ret = sta(arg); | ||
| 1454 | cycles += 5; | 1732 | cycles += 5; |
| 1455 | printf("STA"); | 1733 | printf("STA"); |
| 1456 | break; | 1734 | break; |
| 1457 | case 0x8d: | 1735 | case 0x8d: |
| 1458 | sta(opcode_mem(AM_ABS)); | 1736 | mode = AM_ABS; |
| 1737 | arg = opcode_mem(mode); | ||
| 1738 | did_memwrite = 1; | ||
| 1739 | ret = sta(arg); | ||
| 1459 | cycles += 5; | 1740 | cycles += 5; |
| 1460 | printf("STA"); | 1741 | printf("STA"); |
| 1461 | break; | 1742 | break; |
| 1462 | case 0x9d: | 1743 | case 0x9d: |
| 1463 | sta(opcode_mem(AM_ABS_X)); | 1744 | mode = AM_ABS_X; |
| 1745 | arg = opcode_mem(mode); | ||
| 1746 | did_memwrite = 1; | ||
| 1747 | ret = sta(arg); | ||
| 1464 | cycles += 6; | 1748 | cycles += 6; |
| 1465 | printf("STA"); | 1749 | printf("STA"); |
| 1466 | break; | 1750 | break; |
| 1467 | case 0x99: | 1751 | case 0x99: |
| 1468 | sta(opcode_mem(AM_ABS_Y)); | 1752 | mode = AM_ABS_Y; |
| 1753 | arg = opcode_mem(mode); | ||
| 1754 | did_memwrite = 1; | ||
| 1755 | ret = sta(arg); | ||
| 1469 | cycles += 6; | 1756 | cycles += 6; |
| 1470 | printf("STA"); | 1757 | printf("STA"); |
| 1471 | break; | 1758 | break; |
| 1472 | case 0x81: | 1759 | case 0x81: |
| 1473 | sta(opcode_mem(AM_IND_X)); | 1760 | mode = AM_IND_X; |
| 1761 | arg = opcode_mem(mode); | ||
| 1762 | did_memwrite = 1; | ||
| 1763 | ret = sta(arg); | ||
| 1474 | cycles += 7; | 1764 | cycles += 7; |
| 1475 | printf("STA"); | 1765 | printf("STA"); |
| 1476 | break; | 1766 | break; |
| 1477 | case 0x91: | 1767 | case 0x91: |
| 1478 | sta(opcode_mem(AM_IND_Y)); | 1768 | mode = AM_IND_Y; |
| 1769 | arg = opcode_mem(mode); | ||
| 1770 | did_memwrite = 1; | ||
| 1771 | ret = sta(arg); | ||
| 1479 | cycles += 7; | 1772 | cycles += 7; |
| 1480 | printf("STA"); | 1773 | printf("STA"); |
| 1481 | break; | 1774 | break; |
| 1482 | case 0x86: | 1775 | case 0x86: |
| 1483 | stx(opcode_mem(AM_ZP)); | 1776 | mode = AM_ZP; |
| 1777 | arg = opcode_mem(mode); | ||
| 1778 | did_memwrite = 1; | ||
| 1779 | ret = stx(arg); | ||
| 1484 | cycles += 4; | 1780 | cycles += 4; |
| 1485 | printf("STX"); | 1781 | printf("STX"); |
| 1486 | break; | 1782 | break; |
| 1487 | case 0x96: | 1783 | case 0x96: |
| 1488 | stx(opcode_mem(AM_ZP_Y)); | 1784 | mode = AM_ZP_Y; |
| 1785 | arg = opcode_mem(mode); | ||
| 1786 | did_memwrite = 1; | ||
| 1787 | ret = stx(arg); | ||
| 1489 | cycles += 5; | 1788 | cycles += 5; |
| 1490 | printf("STX"); | 1789 | printf("STX"); |
| 1491 | break; | 1790 | break; |
| 1492 | case 0x8e: | 1791 | case 0x8e: |
| 1493 | stx(opcode_mem(AM_ABS)); | 1792 | mode = AM_ABS; |
| 1793 | arg = opcode_mem(mode); | ||
| 1794 | did_memwrite = 1; | ||
| 1795 | ret = stx(arg); | ||
| 1494 | cycles += 5; | 1796 | cycles += 5; |
| 1495 | printf("STX"); | 1797 | printf("STX"); |
| 1496 | break; | 1798 | break; |
| 1497 | case 0x84: | 1799 | case 0x84: |
| 1498 | sty(opcode_mem(AM_ZP)); | 1800 | mode = AM_ZP; |
| 1801 | arg = opcode_mem(mode); | ||
| 1802 | did_memwrite = 1; | ||
| 1803 | ret = sty(arg); | ||
| 1499 | cycles += 4; | 1804 | cycles += 4; |
| 1500 | printf("STY"); | 1805 | printf("STY"); |
| 1501 | break; | 1806 | break; |
| 1502 | case 0x94: | 1807 | case 0x94: |
| 1503 | sty(opcode_mem(AM_ZP_X)); | 1808 | mode = AM_ZP_X; |
| 1809 | arg = opcode_mem(mode); | ||
| 1810 | did_memwrite = 1; | ||
| 1811 | ret = sty(arg); | ||
| 1504 | cycles += 5; | 1812 | cycles += 5; |
| 1505 | printf("STY"); | 1813 | printf("STY"); |
| 1506 | break; | 1814 | break; |
| 1507 | case 0x8c: | 1815 | case 0x8c: |
| 1508 | sty(opcode_mem(AM_ABS)); | 1816 | mode = AM_ABS; |
| 1817 | arg = opcode_mem(mode); | ||
| 1818 | did_memwrite = 1; | ||
| 1819 | ret = sty(arg); | ||
| 1509 | cycles += 5; | 1820 | cycles += 5; |
| 1510 | printf("STY"); | 1821 | printf("STY"); |
| 1511 | break; | 1822 | break; |
| 1512 | case 0xaa: | 1823 | case 0xaa: |
| 1824 | mode = AM_IMPLICIT; | ||
| 1513 | tax(); | 1825 | tax(); |
| 1514 | cycles += 2; | 1826 | cycles += 2; |
| 1515 | printf("\tTAX"); | 1827 | printf("\tTAX"); |
| 1516 | break; | 1828 | break; |
| 1517 | case 0xa8: | 1829 | case 0xa8: |
| 1830 | mode = AM_IMPLICIT; | ||
| 1518 | tay(); | 1831 | tay(); |
| 1519 | cycles += 2; | 1832 | cycles += 2; |
| 1520 | printf("\tTAY"); | 1833 | printf("\tTAY"); |
| 1521 | break; | 1834 | break; |
| 1522 | case 0xba: | 1835 | case 0xba: |
| 1836 | mode = AM_IMPLICIT; | ||
| 1523 | tsx(); | 1837 | tsx(); |
| 1524 | cycles += 2; | 1838 | cycles += 2; |
| 1525 | printf("\tTSX"); | 1839 | printf("\tTSX"); |
| 1526 | break; | 1840 | break; |
| 1527 | case 0x8a: | 1841 | case 0x8a: |
| 1842 | mode = AM_IMPLICIT; | ||
| 1528 | txa(); | 1843 | txa(); |
| 1529 | cycles += 2; | 1844 | cycles += 2; |
| 1530 | printf("\tTXA"); | 1845 | printf("\tTXA"); |
| 1531 | break; | 1846 | break; |
| 1532 | case 0x9a: | 1847 | case 0x9a: |
| 1848 | mode = AM_IMPLICIT; | ||
| 1533 | txs(); | 1849 | txs(); |
| 1534 | cycles += 2; | 1850 | cycles += 2; |
| 1535 | printf("\tTXS"); | 1851 | printf("\tTXS"); |
| 1536 | break; | 1852 | break; |
| 1537 | case 0x98: | 1853 | case 0x98: |
| 1854 | mode = AM_IMPLICIT; | ||
| 1538 | tya(); | 1855 | tya(); |
| 1539 | cycles += 2; | 1856 | cycles += 2; |
| 1540 | printf("\tTYA"); | 1857 | printf("\tTYA"); |
| @@ -1544,9 +1861,56 @@ interpret(void) | |||
| 1544 | break; | 1861 | break; |
| 1545 | } | 1862 | } |
| 1546 | 1863 | ||
| 1547 | printf("%50c:%02X X:%02X Y:%02X P:%02X SP:%02X CYC:%d\n", 'A', | 1864 | switch (mode) { |
| 1865 | case AM_IMM: | ||
| 1866 | printf(" #$%02X", arg); | ||
| 1867 | if (did_memwrite) printf(" = %02X\t\t\t", ret); | ||
| 1868 | else printf("\t\t\t"); | ||
| 1869 | break; | ||
| 1870 | case AM_ZP: | ||
| 1871 | printf(" $%02X", arg); | ||
| 1872 | if (did_memwrite) printf(" = %02X\t\t\t", ret); | ||
| 1873 | else printf("\t\t\t\t"); | ||
| 1874 | break; | ||
| 1875 | case AM_ZP_X: | ||
| 1876 | printf(" $%02X,X", arg); | ||
| 1877 | if (did_memwrite) printf(" = %02X\t\t\t", ret); | ||
| 1878 | else printf("\t\t\t\t"); | ||
| 1879 | break; | ||
| 1880 | case AM_ZP_Y: | ||
| 1881 | printf(" $%02X,Y", arg); | ||
| 1882 | if (did_memwrite) printf(" = %02X\t\t\t", ret); | ||
| 1883 | else printf("\t\t\t\t"); | ||
| 1884 | break; | ||
| 1885 | case AM_ABS: | ||
| 1886 | printf(" $%04X", arg); | ||
| 1887 | if (did_memwrite) printf(" = %02X\t\t\t", ret); | ||
| 1888 | else printf("\t\t\t"); | ||
| 1889 | break; | ||
| 1890 | case AM_ABS_X: | ||
| 1891 | printf(" $%04X,X", arg); | ||
| 1892 | if (did_memwrite) printf(" = %02X\t\t\t", ret); | ||
| 1893 | else printf("\t\t\t"); | ||
| 1894 | break; | ||
| 1895 | case AM_ABS_Y: | ||
| 1896 | printf(" $%04X,Y", arg); | ||
| 1897 | if (did_memwrite) printf(" = %02X\t\t\t", ret); | ||
| 1898 | else printf("\t\t\t"); | ||
| 1899 | break; | ||
| 1900 | case AM_IND: | ||
| 1901 | printf(" ($%04X) = %04X\t\t", mem, deref); | ||
| 1902 | break; | ||
| 1903 | case AM_ACC: | ||
| 1904 | case AM_IMPLICIT: | ||
| 1905 | default: | ||
| 1906 | printf("\t\t\t\t"); | ||
| 1907 | break; | ||
| 1908 | } | ||
| 1909 | |||
| 1910 | printf("A:%02X X:%02X Y:%02X P:%02X SP:%02X CYC:%d\n", | ||
| 1548 | regs.a, regs.x, regs.y, STATUS_TO_INT(), regs.sp, cycles_); | 1911 | regs.a, regs.x, regs.y, STATUS_TO_INT(), regs.sp, cycles_); |
| 1549 | } | 1912 | } |
| 1913 | loop_exit: | ||
| 1550 | } | 1914 | } |
| 1551 | 1915 | ||
| 1552 | /* https://www.nesdev.org/wiki/CPU_power_up_state */ | 1916 | /* https://www.nesdev.org/wiki/CPU_power_up_state */ |
| @@ -1604,6 +1968,9 @@ main(int argc, char *argv[]) | |||
| 1604 | 1968 | ||
| 1605 | interpret(); | 1969 | interpret(); |
| 1606 | 1970 | ||
| 1971 | printf("\n$02 = %02X\n", memory[0x02]); | ||
| 1972 | printf("$03 = %02X\n", memory[0x03]); | ||
| 1973 | |||
| 1607 | free_rom(&rom); | 1974 | free_rom(&rom); |
| 1608 | 1975 | ||
| 1609 | return 0; | 1976 | return 0; |
