summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mips
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mips')
-rw-r--r--src/devices/cpu/mips/mips3.cpp92
-rw-r--r--src/devices/cpu/mips/mips3.h13
-rw-r--r--src/devices/cpu/mips/mips3drc.cpp85
-rw-r--r--src/devices/cpu/mips/mips3dsm.cpp104
-rw-r--r--src/devices/cpu/mips/mips3dsm.h40
-rw-r--r--src/devices/cpu/mips/r3000.cpp37
-rw-r--r--src/devices/cpu/mips/r3000.h6
-rw-r--r--src/devices/cpu/mips/r3kdasm.cpp58
-rw-r--r--src/devices/cpu/mips/r3kdasm.h36
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 &params)
{
- 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 &params) 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 &params)
{
+ 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 &params) 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