CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/Windows/Debugger/Debugger_VFPUDlg.cpp
Views: 1401
1
#include "Common/CommonWindows.h"
2
#include <windowsx.h>
3
#include <commctrl.h>
4
#include "Windows/resource.h"
5
#include "Common/Data/Encoding/Utf8.h"
6
7
#include "Core/Debugger/SymbolMap.h"
8
#include "Windows/Debugger/Debugger_VFPUDlg.h"
9
10
#include "Windows/Debugger/CtrlMemView.h"
11
12
#include "Core/MIPS/MIPS.h" // BAD
13
14
CVFPUDlg::CVFPUDlg(HINSTANCE _hInstance, HWND _hParent, DebugInterface *cpu_) : Dialog((LPCSTR)IDD_VFPU, _hInstance,_hParent)
15
{
16
cpu = cpu_;
17
wchar_t temp[256];
18
wsprintf(temp, L"VFPU - %S", cpu->GetName());
19
SetWindowText(m_hDlg,temp);
20
21
ShowWindow(m_hDlg,SW_HIDE);
22
font = CreateFont(12,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,
23
L"Lucida Console");
24
25
HWND tabs = GetDlgItem(m_hDlg, IDC_TABDATATYPE);
26
27
TCITEM tcItem;
28
ZeroMemory (&tcItem,sizeof (tcItem));
29
tcItem.mask = TCIF_TEXT;
30
tcItem.dwState = 0;
31
tcItem.pszText = (LPTSTR)L"Float";
32
tcItem.cchTextMax = (int)wcslen(tcItem.pszText)+1;
33
tcItem.iImage = 0;
34
TabCtrl_InsertItem(tabs, TabCtrl_GetItemCount(tabs),&tcItem);
35
tcItem.pszText = (LPTSTR)L"HalfFloat";
36
tcItem.cchTextMax = (int)wcslen(tcItem.pszText)+1;
37
TabCtrl_InsertItem(tabs, TabCtrl_GetItemCount(tabs),&tcItem);
38
tcItem.pszText = (LPTSTR)L"Hex";
39
tcItem.cchTextMax = (int)wcslen(tcItem.pszText)+1;
40
TabCtrl_InsertItem(tabs, TabCtrl_GetItemCount(tabs),&tcItem);
41
tcItem.pszText = (LPTSTR)L"Bytes";
42
tcItem.cchTextMax = (int)wcslen(tcItem.pszText)+1;
43
TabCtrl_InsertItem(tabs, TabCtrl_GetItemCount(tabs),&tcItem);
44
tcItem.pszText = (LPTSTR)L"Shorts";
45
tcItem.cchTextMax = (int)wcslen(tcItem.pszText)+1;
46
TabCtrl_InsertItem(tabs, TabCtrl_GetItemCount(tabs),&tcItem);
47
tcItem.pszText = (LPTSTR)L"Ints";
48
tcItem.cchTextMax = (int)wcslen(tcItem.pszText)+1;
49
TabCtrl_InsertItem(tabs, TabCtrl_GetItemCount(tabs),&tcItem);
50
mode=0;
51
Size();
52
}
53
54
55
CVFPUDlg::~CVFPUDlg(void)
56
{
57
DeleteObject(font);
58
}
59
60
void CVFPUDlg::Update(void)
61
{
62
if (m_hDlg != NULL)
63
{
64
InvalidateRect(m_hDlg, 0,0);
65
/*
66
CtrlMemView *mv = CtrlMemView::getFrom(GetDlgItem(m_hDlg,IDC_MEMVIEW));
67
if (mv != NULL)
68
mv->redraw();*/
69
}
70
}
71
72
73
74
BOOL CVFPUDlg::DlgProc(UINT message, WPARAM wParam, LPARAM lParam)
75
{
76
switch(message)
77
{
78
case WM_INITDIALOG:
79
{
80
return TRUE;
81
}
82
break;
83
case WM_COMMAND:
84
{
85
// CtrlMemView *mv = CtrlMemView::getFrom(GetDlgItem(m_hDlg,IDC_MEMVIEW));
86
//switch (LOWORD(wParam))
87
//{
88
//}
89
}
90
break;
91
92
case WM_NOTIFY:
93
{
94
HWND tabs = GetDlgItem(m_hDlg, IDC_TABDATATYPE);
95
NMHDR* pNotifyMessage = NULL;
96
pNotifyMessage = (LPNMHDR)lParam;
97
if (pNotifyMessage->hwndFrom == tabs)
98
{
99
mode = TabCtrl_GetCurSel (tabs);
100
InvalidateRect(m_hDlg,0,0);
101
}
102
break;
103
}
104
105
case WM_SIZE:
106
Size();
107
break;
108
109
case WM_PAINT:
110
{
111
HWND wnd = m_hDlg;
112
RECT rect;
113
GetClientRect(wnd, &rect);
114
PAINTSTRUCT p;
115
HDC hdc = BeginPaint(wnd, &p);
116
SetBkMode(hdc, TRANSPARENT);
117
DWORD bgColor = 0xffffff;
118
HPEN nullPen=CreatePen(0,0,bgColor);
119
HPEN currentPen=CreatePen(0,0,0);
120
HPEN selPen=CreatePen(0,0,0x808080);
121
LOGBRUSH lbr;
122
lbr.lbHatch=0; lbr.lbStyle=0;
123
lbr.lbColor=bgColor;
124
HBRUSH nullBrush=CreateBrushIndirect(&lbr);
125
lbr.lbColor=0xFFEfE8;
126
HBRUSH currentBrush=CreateBrushIndirect(&lbr);
127
lbr.lbColor=0x70FF70;
128
HBRUSH pcBrush=CreateBrushIndirect(&lbr);
129
HPEN oldPen=(HPEN)SelectObject(hdc,currentPen);
130
HBRUSH oldBrush=(HBRUSH)SelectObject(hdc,nullBrush);
131
HFONT oldFont = (HFONT)SelectObject(hdc,(HGDIOBJ)font);
132
133
enum
134
{
135
rowHeight = 15,
136
columnWidth = 80,
137
xStart = columnWidth/2,
138
yStart = 30,
139
};
140
141
for (int matrix = 0; matrix<8; matrix++)
142
{
143
int my = (int)(yStart + matrix * rowHeight * 5.5f);
144
Rectangle(hdc, 0, my, xStart, my+rowHeight);
145
char temp[256];
146
int temp_len = sprintf_s(temp, "M%i00", matrix);
147
TextOutA(hdc,3,my+2,temp,temp_len);
148
Rectangle(hdc,xStart,my+rowHeight,xStart+columnWidth*4,my+5*rowHeight);
149
150
for (int column = 0; column<4; column++)
151
{
152
int y = my;
153
int x = column * columnWidth + xStart;
154
155
Rectangle(hdc, x, y, x + columnWidth, y+rowHeight);
156
temp_len = sprintf_s(temp, "R%i0%i", matrix, column);
157
TextOutA(hdc,x+3,y+2,temp,temp_len);
158
159
Rectangle(hdc, 0, y+rowHeight*(column+1), xStart, y+rowHeight*(column+2));
160
temp_len = sprintf_s(temp, "C%i%i0", matrix, column);
161
TextOutA(hdc,3,y+rowHeight*(column+1)+1,temp,temp_len);
162
163
y+=rowHeight;
164
165
for (int row = 0; row<4; row++)
166
{
167
float val = mipsr4k.v[voffset[column*32+row+matrix*4]];
168
u32 hex = mipsr4k.vi[voffset[column*32+row+matrix*4]];
169
switch (mode)
170
{
171
case 0: temp_len = sprintf_s(temp,"%f",val); break;
172
// case 1: temp_len = sprintf_s(temp,"??"); break;
173
case 2: temp_len = sprintf_s(temp,"0x%08x",hex); break;
174
default:temp_len = sprintf_s(temp,"%f",val); break;
175
}
176
177
TextOutA(hdc,x+3,y+2,temp,temp_len);
178
y+=rowHeight;
179
}
180
}
181
}
182
183
SelectObject(hdc,oldFont);
184
SelectObject(hdc,oldPen);
185
SelectObject(hdc,oldBrush);
186
187
DeleteObject(nullPen);
188
DeleteObject(currentPen);
189
DeleteObject(selPen);
190
191
DeleteObject(nullBrush);
192
DeleteObject(pcBrush);
193
DeleteObject(currentBrush);
194
195
EndPaint(m_hDlg, &p);
196
}
197
break;
198
199
case WM_CLOSE:
200
Show(false);
201
break;
202
}
203
204
return 0;
205
}
206
207
void CVFPUDlg::Goto(u32 addr)
208
{
209
Show(true);
210
CtrlMemView *mv = CtrlMemView::getFrom(GetDlgItem(CVFPUDlg::m_hDlg,IDC_MEMVIEW));
211
mv->gotoAddr(addr & ~3);
212
}
213
214
215
void CVFPUDlg::Size()
216
{
217
RECT rc;
218
GetClientRect(m_hDlg,&rc);
219
}
220
221