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

This commit is contained in:
ansstuff 2013-09-09 21:06:54 +00:00
parent 2fc781b581
commit f9b51f4e7e
7 changed files with 422 additions and 129 deletions

View File

@ -79,7 +79,7 @@ char debug_str[35000] = {0};
char debug_cdl_str[500] = {0};
char* debug_decoration_name;
char* debug_decoration_comment;
char debug_str_decoration_comment[NL_MAX_MULTILINE_COMMENT_LEN + 2] = {0};
char debug_str_decoration_comment[NL_MAX_MULTILINE_COMMENT_LEN + 10] = {0};
// this is used to keep track of addresses that lines of Disassembly window correspond to
std::vector<unsigned int> disassembly_addresses;
@ -385,15 +385,6 @@ BOOL CALLBACK AddbpCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
void Disassemble(HWND hWnd, int id, int scrollid, unsigned int addr)
{
// ################################## Start of SP CODE ###########################
// Changed size of str (TODO: Better calculation of max size)
// Changed the buffer size of str to 35000
symbDebugEnabled = IsDlgButtonChecked(hWnd, IDC_DEBUGGER_ENABLE_SYMBOLIC);
// ################################## End of SP CODE ###########################
char chr[40] = {0};
int size;
uint8 opcode[3];
@ -450,19 +441,20 @@ void Disassemble(HWND hWnd, int id, int scrollid, unsigned int addr)
strcat(debug_str_decoration_comment, "\r\n");
debug_decoration_comment = debug_str_decoration_comment;
// divide the debug_str_decoration_comment into strings (Comment1, Comment2, ...)
char* end_pos = strstr(debug_decoration_comment, "\r");
char* end_pos = strstr(debug_decoration_comment, "\r\n");
while (end_pos)
{
end_pos[0] = 0; // set \0 instead of \r
strcat(debug_str, "; ");
strcat(debug_str, debug_decoration_comment);
strcat(debug_str, "\r\n");
end_pos += 2;
debug_decoration_comment = end_pos;
end_pos = strstr(debug_decoration_comment, "\r");
// we added one line to the disassembly window
disassembly_addresses.push_back(addr);
i++;
end_pos += 2;
debug_decoration_comment = end_pos;
end_pos = strstr(end_pos, "\r\n");
}
}
}
@ -1373,81 +1365,90 @@ void LoadGameDebuggerData(HWND hwndDlg = hDebug)
FillBreakList(hwndDlg);
}
// returns the address, or EOF if selection cursor points to something else
int CheckClickingOnAnAddress()
{
// 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);
// find the ":" or "$" before sel_start
int i = sel_start - 1;
for (; i > sel_start - 6; i--)
if (i >= 0 && debug_str[i] == ':' || debug_str[i] == '$')
break;
if (i > sel_start - 6)
{
char offsetBuffer[5];
strncpy(offsetBuffer, debug_str + i + 1, 4);
offsetBuffer[4] = 0;
// invalidate the string if a space or \r is found
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(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);
return (int)offset;
}
}
}
return EOF;
}
BOOL CALLBACK IDC_DEBUGGER_DISASSEMBLY_WndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_LBUTTONDBLCLK:
{
// 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);
// find the ":" or "$" before sel_start
int i = sel_start - 1;
for (; i > sel_start - 6; i--)
if (i >= 0 && debug_str[i] == ':' || debug_str[i] == '$')
break;
if (i > sel_start - 6)
int offset = CheckClickingOnAnAddress();
if (offset != EOF)
{
char offsetBuffer[5];
strncpy(offsetBuffer, debug_str + i + 1, 4);
offsetBuffer[4] = 0;
// invalidate the string if a space or \r is found
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(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_SETSEL, (WPARAM)(i + 1), (LPARAM)(i + 5));
childwnd = 1;
if (DialogBoxParam(fceu_hInstance, "ADDBP", hwndDlg, AddbpCallB, offset))
AddBreakList();
childwnd = 0;
UpdateDebugger(false);
}
}
// bring "Add Breakpoint" dialog
childwnd = 1;
if (DialogBoxParam(fceu_hInstance, "ADDBP", hwndDlg, AddbpCallB, offset))
AddBreakList();
childwnd = 0;
UpdateDebugger(false);
}
return 0;
}
case WM_LBUTTONUP:
{
// debug_str contains the text in the disassembly window
CheckClickingOnAnAddress();
break;
}
case WM_RBUTTONDOWN:
{
// if nothing is selected, simulate Left-click
int sel_start, sel_end;
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
// only continue if there's no selection in the Disassembly window
if (sel_start == sel_end)
{
// find the ":" or "$" before sel_start
int i = sel_start - 1;
for (; i > sel_start - 6; i--)
if (i >= 0 && debug_str[i] == ':' || debug_str[i] == '$')
break;
if (i > sel_start - 6)
{
char offsetBuffer[5] = {0};
strncpy(offsetBuffer, debug_str + i + 1, 4);
offsetBuffer[4] = 0;
// truncate the string if a space or \r is found
char* firstspace = strstr(offsetBuffer, " ");
if (!firstspace)
firstspace = strstr(offsetBuffer, "\r");
if (firstspace)
firstspace[0] = 0;
unsigned int offset;
if (sscanf(offsetBuffer, "%4X", &offset) != EOF)
{
// select the text
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_SETSEL, (WPARAM)(i + 1), (LPARAM)(i + 1 + strlen(offsetBuffer)));
// 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);
}
}
CallWindowProc(IDC_DEBUGGER_DISASSEMBLY_oldWndProc, hwndDlg, WM_LBUTTONDOWN, wParam, lParam);
CallWindowProc(IDC_DEBUGGER_DISASSEMBLY_oldWndProc, hwndDlg, WM_LBUTTONUP, wParam, lParam);
return 0;
}
break;
}
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 = CheckClickingOnAnAddress();
if (offset != EOF)
DoSymbolicDebugNaming(offset);
}
break;
}
@ -2068,7 +2069,12 @@ BOOL CALLBACK DebuggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
case IDC_DEBUGGER_BOOKMARK_ADD: AddDebuggerBookmark(hwndDlg); break;
case IDC_DEBUGGER_BOOKMARK_DEL: DeleteDebuggerBookmark(hwndDlg); break;
case IDC_DEBUGGER_BOOKMARK_NAME: NameDebuggerBookmark(hwndDlg); break;
case IDC_DEBUGGER_ENABLE_SYMBOLIC: UpdateDebugger(false); break;
case IDC_DEBUGGER_ENABLE_SYMBOLIC:
{
symbDebugEnabled = IsDlgButtonChecked(hwndDlg, IDC_DEBUGGER_ENABLE_SYMBOLIC);
UpdateDebugger(false);
break;
}
// ################################## End of SP CODE ###########################
@ -2132,11 +2138,13 @@ BOOL CALLBACK DebuggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
extern void iNESGI(GI h);
void DoPatcher(int address,HWND hParent)
void DoPatcher(int address, HWND hParent)
{
iapoffset=address;
if(GameInterface==iNESGI)DialogBox(fceu_hInstance,"ROMPATCHER",hParent,PatcherCallB);
else MessageBox(hDebug, "Sorry, The Patcher only works on INES rom images", "Error", MB_OK);
iapoffset = address;
if (GameInterface == iNESGI)
DialogBox(fceu_hInstance, "ROMPATCHER", hParent, PatcherCallB);
else
MessageBox(hDebug, "Sorry, The Patcher only works on INES rom images", "Error", MB_OK);
UpdateDebugger(false);
}

View File

@ -43,6 +43,7 @@ char NLfilename[2048];
char symbDebugEnabled = 0;
int debuggerWasActive = 0;
char temp_chr[40] = {0};
char delimiterChar[2] = "#";
extern BOOL CALLBACK nameBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
extern char bookmarkDescription[];
@ -131,7 +132,7 @@ int parseLine(char* line, Name* n)
// Attempt to tokenize the given line
pos = strstr(line, "#");
pos = strstr(line, delimiterChar);
if (!pos)
{
@ -194,7 +195,7 @@ int parseLine(char* line, Name* n)
// Attempt to tokenize the string again to find the name of the address
pos = strstr(line, "#");
pos = strstr(line, delimiterChar);
if (!pos)
{
@ -207,7 +208,7 @@ int parseLine(char* line, Name* n)
if (*line)
{
if (strlen(line) > NL_MAX_NAME_LEN)
line[NL_MAX_NAME_LEN] = 0;
line[NL_MAX_NAME_LEN + 1] = 0;
n->name = (char*)malloc(strlen(line) + 1);
strcpy(n->name, line);
}
@ -225,7 +226,15 @@ int parseLine(char* line, Name* n)
if (*line > 0x0D)
{
if (strlen(line) > NL_MAX_MULTILINE_COMMENT_LEN)
line[NL_MAX_MULTILINE_COMMENT_LEN] = 0;
line[NL_MAX_MULTILINE_COMMENT_LEN + 1] = 0;
// remove all backslashes after \r\n
char* crlf_pos = strstr(line, "\r\n\\");
while (crlf_pos)
{
strcpy(crlf_pos + 2, crlf_pos + 3);
crlf_pos = strstr(crlf_pos + 2, "\r\n\\");
}
n->comment = (char*)malloc(strlen(line) + 1);
strcpy(n->comment, line);
}
@ -302,14 +311,8 @@ Name* parse(char* lines, const char* filename)
{
pos[0] = '\r';
pos[1] = '\n';
pos += 2;
}
else
{
// Remove backslash
pos[1] = ' ';
pos += 1;
}
pos += 2;
}
if (!pos)
@ -318,7 +321,10 @@ Name* parse(char* lines, const char* filename)
break;
}
*pos = 0;
if (pos[-1] == '\r')
pos[-1] = 0;
else
*pos = 0;
// Attempt to parse the current line
fail = parseLine(lines, cur);
@ -540,6 +546,46 @@ Name* searchNode(Name* node, const char* offs)
return 0;
}
char* generateNLFilenameForAddress(unsigned int address)
{
if (address < 0x8000)
{
// The NL file for the RAM addresses has the name nesrom.nes.ram.nl
strcpy(NLfilename, mass_replace(LoadedRomFName, "|", ".").c_str());
strcat(NLfilename, ".ram.nl");
} else
{
sprintf(NLfilename, "%s.%X.nl", mass_replace(LoadedRomFName, "|", ".").c_str(), getBank(address));
}
return NLfilename;
}
Name* getNamesPointerForAddress(unsigned int address)
{
if (address < 0x8000)
{
return ramBankNames;
} else if (address < 0xC000)
{
return loadedBankNames;
} else
{
return lastBankNames;
}
}
void setNamesPointerForAddress(unsigned int address, Name* newNode)
{
if (address < 0x8000)
{
ramBankNames = newNode;
} else if (address < 0xC000)
{
loadedBankNames = newNode;
} else
{
lastBankNames = newNode;
}
}
/**
* Loads the necessary NL files
**/
@ -554,12 +600,8 @@ void loadNameFiles()
if (ramBankNames)
free(ramBankNames);
// The NL file for the RAM addresses has the name nesrom.nes.ram.nl
strcpy(NLfilename, mass_replace(LoadedRomFName, "|", ".").c_str());
strcat(NLfilename, ".ram.nl");
// Load the address descriptions for the RAM addresses
ramBankNames = parseNameFile(NLfilename);
ramBankNames = parseNameFile(generateNLFilenameForAddress(0x0000));
}
// Find out which bank is loaded at 0xC000
@ -574,14 +616,11 @@ void loadNameFiles()
// to load the address descriptions of the new bank.
lastBank = cb;
// Get the name of the NL file
sprintf(NLfilename, "%s.%X.nl", mass_replace(LoadedRomFName, "|", ".").c_str(), lastBank);
if (lastBankNames)
freeList(lastBankNames);
// Load new address definitions
lastBankNames = parseNameFile(NLfilename);
lastBankNames = parseNameFile(generateNLFilenameForAddress(0xC000));
}
// Find out which bank is loaded at 0x8000
@ -597,14 +636,11 @@ void loadNameFiles()
loadedBank = cb;
// Get the name of the NL file
sprintf(NLfilename, "%s.%X.nl", mass_replace(LoadedRomFName, "|", ".").c_str(), loadedBank);
if (loadedBankNames)
freeList(loadedBankNames);
// Load new address definitions
loadedBankNames = parseNameFile(NLfilename);
loadedBankNames = parseNameFile(generateNLFilenameForAddress(0x8000));
}
}
@ -624,7 +660,7 @@ void decorateAddress(unsigned int addr, char** str_name, char** str_comment)
} else
{
// Search address definition node for a ROM address
n = addr >= 0xC000 ? searchNode(lastBankNames, temp_chr) : searchNode(loadedBankNames, temp_chr);
n = (addr >= 0xC000) ? searchNode(lastBankNames, temp_chr) : searchNode(loadedBankNames, temp_chr);
}
if (n)
@ -801,3 +837,233 @@ void GoToDebuggerBookmark(HWND hwnd)
unsigned int n = getBookmarkAddress(selectedItem);
Disassemble(hwnd, IDC_DEBUGGER_DISASSEMBLY, IDC_DEBUGGER_DISASSEMBLY_VSCR, n);
}
BOOL CALLBACK SymbolicNamingCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG:
{
CenterWindow(hwndDlg);
unsigned int newAddress = lParam;
// filename
generateNLFilenameForAddress(newAddress);
SetDlgItemText(hwndDlg, IDC_SYMBOLIC_FILENAME, NLfilename);
// offset
sprintf(temp_chr, "$%04X", newAddress);
SetDlgItemText(hwndDlg, IDC_SYMBOLIC_ADDRESS, temp_chr);
char* oldName = 0;
char* oldComment = 0;
decorateAddress(newAddress, &oldName, &oldComment);
// name
SendDlgItemMessage(hwndDlg, IDC_SYMBOLIC_NAME, EM_SETLIMITTEXT, NL_MAX_NAME_LEN, 0);
if (oldName && oldName[0])
SetDlgItemText(hwndDlg, IDC_SYMBOLIC_NAME, oldName);
// comment
SendDlgItemMessage(hwndDlg, IDC_SYMBOLIC_COMMENT, EM_SETLIMITTEXT, NL_MAX_MULTILINE_COMMENT_LEN, 0);
if (oldComment && oldComment[0])
SetDlgItemText(hwndDlg, IDC_SYMBOLIC_COMMENT, oldComment);
// set focus to IDC_SYMBOLIC_NAME
SendMessage(hwndDlg, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hwndDlg, IDC_SYMBOLIC_NAME), true);
break;
}
case WM_CLOSE:
case WM_QUIT:
break;
case WM_COMMAND:
{
switch(HIWORD(wParam))
{
case BN_CLICKED:
{
switch(LOWORD(wParam))
{
case IDOK:
{
unsigned int newAddress = 0;
char newOffset[6] = {0};
GetDlgItemText(hwndDlg, IDC_SYMBOLIC_ADDRESS, newOffset, 6);
if (sscanf(newOffset, "%*[$]%4X", &newAddress) != EOF)
{
char newName[NL_MAX_NAME_LEN + 1] = {0};
GetDlgItemText(hwndDlg, IDC_SYMBOLIC_NAME, newName, NL_MAX_NAME_LEN + 1);
char newComment[NL_MAX_MULTILINE_COMMENT_LEN + 1] = {0};
GetDlgItemText(hwndDlg, IDC_SYMBOLIC_COMMENT, newComment, NL_MAX_MULTILINE_COMMENT_LEN + 1);
AddNewSymbolicName(newAddress, newOffset, newName, newComment);
WriteNameFileToDisk(generateNLFilenameForAddress(newAddress), getNamesPointerForAddress(newAddress));
}
EndDialog(hwndDlg, 1);
break;
}
case IDCANCEL:
{
EndDialog(hwndDlg, 0);
break;
}
}
break;
}
}
break;
}
}
return FALSE;
}
void DoSymbolicDebugNaming(int offset)
{
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;
}
void AddNewSymbolicName(unsigned int newAddress, char* newOffset, char* newName, char* newComment)
{
Name* initialNode = getNamesPointerForAddress(newAddress);
Name* node = initialNode;
// remove all delimiterChars from name and comment
char* pos = newName;
while (pos < newName + strlen(newName))
{
pos = strstr(pos, delimiterChar);
if (pos)
strcpy(pos, pos + 1);
else
break;
}
pos = newComment;
while (pos < newComment + strlen(newComment))
{
pos = strstr(pos, delimiterChar);
if (pos)
strcpy(pos, pos + 1);
else
break;
}
if (newName[0])
{
if (!initialNode)
{
// no previous data, create new list
node = (Name*)malloc(sizeof(Name));
node->offset = (char*)malloc(strlen(newOffset) + 1);
strcpy(node->offset, newOffset);
node->name = (char*)malloc(strlen(newName) + 1);
strcpy(node->name, newName);
node->comment = (char*)malloc(strlen(newComment) + 1);
strcpy(node->comment, newComment);
node->next = 0;
setNamesPointerForAddress(newAddress, node);
} else
{
// search the list
while (node)
{
if (!strcmp(node->offset, newOffset))
{
// found matching address - replace its name and comment
free(node->name);
node->name = (char*)malloc(strlen(newName) + 1);
strcpy(node->name, newName);
free(node->comment);
node->comment = (char*)malloc(strlen(newComment) + 1);
strcpy(node->comment, newComment);
break;
}
if (node->next)
{
node = node->next;
} else
{
// this is the last node in the list - so just append the address
Name* newNode = (Name*)malloc(sizeof(Name));
node->next = newNode;
newNode->offset = (char*)malloc(strlen(newOffset) + 1);
strcpy(newNode->offset, newOffset);
newNode->name = (char*)malloc(strlen(newName) + 1);
strcpy(newNode->name, newName);
newNode->comment = (char*)malloc(strlen(newComment) + 1);
strcpy(newNode->comment, newComment);
newNode->next = 0;
break;
}
}
}
} else
{
// name field is empty - remove the address from the list
Name* previousNode = 0;
while (node)
{
if (!strcmp(node->offset, newOffset))
{
// found matching address - delete it
free(node->offset);
free(node->name);
free(node->comment);
if (previousNode)
previousNode->next = node->next;
if (node == initialNode)
setNamesPointerForAddress(newAddress, node->next);
free(node);
break;
}
previousNode = node;
node = node->next;
}
}
}
void WriteNameFileToDisk(const char* filename, Name* node)
{
FILE* f = fopen(filename, "wb");
char tempComment[NL_MAX_MULTILINE_COMMENT_LEN + 10];
if (f)
{
char tempString[10 + 1 + NL_MAX_NAME_LEN + 1 + NL_MAX_MULTILINE_COMMENT_LEN + 1];
while (node)
{
strcpy(tempString, node->offset);
strcat(tempString, delimiterChar);
if (node->name)
strcat(tempString, node->name);
strcat(tempString, delimiterChar);
if (node->comment)
{
// dump multiline comment
strcpy(tempComment, node->comment);
char* remainder_pos = tempComment;
char* crlf_pos = strstr(tempComment, "\r\n");
while (crlf_pos)
{
*crlf_pos = 0;
strcat(tempString, remainder_pos);
strcat(tempString, "\r\n\\");
crlf_pos = remainder_pos = crlf_pos + 2;
crlf_pos = strstr(crlf_pos, "\r\n");
}
strcat(tempString, remainder_pos);
strcat(tempString, "\r\n");
} else
{
strcat(tempString, "\r\n");
}
// write to the file
fwrite(tempString, 1, strlen(tempString), f);
node = node->next;
}
fclose(f);
}
}

View File

@ -38,6 +38,9 @@ extern std::vector<std::string> bookmarks_name;
extern int debuggerWasActive;
int checkCondition(const char* buffer, int num);
char* generateNLFilenameForAddress(unsigned int address);
Name* getNamesPointerForAddress(unsigned int address);
void setNamesPointerForAddress(unsigned int address, Name* newNode);
void loadNameFiles();
void decorateAddress(unsigned int addr, char** str_name, char** str_comment);
void replaceNames(Name* list, char* str);
@ -50,3 +53,7 @@ void FillDebuggerBookmarkListbox(HWND hwnd);
void GoToDebuggerBookmark(HWND hwnd);
int isHex(char c);
void DoSymbolicDebugNaming(int offset);
void AddNewSymbolicName(unsigned int newAddress, char* newOffset, char* newName, char* newComment);
void WriteNameFileToDisk(const char* filename, Name* node);

View File

@ -638,29 +638,13 @@ void UpdateCaption()
sprintf(addrName, "$%04X", CursorStartAddy);
strcpy(addrNameCopy, addrName);
// try to find the name for this address in loadedBankNames
replaceNames(ramBankNames, addrName);
replaceNames(getNamesPointerForAddress(CursorStartAddy), addrName);
// check if anything chenged in this string
if (strcmp(addrName, addrNameCopy))
{
// changes found, so the string was decorated by symbolic name - then output it
strcat(str, " - ");
strcat(str, addrName);
} else
{
// name was not found in ramBankNames, try loadedBankNames
replaceNames(loadedBankNames, addrName);
if (strcmp(addrName, addrNameCopy))
{
strcat(str, " - ");
strcat(str, addrName);
} else
{
// name was not found in ramBankNames, try loadedBankNames
replaceNames(lastBankNames, addrName);
if (strcmp(addrName, addrNameCopy))
{
strcat(str, " - ");
strcat(str, addrName);
}
}
}
}
} else

View File

@ -2193,6 +2193,23 @@ BEGIN
GROUPBOX "Settings",IDC_STATIC,6,4,91,177
END
IDD_SYMBOLIC_DEBUG_NAMING DIALOGEX 0, 0, 245, 83
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Symbolic Debug Naming"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,132,62,50,14
PUSHBUTTON "Cancel",IDCANCEL,189,62,50,14
LTEXT "File",IDC_STATIC,7,7,15,9
EDITTEXT IDC_SYMBOLIC_ADDRESS,38,24,33,13,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP
LTEXT "Address",IDC_STATIC,6,26,30,10
EDITTEXT IDC_SYMBOLIC_NAME,107,24,132,13,ES_AUTOHSCROLL
LTEXT "Name",IDC_STATIC,83,26,22,10
LTEXT "Comment",IDC_STATIC,6,45,37,10
EDITTEXT IDC_SYMBOLIC_COMMENT,45,43,194,13,ES_AUTOHSCROLL
EDITTEXT IDC_SYMBOLIC_FILENAME,24,6,215,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP
END
/////////////////////////////////////////////////////////////////////////////
//
@ -2205,6 +2222,11 @@ BEGIN
IDD_TASEDITOR_SAVINGOPTIONS, DIALOG
BEGIN
END
IDD_SYMBOLIC_DEBUG_NAMING, DIALOG
BEGIN
BOTTOMMARGIN, 82
END
END
#endif // APSTUDIO_INVOKED

View File

@ -361,6 +361,7 @@
#define IDB_BITMAP_SELECTED18 287
#define IDB_BITMAP_SELECTED19 288
#define IDD_TASEDITOR_SAVINGOPTIONS 289
#define IDD_SYMBOLIC_DEBUG_NAMING 290
#define MENU_HIDE_MENU 300
#define COMBO_FILTER 300
#define IDC_EDIT_AUTHORINFO 300
@ -573,9 +574,14 @@
#define IDC_AUTOSAVE_PERIOD 1147
#define IDC_BUTTON9 1148
#define TASEDITOR_FIND_NEXT_SIMILAR_MARKER 1148
#define IDC_SYMBOLIC_ADDRESS 1148
#define IDC_HISTORYLIST 1149
#define IDC_SYMBOLIC_NAME 1149
#define IDC_BOOKMARKSLIST 1150
#define IDC_SYMBOLIC_ADDRESS2 1150
#define IDC_SYMBOLIC_FILENAME 1150
#define TASEDITOR_NEXT_MARKER 1151
#define IDC_SYMBOLIC_COMMENT 1151
#define IDC_BRANCHES_BUTTON 1152
#define IDC_JUMP_PLAYBACK_BUTTON 1153
#define IDC_EDIT2 1154
@ -1202,9 +1208,9 @@
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 290
#define _APS_NEXT_RESOURCE_VALUE 291
#define _APS_NEXT_COMMAND_VALUE 40589
#define _APS_NEXT_CONTROL_VALUE 1289
#define _APS_NEXT_CONTROL_VALUE 1290
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@ -77,8 +77,8 @@ char str_result[LOG_LINE_MAX_LEN] = {0};
char str_temp[LOG_LINE_MAX_LEN] = {0};
char* tracer_decoration_name;
char* tracer_decoration_comment;
char str_decoration[NL_MAX_MULTILINE_COMMENT_LEN + 2] = {0};
char str_decoration_comment[NL_MAX_MULTILINE_COMMENT_LEN + 2] = {0};
char str_decoration[NL_MAX_MULTILINE_COMMENT_LEN + 10] = {0};
char str_decoration_comment[NL_MAX_MULTILINE_COMMENT_LEN + 10] = {0};
bool log_old_emu_paused = true; // thanks to this flag the window only updates once after the game is paused
extern bool JustFrameAdvanced;
@ -452,7 +452,7 @@ void FCEUD_TraceInstruction(uint8 *opcode, int size)
strcat(str_decoration_comment, "\r\n");
tracer_decoration_comment = str_decoration_comment;
// divide the str_decoration_comment into strings (Comment1, Comment2, ...)
char* end_pos = strstr(tracer_decoration_comment, "\r");
char* end_pos = strstr(tracer_decoration_comment, "\r\n");
while (end_pos)
{
end_pos[0] = 0; // set \0 instead of \r
@ -461,7 +461,7 @@ void FCEUD_TraceInstruction(uint8 *opcode, int size)
OutputLogLine(str_decoration, true);
end_pos += 2;
tracer_decoration_comment = end_pos;
end_pos = strstr(tracer_decoration_comment, "\r");
end_pos = strstr(end_pos, "\r\n");
}
}
replaceNames(ramBankNames, a);