summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Wilbert Pol <wilbert@jdg.info>2013-01-13 13:36:12 +0000
committer Wilbert Pol <wilbert@jdg.info>2013-01-13 13:36:12 +0000
commit0e08e2d700c7f06b2250cb8666c6f389802ad260 (patch)
tree706c7beb253e7e5034fba26485541bb149cf4d21 /src
parent0190f8a555b1a6d1500ae1929caa767e58c8d1d3 (diff)
(MESS)sms.c: Keep RAM working normally when no scope is attached. (nw)
Diffstat (limited to 'src')
-rw-r--r--src/mess/drivers/sms.c34
-rw-r--r--src/mess/includes/sms.h9
-rw-r--r--src/mess/machine/sms.c46
3 files changed, 55 insertions, 34 deletions
diff --git a/src/mess/drivers/sms.c b/src/mess/drivers/sms.c
index 07b58ed86eb..245f3edbb8b 100644
--- a/src/mess/drivers/sms.c
+++ b/src/mess/drivers/sms.c
@@ -74,30 +74,30 @@ DC00 - Selection buttons #2, 9-16 (R)
static ADDRESS_MAP_START( sms1_mem, AS_PROGRAM, 8, sms_state )
- AM_RANGE(0x0000, 0x03ff) AM_ROMBANK("bank1") /* First 0x0400 part always points to first page */
- AM_RANGE(0x0400, 0x1fff) AM_ROMBANK("bank2") /* switchable rom bank */
- AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank7") /* switchable rom bank */
- AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank3") /* switchable rom bank */
- AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") /* switchable rom bank */
+ AM_RANGE(0x0000, 0x03ff) AM_ROMBANK("bank1") /* First 0x0400 part always points to first page */
+ AM_RANGE(0x0400, 0x1fff) AM_ROMBANK("bank2") /* switchable rom bank */
+ AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank7") /* switchable rom bank */
+ AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank3") /* switchable rom bank */
+ AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") /* switchable rom bank */
AM_RANGE(0x8000, 0x9fff) AM_READ_BANK("bank5") AM_WRITE(sms_cartram_w) /* ROM bank / on-cart RAM */
AM_RANGE(0xa000, 0xbfff) AM_READ_BANK("bank6") AM_WRITE(sms_cartram2_w) /* ROM bank / on-cart RAM */
- AM_RANGE(0xc000, 0xdff7) AM_MIRROR(0x2000) AM_RAM /* RAM (mirror at 0xE000) */
- AM_RANGE(0xdff8, 0xdfff) AM_RAM /* RAM "underneath" frame registers */
- AM_RANGE(0xfff8, 0xfffb) AM_READWRITE(sms_sscope_r, sms_sscope_w) /* 3-D glasses */
- AM_RANGE(0xfffc, 0xffff) AM_READWRITE(sms_mapper_r, sms_mapper_w) /* Bankswitch control */
+ AM_RANGE(0xc000, 0xdfff) AM_RAM AM_SHARE("mainram") /* RAM */
+ AM_RANGE(0xe000, 0xfff7) AM_RAM AM_SHARE("mainram") /* RAM (mirror) */
+ AM_RANGE(0xfff8, 0xfffb) AM_READWRITE(sms_sscope_r, sms_sscope_w) /* 3-D glasses */
+ AM_RANGE(0xfffc, 0xffff) AM_READWRITE(sms_mapper_r, sms_mapper_w) /* Bankswitch control */
ADDRESS_MAP_END
static ADDRESS_MAP_START( sms_mem, AS_PROGRAM, 8, sms_state )
- AM_RANGE(0x0000, 0x03ff) AM_ROMBANK("bank1") /* First 0x0400 part always points to first page */
- AM_RANGE(0x0400, 0x1fff) AM_ROMBANK("bank2") /* switchable rom bank */
- AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank7") /* switchable rom bank */
- AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank3") /* switchable rom bank */
- AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") /* switchable rom bank */
+ AM_RANGE(0x0000, 0x03ff) AM_ROMBANK("bank1") /* First 0x0400 part always points to first page */
+ AM_RANGE(0x0400, 0x1fff) AM_ROMBANK("bank2") /* switchable rom bank */
+ AM_RANGE(0x2000, 0x3fff) AM_ROMBANK("bank7") /* switchable rom bank */
+ AM_RANGE(0x4000, 0x5fff) AM_ROMBANK("bank3") /* switchable rom bank */
+ AM_RANGE(0x6000, 0x7fff) AM_ROMBANK("bank4") /* switchable rom bank */
AM_RANGE(0x8000, 0x9fff) AM_READ_BANK("bank5") AM_WRITE(sms_cartram_w) /* ROM bank / on-cart RAM */
AM_RANGE(0xa000, 0xbfff) AM_READ_BANK("bank6") AM_WRITE(sms_cartram2_w) /* ROM bank / on-cart RAM */
- AM_RANGE(0xc000, 0xdffb) AM_MIRROR(0x2000) AM_RAM /* RAM (mirror at 0xE000) */
- AM_RANGE(0xdffc, 0xdfff) AM_RAM /* RAM "underneath" frame registers */
- AM_RANGE(0xfffc, 0xffff) AM_READWRITE(sms_mapper_r, sms_mapper_w) /* Bankswitch control */
+ AM_RANGE(0xc000, 0xdfff) AM_RAM AM_SHARE("mainram") /* RAM */
+ AM_RANGE(0xe000, 0xfffb) AM_RAM AM_SHARE("mainram") /* RAM (mirror) */
+ AM_RANGE(0xfffc, 0xffff) AM_READWRITE(sms_mapper_r, sms_mapper_w) /* Bankswitch control */
ADDRESS_MAP_END
static ADDRESS_MAP_START( sms_store_mem, AS_PROGRAM, 8, sms_state )
diff --git a/src/mess/includes/sms.h b/src/mess/includes/sms.h
index 92cf40faf7d..87a148b7aca 100644
--- a/src/mess/includes/sms.h
+++ b/src/mess/includes/sms.h
@@ -26,7 +26,10 @@ public:
public:
sms_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag) { }
+ : driver_device(mconfig, type, tag)
+ , m_mainram(*this, "mainram")
+ {
+ }
// device_ts
device_t *m_main_cpu;
@@ -45,7 +48,6 @@ public:
int m_paused;
UINT8 m_bios_port;
UINT8 *m_BIOS;
- UINT8 *m_mapper_ram;
UINT8 m_mapper[4];
// we are going to use 1-6, same as bank numbers. Notice, though, that most mappers
// only work on 16K banks and, hence, banks 4-6 are not always directly set
@@ -195,6 +197,9 @@ public:
DECLARE_WRITE_LINE_MEMBER(sms_int_callback);
DECLARE_WRITE_LINE_MEMBER(sms_pause_callback);
DECLARE_WRITE_LINE_MEMBER(sms_store_int_callback);
+
+protected:
+ required_shared_ptr<UINT8> m_mainram;
};
diff --git a/src/mess/machine/sms.c b/src/mess/machine/sms.c
index 413b77fb34e..8140093fc62 100644
--- a/src/mess/machine/sms.c
+++ b/src/mess/machine/sms.c
@@ -868,29 +868,47 @@ READ8_MEMBER(sms_state::gg_input_port_2_r)
READ8_MEMBER(sms_state::sms_sscope_r)
{
- return m_sscope_state;
+ int sscope = machine().root_device().ioport("SEGASCOPE")->read_safe(0x00);
+
+ if ( sscope )
+ {
+ // Scope is attached
+ return m_sscope_state;
+ }
+
+ return m_mainram[0x1FF8 + offset];
}
WRITE8_MEMBER(sms_state::sms_sscope_w)
{
- screen_device *screen = machine().first_screen();
+ m_mainram[0x1FF8 + offset] = data;
- m_sscope_state = data;
+ int sscope = machine().root_device().ioport("SEGASCOPE")->read_safe(0x00);
- // There are occurrences when Sega Scope's state changes after VBLANK, or at
- // active screen. Most cases are solid-color frames of scene transitions, but
- // one exception is the first frame of Zaxxon 3-D's title screen. In that
- // case, this method is enough for setting the intended state for the frame.
- // No information found about a minimum time need for switch open/closed lens.
- if (screen->vpos() < (screen->height() >> 1))
- m_frame_sscope_state = m_sscope_state;
+ if ( sscope )
+ {
+ // Scope is attached
+ screen_device *screen = machine().first_screen();
+
+ m_sscope_state = data;
+
+ // There are occurrences when Sega Scope's state changes after VBLANK, or at
+ // active screen. Most cases are solid-color frames of scene transitions, but
+ // one exception is the first frame of Zaxxon 3-D's title screen. In that
+ // case, this method is enough for setting the intended state for the frame.
+ // No information found about a minimum time need for switch open/closed lens.
+ if (screen->vpos() < (screen->height() >> 1))
+ {
+ m_frame_sscope_state = m_sscope_state;
+ }
+ }
}
READ8_MEMBER(sms_state::sms_mapper_r)
{
- return m_mapper[offset];
+ return m_mainram[0x1FFC + offset];
}
/* Terebi Oekaki */
@@ -960,7 +978,7 @@ WRITE8_MEMBER(sms_state::sms_mapper_w)
offset &= 3;
m_mapper[offset] = data;
- m_mapper_ram[offset] = data;
+ m_mainram[0x1FFC + offset] = data;
if (m_bios_port & IO_BIOS_ROM || (m_is_gamegear && m_BIOS == NULL))
{
@@ -1941,7 +1959,7 @@ MACHINE_START_MEMBER(sms_state,sms)
// in Japan region (including KR), until confirmed on other consoles.
if (m_is_region_japan)
{
- memset((UINT8*)m_space->get_write_ptr(0xc000), 0xf0, 0x1FF0);
+ memset((UINT8*)m_space->get_write_ptr(0xc000), 0xf0, 0x1FFF);
}
}
@@ -1953,8 +1971,6 @@ MACHINE_RESET_MEMBER(sms_state,sms)
if (m_has_fm)
m_fm_detect = 0x01;
- m_mapper_ram = (UINT8*)space.get_write_ptr(0xdffc);
-
m_bios_port = 0;
if ( m_cartridge[m_current_cartridge].features & CF_CODEMASTERS_MAPPER )