try to fix win32 build
[pcsx_rearmed.git] / libpcsxcore / psxbios.c
index 203f85d..13a7197 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;
@@ -1252,7 +1252,7 @@ void psxBios_getchar() { //0x3b
        v0 = getchar(); pc0 = ra;
 }
 
-void psxBios_printf() { // 0x3f
+static void psxBios_printf_psxout() { // 0x3f
        char tmp[1024];
        char tmp2[1024];
        u32 save[4];
@@ -1317,11 +1317,14 @@ _start:
        }
        *ptmp = 0;
 
-       if (psp)
+       if (psp != INVALID_PTR)
                memcpy(psp, save, 4 * 4);
 
        SysPrintf("%s", tmp);
+}
 
+void psxBios_printf() { // 0x3f
+       psxBios_printf_psxout();
        pc0 = ra;
 }
 
@@ -1946,7 +1949,7 @@ void psxBios_StartPAD() { // 13
 #endif
        pad_stopped = 0;
        psxHwWrite16(0x1f801074, (unsigned short)(psxHwRead16(0x1f801074) | 0x1));
-       psxRegs.CP0.n.Status |= 0x401;
+       psxRegs.CP0.n.SR |= 0x401;
        pc0 = ra;
 }
 
@@ -1973,7 +1976,7 @@ void psxBios_PAD_init() { // 15
        psxHwWrite16(0x1f801074, (u16)(psxHwRead16(0x1f801074) | 0x1));
        pad_buf = (int *)Ra1;
        *pad_buf = -1;
-       psxRegs.CP0.n.Status |= 0x401;
+       psxRegs.CP0.n.SR |= 0x401;
        v0 = 2;
        pc0 = ra;
 }
@@ -1993,8 +1996,7 @@ void psxBios_ReturnFromException() { // 17
        k0 = interrupt_r26;
        if (psxRegs.CP0.n.Cause & 0x80000000) pc0 += 4;
 
-       psxRegs.CP0.n.Status = (psxRegs.CP0.n.Status & 0xfffffff0) |
-                                                 ((psxRegs.CP0.n.Status & 0x3c) >> 2);
+       psxRegs.CP0.n.SR = (psxRegs.CP0.n.SR & ~0x0f) | ((psxRegs.CP0.n.SR & 0x3c) >> 2);
 }
 
 void psxBios_ResetEntryInt() { // 18
@@ -2212,6 +2214,25 @@ void psxBios_write() { // 0x35/0x03
        pc0 = ra;
 }
 
+static void psxBios_write_psxout() {
+       if (a0 == 1) { // stdout
+               const char *ptr = Ra1;
+               int len = a2;
+
+               if (ptr != INVALID_PTR)
+                       while (len-- > 0)
+                               SysPrintf("%c", *ptr++);
+       }
+}
+
+static void psxBios_putchar_psxout() { // 3d
+       SysPrintf("%c", (char)a0);
+}
+
+static void psxBios_puts_psxout() { // 3e/3f
+       SysPrintf("%s", Ra0);
+}
+
 /*
  *     int close(int fd);
  */
@@ -2676,7 +2697,7 @@ void psxBios_ChangeClearRCnt() { // 0a
        v0 = *ptr;
        *ptr = a1;
 
-//     psxRegs.CP0.n.Status|= 0x404;
+//     psxRegs.CP0.n.SR|= 0x404;
        pc0 = ra;
 }
 
@@ -2704,11 +2725,10 @@ void psxBiosInit() {
                biosB0[i] = NULL;
                biosC0[i] = NULL;
        }
-       biosA0[0x3e] = psxBios_puts;
-       biosA0[0x3f] = psxBios_printf;
-
-       biosB0[0x3d] = psxBios_putchar;
-       biosB0[0x3f] = psxBios_puts;
+       biosA0[0x03] = biosB0[0x35] = psxBios_write_psxout;
+       biosA0[0x3c] = biosB0[0x3d] = psxBios_putchar_psxout;
+       biosA0[0x3e] = biosB0[0x3f] = psxBios_puts_psxout;
+       biosA0[0x3f] = psxBios_printf_psxout;
 
        if (!Config.HLE) return;
 
@@ -3280,12 +3300,12 @@ void psxBiosException() {
                        switch (a0) {
                                case 1: // EnterCritical - disable irq's
                                        /* Fixes Medievil 2 not loading up new game, Digimon World not booting up and possibly others */
-                                       v0 = (psxRegs.CP0.n.Status & 0x404) == 0x404;
-                                       psxRegs.CP0.n.Status &= ~0x404;
+                                       v0 = (psxRegs.CP0.n.SR & 0x404) == 0x404;
+                                       psxRegs.CP0.n.SR &= ~0x404;
                                        break;
 
                                case 2: // ExitCritical - enable irq's
-                                       psxRegs.CP0.n.Status |= 0x404;
+                                       psxRegs.CP0.n.SR |= 0x404;
                                        break;
                                /* Normally this should cover SYS(00h, SYS(04h but they don't do anything relevant so... */
                                default:
@@ -3293,8 +3313,7 @@ void psxBiosException() {
                        }
                        pc0 = psxRegs.CP0.n.EPC + 4;
 
-                       psxRegs.CP0.n.Status = (psxRegs.CP0.n.Status & 0xfffffff0) |
-                                                                 ((psxRegs.CP0.n.Status & 0x3c) >> 2);
+                       psxRegs.CP0.n.SR = (psxRegs.CP0.n.SR & ~0x0f) | ((psxRegs.CP0.n.SR & 0x3c) >> 2);
                        return;
 
                default:
@@ -3307,8 +3326,7 @@ void psxBiosException() {
        pc0 = psxRegs.CP0.n.EPC;
        if (psxRegs.CP0.n.Cause & 0x80000000) pc0+=4;
 
-       psxRegs.CP0.n.Status = (psxRegs.CP0.n.Status & 0xfffffff0) |
-                                                 ((psxRegs.CP0.n.Status & 0x3c) >> 2);
+       psxRegs.CP0.n.SR = (psxRegs.CP0.n.SR & ~0x0f) | ((psxRegs.CP0.n.SR & 0x3c) >> 2);
 }
 
 #define bfreeze(ptr, size) { \