UInt32 tdi41_2002_checksum_calculate(byte[] file_buffer, UInt32 chk_start_addr, UInt32 chk_end_addr, UInt16 seed_a, UInt16 seed_b, UInt16 seed_c, UInt16 seed_d, bool first_pass)
{
UInt32 count = chk_start_addr / 2;
UInt32 end_count = chk_end_addr / 2;
UInt32 buffer_addr = chk_start_addr;
UInt32 checksum, var_6, var_7 = 0;
UInt16 var_1 = 0, var_2 = 0, var_3, var_4, var_5;
if (count != end_count)
{
var_1 = seed_a;
var_2 = seed_b;
if (chk_start_addr == 0x8000)
{
var_1 = Convert.ToUInt16(var_1 ^ 0xD565);
var_2 += 0x308a;
}
do
{
var_1 ^= Convert.ToUInt16(((UInt16)file_buffer[buffer_addr + 1] << 8) + (UInt16)file_buffer[buffer_addr]);
var_3 = Convert.ToUInt16(var_2 & 0xf);
++count;
buffer_addr += 2;
var_4 = 0;
if ((var_2 & 0xf) > 0)
{
do
{
var_4 = (UInt16)(var_1 >> 15);
var_1 = (UInt16)(((var_1 * 2) + var_4));
--var_3;
} while (var_3 > 0);
}
var_2 -= (UInt16)((var_4 + ((UInt16)file_buffer[buffer_addr + 1] << 8) + (UInt16)file_buffer[buffer_addr]));
var_2 = (UInt16)(var_1 ^ var_2);
buffer_addr += 2;
++count;
if (count > end_count)
break;
var_5 = (UInt16)(((UInt16)file_buffer[buffer_addr + 1] << 8) + (UInt16)file_buffer[buffer_addr]);
buffer_addr += 4;
var_1 += (UInt16)((0xffff - var_5 + 0xdaad));
var_6 = (UInt32)((UInt16)file_buffer[buffer_addr - 1] << 8);
var_2 ^= (UInt16)((UInt16)var_6 + (UInt16)file_buffer[buffer_addr - 2]);
var_4 = (UInt16)(var_1 & 0xf);
count += 2;
if ((var_1 & 0xf) > 0)
{
do
{
var_6 = (var_6 | 0xffff) & var_2;
var_6 <<= 15;
var_2 = (UInt16)(((var_2 >> 1) + var_6));
--var_4;
} while (var_4 > 0);
}
} while (count <= end_count);
}
if (chk_start_addr == 0)
{
var_1 -= 0x79cf;
var_2 -= 0x1033;
}
if (!first_pass)
{
var_5 = seed_d;
var_1 -= seed_c;
var_6 = (UInt16)((seed_c | 0xffff) & 0xdaad);
var_1 += (UInt16)(var_6 - 1);
var_7 = var_7 & 0xffff;
for (count = (UInt32)(seed_c & 0xf); count > 0; var_5 = (UInt16)((((UInt32)var_5 >> 15) + var_7)))
{
--count;
var_7 = (var_7 | 0xffff) & var_5;
var_7 *= 2;
}
checksum = (UInt32)(((UInt32)var_1 + (((UInt32)var_5 ^ (UInt32)var_2) << 16)));
}
else
{
checksum = (UInt32)(((UInt32)var_1 + ((UInt32)var_2 << 16)));
}
return (checksum);
}