15 using ExcRet = TExceptionReturn;
17 static inline void BranchTo(TCpuAccessor &cpua,
const me_adr_t &pc) {
18 auto ®isters = cpua.GetRegisters();
22 static inline void BranchWritePC(TCpuAccessor &cpua,
const me_adr_t &address) {
24 BranchTo(cpua, address & (~0x1U));
27 static inline Result<void> BXWritePC(TCpuAccessor &cpua, TBus &bus,
const me_adr_t &address) {
32 if (is_handler_mode && ((address & 0xF0000000U) == 0xF0000000U)) {
33 LOG_TRACE(TLogger,
"BXWritePC (Exception Return): address=0x%08X, is_handler_mode=%d",
34 address, is_handler_mode);
36 return ExcRet::Return(cpua, bus, address & 0x0FFFFFFFU);
38 auto epsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kEpsr>();
40 if ((address & 0x1U) == 0U) {
41 LOG_ERROR(TLogger,
"BXWritePC: Set wrong execution state");
47 epsr |= (address & 0x1U) << EpsrRegister::kTPos;
48 cpua.template WriteSpecialRegister<SpecialRegisterId::kEpsr>(epsr);
49 BranchTo(cpua, address & (~0x1));
55 static inline void BLXWritePC(TCpuAccessor &cpua,
const me_adr_t &address) {
59 LOG_ERROR(TLogger,
"BLXWritePC: Set wrong execution state");
63 auto epsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kEpsr>();
65 epsr |= (address & 0x1U) << EpsrRegister::kTPos;
66 cpua.template WriteSpecialRegister<SpecialRegisterId::kEpsr>(epsr);
67 BranchTo(cpua, address & (~0x1U));
70 static inline Result<void> LoadWritePC(TCpuAccessor &cpua, TBus &bus,
const me_adr_t &address) {
72 return BXWritePC(cpua, bus, address);
75 static inline void ALUWritePC(TCpuAccessor &cpua,
const me_adr_t &address) {
77 BranchWritePC(cpua, address);
84 static inline void AdvanceInstr(TCpuAccessor &cpua,
bool is_32bit) {
88 me_adr_t pc =
static_cast<me_adr_t
>(cpua.template ReadRegister<RegisterId::kPc>());
89 pc += is_32bit ? 0U : -2U;
114 PcOps &operator=(
const PcOps &r_src) =
delete;