./tapify 3 fb 0x7000 0x8000 <spectrum-fb.img; } \
>$@.new && mv $@.new $@
+CLEANFILES += zx81-fb.img
+zx81-fb.img: zx81.s fizzbuzz.s
+ z80asm -o $@ $^
+
+TARGETS += zx81-fizzbuzz.p
+zx81-fizzbuzz.p: gluep zx81-loader.p zx81-fb.img
+ ./gluep 0x4009:zx81-loader.p 0x7000:zx81-fb.img >$@.new && mv $@.new $@
+
all: $(TARGETS)
clean::; rm -f $(CLEANFILES)
--- /dev/null
+#! /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;
--- /dev/null
+;;; -*-asm-*-
+
+ org 0x7000
+
+spc: equ 0
+
+fixdig: macro
+ add a, 0x1c
+ endm
+
+print_a: macro
+ rst 0x10
+ endm
+
+endstr: equ 0x7a
+endstrp: macro
+ cp endstr
+ endm
+
+ jr begin
+
+fizz: db 0x2b, 0x2e, 0x3f, 0x3f, endstr
+buzz: db 0x27, 0x3a, 0x3f, 0x3f, endstr
+
+begin: