diff --git a/rpcs3/Emu/Memory/DynamicMemoryBlockBase.inl b/rpcs3/Emu/Memory/DynamicMemoryBlockBase.inl new file mode 100644 index 0000000000..d4f28d2feb --- /dev/null +++ b/rpcs3/Emu/Memory/DynamicMemoryBlockBase.inl @@ -0,0 +1,160 @@ + +//DynamicMemoryBlockBase +template +DynamicMemoryBlockBase::DynamicMemoryBlockBase() : m_max_size(0) +{ +} + +template +const u32 DynamicMemoryBlockBase::GetUsedSize() const +{ + u32 size = 0; + + for(u32 i=0; i +bool DynamicMemoryBlockBase::IsInMyRange(const u64 addr) +{ + return addr >= GetStartAddr() && addr < GetStartAddr() + GetSize(); +} + +template +bool DynamicMemoryBlockBase::IsInMyRange(const u64 addr, const u32 size) +{ + return IsInMyRange(addr) && IsInMyRange(addr + size - 1); +} + +template +bool DynamicMemoryBlockBase::IsMyAddress(const u64 addr) +{ + for(u32 i=0; i= m_used_mem[i].addr && addr < m_used_mem[i].addr + m_used_mem[i].size) + { + return true; + } + } + + return false; +} + +template +MemoryBlock* DynamicMemoryBlockBase::SetRange(const u64 start, const u32 size) +{ + m_max_size = size; + MemoryBlock::SetRange(start, 0); + + return this; +} + +template +void DynamicMemoryBlockBase::Delete() +{ + m_used_mem.Clear(); + m_max_size = 0; + + MemoryBlock::Delete(); +} + +template +bool DynamicMemoryBlockBase::Alloc(u64 addr, u32 size) +{ + if(!IsInMyRange(addr, size)) + { + assert(0); + return false; + } + + if(IsMyAddress(addr) || IsMyAddress(addr + size - 1)) + { + return false; + } + + for(u32 i=0; i= m_used_mem[i].addr && addr < m_used_mem[i].addr + m_used_mem[i].size) return false; + } + + AppendUsedMem(addr, size); + + return true; +} + +template +void DynamicMemoryBlockBase::AppendUsedMem(u64 addr, u32 size) +{ + m_used_mem.Move(new MemBlockInfo(addr, size)); +} + +template +u64 DynamicMemoryBlockBase::Alloc(u32 size) +{ + for(u64 addr=GetStartAddr(); addr <= GetEndAddr() - size;) + { + bool is_good_addr = true; + + for(u32 i=0; i= m_used_mem[i].addr && addr < m_used_mem[i].addr + m_used_mem[i].size) || + (m_used_mem[i].addr >= addr && m_used_mem[i].addr < addr + size)) + { + is_good_addr = false; + addr = m_used_mem[i].addr + m_used_mem[i].size; + break; + } + } + + if(!is_good_addr) continue; + + AppendUsedMem(addr, size); + + return addr; + } + + return 0; +} + +template +bool DynamicMemoryBlockBase::Alloc() +{ + return Alloc(GetSize() - GetUsedSize()) != 0; +} + +template +bool DynamicMemoryBlockBase::Free(u64 addr) +{ + for(u32 i=0; i +u8* DynamicMemoryBlockBase::GetMem(u64 addr) const +{ + for(u32 i=0; i= _addr && addr < _addr + m_used_mem[i].size) + { + return (u8*)m_used_mem[i].mem + addr - _addr; + } + } + + ConLog.Error("GetMem(%llx) from not allocated address.", addr); + assert(0); + return nullptr; +} \ No newline at end of file diff --git a/rpcs3/Emu/Memory/Memory.cpp b/rpcs3/Emu/Memory/Memory.cpp index 5411e150e4..994dc01af1 100644 --- a/rpcs3/Emu/Memory/Memory.cpp +++ b/rpcs3/Emu/Memory/Memory.cpp @@ -399,166 +399,6 @@ bool NullMemoryBlock::Write128(const u64 addr, const u128 value) return false; } -//DynamicMemoryBlock -template -DynamicMemoryBlockBase::DynamicMemoryBlockBase() : m_max_size(0) -{ -} - -template -const u32 DynamicMemoryBlockBase::GetUsedSize() const -{ - u32 size = 0; - - for(u32 i=0; i -bool DynamicMemoryBlockBase::IsInMyRange(const u64 addr) -{ - return addr >= GetStartAddr() && addr < GetStartAddr() + GetSize(); -} - -template -bool DynamicMemoryBlockBase::IsInMyRange(const u64 addr, const u32 size) -{ - return IsInMyRange(addr) && IsInMyRange(addr + size - 1); -} - -template -bool DynamicMemoryBlockBase::IsMyAddress(const u64 addr) -{ - for(u32 i=0; i= m_used_mem[i].addr && addr < m_used_mem[i].addr + m_used_mem[i].size) - { - return true; - } - } - - return false; -} - -template -MemoryBlock* DynamicMemoryBlockBase::SetRange(const u64 start, const u32 size) -{ - m_max_size = size; - MemoryBlock::SetRange(start, 0); - - return this; -} - -template -void DynamicMemoryBlockBase::Delete() -{ - m_used_mem.Clear(); - m_max_size = 0; - - MemoryBlock::Delete(); -} - -template -bool DynamicMemoryBlockBase::Alloc(u64 addr, u32 size) -{ - if(!IsInMyRange(addr, size)) - { - assert(0); - return false; - } - - if(IsMyAddress(addr) || IsMyAddress(addr + size - 1)) - { - return false; - } - - for(u32 i=0; i= m_used_mem[i].addr && addr < m_used_mem[i].addr + m_used_mem[i].size) return false; - } - - AppendUsedMem(addr, size); - - return true; -} - -template -void DynamicMemoryBlockBase::AppendUsedMem(u64 addr, u32 size) -{ - m_used_mem.Move(new MemBlockInfo(addr, size)); -} - -template -u64 DynamicMemoryBlockBase::Alloc(u32 size) -{ - for(u64 addr=GetStartAddr(); addr <= GetEndAddr() - size;) - { - bool is_good_addr = true; - - for(u32 i=0; i= m_used_mem[i].addr && addr < m_used_mem[i].addr + m_used_mem[i].size) || - (m_used_mem[i].addr >= addr && m_used_mem[i].addr < addr + size)) - { - is_good_addr = false; - addr = m_used_mem[i].addr + m_used_mem[i].size; - break; - } - } - - if(!is_good_addr) continue; - - AppendUsedMem(addr, size); - - return addr; - } - - return 0; -} - -template -bool DynamicMemoryBlockBase::Alloc() -{ - return Alloc(GetSize() - GetUsedSize()) != 0; -} - -template -bool DynamicMemoryBlockBase::Free(u64 addr) -{ - for(u32 i=0; i -u8* DynamicMemoryBlockBase::GetMem(u64 addr) const -{ - for(u32 i=0; i= _addr && addr < _addr + m_used_mem[i].size) - { - return (u8*)m_used_mem[i].mem + addr - _addr; - } - } - - ConLog.Error("GetMem(%llx) from not allocated address.", addr); - assert(0); - return nullptr; -} - //MemoryBase void MemoryBase::Write8(u64 addr, const u8 data) { diff --git a/rpcs3/Emu/Memory/MemoryBlock.h b/rpcs3/Emu/Memory/MemoryBlock.h index e4bc8b5648..a35757468e 100644 --- a/rpcs3/Emu/Memory/MemoryBlock.h +++ b/rpcs3/Emu/Memory/MemoryBlock.h @@ -198,5 +198,7 @@ private: void AppendUsedMem(u64 addr, u32 size); }; +#include "DynamicMemoryBlockBase.inl" + typedef DynamicMemoryBlockBase DynamicMemoryBlock; typedef DynamicMemoryBlockBase DynamicMemoryBlockLE;