u32 NextCluster(u32* s, u32 currentCluster) { bool fat32 = _fat.rootCluster != 0; u32 fatSector = currentCluster >> (fat32 ? 7 : 8); fatSector += _fat.fatStart; if (fatSector != *s) { *s = fatSector; MMC_ReadSector(_fat.buffer,fatSector); // Read sector containing next cluster } if (fat32) return ((u32*)_fat.buffer)[currentCluster & 0x7F]; return ((u16*)_fat.buffer)[currentCluster & 0xFF]; }
// TODO: read beyond 3 extent! // TODO: Store extents as absolute sectors rather than clusters, avoid muls bool FAT_Read(u8* buffer, u32 sector, ExtentInfo* extent) { u8 i = 0; while (i < 3) { u32 s = extent->extents[i].count*_fat.sectorsPerCluster; if (sector < s) { u32 cluster = extent->extents[i].start; sector += _fat.clusterStart + (cluster - 2)*_fat.sectorsPerCluster; return MMC_ReadSector(buffer,sector); } sector -= s; } return false; // TODO: Deal with nasty fragmentation }
bool FAT_Read(u8* buffer, u32 sector, ExtentInfo* extent) { if (!FAT_FindSector(§or,extent)) return false; return MMC_ReadSector(buffer,sector) == 0; }