// license:BSD-3-Clause // copyright-holders:R. Belmont, smf /* * Fujitsu MB89371 Dual Serial UART */ #ifndef MAME_MACHINE_MB89371_H #define MAME_MACHINE_MB89371_H #pragma once #include "i8251.h" #include "machine/clock.h" class mb89371_device : public device_t { public: // construction/destruction mb89371_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); template void map(address_map &map) ATTR_COLD; template auto txd_handler() { return m_txd_w[ch].bind(); } template auto dtr_handler() { return m_sio[ch].lookup()->dtr_handler(); } template auto rts_handler() { return m_sio[ch].lookup()->rts_handler(); } template auto rxrdy_handler() { return m_rxready_w[ch].bind(); } template auto txrdy_handler() { return m_txready_w[ch].bind(); } template auto txempty_handler() { return m_txempty_w[ch].bind(); } template auto syndet_handler() { return m_syndet_w[ch].bind(); } template void write_rxd(int state) { if (!BIT(m_mode[ch], MODE_LOOPBACK)) m_sio[ch]->write_rxd(state); } template void write_cts(int state) { m_sio[ch]->write_cts(state); } template void write_dsr(int state) { m_sio[ch]->write_dsr(state); } template void write_txc(int state) { if (!BIT(m_mode[ch], MODE_USE_BRG)) m_sio[ch]->write_txc(state); } template void write_rxc(int state) { if (!BIT(m_mode[ch], MODE_USE_BRG)) m_sio[ch]->write_rxc(state); } template int txrdy_r() { return m_sio[ch]->txrdy_r(); } template int rxrdy_r() { return m_sio[ch]->rxrdy_r(); } template void write(offs_t offset, uint8_t data); template uint8_t read(offs_t offset); protected: // device-level overrides virtual void device_start() override ATTR_COLD; virtual void device_add_mconfig(machine_config &config) override ATTR_COLD; virtual void device_post_load() override ATTR_COLD; private: enum { MODE_ST1_SEL = 0, MODE_USE_BRG, MODE_MODEM, MODE_LOOPBACK, MODE_IRQMASK_TXEMPTY, MODE_IRQMASK_TXREADY, MODE_IRQMASK_RXREADY, MODE_IRQMASK_SYNDET }; required_device_array m_sio; required_device_array m_brg; devcb_write_line m_txd_w[2], m_rxready_w[2], m_txready_w[2], m_txempty_w[2], m_syndet_w[2]; uint8_t m_mode[2], m_baud[2]; template void brg_tick(int state); void recalc_brg(int channel); template uint8_t baud_r(); template void baud_w(uint8_t data); template uint8_t mode_r(); template void mode_w(uint8_t data); template void tx_data_w(int state); template void rx_ready_w(int state); template void tx_ready_w(int state); template void tx_empty_w(int state); template void syndet_w(int state); }; // device type definition DECLARE_DEVICE_TYPE(MB89371, mb89371_device) #endif // MAME_MACHINE_MB89371_H