// license:BSD-3-Clause
// copyright-holders:Mariusz Wojcieszek, R. Belmont
#ifndef MAME_MACHINE_MC68681_H
#define MAME_MACHINE_MC68681_H

#pragma once

#include "diserial.h"

#define MC68681_RX_FIFO_SIZE                3

// forward declaration
class duart_base_device;

// duart_channel class
class duart_channel : public device_t, public device_serial_interface
{
public:
	duart_channel(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);


	/* State */
	int tx_baud_rate, rx_baud_rate;

	/* Receiver */
	uint8_t rx_enabled;
	uint16_t rx_fifo[MC68681_RX_FIFO_SIZE + 1];
	int   rx_fifo_read_ptr;
	int   rx_fifo_write_ptr;
	int   rx_fifo_num;

	int m_ch;

	/* Transmitter */
	uint8_t m_tx_data;
	bool m_tx_data_in_buffer;
	bool m_tx_break;
	uint8_t m_bits_transmitted;
	bool m_tx_enabled;

	/* Rx/Tx clocking */

	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(); }
	auto b_tx_cb() { return write_b_tx.bind(); }
	auto inport_cb() { return read_inport.bind(); } // deprecated: use ipX_w() instead
	auto outport_cb() { return write_outport.bind(); }

	// new-style push handlers for input port bits
