summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2018-08-20 18:44:59 -0400
committer AJR <ajrhacker@users.noreply.github.com>2018-08-20 18:44:59 -0400
commit179e5b84f6ba50b0bd230ac25a68e54f57254d2e (patch)
tree802b8fc6f31c63684c6fa8af6521197b7a7b7bf8 /src/devices
parent9065be185598c817ea544540ab13eb8e2c299c40 (diff)
mos6551: Eliminate MCFG_ macros (nw)
a2232: Add input merger device to handle IRQs (nw) superpet: 6809 type identification (nw)
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/bus/a2bus/a2ssc.cpp25
-rw-r--r--src/devices/bus/amiga/zorro/a2232.cpp351
-rw-r--r--src/devices/bus/amiga/zorro/a2232.h52
-rw-r--r--src/devices/bus/c64/swiftlink.cpp25
-rw-r--r--src/devices/bus/c64/turbo232.cpp25
-rw-r--r--src/devices/bus/coco/coco_dcmodem.cpp25
-rw-r--r--src/devices/bus/coco/coco_rs232.cpp26
-rw-r--r--src/devices/bus/pet/superpet.cpp35
-rw-r--r--src/devices/machine/mos6551.h23
9 files changed, 190 insertions, 397 deletions
diff --git a/src/devices/bus/a2bus/a2ssc.cpp b/src/devices/bus/a2bus/a2ssc.cpp
index da5fa5ce49f..0261835e1d7 100644
--- a/src/devices/bus/a2bus/a2ssc.cpp
+++ b/src/devices/bus/a2bus/a2ssc.cpp
@@ -96,18 +96,19 @@ ioport_constructor a2bus_ssc_device::device_input_ports() const
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(a2bus_ssc_device::device_add_mconfig)
- MCFG_DEVICE_ADD(SSC_ACIA_TAG, MOS6551, 0)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, a2bus_ssc_device, acia_irq_w))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE(SSC_RS232_TAG, rs232_port_device, write_txd))
-
- MCFG_DEVICE_ADD(SSC_RS232_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(SSC_ACIA_TAG, mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(SSC_ACIA_TAG, mos6551_device, write_dcd))
- MCFG_RS232_DSR_HANDLER(WRITELINE(SSC_ACIA_TAG, mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(SSC_ACIA_TAG, mos6551_device, write_cts))
-MACHINE_CONFIG_END
+void a2bus_ssc_device::device_add_mconfig(machine_config &config)
+{
+ MOS6551(config, m_acia, 0);
+ m_acia->set_xtal(1.8432_MHz_XTAL);
+ m_acia->irq_handler().set(FUNC(a2bus_ssc_device::acia_irq_w));
+ m_acia->txd_handler().set(SSC_RS232_TAG, FUNC(rs232_port_device::write_txd));
+
+ rs232_port_device &rs232(RS232_PORT(config, SSC_RS232_TAG, default_rs232_devices, nullptr));
+ rs232.rxd_handler().set(m_acia, FUNC(mos6551_device::write_rxd));
+ rs232.dcd_handler().set(m_acia, FUNC(mos6551_device::write_dcd));
+ rs232.dsr_handler().set(m_acia, FUNC(mos6551_device::write_dsr));
+ rs232.cts_handler().set(m_acia, FUNC(mos6551_device::write_cts));
+}
//-------------------------------------------------
// rom_region - device-specific ROM region
diff --git a/src/devices/bus/amiga/zorro/a2232.cpp b/src/devices/bus/amiga/zorro/a2232.cpp
index bf4e33b74fe..41334067412 100644
--- a/src/devices/bus/amiga/zorro/a2232.cpp
+++ b/src/devices/bus/amiga/zorro/a2232.cpp
@@ -30,113 +30,83 @@ DEFINE_DEVICE_TYPE(A2232, a2232_device, "a2232", "CBM A2232 Serial Card")
// device_add_mconfig - add device configuration
//-------------------------------------------------
-void a2232_device::iocpu_map(address_map &map)
+void a2232_device::device_add_mconfig(machine_config &config)
{
- map(0x0000, 0x3fff).ram().share("shared");
- map(0x4000, 0x47ff).rw(FUNC(a2232_device::acia_0_r), FUNC(a2232_device::acia_0_w));
- map(0x4800, 0x4fff).rw(FUNC(a2232_device::acia_1_r), FUNC(a2232_device::acia_1_w));
- map(0x5000, 0x57ff).rw(FUNC(a2232_device::acia_2_r), FUNC(a2232_device::acia_2_w));
- map(0x5800, 0x5fff).rw(FUNC(a2232_device::acia_3_r), FUNC(a2232_device::acia_3_w));
- map(0x6000, 0x67ff).rw(FUNC(a2232_device::acia_4_r), FUNC(a2232_device::acia_4_w));
- map(0x6800, 0x6fff).rw(FUNC(a2232_device::acia_5_r), FUNC(a2232_device::acia_5_w));
- map(0x7000, 0x73ff).w(FUNC(a2232_device::int2_w));
- map(0x7400, 0x77ff).rw(FUNC(a2232_device::acia_6_r), FUNC(a2232_device::acia_6_w));
- map(0x7800, 0x7fff).rw(FUNC(a2232_device::cia_r), FUNC(a2232_device::cia_w));
- map(0x8000, 0x8000).w(FUNC(a2232_device::irq_ack8_w));
- map(0xc000, 0xffff).ram().share("shared");
-}
-
-MACHINE_CONFIG_START(a2232_device::device_add_mconfig)
// main cpu
- MCFG_DEVICE_ADD("iocpu", M65CE02, XTAL(28'375'160) / 8) // should run at Amiga clock 7M / 2
- MCFG_DEVICE_PROGRAM_MAP(iocpu_map)
+ M65CE02(config, m_iocpu, 28.37516_MHz_XTAL / 8); // should run at Amiga clock 7M / 2
+ m_iocpu->set_addrmap(AS_PROGRAM, &a2232_device::iocpu_map);
+
+ INPUT_MERGER_ANY_HIGH(config, m_ioirq);
+ m_ioirq->output_handler().set_inputline(m_iocpu, m65ce02_device::IRQ_LINE);
// acia
- MCFG_DEVICE_ADD("acia_0", MOS6551, XTAL(28'375'160) / 8)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232_1", rs232_port_device, write_txd))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, a2232_device, acia_0_irq_w))
-
- MCFG_DEVICE_ADD("acia_1", MOS6551, XTAL(28'375'160) / 8)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232_2", rs232_port_device, write_txd))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, a2232_device, acia_1_irq_w))
-
- MCFG_DEVICE_ADD("acia_2", MOS6551, XTAL(28'375'160) / 8)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232_3", rs232_port_device, write_txd))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, a2232_device, acia_2_irq_w))
-
- MCFG_DEVICE_ADD("acia_3", MOS6551, XTAL(28'375'160) / 8)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232_4", rs232_port_device, write_txd))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, a2232_device, acia_3_irq_w))
-
- MCFG_DEVICE_ADD("acia_4", MOS6551, XTAL(28'375'160) / 8)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232_5", rs232_port_device, write_txd))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, a2232_device, acia_4_irq_w))
-
- MCFG_DEVICE_ADD("acia_5", MOS6551, XTAL(28'375'160) / 8)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232_6", rs232_port_device, write_txd))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, a2232_device, acia_5_irq_w))
-
- MCFG_DEVICE_ADD("acia_6", MOS6551, XTAL(28'375'160) / 8)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232_7", rs232_port_device, write_txd))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, a2232_device, acia_6_irq_w))
+ for (auto &acia : m_acia)
+ MOS6551(config, acia, 28.37516_MHz_XTAL / 8).set_xtal(1.8432_MHz_XTAL);
+ m_acia[0]->txd_handler().set("rs232_1", FUNC(rs232_port_device::write_txd));
+ m_acia[0]->irq_handler().set(m_ioirq, FUNC(input_merger_device::in_w<0>));
+ m_acia[1]->txd_handler().set("rs232_2", FUNC(rs232_port_device::write_txd));
+ m_acia[1]->irq_handler().set(m_ioirq, FUNC(input_merger_device::in_w<1>));
+ m_acia[2]->txd_handler().set("rs232_3", FUNC(rs232_port_device::write_txd));
+ m_acia[2]->irq_handler().set(m_ioirq, FUNC(input_merger_device::in_w<2>));
+ m_acia[3]->txd_handler().set("rs232_4", FUNC(rs232_port_device::write_txd));
+ m_acia[3]->irq_handler().set(m_ioirq, FUNC(input_merger_device::in_w<3>));
+ m_acia[4]->txd_handler().set("rs232_5", FUNC(rs232_port_device::write_txd));
+ m_acia[4]->irq_handler().set(m_ioirq, FUNC(input_merger_device::in_w<4>));
+ m_acia[5]->txd_handler().set("rs232_6", FUNC(rs232_port_device::write_txd));
+ m_acia[5]->irq_handler().set(m_ioirq, FUNC(input_merger_device::in_w<5>));
+ m_acia[6]->txd_handler().set("rs232_7", FUNC(rs232_port_device::write_txd));
+ m_acia[6]->irq_handler().set(m_ioirq, FUNC(input_merger_device::in_w<6>));
// cia
- MCFG_DEVICE_ADD("cia", MOS8520, XTAL(1'843'200))
- MCFG_MOS6526_IRQ_CALLBACK(WRITELINE(*this, a2232_device, cia_irq_w))
- MCFG_MOS6526_PA_INPUT_CALLBACK(READ8(*this, a2232_device, cia_port_a_r))
- MCFG_MOS6526_PB_INPUT_CALLBACK(READ8(*this, a2232_device, cia_port_b_r))
- MCFG_MOS6526_PB_OUTPUT_CALLBACK(WRITE8(*this, a2232_device, cia_port_b_w))
+ MOS8520(config, m_cia, 1.8432_MHz_XTAL);
+ m_cia->irq_wr_callback().set(m_ioirq, FUNC(input_merger_device::in_w<7>));
+ m_cia->pa_rd_callback().set(FUNC(a2232_device::cia_port_a_r));
+ m_cia->pb_rd_callback().set(FUNC(a2232_device::cia_port_b_r));
+ m_cia->pb_wr_callback().set(FUNC(a2232_device::cia_port_b_w));
// rs232 ports
- MCFG_DEVICE_ADD("rs232_1", RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(*this, a2232_device, rs232_1_rxd_w))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, a2232_device, rs232_1_dcd_w))
- MCFG_RS232_DSR_HANDLER(WRITELINE("acia_0", mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, a2232_device, rs232_1_cts_w))
-
- MCFG_DEVICE_ADD("rs232_2", RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE("acia_1", mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, a2232_device, rs232_2_dcd_w))
- MCFG_RS232_DSR_HANDLER(WRITELINE("acia_1", mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, a2232_device, rs232_2_cts_w))
-
- MCFG_DEVICE_ADD("rs232_3", RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE("acia_2", mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, a2232_device, rs232_3_dcd_w))
- MCFG_RS232_DSR_HANDLER(WRITELINE("acia_2", mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, a2232_device, rs232_3_cts_w))
-
- MCFG_DEVICE_ADD("rs232_4", RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE("acia_3", mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, a2232_device, rs232_4_dcd_w))
- MCFG_RS232_DSR_HANDLER(WRITELINE("acia_3", mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, a2232_device, rs232_4_cts_w))
-
- MCFG_DEVICE_ADD("rs232_5", RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE("acia_4", mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, a2232_device, rs232_5_dcd_w))
- MCFG_RS232_DSR_HANDLER(WRITELINE("acia_4", mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, a2232_device, rs232_5_cts_w))
-
- MCFG_DEVICE_ADD("rs232_6", RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE("acia_5", mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, a2232_device, rs232_6_dcd_w))
- MCFG_RS232_DSR_HANDLER(WRITELINE("acia_5", mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, a2232_device, rs232_6_cts_w))
-
- MCFG_DEVICE_ADD("rs232_7", RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE("acia_6", mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(*this, a2232_device, rs232_7_dcd_w))
- MCFG_RS232_DSR_HANDLER(WRITELINE("acia_6", mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(*this, a2232_device, rs232_7_cts_w))
-MACHINE_CONFIG_END
+ rs232_port_device &rs232_1(RS232_PORT(config, "rs232_1", default_rs232_devices, nullptr));
+ rs232_1.rxd_handler().set(FUNC(a2232_device::rs232_1_rxd_w));
+ rs232_1.dcd_handler().set(FUNC(a2232_device::rs232_1_dcd_w));
+ rs232_1.dsr_handler().set(m_acia[0], FUNC(mos6551_device::write_dsr));
+ rs232_1.cts_handler().set(FUNC(a2232_device::rs232_1_cts_w));
+
+ rs232_port_device &rs232_2(RS232_PORT(config, "rs232_2", default_rs232_devices, nullptr));
+ rs232_2.rxd_handler().set(m_acia[1], FUNC(mos6551_device::write_rxd));
+ rs232_2.dcd_handler().set(FUNC(a2232_device::rs232_2_dcd_w));
+ rs232_2.dsr_handler().set(m_acia[1], FUNC(mos6551_device::write_dsr));
+ rs232_2.cts_handler().set(FUNC(a2232_device::rs232_2_cts_w));
+
+ rs232_port_device &rs232_3(RS232_PORT(config, "rs232_3", default_rs232_devices, nullptr));
+ rs232_3.rxd_handler().set(m_acia[2], FUNC(mos6551_device::write_rxd));
+ rs232_3.dcd_handler().set(FUNC(a2232_device::rs232_3_dcd_w));
+ rs232_3.dsr_handler().set(m_acia[2], FUNC(mos6551_device::write_dsr));
+ rs232_3.cts_handler().set(FUNC(a2232_device::rs232_3_cts_w));
+
+ rs232_port_device &rs232_4(RS232_PORT(config, "rs232_4", default_rs232_devices, nullptr));
+ rs232_4.rxd_handler().set(m_acia[3], FUNC(mos6551_device::write_rxd));
+ rs232_4.dcd_handler().set(FUNC(a2232_device::rs232_4_dcd_w));
+ rs232_4.dsr_handler().set(m_acia[3], FUNC(mos6551_device::write_dsr));
+ rs232_4.cts_handler().set(FUNC(a2232_device::rs232_4_cts_w));
+
+ rs232_port_device &rs232_5(RS232_PORT(config, "rs232_5", default_rs232_devices, nullptr));
+ rs232_5.rxd_handler().set(m_acia[4], FUNC(mos6551_device::write_rxd));
+ rs232_5.dcd_handler().set(FUNC(a2232_device::rs232_5_dcd_w));
+ rs232_5.dsr_handler().set(m_acia[4], FUNC(mos6551_device::write_dsr));
+ rs232_5.cts_handler().set(FUNC(a2232_device::rs232_5_cts_w));
+
+ rs232_port_device &rs232_6(RS232_PORT(config, "rs232_6", default_rs232_devices, nullptr));
+ rs232_6.rxd_handler().set(m_acia[5], FUNC(mos6551_device::write_rxd));
+ rs232_6.dcd_handler().set(FUNC(a2232_device::rs232_6_dcd_w));
+ rs232_6.dsr_handler().set(m_acia[5], FUNC(mos6551_device::write_dsr));
+ rs232_6.cts_handler().set(FUNC(a2232_device::rs232_6_cts_w));
+
+ rs232_port_device &rs232_7(RS232_PORT(config, "rs232_7", default_rs232_devices, nullptr));
+ rs232_7.rxd_handler().set(m_acia[6], FUNC(mos6551_device::write_rxd));
+ rs232_7.dcd_handler().set(FUNC(a2232_device::rs232_7_dcd_w));
+ rs232_7.dsr_handler().set(m_acia[6], FUNC(mos6551_device::write_dsr));
+ rs232_7.cts_handler().set(FUNC(a2232_device::rs232_7_cts_w));
+}
//**************************************************************************
@@ -151,13 +121,8 @@ a2232_device::a2232_device(const machine_config &mconfig, const char *tag, devic
device_t(mconfig, A2232, tag, owner, clock),
device_zorro2_card_interface(mconfig, *this),
m_iocpu(*this, "iocpu"),
- m_acia_0(*this, "acia_0"),
- m_acia_1(*this, "acia_1"),
- m_acia_2(*this, "acia_2"),
- m_acia_3(*this, "acia_3"),
- m_acia_4(*this, "acia_4"),
- m_acia_5(*this, "acia_5"),
- m_acia_6(*this, "acia_6"),
+ m_ioirq(*this, "ioirq"),
+ m_acia(*this, "acia_%u", 0U),
m_cia(*this, "cia"),
m_shared_ram(*this, "shared"),
m_cia_port_a(0xff),
@@ -172,7 +137,6 @@ a2232_device::a2232_device(const machine_config &mconfig, const char *tag, devic
void a2232_device::device_start()
{
set_zorro_device();
- memset(m_irqs, 0, sizeof(m_irqs));
}
//-------------------------------------------------
@@ -185,13 +149,8 @@ void a2232_device::device_reset_after_children()
m_iocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
// cts connected to gnd
- m_acia_0->write_cts(0);
- m_acia_1->write_cts(0);
- m_acia_2->write_cts(0);
- m_acia_3->write_cts(0);
- m_acia_4->write_cts(0);
- m_acia_5->write_cts(0);
- m_acia_6->write_cts(0);
+ for (auto &acia : m_acia)
+ acia->write_cts(0);
}
@@ -199,22 +158,6 @@ void a2232_device::device_reset_after_children()
// IMPLEMENTATION
//**************************************************************************
-void a2232_device::update_irqs()
-{
- // look for any active irq
- for (auto & elem : m_irqs)
- {
- if (elem)
- {
- m_iocpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
- return;
- }
- }
-
- // if we get here no irqs are pending
- m_iocpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
-}
-
WRITE8_MEMBER( a2232_device::int2_w )
{
if (VERBOSE)
@@ -228,8 +171,7 @@ WRITE8_MEMBER( a2232_device::irq_ack8_w )
if (VERBOSE)
logerror("%s('%s'): irq_ack_w %04x\n", shortname(), basetag(), data);
- m_irqs[IRQ_AMIGA] = CLEAR_LINE;
- update_irqs();
+ m_ioirq->in_w<8>(CLEAR_LINE);
}
@@ -363,16 +305,15 @@ WRITE16_MEMBER( a2232_device::reset_low_w )
READ16_MEMBER( a2232_device::irq_r )
{
- m_irqs[IRQ_AMIGA] = ASSERT_LINE;
- update_irqs();
+ if (!machine().side_effects_disabled())
+ m_ioirq->in_w<8>(ASSERT_LINE);
return 0xffff;
}
WRITE16_MEMBER( a2232_device::irq_w )
{
- m_irqs[IRQ_AMIGA] = ASSERT_LINE;
- update_irqs();
+ m_ioirq->in_w<8>(ASSERT_LINE);
}
READ16_MEMBER( a2232_device::reset_high_r )
@@ -400,116 +341,16 @@ WRITE16_MEMBER( a2232_device::reset_high_w )
// ACIA
//**************************************************************************
-READ8_MEMBER( a2232_device::acia_0_r )
-{
- return m_acia_0->read(space, offset >> 1);
-}
-
-WRITE8_MEMBER( a2232_device::acia_0_w )
-{
- m_acia_0->write(space, offset >> 1, data);
-}
-
-WRITE_LINE_MEMBER( a2232_device::acia_0_irq_w )
+template<int N>
+READ8_MEMBER( a2232_device::acia_r )
{
- m_irqs[IRQ_ACIA_0] = state;
- update_irqs();
+ return m_acia[N]->read(space, offset >> 1);
}
-READ8_MEMBER( a2232_device::acia_1_r )
+template<int N>
+WRITE8_MEMBER( a2232_device::acia_w )
{
- return m_acia_1->read(space, offset >> 1);
-}
-
-WRITE8_MEMBER( a2232_device::acia_1_w )
-{
- m_acia_1->write(space, offset >> 1, data);
-}
-
-WRITE_LINE_MEMBER( a2232_device::acia_1_irq_w )
-{
- m_irqs[IRQ_ACIA_1] = state;
- update_irqs();
-}
-
-READ8_MEMBER( a2232_device::acia_2_r )
-{
- return m_acia_2->read(space, offset >> 1);
-}
-
-WRITE8_MEMBER( a2232_device::acia_2_w )
-{
- m_acia_2->write(space, offset >> 1, data);
-}
-
-WRITE_LINE_MEMBER( a2232_device::acia_2_irq_w )
-{
- m_irqs[IRQ_ACIA_2] = state;
- update_irqs();
-}
-
-READ8_MEMBER( a2232_device::acia_3_r )
-{
- return m_acia_3->read(space, offset >> 1);
-}
-
-WRITE8_MEMBER( a2232_device::acia_3_w )
-{
- m_acia_3->write(space, offset >> 1, data);
-}
-
-WRITE_LINE_MEMBER( a2232_device::acia_3_irq_w )
-{
- m_irqs[IRQ_ACIA_3] = state;
- update_irqs();
-}
-
-READ8_MEMBER( a2232_device::acia_4_r )
-{
- return m_acia_4->read(space, offset >> 1);
-}
-
-WRITE8_MEMBER( a2232_device::acia_4_w )
-{
- m_acia_4->write(space, offset >> 1, data);
-}
-
-WRITE_LINE_MEMBER( a2232_device::acia_4_irq_w )
-{
- m_irqs[IRQ_ACIA_4] = state;
- update_irqs();
-}
-
-READ8_MEMBER( a2232_device::acia_5_r )
-{
- return m_acia_5->read(space, offset >> 1);
-}
-
-WRITE8_MEMBER( a2232_device::acia_5_w )
-{
- m_acia_5->write(space, offset >> 1, data);
-}
-
-WRITE_LINE_MEMBER( a2232_device::acia_5_irq_w )
-{
- m_irqs[IRQ_ACIA_5] = state;
- update_irqs();
-}
-
-READ8_MEMBER( a2232_device::acia_6_r )
-{
- return m_acia_6->read(space, offset >> 1);
-}
-
-WRITE8_MEMBER( a2232_device::acia_6_w )
-{
- m_acia_6->write(space, offset >> 1, data);
-}
-
-WRITE_LINE_MEMBER( a2232_device::acia_6_irq_w )
-{
- m_irqs[IRQ_ACIA_6] = state;
- update_irqs();
+ m_acia[N]->write(space, offset >> 1, data);
}
@@ -527,12 +368,6 @@ WRITE8_MEMBER( a2232_device::cia_w )
m_cia->write(space, offset >> 1, data);
}
-WRITE_LINE_MEMBER( a2232_device::cia_irq_w )
-{
- m_irqs[IRQ_CIA] = state;
- update_irqs();
-}
-
READ8_MEMBER( a2232_device::cia_port_a_r )
{
return m_cia_port_a;
@@ -556,7 +391,7 @@ WRITE8_MEMBER( a2232_device::cia_port_b_w )
WRITE_LINE_MEMBER( a2232_device::rs232_1_rxd_w )
{
- m_acia_0->write_rxd(state);
+ m_acia[0]->write_rxd(state);
m_cia->sp_w(state);
}
@@ -645,3 +480,21 @@ WRITE_LINE_MEMBER( a2232_device::rs232_7_cts_w )
m_cia_port_b &= ~0x40;
m_cia_port_b |= state << 6;
}
+
+
+
+void a2232_device::iocpu_map(address_map &map)
+{
+ map(0x0000, 0x3fff).ram().share("shared");
+ map(0x4000, 0x47ff).rw(FUNC(a2232_device::acia_r<0>), FUNC(a2232_device::acia_w<0>));
+ map(0x4800, 0x4fff).rw(FUNC(a2232_device::acia_r<1>), FUNC(a2232_device::acia_w<1>));
+ map(0x5000, 0x57ff).rw(FUNC(a2232_device::acia_r<2>), FUNC(a2232_device::acia_w<2>));
+ map(0x5800, 0x5fff).rw(FUNC(a2232_device::acia_r<3>), FUNC(a2232_device::acia_w<3>));
+ map(0x6000, 0x67ff).rw(FUNC(a2232_device::acia_r<4>), FUNC(a2232_device::acia_w<4>));
+ map(0x6800, 0x6fff).rw(FUNC(a2232_device::acia_r<5>), FUNC(a2232_device::acia_w<5>));
+ map(0x7000, 0x73ff).w(FUNC(a2232_device::int2_w));
+ map(0x7400, 0x77ff).rw(FUNC(a2232_device::acia_r<6>), FUNC(a2232_device::acia_w<6>));
+ map(0x7800, 0x7fff).rw(FUNC(a2232_device::cia_r), FUNC(a2232_device::cia_w));
+ map(0x8000, 0x8000).w(FUNC(a2232_device::irq_ack8_w));
+ map(0xc000, 0xffff).ram().share("shared");
+}
diff --git a/src/devices/bus/amiga/zorro/a2232.h b/src/devices/bus/amiga/zorro/a2232.h
index efa6199aebf..31a0c368071 100644
--- a/src/devices/bus/amiga/zorro/a2232.h
+++ b/src/devices/bus/amiga/zorro/a2232.h
@@ -18,6 +18,7 @@
#include "zorro.h"
#include "machine/autoconfig.h"
#include "cpu/m6502/m65ce02.h"
+#include "machine/input_merger.h"
#include "machine/mos6551.h"
#include "machine/mos6526.h"
#include "bus/rs232/rs232.h"
@@ -61,51 +62,15 @@ protected:
virtual void autoconfig_base_address(offs_t address) override;
private:
- enum
- {
- IRQ_ACIA_0,
- IRQ_ACIA_1,
- IRQ_ACIA_2,
- IRQ_ACIA_3,
- IRQ_ACIA_4,
- IRQ_ACIA_5,
- IRQ_ACIA_6,
- IRQ_CIA,
- IRQ_AMIGA,
- IRQ_SOURCE_COUNT
- };
-
- void update_irqs();
-
// cpu
WRITE8_MEMBER( int2_w );
WRITE8_MEMBER( irq_ack8_w );
// acia
- DECLARE_WRITE_LINE_MEMBER( acia_0_irq_w );
- DECLARE_WRITE_LINE_MEMBER( acia_1_irq_w );
- DECLARE_WRITE_LINE_MEMBER( acia_2_irq_w );
- DECLARE_WRITE_LINE_MEMBER( acia_3_irq_w );
- DECLARE_WRITE_LINE_MEMBER( acia_4_irq_w );
- DECLARE_WRITE_LINE_MEMBER( acia_5_irq_w );
- DECLARE_WRITE_LINE_MEMBER( acia_6_irq_w );
- DECLARE_READ8_MEMBER( acia_0_r );
- DECLARE_WRITE8_MEMBER( acia_0_w );
- DECLARE_READ8_MEMBER( acia_1_r );
- DECLARE_WRITE8_MEMBER( acia_1_w );
- DECLARE_READ8_MEMBER( acia_2_r );
- DECLARE_WRITE8_MEMBER( acia_2_w );
- DECLARE_READ8_MEMBER( acia_3_r );
- DECLARE_WRITE8_MEMBER( acia_3_w );
- DECLARE_READ8_MEMBER( acia_4_r );
- DECLARE_WRITE8_MEMBER( acia_4_w );
- DECLARE_READ8_MEMBER( acia_5_r );
- DECLARE_WRITE8_MEMBER( acia_5_w );
- DECLARE_READ8_MEMBER( acia_6_r );
- DECLARE_WRITE8_MEMBER( acia_6_w );
+ template<int N> DECLARE_READ8_MEMBER( acia_r );
+ template<int N> DECLARE_WRITE8_MEMBER( acia_w );
// cia
- DECLARE_WRITE_LINE_MEMBER( cia_irq_w );
DECLARE_READ8_MEMBER( cia_port_a_r );
DECLARE_READ8_MEMBER( cia_port_b_r );
DECLARE_WRITE8_MEMBER( cia_port_b_w );
@@ -130,18 +95,11 @@ private:
DECLARE_WRITE_LINE_MEMBER( rs232_7_cts_w );
required_device<m65ce02_device> m_iocpu;
- required_device<mos6551_device> m_acia_0;
- required_device<mos6551_device> m_acia_1;
- required_device<mos6551_device> m_acia_2;
- required_device<mos6551_device> m_acia_3;
- required_device<mos6551_device> m_acia_4;
- required_device<mos6551_device> m_acia_5;
- required_device<mos6551_device> m_acia_6;
+ required_device<input_merger_device> m_ioirq;
+ required_device_array<mos6551_device, 7> m_acia;
required_device<mos8520_device> m_cia;
required_shared_ptr<uint8_t> m_shared_ram;
- int m_irqs[IRQ_SOURCE_COUNT];
-
uint8_t m_cia_port_a;
uint8_t m_cia_port_b;
};
diff --git a/src/devices/bus/c64/swiftlink.cpp b/src/devices/bus/c64/swiftlink.cpp
index b4a3f5658a1..3f807fb13dc 100644
--- a/src/devices/bus/c64/swiftlink.cpp
+++ b/src/devices/bus/c64/swiftlink.cpp
@@ -38,18 +38,19 @@ DEFINE_DEVICE_TYPE(C64_SWIFTLINK, c64_swiftlink_cartridge_device, "c64_swiftlink
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_swiftlink_cartridge_device::device_add_mconfig)
- MCFG_DEVICE_ADD(MOS6551_TAG, MOS6551, 0)
- MCFG_MOS6551_XTAL(XTAL(3'686'400))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, c64_swiftlink_cartridge_device, acia_irq_w))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE(RS232_TAG, rs232_port_device, write_txd))
-
- MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_dcd))
- MCFG_RS232_DSR_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_cts))
-MACHINE_CONFIG_END
+void c64_swiftlink_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ MOS6551(config, m_acia, 0);
+ m_acia->set_xtal(3.6864_MHz_XTAL);
+ m_acia->irq_handler().set(FUNC(c64_swiftlink_cartridge_device::acia_irq_w));
+ m_acia->txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
+
+ rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
+ rs232.rxd_handler().set(m_acia, FUNC(mos6551_device::write_rxd));
+ rs232.dcd_handler().set(m_acia, FUNC(mos6551_device::write_dcd));
+ rs232.dsr_handler().set(m_acia, FUNC(mos6551_device::write_dsr));
+ rs232.cts_handler().set(m_acia, FUNC(mos6551_device::write_cts));
+}
//-------------------------------------------------
diff --git a/src/devices/bus/c64/turbo232.cpp b/src/devices/bus/c64/turbo232.cpp
index fb6d84a24c8..4c6e5f1ebdb 100644
--- a/src/devices/bus/c64/turbo232.cpp
+++ b/src/devices/bus/c64/turbo232.cpp
@@ -37,18 +37,19 @@ DEFINE_DEVICE_TYPE(C64_TURBO232, c64_turbo232_cartridge_device, "c64_turbo232",
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(c64_turbo232_cartridge_device::device_add_mconfig)
- MCFG_DEVICE_ADD(MOS6551_TAG, MOS6551, 0)
- MCFG_MOS6551_XTAL(XTAL(3'686'400))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, c64_turbo232_cartridge_device, acia_irq_w))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE(RS232_TAG, rs232_port_device, write_txd))
-
- MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_dcd))
- MCFG_RS232_DSR_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_cts))
-MACHINE_CONFIG_END
+void c64_turbo232_cartridge_device::device_add_mconfig(machine_config &config)
+{
+ MOS6551(config, m_acia, 0);
+ m_acia->set_xtal(3.6864_MHz_XTAL);
+ m_acia->irq_handler().set(FUNC(c64_turbo232_cartridge_device::acia_irq_w));
+ m_acia->txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
+
+ rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
+ rs232.rxd_handler().set(m_acia, FUNC(mos6551_device::write_rxd));
+ rs232.dcd_handler().set(m_acia, FUNC(mos6551_device::write_dcd));
+ rs232.dsr_handler().set(m_acia, FUNC(mos6551_device::write_dsr));
+ rs232.cts_handler().set(m_acia, FUNC(mos6551_device::write_cts));
+}
//-------------------------------------------------
diff --git a/src/devices/bus/coco/coco_dcmodem.cpp b/src/devices/bus/coco/coco_dcmodem.cpp
index d1555215922..cad760775b7 100644
--- a/src/devices/bus/coco/coco_dcmodem.cpp
+++ b/src/devices/bus/coco/coco_dcmodem.cpp
@@ -81,18 +81,19 @@ namespace
IMPLEMENTATION
***************************************************************************/
-MACHINE_CONFIG_START(coco_dc_modem_device::device_add_mconfig)
- MCFG_DEVICE_ADD(UART_TAG, MOS6551, 0)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, coco_dc_modem_device, uart_irq_w))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE(PORT_TAG, rs232_port_device, write_txd))
-
- MCFG_DEVICE_ADD(PORT_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(UART_TAG, mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(UART_TAG, mos6551_device, write_dcd))
- MCFG_RS232_DSR_HANDLER(WRITELINE(UART_TAG, mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(UART_TAG, mos6551_device, write_cts))
-MACHINE_CONFIG_END
+void coco_dc_modem_device::device_add_mconfig(machine_config &config)
+{
+ MOS6551(config, m_uart, 0);
+ m_uart->set_xtal(1.8432_MHz_XTAL);
+ m_uart->irq_handler().set(FUNC(coco_dc_modem_device::uart_irq_w));
+ m_uart->txd_handler().set(PORT_TAG, FUNC(rs232_port_device::write_txd));
+
+ rs232_port_device &rs232(RS232_PORT(config, PORT_TAG, default_rs232_devices, nullptr));
+ rs232.rxd_handler().set(m_uart, FUNC(mos6551_device::write_rxd));
+ rs232.dcd_handler().set(m_uart, FUNC(mos6551_device::write_dcd));
+ rs232.dsr_handler().set(m_uart, FUNC(mos6551_device::write_dsr));
+ rs232.cts_handler().set(m_uart, FUNC(mos6551_device::write_cts));
+}
ROM_START(coco_dcmodem)
diff --git a/src/devices/bus/coco/coco_rs232.cpp b/src/devices/bus/coco/coco_rs232.cpp
index 774ab1a98ff..802d46251ad 100644
--- a/src/devices/bus/coco/coco_rs232.cpp
+++ b/src/devices/bus/coco/coco_rs232.cpp
@@ -79,19 +79,19 @@ namespace
IMPLEMENTATION
***************************************************************************/
-MACHINE_CONFIG_START(coco_rs232_device::device_add_mconfig)
- MCFG_DEVICE_ADD(UART_TAG, MOS6551, 0)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
-
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, coco_rs232_device, uart_irq_w))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE(PORT_TAG, rs232_port_device, write_txd))
-
- MCFG_DEVICE_ADD(PORT_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(UART_TAG, mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(UART_TAG, mos6551_device, write_dcd))
- MCFG_RS232_DSR_HANDLER(WRITELINE(UART_TAG, mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(UART_TAG, mos6551_device, write_cts))
-MACHINE_CONFIG_END
+void coco_rs232_device::device_add_mconfig(machine_config &config)
+{
+ MOS6551(config, m_uart, 0);
+ m_uart->set_xtal(1.8432_MHz_XTAL);
+ m_uart->irq_handler().set(FUNC(coco_rs232_device::uart_irq_w));
+ m_uart->txd_handler().set(PORT_TAG, FUNC(rs232_port_device::write_txd));
+
+ rs232_port_device &rs232(RS232_PORT(config, PORT_TAG, default_rs232_devices, nullptr));
+ rs232.rxd_handler().set(m_uart, FUNC(mos6551_device::write_rxd));
+ rs232.dcd_handler().set(m_uart, FUNC(mos6551_device::write_dcd));
+ rs232.dsr_handler().set(m_uart, FUNC(mos6551_device::write_dsr));
+ rs232.cts_handler().set(m_uart, FUNC(mos6551_device::write_cts));
+}
ROM_START(coco_rs232_device)
ROM_REGION(0x1000, "eprom", ROMREGION_ERASE00)
diff --git a/src/devices/bus/pet/superpet.cpp b/src/devices/bus/pet/superpet.cpp
index a4e6855a85a..1aa3ed05014 100644
--- a/src/devices/bus/pet/superpet.cpp
+++ b/src/devices/bus/pet/superpet.cpp
@@ -70,23 +70,24 @@ void superpet_device::superpet_mem(address_map &map)
// device_add_mconfig - add device configuration
//-------------------------------------------------
-MACHINE_CONFIG_START(superpet_device::device_add_mconfig)
- MCFG_DEVICE_ADD(M6809_TAG, M6809, XTAL(16'000'000)/16)
- MCFG_DEVICE_PROGRAM_MAP(superpet_mem)
-
- MCFG_MOS6702_ADD(MOS6702_TAG, XTAL(16'000'000)/16)
-
- MCFG_DEVICE_ADD(MOS6551_TAG, MOS6551, 0)
- MCFG_MOS6551_XTAL(XTAL(1'843'200))
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, superpet_device, acia_irq_w))
- MCFG_MOS6551_TXD_HANDLER(WRITELINE(RS232_TAG, rs232_port_device, write_txd))
-
- MCFG_DEVICE_ADD(RS232_TAG, RS232_PORT, default_rs232_devices, nullptr)
- MCFG_RS232_RXD_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_rxd))
- MCFG_RS232_DCD_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_dcd))
- MCFG_RS232_DSR_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_dsr))
- MCFG_RS232_CTS_HANDLER(WRITELINE(MOS6551_TAG, mos6551_device, write_cts))
-MACHINE_CONFIG_END
+void superpet_device::device_add_mconfig(machine_config &config)
+{
+ MC6809E(config, m_maincpu, 16_MHz_XTAL / 16);
+ m_maincpu->set_addrmap(AS_PROGRAM, &superpet_device::superpet_mem);
+
+ MOS6702(config, m_dongle, 16_MHz_XTAL / 16);
+
+ MOS6551(config, m_acia, 0);
+ m_acia->set_xtal(1.8432_MHz_XTAL);
+ m_acia->irq_handler().set(FUNC(superpet_device::acia_irq_w));
+ m_acia->txd_handler().set(RS232_TAG, FUNC(rs232_port_device::write_txd));
+
+ rs232_port_device &rs232(RS232_PORT(config, RS232_TAG, default_rs232_devices, nullptr));
+ rs232.rxd_handler().set(m_acia, FUNC(mos6551_device::write_rxd));
+ rs232.dcd_handler().set(m_acia, FUNC(mos6551_device::write_dcd));
+ rs232.dsr_handler().set(m_acia, FUNC(mos6551_device::write_dsr));
+ rs232.cts_handler().set(m_acia, FUNC(mos6551_device::write_cts));
+}
//-------------------------------------------------
diff --git a/src/devices/machine/mos6551.h b/src/devices/machine/mos6551.h
index 319f00e803d..626c17fd0b2 100644
--- a/src/devices/machine/mos6551.h
+++ b/src/devices/machine/mos6551.h
@@ -30,34 +30,11 @@
#include "machine/clock.h"
-#define MCFG_MOS6551_XTAL(_xtal) \
- downcast<mos6551_device &>(*device).set_xtal(_xtal);
-
-#define MCFG_MOS6551_IRQ_HANDLER(_devcb) \
- downcast<mos6551_device &>(*device).set_irq_handler(DEVCB_##_devcb);
-
-#define MCFG_MOS6551_TXD_HANDLER(_devcb) \
- downcast<mos6551_device &>(*device).set_txd_handler(DEVCB_##_devcb);
-
-#define MCFG_MOS6551_RXC_HANDLER(_devcb) \
- downcast<mos6551_device &>(*device).set_rxc_handler(DEVCB_##_devcb);
-
-#define MCFG_MOS6551_RTS_HANDLER(_devcb) \
- downcast<mos6551_device &>(*device).set_rts_handler(DEVCB_##_devcb);
-
-#define MCFG_MOS6551_DTR_HANDLER(_devcb) \
- downcast<mos6551_device &>(*device).set_dtr_handler(DEVCB_##_devcb);
-
class mos6551_device : public device_t
{
public:
mos6551_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- template <class Object> devcb_base &set_irq_handler(Object &&cb) { return m_irq_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_txd_handler(Object &&cb) { return m_txd_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_rxc_handler(Object &&cb) { return m_rxc_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_rts_handler(Object &&cb) { return m_rts_handler.set_callback(std::forward<Object>(cb)); }
- template <class Object> devcb_base &set_dtr_handler(Object &&cb) { return m_dtr_handler.set_callback(std::forward<Object>(cb)); }
auto irq_handler() { return m_irq_handler.bind(); }
auto txd_handler() { return m_txd_handler.bind(); }
auto rxc_handler() { return m_rxc_handler.bind(); }