diff options
Diffstat (limited to 'src/devices/machine/mos6551.cpp')
-rw-r--r-- | src/devices/machine/mos6551.cpp | 67 |
1 files changed, 39 insertions, 28 deletions
diff --git a/src/devices/machine/mos6551.cpp b/src/devices/machine/mos6551.cpp index f9edbd39cee..c6cb6ea5c71 100644 --- a/src/devices/machine/mos6551.cpp +++ b/src/devices/machine/mos6551.cpp @@ -69,16 +69,17 @@ void mos6551_device::device_add_mconfig(machine_config &config) m_internal_clock->signal_handler().set(FUNC(mos6551_device::internal_clock)); } +void mos6551_device::map(address_map &map) +{ + map(0, 0).rw(FUNC(mos6551_device::read_rdr), FUNC(mos6551_device::write_tdr)); + map(1, 1).rw(FUNC(mos6551_device::read_status), FUNC(mos6551_device::write_reset)); + map(2, 2).rw(FUNC(mos6551_device::read_command), FUNC(mos6551_device::write_command)); + map(3, 3).rw(FUNC(mos6551_device::read_control), FUNC(mos6551_device::write_control)); +} + void mos6551_device::device_start() { - // resolve callbacks - m_irq_handler.resolve_safe(); - m_txd_handler.resolve_safe(); - m_rxc_handler.resolve_safe(); - m_rts_handler.resolve_safe(); - m_dtr_handler.resolve_safe(); - // state saving save_item(NAME(m_control)); save_item(NAME(m_command)); @@ -129,7 +130,6 @@ void mos6551_device::device_start() m_internal_clock->set_unscaled_clock(m_xtal); - output_irq(1); output_txd(1); output_rxc(1); output_rts(1); @@ -155,6 +155,9 @@ void mos6551_device::device_reset() write_command(0); write_control(0); + + m_irq_state = 0; + update_irq(); } void mos6551_device::output_irq(int irq) @@ -280,18 +283,15 @@ uint8_t mos6551_device::read_status() { uint8_t status = m_status; - if (!machine().side_effects_disabled()) + if (m_cts) { - if (m_cts) - { - status &= ~SR_TDRE; - } + status &= ~SR_TDRE; + } - if (m_irq_state != 0) - { - m_irq_state = 0; - update_irq(); - } + if (!machine().side_effects_disabled() && m_irq_state != 0) + { + m_irq_state = 0; + update_irq(); } return status; @@ -317,6 +317,7 @@ void mos6551_device::write_reset(uint8_t data) { m_status &= ~SR_OVERRUN; m_irq_state &= ~(IRQ_DCD | IRQ_DSR); + update_irq(); write_command(m_command & ~0x1f); } @@ -351,12 +352,22 @@ void mos6551_device::write_command(uint8_t data) // bit 1 m_rx_irq_enable = !((m_command >> 1) & 1) && !m_dtr; + if (!m_rx_irq_enable && (m_irq_state & IRQ_RDRF)) + { + m_irq_state &= ~IRQ_RDRF; + update_irq(); + } // bits 2-3 int transmitter_control = (m_command >> 2) & 3; m_tx_irq_enable = transmitter_controls[transmitter_control][0] && !m_dtr; m_tx_enable = transmitter_controls[transmitter_control][1]; m_brk = transmitter_controls[transmitter_control][2]; + if (!m_tx_irq_enable && (m_irq_state & IRQ_TDRE)) + { + m_irq_state &= ~IRQ_TDRE; + update_irq(); + } // bit 4 m_echo_mode = (m_command >> 4) & 1; @@ -449,7 +460,7 @@ void mos6551_device::set_xtal(uint32_t xtal) } } -WRITE_LINE_MEMBER( mos6551_device::internal_clock ) +void mos6551_device::internal_clock(int state) { if (m_tx_internal_clock) { @@ -457,7 +468,7 @@ WRITE_LINE_MEMBER( mos6551_device::internal_clock ) } } -WRITE_LINE_MEMBER(mos6551_device::write_xtal1) +void mos6551_device::write_xtal1(int state) { if (!m_tx_internal_clock) { @@ -465,12 +476,12 @@ WRITE_LINE_MEMBER(mos6551_device::write_xtal1) } } -WRITE_LINE_MEMBER( mos6551_device::write_rxd ) +void mos6551_device::write_rxd(int state) { m_rxd = state; } -WRITE_LINE_MEMBER( mos6551_device::write_rxc ) +void mos6551_device::write_rxc(int state) { if (!m_rx_internal_clock) { @@ -478,13 +489,13 @@ WRITE_LINE_MEMBER( mos6551_device::write_rxc ) } } -WRITE_LINE_MEMBER( mos6551_device::write_cts ) +void mos6551_device::write_cts(int state) { if (m_cts != state) { m_cts = state; - if (m_cts) + if (m_cts && started()) { if (m_tx_output == OUTPUT_TXD) { @@ -495,7 +506,7 @@ WRITE_LINE_MEMBER( mos6551_device::write_cts ) } } -WRITE_LINE_MEMBER( mos6551_device::write_dsr ) +void mos6551_device::write_dsr(int state) { if (m_dsr != state) { @@ -503,7 +514,7 @@ WRITE_LINE_MEMBER( mos6551_device::write_dsr ) } } -WRITE_LINE_MEMBER( mos6551_device::write_dcd ) +void mos6551_device::write_dcd(int state) { if (m_dcd != state) { @@ -511,7 +522,7 @@ WRITE_LINE_MEMBER( mos6551_device::write_dcd ) } } -WRITE_LINE_MEMBER(mos6551_device::receiver_clock) +void mos6551_device::receiver_clock(int state) { if (m_rx_clock != state) { @@ -663,7 +674,7 @@ WRITE_LINE_MEMBER(mos6551_device::receiver_clock) } } -WRITE_LINE_MEMBER(mos6551_device::transmitter_clock) +void mos6551_device::transmitter_clock(int state) { if (m_rx_internal_clock) { |