mame/src/emu/machine/eeprom.h
2010-09-18 22:22:39 +00:00

177 lines
5.2 KiB
C++

/***************************************************************************
eeprom.h
Serial eeproms.
***************************************************************************/
#pragma once
#ifndef __EEPROMDEV_H__
#define __EEPROMDEV_H__
//**************************************************************************
// INTERFACE CONFIGURATION MACROS
//**************************************************************************
#define MDRV_EEPROM_ADD(_tag, _interface) \
MDRV_DEVICE_ADD(_tag, EEPROM, 0) \
eeprom_device_config::static_set_interface(device, _interface); \
#define MDRV_EEPROM_93C46_ADD(_tag) \
MDRV_EEPROM_ADD(_tag, eeprom_interface_93C46)
#define MDRV_EEPROM_93C66B_ADD(_tag) \
MDRV_EEPROM_ADD(_tag, eeprom_interface_93C66B)
#define MDRV_EEPROM_DATA(_data, _size) \
eeprom_device_config::static_set_default_data(device, _data, _size); \
#define MDRV_EEPROM_DEFAULT_VALUE(_value) \
eeprom_device_config::static_set_default_value(device, _value); \
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
// ======================> eeprom_interface
struct eeprom_interface
{
UINT8 m_address_bits; // EEPROM has 2^address_bits cells
UINT8 m_data_bits; // every cell has this many bits (8 or 16)
const char *m_cmd_read; // read command string, e.g. "0110"
const char *m_cmd_write; // write command string, e.g. "0111"
const char *m_cmd_erase; // erase command string, or 0 if n/a
const char *m_cmd_lock; // lock command string, or 0 if n/a
const char *m_cmd_unlock; // unlock command string, or 0 if n/a
bool m_enable_multi_read; // set to 1 to enable multiple values to be read from one read command
int m_reset_delay; // number of times eeprom_read_bit() should return 0 after a reset,
// before starting to return 1.
};
// ======================> eeprom_device_config
class eeprom_device_config : public device_config,
public device_config_memory_interface,
public device_config_nvram_interface,
public eeprom_interface
{
friend class eeprom_device;
// construction/destruction
eeprom_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
public:
// allocators
static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock);
virtual device_t *alloc_device(running_machine &machine) const;
// inline configuration helpers
static void static_set_interface(device_config *deviec, const eeprom_interface &interface);
static void static_set_default_data(device_config *device, const UINT8 *data, UINT32 size);
static void static_set_default_data(device_config *device, const UINT16 *data, UINT32 size);
static void static_set_default_value(device_config *device, UINT16 value);
protected:
// device_config overrides
virtual bool device_validity_check(const game_driver &driver) const;
// device_config_memory_interface overrides
virtual const address_space_config *memory_space_config(int spacenum = 0) const;
// device-specific configuration
address_space_config m_space_config;
// internal state
generic_ptr m_default_data;
int m_default_data_size;
UINT32 m_default_value;
};
// ======================> eeprom_device
class eeprom_device : public device_t,
public device_memory_interface,
public device_nvram_interface
{
friend class eeprom_device_config;
// construction/destruction
eeprom_device(running_machine &_machine, const eeprom_device_config &config);
public:
// I/O operations
void write_bit(int state);
int read_bit();
void set_cs_line(int state);
void set_clock_line(int state);
protected:
// device-level overrides
virtual void device_start();
virtual void device_reset();
// device_nvram_interface overrides
virtual void nvram_default();
virtual void nvram_read(mame_file &file);
virtual void nvram_write(mame_file &file);
// internal helpers
void write(int bit);
bool command_match(const char *buf, const char *cmd, int len);
static const int SERIAL_BUFFER_LENGTH = 40;
// internal state
const eeprom_device_config &m_config;
int m_serial_count;
UINT8 m_serial_buffer[SERIAL_BUFFER_LENGTH];
int m_data_bits;
int m_read_address;
int m_clock_count;
int m_latch;
int m_reset_line;
int m_clock_line;
int m_sending;
int m_locked;
int m_reset_delay;
};
// device type definition
extern const device_type EEPROM;
//**************************************************************************
// GLOBAL VARIABLES
//**************************************************************************
extern const eeprom_interface eeprom_interface_93C46;
extern const eeprom_interface eeprom_interface_93C66B;
//**************************************************************************
// READ/WRITE HANDLERS
//**************************************************************************
WRITE_LINE_DEVICE_HANDLER( eeprom_write_bit );
READ_LINE_DEVICE_HANDLER( eeprom_read_bit );
WRITE_LINE_DEVICE_HANDLER( eeprom_set_cs_line );
WRITE_LINE_DEVICE_HANDLER( eeprom_set_clock_line );
#endif