diff options
Diffstat (limited to 'src/devices/cpu/sparc/sparcdasm.cpp')
-rw-r--r-- | src/devices/cpu/sparc/sparcdasm.cpp | 17 |
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) { |