asr/emulator/gba/
emuhawk.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
use crate::{Address, MemoryRangeFlags, Process};

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct State {
    base_addr: Address,
}

impl State {
    pub fn find_ram(&mut self, game: &Process) -> Option<[Address; 2]> {
        self.base_addr = game.get_module_address("mgba.dll").ok()?;

        let addr = game
            .memory_ranges()
            .find(|range| {
                range.size().is_ok_and(|size| size == 0x48000)
                    && range.flags().is_ok_and(|flag| {
                        flag.contains(MemoryRangeFlags::WRITE | MemoryRangeFlags::READ)
                    })
            })?
            .address()
            .ok()?;

        Some([addr, addr + 0x40000])
    }

    pub fn keep_alive(&self, game: &Process, ram_base: &Option<[Address; 2]>) -> bool {
        ram_base.is_some_and(|[ewram, _]| game.read::<u8>(ewram).is_ok())
            && game.read::<u8>(self.base_addr).is_ok()
    }

    pub const fn new() -> Self {
        Self {
            base_addr: Address::NULL,
        }
    }
}