gb_cart 0.2.0

GB/CGB file header library and utilities.
Documentation
// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR MPL-2.0
// SPDX-FileCopyrightText: 2024 Gabriel Marcano <gabemarcano@yahoo.com>

use std::fmt;

/// Describes the type of memory mapper the cartridge uses, and any additional hardware.
#[derive(Debug)]
pub enum CartType {
    RomOnly,
    Mbc1,
    Mbc1Ram,
    Mbc1RamBattery,
    Mbc2,
    Mbc2Battery,
    RomRam,
    RomRamBattery,
    Mmm01,
    Mmm01Ram,
    Mmm01RamBattery,
    Mbc3TimerBattery,
    Mbc3TimerRamBattery,
    Mbc3,
    Mbc3Ram,
    Mbc3RamBattery,
    Mbc5,
    Mbc5Ram,
    Mbc5RamBattery,
    Mbc5Rumble,
    Mbc5RumbleRam,
    Mbc5RumbleRamBattery,
    Mbc6,
    Mbc7SensorRumbleRamBattery,
    PocketCamera,
    BandaiTama5,
    Huc3,
    Huc1RamBattery,
    Unknown(u8),
}

impl fmt::Display for CartType {
    fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
        match self {
            Self::RomOnly => write!(fmt, "ROM only")?,
            Self::Mbc1 => write!(fmt, "MBC1")?,
            Self::Mbc1Ram => write!(fmt, "MBC1 + RAM")?,
            Self::Mbc1RamBattery => write!(fmt, "MBC1 + RAM + battery")?,
            Self::Mbc2 => write!(fmt, "MBC2")?,
            Self::Mbc2Battery => write!(fmt, "MBC2 + battery")?,
            Self::RomRam => write!(fmt, "ROM + RAM")?,
            Self::RomRamBattery => write!(fmt, "ROM + RAM + battery")?,
            Self::Mmm01 => write!(fmt, "MMM01")?,
            Self::Mmm01Ram => write!(fmt, "MMM01 + RAM")?,
            Self::Mmm01RamBattery => write!(fmt, "MMM01 + RAM + battery")?,
            Self::Mbc3TimerBattery => write!(fmt, "MBC3 + Timer + battery")?,
            Self::Mbc3TimerRamBattery => write!(fmt, "MBC3 + Timer + RAM + battery")?,
            Self::Mbc3 => write!(fmt, "MBC3")?,
            Self::Mbc3Ram => write!(fmt, "MBC3 + RAM")?,
            Self::Mbc3RamBattery => write!(fmt, "MBC3 + RAM + battery")?,
            Self::Mbc5 => write!(fmt, "MBC5")?,
            Self::Mbc5Ram => write!(fmt, "MBC5 + RAM")?,
            Self::Mbc5RamBattery => write!(fmt, "MBC5 + RAM +battery")?,
            Self::Mbc5Rumble => write!(fmt, "MBC5 + rumble")?,
            Self::Mbc5RumbleRam => write!(fmt, "MBC5 + rumble + RAM")?,
            Self::Mbc5RumbleRamBattery => write!(fmt, "MBC5 + rumble + RAM + battery")?,
            Self::Mbc6 => write!(fmt, "MBC6")?,
            Self::Mbc7SensorRumbleRamBattery => {
                write!(fmt, "MBC7 + sensor + rumble + RAM + battery")?;
            }
            Self::PocketCamera => write!(fmt, "Pocket Camera")?,
            Self::BandaiTama5 => write!(fmt, "Bandai Tama5")?,
            Self::Huc3 => write!(fmt, "HUC3")?,
            Self::Huc1RamBattery => write!(fmt, "HUC1 + RAM + battery")?,
            Self::Unknown(val) => write!(fmt, "Unknown region, code {val}")?,
        }
        Ok(())
    }
}

impl From<u8> for CartType {
    fn from(data: u8) -> Self {
        match data {
            0 => Self::RomOnly,
            1 => Self::Mbc1,
            2 => Self::Mbc1Ram,
            3 => Self::Mbc1RamBattery,
            5 => Self::Mbc2,
            6 => Self::Mbc2Battery,
            8 => Self::RomRam,
            9 => Self::RomRamBattery,
            11 => Self::Mmm01,
            12 => Self::Mmm01Ram,
            13 => Self::Mmm01RamBattery,
            15 => Self::Mbc3TimerBattery,
            16 => Self::Mbc3TimerRamBattery,
            17 => Self::Mbc3,
            18 => Self::Mbc3Ram,
            19 => Self::Mbc3RamBattery,
            25 => Self::Mbc5,
            26 => Self::Mbc5Ram,
            27 => Self::Mbc5RamBattery,
            28 => Self::Mbc5Rumble,
            29 => Self::Mbc5RumbleRam,
            30 => Self::Mbc5RumbleRamBattery,
            32 => Self::Mbc6,
            34 => Self::Mbc7SensorRumbleRamBattery,
            252 => Self::PocketCamera,
            253 => Self::BandaiTama5,
            254 => Self::Huc3,
            255 => Self::Huc1RamBattery,
            _ => Self::Unknown(data),
        }
    }
}