psxbios: Some games read from address 0, fix that.
authorgameblabla <gameblabla@openmailbox.org>
Sun, 21 Jul 2019 03:39:55 +0000 (05:39 +0200)
committergameblabla <gameblabla@openmailbox.org>
Sun, 21 Jul 2019 03:39:55 +0000 (05:39 +0200)
See Garbage Area at Address 00000000h in Nocash PSX Specifications for more inf>

R-types will refuse to boot if psxM[0] is zero.
Fade to Black can crash upon memory card access if psxM[5] is set to the wrong >
Crash Team Racing will refuse to boot if psxM[2] and psxM[3] are not zero.
(Previously, that region of memory would be overwritten above. No explanation why.)

It's set as such according to nocash :
[00000000h]=3C1A0000h  ;<-- but overwritten by 00000003h after soon
[00000004h]=275A0C80h  ;<-- or 275A0C50h (in older BIOS)
[00000008h]=03400008h
[0000000Ch]=00000000h

Note that setting 00000000h to 00000003h doesn't work for R-types.

libpcsxcore/psxbios.c

index ca15943..7b2c05f 100644 (file)
@@ -3052,7 +3052,9 @@ void psxBiosInit() {
 */
        // opcode HLE
        psxRu32ref(0x0000) = SWAPu32((0x3b << 26) | 4);
-       psxMu32ref(0x0000) = SWAPu32((0x3b << 26) | 0);
+       /* Whatever this does, it actually breaks CTR, even without the uninitiliazed memory patch. 
+       Normally games shouldn't read from address 0 yet they do. See explanation below in details. */
+       //psxMu32ref(0x0000) = SWAPu32((0x3b << 26) | 0);
        psxMu32ref(0x00a0) = SWAPu32((0x3b << 26) | 1);
        psxMu32ref(0x00b0) = SWAPu32((0x3b << 26) | 2);
        psxMu32ref(0x00c0) = SWAPu32((0x3b << 26) | 3);
@@ -3078,6 +3080,21 @@ void psxBiosInit() {
        psxHu32ref(0x1060) = SWAPu32(0x00000b88);
 
        hleSoftCall = FALSE;
+       
+       /*      Some games like R-Types, CTR, Fade to Black read from adress 0x00000000 due to uninitialized pointers.
+               See Garbage Area at Address 00000000h in Nocash PSX Specfications for more information.
+               R-type will work if PsxM[0] is non-zero. (Meaning that it should not be 00000003h as he implies).
+               Crash Team Racing will refuse to boot if psxM[2] and psx[3] are not set to 0.
+               Fade to Black can crash upon memory card access if byte 5 is set to the wrong value.
+       */
+       psxM[0] = SWAPu32(0x3C);
+       psxM[1] = SWAPu32(0x1A);
+       psxM[2] = SWAPu32(0x00);
+       psxM[3] = SWAPu32(0x00);
+       psxM[4] = SWAPu32(0x27);
+       psxM[5] = SWAPu32(0x5A);
+       psxM[6] = SWAPu32(0x0C);
+       psxM[7] = SWAPu32(0x80);
 }
 
 void psxBiosShutdown() {