Minor refactors and bug fixes
Some checks failed
Cargo Build & Test / Rust project - latest (stable) (push) Has been cancelled
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:
32
src/mem.rs
32
src/mem.rs
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user