Previous 199869 Revisions Next

r26789 Friday 27th December, 2013 at 23:42:23 UTC by smf
Added preliminary transmit support to MC68901 [smf]
[src/emu/machine]mc68901.c mc68901.h

trunk/src/emu/machine/mc68901.c
r26788r26789
408408   save_item(NAME(m_rsr));
409409   save_item(NAME(m_tsr));
410410   save_item(NAME(m_udr));
411   save_item(NAME(m_rx_bits));
412   save_item(NAME(m_tx_bits));
413   save_item(NAME(m_rx_parity));
414   save_item(NAME(m_tx_parity));
415   save_item(NAME(m_rx_state));
416   save_item(NAME(m_tx_state));
417   save_item(NAME(m_rx_buffer));
418   save_item(NAME(m_tx_buffer));
419   save_item(NAME(m_xmit_state));
411   save_item(NAME(m_udr_written));
420412   save_item(NAME(m_rxtx_word));
421413   save_item(NAME(m_rxtx_start));
422414   save_item(NAME(m_rxtx_stop));
r26788r26789
431423
432424void mc68901_device::device_reset()
433425{
434   m_xmit_state = XMIT_OFF;
435   m_rx_state = SERIAL_STOP;
436   m_rx_buffer = 0;
437   m_tx_buffer = 0;
426   m_tsr = 0;
427   m_udr_written = 0;
438428
439429   // Avoid read-before-write
440430   m_ipr = m_imr = 0;
r26788r26789
463453   register_w(REGISTER_SCR, 0);
464454   register_w(REGISTER_UCR, 0);
465455   register_w(REGISTER_RSR, 0);
456
457   transmit_register_reset();
466458}
467459
468460
r26788r26789
498490
499491void mc68901_device::tra_complete()
500492{
493   if (m_tsr & TSR_XMIT_ENABLE)
494   {
495      if (m_udr_written)
496      {
497         transmit_register_setup(m_udr);
498         m_udr_written = 0;
499         m_tsr |= TSR_BUFFER_EMPTY;
500      }
501   }
502   else
503   {
504      m_tsr |= TSR_END_OF_XMIT;
505   }
501506}
502507
503508
r26788r26789
573578      {
574579         /* clear UE bit (in reality, this won't be cleared until one full clock cycle of the transmitter has passed since the bit was set) */
575580         UINT8 tsr = m_tsr;
576         m_tsr &= 0xbf;
581         m_tsr &= ~TSR_UNDERRUN_ERROR;
577582
578583         return tsr;
579584      }
r26788r26789
9991004      break;
10001005
10011006   case REGISTER_TSR:
1007      m_tsr = (m_tsr & (TSR_BUFFER_EMPTY | TSR_UNDERRUN_ERROR | TSR_END_OF_XMIT)) | (data & ~(TSR_BUFFER_EMPTY | TSR_UNDERRUN_ERROR | TSR_END_OF_XMIT));
1008
10021009      if ((data & TSR_XMIT_ENABLE) == 0)
10031010      {
10041011         if (LOG) logerror("MC68901 '%s' Transmitter Disabled\n", tag());
10051012
1006         m_tsr = data & 0x27;
1013         m_tsr &= ~TSR_UNDERRUN_ERROR;
1014
1015         if (is_transmit_register_empty())
1016            m_tsr |= TSR_END_OF_XMIT;
10071017      }
10081018      else
10091019      {
r26788r26789
10431053            if (LOG) logerror("MC68901 '%s' Transmitter Auto Turnaround Disabled\n", tag());
10441054         }
10451055
1046         m_tsr = data & 0x2f;
1047         m_tsr |= TSR_BUFFER_EMPTY;  // x68000 expects the buffer to be empty, so this will do for now
1056         m_tsr &= ~TSR_END_OF_XMIT;
1057
1058         if(m_udr_written && is_transmit_register_empty())
1059         {
1060            transmit_register_setup(m_udr);
1061            m_udr_written = 0;
1062            m_tsr |= TSR_BUFFER_EMPTY;
1063         }
10481064      }
10491065      break;
10501066
10511067   case REGISTER_UDR:
10521068      if (LOG) logerror("MC68901 '%s' UDR %x\n", tag(), data);
10531069      m_udr = data;
1054      //m_tsr &= ~TSR_BUFFER_EMPTY;
1070      m_udr_written = 1;
1071      m_tsr &= ~TSR_BUFFER_EMPTY;
1072
1073      if ((m_tsr & TSR_XMIT_ENABLE) && is_transmit_register_empty())
1074      {
1075         transmit_register_setup(m_udr);
1076         m_udr_written = 0;
1077         m_tsr |= TSR_BUFFER_EMPTY;
1078      }
10551079      break;
10561080   }
10571081}
trunk/src/emu/machine/mc68901.h
r26788r26789
270270   UINT8 m_tsr;                            /* transmitter status register */
271271   UINT8 m_rsr;                            /* receiver status register */
272272   UINT8 m_udr;                            /* USART data register */
273   int m_udr_written;
273274
274275   /* counter timer state */
275276   UINT8 m_tmc[4];     /* timer main counters */
r26788r26789
286287   int m_rxtx_start;                       /* start bits */
287288   int m_rxtx_stop;                        /* stop bits */
288289
289   /* receive state */
290   UINT8 m_rx_buffer;                      /* receive buffer */
291   int m_rx_bits;                          /* receive bit count */
292   int m_rx_parity;                        /* receive parity bit */
293   int m_rx_state;                         /* receive state */
294
295   /* transmit state */
296   UINT8 m_tx_buffer;                      /* transmit buffer */
297   int m_tx_bits;                          /* transmit bit count */
298   int m_tx_parity;                        /* transmit parity bit */
299   int m_tx_state;                         /* transmit state */
300   int m_xmit_state;                       /* transmitter state */
301
302290   // timers
303291   emu_timer *m_timer[4]; /* counter timers */
304292};

Previous 199869 Revisions Next


© 1997-2024 The MAME Team