X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=libpcsxcore%2Fnew_dynarec%2Femu_if.c;h=dff7f21bf87d258720f164dedec6672c2e77e79e;hb=69af03a2c2fccc06cb836f42a10b490a48f29c15;hp=2560eb3aca60bacfeb018eaca93bbb8b4989fa44;hpb=3eb78778d86512b8811be2e3e469690c2171641a;p=pcsx_rearmed.git diff --git a/libpcsxcore/new_dynarec/emu_if.c b/libpcsxcore/new_dynarec/emu_if.c index 2560eb3a..dff7f21b 100644 --- a/libpcsxcore/new_dynarec/emu_if.c +++ b/libpcsxcore/new_dynarec/emu_if.c @@ -6,12 +6,15 @@ #include "../psxmem.h" #include "../psxhle.h" +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) + //#define memprintf printf #define memprintf(...) //#define evprintf printf #define evprintf(...) char invalid_code[0x100000]; +u32 event_cycles[6]; void MTC0_() { @@ -22,18 +25,47 @@ void MTC0_() pending_exception = 1; /* FIXME? */ } +static void schedule_timeslice(void) +{ + u32 i, c = psxRegs.cycle; + s32 min, dif; + + min = psxNextsCounter + psxNextCounter - c; + for (i = 0; i < ARRAY_SIZE(event_cycles); i++) { + dif = event_cycles[i] - c; + //evprintf(" ev %d\n", dif); + if (0 < dif && dif < min) + min = dif; + } + next_interupt = c + min; + +#if 0 + static u32 cnt, last_cycle; + static u64 sum; + if (last_cycle) { + cnt++; + sum += psxRegs.cycle - last_cycle; + if ((cnt & 0xff) == 0) + printf("%u\n", (u32)(sum / cnt)); + } + last_cycle = psxRegs.cycle; +#endif +} + void gen_interupt() { - evprintf("ari64_gen_interupt\n"); - evprintf(" +ge %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt); + //evprintf("ari64_gen_interupt\n"); + evprintf(" +ge %08x, %u->%u\n", psxRegs.pc, psxRegs.cycle, next_interupt); #ifdef DRC_DBG psxRegs.cycle += 2; #endif psxBranchTest(); - next_interupt = psxNextsCounter + psxNextCounter; - evprintf(" -ge %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt); + schedule_timeslice(); + + evprintf(" -ge %08x, %u->%u (%d)\n", psxRegs.pc, psxRegs.cycle, + next_interupt, next_interupt - psxRegs.cycle); pending_exception = 1; /* FIXME */ } @@ -110,7 +142,7 @@ static int ari64_init() new_dynarec_init(); - for (i = 0; i < sizeof(readmem) / sizeof(readmem[0]); i++) { + for (i = 0; i < ARRAY_SIZE(readmem); i++) { readmemb[i] = read_mem8; readmemh[i] = read_mem16; readmem[i] = read_mem32; @@ -119,7 +151,7 @@ static int ari64_init() writemem[i] = write_mem32; } - for (i = 0; i < sizeof(gte_handlers) / sizeof(gte_handlers[0]); i++) + for (i = 0; i < ARRAY_SIZE(gte_handlers); i++) if (psxCP2[i] != psxNULL) gte_handlers[i] = psxCP2[i]; @@ -134,12 +166,15 @@ static void ari64_reset() static void ari64_execute() { - next_interupt = psxNextsCounter + psxNextCounter; + schedule_timeslice(); + + evprintf("ari64_execute %08x, %u->%u (%d)\n", psxRegs.pc, + psxRegs.cycle, next_interupt, next_interupt - psxRegs.cycle); - evprintf("psxNextsCounter %d, psxNextCounter %d\n", psxNextsCounter, psxNextCounter); - evprintf("ari64_execute %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt); new_dyna_start(); - evprintf("ari64_execute end %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt); + + evprintf("ari64_execute end %08x, %u->%u (%d)\n", psxRegs.pc, + psxRegs.cycle, next_interupt, next_interupt - psxRegs.cycle); } static void ari64_clear(u32 Addr, u32 Size)