From a3f12e61b46981888fcdd37c90ce685f1728c6c4 Mon Sep 17 00:00:00 2001 From: Franco Colmenarez Date: Mon, 12 Dec 2022 22:04:03 -0500 Subject: [PATCH] WIP PPU structure --- snes-core/src/cpu/bus.rs | 6 ++++++ snes-core/src/emulator.rs | 3 +++ snes-core/src/lib.rs | 1 + snes-core/src/ppu.rs | 0 snes-core/src/ppu/ppu.rs | 8 ++++---- snes-core/src/ppu/registers.rs | 13 ++++++++++++- 6 files changed, 26 insertions(+), 5 deletions(-) delete mode 100644 snes-core/src/ppu.rs diff --git a/snes-core/src/cpu/bus.rs b/snes-core/src/cpu/bus.rs index a461b52..e517263 100644 --- a/snes-core/src/cpu/bus.rs +++ b/snes-core/src/cpu/bus.rs @@ -1,5 +1,8 @@ +use crate::ppu::PPU; + pub struct Bus { wram: [u8; 0x10000], + pub ppu: PPU, } #[derive(PartialEq, Debug)] @@ -15,6 +18,7 @@ impl Bus { pub fn new() -> Self { Self { wram: [0; 0x10000], + ppu: PPU::new(), } } @@ -49,6 +53,7 @@ impl Bus { let section = Bus::map_address(address); match section { MemoryMap::WRAM => self.read_wram(address), + MemoryMap::PPU => self.ppu.registers.read(address as u16), _ => todo!("Implement other memory sections"), } } @@ -57,6 +62,7 @@ impl Bus { let section = Bus::map_address(address); match section { MemoryMap::WRAM => self.write_wram(address, value), + MemoryMap::PPU => self.ppu.registers.write(address as u16, value), _ => todo!("Implement other memory sections"), } } diff --git a/snes-core/src/emulator.rs b/snes-core/src/emulator.rs index 546c77b..b90a3e3 100644 --- a/snes-core/src/emulator.rs +++ b/snes-core/src/emulator.rs @@ -20,5 +20,8 @@ impl Emulator { pub fn run(&mut self) { self.cpu.run(&mut self.bus); + self.bus.ppu.tick(self.cpu.cycles); + + self.cpu.cycles = 0; } } \ No newline at end of file diff --git a/snes-core/src/lib.rs b/snes-core/src/lib.rs index 22acfe3..80fda5f 100644 --- a/snes-core/src/lib.rs +++ b/snes-core/src/lib.rs @@ -1,4 +1,5 @@ pub mod cpu; +pub mod ppu; pub mod rom; pub mod utils; pub mod common; diff --git a/snes-core/src/ppu.rs b/snes-core/src/ppu.rs deleted file mode 100644 index e69de29..0000000 diff --git a/snes-core/src/ppu/ppu.rs b/snes-core/src/ppu/ppu.rs index 1af242f..357180d 100644 --- a/snes-core/src/ppu/ppu.rs +++ b/snes-core/src/ppu/ppu.rs @@ -2,19 +2,19 @@ use super::registers::PPURegisters; pub struct PPU { framebuffer: Vec, - registers: PPURegisters, + pub registers: PPURegisters, } impl PPU { pub fn new() -> Self { Self { framebuffer: vec![], - registers: PPURegisters, + registers: PPURegisters::new(), } } - pub fn tick(&mut self, cycles: usize) { - for _ in 0..cycles { + pub fn tick(&mut self, cpu_cycles: usize) { + for _ in 0..cpu_cycles { self.do_cycle(); } } diff --git a/snes-core/src/ppu/registers.rs b/snes-core/src/ppu/registers.rs index 24bfb63..9342205 100644 --- a/snes-core/src/ppu/registers.rs +++ b/snes-core/src/ppu/registers.rs @@ -61,10 +61,21 @@ pub const TMW: u16 = 0x212E; // Window Area Main Screen Disable (W) pub const TSW: u16 = 0x212F; // Window Area Sub Screen Disable (W) pub struct PPURegisters { - + data: [u8; 256], } impl PPURegisters { + pub fn new() -> Self { + Self { + data: [0x00; 256], + } + } + pub fn read(&self, address: u16) -> u8 { + self.data[(address as usize) - 0x2100] + } + pub fn write(&mut self, address: u16, value: u8) { + self.data[(address as usize) - 0x2100] = value; + } }