use crate::isa::Long;
mod tests;
#[derive(Copy, Debug)]
#[derive_const(Clone, Eq, PartialEq)]
pub struct Segment {
pub v_origin: usize,
pub p_origin: usize,
pub size: usize,
}
impl Segment {
pub const IMG0: &Self = &Self {
v_origin: 0x000000,
p_origin: 0x000000,
size: 0x100000,
};
pub const IMG1: &Self = &Self {
v_origin: 0x100000,
p_origin: 0x100000,
size: 0x100000,
};
pub const IMG2: &Self = &Self {
v_origin: 0x200000,
p_origin: 0x200000,
size: 0x100000,
};
pub const IMG3: &Self = &Self {
v_origin: 0x300000,
p_origin: 0x300000,
size: 0x100000,
};
pub const IMG4: &Self = &Self {
v_origin: 0x400000,
p_origin: 0x400000,
size: 0x100000,
};
pub const IMG5: &Self = &Self {
v_origin: 0x500000,
p_origin: 0x500000,
size: 0x100000,
};
pub const IMG6: &Self = &Self {
v_origin: 0x600000,
p_origin: 0x600000,
size: 0x100000,
};
pub const IMG7: &Self = &Self {
v_origin: 0x700000,
p_origin: 0x700000,
size: 0x100000,
};
pub const WRAM: &Self = &Self {
v_origin: 0x800000,
p_origin: 0x800000,
size: 0x80000,
};
pub const IO: &Self = &Self {
v_origin: 0xF00000,
p_origin: 0x880000,
size: 0x400,
};
#[inline]
#[must_use]
pub const fn from_v_addr(addr: Long) -> &'static Self {
const UNKNOWN: &Segment = &Segment {
v_origin: 0x000000,
p_origin: 0x000000,
size: 0x000000,
};
static SEGMENTS: [&Segment; 16] = [
Segment::IMG0,
Segment::IMG1,
Segment::IMG2,
Segment::IMG3,
Segment::IMG4,
Segment::IMG5,
Segment::IMG6,
Segment::IMG7,
Segment::WRAM,
UNKNOWN,
UNKNOWN,
UNKNOWN,
UNKNOWN,
UNKNOWN,
UNKNOWN,
Segment::IO,
];
let segment = addr.as_usize() >> 20 & 0b1111;
SEGMENTS[segment]
}
}