X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=lib%2FApp%2FScheme79asm.pm;h=0333b700dd9361da79b962c70a0ca48b073c016c;hb=744f5c2a92054cb2a39b5766042f6f44373e2401;hp=3d09b09cf09b1d77adeb1de394136b6ebd0c0732;hpb=26bb1344da7ea217ce8820c6d85dc21e92eec68c;p=app-scheme79asm.git diff --git a/lib/App/Scheme79asm.pm b/lib/App/Scheme79asm.pm index 3d09b09..0333b70 100644 --- a/lib/App/Scheme79asm.pm +++ b/lib/App/Scheme79asm.pm @@ -8,7 +8,7 @@ use Data::Dumper qw/Dumper/; use Data::SExpression qw/consp scalarp/; use Scalar::Util qw/looks_like_number/; -our $VERSION = '0.002'; +our $VERSION = '0.004'; our %TYPES = ( LIST => 0, @@ -57,24 +57,12 @@ sub process { $addr = $self->process($addr) if ref $addr eq 'ARRAY'; die 'Addr of toplevel is not atom: ', Dumper($addr), "\n" unless scalarp($addr); - my ($comment_type, $comment_addr) = ($type, $addr); - - unless (looks_like_number $addr) { # is symbol - unless (exists $self->{symbols}{$addr}) { - $self->{symbols}{$addr} = $self->{nsymbols}; - $self->{nsymbols}++; - } - $addr = $self->{symbols}{$addr} - } - die 'Computed addr is not a number: ', Dumper($addr), "\n" unless looks_like_number $addr; - if (ref $type eq 'Data::SExpression::Symbol') { + if (!looks_like_number $type) { die "No such type: $type\n" unless exists $TYPES{$type}; $type = $TYPES{$type}; - } elsif (!looks_like_number $type) { - die "Type is not a number or symbol: $type\n" } $addr += (1 << $self->{addr_bits}) if $addr < 0; @@ -116,15 +104,13 @@ sub new { $args{addr_bits} //= 8; $args{freeptr} //= 6; $args{memory} //= [0, 0, (1<<$args{addr_bits}), (1<<$args{addr_bits}), 0, 0, 0]; - $args{symbols}{T} = 2; - $args{nsymbols} = 3; $args{comment} = ['(cdr part of NIL)', '(car part of NIL)', '(cdr part of T)', '(car part of T)', '(free storage pointer)', '', '(result of computation)']; bless \%args, $class } sub print_binary16 { my ($self, $fh) = @_; - $fh //= \*STDOUT; + $fh //= \*STDOUT; # uncoverable condition right die "addr_bits + type_bits >= 16\n"if $self->{addr_bits} + $self->{type_bits} > 16; @@ -137,7 +123,7 @@ sub print_binary16 { sub print_verilog { my ($self, $fh) = @_; - $fh //= \*STDOUT; + $fh //= \*STDOUT; # uncoverable condition right my $bits = $self->{type_bits} + $self->{addr_bits}; my $index_length = length $#{$self->{memory}}; @@ -152,7 +138,10 @@ sub print_verilog { } my $spaces = ' ' x ($bits + 5 - (length $val)); $index = sprintf $index_format, $index; - say $fh "mem[$index] <= $val;$spaces // $comment" + + print $fh "mem[$index] <= $val;"; + print $fh "$spaces // $comment" if defined $comment; + print $fh "\n"; } } @@ -194,7 +183,7 @@ The SIMPLE processor expects input in a particular tagged-pointer format. This module takes a string containing a sequence of S-expressions. Each S-expression is a list of one of three types: -C<(tag value)>, for example C<(symbol nil)>, represents a value to be +C<(tag value)>, for example C<(symbol 2)>, represents a value to be put in memory (for example a number, or a symbol, or a variable reference). @@ -297,16 +286,6 @@ C. The initial comments for memory entries. C<< $comment->[$i] >> is the comment for C<< $memory->[$i] >>. -=item symbols - -The initial symbol map, as a hashref from symbol name to the index of -that symbol. Defaults to C<< {T => 2} >>. - -=item nsymbols - -The number to give to the "next" symbol (default 3, because T is -defined to be 2). - =back =item $asm->B(I<$string>) @@ -315,6 +294,13 @@ Parse a sequence of S-expressions and lay it out in memory. Can be called multiple times to lay out multiple sequences of S-expressions one after another. +=item $asm->B(I<$sexp>) + +Given an already-parsed sexp (meaning a +L object), lay it out in memory. +Can be called multiple times to lay out multiple sequences of +S-expressions one after another. + =item $asm->B Move the last pointer to position 5, and put the free pointer at