#ifndef FAT12_H
#define FAT12_H
#include "vfat.h"
#define EOC 0x0fff
#define BAD_CLUSTER 0x0ff7
extern bootSector_t bootSector;
extern unsigned short rootDirSectors;
extern unsigned short firstDataSector;
extern unsigned short dataSec;
extern unsigned short countOfClusters;
void init_volume(unsigned short resvdSecCnt);
unsigned short firstSectorOfCluster(unsigned short n);
unsigned short FATOffset(unsigned short n);
unsigned short thisFATSecNum(unsigned short n, unsigned char i);
unsigned short thisFATEntOffset(unsigned short n);
unsigned short accessFATEntry(unsigned short n, const char *secBuff);
void setFATEntry(unsigned short n, unsigned short clusEntryVal, char *secBuff);
#ifdef IN_FAT12_C
#define extern
#define inline
#endif
extern inline unsigned short firstSectorOfCluster(unsigned short n)
{
return (n - 2) * bootSector.BPB_SecPerClus + firstDataSector;
}
extern inline unsigned short FATOffset(unsigned short n)
{
return n + n / 2;
}
extern inline unsigned short thisFATSecNum(unsigned short n, unsigned char i)
{
return bootSector.BPB_ResvdSecCnt + FATOffset(n) / bootSector.BPB_BytsPerSec + i * bootSector.BPB_FATSz16;
}
extern inline unsigned short thisFATEntOffset(unsigned short n)
{
return FATOffset(n) % bootSector.BPB_BytsPerSec;
}
extern inline unsigned short accessFATEntry(unsigned short n, const char secBuff[])
{
unsigned short clusEntryVal;
clusEntryVal = *(const unsigned short *)&secBuff[thisFATEntOffset(n)];
if (n & 1)
clusEntryVal >>= 4;
else
clusEntryVal &= 0x0fff;
return clusEntryVal;
}
extern inline void setFATEntry(unsigned short n, unsigned short clusEntryVal, char secBuff[])
{
if (n & 1) {
clusEntryVal <<= 4;
*(unsigned short *)&secBuff[thisFATEntOffset(n)] &= 0x000f;
}
else {
clusEntryVal &= 0x0fff;
*(unsigned short *)&secBuff[thisFATEntOffset(n)] &= 0xf000;
}
*(unsigned short *)&secBuff[thisFATEntOffset(n)] |= clusEntryVal;
}
#endif