From a62c91a0869cdc9e80b3151f5e23f862222c2dfe Mon Sep 17 00:00:00 2001 From: smf- Date: Mon, 7 Apr 2014 09:09:28 +0000 Subject: [PATCH] Support 115200 on Apple III [smf] --- src/emu/machine/mos6551.c | 45 +++++++++++++++++++++++++++------------ src/emu/machine/mos6551.h | 4 ++-- src/mess/drivers/apple3.c | 2 +- 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/emu/machine/mos6551.c b/src/emu/machine/mos6551.c index 9c777bcf6e8..97d118b86ae 100644 --- a/src/emu/machine/mos6551.c +++ b/src/emu/machine/mos6551.c @@ -29,6 +29,7 @@ mos6551_device::mos6551_device(const machine_config &mconfig, const char *tag, d m_rts(0), m_dtr(0), m_xtal(0), + m_divide(0), m_cts(1), m_dsr(1), m_dcd(1), @@ -39,7 +40,7 @@ mos6551_device::mos6551_device(const machine_config &mconfig, const char *tag, d const int mos6551_device::internal_divider[] = { - 0, 2304, 1536, 1048, 856, 768, 384, 192, 96, 64, 48, 32, 24, 16, 12, 6 + 1, 2304, 1536, 1048, 856, 768, 384, 192, 96, 64, 48, 32, 24, 16, 12, 6 }; const int mos6551_device::transmitter_controls[4][3] = @@ -86,6 +87,7 @@ void mos6551_device::device_start() save_item(NAME(m_dtr)); save_item(NAME(m_xtal)); + save_item(NAME(m_divide)); save_item(NAME(m_cts)); save_item(NAME(m_dsr)); save_item(NAME(m_dcd)); @@ -225,6 +227,32 @@ void mos6551_device::update_irq() } } +void mos6551_device::update_divider() +{ + // bits 0-3 + double scale = internal_divider[(m_control >> 0) & 0xf]; + + // The 6551 allows an external clock (hooked up to xtal1 with xtal2 floating) with the internal clock generator, + // it is unknown whether it allows a xtal (hooked up to xtal1 & xtal2) to be used as an external clock. It is + // allowed here for performance reasons. + if (m_xtal != 0) + { + m_tx_internal_clock = true; + + m_divide = 16; + scale = (double) 1 / scale; + } + else + { + m_tx_internal_clock = false; + + m_divide = scale * 16; + scale = 0; + } + + m_internal_clock->set_clock_scale(scale); +} + UINT8 mos6551_device::read_rdr() { m_status &= ~(SR_PARITY_ERROR | SR_FRAMING_ERROR | SR_OVERRUN | SR_RDRF); @@ -277,19 +305,7 @@ void mos6551_device::write_control(UINT8 data) { m_control = data; - // bits 0-3 - double scale = internal_divider[(m_control >> 0) & 0xf]; - if (scale != 0) - { - m_tx_internal_clock = true; - scale = (double) 1 / scale; - } - else - { - m_tx_internal_clock = false; - } - - m_internal_clock->set_clock_scale(scale); + update_divider(); // bit 4 m_rx_internal_clock = (m_control >> 4) & 1; @@ -407,6 +423,7 @@ void mos6551_device::set_xtal(UINT32 xtal) if (started()) { m_internal_clock->set_unscaled_clock(m_xtal); + update_divider(); } } diff --git a/src/emu/machine/mos6551.h b/src/emu/machine/mos6551.h index d440d558896..ba9e23d226b 100644 --- a/src/emu/machine/mos6551.h +++ b/src/emu/machine/mos6551.h @@ -83,8 +83,6 @@ protected: virtual machine_config_constructor device_mconfig_additions() const; private: - static const int m_divide = 16; - enum { SR_PARITY_ERROR = 0x01, @@ -136,6 +134,7 @@ private: void output_dtr(int dtr); void update_irq(); + void update_divider(); UINT8 read_rdr(); UINT8 read_status(); @@ -177,6 +176,7 @@ private: int m_dtr; UINT32 m_xtal; + int m_divide; int m_cts; int m_dsr; int m_dcd; diff --git a/src/mess/drivers/apple3.c b/src/mess/drivers/apple3.c index 72a7457c815..59b2ad0adb9 100644 --- a/src/mess/drivers/apple3.c +++ b/src/mess/drivers/apple3.c @@ -109,7 +109,7 @@ static MACHINE_CONFIG_START( apple3, apple3_state ) /* acia */ MCFG_DEVICE_ADD("acia", MOS6551, 0) - MCFG_MOS6551_XTAL(XTAL_1_8432MHz) + MCFG_MOS6551_XTAL(XTAL_1_8432MHz) // HACK: The schematic shows an external clock generator but using a XTAL is faster to emulate. MCFG_MOS6551_IRQ_HANDLER(WRITELINE(apple3_state, apple3_acia_irq_func)) MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_txd)) MCFG_MOS6551_RTS_HANDLER(DEVWRITELINE("rs232", rs232_port_device, write_rts))