Skip to content

Commit

Permalink
[#18] Refine pausing emulation.
Browse files Browse the repository at this point in the history
  • Loading branch information
kosarev committed Jan 31, 2021
1 parent 20ca459 commit 6c90809
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 19 deletions.
16 changes: 1 addition & 15 deletions zx/_emulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ def __init__(self, speed_factor=1.0, profile=None, devices=None):
self._emulation_time = Time()
self.__speed_factor = speed_factor

self.__is_paused_flag = False
self.__events_to_signal = RunEvents.NO_EVENTS

# Don't even create the window on full throttle.
Expand All @@ -84,19 +83,6 @@ def __init__(self, speed_factor=1.0, profile=None, devices=None):
if self.__profile:
self.set_breakpoints(0, 0x10000)

# TODO: Double-underscore or make public.
def _is_paused(self):
return self.__is_paused_flag

# TODO: Double-underscore or make public.
def _pause(self, is_paused=True):
self.__is_paused_flag = is_paused
self.notify_devices(PauseStateUpdated())

# TODO: Double-underscore or make public.
def _toggle_pause(self):
self._pause(not self._is_paused())

# TODO: Double-underscore or make public.
def _save_snapshot_file(self, format, filename):
with open(filename, 'wb') as f:
Expand Down Expand Up @@ -306,7 +292,7 @@ def __run_quantum(self, speed_factor=None):
self.enable_trace()
'''

if self._is_paused():
if self.paused:
# Give the CPU some spare time.
if speed_factor:
time.sleep((1 / 50) * speed_factor)
Expand Down
11 changes: 7 additions & 4 deletions zx/_gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ def __init__(self, emulator):
'F3': self._choose_and_load_file,
'F6': self.machine._toggle_tape_pause,
'F11': self._toggle_fullscreen,
'PAUSE': self.machine._toggle_pause,
'PAUSE': self.__toggle_pause,
}

self._EVENT_HANDLERS = {
Expand Down Expand Up @@ -344,7 +344,7 @@ def _on_key(self, event, pressed):
zx_key_id = self._GTK_KEYS_TO_ZX_KEYS.get(key_id, key_id)
key = KEYS.get(zx_key_id, None)
if key:
self.machine._pause(False)
self.machine.paused = False
self.machine._quit_playback_mode()
self.machine._handle_key_stroke(key, pressed)

Expand All @@ -356,7 +356,7 @@ def _on_key_release(self, widget, event):

def _on_click(self, widget, event):
if event.type == Gdk.EventType.BUTTON_PRESS:
self.machine._toggle_pause()
self.machine.paused ^= True
return True
elif event.type == Gdk.EventType._2BUTTON_PRESS:
self._toggle_fullscreen()
Expand All @@ -375,7 +375,7 @@ def on_event(self, event):
self._EVENT_HANDLERS[type(event)](event)

def _on_updated_pause_state(self, event):
if self.machine._is_paused():
if self.machine.paused:
self._notification.set(draw_pause_notification,
self.machine._emulation_time)
else:
Expand All @@ -399,5 +399,8 @@ def _on_quantum_run(self, event):

self.area.queue_draw()

def __toggle_pause(self):
self.machine.paused ^= True

def destroy(self):
self._window.destroy()
12 changes: 12 additions & 0 deletions zx/_machine.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import enum
from ._data import MachineSnapshot
from ._data import ProcessorSnapshot
from ._device import PauseStateUpdated
from ._emulatorbase import _Spectrum48Base
from ._except import EmulationExit
from ._rom import get_rom_image
Expand Down Expand Up @@ -353,6 +354,8 @@ def __init__(self):
# Install ROM.
self.write(0x0000, get_rom_image(self.machine_kind))

self.__paused = False

def destroy(self):
for device in self.devices:
device.destroy()
Expand All @@ -370,6 +373,15 @@ def notify_devices(self, event):
for device in self.devices:
device.on_event(event)

@property
def paused(self):
return self.__paused

@paused.setter
def paused(self, value):
self.__paused = value
self.notify_devices(PauseStateUpdated())

def set_breakpoints(self, addr, size):
self.mark_addrs(addr, size, self._BREAKPOINT_MARK)

Expand Down

0 comments on commit 6c90809

Please sign in to comment.