File: microcode_info.pl

package info (click to toggle)
em8300 0.16.0-2
  • links: PTS
  • area: contrib
  • in suites: etch, etch-m68k
  • size: 2,024 kB
  • ctags: 1,492
  • sloc: ansic: 11,554; sh: 3,849; perl: 1,353; makefile: 429
file content (58 lines) | stat: -rwxr-xr-x 960 bytes parent folder | download | duplicates (2)
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);
}