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; 95