From 2f99f81a0c048514378d6a1603448e39048cbe2f Mon Sep 17 00:00:00 2001 From: David Haywood Date: Thu, 18 Oct 2018 17:15:38 +0100 Subject: Xavix - i2cmem hookup (#4156) * properly mark data/direction registers for IO (nw) * use direction register (nw) * (nw) * xavix - i2cmem hookup (nw) --- src/mame/drivers/xavix.cpp | 38 +++++++++++++-------- src/mame/includes/xavix.h | 29 +++++++++++----- src/mame/machine/xavix.cpp | 85 ++++++++++++++++++++++++++++++++-------------- 3 files changed, 103 insertions(+), 49 deletions(-) diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index f035da53173..d75faf810aa 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -384,10 +384,10 @@ void xavix_state::xavix_lowbus_map(address_map &map) map(0x7986, 0x7987).ram().w(FUNC(xavix_state::rom_dmalen_w)).share("rom_dma_len"); // IO Ports - map(0x7a00, 0x7a00).rw(FUNC(xavix_state::io_0_r),FUNC(xavix_state::io_0_w)); - map(0x7a01, 0x7a01).rw(FUNC(xavix_state::io_1_r),FUNC(xavix_state::io_1_w)); - map(0x7a02, 0x7a02).rw(FUNC(xavix_state::io_2_r),FUNC(xavix_state::io_2_w)); - map(0x7a03, 0x7a03).rw(FUNC(xavix_state::io_3_r),FUNC(xavix_state::io_3_w)); + map(0x7a00, 0x7a00).rw(FUNC(xavix_state::io0_data_r),FUNC(xavix_state::io0_data_w)); + map(0x7a01, 0x7a01).rw(FUNC(xavix_state::io1_data_r),FUNC(xavix_state::io1_data_w)); + map(0x7a02, 0x7a02).rw(FUNC(xavix_state::io0_direction_r),FUNC(xavix_state::io0_direction_w)); + map(0x7a03, 0x7a03).rw(FUNC(xavix_state::io1_direction_r),FUNC(xavix_state::io1_direction_w)); // Interrupt control registers map(0x7a80, 0x7a80).w(FUNC(xavix_state::xavix_7a80_w)); // still IO? ADC related? @@ -730,6 +730,11 @@ MACHINE_CONFIG_START(xavix_state::xavix) // sound is PCM MACHINE_CONFIG_END +MACHINE_CONFIG_START(xavix_state::xavix_i2c) + xavix(config); + + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); +MACHINE_CONFIG_END MACHINE_CONFIG_START(xavix_state::xavixp) xavix(config); @@ -751,6 +756,11 @@ MACHINE_CONFIG_START(xavix_state::xavix2000) MACHINE_CONFIG_END +MACHINE_CONFIG_START(xavix_state::xavix2000_i2c) + xavix2000(config); + + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); +MACHINE_CONFIG_END void xavix_state::init_xavix() { @@ -906,13 +916,13 @@ ROM_END /* Standalone TV Games */ -CONS( 2006, taitons1, 0, 0, xavix, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1", MACHINE_IS_SKELETON ) +CONS( 2006, taitons1, 0, 0, xavix_i2c, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 1", MACHINE_IS_SKELETON ) -CONS( 2006, taitons2, 0, 0, xavix, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 2", MACHINE_IS_SKELETON ) +CONS( 2006, taitons2, 0, 0, xavix_i2c, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Taito", "Let's! TV Play Classic - Taito Nostalgia 2", MACHINE_IS_SKELETON ) -CONS( 2006, namcons1, 0, 0, xavix, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 1", MACHINE_IS_SKELETON ) +CONS( 2006, namcons1, 0, 0, xavix_i2c, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 1", MACHINE_IS_SKELETON ) -CONS( 2006, namcons2, 0, 0, xavix, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 2", MACHINE_IS_SKELETON ) +CONS( 2006, namcons2, 0, 0, xavix_i2c, namcons2, xavix_state, init_xavix, "Bandai / SSD Company LTD / Namco", "Let's! TV Play Classic - Namco Nostalgia 2", MACHINE_IS_SKELETON ) CONS( 2000, rad_ping, 0, 0, xavix, xavix, xavix_state, init_xavix, "Radica / SSD Company LTD / Simmer Technology", "Play TV Ping Pong", MACHINE_IS_SKELETON ) // "Simmer Technology" is also known as "Hummer Technology Co., Ltd" @@ -940,7 +950,7 @@ CONS( 200?, rad_fb, 0, 0, xavix, xavix, xavix_state, init_xavix CONS( 200?, rad_rh, 0, 0, xavix, xavix, xavix_state, init_xavix, "Radioa / Fisher-Price / SSD Company LTD", "Play TV Rescue Heroes", MACHINE_IS_SKELETON) -CONS( 200?, epo_efdx, 0, 0, xavix, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Fishing DX (Japan)", MACHINE_IS_SKELETON) +CONS( 200?, epo_efdx, 0, 0, xavix_i2c, xavix, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Excite Fishing DX (Japan)", MACHINE_IS_SKELETON) CONS( 200?, has_wamg, 0, 0, xavix, xavix, xavix_state, init_xavix, "Hasbro / Milton Bradley / SSD Company LTD", "TV Wild Adventure Mini Golf", MACHINE_IS_SKELETON) @@ -985,9 +995,9 @@ ROM_START( drgqst ) ROM_END -CONS( 2004, xavtenni, 0, 0, xavix2000, xavix, xavix_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_IS_SKELETON ) +CONS( 2004, xavtenni, 0, 0, xavix2000_i2c, xavix, xavix_state, init_xavix, "SSD Company LTD", "XaviX Tennis (XaviXPORT)", MACHINE_IS_SKELETON ) -CONS( 2005, ttv_sw, 0, 0, xavix2000, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_IS_SKELETON ) -CONS( 2005, ttv_lotr, 0, 0, xavix2000, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_IS_SKELETON ) -CONS( 2005, ttv_mx, 0, 0, xavix2000, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_IS_SKELETON ) -CONS( 2003, drgqst, 0, 0, xavix2000, xavix, xavix_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_IS_SKELETON ) +CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_IS_SKELETON ) +CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_IS_SKELETON ) +CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c, xavix, xavix_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_IS_SKELETON ) +CONS( 2003, drgqst, 0, 0, xavix2000_i2c, xavix, xavix_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_IS_SKELETON ) diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index d3c361a0038..43df8161edc 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -10,6 +10,7 @@ #include "screen.h" #include "speaker.h" #include "machine/bankdev.h" +#include "machine/i2cmem.h" class xavix_state : public driver_device @@ -34,13 +35,17 @@ public: m_in1(*this, "IN1"), m_region(*this, "REGION"), m_gfxdecode(*this, "gfxdecode"), - m_lowbus(*this, "lowbus") + m_lowbus(*this, "lowbus"), + m_i2cmem(*this, "i2cmem") { } void xavix(machine_config &config); void xavixp(machine_config &config); void xavix2000(machine_config &config); + void xavix_i2c(machine_config &config); + void xavix2000_i2c(machine_config &config); + void init_xavix(); private: @@ -90,15 +95,15 @@ private: DECLARE_WRITE8_MEMBER(spritefragment_dma_trg_w); DECLARE_READ8_MEMBER(spritefragment_dma_status_r); - DECLARE_READ8_MEMBER(io_0_r); - DECLARE_READ8_MEMBER(io_1_r); - DECLARE_READ8_MEMBER(io_2_r); - DECLARE_READ8_MEMBER(io_3_r); + DECLARE_READ8_MEMBER(io0_data_r); + DECLARE_READ8_MEMBER(io1_data_r); + DECLARE_READ8_MEMBER(io0_direction_r); + DECLARE_READ8_MEMBER(io1_direction_r); - DECLARE_WRITE8_MEMBER(io_0_w); - DECLARE_WRITE8_MEMBER(io_1_w); - DECLARE_WRITE8_MEMBER(io_2_w); - DECLARE_WRITE8_MEMBER(io_3_w); + DECLARE_WRITE8_MEMBER(io0_data_w); + DECLARE_WRITE8_MEMBER(io1_data_w); + DECLARE_WRITE8_MEMBER(io0_direction_w); + DECLARE_WRITE8_MEMBER(io1_direction_w); DECLARE_WRITE8_MEMBER(vector_enable_w); DECLARE_WRITE8_MEMBER(nmi_vector_lo_w); @@ -207,6 +212,11 @@ private: uint8_t m_6ff0; uint8_t m_6ff8; + uint8_t m_io0_data; + uint8_t m_io1_data; + uint8_t m_io0_direction; + uint8_t m_io1_direction; + uint8_t m_soundregs[0x10]; uint8_t m_timer_baseval; @@ -257,6 +267,7 @@ private: int get_current_address_byte(); required_device m_lowbus; + optional_device m_i2cmem; }; #endif // MAME_INCLUDES_XAVIX_H diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 08c522bcb88..5ad392d7c2c 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -135,7 +135,7 @@ WRITE8_MEMBER(xavix_state::adc_7b00_w) READ8_MEMBER(xavix_state::adc_7b80_r) { logerror("%s: adc_7b80_r\n", machine().describe_context()); - return 0xff; + return 0x00;//0xff; } WRITE8_MEMBER(xavix_state::adc_7b80_w) @@ -150,7 +150,8 @@ WRITE8_MEMBER(xavix_state::adc_7b81_w) READ8_MEMBER(xavix_state::adc_7b81_r) { - return machine().rand(); + return 0x00; +// return machine().rand(); } @@ -204,55 +205,80 @@ WRITE8_MEMBER(xavix_state::dispctrl_posirq_y_w) logerror("%s: dispctrl_posirq_y_w %02x\n", machine().describe_context(), data); } -READ8_MEMBER(xavix_state::io_0_r) +READ8_MEMBER(xavix_state::io0_data_r) { - return m_in0->read(); + uint8_t ret = m_in0->read() & ~m_io0_direction; + ret |= m_io0_data & m_io0_direction; + return ret; } -READ8_MEMBER(xavix_state::io_1_r) +READ8_MEMBER(xavix_state::io1_data_r) { - /* - int pc = m_maincpu->state_int(M6502_PC); + uint8_t ret = m_in1->read(); - if (pc == 0x3acc) return 0x08; - if (pc == 0x3ae0) return 0x08; - if (pc == 0xfcb0) return 0xff; + if (m_i2cmem) + { + if (!(m_io1_direction & 0x08)) + { + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; + } + } - logerror("%04x: in1 read\n", pc); - */ - return m_in1->read(); + ret &= ~m_io1_direction; + + ret |= m_io1_data & m_io1_direction; + return ret; } -// has_wamg crashes on boot if these return high, either it's a button causing the game to eventually crash, or an invalid input (inputs are ACTIVE HIGH so returning 0x00 is safer -READ8_MEMBER(xavix_state::io_2_r) +READ8_MEMBER(xavix_state::io0_direction_r) { - return 0x00; + return m_io0_direction; } -READ8_MEMBER(xavix_state::io_3_r) +READ8_MEMBER(xavix_state::io1_direction_r) { - return 0x00; + return m_io1_direction; } -WRITE8_MEMBER(xavix_state::io_0_w) +WRITE8_MEMBER(xavix_state::io0_data_w) { - logerror("%s: io_0_w %02x\n", machine().describe_context(), data); + m_io0_data = data; + logerror("%s: io0_data_w %02x\n", machine().describe_context(), data); } -WRITE8_MEMBER(xavix_state::io_1_w) +WRITE8_MEMBER(xavix_state::io1_data_w) { - logerror("%s: io_1_w %02x\n", machine().describe_context(), data); + m_io1_data = data; + logerror("%s: io1_data_w %02x\n", machine().describe_context(), data); + + if (m_i2cmem) + { + if (m_io1_direction & 0x08) + { + m_i2cmem->write_sda((data & 0x08) >> 3); + } + + if (m_io1_direction & 0x10) + { + m_i2cmem->write_scl((data & 0x10) >> 4); + } + } } -WRITE8_MEMBER(xavix_state::io_2_w) +WRITE8_MEMBER(xavix_state::io0_direction_w) { - logerror("%s: io_2_w %02x\n", machine().describe_context(), data); + m_io0_direction = data; + logerror("%s: io0_direction_w %02x\n", machine().describe_context(), data); + io0_data_w(space,0,m_io0_data); } -WRITE8_MEMBER(xavix_state::io_3_w) +WRITE8_MEMBER(xavix_state::io1_direction_w) { - logerror("%s: io_3_w %02x\n", machine().describe_context(), data); + m_io1_direction = data; + logerror("%s: io1_direction_w %02x\n", machine().describe_context(), data); + io1_data_w(space,0,m_io1_data); // requires this for i2cmem to work, is it correct tho? } READ8_MEMBER(xavix_state::arena_start_r) @@ -460,6 +486,13 @@ void xavix_state::machine_reset() std::fill_n(&m_fragment_sprite[0], 0x800, 0x00); // taito nostalgia 1 never initializes the ram at 0x6400 but there's no condition on using it at present? m_lowbus->set_bank(0); + + m_io0_data = 0x00; + m_io1_data = 0x00; + + m_io0_direction = 0x00; + m_io1_direction = 0x00; + } typedef device_delegate xavix_interrupt_vector_delegate; -- cgit v1.2.3