
void encipher(unsigned long *v,unsigned long *w, 
const unsigned long * const k);
void decipher(unsigned long *v,unsigned long *w, 
unsigned long * k);
    
unsigned long v = 0x12345678;
unsigned long w = 0;
unsigned long k = 0x7364e829 ; 
//unsigned long x = 0;
void Main(void)
{
  unsigned long v = 0x12345678;
  //unsigned long x = 0;
//  printf ("%xn", v);

  encipher(&v, &w, &k);  // (0x12345678) 
  decipher(&w, &w, &k);  // (0x12345678)   
//  printf ("%xn", x);
  while (1)
  {
   PCON |= 0x00;
  }
}
  
void encipher(unsigned long *v,unsigned long *w, 
const unsigned long * const k)
{ 
   register unsigned long       y=v[0],z=v[1],sum=0,delta=0x9E3779B9, 
    a=k[0],b=k[1],c=k[2],d=k[3],n=32; 
   while(n-->0) 
      { 
      sum += delta; 
      y += (z << 4)+a ^ z+sum ^ (z >> 5)+b; 
      z += (y << 4)+c ^ y+sum ^ (y >> 5)+d; 
      } 

   w[0]=y; w[1]=z; 
} 
  
void decipher(unsigned long *v,unsigned long *w, 
unsigned long * k)
{ 
   register unsigned long       y=v[0],z=v[1],sum=0xC6EF3720, 
    delta=0x9E3779B9,a=k[0],b=k[1], 
    c=k[2],d=k[3],n=32; 
   /* sum = delta<<5, in general sum = delta * n */ 

   while(n-->0) 
      { 
      z -= (y << 4)+c ^ y+sum ^ (y >> 5)+d; 
      y -= (z << 4)+a ^ z+sum ^ (z >> 5)+b; 
      sum -= delta; 
      } 
    
   w[0]=y; w[1]=z; 
}
