mirror of
https://github.com/holub/mame
synced 2025-06-06 04:43:45 +03:00
tlcs90: Separate TMP90840 and TMP90844 disassemblers
This commit is contained in:
parent
b3ca144851
commit
a0f4b5adf1
@ -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>();
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 ¶ms) 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
|
||||
|
@ -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; } },
|
||||
|
Loading…
Reference in New Issue
Block a user