diff --git a/src/cpu/thumb/format3.zig b/src/cpu/thumb/format3.zig index 7939113..a40e627 100644 --- a/src/cpu/thumb/format3.zig +++ b/src/cpu/thumb/format3.zig @@ -28,6 +28,7 @@ pub fn format3(comptime op: u2, comptime rd: u3) InstrFn { cpu.cpsr.v.write(((left ^ result) & (~offset ^ result)) >> 31 & 1 == 1); }, 0b10 => { + // ADD const left = cpu.r[rd]; var result: u32 = undefined; @@ -40,7 +41,15 @@ pub fn format3(comptime op: u2, comptime rd: u3) InstrFn { cpu.cpsr.v.write(((left ^ result) & (offset ^ result)) >> 31 & 1 == 1); }, 0b11 => { - std.debug.panic("TODO: Implement sub R{}, #0x{X:0>2}", .{ rd, offset }); + // SUB + const left = cpu.r[rd]; + const result = left -% offset; + cpu.r[rd] = result; + + cpu.cpsr.n.write(result >> 31 & 1 == 1); + cpu.cpsr.z.write(result == 0); + cpu.cpsr.c.write(offset <= left); + cpu.cpsr.v.write(((left ^ result) & (~offset ^ result)) >> 31 & 1 == 1); }, } }