fix(cpu): resolve issues with unexpected PC value in THUMB
This commit is contained in:
parent
b9a81baa47
commit
a17dfbe41f
|
@ -8,7 +8,7 @@ pub fn format12(comptime isSP: bool, comptime rd: u3) InstrFn {
|
||||||
return struct {
|
return struct {
|
||||||
fn inner(cpu: *Arm7tdmi, _: *Bus, opcode: u16) void {
|
fn inner(cpu: *Arm7tdmi, _: *Bus, opcode: u16) void {
|
||||||
// ADD
|
// ADD
|
||||||
const left = if (isSP) cpu.r[13] else cpu.fakePC() & 0xFFFF_FFFC;
|
const left = if (isSP) cpu.r[13] else (cpu.r[15] + 2) & 0xFFFF_FFFD;
|
||||||
const right = (opcode & 0xFF) << 2;
|
const right = (opcode & 0xFF) << 2;
|
||||||
const result = left + right; // TODO: What about overflows?
|
const result = left + right; // TODO: What about overflows?
|
||||||
cpu.r[rd] = result;
|
cpu.r[rd] = result;
|
||||||
|
|
|
@ -19,7 +19,7 @@ pub fn format16(comptime cond: u4) InstrFn {
|
||||||
};
|
};
|
||||||
|
|
||||||
if (should_execute) {
|
if (should_execute) {
|
||||||
cpu.r[15] = (cpu.fakePC() & 0xFFFF_FFFC) +% offset;
|
cpu.r[15] = (cpu.r[15] + 2) +% offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.inner;
|
}.inner;
|
||||||
|
|
|
@ -19,7 +19,7 @@ pub fn format19(comptime is_low: bool) InstrFn {
|
||||||
cpu.r[14] = old_pc | 1;
|
cpu.r[14] = old_pc | 1;
|
||||||
} else {
|
} else {
|
||||||
// Instruction 1
|
// Instruction 1
|
||||||
cpu.r[14] = (cpu.fakePC() & 0xFFFF_FFFC) + (u32SignExtend(11, @as(u32, offset)) << 12);
|
cpu.r[14] = (cpu.r[15] + 2) + (u32SignExtend(11, @as(u32, offset)) << 12);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}.inner;
|
}.inner;
|
||||||
|
|
|
@ -11,7 +11,7 @@ pub fn format6(comptime rd: u3) InstrFn {
|
||||||
const offset = (opcode & 0xFF) << 2;
|
const offset = (opcode & 0xFF) << 2;
|
||||||
|
|
||||||
// FIXME: Should this overflow?
|
// FIXME: Should this overflow?
|
||||||
cpu.r[rd] = bus.read32((cpu.fakePC() & 0xFFFF_FFFC) + offset);
|
cpu.r[rd] = bus.read32((cpu.r[15] + 2 & 0xFFFF_FFFD) + offset);
|
||||||
}
|
}
|
||||||
}.inner;
|
}.inner;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue