diff options
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 |
commit | a0f4b5adf16927e791e53ea875fa39a4a52dad6b (patch) | |
tree | ba31b6ffcfa61ce216a9fab7041aed0aa42b8d9f /src | |
parent | b3ca14485137ddf5e9531cda04a8055aae4c0ad6 (diff) |
tlcs90: Separate TMP90840 and TMP90844 disassemblers
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/cpu/tlcs90/tlcs90.cpp | 29 | ||||
-rw-r--r-- | src/devices/cpu/tlcs90/tlcs90.h | 27 | ||||
-rw-r--r-- | src/devices/cpu/tlcs90/tlcs90d.cpp | 42 | ||||
-rw-r--r-- | src/devices/cpu/tlcs90/tlcs90d.h | 29 | ||||
-rw-r--r-- | src/tools/unidasm.cpp | 3 |
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 ¶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 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; } }, |