summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/upd78k
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2022-03-27 14:23:03 -0400
committer AJR <ajrhacker@users.noreply.github.com>2022-03-27 14:29:51 -0400
commitc7597225b4f0a3531d53dd806048b136956eb850 (patch)
tree3ed5b758cbd0a94a43d9c6fe9f83f402b169657d /src/devices/cpu/upd78k
parentc3162e739d625d31ca207ab8b591ea87c5f1fe03 (diff)
Debugger feature improvements
- Add 'gbt' and 'gbf' debugger commands to step until a true or false conditional branch has been detected. - Update over 100 of the disassemblers in MAME to output a new STEP_COND flag for all conditional branches. Besides being used for execution of the new 'gbt' and 'gbf' commands, this flag also now helps the debugger 'out' command to properly handle conditional return instructions. - Remove STEP_OVER from many instructions that aren't actually subroutine calls (e.g. DJNZ on Z80). A 'gni' debugger command (go next instruction) has been added to accommodate some of the misuse. - Add instruction flag support to several more disassemblers that lacked them entirely (e.g. st62xx) - Don't pass over delay slots for debugging in ASAP core
Diffstat (limited to 'src/devices/cpu/upd78k')
-rw-r--r--src/devices/cpu/upd78k/upd78k0d.cpp30
-rw-r--r--src/devices/cpu/upd78k/upd78k1d.cpp17
-rw-r--r--src/devices/cpu/upd78k/upd78k3d.cpp19
-rw-r--r--src/devices/cpu/upd78k/upd78k4d.cpp4
4 files changed, 40 insertions, 30 deletions
diff --git a/src/devices/cpu/upd78k/upd78k0d.cpp b/src/devices/cpu/upd78k/upd78k0d.cpp
index 233b5fbdd50..b13050c1d85 100644
--- a/src/devices/cpu/upd78k/upd78k0d.cpp
+++ b/src/devices/cpu/upd78k/upd78k0d.cpp
@@ -48,7 +48,7 @@ offs_t upd78k0_disassembler::dasm_31(std::ostream &stream, offs_t pc, const upd7
util::stream_format(stream, ".%d,", (op2 & 0x70) >> 4);
}
format_jdisp8(stream, pc + 4, opcodes.r8(pc + 3));
- return 4 | SUPPORTED;
+ return 4 | STEP_COND | SUPPORTED;
}
else switch (op2 & 0x0f)
{
@@ -57,36 +57,36 @@ offs_t upd78k0_disassembler::dasm_31(std::ostream &stream, offs_t pc, const upd7
format_sfr(stream, opcodes.r8(pc + 2));
util::stream_format(stream, ".%d,", (op2 & 0x70) >> 4);
format_jdisp8(stream, pc + 4, opcodes.r8(pc + 3));
- return 4 | SUPPORTED;
+ return 4 | STEP_COND | SUPPORTED;
case 0x06:
util::stream_format(stream, "%-8s", "BT");
format_sfr(stream, opcodes.r8(pc + 2));
util::stream_format(stream, ".%d,", (op2 & 0x70) >> 4);
format_jdisp8(stream, pc + 4, opcodes.r8(pc + 3));
- return 4 | SUPPORTED;
+ return 4 | STEP_COND | SUPPORTED;
case 0x07:
util::stream_format(stream, "%-8s", "BF");
format_sfr(stream, opcodes.r8(pc + 2));
util::stream_format(stream, ".%d,", (op2 & 0x70) >> 4);
format_jdisp8(stream, pc + 4, opcodes.r8(pc + 3));
- return 4 | SUPPORTED;
+ return 4 | STEP_COND | SUPPORTED;
case 0x0d:
util::stream_format(stream, "%-8sA.%d,", "BTCLR", (op2 & 0x70) >> 4);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
case 0x0e:
util::stream_format(stream, "%-8sA.%d,", "BT", (op2 & 0x70) >> 4);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
case 0x0f:
util::stream_format(stream, "%-8sA.%d,", "BF", (op2 & 0x70) >> 4);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
default:
return dasm_illegal2(stream, 0x31, op2);
@@ -117,17 +117,17 @@ offs_t upd78k0_disassembler::dasm_31(std::ostream &stream, offs_t pc, const upd7
case 0x05:
util::stream_format(stream, "%-8s[HL].%d,", "BTCLR", (op2 & 0x70) >> 4);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
case 0x06:
util::stream_format(stream, "%-8s[HL].%d,", "BT", (op2 & 0x70) >> 4);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
case 0x07:
util::stream_format(stream, "%-8s[HL].%d,", "BF", (op2 & 0x70) >> 4);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
case 0x0a: case 0x0b:
if (op2 < 0x90)
@@ -305,7 +305,7 @@ offs_t upd78k0_disassembler::disassemble(std::ostream &stream, offs_t pc, const
format_saddr(stream, opcodes.r8(pc + 1));
stream << ",";
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
case 0x05: case 0x07:
util::stream_format(stream, "%-8sA,[%s]", "XCH", s_rp_names[(op & 0x06) >> 1]);
@@ -470,7 +470,7 @@ offs_t upd78k0_disassembler::disassemble(std::ostream &stream, offs_t pc, const
case 0x8a: case 0x8b:
util::stream_format(stream, "%-8s%s,", "DBNZ", s_r_names[op & 0x07]);
format_jdisp8(stream, pc + 2, opcodes.r8(pc + 1));
- return 2 | SUPPORTED;
+ return 2 | STEP_COND | SUPPORTED;
case 0x8c: case 0x9c: case 0xac: case 0xbc: case 0xcc: case 0xdc: case 0xec: case 0xfc:
{
@@ -484,13 +484,13 @@ offs_t upd78k0_disassembler::disassemble(std::ostream &stream, offs_t pc, const
util::stream_format(stream, ".%d,", (op & 0x70) >> 4);
}
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
}
case 0x8d: case 0x9d:
util::stream_format(stream, "%-8s", BIT(op, 4) ? "BNC" : "BC");
format_jdisp8(stream, pc + 2, opcodes.r8(pc + 1));
- return 2 | SUPPORTED;
+ return 2 | STEP_COND | SUPPORTED;
case 0x8e:
util::stream_format(stream, "%-8sA,", "MOV");
@@ -550,7 +550,7 @@ offs_t upd78k0_disassembler::disassemble(std::ostream &stream, offs_t pc, const
case 0xad: case 0xbd:
util::stream_format(stream, "%-8s", BIT(op, 4) ? "BNZ" : "BZ");
format_jdisp8(stream, pc + 2, opcodes.r8(pc + 1));
- return 2 | SUPPORTED;
+ return 2 | STEP_COND | SUPPORTED;
case 0xae:
util::stream_format(stream, "%-8sA,", "MOV");
diff --git a/src/devices/cpu/upd78k/upd78k1d.cpp b/src/devices/cpu/upd78k/upd78k1d.cpp
index e3c8dc80625..e43a09d71f5 100644
--- a/src/devices/cpu/upd78k/upd78k1d.cpp
+++ b/src/devices/cpu/upd78k/upd78k1d.cpp
@@ -123,7 +123,7 @@ offs_t upd78k1_disassembler::dasm_02xx(std::ostream &stream, u8 op1, u8 op2, off
else
util::stream_format(stream, "%s,", s_psw_bits[op2 & 0x07]);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
}
else
return dasm_illegal2(stream, op1, op2);
@@ -211,7 +211,7 @@ offs_t upd78k1_disassembler::dasm_08xx(std::ostream &stream, u8 op2, offs_t pc,
format_saddr(stream, opcodes.r8(pc + 2));
util::stream_format(stream, ".%d,", op2 & 0x07);
format_jdisp8(stream, pc + 4, opcodes.r8(pc + 3));
- return 4 | SUPPORTED;
+ return 4 | STEP_COND | SUPPORTED;
}
else
return dasm_illegal2(stream, 0x08, op2);
@@ -546,7 +546,7 @@ offs_t upd78k1_disassembler::disassemble(std::ostream &stream, offs_t pc, const
{
util::stream_format(stream, "%-8s%s,", "DBNZ", s_r_names[op & 0x07]);
format_jdisp8(stream, pc + 2, opcodes.r8(pc + 1));
- return 2 | SUPPORTED;
+ return 2 | STEP_COND | SUPPORTED;
}
else
{
@@ -577,10 +577,15 @@ offs_t upd78k1_disassembler::disassemble(std::ostream &stream, offs_t pc, const
format_saddr(stream, opcodes.r8(pc + 1));
stream << ",";
if (BIT(op, 0))
+ {
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
+ return 3 | STEP_COND | SUPPORTED;
+ }
else
+ {
format_imm8(stream, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | SUPPORTED;
+ }
}
else
return dasm_38(stream, op, pc, opcodes);
@@ -641,7 +646,7 @@ offs_t upd78k1_disassembler::disassemble(std::ostream &stream, offs_t pc, const
format_saddr(stream, opcodes.r8(pc + 1));
util::stream_format(stream, ".%d,", op & 0x07);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
case 0x78:
return dasm_78(stream, op, pc, opcodes);
@@ -653,7 +658,7 @@ offs_t upd78k1_disassembler::disassemble(std::ostream &stream, offs_t pc, const
{
util::stream_format(stream, "%-8s", s_bcond[op & 0x03]);
format_jdisp8(stream, pc + 2, opcodes.r8(pc + 1));
- return 2 | SUPPORTED;
+ return 2 | STEP_COND | SUPPORTED;
}
case 0x88:
diff --git a/src/devices/cpu/upd78k/upd78k3d.cpp b/src/devices/cpu/upd78k/upd78k3d.cpp
index 0adfd848cfd..e209e213d06 100644
--- a/src/devices/cpu/upd78k/upd78k3d.cpp
+++ b/src/devices/cpu/upd78k/upd78k3d.cpp
@@ -235,7 +235,7 @@ offs_t upd78k3_disassembler::dasm_02xx(std::ostream &stream, u8 op1, u8 op2, off
else
util::stream_format(stream, "%s,", m_psw_bits[op2 & 0x0f]);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
}
else
return dasm_illegal2(stream, op1, op2);
@@ -332,7 +332,7 @@ offs_t upd78k3_disassembler::dasm_07xx(std::ostream &stream, u8 op2, offs_t pc,
{
util::stream_format(stream, "%-8s", s_bcond_07f8[op2 & 0x07]);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
}
else if ((op2 & 0xce) == 0xc8)
{
@@ -409,7 +409,7 @@ offs_t upd78k3_disassembler::dasm_08xx(std::ostream &stream, u8 op2, offs_t pc,
format_saddr(stream, opcodes.r8(pc + 2));
util::stream_format(stream, ".%d,", op2 & 0x07);
format_jdisp8(stream, pc + 4, opcodes.r8(pc + 3));
- return 4 | SUPPORTED;
+ return 4 | STEP_COND | SUPPORTED;
}
else
return dasm_illegal2(stream, 0x08, op2);
@@ -937,7 +937,7 @@ offs_t upd78k3_disassembler::disassemble(std::ostream &stream, offs_t pc, const
{
util::stream_format(stream, "%-8s%c,", "DBNZ", BIT(op, 0) ? 'B' : 'C');
format_jdisp8(stream, pc + 2, opcodes.r8(pc + 1));
- return 2 | SUPPORTED;
+ return 2 | STEP_COND | SUPPORTED;
}
else
{
@@ -960,10 +960,15 @@ offs_t upd78k3_disassembler::disassemble(std::ostream &stream, offs_t pc, const
format_saddr(stream, opcodes.r8(pc + 1));
stream << ",";
if (BIT(op, 0))
+ {
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
+ return 3 | STEP_COND | SUPPORTED;
+ }
else
+ {
format_imm8(stream, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | SUPPORTED;
+ }
}
else
return dasm_38(stream, op, pc, opcodes);
@@ -1019,7 +1024,7 @@ offs_t upd78k3_disassembler::disassemble(std::ostream &stream, offs_t pc, const
format_saddr(stream, opcodes.r8(pc + 1));
util::stream_format(stream, ".%d,", op & 0x07);
format_jdisp8(stream, pc + 3, opcodes.r8(pc + 2));
- return 3 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
case 0x78:
return dasm_78(stream, op, pc, opcodes);
@@ -1027,7 +1032,7 @@ offs_t upd78k3_disassembler::disassemble(std::ostream &stream, offs_t pc, const
case 0x80:
util::stream_format(stream, "%-8s", s_bcond[op & 0x07]);
format_jdisp8(stream, pc + 2, opcodes.r8(pc + 1));
- return 2 | SUPPORTED;
+ return 2 | STEP_COND | SUPPORTED;
case 0x88:
return dasm_88xx(stream, op, opcodes.r8(pc + 1));
diff --git a/src/devices/cpu/upd78k/upd78k4d.cpp b/src/devices/cpu/upd78k/upd78k4d.cpp
index 7a45cfefadb..9ac9ce998be 100644
--- a/src/devices/cpu/upd78k/upd78k4d.cpp
+++ b/src/devices/cpu/upd78k/upd78k4d.cpp
@@ -670,7 +670,7 @@ offs_t upd78k4_disassembler::dasm_3c(std::ostream &stream, u8 op, offs_t pc, con
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 | SUPPORTED;
+ return 3 | STEP_COND | SUPPORTED;
}
else
return dasm_illegal2(stream, 0x3d, op2);
@@ -783,7 +783,7 @@ offs_t upd78k4_disassembler::dasm_3c(std::ostream &stream, u8 op, offs_t pc, con
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 | SUPPORTED;
+ return 5 | STEP_COND | SUPPORTED;
}
else
return dasm_illegal3(stream, 0x3c, 0x08, op3);