chore: add non-working pipeline

This commit is contained in:
2022-06-29 06:33:17 -03:00
parent 5d9a57c7eb
commit c47ef37ba5
3 changed files with 46 additions and 13 deletions

View File

@@ -9,14 +9,24 @@ const sext = @import("../../util.zig").sext;
pub fn branch(comptime L: bool) InstrFn {
return struct {
fn inner(cpu: *Arm7tdmi, _: *Bus, opcode: u32) void {
if (L) cpu.r[14] = cpu.r[15];
cpu.r[15] = cpu.fakePC() +% (sext(u32, u24, opcode) << 2);
if (L) cpu.r[14] = cpu.r[15] - 4;
cpu.r[15] = cpu.r[15] +% (sext(u32, u24, opcode) << 2);
cpu.reloadPipeline(u32);
}
}.inner;
}
pub fn branchAndExchange(cpu: *Arm7tdmi, _: *Bus, opcode: u32) void {
const rn = opcode & 0xF;
cpu.cpsr.t.write(cpu.r[rn] & 1 == 1);
cpu.r[15] = cpu.r[rn] & 0xFFFF_FFFE;
if (cpu.r[rn] & 1 == 1) {
cpu.r[15] = cpu.r[rn] & ~@as(u32, 1);
cpu.cpsr.t.set();
cpu.reloadPipeline(u16);
} else {
cpu.r[15] = cpu.r[rn] & ~@as(u32, 3);
cpu.cpsr.t.unset();
cpu.reloadPipeline(u32);
}
}