aboutsummaryrefslogtreecommitdiff
path: root/text2screen.pl
diff options
context:
space:
mode:
Diffstat (limited to 'text2screen.pl')
-rw-r--r--text2screen.pl42
1 files changed, 42 insertions, 0 deletions
diff --git a/text2screen.pl b/text2screen.pl
new file mode 100644
index 0000000..7dc2e52
--- /dev/null
+++ b/text2screen.pl
@@ -0,0 +1,42 @@
+#!/usr/bin/perl -w
+
+# Turn each line of stdin into one 40-byte line of Atari screen codes,
+# truncating or padding with nulls as needed.
+
+# Input format is plain text, except any character can be preceded
+# by a \ to inverse it. No way to get a non-inverse \ in there, sorry.
+# %V will be replaced by the contents of the VERSION file.
+
+use bytes;
+
+$linelen = $1 || 40; # 40 for normal playfield.
+
+chomp($ver = `cat VERSION`);
+
+while(<>) {
+ chomp;
+
+ s/%V/$ver/;
+ s/\\(.)/chr(ord($1)|0x80)/ge;
+
+ if(length > $linelen) {
+ warn "$0: line $. truncated to $linelen characters!\n";
+ substr($_, $linelen) = "";
+ }
+
+ my $blanks = $linelen;
+ for(map { ord } split "", $_) {
+ my $byte = $_ & 0x7f;
+ my $inv = $_ & 0x80;
+#warn sprintf("\$_ %02x, \$byte %02x, \$inv %02x", $_, $byte, $inv);
+ if($byte < 32) {
+ $byte += 64;
+ } elsif($byte >= 32 && $byte <= 96) {
+ $byte -= 32;
+ }
+#warn sprintf("result: %02x", ($byte | $inv));
+ print chr($byte | $inv);
+ $blanks--;
+ }
+ print chr(0) x $blanks;
+}