/* Flash access function must be allocated in RAM */
#pragma MESSAGE DISABLE C1805
#define Page_Erase PGM[21] = 0x40; temp = (( byte (*)( word ))( PGM ))
#define Program_Byte PGM[21] = 0x20; temp = (( byte (*)( word, byte ))( PGM ))
/* Array of opcode instructions of the Erase/Program function in the HCS08 family */
volatile unsigned char PGM[64] =
{
0x87,0xC6,0x18,0x25,0xA5,0x10,0x27,0x08,0xC6,0x18,0x25,0xAA,0x10,0xC7,0x18,0x25,
0x9E,0xE6,0x01,0xF7,0xA6,0x20,0xC7,0x18,0x26,0x45,0x18,0x25,0xF6,0xAA,0x80,0xF7,
0x9D,0x9D,0x9D,0x9D,0x45,0x18,0x25,0xF6,0xF7,0xF6,0xA5,0x30,0x27,0x04,0xA6,0xFF,
0x20,0x07,0xA6,0xFF,0xC7,0x18,0x00,0xC6,0x18,0x25,0xA5,0x40,0x27,0xF4,0x8A,0x81
};
/* The opcode above represents this set of instructions
if ( FSTAT & 0x10 )
{
// Check to see if FACCERR is set
FSTAT = FSTAT | 0x10; // write a 1 to FACCERR to clear
}
(*((volatile unsigned char *)(Address))) = data; //write to somewhere in flash
FSTAT = FSTAT | 0x80; //Put FCBEF at 1.
_asm NOP; //Wait 4 cycles
_asm NOP;
_asm NOP;
_asm NOP;
if ( FSTAT & 0x30 )
{
//check to see if FACCERR or FVIOL are set
return 0xFF; //if so, error.
}
while (( FSTAT & 0x40 )== 0 )
{
// Kick the dog
_asm LDA 0xFF
_asm STA 0x1800
}
*/
bool FlashErase( word Dest )
{
byte temp;
bool Result = TRUE;
/* In this routine is not allowed access to flash */
Cpu_DisableInt();
temp = Page_Erase( Dest );
if ( temp == 0xFF )
{
/* Signal Error */
Result = FALSE;
}
Cpu_EnableInt();
/* Signal Ok */
return( Result );
}
/*-----------------------------------------------------------------------------
** Function Name : FlashWrite
** Description : Write a block of data in internal Flash
** Input : Address, Source and length
** Output : Result of operations
** Notes :
-----------------------------------------------------------------------------*/
byte FlashWrite( word Address, byte *Source, byte Len )
{
byte Index, temp;
bool Result = TRUE;
/* In this routine is not allowed access to flash */
Cpu_DisableInt();
for ( Index = 0; Index < Len; Index ++ )
{
temp = Program_Byte( Address + Index, ( byte ) *( Source + Index ));
/* Execute Program routine */
if ( temp == 0xFF )
{
/* Signal Error */
Result = FALSE;
break;
}
}
Cpu_EnableInt();
/* Signal Ok */
return( Result );
}