X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fpsxmem.c;h=37a0efd0d2bb13a4571366bd5224adf423860a0a;hb=5b5680983b7b3dde95acfe42f58e748d9f7fe1cb;hp=9bb3760ab0a8e34707861ef9d6667146c8ea1d09;hpb=824ba219962929879b384706a18d134231939a46;p=pcsx_rearmed.git diff --git a/libpcsxcore/psxmem.c b/libpcsxcore/psxmem.c index 9bb3760a..37a0efd0 100644 --- a/libpcsxcore/psxmem.c +++ b/libpcsxcore/psxmem.c @@ -27,7 +27,8 @@ #include "psxmem_map.h" #include "r3000a.h" #include "psxhw.h" -#include "debug.h" +//#include "debug.h" +#define DebugCheckBP(...) #include "lightrec/mem.h" #include "memmap.h" @@ -40,14 +41,6 @@ #define MAP_ANONYMOUS MAP_ANON #endif -boolean writeok = TRUE; - -#ifndef NDEBUG -#include "debug.h" -#else -void DebugCheckBP(u32 address, enum breakpoint_types type) {} -#endif - void *(*psxMapHook)(unsigned long addr, size_t size, int is_fixed, enum psxMapTag tag); void (*psxUnmapHook)(void *ptr, size_t size, enum psxMapTag tag); @@ -71,13 +64,13 @@ retry: /* if (is_fixed) flags |= MAP_FIXED; */ - req = (void *)addr; + req = (void *)(uintptr_t)addr; ret = mmap(req, size, PROT_READ | PROT_WRITE, flags, -1, 0); if (ret == MAP_FAILED) return ret; } - if (addr != 0 && ret != (void *)addr) { + if (addr != 0 && ret != (void *)(uintptr_t)addr) { SysMessage("psxMap: warning: wanted to map @%08x, got %p\n", addr, ret); @@ -86,14 +79,14 @@ retry: return MAP_FAILED; } - if (((addr ^ (unsigned long)ret) & ~0xff000000l) && try_ < 2) + if (((addr ^ (unsigned long)(uintptr_t)ret) & ~0xff000000l) && try_ < 2) { psxUnmap(ret, size, tag); // try to use similarly aligned memory instead // (recompiler needs this) mask = try_ ? 0xffff : 0xffffff; - addr = ((unsigned long)ret + mask) & ~mask; + addr = ((uintptr_t)ret + mask) & ~mask; try_++; goto retry; } @@ -147,14 +140,20 @@ static int psxMemInitMap(void) psxM = psxMap(0x77000000, 0x00210000, 0, MAP_TAG_RAM); if (psxM == MAP_FAILED) { SysMessage(_("mapping main RAM failed")); + psxM = NULL; return -1; } - psxP = &psxM[0x200000]; + psxH = psxMap(0x1f800000, 0x10000, 0, MAP_TAG_OTHER); - psxR = psxMap(0x1fc00000, 0x80000, 0, MAP_TAG_OTHER); + if (psxH == MAP_FAILED) { + SysMessage(_("Error allocating memory!")); + psxMemShutdown(); + return -1; + } - if (psxR == MAP_FAILED || psxH == MAP_FAILED) { + psxR = psxMap(0x1fc00000, 0x80000, 0, MAP_TAG_OTHER); + if (psxR == MAP_FAILED) { SysMessage(_("Error allocating memory!")); psxMemShutdown(); return -1; @@ -165,9 +164,11 @@ static int psxMemInitMap(void) static void psxMemFreeMap(void) { - psxUnmap(psxM, 0x00210000, MAP_TAG_RAM); psxM = NULL; - psxUnmap(psxH, 0x10000, MAP_TAG_OTHER); psxH = NULL; - psxUnmap(psxR, 0x80000, MAP_TAG_OTHER); psxR = NULL; + if (psxM) psxUnmap(psxM, 0x00210000, MAP_TAG_RAM); + if (psxH) psxUnmap(psxH, 0x10000, MAP_TAG_OTHER); + if (psxR) psxUnmap(psxR, 0x80000, MAP_TAG_OTHER); + psxM = psxH = psxR = NULL; + psxP = NULL; } int psxMemInit(void) @@ -194,8 +195,8 @@ int psxMemInit(void) return -1; } - memset(psxMemRLUT, 0xff, 0x10000 * sizeof(void *)); - memset(psxMemWLUT, 0xff, 0x10000 * sizeof(void *)); + memset(psxMemRLUT, (uintptr_t)INVALID_PTR, 0x10000 * sizeof(void *)); + memset(psxMemWLUT, (uintptr_t)INVALID_PTR, 0x10000 * sizeof(void *)); // MemR for (i = 0; i < 0x80; i++) psxMemRLUT[i + 0x0000] = (u8 *)&psxM[(i & 0x1f) << 16]; @@ -264,6 +265,8 @@ void psxMemShutdown() { free(psxMemWLUT); psxMemWLUT = NULL; } +static int writeok = 1; + u8 psxMemRead8(u32 mem) { char *p; u32 t; @@ -430,9 +433,9 @@ void psxMemWrite32(u32 mem, u32 value) { case 0x800: case 0x804: if (writeok == 0) break; writeok = 0; - memset(psxMemWLUT + 0x0000, 0xff, 0x80 * sizeof(void *)); - memset(psxMemWLUT + 0x8000, 0xff, 0x80 * sizeof(void *)); - memset(psxMemWLUT + 0xa000, 0xff, 0x80 * sizeof(void *)); + memset(psxMemWLUT + 0x0000, (uintptr_t)INVALID_PTR, 0x80 * sizeof(void *)); + memset(psxMemWLUT + 0x8000, (uintptr_t)INVALID_PTR, 0x80 * sizeof(void *)); + memset(psxMemWLUT + 0xa000, (uintptr_t)INVALID_PTR, 0x80 * sizeof(void *)); /* Required for icache interpreter otherwise Armored Core won't boot on icache interpreter */ psxCpu->Notify(R3000ACPU_NOTIFY_CACHE_ISOLATED, NULL); break;