diff options
author | 2022-03-27 14:23:03 -0400 | |
---|---|---|
committer | 2022-03-27 14:29:51 -0400 | |
commit | c7597225b4f0a3531d53dd806048b136956eb850 (patch) | |
tree | 3ed5b758cbd0a94a43d9c6fe9f83f402b169657d /src/devices/cpu/upd78k | |
parent | c3162e739d625d31ca207ab8b591ea87c5f1fe03 (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.cpp | 30 | ||||
-rw-r--r-- | src/devices/cpu/upd78k/upd78k1d.cpp | 17 | ||||
-rw-r--r-- | src/devices/cpu/upd78k/upd78k3d.cpp | 19 | ||||
-rw-r--r-- | src/devices/cpu/upd78k/upd78k4d.cpp | 4 |
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); |