mirror of
https://github.com/holub/mame
synced 2025-04-19 23:12:11 +03:00
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:
parent
d10c29d48b
commit
a5783544e8
28
hash/buzztime_cart.xml
Normal file
28
hash/buzztime_cart.xml
Normal 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>
|
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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 )
|
||||
|
@ -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 )
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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 //
|
||||
|
Loading…
Reference in New Issue
Block a user