Skip to content

Commit

Permalink
Merge branch 'feature-MakeItGBC'
Browse files Browse the repository at this point in the history
  • Loading branch information
nekronos committed Dec 3, 2016
2 parents d231d73 + ac1c734 commit 21e79f7
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 1 deletion.
1 change: 1 addition & 0 deletions src/gbc/cart.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ impl Cart {
0x03 => MbcInfo::new(MbcType::Mbc1, ram_info, true),
0x13 => MbcInfo::new(MbcType::Mbc3, ram_info, true),
0x19 => MbcInfo::new(MbcType::Mbc5, ram_info, false),
0x1b => MbcInfo::new(MbcType::Mbc5, ram_info, true),
_ => panic!("Unsupported mbc_info: 0x{:x}", bytes[0x0147]),
}
}
Expand Down
81 changes: 81 additions & 0 deletions src/gbc/mbc/mbc5.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
use super::Mbc;
use super::MbcInfo;

#[derive(Debug)]
pub struct Mbc5 {
ram_write_protected: bool,
rom_bank_0: u8,
rom_bank_1: u8,
ram_bank: u8,
rom_offset: usize,
ram_offset: usize,
ram: Box<[u8]>,
}

impl Mbc5 {
pub fn new(mbc_info: MbcInfo) -> Mbc5 {
Mbc5 {
ram_write_protected: true,
rom_bank_0: 0,
rom_bank_1: 0,
ram_bank: 0,
rom_offset: 0,
ram_offset: 0,
ram: if let Some(ram_info) = mbc_info.ram_info {
vec![0; ram_info.size as usize].into_boxed_slice()
} else {
vec![0; 0].into_boxed_slice()
},
}
}

fn update_rom_offset(&mut self) {
let bank = {
let upper = (self.rom_bank_1 as usize) << 8;
let lower = self.rom_bank_0 as usize;
(upper & 0x100) | lower
};
self.rom_offset = bank * 16 * 1024
}

fn update_ram_offset(&mut self) {
self.ram_offset = (self.ram_bank & 0x0f) as usize * 8 * 1024
}
}

impl Mbc for Mbc5 {
fn read(&self, rom: &Box<[u8]>, addr: u16) -> u8 {
match addr {
0x0000...0x3fff => rom[addr as usize],
0x4000...0x7fff => rom[addr as usize - 0x4000 + self.rom_offset],
_ => panic!("Address out of range 0x{:x}", addr),
}
}

fn write(&mut self, addr: u16, val: u8) {
match addr {
0x0000...0x1fff => self.ram_write_protected = val != 0x0a,
0x2000...0x2fff => self.rom_bank_0 = val,
0x3000...0x3fff => self.rom_bank_1 = val,
0x4000...0x5fff => self.ram_bank = val,
0x6000...0x7fff => (), // Empty
_ => panic!("Illegal address: 0x{:x}", addr),
}
self.update_rom_offset();
self.update_ram_offset()
}

fn read_ram(&self, addr: u16) -> u8 {
if !self.ram_write_protected {
self.ram[addr as usize - 0xa000 + self.ram_offset]
} else {
0
}
}

fn write_ram(&mut self, addr: u16, val: u8) {
if !self.ram_write_protected {
self.ram[addr as usize - 0xa000 + self.ram_offset] = val
}
}
}
6 changes: 5 additions & 1 deletion src/gbc/mbc/mod.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
mod mbc1;
mod mbc3;
mod mbc5;

use self::mbc1::Mbc1;
use self::mbc3::Mbc3;
use self::mbc5::Mbc5;

#[derive(Debug)]
pub struct RamInfo {
Expand Down Expand Up @@ -40,6 +42,7 @@ impl MbcInfo {
pub enum MbcType {
None,
Mbc1,
Mbc2,
Mbc3,
Mbc5,
}
Expand All @@ -56,7 +59,8 @@ pub fn new_mbc(mbc_info: MbcInfo) -> Box<Mbc> {
MbcType::None => Box::new(RomOnly {}),
MbcType::Mbc1 => Box::new(Mbc1::new(mbc_info)),
MbcType::Mbc3 => Box::new(Mbc3::new(mbc_info)),
_ => panic!("Unsupported cart type"),
MbcType::Mbc5 => Box::new(Mbc5::new(mbc_info)),
_ => panic!("{:?} not implemented!", mbc_info.mbc_type),
}
}

Expand Down

0 comments on commit 21e79f7

Please sign in to comment.