chiark / gitweb /
Add GPL3 notices and a copy of the GPL3.
[zx-fizzbuzz] / gluep
1 #! /usr/bin/perl
2
3 use autodie;
4
5 sub intify ($) {
6   my ($n) = @_;
7   if ($n =~ /^0/) { $n = oct $n; }
8   return $n;
9 }
10
11 my $MEM = "";
12 my $BASE = 0x4009;
13 my $LIMIT = 0x8000;
14
15 for my $a (@ARGV) {
16   $a =~ /^(\w+):(.*)$/ or die "bad spec ADDR:FILE";
17   my $addr = intify $1;
18   my $file = $2;
19
20   my $body = "";
21   open my $fh, "<", $file;
22   READ: for (;;) {
23     sysread $fh, my $buf, 4096;
24     last READ unless length $buf;
25     $body .= $buf;
26   }
27   close $fh;
28
29   $addr >= $BASE && $LIMIT >= $addr + length $body
30     or die "out of bounds";
31
32   $addr -= $BASE;
33   my $end = $addr + length $body;
34   my $before = $addr > length $MEM
35     ? $MEM . "\0" x ($addr - length $MEM)
36     : substr $MEM, 0, $addr;
37   my $after = $end <= length $MEM
38     ? ""
39     : substr $MEM, $end;
40   $MEM = $before . $body . $after;
41 }
42
43 syswrite STDOUT, $MEM;