summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpu.c639
1 files changed, 503 insertions, 136 deletions
diff --git a/cpu.c b/cpu.c
index 4528ff5..6d8c599 100644
--- a/cpu.c
+++ b/cpu.c
@@ -50,6 +50,8 @@ struct registers regs = {0};
50struct Rom rom = {0}; 50struct Rom rom = {0};
51 51
52enum addressing_mode { 52enum 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
284static void 286static uint8_t
285bit(uint8_t arg) 287bit(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
292static void 296static 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
322static void 325static void
@@ -682,22 +685,31 @@ sei(void)
682 regs.status.interrupt_disable = 1; 685 regs.status.interrupt_disable = 1;
683} 686}
684 687
685static void 688static uint8_t
686sta(uint16_t mem) 689sta(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
691static void 697static uint8_t
692stx(uint16_t mem) 698stx(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
697static void 706static uint8_t
698sty(uint16_t mem) 707sty(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
703static void 715static void
@@ -754,787 +766,1092 @@ tya(void)
754static void 766static void
755interpret(void) 767interpret(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 }
1913loop_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;