diff --git a/scripts/target/mame/mess.lua b/scripts/target/mame/mess.lua index 472bab12efd..4d84da56315 100644 --- a/scripts/target/mame/mess.lua +++ b/scripts/target/mame/mess.lua @@ -3501,6 +3501,8 @@ files { MAME_DIR .. "src/mame/machine/xavix_mtrk_wheel.h", MAME_DIR .. "src/mame/machine/xavix_madfb_ball.cpp", MAME_DIR .. "src/mame/machine/xavix_madfb_ball.h", + MAME_DIR .. "src/mame/machine/xavix_io.cpp", + MAME_DIR .. "src/mame/machine/xavix_io.h", MAME_DIR .. "src/mame/machine/xavix2002_io.cpp", MAME_DIR .. "src/mame/machine/xavix2002_io.h", } diff --git a/src/mame/drivers/xavix.cpp b/src/mame/drivers/xavix.cpp index 79e0425d74b..6822a463649 100644 --- a/src/mame/drivers/xavix.cpp +++ b/src/mame/drivers/xavix.cpp @@ -314,20 +314,15 @@ void xavix_state::xavix_lowbus_map(address_map &map) map(0x75f0, 0x75f1).rw(FUNC(xavix_state::sound_startstop_r), FUNC(xavix_state::sound_startstop_w)); // r/w tested read/written 8 times in a row map(0x75f2, 0x75f3).rw(FUNC(xavix_state::sound_updateenv_r), FUNC(xavix_state::sound_updateenv_w)); map(0x75f4, 0x75f5).r(FUNC(xavix_state::sound_sta16_r)); // related to 75f0 / 75f1 (read after writing there - rad_mtrk) - // taitons1 after 75f7/75f8 map(0x75f6, 0x75f6).rw(FUNC(xavix_state::sound_volume_r), FUNC(xavix_state::sound_volume_w)); // r/w tested - // taitons1 written as a pair map(0x75f7, 0x75f7).w(FUNC(xavix_state::sound_regbase_w)); map(0x75f8, 0x75f8).rw(FUNC(xavix_state::sound_75f8_r), FUNC(xavix_state::sound_75f8_w)); // r/w tested - // taitons1 written after 75f6, then read map(0x75f9, 0x75f9).rw(FUNC(xavix_state::sound_75f9_r), FUNC(xavix_state::sound_75f9_w)); - // at another time map(0x75fa, 0x75fa).rw(FUNC(xavix_state::sound_timer0_r), FUNC(xavix_state::sound_timer0_w)); // r/w tested map(0x75fb, 0x75fb).rw(FUNC(xavix_state::sound_timer1_r), FUNC(xavix_state::sound_timer1_w)); // r/w tested map(0x75fc, 0x75fc).rw(FUNC(xavix_state::sound_timer2_r), FUNC(xavix_state::sound_timer2_w)); // r/w tested map(0x75fd, 0x75fd).rw(FUNC(xavix_state::sound_timer3_r), FUNC(xavix_state::sound_timer3_w)); // r/w tested map(0x75fe, 0x75fe).rw(FUNC(xavix_state::sound_irqstatus_r), FUNC(xavix_state::sound_irqstatus_w)); - // taitons1 written other 75xx operations map(0x75ff, 0x75ff).w(FUNC(xavix_state::sound_75ff_w)); // Slot Registers @@ -343,10 +338,8 @@ 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::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)); + map(0x7a00, 0x7a01).rw("xavixio", FUNC(xavix_io_device::xav_7a0x_dat_r), FUNC(xavix_io_device::xav_7a0x_dat_w)); + map(0x7a02, 0x7a03).rw("xavixio", FUNC(xavix_io_device::xav_7a0x_dir_r), FUNC(xavix_io_device::xav_7a0x_dir_w)); // IO Event Interrupt control map(0x7a80, 0x7a80).rw(FUNC(xavix_state::ioevent_enable_r), FUNC(xavix_state::ioevent_enable_w)); @@ -1014,6 +1007,10 @@ void xavix_state::xavix(machine_config &config) PALETTE(config, m_palette, palette_device::BLACK, 256); + XAVIXIO(config, m_xavio, 0); + m_xavio->read_0_callback().set_ioport("IN0"); + m_xavio->read_1_callback().set_ioport("IN1"); + /* sound hardware */ //SPEAKER(config, "mono").front_center(); @@ -1032,6 +1029,9 @@ void xavix_i2c_state::xavix_i2c_24lc02(machine_config &config) { xavix(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x100); // 24LC02 (taiko) } @@ -1039,6 +1039,9 @@ void xavix_i2c_state::xavix_i2c_24c02(machine_config &config) { xavix(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24C02 } @@ -1046,6 +1049,9 @@ void xavix_i2c_state::xavix_i2c_24lc04(machine_config &config) { xavix(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + // according to http://ww1.microchip.com/downloads/en/devicedoc/21708k.pdf 'the master transmits up to 16 data bytes' however this breaks the Nostalgia games // of note Galplus Phalanx on Namco Nostalgia 2, which will hang between stages unable to properly access the device, but with no page support it doesn't hang and scores save I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x200); // 24LC04 on Nostalgia games, 24C04 on others @@ -1055,6 +1061,9 @@ void xavix_i2c_state::xavix_i2c_24c08(machine_config &config) { xavix(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0)/*.set_page_size(16)*/.set_data_size(0x400); // 24C08 (Excite Fishing DX) } @@ -1123,6 +1132,9 @@ void xavix_i2c_state::xavix2000_i2c_24c04(machine_config &config) { xavix2000(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24C04 } @@ -1130,9 +1142,20 @@ void xavix_i2c_state::xavix2000_i2c_24c02(machine_config &config) { xavix2000(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x100); // 24C02 } +void xavix_i2c_lotr_state::xavix2000_i2c_24c02_lotr(machine_config &config) +{ + xavix2000_i2c_24c02(config); + + m_xavio->read_1_callback().set(FUNC(xavix_i2c_lotr_state::read_lotr_io1)); +} + + void xavix_mtrk_state::xavix_mtrk(machine_config &config) { xavix(config); @@ -1173,10 +1196,13 @@ void xavix_i2c_cart_state::xavix_i2c_taiko(machine_config &config) SOFTWARE_LIST(config, "cart_list_japan_d").set_original("ekara_japan_d"); SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp"); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_cart_state::read_cart_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_cart_state::write_cart_io1)); + // do any of the later G/P series carts with SEEPROM work with this too? check } -void xavix_cart_state::xavix_cart_ekara(machine_config &config) +void xavix_ekara_state::xavix_cart_ekara(machine_config &config) { xavix_cart(config); @@ -1192,6 +1218,10 @@ void xavix_cart_state::xavix_cart_ekara(machine_config &config) SOFTWARE_LIST(config, "cart_list_japan_en").set_original("ekara_japan_en"); SOFTWARE_LIST(config, "cart_list_japan_sp").set_original("ekara_japan_sp"); SOFTWARE_LIST(config, "cart_list_japan_web").set_original("ekara_japan_web"); + + m_xavio->write_0_callback().set(FUNC(xavix_ekara_state::write_ekara_io0)); + m_xavio->read_1_callback().set(FUNC(xavix_ekara_state::read_ekara_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_ekara_state::write_ekara_io1)); } void xavix_cart_state::xavix_cart_popira(machine_config &config) @@ -1223,6 +1253,9 @@ void xavix_i2c_state::xavix2002_i2c_24c04(machine_config &config) { xavix2002(config); + m_xavio->read_1_callback().set(FUNC(xavix_i2c_state::read_io1)); + m_xavio->write_1_callback().set(FUNC(xavix_i2c_state::write_io1)); + I2CMEM(config, "i2cmem", 0).set_page_size(16).set_data_size(0x200); // 24C04 } @@ -1558,10 +1591,10 @@ ROM_END CONS( 2004, epo_sdb, 0, 0, xavix2000_nv, epo_sdb, xavix_state, init_xavix, "Epoch / SSD Company LTD", "Super Dash Ball (Japan)", MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) -CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02, xavix , xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_sw, 0, 0, xavix2000_i2c_24c02_lotr, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Star Wars Saga Edition - Lightsaber Battle Game", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_lotr, 0, 0, xavix2000_i2c_24c02_lotr, xavix, xavix_i2c_lotr_state, init_xavix, "Tiger / SSD Company LTD", "Lord Of The Rings - Warrior of Middle-Earth", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2005, ttv_mx, 0, 0, xavix2000_i2c_24c04, ttv_mx, xavix_i2c_state, init_xavix, "Tiger / SSD Company LTD", "MX Dirt Rebel", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) +CONS( 2003, drgqst, 0, 0, xavix2000_i2c_24c02_lotr, xavix, xavix_i2c_lotr_state, init_xavix, "Square Enix / SSD Company LTD", "Kenshin Dragon Quest: Yomigaerishi Densetsu no Ken", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_SOUND ) /* SuperXaviX (XaviX 2002 type CPU) hardware titles (3rd XaviX generation?) diff --git a/src/mame/includes/xavix.h b/src/mame/includes/xavix.h index 34e8783dd65..3ff2a63637b 100644 --- a/src/mame/includes/xavix.h +++ b/src/mame/includes/xavix.h @@ -19,6 +19,7 @@ #include "machine/xavix_mtrk_wheel.h" #include "machine/xavix_madfb_ball.h" #include "machine/xavix2002_io.h" +#include "machine/xavix_io.h" class xavix_sound_device : public device_t, public device_sound_interface { @@ -76,6 +77,7 @@ public: m_mouse1x(*this, "MOUSE1X"), m_mouse1y(*this, "MOUSE1Y"), m_maincpu(*this, "maincpu"), + m_xavio(*this, "xavixio"), m_nvram(*this, "nvram"), m_screen(*this, "screen"), m_lowbus(*this, "lowbus"), @@ -170,10 +172,10 @@ public: protected: - virtual uint8_t read_io0(uint8_t direction); - virtual uint8_t read_io1(uint8_t direction); - virtual void write_io0(uint8_t data, uint8_t direction); - virtual void write_io1(uint8_t data, uint8_t direction); + //virtual uint8_t read_io0(uint8_t direction); + //virtual uint8_t read_io1(uint8_t direction); + //virtual void write_io0(uint8_t data, uint8_t direction); + //virtual void write_io1(uint8_t data, uint8_t direction); required_ioport m_in0; required_ioport m_in1; required_ioport_array<8> m_an_in; @@ -182,6 +184,10 @@ protected: optional_ioport m_mouse1x; optional_ioport m_mouse1y; required_device m_maincpu; + required_device m_xavio; + + + optional_device m_nvram; required_device m_screen; required_device m_lowbus; @@ -303,21 +309,6 @@ private: DECLARE_WRITE8_MEMBER(spritefragment_dma_trg_w); DECLARE_READ8_MEMBER(spritefragment_dma_status_r); - DECLARE_READ8_MEMBER(io0_data_r); - DECLARE_READ8_MEMBER(io1_data_r); - DECLARE_WRITE8_MEMBER(io0_data_w); - DECLARE_WRITE8_MEMBER(io1_data_w); - - DECLARE_READ8_MEMBER(io0_direction_r); - DECLARE_READ8_MEMBER(io1_direction_r); - DECLARE_WRITE8_MEMBER(io0_direction_w); - DECLARE_WRITE8_MEMBER(io1_direction_w); - - uint8_t m_io0_data; - uint8_t m_io1_data; - uint8_t m_io0_direction; - uint8_t m_io1_direction; - uint8_t m_adc_inlatch; DECLARE_READ8_MEMBER(nmi_vector_lo_r); @@ -608,8 +599,8 @@ public: hackaddress2 = 0x8524; } protected: - virtual uint8_t read_io1(uint8_t direction) override; - virtual void write_io1(uint8_t data, uint8_t direction) override; + DECLARE_READ8_MEMBER(read_io1); + DECLARE_WRITE8_MEMBER(write_io1); required_device m_i2cmem; @@ -641,9 +632,10 @@ public: : xavix_i2c_state(mconfig, type, tag) { } + void xavix2000_i2c_24c02_lotr(machine_config &config); + protected: - virtual uint8_t read_io1(uint8_t direction) override; - //virtual void write_io1(uint8_t data, uint8_t direction) override; + DECLARE_READ8_MEMBER(read_lotr_io1); }; @@ -689,7 +681,6 @@ public: { } void xavix_cart(machine_config &config); - void xavix_cart_ekara(machine_config &config); void xavix_cart_popira(machine_config &config); void xavix_cart_ddrfammt(machine_config &config); @@ -851,8 +842,8 @@ public: void xavix_i2c_taiko(machine_config &config); protected: - virtual uint8_t read_io1(uint8_t direction) override; - virtual void write_io1(uint8_t data, uint8_t direction) override; + DECLARE_READ8_MEMBER(read_cart_io1); + DECLARE_WRITE8_MEMBER(write_cart_io1); required_device m_i2cmem; }; @@ -870,15 +861,16 @@ public: { } // void xavix_ekara(machine_config &config); + void xavix_cart_ekara(machine_config &config); protected: required_ioport m_extra0; required_ioport m_extra1; - virtual uint8_t read_io1(uint8_t direction) override; - virtual void write_io0(uint8_t data, uint8_t direction) override; - virtual void write_io1(uint8_t data, uint8_t direction) override; + DECLARE_READ8_MEMBER(read_ekara_io1); + DECLARE_WRITE8_MEMBER(write_ekara_io0); + DECLARE_WRITE8_MEMBER(write_ekara_io1); uint8_t m_extraioselect; uint8_t m_extraiowrite; diff --git a/src/mame/machine/xavix.cpp b/src/mame/machine/xavix.cpp index 505e43ac159..2925eb47c9d 100644 --- a/src/mame/machine/xavix.cpp +++ b/src/mame/machine/xavix.cpp @@ -488,42 +488,15 @@ WRITE8_MEMBER(xavix_state::dispctrl_posirq_y_w) /* Per Game IO port callbacks */ -uint8_t xavix_state::read_io0(uint8_t direction) -{ - // no special handling - return m_in0->read(); -} - -uint8_t xavix_state::read_io1(uint8_t direction) -{ - // no special handling - return m_in1->read(); -} - -void xavix_state::write_io0(uint8_t data, uint8_t direction) -{ - // no special handling -} - -void xavix_state::write_io1(uint8_t data, uint8_t direction) -{ - // no special handling -} - -uint8_t xavix_i2c_state::read_io1(uint8_t direction) +READ8_MEMBER(xavix_i2c_state::read_io1) { uint8_t ret = m_in1->read(); - - if (!(direction & 0x08)) - { - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - } - + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; return ret; } -void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction) +WRITE8_MEMBER(xavix_i2c_state::write_io1) { // ignore these writes so that epo_edfx can send read requests to the ee-prom and doesn't just report an error // TODO: check if these writes shouldn't be happening (the first is a direct write, the 2nd is from a port direction change) @@ -532,46 +505,28 @@ void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction) if ((m_maincpu->pc() == hackaddress1) || (m_maincpu->pc() == hackaddress2)) return; - if (direction & 0x08) - { - m_i2cmem->write_sda((data & 0x08) >> 3); - } - - if (direction & 0x10) - { - m_i2cmem->write_scl((data & 0x10) >> 4); - } + m_i2cmem->write_sda((data & 0x08) >> 3); + m_i2cmem->write_scl((data & 0x10) >> 4); } + // for taikodp -uint8_t xavix_i2c_cart_state::read_io1(uint8_t direction) +READ8_MEMBER(xavix_i2c_cart_state::read_cart_io1) { uint8_t ret = m_in1->read(); - - if (!(direction & 0x08)) - { - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - } - + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; return ret; } -void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction) +WRITE8_MEMBER(xavix_i2c_cart_state::write_cart_io1) { - if (direction & 0x08) - { - m_i2cmem->write_sda((data & 0x08) >> 3); - } - - if (direction & 0x10) - { - m_i2cmem->write_scl((data & 0x10) >> 4); - } + m_i2cmem->write_sda((data & 0x08) >> 3); + m_i2cmem->write_scl((data & 0x10) >> 4); } -uint8_t xavix_i2c_lotr_state::read_io1(uint8_t direction) +READ8_MEMBER(xavix_i2c_lotr_state::read_lotr_io1) { uint8_t ret = m_in1->read(); @@ -579,16 +534,13 @@ uint8_t xavix_i2c_lotr_state::read_io1(uint8_t direction) ret ^= (machine().rand() & 0x02); ret ^= (machine().rand() & 0x04); - if (!(direction & 0x08)) - { - ret &= ~0x08; - ret |= (m_i2cmem->read_sda() & 1) << 3; - } + ret &= ~0x08; + ret |= (m_i2cmem->read_sda() & 1) << 3; return ret; } -uint8_t xavix_ekara_state::read_io1(uint8_t direction) +READ8_MEMBER(xavix_ekara_state::read_ekara_io1) { uint8_t extrainlatch0 = 0x00; uint8_t extrainlatch1 = 0x00; @@ -635,74 +587,18 @@ uint8_t xavix_ekara_state::read_io1(uint8_t direction) return ret; } -void xavix_ekara_state::write_io0(uint8_t data, uint8_t direction) +WRITE8_MEMBER(xavix_ekara_state::write_ekara_io0) { // is bit 0x80 an enable for something else? LED? Microphone? it doesn't seem related to the multiplexing - m_extraioselect = data & direction; + m_extraioselect = data; } -void xavix_ekara_state::write_io1(uint8_t data, uint8_t direction) +WRITE8_MEMBER(xavix_ekara_state::write_ekara_io1) { - uint8_t extraiowrite = data & direction; + uint8_t extraiowrite = data; m_extraiowrite = extraiowrite; } -/* General IO port handling */ - -READ8_MEMBER(xavix_state::io0_data_r) -{ - uint8_t ret = read_io0(m_io0_direction) & ~m_io0_direction; - ret |= m_io0_data & m_io0_direction; - return ret; -} - -READ8_MEMBER(xavix_state::io1_data_r) -{ - uint8_t ret = read_io1(m_io1_direction) & ~m_io1_direction; - ret |= m_io1_data & m_io1_direction; - return ret; -} - -READ8_MEMBER(xavix_state::io0_direction_r) -{ - return m_io0_direction; -} - -READ8_MEMBER(xavix_state::io1_direction_r) -{ - return m_io1_direction; -} - - -WRITE8_MEMBER(xavix_state::io0_data_w) -{ - m_io0_data = data; - write_io0(data, m_io0_direction); - LOG("%s: io0_data_w %02x\n", machine().describe_context(), data); -} - -WRITE8_MEMBER(xavix_state::io1_data_w) -{ - m_io1_data = data; - write_io1(data, m_io1_direction); - LOG("%s: io1_data_w %02x\n", machine().describe_context(), data); -} - - -WRITE8_MEMBER(xavix_state::io0_direction_w) -{ - m_io0_direction = data; - LOG("%s: io0_direction_w %02x\n", machine().describe_context(), data); - io0_data_w(space, 0, m_io0_data); -} - -WRITE8_MEMBER(xavix_state::io1_direction_w) -{ - m_io1_direction = data; - LOG("%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? -} - /* Arena (Visible Area + hblank?) handling */ READ8_MEMBER(xavix_state::arena_start_r) @@ -1040,10 +936,6 @@ void xavix_state::machine_start() save_item(NAME(m_extbusctrl)); save_item(NAME(m_ioevent_enable)); save_item(NAME(m_ioevent_active)); - save_item(NAME(m_io0_data)); - save_item(NAME(m_io1_data)); - save_item(NAME(m_io0_direction)); - save_item(NAME(m_io1_direction)); save_item(NAME(m_adc_control)); save_item(NAME(m_sound_irqstatus)); save_item(NAME(m_soundreg16_0)); @@ -1127,12 +1019,6 @@ void xavix_state::machine_reset() //m_lowbus->set_bank(0); - m_io0_data = 0x00; - m_io1_data = 0x00; - - m_io0_direction = 0x00; - m_io1_direction = 0x00; - m_irqsource = 0x00; m_timer_control = 0x00; diff --git a/src/mame/machine/xavix2002_io.cpp b/src/mame/machine/xavix2002_io.cpp index 7fc69e4b95d..e05bac792e4 100644 --- a/src/mame/machine/xavix2002_io.cpp +++ b/src/mame/machine/xavix2002_io.cpp @@ -13,9 +13,9 @@ DEFINE_DEVICE_TYPE(XAVIX2002IO, xavix2002_io_device, "xavix2002io", "XaviX 2002 xavix2002_io_device::xavix2002_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, XAVIX2002IO, tag, owner, clock) - , m_space_read0_cb(*this) - , m_space_read1_cb(*this) - , m_space_read2_cb(*this) + , m_in0_cb(*this) + , m_in1_cb(*this) + , m_in2_cb(*this) , m_out0_cb(*this) , m_out1_cb(*this) , m_out2_cb(*this) @@ -24,9 +24,9 @@ xavix2002_io_device::xavix2002_io_device(const machine_config &mconfig, const ch void xavix2002_io_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_in0_cb.resolve_safe(0xff); + m_in1_cb.resolve_safe(0xff); + m_in2_cb.resolve_safe(0xff); m_out0_cb.resolve_safe(); m_out1_cb.resolve_safe(); @@ -103,9 +103,9 @@ READ8_MEMBER(xavix2002_io_device::pio_in_r) switch (offset) { - case 0: ret = m_space_read0_cb(); - case 1: ret = m_space_read1_cb(); - case 2: ret = m_space_read2_cb(); + case 0: ret = m_in0_cb(); + case 1: ret = m_in1_cb(); + case 2: ret = m_in2_cb(); default: ret = 0x00; } diff --git a/src/mame/machine/xavix2002_io.h b/src/mame/machine/xavix2002_io.h index bfddd799194..9f9ba9339ef 100644 --- a/src/mame/machine/xavix2002_io.h +++ b/src/mame/machine/xavix2002_io.h @@ -10,9 +10,9 @@ class xavix2002_io_device : public device_t public: xavix2002_io_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 read_0_callback() { return m_in0_cb.bind(); } + auto read_1_callback() { return m_in1_cb.bind(); } + auto read_2_callback() { return m_in2_cb.bind(); } auto write_0_callback() { return m_out0_cb.bind(); } auto write_1_callback() { return m_out1_cb.bind(); } @@ -32,9 +32,9 @@ 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_read8 m_in0_cb; + devcb_read8 m_in1_cb; + devcb_read8 m_in2_cb; devcb_write8 m_out0_cb; devcb_write8 m_out1_cb; diff --git a/src/mame/machine/xavix_io.cpp b/src/mame/machine/xavix_io.cpp new file mode 100644 index 00000000000..792a57fc372 --- /dev/null +++ b/src/mame/machine/xavix_io.cpp @@ -0,0 +1,106 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#include "emu.h" +#include "xavix_io.h" + +#define VERBOSE 0 +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(XAVIXIO, xavix_io_device, "xavixio", "XaviX IO") + +xavix_io_device::xavix_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : device_t(mconfig, XAVIXIO, tag, owner, clock) + , m_in0_cb(*this) + , m_in1_cb(*this) + , m_out0_cb(*this) + , m_out1_cb(*this) +{ +} + +void xavix_io_device::device_start() +{ + m_in0_cb.resolve_safe(0xff); + m_in1_cb.resolve_safe(0xff); + + m_out0_cb.resolve_safe(); + m_out1_cb.resolve_safe(); + + save_item(NAME(m_dir)); + save_item(NAME(m_dat)); +} + +void xavix_io_device::device_reset() +{ + for (int i = 0; i < 2; i++) + { + m_dir[i] = 0; + m_dat[i] = 0; + } +} + +// direction: 1 is out, 0 is in + +WRITE8_MEMBER(xavix_io_device::xav_7a0x_dir_w) +{ + LOG("%s: xavix IO xav_7a0x_dir_w (port %d) %02x\n", machine().describe_context(), offset, data); + if (offset < 2) + { + m_dir[offset] = data; + + // write out again in case of direction changes + uint8_t outdata = m_dat[offset] & m_dir[offset]; + + switch (offset) + { + case 0x0: m_out0_cb(space, 0, outdata); break; + case 0x1: m_out1_cb(space, 0, outdata); break; + } + } +} + +WRITE8_MEMBER(xavix_io_device::xav_7a0x_dat_w) +{ + LOG("%s: xavix IO xav_7a0x_dat_w (port %d) %02x\n", machine().describe_context(), offset, data); + if (offset < 2) + { + m_dat[offset] = data; + + uint8_t outdata = m_dat[offset] & m_dir[offset]; + + switch (offset) + { + case 0x0: m_out0_cb(space, 0, outdata); break; + case 0x1: m_out1_cb(space, 0, outdata); break; + } + } +} + +READ8_MEMBER(xavix_io_device::xav_7a0x_dir_r) +{ + uint8_t ret = 0x00; + LOG("%s: xavix IO xav_7a0x_dir_r (port %d)\n", machine().describe_context(), offset); + if (offset < 2) + { + ret = m_dir[offset]; + } + return ret; +} + +READ8_MEMBER(xavix_io_device::xav_7a0x_dat_r) +{ + uint8_t ret = 0x00; + LOG("%s: xavix IO xav_7a0x_dat_r (port %d)\n", machine().describe_context(), offset); + if (offset < 2) + { + switch (offset) + { + case 0x0: ret = m_in0_cb(space, 0); break; + case 0x1: ret = m_in1_cb(space, 0); break; + } + + ret &= ~m_dir[offset]; + ret |= m_dat[offset] & m_dir[offset]; + } + return ret; +} diff --git a/src/mame/machine/xavix_io.h b/src/mame/machine/xavix_io.h new file mode 100644 index 00000000000..31bb695d3f5 --- /dev/null +++ b/src/mame/machine/xavix_io.h @@ -0,0 +1,42 @@ +// license:BSD-3-Clause +// copyright-holders:David Haywood + +#ifndef MAME_MACHINE_XAVIX_IO_H +#define MAME_MACHINE_XAVIX_IO_H + +class xavix_io_device : public device_t +{ +public: + xavix_io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + + auto read_0_callback() { return m_in0_cb.bind(); } + auto read_1_callback() { return m_in1_cb.bind(); } + + auto write_0_callback() { return m_out0_cb.bind(); } + auto write_1_callback() { return m_out1_cb.bind(); } + + DECLARE_WRITE8_MEMBER(xav_7a0x_dir_w); + DECLARE_WRITE8_MEMBER(xav_7a0x_dat_w); + + DECLARE_READ8_MEMBER(xav_7a0x_dir_r); + DECLARE_READ8_MEMBER(xav_7a0x_dat_r); + +protected: + // device-level overrides + virtual void device_start() override; + virtual void device_reset() override; + +private: + devcb_read8 m_in0_cb; + devcb_read8 m_in1_cb; + + devcb_write8 m_out0_cb; + devcb_write8 m_out1_cb; + + uint8_t m_dir[2]; + uint8_t m_dat[2]; +}; + +DECLARE_DEVICE_TYPE(XAVIXIO, xavix_io_device) + +#endif // MAME_MACHINE_XAVIX_IO_H