clang-format -i *.cc *.c *.h
This commit is contained in:
38
fat12.c
38
fat12.c
@@ -6,8 +6,7 @@
|
||||
#define kHeads 2
|
||||
#define kFatSizeSectors 2
|
||||
#define kRootDirSizeSectors 7
|
||||
#define kDataRegionStartSector (1 + kFatSizeSectors*2 + kRootDirSizeSectors)
|
||||
|
||||
#define kDataRegionStartSector (1 + kFatSizeSectors * 2 + kRootDirSizeSectors)
|
||||
|
||||
typedef struct {
|
||||
char name[8];
|
||||
@@ -24,22 +23,22 @@ static uint8_t* gFat;
|
||||
static direntry* gRootdir;
|
||||
|
||||
static int readsector(int c, int h, int s, uint8_t* addr) {
|
||||
register uint8_t* dest asm ("bx") = addr;
|
||||
register uint8_t nsects asm ("al") = 1;
|
||||
register uint8_t func asm ("ah") = 0x02;
|
||||
register uint8_t sect asm ("cl") = s;
|
||||
register uint8_t cyl asm ("ch") = c;
|
||||
register uint8_t head asm ("dh") = h;
|
||||
register uint8_t drive asm ("dl") = 0;
|
||||
register uint16_t seg asm ("es") = 0;
|
||||
register uint8_t* dest asm("bx") = addr;
|
||||
register uint8_t nsects asm("al") = 1;
|
||||
register uint8_t func asm("ah") = 0x02;
|
||||
register uint8_t sect asm("cl") = s;
|
||||
register uint8_t cyl asm("ch") = c;
|
||||
register uint8_t head asm("dh") = h;
|
||||
register uint8_t drive asm("dl") = 0;
|
||||
register uint16_t seg asm("es") = 0;
|
||||
|
||||
register uint8_t ret asm("ah");
|
||||
|
||||
for (int i = 0; i < 3; i++) {
|
||||
asm volatile ("int $0x13"
|
||||
: "=r" (ret)
|
||||
: "r" (dest), "r" (nsects), "r" (func), "r" (sect),
|
||||
"r" (cyl), "r" (head), "r" (drive), "r" (seg));
|
||||
asm volatile("int $0x13"
|
||||
: "=r"(ret)
|
||||
: "r"(dest), "r"(nsects), "r"(func), "r"(sect), "r"(cyl),
|
||||
"r"(head), "r"(drive), "r"(seg));
|
||||
if (ret != 0x80) {
|
||||
break;
|
||||
}
|
||||
@@ -52,20 +51,21 @@ static int readcluster(int cluster) {
|
||||
int offs = cluster * 3 / 2;
|
||||
if (cluster % 2) {
|
||||
// high nibble is lsb + whole byte
|
||||
return ((gFat[offs] & 0xf0) >> 4) + (gFat[offs+1] << 4);
|
||||
return ((gFat[offs] & 0xf0) >> 4) + (gFat[offs + 1] << 4);
|
||||
} else {
|
||||
return gFat[offs] + ((gFat[offs+1] & 0x0f) << 8);
|
||||
return gFat[offs] + ((gFat[offs + 1] & 0x0f) << 8);
|
||||
}
|
||||
}
|
||||
|
||||
static void cluster2chs(int cluster, int* c, int* h, int* s) {
|
||||
int logicalsector = kDataRegionStartSector + (cluster - 2) * kSectorsPerCluster;
|
||||
int logicalsector =
|
||||
kDataRegionStartSector + (cluster - 2) * kSectorsPerCluster;
|
||||
*s = (logicalsector % kSectorsPerTrack) + 1;
|
||||
*h = (logicalsector / kSectorsPerTrack) % kHeads;
|
||||
*c = logicalsector / (kHeads * kSectorsPerTrack);
|
||||
}
|
||||
|
||||
static int strncmp(const char* s1, const char *s2, size_t len) {
|
||||
static int strncmp(const char* s1, const char* s2, size_t len) {
|
||||
for (int i = 0; i < len && s1[i]; i++) {
|
||||
if (s1[i] != s2[i]) {
|
||||
return 1;
|
||||
@@ -77,7 +77,7 @@ static int strncmp(const char* s1, const char *s2, size_t len) {
|
||||
|
||||
static int loadfile(direntry* entry, void* addr) {
|
||||
int cluster = entry->cluster;
|
||||
for (int i = 0; i < entry->size; i+=1024) {
|
||||
for (int i = 0; i < entry->size; i += 1024) {
|
||||
int c, h, s;
|
||||
cluster2chs(cluster, &c, &h, &s);
|
||||
if (readsector(c, h, s, addr + i)) {
|
||||
|
Reference in New Issue
Block a user