mirror of
https://github.com/PCSX2/pcsx2.git
synced 2025-04-02 10:52:54 -04:00
git-svn-id: http://pcsx2.googlecode.com/svn/branches/pcsx2_0.9.2@159 96395faa-99c1-11dd-bbfe-3dabce05a288
239 lines
No EOL
6.4 KiB
C
239 lines
No EOL
6.4 KiB
C
/* Pcsx2 - Pc Ps2 Emulator
|
|
* Copyright (C) 2002-2003 Pcsx2 Team
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
|
|
#include "Common.h"
|
|
#include "resource.h"
|
|
|
|
|
|
unsigned long memory_addr;
|
|
BOOL mem_inupdate = FALSE;
|
|
HWND memoryhWnd,hWnd_memscroll,hWnd_memorydump;
|
|
unsigned long memory_patch;
|
|
unsigned long data_patch;
|
|
|
|
///MEMORY DUMP
|
|
unsigned char Debug_Read8(unsigned long addr)//just for anycase..
|
|
{
|
|
#ifdef __MSCW32__
|
|
__try
|
|
{
|
|
#endif
|
|
u8 val8;
|
|
memRead8(addr, &val8);
|
|
return val8;
|
|
#ifdef __MSCW32__
|
|
}
|
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
|
|
void RefreshMemory(void)
|
|
{
|
|
int x, y;
|
|
unsigned long addr;
|
|
unsigned char b;
|
|
|
|
char buf[128], text[32], temp[8];
|
|
|
|
|
|
|
|
addr = memory_addr;
|
|
|
|
if (!mem_inupdate)
|
|
{
|
|
sprintf(buf, "%08X", addr);
|
|
SetDlgItemText(memoryhWnd, IDC_MEMORY_ADDR, buf);
|
|
}
|
|
|
|
SendMessage(hWnd_memorydump, LB_RESETCONTENT, 0, 0);
|
|
|
|
for (y = 0; y < 21; y++)
|
|
{
|
|
memset(text, 0, 32);
|
|
sprintf(buf, "%08X: ", addr);
|
|
|
|
for (x = 0; x < 16; x++)
|
|
{
|
|
b = Debug_Read8(addr++);
|
|
|
|
sprintf(temp, "%02X ", b);
|
|
strcat(buf, temp);
|
|
|
|
if (b < 32 || b > 127) b = 32;
|
|
sprintf(temp, "%c", b);
|
|
strcat(text, temp);
|
|
|
|
|
|
if (x == 7) strcat(buf, " ");
|
|
}
|
|
|
|
strcat(buf, " ");
|
|
strcat(buf, text);
|
|
|
|
SendMessage(hWnd_memorydump, LB_ADDSTRING, 0, (LPARAM)buf);
|
|
}
|
|
}
|
|
|
|
|
|
BOOL APIENTRY DumpMemProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
char start[16], end[16], fname[128], buf[128];
|
|
u32 start_pc, end_pc, addr;
|
|
u8 data;
|
|
|
|
FILE *fp;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
sprintf(buf, "%08X", cpuRegs.pc);
|
|
SetDlgItemText(hDlg, IDC_DUMPMEM_START, buf);
|
|
SetDlgItemText(hDlg, IDC_DUMPMEM_END, buf);
|
|
SetDlgItemText(hDlg, IDC_DUMPMEM_FNAME, "dump.raw");
|
|
return TRUE;
|
|
|
|
case WM_COMMAND:
|
|
if (LOWORD(wParam) == IDOK)
|
|
{
|
|
GetDlgItemText(hDlg, IDC_DUMPMEM_START, start, 9);
|
|
start[8] = 0;
|
|
sscanf(start, "%x", &start_pc);
|
|
start_pc &= 0xFFFFFFFC;
|
|
|
|
GetDlgItemText(hDlg, IDC_DUMPMEM_END, end, 9);
|
|
end[8] = 0;
|
|
sscanf(end, "%x", &end_pc);
|
|
end_pc &= 0xFFFFFFFC;
|
|
|
|
GetDlgItemText(hDlg, IDC_DUMPMEM_FNAME, fname, 128);
|
|
fp = fopen(fname, "wb");
|
|
if (fp == NULL)
|
|
{
|
|
SysMessage("Can't open file '%s' for writing!\n", fname);
|
|
}
|
|
else
|
|
{
|
|
for (addr = start_pc; addr < end_pc; addr ++) {
|
|
memRead8( addr, &data );
|
|
fwrite(&data, 1, 1, fp);
|
|
}
|
|
|
|
fclose(fp);
|
|
}
|
|
|
|
EndDialog(hDlg, TRUE);
|
|
} else if (LOWORD(wParam) == IDCANCEL) {
|
|
EndDialog(hDlg, TRUE);
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
BOOL APIENTRY MemoryProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
|
|
char buf[16];
|
|
switch (message)
|
|
{
|
|
case WM_INITDIALOG:
|
|
memory_addr = cpuRegs.pc;
|
|
sprintf(buf, "%08X", memory_addr);
|
|
SetDlgItemText(hDlg, IDC_MEMORY_ADDR, buf);
|
|
memory_patch= 0;
|
|
sprintf(buf, "%08X", memory_patch);
|
|
SetDlgItemText(hDlg, IDC_ADDRESS_PATCH, buf);
|
|
data_patch=0;
|
|
sprintf(buf, "%08X", data_patch);
|
|
SetDlgItemText(hDlg, IDC_DATA_PATCH, buf);
|
|
hWnd_memorydump = GetDlgItem(hDlg, IDC_MEMORY_DUMP);
|
|
hWnd_memscroll = GetDlgItem(hDlg, IDC_MEM_SCROLL);
|
|
|
|
|
|
|
|
SendMessage(hWnd_memorydump, LB_INITSTORAGE, 11, 1280);
|
|
SendMessage(hWnd_memscroll, SBM_SETRANGE, 0, MAXLONG);
|
|
SendMessage(hWnd_memscroll, SBM_SETPOS, MAXLONG / 2, TRUE);
|
|
|
|
RefreshMemory();
|
|
return TRUE;
|
|
case WM_VSCROLL:
|
|
switch ((int) LOWORD(wParam))
|
|
{
|
|
case SB_LINEDOWN: memory_addr += 0x00000010; RefreshMemory(); break;
|
|
case SB_LINEUP: memory_addr -= 0x00000010; RefreshMemory(); break;
|
|
case SB_PAGEDOWN: memory_addr += 0x00000150; RefreshMemory(); break;
|
|
case SB_PAGEUP: memory_addr -= 0x00000150; RefreshMemory(); break;
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
case WM_CLOSE:
|
|
EndDialog(hDlg, TRUE );
|
|
return TRUE;
|
|
|
|
|
|
case WM_COMMAND:
|
|
if (HIWORD(wParam) == EN_UPDATE)
|
|
{
|
|
mem_inupdate = TRUE;
|
|
GetDlgItemText(hDlg, IDC_MEMORY_ADDR, buf, 9);
|
|
buf[8] = 0;
|
|
|
|
sscanf(buf, "%x", &memory_addr);
|
|
RefreshMemory();
|
|
mem_inupdate = FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
switch (LOWORD(wParam)) {
|
|
case IDC_PATCH:
|
|
GetDlgItemText(hDlg, IDC_ADDRESS_PATCH, buf, 9);//32bit address
|
|
buf[8] = 0;
|
|
sscanf(buf, "%x", &memory_patch);
|
|
GetDlgItemText(hDlg, IDC_DATA_PATCH, buf, 9);//32 bit data only for far
|
|
buf[8] = 0;
|
|
sscanf(buf, "%x", &data_patch);
|
|
memWrite32( memory_patch, data_patch );
|
|
sprintf(buf, "%08X", memory_patch);
|
|
SetDlgItemText(hDlg, IDC_MEMORY_ADDR, buf);
|
|
RefreshMemory();
|
|
return TRUE;
|
|
|
|
case IDC_DUMPRAW:
|
|
DialogBox(gApp.hInstance, MAKEINTRESOURCE(IDD_DUMPMEM), hDlg, (DLGPROC)DumpMemProc);
|
|
|
|
return TRUE;
|
|
|
|
case IDC_MEMORY_CLOSE:
|
|
EndDialog(hDlg, TRUE );
|
|
return TRUE;
|
|
}
|
|
break;
|
|
}
|
|
|
|
return FALSE;
|
|
} |