replaced read netin/dtr1/cts2 callbacks in ZX8302 with write handlers, which allows multiple chips to be connected together without using glue methods. [smf]

This commit is contained in:
smf- 2013-12-23 12:31:00 +00:00
parent 81383a5c52
commit 02e1e04274
3 changed files with 37 additions and 18 deletions

View File

@ -783,10 +783,7 @@ static ZX8302_INTERFACE( ql_zx8302_intf )
DEVCB_DRIVER_LINE_MEMBER(ql_state, ql_comdata_w), DEVCB_DRIVER_LINE_MEMBER(ql_state, ql_comdata_w),
DEVCB_NULL, // TXD1 DEVCB_NULL, // TXD1
DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, serial_port_device, tx), DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, serial_port_device, tx),
DEVCB_NULL, // DTR1
DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, rs232_port_device, cts_r),
DEVCB_NULL, // NETOUT DEVCB_NULL, // NETOUT
DEVCB_NULL, // NETIN
DEVCB_DRIVER_LINE_MEMBER(ql_state, zx8302_mdselck_w), DEVCB_DRIVER_LINE_MEMBER(ql_state, zx8302_mdselck_w),
DEVCB_DEVICE_LINE_MEMBER(MDV_1, microdrive_image_device, comms_in_w), DEVCB_DEVICE_LINE_MEMBER(MDV_1, microdrive_image_device, comms_in_w),
DEVCB_DRIVER_LINE_MEMBER(ql_state, zx8302_mdrdw_w), DEVCB_DRIVER_LINE_MEMBER(ql_state, zx8302_mdrdw_w),
@ -1008,6 +1005,7 @@ static MACHINE_CONFIG_START( ql, ql_state )
MCFG_MICRODRIVE_ADD(MDV_2, mdv2_config) MCFG_MICRODRIVE_ADD(MDV_2, mdv2_config)
MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, NULL) // wired as DCE MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, NULL) // wired as DCE
MCFG_RS232_PORT_ADD(RS232_B_TAG, default_rs232_devices, NULL) // wired as DTE MCFG_RS232_PORT_ADD(RS232_B_TAG, default_rs232_devices, NULL) // wired as DTE
MCFG_RS232_OUT_CTS_HANDLER(DEVWRITELINE(ZX8302_TAG, zx8302_device, write_cts2))
// cartridge // cartridge
MCFG_CARTSLOT_ADD("cart") MCFG_CARTSLOT_ADD("cart")

View File

@ -67,10 +67,7 @@ void zx8302_device::device_config_complete()
memset(&out_comdata_cb, 0, sizeof(out_comdata_cb)); memset(&out_comdata_cb, 0, sizeof(out_comdata_cb));
memset(&out_txd1_cb, 0, sizeof(out_txd1_cb)); memset(&out_txd1_cb, 0, sizeof(out_txd1_cb));
memset(&out_txd2_cb, 0, sizeof(out_txd2_cb)); memset(&out_txd2_cb, 0, sizeof(out_txd2_cb));
memset(&in_dtr1_cb, 0, sizeof(in_dtr1_cb));
memset(&in_cts2_cb, 0, sizeof(in_cts2_cb));
memset(&out_netout_cb, 0, sizeof(out_netout_cb)); memset(&out_netout_cb, 0, sizeof(out_netout_cb));
memset(&in_netin_cb, 0, sizeof(in_netin_cb));
memset(&out_mdselck_cb, 0, sizeof(out_mdselck_cb)); memset(&out_mdselck_cb, 0, sizeof(out_mdselck_cb));
memset(&out_mdseld_cb, 0, sizeof(out_mdseld_cb)); memset(&out_mdseld_cb, 0, sizeof(out_mdseld_cb));
memset(&out_mdrdw_cb, 0, sizeof(out_mdrdw_cb)); memset(&out_mdrdw_cb, 0, sizeof(out_mdrdw_cb));
@ -175,6 +172,8 @@ inline void zx8302_device::transmit_ipc_data()
zx8302_device::zx8302_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) zx8302_device::zx8302_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, ZX8302, "Sinclair ZX8302", tag, owner, clock, "zx8302", __FILE__), : device_t(mconfig, ZX8302, "Sinclair ZX8302", tag, owner, clock, "zx8302", __FILE__),
device_serial_interface(mconfig, *this), device_serial_interface(mconfig, *this),
m_dtr1(0),
m_cts2(0),
m_idr(1), m_idr(1),
m_irq(0), m_irq(0),
m_ctr(time(NULL) + RTC_BASE_ADJUST), m_ctr(time(NULL) + RTC_BASE_ADJUST),
@ -202,10 +201,7 @@ void zx8302_device::device_start()
m_out_comdata_func.resolve(out_comdata_cb, *this); m_out_comdata_func.resolve(out_comdata_cb, *this);
m_out_txd1_func.resolve(out_txd1_cb, *this); m_out_txd1_func.resolve(out_txd1_cb, *this);
m_out_txd2_func.resolve(out_txd2_cb, *this); m_out_txd2_func.resolve(out_txd2_cb, *this);
m_in_dtr1_func.resolve(in_dtr1_cb, *this);
m_in_cts2_func.resolve(in_cts2_cb, *this);
m_out_netout_func.resolve(out_netout_cb, *this); m_out_netout_func.resolve(out_netout_cb, *this);
m_in_netin_func.resolve(in_netin_cb, *this);
m_out_mdselck_func.resolve(out_mdselck_cb, *this); m_out_mdselck_func.resolve(out_mdselck_cb, *this);
m_out_mdseld_func.resolve(out_mdseld_cb, *this); m_out_mdseld_func.resolve(out_mdseld_cb, *this);
m_out_mdrdw_func.resolve(out_mdrdw_cb, *this); m_out_mdrdw_func.resolve(out_mdrdw_cb, *this);
@ -225,6 +221,8 @@ void zx8302_device::device_start()
m_gap_timer->adjust(attotime::zero, 0, attotime::from_msec(31)); m_gap_timer->adjust(attotime::zero, 0, attotime::from_msec(31));
// register for state saving // register for state saving
save_item(NAME(m_dtr1));
save_item(NAME(m_cts2));
save_item(NAME(m_idr)); save_item(NAME(m_idr));
save_item(NAME(m_tcr)); save_item(NAME(m_tcr));
save_item(NAME(m_tdr)); save_item(NAME(m_tdr));
@ -326,7 +324,7 @@ void zx8302_device::rcv_callback()
switch (m_tcr & MODE_MASK) switch (m_tcr & MODE_MASK)
{ {
case MODE_NET: case MODE_NET:
receive_register_update_bit(m_in_netin_func()); receive_register_update_bit(get_in_data_bit());
break; break;
} }
} }
@ -457,10 +455,10 @@ READ8_MEMBER( zx8302_device::status_r )
// TODO microdrive GAP // TODO microdrive GAP
// data terminal ready // data terminal ready
data |= m_in_dtr1_func() << 4; data |= m_dtr1 << 4;
// clear to send // clear to send
data |= m_in_cts2_func() << 5; data |= m_cts2 << 5;
// IPC busy // IPC busy
data |= m_ipc_busy << 6; data |= m_ipc_busy << 6;
@ -634,3 +632,25 @@ WRITE_LINE_MEMBER( zx8302_device::extint_w )
trigger_interrupt(INT_EXTERNAL); trigger_interrupt(INT_EXTERNAL);
} }
} }
WRITE_LINE_MEMBER( zx8302_device::write_netin )
{
if (state)
{
input_callback(m_input_state | RX);
}
else
{
input_callback(m_input_state & ~RX);
}
}
WRITE_LINE_MEMBER( zx8302_device::write_dtr1 )
{
m_dtr1 = state;
}
WRITE_LINE_MEMBER( zx8302_device::write_cts2 )
{
m_cts2 = state;
}

View File

@ -77,10 +77,7 @@ struct zx8302_interface
devcb_write_line out_comdata_cb; devcb_write_line out_comdata_cb;
devcb_write_line out_txd1_cb; devcb_write_line out_txd1_cb;
devcb_write_line out_txd2_cb; devcb_write_line out_txd2_cb;
devcb_read_line in_dtr1_cb;
devcb_read_line in_cts2_cb;
devcb_write_line out_netout_cb; devcb_write_line out_netout_cb;
devcb_read_line in_netin_cb;
// microdrive // microdrive
devcb_write_line out_mdselck_cb; devcb_write_line out_mdselck_cb;
@ -118,6 +115,10 @@ public:
DECLARE_WRITE_LINE_MEMBER( comdata_w ); DECLARE_WRITE_LINE_MEMBER( comdata_w );
DECLARE_WRITE_LINE_MEMBER( extint_w ); DECLARE_WRITE_LINE_MEMBER( extint_w );
DECLARE_WRITE_LINE_MEMBER( write_netin );
DECLARE_WRITE_LINE_MEMBER( write_dtr1 );
DECLARE_WRITE_LINE_MEMBER( write_cts2 );
protected: protected:
// device-level overrides // device-level overrides
virtual void device_start(); virtual void device_start();
@ -194,10 +195,7 @@ private:
devcb_resolved_write_line m_out_comdata_func; devcb_resolved_write_line m_out_comdata_func;
devcb_resolved_write_line m_out_txd1_func; devcb_resolved_write_line m_out_txd1_func;
devcb_resolved_write_line m_out_txd2_func; devcb_resolved_write_line m_out_txd2_func;
devcb_resolved_read_line m_in_dtr1_func;
devcb_resolved_read_line m_in_cts2_func;
devcb_resolved_write_line m_out_netout_func; devcb_resolved_write_line m_out_netout_func;
devcb_resolved_read_line m_in_netin_func;
devcb_resolved_write_line m_out_mdselck_func; devcb_resolved_write_line m_out_mdselck_func;
devcb_resolved_write_line m_out_mdseld_func; devcb_resolved_write_line m_out_mdseld_func;
@ -208,6 +206,9 @@ private:
devcb_resolved_write_line m_out_raw2_func; devcb_resolved_write_line m_out_raw2_func;
devcb_resolved_read_line m_in_raw2_func; devcb_resolved_read_line m_in_raw2_func;
int m_dtr1;
int m_cts2;
// registers // registers
UINT8 m_idr; // IPC data register UINT8 m_idr; // IPC data register
UINT8 m_tcr; // transfer control register UINT8 m_tcr; // transfer control register