From 0219d379de3e8168a94dc4a5f220af04039868fd Mon Sep 17 00:00:00 2001 From: notaz Date: Fri, 16 Aug 2013 00:46:25 +0300 Subject: [PATCH] fixes for idle and other stuff --- Makefile | 2 +- cpu/cyclone | 2 +- cpu/fame/famec_opcodes.h | 6 ++---- cpu/sh2/compiler.c | 1 + pico/pico_int.h | 2 +- pico/sek.c | 27 ++++++++++++++++++++------- 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index e6e3b2fc..e923091c 100644 --- 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 diff --git a/cpu/cyclone b/cpu/cyclone index 1f9661c5..7ddcd35c 160000 --- a/cpu/cyclone +++ b/cpu/cyclone @@ -1 +1 @@ -Subproject commit 1f9661c5a2919ba91c0f4b89985e0712871e5762 +Subproject commit 7ddcd35c8b2a8248257bd89ef989095639c29c08 diff --git a/cpu/fame/famec_opcodes.h b/cpu/fame/famec_opcodes.h index 76918994..5e09a928 100644 --- a/cpu/fame/famec_opcodes.h +++ b/cpu/fame/famec_opcodes.h @@ -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; diff --git a/cpu/sh2/compiler.c b/cpu/sh2/compiler.c index 106fab50..4d7adb3c 100644 --- a/cpu/sh2/compiler.c +++ b/cpu/sh2/compiler.c @@ -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; } diff --git a/pico/pico_int.h b/pico/pico_int.h index aa8e4971..bb8fde75 100644 --- a/pico/pico_int.h +++ b/pico/pico_int.h @@ -353,7 +353,7 @@ struct Pico unsigned short vsram[0x40]; // 0x22180 unsigned char *rom; // 0x22200 - unsigned int romsize; // 0x22204 + unsigned int romsize; // 0x22204 (on 32bits) struct PicoMisc m; struct PicoVideo video; diff --git a/pico/sek.c b/pico/sek.c index 2fe77cbb..5a7b7076 100644 --- a/pico/sek.c +++ b/pico/sek.c @@ -268,7 +268,7 @@ PICO_INTERNAL void SekUnpackCpu(const unsigned char *cpu, int is_sub) static unsigned short **idledet_ptrs = NULL; static int idledet_count = 0, idledet_bads = 0; -int idledet_start_frame = 0; +static int idledet_start_frame = 0; #if 0 #define IDLE_STATS 1 @@ -312,6 +312,11 @@ void SekInitIdleDet(void) #endif } +int SekIsIdleReady(void) +{ + return (Pico.m.frame_count >= idledet_start_frame); +} + int SekIsIdleCode(unsigned short *dst, int bytes) { // printf("SekIsIdleCode %04x %i\n", *dst, bytes); @@ -322,11 +327,16 @@ int SekIsIdleCode(unsigned short *dst, int bytes) return 1; break; case 4: - if ( (*dst & 0xfff8) == 0x4a10 || // tst.b ($aX) // there should be no need to wait - (*dst & 0xfff8) == 0x4a28 || // tst.b ($xxxx,a0) // for byte change anywhere - (*dst & 0xff3f) == 0x4a38 || // tst.x ($xxxx.w); tas ($xxxx.w) - (*dst & 0xc1ff) == 0x0038 || // move.x ($xxxx.w), dX - (*dst & 0xf13f) == 0xb038) // cmp.x ($xxxx.w), dX + if ( (*dst & 0xff3f) == 0x4a38 || // tst.x ($xxxx.w); tas ($xxxx.w) + (*dst & 0xc1ff) == 0x0038 || // move.x ($xxxx.w), dX + (*dst & 0xf13f) == 0xb038) // cmp.x ($xxxx.w), dX + return 1; + if (PicoAHW & (PAHW_MCD|PAHW_32X)) + break; + // with no addons, there should be no need to wait + // for byte change anywhere + if ( (*dst & 0xfff8) == 0x4a10 || // tst.b ($aX) + (*dst & 0xfff8) == 0x4a28) // tst.b ($xxxx,a0) return 1; break; case 6: @@ -348,7 +358,9 @@ int SekIsIdleCode(unsigned short *dst, int bytes) return 1; break; case 12: - if ((*dst & 0xf1f8) == 0x3010 && // move.w (aX), dX + if (PicoAHW & (PAHW_MCD|PAHW_32X)) + break; + if ( (*dst & 0xf1f8) == 0x3010 && // move.w (aX), dX (dst[1]&0xf100) == 0x0000 && // arithmetic (dst[3]&0xf100) == 0x0000) // arithmetic return 1; @@ -372,6 +384,7 @@ int SekRegisterIdlePatch(unsigned int pc, int oldop, int newop, void *ctx) is_main68k = ctx == &PicoCpuFM68k; #endif pc &= ~0xff000000; + if (!(newop&0x200)) elprintf(EL_IDLE, "idle: patch %06x %04x %04x %c %c #%i", pc, oldop, newop, (newop&0x200)?'n':'y', is_main68k?'m':'s', idledet_count); -- 2.39.5