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)