Previous 199869 Revisions Next

r20997 Tuesday 12th February, 2013 at 20:23:46 UTC by Curt Coder
mos6551: Added serial callbacks. [Curt Coder]
[src/emu/machine]mos6551.c mos6551.h

trunk/src/emu/machine/mos6551.c
r20996r20997
5555mos6551_device::mos6551_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
5656   : device_t(mconfig, MOS6551, "MOS6551", tag, owner, clock),
5757      device_serial_interface(mconfig, *this),
58      m_irq_handler(*this),
58      m_write_irq(*this),
59      m_read_rxd(*this),
60      m_write_txd(*this),
61      m_write_rts(*this),
62      m_write_dtr(*this),
5963      m_ctrl(0),
6064      m_cmd(CMD_RIE),
6165      m_st(ST_TDRE),
62      m_ext_rxc(0)
66      m_ext_rxc(0),
67      m_cts(1),
68      m_dsr(1),
69      m_dcd(1)
6370{
6471}
6572
r20996r20997
7077
7178void mos6551_device::device_start()
7279{
73   m_irq_handler.resolve_safe();
80   // resolve callbacks
81   m_write_irq.resolve_safe();
82   m_read_rxd.resolve_safe(1);
83   m_write_txd.resolve_safe();
84   m_write_rts.resolve_safe();
85   m_write_dtr.resolve_safe();
7486
75   transmit_register_reset();
76   receive_register_reset();
87   // state saving
88   save_item(NAME(m_ctrl));
89   save_item(NAME(m_cmd));
90   save_item(NAME(m_st));
91   save_item(NAME(m_tdr));
92   save_item(NAME(m_ext_rxc));
93   save_item(NAME(m_cts));
94   save_item(NAME(m_dsr));
95   save_item(NAME(m_dcd));
7796}
7897
7998
r20996r20997
86105   m_ctrl = 0;
87106   m_cmd = CMD_RIE;
88107
108   transmit_register_reset();
109   receive_register_reset();
110
89111   update_serial();
90112}
91113
92114
93115//-------------------------------------------------
116//  tra_callback -
117//-------------------------------------------------
118
119void mos6551_device::tra_callback()
120{
121   m_write_txd(transmit_register_get_data_bit());
122}
123
124
125//-------------------------------------------------
94126//  tra_complete -
95127//-------------------------------------------------
96128
r20996r20997
104136      if ((m_cmd & CMD_TC_MASK) == CMD_TC_TIE_RTS_LO)
105137      {
106138         m_st |= ST_IRQ;
107         m_irq_handler(ASSERT_LINE);
139         m_write_irq(ASSERT_LINE);
108140      }
109141   }
110142}
111143
112144
113145//-------------------------------------------------
146//  rcv_callback -
147//-------------------------------------------------
148
149void mos6551_device::rcv_callback()
150{
151   if (m_read_rxd.isnull())
152      receive_register_update_bit(get_in_data_bit());
153   else
154      receive_register_update_bit(m_read_rxd());
155}
156
157
158//-------------------------------------------------
114159//  rcv_complete -
115160//-------------------------------------------------
116161
r20996r20997
128173   if (!(m_cmd & CMD_RIE))
129174   {
130175      m_st |= ST_IRQ;
131      m_irq_handler(ASSERT_LINE);
176      m_write_irq(ASSERT_LINE);
132177   }
133178}
134179
r20996r20997
191236   else
192237      m_connection_state &= ~SERIAL_STATE_DTR;
193238
239   m_write_dtr((m_connection_state & SERIAL_STATE_DTR) ? 0 : 1);
240
194241   if ((m_cmd & CMD_TC_MASK) == CMD_TC_RTS_HI)
195242      m_connection_state &= ~SERIAL_STATE_RTS;
196243   else
197244      m_connection_state |= SERIAL_STATE_RTS;
245   
246   m_write_rts((m_connection_state & SERIAL_STATE_RTS) ? 0 : 1);
198247
199248   serial_connection_out();
200249}
r20996r20997
221270      break;
222271
223272   case 1:
224      data = m_st;
273      data = (m_dsr << 6) | (m_dcd << 5) | m_st;
225274      m_st &= ~ST_IRQ;
226      m_irq_handler(CLEAR_LINE);
275      m_write_irq(CLEAR_LINE);
227276      break;
228277
229278   case 2:
r20996r20997
259308         if ((m_cmd & CMD_TC_MASK) == CMD_TC_TIE_RTS_LO)
260309         {
261310            m_st |= ST_IRQ;
262            m_irq_handler(ASSERT_LINE);
311            m_write_irq(ASSERT_LINE);
263312         }
264313      }
265314      break;
r20996r20997
294343
295344   update_serial();
296345}
346
347
348//-------------------------------------------------
349//  rxc_w - receive clock write
350//-------------------------------------------------
351
352WRITE_LINE_MEMBER( mos6551_device::rxc_w )
353{
354   // TODO
355}
356
357
358//-------------------------------------------------
359//  cts_w - clear to send write
360//-------------------------------------------------
361
362WRITE_LINE_MEMBER( mos6551_device::cts_w )
363{
364   m_cts = state;   
365}
366
367
368//-------------------------------------------------
369//  dsr_w - data set ready write
370//-------------------------------------------------
371
372WRITE_LINE_MEMBER( mos6551_device::dsr_w )
373{
374   if (m_dsr != state)
375   {
376      m_st |= ST_IRQ;
377      m_write_irq(ASSERT_LINE);
378   }
379
380   m_dsr = state;
381}
382
383
384//-------------------------------------------------
385//  dcd_w - data carrier detect write
386//-------------------------------------------------
387
388WRITE_LINE_MEMBER( mos6551_device::dcd_w )
389{
390   if (m_dcd != state)
391   {
392      m_st |= ST_IRQ;
393      m_write_irq(ASSERT_LINE);
394   }
395
396   m_dcd = state;
397}
trunk/src/emu/machine/mos6551.h
r20996r20997
3939
4040#define MCFG_MOS6551_ADD(_tag, _clock, _irq) \
4141   MCFG_DEVICE_ADD(_tag, MOS6551, _clock) \
42   devcb = &mos6551_device::set_irq_handler(*device, DEVCB2_##_irq);
42   downcast<mos6551_device *>(device)->set_irq_callback(DEVCB2_##_rxd, DEVCB2_##_irq);
4343
44#define MCFG_MOS6551_RXD_TXD_CALLBACKS(_rxd, _txd) \
45   downcast<mos6551_device *>(device)->set_rxd_txd_callbacks(DEVCB2_##_rxd, DEVCB2_##_txd);
4446
47#define MCFG_MOS6551_RTS_CALLBACK(_rts) \
48   downcast<mos6551_device *>(device)->set_rts_callback(DEVCB2_##_rts);
4549
50#define MCFG_MOS6551_DTR_CALLBACK(_dtr) \
51   downcast<mos6551_device *>(device)->set_dtr_callback(DEVCB2_##_dtr);
52
53
54
4655//**************************************************************************
4756//  TYPE DEFINITIONS
4857//**************************************************************************
r20996r20997
5665   // construction/destruction
5766   mos6551_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
5867
59   // static configuration helpers
60   template<class _Object> static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast<mos6551_device &>(device).m_irq_handler.set_callback(object); }
68   template<class _irq> void set_irq_callback(_irq irq) { m_write_irq.set_callback(irq); }
69   template<class _rxd, class _txd> void set_rxd_txd_callbacks(_rxd rxd, _txd txd) {
70      m_read_rxd.set_callback(rxd);
71      m_write_txd.set_callback(txd);
72   }
73   template<class _rts> void set_rts_callback(_rts rts) { m_write_rts.set_callback(rts); }
74   template<class _dtr> void set_dtr_callback(_dtr dtr) { m_write_dtr.set_callback(dtr); }
6175
6276   DECLARE_READ8_MEMBER( read );
6377   DECLARE_WRITE8_MEMBER( write );
6478
79   DECLARE_WRITE_LINE_MEMBER( rxc_w );
80   DECLARE_WRITE_LINE_MEMBER( cts_w );
81   DECLARE_WRITE_LINE_MEMBER( dsr_w );
82   DECLARE_WRITE_LINE_MEMBER( dcd_w );
83
6584   void set_rxc(int clock);
6685
6786protected:
r20996r20997
7089   virtual void device_reset();
7190
7291   // device_serial_interface overrides
92   virtual void tra_callback();
7393   virtual void tra_complete();
94   virtual void rcv_callback();
7495   virtual void rcv_complete();
7596   virtual void input_callback(UINT8 state);
7697
r20996r20997
145166
146167   void update_serial();
147168
148   devcb2_write_line m_irq_handler;
169   devcb2_write_line m_write_irq;
170   devcb2_read_line m_read_rxd;
171   devcb2_write_line m_write_txd;
172   devcb2_write_line m_write_rts;
173   devcb2_write_line m_write_dtr;
149174
150175   UINT8 m_ctrl;
151176   UINT8 m_cmd;
r20996r20997
153178   UINT8 m_tdr;
154179
155180   int m_ext_rxc;
181   int m_cts;
182   int m_dsr;
183   int m_dcd;
156184
157185   static const int brg_divider[16];
158186};

Previous 199869 Revisions Next


© 1997-2024 The MAME Team