diff options
Diffstat (limited to 'src/devices/cpu/mips')
-rw-r--r-- | src/devices/cpu/mips/mips3.cpp | 92 | ||||
-rw-r--r-- | src/devices/cpu/mips/mips3.h | 13 | ||||
-rw-r--r-- | src/devices/cpu/mips/mips3drc.cpp | 85 | ||||
-rw-r--r-- | src/devices/cpu/mips/mips3dsm.cpp | 104 | ||||
-rw-r--r-- | src/devices/cpu/mips/mips3dsm.h | 40 | ||||
-rw-r--r-- | src/devices/cpu/mips/r3000.cpp | 37 | ||||
-rw-r--r-- | src/devices/cpu/mips/r3000.h | 6 | ||||
-rw-r--r-- | src/devices/cpu/mips/r3kdasm.cpp | 58 | ||||
-rw-r--r-- | src/devices/cpu/mips/r3kdasm.h | 36 |
9 files changed, 181 insertions, 290 deletions
diff --git a/src/devices/cpu/mips/mips3.cpp b/src/devices/cpu/mips/mips3.cpp index d55d26623d1..f71f4bb738c 100644 --- a/src/devices/cpu/mips/mips3.cpp +++ b/src/devices/cpu/mips/mips3.cpp @@ -12,6 +12,7 @@ #include "debugger.h" #include "mips3.h" #include "mips3com.h" +#include "mips3dsm.h" #define ENABLE_OVERFLOWS 0 @@ -192,7 +193,10 @@ mips3_device::mips3_device(const machine_config &mconfig, device_type type, cons memset(m_hotspot, 0, sizeof(m_hotspot)); // configure the virtual TLB - set_vtlb_fixed_entries(2 * m_tlbentries + 2); + if (m_flavor == MIPS3_TYPE_TX4925) + set_vtlb_fixed_entries(2 * m_tlbentries + 3); + else + set_vtlb_fixed_entries(2 * m_tlbentries + 2); } device_memory_interface::space_config_vector mips3_device::memory_space_config() const @@ -333,7 +337,7 @@ void mips3_device::device_start() m_cpu_clock = clock(); m_program = &space(AS_PROGRAM); - m_direct = &m_program->direct(); + m_direct = m_program->direct<0>(); /* set up the endianness */ m_program->accessors(m_memory); @@ -940,11 +944,16 @@ void mips3_device::device_reset() entry->entry_lo[1] = 0xfffffff8; vtlb_load(2 * tlbindex + 0, 0, 0, 0); vtlb_load(2 * tlbindex + 1, 0, 0, 0); + if (m_flavor == MIPS3_TYPE_TX4925) + vtlb_load(2 * tlbindex + 2, 0, 0, 0); } /* load the fixed TLB range */ vtlb_load(2 * m_tlbentries + 0, (0xa0000000 - 0x80000000) >> MIPS3_MIN_PAGE_SHIFT, 0x80000000, 0x00000000 | VTLB_READ_ALLOWED | VTLB_WRITE_ALLOWED | VTLB_FETCH_ALLOWED | VTLB_FLAG_VALID); vtlb_load(2 * m_tlbentries + 1, (0xc0000000 - 0xa0000000) >> MIPS3_MIN_PAGE_SHIFT, 0xa0000000, 0x00000000 | VTLB_READ_ALLOWED | VTLB_WRITE_ALLOWED | VTLB_FETCH_ALLOWED | VTLB_FLAG_VALID); + // TX4925 on-board peripherals pass-through + if (m_flavor == MIPS3_TYPE_TX4925) + vtlb_load(2 * m_tlbentries + 2, (0xff200000 - 0xff1f0000) >> MIPS3_MIN_PAGE_SHIFT, 0xff1f0000, 0xff1f0000 | VTLB_READ_ALLOWED | VTLB_WRITE_ALLOWED | VTLB_FETCH_ALLOWED | VTLB_FLAG_VALID); m_core->mode = (MODE_KERNEL << 1) | 0; m_cache_dirty = true; @@ -967,14 +976,9 @@ bool mips3_device::memory_translate(int spacenum, int intention, offs_t &address } -offs_t mips3_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *mips3_device::create_disassembler() { - uint32_t op = *(uint32_t *)oprom; - if (m_bigendian) - op = big_endianize_int32(op); - else - op = little_endianize_int32(op); - return dasmmips3(stream, pc, op); + return new mips3_disassembler; } @@ -985,12 +989,6 @@ offs_t mips3_device::disasm_disassemble(std::ostream &stream, offs_t pc, const u inline bool mips3_device::RBYTE(offs_t address, uint32_t *result) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - *result = (*m_memory.read_byte)(*m_program, address); - return true; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { @@ -1024,12 +1022,6 @@ inline bool mips3_device::RBYTE(offs_t address, uint32_t *result) inline bool mips3_device::RHALF(offs_t address, uint32_t *result) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - *result = (*m_memory.read_word)(*m_program, address); - return true; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { @@ -1063,12 +1055,6 @@ inline bool mips3_device::RHALF(offs_t address, uint32_t *result) inline bool mips3_device::RWORD(offs_t address, uint32_t *result) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - *result = (*m_memory.read_dword)(*m_program, address); - return true; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { @@ -1102,12 +1088,6 @@ inline bool mips3_device::RWORD(offs_t address, uint32_t *result) inline bool mips3_device::RWORD_MASKED(offs_t address, uint32_t *result, uint32_t mem_mask) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - *result = (*m_memory.read_dword_masked)(*m_program, address, mem_mask); - return true; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { @@ -1131,11 +1111,6 @@ inline bool mips3_device::RWORD_MASKED(offs_t address, uint32_t *result, uint32_ inline bool mips3_device::RDOUBLE(offs_t address, uint64_t *result) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - *result = (*m_memory.read_qword)(*m_program, address); - return true; - } const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { @@ -1159,12 +1134,6 @@ inline bool mips3_device::RDOUBLE(offs_t address, uint64_t *result) inline bool mips3_device::RDOUBLE_MASKED(offs_t address, uint64_t *result, uint64_t mem_mask) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - *result = (*m_memory.read_qword_masked)(*m_program, address, mem_mask); - return true; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { @@ -1188,12 +1157,6 @@ inline bool mips3_device::RDOUBLE_MASKED(offs_t address, uint64_t *result, uint6 inline void mips3_device::WBYTE(offs_t address, uint8_t data) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - (*m_memory.write_byte)(*m_program, address, data); - return; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { @@ -1228,11 +1191,6 @@ inline void mips3_device::WBYTE(offs_t address, uint8_t data) inline void mips3_device::WHALF(offs_t address, uint16_t data) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - (*m_memory.write_word)(*m_program, address, data); - return; - } const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { @@ -1267,12 +1225,6 @@ inline void mips3_device::WHALF(offs_t address, uint16_t data) inline void mips3_device::WWORD(offs_t address, uint32_t data) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - (*m_memory.write_dword)(*m_program, address, data); - return; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { @@ -1307,12 +1259,6 @@ inline void mips3_device::WWORD(offs_t address, uint32_t data) inline void mips3_device::WWORD_MASKED(offs_t address, uint32_t data, uint32_t mem_mask) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - (*m_memory.write_dword_masked)(*m_program, address, data, mem_mask); - return; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { @@ -1337,12 +1283,6 @@ inline void mips3_device::WWORD_MASKED(offs_t address, uint32_t data, uint32_t m inline void mips3_device::WDOUBLE(offs_t address, uint64_t data) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - (*m_memory.write_qword)(*m_program, address, data); - return; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { @@ -1367,12 +1307,6 @@ inline void mips3_device::WDOUBLE(offs_t address, uint64_t data) inline void mips3_device::WDOUBLE_MASKED(offs_t address, uint64_t data, uint64_t mem_mask) { - if ((m_flavor == MIPS3_TYPE_TX4925) && ((address & 0xffff0000) == 0xff1f0000)) - { - (*m_memory.write_qword_masked)(*m_program, address, data, mem_mask); - return; - } - const uint32_t tlbval = vtlb_table()[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { diff --git a/src/devices/cpu/mips/mips3.h b/src/devices/cpu/mips/mips3.h index 6d763c8792b..dd0bac966d9 100644 --- a/src/devices/cpu/mips/mips3.h +++ b/src/devices/cpu/mips/mips3.h @@ -312,9 +312,7 @@ protected: virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; // device_disasm_interface overrides - virtual uint32_t disasm_min_opcode_bytes() const override { return 4; } - virtual uint32_t disasm_max_opcode_bytes() const override { return 4; } - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; private: @@ -374,7 +372,7 @@ private: loadstore_func m_sdr; address_space *m_program; - direct_read_data *m_direct; + direct_read_data<0> *m_direct; uint32_t c_system_clock; uint32_t m_cpu_clock; emu_timer * m_compare_int_timer; @@ -802,11 +800,4 @@ private: #define MIPS3DRC_FASTEST_OPTIONS (0) -/*************************************************************************** - DISASSEMBLING -***************************************************************************/ - -unsigned dasmmips3(std::ostream &stream, unsigned pc, uint32_t op); - - #endif // MAME_CPU_MIPS_MIPS3_H diff --git a/src/devices/cpu/mips/mips3drc.cpp b/src/devices/cpu/mips/mips3drc.cpp index a3bd2e1469c..db90d525149 100644 --- a/src/devices/cpu/mips/mips3drc.cpp +++ b/src/devices/cpu/mips/mips3drc.cpp @@ -27,6 +27,7 @@ #include "debugger.h" #include "mips3com.h" #include "mips3fe.h" +#include "mips3dsm.h" #include "cpu/drcfe.h" #include "cpu/drcuml.h" #include "cpu/drcumlsh.h" @@ -161,12 +162,6 @@ void mips3_device::mips3drc_set_options(uint32_t options) -------------------------------------------------*/ void mips3_device::clear_fastram(uint32_t select_start) { - for (int i=select_start; i<MIPS3_MAX_FASTRAM; i++) { - m_fastram[i].start = 0; - m_fastram[i].end = 0; - m_fastram[i].readonly = false; - m_fastram[i].base = nullptr; - } m_fastram_select=select_start; // Set cache to dirty so that re-mapping occurs m_cache_dirty = true; @@ -189,6 +184,8 @@ void mips3_device::add_fastram(offs_t start, offs_t end, uint8_t readonly, void m_fastram[m_fastram_select].offset_base16 = (uint16_t*)((uint8_t*)base - start); m_fastram[m_fastram_select].offset_base32 = (uint32_t*)((uint8_t*)base - start); m_fastram_select++; + // Set cache to dirty so that re-mapping occurs + m_cache_dirty = true; } } @@ -840,69 +837,6 @@ void mips3_device::static_generate_memory_accessor(int mode, int size, int iswri UML_LABEL(block, addrok); // addrok: } - /* TX4925 on-board peripherals pass-through */ - if (m_flavor == MIPS3_TYPE_TX4925) - { - int addrok; - UML_AND(block, I3, I0, 0xffff0000); // and i3, i0, 0xffff0000 - UML_CMP(block, I3, 0xff1f0000); // cmp i3, 0xff1f0000 - UML_JMPc(block, COND_NZ, addrok = label++); - - switch (size) - { - case 1: - if (iswrite) - UML_WRITE(block, I0, I1, SIZE_BYTE, SPACE_PROGRAM); // write i0,i1,program_byte - else - UML_READ(block, I0, I0, SIZE_BYTE, SPACE_PROGRAM); // read i0,i0,program_byte - break; - - case 2: - if (iswrite) - UML_WRITE(block, I0, I1, SIZE_WORD, SPACE_PROGRAM); // write i0,i1,program_word - else - UML_READ(block, I0, I0, SIZE_WORD, SPACE_PROGRAM); // read i0,i0,program_word - break; - - case 4: - if (iswrite) - { - if (!ismasked) - UML_WRITE(block, I0, I1, SIZE_DWORD, SPACE_PROGRAM); // write i0,i1,program_dword - else - UML_WRITEM(block, I0, I1, I2, SIZE_DWORD, SPACE_PROGRAM); // writem i0,i1,i2,program_dword - } - else - { - if (!ismasked) - UML_READ(block, I0, I0, SIZE_DWORD, SPACE_PROGRAM); // read i0,i0,program_dword - else - UML_READM(block, I0, I0, I2, SIZE_DWORD, SPACE_PROGRAM); // readm i0,i0,i2,program_dword - } - break; - - case 8: - if (iswrite) - { - if (!ismasked) - UML_DWRITE(block, I0, I1, SIZE_QWORD, SPACE_PROGRAM); // dwrite i0,i1,program_qword - else - UML_DWRITEM(block, I0, I1, I2, SIZE_QWORD, SPACE_PROGRAM); // dwritem i0,i1,i2,program_qword - } - else - { - if (!ismasked) - UML_DREAD(block, I0, I0, SIZE_QWORD, SPACE_PROGRAM); // dread i0,i0,program_qword - else - UML_DREADM(block, I0, I0, I2, SIZE_QWORD, SPACE_PROGRAM); // dreadm i0,i0,i2,program_qword - } - break; - } - UML_RET(block); - - UML_LABEL(block, addrok); - } - /* general case: assume paging and perform a translation */ UML_SHR(block, I3, I0, 12); // shr i3,i0,12 UML_LOAD(block, I3, (void *)vtlb_table(), I3, SIZE_DWORD, SCALE_x4);// load i3,[vtlb_table],i3,dword @@ -911,8 +845,8 @@ void mips3_device::static_generate_memory_accessor(int mode, int size, int iswri UML_ROLINS(block, I0, I3, 0, 0xfffff000); // rolins i0,i3,0,0xfffff000 if ((machine().debug_flags & DEBUG_FLAG_ENABLED) == 0) - for (ramnum = 0; ramnum < MIPS3_MAX_FASTRAM; ramnum++) - if (m_fastram[ramnum].base != nullptr && (!iswrite || !m_fastram[ramnum].readonly)) + for (ramnum = 0; ramnum < m_fastram_select; ramnum++) + if (!(iswrite && m_fastram[ramnum].readonly)) { void *fastbase = (uint8_t *)m_fastram[ramnum].base - m_fastram[ramnum].start; uint32_t skip = label++; @@ -926,7 +860,6 @@ void mips3_device::static_generate_memory_accessor(int mode, int size, int iswri UML_CMP(block, I0, m_fastram[ramnum].start);// cmp i0,fastram_start UML_JMPc(block, COND_B, skip); // jb skip } - if (!iswrite) { if (size == 1) @@ -3354,8 +3287,9 @@ void mips3_device::log_add_disasm_comment(drcuml_block *block, uint32_t pc, uint { if (m_drcuml->logging()) { + mips3_disassembler mips3d; std::ostringstream stream; - dasmmips3(stream, pc, op); + mips3d.dasm_one(stream, pc, op); const std::string stream_string = stream.str(); block->append_comment("%08X: %s", pc, stream_string.c_str()); // comment } @@ -3493,7 +3427,10 @@ void mips3_device::log_opcode_desc(drcuml_state *drcuml, const opcode_desc *desc if (desclist->flags & OPFLAG_VIRTUAL_NOOP) buffer << "<virtual nop>"; else - dasmmips3(buffer, desclist->pc, desclist->opptr.l[0]); + { + mips3_disassembler mips3d; + mips3d.dasm_one(buffer, desclist->pc, desclist->opptr.l[0]); + } } else buffer << "???"; diff --git a/src/devices/cpu/mips/mips3dsm.cpp b/src/devices/cpu/mips/mips3dsm.cpp index acc7abbcc75..5252a552b8c 100644 --- a/src/devices/cpu/mips/mips3dsm.cpp +++ b/src/devices/cpu/mips/mips3dsm.cpp @@ -9,11 +9,12 @@ ***************************************************************************/ #include "emu.h" +#include "mips3dsm.h" #define USE_ABI_REG_NAMES (1) #if USE_ABI_REG_NAMES -static const char *const reg[32] = +const char *const mips3_disassembler::reg[32] = { "$0", "$at", "$v0", "$v1", "$a0", "$a1", "$a2", "$a3", "$t0", "$t1", "$t2", "$t3", "$t4", "$t5", "$t6", "$t7", @@ -21,7 +22,7 @@ static const char *const reg[32] = "$t8", "$t9", "$k0", "$k1", "$gp", "$sp", "$fp", "$ra" }; #else -static const char *const reg[32] = +const char *const mips3_disassembler::reg[32] = { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", @@ -30,7 +31,7 @@ static const char *const reg[32] = }; #endif -static const char *const cacheop[32] = +const char *const mips3_disassembler::cacheop[32] = { "I_Invd", "D_WBInvd", "Unknown 2", "Unknown 3", "I_IndexLoadTag", "D_IndexLoadTag", "Unknown 6", "Unknown 7", "I_IndexStoreTag", "D_IndexStoreTag", "Unknown 10", "Unknown 11", "Unknown 12", "D_CreateDirtyExcl", "Unknown 14", "Unknown 15", @@ -39,7 +40,7 @@ static const char *const cacheop[32] = }; -static const char *const cpreg[4][32] = +const char *const mips3_disassembler::cpreg[4][32] = { { "Index","Random","EntryLo0","EntryLo1","Context","PageMask","Wired","Error", @@ -68,7 +69,7 @@ static const char *const cpreg[4][32] = }; -static const char *const ccreg[4][32] = +const char *const mips3_disassembler::ccreg[4][32] = { { "ccr0", "ccr1", "ccr2", "ccr3", "ccr4", "ccr5", "ccr6", "ccr7", @@ -101,17 +102,15 @@ static const char *const ccreg[4][32] = CODE CODE ***************************************************************************/ -static inline char *signed_16bit(int16_t val) +inline std::string mips3_disassembler::signed_16bit(int16_t val) { - static char temp[10]; if (val < 0) - sprintf(temp, "-$%x", -val); + return util::string_format("-$%x", -val); else - sprintf(temp, "$%x", val); - return temp; + return util::string_format("$%x", val); } -static uint32_t dasm_cop0(uint32_t pc, uint32_t op, std::ostream &stream) +uint32_t mips3_disassembler::dasm_cop0(uint32_t pc, uint32_t op, std::ostream &stream) { int rt = (op >> 16) & 31; int rd = (op >> 11) & 31; @@ -157,7 +156,7 @@ static uint32_t dasm_cop0(uint32_t pc, uint32_t op, std::ostream &stream) case 0x02: util::stream_format(stream, "tlbwi"); break; case 0x06: util::stream_format(stream, "tlbwr"); break; case 0x08: util::stream_format(stream, "tlbp"); break; - case 0x10: util::stream_format(stream, "rfe"); flags = DASMFLAG_STEP_OUT; break; + case 0x10: util::stream_format(stream, "rfe"); flags = STEP_OUT; break; case 0x18: util::stream_format(stream, "eret [invalid]"); break; default: util::stream_format(stream, "cop0 $%07x", op & 0x01ffffff); break; } @@ -167,9 +166,9 @@ static uint32_t dasm_cop0(uint32_t pc, uint32_t op, std::ostream &stream) return flags; } -static uint32_t dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream) +uint32_t mips3_disassembler::dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream) { - static const char *const format_table[] = + const char *const format_table[] = { "?","?","?","?","?","?","?","?","?","?","?","?","?","?","?","?", "s","d","?","?","w","l","?","?","?","?","?","?","?","?","?","?" @@ -195,8 +194,8 @@ static uint32_t dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream) { case 0x00: util::stream_format(stream, "bc1f $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); break; case 0x01: util::stream_format(stream, "bc1t $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); break; - case 0x02: util::stream_format(stream, "bc1fl $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; - case 0x03: util::stream_format(stream, "bc1tl $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; + case 0x02: util::stream_format(stream, "bc1fl $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); flags = STEP_OVER | step_over_extra(1); break; + case 0x03: util::stream_format(stream, "bc1tl $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); flags = STEP_OVER | step_over_extra(1); break; } break; default: /* COP */ @@ -250,9 +249,9 @@ static uint32_t dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream) return flags; } -static uint32_t dasm_cop1x(uint32_t pc, uint32_t op, std::ostream &stream) +uint32_t mips3_disassembler::dasm_cop1x(uint32_t pc, uint32_t op, std::ostream &stream) { - static const char *const format3_table[] = + const char *const format3_table[] = { "s","d","?","?","w","l","?","?" }; @@ -310,7 +309,7 @@ static uint32_t dasm_cop1x(uint32_t pc, uint32_t op, std::ostream &stream) return flags; } -static uint32_t dasm_cop2(uint32_t pc, uint32_t op, std::ostream &stream) +uint32_t mips3_disassembler::dasm_cop2(uint32_t pc, uint32_t op, std::ostream &stream) { int rt = (op >> 16) & 31; int rd = (op >> 11) & 31; @@ -357,7 +356,12 @@ static uint32_t dasm_cop2(uint32_t pc, uint32_t op, std::ostream &stream) return flags; } -unsigned dasmmips3(std::ostream &stream, unsigned pc, uint32_t op) +u32 mips3_disassembler::opcode_alignment() const +{ + return 4; +} + +offs_t mips3_disassembler::dasm_one(std::ostream &stream, offs_t pc, u32 op) { int rs = (op >> 21) & 31; int rt = (op >> 16) & 31; @@ -381,17 +385,17 @@ unsigned dasmmips3(std::ostream &stream, unsigned pc, uint32_t op) case 0x04: util::stream_format(stream, "sllv %s,%s,%s", reg[rd], reg[rt], reg[rs]); break; case 0x06: util::stream_format(stream, "srlv %s,%s,%s", reg[rd], reg[rt], reg[rs]); break; case 0x07: util::stream_format(stream, "srav %s,%s,%s", reg[rd], reg[rt], reg[rs]); break; - case 0x08: util::stream_format(stream, "jr %s", reg[rs]); if (rs == 31) flags = DASMFLAG_STEP_OUT; break; + case 0x08: util::stream_format(stream, "jr %s", reg[rs]); if (rs == 31) flags = STEP_OUT; break; case 0x09: if (rd == 31) util::stream_format(stream, "jalr %s", reg[rs]); else util::stream_format(stream, "jalr %s,%s", reg[rs], reg[rd]); - flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); + flags = STEP_OVER | step_over_extra(1); break; case 0x0a: util::stream_format(stream, "movz %s,%s,%s", reg[rd], reg[rs], reg[rt]); break; case 0x0b: util::stream_format(stream, "movn %s,%s,%s", reg[rd], reg[rs], reg[rt]); break; - case 0x0c: util::stream_format(stream, "syscall"); flags = DASMFLAG_STEP_OVER; break; - case 0x0d: util::stream_format(stream, "break"); flags = DASMFLAG_STEP_OVER; break; + case 0x0c: util::stream_format(stream, "syscall"); flags = STEP_OVER; break; + case 0x0d: util::stream_format(stream, "break"); flags = STEP_OVER; break; case 0x0f: util::stream_format(stream, "sync"); break; case 0x10: util::stream_format(stream, "mfhi %s", reg[rd]); break; case 0x11: util::stream_format(stream, "mthi %s", reg[rs]); break; @@ -422,12 +426,12 @@ unsigned dasmmips3(std::ostream &stream, unsigned pc, uint32_t op) case 0x2d: util::stream_format(stream, "daddu %s,%s,%s", reg[rd], reg[rs], reg[rt]); break; case 0x2e: util::stream_format(stream, "dsub %s,%s,%s", reg[rd], reg[rs], reg[rt]); break; case 0x2f: util::stream_format(stream, "dsubu %s,%s,%s", reg[rd], reg[rs], reg[rt]); break; - case 0x30: util::stream_format(stream, "tge %s,%s", reg[rs], reg[rt]); flags = DASMFLAG_STEP_OVER; break; - case 0x31: util::stream_format(stream, "tgeu %s,%s", reg[rs], reg[rt]); flags = DASMFLAG_STEP_OVER; break; - case 0x32: util::stream_format(stream, "tlt %s,%s", reg[rs], reg[rt]); flags = DASMFLAG_STEP_OVER; break; - case 0x33: util::stream_format(stream, "tltu %s,%s", reg[rs], reg[rt]); flags = DASMFLAG_STEP_OVER; break; - case 0x34: util::stream_format(stream, "teq %s,%s", reg[rs], reg[rt]); flags = DASMFLAG_STEP_OVER; break; - case 0x36: util::stream_format(stream, "tne %s,%s", reg[rs], reg[rt]) ;flags = DASMFLAG_STEP_OVER; break; + case 0x30: util::stream_format(stream, "tge %s,%s", reg[rs], reg[rt]); flags = STEP_OVER; break; + case 0x31: util::stream_format(stream, "tgeu %s,%s", reg[rs], reg[rt]); flags = STEP_OVER; break; + case 0x32: util::stream_format(stream, "tlt %s,%s", reg[rs], reg[rt]); flags = STEP_OVER; break; + case 0x33: util::stream_format(stream, "tltu %s,%s", reg[rs], reg[rt]); flags = STEP_OVER; break; + case 0x34: util::stream_format(stream, "teq %s,%s", reg[rs], reg[rt]); flags = STEP_OVER; break; + case 0x36: util::stream_format(stream, "tne %s,%s", reg[rs], reg[rt]) ;flags = STEP_OVER; break; case 0x38: util::stream_format(stream, "dsll %s,%s,%d", reg[rd], reg[rt], shift); break; case 0x3a: util::stream_format(stream, "dsrl %s,%s,%d", reg[rd], reg[rt], shift); break; case 0x3b: util::stream_format(stream, "dsra %s,%s,%d", reg[rd], reg[rt], shift); break; @@ -445,22 +449,22 @@ unsigned dasmmips3(std::ostream &stream, unsigned pc, uint32_t op) case 0x01: util::stream_format(stream, "bgez %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); break; case 0x02: util::stream_format(stream, "bltzl %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); break; case 0x03: util::stream_format(stream, "bgezl %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); break; - case 0x08: util::stream_format(stream, "tgei %s,%s", reg[rs], signed_16bit(op)); flags = DASMFLAG_STEP_OVER; break; - case 0x09: util::stream_format(stream, "tgeiu %s,%s", reg[rs], signed_16bit(op)); flags = DASMFLAG_STEP_OVER; break; - case 0x0a: util::stream_format(stream, "tlti %s,%s", reg[rs], signed_16bit(op)); flags = DASMFLAG_STEP_OVER; break; - case 0x0b: util::stream_format(stream, "tltiu %s,%s", reg[rs], signed_16bit(op)); flags = DASMFLAG_STEP_OVER; break; - case 0x0c: util::stream_format(stream, "teqi %s,%s", reg[rs], signed_16bit(op)); flags = DASMFLAG_STEP_OVER; break; - case 0x0e: util::stream_format(stream, "tnei %s,%s", reg[rs], signed_16bit(op)); flags = DASMFLAG_STEP_OVER; break; - case 0x10: util::stream_format(stream, "bltzal %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; - case 0x11: util::stream_format(stream, "bgezal %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; - case 0x12: util::stream_format(stream, "bltzall %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; - case 0x13: util::stream_format(stream, "bgezall %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; + case 0x08: util::stream_format(stream, "tgei %s,%s", reg[rs], signed_16bit(op)); flags = STEP_OVER; break; + case 0x09: util::stream_format(stream, "tgeiu %s,%s", reg[rs], signed_16bit(op)); flags = STEP_OVER; break; + case 0x0a: util::stream_format(stream, "tlti %s,%s", reg[rs], signed_16bit(op)); flags = STEP_OVER; break; + case 0x0b: util::stream_format(stream, "tltiu %s,%s", reg[rs], signed_16bit(op)); flags = STEP_OVER; break; + case 0x0c: util::stream_format(stream, "teqi %s,%s", reg[rs], signed_16bit(op)); flags = STEP_OVER; break; + case 0x0e: util::stream_format(stream, "tnei %s,%s", reg[rs], signed_16bit(op)); flags = STEP_OVER; break; + case 0x10: util::stream_format(stream, "bltzal %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = STEP_OVER | step_over_extra(1); break; + case 0x11: util::stream_format(stream, "bgezal %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = STEP_OVER | step_over_extra(1); break; + case 0x12: util::stream_format(stream, "bltzall %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = STEP_OVER | step_over_extra(1); break; + case 0x13: util::stream_format(stream, "bgezall %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = STEP_OVER | step_over_extra(1); break; default: util::stream_format(stream, "dc.l $%08x [invalid]", op); break; } break; case 0x02: util::stream_format(stream, "j $%08x", (pc & 0xf0000000) | ((op & 0x03ffffff) << 2)); break; - case 0x03: util::stream_format(stream, "jal $%08x", (pc & 0xf0000000) | ((op & 0x03ffffff) << 2)); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; + case 0x03: util::stream_format(stream, "jal $%08x", (pc & 0xf0000000) | ((op & 0x03ffffff) << 2)); flags = STEP_OVER | step_over_extra(1); break; case 0x04: if (rs == 0 && rt == 0) util::stream_format(stream, "b $%08x", pc + 4 + ((int16_t)op << 2)); else @@ -532,21 +536,11 @@ unsigned dasmmips3(std::ostream &stream, unsigned pc, uint32_t op) case 0x3f: util::stream_format(stream, "sd %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]); break; default: util::stream_format(stream, "dc.l $%08x [invalid]", op); break; } - return 4 | flags | DASMFLAG_SUPPORTED; -} - - -CPU_DISASSEMBLE( mips3be ) -{ - uint32_t op = *(uint32_t *)oprom; - op = big_endianize_int32(op); - return dasmmips3(stream, pc, op); + return 4 | flags | SUPPORTED; } - -CPU_DISASSEMBLE( mips3le ) +offs_t mips3_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { - uint32_t op = *(uint32_t *)oprom; - op = little_endianize_int32(op); - return dasmmips3(stream, pc, op); + u32 op = opcodes.r32(pc); + return dasm_one(stream, pc, op); } diff --git a/src/devices/cpu/mips/mips3dsm.h b/src/devices/cpu/mips/mips3dsm.h new file mode 100644 index 00000000000..a38771bbba0 --- /dev/null +++ b/src/devices/cpu/mips/mips3dsm.h @@ -0,0 +1,40 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + mips3dsm.c + Disassembler for the portable MIPS 3 emulator. + Written by Aaron Giles + +***************************************************************************/ + +#ifndef MAME_CPU_MIPS_MIPS3DSM_H +#define MAME_CPU_MIPS_MIPS3DSM_H + +#pragma once + +class mips3_disassembler : public util::disasm_interface +{ +public: + mips3_disassembler() = default; + virtual ~mips3_disassembler() = default; + + virtual u32 opcode_alignment() const override; + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; + + offs_t dasm_one(std::ostream &stream, offs_t pc, u32 op); + +private: + static const char *const reg[32]; + static const char *const cacheop[32]; + static const char *const cpreg[4][32]; + static const char *const ccreg[4][32]; + inline std::string signed_16bit(int16_t val); + uint32_t dasm_cop0(uint32_t pc, uint32_t op, std::ostream &stream); + uint32_t dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream); + uint32_t dasm_cop1x(uint32_t pc, uint32_t op, std::ostream &stream); + uint32_t dasm_cop2(uint32_t pc, uint32_t op, std::ostream &stream); + +}; + +#endif diff --git a/src/devices/cpu/mips/r3000.cpp b/src/devices/cpu/mips/r3000.cpp index 2e29e967747..db1a35ec370 100644 --- a/src/devices/cpu/mips/r3000.cpp +++ b/src/devices/cpu/mips/r3000.cpp @@ -10,6 +10,7 @@ #include "emu.h" #include "r3000.h" +#include "r3kdasm.h" #include "debugger.h" @@ -213,7 +214,7 @@ void r3000_device::device_start() { // get our address spaces m_program = &space(AS_PROGRAM); - m_direct = &m_program->direct(); + m_direct = m_program->direct<0>(); // determine the cache sizes switch (m_chip_type) @@ -453,41 +454,13 @@ void r3000_device::state_string_export(const device_state_entry &entry, std::str //------------------------------------------------- -// disasm_min_opcode_bytes - return the length -// of the shortest instruction, in bytes -//------------------------------------------------- - -uint32_t r3000_device::disasm_min_opcode_bytes() const -{ - return 4; -} - - -//------------------------------------------------- -// disasm_max_opcode_bytes - return the length -// of the longest instruction, in bytes -//------------------------------------------------- - -uint32_t r3000_device::disasm_max_opcode_bytes() const -{ - return 4; -} - - -//------------------------------------------------- -// disasm_disassemble - call the disassembly +// disassemble - call the disassembly // helper function //------------------------------------------------- -offs_t r3000_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *r3000_device::create_disassembler() { - extern CPU_DISASSEMBLE( r3000le ); - extern CPU_DISASSEMBLE( r3000be ); - - if (m_endianness == ENDIANNESS_BIG) - return CPU_DISASSEMBLE_NAME(r3000be)(this, stream, pc, oprom, opram, options); - else - return CPU_DISASSEMBLE_NAME(r3000le)(this, stream, pc, oprom, opram, options); + return new r3000_disassembler; } diff --git a/src/devices/cpu/mips/r3000.h b/src/devices/cpu/mips/r3000.h index 1d458d93de9..a5f9998a23c 100644 --- a/src/devices/cpu/mips/r3000.h +++ b/src/devices/cpu/mips/r3000.h @@ -131,9 +131,7 @@ protected: virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; // device_disasm_interface overrides - virtual uint32_t disasm_min_opcode_bytes() const override; - virtual uint32_t disasm_max_opcode_bytes() const override; - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; // memory accessors struct r3000_data_accessors @@ -214,7 +212,7 @@ protected: const address_space_config m_program_config_be; const address_space_config m_program_config_le; address_space *m_program; - direct_read_data *m_direct; + direct_read_data<0> *m_direct; // configuration chip_type m_chip_type; diff --git a/src/devices/cpu/mips/r3kdasm.cpp b/src/devices/cpu/mips/r3kdasm.cpp index 1e8a2d7a16d..7e004a95068 100644 --- a/src/devices/cpu/mips/r3kdasm.cpp +++ b/src/devices/cpu/mips/r3kdasm.cpp @@ -9,9 +9,9 @@ ***************************************************************************/ #include "emu.h" +#include "r3kdasm.h" - -static const char *const reg[32] = +const char *const r3000_disassembler::reg[32] = { "0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", @@ -20,7 +20,7 @@ static const char *const reg[32] = }; -static const char *const cpreg[4][32] = +const char *const r3000_disassembler::cpreg[4][32] = { { "Index","Random","EntryLo","cpr3", "Context", "cpr5", "cpr6", "cpr7", @@ -49,7 +49,7 @@ static const char *const cpreg[4][32] = }; -static const char *const ccreg[4][32] = +const char *const r3000_disassembler::ccreg[4][32] = { { "ccr0", "ccr1", "ccr2", "ccr3", "ccr4", "ccr5", "ccr6", "ccr7", @@ -82,17 +82,15 @@ static const char *const ccreg[4][32] = CODE CODE ***************************************************************************/ -static inline char *signed_16bit(int16_t val) +std::string r3000_disassembler::signed_16bit(int16_t val) { - static char temp[10]; if (val < 0) - sprintf(temp, "-$%x", -val); + return util::string_format("-$%x", -val); else - sprintf(temp, "$%x", val); - return temp; + return util::string_format("$%x", val); } -static uint32_t dasm_cop(uint32_t pc, int cop, uint32_t op, std::ostream &stream) +uint32_t r3000_disassembler::dasm_cop(uint32_t pc, int cop, uint32_t op, std::ostream &stream) { int rt = (op >> 16) & 31; int rd = (op >> 11) & 31; @@ -152,7 +150,7 @@ static uint32_t dasm_cop(uint32_t pc, int cop, uint32_t op, std::ostream &stream return flags; } -static uint32_t dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream) +uint32_t r3000_disassembler::dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream) { static const char *const format_table[] = { @@ -180,8 +178,8 @@ static uint32_t dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream) { case 0x00: util::stream_format(stream, "bc1f $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); break; case 0x01: util::stream_format(stream, "bc1t $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); break; - case 0x02: util::stream_format(stream, "bc1fl $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; - case 0x03: util::stream_format(stream, "bc1tl $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; + case 0x02: util::stream_format(stream, "bc1fl $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); flags = STEP_OVER | step_over_extra(1); break; + case 0x03: util::stream_format(stream, "bc1tl $%08x,%d", pc + 4 + ((int16_t)op << 2), (op >> 18) & 7); flags = STEP_OVER | step_over_extra(1); break; } break; default: /* COP */ @@ -235,8 +233,9 @@ static uint32_t dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream) return flags; } -static unsigned dasmr3k(std::ostream &stream, unsigned pc, uint32_t op) +offs_t r3000_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { + uint32_t op = opcodes.r32(pc); int rs = (op >> 21) & 31; int rt = (op >> 16) & 31; int rd = (op >> 11) & 31; @@ -258,15 +257,15 @@ static unsigned dasmr3k(std::ostream &stream, unsigned pc, uint32_t op) case 0x04: util::stream_format(stream, "sllv %s,%s,%s", reg[rd], reg[rt], reg[rs]); break; case 0x06: util::stream_format(stream, "srlv %s,%s,%s", reg[rd], reg[rt], reg[rs]); break; case 0x07: util::stream_format(stream, "srav %s,%s,%s", reg[rd], reg[rt], reg[rs]); break; - case 0x08: util::stream_format(stream, "jr %s", reg[rs]); if (rs == 31) flags = DASMFLAG_STEP_OUT; break; + case 0x08: util::stream_format(stream, "jr %s", reg[rs]); if (rs == 31) flags = STEP_OUT; break; case 0x09: if (rd == 31) util::stream_format(stream, "jalr %s", reg[rs]); else util::stream_format(stream, "jalr %s,%s", reg[rs], reg[rd]); - flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); + flags = STEP_OVER | step_over_extra(1); break; - case 0x0c: util::stream_format(stream, "syscall"); flags = DASMFLAG_STEP_OVER; break; - case 0x0d: util::stream_format(stream, "break"); flags = DASMFLAG_STEP_OVER; break; + case 0x0c: util::stream_format(stream, "syscall"); flags = STEP_OVER; break; + case 0x0d: util::stream_format(stream, "break"); flags = STEP_OVER; break; case 0x0f: util::stream_format(stream, "sync [invalid]"); break; case 0x10: util::stream_format(stream, "mfhi %s", reg[rd]); break; case 0x11: util::stream_format(stream, "mthi %s", reg[rs]); break; @@ -309,8 +308,8 @@ static unsigned dasmr3k(std::ostream &stream, unsigned pc, uint32_t op) case 0x0b: util::stream_format(stream, "tltiu [invalid]"); break; case 0x0c: util::stream_format(stream, "teqi [invalid]"); break; case 0x0e: util::stream_format(stream, "tnei [invalid]"); break; - case 0x10: util::stream_format(stream, "bltzal %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; - case 0x11: util::stream_format(stream, "bgezal %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; + case 0x10: util::stream_format(stream, "bltzal %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = STEP_OVER | step_over_extra(1); break; + case 0x11: util::stream_format(stream, "bgezal %s,$%08x", reg[rs], pc + 4 + ((int16_t)op << 2)); flags = STEP_OVER | step_over_extra(1); break; case 0x12: util::stream_format(stream, "bltzall [invalid]"); break; case 0x13: util::stream_format(stream, "bgezall [invalid]"); break; default: util::stream_format(stream, "dc.l $%08x [invalid]", op); break; @@ -318,7 +317,7 @@ static unsigned dasmr3k(std::ostream &stream, unsigned pc, uint32_t op) break; case 0x02: util::stream_format(stream, "j $%08x", (pc & 0xf0000000) | ((op & 0x0fffffff) << 2)); break; - case 0x03: util::stream_format(stream, "jal $%08x", (pc & 0xf0000000) | ((op & 0x0fffffff) << 2)); flags = DASMFLAG_STEP_OVER | DASMFLAG_STEP_OVER_EXTRA(1); break; + case 0x03: util::stream_format(stream, "jal $%08x", (pc & 0xf0000000) | ((op & 0x0fffffff) << 2)); flags = STEP_OVER | step_over_extra(1); break; case 0x04: if (rs == 0 && rt == 0) util::stream_format(stream, "b $%08x", pc + 4 + ((int16_t)op << 2)); else @@ -374,21 +373,10 @@ static unsigned dasmr3k(std::ostream &stream, unsigned pc, uint32_t op) case 0x3f: util::stream_format(stream, "sdc3 [invalid]"); break; default: util::stream_format(stream, "dc.l $%08x [invalid]", op); break; } - return 4 | flags | DASMFLAG_SUPPORTED; -} - - -CPU_DISASSEMBLE( r3000be ) -{ - uint32_t op = *(uint32_t *)oprom; - op = big_endianize_int32(op); - return dasmr3k(stream, pc, op); + return 4 | flags | SUPPORTED; } - -CPU_DISASSEMBLE( r3000le ) +uint32_t r3000_disassembler::opcode_alignment() const { - uint32_t op = *(uint32_t *)oprom; - op = little_endianize_int32(op); - return dasmr3k(stream, pc, op); + return 4; } diff --git a/src/devices/cpu/mips/r3kdasm.h b/src/devices/cpu/mips/r3kdasm.h new file mode 100644 index 00000000000..7eec7e7c1f8 --- /dev/null +++ b/src/devices/cpu/mips/r3kdasm.h @@ -0,0 +1,36 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + r3kdasm.c + Disassembler for the portable R3000 emulator. + Written by Aaron Giles + +***************************************************************************/ + +#ifndef MAME_CPU_MIPS_R3KDASM_H +#define MAME_CPU_MIPS_R3KDASM_H + +#pragma once + +class r3000_disassembler : public util::disasm_interface +{ +public: + r3000_disassembler() = default; + virtual ~r3000_disassembler() = default; + + virtual u32 opcode_alignment() const override; + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; + +private: + static const char *const reg[32]; + static const char *const cpreg[4][32]; + static const char *const ccreg[4][32]; + std::string signed_16bit(int16_t val); + uint32_t dasm_cop(uint32_t pc, int cop, uint32_t op, std::ostream &stream); + uint32_t dasm_cop1(uint32_t pc, uint32_t op, std::ostream &stream); + + +}; + +#endif |