blob: 73eaaaefa03c298bf9546cca4f790b96466a2a08 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#include <stdint.h>
#include <stdbool.h>
#define FAT_INFO ((struct fat_info *)0x7c03)
struct fat_info {
uint8_t oem[8];
uint16_t bytes_per_sector;//Assumed to be 512
uint8_t sectors_per_cluster;//Assumed to be 1
uint16_t reserved_sectors;
uint8_t fats;//Assumed to be 1
uint16_t root_entries;
uint16_t sectors;//Assumed not to be 0
uint8_t media_type;
uint16_t sectors_per_fat;
uint16_t sectors_per_track;
uint16_t heads;
uint32_t hidden_sectors;
uint32_t sectors_long;
uint8_t drive_number;
uint8_t reserved;
uint8_t ext_boot_marker;
uint32_t volume_id;
uint8_t label[11];
uint8_t fs_type[8];
} __attribute__ ((packed));
enum {
FA_READ_ONLY = 0x01,
FA_HIDDEN = 0x02,
FA_SYSTEM = 0x04,
FA_LABEL = 0x08,
FA_DIRECTORY = 0x10,
FA_ARCHIVE = 0x20,
FA_LFN = 0x0f
};
struct directory_entry {
uint8_t name[11];
uint8_t attrib;
uint8_t name_case;
uint8_t created_decimal;
uint16_t created_time;
uint16_t created_date;
uint16_t accessed_date;
uint16_t ignore;
uint16_t modified_time;
uint16_t modified_date;
uint16_t first_cluster;
uint32_t length;
} __attribute__ ((packed));
#define FAT ((uint16_t *)0x00020000)
void load_fat();
#define CTOS(c) (FAT_INFO->reserved_sectors + FAT_INFO->sectors_per_fat + (FAT_INFO->root_entries >> 4) + (c) - 2)
bool get_entry(uint8_t *path, struct directory_entry *at);
bool update_entry(uint8_t *path, struct directory_entry *value);
bool create_entry(uint8_t *path, struct directory_entry *value);
|