Skip to content

Commit

Permalink
start trying to improve superxavix IO
Browse files Browse the repository at this point in the history
  • Loading branch information
David Haywood committed Dec 26, 2024
1 parent 045a09b commit 2e6ec79
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 37 deletions.
19 changes: 8 additions & 11 deletions src/mame/tvgames/xavix2002_io.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,11 @@ void xavix2002_io_device::pio_out_w(offs_t offset, uint8_t data)
{
m_sx_pio_out[offset] = data;

// TODO: look at direction register

uint8_t outdata = m_sx_pio_out[offset] & m_sx_pio_dir[offset];

switch (offset)
{
case 0: m_out0_cb(outdata); break;
case 1: m_out1_cb(outdata); break;
case 2: m_out2_cb(outdata); break;
case 0: m_out0_cb(0, m_sx_pio_out[offset], m_sx_pio_dir[offset]); break;
case 1: m_out1_cb(0, m_sx_pio_out[offset], m_sx_pio_dir[offset]); break;
case 2: m_out2_cb(0, m_sx_pio_out[offset], m_sx_pio_dir[offset]); break;
default: break;
}
}
Expand Down Expand Up @@ -107,13 +103,14 @@ uint8_t xavix2002_io_device::pio_in_r(offs_t offset)

switch (offset)
{
case 0: ret = m_in0_cb(); break;
case 1: ret = m_in1_cb(); break;
case 2: ret = m_in2_cb(); break;
case 0: ret = m_in0_cb(0, m_sx_pio_dir[offset]); break;
case 1: ret = m_in1_cb(0, m_sx_pio_dir[offset]); break;
case 2: ret = m_in2_cb(0, m_sx_pio_dir[offset]); break;
default: ret = 0x00; break;
}

// mask with direction register before returning
ret &= ~m_sx_pio_dir[offset];
ret |= m_sx_pio_out[offset] & m_sx_pio_dir[offset];

return ret;
}
27 changes: 17 additions & 10 deletions src/mame/tvgames/xavix_2002.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -298,42 +298,49 @@ INPUT_PORTS_END

/* SuperXavix IO port handliner (per game) */

uint8_t superxavix_i2c_jmat_state::read_extended_io0()
uint8_t superxavix_i2c_jmat_state::read_extended_io0(offs_t offset, uint8_t mem_mask)
{
LOG("%s: read_extended_io0\n", machine().describe_context());
return 0x00;
}

uint8_t superxavix_i2c_jmat_state::read_extended_io1()
uint8_t superxavix_i2c_jmat_state::read_extended_io1(offs_t offset, uint8_t mem_mask)
{
LOG("%s: read_extended_io1\n", machine().describe_context());

uint8_t ret = 0x00;

// reads this by reading the byte, then shifting right 4 times to place value into carry flag
return m_i2cmem->read_sda() << 3;
//return 0x00;
if (!(mem_mask & 0x08))
ret |= m_i2cmem->read_sda() << 3;

return ret;
}

uint8_t superxavix_i2c_jmat_state::read_extended_io2()
uint8_t superxavix_i2c_jmat_state::read_extended_io2(offs_t offset, uint8_t mem_mask)
{
LOG("%s: read_extended_io2\n", machine().describe_context());
return 0x00;
}

void superxavix_i2c_jmat_state::write_extended_io0(uint8_t data)
void superxavix_i2c_jmat_state::write_extended_io0(offs_t offset, uint8_t data, uint8_t mem_mask)
{
LOG("%s: io0_data_w %02x\n", machine().describe_context(), data);
}

void superxavix_i2c_jmat_state::write_extended_io1(uint8_t data)
void superxavix_i2c_jmat_state::write_extended_io1(offs_t offset, uint8_t data, uint8_t mem_mask)
{
LOG("%s: io1_data_w %02x\n", machine().describe_context(), data);

m_i2cmem->write_sda((data & 0x08) >> 3);
m_i2cmem->write_scl((data & 0x10) >> 4);
if (mem_mask & 0x08)
m_i2cmem->write_sda((data & 0x08) >> 3);

if (mem_mask & 0x10)
m_i2cmem->write_scl((data & 0x10) >> 4);

}

void superxavix_i2c_jmat_state::write_extended_io2(uint8_t data)
void superxavix_i2c_jmat_state::write_extended_io2(offs_t offset, uint8_t data, uint8_t mem_mask)
{
LOG("%s: io2_data_w %02x\n", machine().describe_context(), data);
}
Expand Down
37 changes: 21 additions & 16 deletions src/mame/tvgames/xavix_2002.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ class superxavix_i2c_jmat_state : public superxavix_i2c_state
void init_xavmusic();

private:
uint8_t read_extended_io0();
uint8_t read_extended_io1();
uint8_t read_extended_io2();
void write_extended_io0(uint8_t data);
void write_extended_io1(uint8_t data);
void write_extended_io2(uint8_t data);
uint8_t read_extended_io0(offs_t offset, uint8_t mem_mask);
uint8_t read_extended_io1(offs_t offset, uint8_t mem_mask);
uint8_t read_extended_io2(offs_t offset, uint8_t mem_mask);
void write_extended_io0(offs_t offset, uint8_t data, uint8_t mem_mask);
void write_extended_io1(offs_t offset, uint8_t data, uint8_t mem_mask);
void write_extended_io2(offs_t offset, uint8_t data, uint8_t mem_mask);
};

class superxavix_super_tv_pc_state : public superxavix_state
Expand All @@ -49,18 +49,23 @@ class superxavix_super_tv_pc_state : public superxavix_state
uint8_t stvpc_anport0_r() { return (m_mouse0x->read()^0x7f)+1; }
uint8_t stvpc_anport1_r() { return (m_mouse0y->read()^0x7f)+1; }

uint8_t read_extended_io0() { return 0x00; }
uint8_t read_extended_io1() { return 0x00; }
uint8_t read_extended_io2() { return 0x00; }
void write_extended_io0(uint8_t data) { logerror("%s: extio0_w %02x\n", machine().describe_context(), data); }
void write_extended_io1(uint8_t data) { logerror("%s: extio1_w %02x\n", machine().describe_context(), data); }
void write_extended_io2(uint8_t data)
uint8_t read_extended_io0(offs_t offset, uint8_t mem_mask) { return 0x00; }
uint8_t read_extended_io1(offs_t offset, uint8_t mem_mask) { return 0x00; }
uint8_t read_extended_io2(offs_t offset, uint8_t mem_mask) { return 0x00; }
void write_extended_io0(offs_t offset, uint8_t data, uint8_t mem_mask) { logerror("%s: extio0_w %02x\n", machine().describe_context(), data); }
void write_extended_io1(offs_t offset, uint8_t data, uint8_t mem_mask) { logerror("%s: extio1_w %02x\n", machine().describe_context(), data); }
void write_extended_io2(offs_t offset, uint8_t data, uint8_t mem_mask)
{
logerror("%s: extio2_w %02x\n", machine().describe_context(), data);
if (data & 0x04)
m_rombank->set_entry(1);
else
m_rombank->set_entry(0);
{
if (mem_mask & 0x04)
{
if (data & 0x04)
m_rombank->set_entry(1);
else
m_rombank->set_entry(0);
}
}
}

virtual void xavix_extbus_map(address_map &map) override;
Expand Down

0 comments on commit 2e6ec79

Please sign in to comment.