From c5f1b64cba5cdd59203d4a270a8716a43d92f607 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sat, 16 Apr 2022 21:43:26 -0500 Subject: [PATCH 1/8] Move filesystem code into its own directory Step one into cleaning up the codebase a little bit. --- sw/Makefile | 2 +- sw/exec.c | 4 ++-- sw/{ => filesystem}/fat.c | 2 +- sw/{ => filesystem}/fat.h | 0 sw/{ => filesystem}/o65.c | 0 sw/{ => filesystem}/o65.h | 0 sw/main.c | 3 +-- 7 files changed, 5 insertions(+), 6 deletions(-) rename sw/{ => filesystem}/fat.c (98%) rename sw/{ => filesystem}/fat.h (100%) rename sw/{ => filesystem}/o65.c (100%) rename sw/{ => filesystem}/o65.h (100%) diff --git a/sw/Makefile b/sw/Makefile index 3c85514..86e6789 100644 --- a/sw/Makefile +++ b/sw/Makefile @@ -15,7 +15,7 @@ LISTS=lists TESTS=tests SRCS=$(wildcard *.s) $(wildcard *.c) -SRCS+=$(wildcard usb/*.c) +SRCS+=$(wildcard filesystem/*.s) $(wildcard filesystem/*.c) OBJS+=$(patsubst %.s,%.o,$(filter %s,$(SRCS))) OBJS+=$(patsubst %.c,%.o,$(filter %c,$(SRCS))) diff --git a/sw/exec.c b/sw/exec.c index 8e3a622..0824eb6 100644 --- a/sw/exec.c +++ b/sw/exec.c @@ -2,8 +2,8 @@ #include #include -#include "fat.h" -#include "o65.h" +#include "filesystem/fat.h" +#include "filesystem/o65.h" void exec(char* filename) { o65_header_t* header; diff --git a/sw/fat.c b/sw/filesystem/fat.c similarity index 98% rename from sw/fat.c rename to sw/filesystem/fat.c index 5fb947f..7583210 100644 --- a/sw/fat.c +++ b/sw/filesystem/fat.c @@ -1,7 +1,7 @@ #include #include -#include "fat.h" +#include "filesystem/fat.h" #include "sd_card.h" uint8_t fat_buf[512]; diff --git a/sw/fat.h b/sw/filesystem/fat.h similarity index 100% rename from sw/fat.h rename to sw/filesystem/fat.h diff --git a/sw/o65.c b/sw/filesystem/o65.c similarity index 100% rename from sw/o65.c rename to sw/filesystem/o65.c diff --git a/sw/o65.h b/sw/filesystem/o65.h similarity index 100% rename from sw/o65.h rename to sw/filesystem/o65.h diff --git a/sw/main.c b/sw/main.c index 23cdb63..f57a9cc 100644 --- a/sw/main.c +++ b/sw/main.c @@ -6,8 +6,7 @@ #include "uart.h" #include "mapper.h" #include "sd_card.h" -#include "fat.h" -#include "o65.h" +#include "filesystem/fat.h" #include "exec.h" uint8_t buf[512]; From 238a4b6f98c1d20194e49bafe7810806032b508a Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sat, 16 Apr 2022 21:47:54 -0500 Subject: [PATCH 2/8] Move devices into devices folder --- sw/Makefile | 1 + sw/{ => devices}/board_io.h | 0 sw/{ => devices}/board_io.s | 0 sw/{ => devices}/conio.s | 0 sw/{ => devices}/interrupt.h | 0 sw/{ => devices}/interrupt.s | 0 sw/{ => devices}/io.inc65 | 0 sw/{ => devices}/mapper.h | 0 sw/{ => devices}/mapper.s | 0 sw/{ => devices}/sd_card.c | 2 +- sw/{ => devices}/sd_card.h | 0 sw/{ => devices}/sd_card_asm.s | 0 sw/{ => devices}/uart.h | 0 sw/{ => devices}/uart.s | 0 sw/filesystem/fat.c | 4 ++-- sw/irq.c | 4 ++-- sw/main.c | 8 ++++---- 17 files changed, 10 insertions(+), 9 deletions(-) rename sw/{ => devices}/board_io.h (100%) rename sw/{ => devices}/board_io.s (100%) rename sw/{ => devices}/conio.s (100%) rename sw/{ => devices}/interrupt.h (100%) rename sw/{ => devices}/interrupt.s (100%) rename sw/{ => devices}/io.inc65 (100%) rename sw/{ => devices}/mapper.h (100%) rename sw/{ => devices}/mapper.s (100%) rename sw/{ => devices}/sd_card.c (97%) rename sw/{ => devices}/sd_card.h (100%) rename sw/{ => devices}/sd_card_asm.s (100%) rename sw/{ => devices}/uart.h (100%) rename sw/{ => devices}/uart.s (100%) diff --git a/sw/Makefile b/sw/Makefile index 86e6789..1e984c9 100644 --- a/sw/Makefile +++ b/sw/Makefile @@ -16,6 +16,7 @@ TESTS=tests SRCS=$(wildcard *.s) $(wildcard *.c) SRCS+=$(wildcard filesystem/*.s) $(wildcard filesystem/*.c) +SRCS+=$(wildcard devices/*.s) $(wildcard devices/*.c) OBJS+=$(patsubst %.s,%.o,$(filter %s,$(SRCS))) OBJS+=$(patsubst %.c,%.o,$(filter %c,$(SRCS))) diff --git a/sw/board_io.h b/sw/devices/board_io.h similarity index 100% rename from sw/board_io.h rename to sw/devices/board_io.h diff --git a/sw/board_io.s b/sw/devices/board_io.s similarity index 100% rename from sw/board_io.s rename to sw/devices/board_io.s diff --git a/sw/conio.s b/sw/devices/conio.s similarity index 100% rename from sw/conio.s rename to sw/devices/conio.s diff --git a/sw/interrupt.h b/sw/devices/interrupt.h similarity index 100% rename from sw/interrupt.h rename to sw/devices/interrupt.h diff --git a/sw/interrupt.s b/sw/devices/interrupt.s similarity index 100% rename from sw/interrupt.s rename to sw/devices/interrupt.s diff --git a/sw/io.inc65 b/sw/devices/io.inc65 similarity index 100% rename from sw/io.inc65 rename to sw/devices/io.inc65 diff --git a/sw/mapper.h b/sw/devices/mapper.h similarity index 100% rename from sw/mapper.h rename to sw/devices/mapper.h diff --git a/sw/mapper.s b/sw/devices/mapper.s similarity index 100% rename from sw/mapper.s rename to sw/devices/mapper.s diff --git a/sw/sd_card.c b/sw/devices/sd_card.c similarity index 97% rename from sw/sd_card.c rename to sw/devices/sd_card.c index 24646df..33bf986 100644 --- a/sw/sd_card.c +++ b/sw/devices/sd_card.c @@ -1,7 +1,7 @@ #include #include -#include "sd_card.h" +#include "devices/sd_card.h" void sd_init() { uint32_t resp; diff --git a/sw/sd_card.h b/sw/devices/sd_card.h similarity index 100% rename from sw/sd_card.h rename to sw/devices/sd_card.h diff --git a/sw/sd_card_asm.s b/sw/devices/sd_card_asm.s similarity index 100% rename from sw/sd_card_asm.s rename to sw/devices/sd_card_asm.s diff --git a/sw/uart.h b/sw/devices/uart.h similarity index 100% rename from sw/uart.h rename to sw/devices/uart.h diff --git a/sw/uart.s b/sw/devices/uart.s similarity index 100% rename from sw/uart.s rename to sw/devices/uart.s diff --git a/sw/filesystem/fat.c b/sw/filesystem/fat.c index 7583210..e07359a 100644 --- a/sw/filesystem/fat.c +++ b/sw/filesystem/fat.c @@ -1,8 +1,8 @@ #include #include -#include "filesystem/fat.h" -#include "sd_card.h" +#include "fat.h" +#include "devices/sd_card.h" uint8_t fat_buf[512]; diff --git a/sw/irq.c b/sw/irq.c index 313ea7d..4d2c0d8 100644 --- a/sw/irq.c +++ b/sw/irq.c @@ -2,8 +2,8 @@ #include #include -#include "interrupt.h" -#include "uart.h" +#include "devices/interrupt.h" +#include "devices/uart.h" char lastchar; diff --git a/sw/main.c b/sw/main.c index f57a9cc..c753882 100644 --- a/sw/main.c +++ b/sw/main.c @@ -2,10 +2,10 @@ #include #include -#include "board_io.h" -#include "uart.h" -#include "mapper.h" -#include "sd_card.h" +#include "devices/board_io.h" +#include "devices/uart.h" +#include "devices/mapper.h" +#include "devices/sd_card.h" #include "filesystem/fat.h" #include "exec.h" From c6098f2d1ff3d60e9976e1e96dc1885d5e072337 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sat, 16 Apr 2022 21:58:37 -0500 Subject: [PATCH 3/8] Separate kernel code from test code Eventually I want the kernel to be loaded from the SD card as well, but it still needs to separate from user programs. At some point there should be a folder just for the BIOS, which should read from the boot block of the SD card and start executing, and thats it. --- sw/{ => kernel}/Makefile | 4 ++-- sw/{ => kernel}/boot.s | 0 sw/{ => kernel}/devices/board_io.h | 0 sw/{ => kernel}/devices/board_io.s | 0 sw/{ => kernel}/devices/conio.s | 0 sw/{ => kernel}/devices/interrupt.h | 0 sw/{ => kernel}/devices/interrupt.s | 0 sw/{ => kernel}/devices/io.inc65 | 0 sw/{ => kernel}/devices/mapper.h | 0 sw/{ => kernel}/devices/mapper.s | 0 sw/{ => kernel}/devices/sd_card.c | 0 sw/{ => kernel}/devices/sd_card.h | 0 sw/{ => kernel}/devices/sd_card_asm.s | 0 sw/{ => kernel}/devices/uart.h | 0 sw/{ => kernel}/devices/uart.s | 0 sw/{ => kernel}/exec.c | 0 sw/{ => kernel}/exec.h | 0 sw/{ => kernel}/filesystem/fat.c | 0 sw/{ => kernel}/filesystem/fat.h | 0 sw/{ => kernel}/filesystem/o65.c | 0 sw/{ => kernel}/filesystem/o65.h | 0 sw/{ => kernel}/irq.c | 0 sw/{ => kernel}/link.ld | 0 sw/{ => kernel}/main.c | 0 sw/{ => kernel}/tests/test_main.c | 6 +++--- sw/{ => kernel}/vectors.s | 0 26 files changed, 5 insertions(+), 5 deletions(-) rename sw/{ => kernel}/Makefile (89%) rename sw/{ => kernel}/boot.s (100%) rename sw/{ => kernel}/devices/board_io.h (100%) rename sw/{ => kernel}/devices/board_io.s (100%) rename sw/{ => kernel}/devices/conio.s (100%) rename sw/{ => kernel}/devices/interrupt.h (100%) rename sw/{ => kernel}/devices/interrupt.s (100%) rename sw/{ => kernel}/devices/io.inc65 (100%) rename sw/{ => kernel}/devices/mapper.h (100%) rename sw/{ => kernel}/devices/mapper.s (100%) rename sw/{ => kernel}/devices/sd_card.c (100%) rename sw/{ => kernel}/devices/sd_card.h (100%) rename sw/{ => kernel}/devices/sd_card_asm.s (100%) rename sw/{ => kernel}/devices/uart.h (100%) rename sw/{ => kernel}/devices/uart.s (100%) rename sw/{ => kernel}/exec.c (100%) rename sw/{ => kernel}/exec.h (100%) rename sw/{ => kernel}/filesystem/fat.c (100%) rename sw/{ => kernel}/filesystem/fat.h (100%) rename sw/{ => kernel}/filesystem/o65.c (100%) rename sw/{ => kernel}/filesystem/o65.h (100%) rename sw/{ => kernel}/irq.c (100%) rename sw/{ => kernel}/link.ld (100%) rename sw/{ => kernel}/main.c (100%) rename sw/{ => kernel}/tests/test_main.c (95%) rename sw/{ => kernel}/vectors.s (100%) diff --git a/sw/Makefile b/sw/kernel/Makefile similarity index 89% rename from sw/Makefile rename to sw/kernel/Makefile index 1e984c9..dd043a4 100644 --- a/sw/Makefile +++ b/sw/kernel/Makefile @@ -15,8 +15,7 @@ LISTS=lists TESTS=tests SRCS=$(wildcard *.s) $(wildcard *.c) -SRCS+=$(wildcard filesystem/*.s) $(wildcard filesystem/*.c) -SRCS+=$(wildcard devices/*.s) $(wildcard devices/*.c) +SRCS+=$(filter-out $(wildcard tests/*), $(wildcard **/*.s)) $(filter-out $(wildcard tests/*), $(wildcard **/*.c)) OBJS+=$(patsubst %.s,%.o,$(filter %s,$(SRCS))) OBJS+=$(patsubst %.c,%.o,$(filter %c,$(SRCS))) @@ -47,6 +46,7 @@ $(BIN): $(OBJS) $(CC) $(CFLAGS) -l $(LISTS)/$<.list -c $< -o $@ $(LISTS): + $(info $$SRCS is [${SRCS}]) mkdir -p $(addprefix $(LISTS)/,$(sort $(dir $(SRCS)))) mkdir $(LISTS)/$(sort $(dir $(TEST_SRCS))) diff --git a/sw/boot.s b/sw/kernel/boot.s similarity index 100% rename from sw/boot.s rename to sw/kernel/boot.s diff --git a/sw/devices/board_io.h b/sw/kernel/devices/board_io.h similarity index 100% rename from sw/devices/board_io.h rename to sw/kernel/devices/board_io.h diff --git a/sw/devices/board_io.s b/sw/kernel/devices/board_io.s similarity index 100% rename from sw/devices/board_io.s rename to sw/kernel/devices/board_io.s diff --git a/sw/devices/conio.s b/sw/kernel/devices/conio.s similarity index 100% rename from sw/devices/conio.s rename to sw/kernel/devices/conio.s diff --git a/sw/devices/interrupt.h b/sw/kernel/devices/interrupt.h similarity index 100% rename from sw/devices/interrupt.h rename to sw/kernel/devices/interrupt.h diff --git a/sw/devices/interrupt.s b/sw/kernel/devices/interrupt.s similarity index 100% rename from sw/devices/interrupt.s rename to sw/kernel/devices/interrupt.s diff --git a/sw/devices/io.inc65 b/sw/kernel/devices/io.inc65 similarity index 100% rename from sw/devices/io.inc65 rename to sw/kernel/devices/io.inc65 diff --git a/sw/devices/mapper.h b/sw/kernel/devices/mapper.h similarity index 100% rename from sw/devices/mapper.h rename to sw/kernel/devices/mapper.h diff --git a/sw/devices/mapper.s b/sw/kernel/devices/mapper.s similarity index 100% rename from sw/devices/mapper.s rename to sw/kernel/devices/mapper.s diff --git a/sw/devices/sd_card.c b/sw/kernel/devices/sd_card.c similarity index 100% rename from sw/devices/sd_card.c rename to sw/kernel/devices/sd_card.c diff --git a/sw/devices/sd_card.h b/sw/kernel/devices/sd_card.h similarity index 100% rename from sw/devices/sd_card.h rename to sw/kernel/devices/sd_card.h diff --git a/sw/devices/sd_card_asm.s b/sw/kernel/devices/sd_card_asm.s similarity index 100% rename from sw/devices/sd_card_asm.s rename to sw/kernel/devices/sd_card_asm.s diff --git a/sw/devices/uart.h b/sw/kernel/devices/uart.h similarity index 100% rename from sw/devices/uart.h rename to sw/kernel/devices/uart.h diff --git a/sw/devices/uart.s b/sw/kernel/devices/uart.s similarity index 100% rename from sw/devices/uart.s rename to sw/kernel/devices/uart.s diff --git a/sw/exec.c b/sw/kernel/exec.c similarity index 100% rename from sw/exec.c rename to sw/kernel/exec.c diff --git a/sw/exec.h b/sw/kernel/exec.h similarity index 100% rename from sw/exec.h rename to sw/kernel/exec.h diff --git a/sw/filesystem/fat.c b/sw/kernel/filesystem/fat.c similarity index 100% rename from sw/filesystem/fat.c rename to sw/kernel/filesystem/fat.c diff --git a/sw/filesystem/fat.h b/sw/kernel/filesystem/fat.h similarity index 100% rename from sw/filesystem/fat.h rename to sw/kernel/filesystem/fat.h diff --git a/sw/filesystem/o65.c b/sw/kernel/filesystem/o65.c similarity index 100% rename from sw/filesystem/o65.c rename to sw/kernel/filesystem/o65.c diff --git a/sw/filesystem/o65.h b/sw/kernel/filesystem/o65.h similarity index 100% rename from sw/filesystem/o65.h rename to sw/kernel/filesystem/o65.h diff --git a/sw/irq.c b/sw/kernel/irq.c similarity index 100% rename from sw/irq.c rename to sw/kernel/irq.c diff --git a/sw/link.ld b/sw/kernel/link.ld similarity index 100% rename from sw/link.ld rename to sw/kernel/link.ld diff --git a/sw/main.c b/sw/kernel/main.c similarity index 100% rename from sw/main.c rename to sw/kernel/main.c diff --git a/sw/tests/test_main.c b/sw/kernel/tests/test_main.c similarity index 95% rename from sw/tests/test_main.c rename to sw/kernel/tests/test_main.c index 0ce03a9..99e3dd8 100644 --- a/sw/tests/test_main.c +++ b/sw/kernel/tests/test_main.c @@ -1,8 +1,8 @@ #include -#include "board_io.h" -#include "uart.h" -#include "interrupt.h" +#include "devices/board_io.h" +#include "devices/uart.h" +#include "devices/interrupt.h" int main(void) { diff --git a/sw/vectors.s b/sw/kernel/vectors.s similarity index 100% rename from sw/vectors.s rename to sw/kernel/vectors.s From 8495f1f002a5f19a65e50c32c8b8699bc9f8226c Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sat, 16 Apr 2022 22:02:18 -0500 Subject: [PATCH 4/8] Update ci --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 04a587b..4213a4b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,11 +2,11 @@ default: tags: - docker -build-sw: +build-kernel: stage: build image: a2geek/cc65-pipeline script: - - cd sw/ + - cd sw/kernel - make From 6844c48a3bc0220d823f2b8fad1476e338a34305 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sat, 16 Apr 2022 22:07:19 -0500 Subject: [PATCH 5/8] Update ci --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4213a4b..3a766bf 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -36,7 +36,7 @@ test-sw: stage: test image: a2geek/cc65-pipeline script: - - cd sw/ + - cd sw/kernel - make test test_mm: From edd13e9b71008ed36d7f1d4469bf896da0db6ce8 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 17 Apr 2022 18:11:45 -0500 Subject: [PATCH 6/8] Remove debug information --- sw/kernel/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/sw/kernel/Makefile b/sw/kernel/Makefile index dd043a4..a84801d 100644 --- a/sw/kernel/Makefile +++ b/sw/kernel/Makefile @@ -46,7 +46,6 @@ $(BIN): $(OBJS) $(CC) $(CFLAGS) -l $(LISTS)/$<.list -c $< -o $@ $(LISTS): - $(info $$SRCS is [${SRCS}]) mkdir -p $(addprefix $(LISTS)/,$(sort $(dir $(SRCS)))) mkdir $(LISTS)/$(sort $(dir $(TEST_SRCS))) From 52f631e5580acd5513c31ee1f9c0483b2cf82e07 Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 17 Apr 2022 18:12:13 -0500 Subject: [PATCH 7/8] Allow finding files in the root directory This allows you to find the cluster number of a file in the root directory by name. The main program is a simple demo where you can type in a filename and it will tell you the cluster number. --- sw/kernel/filesystem/fat.c | 192 ++++++++++++++++++++++++++++++++----- sw/kernel/filesystem/fat.h | 15 ++- sw/kernel/main.c | 14 ++- 3 files changed, 193 insertions(+), 28 deletions(-) diff --git a/sw/kernel/filesystem/fat.c b/sw/kernel/filesystem/fat.c index e07359a..669b0a5 100644 --- a/sw/kernel/filesystem/fat.c +++ b/sw/kernel/filesystem/fat.c @@ -1,55 +1,65 @@ #include #include +#include #include "fat.h" #include "devices/sd_card.h" uint8_t fat_buf[512]; +static uint32_t fat_end_of_chain; + static full_bpb_t bpb; static uint32_t data_region_start; -void fat_print_pbp_info(ebpb_t* epbp){ - cprintf("Bytes per sector: %d\n", epbp->bpb3.bpb2.bytes_per_sector); - cprintf("Sectors per cluster: %d\n", epbp->bpb3.bpb2.sectors_per_cluster); - cprintf("Reserved Sectors: %d\n", epbp->bpb3.bpb2.reserved_sectors); - cprintf("Fat Count: %d\n", epbp->bpb3.bpb2.fat_count); - cprintf("Max Dir Entries: %d\n", epbp->bpb3.bpb2.max_dir_entries); - cprintf("Total Sector Count: %d\n", epbp->bpb3.bpb2.total_sector_count); - cprintf("Media Descriptor: 0x%x\n", epbp->bpb3.bpb2.media_descriptor); - cprintf("Sectors per Fat: %d\n", epbp->bpb3.bpb2.sectors_per_fat); +void fat_print_pbp_info(full_bpb_t* bpb){ + cprintf("Bytes per sector: %d\n", bpb->bytes_per_sector); + cprintf("Sectors per cluster: %d\n", bpb->sectors_per_cluster); + cprintf("Reserved Sectors: %d\n", bpb->reserved_sectors); + cprintf("Fat Count: %d\n", bpb->fat_count); + cprintf("Max Dir Entries: %d\n", bpb->max_dir_entries); + cprintf("Total Sector Count: %d\n", bpb->total_sector_count); + cprintf("Media Descriptor: 0x%x\n", bpb->media_descriptor); + cprintf("Sectors per Fat: %d\n", bpb->sectors_per_fat_16); cprintf("\n"); - cprintf("Sectors per track: %d\n", epbp->bpb3.sectors_per_track); - cprintf("Head Count: %d\n", epbp->bpb3.head_count); - cprintf("Hidden Sector Count: %ld\n", epbp->bpb3.hidden_sector_count); - cprintf("Logical Sector Count: %ld\n", epbp->bpb3.logical_sector_count); - cprintf("Sectors per Fat: %ld\n", epbp->bpb3.sectors_per_fat); - cprintf("Extended Flags: 0x%x\n", epbp->bpb3.extended_flags); - cprintf("Version: %d\n", epbp->bpb3.version); - cprintf("Root Cluster: 0x%lx\n", epbp->bpb3.root_cluster); - cprintf("System Information: 0x%x\n", epbp->bpb3.system_information); - cprintf("Backup Boot Sector: 0x%x\n", epbp->bpb3.backup_boot_sector); + cprintf("Sectors per track: %d\n", bpb->sectors_per_track); + cprintf("Head Count: %d\n", bpb->head_count); + cprintf("Hidden Sector Count: %ld\n", bpb->hidden_sector_count); + cprintf("Logical Sector Count: %ld\n", bpb->logical_sector_count); + cprintf("Sectors per Fat: %ld\n", bpb->sectors_per_fat_32); + cprintf("Extended Flags: 0x%x\n", bpb->extended_flags); + cprintf("Version: %d\n", bpb->version); + cprintf("Root Cluster: 0x%lx\n", bpb->root_cluster); + cprintf("System Information: 0x%x\n", bpb->system_information); + cprintf("Backup Boot Sector: 0x%x\n", bpb->backup_boot_sector); cprintf("\n"); - cprintf("Drive Number: %d\n", epbp->drive_num); - cprintf("Extended Signature: 0x%x\n", epbp->extended_signature); - cprintf("Volume ID: 0x%lx\n", epbp->volume_id); - cprintf("Partition Label: %.11s\n", &epbp->partition_label); - cprintf("Partition Label: %.8s\n", &epbp->filesystem_type); + cprintf("Drive Number: %d\n", bpb->drive_num); + cprintf("Extended Signature: 0x%x\n", bpb->extended_signature); + cprintf("Volume ID: 0x%lx\n", bpb->volume_id); + cprintf("Partition Label: %.11s\n", &bpb->partition_label); + cprintf("Partition Label: %.8s\n", &bpb->filesystem_type); cprintf("\n"); } void fat_init(){ sd_readblock(0, fat_buf); - memcpy(&bpb, &fat_buf[11], sizeof(ebpb_t)); + memcpy(&bpb, &fat_buf[11], sizeof(full_bpb_t)); sd_readblock(1, fat_buf); sd_readblock(32, fat_buf); + fat_print_pbp_info(&bpb); + data_region_start = bpb.reserved_sectors + bpb.fat_count*bpb.sectors_per_fat_32; + + sd_readblock(bpb.reserved_sectors, fat_buf); + + fat_end_of_chain = ((uint32_t*)fat_buf)[1] & FAT_EOC_CLUSTERMASK; + cprintf("End of chain indicator: %lx\n", fat_end_of_chain); } void fat_read(char* filename, void* buf) { @@ -71,3 +81,135 @@ void fat_read(char* filename, void* buf) { sd_readblock(data_region_start + (cluster - 2) * 8, buf); } + +//the dentry is a double pointer because we need to increment it. +void fat_parse_vfat_filenamename(vfat_dentry_t** vfat_dentry, char* name) { + uint8_t i; + uint8_t done; + char* shift_name; + uint8_t sequence_number = (*vfat_dentry)->sequence_number; + + // so basically we want to add 13*(sequence number-1) to name + + for (;;){ + shift_name = name + 13*((sequence_number & FAT_LFN_ENTRY_MASK) - 1); + + done = 0; + for(i = 0; i < 5; i++) { + shift_name[i] = (*vfat_dentry)->filename0[i]; + if (!shift_name[i]) { + done = 1; + break; + } + } + + if (!done) { + for(i = 0; i < 6; i++) { + shift_name[i+5] = (*vfat_dentry)->filename1[i]; + if (!shift_name[i+5]) { + done = 1; + break; + } + } + } + + if (!done) { + for(i = 0; i < 2; i++) { + shift_name[i+11] = (*vfat_dentry)->filename2[i]; + if (!shift_name[i+11]) { + done = 1; + break; + } + } + } + + if ((sequence_number & FAT_LFN_ENTRY_MASK) == 1) { + break; + } else { + (*vfat_dentry)++; + while((*vfat_dentry)->sequence_number == 0xe5) + (*vfat_dentry)++; + sequence_number = (*vfat_dentry)->sequence_number; + } + } + +} + +uint32_t fat_find_cluster_num(char* name, uint32_t cluster) { + vfat_dentry_t* vfat_dentry; + dos_dentry_t* dos_dentry; + char* vfat_name; + + cprintf("Looking for file %s\n", name); + + sd_readblock(data_region_start + (cluster - 2) * 8, fat_buf); + vfat_dentry = (vfat_dentry_t*)fat_buf; + + vfat_name = (char*)malloc(FAT_MAX_FILE_NAME); + + while(vfat_dentry->sequence_number == 0xe5) + vfat_dentry++; + + vfat_name[0] = '\0'; + + while(vfat_dentry->sequence_number) { + fat_parse_vfat_filenamename(&vfat_dentry, vfat_name); + cprintf("Parsed filename: %s\n", vfat_name); + + if (!strcmp(vfat_name, name)) { //TODO this is probably unsafe, use strncmp + cprintf("Found file %s\n", vfat_name); + break; + } else { + vfat_dentry += 2; + while(vfat_dentry->sequence_number == 0xe5) + vfat_dentry++; + } + } + + free(vfat_name); + + if (!vfat_dentry->sequence_number) { + cprintf("File not found.\n"); + return -1; + } + + dos_dentry = (dos_dentry_t*) vfat_dentry + 1; //dos entry follows last vfat entry + + cluster = ((uint32_t)dos_dentry->first_cluster_h << 16) + dos_dentry->first_cluster_l; + cprintf("Cluster: %ld\n", cluster); + + return cluster; +} + +uint16_t fat_parse_path_to_cluster(char* filename) { + //basically start at the root folder and search through it + int i; + int len; + + char* spaced_filename; + + uint32_t cluster = 2; //root chain is chain 2 + + if (filename[0] != '/') { + cprintf("Filename does not begin with '/'\n"); + return 0; + } + + filename++; + len = strlen(filename); + spaced_filename = (char*)malloc(len+1); //need to account for null byte + + for (i = 0; i <= len; i++) { + if (filename[i] == '/') { + spaced_filename[i] = '\0'; + } else { + spaced_filename[i] = filename[i]; + } + } + + cprintf("Fragment: %s\n", spaced_filename); + + fat_find_cluster_num(spaced_filename, cluster); + + free(spaced_filename); +} diff --git a/sw/kernel/filesystem/fat.h b/sw/kernel/filesystem/fat.h index bf374ab..9c26b5b 100644 --- a/sw/kernel/filesystem/fat.h +++ b/sw/kernel/filesystem/fat.h @@ -5,6 +5,15 @@ extern uint8_t fat_buf[]; +#define FAT_MAX_FILE_NAME 255 +#define FAT_CLUSTERS_PER_SECTOR 128 + +#define FAT_CLUSTERMASK 0x0fffffff +#define FAT_EOC_CLUSTERMASK 0x0ffffff8 + +#define FAT_LAST_LFN_MASK (1 << 6) +#define FAT_LFN_ENTRY_MASK 0x1f + typedef struct { uint16_t bytes_per_sector; uint8_t sectors_per_cluster; @@ -87,7 +96,7 @@ typedef struct { uint8_t checksum; uint16_t filename1[6]; uint16_t reserved; - uint16_t filename[2]; + uint16_t filename2[2]; } vfat_dentry_t; typedef struct { @@ -104,8 +113,10 @@ typedef struct { uint32_t file_size; } dos_dentry_t; -void fat_print_pbp_info(ebpb_t* epbp); +void fat_print_pbp_info(full_bpb_t* bpb); void fat_init(); void fat_read(char* filename, void* buf); +uint16_t fat_parse_path_to_cluster(char* filename); + #endif diff --git a/sw/kernel/main.c b/sw/kernel/main.c index c753882..21850fd 100644 --- a/sw/kernel/main.c +++ b/sw/kernel/main.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "devices/board_io.h" #include "devices/uart.h" @@ -14,6 +15,7 @@ uint8_t buf[512]; int main() { int i; uint16_t rca; + char* filename; clrscr(); cprintf("Hello, world!\n"); @@ -34,7 +36,17 @@ int main() { sd_select_card(rca); fat_init(); - exec("/test.o65"); + + filename = (char*)malloc(FAT_MAX_FILE_NAME); + + for(;;) { + cprintf("Filename: "); + cscanf("%s", filename); + cprintf("\n"); + fat_parse_path_to_cluster(filename); + } + + //exec("/test.o65"); cprintf("Done!\n"); From a9d9bc06196f7dc26d65e5c31776ddb59838cb1e Mon Sep 17 00:00:00 2001 From: Byron Lathi Date: Sun, 17 Apr 2022 20:17:22 -0500 Subject: [PATCH 8/8] Allow subdirectories Can now break apart a filepath into the parent directories and search for each one of them (not recursively!). --- sw/kernel/filesystem/fat.c | 47 +++++++++++++++++++++++++++++++------- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/sw/kernel/filesystem/fat.c b/sw/kernel/filesystem/fat.c index 669b0a5..e5187f3 100644 --- a/sw/kernel/filesystem/fat.c +++ b/sw/kernel/filesystem/fat.c @@ -45,6 +45,8 @@ void fat_print_pbp_info(full_bpb_t* bpb){ } void fat_init(){ + int i; + sd_readblock(0, fat_buf); memcpy(&bpb, &fat_buf[11], sizeof(full_bpb_t)); @@ -58,6 +60,15 @@ void fat_init(){ sd_readblock(bpb.reserved_sectors, fat_buf); + //uncomment to view start of FAT + + /* + for (i = 0; i < FAT_CLUSTERS_PER_SECTOR; i++) { + cprintf("%lx ", ((uint32_t*)fat_buf)[i]); + } + cprintf("\n\n"); + */ + fat_end_of_chain = ((uint32_t*)fat_buf)[1] & FAT_EOC_CLUSTERMASK; cprintf("End of chain indicator: %lx\n", fat_end_of_chain); } @@ -83,13 +94,13 @@ void fat_read(char* filename, void* buf) { } //the dentry is a double pointer because we need to increment it. -void fat_parse_vfat_filenamename(vfat_dentry_t** vfat_dentry, char* name) { +void fat_parse_vfat_filenamename(vfat_dentry_t** vfat_dentry, char* name, uint32_t cluster) { uint8_t i; + uint8_t overflows; uint8_t done; char* shift_name; uint8_t sequence_number = (*vfat_dentry)->sequence_number; - - // so basically we want to add 13*(sequence number-1) to name + overflows = 0; for (;;){ shift_name = name + 13*((sequence_number & FAT_LFN_ENTRY_MASK) - 1); @@ -126,9 +137,18 @@ void fat_parse_vfat_filenamename(vfat_dentry_t** vfat_dentry, char* name) { if ((sequence_number & FAT_LFN_ENTRY_MASK) == 1) { break; } else { - (*vfat_dentry)++; - while((*vfat_dentry)->sequence_number == 0xe5) + do { (*vfat_dentry)++; + if ((uint8_t*)*vfat_dentry >= fat_buf + sizeof(fat_buf)) { + overflows++; + if (overflows == bpb.sectors_per_cluster) { + cprintf("Too many overflows, go back to fat!\n"); //TODO this + return; + } + sd_readblock(data_region_start + (cluster - 2) * 8 + overflows, fat_buf); + *vfat_dentry = (vfat_dentry_t*)fat_buf; + } + } while((*vfat_dentry)->sequence_number == 0xe5); sequence_number = (*vfat_dentry)->sequence_number; } } @@ -153,7 +173,7 @@ uint32_t fat_find_cluster_num(char* name, uint32_t cluster) { vfat_name[0] = '\0'; while(vfat_dentry->sequence_number) { - fat_parse_vfat_filenamename(&vfat_dentry, vfat_name); + fat_parse_vfat_filenamename(&vfat_dentry, vfat_name, cluster); cprintf("Parsed filename: %s\n", vfat_name); if (!strcmp(vfat_name, name)) { //TODO this is probably unsafe, use strncmp @@ -185,8 +205,10 @@ uint16_t fat_parse_path_to_cluster(char* filename) { //basically start at the root folder and search through it int i; int len; + uint8_t dirs = 0; char* spaced_filename; + char* fragment; uint32_t cluster = 2; //root chain is chain 2 @@ -202,14 +224,23 @@ uint16_t fat_parse_path_to_cluster(char* filename) { for (i = 0; i <= len; i++) { if (filename[i] == '/') { spaced_filename[i] = '\0'; + dirs++; } else { spaced_filename[i] = filename[i]; } } - cprintf("Fragment: %s\n", spaced_filename); + fragment = spaced_filename; - fat_find_cluster_num(spaced_filename, cluster); + cprintf("Dirs: %d\n", dirs); + + for (i = 0; i <= dirs; i++) { + cprintf("Fragment: %s\n", fragment); + cluster = fat_find_cluster_num(fragment, cluster); + fragment = spaced_filename + strlen(fragment) + 1; + } free(spaced_filename); + + return cluster; }