From d6ae8ec92175ae8b822a4d2dfcffda432ac6a211 Mon Sep 17 00:00:00 2001 From: hap Date: Tue, 29 Mar 2022 00:19:57 +0200 Subject: rw5000: separate b6000 disasm from b5000, add a5000 disasm --- src/devices/cpu/rw5000/b6000.cpp | 9 +++++ src/devices/cpu/rw5000/b6000.h | 3 ++ src/devices/cpu/rw5000/b6100.cpp | 2 +- src/devices/cpu/rw5000/rw5000d.cpp | 76 +++++++++++++++++++++++++++++++++++--- src/devices/cpu/rw5000/rw5000d.h | 32 +++++++++++++--- src/tools/unidasm.cpp | 4 +- 6 files changed, 113 insertions(+), 13 deletions(-) diff --git a/src/devices/cpu/rw5000/b6000.cpp b/src/devices/cpu/rw5000/b6000.cpp index 24232d70516..f41ebfbbf48 100644 --- a/src/devices/cpu/rw5000/b6000.cpp +++ b/src/devices/cpu/rw5000/b6000.cpp @@ -16,6 +16,8 @@ TODO: #include "emu.h" #include "b6000.h" +#include "rw5000d.h" + DEFINE_DEVICE_TYPE(B6000, b6000_cpu_device, "b6000", "Rockwell B6000") @@ -37,6 +39,13 @@ void b6000_cpu_device::program_512x8(address_map &map) } +// disasm +std::unique_ptr b6000_cpu_device::create_disassembler() +{ + return std::make_unique(); +} + + // initialize void b6000_cpu_device::device_reset() { diff --git a/src/devices/cpu/rw5000/b6000.h b/src/devices/cpu/rw5000/b6000.h index 3a7f617824d..e415c353ee5 100644 --- a/src/devices/cpu/rw5000/b6000.h +++ b/src/devices/cpu/rw5000/b6000.h @@ -49,6 +49,9 @@ public: protected: b6000_cpu_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, int prgwidth, address_map_constructor program, int datawidth, address_map_constructor data); + // device_disasm_interface overrides + virtual std::unique_ptr create_disassembler() override; + // device-level overrides virtual void device_reset() override; diff --git a/src/devices/cpu/rw5000/b6100.cpp b/src/devices/cpu/rw5000/b6100.cpp index 31355beb6c7..3e20964c3e3 100644 --- a/src/devices/cpu/rw5000/b6100.cpp +++ b/src/devices/cpu/rw5000/b6100.cpp @@ -44,7 +44,7 @@ void b6100_cpu_device::data_48x4(address_map &map) // disasm std::unique_ptr b6100_cpu_device::create_disassembler() { - return std::make_unique(); + return std::make_unique(); } diff --git a/src/devices/cpu/rw5000/rw5000d.cpp b/src/devices/cpu/rw5000/rw5000d.cpp index fe7c78d7953..ae9612887fe 100644 --- a/src/devices/cpu/rw5000/rw5000d.cpp +++ b/src/devices/cpu/rw5000/rw5000d.cpp @@ -138,7 +138,39 @@ offs_t rw5000_common_disassembler::common_disasm(const u8 *lut_opmap, std::ostre } -// B5000/B6000 disasm (for A5xxx, the only difference is ATBZ = MTD) +// A5000/A5900 disasm + +const u8 a5000_disassembler::a5000_opmap[0x100] = +{ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + em_NOP, em_TC, 0, em_TKB, em_TDIN, em_TDIN, em_TDIN, em_TDIN, em_TM, em_TM, em_TM, em_TM, 0, 0, 0, 0, // 0 + em_SM, em_SM, em_SM, em_SM, em_RSM, em_RSM, em_RSM, em_RSM, em_RET, em_RET, em_RET, em_RET, 0, 0, 0, 0, // 1 + em_LB7, em_LB7, em_LB7, em_LB7, em_LB10, em_LB10, em_LB10, em_LB10, em_LB9, em_LB9, em_LB9, em_LB9, em_LB8, em_LB8, em_LB8, em_LB8, // 2 + em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, 0, em_RSC, 0, em_SC, em_LB0, em_LB0, em_LB0, em_LB0, // 3 + + em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, // 4 + em_LDA, em_LDA, em_LDA, em_LDA, em_EXCP, em_EXCP, em_EXCP, em_EXCP, em_EXC0, em_EXC0, em_EXC0, em_EXC0, em_EXCM, em_EXCM, em_EXCM, em_EXCM, // 5 + em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_READ, // 6 + em_ADD, em_ADD, em_ADD, em_ADD, em_KSEG, 0, em_MTD, em_ATB, em_COMP, em_COMP, em_COMP, em_COMP, em_TAM, em_TAM, em_TAM, em_TAM, // 7 + + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // 8 + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // 9 + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // A + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // B + + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // C + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // D + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // E + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // F +}; + +offs_t a5000_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) +{ + return common_disasm(a5000_opmap, stream, pc, opcodes, params); +} + + +// B5000 disasm (A5000 + TKBS added, MTD removed) const u8 b5000_disassembler::b5000_opmap[0x100] = { @@ -151,7 +183,7 @@ const u8 b5000_disassembler::b5000_opmap[0x100] = em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, // 4 em_LDA, em_LDA, em_LDA, em_LDA, em_EXCP, em_EXCP, em_EXCP, em_EXCP, em_EXC0, em_EXC0, em_EXC0, em_EXC0, em_EXCM, em_EXCM, em_EXCM, em_EXCM, // 5 em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_READ, // 6 - em_ADD, em_ADD, em_ADD, em_ADD, em_KSEG, 0, em_ATBZ, em_ATB, em_COMP, em_COMP, em_COMP, em_COMP, em_TAM, em_TAM, em_TAM, em_TAM, // 7 + em_ADD, em_ADD, em_ADD, em_ADD, em_KSEG, 0, 0, em_ATB, em_COMP, em_COMP, em_COMP, em_COMP, em_TAM, em_TAM, em_TAM, em_TAM, // 7 em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // 8 em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // 9 @@ -170,9 +202,41 @@ offs_t b5000_disassembler::disassemble(std::ostream &stream, offs_t pc, const da } -// B5500/B6100 disasm (for A5xxx, the only difference is ATBZ = MTD) +// B6000 disasm (B5000 + ATBZ added) + +const u8 b6000_disassembler::b6000_opmap[0x100] = +{ +/* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ + em_NOP, em_TC, em_TKB, em_TKBS, em_TDIN, em_TDIN, em_TDIN, em_TDIN, em_TM, em_TM, em_TM, em_TM, 0, 0, 0, 0, // 0 + em_SM, em_SM, em_SM, em_SM, em_RSM, em_RSM, em_RSM, em_RSM, em_RET, em_RET, em_RET, em_RET, 0, 0, 0, 0, // 1 + em_LB7, em_LB7, em_LB7, em_LB7, em_LB10, em_LB10, em_LB10, em_LB10, em_LB9, em_LB9, em_LB9, em_LB9, em_LB8, em_LB8, em_LB8, em_LB8, // 2 + em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, em_TL, 0, em_RSC, 0, em_SC, em_LB0, em_LB0, em_LB0, em_LB0, // 3 + + em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, em_LAX, // 4 + em_LDA, em_LDA, em_LDA, em_LDA, em_EXCP, em_EXCP, em_EXCP, em_EXCP, em_EXC0, em_EXC0, em_EXC0, em_EXC0, em_EXCM, em_EXCM, em_EXCM, em_EXCM, // 5 + em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_ADX, em_READ, // 6 + em_ADD, em_ADD, em_ADD, em_ADD, em_KSEG, 0, em_ATBZ, em_ATB, em_COMP, em_COMP, em_COMP, em_COMP, em_TAM, em_TAM, em_TAM, em_TAM, // 7 + + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // 8 + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // 9 + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // A + em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, em_TRA0, // B + + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // C + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // D + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // E + em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // F +}; + +offs_t b6000_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) +{ + return common_disasm(b6000_opmap, stream, pc, opcodes, params); +} + + +// B6100 disasm -const u8 b5500_disassembler::b5500_opmap[0x100] = +const u8 b6100_disassembler::b6100_opmap[0x100] = { /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ em_NOP, em_TC, em_TKB, em_TKBS, em_TDIN, em_TDIN, em_TDIN, em_TDIN, em_TM, em_TM, em_TM, em_TM, em_SC, em_RSC, 0, 0, // 0 @@ -196,7 +260,7 @@ const u8 b5500_disassembler::b5500_opmap[0x100] = em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, em_TRA1, // F }; -offs_t b5500_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) +offs_t b6100_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) { - return common_disasm(b5500_opmap, stream, pc, opcodes, params); + return common_disasm(b6100_opmap, stream, pc, opcodes, params); } diff --git a/src/devices/cpu/rw5000/rw5000d.h b/src/devices/cpu/rw5000/rw5000d.h index 2aad855e387..24aacb5d032 100644 --- a/src/devices/cpu/rw5000/rw5000d.h +++ b/src/devices/cpu/rw5000/rw5000d.h @@ -49,6 +49,18 @@ protected: offs_t common_disasm(const u8 *lut_opmap, std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms); }; +class a5000_disassembler : public rw5000_common_disassembler +{ +public: + a5000_disassembler() = default; + virtual ~a5000_disassembler() = default; + + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; + +private: + static const u8 a5000_opmap[0x100]; +}; + class b5000_disassembler : public rw5000_common_disassembler { public: @@ -59,20 +71,30 @@ public: private: static const u8 b5000_opmap[0x100]; - }; -class b5500_disassembler : public rw5000_common_disassembler +class b6000_disassembler : public rw5000_common_disassembler { public: - b5500_disassembler() = default; - virtual ~b5500_disassembler() = default; + b6000_disassembler() = default; + virtual ~b6000_disassembler() = default; virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; private: - static const u8 b5500_opmap[0x100]; + static const u8 b6000_opmap[0x100]; +}; + +class b6100_disassembler : public rw5000_common_disassembler +{ +public: + b6100_disassembler() = default; + virtual ~b6100_disassembler() = default; + + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; +private: + static const u8 b6100_opmap[0x100]; }; #endif // MAME_CPU_RW5000_RW5000D_H diff --git a/src/tools/unidasm.cpp b/src/tools/unidasm.cpp index 271a1c13799..678c56bb856 100644 --- a/src/tools/unidasm.cpp +++ b/src/tools/unidasm.cpp @@ -376,6 +376,7 @@ static const dasm_table_entry dasm_table[] = { "alpha_unix", le, 0, []() -> util::disasm_interface * { return new alpha_disassembler(alpha_disassembler::TYPE_UNIX); } }, { "alpha_vms", le, 0, []() -> util::disasm_interface * { return new alpha_disassembler(alpha_disassembler::TYPE_VMS); } }, { "alto2", be, -2, []() -> util::disasm_interface * { return new alto2_disassembler; } }, + { "a5000", le, 0, []() -> util::disasm_interface * { return new a5000_disassembler; } }, { "am29000", be, 0, []() -> util::disasm_interface * { return new am29000_disassembler; } }, { "amis2000", le, 0, []() -> util::disasm_interface * { return new amis2000_disassembler; } }, { "apexc", be, 0, []() -> util::disasm_interface * { return new apexc_disassembler; } }, @@ -392,7 +393,8 @@ static const dasm_table_entry dasm_table[] = { "axc51core", le, 0, []() -> util::disasm_interface * { return new axc51core_disassembler; } }, { "axc208", le, 0, []() -> util::disasm_interface * { return new ax208_disassembler; } }, { "b5000", le, 0, []() -> util::disasm_interface * { return new b5000_disassembler; } }, - { "b5500", le, 0, []() -> util::disasm_interface * { return new b5500_disassembler; } }, + { "b6000", le, 0, []() -> util::disasm_interface * { return new b6000_disassembler; } }, + { "b6100", le, 0, []() -> util::disasm_interface * { return new b6100_disassembler; } }, { "capricorn", le, 0, []() -> util::disasm_interface * { return new capricorn_disassembler; } }, { "ccpu", le, 0, []() -> util::disasm_interface * { return new ccpu_disassembler; } }, { "cdp1801", le, 0, []() -> util::disasm_interface * { return new cosmac_disassembler(cosmac_disassembler::TYPE_1801); } }, -- cgit v1.2.3