diff options
Diffstat (limited to 'src/mame/drivers/aci_ggm.cpp')
-rw-r--r-- | src/mame/drivers/aci_ggm.cpp | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/mame/drivers/aci_ggm.cpp b/src/mame/drivers/aci_ggm.cpp index a9ec9967503..07449ad53eb 100644 --- a/src/mame/drivers/aci_ggm.cpp +++ b/src/mame/drivers/aci_ggm.cpp @@ -25,8 +25,9 @@ Known chess cartridges (*denotes not dumped): - Steinitz Edition-4 - Master Chess - *Monitor Edition - Master Kriegspiel -The opening/endgame cartridges are meant to be ejected/inserted while -playing (put the power switch in "MEM" first). +The opening/endgame cartridges are meant to be ejected/inserted while playing: +switch power switch to MEM, swap cartridge, switch power switch back to ON. +In other words, don't power cycle the machine (or MAME). Other games: - *Borchek Edition - Master Checkers @@ -50,7 +51,6 @@ TODO: #include "bus/generic/carts.h" #include "cpu/m6502/m6502.h" #include "machine/6522via.h" -#include "machine/nvram.h" #include "machine/timer.h" #include "sound/dac.h" #include "video/pwm.h" @@ -105,7 +105,8 @@ private: void update_display(); TIMER_DEVICE_CALLBACK_MEMBER(ca1_off) { m_via->write_ca1(0); } - DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cartridge); + DECLARE_DEVICE_IMAGE_LOAD_MEMBER(load_cart); + DECLARE_DEVICE_IMAGE_UNLOAD_MEMBER(unload_cart); u8 cartridge_r(offs_t offset); void select_w(u8 data); @@ -165,7 +166,7 @@ void ggm_state::update_reset(ioport_value state) // cartridge -DEVICE_IMAGE_LOAD_MEMBER(ggm_state::cartridge) +DEVICE_IMAGE_LOAD_MEMBER(ggm_state::load_cart) { u32 size = m_cart->common_get_size("rom"); m_cart_mask = ((1 << (31 - count_leading_zeros(size))) - 1) & 0xffff; @@ -184,6 +185,18 @@ DEVICE_IMAGE_LOAD_MEMBER(ggm_state::cartridge) return image_init_result::PASS; } +DEVICE_IMAGE_UNLOAD_MEMBER(ggm_state::unload_cart) +{ + m_cart->rom_free(); + + // unmap extra ram + if (image.get_feature("ram")) + { + m_maincpu->space(AS_PROGRAM).nop_readwrite(0x0800, 0x0fff); + memset(m_extram, 0, m_extram.bytes()); + } +} + u8 ggm_state::cartridge_r(offs_t offset) { return m_cart->read_rom(offset & m_cart_mask); @@ -255,7 +268,7 @@ void ggm_state::main_map(address_map &map) { // external slot has potential bus conflict with RAM/VIA map(0x0000, 0xffff).r(FUNC(ggm_state::cartridge_r)); - map(0x0000, 0x07ff).ram().share("nvram"); + map(0x0000, 0x07ff).ram(); map(0x8000, 0x800f).m(m_via, FUNC(via6522_device::map)); } @@ -430,8 +443,6 @@ void ggm_state::ggm(machine_config &config) m_via->cb2_handler().set(FUNC(ggm_state::shift_data_w)); TIMER(config, m_ca1_off).configure_generic(FUNC(ggm_state::ca1_off)); - NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); - /* video hardware */ PWM_DISPLAY(config, m_display).set_size(8, 16); m_display->set_segmask(0xff, 0x3fff); @@ -444,8 +455,10 @@ void ggm_state::ggm(machine_config &config) /* cartridge */ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "ggm"); - m_cart->set_device_load(FUNC(ggm_state::cartridge)); + m_cart->set_device_load(FUNC(ggm_state::load_cart)); + m_cart->set_device_unload(FUNC(ggm_state::unload_cart)); m_cart->set_must_be_loaded(true); + m_cart->set_reset_on_load(false); SOFTWARE_LIST(config, "cart_list").set_original("ggm"); } |