summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/debug/debugcmd.cpp
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2021-10-14 08:00:04 +1100
committer Vas Crabb <vas@vastheman.com>2021-10-14 08:00:04 +1100
commit96ca1dbd965df08ed4ab1f23053690c9ce540f94 (patch)
tree7c357aa9efe72e7e9c8b6e7084cec9fa859e214a /src/emu/debug/debugcmd.cpp
parent75f9660fa29d3d68a522fa96dbc92ef02baff2b8 (diff)
More user experience improvements:
frontend: Allow clicking the adjuster arrows on menu items. This allows things like video options and DIP switches to be configured using a mouse only. Also fixed a bug preventing paging menus with a mouse if the first item scrolled off the bottom is not selectable. debugger: Allow wplist and bplist to accept a CPU argument to list breakpoints/watchpoints for a single CPU only. debugger: Fixed some corner cases in address space syntax in memory accesses, and allowed memory region accesses to use tags relative to the visible CPU. emu/softlist.cpp: Ignore notes elements when loading software lists. It's effectively a comment that isn't a comment syntactically, it's being used for things that are not useful to display in the internal UI, and it slows down startup. docs: Updated three more pages of debugger documentation. Also updated more of the built-in debugger help. minimaws: Fixed up schema for software list notes, made sofware list notes display initially collapsed.
Diffstat (limited to 'src/emu/debug/debugcmd.cpp')
-rw-r--r--src/emu/debug/debugcmd.cpp160
1 files changed, 89 insertions, 71 deletions
diff --git a/src/emu/debug/debugcmd.cpp b/src/emu/debug/debugcmd.cpp
index 1d2bf4e13b6..e7ca864988d 100644
--- a/src/emu/debug/debugcmd.cpp
+++ b/src/emu/debug/debugcmd.cpp
@@ -252,7 +252,7 @@ debugger_commands::debugger_commands(running_machine& machine, debugger_cpu& cpu
m_console.register_command("bpclear", CMDFLAG_NONE, 0, 1, std::bind(&debugger_commands::execute_bpclear, this, _1));
m_console.register_command("bpdisable", CMDFLAG_NONE, 0, 1, std::bind(&debugger_commands::execute_bpdisenable, this, false, _1));
m_console.register_command("bpenable", CMDFLAG_NONE, 0, 1, std::bind(&debugger_commands::execute_bpdisenable, this, true, _1));
- m_console.register_command("bplist", CMDFLAG_NONE, 0, 0, std::bind(&debugger_commands::execute_bplist, this, _1));
+ m_console.register_command("bplist", CMDFLAG_NONE, 0, 1, std::bind(&debugger_commands::execute_bplist, this, _1));
m_console.register_command("wpset", CMDFLAG_NONE, 3, 5, std::bind(&debugger_commands::execute_wpset, this, -1, _1));
m_console.register_command("wp", CMDFLAG_NONE, 3, 5, std::bind(&debugger_commands::execute_wpset, this, -1, _1));
@@ -265,7 +265,7 @@ debugger_commands::debugger_commands(running_machine& machine, debugger_cpu& cpu
m_console.register_command("wpclear", CMDFLAG_NONE, 0, 1, std::bind(&debugger_commands::execute_wpclear, this, _1));
m_console.register_command("wpdisable", CMDFLAG_NONE, 0, 1, std::bind(&debugger_commands::execute_wpdisenable, this, false, _1));
m_console.register_command("wpenable", CMDFLAG_NONE, 0, 1, std::bind(&debugger_commands::execute_wpdisenable, this, true, _1));
- m_console.register_command("wplist", CMDFLAG_NONE, 0, 0, std::bind(&debugger_commands::execute_wplist, this, _1));
+ m_console.register_command("wplist", CMDFLAG_NONE, 0, 1, std::bind(&debugger_commands::execute_wplist, this, _1));
m_console.register_command("rpset", CMDFLAG_NONE, 1, 2, std::bind(&debugger_commands::execute_rpset, this, _1));
m_console.register_command("rp", CMDFLAG_NONE, 1, 2, std::bind(&debugger_commands::execute_rpset, this, _1));
@@ -337,8 +337,8 @@ debugger_commands::debugger_commands(running_machine& machine, debugger_cpu& cpu
m_console.register_command("dasm", CMDFLAG_NONE, 3, 5, std::bind(&debugger_commands::execute_dasm, this, _1));
- m_console.register_command("trace", CMDFLAG_NONE, 1, 4, std::bind(&debugger_commands::execute_trace, this, _1));
- m_console.register_command("traceover", CMDFLAG_NONE, 1, 4, std::bind(&debugger_commands::execute_traceover, this, _1));
+ m_console.register_command("trace", CMDFLAG_NONE, 1, 4, std::bind(&debugger_commands::execute_trace, this, _1, false));
+ m_console.register_command("traceover", CMDFLAG_NONE, 1, 4, std::bind(&debugger_commands::execute_trace, this, _1, true));
m_console.register_command("traceflush",CMDFLAG_NONE, 0, 0, std::bind(&debugger_commands::execute_traceflush, this, _1));
m_console.register_command("history", CMDFLAG_NONE, 0, 2, std::bind(&debugger_commands::execute_history, this, _1));
@@ -1816,29 +1816,45 @@ void debugger_commands::execute_bplist(const std::vector<std::string> &params)
{
int printed = 0;
std::string buffer;
-
- /* loop over all CPUs */
- for (device_t &device : device_enumerator(m_machine.root_device()))
- if (!device.debug()->breakpoint_list().empty())
- {
- m_console.printf("Device '%s' breakpoints:\n", device.tag());
-
- /* loop over the breakpoints */
- for (const auto &bpp : device.debug()->breakpoint_list())
+ auto const apply =
+ [this, &printed, &buffer] (device_t &device)
{
- debug_breakpoint &bp = *bpp.second;
- buffer = string_format("%c%4X @ %0*X", bp.enabled() ? ' ' : 'D', bp.index(), device.debug()->logaddrchars(), bp.address());
- if (std::string(bp.condition()).compare("1") != 0)
- buffer.append(string_format(" if %s", bp.condition()));
- if (std::string(bp.action()).compare("") != 0)
- buffer.append(string_format(" do %s", bp.action()));
- m_console.printf("%s\n", buffer);
- printed++;
- }
- }
+ if (!device.debug()->breakpoint_list().empty())
+ {
+ m_console.printf("Device '%s' breakpoints:\n", device.tag());
- if (printed == 0)
- m_console.printf("No breakpoints currently installed\n");
+ // loop over the breakpoints
+ for (const auto &bpp : device.debug()->breakpoint_list())
+ {
+ debug_breakpoint &bp = *bpp.second;
+ buffer = string_format("%c%4X @ %0*X", bp.enabled() ? ' ' : 'D', bp.index(), device.debug()->logaddrchars(), bp.address());
+ if (std::string(bp.condition()).compare("1") != 0)
+ buffer.append(string_format(" if %s", bp.condition()));
+ if (std::string(bp.action()).compare("") != 0)
+ buffer.append(string_format(" do %s", bp.action()));
+ m_console.printf("%s\n", buffer);
+ printed++;
+ }
+ }
+ };
+
+ if (!params.empty())
+ {
+ device_t *cpu;
+ if (!validate_cpu_parameter(params[0], cpu))
+ return;
+ apply(*cpu);
+ if (!printed)
+ m_console.printf("No breakpoints currently installed for CPU %s\n", cpu->tag());
+ }
+ else
+ {
+ // loop over all CPUs
+ for (device_t &device : device_enumerator(m_machine.root_device()))
+ apply(device);
+ if (!printed)
+ m_console.printf("No breakpoints currently installed\n");
+ }
}
@@ -1977,35 +1993,57 @@ void debugger_commands::execute_wplist(const std::vector<std::string> &params)
{
int printed = 0;
std::string buffer;
-
- /* loop over all CPUs */
- for (device_t &device : device_enumerator(m_machine.root_device()))
- for (int spacenum = 0; spacenum < device.debug()->watchpoint_space_count(); ++spacenum)
- if (!device.debug()->watchpoint_vector(spacenum).empty())
+ auto const apply =
+ [this, &printed, &buffer] (device_t &device)
{
- static const char *const types[] = { "unkn ", "read ", "write", "r/w " };
+ for (int spacenum = 0; spacenum < device.debug()->watchpoint_space_count(); ++spacenum)
+ {
+ if (!device.debug()->watchpoint_vector(spacenum).empty())
+ {
+ static const char *const types[] = { "unkn ", "read ", "write", "r/w " };
- m_console.printf("Device '%s' %s space watchpoints:\n", device.tag(),
- device.debug()->watchpoint_vector(spacenum).front()->space().name());
+ m_console.printf(
+ "Device '%s' %s space watchpoints:\n",
+ device.tag(),
+ device.debug()->watchpoint_vector(spacenum).front()->space().name());
- /* loop over the watchpoints */
- for (const auto &wp : device.debug()->watchpoint_vector(spacenum))
- {
- buffer = string_format("%c%4X @ %0*X-%0*X %s", wp->enabled() ? ' ' : 'D', wp->index(),
- wp->space().addrchars(), wp->address(),
- wp->space().addrchars(), wp->address() + wp->length() - 1,
- types[int(wp->type())]);
- if (std::string(wp->condition()).compare("1") != 0)
- buffer.append(string_format(" if %s", wp->condition()));
- if (std::string(wp->action()).compare("") != 0)
- buffer.append(string_format(" do %s", wp->action()));
- m_console.printf("%s\n", buffer);
- printed++;
+ // loop over the watchpoints
+ for (const auto &wp : device.debug()->watchpoint_vector(spacenum))
+ {
+ buffer = string_format(
+ "%c%4X @ %0*X-%0*X %s",
+ wp->enabled() ? ' ' : 'D', wp->index(),
+ wp->space().addrchars(), wp->address(),
+ wp->space().addrchars(), wp->address() + wp->length() - 1,
+ types[int(wp->type())]);
+ if (std::string(wp->condition()).compare("1") != 0)
+ buffer.append(string_format(" if %s", wp->condition()));
+ if (std::string(wp->action()).compare("") != 0)
+ buffer.append(string_format(" do %s", wp->action()));
+ m_console.printf("%s\n", buffer);
+ printed++;
+ }
+ }
}
- }
+ };
- if (printed == 0)
- m_console.printf("No watchpoints currently installed\n");
+ if (!params.empty())
+ {
+ device_t *cpu;
+ if (!validate_cpu_parameter(params[0], cpu))
+ return;
+ apply(*cpu);
+ if (!printed)
+ m_console.printf("No watchpoints currently installed for CPU %s\n", cpu->tag());
+ }
+ else
+ {
+ // loop over all CPUs
+ for (device_t &device : device_enumerator(m_machine.root_device()))
+ apply(device);
+ if (!printed)
+ m_console.printf("No watchpoints currently installed\n");
+ }
}
@@ -3576,11 +3614,11 @@ void debugger_commands::execute_dasm(const std::vector<std::string> &params)
/*-------------------------------------------------
- execute_trace_internal - functionality for
+ execute_trace - functionality for
trace over and trace info
-------------------------------------------------*/
-void debugger_commands::execute_trace_internal(const std::vector<std::string> &params, bool trace_over)
+void debugger_commands::execute_trace(const std::vector<std::string> &params, bool trace_over)
{
const char *action = nullptr;
bool detect_loops = true;
@@ -3648,26 +3686,6 @@ void debugger_commands::execute_trace_internal(const std::vector<std::string> &p
/*-------------------------------------------------
- execute_trace - execute the trace command
--------------------------------------------------*/
-
-void debugger_commands::execute_trace(const std::vector<std::string> &params)
-{
- execute_trace_internal(params, false);
-}
-
-
-/*-------------------------------------------------
- execute_traceover - execute the trace over command
--------------------------------------------------*/
-
-void debugger_commands::execute_traceover(const std::vector<std::string> &params)
-{
- execute_trace_internal(params, true);
-}
-
-
-/*-------------------------------------------------
execute_traceflush - execute the trace flush command
-------------------------------------------------*/