diff --git a/sw/main.c b/sw/main.c
index 587dfd3d65f182889a7fa312149a78daffc53e29..30332d048133507e5d77d973e1e58c01b22ca932 100644
--- a/sw/main.c
+++ b/sw/main.c
@@ -9,7 +9,7 @@
 
 uint8_t buf[512];
 
-void sd_readblock(uint8_t addr) {
+void sd_readblock(uint32_t addr) {
 	uint32_t resp;
 	int i;
 
@@ -24,20 +24,65 @@ void sd_readblock(uint8_t addr) {
 		buf[i] = sd_card_read_byte();
 	}
 
+	/*
 	for (i = 0; i < 512; i++){
 		if (i % 16 == 0)
 			cprintf("\n %2x: ", i);
 		cprintf("%2x ", buf[i]);
 	}
+	*/
 
 	cprintf("\n");
 }
 
+void 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);
+	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("\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("\n");
+}
+
 int main() {
 	int i;
 	uint8_t sw;
 	uint32_t resp;
 	ebpb_t* epbp;
+	fs_info_sector_t* fsis;
+	vfat_dentry_t* vfat_dentry;
+	dos_dentry_t* dos_dentry;
+	uint32_t cluster;
+
+
+	uint16_t reserved_count;
+	uint32_t sectors_per_fat;
+	uint8_t fat_count;
+
+	uint32_t data_region_start;
+
 	char s[16];
 	s[15] = 0;
 
@@ -45,36 +90,13 @@ int main() {
 	cprintf("Hello, world!\n");
 
 	for (i = 0; i < 16; i++){
-		cprintf("Mapping %1xxxx to %2xxxx\n", i, i);
+		//cprintf("Mapping %1xxxx to %2xxxx\n", i, i);
 		mapper_write(i, i);
 	}
 
 	cprintf("Enabling Mapper\n");
 	mapper_enable(1);
 
-	cprintf("Writing 0xcccc to 0x4000\n");
-	*(unsigned int*)(0x4000) = 0xcccc;
-
-	cprintf("Writing 0xdddd to 0x5000\n");
-	*(unsigned int*)(0x5000) = 0xdddd;
-
-	cprintf("Mapping %1xxxx to %2xxxx\n", 4, 16);
-	mapper_write(16, 4);
-
-	cprintf("Mapping %1xxxx to %2xxxx\n", 5, 16);
-	mapper_write(16, 5);
-
-	cprintf("Writing 0xa5a5 to 0x4000\n");
-	*(unsigned int*)(0x4000) = 0xa5a5;
-
-	cprintf("Reading from 0x5000: %x\n", *(unsigned int*)(0x5000));
-
-	cprintf("Resetting map\n");
-	mapper_write(4, 4);
-	mapper_write(5, 5);
-
-	cprintf("Reading from 0x4000: %x\n", *(unsigned int*)(0x4000));
-	cprintf("Reading from 0x5000: %x\n", *(unsigned int*)(0x5000));
 
 	// This will read a 512 block from the sd card.
 	// The RCA is hard coded for the one that I have on hand as responses
@@ -115,36 +137,73 @@ int main() {
 
 	epbp = (ebpb_t*)&buf[11];
 
-	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);
-	cprintf("\n");
+	print_pbp_info(epbp);
 
-	cprintf("Sectors per track: %d\n", epbp->bpb3.sectors_per_track);
-	cprintf("Head Count: %d\n", epbp->bpb3.head_count);
-	cprintf("Hidden Sector Count: %d\n", epbp->bpb3.hidden_sector_count);
-	cprintf("Logical Sector Count: %d\n", epbp->bpb3.logical_sector_count);
-	cprintf("Sectors per Fat: %d\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%x\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("\n");
+	cprintf("Boot Signature: %x %x\n", buf[510], buf[511]);
 
-	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);
+	reserved_count = epbp->bpb3.bpb2.reserved_sectors;
+	fat_count = epbp->bpb3.bpb2.fat_count;
+	sectors_per_fat = epbp->bpb3.sectors_per_fat;
+
+	sd_readblock(1);
+
+	fsis = (fs_info_sector_t*)&buf[0];
+
+	cprintf("Free Data clusters: %ld\n", fsis->free_data_clusters);
+	cprintf("Last allocated data cluster: %ld\n", fsis->last_allocated_data_cluster);
+
+	cprintf("32 reserved sectors, reading from sector 32...\n");
+	sd_readblock(32);
+	cprintf("CLUST_0: %08lx\n", *(uint32_t*)&buf[0]);
+	cprintf("CLUST_1: %08lx\n", *(uint32_t*)&buf[1*4]);
+
+	cprintf("Root cluster: %08lx\n", *(uint32_t*)&buf[2*4]);
+
+	data_region_start = reserved_count + fat_count*sectors_per_fat;
+	cprintf("Data Region starting sector: %lx\n", data_region_start);
+	cprintf("Reading root directory entry...\n");
+
+	cprintf("%ld\n", data_region_start*512);
+
+	sd_readblock(data_region_start);
+
+	vfat_dentry = (vfat_dentry_t*)buf;
+	while(vfat_dentry->sequence_number == 0xe5)
+		vfat_dentry++;
+
+
+	cprintf("Sequence: %x\n", vfat_dentry->sequence_number);
+	cprintf("Name: ");
+	for (i = 0;; i++) {						// this will not work for proper vfat names
+		if (i < 5) {
+			if (!vfat_dentry->filename0[i])
+				break;
+			cprintf("%c", vfat_dentry->filename0[i]);
+		} else if (i < 11) {
+			if (!vfat_dentry->filename0[i])
+				break;
+			cprintf("%c", vfat_dentry->filename1[i-5]);
+		} else {
+			break;
+		}
+	}
 	cprintf("\n");
+	dos_dentry = (dos_dentry_t*)(vfat_dentry + 1);
+
+	cprintf("DOS name: %.8s.%.3s\n", &dos_dentry->filename, &dos_dentry->extension);
+	
+	cluster = (dos_dentry->first_cluster_h << 16) + dos_dentry->first_cluster_l;
+	cprintf("Cluster: %ld\n", cluster);
+
+	cprintf("File location: %lx\n", data_region_start + (cluster - 2) * 8);
+
+	sd_readblock(data_region_start + (cluster - 2) * 8);
+
+	cprintf("File contents: %s\n", buf);
+
+	cprintf("Done!\n");
+
 
-	cprintf("Boot Signature: %x %x\n", buf[510], buf[511]);
 
 	while (1) {