tmtennis hooked up ports

This commit is contained in:
hap 2015-02-08 13:34:41 +01:00
parent 9739b4d15c
commit 713a4de6e8
3 changed files with 91 additions and 5 deletions

View File

@ -110,6 +110,8 @@ enum
void ucom4_cpu_device::device_start() void ucom4_cpu_device::device_start()
{ {
assert(NEC_UCOM4_PORTA == 0);
m_program = &space(AS_PROGRAM); m_program = &space(AS_PROGRAM);
m_data = &space(AS_DATA); m_data = &space(AS_DATA);
m_prgmask = (1 << m_prgwidth) - 1; m_prgmask = (1 << m_prgwidth) - 1;

View File

@ -38,17 +38,17 @@ UINT8 ucom4_cpu_device::input_r(int index)
switch (index) switch (index)
{ {
case NEC_UCOM4_PORTA: inp = m_read_a(index, 0xff) & 0xf; break; case NEC_UCOM4_PORTA: inp = m_read_a(index, 0xff); break;
case NEC_UCOM4_PORTB: inp = m_read_b(index, 0xff) & 0xf; break; case NEC_UCOM4_PORTB: inp = m_read_b(index, 0xff); break;
case NEC_UCOM4_PORTC: inp = m_read_c(index, 0xff) & 0xf; break; case NEC_UCOM4_PORTC: inp = m_read_c(index, 0xff); break;
case NEC_UCOM4_PORTD: inp = m_read_d(index, 0xff) & 0xf; break; case NEC_UCOM4_PORTD: inp = m_read_d(index, 0xff); break;
default: default:
logerror("%s read from unknown port %c at $%03X\n", tag(), 'A' + index, m_pc); logerror("%s read from unknown port %c at $%03X\n", tag(), 'A' + index, m_pc);
break; break;
} }
return inp; return inp & 0xf;
} }
void ucom4_cpu_device::output_w(int index, UINT8 data) void ucom4_cpu_device::output_w(int index, UINT8 data)

View File

@ -28,12 +28,23 @@ public:
tmtennis_state(const machine_config &mconfig, device_type type, const char *tag) tmtennis_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag), : driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_button_matrix(*this, "IN"),
m_speaker(*this, "speaker") m_speaker(*this, "speaker")
{ } { }
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_ioport_array<2> m_button_matrix;
required_device<speaker_sound_device> m_speaker; required_device<speaker_sound_device> m_speaker;
UINT8 m_input_mux;
UINT16 m_plate;
UINT16 m_grid;
DECLARE_READ8_MEMBER(input_r);
DECLARE_WRITE8_MEMBER(port_e_w);
DECLARE_WRITE8_MEMBER(plate_w);
DECLARE_WRITE8_MEMBER(grid_w);
virtual void machine_start(); virtual void machine_start();
}; };
@ -45,6 +56,42 @@ public:
***************************************************************************/ ***************************************************************************/
READ8_MEMBER(tmtennis_state::input_r)
{
// port A/B: buttons
UINT8 inp = 0xff;
// read selected button rows
for (int i = 0; i < 2; i++)
if (~m_input_mux & (1 << i))
inp &= m_button_matrix[i]->read();
return inp >> (offset*4);
}
WRITE8_MEMBER(tmtennis_state::port_e_w)
{
// E0/E1: input mux
// E2: speaker out
// E3: N/C
m_input_mux = data & 3;
m_speaker->level_w(data >> 2 & 1);
}
WRITE8_MEMBER(tmtennis_state::plate_w)
{
// port C/D/F: vfd matrix plate
if (offset == NEC_UCOM4_PORTF) offset--;
int shift = (offset - NEC_UCOM4_PORTC) * 4;
m_plate = (m_plate & ~(0xf << shift)) | (data << shift);
}
WRITE8_MEMBER(tmtennis_state::grid_w)
{
// port G/H/I: vfd matrix grid
int shift = (offset - NEC_UCOM4_PORTG) * 4;
m_grid = (m_grid & ~(0xf << shift)) | (data << shift);
}
/*************************************************************************** /***************************************************************************
@ -54,6 +101,25 @@ public:
***************************************************************************/ ***************************************************************************/
static INPUT_PORTS_START( tmtennis ) static INPUT_PORTS_START( tmtennis )
PORT_START("IN.0") // E0 port A/B
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(2)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(2)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(2)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(2)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(2)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_PLAYER(2)
PORT_START("IN.1") // E1 port A/B
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1 )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2 )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_BUTTON3 )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_BUTTON4 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON5 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON6 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON7 )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON8 )
INPUT_PORTS_END INPUT_PORTS_END
@ -66,6 +132,15 @@ INPUT_PORTS_END
void tmtennis_state::machine_start() void tmtennis_state::machine_start()
{ {
// zerofill
m_input_mux = 0;
m_plate = 0;
m_grid = 0;
// register for savestates
save_item(NAME(m_input_mux));
save_item(NAME(m_plate));
save_item(NAME(m_grid));
} }
@ -73,6 +148,15 @@ static MACHINE_CONFIG_START( tmtennis, tmtennis_state )
/* basic machine hardware */ /* basic machine hardware */
MCFG_CPU_ADD("maincpu", NEC_D552, MASTER_CLOCK_PRO2) MCFG_CPU_ADD("maincpu", NEC_D552, MASTER_CLOCK_PRO2)
MCFG_UCOM4_READ_A_CB(READ8(tmtennis_state, input_r))
MCFG_UCOM4_READ_B_CB(READ8(tmtennis_state, input_r))
MCFG_UCOM4_WRITE_C_CB(WRITE8(tmtennis_state, plate_w))
MCFG_UCOM4_WRITE_D_CB(WRITE8(tmtennis_state, plate_w))
MCFG_UCOM4_WRITE_E_CB(WRITE8(tmtennis_state, port_e_w))
MCFG_UCOM4_WRITE_F_CB(WRITE8(tmtennis_state, plate_w))
MCFG_UCOM4_WRITE_G_CB(WRITE8(tmtennis_state, grid_w))
MCFG_UCOM4_WRITE_H_CB(WRITE8(tmtennis_state, grid_w))
MCFG_UCOM4_WRITE_I_CB(WRITE8(tmtennis_state, grid_w))
MCFG_DEFAULT_LAYOUT(layout_tmtennis) MCFG_DEFAULT_LAYOUT(layout_tmtennis)