X-Git-Url: http://git.ieval.ro/?a=blobdiff_plain;f=lib%2FApp%2FScheme79asm.pm;h=374a8a3f43af771517da7dec974c96f7e2bb798d;hb=04be023f8bc114edb6dddae6cee3bd58ea758561;hp=f76b834ea6c463ae7b4a03dce6baaf097612a358;hpb=ab8f838ff57d83083716775abf1c121430da5e5e;p=app-scheme79asm.git diff --git a/lib/App/Scheme79asm.pm b/lib/App/Scheme79asm.pm index f76b834..374a8a3 100644 --- a/lib/App/Scheme79asm.pm +++ b/lib/App/Scheme79asm.pm @@ -3,12 +3,14 @@ package App::Scheme79asm; use 5.014000; use strict; use warnings; +use re '/s'; +use Carp qw/croak/; use Data::Dumper qw/Dumper/; use Data::SExpression qw/consp scalarp/; use Scalar::Util qw/looks_like_number/; -our $VERSION = '0.004'; +our $VERSION = '0.005001'; our %TYPES = ( LIST => 0, @@ -57,17 +59,7 @@ 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 (!looks_like_number $type) { @@ -76,9 +68,10 @@ sub process { } $addr += (1 << $self->{addr_bits}) if $addr < 0; - die "Type too large: $type\n" unless $type < (1 << $self->{type_bits}); - die "Addr too large: $addr\n" unless $addr < (1 << $self->{addr_bits}); + die "Type too large: $type\n" if $type >= (1 << $self->{type_bits}); + die "Addr too large: $addr\n" if $addr >= (1 << $self->{addr_bits}); my $result = ($type << $self->{addr_bits}) + $addr; + unless ($location) { $self->{freeptr}++; $location = $self->{freeptr} @@ -114,28 +107,29 @@ 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)']; + my @default_comments = ('(cdr part of NIL)', '(car part of NIL)', '(cdr part of T)', '(car part of T)', '(free storage pointer)', '', '(result of computation)'); + for (0 .. $#default_comments) { + $args{comment}[$_] = $default_comments[$_] + } 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; my $length = @{$self->{memory}}; - print $fh pack('n', $length); + print $fh pack 'n', $length or croak "Failed to print memory size: $!"; # uncoverable branch true for (@{$self->{memory}}) { - print $fh pack('n', $_) + print $fh pack 'n', $_ or croak "Failed to print memory: $!" # uncoverable branch true } } 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}}; @@ -150,7 +144,10 @@ sub print_verilog { } my $spaces = ' ' x ($bits + 5 - (length $val)); $index = sprintf $index_format, $index; - say $fh "mem[$index] <= $val;$spaces // $comment" + + my $string = "mem[$index] <= $val;"; + $string .= "$spaces // $comment" if defined $comment; + say $fh $string or croak "Failed to print verilog: $!"; # uncoverable branch true } } @@ -192,9 +189,9 @@ 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). +reference). The value must be a number. C<(tag list)>, where C is of one of these three types, represents a tagged pointer. In this case, C is (recursively) @@ -277,7 +274,7 @@ are the possible keys: A word is made of a type and an address, with the type occupying the most significant C (default 3) bits, and the address occupying the least significant C (default 8) bits. -Therefore the word size is C (default 13). +Therefore the word size is C (default 11). =item freeptr @@ -293,17 +290,11 @@ C. =item comment 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). +comment for C<< $memory->[$i] >>. Note that the first 7 entries of +this array will be overwritten with the default comments. This is +useful when using custom initial memory contents and freeptr, because +this key can be used to provide comments for the extra reserved +locations in memory. =back