1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
// license:BSD-3-Clause
// copyright-holders:Curt Coder
/**********************************************************************
National Semiconductor ADC0808/ADC0809 8-Bit A/D Converter emulation
**********************************************************************
_____ _____
IN3 1 |* \_/ | 28 IN2
IN4 2 | | 27 IN1
IN5 3 | | 26 IN0
IN6 4 | | 25 ADD A
IN7 5 | | 24 ADD B
START 6 | | 23 ADD C
EOC 7 | ADC0808 | 22 ALE
2-5 8 | ADC0809 | 21 2-1 MSB
OUTPUT ENABLE 9 | | 20 2-2
CLOCK 10 | | 19 2-3
Vcc 11 | | 18 2-4
Vref+ 12 | | 17 2-8 LSB
GND 13 | | 16 Vref-
2-7 14 |_____________| 15 2-6
**********************************************************************/
#pragma once
#ifndef __ADC0808__
#define __ADC0808__
#include "emu.h"
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> adc0808_analog_read
typedef device_delegate<double ()> adc0808_analog_read_delegate;
#define ADC0808_ANALOG_READ_CB(name) double name()
#define MCFG_ADC0808_OUT_EOC_CB(_devcb) \
devcb = &adc0808_device::set_out_eoc_callback(*device, DEVCB_##_devcb);
#define MCFG_ADC0808_IN_VREF_POS_CB(_class, _method) \
adc0808_device::set_in_vref_pos_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_ADC0808_IN_VREF_NEG_CB(_class, _method) \
adc0808_device::set_in_vref_neg_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_ADC0808_IN_IN_0_CB(_class, _method) \
adc0808_device::set_in_in_0_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_ADC0808_IN_IN_1_CB(_class, _method) \
adc0808_device::set_in_in_1_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_ADC0808_IN_IN_2_CB(_class, _method) \
adc0808_device::set_in_in_2_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_ADC0808_IN_IN_3_CB(_class, _method) \
adc0808_device::set_in_in_3_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_ADC0808_IN_IN_4_CB(_class, _method) \
adc0808_device::set_in_in_4_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_ADC0808_IN_IN_5_CB(_class, _method) \
adc0808_device::set_in_in_5_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_ADC0808_IN_IN_6_CB(_class, _method) \
adc0808_device::set_in_in_6_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
#define MCFG_ADC0808_IN_IN_7_CB(_class, _method) \
adc0808_device::set_in_in_7_callback(*device, adc0808_analog_read_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
// ======================> adc0808_device
class adc0808_device : public device_t
{
public:
// construction/destruction
adc0808_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
template<class _Object> static devcb_base &set_out_eoc_callback(device_t &device, _Object object) { return downcast<adc0808_device &>(device).m_out_eoc_cb.set_callback(object); }
static void set_in_vref_pos_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_vref_pos_cb = callback; }
static void set_in_vref_neg_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_vref_neg_cb = callback; }
static void set_in_in_0_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_in_0_cb = callback; }
static void set_in_in_1_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_in_1_cb = callback; }
static void set_in_in_2_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_in_2_cb = callback; }
static void set_in_in_3_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_in_3_cb = callback; }
static void set_in_in_4_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_in_4_cb = callback; }
static void set_in_in_5_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_in_5_cb = callback; }
static void set_in_in_6_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_in_6_cb = callback; }
static void set_in_in_7_callback(device_t &device, adc0808_analog_read_delegate callback) { downcast<adc0808_device &>(device).m_in_in_7_cb = callback; }
DECLARE_READ8_MEMBER( data_r );
DECLARE_WRITE8_MEMBER( ale_w );
DECLARE_WRITE_LINE_MEMBER( start_w );
protected:
// device-level overrides
virtual void device_start();
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
private:
devcb_write_line m_out_eoc_cb;
adc0808_analog_read_delegate m_in_vref_pos_cb;
adc0808_analog_read_delegate m_in_vref_neg_cb;
adc0808_analog_read_delegate m_in_in_0_cb;
adc0808_analog_read_delegate m_in_in_1_cb;
adc0808_analog_read_delegate m_in_in_2_cb;
adc0808_analog_read_delegate m_in_in_3_cb;
adc0808_analog_read_delegate m_in_in_4_cb;
adc0808_analog_read_delegate m_in_in_5_cb;
adc0808_analog_read_delegate m_in_in_6_cb;
adc0808_analog_read_delegate m_in_in_7_cb;
int m_address; // analog channel address
int m_start; // start conversion pin
int m_eoc; // end of conversion pin
int m_next_eoc; // next value end of conversion pin
UINT8 m_sar; // successive approximation register
int m_cycle; // clock cycle counter
int m_bit; // bit counter
// timers
emu_timer *m_cycle_timer;
};
// device type definition
extern const device_type ADC0808;
#endif
|