1 // license:BSD-3-Clause
2 // copyright-holders: Joakim Larsson Edstrom
3 /***************************************************************************
4
5 MPCC Multi-Protocol Communications Controller emulation
6
7 The MPCC was introduced in the late 80:ies by Rockwell
8
9 The variants in the MPCC family are as follows:
10
11 - 68560 with an 8 bit data bus
12 - 68560A with an 8 bit data bus and some enhancements
13 - 68561 with a 16 bit data bus
14 - 68561A with a 16 bit data bus and some enhancements
15
16 FEATURES
17 ------------------------------------------------------------------
18 * Full duplex synchronous/asynchronous receiver and transmitter
19 * Implements IBM Binary Synchronous Communications (BSC) in two coding formats: ASCII and EBCDIC
20 * Supports other synchronous character -oriented protocols (COP), such as six -bit BSC, X3.28k. ISO IS1745, ECMA-16, etc.
21 * Supports synchronous bit oriented protocols (BOP), such as SDLC, HDLC, X.25, etc.
22 * Asynchronous and isochronous modes
23 * Modem handshake interface
24 * High speed serial data rate (DC to 4 MHz)
25 * Internal oscillator and baud rate generator with programmable data rate
26 * Crystal or TTL level clock input and buffered clock output (8 MHz)
27 * Direct interface to 68008/68000 asynchronous bus
28 * Eight -character receiver and transmitter buffer registers
29 * 22 directly addressable registers for flexible option selection, complete status reporting, and data transfer
30 * Three separate programmable interrupt vector numbers for receiver, transmitter and serial interface
31 * Maskable interrupt conditions for receiver, transmitter and serial interface
32 * Programmable microprocessor bus data transfer; polled, interrupt and two -channel DMA transfer compatible with MC68440/MC68450
33 * Clock control register for receiver clock divisor and receiver and transmitter clock routing
34 * Selectable full/half duplex, autoecho and local loop -back modes
35 * Selectable parity (enable, odd, even) and CRC (control field enable, CRC -16, CCITT V.41, VRC/LRC)
36 *-------------------------------------------------------------------------------------------
37 * x = Features that has been implemented p = partly n = features that will not
38 *-------------------------------------------------------------------------------------------
39 */
40
41 #include "emu.h"
42 #include "68561mpcc.h"
43
44 //**************************************************************************
45 // MACROS / CONSTANTS
46 //**************************************************************************
47 //#define LOG_GENERAL (1U << 0)
48 #define LOG_SETUP (1U << 1)
49 #define LOG_INT (1U << 2)
50 #define LOG_READ (1U << 4)
51 #define LOG_CMD (1U << 5)
52 #define LOG_TX (1U << 6)
53 #define LOG_RCV (1U << 7)
54 #define LOG_CTS (1U << 8)
55 #define LOG_DCD (1U << 9)
56 #define LOG_SYNC (1U << 10)
57 #define LOG_CHAR (1U << 11)
58 #define LOG_RX (1U << 12)
59
60 //#define VERBOSE ( LOG_SETUP | LOG_GENERAL | LOG_INT)
61 //#define LOG_OUTPUT_FUNC printf
62
63 #include "logmacro.h"
64
65 //#define LOG(...) LOGMASKED(LOG_GENERAL, __VA_ARGS__)
66 #define LOGSETUP(...) LOGMASKED(LOG_SETUP, __VA_ARGS__)
67 #define LOGR(...) LOGMASKED(LOG_READ, __VA_ARGS__)
68 #define LOGINT(...) LOGMASKED(LOG_INT, __VA_ARGS__)
69 #define LOGCMD(...) LOGMASKED(LOG_CMD, __VA_ARGS__)
70 #define LOGTX(...) LOGMASKED(LOG_TX, __VA_ARGS__)
71 #define LOGRCV(...) LOGMASKED(LOG_RCV, __VA_ARGS__)
72 #define LOGCTS(...) LOGMASKED(LOG_CTS, __VA_ARGS__)
73 #define LOGDCD(...) LOGMASKED(LOG_DCD, __VA_ARGS__)
74 #define LOGSYNC(...) LOGMASKED(LOG_SYNC, __VA_ARGS__)
75 #define LOGCHAR(...) LOGMASKED(LOG_CHAR, __VA_ARGS__)
76 #define LOGRX(...) LOGMASKED(LOG_RX, __VA_ARGS__)
77
78 #ifdef _MSC_VER
79 #define FUNCNAME __func__
80 #else
81 #define FUNCNAME __PRETTY_FUNCTION__
82 #endif
83
84 //**************************************************************************
85 // DEVICE DEFINITIONS
86 //**************************************************************************
87 // device type definition
88 DEFINE_DEVICE_TYPE(MPCC, mpcc_device, "mpcc", "Rockwell MPCC")
89 DEFINE_DEVICE_TYPE(MPCC68560, mpcc68560_device, "mpcc68560", "MPCC 68560")
90 DEFINE_DEVICE_TYPE(MPCC68560A, mpcc68560a_device, "mpcc68560a", "MPCC 68560A")
91 DEFINE_DEVICE_TYPE(MPCC68561, mpcc68561_device, "mpcc68561", "MPCC 68561")
92 DEFINE_DEVICE_TYPE(MPCC68561A, mpcc68561a_device, "mpcc68561a", "MPCC 68561A")
93
94 //**************************************************************************
95 // LIVE DEVICE
96 //**************************************************************************
97
mpcc_device(const machine_config & mconfig,device_type type,const char * tag,device_t * owner,uint32_t clock,uint32_t variant)98 mpcc_device::mpcc_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, uint32_t variant)
99 : device_t(mconfig, type, tag, owner, clock),
100 device_serial_interface(mconfig, *this),
101 m_irq(CLEAR_LINE),
102 m_variant(variant),
103 m_rxc(0),
104 m_txc(0),
105 m_brg_rate(0),
106 m_rcv(0),
107 m_rxd(0),
108 m_tra(0),
109 m_out_txd_cb(*this),
110 m_out_dtr_cb(*this),
111 m_out_rts_cb(*this),
112 m_out_rtxc_cb(*this),
113 m_out_trxc_cb(*this),
114 m_out_int_cb(*this),
115 m_rsr(0),
116 m_rcr(0),
117 m_rdr(0),
118 m_rivnr(0),
119 m_rier(0),
120 m_tsr(0),
121 m_tcr(0),
122 m_tdr(0),
123 m_tivnr(0),
124 m_tier(0),
125 m_sisr(0),
126 m_sicr(0),
127 m_sivnr(0),
128 m_sier(0),
129 m_psr1(0),
130 m_psr2(0),
131 m_ar1(0),
132 m_ar2(0),
133 m_brdr1(0),
134 m_brdr2(0),
135 m_ccr(0),
136 m_ecr(0)
137 {
138 for (auto & elem : m_int_state)
139 elem = 0;
140 }
141
mpcc_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)142 mpcc_device::mpcc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
143 : mpcc_device(mconfig, MPCC, tag, owner, clock, TYPE_MPCC)
144 {
145 }
146
mpcc68560_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)147 mpcc68560_device::mpcc68560_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
148 : mpcc_device(mconfig, MPCC68560, tag, owner, clock, TYPE_MPCC68560)
149 {
150 }
151
mpcc68560a_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)152 mpcc68560a_device::mpcc68560a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
153 : mpcc_device(mconfig, MPCC68560A, tag, owner, clock, TYPE_MPCC68560A)
154 {
155 }
156
mpcc68561_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)157 mpcc68561_device::mpcc68561_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
158 : mpcc_device(mconfig, MPCC68561, tag, owner, clock, TYPE_MPCC68561)
159 {
160 }
161
mpcc68561a_device(const machine_config & mconfig,const char * tag,device_t * owner,uint32_t clock)162 mpcc68561a_device::mpcc68561a_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
163 : mpcc_device(mconfig, MPCC68561A, tag, owner, clock, TYPE_MPCC68561A)
164 {
165 }
166
167 //-------------------------------------------------
168 // device_start - device-specific startup
169 //-------------------------------------------------
device_start()170 void mpcc_device::device_start()
171 {
172 LOGSETUP("%s\n", FUNCNAME);
173
174 // resolve callbacks
175 m_out_txd_cb.resolve_safe();
176 m_out_dtr_cb.resolve_safe();
177 m_out_rts_cb.resolve_safe();
178 m_out_rtxc_cb.resolve_safe();
179 m_out_trxc_cb.resolve_safe();
180 m_out_int_cb.resolve_safe();
181
182 // state saving
183 save_item(NAME(m_int_state));
184 save_item(NAME(m_rsr));
185 save_item(NAME(m_rcr));
186 save_item(NAME(m_rdr));
187 save_item(NAME(m_rivnr));
188 save_item(NAME(m_rier));
189 save_item(NAME(m_tsr));
190 save_item(NAME(m_tcr));
191 save_item(NAME(m_tdr));
192 save_item(NAME(m_tivnr));
193 save_item(NAME(m_tier));
194 save_item(NAME(m_sisr));
195 save_item(NAME(m_sicr));
196 save_item(NAME(m_sivnr));
197 save_item(NAME(m_sier));
198 save_item(NAME(m_psr1));
199 save_item(NAME(m_psr2));
200 save_item(NAME(m_ar1));
201 save_item(NAME(m_ar2));
202 save_item(NAME(m_brdr1));
203 save_item(NAME(m_brdr2));
204 save_item(NAME(m_ccr));
205 save_item(NAME(m_ecr));
206 LOG(" - MPCC variant %02x\n", m_variant);
207 }
208
209 //-------------------------------------------------
210 // device_reset - device-specific reset
211 //-------------------------------------------------
device_reset()212 void mpcc_device::device_reset()
213 {
214 LOGSETUP("%s %s \n",tag(), FUNCNAME);
215
216 // Reset RS232 emulation
217 receive_register_reset();
218 transmit_register_reset();
219
220 // Device reset values
221 m_rsr = 0x00;
222 m_rcr = 0x01;
223 m_rivnr = 0x0f;
224 m_rier = 0x00;
225 m_tsr = 0x80;
226 m_tcr = 0x01;
227 m_tivnr = 0x0f;
228 m_tier = 0x00;
229 m_sisr = 0x00;
230 m_sicr = 0x00;
231 m_sivnr = 0x0f;
232 m_sier = 0x00;
233 m_psr1 = 0x00;
234 m_psr2 = 0x00;
235 m_ar1 = 0x00;
236 m_ar2 = 0x00;
237 m_brdr1 = 0x01;
238 m_brdr2 = 0x00;
239 m_ccr = 0x00;
240 m_ecr = 0x04;
241
242 // Clear fifos
243 m_tx_data_fifo.clear();
244 m_rx_data_fifo.clear();
245
246 // Init out callbacks to known inactive state
247 m_out_txd_cb(1);
248 m_out_dtr_cb(CLEAR_LINE);
249 m_out_rts_cb(CLEAR_LINE);
250 m_out_rtxc_cb(CLEAR_LINE);
251 m_out_trxc_cb(CLEAR_LINE);
252 m_out_int_cb(CLEAR_LINE);
253 m_irq = CLEAR_LINE;
254 }
255
256 /*
257 * Serial device implementation
258 */
WRITE_LINE_MEMBER(mpcc_device::cts_w)259 WRITE_LINE_MEMBER(mpcc_device::cts_w)
260 {
261 if (state == CLEAR_LINE)
262 {
263 uint8_t old_sisr = m_sisr;
264
265 m_sisr &= ~REG_SISR_CTSLVL;
266 if ( (old_sisr & REG_SISR_CTSLVL) &&
267 (m_sicr & REG_SICR_RTSLVL) &&
268 (m_tcr & REG_TCR_TEN))
269 {
270 m_sisr |= REG_SISR_CTST;
271 if (m_sier & REG_SIER_CTS)
272 {
273 // TODO: make sure interrupt is issued with the next negative transition of TxC
274 trigger_interrupt(INT_SR_CTS);
275 // TODO: Make sure TxC has negative transition after CTS goes inactive before INT can be reset in SISR7
276 }
277 }
278 }
279 else
280 m_sisr |= REG_SISR_CTSLVL;
281 }
282
WRITE_LINE_MEMBER(mpcc_device::dsr_w)283 WRITE_LINE_MEMBER(mpcc_device::dsr_w)
284 {
285 if (state == ASSERT_LINE)
286 {
287 uint8_t old_sisr = m_sisr;
288
289 m_sisr |= REG_SISR_DSRLVL;
290 if ( !(old_sisr & REG_SISR_DSRLVL) &&
291 !(m_rcr & REG_RCR_RRES))
292 {
293 m_sisr |= REG_SISR_DSRT;
294 if (m_sier & REG_SIER_DSR)
295 {
296 // TODO: make sure interrupt is issued with the next negative transition of RxC
297 trigger_interrupt(INT_SR_DSR);
298 // TODO: Make sure RxC has negative transition after DSR goes inactive before INT can be reset in SISR6
299 }
300 }
301 }
302 else
303 m_sisr &= ~REG_SISR_DSRLVL;
304 }
305
WRITE_LINE_MEMBER(mpcc_device::dcd_w)306 WRITE_LINE_MEMBER(mpcc_device::dcd_w)
307 {
308 if (state == CLEAR_LINE)
309 {
310 uint8_t old_sisr = m_sisr;
311
312 m_sisr &= ~REG_SISR_DCDLVL;
313 if ( (old_sisr & REG_SISR_DCDLVL) &&
314 !(m_rcr & REG_RCR_RRES))
315 {
316 m_sisr |= REG_SISR_DCDT;
317 if (m_sier & REG_SIER_DCD)
318 {
319 // TODO: make sure interrupt is issued with the next negative transition of RxC
320 trigger_interrupt(INT_SR_DCD);
321 // TODO: Make sure RxC has negative transition before INT can be reset in SISR5
322 }
323 }
324 }
325 else
326 m_sisr |= REG_SISR_DCDLVL;
327 }
328
329 //-------------------------------------------------
330 // get_brg_rate - helper function
331 //-------------------------------------------------
get_brg_rate()332 uint32_t mpcc_device::get_brg_rate()
333 {
334 uint32_t rate;
335 uint32_t brg_const;
336
337 brg_const = (m_brdr1 | m_brdr2 << 8); // Baud rate divider
338 brg_const += (m_ccr & REG_CCR_PSCDIV) ? 3 : 2; // Add prescaler factor
339 brg_const += (m_psr2 & REG_PSR2_PSEL_MSK) == REG_PSR2_PSEL_ASCII ? 2 : 1; // Add K factor
340 rate = clock() / brg_const;
341
342 return rate;
343 }
344
345 //-------------------------------------------------
346 // get_tx_rate - helper function
347 //-------------------------------------------------
get_tx_rate()348 uint32_t mpcc_device::get_tx_rate()
349 {
350 uint32_t rate;
351
352 // Check if TxC is an input and use it instead of the BRG
353 if ((m_ccr & REG_CCR_TCLO) == 0)
354 {
355 rate = m_txc;
356 }
357 else
358 {
359 rate = get_brg_rate();
360 }
361
362 return rate;
363 }
364
365 //-------------------------------------------------
366 // get_clock_div - helper function
367 //-------------------------------------------------
get_clock_div()368 uint32_t mpcc_device::get_clock_div()
369 {
370 uint32_t clk_div = 1;
371
372 switch (m_ccr & REG_CCR_CLKDIV_MSK)
373 {
374 case REG_CCR_CLKDIV_X1 : clk_div = 1; break;
375 case REG_CCR_CLKDIV_X16: clk_div = 16; break;
376 case REG_CCR_CLKDIV_X32: clk_div = 32; break;
377 case REG_CCR_CLKDIV_X64: clk_div = 64; break;
378 }
379
380 return clk_div;
381 }
382
383 //-------------------------------------------------
384 // get_rx_rate - helper function
385 //-------------------------------------------------
get_rx_rate()386 uint32_t mpcc_device::get_rx_rate()
387 {
388 uint32_t rate;
389
390 // Check if TxC is an input and use it instead of the BRG
391 if ((m_ccr & REG_CCR_RCLKIN) == 0)
392 {
393 rate = m_rxc / get_clock_div();
394 }
395 else
396 {
397 rate = get_brg_rate();
398 }
399
400 return rate;
401 }
402
403 //-------------------------------------------------
404 // get_word_length - get word length
405 //-------------------------------------------------
get_word_length()406 uint32_t mpcc_device::get_word_length()
407 {
408 int bits = 5;
409
410 switch (m_psr2 & REG_PSR2_CHLN_MSK)
411 {
412 case REG_PSR2_CHLN_5: bits = 5; break;
413 case REG_PSR2_CHLN_6: bits = 6; break;
414 case REG_PSR2_CHLN_7: bits = 7; break;
415 case REG_PSR2_CHLN_8: bits = 8; break;
416 }
417
418 return bits;
419 }
420
421 //-------------------------------------------------
422 // get_stop_bits - translate stop bit settings for serial interface
423 //-------------------------------------------------
get_stop_bits()424 device_serial_interface::stop_bits_t mpcc_device::get_stop_bits()
425 {
426 switch (m_psr2 & REG_PSR2_STP_MSK)
427 {
428 case REG_PSR2_STP_1: return STOP_BITS_1;
429 case REG_PSR2_STP_1_5: return STOP_BITS_1_5;
430 case REG_PSR2_STP_2: return STOP_BITS_2;
431 }
432
433 return STOP_BITS_0;
434 }
435
436 //-------------------------------------------------
437 // get_parity - translate parity settings for serial interface
438 //-------------------------------------------------
get_parity()439 device_serial_interface::parity_t mpcc_device::get_parity()
440 {
441 parity_t parity;
442
443 if (m_ecr & REG_ECR_PAREN)
444 {
445 if (m_ecr & REG_ECR_ODDPAR)
446 parity = PARITY_ODD;
447 else
448 parity = PARITY_EVEN;
449 }
450 else
451 {
452 parity = PARITY_NONE;
453 }
454 return parity;
455 }
456
457 //-------------------------------------------------
458 // update_serial -
459 //-------------------------------------------------
update_serial()460 void mpcc_device::update_serial()
461 {
462 int data_bits = get_word_length();
463 stop_bits_t stop_bits = get_stop_bits();
464 parity_t parity = get_parity();
465
466 LOGSETUP(" %s() %s Setting data frame %d+%d%c%s\n", FUNCNAME, owner()->tag(), 1,
467 data_bits, parity == PARITY_NONE ? 'N' : parity == PARITY_EVEN ? 'E' : 'O',
468 stop_bits == STOP_BITS_1 ? "1" : (stop_bits == STOP_BITS_2 ? "2" : "1.5"));
469
470 set_data_frame(1, data_bits, parity, stop_bits);
471
472 // Setup the Receiver
473 // check if the receiver is in reset mode
474 if (m_rcr & REG_RCR_RRES)
475 {
476 LOGSETUP("- Rx in reset\n");
477 set_rcv_rate(0);
478 }
479 // Rx is running
480 else
481 {
482 LOGSETUP("- Rx enabled\n");
483 m_brg_rate = get_rx_rate();
484
485 LOGSETUP("- BRG rate %d\n", m_brg_rate);
486 set_rcv_rate(m_brg_rate);
487 }
488
489 // Setup the Transmitter
490 // check if Rx is in reset
491 if (m_tcr & REG_TCR_TRES)
492 {
493 LOGSETUP("- Tx in reset\n");
494 set_tra_rate(0);
495 }
496 // Tx is running
497 else
498 {
499 // Check that Tx is enabled
500 if (m_tcr & REG_TCR_TEN)
501 {
502 LOGSETUP("- Tx enabled\n");
503 m_brg_rate = get_tx_rate();
504
505 LOGSETUP("- BRG rate %d\n", m_brg_rate);
506 set_tra_rate(m_brg_rate);
507 }
508 else
509 {
510 LOGSETUP("- Tx disabled\n");
511 set_tra_rate(0);
512 }
513 }
514 }
515
516 //-------------------------------------------------
517 // tra_callback - is called for each bit that needs to be transmitted
518 //-------------------------------------------------
tra_callback()519 void mpcc_device::tra_callback()
520 {
521 // Check if transmitter is idle as in disabled
522 if (!(m_tcr & REG_TCR_TEN))
523 {
524 // transmit idle TODO: Support TCR TICS bit
525 LOGTX("%s idle bit\n", FUNCNAME);
526 m_out_txd_cb(1);
527 }
528 #if 0
529 // Check if we are transmitting break TODO: Figure out Break support
530 else if (...)
531 {
532 // transmit break
533 m_out_txd_cb(0);
534 }
535 #endif
536 // Check if there is more bits to send
537 else if (!is_transmit_register_empty())
538 {
539 // Get the next bit
540 int db = transmit_register_get_data_bit();
541 LOGTX("%s bit: %d\n", FUNCNAME, db ? 1 : 0);
542
543 // transmit data
544 m_out_txd_cb(db);
545 }
546 // Otherwise we don't know why we are called...
547 else
548 {
549 logerror("%s %s Failed to transmit\n", FUNCNAME, owner()->tag());
550 }
551 }
552
553 //-------------------------------------------------
554 // tra_complete - is called when the transmitter shift register has sent the last bit
555 //-------------------------------------------------
tra_complete()556 void mpcc_device::tra_complete()
557 {
558 // check if transmitter is enabled and we are not sending BREAK level
559 if ((m_tcr & REG_TCR_TEN) && !(m_tcr & REG_TCR_TICS))
560 { // check if there are more data in the fifo
561 if (!m_tx_data_fifo.empty())
562 {
563 transmit_register_setup(m_tx_data_fifo.dequeue()); // Reload the shift register
564 m_tsr |= REG_TSR_TDRA; // Mark fifo as having room for more data
565 }
566 else
567 {
568 m_out_rts_cb(CLEAR_LINE); // TODO: respect the RTSLV bit
569 m_sicr &= ~REG_SICR_RTSLVL;
570 }
571
572 // Check if Tx interrupts are enabled
573 if (m_tier & REG_TIER_TDRA)
574 {
575 trigger_interrupt(INT_TX_TDRA);
576 }
577 } // Check if sending BREAK
578 else if (m_tcr & REG_TCR_TICS)
579 {
580 // TODO: Should transmit content of AR2, needs investigation
581 m_out_txd_cb(0);
582 }
583 else
584 {
585 // transmit mark
586 m_out_txd_cb(1);
587 }
588 }
589
590 //-------------------------------------------------
591 // rcv_callback - called when it is time to sample incoming data bit
592 //-------------------------------------------------
rcv_callback()593 void mpcc_device::rcv_callback()
594 {
595 // Check if the Receiver is enabled
596 if (!(m_rcr & REG_RCR_RRES))
597 {
598 receive_register_update_bit(m_rxd);
599 }
600 }
601
602 //-------------------------------------------------
603 // rcv_complete -
604 //-------------------------------------------------
rcv_complete()605 void mpcc_device::rcv_complete()
606 {
607 uint8_t data;
608
609 receive_register_extract();
610 data = get_received_char();
611 LOGRX("%s %02x [%c]\n", FUNCNAME, isascii(data) ? data : ' ', data);
612
613 uint8_t errors = 0;
614 if (is_receive_parity_error())
615 errors |= REG_RSR_CPERR;
616 if (is_receive_framing_error())
617 errors |= REG_RSR_FRERR;
618
619 // receive_data(data);
620 if (m_rx_data_fifo.full())
621 {
622 // receive overrun error detected, new data is lost
623 m_rsr |= REG_RSR_ROVRN;
624 // interrupt if rx overrun interrupt is enabled
625 if (m_rier & REG_RIER_ROVRN)
626 {
627 trigger_interrupt(INT_RX_ROVRN);
628 }
629 }
630 else
631 {
632 if (m_rx_data_fifo.empty())
633 {
634 m_rsr |= errors;
635 update_interrupts(INT_RX);
636 }
637 m_rx_data_fifo.enqueue(data | errors << 8);
638 m_rsr |= REG_RSR_RDA;
639 // interrupt if rx data availble is enabled
640 if (m_rier & REG_RIER_RDA)
641 {
642 trigger_interrupt(INT_RX_RDA);
643 }
644 }
645 }
646
647 //-------------------------------------------------
648 // write_rx - called by terminal through rs232/diserial
649 // when character is sent to board
650 //-------------------------------------------------
WRITE_LINE_MEMBER(mpcc_device::write_rx)651 WRITE_LINE_MEMBER(mpcc_device::write_rx)
652 {
653 LOGRCV("%s(%d)\n", FUNCNAME, state);
654 m_rxd = state;
655
656 //only use rx_w when self-clocked
657 if(m_rxc != 0 || m_brg_rate != 0)
658 device_serial_interface::rx_w(state);
659 }
660
661
662 /*
663 * Interrupts
664 */
665 //-------------------------------------------------
666 // check_interrupts -
667 //-------------------------------------------------
check_interrupts()668 void mpcc_device::check_interrupts()
669 {
670 int state = 0;
671 LOGINT("%s %s \n",tag(), FUNCNAME);
672
673 // loop over all interrupt sources
674 for (auto & elem : m_int_state)
675 {
676 state |= elem;
677 }
678
679 // update IRQ line
680 // If we are not serving any interrupt we need to check for a new interrupt or
681 // otherwise the IRQ line is asserted already and we need to do nothing
682 if ((state & INT_ACK) == 0)
683 {
684 // If there is a new interrupt not yet acknowledged IRQ needs to be asserted
685 if (state & INT_REQ)
686 {
687 if (m_irq != ASSERT_LINE)
688 {
689 m_out_int_cb(ASSERT_LINE);
690 m_irq = ASSERT_LINE;
691 }
692 }
693 // Otherwise we just clear the IRQ line allowing other devices to interrupt
694 else
695 {
696 if (m_irq != CLEAR_LINE)
697 {
698 m_out_int_cb(CLEAR_LINE);
699 m_irq = CLEAR_LINE;
700 }
701 }
702 }
703 }
704
705 //-------------------------------------------------
706 // reset_interrupts -
707 //-------------------------------------------------
708
reset_interrupts()709 void mpcc_device::reset_interrupts()
710 {
711 LOGINT("%s %s \n",tag(), FUNCNAME);
712 // reset internal interrupt sources
713 for (auto & elem : m_int_state)
714 {
715 elem = 0;
716 }
717
718 // check external interrupt sources
719 check_interrupts();
720 }
721
722 //-----------------------------------------------------------------------
723 // trigger_interrupt - called when a potential interrupt condition occurs
724 //-------------------------------------------------
trigger_interrupt(int source)725 void mpcc_device::trigger_interrupt(int source)
726 {
727 LOGINT("%s %s: %02x\n",FUNCNAME, tag(), source);
728 switch(source)
729 {
730 case INT_TX_TDRA:
731 case INT_TX_TFC:
732 case INT_TX_TUNRN:
733 case INT_TX_TFERR:
734 m_int_state[TX_INT_PRIO] = INT_REQ;
735 break;
736 case INT_RX_RDA:
737 case INT_RX_EOF:
738 case INT_RX_CPERR:
739 case INT_RX_FRERR:
740 case INT_RX_ROVRN:
741 case INT_RX_RAB:
742 m_int_state[RX_INT_PRIO] = INT_REQ;
743 break;
744 case INT_SR_CTS:
745 case INT_SR_DSR:
746 case INT_SR_DCD:
747 m_int_state[SR_INT_PRIO] = INT_REQ;
748 break;
749 }
750 check_interrupts();
751 }
752
753 //-------------------------------------------------------------------------
754 // update_interrupt - called when an interrupt condition has been cleared
755 //-------------------------------------------------------------------------
update_interrupts(int source)756 void mpcc_device::update_interrupts(int source)
757 {
758 LOGINT("%s %s \n",FUNCNAME, tag());
759
760 switch(source)
761 {
762 case INT_TX:
763 case INT_TX_TDRA:
764 case INT_TX_TFC:
765 case INT_TX_TUNRN:
766 case INT_TX_TFERR:
767 if (m_tsr & m_tier & (REG_TSR_TDRA | REG_TSR_TFC | REG_TSR_TUNRN | REG_TSR_TFERR))
768 {
769 LOGINT(" - Found unserved TX interrupt %02x\n", m_tsr & m_tier);
770 m_int_state[TX_INT_PRIO] = INT_REQ; // Still TX interrupts to serve
771 }
772 else
773 {
774 m_int_state[TX_INT_PRIO] = INT_NONE; // No more TX interrupts to serve
775 }
776 break;
777 case INT_RX:
778 case INT_RX_RDA:
779 case INT_RX_EOF:
780 case INT_RX_CPERR:
781 case INT_RX_FRERR:
782 case INT_RX_ROVRN:
783 case INT_RX_RAB:
784 if (m_rsr & m_rier & (REG_RSR_RDA | REG_RSR_EOF | REG_RSR_CPERR | REG_RSR_FRERR | REG_RSR_ROVRN | REG_RSR_RAB))
785 {
786 LOGINT(" - Found unserved RX interrupt %02x\n", m_rsr & m_rier);
787 m_int_state[RX_INT_PRIO] = INT_REQ; // Still RX interrupts to serve
788 }
789 else
790 {
791 m_int_state[RX_INT_PRIO] = INT_NONE; // No more RX interrupts to serve
792 }
793 break;
794 case INT_SR:
795 case INT_SR_CTS:
796 case INT_SR_DSR:
797 case INT_SR_DCD:
798 if (m_sisr & m_sier & (REG_SISR_CTST | REG_SISR_DSRT | REG_SISR_DCDT))
799 {
800 LOGINT(" - Found unserved SR interrupt %02x\n", m_sisr & m_sier);
801 m_int_state[SR_INT_PRIO] = INT_REQ; // Still SR interrupts to serve
802 }
803 else
804 {
805 m_int_state[SR_INT_PRIO] = INT_NONE; // No more SR interrupts to serve
806 }
807 break;
808 }
809 check_interrupts();
810 }
811
812 //-------------------------------------------------
813 // Read register
814 //-------------------------------------------------
read(offs_t offset)815 uint8_t mpcc_device::read(offs_t offset)
816 {
817 uint8_t data = 0;
818
819 switch(offset)
820 {
821 case 0x00: data = do_rsr(); break;
822 case 0x01: data = do_rcr(); break;
823 case 0x02: data = do_rdr(); break;
824 case 0x04: data = do_rivnr(); break;
825 case 0x05: data = do_rier(); break;
826 case 0x08: data = do_tsr(); break;
827 case 0x09: data = do_tcr(); break;
828 //case 0x0a: data = m_tdr; break; // TDR is a write only register
829 case 0x0c: data = do_tivnr(); break;
830 case 0x0d: data = do_tier(); break;
831 case 0x10: data = do_sisr(); break;
832 case 0x11: data = do_sicr(); break;
833 case 0x14: data = m_sivnr; logerror("MPCC: Reg SIVNR not implemented\n"); break;
834 case 0x15: data = do_sier(); break;
835 case 0x18: data = do_psr1(); break;
836 case 0x19: data = do_psr2(); break;
837 case 0x1a: data = m_ar1; logerror("MPCC: Reg AR1 not implemented\n"); break;
838 case 0x1b: data = m_ar2; logerror("MPCC: Reg AR2 not implemented\n"); break;
839 case 0x1c: data = do_brdr1(); break;
840 case 0x1d: data = do_brdr2(); break;
841 case 0x1e: data = do_ccr(); break;
842 case 0x1f: data = do_ecr(); break;
843 default: logerror("%s:%s invalid register accessed: %02x\n", owner()->tag(), tag(), offset);
844 }
845 LOGR(" * %s Reg %02x -> %02x \n", tag(), offset, data);
846 return data;
847 }
848
849 //-------------------------------------------------
850 // Write register
851 //-------------------------------------------------
write(offs_t offset,uint8_t data)852 void mpcc_device::write(offs_t offset, uint8_t data)
853 {
854 LOGSETUP(" * %s Reg %02x <- %02x \n", tag(), offset, data);
855 switch(offset)
856 {
857 case 0x00: do_rsr(data); break;
858 case 0x01: do_rcr(data); break;
859 //case 0x02: m_rdr = data; break; // RDR is a read only register
860 case 0x04: do_rivnr(data); break;
861 case 0x05: do_rier(data); break;
862 case 0x08: do_tsr(data); break;
863 case 0x09: do_tcr(data); break;
864 case 0x0a: m_tdr = data; LOGCHAR("*%c", data); do_tdr(data); break;
865 case 0x0c: do_tivnr(data); break;
866 case 0x0d: do_tier(data); break;
867 case 0x10: do_sisr(data); break;
868 case 0x11: do_sicr(data); break;
869 case 0x14: m_sivnr = data; logerror("MPCC: Reg SIVNR not implemented\n"); break;
870 case 0x15: do_sier(data); break;
871 case 0x18: do_psr1(data); break;
872 case 0x19: do_psr2(data); break;
873 case 0x1a: m_ar1 = data; logerror("MPCC: Reg AR1 not implemented\n"); break;
874 case 0x1b: m_ar2 = data; logerror("MPCC: Reg AR2 not implemented\n"); break;
875 case 0x1c: do_brdr1(data); break;
876 case 0x1d: do_brdr2(data); break;
877 case 0x1e: do_ccr(data); break;
878 case 0x1f: do_ecr(data); break;
879 default: logerror("%s:%s invalid register accessed: %02x\n", owner()->tag(), tag(), offset);
880 }
881 }
882
883 // TODO: implement Idle bit
do_rsr(uint8_t data)884 void mpcc_device::do_rsr(uint8_t data)
885 {
886 LOG("%s -> %02x\n", FUNCNAME, data);
887 // writing 1 resets status bits except for RDA which is read-only
888 m_rsr &= ~data | REG_RSR_RDA;
889 // status belonging to data at the head of the FIFO cannot be cleared
890 if (!m_rx_data_fifo.empty())
891 m_rsr |= m_rx_data_fifo.peek() >> 8;
892 update_interrupts(INT_RX);
893 }
894
do_rsr()895 uint8_t mpcc_device::do_rsr()
896 {
897 uint8_t data = m_rsr;
898 LOG("%s <- %02x\n", FUNCNAME, data);
899 return data;
900 }
901
do_rcr(uint8_t data)902 void mpcc_device::do_rcr(uint8_t data)
903 {
904 LOG("%s -> %02x\n", FUNCNAME, data);
905 m_rcr = data;
906 LOGSETUP(" - Rx DMA : %s\n", (m_rcr & REG_RCR_RDSREN) ? "enabled" : "disabled");
907 LOGSETUP(" - Rx DONE out : %s\n", (m_rcr & REG_RCR_DONEEN) ? "enabled" : "disabled");
908 LOGSETUP(" - Rx RSYN out : %s\n", (m_rcr & REG_RCR_RSYNEN) ? "enabled" : "disabled");
909 LOGSETUP(" - Rx strip SYN: %s\n", (m_rcr & REG_RCR_STRSYN) ? "enabled" : "disabled");
910 LOGSETUP(" - Rx Abort : %s\n", (m_rcr & REG_RCR_RABTEN) ? "enabled" : "disabled");
911 LOGSETUP(" - Rx Mode : %s\n", (m_rcr & REG_RCR_RRES ) ? "reset" : "normal");
912
913 update_serial();
914 }
915
do_rcr()916 uint8_t mpcc_device::do_rcr()
917 {
918 uint8_t data = m_rcr;
919 LOG("%s <- %02x\n", FUNCNAME, data);
920 return data;
921 }
922
do_rdr()923 uint8_t mpcc_device::do_rdr()
924 {
925 uint8_t data = 0;
926
927 if (!m_rx_data_fifo.empty())
928 {
929 // load data from the FIFO
930 data = m_rx_data_fifo.dequeue() & 0xff;
931
932 // Check if this was the last data and reset the interrupt and status register accordingly
933 if (m_rx_data_fifo.empty())
934 {
935 m_rsr &= ~REG_RSR_RDA;
936 update_interrupts(INT_RX_RDA);
937 }
938 else
939 {
940 m_rsr |= m_rx_data_fifo.peek() >> 8;
941 update_interrupts(INT_RX);
942 }
943 }
944 else
945 {
946 LOGRX("data_read: Attempt to read out character from empty FIFO\n");
947 logerror("data_read: Attempt to read out character from empty FIFO\n");
948 }
949
950 LOGRX("%s <- %02x [%c]\n", FUNCNAME, isascii(data) ? data : ' ', data);
951 return data;
952 }
953
do_rivnr(uint8_t data)954 void mpcc_device::do_rivnr(uint8_t data)
955 {
956 LOG("%s -> %02x\n", FUNCNAME, data);
957 m_rivnr = data;
958 LOGSETUP(" - Rx Int vector: %02x\n", m_tivnr);
959 }
960
do_rivnr()961 uint8_t mpcc_device::do_rivnr()
962 {
963 uint8_t data = m_rivnr;
964 LOG("%s <- %02x\n", FUNCNAME, data);
965 return data;
966 }
967
do_rier(uint8_t data)968 void mpcc_device::do_rier(uint8_t data)
969 {
970 LOG("%s -> %02x\n", FUNCNAME, data);
971 m_rier = data;
972 LOGSETUP(" - Rx INT on Rx data available : %s\n", (m_rier & REG_RIER_RDA) ? "enabled" : "disabled");
973 LOGSETUP(" - Rx INT on End of Frame : %s\n", (m_rier & REG_RIER_EOF) ? "enabled" : "disabled");
974 LOGSETUP(" - Rx INT on CRC/Parity error : %s\n", (m_rier & REG_RIER_CPERR) ? "enabled" : "disabled");
975 LOGSETUP(" - Rx INT on Frame error : %s\n", (m_rier & REG_RIER_FRERR) ? "enabled" : "disabled");
976 LOGSETUP(" - Rx INT on Receiver overrun : %s\n", (m_rier & REG_RIER_ROVRN) ? "enabled" : "disabled");
977 LOGSETUP(" - Rx INT on Abort/Break : %s\n", (m_rier & REG_RIER_RAB) ? "enabled" : "disabled");
978 update_interrupts(INT_RX);
979 }
980
do_rier()981 uint8_t mpcc_device::do_rier()
982 {
983 uint8_t data = m_rier;
984 LOG("%s <- %02x\n", FUNCNAME, data);
985 return data;
986 }
987
do_tdr(uint8_t data)988 void mpcc_device::do_tdr(uint8_t data)
989 {
990 LOG("%s -> %d [%c]\n", FUNCNAME, data, isprint(data) ? data : ' ');
991 // Check of Tx fifo has room
992 if (m_tx_data_fifo.full())
993 {
994 logerror("- TX FIFO is full, discarding data\n");
995 LOGTX("- TX FIFO is full, discarding data\n");
996 }
997 else // ..there is still room
998 {
999 m_tx_data_fifo.enqueue(data);
1000 if (m_tx_data_fifo.full())
1001 {
1002 m_tsr &= ~REG_TSR_TDRA; // Mark fifo as full
1003 update_interrupts(INT_TX_TDRA);
1004 }
1005 }
1006
1007 // Check if Tx is enabled
1008 if (m_tcr & REG_TCR_TEN)
1009 {
1010 LOGTX("- TX is enabled\n");
1011 if (is_transmit_register_empty()) // Is the shift register loaded?
1012 {
1013 LOGTX("- Setting up transmitter\n");
1014 transmit_register_setup(m_tx_data_fifo.dequeue()); // Load the shift register, reload is done in tra_complete()
1015 m_tsr |= REG_TSR_TDRA; // Now there is a slot in the FIFO available again
1016 if (m_tier & REG_TIER_TDRA)
1017 {
1018 trigger_interrupt(INT_TX_TDRA);
1019 }
1020 }
1021 else
1022 {
1023 LOGTX("- Transmitter not empty\n");
1024 }
1025 }
1026 }
1027
do_tsr(uint8_t data)1028 void mpcc_device::do_tsr(uint8_t data)
1029 {
1030 LOGINT("%s -> %02x\n", FUNCNAME, data);
1031 // writing 1 resets status bits except for TDRA which is read-only
1032 m_tsr &= ~data | REG_TSR_TDRA;
1033 update_interrupts(INT_TX);
1034 }
1035
do_tsr()1036 uint8_t mpcc_device::do_tsr()
1037 {
1038 uint8_t data = m_tsr;
1039 LOGR("%s <- %02x\n", FUNCNAME, data);
1040 return data;
1041 }
1042
do_tcr(uint8_t data)1043 void mpcc_device::do_tcr(uint8_t data)
1044 {
1045 LOG("%s -> %02x\n", FUNCNAME, data);
1046 m_tcr = data;
1047 LOGSETUP(" - Tx : %s\n", (m_tcr & REG_TCR_TEN) ? "enabled" : "disabled");
1048 LOGSETUP(" - Tx DMA : %s\n", (m_tcr & REG_TCR_TDSREN) ? "enabled" : "disabled");
1049 LOGSETUP(" - Tx Idle character : %s\n", (m_tcr & REG_TCR_TICS) ? "AR2" : "high");
1050 LOGSETUP(" - Tx Half Word next : %s\n", (m_tcr & REG_TCR_THW) ? "yes" : "no");
1051 LOGSETUP(" - Tx Last character : %s\n", (m_tcr & REG_TCR_TLAST) ? "yes" : "no");
1052 LOGSETUP(" - Tx SYN : %s\n", (m_tcr & REG_TCR_TSYN) ? "enabled" : "disabled");
1053 LOGSETUP(" - Tx Abort command : %s\n", (m_tcr & REG_TCR_TABT) ? "active" : "inactive");
1054 LOGSETUP(" - Tx Mode : %s\n", (m_tcr & REG_TCR_TRES) ? "reset" : "normal");
1055
1056 update_serial();
1057 }
1058
do_tcr()1059 uint8_t mpcc_device::do_tcr()
1060 {
1061 uint8_t data = m_tcr;
1062 LOG("%s <- %02x\n", FUNCNAME, data);
1063 return data;
1064 }
1065
do_tivnr(uint8_t data)1066 void mpcc_device::do_tivnr(uint8_t data)
1067 {
1068 LOG("%s -> %02x\n", FUNCNAME, data);
1069 m_tivnr = data;
1070 LOGSETUP(" - Tx Int vector: %02x\n", m_tivnr);
1071 }
1072
do_tivnr()1073 uint8_t mpcc_device::do_tivnr()
1074 {
1075 uint8_t data = m_tivnr;
1076 LOG("%s <- %02x\n", FUNCNAME, data);
1077 return data;
1078 }
1079
do_tier(uint8_t data)1080 void mpcc_device::do_tier(uint8_t data)
1081 {
1082 LOG("%s -> %02x\n", FUNCNAME, data);
1083 m_tier = data;
1084 LOGSETUP(" - Tx INT on FIFO slot available : %s\n", (m_tier & REG_TIER_TDRA) ? "enabled" : "disabled");
1085 LOGSETUP(" - Tx INT on Frame complete : %s\n", (m_tier & REG_TIER_TFC ) ? "enabled" : "disabled");
1086 LOGSETUP(" - Tx INT on Underrun : %s\n", (m_tier & REG_TIER_TUNRN) ? "enabled" : "disabled");
1087 LOGSETUP(" - Tx INT on Frame error : %s\n", (m_tier & REG_TIER_TFERR) ? "enabled" : "disabled");
1088 update_interrupts(INT_TX);
1089 }
1090
do_tier()1091 uint8_t mpcc_device::do_tier()
1092 {
1093 uint8_t data = m_tier;
1094 LOG("%s <- %02x\n", FUNCNAME, data);
1095 return data;
1096 }
1097
do_sisr(uint8_t data)1098 void mpcc_device::do_sisr(uint8_t data)
1099 {
1100 LOG("%s -> %02x\n", FUNCNAME, data);
1101 if (data & REG_SISR_CTST) m_sisr &= ~REG_SISR_CTST;
1102 if (data & REG_SISR_DSRT) m_sisr &= ~REG_SISR_DSRT;
1103 if (data & REG_SISR_DCDT) m_sisr &= ~REG_SISR_DCDT;
1104 update_interrupts(INT_SR);
1105
1106 LOGSETUP(" - CTS %d transitioned: %d\n", (m_sisr & REG_SISR_CTSLVL) ? 1 :0, (m_sisr & REG_SISR_CTST) ? 1 : 0);
1107 LOGSETUP(" - DSR %d transitioned: %d\n", (m_sisr & REG_SISR_DSRLVL) ? 1 :0, (m_sisr & REG_SISR_DSRT) ? 1 : 0);
1108 LOGSETUP(" - DCD %d transitioned: %d\n", (m_sisr & REG_SISR_DCDLVL) ? 1 :0, (m_sisr & REG_SISR_DCDT) ? 1 : 0);
1109 }
1110
do_sisr()1111 uint8_t mpcc_device::do_sisr()
1112 {
1113 uint8_t data = m_sisr;
1114 LOG("%s <- %02x\n", FUNCNAME, data);
1115 return data;
1116 }
1117
do_sicr(uint8_t data)1118 void mpcc_device::do_sicr(uint8_t data)
1119 {
1120 LOG("%s -> %02x\n", FUNCNAME, data);
1121
1122 // If RTS is activated the RTS output latch can only be reset by an empty FIFO.
1123 if ( !(m_sicr & REG_SICR_RTSLVL) &&
1124 (data & REG_SICR_RTSLVL))
1125 {
1126 m_out_rts_cb(ASSERT_LINE); // TODO: respect the RTSLV bit
1127 }
1128
1129 m_sicr = data;
1130
1131 if (m_sicr & REG_SICR_DTRLVL)
1132 {
1133 m_out_dtr_cb(ASSERT_LINE);
1134 }
1135 else
1136 {
1137 m_out_dtr_cb(CLEAR_LINE);
1138 }
1139
1140 LOGSETUP(" - RTS level : %s\n", (m_sicr & REG_SICR_RTSLVL) ? "high" : "low");
1141 LOGSETUP(" - DTR level : %s\n", (m_sicr & REG_SICR_DTRLVL) ? "high" : "low");
1142 LOGSETUP(" - Echo Mode : %s\n", (m_sicr & REG_SICR_ECHO) ? "enabled" : "disabled");
1143 LOGSETUP(" - Test Mode : %s\n", (m_sicr & REG_SICR_TEST) ? "enabled" : "disabled");
1144 }
1145
do_sicr()1146 uint8_t mpcc_device::do_sicr()
1147 {
1148 uint8_t data = m_sicr;
1149 LOG("%s <- %02x\n", FUNCNAME, data);
1150 return data;
1151 }
1152
do_sier(uint8_t data)1153 void mpcc_device::do_sier(uint8_t data)
1154 {
1155 LOG("%s -> %02x\n", FUNCNAME, data);
1156 m_sier = data;
1157 LOGSETUP(" - Serial interface INT on CTS: %s\n", (m_sier & REG_SIER_CTS) ? "enabled" : "disabled");
1158 LOGSETUP(" - Serial interface INT on DSR: %s\n", (m_sier & REG_SIER_DSR) ? "enabled" : "disabled");
1159 LOGSETUP(" - Serial interface INT on DCD: %s\n", (m_sier & REG_SIER_DCD) ? "enabled" : "disabled");
1160 update_interrupts(INT_SR);
1161 }
1162
do_sier()1163 uint8_t mpcc_device::do_sier()
1164 {
1165 uint8_t data = m_sier;
1166 LOG("%s <- %02x\n", FUNCNAME, data);
1167 return data;
1168 }
1169
do_psr1(uint8_t data)1170 void mpcc_device::do_psr1(uint8_t data)
1171 {
1172 LOG("%s -> %02x\n", FUNCNAME, data);
1173 m_psr1 = data;
1174 LOGSETUP(" - Zero Address option: %s\n", (m_psr1 & REG_PSR1_ADRZ) ? "enabled" : "disabled" );
1175 LOGSETUP(" - IPARS option : %s\n", (m_psr1 & REG_PSR1_IPARS) ? "enabled" : "disabled" );
1176 LOGSETUP(" - Control Field Width: %s\n", (m_psr1 & REG_PSR1_CTLEX) ? "16 bit" : "8 bit" );
1177 LOGSETUP(" - Address Extend : %s\n", (m_psr1 & REG_PSR1_ADDEX) ? "enabled" : "disabled" );
1178
1179 update_serial();
1180 }
1181
do_psr1()1182 uint8_t mpcc_device::do_psr1()
1183 {
1184 uint8_t data = m_psr1;
1185 LOG("%s <- %02x\n", FUNCNAME, data);
1186 return data;
1187 }
1188
do_psr2(uint8_t data)1189 void mpcc_device::do_psr2(uint8_t data)
1190 {
1191 LOG("%s -> %02x\n", FUNCNAME, data);
1192 m_psr2 = data;
1193 LOGSETUP(" - %s data bus\n", (m_psr2 & REG_PSR2_WDBYT) ? "16 bit (not implemented)" : "8 bit" );
1194 LOGSETUP(" - %s stop bits\n",(m_psr2 & REG_PSR2_STP_MSK) == REG_PSR2_STP_1 ? "1" :
1195 ( (m_psr2 & REG_PSR2_STP_MSK) == REG_PSR2_STP_1_5 ? "1.5" :
1196 ( (m_psr2 & REG_PSR2_STP_MSK) == REG_PSR2_STP_2 ? "2" : "Unknown")));
1197 LOGSETUP(" - %d bit characters\n", 5 + ((m_psr2 & REG_PSR2_CHLN_MSK) >> 3));
1198 LOGSETUP(" - Protocol %d %s\n", m_psr2 & REG_PSR2_PSEL_MSK, (m_psr2 & REG_PSR2_PSEL_MSK) != REG_PSR2_PSEL_ASCII ? "(not implemented)" : "");
1199
1200 update_serial();
1201 }
1202
do_psr2()1203 uint8_t mpcc_device::do_psr2()
1204 {
1205 uint8_t data = m_psr2;
1206 LOG("%s <- %02x\n", FUNCNAME, data);
1207 return data;
1208 }
1209
1210 /*
1211 * Clocks and Baud Rates
1212 */
do_brdr1(uint8_t data)1213 void mpcc_device::do_brdr1(uint8_t data)
1214 {
1215 LOG("%s -> %02x\n", FUNCNAME, data);
1216 m_brdr1 = data;
1217 LOGSETUP(" - Baudrate Divider 1: %02x\n", m_brdr1);
1218
1219 update_serial();
1220 }
1221
do_brdr1()1222 uint8_t mpcc_device::do_brdr1()
1223 {
1224 uint8_t data = m_brdr1;
1225 LOG("%s <- %02x\n", FUNCNAME, data);
1226 return data;
1227 }
1228
do_brdr2(uint8_t data)1229 void mpcc_device::do_brdr2(uint8_t data)
1230 {
1231 LOG("%s -> %02x\n", FUNCNAME, data);
1232 m_brdr2 = data;
1233 LOGSETUP(" - Baudrate Divider 2: %02x\n", m_brdr2);
1234
1235 update_serial();
1236 }
1237
do_brdr2()1238 uint8_t mpcc_device::do_brdr2()
1239 {
1240 uint8_t data = m_brdr2;
1241 LOG("%s <- %02x\n", FUNCNAME, data);
1242 return data;
1243 }
1244
do_ccr(uint8_t data)1245 void mpcc_device::do_ccr(uint8_t data)
1246 {
1247 LOG("%s -> %02x\n", FUNCNAME, data);
1248 m_ccr = data;
1249 LOGSETUP(" - Prescaler: x%d\n", (m_ccr & REG_CCR_PSCDIV) ? 3 : 2);
1250 LOGSETUP(" - TxC used as: %s\n", (m_ccr & REG_CCR_TCLO) ? "output" : "input");
1251 LOGSETUP(" - RxC taken from: %s source, (ASYNC mode only)\n", (m_ccr & REG_CCR_TCLO) ? "internal" : "external");
1252 LOGSETUP(" - External RxC divisor: x%d\n",(m_ccr & REG_CCR_CLKDIV_MSK) == REG_CCR_CLKDIV_X1 ? 1 :
1253 ( (m_ccr & REG_CCR_CLKDIV_MSK) == REG_CCR_CLKDIV_X16 ? 16 :
1254 ( (m_ccr & REG_CCR_CLKDIV_MSK) == REG_CCR_CLKDIV_X32 ? 32 : 64)));
1255
1256 update_serial();
1257 }
1258
do_ccr()1259 uint8_t mpcc_device::do_ccr()
1260 {
1261 uint8_t data = m_ccr;
1262 LOG("%s <- %02x\n", FUNCNAME, data);
1263 return data;
1264 }
1265
do_ecr(uint8_t data)1266 void mpcc_device::do_ecr(uint8_t data)
1267 {
1268 LOG("%s -> %02x\n", FUNCNAME, data);
1269 m_ecr = data;
1270 LOGSETUP(" - Parity : %s\n", (m_ecr & REG_ECR_PAREN) ? "enabled" : "disabled");
1271 LOGSETUP(" - Parity : %s\n", (m_ecr & REG_ECR_ODDPAR) ? "odd" : "even");
1272 LOGSETUP(" - CRC : %s\n", (m_ecr & REG_ECR_CFCRC) ? "enabled" : "disabled");
1273 LOGSETUP(" - CRC Polynominal: %s\n", (m_ecr & REG_ECR_CRCSEL_MSK) == REG_ECR_CRCSEL_V41 ? "CCITT V.41 (BOP)" :
1274 ( (m_ecr & REG_ECR_CRCSEL_MSK) == REG_ECR_CRCSEL_C16 ? "CRC-16 (BSC)" :
1275 ( (m_ecr & REG_ECR_CRCSEL_MSK) == REG_ECR_CRCSEL_VRC ? "VRC/LRC (BSC, ASCII, non-transp)" :
1276 "Not used")));
1277
1278 update_serial();
1279 }
1280
do_ecr()1281 uint8_t mpcc_device::do_ecr()
1282 {
1283 uint8_t data = m_ecr;
1284 LOG("%s <- %02x\n", FUNCNAME, data);
1285 return data;
1286 }
1287