FAT_SUPER
FAT_SUPER->root_offset =
FAT_SUPER->fat_offset + bpb.num_fats * FAT_SUPER->fat_length;
FAT_SUPER->root_max = FAT_DIRENTRY_LENGTH * FAT_CVT_U16(bpb.dir_entries);
FAT_SUPER->data_offset =
FAT_SUPER->root_offset
+ ((FAT_SUPER->root_max - 1) >> FAT_SUPER->sectsize_bits) + 1;
FAT_SUPER->num_clust =
2 + ((FAT_SUPER->num_sectors - FAT_SUPER->data_offset)
FAT_SUPER->sects_per_clust = bpb.sects_per_clust;
FAT_SUPER->fat_offset += active_fat * FAT_SUPER->fat_length;
FAT_SUPER->fat_size = 8;
FAT_SUPER->root_cluster = bpb.root_cluster;
FAT_SUPER->clust_eof_marker = 0xffffff8;
if (!FAT_SUPER->root_max)
FAT_SUPER->root_cluster = -1;
if (FAT_SUPER->num_clust > FAT_MAX_12BIT_CLUST)
FAT_SUPER->fat_size = 4;
FAT_SUPER->clust_eof_marker = 0xfff8;
FAT_SUPER->fat_size = 3;
FAT_SUPER->clust_eof_marker = 0xff8;
if (FAT_CVT_U16(bpb.bytes_per_sect) != (1 << FAT_SUPER->sectsize_bits)
|| bpb.sects_per_clust != (1 << (FAT_SUPER->clustsize_bits
- FAT_SUPER->sectsize_bits))
|| FAT_SUPER->num_clust <= 2
|| (FAT_SUPER->fat_size * FAT_SUPER->num_clust / (2 * SECTOR_SIZE)
> FAT_SUPER->fat_length))
if (!devread(FAT_SUPER->fat_offset, 0,
if (FAT_SUPER->fat_size == 8)
else if (FAT_SUPER->fat_size == 4)
FAT_SUPER->cached_fat = - 2 * FAT_CACHE_SIZE;
if (FAT_SUPER->file_cluster < 0)
size = FAT_SUPER->root_max - filepos;
if (!devread(FAT_SUPER->root_offset, filepos, size, buf))
logical_clust = filepos >> FAT_SUPER->clustsize_bits;
offset = (filepos & ((1 << FAT_SUPER->clustsize_bits) - 1));
if (logical_clust < FAT_SUPER->current_cluster_num)
FAT_SUPER->current_cluster_num = 0;
FAT_SUPER->current_cluster = FAT_SUPER->file_cluster;
while (logical_clust > FAT_SUPER->current_cluster_num)
FAT_SUPER->current_cluster * FAT_SUPER->fat_size;
int cached_pos = (fat_entry - FAT_SUPER->cached_fat);
(cached_pos + FAT_SUPER->fat_size) > 2*FAT_CACHE_SIZE)
FAT_SUPER->cached_fat = (fat_entry & ~(2*SECTOR_SIZE - 1));
cached_pos = (fat_entry - FAT_SUPER->cached_fat);
sector = FAT_SUPER->fat_offset
+ FAT_SUPER->cached_fat / (2*SECTOR_SIZE);
if (FAT_SUPER->fat_size == 3)
else if (FAT_SUPER->fat_size == 4)
if (next_cluster >= FAT_SUPER->clust_eof_marker)
if (next_cluster < 2 || next_cluster >= FAT_SUPER->num_clust)
FAT_SUPER->current_cluster = next_cluster;
FAT_SUPER->current_cluster_num++;
sector = FAT_SUPER->data_offset +
((FAT_SUPER->current_cluster - 2) << (FAT_SUPER->clustsize_bits
- FAT_SUPER->sectsize_bits));
size = (1 << FAT_SUPER->clustsize_bits) - offset;
FAT_SUPER->file_cluster = FAT_SUPER->root_cluster;
FAT_SUPER->current_cluster_num = MAXINT;
FAT_SUPER->file_cluster = FAT_DIRENTRY_FIRST_CLUSTER (dir_buf);
FAT_SUPER->current_cluster_num = MAXINT;
FAT_SUPER->sectsize_bits = log2 (FAT_CVT_U16 (bpb.bytes_per_sect));
FAT_SUPER->clustsize_bits
= FAT_SUPER->sectsize_bits + log2 (bpb.sects_per_clust);
FAT_SUPER->num_sectors = FAT_CVT_U16 (bpb.short_sectors)
FAT_SUPER->fat_offset = FAT_CVT_U16 (bpb.reserved_sects);
FAT_SUPER->fat_length =