From ed7632f99d3a1b91a2e0ec98053a7d63617e74ef Mon Sep 17 00:00:00 2001 From: David Haywood Date: Sun, 27 Dec 2015 15:55:08 +0000 Subject: [PATCH] add a genesis model which runs the bios code as a clone (nw) --- src/mame/drivers/megadriv.cpp | 66 ++++++++++++++++++++++++++++++++--- src/mame/includes/md_cons.h | 9 ++++- src/mame/includes/megadriv.h | 1 + src/mame/mess.lst | 1 + 4 files changed, 71 insertions(+), 6 deletions(-) diff --git a/src/mame/drivers/megadriv.cpp b/src/mame/drivers/megadriv.cpp index e74b324b447..c6f24554b73 100644 --- a/src/mame/drivers/megadriv.cpp +++ b/src/mame/drivers/megadriv.cpp @@ -274,6 +274,46 @@ MACHINE_START_MEMBER(md_cons_state, md_common) m_cart->save_nvram(); } +void md_cons_state::install_cartslot() +{ + // for now m_cartslot is only in MD and not 32x and SegaCD + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)m_cart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a13),(base_md_cart_slot_device*)m_cart), write16_delegate(FUNC(base_md_cart_slot_device::write_a13),(base_md_cart_slot_device*)m_cart)); + m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)m_cart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)m_cart)); +// m_maincpu->space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)m_cart)); +} + +READ16_MEMBER( md_cons_state::tmss_r ) +{ + if (offset < 0x4000 / 2) + return m_tmss[offset]; + + return 0xffff; +} + +WRITE16_MEMBER( md_cons_state::tmss_swap_w ) +{ + if (data & 0x0001) + { + install_cartslot(); + m_maincpu->space(AS_PROGRAM).install_write_handler(0xa14100, 0xa14101, write16_delegate(FUNC(md_cons_state::tmss_swap_w),this)); + } + else + { + install_tmss(); + } +} + + +void md_cons_state::install_tmss() +{ + m_maincpu->space(AS_PROGRAM).unmap_readwrite(0x000000, 0x7fffff); + m_maincpu->space(AS_PROGRAM).install_read_handler(0x000000, 0x7fffff, read16_delegate(FUNC(md_cons_state::tmss_r),this)); + + m_maincpu->space(AS_PROGRAM).install_write_handler(0xa14100, 0xa14101, write16_delegate(FUNC(md_cons_state::tmss_swap_w),this)); + +} + MACHINE_START_MEMBER(md_cons_state, ms_megadriv) { MACHINE_START_CALL_MEMBER( md_common ); @@ -282,11 +322,16 @@ MACHINE_START_MEMBER(md_cons_state, ms_megadriv) if (m_cart->get_type() == SEGA_SVP) m_vdp->set_dma_delay(2); - // for now m_cartslot is only in MD and not 32x and SegaCD - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x000000, 0x7fffff, read16_delegate(FUNC(base_md_cart_slot_device::read),(base_md_cart_slot_device*)m_cart), write16_delegate(FUNC(base_md_cart_slot_device::write),(base_md_cart_slot_device*)m_cart)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa13000, 0xa130ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a13),(base_md_cart_slot_device*)m_cart), write16_delegate(FUNC(base_md_cart_slot_device::write_a13),(base_md_cart_slot_device*)m_cart)); - m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0xa15000, 0xa150ff, read16_delegate(FUNC(base_md_cart_slot_device::read_a15),(base_md_cart_slot_device*)m_cart), write16_delegate(FUNC(base_md_cart_slot_device::write_a15),(base_md_cart_slot_device*)m_cart)); - m_maincpu->space(AS_PROGRAM).install_write_handler(0xa14000, 0xa14003, write16_delegate(FUNC(base_md_cart_slot_device::write_tmss_bank),(base_md_cart_slot_device*)m_cart)); + if (m_tmss) + { + install_tmss(); + } + else + { + install_cartslot(); + } + + } MACHINE_START_MEMBER(md_cons_state, ms_megacd) @@ -388,6 +433,13 @@ ROM_START(megadrij) ROM_REGION( 0x10000, "soundcpu", ROMREGION_ERASEFF) ROM_END +ROM_START(genesis_tmss) + ROM_REGION(MD_CPU_REGION_SIZE, "maincpu", ROMREGION_ERASEFF) + ROM_REGION( 0x10000, "soundcpu", ROMREGION_ERASEFF) + + ROM_REGION16_BE(0x4000, "tmss", ROMREGION_ERASEFF) + ROM_LOAD( "tmss_usa.bin", 0x0000, 0x4000, CRC(5f5e64eb) SHA1(453fca4e1db6fae4a10657c4451bccbb71955628) ) +ROM_END /************************************* * @@ -1005,6 +1057,10 @@ CONS( 1989, genesis, 0, 0, ms_megadriv, md, md_cons_state, CONS( 1990, megadriv, genesis, 0, ms_megadpal, md, md_cons_state, md_eur, "Sega", "Mega Drive (Europe, PAL)", MACHINE_SUPPORTS_SAVE ) CONS( 1988, megadrij, genesis, 0, ms_megadriv, md, md_cons_state, md_jpn, "Sega", "Mega Drive (Japan, NTSC)", MACHINE_SUPPORTS_SAVE ) +// 1990+ models had the TMSS security chip, leave this as a clone, it reduces compatibility and nothing more. +CONS( 1990, genesis_tmss, genesis, 0, ms_megadriv, md, md_cons_state, genesis, "Sega", "Genesis (USA, NTSC, with TMSS chip)", MACHINE_SUPPORTS_SAVE ) + + // the 32X plugged in the cart slot, games plugged into the 32x. Maybe it should be handled as an expansion device? CONS( 1994, 32x, 0, 0, genesis_32x, md, md_cons_state, genesis, "Sega", "Genesis with 32X (USA, NTSC)", MACHINE_NOT_WORKING ) CONS( 1994, 32xe, 32x, 0, md_32x, md, md_cons_state, md_eur, "Sega", "Mega Drive with 32X (Europe, PAL)", MACHINE_NOT_WORKING ) diff --git a/src/mame/includes/md_cons.h b/src/mame/includes/md_cons.h index b2904a4134a..f7fc4e5054c 100644 --- a/src/mame/includes/md_cons.h +++ b/src/mame/includes/md_cons.h @@ -15,7 +15,8 @@ public: : md_base_state(mconfig, type, tag), m_32x(*this,"sega32x"), m_segacd(*this,"segacd"), - m_cart(*this, "mdslot") + m_cart(*this, "mdslot"), + m_tmss(*this, "tmss") { } ioport_port *m_io_ctrlr; @@ -25,6 +26,7 @@ public: optional_device m_32x; optional_device m_segacd; optional_device m_cart; + optional_region_ptr m_tmss; DECLARE_DRIVER_INIT(mess_md_common); DECLARE_DRIVER_INIT(genesis); @@ -46,4 +48,9 @@ public: void _32x_scanline_callback(int x, UINT32 priority, UINT16 &lineptr); void _32x_interrupt_callback(int scanline, int irq6); void _32x_scanline_helper_callback(int scanline); + + void install_cartslot(); + void install_tmss(); + DECLARE_READ16_MEMBER(tmss_r); + DECLARE_WRITE16_MEMBER(tmss_swap_w); }; diff --git a/src/mame/includes/megadriv.h b/src/mame/includes/megadriv.h index 6a70543beab..b2461c802c5 100644 --- a/src/mame/includes/megadriv.h +++ b/src/mame/includes/megadriv.h @@ -56,6 +56,7 @@ public: required_device m_snsnd; optional_shared_ptr m_megadrive_ram; + ioport_port *m_io_reset; ioport_port *m_io_pad_3b[4]; ioport_port *m_io_pad_6b[4]; diff --git a/src/mame/mess.lst b/src/mame/mess.lst index ba493989989..9ca74808a83 100644 --- a/src/mame/mess.lst +++ b/src/mame/mess.lst @@ -77,6 +77,7 @@ smssdisp // Sega Master System Store Display Unit megadrij // 1988 Sega Mega Drive (Japan) genesis // 1989 Sega Genesis (USA) megadriv // 1990 Sega Mega Drive (Europe) +genesis_tmss // pico // 1994 Sega Pico (Europe) picou // 1994 Sega Pico (USA) picoj // 1993 Sega Pico (Japan)