Bueno acá va mi aporte creo que es parecido
SETF fin,0 ;carga el valor 0xFF en el registro fin
NOP ;programa
MOVLW .1 ;se carga en Wreg el número de tabla a buscar
call mensaje ;se llama al gestor de tablas
NOP ;continúa el programa
GOTO $-1 ;en este ejemplo es un bucle infinito
mensaje
CLRF contador,0 ;se pone a cero el contador del offset
MULLW .6 ;se multiplica por 6 el valor que trae Wreg
;esto es porque cada CALL ocupa 4 espacios y cada RETURN
;ocupa 2 espacios de memoria en un 18f452
;por lo tanto cada puntero debe saltar de 6 en 6
loop
CALL sel_tabla ;va al selector de tablas
CPFSGT fin,0 ;compara si w = oxff no salta
RETURN ;y retorna al programa principal
CALL caracter ;muestra el caracter en el display en este ejemplo
INCF contador,f,0 ;incrementa el contador de OFFSET
GOTO loop ;vuelve a repetir el proceso
sel_tabla
MOVF PCL,w,0 ;se actualizan los pclat
MOVF PRODL,w,0 ;se carga el offset en wreg
ADDWF PCL,f,0 ;w llega con el número de tabla multiplicado por 6
;y se suma al PCL para dar el salto
CALL Tabla_0 ;va a la tabla seleccionada
RETURN ;regresa de la tabla con el valor a transferir en w
;y retorna al gestor de tablas
CALL Tabla_1
RETURN
CALL Tabla_2
RETURN
CALL Tabla_3
RETURN
CALL Tabla_4
RETURN
CALL Tabla_5
RETURN
CALL Tabla_6
RETURN
CALL Tabla_7
RETURN
Tabla_0
MOVF PCL,w,0
RLNCF cont,w,0 ;se multiplica el valor del offset por dos y se lo almacena en w
;esto se hace ya que cada RETLW ocupa 2 espacios de memoria
;en un 18F452
ADDWF PCL,f,0 ;se suma el contenido de Wreg que vale contador x 2 al PCL
RETLW 'A'
RETLW 'B'
RETLW 'C'
RETLW 'D'
RETLW 'E'
RETLW 'F'
RETLW 'G'
RETLW 'H'
RETLW 'I'
RETLW 'J'
RETLW 0xFF ;retorna con el valor de 0xFF que es el corte del bucle
Tabla_1
MOVF PCL,w,0
RLNCF cont,w,0 ;se multiplica el valor del offset por dos y se lo almacena en w
;esto se hace ya que cada RETLW ocupa 2 espacios de memoria
;en un 18F452
ADDWF PCL,f,0 ;se suma el contenido de Wreg que vale contador x 2 al PCL
RETLW 'A'
RETLW 'B'
RETLW 'C'
RETLW 'D'
RETLW 'E'
RETLW 'F'
RETLW 'G'
RETLW 'H'
RETLW 'I'
RETLW 'J'
RETLW 0xFF ;retorna con el valor de 0xFF que es el corte del bucle
Tabla_2
MOVF PCL,w,0
RLNCF cont,w,0 ;se multiplica el valor del offset por dos y se lo almacena en w
;esto se hace ya que cada RETLW ocupa 2 espacios de memoria
;en un 18F452
ADDWF PCL,f,0 ;se suma el contenido de Wreg que vale contador x 2 al PCL
RETLW 'A'
RETLW 'B'
RETLW 'C'
RETLW 'D'
RETLW 'E'
RETLW 'F'
RETLW 'G'
RETLW 'H'
RETLW 'I'
RETLW 'J'
RETLW 0xFF ;retorna con el valor de 0xFF que es el corte del bucle
Tabla_3
MOVF PCL,w,0
RLNCF cont,w,0 ;se multiplica el valor del offset por dos y se lo almacena en w
;esto se hace ya que cada RETLW ocupa 2 espacios de memoria
;en un 18F452
ADDWF PCL,f,0 ;se suma el contenido de Wreg que vale contador x 2 al PCL
RETLW 'A'
RETLW 'B'
RETLW 'C'
RETLW 'D'
RETLW 'E'
RETLW 'F'
RETLW 'G'
RETLW 'H'
RETLW 'I'
RETLW 'J'
RETLW 0xFF
Tabla_4
MOVF PCL,w,0
RLNCF cont,w,0 ;se multiplica el valor del offset por dos y se lo almacena en w
;esto se hace ya que cada RETLW ocupa 2 espacios de memoria
;en un 18F452
ADDWF PCL,f,0 ;se suma el contenido de Wreg que vale contador x 2 al PCL
RETLW 'A'
RETLW 'B'
RETLW 'C'
RETLW 'D'
RETLW 'E'
RETLW 'F'
RETLW 'G'
RETLW 'H'
RETLW 'I'
RETLW 'J'
RETLW 0xFF
Tabla_5
MOVF PCL,w,0
RLNCF cont,w,0 ;se multiplica el valor del offset por dos y se lo almacena en w
;esto se hace ya que cada RETLW ocupa 2 espacios de memoria
;en un 18F452
ADDWF PCL,f,0 ;se suma el contenido de Wreg que vale contador x 2 al PCL
RETLW 'A'
RETLW 'B'
RETLW 'C'
RETLW 'D'
RETLW 'E'
RETLW 'F'
RETLW 'G'
RETLW 'H'
RETLW 'I'
RETLW 'J'
RETLW 0xFF
Tabla_6
MOVF PCL,w,0
RLNCF cont,w,0 ;se multiplica el valor del offset por dos y se lo almacena en w
;esto se hace ya que cada RETLW ocupa 2 espacios de memoria
;en un 18F452
ADDWF PCL,f,0 ;se suma el contenido de Wreg que vale contador x 2 al PCL
RETLW 'A'
RETLW 'B'
RETLW 'C'
RETLW 'D'
RETLW 'E'
RETLW 'F'
RETLW 'G'
RETLW 'H'
RETLW 'I'
RETLW 'J'
RETLW 0xFF
Tabla_7
MOVF PCL,w,0
RLNCF cont,w,0 ;se multiplica el valor del offset por dos y se lo almacena en w
;esto se hace ya que cada RETLW ocupa 2 espacios de memoria
;en un 18F452
ADDWF PCL,f,0 ;se suma el contenido de Wreg que vale contador x 2 al PCL
RETLW 'A'
RETLW 'B'
RETLW 'C'
RETLW 'D'
RETLW 'E'
RETLW 'F'
RETLW 'G'
RETLW 'H'
RETLW 'I'
RETLW 'J'
RETLW 0xFF
En este me ayudaron Brunof y Maunix, si le encuentran mejoras avisen.
Lo modifico ya que contenía un error, corregido!!