Merge pull request #243 from retro-wertz/unai_fixes
[pcsx_rearmed.git] / libpcsxcore / psxbios.c
index 04c959a..a684601 100644 (file)
@@ -26,6 +26,7 @@
 #include "psxbios.h"
 #include "psxhw.h"
 #include "gpu.h"
+#include "sio.h"
 #include <zlib.h>
 
 #undef SysPrintf
@@ -261,7 +262,7 @@ static int CardState = -1;
 static TCB Thread[8];
 static int CurThread = 0;
 static FileDesc FDesc[32];
-static u32 card_active_chan;
+static u32 card_active_chan = 0;
 
 boolean hleSoftCall = FALSE;
 
@@ -613,14 +614,14 @@ void psxBios_tolower() { // 0x26
 
 void psxBios_bcopy() { // 0x27
        char *p1 = (char *)Ra1, *p2 = (char *)Ra0;
-       while (a2-- > 0) *p1++ = *p2++;
+       while ((s32)a2-- > 0) *p1++ = *p2++;
 
        pc0 = ra;
 }
 
 void psxBios_bzero() { // 0x28
        char *p = (char *)Ra0;
-       while (a1-- > 0) *p++ = '\0';
+       while ((s32)a1-- > 0) *p++ = '\0';
 
        pc0 = ra;
 }
@@ -630,7 +631,7 @@ void psxBios_bcmp() { // 0x29
 
        if (a0 == 0 || a1 == 0) { v0 = 0; pc0 = ra; return; }
 
-       while (a2-- > 0) {
+       while ((s32)a2-- > 0) {
                if (*p1++ != *p2++) {
                        v0 = *p1 - *p2; // BUG: compare the NEXT byte
                        pc0 = ra;
@@ -643,15 +644,16 @@ void psxBios_bcmp() { // 0x29
 
 void psxBios_memcpy() { // 0x2a
        char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
-       while (a2-- > 0) *p1++ = *p2++;
+       while ((s32)a2-- > 0) *p1++ = *p2++;
 
        v0 = a0; pc0 = ra;
 }
 
 void psxBios_memset() { // 0x2b
        char *p = (char *)Ra0;
-       while (a2-- > 0) *p++ = (char)a1;
+       while ((s32)a2-- > 0) *p++ = (char)a1;
 
+       a2 = 0;
        v0 = a0; pc0 = ra;
 }
 
@@ -662,9 +664,9 @@ void psxBios_memmove() { // 0x2c
                a2++; // BUG: copy one more byte here
                p1 += a2;
                p2 += a2;
-               while (a2-- > 0) *--p1 = *--p2;
+               while ((s32)a2-- > 0) *--p1 = *--p2;
        } else {
-               while (a2-- > 0) *p1++ = *p2++;
+               while ((s32)a2-- > 0) *p1++ = *p2++;
        }
 
        v0 = a0; pc0 = ra;
@@ -677,7 +679,7 @@ void psxBios_memcmp() { // 0x2d
 void psxBios_memchr() { // 0x2e
        char *p = (char *)Ra0;
 
-       while (a2-- > 0) {
+       while ((s32)a2-- > 0) {
                if (*p++ != (s8)a1) continue;
                v0 = a0 + (p - (char *)Ra0 - 1);
                pc0 = ra;
@@ -1025,6 +1027,26 @@ _start:
        pc0 = ra;
 }
 
+void psxBios_format() { // 0x41
+       if (strcmp(Ra0, "bu00:") == 0 && Config.Mcd1[0] != '\0')
+       {
+               CreateMcd(Config.Mcd1);
+               LoadMcd(1, Config.Mcd1);
+               v0 = 1;
+       }
+       else if (strcmp(Ra0, "bu10:") == 0 && Config.Mcd2[0] != '\0')
+       {
+               CreateMcd(Config.Mcd2);
+               LoadMcd(2, Config.Mcd2);
+               v0 = 1;
+       }
+       else
+       {
+               v0 = 0;
+       }
+       pc0 = ra;
+}
+
 /*
  *     long Load(char *name, struct EXEC *header);
  */
@@ -1250,14 +1272,35 @@ void psxBios_SetMem() { // 9f
 }
 
 void psxBios__card_info() { // ab
+       u8 ret, port;
 #ifdef PSXBIOS_LOG
        PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xab], a0);
 #endif
 
        card_active_chan = a0;
+       port = card_active_chan >> 4;
+
+       switch (port) {
+       case 0x0:
+       case 0x1:
+               ret = 0x2;
+               if (McdDisable[port & 1])
+                       ret = 0x8;
+               break;
+       default:
+#ifdef PSXBIOS_LOG
+               PSXBIOS_LOG("psxBios_%s: UNKNOWN PORT 0x%x\n", biosA0n[0xab], card_active_chan);
+#endif
+               ret = 0x11;
+               break;
+       }
+
+       if (McdDisable[0] && McdDisable[1])
+               ret = 0x8;
 
 //     DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004
-       DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004
+//     DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004
+       DeliverEvent(0x81, ret); // 0xf4000001, 0x0004
 
        v0 = 1; pc0 = ra;
 }
@@ -2195,6 +2238,15 @@ void psxBios_ChangeClearPad() { // 5b
        pc0 = ra;
 }
 
+void psxBios__card_status() { // 5c
+#ifdef PSXBIOS_LOG
+   PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x5c], a0);
+#endif
+
+   v0 = 1;
+   pc0 = ra;
+}
+
 /* System calls C0 */
 
 /*
@@ -2521,7 +2573,7 @@ void psxBiosInit() {
        biosB0[0x3c] = psxBios_getchar;
        //biosB0[0x3e] = psxBios_gets;
        //biosB0[0x40] = psxBios_cd;
-       //biosB0[0x41] = psxBios_format;
+       biosB0[0x41] = psxBios_format;
        biosB0[0x42] = psxBios_firstfile;
        biosB0[0x43] = psxBios_nextfile;
        biosB0[0x44] = psxBios_rename;
@@ -2548,7 +2600,7 @@ void psxBiosInit() {
        //biosB0[0x59] = psxBios_sys_b0_59;
        //biosB0[0x5a] = psxBios_sys_b0_5a;
        biosB0[0x5b] = psxBios_ChangeClearPad;
-       //biosB0[0x5c] = psxBios__card_status;
+       biosB0[0x5c] = psxBios__card_status;
        //biosB0[0x5d] = psxBios__card_wait;
 //*******************C0 CALLS****************************
        //biosC0[0x00] = psxBios_InitRCnt;
@@ -2613,6 +2665,7 @@ void psxBiosInit() {
        CardState = -1;
        CurThread = 0;
        memset(FDesc, 0, sizeof(FDesc));
+       card_active_chan = 0;
 
        psxMu32ref(0x0150) = SWAPu32(0x160);
        psxMu32ref(0x0154) = SWAPu32(0x320);