disasmwin_info::disasmwin_info(debugger_windows_interface &debugger) : disasmbasewin_info(debugger, false, "Disassembly", NULL), m_combownd(NULL) { if ((window() == NULL) || (m_views[0] == NULL)) return; // set up the view to track the initial expression set_edit_defstr("curpc"); set_editwnd_text("curpc"); editwnd_select_all(); // create a combo box m_combownd = m_views[0]->create_source_combobox(window(), (LONG_PTR)this); // set the caption update_caption(); // recompute the children once to get the maxwidth recompute_children(); // position the window and recompute children again SetWindowPos(window(), HWND_TOP, 100, 100, maxwidth(), 200, SWP_SHOWWINDOW); recompute_children(); // mark the edit box as the default focus and set it set_default_focus(); }
memorywin_info::memorywin_info(debugger_windows_interface &debugger) : editwin_info(debugger, false, "Memory", NULL), m_combownd(NULL) { if (!window()) return; m_views[0].reset(global_alloc(memoryview_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_1_BYTE_CHUNKS, TEXT("1-byte chunks\tCtrl+1")); AppendMenu(optionsmenu, MF_ENABLED, ID_2_BYTE_CHUNKS, TEXT("2-byte chunks\tCtrl+2")); AppendMenu(optionsmenu, MF_ENABLED, ID_4_BYTE_CHUNKS, TEXT("4-byte chunks\tCtrl+4")); AppendMenu(optionsmenu, MF_ENABLED, ID_8_BYTE_CHUNKS, TEXT("8-byte chunks\tCtrl+8")); AppendMenu(optionsmenu, MF_DISABLED | MF_SEPARATOR, 0, TEXT("")); AppendMenu(optionsmenu, MF_ENABLED, ID_LOGICAL_ADDRESSES, TEXT("Logical Addresses\tCtrl+L")); AppendMenu(optionsmenu, MF_ENABLED, ID_PHYSICAL_ADDRESSES, TEXT("Physical Addresses\tCtrl+Y")); AppendMenu(optionsmenu, MF_DISABLED | MF_SEPARATOR, 0, TEXT("")); AppendMenu(optionsmenu, MF_ENABLED, ID_REVERSE_VIEW, TEXT("Reverse View\tCtrl+R")); AppendMenu(optionsmenu, MF_DISABLED | MF_SEPARATOR, 0, TEXT("")); AppendMenu(optionsmenu, MF_ENABLED, ID_INCREASE_MEM_WIDTH, TEXT("Increase bytes per line\tCtrl+P")); AppendMenu(optionsmenu, MF_ENABLED, ID_DECREASE_MEM_WIDTH, TEXT("Decrease bytes per line\tCtrl+O")); AppendMenu(GetMenu(window()), MF_ENABLED | MF_POPUP, (UINT_PTR)optionsmenu, TEXT("Options")); // set up the view to track the initial expression downcast<memoryview_info *>(m_views[0].get())->set_expression("0"); set_edit_defstr("0"); set_editwnd_text("0"); editwnd_select_all(); // create a combo box m_views[0]->set_source_for_visible_cpu(); m_combownd = m_views[0]->create_source_combobox(window(), (LONG_PTR)this); // set the caption update_caption(); // recompute the children once to get the maxwidth recompute_children(); // position the window and recompute children again SetWindowPos(window(), HWND_TOP, 100, 100, maxwidth(), 200, SWP_SHOWWINDOW); recompute_children(); // mark the edit box as the default focus and set it set_default_focus(); }
void debugwin_info::prev_view(debugview_info *curview) { // count the number of views int numviews; for (numviews = 0; numviews < MAX_VIEWS; numviews++) { if (m_views[numviews] == NULL) break; } // if we have a curview, find out its index int curindex = 1; if (curview) { for (curindex = numviews - 1; curindex > 0; curindex--) { if (m_views[curindex] == curview) break; } if (curindex < 0) curindex = 1; } // loop until we find someone to take focus while (1) { // advance to the previous index curindex--; if (curindex < -1) curindex = numviews - 1; if (curindex < 0 && set_default_focus()) { // negative numbers mean the focuswnd break; } else if (curindex >= 0 && m_views[curindex] != NULL && m_views[curindex]->cursor_supported()) { // positive numbers mean a view m_views[curindex]->set_focus(); break; } } }
bool disasmwin_info::handle_command(WPARAM wparam, LPARAM lparam) { switch (HIWORD(wparam)) { // combo box selection changed case CBN_SELCHANGE: { int const sel = SendMessage((HWND)lparam, CB_GETCURSEL, 0, 0); if (sel != CB_ERR) { m_views[0]->set_source_index(sel); update_caption(); // reset the focus set_default_focus(); return true; } break; } } return disasmbasewin_info::handle_command(wparam, lparam); }
bool memorywin_info::handle_command(WPARAM wparam, LPARAM lparam) { memoryview_info *const memview = downcast<memoryview_info *>(m_views[0].get()); switch (HIWORD(wparam)) { // combo box selection changed case CBN_SELCHANGE: { int const sel = SendMessage((HWND)lparam, CB_GETCURSEL, 0, 0); if (sel != CB_ERR) { memview->set_source_index(sel); update_caption(); // reset the focus set_default_focus(); return true; } break; } // menu selections case 0: switch (LOWORD(wparam)) { case ID_1_BYTE_CHUNKS: memview->set_bytes_per_chunk(1); return true; case ID_2_BYTE_CHUNKS: memview->set_bytes_per_chunk(2); return true; case ID_4_BYTE_CHUNKS: memview->set_bytes_per_chunk(4); return true; case ID_8_BYTE_CHUNKS: memview->set_bytes_per_chunk(8); return true; case ID_LOGICAL_ADDRESSES: memview->set_physical(false); return true; case ID_PHYSICAL_ADDRESSES: memview->set_physical(true); return true; case ID_REVERSE_VIEW: memview->set_reverse(!memview->reverse()); return true; case ID_INCREASE_MEM_WIDTH: memview->set_chunks_per_row(memview->chunks_per_row() + 1); recompute_children(); return true; case ID_DECREASE_MEM_WIDTH: memview->set_chunks_per_row(memview->chunks_per_row() - 1); recompute_children(); return true; } break; } return editwin_info::handle_command(wparam, lparam); }
consolewin_info::consolewin_info(debugger_windows_interface &debugger) : disasmbasewin_info(debugger, true, "Debug", NULL), m_devices_menu(NULL) { if ((window() == NULL) || (m_views[0] == NULL)) goto cleanup; // create the views m_views[1].reset(global_alloc(debugview_info(debugger, *this, window(), DVT_STATE))); if (!m_views[1]->is_valid()) goto cleanup; m_views[2].reset(global_alloc(debugview_info(debugger, *this, window(), DVT_CONSOLE))); if (!m_views[2]->is_valid()) goto cleanup; { // Add image menu only if image devices exist image_interface_iterator iter(machine().root_device()); device_image_interface *img = iter.first(); if (img != NULL) { m_devices_menu = CreatePopupMenu(); for ( ; img != NULL; img = iter.next()) { astring temp; temp.format("%s : %s", img->device().name(), img->exists() ? img->filename() : "[no image]"); TCHAR *tc_buf = tstring_from_utf8(temp.c_str()); if (tc_buf != NULL) { AppendMenu(m_devices_menu, MF_ENABLED, 0, tc_buf); osd_free(tc_buf); } } AppendMenu(GetMenu(window()), MF_ENABLED | MF_POPUP, (UINT_PTR)m_devices_menu, TEXT("Images")); } // get the work bounds RECT work_bounds, bounds; SystemParametersInfo(SPI_GETWORKAREA, 0, &work_bounds, 0); // adjust the min/max sizes for the window style bounds.top = bounds.left = 0; bounds.right = bounds.bottom = EDGE_WIDTH + m_views[1]->maxwidth() + (2 * EDGE_WIDTH) + 100 + EDGE_WIDTH; AdjustWindowRectEx(&bounds, DEBUG_WINDOW_STYLE, FALSE, DEBUG_WINDOW_STYLE_EX); set_minwidth(bounds.right - bounds.left); bounds.top = bounds.left = 0; bounds.right = bounds.bottom = EDGE_WIDTH + m_views[1]->maxwidth() + (2 * EDGE_WIDTH) + MAX(m_views[0]->maxwidth(), m_views[2]->maxwidth()) + EDGE_WIDTH; AdjustWindowRectEx(&bounds, DEBUG_WINDOW_STYLE, FALSE, DEBUG_WINDOW_STYLE_EX); set_maxwidth(bounds.right - bounds.left); // position the window at the bottom-right int const bestwidth = MIN(maxwidth(), work_bounds.right - work_bounds.left); int const bestheight = MIN(500, work_bounds.bottom - work_bounds.top); SetWindowPos(window(), HWND_TOP, work_bounds.right - bestwidth, work_bounds.bottom - bestheight, bestwidth, bestheight, SWP_SHOWWINDOW); } // recompute the children set_cpu(*debug_cpu_get_visible_cpu(machine())); // mark the edit box as the default focus and set it set_default_focus(); return; cleanup: m_views[2].reset(); m_views[1].reset(); m_views[0].reset(); }
LRESULT debugwin_info::window_proc(UINT message, WPARAM wparam, LPARAM lparam) { // handle a few messages switch (message) { // paint: draw bezels as necessary case WM_PAINT: { PAINTSTRUCT pstruct; HDC dc = BeginPaint(m_wnd, &pstruct); draw_contents(dc); EndPaint(m_wnd, &pstruct); break; } // keydown: handle debugger keys case WM_KEYDOWN: if (handle_key(wparam, lparam)) set_ignore_char_lparam(lparam); break; // char: ignore chars associated with keys we've handled case WM_CHAR: if (check_ignore_char_lparam(lparam)) { if (waiting_for_debugger() || !seq_pressed()) return DefWindowProc(m_wnd, message, wparam, lparam); } break; // activate: set the focus case WM_ACTIVATE: if (wparam != WA_INACTIVE) set_default_focus(); break; // get min/max info: set the minimum window size case WM_GETMINMAXINFO: { MINMAXINFO *minmax = (MINMAXINFO *)lparam; minmax->ptMinTrackSize.x = m_minwidth; minmax->ptMinTrackSize.y = m_minheight; minmax->ptMaxSize.x = minmax->ptMaxTrackSize.x = m_maxwidth; minmax->ptMaxSize.y = minmax->ptMaxTrackSize.y = m_maxheight; break; } // sizing: recompute child window locations case WM_SIZE: case WM_SIZING: recompute_children(); InvalidateRect(m_wnd, NULL, FALSE); break; // mouse wheel: forward to the first view case WM_MOUSEWHEEL: { static int units_carryover = 0; UINT lines_per_click; if (!SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &lines_per_click, 0)) lines_per_click = 3; int const units = GET_WHEEL_DELTA_WPARAM(wparam) + units_carryover; int const clicks = units / WHEEL_DELTA; units_carryover = units % WHEEL_DELTA; int const delta = clicks * lines_per_click; int viewnum = 0; POINT point; // figure out which view we are hovering over GetCursorPos(&point); ScreenToClient(m_wnd, &point); HWND const child = ChildWindowFromPoint(m_wnd, point); if (child) { for (viewnum = 0; viewnum < MAX_VIEWS; viewnum++) { if ((m_views[viewnum] != NULL) && m_views[viewnum]->owns_window(child)) break; } if (viewnum == MAX_VIEWS) break; } // send the appropriate message to this view's scrollbar if (m_views[viewnum] != NULL) m_views[viewnum]->send_vscroll(delta); break; } // activate: set the focus case WM_INITMENU: update_menu(); break; // command: handle a comment case WM_COMMAND: if (!handle_command(wparam, lparam)) return DefWindowProc(m_wnd, message, wparam, lparam); break; // close: close the window if it's not the main console case WM_CLOSE: if (m_is_main_console) { debugger().hide_all(); debug_cpu_get_visible_cpu(machine())->debug()->go(); } else { destroy(); } break; // destroy: close down the window case WM_NCDESTROY: m_wnd = NULL; debugger().remove_window(*this); break; // everything else: defaults default: return DefWindowProc(m_wnd, message, wparam, lparam); } return 0; }
bool debugwin_info::handle_command(WPARAM wparam, LPARAM lparam) { if (HIWORD(wparam) == 0) { switch (LOWORD(wparam)) { case ID_NEW_MEMORY_WND: debugger().create_memory_window(); return true; case ID_NEW_DISASM_WND: debugger().create_disasm_window(); return true; case ID_NEW_LOG_WND: debugger().create_log_window(); return true; case ID_NEW_POINTS_WND: debugger().create_points_window(); return true; case ID_RUN_AND_HIDE: debugger().hide_all(); case ID_RUN: debug_cpu_get_visible_cpu(machine())->debug()->go(); return true; case ID_NEXT_CPU: debug_cpu_get_visible_cpu(machine())->debug()->go_next_device(); return true; case ID_RUN_VBLANK: debug_cpu_get_visible_cpu(machine())->debug()->go_vblank(); return true; case ID_RUN_IRQ: debug_cpu_get_visible_cpu(machine())->debug()->go_interrupt(); return true; case ID_STEP: debug_cpu_get_visible_cpu(machine())->debug()->single_step(); return true; case ID_STEP_OVER: debug_cpu_get_visible_cpu(machine())->debug()->single_step_over(); return true; case ID_STEP_OUT: debug_cpu_get_visible_cpu(machine())->debug()->single_step_out(); return true; case ID_HARD_RESET: machine().schedule_hard_reset(); return true; case ID_SOFT_RESET: machine().schedule_soft_reset(); debug_cpu_get_visible_cpu(machine())->debug()->go(); return true; case ID_EXIT: set_default_focus(); machine().schedule_exit(); return true; } } return false; }