#!/usr/bin/perl

$work = -1;
$c49=840;
$c5=884;
$c1=874; # next track jump2
$c2=881; # go to track
$jump=884; #track in R.9
$jump2=877; #track in R.9
$start=0;
$lowcode=500;
$lineno=0;
$lasteaddr=1024;
$clockfreq=460850;
$nexec1=0;
$nexec2=0;

sub part1
{
  my $w=$_[0];
  return(($w>>30)&1023);
}


for($i=0;$i<1024;$i++)
{
  $coretab[$i]=0;
  $exectab[$i]=0;
  $gototrack[$i]=0;
  $segtable[$i] = -1;
  $corecpu[$i] = 0;
  for($j=0;$j<40;$j++)
  {
    $seguse[$i][$j]=0;
    $segcpu[$i][$j]=0;
  }
}

while($l = <STDIN>)
{
  $lineno++;
  chomp($l);

  if(($p1=index($l,"Execute["))>=0)
  {
    $l1=substr($l,$p1+8);
    $eaddr=int($l1);
#   print "$l1 $eaddr\n";
    $nexec1++;
    if($start)
    {
      $nexec2++;
      $exectab[$eaddr]++;
      if($eaddr==$jump || $eaddr==$jump2)
      {
	$reltrack=$acpart[0];
#	print "Goto $reltrack\n";
	$gototrack[$reltrack]++;
      }
      if($eaddr<=$lowcode)
      {
	$segno = int(($eaddr-15)/41);
	$segaddr = (($eaddr-15)%41)-1;
	if($segaddr>=0)
	{
	  $track=$segtable[$segno];
	  if($track == -1)
	  {
	    print "BAD $lineno $eaddr $segno $segaddr\n";
	  }
	  else
	  {
	    $seguse[$track][$segaddr]++;
	  }
	}
      }
      $p2=rindex($l," ");
      $l2=substr($l,0,$p2);
      $p3=rindex($l2," ");
      $nclock=substr($l2,$p3+1);
      $corecpu[$lasteaddr] += $nclock;
      if($lasteaddr<=$lowcode)
      {
	$segno = int(($lasteaddr-15)/41);
	$segaddr = (($lasteaddr-15)%41)-1;
	if($segaddr>=0)
	{
	  $track=$segtable[$segno];
	  if($track == -1)
	  {
	    print "BAD2 $lineno $eaddr $segno $segaddr\n";
	  }
	  else
	  {
	    $segcpu[$track][$segaddr]+=$nclock;
	  }
	}
      }
      $lasteaddr=$eaddr;
    }
  }
  elsif($l =~ /^   AC:/)
  {
    $p1 = rindex($l," ");
    @acpart = split /\//,substr($l,$p1+1);
#   print "R: @acpart\n";
  }
  elsif(substr($l,0,8) eq "Writing ")
  {
    $addr=int(substr($l,8));
    if(($p1=index($l,"(drum)"))>=0)
    {
      $coretab[$addr] = int(substr($l,$p1+7));
    }
    else
    {
      $p1=index($l,":");
      $coretab[$addr] = int(substr($l,$p1+2));
    }
#   print "$addr\t".$coretab[$addr]."\n";
    if($work == -1 && $addr == 279)
    {
      $work=$coretab[$addr];
      $worklen=934-$work;
      $lowtrack=$work+7;
      print "work is at $work, length $worklen\n";
    }
  }
  elsif($l =~ /^SY: 41/)
  {
    $start=1;
  }
  elsif($l =~ /^LK\s+(\d+)\s+(\d+)/)
  {
    $addr=$1;
    $track=$2;
    if(($work != -1) && ($track>=$work) && ($track<($work+$worklen)))
    {
      if(($addr-16)%41==0)
      {
        if(($addr+39)>$lowcode)
	{
	  $lowcode=$addr+39;
	  print "new lowcode: $lowcode\n";
	}
	$segno = int(($addr-16)/41);
	$segtrack = 1024-($work+$worklen-$track);
#	print "Read $segtrack\n";
	$segtable[$segno] = $segtrack;
      }
    }
  }
}

print "exectab\n\n";
for($i=0;$i<1024;$i++)
{
  if($exectab[$i]>0)
  {
    print "$i\t".$exectab[$i]."\n";
  }
}
print "\ngototrack\n\n";
for($i=0;$i<1024;$i++)
{
  if($gototrack[$i]>0)
  {
    $track = $i-1024+$worklen;
    print "$i\t$track\t".$gototrack[$i]."\n";
  }
}
print "\ncorecpu\n\n";
$sum = 0;
for($i=0;$i<1024;$i++)
{
  if($corecpu[$i]>0)
  {
    printf "%4d %14.2f\n",$i,$corecpu[$i]/$clockfreq;
    $sum += $corecpu[$i];
  }
}
printf "sum: %14.2f\n",$sum/$clockfreq;
print "\nseguse\n\n";
for($i=0;$i<1024;$i++)
{
  for($j=0;$j<40;$j++)
  {
    if($seguse[$i][$j]>0)
    {
      $track = $i-1024+$worklen;
      print "$i ($track)\t$j\t".$seguse[$i][$j]."\n";
    }
  }
}
print "\nsegusesum\n\n";
for($i=0;$i<1024;$i++)
{
  $sum=0;
  for($j=0;$j<40;$j++)
  {
    $sum += $seguse[$i][$j];
  }
  if($sum>0)
  {
    $track = $i-1024+$worklen;
    print "$i ($track)\t$sum\n";
  }
}

print "\nsegcpu\n\n";
for($i=0;$i<1024;$i++)
{
  for($j=0;$j<40;$j++)
  {
    if($segcpu[$i][$j]>0)
    {
      $track = $i-1024+$worklen;
      printf "%4d (%3d) %2d %14.2f\n",$i,$track,$j,$segcpu[$i][$j]/$clockfreq;
    }
  }
}
print "\nsegcpusum\n\n";
for($i=0;$i<1024;$i++)
{
  $sum=0;
  for($j=0;$j<40;$j++)
  {
    $sum += $segcpu[$i][$j];
  }
  if($sum>0)
  {
    $track = $i-1024+$worklen;
    printf "%4d (%3d) %14.2f\n",$i,$track,$sum/$clockfreq;
  }
}

print "nexec1: $nexec1\n";
print "nexec2: $nexec2\n";

