Metropoli BBS
VIEWER: format.txt MODE: TEXT (CP437)
From : Inbar Raz                                            2:403/100.42
Subj : Formatting floppies.                                                  
────────────────────────────────────────────────────────────────────────────────
 >   2. What's the relationship between physical sector numbers and cluster
 >      numbers? If a sector is bad how do I determine which cluster it's
 >      going to belong to? (for updating the FAT)

You have to take into account the following facts:

1. The first cluster number is ALWAYS ___2___. There is no cluster 1 and 0.
2. Clusters refer to _file data_ only. The clusters only point file data, and
   do not include boot sector, FAT and root directory.

   Therefore:

   ClusterNumber:=

((current_track * sectors_per_track) + sector_Number) - Reserved sectors
-------------------------------------------------------------------------
                          sectors_per_cluster

Where reserved sectors contains, according to the Boot Parameter Block:

1. Boot Sector
2. Reserved Sectors (almost always 0)
3. FAT sectors * copies of FAT
4. Root Directory sectors

 >   3. What's the formula to determine the offset of a cluster in
 >      a 12bit FAT?

 >      This is what I got:     fatoffset=(cluster+(cluster>>1));
 >      And to mark it bad:     if (cluster&1)     /* odd cluster number */
 >                                {
 >                                fat1[fatoffset]  |= 0xF;
 >                                fat1[fatoffset+1] = 0xF7;
 >                                }
 >                              else
 >                                {
 >                                fat1[fatoffset]   = 0xFF;
 >                                fat1[fatoffset+1] = 0x70;
 >                                }

This is what I know:

[Quotes from TechHelp!]
---------------------------------= cut here =---------------------------------
┌─────────────────┐
│ Reading the FAT │ To read the value of any entry in a FAT (as when following
└─────────────────┘ a FAT chain), first read the entire FAT into memory and
 obtain a starting cluster number from a directory.  Then, for 12-bit entries:
                                                               ▀▀▀▀▀▀▀▀▀▀▀▀▀▀
■ Multiply the cluster number by 3 ═╗
■ Divide the result by 2   ═════════╩═ (each entry is 1.5 (3/2) bytes long)
■ Read the WORD at the resulting address (as offset from the start of the FAT)
■ If the cluster was even, mask the value by 0fffH (keep the low 12 bits)
  If the cluster number was odd, shift the value right by 4 bits (keep the
  upper 12 bits)
■ The result is the entry for the next cluster in the chain (0fffH=the end).

Note: A 12-bit entry can cross over a sector boundary, so be careful with
      1-sector FAT buffering schemes.

 16-bit entries are simpler──each entry contains the 16-bit offset (from the
 start of the FAT) of the next entry in the chain (0ffffH indicates the end).

┌─────────────┐
│ FAT Content │ The first byte of the FAT is called the Media Descriptor or
└─────────────┘ FAT ID byte.  The next 5 bytes (12-bit FATs) or 7 bytes
 (16-bit FATs) are 0ffH.  The rest of the FAT is composed of 12-bit or 16-bit
 cells that each represent one disk cluster.  These cells will contain one of
 the following values:

    ■ (0)000H ................... an available cluster
    ■ (f)ff0H through (f)ff7H ... a reserved cluster
    ■ (f)ff7H ................... a bad cluster
    ■ (f)ff8H through (f)fffH ... the end of an allocation chain
    ■ (0)002H through (f)fefH ... the number of the next cluster in a chain

---------------------------------= cut here =---------------------------------

Hope this helps.

Inbar Raz

[ RETURN TO DIRECTORY ]