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_NULL, // TXD1
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, // NETIN
DEVCB_DRIVER_LINE_MEMBER(ql_state, zx8302_mdselck_w),
DEVCB_DEVICE_LINE_MEMBER(MDV_1, microdrive_image_device, comms_in_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_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_OUT_CTS_HANDLER(DEVWRITELINE(ZX8302_TAG, zx8302_device, write_cts2))
// cartridge
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_txd1_cb, 0, sizeof(out_txd1_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(&in_netin_cb, 0, sizeof(in_netin_cb));
memset(&out_mdselck_cb, 0, sizeof(out_mdselck_cb));
memset(&out_mdseld_cb, 0, sizeof(out_mdseld_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)
: device_t(mconfig, ZX8302, "Sinclair ZX8302", tag, owner, clock, "zx8302", __FILE__),
device_serial_interface(mconfig, *this),
m_dtr1(0),
m_cts2(0),
m_idr(1),
m_irq(0),
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_txd1_func.resolve(out_txd1_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_in_netin_func.resolve(in_netin_cb, *this);
m_out_mdselck_func.resolve(out_mdselck_cb, *this);
m_out_mdseld_func.resolve(out_mdseld_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));
// register for state saving
save_item(NAME(m_dtr1));
save_item(NAME(m_cts2));
save_item(NAME(m_idr));
save_item(NAME(m_tcr));
save_item(NAME(m_tdr));
@ -326,7 +324,7 @@ void zx8302_device::rcv_callback()
switch (m_tcr & MODE_MASK)
{
case MODE_NET:
receive_register_update_bit(m_in_netin_func());
receive_register_update_bit(get_in_data_bit());
break;
}
}
@ -457,10 +455,10 @@ READ8_MEMBER( zx8302_device::status_r )
// TODO microdrive GAP
// data terminal ready
data |= m_in_dtr1_func() << 4;
data |= m_dtr1 << 4;
// clear to send
data |= m_in_cts2_func() << 5;
data |= m_cts2 << 5;
// IPC busy
data |= m_ipc_busy << 6;
@ -634,3 +632,25 @@ WRITE_LINE_MEMBER( zx8302_device::extint_w )
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_txd1_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_read_line in_netin_cb;
// microdrive
devcb_write_line out_mdselck_cb;
@ -118,6 +115,10 @@ public:
DECLARE_WRITE_LINE_MEMBER( comdata_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:
// device-level overrides
virtual void device_start();
@ -194,10 +195,7 @@ private:
devcb_resolved_write_line m_out_comdata_func;
devcb_resolved_write_line m_out_txd1_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_read_line m_in_netin_func;
devcb_resolved_write_line m_out_mdselck_func;
devcb_resolved_write_line m_out_mdseld_func;
@ -208,6 +206,9 @@ private:
devcb_resolved_write_line m_out_raw2_func;
devcb_resolved_read_line m_in_raw2_func;
int m_dtr1;
int m_cts2;
// registers
UINT8 m_idr; // IPC data register
UINT8 m_tcr; // transfer control register