mod cartridge_header; mod enums; use crate::cartridge_header::CartridgeHeader; use crate::enums::DestinationCode; use std::fs::File; use std::io::Read; // https://github.com/ISSOtm/gb-bootroms/blob/2dce25910043ce2ad1d1d3691436f2c7aabbda00/src/dmg.asm#L259-L269 // Each tile is encoded using 2 (!) bytes // The tiles are represented below // XX.. .XX. XX.. .... .... .... .... .... .... ...X X... .... // XXX. .XX. XX.. .... ..XX .... .... .... .... ...X X... .... // XXX. .XX. .... .... .XXX X... .... .... .... ...X X... .... // XX.X .XX. XX.X X.XX ..XX ..XX XX.. XX.X X... XXXX X..X XXX. // XX.X .XX. XX.X XX.X X.XX .XX. .XX. XXX. XX.X X..X X.XX ..XX // XX.. XXX. XX.X X..X X.XX .XXX XXX. XX.. XX.X X..X X.XX ..XX // XX.. XXX. XX.X X..X X.XX .XX. .... XX.. XX.X X..X X.XX ..XX // XX.. .XX. XX.X X..X X.XX ..XX XXX. XX.. XX.. XXXX X..X XXX. const NINTENDO_LOGO: [u8; 48] = [ 0x0CE, 0x0ED, 0x066, 0x066, 0x0CC, 0x00D, 0x000, 0x00B, 0x003, 0x073, 0x000, 0x083, 0x000, 0x00C, 0x000, 0x00D, 0x000, 0x008, 0x011, 0x01F, 0x088, 0x089, 0x000, 0x00E, 0x0DC, 0x0CC, 0x06E, 0x0E6, 0x0DD, 0x0DD, 0x0D9, 0x099, 0x0BB, 0x0BB, 0x067, 0x063, 0x06E, 0x00E, 0x0EC, 0x0CC, 0x0DD, 0x0DC, 0x099, 0x09F, 0x0BB, 0x0B9, 0x033, 0x03E, ]; // const ROM_NAME: &str = "OtherLegallyObtainedRom.gb"; const ROM_NAME: &str = "LegallyObtainedRom.gb"; fn main() -> std::io::Result<()> { let mut rom_file = File::open(ROM_NAME)?; let mut rom_buffer: Vec = Vec::new(); rom_file.read_to_end(&mut rom_buffer)?; let cart_header = match CartridgeHeader::parse(&*rom_buffer) { Ok(header) => header, Err(_err) => { return Err(std::io::Error::new( std::io::ErrorKind::Other, "Rom failed to parse", )); } }; let title: String = String::from_iter(cart_header.title); println!("Title: {}", title); let manufacturer_code = String::from_iter(cart_header.manufacturer_code); println!("Manufacturer Code: {}", manufacturer_code); match cart_header.old_licensee_code { Some(code) => println!("Uses Old Licensee Code: {:#X}", code), None => println!( "Uses New Licensee Code: {}", String::from_iter(cart_header.license_code) ), } println!("CGB Flag: {:?}", cart_header.cgb_flag); println!("Supports SGB: {:?}", cart_header.support_gb); println!("Cartridge Type: {:?}", cart_header.cart_type); println!("ROM Size: {:?}", cart_header.rom_size); println!("RAM Size: {:?}", cart_header.ram_size); match cart_header.destination_code { DestinationCode::Japan => println!("Destination Code: Japan"), DestinationCode::NotJapan => println!("Destination Code: Not Japan"), } println!("Version: {:?}", cart_header.version); println!("Header Checksum: {:#X}", cart_header.header_checksum); println!("Global Checksum: {:#X}", cart_header.global_checksum); Ok(()) }