#!/usr/bin/perl

sub printbin
{
  my $n=$_[0];
  my $m=64;
  my $r="";
  for(my $i=0;$i<7;$i++)
  {
    my $d=int($n/$m);
    $n=$n%$m;
    $m=$m/2;
    $r .= $d;
  }
  return($r);
}

sub getbit
{
  my $j=$_[0];
  my ($j1,$j2);
  if($type==1)
  {
    if($j>39)
    {
      $j=$j-42+$offset;
    }
    else
    {
      $j+=$offset;
    }
    $j1=$nly-1-int($j/6);
    $j2=5-($j%6);
  }
  else
  {
    $j+=$offset;
    $j1=$nly-1-int($j/7);
    $j2=6-($j%7);
  }
  return (($lys[$j1]>>$j2)&1);
}
@lys=();
$lastnly=0;
$lastwritetype="x";

while($l=<>)
{
  chomp($l);
# print "l: $l\n";
  if($l =~ /^LY: (\d+) /)
  {
    push @lys,$1;
    print "            ".printbin($1)."\n";
  }
  elsif($l =~ /^Writing (\d+): \d+ = \d (\d{10} \d{10} \d{10} \d{10} \d{2}) /)
  {
    $lastwrite=$1;
    $bits2=$2;
    $bits2 =~ s/ //g;
  }
  elsif($l =~ /G([MR])\[(\d+)\]: /)
  {
    $writetype=$1;
    $writeaddr=$2;
    print "$l ".length($bits2)." ".$bits2."\n";
    if($writeaddr != $lastwrite)
    {
      print "Mismatch addr: $writeaddr $lastwrite\n";
    }
    else
    {
      $nly = scalar @lys;
      if(($nly == $lastnly) && ($writetype eq $lastwritetype))
      {
	print "done.\n";
	exit(0);
      }
      $lastnly=$nly;
      $lastwritetype=$writetype;
      $nbit = 6*$nly;
      $maxoffset = $nbit-40;
      if($maxoffset<0)
      {
	print "Too few characters.\n";
      }
      else
      {
	for($type=1;$type<=2;$type++)
	{
	  $bad=0;
	  for($offset=0;$offset<=$maxoffset;$offset++)
	  {
	    $bad=0;
	    for($i=0;$i<=39;$i++)
	    {
	      $j=$i+$offset;
	      $ibit = substr($bits2,$i,1);
	      $jbit = getbit($i);
#	    print "offset: $offset i: $i j: $j j1: $j1 j2: $j2 ibit: $ibit jbit: $jbit\n";
	      if($ibit != $jbit)
	      {
		$bad=1;
		last;
	      }
	    }
	    if(!$bad)
	    {
	      $okoffset=$offset;
	      last;
	    }
	  }
	  if(!$bad)
	  {
	    $bad2=0;
	    for($i=40;$i<=41;$i++)
	    {
	      $ibit = substr($bits2,$i,1);
	      $jbit = getbit($i);
#	    print "offset: $offset i: $i j: $j j1: $j1 j2: $j2 ibit: $ibit jbit: $jbit\n";
	      if($ibit != $jbit)
	      {
		$bad2=1;
		last;
	      }
	    }
	    if(!$bad2)
	    {
	      print "OK type $type: $okoffset\n";
	      last;
	    }
	    else
	    {
	      print "OK except marks type $type: $okoffset\n";
	    }
	  }
	  else
	  {
	    print "BAD match type $type.\n";
	  }
	}
      }
    }
  }
}



