VAGSuite.EDC15VM_checksum.tdi41_checksum_calculate C# (CSharp) Method

tdi41_checksum_calculate() private method

private tdi41_checksum_calculate ( byte file_buffer, UInt32 chk_start_addr, UInt32 chk_end_addr, UInt16 seed_a, UInt16 seed_b ) : UInt32
file_buffer byte
chk_start_addr System.UInt32
chk_end_addr System.UInt32
seed_a System.UInt16
seed_b System.UInt16
return System.UInt32
        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);
        }