notaz.gp2x.de
/
pcsx_rearmed.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
psxbios: Add checks for strlen.
[pcsx_rearmed.git]
/
libpcsxcore
/
psxbios.c
diff --git
a/libpcsxcore/psxbios.c
b/libpcsxcore/psxbios.c
index
e9a13f9
..
cd2fb0c
100644
(file)
--- a/
libpcsxcore/psxbios.c
+++ b/
libpcsxcore/psxbios.c
@@
-541,13
+541,35
@@
void psxBios_strncat() { // 0x16
void psxBios_strcmp() { // 0x17
char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
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++) {
#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') {
if (*p1++ == '\0') {
+ v1=n-1;
+ a0+=n;
+ a1+=n;
v0 = 0;
pc0 = ra;
return;
v0 = 0;
pc0 = ra;
return;
@@
-555,13
+577,33
@@
void psxBios_strcmp() { // 0x17
}
v0 = (*p1 - *--p2);
}
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;
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
#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;
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;
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;
}
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;
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;
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) {
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;
void psxBios_strlen() { // 0x1b
char *p = (char *)Ra0;
v0 = 0;
+ if (a0 == 0)
+ {
+ pc0 = ra;
+ return;
+ }
while (*p++) v0++;
pc0 = ra;
}
while (*p++) v0++;
pc0 = ra;
}
@@
-1089,7
+1155,8
@@
void psxBios_free() { // 0x34
SysPrintf("free %x: %x bytes\n", a0, *(u32*)(Ra0-4));
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;
}
pc0 = ra;
}
@@
-2417,6
+2484,13
@@
void psxBios__new_card() { // 0x50
pc0 = ra;
}
pc0 = ra;
}
+/* According to a user, this allows Final Fantasy Tactics to save/load properly */
+void psxBios__get_error(void) // 55
+{
+ v0 = 0;
+ pc0 = ra;
+}
+
void psxBios_Krom2RawAdd() { // 0x51
int i = 0;
void psxBios_Krom2RawAdd() { // 0x51
int i = 0;
@@
-2839,7
+2913,7
@@
void psxBiosInit() {
//biosB0[0x52] = psxBios_sys_b0_52;
//biosB0[0x53] = psxBios_sys_b0_53;
//biosB0[0x54] = psxBios__get_errno;
//biosB0[0x52] = psxBios_sys_b0_52;
//biosB0[0x53] = psxBios_sys_b0_53;
//biosB0[0x54] = psxBios__get_errno;
-
//
biosB0[0x55] = psxBios__get_error;
+ biosB0[0x55] = psxBios__get_error;
biosB0[0x56] = psxBios_GetC0Table;
biosB0[0x57] = psxBios_GetB0Table;
biosB0[0x58] = psxBios__card_chan;
biosB0[0x56] = psxBios_GetC0Table;
biosB0[0x57] = psxBios_GetB0Table;
biosB0[0x58] = psxBios__card_chan;