+#! /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;