public ChecksumResult tdi41_checksum_search(byte[] file_buffer, UInt32 file_size, bool debug)
{
bool first_pass = true;
UInt32 chk_oldvalue, chk_value, chk_start_addr, chk_end_addr;
//UInt32[] chk_array = new UInt32[7] { 0x000B80, 0x008000, 0x008B80, 0x010000, 0x014000, 0x38B80, 0x40000 };
UInt32[] chk_array = new UInt32[7] { 0x00000, 0x000B80, 0x008000, 0x030000, 0x038000, 0x038B80, 0x40000 };
UInt16 seed_a = 0, seed_b = 0;
chk_found = 0;
chk_fixed = 0;
for (; chk_found < chk_array.Length-1; chk_found++)
{
chk_start_addr = chk_array[chk_found];
chk_end_addr = chk_array[chk_found + 1];
if (!first_pass)
{
seed_a |= 0x8631;
seed_b |= 0xEFCD;
}
chk_oldvalue = ((UInt32)file_buffer[chk_end_addr - 1] << 24)
+ ((UInt32)file_buffer[chk_end_addr - 2] << 16)
+ ((UInt32)file_buffer[chk_end_addr - 3] << 8)
+ (UInt32)file_buffer[chk_end_addr - 4];
chk_value = tdi41_checksum_calculate(file_buffer, chk_start_addr, chk_end_addr - 4, seed_a, seed_b);
Console.WriteLine("chks " + chk_start_addr.ToString("X8") + "-" + chk_end_addr.ToString("X8") + " file: " + chk_oldvalue.ToString("X8") + " calc: " + chk_value.ToString("X8"));
if (chk_oldvalue != chk_value && chk_oldvalue != 0xC3C3C3C3 )
{
file_buffer[chk_end_addr - 4] = Convert.ToByte(chk_value & 0x000000ff);
file_buffer[chk_end_addr - 3] = Convert.ToByte((chk_value >> 8) & 0x000000ff);
file_buffer[chk_end_addr - 2] = Convert.ToByte((chk_value >> 16) & 0x000000ff);
file_buffer[chk_end_addr - 1] = Convert.ToByte((chk_value >> 24) & 0x000000ff);
Console.WriteLine("Checksum at address " + chk_end_addr.ToString("X8") + " failed");
chk_fixed++;
}
first_pass = false;
}
if (chk_fixed == 0) return ChecksumResult.ChecksumOK;
else if (chk_fixed >= 8) return ChecksumResult.ChecksumTypeError;
Console.WriteLine("chkfix: " + chk_fixed.ToString());
return ChecksumResult.ChecksumFail;
}