diff options
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 |
commit | 0e08e2d700c7f06b2250cb8666c6f389802ad260 (patch) | |
tree | 706c7beb253e7e5034fba26485541bb149cf4d21 /src | |
parent | 0190f8a555b1a6d1500ae1929caa767e58c8d1d3 (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.c | 34 | ||||
-rw-r--r-- | src/mess/includes/sms.h | 9 | ||||
-rw-r--r-- | src/mess/machine/sms.c | 46 |
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 ) |