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