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=7f7d8f873b7a819d782080823521baf508ab1318;hp=3df83e434ef4b4bfc61312e5981452bbc44bf47c;hb=7e605697028dd22dbf2d6ee4701add1e31814b1a;hpb=ae602c19f527fbc1f44cdb744cf824d04b8eceb1 diff --git a/libpcsxcore/new_dynarec/emu_if.c b/libpcsxcore/new_dynarec/emu_if.c index 3df83e43..7f7d8f87 100644 --- a/libpcsxcore/new_dynarec/emu_if.c +++ b/libpcsxcore/new_dynarec/emu_if.c @@ -1,111 +1,84 @@ +/* + * (C) Gražvydas "notaz" Ignotas, 2010 + * + * This work is licensed under the terms of GNU GPL version 2 or later. + * See the COPYING file in the top-level directory. + */ + // pending_exception? // swi 0 in do_unalignedwritestub? #include #include "emu_if.h" -#include "../psxmem.h" +#include "pcsxmem.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]; +u32 event_cycles[7]; -void MTC0_() +static void schedule_timeslice(void) { - extern void psxMTC0(); + u32 i, c = psxRegs.cycle; + s32 min, dif; - memprintf("ari64 MTC0 %08x\n", psxRegs.code); - psxMTC0(); - pending_exception = 1; /* FIXME? */ + 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() { - u32 c, min; - int i; - - evprintf("ari64_gen_interupt\n"); - evprintf(" +ge %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt); + evprintf(" +ge %08x, %u->%u\n", psxRegs.pc, psxRegs.cycle, next_interupt); #ifdef DRC_DBG psxRegs.cycle += 2; #endif psxBranchTest(); - min = psxNextsCounter + psxNextCounter; - for (i = 0; i < ARRAY_SIZE(event_cycles); i++) { - c = event_cycles[i]; - evprintf(" ev %d\n", c - psxRegs.cycle); - if (psxRegs.cycle < c && c < min) - min = c; - } - next_interupt = min; + schedule_timeslice(); - //next_interupt = psxNextsCounter + psxNextCounter; - evprintf(" -ge %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt); + evprintf(" -ge %08x, %u->%u (%d)\n", psxRegs.pc, psxRegs.cycle, + next_interupt, next_interupt - psxRegs.cycle); pending_exception = 1; /* FIXME */ } -void check_interupt() -{ - printf("ari64_check_interupt\n"); -} - -void read_nomem_new() -{ - printf("ari64_read_nomem_new\n"); -} - -static void read_mem8() -{ - memprintf("ari64_read_mem8 %08x, PC~=%08x\n", address, psxRegs.pc); - readmem_word = psxMemRead8(address) & 0xff; -} - -static void read_mem16() -{ - memprintf("ari64_read_mem16 %08x, PC~=%08x\n", address, psxRegs.pc); - readmem_word = psxMemRead16(address) & 0xffff; -} - -static void read_mem32() -{ - memprintf("ari64_read_mem32 %08x, PC~=%08x\n", address, psxRegs.pc); - readmem_word = psxMemRead32(address); -} - -static void write_mem8() +void MTC0_() { - memprintf("ari64_write_mem8 %08x, %02x, PC~=%08x\n", address, byte, psxRegs.pc); - psxMemWrite8(address, byte); -} + extern void psxMTC0(); -static void write_mem16() -{ - memprintf("ari64_write_mem16 %08x, %04x, PC~=%08x\n", address, hword, psxRegs.pc); - psxMemWrite16(address, hword); + evprintf("ari64 MTC0 %08x %08x %u\n", psxRegs.code, psxRegs.pc, psxRegs.cycle); + psxMTC0(); + gen_interupt(); /* FIXME: checking pending irqs should be enough */ } -static void write_mem32() +void check_interupt() { - memprintf("ari64_write_mem32 %08x, %08x, PC~=%08x\n", address, word, psxRegs.pc); - psxMemWrite32(address, word); + printf("ari64_check_interupt\n"); } -void (*readmem[0x10000])(); -void (*readmemb[0x10000])(); -void (*readmemh[0x10000])(); -void (*writemem[0x10000])(); -void (*writememb[0x10000])(); -void (*writememh[0x10000])(); - void *gte_handlers[64]; /* from gte.txt.. not sure if this is any good. */ @@ -121,44 +94,60 @@ static int ari64_init() { extern void (*psxCP2[64])(); extern void psxNULL(); + extern void *psxH_ptr; size_t i; new_dynarec_init(); - - for (i = 0; i < ARRAY_SIZE(readmem); i++) { - readmemb[i] = read_mem8; - readmemh[i] = read_mem16; - readmem[i] = read_mem32; - writememb[i] = write_mem8; - writememh[i] = write_mem16; - writemem[i] = write_mem32; - } + new_dyna_pcsx_mem_init(); for (i = 0; i < ARRAY_SIZE(gte_handlers); i++) if (psxCP2[i] != psxNULL) gte_handlers[i] = psxCP2[i]; + psxH_ptr = psxH; + return 0; } static void ari64_reset() { - /* hmh */ printf("ari64_reset\n"); + new_dyna_pcsx_mem_reset(); + 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\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) +static void ari64_clear(u32 addr, u32 size) { + u32 start, end; + + evprintf("ari64_clear %08x %04x\n", addr, size); + + /* check for RAM mirrors */ + if ((addr & ~0xe0600000) < 0x200000) { + addr &= ~0xe0600000; + addr |= 0x80000000; + } + + start = addr >> 12; + end = (addr + size) >> 12; + + for (; start <= end; start++) + if (!invalid_code[start]) + invalidate_block(start); } static void ari64_shutdown() @@ -199,11 +188,16 @@ void do_insn_cmp() {} unsigned int address, readmem_word, word; unsigned short hword; unsigned char byte; -int pending_exception; +int pending_exception, stop; unsigned int next_interupt; +void *psxH_ptr; void new_dynarec_init() {} void new_dyna_start() {} void new_dynarec_cleanup() {} +void invalidate_all_pages() {} +void invalidate_block(unsigned int block) {} +void new_dyna_pcsx_mem_init(void) {} +void new_dyna_pcsx_mem_reset(void) {} #endif #ifdef DRC_DBG @@ -400,7 +394,7 @@ end: 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]); + i+8, allregs_p[i+8], i+16, allregs_p[i+16], i+24, allregs_p[i+24]); 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);