From 735c3677ce827ecae9bec2baf12e3e86f49a24ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Kujawa?= Date: Sat, 28 Jan 2017 00:10:22 +0100 Subject: [PATCH] Correct address calculation for absolute indirect and absolute indirect X modes. --- src/emulation.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/emulation.c b/src/emulation.c index bc47fd2..3eb4253 100644 --- a/src/emulation.c +++ b/src/emulation.c @@ -156,17 +156,22 @@ emul_iny(rk65c02emu_t *e, void *id, instruction_t *i) void emul_jmp(rk65c02emu_t *e, void *id, instruction_t *i) { - uint16_t target;//, iaddr; + uint16_t target, iaddr; switch (((instrdef_t *)id)->mode) { case ABSOLUTE: target = i->op1 + (i->op2 << 8); break; case IABSOLUTE: - target = bus_read_1(e->bus, i->op1); - target |= (bus_read_1(e->bus, i->op2) << 8); -// target = bus_read_1(e->bus, indirect); -// target |= bus_read_1(e->bus, indirect + 1); + iaddr = i->op1 + (i->op2 << 8); + target = bus_read_1(e->bus, iaddr); + target |= bus_read_1(e->bus, iaddr+1) << 8; + break; + case IABSOLUTEX: + iaddr = i->op1 + (i->op2 << 8) + e->regs.X; + target = bus_read_1(e->bus, iaddr); + target |= bus_read_1(e->bus, iaddr + 1) << 8; + break; default: assert(false); /* should never happen, lol */ break;