From ca2e19ae0adb2cc36f7c2f4f289b80962d03ae4a Mon Sep 17 00:00:00 2001 From: ElectronixTM Date: Sun, 30 Mar 2025 02:37:25 +0300 Subject: [PATCH] =?UTF-8?q?fix[=3F]:=20=D0=BF=D0=BE=D1=87=D0=B8=D0=BD?= =?UTF-8?q?=D0=B8=D0=BB=20=D0=BF=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=83=D1=81=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D1=85=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Не уверен, что это поможет на самом деле, но это временно решает проблему одного конкретного перехода --- src/vm.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/vm.py b/src/vm.py index 4630938..5d96de5 100644 --- a/src/vm.py +++ b/src/vm.py @@ -8,6 +8,7 @@ from enum import IntFlag, Enum, auto class VMFlags(IntFlag): # if last instruction is big, then you should # skip more memory on step + AFTER_BRANCH = auto() EXPANDED_INSTR = auto() class Condition: @@ -131,9 +132,11 @@ class VM: # так, будто мы на 1 слово впереди опкода self.pc = c_uint32(self.pc.value + 1) self._run_callback(opdesc, args) - if VMFlags.EXPANDED_INSTR in self._vm_flags: + if (VMFlags.EXPANDED_INSTR in self._vm_flags + and not VMFlags.AFTER_BRANCH in self._vm_flags): self.pc = c_uint32(self.pc.value + 1) self._vm_flags &= ~(VMFlags.EXPANDED_INSTR) + self._vm_flags &= ~(VMFlags.AFTER_BRANCH) def continue_(self) -> None: """ @@ -277,12 +280,14 @@ class VM: c = Condition(cond) vm_c = Condition(self.cc) if (c.v & vm_c.v) | (c.n & vm_c.n) | (c.z & vm_c.z) == c.i: + self._vm_flags = VMFlags.AFTER_BRANCH self.pc = c_uint32(self.pc.value + disp) def _branch_indexed_callback(self, cond: int, r1: int, disp: int) -> None: c = Condition(cond) vm_c = Condition(self.cc.value) if (c.v & vm_c.v) | (c.n & vm_c.n) | (c.z & vm_c.z) == c.i: + self._vm_flags = VMFlags.AFTER_BRANCH addr = self.registers[r1].value + disp self.pc = c_uint32(addr)