> It would be nice for the GCC to support the interrupt vector table through a 
> switch statement.

Here is an example how to implement switch (__even_in_range()) in gcc.

interrupt (UART0TX_VECTOR) i2c_tx()
{
#define __even_in_range(x,y) x
  switch (__even_in_range(I2CIV, 0x10))         // Use calculated branching
  {
    case I2CIV_RXRDY :
      I2CBuffer[0] = I2CDRB;                    // Store RX data in buffer
      break;
    case I2CIV_TXRDY :
      I2CDRB = I2CBuffer[I2CTxPtr];
      if (I2CTxPtr-- == 0)                      // TX finished?
        I2CIE &= ~TXRDYIE;                      // Disable TX ready interrupt
      break;
  }
}

#if 0
i2c_tx_jump_table()
{
  static void *jump_table[] = {
    &&l_else,  /* 00 : NONE */
    &&l_else,  /* 02 : AL    */
    &&l_else,  /* 04 : NACK  */
    &&l_else,  /* 06 : OA    */
    &&l_else,  /* 08 : ARDY  */
    &&l_RXRDY, /* 0A : RXRDY */
    &&l_TXRDY, /* 0C : TXRDY */
    &&l_else,  /* 0E : GC    */
    &&l_else,  /* 10 : STT   */
  };
  goto *jump_table[I2CIV>>1];
 l_TXRDY:
      I2CDRB = I2CBuffer[I2CTxPtr];
      if (I2CTxPtr-- == 0)                      // TX finished?
        I2CIE &= ~TXRDYIE;                      // Disable TX ready interrupt
      goto l_else;
 l_RXRDY:
      I2CBuffer[0] = I2CDRB;                    // Store RX data in buffer
 l_else: ;
}

/* switch
        mov     &0x011C, r15 
        cmp     #llo(10), r15
        jeq     .L65
        cmp     #llo(12), r15
        jeq     .L66
        jmp     .L63


  jump_table
        mov     &0x011C, r15 
        bic     #llo(1),r15
        br      jump_table.0(r15)
.L73:

*/
#endif


Reply via email to