summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author mooglyguy <therealmogminer@gmail.com>2018-12-27 21:44:45 +0100
committer mooglyguy <therealmogminer@gmail.com>2018-12-27 21:44:57 +0100
commitbbc1fcfed3fbf55c75dcd411d60b20536c655a12 (patch)
treec21e7dec6d1a691f8f329145e892e4eea7c08ee6
parent88ec765af5e47332d68893fbaa870cd0d9bc4da3 (diff)
Fix regressions from recent comit, nw
-rw-r--r--src/devices/machine/msm6253.cpp33
-rw-r--r--src/devices/machine/msm6253.h19
-rw-r--r--src/mame/drivers/segas24.cpp8
-rw-r--r--src/mame/drivers/segas32.cpp20
-rw-r--r--src/mame/drivers/segaybd.cpp8
-rw-r--r--src/mame/includes/segas32.h4
-rw-r--r--src/mame/machine/model1io.cpp8
-rw-r--r--src/mame/machine/model1io2.cpp8
8 files changed, 76 insertions, 32 deletions
diff --git a/src/devices/machine/msm6253.cpp b/src/devices/machine/msm6253.cpp
index b96eeecf9e5..96722247d08 100644
--- a/src/devices/machine/msm6253.cpp
+++ b/src/devices/machine/msm6253.cpp
@@ -25,9 +25,13 @@ DEFINE_DEVICE_TYPE(MSM6253, msm6253_device, "msm6253", "OKI MSM6253 A/D Converte
msm6253_device::msm6253_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: device_t(mconfig, MSM6253, tag, owner, clock)
- , m_analog_input_cb{{*this}, {*this}, {*this}, {*this}}
+ , m_analog_ports(*this, {finder_base::DUMMY_TAG, finder_base::DUMMY_TAG, finder_base::DUMMY_TAG, finder_base::DUMMY_TAG})
, m_shift_register(0)
{
+ m_analog_input_cb[0] = port_read_delegate(FUNC(msm6253_device::port_read<0>), this);
+ m_analog_input_cb[1] = port_read_delegate(FUNC(msm6253_device::port_read<1>), this);
+ m_analog_input_cb[2] = port_read_delegate(FUNC(msm6253_device::port_read<2>), this);
+ m_analog_input_cb[3] = port_read_delegate(FUNC(msm6253_device::port_read<3>), this);
}
//-------------------------------------------------
@@ -37,13 +41,38 @@ msm6253_device::msm6253_device(const machine_config &mconfig, const char *tag, d
void msm6253_device::device_start()
{
for (int port = 0; port < 4; port++)
- m_analog_input_cb[port].resolve_safe(0);
+ {
+ // resolve each callback
+ m_analog_input_cb[port].bind_relative_to(*owner());
+
+ // ensure that any configured ports truly are analog
+ if (m_analog_ports[port].found())
+ {
+ for (ioport_field &field : m_analog_ports[port]->fields())
+ if (!field.is_analog() && field.type() != IPT_UNKNOWN && field.type() != IPT_UNUSED)
+ throw emu_fatalerror("Port %s is not an analog port\n", m_analog_ports[port]->tag());
+ }
+ }
// save our state
save_item(NAME(m_shift_register));
}
//-------------------------------------------------
+// port_read - helper to read configured ports
+//-------------------------------------------------
+
+template<int port>
+ioport_value msm6253_device::port_read()
+{
+ if (m_analog_ports[port].found())
+ return m_analog_ports[port]->read();
+
+ logerror("%s: Read from unassigned IN%d\n", machine().describe_context(), port);
+ return 0xff;
+}
+
+//-------------------------------------------------
// address_w - write from address bus to select
// one of four internal latches
//-------------------------------------------------
diff --git a/src/devices/machine/msm6253.h b/src/devices/machine/msm6253.h
index af57f6e7640..bfb5920ef16 100644
--- a/src/devices/machine/msm6253.h
+++ b/src/devices/machine/msm6253.h
@@ -32,11 +32,22 @@
class msm6253_device : public device_t
{
public:
+ typedef device_delegate<ioport_value ()> port_read_delegate;
+
// construction/destruction
msm6253_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
// configuration
- template <unsigned Port> auto input() { return m_analog_input_cb[Port].bind(); }
+ template <unsigned P> void set_input_tag(const char *tag) { m_analog_ports[P].set_tag(tag); }
+ template <unsigned P> void set_input_cb(port_read_delegate callback) { m_analog_input_cb[P] = callback; }
+ template <unsigned P, class FunctionClass> void set_input_cb(const char *devname, ioport_value (FunctionClass::*callback)(), const char *name)
+ {
+ set_input_cb<P>(port_read_delegate(callback, name, devname, static_cast<FunctionClass *>(nullptr)));
+ }
+ template <unsigned P, class FunctionClass> void set_input_cb(ioport_value (FunctionClass::*callback)(), const char *name)
+ {
+ set_input_cb<P>(port_read_delegate(callback, name, nullptr, static_cast<FunctionClass *>(nullptr)));
+ }
// write handlers
WRITE8_MEMBER(address_w);
@@ -52,8 +63,12 @@ protected:
virtual void device_start() override;
private:
+ // helpers
+ template<int port> ioport_value port_read();
+
// input configuration
- devcb_read8 m_analog_input_cb[4];
+ optional_ioport_array<4> m_analog_ports;
+ port_read_delegate m_analog_input_cb[4];
// private data
u8 m_shift_register;
diff --git a/src/mame/drivers/segas24.cpp b/src/mame/drivers/segas24.cpp
index 77c2952bf85..c64af46d3e2 100644
--- a/src/mame/drivers/segas24.cpp
+++ b/src/mame/drivers/segas24.cpp
@@ -2016,10 +2016,10 @@ void segas24_state::system24_floppy_hotrod(machine_config &config)
upd2.set_porty_tag("DIAL4");
msm6253_device &adc1(MSM6253(config, "adc1", 0)); // IC5 - 33k/33p R/C clock
- adc1.input<0>().set_ioport("PEDAL1");
- adc1.input<1>().set_ioport("PEDAL2");
- adc1.input<2>().set_ioport("PEDAL3");
- adc1.input<3>().set_ioport("PEDAL4");
+ adc1.set_input_tag<0>("PEDAL1");
+ adc1.set_input_tag<1>("PEDAL2");
+ adc1.set_input_tag<2>("PEDAL3");
+ adc1.set_input_tag<3>("PEDAL4");
MSM6253(config, "adc2", 0); // IC2 - 33k/33p R/C clock
}
diff --git a/src/mame/drivers/segas32.cpp b/src/mame/drivers/segas32.cpp
index 2e7e05711e6..e004f80e263 100644
--- a/src/mame/drivers/segas32.cpp
+++ b/src/mame/drivers/segas32.cpp
@@ -2393,10 +2393,10 @@ void segas32_analog_state::device_add_mconfig(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &segas32_analog_state::system32_analog_map);
msm6253_device &adc(MSM6253(config, "adc", 0));
- adc.input<0>().set_ioport("ANALOG1");
- adc.input<1>().set_ioport("ANALOG2");
- adc.input<2>().set_ioport("ANALOG3");
- adc.input<3>().set_ioport("ANALOG4");
+ adc.set_input_tag<0>("ANALOG1");
+ adc.set_input_tag<1>("ANALOG2");
+ adc.set_input_tag<2>("ANALOG3");
+ adc.set_input_tag<3>("ANALOG4");
}
DEFINE_DEVICE_TYPE(SEGA_S32_ANALOG_DEVICE, segas32_analog_state, "segas32_pcb_analog", "Sega System 32 analog PCB")
@@ -2726,18 +2726,18 @@ void sega_multi32_analog_state::device_add_mconfig(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &sega_multi32_analog_state::multi32_analog_map);
msm6253_device &adc(MSM6253(config, "adc", 0));
- adc.input<0>().set_ioport("ANALOG1");
- adc.input<1>().set_ioport("ANALOG2");
- adc.input<2>().set(FUNC(sega_multi32_analog_state::in2_analog_read));
- adc.input<3>().set(FUNC(sega_multi32_analog_state::in3_analog_read));
+ adc.set_input_tag<0>("ANALOG1");
+ adc.set_input_tag<1>("ANALOG2");
+ adc.set_input_cb<2>(FUNC(sega_multi32_analog_state::in2_analog_read));
+ adc.set_input_cb<3>(FUNC(sega_multi32_analog_state::in3_analog_read));
}
-READ8_MEMBER(sega_multi32_analog_state::in2_analog_read)
+ioport_value sega_multi32_analog_state::in2_analog_read()
{
return m_analog_ports[m_analog_bank * 4 + 2].read_safe(0);
}
-READ8_MEMBER(sega_multi32_analog_state::in3_analog_read)
+ioport_value sega_multi32_analog_state::in3_analog_read()
{
return m_analog_ports[m_analog_bank * 4 + 3].read_safe(0);
}
diff --git a/src/mame/drivers/segaybd.cpp b/src/mame/drivers/segaybd.cpp
index aa3bf44c8e7..fcd9eadfca3 100644
--- a/src/mame/drivers/segaybd.cpp
+++ b/src/mame/drivers/segaybd.cpp
@@ -1304,10 +1304,10 @@ void segaybd_state::yboard(machine_config &config)
// FMCS and CKOT connect to CS and OSC IN on MSM6253 below
msm6253_device &adc(MSM6253(config, "adc", 0));
- adc.input<0>().set_ioport("ADC.0");
- adc.input<1>().set_ioport("ADC.1");
- adc.input<2>().set_ioport("ADC.2");
- adc.input<3>().set(FUNC(segaybd_state::analog_mux));
+ adc.set_input_tag<0>("ADC.0");
+ adc.set_input_tag<1>("ADC.1");
+ adc.set_input_tag<2>("ADC.2");
+ adc.set_input_cb<3>(FUNC(segaybd_state::analog_mux));
SEGA_315_5248_MULTIPLIER(config, "multiplier_main", 0);
SEGA_315_5248_MULTIPLIER(config, "multiplier_subx", 0);
diff --git a/src/mame/includes/segas32.h b/src/mame/includes/segas32.h
index ba5ac52b05c..3381a55ef55 100644
--- a/src/mame/includes/segas32.h
+++ b/src/mame/includes/segas32.h
@@ -371,8 +371,8 @@ class sega_multi32_analog_state : public sega_multi32_state
public:
sega_multi32_analog_state(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- DECLARE_READ8_MEMBER(in2_analog_read);
- DECLARE_READ8_MEMBER(in3_analog_read);
+ ioport_value in2_analog_read();
+ ioport_value in3_analog_read();
DECLARE_WRITE8_MEMBER(analog_bank_w);
void multi32_analog_map(address_map &map);
diff --git a/src/mame/machine/model1io.cpp b/src/mame/machine/model1io.cpp
index b6d255d6c92..95c403f075a 100644
--- a/src/mame/machine/model1io.cpp
+++ b/src/mame/machine/model1io.cpp
@@ -148,10 +148,10 @@ void model1io_device::device_add_mconfig(machine_config &config)
io.in_pg_callback().set(FUNC(model1io_device::io_pg_r));
msm6253_device &adc(MSM6253(config, "adc", 0));
- adc.input<0>().set(FUNC(model1io_device::analog0_r));
- adc.input<1>().set(FUNC(model1io_device::analog1_r));
- adc.input<2>().set(FUNC(model1io_device::analog2_r));
- adc.input<3>().set(FUNC(model1io_device::analog3_r));
+ adc.set_input_cb<0>(FUNC(model1io_device::analog0_r));
+ adc.set_input_cb<1>(FUNC(model1io_device::analog1_r));
+ adc.set_input_cb<2>(FUNC(model1io_device::analog2_r));
+ adc.set_input_cb<3>(FUNC(model1io_device::analog3_r));
}
diff --git a/src/mame/machine/model1io2.cpp b/src/mame/machine/model1io2.cpp
index 40ea9e28d6c..3325cdae26c 100644
--- a/src/mame/machine/model1io2.cpp
+++ b/src/mame/machine/model1io2.cpp
@@ -182,10 +182,10 @@ MACHINE_CONFIG_START( model1io2_device::device_add_mconfig )
MB3773(config, m_watchdog, 0);
msm6253_device &adc(MSM6253(config, "adc", 32_MHz_XTAL / 16 / 4));
- adc.input<0>().set(FUNC(model1io2_device::analog0_r));
- adc.input<1>().set(FUNC(model1io2_device::analog1_r));
- adc.input<2>().set(FUNC(model1io2_device::analog2_r));
- adc.input<3>().set(FUNC(model1io2_device::analog3_r));
+ adc.set_input_cb<0>(FUNC(model1io2_device::analog0_r));
+ adc.set_input_cb<1>(FUNC(model1io2_device::analog1_r));
+ adc.set_input_cb<2>(FUNC(model1io2_device::analog2_r));
+ adc.set_input_cb<3>(FUNC(model1io2_device::analog3_r));
// diagnostic LCD display
screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_LCD));