Load dynamic programs using FAT32
This commit is contained in:
42
src/fs.rs
Normal file
42
src/fs.rs
Normal 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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user