Merge pull request #7049 from lioncash/ipl

EXI_DeviceIPL: Minor changes
This commit is contained in:
Anthony 2018-06-02 11:40:27 -07:00 committed by GitHub
commit c02a239a2f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 68 additions and 70 deletions

View File

@ -95,18 +95,18 @@ void CEXIIPL::Descrambler(u8* data, u32 size)
} }
} }
CEXIIPL::CEXIIPL() : m_uPosition(0), m_uAddress(0), m_uRWOffset(0), m_FontsLoaded(false) CEXIIPL::CEXIIPL()
{ {
// Create the IPL // Create the IPL
m_pIPL = static_cast<u8*>(Common::AllocateMemoryPages(ROM_SIZE)); m_ipl = static_cast<u8*>(Common::AllocateMemoryPages(ROM_SIZE));
// Load whole ROM dump // Load whole ROM dump
// Note: The Wii doesn't have a copy of the IPL, only fonts. // Note: The Wii doesn't have a copy of the IPL, only fonts.
if (!SConfig::GetInstance().bWii && LoadFileToIPL(SConfig::GetInstance().m_strBootROM, 0)) if (!SConfig::GetInstance().bWii && LoadFileToIPL(SConfig::GetInstance().m_strBootROM, 0))
{ {
// Descramble the encrypted section (contains BS1 and BS2) // Descramble the encrypted section (contains BS1 and BS2)
Descrambler(m_pIPL + 0x100, 0x1afe00); Descrambler(m_ipl + 0x100, 0x1afe00);
INFO_LOG(BOOT, "Loaded bootrom: %s", m_pIPL); // yay for null-terminated strings ;p INFO_LOG(BOOT, "Loaded bootrom: %s", m_ipl); // yay for null-terminated strings ;p
} }
else else
{ {
@ -114,18 +114,15 @@ CEXIIPL::CEXIIPL() : m_uPosition(0), m_uAddress(0), m_uRWOffset(0), m_FontsLoade
// Copy header // Copy header
if (DiscIO::IsNTSC(SConfig::GetInstance().m_region)) if (DiscIO::IsNTSC(SConfig::GetInstance().m_region))
memcpy(m_pIPL, iplverNTSC, sizeof(iplverNTSC)); memcpy(m_ipl, iplverNTSC, sizeof(iplverNTSC));
else else
memcpy(m_pIPL, iplverPAL, sizeof(iplverPAL)); memcpy(m_ipl, iplverPAL, sizeof(iplverPAL));
// Load fonts // Load fonts
LoadFontFile((File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + FONT_SHIFT_JIS), 0x1aff00); LoadFontFile((File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + FONT_SHIFT_JIS), 0x1aff00);
LoadFontFile((File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + FONT_WINDOWS_1252), 0x1fcf00); LoadFontFile((File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + FONT_WINDOWS_1252), 0x1fcf00);
} }
// Clear RTC
memset(m_RTC, 0, sizeof(m_RTC));
// We Overwrite language selection here since it's possible on the GC to change the language as // We Overwrite language selection here since it's possible on the GC to change the language as
// you please // you please
g_SRAM.lang = SConfig::GetInstance().SelectedLanguage; g_SRAM.lang = SConfig::GetInstance().SelectedLanguage;
@ -133,14 +130,14 @@ CEXIIPL::CEXIIPL() : m_uPosition(0), m_uAddress(0), m_uRWOffset(0), m_FontsLoade
g_SRAM.counter_bias = 0; g_SRAM.counter_bias = 0;
FixSRAMChecksums(); FixSRAMChecksums();
Common::WriteProtectMemory(m_pIPL, ROM_SIZE); Common::WriteProtectMemory(m_ipl, ROM_SIZE);
m_uAddress = 0; m_address = 0;
} }
CEXIIPL::~CEXIIPL() CEXIIPL::~CEXIIPL()
{ {
Common::FreeMemoryPages(m_pIPL, ROM_SIZE); Common::FreeMemoryPages(m_ipl, ROM_SIZE);
m_pIPL = nullptr; m_ipl = nullptr;
// SRAM // SRAM
if (!g_SRAM_netplay_initialized) if (!g_SRAM_netplay_initialized)
@ -155,12 +152,12 @@ CEXIIPL::~CEXIIPL()
} }
void CEXIIPL::DoState(PointerWrap& p) void CEXIIPL::DoState(PointerWrap& p)
{ {
p.Do(m_RTC); p.Do(m_rtc);
p.Do(m_uPosition); p.Do(m_position);
p.Do(m_uAddress); p.Do(m_address);
p.Do(m_uRWOffset); p.Do(m_rw_offset);
p.Do(m_buffer); p.Do(m_buffer);
p.Do(m_FontsLoaded); p.Do(m_fonts_loaded);
} }
bool CEXIIPL::LoadFileToIPL(const std::string& filename, u32 offset) bool CEXIIPL::LoadFileToIPL(const std::string& filename, u32 offset)
@ -171,10 +168,10 @@ bool CEXIIPL::LoadFileToIPL(const std::string& filename, u32 offset)
u64 filesize = stream.GetSize(); u64 filesize = stream.GetSize();
if (!stream.ReadBytes(m_pIPL + offset, filesize)) if (!stream.ReadBytes(m_ipl + offset, filesize))
return false; return false;
m_FontsLoaded = true; m_fonts_loaded = true;
return true; return true;
} }
@ -223,24 +220,24 @@ void CEXIIPL::LoadFontFile(const std::string& filename, u32 offset)
((offset == 0x1aff00) ? "Shift JIS" : "Windows-1252"), (ipl_rom_path).c_str()); ((offset == 0x1aff00) ? "Shift JIS" : "Windows-1252"), (ipl_rom_path).c_str());
stream.Seek(offset, 0); stream.Seek(offset, 0);
stream.ReadBytes(m_pIPL + offset, fontsize); stream.ReadBytes(m_ipl + offset, fontsize);
m_FontsLoaded = true; m_fonts_loaded = true;
} }
void CEXIIPL::SetCS(int _iCS) void CEXIIPL::SetCS(int cs)
{ {
if (_iCS) if (!cs)
{ return;
// cs transition to high
m_uPosition = 0; // cs transition to high
} m_position = 0;
} }
void CEXIIPL::UpdateRTC() void CEXIIPL::UpdateRTC()
{ {
u32 rtc = Common::swap32(GetEmulatedTime(GC_EPOCH)); const u32 rtc = Common::swap32(GetEmulatedTime(GC_EPOCH));
std::memcpy(m_RTC, &rtc, sizeof(u32)); std::memcpy(m_rtc.data(), &rtc, sizeof(u32));
} }
bool CEXIIPL::IsPresent() const bool CEXIIPL::IsPresent() const
@ -248,19 +245,19 @@ bool CEXIIPL::IsPresent() const
return true; return true;
} }
void CEXIIPL::TransferByte(u8& _uByte) void CEXIIPL::TransferByte(u8& byte)
{ {
// The first 4 bytes must be the address // The first 4 bytes must be the address
// If we haven't read it, do it now // If we haven't read it, do it now
if (m_uPosition <= 3) if (m_position <= 3)
{ {
m_uAddress <<= 8; m_address <<= 8;
m_uAddress |= _uByte; m_address |= byte;
m_uRWOffset = 0; m_rw_offset = 0;
_uByte = 0xFF; byte = 0xFF;
// Check if the command is complete // Check if the command is complete
if (m_uPosition == 3) if (m_position == 3)
{ {
// Get the time... // Get the time...
UpdateRTC(); UpdateRTC();
@ -295,7 +292,7 @@ void CEXIIPL::TransferByte(u8& _uByte)
device_name = "Wii RTC flags - not implemented"; device_name = "Wii RTC flags - not implemented";
break; break;
default: default:
if ((m_uAddress >> 6) < ROM_SIZE) if ((m_address >> 6) < ROM_SIZE)
{ {
device_name = "ROM"; device_name = "ROM";
} }
@ -303,13 +300,13 @@ void CEXIIPL::TransferByte(u8& _uByte)
{ {
device_name = "illegal address"; device_name = "illegal address";
DEBUG_ASSERT_MSG(EXPANSIONINTERFACE, 0, "EXI IPL-DEV: %s %08x", device_name.c_str(), DEBUG_ASSERT_MSG(EXPANSIONINTERFACE, 0, "EXI IPL-DEV: %s %08x", device_name.c_str(),
m_uAddress); m_address);
} }
break; break;
} }
DEBUG_LOG(EXPANSIONINTERFACE, "%s %s %08x", device_name.c_str(), DEBUG_LOG(EXPANSIONINTERFACE, "%s %s %08x", device_name.c_str(),
IsWriteCommand() ? "write" : "read", m_uAddress); IsWriteCommand() ? "write" : "read", m_address);
} }
} }
else else
@ -319,26 +316,26 @@ void CEXIIPL::TransferByte(u8& _uByte)
{ {
case REGION_RTC: case REGION_RTC:
if (IsWriteCommand()) if (IsWriteCommand())
m_RTC[(m_uAddress & 0x03) + m_uRWOffset] = _uByte; m_rtc[(m_address & 0x03) + m_rw_offset] = byte;
else else
_uByte = m_RTC[(m_uAddress & 0x03) + m_uRWOffset]; byte = m_rtc[(m_address & 0x03) + m_rw_offset];
break; break;
case REGION_SRAM: case REGION_SRAM:
if (IsWriteCommand()) if (IsWriteCommand())
g_SRAM.p_SRAM[(m_uAddress & 0x3F) + m_uRWOffset] = _uByte; g_SRAM.p_SRAM[(m_address & 0x3F) + m_rw_offset] = byte;
else else
_uByte = g_SRAM.p_SRAM[(m_uAddress & 0x3F) + m_uRWOffset]; byte = g_SRAM.p_SRAM[(m_address & 0x3F) + m_rw_offset];
break; break;
case REGION_UART: case REGION_UART:
case REGION_EUART: case REGION_EUART:
if (IsWriteCommand()) if (IsWriteCommand())
{ {
if (_uByte != '\0') if (byte != '\0')
m_buffer += _uByte; m_buffer += byte;
if (_uByte == '\r') if (byte == '\r')
{ {
NOTICE_LOG(OSREPORT, "%s", SHIFTJISToUTF8(m_buffer).c_str()); NOTICE_LOG(OSREPORT, "%s", SHIFTJISToUTF8(m_buffer).c_str());
m_buffer.clear(); m_buffer.clear();
@ -347,7 +344,7 @@ void CEXIIPL::TransferByte(u8& _uByte)
else else
{ {
// "Queue Length"... return 0 cause we're instant // "Queue Length"... return 0 cause we're instant
_uByte = 0; byte = 0;
} }
break; break;
@ -357,12 +354,12 @@ void CEXIIPL::TransferByte(u8& _uByte)
break; break;
case REGION_UART_UNK: case REGION_UART_UNK:
DEBUG_LOG(OSREPORT, "UART? %x", _uByte); DEBUG_LOG(OSREPORT, "UART? %x", byte);
_uByte = 0xff; byte = 0xff;
break; break;
case REGION_BARNACLE: case REGION_BARNACLE:
DEBUG_LOG(OSREPORT, "UART Barnacle %x", _uByte); DEBUG_LOG(OSREPORT, "UART Barnacle %x", byte);
break; break;
case REGION_WRTC0: case REGION_WRTC0:
@ -370,18 +367,18 @@ void CEXIIPL::TransferByte(u8& _uByte)
case REGION_WRTC2: case REGION_WRTC2:
// Wii only RTC flags... afaik just the Wii Menu initialize it // Wii only RTC flags... afaik just the Wii Menu initialize it
default: default:
if ((m_uAddress >> 6) < ROM_SIZE) if ((m_address >> 6) < ROM_SIZE)
{ {
if (!IsWriteCommand()) if (!IsWriteCommand())
{ {
u32 position = ((m_uAddress >> 6) & ROM_MASK) + m_uRWOffset; u32 position = ((m_address >> 6) & ROM_MASK) + m_rw_offset;
// Technically we should descramble here iff descrambling logic is enabled. // Technically we should descramble here iff descrambling logic is enabled.
// At the moment, we pre-decrypt the whole thing and // At the moment, we pre-decrypt the whole thing and
// ignore the "enabled" bit - see CEXIIPL::CEXIIPL // ignore the "enabled" bit - see CEXIIPL::CEXIIPL
_uByte = m_pIPL[position]; byte = m_ipl[position];
if ((position >= 0x001AFF00) && (position <= 0x001FF474) && !m_FontsLoaded) if ((position >= 0x001AFF00) && (position <= 0x001FF474) && !m_fonts_loaded)
{ {
if (position >= 0x001FCF00) if (position >= 0x001FCF00)
{ {
@ -393,22 +390,22 @@ void CEXIIPL::TransferByte(u8& _uByte)
PanicAlertT("Error: Trying to access Shift JIS fonts but they are not loaded. " PanicAlertT("Error: Trying to access Shift JIS fonts but they are not loaded. "
"Games may not show fonts correctly, or crash."); "Games may not show fonts correctly, or crash.");
} }
m_FontsLoaded = true; // Don't be a nag :p m_fonts_loaded = true; // Don't be a nag :p
} }
} }
} }
else else
{ {
NOTICE_LOG(OSREPORT, "EXI IPL-DEV: %s %x at %08x", IsWriteCommand() ? "write" : "read", NOTICE_LOG(OSREPORT, "EXI IPL-DEV: %s %x at %08x", IsWriteCommand() ? "write" : "read",
_uByte, m_uAddress); byte, m_address);
} }
break; break;
} }
m_uRWOffset++; m_rw_offset++;
} }
m_uPosition++; m_position++;
} }
u32 CEXIIPL::GetEmulatedTime(u32 epoch) u32 CEXIIPL::GetEmulatedTime(u32 epoch)

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <array>
#include <string> #include <string>
#include "Core/HW/EXI/EXI_Device.h" #include "Core/HW/EXI/EXI_Device.h"
@ -16,9 +17,9 @@ class CEXIIPL : public IEXIDevice
{ {
public: public:
CEXIIPL(); CEXIIPL();
virtual ~CEXIIPL(); ~CEXIIPL() override;
void SetCS(int _iCS) override; void SetCS(int cs) override;
bool IsPresent() const override; bool IsPresent() const override;
void DoState(PointerWrap& p) override; void DoState(PointerWrap& p) override;
@ -52,25 +53,25 @@ private:
}; };
//! IPL //! IPL
u8* m_pIPL; u8* m_ipl;
// STATE_TO_SAVE // STATE_TO_SAVE
//! RealTimeClock //! RealTimeClock
u8 m_RTC[4]; std::array<u8, 4> m_rtc{};
//! Helper //! Helper
u32 m_uPosition; u32 m_position = 0;
u32 m_uAddress; u32 m_address = 0;
u32 m_uRWOffset; u32 m_rw_offset = 0;
std::string m_buffer; std::string m_buffer;
bool m_FontsLoaded; bool m_fonts_loaded = false;
void UpdateRTC(); void UpdateRTC();
void TransferByte(u8& _uByte) override; void TransferByte(u8& byte) override;
bool IsWriteCommand() const { return !!(m_uAddress & (1 << 31)); } bool IsWriteCommand() const { return !!(m_address & (1 << 31)); }
u32 CommandRegion() const { return (m_uAddress & ~(1 << 31)) >> 8; } u32 CommandRegion() const { return (m_address & ~(1 << 31)) >> 8; }
bool LoadFileToIPL(const std::string& filename, u32 offset); bool LoadFileToIPL(const std::string& filename, u32 offset);
void LoadFontFile(const std::string& filename, u32 offset); void LoadFontFile(const std::string& filename, u32 offset);
std::string FindIPLDump(const std::string& path_prefix); std::string FindIPLDump(const std::string& path_prefix);