Newer
Older
use core::fmt;
use std::fmt::{Display, Formatter};
pub struct Rom {
data: Vec<u8>,
}
pub enum RomType {
RomOnly = 0x00,
Mbc1 = 0x01,
Mbc1Ram = 0x02,
Mbc1RamBattery = 0x03,
Mbc2 = 0x05,
Mbc2Battery = 0x06,
Unknown = 0xff,
}
impl Display for RomType {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let str = match self {
RomType::RomOnly => "ROM Only",
RomType::Mbc1 => "MBC 1",
RomType::Mbc1Ram => "MBC 1 + RAM",
RomType::Mbc1RamBattery => "MBC 1 + RAM + Battery",
RomType::Mbc2 => "MBC 2",
RomType::Mbc2Battery => "MBC 2 + RAM",
RomType::Unknown => "Unknown",
};
write!(f, "{}", str)
}
}
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Size32K,
Size64K,
Size128K,
SizeUnknown,
}
impl Display for RomSize {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let str = match self {
RomSize::Size32K => "32 KB",
RomSize::Size64K => "64 KB",
RomSize::Size128K => "128 KB",
RomSize::SizeUnknown => "Unknown",
};
write!(f, "{}", str)
}
}
pub enum RamSize {
NoRam,
Unused,
Size8K,
Size32K,
Size64K,
Size128K,
SizeUnknown,
}
impl Display for RamSize {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
let str = match self {
RamSize::NoRam => "No RAM",
RamSize::Unused => "Unused",
RamSize::Size8K => "8 KB",
RamSize::Size32K => "32 KB",
RamSize::Size128K => "128 KB",
RamSize::Size64K => "64 KB",
RamSize::SizeUnknown => "Unknown",
};
write!(f, "{}", str)
}
pub fn from_data(data: &[u8]) -> Self {
Self {
data: data.to_vec(),
}
pub fn data(&self) -> &Vec<u8> {
&self.data
}
pub fn title(&self) -> &str {
std::str::from_utf8(&self.data[0x0134..0x0143]).unwrap()
}
pub fn rom_type(&self) -> RomType {
match self.data[0x0147] {
0x00 => RomType::RomOnly,
0x01 => RomType::Mbc1,
0x02 => RomType::Mbc1Ram,
0x03 => RomType::Mbc1RamBattery,
0x05 => RomType::Mbc2,
0x06 => RomType::Mbc2Battery,
_ => RomType::Unknown,
}
}
pub fn rom_size(&self) -> RomSize {
match self.data[0x0148] {
0x00 => RomSize::Size32K,
0x01 => RomSize::Size64K,
0x02 => RomSize::Size128K,
_ => RomSize::SizeUnknown,
}
}
pub fn ram_size(&self) -> RamSize {
match self.data[0x0148] {
0x00 => RamSize::NoRam,
0x01 => RamSize::Unused,
0x02 => RamSize::Size8K,
0x03 => RamSize::Size32K,
0x04 => RamSize::Size128K,
0x05 => RamSize::Size64K,
_ => RamSize::SizeUnknown,
}
}
}
impl Display for Rom {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(
f,
"Name => {}\nType => {}\nROM Size => {}\nRAM Size => {}",
self.rom_type(),
self.rom_size(),
self.ram_size()