if (read) {
uae_u32 val = 0;
- switch (size)
- {
- case sz_byte:
- val = read_dcache030_bget(addr, fc);
- break;
- case sz_word:
- val = read_dcache030_wget(addr, fc);
- break;
- case sz_long:
- val = read_dcache030_lget(addr, fc);
- break;
+ if (ssw & MMU030_SSW_RM) {
+ val = read_dcache030_lrmw_mmu_fcx(addr, size, fc);
+ } else {
+ switch (size)
+ {
+ case sz_byte:
+ val = read_dcache030_bget(addr, fc);
+ break;
+ case sz_word:
+ val = read_dcache030_wget(addr, fc);
+ break;
+ case sz_long:
+ val = read_dcache030_lget(addr, fc);
+ break;
+ }
}
if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM1) {
mmu030_data_buffer = val;
val = mdata;
else
val = mmu030_ad[idxsize].val;
- switch (size)
- {
- case sz_byte:
- write_dcache030_bput(addr, val, fc);
- break;
- case sz_word:
- write_dcache030_wput(addr, val, fc);
- break;
- case sz_long:
- write_dcache030_lput(addr, val, fc);
- break;
+ if (ssw & MMU030_SSW_RM) {
+ write_dcache030_lrmw_mmu_fcx(addr, val, size, fc);
+ } else {
+ switch (size)
+ {
+ case sz_byte:
+ write_dcache030_bput(addr, val, fc);
+ break;
+ case sz_word:
+ write_dcache030_wput(addr, val, fc);
+ break;
+ case sz_long:
+ write_dcache030_lput(addr, val, fc);
+ break;
+ }
}
if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM1) {
mmu030_state[1] |= MMU030_STATEFLAG1_MOVEM2;
extern uae_u32 read_dcache030_mmu_wget(uaecptr);
extern uae_u32 read_dcache030_mmu_lget(uaecptr);
extern void write_dcache030_lrmw_mmu(uaecptr, uae_u32, uae_u32);
+extern void write_dcache030_lrmw_mmu_fcx(uaecptr, uae_u32, uae_u32, int);
extern uae_u32 read_dcache030_lrmw_mmu(uaecptr, uae_u32);
+extern uae_u32 read_dcache030_lrmw_mmu_fcx(uaecptr, uae_u32, int);
extern void check_t0_trace(void);
extern uae_u32 get_word_icache030(uaecptr addr);
write_dcache030_lput(addr, val, (regs.s ? 4 : 0) | 1);
}
-uae_u32 read_dcache030_lrmw_mmu(uaecptr addr, uae_u32 size)
+uae_u32 read_dcache030_lrmw_mmu_fcx(uaecptr addr, uae_u32 size, int fc)
{
if (currprefs.cpu_data_cache) {
mmu030_cache_state = CACHE_DISABLE_MMU;
if (size == 0)
- return read_dcache030_bget(addr, (regs.s ? 4 : 0) | 1);
+ return read_dcache030_bget(addr, fc);
if (size == 1)
- return read_dcache030_wget(addr, (regs.s ? 4 : 0) | 1);
- return read_dcache030_lget(addr, (regs.s ? 4 : 0) | 1);
+ return read_dcache030_wget(addr, fc);
+ return read_dcache030_lget(addr, fc);
} else {
if (size == 0)
return read_data_030_bget(addr);
return read_data_030_lget(addr);
}
}
-void write_dcache030_lrmw_mmu(uaecptr addr, uae_u32 val, uae_u32 size)
+uae_u32 read_dcache030_lrmw_mmu(uaecptr addr, uae_u32 size)
+{
+ return read_dcache030_lrmw_mmu_fcx(addr, size, (regs.s ? 4 : 0) | 1);
+}
+void write_dcache030_lrmw_mmu_fcx(uaecptr addr, uae_u32 val, uae_u32 size, int fc)
{
if (currprefs.cpu_data_cache) {
mmu030_cache_state = CACHE_DISABLE_MMU;
if (size == 0)
- write_dcache030_bput(addr, val, (regs.s ? 4 : 0) | 1);
+ write_dcache030_bput(addr, val, fc);
else if (size == 1)
- write_dcache030_wput(addr, val, (regs.s ? 4 : 0) | 1);
+ write_dcache030_wput(addr, val, fc);
else
- write_dcache030_lput(addr, val, (regs.s ? 4 : 0) | 1);
+ write_dcache030_lput(addr, val, fc);
} else {
if (size == 0)
write_data_030_bput(addr, val);
write_data_030_lput(addr, val);
}
}
+void write_dcache030_lrmw_mmu(uaecptr addr, uae_u32 val, uae_u32 size)
+{
+ write_dcache030_lrmw_mmu_fcx(addr, val, size, (regs.s ? 4 : 0) | 1);
+}
static void do_access_or_bus_error(uaecptr pc, uaecptr pcnow)
{