/* * Project 64 - A Nintendo 64 emulator. * * (c) Copyright 2001 zilmar (zilmar@emulation64.com) and * Jabo (jabo@emulation64.com). * * pj64 homepage: www.pj64.net * * Permission to use, copy, modify and distribute Project64 in both binary and * source form, for non-commercial purposes, is hereby granted without fee, * providing that this license information and copyright notice appear with * all copies and any derived work. * * This software is provided 'as-is', without any express or implied * warranty. In no event shall the authors be held liable for any damages * arising from the use of this software. * * Project64 is freeware for PERSONAL USE only. Commercial users should * seek permission of the copyright holders first. Commercial use includes * charging money for Project64 or software derived from Project64. * * The copyright holders request that bug fixes and improvements to the code * should be forwarded to them so if they want them. * */ #include "main.h" #include "CPU.h" #include "debugger.h" #include "plugin.h" int CheckForR4300iBPoint ( DWORD Location ) { return FALSE; } int NoOfBpoints; #ifdef OLD_CODE #if (!defined(EXTERNAL_RELEASE)) #include #include #include #include "main.h" #include "CPU.h" #include "debugger.h" #include "plugin.h" #define IDC_LIST 100 #define IDC_TAB_CONTROL 101 #define IDC_REMOVE_BUTTON 103 #define IDC_REMOVEALL_BUTTON 104 #define IDC_LOCATION_EDIT 105 #define IDC_FUNCTION_COMBO 106 void BPoint_AddButtonPressed ( void); void Create_BPoint_Window ( int ); void DrawBPItem ( LPARAM ); void HideBPointPanel ( int Panel); void Paint_BPoint_Win ( HWND ); void __cdecl RefreshBreakPoints (void); void Setup_BPoint_Win ( HWND ); void ShowBPointPanel ( int Panel); LRESULT CALLBACK BPoint_Proc ( HWND, UINT, WPARAM, LPARAM ); LRESULT CALLBACK RefreshBPProc ( HWND, UINT, WPARAM, LPARAM ); static HWND BPoint_Win_hDlg, hTab, hList, hStatic, hR4300iLocation, hFunctionlist, hAddButton, hRemoveButton, hRemoveAllButton; static BOOL InBPWindow = FALSE; static FARPROC RefProc; int RSPBP_count; int Add_R4300iBPoint( DWORD Location, int Confirm ) { int count; if (NoOfBpoints == MaxBPoints) { DisplayError("Max amount of Break Points set"); return FALSE; } for (count = 0; count < NoOfBpoints; count ++) { if (BPoint[count].Location == Location) { DisplayError("You already have this Break Point"); return FALSE; } } if (Confirm) { char Message[150], Label[100]; int Response; sprintf(Label,"%s", LabelName(Location)); sprintf(Message,"0x%08X", Location); if(strcmp(Label,Message) == 0) { sprintf(Message,"Break when:\n\nR4300i's Program Counter = 0x%08X\n\nIs this correct?", Location); } else { sprintf(Message,"Break on:\n\n%s (R4300i PC = 0x%08X)\n\nIs this correct?", Label, Location); } Response = MessageBox(BPoint_Win_hDlg, Message, AppName, MB_YESNO | MB_ICONINFORMATION); if (Response == IDNO) { return FALSE; } } BPoint[NoOfBpoints].Location = Location; NoOfBpoints += 1; RefreshBreakPoints(); /*if (CPU_Action.Stepping || hMipsCPU == NULL) { ClearAllx86Code(); } else { CPU_Action.ResetX86Code = TRUE; CPU_Action.do_or_check_something += 1; }*/ return TRUE; } void BPoint_AddButtonPressed (void) { DWORD Selected, Location; char Title[10]; TC_ITEM item; item.mask = TCIF_PARAM; TabCtrl_GetItem( hTab, TabCtrl_GetCurSel( hTab ), &item ); switch( item.lParam ) { case R4300i_BP: GetWindowText(hR4300iLocation,Title,sizeof(Title)); if (!Add_R4300iBPoint(AsciiToHex(Title),TRUE )) { SendMessage(hR4300iLocation,EM_SETSEL,(WPARAM)0,(LPARAM)-1); SetFocus(hR4300iLocation); } break; case R4300i_FUNCTION: Selected = SendMessage(hFunctionlist,CB_GETCURSEL,0,0); Location = SendMessage(hFunctionlist,CB_GETITEMDATA,(WPARAM)Selected,0); Add_R4300iBPoint(Location,TRUE ); SetFocus(hFunctionlist); break; case RSP_BP: if (RspDebug.UseBPoints) { RspDebug.Add_BPoint(); } break; } } LRESULT CALLBACK BPoint_Proc (HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static RECT rcDisp; static int CurrentPanel = R4300i_BP; int selected; TC_ITEM item; switch (uMsg) { case WM_INITDIALOG: BPoint_Win_hDlg = hDlg; Setup_BPoint_Win( hDlg ); RefreshBreakPoints(); break; case WM_MOVE: StoreCurrentWinPos("Break Point",hDlg); break; case WM_SIZE: GetClientRect( hDlg, &rcDisp); TabCtrl_AdjustRect( hTab, FALSE, &rcDisp ); break; case WM_PAINT: Paint_BPoint_Win( hDlg ); return TRUE; case WM_NOTIFY: switch (((NMHDR *)lParam)->code) { case TCN_SELCHANGE: InvalidateRect( hTab, &rcDisp, TRUE ); HideBPointPanel (CurrentPanel); item.mask = TCIF_PARAM; TabCtrl_GetItem( hTab, TabCtrl_GetCurSel( hTab ), &item ); CurrentPanel = item.lParam; InvalidateRect( hStatic, NULL, FALSE ); ShowBPointPanel ( CurrentPanel ); break; } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: BPoint_AddButtonPressed(); break; case IDC_REMOVE_BUTTON: selected = SendMessage(hList,LB_GETCURSEL,0,0); if (selected < NoOfBpoints) { DWORD location; location = SendMessage(hList,LB_GETITEMDATA,selected,0); RemoveR4300iBreakPoint(location); break; } selected -= NoOfBpoints; if (selected < RSPBP_count) { RspDebug.RemoveBpoint(hList,SendMessage(hList,LB_GETCURSEL,0,0)); break; } DisplayError("what is this BP"); break; case IDC_REMOVEALL_BUTTON: NoOfBpoints = 0; if (RspDebug.UseBPoints) { RspDebug.RemoveAllBpoint(); } RefreshBreakPoints(); RefreshR4300iCommands(); break; case IDCANCEL: CurrentPanel = R4300i_BP; EndDialog( hDlg, IDCANCEL ); break; } break; default: return FALSE; } return TRUE; } int CheckForR4300iBPoint ( DWORD Location ) { int count; for (count = 0; count < NoOfBpoints; count ++){ if (BPoint[count].Location == Location) { return TRUE; } } return FALSE; } void Create_BPoint_Window (int Child) { DWORD ThreadID; if (Child) { InBPWindow = TRUE; DialogBox( hInst, "BLANK", NULL,(DLGPROC) BPoint_Proc ); InBPWindow = FALSE; } else { if (!InBPWindow) { CloseHandle(CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Create_BPoint_Window, (LPVOID)TRUE,0, &ThreadID)); } else { BringWindowToTop(BPoint_Win_hDlg); } } } void __cdecl Enter_BPoint_Window ( void ) { Create_BPoint_Window ( FALSE ); } void HideBPointPanel ( int Panel) { switch( Panel ) { case R4300i_BP: ShowWindow(hR4300iLocation, FALSE); break; case R4300i_FUNCTION: ShowWindow(hFunctionlist, FALSE); break; case RSP_BP: if (RspDebug.UseBPoints) { RspDebug.HideBPPanel(); } break; } } void Paint_BPoint_Win (HWND hDlg) { RECT rcBox; PAINTSTRUCT ps; HFONT hOldFont; int OldBkMode; BeginPaint( hDlg, &ps ); rcBox.left = 5; rcBox.top = 175; rcBox.right = 255; rcBox.bottom = 290; DrawEdge( ps.hdc, &rcBox, EDGE_RAISED, BF_RECT ); rcBox.left = 8; rcBox.top = 178; rcBox.right = 252; rcBox.bottom = 287; DrawEdge( ps.hdc, &rcBox, EDGE_ETCHED, BF_RECT ); hOldFont = SelectObject(ps.hdc,GetStockObject(DEFAULT_GUI_FONT)); OldBkMode = SetBkMode( ps.hdc, TRANSPARENT ); TextOut( ps.hdc, 9,159,"Breakpoints: ",13); SelectObject( ps.hdc,hOldFont ); SetBkMode( ps.hdc, OldBkMode ); EndPaint( hDlg, &ps ); } void __cdecl RefreshBreakPoints (void) { char Message[100]; int count; if (!InBPWindow) { return; } SendMessage(hList,LB_RESETCONTENT,0,0); for (count = 0; count < NoOfBpoints; count ++ ) { sprintf(Message," at 0x%08X (r4300i)", BPoint[count].Location); SendMessage(hList,LB_ADDSTRING,0,(LPARAM)Message); SendMessage(hList,LB_SETITEMDATA,count,(LPARAM)BPoint[count].Location); } count = SendMessage(hList,LB_GETCOUNT,0,0); if (RspDebug.UseBPoints) { RspDebug.RefreshBpoints(hList); } RSPBP_count = SendMessage(hList,LB_GETCOUNT,0,0) - count; if (SendMessage(hList,LB_GETCOUNT,0,0) > 0) { EnableWindow( hRemoveButton, TRUE ); EnableWindow( hRemoveAllButton, TRUE ); } } LRESULT CALLBACK RefreshBPProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { PAINTSTRUCT ps; RECT rcBox; HFONT hOldFont; int OldBkMode; TC_ITEM item; switch( uMsg ) { case WM_PAINT: BeginPaint( hWnd, &ps ); rcBox.left = 15; rcBox.top = 40; rcBox.right = 235; rcBox.bottom = 125; DrawEdge( ps.hdc, &rcBox, EDGE_ETCHED, BF_RECT ); hOldFont = SelectObject( ps.hdc, GetStockObject(DEFAULT_GUI_FONT) ); OldBkMode = SetBkMode( ps.hdc, TRANSPARENT ); item.mask = TCIF_PARAM; TabCtrl_GetItem( hTab, TabCtrl_GetCurSel( hTab ), &item ); switch (item.lParam) { case R4300i_BP: TextOut( ps.hdc, 29,60,"Break when the Program Counter equals",37); TextOut( ps.hdc, 59,85,"0x",2); break; case R4300i_FUNCTION: TextOut( ps.hdc, 75,60,"Break on label:",15); break; case RSP_BP: if (RspDebug.UseBPoints) { RspDebug.PaintBPPanel(ps); } break; } SelectObject( ps.hdc,hOldFont ); SetBkMode( ps.hdc, OldBkMode ); EndPaint( hWnd, &ps ); break; default: return( (*RefProc)(hWnd, uMsg, wParam, lParam) ); } return( FALSE ); } void RemoveR4300iBreakPoint (DWORD Location) { int count, location = -1; for (count = 0; count < NoOfBpoints; count ++){ if (BPoint[count].Location == Location) { location = count; count = NoOfBpoints; } } if (location >= 0) { for (count = location; count < NoOfBpoints - 1; count ++ ){ BPoint[count].Location = BPoint[count + 1].Location; } NoOfBpoints -= 1; RefreshBreakPoints (); } /*if (CPU_Action.Stepping || hMipsCPU == NULL) { ClearAllx86Code(); } else { CPU_Action.ResetX86Code = TRUE; CPU_Action.do_or_check_something += 1; }*/ } void Setup_BPoint_Win (HWND hDlg) { #define WindowWidth 350 #define WindowHeight 320 DWORD X, Y; hAddButton = CreateWindowEx(0,"BUTTON","&Add", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 262,26,75,22,hDlg,(HMENU)IDOK, hInst,NULL ); if ( hAddButton ) { SendMessage(hAddButton,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); } hRemoveButton = CreateWindowEx(0,"BUTTON","&Remove", WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP | WS_DISABLED,262,177,75,22,hDlg,(HMENU)IDC_REMOVE_BUTTON, hInst,NULL ); if ( hRemoveButton ) { SendMessage(hRemoveButton,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); } hRemoveAllButton = CreateWindowEx(0,"BUTTON","Remove A&ll", WS_CHILD | BS_PUSHBUTTON | WS_VISIBLE | WS_TABSTOP | WS_DISABLED,262,202,75,22,hDlg, (HMENU)IDC_REMOVEALL_BUTTON,hInst,NULL ); if ( hRemoveAllButton ) { SendMessage(hRemoveAllButton,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); } hTab = CreateWindowEx(0,WC_TABCONTROL,"", WS_CHILD | WS_TABSTOP | WS_VISIBLE, 5,6,250,150,hDlg,(HMENU)IDC_TAB_CONTROL,hInst,NULL ); if (hTab) { TC_ITEM item; SendMessage(hTab, WM_SETFONT, (WPARAM)GetStockObject( DEFAULT_GUI_FONT ), 0 ); item.mask = TCIF_TEXT | TCIF_PARAM; item.pszText = " R4300i "; item.lParam = R4300i_BP; TabCtrl_InsertItem( hTab,0, &item); if (NoOfMapEntries != 0) { item.mask = TCIF_TEXT | TCIF_PARAM; item.pszText = " Function "; item.lParam = R4300i_FUNCTION; TabCtrl_InsertItem( hTab,1, &item); } if (RspDebug.UseBPoints) { RECT rcBox; rcBox.left = 15; rcBox.top = 40; rcBox.right = 235; rcBox.bottom = 125; item.mask = TCIF_TEXT | TCIF_PARAM; item.pszText = RspDebug.BPPanelName; item.lParam = RSP_BP; TabCtrl_InsertItem( hTab,2, &item); RspDebug.CreateBPPanel(hDlg,rcBox); } } hR4300iLocation = CreateWindowEx(0,"EDIT","", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_UPPERCASE | WS_TABSTOP,83,90,100,17,hDlg,(HMENU)IDC_LOCATION_EDIT,hInst,NULL); if (hR4300iLocation) { char Title[20]; SendMessage(hR4300iLocation,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); SendMessage(hR4300iLocation,EM_SETLIMITTEXT,(WPARAM)8,(LPARAM)0); sprintf(Title,"%08X",PROGRAM_COUNTER); SetWindowText(hR4300iLocation,Title); } hFunctionlist = CreateWindowEx(0,"COMBOBOX","", WS_CHILD | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_SORT | WS_TABSTOP,55,90,150,150,hDlg, (HMENU)IDC_FUNCTION_COMBO,hInst,NULL); if (hFunctionlist) { DWORD count, pos; SendMessage(hFunctionlist,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); for (count = 0; count < NoOfMapEntries; count ++ ) { pos = SendMessage(hFunctionlist,CB_ADDSTRING,(WPARAM)0,(LPARAM)MapTable[count].Label); SendMessage(hFunctionlist,CB_SETITEMDATA,(WPARAM)pos,(LPARAM)MapTable[count].VAddr); } SendMessage(hFunctionlist,CB_SETCURSEL,(WPARAM)1,(LPARAM)0); } hList = CreateWindowEx(WS_EX_STATICEDGE, "LISTBOX","", WS_CHILD | WS_VISIBLE | LBS_DISABLENOSCROLL |WS_VSCROLL, 16,187,228,112, hDlg, (HMENU)IDC_LIST, hInst,NULL ); if ( hList) { SendMessage(hList,WM_SETFONT, (WPARAM)GetStockObject(DEFAULT_GUI_FONT),0); } hStatic = CreateWindowEx(0,"STATIC","", WS_CHILD | WS_VISIBLE, 5,6,250,150,hDlg,0,hInst,NULL ); RefProc = (FARPROC)SetWindowLong( hStatic,GWL_WNDPROC,(long)RefreshBPProc); SetWindowText(hDlg," Breakpoints"); if ( !GetStoredWinPos( "Break Point", &X, &Y ) ) { X = (GetSystemMetrics( SM_CXSCREEN ) - WindowWidth) / 2; Y = (GetSystemMetrics( SM_CYSCREEN ) - WindowHeight) / 2; } SetWindowPos(hDlg,NULL,X,Y,WindowWidth,WindowHeight, SWP_NOZORDER | SWP_SHOWWINDOW); } void ShowBPointPanel ( int Panel) { switch( Panel ) { case R4300i_BP: ShowWindow(hR4300iLocation, TRUE); break; case R4300i_FUNCTION: ShowWindow(hFunctionlist, TRUE); break; case RSP_BP: if (RspDebug.UseBPoints) { RspDebug.ShowBPPanel(); } break; } } void UpdateBPointGUI (void) { TC_ITEM item; DWORD count; if (!InBPWindow) { return; } if (TabCtrl_GetCurSel(hTab) != 0) { InvalidateRect( hTab, NULL, TRUE ); item.mask = TCIF_PARAM; TabCtrl_GetItem( hTab, TabCtrl_GetCurSel( hTab ), &item ); HideBPointPanel (item.lParam); TabCtrl_SetCurSel(hTab, 0); TabCtrl_GetItem( hTab, TabCtrl_GetCurSel( hTab ), &item ); InvalidateRect( hStatic, NULL, FALSE ); ShowBPointPanel ( item.lParam ); } for (count = TabCtrl_GetItemCount(hTab); count > 1; count--) { TabCtrl_DeleteItem(hTab, count - 1); } if (NoOfMapEntries > 0) { item.mask = TCIF_TEXT | TCIF_PARAM; item.pszText = " Function "; item.lParam = R4300i_FUNCTION; TabCtrl_InsertItem( hTab,1, &item); } if (RspDebug.UseBPoints) { RECT rcBox; rcBox.left = 15; rcBox.top = 40; rcBox.right = 235; rcBox.bottom = 125; item.mask = TCIF_TEXT | TCIF_PARAM; item.pszText = RspDebug.BPPanelName; item.lParam = RSP_BP; TabCtrl_InsertItem( hTab,2, &item); RspDebug.CreateBPPanel(BPoint_Win_hDlg, rcBox); } InvalidateRect( BPoint_Win_hDlg, NULL, TRUE ); RefreshBreakPoints (); } void UpdateBP_FunctionList (void) { DWORD pos, count; if (!InBPWindow) { return; } SendMessage(hFunctionlist,CB_RESETCONTENT,(WPARAM)0,(LPARAM)0); for (count = 0; count < NoOfMapEntries; count ++ ) { pos = SendMessage(hFunctionlist,CB_ADDSTRING,(WPARAM)0,(LPARAM)MapTable[count].Label); SendMessage(hFunctionlist,CB_SETITEMDATA,(WPARAM)pos,(LPARAM)MapTable[count].VAddr); } SendMessage(hFunctionlist,CB_SETCURSEL,(WPARAM)1,(LPARAM)0); UpdateBPointGUI(); } #endif #endif