diff options
Diffstat (limited to 'src/osd/modules/debugger/win/disasmbasewininfo.c')
-rw-r--r-- | src/osd/modules/debugger/win/disasmbasewininfo.c | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/src/osd/modules/debugger/win/disasmbasewininfo.c b/src/osd/modules/debugger/win/disasmbasewininfo.c new file mode 100644 index 00000000000..e636bec57a7 --- /dev/null +++ b/src/osd/modules/debugger/win/disasmbasewininfo.c @@ -0,0 +1,273 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles, Vas Crabb +//============================================================ +// +// disasmbasewininfo.c - Win32 debug window handling +// +//============================================================ + +#include "disasmbasewininfo.h" + +#include "debugviewinfo.h" +#include "disasmviewinfo.h" + +#include "debugger.h" +#include "debug/debugcon.h" +#include "debug/debugcpu.h" + +//#include "winutf8.h" + + +disasmbasewin_info::disasmbasewin_info(debugger_windows_interface &debugger, bool is_main_console, LPCSTR title, WNDPROC handler) : + editwin_info(debugger, is_main_console, title, handler) +{ + if (!window()) + return; + + m_views[0].reset(global_alloc(disasmview_info(debugger, *this, window()))); + if ((m_views[0] == NULL) || !m_views[0]->is_valid()) + { + m_views[0].reset(); + return; + } + + // create the options menu + HMENU const optionsmenu = CreatePopupMenu(); + AppendMenu(optionsmenu, MF_ENABLED, ID_TOGGLE_BREAKPOINT, TEXT("Toggle breakpoint at cursor\tF9")); + AppendMenu(optionsmenu, MF_ENABLED, ID_DISABLE_BREAKPOINT, TEXT("Disable breakpoint at cursor\tShift+F9")); + AppendMenu(optionsmenu, MF_ENABLED, ID_RUN_TO_CURSOR, TEXT("Run to cursor\tF4")); + AppendMenu(optionsmenu, MF_DISABLED | MF_SEPARATOR, 0, TEXT("")); + AppendMenu(optionsmenu, MF_ENABLED, ID_SHOW_RAW, TEXT("Raw opcodes\tCtrl+R")); + AppendMenu(optionsmenu, MF_ENABLED, ID_SHOW_ENCRYPTED, TEXT("Encrypted opcodes\tCtrl+E")); + AppendMenu(optionsmenu, MF_ENABLED, ID_SHOW_COMMENTS, TEXT("Comments\tCtrl+M")); + AppendMenu(GetMenu(window()), MF_ENABLED | MF_POPUP, (UINT_PTR)optionsmenu, TEXT("Options")); + + // set up the view to track the initial expression + downcast<disasmview_info *>(m_views[0].get())->set_expression("curpc"); + m_views[0]->set_source_for_visible_cpu(); +} + + +disasmbasewin_info::~disasmbasewin_info() +{ +} + + +bool disasmbasewin_info::handle_key(WPARAM wparam, LPARAM lparam) +{ + if (GetAsyncKeyState(VK_CONTROL) & 0x8000) + { + switch (wparam) + { + case 'R': + SendMessage(window(), WM_COMMAND, ID_SHOW_RAW, 0); + return true; + + case 'E': + SendMessage(window(), WM_COMMAND, ID_SHOW_ENCRYPTED, 0); + return true; + + case 'N': + SendMessage(window(), WM_COMMAND, ID_SHOW_COMMENTS, 0); + return true; + } + } + + switch (wparam) + { + // ajg - steals the F4 from the global key handler - but ALT+F4 didn't work anyways ;) + case VK_F4: + SendMessage(window(), WM_COMMAND, ID_RUN_TO_CURSOR, 0); + return true; + + case VK_F9: + if (GetAsyncKeyState(VK_SHIFT) & 0x8000) + SendMessage(window(), WM_COMMAND, ID_DISABLE_BREAKPOINT, 0); + else + SendMessage(window(), WM_COMMAND, ID_TOGGLE_BREAKPOINT, 0); + return true; + + case VK_RETURN: + if (m_views[0]->cursor_visible() && m_views[0]->source_is_visible_cpu()) + { + SendMessage(window(), WM_COMMAND, ID_STEP, 0); + return true; + } + break; + } + + return editwin_info::handle_key(wparam, lparam); +} + + +void disasmbasewin_info::update_menu() +{ + editwin_info::update_menu(); + + disasmview_info *const dasmview = downcast<disasmview_info *>(m_views[0].get()); + HMENU const menu = GetMenu(window()); + + bool const disasm_cursor_visible = dasmview->cursor_visible(); + if (disasm_cursor_visible) + { + offs_t const address = dasmview->selected_address(); + device_debug *const debug = dasmview->source_device()->debug(); + + // first find an existing breakpoint at this address + device_debug::breakpoint *bp = debug->breakpoint_first(); + while ((bp != NULL) && (bp->address() != address)) + bp = bp->next(); + + if (bp == NULL) + { + ModifyMenu(menu, ID_TOGGLE_BREAKPOINT, MF_BYCOMMAND, ID_TOGGLE_BREAKPOINT, TEXT("Set breakpoint at cursor\tF9")); + ModifyMenu(menu, ID_DISABLE_BREAKPOINT, MF_BYCOMMAND, ID_DISABLE_BREAKPOINT, TEXT("Disable breakpoint at cursor\tShift+F9")); + } + else + { + ModifyMenu(menu, ID_TOGGLE_BREAKPOINT, MF_BYCOMMAND, ID_TOGGLE_BREAKPOINT, TEXT("Clear breakpoint at cursor\tF9")); + if (bp->enabled()) + ModifyMenu(menu, ID_DISABLE_BREAKPOINT, MF_BYCOMMAND, ID_DISABLE_BREAKPOINT, TEXT("Disable breakpoint at cursor\tShift+F9")); + else + ModifyMenu(menu, ID_DISABLE_BREAKPOINT, MF_BYCOMMAND, ID_DISABLE_BREAKPOINT, TEXT("Enable breakpoint at cursor\tShift+F9")); + } + EnableMenuItem(menu, ID_DISABLE_BREAKPOINT, MF_BYCOMMAND | (bp != NULL ? MF_ENABLED : MF_GRAYED)); + } + else + { + ModifyMenu(menu, ID_TOGGLE_BREAKPOINT, MF_BYCOMMAND, ID_TOGGLE_BREAKPOINT, TEXT("Toggle breakpoint at cursor\tF9")); + ModifyMenu(menu, ID_DISABLE_BREAKPOINT, MF_BYCOMMAND, ID_DISABLE_BREAKPOINT, TEXT("Disable breakpoint at cursor\tShift+F9")); + EnableMenuItem(menu, ID_DISABLE_BREAKPOINT, MF_BYCOMMAND | MF_GRAYED); + } + EnableMenuItem(menu, ID_TOGGLE_BREAKPOINT, MF_BYCOMMAND | (disasm_cursor_visible ? MF_ENABLED : MF_GRAYED)); + EnableMenuItem(menu, ID_RUN_TO_CURSOR, MF_BYCOMMAND | (disasm_cursor_visible ? MF_ENABLED : MF_GRAYED)); + + disasm_right_column const rightcol = dasmview->right_column(); + CheckMenuItem(menu, ID_SHOW_RAW, MF_BYCOMMAND | (rightcol == DASM_RIGHTCOL_RAW ? MF_CHECKED : MF_UNCHECKED)); + CheckMenuItem(menu, ID_SHOW_ENCRYPTED, MF_BYCOMMAND | (rightcol == DASM_RIGHTCOL_ENCRYPTED ? MF_CHECKED : MF_UNCHECKED)); + CheckMenuItem(menu, ID_SHOW_COMMENTS, MF_BYCOMMAND | (rightcol == DASM_RIGHTCOL_COMMENTS ? MF_CHECKED : MF_UNCHECKED)); +} + + +bool disasmbasewin_info::handle_command(WPARAM wparam, LPARAM lparam) +{ + disasmview_info *const dasmview = downcast<disasmview_info *>(m_views[0].get()); + + switch (HIWORD(wparam)) + { + // menu selections + case 0: + switch (LOWORD(wparam)) + { + case ID_TOGGLE_BREAKPOINT: + if (dasmview->cursor_visible()) + { + offs_t const address = dasmview->selected_address(); + device_debug *const debug = dasmview->source_device()->debug(); + INT32 bpindex = -1; + + // first find an existing breakpoint at this address + for (device_debug::breakpoint *bp = debug->breakpoint_first(); bp != NULL; bp = bp->next()) + { + if (address == bp->address()) + { + bpindex = bp->index(); + break; + } + } + + // if it doesn't exist, add a new one + if (dasmview->source_is_visible_cpu()) + { + astring command; + if (bpindex == -1) + command.printf("bpset 0x%X", address); + else + command.printf("bpclear 0x%X", bpindex); + debug_console_execute_command(machine(), command, 1); + } + else + { + if (bpindex == -1) + { + bpindex = debug->breakpoint_set(address, NULL, NULL); + debug_console_printf(machine(), "Breakpoint %X set\n", bpindex); + } + else + { + debug->breakpoint_clear(bpindex); + debug_console_printf(machine(), "Breakpoint %X cleared\n", bpindex); + } + machine().debug_view().update_all(); + debugger_refresh_display(machine()); + } + } + return true; + + case ID_DISABLE_BREAKPOINT: + if (dasmview->cursor_visible()) + { + offs_t const address = dasmview->selected_address(); + device_debug *const debug = dasmview->source_device()->debug(); + + // first find an existing breakpoint at this address + device_debug::breakpoint *bp = debug->breakpoint_first(); + while ((bp != NULL) && (bp->address() != address)) + bp = bp->next(); + + // if it doesn't exist, add a new one + if (bp != NULL) + { + if (dasmview->source_is_visible_cpu()) + { + astring command; + command.printf(bp->enabled() ? "bpdisable 0x%X" : "bpenable 0x%X", (UINT32)bp->index()); + debug_console_execute_command(machine(), command, 1); + } + else + { + debug->breakpoint_enable(bp->index(), !bp->enabled()); + debug_console_printf(machine(), "Breakpoint %X %s\n", (UINT32)bp->index(), bp->enabled() ? "enabled" : "disabled"); + machine().debug_view().update_all(); + debugger_refresh_display(machine()); + } + } + } + return true; + + case ID_RUN_TO_CURSOR: + if (dasmview->cursor_visible()) + { + offs_t const address = dasmview->selected_address(); + if (dasmview->source_is_visible_cpu()) + { + astring command; + command.printf("go 0x%X", address); + debug_console_execute_command(machine(), command, 1); + } + else + { + dasmview->source_device()->debug()->go(address); + } + } + return true; + + case ID_SHOW_RAW: + dasmview->set_right_column(DASM_RIGHTCOL_RAW); + recompute_children(); + return true; + + case ID_SHOW_ENCRYPTED: + dasmview->set_right_column(DASM_RIGHTCOL_ENCRYPTED); + recompute_children(); + return true; + + case ID_SHOW_COMMENTS: + dasmview->set_right_column(DASM_RIGHTCOL_COMMENTS); + recompute_children(); + return true; + } + break; + } + return editwin_info::handle_command(wparam, lparam); +} |