[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
В Вашем ответе хоть и существенное, но только одно разъяснение, к сожалению. В таком случае, Вам должно высвободить Z-пару под косвенный переход аки BLACKEAGLE.
Касаемо держать "вектор" в регистрах следующие мысли вслух. По подкорректированному BLACKEAGLE абсолютно законная альтернатива IJMP_address:
ldi r16,low(address)
ldi r17,high(address)
push r16
push r17
ret
последние три (!) во времени идентичны нижеследующему:
mov tempL,ZL ;при входе
mov tempH,ZH ;___
mov ZL,r16
mov ZH,r17
ijmp
mov ZL,tempL ;___
mov ZH,tempH ;при возврате
Кажется, что просто зря задействавано лишних два регистра и больше памяти программ. Однако, вспомним, что у нас 2313. И если пара Z не используется для LPM (там, где прерываемся, конечно), то так работать с ZH не требуется. Он может хранить high(address) завсегда. Это никак не мешает обращению к памяти данных (мало её). А именно:
ldi r16,low(address) ;переключение фазы
ldi ZH,high(address)
+
mov tempL,ZL ;при входе
mov ZL,r16
ijmp ;2_clocks
mov ZL,tempL ;при возврате
Замечу, что ldi_ZH,high(address) можно сделать единожды, когда все начала обработчиков фаз лежат в выравненном 256-командном блоке.
Подобно можно играться со стеком (SPL). Предварительно разложим в памяти пять AddressPhase. Тогда:
ldi r16,address_pointer ;переключение фазы
+
mov tempL,SPL ;при входе
mov SPL,r16
ret ;4_clocks
mov SPL,tempL ;при возврате
или застолбив слово в памяти данных и единожды указав на него ldi_r16,address_pointer менять в ОЗУ вектор перехода. Помните, что регистры доступны как память, т.е. SPL < 0x20 указывает на регистровый блок.
Надеюсь - я не ошибся и Вы раскопаете здесь нечто полезное для себя...
E-mail: info@telesys.ru