uae_u32 wrd[3];
int idx = 0;
mmu030_state[1] |= MMU030_STATEFLAG1_MOVEM1 | MMU030_STATEFLAG1_FMOVEM;
- if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2)
- ad = mmu030_ad[mmu030_idx].val;
- else
- mmu030_ad[mmu030_idx].val = ad;
for (int r = 0; r < 8; r++) {
if (regdir < 0)
reg = 7 - r;
printf ("\tint movem_cnt = 0;\n");
if (!put) {
printf ("\tuae_u32 val;\n");
- printf ("\tif (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2)\n");
- printf ("\t\tsrca = mmu030_ad[mmu030_idx].val;\n");
- printf ("\telse\n");
- printf ("\t\tmmu030_ad[mmu030_idx].val = srca;\n");
+ // Store original EA because MOVEM from memory may modify same register
+ printf ("\tsrca = state_store_mmu030(srca);\n");
}
for (int i = 0; i < 2; i++) {
char reg;
return v;
}
+STATIC_INLINE uae_u32 state_store_mmu030(uae_u32 v)
+{
+ if (mmu030_ad[mmu030_idx].done) {
+ v = mmu030_ad[mmu030_idx].val;
+ mmu030_idx++;
+ } else {
+ mmu030_ad[mmu030_idx].val = v;
+ mmu030_ad[mmu030_idx].done = true;
+ mmu030_idx++;
+ mmu030_ad[mmu030_idx].done = false;
+ }
+ return v;
+}
+
extern void m68k_do_rts_mmu030 (void);
extern void m68k_do_rte_mmu030 (uaecptr a7);
extern void flush_mmu030 (uaecptr, int);
#define ALWAYS_INLINE __inline
-// take care of 2 kinds of alignement, bus size and page
+// take care of 2 kinds of alignment, bus size and page
#if 1
static ALWAYS_INLINE bool is_unaligned(uaecptr addr, int size)
{
x_put_long (m68k_areg (regs, 7), mmu030_disp_store[0]);
m68k_areg (regs, 7) -= 4;
// Data output buffer = value that was going to be written
- x_put_long (m68k_areg (regs, 7), (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM1) ? mmu030_data_buffer : mmu030_ad[mmu030_idx].val);
+ x_put_long (m68k_areg (regs, 7), mmu030_data_buffer);
m68k_areg (regs, 7) -= 4;
x_put_long (m68k_areg (regs, 7), (mmu030_opcode & 0xffff) | (regs.prefetch020[0] << 16)); // Internal register (opcode storage)
m68k_areg (regs, 7) -= 4;