summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/machine/i2cmem.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/machine/i2cmem.h')
-rw-r--r--trunk/src/emu/machine/i2cmem.h128
1 files changed, 128 insertions, 0 deletions
diff --git a/trunk/src/emu/machine/i2cmem.h b/trunk/src/emu/machine/i2cmem.h
new file mode 100644
index 00000000000..f0c6aa14deb
--- /dev/null
+++ b/trunk/src/emu/machine/i2cmem.h
@@ -0,0 +1,128 @@
+/***************************************************************************
+
+ i2cmem.h
+
+ I2C Memory
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __I2CMEM_H__
+#define __I2CMEM_H__
+
+
+/***************************************************************************
+ CONSTANTS
+***************************************************************************/
+
+#define I2CMEM_SLAVE_ADDRESS ( 0xa0 )
+#define I2CMEM_SLAVE_ADDRESS_ALT ( 0xb0 )
+
+
+//**************************************************************************
+// INTERFACE CONFIGURATION MACROS
+//**************************************************************************
+
+#define MCFG_I2CMEM_ADD( _tag, _interface ) \
+ MCFG_DEVICE_ADD( _tag, I2CMEM, 0 ) \
+ i2cmem_device::static_set_interface(*device, _interface);
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+// ======================> i2cmem_interface
+
+struct i2cmem_interface
+{
+ int m_slave_address;
+ int m_page_size;
+ int m_data_size;
+};
+
+
+// ======================> i2cmem_device
+
+class i2cmem_device :
+ public device_t,
+ public device_memory_interface,
+ public device_nvram_interface,
+ public i2cmem_interface
+{
+public:
+ // construction/destruction
+ i2cmem_device( const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock );
+
+ // inline configuration
+ static void static_set_interface(device_t &device, const i2cmem_interface &interface);
+
+ // I/O operations
+ void set_e0_line( int state );
+ void set_e1_line( int state );
+ void set_e2_line( int state );
+ void set_sda_line( int state );
+ void set_scl_line( int state );
+ void set_wc_line( int state );
+ int read_sda_line();
+
+protected:
+ // device-level overrides
+ virtual void device_config_complete();
+ virtual bool device_validity_check( emu_options &options, const game_driver &driver ) const;
+ virtual void device_start();
+ virtual void device_reset();
+
+ // device_memory_interface overrides
+ virtual const address_space_config *memory_space_config( address_spacenum spacenum = AS_0 ) const;
+
+ // device_nvram_interface overrides
+ virtual void nvram_default();
+ virtual void nvram_read( emu_file &file );
+ virtual void nvram_write( emu_file &file );
+
+ // internal helpers
+ int address_mask();
+ int select_device();
+ int data_offset();
+
+ // device-specific configuration
+ address_space_config m_space_config;
+ int m_address_bits;
+
+ // internal state
+ int m_scl;
+ int m_sdaw;
+ int m_e0;
+ int m_e1;
+ int m_e2;
+ int m_wc;
+ int m_sdar;
+ int m_state;
+ int m_bits;
+ int m_shift;
+ int m_devsel;
+ int m_byteaddr;
+ UINT8 *m_page;
+ int m_page_offset;
+};
+
+
+// device type definition
+extern const device_type I2CMEM;
+
+
+//**************************************************************************
+// READ/WRITE HANDLERS
+//**************************************************************************
+
+WRITE_LINE_DEVICE_HANDLER( i2cmem_e0_write );
+WRITE_LINE_DEVICE_HANDLER( i2cmem_e1_write );
+WRITE_LINE_DEVICE_HANDLER( i2cmem_e2_write );
+WRITE_LINE_DEVICE_HANDLER( i2cmem_sda_write );
+WRITE_LINE_DEVICE_HANDLER( i2cmem_scl_write );
+WRITE_LINE_DEVICE_HANDLER( i2cmem_wc_write );
+READ_LINE_DEVICE_HANDLER( i2cmem_sda_read );
+
+#endif /* __I2CMEM_H__ */