psxbios: Support other syscalls
[pcsx_rearmed.git] / libpcsxcore / psxbios.c
index df0550e..288e33b 100644 (file)
@@ -541,13 +541,35 @@ void psxBios_strncat() { // 0x16
 
 void psxBios_strcmp() { // 0x17
        char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
-
+       s32 n=0;
+       if (a0 == 0 && a1 == 0)
+       {
+               v0 = 0;
+               pc0 = ra;
+               return;
+       }
+       else if (a0 == 0 && a1 != 0)
+       {
+               v0 = -1;
+               pc0 = ra;
+               return;
+       }
+       else if (a0 != 0 && a1 == 0)
+       {
+               v0 = 1;
+               pc0 = ra;
+               return;
+       }
 #ifdef PSXBIOS_LOG
        PSXBIOS_LOG("psxBios_%s: %s (%x), %s (%x)\n", biosA0n[0x17], Ra0, a0, Ra1, a1);
 #endif
 
        while (*p1 == *p2++) {
+               n++;
                if (*p1++ == '\0') {
+                       v1=n-1;
+                       a0+=n;
+                       a1+=n;
                        v0 = 0;
                        pc0 = ra;
                        return;
@@ -555,13 +577,33 @@ void psxBios_strcmp() { // 0x17
        }
 
        v0 = (*p1 - *--p2);
+       v1 = n;
+       a0+=n;
+       a1+=n;
        pc0 = ra;
 }
 
 void psxBios_strncmp() { // 0x18
        char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
        s32 n = a2;
-
+       if (a0 == 0 && a1 == 0)
+       {
+               v0 = 0;
+               pc0 = ra;
+               return;
+       }
+       else if (a0 == 0 && a1 != 0)
+       {
+               v0 = -1;
+               pc0 = ra;
+               return;
+       }
+       else if (a0 != 0 && a1 == 0)
+       {
+               v0 = 1;
+               pc0 = ra;
+               return;
+       }
 #ifdef PSXBIOS_LOG
        PSXBIOS_LOG("psxBios_%s: %s (%x), %s (%x), %d\n", biosA0n[0x18], Ra0, a0, Ra1, a1, a2);
 #endif
@@ -570,16 +612,30 @@ void psxBios_strncmp() { // 0x18
                if (*p1++ == '\0') {
                        v0 = 0;
                        pc0 = ra;
+                       v1 = a2 - ((a2-n) - 1);
+                       a0 += (a2-n) - 1;
+                       a1 += (a2-n) - 1;
+                       a2 = n;
                        return;
                }
        }
 
        v0 = (n < 0 ? 0 : *p1 - *--p2);
        pc0 = ra;
+       v1 = a2 - ((a2-n) - 1);
+       a0 += (a2-n) - 1;
+       a1 += (a2-n) - 1;
+       a2 = n;
 }
 
 void psxBios_strcpy() { // 0x19
        char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
+       if (a0 == 0 || a1 == 0)
+       {
+               v0 = 0;
+               pc0 = ra;
+               return;
+       }
        while ((*p1++ = *p2++) != '\0');
 
        v0 = a0; pc0 = ra;
@@ -588,7 +644,12 @@ void psxBios_strcpy() { // 0x19
 void psxBios_strncpy() { // 0x1a
        char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
        s32 n = a2, i;
-
+       if (a0 == 0 || a1 == 0)
+       {
+               v0 = 0;
+               pc0 = ra;
+               return;
+       }
        for (i = 0; i < n; i++) {
                if ((*p1++ = *p2++) == '\0') {
                        while (++i < n) {
@@ -605,6 +666,11 @@ void psxBios_strncpy() { // 0x1a
 void psxBios_strlen() { // 0x1b
        char *p = (char *)Ra0;
        v0 = 0;
+       if (a0 == 0)
+       {
+               pc0 = ra;
+               return;
+       }
        while (*p++) v0++;
        pc0 = ra;
 }
@@ -1089,7 +1155,8 @@ void psxBios_free() { // 0x34
 
        SysPrintf("free %x: %x bytes\n", a0, *(u32*)(Ra0-4));
 
-       *(u32*)(Ra0-4) |= 1;    // set chunk to free
+       if (a0)
+               *(u32*)(Ra0-4) |= 1;    // set chunk to free
        pc0 = ra;
 }
 
@@ -3129,6 +3196,9 @@ void psxBiosException() {
                                case 2: // ExitCritical - enable irq's
                                        psxRegs.CP0.n.Status |= 0x404; 
                                        break;
+                               /* Normally this should cover SYS(00h, SYS(04h but they don't do anything relevant so... */
+                               default:
+                                       break;
                        }
                        pc0 = psxRegs.CP0.n.EPC + 4;