2021-11-22 07:20:04 +00:00
|
|
|
use super::{serialize::*, Cartridge, Mapper, Mirror};
|
2020-01-10 02:26:45 +00:00
|
|
|
|
|
|
|
pub struct Nrom {
|
|
|
|
cart: Cartridge,
|
2020-01-31 02:33:29 +00:00
|
|
|
chr_ram: Vec<u8>,
|
2020-01-10 02:26:45 +00:00
|
|
|
}
|
|
|
|
|
2020-01-10 04:04:10 +00:00
|
|
|
impl Nrom {
|
|
|
|
pub fn new(cart: Cartridge) -> Self {
|
2021-11-22 07:20:04 +00:00
|
|
|
Nrom {
|
2020-01-10 04:04:10 +00:00
|
|
|
cart: cart,
|
2020-01-31 02:33:29 +00:00
|
|
|
chr_ram: vec![0; 0x2000],
|
2020-01-10 04:04:10 +00:00
|
|
|
}
|
2019-11-12 00:04:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-10 04:04:10 +00:00
|
|
|
impl Mapper for Nrom {
|
2020-02-01 20:49:30 +00:00
|
|
|
fn read(&self, address: usize) -> u8 {
|
2020-01-10 04:04:10 +00:00
|
|
|
let addr = address % 0x4000;
|
|
|
|
match address {
|
|
|
|
0x0000..=0x1FFF => {
|
2020-01-31 02:33:29 +00:00
|
|
|
if self.cart.chr_rom_size > 0 {
|
|
|
|
self.cart.chr_rom[0][address]
|
2020-01-10 04:04:10 +00:00
|
|
|
} else {
|
2020-01-31 02:33:29 +00:00
|
|
|
self.chr_ram[address]
|
2020-01-10 04:04:10 +00:00
|
|
|
}
|
2021-11-22 07:20:04 +00:00
|
|
|
}
|
|
|
|
0x8000..=0xBFFF => self.cart.prg_rom[0][addr],
|
|
|
|
0xC000..=0xFFFF => self.cart.prg_rom[self.cart.prg_rom_size - 1][addr],
|
|
|
|
_ => {
|
|
|
|
println!("bad address read from NROM mapper: 0x{:X}", address);
|
|
|
|
0
|
|
|
|
}
|
2020-01-10 04:04:10 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn write(&mut self, address: usize, value: u8) {
|
|
|
|
match address {
|
|
|
|
0x0000..=0x1FFF => {
|
2020-01-31 02:33:29 +00:00
|
|
|
// ROM isn't written to
|
|
|
|
if self.cart.chr_rom_size == 0 {
|
|
|
|
self.chr_ram[address] = value;
|
2020-01-10 04:04:10 +00:00
|
|
|
}
|
2021-11-22 07:20:04 +00:00
|
|
|
}
|
2020-01-31 02:33:29 +00:00
|
|
|
0x8000..=0xBFFF => (),
|
|
|
|
0xC000..=0xFFFF => (),
|
2020-01-16 01:27:53 +00:00
|
|
|
_ => println!("bad address written to NROM mapper: 0x{:X}", address),
|
2020-01-10 04:04:10 +00:00
|
|
|
}
|
2019-11-12 00:04:07 +00:00
|
|
|
}
|
|
|
|
|
2020-02-02 03:01:49 +00:00
|
|
|
fn get_mirroring(&self) -> Mirror {
|
2020-01-10 04:04:10 +00:00
|
|
|
self.cart.mirroring
|
2019-11-12 00:04:07 +00:00
|
|
|
}
|
2020-01-15 02:51:59 +00:00
|
|
|
|
|
|
|
fn load_battery_backed_ram(&mut self) {}
|
|
|
|
fn save_battery_backed_ram(&self) {}
|
2020-01-17 02:57:17 +00:00
|
|
|
fn clock(&mut self) {}
|
2021-11-22 07:20:04 +00:00
|
|
|
fn check_irq(&mut self) -> bool {
|
|
|
|
false
|
|
|
|
}
|
2020-03-03 01:01:00 +00:00
|
|
|
|
|
|
|
fn save_state(&self) -> MapperData {
|
2021-11-22 07:20:04 +00:00
|
|
|
MapperData::Nrom(NromData {
|
|
|
|
cart: self.cart.clone(),
|
|
|
|
chr_ram: self.chr_ram.clone(),
|
|
|
|
})
|
2020-03-03 01:01:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
fn load_state(&mut self, mapper_data: MapperData) {
|
|
|
|
if let MapperData::Nrom(nrom_data) = mapper_data {
|
|
|
|
self.cart = nrom_data.cart;
|
|
|
|
self.chr_ram = nrom_data.chr_ram;
|
|
|
|
}
|
|
|
|
}
|
2019-11-12 00:04:07 +00:00
|
|
|
}
|