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;
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) {
void psxBios_strlen() { // 0x1b
char *p = (char *)Ra0;
v0 = 0;
+ if (a0 == 0)
+ {
+ pc0 = ra;
+ return;
+ }
while (*p++) v0++;
pc0 = ra;
}
ev = a0 & 0xff;
spec = (a0 >> 8) & 0xff;
- if (Event[ev][spec].status == EvStALREADY) {
- Event[ev][spec].status = EvStACTIVE; v0 = 1;
- } else v0 = 0;
+ if (Event[ev][spec].status == EvStALREADY)
+ {
+ if (!(Event[ev][spec].mode == EvMdINTR)) Event[ev][spec].status = EvStACTIVE;
+ v0 = 1;
+ }
+ else
+ {
+ v0 = 0;
+ }
#ifdef PSXBIOS_LOG
PSXBIOS_LOG("psxBios_%s %x,%x: %x\n", biosB0n[0x0b], ev, spec, v0);
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;