From d3ecdd353414c4fce283227d7b9831f24bf7cc47 Mon Sep 17 00:00:00 2001 From: Alcaro Date: Wed, 28 May 2014 20:02:49 +0200 Subject: [PATCH] Fix rather creepy crash. Merge those 64 mappings into one. --- libretro/libretro.cpp | 9 +- memmap.cpp | 192 +++++++++++++++++++++++++----------------- memmap.h | 12 +-- 3 files changed, 128 insertions(+), 85 deletions(-) diff --git a/libretro/libretro.cpp b/libretro/libretro.cpp index 7d4bfa56..6a79b8cd 100644 --- a/libretro/libretro.cpp +++ b/libretro/libretro.cpp @@ -320,12 +320,13 @@ void retro_cheat_set(unsigned index, bool enabled, const char *code) S9xApplyCheats(); } -static struct retro_memory_descriptor memorydesc[64]; +#define MAX_MAPS 256 +static struct retro_memory_descriptor memorydesc[MAX_MAPS]; static unsigned memorydesc_c; void S9xAppendMapping(struct retro_memory_descriptor * desc) { //do it backwards - snes9x defines the last one to win, while we define the first one to win - memcpy(&memorydesc[64 - (++memorydesc_c)], desc, sizeof(struct retro_memory_descriptor)); + memcpy(&memorydesc[MAX_MAPS - (++memorydesc_c)], desc, sizeof(struct retro_memory_descriptor)); } bool retro_load_game(const struct retro_game_info *game) @@ -340,7 +341,7 @@ bool retro_load_game(const struct retro_game_info *game) if (!rom_loaded && log_cb) log_cb(RETRO_LOG_ERROR, "[libretro]: Rom loading failed...\n"); - struct retro_memory_map map={ memorydesc+64-memorydesc_c, memorydesc_c }; + struct retro_memory_map map={ memorydesc+MAX_MAPS-memorydesc_c, memorydesc_c }; if (rom_loaded) environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &map); return rom_loaded; @@ -396,7 +397,7 @@ bool retro_load_game_special(unsigned game_type, break; } - struct retro_memory_map map={ memorydesc+64-memorydesc_c, memorydesc_c }; + struct retro_memory_map map={ memorydesc+MAX_MAPS-memorydesc_c, memorydesc_c }; if (rom_loaded) environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &map); return rom_loaded; diff --git a/memmap.cpp b/memmap.cpp index 96e9fdfe..d853d934 100644 --- a/memmap.cpp +++ b/memmap.cpp @@ -2763,7 +2763,7 @@ uint32 CMemory::map_mirror (uint32 size, uint32 pos) return (mask + map_mirror(size - mask, pos - mask)); } -void CMemory::map_lorom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size) +void CMemory::map_lorom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size, bool auto_export_map) { uint32 c, i, p, addr; @@ -2780,18 +2780,21 @@ void CMemory::map_lorom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 add } #ifdef __LIBRETRO__ - struct retro_memory_descriptor desc = {0}; - desc.flags=RETRO_MEMDESC_CONST; - desc.ptr=ROM; - desc.start=bank_s<<16 | addr_s; - desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; - desc.disconnect=0x8000; - desc.len=size; - S9xAppendMapping(&desc); + if (auto_export_map) + { + struct retro_memory_descriptor desc = {0}; + desc.flags=RETRO_MEMDESC_CONST; + desc.ptr=ROM; + desc.start=bank_s<<16 | addr_s; + desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; + desc.disconnect=0x8000; + desc.len=size; + S9xAppendMapping(&desc); + } #endif } -void CMemory::map_hirom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size) +void CMemory::map_hirom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size, bool auto_export_map) { uint32 c, i, p, addr; @@ -2808,17 +2811,20 @@ void CMemory::map_hirom (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 add } #ifdef __LIBRETRO__ - struct retro_memory_descriptor desc = {0}; - desc.flags=RETRO_MEMDESC_CONST; - desc.ptr=ROM; - desc.start=bank_s<<16 | addr_s; - desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; - desc.len=size; - S9xAppendMapping(&desc); + if (auto_export_map) + { + struct retro_memory_descriptor desc = {0}; + desc.flags=RETRO_MEMDESC_CONST; + desc.ptr=ROM; + desc.start=bank_s<<16 | addr_s; + desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; + desc.len=size; + S9xAppendMapping(&desc); + } #endif } -void CMemory::map_lorom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size, uint32 offset) +void CMemory::map_lorom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size, uint32 offset, bool auto_export_map) { uint32 c, i, p, addr; @@ -2835,19 +2841,22 @@ void CMemory::map_lorom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uin } #ifdef __LIBRETRO__ - struct retro_memory_descriptor desc = {0}; - desc.flags=RETRO_MEMDESC_CONST; - desc.ptr=ROM; - desc.offset=offset; - desc.start=bank_s<<16 | addr_s; - desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; - desc.disconnect=0x8000; - desc.len=size; - S9xAppendMapping(&desc); + if (auto_export_map) + { + struct retro_memory_descriptor desc = {0}; + desc.flags=RETRO_MEMDESC_CONST; + desc.ptr=ROM; + desc.offset=offset; + desc.start=bank_s<<16 | addr_s; + desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; + desc.disconnect=0x8000; + desc.len=size; + S9xAppendMapping(&desc); + } #endif } -void CMemory::map_hirom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size, uint32 offset) +void CMemory::map_hirom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint32 size, uint32 offset, bool auto_export_map) { uint32 c, i, p, addr; @@ -2863,18 +2872,21 @@ void CMemory::map_hirom_offset (uint32 bank_s, uint32 bank_e, uint32 addr_s, uin } } #ifdef __LIBRETRO__ - struct retro_memory_descriptor desc = {0}; - desc.flags=RETRO_MEMDESC_CONST; - desc.ptr=ROM; - desc.offset=offset; - desc.start=bank_s<<16 | addr_s; - desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; - desc.len=size; - S9xAppendMapping(&desc); + if (auto_export_map) + { + struct retro_memory_descriptor desc = {0}; + desc.flags=RETRO_MEMDESC_CONST; + desc.ptr=ROM; + desc.offset=offset; + desc.start=bank_s<<16 | addr_s; + desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; + desc.len=size; + S9xAppendMapping(&desc); + } #endif } -void CMemory::map_space (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint8 *data) +void CMemory::map_space (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, uint8 *data, bool auto_export_map) { uint32 c, i, p; @@ -2889,15 +2901,18 @@ void CMemory::map_space (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 add } } #ifdef __LIBRETRO__ - struct retro_memory_descriptor desc = {0}; - desc.ptr=data; - desc.start=bank_s<<16 | addr_s; - desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; - S9xAppendMapping(&desc); + if (auto_export_map) + { + struct retro_memory_descriptor desc = {0}; + desc.ptr=data; + desc.start=bank_s<<16 | addr_s; + desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; + S9xAppendMapping(&desc); + } #endif } -void CMemory::map_index (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, int index, int type) +void CMemory::map_index (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 addr_e, int index, int type, bool auto_export_map) { uint32 c, i, p; bool8 isROM, isRAM; @@ -2916,35 +2931,38 @@ void CMemory::map_index (uint32 bank_s, uint32 bank_e, uint32 addr_s, uint32 add } } #ifdef __LIBRETRO__ - struct retro_memory_descriptor desc = {0}; - desc.start=bank_s<<16 | addr_s; - desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; - if (type==MAP_LOROM_SRAM || type==MAP_SA1RAM) + if (auto_export_map) { - desc.ptr=Memory.SRAM; - desc.disconnect=0x8000; - desc.len=Memory.SRAMMask+1; - S9xAppendMapping(&desc); - } - if (type==MAP_LOROM_SRAM_B) - { - desc.ptr=Multi.sramB; - desc.disconnect=0x8000; - desc.len=Multi.sramMaskB+1; - S9xAppendMapping(&desc); - } - if (type==MAP_HIROM_SRAM || type==MAP_RONLY_SRAM) - { - desc.ptr=Memory.SRAM; - desc.disconnect=0x00E000; - desc.len=Memory.SRAMMask+1; - S9xAppendMapping(&desc); - } - if (type==MAP_BWRAM) - { - desc.ptr=Memory.BWRAM; - desc.disconnect=0xFFE000; - S9xAppendMapping(&desc); + struct retro_memory_descriptor desc = {0}; + desc.start=bank_s<<16 | addr_s; + desc.select=(bank_s<<16 | addr_s) ^ (bank_e<<16 | addr_e) ^ 0xFFFFFF; + if (type==MAP_LOROM_SRAM || type==MAP_SA1RAM) + { + desc.ptr=Memory.SRAM; + desc.disconnect=0x8000; + desc.len=Memory.SRAMMask+1; + S9xAppendMapping(&desc); + } + if (type==MAP_LOROM_SRAM_B) + { + desc.ptr=Multi.sramB; + desc.disconnect=0x8000; + desc.len=Multi.sramMaskB+1; + S9xAppendMapping(&desc); + } + if (type==MAP_HIROM_SRAM || type==MAP_RONLY_SRAM) + { + desc.ptr=Memory.SRAM; + desc.disconnect=0x00E000; + desc.len=Memory.SRAMMask+1; + S9xAppendMapping(&desc); + } + if (type==MAP_BWRAM) + { + desc.ptr=Memory.BWRAM; + desc.disconnect=0xFFE000; + S9xAppendMapping(&desc); + } } #endif } @@ -3303,7 +3321,19 @@ void CMemory::Map_SA1LoROMMap (void) map_index(0x80, 0xbf, 0x6000, 0x7fff, MAP_BWRAM, MAP_TYPE_I_O); for (int c = 0x40; c < 0x80; c++) - map_space(c, c, 0x0000, 0xffff, SRAM + (c & 1) * 0x10000); + map_space(c, c, 0x0000, 0xffff, SRAM + (c & 1) * 0x10000, false); + +#ifdef __LIBRETRO__ + if (auto_export_map) + { + struct retro_memory_descriptor desc = {0}; + desc.ptr=SRAM; + desc.start=0x400000; + desc.select=0xC00000; + desc.disconnect=0xFE0000; + S9xAppendMapping(&desc); + } +#endif map_WRAM(); @@ -3339,13 +3369,25 @@ void CMemory::Map_GNEXTSA1LoROMMap (void) map_hirom_offset(0xc0, 0xff, 0x0000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); - map_space(0x00, 0x3f, 0x3000, 0x3fff, FillRAM); map_space(0x80, 0xbf, 0x3000, 0x3fff, FillRAM); - map_index(0x00, 0x3f, 0x6000, 0x7fff, MAP_BWRAM, MAP_TYPE_I_O); + map_space(0x00, 0x3f, 0x3000, 0x3fff, FillRAM); map_index(0x80, 0xbf, 0x6000, 0x7fff, MAP_BWRAM, MAP_TYPE_I_O); + map_index(0x00, 0x3f, 0x6000, 0x7fff, MAP_BWRAM, MAP_TYPE_I_O); for (int c = 0x40; c < 0x80; c++) - map_space(c, c, 0x0000, 0xffff, SRAM + (c & 1) * 0x10000); + map_space(c, c, 0x0000, 0xffff, SRAM + (c & 1) * 0x10000, false); + +#ifdef __LIBRETRO__ + if (auto_export_map) + { + struct retro_memory_descriptor desc = {0}; + desc.ptr=SRAM; + desc.start=0x400000; + desc.select=0xC00000; + desc.disconnect=0xFE0000; + S9xAppendMapping(&desc); + } +#endif // FIXME: untested! map_hirom_offset(0x70, 0x7f, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); diff --git a/memmap.h b/memmap.h index 0f943542..0ca1245d 100644 --- a/memmap.h +++ b/memmap.h @@ -295,12 +295,12 @@ struct CMemory void InitROM (void); uint32 map_mirror (uint32, uint32); - void map_lorom (uint32, uint32, uint32, uint32, uint32); - void map_hirom (uint32, uint32, uint32, uint32, uint32); - void map_lorom_offset (uint32, uint32, uint32, uint32, uint32, uint32); - void map_hirom_offset (uint32, uint32, uint32, uint32, uint32, uint32); - void map_space (uint32, uint32, uint32, uint32, uint8 *); - void map_index (uint32, uint32, uint32, uint32, int, int); + void map_lorom (uint32, uint32, uint32, uint32, uint32, bool = true); + void map_hirom (uint32, uint32, uint32, uint32, uint32, bool = true); + void map_lorom_offset (uint32, uint32, uint32, uint32, uint32, uint32, bool = true); + void map_hirom_offset (uint32, uint32, uint32, uint32, uint32, uint32, bool = true); + void map_space (uint32, uint32, uint32, uint32, uint8 *, bool = true); + void map_index (uint32, uint32, uint32, uint32, int, int, bool = true); void map_System (void); void map_WRAM (void); void map_LoROMSRAM (void);