Load dynamic programs using FAT32

This commit is contained in:
2026-02-20 22:10:09 +01:00
parent 00d9ce656c
commit 235f17e7cf
26 changed files with 112 additions and 68 deletions

42
src/fs.rs Normal file
View File

@@ -0,0 +1,42 @@
use bffs::io::{IoBase, Read, Seek};
const DISK_ADDR: *const u8 = 0x9000_0000 as *const _;
#[derive(Debug)]
pub struct Disk {
pos: u64,
size: u64,
}
impl Disk {
pub fn new(size: u64) -> Self {
Self { pos: 0, size }
}
}
impl IoBase for Disk {
type Error = ();
}
impl Seek for Disk {
fn seek(&mut self, pos: bffs::io::SeekFrom) -> Result<u64, bffs::error::Error<Self::Error>> {
match pos {
bffs::io::SeekFrom::Start(pos) => self.pos = pos,
bffs::io::SeekFrom::End(_) => unimplemented!(),
bffs::io::SeekFrom::Current(pos) => self.pos = (self.pos as i64 + pos) as u64,
}
Ok(self.pos)
}
}
impl Read for Disk {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, bffs::error::Error<Self::Error>> {
if self.pos >= self.size {
return Ok(0);
}
let size = usize::min(buf.len(), (self.size - self.pos) as usize);
(0..size).for_each(|i| buf[i] = unsafe { *DISK_ADDR.byte_add(i + self.pos as usize) });
self.pos += size as u64;
Ok(size)
}
}