From 111e3ac37e61a1d30863de0892e17acabb89fe42 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 11 Oct 2024 16:21:06 -0300 Subject: [PATCH] Replace 86F spec with v2.12 --- dev/formats/86f.rst | 168 ++++++++++++++++++++++++++++---------------- 1 file changed, 107 insertions(+), 61 deletions(-) diff --git a/dev/formats/86f.rst b/dev/formats/86f.rst index 024358b..fd0eb72 100644 --- a/dev/formats/86f.rst +++ b/dev/formats/86f.rst @@ -3,69 +3,115 @@ A floppy disk surface image format which stores data in FM- or MFM-encoded transitions. -Preliminary specification for v2.20 ------------------------------------ +Specification for v2.12 +----------------------- -All offsets are in hexadecimal. This specification is subject to change before its final release. +All offsets are in hexadecimal. .. code-block:: none - 00000000: Magic 4 bytes ("86BF") - 00000004: Minor version (0x14) - 00000005: Major version (0x02) - 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) - Bit 5 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 6 Revolutions (0 = one revolution, 1 track has 16-bit number of revolutions) - 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.). - The table of the offsets of tracks is 2048 bytes long, each track offset is an unigned 32-bit - integer. An offset of 00000000 indicates the track is not present in the file. - As an example, an 86F representing a disk with 80 thin tracks and 2 sides per track, where all - the tracks are present in the file, would have the first 160 offsets filled in, same for a disk - with 40 thick tracks and 2 sides. Same with only 1 side but only the offsets at 0000000, 0000008, - etc. (so every second offset) would be filled in. - - Track offset + 00000000: Track flags (16-bit) - 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. - The RPM is determined from track length and data rate. - Track offset + 00000002: Total bit cells count (32-bit) - 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) +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.). - If this is a multi-revolution 86F, then track offset + 00000000 has a 16-bit number of track revolutions, - and the track header + data appears for each revolution, while surface description data, if present, - can appear any number of times, but only once per encoding + bit rate combination. - This needs work to properly make surface data work with flexible multi-revolution support. - - Track lengths: - The total bit cells count is always present. - The track is stored as (bit cells >> 8) bytes, with one extra bit cells if the number of bit cells - is not divisible by 8. +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.