use alloc::string::String;
use plain::Plain;
pub use self::bios::*;
pub use self::psp::*;
mod bios;
mod psp;
pub enum Directory<'a> {
Bios(BiosDirectory<'a>),
BiosCombo(BiosComboDirectory<'a>),
BiosLevel2(BiosDirectory<'a>),
Psp(PspDirectory<'a>),
PspCombo(PspComboDirectory<'a>),
PspLevel2(PspDirectory<'a>),
}
impl<'a> Directory<'a> {
pub fn new(data: &'a [u8]) -> Result<Self, String> {
match &data[..4] {
b"$BHD" => BiosDirectory::new(data).map(Self::Bios),
b"2BHD" => BiosComboDirectory::new(data).map(Self::BiosCombo),
b"$BL2" => BiosDirectory::new(data).map(Self::BiosLevel2),
b"$PSP" => PspDirectory::new(data).map(Self::Psp),
b"2PSP" => PspComboDirectory::new(data).map(Self::PspCombo),
b"$PL2" => PspDirectory::new(data).map(Self::PspLevel2),
unknown => Err(format!("unknown directory signature {:X?}", unknown)),
}
}
}
#[derive(Clone, Copy, Debug)]
#[repr(packed)]
pub struct DirectoryHeader {
pub magic: u32,
pub checksum: u32,
pub entries: u32,
pub rsvd_0c: u32,
}
unsafe impl Plain for DirectoryHeader {}
#[derive(Clone, Copy, Debug)]
#[repr(packed)]
pub struct ComboDirectoryHeader {
pub magic: u32,
pub checksum: u32,
pub entries: u32,
pub look_up_mode: u32,
pub rsvd_10: u32,
pub rsvd_14: u32,
pub rsvd_18: u32,
pub rsvd_1c: u32,
}
unsafe impl Plain for ComboDirectoryHeader {}
#[derive(Clone, Copy, Debug)]
#[repr(packed)]
pub struct ComboDirectoryEntry {
pub id_select: u32,
pub id: u32,
pub directory: u64,
}
unsafe impl Plain for ComboDirectoryEntry {}