From a5783544e8026ebbca60e1ec0490ae4a075b9263 Mon Sep 17 00:00:00 2001 From: David Haywood <28625134+DavidHaywood@users.noreply.github.com> Date: Wed, 29 Jan 2020 15:10:30 +0000 Subject: 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] --- hash/buzztime_cart.xml | 28 +++++++++ src/devices/machine/spg2xx_io.cpp | 52 ++++++++-------- src/mame/drivers/elan_eu3a05.cpp | 117 ++++++++++++++++++++++++++++++++--- src/mame/drivers/spg2xx_pdc.cpp | 38 ++++++++---- src/mame/drivers/spg2xx_zone.cpp | 90 ++++++++++++++++++++++----- src/mame/machine/elan_eu3a05gpio.cpp | 36 +++++++---- src/mame/machine/elan_eu3a05gpio.h | 20 +++--- src/mame/mame.lst | 4 ++ 8 files changed, 306 insertions(+), 79 deletions(-) create mode 100644 hash/buzztime_cart.xml 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 @@ + + + + + + + Series 1 - TV + 200? + Cadaco + + + + + + + + + Series 1 - History + 200? + Cadaco + + + + + + + + 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 m_sys; + required_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 m_maincpu; required_device m_screen; required_shared_ptr m_ram; - required_device m_gpio; - required_device m_sys; required_device m_sound; required_device m_vid; required_shared_ptr 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 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 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 // -- cgit v1.2.3