Minor performance improvements to Qt Ram Search window.

This commit is contained in:
mjbudd77 2021-02-17 21:22:25 -05:00
parent 14b07ab5f2
commit 67752c1ea2
2 changed files with 215 additions and 193 deletions

View File

@ -95,6 +95,7 @@ struct memoryLocation_t
} }
}; };
static struct memoryLocation_t memLoc[0x10000]; static struct memoryLocation_t memLoc[0x10000];
static uint8_t lclMemBuf[0x10000];
static std::list <struct memoryLocation_t*> actvSrchList; static std::list <struct memoryLocation_t*> actvSrchList;
static std::list <struct memoryLocation_t*> deactvSrchList; static std::list <struct memoryLocation_t*> deactvSrchList;
@ -182,9 +183,9 @@ void openRamSearchWindow( QWidget *parent )
{ {
return; return;
} }
ramSearchWin = new RamSearchDialog_t(parent); ramSearchWin = new RamSearchDialog_t(parent);
ramSearchWin->show(); ramSearchWin->show();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
@ -196,7 +197,7 @@ RamSearchDialog_t::RamSearchDialog_t(QWidget *parent)
QVBoxLayout *vbox, *vbox1, *vbox2; QVBoxLayout *vbox, *vbox1, *vbox2;
QGridLayout *grid; QGridLayout *grid;
QGroupBox *frame; QGroupBox *frame;
ramSearchInputValidator *inpValidator; ramSearchInputValidator *inpValidator;
setWindowTitle("RAM Search"); setWindowTitle("RAM Search");
@ -216,14 +217,14 @@ RamSearchDialog_t::RamSearchDialog_t(QWidget *parent)
grid->addWidget( hbar , 1, 0 ); grid->addWidget( hbar , 1, 0 );
connect( hbar, SIGNAL(valueChanged(int)), this, SLOT(hbarChanged(int)) ); connect( hbar, SIGNAL(valueChanged(int)), this, SLOT(hbarChanged(int)) );
connect( vbar, SIGNAL(valueChanged(int)), this, SLOT(vbarChanged(int)) ); connect( vbar, SIGNAL(valueChanged(int)), this, SLOT(vbarChanged(int)) );
ramView->setScrollBars( hbar, vbar ); ramView->setScrollBars( hbar, vbar );
hbar->setMinimum(0); hbar->setMinimum(0);
hbar->setMaximum(100); hbar->setMaximum(100);
vbar->setMinimum(0); vbar->setMinimum(0);
vbar->setMaximum(ShowROM ? 0x10000 : 0x8000); vbar->setMaximum(ShowROM ? 0x10000 : 0x8000);
vbar->setValue(0); vbar->setValue(0);
vbox = new QVBoxLayout(); vbox = new QVBoxLayout();
hbox1->addLayout( grid, 100); hbox1->addLayout( grid, 100);
@ -297,14 +298,14 @@ RamSearchDialog_t::RamSearchDialog_t(QWidget *parent)
df_btn->setChecked( cmpOp == 'd' ); df_btn->setChecked( cmpOp == 'd' );
md_btn->setChecked( cmpOp == '%' ); md_btn->setChecked( cmpOp == '%' );
connect( lt_btn, SIGNAL(clicked(void)), this, SLOT(opLtClicked(void)) ); connect( lt_btn, SIGNAL(clicked(void)), this, SLOT(opLtClicked(void)) );
connect( gt_btn, SIGNAL(clicked(void)), this, SLOT(opGtClicked(void)) ); connect( gt_btn, SIGNAL(clicked(void)), this, SLOT(opGtClicked(void)) );
connect( le_btn, SIGNAL(clicked(void)), this, SLOT(opLeClicked(void)) ); connect( le_btn, SIGNAL(clicked(void)), this, SLOT(opLeClicked(void)) );
connect( ge_btn, SIGNAL(clicked(void)), this, SLOT(opGeClicked(void)) ); connect( ge_btn, SIGNAL(clicked(void)), this, SLOT(opGeClicked(void)) );
connect( eq_btn, SIGNAL(clicked(void)), this, SLOT(opEqClicked(void)) ); connect( eq_btn, SIGNAL(clicked(void)), this, SLOT(opEqClicked(void)) );
connect( ne_btn, SIGNAL(clicked(void)), this, SLOT(opNeClicked(void)) ); connect( ne_btn, SIGNAL(clicked(void)), this, SLOT(opNeClicked(void)) );
connect( df_btn, SIGNAL(clicked(void)), this, SLOT(opDfClicked(void)) ); connect( df_btn, SIGNAL(clicked(void)), this, SLOT(opDfClicked(void)) );
connect( md_btn, SIGNAL(clicked(void)), this, SLOT(opMdClicked(void)) ); connect( md_btn, SIGNAL(clicked(void)), this, SLOT(opMdClicked(void)) );
diffByEdit = new QLineEdit(); diffByEdit = new QLineEdit();
moduloEdit = new QLineEdit(); moduloEdit = new QLineEdit();
@ -312,14 +313,14 @@ RamSearchDialog_t::RamSearchDialog_t(QWidget *parent)
diffByEdit->setEnabled( cmpOp == 'd' ); diffByEdit->setEnabled( cmpOp == 'd' );
moduloEdit->setEnabled( cmpOp == '%' ); moduloEdit->setEnabled( cmpOp == '%' );
inpValidator = new ramSearchInputValidator(this); inpValidator = new ramSearchInputValidator(this);
diffByEdit->setMaxLength( 16 ); diffByEdit->setMaxLength( 16 );
diffByEdit->setCursorPosition(0); diffByEdit->setCursorPosition(0);
diffByEdit->setValidator( inpValidator ); diffByEdit->setValidator( inpValidator );
moduloEdit->setMaxLength( 16 ); moduloEdit->setMaxLength( 16 );
moduloEdit->setCursorPosition(0); moduloEdit->setCursorPosition(0);
moduloEdit->setValidator( inpValidator ); moduloEdit->setValidator( inpValidator );
vbox->addWidget( lt_btn ); vbox->addWidget( lt_btn );
vbox->addWidget( gt_btn ); vbox->addWidget( gt_btn );
@ -352,22 +353,22 @@ RamSearchDialog_t::RamSearchDialog_t(QWidget *parent)
pv_btn->setChecked(true); pv_btn->setChecked(true);
connect( pv_btn, SIGNAL(clicked(void)), this, SLOT(pvBtnClicked(void)) ); connect( pv_btn, SIGNAL(clicked(void)), this, SLOT(pvBtnClicked(void)) );
connect( sv_btn, SIGNAL(clicked(void)), this, SLOT(svBtnClicked(void)) ); connect( sv_btn, SIGNAL(clicked(void)), this, SLOT(svBtnClicked(void)) );
connect( sa_btn, SIGNAL(clicked(void)), this, SLOT(saBtnClicked(void)) ); connect( sa_btn, SIGNAL(clicked(void)), this, SLOT(saBtnClicked(void)) );
connect( nc_btn, SIGNAL(clicked(void)), this, SLOT(ncBtnClicked(void)) ); connect( nc_btn, SIGNAL(clicked(void)), this, SLOT(ncBtnClicked(void)) );
specValEdit = new QLineEdit(); specValEdit = new QLineEdit();
specAddrEdit = new QLineEdit(); specAddrEdit = new QLineEdit();
numChangeEdit = new QLineEdit(); numChangeEdit = new QLineEdit();
specValEdit->setValidator( inpValidator ); specValEdit->setValidator( inpValidator );
specAddrEdit->setValidator( inpValidator ); specAddrEdit->setValidator( inpValidator );
numChangeEdit->setValidator( inpValidator ); numChangeEdit->setValidator( inpValidator );
specValEdit->setEnabled(false); specValEdit->setEnabled(false);
specAddrEdit->setEnabled(false); specAddrEdit->setEnabled(false);
numChangeEdit->setEnabled(false); numChangeEdit->setEnabled(false);
grid->addWidget( pv_btn , 0, 0, Qt::AlignLeft ); grid->addWidget( pv_btn , 0, 0, Qt::AlignLeft );
grid->addWidget( sv_btn , 1, 0, Qt::AlignLeft ); grid->addWidget( sv_btn , 1, 0, Qt::AlignLeft );
@ -441,7 +442,7 @@ RamSearchDialog_t::RamSearchDialog_t(QWidget *parent)
updateTimer = new QTimer( this ); updateTimer = new QTimer( this );
connect( updateTimer, &QTimer::timeout, this, &RamSearchDialog_t::periodicUpdate ); connect( updateTimer, &QTimer::timeout, this, &RamSearchDialog_t::periodicUpdate );
updateTimer->start( 8 ); // ~120hz updateTimer->start( 8 ); // ~120hz
} }
@ -464,61 +465,63 @@ RamSearchDialog_t::~RamSearchDialog_t(void)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::closeEvent(QCloseEvent *event) void RamSearchDialog_t::closeEvent(QCloseEvent *event)
{ {
printf("RAM Search Close Window Event\n"); printf("RAM Search Close Window Event\n");
done(0); done(0);
deleteLater(); deleteLater();
event->accept(); event->accept();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::closeWindow(void) void RamSearchDialog_t::closeWindow(void)
{ {
//printf("Close Window\n"); //printf("Close Window\n");
done(0); done(0);
deleteLater(); deleteLater();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::periodicUpdate(void) void RamSearchDialog_t::periodicUpdate(void)
{ {
int selAddr = -1; int selAddr = -1;
fceuWrapperLock();
if ( currFrameCounter != frameCounterLastPass ) if ( currFrameCounter != frameCounterLastPass )
{ {
//if ( currFrameCounter != (frameCounterLastPass+1) ) fceuWrapperLock();
//{ copyRamToLocalBuffer();
// printf("Warning: Ram Search Missed Frame: %i \n", currFrameCounter ); fceuWrapperUnLock();
//}
//if ( currFrameCounter != (frameCounterLastPass+1) )
//{
// printf("Warning: Ram Search Missed Frame: %i \n", currFrameCounter );
//}
updateRamValues(); updateRamValues();
if ( autoSearchCbox->isChecked() ) if ( autoSearchCbox->isChecked() )
{ {
runSearch(); runSearch();
} }
frameCounterLastPass = currFrameCounter; frameCounterLastPass = currFrameCounter;
} }
fceuWrapperUnLock();
undoButton->setEnabled( deactvFrameStack.size() > 0 );
selAddr = ramView->getSelAddr();
if ( selAddr >= 0 )
{
elimButton->setEnabled(true);
watchButton->setEnabled(true);
addCheatButton->setEnabled(true);
hexEditButton->setEnabled(true);
}
else
{
elimButton->setEnabled(false);
watchButton->setEnabled(false);
addCheatButton->setEnabled(false);
hexEditButton->setEnabled(false);
}
if ( (cycleCounter % 10) == 0) if ( (cycleCounter % 10) == 0)
{ {
undoButton->setEnabled( deactvFrameStack.size() > 0 );
selAddr = ramView->getSelAddr();
if ( selAddr >= 0 )
{
elimButton->setEnabled(true);
watchButton->setEnabled(true);
addCheatButton->setEnabled(true);
hexEditButton->setEnabled(true);
}
else
{
elimButton->setEnabled(false);
watchButton->setEnabled(false);
addCheatButton->setEnabled(false);
hexEditButton->setEnabled(false);
}
ramView->update(); ramView->update();
} }
cycleCounter++; cycleCounter++;
@ -1020,7 +1023,7 @@ static unsigned int ReadValueAtHardwareAddress(int address, unsigned int size)
if ( address < maxAddr ) if ( address < maxAddr )
{ {
value <<= 8; value <<= 8;
value |= GetMem(address); value |= lclMemBuf[address];
address++; address++;
} }
} }
@ -1053,8 +1056,22 @@ void RamSearchDialog_t::runSearch(void)
undoButton->setEnabled( deactvFrameStack.size() > 0 ); undoButton->setEnabled( deactvFrameStack.size() > 0 );
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::copyRamToLocalBuffer(void)
{
for (unsigned int addr=0; addr<0x10000; addr++)
{
lclMemBuf[addr] = GetMem(addr);
}
}
//----------------------------------------------------------------------------
void RamSearchDialog_t::resetSearch(void) void RamSearchDialog_t::resetSearch(void)
{ {
memset( lclMemBuf, 0, sizeof(lclMemBuf));
fceuWrapperLock();
copyRamToLocalBuffer();
fceuWrapperUnLock();
actvSrchList.clear(); actvSrchList.clear();
deactvSrchList.clear(); deactvSrchList.clear();
deactvFrameStack.clear(); deactvFrameStack.clear();
@ -1063,7 +1080,7 @@ void RamSearchDialog_t::resetSearch(void)
{ {
memLoc[addr].hist.clear(); memLoc[addr].hist.clear();
memLoc[addr].addr = addr; memLoc[addr].addr = addr;
memLoc[addr].val.v8.u = GetMem(addr); memLoc[addr].val.v8.u = lclMemBuf[addr];
memLoc[addr].val.v16.u = ReadValueAtHardwareAddress(addr, 2); memLoc[addr].val.v16.u = ReadValueAtHardwareAddress(addr, 2);
memLoc[addr].val.v32.u = ReadValueAtHardwareAddress(addr, 4); memLoc[addr].val.v32.u = ReadValueAtHardwareAddress(addr, 4);
memLoc[addr].elimMask = 0; memLoc[addr].elimMask = 0;
@ -1136,134 +1153,138 @@ void RamSearchDialog_t::clearChangeCounts(void)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::eliminateSelAddr(void) void RamSearchDialog_t::eliminateSelAddr(void)
{ {
int elimCount = 0, op = '!'; int elimCount = 0, op = '!';
std::list <struct memoryLocation_t*>::iterator it; std::list <struct memoryLocation_t*>::iterator it;
memoryLocation_t *loc = NULL; memoryLocation_t *loc = NULL;
int64_t x = 0, y = 0, p = 0; int64_t x = 0, y = 0, p = 0;
bool (*cmpFun)(int64_t x, int64_t y, int64_t p) = NULL; bool (*cmpFun)(int64_t x, int64_t y, int64_t p) = NULL;
switch ( op ) switch ( op )
{ {
case '<': case '<':
cmpFun = LessCmp; cmpFun = LessCmp;
break; break;
case '>': case '>':
cmpFun = MoreCmp; cmpFun = MoreCmp;
break; break;
case '=': case '=':
cmpFun = EqualCmp; cmpFun = EqualCmp;
break; break;
case '!': case '!':
cmpFun = UnequalCmp; cmpFun = UnequalCmp;
break; break;
case 'l': case 'l':
cmpFun = LessEqualCmp; cmpFun = LessEqualCmp;
break; break;
case 'm': case 'm':
cmpFun = MoreEqualCmp; cmpFun = MoreEqualCmp;
break; break;
case 'd': case 'd':
cmpFun = DiffByCmp; cmpFun = DiffByCmp;
p = getLineEditValue( diffByEdit ); p = getLineEditValue( diffByEdit );
break; break;
case '%': case '%':
cmpFun = ModIsCmp; cmpFun = ModIsCmp;
p = getLineEditValue( moduloEdit ); p = getLineEditValue( moduloEdit );
break; break;
default: default:
cmpFun = NULL; cmpFun = NULL;
break; break;
} }
if ( cmpFun == NULL ) if ( cmpFun == NULL )
{ {
return; return;
} }
y = ramView->getSelAddr(); y = ramView->getSelAddr();
if ( y < 0 ) if ( y < 0 )
{ {
return; return;
} }
printf("Performing Eliminate Address Operation %zi: 'x %c 0x%llx' '%lli' '0x%llx' \n", deactvFrameStack.size()+1, cmpOp, printf("Performing Eliminate Address Operation %zi: 'x %c 0x%llx' '%lli' '0x%llx' \n", deactvFrameStack.size()+1, cmpOp,
(unsigned long long int)y, (long long int)p, (unsigned long long int)p ); (unsigned long long int)y, (long long int)p, (unsigned long long int)p );
it = actvSrchList.begin(); it = actvSrchList.begin();
while (it != actvSrchList.end()) while (it != actvSrchList.end())
{ {
loc = *it; loc = *it;
x = loc->addr; x = loc->addr;
if ( cmpFun( x, y, p ) == false ) if ( cmpFun( x, y, p ) == false )
{ {
//printf("Eliminated Address: $%04X\n", loc->addr ); //printf("Eliminated Address: $%04X\n", loc->addr );
it = actvSrchList.erase(it); it = actvSrchList.erase(it);
deactvSrchList.push_back( loc ); elimCount++; deactvSrchList.push_back( loc ); elimCount++;
} }
else else
{ {
loc->hist.push_back( loc->val ); loc->hist.push_back( loc->val );
it++; it++;
} }
} }
deactvFrameStack.push_back( elimCount ); deactvFrameStack.push_back( elimCount );
vbar->setMaximum( actvSrchList.size() ); vbar->setMaximum( actvSrchList.size() );
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::addCheatClicked(void) void RamSearchDialog_t::addCheatClicked(void)
{ {
int addr = ramView->getSelAddr(); int addr = ramView->getSelAddr();
char desc[128]; char desc[128];
if ( addr < 0 )
{
return;
}
strcpy( desc, "Quick Cheat Add");
if ( addr < 0 ) fceuWrapperLock();
{
return;
}
strcpy( desc, "Quick Cheat Add");
FCEUI_AddCheat( desc, addr, GetMem(addr), -1, 1 ); FCEUI_AddCheat( desc, addr, GetMem(addr), -1, 1 );
updateCheatDialog(); updateCheatDialog();
fceuWrapperUnLock();
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::addRamWatchClicked(void) void RamSearchDialog_t::addRamWatchClicked(void)
{ {
int addr = ramView->getSelAddr(); int addr = ramView->getSelAddr();
char desc[128]; char desc[128];
if ( addr < 0 ) if ( addr < 0 )
{ {
return; return;
} }
strcpy( desc, "Quick Watch Add"); strcpy( desc, "Quick Watch Add");
int size = 1; int size = 1;
switch (dpySize) { switch (dpySize) {
case 'd': size = 4; break; case 'd': size = 4; break;
case 'w': size = 2; break; case 'w': size = 2; break;
case 'b': size = 1; break; case 'b': size = 1; break;
default: break; default: break;
} }
ramWatchList.add_entry( desc, addr, dpyType, size, 0 ); ramWatchList.add_entry( desc, addr, dpyType, size, 0 );
openRamWatchWindow(consoleWindow); openRamWatchWindow(consoleWindow);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::hexEditSelAddr(void) void RamSearchDialog_t::hexEditSelAddr(void)
{ {
int addr = ramView->getSelAddr(); int addr = ramView->getSelAddr();
if ( addr < 0 ) if ( addr < 0 )
{ {
return; return;
} }
hexEditorOpenFromDebugger( QHexEdit::MODE_NES_RAM, addr ); hexEditorOpenFromDebugger( QHexEdit::MODE_NES_RAM, addr );
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::opLtClicked(void) void RamSearchDialog_t::opLtClicked(void)
@ -1324,30 +1345,30 @@ void RamSearchDialog_t::opMdClicked(void)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::pvBtnClicked(void) void RamSearchDialog_t::pvBtnClicked(void)
{ {
specValEdit->setEnabled(false); specValEdit->setEnabled(false);
specAddrEdit->setEnabled(false); specAddrEdit->setEnabled(false);
numChangeEdit->setEnabled(false); numChangeEdit->setEnabled(false);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::svBtnClicked(void) void RamSearchDialog_t::svBtnClicked(void)
{ {
specValEdit->setEnabled(true); specValEdit->setEnabled(true);
specAddrEdit->setEnabled(false); specAddrEdit->setEnabled(false);
numChangeEdit->setEnabled(false); numChangeEdit->setEnabled(false);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::saBtnClicked(void) void RamSearchDialog_t::saBtnClicked(void)
{ {
specValEdit->setEnabled(false); specValEdit->setEnabled(false);
specAddrEdit->setEnabled(true); specAddrEdit->setEnabled(true);
numChangeEdit->setEnabled(false); numChangeEdit->setEnabled(false);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::ncBtnClicked(void) void RamSearchDialog_t::ncBtnClicked(void)
{ {
specValEdit->setEnabled(false); specValEdit->setEnabled(false);
specAddrEdit->setEnabled(false); specAddrEdit->setEnabled(false);
numChangeEdit->setEnabled(true); numChangeEdit->setEnabled(true);
} }
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void RamSearchDialog_t::ds1Clicked(void) void RamSearchDialog_t::ds1Clicked(void)
@ -1459,7 +1480,7 @@ void RamSearchDialog_t::updateRamValues(void)
{ {
loc = *it; loc = *it;
val.v8.u = GetMem(loc->addr); val.v8.u = lclMemBuf[loc->addr];
val.v16.u = ReadValueAtHardwareAddress(loc->addr, 2); val.v16.u = ReadValueAtHardwareAddress(loc->addr, 2);
val.v32.u = ReadValueAtHardwareAddress(loc->addr, 4); val.v32.u = ReadValueAtHardwareAddress(loc->addr, 4);

View File

@ -38,7 +38,7 @@ class QRamSearchView : public QWidget
void resizeEvent(QResizeEvent *event); void resizeEvent(QResizeEvent *event);
void wheelEvent(QWheelEvent *event); void wheelEvent(QWheelEvent *event);
int convPixToLine( QPoint p ); int convPixToLine( QPoint p );
void calcFontData(void); void calcFontData(void);
QFont font; QFont font;
@ -127,13 +127,14 @@ class RamSearchDialog_t : public QDialog
private: private:
void updateRamValues(void); void updateRamValues(void);
void calcRamList(void); void calcRamList(void);
void SearchRelative(void); void SearchRelative(void);
void SearchSpecificValue(void); void SearchSpecificValue(void);
void SearchSpecificAddress(void); void SearchSpecificAddress(void);
void SearchNumberChanges(void); void SearchNumberChanges(void);
void copyRamToLocalBuffer(void);
public slots: public slots:
void closeWindow(void); void closeWindow(void);
private slots: private slots:
void runSearch(void); void runSearch(void);
void resetSearch(void); void resetSearch(void);