summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2012-02-23 14:30:03 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2012-02-23 14:30:03 +0000
commit3915e5c0e2eeb0928cd080a114a698909b1044a9 (patch)
tree5c32c92a7440f719920bc83abb614f4e074b2279
parent97c3d0cb3986b29007ab69d6401d367d2f5b09bd (diff)
[N64] Force mtc0 opcodes that initiate to-RSP DMAs to end recompile sequences to force a code check. Fixes certain microcodes from executing garbage code after DMA. [Ryan Holtz]
-rw-r--r--src/emu/cpu/rsp/rspdrc.c8
-rw-r--r--src/emu/cpu/rsp/rspfe.c4
2 files changed, 10 insertions, 2 deletions
diff --git a/src/emu/cpu/rsp/rspdrc.c b/src/emu/cpu/rsp/rspdrc.c
index e7cc6346f18..c09da43c9f3 100644
--- a/src/emu/cpu/rsp/rspdrc.c
+++ b/src/emu/cpu/rsp/rspdrc.c
@@ -3622,8 +3622,7 @@ static void static_generate_entry_point(rsp_state *rsp)
load_fast_iregs(rsp, block);
/* generate a hash jump via the current mode and PC */
- UML_HASHJMP(block, 0, mem(&rsp->pc), *rsp->impstate->nocode);
- // hashjmp <mode>,<pc>,nocode
+ UML_HASHJMP(block, 0, mem(&rsp->pc), *rsp->impstate->nocode); // hashjmp <mode>,<pc>,nocode
block->end();
}
@@ -4622,6 +4621,11 @@ static int generate_cop0(rsp_state *rsp, drcuml_block *block, compiler_state *co
UML_MOV(block, mem(&rsp->impstate->arg0), RDREG); // mov [arg0],<rdreg>
UML_MOV(block, mem(&rsp->impstate->arg1), RTREG); // mov [arg1],<rtreg>
UML_CALLC(block, cfunc_get_cop0_reg, rsp); // callc cfunc_get_cop0_reg
+ if(RDREG == 2)
+ {
+ generate_update_cycles(rsp, block, compiler, mem(&rsp->pc), TRUE);
+ UML_HASHJMP(block, 0, mem(&rsp->pc), *rsp->impstate->nocode);
+ }
}
return TRUE;
diff --git a/src/emu/cpu/rsp/rspfe.c b/src/emu/cpu/rsp/rspfe.c
index dca31e40f2d..ce2e062910f 100644
--- a/src/emu/cpu/rsp/rspfe.c
+++ b/src/emu/cpu/rsp/rspfe.c
@@ -274,6 +274,10 @@ bool rsp_frontend::describe_cop0(UINT32 op, opcode_desc &desc)
case 0x04: // MTCz
desc.regin[0] |= REGFLAG_R(RTREG);
+ if(RDREG == 2) // SP_RD_LEN, initiating DMA
+ {
+ desc.flags |= OPFLAG_END_SEQUENCE;
+ }
return true;
}