#!/usr/bin/perl

use Data::Dumper;

$sourcefile = "/home/mk/gier/ga4/GA4.asc";

@addr2line =
(
  "744 11308",
  "745 11327",
  "746-748 11335-11337",
  "749 11328",
  "750-760 11338-11348",
  "764-769 11349-11354",
  "770-771 11356-11357",
  "772-784 11359-11371",
  "785-786 11373-11374",
  "682-718 11384-11420",
  "725-742 11430-11447"
);

%name2addr = 
  ( 
    'rn' => '801',
    'exp2' => '802addr',
    'exp10' => '803addr',
    'b' => '804addr',
    'h' => '805addr',
    'd' => '806addr',
    'bEf2' => '807addr',
    'exppart' => '808addr',
    'H' => '809addr',
    'fn' => '810addr',
    'st' => '811',
    'x1' => '812',
    'p0' =>  '813',
    'exp10' => '977addr'
 );

%addr2name = ();
foreach $name (keys %name2addr)
{
  print "name: $name\n";
  $addr = $name2addr{$name};
  if($addr =~ /(\d+)[a-z]/)
  {
    $addr = $1;
  }
  $addr2name{$addr} = $name;
  print "$addr\t$name\n";
}

open SOURCE,$sourcefile;

$line=0;
while($l = <SOURCE>)
{
  chomp($l);
  $line++;
  $sourceline[$line] = $l;
}
close SOURCE;

for($i=0;$i<1024;$i++)
{
  $core2source[$i] = -1;
}

for $l (@addr2line)
{
  print Dumper($l);
  print "$l\n";
  @sp = split / /, $l;
  print "sp: @sp\n";
  $c1 = $sp[0];
  $s1 = $sp[1];
  print "  $c1 $s1\n";
  $c2 = $c1;
  $s2 = $s1;
  if($c1 =~ /^(\d+)-(\d+)$/)
  {
    $c1 = $1;
    $c2 = $2;
  }
  if($s1 =~ /^(\d+)-(\d+)$/)
  {
    $s1 = $1;
    $s2 = $2;
  }
  print "  $c1 $c2   $s1 $s2\n";
  if(($c2-$c1) != ($s2-$s1))
  {
    print "Interval mismatch: $l\n";
  }
  for($i=$c1; $i<=$c2; $i++)
  {
    print "core: $i => ".($s1+$i-$c1)."\n";
    $core2source[$i] = $s1+$i-$c1;
  }
}

$s=0;
$lastac=0;
$lastmkn=0;
$lastarnf=0;
while($l = <>)
{
  chomp($l);
  print "$l\n";
  if($l =~ /^   s: ([-0-9]+)\s+([-0-9]+) /)
  {
    $s = $1;
    $s = $s-1024 if($s>511);
    $p = $2;
    $p = $p-1024 if($p>511);
  }
  elsif($l =~ /^   MQ: \d \d{10} \d{10} \d{10} \d{10} \d\d\s+([-0-9]+) /)
  {
    $mq = $1;
  }
  elsif($l =~ /^   AC: \d \d{10} \d{10} \d{10} \d{10} \d\d\s+([-0-9]+) /)
  {
    $ac = $1;
    if($lastmkn)
    {
      print "$s $mq $ac\n";
      $lastmkn = 0;
    }
  }
  elsif($l =~ /   RF: (.*)$/)
  {
    $number = $1;
    if($lastarnf)
    {
      $exponent = ($mq>>30)&1023;
      
      print "number: $number $exponent $ac\n";
    }
  }
  elsif($l =~ /^Execute\[(.*?)\]: (.*?)  /)
  {
    $addr = $1;
    $h = 0;
    if($addr =~ /^(\d+)h$/)
    {
      $h = 1;
      $addr = $1;
    }
    $instr = $2;
    $lastmkn=0;
    if($h==0 && $instr =~ /^mkn /)
    {
      $lastmkn=1;
    }
    $lastarnf=0;
    if($h==0 && $instr =~ /^arnf /)
    {
      $lastarnf=1;
    }
    print "addr: $addr: ".$core2source[$addr]."\n";
    if($core2source[$addr] != -1)
    {
      print "SOURCE: ".$sourceline[$core2source[$addr]]."\n";
    }
  }
  elsif($l =~ /Reading (\d+): ([-0-9]+) /)
  {
    $addr = $1;
    $value = $2;
    if(exists $addr2name{$addr})
    {
      $name = $addr2name{$addr};
      if($name2addr{$name} =~ /^(\d+)addr$/)
      {
	$value = $value>>30;
	$value-=1024 if($value>511);
      }
      print "Reading $name: $value\n";
    }
  }
  elsif($l =~ /Writing (\d+): ([-0-9]+) /)
  {
    $addr = $1;
    $value = $2;
    if(exists $addr2name{$addr})
    {
      $name = $addr2name{$addr};
      if($name2addr{$name} =~ /^(\d+)addr$/)
      {
	$value = $value>>30;
	$value-=1024 if($value>511);
      }
      print "Writing $name: $value\n";
    }
  }
}


