#!/usr/bin/perl -w
select(STDERR);
$| = 1;
select(STDOUT); # default
$| = 1;
my $name = $ARGV[0];
if (not defined $name) {
die "Need input filename\n";
}
open (IN_FILE, $name)
or die "Couldn't open $name for reading";
binmode(IN_FILE);
while (!eof(IN_FILE)) {
$crc=0;
# find a 2-bytes header 00 01
$hfound=0;
$prev=0xFF;
while (!$hfound) {
read(IN_FILE, $byte, 1);
if (eof(IN_FILE)) {goto EEOF};
$data=ord($byte);
$w=($data << 8) | $prev;
if($w==1){
$hfound=1;
printf("Header 00 01 found!\n");
} else {
$prev=$data;
};
};
read(IN_FILE, $byte, 1);
$locnt=ord($byte);
$crc=($crc+$locnt) & 0xFF;
read(IN_FILE, $byte, 1);
$hicnt=ord($byte);
$crc=($crc+$hicnt) & 0xFF;
$cnt=($hicnt<< 8) | $locnt;
printf("Counter=%06o (%d %04XH) +6\n",$cnt,$cnt,$cnt);
read(IN_FILE, $byte, 1);
$loadr=ord($byte);
$crc=($crc+$loadr) & 0xFF;
read(IN_FILE, $byte, 1);
$hiadr=ord($byte);
$crc=($crc+$hiadr) & 0xFF;
$adr=($hiadr<< 8) | $loadr;
printf("Address=%06o (%d %04XH)\n",$adr,$adr,$adr);
#read $cnt-6 bytes and calculate checksum
for($i=0;$i<($cnt-6);$i++) {
read(IN_FILE, $byte, 1);
$data=ord($byte);
$crc=($crc+$data) & 0xFF;
};
read(IN_FILE, $byte, 1);
$fcrc=ord($byte);
$crc=(~$crc)& 0xFF;
printf("CRC from file = %03o %02XH\n",$fcrc,$fcrc);
printf("CRC from calc = %03o %02XH\n",$crc,$crc);
if ($fcrc==$crc) {
printf("CRC correct!\n");
} else {
printf("CRC not correct!\n");
}
}
EEOF:
close(IN_FILE);