Jump to navigation Jump to search
345 bytes removed ,  00:20, 12 June 2010
updated code to calculate FAT size
Following the header is two FATs, which are FAT12/FAT16 (depending on total volume size). Each FAT size is determined by the below algo. Following the FATs is the root [ directory] cluster, 0x1000 bytes long. Following the root cluster is the data "clusters". The data "clusters" have are 0x200 bytes long each. The size of the FAT is determined by the following algorithm:
<source lang="c">#define ALIGN_FORWARD(x,align) \ ((typeof(x))((((u32)(x)) + (align) - 1) & (~((align)-1))))#define CLUSTER_SIZE 0x200 u32 WC24_GetVFF_FATSize(u32 filesize)
if(filesize < 0x100000) {//This block is executed for filesizes less than 1MB. u32 base num_clusters = (filesize / 0x200) - 8CLUSTER_SIZE; u32 fatsz fat_bits = base32; if(base % 0x200num_clusters < 0xFFF5)//Should always be executed.fat_bits = 16; { if(basenum_clusters <0x2000xFF5) { fatsz fat_bits = 0x20012; } else { fatsz++; } } return fatsz; } else { return filesize >> ALIGN_FORWARD(num_clusters * fat_bits / 8, CLUSTER_SIZE);//VFF files larger than 1MB must be aligned to a MB, since this algo doesn't work right with filesizes not aligned. }

Navigation menu