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}