diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/machine/6850acia.c | 67 | ||||
| -rw-r--r-- | src/emu/machine/6850acia.h | 4 |
2 files changed, 52 insertions, 19 deletions
diff --git a/src/emu/machine/6850acia.c b/src/emu/machine/6850acia.c index 1e9a1042b35..ffe77dddbad 100644 --- a/src/emu/machine/6850acia.c +++ b/src/emu/machine/6850acia.c @@ -15,6 +15,8 @@ MACROS ***************************************************************************/ +#define LOG 0 + #define CR1_0 0x03 #define CR4_2 0x1C #define CR6_5 0x60 @@ -217,12 +219,11 @@ READ8_DEVICE_HANDLER_TRAMPOLINE(acia6850, acia6850_stat_r) WRITE8_DEVICE_HANDLER_TRAMPOLINE(acia6850, acia6850_ctrl_w ) { - int wordsel; - int divide; + if (LOG) logerror("MC6850 '%s' Control: %02x\n", tag(), data); // Counter Divide Select Bits - divide = data & CR1_0; + int divide = data & CR1_0; if (divide == 3) { @@ -237,7 +238,7 @@ WRITE8_DEVICE_HANDLER_TRAMPOLINE(acia6850, acia6850_ctrl_w ) // Word Select Bits - wordsel = (data & CR4_2) >> 2; + int wordsel = (data & CR4_2) >> 2; m_bits = ACIA6850_WORD[wordsel][0]; m_parity = (parity_type)ACIA6850_WORD[wordsel][1]; @@ -338,6 +339,8 @@ void acia6850_device::check_interrupts() WRITE8_DEVICE_HANDLER_TRAMPOLINE(acia6850, acia6850_data_w) { + if (LOG) logerror("MC6850 '%s' Data: %02x\n", tag(), data); + if (!m_reset) { m_tdr = data; @@ -424,8 +427,8 @@ void acia6850_device::tx_tick() { // transmit character - //logerror("ACIA6850 #%u: TX DATA %x\n", which, m_tdr); - //logerror("ACIA6850 #%u: TX START BIT\n", which); + if (LOG) logerror("MC6850 '%s': TX DATA %x\n", tag(), m_tdr); + if (LOG) logerror("MC6850 '%s': TX START BIT\n", tag()); TXD(0); @@ -440,7 +443,7 @@ void acia6850_device::tx_tick() case DATA: { int val = m_tx_shift & 1; - //logerror("ACIA6850 #%u: TX DATA BIT %x\n", which, val); + if (LOG) logerror("MC6850 '%s': TX DATA BIT %x\n", tag(), val); TXD(val); m_tx_parity ^= val; @@ -455,22 +458,26 @@ void acia6850_device::tx_tick() } case PARITY: { + int parity = 0; + if (m_parity == EVEN) { - TXD((m_tx_parity & 1) ? 1 : 0); + parity = (m_tx_parity & 1) ? 1 : 0; } else { - TXD((m_tx_parity & 1) ? 0 : 1); + parity = (m_tx_parity & 1) ? 0 : 1; } - //logerror("ACIA6850 #%u: TX PARITY BIT %x\n", which, *m_tx_pin); + TXD(parity); + + if (LOG) logerror("MC6850 '%s': TX PARITY BIT %x\n", tag(), parity); m_tx_state = STOP; break; } case STOP: { - //logerror("ACIA6850 #%u: TX STOP BIT\n", which); + if (LOG) logerror("MC6850 '%s': TX STOP BIT\n", tag()); TXD(1); if (m_stopbits == 1) @@ -486,7 +493,7 @@ void acia6850_device::tx_tick() } case STOP2: { - //logerror("ACIA6850 #%u: TX STOP BIT\n", which); + if (LOG) logerror("MC6850 '%s': TX STOP BIT\n", tag()); TXD(1); m_tx_state = START; m_status |= ACIA6850_STATUS_TDRE; @@ -571,7 +578,7 @@ void acia6850_device::rx_tick() { if (rxd == 0) { - //logerror("ACIA6850 #%u: RX START BIT\n", which); + if (LOG) logerror("MC6850 '%s': RX START BIT\n", tag()); m_rx_shift = 0; m_rx_parity = 0; m_rx_bits = m_bits; @@ -581,7 +588,7 @@ void acia6850_device::rx_tick() } case DATA: { - //logerror("ACIA6850 #%u: RX DATA BIT %x\n", which, rxd); + if (LOG) logerror("MC6850 '%s': RX DATA BIT %x\n", tag(), rxd); m_rx_shift |= rxd ? 0x80 : 0; m_rx_parity ^= rxd; @@ -603,7 +610,7 @@ void acia6850_device::rx_tick() } case PARITY: { - //logerror("ACIA6850 #%u: RX PARITY BIT %x\n", which, rxd); + if (LOG) logerror("MC6850 '%s': RX PARITY BIT %x\n", tag(), rxd); m_rx_parity ^= rxd; if (m_parity == EVEN) @@ -628,14 +635,14 @@ void acia6850_device::rx_tick() { if (rxd == 1) { - //logerror("ACIA6850 #%u: RX STOP BIT\n", which); + if (LOG) logerror("MC6850 '%s': RX STOP BIT\n", tag()); if (m_stopbits == 1) { m_status &= ~ACIA6850_STATUS_FE; if (!(m_status & ACIA6850_STATUS_RDRF)) { - //logerror("ACIA6850 #%u: RX DATA %x\n", which, m_rx_shift); + if (LOG) logerror("MC6850 '%s': RX DATA %x\n", tag(), m_rx_shift); m_rdr = m_rx_shift; m_status |= ACIA6850_STATUS_RDRF; check_interrupts(); @@ -659,12 +666,12 @@ void acia6850_device::rx_tick() { if (rxd == 1) { - //logerror("ACIA6850 #%u: RX STOP BIT\n", which); + if (LOG) logerror("MC6850 '%s': RX STOP BIT\n", tag()); m_status &= ~ACIA6850_STATUS_FE; if (!(m_status & ACIA6850_STATUS_RDRF)) { - //logerror("ACIA6850 #%u: RX DATA %x\n", which, m_rx_shift); + if (LOG) logerror("MC6850 '%s': RX DATA %x\n", tag(), m_rx_shift); m_rdr = m_rx_shift; m_status |= ACIA6850_STATUS_RDRF; check_interrupts(); @@ -780,3 +787,25 @@ void acia6850_set_tx_clock(running_device *device, int clock) { downcast<acia6850_device*>(device)->set_tx_clock(clock); } + + +/*------------------------------------------------- + receive_data - receive data byte +-------------------------------------------------*/ + +void acia6850_device::receive_data(UINT8 data) +{ + m_rdr = data; + m_status |= ACIA6850_STATUS_RDRF; + check_interrupts(); +} + + +/*------------------------------------------------- + acia6850_receive_data - Receive data byte +-------------------------------------------------*/ + +void acia6850_receive_data(running_device *device, UINT8 data) +{ + downcast<acia6850_device*>(device)->receive_data(data); +} diff --git a/src/emu/machine/6850acia.h b/src/emu/machine/6850acia.h index 27877031092..c3f7a238928 100644 --- a/src/emu/machine/6850acia.h +++ b/src/emu/machine/6850acia.h @@ -116,6 +116,8 @@ public: void set_rx_clock(int clock); void set_tx_clock(int clock); + void receive_data(UINT8 data); + protected: // device-level overrides virtual void device_start(); @@ -223,6 +225,8 @@ void acia6850_rx_clock_in(running_device *device) ATTR_NONNULL(1); void acia6850_set_rx_clock(running_device *device, int clock) ATTR_NONNULL(1); void acia6850_set_tx_clock(running_device *device, int clock) ATTR_NONNULL(1); +void acia6850_receive_data(running_device *device, UINT8 data) ATTR_NONNULL(1); + WRITE8_DEVICE_HANDLER( acia6850_ctrl_w ); READ8_DEVICE_HANDLER( acia6850_stat_r ); WRITE8_DEVICE_HANDLER( acia6850_data_w ); |
