systemless 0.37.0

High-Level Emulation for classic Macintosh applications
Documentation
//! CFM imported symbol binding, trace, and probe records.

use super::sprockets::{PpcDrawSprocketTraceEntry, PpcInputSprocketSimpleStateTraceEntry};
use super::PpcImportDispatcherTarget;
use crate::trap::dispatch::key_map_key_is_down;
use ppc::{PpcFetchHistogram, PpcRunResult};

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PpcImportBinding {
    pub library_index: u32,
    pub symbol_index: u32,
    pub library_name: String,
    pub symbol_name: String,
    pub class: u8,
    pub weak: bool,
    pub address: u32,
    pub tvector_address: Option<u32>,
    pub trap_pc: u32,
    pub dispatcher_target: PpcImportDispatcherTarget,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PpcStartupProbe {
    pub result: PpcRunResult,
    pub first_import_index: Option<u32>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PpcHleImportTraceEntry {
    pub import_index: u32,
    pub library_name: String,
    pub symbol_name: String,
    pub pc: u32,
    pub lr: u32,
    pub rtoc: u32,
    pub sp: u32,
    pub dispatcher_target: PpcImportDispatcherTarget,
    pub repeat_count: u64,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PpcHleRunProbe {
    pub result: PpcRunResult,
    pub handled_import_count: u32,
    pub last_import_index: Option<u32>,
    pub unsupported_import_index: Option<u32>,
    pub import_trace: Vec<PpcHleImportTraceEntry>,
    pub draw_sprocket_trace: Vec<PpcDrawSprocketTraceEntry>,
    pub input_sprocket_trace: Vec<PpcInputSprocketSimpleStateTraceEntry>,
    pub fetch_histogram: Option<PpcFetchHistogram>,
}

pub use crate::cfm::{CfmConnection as PpcCfmConnection, CfmExport as PpcCfmExport};

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PpcCfmLibraryFragment {
    pub name: String,
    pub bytes: Vec<u8>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct PpcPreparedMemFragment {
    pub(crate) main_addr: u32,
    pub(crate) init_addr: u32,
    pub(crate) term_addr: u32,
    pub(crate) exports: Vec<PpcCfmExport>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub struct PpcInputSnapshot {
    pub key_map: [u8; 16],
    pub mouse_button: bool,
    pub mouse_v: i16,
    pub mouse_h: i16,
}

impl PpcInputSnapshot {
    pub fn key_down(&self, key_code: u8) -> bool {
        key_map_key_is_down(&self.key_map, key_code)
    }

    pub fn any_key_down(&self, key_codes: &[u8]) -> bool {
        key_codes.iter().copied().any(|key| self.key_down(key))
    }

    pub fn is_idle(&self) -> bool {
        !self.mouse_button && self.key_map == [0; 16]
    }
}