Example #1
0
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];
}
Example #2
0
//	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
}
Example #3
0
bool FAT_Read(u8* buffer, u32 sector, ExtentInfo* extent)
{
	if (!FAT_FindSector(&sector,extent))
		return false;
	return MMC_ReadSector(buffer,sector) == 0;
}