ds_rom/rom/
arm7.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
use std::borrow::Cow;

use serde::{Deserialize, Serialize};

/// ARM7 program.
pub struct Arm7<'a> {
    data: Cow<'a, [u8]>,
    offsets: Arm7Offsets,
}

/// Offsets in the ARM7 program.
#[derive(Serialize, Deserialize)]
pub struct Arm7Offsets {
    /// Base address.
    pub base_address: u32,
    /// Entrypoint function address.
    pub entry_function: u32,
    /// Build info offset.
    pub build_info: u32,
    /// Autoload callback address.
    pub autoload_callback: u32,
}

impl<'a> Arm7<'a> {
    /// Creates a new ARM7 program from raw data.
    pub fn new<T: Into<Cow<'a, [u8]>>>(data: T, offsets: Arm7Offsets) -> Self {
        Self { data: data.into(), offsets }
    }

    /// Returns a reference to the full data.
    pub fn full_data(&self) -> &[u8] {
        &self.data
    }

    /// Returns the base address of this.
    pub fn base_address(&self) -> u32 {
        self.offsets.base_address
    }

    /// Returns the entrypoint function address.
    pub fn entry_function(&self) -> u32 {
        self.offsets.entry_function
    }

    /// Returns the build info offset.
    pub fn build_info_offset(&self) -> u32 {
        self.offsets.build_info
    }

    /// Returns the autoload callback address.
    pub fn autoload_callback(&self) -> u32 {
        self.offsets.autoload_callback
    }

    /// Returns a reference to the ARM7 offsets.
    pub fn offsets(&self) -> &Arm7Offsets {
        &self.offsets
    }
}