diff options
author | 2018-12-01 14:26:50 +0100 | |
---|---|---|
committer | 2018-12-01 14:27:21 +0100 | |
commit | 0e6bff870e68bae444caa4ff607a4c65183a7276 (patch) | |
tree | 699d8857d43a3fe4805bdff4006fe623a62ef3d0 /src/devices/cpu/e132xs/e132xsdrc.cpp | |
parent | d026809d9c71f76078b349ce8f635cfe8b9b5e42 (diff) |
e132xs: Fixed SUBC flag calculation for DRC, and fixed instruction length flags. Fixes hang in DRC. [Ryan Holtz]
Diffstat (limited to 'src/devices/cpu/e132xs/e132xsdrc.cpp')
-rw-r--r-- | src/devices/cpu/e132xs/e132xsdrc.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/devices/cpu/e132xs/e132xsdrc.cpp b/src/devices/cpu/e132xs/e132xsdrc.cpp index 0603e8eeeec..31bcda4b104 100644 --- a/src/devices/cpu/e132xs/e132xsdrc.cpp +++ b/src/devices/cpu/e132xs/e132xsdrc.cpp @@ -865,8 +865,11 @@ void hyperstone_device::log_add_disasm_comment(drcuml_block &block, uint32_t pc, generate_branch ------------------------------------------------------------------*/ -void hyperstone_device::generate_branch(drcuml_block &block, uml::parameter targetpc, bool update_cycles) +void hyperstone_device::generate_branch(drcuml_block &block, uml::parameter targetpc, const opcode_desc *desc, bool update_cycles) { + if (desc) + UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); + if (update_cycles) generate_update_cycles(block); @@ -910,8 +913,6 @@ void hyperstone_device::generate_sequence_instruction(drcuml_block &block, compi UML_DEBUG(block, desc->pc); } - UML_ROLINS(block, DRC_SR, (1<<19), 0, ILC_MASK); - if (!(desc->flags & OPFLAG_VIRTUAL_NOOP)) { /* compile the instruction */ @@ -930,7 +931,6 @@ bool hyperstone_device::generate_opcode(drcuml_block &block, compiler_state &com { uint32_t op = (uint32_t)desc->opptr.w[0]; - //UML_MOV(block, I0, op); UML_ADD(block, DRC_PC, DRC_PC, 2); switch (op >> 8) @@ -1193,6 +1193,8 @@ bool hyperstone_device::generate_opcode(drcuml_block &block, compiler_state &com case 0xff: generate_trap_op(block, compiler, desc); break; } + UML_ROLINS(block, DRC_SR, ((desc->length >> 1) << ILC_SHIFT), 0, ILC_MASK); + int no_delay_taken = compiler.m_labelnum++; UML_TEST(block, mem(&m_core->delay_slot_taken), ~0); UML_JMPc(block, uml::COND_Z, no_delay_taken); @@ -1209,6 +1211,5 @@ bool hyperstone_device::generate_opcode(drcuml_block &block, compiler_state &com UML_EXHc(block, uml::COND_E, *m_exception[EXCEPTION_TRACE], 0); UML_LABEL(block, done); - return true; } |