mirror of https://github.com/snes9xgit/snes9x.git
Fix rather creepy crash. Merge those 64 mappings into one.
This commit is contained in:
parent
73a4e459d1
commit
d3ecdd3534
|
@ -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;
|
||||
|
|
192
memmap.cpp
192
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);
|
||||
|
|
12
memmap.h
12
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);
|
||||
|
|
Loading…
Reference in New Issue