home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / program / d / fpbas4tla / !fpbas4tla / !runimage < prev    next >
Encoding:
Text File  |  1992-01-26  |  5.4 KB  |  168 lines

  1. # extract fpu-commands for Acorn Archimedes out of a inputfile,
  2. # writes a basic-file for FPAbas/FPAssemble (by S. Brodie) 
  3. # ( FPAbas/FPAssemble converts fpu-commands into the matching numbers )
  4. # starts the basic-file and bring the output back into Assemblerfile, with
  5. # the syntax for a Assembler that doesn't support fpu-commands (here TLA cause
  6. # current version doesn't support fpu-commands )
  7.  
  8. # usage: perl thisfile inputfile outfilefile 
  9.  
  10. # for other assemblers you may need: hexsign='&'
  11.    $hexsign='';
  12. # for other assemblers you may need a other commentsign
  13.    $commentsign=';';
  14. # for other assemblers you may need a other wordcommand (eg. EQUD)
  15.    $wordcommand='.WORD';
  16. #
  17.  
  18.    $nl="\n";
  19.    $[=1;
  20.    $outfile=$ARGV[2];
  21.    $infile=$ARGV[1];
  22.    $buffer=' ' x 256;
  23.    $bufferlen=length($buffer);
  24.    $varstring='fpabas4tla$dir';
  25.    $regs=syscall("OS_ReadVarVal",$varstring,$buffer,$bufferlen,3,4,5,6,7,8,9);
  26.    ($r0,$r1,$r2)=unpack('I3',$regs);
  27.    $buffer=substr($buffer,1,$r2);
  28.    $obeydir=$buffer;
  29.    $outworkfile=$obeydir.'.work.basicfile';
  30.    $inworkfile=$obeydir.'.work.basicout';
  31.    $s='*unset fpabas4tla$error';
  32.    system($s);
  33.    $s='*set fpabas4tla$error true';
  34.    system($s);
  35.    $i=0;
  36.    $f=0;
  37.    open($outworkfilehandle,'>'.$outworkfile);
  38.    printf($outworkfilehandle '1 LIBRARY "<fpabas$path>FPAbas"'.$nl);
  39.    open($infilehandle,$infile);
  40.    while (<$infilehandle>)
  41.       { 
  42.       $i=$i+1;
  43.       s/\r\n|\n\r|\r|\n//g;
  44.       $s=$_;
  45.       if (substr($_,1,1) =~ ' ') { s/ +//; }
  46.       @s2=split(/ +/,$_,3);
  47.       $pos=0;
  48.       for ($n=1;$n<=2;$n++)
  49.          {
  50.          if (
  51.              (
  52.               ($n==1)
  53.               ||  
  54.               (($n==2) && (substr($s,1,1) !~ ' '))
  55.              )
  56.              &&
  57.              (
  58.               ($s2[$n] =~ /^[Ll][Dd][Ff]/) ||
  59.               ($s2[$n] =~ /^[Ss][Tt][Ff]/) ||
  60.               ($s2[$n] =~ /^[Aa][Dd][Ff]/) ||
  61.               ($s2[$n] =~ /^[Mm][Uu][Ff]/) ||
  62.               ($s2[$n] =~ /^[Ss][Uu][Ff]/) ||
  63.               ($s2[$n] =~ /^[Rr][Ss][Ff]/) ||
  64.               ($s2[$n] =~ /^[Dd][Vv][Ff]/) ||
  65.               ($s2[$n] =~ /^[Rr][Dd][Ff]/) ||
  66.               ($s2[$n] =~ /^[Pp][Oo][Ww]/) ||
  67.               ($s2[$n] =~ /^[Rr][Pp][Ww]/) ||
  68.               ($s2[$n] =~ /^[Rr][Mm][Ff]/) ||
  69.               ($s2[$n] =~ /^[Ff][Mm][Ll]/) ||
  70.               ($s2[$n] =~ /^[Ff][Dd][Vv]/) ||
  71.               ($s2[$n] =~ /^[Ff][Rr][Dd]/) ||
  72.               ($s2[$n] =~ /^[Pp][Oo][Ll]/) ||
  73.               ($s2[$n] =~ /^[Mm][Vv][Ff]/) ||
  74.               ($s2[$n] =~ /^[Mm][Nn][Ff]/) ||
  75.               ($s2[$n] =~ /^[Aa][Bb][Ss]/) ||
  76.               ($s2[$n] =~ /^[Rr][Nn][Dd]/) ||
  77.               ($s2[$n] =~ /^[Ss][Qq][Tt]/) ||
  78.               ($s2[$n] =~ /^[Ll][Oo][Gg]/) ||
  79.               ($s2[$n] =~ /^[Ll][Gg][Nn]/) ||
  80.               ($s2[$n] =~ /^[Ee][Xx][Pp]/) ||
  81.               ($s2[$n] =~ /^[Ss][Ii][Nn]/) ||
  82.               ($s2[$n] =~ /^[Cc][Oo][Ss]/) ||
  83.               ($s2[$n] =~ /^[Tt][Aa][Nn]/) ||
  84.               ($s2[$n] =~ /^[Aa][Ss][Nn]/) ||
  85.               ($s2[$n] =~ /^[Aa][Cc][Ss]/) ||
  86.               ($s2[$n] =~ /^[Aa][Tt][Nn]/) ||
  87.               ($s2[$n] =~ /^[Ff][Ll][Tt]/) ||
  88.               ($s2[$n] =~ /^[Ff][Ii][Xx]/) ||
  89.               ($s2[$n] =~ /^[Ww][Ff][Ss]/) ||
  90.               ($s2[$n] =~ /^[Rr][Ff][Ss]/) ||
  91.               ($s2[$n] =~ /^[Ww][Ff][Cc]/) ||
  92.               ($s2[$n] =~ /^[Rr][Ff][Cc]/) ||
  93.               ($s2[$n] =~ /^[Cc][Mm][Ff]/) ||
  94.               ($s2[$n] =~ /^[Cc][Nn][Ff]/)
  95.              ) 
  96.             )
  97.             {
  98.             $pos=$n;
  99.             }
  100.          }
  101.       if ($pos!=0)
  102.          {
  103.          $asmtext[$i]=$commentsign.substr($s,3-$pos);
  104.          $i=$i+1;
  105.          $f=$f+1;
  106.          $ind[$f]=$i;
  107.          $label[$i]=substr($s,1,index($s,$s2[$pos])-1);
  108.          printf($outworkfilehandle "%d PRINT ~",$f+1);
  109.          printf($outworkfilehandle 'FN_FP("'."%s".'")'.$nl
  110.                 ,substr($s,index($s,$s2[$pos]))); 
  111.          }
  112.       else
  113.          {
  114.          for ($n=1;$n<=2;$n++)
  115.             {
  116.             if (
  117.                 (
  118.                  ($n==1)
  119.                  ||  
  120.                  (($n==2) && (substr($s,1,1) !~ ' '))
  121.                 )
  122.                 &&
  123.                 ($s2[$n] =~ /^\.[Ff][Ll][Oo][Aa][Tt]/)
  124.                )
  125.                {
  126.                $pos=$n;
  127.                }
  128.             }
  129.          if ($pos!=0)
  130.             {
  131.             $asmtext[$i]=$commentsign.substr($s,3-$pos);
  132.             $i=$i+1;
  133.             $asmtext[$i]=substr($s,1,index($s,$s2[$pos])-1)
  134.                          .$wordcommand.' '.$hexsign.'0'
  135.                          .sprintf("%X",unpack('i',pack('f',$s2[$pos+1])));
  136.             }
  137.          else
  138.             {
  139.             $asmtext[$i]=$s;
  140.             }
  141.          }
  142.       }
  143.    close($infilehandle);
  144.    $s=' *UNSET fpabas4tla$error';
  145.    printf($outworkfilehandle "%d".$s.$nl,$f+2);
  146.    $s=' *SET fpabas4tla$error false';
  147.    printf($outworkfilehandle "%d".$s.$nl,$f+3);
  148.    printf($outworkfilehandle "%d END\n",$f+4);
  149.    close($outworkfilehandle);
  150.    system('*SETTYPE '.$outworkfile.' BASIC');        
  151.    system('BASIC -quit '.$outworkfile.' { > '.$inworkfile.' }');        
  152.    open($inworkfilehandle,$inworkfile);
  153.    for ($z=1;$z<=$f;$z++) 
  154.       {
  155.       $_=<$inworkfilehandle>;
  156.       s/\r\n|\n\r|\r|\n//g;
  157.       if (substr($_,1,1) =~ ' ') { s/ +//; }
  158.       $s3=$_;
  159.       $asmtext[$ind[$z]]=$label[$ind[$z]].$wordcommand.' '.$hexsign.'0'.$s3;
  160.       } 
  161.    close($inworkfilehandle);
  162.    open($outfilehandle,'>'.$outfile);
  163.    for ($z=1;$z<=$i;$z++)
  164.       {
  165.       print $outfilehandle $asmtext[$z],$nl;
  166.       }
  167.    close($outfilehandle);
  168.