#! /usr/bin/perl
#
# dr. shreds microprocessor
#
push(@INC,"~/bin");
require 'bin2dec.pl';
require 'dec2bin.pl';
require 'dec2bin_vec.pl';
$acc = "0" x 64;
$add_reg = "0" x 8;
@reg = (
        "0" x 64
        ,"0" x 64
        ,"0" x 64
        ,"0" x 64
        ,"0" x 64
        ,"0" x 64
        ,"0" x 64
        ,"0" x 64
       );
unless (open(MEM_RW,">mem_rw.ffo")){
   print "Can't open file mem_rw.ffo\n";
}
unless (open(MEM_AD,">mem_ad.ffo")){
   print "Can't open file mem_ad.ffo\n";
}
unless (open(MEM_DA,"+<mem_da.ffo")){
   print "Can't open file mem_da.ffo\n";
}
print "here 00100\n";
while ($cmd ne "111111") {
   print "here 00110 $add_reg\n";
   print MEM_RW "1\n";
   close MEM_RW;
   print MEM_AD "$add_reg\n";
   close MEM_AD;
   print "here 00115\n";
   $da = <MEM_DA>;
   print "here 00118\n";
   print "da $da\n";
   ($cmd,$ref,$dat) = $da =~ /^([01]{6})([01]{3})([01]{64})/;
   ($add) = $da =~ /([01]{8})$/;
   print "cmd = $cmd\nref=$ref\ndat=$dat\n";
   close MEM_DA;
   print "here 00120\n";
   if ($cmd eq "000000"){
      print "load acc command\n";
      $acc = $dat;
   }
   elsif ($cmd eq "000001"){
      print "write mem command\n";
      open(MEM_RW,">mem_rw.ffo");
      open(MEM_AD,">mem_ad.ffo");
      open(MEM_DA,"+<mem_da.ffo");
      print MEM_RW "0\n";
      print MEM_AD "$add\n";
      print MEM_DA "$acc\n";
      close MEM_RW;
      close MEM_AD;
      close MEM_DA;
   }
   elsif ($cmd eq "111111"){
      print "exit command\n";
      open(MEM_RW,">mem_rw.ffo");
      open(MEM_AD,">mem_ad.ffo");
      open(MEM_DA,"+<mem_da.ffo");
      print MEM_RW "x\n";
      close MEM_RW;
      print MEM_AD "$add\n";
      print MEM_DA "$acc\n";
      close MEM_RW;
      close MEM_AD;
      close MEM_DA;
      print "exiting the program\n";
      exit(0);
   }
   else {
      print "command $cmd not valid\n";
      print MEM_RW "x\n";
      close MEM_RW;
      print "exiting the program\n";
      exit(0);
   }
   for ($i=0;$i<$#reg;$i++){
       print "reg_$i $reg[$i]\n";
   }
   print "acc $acc\n";
   $add_reg_d = bin2dec($add_reg);
   $add_reg_d += 1;
   $add_reg = dec2bin_vec($add_reg_d,8);
   print "add_reg $add_reg\n";
   open(MEM_RW,">mem_rw.ffo");
   open(MEM_AD,">mem_ad.ffo");
   open(MEM_DA,"+<mem_da.ffo");

}
