mirror of
https://github.com/DoctorWkt/pdp7-unix.git
synced 2026-01-13 15:27:39 +00:00
53 lines
1.4 KiB
Perl
Executable File
53 lines
1.4 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
#
|
|
# sdump: Dump the contents of a filesystem in SimH format
|
|
#
|
|
# (c) 2016 Warren Toomey, GPL3
|
|
#
|
|
use strict;
|
|
use warnings;
|
|
use Fcntl qw(:flock SEEK_SET);
|
|
|
|
### read a word from a file in SimH format
|
|
### return -1 on EOF
|
|
sub read_word {
|
|
my $F = shift;
|
|
# Convert four bytes into one 18-bit word
|
|
return -1 if ( read( $F, my $four, 4 ) != 4 ); # Not enough bytes read
|
|
my ( $b1, $b2, $b3, $b4 ) = unpack( "CCCC", $four );
|
|
return (($b1 & 0xff) |
|
|
(($b2 & 0xff) << 8 ) |
|
|
(($b3 & 0xff) << 16) |
|
|
(($b4 & 0xff) << 24));
|
|
}
|
|
|
|
### Main program
|
|
die("Usage: $0 imagefile\n") if (@ARGV!=1);
|
|
|
|
open(my $IN, "<", $ARGV[0]) || die("Couldn't open $ARGV[0]: $!\n");
|
|
|
|
use constant NUMBLOCKS => 8000; # Number of blocks on a surface
|
|
use constant WORDSPERBLK => 64; # 64 words per block
|
|
use constant BYTESPERWORD => 4; # We encode each word into 4 bytes
|
|
|
|
# Skip the first surface
|
|
seek($IN, NUMBLOCKS*WORDSPERBLK*BYTESPERWORD, SEEK_SET) ||
|
|
die("Cannot seek: $!\n");
|
|
|
|
foreach my $blocknum ( 0 .. NUMBLOCKS*2 - 1 ) {
|
|
printf("Block %d (%06o)\n", $blocknum, $blocknum );
|
|
foreach my $line ( 0 .. 7 ) {
|
|
|
|
# Print out the words in octal
|
|
foreach my $offset ( 0 .. 7 ) {
|
|
# Get a word
|
|
my $word= read_word($IN);
|
|
exit(0) if ($word==-1);
|
|
printf("%06o ", $word);
|
|
}
|
|
print("\n");
|
|
}
|
|
print("\n");
|
|
}
|
|
exit(0);
|