* Tracer: added Symbolic Debug naming by right-clicking any address

* Tracer: clicking any address select the address
* Tracer: double-clicking any address brings Debugger at the address
* Tracer: added mouse wheel support
This commit is contained in:
ansstuff 2013-09-11 21:30:34 +00:00
parent 5072684a8f
commit 1bdd98b78e
8 changed files with 280 additions and 102 deletions

View File

@ -577,6 +577,18 @@ void Disassemble(HWND hWnd, int id, int scrollid, unsigned int addr)
}
SetDlgItemText(hWnd, IDC_DEBUGGER_DISASSEMBLY_LEFT_PANEL, debug_cdl_str);
}
void PrintOffsetToSeekAndBookmarkFields(int offset)
{
if (offset >= 0 && hDebug)
{
char offsetBuffer[5];
sprintf(offsetBuffer, "%04X", offset);
// send the address to "Seek To" field
SetDlgItemText(hDebug, IDC_DEBUGGER_VAL_PCSEEK, offsetBuffer);
// send the address to "Bookmark Add" field
SetDlgItemText(hDebug, IDC_DEBUGGER_BOOKMARK, offsetBuffer);
}
}
char *DisassembleLine(int addr) {
static char str[64]={0},chr[25]={0};
@ -834,8 +846,8 @@ void UpdateDebugger(bool jump_to_pc)
// "Address Bookmark Add" follows the address
sprintf(str,"%04X", starting_address);
SetDlgItemText(hDebug, IDC_DEBUGGER_BOOKMARK, str);
//sprintf(str, "%04X", starting_address);
//SetDlgItemText(hDebug, IDC_DEBUGGER_BOOKMARK, str);
sprintf(str, "%02X", X.A);
SetDlgItemText(hDebug, IDC_DEBUGGER_VAL_A, str);
@ -1331,23 +1343,24 @@ BOOL CALLBACK DebuggerEnumWindowsProc(HWND hwnd, LPARAM lParam)
SetWindowPos(hwnd,0,0,0,crect.right-crect.left,crect.bottom-crect.top,SWP_NOZORDER | SWP_NOMOVE);
GetScrollInfo(GetDlgItem(hDebug,IDC_DEBUGGER_DISASSEMBLY_VSCR),SB_CTL,&si);
Disassemble(hDebug, IDC_DEBUGGER_DISASSEMBLY, IDC_DEBUGGER_DISASSEMBLY_VSCR, si.nPos);
// "Address Bookmark Add" follows the address
sprintf(str,"%04X", si.nPos);
SetDlgItemText(hDebug, IDC_DEBUGGER_BOOKMARK, str);
} else if(hwnd == icontray) {
} else if(hwnd == icontray)
{
crect.bottom += dy;
SetWindowPos(hwnd,0,0,0,crect.right-crect.left,crect.bottom-crect.top,SWP_NOZORDER | SWP_NOMOVE);
} else if(hwnd == addrline) {
} else if(hwnd == addrline)
{
crect.top += dy;
crect.bottom += dy;
crect.right += dx;
SetWindowPos(hwnd,0,crect.left,crect.top,crect.right-crect.left,crect.bottom-crect.top,SWP_NOZORDER);
} else if(hwnd == vscr) {
} else if(hwnd == vscr)
{
crect.bottom += dy;
crect.left += dx;
crect.right += dx;
SetWindowPos(hwnd,0,crect.left,crect.top,crect.right-crect.left,crect.bottom-crect.top,SWP_NOZORDER);
} else {
} else
{
crect.left += dx;
//if (crect.left < 256) crect.left = 256; //Limit how far left the remaining child windows will move
SetWindowPos(hwnd,0,crect.left,crect.top,0,0,SWP_NOZORDER | SWP_NOSIZE);
@ -1366,11 +1379,14 @@ void LoadGameDebuggerData(HWND hwndDlg = hDebug)
}
// returns the address, or EOF if selection cursor points to something else
int CheckClickingOnAnAddress()
int Debugger_CheckClickingOnAnAddress(bool onlyCheckWhenNothingSelected)
{
// debug_str contains the text in the disassembly window
int sel_start, sel_end;
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
if (onlyCheckWhenNothingSelected)
if (sel_end > sel_start)
return EOF;
// find the ":" or "$" before sel_start
int i = sel_start - 1;
for (; i > sel_start - 6; i--)
@ -1381,7 +1397,7 @@ int CheckClickingOnAnAddress()
char offsetBuffer[5];
strncpy(offsetBuffer, debug_str + i + 1, 4);
offsetBuffer[4] = 0;
// invalidate the string if a space or \r is found
// invalidate the string if a space or \r is found in it
char* firstspace = strstr(offsetBuffer, " ");
if (!firstspace)
firstspace = strstr(offsetBuffer, "\r");
@ -1392,10 +1408,7 @@ int CheckClickingOnAnAddress()
{
// select the text
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_SETSEL, (WPARAM)(i + 1), (LPARAM)(i + 5));
// send the address to "Seek To" field
SetDlgItemText(hDebug, IDC_DEBUGGER_VAL_PCSEEK, offsetBuffer);
// send the address to "Bookmark Add" field
SetDlgItemText(hDebug, IDC_DEBUGGER_BOOKMARK, offsetBuffer);
PrintOffsetToSeekAndBookmarkFields(offset);
return (int)offset;
}
}
@ -1409,7 +1422,7 @@ BOOL CALLBACK IDC_DEBUGGER_DISASSEMBLY_WndProc(HWND hwndDlg, UINT uMsg, WPARAM w
{
case WM_LBUTTONDBLCLK:
{
int offset = CheckClickingOnAnAddress();
int offset = Debugger_CheckClickingOnAnAddress(false);
if (offset != EOF)
{
// bring "Add Breakpoint" dialog
@ -1423,7 +1436,7 @@ BOOL CALLBACK IDC_DEBUGGER_DISASSEMBLY_WndProc(HWND hwndDlg, UINT uMsg, WPARAM w
}
case WM_LBUTTONUP:
{
CheckClickingOnAnAddress();
Debugger_CheckClickingOnAnAddress(true);
break;
}
case WM_RBUTTONDOWN:
@ -1442,13 +1455,19 @@ BOOL CALLBACK IDC_DEBUGGER_DISASSEMBLY_WndProc(HWND hwndDlg, UINT uMsg, WPARAM w
case WM_RBUTTONUP:
{
// if nothing is selected, try bringing Symbolic Debug Naming dialog
int sel_start, sel_end;
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
if (sel_start == sel_end)
int offset = Debugger_CheckClickingOnAnAddress(true);
if (offset != EOF)
{
int offset = CheckClickingOnAnAddress();
if (offset != EOF)
DoSymbolicDebugNaming(offset);
if (DoSymbolicDebugNaming(offset, hDebug))
{
// enable "Symbolic Debug" if not yet enabled
if (!symbDebugEnabled)
{
symbDebugEnabled = true;
CheckDlgButton(hDebug, IDC_DEBUGGER_ENABLE_SYMBOLIC, BST_CHECKED);
}
UpdateDebugger(false);
}
}
break;
}
@ -1490,7 +1509,7 @@ BOOL CALLBACK IDC_DEBUGGER_DISASSEMBLY_WndProc(HWND hwndDlg, UINT uMsg, WPARAM w
}
case WM_MOUSEWHEEL:
{
SendMessage(GetDlgItem(hDebug,IDC_DEBUGGER_DISASSEMBLY_VSCR), uMsg, wParam, lParam);
SendMessage(GetDlgItem(hDebug, IDC_DEBUGGER_DISASSEMBLY_VSCR), uMsg, wParam, lParam);
return 0;
}
}

View File

@ -36,6 +36,8 @@ extern char* BreakToText(unsigned int num);
void UpdateDebugger(bool jump_to_pc = true);
void DoDebug(uint8 halt);
void DebuggerExit();
void Disassemble(HWND hWnd, int id, int scrollid, unsigned int addr);
void PrintOffsetToSeekAndBookmarkFields(int offset);
void LoadGameDebuggerData(HWND hwndDlg);
void updateGameDependentMenusDebugger(unsigned int enable);

View File

@ -822,8 +822,6 @@ void FillDebuggerBookmarkListbox(HWND hwnd)
}
}
extern void Disassemble(HWND hWnd, int id, int scrollid, unsigned int addr);
/**
* Shows the code at the bookmark address in the disassembly window
*
@ -911,18 +909,15 @@ BOOL CALLBACK SymbolicNamingCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM
return FALSE;
}
void DoSymbolicDebugNaming(int offset)
// returns true if user pressed OK, false if Cancel
bool DoSymbolicDebugNaming(int offset, HWND parentHWND)
{
if (!FCEUI_EmulationPaused())
FCEUI_ToggleEmulationPause();
loadNameFiles();
childwnd = 1;
if (DialogBoxParam(fceu_hInstance, MAKEINTRESOURCE(IDD_SYMBOLIC_DEBUG_NAMING), hDebug, SymbolicNamingCallB, offset))
{
symbDebugEnabled = true;
CheckDlgButton(hDebug, IDC_DEBUGGER_ENABLE_SYMBOLIC, BST_CHECKED);
UpdateDebugger(false);
}
childwnd = 0;
if (DialogBoxParam(fceu_hInstance, MAKEINTRESOURCE(IDD_SYMBOLIC_DEBUG_NAMING), parentHWND, SymbolicNamingCallB, offset))
return true;
return false;
}
void AddNewSymbolicName(unsigned int newAddress, char* newOffset, char* newName, char* newComment)

View File

@ -54,6 +54,6 @@ void FillDebuggerBookmarkListbox(HWND hwnd);
void GoToDebuggerBookmark(HWND hwnd);
int isHex(char c);
void DoSymbolicDebugNaming(int offset);
bool DoSymbolicDebugNaming(int offset, HWND parentHWND);
void AddNewSymbolicName(unsigned int newAddress, char* newOffset, char* newName, char* newComment);
void WriteNameFileToDisk(const char* filename, Name* node);

View File

@ -107,6 +107,7 @@ struct
}
popupmenu[] =
{
{0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_SYMBOLIC_NAME, "Add symbolic debug name"},
{0x0000,0x2000, MODE_NES_MEMORY,ID_ADDRESS_FRZ_SUBMENU,"Freeze/Unfreeze This Address"},
{0x6000,0x7FFF, MODE_NES_MEMORY,ID_ADDRESS_FRZ_SUBMENU,"Freeze/Unfreeze This Address"},
{0x0000,0xFFFF, MODE_NES_MEMORY,ID_ADDRESS_ADDBP_R,"Add Debugger Read Breakpoint"},
@ -116,11 +117,7 @@ popupmenu[] =
{0x0000,0xFFFF, MODE_NES_MEMORY,ID_ADDRESS_ADDBP_X,"Add Debugger Execute Breakpoint"},
{0x8000,0xFFFF, MODE_NES_MEMORY,ID_ADDRESS_SEEK_IN_ROM,"Go Here In ROM File"},
{0x8000,0xFFFF, MODE_NES_MEMORY,ID_ADDRESS_CREATE_GG_CODE,"Create Game Genie Code At This Address"},
//{0x0000,0xFFFFFF,MODE_NES_FILE,7,"Create Game Genie Code At This Address"}
// ################################## Start of SP CODE ###########################
{0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_BOOKMARK, "Add / Remove bookmark"},
// ################################## End of SP CODE ###########################
{0x0000,0xFFFF, MODE_NES_MEMORY, ID_ADDRESS_SYMBOLIC_NAME, "Add symbolic debug name"},
} ;
#define POPUPNUM (sizeof popupmenu / sizeof popupmenu[0])
@ -129,7 +126,6 @@ int LoadTableFile();
void UnloadTableFile();
void InputData(char *input);
int GetMemViewData(uint32 i);
void UpdateCaption();
int UpdateCheatColorCallB(char *name, uint32 a, uint8 v, int compare,int s,int type, void *data); //mbg merge 6/29/06 - added arg
int DeleteCheatCallB(char *name, uint32 a, uint8 v, int compare,int s,int type); //mbg merge 6/29/06 - added arg
// ################################## Start of SP CODE ###########################
@ -280,7 +276,8 @@ void GotoAddress(HWND hwnd) {
}
}
void SetHexEditorAddress(int gotoaddress) {
void SetHexEditorAddress(int gotoaddress)
{
if (gotoaddress < 0)
gotoaddress = 0;
@ -1413,6 +1410,24 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
UpdateCaption();
UpdateColorTable();
return 0;
case WM_RBUTTONDOWN:
{
if (!lbuttondown && CursorEndAddy == -1)
{
x = GET_X_LPARAM(lParam);
y = GET_Y_LPARAM(lParam);
i = GetAddyFromCoord(x,y);
if (i != -1)
{
EditingText = AddyWasText;
CursorStartAddy = i;
UpdateCaption();
UpdateColorTable();
return 0;
}
}
break;
}
case WM_MOUSEMOVE:
mousex = x = GET_X_LPARAM(lParam);
mousey = y = GET_Y_LPARAM(lParam);
@ -1722,8 +1737,20 @@ LRESULT CALLBACK MemViewCallB(HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
}
// ################################## End of SP CODE ###########################
case ID_ADDRESS_SYMBOLIC_NAME:
DoSymbolicDebugNaming(j);
{
if (DoSymbolicDebugNaming(j, hMemView))
{
// enable "Symbolic Debug" if not yet enabled
if (!symbDebugEnabled)
{
symbDebugEnabled = true;
if (hDebug)
CheckDlgButton(hDebug, IDC_DEBUGGER_ENABLE_SYMBOLIC, BST_CHECKED);
}
UpdateCaption();
}
break;
}
break;
}
//6 = Create GG Code

View File

@ -3,6 +3,7 @@ void KillMemView();
void UpdateMemoryView(int draw_all);
void UpdateColorTable();
void ChangeMemViewFocus(int newEditingMode, int StartOffset,int EndOffset);
void UpdateCaption();
void ApplyPatch(int addr,int size, uint8* data);
void UndoLastPatch();

View File

@ -1170,43 +1170,42 @@ BEGIN
EDITTEXT IDC_DEBUGGER_DISASSEMBLY_LEFT_PANEL,4,5,14,301,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | WS_DISABLED
END
TRACER DIALOGEX 65527, 65513, 403, 339
TRACER DIALOGEX 65527, 65513, 382, 317
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Trace Logger"
FONT 8, "MS Sans Serif", 400, 0, 0x0
BEGIN
SCROLLBAR IDC_SCRL_TRACER_LOG,389,4,10,169,SBS_VERT
EDITTEXT IDC_TRACER_LOG,4,4,384,169,ES_MULTILINE | ES_NOHIDESEL | ES_READONLY | WS_HSCROLL
CONTROL "Log last",IDC_RADIO_LOG_LAST,"Button",BS_AUTORADIOBUTTON | BS_LEFT,18,195,38,10
CONTROL "Log to File",IDC_RADIO_LOG_TO_FILE,"Button",BS_AUTORADIOBUTTON | BS_LEFT,18,213,48,10
LTEXT "lines to this window",106,110,195,72,10
PUSHBUTTON "Start Logging",IDC_BTN_START_STOP_LOGGING,177,176,67,14,BS_CENTER | BS_VCENTER
COMBOBOX IDC_TRACER_LOG_SIZE,58,193,48,127,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Log Options",109,12,230,378,69
SCROLLBAR IDC_SCRL_TRACER_LOG,367,4,11,169,SBS_VERT
EDITTEXT IDC_TRACER_LOG,4,4,363,169,ES_MULTILINE | ES_NOHIDESEL | ES_READONLY | WS_HSCROLL
CONTROL "Log last",IDC_RADIO_LOG_LAST,"Button",BS_AUTORADIOBUTTON | BS_LEFT,11,181,38,10
CONTROL "Log to File",IDC_RADIO_LOG_TO_FILE,"Button",BS_AUTORADIOBUTTON | BS_LEFT,11,198,47,10
LTEXT "lines to this window",106,101,181,63,10
PUSHBUTTON "Start Logging",IDC_BTN_START_STOP_LOGGING,165,178,67,14,BS_CENTER | BS_VCENTER
COMBOBOX IDC_TRACER_LOG_SIZE,51,179,48,127,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
GROUPBOX "Log Options",109,4,212,374,68
CONTROL "Log state of A, X, Y and S registers",IDC_CHECK_LOG_REGISTERS,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,19,242,126,10
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,224,126,10
CONTROL "Log Processor Status flags",IDC_CHECK_LOG_PROCESSOR_STATUS,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,149,242,104,10
PUSHBUTTON "Browse...",IDC_BTN_LOG_BROWSE,67,211,46,14,BS_CENTER | BS_VCENTER
LTEXT "",IDC_TRACER_STATS,121,212,246,13
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,141,224,104,10
PUSHBUTTON "Browse...",IDC_BTN_LOG_BROWSE,59,196,46,14,BS_CENTER | BS_VCENTER
CONTROL "Only log newly mapped code",IDC_CHECK_LOG_NEW_INSTRUCTIONS,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,19,315,111,10
GROUPBOX "Extra Log Options that work with the Code/Data Logger",113,12,302,378,30
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,295,111,10
GROUPBOX "Extra Log Options that work with the Code/Data Logger",113,4,282,374,29
CONTROL "Only log code that accesses newly mapped data",IDC_CHECK_LOG_NEW_DATA,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,149,315,171,10
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,141,295,171,10
CONTROL "Automatically update Window while logging",IDC_CHECK_LOG_UPDATE_WINDOW,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,203,195,160,10
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,141,198,160,10
CONTROL "Use Stack Pointer for code tabbing (nesting visualization)",IDC_CHECK_CODE_TABBING,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,149,283,197,10
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,141,264,197,10
CONTROL "To the left from disassembly text",IDC_CHECK_LOG_STATUSES_TO_THE_LEFT,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,262,242,119,10
CONTROL "Log Frames count",IDC_CHECK_LOG_FRAMES_COUNT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,19,255,102,10
CONTROL "Symbolic trace",IDC_CHECK_SYMBOLIC_TRACING,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,19,283,72,10
CONTROL "Log emulator messages",IDC_CHECK_LOG_MESSAGES,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,19,268,94,10
CONTROL "Log breakpoint hits",IDC_CHECK_LOG_BREAKPOINTS,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,149,268,82,10
CONTROL "Log Cycles count",IDC_CHECK_LOG_CYCLES_COUNT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,149,255,102,10
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,254,224,117,10
CONTROL "Log Frames count",IDC_CHECK_LOG_FRAMES_COUNT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,237,102,10
CONTROL "Symbolic trace",IDC_CHECK_SYMBOLIC_TRACING,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,264,72,10
CONTROL "Log emulator messages",IDC_CHECK_LOG_MESSAGES,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,11,250,94,10
CONTROL "Log breakpoint hits",IDC_CHECK_LOG_BREAKPOINTS,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,141,250,82,10
CONTROL "Log Cycles count",IDC_CHECK_LOG_CYCLES_COUNT,"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,141,237,102,10
CONTROL "Log Instructions count",IDC_CHECK_LOG_INSTRUCTIONS_COUNT,
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,262,255,102,10
"Button",BS_AUTOCHECKBOX | BS_LEFT | WS_TABSTOP,254,237,102,10
END
ADDBP DIALOGEX 66, 83, 196, 130

View File

@ -88,6 +88,9 @@ FILE *LOG_FP;
int Tracer_wndx=0, Tracer_wndy=0;
char trace_str[35000] = {0};
WNDPROC IDC_TRACER_LOG_oldWndProc = 0;
void ShowLogDirDialog(void);
void BeginLoggingSequence(void);
void EndLoggingSequence(void);
@ -96,6 +99,115 @@ void UpdateLogText(void);
void EnableTracerMenuItems(void);
int PromptForCDLogger(void);
// returns the address, or EOF if selection cursor points to something else
int Tracer_CheckClickingOnAnAddress(bool onlyCheckWhenNothingSelected)
{
// trace_str contains the text in the log window
int sel_start, sel_end;
SendDlgItemMessage(hTracer, IDC_TRACER_LOG, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
if (onlyCheckWhenNothingSelected)
if (sel_end > sel_start)
return EOF;
// find the "$" before sel_start
int i = sel_start - 1;
for (; i > sel_start - 6; i--)
if (i >= 0 && trace_str[i] == '$')
break;
if (i > sel_start - 6)
{
char offsetBuffer[5];
strncpy(offsetBuffer, trace_str + i + 1, 4);
offsetBuffer[4] = 0;
// invalidate the string if a space or \r is found in it
char* firstspace = strstr(offsetBuffer, " ");
if (!firstspace)
firstspace = strstr(offsetBuffer, "\r");
if (!firstspace)
{
unsigned int offset;
if (sscanf(offsetBuffer, "%4X", &offset) != EOF)
{
// select the text
SendDlgItemMessage(hTracer, IDC_TRACER_LOG, EM_SETSEL, (WPARAM)(i + 1), (LPARAM)(i + 5));
if (hDebug)
PrintOffsetToSeekAndBookmarkFields(offset);
return (int)offset;
}
}
}
return EOF;
}
BOOL CALLBACK IDC_TRACER_LOG_WndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_LBUTTONDBLCLK:
{
int offset = Tracer_CheckClickingOnAnAddress(false);
if (offset != EOF)
{
// open Debugger at this address
DoDebug(0);
if (hDebug)
{
Disassemble(hDebug, IDC_DEBUGGER_DISASSEMBLY, IDC_DEBUGGER_DISASSEMBLY_VSCR, offset);
PrintOffsetToSeekAndBookmarkFields(offset);
}
}
return 0;
}
case WM_LBUTTONUP:
{
Tracer_CheckClickingOnAnAddress(true);
break;
}
case WM_RBUTTONDOWN:
{
// if nothing is selected, simulate Left-click
int sel_start, sel_end;
SendDlgItemMessage(hTracer, IDC_TRACER_LOG, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
if (sel_start == sel_end)
{
CallWindowProc(IDC_TRACER_LOG_oldWndProc, hwndDlg, WM_LBUTTONDOWN, wParam, lParam);
CallWindowProc(IDC_TRACER_LOG_oldWndProc, hwndDlg, WM_LBUTTONUP, wParam, lParam);
return 0;
}
break;
}
case WM_RBUTTONUP:
{
// if nothing is selected, try bringing Symbolic Debug Naming dialog
int offset = Tracer_CheckClickingOnAnAddress(true);
if (offset != EOF)
{
if (DoSymbolicDebugNaming(offset, hTracer))
{
/*
// enable "Symbolic trace" if not yet enabled
if (!(logging_options & LOG_SYMBOLIC))
{
logging_options |= LOG_SYMBOLIC;
CheckDlgButton(hTracer, IDC_CHECK_SYMBOLIC_TRACING, BST_CHECKED);
}
*/
if (hDebug)
UpdateDebugger(false);
if (hMemView)
UpdateCaption();
}
}
break;
}
case WM_MOUSEWHEEL:
{
SendMessage(GetDlgItem(hTracer, IDC_SCRL_TRACER_LOG), uMsg, wParam, lParam);
return 0;
}
}
return CallWindowProc(IDC_TRACER_LOG_oldWndProc, hwndDlg, uMsg, wParam, lParam);
}
BOOL CALLBACK TracerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int i;
@ -138,7 +250,8 @@ BOOL CALLBACK TracerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
SendDlgItemMessage(hwndDlg, IDC_TRACER_LOG_SIZE, CB_INSERTSTRING, -1, (LPARAM)(LPSTR)log_optn_strlst[i]);
}
SendDlgItemMessage(hwndDlg, IDC_TRACER_LOG_SIZE, CB_SETCURSEL, (WPARAM)log_lines_option, 0);
SetDlgItemText(hwndDlg, IDC_TRACER_LOG, "Welcome to the Trace Logger.");
strcpy(trace_str, "Welcome to the Trace Logger.");
SetDlgItemText(hwndDlg, IDC_TRACER_LOG, trace_str);
logtofile = 0;
CheckDlgButton(hwndDlg, IDC_CHECK_LOG_REGISTERS, (logging_options & LOG_REGISTERS) ? BST_CHECKED : BST_UNCHECKED);
@ -158,6 +271,9 @@ BOOL CALLBACK TracerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
EnableWindow(GetDlgItem(hwndDlg, IDC_BTN_LOG_BROWSE), FALSE);
CheckDlgButton(hwndDlg, IDC_CHECK_LOG_UPDATE_WINDOW, log_update_window ? BST_CHECKED : BST_UNCHECKED);
EnableTracerMenuItems();
// subclass editfield
IDC_TRACER_LOG_oldWndProc = (WNDPROC)SetWindowLong(GetDlgItem(hwndDlg, IDC_TRACER_LOG), GWL_WNDPROC, (LONG)IDC_TRACER_LOG_WndProc);
break;
}
case WM_CLOSE:
@ -247,11 +363,10 @@ BOOL CALLBACK TracerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
if(!FCEUI_EmulationPaused() && !log_update_window)
{
// Assemble the message to pause the game. Uses the current hotkey mapping dynamically
string m1 = "Pause the game (press ";
string m2 = GetKeyComboName(FCEUD_CommandMapping[EMUCMD_PAUSE]);
string m3 = " key or snap the Debugger) to update this window.\r\n";
string pauseMessage = m1 + m2 + m3;
SetDlgItemText(hTracer, IDC_TRACER_LOG, pauseMessage.c_str());
strcpy(trace_str, "Pause the game (press ");
strcat(trace_str, GetKeyComboName(FCEUD_CommandMapping[EMUCMD_PAUSE]));
strcat(trace_str, " key or snap the Debugger) to update this window.\r\n");
SetDlgItemText(hTracer, IDC_TRACER_LOG, trace_str);
}
break;
}
@ -265,15 +380,16 @@ BOOL CALLBACK TracerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
break;
case WM_MOVING:
break;
}
switch(uMsg) {
case WM_VSCROLL:
if (lParam) {
if ((!logging) || logtofile) break;
{
if (lParam)
{
if ((!logging) || logtofile)
break;
if(!FCEUI_EmulationPaused() && !log_update_window) break; //mbg merge 7/19/06 changd to use EmulationPaused()
if (!FCEUI_EmulationPaused() && !log_update_window)
break;
GetScrollInfo((HWND)lParam,SB_CTL,&tracesi);
switch(LOWORD(wParam))
@ -296,13 +412,30 @@ BOOL CALLBACK TracerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
UpdateLogText();
}
break;
}
case WM_MOUSEWHEEL:
{
GetScrollInfo((HWND)lParam, SB_CTL, &tracesi);
i = GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA;
if (i < -1 || i > 1)
i *= 2;
tracesi.nPos -= i;
if ((tracesi.nPos + (int)tracesi.nPage) > tracesi.nMax)
tracesi.nPos = tracesi.nMax - tracesi.nPage;
else if (tracesi.nPos < tracesi.nMin)
tracesi.nPos = tracesi.nMin;
SetScrollInfo((HWND)lParam, SB_CTL, &tracesi, TRUE);
UpdateLogText();
break;
}
}
return FALSE;
}
void BeginLoggingSequence(void)
{
char str[2048], str2[100];
char str2[100];
int i, j;
if(!PromptForCDLogger())return; //do nothing if user selected no and CD Logger is needed
@ -312,9 +445,10 @@ void BeginLoggingSequence(void)
if(logfilename == NULL) ShowLogDirDialog();
if (!logfilename) return;
LOG_FP = fopen(logfilename,"w");
if(LOG_FP == NULL){
sprintf(str,"Error Opening File %s",logfilename);
MessageBox(hTracer,str, "File Error", MB_OK);
if (LOG_FP == NULL)
{
sprintf(trace_str, "Error Opening File %s", logfilename);
MessageBox(hTracer, trace_str, "File Error", MB_OK);
return;
}
fprintf(LOG_FP,FCEU_NAME_AND_VERSION" - Trace Log File\n"); //mbg merge 7/19/06 changed string
@ -323,8 +457,8 @@ void BeginLoggingSequence(void)
log_lines_option = SendDlgItemMessage(hTracer, IDC_TRACER_LOG_SIZE, CB_GETCURSEL, 0, 0);
if (log_lines_option == CB_ERR)
log_lines_option = 0;
strcpy(str,"Allocating Memory...\r\n");
SetDlgItemText(hTracer, IDC_TRACER_LOG, str);
strcpy(trace_str, "Allocating Memory...\r\n");
SetDlgItemText(hTracer, IDC_TRACER_LOG, trace_str);
tracelogbufsize = j = log_optn_intlst[log_lines_option];
tracelogbuf = (char**)malloc(j*sizeof(char *)); //mbg merge 7/19/06 added cast
for(i = 0;i < j;i++)
@ -333,14 +467,12 @@ void BeginLoggingSequence(void)
tracelogbuf[i][0] = 0;
}
sprintf(str2, "%d Bytes Allocated...\r\n", j * LOG_LINE_MAX_LEN);
strcat(str,str2);
strcat(trace_str, str2);
// Assemble the message to pause the game. Uses the current hotkey mapping dynamically
string m1 = "Pause the game (press ";
string m2 = GetKeyComboName(FCEUD_CommandMapping[EMUCMD_PAUSE]);
string m3 = " key or snap the Debugger) to update this window.\r\n";
string pauseMessage = m1 + m2 + m3;
strcat(str, pauseMessage.c_str());
SetDlgItemText(hTracer, IDC_TRACER_LOG, str);
strcat(trace_str, "Pause the game (press ");
strcat(trace_str, GetKeyComboName(FCEUD_CommandMapping[EMUCMD_PAUSE]));
strcat(trace_str, " key or snap the Debugger) to update this window.\r\n");
SetDlgItemText(hTracer, IDC_TRACER_LOG, trace_str);
tracelogbufpos = tracelogbufusedsize = 0;
}
@ -653,24 +785,27 @@ void UpdateLogWindow(void)
void UpdateLogText(void)
{
int i, j;
char str[3000];
str[0] = 0;
trace_str[0] = 0;
if (!tracelogbufpos)
return;
int last_line = tracesi.nPos + tracesi.nPage;
if (last_line > tracesi.nMax)
last_line = tracesi.nMax;
for(i = tracesi.nPos; i < last_line; i++)
for (i = tracesi.nPos; i < last_line; i++)
{
j = i;
if(tracelogbufusedsize == tracelogbufsize)
{
j = (tracelogbufpos+i)%tracelogbufsize;
j = (tracelogbufpos + i) % tracelogbufsize;
}
strcat(str,tracelogbuf[j]);
strcat(trace_str, tracelogbuf[j]);
}
SetDlgItemText(hTracer, IDC_TRACER_LOG, str);
sprintf(str,"nPage = %d, nPos = %d, nMax = %d, nMin = %d",tracesi.nPage,tracesi.nPos,tracesi.nMax,tracesi.nMin);
SetDlgItemText(hTracer, IDC_TRACER_STATS, str);
SetDlgItemText(hTracer, IDC_TRACER_LOG, trace_str);
//sprintf(str,"nPage = %d, nPos = %d, nMax = %d, nMin = %d",tracesi.nPage,tracesi.nPos,tracesi.nMax,tracesi.nMin);
//SetDlgItemText(hTracer, IDC_TRACER_STATS, str);
return;
}