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";
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);
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;