mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
refactoring (nw)
This commit is contained in:
parent
c52b2b78a9
commit
24daffc184
@ -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",
|
||||
}
|
||||
|
@ -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_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, 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( 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?)
|
||||
|
||||
|
@ -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<xavix_device> m_maincpu;
|
||||
required_device<xavix_io_device> m_xavio;
|
||||
|
||||
|
||||
|
||||
optional_device<nvram_device> m_nvram;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<address_map_bank_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<i2cmem_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<i2cmem_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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction)
|
||||
{
|
||||
if (direction & 0x08)
|
||||
WRITE8_MEMBER(xavix_i2c_cart_state::write_cart_io1)
|
||||
{
|
||||
m_i2cmem->write_sda((data & 0x08) >> 3);
|
||||
}
|
||||
|
||||
if (direction & 0x10)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
106
src/mame/machine/xavix_io.cpp
Normal file
106
src/mame/machine/xavix_io.cpp
Normal file
@ -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;
|
||||
}
|
42
src/mame/machine/xavix_io.h
Normal file
42
src/mame/machine/xavix_io.h
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user