summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-09-30 15:04:29 -0400
committer AJR <ajrhacker@users.noreply.github.com>2019-09-30 15:05:29 -0400
commita0f4b5adf16927e791e53ea875fa39a4a52dad6b (patch)
treeba31b6ffcfa61ce216a9fab7041aed0aa42b8d9f /src
parentb3ca14485137ddf5e9531cda04a8055aae4c0ad6 (diff)
tlcs90: Separate TMP90840 and TMP90844 disassemblers
Diffstat (limited to 'src')
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.cpp29
-rw-r--r--src/devices/cpu/tlcs90/tlcs90.h27
-rw-r--r--src/devices/cpu/tlcs90/tlcs90d.cpp42
-rw-r--r--src/devices/cpu/tlcs90/tlcs90d.h29
-rw-r--r--src/tools/unidasm.cpp3
5 files changed, 111 insertions, 19 deletions
diff --git a/src/devices/cpu/tlcs90/tlcs90.cpp b/src/devices/cpu/tlcs90/tlcs90.cpp
index 6333be73025..3bacad6c144 100644
--- a/src/devices/cpu/tlcs90/tlcs90.cpp
+++ b/src/devices/cpu/tlcs90/tlcs90.cpp
@@ -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>();
}
diff --git a/src/devices/cpu/tlcs90/tlcs90.h b/src/devices/cpu/tlcs90/tlcs90.h
index ee7fa72f042..d5dc310a2cd 100644
--- a/src/devices/cpu/tlcs90/tlcs90.h
+++ b/src/devices/cpu/tlcs90/tlcs90.h
@@ -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;
};
diff --git a/src/devices/cpu/tlcs90/tlcs90d.cpp b/src/devices/cpu/tlcs90/tlcs90d.cpp
index 662eaf8b88d..c85fb26c861 100644
--- a/src/devices/cpu/tlcs90/tlcs90d.cpp
+++ b/src/devices/cpu/tlcs90/tlcs90d.cpp
@@ -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
+};
+
+tmp90840_disassembler::tmp90840_disassembler()
+ : tlcs90_disassembler(0xffc0, ir_names)
+{
+}
+
+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
};
-#define T90_IOBASE 0xffc0
+tmp90844_disassembler::tmp90844_disassembler()
+ : tlcs90_disassembler(0xffc0, ir_names)
+{
+}
-const char *tlcs90_disassembler::internal_registers_names(uint16_t x)
+const char *tlcs90_disassembler::internal_registers_names(uint16_t x) const
{
- // 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];
+ if (x >= m_iobase)
+ return m_ir_names[x - m_iobase];
return nullptr;
}
diff --git a/src/devices/cpu/tlcs90/tlcs90d.h b/src/devices/cpu/tlcs90/tlcs90d.h
index 8db7509512c..4034717e272 100644
--- a/src/devices/cpu/tlcs90/tlcs90d.h
+++ b/src/devices/cpu/tlcs90/tlcs90d.h
@@ -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
diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp
index cd164db7776..677b3a65edb 100644
--- a/src/tools/unidasm.cpp
+++ b/src/tools/unidasm.cpp
@@ -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; } },