Previous 199869 Revisions Next

r29408 Monday 7th April, 2014 at 09:09:28 UTC by smf
Support 115200 on Apple III [smf]
[src/emu/machine]mos6551.c mos6551.h
[src/mess/drivers]apple3.c

trunk/src/emu/machine/mos6551.c
r29407r29408
2929   m_rts(0),
3030   m_dtr(0),
3131   m_xtal(0),
32   m_divide(0),
3233   m_cts(1),
3334   m_dsr(1),
3435   m_dcd(1),
r29407r29408
3940
4041const int mos6551_device::internal_divider[] =
4142{
42   0, 2304, 1536, 1048, 856, 768, 384, 192, 96, 64, 48, 32, 24, 16, 12, 6
43   1, 2304, 1536, 1048, 856, 768, 384, 192, 96, 64, 48, 32, 24, 16, 12, 6
4344};
4445
4546const int mos6551_device::transmitter_controls[4][3] =
r29407r29408
8687   save_item(NAME(m_dtr));
8788
8889   save_item(NAME(m_xtal));
90   save_item(NAME(m_divide));
8991   save_item(NAME(m_cts));
9092   save_item(NAME(m_dsr));
9193   save_item(NAME(m_dcd));
r29407r29408
225227   }
226228}
227229
230void mos6551_device::update_divider()
231{
232   // bits 0-3
233   double scale = internal_divider[(m_control >> 0) & 0xf];
234
235   // The 6551 allows an external clock (hooked up to xtal1 with xtal2 floating) with the internal clock generator,
236   // it is unknown whether it allows a xtal (hooked up to xtal1 & xtal2) to be used as an external clock. It is
237   // allowed here for performance reasons.
238   if (m_xtal != 0)
239   {
240      m_tx_internal_clock = true;
241
242      m_divide = 16;
243      scale = (double) 1 / scale;
244   }
245   else
246   {
247      m_tx_internal_clock = false;
248
249      m_divide = scale * 16;
250      scale = 0;
251   }
252
253   m_internal_clock->set_clock_scale(scale);
254}
255
228256UINT8 mos6551_device::read_rdr()
229257{
230258   m_status &= ~(SR_PARITY_ERROR | SR_FRAMING_ERROR | SR_OVERRUN | SR_RDRF);
r29407r29408
277305{
278306   m_control = data;
279307
280   // bits 0-3
281   double scale = internal_divider[(m_control >> 0) & 0xf];
282   if (scale != 0)
283   {
284      m_tx_internal_clock = true;
285      scale = (double) 1 / scale;
286   }
287   else
288   {
289      m_tx_internal_clock = false;
290   }
308   update_divider();
291309
292   m_internal_clock->set_clock_scale(scale);
293
294310   // bit 4
295311   m_rx_internal_clock = (m_control >> 4) & 1;
296312
r29407r29408
407423   if (started())
408424   {
409425      m_internal_clock->set_unscaled_clock(m_xtal);
426      update_divider();
410427   }
411428}
412429
trunk/src/emu/machine/mos6551.h
r29407r29408
8383   virtual machine_config_constructor device_mconfig_additions() const;
8484
8585private:
86   static const int m_divide = 16;
87
8886   enum
8987   {
9088      SR_PARITY_ERROR = 0x01,
r29407r29408
136134   void output_dtr(int dtr);
137135
138136   void update_irq();
137   void update_divider();
139138
140139   UINT8 read_rdr();
141140   UINT8 read_status();
r29407r29408
177176   int m_dtr;
178177
179178   UINT32 m_xtal;
179   int m_divide;
180180   int m_cts;
181181   int m_dsr;
182182   int m_dcd;
trunk/src/mess/drivers/apple3.c
r29407r29408
109109
110110   /* acia */
111111   MCFG_DEVICE_ADD("acia", MOS6551, 0)
112   MCFG_MOS6551_XTAL(XTAL_1_8432MHz)
112   MCFG_MOS6551_XTAL(XTAL_1_8432MHz) // HACK: The schematic shows an external clock generator but using a XTAL is faster to emulate.
113113   MCFG_MOS6551_IRQ_HANDLER(WRITELINE(apple3_state, apple3_acia_irq_func))
114114   MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd))
115115   MCFG_MOS6551_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts))

Previous 199869 Revisions Next


© 1997-2024 The MAME Team