eliminate event code duplication
[pcsx_rearmed.git] / libpcsxcore / psxbios.c
index bad3457..af3c55f 100644 (file)
@@ -36,7 +36,7 @@
 #include "sio.h"
 #include "psxhle.h"
 #include "psxinterpreter.h"
-#include "new_dynarec/events.h"
+#include "psxevents.h"
 #include <zlib.h>
 
 #ifndef PSXBIOS_LOG
@@ -398,14 +398,17 @@ static inline void softCall(u32 pc) {
        ra = 0x80001000;
        psxRegs.CP0.n.SR &= ~0x404; // disable interrupts
 
+       assert(psxRegs.cpuInRecursion <= 1);
+       psxRegs.cpuInRecursion++;
        psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, PTR_1);
 
-       while (pc0 != 0x80001000 && ++lim < 1000000)
+       while (pc0 != 0x80001000 && ++lim < 0x100000)
                psxCpu->ExecuteBlock(EXEC_CALLER_HLE);
 
        psxCpu->Notify(R3000ACPU_NOTIFY_BEFORE_SAVE, PTR_1);
+       psxRegs.cpuInRecursion--;
 
-       if (lim == 1000000)
+       if (lim == 0x100000)
                PSXBIOS_LOG("softCall @%x hit lim\n", pc);
        ra = sra;
        psxRegs.CP0.n.SR |= ssr & 0x404;
@@ -421,14 +424,16 @@ static inline void softCallInException(u32 pc) {
                return;
        ra = 0x80001000;
 
+       psxRegs.cpuInRecursion++;
        psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, PTR_1);
 
-       while (!returned_from_exception() && pc0 != 0x80001000 && ++lim < 1000000)
+       while (!returned_from_exception() && pc0 != 0x80001000 && ++lim < 0x100000)
                psxCpu->ExecuteBlock(EXEC_CALLER_HLE);
 
        psxCpu->Notify(R3000ACPU_NOTIFY_BEFORE_SAVE, PTR_1);
+       psxRegs.cpuInRecursion--;
 
-       if (lim == 1000000)
+       if (lim == 0x100000)
                PSXBIOS_LOG("softCallInException @%x hit lim\n", pc);
        if (pc0 == 0x80001000)
                ra = sra;
@@ -1474,13 +1479,15 @@ void psxBios_printf() { // 0x3f
 }
 
 static void psxBios_cd() { // 0x40
-       const char *p, *dir = castRam8ptr(a0);
+       const char *p, *dir = Ra0;
        PSXBIOS_LOG("psxBios_%s %x(%s)\n", biosB0n[0x40], a0, dir);
-       if ((p = strchr(dir, ':')))
-               dir = ++p;
-       if (*dir == '\\')
-               dir++;
-       snprintf(cdir, sizeof(cdir), "%s", dir);
+       if (dir != INVALID_PTR) {
+               if ((p = strchr(dir, ':')))
+                       dir = ++p;
+               if (*dir == '\\')
+                       dir++;
+               snprintf(cdir, sizeof(cdir), "%s", dir);
+       }
        mips_return_c(1, 100);
 }
 
@@ -2561,7 +2568,7 @@ void psxBios_puts() { // 3e/3f
 }
 
 static void bufile(const u8 *mcd_data, u32 dir_) {
-       struct DIRENTRY *dir = (struct DIRENTRY *)castRam8ptr(dir_);
+       struct DIRENTRY *dir = (struct DIRENTRY *)PSXM(dir_);
        const char *pfile = ffile + 5;
        const u8 *data = mcd_data;
        int i = 0, match = 0;
@@ -2569,6 +2576,9 @@ static void bufile(const u8 *mcd_data, u32 dir_) {
        u32 head = 0;
 
        v0 = 0;
+       if (dir == INVALID_PTR)
+               return;
+
        for (; nfile <= 15 && !match; nfile++) {
                const char *name;
 
@@ -2622,11 +2632,12 @@ static void bufile(const u8 *mcd_data, u32 dir_) {
  */
 
 static void psxBios_firstfile() { // 42
-       char *pa0 = castRam8ptr(a0);
+       char *pa0 = Ra0;
 
        PSXBIOS_LOG("psxBios_%s %s %x\n", biosB0n[0x42], pa0, a1);
        v0 = 0;
 
+       if (pa0 != INVALID_PTR)
        {
                snprintf(ffile, sizeof(ffile), "%s", pa0);
                if (ffile[5] == 0)
@@ -4035,6 +4046,7 @@ void psxBiosException() {
        sp = fp = loadRam32(A_EXC_SP);
        gp = A_EXC_GP;
        use_cycles(46);
+       assert(!psxRegs.cpuInRecursion);
 
        // do the chains (always 4)
        for (c = lim = 0; c < 4; c++) {
@@ -4175,7 +4187,7 @@ void (* const psxHLEt[24])() = {
        hleExcPadCard1, hleExcPadCard2,
 };
 
-void psxBiosCheckExe(u32 t_addr, u32 t_size)
+void psxBiosCheckExe(u32 t_addr, u32 t_size, int loading_state)
 {
        // lw      $v0, 0x10($sp)
        // nop
@@ -4213,7 +4225,8 @@ void psxBiosCheckExe(u32 t_addr, u32 t_size)
 
                if ((SWAP32(r32[i + j]) >> 16) != 0x3c04) // lui
                        continue;
-               SysPrintf("HLE vsync @%08x\n", start + i * 4);
+               if (!loading_state)
+                       SysPrintf("HLE vsync @%08x\n", start + i * 4);
                psxRegs.biosBranchCheck = (t_addr & 0xa01ffffc) + i * 4;
        }
 }