use std::collections::HashMap;
#[derive(Debug, Clone, Default)]
pub struct Code0Header {
pub above_a5: u32,
pub below_a5: u32,
pub jump_table_size: u32,
pub jump_table_offset: u32,
}
impl Code0Header {
pub fn parse(data: &[u8]) -> Option<Self> {
if data.len() < 16 {
return None;
}
Some(Self {
above_a5: u32::from_be_bytes([data[0], data[1], data[2], data[3]]),
below_a5: u32::from_be_bytes([data[4], data[5], data[6], data[7]]),
jump_table_size: u32::from_be_bytes([data[8], data[9], data[10], data[11]]),
jump_table_offset: u32::from_be_bytes([data[12], data[13], data[14], data[15]]),
})
}
pub fn num_entries(&self) -> usize {
(self.jump_table_size / 8) as usize
}
}
#[derive(Debug, Clone)]
pub struct JumpTableEntry {
pub offset: u16,
pub segment: i16,
pub loaded: bool,
pub address: u32,
}
#[derive(Default)]
pub struct LoadedApp {
pub code0_header: Code0Header,
pub a5_base: u32,
pub jump_table: Vec<JumpTableEntry>,
pub segment_bases: HashMap<i16, u32>,
pub initial_sp: u32,
}
impl LoadedApp {
pub fn entry_point(&self, a5_base: u32) -> u32 {
a5_base + self.code0_header.jump_table_offset + 2
}
}