#!/usr/bin/perl 

#use strict;
#use Cwd;
#use Env;

my $aline;
my $lineid;
my $length;
my $address;
my @bytes;
my $addstr;
my $chsum=0;
my $count=0;
my $firstime=1;
my $i;
my $currentaddr;
my $tmp;
my $holder="";
my $loadaddr;

if(@ARGV < 2){
	die("\n Syntax: ./program_SDRAM input1(memory setup) input2(*\.srec) output\n");
}

open(INFILE1, "<$ARGV[0]") || die("\ninput1 open fail\n");
open(INFILE2, "<$ARGV[1]") || die("\ninput2 open fail\n");
open(OUTFILE, ">$ARGV[2]") || die("\nOutput file open fail\n");

$i=0;
while ($line = <INFILE1>){
	if($line=~/\w/){
		if($line!~/[;#\*]/){
			if($i eq 0){
				printf OUTFILE ("33333333");
			}
			chomp($line);
			$line=~s/\t//;
			@array=split(/ +/,$line);
			$j=0;
			while(@array[$j]!~/\w/){
				$j=$j+1;
			}
			$addr=@array[$j];
			$regval=@array[$j+1];
			$addr=~s/0x//;
			$regval=~s/0x//;
			printf OUTFILE ("%08x%08x",hex($addr),hex($regval));
			$i=$i+1;
			if($i eq 8){
				$i=0;
				printf OUTFILE ("\n");
			}
		}
	}
}

while($i lt 8 && $i gt 0){
	printf OUTFILE "00"x8;
	$i=$i+1;
}

if($i eq 8){
	printf OUTFILE ("\n");
}

while($aline=<INFILE2>){
	$aline=uc($aline);
	chomp($aline);
	next if(($aline=~/^S0/) || ($aline=~/^S7/));
	($lineid, $length, $address, @bytes) = unpack"A2A2A8"."A2"x300, $aline;
	$length = hex($length);
	$address = hex($address);
	$length -=5;
	$i=0;

	while($length>0){
		if($firstime==1){
			$addstr = sprintf("%x", $address);
			$addstr = "0"x(8-length($addstr)).$addstr;
			print OUTFILE $addstr;
			addchsum($addstr);
			$firstime=0;
			$currentaddr=$address;
			$loadaddr = $addstr;
		}
		else{
			if($count==64){
				$addstr = sprintf("%x", $currentaddr);
				$addstr = "0"x(8-length($addstr)).$addstr;
				print OUTFILE $addstr;
				addchsum($addstr);
				$count=0;
			}
			#printf("*** %x != %x\n", $address, $currentaddr) if $address != $currentaddr;
		}
		if($currentaddr < $address) {
			print OUTFILE "00";
			addchsum("00");
			$count++;
			$currentaddr++;
		}
		else {
			while($count<64){
				$bytes[$i]=~tr/ABCDEF/abcdef/;
				print OUTFILE "$bytes[$i]";
				addchsum($bytes[$i]);
				$i++;
				$count++;
				$currentaddr++;
				$length--;
				last if($length==0);
			}
		}
		if($count==64){
			print OUTFILE "\n";
			#print OUTFILE "\r";
		}
	}
}
if($count != 64){
	$tmp = "00";
	for($i=0;$i<(64-$count);$i++){
		print OUTFILE "00";
		addchsum($tmp);
	}
	print OUTFILE "\n";
	#print OUTFILE "\r";
}


print OUTFILE "11"x4;
use integer;
$chsum=$chsum & 0xffffffff;
$chsum = sprintf("%X", $chsum);
$chsum = "0"x(8-length($chsum)).$chsum;
$chsum =~tr/ABCDEF/abcdef/;
print OUTFILE $chsum;
print OUTFILE "00"x60;
print OUTFILE "\n";
#print OUTFILE "\r";

print OUTFILE "99"x4;
print OUTFILE $loadaddr;
print OUTFILE "00"x60;
print OUTFILE "\n";
#print OUTFILE "\r";


close OUTFILE;
#END of Program



sub addchsum{
	my $cc=$_[0];
	$holder=$holder.$cc;
	if(length($holder)==8){
		$holder = hex($holder);
		$chsum+=$holder;
		$holder="";
	}
}
#END