| ## ----------------------------------------------------------------------- |
| ## |
| ## Copyright 2011 Gene Cumm |
| ## |
| ## This program is free software; you can redistribute it and/or modify |
| ## it under the terms of the GNU General Public License as published by |
| ## the Free Software Foundation, Inc., 53 Temple Place Ste 330, |
| ## Boston MA 02111-1307, USA; either version 2 of the License, or |
| ## (at your option) any later version; incorporated herein by reference. |
| ## |
| ## ----------------------------------------------------------------------- |
| |
| ## |
| ## mk-lba-img.pl |
| ## |
| ## Make an image where each sector contains the LBA of the sector with |
| ## a head of an input file. |
| ## |
| |
| # use bytes; |
| |
| use constant SECTOR_SIZE => 512; |
| use constant LBA_SIZE => 8; |
| use constant LONG_SIZE => 4; |
| use constant NUM_SECTORS => (256*63+1); |
| # use constant NUM_SECTORS => 5; |
| use constant DEBUG => 1; |
| |
| # sub dprint |
| # { |
| # if (DEBUG) { |
| # print($_); |
| # } |
| # } |
| |
| ($ifilen, $ofilen) = @ARGV; |
| |
| if ((!defined($ifilen)) || ($ifilen eq "-")) { # |
| print(STDERR "Using stdin\n"); |
| $IFILE = STDIN; |
| } else { |
| open($IFILE, '<', $ifilen) or die "open:$!"; |
| print(STDERR "Using $ifilen\n"); |
| } |
| |
| binmode($ifile); |
| |
| if (!defined($ofilen)) { |
| $OFILE = STDOUT; |
| } else { |
| open($OFILE, '>', $ofilen) or die "open:$!"; |
| print(STDERR "Using $ofilen\n"); |
| } |
| |
| binmode($OFILE); |
| |
| # $pk0 = pack('L', 0); |
| $n_long = (SECTOR_SIZE/LONG_SIZE); |
| $n_lba = (SECTOR_SIZE/LBA_SIZE); |
| |
| $len=0; |
| while ( read($IFILE, $ch, 1) ) { |
| print($OFILE $ch); |
| $len++; |
| } |
| $tail = (SECTOR_SIZE - ($len % SECTOR_SIZE)) % SECTOR_SIZE; |
| $ch = pack("C", 0); |
| print("Len: $len\ttail: $tail\n"); |
| for ($i=0; $i<$tail; $i++) { |
| print($OFILE $ch); |
| } |
| |
| $st = ($len + $tail) / SECTOR_SIZE; |
| |
| for ($i=$st; $i<(NUM_SECTORS); $i++) { |
| @ia = (); |
| for ($j=0; $j< $n_lba; $j++) { |
| push(@ia, $i, 0); |
| } |
| @ipk = pack("L[$n_long]", @ia); |
| # There is a 64-bit INT conversion but it normally isn't usable |
| # on a 32-bit platform |
| print($OFILE @ipk); # Gently simulate a 64-bit LBA |
| } |
| |
| if (defined($ifilen) && (!($ifilen eq "-"))) { |
| close($IFILE); |
| } |
| |
| if (defined($ofilen)) { |
| close($OFILE); |
| } |
| |
| exit 0; |