1mod irq; 2mod vrc4; 3mod vrc6; 4mod vrc7; 5 6use crate::bus::cartridge::mappers::{BankSizeKb, ChrType, NametableMirroring, PpuMapResult}; 7pub(crate) use vrc4::Vrc4; 8pub(crate) use vrc6::Vrc6; 9pub(crate) use vrc7::Vrc7; 10 11fn map_ppu_address<N: Into<u32> + Copy>( 12 address: u16, 13 chr_banks: &[N; 8], 14 chr_type: ChrType, 15 nametable_mirroring: NametableMirroring, 16) -> PpuMapResult { 17 match address { 18 0x0000..=0x1FFF => { 19 let chr_bank_index = address / 0x0400; 20 let chr_bank_number = chr_banks[chr_bank_index as usize]; 21 let chr_addr = BankSizeKb::One.to_absolute_address(chr_bank_number, address); 22 chr_type.to_map_result(chr_addr) 23 } 24 0x2000..=0x3EFF => PpuMapResult::Vram(nametable_mirroring.map_to_vram(address)), 25 0x3F00..=0xFFFF => panic!("invalid PPU map address: {address:04X}"), 26 } 27}