initial commit

This commit is contained in:
2026-03-03 10:26:19 +00:00
commit ebb9489410
15 changed files with 633 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
use fxhash::FxHashMap;
use crate::memory::PhysAddr;
type Page = [u8; 4096];
pub struct MainStore {
pages: FxHashMap<PhysAddr, Page>,
}
impl MainStore {
pub fn new() -> Self {
Self {
pages: FxHashMap::default(),
}
}
#[inline(always)]
const fn segment_addr(addr: PhysAddr) -> (PhysAddr, usize) {
(addr & !(0xFFF), (addr & 0xFFF) as usize)
}
#[inline]
pub fn read_byte(&self, addr: PhysAddr) -> u8 {
let (page, offset) = Self::segment_addr(addr);
self.pages.get(&page).map(|p| p[offset]).unwrap_or(0)
}
#[inline]
pub fn read_word(&self, addr: PhysAddr) -> u32 {
let (page, offset) = Self::segment_addr(addr);
let page = self.pages.get(&page).unwrap_or(&[0; 4096]);
u32::from_be_bytes(page[offset..=offset + 3].try_into().unwrap())
}
#[inline]
pub fn read_page(&self, addr: PhysAddr) -> &[u8] {
self.pages.get(&addr).unwrap_or(&[0; 4096])
}
#[inline]
pub fn write_byte(&mut self, addr: PhysAddr, value: u8) {
let (page, offset) = Self::segment_addr(addr);
self.pages.entry(page).or_insert_with(|| [0; 4096])[offset] = value;
}
#[inline]
pub fn write_word(&mut self, addr: PhysAddr, value: u32) {
let (page, offset) = Self::segment_addr(addr);
let page = self.pages.entry(page).or_insert_with(|| [0; 4096]);
page[offset..=offset + 3].copy_from_slice(&value.to_be_bytes());
}
#[inline]
pub fn write_page(&mut self, addr: PhysAddr, value: &[u8; 4096]) {
let (page, offset) = Self::segment_addr(addr);
let page = self.pages.entry(page).or_insert_with(|| [0; 4096]);
page[offset..offset + value.len()].copy_from_slice(value);
}
}