use core::marker::PhantomData;
use crate::pac::peripheral::{asp::IoConfig, ASP};
pub mod basic;
pub mod fp;
pub mod kernal;
pub struct AddressSpace<HIRAM, LORAM, CHAREN> {
asp: ASP,
_cur: PhantomData<(HIRAM, LORAM, CHAREN)>,
}
impl AddressSpace<Kernal, Basic, Io> {
pub fn at_boot(asp: ASP) -> Result<Self, ASP> {
let p = asp.port();
if p.kernal() && p.basic() && matches!(p.io_config(), IoConfig::Io) {
Ok(Self {
asp,
_cur: PhantomData,
})
} else {
Err(asp)
}
}
}
impl AddressSpace<Kernal, Ram, Io> {
#[cfg(feature = "ultimate")]
pub fn at_web_executor(asp: ASP) -> Result<Self, ASP> {
let p = asp.port();
if p.kernal() && !p.basic() && matches!(p.io_config(), IoConfig::Io) {
Ok(Self {
asp,
_cur: PhantomData,
})
} else {
Err(asp)
}
}
}
impl<LORAM> AddressSpace<Kernal, LORAM, Io> {
pub fn disable_kernal(self) -> AddressSpace<Ram, Ram, Io> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(Some(false), Some(false), Some(IoConfig::Io)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
}
impl<LORAM> AddressSpace<Kernal, LORAM, CharacterRom> {
pub fn disable_kernal(self) -> AddressSpace<Ram, Ram, CharacterRom> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(Some(false), Some(false), Some(IoConfig::CharacterRom)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
}
impl AddressSpace<Ram, Ram, Io> {
pub fn enable_kernal(self) -> AddressSpace<Kernal, Ram, Io> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(Some(true), Some(false), Some(IoConfig::Io)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
pub fn disable_io(self) -> AddressSpace<Ram, Ram, Ram> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(Some(false), Some(false), Some(IoConfig::Ram)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
}
impl AddressSpace<Ram, Ram, CharacterRom> {
pub fn enable_kernal(self) -> AddressSpace<Kernal, Ram, CharacterRom> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(Some(true), Some(false), Some(IoConfig::CharacterRom)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
pub fn disable_character_rom(self) -> AddressSpace<Ram, Ram, Ram> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(Some(false), Some(false), Some(IoConfig::Ram)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
}
impl<CHAREN> AddressSpace<Kernal, Basic, CHAREN> {
pub fn disable_basic(self) -> AddressSpace<Kernal, Ram, CHAREN> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(None, Some(false), None) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
}
impl<CHAREN> AddressSpace<Kernal, Ram, CHAREN> {
pub fn enable_basic(self) -> AddressSpace<Kernal, Basic, CHAREN> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(None, Some(true), None) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
}
impl<HIRAM, LORAM> AddressSpace<HIRAM, LORAM, Io> {
pub fn switch_to_character_rom(self) -> AddressSpace<HIRAM, LORAM, CharacterRom> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(None, None, Some(IoConfig::CharacterRom)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
}
impl<HIRAM, LORAM> AddressSpace<HIRAM, LORAM, CharacterRom> {
pub fn switch_to_io(self) -> AddressSpace<HIRAM, LORAM, Io> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(None, None, Some(IoConfig::Io)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
}
impl AddressSpace<Ram, Ram, Ram> {
pub fn enable_io(self) -> AddressSpace<Ram, Ram, Io> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(Some(false), Some(false), Some(IoConfig::Io)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
pub fn enable_character_rom(self) -> AddressSpace<Ram, Ram, CharacterRom> {
let Self { asp, .. } = self;
unsafe { asp.configure_memory(Some(false), Some(false), Some(IoConfig::CharacterRom)) };
AddressSpace {
asp,
_cur: PhantomData,
}
}
}
pub struct Kernal;
pub struct Basic;
pub struct Ram;
pub struct Io;
pub struct CharacterRom;