* Debugger: added Symbolic Debug naming by right-clicking any address
This commit is contained in:
parent
2fc781b581
commit
f9b51f4e7e
|
@ -79,7 +79,7 @@ char debug_str[35000] = {0};
|
||||||
char debug_cdl_str[500] = {0};
|
char debug_cdl_str[500] = {0};
|
||||||
char* debug_decoration_name;
|
char* debug_decoration_name;
|
||||||
char* debug_decoration_comment;
|
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
|
// this is used to keep track of addresses that lines of Disassembly window correspond to
|
||||||
std::vector<unsigned int> disassembly_addresses;
|
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)
|
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};
|
char chr[40] = {0};
|
||||||
int size;
|
int size;
|
||||||
uint8 opcode[3];
|
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");
|
strcat(debug_str_decoration_comment, "\r\n");
|
||||||
debug_decoration_comment = debug_str_decoration_comment;
|
debug_decoration_comment = debug_str_decoration_comment;
|
||||||
// divide the debug_str_decoration_comment into strings (Comment1, Comment2, ...)
|
// 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)
|
while (end_pos)
|
||||||
{
|
{
|
||||||
end_pos[0] = 0; // set \0 instead of \r
|
end_pos[0] = 0; // set \0 instead of \r
|
||||||
strcat(debug_str, "; ");
|
strcat(debug_str, "; ");
|
||||||
strcat(debug_str, debug_decoration_comment);
|
strcat(debug_str, debug_decoration_comment);
|
||||||
strcat(debug_str, "\r\n");
|
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
|
// we added one line to the disassembly window
|
||||||
disassembly_addresses.push_back(addr);
|
disassembly_addresses.push_back(addr);
|
||||||
i++;
|
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);
|
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)
|
BOOL CALLBACK IDC_DEBUGGER_DISASSEMBLY_WndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
switch(uMsg)
|
switch(uMsg)
|
||||||
{
|
{
|
||||||
case WM_LBUTTONDBLCLK:
|
case WM_LBUTTONDBLCLK:
|
||||||
{
|
{
|
||||||
// debug_str contains the text in the disassembly window
|
int offset = CheckClickingOnAnAddress();
|
||||||
int sel_start, sel_end;
|
if (offset != EOF)
|
||||||
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];
|
// bring "Add Breakpoint" dialog
|
||||||
strncpy(offsetBuffer, debug_str + i + 1, 4);
|
childwnd = 1;
|
||||||
offsetBuffer[4] = 0;
|
if (DialogBoxParam(fceu_hInstance, "ADDBP", hwndDlg, AddbpCallB, offset))
|
||||||
// invalidate the string if a space or \r is found
|
AddBreakList();
|
||||||
char* firstspace = strstr(offsetBuffer, " ");
|
childwnd = 0;
|
||||||
if (!firstspace)
|
UpdateDebugger(false);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case WM_LBUTTONUP:
|
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;
|
int sel_start, sel_end;
|
||||||
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&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)
|
if (sel_start == sel_end)
|
||||||
{
|
{
|
||||||
// find the ":" or "$" before sel_start
|
CallWindowProc(IDC_DEBUGGER_DISASSEMBLY_oldWndProc, hwndDlg, WM_LBUTTONDOWN, wParam, lParam);
|
||||||
int i = sel_start - 1;
|
CallWindowProc(IDC_DEBUGGER_DISASSEMBLY_oldWndProc, hwndDlg, WM_LBUTTONUP, wParam, lParam);
|
||||||
for (; i > sel_start - 6; i--)
|
return 0;
|
||||||
if (i >= 0 && debug_str[i] == ':' || debug_str[i] == '$')
|
}
|
||||||
break;
|
break;
|
||||||
if (i > sel_start - 6)
|
}
|
||||||
{
|
case WM_RBUTTONUP:
|
||||||
char offsetBuffer[5] = {0};
|
{
|
||||||
strncpy(offsetBuffer, debug_str + i + 1, 4);
|
// if nothing is selected, try bringing Symbolic Debug Naming dialog
|
||||||
offsetBuffer[4] = 0;
|
int sel_start, sel_end;
|
||||||
// truncate the string if a space or \r is found
|
SendDlgItemMessage(hDebug, IDC_DEBUGGER_DISASSEMBLY, EM_GETSEL, (WPARAM)&sel_start, (LPARAM)&sel_end);
|
||||||
char* firstspace = strstr(offsetBuffer, " ");
|
if (sel_start == sel_end)
|
||||||
if (!firstspace)
|
{
|
||||||
firstspace = strstr(offsetBuffer, "\r");
|
int offset = CheckClickingOnAnAddress();
|
||||||
if (firstspace)
|
if (offset != EOF)
|
||||||
firstspace[0] = 0;
|
DoSymbolicDebugNaming(offset);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
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_ADD: AddDebuggerBookmark(hwndDlg); break;
|
||||||
case IDC_DEBUGGER_BOOKMARK_DEL: DeleteDebuggerBookmark(hwndDlg); break;
|
case IDC_DEBUGGER_BOOKMARK_DEL: DeleteDebuggerBookmark(hwndDlg); break;
|
||||||
case IDC_DEBUGGER_BOOKMARK_NAME: NameDebuggerBookmark(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 ###########################
|
// ################################## End of SP CODE ###########################
|
||||||
|
|
||||||
|
@ -2132,11 +2138,13 @@ BOOL CALLBACK DebuggerCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara
|
||||||
|
|
||||||
extern void iNESGI(GI h);
|
extern void iNESGI(GI h);
|
||||||
|
|
||||||
void DoPatcher(int address,HWND hParent)
|
void DoPatcher(int address, HWND hParent)
|
||||||
{
|
{
|
||||||
iapoffset=address;
|
iapoffset = address;
|
||||||
if(GameInterface==iNESGI)DialogBox(fceu_hInstance,"ROMPATCHER",hParent,PatcherCallB);
|
if (GameInterface == iNESGI)
|
||||||
else MessageBox(hDebug, "Sorry, The Patcher only works on INES rom images", "Error", MB_OK);
|
DialogBox(fceu_hInstance, "ROMPATCHER", hParent, PatcherCallB);
|
||||||
|
else
|
||||||
|
MessageBox(hDebug, "Sorry, The Patcher only works on INES rom images", "Error", MB_OK);
|
||||||
UpdateDebugger(false);
|
UpdateDebugger(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ char NLfilename[2048];
|
||||||
char symbDebugEnabled = 0;
|
char symbDebugEnabled = 0;
|
||||||
int debuggerWasActive = 0;
|
int debuggerWasActive = 0;
|
||||||
char temp_chr[40] = {0};
|
char temp_chr[40] = {0};
|
||||||
|
char delimiterChar[2] = "#";
|
||||||
|
|
||||||
extern BOOL CALLBACK nameBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
extern BOOL CALLBACK nameBookmarkCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||||
extern char bookmarkDescription[];
|
extern char bookmarkDescription[];
|
||||||
|
@ -131,7 +132,7 @@ int parseLine(char* line, Name* n)
|
||||||
|
|
||||||
// Attempt to tokenize the given line
|
// Attempt to tokenize the given line
|
||||||
|
|
||||||
pos = strstr(line, "#");
|
pos = strstr(line, delimiterChar);
|
||||||
|
|
||||||
if (!pos)
|
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
|
// Attempt to tokenize the string again to find the name of the address
|
||||||
|
|
||||||
pos = strstr(line, "#");
|
pos = strstr(line, delimiterChar);
|
||||||
|
|
||||||
if (!pos)
|
if (!pos)
|
||||||
{
|
{
|
||||||
|
@ -207,7 +208,7 @@ int parseLine(char* line, Name* n)
|
||||||
if (*line)
|
if (*line)
|
||||||
{
|
{
|
||||||
if (strlen(line) > NL_MAX_NAME_LEN)
|
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);
|
n->name = (char*)malloc(strlen(line) + 1);
|
||||||
strcpy(n->name, line);
|
strcpy(n->name, line);
|
||||||
}
|
}
|
||||||
|
@ -225,7 +226,15 @@ int parseLine(char* line, Name* n)
|
||||||
if (*line > 0x0D)
|
if (*line > 0x0D)
|
||||||
{
|
{
|
||||||
if (strlen(line) > NL_MAX_MULTILINE_COMMENT_LEN)
|
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);
|
n->comment = (char*)malloc(strlen(line) + 1);
|
||||||
strcpy(n->comment, line);
|
strcpy(n->comment, line);
|
||||||
}
|
}
|
||||||
|
@ -302,14 +311,8 @@ Name* parse(char* lines, const char* filename)
|
||||||
{
|
{
|
||||||
pos[0] = '\r';
|
pos[0] = '\r';
|
||||||
pos[1] = '\n';
|
pos[1] = '\n';
|
||||||
pos += 2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Remove backslash
|
|
||||||
pos[1] = ' ';
|
|
||||||
pos += 1;
|
|
||||||
}
|
}
|
||||||
|
pos += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pos)
|
if (!pos)
|
||||||
|
@ -318,7 +321,10 @@ Name* parse(char* lines, const char* filename)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
*pos = 0;
|
if (pos[-1] == '\r')
|
||||||
|
pos[-1] = 0;
|
||||||
|
else
|
||||||
|
*pos = 0;
|
||||||
|
|
||||||
// Attempt to parse the current line
|
// Attempt to parse the current line
|
||||||
fail = parseLine(lines, cur);
|
fail = parseLine(lines, cur);
|
||||||
|
@ -540,6 +546,46 @@ Name* searchNode(Name* node, const char* offs)
|
||||||
return 0;
|
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
|
* Loads the necessary NL files
|
||||||
**/
|
**/
|
||||||
|
@ -554,12 +600,8 @@ void loadNameFiles()
|
||||||
if (ramBankNames)
|
if (ramBankNames)
|
||||||
free(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
|
// Load the address descriptions for the RAM addresses
|
||||||
ramBankNames = parseNameFile(NLfilename);
|
ramBankNames = parseNameFile(generateNLFilenameForAddress(0x0000));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find out which bank is loaded at 0xC000
|
// Find out which bank is loaded at 0xC000
|
||||||
|
@ -574,14 +616,11 @@ void loadNameFiles()
|
||||||
// to load the address descriptions of the new bank.
|
// to load the address descriptions of the new bank.
|
||||||
lastBank = cb;
|
lastBank = cb;
|
||||||
|
|
||||||
// Get the name of the NL file
|
|
||||||
sprintf(NLfilename, "%s.%X.nl", mass_replace(LoadedRomFName, "|", ".").c_str(), lastBank);
|
|
||||||
|
|
||||||
if (lastBankNames)
|
if (lastBankNames)
|
||||||
freeList(lastBankNames);
|
freeList(lastBankNames);
|
||||||
|
|
||||||
// Load new address definitions
|
// Load new address definitions
|
||||||
lastBankNames = parseNameFile(NLfilename);
|
lastBankNames = parseNameFile(generateNLFilenameForAddress(0xC000));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find out which bank is loaded at 0x8000
|
// Find out which bank is loaded at 0x8000
|
||||||
|
@ -597,14 +636,11 @@ void loadNameFiles()
|
||||||
|
|
||||||
loadedBank = cb;
|
loadedBank = cb;
|
||||||
|
|
||||||
// Get the name of the NL file
|
|
||||||
sprintf(NLfilename, "%s.%X.nl", mass_replace(LoadedRomFName, "|", ".").c_str(), loadedBank);
|
|
||||||
|
|
||||||
if (loadedBankNames)
|
if (loadedBankNames)
|
||||||
freeList(loadedBankNames);
|
freeList(loadedBankNames);
|
||||||
|
|
||||||
// Load new address definitions
|
// 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
|
} else
|
||||||
{
|
{
|
||||||
// Search address definition node for a ROM address
|
// 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)
|
if (n)
|
||||||
|
@ -801,3 +837,233 @@ void GoToDebuggerBookmark(HWND hwnd)
|
||||||
unsigned int n = getBookmarkAddress(selectedItem);
|
unsigned int n = getBookmarkAddress(selectedItem);
|
||||||
Disassemble(hwnd, IDC_DEBUGGER_DISASSEMBLY, IDC_DEBUGGER_DISASSEMBLY_VSCR, n);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,6 +38,9 @@ extern std::vector<std::string> bookmarks_name;
|
||||||
extern int debuggerWasActive;
|
extern int debuggerWasActive;
|
||||||
|
|
||||||
int checkCondition(const char* buffer, int num);
|
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 loadNameFiles();
|
||||||
void decorateAddress(unsigned int addr, char** str_name, char** str_comment);
|
void decorateAddress(unsigned int addr, char** str_name, char** str_comment);
|
||||||
void replaceNames(Name* list, char* str);
|
void replaceNames(Name* list, char* str);
|
||||||
|
@ -50,3 +53,7 @@ void FillDebuggerBookmarkListbox(HWND hwnd);
|
||||||
|
|
||||||
void GoToDebuggerBookmark(HWND hwnd);
|
void GoToDebuggerBookmark(HWND hwnd);
|
||||||
int isHex(char c);
|
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);
|
||||||
|
|
|
@ -638,29 +638,13 @@ void UpdateCaption()
|
||||||
sprintf(addrName, "$%04X", CursorStartAddy);
|
sprintf(addrName, "$%04X", CursorStartAddy);
|
||||||
strcpy(addrNameCopy, addrName);
|
strcpy(addrNameCopy, addrName);
|
||||||
// try to find the name for this address in loadedBankNames
|
// 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))
|
if (strcmp(addrName, addrNameCopy))
|
||||||
{
|
{
|
||||||
|
// changes found, so the string was decorated by symbolic name - then output it
|
||||||
strcat(str, " - ");
|
strcat(str, " - ");
|
||||||
strcat(str, addrName);
|
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
|
} else
|
||||||
|
|
|
@ -2193,6 +2193,23 @@ BEGIN
|
||||||
GROUPBOX "Settings",IDC_STATIC,6,4,91,177
|
GROUPBOX "Settings",IDC_STATIC,6,4,91,177
|
||||||
END
|
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
|
IDD_TASEDITOR_SAVINGOPTIONS, DIALOG
|
||||||
BEGIN
|
BEGIN
|
||||||
END
|
END
|
||||||
|
|
||||||
|
IDD_SYMBOLIC_DEBUG_NAMING, DIALOG
|
||||||
|
BEGIN
|
||||||
|
BOTTOMMARGIN, 82
|
||||||
|
END
|
||||||
END
|
END
|
||||||
#endif // APSTUDIO_INVOKED
|
#endif // APSTUDIO_INVOKED
|
||||||
|
|
||||||
|
|
|
@ -361,6 +361,7 @@
|
||||||
#define IDB_BITMAP_SELECTED18 287
|
#define IDB_BITMAP_SELECTED18 287
|
||||||
#define IDB_BITMAP_SELECTED19 288
|
#define IDB_BITMAP_SELECTED19 288
|
||||||
#define IDD_TASEDITOR_SAVINGOPTIONS 289
|
#define IDD_TASEDITOR_SAVINGOPTIONS 289
|
||||||
|
#define IDD_SYMBOLIC_DEBUG_NAMING 290
|
||||||
#define MENU_HIDE_MENU 300
|
#define MENU_HIDE_MENU 300
|
||||||
#define COMBO_FILTER 300
|
#define COMBO_FILTER 300
|
||||||
#define IDC_EDIT_AUTHORINFO 300
|
#define IDC_EDIT_AUTHORINFO 300
|
||||||
|
@ -573,9 +574,14 @@
|
||||||
#define IDC_AUTOSAVE_PERIOD 1147
|
#define IDC_AUTOSAVE_PERIOD 1147
|
||||||
#define IDC_BUTTON9 1148
|
#define IDC_BUTTON9 1148
|
||||||
#define TASEDITOR_FIND_NEXT_SIMILAR_MARKER 1148
|
#define TASEDITOR_FIND_NEXT_SIMILAR_MARKER 1148
|
||||||
|
#define IDC_SYMBOLIC_ADDRESS 1148
|
||||||
#define IDC_HISTORYLIST 1149
|
#define IDC_HISTORYLIST 1149
|
||||||
|
#define IDC_SYMBOLIC_NAME 1149
|
||||||
#define IDC_BOOKMARKSLIST 1150
|
#define IDC_BOOKMARKSLIST 1150
|
||||||
|
#define IDC_SYMBOLIC_ADDRESS2 1150
|
||||||
|
#define IDC_SYMBOLIC_FILENAME 1150
|
||||||
#define TASEDITOR_NEXT_MARKER 1151
|
#define TASEDITOR_NEXT_MARKER 1151
|
||||||
|
#define IDC_SYMBOLIC_COMMENT 1151
|
||||||
#define IDC_BRANCHES_BUTTON 1152
|
#define IDC_BRANCHES_BUTTON 1152
|
||||||
#define IDC_JUMP_PLAYBACK_BUTTON 1153
|
#define IDC_JUMP_PLAYBACK_BUTTON 1153
|
||||||
#define IDC_EDIT2 1154
|
#define IDC_EDIT2 1154
|
||||||
|
@ -1202,9 +1208,9 @@
|
||||||
//
|
//
|
||||||
#ifdef APSTUDIO_INVOKED
|
#ifdef APSTUDIO_INVOKED
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#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_COMMAND_VALUE 40589
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1289
|
#define _APS_NEXT_CONTROL_VALUE 1290
|
||||||
#define _APS_NEXT_SYMED_VALUE 101
|
#define _APS_NEXT_SYMED_VALUE 101
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -77,8 +77,8 @@ char str_result[LOG_LINE_MAX_LEN] = {0};
|
||||||
char str_temp[LOG_LINE_MAX_LEN] = {0};
|
char str_temp[LOG_LINE_MAX_LEN] = {0};
|
||||||
char* tracer_decoration_name;
|
char* tracer_decoration_name;
|
||||||
char* tracer_decoration_comment;
|
char* tracer_decoration_comment;
|
||||||
char str_decoration[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 + 2] = {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
|
bool log_old_emu_paused = true; // thanks to this flag the window only updates once after the game is paused
|
||||||
extern bool JustFrameAdvanced;
|
extern bool JustFrameAdvanced;
|
||||||
|
@ -452,7 +452,7 @@ void FCEUD_TraceInstruction(uint8 *opcode, int size)
|
||||||
strcat(str_decoration_comment, "\r\n");
|
strcat(str_decoration_comment, "\r\n");
|
||||||
tracer_decoration_comment = str_decoration_comment;
|
tracer_decoration_comment = str_decoration_comment;
|
||||||
// divide the str_decoration_comment into strings (Comment1, Comment2, ...)
|
// 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)
|
while (end_pos)
|
||||||
{
|
{
|
||||||
end_pos[0] = 0; // set \0 instead of \r
|
end_pos[0] = 0; // set \0 instead of \r
|
||||||
|
@ -461,7 +461,7 @@ void FCEUD_TraceInstruction(uint8 *opcode, int size)
|
||||||
OutputLogLine(str_decoration, true);
|
OutputLogLine(str_decoration, true);
|
||||||
end_pos += 2;
|
end_pos += 2;
|
||||||
tracer_decoration_comment = end_pos;
|
tracer_decoration_comment = end_pos;
|
||||||
end_pos = strstr(tracer_decoration_comment, "\r");
|
end_pos = strstr(end_pos, "\r\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
replaceNames(ramBankNames, a);
|
replaceNames(ramBankNames, a);
|
||||||
|
|
Loading…
Reference in New Issue