/******************************************************************************
*									      *
*  256-BIT SUBTRACT							      *
*  03/28/10 (dkc)							      *
*									      *
******************************************************************************/
unsigned int carry(unsigned int a, unsigned int b, unsigned int sum);
void sub256(unsigned int *a, unsigned int *b) {
unsigned int a0,a1,a2,a3,a4,a5,a6,a7,b0,b1,b2,b3,b4,b5,b6,b7;
unsigned int s0,s1,s2,s3,s4,s5,s6,s7,temp,c,c1,c2,c3,c4,c5,c6,c7;
a0=*a;
a1=*(a+1);
a2=*(a+2);
a3=*(a+3);
a4=*(a+4);
a5=*(a+5);
a6=*(a+6);
a7=*(a+7);
b0=*b;
b1=*(b+1);
b2=*(b+2);
b3=*(b+3);
b4=*(b+4);
b5=*(b+5);
b6=*(b+6);
b7=*(b+7);

b0=~b0;
b1=~b1;
b2=~b2;
b3=~b3;
b4=~b4;
b5=~b5;
b6=~b6;
b7=~b7;

temp=b7+1;
c=carry(b7,1,temp);
b7=temp;
temp=b6+c;
c=carry(b6,c,temp);
b6=temp;
temp=b5+c;
c=carry(b5,c,temp);
b5=temp;
temp=b4+c;
c=carry(b4,c,temp);
b4=temp;
temp=b3+c;
c=carry(b3,c,temp);
b3=temp;
temp=b2+c;
c=carry(b2,c,temp);
b2=temp;
temp=b1+c;
c=carry(b1,c,temp);
b1=temp;
b0=b0+c;

s7=a7+b7;
c7=carry(a7,b7,s7);
s6=a6+b6;
c6=carry(a6,b6,s6);
s5=a5+b5;
c5=carry(a5,b5,s5);
s4=a4+b4;
c4=carry(a4,b4,s4);
s3=a3+b3;
c3=carry(a3,b3,s3);
s2=a2+b2;
c2=carry(a2,b2,s2);
s1=a1+b1;
c1=carry(a1,b1,s1);
s0=a0+b0;

temp=s6+c7;
c6+=carry(s6,c7,temp);
s6=temp;

temp=s5+c6;
c5+=carry(s5,c6,temp);
s5=temp;

temp=s4+c5;
c4+=carry(s4,c5,temp);
s4=temp;

temp=s3+c4;
c3+=carry(s3,c4,temp);
s3=temp;

temp=s2+c3;
c2+=carry(s2,c3,temp);
s2=temp;

temp=s1+c2;
c1+=carry(s1,c2,temp);
s1=temp;

s0=s0+c1;

*b=s0;
*(b+1)=s1;
*(b+2)=s2;
*(b+3)=s3;
*(b+4)=s4;
*(b+5)=s5;
*(b+6)=s6;
*(b+7)=s7;
return;
}