use devices6502::size_const::*;
#[derive(Default, Debug, PartialEq, Eq, Copy, Clone)]
pub enum Mirroring {
#[default]
Horizontal,
Vertical,
FourScreen,
}
#[derive(Default, Debug)]
pub struct HeaderData {
pub prg_rom_size: u64,
pub chr_rom_size: u64,
pub mirroring: Mirroring,
pub has_persistent_ram: bool,
pub has_trainer: bool,
pub mapper: u8,
pub vs_unisystem: bool,
pub playchoice: bool,
pub ines2: bool,
pub prg_ram_size: u16,
}
impl HeaderData {
pub fn new(header: &[u8]) -> Self {
assert_eq!(header.len(), 16);
let prg_rom_size = header[4] as u64 * SIZE_16K as u64;
let chr_rom_size = header[5] as u64 * SIZE_8K as u64;
let mirroring = if (header[6] & 8) != 0 {
Mirroring::FourScreen
} else if (header[6] & 1) == 0 {
Mirroring::Horizontal
} else {
Mirroring::Vertical
};
let has_persistent_ram = (header[6] & 2) != 0;
let has_trainer = (header[6] & 4) != 0;
let mapper_low = header[6] >> 4;
let mapper_high = header[7] & 0xF0;
let mapper = mapper_high | mapper_low;
Self {
prg_rom_size,
chr_rom_size,
mirroring,
has_persistent_ram,
has_trainer,
mapper,
..Self::default()
}
}
}