diff --git a/src/cpu/arm/exec.cc b/src/cpu/arm/exec.cc index d63371e..eb27115 100644 --- a/src/cpu/arm/exec.cc +++ b/src/cpu/arm/exec.cc @@ -24,15 +24,19 @@ Instruction::exec(Cpu& cpu) { std::visit( overloaded{ [&cpu, pc_warn](BranchAndExchange& data) { - State state = static_cast(data.rn & 1); + uint32_t addr = cpu.gpr[data.rn]; + State state = static_cast(get_bit(addr, 0)); pc_warn(data.rn); + if (state != cpu.cpsr.state()) + glogger.info_bold("State changed"); + // set state cpu.cpsr.set_state(state); // copy to PC - cpu.pc = cpu.gpr[data.rn]; + cpu.pc = addr; // ignore [1:0] bits for arm and 0 bit for thumb rst_bit(cpu.pc, 0); diff --git a/src/cpu/thumb/exec.cc b/src/cpu/thumb/exec.cc index 47b92fe..a0ac3c9 100644 --- a/src/cpu/thumb/exec.cc +++ b/src/cpu/thumb/exec.cc @@ -168,7 +168,10 @@ Instruction::exec(Cpu& cpu) { cpu.is_flushed = true; } break; case HiRegisterOperations::OpCode::BX: { - State state = static_cast(op_2 & 1); + State state = static_cast(get_bit(op_2, 0)); + + if (state != cpu.cpsr.state()) + glogger.info_bold("State changed"); // set state cpu.cpsr.set_state(state);