Previous 199869 Revisions Next

r22551 Thursday 25th April, 2013 at 18:56:30 UTC by Wilbert Pol
6850acia.c: Improved DCD signal handling.  [Wilbert Pol]
[src/emu/machine]6850acia.c 6850acia.h

trunk/src/emu/machine/6850acia.c
r22550r22551
125125   save_item(NAME(m_rts));
126126   save_item(NAME(m_brk));
127127   save_item(NAME(m_status_read));
128   save_item(NAME(m_dcd_triggered));
128129}
129130
130131
r22550r22551
161162
162163   m_bits = 0;
163164   m_tx_int = 0;
165   m_dcd_triggered = false;
164166
165167   m_out_irq_func(CLEAR_LINE);
166168
r22550r22551
219221
220222
221223//-------------------------------------------------
224//  Handle DCD input changes
225//-------------------------------------------------
226
227void acia6850_device::check_dcd_input()
228{
229   int dcd = m_in_dcd_func();
230
231   if (dcd)
232   {
233      // IRQ from DCD is edge triggered
234      if ( ! ( m_status & ACIA6850_STATUS_DCD ) )
235      {
236         m_status |= ACIA6850_STATUS_DCD;
237         m_dcd_triggered = true;
238
239         // Asserting DCD clears RDRF
240         m_status &= ~ACIA6850_STATUS_RDRF;
241
242         check_interrupts();
243      }
244   }
245   else if ((m_status & (ACIA6850_STATUS_DCD | ACIA6850_STATUS_IRQ)) == ACIA6850_STATUS_DCD)
246   {
247      m_status &= ~ACIA6850_STATUS_DCD;
248   }
249}
250
251
252//-------------------------------------------------
222253//  control_write - Write Control Register
223254//-------------------------------------------------
224255
r22550r22551
318349void acia6850_device::check_interrupts()
319350{
320351   int irq = (m_tx_int && (m_status & ACIA6850_STATUS_TDRE) && (~m_status & ACIA6850_STATUS_CTS)) ||
321      ((m_ctrl & 0x80) && ((m_status & (ACIA6850_STATUS_RDRF|ACIA6850_STATUS_DCD)) || m_overrun));
352      ((m_ctrl & 0x80) && (((m_status & ACIA6850_STATUS_RDRF) || m_dcd_triggered) || m_overrun));
322353
323354   if (irq != m_irq)
324355   {
r22550r22551
335366         m_out_irq_func(CLEAR_LINE);
336367      }
337368   }
369   m_dcd_triggered = false;
338370}
339371
340372
r22550r22551
369401
370402   if (m_status_read)
371403   {
372      int dcd = m_in_dcd_func();
373
374404      m_status_read = 0;
375      m_status &= ~(ACIA6850_STATUS_OVRN | ACIA6850_STATUS_DCD);
376405
377      if (dcd)
378      {
379         m_status |= ACIA6850_STATUS_DCD;
380      }
406      m_status &= ~ACIA6850_STATUS_OVRN;
407
408      check_dcd_input();
381409   }
382410
383411   if (m_overrun == 1)
r22550r22551
542570
543571void acia6850_device::rx_tick()
544572{
545   int dcd = m_in_dcd_func();
573   check_dcd_input();
546574
547   if (dcd)
548   {
549      m_status |= ACIA6850_STATUS_DCD;
550      check_interrupts();
551   }
552   else if ((m_status & (ACIA6850_STATUS_DCD | ACIA6850_STATUS_IRQ)) == ACIA6850_STATUS_DCD)
553   {
554      m_status &= ~ACIA6850_STATUS_DCD;
555   }
556
557575   if (m_status & ACIA6850_STATUS_DCD)
558576   {
559577      m_rx_state = START;
r22550r22551
687705
688706void acia6850_device::rx_clock_in()
689707{
690   int dcd = m_in_dcd_func();
708   check_dcd_input();
691709
692   if (dcd)
693   {
694      m_status |= ACIA6850_STATUS_DCD;
695      check_interrupts();
696   }
697   else if ((m_status & (ACIA6850_STATUS_DCD|ACIA6850_STATUS_IRQ)) == ACIA6850_STATUS_DCD)
698   {
699      m_status &= ~ACIA6850_STATUS_DCD;
700   }
701
702710   m_rx_counter ++;
703711
704712   if ( m_rx_counter > m_divide - 1)
trunk/src/emu/machine/6850acia.h
r22550r22551
107107   };
108108
109109   void check_interrupts();
110   void check_dcd_input();
110111
111112   void tx_tick();
112113   void transmit_event();
r22550r22551
172173   serial_state m_rx_state;
173174   serial_state m_tx_state;
174175   int         m_irq;
176   bool      m_dcd_triggered;
175177
176178   emu_timer   *m_rx_timer;
177179   emu_timer   *m_tx_timer;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team