Esto es algo interesante que anda girando por ahi
Cada pagina de memoria de programa tiene 255 posiciones o sea H'FF' en el caso
del 16F84A se tienen cuatro paginas, pues solo tiene 1023 posiciones o sea 1K de
memoria de programa.
Primera pagina H'000' ~ H'0FF'
Segunda pagina H'100' ~ H'1FF'
Tercera pagina H'200' ~ H'2FF'
Cuarta pagina H'300' ~ H'3FF'
Si quieres poner la parte la tabla en la parte alta de la primera pagina, entiendo que
es el comienzo, o sea desde el inicio de la segunda pagina.
Con la directiva ORG le indicas al ensamblador en donde quieres poner el codigo, en el
caso de la tabla seria:
ORG H'100'
Tabla addwf PCL,F
DT literales,..,..,
Si tienes que saber en que dirección estas, eso es facil, solo tienes que leer los
registros PCL y PCLATH el primero es la parte baja del contador de programa
el segundo es la parte alta.
Si tu preocupacion es por un call o goto, no te hagás problemas ya que estos manejan
todo el rango de memoria RAM del 16F84A, en otros pics es diferente y hay que
leer las hojas de datos primero, en donde se complica es cuando lo haces con
mnemonicos que tienen como destino la modificación directa del registro PCL,
como en las tablas con addwf PCL,F en estos casos si tienes que tener en cuenta
y cargar a mano el registro PCLATH, para esto exiten dos directivas al ensamblador:
movlw HIGH Tabla
movwf PCLATH
movf Valor,W ;El registro Valor tiene el valor pasado a la tabla
addwf PCL,F
DT literales,..,..,
La directiva LOW devuelve la parte baja del contador de programa "8 bits"
y la directiva HIGH devuelve la parte alta del contador de programa, o sea
lo que va en el registro PCLATH. También exite la directiva $ que significa el
lugar actual o sea la dirección en donde está el mnemonico, te doy un ejemplo
que utilizo mucho para no poner etiquetas.
btfsc PULSADOR ;¿Se liberó el pulsador?
goto $ - 1 ;No, vuelve desde el lugar actual menos 1 o sea a btfsc PULSADOR
Otro caso podria ser mover la parte alta del lugar actual, esto se haria con:
molw HIGH $
o tambien 2 direcciones más relativo al lugar en donde se está, esto es muy utilizado!!
movlw HIGH $ + 2
También exiten dos directivas mas al ensamblador que trabajan en forma similar
estas son para manejar codigos relocalizables (MPLINK), pero también andan en
codigo absoluto, estas son, Pagesel y Pageselw la primera retoca solo los bits del registro
PCLATH la segunda lo carga completo como con movlw HIGH Tabla, ejemplo :
Pagesel Tabla
o
Pageselw Tabla
Espero les sea util. Saludos!