Previous | 199869 Revisions | Next |
r22878 Friday 17th May, 2013 at 20:45:06 UTC by Curt Coder |
---|
i8251: Implemented 16X/64X clock modes. [Curt Coder] (MESS) xor100: Refactored to use serial terminal. [Curt Coder] |
[src/emu/machine] | i8251.c i8251.h |
[src/mess/drivers] | softbox.c xor100.c |
[src/mess/includes] | softbox.h xor100.h |
r22877 | r22878 | |
---|---|---|
139 | 139 | |
140 | 140 | void i8251_device::receive_clock() |
141 | 141 | { |
142 | m_rxc++; | |
143 | ||
144 | if (m_rxc == m_br_factor) | |
145 | m_rxc = 0; | |
146 | else | |
147 | return; | |
148 | ||
142 | 149 | /* receive enable? */ |
143 | 150 | if (m_command & (1<<2)) |
144 | 151 | { |
r22877 | r22878 | |
165 | 172 | |
166 | 173 | void i8251_device::transmit_clock() |
167 | 174 | { |
175 | m_txc++; | |
176 | ||
177 | if (m_txc == m_br_factor) | |
178 | m_txc = 0; | |
179 | else | |
180 | return; | |
181 | ||
168 | 182 | /* transmit enable? */ |
169 | 183 | if (m_command & (1<<0)) |
170 | 184 | { |
r22877 | r22878 | |
316 | 330 | m_mode_byte = 0; |
317 | 331 | m_command = 0; |
318 | 332 | m_data = 0; |
333 | m_rxc = m_txc = 0; | |
334 | m_br_factor = 1; | |
319 | 335 | |
320 | 336 | /* update tx empty pin output */ |
321 | 337 | update_tx_empty(); |
r22877 | r22878 | |
464 | 480 | } |
465 | 481 | set_data_frame(word_length,stop_bit_count,parity); |
466 | 482 | |
483 | switch (data & 0x03) | |
484 | { | |
485 | case 1: m_br_factor = 1; break; | |
486 | case 2: m_br_factor = 16; break; | |
487 | case 3: m_br_factor = 64; break; | |
488 | } | |
489 | ||
490 | m_rxc = m_txc = 0; | |
491 | ||
467 | 492 | #if 0 |
468 | 493 | /* data bits */ |
469 | 494 | m_receive_char_length = (((data>>2) & 0x03)+5); |
r22877 | r22878 | |
---|---|---|
119 | 119 | /* mode byte - bit definitions depend on mode - e.g. synchronous, asynchronous */ |
120 | 120 | UINT8 m_mode_byte; |
121 | 121 | |
122 | int m_rxc; | |
123 | int m_txc; | |
124 | int m_br_factor; | |
125 | ||
122 | 126 | /* data being received */ |
123 | 127 | UINT8 m_data; |
124 | 128 | }; |
r22877 | r22878 | |
---|---|---|
153 | 153 | m_dbrg->stt_w(data >> 4); |
154 | 154 | } |
155 | 155 | |
156 | WRITE8_MEMBER( xor100_state::i8251_b_data_w ) | |
157 | { | |
158 | m_uart_b->data_w(space, 0, data); | |
159 | m_terminal->write(space, 0, data); | |
160 | } | |
161 | ||
162 | 156 | READ8_MEMBER( xor100_state::fdc_r ) |
163 | 157 | { |
164 | 158 | return m_fdc->gen_r(offset) ^ 0xff; |
r22877 | r22878 | |
265 | 259 | ADDRESS_MAP_GLOBAL_MASK(0xff) |
266 | 260 | AM_RANGE(0x00, 0x00) AM_DEVREADWRITE(I8251_A_TAG, i8251_device, data_r, data_w) |
267 | 261 | AM_RANGE(0x01, 0x01) AM_DEVREADWRITE(I8251_A_TAG, i8251_device, status_r, control_w) |
268 | AM_RANGE(0x02, 0x02) AM_DEVREAD(I8251_B_TAG, i8251_device, data_r | |
262 | AM_RANGE(0x02, 0x02) AM_DEVREADWRITE(I8251_B_TAG, i8251_device, data_r, data_w) | |
269 | 263 | AM_RANGE(0x03, 0x03) AM_DEVREADWRITE(I8251_B_TAG, i8251_device, status_r, control_w) |
270 | 264 | AM_RANGE(0x04, 0x07) AM_DEVREADWRITE(I8255A_TAG, i8255_device, read, write) |
271 | 265 | AM_RANGE(0x08, 0x08) AM_WRITE(mmu_w) |
r22877 | r22878 | |
401 | 395 | |
402 | 396 | static const i8251_interface terminal_8251_intf = |
403 | 397 | { |
398 | DEVCB_DEVICE_LINE_MEMBER(TERMINAL_TAG, serial_terminal_device, tx_r), | |
399 | DEVCB_DEVICE_LINE_MEMBER(TERMINAL_TAG, serial_terminal_device, rx_w), | |
404 | 400 | DEVCB_NULL, |
405 | 401 | DEVCB_NULL, |
406 | 402 | DEVCB_NULL, |
407 | 403 | DEVCB_NULL, |
408 | 404 | DEVCB_NULL, |
409 | 405 | DEVCB_NULL, |
410 | DEVCB_NULL, | |
411 | DEVCB_NULL, | |
412 | 406 | DEVCB_NULL |
413 | 407 | }; |
414 | 408 | |
r22877 | r22878 | |
512 | 506 | |
513 | 507 | /* Terminal Interface */ |
514 | 508 | |
515 | WRITE8_MEMBER( xor100_state::xor100_kbd_put ) | |
516 | { | |
517 | m_uart_b->receive_character(data); | |
518 | } | |
509 | static DEVICE_INPUT_DEFAULTS_START( terminal ) | |
510 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x0f, 0x06 ) // 9600 | |
511 | DEVICE_INPUT_DEFAULTS( "TERM_FRAME", 0x30, 0x00 ) // 8N1 | |
512 | DEVICE_INPUT_DEFAULTS_END | |
519 | 513 | |
520 | 514 | static GENERIC_TERMINAL_INTERFACE( xor100_terminal_intf ) |
521 | 515 | { |
522 | DEVCB_ | |
516 | DEVCB_NULL | |
523 | 517 | }; |
524 | 518 | |
525 | 519 | static S100_INTERFACE( s100_intf ) |
r22877 | r22878 | |
598 | 592 | MCFG_FLOPPY_DRIVE_ADD(WD1795_TAG":3", xor100_floppies, NULL, NULL, floppy_image_device::default_floppy_formats) |
599 | 593 | |
600 | 594 | MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, xor100_centronics_intf) |
601 | MCFG_GENERIC_TERMINAL_ADD(TERMINAL_TAG, xor100_terminal_intf) | |
595 | MCFG_SERIAL_TERMINAL_ADD(TERMINAL_TAG, xor100_terminal_intf, 9600) | |
596 | MCFG_DEVICE_INPUT_DEFAULTS(terminal) | |
602 | 597 | |
603 | 598 | // S-100 |
604 | 599 | MCFG_S100_BUS_ADD(Z80_TAG, s100_intf) |
r22877 | r22878 | |
---|---|---|
246 | 246 | |
247 | 247 | WRITE_LINE_MEMBER( softbox_state::fr_w ) |
248 | 248 | { |
249 | m_rx_clock++; | |
250 | ||
251 | if (m_rx_clock & 0x10) | |
252 | { | |
253 | m_rx_clock = 0; | |
254 | m_usart->receive_clock(); | |
255 | } | |
249 | m_usart->receive_clock(); | |
256 | 250 | } |
257 | 251 | |
258 | 252 | WRITE_LINE_MEMBER( softbox_state::ft_w ) |
259 | 253 | { |
260 | m_tx_clock++; | |
261 | ||
262 | if (m_tx_clock & 0x10) | |
263 | { | |
264 | m_tx_clock = 0; | |
265 | m_usart->transmit_clock(); | |
266 | } | |
254 | m_usart->transmit_clock(); | |
267 | 255 | } |
268 | 256 | |
269 | 257 | static COM8116_INTERFACE( dbrg_intf ) |
r22877 | r22878 | |
---|---|---|
70 | 70 | DECLARE_WRITE8_MEMBER( prom_toggle_w ); |
71 | 71 | DECLARE_READ8_MEMBER( prom_disable_r ); |
72 | 72 | DECLARE_WRITE8_MEMBER( baud_w ); |
73 | DECLARE_WRITE8_MEMBER( i8251_b_data_w ); | |
74 | 73 | DECLARE_READ8_MEMBER( fdc_r ); |
75 | 74 | DECLARE_WRITE8_MEMBER( fdc_w ); |
76 | 75 | DECLARE_READ8_MEMBER( fdc_wait_r ); |
r22877 | r22878 | |
---|---|---|
26 | 26 | m_maincpu(*this, Z80_TAG), |
27 | 27 | m_usart(*this, I8251_TAG), |
28 | 28 | m_dbrg(*this, COM8116_TAG), |
29 | m_ieee(*this, IEEE488_TAG), | |
30 | m_rx_clock(0), | |
31 | m_tx_clock(0) | |
29 | m_ieee(*this, IEEE488_TAG) | |
32 | 30 | { } |
33 | 31 | |
34 | 32 | required_device<cpu_device> m_maincpu; |
r22877 | r22878 | |
53 | 51 | LED_B, |
54 | 52 | LED_READY |
55 | 53 | }; |
56 | ||
57 | int m_rx_clock; | |
58 | int m_tx_clock; | |
59 | 54 | }; |
60 | 55 | |
61 | 56 | #endif |
Previous | 199869 Revisions | Next |