diff options
Diffstat (limited to 'text2screen.pl')
-rw-r--r-- | text2screen.pl | 42 |
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; +} |