00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef FAT_H
00023 #define FAT_H
00024
00025 #include "global.h"
00026 #include "device.h"
00027
00028
00029
00030 #define MSDOSFSROOT 0 // cluster 0 means the root dir
00031 #define CLUST_FREE 0 // cluster 0 also means a free cluster
00032 #define MSDOSFSFREE CLUST_FREE
00033 #define CLUST_FIRST 2 // first legal cluster number
00034 #define CLUST_RSRVD 0xfffffff6 // reserved cluster range
00035 #define CLUST_BAD 0xfffffff7 // a cluster with a defect
00036 #define CLUST_EOFS 0xfffffff8 // start of eof cluster range
00037 #define CLUST_EOFE 0xffffffff // end of eof cluster range
00038
00039 #define FAT12_MASK 0x00000fff // mask for FAT12 bit cluster numbers
00040 #define FAT16_MASK 0x0000ffff // mask for FAT16 bit cluster numbers
00041 #define FAT32_MASK 0x0fffffff // mask for FAT32 cluster numbers
00042
00043
00044
00045
00046 struct bootsector33 {
00047 BYTE bsJump[3];
00048 CHAR bsOemName[8];
00049 CHAR bsBPB[19];
00050 CHAR bsDriveNumber;
00051 CHAR bsBootCode[479];
00052 BYTE bsBootSectSig0;
00053 BYTE bsBootSectSig1;
00054 #define BOOTSIG0 0x55
00055 #define BOOTSIG1 0xaa
00056 } GNUC_PACKED;
00057
00058 struct extboot {
00059 CHAR exDriveNumber;
00060 CHAR exReserved1;
00061 CHAR exBootSignature;
00062 #define EXBOOTSIG 0x29
00063 CHAR exVolumeID[4];
00064 CHAR exVolumeLabel[11];
00065 CHAR exFileSysType[8];
00066 } GNUC_PACKED;
00067
00068 struct bootsector50 {
00069 BYTE bsJump[3];
00070 CHAR bsOemName[8];
00071 CHAR bsBPB[25];
00072 CHAR bsExt[26];
00073 CHAR bsBootCode[448];
00074 BYTE bsBootSectSig0;
00075 BYTE bsBootSectSig1;
00076 #define BOOTSIG0 0x55
00077 #define BOOTSIG1 0xaa
00078 } GNUC_PACKED;
00079
00080 struct bootsector710 {
00081 BYTE bsJump[3];
00082 CHAR bsOEMName[8];
00083 CHAR bsBPB[53];
00084 CHAR bsExt[26];
00085 CHAR bsBootCode[418];
00086 BYTE bsBootSectSig2;
00087 BYTE bsBootSectSig3;
00088 BYTE bsBootSectSig0;
00089 BYTE bsBootSectSig1;
00090 #define BOOTSIG0 0x55
00091 #define BOOTSIG1 0xaa
00092 #define BOOTSIG2 0
00093 #define BOOTSIG3 0
00094 } GNUC_PACKED;
00095
00096
00097
00098
00099
00100
00101 struct bpb33 {
00102 WORD bpbBytesPerSec;
00103 BYTE bpbSecPerClust;
00104 WORD bpbResSectors;
00105 BYTE bpbFATs;
00106 WORD bpbRootDirEnts;
00107 WORD bpbSectors;
00108 BYTE bpbMedia;
00109 WORD bpbFATsecs;
00110 WORD bpbSecPerTrack;
00111 WORD bpbHeads;
00112 WORD bpbHiddenSecs;
00113 } GNUC_PACKED;
00114
00115
00116
00117
00118 struct bpb50 {
00119 WORD bpbBytesPerSec;
00120 BYTE bpbSecPerClust;
00121 WORD bpbResSectors;
00122 BYTE bpbFATs;
00123 WORD bpbRootDirEnts;
00124 WORD bpbSectors;
00125 BYTE bpbMedia;
00126 WORD bpbFATsecs;
00127 WORD bpbSecPerTrack;
00128 WORD bpbHeads;
00129 DWORD bpbHiddenSecs;
00130
00131 DWORD bpbHugeSectors;
00132 } GNUC_PACKED;
00133
00134
00135
00136 struct bpb710 {
00137 WORD bpbBytesPerSec;
00138 BYTE bpbSecPerClust;
00139 WORD bpbResSectors;
00140 BYTE bpbFATs;
00141 WORD bpbRootDirEnts;
00142 WORD bpbSectors;
00143 BYTE bpbMedia;
00144 WORD bpbFATsecs;
00145 WORD bpbSecPerTrack;
00146 WORD bpbHeads;
00147 DWORD bpbHiddenSecs;
00148
00149 DWORD bpbHugeSectors;
00150
00151 DWORD bpbBigFATsecs;
00152 WORD bpbExtFlags;
00153 #define FATNUM 0xf // mask for numbering active FAT
00154 #define FATMIRROR 0x80 // FAT is mirrored (like it always was)
00155 WORD bpbFSVers;
00156 #define FSVERS 0 // currently only 0 is understood
00157 DWORD bpbRootClust;
00158 WORD bpbFSInfo;
00159 WORD bpbBackup;
00160
00161 } GNUC_PACKED;
00162
00163
00164
00165
00166
00167
00168 struct bpb33_byte {
00169 CHAR bpbBytesPerSec[2];
00170 CHAR bpbSecPerClust;
00171 CHAR bpbResSectors[2];
00172 CHAR bpbFATs;
00173 CHAR bpbRootDirEnts[2];
00174 CHAR bpbSectors[2];
00175 CHAR bpbMedia;
00176 CHAR bpbFATsecs[2];
00177 CHAR bpbSecPerTrack[2];
00178 CHAR bpbHeads[2];
00179 CHAR bpbHiddenSecs[2];
00180 } GNUC_PACKED;
00181
00182
00183
00184
00185 struct bpb50_byte {
00186 CHAR bpbBytesPerSec[2];
00187 CHAR bpbSecPerClust;
00188 CHAR bpbResSectors[2];
00189 CHAR bpbFATs;
00190 CHAR bpbRootDirEnts[2];
00191 CHAR bpbSectors[2];
00192 CHAR bpbMedia;
00193 CHAR bpbFATsecs[2];
00194 CHAR bpbSecPerTrack[2];
00195 CHAR bpbHeads[2];
00196 CHAR bpbHiddenSecs[4];
00197 CHAR bpbHugeSectors[4];
00198 } GNUC_PACKED;
00199
00200
00201
00202 struct bpb710_byte {
00203 BYTE bpbBytesPerSec[2];
00204 BYTE bpbSecPerClust;
00205 BYTE bpbResSectors[2];
00206 BYTE bpbFATs;
00207 BYTE bpbRootDirEnts[2];
00208 BYTE bpbSectors[2];
00209 BYTE bpbMedia;
00210 BYTE bpbFATsecs[2];
00211 BYTE bpbSecPerTrack[2];
00212 BYTE bpbHeads[2];
00213 BYTE bpbHiddenSecs[4];
00214 BYTE bpbHugeSectors[4];
00215 BYTE bpbBigFATsecs[4];
00216 BYTE bpbExtFlags[2];
00217 BYTE bpbFSVers[2];
00218 BYTE bpbRootClust[4];
00219 BYTE bpbFSInfo[2];
00220 BYTE bpbBackup[2];
00221
00222 } GNUC_PACKED;
00223
00224
00225 struct fsinfo {
00226 BYTE fsisig1[4];
00227 BYTE fsifill1[480];
00228 BYTE fsisig2[4];
00229 BYTE fsinfree[4];
00230 BYTE fsinxtfree[4];
00231 BYTE fsifill2[12];
00232 BYTE fsisig3[4];
00233 BYTE fsifill3[508];
00234 BYTE fsisig4[4];
00235 } GNUC_PACKED;
00236
00237
00238
00239
00240
00241
00242 struct direntry {
00243 BYTE deName[8];
00244 #define SLOT_EMPTY 0x00 // slot has never been used
00245 #define SLOT_E5 0x05 // the real value is 0xE5
00246 #define SLOT_DELETED 0xE5 // file in this slot deleted
00247 BYTE deExtension[3];
00248 BYTE deAttributes;
00249 #define ATTR_NORMAL 0x00 // normal file
00250 #define ATTR_READONLY 0x01 // file is readonly
00251 #define ATTR_HIDDEN 0x02 // file is hidden
00252 #define ATTR_SYSTEM 0x04 // file is a system file
00253 #define ATTR_VOLUME 0x08 // entry is a volume label
00254 #define ATTR_LONG_FILENAME 0x0F // this is a long filename entry
00255 #define ATTR_DIRECTORY 0x10 // entry is a directory name
00256 #define ATTR_ARCHIVE 0x20 // file is new or modified
00257 BYTE deLowerCase;
00258 #define LCASE_BASE 0x08 // filename base in lower case
00259 #define LCASE_EXT 0x10 // filename extension in lower case
00260 BYTE deCHundredth;
00261 BYTE deCTime[2];
00262 BYTE deCDate[2];
00263 BYTE deADate[2];
00264 WORD deHighClust;
00265 BYTE deMTime[2];
00266 BYTE deMDate[2];
00267 WORD deStartCluster;
00268 DWORD deFileSize;
00269 } GNUC_PACKED;
00270
00271
00272 #define DIRENTRIES_PER_SECTOR 0x10
00273
00274
00275 struct winentry {
00276 BYTE weCnt;
00277 #define WIN_LAST 0x40
00278 #define WIN_CNT 0x3f
00279 BYTE wePart1[10];
00280 BYTE weAttributes;
00281 #define ATTR_WIN95 0x0f
00282 BYTE weReserved1;
00283 BYTE weChksum;
00284 BYTE wePart2[12];
00285 WORD weReserved2;
00286 BYTE wePart3[4];
00287 } GNUC_PACKED;
00288
00289 #define WIN_ENTRY_CHARS 13 // Number of chars per winentry
00290
00291
00292
00293 #define WIN_MAXLEN 255
00294
00295
00296
00297
00298
00299 #define DT_2SECONDS_MASK 0x1F // seconds divided by 2
00300 #define DT_2SECONDS_SHIFT 0
00301 #define DT_MINUTES_MASK 0x7E0 // minutes
00302 #define DT_MINUTES_SHIFT 5
00303 #define DT_HOURS_MASK 0xF800 // hours
00304 #define DT_HOURS_SHIFT 11
00305
00306
00307
00308 #define DD_DAY_MASK 0x1F // day of month
00309 #define DD_DAY_SHIFT 0
00310 #define DD_MONTH_MASK 0x1E0 // month
00311 #define DD_MONTH_SHIFT 5
00312 #define DD_YEAR_MASK 0xFE00 // year - 1980
00313 #define DD_YEAR_SHIFT 9
00314
00315
00316 struct FileInfo_s
00317 {
00318 unsigned long StartCluster;
00319 unsigned long Size;
00320 unsigned char Attr;
00321 unsigned short CreateTime;
00322 unsigned short CreateDate;
00323 } GNUC_PACKED;
00324
00325 typedef struct FileInfo_s FileInfo_t;
00326
00327
00328 unsigned char fatInit(DevDisk_t* disk);
00329 unsigned int fatClusterSize(void);
00330 unsigned char fatGetDirEntry(unsigned short entry);
00331 unsigned char fatChangeDirectory(unsigned short entry);
00332 void fatPrintDirEntry(void);
00333 void fatDumpDirSlot(unsigned short entry);
00334 FileInfo_t* fatGetFileInfo(void);
00335 unsigned long fatGetFilesize(void);
00336 char* fatGetFilename(void);
00337 char* fatGetDirname(void);
00338 void fatLoadCluster(unsigned long cluster, unsigned char *buffer);
00339 unsigned long fatClusterToSector(unsigned long cluster);
00340
00341 unsigned long fatNextCluster(unsigned long cluster);
00342 unsigned long fatNextFreeCluster(void);
00343 unsigned long fatClusterValue(unsigned long cluster);
00344 int fatWriteClusterValue(unsigned long cluster, unsigned value);
00345 unsigned char* fatGetFatSector(unsigned long fatsector);
00346
00347 int fatCreateFile(unsigned char* filename, FileInfo_t* fileInfo);
00348 int fatFormat(unsigned long volsize);
00349
00350 #endif