summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvin <git@vineetk.net>2024-06-30 15:14:38 -0400
committervin <git@vineetk.net>2024-06-30 15:20:03 -0400
commit4525490beb4d4aa3c4359060db177c06ff09b3a1 (patch)
tree6895f1a49cd1adfd0c30c008de68f04c6a80b1fe
parent718f89c9c56ea059f114edbdda098408ec3a6e8f (diff)
fix indirect JMP bug where the high byte does not increment out of page
https://old.reddit.com/r/EmuDev/comments/15plfes/having_an_issue_with_nestest_on_my_6502_emulator/jvyck7k/ With this, it seems that all official opcodes run as nestest expects. Now, it's the unofficial opcodes that need to be implemented.
-rw-r--r--cpu.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/cpu.c b/cpu.c
index 51ab824..a2fea28 100644
--- a/cpu.c
+++ b/cpu.c
@@ -196,7 +196,7 @@ opcode_mem(enum addressing_mode mode)
196 val = arg + regs.y; 196 val = arg + regs.y;
197 break; 197 break;
198 case AM_IND: 198 case AM_IND:
199 val = peek16(arg); 199 val = peek(arg) | (peek(((arg + 1) & 0xFF) | (arg & 0xFF00)) << 8);
200 break; 200 break;
201 case AM_IND_X: 201 case AM_IND_X:
202 val = peek((arg + regs.x) % 256) + peek((arg + regs.x + 1) % 256) * 256; 202 val = peek((arg + regs.x) % 256) + peek((arg + regs.x + 1) % 256) * 256;
@@ -1308,9 +1308,10 @@ interpret(void)
1308 case 0x6c: 1308 case 0x6c:
1309 mode = AM_IND; 1309 mode = AM_IND;
1310 mem = peek16(regs.pc); 1310 mem = peek16(regs.pc);
1311 deref = peek(mem); 1311 deref = peek16(mem);
1312 arg = opcode_mem(mode); 1312 arg = opcode_mem(mode);
1313 jmp(deref); 1313 deref = arg;
1314 jmp(arg);
1314 cycles += 6; 1315 cycles += 6;
1315 printf("JMP"); 1316 printf("JMP");
1316 break; 1317 break;