diff options
Diffstat (limited to 'src/devices/cpu/sharc/sharcdsm.cpp')
-rw-r--r-- | src/devices/cpu/sharc/sharcdsm.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/src/devices/cpu/sharc/sharcdsm.cpp b/src/devices/cpu/sharc/sharcdsm.cpp index e5fd3c62f24..f215e8816b9 100644 --- a/src/devices/cpu/sharc/sharcdsm.cpp +++ b/src/devices/cpu/sharc/sharcdsm.cpp @@ -95,9 +95,6 @@ const char sharc_disassembler::mr_regnames[16][8] = #define GET_DAG2_L(x) (GET_UREG(0x30 | (8 + (x & 0x7)))) #define GET_DAG2_B(x) (GET_UREG(0x40 | (8 + (x & 0x7)))) -#define SIGN_EXTEND6(x) ((x & 0x20) ? (0xffffffc0 | x) : x) -#define SIGN_EXTEND24(x) ((x & 0x800000) ? (0xff000000 | x) : x) - void sharc_disassembler::compute(std::ostream &stream, uint32_t opcode) { @@ -710,10 +707,12 @@ uint32_t sharc_disassembler::dasm_direct_jump(std::ostream &stream, uint32_t pc, { util::stream_format(stream, "JUMP"); } + if (cond != 31) + flags |= STEP_COND; if (opcode & 0x10000000000U) /* PC-relative branch */ { - util::stream_format(stream, " (0x%08X)", pc + SIGN_EXTEND24(addr)); + util::stream_format(stream, " (0x%08X)", pc + util::sext(addr, 24)); } else /* Indirect branch */ { @@ -722,6 +721,7 @@ uint32_t sharc_disassembler::dasm_direct_jump(std::ostream &stream, uint32_t pc, if (j) { util::stream_format(stream, " (DB)"); + flags |= step_over_extra(2); } if (ci) { @@ -753,10 +753,12 @@ uint32_t sharc_disassembler::dasm_indirect_jump_compute(std::ostream &stream, ui { util::stream_format(stream, "JUMP"); } + if (cond != 31) + flags |= STEP_COND; if (opcode & 0x10000000000U) /* PC-relative branch */ { - util::stream_format(stream, " (0x%08X)", pc + SIGN_EXTEND6(reladdr)); + util::stream_format(stream, " (0x%08X)", pc + util::sext(reladdr, 6)); } else /* Indirect branch */ { @@ -765,6 +767,7 @@ uint32_t sharc_disassembler::dasm_indirect_jump_compute(std::ostream &stream, ui if (j) { util::stream_format(stream, " (DB)"); + flags |= step_over_extra(2); } if (ci) { @@ -795,13 +798,14 @@ uint32_t sharc_disassembler::dasm_indirect_jump_compute_dregdm(std::ostream &str int reladdr = (opcode >> 27) & 0x3f; int dreg = (opcode >> 23) & 0xf; int comp = opcode & 0x7fffff; + uint32_t flags = cond != 31 ? STEP_COND : 0; get_if_condition(stream, cond); util::stream_format(stream, "JUMP"); if (opcode & 0x200000000000U) /* PC-relative branch */ { - util::stream_format(stream, " (0x%08X)", pc + SIGN_EXTEND6(reladdr)); + util::stream_format(stream, " (0x%08X)", pc + util::sext(reladdr, 6)); } else /* Indirect branch */ { @@ -822,7 +826,7 @@ uint32_t sharc_disassembler::dasm_indirect_jump_compute_dregdm(std::ostream &str { util::stream_format(stream, "DM(%s, %s) = %s", GET_DAG1_I(dmi), GET_DAG1_M(dmm), GET_DREG(dreg)); } - return 0; + return flags; } uint32_t sharc_disassembler::dasm_rts_compute(std::ostream &stream, uint32_t pc, uint64_t opcode) @@ -832,8 +836,11 @@ uint32_t sharc_disassembler::dasm_rts_compute(std::ostream &stream, uint32_t pc, int lr = (opcode >> 24) & 0x1; int cond = (opcode >> 33) & 0x1f; int comp = opcode & 0x7fffff; + uint32_t flags = STEP_OUT; get_if_condition(stream, cond); + if (cond != 31) + flags |= STEP_COND; if (opcode & 0x10000000000U) { @@ -847,6 +854,7 @@ uint32_t sharc_disassembler::dasm_rts_compute(std::ostream &stream, uint32_t pc, if (j) { util::stream_format(stream, " (DB)"); + flags |= step_over_extra(2); } if (lr) { @@ -863,7 +871,7 @@ uint32_t sharc_disassembler::dasm_rts_compute(std::ostream &stream, uint32_t pc, compute(stream, comp); } - return STEP_OUT; + return flags; } uint32_t sharc_disassembler::dasm_do_until_counter(std::ostream &stream, uint32_t pc, uint64_t opcode) @@ -875,12 +883,12 @@ uint32_t sharc_disassembler::dasm_do_until_counter(std::ostream &stream, uint32_ if (opcode & 0x10000000000U) /* Loop counter from universal register */ { util::stream_format(stream, "LCNTR = %s, ", GET_UREG(ureg)); - util::stream_format(stream, "DO (0x%08X)", pc + SIGN_EXTEND24(addr)); + util::stream_format(stream, "DO (0x%08X)", pc + util::sext(addr, 24)); } else /* Loop counter from immediate */ { util::stream_format(stream, "LCNTR = 0x%04X, ", data); - util::stream_format(stream, "DO (0x%08X) UNTIL LCE", pc + SIGN_EXTEND24(addr)); + util::stream_format(stream, "DO (0x%08X) UNTIL LCE", pc + util::sext(addr, 24)); } return 0; } @@ -890,7 +898,7 @@ uint32_t sharc_disassembler::dasm_do_until(std::ostream &stream, uint32_t pc, ui int term = (opcode >> 33) & 0x1f; uint32_t addr = opcode & 0xffffff; - util::stream_format(stream, "DO (0x%08X) UNTIL %s", pc + SIGN_EXTEND24(addr), condition_codes_do[term]); + util::stream_format(stream, "DO (0x%08X) UNTIL %s", pc + util::sext(addr, 24), condition_codes_do[term]); return 0; } |