summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author David Haywood <28625134+DavidHaywood@users.noreply.github.com>2020-01-29 15:10:30 +0000
committer GitHub <noreply@github.com>2020-01-29 10:10:30 -0500
commita5783544e8026ebbca60e1ec0490ae4a075b9263 (patch)
tree0abcb4e479bd0b5b5b16a1e0375880e4147f0023
parentd10c29d48b32c8aba764b1f95a83046c8ccd6a03 (diff)
Plug and Play work (#6221)
* new WORKING machines ---- Interactive TV Games 49-in-1 (PAL) [TeamEurope, David Haywood] new NOT WORKING machines ---- Reactor MD (PAL) [TeamEurope, David Haywood] the SunPlus part of the Reactor boots and runs, the MD part I haven't attempted to emulate, the main menu seems to run in an added / unsupported video mode when I took a brief look. As such, it gets marked as not working, as the SunPlus part is only meant to boot once you select it from the MD based main menu. * change name (nw) * (nw) * (nw) * new WORKING machine --- Teenage Mutant Ninja Turtles - Pocket Dream Console (France) [TeamEurope, David Haywood] * (nw) * (nw) * (nw) * added the Buzztime system ROM [Sean Riddle]
-rw-r--r--hash/buzztime_cart.xml28
-rw-r--r--src/devices/machine/spg2xx_io.cpp52
-rw-r--r--src/mame/drivers/elan_eu3a05.cpp117
-rw-r--r--src/mame/drivers/spg2xx_pdc.cpp38
-rw-r--r--src/mame/drivers/spg2xx_zone.cpp90
-rw-r--r--src/mame/machine/elan_eu3a05gpio.cpp36
-rw-r--r--src/mame/machine/elan_eu3a05gpio.h20
-rw-r--r--src/mame/mame.lst4
8 files changed, 306 insertions, 79 deletions
diff --git a/hash/buzztime_cart.xml b/hash/buzztime_cart.xml
new file mode 100644
index 00000000000..38fd947a6c7
--- /dev/null
+++ b/hash/buzztime_cart.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
+
+
+<softwarelist name="buzztime_cart" description="Cadaco Buzztime Trivia Cartridges">
+ <software name="s1tv" supported="no">
+ <description>Series 1 - TV</description>
+ <year>200?</year>
+ <publisher>Cadaco</publisher>
+ <part name="cart" interface="buzztime_cart">
+ <dataarea name="rom" size="0x200000">
+ <rom name="buzztimeseries1tv.bin" size="0x200000" crc="295be60f" sha1="960065e7b8eb0b65dfb7c3b067940de3362d1b0e"/>
+ </dataarea>
+ </part>
+ </software>
+
+ <software name="s1hist" supported="no">
+ <description>Series 1 - History</description>
+ <year>200?</year>
+ <publisher>Cadaco</publisher>
+ <part name="cart" interface="buzztime_cart">
+ <dataarea name="rom" size="0x200000">
+ <rom name="buzztimeseries1history.bin" size="0x200000" crc="384b0c0e" sha1="c359e69b5c91ba98ebf477aee1bb5f62b721b427"/>
+ </dataarea>
+ </part>
+ </software>
+
+</softwarelist>
diff --git a/src/devices/machine/spg2xx_io.cpp b/src/devices/machine/spg2xx_io.cpp
index 857884ce7a9..796eeed1e9b 100644
--- a/src/devices/machine/spg2xx_io.cpp
+++ b/src/devices/machine/spg2xx_io.cpp
@@ -36,38 +36,38 @@ DEFINE_DEVICE_TYPE(SPG28X_IO, spg28x_io_device, "spg28x_io", "SPG280-series Syst
#define IO_IRQ_ENABLE m_io_regs[0x21]
#define IO_IRQ_STATUS m_io_regs[0x22]
-spg2xx_io_device::spg2xx_io_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, type, tag, owner, clock)
- , m_porta_out(*this)
- , m_portb_out(*this)
- , m_portc_out(*this)
- , m_porta_in(*this)
- , m_portb_in(*this)
- , m_portc_in(*this)
- , m_adc_in{{*this}, {*this}}
- , m_i2c_w(*this)
- , m_i2c_r(*this)
- , m_uart_tx(*this)
- , m_chip_sel(*this)
- , m_cpu(*this, finder_base::DUMMY_TAG)
- , m_screen(*this, finder_base::DUMMY_TAG)
- , m_pal_read_cb(*this)
- , m_timer_irq_cb(*this)
- , m_uart_adc_irq_cb(*this)
- , m_external_irq_cb(*this)
- , m_ffreq_tmr1_irq_cb(*this)
- , m_ffreq_tmr2_irq_cb(*this)
- , m_fiq_vector_w(*this)
+spg2xx_io_device::spg2xx_io_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, type, tag, owner, clock),
+ m_porta_out(*this),
+ m_portb_out(*this),
+ m_portc_out(*this),
+ m_porta_in(*this),
+ m_portb_in(*this),
+ m_portc_in(*this),
+ m_adc_in{{*this}, {*this}},
+ m_i2c_w(*this),
+ m_i2c_r(*this),
+ m_uart_tx(*this),
+ m_chip_sel(*this),
+ m_cpu(*this, finder_base::DUMMY_TAG),
+ m_screen(*this, finder_base::DUMMY_TAG),
+ m_pal_read_cb(*this),
+ m_timer_irq_cb(*this),
+ m_uart_adc_irq_cb(*this),
+ m_external_irq_cb(*this),
+ m_ffreq_tmr1_irq_cb(*this),
+ m_ffreq_tmr2_irq_cb(*this),
+ m_fiq_vector_w(*this)
{
}
-spg24x_io_device::spg24x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : spg2xx_io_device(mconfig, SPG24X_IO, tag, owner, clock, 256)
+spg24x_io_device::spg24x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ spg2xx_io_device(mconfig, SPG24X_IO, tag, owner, clock, 256)
{
}
-spg28x_io_device::spg28x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : spg2xx_io_device(mconfig, SPG28X_IO, tag, owner, clock, 64)
+spg28x_io_device::spg28x_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ spg2xx_io_device(mconfig, SPG28X_IO, tag, owner, clock, 64)
{
}
diff --git a/src/mame/drivers/elan_eu3a05.cpp b/src/mame/drivers/elan_eu3a05.cpp
index c1db29341f0..73f2f3921c9 100644
--- a/src/mame/drivers/elan_eu3a05.cpp
+++ b/src/mame/drivers/elan_eu3a05.cpp
@@ -104,17 +104,19 @@
#include "machine/elan_eu3a05gpio.h"
#include "machine/elan_eu3a05sys.h"
#include "video/elan_eu3a05vid.h"
+#include "bus/generic/slot.h"
+#include "bus/generic/carts.h"
class elan_eu3a05_state : public driver_device
{
public:
elan_eu3a05_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
+ m_sys(*this, "sys"),
+ m_gpio(*this, "gpio"),
m_maincpu(*this, "maincpu"),
m_screen(*this, "screen"),
m_ram(*this, "ram"),
- m_gpio(*this, "gpio"),
- m_sys(*this, "sys"),
m_sound(*this, "eu3a05sound"),
m_vid(*this, "vid"),
m_pixram(*this, "pixram"),
@@ -129,6 +131,14 @@ public:
void elan_sudoku(machine_config &config);
+protected:
+ // driver_device overrides
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ required_device<elan_eu3a05sys_device> m_sys;
+ required_device<elan_eu3a05gpio_device> m_gpio;
+
private:
// screen updates
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
@@ -142,17 +152,12 @@ private:
void elan_eu3a05_map(address_map &map);
void elan_sudoku_map(address_map &map);
- // driver_device overrides
- virtual void machine_start() override;
- virtual void machine_reset() override;
virtual void video_start() override;
required_device<cpu_device> m_maincpu;
required_device<screen_device> m_screen;
required_shared_ptr<uint8_t> m_ram;
- required_device<elan_eu3a05gpio_device> m_gpio;
- required_device<elan_eu3a05sys_device> m_sys;
required_device<elan_eu3a05_sound_device> m_sound;
required_device<elan_eu3a05vid_device> m_vid;
required_shared_ptr<uint8_t> m_pixram;
@@ -168,6 +173,94 @@ private:
DECLARE_WRITE_LINE_MEMBER(sound_end5) { m_sys->generate_custom_interrupt(7); }
};
+class elan_eu3a05_buzztime_state : public elan_eu3a05_state
+{
+public:
+ elan_eu3a05_buzztime_state(const machine_config &mconfig, device_type type, const char *tag) :
+ elan_eu3a05_state(mconfig, type, tag),
+ m_cart(*this, "cartslot")
+ { }
+
+ void elan_buzztime(machine_config& config);
+
+protected:
+ virtual void machine_start() override;
+
+private:
+ //DECLARE_READ8_MEMBER(random_r) { return machine().rand(); }
+ DECLARE_READ8_MEMBER(porta_r);
+ DECLARE_WRITE8_MEMBER(portb_w);
+
+ DECLARE_DEVICE_IMAGE_LOAD_MEMBER(cart_load);
+
+ required_device<generic_slot_device> m_cart;
+};
+
+void elan_eu3a05_buzztime_state::machine_start()
+{
+ elan_eu3a05_state::machine_start();
+
+ // if there's a cart make sure we can see it
+ if (m_cart && m_cart->exists())
+ {
+ uint8_t *rom = memregion("maincpu")->base();
+ uint8_t* cart = m_cart->get_rom_base();
+ std::copy(&cart[0x000000], &cart[0x200000], &rom[0x200000]);
+ }
+ else
+ {
+ uint8_t *rom = memregion("maincpu")->base();
+ uint8_t* bios = memregion("bios")->base();
+ std::copy(&bios[0x000000], &bios[0x200000], &rom[0x200000]);
+ }
+}
+
+DEVICE_IMAGE_LOAD_MEMBER(elan_eu3a05_buzztime_state::cart_load)
+{
+ uint32_t size = m_cart->common_get_size("rom");
+
+ if (size != 0x200000)
+ {
+ image.seterror(IMAGE_ERROR_UNSPECIFIED, "Unsupported cartridge size");
+ return image_init_result::FAIL;
+ }
+
+ m_cart->rom_alloc(size, GENERIC_ROM8_WIDTH, ENDIANNESS_NATIVE);
+ m_cart->common_load_rom(m_cart->get_rom_base(), size, "rom");
+
+ return image_init_result::PASS;
+}
+
+void elan_eu3a05_buzztime_state::elan_buzztime(machine_config &config)
+{
+ elan_eu3a05_state::elan_eu3a05(config);
+
+ m_sys->set_alt_timer();
+
+ m_gpio->read_0_callback().set(FUNC(elan_eu3a05_buzztime_state::porta_r)); // I/O lives in here
+// m_gpio->read_1_callback().set(FUNC(elan_eu3a05_buzztime_state::random_r)); // nothing of note
+// m_gpio->read_2_callback().set(FUNC(elan_eu3a05_buzztime_state::random_r)); // nothing of note
+ m_gpio->write_1_callback().set(FUNC(elan_eu3a05_buzztime_state::portb_w)); // control related
+
+ GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "buzztime_cart");
+ m_cart->set_width(GENERIC_ROM16_WIDTH);
+ m_cart->set_device_load(FUNC(elan_eu3a05_buzztime_state::cart_load));
+
+ SOFTWARE_LIST(config, "buzztime_cart").set_original("buzztime_cart");
+}
+
+READ8_MEMBER(elan_eu3a05_buzztime_state::porta_r)
+{
+ logerror("%s: porta_r\n", machine().describe_context());
+ return machine().rand();
+}
+
+WRITE8_MEMBER(elan_eu3a05_buzztime_state::portb_w)
+{
+ logerror("%s: portb_w %02x\n", machine().describe_context(), data);
+}
+
+
void elan_eu3a05_state::video_start()
{
}
@@ -576,7 +669,6 @@ void elan_eu3a05_state::airblsjs(machine_config& config)
m_sys->set_pal(); // TODO: also set PAL clocks
}
-
ROM_START( rad_tetr )
ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD( "tetrisrom.bin", 0x000000, 0x100000, CRC(40538e08) SHA1(1aef9a2c678e39243eab8d910bb7f9f47bae0aee) )
@@ -615,7 +707,12 @@ ROM_START( carlecfg )
ROM_END
+ROM_START( buzztime )
+ ROM_REGION( 0x400000, "maincpu", ROMREGION_ERASE00 )
+ ROM_REGION( 0x200000, "bios", ROMREGION_ERASE00 )
+ ROM_LOAD( "buzztimeunit.bin", 0x000000, 0x200000, CRC(8ba3569c) SHA1(3e704338a53daed63da90aba0db4f6adb5bccd21) )
+ROM_END
CONS( 2004, rad_sinv, 0, 0, elan_eu3a05, rad_sinv, elan_eu3a05_state, empty_init, "Radica (licensed from Taito)", "Space Invaders [Lunar Rescue, Colony 7, Qix, Phoenix] (Radica, Arcade Legends TV Game)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND ) // "5 Taito games in 1"
@@ -625,6 +722,10 @@ CONS( 2004, rad_tetr, 0, 0, elan_eu3a05, rad_tetr, elan_eu3a05_state, empty_init
// ROM contains the string "Credit:XiAn Hummer Software Studio(CHINA) Tel:86-29-84270600 Email:HummerSoft@126.com" PCB has datecode of "050423" (23rd April 2005)
CONS( 2005, airblsjs, 0, 0, airblsjs, airblsjs, elan_eu3a05_state, empty_init, "Advance Bright Ltd", "Air-Blaster Joystick (AB1500, PAL)", MACHINE_NOT_WORKING )
+CONS( 2004, buzztime, 0, 0, elan_buzztime, sudoku, elan_eu3a05_buzztime_state, empty_init, "Cadaco", "Buzztime Home Trivia System", MACHINE_NOT_WORKING )
+
+// Below are probably not EU3A05 but use similar modes (possibly EU3A13?)
+
CONS( 2006, sudoelan, 0, 0, elan_sudoku, sudoku, elan_eu3a05_state, empty_init, "Senario / All in 1 Products Ltd", "Ultimate Sudoku TV Edition 3-in-1", MACHINE_NOT_WORKING )
CONS( 200?, carlecfg, 0, 0, elan_sudoku, carlecfg, elan_eu3a05_state, empty_init, "Excalibur Electronics Inc", "Carl Edwards' Chase For Glory", MACHINE_NOT_WORKING )
diff --git a/src/mame/drivers/spg2xx_pdc.cpp b/src/mame/drivers/spg2xx_pdc.cpp
index 52cd17de569..37bd32d212d 100644
--- a/src/mame/drivers/spg2xx_pdc.cpp
+++ b/src/mame/drivers/spg2xx_pdc.cpp
@@ -7,16 +7,20 @@ class spg2xx_pdc100_game_state : public spg2xx_game_state
{
public:
spg2xx_pdc100_game_state(const machine_config &mconfig, device_type type, const char *tag) :
- spg2xx_game_state(mconfig, type, tag)
+ spg2xx_game_state(mconfig, type, tag),
+ m_numbanks(-1)
{ }
void pdc100(machine_config& config);
protected:
- //virtual void machine_start() override;
+ virtual void machine_start() override;
virtual void machine_reset() override;
virtual DECLARE_WRITE16_MEMBER(porta_w) override;
+
+private:
+ int m_numbanks;
};
@@ -43,20 +47,25 @@ static INPUT_PORTS_START( pdc100 )
PORT_BIT( 0xffff, IP_ACTIVE_HIGH, IPT_UNKNOWN )
INPUT_PORTS_END
+
+void spg2xx_pdc100_game_state::machine_start()
+{
+ spg2xx_game_state::machine_start();
+ m_numbanks = memregion("maincpu")->bytes() / 0x800000;
+}
+
void spg2xx_pdc100_game_state::machine_reset()
{
m_current_bank = -1;
- switch_bank(7); // must boot from upper bank
+ switch_bank(m_numbanks - 1); // pdc100 must boot from upper bank
m_maincpu->reset();
}
WRITE16_MEMBER(spg2xx_pdc100_game_state::porta_w)
{
- //logerror("%s: porta_w %04x\n", machine().describe_context(), data);
-
- // simply writes 0000 at times during bootup while initializing stuff, which causes an invalid bankswitch mid-code execution
+ // pdc100 simply writes 0000 at times during bootup while initializing stuff, which causes an invalid bankswitch mid-code execution
if (data & 0xff00)
- switch_bank(data & 0x0007);
+ switch_bank(data & (m_numbanks - 1));
}
@@ -70,10 +79,16 @@ void spg2xx_pdc100_game_state::pdc100(machine_config &config)
}
ROM_START( pdc100 )
- ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
// only 1st half of this is used "Jumper resistor (0 ohm) that short A25 to ground"
// 2nd half just contains what seems to be random garbage
- ROM_LOAD16_WORD_SWAP( "pdc100.bin", 0x000000, 0x8000000, CRC(57285b49) SHA1(cfb4be7877ec263d24063a004c56985db5c0f4e2) )
+ ROM_LOAD16_WORD_SWAP( "pdc100.bin", 0x000000, 0x4000000, CRC(57285b49) SHA1(cfb4be7877ec263d24063a004c56985db5c0f4e2) )
+ ROM_IGNORE(0x4000000)
+ROM_END
+
+ROM_START( tmntpdc )
+ ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "pdc_turtles.bin", 0x000000, 0x800000, CRC(ee9e70a3) SHA1(7620f1b7aeaec8032faa8eb7552f775e8d6d14ba) )
ROM_END
@@ -81,11 +96,12 @@ ROM_END
// "Jo Ma 2" shows "Licensed by Mitchell Corporation" (Mitchell made the original Puzzloop on which this style of game is based) Videos of the original Jo Ma show it lacking this text.
// Other known units
-// PDC Teenage Mutant Ninja Turtles
// PDC Dora the Explorer
// PDC 30
// PDC 40
// PDC 200
// This was dumped from an Anncia branded unit, although there's no ingame branding, so ROM is probably the same for all PDC100 units
-CONS( 2008, pdc100, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny", "PDC100 - Pocket Dream Console", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2008, pdc100, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny", "PDC100 - Pocket Dream Console", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+
+CONS( 2013, tmntpdc, 0, 0, pdc100, pdc100, spg2xx_pdc100_game_state, empty_init, "Conny / VideoJet", "Teenage Mutant Ninja Turtles - Pocket Dream Console (France)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
diff --git a/src/mame/drivers/spg2xx_zone.cpp b/src/mame/drivers/spg2xx_zone.cpp
index 9de42371fe4..e31a57533a4 100644
--- a/src/mame/drivers/spg2xx_zone.cpp
+++ b/src/mame/drivers/spg2xx_zone.cpp
@@ -44,8 +44,10 @@ public:
{ }
void zone40(machine_config &config);
+ void zone40p(machine_config &config);
void init_zone40();
+ void init_reactmd();
protected:
@@ -58,7 +60,9 @@ private:
DECLARE_READ16_MEMBER(zone40_porta_r);
DECLARE_WRITE16_MEMBER(zone40_porta_w);
required_region_ptr<uint16_t> m_romregion;
- uint8_t m_z40_rombase;
+ uint16_t m_z40_rombase;
+ uint16_t m_porta_dat;
+ int m_romsize;
};
@@ -103,17 +107,24 @@ WRITE16_MEMBER(zone40_state::zone40_porta_w)
{
wireless60_porta_w(space, offset, data);
- if ((data & 0x00ff) != m_z40_rombase)
- {
- m_z40_rombase = data & 0x00ff;
- m_maincpu->invalidate_cache();
- }
+ m_z40_rombase = (m_z40_rombase & 0xff00) | (data & 0x0ff);
+
+ // toggled twice before games in the same 64MB bank, toggled once before games in a different 64MB bank
+ if ((data & 0x2000) && (!(m_porta_dat & 0x2000)))
+ m_z40_rombase ^= 0x0100;
+
+ m_porta_dat = data;
+
+ //logerror("%s: zone40_porta_w %04x z80 bank is now %04x \n", machine().describe_context(), data, m_z40_rombase);
+
+ m_maincpu->invalidate_cache();
+
}
READ16_MEMBER(zone40_state::zone40_porta_r)
{
uint16_t ret = wireless60_porta_r(space, offset) & (0x0300 | m_w60_p1_ctrl_mask | m_w60_p2_ctrl_mask);
- ret = (ret & 0xff00) | m_z40_rombase;
+ ret = (ret & 0xdf00) | (m_porta_dat & 0x20ff);
return ret;
}
@@ -121,7 +132,7 @@ READ16_MEMBER(zone40_state::zone40_porta_r)
READ16_MEMBER(zone40_state::z40_rom_r)
{
// due to granularity of rom bank this manual method is safer
- return m_romregion[(offset + (m_z40_rombase * 0x20000)) & 0x1ffffff];
+ return m_romregion[(offset + (m_z40_rombase * 0x20000)) & (m_romsize-1)];
}
void zone40_state::mem_map_z40(address_map &map)
@@ -145,10 +156,14 @@ void zone40_state::machine_start()
wireless60_state::machine_start();
save_item(NAME(m_z40_rombase));
+ save_item(NAME(m_porta_dat));
m_z40_rombase = 0xe0;
+ m_porta_dat = 0x20e0;
m_w60_p1_ctrl_mask = 0x0400;
m_w60_p2_ctrl_mask = 0x1000;
+
+ m_romsize = (memregion("maincpu")->bytes()/2);
}
void wireless60_state::machine_reset()
@@ -161,7 +176,7 @@ void wireless60_state::machine_reset()
void zone40_state::machine_reset()
{
wireless60_state::machine_reset();
- m_z40_rombase = 0xe0;
+ m_z40_rombase = 0x1e0;
m_maincpu->invalidate_cache();
m_maincpu->reset();
}
@@ -212,6 +227,13 @@ void zone40_state::zone40(machine_config &config)
m_maincpu->porta_in().set(FUNC(zone40_state::zone40_porta_r));
}
+void zone40_state::zone40p(machine_config &config)
+{
+ zone40(config);
+ m_maincpu->set_pal(true);
+ m_screen->set_refresh_hz(50);
+}
+
void wireless60_state::init_lx_jg7415()
{
@@ -257,11 +279,44 @@ void zone40_state::init_zone40()
}
}
+
+void zone40_state::init_reactmd()
+{
+ uint16_t *ROM = (uint16_t*)memregion("maincpu")->base();
+ int size = memregion("maincpu")->bytes();
+
+ for (int i = 0; i < size/2; i++)
+ {
+ ROM[i] = ROM[i] ^ 0xca53;
+
+ ROM[i] = bitswap<16>(ROM[i], 15, 13, 14, 12, 7, 6, 5, 4,
+ 11, 10, 9, 8, 3, 1, 2, 0);
+
+ }
+}
+
+
+
ROM_START( zone40 )
ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "zone40.bin", 0x0000, 0x4000000, CRC(4ba1444f) SHA1(de83046ab93421486668a247972ad6d3cda19440) )
ROM_END
+ROM_START( reactmd )
+ ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 ) // this contains the SunPlus games
+ ROM_LOAD16_WORD_SWAP( "reactor_md_sunplus-full.bin", 0x0000, 0x4000000, CRC(843aa58c) SHA1(07cdc6d4aa0057939c145ece01a9aca73c7f1f2b) )
+ ROM_IGNORE(0x4000000) // the 2nd half of the ROM can't be accessed by the PCB (address line tied low) (contains garbage? data)
+
+ ROM_REGION( 0x2000000, "mdrom", ROMREGION_ERASE00 ) // this contains the MD games and main boot menu
+ ROM_LOAD16_WORD_SWAP( "reactormd.bin", 0x0000, 0x2000000, CRC(fe9664a4) SHA1(d475b524f576c9d1d90aed20c7467cc652396baf) )
+ROM_END
+
+ROM_START( itvg49 )
+ ROM_REGION( 0x8000000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD16_WORD_SWAP( "49in1sports.bin", 0x0000, 0x8000000, CRC(bb8a1c4e) SHA1(a493177de7365037b67ead0155a902313722a61c) )
+ROM_END
+
+
ROM_START( zone60 )
ROM_REGION( 0x4000000, "maincpu", ROMREGION_ERASE00 )
ROM_LOAD16_WORD_SWAP( "zone60.bin", 0x0000, 0x4000000, CRC(4cb637d1) SHA1(1f97cbdb4299ac0fbafc2a3aa592066cb0727066))
@@ -285,12 +340,17 @@ ROM_START( lx_jg7415 )
ROM_LOAD16_WORD_SWAP( "rom.bin", 0x0000, 0x10000000, CRC(59442e00) SHA1(7e91cf6b19c37f9b4fa4dc21e241c6634d6a6f95) )
ROM_END
-// these don't have real motion controls
-CONS( 2009, zone40, 0, 0, zone40, wirels60, zone40_state, init_zone40, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2010, zone60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 200?, zone100, 0, 0, wireless60, wirels60, wireless60_state, init_zone100, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 100", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // unit was black, menus still show white controllers, unlike wireless 60
-CONS( 2010, wirels60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
-CONS( 2011, lx_jg7415,0, 0, wireless60, wirels60, wireless60_state, init_lx_jg7415, "Lexibook", "Lexibook JG7415 120-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2009, zone40, 0, 0, zone40, wirels60, zone40_state, init_zone40, "Jungle Soft / Ultimate Products (HK) Ltd", "Zone 40", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2009, itvg49, 0, 0, zone40p, wirels60, zone40_state, init_reactmd, "TaiKee", "Interactive TV Games 49-in-1 (PAL)", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // Badminton hangs, otherwise everything runs
+
+CONS( 2010, zone60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 200?, zone100, 0, 0, wireless60, wirels60, wireless60_state, init_zone100, "Jungle's Soft / Ultimate Products (HK) Ltd", "Zone 100", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) // unit was black, menus still show white controllers, unlike wireless 60
+CONS( 2010, wirels60, 0, 0, wireless60, wirels60, wireless60_state, empty_init, "Jungle Soft / Kids Station Toys Inc", "Wireless 60", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+CONS( 2011, lx_jg7415,0, 0, wireless60, wirels60, wireless60_state, init_lx_jg7415, "Lexibook", "Lexibook JG7415 120-in-1", MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS )
+// Two systems in one unit - Genesis on a Chip and SunPlus, only the SunPlus part is currently emulated. Genesis on a chip is a very poor implementation with many issues on real hardware.
+// This should actually boot to a menu on the MD size, with the SunPlus only being enabled if selected from that menu. MD side menu runs in some enhanced / custom MD mode tho.
+// Badminton hangs, as it does in the 49-in-1 above
+CONS( 2009, reactmd, 0, 0, zone40p, wirels60, zone40_state, init_reactmd, "AtGames / Sega", "Reactor MD (PAL)", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_GRAPHICS ) \ No newline at end of file
diff --git a/src/mame/machine/elan_eu3a05gpio.cpp b/src/mame/machine/elan_eu3a05gpio.cpp
index fe24d423dcb..5a1ede0e960 100644
--- a/src/mame/machine/elan_eu3a05gpio.cpp
+++ b/src/mame/machine/elan_eu3a05gpio.cpp
@@ -6,19 +6,25 @@
DEFINE_DEVICE_TYPE(ELAN_EU3A05_GPIO, elan_eu3a05gpio_device, "elan_eu3a05gpio", "Elan EU3A05 GPIO")
-elan_eu3a05gpio_device::elan_eu3a05gpio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : device_t(mconfig, ELAN_EU3A05_GPIO, tag, owner, clock)
- , m_space_read0_cb(*this)
- , m_space_read1_cb(*this)
- , m_space_read2_cb(*this)
+elan_eu3a05gpio_device::elan_eu3a05gpio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, ELAN_EU3A05_GPIO, tag, owner, clock),
+ m_write_0_callback(*this),
+ m_write_1_callback(*this),
+ m_write_2_callback(*this),
+ m_read_0_callback(*this),
+ m_read_1_callback(*this),
+ m_read_2_callback(*this)
{
}
void elan_eu3a05gpio_device::device_start()
{
- m_space_read0_cb.resolve_safe(0xff);
- m_space_read1_cb.resolve_safe(0xff);
- m_space_read2_cb.resolve_safe(0xff);
+ m_write_0_callback.resolve_safe();
+ m_write_1_callback.resolve_safe();
+ m_write_2_callback.resolve_safe();
+ m_read_0_callback.resolve_safe(0xff);
+ m_read_1_callback.resolve_safe(0xff);
+ m_read_2_callback.resolve_safe(0xff);
}
void elan_eu3a05gpio_device::device_reset()
@@ -35,9 +41,9 @@ uint8_t elan_eu3a05gpio_device::read_port_data(int which)
//todo, actually use the direction registers
switch (which)
{
- case 0: return m_space_read0_cb();
- case 1: return m_space_read1_cb();
- case 2: return m_space_read2_cb();
+ case 0: return m_read_0_callback();
+ case 1: return m_read_1_callback();
+ case 2: return m_read_2_callback();
}
return 0xff;
@@ -60,6 +66,13 @@ void elan_eu3a05gpio_device::write_port_data(int which, uint8_t data)
{
//todo, actually use the direction registers
logerror("%s: write_port_data (port %d) %02x (direction register %02x)\n", machine().describe_context(), which, data, m_ddr[which]);
+
+ switch (which)
+ {
+ case 0: return m_write_0_callback(data); break;
+ case 1: return m_write_1_callback(data); break;
+ case 2: return m_write_2_callback(data); break;
+ }
}
void elan_eu3a05gpio_device::write_direction(int which, uint8_t data)
@@ -70,7 +83,6 @@ void elan_eu3a05gpio_device::write_direction(int which, uint8_t data)
WRITE8_MEMBER(elan_eu3a05gpio_device::gpio_w)
{
-
int port = offset/2;
if (!(offset&1)) return write_direction(port, data);
else return write_port_data(port, data);
diff --git a/src/mame/machine/elan_eu3a05gpio.h b/src/mame/machine/elan_eu3a05gpio.h
index f06d2eb14b0..c476a303641 100644
--- a/src/mame/machine/elan_eu3a05gpio.h
+++ b/src/mame/machine/elan_eu3a05gpio.h
@@ -10,10 +10,13 @@ class elan_eu3a05gpio_device : public device_t
public:
elan_eu3a05gpio_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- auto read_0_callback() { return m_space_read0_cb.bind(); }
- auto read_1_callback() { return m_space_read1_cb.bind(); }
- auto read_2_callback() { return m_space_read2_cb.bind(); }
-
+ auto write_0_callback() { return m_write_0_callback.bind(); }
+ auto write_1_callback() { return m_write_1_callback.bind(); }
+ auto write_2_callback() { return m_write_2_callback.bind(); }
+ auto read_0_callback() { return m_read_0_callback.bind(); }
+ auto read_1_callback() { return m_read_1_callback.bind(); }
+ auto read_2_callback() { return m_read_2_callback.bind(); }
+
DECLARE_READ8_MEMBER(gpio_r);
DECLARE_WRITE8_MEMBER(gpio_w);
@@ -25,9 +28,12 @@ protected:
virtual void device_reset() override;
private:
- devcb_read8 m_space_read0_cb;
- devcb_read8 m_space_read1_cb;
- devcb_read8 m_space_read2_cb;
+ devcb_write8 m_write_0_callback;
+ devcb_write8 m_write_1_callback;
+ devcb_write8 m_write_2_callback;
+ devcb_read8 m_read_0_callback;
+ devcb_read8 m_read_1_callback;
+ devcb_read8 m_read_2_callback;
uint8_t read_port_data(int which);
uint8_t read_direction(int which);
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index cece5298087..7f82a7aada1 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -12886,6 +12886,7 @@ rad_baskp
rad_sinv
rad_tetr
airblsjs
+buzztime
sudoelan
carlecfg
@@ -39882,6 +39883,8 @@ jak_sbfc //
@source:spg2xx_zone.cpp
wirels60 // Wireless 60
zone40 // Zone 40
+reactmd
+itvg49
zone60 // Zone 60
zone100 //
lx_jg7415 //
@@ -39924,6 +39927,7 @@ tvgogo //
@source:spg2xx_pdc.cpp
pdc100
+tmntpdc
@source:spg2xx_dreamlife.cpp
dreamlif //