diff options
Diffstat (limited to 'src/devices/machine/msm6253.h')
-rw-r--r-- | src/devices/machine/msm6253.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/devices/machine/msm6253.h b/src/devices/machine/msm6253.h new file mode 100644 index 00000000000..68db51d3045 --- /dev/null +++ b/src/devices/machine/msm6253.h @@ -0,0 +1,104 @@ +// license:BSD-3-Clause +// copyright-holders: AJR +/********************************************************************** + + OKI MSM6253 8-Bit 4-Channel A/D Converter + +*********************************************************************** + ____ ____ + /OSC OUT 1 |* \_/ | 18 OSC OUT + D-GND 2 | | 17 OSC IN + A-GND 3 | | 16 /RD + IN0 4 | | 15 /WR + IN1 5 | MSM6253RS | 14 ALE + IN2 6 | | 13 /CS + IN3 7 | | 12 A1 + Vr 8 | | 11 A0 + Vdd 9 |___________| 10 S.O. + +**********************************************************************/ + +#pragma once + +#ifndef DEVICES_MACHINE_MSM6253_H +#define DEVICES_MACHINE_MSM6253_H + +//************************************************************************** +// CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_MSM6253_IN0_ANALOG_PORT(_input) \ + msm6253_device::static_set_input_tag(*device, 0, "^" _input); +#define MCFG_MSM6253_IN1_ANALOG_PORT(_input) \ + msm6253_device::static_set_input_tag(*device, 1, "^" _input); +#define MCFG_MSM6253_IN2_ANALOG_PORT(_input) \ + msm6253_device::static_set_input_tag(*device, 2, "^" _input); +#define MCFG_MSM6253_IN3_ANALOG_PORT(_input) \ + msm6253_device::static_set_input_tag(*device, 3, "^" _input); + +#define MCFG_MSM6253_IN0_ANALOG_READ(_class, _method) \ + msm6253_device::static_set_input_cb(*device, 0, analog_port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); +#define MCFG_MSM6253_IN1_ANALOG_READ(_class, _method) \ + msm6253_device::static_set_input_cb(*device, 1, analog_port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); +#define MCFG_MSM6253_IN2_ANALOG_READ(_class, _method) \ + msm6253_device::static_set_input_cb(*device, 2, analog_port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); +#define MCFG_MSM6253_IN3_ANALOG_READ(_class, _method) \ + msm6253_device::static_set_input_cb(*device, 3, analog_port_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner))); + +#define MCFG_MSM6253_IN0_ANALOG_DEVREAD(_tag, _class, _method) \ + msm6253_device::static_set_input_cb(*device, 0, analog_port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); +#define MCFG_MSM6253_IN1_ANALOG_DEVREAD(_tag, _class, _method) \ + msm6253_device::static_set_input_cb(*device, 1, analog_port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); +#define MCFG_MSM6253_IN2_ANALOG_DEVREAD(_tag, _class, _method) \ + msm6253_device::static_set_input_cb(*device, 2, analog_port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); +#define MCFG_MSM6253_IN3_ANALOG_DEVREAD(_tag, _class, _method) \ + msm6253_device::static_set_input_cb(*device, 3, analog_port_read_delegate(&_class::_method, #_class "::" #_method, _tag)); + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +typedef device_delegate<ioport_value ()> analog_port_read_delegate; + +// ======================> msm6253_device + +class msm6253_device : public device_t +{ +public: + // construction/destruction + msm6253_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // static configuration + static void static_set_input_tag(device_t &device, int port, const char *tag) { downcast<msm6253_device &>(device).m_analog_ports[port].set_tag(tag); } + static void static_set_input_cb(device_t &device, int port, analog_port_read_delegate &&cb) { downcast<msm6253_device &>(device).m_analog_input_cb[port] = std::move(cb); } + + // write handlers + WRITE8_MEMBER(address_w); + WRITE8_MEMBER(select_w); + + // read handlers + bool shift_out(); + READ8_MEMBER(d0_r); + READ8_MEMBER(d7_r); + +protected: + // device-level overrides + virtual void device_start() override; + +private: + // helpers + template<int port> ioport_value port_read(); + + // input configuration + optional_ioport_array<4> m_analog_ports; + analog_port_read_delegate m_analog_input_cb[4]; + + // private data + u8 m_shift_register; +}; + +// device type definition +extern const device_type MSM6253; + +#endif // DEVICES_MACHINE_MSM6253_H |