summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/ss50/mps.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/ss50/mps.cpp')
-rw-r--r--src/devices/bus/ss50/mps.cpp92
1 files changed, 62 insertions, 30 deletions
diff --git a/src/devices/bus/ss50/mps.cpp b/src/devices/bus/ss50/mps.cpp
index 15d7d160e31..9169336bde6 100644
--- a/src/devices/bus/ss50/mps.cpp
+++ b/src/devices/bus/ss50/mps.cpp
@@ -23,51 +23,63 @@ class ss50_mps_device : public device_t, public ss50_card_interface
public:
// construction/destruction
ss50_mps_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
- : device_t(mconfig, SS50_MPS, tag, owner, clock),
- ss50_card_interface(mconfig, *this),
- m_acia(*this, "acia"),
- m_irq_jumper(*this, "IRQ"),
- m_rate_jumper(*this, "BAUD")
+ : device_t(mconfig, SS50_MPS, tag, owner, clock)
+ , ss50_card_interface(mconfig, *this)
+ , m_acia(*this, "acia")
+ , m_irq_jumper(*this, "IRQ")
+ , m_rate_jumper(*this, "BAUD")
+ , m_cts_route(*this, "CTS_ROUTE")
{
}
+ DECLARE_INPUT_CHANGED_MEMBER(cts_route_change);
+
protected:
// device-specific overrides
- virtual ioport_constructor device_input_ports() const override;
- virtual void device_add_mconfig(machine_config &config) override;
- virtual void device_start() override { }
+ virtual ioport_constructor device_input_ports() const override ATTR_COLD;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+ virtual void device_start() override ATTR_COLD;
// interface-specific overrides
virtual u8 register_read(offs_t offset) override;
virtual void register_write(offs_t offset, u8 data) override;
- virtual DECLARE_WRITE_LINE_MEMBER(f110_w) override;
- virtual DECLARE_WRITE_LINE_MEMBER(f150_9600_w) override;
- virtual DECLARE_WRITE_LINE_MEMBER(f300_w) override;
- virtual DECLARE_WRITE_LINE_MEMBER(f600_4800_w) override;
- virtual DECLARE_WRITE_LINE_MEMBER(f600_1200_w) override;
+ virtual void f110_w(int state) override;
+ virtual void f150_9600_w(int state) override;
+ virtual void f300_w(int state) override;
+ virtual void f600_4800_w(int state) override;
+ virtual void f600_1200_w(int state) override;
private:
- DECLARE_WRITE_LINE_MEMBER(acia_irq_w);
+ void acia_irq_w(int state);
+ void route_cts(int state);
required_device<acia6850_device> m_acia;
required_ioport m_irq_jumper;
required_ioport m_rate_jumper;
+ required_ioport m_cts_route;
+ int m_cts;
};
static INPUT_PORTS_START( mps )
PORT_START("IRQ")
- PORT_DIPNAME(1, 0, "IRQ")
- PORT_DIPSETTING(1, DEF_STR(Off))
- PORT_DIPSETTING(0, DEF_STR(On))
+ PORT_CONFNAME(1, 0, "IRQ")
+ PORT_CONFSETTING(1, DEF_STR(Off))
+ PORT_CONFSETTING(0, DEF_STR(On))
PORT_START("BAUD")
- PORT_DIPNAME(0x1f, 0x1d, "Baud Rate")
- PORT_DIPSETTING(0x1e, "110")
- PORT_DIPSETTING(0x1d, "150 / 9600")
- PORT_DIPSETTING(0x1b, "300")
- PORT_DIPSETTING(0x17, "600")
- PORT_DIPSETTING(0x0f, "1200")
+ PORT_CONFNAME(0x1f, 0x1d, "Baud Rate")
+ PORT_CONFSETTING(0x1e, "110")
+ PORT_CONFSETTING(0x1d, "150 / 9600")
+ PORT_CONFSETTING(0x1b, "300")
+ PORT_CONFSETTING(0x17, "600")
+ PORT_CONFSETTING(0x0f, "1200")
+
+ PORT_START("CTS_ROUTE")
+ PORT_CONFNAME(1, 0, "CTS route") PORT_CHANGED_MEMBER(DEVICE_SELF, FUNC(ss50_mps_device::cts_route_change), 0)
+ PORT_CONFSETTING(0, "Wired low (standard)")
+ PORT_CONFSETTING(1, "Connected through (modified)")
+
INPUT_PORTS_END
@@ -84,7 +96,6 @@ ioport_constructor ss50_mps_device::device_input_ports() const
static DEVICE_INPUT_DEFAULTS_START( terminal )
DEVICE_INPUT_DEFAULTS("RS232_RXBAUD", 0xff, RS232_BAUD_9600)
DEVICE_INPUT_DEFAULTS("RS232_TXBAUD", 0xff, RS232_BAUD_9600)
- DEVICE_INPUT_DEFAULTS("RS232_STARTBITS", 0xff, RS232_STARTBITS_1)
DEVICE_INPUT_DEFAULTS("RS232_DATABITS", 0xff, RS232_DATABITS_8)
DEVICE_INPUT_DEFAULTS("RS232_PARITY", 0xff, RS232_PARITY_NONE)
DEVICE_INPUT_DEFAULTS("RS232_STOPBITS", 0xff, RS232_STOPBITS_1)
@@ -105,9 +116,14 @@ void ss50_mps_device::device_add_mconfig(machine_config &config)
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, "terminal"));
rs232.rxd_handler().set(m_acia, FUNC(acia6850_device::write_rxd));
+ rs232.cts_handler().set(FUNC(ss50_mps_device::route_cts));
rs232.set_option_device_input_defaults("terminal", DEVICE_INPUT_DEFAULTS_NAME(terminal));
}
+void ss50_mps_device::device_start()
+{
+ save_item(NAME(m_cts));
+}
//-------------------------------------------------
// register_read - read from a port register
@@ -127,7 +143,7 @@ void ss50_mps_device::register_write(offs_t offset, u8 data)
m_acia->write(offset & 1, data);
}
-WRITE_LINE_MEMBER(ss50_mps_device::f110_w)
+void ss50_mps_device::f110_w(int state)
{
if (!BIT(m_rate_jumper->read(), 0))
{
@@ -136,7 +152,7 @@ WRITE_LINE_MEMBER(ss50_mps_device::f110_w)
}
}
-WRITE_LINE_MEMBER(ss50_mps_device::f150_9600_w)
+void ss50_mps_device::f150_9600_w(int state)
{
if (!BIT(m_rate_jumper->read(), 1))
{
@@ -145,7 +161,7 @@ WRITE_LINE_MEMBER(ss50_mps_device::f150_9600_w)
}
}
-WRITE_LINE_MEMBER(ss50_mps_device::f300_w)
+void ss50_mps_device::f300_w(int state)
{
if (!BIT(m_rate_jumper->read(), 2))
{
@@ -154,7 +170,7 @@ WRITE_LINE_MEMBER(ss50_mps_device::f300_w)
}
}
-WRITE_LINE_MEMBER(ss50_mps_device::f600_4800_w)
+void ss50_mps_device::f600_4800_w(int state)
{
if (!BIT(m_rate_jumper->read(), 3))
{
@@ -163,7 +179,7 @@ WRITE_LINE_MEMBER(ss50_mps_device::f600_4800_w)
}
}
-WRITE_LINE_MEMBER(ss50_mps_device::f600_1200_w)
+void ss50_mps_device::f600_1200_w(int state)
{
if (!BIT(m_rate_jumper->read(), 4))
{
@@ -172,12 +188,28 @@ WRITE_LINE_MEMBER(ss50_mps_device::f600_1200_w)
}
}
-WRITE_LINE_MEMBER(ss50_mps_device::acia_irq_w)
+void ss50_mps_device::acia_irq_w(int state)
{
if (!m_irq_jumper->read())
write_irq(state);
}
+void ss50_mps_device::route_cts(int state)
+{
+ if (m_cts_route->read())
+ m_acia->write_cts(state);
+
+ // Cache the state, in case the ioport setting changes.
+ m_cts = state;
+}
+
+INPUT_CHANGED_MEMBER(ss50_mps_device::cts_route_change)
+{
+ if (newval)
+ m_acia->write_cts(m_cts);
+ else
+ m_acia->write_cts(0);
+}
// device type definition
DEFINE_DEVICE_TYPE_PRIVATE(SS50_MPS, ss50_card_interface, ss50_mps_device, "ss50_mps", "MP-S Serial Interface")