1
0
mirror of https://github.com/rkujawa/rk65c02.git synced 2025-03-03 14:29:23 +00:00

Correct address calculation for absolute indirect and absolute indirect X modes.

This commit is contained in:
Radosław Kujawa 2017-01-28 00:10:22 +01:00
parent 8d2d694158
commit 735c3677ce

View File

@ -156,17 +156,22 @@ emul_iny(rk65c02emu_t *e, void *id, instruction_t *i)
void void
emul_jmp(rk65c02emu_t *e, void *id, instruction_t *i) emul_jmp(rk65c02emu_t *e, void *id, instruction_t *i)
{ {
uint16_t target;//, iaddr; uint16_t target, iaddr;
switch (((instrdef_t *)id)->mode) { switch (((instrdef_t *)id)->mode) {
case ABSOLUTE: case ABSOLUTE:
target = i->op1 + (i->op2 << 8); target = i->op1 + (i->op2 << 8);
break; break;
case IABSOLUTE: case IABSOLUTE:
target = bus_read_1(e->bus, i->op1); iaddr = i->op1 + (i->op2 << 8);
target |= (bus_read_1(e->bus, i->op2) << 8); target = bus_read_1(e->bus, iaddr);
// target = bus_read_1(e->bus, indirect); target |= bus_read_1(e->bus, iaddr+1) << 8;
// target |= bus_read_1(e->bus, indirect + 1); 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: default:
assert(false); /* should never happen, lol */ assert(false); /* should never happen, lol */
break; break;