psxbios: Support other syscalls
[pcsx_rearmed.git] / libpcsxcore / psxbios.c
index be3abb8..288e33b 100644 (file)
@@ -630,6 +630,12 @@ void psxBios_strncmp() { // 0x18
 
 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;
@@ -638,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) {
@@ -655,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;
 }
@@ -3180,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;