#include #include #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);