@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++; } }