From dd55887f4b95d1b41aebd233e6a5edca40d218c1 Mon Sep 17 00:00:00 2001 From: Dan McCarthy Date: Sat, 30 Dec 2023 02:10:44 -0600 Subject: [PATCH] Debugger: Add support for Not Equals Array filter searches Adds the ability to do Not Equals filter searches for arrays and strings. Refactors array search function for easily adding new search types. Adds error message that informs the user that Not Equals can not be used for initial searches and can only be used for filter searches. --- pcsx2-qt/Debugger/CpuWidget.cpp | 44 +++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/pcsx2-qt/Debugger/CpuWidget.cpp b/pcsx2-qt/Debugger/CpuWidget.cpp index b789f6f9e8..36c499f9df 100644 --- a/pcsx2-qt/Debugger/CpuWidget.cpp +++ b/pcsx2-qt/Debugger/CpuWidget.cpp @@ -1002,19 +1002,37 @@ std::vector searchWorker(DebugInterface* cpu, std::vector searchAddres return hitAddresses; } -static bool compareByteArrayAtAddress(DebugInterface* cpu, u32 addr, QByteArray value) +static bool compareByteArrayAtAddress(DebugInterface* cpu, SearchComparison searchComparison, u32 addr, QByteArray value) { + const bool isNotOperator = searchComparison == SearchComparison::NotEquals; for (qsizetype i = 0; i < value.length(); i++) { - if (static_cast(cpu->read8(addr + i)) != value[i]) + const char nextByte = cpu->read8(addr + i); + switch (searchComparison) { - return false; + case SearchComparison::Equals: + { + if (nextByte != value[i]) + return false; + break; + } + case SearchComparison::NotEquals: + { + if (nextByte != value[i]) + return true; + break; + } + default: + { + Console.Error("Debugger: Unknown search comparison when doing memory search"); + return false; + } } } - return true; + return !isNotOperator; } -static std::vector searchWorkerByteArray(DebugInterface* cpu, std::vector searchAddresses, u32 start, u32 end, QByteArray value) +static std::vector searchWorkerByteArray(DebugInterface* cpu, SearchComparison searchComparison, std::vector searchAddresses, u32 start, u32 end, QByteArray value) { std::vector hitAddresses; const bool isSearchingRange = searchAddresses.size() <= 0; @@ -1022,7 +1040,7 @@ static std::vector searchWorkerByteArray(DebugInterface* cpu, std::vector searchWorkerByteArray(DebugInterface* cpu, std::vector startWorker(DebugInterface* cpu, const SearchType type, const S case SearchType::DoubleType: return searchWorker(cpu, searchAddresses, searchComparison, start, end, value.toDouble()); case SearchType::StringType: - return searchWorkerByteArray(cpu, searchAddresses, start, end, value.toUtf8()); + return searchWorkerByteArray(cpu, searchComparison, searchAddresses, start, end, value.toUtf8()); case SearchType::ArrayType: - return searchWorkerByteArray(cpu, searchAddresses, start, end, QByteArray::fromHex(value.toUtf8())); + return searchWorkerByteArray(cpu, searchComparison, searchAddresses, start, end, QByteArray::fromHex(value.toUtf8())); default: Console.Error("Debugger: Unknown type when doing memory search!"); break; @@ -1107,7 +1125,13 @@ void CpuWidget::onSearchButtonClicked() unsigned long long value; const bool isVariableSize = searchType == SearchType::ArrayType || searchType == SearchType::StringType; - if (isVariableSize && searchComparison != SearchComparison::Equals) + if (isVariableSize && !isFilterSearch && searchComparison == SearchComparison::NotEquals) + { + QMessageBox::critical(this, tr("Debugger"), tr("Search types Array and String can use the Not Equals search comparison type with new searches.")); + return; + } + + if (isVariableSize && searchComparison != SearchComparison::Equals && searchComparison != SearchComparison::NotEquals) { QMessageBox::critical(this, tr("Debugger"), tr("Search types Array and String can only be used with Equals search comparisons.")); return;