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