#!/usr/bin/perl -w # v0.1: initial version # v0.2: write correct size values into header use Fcntl qw(:seek); unless (defined $ARGV[1]) { print STDERR "usage: $0 INFILE OUTFILE\n"; print STDERR "INFILE is Dragon/Tandy CoCo CAS file\n"; print STDERR "OUTFILE will be 48000Hz WAV\n"; exit 1; } die unless open (my $in, "<", $ARGV[0]); die unless open (my $out, ">", $ARGV[1]); my $wav_header = "524946460000000057415645666d7420100000000100010080bb000080bb0000010008006461746100000000"; print $out pack("H*", $wav_header); my $count = 0; my @bytes = ( 0x80, 0x93, 0xa7, 0xb9, 0xca, 0xd9, 0xe6, 0xf1, 0xf8, 0xfd, 0xff, 0xfd, 0xf8, 0xf1, 0xe6, 0xd9, 0xca, 0xb9, 0xa7, 0x93, 0x80, 0x6d, 0x59, 0x47, 0x36, 0x27, 0x1a, 0x0f, 0x08, 0x03, 0x01, 0x03, 0x08, 0x0f, 0x1a, 0x27, 0x36, 0x47, 0x59, 0x6d, ); my $c; while (sysread($in, $c, 1) > 0) { $c = ord($c); for my $i (0..7) { if ($c & 0x01) { write_2400(); } else { write_1200(); } $c >>= 1; } } seek($out, 40, SEEK_SET); print $out pack("C", $count & 0xff); print $out pack("C", ($count >> 8) & 0xff); print $out pack("C", ($count >> 16) & 0xff); print $out pack("C", ($count >> 24) & 0xff); $count += 36; seek($out, 4, SEEK_SET); print $out pack("C", $count & 0xff); print $out pack("C", ($count >> 8) & 0xff); print $out pack("C", ($count >> 16) & 0xff); print $out pack("C", ($count >> 24) & 0xff); close $out; exit 0; sub write_2400 { for my $i (0..19) { print $out pack("C", $bytes[$i*2]); } $count += 20; } sub write_1200 { for my $i (0..39) { print $out pack("C", $bytes[$i]); } $count += 40; }