tlcs90: Separate TMP90840 and TMP90844 disassemblers

This commit is contained in:
AJR 2019-09-30 15:04:29 -04:00
parent b3ca144851
commit a0f4b5adf1
5 changed files with 112 additions and 20 deletions

View File

@ -2877,7 +2877,32 @@ void tlcs90_device::state_string_export(const device_state_entry &entry, std::st
}
}
std::unique_ptr<util::disasm_interface> tlcs90_device::create_disassembler()
std::unique_ptr<util::disasm_interface> tmp90840_device::create_disassembler()
{
return std::make_unique<tlcs90_disassembler>();
return std::make_unique<tmp90840_disassembler>();
}
std::unique_ptr<util::disasm_interface> tmp90841_device::create_disassembler()
{
return std::make_unique<tmp90840_disassembler>();
}
std::unique_ptr<util::disasm_interface> tmp90845_device::create_disassembler()
{
return std::make_unique<tmp90840_disassembler>();
}
std::unique_ptr<util::disasm_interface> tmp91640_device::create_disassembler()
{
return std::make_unique<tmp90840_disassembler>();
}
std::unique_ptr<util::disasm_interface> tmp91641_device::create_disassembler()
{
return std::make_unique<tmp90840_disassembler>();
}
std::unique_ptr<util::disasm_interface> tmp90ph44_device::create_disassembler()
{
return std::make_unique<tmp90844_disassembler>();
}

View File

@ -57,9 +57,6 @@ protected:
// device_state_interface overrides
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
private:
enum class e_mode : u8 {
NONE, BIT8, CC,
@ -162,6 +159,10 @@ class tmp90840_device : public tlcs90_device
public:
// construction/destruction
tmp90840_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};
@ -170,6 +171,10 @@ class tmp90841_device : public tlcs90_device
public:
// construction/destruction
tmp90841_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};
@ -178,6 +183,10 @@ class tmp90845_device : public tlcs90_device
public:
// construction/destruction
tmp90845_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};
@ -186,6 +195,10 @@ class tmp91640_device : public tlcs90_device
public:
// construction/destruction
tmp91640_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};
@ -194,6 +207,10 @@ class tmp91641_device : public tlcs90_device
public:
// construction/destruction
tmp91641_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};
@ -202,6 +219,10 @@ class tmp90ph44_device : public tlcs90_device
public:
// construction/destruction
tmp90ph44_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};

View File

@ -27,23 +27,47 @@ u32 tlcs90_disassembler::opcode_alignment() const
return 1;
}
const char *const tlcs90_disassembler::ir_names[] = {
tlcs90_disassembler::tlcs90_disassembler(uint16_t iobase, const char *const ir_names[])
: m_iobase(iobase), m_ir_names(ir_names)
{
}
const char *const tmp90840_disassembler::ir_names[0x40] = {
"P0", "P1", "P01CR/IRFL", "IRFH", "P2", "P2CR", "P3", "P3CR",
"P4", "P4CR", "P5", "SMMOD", "P6", "P7", "P67CR", "SMCR",
"P8", "P8CR", "WDMOD", "WDCR", "TREG0", "TREG1", "TREG2", "TREG3",
"TCLK", "TFFCR", "TMOD", "TRUN", "CAP1L", "CAP1H", "CAP2L", "CAL2H",
"TCLK", "TFFCR", "TMOD", "TRUN", "CAP1L", "CAP1H", "CAP2L", "CAP2H",
"TREG4L", "TREG4H", "TREG5L", "TREG5H", "T4MOD", "T4FFCR", "INTEL", "INTEH",
"DMAEH", "SCMOD", "SCCR", "SCBUF", "BX", "BY", "ADREG", "ADMOD"
"DMAEH", "SCMOD", "SCCR", "SCBUF", "BX", "BY", "ADREG", "ADMOD",
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
};
#define T90_IOBASE 0xffc0
const char *tlcs90_disassembler::internal_registers_names(uint16_t x)
tmp90840_disassembler::tmp90840_disassembler()
: tlcs90_disassembler(0xffc0, ir_names)
{
// FIXME: TMP90PH44 and many other models have completely different SFR maps
int ir = x - T90_IOBASE;
if ( ir >= 0 && ir < ARRAY_LENGTH(ir_names) )
return ir_names[ir];
}
const char *const tmp90844_disassembler::ir_names[0x40] = {
"P0", "P0CR", "P1", "P1CR", "P2", "P2CR", "P3", "P3CR",
"P4", "P4CR", "P5", "P6", "P7", "P67CR", "P23FR", "P4FR",
"P67FR", "P25FR", "WDMOD", "WDCR", "TREG0", "TREG1", "TREG2", "TREG3",
"T01MOD", "T23MOD", "TFFCR", "TRDC", "TRUN", nullptr, nullptr, nullptr,
"CAP1L/TREG4L", "CAP1H/TREG4H", "CAP2L/TREG5L", "CAP2H/TREG5H", "T4MOD", "T4FFCR", "SCMOD", "SCCR",
"SCBUF", "BRGCR", "IRFL", "IRFH/P1FR", nullptr, nullptr, "STATUS", "ADMOD",
"ADREG0", "ADREG1", "ADREG2", "ADREG3", "INTEL", "INTEH", "DMAEL", "DMAEH",
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
};
tmp90844_disassembler::tmp90844_disassembler()
: tlcs90_disassembler(0xffc0, ir_names)
{
}
const char *tlcs90_disassembler::internal_registers_names(uint16_t x) const
{
if (x >= m_iobase)
return m_ir_names[x - m_iobase];
return nullptr;
}

View File

@ -20,12 +20,13 @@
class tlcs90_disassembler : public util::disasm_interface
{
public:
tlcs90_disassembler() = default;
virtual ~tlcs90_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;
protected:
tlcs90_disassembler(uint16_t iobase, const char *const ir_names[]);
private:
enum _e_op { UNKNOWN, NOP, EX, EXX, LD, LDW, LDA, LDI, LDIR, LDD, LDDR, CPI, CPIR, CPD, CPDR, PUSH, POP, JP, JR, CALL, CALLR, RET, RETI, HALT, DI, EI, SWI, DAA, CPL, NEG, LDAR, RCF, SCF, CCF, TSET, BIT, SET, RES, INC, DEC, INCX, DECX, INCW, DECW, ADD, ADC, SUB, SBC, AND, XOR, OR, CP, RLC, RRC, RL, RR, SLA, SRA, SLL, SRL, RLD, RRD, DJNZ, MUL, DIV };
@ -41,7 +42,9 @@ private:
static const char *const r8_names[];
static const char *const r16_names[];
static const char *const cc_names[];
static const char *const ir_names[];
const uint16_t m_iobase;
const char *const *m_ir_names;
uint8_t m_op;
@ -59,7 +62,25 @@ private:
void decode();
bool stream_arg(std::ostream &stream, uint32_t pc, const char *pre, const e_mode mode, const uint16_t r, const uint16_t rb);
const char *internal_registers_names(uint16_t x);
const char *internal_registers_names(uint16_t x) const;
};
class tmp90840_disassembler : public tlcs90_disassembler
{
public:
tmp90840_disassembler();
private:
static const char *const ir_names[];
};
class tmp90844_disassembler : public tlcs90_disassembler
{
public:
tmp90844_disassembler();
private:
static const char *const ir_names[];
};
#endif

View File

@ -483,8 +483,9 @@ static const dasm_table_entry dasm_table[] =
{ "superfx", le, 0, []() -> util::disasm_interface * { return new superfx_disassembler(&superfx_unidasm); } },
{ "t11", le, 0, []() -> util::disasm_interface * { return new t11_disassembler; } },
{ "tlcs870", le, 0, []() -> util::disasm_interface * { return new tlcs870_disassembler; } },
{ "tlcs90", le, 0, []() -> util::disasm_interface * { return new tlcs90_disassembler; } },
{ "tlcs900", le, 0, []() -> util::disasm_interface * { return new tlcs900_disassembler; } },
{ "tmp90840", le, 0, []() -> util::disasm_interface * { return new tmp90840_disassembler; } },
{ "tmp90844", le, 0, []() -> util::disasm_interface * { return new tmp90844_disassembler; } },
{ "tms0980", be, 0, []() -> util::disasm_interface * { return new tms0980_disassembler; } },
{ "tms1000", le, 0, []() -> util::disasm_interface * { return new tms1000_disassembler; } },
{ "tms1100", le, 0, []() -> util::disasm_interface * { return new tms1100_disassembler; } },