summaryrefslogtreecommitdiffstats
path: root/src/mess/machine/md_slot.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/machine/md_slot.c')
-rw-r--r--src/mess/machine/md_slot.c289
1 files changed, 144 insertions, 145 deletions
diff --git a/src/mess/machine/md_slot.c b/src/mess/machine/md_slot.c
index 2ab615dddd5..27a59038426 100644
--- a/src/mess/machine/md_slot.c
+++ b/src/mess/machine/md_slot.c
@@ -1,43 +1,43 @@
/***********************************************************************************************************
-
+
MegaDrive cart emulation
(through slot devices)
The driver exposes address ranges
- 0x000000-0x7fffff to read/write (typically cart data, possibly banked, and some protection)
- 0x130000-0x1300ff to read_a13/write_a13 (typically SRAM toggling or protection)
- 0x150000-0x1500ff to read_a15/write_a15 (for SVP registers, not converted yet to slots)
-
+ 0x000000-0x7fffff to read/write (typically cart data, possibly banked, and some protection)
+ 0x130000-0x1300ff to read_a13/write_a13 (typically SRAM toggling or protection)
+ 0x150000-0x1500ff to read_a15/write_a15 (for SVP registers, not converted yet to slots)
+
currently available slot devices:
md_rom: standard carts + carts with NVRAM (SRAM/FRAM) + pirate carts with protection & bankswitch
md_eeprom: carts + I2C EEPROM (EEPROM device hooked up only, support to be completed)
- md_jcart: Codemasters J-Cart & J-Cart+SEPROM (again, EEPROM device hooked up only, support to be completed)
- md_sk: Sonic & Knuckles pass-thorugh cart (enables a second slot to mount any other cart)
- md_stm95: cart + STM95 EEPROM (e.g. Pier Solar)
-
-
- Cart Mirroring (based Eke's research)
-
- MD Cartridge area is mapped to $000000-$3fffff: when accessing ROM, 68k address lines A1 to A21 can be
- used by the internal cartridge hardware to decode full 4MB address range.
- Depending on ROM total size and additional decoding hardware, some address lines might be ignored,
- resulting in ROM mirroring.
-
- Cartridges typically use either 8-bits (x2) or 16-bits (x1, x2) Mask ROM chips, each chip size is a
- factor of 2 bytes.
- When one chip ROM1 of size 2^N is present, it is generally mirrored each 2^N bytes so that read access
- to cart area sees the sequence ROM1,ROM1,ROM1,... (up to 4MB)
- When two chips ROM1 & ROM2 are present and the whole size is 2^N, then the block ROM1+ROM2 is mirrored
- in the cart area, and reads see the sequence ROM1+ROM2,ROM1+ROM2,... (up to 4MB)
- When two chips ROM1 & ROM2 are present and the whole size is not 2^N (e.g. because ROM1 and ROM2 have
- different sizes), then the area between the end of ROM2 and next power 2^N is generally ignored, and
- reads see the sequence ROM1,ROM2,XXXX,ROM1,ROM2,XXXX... (up to 4MB)
-
- At loading time we first compute first power 2^N larger than cart size (see get_padded_size function),
- we allocate such a size for ROM and we fill of 0xff the area between end of dump and 2^N.
- Then we handle mirroring by creating a rom_bank_map[] (see rom_map_setup function) which points each
- access in 0x000000-0x400000 to the correct 64K ROM bank.
+ md_jcart: Codemasters J-Cart & J-Cart+SEPROM (again, EEPROM device hooked up only, support to be completed)
+ md_sk: Sonic & Knuckles pass-thorugh cart (enables a second slot to mount any other cart)
+ md_stm95: cart + STM95 EEPROM (e.g. Pier Solar)
+
+
+ Cart Mirroring (based Eke's research)
+
+ MD Cartridge area is mapped to $000000-$3fffff: when accessing ROM, 68k address lines A1 to A21 can be
+ used by the internal cartridge hardware to decode full 4MB address range.
+ Depending on ROM total size and additional decoding hardware, some address lines might be ignored,
+ resulting in ROM mirroring.
+
+ Cartridges typically use either 8-bits (x2) or 16-bits (x1, x2) Mask ROM chips, each chip size is a
+ factor of 2 bytes.
+ When one chip ROM1 of size 2^N is present, it is generally mirrored each 2^N bytes so that read access
+ to cart area sees the sequence ROM1,ROM1,ROM1,... (up to 4MB)
+ When two chips ROM1 & ROM2 are present and the whole size is 2^N, then the block ROM1+ROM2 is mirrored
+ in the cart area, and reads see the sequence ROM1+ROM2,ROM1+ROM2,... (up to 4MB)
+ When two chips ROM1 & ROM2 are present and the whole size is not 2^N (e.g. because ROM1 and ROM2 have
+ different sizes), then the area between the end of ROM2 and next power 2^N is generally ignored, and
+ reads see the sequence ROM1,ROM2,XXXX,ROM1,ROM2,XXXX... (up to 4MB)
+
+ At loading time we first compute first power 2^N larger than cart size (see get_padded_size function),
+ we allocate such a size for ROM and we fill of 0xff the area between end of dump and 2^N.
+ Then we handle mirroring by creating a rom_bank_map[] (see rom_map_setup function) which points each
+ access in 0x000000-0x400000 to the correct 64K ROM bank.
***********************************************************************************************************/
@@ -108,17 +108,17 @@ void device_md_cart_interface::nvram_alloc(running_machine &machine, size_t size
}
//-------------------------------------------------
-// rom_map_setup - setup map of rom banks in 64K
+// rom_map_setup - setup map of rom banks in 64K
// blocks, so to simplify ROM mirroring
//-------------------------------------------------
void device_md_cart_interface::rom_map_setup(UINT32 size)
{
int i;
- // setup the rom_bank_map array to faster ROM read
+ // setup the rom_bank_map array to faster ROM read
for (i = 0; i < size / 0x10000; i++)
rom_bank_map[i] = i;
-
+
// fill up remaining blocks with mirrors
while (i % 64)
{
@@ -130,19 +130,19 @@ void device_md_cart_interface::rom_map_setup(UINT32 size)
rom_bank_map[i + k] = rom_bank_map[i + k - repeat_banks];
i += repeat_banks;
}
-
+
// check bank map!
-// for (i = 0; i < 64; i++)
-// {
-// printf("bank %3d = %3d\t", i, rom_bank_map[i]);
-// if ((i%8) == 7)
-// printf("\n");
-// }
+// for (i = 0; i < 64; i++)
+// {
+// printf("bank %3d = %3d\t", i, rom_bank_map[i]);
+// if ((i%8) == 7)
+// printf("\n");
+// }
}
//-------------------------------------------------
-//
-//
+//
+//
//-------------------------------------------------
UINT32 device_md_cart_interface::get_padded_size(UINT32 size)
@@ -235,13 +235,13 @@ static const md_slot slot_list[] =
{
{ SEGA_SK, "rom_sk" },
{ SEGA_STD, "rom_svp"},
-// { SEGA_SVP, "rom_svp"}, // not ready yet...
+// { SEGA_SVP, "rom_svp"}, // not ready yet...
{ SEGA_SRAM, "rom_sram" },
{ SEGA_FRAM, "rom_fram" },
{ HARDBALL95, "rom_hardbl95" },
{ BEGGAR, "rom_beggar"},
-
+
{ SEGA_EEPROM, "rom_eeprom" },
{ NBA_JAM, "rom_nbajam" },
{ NBA_JAM_TE, "rom_nbajamte" },
@@ -249,17 +249,17 @@ static const md_slot slot_list[] =
{ C_SLAM, "rom_cslam" },
{ EA_NHLPA, "rom_nhlpa" },
{ BRIAN_LARA, "rom_blara" },
-
+
{ CM_JCART, "rom_jcart" },
{ CODE_MASTERS, "rom_codemast" },
{ CM_MM96, "rom_mm96" },
{ PSOLAR, "rom_stm95"},
-
+
{ SSF2, "rom_ssf2" },
{ RADICA, "rom_radica" },
-// { GAME_KANDUME, "rom_gkand" }, // what's needed by this?
-
+// { GAME_KANDUME, "rom_gkand" }, // what's needed by this?
+
{ BUGSLIFE, "rom_bugs" },
{ CHINFIGHT3, "rom_chinf3" },
{ ELFWOR, "rom_elfwor" },
@@ -296,7 +296,7 @@ static int md_get_pcb_id(const char *slot)
if (!mame_stricmp(slot_list[i].slot_option, slot))
return slot_list[i].pcb_id;
}
-
+
return SEGA_STD;
}
@@ -307,7 +307,7 @@ static const char *md_get_slot(int type)
if (slot_list[i].pcb_id == type)
return slot_list[i].slot_option;
}
-
+
return "rom";
}
@@ -327,7 +327,7 @@ bool base_md_cart_slot_device::call_load()
{
m_type = SEGA_STD;
int res;
-
+
// STEP 1: load the file image and keep a copy for later banking
// STEP 2: identify the cart type
// The two steps are carried out differently if we are loading from a list or not
@@ -335,14 +335,14 @@ bool base_md_cart_slot_device::call_load()
res = load_nonlist();
else
res = load_list();
-
+
//printf("cart type: %d\n", m_type);
-
+
if (res == IMAGE_INIT_PASS)
{
// STEP 3: install memory handlers for this type of cart
setup_custom_mappers();
-
+
// STEP 4: take care of SRAM.
setup_nvram();
@@ -353,7 +353,7 @@ bool base_md_cart_slot_device::call_load()
return res;
}
-
+
return IMAGE_INIT_PASS;
}
@@ -374,7 +374,7 @@ int base_md_cart_slot_device::load_list()
// if we allocated a ROM larger that the file (e.g. due to uneven cart size), set remaining space to 0xff
if (length > get_software_region_length("rom"))
memset(ROM + get_software_region_length("rom")/2, 0xffff, (length - get_software_region_length("rom"))/2);
-
+
if ((slot_name = get_feature("slot")) == NULL)
m_type = SEGA_STD;
else
@@ -401,57 +401,57 @@ static int genesis_is_SMD(unsigned char *buf,unsigned int len)
/* aq quiz */
if (!strncmp("UZ(-01 ", (const char *) &buf[0xf0], 8))
return 1;
-
+
/* Phelios USA redump */
/* target earth */
/* klax (namcot) */
if (buf[0x2080] == ' ' && buf[0x0080] == 'S' && buf[0x2081] == 'E' && buf[0x0081] == 'G')
return 1;
-
+
/* jap baseball 94 */
if (!strncmp("OL R-AEAL", (const char *) &buf[0xf0], 9))
return 1;
-
+
/* devilish Mahjong Tower */
if (!strncmp("optrEtranet", (const char *) &buf[0xf3], 11))
return 1;
-
+
/* golden axe 2 beta */
if (buf[0x0100] == 0x3c && buf[0x0101] == 0 && buf[0x0102] == 0 && buf[0x0103] == 0x3c)
return 1;
-
+
/* omega race */
if (!strncmp("OEARC ", (const char *) &buf[0x90], 8))
return 1;
-
+
/* budokan beta */
if ((len >= 0x6708 + 8) && !strncmp(" NTEBDKN", (const char *) &buf[0x6708], 8))
return 1;
-
+
/* cdx pro 1.8 bios */
if (!strncmp("so fCXP", (const char *) &buf[0x2c0], 7))
return 1;
-
+
/* ishido (hacked) */
if (!strncmp("sio-Wyo ", (const char *) &buf[0x0090], 8))
return 1;
-
+
/* onslaught */
if (!strncmp("SS CAL ", (const char *) &buf[0x0088], 8))
return 1;
-
+
/* tram terror pirate */
if ((len >= 0x3648 + 8) && !strncmp("SG NEPIE", (const char *) &buf[0x3648], 8))
return 1;
-
+
/* breath of fire 3 chinese */
if (buf[0x0007] == 0x1c && buf[0x0008] == 0x0a && buf[0x0009] == 0xb8 && buf[0x000a] == 0x0a)
return 1;
-
+
/*tetris pirate */
if ((len >= 0x1cbe + 5) && !strncmp("@TTI>", (const char *) &buf[0x1cbe], 5))
return 1;
-
+
return 0;
}
@@ -463,14 +463,14 @@ static int genesis_is_SMD(unsigned char *buf,unsigned int len)
int base_md_cart_slot_device::load_nonlist()
{
unsigned char *ROM, *tmpROM;
- UINT32 len = m_cart->get_padded_size(length()); // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space
+ UINT32 len = m_cart->get_padded_size(length()); // if cart size is not (2^n * 64K), the system will see anyway that size so we need to alloc a bit more space
// this contains an hack for SSF2: its current bankswitch code needs larger rom space to work
m_cart->rom_alloc(machine(), (len == 0x500000) ? 0x900000 : len);
ROM = (unsigned char *)m_cart->get_rom_base();
tmpROM = global_alloc_array(unsigned char, len);
-
+
// STEP 1: determine the file type (SMD? MD? BIN?)
fread(tmpROM, len);
@@ -478,7 +478,7 @@ int base_md_cart_slot_device::load_nonlist()
if (genesis_is_SMD(&tmpROM[0x200], len))
{
mame_printf_debug("SMD!\n");
-
+
for (int ptr = 0; ptr < (len - 0x200) / 0x2000; ptr += 2)
{
for (int x = 0; x < 0x2000; x++)
@@ -487,14 +487,14 @@ int base_md_cart_slot_device::load_nonlist()
*ROM++ = *(tmpROM + 0x200 + ((ptr + 0) * 0x2000) + x);
}
}
-
+
len -= 0x200;
}
/* is this a MD file? */
else if ((tmpROM[0x80] == 'E') && (tmpROM[0x81] == 'A') && (tmpROM[0x82] == 'M' || tmpROM[0x82] == 'G'))
{
mame_printf_debug("MD!\n");
-
+
for (int ptr = 0; ptr < len; ptr += 2)
{
ROM[ptr] = tmpROM[(len >> 1) + (ptr >> 1)];
@@ -509,18 +509,18 @@ int base_md_cart_slot_device::load_nonlist()
}
global_free(tmpROM);
-
+
// if we allocated a ROM larger that the file (e.g. due to uneven cart size), set remaining space to 0xff
if (len > length())
memset(m_cart->get_rom_base() + length()/2, 0xffff, (len - length())/2);
-
+
// STEP 2: determine the cart type (to deal with pirate mappers & eeprom)
m_type = get_cart_type(ROM, length());
// handle mirroring of ROM, unless it's SSF2 or Pier Solar
if (m_type != SSF2 && m_type != PSOLAR)
m_cart->rom_map_setup(len);
-
+
#ifdef LSB_FIRST
unsigned char fliptemp;
// is this really needed nowadays?
@@ -530,7 +530,7 @@ int base_md_cart_slot_device::load_nonlist()
ROM[ptr] = ROM[ptr+1];
ROM[ptr+1] = fliptemp;
}
-#endif
+#endif
return IMAGE_INIT_PASS;
}
@@ -588,7 +588,7 @@ void base_md_cart_slot_device::setup_custom_mappers()
006036:e000
002540:6026
001ed0:6026
- 002476:6022
+ 002476:6022
*/
ROM16[0x06036/2] = 0xe000;
ROM16[0x02540/2] = 0x6026;
@@ -605,7 +605,7 @@ void base_md_cart_slot_device::setup_custom_mappers()
// ROM16[0x02540/2] = 0xe000;
ROM16[0x06036/2] = 0xe000;
break;
- }
+ }
}
void base_md_cart_slot_device::setup_nvram()
@@ -623,21 +623,21 @@ void base_md_cart_slot_device::setup_nvram()
m_cart->m_nvram_start = (ROM[0x1b5] << 24 | ROM[0x1b4] << 16 | ROM[0x1b7] << 8 | ROM[0x1b6]);
m_cart->m_nvram_end = (ROM[0x1b9] << 24 | ROM[0x1b8] << 16 | ROM[0x1bb] << 8 | ROM[0x1ba]);
logerror("SRAM detected from header: starting location %X - SRAM Length %X\n", m_cart->m_nvram_start, m_cart->m_nvram_end - m_cart->m_nvram_start + 1);
-
+
// We assume at most 64k of SRAM. is this correct?
- if ((m_cart->m_nvram_start > m_cart->m_nvram_end) || ((m_cart->m_nvram_end - m_cart->m_nvram_start) >= 0x10000))
+ if ((m_cart->m_nvram_start > m_cart->m_nvram_end) || ((m_cart->m_nvram_end - m_cart->m_nvram_start) >= 0x10000))
m_cart->m_nvram_end = m_cart->m_nvram_start + 0xffff;
-
+
if (m_cart->m_nvram_start & 1)
m_cart->m_nvram_start -= 1;
-
+
if (!(m_cart->m_nvram_end & 1))
m_cart->m_nvram_end += 1;
-
+
m_cart->nvram_alloc(machine(), m_cart->m_nvram_end - m_cart->m_nvram_start + 1);
if (m_cart->m_rom_size <= m_cart->m_nvram_start)
m_cart->m_nvram_active = 1;
- m_cart->m_nvram_handlers_installed = 1;
+ m_cart->m_nvram_handlers_installed = 1;
// don't trust too much header?
m_cart->m_nvram_start &= 0x3fffff;
m_cart->m_nvram_end &= 0x3fffff;
@@ -649,7 +649,7 @@ void base_md_cart_slot_device::setup_nvram()
if (m_cart->m_rom_size <= m_cart->m_nvram_start)
m_cart->m_nvram_active = 1;
break;
-
+
// These types only come from softlist loading
case SEGA_SRAM:
m_cart->m_nvram_start = 0x200000;
@@ -666,7 +666,7 @@ void base_md_cart_slot_device::setup_nvram()
m_cart->m_nvram_active = 1;
m_cart->m_nvram_handlers_installed = 1;
break;
-
+
// These types might come from both (pending proper id routines)
case HARDBALL95:
m_cart->m_nvram_start = 0x300000;
@@ -724,151 +724,151 @@ int base_md_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
soulb_sig[] = { 0x33, 0xfc, 0x00, 0x0c, 0x00, 0xff }, // move.w #$C,($FF020A).l (what happens if check fails)
s19in1_sig[] = { 0x13, 0xc0, 0x00, 0xa1, 0x30, 0x38 },
rockman_sig[] = { 0xea, 0x80 };
-
+
switch (len)
- {
+ {
case 0x80000:
if (!memcmp(&ROM[0x08c8], smouse_sig, sizeof(smouse_sig)))
type = SMOUSE;
-
+
if (!memcmp((char *)&ROM[0x7e30e], "SEGA", 4) ||
!memcmp((char *)&ROM[0x7e100], "SEGA", 4) ||
!memcmp((char *)&ROM[0x7e1e6], "SEGA", 4))
type = REALTEC;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-50396", 10)) // NHLPA Hockey 93
type = EA_NHLPA;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM MK-1215", 10)) // Evander Holyfield
type = SEGA_EEPROM;
break;
-
+
case 0xc0000:
-
+
if (!memcmp((char *)&ROM[0x0180], "GM G-4060 ", 8)) // Wonder Boy V
type = SEGA_EEPROM;
break;
-
+
case 0x100000:
if (!memcmp(&ROM[0x01b24], mjlover_sig, sizeof(mjlover_sig)))
type = MJLOVER;
-
+
if (!memcmp(&ROM[0x03b4], squir_sig, sizeof(squir_sig)))
type = SQUIRRELK;
-
+
if (!memcmp(&ROM[0xee0d0], bugsl_sig, sizeof(bugsl_sig)))
type = BUGSLIFE;
-
+
if (!memcmp((char *)&ROM[0x0172], "GAME : ELF WOR", 14))
type = ELFWOR;
-
+
if (!memcmp(&ROM[0x123e4], sbub_sig, sizeof(sbub_sig)))
type = SBUBBOB;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-50176", 10)) // Rings of Power
type = EA_NHLPA;
-
+
if (!memcmp((char *)&ROM[0x0180], "MK 00001211-00", 14)) // Sports Talk Baseball
type = SEGA_EEPROM;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-120096-", 12)) // Micro Machines 2
type = CODE_MASTERS;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-120146-", 12)) // Brian Lara Cricket 96 / Shane Wayne Cricket 96
type = BRIAN_LARA;
-
+
if (!memcmp((char *)&ROM[0x0190], "OJKRPTBVFCA ", 0x10)) // Micro Machines '96 / Military TODO: better way to recognize these?
type = CODE_MASTERS;
break;
-
+
case 0x200000:
if (!memcmp(&ROM[0x18c6], lk3_sig, sizeof(lk3_sig)))
type = LIONK3;
-
+
if (!memcmp(&ROM[0x220], sdk_sig, sizeof(sdk_sig)))
type = LIONK3;
-
+
if (!memcmp(&ROM[0xce560], redcliff_sig, sizeof(redcliff_sig)))
type = REDCLIFF;
-
+
if (!memcmp(&ROM[0xc8cb0], smb_sig, sizeof(smb_sig)))
type = SMB;
-
+
if (!memcmp(&ROM[0xf24d6], smb2_sig, sizeof(smb2_sig)))
type = SMB2;
-
+
if (!memcmp(&ROM[0x674e], kaiju_sig, sizeof(kaiju_sig)))
type = KAIJU;
-
+
if (!memcmp(&ROM[0x1780], chifi3_sig, sizeof(chifi3_sig)))
type = CHINFIGHT3;
-
+
if (!memcmp(&ROM[0x03c2], lionk2_sig, sizeof(lionk2_sig)))
type = LIONK2;
-
+
if (!memcmp(&ROM[0xc8b90], rx3_sig, sizeof(rx3_sig)))
type = ROCKMANX3;
-
+
if (!memcmp(&ROM[0x56ae2], kof98_sig, sizeof(kof98_sig)))
type = KOF98;
-
+
if (!memcmp(&ROM[0x17bb2], s15in1_sig, sizeof(s15in1_sig)))
type = MC_PIRATE;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-081326 ", 12)) // NBA Jam
type = NBA_JAM;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM MK-1228", 10)) // Greatest Heavyweight of the Ring
type = SEGA_EEPROM;
-
+
if ((!memcmp((char *)&ROM[0x0180], "GM T-12046", 10)) || // Mega Man
(!memcmp((char *)&ROM[0x0180], "GM T-12053", 10) && !memcmp(&ROM[0x18e], rockman_sig, sizeof(rockman_sig)))) // / Rock Man (EEPROM version)
type = SEGA_EEPROM;
-
+
break;
-
+
case 0x200005:
if (!memcmp(&ROM[0xce564], redcl_en_sig, sizeof(redcliff_sig)))
type = REDCL_EN;
break;
-
+
case 0x300000:
if (!memcmp(&ROM[0x220], sdk_sig, sizeof(sdk_sig)))
type = LIONK3;
-
+
if (!memcmp(&ROM[0x1fd0d2], kof99_sig, sizeof(kof99_sig)))
type = KOF99;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-81406", 10)) // NBA Jam TE
type = NBA_JAM_TE;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-081276 ", 12)) // NFL Quarterback Club
type = NBA_JAM_TE;
-
+
break;
-
+
case 0x400000:
if (!memcmp(&ROM[0x3c031c], radica_sig, sizeof(radica_sig)) ||
!memcmp(&ROM[0x3f031c], radica_sig, sizeof(radica_sig))) // ssf+gng + radica vol1
type = RADICA;
-
+
if (!memcmp(&ROM[0x028460], soulb_sig, sizeof(soulb_sig)))
type = SOULBLAD;
-
+
if (!memcmp(&ROM[0x1e700], s19in1_sig, sizeof(s19in1_sig)))
type = MC_PIRATE;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-081586-", 12)) // NFL Quarterback Club 96
type = NFL_QB_96;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-081576 ", 12)) // College Slam
type = C_SLAM;
-
+
if (!memcmp((char *)&ROM[0x0180], "GM T-81476", 10)) // Big Hurt Baseball
type = C_SLAM;
-
+
break;
-
+
case 0x500000:
if (!memcmp((char *)&ROM[0x0120], "SUPER STREET FIGHTER2 ", 22))
type = SSF2;
@@ -886,15 +886,15 @@ int base_md_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
//check for SRAM among the general carts
if (type == SEGA_STD)
{
- // If the cart is not of a special type, we check the header for SRAM.
+ // If the cart is not of a special type, we check the header for SRAM.
if (ROM[0x1b1] == 'R' && ROM[0x1b0] == 'A')
{
UINT32 start, end;
start = (ROM[0x1b5] << 24 | ROM[0x1b4] << 16 | ROM[0x1b7] << 8 | ROM[0x1b6]);
end = (ROM[0x1b9] << 24 | ROM[0x1b8] << 16 | ROM[0x1bb] << 8 | ROM[0x1ba]);
logerror("SRAM detected from header: starting location %X - SRAM Length %X\n", start, end - start + 1);
-
- // For some games using serial EEPROM, difference between SRAM end to start is 0 or 1.
+
+ // For some games using serial EEPROM, difference between SRAM end to start is 0 or 1.
// Carts with EEPROM should have been already detected above, but better safe than sorry
if (end - start < 2)
type = SEGA_EEPROM;
@@ -904,12 +904,12 @@ int base_md_cart_slot_device::get_cart_type(UINT8 *ROM, UINT32 len)
else
{
// Unfortunately, there are ROMs without correct info in the header,
- // Hence, when loading from fullpath we do the SRAM mapping anyway...
+ // Hence, when loading from fullpath we do the SRAM mapping anyway...
// but treat it in a custom way
type = SEGA_SRAM_FALLBACK;
}
}
-
+
return type;
}
/*-------------------------------------------------
@@ -925,15 +925,15 @@ const char * base_md_cart_slot_device::get_default_card_software(const machine_c
UINT32 len = core_fsize(m_file);
UINT8 *ROM = global_alloc_array(UINT8, len);
int type;
-
+
core_fread(m_file, ROM, len);
-
+
type = get_cart_type(ROM, len);
slot_string = md_get_slot(type);
-
+
global_free(ROM);
clear();
-
+
return slot_string;
}
else
@@ -992,4 +992,3 @@ WRITE16_MEMBER(base_md_cart_slot_device::write_a15)
if (m_cart)
m_cart->write_a15(space, offset, data);
}
-