28 PMBR mbr = (PMBR) scratchsector;
39 result = (
uint32_t) mbr->ptable[pnum].start_0 |
40 (((
uint32_t) mbr->ptable[pnum].start_1) << 8) |
41 (((
uint32_t) mbr->ptable[pnum].start_2) << 16) |
42 (((
uint32_t) mbr->ptable[pnum].start_3) << 24);
45 *pactive = mbr->ptable[pnum].active;
48 *pptype = mbr->ptable[pnum].type;
51 *psize = (
uint32_t) mbr->ptable[pnum].size_0 |
52 (((
uint32_t) mbr->ptable[pnum].size_1) << 8) |
53 (((
uint32_t) mbr->ptable[pnum].size_2) << 16) |
54 (((
uint32_t) mbr->ptable[pnum].size_3) << 24);
69 PLBR lbr = (PLBR) scratchsector;
71 volinfo->startsector = startsector;
77 if (lbr->sig_55 != 0x55 || lbr->sig_aa != 0xaa) {
84 volinfo->secperclus = lbr->bpb.secperclus;
85 volinfo->reservedsecs = (uint16_t) lbr->bpb.reserved_l |
86 (((uint16_t) lbr->bpb.reserved_h) << 8);
88 volinfo->numsecs = (uint16_t) lbr->bpb.sectors_s_l |
89 (((uint16_t) lbr->bpb.sectors_s_h) << 8);
91 if (!volinfo->numsecs)
92 volinfo->numsecs = (
uint32_t) lbr->bpb.sectors_l_0 |
93 (((
uint32_t) lbr->bpb.sectors_l_1) << 8) |
94 (((
uint32_t) lbr->bpb.sectors_l_2) << 16) |
95 (((
uint32_t) lbr->bpb.sectors_l_3) << 24);
100 volinfo->secperfat = (uint16_t) lbr->bpb.secperfat_l |
101 (((uint16_t) lbr->bpb.secperfat_h) << 8);
102 if (!volinfo->secperfat) {
103 volinfo->secperfat = (
uint32_t) lbr->ebpb.ebpb32.fatsize_0 |
104 (((
uint32_t) lbr->ebpb.ebpb32.fatsize_1) << 8) |
105 (((
uint32_t) lbr->ebpb.ebpb32.fatsize_2) << 16) |
106 (((
uint32_t) lbr->ebpb.ebpb32.fatsize_3) << 24);
108 memcpy(volinfo->label, lbr->ebpb.ebpb32.label, 11);
109 volinfo->label[11] = 0;
116 memcpy(volinfo->label, lbr->ebpb.ebpb.label, 11);
117 volinfo->label[11] = 0;
125 volinfo->rootentries = (uint16_t) lbr->bpb.rootentries_l |
126 (((uint16_t) lbr->bpb.rootentries_h) << 8);
129 volinfo->fat1 = startsector + volinfo->reservedsecs;
134 if (volinfo->rootentries) {
135 volinfo->rootdir = volinfo->fat1 + (volinfo->secperfat * lbr->bpb.numfats);
139 volinfo->dataarea = volinfo->fat1 + (volinfo->secperfat * lbr->bpb.numfats);
140 volinfo->rootdir = (
uint32_t) lbr->ebpb.ebpb32.root_0 |
141 (((
uint32_t) lbr->ebpb.ebpb32.root_1) << 8) |
142 (((
uint32_t) lbr->ebpb.ebpb32.root_2) << 16) |
143 (((
uint32_t) lbr->ebpb.ebpb32.root_3) << 24);
147 volinfo->numclusters = (volinfo->numsecs - volinfo->dataarea) / volinfo->secperclus;
148 if (volinfo->numclusters < 4085)
149 volinfo->filesystem =
FAT12;
150 else if (volinfo->numclusters < 65525)
151 volinfo->filesystem =
FAT16;
153 volinfo->filesystem =
FAT32;
170 if (volinfo->filesystem ==
FAT12) {
171 offset = cluster + (cluster / 2);
173 else if (volinfo->filesystem ==
FAT16) {
174 offset = cluster * 2;
176 else if (volinfo->filesystem ==
FAT32) {
177 offset = cluster * 4;
184 sector = ldiv(offset,
SECTOR_SIZE).quot + volinfo->fat1;
187 if (sector != *scratchcache) {
194 *scratchcache = sector;
203 if (volinfo->filesystem ==
FAT12) {
208 result = (
uint32_t) scratch[offset];
216 *scratchcache = sector;
218 result |= ((
uint32_t) scratch[0]) << 8;
221 result = (
uint32_t) scratch[offset] |
222 ((
uint32_t) scratch[offset+1]) << 8;
225 result = result >> 4;
227 result = result & 0xfff;
229 else if (volinfo->filesystem ==
FAT16) {
230 result = (
uint32_t) scratch[offset] |
231 ((
uint32_t) scratch[offset+1]) << 8;
233 else if (volinfo->filesystem ==
FAT32) {
234 result = ((
uint32_t) scratch[offset] |
235 ((
uint32_t) scratch[offset+1]) << 8 |
236 ((
uint32_t) scratch[offset+2]) << 16 |
237 ((
uint32_t) scratch[offset+3]) << 24) & 0x0fffffff;
264 if (volinfo->filesystem ==
FAT12) {
265 offset = cluster + (cluster / 2);
266 new_contents &=0xfff;
268 else if (volinfo->filesystem ==
FAT16) {
269 offset = cluster * 2;
270 new_contents &=0xffff;
272 else if (volinfo->filesystem ==
FAT32) {
273 offset = cluster * 4;
274 new_contents &=0x0fffffff;
281 sector = ldiv(offset,
SECTOR_SIZE).quot + volinfo->fat1;
284 if (sector != *scratchcache) {
291 *scratchcache = sector;
300 if (volinfo->filesystem ==
FAT12) {
305 new_contents = new_contents << 4;
312 scratch[offset] = (scratch[offset] & 0x0f) | (new_contents & 0xf0);
316 scratch[offset] = new_contents & 0xff;
321 result =
DFS_WriteSector(volinfo->unit, scratch, (*scratchcache)+volinfo->secperfat, 1);
327 result =
DFS_ReadSector(volinfo->unit, scratch, *scratchcache, 1);
331 scratch[0] = new_contents & 0xff00;
335 scratch[0] = (scratch[0] & 0xf0) | (new_contents & 0x0f);
340 result =
DFS_WriteSector(volinfo->unit, scratch, (*scratchcache)+volinfo->secperfat, 1);
355 scratch[offset] = (scratch[offset] & 0x0f) | (new_contents & 0xf0);
356 scratch[offset+1] = new_contents & 0xff00;
360 scratch[offset] = new_contents & 0xff;
361 scratch[offset+1] = (scratch[offset+1] & 0xf0) | (new_contents & 0x0f);
366 result =
DFS_WriteSector(volinfo->unit, scratch, (*scratchcache)+volinfo->secperfat, 1);
369 else if (volinfo->filesystem ==
FAT16) {
370 scratch[offset] = (new_contents & 0xff);
371 scratch[offset+1] = (new_contents & 0xff00) >> 8;
375 result =
DFS_WriteSector(volinfo->unit, scratch, (*scratchcache)+volinfo->secperfat, 1);
377 else if (volinfo->filesystem ==
FAT32) {
378 scratch[offset] = (new_contents & 0xff);
379 scratch[offset+1] = (new_contents & 0xff00) >> 8;
380 scratch[offset+2] = (new_contents & 0xff0000) >> 16;
381 scratch[offset+3] = (scratch[offset+3] & 0xf0) | ((new_contents & 0x0f000000) >> 24);
388 result =
DFS_WriteSector(volinfo->unit, scratch, (*scratchcache)+volinfo->secperfat, 1);
403 uint8_t *destptr = dest;
405 memset(dest,
' ', 11);
408 while (*src && (*src !=
DIR_SEPARATOR) && (destptr - dest < 11)) {
409 if (*src >=
'a' && *src <=
'z') {
410 *destptr++ = (*src -
'a') +
'A';
413 else if (*src ==
'.') {
434 uint32_t i, result = 0xffffffff, scratchcache = 0;
439 for (i=2; i < volinfo->numclusters; i++) {
440 result =
DFS_GetFAT(volinfo, scratch, &scratchcache, i);
461 if (!strlen((
char *) dirname) || (strlen((
char *) dirname) == 1 && dirname[0] ==
DIR_SEPARATOR)) {
462 if (volinfo->filesystem ==
FAT32) {
463 dirinfo->currentcluster = volinfo->rootdir;
464 dirinfo->currentsector = 0;
465 dirinfo->currententry = 0;
468 return DFS_ReadSector(volinfo->unit, dirinfo->scratch, volinfo->dataarea + ((volinfo->rootdir - 2) * volinfo->secperclus), 1);
471 dirinfo->currentcluster = 0;
472 dirinfo->currentsector = 0;
473 dirinfo->currententry = 0;
476 return DFS_ReadSector(volinfo->unit, dirinfo->scratch, volinfo->rootdir, 1);
484 uint8_t *ptr = dirname;
488 if (volinfo->filesystem ==
FAT32) {
489 dirinfo->currentcluster = volinfo->rootdir;
490 dirinfo->currentsector = 0;
491 dirinfo->currententry = 0;
494 if (
DFS_ReadSector(volinfo->unit, dirinfo->scratch, volinfo->dataarea + ((volinfo->rootdir - 2) * volinfo->secperclus), 1))
498 dirinfo->currentcluster = 0;
499 dirinfo->currentsector = 0;
500 dirinfo->currententry = 0;
503 if (
DFS_ReadSector(volinfo->unit, dirinfo->scratch, volinfo->rootdir, 1))
520 }
while (!result && memcmp(de.
name, tmpfn, 11));
523 if (volinfo->filesystem ==
FAT32) {
533 dirinfo->currentsector = 0;
534 dirinfo->currententry = 0;
536 if (
DFS_ReadSector(volinfo->unit, dirinfo->scratch, volinfo->dataarea + ((dirinfo->currentcluster - 2) * volinfo->secperclus), 1))
549 if (!dirinfo->currentcluster)
571 dirinfo->currententry = 0;
572 dirinfo->currentsector++;
578 if (dirinfo->currentcluster == 0) {
580 if (dirinfo->currentsector * (
SECTOR_SIZE /
sizeof(
DIRENT)) >= volinfo->rootentries)
584 if (
DFS_ReadSector(volinfo->unit, dirinfo->scratch, volinfo->rootdir + dirinfo->currentsector, 1))
590 if (dirinfo->currentsector >= volinfo->secperclus) {
591 dirinfo->currentsector = 0;
592 if ((dirinfo->currentcluster >= 0xff7 && volinfo->filesystem ==
FAT12) ||
593 (dirinfo->currentcluster >= 0xfff7 && volinfo->filesystem ==
FAT16) ||
594 (dirinfo->currentcluster >= 0x0ffffff7 && volinfo->filesystem ==
FAT32)) {
607 dirinfo->currentcluster =
DFS_GetFAT(volinfo, dirinfo->scratch, &tempint, dirinfo->currentcluster);
609 if (
DFS_ReadSector(volinfo->unit, dirinfo->scratch, volinfo->dataarea + ((dirinfo->currentcluster - 2) * volinfo->secperclus) + dirinfo->currentsector, 1))
614 memcpy(dirent, &(((PDIRENT) dirinfo->scratch)[dirinfo->currententry]),
sizeof(
DIRENT));
616 if (dirent->name[0] == 0) {
624 if (dirent->name[0] == 0xe5)
628 else if (dirent->name[0] == 0x05)
629 dirent->name[0] = 0xe5;
631 dirinfo->currententry++;
663 if (tempclus ==
DFS_OK && (!de->name[0])) {
673 if (tempclus == 0x0ffffff7)
678 for (i=0;i<volinfo->secperclus;i++) {
679 if (
DFS_WriteSector(volinfo->unit, di->scratch, volinfo->dataarea + ((tempclus - 2) * volinfo->secperclus) + i, 1))
684 DFS_SetFAT(volinfo, di->scratch, &i, di->currentcluster, tempclus);
687 di->currentcluster = tempclus;
688 di->currentsector = 0;
689 di->currententry = 1;
692 switch(volinfo->filesystem) {
693 case FAT12: tempclus = 0xff8;
break;
694 case FAT16: tempclus = 0xfff8;
break;
695 case FAT32: tempclus = 0x0ffffff8;
break;
698 DFS_SetFAT(volinfo, di->scratch, &i, di->currentcluster, tempclus);
716 uint8_t filename[12];
722 memset(fileinfo, 0,
sizeof(
FILEINFO));
725 fileinfo->mode =
mode;
728 strncpy((
char *) tmppath, (
char *) path,
MAX_PATH);
730 if (strcmp((
char *) path,(
char *) tmppath)) {
736 strcpy((
char *) tmppath, (
char *) tmppath + 1);
762 if (!memcmp(de.
name, filename, 11)) {
767 fileinfo->volinfo = volinfo;
768 fileinfo->pointer = 0;
777 if (volinfo->filesystem ==
FAT32) {
787 fileinfo->firstcluster = fileinfo->cluster;
807 memset(&de, 0,
sizeof(de));
808 memcpy(de.
name, filename, 11);
829 fileinfo->volinfo = volinfo;
830 fileinfo->pointer = 0;
839 fileinfo->cluster = cluster;
840 fileinfo->firstcluster = cluster;
841 fileinfo->filelen = 0;
846 if (
DFS_ReadSector(volinfo->unit, scratch, fileinfo->dirsector, 1))
853 switch(volinfo->filesystem) {
854 case FAT12: cluster = 0xff8;
break;
855 case FAT16: cluster = 0xfff8;
break;
856 case FAT32: cluster = 0x0ffffff8;
break;
860 DFS_SetFAT(volinfo, scratch, &temp, fileinfo->cluster, cluster);
883 if (len > fileinfo->filelen - fileinfo->pointer)
884 len = fileinfo->filelen - fileinfo->pointer;
889 while (remain && result ==
DFS_OK) {
893 sector = fileinfo->volinfo->dataarea +
894 ((fileinfo->cluster - 2) * fileinfo->volinfo->secperclus) +
899 uint16_t tempreadsize;
902 result =
DFS_ReadSector(fileinfo->volinfo->unit, scratch, sector, 1);
911 if (remain >= tempreadsize) {
912 memcpy(buffer, scratch + (
SECTOR_SIZE - tempreadsize), tempreadsize);
913 bytesread = tempreadsize;
914 buffer += tempreadsize;
915 fileinfo->pointer += tempreadsize;
916 remain -= tempreadsize;
920 memcpy(buffer, scratch + (
SECTOR_SIZE - tempreadsize), remain);
923 fileinfo->pointer += remain;
938 result =
DFS_ReadSector(fileinfo->volinfo->unit, buffer, sector, 1);
946 result =
DFS_ReadSector(fileinfo->volinfo->unit, scratch, sector, 1);
947 memcpy(buffer, scratch, remain);
949 fileinfo->pointer += remain;
955 *successcount += bytesread;
958 if (div(fileinfo->pointer - bytesread, fileinfo->volinfo->secperclus *
SECTOR_SIZE).quot !=
959 div(fileinfo->pointer, fileinfo->volinfo->secperclus *
SECTOR_SIZE).quot) {
963 if (((fileinfo->volinfo->filesystem ==
FAT12) && (fileinfo->cluster >= 0xff8)) ||
964 ((fileinfo->volinfo->filesystem ==
FAT16) && (fileinfo->cluster >= 0xfff8)) ||
965 ((fileinfo->volinfo->filesystem ==
FAT32) && (fileinfo->cluster >= 0x0ffffff8)))
968 fileinfo->cluster =
DFS_GetFAT(fileinfo->volinfo, scratch, &bytesread, fileinfo->cluster);
987 if (offset == fileinfo->pointer) {
992 if (offset > fileinfo->filelen) {
993 offset = fileinfo->filelen;
1000 fileinfo->cluster = fileinfo->firstcluster;
1001 fileinfo->pointer = 0;
1005 else if (offset < fileinfo->pointer) {
1006 fileinfo->cluster = fileinfo->firstcluster;
1007 fileinfo->pointer = 0;
1017 if (div(fileinfo->pointer, fileinfo->volinfo->secperclus *
SECTOR_SIZE).quot ==
1018 div(fileinfo->pointer + offset, fileinfo->volinfo->secperclus *
SECTOR_SIZE).quot) {
1019 fileinfo->pointer = offset;
1024 fileinfo->pointer = div(fileinfo->pointer, fileinfo->volinfo->secperclus *
SECTOR_SIZE).quot *
1029 while (div(fileinfo->pointer, fileinfo->volinfo->secperclus *
SECTOR_SIZE).quot !=
1030 div(fileinfo->pointer + offset, fileinfo->volinfo->secperclus *
SECTOR_SIZE).quot) {
1032 fileinfo->cluster =
DFS_GetFAT(fileinfo->volinfo, scratch, &tempint, fileinfo->cluster);
1034 if (fileinfo->cluster == 0x0ffffff7) {
1035 fileinfo->pointer = 0;
1036 fileinfo->cluster = fileinfo->firstcluster;
1039 fileinfo->pointer +=
SECTOR_SIZE * fileinfo->volinfo->secperclus;
1043 fileinfo->pointer = offset;
1065 ((PDIRENT) scratch)[fi.
diroffset].name[0] = 0xe5;
1076 DFS_SetFAT(volinfo, scratch, &cache, tempclus, 0);
1103 while (remain && result ==
DFS_OK) {
1107 sector = fileinfo->volinfo->dataarea +
1108 ((fileinfo->cluster - 2) * fileinfo->volinfo->secperclus) +
1116 result =
DFS_ReadSector(fileinfo->volinfo->unit, scratch, sector, 1);
1120 tempsize = div(fileinfo->pointer,
SECTOR_SIZE).rem;
1127 memcpy(scratch + tempsize, buffer,
SECTOR_SIZE - tempsize);
1129 result =
DFS_WriteSector(fileinfo->volinfo->unit, scratch, sector, 1);
1134 if (fileinfo->filelen < fileinfo->pointer) {
1135 fileinfo->filelen = fileinfo->pointer;
1141 memcpy(scratch + tempsize, buffer, remain);
1143 result =
DFS_WriteSector(fileinfo->volinfo->unit, scratch, sector, 1);
1146 fileinfo->pointer += remain;
1147 if (fileinfo->filelen < fileinfo->pointer) {
1148 fileinfo->filelen = fileinfo->pointer;
1150 byteswritten = remain;
1165 if (fileinfo->filelen < fileinfo->pointer) {
1166 fileinfo->filelen = fileinfo->pointer;
1176 if (fileinfo->pointer < fileinfo->filelen) {
1177 result =
DFS_ReadSector(fileinfo->volinfo->unit, scratch, sector, 1);
1179 memcpy(scratch, buffer, remain);
1180 result =
DFS_WriteSector(fileinfo->volinfo->unit, scratch, sector, 1);
1188 fileinfo->pointer += remain;
1189 if (fileinfo->filelen < fileinfo->pointer) {
1190 fileinfo->filelen = fileinfo->pointer;
1192 byteswritten = remain;
1197 *successcount += byteswritten;
1200 if (div(fileinfo->pointer - byteswritten, fileinfo->volinfo->secperclus *
SECTOR_SIZE).quot !=
1201 div(fileinfo->pointer, fileinfo->volinfo->secperclus *
SECTOR_SIZE).quot) {
1210 lastcluster = fileinfo->cluster;
1211 fileinfo->cluster =
DFS_GetFAT(fileinfo->volinfo, scratch, &byteswritten, fileinfo->cluster);
1214 if (((fileinfo->volinfo->filesystem ==
FAT12) && (fileinfo->cluster >= 0xff8)) ||
1215 ((fileinfo->volinfo->filesystem ==
FAT16) && (fileinfo->cluster >= 0xfff8)) ||
1216 ((fileinfo->volinfo->filesystem ==
FAT32) && (fileinfo->cluster >= 0x0ffffff8))) {
1221 if (tempclus == 0x0ffffff7)
1225 DFS_SetFAT(fileinfo->volinfo, scratch, &byteswritten, lastcluster, tempclus);
1226 fileinfo->cluster = tempclus;
1229 switch(fileinfo->volinfo->filesystem) {
1230 case FAT12: tempclus = 0xff8;
break;
1231 case FAT16: tempclus = 0xfff8;
break;
1232 case FAT32: tempclus = 0x0ffffff8;
break;
1235 DFS_SetFAT(fileinfo->volinfo, scratch, &byteswritten, fileinfo->cluster, tempclus);
1244 if (
DFS_ReadSector(fileinfo->volinfo->unit, scratch, fileinfo->dirsector, 1))
1246 ((PDIRENT) scratch)[fileinfo->diroffset].filesize_0 = fileinfo->filelen & 0xff;
1247 ((PDIRENT) scratch)[fileinfo->diroffset].filesize_1 = (fileinfo->filelen & 0xff00) >> 8;
1248 ((PDIRENT) scratch)[fileinfo->diroffset].filesize_2 = (fileinfo->filelen & 0xff0000) >> 16;
1249 ((PDIRENT) scratch)[fileinfo->diroffset].filesize_3 = (fileinfo->filelen & 0xff000000) >> 24;
1250 if (
DFS_WriteSector(fileinfo->volinfo->unit, scratch, fileinfo->dirsector, 1))