Este es un ejemplo de cómo leer una tabla en ROM apuntada con PSV. Creo que por aquí va el asunto.
#if defined(__dsPIC30F__)
#include <p30fxxxx.h>
#elif defined(__dsPIC33F__)
#include <p33Fxxxx.h>
#elif defined(__PIC24F__)
#include <p24Fxxxx.h>
#elif defined(__PIC24H__)
#include <p24Hxxxx.h>
#endif
#include <stdio.h>
const unsigned __attribute__ ((space(psv), address (0x2000)))
table[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int main( void )
{
unsigned psv_shadow;
unsigned sum=0, u;
long addr;
/* enable PSV functionality */
CORCONbits.PSV=1;
/* compute the address of table and print it */
addr = ((long) __builtin_tblpage(table) << 16) +
__builtin_tbloffset( table );
/* print the address of table */
printf ("table[ ] is stored at address 0x%lx\n", addr);
/* save the PSVPAG */
psv_shadow = PSVPAG;
/* set the PSVPAG for accessing table[] */
PSVPAG = __builtin_psvpage ( table );
/* sum the values in table[] */
for (u=0; u<10; u++) {
sum += table[u];
}
/* restore the PSVPAG for the compiler-managed PSVPAG */
PSVPAG = psv_shadow;
/* print the sum */
printf ("sum is %d\n", sum);
while ( 1 );
}