2026-02-07 update
Some checks failed
Cargo Build & Test / Rust project - latest (stable) (push) Failing after 8s
Some checks failed
Cargo Build & Test / Rust project - latest (stable) (push) Failing after 8s
This commit is contained in:
32
src/mem.rs
32
src/mem.rs
@@ -6,13 +6,13 @@ use crate::{
|
||||
};
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Value<'a, R> {
|
||||
pub enum Value<R> {
|
||||
Value(u8),
|
||||
Register { reg: &'a R, offset: u16 },
|
||||
Register { reg: R, offset: u16 },
|
||||
}
|
||||
|
||||
impl<R> Value<'_, R> {
|
||||
pub fn reg_map(self, f: impl FnOnce(&R, u16) -> u8) -> u8 {
|
||||
impl<R> Value<R> {
|
||||
pub fn reg_map(self, f: impl FnOnce(R, u16) -> u8) -> u8 {
|
||||
match self {
|
||||
Value::Value(v) => v,
|
||||
Value::Register { reg, offset } => f(reg, offset),
|
||||
@@ -117,7 +117,7 @@ pub struct MemoryMap<R> {
|
||||
}
|
||||
|
||||
impl<R: Copy> MemoryMap<R> {
|
||||
pub fn read(&self, addr: u16) -> Value<'_, R> {
|
||||
pub fn read(&self, addr: u16) -> Value<R> {
|
||||
// self.edit_ver += 1;
|
||||
for segment in &self.segments {
|
||||
if segment.position <= addr && addr - segment.position < segment.size {
|
||||
@@ -125,7 +125,7 @@ impl<R: Copy> MemoryMap<R> {
|
||||
Data::RAM(items) => Value::Value(items[(addr - segment.position) as usize]),
|
||||
Data::ROM(items) => Value::Value(items[(addr - segment.position) as usize]),
|
||||
Data::Reg(reg) => Value::Register {
|
||||
reg,
|
||||
reg: *reg,
|
||||
offset: addr - segment.position,
|
||||
},
|
||||
Data::Mirror(pos) => {
|
||||
@@ -201,28 +201,28 @@ impl<R: Copy> MemoryMap<R> {
|
||||
None
|
||||
}
|
||||
|
||||
fn peek_val(&self, addr: u16) -> Option<u8> {
|
||||
fn peek_val(&self, addr: u16) -> Result<u8, Option<(R, u16)>> {
|
||||
for segment in &self.segments {
|
||||
if segment.position <= addr && addr - segment.position < segment.size {
|
||||
return match &segment.mem {
|
||||
Data::RAM(items) => Some(items[(addr - segment.position) as usize]),
|
||||
Data::ROM(items) => Some(items[(addr - segment.position) as usize]),
|
||||
Data::Reg(_) => None,
|
||||
Data::RAM(items) => Ok(items[(addr - segment.position) as usize]),
|
||||
Data::ROM(items) => Ok(items[(addr - segment.position) as usize]),
|
||||
Data::Reg(r) => Err(Some((*r, addr - segment.position))),
|
||||
Data::Mirror(pos) => {
|
||||
let offset = addr - segment.position;
|
||||
self.peek_val(pos + offset)
|
||||
}
|
||||
Data::Disabled => None,
|
||||
Data::Disabled => Err(None),
|
||||
};
|
||||
}
|
||||
}
|
||||
None
|
||||
Err(None)
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Copy> Memory for MemoryMap<R> {
|
||||
fn peek(&self, addr: usize) -> Option<u8> {
|
||||
self.peek_val(addr as u16)
|
||||
self.peek_val(addr as u16).ok()
|
||||
}
|
||||
|
||||
fn len(&self) -> usize {
|
||||
@@ -455,14 +455,14 @@ impl Mapped {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn peek_ppu(&self, addr: u16) -> Option<u8> {
|
||||
pub fn peek_ppu(&self, addr: u16) -> Result<u8, Option<(PPUMMRegisters, u16)>> {
|
||||
self.ppu.peek_val(addr)
|
||||
}
|
||||
pub fn ppu_edit_ver(&self) -> usize {
|
||||
self.ppu.edit_ver
|
||||
}
|
||||
pub fn peek_cpu(&self, addr: u16) -> Option<u8> {
|
||||
self.cpu.peek_val(addr)
|
||||
self.cpu.peek_val(addr).ok()
|
||||
}
|
||||
pub fn cpu_edit_ver(&self) -> usize {
|
||||
self.cpu.edit_ver
|
||||
@@ -638,7 +638,7 @@ impl<'a> PpuMem<'a> {
|
||||
pub fn new(mem: &'a mut Mapped) -> Self {
|
||||
Self(mem)
|
||||
}
|
||||
pub fn read(&mut self, addr: u16) -> Value<'_, PPUMMRegisters> {
|
||||
pub fn read(&mut self, addr: u16) -> Value<PPUMMRegisters> {
|
||||
self.0.ppu.read(addr)
|
||||
}
|
||||
pub fn write(&mut self, addr: u16, val: u8, reg_fn: impl FnOnce(&PPUMMRegisters, u16, u8)) {
|
||||
|
||||
Reference in New Issue
Block a user