diff options
-rw-r--r-- | src/devices/bus/acorn/system/vib.cpp | 149 | ||||
-rw-r--r-- | src/devices/bus/acorn/system/vib.h | 9 |
2 files changed, 116 insertions, 42 deletions
diff --git a/src/devices/bus/acorn/system/vib.cpp b/src/devices/bus/acorn/system/vib.cpp index 48e08bd4088..a204cbb038c 100644 --- a/src/devices/bus/acorn/system/vib.cpp +++ b/src/devices/bus/acorn/system/vib.cpp @@ -21,42 +21,6 @@ DEFINE_DEVICE_TYPE(ACORN_VIB, acorn_vib_device, "acorn_vib", "Acorn Versatile Interface Board") - -//------------------------------------------------- -// device_add_mconfig - add device configuration -//------------------------------------------------- - -void acorn_vib_device::device_add_mconfig(machine_config &config) -{ - INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set(FUNC(acorn_vib_device::irq_w)); - - VIA6522(config, m_via6522, XTAL(1'000'000)); - m_via6522->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); - m_via6522->ca2_handler().set(m_centronics, FUNC(centronics_device::write_strobe)); - m_via6522->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>)); - - CENTRONICS(config, m_centronics, centronics_devices, "printer"); - m_centronics->ack_handler().set(m_via6522, FUNC(via6522_device::write_ca1)); - m_centronics->busy_handler().set(m_via6522, FUNC(via6522_device::write_pa7)); - output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); - m_centronics->set_output_latch(cent_data_out); - - I8255(config, m_ppi8255, 0); - - ACIA6850(config, m_acia, 0); - m_acia->txd_handler().set(m_rs232, FUNC(rs232_port_device::write_txd)); - m_acia->rts_handler().set(m_rs232, FUNC(rs232_port_device::write_rts)); - m_acia->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>)); - - RS232_PORT(config, m_rs232, default_rs232_devices, nullptr); - m_rs232->rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); - m_rs232->cts_handler().set(m_acia, FUNC(acia6850_device::write_cts)); - m_rs232->dcd_handler().set(m_acia, FUNC(acia6850_device::write_dcd)); - - CLOCK(config, m_acia_clock, 1.8432_MHz_XTAL); - m_acia_clock->signal_handler().set(FUNC(acorn_vib_device::write_acia_clock)); -} - //************************************************************************** // LIVE DEVICE //************************************************************************** @@ -71,20 +35,72 @@ acorn_vib_device::acorn_vib_device(const machine_config &mconfig, const char *ta , m_ppi8255(*this, "ppi8255") , m_via6522(*this, "via6522") , m_acia(*this, "acia6850") - , m_acia_clock(*this, "acia_clock") + , m_mc14411(*this, "mc14411") , m_centronics(*this, "centronics") , m_rs232(*this, "rs232") , m_irqs(*this, "irqs") + , m_txc(*this, "TXC") + , m_rxc(*this, "RXC") { } +static INPUT_PORTS_START(acorn_vib) + PORT_START("TXC") + PORT_CONFNAME(0x0f, mc14411_device::TIMER_F1, "Transmit Rate") + PORT_CONFSETTING(mc14411_device::TIMER_F1, "9600") + PORT_CONFSETTING(mc14411_device::TIMER_F2, "7200") + PORT_CONFSETTING(mc14411_device::TIMER_F3, "4800") + PORT_CONFSETTING(mc14411_device::TIMER_F4, "3600") + PORT_CONFSETTING(mc14411_device::TIMER_F5, "2400") + PORT_CONFSETTING(mc14411_device::TIMER_F6, "1800") + PORT_CONFSETTING(mc14411_device::TIMER_F7, "1200") + PORT_CONFSETTING(mc14411_device::TIMER_F8, "600") + PORT_CONFSETTING(mc14411_device::TIMER_F9, "300") + PORT_CONFSETTING(mc14411_device::TIMER_F10, "200") + PORT_CONFSETTING(mc14411_device::TIMER_F11, "150") + PORT_CONFSETTING(mc14411_device::TIMER_F12, "134.5") + PORT_CONFSETTING(mc14411_device::TIMER_F13, "110") + PORT_CONFSETTING(mc14411_device::TIMER_F14, "75") + + PORT_START("RXC") + PORT_CONFNAME(0x0f, mc14411_device::TIMER_F1, "Receive Rate") + PORT_CONFSETTING(mc14411_device::TIMER_F1, "9600") + PORT_CONFSETTING(mc14411_device::TIMER_F2, "7200") + PORT_CONFSETTING(mc14411_device::TIMER_F3, "4800") + PORT_CONFSETTING(mc14411_device::TIMER_F4, "3600") + PORT_CONFSETTING(mc14411_device::TIMER_F5, "2400") + PORT_CONFSETTING(mc14411_device::TIMER_F6, "1800") + PORT_CONFSETTING(mc14411_device::TIMER_F7, "1200") + PORT_CONFSETTING(mc14411_device::TIMER_F8, "600") + PORT_CONFSETTING(mc14411_device::TIMER_F9, "300") + PORT_CONFSETTING(mc14411_device::TIMER_F10, "200") + PORT_CONFSETTING(mc14411_device::TIMER_F11, "150") + PORT_CONFSETTING(mc14411_device::TIMER_F12, "134.5") + PORT_CONFSETTING(mc14411_device::TIMER_F13, "110") + PORT_CONFSETTING(mc14411_device::TIMER_F14, "75") +INPUT_PORTS_END + +//------------------------------------------------- +// input_ports - return a pointer to the implicit +// input ports description for this device +//------------------------------------------------- + +ioport_constructor acorn_vib_device::device_input_ports() const +{ + return INPUT_PORTS_NAME(acorn_vib); +} + + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- void acorn_vib_device::device_start() { + m_acia->write_dcd(0); + m_mc14411->rsa_w(1); + m_mc14411->rsb_w(1); } //------------------------------------------------- @@ -99,6 +115,10 @@ void acorn_vib_device::device_reset() space.install_device(0x0c10, 0x0c1f, *m_via6522, &via6522_device::map); space.install_readwrite_handler(0x0c20, 0x0c21, 0, 0x1e, 0, read8sm_delegate(FUNC(acia6850_device::read), m_acia.target()), write8sm_delegate(FUNC(acia6850_device::write), m_acia.target())); space.install_readwrite_handler(0x0c40, 0x0c43, 0, 0x1c, 0, read8sm_delegate(FUNC(i8255_device::read), m_ppi8255.target()), write8sm_delegate(FUNC(i8255_device::write), m_ppi8255.target())); + + m_mc14411->timer_disable_all(); + m_mc14411->timer_enable(mc14411_device::timer_id(m_txc->read()), true); + m_mc14411->timer_enable(mc14411_device::timer_id(m_rxc->read()), true); } @@ -106,13 +126,64 @@ void acorn_vib_device::device_reset() // IMPLEMENTATION //************************************************************************** +template<mc14411_device::timer_id T> WRITE_LINE_MEMBER(acorn_vib_device::write_acia_clock) { - m_acia->write_txc(state); - m_acia->write_rxc(state); + if (T == m_txc->read()) + m_acia->write_txc(state); + if (T == m_rxc->read()) + m_acia->write_rxc(state); } WRITE_LINE_MEMBER(acorn_vib_device::irq_w) { m_bus->irq_w(state); } + + +//------------------------------------------------- +// device_add_mconfig - add device configuration +//------------------------------------------------- + +void acorn_vib_device::device_add_mconfig(machine_config &config) +{ + INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set(FUNC(acorn_vib_device::irq_w)); + + VIA6522(config, m_via6522, 1'000'000); // TODO: derive clock from bus (pin 29 = ϕ2) + m_via6522->writepa_handler().set("cent_data_out", FUNC(output_latch_device::bus_w)); + m_via6522->ca2_handler().set(m_centronics, FUNC(centronics_device::write_strobe)); + m_via6522->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>)); + + CENTRONICS(config, m_centronics, centronics_devices, "printer"); + m_centronics->ack_handler().set(m_via6522, FUNC(via6522_device::write_ca1)); + m_centronics->busy_handler().set(m_via6522, FUNC(via6522_device::write_pa7)); + output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); + m_centronics->set_output_latch(cent_data_out); + + I8255(config, m_ppi8255); + + ACIA6850(config, m_acia); + m_acia->txd_handler().set(m_rs232, FUNC(rs232_port_device::write_txd)); + m_acia->rts_handler().set(m_rs232, FUNC(rs232_port_device::write_rts)); + m_acia->irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>)); + + RS232_PORT(config, m_rs232, default_rs232_devices, nullptr); + m_rs232->rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); + m_rs232->cts_handler().set(m_acia, FUNC(acia6850_device::write_cts)); + + MC14411(config, m_mc14411, 1.8432_MHz_XTAL); + m_mc14411->out_f<1>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F1>)); + m_mc14411->out_f<2>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F2>)); + m_mc14411->out_f<3>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F3>)); + m_mc14411->out_f<4>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F4>)); + m_mc14411->out_f<5>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F5>)); + m_mc14411->out_f<6>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F6>)); + m_mc14411->out_f<7>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F7>)); + m_mc14411->out_f<8>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F8>)); + m_mc14411->out_f<9>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F9>)); + m_mc14411->out_f<10>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F10>)); + m_mc14411->out_f<11>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F11>)); + m_mc14411->out_f<12>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F12>)); + m_mc14411->out_f<13>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F13>)); + m_mc14411->out_f<14>().set(FUNC(acorn_vib_device::write_acia_clock<mc14411_device::TIMER_F14>)); +} diff --git a/src/devices/bus/acorn/system/vib.h b/src/devices/bus/acorn/system/vib.h index d4d710a3256..bd4d886e281 100644 --- a/src/devices/bus/acorn/system/vib.h +++ b/src/devices/bus/acorn/system/vib.h @@ -20,7 +20,7 @@ #include "machine/i8255.h" #include "machine/6522via.h" #include "machine/6850acia.h" -#include "machine/clock.h" +#include "machine/mc14411.h" #include "machine/input_merger.h" //************************************************************************** @@ -41,19 +41,22 @@ protected: virtual void device_reset() override; // optional information overrides + virtual ioport_constructor device_input_ports() const override; virtual void device_add_mconfig(machine_config &config) override; private: - DECLARE_WRITE_LINE_MEMBER(write_acia_clock); + template<mc14411_device::timer_id T> DECLARE_WRITE_LINE_MEMBER(write_acia_clock); DECLARE_WRITE_LINE_MEMBER(irq_w); required_device<i8255_device> m_ppi8255; required_device<via6522_device> m_via6522; required_device<acia6850_device> m_acia; - required_device<clock_device> m_acia_clock; + required_device<mc14411_device> m_mc14411; required_device<centronics_device> m_centronics; required_device<rs232_port_device> m_rs232; required_device<input_merger_device> m_irqs; + required_ioport m_txc; + required_ioport m_rxc; }; |