Previous 199869 Revisions Next

r33159 Monday 3rd November, 2014 at 09:52:19 UTC by Ryan Holtz
rspdrc: Add destination address support to the BREAK opcode. [MooglyGuy]
[src/emu/cpu/rsp]rsp.h rspdrc.c rspfe.c

trunk/src/emu/cpu/rsp/rsp.h
r241670r241671
541541   void generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast);
542542   void generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
543543   void generate_delay_slot_and_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc, UINT8 linkreg);
544   void generate_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
544545   int generate_vector_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
545546   int generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
546547   int generate_special(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc);
trunk/src/emu/cpu/rsp/rspdrc.c
r241670r241671
73617361}
73627362
73637363/*------------------------------------------------------------------
7364    generate_branch
7365------------------------------------------------------------------*/
7366
7367void rsp_device::generate_branch(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc)
7368{
7369   compiler_state compiler_temp = *compiler;
7370
7371   /* update the cycles and jump through the hash table to the target */
7372   if (desc->targetpc != BRANCH_TARGET_DYNAMIC)
7373   {
7374      generate_update_cycles(block, &compiler_temp, desc->targetpc, TRUE);   // <subtract cycles>
7375      if (desc->flags & OPFLAG_INTRABLOCK_BRANCH)
7376         UML_JMP(block, desc->targetpc | 0x80000000);                  // jmp     desc->targetpc
7377      else
7378         UML_HASHJMP(block, 0, desc->targetpc, *m_nocode);               // hashjmp <mode>,desc->targetpc,nocode
7379   }
7380   else
7381   {
7382      generate_update_cycles(block, &compiler_temp, mem(&m_rsp_state->jmpdest), TRUE);   // <subtract cycles>
7383      UML_HASHJMP(block, 0, mem(&m_rsp_state->jmpdest), *m_nocode);                  // hashjmp <mode>,<rsreg>,nocode
7384   }
7385}
7386
7387/*------------------------------------------------------------------
73647388    generate_delay_slot_and_branch
73657389------------------------------------------------------------------*/
73667390
r241670r241671
73867410   assert(desc->delay.first() != NULL);
73877411   generate_sequence_instruction(block, &compiler_temp, desc->delay.first());     // <next instruction>
73887412
7389   /* update the cycles and jump through the hash table to the target */
7390   if (desc->targetpc != BRANCH_TARGET_DYNAMIC)
7391   {
7392      generate_update_cycles(block, &compiler_temp, desc->targetpc, TRUE);   // <subtract cycles>
7393      if (desc->flags & OPFLAG_INTRABLOCK_BRANCH)
7394         UML_JMP(block, desc->targetpc | 0x80000000);                            // jmp     desc->targetpc
7395      else
7396         UML_HASHJMP(block, 0, desc->targetpc, *m_nocode);
7397                                                               // hashjmp <mode>,desc->targetpc,nocode
7398   }
7399   else
7400   {
7401      generate_update_cycles(block, &compiler_temp, mem(&m_rsp_state->jmpdest), TRUE);
7402                                                               // <subtract cycles>
7403      UML_HASHJMP(block, 0, mem(&m_rsp_state->jmpdest), *m_nocode);
7404                                                               // hashjmp <mode>,<rsreg>,nocode
7405   }
7413   generate_branch(block, compiler, desc);
74067414
74077415   /* update the label */
74087416   compiler->labelnum = compiler_temp.labelnum;
r241670r241671
84218429         UML_MOV(block, mem(&m_rsp_state->arg0), 3);                   // mov     [arg0],3
84228430         UML_CALLC(block, cfunc_sp_set_status_cb, this);                      // callc   cfunc_sp_set_status_cb
84238431         UML_MOV(block, mem(&m_rsp_state->icount), 0);                       // mov icount, #0
8432         UML_MOV(block, mem(&m_rsp_state->jmpdest), mem(&desc->targetpc));
84248433
8434         generate_branch(block, compiler, desc);
8435
84258436         UML_EXIT(block, EXECUTE_OUT_OF_CYCLES);
84268437         return TRUE;
84278438   }
trunk/src/emu/cpu/rsp/rspfe.c
r241670r241671
207207         return true;
208208
209209      case 0x0d:  // BREAK
210         desc.flags |= OPFLAG_END_SEQUENCE;
211         desc.targetpc = BRANCH_TARGET_DYNAMIC;
210         desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE;
211         desc.targetpc = (op >> 5) & 0x000fffff;
212212         return true;
213213   }
214214


Previous 199869 Revisions Next


© 1997-2024 The MAME Team