UInt32 tdi41_checksum_calculate(byte[] file_buffer, UInt32 chk_start_addr, UInt32 chk_end_addr, UInt16 seed_a, UInt16 seed_b)
{
UInt16 var_1;
byte var_2;
do
{
var_2 = 0;
seed_a ^= Convert.ToUInt16((((UInt16)file_buffer[chk_start_addr + 1] << 8) + (UInt16)file_buffer[chk_start_addr]));
chk_start_addr += 2;
if ((seed_b & 0xF) > 0)
{
var_1 = Convert.ToUInt16(seed_a >> (16 - (seed_b & 0xF)));
seed_a <<= (seed_b & 0xF);
seed_a |= var_1;
var_2 = Convert.ToByte(seed_a & 1);
}
seed_b -= Convert.ToUInt16((((UInt16)file_buffer[chk_start_addr + 1] << 8) + (UInt16)file_buffer[chk_start_addr]));
seed_b -= var_2;
chk_start_addr += 2;
seed_b ^= seed_a;
if (chk_start_addr == chk_end_addr)
break;
seed_a -= Convert.ToUInt16((((UInt16)file_buffer[chk_start_addr + 1] << 8) + (UInt16)file_buffer[chk_start_addr]));
chk_start_addr += 2;
seed_a += 0xDAAC;
seed_b ^= Convert.ToUInt16((((UInt16)file_buffer[chk_start_addr + 1] << 8) + (UInt16)file_buffer[chk_start_addr]));
chk_start_addr += 2;
if ((seed_a & 0xF) > 0)
{
var_1 = Convert.ToUInt16((seed_b << (16 - (seed_a & 0xF))) & 0xffff);
seed_b >>= (seed_a & 0xF);
seed_b |= var_1;
}
}
while (chk_start_addr != chk_end_addr);
seed_a -= 0x8631;
seed_a += 0xDAAC;
seed_b ^= 0xDF9B;
return (((UInt32)seed_b << 16) + seed_a);
}