86F
A floppy disk surface image format which stores data in FM- or MFM-encoded transitions.
Specification for v2.12
All offsets are in hexadecimal.
00000000: Magic 4 bytes ("86BF")
00000004: Minor version (0C)
00000005: Major version (02)
00000006: Disk flags (16-bit)
Bit 0 Has surface description data (1 = yes, 0 = no)
This data indicates if the corresponding bit on the FM/MFM
encoded surface is a normal bit or a special bit (weak bit
or hole, depending on the other bit):
0 = The corresponding FM/MFM encoded surface bit is normal
1 = The corresponding FM/MFM encoded surface bit is either
a weak bit or a hole:
Corresponding FM/MFM encoded bit is 0:
Hole (noise on read, not overwritable)
Corresponding FM/MFM encoded bit is 1:
Weak bit (noise on read, overwritable)
Bits 2, 1 Hole (3 = ED + 2000 kbps, 2 = ED, 1 = HD, 0 = DD)
Bit 3 Sides (1 = 2 sides, 0 = 1 side)
Bit 4 Write protect (1 = yes, 0 = no)
Bits 6, 5 RPM slowdown (3 = 2%, 2 = 1.5%, 1 = 1%, 0 = 0%)
Bit 7 Bitcell mode (1 = Extra bitcells count specified after
disk flags, 0 = No extra bitcells)
The maximum number of extra bitcells is 1024 (which
after decoding translates to 64 bytes)
Bit 8 Disk type (1 = Zoned, 0 = Fixed RPM)
Bits 10, 9 Zone type (3 = Commodore 64 zoned, 2 = Apple zoned,
1 = Pre-Apple zoned #2, 0 = Pre-Apple zoned #1)
Ignore if disk type is 0 (fixed RPM)
Bit 11 Data and surface bits are stored in reverse byte endianness
Bit 12 If set:
If bits 6, 5 are not 0, they specify % of speedup instead
of slowdown;
If bits 6, 5 are 0, and bit 7 is 1, the extra bitcell count
specifies the entire bitcell count
For converting other stuff to 86F, I recommend to set this bit
and bit 7 and clear bits 6 and 5,
and just specify the entire bitcell count.
00000008: Offsets of tracks
Note that thick-track (eg. 360k) disks will have (tracks * 2) tracks, with each
pair of tracks being identical to each other.
Each side of each track is stored as its own track, in order (so, track 0 side 0,
track 0 side 1, track 1 side 0, track 1 side 0, etc.).
Track offset + 00000000: Track flags (16-bit)
Bits 7, 6, 5 RPM:
000 = 300 rpm
001 = 360 rpm
Bits 4, 3 Encoding:
00 = FM
01 = MFM
10 = M2FM
11 = GCR
Bits 2, 1, 0 Bit rate, if encoding is MFM:
000 = 500 kbps
001 = 300 kbps
010 = 250 kbps
011 = 1000 kbps
101 = 2000 kbps
If encoding is FM, the bit rate is half that.
If the bitcell count is present:
Track offset + 00000002: Extra (or total, depending on disk flags) bit cells count (32-bit)
If this specifies extra bit cells rather than total, it is a signed
integer, and when negative, makes the track smaller.
Track offset + 00000006: Bit cell where index hole is (32-bit)
Track offset + 0000000A: FM/MFM/M2FM/GCR-encoded data (track length bytes)
Track offset + 0000000A + track length: Surface description data if present (track length bytes)
Else:
Track offset + 00000002: Bit cell where index hole is (32-bit)
Track offset + 00000006: FM/MFM/M2FM/GCR-encoded data (track length bytes)
Track offset + 00000006 + track length: Surface description data if present (track length bytes)
Track lengths if the bitcell count is not present or it does not represent total bit cells:
Hole 0 (DD) or 1 (HD):
2.0% RPM slowdown: 12750 words
1.5% RPM slowdown: 12687 words
1.0% RPM slowdown: 12625 words
0.0% RPM slowdown/speedup: 12500 words
1.0% RPM speedup : 12376 words
1.5% RPM speedup : 12315 words
2.0% RPM speedup : 12254 words
Hole 2 (ED):
2.0% RPM slowdown: 25250 words
1.5% RPM slowdown: 25375 words
1.0% RPM slowdown: 25250 words
0.0% RPM slowdown/speedup: 25000 words
1.0% RPM speedup : 24752 words
1.5% RPM speedup : 24630 words
2.0% RPM speedup : 24509 words
Hole 3 (ED + 2000 kbps):
2.0% RPM slowdown: 51000 words
1.5% RPM slowdown: 50750 words
1.0% RPM slowdown: 50500 words
0.0% RPM slowdown/speedup: 50000 words
1.0% RPM speedup : 49504 words
1.5% RPM speedup : 49261 words
2.0% RPM speedup : 49019 words
1 word = 2 bytes (so 16 bits)
If extra bit cells count is present and it indicates extra bit cells count:
Track length = (Track length << 4) + Extra bitcells count
If (Track length & 15)
Track length + (Track length >> 4) + 1
Else
Track length + (Track length >> 4)
If extra bit cells count is present and it indicates total bit cells count,
then the total bit cells count become the track length, padded upwards to the
nearest word in the file.