⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.h

📁 Procyon方案(手工制作的MP3播放器电路及资料)
💻 H
📖 第 1 页 / 共 2 页
字号:
#define FATNUM          0xf             /* mask for numbering active FAT */
#define FATMIRROR       0x80            /* FAT is mirrored (like it always was) */
        WORD       	bpbFSVers;      /* filesystem version */
#define FSVERS     		0               /* currently only 0 is understood */
        DWORD       bpbRootClust;   /* start cluster for root directory */
        WORD       	bpbFSInfo;      /* filesystem info structure sector */
        WORD       	bpbBackup;      /* backup boot sector */
        /* There is a 12 byte filler here, but we ignore it */
};




/***************************************************************/
/* byte versions of the above structs 						   */
/***************************************************************/


/*
 * BIOS Parameter Block (BPB) for DOS 3.3
 */
struct byte_bpb33 {
        CHAR bpbBytesPerSec[2];       /* bytes per sector */
        CHAR bpbSecPerClust;          /* sectors per cluster */
        CHAR bpbResSectors[2];        /* number of reserved sectors */
        CHAR bpbFATs;                 /* number of FATs */
        CHAR bpbRootDirEnts[2];       /* number of root directory entries */
        CHAR bpbSectors[2];           /* total number of sectors */
        CHAR bpbMedia;                /* media descriptor */
        CHAR bpbFATsecs[2];           /* number of sectors per FAT */
        CHAR bpbSecPerTrack[2];       /* sectors per track */
        CHAR bpbHeads[2];             /* number of heads */
        CHAR bpbHiddenSecs[2];        /* number of hidden sectors */
};

/*
 * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
 * and bpbHugeSectors is not in the 3.3 bpb.
 */
struct byte_bpb50 {
        CHAR bpbBytesPerSec[2];       /* bytes per sector */
        CHAR bpbSecPerClust;          /* sectors per cluster */
        CHAR bpbResSectors[2];        /* number of reserved sectors */
        CHAR bpbFATs;                 /* number of FATs */
        CHAR bpbRootDirEnts[2];       /* number of root directory entries */
        CHAR bpbSectors[2];           /* total number of sectors */
        CHAR bpbMedia;                /* media descriptor */
        CHAR bpbFATsecs[2];           /* number of sectors per FAT */
        CHAR bpbSecPerTrack[2];       /* sectors per track */
        CHAR bpbHeads[2];             /* number of heads */
        CHAR bpbHiddenSecs[4];        /* number of hidden sectors */
        CHAR bpbHugeSectors[4];       /* # of sectors if bpbSectors == 0 */
};

/*
 * BPB for DOS 7.10 (FAT32).  This one has a few extensions to bpb50.
 */
struct byte_bpb710 {
        BYTE bpbBytesPerSec[2];     /* bytes per sector */
        BYTE bpbSecPerClust;        /* sectors per cluster */
        BYTE bpbResSectors[2];      /* number of reserved sectors */
        BYTE bpbFATs;               /* number of FATs */
        BYTE bpbRootDirEnts[2];     /* number of root directory entries */
        BYTE bpbSectors[2];         /* total number of sectors */
        BYTE bpbMedia;              /* media descriptor */
        BYTE bpbFATsecs[2];         /* number of sectors per FAT */
        BYTE bpbSecPerTrack[2];     /* sectors per track */
        BYTE bpbHeads[2];           /* number of heads */
        BYTE bpbHiddenSecs[4];      /* # of hidden sectors */
        BYTE bpbHugeSectors[4];     /* # of sectors if bpbSectors == 0 */
        BYTE bpbBigFATsecs[4];      /* like bpbFATsecs for FAT32 */
        BYTE bpbExtFlags[2];        /* extended flags: */
        BYTE bpbFSVers[2];          /* filesystem version */
        BYTE bpbRootClust[4];       /* start cluster for root directory */
        BYTE bpbFSInfo[2];          /* filesystem info structure sector */
        BYTE bpbBackup[2];          /* backup boot sector */
        /* There is a 12 byte filler here, but we ignore it */
};

/*
 * FAT32 FSInfo block.
 */
struct fsinfo {
        BYTE fsisig1[4];
        BYTE fsifill1[480];
        BYTE fsisig2[4];
        BYTE fsinfree[4];
        BYTE fsinxtfree[4];
        BYTE fsifill2[12];
        BYTE fsisig3[4];
        BYTE fsifill3[508];
        BYTE fsisig4[4];
};



/***************************************************************/
/***************************************************************/


/*
 * Structure of a dos directory entry.
 */
struct direntry {
        BYTE        deName[8];      /* filename, blank filled */
#define SLOT_EMPTY      0x00            /* slot has never been used */
#define SLOT_E5         0x05            /* the real value is 0xe5 */
#define SLOT_DELETED    0xe5            /* file in this slot deleted */
        BYTE        deExtension[3]; /* extension, blank filled */
        BYTE        deAttributes;   /* file attributes */
#define ATTR_NORMAL     0x00            /* normal file */
#define ATTR_READONLY   0x01            /* file is readonly */
#define ATTR_HIDDEN     0x02            /* file is hidden */
#define ATTR_SYSTEM     0x04            /* file is a system file */
#define ATTR_VOLUME     0x08            /* entry is a volume label */
#define ATTR_LONG_FILENAME	0x0f		/* this is a long filename entry */			    
#define ATTR_DIRECTORY  0x10            /* entry is a directory name */
#define ATTR_ARCHIVE    0x20            /* file is new or modified */
        BYTE        deLowerCase;    /* NT VFAT lower case flags */
#define LCASE_BASE      0x08            /* filename base in lower case */
#define LCASE_EXT       0x10            /* filename extension in lower case */
        BYTE        deCHundredth;   /* hundredth of seconds in CTime */
        BYTE        deCTime[2];     /* create time */
        BYTE        deCDate[2];     /* create date */
        BYTE        deADate[2];     /* access date */
        WORD        deHighClust; 	/* high bytes of cluster number */
        BYTE        deMTime[2];     /* last update time */
        BYTE        deMDate[2];     /* last update date */
        WORD        deStartCluster; /* starting cluster of file */
        DWORD       deFileSize;  	/* size of file in bytes */
};

/*
 * Structure of a Win95 long name directory entry
 */
struct winentry {
        BYTE        weCnt;
#define WIN_LAST        0x40
#define WIN_CNT         0x3f
        BYTE        wePart1[10];
        BYTE        weAttributes;
#define ATTR_WIN95      0x0f
        BYTE        weReserved1;
        BYTE        weChksum;
        BYTE        wePart2[12];
        WORD       	weReserved2;
        BYTE        wePart3[4];
};

#define WIN_CHARS       13      /* Number of chars per winentry */

/*
 * Maximum filename length in Win95
 * Note: Must be < sizeof(dirent.d_name)
 */
#define WIN_MAXLEN      255

/*
 * This is the format of the contents of the deTime field in the direntry
 * structure.
 * We don't use bitfields because we don't know how compilers for
 * arbitrary machines will lay them out.
 */
#define DT_2SECONDS_MASK        0x1F    /* seconds divided by 2 */
#define DT_2SECONDS_SHIFT       0
#define DT_MINUTES_MASK         0x7E0   /* minutes */
#define DT_MINUTES_SHIFT        5
#define DT_HOURS_MASK           0xF800  /* hours */
#define DT_HOURS_SHIFT          11

/*
 * This is the format of the contents of the deDate field in the direntry
 * structure.
 */
#define DD_DAY_MASK             0x1F    /* day of month */
#define DD_DAY_SHIFT            0
#define DD_MONTH_MASK           0x1E0   /* month */
#define DD_MONTH_SHIFT          5
#define DD_YEAR_MASK            0xFE00  /* year - 1980 */
#define DD_YEAR_SHIFT           9



/*
 *
 * Prototypes
 *
 */ 

unsigned char init_fat( unsigned char device);

unsigned long get_dir_entry(unsigned int entry, unsigned int count);

void load_sectors(unsigned long cluster, unsigned char *buffer);
unsigned long next_cluster(unsigned long cluster);

unsigned long get_filesize(void);
char *get_filename(void);
char *get_dirname(void);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -