Project

General

Profile

New Model #2795 » decode_icf.pl

Perl IC-R6 ICF decoder - draft - John Bradshaw, 07/18/2024 05:21 PM

 
#!/usr/bin/perl

@MODES = (" FM", "WFM", " AM", "???");
@STEPS = (5, 6.25, 8.33, 9, 10, 12.5, 15, 20, 25, 30, 50, 100, 125, 200, "Auto", "???");


print "ADDR 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15\n";
print "------------------------------------------------------------\n";


while (defined($cur_line = <STDIN>)) {
chomp($cur_line);



#0000 10 48710008007800080072000000000000
#001010F04F0108004001080072000000000000
#002010184C001A000000080072000000000000
#003010DA4D001A000000080072000000000000
#0040109C4F001A0000000800720008EC873CE9
#0050 10 E44D001A000000080072000000000000
#...
#6E501049636F6D436C6F6E65466F726D617433

# Skip the model line...
next if $cur_line =~ /^32500001/;

# Skip comments
next if $cur_line =~ /^\#/;

# MSDOS To unix as CS-R6 is saving MSDOS...
$cur_line =~ s/\x0D$//;

# Skip current mode (cmd 00)
if (length($cur_line) !=38) {
die("FATAL: Unexpected length (not 38):\n<$cur_line>\n\n")
}

if ($cur_line !~ /^[0-6][0-9A-F]{3}10[0-9A-F]{32}$/) {
die("FATAL: Unknown command in line:\n<$cur_line>\n\n")
}


($addr1, $addr2) = ($cur_line =~ /^(..)(..)/);
$cur_line =~ s/^....10//;
$address = hex($addr1 . $addr2);
print(sprintf("%s%s %6d ", $addr1, $addr2, $address));
@hex_code = ( $cur_line =~ m/../g );
# 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15


# Data split at byte boundaries
print join(" ", @hex_code[0..15]);


@int_val = [];
for ($i=0; $i<=15; $i++) {
# Str to value
$int_val[$i] = hex($hex_code[$i]);
# print "\n$i: " . $hex_code[$i] . " -> " . $int_val[$i]. "\n"
}

if ($address <= 20799) {
# Main memories
if (1==1) {
print " <Ch " . sprintf("%04d", int ($address/16)) . ">";

# Decodes from what we know already:
$CODED_CHARS = " ^^^^^^^()*+^-./0123456789:^^=^^^ABCDEFGHIJKLMNOPQRSTUVWXYZ^^^^^";
$mem_name = substr($CODED_CHARS, ((($int_val[11] & 0x0f) << 2) | (($int_val[12] & 0xc0) >> 6)), 1) .
substr($CODED_CHARS, ($int_val[12] & 0x3f), 1) .
substr($CODED_CHARS, (($int_val[13] & 0xfc) >> 2), 1) .
substr($CODED_CHARS, ((($int_val[13] & 0x03) << 4) | (($int_val[14] & 0xf0) >> 4)), 1) .
substr($CODED_CHARS, ((($int_val[14] & 0x0f) << 2) | (($int_val[15] & 0xc0) >> 6)), 1) .
substr($CODED_CHARS, ($int_val[15] & 0x3f), 1);
print " <$mem_name>";

$mode_int = ($int_val[3] & 0x30) >> 4;
$mode = $MODES[$mode_int];
print " Mode:<$mode_int><$mode>";

# Tuning Step:
$ts = ($int_val[3] & 0x0f);
$ts_str = $STEPS[$ts];
print " TS:<", sprintf("%2d", $ts), "><", sprintf("%4s", $ts_str), ">";

# Freq:
print " Freq:<", sprintf("%3d", $int_val[0]), "><", sprintf("%3d", $int_val[1]), "><",sprintf("%3d", $int_val[2]), ">";
print " Freq:<", sprintf("%.8b", $int_val[0]), "><", sprintf("%.8b", $int_val[1]), "><",sprintf("%.8b", $int_val[2]), ">";
print " RFreq:<", sprintf("%.8b", $int_val[2]), "><", sprintf("%.8b", $int_val[1]), "><",sprintf("%.8b", $int_val[0]), ">";

# Duplex mode and freq offset
$dplx = ($int_val[4] & 0x30)/16;
print " Dplx:";
if ($dplx == 0) {
print " "
} elsif ($dplx == 1) {
print "-"
}
elsif ($dplx == 2) {
print "+"
}
elsif ($dplx == 3) {
print "!"
}
print "", sprintf("%3d", $int_val[5]), "><", sprintf("%3d", $int_val[6]), ">";
print " <", sprintf("%.8b", $int_val[5]), "><", sprintf("%.8b", $int_val[6]), ">";
print " <", sprintf("%4d", 256*$int_val[6] + $int_val[5]), ">\n";
}
} elsif ($address <= 23984) {
print " <Unknown>\n";
} elsif ($address <= 24399) {
print " Scan Edge:";
print " <Name:" . chr($int_val[10]) . chr($int_val[11]) . chr($int_val[12]) . chr($int_val[13]) .
chr($int_val[14]) . chr($int_val[15]) . ">";
$scan_edge_dis = ($int_val[8] & 0x80)/128;
print " <Dis:$scan_edge_dis>";
$scan_edge_mode = ($int_val[8] & 0x70)/16;
print " <Mod:$scan_edge_mode>";
$scan_edge_att = ($int_val[9] & 0x30)/16;
print " <Att=$scan_edge_att>\n";

} elsif ($address <= 24447) {
print " <Unknown>\n";
} elsif ($address <= 27047) {
$channel = int(($address - 24448)/2);
print " <Ch Flags> ";
for($i=0; $i<=7; $i++) {
if ($channel+$i < 1300) {
#if ($hex_code[$i*2] != "FF" || $hex_code[$i*2 +1] != "00") {
print " <" . sprintf("%04d", $channel+$i) . ": " . $hex_code[$i*2] . " " . $hex_code[$i*2 +1] . ">"
#} else {
# print " <" . sprintf("%04d", $channel+$i) . " >";
#}
} else {
print "\n <Unknown> <" . $hex_code[$i*2] . " " . $hex_code[$i*2 +1] . ">"
}
}
print "\n"
} elsif ($address <= 27919) {
print " <Unknown>\n";
} elsif ($address <= 28095) {
# Bank names in ASCII
print " <Bank names> <" . chr($int_val[0]) . chr($int_val[1]) . chr($int_val[2]) . chr($int_val[3]) .
chr($int_val[4]) . chr($int_val[5]) . "> <" .
chr($int_val[8]) . chr($int_val[9]) . chr($int_val[10]) . chr($int_val[11]) .
chr($int_val[12]) . chr($int_val[13]) . ">\n";
} else {
print " <Unknown>\n";
}
}
(3-3/7)