From 3915e5c0e2eeb0928cd080a114a698909b1044a9 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 23 Feb 2012 14:30:03 +0000 Subject: [PATCH] [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] --- src/emu/cpu/rsp/rspdrc.c | 8 ++++++-- src/emu/cpu/rsp/rspfe.c | 4 ++++ 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 ,,nocode + UML_HASHJMP(block, 0, mem(&rsp->pc), *rsp->impstate->nocode); // hashjmp ,,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], UML_MOV(block, mem(&rsp->impstate->arg1), RTREG); // mov [arg1], 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; }