МММ...
Поговорим о "среднемладших"... Исходим из следующего:
В большинстве случаев таблица нужна для быстрого преобазования данных и редко превышает 256 байт.
Общий объём памяти программ превышает 1 страницу...
Возможна работа активных аппаратных перрываний...
Поскольку при вызове подпрограммы преобразования по CALL TABLE содержимое PCLATH.4:PCLATH.3 уже автоматически сбрасывается в PCH, то загрузка старшего байта адреса указателя таблицы должна быть выполнена перед вызовом CALL TABLE, а не в самом теле обработчика.
Для удобства работы начальную точку желательно размещать на границе областей (0x0000/0xNN00).
Следует учесть, что ADDWF PCL,1 при W=0xFF даст "бесконечный цикл"...

(если не учитывать перенос в старший разряд при "примитиве" минимальной реализации алгоритма обращения к PCL)
Таким образом вводится еще одно ограничение на входные параметры при вызове обработчика.
В обработчике прерываний обязательным пунктом будет хранение в программном блоке временных регистров содержимого PCLATH и его последующее восстановление по завершению обработчика прерываний.
Пример с дополнительной предобработкой содержимого PCLATH в теле обработчика необходим лишь в случае произвольной точки вхождения в обработчик таблиц в любой точке адресного пространства памяти программ.
В большинстве практических применений достаточно предварительное указание старшего байта адреса таблицы, не забывая при том, что исходное (до CALL TABLE) содержимое PCLATH после выполнения RETLW X будет искажено (если не добавить еще один промежуточный регистр временного хранения).
Кстати PIC16F630 такие страсти-ужасти практически не угрожают - диапазон адресов не затрагивает PCLATH.4:PCLATH.3 (0x000-0x3FF) да еще при весьма "льготном" режиме доступа ко второму банку РПД.
Единственно надо следить за PCLATH.2:PCLATH.1:PCLATH.0, но и это не обязательно, если таблица на границе 256 байтовой области, либо значение в W не превышает 127.
Т.е. для 630-го это будет:
REG EQU 0x20
;==========
ORG 0
CALL TABLE
NOP
;=================
ORG 220H ; РАСПОЛОЖЕНИЕ В ЛЮБОм
; месте памяти программ при разрешенном
; диапазоне значений в W от 0 до 127 (0x00-0x7F)
TABLE
ADDWF PCL,F ;
TABL RETLW B'11000000' ;
RETLW B'10011111' ;
; ...
END
Если же необходимо использовать страничный механизм, то прийдется сделать такое:
movlw high TABLE
movwf PCLATH
CALL TABLE
_______
TABLE
movlw low TABLE
addwf reg,w
btfsc STATUS,C
incf PCLATH,f
movwf PCL
ну и далее кучка retlw
а вот как насчет 0xFF в REG... и дополнительного хранения/восстановления PCLATH - кому надобно - додумывайте.
