MCPcopy Create free account
hub / github.com/aldelaro5/dolphin-memory-engine / isHitNextScan

Method isHitNextScan

Source/MemoryScanner/MemoryScanner.cpp:390–489  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

388}
389
390inline 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:

Callers

nothing calls this directly

Calls 3

formatMemoryToStringFunction · 0.85
getSizeForTypeFunction · 0.85
shouldBeBSwappedForTypeFunction · 0.85

Tested by

no test coverage detected