diff options
Diffstat (limited to 'src/mame/sega/sms.cpp')
-rw-r--r-- | src/mame/sega/sms.cpp | 100 |
1 files changed, 60 insertions, 40 deletions
diff --git a/src/mame/sega/sms.cpp b/src/mame/sega/sms.cpp index c471fffc943..212f311bd93 100644 --- a/src/mame/sega/sms.cpp +++ b/src/mame/sega/sms.cpp @@ -245,6 +245,7 @@ DC00 - Selection buttons #2, 9-16 (R) #include "emu.h" #include "sms.h" +#include "bus/sms_ctrl/controllers.h" #include "cpu/z80/z80.h" #include "softlist_dev.h" #include "speaker.h" @@ -296,20 +297,22 @@ void smssdisp_state::sms_store_mem(address_map &map) } // I/O ports $3E and $3F do not exist on Mark III -void sms_state::sg1000m3_io(address_map &map) +void sg1000m3_state::sg1000m3_io(address_map &map) { map.global_mask(0xff); map.unmap_value_high(); - map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w)); + + map(0x40, 0x7f).r(FUNC(sg1000m3_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(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write)); - map(0xc0, 0xc7).mirror(0x38).rw(FUNC(sms_state::sg1000m3_peripheral_r), FUNC(sms_state::sg1000m3_peripheral_w)); + map(0xc0, 0xc7).mirror(0x38).rw(FUNC(sg1000m3_state::sg1000m3_peripheral_r), FUNC(sg1000m3_state::sg1000m3_peripheral_w)); } void sms_state::sms_io(address_map &map) { map.global_mask(0xff); map.unmap_value_high(); + map(0x00, 0x00).mirror(0x3e).w(FUNC(sms_state::sms_mem_control_w)); map(0x01, 0x01).mirror(0x3e).w(FUNC(sms_state::sms_io_control_w)); map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w)); @@ -320,14 +323,14 @@ void sms_state::sms_io(address_map &map) } -// It seems the Korean versions do some more strict decoding on the I/O -// addresses. +// It seems the Korean versions do some more strict decoding on the I/O addresses. // At least the mirrors for I/O ports $3E/$3F don't seem to exist there. // Leaving the mirrors breaks the Korean cartridge bublboky. void sms_state::smskr_io(address_map &map) { map.global_mask(0xff); map.unmap_value_high(); + map(0x3e, 0x3e).w(FUNC(sms_state::sms_mem_control_w)); map(0x3f, 0x3f).w(FUNC(sms_state::sms_io_control_w)); map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w)); @@ -344,6 +347,7 @@ void sms_state::smsj_io(address_map &map) { map.global_mask(0xff); map.unmap_value_high(); + map(0x3e, 0x3e).w(FUNC(sms_state::sms_mem_control_w)); map(0x3f, 0x3f).w(FUNC(sms_state::sms_io_control_w)); map(0x40, 0x7f).r(FUNC(sms_state::sms_count_r)).w(m_vdp, FUNC(sega315_5124_device::psg_w)); @@ -365,18 +369,29 @@ void gamegear_state::gg_io(address_map &map) { map.global_mask(0xff); map.unmap_value_high(); - map(0x00, 0x00).r(FUNC(gamegear_state::gg_input_port_00_r)); - map(0x01, 0x05).rw(FUNC(gamegear_state::gg_sio_r), FUNC(gamegear_state::gg_sio_w)); - map(0x06, 0x06).w(FUNC(gamegear_state::gg_psg_stereo_w)); - map(0x3e, 0x3e).w(FUNC(gamegear_state::sms_mem_control_w)); - map(0x3f, 0x3f).w(FUNC(gamegear_state::sms_io_control_w)); + + map(0x3e, 0x3e).w(FUNC(gamegear_state::sms_mem_control_w)); // TODO: only really exists in Master System mode 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(0x81, 0x81).mirror(0x3e).rw(m_vdp, FUNC(sega315_5124_device::control_read), FUNC(sega315_5124_device::control_write)); - map(0xc0, 0xc0).r(FUNC(gamegear_state::sms_input_port_dc_r)); - map(0xc1, 0xc1).r(FUNC(gamegear_state::sms_input_port_dd_r)); - map(0xdc, 0xdc).r(FUNC(gamegear_state::sms_input_port_dc_r)); - map(0xdd, 0xdd).r(FUNC(gamegear_state::sms_input_port_dd_r)); + map(0xc0, 0xc0).r(FUNC(gamegear_state::gg_input_port_dc_r)); + map(0xc1, 0xc1).r(FUNC(gamegear_state::gg_input_port_dd_r)); + map(0xdc, 0xdc).r(FUNC(gamegear_state::gg_input_port_dc_r)); + map(0xdd, 0xdd).r(FUNC(gamegear_state::gg_input_port_dd_r)); + + map(0x00, 0x3f).view(m_io_view); + + // Game Gear mode + m_io_view[0](0x00, 0x00).r(FUNC(gamegear_state::gg_input_port_00_r)); + m_io_view[0](0x01, 0x01).rw(m_gg_ioport, FUNC(gamegear_io_port_device::data_r), FUNC(gamegear_io_port_device::data_w)); + m_io_view[0](0x02, 0x02).rw(m_gg_ioport, FUNC(gamegear_io_port_device::ctrl_r), FUNC(gamegear_io_port_device::ctrl_w)); + m_io_view[0](0x03, 0x03).rw(m_gg_ioport, FUNC(gamegear_io_port_device::txdata_r), FUNC(gamegear_io_port_device::txdata_w)); + m_io_view[0](0x04, 0x04).r(m_gg_ioport, FUNC(gamegear_io_port_device::rxdata_r)); + m_io_view[0](0x05, 0x05).rw(m_gg_ioport, FUNC(gamegear_io_port_device::s_ctrl_r), FUNC(gamegear_io_port_device::s_ctrl_w)); + m_io_view[0](0x06, 0x06).w(m_vdp, FUNC(sega315_5124_device::psg_stereo_w)); + + // Master System mode + m_io_view[1](0x3f, 0x3f).w(FUNC(gamegear_state::gg_io_control_w)); } @@ -483,7 +498,7 @@ static INPUT_PORTS_START( gg ) PORT_START("START") PORT_BIT( 0x7f, IP_ACTIVE_LOW, IPT_UNUSED ) - PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Start") /* Game Gear START */ + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START ) PORT_NAME("Start") PORT_START("PERSISTENCE") PORT_CONFNAME( 0x01, 0x01, "LCD Persistence Hack" ) @@ -494,25 +509,25 @@ INPUT_PORTS_END void sms_state::sms_base(machine_config &config) { - /* basic machine hardware */ SPEAKER(config, "mono").front_center(); SMS_CART_SLOT(config, "slot", sms_cart, nullptr); SOFTWARE_LIST(config, "cart_list").set_original("sms"); - SMS_CONTROL_PORT(config, m_port_ctrl1, sms_control_port_devices, "joypad"); - m_port_ctrl1->set_screen_tag(m_main_scr); - m_port_ctrl1->th_input_handler().set(FUNC(sms_state::sms_ctrl1_th_input)); + SMS_CONTROL_PORT(config, m_port_ctrl1, sms_control_port_devices, SMS_CTRL_OPTION_JOYPAD); + m_port_ctrl1->set_screen(m_main_scr); + m_port_ctrl1->th_handler().set(FUNC(sms_state::sms_ctrl1_th_input)); - SMS_CONTROL_PORT(config, m_port_ctrl2, sms_control_port_devices, "joypad"); - m_port_ctrl2->set_screen_tag(m_main_scr); - m_port_ctrl2->th_input_handler().set(FUNC(sms_state::sms_ctrl2_th_input)); + SMS_CONTROL_PORT(config, m_port_ctrl2, sms_control_port_devices, SMS_CTRL_OPTION_JOYPAD); + m_port_ctrl2->set_screen(m_main_scr); + m_port_ctrl2->th_handler().set(FUNC(sms_state::sms_ctrl2_th_input)); } void sms_state::sms_ntsc_base(machine_config &config) { sms_base(config); + Z80(config, m_maincpu, XTAL(10'738'635)/3); m_maincpu->set_addrmap(AS_PROGRAM, &sms_state::sms_mem); m_maincpu->set_addrmap(AS_IO, &sms_state::sms_io); @@ -540,7 +555,7 @@ void sms_state::sms_ntsc_base(machine_config &config) template <typename X> void sms_state::screen_sms_pal_raw_params(screen_device &screen, X &&pixelclock) { - screen.set_raw(std::forward<X>(pixelclock), + screen.set_raw(pixelclock, sega315_5124_device::WIDTH, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH - 2, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 256 + 10, @@ -553,7 +568,7 @@ void sms_state::screen_sms_pal_raw_params(screen_device &screen, X &&pixelclock) template <typename X> void sms_state::screen_sms_ntsc_raw_params(screen_device &screen, X &&pixelclock) { - screen.set_raw(std::forward<X>(pixelclock), + screen.set_raw(pixelclock, sega315_5124_device::WIDTH, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH - 2, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 256 + 10, @@ -566,7 +581,7 @@ void sms_state::screen_sms_ntsc_raw_params(screen_device &screen, X &&pixelclock template <typename X> void gamegear_state::screen_gg_raw_params(screen_device &screen, X &&pixelclock) { - screen.set_raw(std::forward<X>(pixelclock), + screen.set_raw(pixelclock, sega315_5124_device::WIDTH, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 6*8, sega315_5124_device::LBORDER_START + sega315_5124_device::LBORDER_WIDTH + 26*8, @@ -919,11 +934,11 @@ void sms1_state::smsj(machine_config &config) m_is_smsj = true; } -void sms1_state::sg1000m3(machine_config &config) +void sg1000m3_state::sg1000m3(machine_config &config) { sms1_ntsc(config); - m_maincpu->set_addrmap(AS_IO, &sms1_state::sg1000m3_io); + m_maincpu->set_addrmap(AS_IO, &sg1000m3_state::sg1000m3_io); // Remove and reinsert all media slots, as done with the sms1_kr config, // and also replace the expansion slot with the SG-1000 version. @@ -932,13 +947,13 @@ void sms1_state::sg1000m3(machine_config &config) config.device_remove("smsexp"); SG1000MK3_CART_SLOT(config, "slot", sg1000mk3_cart, nullptr); SMS_CARD_SLOT(config, "mycard", sms_cart, nullptr); - SG1000_EXPANSION_SLOT(config, "sgexp", sg1000_expansion_devices, nullptr, false); + SG1000_EXPANSION_SLOT(config, m_sgexpslot, sg1000_expansion_devices, nullptr, false); SOFTWARE_LIST(config, "cart_list2").set_original("sg1000"); // Mark III does not have TH connected. - m_port_ctrl1->th_input_handler().set_nop(); - m_port_ctrl2->th_input_handler().set_nop(); + m_port_ctrl1->th_handler().set_nop(); + m_port_ctrl2->th_handler().set_nop(); m_has_bios_full = false; m_is_mark_iii = true; @@ -977,9 +992,14 @@ void gamegear_state::gamegear(machine_config &config) SOFTWARE_LIST(config, "cart_list").set_original("gamegear"); - 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->th_input_handler().set(FUNC(gamegear_state::gg_ext_th_input)); + GAMEGEAR_IO_PORT(config, m_gg_ioport, 0); + m_gg_ioport->set_in_handler(m_port_gg_ext, FUNC(sms_control_port_device::in_r)); + m_gg_ioport->set_out_handler(m_port_gg_ext, FUNC(sms_control_port_device::out_w)); + m_gg_ioport->hl_handler().set(FUNC(gamegear_state::gg_nmi)); + + SMS_CONTROL_PORT(config, m_port_gg_ext, sms_control_port_devices, nullptr); + m_port_gg_ext->set_screen(m_main_scr); + m_port_gg_ext->th_handler().set(FUNC(gamegear_state::gg_ext_th_input)); m_is_gamegear = true; m_has_bios_0400 = true; @@ -1240,20 +1260,20 @@ ROM_END ***************************************************************************/ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -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, sms1_state, empty_init, "Sega", "Master System I", MACHINE_SUPPORTS_SAVE ) -CONS( 1986, sms1pal, sms, 0, sms1_pal, sms1, sms1_state, empty_init, "Sega", "Master System I (PAL)" , MACHINE_SUPPORTS_SAVE ) +CONS( 1985, sg1000m3, sms, 0, sg1000m3, sg1000m3, sg1000m3_state, empty_init, "Sega", "Mark III", MACHINE_SUPPORTS_SAVE ) +CONS( 1986, sms1, sms, 0, sms1_ntsc, sms1, sms1_state, empty_init, "Sega", "Master System", MACHINE_SUPPORTS_SAVE ) +CONS( 1986, sms1pal, sms, 0, sms1_pal, sms1, sms1_state, empty_init, "Sega", "Master System (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( 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, 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, sms1_state, empty_init, "Samsung", "Gam*Boy I (Korea) (FM)", MACHINE_SUPPORTS_SAVE ) -CONS( 19??, sms1kr, sms, 0, sms1_kr, smsj, sms1_state, empty_init, "Samsung", "Gam*Boy I (Korea)", MACHINE_SUPPORTS_SAVE ) +CONS( 1989, sms1krfm, sms, 0, smsj, smsj, sms1_state, empty_init, "Samsung", "Gam*Boy (Korea) (FM)", MACHINE_SUPPORTS_SAVE ) +CONS( 19??, sms1kr, sms, 0, sms1_kr, smsj, sms1_state, empty_init, "Samsung", "Gam*Boy (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, sms1_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 (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( 19??, sms1paln, sms, 0, sms1_paln, sms1, sms1_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 (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 ) |