Đọc/ghi FAT

Một phần của tài liệu Giáo trình tổng quan về DHD (Trang 38)

Ví dụ: ghi vào entry 2 giá trị F2Ah và entry 3 giá trị BC5h. Do byte 0,1,2 lưu số hiệu đĩa, nên entry 2 sẽđược ghi vào byte thứ 3,4 và entry 3 sẽđược ghi vào byte thứ 4,5 . Cách ghi như sau:

Byte 0 1 2 3 4 5

Giá trị (số hiệu đĩa ) 2A 5F BC unsigned char fat[512*9]; //mảng chứa bảng fat đọc từđĩa

void WriteFat (unsigned new_fat, unsigned k) // ghi giá trị new_fat vào entry thứ k = 2,3,...,3071 {

unsigned i=k*3/2; //entry k sẽđược ghi vào byte thứ i và i+1 if (k%2==0)// k chẵn

{ //đặt 8 bít cuối của new_fat vào byte thứ i fat[i] = new_fat&0x0FF;

//đặt 4 bít cao của new_fat vào 4 bít cuối của byte thứ i+1 fat[i+1] = (fat[i+1]&0xF0) | (new_fat>>8);

} else //k lẻ

{ //đặt 8 bít cao vào vào byte thứ i+1 fat[i+1]=new_fat>>4;

//đặt 4 bít thấp vào 4 bít cao của byte thứ i

fat[i]=((new_fat&0xF)<<4)|(fat[i]&0x0F); }

}

Số sector 1 9 9 14 Cịn lại

Lưu trữ Boot sector FAT12 FAT12 DIR DATA

Byte 0,1,2 3,4,5 … 4606,4607

Lưu trữ e0,e1 (số hiệu đĩa) e2,e3 … e3070, e3071

Bảng FAT12 = 9 sector = 4608 bytes = 3072 entry (mỗi entry 12 bit)

Byte 0-7 8-10 11 12-21 22-23 24-25 26-27 28-31 Lưu trữ Tên File Phần mở rộng ADVSHR Dành riêng Giờ Ngày Số hiệu khối đầu Kích thước File Bảng DIR= 14 sector = 7168 byte = 224 entry (mỗi entry 32 byte), 1 sector=16 entry

Ví dụ: giả sử new_fat = 1AB, luu vao entry k=7 ->luu vao byte i=10 và i+1=11

9 10 11

AB CD EF (trước khi ghi) AB BD 1A (sau khi ghi)

unsigned ReadFat (unsigned k) // Đọc giá trị của entry thứ k (k>=2) {

unsigned i=k*3/2; //entry thứ k ở byte thứ i, i+1

unsigned val_fat=(fat[i+1]<<8) | fat[i] ; // hoặc val_fat=fat[i+1]*256+fat[i]; if (val_fat%2==0) val_fat=val_fat & 0x0FFF;

else val_fat=val_fat>>4; return val_fat; }

Một phần của tài liệu Giáo trình tổng quan về DHD (Trang 38)

Tải bản đầy đủ (PDF)

(200 trang)