summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/upd78k/upd78k4d.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/upd78k/upd78k4d.cpp')
-rw-r--r--src/devices/cpu/upd78k/upd78k4d.cpp1408
1 files changed, 1408 insertions, 0 deletions
diff --git a/src/devices/cpu/upd78k/upd78k4d.cpp b/src/devices/cpu/upd78k/upd78k4d.cpp
new file mode 100644
index 00000000000..9ac9ce998be
--- /dev/null
+++ b/src/devices/cpu/upd78k/upd78k4d.cpp
@@ -0,0 +1,1408 @@
+// license:BSD-3-Clause
+// copyright-holders:AJR
+
+#include "emu.h"
+#include "upd78k4d.h"
+
+upd78k4_disassembler::upd78k4_disassembler(const char *const sfr_names[], const char *const sfrp_names[])
+ : upd78k3_disassembler(sfr_names, sfrp_names, s_ix_bases, 0xfd00)
+{
+}
+
+const char *const upd78k4_disassembler::s_ix_bases[5] =
+{
+ "TDE",
+ "SP",
+ "WHL",
+ "UUP",
+ "VVP"
+};
+
+const char *const upd78k4_disassembler::s_imm24_offsets[4] =
+{
+ "DE",
+ "A",
+ "HL",
+ "B"
+};
+
+const char *const upd78k4_disassembler::s_rg_names[4] =
+{
+ "VVP", // RG4
+ "UUP", // RG5
+ "TDE", // RG6
+ "WHL" // RG7
+};
+
+
+void upd78k4_disassembler::format_imm24(std::ostream &stream, u32 d)
+{
+ if (d < 0xa00000)
+ util::stream_format(stream, "#%06XH", d);
+ else
+ util::stream_format(stream, "#0%06XH", d);
+}
+
+void upd78k4_disassembler::format_abs20(std::ostream &stream, u32 addr)
+{
+ if (addr < 0xa0000)
+ util::stream_format(stream, "!!%05XH", addr);
+ else
+ util::stream_format(stream, "!!0%05XH", addr);
+}
+
+void upd78k4_disassembler::format_abs24(std::ostream &stream, u32 addr)
+{
+ if (addr < 0xa00000)
+ util::stream_format(stream, "!!%06XH", addr);
+ else
+ util::stream_format(stream, "!!0%06XH", addr);
+}
+
+void upd78k4_disassembler::format_saddr1(std::ostream &stream, u8 addr)
+{
+ util::stream_format(stream, "0%04XH", 0xfe00 + addr);
+}
+
+void upd78k4_disassembler::format_saddrp1(std::ostream &stream, u8 addr)
+{
+ util::stream_format(stream, "0%04XH", 0xfe00 + addr);
+}
+
+void upd78k4_disassembler::format_saddrg1(std::ostream &stream, u8 addr)
+{
+ util::stream_format(stream, "0%04XH", 0xfe00 + addr);
+}
+
+void upd78k4_disassembler::format_saddrg2(std::ostream &stream, u8 addr)
+{
+ util::stream_format(stream, "0%04XH", (addr < 0x20 ? 0xff00 : 0xfd00) + addr);
+}
+
+void upd78k4_disassembler::format_jdisp8(std::ostream &stream, offs_t pc, u8 disp)
+{
+ u32 addr = (pc + s8(disp)) & 0xfffff;
+ if (addr < 0xa0000)
+ util::stream_format(stream, "$%05XH", addr);
+ else
+ util::stream_format(stream, "$0%05XH", addr);
+}
+
+void upd78k4_disassembler::format_jdisp16(std::ostream &stream, offs_t pc, u16 disp)
+{
+ u32 addr = (pc + s16(disp)) & 0xfffff;
+ if (addr < 0xa0000)
+ util::stream_format(stream, "$!%05XH", addr);
+ else
+ util::stream_format(stream, "$!0%05XH", addr);
+}
+
+
+offs_t upd78k4_disassembler::dasm_05xx(std::ostream &stream, u8 op2)
+{
+ if ((op2 & 0xc9) == 0x41)
+ {
+ util::stream_format(stream, "%-8s", BIT(op2, 4) ? "CALL" : "BR");
+ if (BIT(op2, 5))
+ util::stream_format(stream, "[%s]", s_rg_names[BIT(op2, 1, 2)]);
+ else
+ stream << s_rg_names[BIT(op2, 1, 2)];
+ return 2 | (BIT(op2, 4) ? STEP_OVER : 0) | SUPPORTED;
+ }
+ else if ((op2 & 0xf1) == 0xc1)
+ {
+ util::stream_format(stream, "%-8s", "MOV");
+ if (!BIT(op2, 3))
+ stream << "A,";
+ stream << s_rg_names[BIT(op2, 1, 2)][0];
+ if (BIT(op2, 3))
+ stream << ",A";
+ return 2 | SUPPORTED;
+ }
+ else if ((op2 & 0xfe) == 0xf8)
+ {
+ util::stream_format(stream, "%-8sSP", BIT(op2, 0) ? "DECG" : "INCG");
+ return 2 | SUPPORTED;
+ }
+ else if ((op2 & 0xfe) == 0xfa)
+ {
+ util::stream_format(stream, "%-8s%s", "MOVG", BIT(op2, 0) ? "WHL,SP" : "SP,WHL");
+ return 2 | SUPPORTED;
+ }
+ else if (op2 == 0xfc)
+ {
+ stream << "SWRS";
+ return 2 | SUPPORTED;
+ }
+ else
+ return upd78k3_disassembler::dasm_05xx(stream, op2);
+}
+
+offs_t upd78k4_disassembler::dasm_06xx(std::ostream &stream, u8 op2, offs_t pc, const upd78k4_disassembler::data_buffer &opcodes)
+{
+ if ((op2 & 0x70) < 0x50 && (op2 & 0x0f) == 0x02)
+ {
+ util::stream_format(stream, "%-8s", "MOVG");
+ if (!BIT(op2, 7))
+ stream << "WHL,";
+ if (BIT(op2, 7))
+ stream << ",WHL";
+ format_ix_disp8(stream, s_ix_bases[(op2 & 0x70) >> 4], opcodes.r8(pc + 2));
+ return 3 | SUPPORTED;
+ }
+ else
+ return upd78k3_disassembler::dasm_06xx(stream, op2, pc, opcodes);
+}
+
+offs_t upd78k4_disassembler::dasm_07xx(std::ostream &stream, u8 op2, offs_t pc, const upd78k4_disassembler::data_buffer &opcodes)
+{
+ if ((op2 & 0x68) == 0x28 || ((op2 & 0x7b) == 0x30 && op2 != 0xb4))
+ {
+ util::stream_format(stream, "%-8s", s_alu_ops[op2 & 0x07]);
+ if (!BIT(op2, 7))
+ stream << "A,";
+ stream << "[";
+ if (BIT(op2, 4))
+ {
+ stream << "%";
+ format_saddrg2(stream, opcodes.r8(pc + 2));
+ }
+ else
+ format_saddrp(stream, opcodes.r8(pc + 2));
+ stream << "]";
+ if (BIT(op2, 7))
+ stream << ",A";
+ return 3 | SUPPORTED;
+ }
+ else if ((op2 & 0x6b) == 0x21 && (op2 & 0x84) != 0x84)
+ {
+ util::stream_format(stream, "%-8s", BIT(op2, 2) ? "XCHW" : "MOVW");
+ if (!BIT(op2, 7))
+ stream << "AX,";
+ stream << "[";
+ if (BIT(op2, 4))
+ {
+ stream << "%";
+ format_saddrg2(stream, opcodes.r8(pc + 2));
+ }
+ else
+ format_saddrp(stream, opcodes.r8(pc + 2));
+ stream << "]";
+ if (BIT(op2, 7))
+ stream << ",AX";
+ return 3 | SUPPORTED;
+ }
+ else if ((op2 & 0x7f) == 0x32)
+ {
+ util::stream_format(stream, "%-8s", "MOVG");
+ if (!BIT(op2, 7))
+ stream << "WHL,";
+ stream << "[%";
+ format_saddrg2(stream, opcodes.r8(pc + 2));
+ stream << "]";
+ if (BIT(op2, 7))
+ stream << ",WHL";
+ return 3 | SUPPORTED;
+ }
+ else if ((op2 & 0xf9) == 0x61)
+ {
+ util::stream_format(stream, "%-8s%c,", "MOV", s_rg_names[BIT(op2, 1, 2)][0]);
+ format_imm8(stream, opcodes.r8(pc + 2));
+ return 3 | SUPPORTED;
+ }
+ else if ((op2 & 0xfe) == 0xda)
+ {
+ util::stream_format(stream, "%-8s", BIT(op2, 0) ? "PUSH" : "POP");
+ format_sfr(stream, opcodes.r8(pc + 2));
+ return 3 | SUPPORTED;
+ }
+ else if (op2 == 0x95)
+ {
+ util::stream_format(stream, "%-8s", "MACSW");
+ format_count(stream, opcodes.r8(pc + 2));
+ return 3 | SUPPORTED;
+ }
+ else
+ return upd78k3_disassembler::dasm_07xx(stream, op2, pc, opcodes);
+}
+
+offs_t upd78k4_disassembler::dasm_09xx(std::ostream &stream, u8 op2, offs_t pc, const upd78k4_disassembler::data_buffer &opcodes)
+{
+ if (op2 == 0x20)
+ {
+ util::stream_format(stream, "%-8sSP,", "MOVG");
+ format_imm24(stream, u32(opcodes.r8(pc + 4)) << 16 | opcodes.r16(pc + 2));
+ return 5 | SUPPORTED;
+ }
+ else if ((op2 & 0xfe) == 0x28)
+ {
+ util::stream_format(stream, "%-8sSP,", BIT(op2, 0) ? "SUBWG" : "ADDWG");
+ format_imm16(stream, opcodes.r16(pc + 2));
+ return 4 | SUPPORTED;
+ }
+ else if ((op2 & 0xee) == 0x40)
+ {
+ util::stream_format(stream, "%-8s", BIT(op2, 0) ? "MOVW" : "MOV");
+ if (BIT(op2, 4))
+ {
+ format_abs24(stream, u32(opcodes.r8(pc + 2)) << 16 | opcodes.r16(pc + 3));
+ stream << ",";
+ if (BIT(op2, 0))
+ {
+ format_imm16(stream, opcodes.r16(pc + 5));
+ return 7 | SUPPORTED;
+ }
+ else
+ {
+ format_imm8(stream, opcodes.r8(pc + 5));
+ return 6 | SUPPORTED;
+ }
+ }
+ else
+ {
+ format_abs16(stream, opcodes.r16(pc + 2));
+ stream << ",";
+ if (BIT(op2, 0))
+ {
+ format_imm16(stream, opcodes.r16(pc + 4));
+ return 6 | SUPPORTED;
+ }
+ else
+ {
+ format_imm8(stream, opcodes.r8(pc + 4));
+ return 5 | SUPPORTED;
+ }
+ }
+ }
+ else if (op2 == 0x64)
+ {
+ util::stream_format(stream, "%-8s", "SACW");
+ u8 post1 = opcodes.r8(pc + 2);
+ u8 post2 = opcodes.r8(pc + 3);
+ if (post1 == 0x41 && post2 == 0x46)
+ util::stream_format(stream, "[%s+],[%s+]", s_ix_bases[0], s_ix_bases[2]);
+ else
+ stream << "invalid";
+ return 4 | SUPPORTED;
+ }
+ else if ((op2 & 0xe9) == 0x89)
+ {
+ util::stream_format(stream, "%-8s%s", BIT(op2, 4) ? "POP" : "PUSH", s_rg_names[BIT(op2, 1, 2)]);
+ return 2 | SUPPORTED;
+ }
+ else if (op2 == 0xb0)
+ {
+ util::stream_format(stream, "%-8s", "RETCSB");
+ format_abs16(stream, opcodes.r16(pc + 2));
+ return 4 | SUPPORTED;
+ }
+ else if (op2 == 0xc1)
+ {
+ util::stream_format(stream, "%-8s ", "LOCATION");
+ u16 w = opcodes.r16(pc + 2);
+ if (w == 0x01fe)
+ stream << "0H";
+ else if (w == 0x00ff)
+ stream << "0FH";
+ else
+ stream << "invalid";
+ return 4 | SUPPORTED;
+ }
+ else if (op2 == 0xd0)
+ {
+ u8 op3 = opcodes.r8(pc + 2);
+ if ((op3 & 0xf0) == 0x10)
+ {
+ util::stream_format(stream, "%-8s", "MOV1");
+ if (BIT(op3, 3))
+ format_abs24(stream, u32(opcodes.r8(pc + 3)) << 16 | opcodes.r16(pc + 4));
+ else
+ format_abs16(stream, opcodes.r16(pc + 3));
+ util::stream_format(stream, ".%d,CY", op3 & 0x07);
+ return (BIT(op3, 3) ? 6 : 5) | SUPPORTED;
+ }
+ else if (op3 < 0x70)
+ {
+ util::stream_format(stream, "%-8sCY,", s_bool_ops[BIT(op3, 5, 2)]);
+ if (BIT(op3, 4))
+ stream << "/";
+ if (BIT(op3, 3))
+ format_abs24(stream, u32(opcodes.r8(pc + 3)) << 16 | opcodes.r16(pc + 4));
+ else
+ format_abs16(stream, opcodes.r16(pc + 3));
+ util::stream_format(stream, ".%d", op3 & 0x07);
+ return (BIT(op3, 3) ? 6 : 5) | SUPPORTED;
+ }
+ else if (op3 < 0xa0)
+ {
+ util::stream_format(stream, "%-8s", op3 < 0x80 ? "NOT1" : BIT(op3, 4) ? "CLR1" : "SET1");
+ if (BIT(op3, 3))
+ format_abs24(stream, u32(opcodes.r8(pc + 3)) << 16 | opcodes.r16(pc + 4));
+ else
+ format_abs16(stream, opcodes.r16(pc + 3));
+ util::stream_format(stream, ".%d", op3 & 0x07);
+ return (BIT(op3, 3) ? 6 : 5) | SUPPORTED;
+ }
+ else if (op3 < 0xe0)
+ {
+ if (BIT(op3, 6))
+ util::stream_format(stream, "%-8s", BIT(op3, 4) ? "BTCLR" : "BFSET");
+ else
+ util::stream_format(stream, "%-8s", BIT(op3, 4) ? "BT" : "BF");
+ if (BIT(op3, 3))
+ {
+ format_abs24(stream, u32(opcodes.r8(pc + 3)) << 16 | opcodes.r16(pc + 4));
+ util::stream_format(stream, ".%d,", op3 & 0x07);
+ format_jdisp8(stream, pc + 7, opcodes.r8(pc + 6));
+ return 7 | SUPPORTED;
+ }
+ else
+ {
+ format_abs16(stream, opcodes.r16(pc + 3));
+ util::stream_format(stream, ".%d,", op3 & 0x07);
+ format_jdisp8(stream, pc + 6, opcodes.r8(pc + 5));
+ return 6 | SUPPORTED;
+ }
+ }
+ else
+ return dasm_illegal3(stream, 0x09, 0xd0, op3);
+ }
+ else if (op2 >= 0xe0)
+ {
+ util::stream_format(stream, "%-8s", op2 >= 0xf0 ? "CALL" : "BR");
+ format_abs20(stream, u32(op2 & 0x0f) << 16 | opcodes.r16(pc + 2));
+ return 4 | (op2 >= 0xf0 ? STEP_OVER : 0) | SUPPORTED;
+ }
+ else
+ return upd78k3_disassembler::dasm_09xx(stream, op2, pc, opcodes);
+}
+
+offs_t upd78k4_disassembler::dasm_0axx(std::ostream &stream, u8 op2, offs_t pc, const upd78k4_disassembler::data_buffer &opcodes)
+{
+ if (!BIT(op2, 6) && (BIT(op2, 3) || (op2 & (BIT(op2, 7) ? 0x06 : 0x02)) == 0x00 || (op2 & 0x0f) == 0x02))
+ {
+ if (BIT(op2, 3))
+ util::stream_format(stream, "%-8s", s_alu_ops[op2 & 0x07]);
+ else if ((op2 & 0x0f) == 0x02)
+ util::stream_format(stream, "%-8s", "MOVG");
+ else if (BIT(op2, 0))
+ util::stream_format(stream, "%-8s", BIT(op2, 2) ? "XCHW" : "MOVW");
+ else
+ util::stream_format(stream, "%-8s", BIT(op2, 2) ? "XCH" : "MOV");
+ if ((op2 & 0x8b) == 0x01)
+ stream << "AX,";
+ else if ((op2 & 0x8b) == 0x02)
+ stream << "WHL,";
+ else if (!BIT(op2, 7))
+ stream << "A,";
+
+ u32 imm24 = u32(opcodes.r8(pc + 4)) << 16 | opcodes.r16(pc + 2);
+ if (imm24 >= 0xa00000)
+ stream << "0";
+ util::stream_format(stream, "%06XH[%s]", imm24, s_imm24_offsets[BIT(op2, 4, 2)]);
+
+ if ((op2 & 0x8b) == 0x81)
+ stream << ",AX";
+ else if ((op2 & 0x8b) == 0x82)
+ stream << ",WHL";
+ else if (BIT(op2, 7))
+ stream << ",A";
+ return 5 | SUPPORTED;
+ }
+ else if ((op2 & 0x68) == 0x48)
+ {
+ util::stream_format(stream, "%-8s", s_alu_ops[op2 & 0x07]);
+ if (!BIT(op2, 7))
+ stream << "A,";
+ if (BIT(op2, 4))
+ format_abs24(stream, u32(opcodes.r8(pc + 4)) << 16 | opcodes.r16(pc + 2));
+ else
+ format_abs16(stream, opcodes.r16(pc + 2));
+ if (BIT(op2, 7))
+ stream << ",A";
+ return (BIT(op2, 4) ? 5 : 4) | SUPPORTED;
+ }
+ else if ((op2 & 0xef) == 0x45)
+ {
+ util::stream_format(stream, "%-8sAX,", "XCHW");
+ if (BIT(op2, 4))
+ {
+ format_abs24(stream, u32(opcodes.r8(pc + 4)) << 16 | opcodes.r16(pc + 2));
+ return 5 | SUPPORTED;
+ }
+ else
+ {
+ format_abs16(stream, opcodes.r16(pc + 2));
+ return 4 | SUPPORTED;
+ }
+ }
+ else
+ return dasm_illegal2(stream, 0x0a, op2);
+}
+
+offs_t upd78k4_disassembler::dasm_16xx(std::ostream &stream, u8 op1, u8 op2)
+{
+ if (BIT(op1, 0) && (op2 & 0x60) == 0x60 && (BIT(op2, 3) || (op2 & (BIT(op2, 7) ? 0x06 : 0x02)) == 0x00))
+ {
+ if (BIT(op2, 3))
+ util::stream_format(stream, "%-8s", s_alu_ops[op2 & 0x07]);
+ else if (BIT(op2, 0))
+ util::stream_format(stream, "%-8s", BIT(op2, 2) ? "XCHW" : "MOVW");
+ else
+ util::stream_format(stream, "%-8s", BIT(op2, 2) ? "XCH" : "MOV");
+ if ((op2 & 0x8b) == 0x01)
+ stream << "AX,";
+ else if (!BIT(op2, 7))
+ stream << "A,";
+ util::stream_format(stream, "[%s+C]", m_ix_bases[(op2 & 0x10) >> 3]);
+ if ((op2 & 0x8b) == 0x81)
+ stream << ",AX";
+ else if (BIT(op2, 7))
+ stream << ",A";
+ return 2 | SUPPORTED;
+ }
+ else if ((op2 & 0x0f) == 0x02 && (BIT(op1, 0) || (op2 & 0xd0) != 0x10))
+ {
+ util::stream_format(stream, "%-8s", "MOVG");
+ if (!BIT(op2, 7))
+ stream << "WHL,";
+ stream << "[";
+ if (BIT(op1, 0) && (op2 & 0x60) == 0x40)
+ util::stream_format(stream, "%s+%s", s_ix_bases[4], BIT(op2, 4) ? "HL" : "DE");
+ else if ((op2 & 0x60) == 0x60)
+ stream << s_ix_bases[BIT(op2, 4) ? 3 : 4];
+ else
+ {
+ stream << s_ix_bases[(op2 & 0x10) >> 3];
+ if (BIT(op1, 0))
+ util::stream_format(stream, "+%c", BIT(op2, 6) ? 'C' : BIT(op2, 5) ? 'B' : 'A');
+ else
+ stream << (BIT(op2, 5) ? "-" : "+");
+ }
+ stream << "]";
+ if (BIT(op2, 7))
+ stream << ",WHL";
+ return 2 | SUPPORTED;
+ }
+ else
+ return upd78k3_disassembler::dasm_16xx(stream, op1, op2);
+}
+
+offs_t upd78k4_disassembler::dasm_24xx(std::ostream &stream, u8 op, u8 rr)
+{
+ if (!BIT(op, 0) && (rr & 0x99) == 0x99)
+ {
+ util::stream_format(stream, "%-8s%s,%s", "MOVG", s_rg_names[BIT(rr, 5, 2)], s_rg_names[BIT(rr, 1, 2)]);
+ return 2 | SUPPORTED;
+ }
+ else
+ return upd78k3_disassembler::dasm_24xx(stream, op, rr);
+}
+
+offs_t upd78k4_disassembler::dasm_2a(std::ostream &stream, offs_t pc, const upd78k4_disassembler::data_buffer &opcodes)
+{
+ u8 op2 = opcodes.r8(pc + 1);
+ if ((op2 & 0xc0) == 0 && (BIT(op2, 3) || (op2 & 0x03) == 0))
+ {
+ if (BIT(op2, 3))
+ util::stream_format(stream, "%-8s", s_alu_ops[op2 & 0x07]);
+ else
+ util::stream_format(stream, "%-8s", BIT(op2, 2) ? "XCH" : "MOV");
+ if (BIT(op2, 5))
+ format_saddr1(stream, opcodes.r8(pc + 3));
+ else
+ format_saddr(stream, opcodes.r8(pc + 3));
+ stream << ",";
+ if (BIT(op2, 4))
+ format_saddr1(stream, opcodes.r8(pc + 2));
+ else
+ format_saddr(stream, opcodes.r8(pc + 2));
+ return 4 | SUPPORTED;
+ }
+ else
+ return dasm_illegal2(stream, 0x2a, op2);
+}
+
+offs_t upd78k4_disassembler::dasm_38(std::ostream &stream, u8 op, offs_t pc, const upd78k4_disassembler::data_buffer &opcodes)
+{
+ u8 op2 = opcodes.r8(pc + 1);
+ if (!BIT(op2, 3) && (op2 & 0x03) != 0x03 && (!BIT(op, 0) || !BIT(op2, 2)))
+ {
+ util::stream_format(stream, "%-8s", BIT(op2, 2) ? "XCH" : "MOV");
+ if (!BIT(op2, 2))
+ util::stream_format(stream, "%s,", s_r_names[BIT(op2, 4, 4)]);
+ if (BIT(op2, 1))
+ format_sfr(stream, opcodes.r8(pc + 2));
+ else if (BIT(op2, 0))
+ format_saddr1(stream, opcodes.r8(pc + 2));
+ else
+ format_saddr(stream, opcodes.r8(pc + 2));
+ if (BIT(op2, 2))
+ util::stream_format(stream, ",%s", s_r_names[BIT(op2, 4, 4)]);
+ return 3 | SUPPORTED;
+ }
+ else if ((op2 & 0x18) == 0x08 && (op2 & 0x03) != 0x03 && (!BIT(op, 0) || !BIT(op2, 2)))
+ {
+ util::stream_format(stream, "%-8s", BIT(op2, 2) ? "XCHW" : "MOVW");
+ if (!BIT(op2, 2))
+ util::stream_format(stream, "%s,", s_rp_names[BIT(op2, 5, 3)]);
+ if (BIT(op2, 1))
+ format_sfrp(stream, opcodes.r8(pc + 2));
+ else if (BIT(op2, 0))
+ format_saddrp1(stream, opcodes.r8(pc + 2));
+ else
+ format_saddrp(stream, opcodes.r8(pc + 2));
+ if (BIT(op2, 2))
+ util::stream_format(stream, ",%s", s_rp_names[BIT(op2, 5, 3)]);
+ return 3 | SUPPORTED;
+ }
+ else if (!BIT(op, 0) && (op2 & 0x9a) == 0x98)
+ {
+ util::stream_format(stream, "%-8s", "MOVG");
+ if (!BIT(op2, 2))
+ util::stream_format(stream, "%s,", s_rg_names[BIT(op2, 5, 2)]);
+ if (BIT(op2, 0))
+ format_saddrg1(stream, opcodes.r8(pc + 2));
+ else
+ format_saddrg2(stream, opcodes.r8(pc + 2));
+ if (BIT(op2, 2))
+ util::stream_format(stream, ",%s", s_rg_names[BIT(op2, 5, 2)]);
+ return 3 | SUPPORTED;
+ }
+ else if (!BIT(op, 0) && (op2 & 0x9f) == 0x9b)
+ {
+ util::stream_format(stream, "%-8s%s,", "MOVG", s_rg_names[BIT(op2, 5, 2)]);
+ format_imm24(stream, u32(opcodes.r8(pc + 4)) << 16 | opcodes.r16(pc + 2));
+ return 5 | SUPPORTED;
+ }
+ else
+ return dasm_illegal2(stream, op, op2);
+}
+
+offs_t upd78k4_disassembler::dasm_3c(std::ostream &stream, u8 op, offs_t pc, const upd78k4_disassembler::data_buffer &opcodes)
+{
+ if (op == 0x3f)
+ {
+ util::stream_format(stream, "%-8s", "CALL");
+ format_jdisp16(stream, pc, opcodes.r16(pc + 1));
+ return 3 | STEP_OVER | SUPPORTED;
+ }
+ else
+ {
+ u8 op2 = opcodes.r8(pc + 1);
+ if (op == 0x3e)
+ {
+ if ((op2 & 0x0d) < 0x05)
+ {
+ util::stream_format(stream, "%-8s", BIT(op2, 2) ? "XCH" : "MOV");
+ if (!BIT(op2, 0))
+ util::stream_format(stream, "%s,", s_r_names[BIT(op2, 4, 4)]);
+ if (BIT(op2, 1))
+ format_abs24(stream, u32(opcodes.r8(pc + 2)) << 16 | opcodes.r16(pc + 3));
+ else
+ format_abs16(stream, opcodes.r16(pc + 2));
+ if (BIT(op2, 0))
+ util::stream_format(stream, ",%s", s_r_names[BIT(op2, 4, 4)]);
+ return (BIT(op2, 1) ? 5 : 4) | SUPPORTED;
+ }
+ else if ((op2 & 0x1c) == 0x08)
+ {
+ util::stream_format(stream, "%-8s", "MOVW");
+ if (!BIT(op2, 0))
+ util::stream_format(stream, "%s,", s_rp_names[BIT(op2, 5, 3)]);
+ if (BIT(op2, 1))
+ format_abs24(stream, u32(opcodes.r8(pc + 2)) << 16 | opcodes.r16(pc + 3));
+ else
+ format_abs16(stream, opcodes.r16(pc + 2));
+ if (BIT(op2, 0))
+ util::stream_format(stream, ",%s", s_rp_names[BIT(op2, 5, 3)]);
+ return (BIT(op2, 1) ? 5 : 4) | SUPPORTED;
+ }
+ else if ((op2 & 0x9e) == 0x9a)
+ {
+ util::stream_format(stream, "%-8s", "MOVG");
+ if (!BIT(op2, 0))
+ util::stream_format(stream, "%s,", s_rg_names[BIT(op2, 5, 2)]);
+ format_abs24(stream, u32(opcodes.r8(pc + 2)) << 16 | opcodes.r16(pc + 3));
+ if (BIT(op2, 0))
+ util::stream_format(stream, ",%s", s_rg_names[BIT(op2, 5, 2)]);
+ return 5 | SUPPORTED;
+ }
+ else if ((op2 & 0x9d) == 0x0d)
+ {
+ util::stream_format(stream, "%-8s%s", BIT(op2, 1) ? "DECW" : "INCW", s_rp_names[BIT(op2, 5, 2)]);
+ return 2 | SUPPORTED;
+ }
+ else if ((op2 & 0x9d) == 0x9d)
+ {
+ util::stream_format(stream, "%-8s%s", BIT(op2, 1) ? "DECG" : "INCG", s_rg_names[BIT(op2, 5, 2)]);
+ return 2 | SUPPORTED;
+ }
+ else
+ return dasm_illegal2(stream, 0x3e, op2);
+ }
+ else if (op == 0x3d)
+ {
+ if ((op2 & 0xf0) == 0x10)
+ {
+ util::stream_format(stream, "%-8s[%s].%d,CY", "MOV1", s_rg_names[BIT(op2, 3) ? 3 : 2], op2 & 0x07);
+ return 2 | SUPPORTED;
+ }
+ else if (op2 < 0x70)
+ {
+ util::stream_format(stream, "%-8sCY,", s_bool_ops[BIT(op2, 5, 2)]);
+ if (BIT(op2, 4))
+ stream << "/";
+ util::stream_format(stream, "[%s].%d", s_rg_names[BIT(op2, 3) ? 3 : 2], op2 & 0x07);
+ return 2 | SUPPORTED;
+ }
+ else if (op2 < 0xa0)
+ {
+ util::stream_format(stream, "%-8s", op2 < 0x80 ? "NOT1" : BIT(op2, 4) ? "CLR1" : "SET1");
+ util::stream_format(stream, "[%s].%d", s_rg_names[BIT(op2, 3) ? 3 : 2], op2 & 0x07);
+ return 2 | SUPPORTED;
+ }
+ else if (op2 < 0xe0)
+ {
+ if (BIT(op2, 6))
+ util::stream_format(stream, "%-8s", BIT(op2, 4) ? "BTCLR" : "BFSET");
+ else
+ util::stream_format(stream, "%-8s", BIT(op2, 4) ? "BT" : "BF");
+ util::stream_format(stream, "[%s].%d", s_rg_names[BIT(op2, 3) ? 3 : 2], op2 & 0x07);
+ format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
+ return 3 | STEP_COND | SUPPORTED;
+ }
+ else
+ return dasm_illegal2(stream, 0x3d, op2);
+ }
+ else
+ {
+ if (op2 == 0x05)
+ {
+ u8 op3 = opcodes.r8(pc + 2);
+ if ((op3 & 0xe8) == 0x08)
+ {
+ util::stream_format(stream, "%-8s%s", BIT(op3, 4) ? "DIVUW" : "MULU", s_r_names[op3 & 0x0f]);
+ return 2 | SUPPORTED;
+ }
+ else
+ return dasm_illegal3(stream, 0x3c, 0x05, op3);
+ }
+ else if (op2 == 0x07)
+ {
+ u8 op3 = opcodes.r8(pc + 2);
+ if ((op3 & 0x68) == 0x28 || (op3 & 0x7f) == 0x30 || op3 == 0x34)
+ {
+ util::stream_format(stream, "%-8s", BIT(op3, 3) ? s_alu_ops[op3 & 0x07] : BIT(op3, 2) ? "XCH" : "MOV");
+ if (!BIT(op3, 7))
+ stream << "A,";
+ stream << "[";
+ if (BIT(op3, 4))
+ {
+ stream << "%";
+ format_saddrg1(stream, opcodes.r8(pc + 3));
+ }
+ else
+ format_saddrp1(stream, opcodes.r8(pc + 3));
+ stream << "]";
+ if (BIT(op3, 7))
+ stream << ",A";
+ return 4 | SUPPORTED;
+ }
+ else if ((op3 & 0x6b) == 0x21 && (op3 & 0x84) != 0x84)
+ {
+ util::stream_format(stream, "%-8s", BIT(op3, 2) ? "XCHW" : "MOVW");
+ if (!BIT(op3, 7))
+ stream << "AX,";
+ stream << "[";
+ if (BIT(op3, 4))
+ {
+ stream << "%";
+ format_saddrg1(stream, opcodes.r8(pc + 3));
+ }
+ else
+ format_saddrp1(stream, opcodes.r8(pc + 3));
+ stream << "]";
+ if (BIT(op3, 7))
+ stream << ",AX";
+ return 4 | SUPPORTED;
+ }
+ else if ((op3 & 0x7f) == 0x32)
+ {
+ util::stream_format(stream, "%-8s", "MOVG");
+ if (!BIT(op3, 7))
+ stream << "WHL,";
+ stream << "[%";
+ format_saddrg1(stream, opcodes.r8(pc + 3));
+ stream << "]";
+ if (BIT(op3, 7))
+ stream << ",WHL";
+ return 4 | SUPPORTED;
+ }
+ else if ((op3 & 0xfe) == 0xe8)
+ {
+ util::stream_format(stream, "%-8s", BIT(op3, 0) ? "DECW" : "INCW");
+ format_saddrp1(stream, opcodes.r8(pc + 3));
+ return 4 | SUPPORTED;
+ }
+ else
+ return dasm_illegal3(stream, 0x3c, 0x07, op3);
+ }
+ else if (op2 == 0x08)
+ {
+ u8 op3 = opcodes.r8(pc + 2);
+ if ((op3 & 0xf8) == 0x10)
+ {
+ util::stream_format(stream, "%-8s", "MOV1");
+ format_saddr1(stream, opcodes.r8(pc + 3));
+ util::stream_format(stream, ".%d,CY", op3 & 0x07);
+ return 4 | SUPPORTED;
+ }
+ else if (op3 < 0x70 && !BIT(op3, 3))
+ {
+ util::stream_format(stream, "%-8sCY,", s_bool_ops[BIT(op3, 5, 2)]);
+ if (BIT(op3, 4))
+ stream << "/";
+ format_saddr1(stream, opcodes.r8(pc + 3));
+ util::stream_format(stream, ".%d", op3 & 0x07);
+ return 4 | SUPPORTED;
+ }
+ else if (op3 < 0xa0 && !BIT(op3, 3))
+ {
+ util::stream_format(stream, "%-8s", op3 < 0x80 ? "NOT1" : BIT(op3, 4) ? "CLR1" : "SET1");
+ format_saddr1(stream, opcodes.r8(pc + 3));
+ util::stream_format(stream, ".%d", op3 & 0x07);
+ return 4 | SUPPORTED;
+ }
+ else if (op3 < 0xe0 && !BIT(op3, 3))
+ {
+ if (BIT(op3, 6))
+ util::stream_format(stream, "%-8s", BIT(op3, 4) ? "BTCLR" : "BFSET");
+ else
+ util::stream_format(stream, "%-8s", BIT(op3, 4) ? "BT" : "BF");
+ format_saddr1(stream, opcodes.r8(pc + 3));
+ util::stream_format(stream, ".%d,", op3 & 0x07);
+ format_jdisp8(stream, pc + 5, opcodes.r8(pc + 4));
+ return 5 | STEP_COND | SUPPORTED;
+ }
+ else
+ return dasm_illegal3(stream, 0x3c, 0x08, op3);
+ }
+ else if ((op2 & 0xfc) == 0x0c)
+ {
+ util::stream_format(stream, "%-8s", s_16bit_ops[op2 & 0x03]);
+ format_saddrp1(stream, opcodes.r8(pc + 2));
+ stream << ",";
+ format_imm16(stream, opcodes.r16(pc + 3));
+ return 5 | SUPPORTED;
+ }
+ else if ((op2 & 0xfe) == 0x18)
+ {
+ util::stream_format(stream, "%-8s", "MOV");
+ if (!BIT(op2, 0))
+ stream << "A,";
+ stream << "[";
+ format_saddrp1(stream, opcodes.r8(pc + 2));
+ stream << "]";
+ if (BIT(op2, 0))
+ stream << ",A";
+ return 3 | SUPPORTED;
+ }
+ else if (op2 == 0x23)
+ {
+ util::stream_format(stream, "%-8sA,[", "XCH");
+ format_saddrp1(stream, opcodes.r8(pc + 2));
+ stream << "]";
+ return 3 | SUPPORTED;
+ }
+ else if ((op2 & 0xfe) == 0x24)
+ {
+ u8 rr = opcodes.r8(pc + 2);
+ if (!BIT(rr, 3))
+ {
+ util::stream_format(stream, "%-8s%s,%s", BIT(op2, 0) ? "XCH" : "MOV", s_r_names[BIT(rr, 4, 4)], s_r_names[(rr & 0x07) | 8]);
+ return 3 | SUPPORTED;
+ }
+ else
+ return dasm_illegal3(stream, op, op2, rr);
+ }
+ else if ((op2 & 0xfe) == 0x30)
+ {
+ u8 nr = opcodes.r8(pc + 2);
+ if (nr < 0xc0)
+ {
+ util::stream_format(stream, "%-8s%s,%d", s_shift_ops[BIT(op2, 0)][BIT(nr, 6, 2)], s_r_names[(nr & 0x07) | 8], BIT(nr, 3, 3));
+ return 3 | SUPPORTED;
+ }
+ else
+ return dasm_illegal3(stream, 0x3c, op2, nr);
+ }
+ else if (op2 == 0x3a)
+ {
+ util::stream_format(stream, "%-8s", "MOV");
+ format_saddr1(stream, opcodes.r8(pc + 2));
+ stream << ",";
+ format_imm8(stream, opcodes.r8(pc + 3));
+ return 4 | SUPPORTED;
+ }
+ else if ((op2 & 0xf8) == 0x68)
+ {
+ util::stream_format(stream, "%-8s", s_alu_ops[op2 & 0x07]);
+ format_saddr1(stream, opcodes.r8(pc + 2));
+ stream << ",";
+ format_imm8(stream, opcodes.r8(pc + 3));
+ return 4 | SUPPORTED;
+ }
+ else if ((op2 & 0xf8) == 0x88)
+ {
+ u8 rr = opcodes.r8(pc + 2);
+ if (!BIT(rr, 3))
+ {
+ util::stream_format(stream, "%-8s%s,%s", s_alu_ops[op2 & 0x07], s_r_names[BIT(rr, 4, 4)], s_r_names[(rr & 0x07) | 8]);
+ return 3 | SUPPORTED;
+ }
+ else
+ return dasm_illegal3(stream, 0x3c, op2, rr);
+ }
+ else if ((op2 & 0xe8) == 0xa0)
+ {
+ util::stream_format(stream, "%-8s", BIT(op2, 4) ? "SET1" : "CLR1");
+ format_saddr1(stream, opcodes.r8(pc + 2));
+ util::stream_format(stream, ".%d", op2 & 0x07);
+ return 3 | SUPPORTED;
+ }
+ else if ((op2 & 0xf8) == 0xb8)
+ {
+ util::stream_format(stream, "%-8s%s,", "MOV", s_r_names[op2 & 0x0f]);
+ format_imm8(stream, opcodes.r8(pc + 2));
+ return 3 | SUPPORTED;
+ }
+ else if ((op2 & 0xf0) == 0xc0)
+ {
+ util::stream_format(stream, "%-8s%s", BIT(op2, 3) ? "DEC" : "INC", s_r_names[(op2 & 0x07) | 8]);
+ return 2 | SUPPORTED;
+ }
+ else if ((op2 & 0xf0) == 0xd0)
+ {
+ util::stream_format(stream, "%-8sA,%s", BIT(op2, 3) ? "XCH" : "MOV", s_r_names[(op2 & 0x07) | 8]);
+ return 2 | SUPPORTED;
+ }
+ else
+ return dasm_illegal2(stream, 0x3c, op2);
+ }
+ }
+}
+
+offs_t upd78k4_disassembler::dasm_43(std::ostream &stream, offs_t pc, const upd78k4_disassembler::data_buffer &opcodes)
+{
+ util::stream_format(stream, "%-8s", "BR");
+ format_jdisp16(stream, pc, opcodes.r16(pc + 1));
+ return 3 | SUPPORTED;
+}
+
+offs_t upd78k4_disassembler::dasm_78(std::ostream &stream, u8 op, offs_t pc, const upd78k4_disassembler::data_buffer &opcodes)
+{
+ u8 op2 = opcodes.r8(pc + 1);
+ if ((op2 & 0x0f) < 0x07)
+ {
+ util::stream_format(stream, "%-8s", s_alu_ops[op & 0x07]);
+ if (!BIT(op2, 2))
+ util::stream_format(stream, "%s,", s_r_names[BIT(op2, 4, 4)]);
+ if (BIT(op2, 1))
+ {
+ if (BIT(op2, 0))
+ format_imm8(stream, opcodes.r16(pc + 2));
+ else
+ format_sfr(stream, opcodes.r8(pc + 2));
+ }
+ else
+ {
+ if (BIT(op2, 0))
+ format_saddr1(stream, opcodes.r8(pc + 2));
+ else
+ format_saddr(stream, opcodes.r8(pc + 2));
+ }
+ if (BIT(op2, 2))
+ util::stream_format(stream, ",%s", s_r_names[BIT(op2, 4, 4)]);
+ return 3 | SUPPORTED;
+ }
+ else if ((op2 & 0x18) == 0x08 && (op2 & 0x0f) != 0x0f && (op == 0x78 || op == 0x7a || op == 0x7f))
+ {
+ util::stream_format(stream, "%-8s", op == 0x7f ? "CMPW" : op == 0x7a ? "SUBW" : "ADDW");
+ if (!BIT(op2, 2))
+ util::stream_format(stream, "%s,", s_rp_names[BIT(op2, 5, 3)]);
+ if ((op2 & 0x0f) == 0x0b)
+ {
+ format_imm16(stream, opcodes.r16(pc + 2));
+ return 4 | SUPPORTED;
+ }
+ else
+ {
+ if (BIT(op2, 1))
+ format_sfrp(stream, opcodes.r8(pc + 2));
+ else if (BIT(op2, 0))
+ format_saddrp1(stream, opcodes.r8(pc + 2));
+ else
+ format_saddrp(stream, opcodes.r8(pc + 2));
+ if (BIT(op2, 2))
+ util::stream_format(stream, ",%s", s_rp_names[BIT(op2, 5, 3)]);
+ return 3 | SUPPORTED;
+ }
+ }
+ else if ((op & 0x05) == 0 && (op2 & 0xfe) == 0xf8)
+ {
+ util::stream_format(stream, "%-8sWHL,", BIT(op, 1) ? "SUBG" : "ADDG");
+ if (BIT(op2, 0))
+ format_saddrg1(stream, opcodes.r8(pc + 2));
+ else
+ format_saddrg2(stream, opcodes.r8(pc + 2));
+ return 3 | SUPPORTED;
+ }
+ else if ((op & 0x05) == 0 && (op2 & 0x9f) == 0x9b)
+ {
+ util::stream_format(stream, "%-8s%s,", BIT(op, 1) ? "SUBG" : "ADDG", s_rg_names[BIT(op2, 5, 2)]);
+ format_imm24(stream, u32(opcodes.r8(pc + 4)) << 16 | opcodes.r16(pc + 2));
+ return 5 | SUPPORTED;
+ }
+ else
+ return dasm_illegal2(stream, op, op2);
+}
+
+offs_t upd78k4_disassembler::dasm_88xx(std::ostream &stream, u8 op, u8 rr)
+{
+ if ((op & 0xfd) == 0x88 && (rr & 0x99) == 0x99)
+ {
+ util::stream_format(stream, "%-8s%s,%s", BIT(op, 1) ? "SUBG" : "ADDG", s_rg_names[BIT(rr, 5, 2)], s_rg_names[BIT(rr, 1, 2)]);
+ return 2 | SUPPORTED;
+ }
+ else
+ return upd78k3_disassembler::dasm_88xx(stream, op, rr);
+}
+
+
+upd784026_disassembler::upd784026_disassembler()
+ : upd78k4_disassembler(s_sfr_names, s_sfrp_names)
+{
+}
+
+const char *const upd784026_disassembler::s_sfr_names[256] =
+{
+ "P0", "P1", "P2", "P3", "P4", "P5", "P6", "P7",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "P0L", "P0H",
+ nullptr, nullptr, nullptr, nullptr, "CR10", nullptr, "CR11", nullptr,
+ "CR20", nullptr, "CR21", nullptr, "CR30", nullptr, nullptr, nullptr,
+ "PM0", "PM1", nullptr, "PM3", "PM4", "PM5", "PM6", "PM7",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "RTPC", nullptr,
+ "CRC0", "TOC", "CRC1", "CRC2", nullptr, nullptr, nullptr, nullptr,
+ "CR12", nullptr, "CR22", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, "PMC1", nullptr, "PMC3", nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "PUO", nullptr,
+ nullptr, nullptr, "TM1", nullptr, "TM2", nullptr, "TM3", nullptr,
+ nullptr, nullptr, nullptr, nullptr, "PRM0", "TMC0", "PRM1", "TMC1",
+ "DACS0", "DACS1", "DAM", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ADM", nullptr, "ADCR", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "PWMC", "PWPR", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, "OSPC", nullptr, nullptr,
+ "SBIC", nullptr, "CSIM", nullptr, "CSIM1", "CSIM2", "SIO", nullptr,
+ "ASIM", "ASIM2", "ASIS", "ASIS2", "SIO1", "SIO2", nullptr, nullptr,
+ "BRGC", "BRGC2", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "INTM0", "INTM1", nullptr, nullptr, "SCS0", nullptr, nullptr, nullptr,
+ "ISPR", nullptr, "IMC", nullptr, "MK0L", "MK0H", "MK1L", nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "STBC", nullptr, "WDM", nullptr, "MM", "HLDM", "CLOM", "PWC1",
+ nullptr, nullptr, nullptr, nullptr, "RFM", "RFA", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ "PIC0", "PIC1", "PIC2", "PIC3", "CIC00", "CIC01", "CIC10", "CIC11",
+ "CIC20", "CIC21", "CIC30", "PIC4", "PIC5", "ADIC", "SERIC", "SRIC",
+ "STIC", "CSIIC", "SERIC2", "SRIC2", "STIC2", nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, "IMS", nullptr, nullptr, nullptr
+};
+
+const char *const upd784026_disassembler::s_sfrp_names[128] =
+{
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "CR00", "CR01", "CR10W", "CR11W", "CR20W", "CR21W", "CR30W", nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, "CR02", "CR12W", "CR22W", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM0", "TM1W", "TM2W", "TM3W", nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, "PWM0", "PWM1", nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "MK0", nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, "PWC2", nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+upd784038_disassembler::upd784038_disassembler()
+ : upd78k4_disassembler(s_sfr_names, s_sfrp_names)
+{
+}
+
+const char *const upd784038_disassembler::s_sfr_names[256] =
+{
+ "P0", "P1", "P2", "P3", "P4", "P5", "P6", "P7",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "P0L", "P0H",
+ nullptr, nullptr, nullptr, nullptr, "CR10", nullptr, "CR11", nullptr,
+ "CR20", nullptr, "CR21", nullptr, "CR30", nullptr, nullptr, nullptr,
+ "PM0", "PM1", nullptr, "PM3", "PM4", "PM5", "PM6", "PM7",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "RTPC", nullptr,
+ "CRC0", "TOC", "CRC1", "CRC2", nullptr, nullptr, nullptr, nullptr,
+ "CR12", nullptr, "CR22", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, "PMC1", nullptr, "PMC3", nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "PUO", nullptr,
+ nullptr, nullptr, "TM1", nullptr, "TM2", nullptr, "TM3", nullptr,
+ nullptr, nullptr, nullptr, nullptr, "PRM0", "TMC0", "PRM1", "TMC1",
+ "DACS0", "DACS1", "DAM", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ADM", nullptr, "ADCR", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "PWMC", "PWPR", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, "OSPC", nullptr, nullptr,
+ "IICC", "SPRM", "CSIM", nullptr, "CSIM1", "CSIM2", "SIO", nullptr,
+ "ASIM", "ASIM2", "ASIS", "ASIS2", "SIO1", "SIO2", nullptr, nullptr,
+ "BRGC", "BRGC2", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "INTM0", "INTM1", nullptr, nullptr, "SCS0", nullptr, nullptr, nullptr,
+ "ISPR", nullptr, "IMC", nullptr, "MK0L", "MK0H", "MK1L", nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "STBC", nullptr, "WDM", nullptr, "MM", "HLDM", "CLOM", "PWC1",
+ nullptr, nullptr, nullptr, nullptr, "RFM", "RFA", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ "PIC0", "PIC1", "PIC2", "PIC3", "CIC00", "CIC01", "CIC10", "CIC11",
+ "CIC20", "CIC21", "CIC30", "PIC4", "PIC5", "ADIC", "SERIC", "SRIC",
+ "STIC", "CSIIC", "SERIC2", "SRIC2", "STIC2", nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, "IMS", nullptr, nullptr, nullptr
+};
+
+const char *const upd784038_disassembler::s_sfrp_names[128] =
+{
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "CR00", "CR01", "CR10W", "CR11W", "CR20W", "CR21W", "CR30W", nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, "CR02", "CR12W", "CR22W", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM0", "TM1W", "TM2W", "TM3W", nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, "PWM0", "PWM1", nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "MK0", nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, "PWC2", nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+upd784046_disassembler::upd784046_disassembler()
+ : upd78k4_disassembler(s_sfr_names, s_sfrp_names)
+{
+}
+
+const char *const upd784046_disassembler::s_sfr_names[256] =
+{
+ "P0", "P1", "P2", "P3", "P4", "P5", "P6", "P7",
+ "P8", "P9", nullptr, nullptr, nullptr, nullptr, "P0L", nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "PM0", "PM1", "PM2", "PM3", "PM4", "PM5", "PM6", nullptr,
+ "PM8", "PM9", nullptr, nullptr, nullptr, nullptr, "RTPC", "PRDC",
+ "TUM0", "TMC", "TOC0", "TOC1", "TUM2", "TMC2", "TOC2", "TMC4",
+ "PRM", "PRM2", "PRM4", "NPC", "INTM0", "INTM1", "IEF1", "IEF2",
+ nullptr, "PMC1", "PMC2", "PMC3", nullptr, nullptr, nullptr, nullptr,
+ nullptr, "PMC9", nullptr, nullptr, nullptr, nullptr, "PUOL", "PUOH",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "ADM", nullptr,
+ nullptr, "ADCR0H", nullptr, "ADCR1H", nullptr, "ADCR2H", nullptr, "ADCR3H",
+ nullptr, "ADCR4H", nullptr, "ADCR5H", nullptr, "ADCR6H", nullptr, "ADCR7H",
+ nullptr, nullptr, nullptr, nullptr, "CSIM1", "CSIM2", nullptr, nullptr,
+ "ASIM", "ASIM2", "ASIS", "ASIS2", "SIO1", "SIO2", nullptr, nullptr,
+ "BRGC", "BRGC2", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ISPR", nullptr, "IMC", nullptr, "MK0L", "MK0H", "MK1L", "MK1H",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "STBC", nullptr, "WDM", nullptr, "MM", nullptr, nullptr, "PWC1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "OSTS",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ "OVIC0", "OVIC1", "OVIC4", "PIC0", "PIC1", "PIC2", "PIC3", "PIC4",
+ "PIC5", "PIC6", "CMIC10", "CMIC11", "CMIC20", "CMIC21", "CMIC30", "CMIC31",
+ "CMIC40", "CMIC41", "SERIC", "SRIC", "STIC", "SERIC2", "SRIC2", "STIC2",
+ "ADIC", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+const char *const upd784046_disassembler::s_sfrp_names[128] =
+{
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM0", "CC00", "CC01", "CC02", "CC03", "TM1", "CM10", "CM11",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM2", "CM20", "CM21", "TM3", "CM30", "CM31", nullptr, nullptr,
+ "TM4", "CM40", "CM41", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ADCR0", "ADCR1", "ADCR2", "ADCR3", "ADCR4", "ADCR5", "ADCR6", "ADCR7",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "MK0", "MK1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, "PWC2", "BW", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+upd784054_disassembler::upd784054_disassembler()
+ : upd78k4_disassembler(s_sfr_names, s_sfrp_names)
+{
+}
+
+const char *const upd784054_disassembler::s_sfr_names[256] =
+{
+ "P0", "P1", "P2", "P3", "P4", "P5", "P6", "P7",
+ "P8", "P9", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "PM0", "PM1", "PM2", "PM3", "PM4", "PM5", "PM6", nullptr,
+ nullptr, "PM9", nullptr, nullptr, nullptr, nullptr, nullptr, "PRDC",
+ "TUM0", "TMC", "TOC0", "TOC1", nullptr, nullptr, nullptr, "TMC4",
+ "PRM", nullptr, "PRM4", "NPC", "INTM0", "INTM1", "IEF1", "IEF2",
+ nullptr, nullptr, "PMC2", "PMC3", nullptr, nullptr, nullptr, nullptr,
+ nullptr, "PMC9", nullptr, nullptr, nullptr, nullptr, "PUOL", "PUOH",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "ADM", nullptr,
+ nullptr, "ADCR0H", nullptr, "ADCR1H", nullptr, "ADCR2H", nullptr, "ADCR3H",
+ nullptr, "ADCR4H", nullptr, "ADCR5H", nullptr, "ADCR6H", nullptr, "ADCR7H",
+ nullptr, nullptr, nullptr, nullptr, "CSIM1", "CSIM2", nullptr, nullptr,
+ "ASIM", "ASIM2", "ASIS", "ASIS2", "SIO1", "SIO2", nullptr, nullptr,
+ "BRGC", "BRGC2", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ISPR", nullptr, "IMC", nullptr, "MK0L", "MK0H", "MK1L", "MK1H",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "STBC", nullptr, "WDM", nullptr, "MM", nullptr, nullptr, "PWC1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "OSTS",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ "OVIC0", "OVIC1", "OVIC4", "PIC0", "PIC1", "PIC2", "PIC3", "PIC4",
+ "PIC5", "PIC6", "CMIC10", "CMIC11", nullptr, nullptr, nullptr, nullptr,
+ "CMIC40", "CMIC41", "SERIC", "SRIC", "STIC", "SERIC2", "SRIC2", "STIC2",
+ "ADIC", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+const char *const upd784054_disassembler::s_sfrp_names[128] =
+{
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM0", "CC00", "CC01", "CC02", "CC03", "TM1", "CM10", "CM11",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM4", "CM40", "CM41", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ADCR0", "ADCR1", "ADCR2", "ADCR3", "ADCR4", "ADCR5", "ADCR6", "ADCR7",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "MK0", "MK1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, "PWC2", "BW", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+upd784216_disassembler::upd784216_disassembler()
+ : upd78k4_disassembler(s_sfr_names, s_sfrp_names)
+{
+}
+
+const char *const upd784216_disassembler::s_sfr_names[256] =
+{
+ "P0", "P1", "P2", "P3", "P4", "P5", "P6", "P7",
+ "P8", "P9", "P10", nullptr, "P12", "P13", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "CRC0", nullptr,
+ "TMC0", nullptr, "TOC0", nullptr, "PRM0", nullptr, nullptr, nullptr,
+ "PM0", nullptr, "PM2", "PM3", "PM4", "PM5", "PM6", "PM7",
+ "PM8", "PM9", "PM10", nullptr, "PM12", "PM13", nullptr, nullptr,
+ "PU0", nullptr, "PU2", "PU3", nullptr, nullptr, nullptr, "PU7",
+ "PU8", nullptr, "PU10", nullptr, "PU12", nullptr, nullptr, nullptr,
+ "CKS", nullptr, "PF2", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "PUO", nullptr,
+ "TM1", "TM2", "CR10", "CR20", "TMC1", "TMC2", "PRM1", "PRM2",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM5", "TM6", "TM7", "TM8", "CR50", "CR60", "CR70", "CR80",
+ "TMC5", "TMC6", "TMC7", "TMC8", "PRM5", "PRM6", "PRM7", "PRM8",
+ "ASIM1", "ASIM2", "ASIS1", "ASIS2", "TXS1/RXB1", "TXS2/RXB2", "BRGC1", "BRGC2",
+ nullptr, nullptr, "CC", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ADM", "ADIS", nullptr, "ADCR", "DACS0", "DACS1", "DAM0", "DAM1",
+ nullptr, nullptr, nullptr, nullptr, "EBTS", nullptr, nullptr, nullptr,
+ "CSIM0", "CSIM1", "CSIM2", nullptr, "SIO0", "SIO1", "SIO2", nullptr,
+ "RTBL", "RTBH", "RTPM", "RTPC", "WTM", nullptr, nullptr, nullptr,
+ "EGP0", nullptr, "EGN0", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ISPR", "SNMI", "IMC", nullptr, "MK0L", "MK0H", "MK1L", "MK1H",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "STBC", nullptr, "WDM", nullptr, "MM", nullptr, nullptr, "PWC1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "PCS", "OSTS",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ "WDTIC", "PIC0", "PIC1", "PIC2", "PIC3", "PIC4", "PIC5", "PIC6",
+ "CSIIC0", "SERIC1", "SRIC1", "STIC1", "SERIC2", "SRIC2", "STIC2", "TMIC3",
+ "TMIC00", "TMIC01", "TMIC1", "TMIC2", "ADIC", "TMIC5", "TMIC6", "TMIC7",
+ "TMIC8", "WTIC", "KRIC", nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+const char *const upd784216_disassembler::s_sfrp_names[128] =
+{
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM0", "CR00", "CR01", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM1W", "CR1W", "TMC1W", "PRM1W", nullptr, nullptr, nullptr, nullptr,
+ "TM5W", "TM7W", "CR5W", "CR7W", "TMC5W", "TMC7W", "PRM5W", "PRM7W",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "MK0", "MK1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+upd784218_disassembler::upd784218_disassembler()
+ : upd78k4_disassembler(s_sfr_names, s_sfrp_names)
+{
+}
+
+const char *const upd784218_disassembler::s_sfr_names[256] =
+{
+ "P0", "P1", "P2", "P3", "P4", "P5", "P6", "P7",
+ "P8", "P9", "P10", nullptr, "P12", "P13", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "CRC0", nullptr,
+ "TMC0", nullptr, "TOC0", nullptr, "PRM0", nullptr, nullptr, nullptr,
+ "PM0", nullptr, "PM2", "PM3", "PM4", "PM5", "PM6", "PM7",
+ "PM8", "PM9", "PM10", nullptr, "PM12", "PM13", nullptr, nullptr,
+ "PU0", nullptr, "PU2", "PU3", nullptr, nullptr, nullptr, "PU7",
+ "PU8", nullptr, "PU10", nullptr, "PU12", nullptr, nullptr, nullptr,
+ "CKS", nullptr, "PF2", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "PUO", nullptr,
+ "TM1", "TM2", "CR10", "CR20", "TMC1", "TMC2", "PRM1", "PRM2",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM5", "TM6", "TM7", "TM8", "CR50", "CR60", "CR70", "CR80",
+ "TMC5", "TMC6", "TMC7", "TMC8", "PRM5", "PRM6", "PRM7", "PRM8",
+ "ASIM1", "ASIM2", "ASIS1", "ASIS2", "TXS1/RXB1", "TXS2/RXB2", "BRGC1", "BRGC2",
+ nullptr, nullptr, "CC", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ADM", "ADIS", nullptr, "ADCR", "DACS0", "DACS1", "DAM0", "DAM1",
+ "CORC", "CORAH", nullptr, nullptr, "EBTS", "EXAE", nullptr, nullptr,
+ "CSIM0", "CSIM1", "CSIM2", nullptr, "SIO0", "SIO1", "SIO2", nullptr,
+ "RTBL", "RTBH", "RTPM", "RTPC", "WTM", nullptr, nullptr, nullptr,
+ "EGP0", nullptr, "EGN0", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ISPR", "SNMI", "IMC", nullptr, "MK0L", "MK0H", "MK1L", "MK1H",
+ "IICC0", nullptr, "SRPM0", nullptr, "SVA0", nullptr, "IICS0", nullptr,
+ "IIC0", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "STBC", nullptr, "WDM", nullptr, "MM", nullptr, nullptr, "PWC1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "PCS", "OSTS",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ "WDTIC", "PIC0", "PIC1", "PIC2", "PIC3", "PIC4", "PIC5", "PIC6",
+ "CSIIC0", "SERIC1", "SRIC1", "STIC1", "SERIC2", "SRIC2", "STIC2", "TMIC3",
+ "TMIC00", "TMIC01", "TMIC1", "TMIC2", "ADIC", "TMIC5", "TMIC6", "TMIC7",
+ "TMIC8", "WTIC", "KRIC", nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+const char *const upd784218_disassembler::s_sfrp_names[128] =
+{
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM0", "CR00", "CR01", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM1W", "CR1W", "TMC1W", "PRM1W", nullptr, nullptr, nullptr, nullptr,
+ "TM5W", "TM7W", "CR5W", "CR7W", "TMC5W", "TMC7W", "PRM5W", "PRM7W",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, "CORAL", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "MK0", "MK1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};
+
+upd784225_disassembler::upd784225_disassembler()
+ : upd78k4_disassembler(s_sfr_names, s_sfrp_names)
+{
+}
+
+const char *const upd784225_disassembler::s_sfr_names[256] =
+{
+ "P0", "P1", "P2", "P3", "P4", "P5", "P6", "P7",
+ nullptr, nullptr, nullptr, nullptr, "P12", "P13", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "CRC0", nullptr,
+ "TMC0", nullptr, "TOC0", nullptr, "PRM0", nullptr, nullptr, nullptr,
+ "PM0", nullptr, "PM2", "PM3", "PM4", "PM5", "PM6", "PM7",
+ nullptr, nullptr, nullptr, nullptr, "PM12", "PM13", nullptr, nullptr,
+ "PU0", nullptr, "PU2", "PU3", nullptr, nullptr, nullptr, "PU7",
+ nullptr, nullptr, nullptr, nullptr, "PU12", nullptr, nullptr, nullptr,
+ "CKS", nullptr, "PF2", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "PUO", nullptr,
+ "TM1", "TM2", "CR10", "CR20", "TMC1", "TMC2", "PRM1", "PRM2",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM5", "TM6", nullptr, nullptr, "CR50", "CR60", nullptr, nullptr,
+ "TMC5", "TMC6", nullptr, nullptr, "PRM5", "PRM6", nullptr, nullptr,
+ "ASIM1", "ASIM2", "ASIS1", "ASIS2", "TXS1/RXB1", "TXS2/RXB2", "BRGC1", "BRGC2",
+ nullptr, nullptr, "CC", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ADM", "ADIS", nullptr, "ADCR", "DACS0", "DACS1", "DAM0", "DAM1",
+ "CORC", "CORAH", nullptr, nullptr, nullptr, "EXAE", nullptr, nullptr,
+ "CSIM0", "CSIM1", "CSIM2", nullptr, "SIO0", "SIO1", "SIO2", nullptr,
+ "RTBL", "RTBH", "RTPM", "RTPC", "WTM", nullptr, nullptr, nullptr,
+ "EGP0", nullptr, "EGN0", nullptr, nullptr, nullptr, nullptr, nullptr,
+ "ISPR", "SNMI", "IMC", nullptr, "MK0L", "MK0H", "MK1L", "MK1H",
+ "IICC0", nullptr, "SRPM0", nullptr, "SVA0", nullptr, "IICS0", nullptr,
+ "IIC0", nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "STBC", nullptr, "WDM", nullptr, "MM", nullptr, nullptr, "PWC1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "PCS", "OSTS",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, // external access
+ "WDTIC", "PIC0", "PIC1", "PIC2", "PIC3", "PIC4", "PIC5", "PIC6",
+ "CSIIC0", "SERIC1", "SRIC1", "STIC1", "SERIC2", "SRIC2", "STIC2", "TMIC3",
+ "TMIC00", "TMIC01", "TMIC1", "TMIC2", "ADIC", "TMIC5", "TMIC6", nullptr,
+ nullptr, "WTIC", nullptr, nullptr, "IMS", nullptr, nullptr, nullptr
+};
+
+const char *const upd784225_disassembler::s_sfrp_names[128] =
+{
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM0", "CR00", "CR01", nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ "TM1W", "CR1W", "TMC1W", "PRM1W", nullptr, nullptr, nullptr, nullptr,
+ "TM5W", "TM7W", "CR5W", "CR7W", "TMC5W", nullptr, "PRM5W", nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, "CORAL", nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, "MK0", "MK1",
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, "PWC2", nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
+ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr
+};