summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpu.c53
1 files changed, 7 insertions, 46 deletions
diff --git a/cpu.c b/cpu.c
index 7ae0867..4528ff5 100644
--- a/cpu.c
+++ b/cpu.c
@@ -138,15 +138,12 @@ opcode_arg(enum addressing_mode mode)
138 break; 138 break;
139 case AM_ABS: 139 case AM_ABS:
140 val = peek16(arg); 140 val = peek16(arg);
141 printf("$%04X", arg);
142 break; 141 break;
143 case AM_ABS_X: 142 case AM_ABS_X:
144 val = peek16(arg + regs.x); 143 val = peek16(arg + regs.x);
145 printf("$%04X", arg);
146 break; 144 break;
147 case AM_ABS_Y: 145 case AM_ABS_Y:
148 val = peek16(arg + regs.y); 146 val = peek16(arg + regs.y);
149 printf("$%04X", arg);
150 break; 147 break;
151 case AM_IND_X: 148 case AM_IND_X:
152 val = peek(peek((arg + regs.x) % 256) + peek((arg + regs.x + 1) % 256) * 256); 149 val = peek(peek((arg + regs.x) % 256) + peek((arg + regs.x + 1) % 256) * 256);
@@ -155,7 +152,7 @@ opcode_arg(enum addressing_mode mode)
155 val = peek(peek(arg) + peek((arg + 1) % 256) * 256 + regs.y); 152 val = peek(peek(arg) + peek((arg + 1) % 256) * 256 + regs.y);
156 break; 153 break;
157 default: 154 default:
158 fprintf(stderr, "INVALID ADDRESSING MODE\n"); 155 fprintf(stderr, "INVALID ADDRESSING MODE %i\n", mode);
159 abort(); 156 abort();
160 } 157 }
161 158
@@ -196,6 +193,9 @@ opcode_mem(enum addressing_mode mode)
196 case AM_ABS_Y: 193 case AM_ABS_Y:
197 val = arg + regs.y; 194 val = arg + regs.y;
198 break; 195 break;
196 case AM_IND:
197 val = peek16(arg);
198 break;
199 case AM_IND_X: 199 case AM_IND_X:
200 val = peek((arg + regs.x) % 256) + peek((arg + regs.x + 1) % 256) * 256; 200 val = peek((arg + regs.x) % 256) + peek((arg + regs.x + 1) % 256) * 256;
201 break; 201 break;
@@ -754,7 +754,8 @@ tya(void)
754static void 754static void
755interpret(void) 755interpret(void)
756{ 756{
757 uint8_t opcode, cycles_; 757 uint8_t opcode;
758 uint32_t cycles_;
758 759
759 for (;;) { 760 for (;;) {
760 opcode = peek(regs.pc++); 761 opcode = peek(regs.pc++);
@@ -793,11 +794,6 @@ interpret(void)
793 cycles += 4; 794 cycles += 4;
794 printf("ADC"); 795 printf("ADC");
795 break; 796 break;
796 case 0x72:
797 adc(opcode_arg(AM_IND));
798 cycles += 5;
799 printf("ADC");
800 break;
801 case 0x61: 797 case 0x61:
802 adc(opcode_arg(AM_IND_X)); 798 adc(opcode_arg(AM_IND_X));
803 cycles += 6; 799 cycles += 6;
@@ -838,11 +834,6 @@ interpret(void)
838 cycles += 4; 834 cycles += 4;
839 printf("AND"); 835 printf("AND");
840 break; 836 break;
841 case 0x32:
842 and(opcode_arg(AM_IND));
843 cycles += 5;
844 printf("AND");
845 break;
846 case 0x21: 837 case 0x21:
847 and(opcode_arg(AM_IND_X)); 838 and(opcode_arg(AM_IND_X));
848 cycles += 6; 839 cycles += 6;
@@ -998,11 +989,6 @@ interpret(void)
998 cycles += 4; 989 cycles += 4;
999 printf("CMP"); 990 printf("CMP");
1000 break; 991 break;
1001 case 0xd2:
1002 cmp(opcode_arg(AM_IND));
1003 cycles += 5;
1004 printf("CMP");
1005 break;
1006 case 0xc1: 992 case 0xc1:
1007 cmp(opcode_arg(AM_IND_X)); 993 cmp(opcode_arg(AM_IND_X));
1008 cycles += 6; 994 cycles += 6;
@@ -1103,11 +1089,6 @@ interpret(void)
1103 cycles += 4; 1089 cycles += 4;
1104 printf("EOR"); 1090 printf("EOR");
1105 break; 1091 break;
1106 case 0x52:
1107 eor(opcode_arg(AM_IND));
1108 cycles += 5;
1109 printf("EOR");
1110 break;
1111 case 0x41: 1092 case 0x41:
1112 eor(opcode_arg(AM_IND_X)); 1093 eor(opcode_arg(AM_IND_X));
1113 cycles += 6; 1094 cycles += 6;
@@ -1154,7 +1135,7 @@ interpret(void)
1154 printf("JMP"); 1135 printf("JMP");
1155 break; 1136 break;
1156 case 0x6c: 1137 case 0x6c:
1157 jmp(opcode_arg(AM_IND)); 1138 jmp(opcode_mem(AM_IND));
1158 cycles += 6; 1139 cycles += 6;
1159 printf("JMP"); 1140 printf("JMP");
1160 break; 1141 break;
@@ -1198,11 +1179,6 @@ interpret(void)
1198 cycles += 4; 1179 cycles += 4;
1199 printf("LDA"); 1180 printf("LDA");
1200 break; 1181 break;
1201 case 0xb2:
1202 lda(opcode_arg(AM_IND));
1203 cycles += 5;
1204 printf("LDA");
1205 break;
1206 case 0xa1: 1182 case 0xa1:
1207 lda(opcode_arg(AM_IND_X)); 1183 lda(opcode_arg(AM_IND_X));
1208 cycles += 6; 1184 cycles += 6;
@@ -1323,11 +1299,6 @@ interpret(void)
1323 cycles += 4; 1299 cycles += 4;
1324 printf("ORA"); 1300 printf("ORA");
1325 break; 1301 break;
1326 case 0x12:
1327 ora(opcode_arg(AM_IND));
1328 cycles += 5;
1329 printf("ORA");
1330 break;
1331 case 0x01: 1302 case 0x01:
1332 ora(opcode_arg(AM_IND_X)); 1303 ora(opcode_arg(AM_IND_X));
1333 cycles += 6; 1304 cycles += 6;
@@ -1448,11 +1419,6 @@ interpret(void)
1448 cycles += 4; 1419 cycles += 4;
1449 printf("SBC"); 1420 printf("SBC");
1450 break; 1421 break;
1451 case 0xf2:
1452 sbc(opcode_arg(AM_IND));
1453 cycles += 5;
1454 printf("SBC");
1455 break;
1456 case 0xe1: 1422 case 0xe1:
1457 sbc(opcode_arg(AM_IND_X)); 1423 sbc(opcode_arg(AM_IND_X));
1458 cycles += 6; 1424 cycles += 6;
@@ -1503,11 +1469,6 @@ interpret(void)
1503 cycles += 6; 1469 cycles += 6;
1504 printf("STA"); 1470 printf("STA");
1505 break; 1471 break;
1506 case 0x92:
1507 sta(opcode_mem(AM_IND));
1508 cycles += 6;
1509 printf("STA");
1510 break;
1511 case 0x81: 1472 case 0x81:
1512 sta(opcode_mem(AM_IND_X)); 1473 sta(opcode_mem(AM_IND_X));
1513 cycles += 7; 1474 cycles += 7;