The resulting code was run in a small test program in an AT90S2313.
Customiztion and use
Pull-up resistors are required on SDA and SCL lines. See the I2C spec. for details.
The subroutine, I2CInit, needs to be called during initialization, preferable after the I/O ports are initialized but before calling any I2C read or write routines. I2CInit will set up the I2C I/O pins and initialize the bus.
The EEPROM code needs to be customized to deal with the I/O pins being used and the processor clock speed in each particular application. All constants and registers that need to be modified are found in the I2C Memory Driver section. Check and if necessary, change the I/O assignments to I2CPORT, I2CDDR, I2CPIN, bSDA, and bSCL in the I2C Memory Driver sect
Delays to accommodate various bus speed and processor clock rates are controlled by the constant I2CDelayConstant.
For more detail: EEPROM Driver for AVR with RAM using ATtiny15 microcontroller