From eb81583d9f3367ce4a9f75fc16e22037f6b0141a Mon Sep 17 00:00:00 2001 From: Flyinghead Date: Tue, 13 Jul 2021 17:09:26 +0200 Subject: [PATCH] sh4 dyna: support for !vmem --- core/hw/sh4/dyna/blockmanager.cpp | 94 ++++++++++++++++++++----------- 1 file changed, 62 insertions(+), 32 deletions(-) diff --git a/core/hw/sh4/dyna/blockmanager.cpp b/core/hw/sh4/dyna/blockmanager.cpp index 4fadb4cf0..dd26a4a59 100644 --- a/core/hw/sh4/dyna/blockmanager.cpp +++ b/core/hw/sh4/dyna/blockmanager.cpp @@ -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; }