File: microcode_info.pl

package info (click to toggle)
em8300 0.14.0-2
  • links: PTS
  • area: contrib
  • in suites: sarge
  • size: 2,828 kB
  • ctags: 1,660
  • sloc: ansic: 11,095; sh: 8,892; perl: 1,338; makefile: 479
file content (58 lines) | stat: -rwxr-xr-x 936 bytes parent folder | download
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/perl

sub decrypt {
  my $data=shift;
  my $len=shift;
  my $outdata;
  my $chr;

  for(my $i=0; $i < $len; $i++) {
    $chr = ord(substr($data, $i, 1));
    if($chr) {
      $outdata .= chr($chr ^ 0xff);
    }
  }
  return $outdata;
}

sub print_binstr {
  my $chr;
  my $data=shift;
  my $len=shift;

  for(my $i=0; $i < $len; $i++) {
    printf("0x%02x,",ord(substr($data, $i, 1)));
    if( $i && !(($i+1) % 8) ) {
      print "\n";
    }
  }  
}

undef $/;
$ucode = <>;

while(1) {
  ($flags,$offset,$len) = unpack('vVV',$ucode);
  $len*=2;

  printf("Flags:  0x%x\n",$flags);
  printf("Offset: 0x%x\n",$offset);
  printf("Len:    0x%x\n",$len);

  $data = substr($ucode,10,$len);
  
  if(!$flags) { last; } 
  
  if($flags & 0x200) {
    $data = decrypt($data,$len);
    print "Name: $data\n";
  }
  
  if(($flags & 0xf00) == 0) {
    print_binstr($data,$len);
  }
  
  print "\n";

  $ucode = substr($ucode,10+$len);
}