psxbios: handle u modifier
[pcsx_rearmed.git] / libpcsxcore / psxbios.c
index b135b52..b3435ad 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "psxbios.h"
 #include "psxhw.h"
+#include "gpu.h"
+#include <zlib.h>
 
 #undef SysPrintf
 #define SysPrintf if (Config.PsxOut) printf
@@ -259,6 +261,7 @@ static int CardState = -1;
 static TCB Thread[8];
 static int CurThread = 0;
 static FileDesc FDesc[32];
+static u32 card_active_chan;
 
 boolean hleSoftCall = FALSE;
 
@@ -803,8 +806,8 @@ void psxBios_qsort() { // 0x31
 }
 
 void psxBios_malloc() { // 0x33
-       unsigned int *chunk, *newchunk;
-       unsigned int dsize, csize, cstat;
+       unsigned int *chunk, *newchunk = NULL;
+       unsigned int dsize = 0, csize, cstat;
        int colflag;
 #ifdef PSXBIOS_LOG
        PSXBIOS_LOG("psxBios_%s\n", biosA0n[0x33]);
@@ -874,7 +877,7 @@ void psxBios_malloc() { // 0x33
                // split free chunk
                *chunk = SWAP32(dsize);
                newchunk = (u32*)((uptr)chunk + dsize + 4);
-               *newchunk = SWAP32((csize - dsize - 4) & 0xfffffffc | 1);
+               *newchunk = SWAP32(((csize - dsize - 4) & 0xfffffffc) | 1);
        }
 
        // return pointer to allocated memory
@@ -937,7 +940,7 @@ void psxBios_InitHeap() { // 0x39
        heap_end = (u32 *)((u8 *)heap_addr + size);
        *heap_addr = SWAP32(size | 1);
 
-       SysPrintf("InitHeap %x,%x : %x %x\n",a0,a1, (uptr)heap_addr-(uptr)psxM, size);
+       SysPrintf("InitHeap %x,%x : %x %x\n",a0,a1, (int)((uptr)heap_addr-(uptr)psxM), size);
 
        pc0 = ra;
 }
@@ -987,7 +990,7 @@ _start:
                                        case 'g': case 'G':
                                                ptmp += sprintf(ptmp, tmp2, (double)psxMu32(sp + n * 4)); n++; break;
                                        case 'p':
-                                       case 'i':
+                                       case 'i': case 'u':
                                        case 'd': case 'D':
                                        case 'o': case 'O':
                                        case 'x': case 'X':
@@ -1009,7 +1012,7 @@ _start:
 
        memcpy((char*)PSXM(sp), save, 4 * 4);
 
-       SysPrintf(tmp);
+       SysPrintf("%s", tmp);
 
        pc0 = ra;
 }
@@ -1117,6 +1120,7 @@ void psxBios_mem2vram() { // 0x47
 
 void psxBios_SendGPU() { // 0x48
        GPU_writeStatus(a0);
+       gpuSyncPluginSR();
        pc0 = ra;
 }
 
@@ -1240,6 +1244,8 @@ void psxBios__card_info() { // ab
        PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xab], a0);
 #endif
 
+       card_active_chan = a0;
+
 //     DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004
        DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004
 
@@ -1251,6 +1257,8 @@ void psxBios__card_load() { // ac
        PSXBIOS_LOG("psxBios_%s: %x\n", biosA0n[0xac], a0);
 #endif
 
+       card_active_chan = a0;
+
 //     DeliverEvent(0x11, 0x2); // 0xf0000011, 0x0004
        DeliverEvent(0x81, 0x2); // 0xf4000001, 0x0004
 
@@ -1813,7 +1821,7 @@ void psxBios_putchar() { // 3d
 }
 
 void psxBios_puts() { // 3e/3f
-       SysPrintf(Ra0);
+       SysPrintf("%s", Ra0);
        pc0 = ra;
 }
 
@@ -1869,14 +1877,13 @@ void psxBios_firstfile() { // 42
        nfile = 1;
        if (!strncmp(Ra0, "bu00", 4)) {
                bufile(1);
-               v0 = _dir;
-       }
-
-       if (!strncmp(Ra0, "bu10", 4)) {
+       } else if (!strncmp(Ra0, "bu10", 4)) {
                bufile(2);
-               v0 = _dir;
        }
 
+       // firstfile() calls _card_read() internally, so deliver it's event
+       DeliverEvent(0x11, 0x2);
+
        pc0 = ra;
 }
 
@@ -2025,6 +2032,7 @@ void psxBios__card_write() { // 0x4e
        PSXBIOS_LOG("psxBios_%s: %x,%x,%x\n", biosB0n[0x4e], a0, a1, a2);
 #endif
 
+       card_active_chan = a0;
        port = a0 >> 4;
 
        if (port == 0) {
@@ -2048,6 +2056,7 @@ void psxBios__card_read() { // 0x4f
        PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x4f]);
 #endif
 
+       card_active_chan = a0;
        port = a0 >> 4;
 
        if (port == 0) {
@@ -2129,6 +2138,15 @@ void psxBios_GetB0Table() { // 57
        v0 = 0x874; pc0 = ra;
 }
 
+void psxBios__card_chan() { // 0x58
+#ifdef PSXBIOS_LOG
+       PSXBIOS_LOG("psxBios_%s\n", biosB0n[0x58]);
+#endif
+
+       v0 = card_active_chan;
+       pc0 = ra;
+}
+
 void psxBios_ChangeClearPad() { // 5b
 #ifdef PSXBIOS_LOG
        PSXBIOS_LOG("psxBios_%s: %x\n", biosB0n[0x5b], a0);
@@ -2486,7 +2504,7 @@ void psxBiosInit() {
        //biosB0[0x55] = psxBios__get_error;
        biosB0[0x56] = psxBios_GetC0Table;
        biosB0[0x57] = psxBios_GetB0Table;
-       //biosB0[0x58] = psxBios__card_chan;
+       biosB0[0x58] = psxBios__card_chan;
        //biosB0[0x59] = psxBios_sys_b0_59;
        //biosB0[0x5a] = psxBios_sys_b0_5a;
        biosB0[0x5b] = psxBios_ChangeClearPad;
@@ -2545,6 +2563,17 @@ void psxBiosInit() {
        memset(Thread, 0, sizeof(Thread));
        Thread[0].status = 2; // main thread
 
+       jmp_int = NULL;
+       pad_buf = NULL;
+       pad_buf1 = NULL;
+       pad_buf2 = NULL;
+       pad_buf1len = pad_buf2len = 0;
+       heap_addr = NULL;
+       heap_end = NULL;
+       CardState = -1;
+       CurThread = 0;
+       memset(FDesc, 0, sizeof(FDesc));
+
        psxMu32ref(0x0150) = SWAPu32(0x160);
        psxMu32ref(0x0154) = SWAPu32(0x320);
        psxMu32ref(0x0160) = SWAPu32(0x248);
@@ -2810,4 +2839,5 @@ void psxBiosFreeze(int Mode) {
        bfreezes(Thread);
        bfreezel(&CurThread);
        bfreezes(FDesc);
+       bfreezel(&card_active_chan);
 }