3rdParty: update rom size patch for mupen64plus-core

This commit is contained in:
Rosalie Wanders
2025-03-23 13:14:24 +01:00
parent 3e0efac610
commit b39357efda
5 changed files with 48 additions and 8 deletions
+3
View File
@@ -131,6 +131,9 @@ EXPORT m64p_error CALL CoreShutdown(void)
release_mem_base(g_mem_base);
g_mem_base = NULL;
/* deallocate rom memory */
release_mem_rom();
l_CoreInit = 0;
return M64ERR_SUCCESS;
}
+1 -1
View File
@@ -58,7 +58,7 @@ static void get_pi_dma_handler(struct cart* cart, struct dd_controller* dd, uint
if (address >= MM_CART_ROM) {
if (address >= MM_CART_DOM3) {
/* 0x1fd00000 - 0xffffffff : dom3 addr2, cart rom */
/* 0x1fd00000 - 0x7fffffff : dom3 addr2, cart rom */
RW(cart, cart_dom3);
}
else {
+38 -7
View File
@@ -222,12 +222,11 @@ enum { MB_RDRAM_DRAM_ALIGNMENT_REQUIREMENT = 64 * 1024 };
enum {
MB_RDRAM_DRAM = 0,
MB_CART_ROM = MB_RDRAM_DRAM + RDRAM_MAX_SIZE,
MB_RSP_MEM = MB_CART_ROM + CART_ROM_MAX_SIZE,
MB_RSP_MEM = MB_RDRAM_DRAM + RDRAM_MAX_SIZE,
MB_DD_ROM = MB_RSP_MEM + SP_MEM_SIZE,
MB_PIF_MEM = MB_DD_ROM + DD_ROM_MAX_SIZE,
MB_MAX_SIZE = MB_PIF_MEM + PIF_ROM_SIZE + PIF_RAM_SIZE,
MB_MAX_SIZE_FULL = 0x120000000,
MB_MAX_SIZE_FULL = 0x20000000
};
/* Use LSB of mem_base pointer to encode mem_base mode
@@ -237,6 +236,9 @@ enum {
#define MEM_BASE_PTR(mem_base) ((void*)((uintptr_t)(mem_base) & ~0x1))
#define SET_MEM_BASE_MODE(mem_base) (mem_base = (void*)((uintptr_t)(mem_base) | 0x1))
static void* mem_rom = NULL;
static uint32_t mem_rom_size = 0;
void* init_mem_base(void)
{
void* mem_base;
@@ -277,13 +279,42 @@ void release_mem_base(void* mem_base)
free(MEM_BASE_PTR(mem_base));
}
void* init_mem_rom(uint32_t size)
{
if (size > mem_rom_size) {
mem_rom = realloc(mem_rom, size);
if (mem_rom == NULL)
mem_rom_size = 0;
else
mem_rom_size = size;
}
return mem_rom;
}
void release_mem_rom(void)
{
if (mem_rom != NULL) {
free(mem_rom);
mem_rom = NULL;
}
mem_rom_size = 0;
}
uint32_t* mem_base_u32(void* mem_base, uint32_t address)
{
uint32_t* mem;
if (MEM_BASE_MODE(mem_base) == 0) {
/* In full mem base mode, use simple pointer arithmetic */
mem = (uint32_t*)((uint8_t*)mem_base + address);
/* In full mem base mode, use simple pointer arithmetic
* except for the rom, which is dynamically allocated
*/
if (address >= MM_CART_ROM && (address & UINT32_C(0xfff00000)) != MM_PIF_MEM) {
mem = (uint32_t*)((uint8_t*)mem_rom + (address - MM_CART_ROM));
} else {
mem = (uint32_t*)((uint8_t*)mem_base + address);
}
}
else {
/* In compressed mem base mode, select appropriate mem_base offset */
@@ -296,10 +327,10 @@ uint32_t* mem_base_u32(void* mem_base, uint32_t address)
if ((address & UINT32_C(0xfff00000)) == MM_PIF_MEM) {
mem = (uint32_t*)((uint8_t*)mem_base + (address - MM_PIF_MEM + MB_PIF_MEM));
} else {
mem = (uint32_t*)((uint8_t*)mem_base + (address - MM_CART_ROM + MB_CART_ROM));
mem = (uint32_t*)((uint8_t*)mem_rom + (address - MM_CART_ROM));
}
}
else if ((address & UINT32_C(0xfe000000)) == MM_DD_ROM) {
else if ((address & UINT32_C(0xfe000000)) == MM_DD_ROM) {
mem = (uint32_t*)((uint8_t*)mem_base + (address - MM_DD_ROM + MB_DD_ROM));
}
else if ((address & UINT32_C(0xffffe000)) == MM_RSP_MEM) {
@@ -91,6 +91,8 @@ void apply_mem_mapping(struct memory* mem, const struct mem_mapping* mapping);
void* init_mem_base(void);
void release_mem_base(void* mem_base);
void* init_mem_rom(uint32_t size);
void release_mem_rom(void);
uint32_t* mem_base_u32(void* mem_base, uint32_t address);
void read_with_bp_checks(void* opaque, uint32_t address, uint32_t* value);
+4
View File
@@ -152,6 +152,10 @@ m64p_error open_rom(const unsigned char* romimage, unsigned int size)
return M64ERR_INPUT_INVALID;
}
/* ensure mem_base has enough memory allocated */
if (init_mem_rom(size) == NULL)
return M64ERR_NO_MEMORY;
/* Clear Byte-swapped flag, since ROM is now deleted. */
g_RomWordsLittleEndian = 0;
/* allocate new buffer for ROM and copy into this buffer */