Make the IsMMIOAddress function easier to read, add tests.

This also makes IsMMIOAddress more restrictive.
This commit is contained in:
Scott Mansell 2014-09-11 21:02:45 +12:00
parent f1a4b98d36
commit fe28d1476a
2 changed files with 26 additions and 2 deletions

View File

@ -9,6 +9,7 @@
#include <type_traits>
#include "Common/Common.h"
#include "Core/ConfigManager.h"
#include "Core/HW/MMIOHandlers.h"
namespace MMIO
@ -40,8 +41,18 @@ const u32 NUM_MMIOS = NUM_BLOCKS * BLOCK_SIZE;
// interface.
inline bool IsMMIOAddress(u32 address)
{
return ((address & 0xFE7F0000) == 0xCC000000) &&
((address & 0x0000FFFF) != 0x00008000);
if (address == 0xCC008000)
return false; // WG Pipe
if ((address & 0xFFFF0000) == 0xCC000000)
return true; // GameCube MMIOs
if(SConfig::GetInstance().m_LocalCoreStartupParameter.bWii)
{
return ((address & 0xFFFF0000) == 0xCD000000) || // Wii MMIOs
((address & 0xFFFF0000) == 0xCD800000); // Mirror of Wii MMIOs
}
return false;
}
// Compute the internal unique ID for a given MMIO address. This ID is computed

View File

@ -25,11 +25,24 @@ TEST(UniqueID, UniqueEnough)
TEST(IsMMIOAddress, SpecialAddresses)
{
SConfig::Init();
SConfig::GetInstance().m_LocalCoreStartupParameter.bWii = true;
// WG Pipe address, should not be handled by MMIO.
EXPECT_FALSE(MMIO::IsMMIOAddress(0xCC008000));
// Memory zone used by games using the "MMU Speedhack".
EXPECT_FALSE(MMIO::IsMMIOAddress(0xE0000000));
// Uncached mirror of MEM1, shouldn't be handled by MMIO
EXPECT_FALSE(MMIO::IsMMIOAddress(0xC0000000));
// And lets check some valid addresses too
EXPECT_TRUE(MMIO::IsMMIOAddress(0xCC0000E0)); // Gamecube MMIOs
EXPECT_TRUE(MMIO::IsMMIOAddress(0xCD00008C)); // Wii MMIOs
EXPECT_TRUE(MMIO::IsMMIOAddress(0xCD800F10)); // Mirror of Wii MMIOs
SConfig::Shutdown();
}
class MappingTest : public testing::Test