diff options
Diffstat (limited to 'src/devices/cpu/h8/h8_adc.h')
-rw-r--r-- | src/devices/cpu/h8/h8_adc.h | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/devices/cpu/h8/h8_adc.h b/src/devices/cpu/h8/h8_adc.h new file mode 100644 index 00000000000..5a7a5f67cbb --- /dev/null +++ b/src/devices/cpu/h8/h8_adc.h @@ -0,0 +1,177 @@ +// license:BSD-3-Clause +// copyright-holders:Olivier Galibert +/*************************************************************************** + + h8_adc.h + + H8 Analog to Digital Converter subsystem + + +***************************************************************************/ + +#ifndef __H8_ADC_H__ +#define __H8_ADC_H__ + +#include "h8.h" +#include "h8_intc.h" + +#define MCFG_H8_ADC_GENERIC_ADD( _tag, _type, intc, vect ) \ + MCFG_DEVICE_ADD( _tag, _type, 0 ) \ + downcast<h8_adc_device *>(device)->set_info(intc, vect); + +#define MCFG_H8_ADC_3337_ADD( _tag, intc, vect ) \ + MCFG_H8_ADC_GENERIC_ADD( _tag, H8_ADC_3337, intc, vect ) + +#define MCFG_H8_ADC_3006_ADD( _tag, intc, vect ) \ + MCFG_H8_ADC_GENERIC_ADD( _tag, H8_ADC_3006, intc, vect ) + +#define MCFG_H8_ADC_2245_ADD( _tag, intc, vect ) \ + MCFG_H8_ADC_GENERIC_ADD( _tag, H8_ADC_2245, intc, vect ) + +#define MCFG_H8_ADC_2320_ADD( _tag, intc, vect ) \ + MCFG_H8_ADC_GENERIC_ADD( _tag, H8_ADC_2320, intc, vect ) + +#define MCFG_H8_ADC_2357_ADD( _tag, intc, vect ) \ + MCFG_H8_ADC_GENERIC_ADD( _tag, H8_ADC_2357, intc, vect ) + +#define MCFG_H8_ADC_2655_ADD( _tag, intc, vect ) \ + MCFG_H8_ADC_GENERIC_ADD( _tag, H8_ADC_2655, intc, vect ) + +class h8_adc_device : public device_t { +public: + h8_adc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); + + void set_info(const char *intc_tag, int vect); + + DECLARE_READ8_MEMBER(addr8_r); + DECLARE_READ16_MEMBER(addr16_r); + DECLARE_READ8_MEMBER(adcsr_r); + DECLARE_READ8_MEMBER(adcr_r); + DECLARE_WRITE8_MEMBER(adcsr_w); + DECLARE_WRITE8_MEMBER(adcr_w); + DECLARE_WRITE_LINE_MEMBER(adtrg_w); + + void set_suspend(bool suspend); + UINT64 internal_update(UINT64 current_time); + +protected: + required_device<h8_device> cpu; + h8_intc_device *intc; + address_space *io; + const char *intc_tag; + int intc_vector; + + enum { + T_SOFT = 1<<0, + T_TPU = 1<<1, + T_TIMER = 1<<2, + T_EXT = 1<<3 + }; + + enum { + F_ADF = 0x80, + F_ADIE = 0x40, + F_ADST = 0x20 + }; + + enum { + IDLE = 0, + ACTIVE = 1, + HALTED = 2, + REPEAT = 4, + ROTATE = 8, + DUAL = 16, + BUFFER = 32, + COUNTED = 64 + }; + + UINT16 addr[8], buf[2]; + UINT8 adcsr, adcr; + int register_mask; + int trigger, start_mode, start_channel, end_channel, start_count; + bool suspend_on_interrupt, analog_power_control; + int mode, channel, count; + bool analog_powered, adtrg; + UINT64 next_event; + + virtual void device_start(); + virtual void device_reset(); + + void sampling(); + void start_conversion(); + void conversion_wait(bool first, bool poweron, UINT64 current_time = 0); + void buffer_value(int port, int buffer = 0); + void commit_value(int reg, int buffer = 0); + void timeout(UINT64 current_time); + void done(); + + virtual int conversion_time(bool first, bool poweron) = 0; + virtual void mode_update() = 0; + virtual void do_buffering(int buffer); + virtual int get_channel_index(int count); +}; + +class h8_adc_3337_device : public h8_adc_device { +public: + h8_adc_3337_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual int conversion_time(bool first, bool poweron); + virtual void mode_update(); +}; + +class h8_adc_3006_device : public h8_adc_device { +public: + h8_adc_3006_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual int conversion_time(bool first, bool poweron); + virtual void mode_update(); +}; + +class h8_adc_2245_device : public h8_adc_device { +public: + h8_adc_2245_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual int conversion_time(bool first, bool poweron); + virtual void mode_update(); +}; + +class h8_adc_2320_device : public h8_adc_device { +public: + h8_adc_2320_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual int conversion_time(bool first, bool poweron); + virtual void mode_update(); +}; + +class h8_adc_2357_device : public h8_adc_device { +public: + h8_adc_2357_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual int conversion_time(bool first, bool poweron); + virtual void mode_update(); +}; + +class h8_adc_2655_device : public h8_adc_device { +public: + h8_adc_2655_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + +protected: + virtual int conversion_time(bool first, bool poweron); + virtual void mode_update(); + virtual void do_buffering(int buffer); + virtual int get_channel_index(int count); +}; + +extern const device_type H8_ADC_3337; +extern const device_type H8_ADC_3006; +extern const device_type H8_ADC_2245; +extern const device_type H8_ADC_2320; +extern const device_type H8_ADC_2357; +extern const device_type H8_ADC_2655; + +#endif |