#![feature(bigint_helper_methods)] #![feature(seek_stream_len)] #![feature(unchecked_shifts)] mod debug; mod devices; mod emulators; mod types; pub use debug::*; pub use devices::*; pub use emulators::*; pub use types::*; use bedrock_core::*; use log::*; use phosphor::*; use std::num::NonZeroU32; use std::path::{Path, PathBuf}; use std::time::{Duration, Instant}; pub const BATCH_SIZE: usize = 1000; pub const TICK_DURATION: Duration = Duration::from_nanos( 1_000_000_000/256 ); pub const MIN_FRAME_DURATION: Duration = Duration::from_millis( 10 ); pub const MAX_FRAME_DURATION: Duration = Duration::from_millis( 500 ); pub const DEFAULT_SCREEN_SIZE: ScreenDimensions = ScreenDimensions::new(800,600); pub const DEFAULT_SCREEN_SCALE: NonZeroU32 = unsafe { NonZeroU32::new_unchecked(1) }; pub type ScreenPosition = geometry::Point; pub type ScreenDimensions = geometry::Dimensions; pub fn run_program(bytecode: &[u8], config: EmulatorConfig) { let mut args = switchboard::Switchboard::from_env(); args.named("verbose").short('v'); if args.get("verbose").as_bool() { log::set_log_level(log::LogLevel::Info); } match Phosphor::new() { Ok(phosphor) => { info!("Starting graphical emulator"); let mut emulator = GraphicalEmulator::new(config, false); emulator.load_program(&bytecode); emulator.run(phosphor, true); } Err(err) => { eprintln!("EventLoopError: {err:?}"); fatal!("Could not start graphical event loop"); } } }