
/***********************************************************************
DESC:    I2C interrupt service routine. handles the transfer and
         calls the relevent callback functions. Changes mi2cstatus
RETURNS: Nothing
************************************************************************/
void i2c_isr
  (
  void
  ) interrupt 6 using 1
{
  unsigned char status;

  status = I2STAT & 0xF8;

  switch(status)
  {
    case 0x08:
    case 0x10:
      I2DAT = mslaveaddress;
      STA = 0;
      STO = 0;
      mbytenum = 0;
      break;

    // MASTER TRANSMITTER
    // ACK for slave address + W
    case 0x18:
      I2DAT = i2c_master_getbyte(mbytenum);
      STA = 0;
      STO = 0;
      break;
    // no ACK for slave address + W
    case 0x20:
      // stop condition
      STA = 0;
      STO = 1;
      mi2cstatus = I2C_ERROR;
      i2c_transfer_finished();
      break;
    // ACK for data byte
    case 0x28:
      if (i2c_master_islasttxbyte(mbytenum))
      {
        // stop condition
        STA = 0;
        STO = 1;
        mi2cstatus = I2C_OK;
        i2c_transfer_finished();
      }
      else
      {
        mbytenum++;
        I2DAT = i2c_master_getbyte(mbytenum);
        STA = 0;
        STO = 0;
      } // if
      break;
    // no ACK for data byte
    case 0x30:
      // stop condition
      STA = 0;
      STO = 1;
      mi2cstatus = I2C_ERROR;
      i2c_transfer_finished();
      break;
    // arbitration lost
    case 0x38:
      // start condition - try again
      STA = 1;
      STO = 0;
      break;
