add a genesis model which runs the bios code as a clone (nw)

This commit is contained in:
David Haywood 2015-12-27 15:55:08 +00:00
parent 2e9fa84503
commit ed7632f99d
4 changed files with 71 additions and 6 deletions

View File

@ -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 )

View File

@ -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<sega_32x_device> m_32x;
optional_device<sega_segacd_device> m_segacd;
optional_device<md_cart_slot_device> m_cart;
optional_region_ptr<UINT16> 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);
};

View File

@ -56,6 +56,7 @@ public:
required_device<sn76496_base_device> m_snsnd;
optional_shared_ptr<UINT16> m_megadrive_ram;
ioport_port *m_io_reset;
ioport_port *m_io_pad_3b[4];
ioport_port *m_io_pad_6b[4];

View File

@ -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)