aboutsummaryrefslogtreecommitdiff
path: root/text2screen.pl
blob: 7fe4849c813cefebb5c4c137a77762110348fb00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl -w

# Turn each line of stdin into one 32-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.

use bytes;

$linelen = $1 || 32; # 32 for narrow playfield, would be 40 for normal.

while(<>) {
	chomp;

	s/\\(.)/chr(ord($1)|0x80)/ge;

	if(length > $linelen) {
		warn "$0: line $. truncated to 32 characters!\n";
		substr($_, 32) = "";
	}

	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;
}