summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/aci_ggm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/aci_ggm.cpp')
-rw-r--r--src/mame/drivers/aci_ggm.cpp31
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");
}