read_external function

This commit is contained in:
2023-07-07 19:11:29 -05:00
parent e7a40db745
commit e6d97f7203
5 changed files with 46 additions and 14 deletions
+16
View File
@@ -56,6 +56,22 @@ impl Bus {
}
}
/// This function is meant to be used by external parts of the code,
/// for example, to render register info without mutating them
pub fn read_external(&self, address: u32) -> u8 {
let section = Bus::map_address(address);
match section {
MemoryMap::WRAM => self.read_wram(address),
MemoryMap::PPU => self.ppu.registers.read_external(address as u16),
MemoryMap::CPU => self.internal_registers.read_external(
address as u16,
&self.ppu.registers,
),
MemoryMap::Joypad => 0x00, // TODO: Placeholder
MemoryMap::Cartridge => self.rom.read(address),
}
}
pub fn read(&mut self, address: u32) -> u8 {
let section = Bus::map_address(address);
match section {
+15 -2
View File
@@ -24,18 +24,31 @@ impl InternalRegisters {
self.registers[(address - INTERNAL_REGISTERS_ADDRESS) as usize] = value
}
pub fn read(&self, address: u16, ppu_registers: &mut PPURegisters) -> u8 {
pub fn read_external(&self, address: u16, ppu_registers: &PPURegisters) -> u8 {
match address {
RDNMI => self.read_vblank_nmi(ppu_registers),
_ => self._read(address),
}
}
pub fn read(&self, address: u16, ppu_registers: &mut PPURegisters) -> u8 {
match address {
RDNMI => self.read_vblank_nmi_mut(ppu_registers),
_ => self._read(address),
}
}
pub fn write(&mut self, address: u16, value: u8) {
self._write(address, value);
}
fn read_vblank_nmi(&self, ppu_registers: &mut PPURegisters) -> u8 {
fn read_vblank_nmi(&self, ppu_registers: &PPURegisters) -> u8 {
let byte = self._read(RDNMI);
let result = (byte & 0x7F) | ((ppu_registers.vblank_nmi as u8) << 7);
result
}
fn read_vblank_nmi_mut(&self, ppu_registers: &mut PPURegisters) -> u8 {
let byte = self._read(RDNMI);
// When register is read, bit 7 is cleared
let result = (byte & 0x7F) | ((ppu_registers.vblank_nmi as u8) << 7);
+4
View File
@@ -164,6 +164,10 @@ impl PPURegisters {
self.data[(address as usize) - 0x2100] = value;
}
pub fn read_external(&self, address: u16) -> u8 {
self._read(address)
}
pub fn read(&mut self, address: u16) -> u8 {
let result = self._read(address);
match address {