System Menu Region is now detected based on the Title Version in tmd

Title Version and region char of currently installed system menu are now listed in the menu as well

Which means disc channel will only show pal discs if it is a pal nand dump; ntsc nand dump will show ntsc discs, ntsc-j nand dump will show ntsc-j discs

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6591 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
LPFaint99 2010-12-16 07:36:26 +00:00
parent 06784d2869
commit b20858adb3
7 changed files with 52 additions and 16 deletions

View File

@ -122,6 +122,7 @@ public:
u16 GetTitleVersion() const {return m_TileVersion;}
u16 GetNumEntries() const {return m_numEntries;}
DiscIO::IVolume::ECountry GetCountry() const;
u8 GetCountryChar() const {return m_Country; }
private:
@ -133,6 +134,7 @@ private:
u16 m_TileVersion;
u8 m_TicketView[TICKET_VIEW_SIZE];
u8 m_TmdHeader[TMD_HEADER_SIZE];
u8 m_Country;
std::vector<SNANDContent> m_Content;
@ -223,6 +225,9 @@ bool CNANDContentLoader::CreateFromDirectory(const std::string& _rPath)
m_BootIndex = Common::swap16(pTMD + 0x01e0);
m_TitleID = Common::swap64(pTMD + 0x018c);
m_IosVersion = Common::swap16(pTMD + 0x018a);
m_Country = *(u8*)&m_TitleID;
if (m_Country == 2) // SYSMENU
m_Country = DiscIO::GetSysMenuRegion(m_TileVersion);
m_Content.resize(m_numEntries);
@ -307,6 +312,9 @@ bool CNANDContentLoader::ParseTMD(u8* pDataApp, u32 pDataAppSize, u8* pTicket, u
m_BootIndex = Common::swap16(pTMD + 0x01e0);
m_TitleID = Common::swap64(pTMD + 0x018c);
m_IosVersion = Common::swap16(pTMD + 0x018a);
m_Country = *(u8*)&m_TitleID;
if (m_Country == 2) // SYSMENU
m_Country = DiscIO::GetSysMenuRegion(m_TileVersion);
u8* p = pDataApp;
@ -341,16 +349,10 @@ DiscIO::IVolume::ECountry CNANDContentLoader::GetCountry() const
if (!IsValid())
return DiscIO::IVolume::COUNTRY_UNKNOWN;
u64 TitleID = GetTitleID();
char* pTitleID = (char*)&TitleID;
return CountrySwitch((u8)pTitleID[0]);
return CountrySwitch(m_Country);
}
CNANDContentManager CNANDContentManager::m_Instance;

View File

@ -63,6 +63,7 @@ public:
virtual u16 GetTitleVersion() const = 0;
virtual u16 GetNumEntries() const = 0;
virtual DiscIO::IVolume::ECountry GetCountry() const = 0;
virtual u8 GetCountryChar() const = 0;
enum
{

View File

@ -62,6 +62,7 @@ public:
// Generic Switch function for all volumes
IVolume::ECountry CountrySwitch(u8 CountryCode);
u8 GetSysMenuRegion(u16 _TitleVersion);
} // namespace

View File

@ -81,5 +81,30 @@ IVolume::ECountry CountrySwitch(u8 CountryCode)
break;
}
}
u8 GetSysMenuRegion(u16 _TitleVersion)
{
switch(_TitleVersion)
{
case 128: case 192: case 224: case 256:
case 288: case 352: case 384: case 416:
case 448: case 480: case 512:
return 'J';
case 97: case 193: case 225: case 257:
case 289: case 353: case 385: case 417:
case 449: case 481: case 513:
return 'E';
case 130: case 162: case 194: case 226:
case 258: case 290: case 354: case 386:
case 418: case 450: case 482: case 514:
return 'P';
case 326: case 390: case 454: case 486:
case 518:
return 'K';
default:
return 'A';
}
}
};

View File

@ -35,7 +35,16 @@ CVolumeWAD::CVolumeWAD(IBlobReader* _pReader)
Read(0x14, 4, (u8*)&tmd_size);
Read(0x18, 4, (u8*)&data_size);
OpeningBnrOffset = ALIGN_40(hdr_size) + ALIGN_40(cert_size) + ALIGN_40(tick_size) + ALIGN_40(tmd_size) + ALIGN_40(data_size);
u32 TmdOffset = ALIGN_40(hdr_size) + ALIGN_40(cert_size) + ALIGN_40(tick_size);
OpeningBnrOffset = TmdOffset + ALIGN_40(tmd_size) + ALIGN_40(data_size);
// read the last digit of the titleID in the ticket
Read(TmdOffset + 0x0193, 1, &m_Country);
if (m_Country == 2) // SYSMENU
{
u16 titlever = 0;
Read(TmdOffset + 0x01dc, 2, (u8*)&titlever);
m_Country = DiscIO::GetSysMenuRegion(Common::swap16(titlever));
}
}
CVolumeWAD::~CVolumeWAD()
@ -56,13 +65,7 @@ IVolume::ECountry CVolumeWAD::GetCountry() const
if (!m_pReader)
return COUNTRY_UNKNOWN;
u8 CountryCode;
u32 Offset = ALIGN_40(hdr_size) + ALIGN_40(cert_size);
// read the last digit of the titleID in the ticket
Read(Offset + 0x01E3, 1, &CountryCode);
return CountrySwitch(CountryCode);
return CountrySwitch(m_Country);
}
std::string CVolumeWAD::GetUniqueID() const

View File

@ -48,6 +48,7 @@ private:
IBlobReader* m_pReader;
u64 m_titleID;
u32 OpeningBnrOffset, hdr_size, cert_size, tick_size, tmd_size, data_size;
u8 m_Country;
};
} // namespace

View File

@ -202,7 +202,10 @@ void CFrame::CreateMenu()
if (DiscIO::CNANDContentManager::Access().GetNANDLoader(TITLEID_SYSMENU).IsValid())
{
toolsMenu->Append(IDM_LOAD_WII_MENU, _T("Load Wii Menu"));
int sysmenuVersion = DiscIO::CNANDContentManager::Access().GetNANDLoader(TITLEID_SYSMENU).GetTitleVersion();
char sysmenuRegion = DiscIO::CNANDContentManager::Access().GetNANDLoader(TITLEID_SYSMENU).GetCountryChar();
toolsMenu->Append(IDM_LOAD_WII_MENU, wxString::Format(_T("Load Wii System Menu (%d %c)"), sysmenuVersion, sysmenuRegion));
}
else
{