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]
This commit is contained in:
David Haywood 2020-01-29 15:10:30 +00:00 committed by GitHub
parent d10c29d48b
commit a5783544e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 307 additions and 80 deletions

28
hash/buzztime_cart.xml Normal file
View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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