fix: properly decode format 11 instructions
This commit is contained in:
parent
603e4b6fdf
commit
f9e7128061
|
@ -496,7 +496,7 @@ fn thumbPopulate() [0x400]ThumbInstrFn {
|
||||||
},
|
},
|
||||||
0b001 => blk: {
|
0b001 => blk: {
|
||||||
const L = i >> 5 & 1 == 1;
|
const L = i >> 5 & 1 == 1;
|
||||||
const rd = i >> 2 & 0x3;
|
const rd = i >> 2 & 0x7;
|
||||||
break :blk format11(L, rd);
|
break :blk format11(L, rd);
|
||||||
},
|
},
|
||||||
0b010 => blk: {
|
0b010 => blk: {
|
||||||
|
|
|
@ -5,12 +5,12 @@ const InstrFn = @import("../../cpu.zig").ThumbInstrFn;
|
||||||
pub fn format14(comptime L: bool, comptime R: bool) InstrFn {
|
pub fn format14(comptime L: bool, comptime R: bool) InstrFn {
|
||||||
return struct {
|
return struct {
|
||||||
fn inner(cpu: *Arm7tdmi, bus: *Bus, opcode: u16) void {
|
fn inner(cpu: *Arm7tdmi, bus: *Bus, opcode: u16) void {
|
||||||
const count = countRlist(opcode);
|
const count = @boolToInt(R) + countRlist(opcode);
|
||||||
const start = cpu.r[13] - if (!L) 4 * (@boolToInt(R) + count) else 0;
|
const start = cpu.r[13] - if (!L) count * 4 else 0;
|
||||||
|
|
||||||
var end = cpu.r[13];
|
var end = cpu.r[13];
|
||||||
if (L) {
|
if (L) {
|
||||||
end += 4 * (@boolToInt(R) + count);
|
end += count * 4;
|
||||||
} else {
|
} else {
|
||||||
end -= 4;
|
end -= 4;
|
||||||
}
|
}
|
||||||
|
@ -40,7 +40,7 @@ pub fn format14(comptime L: bool, comptime R: bool) InstrFn {
|
||||||
address += 4;
|
address += 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu.r[13] = if (L) end else cpu.r[13] - 4 * (@boolToInt(R) + count);
|
cpu.r[13] = if (L) end else start;
|
||||||
}
|
}
|
||||||
}.inner;
|
}.inner;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue