
Сообщение от
shurik-ua
таблица должна быть выровнена на 256 байт
Спасибо, хорошие варианты. В первом из них ошибка - исправляю и считаю такты по твоим вариантам ниже:
Код:
ld h, high table ;7
ld l,a ;4
add a,a ;4
add a,l ;4
ld l, a ;4
jp (hl) ;4
table:
jmp subr1 ;10
jmp subr2
...
Тут получается переход через 37 тактов; дистанция перехода не ограничена. По достоинствам/недостаткам сравнимо с моим вариантом, который 41 такт, но быстрее. Спасибо.

Сообщение от
shurik-ua
ну или так - если оптимизация по скорости и памятью можно жертвовать
Когда требуется размещать таблицу с выравниванием на 256 байт - то экономия памяти в 1 байт на подпрограмму - мелочь. Как же я сам не догадался, что можно команды jp размещать через nop! Это ведь существенно ускоряет вычисление адреса для jp (hl).
Код:
add a,a ;4
add a,a ;4
ld (jt+1),a ;13
jt:
jr jump_tbl ;12
jump_tbl:
jp subr1 ;10
nop
jp subr2
nop
...
Тоже хорошая идея. Исполняется за 43 такта - сравнимо с моим вариантом ld (jt+1),a и jr/jr, который исполняется за 41 такт. Но в твоём варианте зато нет ограничения на дистанцию перехода.

Сообщение от
shurik-ua
jmp кстати выполняется за 10 тактов а не за 12 как jr
Это да, но для jp надо затратить лишние 4 такта на дополнительную команду add a,a. Так что суммарно получается проигрыш в 2 такта. Но годится, если нужно снять ограничения на дистанцию перехода.