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.