add simple step forward and backward
This commit is contained in:
parent
72d37ef5b9
commit
c76d2a1196
|
@ -40,7 +40,8 @@ pub struct MyEmulator {
|
|||
pub pixel_format: Option<crate::video::video_buffer::PixelFormat>,
|
||||
|
||||
pub memory_map: Option<LibRetroMemoryMap>,
|
||||
pub paused: bool
|
||||
pub paused: bool,
|
||||
pub frames_to_run_before_pause: Option<u32>,
|
||||
}
|
||||
|
||||
impl MyEmulator {
|
||||
|
@ -84,7 +85,8 @@ impl MyEmulator {
|
|||
video_buffer: None,
|
||||
pixel_format: None,
|
||||
memory_map: None,
|
||||
paused: false
|
||||
paused: false,
|
||||
frames_to_run_before_pause: None
|
||||
};
|
||||
let mut pin_emu = Box::pin(emu);
|
||||
retro::wrapper::set_handler(pin_emu.as_mut());
|
||||
|
@ -93,6 +95,17 @@ impl MyEmulator {
|
|||
}
|
||||
|
||||
pub fn run_frame(&mut self){
|
||||
if let Some(frames_to_run_before_pause) = self.frames_to_run_before_pause {
|
||||
if frames_to_run_before_pause > 0 {
|
||||
self.frames_to_run_before_pause = Some(frames_to_run_before_pause - 1);
|
||||
}
|
||||
else if frames_to_run_before_pause == 0 {
|
||||
self.paused = true;
|
||||
self.frames_to_run_before_pause = None;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if !self.paused {
|
||||
self.frame += 1;
|
||||
self.retro.run();
|
||||
|
|
|
@ -19,6 +19,8 @@ widget_ids!(struct Ids {
|
|||
save_button,
|
||||
load_button,
|
||||
pause_button,
|
||||
advance_button,
|
||||
rewind_button,
|
||||
search_box,
|
||||
watch_list,
|
||||
watch_background,
|
||||
|
@ -37,6 +39,7 @@ pub struct DebugWindow {
|
|||
search: MemorySearch,
|
||||
watches: Vec<MemoryWatch>,
|
||||
watches_selected: HashSet<usize>,
|
||||
step_backward_states: Vec<Vec<u8>>,
|
||||
}
|
||||
impl DebugWindow {
|
||||
pub fn new(event_loop: &EventLoop<()>, emu: &Rc<RefCell<Pin<Box<MyEmulator>>>>) -> Box<Self> {
|
||||
|
@ -71,6 +74,7 @@ impl DebugWindow {
|
|||
search: MemorySearch::new(),
|
||||
watches: Vec::new(),
|
||||
watches_selected: HashSet::new(),
|
||||
step_backward_states: Vec::new(),
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -146,7 +150,7 @@ impl TrackedWindow for DebugWindow {
|
|||
|
||||
|
||||
if widget::Button::new()
|
||||
.label("pause")
|
||||
.label(if emu.paused {"resume"} else {"pause"})
|
||||
.right_from(self.ids.load_button, 8.0)
|
||||
.label_font_size(14)
|
||||
.w_h(96.0, 32.0)
|
||||
|
@ -154,6 +158,50 @@ impl TrackedWindow for DebugWindow {
|
|||
.was_clicked()
|
||||
{
|
||||
emu.paused = !emu.paused;
|
||||
self.step_backward_states.clear();
|
||||
}
|
||||
|
||||
if widget::Button::new()
|
||||
.label("forward 1")
|
||||
.down_from(self.ids.pause_button, 8.0)
|
||||
.label_font_size(14)
|
||||
.w_h(96.0, 32.0)
|
||||
.set(self.ids.advance_button, &mut ui)
|
||||
.was_clicked()
|
||||
{
|
||||
match emu.retro.serialize() {
|
||||
Ok(data) => self.step_backward_states.push(data),
|
||||
Err(e) => eprintln!("Problem serializing backward state {:?}", e),
|
||||
}
|
||||
emu.frames_to_run_before_pause = Some(1);
|
||||
emu.paused = false;
|
||||
}
|
||||
|
||||
if widget::Button::new()
|
||||
.label("back 1")
|
||||
.down_from(self.ids.load_button, 8.0)
|
||||
.label_font_size(14)
|
||||
.w_h(96.0, 32.0)
|
||||
.set(self.ids.rewind_button, &mut ui)
|
||||
.was_clicked()
|
||||
{
|
||||
match self.step_backward_states.pop() {
|
||||
Some(data) => {
|
||||
match self.step_backward_states.pop() {
|
||||
Some(data) => {
|
||||
emu.retro.unserialize(data.as_slice());
|
||||
emu.frames_to_run_before_pause = Some(1);
|
||||
emu.paused = false;
|
||||
}
|
||||
None => {
|
||||
eprintln!("No more backward states available (need 2)");
|
||||
},
|
||||
}
|
||||
},
|
||||
None => {
|
||||
eprintln!("No more backward states available");
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
let mut memory = emu.retro.get_memory(2);
|
||||
|
|
Loading…
Reference in New Issue