1 | ## ----------------------------------------------------------------------- |
---|
2 | ## |
---|
3 | ## Copyright 2011 Gene Cumm |
---|
4 | ## |
---|
5 | ## This program is free software; you can redistribute it and/or modify |
---|
6 | ## it under the terms of the GNU General Public License as published by |
---|
7 | ## the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
---|
8 | ## Boston MA 02111-1307, USA; either version 2 of the License, or |
---|
9 | ## (at your option) any later version; incorporated herein by reference. |
---|
10 | ## |
---|
11 | ## ----------------------------------------------------------------------- |
---|
12 | |
---|
13 | ## |
---|
14 | ## mk-lba-img.pl |
---|
15 | ## |
---|
16 | ## Make an image where each sector contains the LBA of the sector with |
---|
17 | ## a head of an input file. |
---|
18 | ## |
---|
19 | |
---|
20 | # use bytes; |
---|
21 | |
---|
22 | use constant SECTOR_SIZE => 512; |
---|
23 | use constant LBA_SIZE => 8; |
---|
24 | use constant LONG_SIZE => 4; |
---|
25 | use constant NUM_SECTORS => (256*63+1); |
---|
26 | # use constant NUM_SECTORS => 5; |
---|
27 | use constant DEBUG => 1; |
---|
28 | |
---|
29 | # sub dprint |
---|
30 | # { |
---|
31 | # if (DEBUG) { |
---|
32 | # print($_); |
---|
33 | # } |
---|
34 | # } |
---|
35 | |
---|
36 | ($ifilen, $ofilen) = @ARGV; |
---|
37 | |
---|
38 | if ((!defined($ifilen)) || ($ifilen eq "-")) { # |
---|
39 | print(STDERR "Using stdin\n"); |
---|
40 | $IFILE = STDIN; |
---|
41 | } else { |
---|
42 | open($IFILE, '<', $ifilen) or die "open:$!"; |
---|
43 | print(STDERR "Using $ifilen\n"); |
---|
44 | } |
---|
45 | |
---|
46 | binmode($ifile); |
---|
47 | |
---|
48 | if (!defined($ofilen)) { |
---|
49 | $OFILE = STDOUT; |
---|
50 | } else { |
---|
51 | open($OFILE, '>', $ofilen) or die "open:$!"; |
---|
52 | print(STDERR "Using $ofilen\n"); |
---|
53 | } |
---|
54 | |
---|
55 | binmode($OFILE); |
---|
56 | |
---|
57 | # $pk0 = pack('L', 0); |
---|
58 | $n_long = (SECTOR_SIZE/LONG_SIZE); |
---|
59 | $n_lba = (SECTOR_SIZE/LBA_SIZE); |
---|
60 | |
---|
61 | $len=0; |
---|
62 | while ( read($IFILE, $ch, 1) ) { |
---|
63 | print($OFILE $ch); |
---|
64 | $len++; |
---|
65 | } |
---|
66 | $tail = (SECTOR_SIZE - ($len % SECTOR_SIZE)) % SECTOR_SIZE; |
---|
67 | $ch = pack("C", 0); |
---|
68 | print("Len: $len\ttail: $tail\n"); |
---|
69 | for ($i=0; $i<$tail; $i++) { |
---|
70 | print($OFILE $ch); |
---|
71 | } |
---|
72 | |
---|
73 | $st = ($len + $tail) / SECTOR_SIZE; |
---|
74 | |
---|
75 | for ($i=$st; $i<(NUM_SECTORS); $i++) { |
---|
76 | @ia = (); |
---|
77 | for ($j=0; $j< $n_lba; $j++) { |
---|
78 | push(@ia, $i, 0); |
---|
79 | } |
---|
80 | @ipk = pack("L[$n_long]", @ia); |
---|
81 | # There is a 64-bit INT conversion but it normally isn't usable |
---|
82 | # on a 32-bit platform |
---|
83 | print($OFILE @ipk); # Gently simulate a 64-bit LBA |
---|
84 | } |
---|
85 | |
---|
86 | if (defined($ifilen) && (!($ifilen eq "-"))) { |
---|
87 | close($IFILE); |
---|
88 | } |
---|
89 | |
---|
90 | if (defined($ofilen)) { |
---|
91 | close($OFILE); |
---|
92 | } |
---|
93 | |
---|
94 | exit 0; |
---|