mirror of
https://github.com/holub/mame
synced 2025-05-22 13:48:55 +03:00
177 lines
5.2 KiB
C++
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
|