+
+ sector_offset = ao_file_offset >> SECTOR_SHIFT;
+
+ if (!ao_file_cluster) {
+ cluster_offset = sector_offset / sectors_per_cluster;
+
+ cluster = ao_fat_cluster_seek(ao_file_dirent.cluster, cluster_offset);
+ if (!ao_fat_cluster_valid(cluster))
+ return 0xffffffff;
+ ao_file_cluster = cluster;
+ ao_file_cluster_offset = cluster_offset * bytes_per_cluster;
+ }
+
+ sector_index = sector_offset % sectors_per_cluster;
+ return data_start + (uint32_t) (ao_file_cluster-2) * sectors_per_cluster + sector_index;
+}
+
+static void
+ao_fat_set_offset(uint32_t offset)
+{
+
+ if (offset == 0) {
+ ao_file_cluster = ao_file_dirent.cluster;
+ ao_file_cluster_offset = 0;
+ }
+ else if (offset < ao_file_cluster_offset ||
+ ao_file_cluster_offset + bytes_per_cluster <= offset)
+ {
+ ao_file_cluster = 0;
+ }
+ ao_file_offset = offset;