This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Whats wrong with this code?

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)

Parents
  • Some I wrote myself and some from somewhere else.
    "Did the 3rd-party code work when you got it?

    Yes, but not properly.

    How did you check that it was suitable for your tools and your hardware?
    eg, you make extensive use of int, long etc - are you sure that any assumptions about size, endianness, etc are valid?

    The original code makes no such assumptions. I was told that it was platform and compiler neutral.

    What have you done to isolate whether the "problems" are in the bits you've changed, or the original 3rd-party bits?

    I put my bits into a separate file.

    "Whet I write to a file it looks good"

    Where does it "look good"?
    How are you checking it?
    What are your criteria for "looking good" - does that mean you've carefully checked in detail that it's all 100.0% correct, or you've just had a quick glance?

    Yes. The call returns no error.

    "when i read the file back its' f**ked up!"

    That's not very descriptive, is it?

    Pretty good description I though. Could also be decribed as scr**ed up or mu**ed up if you prefer.

    How, exactly, is it "f**ked up"?

    It doesnt do what it should. The read fails.

    Where is it getting "f**ked up" - ie, are you low-level raw sector accesses working, or is it higher up the chain?

    Interesting, I'll check on that one.

    Can you read files that were created by other systems?

    No, but the only other platform I use is Windows and I dont trust that. Do you?

    "Simulators are for wimps!"

    And only idiots refuse to use a tool that could help them when they're stuck!
    You're not getting anywhere without the simulator, so why not give it a try?
    Why make life difficult for yourself?

    Id prefer to understand the code. Besides, how would I stimulate a memory card?

    Q: Are you sure that the target is correct & working?
    A: Yes.

    How are you sure?
    What testing have you done?

    Erm, because the hardware guys said so. They tested it.

Reply
  • Some I wrote myself and some from somewhere else.
    "Did the 3rd-party code work when you got it?

    Yes, but not properly.

    How did you check that it was suitable for your tools and your hardware?
    eg, you make extensive use of int, long etc - are you sure that any assumptions about size, endianness, etc are valid?

    The original code makes no such assumptions. I was told that it was platform and compiler neutral.

    What have you done to isolate whether the "problems" are in the bits you've changed, or the original 3rd-party bits?

    I put my bits into a separate file.

    "Whet I write to a file it looks good"

    Where does it "look good"?
    How are you checking it?
    What are your criteria for "looking good" - does that mean you've carefully checked in detail that it's all 100.0% correct, or you've just had a quick glance?

    Yes. The call returns no error.

    "when i read the file back its' f**ked up!"

    That's not very descriptive, is it?

    Pretty good description I though. Could also be decribed as scr**ed up or mu**ed up if you prefer.

    How, exactly, is it "f**ked up"?

    It doesnt do what it should. The read fails.

    Where is it getting "f**ked up" - ie, are you low-level raw sector accesses working, or is it higher up the chain?

    Interesting, I'll check on that one.

    Can you read files that were created by other systems?

    No, but the only other platform I use is Windows and I dont trust that. Do you?

    "Simulators are for wimps!"

    And only idiots refuse to use a tool that could help them when they're stuck!
    You're not getting anywhere without the simulator, so why not give it a try?
    Why make life difficult for yourself?

    Id prefer to understand the code. Besides, how would I stimulate a memory card?

    Q: Are you sure that the target is correct & working?
    A: Yes.

    How are you sure?
    What testing have you done?

    Erm, because the hardware guys said so. They tested it.

Children