summaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authorSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-05-21 04:27:21 +0000
committerSND\weimingzhi_cp <SND\weimingzhi_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-05-21 04:27:21 +0000
commitf0684f680a9d2611b3854b72c356c6f3354b65c9 (patch)
treeea161d701a57969c757bb47268b80c995e8ad692 /libpcsxcore
parent481093baa83a3f5754c75b0f4a71b57b048bb2d8 (diff)
downloadpcsxr-f0684f680a9d2611b3854b72c356c6f3354b65c9.tar.gz
implemented several hle bios funcs in core instead of calling standard C library funcs (Not done yet).
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@48428 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/psxbios.c149
1 files changed, 117 insertions, 32 deletions
diff --git a/libpcsxcore/psxbios.c b/libpcsxcore/psxbios.c
index 05ca610d..722a7232 100644
--- a/libpcsxcore/psxbios.c
+++ b/libpcsxcore/psxbios.c
@@ -165,13 +165,12 @@ char *biosC0n[256] = {
#define ra (psxRegs.GPR.n.ra)
#define pc0 (psxRegs.pc)
-#define Ra0 ((char*)PSXM(a0))
-#define Ra1 ((char*)PSXM(a1))
-#define Ra2 ((char*)PSXM(a2))
-#define Ra3 ((char*)PSXM(a3))
-#define Rv0 ((char*)PSXM(v0))
-#define Rsp ((char*)PSXM(sp))
-
+#define Ra0 ((char *)PSXM(a0))
+#define Ra1 ((char *)PSXM(a1))
+#define Ra2 ((char *)PSXM(a2))
+#define Ra3 ((char *)PSXM(a3))
+#define Rv0 ((char *)PSXM(v0))
+#define Rsp ((char *)PSXM(sp))
typedef struct {
u32 desc;
@@ -288,27 +287,42 @@ static __inline void DeliverEvent(u32 ev, u32 spec) {
void psxBios_abs() { // 0x0e
- v0 = abs(a0);
+ if ((s32)a0 < 0) v0 = -(s32)a0;
+ else v0 = a0;
pc0 = ra;
}
void psxBios_labs() { // 0x0f
- v0 = labs(a0);
- pc0 = ra;
+ psxBios_abs();
}
void psxBios_atoi() { // 0x10
- v0 = atoi((char *)Ra0);
+ s32 n = 0, f = 0;
+ char *p = (char *)Ra0;
+
+ for (;;p++) {
+ switch (*p) {
+ case ' ': case '\t': continue;
+ case '-': f++;
+ case '+': p++;
+ }
+ break;
+ }
+
+ while (*p >= '0' && *p <= '9') {
+ n = n * 10 + *p++ - '0';
+ }
+
+ v0 = (f ? -n : n);
pc0 = ra;
}
void psxBios_atol() { // 0x11
- v0 = atoi((char *)Ra0);
- pc0 = ra;
+ psxBios_atoi();
}
-void psxBios_setjmp() { // 13
- u32 *jmp_buf= (u32*)Ra0;
+void psxBios_setjmp() { // 0x13
+ u32 *jmp_buf = (u32 *)Ra0;
int i;
#ifdef PSXBIOS_LOG
@@ -318,15 +332,15 @@ void psxBios_setjmp() { // 13
jmp_buf[0] = ra;
jmp_buf[1] = sp;
jmp_buf[2] = fp;
- for (i=0; i<8; i++) // s0-s7
- jmp_buf[3+i] = psxRegs.GPR.r[16+i];
+ for (i = 0; i < 8; i++) // s0-s7
+ jmp_buf[3 + i] = psxRegs.GPR.r[16 + i];
jmp_buf[11] = gp;
v0 = 0; pc0 = ra;
}
-void psxBios_longjmp() { //14
- u32 *jmp_buf= (u32*)Ra0;
+void psxBios_longjmp() { // 0x14
+ u32 *jmp_buf = (u32 *)Ra0;
int i;
#ifdef PSXBIOS_LOG
@@ -336,50 +350,121 @@ void psxBios_longjmp() { //14
ra = jmp_buf[0]; /* ra */
sp = jmp_buf[1]; /* sp */
fp = jmp_buf[2]; /* fp */
- for (i=0; i<8; i++) // s0-s7
- psxRegs.GPR.r[16+i] = jmp_buf[3+i];
+ for (i = 0; i < 8; i++) // s0-s7
+ psxRegs.GPR.r[16 + i] = jmp_buf[3 + i];
gp = jmp_buf[11]; /* gp */
v0 = a1; pc0 = ra;
}
void psxBios_strcat() { // 0x15
+ char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
+
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s: %s, %s\n", biosA0n[0x15], Ra0, Ra1);
#endif
- strcat(Ra0, Ra1);
+ while (*p1++);
+ --p1;
+ while (*p1++ = *p2++);
+
v0 = a0; pc0 = ra;
}
-/*0x16*/void psxBios_strncat() { strncat(Ra0, Ra1, a2); v0 = a0; pc0 = ra;}
+void psxBios_strncat() { // 0x16
+ char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
+ s32 n = a2;
+
+#ifdef PSXBIOS_LOG
+ PSXBIOS_LOG("psxBios_%s: %s (%lx), %s (%lx), %d\n", biosA0n[0x18], Ra0, a0, Ra1, a1, a2);
+#endif
+
+ while (*p1++);
+ --p1;
+ while (*p1++ = *p2++) {
+ if (--n < 0) {
+ *--p1 = '\0';
+ break;
+ }
+ }
+
+ v0 = a0; pc0 = ra;
+}
void psxBios_strcmp() { // 0x17
+ char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
+
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s: %s (%lx), %s (%lx)\n", biosA0n[0x17], Ra0, a0, Ra1, a1);
#endif
- v0 = strcmp(Ra0, Ra1);
+ while (*p1 == *p2++) {
+ if (*p1++ == '\0') {
+ v0 = 0;
+ pc0 = ra;
+ return;
+ }
+ }
+
+ v0 = (*p1 - *--p2);
pc0 = ra;
}
void psxBios_strncmp() { // 0x18
+ char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
+ s32 n = a2;
+
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s: %s (%lx), %s (%lx), %d\n", biosA0n[0x18], Ra0, a0, Ra1, a1, a2);
#endif
- v0 = strncmp(Ra0, Ra1, a2);
+ while (--n >= 0 && *p1 == *p2++) {
+ if (*p1++ == '\0') {
+ v0 = 0;
+ pc0 = ra;
+ return;
+ }
+ }
+
+ v0 = (n < 0 ? 0 : *p1 - *--p2);
pc0 = ra;
}
-/*0x19*/void psxBios_strcpy() { strcpy(Ra0, Ra1); v0 = a0; pc0 = ra;}
-/*0x1a*/void psxBios_strncpy() { strncpy(Ra0, Ra1, a2); v0 = a0; pc0 = ra;}
-/*0x1b*/void psxBios_strlen() { v0 = strlen(Ra0); pc0 = ra;}
+void psxBios_strcpy() { // 0x19
+ char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
+ while (*p1++ = *p2++);
+
+ v0 = a0; pc0 = ra;
+}
+
+void psxBios_strncpy() { // 0x1a
+ char *p1 = (char *)Ra0, *p2 = (char *)Ra1;
+ s32 n = a2, i;
+
+ for (i = 0; i < n; i++) {
+ if ((*p1++ = *p2++) == '\0') {
+ while (++i < n) {
+ *p1++ = '\0';
+ }
+ v0 = a0; pc0 = ra;
+ return;
+ }
+ }
+
+ v0 = a0; pc0 = ra;
+}
+
+void psxBios_strlen() { // 0x1b
+ char *p = (char *)Ra0;
+ v0 = 0;
+ while (*p++) v0++;
+ pc0 = ra;
+}
void psxBios_index() { // 0x1c
char *pcA0 = (char *)Ra0;
char *pcRet = strchr(pcA0, a1);
- if(pcRet)
+ if (pcRet)
v0 = a0 + pcRet - pcA0;
else
v0 = 0;
@@ -389,7 +474,7 @@ void psxBios_index() { // 0x1c
void psxBios_rindex() { // 0x1d
char *pcA0 = (char *)Ra0;
char *pcRet = strrchr(pcA0, a1);
- if(pcRet)
+ if (pcRet)
v0 = a0 + pcRet - pcA0;
else
v0 = 0;
@@ -399,7 +484,7 @@ void psxBios_rindex() { // 0x1d
void psxBios_strchr() { // 0x1e
char *pcA0 = (char *)Ra0;
char *pcRet = strchr(pcA0, a1);
- if(pcRet)
+ if (pcRet)
v0 = a0 + pcRet - pcA0;
else
v0 = 0;
@@ -409,7 +494,7 @@ void psxBios_strchr() { // 0x1e
void psxBios_strrchr() { // 0x1f
char *pcA0 = (char *)Ra0;
char *pcRet = strrchr(pcA0, a1);
- if(pcRet)
+ if (pcRet)
v0 = a0 + pcRet - pcA0;
else
v0 = 0;