Playing around with reading gameboy roms, and maybe emulation

decent start

Changed files
+28 -17
src
+28 -17
src/main.rs
···
}
+
+
+
+
impl CartridgeHeader {
-
fn new(rom_location: &str ) -> Result<Self, Error> {
-
let mut rom_file = File::open(rom_location)?;
-
rom_file.seek(SeekFrom::Start(CartridgeHeaderAddress::CartridgeHeaderStart as u64))?;
-
let mut header_buffer: [u8; 80] = [0; 80];
-
rom_file.read_exact(&mut header_buffer)?;
+
fn new(rom_bytes: &[u8] ) -> Result<Self, Error> {
+
let start = CartridgeHeaderAddress::CartridgeHeaderStart as usize;
+
//We know the header is only 80 chars
+
let end = start + 80;
+
Ok(Self {
-
buffer: header_buffer
+
buffer: rom_bytes[start..end].try_into().map_err(|_| Error::CartridgeReadError)?
})
+
}
+
+
fn print_test(&self) {
+
for byte in self.buffer.iter() {
+
print!("{} ", *byte as char);
+
}
}
}
···
fn main() -> std::io::Result<()> {
let mut rom_file = File::open(ROM_NAME)?;
-
rom_file.seek(SeekFrom::Start(CartridgeHeaderAddress::CartridgeHeaderStart as u64))?;
-
let mut header_buffer: [u8; 80] = [0; 80];
-
rom_file.read_exact(&mut header_buffer)?;
-
let mut byte_index = 0x0100;
-
for byte in header_buffer.iter() {
-
// println!("{}", *byte as char);
-
print!("{:02x} ", byte_index);
-
byte_index += 1;
-
-
}
-
+
let mut rom_buffer: Vec<u8> = Vec::new();
+
rom_file.read_to_end(&mut rom_buffer)?;
+
let cart_header = CartridgeHeader::new(&*rom_buffer).map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, "Rom failed to parse"))?;
+
cart_header.print_test();
Ok(())
}
+
+
+
fn buffer_from_file(path: &str) -> Vec<u8> {
+
let mut file = std::fs::File::open(path).expect("File not there");
+
let mut buffer = Vec::new();
+
file.read_to_end(&mut buffer).expect("Could not read file");
+
buffer
+
}