Для interrupt функций
ВСЕГДА сохраняются регистры, опция usng 1 (2,3,0) лишь уменьшает их количество, поскольку сохраняет в стек регистр статуса и меняет банк, при выходе из функции банк восстанавливается. Остальные регистры сохраняются-восстанавливаются при необходимости. Выход из Interrupt функции осуществляется командой RETI. Все это делается для того, что бы при возвращении в основную программу оставить неизменными регистры, используемые в обработчике прерываний.
Для Interrupt функций компилятор делает следующее. По
указанному вектору располагает команду перехода на функцию. В функции сохраняет используемые регистры (ACC, DPTR и т.д), переключает банк рабочих регистров (если есть опция USING) и выполняет тело функции.
По завершении функции все регистры восстанавливаются и выход осуществляется командой RETI.
поэтому ваш подход
Цитата
Объявляю функцию с параметром interrupt 0 и в теле ее вызываю проверку с битовой переменной, если переменная возведена, то делаю прямой переход (через #pragma asm) на требуемый внешний обработчик
в принципе не верен. Функцию надо объявлять без параметра interrupt. А если вы в функции проверяете именно флаг этого прерывания, то вообще непонятно зачем все так сложно. При возникновении прерывания, если оно разрешено, управление автоматически передается на соответствующий вектор. Если хотите работать по опросу, то после проверки флага надо вызывать
обычную функцию.
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.