revert some refactoring changes for now, cause more problems than they solve (nw)

This commit is contained in:
DavidHaywood 2019-01-24 12:05:14 +00:00
parent 10bb978312
commit 10b63ef454
3 changed files with 173 additions and 88 deletions

View File

@ -358,8 +358,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, 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));
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));
// IO Event Interrupt control
map(0x7a80, 0x7a80).rw(FUNC(xavix_state::ioevent_enable_r), FUNC(xavix_state::ioevent_enable_w));
@ -1027,10 +1029,6 @@ 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();
@ -1049,9 +1047,6 @@ 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)
}
@ -1059,9 +1054,6 @@ 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
}
@ -1069,9 +1061,6 @@ 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
@ -1081,9 +1070,6 @@ 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)
}
@ -1152,9 +1138,6 @@ 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
}
@ -1162,20 +1145,9 @@ 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);
@ -1216,13 +1188,10 @@ 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_ekara_state::xavix_cart_ekara(machine_config &config)
void xavix_cart_state::xavix_cart_ekara(machine_config &config)
{
xavix_cart(config);
@ -1238,10 +1207,6 @@ void xavix_ekara_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)
@ -1273,9 +1238,6 @@ 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
}
@ -1611,10 +1573,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_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_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_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 )
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 )
/* SuperXaviX (XaviX 2002 type CPU) hardware titles (3rd XaviX generation?)

View File

@ -77,7 +77,6 @@ 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"),
@ -172,10 +171,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;
@ -184,10 +183,6 @@ 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;
@ -309,6 +304,21 @@ 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);
@ -599,8 +609,8 @@ public:
hackaddress2 = 0x8524;
}
protected:
DECLARE_READ8_MEMBER(read_io1);
DECLARE_WRITE8_MEMBER(write_io1);
virtual uint8_t read_io1(uint8_t direction) override;
virtual void write_io1(uint8_t data, uint8_t direction) override;
required_device<i2cmem_device> m_i2cmem;
@ -632,10 +642,9 @@ public:
: xavix_i2c_state(mconfig, type, tag)
{ }
void xavix2000_i2c_24c02_lotr(machine_config &config);
protected:
DECLARE_READ8_MEMBER(read_lotr_io1);
virtual uint8_t read_io1(uint8_t direction) override;
//virtual void write_io1(uint8_t data, uint8_t direction) override;
};
@ -681,6 +690,7 @@ 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);
@ -842,8 +852,8 @@ public:
void xavix_i2c_taiko(machine_config &config);
protected:
DECLARE_READ8_MEMBER(read_cart_io1);
DECLARE_WRITE8_MEMBER(write_cart_io1);
virtual uint8_t read_io1(uint8_t direction) override;
virtual void write_io1(uint8_t data, uint8_t direction) override;
required_device<i2cmem_device> m_i2cmem;
};
@ -861,16 +871,15 @@ public:
{ }
// void xavix_ekara(machine_config &config);
void xavix_cart_ekara(machine_config &config);
protected:
required_ioport m_extra0;
required_ioport m_extra1;
DECLARE_READ8_MEMBER(read_ekara_io1);
DECLARE_WRITE8_MEMBER(write_ekara_io0);
DECLARE_WRITE8_MEMBER(write_ekara_io1);
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;
uint8_t m_extraioselect;
uint8_t m_extraiowrite;

View File

@ -488,15 +488,42 @@ WRITE8_MEMBER(xavix_state::dispctrl_posirq_y_w)
/* Per Game IO port callbacks */
READ8_MEMBER(xavix_i2c_state::read_io1)
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)
{
uint8_t ret = m_in1->read();
if (!(direction & 0x08))
{
ret &= ~0x08;
ret |= (m_i2cmem->read_sda() & 1) << 3;
}
return ret;
}
WRITE8_MEMBER(xavix_i2c_state::write_io1)
void xavix_i2c_state::write_io1(uint8_t data, uint8_t direction)
{
// 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)
@ -505,28 +532,46 @@ WRITE8_MEMBER(xavix_i2c_state::write_io1)
if ((m_maincpu->pc() == hackaddress1) || (m_maincpu->pc() == hackaddress2))
return;
if (direction & 0x08)
{
m_i2cmem->write_sda((data & 0x08) >> 3);
m_i2cmem->write_scl((data & 0x10) >> 4);
}
if (direction & 0x10)
{
m_i2cmem->write_scl((data & 0x10) >> 4);
}
}
// for taikodp
READ8_MEMBER(xavix_i2c_cart_state::read_cart_io1)
uint8_t xavix_i2c_cart_state::read_io1(uint8_t direction)
{
uint8_t ret = m_in1->read();
if (!(direction & 0x08))
{
ret &= ~0x08;
ret |= (m_i2cmem->read_sda() & 1) << 3;
}
return ret;
}
WRITE8_MEMBER(xavix_i2c_cart_state::write_cart_io1)
void xavix_i2c_cart_state::write_io1(uint8_t data, uint8_t direction)
{
if (direction & 0x08)
{
m_i2cmem->write_sda((data & 0x08) >> 3);
}
if (direction & 0x10)
{
m_i2cmem->write_scl((data & 0x10) >> 4);
}
}
READ8_MEMBER(xavix_i2c_lotr_state::read_lotr_io1)
uint8_t xavix_i2c_lotr_state::read_io1(uint8_t direction)
{
uint8_t ret = m_in1->read();
@ -534,13 +579,16 @@ READ8_MEMBER(xavix_i2c_lotr_state::read_lotr_io1)
ret ^= (machine().rand() & 0x02);
ret ^= (machine().rand() & 0x04);
if (!(direction & 0x08))
{
ret &= ~0x08;
ret |= (m_i2cmem->read_sda() & 1) << 3;
}
return ret;
}
READ8_MEMBER(xavix_ekara_state::read_ekara_io1)
uint8_t xavix_ekara_state::read_io1(uint8_t direction)
{
uint8_t extrainlatch0 = 0x00;
uint8_t extrainlatch1 = 0x00;
@ -587,18 +635,74 @@ READ8_MEMBER(xavix_ekara_state::read_ekara_io1)
return ret;
}
WRITE8_MEMBER(xavix_ekara_state::write_ekara_io0)
void xavix_ekara_state::write_io0(uint8_t data, uint8_t direction)
{
// is bit 0x80 an enable for something else? LED? Microphone? it doesn't seem related to the multiplexing
m_extraioselect = data;
m_extraioselect = data & direction;
}
WRITE8_MEMBER(xavix_ekara_state::write_ekara_io1)
void xavix_ekara_state::write_io1(uint8_t data, uint8_t direction)
{
uint8_t extraiowrite = data;
uint8_t extraiowrite = data & direction;
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)
@ -936,6 +1040,10 @@ 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));
@ -1019,6 +1127,12 @@ 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;