X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Flightrec%2Fplugin.c;h=a3eb7763679fcd5a7bfbd5477802d2f5d8a37b64;hb=2c78ad6070f85d9fbf08db1301561a90ba3d54e6;hp=13c11e346cd4e67cc338b12f40f770f395fab169;hpb=ba3814c189d3bd2332b66fb6c633a7d028e618fe;p=pcsx_rearmed.git diff --git a/libpcsxcore/lightrec/plugin.c b/libpcsxcore/lightrec/plugin.c index 13c11e34..a3eb7763 100644 --- a/libpcsxcore/lightrec/plugin.c +++ b/libpcsxcore/lightrec/plugin.c @@ -54,7 +54,6 @@ static char *name = "retroarch.exe"; static bool use_lightrec_interpreter; static bool use_pcsx_interpreter; static bool booting; -static u32 lightrec_begin_cycles; enum my_cp2_opcodes { OP_CP2_RTPS = 0x01, @@ -126,9 +125,11 @@ static void cop2_op(struct lightrec_state *state, u32 func) static bool has_interrupt(void) { + struct lightrec_registers *regs = lightrec_get_registers(lightrec_state); + return ((psxHu32(0x1070) & psxHu32(0x1074)) && - (psxRegs.CP0.n.Status & 0x401) == 0x401) || - (psxRegs.CP0.n.Status & psxRegs.CP0.n.Cause & 0x0300); + (regs->cp0[12] & 0x401) == 0x401) || + (regs->cp0[12] & regs->cp0[13] & 0x0300); } static void lightrec_restore_state(struct lightrec_state *state) @@ -343,7 +344,7 @@ static bool lightrec_can_hw_direct(u32 kaddr, bool is_write, u8 size) case 0x1f801074: return !is_write; default: - return is_write || kaddr < 0x1f801c00 || kaddr >= 0x1f801e00; + return kaddr < 0x1f801c00 || kaddr >= 0x1f801e00; } default: switch (kaddr) { @@ -390,20 +391,17 @@ static int lightrec_plugin_init(void) lightrec_map[PSX_MAP_KERNEL_USER_RAM].address = psxM; lightrec_map[PSX_MAP_BIOS].address = psxR; lightrec_map[PSX_MAP_SCRATCH_PAD].address = psxH; + lightrec_map[PSX_MAP_HW_REGISTERS].address = psxH + 0x1000; lightrec_map[PSX_MAP_PARALLEL_PORT].address = psxP; if (LIGHTREC_CUSTOM_MAP) { lightrec_map[PSX_MAP_MIRROR1].address = psxM + 0x200000; lightrec_map[PSX_MAP_MIRROR2].address = psxM + 0x400000; lightrec_map[PSX_MAP_MIRROR3].address = psxM + 0x600000; - lightrec_map[PSX_MAP_HW_REGISTERS].address = psxH + 0x1000; lightrec_map[PSX_MAP_CODE_BUFFER].address = code_buffer; } use_lightrec_interpreter = !!getenv("LIGHTREC_INTERPRETER"); - if (getenv("LIGHTREC_BEGIN_CYCLES")) - lightrec_begin_cycles = (unsigned int) strtol( - getenv("LIGHTREC_BEGIN_CYCLES"), NULL, 0); lightrec_state = lightrec_init(name, lightrec_map, ARRAY_SIZE(lightrec_map), @@ -445,15 +443,15 @@ static void lightrec_restore_regs(struct lightrec_state *state) extern void intExecuteBlock(); extern void gen_interupt(); -static void lightrec_plugin_execute_block(void) +static void lightrec_plugin_execute_internal(bool block_only) { - u32 old_pc = psxRegs.pc; u32 flags; gen_interupt(); // step during early boot so that 0x80030000 fastboot hack works - if (booting) + booting = block_only; + if (block_only) next_interupt = psxRegs.cycle; if (use_pcsx_interpreter) { @@ -484,9 +482,6 @@ static void lightrec_plugin_execute_block(void) if (flags & LIGHTREC_EXIT_SYSCALL) psxException(0x20, 0); - - if (booting && (psxRegs.pc & 0xff800000) == 0x80000000) - booting = false; } if ((psxRegs.CP0.n.Cause & psxRegs.CP0.n.Status & 0x300) && @@ -501,8 +496,18 @@ static void lightrec_plugin_execute(void) { extern int stop; + if (!booting) + lightrec_plugin_sync_regs_from_pcsx(); + while (!stop) - lightrec_plugin_execute_block(); + lightrec_plugin_execute_internal(false); + + lightrec_plugin_sync_regs_to_pcsx(); +} + +static void lightrec_plugin_execute_block(void) +{ + lightrec_plugin_execute_internal(true); } static void lightrec_plugin_clear(u32 addr, u32 size) @@ -554,11 +559,9 @@ 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 - - booting = true; } -void lightrec_plugin_prepare_load_state(void) +void lightrec_plugin_sync_regs_from_pcsx(void) { struct lightrec_registers *regs; @@ -570,7 +573,7 @@ void lightrec_plugin_prepare_load_state(void) lightrec_invalidate_all(lightrec_state); } -void lightrec_plugin_prepare_save_state(void) +void lightrec_plugin_sync_regs_to_pcsx(void) { struct lightrec_registers *regs;