This patch does a couple of things:
* uses Getopt::Long for options. -c is now --checksyntax. I wasn't
sure how to keep compatible (patches welcome!)
* options include:
--help
--version
--verbose
--output=file
--listing=file
--checksyntax
* produces verbose listing of what the assembler saw :) Only one
nitpick with it: unknown symbols are given as 0xffffffff,
unfortunately, this includes symbols which may be defined later in the
file (i.e. forward jumps).
Brian
Index: assemble.pl
===================================================================
RCS file: /home/perlcvs/parrot/assemble.pl,v
retrieving revision 1.14
diff -r1.14 assemble.pl
7a8
> use Getopt::Long;
9,12c10,33
< my $opt_c;
< if (@ARGV and $ARGV[0] eq "-c") {
< shift @ARGV;
< $opt_c = 1;
---
> my %options;
> GetOptions(\%options,('checksyntax',
> 'help',
> 'version',
> 'verbose',
> 'output=s',
> 'listing=s'));
>
> if($options{'version'}) {
> print $0,'Version $Id$ ',"\n";
> exit;
> }
>
> if($options{'help'}) {
> print "$0 - Parrot Assembler
> Options:
> --checksyntax Check assembler syntax only, no output
> --help This text
> --listing Dump assembly listing to file
> --output File to dump bytecode into
> --verbose Show what's going on
> --version Show assembler version
> ";
> exit;
14a36,44
> if(exists($options{'output'}) && $options{'output'} eq "") {
> print STDERR "You must provide a file with --output flag!\n";
> exit;
> }
>
> if(exists($options{'listing'}) && $options{'listing'} eq "") {
> print STDERR "You must provide a file with --listing flag!\n";
> exit;
> }
54a85,87
> my $listing="PARROT ASSEMBLY LISTING - ".scalar(localtime)."\n\n";
>
>
62a96
> my $sline=$_;
65c99,104
< next if(/^\#/ || $_ eq "");
---
> if(/^\#/ || $_ eq "") {
> if($options{'listing'}) {
> $listing.=sprintf("%4d %08x %-44s %s\n", $line, $op_pc, '',$sline);
> }
> next;
> }
121a161
> log_message("substituting $op for $opcode");
161a202,209
> if($options{'listing'}) {
> # add line to listing.
> my $odata;
> foreach (unpack('l*',substr($bytecode,$op_pc))) {
> $odata.=sprintf("%08x ",$_);
> }
> $listing.=sprintf("%4d %08x %-44s %s\n", $line, $op_pc, $odata,$sline);
> }
163a212
> $listing.="\n" if($options{'listing'});
173c222,229
< # FIXUP
---
> # FIXUP (also, dump listing symbols)
> if($options{'listing'}) {
> $listing.="DEFINED SYMBOLS:\n";
> foreach (sort(keys(%label))) {
> $listing.=sprintf("\t%08x %s\n",$label{$_},$_);
> }
> }
>
184c240,244
< exit;
---
> $listing.="\nUNDEFINED SYMBOLS:\n";
> foreach (sort(keys(%fixup))) {
> $listing.="\t$_\n";
> }
> exit; # some day, unresolved symbols won't be an error!
195a256,258
> if($options{'listing'}) {
> $listing.="\nSTRING CONSTANTS\n";
> }
196a260
> my $counter=0;
204c268,271
< }
---
> }
> $listing.=sprintf("\t%04x %08x [[%s]]\n",$counter,length($_),$_)
> if($options{'listing'});
> $counter++;
217,218c284,298
< if(!$opt_c) {
< print $output;
---
> if(!$options{'checksyntax'}) {
> if($options{'output'} ne "") {
> open O,">$options{'output'}" || die $!;
> print O $output;
> close O;
> } else {
> print $output;
> }
> }
>
>
> if($options{'listing'}) {
> open L,">$options{'listing'}" || die $!;
> print L $listing;
> close L;
224a305,311
> }
>
> sub log_message {
> my($message)=@_;
> if($options{'verbose'}) {
> print STDERR "INFO ($line): $message\n";
> }