rustboy_core/
cartridge_info.rs1use 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}