summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/h8/h8_adc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/h8/h8_adc.h')
-rw-r--r--src/devices/cpu/h8/h8_adc.h177
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