We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
unsigned char sectors_per_cluster; unsigned int *pi; unsigned long *pl; pi = (unsigned int *)&raw_block[FAT_BYTES_PER_SECTOR]; partition.bytes_per_sector = *pi++; partition.sectors_per_cluster = *pi & 0xFF; pi = (unsigned int *)&raw_block[FAT_RESERVED_SECTORS]; reserved_sectors = *pi++; number_of_fats = *pi & 0xFF; pl = (unsigned long *)&raw_block[FAT_FAT_SIZE]; sectors_per_fat = *pl; partition.fat1_start_sector = partition.offset + reserved_sectors; partition.fat2_start_sector = partition.fat1_start_sector + sectors_per_fat; partition.root_dir_start_sector = partition.fat2_start_sector + sectors_per_fat; partition.last_free_chain = 0; fat_find_free_chain();} static unsigned long fat_calc_data_address(unsigned long cluster, unsigned char sector) {unsigned long offset; offset = ((cluster - 2) * partition.sectors_per_cluster); offset += partition.root_dir_start_sector; offset += sector; offset *= partition.bytes_per_sector; return offset;} static unsigned long fat_calc_chain_address(unsigned long index) {unsigned long offset; offset = partition.fat1_start_sector + (index >> 7); offset *= partition.bytes_per_sector; return offset;} void fat_load_root_directory(void) {unsigned long offset; offset = partition.root_dir_start_sector; offset *= partition.bytes_per_sector; mmc_read(offset); directory.parent_cluster = 0x00; directory.start_cluster = 0x02; directory.current_sector = 0x00; directory.current_cluster = 0x02; directory.current_direntry = (DIRENTRY *)FIRST_ENTRY_IN_ROOT;} static void fat_load_directory(unsigned long cluster, unsigned char sector, unsigned char new) {mmc_read(fat_calc_data_address(cluster, sector)); if (new) {directory.parent_cluster = directory.start_cluster; directory.start_cluster = cluster; directory.current_direntry = (DIRENTRY *)FIRST_ENTRY_IN_DIR;} directory.current_cluster = cluster; directory.current_sector = sector;} static void fat_read_next_sector_or_cluster(void) {if (directory.current_sector == (partition.sectors_per_cluster-1)) fat_load_directory(fat_next_chain(directory.current_cluster), 0, FALSE); else {directory.current_sector++; fat_load_directory(directory.current_cluster, directory.current_sector, FALSE);}} static DIRENTRY *fat_seek_directory(char *name, unsigned char find_free) {unsigned char i; DIRENTRY *p = (DIRENTRY *)START_OF_SECTOR; fat_load_directory(directory.start_cluster, 0, FALSE); i = 0; while(1) {i++; if (match_name(name, p->Name, 8)) if (p->Attribute & ATTRIB_SUBDIR) {if (!find_free) return p; else return 0;} if (!p->Name[0]) {if (!find_free) return 0; else return p;} p++; if (!(i % 0x10)) {i = 0; p = (DIRENTRY *)START_OF_SECTOR; fat_read_next_sector_or_cluster();}} return 0;} static DIRENTRY *fat_seek_file(char *name, unsigned char find_free) {unsigned char i; DIRENTRY *p = (DIRENTRY *)START_OF_SECTOR; fat_load_directory(directory.start_cluster, 0, FALSE); i = 0; while(1) {i++; if (match_name(name, p->Name, 11)) if (p->Attribute == ATTRIB_ARCHIVE) return p; if (!p->Name[0]) {if (!find_free) return 0; else return p;} p++; if (!(i % 0x10)) {i = 0; p = (DIRENTRY *)START_OF_SECTOR; fat_read_next_sector_or_cluster();}} return 0;} static unsigned long fat_find_free_chain(void) {unsigned long index = partition.last_free_chain; unsigned long *p; mmc_read(fat_calc_chain_address(index)); p = (unsigned long* )START_OF_SECTOR; p += (index & 0x7F); while(*p) {index++; p++; if (!(index % 0x80)) {mmc_read(fat_calc_chain_address(index)); p = (unsigned long* )START_OF_SECTOR;}} partition.last_free_chain = index; return index;} unsigned char fat_read_direntry(unsigned char first) {if (first) fat_load_directory(directory.start_cluster, 0, FALSE); else {if (directory.current_direntry == (DIRENTRY *)LAST_DIRENTRY) {fat_read_next_sector_or_cluster(); directory.current_direntry = (DIRENTRY *)START_OF_SECTOR;} else directory.current_direntry += 0x20; }} static unsigned long fat_next_chain(unsigned long from) {unsigned long *p; mmc_read(fat_calc_chain_address(from)); p = (unsigned long* )START_OF_SECTOR; p += (from & 0x7F); return *p;} void fat_mark_next_chain(unsigned long old, unsigned long new) {unsigned long *p; unsigned long offset; offset = fat_calc_chain_address(old); mmc_read(offset); p = (unsigned long* )START_OF_SECTOR; p += (old & 0x7F); *p = new; mmc_write(offset); offset = fat_calc_chain_address(new); mmc_read(offset); p = (unsigned long* )START_OF_SECTOR; p += (new & 0x7F); *p = 0x0FFFFFFF; mmc_write(offset);} void fat_chain_free(unsigned long index) {unsigned long *p; unsigned long temp = index; unsigned long offset; while (temp) {offset = fat_calc_chain_address(temp); mmc_read(offset); p = (unsigned long* )START_OF_SECTOR; p += (temp & 0x7F); temp = *p; *p = 0; mmc_write(offset); }} static void fat_clear_sector(unsigned long cluster, unsigned char sector) {mmc_clear(fat_calc_data_address(cluster, sector));} unsigned char fat_make_directory(char *name)
I use self documented code so comments are not needed
If this is an example of self-documented code, then I think I'll stick with the old-school method of including comments!
What about indentation?
Also looks like you've missed the start of the first function. Maybe it's important? Probably would stop the code compiling.
Oh - And looks like the end of the last function is missing too.
Please consider tidying up the code before posting again.