private ChecksumResult tdi41_checksum_search_1024kb(byte[] file_buffer, UInt32 file_size, bool debug)
{
bool first_pass = false;
UInt32 chk_oldvalue, chk_value, chk_start_addr, chk_end_addr;
UInt32[] chk_array = new UInt32[34] {
0x4000,
0x4B80, // << IGNORE
0x10000,
0x14000,
0x14B80,
0x20000,
0x24000,
0x24B80,
0x30000,
0x34000,//10
0x34B80,
0x40000,
0x44000,
0x44B80,
0x50000,
0x54000,
0x54B80,
0x60000,
0x64000,
0x64B80,//20
0x70000,
0x74000,
0x74B80,
0x94000, //<< IGNORE
0xCC000,
0xD0000,
0xD0B80,
0xDC000,
0xE0000,
0xE0B80,
0xEC000,
0xF0000,
0xF0B80,
0xFC000
};
UInt16 seed_a = 0, seed_b = 0;
chk_found = 0;
chk_fixed = 0;
chk_match = 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];
//DumpChecksum("chks " + chk_start_addr.ToString("X8") + "-" + chk_end_addr.ToString("X8"), file_buffer, debug);
if (!first_pass)
{
seed_a |= 0x8631;
seed_b |= 0xEFCD;
}
//if (CheckEmpty(file_buffer, chk_start_addr, chk_end_addr)) continue;
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);
if (chk_oldvalue != chk_value && chk_oldvalue != 0xC3C3C3C3 && chk_end_addr != 0x94000)
{
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++;
}
else if (chk_oldvalue == chk_value) chk_match++;
first_pass = false;
}
Console.WriteLine("edc15v41_1024kB_chkfixed: " + chk_fixed.ToString() + " / " + chk_found.ToString());
Console.WriteLine("edc15v41_1024kB_chkmatch: " + chk_match.ToString() + " / " + chk_found.ToString());
if (chk_fixed == 0) return ChecksumResult.ChecksumOK;
else if (chk_match > 3) return ChecksumResult.ChecksumFail;
else if (chk_fixed >= 6) return ChecksumResult.ChecksumTypeError;
return ChecksumResult.ChecksumFail;
}