summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2020-02-17 22:44:42 -0500
committer AJR <ajrhacker@users.noreply.github.com>2020-02-17 22:44:42 -0500
commitd5f869ab976e127291588b58b20223c1ef914e97 (patch)
tree5a044e3bec84fb49cd01f28b6b7ad374cde1780a /src/devices/cpu
parent09e068aaad8d0d6cd9a79fb534a9b403091a59cb (diff)
upd78k3d: Correct indexing for 0A-prefixed instructions; misc. other notes & formatting adjustments (nw)
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/upd78k/upd78k1d.cpp2
-rw-r--r--src/devices/cpu/upd78k/upd78k2d.cpp4
-rw-r--r--src/devices/cpu/upd78k/upd78k3d.cpp12
-rw-r--r--src/devices/cpu/upd78k/upd78kd.cpp7
-rw-r--r--src/devices/cpu/upd78k/upd78kd.h1
5 files changed, 17 insertions, 9 deletions
diff --git a/src/devices/cpu/upd78k/upd78k1d.cpp b/src/devices/cpu/upd78k/upd78k1d.cpp
index 07925111327..2760056366f 100644
--- a/src/devices/cpu/upd78k/upd78k1d.cpp
+++ b/src/devices/cpu/upd78k/upd78k1d.cpp
@@ -253,7 +253,7 @@ offs_t upd78k1_disassembler::dasm_0axx(std::ostream &stream, u8 op2, offs_t pc,
util::stream_format(stream, "%-8s", BIT(op2, 3) ? s_alu_ops[op2 & 0x07] : BIT(op2, 2) ? "XCH" : "MOV");
if (!BIT(op2, 7))
stream << "A,";
- format_ix_disp16(stream, BIT(op2, 5) ? "B" : "A", opcodes.r16(pc + 2));
+ format_ix_base16(stream, BIT(op2, 5) ? "B" : "A", opcodes.r16(pc + 2));
if (BIT(op2, 7))
stream << ",A";
return 4 | SUPPORTED;
diff --git a/src/devices/cpu/upd78k/upd78k2d.cpp b/src/devices/cpu/upd78k/upd78k2d.cpp
index 75abce3425f..79ab19ec907 100644
--- a/src/devices/cpu/upd78k/upd78k2d.cpp
+++ b/src/devices/cpu/upd78k/upd78k2d.cpp
@@ -75,7 +75,7 @@ offs_t upd78k2_disassembler::dasm_01xx(std::ostream &stream, u8 op2, offs_t pc,
stream << "A,";
stream << "&";
if (BIT(op2, 4))
- format_ix_disp16(stream, BIT(op2, 5) ? "B" : "A", opcodes.r16(pc + 2));
+ format_ix_base16(stream, BIT(op2, 5) ? "B" : "A", opcodes.r16(pc + 2));
else
format_ix_disp16(stream, BIT(op2, 5) ? "HL" : "DE", opcodes.r16(pc + 2));
if (BIT(op2, 7))
@@ -180,7 +180,7 @@ offs_t upd78k2_disassembler::dasm_0axx(std::ostream &stream, u8 op2, offs_t pc,
if (!BIT(op2, 7))
stream << "A,";
if (BIT(op2, 4))
- format_ix_disp16(stream, BIT(op2, 5) ? "B" : "A", opcodes.r16(pc + 2));
+ format_ix_base16(stream, BIT(op2, 5) ? "B" : "A", opcodes.r16(pc + 2));
else
format_ix_disp16(stream, BIT(op2, 5) ? "HL" : "DE", opcodes.r16(pc + 2));
if (BIT(op2, 7))
diff --git a/src/devices/cpu/upd78k/upd78k3d.cpp b/src/devices/cpu/upd78k/upd78k3d.cpp
index 13ad5f2772f..b7540b950c9 100644
--- a/src/devices/cpu/upd78k/upd78k3d.cpp
+++ b/src/devices/cpu/upd78k/upd78k3d.cpp
@@ -502,10 +502,10 @@ offs_t upd78k3_disassembler::dasm_0axx(std::ostream &stream, u8 op2, offs_t pc,
else if (!BIT(op2, 7))
stream << "A,";
- if (BIT(op2, 5))
- format_ix_disp16(stream, BIT(op2, 4) ? "B" : "A", opcodes.r16(pc + 2));
+ if (BIT(op2, 4))
+ format_ix_base16(stream, BIT(op2, 5) ? "B" : "A", opcodes.r16(pc + 2));
else
- format_ix_disp16(stream, m_ix_bases[(op2 & 0x10) >> 3], opcodes.r16(pc + 2));
+ format_ix_disp16(stream, m_ix_bases[(op2 & 0x20) >> 4], opcodes.r16(pc + 2));
if ((op2 & 0x8b) == 0x81)
stream << ",AX";
@@ -897,7 +897,7 @@ offs_t upd78k3_disassembler::disassemble(std::ostream &stream, offs_t pc, const
{
util::stream_format(stream, "%-8s", BIT(op, 1) ? "PUSHU" : "PUSH");
if (post == 0)
- stream << "none";
+ stream << "0"; // none
else for (int n = 7; n >= 0; n--)
{
if (BIT(post, n))
@@ -916,7 +916,7 @@ offs_t upd78k3_disassembler::disassemble(std::ostream &stream, offs_t pc, const
{
util::stream_format(stream, "%-8s", BIT(op, 1) ? "POPU" : "POP");
if (post == 0)
- stream << "none";
+ stream << "0"; // none
else for (int n = 0; n < 8; n++)
{
if (BIT(post, n))
@@ -1192,7 +1192,7 @@ offs_t upd78312_disassembler::dasm_07xx(std::ostream &stream, u8 op2, offs_t pc,
offs_t upd78312_disassembler::dasm_09xx(std::ostream &stream, u8 op2, offs_t pc, const upd78312_disassembler::data_buffer &opcodes)
{
- // STBC and WDM are moved; no RETCSB
+ // STBC and WDM are moved; no RETCSB (also no absolute MOVW except on µPD78310A/312A)
if (op2 == 0x42 || op2 == 0x44)
return dasm_09xx_sfrmov(stream, op2, pc, opcodes);
else if ((op2 & 0xd0) != 0xc0)
diff --git a/src/devices/cpu/upd78k/upd78kd.cpp b/src/devices/cpu/upd78k/upd78kd.cpp
index 2193948169b..a7c91c488ce 100644
--- a/src/devices/cpu/upd78k/upd78kd.cpp
+++ b/src/devices/cpu/upd78k/upd78kd.cpp
@@ -64,6 +64,13 @@ void upd78k_family_disassembler::format_ix_disp16(std::ostream &stream, const ch
}
}
+void upd78k_family_disassembler::format_ix_base16(std::ostream &stream, const char *r, u16 d)
+{
+ if (d >= 0xa000)
+ stream << "0";
+ util::stream_format(stream, "%04XH[%s]", d, r);
+}
+
void upd78k_family_disassembler::format_abs16(std::ostream &stream, u16 addr)
{
if (addr < 0xa000)
diff --git a/src/devices/cpu/upd78k/upd78kd.h b/src/devices/cpu/upd78k/upd78kd.h
index 5ebebdd17d7..2dabff37edc 100644
--- a/src/devices/cpu/upd78k/upd78kd.h
+++ b/src/devices/cpu/upd78k/upd78kd.h
@@ -19,6 +19,7 @@ protected:
void format_imm16(std::ostream &stream, u16 d);
void format_ix_disp8(std::ostream &stream, const char *r, u8 d);
void format_ix_disp16(std::ostream &stream, const char *r, u16 d);
+ void format_ix_base16(std::ostream &stream, const char *r, u16 d);
void format_abs16(std::ostream &stream, u16 addr);
void format_jdisp8(std::ostream &stream, offs_t pc, u8 disp);
void format_sfr(std::ostream &stream, u8 addr);