rendered paste bodyuse IO::File;
my @POSSIBLE_DATA_TYPES = ();
my %POSSIBLE_OPCODE = ();
################################## DATA TYPES DEF ##################################
my %DATA_TYPES=(
'01' => "Informacin del Receptor.",
'02' => "Informacin del proveedor secundario",
'03' => "Ultimo PPV pagado",
'04' => "Informacin indirecta (alias de canales)",
'05' => "Informacin de fecha",
'06' => "Info. de serv. publico. Incluye info de bloqueo y claves de decodificacion.",
'07' => "Info. de clave. Incluye la clave de verificacin de decodificacin.",
'08' => "Serv. de canal vlidos (activa canales en la gua de programas, el IRD puede decidir por si mismo si un canal est suscrito y si no, mostrar el mensaje ?este canal es de suscripcin)",
'09' => "Informacin de tema/nivel de PPV",
'0A' => "Informacin de nro. de PPV",
'0B' => "Servicios vlidos de PPV (el IRD puede decidir por si mismo si ha de mostrar el mensaje ?este evento PPV no ha sido comprado?)",
'0C' => "Informacin de lmite de crdito/gasto"
);
################################## OPCODES ##################################
my %OPCODES=(
"A9" => ["ADC",2],
"B9" => ["ADC",2],
"C9" => ["ADC",3],
"F9" => ["ADC",1],
"E9" => ["ADC",2],
"D9" => ["ADC",3],
"90F9" => ["ADC",2],
"90E9" => ["ADC",3],
"90D9" => ["ADC",4],
"92B9" => ["ADC",3],
"92C9" => ["ADC",3],
"92E9" => ["ADC",3],
"92D9" => ["ADC",3],
"91E9" => ["ADC",3],
"91D9" => ["ADC",3],
"AB" => ["ADD",2],
"BB" => ["ADD",2],
"CB" => ["ADD",3],
"FB" => ["ADD",1],
"EB" => ["ADD",2],
"DB" => ["ADD",3],
"90FB" => ["ADD",2],
"90EB" => ["ADD",3],
"90DB" => ["ADD",4],
"92BB" => ["ADD",3],
"92CB" => ["ADD",3],
"92EB" => ["ADD",3],
"92DB" => ["ADD",3],
"91EB" => ["ADD",3],
"91DB" => ["ADD",3],
"A4" => ["AND",2],
"B4" => ["AND",2],
"C4" => ["AND",3],
"F4" => ["AND",1],
"E4" => ["AND",2],
"D4" => ["AND",3],
"90F4" => ["AND",2],
"90E4" => ["AND",3],
"90D4" => ["AND",4],
"92B4" => ["AND",3],
"92C4" => ["AND",3],
"92E4" => ["AND",3],
"92D4" => ["AND",3],
"91E4" => ["AND",3],
"91D4" => ["AND",3],
"A5" => ["BCP",2],
"B5" => ["BCP",2],
"C5" => ["BCP",3],
"F5" => ["BCP",1],
"E5" => ["BCP",2],
"D5" => ["BCP",3],
"90F5" => ["BCP",2],
"90E5" => ["BCP",3],
"90D5" => ["BCP",4],
"92B5" => ["BCP",3],
"92C5" => ["BCP",3],
"92E5" => ["BCP",3],
"92D5" => ["BCP",3],
"91E5" => ["BCP",3],
"91D5" => ["BCP",3],
"1" => ["BRES or BSET",2],
"921" => ["BRES or BSET",3],
"0" => ["BTJF or BTJT",3],
"920" => ["BTJF or BTJT",4],
"BD" => ["CALL",2],
"CD" => ["CALL",3],
"FD" => ["CALL",1],
"ED" => ["CALL",2],
"DD" => ["CALL",3],
"90FD" => ["CALL",2],
"90ED" => ["CALL",3],
"90DD" => ["CALL",4],
"92BD" => ["CALL",3],
"92CD" => ["CALL",3],
"92ED" => ["CALL",3],
"92DD" => ["CALL",3],
"91ED" => ["CALL",3],
"91DD" => ["CALL",3],
"AD" => ["CALLR",2],
"92AD" => ["CALLR",3],
"4F" => ["CLR",1],
"5F" => ["CLR",1],
"905F" => ["CLR",2],
"3F" => ["CLR",2],
"7F" => ["CLR",1],
"6F" => ["CLR",2],
"907F" => ["CLR",2],
"906F" => ["CLR",3],
"923F" => ["CLR",3],
"926F" => ["CLR",3],
"916F" => ["CLR",3],
"A1" => ["CP",2],
"B1" => ["CP",2],
"C1" => ["CP",3],
"F1" => ["CP",1],
"E1" => ["CP",2],
"D1" => ["CP",3],
"90F1" => ["CP",2],
"90E1" => ["CP",3],
"90D1" => ["CP",4],
"92B1" => ["CP",3],
"92C1" => ["CP",3],
"92E1" => ["CP",3],
"92D1" => ["CP",3],
"91E1" => ["CP",3],
"91D1" => ["CP",3],
"A3" => ["CP",2],
"B3" => ["CP",2],
"C3" => ["CP",3],
"F3" => ["CP",1],
"E3" => ["CP",2],
"D3" => ["CP",3],
"92B3" => ["CP",3],
"92C3" => ["CP",3],
"92E3" => ["CP",3],
"92D3" => ["CP",3],
"90A3" => ["CP",3],
"90B3" => ["CP",3],
"90C3" => ["CP",4],
"90F3" => ["CP",2],
"90E3" => ["CP",3],
"90D3" => ["CP",4],
"91B3" => ["CP",3],
"91C3" => ["CP",3],
"91E3" => ["CP",3],
"91D3" => ["CP",3],
"43" => ["CPL",1],
"53" => ["CPL",1],
"9053" => ["CPL",2],
"33" => ["CPL",2],
"73" => ["CPL",1],
"63" => ["CPL",2],
"9073" => ["CPL",2],
"9063" => ["CPL",3],
"9233" => ["CPL",3],
"9263" => ["CPL",3],
"9163" => ["CPL",3],
"4A" => ["DEC",1],
"5A" => ["DEC",1],
"905A" => ["DEC",2],
"3A" => ["DEC",2],
"7A" => ["DEC",1],
"6A" => ["DEC",2],
"907A" => ["DEC",2],
"906A" => ["DEC",3],
"923A" => ["DEC",3],
"926A" => ["DEC",3],
"916A" => ["DEC",3],
"8E" => ["HALT",1],
"4C" => ["INC",1],
"5C" => ["INC",1],
"905C" => ["INC",2],
"3C" => ["INC",2],
"7C" => ["INC",1],
"6C" => ["INC",2],
"907C" => ["INC",2],
"906C" => ["INC",3],
"923C" => ["INC",3],
"926C" => ["INC",3],
"916C" => ["INC",3],
"80" => ["IRET",1],
"BC" => ["JP",2],
"CC" => ["JP",3],
"FC" => ["JP",1],
"EC" => ["JP",2],
"DC" => ["JP",3],
"90FC" => ["JP",2],
"90EC" => ["JP",3],
"90DC" => ["JP",4],
"92BC" => ["JP",3],
"92CC" => ["JP",3],
"92EC" => ["JP",3],
"92DC" => ["JP",3],
"91EC" => ["JP",3],
"91DC" => ["JP",3],
"20" => ["JRA",2],
"9220" => ["JRA",3],
"25" => ["JRC",2],
"9225" => ["JRC",3],
"27" => ["JREQ",2],
"9227" => ["JREQ",3],
"21" => ["JREF",2],
"9221" => ["JREF",3],
"29" => ["JRH",2],
"9229" => ["JRH",3],
"2F" => ["JRIH",2],
"922F" => ["JRIH",3],
"2E" => ["JRIL",2],
"922E" => ["JRIL",3],
"2D" => ["JRM",2],
"922D" => ["JRM",3],
"2B" => ["JRMI",2],
"922B" => ["JRMI",3],
"24" => ["JRNC",2],
"9224" => ["JRNC",3],
"26" => ["JRNE",2],
"9226" => ["JRNE",3],
"28" => ["JRNH",2],
"9228" => ["JRNH",3],
"2C" => ["JRNM",2],
"922C" => ["JRNM",3],
"2A" => ["JRPL",2],
"922A" => ["JRPL",3],
"20" => ["JRT",2],
"9220" => ["JRT",3],
"24" => ["JRUGE",2],
"9224" => ["JRUGE",3],
"22" => ["JRUGT",2],
"9222" => ["JRUGT",3],
"23" => ["JRULE",2],
"9223" => ["JRULE",3],
"25" => ["JRULT",2],
"9225" => ["JRULT",3],
"A6" => ["LD",2],
"B6" => ["LD",2],
"C6" => ["LD",3],
"F6" => ["LD",1],
"E6" => ["LD",2],
"D6" => ["LD",3],
"90F6" => ["LD",2],
"90E6" => ["LD",3],
"90D6" => ["LD",4],
"92B6" => ["LD",3],
"92C6" => ["LD",3],
"92E6" => ["LD",3],
"92D6" => ["LD",3],
"91E6" => ["LD",3],
"91D6" => ["LD",3],
"B7" => ["LD",2],
"C7" => ["LD",3],
"F7" => ["LD",1],
"E7" => ["LD",2],
"D7" => ["LD",3],
"90F7" => ["LD",2],
"90E7" => ["LD",3],
"90D7" => ["LD",4],
"92B7" => ["LD",3],
"92C7" => ["LD",3],
"92E7" => ["LD",3],
"92D7" => ["LD",3],
"91E7" => ["LD",3],
"91D7" => ["LD",3],
"AE" => ["LD",2],
"BE" => ["LD",2],
"CE" => ["LD",3],
"FE" => ["LD",1],
"EE" => ["LD",2],
"DE" => ["LD",3],
"92BE" => ["LD",3],
"92CE" => ["LD",3],
"92EE" => ["LD",3],
"92DE" => ["LD",3],
"BF" => ["LD",2],
"CF" => ["LD",3],
"FF" => ["LD",1],
"EF" => ["LD",2],
"DF" => ["LD",3],
"92BF" => ["LD",3],
"92CF" => ["LD",3],
"92EF" => ["LD",3],
"92DF" => ["LD",3],
"90AE" => ["LD",3],
"90BE" => ["LD",3],
"90CE" => ["LD",4],
"90FE" => ["LD",2],
"90EE" => ["LD",3],
"90DE" => ["LD",4],
"91BE" => ["LD",3],
"91CE" => ["LD",3],
"91EE" => ["LD",3],
"91DE" => ["LD",3],
"90BF" => ["LD",3],
"90CF" => ["LD",4],
"90FF" => ["LD",2],
"90EF" => ["LD",3],
"90DF" => ["LD",4],
"91BF" => ["LD",3],
"91CF" => ["LD",3],
"91EF" => ["LD",3],
"91DF" => ["LD",3],
"97" => ["LD",1],
"9F" => ["LD",1],
"9097" => ["LD",2],
"909F" => ["LD",2],
"9093" => ["LD",2],
"93" => ["LD",1],
"9E" => ["LD",1],
"95" => ["LD",1],
"96" => ["LD",1],
"94" => ["LD",1],
"9096" => ["LD",2],
"9094" => ["LD",2],
"42" => ["MUL",1],
"9042" => ["MUL",2],
"40" => ["NEG",1],
"50" => ["NEG",1],
"9050" => ["NEG",2],
"30" => ["NEG",2],
"70" => ["NEG",1],
"60" => ["NEG",2],
"9070" => ["NEG",2],
"9060" => ["NEG",3],
"9230" => ["NEG",3],
"9260" => ["NEG",3],
"9160" => ["NEG",3],
"9D" => ["NOP",1],
"AA" => ["OR",2],
"BA" => ["OR",2],
"CA" => ["OR",3],
"FA" => ["OR",1],
"EA" => ["OR",2],
"DA" => ["OR",3],
"90FA" => ["OR",2],
"90EA" => ["OR",3],
"90DA" => ["OR",4],
"92BA" => ["OR",3],
"92CA" => ["OR",3],
"92EA" => ["OR",3],
"92DA" => ["OR",3],
"91EA" => ["OR",3],
"91DA" => ["OR",3],
"84" => ["POP",1],
"85" => ["POP",1],
"9085" => ["POP",2],
"86" => ["POP",1],
"88" => ["PUSH",1],
"89" => ["PUSH",1],
"9089" => ["PUSH",2],
"8A" => ["PUSH",1],
"98" => ["RCF",1],
"81" => ["RET",1],
"9A" => ["RIM",1],
"49" => ["RLC",1],
"59" => ["RLC",1],
"9059" => ["RLC",2],
"39" => ["RLC",2],
"79" => ["RLC",1],
"69" => ["RLC",2],
"9079" => ["RLC",2],
"9069" => ["RLC",3],
"9239" => ["RLC",3],
"9269" => ["RLC",3],
"9169" => ["RLC",3],
"46" => ["RRC",1],
"56" => ["RRC",1],
"9056" => ["RRC",2],
"36" => ["RRC",2],
"76" => ["RRC",1],
"66" => ["RRC",2],
"9076" => ["RRC",2],
"9066" => ["RRC",3],
"9236" => ["RRC",3],
"9266" => ["RRC",3],
"9166" => ["RRC",3],
"9C" => ["RSP",1],
"A2" => ["SBC",2],
"B2" => ["SBC",2],
"C2" => ["SBC",3],
"F2" => ["SBC",1],
"E2" => ["SBC",2],
"D2" => ["SBC",3],
"90F2" => ["SBC",2],
"90E2" => ["SBC",3],
"90D2" => ["SBC",4],
"92B2" => ["SBC",3],
"92C2" => ["SBC",3],
"92E2" => ["SBC",3],
"92D2" => ["SBC",3],
"91E2" => ["SBC",3],
"91D2" => ["SBC",3],
"99" => ["SCF",1],
"9B" => ["SIM",1],
"48" => ["SLA or SLL",1],
"58" => ["SLA or SLL",1],
"9058" => ["SLA or SLL",2],
"38" => ["SLA or SLL",2],
"78" => ["SLA or SLL",1],
"68" => ["SLA or SLL",2],
"9078" => ["SLA or SLL",2],
"9068" => ["SLA or SLL",3],
"9238" => ["SLA or SLL",3],
"9268" => ["SLA or SLL",3],
"9168" => ["SLA or SLL",3],
"47" => ["SRA",1],
"57" => ["SRA",1],
"9057" => ["SRA",2],
"37" => ["SRA",2],
"77" => ["SRA",1],
"67" => ["SRA",2],
"9077" => ["SRA",2],
"9067" => ["SRA",3],
"9237" => ["SRA",3],
"9267" => ["SRA",3],
"9167" => ["SRA",3],
"44" => ["SRL",1],
"54" => ["SRL",1],
"9054" => ["SRL",2],
"34" => ["SRL",2],
"74" => ["SRL",1],
"64" => ["SRL",2],
"9074" => ["SRL",2],
"9064" => ["SRL",3],
"9234" => ["SRL",3],
"9264" => ["SRL",3],
"9164" => ["SRL",3],
"A0" => ["SUB",2],
"B0" => ["SUB",2],
"C0" => ["SUB",3],
"F0" => ["SUB",1],
"E0" => ["SUB",2],
"D0" => ["SUB",3],
"90F0" => ["SUB",2],
"90E0" => ["SUB",3],
"90D0" => ["SUB",4],
"92B0" => ["SUB",3],
"92C0" => ["SUB",3],
"92E0" => ["SUB",3],
"92D0" => ["SUB",3],
"91E0" => ["SUB",3],
"91D0" => ["SUB",3],
"4E" => ["SWAP",1],
"5E" => ["SWAP",1],
"905E" => ["SWAP",2],
"3E" => ["SWAP",2],
"7E" => ["SWAP",1],
"6E" => ["SWAP",2],
"907E" => ["SWAP",2],
"906E" => ["SWAP",3],
"923E" => ["SWAP",3],
"926E" => ["SWAP",3],
"916E" => ["SWAP",3],
"4D" => ["TNZ",1],
"5D" => ["TNZ",1],
"905D" => ["TNZ",2],
"3D" => ["TNZ",2],
"7D" => ["TNZ",1],
"6D" => ["TNZ",2],
"907D" => ["TNZ",2],
"906D" => ["TNZ",3],
"923D" => ["TNZ",3],
"926D" => ["TNZ",3],
"916D" => ["TNZ",3],
"83" => ["TRAP",1],
"8F" => ["WFI",1],
"A8" => ["XOR",2],
"B8" => ["XOR",2],
"C8" => ["XOR",3],
"F8" => ["XOR",1],
"E8" => ["XOR",2],
"D8" => ["XOR",3],
"90F8" => ["XOR",2],
"90E8" => ["XOR",3],
"90D8" => ["XOR",4],
"92B8" => ["XOR",3],
"92C8" => ["XOR",3],
"92E8" => ["XOR",3],
"92D8" => ["XOR",3],
"91E8" => ["XOR",3],
"91D8" => ["XOR",3]
);
##################################
my $data_type_1st = '0C';
##################################
sub Read {
my ($fh,$ofs, $size,$desc)= @_;
$fh->seek($fh, $ofs);
my $data;
$fh->read($data, $size);
return unpack("V",$data);
}
##################################
sub ReadAll {
my ($fh,$size)= @_;
#$fh->seek($fh, 0);
my $data;
print STDOUT "\nFilesize:$size\n";
$fh->read($data, $size);
return $data;
}
##################################
sub PrintData {
my ($all_data,$temp,$fh) = @_;
my %t = %{$temp};
open(FILE,"+> ./$fh") if defined($fh);
#print FILE $all_data."\n\n";
foreach my $u (sort {$a cmp $b} (keys %t))
{
print STDOUT "$u : ".$t{$u}."\n";
print FILE "$u : ".$t{$u}."\n" if defined($fh);
}
close(FILE) if defined($fh);
}
##################################
sub GetData
{
my @temp = @_;
my $data="";
my $value = $temp[0].$temp[1];
for (my $n=4;$n<=hex($value)*2+1;$n++)
{
$data.=$temp[$n];
}
return $data;
}
##################################
sub ShiftData
{
my ($s,@u) = @_;
my $lixo;
$lixo = shift(@u);
$lixo = shift(@u);
for (my $n=0;$n<($s*2);$n++)
{
$lixo = shift(@u);
}
return @u;
}
##################################
sub Process_datatypes
{
my @temp = @_;
my @temp2 = split(//,$data_type_1st);
my $size_1st = scalar(@temp2);
my $count=0;
my $zz = scalar(@temp);
my @tmp = @temp;
while($zz){
$p="";
my $cc = $size_1st;
while($cc--)
{
$p.=shift(@temp);
$count++;
}
if ($p eq $data_type_1st)
{
my $key = "".$temp[2].$temp[3]."";
if (defined($DATA_TYPES{$key}) && $DATA_TYPES{$key} ne "")
{
my $a;
$a->{'pos'} = $count/2-1;
$a->{'keytype'} = $key;
$a->{'type'} = $DATA_TYPES{$key};
$a->{'size'} = "".$temp[0].$temp[1]."";
$a->{'data'} = GetData(@temp);
if ($count eq 2 || $tmp[$count-3] ne "9")
{
my $s_t = hex($temp[0].$temp[1]);
@temp = ShiftData(hex($temp[0].$temp[1]),@temp);
$zz = $zz - 2 - $s_t*2;
$count = $count + 2 + $s_t*2;
push(@POSSIBLE_DATA_TYPES,$a);
}
}
}
$zz=$zz-2;
}
}
##################################
sub Print_Possible_Datatypes
{
my @temp = @_;
print STDOUT "\nData types count:".scalar(@temp)."\n";
print STDOUT "\n-----------------";
foreach my $u (@temp)
{
print STDOUT "\nAddress: #".sprintf("%x",$u->{'pos'});
print STDOUT "\nCode: ".$data_type_1st.$u->{'size'}.$u->{'keytype'};
print STDOUT "\nSize: ".$u->{'size'};
print STDOUT "\nType code: ".$u->{'keytype'};
print STDOUT "\nData type: ".$u->{'type'};
print STDOUT "\nData: ".$u->{'data'};
print STDOUT "\n-----------------\n";
}
}
##################################
sub Process_opcode
{
my @temp = @_;
}
##################################
my $fh= IO::File->new($ARGV[0], "r");
my $fileSize = -s "./$ARGV[0]";
binmode $fh;
#$fileSize = 2048;
my $size = $ARGV[1];
$flag = $fileSize;
my $ttt = $fileSize*2;
my $data = unpack('H*',ReadAll($fh,$fileSize));
my @DATA_STORAGE = split(//,$data);
my %DATA_FINAL = ();
my $add=0;
my $address = $add-($size/2);
while($flag ne 0 && $flag >0)
{
my $value="";
for (my $n=0;$n<$size;$n++)
{
$value.= $DATA_STORAGE[$add+$n];
}
$address+=($size/2);
$DATA_FINAL{sprintf("%8x",$address)} = $value;
$flag-=($size/2);
$add+=$size;
}
PrintData($data,\%DATA_FINAL,"out");
##while($flag)
##{
##
## #print STDOUT "".($fileSize-$flag)."\n";
## print STDOUT "'".$data."'\n";
## $flag-=$size;
##}
#print STDOUT unpack("V",<ROM>);
#print STDOUT <ROM>;
$fh->close();
Process_datatypes(@DATA_STORAGE);
Print_Possible_Datatypes(@POSSIBLE_DATA_TYPES);
Process_opcode(@DATA_STORAGE);