Compare commits
No commits in common. "fd7298d24e937c5228e086f35e519fc0dc8634f8" and "fda738fb93778c091a40a14852f4fc8862563694" have entirely different histories.
fd7298d24e
...
fda738fb93
|
@ -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",
|
||||||
|
|
|
@ -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
|
32
src/app.rs
32
src/app.rs
|
@ -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 {
|
||||||
|
|
|
@ -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) };
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
Loading…
Reference in New Issue