diff options
author | 2018-12-27 21:44:45 +0100 | |
---|---|---|
committer | 2018-12-27 21:44:57 +0100 | |
commit | bbc1fcfed3fbf55c75dcd411d60b20536c655a12 (patch) | |
tree | c21e7dec6d1a691f8f329145e892e4eea7c08ee6 | |
parent | 88ec765af5e47332d68893fbaa870cd0d9bc4da3 (diff) |
Fix regressions from recent comit, nw
-rw-r--r-- | src/devices/machine/msm6253.cpp | 33 | ||||
-rw-r--r-- | src/devices/machine/msm6253.h | 19 | ||||
-rw-r--r-- | src/mame/drivers/segas24.cpp | 8 | ||||
-rw-r--r-- | src/mame/drivers/segas32.cpp | 20 | ||||
-rw-r--r-- | src/mame/drivers/segaybd.cpp | 8 | ||||
-rw-r--r-- | src/mame/includes/segas32.h | 4 | ||||
-rw-r--r-- | src/mame/machine/model1io.cpp | 8 | ||||
-rw-r--r-- | src/mame/machine/model1io2.cpp | 8 |
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)); |