Add a ZX81 port.
[zx-fizzbuzz] / gluep
diff --git a/gluep b/gluep
new file mode 100755 (executable)
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;