насколько понимаю, у IAR EW 8051 нет icf файлов. Вместо них i51 файлы. Вот содержимое файла для CY7C68013A:
[PROCESSOR]
name=plain
[DPTR]
nr_of=2
size=16
pdata_bank_reg_addr=0x92
switch_method=INC
switch_mask=0x01
addr_DPS=0x86
addr_DPL1=0x84
addr_DPH1=0x85
на данный момент проблему удалось решить путём добавления asm файла следующего содержания:
COMMON INTVEC:CODE:ROOT(0)
LIMIT SFB(INTVEC),0,0,"The INTVEC segment must begin at address zero"
ORG 0x006A
SJMP $
END
C этим файлом компилятор размещает код после адреса 0x006A+2 и после этого сишый код работает как положено. Вот правда задать autovector чисто на си по всей видимости не получится, поэтому без асма тут не обойтись.
Как альтернативу, можно использовать asm файл с таблицей векторов:
NAME intv
EXTERN ISR_Timer0
COMMON INTVEC:CODE:ROOT(0)
LIMIT SFB(INTVEC),0,0,"The INTVEC segment must begin at address zero"
ORG 0x0003 ; IE0 [INT0# Pin]
reti
ORG 0x000B ; TF0 [Timer 0 Overflow]
ljmp ISR_Timer0
ORG 0x0013 ; IE1 [INT1# Pin]
reti
ORG 0x001B ; TF1 [Timer 1 Overflow]
reti
ORG 0x0023 ; RI_0 & TI_0 [USART0 Rx & Tx]
reti
ORG 0x002B ; TF2 [Timer 2 Overflow]
reti
ORG 0x0033 ; Resume [WAKEUP / WU2 Pin or USB Resume]
reti
ORG 0x003B ; RI_1 & TI_1 [USART1 Rx & Tx]
reti
ORG 0x0043 ; USBINT [USB]
reti
ORG 0x004B ; I2CINT [I2C Bus]
reti
ORG 0x0053 ; IE4 [GPIF / FIFOs / INT4 Pin]
reti
ORG 0x005B ; IE5 [INT5# Pin]
reti
ORG 0x0063 ; IE6 [INT6 Pin]
reti
END
а обработчики определять без #pragma vector и вызывать из таблицы векторов:
#pragma diag_suppress=Ta009
__interrupt __root void ISR_Timer0(void)
{
}
этот вариант работает. Хотя очень неудобен, таблицы векторов нужна на асме задавать. Вариант с autovector пока не пробовал. По идее тоже должно получиться, несколько таблиц можно задать на асме и связать их через ljmp