sms.cpp: Separate more state classes; eliminate old-style overrides (nw)

This commit is contained in:
AJR 2019-09-02 18:21:17 -04:00
parent b1879fe62b
commit 6643ee8c59
3 changed files with 208 additions and 193 deletions

View File

@ -263,15 +263,15 @@ DC00 - Selection buttons #2, 9-16 (R)
#define MASTER_CLOCK_PAL 53203425.0 /* 12 * subcarrier freq. (4.43361875MHz) */ #define MASTER_CLOCK_PAL 53203425.0 /* 12 * subcarrier freq. (4.43361875MHz) */
void sms_state::sms1_mem(address_map &map) void sms1_state::sms1_mem(address_map &map)
{ {
map(0x0000, 0xbfff).w(FUNC(sms_state::write_cart)); map(0x0000, 0xbfff).w(FUNC(sms1_state::write_cart));
map(0x0000, 0x3fff).r(FUNC(sms_state::read_0000)); map(0x0000, 0x3fff).r(FUNC(sms1_state::read_0000));
map(0x4000, 0x7fff).r(FUNC(sms_state::read_4000)); map(0x4000, 0x7fff).r(FUNC(sms1_state::read_4000));
map(0x8000, 0xbfff).r(FUNC(sms_state::read_8000)); map(0x8000, 0xbfff).r(FUNC(sms1_state::read_8000));
map(0xc000, 0xfff7).rw(FUNC(sms_state::read_ram), FUNC(sms_state::write_ram)); map(0xc000, 0xfff7).rw(FUNC(sms1_state::read_ram), FUNC(sms1_state::write_ram));
map(0xfff8, 0xfffb).rw(FUNC(sms_state::sms_sscope_r), FUNC(sms_state::sms_sscope_w)); /* 3-D glasses */ map(0xfff8, 0xfffb).rw(FUNC(sms1_state::sscope_r), FUNC(sms1_state::sscope_w)); /* 3-D glasses */
map(0xfffc, 0xffff).rw(FUNC(sms_state::sms_mapper_r), FUNC(sms_state::sms_mapper_w)); /* Bankswitch control */ map(0xfffc, 0xffff).rw(FUNC(sms1_state::sms_mapper_r), FUNC(sms1_state::sms_mapper_w)); /* Bankswitch control */
} }
void sms_state::sms_mem(address_map &map) void sms_state::sms_mem(address_map &map)
@ -361,22 +361,22 @@ void sms_state::smsj_io(address_map &map)
// It seems the mirrors for I/O ports $3E/$3F also don't seem to exist on the // It seems the mirrors for I/O ports $3E/$3F also don't seem to exist on the
// Game Gear. Leaving the mirrors breaks 'gloc' (it freezes after 1st stage). // Game Gear. Leaving the mirrors breaks 'gloc' (it freezes after 1st stage).
void sms_state::gg_io(address_map &map) void gamegear_state::gg_io(address_map &map)
{ {
map.global_mask(0xff); map.global_mask(0xff);
map.unmap_value_high(); map.unmap_value_high();
map(0x00, 0x00).r(FUNC(sms_state::gg_input_port_00_r)); map(0x00, 0x00).r(FUNC(gamegear_state::gg_input_port_00_r));
map(0x01, 0x05).rw(FUNC(sms_state::gg_sio_r), FUNC(sms_state::gg_sio_w)); map(0x01, 0x05).rw(FUNC(gamegear_state::gg_sio_r), FUNC(gamegear_state::gg_sio_w));
map(0x06, 0x06).w(FUNC(sms_state::gg_psg_stereo_w)); map(0x06, 0x06).w(FUNC(gamegear_state::gg_psg_stereo_w));
map(0x3e, 0x3e).w(FUNC(sms_state::sms_mem_control_w)); map(0x3e, 0x3e).w(FUNC(gamegear_state::sms_mem_control_w));
map(0x3f, 0x3f).w(FUNC(sms_state::sms_io_control_w)); map(0x3f, 0x3f).w(FUNC(gamegear_state::sms_io_control_w));
map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w)); map(0x40, 0x7f).r(FUNC(gamegear_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w));
map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write)); map(0x80, 0x80).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::data_read), FUNC(sega315_5124_device::data_write));
map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write)); map(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write));
map(0xc0, 0xc0).r(FUNC(sms_state::sms_input_port_dc_r)); map(0xc0, 0xc0).r(FUNC(gamegear_state::sms_input_port_dc_r));
map(0xc1, 0xc1).r(FUNC(sms_state::sms_input_port_dd_r)); map(0xc1, 0xc1).r(FUNC(gamegear_state::sms_input_port_dd_r));
map(0xdc, 0xdc).r(FUNC(sms_state::sms_input_port_dc_r)); map(0xdc, 0xdc).r(FUNC(gamegear_state::sms_input_port_dc_r));
map(0xdd, 0xdd).r(FUNC(sms_state::sms_input_port_dd_r)); map(0xdd, 0xdd).r(FUNC(gamegear_state::sms_input_port_dd_r));
} }
@ -564,7 +564,7 @@ void sms_state::screen_sms_ntsc_raw_params(screen_device &screen, X &&pixelclock
} }
template <typename X> template <typename X>
void sms_state::screen_gg_raw_params(screen_device &screen, X &&pixelclock) void gamegear_state::screen_gg_raw_params(screen_device &screen, X &&pixelclock)
{ {
screen.set_raw(std::forward<X>(pixelclock), screen.set_raw(std::forward<X>(pixelclock),
sega315_5124_device::WIDTH, sega315_5124_device::WIDTH,
@ -596,32 +596,29 @@ void sms_state::sms2_ntsc(machine_config &config)
} }
void sms_state::sms1_ntsc(machine_config &config) void sms1_state::sms1_ntsc(machine_config &config)
{ {
sms_ntsc_base(config); sms_ntsc_base(config);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses m_maincpu->set_addrmap(AS_PROGRAM, &sms1_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */ /* video hardware */
SCREEN(config, m_main_scr, SCREEN_TYPE_RASTER); SCREEN(config, m_main_scr, SCREEN_TYPE_RASTER);
screen_sms_ntsc_raw_params(*m_main_scr, XTAL(10'738'635)/2); screen_sms_ntsc_raw_params(*m_main_scr, XTAL(10'738'635)/2);
m_main_scr->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_main_scr->set_screen_update(FUNC(sms1_state::screen_update_sms));
SCREEN(config, m_left_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Left LCD SCREEN(config, m_left_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Left LCD
screen_sms_ntsc_raw_params(*m_left_lcd, XTAL(10'738'635)/2); screen_sms_ntsc_raw_params(*m_left_lcd, XTAL(10'738'635)/2);
m_left_lcd->set_screen_update(FUNC(sms_state::screen_update_sms1_left)); m_left_lcd->set_screen_update(FUNC(sms1_state::screen_update_left));
SCREEN(config, m_right_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Right LCD SCREEN(config, m_right_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Right LCD
screen_sms_ntsc_raw_params(*m_right_lcd, XTAL(10'738'635)/2); screen_sms_ntsc_raw_params(*m_right_lcd, XTAL(10'738'635)/2);
m_right_lcd->set_screen_update(FUNC(sms_state::screen_update_sms1_right)); m_right_lcd->set_screen_update(FUNC(sms1_state::screen_update_right));
m_main_scr->screen_vblank().set(FUNC(sms_state::screen_vblank_sms1)); m_main_scr->screen_vblank().set(FUNC(sms1_state::sscope_vblank));
config.set_default_layout(layout_sms1); config.set_default_layout(layout_sms1);
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
SEGA315_5124(config, m_vdp, XTAL(10'738'635)); SEGA315_5124(config, m_vdp, XTAL(10'738'635));
m_vdp->set_screen(m_main_scr); m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false); m_vdp->set_is_pal(false);
@ -690,32 +687,29 @@ void sms_state::sms2_pal(machine_config &config)
m_has_bios_full = true; m_has_bios_full = true;
} }
void sms_state::sms1_pal(machine_config &config) void sms1_state::sms1_pal(machine_config &config)
{ {
sms_pal_base(config); sms_pal_base(config);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses m_maincpu->set_addrmap(AS_PROGRAM, &sms1_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */ /* video hardware */
SCREEN(config, m_main_scr, SCREEN_TYPE_RASTER); SCREEN(config, m_main_scr, SCREEN_TYPE_RASTER);
screen_sms_pal_raw_params(*m_main_scr, MASTER_CLOCK_PAL/10); screen_sms_pal_raw_params(*m_main_scr, MASTER_CLOCK_PAL/10);
m_main_scr->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_main_scr->set_screen_update(FUNC(sms1_state::screen_update_sms));
SCREEN(config, m_left_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Left LCD SCREEN(config, m_left_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Left LCD
screen_sms_pal_raw_params(*m_left_lcd, MASTER_CLOCK_PAL/10); screen_sms_pal_raw_params(*m_left_lcd, MASTER_CLOCK_PAL/10);
m_left_lcd->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_left_lcd->set_screen_update(FUNC(sms1_state::screen_update_left));
SCREEN(config, m_right_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Right LCD SCREEN(config, m_right_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Right LCD
screen_sms_pal_raw_params(*m_right_lcd, MASTER_CLOCK_PAL/10); screen_sms_pal_raw_params(*m_right_lcd, MASTER_CLOCK_PAL/10);
m_right_lcd->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_right_lcd->set_screen_update(FUNC(sms1_state::screen_update_right));
m_main_scr->screen_vblank().set(FUNC(sms_state::screen_vblank_sms1)); m_main_scr->screen_vblank().set(FUNC(sms1_state::sscope_vblank));
config.set_default_layout(layout_sms1); config.set_default_layout(layout_sms1);
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
SEGA315_5124(config, m_vdp, MASTER_CLOCK_PAL/5); SEGA315_5124(config, m_vdp, MASTER_CLOCK_PAL/5);
m_vdp->set_screen(m_main_scr); m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(true); m_vdp->set_is_pal(true);
@ -762,32 +756,29 @@ void sms_state::sms3_paln(machine_config &config)
m_has_bios_full = true; m_has_bios_full = true;
} }
void sms_state::sms1_paln(machine_config &config) void sms1_state::sms1_paln(machine_config &config)
{ {
sms_paln_base(config); sms_paln_base(config);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses m_maincpu->set_addrmap(AS_PROGRAM, &sms1_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */ /* video hardware */
SCREEN(config, m_main_scr, SCREEN_TYPE_RASTER); SCREEN(config, m_main_scr, SCREEN_TYPE_RASTER);
screen_sms_pal_raw_params(*m_main_scr, MASTER_CLOCK_PALN/2); screen_sms_pal_raw_params(*m_main_scr, MASTER_CLOCK_PALN/2);
m_main_scr->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_main_scr->set_screen_update(FUNC(sms1_state::screen_update_sms));
SCREEN(config, m_left_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Left LCD SCREEN(config, m_left_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Left LCD
screen_sms_pal_raw_params(*m_left_lcd, MASTER_CLOCK_PALN/2); screen_sms_pal_raw_params(*m_left_lcd, MASTER_CLOCK_PALN/2);
m_left_lcd->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_left_lcd->set_screen_update(FUNC(sms1_state::screen_update_left));
SCREEN(config, m_right_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Right LCD SCREEN(config, m_right_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Right LCD
screen_sms_pal_raw_params(*m_right_lcd, MASTER_CLOCK_PALN/2); screen_sms_pal_raw_params(*m_right_lcd, MASTER_CLOCK_PALN/2);
m_right_lcd->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_right_lcd->set_screen_update(FUNC(sms1_state::screen_update_right));
m_main_scr->screen_vblank().set(FUNC(sms_state::screen_vblank_sms1)); m_main_scr->screen_vblank().set(FUNC(sms1_state::sscope_vblank));
config.set_default_layout(layout_sms1); config.set_default_layout(layout_sms1);
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
SEGA315_5124(config, m_vdp, MASTER_CLOCK_PALN); SEGA315_5124(config, m_vdp, MASTER_CLOCK_PALN);
m_vdp->set_screen(m_main_scr); m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(true); m_vdp->set_is_pal(true);
@ -835,33 +826,30 @@ void sms_state::sms3_br(machine_config &config)
m_has_bios_full = true; m_has_bios_full = true;
} }
void sms_state::sms1_br(machine_config &config) void sms1_state::sms1_br(machine_config &config)
{ {
sms_br_base(config); sms_br_base(config);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses m_maincpu->set_addrmap(AS_PROGRAM, &sms1_state::sms1_mem); // This adds the SegaScope handlers for 3-D glasses
/* video hardware */ /* video hardware */
// PAL-M height/width parameters are the same of NTSC screens. // PAL-M height/width parameters are the same of NTSC screens.
SCREEN(config, m_main_scr, SCREEN_TYPE_RASTER); SCREEN(config, m_main_scr, SCREEN_TYPE_RASTER);
screen_sms_ntsc_raw_params(*m_main_scr, MASTER_CLOCK_PALM/2); screen_sms_ntsc_raw_params(*m_main_scr, MASTER_CLOCK_PALM/2);
m_main_scr->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_main_scr->set_screen_update(FUNC(sms1_state::screen_update_sms));
SCREEN(config, m_left_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Left LCD SCREEN(config, m_left_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Left LCD
screen_sms_ntsc_raw_params(*m_left_lcd, MASTER_CLOCK_PALM/2); screen_sms_ntsc_raw_params(*m_left_lcd, MASTER_CLOCK_PALM/2);
m_left_lcd->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_left_lcd->set_screen_update(FUNC(sms1_state::screen_update_left));
SCREEN(config, m_right_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Right LCD SCREEN(config, m_right_lcd, SCREEN_TYPE_LCD); // This is needed for SegaScope Right LCD
screen_sms_ntsc_raw_params(*m_right_lcd, MASTER_CLOCK_PALM/2); screen_sms_ntsc_raw_params(*m_right_lcd, MASTER_CLOCK_PALM/2);
m_right_lcd->set_screen_update(FUNC(sms_state::screen_update_sms1)); m_right_lcd->set_screen_update(FUNC(sms1_state::screen_update_right));
m_main_scr->screen_vblank().set(FUNC(sms_state::screen_vblank_sms1)); m_main_scr->screen_vblank().set(FUNC(sms1_state::sscope_vblank));
config.set_default_layout(layout_sms1); config.set_default_layout(layout_sms1);
MCFG_VIDEO_START_OVERRIDE(sms_state,sms1)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,sms1)
SEGA315_5124(config, m_vdp, MASTER_CLOCK_PALM); SEGA315_5124(config, m_vdp, MASTER_CLOCK_PALM);
m_vdp->set_screen(m_main_scr); m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false); // PAL-M has same line count of NTSC m_vdp->set_is_pal(false); // PAL-M has same line count of NTSC
@ -892,11 +880,11 @@ void sms_state::sms2_kr(machine_config &config)
m_has_jpn_sms_cart_slot = true; m_has_jpn_sms_cart_slot = true;
} }
void sms_state::sms1_kr(machine_config &config) void sms1_state::sms1_kr(machine_config &config)
{ {
sms1_ntsc(config); sms1_ntsc(config);
m_maincpu->set_addrmap(AS_IO, &sms_state::smskr_io); m_maincpu->set_addrmap(AS_IO, &sms1_state::smskr_io);
// need to replace the cartridge slot with the Japanese version, so to // need to replace the cartridge slot with the Japanese version, so to
// keep the usual media order, remove and reinsert all of them. // keep the usual media order, remove and reinsert all of them.
@ -909,7 +897,7 @@ void sms_state::sms1_kr(machine_config &config)
SOFTWARE_LIST(config, "cart_list2").set_original("sg1000"); SOFTWARE_LIST(config, "cart_list2").set_original("sg1000");
m_vdp->n_csync().set(FUNC(sms_state::sms_n_csync_callback)); m_vdp->n_csync().set(FUNC(sms1_state::rapid_n_csync_callback));
m_has_bios_full = false; m_has_bios_full = false;
m_has_bios_2000 = true; m_has_bios_2000 = true;
@ -917,11 +905,11 @@ void sms_state::sms1_kr(machine_config &config)
m_has_jpn_sms_cart_slot = true; m_has_jpn_sms_cart_slot = true;
} }
void sms_state::smsj(machine_config &config) void sms1_state::smsj(machine_config &config)
{ {
sms1_kr(config); sms1_kr(config);
m_maincpu->set_addrmap(AS_IO, &sms_state::smsj_io); m_maincpu->set_addrmap(AS_IO, &sms1_state::smsj_io);
YM2413(config, m_ym, XTAL(10'738'635)/3); YM2413(config, m_ym, XTAL(10'738'635)/3);
// if this output gain is changed, the gain set when unmute the output need // if this output gain is changed, the gain set when unmute the output need
@ -931,11 +919,11 @@ void sms_state::smsj(machine_config &config)
m_is_smsj = true; m_is_smsj = true;
} }
void sms_state::sg1000m3(machine_config &config) void sms1_state::sg1000m3(machine_config &config)
{ {
sms1_ntsc(config); sms1_ntsc(config);
m_maincpu->set_addrmap(AS_IO, &sms_state::sg1000m3_io); m_maincpu->set_addrmap(AS_IO, &sms1_state::sg1000m3_io);
// Remove and reinsert all media slots, as done with the sms1_kr config, // Remove and reinsert all media slots, as done with the sms1_kr config,
// and also replace the expansion slot with the SG-1000 version. // and also replace the expansion slot with the SG-1000 version.
@ -957,22 +945,19 @@ void sms_state::sg1000m3(machine_config &config)
m_has_jpn_sms_cart_slot = true; m_has_jpn_sms_cart_slot = true;
} }
void sms_state::gamegear(machine_config &config) void gamegear_state::gamegear(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
Z80(config, m_maincpu, MASTER_CLOCK_GG/9); Z80(config, m_maincpu, MASTER_CLOCK_GG/9);
m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem); m_maincpu->set_addrmap(AS_PROGRAM, &gamegear_state::sms_mem);
m_maincpu->set_addrmap(AS_IO, &sms_state::gg_io); m_maincpu->set_addrmap(AS_IO, &gamegear_state::gg_io);
config.m_minimum_quantum = attotime::from_hz(60); config.m_minimum_quantum = attotime::from_hz(60);
/* video hardware */ /* video hardware */
SCREEN(config, m_main_scr, SCREEN_TYPE_LCD); SCREEN(config, m_main_scr, SCREEN_TYPE_LCD);
screen_gg_raw_params(*m_main_scr, MASTER_CLOCK_GG/6); screen_gg_raw_params(*m_main_scr, MASTER_CLOCK_GG/6);
m_main_scr->set_screen_update(FUNC(sms_state::screen_update_gamegear)); m_main_scr->set_screen_update(FUNC(gamegear_state::screen_update_gamegear));
MCFG_VIDEO_START_OVERRIDE(sms_state,gamegear)
MCFG_VIDEO_RESET_OVERRIDE(sms_state,gamegear)
/* sound hardware */ /* sound hardware */
SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "lspeaker").front_left();
@ -983,7 +968,7 @@ void sms_state::gamegear(machine_config &config)
m_vdp->set_screen(m_main_scr); m_vdp->set_screen(m_main_scr);
m_vdp->set_is_pal(false); m_vdp->set_is_pal(false);
m_vdp->n_int().set_inputline(m_maincpu, 0); m_vdp->n_int().set_inputline(m_maincpu, 0);
m_vdp->vblank().set(FUNC(sms_state::gg_pause_callback)); m_vdp->vblank().set(FUNC(gamegear_state::gg_pause_callback));
m_vdp->add_route(0, "lspeaker", 1.00); m_vdp->add_route(0, "lspeaker", 1.00);
m_vdp->add_route(1, "rspeaker", 1.00); m_vdp->add_route(1, "rspeaker", 1.00);
@ -994,14 +979,14 @@ void sms_state::gamegear(machine_config &config)
GG_EXT_PORT(config, m_port_gg_ext, gg_ext_port_devices, nullptr); GG_EXT_PORT(config, m_port_gg_ext, gg_ext_port_devices, nullptr);
m_port_gg_ext->set_screen_tag(m_main_scr); m_port_gg_ext->set_screen_tag(m_main_scr);
m_port_gg_ext->th_input_handler().set(FUNC(sms_state::gg_ext_th_input)); m_port_gg_ext->th_input_handler().set(FUNC(gamegear_state::gg_ext_th_input));
m_is_gamegear = true; m_is_gamegear = true;
m_has_bios_0400 = true; m_has_bios_0400 = true;
m_has_pwr_led = true; m_has_pwr_led = true;
} }
void sms_state::gamegeaj(machine_config &config) void gamegear_state::gamegeaj(machine_config &config)
{ {
gamegear(config); gamegear(config);
m_ioctrl_region_is_japan = true; m_ioctrl_region_is_japan = true;
@ -1255,22 +1240,22 @@ ROM_END
***************************************************************************/ ***************************************************************************/
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
CONS( 1985, sg1000m3, sms, 0, sg1000m3, sg1000m3, sms_state, empty_init, "Sega", "Mark III", MACHINE_SUPPORTS_SAVE ) CONS( 1985, sg1000m3, sms, 0, sg1000m3, sg1000m3, sms1_state, empty_init, "Sega", "Mark III", MACHINE_SUPPORTS_SAVE )
CONS( 1986, sms1, sms, 0, sms1_ntsc, sms1, sms_state, empty_init, "Sega", "Master System I", MACHINE_SUPPORTS_SAVE ) CONS( 1986, sms1, sms, 0, sms1_ntsc, sms1, sms1_state, empty_init, "Sega", "Master System I", MACHINE_SUPPORTS_SAVE )
CONS( 1986, sms1pal, sms, 0, sms1_pal, sms1, sms_state, empty_init, "Sega", "Master System I (PAL)" , MACHINE_SUPPORTS_SAVE ) CONS( 1986, sms1pal, sms, 0, sms1_pal, sms1, sms1_state, empty_init, "Sega", "Master System I (PAL)" , MACHINE_SUPPORTS_SAVE )
CONS( 1986, smssdisp, sms, 0, sms_sdisp, smssdisp, smssdisp_state, empty_init, "Sega", "Master System Store Display Unit", MACHINE_SUPPORTS_SAVE ) CONS( 1986, smssdisp, sms, 0, sms_sdisp, smssdisp, smssdisp_state, empty_init, "Sega", "Master System Store Display Unit", MACHINE_SUPPORTS_SAVE )
CONS( 1987, smsj, sms, 0, smsj, smsj, sms_state, empty_init, "Sega", "Master System (Japan)", MACHINE_SUPPORTS_SAVE ) CONS( 1987, smsj, sms, 0, smsj, smsj, sms1_state, empty_init, "Sega", "Master System (Japan)", MACHINE_SUPPORTS_SAVE )
CONS( 1990, sms, 0, 0, sms2_ntsc, sms, sms_state, empty_init, "Sega", "Master System II", MACHINE_SUPPORTS_SAVE ) CONS( 1990, sms, 0, 0, sms2_ntsc, sms, sms_state, empty_init, "Sega", "Master System II", MACHINE_SUPPORTS_SAVE )
CONS( 1990, smspal, sms, 0, sms2_pal, sms, sms_state, empty_init, "Sega", "Master System II (PAL)", MACHINE_SUPPORTS_SAVE ) CONS( 1990, smspal, sms, 0, sms2_pal, sms, sms_state, empty_init, "Sega", "Master System II (PAL)", MACHINE_SUPPORTS_SAVE )
CONS( 1989, sms1krfm, sms, 0, smsj, smsj, sms_state, empty_init, "Samsung", "Gam*Boy I (Korea) (FM)", MACHINE_SUPPORTS_SAVE ) CONS( 1989, sms1krfm, sms, 0, smsj, smsj, sms1_state, empty_init, "Samsung", "Gam*Boy I (Korea) (FM)", MACHINE_SUPPORTS_SAVE )
CONS( 19??, sms1kr, sms, 0, sms1_kr, smsj, sms_state, empty_init, "Samsung", "Gam*Boy I (Korea)", MACHINE_SUPPORTS_SAVE ) CONS( 19??, sms1kr, sms, 0, sms1_kr, smsj, sms1_state, empty_init, "Samsung", "Gam*Boy I (Korea)", MACHINE_SUPPORTS_SAVE )
CONS( 1991, smskr, sms, 0, sms2_kr, sms, sms_state, empty_init, "Samsung", "Gam*Boy II (Korea)", MACHINE_SUPPORTS_SAVE ) CONS( 1991, smskr, sms, 0, sms2_kr, sms, sms_state, empty_init, "Samsung", "Gam*Boy II (Korea)", MACHINE_SUPPORTS_SAVE )
CONS( 1989, sms1br, sms, 0, sms1_br, sms1, sms_state, empty_init, "Tec Toy", "Master System I (Brazil)", MACHINE_SUPPORTS_SAVE ) CONS( 1989, sms1br, sms, 0, sms1_br, sms1, sms1_state, empty_init, "Tec Toy", "Master System I (Brazil)", MACHINE_SUPPORTS_SAVE )
CONS( 1991, sms2br, sms, 0, sms1_br, sms1, sms_state, empty_init, "Tec Toy", "Master System II (Brazil)", MACHINE_SUPPORTS_SAVE ) CONS( 1991, sms2br, sms, 0, sms1_br, sms1, sms1_state, empty_init, "Tec Toy", "Master System II (Brazil)", MACHINE_SUPPORTS_SAVE )
CONS( 1992, smsbr, sms, 0, sms3_br, sms, sms_state, empty_init, "Tec Toy", "Master System III Compact (Brazil)", MACHINE_SUPPORTS_SAVE ) CONS( 1992, smsbr, sms, 0, sms3_br, sms, sms_state, empty_init, "Tec Toy", "Master System III Compact (Brazil)", MACHINE_SUPPORTS_SAVE )
CONS( 19??, sms1paln, sms, 0, sms1_paln, sms1, sms_state, empty_init, "Tec Toy", "Master System I (PAL-N)", MACHINE_SUPPORTS_SAVE ) CONS( 19??, sms1paln, sms, 0, sms1_paln, sms1, sms1_state, empty_init, "Tec Toy", "Master System I (PAL-N)", MACHINE_SUPPORTS_SAVE )
CONS( 19??, sms2paln, sms, 0, sms1_paln, sms1, sms_state, empty_init, "Tec Toy", "Master System II (PAL-N)", MACHINE_SUPPORTS_SAVE ) CONS( 19??, sms2paln, sms, 0, sms1_paln, sms1, sms1_state, empty_init, "Tec Toy", "Master System II (PAL-N)", MACHINE_SUPPORTS_SAVE )
CONS( 19??, smspaln, sms, 0, sms3_paln, sms, sms_state, empty_init, "Tec Toy", "Master System III Compact (PAL-N)", MACHINE_SUPPORTS_SAVE ) CONS( 19??, smspaln, sms, 0, sms3_paln, sms, sms_state, empty_init, "Tec Toy", "Master System III Compact (PAL-N)", MACHINE_SUPPORTS_SAVE )
CONS( 1991, gamegear, 0, sms, gamegear, gg, sms_state, empty_init, "Sega", "Game Gear (Europe/America)", MACHINE_SUPPORTS_SAVE ) CONS( 1991, gamegear, 0, sms, gamegear, gg, gamegear_state, empty_init, "Sega", "Game Gear (Europe/America)", MACHINE_SUPPORTS_SAVE )
CONS( 1990, gamegeaj, gamegear, 0, gamegeaj, gg, sms_state, empty_init, "Sega", "Game Gear (Japan)", MACHINE_SUPPORTS_SAVE ) CONS( 1990, gamegeaj, gamegear, 0, gamegeaj, gg, gamegear_state, empty_init, "Sega", "Game Gear (Japan)", MACHINE_SUPPORTS_SAVE )

View File

@ -50,14 +50,10 @@ public:
m_port_reset(*this, "RESET"), m_port_reset(*this, "RESET"),
m_port_rapid(*this, "RAPID"), m_port_rapid(*this, "RAPID"),
m_port_start(*this, "START"), m_port_start(*this, "START"),
m_port_scope(*this, "SEGASCOPE"),
m_port_scope_binocular(*this, "SSCOPE_BINOCULAR"),
m_port_persist(*this, "PERSISTENCE"), m_port_persist(*this, "PERSISTENCE"),
m_led_pwr(*this, "led_pwr"), m_led_pwr(*this, "led_pwr"),
m_region_maincpu(*this, "maincpu"), m_region_maincpu(*this, "maincpu"),
m_mainram(nullptr), m_mainram(nullptr),
m_left_lcd(*this, "left_lcd"),
m_right_lcd(*this, "right_lcd"),
m_is_gamegear(false), m_is_gamegear(false),
m_is_smsj(false), m_is_smsj(false),
m_is_mark_iii(false), m_is_mark_iii(false),
@ -79,28 +75,16 @@ public:
void sms_paln_base(machine_config &config); void sms_paln_base(machine_config &config);
void sms_br_base(machine_config &config); void sms_br_base(machine_config &config);
void sms3_br(machine_config &config); void sms3_br(machine_config &config);
void sg1000m3(machine_config &config);
void smsj(machine_config &config);
void sms1_paln(machine_config &config);
void sms1_ntsc(machine_config &config);
void gamegear(machine_config &config);
void gamegeaj(machine_config &config);
void sms3_paln(machine_config &config); void sms3_paln(machine_config &config);
void sms1_pal(machine_config &config);
void sms2_pal(machine_config &config); void sms2_pal(machine_config &config);
void sms2_kr(machine_config &config); void sms2_kr(machine_config &config);
void sms1_br(machine_config &config);
void sms2_ntsc(machine_config &config); void sms2_ntsc(machine_config &config);
void sms1_kr(machine_config &config);
DECLARE_WRITE_LINE_MEMBER(gg_pause_callback);
uint32_t screen_update_sms(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); uint32_t screen_update_sms(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected: protected:
template <typename X> static void screen_sms_pal_raw_params(screen_device &screen, X &&pixelclock); template <typename X> static void screen_sms_pal_raw_params(screen_device &screen, X &&pixelclock);
template <typename X> static void screen_sms_ntsc_raw_params(screen_device &screen, X &&pixelclock); template <typename X> static void screen_sms_ntsc_raw_params(screen_device &screen, X &&pixelclock);
template <typename X> static void screen_gg_raw_params(screen_device &screen, X &&pixelclock);
DECLARE_READ8_MEMBER(read_0000); DECLARE_READ8_MEMBER(read_0000);
DECLARE_READ8_MEMBER(read_4000); DECLARE_READ8_MEMBER(read_4000);
@ -116,39 +100,18 @@ protected:
DECLARE_READ8_MEMBER(sms_count_r); DECLARE_READ8_MEMBER(sms_count_r);
DECLARE_READ8_MEMBER(sms_input_port_dc_r); DECLARE_READ8_MEMBER(sms_input_port_dc_r);
DECLARE_READ8_MEMBER(sms_input_port_dd_r); DECLARE_READ8_MEMBER(sms_input_port_dd_r);
DECLARE_READ8_MEMBER(gg_input_port_00_r);
DECLARE_READ8_MEMBER(sg1000m3_peripheral_r); DECLARE_READ8_MEMBER(sg1000m3_peripheral_r);
DECLARE_WRITE8_MEMBER(sg1000m3_peripheral_w); DECLARE_WRITE8_MEMBER(sg1000m3_peripheral_w);
DECLARE_READ8_MEMBER(gg_sio_r);
DECLARE_WRITE8_MEMBER(gg_sio_w);
DECLARE_WRITE8_MEMBER(gg_psg_stereo_w);
DECLARE_READ8_MEMBER(smsj_audio_control_r); DECLARE_READ8_MEMBER(smsj_audio_control_r);
DECLARE_WRITE8_MEMBER(smsj_audio_control_w); DECLARE_WRITE8_MEMBER(smsj_audio_control_w);
DECLARE_WRITE8_MEMBER(smsj_ym2413_register_port_w); DECLARE_WRITE8_MEMBER(smsj_ym2413_register_port_w);
DECLARE_WRITE8_MEMBER(smsj_ym2413_data_port_w); DECLARE_WRITE8_MEMBER(smsj_ym2413_data_port_w);
DECLARE_READ8_MEMBER(sms_sscope_r);
DECLARE_WRITE8_MEMBER(sms_sscope_w);
DECLARE_WRITE_LINE_MEMBER(sms_n_csync_callback); DECLARE_WRITE_LINE_MEMBER(rapid_n_csync_callback);
DECLARE_WRITE_LINE_MEMBER(sms_ctrl1_th_input); DECLARE_WRITE_LINE_MEMBER(sms_ctrl1_th_input);
DECLARE_WRITE_LINE_MEMBER(sms_ctrl2_th_input); DECLARE_WRITE_LINE_MEMBER(sms_ctrl2_th_input);
DECLARE_WRITE_LINE_MEMBER(gg_ext_th_input);
DECLARE_VIDEO_START(gamegear);
DECLARE_VIDEO_RESET(gamegear);
DECLARE_VIDEO_START(sms1);
DECLARE_VIDEO_RESET(sms1);
uint32_t screen_update_sms1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_sms1_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_sms1_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_gamegear(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void screen_gg_sms_mode_scaling(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
DECLARE_WRITE_LINE_MEMBER(screen_vblank_sms1);
void gg_io(address_map &map);
void sg1000m3_io(address_map &map); void sg1000m3_io(address_map &map);
void sms1_mem(address_map &map);
void sms_io(address_map &map); void sms_io(address_map &map);
void sms_mem(address_map &map); void sms_mem(address_map &map);
void smsj_io(address_map &map); void smsj_io(address_map &map);
@ -178,8 +141,6 @@ protected:
optional_ioport m_port_reset; optional_ioport m_port_reset;
optional_ioport m_port_rapid; optional_ioport m_port_rapid;
optional_ioport m_port_start; optional_ioport m_port_start;
optional_ioport m_port_scope;
optional_ioport m_port_scope_binocular;
optional_ioport m_port_persist; optional_ioport m_port_persist;
output_finder<> m_led_pwr; output_finder<> m_led_pwr;
@ -189,22 +150,10 @@ protected:
std::unique_ptr<uint8_t[]> m_mainram; std::unique_ptr<uint8_t[]> m_mainram;
uint8_t *m_BIOS; uint8_t *m_BIOS;
// for 3D glass binocular hack
optional_device<screen_device> m_left_lcd;
optional_device<screen_device> m_right_lcd;
bitmap_rgb32 m_prevleft_bitmap;
bitmap_rgb32 m_prevright_bitmap;
// for gamegear LCD persistence hack // for gamegear LCD persistence hack
bitmap_rgb32 m_prev_bitmap; bitmap_rgb32 m_prev_bitmap;
bool m_prev_bitmap_copied; bool m_prev_bitmap_copied;
// for gamegear SMS mode scaling
bitmap_rgb32 m_gg_sms_mode_bitmap;
// line_buffer will be used to hold 4 lines of line data as a kind of cache for
// vertical scaling in the gamegear sms compatibility mode.
std::unique_ptr<int[]> m_line_buffer;
// model identifiers // model identifiers
bool m_is_gamegear; bool m_is_gamegear;
bool m_is_smsj; bool m_is_smsj;
@ -227,8 +176,6 @@ protected:
uint8_t m_smsj_audio_control; uint8_t m_smsj_audio_control;
uint8_t m_port_dc_reg; uint8_t m_port_dc_reg;
uint8_t m_port_dd_reg; uint8_t m_port_dd_reg;
uint8_t m_gg_sio[5];
int m_gg_paused;
uint8_t m_ctrl1_th_state; uint8_t m_ctrl1_th_state;
uint8_t m_ctrl2_th_state; uint8_t m_ctrl2_th_state;
@ -240,10 +187,6 @@ protected:
emu_timer *m_lphaser_th_timer; emu_timer *m_lphaser_th_timer;
TIMER_CALLBACK_MEMBER(lphaser_th_generate); TIMER_CALLBACK_MEMBER(lphaser_th_generate);
// Data needed for SegaScope (3D glasses)
uint8_t m_sscope_state;
uint8_t m_frame_sscope_state;
// Data needed for Rapid button (smsj, sms1kr, sms1krfm) // Data needed for Rapid button (smsj, sms1kr, sms1krfm)
uint16_t m_csync_counter; uint16_t m_csync_counter;
uint8_t m_rapid_mode; uint8_t m_rapid_mode;
@ -259,11 +202,57 @@ protected:
optional_device<sg1000_expansion_slot_device> m_sgexpslot; optional_device<sg1000_expansion_slot_device> m_sgexpslot;
}; };
class smssdisp_state : public sms_state class sms1_state : public sms_state
{
public:
sms1_state(const machine_config &mconfig, device_type type, const char *tag) :
sms_state(mconfig, type, tag),
m_left_lcd(*this, "left_lcd"),
m_right_lcd(*this, "right_lcd"),
m_port_scope(*this, "SEGASCOPE"),
m_port_scope_binocular(*this, "SSCOPE_BINOCULAR")
{ }
void sms1_paln(machine_config &config);
void sms1_ntsc(machine_config &config);
void sms1_pal(machine_config &config);
void sms1_br(machine_config &config);
void sms1_kr(machine_config &config);
void smsj(machine_config &config);
void sg1000m3(machine_config &config);
protected:
virtual void video_start() override;
virtual void video_reset() override;
private:
DECLARE_READ8_MEMBER(sscope_r);
DECLARE_WRITE8_MEMBER(sscope_w);
DECLARE_WRITE_LINE_MEMBER(sscope_vblank);
uint32_t screen_update_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void sms1_mem(address_map &map);
// for 3D glass binocular hack
required_device<screen_device> m_left_lcd;
required_device<screen_device> m_right_lcd;
required_ioport m_port_scope;
required_ioport m_port_scope_binocular;
bitmap_rgb32 m_prevleft_bitmap;
bitmap_rgb32 m_prevright_bitmap;
// Data needed for SegaScope (3D glasses)
uint8_t m_sscope_state;
uint8_t m_frame_sscope_state;
};
class smssdisp_state : public sms1_state
{ {
public: public:
smssdisp_state(const machine_config &mconfig, device_type type, const char *tag) : smssdisp_state(const machine_config &mconfig, device_type type, const char *tag) :
sms_state(mconfig, type, tag), sms1_state(mconfig, type, tag),
m_control_cpu(*this, "control"), m_control_cpu(*this, "control"),
m_slots(*this, {"slot", "slot2", "slot3", "slot4", "slot5", "slot6", "slot7", "slot8", "slot9", "slot10", "slot11", "slot12", "slot13", "slot14", "slot15", "slot16"}), m_slots(*this, {"slot", "slot2", "slot3", "slot4", "slot5", "slot6", "slot7", "slot8", "slot9", "slot10", "slot11", "slot12", "slot13", "slot14", "slot15", "slot16"}),
m_cards(*this, "slot%u", 17U), m_cards(*this, "slot%u", 17U),
@ -296,6 +285,48 @@ private:
uint8_t m_store_cart_selection_data; uint8_t m_store_cart_selection_data;
}; };
class gamegear_state : public sms_state
{
public:
gamegear_state(const machine_config &mconfig, device_type type, const char *tag) :
sms_state(mconfig, type, tag)
{ }
void gamegear(machine_config &config);
void gamegeaj(machine_config &config);
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
virtual void video_reset() override;
private:
template <typename X> static void screen_gg_raw_params(screen_device &screen, X &&pixelclock);
DECLARE_READ8_MEMBER(gg_input_port_00_r);
DECLARE_READ8_MEMBER(gg_sio_r);
DECLARE_WRITE8_MEMBER(gg_sio_w);
DECLARE_WRITE8_MEMBER(gg_psg_stereo_w);
DECLARE_WRITE_LINE_MEMBER(gg_pause_callback);
DECLARE_WRITE_LINE_MEMBER(gg_ext_th_input);
uint32_t screen_update_gamegear(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void screen_gg_sms_mode_scaling(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void gg_io(address_map &map);
// for gamegear SMS mode scaling
bitmap_rgb32 m_gg_sms_mode_bitmap;
// line_buffer will be used to hold 4 lines of line data as a kind of cache for
// vertical scaling in the gamegear sms compatibility mode.
std::unique_ptr<int[]> m_line_buffer;
uint8_t m_gg_sio[5];
int m_gg_paused;
};
/*----------- defined in machine/sms.c -----------*/ /*----------- defined in machine/sms.c -----------*/

View File

@ -72,7 +72,7 @@ WRITE_LINE_MEMBER(sms_state::sms_ctrl2_th_input)
} }
WRITE_LINE_MEMBER(sms_state::gg_ext_th_input) WRITE_LINE_MEMBER(gamegear_state::gg_ext_th_input)
{ {
if (!(m_cartslot->exists() && m_cartslot->get_sms_mode())) if (!(m_cartslot->exists() && m_cartslot->get_sms_mode()))
return; return;
@ -218,7 +218,7 @@ READ8_MEMBER(sms_state::sms_count_r)
/* /*
If the gamegear is in sms mode, the start button performs the pause function. If the gamegear is in sms mode, the start button performs the pause function.
*/ */
WRITE_LINE_MEMBER(sms_state::gg_pause_callback) WRITE_LINE_MEMBER(gamegear_state::gg_pause_callback)
{ {
if (!state) if (!state)
{ {
@ -248,7 +248,7 @@ WRITE_LINE_MEMBER(sms_state::gg_pause_callback)
} }
WRITE_LINE_MEMBER(sms_state::sms_n_csync_callback) WRITE_LINE_MEMBER(sms_state::rapid_n_csync_callback)
{ {
if (m_port_rapid.found()) if (m_port_rapid.found())
{ {
@ -528,7 +528,7 @@ WRITE8_MEMBER(sms_state::smsj_ym2413_data_port_w)
} }
WRITE8_MEMBER(sms_state::gg_psg_stereo_w) WRITE8_MEMBER(gamegear_state::gg_psg_stereo_w)
{ {
if (m_cartslot->exists() && m_cartslot->get_sms_mode()) if (m_cartslot->exists() && m_cartslot->get_sms_mode())
return; return;
@ -537,7 +537,7 @@ WRITE8_MEMBER(sms_state::gg_psg_stereo_w)
} }
READ8_MEMBER(sms_state::gg_input_port_00_r) READ8_MEMBER(gamegear_state::gg_input_port_00_r)
{ {
if (m_cartslot->exists() && m_cartslot->get_sms_mode()) if (m_cartslot->exists() && m_cartslot->get_sms_mode())
return 0xff; return 0xff;
@ -557,7 +557,7 @@ READ8_MEMBER(sms_state::gg_input_port_00_r)
} }
READ8_MEMBER(sms_state::sms_sscope_r) READ8_MEMBER(sms1_state::sscope_r)
{ {
int sscope = m_port_scope->read(); int sscope = m_port_scope->read();
@ -574,7 +574,7 @@ READ8_MEMBER(sms_state::sms_sscope_r)
} }
WRITE8_MEMBER(sms_state::sms_sscope_w) WRITE8_MEMBER(sms1_state::sscope_w)
{ {
write_ram(space, 0x3ff8 + offset, data); write_ram(space, 0x3ff8 + offset, data);
@ -829,7 +829,7 @@ WRITE8_MEMBER(sms_state::sg1000m3_peripheral_w)
} }
WRITE8_MEMBER(sms_state::gg_sio_w) WRITE8_MEMBER(gamegear_state::gg_sio_w)
{ {
if (m_cartslot->exists() && m_cartslot->get_sms_mode()) if (m_cartslot->exists() && m_cartslot->get_sms_mode())
return; return;
@ -857,7 +857,7 @@ WRITE8_MEMBER(sms_state::gg_sio_w)
} }
READ8_MEMBER(sms_state::gg_sio_r) READ8_MEMBER(gamegear_state::gg_sio_r)
{ {
if (m_cartslot->exists() && m_cartslot->get_sms_mode()) if (m_cartslot->exists() && m_cartslot->get_sms_mode())
return 0xff; return 0xff;
@ -1051,7 +1051,6 @@ void sms_state::machine_start()
m_lphaser_th_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sms_state::lphaser_th_generate),this)); m_lphaser_th_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(sms_state::lphaser_th_generate),this));
save_item(NAME(m_gg_paused));
save_item(NAME(m_mapper)); save_item(NAME(m_mapper));
save_item(NAME(m_port_dc_reg)); save_item(NAME(m_port_dc_reg));
save_item(NAME(m_port_dd_reg)); save_item(NAME(m_port_dd_reg));
@ -1083,16 +1082,6 @@ void sms_state::machine_start()
save_item(NAME(m_lphaser_x_offs)); save_item(NAME(m_lphaser_x_offs));
} }
if (m_is_gamegear)
{
save_item(NAME(m_gg_sio));
// The game Ecco requires SP to be initialized, so, to run on a BIOS-less Game
// Gear, probably a custom chip like the 315-5378 does the initialization, as
// done by the 315-5342 chip on the Power Base Converter for Sega Genesis/MD.
// Reference: http://www.smspower.org/forums/14084-PowerBaseConverterInfo
m_maincpu->set_state_int(Z80_SP, 0xdff0);
}
if (m_cartslot) if (m_cartslot)
m_cartslot->save_ram(); m_cartslot->save_ram();
} }
@ -1105,6 +1094,20 @@ void smssdisp_state::machine_start()
save_item(NAME(m_store_cart_selection_data)); save_item(NAME(m_store_cart_selection_data));
} }
void gamegear_state::machine_start()
{
sms_state::machine_start();
save_item(NAME(m_gg_paused));
save_item(NAME(m_gg_sio));
// The game Ecco requires SP to be initialized, so, to run on a BIOS-less Game
// Gear, probably a custom chip like the 315-5378 does the initialization, as
// done by the 315-5342 chip on the Power Base Converter for Sega Genesis/MD.
// Reference: http://www.smspower.org/forums/14084-PowerBaseConverterInfo
m_maincpu->set_state_int(Z80_SP, 0xdff0);
}
void sms_state::machine_reset() void sms_state::machine_reset()
{ {
if (m_is_smsj) if (m_is_smsj)
@ -1133,7 +1136,20 @@ void sms_state::machine_reset()
m_ctrl2_th_state = 1; m_ctrl2_th_state = 1;
} }
if (m_is_gamegear) setup_bios();
setup_media_slots();
}
void smssdisp_state::machine_reset()
{
m_store_control = 0;
m_store_cart_selection_data = 0;
store_select_cart(m_store_cart_selection_data);
sms_state::machine_reset();
}
void gamegear_state::machine_reset()
{ {
if (m_cartslot->exists() && m_cartslot->get_sms_mode()) if (m_cartslot->exists() && m_cartslot->get_sms_mode())
m_vdp->set_sega315_5124_compatibility_mode(true); m_vdp->set_sega315_5124_compatibility_mode(true);
@ -1144,17 +1160,6 @@ void sms_state::machine_reset()
m_gg_sio[2] = 0x00; m_gg_sio[2] = 0x00;
m_gg_sio[3] = 0xff; m_gg_sio[3] = 0xff;
m_gg_sio[4] = 0x00; m_gg_sio[4] = 0x00;
}
setup_bios();
setup_media_slots();
}
void smssdisp_state::machine_reset()
{
m_store_control = 0;
m_store_cart_selection_data = 0;
store_select_cart(m_store_cart_selection_data);
sms_state::machine_reset(); sms_state::machine_reset();
} }
@ -1239,7 +1244,7 @@ WRITE_LINE_MEMBER(smssdisp_state::sms_store_int_callback)
} }
VIDEO_START_MEMBER(sms_state,sms1) void sms1_state::video_start()
{ {
m_main_scr->register_screen_bitmap(m_prevleft_bitmap); m_main_scr->register_screen_bitmap(m_prevleft_bitmap);
m_main_scr->register_screen_bitmap(m_prevright_bitmap); m_main_scr->register_screen_bitmap(m_prevright_bitmap);
@ -1253,7 +1258,7 @@ VIDEO_START_MEMBER(sms_state,sms1)
} }
VIDEO_RESET_MEMBER(sms_state,sms1) void sms1_state::video_reset()
{ {
if (m_port_scope->read()) if (m_port_scope->read())
{ {
@ -1270,7 +1275,7 @@ VIDEO_RESET_MEMBER(sms_state,sms1)
} }
WRITE_LINE_MEMBER(sms_state::screen_vblank_sms1) WRITE_LINE_MEMBER(sms1_state::sscope_vblank)
{ {
// on falling edge // on falling edge
if (!state) if (!state)
@ -1285,13 +1290,7 @@ WRITE_LINE_MEMBER(sms_state::screen_vblank_sms1)
} }
} }
uint32_t sms_state::screen_update_sms1(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) uint32_t sms1_state::screen_update_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
m_vdp->screen_update(screen, bitmap, cliprect);
return 0;
}
uint32_t sms_state::screen_update_sms1_left(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
uint8_t sscope = m_port_scope->read(); uint8_t sscope = m_port_scope->read();
@ -1321,7 +1320,7 @@ uint32_t sms_state::screen_update_sms1_left(screen_device &screen, bitmap_rgb32
return 0; return 0;
} }
uint32_t sms_state::screen_update_sms1_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) uint32_t sms1_state::screen_update_right(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
uint8_t sscope = m_port_scope->read(); uint8_t sscope = m_port_scope->read();
@ -1357,7 +1356,7 @@ uint32_t sms_state::screen_update_sms(screen_device &screen, bitmap_rgb32 &bitma
return 0; return 0;
} }
VIDEO_START_MEMBER(sms_state,gamegear) void gamegear_state::video_start()
{ {
m_prev_bitmap_copied = false; m_prev_bitmap_copied = false;
m_main_scr->register_screen_bitmap(m_prev_bitmap); m_main_scr->register_screen_bitmap(m_prev_bitmap);
@ -1370,7 +1369,7 @@ VIDEO_START_MEMBER(sms_state,gamegear)
save_pointer(NAME(m_line_buffer), 160 * 4); save_pointer(NAME(m_line_buffer), 160 * 4);
} }
VIDEO_RESET_MEMBER(sms_state,gamegear) void gamegear_state::video_reset()
{ {
if (m_prev_bitmap_copied) if (m_prev_bitmap_copied)
{ {
@ -1385,7 +1384,7 @@ VIDEO_RESET_MEMBER(sms_state,gamegear)
} }
void sms_state::screen_gg_sms_mode_scaling(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) void gamegear_state::screen_gg_sms_mode_scaling(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
bitmap_rgb32 &vdp_bitmap = m_vdp->get_bitmap(); bitmap_rgb32 &vdp_bitmap = m_vdp->get_bitmap();
const rectangle visarea = screen.visible_area(); const rectangle visarea = screen.visible_area();
@ -1522,7 +1521,7 @@ void sms_state::screen_gg_sms_mode_scaling(screen_device &screen, bitmap_rgb32 &
} }
uint32_t sms_state::screen_update_gamegear(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) uint32_t gamegear_state::screen_update_gamegear(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{ {
bitmap_rgb32 *source_bitmap; bitmap_rgb32 *source_bitmap;