adjust bios handling again
authornotaz <notasas@gmail.com>
Thu, 13 Jul 2023 23:05:30 +0000 (02:05 +0300)
committernotaz <notasas@gmail.com>
Fri, 14 Jul 2023 17:35:08 +0000 (20:35 +0300)
changed my mind about BiosBooted

frontend/libretro.c
frontend/main.c
frontend/main.h
libpcsxcore/misc.c
libpcsxcore/new_dynarec/emu_if.c
libpcsxcore/psxbios.c
libpcsxcore/psxcommon.c
libpcsxcore/psxcommon.h
libpcsxcore/psxinterpreter.c
libpcsxcore/r3000a.c
libpcsxcore/r3000a.h

index 5acaba8..4477183 100644 (file)
@@ -501,7 +501,7 @@ struct rearmed_cbs pl_rearmed_cbs = {
 void pl_frame_limit(void)
 {
    /* called once per frame, make psxCpu->Execute() above return */
-   stop = 1;
+   stop++;
 }
 
 void pl_timing_prepare(int is_pal)
index 7d140f8..11bc4ed 100644 (file)
@@ -487,7 +487,7 @@ int emu_core_init(void)
 
 void emu_core_ask_exit(void)
 {
-       stop = 1;
+       stop++;
        g_emu_want_quit = 1;
 }
 
index 7ce9e5d..22053bb 100644 (file)
@@ -91,7 +91,7 @@ static inline void emu_set_action(enum sched_action action_)
        if (action_ == SACTION_NONE)
                emu_action_old = 0;
        else if (action_ != emu_action_old)
-               stop = 1;
+               stop++;
        emu_action = action_;
 }
 
index 678f2db..223266b 100644 (file)
@@ -196,9 +196,10 @@ int LoadCdrom() {
        char exename[256];
 
        if (!Config.HLE) {
-               if (!BiosBooted) return 0;              // custom BIOS
-               if (psxRegs.pc != 0x80030000) return 0; // BiosBootBypass'ed
-               if (Config.SlowBoot) return 0;
+               if (psxRegs.pc != 0x80030000) // BiosBootBypass'ed or custom BIOS?
+                       return 0;
+               if (Config.SlowBoot)
+                       return 0;
        }
 
        time[0] = itob(0); time[1] = itob(2); time[2] = itob(0x10);
index f713587..e89b635 100644 (file)
@@ -265,6 +265,17 @@ static void ari64_execute()
        }
 }
 
+static void ari64_execute_block(enum blockExecCaller caller)
+{
+       if (caller == EXEC_CALLER_BOOT)
+               stop++;
+
+       ari64_execute_until();
+
+       if (caller == EXEC_CALLER_BOOT)
+               stop--;
+}
+
 static void ari64_clear(u32 addr, u32 size)
 {
        size *= 4; /* PCSX uses DMA units (words) */
@@ -315,7 +326,7 @@ R3000Acpu psxRec = {
        ari64_init,
        ari64_reset,
        ari64_execute,
-       ari64_execute_until,
+       ari64_execute_block,
        ari64_clear,
        ari64_notify,
        ari64_apply_config,
index f57f512..d31465c 100644 (file)
@@ -285,7 +285,7 @@ static inline void softCall(u32 pc) {
 
        hleSoftCall = TRUE;
 
-       while (pc0 != 0x80001000) psxCpu->ExecuteBlock();
+       while (pc0 != 0x80001000) psxCpu->ExecuteBlock(EXEC_CALLER_HLE);
 
        hleSoftCall = FALSE;
 }
@@ -297,7 +297,7 @@ static inline void softCall2(u32 pc) {
 
        hleSoftCall = TRUE;
 
-       while (pc0 != 0x80001000) psxCpu->ExecuteBlock();
+       while (pc0 != 0x80001000) psxCpu->ExecuteBlock(EXEC_CALLER_HLE);
        ra = sra;
 
        hleSoftCall = FALSE;
index fcc3deb..8313304 100644 (file)
@@ -26,7 +26,6 @@
 
 PcsxConfig Config;
 boolean NetOpened = FALSE;
-boolean BiosBooted = FALSE;
 
 int Log = 0;
 FILE *emuLog = NULL;
index 67a0ae0..92e69ee 100644 (file)
@@ -154,7 +154,6 @@ typedef struct {
 
 extern PcsxConfig Config;
 extern boolean NetOpened;
-extern boolean BiosBooted;
 
 struct PcsxSaveFuncs {
        void *(*open)(const char *name, const char *mode);
index f59934a..8e0aafe 100644 (file)
@@ -1102,7 +1102,7 @@ static void intExecute() {
                execI_(memRLUT, regs_);
 }
 
-void intExecuteBlock() {
+void intExecuteBlock(enum blockExecCaller caller) {
        psxRegisters *regs_ = &psxRegs;
        u8 **memRLUT = psxMemRLUT;
 
index 53a5eba..fbccdea 100644 (file)
@@ -69,7 +69,6 @@ void psxReset() {
 
        BiosLikeGPUSetup(); // a bit of a hack but whatever
 
-       BiosBooted = FALSE;
        if (!Config.HLE) {
                psxExecuteBios();
                if (psxRegs.pc == 0x80030000 && !Config.SlowBoot)
@@ -244,11 +243,12 @@ void psxJumpTest() {
 
 void psxExecuteBios() {
        int i;
-       for (i = 0; psxRegs.pc != 0x80030000 && i < 5000000; i++)
-               psxCpu->ExecuteBlock();
-       if (psxRegs.pc == 0x80030000)
-               BiosBooted = TRUE;
-       else
-               SysPrintf("BIOS boot timeout - custom BIOS?\n");
+       for (i = 0; i < 5000000; i++) {
+               psxCpu->ExecuteBlock(EXEC_CALLER_BOOT);
+               if ((psxRegs.pc & 0xff800000) == 0x80000000)
+                       break;
+       }
+       if (psxRegs.pc != 0x80030000)
+               SysPrintf("non-standard BIOS detected (%d, %08x)\n", i, psxRegs.pc);
 }
 
index 229b14a..8d53a18 100644 (file)
@@ -36,11 +36,16 @@ enum R3000Anote {
        R3000ACPU_NOTIFY_AFTER_LOAD,
 };
 
+enum blockExecCaller {
+       EXEC_CALLER_BOOT,
+       EXEC_CALLER_HLE,
+};
+
 typedef struct {
        int  (*Init)();
        void (*Reset)();
-       void (*Execute)();              /* executes up to a break */
-       void (*ExecuteBlock)(); /* executes up to a jump */
+       void (*Execute)();
+       void (*ExecuteBlock)(enum blockExecCaller caller); /* executes up to a jump */
        void (*Clear)(u32 Addr, u32 Size);
        void (*Notify)(enum R3000Anote note, void *data);
        void (*ApplyConfig)();