Added profree.pl

This commit is contained in:
Leeland Heins 2019-01-16 09:26:26 -06:00 committed by GitHub
parent 2e3e94af52
commit 48c704a3e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 123 additions and 0 deletions

View File

@ -12,6 +12,8 @@ package ProDOS;
use strict;
use POSIX;
use PO;
use Exporter::Auto;
@ -836,5 +838,97 @@ sub cat {
}
}
sub get_master_ind_blk {
my ($pofile, $blk, $dbg) = @_;
}
sub get_ind_blk {
my ($pofile, $blk, $dbg) = @_;
}
sub find_file {
my ($pofile, $filename, $dbg) = @_;
}
sub read_file {
my ($pofile, $filename, $dbg) = @_;
}
sub parse_vol_bit_map {
my ($buf, $dbg) = @_;
my @blocks = ();
my (@bytes) = unpack $vol_bit_map_tmpl, $buf;
foreach my $byte (@bytes) {
#print sprintf("%02x ", $byte);
#print sprintf("%08b ", $byte);
push @blocks, $byte;
}
print "\n";
return @blocks;
}
sub get_vol_bit_map {
my ($pofile, $dbg) = @_;
$debug = 1 if defined $dbg && $dbg;
my ($prv_vol_dir_blk, $nxt_vol_dir_blk, $storage_type_name_length, $volname, $creation_ymd, $creation_hm, $version, $min_version, $access, $entry_length, $entries_per_block, $file_count, $bit_map_pointer, $total_blocks, @files) = get_key_vol_dir_blk($pofile, $debug);
my $buf;
#print sprintf("bit_map_pointer=%04x\n", $bit_map_pointer) if $debug;
# Need to use total_blocks to calculate the number of volume bit map blocks.
#print sprintf("total_blocks=%04x\n", $total_blocks);
my $num_tracks = $total_blocks / 8;
#print sprintf("num_tracks=%d\n", $num_tracks);
my $num_vol_bit_map_blks = ceil($num_tracks / 512.0);
#print sprintf("num_vol_bit_map_blks=%d\n", $num_vol_bit_map_blks);
$num_vol_bit_map_blks = 1 if $num_vol_bit_map_blks < 1;
#print sprintf("num_vol_bit_map_blks=%d\n", $num_vol_bit_map_blks);
my @blocks = ();
my $trk = 0;
for (my $blk = $bit_map_pointer; $blk < $bit_map_pointer + $num_vol_bit_map_blks; $blk++) {
if (read_blk($pofile, $bit_map_pointer, \$buf)) {
dump_blk($buf) if $debug;
my (@blks) = parse_vol_bit_map($buf, $debug);
foreach my $blk (@blks) {
#print sprintf("%02x ", $blk);
push @blocks, $blk;
last if $trk++ > $num_tracks;
}
print "\n";
}
}
return @blocks;
}
sub freemap {
my ($pofile, $dbg) = @_;
$debug = 1 if defined $dbg && $dbg;
my (@blocks) = get_vol_bit_map($pofile, $debug);
print " 12345678\n";
print " +--------\n";
my $trk = 0;
foreach my $byte (@blocks) {
my $bits = sprintf("%08b", $byte);
$bits =~ s/[0]/ /g;
$bits =~ s/[1]/\*/g;
print sprintf("%2d |%s\n", $trk++, $bits);
}
print "\n";
}
1;

29
profree.pl Normal file
View File

@ -0,0 +1,29 @@
#!/usr/bin/perl -w
#
# profree.pl:
#
# Utility to get a free sector map of an Apple II ProDOS volume.
#
# 20190116 LSH
#
use strict;
use ProDOS;
my $debug = 0;
while (defined $ARGV[0] && $ARGV[0] =~ /^-/) {
if ($ARGV[0] eq '-d') {
$debug = 1;
shift;
}
}
my $pofile = shift or die "Must supply filename\n";
freemap($pofile, $debug);
1;