/**************************************************************************** * * * Project64 - A Nintendo 64 emulator. * * http://www.pj64-emu.com/ * * Copyright (C) 2012 Project64. All rights reserved. * * * * License: * * GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html * * * ****************************************************************************/ #include "stdafx.h" #include "DebuggerUI.h" CDebugTlb::CDebugTlb(CDebuggerUI * debugger) : CDebugDialog(debugger) { } CDebugTlb::~CDebugTlb() { } LRESULT CDebugTlb::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) { DlgSavePos_Init(DebuggerUI_TLBPos); LV_COLUMN col; float DPIScale = CClientDC(m_hWnd).GetDeviceCaps(LOGPIXELSX) / 96.0f; col.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; col.fmt = LVCFMT_LEFT; col.pszText = L"Index"; col.cx = (int)(40 * DPIScale); col.iSubItem = 0; ListView_InsertColumn(GetDlgItem(IDC_LIST), 0, &col); col.pszText = L"Page Mask"; col.cx = (int)(90 * DPIScale); col.iSubItem = 1; ListView_InsertColumn(GetDlgItem(IDC_LIST), 1, &col); col.pszText = L"Entry Hi"; col.cx = (int)(90 * DPIScale); col.iSubItem = 2; ListView_InsertColumn(GetDlgItem(IDC_LIST), 2, &col); col.pszText = L"Entry Lo0"; col.cx = (int)(90 * DPIScale); col.iSubItem = 3; ListView_InsertColumn(GetDlgItem(IDC_LIST), 3, &col); col.pszText = L"Entry Lo1"; col.cx = (int)(90 * DPIScale); col.iSubItem = 4; ListView_InsertColumn(GetDlgItem(IDC_LIST), 4, &col); col.pszText = L"Index"; col.cx = (int)(40 * DPIScale); col.iSubItem = 0; ListView_InsertColumn(GetDlgItem(IDC_LIST2), 0, &col); col.pszText = L"Valid"; col.cx = (int)(40 * DPIScale); col.iSubItem = 1; ListView_InsertColumn(GetDlgItem(IDC_LIST2), 1, &col); col.pszText = L"Dirty"; col.cx = (int)(40 * DPIScale); col.iSubItem = 2; ListView_InsertColumn(GetDlgItem(IDC_LIST2), 2, &col); col.pszText = L"Rule"; col.cx = (int)(270 * DPIScale); col.iSubItem = 3; ListView_InsertColumn(GetDlgItem(IDC_LIST2), 3, &col); RefreshTLBWindow(); SendMessage(GetDlgItem(IDC_TLB_ENTRIES), BM_SETCHECK, BST_CHECKED, 0); LoadWindowPos(); WindowCreated(); return TRUE; } void CDebugTlb::OnExitSizeMove(void) { SaveWindowPos(0); } LRESULT CDebugTlb::OnClicked(WORD /*wNotifyCode*/, WORD wID, HWND, BOOL& /*bHandled*/) { switch (wID) { case IDCANCEL: EndDialog(0); break; case IDC_TLB_ENTRIES: ::ShowWindow(GetDlgItem(IDC_LIST), SW_SHOW); ::ShowWindow(GetDlgItem(IDC_LIST2), SW_HIDE); break; case IDC_TLB_RULES: ::ShowWindow(GetDlgItem(IDC_LIST), SW_HIDE); ::ShowWindow(GetDlgItem(IDC_LIST2), SW_SHOW); break; } return FALSE; } void CDebugTlb::RefreshTLBWindow(void) { if (m_hWnd == NULL) { return; } HWND hList = GetDlgItem(IDC_LIST); wchar_t Output[100], OldText[100]; LV_ITEM item, OldItem; int count; CTLB::TLB_ENTRY * tlb = g_TLB->m_tlb; for (count = 0; count < 32; count++) { swprintf(Output, sizeof(Output), L"0x%02X", count); item.mask = LVIF_TEXT; item.iItem = count; item.pszText = Output; item.iSubItem = 0; OldItem.mask = LVIF_TEXT; OldItem.iItem = count; OldItem.pszText = OldText; OldItem.cchTextMax = sizeof(OldText) - 1; OldItem.iSubItem = 0; if (ListView_GetItemCount(hList) <= count) { ListView_InsertItem(hList, &item); } else { ListView_GetItem(hList, &OldItem); if (wcscmp(item.pszText, OldItem.pszText) != 0) { ListView_SetItem(hList, &item); } } if (tlb[count].EntryDefined) { swprintf(Output, sizeof(Output), L"0x%08X", tlb[count].PageMask.Value); } else { wcscpy(Output, L"................"); } item.iSubItem = 1; OldItem.iSubItem = 1; ListView_GetItem(hList, &OldItem); if (wcscmp(item.pszText, OldItem.pszText) != 0) { ListView_SetItem(hList, &item); } if (tlb[count].EntryDefined) { swprintf(Output, sizeof(Output), L"0x%08X", tlb[count].EntryHi.Value); } else { wcscpy(Output, L"................"); } item.iSubItem = 2; OldItem.iSubItem = 2; ListView_GetItem(hList, &OldItem); if (wcscmp(item.pszText, OldItem.pszText) != 0) { ListView_SetItem(hList, &item); } if (tlb[count].EntryDefined) { swprintf(Output, sizeof(Output), L"0x%08X", tlb[count].EntryLo0.Value); } else { wcscpy(Output, L"................"); } item.iSubItem = 3; OldItem.iSubItem = 3; ListView_GetItem(hList, &OldItem); if (wcscmp(item.pszText, OldItem.pszText) != 0) { ListView_SetItem(hList, &item); } if (tlb[count].EntryDefined) { swprintf(Output, sizeof(Output), L"0x%08X", tlb[count].EntryLo1.Value); } else { wcscpy(Output, L"................"); } item.iSubItem = 4; OldItem.iSubItem = 4; ListView_GetItem(hList, &OldItem); if (wcscmp(item.pszText, OldItem.pszText) != 0) { ListView_SetItem(hList, &item); } } CTLB::FASTTLB * FastTlb = g_TLB->m_FastTlb; hList = GetDlgItem(IDC_LIST2); for (count = 0; count < 64; count++) { swprintf(Output, sizeof(Output), L"0x%02X", count); item.mask = LVIF_TEXT; item.iItem = count; item.pszText = Output; item.iSubItem = 0; OldItem.mask = LVIF_TEXT; OldItem.iItem = count; OldItem.pszText = OldText; OldItem.cchTextMax = sizeof(OldText) - 1; OldItem.iSubItem = 0; if (ListView_GetItemCount(hList) <= count) { item.iItem = ListView_InsertItem(hList, &item); } else { ListView_GetItem(hList, &OldItem); if (wcscmp(item.pszText, OldItem.pszText) != 0) { ListView_SetItem(hList, &item); } } if (FastTlb[count].ValidEntry) { swprintf(Output, sizeof(Output), L"%s", FastTlb[count].VALID ? L"Yes" : L"No"); } else { wcscpy(Output, L"................"); } item.iSubItem = 1; OldItem.iSubItem = 1; ListView_GetItem(hList, &OldItem); if (wcscmp(item.pszText, OldItem.pszText) != 0) { ListView_SetItem(hList, &item); } if (FastTlb[count].ValidEntry && FastTlb[count].VALID) { swprintf(Output, sizeof(Output), L"%s", FastTlb[count].DIRTY ? L"Yes" : L"No"); } else { wcscpy(Output, L"................"); } item.iSubItem = 2; OldItem.iSubItem = 2; ListView_GetItem(hList, &OldItem); if (wcscmp(item.pszText, OldItem.pszText) != 0) { ListView_SetItem(hList, &item); } if (FastTlb[count].ValidEntry && FastTlb[count].VALID) { swprintf(Output, sizeof(Output), L"%08X:%08X -> %08X:%08X", FastTlb[count].VSTART, FastTlb[count].VEND, FastTlb[count].PHYSSTART, FastTlb[count].PHYSEND); } else { wcscpy(Output, L"................"); } item.iSubItem = 3; OldItem.iSubItem = 3; ListView_GetItem(hList, &OldItem); if (wcscmp(item.pszText, OldItem.pszText) != 0) { ListView_SetItem(hList, &item); } } }