use std::fmt::Debug;
use crate::gbz80core::ExecutorContext;
pub trait ExecutorState: Clone + Debug + Eq + PartialEq {}
impl ExecutorState for () {}
pub trait Executor {
type State: ExecutorState;
fn run_single_instruction(ctx: &mut impl ExecutorContext<State = Self::State>);
}
pub trait ExecutorConfig {
type Executor: Executor;
fn create_initial_state(&self) -> <Self::Executor as Executor>::State;
}
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum PausePoint {
Yield,
Fetch,
}
pub trait SubInstructionExecutor: Executor {
fn tick(ctx: &mut impl ExecutorContext<State = Self::State>) {
loop {
match Self::tick_until_yield_or_fetch(ctx) {
PausePoint::Yield => break,
PausePoint::Fetch => continue,
}
}
}
fn tick_until_yield_or_fetch(ctx: &mut impl ExecutorContext<State = Self::State>)
-> PausePoint;
}