Added logic to load/save breakpoint data into game specific files.

This commit is contained in:
Matthew Budd 2020-09-16 21:02:43 -04:00
parent c62dfd464f
commit 63dbda4b35
4 changed files with 287 additions and 7 deletions

View File

@ -38,6 +38,7 @@
#include "Qt/nes_shm.h"
#include "Qt/fceuWrapper.h"
#include "Qt/ConsoleDebugger.h"
#include "Qt/ConsoleUtilities.h"
// Where are these defined?
extern int vblankScanLines;
@ -693,7 +694,6 @@ void ConsoleDebugger::openBpEditWindow( int editIdx, watchpointinfo *wp )
{
int start_addr = -1, end_addr = -1, type = 0, enable = 1, slot;
std::string s;
printf("Accepted\n");
slot = (editIdx < 0) ? numWPs : editIdx;
@ -2066,6 +2066,283 @@ void FCEUD_DebugBreakpoint( int bpNum )
fceuWrapperLock();
}
//----------------------------------------------------------------------------
static int getGameDebugBreakpointFileName(char *filepath)
{
int i,j;
const char *romFile;
romFile = getRomFile();
if ( romFile == NULL )
{
return -1;
}
i=0; j = -1;
while ( romFile[i] != 0 )
{
if ( romFile[i] == '|' )
{
filepath[i] = '.';
}
else
{
if ( romFile[i] == '/' )
{
j = -1;
}
else if ( romFile[i] == '.' )
{
j = i;
}
filepath[i] = romFile[i];
}
i++;
}
if ( j >= 0 )
{
filepath[j] = 0; i=j;
}
filepath[i] = '.'; i++;
filepath[i] = 'd'; i++;
filepath[i] = 'b'; i++;
filepath[i] = 'g'; i++;
filepath[i] = 0;
return 0;
}
//----------------------------------------------------------------------------
void saveGameDebugBreakpoints(void)
{
int i;
FILE *fp;
char stmp[512];
char flags[8];
if ( numWPs == 0 )
{
return;
}
getGameDebugBreakpointFileName( stmp );
printf("Debug Save File: '%s' \n", stmp );
fp = fopen( stmp, "w");
if ( fp == NULL )
{
printf("Error: Failed to open file '%s' for writing\n", stmp );
return;
}
for (i=0; i<numWPs; i++)
{
flags[0] = (watchpoint[i].flags & WP_E) ? 'E' : '-';
if ( watchpoint[i].flags & BT_P )
{
flags[1] = 'P';
}
else if ( watchpoint[i].flags & BT_S )
{
flags[1] = 'S';
}
else
{
flags[1] = 'C';
}
flags[2] = (watchpoint[i].flags & WP_R) ? 'R' : '-';
flags[3] = (watchpoint[i].flags & WP_W) ? 'W' : '-';
flags[4] = (watchpoint[i].flags & WP_X) ? 'X' : '-';
flags[5] = (watchpoint[i].flags & WP_F) ? 'F' : '-';
flags[6] = 0;
fprintf( fp, "BreakPoint: startAddr=%04X endAddr=%04X flags=%s condition=\"%s\" desc=\"%s\" \n",
watchpoint[i].address, watchpoint[i].endaddress, flags,
(watchpoint[i].condText != NULL) ? watchpoint[i].condText : "",
(watchpoint[i].desc != NULL) ? watchpoint[i].desc : "");
}
fclose(fp);
return;
}
//----------------------------------------------------------------------------
void loadGameDebugBreakpoints(void)
{
int i,j;
FILE *fp;
char stmp[512];
char id[64], data[128];
char literal;
getGameDebugBreakpointFileName( stmp );
printf("Debug Load File: '%s' \n", stmp );
fp = fopen( stmp, "r");
if ( fp == NULL )
{
printf("Error: Failed to open file '%s' for writing\n", stmp );
return;
}
while ( fgets( stmp, sizeof(stmp), fp ) != 0 )
{
i=0; j=0;
while ( isspace(stmp[i]) ) i++;
while ( isalnum(stmp[i]) )
{
id[j] = stmp[i]; j++; i++;
}
id[j] = 0;
while ( isspace(stmp[i]) ) i++;
if ( stmp[i] != ':' )
{
continue;
}
i++;
while ( isspace(stmp[i]) ) i++;
if ( strcmp( id, "BreakPoint" ) == 0 )
{
int retval;
int start_addr = -1, end_addr = -1, type = 0, enable = 1;
char cond[256], desc[256];
cond[0] = 0; desc[0] = 0;
while ( stmp[i] != 0 )
{
while ( isspace(stmp[i]) ) i++;
j=0;
while ( isalnum(stmp[i]) )
{
id[j] = stmp[i]; j++; i++;
}
id[j] = 0;
if ( j == 0 )
{
break;
}
if ( stmp[i] != '=' )
{
break;
}
i++; j=0;
if ( stmp[i] == '\"' )
{
literal = 0;
i++;
while ( stmp[i] != 0 )
{
if ( literal )
{
data[j] = stmp[i]; i++; j++;
literal = 0;
}
else
{
if ( stmp[i] == '\\' )
{
literal = 1; i++;
}
else if ( stmp[i] == '\"' )
{
i++; break;
}
else
{
data[j] = stmp[i]; j++; i++;
}
}
}
data[j] = 0;
}
else
{
j=0;
while ( !isspace(stmp[i]) )
{
data[j] = stmp[i]; j++; i++;
}
data[j] = 0;
}
printf("ID:'%s' DATA:'%s' \n", id, data );
if ( strcmp( id, "startAddr" ) == 0 )
{
start_addr = strtol( data, NULL, 16 );
}
else if ( strcmp( id, "endAddr" ) == 0 )
{
end_addr = strtol( data, NULL, 16 );
}
else if ( strcmp( id, "flags" ) == 0 )
{
type = 0;
enable = (data[0] == 'E');
if ( data[1] == 'P' )
{
type |= BT_P;
}
else if ( data[1] == 'S' )
{
type |= BT_S;
}
else
{
type |= BT_C;
}
type |= (data[2] == 'R') ? WP_R : 0;
type |= (data[3] == 'W') ? WP_W : 0;
type |= (data[4] == 'X') ? WP_X : 0;
type |= (data[5] == 'F') ? WP_F : 0;
}
else if ( strcmp( id, "condition" ) == 0 )
{
strcpy( cond, data );
}
else if ( strcmp( id, "desc" ) == 0 )
{
strcpy( desc, data );
}
}
if ( (start_addr >= 0) && (numWPs < 64) )
{
retval = NewBreak( desc, start_addr, end_addr, type, cond, numWPs, enable);
if ( (retval == 1) || (retval == 2) )
{
printf("Breakpoint Add Failed\n");
}
else
{
numWPs++;
}
}
}
}
fclose(fp);
return;
}
//----------------------------------------------------------------------------
QAsmView::QAsmView(QWidget *parent)
: QWidget( parent )
{

View File

@ -225,3 +225,6 @@ class ConsoleDebugger : public QDialog
void instructionsThresChanged(const QString &txt);
};
void saveGameDebugBreakpoints(void);
void loadGameDebugBreakpoints(void);

View File

@ -278,13 +278,13 @@ int debugSymbolTable_t::loadFileNL( int bank )
debugSymbolPage_t *page = NULL;
debugSymbol_t *sym = NULL;
printf("Looking to Load Debug Bank: $%X \n", bank );
//printf("Looking to Load Debug Bank: $%X \n", bank );
if ( generateNLFilenameForBank( bank, fileName ) )
{
return -1;
}
printf("Loading NL File: %s\n", fileName );
//printf("Loading NL File: %s\n", fileName );
fp = ::fopen( fileName, "r" );
@ -494,10 +494,7 @@ int debugSymbolTable_t::loadGameSymbols(void)
for(int i=0;i<nPages;i++)
{
//int pageIndexAddress = 0x8000 + (1<<debuggerPageSize)*i;
//int pageIndexAddress = pageSize*i;
printf("Loading Page Offset: $%06X\n", pageSize*i );
//printf("Loading Page Offset: $%06X\n", pageSize*i );
loadFileNL( i );
}

View File

@ -16,6 +16,7 @@
#include "Qt/unix-netplay.h"
#include "Qt/HexEditor.h"
#include "Qt/SymbolicDebug.h"
#include "Qt/ConsoleDebugger.h"
#include "Qt/ConsoleWindow.h"
#include "Qt/fceux_git_info.h"
@ -229,6 +230,7 @@ int LoadGame(const char *path)
}
hexEditorLoadBookmarks();
loadGameDebugBreakpoints();
debugSymbolTable.loadGameSymbols();
@ -279,6 +281,7 @@ CloseGame(void)
return(0);
}
hexEditorSaveBookmarks();
saveGameDebugBreakpoints();
debugSymbolTable.save();
debugSymbolTable.clear();