> 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