[Feature request] Support for .86F (86box)

HxC Floppy Emulator on IBM PC and compatible support
Post Reply
Moebius
Posts: 2
Joined: Thu Dec 26, 2019 11:14 pm
Contact:

[Feature request] Support for .86F (86box)

Post by Moebius » Wed Mar 18, 2020 1:10 am

Hi!

Would it be possible to add support for 86box (PCem fork) native .86F format? I've already contacted Jean-Francois by email but I thought I should post it here just in case. The emulator is not as popular as PCem or DOSBox yet, but it is VERY promising. Take a look at .86F specifications, please:

Code: Select all

00000000: Magic 4 bytes ("86BF")
00000004: Minor version (0E)
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)
    Bit 11      Data and surface bits are stored in reverse byte endianness
    Bit 12      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
    Bit 13      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.).

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 extra 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)
If this is a multi-revolution 86F, then track offset + 00000004 has a 16-bit number of track revolutions,
everything after it is moved ahead by 2 bytes, and FM/MFM/M2FM/GCR-encoded data appears (number of
revolutions) times rather than once, while surface decription data, if present, only appears once.

Track lengths:
    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.

Moebius
Posts: 2
Joined: Thu Dec 26, 2019 11:14 pm
Contact:

Re: [Feature request] Support for .86F (86box)

Post by Moebius » Fri Mar 20, 2020 12:57 am

Sorry, a little update:

Code: Select all

00000000: Magic 4 bytes ("86BF")
00000004: Minor version (0E)
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)
    Bit 11      Data and surface bits are stored in reverse byte endianness
    Bit 12      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
    Bit 13      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 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 extra 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)
If this is a multi-revolution 86F, then track offset + 00000004 has a 16-bit number of track revolutions,
everything after it is moved ahead by 2 bytes, and FM/MFM/M2FM/GCR-encoded data appears (number of
revolutions) times rather than once, while surface decription data, if present, only appears once.

Track lengths:
    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)
        Track length in these formulae is taken from the tables above.
    If extra bit cells count is present and it indicates total bit cells count,
    then the total bit cells count become the track length.

Post Reply