Добрый день.
Странный код у вас при вызове перевызываемой функции. Вот пример моей функции и ее листинг
Вот сама процедура на Си (первые цифры - это номера строк в коде, что бы легче было произвести сравнение с листингом)
На отсутствие return не смотрите.
Код
330 bit set_CS(byte set) reentrant
331 {
332 if (SPI_mas.ptrs[SPI_mas.rd].type==SPI_SD_card)
333 {// CS для карты памяти
334 CS_SD_card=(bit)set;
335 return(CS_SD_card);
336 }
337 }
Вот листинг. Тут видно что программный стек идет вниз (аппаратный идет вверх, SP. Вверх - к старшим адресам) из этого прямой вывод, что ставить начальный адрес надо как можно выше, лучше просто на максимум, т.е. вершину ставим не в конце всех переменных, а самый старший адрес памяти.
Код
; FUNCTION _?set_CS (BEGIN)
; SOURCE LINE # 330
0000 1500 E DEC ?C_IBP
0002 A800 E MOV R0,?C_IBP
0004 A607 MOV @R0,AR7
; SOURCE LINE # 332
0006 900000 R MOV DPTR,#SPI_mas+025EH
0009 E0 MOVX A,@DPTR
000A 75F00A MOV B,#0AH
000D A4 MUL AB
000E 2400 R ADD A,#LOW SPI_mas+0267H
0010 F582 MOV DPL,A
0012 E5F0 MOV A,B
0014 3400 R ADDC A,#HIGH SPI_mas+0267H
0016 F583 MOV DPH,A
0018 E0 MOVX A,@DPTR
0019 B40209 CJNE A,#02H,?C0043
; SOURCE LINE # 333
; SOURCE LINE # 334
001C A800 E MOV R0,?C_IBP
001E E6 MOV A,@R0
001F 24FF ADD A,#0FFH
0021 92A0 MOV CS_SD_card,C
; SOURCE LINE # 335
0023 A2A0 MOV C,CS_SD_card
; SOURCE LINE # 336
; SOURCE LINE # 337
0025 ?C0043:
0025 C0D0 PUSH PSW
0027 0500 E INC ?C_IBP
0029 D0D0 POP PSW
002B 22 RET
; FUNCTION _?set_CS (END)
В вашем примере я не обнаружил вообще вызов в стек. Есть какое то сложение данных по адресу 0x60 и все. То что в инициализации у вас в адрес 0x60 укладывается значение 0x7C (вы говорили о записи туда 0xFF) мне пока не говорит что это именно ?C_IBP (посмотрите ее значение в map файле, найдите в файл .map адрес этой переменной. В моем примере она лежит по адресу 0x13 в области DATA (т.е. директ мемори, не в XDATA).
В общем странно это все. У меня не происходит пересечения областей памяти при вызове первызываемых функций. Мало того IBPSTACK для small модели и складывает оно все в индерект память, а не в xdata как вы указали. У вас весь код в какой модели памяти? Нет ли прагма для отдельных файлов со сменой модели памяти для этих файлов (так тоже можно и оно отлично работает, нужно только в определении функции прописать ее тип модели и тогда при вызове процедуры с другой моделью никаких проблем не будет).
удачи.
Просмотрел еще раз сообщения. Ощущение что код у вас в compact, а стек вы упорно пытаетесь проинитить для small.
Удачи.