Minor refactors and bug fixes
Some checks failed
Cargo Build & Test / Rust project - latest (stable) (push) Has been cancelled

- Bit instruction now sets Z flag correctly
- DMA is no longer handled by cpu.rs
This commit is contained in:
2026-01-26 01:21:37 -06:00
parent f861f75b21
commit 7b76026ade
10 changed files with 379 additions and 166 deletions

View File

@@ -200,10 +200,8 @@ impl<R: Copy> MemoryMap<R> {
}
None
}
}
impl<R> Memory for MemoryMap<R> {
fn peek(&self, addr: u16) -> Option<u8> {
fn peek_val(&self, addr: u16) -> Option<u8> {
for segment in &self.segments {
if segment.position <= addr && addr - segment.position < segment.size {
return match &segment.mem {
@@ -212,7 +210,7 @@ impl<R> Memory for MemoryMap<R> {
Data::Reg(_) => None,
Data::Mirror(pos) => {
let offset = addr - segment.position;
self.peek(pos + offset)
self.peek_val(pos + offset)
}
Data::Disabled => None,
};
@@ -220,6 +218,20 @@ impl<R> Memory for MemoryMap<R> {
}
None
}
}
impl<R: Copy> Memory for MemoryMap<R> {
fn peek(&self, addr: usize) -> Option<u8> {
self.peek_val(addr as u16)
}
fn len(&self) -> usize {
self.segments
.iter()
.map(|s| s.position as usize + s.size as usize)
.max()
.unwrap_or(0)
}
fn edit_ver(&self) -> usize {
self.edit_ver
@@ -269,7 +281,7 @@ impl fmt::Display for SegmentId {
}
}
#[derive(Clone)]
#[derive(Debug, Clone)]
pub struct Mapped {
cpu: MemoryMap<CPUMMRegisters>,
ppu: MemoryMap<PPUMMRegisters>,
@@ -444,13 +456,13 @@ impl Mapped {
}
pub fn peek_ppu(&self, addr: u16) -> Option<u8> {
self.ppu.peek(addr)
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(addr)
self.cpu.peek_val(addr)
}
pub fn cpu_edit_ver(&self) -> usize {
self.cpu.edit_ver
@@ -608,11 +620,7 @@ impl<'a> CpuMem<'a> {
}
Some((CPUMMRegisters::APU, offset, val)) => {
if offset == 0x014 {
*self.dma = DmaState::Running {
cpu_addr: (val as u16) << 8,
rem: 0xFF,
read: None,
};
*self.dma = DmaState::Idle((val as u16) << 8);
} else if offset == 0x16 {
self.controllers.write_joy_strobe(val);
} else {