mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-14 10:48:36 +12:00
Memory.Write*/Read* replaced
This commit is contained in:
parent
1b499a6fd5
commit
43a61d0ab9
36 changed files with 223 additions and 483 deletions
|
@ -42,28 +42,13 @@ public:
|
|||
MemoryBlock* RawSPUMem[(0x100000000 - RAW_SPU_BASE_ADDR) / RAW_SPU_OFFSET];
|
||||
VirtualMemoryBlock RSXIOMem;
|
||||
|
||||
struct Wrapper32LE
|
||||
{
|
||||
void Write8(const u32 addr, const u8 data) { *(u8*)((u8*)m_base_addr + addr) = data; }
|
||||
void Write16(const u32 addr, const u16 data) { *(u16*)((u8*)m_base_addr + addr) = data; }
|
||||
void Write32(const u32 addr, const u32 data) { *(u32*)((u8*)m_base_addr + addr) = data; }
|
||||
void Write64(const u32 addr, const u64 data) { *(u64*)((u8*)m_base_addr + addr) = data; }
|
||||
void Write128(const u32 addr, const u128 data) { *(u128*)((u8*)m_base_addr + addr) = data; }
|
||||
|
||||
u8 Read8(const u32 addr) { return *(u8*)((u8*)m_base_addr + addr); }
|
||||
u16 Read16(const u32 addr) { return *(u16*)((u8*)m_base_addr + addr); }
|
||||
u32 Read32(const u32 addr) { return *(u32*)((u8*)m_base_addr + addr); }
|
||||
u64 Read64(const u32 addr) { return *(u64*)((u8*)m_base_addr + addr); }
|
||||
u128 Read128(const u32 addr) { return *(u128*)((u8*)m_base_addr + addr); }
|
||||
};
|
||||
|
||||
struct : Wrapper32LE
|
||||
struct
|
||||
{
|
||||
DynamicMemoryBlock RAM;
|
||||
DynamicMemoryBlock Userspace;
|
||||
} PSV;
|
||||
|
||||
struct : Wrapper32LE
|
||||
struct
|
||||
{
|
||||
DynamicMemoryBlock Scratchpad;
|
||||
DynamicMemoryBlock VRAM;
|
||||
|
@ -116,29 +101,22 @@ public:
|
|||
|
||||
void Init(MemoryType type);
|
||||
|
||||
template<typename T> bool IsGoodAddr(const T addr)
|
||||
bool IsGoodAddr(const u32 addr)
|
||||
{
|
||||
if ((u32)addr != addr || !m_pages[addr / 4096]) // TODO: define page parameters
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return m_pages[addr / 4096] != 0; // TODO: define page parameters
|
||||
}
|
||||
|
||||
template<typename T> bool IsGoodAddr(const T addr, const u32 size)
|
||||
bool IsGoodAddr(const u32 addr, const u32 size)
|
||||
{
|
||||
if ((u32)addr != addr || (u64)addr + (u64)size > 0x100000000ull)
|
||||
if (!size || addr + size - 1 < addr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (u32 i = (u32)addr / 4096; i <= ((u32)addr + size - 1) / 4096; i++)
|
||||
for (u32 i = addr / 4096; i <= (addr + size - 1) / 4096; i++)
|
||||
{
|
||||
if (!m_pages[i]) return false; // TODO: define page parameters
|
||||
if (m_pages[i] != 0) return false; // TODO: define page parameters
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -146,155 +124,10 @@ public:
|
|||
|
||||
void Close();
|
||||
|
||||
//MemoryBase
|
||||
template<typename T> void Write8(T addr, const u8 data)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
*(u8*)((u8*)GetBaseAddr() + addr) = data;
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
*(u8*)GetBaseAddr() = data;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> void Write16(T addr, const u16 data)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
*(u16*)((u8*)GetBaseAddr() + addr) = re16(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
*(u16*)GetBaseAddr() = data;
|
||||
}
|
||||
}
|
||||
|
||||
__noinline void WriteMMIO32(u32 addr, const u32 data);
|
||||
|
||||
template<typename T> void Write32(T addr, const u32 data)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET)
|
||||
{
|
||||
*(u32*)((u8*)GetBaseAddr() + addr) = re32(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteMMIO32((u32)addr, data);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
*(u32*)GetBaseAddr() = data;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> void Write64(T addr, const u64 data)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
*(u64*)((u8*)GetBaseAddr() + addr) = re64(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
*(u64*)GetBaseAddr() = data;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> void Write128(T addr, const u128 data)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
*(u128*)((u8*)GetBaseAddr() + addr) = re128(data);
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
*(u128*)GetBaseAddr() = data;
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> u8 Read8(T addr)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
return *(u8*)((u8*)GetBaseAddr() + addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
return *(u8*)GetBaseAddr();
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> u16 Read16(T addr)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
return re16(*(u16*)((u8*)GetBaseAddr() + addr));
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
return *(u16*)GetBaseAddr();
|
||||
}
|
||||
}
|
||||
|
||||
__noinline u32 ReadMMIO32(u32 addr);
|
||||
|
||||
template<typename T> u32 Read32(T addr)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
if (addr < RAW_SPU_BASE_ADDR || (addr % RAW_SPU_OFFSET) < RAW_SPU_PROB_OFFSET)
|
||||
{
|
||||
return re32(*(u32*)((u8*)GetBaseAddr() + addr));
|
||||
}
|
||||
else
|
||||
{
|
||||
return ReadMMIO32((u32)addr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
return *(u32*)GetBaseAddr();
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> u64 Read64(T addr)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
return re64(*(u64*)((u8*)GetBaseAddr() + addr));
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
return *(u64*)GetBaseAddr();
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T> u128 Read128(T addr)
|
||||
{
|
||||
if ((u32)addr == addr)
|
||||
{
|
||||
return re128(*(u128*)((u8*)GetBaseAddr() + addr));
|
||||
}
|
||||
else
|
||||
{
|
||||
InvalidAddress(__FUNCTION__, addr);
|
||||
return *(u128*)GetBaseAddr();
|
||||
}
|
||||
}
|
||||
|
||||
u32 GetUserMemTotalSize()
|
||||
{
|
||||
return UserMemory->GetSize();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue