Compare commits

..

No commits in common. "fd7298d24e937c5228e086f35e519fc0dc8634f8" and "fda738fb93778c091a40a14852f4fc8862563694" have entirely different histories.

8 changed files with 26 additions and 59 deletions

2
Cargo.lock generated
View File

@ -1757,7 +1757,7 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
[[package]] [[package]]
name = "lemur" name = "lemur"
version = "0.2.7" version = "0.2.5"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"atoi", "atoi",

View File

@ -4,7 +4,7 @@ description = "An emulator for the Virtual Boy."
repository = "https://git.virtual-boy.com/PVB/lemur" repository = "https://git.virtual-boy.com/PVB/lemur"
publish = false publish = false
license = "MIT" license = "MIT"
version = "0.2.7" version = "0.2.5"
edition = "2021" edition = "2021"
[dependencies] [dependencies]

@ -1 +1 @@
Subproject commit 57dcd8370a885541ae6a1de0f35b25675728b226 Subproject commit 06849b54ba7f7fd8bba09e1cf8a8cc9107ec269b

View File

@ -211,15 +211,11 @@ impl ApplicationHandler<UserEvent> for Application {
); );
self.open(event_loop, Box::new(p2)); self.open(event_loop, Box::new(p2));
} }
UserEvent::Quit(sim_id) => { UserEvent::Quit => {
self.viewports
.retain(|_, viewport| viewport.app.sim_id() != sim_id);
if !self.viewports.contains_key(&ViewportId::ROOT) {
event_loop.exit(); event_loop.exit();
} }
} }
} }
}
fn about_to_wait(&mut self, _event_loop: &ActiveEventLoop) { fn about_to_wait(&mut self, _event_loop: &ActiveEventLoop) {
if let Some(viewport) = self.viewports.get(&ViewportId::ROOT) { if let Some(viewport) = self.viewports.get(&ViewportId::ROOT) {
@ -273,23 +269,17 @@ impl Viewport {
}); });
egui_extras::install_image_loaders(&ctx); egui_extras::install_image_loaders(&ctx);
#[allow(unused_mut)] let mut painter = egui_wgpu::winit::Painter::new(
let mut wgpu_config = egui_wgpu::WgpuConfiguration { ctx.clone(),
egui_wgpu::WgpuConfiguration {
present_mode: wgpu::PresentMode::AutoNoVsync, present_mode: wgpu::PresentMode::AutoNoVsync,
..egui_wgpu::WgpuConfiguration::default() ..egui_wgpu::WgpuConfiguration::default()
}; },
#[cfg(windows)] 1,
{ None,
if let egui_wgpu::WgpuSetup::CreateNew { false,
supported_backends, .. true,
} = &mut wgpu_config.wgpu_setup );
{
*supported_backends -= wgpu::Backends::VULKAN;
}
}
let mut painter =
egui_wgpu::winit::Painter::new(ctx.clone(), wgpu_config, 1, None, false, true);
let mut info = ViewportInfo::default(); let mut info = ViewportInfo::default();
let mut builder = app.initial_viewport(); let mut builder = app.initial_viewport();
@ -405,7 +395,7 @@ pub enum UserEvent {
OpenDebugger(SimId), OpenDebugger(SimId),
OpenInput, OpenInput,
OpenPlayer2, OpenPlayer2,
Quit(SimId), Quit,
} }
pub enum Action { pub enum Action {

View File

@ -190,8 +190,7 @@ impl Sim {
let memory = vec![0u64; size.div_ceil(4)]; let memory = vec![0u64; size.div_ceil(4)];
let sim: *mut VB = Box::into_raw(memory.into_boxed_slice()).cast(); let sim: *mut VB = Box::into_raw(memory.into_boxed_slice()).cast();
unsafe { vb_init(sim) }; unsafe { vb_init(sim) };
// pseudohalt is disabled due to breaking red alarm unsafe { vb_set_option(sim, VBOption::PseudoHalt, 1) };
unsafe { vb_set_option(sim, VBOption::PseudoHalt, 0) };
unsafe { vb_set_keys(sim, VBKey::SGN.bits()) }; unsafe { vb_set_keys(sim, VBKey::SGN.bits()) };
unsafe { vb_reset(sim) }; unsafe { vb_reset(sim) };

View File

@ -5,8 +5,6 @@ pub use gdb::GdbServerWindow;
pub use input::InputWindow; pub use input::InputWindow;
use winit::event::KeyEvent; use winit::event::KeyEvent;
use crate::emulator::SimId;
mod about; mod about;
mod game; mod game;
mod game_screen; mod game_screen;
@ -15,9 +13,6 @@ mod input;
pub trait AppWindow { pub trait AppWindow {
fn viewport_id(&self) -> ViewportId; fn viewport_id(&self) -> ViewportId;
fn sim_id(&self) -> SimId {
SimId::Player1
}
fn initial_viewport(&self) -> ViewportBuilder; fn initial_viewport(&self) -> ViewportBuilder;
fn show(&mut self, ctx: &Context); fn show(&mut self, ctx: &Context);
fn on_init(&mut self, render_state: &egui_wgpu::RenderState) { fn on_init(&mut self, render_state: &egui_wgpu::RenderState) {

View File

@ -78,20 +78,19 @@ impl GameWindow {
ui.close_menu(); ui.close_menu();
} }
if ui.button("Quit").clicked() { if ui.button("Quit").clicked() {
let _ = self.proxy.send_event(UserEvent::Quit(self.sim_id)); ctx.send_viewport_cmd(ViewportCommand::Close);
} }
}); });
ui.menu_button("Emulation", |ui| { ui.menu_button("Emulation", |ui| {
let state = self.client.emulator_state(); let state = self.client.emulator_state();
let is_ready = self.client.sim_state(self.sim_id) == SimState::Ready; let is_ready = self.client.sim_state(self.sim_id) == SimState::Ready;
let can_pause = is_ready && state == EmulatorState::Running; let can_pause = is_ready && state == EmulatorState::Running;
let can_resume = is_ready && state == EmulatorState::Paused;
if state == EmulatorState::Running { if state == EmulatorState::Running {
if ui.add_enabled(can_pause, Button::new("Pause")).clicked() { if ui.add_enabled(is_ready, Button::new("Pause")).clicked() {
self.client.send_command(EmulatorCommand::Pause); self.client.send_command(EmulatorCommand::Pause);
ui.close_menu(); ui.close_menu();
} }
} else if ui.add_enabled(can_resume, Button::new("Resume")).clicked() { } else if ui.add_enabled(can_pause, Button::new("Resume")).clicked() {
self.client.send_command(EmulatorCommand::Resume); self.client.send_command(EmulatorCommand::Resume);
ui.close_menu(); ui.close_menu();
} }
@ -318,10 +317,6 @@ impl AppWindow for GameWindow {
} }
} }
fn sim_id(&self) -> SimId {
self.sim_id
}
fn initial_viewport(&self) -> ViewportBuilder { fn initial_viewport(&self) -> ViewportBuilder {
ViewportBuilder::default() ViewportBuilder::default()
.with_title("Lemur") .with_title("Lemur")
@ -385,7 +380,6 @@ impl AppWindow for GameWindow {
if self.sim_id == SimId::Player2 { if self.sim_id == SimId::Player2 {
self.client.send_command(EmulatorCommand::StopSecondSim); self.client.send_command(EmulatorCommand::StopSecondSim);
} }
let _ = self.proxy.send_event(UserEvent::Quit(self.sim_id));
} }
} }

View File

@ -12,8 +12,7 @@ use super::AppWindow;
pub struct GdbServerWindow { pub struct GdbServerWindow {
sim_id: SimId, sim_id: SimId,
port_str: String, port_str: String,
connected: bool, launched: bool,
quit_on_disconnect: bool,
server: GdbServer, server: GdbServer,
proxy: EventLoopProxy<UserEvent>, proxy: EventLoopProxy<UserEvent>,
} }
@ -23,8 +22,7 @@ impl GdbServerWindow {
Self { Self {
sim_id, sim_id,
port_str: (8080 + sim_id.to_index()).to_string(), port_str: (8080 + sim_id.to_index()).to_string(),
connected: false, launched: false,
quit_on_disconnect: false,
server: GdbServer::new(sim_id, client), server: GdbServer::new(sim_id, client),
proxy, proxy,
} }
@ -33,9 +31,8 @@ impl GdbServerWindow {
pub fn launch(&mut self, port: u16) { pub fn launch(&mut self, port: u16) {
self.server.stop(); self.server.stop();
self.port_str = port.to_string(); self.port_str = port.to_string();
self.quit_on_disconnect = true; self.launched = true;
self.server.start(port); self.server.start(port);
self.connected = true;
} }
} }
@ -44,10 +41,6 @@ impl AppWindow for GdbServerWindow {
ViewportId::from_hash_of(format!("Debugger-{}", self.sim_id)) ViewportId::from_hash_of(format!("Debugger-{}", self.sim_id))
} }
fn sim_id(&self) -> SimId {
self.sim_id
}
fn initial_viewport(&self) -> ViewportBuilder { fn initial_viewport(&self) -> ViewportBuilder {
ViewportBuilder::default() ViewportBuilder::default()
.with_title(format!("GDB Server ({})", self.sim_id)) .with_title(format!("GDB Server ({})", self.sim_id))
@ -68,20 +61,16 @@ impl AppWindow for GdbServerWindow {
ui.label("Port"); ui.label("Port");
let port_editor = TextEdit::singleline(&mut self.port_str).desired_width(100.0); let port_editor = TextEdit::singleline(&mut self.port_str).desired_width(100.0);
ui.add_enabled(!status.running(), port_editor); ui.add_enabled(!status.running(), port_editor);
ui.checkbox(&mut self.quit_on_disconnect, "Quit on disconnect");
}); });
if !status.running() { if !status.running() {
if self.connected && self.quit_on_disconnect { if self.launched {
self.proxy.send_event(UserEvent::Quit(self.sim_id)).unwrap(); self.proxy.send_event(UserEvent::Quit).unwrap();
} else {
self.connected = false;
} }
let start_button = Button::new("Start"); let start_button = Button::new("Start");
if ui.add_enabled(port_num.is_some(), start_button).clicked() { if ui.add_enabled(port_num.is_some(), start_button).clicked() {
let port = port_num.unwrap(); let port = port_num.unwrap();
self.server.start(port); self.server.start(port);
self.connected = true;
} }
} else { } else {
let stop_button = Button::new("Stop"); let stop_button = Button::new("Stop");