Fix regressions from recent comit, nw

This commit is contained in:
mooglyguy 2018-12-27 21:44:45 +01:00
parent 88ec765af5
commit bbc1fcfed3
8 changed files with 76 additions and 32 deletions

View File

@ -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,12 +41,37 @@ 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

View File

@ -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;

View File

@ -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
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);

View File

@ -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));
}

View File

@ -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));