#pragma CODE_SECTION(bootloader, "copysections");
extern void c_int00();
// Prototype statements for functions found within this file.
interrupt void eva_timer1_isr(void);
void init_eva_timer1(void);

//extern unsigned int   cinit_loadstart; 
extern unsigned int   cinit_runstart; 
//extern unsigned int   cinit_size;

//extern unsigned int	const_loadstart; 
extern unsigned int	const_runstart; 
//extern unsigned int	const_size;

//extern unsigned int	econst_loadstart;
extern unsigned int	econst_runstart; 
//extern unsigned int	econst_size;

//extern unsigned int	pinit_loadstart; 
extern unsigned int	pinit_runstart; 
//extern unsigned int	pinit_size;

//extern unsigned int	switch_loadstart; 
extern unsigned int	switch_runstart; 
//extern unsigned int	switch_size;

//extern unsigned int	text_loadstart; 
extern unsigned int	text_runstart; 
//extern unsigned int	text_size;

//extern unsigned int	IQmath_loadstart; 
extern unsigned int	IQmath_runstart; 
//extern unsigned int	IQmath_size;

//extern unsigned int	Flash28_API_LoadStart;
 
//extern unsigned int	Flash28_API_size;
extern unsigned int	RamfuncsRunStart;

//extern unsigned int   cinit_loadend;
//extern unsigned int   const_loadend;
/* extern unsigned int   pinit_loadend;     */
/* extern unsigned int   econst_loadend;    */
/* extern unsigned int   switch_loadend;    */
/* extern unsigned int   text_loadend;      */
/* extern unsigned int   IQmath_loadend;    */
/* extern unsigned int   FlashfuncsLoadEnd; */


#define LoadADDRStartA_cinit_loadstart   0x003df77c  //1 
#define LoadADDRStartA_const_loadstart   0x003f8000
#define LoadADDRStartA_econst_loadstart  0x003e0da8
#define LoadADDRStartA_pinit_loadstart   0x003f8000
#define LoadADDRStartA_switch_loadstart  0x003f8000
#define LoadADDRStartA_text_loadstart    0x003dc000

#define LoadADDRStartA_IQmath_loadstart    0x003e089f
#define LoadADDRStartA_ramfuncs_loadstart    0x003e0cf2

#define LoadADDRStartB_cinit_loadstart   0x003e777c //2
#define LoadADDRStartB_const_loadstart   0x003f8000
#define LoadADDRStartB_econst_loadstart  0x003e8da8
#define LoadADDRStartB_pinit_loadstart   0x003f8000
#define LoadADDRStartB_switch_loadstart  0x003f8000
#define LoadADDRStartB_text_loadstart    0x003e4000

#define LoadADDRStartB_IQmath_loadstart    0x003e889f
#define LoadADDRStartB_ramfuncs_loadstart    0x003e8cf2

#define LoadADDRStartC_cinit_loadstart   0x003ef77c //3
#define LoadADDRStartC_const_loadstart   0x003f8000
#define LoadADDRStartC_econst_loadstart  0x003f0da8
#define LoadADDRStartC_pinit_loadstart   0x003f8000
#define LoadADDRStartC_switch_loadstart  0x003f8000
#define LoadADDRStartC_text_loadstart    0x003ec000

#define LoadADDRStartC_IQmath_loadstart    0x003f089f
#define LoadADDRStartC_ramfuncs_loadstart    0x003f0cf2

#define LoadADDR_cinit_length   0x0bd2
#define LoadADDR_const_length   0
#define LoadADDR_econst_length   0x046
#define LoadADDR_pinit_length   0
#define LoadADDR_switch_length   0
#define LoadADDR_text_length   0x1cf7

#define LoadADDR_IQmath_length   0x2c7
#define LoadADDR_ramfuncs_length   0xb5

void bootloader(void)
{

  unsigned int *SourceAddr;
  unsigned int *DestAddr;
  unsigned int *SourceAddrB;//=(unsigned int *)LoadADDRStartB;
  unsigned int *SourceAddrC;//=(unsigned int *)LoadADDRStartC;
  unsigned int tmp=0;



	tmp = (unsigned int)LoadADDR_text_length;
//  tmp =(unsigned int)text_size;
   DestAddr=&text_runstart;
//   SourceEndAddr=&text_loadstart+&text_size;
//   SourceEndAddr=&text_loadend;
  SourceAddr=(unsigned int *)LoadADDRStartA_text_loadstart;
   SourceAddrB =(unsigned int *)LoadADDRStartB_text_loadstart;
   SourceAddrC =(unsigned int *)LoadADDRStartC_text_loadstart;
  /*   SourceAddr=&text_loadstart;
 	SourceAddrB =(unsigned int *)(&text_loadstart+LoadADDR_text_offsetB);
   SourceAddrC =(unsigned int *)(&text_loadstart+LoadADDR_text_offsetC); */
   //while(SourceAddr < SourceEndAddr)
    while(tmp)
    { 
	 // *DestAddr++ = (*SourceAddr++);
	   *DestAddr++ = ((*SourceAddr)&(*SourceAddrB))|((*SourceAddr)&(*SourceAddrC))|((*SourceAddrB)&(*SourceAddrC));
       SourceAddr++;
	   SourceAddrB++;
       SourceAddrC++;
	   tmp--;
    }

   tmp = (unsigned int)LoadADDR_cinit_length;
  // SourceAddr=&cinit_loadstart;
   DestAddr=&cinit_runstart;
//   SourceEndAddr=&cinit_loadstart+&cinit_size;
//   SourceEndAddr=&cinit_loadend;
   SourceAddr=(unsigned int *)LoadADDRStartA_cinit_loadstart;
   SourceAddrB =(unsigned int *)LoadADDRStartB_cinit_loadstart;
   SourceAddrC =(unsigned int *)LoadADDRStartC_cinit_loadstart;
//   SourceAddrB =(unsigned int *)(&cinit_loadstart+LoadADDR_cinit_offsetB);
//   SourceAddrC =(unsigned int *)(&cinit_loadstart+LoadADDR_cinit_offsetC);
   //while(SourceAddr < SourceEndAddr)
    while(tmp)
    { 
     // *DestAddr++ = (*SourceAddr++);
       *DestAddr++ = ((*SourceAddr)&(*SourceAddrB))|((*SourceAddr)&(*SourceAddrC))|((*SourceAddrB)&(*SourceAddrC));
       SourceAddr++;
	   SourceAddrB++;
       SourceAddrC++;
	   tmp--;
    }

   tmp =(unsigned int) LoadADDR_const_length;  
   DestAddr=&const_runstart;
   SourceAddr=(unsigned int *)LoadADDRStartA_const_loadstart;
   SourceAddrB =(unsigned int *)LoadADDRStartB_const_loadstart;
   SourceAddrC =(unsigned int *)LoadADDRStartC_const_loadstart;
    while(tmp)
    { 
     // *DestAddr++ = (*SourceAddr++);
	  *DestAddr++ = ((*SourceAddr)&(*SourceAddrB))|((*SourceAddr)&(*SourceAddrC))|((*SourceAddrB)&(*SourceAddrC));
       SourceAddr++;
	   SourceAddrB++;
       SourceAddrC++;
	   tmp--;
    }

   tmp = (unsigned int)LoadADDR_econst_length;
   DestAddr=&econst_runstart;
   SourceAddr=(unsigned int *)LoadADDRStartA_econst_loadstart;
   SourceAddrB =(unsigned int *)LoadADDRStartB_econst_loadstart;
   SourceAddrC =(unsigned int *)LoadADDRStartC_econst_loadstart;
    while(tmp)
    { 
     //  *DestAddr++ = (*SourceAddr++);
       *DestAddr++ = ((*SourceAddr)&(*SourceAddrB))|((*SourceAddr)&(*SourceAddrC))|((*SourceAddrB)&(*SourceAddrC));
       SourceAddr++;
	   SourceAddrB++;
       SourceAddrC++;
	   tmp--;
    }

   tmp = (unsigned int)LoadADDR_pinit_length;
   DestAddr=&pinit_runstart;
   SourceAddr=(unsigned int *)LoadADDRStartA_pinit_loadstart;
   SourceAddrB =(unsigned int *)LoadADDRStartB_pinit_loadstart;
   SourceAddrC =(unsigned int *)LoadADDRStartC_pinit_loadstart;
    while(tmp)
    { 
    //  *DestAddr++ = (*SourceAddr++);
	  *DestAddr++ = ((*SourceAddr)&(*SourceAddrB))|((*SourceAddr)&(*SourceAddrC))|((*SourceAddrB)&(*SourceAddrC));
       SourceAddr++;
	   SourceAddrB++;
       SourceAddrC++;
	   tmp--;
    }

   tmp = (unsigned int)LoadADDR_switch_length;
   DestAddr=&switch_runstart;
   SourceAddr=(unsigned int *)LoadADDRStartA_switch_loadstart;
   SourceAddrB =(unsigned int *)LoadADDRStartB_switch_loadstart;
   SourceAddrC =(unsigned int *)LoadADDRStartC_switch_loadstart;

    while(tmp)
    { 
     //  *DestAddr++ = (*SourceAddr++);
	   *DestAddr++ = ((*SourceAddr)&(*SourceAddrB))|((*SourceAddr)&(*SourceAddrC))|((*SourceAddrB)&(*SourceAddrC));
       SourceAddr++;
	   SourceAddrB++;
       SourceAddrC++;
	   tmp--;
    }
  
	tmp = (unsigned int)LoadADDR_IQmath_length;
   DestAddr=&IQmath_runstart;
   SourceAddr=(unsigned int *)LoadADDRStartA_IQmath_loadstart;
   SourceAddrB =(unsigned int *)LoadADDRStartB_IQmath_loadstart;
   SourceAddrC =(unsigned int *)LoadADDRStartC_IQmath_loadstart;
    while(tmp)
    { 
//	 *DestAddr++ = (*SourceAddr++);

      *DestAddr++ = ((*SourceAddr)&(*SourceAddrB))|((*SourceAddr)&(*SourceAddrC))|((*SourceAddrB)&(*SourceAddrC));
       SourceAddr++;
	   SourceAddrB++;
       SourceAddrC++;
	   tmp--;
    }


	

	tmp = (unsigned int)LoadADDR_ramfuncs_length;
   DestAddr=&(RamfuncsRunStart);
   SourceAddr=(unsigned int *)LoadADDRStartA_ramfuncs_loadstart;
   SourceAddrB =(unsigned int *)LoadADDRStartB_ramfuncs_loadstart;
   SourceAddrC =(unsigned int *)LoadADDRStartC_ramfuncs_loadstart;
    while(tmp)
    { 
//	 *DestAddr++ = (*SourceAddr++);

      *DestAddr++ = ((*SourceAddr)&(*SourceAddrB))|((*SourceAddr)&(*SourceAddrC))|((*SourceAddrB)&(*SourceAddrC));
       SourceAddr++;
	   SourceAddrB++;
       SourceAddrC++;
	   tmp--;
    }

  c_int00();

}
