Fix stoarge card IO register positions and allow reading off the end of the disk
This commit is contained in:
parent
76e54acfeb
commit
40ea7eae82
@ -13,7 +13,7 @@ use std::{
|
||||
collections::VecDeque,
|
||||
fmt::Display,
|
||||
fs::File,
|
||||
io::{Read, Seek, SeekFrom},
|
||||
io::{self, Read, Seek, SeekFrom},
|
||||
};
|
||||
use toml::Value;
|
||||
|
||||
@ -48,7 +48,7 @@ pub struct Storage {
|
||||
// 0x4-0x8: Sector count
|
||||
// 0x8-0xA: Command (W) / Status(R)
|
||||
// 0xA-0xC: Data
|
||||
// 0xC-0x11: Start address for DMA
|
||||
// 0xC-0x10: Start address for DMA
|
||||
|
||||
impl Card for Storage {
|
||||
fn new(data: Value) -> anyhow::Result<(Self, Option<Box<dyn DMAHandler>>)> {
|
||||
@ -86,7 +86,7 @@ impl Card for Storage {
|
||||
}
|
||||
NullableResult::Ok(self.read_data.pop_front().unwrap_or(0))
|
||||
}
|
||||
0xC..=0x10 => NullableResult::Ok(u32_get_be_byte(self.start_addresss, address - 0xD)),
|
||||
0xC..=0xF => NullableResult::Ok(u32_get_be_byte(self.start_addresss, address - 0xC)),
|
||||
(0xFE..=0xFF) => NullableResult::Ok(u16_get_be_byte(ID, address - 0xFE)),
|
||||
_ => NullableResult::Null,
|
||||
}
|
||||
@ -109,7 +109,11 @@ impl Card for Storage {
|
||||
.unwrap();
|
||||
let mut buf = Vec::new();
|
||||
buf.resize(self.count as usize * SECTOR_SIZE as usize, 0);
|
||||
file.read_exact(&mut buf).unwrap();
|
||||
match file.read_exact(&mut buf) {
|
||||
Ok(_) => (),
|
||||
Err(e) if e.kind() == io::ErrorKind::UnexpectedEof => (),
|
||||
Err(e) => Err(e).unwrap(),
|
||||
}
|
||||
self.read_data.extend(buf);
|
||||
self.status.set(Status::DATA_READY, true);
|
||||
}
|
||||
@ -120,7 +124,11 @@ impl Card for Storage {
|
||||
.unwrap();
|
||||
let mut buf = Vec::new();
|
||||
buf.resize(self.count as usize * SECTOR_SIZE as usize, 0);
|
||||
file.read_exact(&mut buf).unwrap();
|
||||
match file.read_exact(&mut buf) {
|
||||
Ok(_) => (),
|
||||
Err(e) if e.kind() == io::ErrorKind::UnexpectedEof => (),
|
||||
Err(e) => Err(e).unwrap(),
|
||||
}
|
||||
self.read_data.extend(buf);
|
||||
self.status.set(Status::BUSY, true);
|
||||
self.transfer = true;
|
||||
|
Loading…
Reference in New Issue
Block a user