lightrec: allow to switch to pcsx's interpreter anytime
authornotaz <notasas@gmail.com>
Sun, 2 Oct 2022 16:09:49 +0000 (19:09 +0300)
committernotaz <notasas@gmail.com>
Sun, 2 Oct 2022 16:09:49 +0000 (19:09 +0300)
libpcsxcore/lightrec/plugin.c
libpcsxcore/lightrec/plugin.h
libpcsxcore/misc.c

index bd3ee22..7b8c8ed 100644 (file)
@@ -443,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) {
@@ -482,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) &&
@@ -499,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)
@@ -556,7 +563,7 @@ static void lightrec_plugin_reset(void)
        booting = true;
 }
 
-void lightrec_plugin_prepare_load_state(void)
+void lightrec_plugin_sync_regs_from_pcsx(void)
 {
        struct lightrec_registers *regs;
 
@@ -568,7 +575,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;
 
index ac4291a..1846c81 100644 (file)
@@ -9,14 +9,14 @@
 #ifdef LIGHTREC
 
 #define drc_is_lightrec() 1
-void lightrec_plugin_prepare_save_state(void);
-void lightrec_plugin_prepare_load_state(void);
+void lightrec_plugin_sync_regs_to_pcsx(void);
+void lightrec_plugin_sync_regs_from_pcsx(void);
 
 #else /* if !LIGHTREC */
 
 #define drc_is_lightrec() 0
-#define lightrec_plugin_prepare_save_state()
-#define lightrec_plugin_prepare_load_state()
+#define lightrec_plugin_sync_regs_to_pcsx()
+#define lightrec_plugin_sync_regs_from_pcsx()
 
 #endif
 
index 0755377..a60360f 100644 (file)
@@ -611,7 +611,7 @@ int SaveState(const char *file) {
        new_dyna_before_save();
 
        if (drc_is_lightrec() && Config.Cpu != CPU_INTERPRETER)
-               lightrec_plugin_prepare_save_state();
+               lightrec_plugin_sync_regs_to_pcsx();
 
        SaveFuncs.write(f, (void *)PcsxHeader, 32);
        SaveFuncs.write(f, (void *)&SaveVersion, sizeof(u32));
@@ -699,7 +699,7 @@ int LoadState(const char *file) {
        psxRegs.gteBusyCycle = psxRegs.cycle;
 
        if (drc_is_lightrec() && Config.Cpu != CPU_INTERPRETER)
-               lightrec_plugin_prepare_load_state();
+               lightrec_plugin_sync_regs_from_pcsx();
 
        if (Config.HLE)
                psxBiosFreeze(0);