From d6192e94a8843d911bcbd8b20c385225e32eb496 Mon Sep 17 00:00:00 2001 From: Determinant Date: Fri, 17 Nov 2017 12:04:04 -0500 Subject: adjust abstraction and mutability --- src/mapper.rs | 84 ++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 46 insertions(+), 38 deletions(-) (limited to 'src/mapper.rs') diff --git a/src/mapper.rs b/src/mapper.rs index 210b59f..fc02ed2 100644 --- a/src/mapper.rs +++ b/src/mapper.rs @@ -1,64 +1,72 @@ #![allow(dead_code)] +extern crate core; use memory::VMem; use cartridge::{Cartridge, BankType}; -use core::cell::UnsafeCell; pub struct Mapper2<'a> { - cart: &'a Cartridge, - prg_bank1: UnsafeCell<&'a [u8]>, - prg_bank2: UnsafeCell<&'a [u8]>, - chr_bank: UnsafeCell<&'a mut [u8]>, - sram: UnsafeCell<&'a mut [u8]>, + cart: Cartridge, + prg_bank1: &'a [u8], + prg_bank2: &'a [u8], + chr_bank: &'a mut [u8], + sram: &'a mut [u8], prg_nbank: usize } impl<'a> VMem for Mapper2<'a> { fn read(&self, addr: u16) -> u8 { let addr = addr as usize; - unsafe { - if addr < 0x2000 { /* 0x2000 size bank */ - (*self.chr_bank.get())[addr] - } else if addr >= 0xc000 { /* 0x4000 size bank */ - (*self.prg_bank2.get())[addr - 0xc000] - } else if addr >= 0x8000 { /* 0x4000 size bank */ - (*self.prg_bank1.get())[addr - 0x8000] - } else if addr >= 0x6000 { - (*self.sram.get())[addr - 0x6000] - } else { - panic!("unmapped address: 0x{:04x}", addr) - } + if addr < 0x2000 { /* 0x2000 size bank */ + self.chr_bank[addr] + } else if addr >= 0xc000 { /* 0x4000 size bank */ + self.prg_bank2[addr - 0xc000] + } else if addr >= 0x8000 { /* 0x4000 size bank */ + self.prg_bank1[addr - 0x8000] + } else if addr >= 0x6000 { + self.sram[addr - 0x6000] + } else { + panic!("unmapped address: 0x{:04x}", addr) } } - fn write(&self, addr: u16, data: u8) { + fn write(&mut self, addr: u16, data: u8) { let addr = addr as usize; - unsafe { - if addr < 0x2000 { - (*self.chr_bank.get())[addr] = data; - } else if addr >= 0x8000 { - (*self.prg_bank1.get()) = - &*self.cart.get_bank(((data as usize) % self.prg_nbank) << 14, - 0x4000, - BankType::PrgRom); - } else if addr >= 0x6000 { - (*self.sram.get())[addr - 0x6000] = data; - } else { - panic!("invalid write to address: 0x{:04x}", addr); + if addr < 0x2000 { + self.chr_bank[addr] = data; + } else if addr >= 0x8000 { + self.prg_bank1 = unsafe { + &*self.cart.get_bank(((data as usize) % self.prg_nbank) << 14, + 0x4000, + BankType::PrgRom) } + } else if addr >= 0x6000 { + self.sram[addr - 0x6000] = data + } else { + panic!("invalid write to address: 0x{:04x}", addr); } } } impl<'a> Mapper2<'a> { - pub fn new(cart: &'a Cartridge) -> Self { + pub fn new(cart: Cartridge) -> Self { unsafe { let nbank = cart.get_size(BankType::PrgRom) >> 14; - Mapper2{cart, - prg_bank1: UnsafeCell::new(&*cart.get_bank(0, 0x4000, BankType::PrgRom)), - prg_bank2: UnsafeCell::new(&*cart.get_bank((nbank - 1) << 14, 0x4000, BankType::PrgRom)), - chr_bank: UnsafeCell::new(&mut *cart.get_bank(0, 0x2000, BankType::ChrRom)), - sram: UnsafeCell::new(&mut *cart.get_bank(0, 0x2000, BankType::Sram)), - prg_nbank: nbank} + let null = core::mem::uninitialized(); + let mut m = Mapper2{cart, + prg_nbank: nbank, + prg_bank1: null, + prg_bank2: null, + chr_bank: core::mem::uninitialized(), + sram: core::mem::uninitialized()}; + { + let c = &mut m.cart; + m.prg_bank1 = &*c.get_bank(0, 0x4000, BankType::PrgRom); + m.prg_bank2 = &*c.get_bank((nbank - 1) << 14, 0x4000, BankType::PrgRom); + m.chr_bank = &mut *c.get_bank(0, 0x2000, BankType::ChrRom); + m.sram = &mut *c.get_bank(0, 0x2000, BankType::Sram); + } + m } } + + pub fn get_cart(&self) -> &Cartridge {&self.cart} } -- cgit v1.2.3-70-g09d2