Код: Выделить всё
;----------
HANDLERS:
.dw PRG0, PRG1, PRG2, PRG3 ;Массив с метками вызываемых п\программ
;----------
.............
.........
ldi temp0, 0x01 ;задаём значение регистра от 0 до 3
rcall HANDLER
.............
.........
;----------
HANDLER:
ldi ZL, Low(HANDLERS*2) ;Инициализация массива с метками
ldi ZH, High(HANDLERS*2)
lsl temp0 ;так как память 2хбайтная надо сдвинуть в лево управляющий регистр
clr temp1
add ZL, temp0 ;складываем содержимое управляюшего р-ра с парой Z
adc ZH, temp1
lpm dx2, Z ;Грузим младший байт метки из массива
inc ZL ;Можно выкинуть если перед ней использовать "lpm dx2, Z+"
lpm dx3, Z ;Грузим старший байт метки из массива
mov ZL, dx2 ;переносим их в пару Z
mov ZH, dx3
icall ;Вызываем п\программу (в данном случае 0x01 = PRG1, 0x00 = PRG0...)
ret ;по окончанию выходим
;---------- Тут сами п\программы
PRG0:
ret
;----------
PRG1:
ret
;----------
PRG2:
ret
;----------
PRG3:
ret
;----------
Так мы вызываем нужную подпрограмму в
зависимости от содержимого в регистре temp0.
Я его уже выкладывал тут.