fix[?]: починил поведение после условного перехода
Не уверен, что это поможет на самом деле, но это временно решает проблему одного конкретного перехода
This commit is contained in:
@ -8,6 +8,7 @@ from enum import IntFlag, Enum, auto
|
|||||||
class VMFlags(IntFlag):
|
class VMFlags(IntFlag):
|
||||||
# if last instruction is big, then you should
|
# if last instruction is big, then you should
|
||||||
# skip more memory on step
|
# skip more memory on step
|
||||||
|
AFTER_BRANCH = auto()
|
||||||
EXPANDED_INSTR = auto()
|
EXPANDED_INSTR = auto()
|
||||||
|
|
||||||
class Condition:
|
class Condition:
|
||||||
@ -131,9 +132,11 @@ class VM:
|
|||||||
# так, будто мы на 1 слово впереди опкода
|
# так, будто мы на 1 слово впереди опкода
|
||||||
self.pc = c_uint32(self.pc.value + 1)
|
self.pc = c_uint32(self.pc.value + 1)
|
||||||
self._run_callback(opdesc, args)
|
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.pc = c_uint32(self.pc.value + 1)
|
||||||
self._vm_flags &= ~(VMFlags.EXPANDED_INSTR)
|
self._vm_flags &= ~(VMFlags.EXPANDED_INSTR)
|
||||||
|
self._vm_flags &= ~(VMFlags.AFTER_BRANCH)
|
||||||
|
|
||||||
def continue_(self) -> None:
|
def continue_(self) -> None:
|
||||||
"""
|
"""
|
||||||
@ -277,12 +280,14 @@ class VM:
|
|||||||
c = Condition(cond)
|
c = Condition(cond)
|
||||||
vm_c = Condition(self.cc)
|
vm_c = Condition(self.cc)
|
||||||
if (c.v & vm_c.v) | (c.n & vm_c.n) | (c.z & vm_c.z) == c.i:
|
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)
|
self.pc = c_uint32(self.pc.value + disp)
|
||||||
|
|
||||||
def _branch_indexed_callback(self, cond: int, r1: int, disp: int) -> None:
|
def _branch_indexed_callback(self, cond: int, r1: int, disp: int) -> None:
|
||||||
c = Condition(cond)
|
c = Condition(cond)
|
||||||
vm_c = Condition(self.cc.value)
|
vm_c = Condition(self.cc.value)
|
||||||
if (c.v & vm_c.v) | (c.n & vm_c.n) | (c.z & vm_c.z) == c.i:
|
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
|
addr = self.registers[r1].value + disp
|
||||||
self.pc = c_uint32(addr)
|
self.pc = c_uint32(addr)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user