From fb86a312bdd9c95dc1ed71e3d1b6ee6ca2c6c62b Mon Sep 17 00:00:00 2001 From: notsomeidiot123 Date: Fri, 20 Sep 2024 11:01:57 -0400 Subject: [PATCH] Writing file data --- .gitignore | 4 ++- tools/diskwrite.c | 66 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 7d43da0..ecdb3c0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,6 @@ bin mount image.bin dump.img -diskwrite \ No newline at end of file +diskwrite +*.bin +*.elf \ No newline at end of file diff --git a/tools/diskwrite.c b/tools/diskwrite.c index ae4d8c5..7ac93a2 100644 --- a/tools/diskwrite.c +++ b/tools/diskwrite.c @@ -6,6 +6,14 @@ #define FILE_END 0xFFFFFFFF #define FILE_FREE 0x00000000 +#define FAT_ATTR_READONLY 0x01 +#define FAT_ATTR_HIDDEN 0x02 +#define FAT_ATTR_SYSTEM 0x04 +#define FAT_ATTR_VOLID 0x08 +#define FAT_ATTR_DIR 0x10 +#define FAT_ATTR_ARCHIVE 0x20 +#define FAT_LFN FAT_ATTR_READONLY | FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM | FAT_ATTR_VOLID + typedef uint8_t *buffer_t; typedef struct{ @@ -95,6 +103,23 @@ int write_sector(FILE *file, uint32_t sector_start, uint32_t count, buffer_t buf return result; } +uint32_t find_free_cluster(fat_info *info){ + uint32_t start = info->fsinfo.cluster_search_start; + if(start < 2){ + start = 2; + } + for(int i = start; i < (info->bpb.bytes_per_sector/4) * info->bpb.sectors_per_fat; i++){ + if(info->file_table[i]) continue; + return i; + } +} + +void write_cluster_value(fat_info *info, uint32_t value, uint32_t cluster){ + for(int i = 0; i < info->bpb.fat_count; i++){ + info->file_table[cluster + i * info->bpb.sectors_per_fat * (info->bpb.bytes_per_sector/4)] = value; + } +} + int write_file(char *path, fat_info *info, FILE *file){ FILE *ifile = fopen(path, "r"); if(!ifile){ @@ -107,29 +132,48 @@ int write_file(char *path, fat_info *info, FILE *file){ verbose && printf("File has length of 0, skipping %s\n", path); return 0; } - buffer_t ifile_data = malloc(ifsize); + buffer_t ifile_data = malloc((ifsize/(info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster) + 1) * info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster); rewind(ifile); if(!fread(ifile_data, 1, ifsize, ifile)){ verbose && printf("Failed to read from file %s, skippping\n", path); return 0; } - //create file in root dir - - + file_t dirent = {0}; + memcpy(dirent.filename, path, 8); + int extoffset = 0; + while(*(path + extoffset) != '.' && *(path + extoffset)){ + extoffset++; + } + verbose && printf("File extension at %d\n", extoffset); + memcpy(dirent.ext, path + extoffset, 3); + dirent.size_bytes = ifsize; + verbose && printf("Writing %u sectors\n", ifsize/(info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster) + 1); + uint32_t last_cluster = 0; + for(int i = 0; i < ifsize/(info->bpb.bytes_per_sector * info->bpb.sectors_per_cluster) + 1; i++){ + uint32_t cluster = find_free_cluster(info); + if(i == 0){ + dirent.start_cluster_high = cluster >> 16; + dirent.start_cluster_low = cluster & 0xFFFF; + } + write_sector(file, (info->bpb.reserved_sectors + info->bpb.fat_count * info->bpb.sectors_per_fat) + cluster * info->bpb.sectors_per_cluster, info->bpb.sectors_per_cluster, ifile_data); + verbose && printf("wrote to sector %x %x sectors of data from buffer\n", (info->bpb.reserved_sectors + info->bpb.fat_count * info->bpb.sectors_per_fat) + cluster * info->bpb.sectors_per_cluster, info->bpb.sectors_per_cluster); + if(last_cluster != 0) write_cluster_value(info, cluster, last_cluster); + last_cluster = cluster; + } + verbose && printf("last cluster: %d\n", last_cluster); + write_cluster_value(info, FILE_END, last_cluster); } -int read_file(){ - -} - -void write_cluster_value(fat_info *info, uint32_t value, uint32_t cluster){ - for(int i = 0; i < info->bpb.fat_count; i++){ - info->file_table[cluster + i * info->bpb.sectors_per_fat * (info->bpb.bytes_per_sector/4)] = value; +int read_file(fat_info *info, uint32_t first_cluster, file_t *file, buffer_t buffer){ + if(file == 0){ + buffer_t buf; + } } + int fat_write_back(FILE *file, fat_info *info){ int res = 0; if(res = write_sector(file, info->bpb.reserved_sectors, info->bpb.sectors_per_fat * info->bpb.fat_count, (buffer_t)info->file_table) == 0){