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)
this is obviously some new meaning of the word "tidy"
I thought I would help by illustrating formatting by taking a snippet of the OPs code and format it. Lo and behold, I could not even see where to begin.
If your kitchen was 'tidy' like that, the tidiness would be self-documented by cockroaches.
Erik
"I thought I would help by illustrating formatting by taking a snippet of the OPs code and format it. Lo and behold, I could not even see where to begin."
There are tools that are supposed to be able to automatically format code. Maybe this could be used as a test case...? Or should I say, "a challenge"?
Of course, it doesn't help that two of the posts are obviously incomplete.
Of course, it doesn't help that two of the posts are obviously incomplete
I'm impressed that you could decipher the scribbles far enough to even see that.
agree, to some extent; however, I would never complain that any code is too commented.
Well, there are two ways of abusing comments. One is to not write any comments even if the code is non-obvious, or it isn't even obvious why the code needs to be run.
The other abuse is people who think they have to document how the language works.
Ever seen:
mov al,0 ; assign 0 to al mov bl,al ; copy al to bl ...
or
score = score + 1; // count up score if (score > highscore) // check if larger than highscore highscore = score; // set highscore to score ...
Having the code full of obvious comments is about as funny as having code where every single precedence rule is overriden by lisp-style parentheses. Too much noise makes code bothersome too.
If the indenting is then random, and the comments are inlined at random positions, you really have to scan bast the comments just to figure out where code blocks starts/ends. With too weird positions of comments, even indent gets a hard time making cleaning up.
score = score + 1; // count up score if (score > highscore) // check if larger than highscore highscore = score; // set highscore to score ... those are not not comments, but explanations; However, it is good you cleared that one up
If the indenting is then random, and the comments are inlined at random positions, you really have to scan bast the comments just to figure out where code blocks starts/ends. With too weird positions of comments, even indent gets a hard time making cleaning up. in other words "if you can't read the code, comments do not help" - agreed.