From fe444426bf01e1be0523c391aaf1e34bf8758430 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 17 Sep 2023 11:06:51 +0300 Subject: [PATCH] MMU mode MOVEM.x ,-(An) where includes target An update. --- cpuemu_31.cpp | 72 ++++++++++++++++++++++++++++++++++----------------- cpuemu_32.cpp | 72 ++++++++++++++++++++++++++++++++++----------------- cpuemu_33.cpp | 72 ++++++++++++++++++++++++++++++++++----------------- cpuemu_34.cpp | 72 ++++++++++++++++++++++++++++++++++----------------- cpuemu_35.cpp | 72 ++++++++++++++++++++++++++++++++++----------------- gencpu.cpp | 25 +++++++++++++----- 6 files changed, 259 insertions(+), 126 deletions(-) diff --git a/cpuemu_31.cpp b/cpuemu_31.cpp index 32ff31da..605363a5 100644 --- a/cpuemu_31.cpp +++ b/cpuemu_31.cpp @@ -18663,12 +18663,14 @@ uae_u32 REGPARAM2 op_4890_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -18696,12 +18698,14 @@ uae_u32 REGPARAM2 op_48a0_31_ff(uae_u32 opcode) mmu040_movem_ea = srca; while (amask) { srca -= 2; - put_word_mmu040(srca, m68k_areg (regs, movem_index2[amask])); + int predec = movem_index2[amask] != dstreg ? 0 : 2; + put_word_mmu040(srca, m68k_areg (regs, movem_index2[amask]) - predec); amask = movem_next[amask]; } while (dmask) { srca -= 2; - put_word_mmu040(srca, m68k_dreg (regs, movem_index2[dmask])); + int predec = 0; + put_word_mmu040(srca, m68k_dreg (regs, movem_index2[dmask]) - predec); dmask = movem_next[dmask]; } m68k_areg(regs, dstreg) = srca; @@ -18728,12 +18732,14 @@ uae_u32 REGPARAM2 op_48a8_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -18761,12 +18767,14 @@ uae_u32 REGPARAM2 op_48b0_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -18790,12 +18798,14 @@ uae_u32 REGPARAM2 op_48b8_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -18820,12 +18830,14 @@ uae_u32 REGPARAM2 op_48b9_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -18869,12 +18881,14 @@ uae_u32 REGPARAM2 op_48d0_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } @@ -18902,12 +18916,14 @@ uae_u32 REGPARAM2 op_48e0_31_ff(uae_u32 opcode) mmu040_movem_ea = srca; while (amask) { srca -= 4; - put_long_mmu040(srca, m68k_areg (regs, movem_index2[amask])); + int predec = movem_index2[amask] != dstreg ? 0 : 4; + put_long_mmu040(srca, m68k_areg (regs, movem_index2[amask]) - predec); amask = movem_next[amask]; } while (dmask) { srca -= 4; - put_long_mmu040(srca, m68k_dreg (regs, movem_index2[dmask])); + int predec = 0; + put_long_mmu040(srca, m68k_dreg (regs, movem_index2[dmask]) - predec); dmask = movem_next[dmask]; } m68k_areg(regs, dstreg) = srca; @@ -18934,12 +18950,14 @@ uae_u32 REGPARAM2 op_48e8_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } @@ -18967,12 +18985,14 @@ uae_u32 REGPARAM2 op_48f0_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } @@ -18996,12 +19016,14 @@ uae_u32 REGPARAM2 op_48f8_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } @@ -19026,12 +19048,14 @@ uae_u32 REGPARAM2 op_48f9_31_ff(uae_u32 opcode) mmu040_movem = 1; mmu040_movem_ea = srca; while (dmask) { - put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu040(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu040(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } diff --git a/cpuemu_32.cpp b/cpuemu_32.cpp index bd68013d..3c80e174 100644 --- a/cpuemu_32.cpp +++ b/cpuemu_32.cpp @@ -18633,7 +18633,8 @@ uae_u32 REGPARAM2 op_4890_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(4); regs.instruction_pc = m68k_getpci(); @@ -18655,7 +18656,8 @@ uae_u32 REGPARAM2 op_4890_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(4); regs.instruction_pc = m68k_getpci(); @@ -18698,7 +18700,8 @@ uae_u32 REGPARAM2 op_48a0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]); + int predec = movem_index2[amask] != dstreg ? 0 : 2; + mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(4); regs.instruction_pc = m68k_getpci(); @@ -18721,7 +18724,8 @@ uae_u32 REGPARAM2 op_48a0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(4); regs.instruction_pc = m68k_getpci(); @@ -18764,7 +18768,8 @@ uae_u32 REGPARAM2 op_48a8_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(6); regs.instruction_pc = m68k_getpci(); @@ -18786,7 +18791,8 @@ uae_u32 REGPARAM2 op_48a8_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(6); regs.instruction_pc = m68k_getpci(); @@ -18829,7 +18835,8 @@ uae_u32 REGPARAM2 op_48b0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.instruction_pc = m68k_getpci(); mmu030_state[1] |= MMU030_STATEFLAG1_LASTWRITE; @@ -18850,7 +18857,8 @@ uae_u32 REGPARAM2 op_48b0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.instruction_pc = m68k_getpci(); mmu030_state[1] |= MMU030_STATEFLAG1_LASTWRITE; @@ -18888,7 +18896,8 @@ uae_u32 REGPARAM2 op_48b8_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(6); regs.instruction_pc = m68k_getpci(); @@ -18910,7 +18919,8 @@ uae_u32 REGPARAM2 op_48b8_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(6); regs.instruction_pc = m68k_getpci(); @@ -18950,7 +18960,8 @@ uae_u32 REGPARAM2 op_48b9_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(8); regs.instruction_pc = m68k_getpci(); @@ -18972,7 +18983,8 @@ uae_u32 REGPARAM2 op_48b9_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(8); regs.instruction_pc = m68k_getpci(); @@ -19031,7 +19043,8 @@ uae_u32 REGPARAM2 op_48d0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(4); regs.instruction_pc = m68k_getpci(); @@ -19053,7 +19066,8 @@ uae_u32 REGPARAM2 op_48d0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(4); regs.instruction_pc = m68k_getpci(); @@ -19096,7 +19110,8 @@ uae_u32 REGPARAM2 op_48e0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]); + int predec = movem_index2[amask] != dstreg ? 0 : 4; + mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(4); regs.instruction_pc = m68k_getpci(); @@ -19119,7 +19134,8 @@ uae_u32 REGPARAM2 op_48e0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(4); regs.instruction_pc = m68k_getpci(); @@ -19162,7 +19178,8 @@ uae_u32 REGPARAM2 op_48e8_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(6); regs.instruction_pc = m68k_getpci(); @@ -19184,7 +19201,8 @@ uae_u32 REGPARAM2 op_48e8_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(6); regs.instruction_pc = m68k_getpci(); @@ -19227,7 +19245,8 @@ uae_u32 REGPARAM2 op_48f0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.instruction_pc = m68k_getpci(); mmu030_state[1] |= MMU030_STATEFLAG1_LASTWRITE; @@ -19248,7 +19267,8 @@ uae_u32 REGPARAM2 op_48f0_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.instruction_pc = m68k_getpci(); mmu030_state[1] |= MMU030_STATEFLAG1_LASTWRITE; @@ -19286,7 +19306,8 @@ uae_u32 REGPARAM2 op_48f8_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(6); regs.instruction_pc = m68k_getpci(); @@ -19308,7 +19329,8 @@ uae_u32 REGPARAM2 op_48f8_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(6); regs.instruction_pc = m68k_getpci(); @@ -19348,7 +19370,8 @@ uae_u32 REGPARAM2 op_48f9_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { m68k_incpci(8); regs.instruction_pc = m68k_getpci(); @@ -19370,7 +19393,8 @@ uae_u32 REGPARAM2 op_48f9_32_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { m68k_incpci(8); regs.instruction_pc = m68k_getpci(); diff --git a/cpuemu_33.cpp b/cpuemu_33.cpp index 9d58c779..2a530e87 100644 --- a/cpuemu_33.cpp +++ b/cpuemu_33.cpp @@ -17654,12 +17654,14 @@ uae_u32 REGPARAM2 op_4890_33_ff(uae_u32 opcode) srca = m68k_areg(regs, dstreg); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -17680,12 +17682,14 @@ uae_u32 REGPARAM2 op_48a0_33_ff(uae_u32 opcode) uae_u16 amask = mask & 0xff, dmask = (mask >> 8) & 0xff; while (amask) { srca -= 2; - put_word_mmu060(srca, m68k_areg (regs, movem_index2[amask])); + int predec = movem_index2[amask] != dstreg ? 0 : 2; + put_word_mmu060(srca, m68k_areg (regs, movem_index2[amask]) - predec); amask = movem_next[amask]; } while (dmask) { srca -= 2; - put_word_mmu060(srca, m68k_dreg (regs, movem_index2[dmask])); + int predec = 0; + put_word_mmu060(srca, m68k_dreg (regs, movem_index2[dmask]) - predec); dmask = movem_next[dmask]; } m68k_areg(regs, dstreg) = srca; @@ -17705,12 +17709,14 @@ uae_u32 REGPARAM2 op_48a8_33_ff(uae_u32 opcode) srca = m68k_areg(regs, dstreg) + (uae_s32)(uae_s16)get_iword_mmu060(4); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -17731,12 +17737,14 @@ uae_u32 REGPARAM2 op_48b0_33_ff(uae_u32 opcode) srca = x_get_disp_ea_020(m68k_areg(regs, dstreg), 0); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -17753,12 +17761,14 @@ uae_u32 REGPARAM2 op_48b8_33_ff(uae_u32 opcode) srca = (uae_s32)(uae_s16)get_iword_mmu060(4); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -17776,12 +17786,14 @@ uae_u32 REGPARAM2 op_48b9_33_ff(uae_u32 opcode) srca = get_ilong_mmu060(4); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_word_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 2; dmask = movem_next[dmask]; } while (amask) { - put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_word_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 2; amask = movem_next[amask]; } @@ -17818,12 +17830,14 @@ uae_u32 REGPARAM2 op_48d0_33_ff(uae_u32 opcode) srca = m68k_areg(regs, dstreg); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } @@ -17844,12 +17858,14 @@ uae_u32 REGPARAM2 op_48e0_33_ff(uae_u32 opcode) uae_u16 amask = mask & 0xff, dmask = (mask >> 8) & 0xff; while (amask) { srca -= 4; - put_long_mmu060(srca, m68k_areg (regs, movem_index2[amask])); + int predec = movem_index2[amask] != dstreg ? 0 : 4; + put_long_mmu060(srca, m68k_areg (regs, movem_index2[amask]) - predec); amask = movem_next[amask]; } while (dmask) { srca -= 4; - put_long_mmu060(srca, m68k_dreg (regs, movem_index2[dmask])); + int predec = 0; + put_long_mmu060(srca, m68k_dreg (regs, movem_index2[dmask]) - predec); dmask = movem_next[dmask]; } m68k_areg(regs, dstreg) = srca; @@ -17869,12 +17885,14 @@ uae_u32 REGPARAM2 op_48e8_33_ff(uae_u32 opcode) srca = m68k_areg(regs, dstreg) + (uae_s32)(uae_s16)get_iword_mmu060(4); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } @@ -17895,12 +17913,14 @@ uae_u32 REGPARAM2 op_48f0_33_ff(uae_u32 opcode) srca = x_get_disp_ea_020(m68k_areg(regs, dstreg), 0); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } @@ -17917,12 +17937,14 @@ uae_u32 REGPARAM2 op_48f8_33_ff(uae_u32 opcode) srca = (uae_s32)(uae_s16)get_iword_mmu060(4); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } @@ -17940,12 +17962,14 @@ uae_u32 REGPARAM2 op_48f9_33_ff(uae_u32 opcode) srca = get_ilong_mmu060(4); uae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff; while (dmask) { - put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask])); + int predec = 0; + put_long_mmu060(srca, m68k_dreg (regs, movem_index1[dmask]) - predec); srca += 4; dmask = movem_next[dmask]; } while (amask) { - put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask])); + int predec = 0; + put_long_mmu060(srca, m68k_areg (regs, movem_index1[amask]) - predec); srca += 4; amask = movem_next[amask]; } diff --git a/cpuemu_34.cpp b/cpuemu_34.cpp index 32a3b718..1d075715 100644 --- a/cpuemu_34.cpp +++ b/cpuemu_34.cpp @@ -19454,7 +19454,8 @@ uae_u32 REGPARAM2 op_4890_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -19477,7 +19478,8 @@ uae_u32 REGPARAM2 op_4890_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -19522,7 +19524,8 @@ uae_u32 REGPARAM2 op_48a0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]); + int predec = movem_index2[amask] != dstreg ? 0 : 2; + mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -19546,7 +19549,8 @@ uae_u32 REGPARAM2 op_48a0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -19591,7 +19595,8 @@ uae_u32 REGPARAM2 op_48a8_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -19614,7 +19619,8 @@ uae_u32 REGPARAM2 op_48a8_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -19659,7 +19665,8 @@ uae_u32 REGPARAM2 op_48b0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(0); regs.instruction_pc = m68k_getpci(); @@ -19681,7 +19688,8 @@ uae_u32 REGPARAM2 op_48b0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(0); regs.instruction_pc = m68k_getpci(); @@ -19721,7 +19729,8 @@ uae_u32 REGPARAM2 op_48b8_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -19744,7 +19753,8 @@ uae_u32 REGPARAM2 op_48b8_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -19786,7 +19796,8 @@ uae_u32 REGPARAM2 op_48b9_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(8); m68k_incpci(8); @@ -19809,7 +19820,8 @@ uae_u32 REGPARAM2 op_48b9_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(8); m68k_incpci(8); @@ -19871,7 +19883,8 @@ uae_u32 REGPARAM2 op_48d0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -19894,7 +19907,8 @@ uae_u32 REGPARAM2 op_48d0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -19939,7 +19953,8 @@ uae_u32 REGPARAM2 op_48e0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]); + int predec = movem_index2[amask] != dstreg ? 0 : 4; + mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -19963,7 +19978,8 @@ uae_u32 REGPARAM2 op_48e0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -20008,7 +20024,8 @@ uae_u32 REGPARAM2 op_48e8_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -20031,7 +20048,8 @@ uae_u32 REGPARAM2 op_48e8_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -20076,7 +20094,8 @@ uae_u32 REGPARAM2 op_48f0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(0); regs.instruction_pc = m68k_getpci(); @@ -20098,7 +20117,8 @@ uae_u32 REGPARAM2 op_48f0_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(0); regs.instruction_pc = m68k_getpci(); @@ -20138,7 +20158,8 @@ uae_u32 REGPARAM2 op_48f8_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -20161,7 +20182,8 @@ uae_u32 REGPARAM2 op_48f8_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -20203,7 +20225,8 @@ uae_u32 REGPARAM2 op_48f9_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(8); m68k_incpci(8); @@ -20226,7 +20249,8 @@ uae_u32 REGPARAM2 op_48f9_34_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(8); m68k_incpci(8); diff --git a/cpuemu_35.cpp b/cpuemu_35.cpp index 32204a47..909ee9dc 100644 --- a/cpuemu_35.cpp +++ b/cpuemu_35.cpp @@ -21023,7 +21023,8 @@ void REGPARAM2 op_4890_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -21046,7 +21047,8 @@ void REGPARAM2 op_4890_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -21091,7 +21093,8 @@ void REGPARAM2 op_48a0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]); + int predec = movem_index2[amask] != dstreg ? 0 : 2; + mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -21115,7 +21118,8 @@ void REGPARAM2 op_48a0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -21160,7 +21164,8 @@ void REGPARAM2 op_48a8_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -21183,7 +21188,8 @@ void REGPARAM2 op_48a8_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -21228,7 +21234,8 @@ void REGPARAM2 op_48b0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(0); regs.instruction_pc = m68k_getpci(); @@ -21250,7 +21257,8 @@ void REGPARAM2 op_48b0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(0); regs.instruction_pc = m68k_getpci(); @@ -21290,7 +21298,8 @@ void REGPARAM2 op_48b8_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -21313,7 +21322,8 @@ void REGPARAM2 op_48b8_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -21355,7 +21365,8 @@ void REGPARAM2 op_48b9_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(8); m68k_incpci(8); @@ -21378,7 +21389,8 @@ void REGPARAM2 op_48b9_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(8); m68k_incpci(8); @@ -21441,7 +21453,8 @@ void REGPARAM2 op_48d0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -21464,7 +21477,8 @@ void REGPARAM2 op_48d0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -21509,7 +21523,8 @@ void REGPARAM2 op_48e0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]); + int predec = movem_index2[amask] != dstreg ? 0 : 4; + mmu030_data_buffer_out = m68k_areg(regs, movem_index2[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -21533,7 +21548,8 @@ void REGPARAM2 op_48e0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index2[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(4); m68k_incpci(4); @@ -21578,7 +21594,8 @@ void REGPARAM2 op_48e8_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -21601,7 +21618,8 @@ void REGPARAM2 op_48e8_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -21646,7 +21664,8 @@ void REGPARAM2 op_48f0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(0); regs.instruction_pc = m68k_getpci(); @@ -21668,7 +21687,8 @@ void REGPARAM2 op_48f0_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(0); regs.instruction_pc = m68k_getpci(); @@ -21708,7 +21728,8 @@ void REGPARAM2 op_48f8_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -21731,7 +21752,8 @@ void REGPARAM2 op_48f8_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(6); m68k_incpci(6); @@ -21773,7 +21795,8 @@ void REGPARAM2 op_48f9_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]); + int predec = 0; + mmu030_data_buffer_out = m68k_dreg(regs, movem_index1[dmask]) - predec; if(!amask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(8); m68k_incpci(8); @@ -21796,7 +21819,8 @@ void REGPARAM2 op_48f9_35_ff(uae_u32 opcode) if (mmu030_state[1] & MMU030_STATEFLAG1_MOVEM2) { mmu030_state[1] &= ~MMU030_STATEFLAG1_MOVEM2; } else { - mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]); + int predec = 0; + mmu030_data_buffer_out = m68k_areg(regs, movem_index1[amask]) - predec; if(!dmask && !nextmask) { regs.irc = get_iword_mmu030c_opcode_state(8); m68k_incpci(8); diff --git a/gencpu.cpp b/gencpu.cpp index 4580acbe..9c9d3cc1 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -4342,7 +4342,12 @@ static void movem_mmu060 (const char *code, int size, bool put, bool aipi, bool if (apdi) out("srca -= %d;\n", size); if (put) { - out("%s, m68k_%creg (regs, %s[%cmask]));\n", code, reg, index, reg); + if (apdi && !i) { + out("int predec = movem_index2[amask] != dstreg ? 0 : %d;\n", size); + } else { + out("int predec = 0;\n"); + } + out("%s, m68k_%creg (regs, %s[%cmask]) - predec);\n", code, reg, index, reg); } else { out("m68k_%creg (regs, %s[%cmask]) = %s;\n", reg, index, reg, code); } @@ -4390,7 +4395,12 @@ static void movem_mmu040 (const char *code, int size, bool put, bool aipi, bool if (apdi) out("srca -= %d;\n", size); if (put) { - out("%s, m68k_%creg (regs, %s[%cmask]));\n", code, reg, index, reg); + if (apdi && !i) { + out("int predec = movem_index2[amask] != dstreg ? 0 : %d;\n", size); + } else { + out("int predec = 0;\n"); + } + out("%s, m68k_%creg (regs, %s[%cmask]) - predec);\n", code, reg, index, reg); } else { out("m68k_%creg (regs, %s[%cmask]) = %s;\n", reg, index, reg, code); } @@ -4447,7 +4457,12 @@ static void movem_mmu030 (const char *code, int size, bool put, bool aipi, bool out("val = %smmu030_data_buffer_out;\n", size == 2 ? "(uae_s32)(uae_s16)" : ""); out("} else {\n"); if (put) { - out("mmu030_data_buffer_out = m68k_%creg(regs, %s[%cmask]);\n", reg, index, reg); + if (apdi && !i) { + out("int predec = movem_index2[amask] != dstreg ? 0 : %d;\n", size); + } else { + out("int predec = 0;\n"); + } + out("mmu030_data_buffer_out = m68k_%creg(regs, %s[%cmask]) - predec;\n", reg, index, reg); if (MMU68030_LAST_WRITE) { // last write? if (dphase == i) @@ -4742,9 +4757,7 @@ static void genmovemle(uae_u16 opcode) if (table68k[opcode].dmode == Apdi) { out("uae_u16 amask = mask & 0xff, dmask = (mask >> 8) & 0xff;\n"); movem_ex3(1); - if (!using_mmu) { - out("int type = %d;\n", cpu_level > 1); - } + out("int type = %d;\n", cpu_level > 1); out("while (amask) {\n"); out("srca -= %d;\n", size); -- 2.47.3