Цитата(balk @ Aug 15 2018, 10:42)

добавил команду MOVF PCL и увидел в PCLATH реальный сегмент адреса
Фигня какая-то.
В том-то весь и фокус, что операции с програмным счётчиком никак не влияют на содержимое регистра PCLATH.
Что туда запишите, то там и будет находиться до следующей перезаписи.
Реальный сегмент находится в PCH.
Цитата(balk @ Aug 15 2018, 10:42)

подпрограммы, которая размещается в произвольном месте
Если в произвольном, то надо делать пару десятков строк дополнительного кода.
В двух словах так:
Сперва пишите в PCLATH старшую половину адреса метки начала таблицы переходов.
Затем производите сложение PCL с переменной перехода, но с результатом в аккумулятор.
Если поднят флаг переноса, инкрементируете PCLATH.
Опять производите сложение с PCL, но уже результат в регистр.
Если необходимо сократить код и/или повысить быстродействие (т.е. сократить количество команд), есть вариант размещать таблицу переходов строго в пределах 256-строчного сегмента адресов (чтобы при сложении PCL гарантировано не было переполнения).