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.