95 lines
2.1 KiB
Perl
Executable File
95 lines
2.1 KiB
Perl
Executable File
## -----------------------------------------------------------------------
|
|
##
|
|
## 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;
|