diff --git a/src/simudator/gui/gui.py b/src/simudator/gui/gui.py index baec07a7241f9d018a6a382add85a8572af63546..9910e33cd463cf6db9b11446f75fa3c772a6f07f 100644 --- a/src/simudator/gui/gui.py +++ b/src/simudator/gui/gui.py @@ -310,14 +310,14 @@ class GUI(QMainWindow): backward_arrow_icon = self.style().standardIcon(QStyle.SP_MediaSeekBackward) self.undo_asm_action = QAction(backward_arrow_icon, "Undo Asm", self) self.undo_asm_action.setStatusTip("Undo the last assembler instruction") - self.undo_asm_action.triggered.connect(self.undoToolBarButtonClick) + self.undo_asm_action.triggered.connect(self.undoAsmToolBarButtonClick) toolbar.addAction(self.undo_asm_action) # Add step button on toolbar forward_arrow_icon = self.style().standardIcon(QStyle.SP_MediaSeekForward) self.step_asm_action = QAction(forward_arrow_icon, "Step Asm", self) self.step_asm_action.setStatusTip("Run one assembler instruction") - self.step_asm_action.triggered.connect(self.stepToolBarButtonClick) + self.step_asm_action.triggered.connect(self.stepAsmToolBarButtonClick) toolbar.addAction(self.step_asm_action) # Add box for jump value @@ -502,7 +502,7 @@ class GUI(QMainWindow): steps = self.jump_value_box.value() self.cpu_running = True self.setDisabledWhenRunning(True) - simulation_thread = RunThread(self.cpu, self.cpu_tick_signal, self.update_delay, False, steps) + simulation_thread = RunThread(self.cpu, self.cpu_tick_signal, self.update_delay, False, False, steps) self.threadpool.start(simulation_thread) def stepAsmToolBarButtonClick(self): @@ -517,8 +517,7 @@ class GUI(QMainWindow): steps = self.asm_jump_value_box.value() self.cpu_running = True self.setDisabledWhenRunning(True) - self.cpu.unstop() - simultaion_thread = RunThread(self.cpu, self.halted_signal, False, steps) + simultaion_thread = RunThread(self.cpu, self.cpu_tick_signal, self.update_delay, False, True, steps) self.threadpool.start(simultaion_thread) self.updateCpuListeners() diff --git a/src/simudator/gui/run_continuously_thread.py b/src/simudator/gui/run_continuously_thread.py index 1f1ef5beba2c2f1c38d27526480789ef2de62b93..900d632c2687de2a2329b6fa589752446900123f 100644 --- a/src/simudator/gui/run_continuously_thread.py +++ b/src/simudator/gui/run_continuously_thread.py @@ -8,40 +8,54 @@ class RunThread(QRunnable): a seperate thread. This allows the user to interact with the GUI while the simulation is running. - After each cpu tick, this thread will emit to its given QT signal so that + After each CPU tick, this thread will emit to its given QT signal so that the GUI can update itself and possibly inform the user of when the execution has halted. """ - def __init__(self, cpu, signal, delay: float, run_continuously=True, steps=0): + def __init__(self, cpu, signal, delay: float, run_continuously=True, + is_asm_instruciton=False, steps=0): super().__init__() self.cpu = cpu self.signal = signal self.run_continuously = run_continuously self.steps = steps self.delay = delay + self.is_asm_instruciton = is_asm_instruciton def run(self): - if self.run_continuously: - self.cpu.unstop() - while not self.cpu.is_stopped: - self.cpu.do_tick() - self.signal.emit(1) - time.sleep(self.delay) + if self.is_asm_instruciton: - else: - for _ in range(self.steps): + while self.steps > 0: self.cpu.do_tick() + + # We only care about asm instructions + if self.cpu.is_new_instruction(): + self.steps -= 1 + self.signal.emit(1) time.sleep(self.delay) if self.cpu.is_stopped: break - # Signal end of execution as having run 0 ticks - self.signal.emit(0) - - def run_asm(self): - self.cpu.run_asm(self.steps) + else: + if self.run_continuously: + self.cpu.unstop() + while not self.cpu.is_stopped: + self.cpu.do_tick() + self.signal.emit(1) + time.sleep(self.delay) + + else: + for _ in range(self.steps): + self.cpu.do_tick() + self.signal.emit(1) + time.sleep(self.delay) + if self.cpu.is_stopped: + break + + + # Signal end of execution as having run 0 ticks self.signal.emit(0)