Merge pull request #1057 from phire/IsMMIOAddress2

Further improvements to IsMMIOAddress (Includes tests!)
This commit is contained in:
Dolphin Bot 2015-01-24 05:55:35 +01:00
commit 4e9497cdb8
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