summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/mc68681.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/mc68681.h')
-rw-r--r--src/devices/machine/mc68681.h65
1 files changed, 38 insertions, 27 deletions
diff --git a/src/devices/machine/mc68681.h b/src/devices/machine/mc68681.h
index 480fad6aba7..7887fc1eefb 100644
--- a/src/devices/machine/mc68681.h
+++ b/src/devices/machine/mc68681.h
@@ -19,8 +19,8 @@ public:
duart_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
// device_serial overrides
virtual void rcv_complete() override; // Rx completed receiving byte
@@ -44,6 +44,11 @@ public:
void write_MR1(uint8_t data){ MR1 = data; }
void write_MR2(uint8_t data){ MR2 = data; }
+ void tx_16x_clock_w(bool state);
+ void rx_16x_clock_w(bool state);
+
+ int get_tx_rate() const { return tx_baud_rate; }
+
private:
/* Registers */
uint8_t CR; /* Command register */
@@ -58,7 +63,7 @@ private:
/* Receiver */
uint8_t rx_enabled;
- uint16_t rx_fifo[MC68681_RX_FIFO_SIZE];
+ uint16_t rx_fifo[MC68681_RX_FIFO_SIZE + 1];
int rx_fifo_read_ptr;
int rx_fifo_write_ptr;
int rx_fifo_num;
@@ -66,9 +71,13 @@ private:
int m_ch;
/* Transmitter */
- uint8_t tx_enabled;
- uint8_t tx_data;
- uint8_t tx_ready;
+ uint8_t m_tx_data;
+ bool m_tx_data_in_buffer;
+ bool m_tx_break;
+ uint8_t m_bits_transmitted;
+
+ /* Rx/Tx clocking */
+ uint8_t m_rx_prescaler , m_tx_prescaler;
duart_base_device *m_uart;
@@ -98,8 +107,8 @@ public:
virtual uint8_t read(offs_t offset);
virtual void write(offs_t offset, uint8_t data);
- DECLARE_WRITE_LINE_MEMBER(rx_a_w) { m_chanA->device_serial_interface::rx_w((uint8_t)state); }
- DECLARE_WRITE_LINE_MEMBER(rx_b_w) { m_chanB->device_serial_interface::rx_w((uint8_t)state); }
+ void rx_a_w(int state) { m_chanA->device_serial_interface::rx_w((uint8_t)state); }
+ void rx_b_w(int state) { m_chanB->device_serial_interface::rx_w((uint8_t)state); }
auto irq_cb() { return write_irq.bind(); }
auto a_tx_cb() { return write_a_tx.bind(); }
@@ -108,13 +117,13 @@ public:
auto outport_cb() { return write_outport.bind(); }
// new-style push handlers for input port bits
- DECLARE_WRITE_LINE_MEMBER(ip0_w);
- DECLARE_WRITE_LINE_MEMBER(ip1_w);
- DECLARE_WRITE_LINE_MEMBER(ip2_w);
- DECLARE_WRITE_LINE_MEMBER(ip3_w);
- DECLARE_WRITE_LINE_MEMBER(ip4_w);
- DECLARE_WRITE_LINE_MEMBER(ip5_w);
- DECLARE_WRITE_LINE_MEMBER(ip6_w);
+ void ip0_w(int state);
+ void ip1_w(int state);
+ void ip2_w(int state);
+ void ip3_w(int state);
+ void ip4_w(int state);
+ void ip5_w(int state);
+ void ip6_w(int state);
bool irq_pending() const { return (ISR & IMR) != 0; }
@@ -122,9 +131,9 @@ protected:
duart_base_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
devcb_write_line write_irq, write_a_tx, write_b_tx, write_c_tx, write_d_tx;
devcb_read8 read_inport;
@@ -156,7 +165,9 @@ private:
uint8_t half_period;
emu_timer *duart_timer;
- double get_ct_rate();
+ bool m_irq_state;
+
+ uint32_t get_ct_rate();
uint16_t get_ct_count();
void start_ct(int count);
virtual int calc_baud(int ch, bool rx, uint8_t data);
@@ -200,8 +211,8 @@ public:
uint8_t get_irq_vector();
protected:
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
virtual void update_interrupts() override;
mc68681_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -219,14 +230,14 @@ public:
auto c_tx_cb() { return write_c_tx.bind(); }
auto d_tx_cb() { return write_d_tx.bind(); }
- DECLARE_WRITE_LINE_MEMBER(rx_c_w) { m_chanC->device_serial_interface::rx_w((uint8_t)state); }
- DECLARE_WRITE_LINE_MEMBER(rx_d_w) { m_chanD->device_serial_interface::rx_w((uint8_t)state); }
+ void rx_c_w(int state) { m_chanC->device_serial_interface::rx_w((uint8_t)state); }
+ void rx_d_w(int state) { m_chanD->device_serial_interface::rx_w((uint8_t)state); }
virtual uint8_t read(offs_t offset) override;
virtual void write(offs_t offset, uint8_t data) override;
protected:
- virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
private:
};
@@ -240,7 +251,7 @@ public:
virtual void write(offs_t offset, uint8_t data) override;
protected:
- virtual void device_add_mconfig(machine_config &config) override;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
mc68340_duart_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
private:
@@ -256,8 +267,8 @@ public:
virtual void write(offs_t offset, uint8_t data) override;
protected:
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
private:
virtual int calc_baud(int ch, bool rx, uint8_t data) override;