summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/megadriv_vt_hybrid.cpp
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2020-10-29 13:53:03 +0000
committer GitHub <noreply@github.com>2020-10-30 00:53:03 +1100
commit2137f269814897db440bd9b14c6643cd59cd2e89 (patch)
treeb78c728ecc2ff901689820b5e95dcb4ad6adab56 /src/mame/drivers/megadriv_vt_hybrid.cpp
parent5f0507bed4677685cec435a4b3dbb826034415c0 (diff)
-Plug and Play work (lots of new sets from Sean etc.) (#7401)
new WORKING machines ----- The New York Times Sudoku [David Haywood, Sean Riddle, Kamaal Brown] Vs Maxx 25-in-1 (VT03 hardware) [David Haywood, Sean Riddle, Kamaal Brown] 6-in-1 Sudoku Plug & Play [David Haywood, Sean Riddle] Plug 'N' Play 50-in-1 (DGUN-853) [David Haywood, Sean Riddle, Kamaal Brown] new WORKING clones ----- Mega Drive Collection Volume 2 (Radica, Arcade Legends) (UK) [David Haywood, Sean Riddle] Super Sonic Gold (Radica Plug & Play) (UK) [David Haywood, Sean Riddle] new NOT WORKING machines ----- Plug 'N' Play 25-in-1 (DGUN-806) [David Haywood, Sean Riddle, Kamaal Brown] IQuest (US) [David Haywood, Sean Riddle, Kamaal Brown] - Added MegaDrive side ROM to sarc110 sets, moved to skeleton 'hybrid' driver based on megadriv_rad.cpp and demoted to not working for now as they're meant to boot from the MD side with the VT03 games as bonus items [Sean Riddle, Team Europe] - Moved reactmd to a skeleton 'hybrid' driver, demoted to not working, it's also meant to boot from the MD side with the SunPlus games as bonus items.
Diffstat (limited to 'src/mame/drivers/megadriv_vt_hybrid.cpp')
-rw-r--r--src/mame/drivers/megadriv_vt_hybrid.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/src/mame/drivers/megadriv_vt_hybrid.cpp b/src/mame/drivers/megadriv_vt_hybrid.cpp
new file mode 100644
index 00000000000..78a9bcd2479
--- /dev/null
+++ b/src/mame/drivers/megadriv_vt_hybrid.cpp
@@ -0,0 +1,164 @@
+// license:BSD-3-Clause
+// copyright-holders:David Haywood
+
+/*
+ This is an enhanced 'Mega Drive / Genesis on a Chip' combined with a VT02/VT03 system for the 'Bonus Games' menu
+
+ The menu for the MD side of things doesn't work as it needs enhanced chipset emulation?
+ at the moment it just boots the game in the lowest ROM bank (Flicky)
+
+ TODO:
+ hook up the VT side again
+
+*/
+
+#include "emu.h"
+#include "includes/megadriv.h"
+
+class megadriv_vt0203_state : public md_base_state
+{
+public:
+ megadriv_vt0203_state(const machine_config &mconfig, device_type type, const char *tag)
+ // Mega Drive part
+ : md_base_state(mconfig, type, tag),
+ m_md_is_running(true),
+ m_bank(0),
+ m_rom(*this, "maincpu")
+ {}
+
+ // Mega Drive part
+ uint16_t read(offs_t offset);
+ void megadriv_vt0203_pal(machine_config &config);
+ void megadriv_vt0203_map(address_map &map);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ bool m_md_is_running;
+
+ // Mega Drive part
+ int m_bank;
+ required_region_ptr<uint16_t> m_rom;
+ uint32_t screen_update_hybrid(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ DECLARE_WRITE_LINE_MEMBER(screen_vblank_hybrid);
+
+};
+
+
+// todo, use actual MD map, easier once maps are part of base class.
+void megadriv_vt0203_state::megadriv_vt0203_map(address_map &map)
+{
+ map(0x000000, 0x3fffff).r(FUNC(megadriv_vt0203_state::read)); /* Cartridge Program Rom */
+ map(0xa00000, 0xa01fff).rw(FUNC(megadriv_vt0203_state::megadriv_68k_read_z80_ram), FUNC(megadriv_vt0203_state::megadriv_68k_write_z80_ram));
+ map(0xa02000, 0xa03fff).w(FUNC(megadriv_vt0203_state::megadriv_68k_write_z80_ram));
+ map(0xa04000, 0xa04003).rw(FUNC(megadriv_vt0203_state::megadriv_68k_YM2612_read), FUNC(megadriv_vt0203_state::megadriv_68k_YM2612_write));
+ map(0xa06000, 0xa06001).w(FUNC(megadriv_vt0203_state::megadriv_68k_z80_bank_write));
+ map(0xa10000, 0xa1001f).rw(FUNC(megadriv_vt0203_state::megadriv_68k_io_read), FUNC(megadriv_vt0203_state::megadriv_68k_io_write));
+ map(0xa11100, 0xa11101).rw(FUNC(megadriv_vt0203_state::megadriv_68k_check_z80_bus), FUNC(megadriv_vt0203_state::megadriv_68k_req_z80_bus));
+ map(0xa11200, 0xa11201).w(FUNC(megadriv_vt0203_state::megadriv_68k_req_z80_reset));
+ map(0xc00000, 0xc0001f).rw(m_vdp, FUNC(sega315_5313_device::vdp_r), FUNC(sega315_5313_device::vdp_w));
+ map(0xe00000, 0xe0ffff).ram().mirror(0x1f0000).share("megadrive_ram");
+}
+
+uint16_t megadriv_vt0203_state::read(offs_t offset)
+{
+ return m_rom[(((m_bank * 0x10000) + (offset << 1)) & (0x400000 - 1))/2];
+}
+
+
+// controller is wired directly into unit, no controller slots
+static INPUT_PORTS_START( megadriv_vt0203 )
+ PORT_INCLUDE( md_common )
+
+ PORT_MODIFY("PAD1")
+#if 0
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 )
+#else
+ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
+#endif
+
+ PORT_MODIFY("PAD2")
+#if 0
+ PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
+ PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START2 )
+##else
+ PORT_BIT( 0x00ff, IP_ACTIVE_LOW, IPT_UNUSED )
+#endif
+INPUT_PORTS_END
+
+
+void megadriv_vt0203_state::machine_start()
+{
+ logerror("megadriv_vt0203_state::machine_start\n");
+ md_base_state::machine_start();
+
+ m_vdp->stop_timers();
+ save_item(NAME(m_bank));
+}
+
+void megadriv_vt0203_state::machine_reset()
+{
+ logerror("megadriv_vt0203_state::machine_reset\n");
+ md_base_state::machine_reset();
+}
+
+uint32_t megadriv_vt0203_state::screen_update_hybrid(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ if (m_md_is_running)
+ {
+ /* Copies a bitmap */
+ return screen_update_megadriv(screen, bitmap, cliprect);
+ }
+
+ return 0;
+}
+
+WRITE_LINE_MEMBER(megadriv_vt0203_state::screen_vblank_hybrid)
+{
+ if (m_md_is_running)
+ {
+ /* Used to Sync the timing */
+ md_base_state::screen_vblank_megadriv(state);
+ }
+}
+
+
+void megadriv_vt0203_state::megadriv_vt0203_pal(machine_config &config)
+{
+ md_pal(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &megadriv_vt0203_state::megadriv_vt0203_map);
+
+ m_screen->set_screen_update(FUNC(megadriv_vt0203_state::screen_update_hybrid));
+ m_screen->screen_vblank().set(FUNC(megadriv_vt0203_state::screen_vblank_hybrid));
+
+ // TODO: add the VT part, this might require refactoring of the VT stuff as the SoC currently contains the screen
+ // but instead we'll need to use a shared screen that is reconfigured depending on which part is enabled
+}
+
+
+ROM_START( sarc110 )
+ ROM_REGION( 0x1000000, "maincpu", 0 ) // Mega Drive part
+ ROM_LOAD16_WORD_SWAP( "superarcade.bin", 0x000000, 0x1000000, CRC(be732867) SHA1(3857b2fbddd6a548c81caf64122e47a0df079be5) )
+
+ ROM_REGION( 0x400000, "mainrom", 0 ) // VT02/03 part
+ ROM_LOAD( "ic1.prg", 0x00000, 0x400000, CRC(de76f71f) SHA1(ff6b37a76c6463af7ae901918fc008b4a2863951) )
+ROM_END
+
+ROM_START( sarc110a )
+ ROM_REGION( 0x1000000, "maincpu", 0 ) // Mega Drive part
+ ROM_LOAD16_WORD_SWAP( "superarcade.bin", 0x000000, 0x1000000, CRC(be732867) SHA1(3857b2fbddd6a548c81caf64122e47a0df079be5) )
+
+ ROM_REGION( 0x400000, "mainrom", 0 ) // VT02/03 part
+ ROM_LOAD( "ic1_ver2.prg", 0x00000, 0x400000, CRC(b97a0dc7) SHA1(bace32d73184df914113de5336e29a7a6f4c03fa) )
+ROM_END
+
+
+CONS( 200?, sarc110, 0, 0, megadriv_vt0203_pal, megadriv_vt0203, megadriv_vt0203_state, init_megadrie, "<unknown>", "Super Arcade 101-in-1 (set 1)", MACHINE_NOT_WORKING)
+CONS( 200?, sarc110a,sarc110, 0, megadriv_vt0203_pal, megadriv_vt0203, megadriv_vt0203_state, init_megadrie, "<unknown>", "Super Arcade 101-in-1 (set 2)", MACHINE_NOT_WORKING)