Merge pull request #7049 from lioncash/ipl
EXI_DeviceIPL: Minor changes
This commit is contained in:
commit
c02a239a2f
|
@ -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
|
||||
m_pIPL = static_cast<u8*>(Common::AllocateMemoryPages(ROM_SIZE));
|
||||
m_ipl = static_cast<u8*>(Common::AllocateMemoryPages(ROM_SIZE));
|
||||
|
||||
// Load whole ROM dump
|
||||
// Note: The Wii doesn't have a copy of the IPL, only fonts.
|
||||
if (!SConfig::GetInstance().bWii && LoadFileToIPL(SConfig::GetInstance().m_strBootROM, 0))
|
||||
{
|
||||
// Descramble the encrypted section (contains BS1 and BS2)
|
||||
Descrambler(m_pIPL + 0x100, 0x1afe00);
|
||||
INFO_LOG(BOOT, "Loaded bootrom: %s", m_pIPL); // yay for null-terminated strings ;p
|
||||
Descrambler(m_ipl + 0x100, 0x1afe00);
|
||||
INFO_LOG(BOOT, "Loaded bootrom: %s", m_ipl); // yay for null-terminated strings ;p
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -114,18 +114,15 @@ CEXIIPL::CEXIIPL() : m_uPosition(0), m_uAddress(0), m_uRWOffset(0), m_FontsLoade
|
|||
|
||||
// Copy header
|
||||
if (DiscIO::IsNTSC(SConfig::GetInstance().m_region))
|
||||
memcpy(m_pIPL, iplverNTSC, sizeof(iplverNTSC));
|
||||
memcpy(m_ipl, iplverNTSC, sizeof(iplverNTSC));
|
||||
else
|
||||
memcpy(m_pIPL, iplverPAL, sizeof(iplverPAL));
|
||||
memcpy(m_ipl, iplverPAL, sizeof(iplverPAL));
|
||||
|
||||
// Load fonts
|
||||
LoadFontFile((File::GetSysDirectory() + GC_SYS_DIR + DIR_SEP + FONT_SHIFT_JIS), 0x1aff00);
|
||||
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
|
||||
// you please
|
||||
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;
|
||||
FixSRAMChecksums();
|
||||
|
||||
Common::WriteProtectMemory(m_pIPL, ROM_SIZE);
|
||||
m_uAddress = 0;
|
||||
Common::WriteProtectMemory(m_ipl, ROM_SIZE);
|
||||
m_address = 0;
|
||||
}
|
||||
|
||||
CEXIIPL::~CEXIIPL()
|
||||
{
|
||||
Common::FreeMemoryPages(m_pIPL, ROM_SIZE);
|
||||
m_pIPL = nullptr;
|
||||
Common::FreeMemoryPages(m_ipl, ROM_SIZE);
|
||||
m_ipl = nullptr;
|
||||
|
||||
// SRAM
|
||||
if (!g_SRAM_netplay_initialized)
|
||||
|
@ -155,12 +152,12 @@ CEXIIPL::~CEXIIPL()
|
|||
}
|
||||
void CEXIIPL::DoState(PointerWrap& p)
|
||||
{
|
||||
p.Do(m_RTC);
|
||||
p.Do(m_uPosition);
|
||||
p.Do(m_uAddress);
|
||||
p.Do(m_uRWOffset);
|
||||
p.Do(m_rtc);
|
||||
p.Do(m_position);
|
||||
p.Do(m_address);
|
||||
p.Do(m_rw_offset);
|
||||
p.Do(m_buffer);
|
||||
p.Do(m_FontsLoaded);
|
||||
p.Do(m_fonts_loaded);
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
if (!stream.ReadBytes(m_pIPL + offset, filesize))
|
||||
if (!stream.ReadBytes(m_ipl + offset, filesize))
|
||||
return false;
|
||||
|
||||
m_FontsLoaded = true;
|
||||
m_fonts_loaded = 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());
|
||||
|
||||
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)
|
||||
{
|
||||
if (_iCS)
|
||||
void CEXIIPL::SetCS(int cs)
|
||||
{
|
||||
if (!cs)
|
||||
return;
|
||||
|
||||
// cs transition to high
|
||||
m_uPosition = 0;
|
||||
}
|
||||
m_position = 0;
|
||||
}
|
||||
|
||||
void CEXIIPL::UpdateRTC()
|
||||
{
|
||||
u32 rtc = Common::swap32(GetEmulatedTime(GC_EPOCH));
|
||||
std::memcpy(m_RTC, &rtc, sizeof(u32));
|
||||
const u32 rtc = Common::swap32(GetEmulatedTime(GC_EPOCH));
|
||||
std::memcpy(m_rtc.data(), &rtc, sizeof(u32));
|
||||
}
|
||||
|
||||
bool CEXIIPL::IsPresent() const
|
||||
|
@ -248,19 +245,19 @@ bool CEXIIPL::IsPresent() const
|
|||
return true;
|
||||
}
|
||||
|
||||
void CEXIIPL::TransferByte(u8& _uByte)
|
||||
void CEXIIPL::TransferByte(u8& byte)
|
||||
{
|
||||
// The first 4 bytes must be the address
|
||||
// If we haven't read it, do it now
|
||||
if (m_uPosition <= 3)
|
||||
if (m_position <= 3)
|
||||
{
|
||||
m_uAddress <<= 8;
|
||||
m_uAddress |= _uByte;
|
||||
m_uRWOffset = 0;
|
||||
_uByte = 0xFF;
|
||||
m_address <<= 8;
|
||||
m_address |= byte;
|
||||
m_rw_offset = 0;
|
||||
byte = 0xFF;
|
||||
|
||||
// Check if the command is complete
|
||||
if (m_uPosition == 3)
|
||||
if (m_position == 3)
|
||||
{
|
||||
// Get the time...
|
||||
UpdateRTC();
|
||||
|
@ -295,7 +292,7 @@ void CEXIIPL::TransferByte(u8& _uByte)
|
|||
device_name = "Wii RTC flags - not implemented";
|
||||
break;
|
||||
default:
|
||||
if ((m_uAddress >> 6) < ROM_SIZE)
|
||||
if ((m_address >> 6) < ROM_SIZE)
|
||||
{
|
||||
device_name = "ROM";
|
||||
}
|
||||
|
@ -303,13 +300,13 @@ void CEXIIPL::TransferByte(u8& _uByte)
|
|||
{
|
||||
device_name = "illegal address";
|
||||
DEBUG_ASSERT_MSG(EXPANSIONINTERFACE, 0, "EXI IPL-DEV: %s %08x", device_name.c_str(),
|
||||
m_uAddress);
|
||||
m_address);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
DEBUG_LOG(EXPANSIONINTERFACE, "%s %s %08x", device_name.c_str(),
|
||||
IsWriteCommand() ? "write" : "read", m_uAddress);
|
||||
IsWriteCommand() ? "write" : "read", m_address);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -319,26 +316,26 @@ void CEXIIPL::TransferByte(u8& _uByte)
|
|||
{
|
||||
case REGION_RTC:
|
||||
if (IsWriteCommand())
|
||||
m_RTC[(m_uAddress & 0x03) + m_uRWOffset] = _uByte;
|
||||
m_rtc[(m_address & 0x03) + m_rw_offset] = byte;
|
||||
else
|
||||
_uByte = m_RTC[(m_uAddress & 0x03) + m_uRWOffset];
|
||||
byte = m_rtc[(m_address & 0x03) + m_rw_offset];
|
||||
break;
|
||||
|
||||
case REGION_SRAM:
|
||||
if (IsWriteCommand())
|
||||
g_SRAM.p_SRAM[(m_uAddress & 0x3F) + m_uRWOffset] = _uByte;
|
||||
g_SRAM.p_SRAM[(m_address & 0x3F) + m_rw_offset] = byte;
|
||||
else
|
||||
_uByte = g_SRAM.p_SRAM[(m_uAddress & 0x3F) + m_uRWOffset];
|
||||
byte = g_SRAM.p_SRAM[(m_address & 0x3F) + m_rw_offset];
|
||||
break;
|
||||
|
||||
case REGION_UART:
|
||||
case REGION_EUART:
|
||||
if (IsWriteCommand())
|
||||
{
|
||||
if (_uByte != '\0')
|
||||
m_buffer += _uByte;
|
||||
if (byte != '\0')
|
||||
m_buffer += byte;
|
||||
|
||||
if (_uByte == '\r')
|
||||
if (byte == '\r')
|
||||
{
|
||||
NOTICE_LOG(OSREPORT, "%s", SHIFTJISToUTF8(m_buffer).c_str());
|
||||
m_buffer.clear();
|
||||
|
@ -347,7 +344,7 @@ void CEXIIPL::TransferByte(u8& _uByte)
|
|||
else
|
||||
{
|
||||
// "Queue Length"... return 0 cause we're instant
|
||||
_uByte = 0;
|
||||
byte = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -357,12 +354,12 @@ void CEXIIPL::TransferByte(u8& _uByte)
|
|||
break;
|
||||
|
||||
case REGION_UART_UNK:
|
||||
DEBUG_LOG(OSREPORT, "UART? %x", _uByte);
|
||||
_uByte = 0xff;
|
||||
DEBUG_LOG(OSREPORT, "UART? %x", byte);
|
||||
byte = 0xff;
|
||||
break;
|
||||
|
||||
case REGION_BARNACLE:
|
||||
DEBUG_LOG(OSREPORT, "UART Barnacle %x", _uByte);
|
||||
DEBUG_LOG(OSREPORT, "UART Barnacle %x", byte);
|
||||
break;
|
||||
|
||||
case REGION_WRTC0:
|
||||
|
@ -370,18 +367,18 @@ void CEXIIPL::TransferByte(u8& _uByte)
|
|||
case REGION_WRTC2:
|
||||
// Wii only RTC flags... afaik just the Wii Menu initialize it
|
||||
default:
|
||||
if ((m_uAddress >> 6) < ROM_SIZE)
|
||||
if ((m_address >> 6) < ROM_SIZE)
|
||||
{
|
||||
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.
|
||||
// At the moment, we pre-decrypt the whole thing and
|
||||
// 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)
|
||||
{
|
||||
|
@ -393,22 +390,22 @@ void CEXIIPL::TransferByte(u8& _uByte)
|
|||
PanicAlertT("Error: Trying to access Shift JIS fonts but they are not loaded. "
|
||||
"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
|
||||
{
|
||||
NOTICE_LOG(OSREPORT, "EXI IPL-DEV: %s %x at %08x", IsWriteCommand() ? "write" : "read",
|
||||
_uByte, m_uAddress);
|
||||
byte, m_address);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
m_uRWOffset++;
|
||||
m_rw_offset++;
|
||||
}
|
||||
|
||||
m_uPosition++;
|
||||
m_position++;
|
||||
}
|
||||
|
||||
u32 CEXIIPL::GetEmulatedTime(u32 epoch)
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <string>
|
||||
|
||||
#include "Core/HW/EXI/EXI_Device.h"
|
||||
|
@ -16,9 +17,9 @@ class CEXIIPL : public IEXIDevice
|
|||
{
|
||||
public:
|
||||
CEXIIPL();
|
||||
virtual ~CEXIIPL();
|
||||
~CEXIIPL() override;
|
||||
|
||||
void SetCS(int _iCS) override;
|
||||
void SetCS(int cs) override;
|
||||
bool IsPresent() const override;
|
||||
void DoState(PointerWrap& p) override;
|
||||
|
||||
|
@ -52,25 +53,25 @@ private:
|
|||
};
|
||||
|
||||
//! IPL
|
||||
u8* m_pIPL;
|
||||
u8* m_ipl;
|
||||
|
||||
// STATE_TO_SAVE
|
||||
//! RealTimeClock
|
||||
u8 m_RTC[4];
|
||||
std::array<u8, 4> m_rtc{};
|
||||
|
||||
//! Helper
|
||||
u32 m_uPosition;
|
||||
u32 m_uAddress;
|
||||
u32 m_uRWOffset;
|
||||
u32 m_position = 0;
|
||||
u32 m_address = 0;
|
||||
u32 m_rw_offset = 0;
|
||||
|
||||
std::string m_buffer;
|
||||
bool m_FontsLoaded;
|
||||
bool m_fonts_loaded = false;
|
||||
|
||||
void UpdateRTC();
|
||||
|
||||
void TransferByte(u8& _uByte) override;
|
||||
bool IsWriteCommand() const { return !!(m_uAddress & (1 << 31)); }
|
||||
u32 CommandRegion() const { return (m_uAddress & ~(1 << 31)) >> 8; }
|
||||
void TransferByte(u8& byte) override;
|
||||
bool IsWriteCommand() const { return !!(m_address & (1 << 31)); }
|
||||
u32 CommandRegion() const { return (m_address & ~(1 << 31)) >> 8; }
|
||||
bool LoadFileToIPL(const std::string& filename, u32 offset);
|
||||
void LoadFontFile(const std::string& filename, u32 offset);
|
||||
std::string FindIPLDump(const std::string& path_prefix);
|
||||
|
|
Loading…
Reference in New Issue