summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/sparc/sparcdasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/sparc/sparcdasm.cpp')
-rw-r--r--src/devices/cpu/sparc/sparcdasm.cpp17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/devices/cpu/sparc/sparcdasm.cpp b/src/devices/cpu/sparc/sparcdasm.cpp
index 6422c0a567f..0b7bb50e110 100644
--- a/src/devices/cpu/sparc/sparcdasm.cpp
+++ b/src/devices/cpu/sparc/sparcdasm.cpp
@@ -479,6 +479,7 @@ inline void sparc_disassembler::print(char *&output, const char *fmt, ...)
sparc_disassembler::sparc_disassembler(unsigned version)
: m_version(version)
+ , m_vis_level(0)
, m_op_field_width(9)
, m_branch_desc{
EMPTY_BRANCH_DESC,
@@ -537,6 +538,7 @@ sparc_disassembler::sparc_disassembler(unsigned version)
void sparc_disassembler::enable_vis1()
{
+ m_vis_level = std::max(m_vis_level, 1U);
m_op_field_width = std::max(m_op_field_width, 12);
add_vis_op_desc(VIS1_OP_DESC);
add_state_reg_desc(VIS1_STATE_REG_DESC);
@@ -547,6 +549,7 @@ void sparc_disassembler::enable_vis1()
void sparc_disassembler::enable_vis2()
{
enable_vis1();
+ m_vis_level = std::max(m_vis_level, 2U);
add_vis_op_desc(VIS2_OP_DESC);
}
@@ -1052,7 +1055,7 @@ offs_t sparc_disassembler::dasm_fpop2(char *buf, offs_t pc, UINT32 op) const
case 1: mnemonic = "fmovs"; shift = false; break;
case 2: mnemonic = "fmovd"; shift = true; break;
case 3: mnemonic = "fmovq"; shift = true; break;
- default: mnemonic = nullptr;
+ default: mnemonic = nullptr; shift = false; break;
}
if (mnemonic)
{
@@ -1114,6 +1117,11 @@ offs_t sparc_disassembler::dasm_impdep1(char *buf, offs_t pc, UINT32 op) const
dasm_vis_arg(buf, args, it->second.rd, RD);
return 4 | DASMFLAG_SUPPORTED;
}
+ else if ((m_vis_level >= 2) && (OPF == 0x081))
+ {
+ print(buf, "%-*s0x%x", m_op_field_width, "siam", IAMODE);
+ return 4 | DASMFLAG_SUPPORTED;
+ }
// TODO: driver hook for other kinds of coprocessor?
@@ -1200,6 +1208,7 @@ offs_t sparc_disassembler::dasm_ldst(char *buf, offs_t pc, UINT32 op) const
print(buf, "%-*s%%fsr,[", m_op_field_width, (RD == 1) ? "stx" : "st");
dasm_address(buf, op);
*buf++ = ']';
+ *buf = '\0';
return 4 | DASMFLAG_SUPPORTED;
}
break;
@@ -1236,7 +1245,7 @@ offs_t sparc_disassembler::dasm_ldst(char *buf, offs_t pc, UINT32 op) const
if (OP3 == 0x3d) dasm_asi(buf, op);
const auto it(m_prftch_desc.find(RD));
if (it != m_prftch_desc.end()) print(buf, ",%s", it->second.name);
- else print(buf, ",0x%02x", RD);
+ else print(buf, ",0x%02x", RD);
if (OP3 == 0x3d) dasm_asi_comment(buf, op);
}
return 4 | DASMFLAG_SUPPORTED;
@@ -1257,12 +1266,14 @@ offs_t sparc_disassembler::dasm_ldst(char *buf, offs_t pc, UINT32 op) const
print(buf, "%-*s%%%csr,[", m_op_field_width, "st", (OP3 == 0x35) ? 'c' : 'f');
dasm_address(buf, op);
*buf++ = ']';
+ *buf = '\0';
return 4 | DASMFLAG_SUPPORTED;
case 0x26: // Store Floating-point deferred-trap Queue
case 0x36: // Store Coprocessor deferred-trap Queue
print(buf, "%-*s%%%cq,[", m_op_field_width, "std", (OP3 == 0x36) ? 'c' : 'f');
dasm_address(buf, op);
*buf++ = ']';
+ *buf = '\0';
return 4 | DASMFLAG_SUPPORTED;
}
}
@@ -1279,6 +1290,7 @@ offs_t sparc_disassembler::dasm_ldst(char *buf, offs_t pc, UINT32 op) const
print(buf, "%-*s[", m_op_field_width, it->second.g0_synth);
dasm_address(buf, op);
*buf++ = ']';
+ *buf = '\0';
if (it->second.alternate)
{
dasm_asi(buf, op);
@@ -1296,6 +1308,7 @@ offs_t sparc_disassembler::dasm_ldst(char *buf, offs_t pc, UINT32 op) const
*buf++ = '[';
dasm_address(buf, op);
*buf++ = ']';
+ *buf = '\0';
if (it->second.alternate) dasm_asi(buf, op);
if (!it->second.rd_first)
{