summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/sharc/sharcdsm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/sharc/sharcdsm.cpp')
-rw-r--r--src/devices/cpu/sharc/sharcdsm.cpp30
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;
}