uint16_t checksum()
{
reg16 a, d;
int i1;
uint8_t c1;
d.w.x=0xffff;
a.b.h=0x00;
for (i1=0x10; i1<0x32; i1++)
{
//get cmos byte
a.b.l = read_cmos(i1);
//xor dh,al
d.b.h ^= a.b.l;
//mov al,dh
a.b.l = d.b.h;
//rol ax,c1
a.w.x = a.w.x << 4;
//xor dx,ax
d.w.x ^= a.w.x;
//rol ax,1
a.w.x = a.w.x << 1;
//xchg dh,dl
c1 = d.b.h;
d.b.h = d.b.l;
d.b.l = c1;
//xor dx,ax
d.w.x ^= a.w.x;
//ror ax,c1
a.w.x = a.w.x >> 4;
//and al,e0
a.b.l &= 0xe0;
//xor dx,ax
d.w.x ^= a.w.x;
//ror ax,1
a.w.x = a.w.x >> 1;
//xor dh,al
d.b.h^=a.b.l;
}
return d.w.x;
}