*** D80 (Disk image of an 8050 diskette, single-sided)
*** D82 (Disk image of an 8250 diskette, double-sided)
*** Document revision: 1.2
*** Last updated: Nov 27, 2005
*** Contributors/sources: "Complete Commodore Innerspace Anthology"
This is a sector-for-sector copy of an 8x50 floppy disk. The file size
for an 8050 image is 533248 bytes, and the 8250 image is 1066496 bytes. It
is comprised of 256-byte sectors arranged across 77 tracks (or 154 for an
8250), with a varying number of sectors per track for a total of 2083
sectors (or 4166 for an 8250). Track counting starts at 1 (not 0) and
sector counting starts at 0 (not 1), therefore a track with 29 sectors will
go from 0 to 28.
The only sample files I had to work with were those created by the VICE
emulator. I can only assume that the way VICE worked with the image is
correct and all of the image specifics contained herein are based on those
samples. Any deviation from the way that the 8x50 drive actually works
unfortunate but unavoidable.
The original media (a 5.25" disk) has the tracks laid out in circles,
with track 1 on the very outside of the disk (closest to the sides) to
track 77 being on the inside of the disk (closest to the inner hub ring).
Commodore, in their infinite wisdom, varied the number of sectors per track
and data densities across the disk to optimize available storage, resulting
in the chart below. It shows the sectors/track for a D80 and D82. Since the
outside diameter of a circle is the largest (versus closer to the center),
the outside tracks have the largest amount of storage.
Track Range Sectors/track # Sectors
-------------- ------------- ---------
1-39, 78-116 29 1131
40-53, 117-130 27 378
54-64, 131-141 25 275
65-77, 142-154 23 299
----
Total 2083 (double this for an 8250)
Track #Sect #SectorsIn D8x Offset | Track #Sect #SectorsIn D8x Offset
----- ----- ---------- ---------- | ----- ----- ---------- ----------
1 29 0 $000000 | 78 29 2083 $82300
2 29 29 1D00 | 79 29 2112 84000
3 29 58 3A00 | 80 29 2141 85D00
4 29 87 5700 | 81 29 2170 87A00
5 29 116 7400 | 82 29 2199 89700
6 29 145 9100 | 83 29 2228 8B400
7 29 174 AE00 | 84 29 2257 8D100
8 29 203 CB00 | 85 29 2286 8EE00
9 29 232 E800 | 86 29 2315 90600
10 29 261 10500 | 87 29 2344 92800
11 29 290 12200 | 88 29 2373 94500
12 29 319 13F00 | 89 29 2402 96200
13 29 348 15C00 | 90 29 2431 97F00
14 29 377 17900 | 91 29 2460 99C00
15 29 406 19600 | 92 29 2489 9B900
16 29 435 1B300 | 93 29 2518 9D600
17 29 464 1D000 | 94 29 2547 9F300
18 29 493 1ED00 | 95 29 2576 A1000
19 29 522 20A00 | 96 29 2605 A2D00
20 29 551 22700 | 97 29 2634 A4A00
21 29 580 24400 | 98 29 2663 A6700
22 29 609 26100 | 99 29 2692 A8400
23 29 638 27E00 | 100 29 2721 AA100
24 29 667 29B00 | 101 29 2750 A6E00
25 29 696 2B800 | 102 29 2779 ADB00
26 29 725 2D500 | 103 29 2808 AF800
27 29 754 2F200 | 104 29 2837 B1500
28 29 783 30F00 | 105 29 2866 B3200
29 29 812 32C00 | 106 29 2895 B4F00
30 29 841 34900 | 107 29 2924 B6C00
31 29 870 36600 | 108 29 2953 B8900
32 29 899 38300 | 109 29 2982 BA600
33 29 928 3A000 | 110 29 3011 BC300
34 29 957 3BD00 | 111 29 3040 BE000
35 29 986 3DA00 | 112 29 3069 BFD00
36 29 1015 3F700 | 113 29 3098 C1A00
37 29 1044 41400 | 114 29 2137 C3700
38 29 1073 43100 | 115 29 3156 C5400
39 29 1102 44E00 | 116 29 3185 C7100
40 27 1131 46B00 | 117 27 3214 C8E00
41 27 1158 48600 | 118 27 3241 CA900
42 27 1185 4A100 | 119 27 3268 CC400
43 27 1212 4BC00 | 120 27 3295 CDF00
44 27 1239 4D700 | 121 27 3322 CFA00
45 27 1266 4F200 | 122 27 3349 D1500
46 27 1293 50D00 | 123 27 3376 D3000
47 27 1320 52800 | 124 27 3403 D4B00
48 27 1347 54300 | 125 27 3430 D6600
49 27 1374 55E00 | 126 27 3457 D8100
50 27 1401 57900 | 127 27 3484 D9C00
51 27 1428 59400 | 128 27 3511 DB700
52 27 1455 5AF00 | 129 27 3538 DD200
53 27 1482 5CA00 | 130 27 3565 DED00
54 25 1509 5E500 | 131 25 3592 E0800
55 25 1534 5FE00 | 132 25 3617 E2100
56 25 1559 61700 | 133 25 3642 E3A00
57 25 1584 63000 | 134 25 3667 E5300
58 25 1609 64900 | 135 25 3692 E6C00
59 25 1634 66200 | 136 25 3717 E8500
60 25 1659 67B00 | 137 25 3742 E9E00
61 25 1684 69400 | 138 25 3767 E6700
62 25 1709 6AD00 | 139 25 3792 ED000
63 25 1734 6C600 | 140 25 3817 EE900
64 25 1759 6DF00 | 141 25 3842 F0200
65 23 1784 6F800 | 142 23 3867 F1B00
66 23 1807 70F00 | 143 23 3890 F3200
67 23 1830 72600 | 144 23 3913 F4900
68 23 1853 73D00 | 145 23 3936 F6000
69 23 1876 75400 | 146 23 3959 F7700
70 23 1899 76B00 | 147 23 3982 F8E00
71 23 1922 78200 | 148 23 4005 FA500
72 23 1945 79900 | 149 23 4028 FBC00
73 23 1968 7B000 | 150 23 4051 FD300
74 23 1991 7C700 | 151 23 4074 FEA00
75 23 2014 7DE00 | 152 23 4097 100100
76 23 2037 7F500 | 153 23 4120 101800
77 23 2060 80C00 | 154 23 4143 102F00
The BAM (Block Availability Map) is on track 38. The D80 is only 77
tracks and so the BAM is contained on 38/0 and 38/3. The D82 contains 154
tracks and so the BAM is larger and is contained on 38/0, 38/3, 38/6 and
38/9. The BAM interleave is 3.
The directory is on track 39, with 39/0 contains the header (DOS type,
disk name, disk ID's) and sectors 1-28 contain the directory entries. Both
files and the directory use an interleave of 1. Since the directory is only
28 sectors large (29 less one for the header), and each sector can contain
only 8 entries (32 bytes per entry), the maximum number of directory
entries is 28 * 8 = 224. The first directory sector is always 39/1. It then
follows a chain structure using a sector interleave of 1 making the links
go 39/1, 39/2, 39/3 etc.
When reading a disk, you start with 39/0 (disk label/ID) which points to
38/0 (BAM0), 38/3 (BAM1), 38/6 (BAM2, D82 only), 38/9 (BAM3, D82 only), and
finally to 39/1 (first dir entry sector). When writing a file to a blank
disk, it will start at 38/1 because 38/0 is already allocated.
Below is a dump of the header sector 39/0:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
----------------------------------------------- ----------------
00: 26 00 43 00 00 00 73 61 6D 70 6C 65 20 64 38 30 &?C???sample?d80
10: A0 A0 A0 A0 A0 A0 A0 A0 65 72 A0 32 43 A0 A0 A0 ????????er?2C???
20: A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
...
F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
Byte:$00-01: T/S pointer to first BAM sector (38/0)
02: $43 'C' is for DOS format version
03: Reserved
04-05: Unused
06-16: Disk name, padded with 0xA0 ("sample d80")
17: 0xA0
18-19: Disk ID bytes "er"
1A: 0xA0
1B-1C: DOS version bytes "2C".
1D-20: 0xA0
21-FF: Unused
Below is a dump of the first directory sector, 39/1
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
----------------------------------------------- ----------------
00: 27 02 82 26 01 54 45 53 54 A0 A0 A0 A0 A0 A0 A0 '??&?TEST???????
10: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 01 00 ????????????????
20: 00 00 82 26 02 54 45 53 54 32 A0 A0 A0 A0 A0 A0 ???&?TEST2??????
30: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 01 00 ????????????????
40: 00 00 82 26 04 54 45 53 54 33 A0 A0 A0 A0 A0 A0 ???&?TEST3??????
50: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 05 00 ????????????????
60: 00 00 82 26 0B 54 45 53 54 34 A0 A0 A0 A0 A0 A0 ???&?TEST4??????
70: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 09 00 ????????????????
80: 00 00 82 26 14 54 45 53 54 35 A0 A0 A0 A0 A0 A0 ???&?TEST5??????
90: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 0C 00 ????????????????
A0: 00 00 82 28 00 54 45 53 54 36 A0 A0 A0 A0 A0 A0 ???(?TEST6??????
B0: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 01 00 ????????????????
C0: 00 00 82 28 01 54 45 53 54 37 A0 A0 A0 A0 A0 A0 ???(?TEST7??????
D0: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 01 00 ????????????????
E0: 00 00 82 28 02 54 45 53 54 38 A0 A0 A0 A0 A0 A0 ???(?TEST8??????
F0: A0 A0 A0 A0 A0 00 00 00 00 00 00 00 00 00 01 00 ????????????????
The first two bytes of the directory sector ($27/$02) indicate the
location of the next track/sector of the directory (39/2). If the track is
set to $00, then it is the last sector of the directory.
When the directory is done, the track value will be $00. The sector link
should contain a value of $FF, meaning the whole sector is allocated, but
the actual value doesn't matter. The drive will return all the available
entries anyways. This is a breakdown of a standard directory sector and
entry:
Bytes: $00-1F: First directory entry
00-01: Track/Sector location of next directory sector ($00 $00 if
not the first entry in the sector)
02: File type.
Typical values for this location are:
$00 - Scratched (deleted file entry)
80 - DEL
81 - SEQ
82 - PRG
83 - USR
84 - REL
Bit 0-3: The actual filetype
000 (0) - DEL
001 (1) - SEQ
010 (2) - PRG
011 (3) - USR
100 (4) - REL
Values 5-15 are illegal, but if used will produce
very strange results.
Bit 4: Not used
Bit 5: Used only during SAVE-@ replacement
Bit 6: Locked flag (Set produces ">" locked files)
Bit 7: Closed flag (Not set produces "*", or "splat"
files)
03-04: Track/sector location of first sector of file
05-14: 16 character filename (in PETASCII, padded with $A0)
15-16: Track/Sector location of first side-sector block (REL file
only)
17: REL file record length (REL file only, max. value 254)
18-1D: Unused
1E-1F: File size in sectors, low/high byte order ($1E+$1F*256).
The approx. filesize in bytes is <= #sectors * 254
20-3F: Second dir entry. From now on the first two bytes of each
entry in this sector should be $00 $00, as they are
unused.
40-5F: Third dir entry
60-7F: Fourth dir entry
80-9F: Fifth dir entry
A0-BF: Sixth dir entry
C0-DF: Seventh dir entry
E0-FF: Eighth dir entry
The BAM only occupies up to four sectors on track 38, so the rest of the
track is empty and is available for file storage. Below is a dump of the
first BAM block, 38/0. A D80 will only contain two BAM sectors, 38/0 and
38/3. A D82 needs two extra BAM sectors for the extra tracks. Each entry
takes 5 bytes, 1 for the free count on that track, and 4 for the BAM bits.
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
----------------------------------------------- ----------------
00: 26 03 43 00 01 33 1D FF FF FF 1F 1D FF FF FF 1F &?C??3??????????
10: 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D ????????????????
20: FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF ????????????????
30: FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF ????????????????
40: FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF ????????????????
50: 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F ????????????????
60: 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D ????????????????
70: FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF ????????????????
80: FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF ????????????????
90: FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF ????????????????
A0: 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F ????????????????
B0: 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1B ????????????????
C0: F6 FF FF 1F 1B FC FF FF 1F 1B FF FF FF 07 1B FF ????????????????
D0: FF FF 07 1B FF FF FF 07 1B FF FF FF 07 1B FF FF ????????????????
E0: FF 07 1B FF FF FF 07 1B FF FF FF 07 1B FF FF FF ????????????????
F0: 07 1B FF FF FF 07 1B FF FF FF 07 1B FF FF FF 07 ????????????????
Byte:$00-01: T/S pointer to second BAM sector (38/3)
02: DOS version byte (0x43='C')
03: Reserved
04: Lowest track covered by this BAM (0x01=1)
05: Highest+1 track covered by this BAM (0x33=51)
06-0A: BAM for track 1. The first byte shows the "blocks free" for
this track, the remaining 4 show the BAM for the track.
0B-0F: BAM for track 2
...
FB-FF: BAM for track 50
Being bit-based, the BAM entries need some explanation. The first track
entry in the above BAM sector is at offset 06, "1D FF FF FF 1F". The first
number is how many blocks are free on this track ($1D=29) and the remainder
is the bit representation of the usage map for the track. These entries
must be viewed in binary to make any sense. First convert the values to
binary:
FF=11111111, FF=11111111, FF=11111111, 1F=00011111
In order to make any sense from the binary notation, flip the bits around.
111111 11112222 222222
01234567 89012345 67890123 456789...
-------------------------- ---------
11111111 11111111 11111111 11111000
^ ^
sector 0 sector 28
Since we are on the first track, we have 29 sectors, and only use up to
the bit 28 position. If a bit is on (1), the sector is free. Therefore,
track 1 is clean, all sectors are free. Any leftover bits that refer to
sectors that don't exist, like bits 29-31 in the above example, are set to
allocated.
Second BAM block 38/3, D80 only.
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
----------------------------------------------- ----------------
00: 27 01 43 00 33 4E 1B FF FF FF 07 1B FF FF FF 07 '?C?3N??????????
10: 1B FF FF FF 07 19 FF FF FF 01 19 FF FF FF 01 19 ????????????????
20: FF FF FF 01 19 FF FF FF 01 19 FF FF FF 01 19 FF ????????????????
30: FF FF 01 19 FF FF FF 01 19 FF FF FF 01 19 FF FF ????????????????
40: FF 01 19 FF FF FF 01 19 FF FF FF 01 17 FF FF 7F ???????????????
50: 00 17 FF FF 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 ?????????????
60: 17 FF FF 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 17 ?????????????
70: FF FF 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 17 FF ?????????????
80: FF 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 00 00 00 ?????????????
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
A0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
C0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
D0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
E0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
F0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
Byte:$00-01: T/S pointer to first directory sector (39/1)
02: DOS version byte (0x43 'C')
03: Reserved
04: Lowest track covered by this BAM (0x33=51)
05: Highest+1 track covered by this BAM (0x43=78)
06-0A: BAM for track 51. The first byte shows the "blocks free" for
this track, the remaining 4 show the BAM for the track.
0B-0F: BAM for track 52
...
88-8C: BAM for track 77
8D-FF: Not used for an D80 (8050)
Second BAM block 38/3, D82 only
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
----------------------------------------------- ----------------
00: 26 06 43 00 33 65 1B FF FF FF 07 1B FF FF FF 07 &?C?3e??????????
10: 1B FF FF FF 07 19 FF FF FF 01 19 FF FF FF 01 19 ????????????????
20: FF FF FF 01 19 FF FF FF 01 19 FF FF FF 01 19 FF ????????????????
30: FF FF 01 19 FF FF FF 01 19 FF FF FF 01 19 FF FF ????????????????
40: FF 01 19 FF FF FF 01 19 FF FF FF 01 17 FF FF 7F ???????????????
50: 00 17 FF FF 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 ?????????????
60: 17 FF FF 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 17 ?????????????
70: FF FF 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 17 FF ?????????????
80: FF 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 1D FF FF ?????????????
90: FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF ????????????????
A0: 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F ????????????????
B0: 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D ????????????????
C0: FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF ????????????????
D0: FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF ????????????????
E0: FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF ????????????????
F0: 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F ????????????????
Byte:$00-01: T/S pointer to second BAM sector (38/6)
02: DOS version byte (0x43='C')
03: Reserved
04: Lowest track covered by this BAM (0x33=51)
05: Highest+1 track covered by this BAM (0x65=101)
06-0A: BAM for track 51. The first byte shows the "blocks free" for
this track, the remaining 4 show the BAM for the track.
0B-0F: BAM for track 52
...
FB-FF: BAM for track 100
Third BAM block 38/6, D82 only
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
----------------------------------------------- ----------------
00: 26 09 43 00 65 97 1D FF FF FF 1F 1D FF FF FF 1F &?C?e???????????
10: 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D ????????????????
20: FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF ????????????????
30: FF FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF ????????????????
40: FF 1F 1D FF FF FF 1F 1D FF FF FF 1F 1D FF FF FF ????????????????
50: 1F 1D FF FF FF 1F 1B FF FF FF 07 1B FF FF FF 07 ????????????????
60: 1B FF FF FF 07 1B FF FF FF 07 1B FF FF FF 07 1B ????????????????
70: FF FF FF 07 1B FF FF FF 07 1B FF FF FF 07 1B FF ????????????????
80: FF FF 07 1B FF FF FF 07 1B FF FF FF 07 1B FF FF ????????????????
90: FF 07 1B FF FF FF 07 1B FF FF FF 07 19 FF FF FF ????????????????
A0: 01 19 FF FF FF 01 19 FF FF FF 01 19 FF FF FF 01 ????????????????
B0: 19 FF FF FF 01 19 FF FF FF 01 19 FF FF FF 01 19 ????????????????
C0: FF FF FF 01 19 FF FF FF 01 19 FF FF FF 01 19 FF ????????????????
D0: FF FF 01 17 FF FF 7F 00 17 FF FF 7F 00 17 FF FF ??????????????
E0: 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 17 FF FF 7F ????????????
F0: 00 17 FF FF 7F 00 17 FF FF 7F 00 17 FF FF 7F 00 ?????????????
Byte:$00-01: T/S pointer to fourth BAM sector (38/9)
02: DOS version byte (0x43='C')
03: Reserved
04: Lowest track covered by this BAM (0x65=101)
05: Highest+1 track covered by this BAM (0x97=151)
06-0A: BAM for track 101. The first byte shows the "blocks free"
for this track, the remaining 4 show the BAM for the track.
0B-0F: BAM for track 102
...
FB-FF: BAM for track 150
Fourth BAM block 38/9, D82 only
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII
----------------------------------------------- ----------------
00: 27 01 43 00 97 9B 17 FF FF 7F 00 17 FF FF 7F 00 '?C???????????
10: 17 FF FF 7F 00 17 FF FF 7F 00 00 00 00 00 00 00 ??????????????
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ????????????????
Byte:$00-01: T/S pointer to first directory sector (39/1)
02: DOS version byte (0x43 'C')
03: Reserved
04: Lowest track covered by this BAM (0x97=151)
05: Highest+1 track covered by this BAM (0x9B=155)
06-0A: BAM for track 151. The first byte shows the "blocks free" for
this track, the remaining 4 show the BAM for the track.
0B-0F: BAM for track 152
...
15-19: BAM for track 154
1A-FF: Not used
For more information on file storage, GCR layout, or disk errors see the
D64.TXT and G64.TXT documents.
|