sh4 dyna: support for !vmem
This commit is contained in:
parent
44213bf830
commit
eb81583d9f
|
@ -232,49 +232,70 @@ void bm_Reset()
|
|||
protected_blocks = 0;
|
||||
unprotected_blocks = 0;
|
||||
|
||||
// Windows cannot lock/unlock a region spanning more than one VirtualAlloc or MapViewOfFile
|
||||
// so we have to unlock each region individually
|
||||
// No need for this mess in 4GB mode since windows doesn't use it
|
||||
if (settings.platform.ram_size == 16 * 1024 * 1024)
|
||||
if (_nvmem_enabled())
|
||||
{
|
||||
mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0x0D000000, RAM_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0x0F000000, RAM_SIZE);
|
||||
// Windows cannot lock/unlock a region spanning more than one VirtualAlloc or MapViewOfFile
|
||||
// so we have to unlock each region individually
|
||||
// No need for this mess in 4GB mode since windows doesn't use it
|
||||
if (settings.platform.ram_size == 16 * 1024 * 1024)
|
||||
{
|
||||
mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0x0D000000, RAM_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0x0F000000, RAM_SIZE);
|
||||
}
|
||||
else
|
||||
{
|
||||
mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE);
|
||||
}
|
||||
if (_nvmem_4gb_space())
|
||||
{
|
||||
mem_region_unlock(virt_ram_base + 0x8C000000u, 0x90000000u - 0x8C000000u);
|
||||
mem_region_unlock(virt_ram_base + 0xAC000000u, 0xB0000000u - 0xAC000000u);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mem_region_unlock(virt_ram_base + 0x0C000000, RAM_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0x0E000000, RAM_SIZE);
|
||||
}
|
||||
if (_nvmem_4gb_space())
|
||||
{
|
||||
mem_region_unlock(virt_ram_base + 0x8C000000u, 0x90000000u - 0x8C000000u);
|
||||
mem_region_unlock(virt_ram_base + 0xAC000000u, 0xB0000000u - 0xAC000000u);
|
||||
mem_region_unlock(&mem_b[0], RAM_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
static void bm_LockPage(u32 addr)
|
||||
{
|
||||
addr = addr & (RAM_MASK - PAGE_MASK);
|
||||
mem_region_lock(virt_ram_base + 0x0C000000 + addr, PAGE_SIZE);
|
||||
if (_nvmem_4gb_space())
|
||||
if (_nvmem_enabled())
|
||||
{
|
||||
mem_region_lock(virt_ram_base + 0x8C000000 + addr, PAGE_SIZE);
|
||||
mem_region_lock(virt_ram_base + 0xAC000000 + addr, PAGE_SIZE);
|
||||
// TODO wraps
|
||||
mem_region_lock(virt_ram_base + 0x0C000000 + addr, PAGE_SIZE);
|
||||
if (_nvmem_4gb_space())
|
||||
{
|
||||
mem_region_lock(virt_ram_base + 0x8C000000 + addr, PAGE_SIZE);
|
||||
mem_region_lock(virt_ram_base + 0xAC000000 + addr, PAGE_SIZE);
|
||||
// TODO wraps
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mem_region_lock(&mem_b[addr], PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
static void bm_UnlockPage(u32 addr)
|
||||
{
|
||||
addr = addr & (RAM_MASK - PAGE_MASK);
|
||||
mem_region_unlock(virt_ram_base + 0x0C000000 + addr, PAGE_SIZE);
|
||||
if (_nvmem_4gb_space())
|
||||
if (_nvmem_enabled())
|
||||
{
|
||||
mem_region_unlock(virt_ram_base + 0x8C000000 + addr, PAGE_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0xAC000000 + addr, PAGE_SIZE);
|
||||
// TODO wraps
|
||||
mem_region_unlock(virt_ram_base + 0x0C000000 + addr, PAGE_SIZE);
|
||||
if (_nvmem_4gb_space())
|
||||
{
|
||||
mem_region_unlock(virt_ram_base + 0x8C000000 + addr, PAGE_SIZE);
|
||||
mem_region_unlock(virt_ram_base + 0xAC000000 + addr, PAGE_SIZE);
|
||||
// TODO wraps
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mem_region_unlock(&mem_b[addr], PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -588,20 +609,29 @@ void bm_RamWriteAccess(u32 addr)
|
|||
|
||||
bool bm_RamWriteAccess(void *p)
|
||||
{
|
||||
if (_nvmem_4gb_space())
|
||||
if (_nvmem_enabled())
|
||||
{
|
||||
if ((u8 *)p < virt_ram_base || (u8 *)p >= virt_ram_base + 0x100000000L)
|
||||
if (_nvmem_4gb_space())
|
||||
{
|
||||
if ((u8 *)p < virt_ram_base || (u8 *)p >= virt_ram_base + 0x100000000L)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((u8 *)p < virt_ram_base || (u8 *)p >= virt_ram_base + 0x20000000)
|
||||
return false;
|
||||
}
|
||||
u32 addr = (u8*)p - virt_ram_base;
|
||||
if (!IsOnRam(addr) || ((addr >> 29) > 0 && (addr >> 29) < 4)) // system RAM is not mapped to 20, 40 and 60 because of laziness
|
||||
return false;
|
||||
bm_RamWriteAccess(addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((u8 *)p < virt_ram_base || (u8 *)p >= virt_ram_base + 0x20000000)
|
||||
if ((u8 *)p < &mem_b[0] || (u8 *)p >= &mem_b[RAM_SIZE])
|
||||
return false;
|
||||
bm_RamWriteAccess((u32)((u8 *)p - &mem_b[0]));
|
||||
}
|
||||
u32 addr = (u8*)p - virt_ram_base;
|
||||
if (!IsOnRam(addr) || ((addr >> 29) > 0 && (addr >> 29) < 4)) // system RAM is not mapped to 20, 40 and 60 because of laziness
|
||||
return false;
|
||||
bm_RamWriteAccess(addr);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue