use crate::cartridge::mapper_templates::DualBank32Mapper;
pub type GxROMMapper = DualBank32Mapper<0b0011, 4, 0b0011, 0, false, 66>;
#[cfg(test)]
mod tests {
use crate::cartridge::NametableLayout;
use crate::cartridge::mapper::{Mapper, MapperContext, create_mapper};
use crate::cartridge::test_helpers::banked_data;
fn create_gxrom_mapper(
prg_rom: Vec<u8>,
chr_rom: Vec<u8>,
mirroring: NametableLayout,
) -> std::io::Result<Box<dyn Mapper>> {
create_mapper(MapperContext::new_for_test(66, prg_rom, chr_rom, mirroring))
}
#[test]
fn test_gxrom_prg_and_chr_bank_selected_by_single_write() {
let prg_rom = banked_data(32 * 1024, 4);
let chr_rom = banked_data(8 * 1024, 4);
let mut mapper = create_gxrom_mapper(prg_rom, chr_rom, NametableLayout::Horizontal)
.expect("GxROM (mapper 66) should be implemented");
assert_eq!(mapper.read_prg(0x8000), 0);
assert_eq!(mapper.read_chr(0x0000), 0);
mapper.write_prg(0x8000, 0x12);
assert_eq!(mapper.read_prg(0x8000), 1);
assert_eq!(mapper.read_prg(0xFFFF), 1);
assert_eq!(mapper.read_chr(0x0000), 2);
assert_eq!(mapper.read_chr(0x1FFF), 2);
}
#[test]
fn test_gxrom_mirroring_is_fixed_from_header() {
let prg_rom = banked_data(32 * 1024, 2);
let chr_rom = banked_data(8 * 1024, 2);
let mut mapper = create_gxrom_mapper(prg_rom, chr_rom, NametableLayout::Vertical)
.expect("GxROM (mapper 66) should be implemented");
assert_eq!(mapper.get_mirroring(), NametableLayout::Vertical);
mapper.write_prg(0xFFFF, 0xFF);
assert_eq!(mapper.get_mirroring(), NametableLayout::Vertical);
}
#[test]
fn test_gxrom_registers_snapshot_restores_bank_selects() {
let prg_rom = banked_data(32 * 1024, 4);
let chr_rom = banked_data(8 * 1024, 4);
let mut mapper = create_gxrom_mapper(
prg_rom.clone(),
chr_rom.clone(),
NametableLayout::Horizontal,
)
.expect("GxROM (mapper 66) should be implemented");
mapper.write_prg(0x8000, 0x21);
let registers = mapper.registers_snapshot();
let mut restored = create_gxrom_mapper(prg_rom, chr_rom, NametableLayout::Horizontal)
.expect("GxROM (mapper 66) should be implemented");
restored.restore_registers(®isters);
assert_eq!(restored.read_prg(0x8000), 2);
assert_eq!(restored.read_chr(0x0000), 1);
}
#[test]
fn test_gxrom_open_bus() {
let mapper = create_gxrom_mapper(
vec![0; 128 * 1024],
vec![0; 32 * 1024],
NametableLayout::Horizontal,
)
.expect("GxROM (mapper 66) should be implemented");
assert_eq!(mapper.read_prg_open_bus(0x5000, 0x99), 0x99);
assert_eq!(mapper.read_prg_open_bus(0x5FFF, 0xAA), 0xAA);
}
}