summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2022-03-29 00:19:57 +0200
committer hap <happppp@users.noreply.github.com>2022-03-29 00:19:57 +0200
commitd6ae8ec92175ae8b822a4d2dfcffda432ac6a211 (patch)
tree755d8db7398ed4405e020dff426ed5523ad9d562
parenteb7bfe84507d9a80bc9ab7b276d346ac1465cf1b (diff)
rw5000: separate b6000 disasm from b5000, add a5000 disasm
-rw-r--r--src/devices/cpu/rw5000/b6000.cpp9
-rw-r--r--src/devices/cpu/rw5000/b6000.h3
-rw-r--r--src/devices/cpu/rw5000/b6100.cpp2
-rw-r--r--src/devices/cpu/rw5000/rw5000d.cpp76
-rw-r--r--src/devices/cpu/rw5000/rw5000d.h32
-rw-r--r--src/tools/unidasm.cpp4
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<util::disasm_interface> b6000_cpu_device::create_disassembler()
+{
+ return std::make_unique<b6000_disassembler>();
+}
+
+
// 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<util::disasm_interface> 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<util::disasm_interface> b6100_cpu_device::create_disassembler()
{
- return std::make_unique<b5500_disassembler>();
+ return std::make_unique<b6100_disassembler>();
}
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 &params)
+{
+ 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 &params)
+{
+ 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 &params)
+offs_t b6100_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
- 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 &params);
};
+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 &params) 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 &params) 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 &params) 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); } },