SPLIT_MOVEL_PD now affects movem too
authornotaz <notasas@gmail.com>
Sat, 8 Sep 2007 20:04:20 +0000 (20:04 +0000)
committernotaz <notasas@gmail.com>
Sat, 8 Sep 2007 20:04:20 +0000 (20:04 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@241 be3aeb3a-fb24-0410-a615-afba39da0efa

cpu/Cyclone/OpMove.cpp
cpu/Cyclone/config.h
cpu/Cyclone/config_pico.h
cpu/musashi/m68k_in.c

index b5dc0ce..1bc7a51 100644 (file)
@@ -415,12 +415,21 @@ int OpMovem(int op)
   }\r
   else\r
   {\r
-    // if (size == 2 && decr && SPLIT_MOVEL_PD) we should do 2xWrite16 here\r
-    // (same as in movel.l ?, -(An)), but as this is not likely to be needed and\r
-    // we do not want the performance hit, we do single Write32 instead.\r
     ot("  ;@ Copy register to memory:\n",1<<size);\r
     ot("  ldr r1,[r7,r10] ;@ Load value from Dn/An\n");\r
-    EaWrite(6,1,ea,size,0x003f);\r
+#if SPLIT_MOVEL_PD\r
+    if (decr && size==2) { // -(An)\r
+      ot("  add r0,r6,#2\n");\r
+      EaWrite(0,1,ea,1,0x003f,0,0);\r
+      ot("  ldr r1,[r7,r10] ;@ Load value from Dn/An\n");\r
+      ot("  mov r0,r6\n");\r
+      EaWrite(0,1,ea,1,0x003f,1);\r
+    }\r
+    else\r
+#endif\r
+    {\r
+      EaWrite(6,1,ea,size,0x003f);\r
+    }\r
   }\r
 \r
   if (decr==0) ot("  add r6,r6,#%d ;@ Post-increment address\n",1<<size);\r
index 6ec08f8..7736712 100644 (file)
 \r
 /*\r
  * When this option is enabled Cyclone will do two word writes instead of one\r
- * long write when handling MOVE.L with pre-decrementing destination, as described in\r
- * Bart Trzynadlowski's doc (http://www.trzy.org/files/68knotes.txt).\r
+ * long write when handling MOVE.L or MOVEM.L with pre-decrementing destination,\r
+ * as described in Bart Trzynadlowski's doc (http://www.trzy.org/files/68knotes.txt).\r
  * Enable this if you are emulating a 16 bit system.\r
  */\r
 #define SPLIT_MOVEL_PD              1\r
index 6c002ae..8f7a336 100644 (file)
@@ -58,7 +58,7 @@
  * MEMHANDLERS_NEED_CYCLES, or else Cyclone will keep reloading the same cycle\r
  * count and this will screw timing (if not cause a deadlock).\r
  */\r
-#define MEMHANDLERS_NEED_PC         0\r
+#define MEMHANDLERS_NEED_PC         1\r
 #define MEMHANDLERS_NEED_PREV_PC    0\r
 #define MEMHANDLERS_NEED_FLAGS      0\r
 #define MEMHANDLERS_NEED_CYCLES     1\r
 \r
 /*\r
  * When this option is enabled Cyclone will do two word writes instead of one\r
- * long write when handling MOVE.L with pre-decrementing destination, as described in\r
- * Bart Trzynadlowski's doc (http://www.trzy.org/files/68knotes.txt).\r
+ * long write when handling MOVE.L or MOVEM.L with pre-decrementing destination,\r
+ * as described in Bart Trzynadlowski's doc (http://www.trzy.org/files/68knotes.txt).\r
  * Enable this if you are emulating a 16 bit system.\r
  */\r
 #define SPLIT_MOVEL_PD              1\r
index 804b87a..d3ee866 100644 (file)
@@ -7133,9 +7133,12 @@ M68KMAKE_OP(movem, 32, re, pd)
                if(register_list & (1 << i))\r
                {\r
                        ea -= 4;\r
+#if 0\r
                        m68ki_write_32(ea, REG_DA[15-i] ); // notaz Cyclone hack\r
-                       //m68ki_write_16(ea+2, REG_DA[15-i] & 0xFFFF );\r
-                       //m68ki_write_16(ea, (REG_DA[15-i] >> 16) & 0xFFFF );\r
+#else\r
+                       m68ki_write_16(ea+2, REG_DA[15-i] & 0xFFFF );\r
+                       m68ki_write_16(ea, (REG_DA[15-i] >> 16) & 0xFFFF );\r
+#endif\r
                        count++;\r
                }\r
        AY = ea;\r