I am reading data from a 24LC1025 over I2C with an Arduino and then outputing that data to my PC through the Serial interface. The EEPROM chip is seperated into two pages and at address 65535 [0x0FFFF] it switches over to the second page sending [0x10000 through 0x1FFFF] I had it working by reading each address with a random read:

    #include <Wire.h>

    byte i2c_eeprom_read_byte( int deviceaddress, unsigned long eeaddress ) {
        byte rdata = 0xFF;
        Wire.beginTransmission(deviceaddress);
        Wire.write((eeaddress >> 8)); // MSB
        Wire.write((eeaddress & 0xFF)); // LSB
        Wire.endTransmission();
        Wire.requestFrom(deviceaddress,1);
        if (Wire.available()) rdata = Wire.read();
        return rdata;
    }
    
    void setup() {
      Wire.begin(); // initialise the connection
      Serial.begin(9600);
      delay(100); //add a small delay
      Serial.println("Arduino Group Delay Read Program");
        
      for (unsigned long i = 0; i < 128000; i++){
        Serial.print(i);
        Serial.print(",");
        byte a = i2c_eeprom_read_byte(0x50, i);
        Serial.println(a, BIN);
      }
    }
    
    void loop() {
      //
    }

To reduce overhead and speed up the process I am now using the code below:

    #include <Wire.h>
    
    byte bytes[32];
    
    void i2c_eeprom_read_buffer( int deviceaddress, unsigned long eeaddress, byte *buffer, int length ) {
        Wire.beginTransmission(deviceaddress);
        Wire.write((eeaddress >> 8)); // MSB
        Wire.write((eeaddress & 0xFF)); // LSB
        Wire.endTransmission();
        Wire.requestFrom(deviceaddress,length);
        int c = 0;
        for ( c = 0; c < length; c++ )
            if (Wire.available()) buffer[c] = Wire.read();
    }
    
    void setup() {
      Wire.setClock(400000); // 400kHz
      Wire.begin(); // initialise the connection
      Serial.begin(250000);
      delay(100); //add a small delay
      Serial.println("Arduino Group Delay Read Program");
        
      for (unsigned int i = 0; i < 128000;){
        i2c_eeprom_read_buffer(0x50, i, (byte *)bytes, 32);
        for (int j = 0; j < 32; j++){
          Serial.print(i);
          Serial.print(",");
          Serial.println(bytes[j], BIN);
          i++;
        }
      }
    }
    
    void loop() {
      // 
    }

Unfortunately, the program now loops at the page boundary back to the start of the address range. Here is a sample of the output:

    65500,1110100
    65501,1101000
    65502,1101001
    65503,1110011
    65504,100000
    65505,1101001
    65506,1110011
    65507,100000
    65508,1100100
    65509,1100001
    65510,1110100
    65511,1100001
    65512,100000
    65513,1100110
    65514,1110010
    65515,1101111
    65516,1101101
    65517,100000
    65518,1110100
    65519,1101000
    65520,1100101
    65521,100000
    65522,1100101
    65523,1100101
    65524,1110000
    65525,1110010
    65526,1101111
    65527,1101101
    65528,0
    65529,11111111
    65530,11111111
    65531,11111111
    65532,11111111
    65533,11111111
    65534,11111111
    65535,11111111
    0,0
    1,0
    2,1
    3,110000
    4,111000
    5,111001
    6,110110
    7,110001
    8,111001
    9,1000001
    10,101110
    11,1011000
    12,110001
    13,110001
    14,1010110
    15,1011001
    16,110001
    17,110111
    18,110100
    19,110001
    20,1110100
    21,1101000
    22,1101001
    23,1110011
    24,100000
    25,1101001
    26,1110011
    27,100000
    28,1100100
    29,1100001
    30,1110100
    31,1100001
    32,100000
    33,1100110
    34,1110010
    35,1101111
    36,1101101
    37,100000
    38,1110100
    39,1101000
    40,1100101
    41,100000
    42,1100101
    43,1100101
    44,1110000
    45,1110010
    46,1101111
    47,1101101
    48,0
    49,111001
    50,100010
    51,11010010
    52,110101
    53,1001000
    54,11101011
    55,11000000
    56,110101
    57,11101011
    58,1011100
    59,10010100
    60,110101
    61,100000
    62,10100011
    63,1110110
    64,10110100
    65,10110001
    66,1111010
    67,11100000
    68,10110110
    69,101100
    70,11010110
    
I could see how an error in the code could cause the second page to display the first page's values, but there is nothing in the code that should cause the counter itself to loop. Any idea what could be causing this?

**Edit:
For anyone who is working a similar issue, here is the code that I ended up with once I solved this issue and then dealt with the page boundary problem (line 4):**

    #include <Wire.h>
    
    byte i2c_eeprom_read_byte( int deviceaddress, unsigned long eeaddress ) {
      byte rdata = 0xFF;
       if( eeaddress > 65535 ){
        deviceaddress = deviceaddress | B00000100;
        eeaddress = eeaddress & 0xFFFF;
        }
      Wire.beginTransmission(deviceaddress);
      Wire.write((eeaddress >> 8));   // MSB
      Wire.write((eeaddress & 0xFF)); // LSB
      Wire.endTransmission();
      Wire.requestFrom(deviceaddress,1);
      if (Wire.available()) rdata = Wire.read();
      return rdata;
    }
    
    void setup() {
      Wire.setClock(400000);  
      Wire.begin(); // initialise the connection
      Serial.begin(115200);
      delay(100); //add a small delay
      Serial.println("Arduino Group Delay Read Program");
    
      for (unsigned long i = 0; i < 128000; i++){
        Serial.print(i);
        Serial.print(",");
        byte a = i2c_eeprom_read_byte(0x50, i);
        Serial.println(a, BIN);
      }
    }
    
    void loop() {
    }

Note that this last code will work with the i2c_eeprom_read_buffer function as well as long as you add the if statement starting at line 4.