X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=libpcsxcore%2Fnew_dynarec%2Femu_if.c;h=9b20e5ca95404cdcf40a6827e39bcc5bc876eb26;hp=4d6b6259f8ccaef41d96d2772b0da0a1db49708e;hb=4b421010647aba998fe2ebfc7d6f226623d47954;hpb=822b27d12f2c2a66f8de4ff7109f452048c5d899 diff --git a/libpcsxcore/new_dynarec/emu_if.c b/libpcsxcore/new_dynarec/emu_if.c index 4d6b6259..9b20e5ca 100644 --- a/libpcsxcore/new_dynarec/emu_if.c +++ b/libpcsxcore/new_dynarec/emu_if.c @@ -6,36 +6,66 @@ #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(...) -//#define DRC_DBG - char invalid_code[0x100000]; +u32 event_cycles[6]; void MTC0_() { extern void psxMTC0(); - printf("ari64 MTC0 %08x\n", psxRegs.code); + memprintf("ari64 MTC0 %08x\n", psxRegs.code); psxMTC0(); 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 */ } @@ -93,13 +123,26 @@ void (*writemem[0x10000])(); void (*writememb[0x10000])(); void (*writememh[0x10000])(); +void *gte_handlers[64]; + +/* from gte.txt.. not sure if this is any good. */ +const char gte_cycletab[64] = { + /* 1 2 3 4 5 6 7 8 9 a b c d e f */ + 0, 15, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 6, 0, 0, 0, + 8, 8, 8, 19, 13, 0, 44, 0, 0, 0, 0, 17, 11, 0, 14, 0, + 30, 0, 0, 0, 0, 0, 0, 0, 5, 8, 17, 0, 0, 5, 6, 0, + 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 39, +}; static int ari64_init() { + extern void (*psxCP2[64])(); + extern void psxNULL(); size_t i; + 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; @@ -108,27 +151,51 @@ static int ari64_init() writemem[i] = write_mem32; } - psxHLEt_addr = (void *)psxHLEt; + for (i = 0; i < ARRAY_SIZE(gte_handlers); i++) + if (psxCP2[i] != psxNULL) + gte_handlers[i] = psxCP2[i]; + + return 0; } static void ari64_reset() { - /* hmh */ printf("ari64_reset\n"); + invalidate_all_pages(); + pending_exception = 1; } 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, Count %d\n", psxNextsCounter, psxNextCounter, psxRegs.CP0.r[9]); - evprintf("ari64_execute %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt); - new_dyna_start(psxRegs.pc); - evprintf("ari64_execute end %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt); + new_dyna_start(); + + 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) +static void ari64_clear(u32 addr, u32 size) { + u32 start, end; + + evprintf("ari64_clear %08x %04x\n", addr, size); + + /* check for RAM mirrors */ + if ((start & ~0xe0000000) < 0x200000) { + start &= ~0xe0000000; + start |= 0x80000000; + } + + start = addr >> 12; + end = (addr + size) >> 12; + + for (; start <= end; start++) + if (!invalid_code[start]) + invalidate_block(start); } static void ari64_shutdown() @@ -171,9 +238,8 @@ unsigned short hword; unsigned char byte; int pending_exception; unsigned int next_interupt; -void *psxHLEt_addr; void new_dynarec_init() {} -int new_dyna_start() {} +void new_dyna_start() {} void new_dynarec_cleanup() {} #endif @@ -186,6 +252,8 @@ extern u32 last_io_addr; static void dump_mem(const char *fname, void *mem, size_t size) { FILE *f1 = fopen(fname, "wb"); + if (f1 == NULL) + f1 = fopen(strrchr(fname, '/') + 1, "wb"); fwrite(mem, 1, size, f1); fclose(f1); } @@ -263,6 +331,25 @@ static const char *regnames[offsetof(psxRegisters, intCycle) / 4] = { "PC", "code", "cycle", "interrupt", }; +static struct { + int reg; + u32 val, val_expect; + u32 pc, cycle; +} miss_log[64]; +static int miss_log_i; +#define miss_log_len (sizeof(miss_log)/sizeof(miss_log[0])) +#define miss_log_mask (miss_log_len-1) + +static void miss_log_add(int reg, u32 val, u32 val_expect, u32 pc, u32 cycle) +{ + miss_log[miss_log_i].reg = reg; + miss_log[miss_log_i].val = val; + miss_log[miss_log_i].val_expect = val_expect; + miss_log[miss_log_i].pc = pc; + miss_log[miss_log_i].cycle = cycle; + miss_log_i = (miss_log_i + 1) & miss_log_mask; +} + void breakme() {} void do_insn_cmp(void) @@ -322,8 +409,7 @@ psxRegs.CP0.r[9] = rregs.CP0.r[9]; // Count for (i = 0; i < offsetof(psxRegisters, intCycle) / 4; i++) { if (allregs_p[i] != allregs_e[i]) { - printf("bad %5s: %08x %08x, pc=%08x, cycle %u\n", - regnames[i], allregs_p[i], allregs_e[i], psxRegs.pc, psxRegs.cycle); + miss_log_add(i, allregs_p[i], allregs_e[i], psxRegs.pc, psxRegs.cycle); bad++; } } @@ -334,12 +420,24 @@ psxRegs.CP0.r[9] = rregs.CP0.r[9]; // Count } if (psxRegs.pc == rregs.pc && bad < 6 && failcount < 32) { - printf("-- %d\n", bad); + static int last_mcycle; + if (last_mcycle != psxRegs.cycle >> 20) { + printf("%u\n", psxRegs.cycle); + last_mcycle = psxRegs.cycle >> 20; + } failcount++; goto ok; } end: + for (i = 0; i < miss_log_len; i++, miss_log_i = (miss_log_i + 1) & miss_log_mask) + printf("bad %5s: %08x %08x, pc=%08x, cycle %u\n", + regnames[miss_log[miss_log_i].reg], miss_log[miss_log_i].val, + miss_log[miss_log_i].val_expect, miss_log[miss_log_i].pc, miss_log[miss_log_i].cycle); + printf("-- %d\n", bad); + for (i = 0; i < 8; i++) + printf("r%d=%08x r%2d=%08x r%2d=%08x r%2d=%08x\n", i, allregs_p[i], + i+8, allregs_p[i+8], i+16, allregs_p[i+16], i+24, allregs_p[i+23]); printf("PC: %08x/%08x, cycle %u\n", psxRegs.pc, ppc, psxRegs.cycle); dump_mem("/mnt/ntz/dev/pnd/tmp/psxram.dump", psxM, 0x200000); dump_mem("/mnt/ntz/dev/pnd/tmp/psxregs.dump", psxH, 0x10000);