From 8fc25a750d358e94e1fbd847a9748d94a42ad77e Mon Sep 17 00:00:00 2001 From: Fabio Priuli Date: Thu, 20 Jan 2011 08:00:20 +0000 Subject: [PATCH] added ElBarto's patch to improve SRAM handling in MESS megadrive. no whatsnew. --- src/mame/drivers/megadriv.c | 2 +- src/mame/includes/megadriv.h | 3 +- src/mame/machine/megadriv.c | 84 +++++++++++++++++++++--------------- 3 files changed, 52 insertions(+), 37 deletions(-) diff --git a/src/mame/drivers/megadriv.c b/src/mame/drivers/megadriv.c index 6b5ca9f86b3..ebc63d7e1cf 100644 --- a/src/mame/drivers/megadriv.c +++ b/src/mame/drivers/megadriv.c @@ -9584,12 +9584,12 @@ INPUT_PORTS_END static MACHINE_START( ms_megadriv ) { mess_init_6buttons_pad(machine); + MACHINE_START_CALL( md_sram ); } static MACHINE_RESET( ms_megadriv ) { MACHINE_RESET_CALL( megadriv ); - MACHINE_RESET_CALL( md_mappers ); } static MACHINE_CONFIG_DERIVED( ms_megadriv, megadriv ) diff --git a/src/mame/includes/megadriv.h b/src/mame/includes/megadriv.h index b596f540b04..53bfe8a3ed9 100644 --- a/src/mame/includes/megadriv.h +++ b/src/mame/includes/megadriv.h @@ -116,11 +116,10 @@ struct _mtech_bios /* once all the regs are saved in this structure, it would be /*----------- defined in machine/megadriv.c -----------*/ -MACHINE_RESET( md_mappers ); - MACHINE_CONFIG_EXTERN( genesis_cartslot ); MACHINE_CONFIG_EXTERN( _32x_cartslot ); MACHINE_CONFIG_EXTERN( pico_cartslot ); +MACHINE_START( md_sram ); WRITE16_HANDLER( jcart_ctrl_w ); READ16_HANDLER( jcart_ctrl_r ); diff --git a/src/mame/machine/megadriv.c b/src/mame/machine/megadriv.c index 38def05551b..859d71e2bbf 100644 --- a/src/mame/machine/megadriv.c +++ b/src/mame/machine/megadriv.c @@ -610,25 +610,13 @@ static WRITE16_HANDLER( genesis_TMSS_bank_w ) * *************************************/ -static void alloc_sram(running_machine *machine) -{ - genesis_sram = auto_alloc_array(machine, UINT16, (genesis_sram_end - genesis_sram_start + 1) / sizeof(UINT16)); - device_image_interface *image = dynamic_cast(machine->device("cart")); - image->battery_load(genesis_sram, genesis_sram_end - genesis_sram_start + 1, 0xff); // Dino Dini's Soccer needs backup RAM to be 1fill - memcpy(megadriv_backupram, genesis_sram, genesis_sram_end - genesis_sram_start + 1); -} - static READ16_HANDLER( genesis_sram_read ) { UINT8 *ROM; int rom_offset; if (genesis_sram_active) - { - if (genesis_sram == NULL) - alloc_sram(space->machine); return genesis_sram[offset]; - } else { ROM = space->machine->region("maincpu")->base(); @@ -642,8 +630,6 @@ static WRITE16_HANDLER( genesis_sram_write ) { if (genesis_sram_active) { - if (genesis_sram == NULL) - alloc_sram(space->machine); if (!genesis_sram_readonly) genesis_sram[offset] = data; } @@ -651,6 +637,13 @@ static WRITE16_HANDLER( genesis_sram_write ) static void install_sram_rw_handlers(running_machine *machine) { + device_image_interface *image = dynamic_cast(machine->device("cart")); + + mame_printf_debug("Allocing %d bytes for sram\n", genesis_sram_end - genesis_sram_start + 1); + genesis_sram = auto_alloc_array(machine, UINT16, (genesis_sram_end - genesis_sram_start + 1) / sizeof(UINT16)); + image->battery_load(genesis_sram, genesis_sram_end - genesis_sram_start + 1, 0xff); // Dino Dini's Soccer needs backup RAM to be 1fill + memcpy(megadriv_backupram, genesis_sram, genesis_sram_end - genesis_sram_start + 1); + memory_install_read16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), genesis_sram_start & 0x3fffff, genesis_sram_end & 0x3fffff, 0, 0, genesis_sram_read); memory_install_write16_handler(cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM), genesis_sram_start & 0x3fffff, genesis_sram_end & 0x3fffff, 0, 0, genesis_sram_write); sram_handlers_installed = 1; @@ -756,6 +749,20 @@ static WRITE16_HANDLER( codemasters_eeprom_w ) // i2cmem_scl_write(space->machine->device("i2cmem"), i2c_mem); } +static READ16_HANDLER( sega_6658a_reg_r ) +{ + return genesis_sram_active; +} + +static WRITE16_HANDLER( sega_6658a_reg_w ) +{ + if (data == 1) + genesis_sram_active = 1; + if (data == 0) + genesis_sram_active = 0; +} + + /************************************* * * Machine driver reset @@ -1018,12 +1025,6 @@ static void setup_megadriv_custom_mappers(running_machine *machine) } -MACHINE_RESET( md_mappers ) -{ - setup_megadriv_custom_mappers(machine); -} - - /************************************* * * Cart handling @@ -1143,6 +1144,7 @@ static DEVICE_IMAGE_LOAD( genesis_cart ) has_serial_eeprom = 0; cart_type = STANDARD; + /* non-softlist loading */ if (image.software_entry() == NULL) { rawROM = image.device().machine->region("maincpu")->base(); @@ -1481,6 +1483,8 @@ static DEVICE_IMAGE_LOAD( genesis_cart ) if (sram_detected) logerror("SRAM detected from header: starting location %X - SRAM Length %X\n", genesis_sram_start, genesis_sram_end - genesis_sram_start + 1); + + setup_megadriv_custom_mappers(image.device().machine); } else /* Handle pcb with the softlist info */ { @@ -1493,6 +1497,8 @@ static DEVICE_IMAGE_LOAD( genesis_cart ) genesis_last_loaded_image_length = length; megadriv_backupram = NULL; + genesis_sram = NULL; + if ((pcb_name = image.get_feature("pcb")) == NULL) pcb_id = STD_ROM; else @@ -1510,42 +1516,54 @@ static DEVICE_IMAGE_LOAD( genesis_cart ) genesis_sram_end = genesis_sram_start + 0x3fff; sram_detected = 1; megadriv_backupram = (UINT16*) (ROM + (genesis_sram_start & 0x3fffff)); + genesis_sram_active = 1; break; case SEGA_6658A: genesis_sram_start = 0x200000; genesis_sram_end = genesis_sram_start + 0x3ff; sram_detected = 1; megadriv_backupram = (UINT16*) (ROM + (genesis_sram_start & 0x3fffff)); + memory_install_read16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xa130f0, 0xa130f1, 0, 0, sega_6658a_reg_r); + memory_install_write16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0xa130f0, 0xa130f1, 0, 0, sega_6658a_reg_w); break; /* Codemasters PCB (J-Carts) */ case CM_JCART: - memory_install_read16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x38FFFE, 0x38FFFF, 0, 0, jcart_ctrl_r); - memory_install_write16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x38FFFE, 0x38FFFF, 0, 0, jcart_ctrl_w); + memory_install_read16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x38fffe, 0x38ffff, 0, 0, jcart_ctrl_r); + memory_install_write16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x38fffe, 0x38ffff, 0, 0, jcart_ctrl_w); break; case CM_JCART_SEPROM: - memory_install_read16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x38FFFE, 0x38FFFF, 0, 0, jcart_ctrl_r); - memory_install_write16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x38FFFE, 0x38FFFF, 0, 0, jcart_ctrl_w); + memory_install_read16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x38fffe, 0x38ffff, 0, 0, jcart_ctrl_r); + memory_install_write16_handler(cputag_get_address_space(image.device().machine, "maincpu", ADDRESS_SPACE_PROGRAM), 0x38fffe, 0x38ffff, 0, 0, jcart_ctrl_w); /* TODO add SEPROM part */ break; } + + if (sram_detected) + install_sram_rw_handlers(image.device().machine); } return IMAGE_INIT_PASS; } -/******* Image unloading (with SRAM saving) *******/ +/******* SRAM saving *******/ -static DEVICE_IMAGE_UNLOAD( genesis_cart ) +static void genesis_machine_stop(running_machine &machine) { - /* Write out the battery file if necessary */ - if (genesis_sram != NULL) - { - image.battery_save(genesis_sram, genesis_sram_end - genesis_sram_start + 1); - free(genesis_sram); - } + device_image_interface *image = dynamic_cast(machine.device("cart")); + + /* Write out the battery file if necessary */ + if (genesis_sram != NULL) + { + mame_printf_debug("Saving sram\n"); + image->battery_save(genesis_sram, genesis_sram_end - genesis_sram_start + 1); + } } +MACHINE_START( md_sram ) +{ + machine->add_notifier(MACHINE_NOTIFY_EXIT, genesis_machine_stop); +} /******* 32X image loading *******/ @@ -1601,7 +1619,6 @@ MACHINE_CONFIG_FRAGMENT( genesis_cartslot ) MCFG_CARTSLOT_MANDATORY MCFG_CARTSLOT_INTERFACE("megadriv_cart") MCFG_CARTSLOT_LOAD(genesis_cart) - MCFG_CARTSLOT_UNLOAD(genesis_cart) MCFG_SOFTWARE_LIST_ADD("cart_list","megadriv") MACHINE_CONFIG_END @@ -1620,6 +1637,5 @@ MACHINE_CONFIG_FRAGMENT( pico_cartslot ) MCFG_CARTSLOT_MANDATORY MCFG_CARTSLOT_INTERFACE("pico_cart") MCFG_CARTSLOT_LOAD(genesis_cart) - MCFG_CARTSLOT_UNLOAD(genesis_cart) MCFG_SOFTWARE_LIST_ADD("cart_list","pico") MACHINE_CONFIG_END