@data = read_data($infile); # @data is global
$data[0x6FFE] = 0; # zero CRC
$data[0x6FFF = 0; # locations
$crc = crc16(0x0000, 0x6FFF, 0); # works
$crc = 0;
for ($a = 0x0000; $a < 0x6fff; $a += 32) { # final value
next if (unusedBlock($a, 32); # off by one
$crc = crc16($a, $a + 32, $crc);
}
$data[0x6FFE] = $crc >> 8; # save
$data[0x6FFF] = $crc & 0xFF; # CRC
write_data($outfile); # or write_data_blocks($outfile);
####
sub crc16 ($$$)
{
my ($startadr, $endadr, $crc) = @_;
my ($cadr, $adr, $i, $u, $d);
for ($adr = $startadr; $adr <= $endadr; $adr++) {
if (defined($data[$adr])) {
$d = $data[$adr] & 0xFF;
} else {
$d = 0xFF;
}
$i = $crc >> 8;
$crc <<= 8;
$crc &= 0xFFFF;
$crc |= $d;
$crc ^= $crctable[$i];
}
return $crc;
}
####
void VerifyFlashBlock(UINT8 len, UINT16 address)
{
UINT8 byte_value;
UINT8 crc_table_index;
for (;len > 0; len--) {
byte_value = _READ_BYTE_FROM_FLASH(address);
crc_table_index = crc >> 8;
crc = (crc << 8) | byte_value;
crc = crc ^ _Crc_table[crc_table_index];
address++;
buffer++;
}
}