+/*
+const EEPROM_interface eeprom_interface. =
+{
+ 9, // address bits 9
+ 8, // data bits 8
+ "*110", // read 1 10 aaaaaaaaa
+ "*101", // write 1 01 aaaaaaaaa dddddddd
+. "*10000xxxxxxx", // lock 1 00 00xxxxxxx
+ "*10011xxxxxxx", // unlock 1 00 11xxxxxxx
+ 1,
+ 5
+};
+
+static const EEPROM_interface *intf;
+
+static int serial_count = 0;
+static u8 serial_buffer[SERIAL_BUFFER_LENGTH];
+
+static int eeprom_data_bits;
+static int eeprom_clock_count;
+static int eeprom_read_address;
+static u8 *eeprom_data;
+
+static int latch = 0;
+static int locked = 1;
+static int sending = 0;
+static int reset_line = ASSERT_LINE;
+static int clock_line = ASSERT_LINE;
+static int reset_delay;
+
+void EEPROM_Init(u8 *data, u8 bit)
+{
+ eeprom_data = data;
+ if(bit == 8)
+ intf = &eeprom_interface_93C46_8;
+ else
+ intf = &eeprom_interface_93C46_16;
+}
+
+u8 *EEPROM_GetData()
+{
+ return eeprom_data;
+}
+
+static int EEPROM_command_match(const char *buf, const char *cmd, int len)
+{
+ if ( cmd == 0 ) return 0;
+ if ( len == 0 ) return 0;
+
+ for (;len>0;)
+ {
+ char b = *buf;
+ char c = *cmd;
+
+ if ((b==0) || (c==0))
+ return (b==c);
+
+ switch ( c )
+ {
+ case '0':
+ case '1':
+ if (b != c) return 0;
+ case 'X':
+ case 'x':
+ buf++;
+ len--;
+ cmd++;
+ break;
+
+ case '*':
+ c = cmd[1];
+ switch( c )
+ {
+ case '0':
+ case '1':
+ if (b == c) { cmd++; }
+ else { buf++; len--; }
+ break;
+ default: return 0;
+ }
+ }
+ }
+ return (*cmd==0);
+}
+
+static void EEPROM_write(int bit)
+{
+ if (serial_count >= SERIAL_BUFFER_LENGTH-1)
+ {
+ return;
+ }
+
+ serial_buffer[serial_count++] = (bit ? '1' : '0');
+ serial_buffer[serial_count] = 0;
+
+ if ( (serial_count > intf->address_bits) &&
+ EEPROM_command_match((char*)serial_buffer,intf->cmd_read,(int)strlen((char*)serial_buffer)-intf->address_bits) )
+ {
+ int i,address;
+
+ address = 0;
+ for (i = serial_count-intf->address_bits;i < serial_count;i++)
+ {
+ address <<= 1;
+ if (serial_buffer[i] == '1') address |= 1;
+ }
+ if (intf->data_bits == 16)
+ eeprom_data_bits = (eeprom_data[2*address+0] << 8) + eeprom_data[2*address+1];
+ else
+ eeprom_data_bits = eeprom_data[address];
+ eeprom_read_address = address;
+ eeprom_clock_count = 0;
+ sending = 1;
+ serial_count = 0;
+ }
+ else if ( (serial_count > intf->address_bits) &&
+ EEPROM_command_match((char*)serial_buffer,intf->cmd_erase,(int)strlen((char*)serial_buffer)-intf->address_bits) )
+ {
+ int i,address;
+
+ address = 0;
+ for (i = serial_count-intf->address_bits;i < serial_count;i++)
+ {
+ address <<= 1;
+ if (serial_buffer[i] == '1') address |= 1;
+ }
+
+ if (locked == 0)
+ {
+ if (intf->data_bits == 16)
+ {
+ eeprom_data[2*address+0] = 0x00;
+ eeprom_data[2*address+1] = 0x00;
+ }
+ else
+ eeprom_data[address] = 0x00;
+ }
+ else
+ serial_count = 0;
+ }
+ else if ( (serial_count > (intf->address_bits + intf->data_bits)) &&
+ EEPROM_command_match((char*)serial_buffer,intf->cmd_write,(int)strlen((char*)serial_buffer)-(intf->address_bits + intf->data_bits)) )
+ {
+ int i,address,data;
+
+ address = 0;
+ for (i = serial_count-intf->data_bits-intf->address_bits;i < (serial_count-intf->data_bits);i++)
+ {
+ address <<= 1;
+ if (serial_buffer[i] == '1') address |= 1;
+ }
+ data = 0;
+ for (i = serial_count-intf->data_bits;i < serial_count;i++)
+ {
+ data <<= 1;
+ if (serial_buffer[i] == '1') data |= 1;
+ }
+ if (locked == 0)
+ {
+ if (intf->data_bits == 16)
+ {
+ eeprom_data[2*address+0] = data >> 8;
+ eeprom_data[2*address+1] = data & 0xff;
+ }
+ else
+ eeprom_data[address] = data;
+ }
+ else
+ serial_count = 0;
+ }
+ else if ( EEPROM_command_match((char*)serial_buffer,intf->cmd_lock,(int)strlen((char*)serial_buffer)) )
+ {
+ locked = 1;
+ serial_count = 0;
+ }
+ else if ( EEPROM_command_match((char*)serial_buffer,intf->cmd_unlock,(int)strlen((char*)serial_buffer)) )
+ {
+ locked = 0;
+ serial_count = 0;
+ }
+}
+
+static void EEPROM_reset()
+{
+ serial_count = 0;
+ sending = 0;
+ reset_delay = intf->reset_delay;
+}
+
+void EEPROM_set_cs_line(int state)
+{
+ reset_line = state;
+
+ if (reset_line != CLEAR_LINE)
+ EEPROM_reset();
+}
+
+void EEPROM_set_clock_line(int state)
+{
+ if (state == PULSE_LINE || (clock_line == CLEAR_LINE && state != CLEAR_LINE))
+ {
+ if (reset_line == CLEAR_LINE)
+ {
+ if (sending)
+ {
+ if (eeprom_clock_count == intf->data_bits)
+ {
+ if(intf->enable_multi_read)
+ {
+ eeprom_read_address = (eeprom_read_address + 1) & ((1 << intf->address_bits) - 1);
+ if (intf->data_bits == 16)
+ eeprom_data_bits = (eeprom_data[2*eeprom_read_address+0] << 8) + eeprom_data[2*eeprom_read_address+1];
+ else
+ eeprom_data_bits = eeprom_data[eeprom_read_address];
+ eeprom_clock_count = 0;
+ }
+ else
+ {
+ sending = 0;
+ }
+ }
+ eeprom_data_bits = (eeprom_data_bits << 1) | 1;
+ eeprom_clock_count++;
+ }
+ else
+ EEPROM_write(latch);
+ }
+ }
+
+ clock_line = state;
+}
+
+
+void EEPROM_write_bit(int bit)
+{
+ latch = bit;
+}
+
+int EEPROM_read_bit(void)
+{
+ int res;
+
+ if (sending)
+ res = (eeprom_data_bits >> intf->data_bits) & 1;
+ else
+ {
+ if (reset_delay > 0)
+ {
+ reset_delay--;
+ res = 0;
+ }
+ else
+ res = 1;
+ }
+
+ return res;
+}
+*/
+