trunk/src/mess/drivers/ql.c
r26713 | r26714 | |
783 | 783 | DEVCB_DRIVER_LINE_MEMBER(ql_state, ql_comdata_w), |
784 | 784 | DEVCB_NULL, // TXD1 |
785 | 785 | DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, serial_port_device, tx), |
786 | | DEVCB_NULL, // DTR1 |
787 | | DEVCB_DEVICE_LINE_MEMBER(RS232_B_TAG, rs232_port_device, cts_r), |
788 | 786 | DEVCB_NULL, // NETOUT |
789 | | DEVCB_NULL, // NETIN |
790 | 787 | DEVCB_DRIVER_LINE_MEMBER(ql_state, zx8302_mdselck_w), |
791 | 788 | DEVCB_DEVICE_LINE_MEMBER(MDV_1, microdrive_image_device, comms_in_w), |
792 | 789 | DEVCB_DRIVER_LINE_MEMBER(ql_state, zx8302_mdrdw_w), |
r26713 | r26714 | |
1008 | 1005 | MCFG_MICRODRIVE_ADD(MDV_2, mdv2_config) |
1009 | 1006 | MCFG_RS232_PORT_ADD(RS232_A_TAG, default_rs232_devices, NULL) // wired as DCE |
1010 | 1007 | MCFG_RS232_PORT_ADD(RS232_B_TAG, default_rs232_devices, NULL) // wired as DTE |
| 1008 | MCFG_RS232_OUT_CTS_HANDLER(DEVWRITELINE(ZX8302_TAG, zx8302_device, write_cts2)) |
1011 | 1009 | |
1012 | 1010 | // cartridge |
1013 | 1011 | MCFG_CARTSLOT_ADD("cart") |
trunk/src/mess/machine/zx8302.c
r26713 | r26714 | |
67 | 67 | memset(&out_comdata_cb, 0, sizeof(out_comdata_cb)); |
68 | 68 | memset(&out_txd1_cb, 0, sizeof(out_txd1_cb)); |
69 | 69 | memset(&out_txd2_cb, 0, sizeof(out_txd2_cb)); |
70 | | memset(&in_dtr1_cb, 0, sizeof(in_dtr1_cb)); |
71 | | memset(&in_cts2_cb, 0, sizeof(in_cts2_cb)); |
72 | 70 | memset(&out_netout_cb, 0, sizeof(out_netout_cb)); |
73 | | memset(&in_netin_cb, 0, sizeof(in_netin_cb)); |
74 | 71 | memset(&out_mdselck_cb, 0, sizeof(out_mdselck_cb)); |
75 | 72 | memset(&out_mdseld_cb, 0, sizeof(out_mdseld_cb)); |
76 | 73 | memset(&out_mdrdw_cb, 0, sizeof(out_mdrdw_cb)); |
r26713 | r26714 | |
175 | 172 | zx8302_device::zx8302_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
176 | 173 | : device_t(mconfig, ZX8302, "Sinclair ZX8302", tag, owner, clock, "zx8302", __FILE__), |
177 | 174 | device_serial_interface(mconfig, *this), |
| 175 | m_dtr1(0), |
| 176 | m_cts2(0), |
178 | 177 | m_idr(1), |
179 | 178 | m_irq(0), |
180 | 179 | m_ctr(time(NULL) + RTC_BASE_ADJUST), |
r26713 | r26714 | |
202 | 201 | m_out_comdata_func.resolve(out_comdata_cb, *this); |
203 | 202 | m_out_txd1_func.resolve(out_txd1_cb, *this); |
204 | 203 | m_out_txd2_func.resolve(out_txd2_cb, *this); |
205 | | m_in_dtr1_func.resolve(in_dtr1_cb, *this); |
206 | | m_in_cts2_func.resolve(in_cts2_cb, *this); |
207 | 204 | m_out_netout_func.resolve(out_netout_cb, *this); |
208 | | m_in_netin_func.resolve(in_netin_cb, *this); |
209 | 205 | m_out_mdselck_func.resolve(out_mdselck_cb, *this); |
210 | 206 | m_out_mdseld_func.resolve(out_mdseld_cb, *this); |
211 | 207 | m_out_mdrdw_func.resolve(out_mdrdw_cb, *this); |
r26713 | r26714 | |
225 | 221 | m_gap_timer->adjust(attotime::zero, 0, attotime::from_msec(31)); |
226 | 222 | |
227 | 223 | // register for state saving |
| 224 | save_item(NAME(m_dtr1)); |
| 225 | save_item(NAME(m_cts2)); |
228 | 226 | save_item(NAME(m_idr)); |
229 | 227 | save_item(NAME(m_tcr)); |
230 | 228 | save_item(NAME(m_tdr)); |
r26713 | r26714 | |
326 | 324 | switch (m_tcr & MODE_MASK) |
327 | 325 | { |
328 | 326 | case MODE_NET: |
329 | | receive_register_update_bit(m_in_netin_func()); |
| 327 | receive_register_update_bit(get_in_data_bit()); |
330 | 328 | break; |
331 | 329 | } |
332 | 330 | } |
r26713 | r26714 | |
457 | 455 | // TODO microdrive GAP |
458 | 456 | |
459 | 457 | // data terminal ready |
460 | | data |= m_in_dtr1_func() << 4; |
| 458 | data |= m_dtr1 << 4; |
461 | 459 | |
462 | 460 | // clear to send |
463 | | data |= m_in_cts2_func() << 5; |
| 461 | data |= m_cts2 << 5; |
464 | 462 | |
465 | 463 | // IPC busy |
466 | 464 | data |= m_ipc_busy << 6; |
r26713 | r26714 | |
634 | 632 | trigger_interrupt(INT_EXTERNAL); |
635 | 633 | } |
636 | 634 | } |
| 635 | |
| 636 | WRITE_LINE_MEMBER( zx8302_device::write_netin ) |
| 637 | { |
| 638 | if (state) |
| 639 | { |
| 640 | input_callback(m_input_state | RX); |
| 641 | } |
| 642 | else |
| 643 | { |
| 644 | input_callback(m_input_state & ~RX); |
| 645 | } |
| 646 | } |
| 647 | |
| 648 | WRITE_LINE_MEMBER( zx8302_device::write_dtr1 ) |
| 649 | { |
| 650 | m_dtr1 = state; |
| 651 | } |
| 652 | |
| 653 | WRITE_LINE_MEMBER( zx8302_device::write_cts2 ) |
| 654 | { |
| 655 | m_cts2 = state; |
| 656 | } |
trunk/src/mess/machine/zx8302.h
r26713 | r26714 | |
77 | 77 | devcb_write_line out_comdata_cb; |
78 | 78 | devcb_write_line out_txd1_cb; |
79 | 79 | devcb_write_line out_txd2_cb; |
80 | | devcb_read_line in_dtr1_cb; |
81 | | devcb_read_line in_cts2_cb; |
82 | 80 | devcb_write_line out_netout_cb; |
83 | | devcb_read_line in_netin_cb; |
84 | 81 | |
85 | 82 | // microdrive |
86 | 83 | devcb_write_line out_mdselck_cb; |
r26713 | r26714 | |
118 | 115 | DECLARE_WRITE_LINE_MEMBER( comdata_w ); |
119 | 116 | DECLARE_WRITE_LINE_MEMBER( extint_w ); |
120 | 117 | |
| 118 | DECLARE_WRITE_LINE_MEMBER( write_netin ); |
| 119 | DECLARE_WRITE_LINE_MEMBER( write_dtr1 ); |
| 120 | DECLARE_WRITE_LINE_MEMBER( write_cts2 ); |
| 121 | |
121 | 122 | protected: |
122 | 123 | // device-level overrides |
123 | 124 | virtual void device_start(); |
r26713 | r26714 | |
194 | 195 | devcb_resolved_write_line m_out_comdata_func; |
195 | 196 | devcb_resolved_write_line m_out_txd1_func; |
196 | 197 | devcb_resolved_write_line m_out_txd2_func; |
197 | | devcb_resolved_read_line m_in_dtr1_func; |
198 | | devcb_resolved_read_line m_in_cts2_func; |
199 | 198 | devcb_resolved_write_line m_out_netout_func; |
200 | | devcb_resolved_read_line m_in_netin_func; |
201 | 199 | |
202 | 200 | devcb_resolved_write_line m_out_mdselck_func; |
203 | 201 | devcb_resolved_write_line m_out_mdseld_func; |
r26713 | r26714 | |
208 | 206 | devcb_resolved_write_line m_out_raw2_func; |
209 | 207 | devcb_resolved_read_line m_in_raw2_func; |
210 | 208 | |
| 209 | int m_dtr1; |
| 210 | int m_cts2; |
| 211 | |
211 | 212 | // registers |
212 | 213 | UINT8 m_idr; // IPC data register |
213 | 214 | UINT8 m_tcr; // transfer control register |