X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/zx-fizzbuzz/blobdiff_plain/64b6fca5f33b619e9c38778000f5192521a57cf6..e007e1c95912e17f33ed135b4b69d293076a7017:/gluep diff --git a/gluep b/gluep new file mode 100755 index 0000000..504c779 --- /dev/null +++ b/gluep @@ -0,0 +1,43 @@ +#! /usr/bin/perl + +use autodie; + +sub intify ($) { + my ($n) = @_; + if ($n =~ /^0/) { $n = oct $n; } + return $n; +} + +my $MEM = ""; +my $BASE = 0x4009; +my $LIMIT = 0x8000; + +for my $a (@ARGV) { + $a =~ /^(\w+):(.*)$/ or die "bad spec ADDR:FILE"; + my $addr = intify $1; + my $file = $2; + + my $body = ""; + open my $fh, "<", $file; + READ: for (;;) { + sysread $fh, my $buf, 4096; + last READ unless length $buf; + $body .= $buf; + } + close $fh; + + $addr >= $BASE && $LIMIT >= $addr + length $body + or die "out of bounds"; + + $addr -= $BASE; + my $end = $addr + length $body; + my $before = $addr > length $MEM + ? $MEM . "\0" x ($addr - length $MEM) + : substr $MEM, 0, $addr; + my $after = $end <= length $MEM + ? "" + : substr $MEM, $end; + $MEM = $before . $body . $after; +} + +syswrite STDOUT, $MEM;