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