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=62b9176b370c88af1c64ae2019d51241fa503d25;hp=02e108f8b930734096b2c8cce176de7a91e9b6c5;hb=be516ebe45e48044b599e9d9f9f2d296c3f3ee62;hpb=92879b62c06f6c1d363a138f77f7727d0fc7721e diff --git a/libpcsxcore/new_dynarec/emu_if.c b/libpcsxcore/new_dynarec/emu_if.c index 02e108f8..62b9176b 100644 --- a/libpcsxcore/new_dynarec/emu_if.c +++ b/libpcsxcore/new_dynarec/emu_if.c @@ -59,6 +59,7 @@ static irq_func * const irq_funcs[] = { [PSXINT_CDRDMA] = cdrDmaInterrupt, [PSXINT_CDRLID] = cdrLidSeekInterrupt, [PSXINT_CDRPLAY] = cdrPlayInterrupt, + [PSXINT_SPU_UPDATE] = spuUpdate, [PSXINT_RCNT] = psxRcntUpdate, }; @@ -120,7 +121,7 @@ void pcsx_mtc0_ds(u32 reg, u32 val) MTC0(reg, val); } -void new_dyna_save(void) +void new_dyna_before_save(void) { psxRegs.interrupt &= ~(1 << PSXINT_RCNT); // old savestate compat @@ -132,7 +133,7 @@ void new_dyna_after_save(void) psxRegs.interrupt |= 1 << PSXINT_RCNT; } -void new_dyna_restore(void) +static void new_dyna_restore(void) { int i; for (i = 0; i < PSXINT_COUNT; i++) @@ -145,6 +146,52 @@ void new_dyna_restore(void) new_dyna_pcsx_mem_load_state(); } +void new_dyna_freeze(void *f, int mode) +{ + const char header_save[8] = "ariblks"; + uint32_t addrs[1024 * 4]; + int32_t size = 0; + int bytes; + char header[8]; + + if (mode != 0) { // save + size = new_dynarec_save_blocks(addrs, sizeof(addrs)); + if (size == 0) + return; + + SaveFuncs.write(f, header_save, sizeof(header_save)); + SaveFuncs.write(f, &size, sizeof(size)); + SaveFuncs.write(f, addrs, size); + } + else { + new_dyna_restore(); + + bytes = SaveFuncs.read(f, header, sizeof(header)); + if (bytes != sizeof(header) || strcmp(header, header_save)) { + if (bytes > 0) + SaveFuncs.seek(f, -bytes, SEEK_CUR); + return; + } + SaveFuncs.read(f, &size, sizeof(size)); + if (size <= 0) + return; + if (size > sizeof(addrs)) { + bytes = size - sizeof(addrs); + SaveFuncs.seek(f, bytes, SEEK_CUR); + size = sizeof(addrs); + } + bytes = SaveFuncs.read(f, addrs, size); + if (bytes != size) + return; + + new_dynarec_load_blocks(addrs, size); + } + + //printf("drc: %d block info entries %s\n", size/8, mode ? "saved" : "loaded"); +} + +#ifndef DRC_DISABLE + /* GTE stuff */ void *gte_handlers[64]; @@ -257,8 +304,10 @@ const uint64_t gte_reg_writes[64] = { static int ari64_init() { + static u32 scratch_buf[8*8*2] __attribute__((aligned(64))); extern void (*psxCP2[64])(); extern void psxNULL(); + extern unsigned char *out; size_t i; new_dynarec_init(); @@ -286,6 +335,11 @@ static int ari64_init() #endif psxH_ptr = psxH; zeromem_ptr = zero_mem; + scratch_buf_ptr = scratch_buf; + + SysPrintf("Mapped (RAM/scrp/ROM/LUTs/TC):\n"); + SysPrintf("%08x/%08x/%08x/%08x/%08x\n", + psxM, psxH, psxR, mem_rtab, out); return 0; } @@ -308,7 +362,7 @@ static void ari64_execute_until() evprintf("ari64_execute %08x, %u->%u (%d)\n", psxRegs.pc, psxRegs.cycle, next_interupt, next_interupt - psxRegs.cycle); - new_dyna_start(); + new_dyna_start(dynarec_local); evprintf("ari64_execute end %08x, %u->%u (%d)\n", psxRegs.pc, psxRegs.cycle, next_interupt, next_interupt - psxRegs.cycle); @@ -326,7 +380,7 @@ static void ari64_clear(u32 addr, u32 size) { u32 start, end, main_ram; - size *= 4; /* PCSX uses DMA units */ + size *= 4; /* PCSX uses DMA units (words) */ evprintf("ari64_clear %08x %04x\n", addr, size); @@ -341,42 +395,44 @@ static void ari64_clear(u32 addr, u32 size) invalidate_block(start); } +#ifdef ICACHE_EMULATION +static void ari64_notify(int note, void *data) { + /* + Should be fixed when ARM dynarec has proper icache emulation. + switch (note) + { + case R3000ACPU_NOTIFY_CACHE_UNISOLATED: + break; + case R3000ACPU_NOTIFY_CACHE_ISOLATED: + Sent from psxDma3(). + case R3000ACPU_NOTIFY_DMA3_EXE_LOAD: + default: + break; + } + */ +} +#endif + static void ari64_shutdown() { new_dynarec_cleanup(); new_dyna_pcsx_mem_shutdown(); } -extern void intExecute(); -extern void intExecuteT(); -extern void intExecuteBlock(); -extern void intExecuteBlockT(); -#ifndef DRC_DBG -#define intExecuteT intExecute -#define intExecuteBlockT intExecuteBlock -#endif - R3000Acpu psxRec = { ari64_init, ari64_reset, -#ifndef DRC_DISABLE ari64_execute, ari64_execute_until, -#else - intExecuteT, - intExecuteBlockT, -#endif ari64_clear, +#ifdef ICACHE_EMULATION + ari64_notify, +#endif ari64_shutdown }; -// TODO: rm -#ifndef DRC_DBG -void do_insn_trace() {} -void do_insn_cmp() {} -#endif +#else // if DRC_DISABLE -#ifdef DRC_DISABLE unsigned int address; int pending_exception, stop; unsigned int next_interupt; @@ -386,8 +442,11 @@ int new_dynarec_hacks; void *psxH_ptr; void *zeromem_ptr; u8 zero_mem[0x1000]; -void new_dynarec_init() { (void)ari64_execute; } -void new_dyna_start() {} +unsigned char *out; +void *mem_rtab; +void *scratch_buf_ptr; +void new_dynarec_init() {} +void new_dyna_start(void *context) {} void new_dynarec_cleanup() {} void new_dynarec_clear_full() {} void invalidate_all_pages() {} @@ -396,6 +455,8 @@ void new_dyna_pcsx_mem_init(void) {} void new_dyna_pcsx_mem_reset(void) {} void new_dyna_pcsx_mem_load_state(void) {} void new_dyna_pcsx_mem_shutdown(void) {} +int new_dynarec_save_blocks(void *save, int size) { return 0; } +void new_dynarec_load_blocks(const void *save, int size) {} #endif #ifdef DRC_DBG @@ -428,6 +489,7 @@ static u32 memcheck_read(u32 a) return *(u32 *)(psxM + (a & 0x1ffffc)); } +#if 0 void do_insn_trace(void) { static psxRegisters oldregs; @@ -489,6 +551,7 @@ void do_insn_trace(void) } #endif } +#endif static const char *regnames[offsetof(psxRegisters, intCycle) / 4] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",