Skip to content

Commit

Permalink
Memory controller 0
Browse files Browse the repository at this point in the history
  • Loading branch information
joajfreitas committed Nov 28, 2023
1 parent 2241ae2 commit 5b234ef
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 14 deletions.
3 changes: 2 additions & 1 deletion fpt/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ impl Gameboy {
}

fn new_with_hook(frame_hook: Box<dyn Fn(Frame)>) -> Self {
let bus = Bus::new();
let mut bus = Bus::new();
bus.load_cartridge(&[0; 32768].to_vec());
Self {
bus: bus.clone(),
cpu: LR35902::new(bus.clone()),
Expand Down
22 changes: 22 additions & 0 deletions fpt/src/memory/mbc0.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/// Memory controller 0. No memory controller
use crate::memory::GBAddress;
use crate::memory::MemoryController;

pub struct Mbc0 {}

impl Mbc0 {
pub fn new() -> Mbc0 {
Mbc0 {}
}
}

impl MemoryController for Mbc0 {
fn write(&mut self, address: GBAddress, value: u8, cartridge: &mut Vec<u8>) {
cartridge[address as usize] = value
}

fn read(&self, address: GBAddress, cartridge: &Vec<u8>) -> u8 {
dbg!(cartridge);
cartridge[address as usize]
}
}
27 changes: 22 additions & 5 deletions fpt/src/memory/mbc1.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,29 @@
struct Mbc1 {}
use crate::memory::GBAddress;
use crate::memory::MemoryController;

impl MemoryController for Mbc1 {
fn write(&mut self, _address: GBAddress, value: u8) {
pub struct Mbc1 {}

impl Mbc1 {
pub fn new() -> Mbc1 {
Mbc1 {}
}
}

fn read(&self, _address: GBAdress) -> u8 {
impl MemoryController for Mbc1 {
fn write(&mut self, address: GBAddress, value: u8, cartridge: &mut Vec<u8>) {
if 0x0000 <= address && address <= 0x1fff {
if value & 0xF == 0xA {
// ram enable
} else {
// ram disable
}
} else if 0x2000 <= address && address <= 0x3fff {
let rom_select = value & 0x1F;
} else if 0x4000 <= address && address <= 0x5fff {
}
}

fn read(&self, _address: GBAddress, cartridge: &Vec<u8>) -> u8 {
0
}
}

19 changes: 16 additions & 3 deletions fpt/src/memory/memory.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use crate::memory::Mbc0;
use crate::memory::MemoryController;
use std::cell::{RefCell, RefMut};
use std::ops::Range;
use std::rc::Rc;
Expand Down Expand Up @@ -60,11 +62,12 @@ pub mod map {
pub const INTERRUPT_SWITCH: Address = 0xFFFF;
}

#[derive(Clone)]
//#[derive(Clone)]
pub struct Memory {
mem: [u8; 65536],
cartridge: Vec<u8>,
bootrom: [u8; 256],
memory_controller: Box<dyn MemoryController>,
}

impl PartialEq for Memory {
Expand All @@ -85,9 +88,19 @@ impl Memory {
mem: [0; 65536],
cartridge: Vec::new(),
bootrom: [0; 256],
memory_controller: Box::new(Mbc0::new()),
}
}

pub fn read(&self, address: GBAddress) -> u8 {
self.memory_controller.read(address, &self.cartridge)
}

pub fn write(&mut self, address: GBAddress, value: u8) {
self.memory_controller
.write(address, value, &mut self.cartridge)
}

pub fn slice(&self, range: MemoryRange) -> &[u8] {
&self.mem[range.start..range.end]
}
Expand Down Expand Up @@ -137,11 +150,11 @@ impl Bus {
}

fn _read(&self, address: Address) -> u8 {
self.memory().mem[address]
self.memory().read(address as GBAddress)
}

fn _write(&mut self, address: Address, value: u8) {
self.memory().mem[address] = value;
self.memory().write(address as GBAddress, value);
}

pub fn clone_from_slice(&mut self, range: MemoryRange, slice: &[u8]) {
Expand Down
10 changes: 6 additions & 4 deletions fpt/src/memory/memory_controller.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
trait MemoryController {
fn write(&mut self, address: GBAddress, value: u8);
fn read(&self, address: GBAddress) -> u8;
}
use crate::memory::GBAddress;

pub trait MemoryController {
fn write(&mut self, address: GBAddress, value: u8, cartridge: &mut Vec<u8>);
fn read(&self, address: GBAddress, cartridge: &Vec<u8>) -> u8;
}
8 changes: 7 additions & 1 deletion fpt/src/memory/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
mod mbc0;
mod mbc1;
mod memory;
mod memory_controller;

pub use memory::Bus;
pub use mbc0::Mbc0;
pub use mbc1::Mbc1;
pub use memory::{Bus, GBAddress};
pub use memory_controller::MemoryController;

0 comments on commit 5b234ef

Please sign in to comment.