|
1 | 1 | // based on https://crates.io/crates/mini_fat by https://github.com/gridbugs
|
2 | 2 |
|
3 | 3 | use crate::{
|
4 |
| - disk::{Read, Seek, SeekFrom}, |
| 4 | + disk::{AlignedBuffer, AlignedSlice, Read, Seek, SeekFrom}, |
5 | 5 | screen,
|
6 | 6 | };
|
7 | 7 | use core::{char::DecodeUtf16Error, fmt::Write as _};
|
@@ -36,12 +36,7 @@ struct Bpb {
|
36 | 36 |
|
37 | 37 | impl Bpb {
|
38 | 38 | fn parse<D: Read + Seek>(disk: &mut D) -> Self {
|
39 |
| - static mut BPB_BUFFER: [u8; 512] = [0; 512]; |
40 |
| - let mut raw = { |
41 |
| - let buffer = unsafe { &mut BPB_BUFFER[..] }; |
42 |
| - &mut buffer[..512] |
43 |
| - }; |
44 |
| - disk.read_exact(&mut raw); |
| 39 | + let raw = disk.read_exact(512); |
45 | 40 |
|
46 | 41 | let bytes_per_sector = u16::from_le_bytes(raw[11..13].try_into().unwrap());
|
47 | 42 | let sectors_per_cluster = raw[13];
|
@@ -217,16 +212,20 @@ impl<D: Read + Seek> FileSystem<D> {
|
217 | 212 | }
|
218 | 213 | FatType::Fat12 | FatType::Fat16 => {
|
219 | 214 | let root_directory_size = self.bpb.root_directory_size();
|
220 |
| - static mut ROOT_DIR_BUFFER: [u8; 0x4000] = [0; 0x4000]; |
221 |
| - let buffer = unsafe { &mut ROOT_DIR_BUFFER[..] }; |
222 |
| - assert!(root_directory_size <= buffer.len()); |
223 |
| - let raw = &mut buffer[..root_directory_size]; |
| 215 | + static mut ROOT_DIR_BUFFER: AlignedBuffer<0x4000> = AlignedBuffer { |
| 216 | + buffer: [0; 0x4000], |
| 217 | + limit: 0x4000, |
| 218 | + }; |
| 219 | + let buffer = unsafe { &mut ROOT_DIR_BUFFER }; |
| 220 | + buffer.limit = root_directory_size; |
224 | 221 |
|
225 | 222 | self.disk
|
226 | 223 | .seek(SeekFrom::Start(self.bpb.root_directory_offset()));
|
227 |
| - self.disk.read_exact(raw); |
| 224 | + self.disk.read_exact_into(buffer); |
228 | 225 |
|
229 |
| - raw.chunks(DIRECTORY_ENTRY_BYTES) |
| 226 | + buffer |
| 227 | + .slice() |
| 228 | + .chunks(DIRECTORY_ENTRY_BYTES) |
230 | 229 | .take_while(|raw_entry| raw_entry[0] != END_OF_DIRECTORY_PREFIX)
|
231 | 230 | .filter(|raw_entry| raw_entry[0] != UNUSED_ENTRY_PREFIX)
|
232 | 231 | .map(RawDirectoryEntry::parse)
|
@@ -535,22 +534,22 @@ where
|
535 | 534 | FatType::Fat32 => {
|
536 | 535 | let base = n as u64 * 4;
|
537 | 536 | disk.seek(SeekFrom::Start(fat_start + base));
|
538 |
| - let mut buf = [0; 4]; |
539 |
| - disk.read_exact(&mut buf); |
| 537 | + let buf = disk.read_exact(4); |
| 538 | + let buf: [u8; 4] = buf.try_into().unwrap(); |
540 | 539 | u32::from_le_bytes(buf) & 0x0FFFFFFF
|
541 | 540 | }
|
542 | 541 | FatType::Fat16 => {
|
543 | 542 | let base = n as u64 * 2;
|
544 | 543 | disk.seek(SeekFrom::Start(fat_start + base));
|
545 |
| - let mut buf = [0; 2]; |
546 |
| - disk.read_exact(&mut buf); |
| 544 | + let buf = disk.read_exact(2); |
| 545 | + let buf: [u8; 2] = buf.try_into().unwrap(); |
547 | 546 | u16::from_le_bytes(buf) as u32
|
548 | 547 | }
|
549 | 548 | FatType::Fat12 => {
|
550 | 549 | let base = n as u64 + (n as u64 / 2);
|
551 | 550 | disk.seek(SeekFrom::Start(fat_start + base));
|
552 |
| - let mut buf = [0; 2]; |
553 |
| - disk.read_exact(&mut buf); |
| 551 | + let buf = disk.read_exact(2); |
| 552 | + let buf: [u8; 2] = buf.try_into().unwrap(); |
554 | 553 | let entry16 = u16::from_le_bytes(buf);
|
555 | 554 | if n & 1 == 0 {
|
556 | 555 | (entry16 & 0xFFF) as u32
|
|
0 commit comments