[BS-X] Rename and proper SA-1 Memory Pack mapping

This commit is contained in:
luigiblood 2016-11-23 21:27:18 +01:00
parent 8073df6432
commit 1b6f6b6926
3 changed files with 53 additions and 46 deletions

View File

@ -943,9 +943,9 @@ static void S9xDeinterleaveGD24 (int, uint8 *);
static bool8 allASCII (uint8 *, int); static bool8 allASCII (uint8 *, int);
static bool8 is_SufamiTurbo_BIOS (const uint8 *, uint32); static bool8 is_SufamiTurbo_BIOS (const uint8 *, uint32);
static bool8 is_SufamiTurbo_Cart (const uint8 *, uint32); static bool8 is_SufamiTurbo_Cart (const uint8 *, uint32);
static bool8 is_SameGame_BIOS (const uint8 *, uint32); static bool8 is_BSCart_BIOS (const uint8 *, uint32);
static bool8 is_SameGame_Add_On (const uint8 *, uint32); static bool8 is_SameGame_Add_On (const uint8 *, uint32);
static bool8 is_GNEXT_BIOS (const uint8 *, uint32); static bool8 is_BSCartSA1_BIOS(const uint8 *, uint32);
static bool8 is_GNEXT_Add_On (const uint8 *, uint32); static bool8 is_GNEXT_Add_On (const uint8 *, uint32);
static uint32 caCRC32 (uint8 *, uint32, uint32 crc32 = 0xffffffff); static uint32 caCRC32 (uint8 *, uint32, uint32 crc32 = 0xffffffff);
static uint32 ReadUPSPointer (const uint8 *, unsigned &, unsigned); static uint32 ReadUPSPointer (const uint8 *, unsigned &, unsigned);
@ -1229,7 +1229,7 @@ static bool8 is_SufamiTurbo_Cart (const uint8 *data, uint32 size)
return (FALSE); return (FALSE);
} }
static bool8 is_SameGame_BIOS (const uint8 *data, uint32 size) static bool8 is_BSCart_BIOS(const uint8 *data, uint32 size)
{ {
if ((data[0x7FB2] == 0x5A) && (data[0x7FB5] != 0x20) && (data[0x7FDA] == 0x33)) if ((data[0x7FB2] == 0x5A) && (data[0x7FB5] != 0x20) && (data[0x7FDA] == 0x33))
{ {
@ -1257,9 +1257,14 @@ static bool8 is_SameGame_Add_On (const uint8 *data, uint32 size)
return (FALSE); return (FALSE);
} }
static bool8 is_GNEXT_BIOS (const uint8 *data, uint32 size) static bool8 is_BSCartSA1_BIOS (const uint8 *data, uint32 size)
{ {
if (size == 0x180000 && strncmp((char *) (data + 0x7fc0), "SFC SDGUNDAMGNEXT", 17) == 0) //Same basic check as BSCart
if (!is_BSCart_BIOS(data, size))
return (FALSE);
//Checks if the game is Itoi's Bass Fishing No. 1 (ZBPJ) or SD Gundam G-NEXT (ZX3J)
if (strncmp((char *)(data + 0x7fb2), "ZBPJ", 4) == 0 || strncmp((char *)(data + 0x7fb2), "ZX3J", 4) == 0)
return (TRUE); return (TRUE);
else else
return (FALSE); return (FALSE);
@ -1864,11 +1869,11 @@ bool8 CMemory::LoadMultiCartInt ()
if (is_SufamiTurbo_Cart(ROM + Multi.cartOffsetA, Multi.cartSizeA)) if (is_SufamiTurbo_Cart(ROM + Multi.cartOffsetA, Multi.cartSizeA))
Multi.cartType = 4; Multi.cartType = 4;
else else
if (is_SameGame_BIOS(ROM + Multi.cartOffsetA, Multi.cartSizeA)) if (is_BSCartSA1_BIOS(ROM + Multi.cartOffsetA, Multi.cartSizeA))
Multi.cartType = 3;
else
if (is_GNEXT_BIOS(ROM + Multi.cartOffsetA, Multi.cartSizeA))
Multi.cartType = 5; Multi.cartType = 5;
else
if (is_BSCart_BIOS(ROM + Multi.cartOffsetA, Multi.cartSizeA))
Multi.cartType = 3;
} }
else else
if (Multi.cartSizeB) if (Multi.cartSizeB)
@ -1916,11 +1921,8 @@ bool8 CMemory::LoadMultiCartInt ()
break; break;
case 3: case 3:
r = LoadSameGame();
break;
case 5: case 5:
r = LoadGNEXT(); r = LoadBSCart();
break; break;
default: default:
@ -1984,7 +1986,7 @@ bool8 CMemory::LoadSufamiTurbo ()
return (TRUE); return (TRUE);
} }
bool8 CMemory::LoadSameGame () bool8 CMemory::LoadBSCart ()
{ {
Multi.sramA = SRAM; Multi.sramA = SRAM;
Multi.sramB = NULL; Multi.sramB = NULL;
@ -2568,7 +2570,7 @@ void CMemory::InitROM (void)
if (Settings.SA1) if (Settings.SA1)
{ {
if (Multi.cartType == 5) if (Multi.cartType == 5)
Map_GNEXTSA1LoROMMap(); Map_BSSA1LoROMMap();
else else
Map_SA1LoROMMap(); Map_SA1LoROMMap();
} }
@ -3260,9 +3262,9 @@ void CMemory::Map_SA1LoROMMap (void)
BWRAM = SRAM; BWRAM = SRAM;
} }
void CMemory::Map_GNEXTSA1LoROMMap (void) void CMemory::Map_BSSA1LoROMMap(void)
{ {
printf("Map_GNEXTSA1LoROMMap\n"); printf("Map_BSSA1LoROMMap\n");
map_System(); map_System();
map_lorom_offset(0x00, 0x3f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA); map_lorom_offset(0x00, 0x3f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA);
@ -3278,9 +3280,6 @@ void CMemory::Map_GNEXTSA1LoROMMap (void)
for (int c = 0x40; c < 0x80; c++) 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);
// FIXME: untested!
map_hirom_offset(0x70, 0x7f, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB);
map_WRAM(); map_WRAM();
map_WriteProtectROM(); map_WriteProtectROM();
@ -3340,26 +3339,6 @@ void CMemory::Map_ExtendedHiROMMap (void)
map_WriteProtectROM(); map_WriteProtectROM();
} }
void CMemory::Map_SameGameHiROMMap (void)
{
printf("Map_SameGameHiROMMap\n");
map_System();
map_hirom_offset(0x00, 0x1f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA);
map_hirom_offset(0x20, 0x3f, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB);
map_hirom_offset(0x40, 0x5f, 0x0000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA);
map_hirom_offset(0x60, 0x7f, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB);
map_hirom_offset(0x80, 0x9f, 0x8000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA);
map_hirom_offset(0xa0, 0xbf, 0x8000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB);
map_hirom_offset(0xc0, 0xdf, 0x0000, 0xffff, Multi.cartSizeA, Multi.cartOffsetA);
map_hirom_offset(0xe0, 0xff, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB);
map_HiROMSRAM();
map_WRAM();
map_WriteProtectROM();
}
void CMemory::Map_SPC7110HiROMMap (void) void CMemory::Map_SPC7110HiROMMap (void)
{ {
printf("Map_SPC7110HiROMMap\n"); printf("Map_SPC7110HiROMMap\n");
@ -3433,7 +3412,9 @@ void CMemory::Map_BSCartHiROMMap(void)
map_hirom_offset(0xe0, 0xff, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB); map_hirom_offset(0xe0, 0xff, 0x0000, 0xffff, Multi.cartSizeB, Multi.cartOffsetB);
} }
else else
{
map_index(0xe0, 0xff, 0x0000, 0xffff, MAP_BSX, MAP_TYPE_RAM); map_index(0xe0, 0xff, 0x0000, 0xffff, MAP_BSX, MAP_TYPE_RAM);
}
map_HiROMSRAM(); map_HiROMSRAM();
map_WRAM(); map_WRAM();

View File

@ -284,7 +284,7 @@ struct CMemory
bool8 LoadMultiCart (const char *, const char *); bool8 LoadMultiCart (const char *, const char *);
bool8 LoadMultiCartInt (); bool8 LoadMultiCartInt ();
bool8 LoadSufamiTurbo (); bool8 LoadSufamiTurbo ();
bool8 LoadSameGame (); bool8 LoadBSCart ();
bool8 LoadGNEXT (); bool8 LoadGNEXT ();
bool8 LoadSRAM (const char *); bool8 LoadSRAM (const char *);
bool8 SaveSRAM (const char *); bool8 SaveSRAM (const char *);
@ -326,10 +326,9 @@ struct CMemory
void Map_SetaDSPLoROMMap (void); void Map_SetaDSPLoROMMap (void);
void Map_SDD1LoROMMap (void); void Map_SDD1LoROMMap (void);
void Map_SA1LoROMMap (void); void Map_SA1LoROMMap (void);
void Map_GNEXTSA1LoROMMap (void); void Map_BSSA1LoROMMap (void);
void Map_HiROMMap (void); void Map_HiROMMap (void);
void Map_ExtendedHiROMMap (void); void Map_ExtendedHiROMMap (void);
void Map_SameGameHiROMMap (void);
void Map_SPC7110HiROMMap (void); void Map_SPC7110HiROMMap (void);
void Map_BSCartLoROMMap(uint8); void Map_BSCartLoROMMap(uint8);
void Map_BSCartHiROMMap(void); void Map_BSCartHiROMMap(void);

33
sa1.cpp
View File

@ -304,7 +304,16 @@ static void S9xSetSA1MemMap (uint32 which1, uint8 map)
for (int c = 0; c < 0x100; c += 16) for (int c = 0; c < 0x100; c += 16)
{ {
uint8 *block = &Memory.ROM[(map & 7) * 0x100000 + (c << 12)]; uint8 *block;
if (Multi.cartType != 5)
block = &Memory.ROM[(map & 7) * 0x100000 + (c << 12)];
else
{
if ((map & 7) < 4)
block = Memory.ROM + Multi.cartOffsetA + ((map & 7) * 0x100000 + (c << 12));
else
block = Memory.ROM + Multi.cartOffsetB + (((map & 7) - 4) * 0x100000 + (c << 12));
}
for (int i = c; i < c + 16; i++) for (int i = c; i < c + 16; i++)
Memory.Map[start + i] = SA1.Map[start + i] = block; Memory.Map[start + i] = SA1.Map[start + i] = block;
} }
@ -312,8 +321,26 @@ static void S9xSetSA1MemMap (uint32 which1, uint8 map)
for (int c = 0; c < 0x200; c += 16) for (int c = 0; c < 0x200; c += 16)
{ {
// conversion to int is needed here - map is promoted but which1 is not // conversion to int is needed here - map is promoted but which1 is not
int32 offset = (((map & 0x80) ? map : which1) & 7) * 0x100000 + (c << 11) - 0x8000; int32 offset;
uint8 *block = &Memory.ROM[offset]; uint8 *block;
if (Multi.cartType != 5)
{
offset = (((map & 0x80) ? map : which1) & 7) * 0x100000 + (c << 11) - 0x8000;
block = &Memory.ROM[offset];
}
else
{
if ((map & 7) < 4)
{
offset = (((map & 0x80) ? map : which1) & 7) * 0x100000 + (c << 11) - 0x8000;
block = Memory.ROM + Multi.cartOffsetA + offset;
}
else
{
offset = ((((map & 0x80) ? map : which1) & 7) - 4) * 0x100000 + (c << 11) - 0x8000;
block = Memory.ROM + Multi.cartOffsetB + offset;
}
}
for (int i = c + 8; i < c + 16; i++) for (int i = c + 8; i < c + 16; i++)
Memory.Map[start2 + i] = SA1.Map[start2 + i] = block; Memory.Map[start2 + i] = SA1.Map[start2 + i] = block;
} }