From 946234381d1d9d7a1cee773a233d328f90ac650e Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Tue, 5 Dec 2023 08:08:20 -0800 Subject: [PATCH] Look through files without trying too hard --- sw/kernel/filesystems/fat32.h | 6 ++++-- sw/kernel/filesystems/fat32.s | 7 ++++++- sw/kernel/filesystems/fat32_c.c | 25 +++++++++++++++++++++---- sw/test_code/fs_test/main.c | 2 +- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/sw/kernel/filesystems/fat32.h b/sw/kernel/filesystems/fat32.h index d938e00..fdaf57e 100644 --- a/sw/kernel/filesystems/fat32.h +++ b/sw/kernel/filesystems/fat32.h @@ -10,11 +10,13 @@ extern uint16_t fat_start_sector; extern uint32_t data_start_sector; extern uint32_t fat_size; extern uint8_t* sd_buf; +extern uint8_t sectors_per_cluster; struct fat32_directory_entry { char file_name[8]; char file_ext[3]; uint8_t attr1; + uint8_t attr2; uint8_t create_time_10ms; uint16_t create_time; uint16_t create_date; @@ -37,7 +39,7 @@ struct lfn_entry { uint16_t name_2[2]; }; -uint8_t fat32_get_cluster_by_name(char* name, struct fat32_directory_entry* dentry); -uint8_t fat32_read_cluster(uint32_t cluster, void* buf); +int8_t fat32_get_cluster_by_name(char* name, struct fat32_directory_entry* dentry); +int8_t fat32_read_cluster(uint32_t cluster, void* buf); #endif diff --git a/sw/kernel/filesystems/fat32.s b/sw/kernel/filesystems/fat32.s index 4349d0b..c30f2e5 100644 --- a/sw/kernel/filesystems/fat32.s +++ b/sw/kernel/filesystems/fat32.s @@ -9,7 +9,8 @@ .export _fat32_init -.export _root_cluster, _fat_start_sector, _data_start_sector, _fat_size, _sd_buf +.export _root_cluster, _fat_start_sector, _data_start_sector +.export _fat_size, _sd_buf, _sectors_per_cluster .data @@ -17,6 +18,7 @@ _root_cluster: .res 4 _fat_start_sector: .res 2 _data_start_sector: .res 4 _fat_size: .res 4 +_sectors_per_cluster: .res 1 _sd_buf: .res 512 @@ -47,6 +49,9 @@ root_cluster_offs = _sd_buf + $2C ldx #>ptr1 jsr _SD_readSingleBlock + lda sectors_per_cluster + sta _sectors_per_cluster + ldx #$00 L1: lda root_cluster_offs,x sta _root_cluster,x diff --git a/sw/kernel/filesystems/fat32_c.c b/sw/kernel/filesystems/fat32_c.c index 4163141..64fa1c0 100644 --- a/sw/kernel/filesystems/fat32_c.c +++ b/sw/kernel/filesystems/fat32_c.c @@ -1,19 +1,23 @@ #include "fat32.h" + #include #include - #include +#include -uint8_t fat32_read_cluster(uint32_t cluster, void* buf) { +int8_t fat32_read_cluster(uint32_t cluster, void* buf) { uint8_t error; uint32_t addr = (cluster - 2) + data_start_sector; SD_readSingleBlock(addr, buf, &error); return error; } -uint8_t fat32_get_cluster_by_name(char* name, struct fat32_directory_entry* dentry) { +int8_t fat32_get_cluster_by_name(char* name, struct fat32_directory_entry* dentry) { struct fat32_directory_entry* local_entry; int i = 0; + + cprintf("Sectors per cluster: %hhx\n", sectors_per_cluster); + fat32_read_cluster(root_cluster, sd_buf); for (i = 0; i < 16; i++){ local_entry = sd_buf + i*32; @@ -21,6 +25,19 @@ uint8_t fat32_get_cluster_by_name(char* name, struct fat32_directory_entry* dent continue; } cprintf("Name: %.11s\n", local_entry->file_name, local_entry->file_ext); - cprintf("attr1: %x\n", local_entry->attr1); + if (!strncmp(local_entry->file_name, name, 11)) { + i = -1; + break; + } } + if (i != -1) { + cprintf("Failed to find file.\n"); + return -1; + } + + cprintf("Found file!\n"); + + cprintf("attr1: %x\n", local_entry->attr1); + cprintf("cluster: %x %x\n", local_entry->cluster_high, local_entry->cluster_low); + cprintf("File Size: %lx\n", local_entry->file_size); } diff --git a/sw/test_code/fs_test/main.c b/sw/test_code/fs_test/main.c index f0ecc4e..7b4df75 100644 --- a/sw/test_code/fs_test/main.c +++ b/sw/test_code/fs_test/main.c @@ -6,6 +6,6 @@ void fat32_init(void); int main(void) { struct fat32_directory_entry dentry; fat32_init(); - fat32_get_cluster_by_name("KERNEL O65", &dentry); + fat32_get_cluster_by_name("TEST TXT", &dentry); return 0; } \ No newline at end of file