use std::collections::HashMap;
use crate::helper::Parser;
use crate::Result;
#[derive(Debug, PartialEq, Eq, Copy, Clone, Hash, PartialOrd, Ord)]
pub enum Bi2Options {
DebugMonitorSize,
SimulatedMemorySize,
ArgumentOffset,
DebugFlag,
TrackLocation,
TrackSize,
CountryCode,
PadSpec,
LongFilenameSupport,
DolLimit,
Unknown(usize),
}
impl Bi2Options {
pub fn index(&self) -> usize {
use Bi2Options::*;
match self {
DebugMonitorSize => 1,
SimulatedMemorySize => 2,
ArgumentOffset => 3,
DebugFlag => 4,
TrackLocation => 5,
TrackSize => 6,
CountryCode => 7,
PadSpec => 8,
LongFilenameSupport => 9,
DolLimit => 11,
Unknown(index) => *index,
}
}
}
impl From<usize> for Bi2Options {
fn from(index: usize) -> Self {
use Bi2Options::*;
match index {
1 => DebugMonitorSize,
2 => SimulatedMemorySize,
3 => ArgumentOffset,
4 => DebugFlag,
5 => TrackLocation,
6 => TrackSize,
7 => CountryCode,
8 => PadSpec,
9 => LongFilenameSupport,
11 => DolLimit,
_ => Unknown(index),
}
}
}
#[derive(Debug, Default)]
pub struct Bi2 {
options: HashMap<Bi2Options, u32>,
}
impl Bi2 {
pub fn get(&self, options: Bi2Options) -> Option<&u32> { self.options.get(&options) }
pub fn set(&mut self, options: Bi2Options, value: u32) { self.options.insert(options, value); }
pub fn clear(&mut self, options: Bi2Options) { self.options.remove(&options); }
pub fn options(&self) -> &HashMap<Bi2Options, u32> { &self.options }
}
impl Bi2 {
pub fn from_binary<D: Parser>(input: &mut D) -> Result<Self> {
let options = input
.bu32_array::<{ 0x2000 / 4 }>()?
.iter()
.enumerate()
.map(|(i, data)| (Bi2Options::from(i), *data))
.filter(|x| x.1 != 0)
.collect::<HashMap<_, _>>();
Ok(Self { options })
}
}