add simple step forward and backward

This commit is contained in:
Vivian Lim 2021-08-16 03:28:13 -07:00
parent 72d37ef5b9
commit c76d2a1196
2 changed files with 64 additions and 3 deletions

View File

@ -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();

View File

@ -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);