aboutsummaryrefslogtreecommitdiffstats
path: root/tools/makedisk.pl
blob: 8d8a5e9850b2cda008500873aad2a90163ffb8d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/usr/bin/perl
#
# This creates four empty UFD-DOS volumes of ~15 MB each,
# specifically 238x256x256 = 15,597,568 (0xee0000) bytes,
# which is the largest volume that UFD-DOS can safely address.
#
# The total capacity is 62,390,272 bytes, which should fit on
# a "64 MB" CF card even with the "modern" definitions of 64 MB...
#

use bytes;
binmode STDOUT;

$at = "\xc0" x 256;		# Fill for uninitialized sectors
$ff = "\xff" x 256;

for ( $v = 0 ; $v < 4 ; $v++ ) {
    # Track 0: Sector 14 -> bitmap, 15 -> init bitmap, 16+ -> dirmap?
    for ( $i = 0 ; $i < 14 ; $i++ ) {
	print $at;
    }
    for ( $i = 14 ; $i < 16 ; $i++ ) {
	# First cluster (32 sectors) occupied by system info
	# There seems to be a bug in UFD-DOS that it will continue
	# an extent out from the end of the disk if there is not
	# a "busy" cluster at the end of the bitmap.  Thus we limit
	# ourselves to 238 tracks.
	# 239 bytes occupied by cluster information (0 for empty; the first
	# should be 80 to protect the system sectors)
	# (the last must be FF
	# for the reason described above)
	# 16 bytes occupied by root directory information (01 for empty)
	# 1 spare byte (always zero?)
	# THIS IS THE REAL ONE...
	print "\x80", "\x00" x 237, "\xff", "\1" x 16, "\0";
	# HACK TO TEST UNDER NEAR FULL CONDITIONS
	# print "\xff" x 237, "\x00", "\xff", "\1" x 16, "\0";
    }
    for ( $i = 16 ; $i < 32 ; $i++ ) {
	# Root directory sector
	print "\0" x 16, "\xff" x 240;
    }
    for ( $i = 32 ; $i < 256 ; $i++ ) {
	print $at;
    }
    
    # Track 1-237
    for ( $i = 1 ; $i < 238 ; $i++ ) {
	# Sector
	for ( $j = 0 ; $j < 256 ; $j++ ) {
	    print $at;
	}
    }
}