trunk/src/emu/cpu/rsp/rsp.h
r241670 | r241671 | |
541 | 541 | void generate_checksum_block(drcuml_block *block, compiler_state *compiler, const opcode_desc *seqhead, const opcode_desc *seqlast); |
542 | 542 | void generate_sequence_instruction(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); |
543 | 543 | 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); |
544 | 545 | int generate_vector_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); |
545 | 546 | int generate_opcode(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); |
546 | 547 | int generate_special(drcuml_block *block, compiler_state *compiler, const opcode_desc *desc); |
trunk/src/emu/cpu/rsp/rspdrc.c
r241670 | r241671 | |
7361 | 7361 | } |
7362 | 7362 | |
7363 | 7363 | /*------------------------------------------------------------------ |
| 7364 | generate_branch |
| 7365 | ------------------------------------------------------------------*/ |
| 7366 | |
| 7367 | void 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 | /*------------------------------------------------------------------ |
7364 | 7388 | generate_delay_slot_and_branch |
7365 | 7389 | ------------------------------------------------------------------*/ |
7366 | 7390 | |
r241670 | r241671 | |
7386 | 7410 | assert(desc->delay.first() != NULL); |
7387 | 7411 | generate_sequence_instruction(block, &compiler_temp, desc->delay.first()); // <next instruction> |
7388 | 7412 | |
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); |
7406 | 7414 | |
7407 | 7415 | /* update the label */ |
7408 | 7416 | compiler->labelnum = compiler_temp.labelnum; |
r241670 | r241671 | |
8421 | 8429 | UML_MOV(block, mem(&m_rsp_state->arg0), 3); // mov [arg0],3 |
8422 | 8430 | UML_CALLC(block, cfunc_sp_set_status_cb, this); // callc cfunc_sp_set_status_cb |
8423 | 8431 | UML_MOV(block, mem(&m_rsp_state->icount), 0); // mov icount, #0 |
| 8432 | UML_MOV(block, mem(&m_rsp_state->jmpdest), mem(&desc->targetpc)); |
8424 | 8433 | |
| 8434 | generate_branch(block, compiler, desc); |
| 8435 | |
8425 | 8436 | UML_EXIT(block, EXECUTE_OUT_OF_CYCLES); |
8426 | 8437 | return TRUE; |
8427 | 8438 | } |