chiark / gitweb /
Merge and end branch-hostside-wip-2008-01-25 PROPERLY; cvs up -j branch-hostside...
[trains.git] / cebpic / morse-generator
index ebf0830fc64595973e5a87f1b8d9ad92196d5afe..590f5e4178f91a18970535c4792197803a4fd7ae 100755 (executable)
@@ -108,18 +108,19 @@ while (<>) {
     s/\#.*//;
     next unless m/\S/;
     s/\s+$//;
-    m/^([A-Z0-9]+)(?:\s+([^\t ;]+))?(?:\s+\;\s+(.*))?$/
+    m/^([A-Z0-9]+)(\??)(?:\s+([^\t ;]+))?(?:\s+\;\s*(.*))?$/
        or oops("syntax error");
     $morse_name= $1;
+    $morse_optional= $2;
     @morse= split //, $morse_name;
-    @addrs= defined($2) ? split /\,/, $2 : ();
-    $comment= $3;
+    @addrs= defined($3) ? split /\,/, $3 : ();
+    $comment= $4;
 
     @addrs < 8 or oops("only up to 7 addrs are supported");
 
     @data= ();
 
-    $morse= join '000', map { $morse{$_} } @morse;
+    $morse= join '00000', map { $morse{$_} } @morse;
     $morse .= '0' x 7; # padding to fill any partial byte
     while ($morse =~ s/^([01]{8})//) {
        push @data, "$&b";
@@ -129,10 +130,21 @@ while (<>) {
 
     unshift @data, sprintf "0x%x%x", scalar(@addrs), $morse_bytes;
     push @data, map {
-       s/^\:/ $filename.':' /e;
+       s/^\:\b/ $filename.':' /e;
        $filename= $1 if m/^([^:]+)\:/;
        $_ = $symval{$_} if exists $symval{$_};
-       m/\:/ ? ' xxx_unknown_xxx' : "$_ - (0xf00 * !(($_ & 0xf00)^0xf00))"
+       if ($which eq 'inc') {
+           $val= $_;
+       } elsif (m/\:/) {
+           printf STDERR "morse-generator: message \`%s': %s".
+               "unknown symbol \`%s'\n",
+               $morse_name, ($morse_optional ? 'warning: ' :''), $_;
+           exit 4 unless $morse_optional;
+           $val= ' xxx_unknown_xxx';
+       } else {
+           $val= "$_ - (0xf00 * !(($_ & 0xf00)^0xf00))";
+       }
+       $val;
     } @addrs;
 
     push @data, ('0') x (3 - (scalar(@data) + 3) % 4);
@@ -140,8 +152,8 @@ while (<>) {
     print("morse_$morse_name db @data\n") or die $!
        if $which eq 'asm';
 
-    printf("morse_$morse_name equ morse_messages_start+0x%x\n",
-          $bytes) or die $!
+    printf("morse_$morse_name equ morse_messages_start+0x%x; panic_address=%x\n",
+          $bytes, $bytes/4) or die $!
        if $which eq 'inc';
 
     $bytes += scalar @data;