fixes for idle and other stuff
authornotaz <notasas@gmail.com>
Thu, 15 Aug 2013 21:46:25 +0000 (00:46 +0300)
committernotaz <notasas@gmail.com>
Thu, 15 Aug 2013 22:14:38 +0000 (01:14 +0300)
Makefile
cpu/cyclone
cpu/fame/famec_opcodes.h
cpu/sh2/compiler.c
pico/pico_int.h
pico/sek.c

index e6e3b2f..e923091 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ endif
 #CFLAGS += -DEVT_LOG
 #CFLAGS += -DDRC_CMP
 #cpu_cmp = 1
-#drc_debug = 3
+#drc_debug = 7
 #profile = 1
 
 
index 1f9661c..7ddcd35 160000 (submodule)
@@ -1 +1 @@
-Subproject commit 1f9661c5a2919ba91c0f4b89985e0712871e5762
+Subproject commit 7ddcd35c8b2a8248257bd89ef989095639c29c08
index 7691899..5e09a92 100644 (file)
@@ -40012,20 +40012,18 @@ RET(8)
 }
 
 
+extern int SekIsIdleReady(void);
 extern int SekIsIdleCode(unsigned short *dst, int bytes);
 extern int SekRegisterIdlePatch(unsigned int pc, int oldop, int newop, void *ctx);
 
 OPCODE(idle_detector_bcc8)
 {
-       extern int idledet_start_frame;
-       extern char Pico[];
        int frame_count, cond_true, bytes, ret, newop;
        u16 *dest_pc;
 
        dest_pc = PC + (((s8)(Opcode & 0xFE)) >> 1);
 
-       frame_count = *(int *)(Pico+0x22208+0x1c); // Pico.m.frame_count
-       if (frame_count < idledet_start_frame)
+       if (!SekIsIdleReady())
                goto end;
 
        bytes = 0 - (s8)(Opcode & 0xFE) - 2;
index 106fab5..4d7adb3 100644 (file)
@@ -3126,6 +3126,7 @@ int sh2_execute(SH2 *sh2c, int cycles)
   if (ret_cycles > 0)
     dbg(1, "warning: drc returned with cycles: %d", ret_cycles);
 
+  sh2c->sr &= 0x3f3;
   return sh2c->cycles_timeslice - ret_cycles;
 }
 
index aa8e497..bb8fde7 100644 (file)
@@ -353,7 +353,7 @@ struct Pico
   unsigned short vsram[0x40];  // 0x22180\r
 \r
   unsigned char *rom;          // 0x22200\r
-  unsigned int romsize;        // 0x22204\r
+  unsigned int romsize;        // 0x22204 (on 32bits)\r
 \r
   struct PicoMisc m;\r
   struct PicoVideo video;\r
index 2fe77cb..5a7b707 100644 (file)
@@ -268,7 +268,7 @@ PICO_INTERNAL void SekUnpackCpu(const unsigned char *cpu, int is_sub)
 \r
 static unsigned short **idledet_ptrs = NULL;\r
 static int idledet_count = 0, idledet_bads = 0;\r
-int idledet_start_frame = 0;\r
+static int idledet_start_frame = 0;\r
 \r
 #if 0\r
 #define IDLE_STATS 1\r
@@ -312,6 +312,11 @@ void SekInitIdleDet(void)
 #endif\r
 }\r
 \r
+int SekIsIdleReady(void)\r
+{\r
+       return (Pico.m.frame_count >= idledet_start_frame);\r
+}\r
+\r
 int SekIsIdleCode(unsigned short *dst, int bytes)\r
 {\r
   // printf("SekIsIdleCode %04x %i\n", *dst, bytes);\r
@@ -322,11 +327,16 @@ int SekIsIdleCode(unsigned short *dst, int bytes)
         return 1;\r
       break;\r
     case 4:\r
-      if (  (*dst & 0xfff8) == 0x4a10 || // tst.b ($aX)      // there should be no need to wait\r
-            (*dst & 0xfff8) == 0x4a28 || // tst.b ($xxxx,a0) // for byte change anywhere\r
-            (*dst & 0xff3f) == 0x4a38 || // tst.x ($xxxx.w); tas ($xxxx.w)\r
-            (*dst & 0xc1ff) == 0x0038 || // move.x ($xxxx.w), dX\r
-            (*dst & 0xf13f) == 0xb038)   // cmp.x ($xxxx.w), dX\r
+      if ( (*dst & 0xff3f) == 0x4a38 || // tst.x ($xxxx.w); tas ($xxxx.w)\r
+           (*dst & 0xc1ff) == 0x0038 || // move.x ($xxxx.w), dX\r
+           (*dst & 0xf13f) == 0xb038)   // cmp.x ($xxxx.w), dX\r
+        return 1;\r
+      if (PicoAHW & (PAHW_MCD|PAHW_32X))\r
+        break;\r
+      // with no addons, there should be no need to wait\r
+      // for byte change anywhere\r
+      if ( (*dst & 0xfff8) == 0x4a10 || // tst.b ($aX)\r
+           (*dst & 0xfff8) == 0x4a28)   // tst.b ($xxxx,a0)\r
         return 1;\r
       break;\r
     case 6:\r
@@ -348,7 +358,9 @@ int SekIsIdleCode(unsigned short *dst, int bytes)
         return 1;\r
       break;\r
     case 12:\r
-       if ((*dst & 0xf1f8) == 0x3010 && // move.w (aX), dX\r
+      if (PicoAHW & (PAHW_MCD|PAHW_32X))\r
+        break;\r
+      if ( (*dst & 0xf1f8) == 0x3010 && // move.w (aX), dX\r
             (dst[1]&0xf100) == 0x0000 && // arithmetic\r
             (dst[3]&0xf100) == 0x0000)   // arithmetic\r
         return 1;\r
@@ -372,6 +384,7 @@ int SekRegisterIdlePatch(unsigned int pc, int oldop, int newop, void *ctx)
   is_main68k = ctx == &PicoCpuFM68k;\r
 #endif\r
   pc &= ~0xff000000;\r
+  if (!(newop&0x200))\r
   elprintf(EL_IDLE, "idle: patch %06x %04x %04x %c %c #%i", pc, oldop, newop,\r
     (newop&0x200)?'n':'y', is_main68k?'m':'s', idledet_count);\r
 \r