#!/usr/bin/perl print("/* autogenerated - do not edit */\n"); while (<>) { chomp; if (m/^From host to PIC/) { $dirn= '>'; $dname= "HOST2PIC"; } elsif (m/^From PIC to host/) { $dirn= '<'; $dname= "PIC2HOST"; } elsif (m/^\S/) { $dirn= undef; } next unless defined $dirn; next unless m/^ ([<>]) / && $1 eq $dirn; die if m/\t/; die unless m/^ [<>] ([01A-Za-z. ]+?) +(\S.*)$/; $msg= $1; $rhs= $2; $rhs =~ s/^\([A-Z][0-9A-Z]+\) +//; next if $rhs =~ m/^\}/; next if $msg =~ m/\.\.\./; $rhs =~ m/^([A-Z]+)\s/ or die "$rhs?"; $cname= lc $1; $msg =~ s/ //g; if ($msg =~ m/^0[01]{7}$/) { $opcode= $&; $arglen= 0; $ybit= 0; } else { $ybit= substr($msg,0,8); $ybit =~ y/Y01A-Z/10/; $ybit =~ m/1.*1/ and die "$msg/$ybit?"; $msg =~ s/Y/0/g; $msg =~ m/[A-Z]/ or die "$msg?"; $oplet= $&; $msg =~ s/$oplet/_/g; die "$msg?" if $msg =~ m/[A-Z]/; die "$msg?" unless $msg =~ m/^(1[01][01_]{6})0_{7}$/ or $msg =~ m/^(0[01][01_]{6})$/; $opcode= $1; die if $opcode =~ m/_[01]/; $opcode =~ s/_/0/g; $arglen= $msg; $arglen =~ s/[01]//g; $arglen= length $arglen; $ybit= oct("0b$ybit"); } for $yval ($ybit ? (0,1) : '') { printf("%s( %-12s 0x%02x, %2d )\n", $dname, sprintf("%s%s,",$cname, $yval), oct("0b$opcode") | $ybit *$yval, $arglen) or die $!; } }