diff --git a/src/drivers/Qt/RamSearch.cpp b/src/drivers/Qt/RamSearch.cpp index aa1a9720..3f24bfc9 100644 --- a/src/drivers/Qt/RamSearch.cpp +++ b/src/drivers/Qt/RamSearch.cpp @@ -79,6 +79,7 @@ static std::list actvSrchList; static std::list deactvSrchList; static std::vector deactvFrameStack; +static int cmpOp = '='; static int dpySize = 'b'; static int dpyType = 's'; static bool chkMisAligned = false; @@ -195,11 +196,30 @@ RamSearchDialog_t::RamSearchDialog_t(QWidget *parent) df_btn = new QRadioButton( tr("Different By:") ); md_btn = new QRadioButton( tr("Modulo") ); - eq_btn->setChecked(true); + lt_btn->setChecked( cmpOp == '<' ); + gt_btn->setChecked( cmpOp == '>' ); + le_btn->setChecked( cmpOp == 'l' ); + ge_btn->setChecked( cmpOp == 'm' ); + eq_btn->setChecked( cmpOp == '=' ); + ne_btn->setChecked( cmpOp == '!' ); + 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)) ); diffByEdit = new QLineEdit(); moduloEdit = new QLineEdit(); + diffByEdit->setEnabled( cmpOp == 'd' ); + moduloEdit->setEnabled( cmpOp == '%' ); + vbox->addWidget( lt_btn ); vbox->addWidget( gt_btn ); vbox->addWidget( le_btn ); @@ -301,6 +321,7 @@ RamSearchDialog_t::RamSearchDialog_t(QWidget *parent) setLayout( mainLayout ); cycleCounter = 0; + frameCounterLastPass = currFrameCounter; resetSearch(); @@ -346,6 +367,10 @@ void RamSearchDialog_t::periodicUpdate(void) { if ( currFrameCounter != frameCounterLastPass ) { + //if ( currFrameCounter != (frameCounterLastPass+1) ) + //{ + // printf("Warning: Ram Search Missed Frame: %i \n", currFrameCounter ); + //} updateRamValues(); frameCounterLastPass = currFrameCounter; @@ -388,6 +413,133 @@ static void sortActvMemList(void) { actvSrchList.sort( memoryAddrCompare ); } + +template +T ReadLocalValue(const unsigned char* data) +{ + return *(const T*)data; +} +// basic comparison functions: +static bool LessCmp (int64_t x, int64_t y, int64_t i) { return x < y; } +static bool MoreCmp (int64_t x, int64_t y, int64_t i) { return x > y; } +static bool LessEqualCmp (int64_t x, int64_t y, int64_t i) { return x <= y; } +static bool MoreEqualCmp (int64_t x, int64_t y, int64_t i) { return x >= y; } +static bool EqualCmp (int64_t x, int64_t y, int64_t i) { return x == y; } +static bool UnequalCmp (int64_t x, int64_t y, int64_t i) { return x != y; } +static bool DiffByCmp (int64_t x, int64_t y, int64_t p) { return x - y == p || y - x == p; } +static bool ModIsCmp (int64_t x, int64_t y, int64_t p) { return p && x % p == y; } + +void RamSearchDialog_t::SearchRelative(void) +{ + std::list ::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 ( cmpOp ) + { + 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; + break; + case '%': + cmpFun = ModIsCmp; + break; + default: + cmpFun = NULL; + break; + } + + if ( cmpFun == NULL ) + { + return; + } + + it = actvSrchList.begin(); + + while (it != actvSrchList.end()) + { + loc = *it; + + switch ( dpySize ) + { + default: + case 'b': + { + if ( dpyType == 's') + { + x = loc->val.v8.i; + y = loc->hist.back().v8.i; + } + else + { + x = loc->val.v8.u; + y = loc->hist.back().v8.u; + } + } + break; + case 'w': + { + if ( dpyType == 's') + { + x = loc->val.v16.i; + y = loc->hist.back().v16.i; + } + else + { + x = loc->val.v16.u; + y = loc->hist.back().v16.u; + } + } + break; + case 'd': + { + if ( dpyType == 's') + { + x = loc->val.v32.i; + y = loc->hist.back().v32.i; + } + else + { + x = loc->val.v32.u; + y = loc->hist.back().v32.u; + } + } + break; + } + + if ( cmpFun( x, y, p ) == false ) + { + //printf("Function: Returns False %li %c %li \n", x, cmpOp, y ); + printf("Eliminated Address: $%04X\n", loc->addr ); + it = actvSrchList.erase(it); + } + else + { + loc->hist.push_back( loc->val ); + it++; + } + } + + vbar->setMaximum( actvSrchList.size() ); +} //---------------------------------------------------------------------------- static unsigned int ReadValueAtHardwareAddress(int address, unsigned int size) { @@ -409,6 +561,7 @@ static unsigned int ReadValueAtHardwareAddress(int address, unsigned int size) //---------------------------------------------------------------------------- void RamSearchDialog_t::runSearch(void) { + SearchRelative(); } //---------------------------------------------------------------------------- void RamSearchDialog_t::resetSearch(void) @@ -441,6 +594,62 @@ void RamSearchDialog_t::clearChangeCounts(void) } } //---------------------------------------------------------------------------- +void RamSearchDialog_t::opLtClicked(void) +{ + cmpOp = '<'; + diffByEdit->setEnabled(false); + moduloEdit->setEnabled(false); +} +//---------------------------------------------------------------------------- +void RamSearchDialog_t::opGtClicked(void) +{ + cmpOp = '>'; + diffByEdit->setEnabled(false); + moduloEdit->setEnabled(false); +} +//---------------------------------------------------------------------------- +void RamSearchDialog_t::opLeClicked(void) +{ + cmpOp = 'l'; + diffByEdit->setEnabled(false); + moduloEdit->setEnabled(false); +} +//---------------------------------------------------------------------------- +void RamSearchDialog_t::opGeClicked(void) +{ + cmpOp = 'm'; + diffByEdit->setEnabled(false); + moduloEdit->setEnabled(false); +} +//---------------------------------------------------------------------------- +void RamSearchDialog_t::opEqClicked(void) +{ + cmpOp = '='; + diffByEdit->setEnabled(false); + moduloEdit->setEnabled(false); +} +//---------------------------------------------------------------------------- +void RamSearchDialog_t::opNeClicked(void) +{ + cmpOp = '!'; + diffByEdit->setEnabled(false); + moduloEdit->setEnabled(false); +} +//---------------------------------------------------------------------------- +void RamSearchDialog_t::opDfClicked(void) +{ + cmpOp = 'd'; + diffByEdit->setEnabled(true); + moduloEdit->setEnabled(false); +} +//---------------------------------------------------------------------------- +void RamSearchDialog_t::opMdClicked(void) +{ + cmpOp = '%'; + diffByEdit->setEnabled(false); + moduloEdit->setEnabled(true); +} +//---------------------------------------------------------------------------- void RamSearchDialog_t::ds1Clicked(void) { dpySize = 'b'; diff --git a/src/drivers/Qt/RamSearch.h b/src/drivers/Qt/RamSearch.h index 014b1f9e..f6cff670 100644 --- a/src/drivers/Qt/RamSearch.h +++ b/src/drivers/Qt/RamSearch.h @@ -121,6 +121,7 @@ class RamSearchDialog_t : public QDialog private: void updateRamValues(void); void calcRamList(void); + void SearchRelative(void); public slots: void closeWindow(void); @@ -139,6 +140,14 @@ class RamSearchDialog_t : public QDialog void signedTypeClicked(void); void unsignedTypeClicked(void); void hexTypeClicked(void); + void opLtClicked(void); + void opGtClicked(void); + void opLeClicked(void); + void opGeClicked(void); + void opEqClicked(void); + void opNeClicked(void); + void opDfClicked(void); + void opMdClicked(void); };