blob: 50e59ad56151e0e37c79041ad52796a2c79413e6 (
plain) (
tree)
|
|
// license:BSD-3-Clause
// copyright-holders:AJR
/**********************************************************************
National Semiconductor ADC0804 8-bit µP Compatible A/D Converter
***********************************************************************
____ ____
/CS 1 |* \_/ | 20 Vcc (or Vref)
/RD 2 | | 19 CLK R
/WR 3 | | 18 DB0
CLK IN 4 | ADC0801 | 17 DB1
/INTR 5 | ADC0802 | 16 DB2
Vin(+) 6 | ADC0803 | 15 DB3
Vin(-) 7 | ADC0804 | 14 DB4
A GND 8 | ADC0805 | 13 DB5
Vref/2 9 | | 12 DB6
GND 10 |___________| 11 DB7
**********************************************************************/
#ifndef MAME_MACHINE_ADC0804_H
#define MAME_MACHINE_ADC0804_H
#pragma once
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> adc0804_device
class adc0804_device : public device_t
{
static const int s_conversion_cycles;
public:
enum read_mode {
RD_STROBED = 0,
RD_BITBANGED,
RD_GROUNDED
};
// device type constructors
adc0804_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
adc0804_device(const machine_config &mconfig, const char *tag, device_t *owner, double r, double c)
: adc0804_device(mconfig, tag, owner, 0U)
{
set_rc(r, c);
}
// callback configuration
auto vin_callback() { return m_vin_callback.bind(); }
auto intr_callback() { return m_intr_callback.bind(); }
// misc. configuration
void set_rc(double res, double cap) { assert(!configured()); m_res = res; m_cap = cap; }
void set_rd_mode(read_mode mode) { assert(!configured()); m_rd_mode = mode; }
// data bus interface
u8 read();
u8 read_and_write();
void write(u8 data = 0);
// control line interface
DECLARE_WRITE_LINE_MEMBER(rd_w);
DECLARE_WRITE_LINE_MEMBER(wr_w);
// status line interface
DECLARE_READ_LINE_MEMBER(intr_r) { return m_intr_active ? 0 : 1; }
protected:
// device-level overrides
virtual void device_resolve_objects() override;
virtual void device_start() override;
private:
// internal helpers
void set_interrupt(bool state);
void conversion_start();
TIMER_CALLBACK_MEMBER(conversion_done);
// callback objects
devcb_read8 m_vin_callback;
devcb_write_line m_intr_callback;
// timing parameters
double m_res;
double m_cap;
attotime m_fclk_rc;
// conversion timer
emu_timer *m_timer;
// inputs
read_mode m_rd_mode;
bool m_rd_active;
bool m_wr_active;
// internal state
u8 m_result;
bool m_intr_active;
};
// device type declarations
DECLARE_DEVICE_TYPE(ADC0804, adc0804_device)
#endif // MAME_MACHINE_ADC0804_H
|