Segun lo que te entendi te envio esto...
Yo luego de eso hice una funcion que recorre la flash..
Esta la estructura de la Memoria
SECTIONS
RAM = READ_WRITE 0x1000 TO 0x3FFF;
/* unbanked FLASH ROM */
MY_PROG = READ_ONLY 0x5000 TO 0x7FFF;
ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY 0xC000 TO 0xFEFF;
/* banked FLASH ROM */
TABLA = READ_ONLY 0x308000 TO 0x30BFFF;
TABLA1 = READ_ONLY 0x318000 TO 0x31BFFF;
PAGE_30 = READ_ONLY 0x308000 TO 0x30BFFF;
PAGE_31 = READ_ONLY 0x318000 TO 0x31BFFF;
PAGE_32 = READ_ONLY 0x328000 TO 0x32BFFF;
PAGE_33 = READ_ONLY 0x338000 TO 0x33BFFF;
PAGE_34 = READ_ONLY 0x348000 TO 0x34BFFF;
PAGE_35 = READ_ONLY 0x358000 TO 0x35BFFF;
PAGE_36 = READ_ONLY 0x368000 TO 0x36BFFF;
PAGE_37 = READ_ONLY 0x378000 TO 0x37BFFF;
PAGE_38 = READ_ONLY 0x388000 TO 0x38BFFF;
PAGE_39 = READ_ONLY 0x398000 TO 0x39BFFF;
PAGE_3A = READ_ONLY 0x3A8000 TO 0x3ABFFF;
PAGE_3B = READ_ONLY 0x3B8000 TO 0x3BBFFF;
PAGE_3C = READ_ONLY 0x3C8000 TO 0x3CBFFF;
PAGE_3D = READ_ONLY 0x3D8000 TO 0x3DBFFF;
/* PAGE_3E = READ_ONLY 0x3E8000 TO 0x3EBFFF; not used: equivalent to ROM_4000 */
/* PAGE_3F = READ_ONLY 0x3F8000 TO 0x3FBFFF; not used: equivalent to ROM_C000 */
END
PLACEMENT
_PRESTART, STARTUP,
ROM_VAR, STRINGS,
VIRTUAL_TABLE_SEGMENT,
NON_BANKED, COPY INTO ROM_C000, ROM_4000;
DEFAULT_ROM INTO PAGE_30,PAGE_31,PAGE_32,PAGE_33,PAGE _ 34,PAGE_35,PAGE_36,PAGE_37,
PAGE_38,PAGE_39,PAGE_3A,PAGE_3B,PAGE_ 3C,PAGE_3D;
MY_TABLE INTO TABLA;
MY_TABLE1 INTO TABLA1;
MY_ROM INTO MY_PROG;
DEFAULT_RAM INTO RAM;
END
Esta es la funcion que graba en la flash..
/////////////////////////////////////////////////////////////////////
//
// Rutina de escritura en FLASH
//
// Nota1: como programo en zona paged, no es necesario desabilitar
// las interrupciones. Igual las desabilito.
//
// Nota2: se debe configurar los registros PPAGE y FCNFG (BKSEL) de
// acuerdo a la pagina donde almacene la informacion
//
/////////////////////////////////////////////////////////////////////
U8 ProgFlash( U16* progAdr, U16* bufferPtr, U16 size,U8 Page)
{
U8 CCRCopy;
U8 Fcnfg,Ppage;
Fcnfg = FCNFG;
Ppage = PPAGE;
if(((U16) progAdr & ALIGNED_WORD_MASK)!=0) // check por aligned word
return(FAIL);
// enmascaro las interrupciones cuando programo en paginas 3E y 3F
asm
{
TFR CCR,A
STAA CCRCopy ;store CCR
ORCC #$10 ;mask interrupts
};
// limpio flags de error
FCNFG = 3;
FSTAT_PVIOL = 1;
FSTAT_ACCERR = 1;
FCNFG = 2;
FSTAT_PVIOL = 1;
FSTAT_ACCERR = 1;
FCNFG = 1;
FSTAT_PVIOL = 1;
FSTAT_ACCERR = 1;
FCNFG = 0;
FSTAT_PVIOL = 1;
FSTAT_ACCERR = 1;
FCNFG_BKSEL0 = 1; // selecciono...
FCNFG_BKSEL1 = 1; // banco 3.
PPAGE = Page; // pagina 30 (banco 3)
while(size !=0)
{
// buffer de comandos vacio?
if(FSTAT_CBEIF ==1)
{
*progAdr++ = *bufferPtr++;
// ejecuto el comando
FCMD = COMM_PROG;
FSTAT = COMM_CBEIF;
// veo si hubo algun error
if((FSTAT_ACCERR) || (FSTAT_PVIOL))
{
// desenmascaro las interrupciones
asm
{
LDAA CCRCopy
TFR A,CCR ;restore CCR
};
PPAGE = Ppage;
FCNFG = Fcnfg;
return(FAIL);
};
size--;
};
};
while(FSTAT_CCIF !=1);
asm
{
LDAA CCRCopy
TFR A,CCR ;restore CCR
};
PPAGE = Ppage;
FCNFG = Fcnfg;
return(PASS);
}