X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Flightrec%2Fplugin.c;h=27fdc4763d54f56ea3465617b8f510fd0f2492a8;hb=41bc558fbe8ff0d8bf822ab2a470ea6bd61a1835;hp=d3e4b33ff085561e92647640611fa0f3ece4c28a;hpb=15fdca99d6bb8e2d3346d468af163973218f0391;p=pcsx_rearmed.git diff --git a/libpcsxcore/lightrec/plugin.c b/libpcsxcore/lightrec/plugin.c index d3e4b33f..27fdc476 100644 --- a/libpcsxcore/lightrec/plugin.c +++ b/libpcsxcore/lightrec/plugin.c @@ -20,7 +20,7 @@ #include "../r3000a.h" #include "../psxinterpreter.h" #include "../psxhle.h" -#include "../new_dynarec/events.h" +#include "../psxevents.h" #include "../frontend/main.h" @@ -163,7 +163,7 @@ static void lightrec_tansition_from_pcsx(struct lightrec_state *state) } static void hw_write_byte(struct lightrec_state *state, - u32 op, void *host, u32 mem, u8 val) + u32 op, void *host, u32 mem, u32 val) { lightrec_tansition_to_pcsx(state); @@ -173,7 +173,7 @@ static void hw_write_byte(struct lightrec_state *state, } static void hw_write_half(struct lightrec_state *state, - u32 op, void *host, u32 mem, u16 val) + u32 op, void *host, u32 mem, u32 val) { lightrec_tansition_to_pcsx(state); @@ -335,6 +335,14 @@ static void lightrec_enable_ram(struct lightrec_state *state, bool enable) static bool lightrec_can_hw_direct(u32 kaddr, bool is_write, u8 size) { + if (is_write && size != 32) { + // force32 so must go through handlers + if (0x1f801000 <= kaddr && kaddr < 0x1f801024) + return false; + if ((kaddr & 0x1fffff80) == 0x1f801080) // dma + return false; + } + switch (size) { case 8: switch (kaddr) { @@ -470,8 +478,6 @@ static int lightrec_plugin_init(void) lightrec_map, ARRAY_SIZE(lightrec_map), &lightrec_ops); - lightrec_set_unsafe_opt_flags(lightrec_state, lightrec_hacks); - // fprintf(stderr, "M=0x%lx, P=0x%lx, R=0x%lx, H=0x%lx\n", // (uintptr_t) psxM, // (uintptr_t) psxP, @@ -494,6 +500,9 @@ static void lightrec_plugin_execute_internal(bool block_only) regs = lightrec_get_registers(lightrec_state); gen_interupt((psxCP0Regs *)regs->cp0); + if (!block_only && stop) + return; + cycles_pcsx = next_interupt - psxRegs.cycle; assert((s32)cycles_pcsx > 0); @@ -527,6 +536,8 @@ static void lightrec_plugin_execute_internal(bool block_only) if (flags & LIGHTREC_EXIT_SYSCALL) psxException(R3000E_Syscall << 2, 0, (psxCP0Regs *)regs->cp0); + if (flags & LIGHTREC_EXIT_BREAK) + psxException(R3000E_Bp << 2, 0, (psxCP0Regs *)regs->cp0); else if (flags & LIGHTREC_EXIT_UNKNOWN_OP) { u32 op = intFakeFetch(psxRegs.pc); u32 hlec = op & 0x03ffffff; @@ -549,8 +560,6 @@ static void lightrec_plugin_execute_internal(bool block_only) static void lightrec_plugin_execute(void) { - extern int stop; - while (!stop) lightrec_plugin_execute_internal(false); } @@ -562,7 +571,8 @@ static void lightrec_plugin_execute_block(enum blockExecCaller caller) static void lightrec_plugin_clear(u32 addr, u32 size) { - if (addr == 0 && size == UINT32_MAX) + if ((addr == 0 && size == UINT32_MAX) + || (lightrec_hacks & LIGHTREC_OPT_INV_DMA_ONLY)) lightrec_invalidate_all(lightrec_state); else /* size * 4: PCSX uses DMA units */ @@ -625,6 +635,8 @@ static void lightrec_plugin_reset(void) regs->cp0[12] = 0x10900000; // COP0 enabled | BEV = 1 | TS = 1 regs->cp0[15] = 0x00000002; // PRevID = Revision ID, same as R3000A + + lightrec_set_unsafe_opt_flags(lightrec_state, lightrec_hacks); } static void lightrec_plugin_sync_regs_from_pcsx(bool need_cp2)