drc: rework cycle counting
[pcsx_rearmed.git] / libpcsxcore / new_dynarec / patches / trace_intr
index 57ce9c6..fc03e7f 100644 (file)
@@ -1,8 +1,8 @@
 diff --git a/libpcsxcore/new_dynarec/emu_if.c b/libpcsxcore/new_dynarec/emu_if.c
-index 2c82f58..8572981 100644
+index 90c4660..441eaca 100644
 --- a/libpcsxcore/new_dynarec/emu_if.c
 +++ b/libpcsxcore/new_dynarec/emu_if.c
-@@ -417,13 +417,17 @@ static void ari64_shutdown()
+@@ -424,13 +424,17 @@ static void ari64_shutdown()
  {
        new_dynarec_cleanup();
        new_dyna_pcsx_mem_shutdown();
@@ -20,9 +20,9 @@ index 2c82f58..8572981 100644
 +      intExecuteT,
 +      intExecuteBlockT,
        ari64_clear,
- #ifdef ICACHE_EMULATION
        ari64_notify,
-@@ -489,7 +493,7 @@ static u32 memcheck_read(u32 a)
+       ari64_apply_config,
+@@ -501,7 +505,7 @@ static u32 memcheck_read(u32 a)
        return *(u32 *)(psxM + (a & 0x1ffffc));
  }
  
@@ -31,6 +31,60 @@ index 2c82f58..8572981 100644
  void do_insn_trace(void)
  {
        static psxRegisters oldregs;
+diff --git a/libpcsxcore/new_dynarec/pcsxmem.c b/libpcsxcore/new_dynarec/pcsxmem.c
+index bb471b6..8f68a3b 100644
+--- a/libpcsxcore/new_dynarec/pcsxmem.c
++++ b/libpcsxcore/new_dynarec/pcsxmem.c
+@@ -272,6 +272,8 @@ static void write_biu(u32 value)
+       if (address != 0xfffe0130)
+               return;
++extern u32 handler_cycle;
++handler_cycle = psxRegs.cycle;
+       switch (value) {
+       case 0x800: case 0x804:
+               unmap_ram_write();
+diff --git a/libpcsxcore/psxcounters.c b/libpcsxcore/psxcounters.c
+index b2cc07b..f916580 100644
+--- a/libpcsxcore/psxcounters.c
++++ b/libpcsxcore/psxcounters.c
+@@ -378,9 +378,12 @@ void psxRcntUpdate()
+ /******************************************************************************/
++extern u32 handler_cycle;
++
+ void psxRcntWcount( u32 index, u32 value )
+ {
+     verboseLog( 2, "[RCNT %i] wcount: %x\n", index, value );
++handler_cycle = psxRegs.cycle;
+     _psxRcntWcount( index, value );
+     psxRcntSet();
+@@ -389,6 +392,7 @@ void psxRcntWcount( u32 index, u32 value )
+ void psxRcntWmode( u32 index, u32 value )
+ {
+     verboseLog( 1, "[RCNT %i] wmode: %x\n", index, value );
++handler_cycle = psxRegs.cycle;
+     _psxRcntWmode( index, value );
+     _psxRcntWcount( index, 0 );
+@@ -400,6 +404,7 @@ void psxRcntWmode( u32 index, u32 value )
+ void psxRcntWtarget( u32 index, u32 value )
+ {
+     verboseLog( 1, "[RCNT %i] wtarget: %x\n", index, value );
++handler_cycle = psxRegs.cycle;
+     rcnts[index].target = value;
+@@ -412,6 +417,7 @@ void psxRcntWtarget( u32 index, u32 value )
+ u32 psxRcntRcount( u32 index )
+ {
+     u32 count;
++handler_cycle = psxRegs.cycle;
+     count = _psxRcntRcount( index );
 diff --git a/libpcsxcore/psxhw.c b/libpcsxcore/psxhw.c
 index dbcb989..0716f5e 100644
 --- a/libpcsxcore/psxhw.c
@@ -80,21 +134,19 @@ index dbcb989..0716f5e 100644
  #ifdef PSXHW_LOG
                        PSXHW_LOG("*Unknown 32bit write at address %x value %x\n", add, value);
 diff --git a/libpcsxcore/psxinterpreter.c b/libpcsxcore/psxinterpreter.c
-index 02e00a9..a007dc5 100644
+index f7898e9..1f125ed 100644
 --- a/libpcsxcore/psxinterpreter.c
 +++ b/libpcsxcore/psxinterpreter.c
-@@ -512,8 +512,9 @@ static void doBranch(u32 tar) {
-       debugI();
+@@ -466,6 +466,8 @@ static void doBranch(u32 tar) {
        psxRegs.pc += 4;
--      psxRegs.cycle += BIAS;
+       psxRegs.cycle += BIAS;
  
 +      (void)tmp;
 +#if 0
        // check for load delay
        tmp = psxRegs.code >> 26;
        switch (tmp) {
-@@ -547,13 +548,15 @@ static void doBranch(u32 tar) {
+@@ -499,13 +501,15 @@ static void doBranch(u32 tar) {
                        }
                        break;
        }
@@ -105,17 +157,17 @@ index 02e00a9..a007dc5 100644
        branch = 0;
        psxRegs.pc = branchPC;
  
-       psxBranchTest();
-+
 +      psxRegs.cycle += BIAS;
+       psxBranchTest();
++      psxRegs.cycle -= BIAS;
  }
  
  /*********************************************************
-@@ -636,12 +639,13 @@ void psxMULTU() {
-       psxRegs.GPR.n.hi = (u32)((res >> 32) & 0xffffffff);
+@@ -615,12 +619,13 @@ void psxMULTU_stall() {
+       psxMULTU();
  }
  
-+#define doBranchNotTaken() do { psxRegs.cycle -= BIAS; execI(); psxBranchTest(); psxRegs.cycle += BIAS; } while(0)
++#define doBranchNotTaken() do { psxRegs.cycle += BIAS; execI(); psxBranchTest(); psxRegs.cycle -= BIAS; } while(0)
  /*********************************************************
  * Register branch logic                                  *
  * Format:  OP rs, offset                                 *
@@ -127,7 +179,7 @@ index 02e00a9..a007dc5 100644
  
  void psxBGEZ()   { RepZBranchi32(>=) }      // Branch if Rs >= 0
  void psxBGEZAL() { RepZBranchLinki32(>=) }  // Branch if Rs >= 0 and link
-@@ -711,7 +715,7 @@ void psxRFE() {
+@@ -702,7 +707,7 @@ void psxRFE() {
  * Register branch logic                                  *
  * Format:  OP rs, rt, offset                             *
  *********************************************************/
@@ -136,17 +188,15 @@ index 02e00a9..a007dc5 100644
  
  void psxBEQ() {       RepBranchi32(==) }  // Branch if Rs == Rt
  void psxBNE() {       RepBranchi32(!=) }  // Branch if Rs != Rt
-@@ -895,6 +899,9 @@ void MTC0(int reg, u32 val) {
+@@ -886,6 +891,7 @@ void MTC0(int reg, u32 val) {
                case 12: // Status
                        psxRegs.CP0.r[12] = val;
                        psxTestSWInts();
-+#ifndef __arm__
-+                      psxBranchTest();
-+#endif
++                      //psxBranchTest();
                        break;
  
                case 13: // Cause
-@@ -1057,6 +1064,23 @@ void intExecuteBlock() {
+@@ -1027,6 +1033,23 @@ void intExecuteBlock() {
        while (!branch2) execI();
  }
  
@@ -170,15 +220,36 @@ index 02e00a9..a007dc5 100644
  static void intClear(u32 Addr, u32 Size) {
  }
  
+@@ -1049,7 +1072,7 @@ void intApplyConfig() {
+       assert(psxSPC[26] == psxDIV   || psxSPC[26] == psxDIV_stall);
+       assert(psxSPC[27] == psxDIVU  || psxSPC[27] == psxDIVU_stall);
+-      if (Config.DisableStalls) {
++      if (1) {
+               psxBSC[18] = psxCOP2;
+               psxBSC[50] = gteLWC2;
+               psxBSC[58] = gteSWC2;
+@@ -1091,9 +1114,10 @@ void execI() {
+       if (Config.Debug) ProcessDebug();
+       psxRegs.pc += 4;
+-      psxRegs.cycle += BIAS;
+       psxBSC[psxRegs.code >> 26]();
++
++      psxRegs.cycle += BIAS;
+ }
+ R3000Acpu psxInt = {
 diff --git a/libpcsxcore/psxmem.c b/libpcsxcore/psxmem.c
-index c09965d..135a5d0 100644
+index 04aeec2..710a379 100644
 --- a/libpcsxcore/psxmem.c
 +++ b/libpcsxcore/psxmem.c
-@@ -219,11 +219,13 @@ void psxMemShutdown() {
+@@ -217,11 +217,13 @@ void psxMemShutdown() {
  }
  
  static int writeok = 1;
-+u32 last_io_addr;
++extern u32 last_io_addr;
  
  u8 psxMemRead8(u32 mem) {
        char *p;
@@ -188,7 +259,7 @@ index c09965d..135a5d0 100644
        t = mem >> 16;
        if (t == 0x1f80 || t == 0x9f80 || t == 0xbf80) {
                if ((mem & 0xffff) < 0x400)
-@@ -249,6 +251,7 @@ u16 psxMemRead16(u32 mem) {
+@@ -247,6 +249,7 @@ u16 psxMemRead16(u32 mem) {
        char *p;
        u32 t;
  
@@ -196,7 +267,7 @@ index c09965d..135a5d0 100644
        t = mem >> 16;
        if (t == 0x1f80 || t == 0x9f80 || t == 0xbf80) {
                if ((mem & 0xffff) < 0x400)
-@@ -274,6 +277,7 @@ u32 psxMemRead32(u32 mem) {
+@@ -272,6 +275,7 @@ u32 psxMemRead32(u32 mem) {
        char *p;
        u32 t;
  
@@ -204,7 +275,7 @@ index c09965d..135a5d0 100644
        t = mem >> 16;
        if (t == 0x1f80 || t == 0x9f80 || t == 0xbf80) {
                if ((mem & 0xffff) < 0x400)
-@@ -299,6 +303,7 @@ void psxMemWrite8(u32 mem, u8 value) {
+@@ -297,6 +301,7 @@ void psxMemWrite8(u32 mem, u8 value) {
        char *p;
        u32 t;
  
@@ -212,7 +283,7 @@ index c09965d..135a5d0 100644
        t = mem >> 16;
        if (t == 0x1f80 || t == 0x9f80 || t == 0xbf80) {
                if ((mem & 0xffff) < 0x400)
-@@ -326,6 +331,7 @@ void psxMemWrite16(u32 mem, u16 value) {
+@@ -324,6 +329,7 @@ void psxMemWrite16(u32 mem, u16 value) {
        char *p;
        u32 t;
  
@@ -220,7 +291,7 @@ index c09965d..135a5d0 100644
        t = mem >> 16;
        if (t == 0x1f80 || t == 0x9f80 || t == 0xbf80) {
                if ((mem & 0xffff) < 0x400)
-@@ -353,6 +359,7 @@ void psxMemWrite32(u32 mem, u32 value) {
+@@ -351,6 +357,7 @@ void psxMemWrite32(u32 mem, u32 value) {
        char *p;
        u32 t;
  
@@ -228,3 +299,25 @@ index c09965d..135a5d0 100644
  //    if ((mem&0x1fffff) == 0x71E18 || value == 0x48088800) SysPrintf("t2fix!!\n");
        t = mem >> 16;
        if (t == 0x1f80 || t == 0x9f80 || t == 0xbf80) {
+@@ -380,6 +387,8 @@ void psxMemWrite32(u32 mem, u32 value) {
+                       } else {
+                               int i;
++extern u32 handler_cycle;
++handler_cycle = psxRegs.cycle;
+                               switch (value) {
+                                       case 0x800: case 0x804:
+                                               if (writeok == 0) break;
+diff --git a/libpcsxcore/r3000a.c b/libpcsxcore/r3000a.c
+index 7e6f16b..0114947 100644
+--- a/libpcsxcore/r3000a.c
++++ b/libpcsxcore/r3000a.c
+@@ -120,6 +120,8 @@ void psxException(u32 code, u32 bd) {
+ }
+ void psxBranchTest() {
++ extern u32 irq_test_cycle;
++ irq_test_cycle = psxRegs.cycle;
+       if ((psxRegs.cycle - psxNextsCounter) >= psxNextCounter)
+               psxRcntUpdate();