aboutsummaryrefslogtreecommitdiff
path: root/libpcsxcore
diff options
context:
space:
mode:
authornotaz2011-01-24 19:26:38 +0200
committernotaz2011-01-24 19:26:38 +0200
commitc7abc8640c52f63f655ba38585b37c8548527b63 (patch)
treea6ff20be9aefaf14d917973c36105dceaba464cb /libpcsxcore
parentd7296e10805869f9772afc77d31ab4f7715e6e82 (diff)
downloadpcsx_rearmed-c7abc8640c52f63f655ba38585b37c8548527b63.tar.gz
pcsx_rearmed-c7abc8640c52f63f655ba38585b37c8548527b63.tar.bz2
pcsx_rearmed-c7abc8640c52f63f655ba38585b37c8548527b63.zip
drc: fix COP2 decoding
Diffstat (limited to 'libpcsxcore')
-rw-r--r--libpcsxcore/new_dynarec/new_dynarec.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/libpcsxcore/new_dynarec/new_dynarec.c b/libpcsxcore/new_dynarec/new_dynarec.c
index 63e21e1..00b23ee 100644
--- a/libpcsxcore/new_dynarec/new_dynarec.c
+++ b/libpcsxcore/new_dynarec/new_dynarec.c
@@ -8128,19 +8128,20 @@ int new_recompile_block(int addr)
#endif
#ifdef PCSX
case 0x12: strcpy(insn[i],"COP2"); type=NI;
+ // note: COP MIPS-1 encoding differs from MIPS32
op2=(source[i]>>21)&0x1f;
- switch(op2)
+ if (source[i]&0x3f) {
+ if (gte_handlers[source[i]&0x3f]!=NULL) {
+ snprintf(insn[i], sizeof(insn[i]), "COP2 %x", source[i]&0x3f);
+ type=C2OP;
+ }
+ }
+ else switch(op2)
{
case 0x00: strcpy(insn[i],"MFC2"); type=COP2; break;
case 0x02: strcpy(insn[i],"CFC2"); type=COP2; break;
case 0x04: strcpy(insn[i],"MTC2"); type=COP2; break;
case 0x06: strcpy(insn[i],"CTC2"); type=COP2; break;
- default:
- if (gte_handlers[source[i]&0x3f]!=NULL) {
- snprintf(insn[i], sizeof(insn[i]), "COP2 %x", source[i]&0x3f);
- type=C2OP;
- }
- break;
}
break;
case 0x32: strcpy(insn[i],"LWC2"); type=C2LS; break;