Added ability to edit memory through the mem viewers.

Basically, it works like an hex editor, ie you click on the value you want to
edit, then you enter the new value, which is applied only once it has been
entirely entered.
Warning! it may have bugs. If you find any, tell me.
This commit is contained in:
luigi__ 2009-04-14 00:18:43 +00:00
parent 96113b7ee4
commit 5debaa0857
3 changed files with 253 additions and 31 deletions

View File

@ -2764,8 +2764,8 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
ViewMem_ARM9->regClass("MemViewBox9", ViewMem_ARM9BoxProc); ViewMem_ARM9->regClass("MemViewBox9", ViewMem_ARM9BoxProc);
if (!ViewMem_ARM9->open()) if (!ViewMem_ARM9->open())
ViewMem_ARM9->unregClass();*/ ViewMem_ARM9->unregClass();*/
if(!MemView_IsOpened(ARMCPU_ARM9)) MemView_DlgOpen(hwnd, ARMCPU_ARM9); if(!MemView_IsOpened(ARMCPU_ARM9)) MemView_DlgOpen(hwnd, "ARM9 memory", ARMCPU_ARM9);
if(!MemView_IsOpened(ARMCPU_ARM7)) MemView_DlgOpen(hwnd, ARMCPU_ARM7); if(!MemView_IsOpened(ARMCPU_ARM7)) MemView_DlgOpen(hwnd, "ARM7 memory", ARMCPU_ARM7);
return 0; return 0;
case IDM_DISASSEMBLER: case IDM_DISASSEMBLER:
ViewDisasm_ARM7->regClass("DesViewBox7",ViewDisasm_ARM7BoxProc); ViewDisasm_ARM7->regClass("DesViewBox7",ViewDisasm_ARM7BoxProc);

View File

@ -36,14 +36,20 @@ using namespace std;
typedef struct MemView_DataStruct typedef struct MemView_DataStruct
{ {
MemView_DataStruct(u8 CPU) : cpu(CPU), address(0x02000000), viewMode(0) MemView_DataStruct(u8 CPU) : cpu(CPU), address(0x02000000), viewMode(0), sel(FALSE), selPart(0), selAddress(0x00000000), selNewVal(0x000000000)
{ {
} }
HWND hDlg; HWND hDlg;
u8 cpu; u8 cpu;
u32 address; u32 address;
u8 viewMode; u8 viewMode;
BOOL sel;
u8 selPart;
u32 selAddress;
u32 selNewVal;
} MemView_DataStruct; } MemView_DataStruct;
MemView_DataStruct * MemView_Data[2] = {NULL, NULL}; MemView_DataStruct * MemView_Data[2] = {NULL, NULL};
@ -79,7 +85,7 @@ void MemView_DeInit()
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
BOOL MemView_DlgOpen(HWND hParentWnd, u8 CPU) BOOL MemView_DlgOpen(HWND hParentWnd, char *Title, u8 CPU)
{ {
HWND hDlg; HWND hDlg;
char title[32]; char title[32];
@ -90,12 +96,15 @@ BOOL MemView_DlgOpen(HWND hParentWnd, u8 CPU)
hDlg = CreateDialogParam(hAppInst, MAKEINTRESOURCE(IDD_MEM_VIEW), hParentWnd, MemView_DlgProc, (LPARAM)MemView_Data[CPU]); hDlg = CreateDialogParam(hAppInst, MAKEINTRESOURCE(IDD_MEM_VIEW), hParentWnd, MemView_DlgProc, (LPARAM)MemView_Data[CPU]);
if(hDlg == NULL) if(hDlg == NULL)
{
delete MemView_Data[CPU];
MemView_Data[CPU] = NULL;
return 0; return 0;
}
MemView_Data[CPU]->hDlg = hDlg; MemView_Data[CPU]->hDlg = hDlg;
sprintf(title, "ARM%s memory", ((CPU == ARMCPU_ARM7) ? "7" : "9")); SetWindowText(hDlg, Title);
SetWindowText(hDlg, title);
ShowWindow(hDlg, SW_SHOW); ShowWindow(hDlg, SW_SHOW);
UpdateWindow(hDlg); UpdateWindow(hDlg);
@ -184,6 +193,10 @@ BOOL CALLBACK MemView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
case IDC_8_BIT: case IDC_8_BIT:
case IDC_16_BIT: case IDC_16_BIT:
case IDC_32_BIT: case IDC_32_BIT:
data->sel = FALSE;
data->selAddress = 0x00000000;
data->selPart = 0;
data->selNewVal = 0x00000000;
CheckRadioButton(hDlg, IDC_8_BIT, IDC_32_BIT, LOWORD(wParam)); CheckRadioButton(hDlg, IDC_8_BIT, IDC_32_BIT, LOWORD(wParam));
data->viewMode = (LOWORD(wParam) - IDC_8_BIT); data->viewMode = (LOWORD(wParam) - IDC_8_BIT);
InvalidateRect(hDlg, NULL, FALSE); UpdateWindow(hDlg); InvalidateRect(hDlg, NULL, FALSE); UpdateWindow(hDlg);
@ -239,6 +252,11 @@ BOOL CALLBACK MemView_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam
address |= ((ch - 'a' + 0xA) << shift); address |= ((ch - 'a' + 0xA) << shift);
} }
data->sel = FALSE;
data->selAddress = 0x00000000;
data->selPart = 0;
data->selNewVal = 0x00000000;
data->address = min((u32)0xFFFFFF00, (address & 0xFFFFFFF0)); data->address = min((u32)0xFFFFFF00, (address & 0xFFFFFFF0));
SetScrollPos(GetDlgItem(hDlg, IDC_MEMVIEWBOX), SB_VERT, ((data->address >> 4) & 0x000FFFFF), TRUE); SetScrollPos(GetDlgItem(hDlg, IDC_MEMVIEWBOX), SB_VERT, ((data->address >> 4) & 0x000FFFFF), TRUE);
InvalidateRect(hDlg, NULL, FALSE); UpdateWindow(hDlg); InvalidateRect(hDlg, NULL, FALSE); UpdateWindow(hDlg);
@ -389,6 +407,10 @@ LRESULT MemView_ViewBoxPaint(HWND hCtl, MemView_DataStruct *data, WPARAM wParam,
SelectObject(mem_hdc, GetStockObject(SYSTEM_FIXED_FONT)); SelectObject(mem_hdc, GetStockObject(SYSTEM_FIXED_FONT));
SetBkMode(mem_hdc, OPAQUE);
SetBkColor(mem_hdc, RGB(255, 255, 255));
SetTextColor(mem_hdc, RGB(0, 0, 0));
GetTextExtentPoint32(mem_hdc, " ", 1, &fontsize); GetTextExtentPoint32(mem_hdc, " ", 1, &fontsize);
fontwidth = fontsize.cx; fontwidth = fontsize.cx;
fontheight = fontsize.cy; fontheight = fontsize.cy;
@ -400,22 +422,22 @@ LRESULT MemView_ViewBoxPaint(HWND hCtl, MemView_DataStruct *data, WPARAM wParam,
u32 addr = data->address; u32 addr = data->address;
u8 memory[0x100]; u8 memory[0x100];
char text[80]; char text[80];
int startx, cury; int startx;
int curx, cury;
int line; int line;
startx = 0; startx = 0;
curx = 0;
cury = 0; cury = 0;
sprintf(text, " "); startx = ((fontwidth * 8) + 5);
GetTextExtentPoint32(mem_hdc, text, strlen(text), &fontsize); cury = (fontheight + 3);
startx = (fontsize.cx + 5);
cury = (fontsize.cy + 3);
MoveToEx(mem_hdc, (fontsize.cx + 2), 0, NULL); MoveToEx(mem_hdc, ((fontwidth * 8) + 2), 0, NULL);
LineTo(mem_hdc, (fontsize.cx + 2), h); LineTo(mem_hdc, ((fontwidth * 8) + 2), h);
MoveToEx(mem_hdc, 0, (fontsize.cy + 1), NULL); MoveToEx(mem_hdc, 0, (fontheight + 1), NULL);
LineTo(mem_hdc, w, (fontsize.cy + 1)); LineTo(mem_hdc, w, (fontheight + 1));
switch(data->viewMode) switch(data->viewMode)
{ {
@ -450,53 +472,138 @@ LRESULT MemView_ViewBoxPaint(HWND hCtl, MemView_DataStruct *data, WPARAM wParam,
sprintf(text, "%08X", addr); sprintf(text, "%08X", addr);
TextOut(mem_hdc, 0, cury, text, strlen(text)); TextOut(mem_hdc, 0, cury, text, strlen(text));
curx = startx;
switch(data->viewMode) switch(data->viewMode)
{ {
case 0: case 0:
{ {
sprintf(text, " "); curx += (fontwidth * 2);
for(i = 0; i < 16; i++) for(i = 0; i < 16; i++)
{ {
sprintf(text, "%s%02X ", text, T1ReadByte(memory, ((line << 4) + i))); if(data->sel && (data->selAddress == (addr + i)))
{
SetBkColor(mem_hdc, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(mem_hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
} }
sprintf(text, "%s ", text); else
{
SetBkColor(mem_hdc, RGB(255, 255, 255));
SetTextColor(mem_hdc, RGB(0, 0, 0));
}
u8 val = T1ReadByte(memory, ((line << 4) + i));
if(data->sel && (data->selAddress == (addr + i)))
{
switch(data->selPart)
{
case 0: sprintf(text, "%02X", val); break;
case 1: sprintf(text, "%01X.", data->selNewVal); break;
}
}
else
sprintf(text, "%02X", val);
TextOut(mem_hdc, curx, cury, text, strlen(text));
curx += (fontwidth * (2+1));
}
curx += (fontwidth * 2);
} }
break; break;
case 1: case 1:
{ {
sprintf(text, " "); curx += (fontwidth * 6);
for(i = 0; i < 16; i += 2) for(i = 0; i < 16; i += 2)
{ {
sprintf(text, "%s%04X ", text, T1ReadWord(memory, ((line << 4) + i))); if(data->sel && (data->selAddress == (addr + i)))
{
SetBkColor(mem_hdc, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(mem_hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
} }
sprintf(text, "%s ", text); else
{
SetBkColor(mem_hdc, RGB(255, 255, 255));
SetTextColor(mem_hdc, RGB(0, 0, 0));
}
u16 val = T1ReadWord(memory, ((line << 4) + i));
if(data->sel && (data->selAddress == (addr + i)))
{
switch(data->selPart)
{
case 0: sprintf(text, "%04X", val); break;
case 1: sprintf(text, "%01X...", data->selNewVal); break;
case 2: sprintf(text, "%02X..", data->selNewVal); break;
case 3: sprintf(text, "%03X.", data->selNewVal); break;
}
}
else
sprintf(text, "%04X", val);
TextOut(mem_hdc, curx, cury, text, strlen(text));
curx += (fontwidth * (4+1));
}
curx += (fontwidth * 6);
} }
break; break;
case 2: case 2:
{ {
sprintf(text, " "); curx += (fontwidth * 8);
for(i = 0; i < 16; i += 4) for(i = 0; i < 16; i += 4)
{ {
sprintf(text, "%s%08X ", text, T1ReadLong(memory, ((line << 4) + i))); if(data->sel && (data->selAddress == (addr + i)))
{
SetBkColor(mem_hdc, GetSysColor(COLOR_HIGHLIGHT));
SetTextColor(mem_hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
} }
sprintf(text, "%s ", text); else
{
SetBkColor(mem_hdc, RGB(255, 255, 255));
SetTextColor(mem_hdc, RGB(0, 0, 0));
}
u32 val = T1ReadLong(memory, ((line << 4) + i));
if(data->sel && (data->selAddress == (addr + i)))
{
switch(data->selPart)
{
case 0: sprintf(text, "%08X", val); break;
case 1: sprintf(text, "%01X.......", data->selNewVal); break;
case 2: sprintf(text, "%02X......", data->selNewVal); break;
case 3: sprintf(text, "%03X.....", data->selNewVal); break;
case 4: sprintf(text, "%04X....", data->selNewVal); break;
case 5: sprintf(text, "%05X...", data->selNewVal); break;
case 6: sprintf(text, "%06X..", data->selNewVal); break;
case 7: sprintf(text, "%07X.", data->selNewVal); break;
}
}
else
sprintf(text, "%08X", val);
TextOut(mem_hdc, curx, cury, text, strlen(text));
curx += (fontwidth * (8+1));
}
curx += (fontwidth * 8);
} }
break; break;
} }
SetBkColor(mem_hdc, RGB(255, 255, 255));
SetTextColor(mem_hdc, RGB(0, 0, 0));
for(i = 0; i < 16; i++) for(i = 0; i < 16; i++)
{ {
u8 val = T1ReadByte(memory, ((line << 4) + i)); u8 val = T1ReadByte(memory, ((line << 4) + i));
if((val >= 32) && (val <= 127)) if((val >= 32) && (val <= 127))
sprintf(text, "%s%c", text, (char)val); text[i] = (char)val;
else else
sprintf(text, "%s.", text); text[i] = '.';
} }
text[16] = '\0';
TextOut(mem_hdc, startx, cury, text, strlen(text)); TextOut(mem_hdc, curx, cury, text, strlen(text));
cury += fontheight; cury += fontheight;
} }
@ -533,6 +640,121 @@ LRESULT CALLBACK MemView_ViewBoxProc(HWND hCtl, UINT uMsg, WPARAM wParam, LPARAM
MemView_ViewBoxPaint(hCtl, data, wParam, lParam); MemView_ViewBoxPaint(hCtl, data, wParam, lParam);
return 1; return 1;
case WM_LBUTTONDOWN:
{
HDC hdc;
HFONT font;
SIZE fontsize;
int x, y;
data->sel = FALSE;
data->selAddress = 0x00000000;
data->selPart = 0;
data->selNewVal = 0x00000000;
hdc = GetDC(hCtl);
font = (HFONT)SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
GetTextExtentPoint32(hdc, " ", 1, &fontsize);
x = LOWORD(lParam);
y = HIWORD(lParam);
if((x >= ((fontsize.cx * 8) + 5)) && (y >= (fontsize.cy + 3)))
{
int line, col;
x -= ((fontsize.cx * 8) + 5);
y -= (fontsize.cy + 3);
line = (y / fontsize.cy);
switch(data->viewMode)
{
case 0:
{
if((x < (fontsize.cx * 2)) || (x >= (fontsize.cx * (2 + ((2+1) * 16)))))
break;
col = ((x - (fontsize.cx * 2)) / (fontsize.cx * (2+1)));
data->sel = TRUE;
}
break;
case 1:
{
if((x < (fontsize.cx * 6)) || (x >= (fontsize.cx * (6 + ((4+1) * 8)))))
break;
col = ((x - (fontsize.cx * 6)) / (fontsize.cx * (4+1)) * 2);
data->sel = TRUE;
}
break;
case 2:
{
if((x < (fontsize.cx * 8)) || (x >= (fontsize.cx * (8 + ((8+1) * 4)))))
break;
col = ((x - (fontsize.cx * 8)) / (fontsize.cx * (8+1)) * 4);
data->sel = TRUE;
}
break;
}
data->selAddress = (data->address + (line << 4) + col);
data->selPart = 0;
data->selNewVal = 0x00000000;
}
SelectObject(hdc, font);
ReleaseDC(hCtl, hdc);
SetFocus(hCtl); /* Required to receive keyboard messages */
InvalidateRect(hCtl, NULL, FALSE); UpdateWindow(hCtl);
}
return 1;
case WM_CHAR:
{
char ch = (char)wParam;
if(((ch >= '0') && (ch <= '9')) || ((ch >= 'A') && (ch <= 'F')) || ((ch >= 'a') && (ch <= 'f')))
{
u8 maxSelPart[3] = {2, 4, 8};
data->selNewVal <<= 4;
data->selPart++;
if((ch >= '0') && (ch <= '9'))
data->selNewVal |= (ch - '0');
else if((ch >= 'A') && (ch <= 'F'))
data->selNewVal |= (ch - 'A' + 0xA);
else if((ch >= 'a') && (ch <= 'f'))
data->selNewVal |= (ch - 'a' + 0xA);
if(data->selPart >= maxSelPart[data->viewMode])
{
switch(data->viewMode)
{
case 0: MMU_write8(data->cpu, data->selAddress, (u8)data->selNewVal); data->selAddress++; break;
case 1: MMU_write16(data->cpu, data->selAddress, (u16)data->selNewVal); data->selAddress += 2; break;
case 2: MMU_write32(data->cpu, data->selAddress, data->selNewVal); data->selAddress += 4; break;
}
data->selPart = 0;
data->selNewVal = 0x00000000;
}
}
InvalidateRect(hCtl, NULL, FALSE); UpdateWindow(hCtl);
}
return 1;
case WM_VSCROLL: case WM_VSCROLL:
{ {
int firstpos = GetScrollPos(hCtl, SB_VERT); int firstpos = GetScrollPos(hCtl, SB_VERT);

View File

@ -25,7 +25,7 @@
BOOL MemView_Init(); BOOL MemView_Init();
void MemView_DeInit(); void MemView_DeInit();
BOOL MemView_DlgOpen(HWND hParentWnd, u8 CPU); BOOL MemView_DlgOpen(HWND hParentWnd, char *Title, u8 CPU);
void MemView_DlgClose(u8 CPU); void MemView_DlgClose(u8 CPU);
BOOL MemView_IsOpened(u8 CPU); BOOL MemView_IsOpened(u8 CPU);
void MemView_Refresh(u8 CPU); void MemView_Refresh(u8 CPU);