fix(m68k): correct SR register read (#2161)

The SR register in the `CPUM68KState` struct does not contain the value
of the lower 5 flags. To compute them, we must OR the CCR values with
the SR register to get the true SR value.
This commit is contained in:
Amaan Qureshi
2025-04-12 23:03:08 -04:00
committed by GitHub
parent f0bdeb5a74
commit aa86641e16
7 changed files with 54 additions and 2 deletions

View File

@@ -1372,6 +1372,7 @@
#define helper_bitrev helper_bitrev_m68k
#define helper_ff1 helper_ff1_m68k
#define helper_sats helper_sats_m68k
#define cpu_m68k_get_sr cpu_m68k_get_sr_m68k
#define cpu_m68k_set_sr cpu_m68k_set_sr_m68k
#define helper_set_sr helper_set_sr_m68k
#define helper_mac_move helper_mac_move_m68k

View File

@@ -183,6 +183,7 @@ int cpu_m68k_signal_handler(int host_signum, void *pinfo,
void *puc);
uint32_t cpu_m68k_get_ccr(CPUM68KState *env);
void cpu_m68k_set_ccr(CPUM68KState *env, uint32_t);
uint32_t cpu_m68k_get_sr(CPUM68KState *env);
void cpu_m68k_set_sr(CPUM68KState *env, uint32_t);
void cpu_m68k_set_fpcr(CPUM68KState *env, uint32_t val);

View File

@@ -591,6 +591,10 @@ uint32_t HELPER(sats)(uint32_t val, uint32_t v)
return val;
}
uint32_t cpu_m68k_get_sr(CPUM68KState *env) {
return env->sr | cpu_m68k_get_ccr(env);
}
void cpu_m68k_set_sr(CPUM68KState *env, uint32_t sr)
{
env->sr = sr & 0xffe0;

View File

@@ -72,7 +72,8 @@ uc_err reg_read(void *_env, int mode, unsigned int regid, void *value,
break;
case UC_M68K_REG_SR:
CHECK_REG_TYPE(uint32_t);
*(uint32_t *)value = env->sr;
env->cc_op = CC_OP_FLAGS;
*(uint32_t *)value = cpu_m68k_get_sr(env);
break;
case UC_M68K_REG_CR_SFC:
CHECK_REG_TYPE(uint32_t);