| 388 | } |
| 389 | |
| 390 | inline bool MemScanner::isHitNextScan(const MemScanner::ScanFilter filter, |
| 391 | const char* memoryToCompare1, const char* memoryToCompare2, |
| 392 | const char* noOffset, const char* newerRAMCache, |
| 393 | const size_t realSize, const u32 consoleOffset) const |
| 394 | { |
| 395 | char* olderMemory = &m_scanRAMCache[consoleOffset]; |
| 396 | const char* newerMemory = &newerRAMCache[consoleOffset]; |
| 397 | |
| 398 | // in the case of PPC instructions, we don't want to do the same MemoryToString operation for |
| 399 | // every address, so get it here once and use it later. |
| 400 | std::string MemoryBackToString = ""; |
| 401 | if (m_memType == Common::MemType::type_ppc) |
| 402 | { |
| 403 | MemoryBackToString = Common::formatMemoryToString( |
| 404 | memoryToCompare1, m_memType, Common::getSizeForType(Common::MemType::type_ppc, m_memSize), |
| 405 | m_memBase, !m_memIsSigned, false); |
| 406 | } |
| 407 | |
| 408 | switch (filter) |
| 409 | { |
| 410 | case ScanFilter::exact: |
| 411 | { |
| 412 | if (m_memType == Common::MemType::type_string || m_memType == Common::MemType::type_byteArray) |
| 413 | return (std::memcmp(newerMemory, memoryToCompare1, realSize) == 0); |
| 414 | if (m_memType == Common::MemType::type_ppc && |
| 415 | (Common::shouldBeBSwappedForType(m_memType) ? newerMemory[3] & 0xF8 : |
| 416 | newerMemory[0] & 0xF8)) |
| 417 | { |
| 418 | // accounts for situations where an instruction can be represented in different ways. i.e. |
| 419 | // blr is 0x4FFF0020 and 0x4E800020. Code doesn't enter here to speedup performance if |
| 420 | // opcode is 0 or 1 as no instruction can have these opcodes |
| 421 | return MemoryBackToString == Common::formatMemoryToString( |
| 422 | newerMemory, m_memType, |
| 423 | Common::getSizeForType(Common::MemType::type_ppc, m_memSize), |
| 424 | m_memBase, !m_memIsSigned, |
| 425 | Common::shouldBeBSwappedForType(m_memType)); |
| 426 | } |
| 427 | |
| 428 | return (compareMemoryAsNumbers(newerMemory, memoryToCompare1, noOffset, false, false, |
| 429 | realSize) == MemScanner::CompareResult::equal); |
| 430 | } |
| 431 | case ScanFilter::between: |
| 432 | { |
| 433 | MemScanner::CompareResult result1 = |
| 434 | compareMemoryAsNumbers(newerMemory, memoryToCompare1, noOffset, false, false, realSize); |
| 435 | MemScanner::CompareResult result2 = |
| 436 | compareMemoryAsNumbers(newerMemory, memoryToCompare2, noOffset, false, false, realSize); |
| 437 | return ((result1 == MemScanner::CompareResult::bigger || |
| 438 | result1 == MemScanner::CompareResult::equal) && |
| 439 | (result2 == MemScanner::CompareResult::smaller || |
| 440 | result2 == MemScanner::CompareResult::equal)); |
| 441 | } |
| 442 | case ScanFilter::biggerThan: |
| 443 | { |
| 444 | return (compareMemoryAsNumbers(newerMemory, memoryToCompare1, noOffset, false, false, |
| 445 | realSize) == MemScanner::CompareResult::bigger); |
| 446 | } |
| 447 | case ScanFilter::smallerThan: |
nothing calls this directly
no test coverage detected