rustboy_core/
cartridge_info.rs

1use crate::memory::{CartridgeType, CGBMode, Licensee};
2use crate::memory::{RAMSize, ROMSize};
3
4pub struct CartridgeInfo {
5  pub title: String,
6  pub title_checksum: u8,
7  pub licensee: Licensee,
8  pub cartridge_type: CartridgeType,
9  pub rom_size: ROMSize,
10  pub ram_size: RAMSize,
11  pub cgb_mode: CGBMode,
12}
13
14impl CartridgeInfo {
15
16  pub fn from_bytes(rom_bytes: &[u8]) -> Self {
17    CartridgeInfo {
18      title: CartridgeInfo::read_title(rom_bytes),
19      title_checksum: CartridgeInfo::calculate_title_checksum(rom_bytes),
20      licensee: Licensee::from_bytes(rom_bytes),
21      cartridge_type: CartridgeType::from_byte(rom_bytes[0x0147]),
22      rom_size: ROMSize::from_byte(rom_bytes[0x0148]),
23      ram_size: RAMSize::from_byte(rom_bytes[0x0149]),
24      cgb_mode: CGBMode::from_byte(rom_bytes[0x0143]),
25    }
26  }
27
28  fn read_title(rom_bytes: &[u8]) -> String {
29    let mut title = String::new();
30    (0x134..=0x143)
31      .map(|index| rom_bytes[index])
32      .take_while(|byte| *byte != 0x00)
33      .map(|byte| byte as char)
34      .for_each(|character| title.push(character));
35    title
36  }
37
38  fn calculate_title_checksum(rom_bytes: &[u8]) -> u8 {
39    (0x134..=0x143)
40      .map(|index| rom_bytes[index])
41      .reduce(|checksum, byte| checksum.wrapping_add(byte))
42      .unwrap_or(0u8)
43  }
44
45  pub fn get_title(&self) -> &str {
46    self.title.as_str()
47  }
48}