|
int_rout:
push ACC
push PSW
push DPL
push DPH
;push whatever_else
;.......
;....... Здесь сам код обработчика
;.......
;pop whatever_else
pop DPH
pop DPL
pop PSW ;SP указывает на сохраненный ACC, но POP мы пока не делаем
;
;Начало процедуры принудительного возврата
;
mov A,R0 ;Сохраняем ТЕКУЩИЙ R0
push ACC ;
mov R0,SP ;Копируем SP в R0
dec R0 ;Пропускаем сохраненные R0 и ACC
dec R0 ;Теперь R0 указывает на старший байт адреса возврата
mov @R0,#high(kuda_nado);Подменяем старший байт адреса возврата
dec R0 ;Теперь R0 указывает на младший байт адреса возврата
mov @R0,#low(kuda_nado) ;Подменяем младший байт адреса возврата
pop ACC ;Восстанавливаем ТЕКУЩИЙ R0
mov R0,A ;
pop ACC ;Восстанавливаем ACC
reti ;Возврат kuda_nado
А на практике для этого либо специальное "сохранилище" в IRAM надо выделять, либо банки регистров переключать, чтобы не извращаться.
E-mail: info@telesys.ru