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

View File

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