diff options
| author | vin <git@vineetk.net> | 2024-06-28 10:28:53 -0400 |
|---|---|---|
| committer | vin <git@vineetk.net> | 2024-06-28 10:28:53 -0400 |
| commit | c1a42045e69797987ffa654da8dc76d577ac2629 (patch) | |
| tree | 294fb76eed7a917df331a8334f1016b94aa66ab7 /cpu.c | |
| parent | 09692f45f62a76ce0418bbf4762885990d9860ef (diff) | |
fix more bugs
Diffstat (limited to 'cpu.c')
| -rw-r--r-- | cpu.c | 53 |
1 files changed, 7 insertions, 46 deletions
| @@ -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) | |||
| 754 | static void | 754 | static void |
| 755 | interpret(void) | 755 | interpret(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; |
