Ну, короче, вот что получилось.
Код
#define switch_even_in_range(index, ... ) \
static const unsigned int *sw[] = {__VA_ARGS__};\
unsigned int *target = *(void**)((unsigned int*)sw + index);\
goto *target;
index - переключатель, далее следует записать все метки кейсов.
Код
interrupt (TIMERB1_VECTOR) Timerb_ccr1(void)
{
switch_even_in_range(TBIV, &&def, &&l2, &&l4, &&l6, &&l8, &&l10, &&l12 )
{
l2:
pxTimerB1ccr1expired();
l4:
pxTimerB1ccr2expired();
l6:
(void)pxMBPortCBTimerExpired();
l8:
pxTimerB1ccr4expired();
l10:
pxTimerB1ccr5expired();
l12:
pxTimerB1ccr6expired();
def:
}
}
Ничё так, гламурненько

А вот выход:
CODE
00002eb0 <Timerb_ccr1>:
2eb0: 0f 12 push r15 ;
2eb2: 0e 12 push r14 ;
2eb4: 0d 12 push r13 ;
2eb6: 0c 12 push r12 ;
2eb8: 05 12 push r5 ;
2eba: 04 12 push r4 ;
2ebc: 05 41 mov r1, r5 ;
2ebe: 35 50 0e 00 add #14, r5 ;#0x000e
2ec2: 21 83 decd r1 ;
2ec4: 04 41 mov r1, r4 ;
2ec6: 1f 42 1e 01 mov &0x011e,r15 ;0x011e
2eca: 0f 5f rla r15 ;
2ecc: 3f 50 04 02 add #516, r15 ;#0x0204
2ed0: a4 4f 00 00 mov @r15, 0(r4) ;
2ed4: 20 44 br @r4 ;
2ed6: 1f 42 ca 03 mov &0x03ca,r15 ;0x03ca
2eda: 8f 12 call r15 ;
2edc: 1f 42 a8 03 mov &0x03a8,r15 ;0x03a8
2ee0: 8f 12 call r15 ;
2ee2: 1f 42 aa 03 mov &0x03aa,r15 ;0x03aa
2ee6: 8f 12 call r15 ;
2ee8: 1f 42 c6 03 mov &0x03c6,r15 ;0x03c6
2eec: 8f 12 call r15 ;
2eee: 1f 42 c4 03 mov &0x03c4,r15 ;0x03c4
2ef2: 8f 12 call r15 ;
2ef4: 1f 42 c2 03 mov &0x03c2,r15 ;0x03c2
2ef8: 8f 12 call r15 ;
2efa: 21 53 incd r1 ;
2efc: 34 41 pop r4 ;
2efe: 35 41 pop r5 ;
2f00: 3c 41 pop r12 ;
2f02: 3d 41 pop r13 ;
2f04: 3e 41 pop r14 ;
2f06: 3f 41 pop r15 ;
2f08: 00 13 reti
ссылка по указателю на функцию в прерывании это конечно изврат, но речь сейчас не об этом.
В целом вроде бы всё удалось.